Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRPZb-002K5G-27 for pgsql-hackers@arkaria.postgresql.org; Mon, 25 May 2026 07:18:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wRPZY-000Rwx-0x for pgsql-hackers@arkaria.postgresql.org; Mon, 25 May 2026 07:18:01 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRPZX-000RwX-1u for pgsql-hackers@lists.postgresql.org; Mon, 25 May 2026 07:18:00 +0000 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wRPZV-00000000fKm-19Wh for pgsql-hackers@postgresql.org; Mon, 25 May 2026 07:17:58 +0000 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-bd85ebb368fso1359582266b.1 for ; Mon, 25 May 2026 00:17:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779693473; cv=none; d=google.com; s=arc-20240605; b=G7m3zgHtryz15S80OgQORB4N+KT0E8Ff9Z0urV71isskwjFEPQ9n57epmTXA4AbNOy v35bq1lgRqGCp57kCc67oV1keiaIhsyvz7alBdJnKHB7u+42X7K0eg+7oBaO6TkoJzxv C9Jki0gN/+L3DkjpulnQxOawxfmADhx+8jdMY8vAi/uT3FoI2Xd756KU+JHto/rpEVkN b74gW6VgWgDgR2mqysjtfYDorzrp3t08LSlCLrX6s2Mq1h3af4mPy09NwPF/MoqR7Qrz /lzgMAUAhHTbcQlQYs5sMGL/E3LuN2QZ2Nz5x2Lh2TIXWehRleNBidoYH7eX3Sar7kKH D8nA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=O5iafnYjmqMfX/a/DYsq8lEXktuVvxbfcHJFwSsFDLc=; fh=fJK5PBfsI0Ko9moh6etP3nn+oSV2qCoFkvtGmlxs+o0=; b=Wm5Y8SOnnY3YPvC3J8PJtaFaaCyOUqSuwl1HKlTWeb5d0AryzbmgS1J2ti/ZBhwI/s PSA8YOpQBylXB7HU3mk8Q431DkBUtBiYWNT0clI/sM8JoEvdEM0d7pFjpbK9qKXFSQMS 14ZFagst2mAbWN+mI6eKm2tGga0hStPVwXTk+s67VoBeetuVWRbCFb8IN4J4dIWdz0w6 0dKAX0I7YAJ9SMbzj1TC2SUT60bhNMo40ToEdsXOI5hr2r36eQJDve+VOl98RzrMPn1w E8eLUwFcIipMglX9+TLqBJt9aCz0R6UYAT1nE2jGxkSPHLCb6jt1j8+rzwrVFFaLO1AB DRwQ==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1779693473; x=1780298273; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=O5iafnYjmqMfX/a/DYsq8lEXktuVvxbfcHJFwSsFDLc=; b=goUMsFJyx0rD6g5j6Tl3jCTRmtPUj9++72lvkVY2j68VfugEm9Sc6fWZUMvHL2coaV iwLKKg4jNyaKEr2T0Hs9ARq8gbtmg8gurtj41OcAGWLbzLn8xfS38QIZObgZ3Fkzcks8 b05zG7TXVufJNboJSnh4U3ArbK5v2/K3jd6qEKvz4pThq17JzDyuwsjDgNwwjHP/gNXn 4xI2a3gBrazMUgc8+LBXUtMF9DoU+p8O1ZD56cBESswjg7OUBccZHE7aG0lKDAM4bgzT tQHdKfWa600J3ElPNwDsg326eOULz/pZshJdTX9oo1MPMQtGZd9rpMun59UUHjdsnCV7 3MYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779693473; x=1780298273; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=O5iafnYjmqMfX/a/DYsq8lEXktuVvxbfcHJFwSsFDLc=; b=YvgfcdqRZmkN1mSgA4hwKVk24aU5y2EupfIEGG+hW4yNvDQ1V9goMTNJyJufws20vG KDcla01NXNpKhFe0lOGvPfWiU+9tKBnj1GlVDRZVrYHf0UFv+Ya6ASLcgbTkKYIiBXx4 8DzUtTCxRB6WZt9nwfnNPtfBwy8yl5TdegQz5pzjtDvQJxH7Hv7V/q6MtKAhDGkW9jz7 spxcXDN8zPfhjfmzsTuMXWeS4l4dvHGy8K5EizbhM77EN6n9dLd/UTR69kgVoHL9NUwK onwCX225cDr77TXQ35qcC03V/C7vbO1fBHGiSeC3azyWp98znxERjDuwNnx8kGroc7zS kQJg== X-Forwarded-Encrypted: i=1; AFNElJ//lhhHjYqLSRKNLx8ryd27ywOr76dznkRTtFsJCsItZrmIUxkG40DGWR2c0QZK62P47AxNWmDCjtJ1qNZH@postgresql.org X-Gm-Message-State: AOJu0Yzpb6D3KYLROpiRzVPodaD7YB4PrBp94LsVhdXXmYemkYcAutVJ qx9NtvVV1swgleJxUPVFU9E7w3WdI/wMpWyn9K6QJNPafPqcN9w58f99zo/LOOqrb/B8Xq1yaxL i0h2rm4pElMibGxLHctvvjibDP0wbp2U5+rAs6Ue8 X-Gm-Gg: Acq92OFK+FaYpyZmqNeLAFJfhCx25D1EXYzrWhx0YtMxZsvdopV4RX86C7CG9S/duOh 74D3mXP55u/Sq9BTAUaq/l206i2tnsMTAenf3vs1SpcOp3W175UG4MfySScbP9C0JdK2Tt+HqTI J6TEHcxM8PEMFDCYiq0mWKY/j0HsU46xgz7+cAMoa6BhJM4k+oFVLVPKUx4I9gLYKvpv0IL6t6H uhknmHF9vfb8iE1kEFVxSk3rkoVUlnKvTflh0yzlTJWOJ0o6haTnhSnQKKJbAtTZUmlxegpj92Y xlNEC2EMOQ== X-Received: by 2002:a17:907:b5a8:b0:bdd:90b8:e39d with SMTP id a640c23a62f3a-bdd90b8ec3bmr517070266b.8.1779693473310; Mon, 25 May 2026 00:17:53 -0700 (PDT) MIME-Version: 1.0 References: <202510151529.s3fpwsgben57@alvherre.pgsql> In-Reply-To: From: Akshay Joshi Date: Mon, 25 May 2026 12:47:41 +0530 X-Gm-Features: AVHnY4J1bIRhyGgEQ-5Fg9RI6ASKXc58rrfjYMCkTcyrSWCNGd-ejOdRCtT_tNQ Message-ID: Subject: Re: [PATCH] Add pg_get_policy_ddl() function to reconstruct CREATE POLICY statement To: Japin Li Cc: jian he , Marcos Pegoraro , Mark Wong , =?UTF-8?Q?=C3=81lvaro_Herrera?= , pgsql-hackers Content-Type: multipart/mixed; boundary="00000000000049955f06529f2da0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000049955f06529f2da0 Content-Type: multipart/alternative; boundary="00000000000049955906529f2d9e" --00000000000049955906529f2d9e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks Japin, Attached is the updated patch. On Fri, May 22, 2026 at 9:55=E2=80=AFPM Japin Li wrot= e: > > Hi, Akshay > > On Fri, 22 May 2026 at 19:02, Akshay Joshi > wrote: > > Hi hackers, > > > > > > > Following the recently committed pg_get_database_ddl(), which adopted a > VARIADIC options text[] style for > > DDL-reconstruction functions, here is a patch in the same spirit for > row-level security policies. > > > > The new function: > > pg_get_policy_ddl(table regclass, policy_name name, VARIADIC option= s > text[]) RETURNS setof text > > > > Reconstructs the CREATE POLICY statement for the named policy on the > given table, returning the result as a single row. > > > > The currently supported option is pretty (boolean) for formatted > output. > > > > SELECT * FROM pg_get_policy_ddl('rls_table', 'pol1'); > > SELECT * FROM pg_get_policy_ddl('rls_table', 'pol1', 'pretty', > 'true'); > > > > NULL inputs for table or policy_name return no rows. Unknown option > names, invalid boolean values, and duplicate options > > are reported as errors consistent with the pattern established by > pg_get_database_ddl(). > > > > The patch includes documentation updates in func-info.sgml and > regression tests in rowsecurity.sql covering > > PERMISSIVE/RESTRICTIVE, each command type > (ALL/SELECT/INSERT/UPDATE/DELETE), TO role lists, both USING and WITH CHE= CK > > clauses, pretty/non-pretty output, and the error paths above. > > > > Patch is ready for review. > > > > On Mon, Jan 5, 2026 at 8:00=E2=80=AFPM jian he > wrote: > > > > On Thu, Nov 20, 2025 at 5:27=E2=80=AFPM Akshay Joshi > > wrote: > > > > > > Attached is the v8 patch for your review, with updated variable name= s > and a rebase applied. > > > > > hi. > > > > + > > + > > + > > + > > + pg_get_policy_ddl > > + > > + pg_get_policy_ddl > > + ( table regclass, > > policy_name name, > > pretty boolean ) > > + text > > + > > + > > + Reconstructs the CREATE POLICY statement > from the > > + system catalogs for a specified table and policy name. The > result is a > > + comprehensive CREATE POLICY statement. > > + > > + > > + > > > > ( table regclass ... > > this line is way too long, we can split it into several lines, it > > won't affect the appearance. > > > > like: > > pg_get_policy_ddl > > ( table regclass, > > policy_name name, > > pretty > > boolean ) > > text > > > > Also, the explanation does not mention that the default value of > > pretty is false. > > > > index 2d946d6d9e9..a5e22374668 100644 > > --- a/src/backend/catalog/system_functions.sql > > +++ b/src/backend/catalog/system_functions.sql > > @@ -657,6 +657,12 @@ LANGUAGE INTERNAL > > STRICT VOLATILE PARALLEL UNSAFE > > AS 'pg_replication_origin_session_setup'; > > > > +CREATE OR REPLACE FUNCTION > > + pg_get_policy_ddl(tableID regclass, policyName name, pretty bool > > DEFAULT false) > > +RETURNS text > > +LANGUAGE INTERNAL > > +AS 'pg_get_policy_ddl'; > > + > > > > The partial upper casing above has no effect; it's the same as > > ``pg_get_policy_ddl(tableid regclass, policyname name, pretty bool > > DEFAULT false)`` > > > > Thanks for updating the patch. Just one nitpick below. > > + append_ddl_option(&buf, pretty, 4, "USING (%s)", > + > TextDatumGetCString(expr)); > > The expression string already contains the parentheses, so we can omit th= em > here, as well as in the WITH CHECK clause. > > -- > Regards, > Japin Li > ChengDu WenWu Information Technology Co., Ltd. > --00000000000049955906529f2d9e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thanks=C2=A0Japin,

Attached is the updated patch.= =C2=A0

On Fri, May 22, 2026 at 9:55=E2=80=AFPM Japin= Li <japinli@hotmail.com> = wrote:

Hi, Akshay

On Fri, 22 May 2026 at 19:02, Akshay Joshi <akshay.joshi@enterprisedb.com>= ; wrote:
> Hi hackers,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0
>
> Following the recently committed pg_get_database_ddl(), which adopted = a VARIADIC options text[] style for
> DDL-reconstruction functions, here is a patch in the same spirit for r= ow-level security policies.
>
> The new function:
>=C2=A0 =C2=A0 =C2=A0pg_get_policy_ddl(table regclass, policy_name name,= VARIADIC options text[]) RETURNS setof text
>
> Reconstructs the CREATE POLICY statement for the named policy on the g= iven table, returning the result as a single row.
>
> The currently supported option is pretty (boolean) for formatted outpu= t.=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0SELECT * FROM pg_get_policy_ddl('rls_table'= , 'pol1');
>=C2=A0 =C2=A0 =C2=A0SELECT * FROM pg_get_policy_ddl('rls_table'= , 'pol1', 'pretty', 'true');
>
> NULL inputs for table or policy_name return no rows. Unknown option na= mes, invalid boolean values, and duplicate options
> are reported as errors consistent with the pattern established by pg_g= et_database_ddl().
>
> The patch includes documentation updates in func-info.sgml and regress= ion tests in rowsecurity.sql covering
> PERMISSIVE/RESTRICTIVE, each command type (ALL/SELECT/INSERT/UPDATE/DE= LETE), TO role lists, both USING and WITH CHECK
> clauses, pretty/non-pretty output, and the error paths above.
>
> Patch is ready for review.
>
> On Mon, Jan 5, 2026 at 8:00=E2=80=AFPM jian he <jian.universality@gmail.com> wrote:
>
>=C2=A0 On Thu, Nov 20, 2025 at 5:27=E2=80=AFPM Akshay Joshi
>=C2=A0 <
akshay.joshi@enterprisedb.com> wrote:
>=C2=A0 >
>=C2=A0 > Attached is the v8 patch for your review, with updated vari= able names and a rebase applied.
>=C2=A0 >
>=C2=A0 hi.
>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0<tbody>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 <row>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0<entry role=3D"func_table_en= try"><para role=3D"func_signature">
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 <indexterm>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0<primary>pg_get_policy_= ddl</primary>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 </indexterm>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 <function>pg_get_policy_ddl&l= t;/function>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ( <parameter>table</parame= ter> <type>regclass</type>,
>=C2=A0 <parameter>policy_name</parameter> <type>name&= lt;/type>, <optional>
>=C2=A0 <parameter>pretty</parameter> <type>boolean<= ;/type> </optional> )
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 <returnvalue>text</returnv= alue>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0</para>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0<para>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 Reconstructs the <command>CRE= ATE POLICY</command> statement from the
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 system catalogs for a specified tab= le and policy name. The result is a
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 comprehensive <command>CREATE= POLICY</command> statement.
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0</para></entry>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 </row>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0</tbody>
>
>=C2=A0 =C2=A0( <parameter>table</parameter> <type>reg= class</type> ...
>=C2=A0 this line is way too long, we can split it into several lines, i= t
>=C2=A0 won't affect the appearance.
>
>=C2=A0 like:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <function>pg_get_policy_ddl<= ;/function>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ( <parameter>table</paramet= er> <type>regclass</type>,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <parameter>policy_name&= lt;/parameter> <type>name</type>,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <optional> <paramete= r>pretty</parameter>
>=C2=A0 <type>boolean</type> </optional> )
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <returnvalue>text</returnva= lue>
>
>=C2=A0 Also, the explanation does not mention that the default value of=
>=C2=A0 pretty is false.
>
>=C2=A0 index 2d946d6d9e9..a5e22374668 100644
>=C2=A0 --- a/src/backend/catalog/system_functions.sql
>=C2=A0 +++ b/src/backend/catalog/system_functions.sql
>=C2=A0 @@ -657,6 +657,12 @@ LANGUAGE INTERNAL
>=C2=A0 =C2=A0STRICT VOLATILE PARALLEL UNSAFE
>=C2=A0 =C2=A0AS 'pg_replication_origin_session_setup';
>
>=C2=A0 +CREATE OR REPLACE FUNCTION
>=C2=A0 +=C2=A0 pg_get_policy_ddl(tableID regclass, policyName name, pre= tty bool
>=C2=A0 DEFAULT false)
>=C2=A0 +RETURNS text
>=C2=A0 +LANGUAGE INTERNAL
>=C2=A0 +AS 'pg_get_policy_ddl';
>=C2=A0 +
>
>=C2=A0 The partial upper casing above has no effect; it's the same = as
>=C2=A0 ``pg_get_policy_ddl(tableid regclass, policyname name, pretty bo= ol
>=C2=A0 DEFAULT false)``
>

Thanks for updating the patch.=C2=A0 Just one nitpick below.

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0append_ddl_option(&= amp;buf, pretty, 4, "USING (%s)",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0TextDatumGetCString(expr));

The expression string already contains the parentheses, so we can omit them=
here, as well as in the WITH CHECK clause.

--
Regards,
Japin Li
ChengDu WenWu Information Technology Co., Ltd.
--00000000000049955906529f2d9e-- --00000000000049955f06529f2da0 Content-Type: application/octet-stream; name="v10-0001-Add-pg_get_policy_ddl-function-to-reconstruct-CREATE.patch" Content-Disposition: attachment; filename="v10-0001-Add-pg_get_policy_ddl-function-to-reconstruct-CREATE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpkvj6op0 RnJvbSBlM2MxMDA3OTM5OTNmMDA5YmE1MjQ1YjlkOGE1NjZjZjgzMmQyZDg4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBGcmksIDIyIE1heSAyMDI2IDE4OjE4OjA3ICswNTMwClN1YmplY3Q6IFtQ QVRDSCB2MTBdIEFkZCBwZ19nZXRfcG9saWN5X2RkbCgpIGZ1bmN0aW9uIHRvIHJlY29uc3RydWN0 IENSRUFURQogUE9MSUNZIHN0YXRlbWVudHMuCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlw ZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4 Yml0CgpUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3lzdGVtIGZ1bmN0aW9uOgogICAgcGdf Z2V0X3BvbGljeV9kZGwodGFibGUgcmVnY2xhc3MsIHBvbGljeV9uYW1lIG5hbWUsCiAgICAgICBW QVJJQURJQyBvcHRpb25zIHRleHRbXSkgUkVUVVJOUyBzZXRvZiB0ZXh0Cgp3aGljaCByZWNvbnN0 cnVjdHMgdGhlIENSRUFURSBQT0xJQ1kgc3RhdGVtZW50IGZvciB0aGUgbmFtZWQgcm93LWxldmVs CnNlY3VyaXR5IHBvbGljeSBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlLiBUaGUgcmVzdWx0IGlzIHJl dHVybmVkIGFzIGEgc2luZ2xlIHJvdy4KwqAKVGhlIHN1cHBvcnRlZCBvcHRpb24gaXM6CgogICAg cHJldHR5IChib29sZWFuKSAtIGZvcm1hdCB0aGUgb3V0cHV0IGZvciByZWFkYWJpbGl0eS4KClVz YWdlIGV4YW1wbGVzOgogICAgLS0gbm9uLXByZXR0eSBmb3JtYXR0ZWQgRERMIChkZWZhdWx0KQog ICAgU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RhYmxlJywgJ3BvbDEnKTsK ICAgIFNFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoMTY1NjQsICdwb2wxJyk7CgogICAg LS0gcHJldHR5IGZvcm1hdHRlZCBEREwKICAgIFNFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9k ZGwoJ3Jsc190YWJsZScsICdwb2wxJywgJ3ByZXR0eScsICd0cnVlJyk7CiAgICBTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKDE2NTY0LCAncG9sMScsICdwcmV0dHknLCAndHJ1ZScpOwoK UmVmZXJlbmNlOiBQRy0xNjMKQXV0aG9yOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRl cnByaXNlZGIuY29tPgotLS0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sICAgICAg ICAgIHwgIDIwICsrCiBzcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYyAgICAgICAgICB8 IDI3MCArKysrKysrKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0ICAgICAgICAgICB8ICAgOCArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jvd3NlY3Vy aXR5Lm91dCB8IDE5MyArKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dz ZWN1cml0eS5zcWwgICAgICB8ICA4NyArKysrKysrCiA1IGZpbGVzIGNoYW5nZWQsIDU3OCBpbnNl cnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwg Yi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCAwMGY2NGY1MGNlYi4uNDRi ZjY0NTViYjEgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCisr KyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0zOTYxLDYgKzM5NjEsMjYg QEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIvcG9zdGdyZXN9 CiAgICAgICAgIDxsaXRlcmFsPlRBQkxFU1BBQ0U8L2xpdGVyYWw+LgogICAgICAgIDwvcGFyYT48 L2VudHJ5PgogICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJm dW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxp bmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfcG9saWN5X2RkbDwvcHJpbWFyeT4K KyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5wZ19nZXRfcG9saWN5X2Rk bDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFyYW1ldGVyPiA8dHlw ZT5yZWdjbGFzczwvdHlwZT4sCisgICAgICAgIDxwYXJhbWV0ZXI+cG9saWN5X25hbWU8L3BhcmFt ZXRlcj4gPHR5cGU+bmFtZTwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFsPiwgPGxpdGVyYWw+VkFS SUFESUM8L2xpdGVyYWw+IDxwYXJhbWV0ZXI+b3B0aW9uczwvcGFyYW1ldGVyPgorICAgICAgICA8 dHlwZT50ZXh0PC90eXBlPiA8L29wdGlvbmFsPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT5zZXRv ZiB0ZXh0PC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAg ICAgIFJlY29uc3RydWN0cyB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFBPTElDWTwvY29tbWFuZD4gc3Rh dGVtZW50IGZvciB0aGUKKyAgICAgICAgbmFtZWQgcm93LWxldmVsIHNlY3VyaXR5IHBvbGljeSBv biB0aGUgc3BlY2lmaWVkIHRhYmxlLiAgVGhlIHJlc3VsdAorICAgICAgICBpcyByZXR1cm5lZCBh cyBhIHNpbmdsZSByb3cuCisgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9uIGlzIHN1cHBvcnRl ZDogPGxpdGVyYWw+cHJldHR5PC9saXRlcmFsPgorICAgICAgICAoYm9vbGVhbikgZm9yIGZvcm1h dHRlZCBvdXRwdXQuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KICAgICAg PC90Ym9keT4KICAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGls cy5jCmluZGV4IGYzMmZjZDQ1M2VmLi4xNTY5NmI4YzgwMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0 aWxzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5o IgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3Bn X2RiX3JvbGVfc2V0dGluZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfcG9saWN5LmgiCiAjaW5j bHVkZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVz cGFjZS5oIgogI2luY2x1ZGUgImNvbW1vbi9yZWxwYXRoLmgiCkBAIC04Niw2ICs4Nyw5IEBAIHN0 YXRpYyBMaXN0ICpwZ19nZXRfdGFibGVzcGFjZV9kZGxfaW50ZXJuYWwoT2lkIHRzaWQsIGJvb2wg cHJldHR5LCBib29sIG5vX293bmVyCiBzdGF0aWMgRGF0dW0gcGdfZ2V0X3RhYmxlc3BhY2VfZGRs X3NyZihGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbywgT2lkIHRzaWQsIGJvb2wgaXNudWxsKTsKIHN0 YXRpYyBMaXN0ICpwZ19nZXRfZGF0YWJhc2VfZGRsX2ludGVybmFsKE9pZCBkYmlkLCBib29sIHBy ZXR0eSwKIAkJCQkJCQkJCQkgIGJvb2wgbm9fb3duZXIsIGJvb2wgbm9fdGFibGVzcGFjZSk7Citz dGF0aWMgTGlzdCAqcGdfZ2V0X3BvbGljeV9kZGxfaW50ZXJuYWwoT2lkIHRhYmxlSUQsIGNvbnN0 IGNoYXIgKnBvbGljeU5hbWUsCisJCQkJCQkJCQkJYm9vbCBwcmV0dHkpOworc3RhdGljIGNvbnN0 IGNoYXIgKmdldF9wb2xpY3lfY21kX25hbWUoY2hhciBjbWQpOwogCiAKIC8qCkBAIC0xMTg1LDMg KzExODksMjY5IEBAIHBnX2dldF9kYXRhYmFzZV9kZGwoUEdfRlVOQ1RJT05fQVJHUykKIAkJU1JG X1JFVFVSTl9ET05FKGZ1bmNjdHgpOwogCX0KIH0KKworLyoKKyAqIGdldF9wb2xpY3lfY21kX25h bWUKKyAqCQlNYXAgYSBwZ19wb2xpY3kucG9sY21kIGNoYXIgdG8gaXRzIFNRTCBrZXl3b3JkLgor ICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfcG9saWN5X2NtZF9uYW1lKGNoYXIgY21kKQor eworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSAnKic6CisJCQlyZXR1cm4gIkFMTCI7CisJCWNh c2UgQUNMX1NFTEVDVF9DSFI6CisJCQlyZXR1cm4gIlNFTEVDVCI7CisJCWNhc2UgQUNMX0lOU0VS VF9DSFI6CisJCQlyZXR1cm4gIklOU0VSVCI7CisJCWNhc2UgQUNMX1VQREFURV9DSFI6CisJCQly ZXR1cm4gIlVQREFURSI7CisJCWNhc2UgQUNMX0RFTEVURV9DSFI6CisJCQlyZXR1cm4gIkRFTEVU RSI7CisJCWRlZmF1bHQ6CisJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIHBvbGljeSBjb21t YW5kOiAlZCIsIChpbnQpIGNtZCk7CisJfQorfQorCisvKgorICogcGdfZ2V0X3BvbGljeV9kZGxf aW50ZXJuYWwKKyAqCQlHZW5lcmF0ZSB0aGUgRERMIHN0YXRlbWVudCB0byByZWNyZWF0ZSBhIHJv dy1sZXZlbCBzZWN1cml0eSBwb2xpY3kuCisgKgorICogUmV0dXJucyBhIExpc3QgY29udGFpbmlu ZyBhIHNpbmdsZSBwYWxsb2MnZCBzdHJpbmcgd2l0aCB0aGUgQ1JFQVRFIFBPTElDWQorICogc3Rh dGVtZW50LiAgUmV0dXJuaW5nIGEgTGlzdCBrZWVwcyB0aGUgY2FsbGluZyBjb252ZW50aW9uIGNv bnNpc3RlbnQgd2l0aAorICogdGhlIHJlc3Qgb2YgdGhlIHBnX2dldF8qX2RkbCBmYW1pbHkgZXZl biB0aG91Z2ggb25seSBvbmUgcm93IGlzIHByb2R1Y2VkLgorICovCitzdGF0aWMgTGlzdCAqCitw Z19nZXRfcG9saWN5X2RkbF9pbnRlcm5hbChPaWQgdGFibGVJRCwgY29uc3QgY2hhciAqcG9saWN5 TmFtZSwgYm9vbCBwcmV0dHkpCit7CisJUmVsYXRpb24JcGdQb2xpY3lSZWw7CisJSGVhcFR1cGxl CXR1cGxlUG9saWN5OworCUZvcm1fcGdfcG9saWN5IHBvbGljeUZvcm07CisJU2NhbktleURhdGEg c2tleVsyXTsKKwlTeXNTY2FuRGVzYyBzc2NhbjsKKwlTdHJpbmdJbmZvRGF0YSBidWY7CisJRGF0 dW0JCXZhbHVlRGF0dW07CisJYm9vbAkJYXR0cklzTnVsbDsKKwljaGFyCSAgICp0YXJnZXRUYWJs ZTsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzID0gTklMOworCisJLyogVmFsaWRhdGUgdGhhdCB0aGUg cmVsYXRpb24gZXhpc3RzICovCisJeworCQljaGFyCSAgICpyZWxuYW1lID0gZ2V0X3JlbF9uYW1l KHRhYmxlSUQpOworCQljaGFyCSAgICpuc3BuYW1lOworCisJCWlmIChyZWxuYW1lID09IE5VTEwp CisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9UQUJM RSksCisJCQkJCSBlcnJtc2coInJlbGF0aW9uIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0Iiwg dGFibGVJRCkpKTsKKworCQluc3BuYW1lID0gZ2V0X25hbWVzcGFjZV9uYW1lKGdldF9yZWxfbmFt ZXNwYWNlKHRhYmxlSUQpKTsKKwkJaWYgKG5zcG5hbWUgPT0gTlVMTCkKKwkJCWVyZXBvcnQoRVJS T1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX1NDSEVNQSksCisJCQkJCSBlcnJt c2coInNjaGVtYSBmb3IgcmVsYXRpb24gd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLAorCQkJ CQkJCXRhYmxlSUQpKSk7CisKKwkJdGFyZ2V0VGFibGUgPSBxdW90ZV9xdWFsaWZpZWRfaWRlbnRp Zmllcihuc3BuYW1lLCByZWxuYW1lKTsKKwkJcGZyZWUocmVsbmFtZSk7CisJCXBmcmVlKG5zcG5h bWUpOworCX0KKworCXBnUG9saWN5UmVsID0gdGFibGVfb3BlbihQb2xpY3lSZWxhdGlvbklkLCBB Y2Nlc3NTaGFyZUxvY2spOworCisJLyogU2V0IGtleSAtIHBvbGljeSdzIHJlbGF0aW9uIGlkLiAq LworCVNjYW5LZXlJbml0KCZza2V5WzBdLAorCQkJCUFudW1fcGdfcG9saWN5X3BvbHJlbGlkLAor CQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVt KHRhYmxlSUQpKTsKKworCS8qIFNldCBrZXkgLSBwb2xpY3kncyBuYW1lLiAqLworCVNjYW5LZXlJ bml0KCZza2V5WzFdLAorCQkJCUFudW1fcGdfcG9saWN5X3BvbG5hbWUsCisJCQkJQlRFcXVhbFN0 cmF0ZWd5TnVtYmVyLCBGX05BTUVFUSwKKwkJCQlDU3RyaW5nR2V0RGF0dW0ocG9saWN5TmFtZSkp OworCisJc3NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdQb2xpY3lSZWwsCisJCQkJCQkJICAg UG9saWN5UG9scmVsaWRQb2xuYW1lSW5kZXhJZCwgdHJ1ZSwgTlVMTCwgMiwKKwkJCQkJCQkgICBz a2V5KTsKKworCXR1cGxlUG9saWN5ID0gc3lzdGFibGVfZ2V0bmV4dChzc2Nhbik7CisJaWYgKCFI ZWFwVHVwbGVJc1ZhbGlkKHR1cGxlUG9saWN5KSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJy Y29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1QpLAorCQkJCSBlcnJtc2coInBvbGljeSBcIiVz XCIgZm9yIHRhYmxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCisJCQkJCQlwb2xpY3lOYW1lLCB0 YXJnZXRUYWJsZSkpKTsKKworCXBvbGljeUZvcm0gPSAoRm9ybV9wZ19wb2xpY3kpIEdFVFNUUlVD VCh0dXBsZVBvbGljeSk7CisKKwlpbml0U3RyaW5nSW5mbygmYnVmKTsKKworCS8qIEJ1aWxkIHRo ZSBDUkVBVEUgUE9MSUNZIHN0YXRlbWVudCAqLworCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIkNS RUFURSBQT0xJQ1kgJXMgT04gJXMiLAorCQkJCQkgcXVvdGVfaWRlbnRpZmllcihwb2xpY3lOYW1l KSwKKwkJCQkJIHRhcmdldFRhYmxlKTsKKworCS8qCisJICogRW1pdCBBUyBSRVNUUklDVElWRSBv bmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0IChQRVJNSVNTSVZFKS4KKwkgKi8K KwlpZiAoIXBvbGljeUZvcm0tPnBvbHBlcm1pc3NpdmUpCisJCWFwcGVuZF9kZGxfb3B0aW9uKCZi dWYsIHByZXR0eSwgNCwgIkFTIFJFU1RSSUNUSVZFIik7CisKKwkvKgorCSAqIEVtaXQgRk9SIDxj bWQ+IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQgKEFMTCwgZW5jb2RlZCBh cworCSAqICcqJykuCisJICovCisJaWYgKHBvbGljeUZvcm0tPnBvbGNtZCAhPSAnKicpCisJCWFw cGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIkZPUiAlcyIsCisJCQkJCQkgIGdldF9w b2xpY3lfY21kX25hbWUocG9saWN5Rm9ybS0+cG9sY21kKSk7CisKKwkvKgorCSAqIEVtaXQgVE8g PHJvbGVzPiBvbmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0IChQVUJMSUMpLiAg UFVCTElDCisJICogaXMgZW5jb2RlZCBpbiBwb2xyb2xlcyBhcyBhIHNpbmdsZSBJbnZhbGlkT2lk IGVsZW1lbnQsIHNvIHdlIG9taXQgdGhlCisJICogY2xhdXNlIHdoZW5ldmVyIGV2ZXJ5IGVudHJ5 IGlzIEludmFsaWRPaWQuCisJICovCisJdmFsdWVEYXR1bSA9IGhlYXBfZ2V0YXR0cih0dXBsZVBv bGljeSwKKwkJCQkJCQkgIEFudW1fcGdfcG9saWN5X3BvbHJvbGVzLAorCQkJCQkJCSAgUmVsYXRp b25HZXREZXNjcihwZ1BvbGljeVJlbCksCisJCQkJCQkJICAmYXR0cklzTnVsbCk7CisJaWYgKCFh dHRySXNOdWxsKQorCXsKKwkJQXJyYXlUeXBlICAqcG9saWN5X3JvbGVzID0gRGF0dW1HZXRBcnJh eVR5cGVQQ29weSh2YWx1ZURhdHVtKTsKKwkJaW50CQkJbml0ZW1zID0gQVJSX0RJTVMocG9saWN5 X3JvbGVzKVswXTsKKwkJT2lkCQkgICAqcm9sZXMgPSAoT2lkICopIEFSUl9EQVRBX1BUUihwb2xp Y3lfcm9sZXMpOworCQlTdHJpbmdJbmZvRGF0YSByb2xlX25hbWVzOworCisJCWluaXRTdHJpbmdJ bmZvKCZyb2xlX25hbWVzKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG5pdGVtczsgaSsrKQor CQl7CisJCQlpZiAoT2lkSXNWYWxpZChyb2xlc1tpXSkpCisJCQl7CisJCQkJY2hhcgkgICAqcm9s ZW5hbWUgPSBHZXRVc2VyTmFtZUZyb21JZChyb2xlc1tpXSwgZmFsc2UpOworCisJCQkJaWYgKHJv bGVfbmFtZXMubGVuID4gMCkKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmcm9sZV9uYW1l cywgIiwgIik7CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmcm9sZV9uYW1lcywgcXVvdGVf aWRlbnRpZmllcihyb2xlbmFtZSkpOworCQkJfQorCQl9CisKKwkJaWYgKHJvbGVfbmFtZXMubGVu ID4gMCkKKwkJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIlRPICVzIiwgcm9s ZV9uYW1lcy5kYXRhKTsKKworCQlwZnJlZShyb2xlX25hbWVzLmRhdGEpOworCQlwZnJlZShwb2xp Y3lfcm9sZXMpOworCX0KKworCS8qIFVTSU5HIGV4cHJlc3Npb24gKi8KKwl2YWx1ZURhdHVtID0g aGVhcF9nZXRhdHRyKHR1cGxlUG9saWN5LAorCQkJCQkJCSAgQW51bV9wZ19wb2xpY3lfcG9scXVh bCwKKwkJCQkJCQkgIFJlbGF0aW9uR2V0RGVzY3IocGdQb2xpY3lSZWwpLAorCQkJCQkJCSAgJmF0 dHJJc051bGwpOworCWlmICghYXR0cklzTnVsbCkKKwl7CisJCURhdHVtCQlleHByOworCisJCWV4 cHIgPSBEaXJlY3RGdW5jdGlvbkNhbGwzKHBnX2dldF9leHByX2V4dCwKKwkJCQkJCQkJICAgdmFs dWVEYXR1bSwKKwkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShwb2xpY3lGb3JtLT5wb2xyZWxp ZCksCisJCQkJCQkJCSAgIEJvb2xHZXREYXR1bShwcmV0dHkpKTsKKwkJLyoKKwkJICogSW4gbm9u LXByZXR0eSBtb2RlIHBnX2dldF9leHByKCkgYWxyZWFkeSB3cmFwcyB0aGUgZXhwcmVzc2lvbiBp bgorCQkgKiBwYXJlbnRoZXNlcywgc28gZW1pdCBpdCB2ZXJiYXRpbTsgaW4gcHJldHR5IG1vZGUg d2UgaGF2ZSB0byBhZGQKKwkJICogdGhlIHBhcmVudGhlc2VzIHJlcXVpcmVkIGJ5IENSRUFURSBQ T0xJQ1kgc3ludGF4IG91cnNlbHZlcy4KKwkJICovCisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYs IHByZXR0eSwgNCwKKwkJCQkJCSAgcHJldHR5ID8gIlVTSU5HICglcykiIDogIlVTSU5HICVzIiwK KwkJCQkJCSAgVGV4dERhdHVtR2V0Q1N0cmluZyhleHByKSk7CisJfQorCisJLyogV0lUSCBDSEVD SyBleHByZXNzaW9uICovCisJdmFsdWVEYXR1bSA9IGhlYXBfZ2V0YXR0cih0dXBsZVBvbGljeSwK KwkJCQkJCQkgIEFudW1fcGdfcG9saWN5X3BvbHdpdGhjaGVjaywKKwkJCQkJCQkgIFJlbGF0aW9u R2V0RGVzY3IocGdQb2xpY3lSZWwpLAorCQkJCQkJCSAgJmF0dHJJc051bGwpOworCWlmICghYXR0 cklzTnVsbCkKKwl7CisJCURhdHVtCQlleHByOworCisJCWV4cHIgPSBEaXJlY3RGdW5jdGlvbkNh bGwzKHBnX2dldF9leHByX2V4dCwKKwkJCQkJCQkJICAgdmFsdWVEYXR1bSwKKwkJCQkJCQkJICAg T2JqZWN0SWRHZXREYXR1bShwb2xpY3lGb3JtLT5wb2xyZWxpZCksCisJCQkJCQkJCSAgIEJvb2xH ZXREYXR1bShwcmV0dHkpKTsKKwkJLyogU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgcGFyZW50aGVz aXphdGlvbi4gKi8KKwkJYXBwZW5kX2RkbF9vcHRpb24oJmJ1ZiwgcHJldHR5LCA0LAorCQkJCQkJ ICBwcmV0dHkgPyAiV0lUSCBDSEVDSyAoJXMpIiA6ICJXSVRIIENIRUNLICVzIiwKKwkJCQkJCSAg VGV4dERhdHVtR2V0Q1N0cmluZyhleHByKSk7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIo JmJ1ZiwgJzsnKTsKKworCXN0YXRlbWVudHMgPSBsYXBwZW5kKHN0YXRlbWVudHMsIHBzdHJkdXAo YnVmLmRhdGEpKTsKKworCXN5c3RhYmxlX2VuZHNjYW4oc3NjYW4pOworCXRhYmxlX2Nsb3NlKHBn UG9saWN5UmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCXBmcmVlKGJ1Zi5kYXRhKTsKKworCXJldHVy biBzdGF0ZW1lbnRzOworfQorCisvKgorICogcGdfZ2V0X3BvbGljeV9kZGwKKyAqCQlSZXR1cm4g RERMIHRvIHJlY3JlYXRlIGEgcm93LWxldmVsIHNlY3VyaXR5IHBvbGljeSBhcyBhIHNpbmdsZSB0 ZXh0IHJvdy4KKyAqLworRGF0dW0KK3BnX2dldF9wb2xpY3lfZGRsKFBHX0ZVTkNUSU9OX0FSR1Mp Cit7CisJRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworCUxpc3QJICAgKnN0YXRlbWVudHM7CisK KwlpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgpKQorCXsKKwkJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0 OworCQlPaWQJCQl0YWJsZUlEOworCQlOYW1lCQlwb2xpY3lOYW1lOworCQlEZGxPcHRpb24Jb3B0 c1tdID0geworCQkJeyJwcmV0dHkiLCBERExfT1BUX0JPT0x9LAorCQl9OworCisJCWZ1bmNjdHgg PSBTUkZfRklSU1RDQUxMX0lOSVQoKTsKKwkJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0 Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21lbW9yeV9jdHgpOworCisJCWlmIChQR19BUkdJU05V TEwoMCkgfHwgUEdfQVJHSVNOVUxMKDEpKQorCQl7CisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8o b2xkY29udGV4dCk7CisJCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CisJCX0KKworCQl0YWJs ZUlEID0gUEdfR0VUQVJHX09JRCgwKTsKKwkJcG9saWN5TmFtZSA9IFBHX0dFVEFSR19OQU1FKDEp OworCisJCXBhcnNlX2RkbF9vcHRpb25zKGZjaW5mbywgMiwgb3B0cywgbGVuZ3Rob2Yob3B0cykp OworCisJCXN0YXRlbWVudHMgPSBwZ19nZXRfcG9saWN5X2RkbF9pbnRlcm5hbCh0YWJsZUlELAor CQkJCQkJCQkJCQkJTmFtZVN0cigqcG9saWN5TmFtZSksCisJCQkJCQkJCQkJCQlvcHRzWzBdLmlz c2V0ICYmIG9wdHNbMF0uYm9vbHZhbCk7CisJCWZ1bmNjdHgtPnVzZXJfZmN0eCA9IHN0YXRlbWVu dHM7CisJCWZ1bmNjdHgtPm1heF9jYWxscyA9IGxpc3RfbGVuZ3RoKHN0YXRlbWVudHMpOworCisJ CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKKwl9CisKKwlmdW5jY3R4ID0gU1JG X1BFUkNBTExfU0VUVVAoKTsKKwlzdGF0ZW1lbnRzID0gKExpc3QgKikgZnVuY2N0eC0+dXNlcl9m Y3R4OworCisJaWYgKGZ1bmNjdHgtPmNhbGxfY250ciA8IGZ1bmNjdHgtPm1heF9jYWxscykKKwl7 CisJCWNoYXIJICAgKnN0bXQ7CisKKwkJc3RtdCA9IGxpc3RfbnRoKHN0YXRlbWVudHMsIGZ1bmNj dHgtPmNhbGxfY250cik7CisKKwkJU1JGX1JFVFVSTl9ORVhUKGZ1bmNjdHgsIENTdHJpbmdHZXRU ZXh0RGF0dW0oc3RtdCkpOworCX0KKwllbHNlCisJeworCQlsaXN0X2ZyZWVfZGVlcChzdGF0ZW1l bnRzKTsKKwkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOworCX0KK30KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CmluZGV4IGJlMTU3YTVmYmU5Li4zZTMyYzg5ZmQ2ZCAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CkBAIC04NjE1LDYgKzg2MTUsMTQgQEAKICAgcHJvYXJndHlwZXMgPT4gJ3JlZ2RhdGFi YXNlIHRleHQnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3JlZ2RhdGFiYXNlLHRleHR9JywKICAgcHJv YXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJnZGVmYXVsdHMgPT4gJ3tOVUxMfScsCiAgIHByb3Ny YyA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcgfSwKK3sgb2lkID0+ICc2NTE3JywgZGVzY3IgPT4g J2dldCBEREwgdG8gcmVjcmVhdGUgYSByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWN5JywKKyAgcHJv bmFtZSA9PiAncGdfZ2V0X3BvbGljeV9kZGwnLCBwcm9yb3dzID0+ICcxJywgcHJvdmFyaWFkaWMg PT4gJ3RleHQnLAorICBwcm9pc3N0cmljdCA9PiAnZicsIHByb3JldHNldCA9PiAndCcsIHByb3Zv bGF0aWxlID0+ICdzJywKKyAgcHJvbmFyZ2RlZmF1bHRzID0+ICcxJywgcHJvcmV0dHlwZSA9PiAn dGV4dCcsCisgIHByb2FyZ3R5cGVzID0+ICdyZWdjbGFzcyBuYW1lIHRleHQnLAorICBwcm9hbGxh cmd0eXBlcyA9PiAne3JlZ2NsYXNzLG5hbWUsdGV4dH0nLAorICBwcm9hcmdtb2RlcyA9PiAne2ks aSx2fScsIHByb2FyZ2RlZmF1bHRzID0+ICd7TlVMTH0nLAorICBwcm9zcmMgPT4gJ3BnX2dldF9w b2xpY3lfZGRsJyB9LAogeyBvaWQgPT4gJzI1MDknLAogICBkZXNjciA9PiAnZGVwYXJzZSBhbiBl bmNvZGVkIGV4cHJlc3Npb24gd2l0aCBwcmV0dHktcHJpbnQgb3B0aW9uJywKICAgcHJvbmFtZSA9 PiAncGdfZ2V0X2V4cHInLCBwcm92b2xhdGlsZSA9PiAncycsIHByb3JldHR5cGUgPT4gJ3RleHQn LApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yb3dzZWN1cml0eS5vdXQg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jvd3NlY3VyaXR5Lm91dAppbmRleCAzYTVlODJj MzViZC4uNGU1ZGQwMzllOTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv cm93c2VjdXJpdHkub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcm93c2VjdXJp dHkub3V0CkBAIC01MTk1LDYgKzUxOTUsMTk5IEBAIHJlc2V0IHJsc190ZXN0LmJsYWg7CiBkcm9w IGZ1bmN0aW9uIHJsc19mKHRleHQpOwogZHJvcCB0YWJsZSBybHNfdCwgdGVzdF90OwogLS0KKy0t IFRlc3QgZm9yIHBnX2dldF9wb2xpY3lfZGRsKHRhYmxlLCBwb2xpY3lfbmFtZSwgVkFSSUFESUMg b3B0aW9ucykgZnVuY3Rpb24uCistLQorQ1JFQVRFIFRBQkxFIHJsc190YmxfMSAoCisgICAgZGlk ICAgICAgICAgaW50IHByaW1hcnkga2V5LAorICAgIGNpZCAgICAgICAgIGludCwKKyAgICBkbGV2 ZWwgICAgICBpbnQgbm90IG51bGwsCisgICAgZGF1dGhvciAgICAgbmFtZSwKKyAgICBkdGl0bGUg ICAgICB0ZXh0CispOworR1JBTlQgQUxMIE9OIHJsc190YmxfMSBUTyBwdWJsaWM7CitDUkVBVEUg VEFCTEUgcmxzX3RibF8yICgKKyAgICBwZ3VzZXIgICAgICBuYW1lIHByaW1hcnkga2V5LAorICAg IHNlY2x2ICAgICAgIGludAorKTsKK0dSQU5UIFNFTEVDVCBPTiBybHNfdGJsXzIgVE8gcHVibGlj OworLS0gVGVzdCBQRVJNSVNTSVZFIGFuZCBSRVNUUklDVElWRQorQ1JFQVRFIFBPTElDWSBybHNf cDEgT04gcmxzX3RibF8xIEFTIFBFUk1JU1NJVkUKKyAgICBVU0lORyAoZGxldmVsIDw9IChTRUxF Q1Qgc2VjbHYgRlJPTSBybHNfdGJsXzIgV0hFUkUgcGd1c2VyID0gY3VycmVudF91c2VyKSk7CitD UkVBVEUgUE9MSUNZIHJsc19wMiBPTiBybHNfdGJsXzEgQVMgUkVTVFJJQ1RJVkUgVVNJTkcgKGNp ZCA8PiA0NCBBTkQgY2lkIDwgNTApOworLS0gVGVzdCBGT1IgQUxMIHwgU0VMRUNUIHwgSU5TRVJU IHwgVVBEQVRFIHwgREVMRVRFCitDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzEgRk9S IEFMTCBVU0lORyAoZGF1dGhvciA9IGN1cnJlbnRfdXNlcik7CitDUkVBVEUgUE9MSUNZIHJsc19w NCBPTiBybHNfdGJsXzEgRk9SIFNFTEVDVCBVU0lORyAoY2lkICUgMiA9IDApOworQ1JFQVRFIFBP TElDWSBybHNfcDUgT04gcmxzX3RibF8xIEZPUiBJTlNFUlQgV0lUSCBDSEVDSyAoY2lkICUgMiA9 IDEpOworQ1JFQVRFIFBPTElDWSBybHNfcDYgT04gcmxzX3RibF8xIEZPUiBVUERBVEUgVVNJTkcg KGNpZCAlIDIgPSAwKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A3IE9OIHJsc190YmxfMSBGT1IgREVM RVRFIFVTSU5HIChjaWQgPCA4KTsKKy0tIFRlc3QgVE8geyByb2xlX25hbWUgLi4uIH0KK0NSRUFU RSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMSBUTyByZWdyZXNzX3Jsc19kYXZlLCByZWdyZXNz X3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CitDUkVBVEUgUE9MSUNZIHJsc19wOSBPTiBybHNfdGJs XzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVDSyAoY2lkID0gKFNFTEVDVCBz ZWNsdiBGUk9NIHJsc190YmxfMikpOworLS0gTlVMTCBpbnB1dHMgc2hvdWxkIHJldHVybiBubyBy b3dzCitTRUxFQ1QgY291bnQoKikgRlJPTSBwZ19nZXRfcG9saWN5X2RkbChOVUxMLCAncmxzX3Ax Jyk7CisgY291bnQgCistLS0tLS0tCisgICAgIDAKKygxIHJvdykKKworU0VMRUNUIGNvdW50KCop IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsIE5VTEwpOworIGNvdW50IAorLS0t LS0tLQorICAgICAwCisoMSByb3cpCisKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xp Y3lfZGRsKE5VTEwsIE5VTEwpOworIGNvdW50IAorLS0tLS0tLQorICAgICAwCisoMSByb3cpCisK Ky0tIFRhYmxlIGRvZXMgbm90IGV4aXN0CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRs KCdub25leGlzdGVudF90YmwnLCAncmxzX3AxJyk7CitFUlJPUjogIHJlbGF0aW9uICJub25leGlz dGVudF90YmwiIGRvZXMgbm90IGV4aXN0CitMSU5FIDE6IFNFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ25vbmV4aXN0ZW50X3RibCcsICdybHNfcDEnKS4uLgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy0tIFBvbGljeSBkb2VzIG5vdCBleGlzdAorU0VM RUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ25vbmV4aXN0ZW50X3Bv bCcpOworRVJST1I6ICBwb2xpY3kgIm5vbmV4aXN0ZW50X3BvbCIgZm9yIHRhYmxlICJyZWdyZXNz X3Jsc19zY2hlbWEucmxzX3RibF8xIiBkb2VzIG5vdCBleGlzdAorLS0gSW52YWxpZCBvcHRpb24g bmFtZQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19w MScsICdiYWRvcHQnLCAndHJ1ZScpOworRVJST1I6ICB1bnJlY29nbml6ZWQgb3B0aW9uOiAiYmFk b3B0IgorLS0gSW52YWxpZCBib29sZWFuIHZhbHVlIGZvciBvcHRpb24KK1NFTEVDVCAqIEZST00g cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLCAncHJldHR5JywgJ21heWJl Jyk7CitFUlJPUjogIGludmFsaWQgdmFsdWUgZm9yIGJvb2xlYW4gb3B0aW9uICJwcmV0dHkiOiBt YXliZQorLS0gRHVwbGljYXRlIG9wdGlvbgorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2Rk bCgncmxzX3RibF8xJywgJ3Jsc19wMScsICdwcmV0dHknLCAndHJ1ZScsICdwcmV0dHknLCAnZmFs c2UnKTsKK0VSUk9SOiAgb3B0aW9uICJwcmV0dHkiIGlzIHNwZWNpZmllZCBtb3JlIHRoYW4gb25j ZQorLS0gV2l0aG91dCBwcmV0dHkgZm9ybWF0dGluZyAoZGVmYXVsdCkKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDEgT04gcmVncmVzc19ybHNfc2NoZW1hLnJs c190YmxfMSBVU0lORyAoZGxldmVsIDw9ICggU0VMRUNUIHJsc190YmxfMi5zZWNsdisKKyAgICBG Uk9NIHJsc190YmxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgV0hFUkUgKHJsc190YmxfMi5w Z3VzZXIgPSBDVVJSRU5UX1VTRVIpKSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDInKTsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDIgT04gcmVncmVzc19y bHNfc2NoZW1hLnJsc190YmxfMSBBUyBSRVNUUklDVElWRSBVU0lORyAoKGNpZCA8PiA0NCkgQU5E IChjaWQgPCA1MCkpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRs KCdybHNfdGJsXzEnLCAncmxzX3AzJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiBy ZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIFVTSU5HIChkYXV0aG9yID0gQ1VSUkVOVF9VU0VS KTsKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8x JywgJ3Jsc19wNCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRf cG9saWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3A0IE9OIHJlZ3Jlc3Nf cmxzX3NjaGVtYS5ybHNfdGJsXzEgRk9SIFNFTEVDVCBVU0lORyAoKGNpZCAlIDIpID0gMCk7Ciso MSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdy bHNfcDUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3Bv bGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDUgT04gcmVn cmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKChjaWQgJSAy KSA9IDEpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNf dGJsXzEnLCAncmxzX3A2JywgJ3ByZXR0eScsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQ T0xJQ1kgcmxzX3A2IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEgRk9SIFVQREFURSBV U0lORyAoKGNpZCAlIDIpID0gMCk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCAncHJldHR5JywgJ2ZhbHNlJyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFBPTElDWSBybHNfcDcgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBGT1IgREVMRVRF IFVTSU5HIChjaWQgPCA4KTsKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOCcsICdwcmV0dHknLCAnZmFsc2UnKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDgg T04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBUTyByZWdyZXNzX3Jsc19kYXZlLCByZWdy ZXNzX3Jsc19hbGljZSBVU0lORyB0cnVlOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A5JywgJ3ByZXR0eScsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19n ZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3A5IE9OIHJlZ3Jlc3Nf cmxzX3NjaGVtYS5ybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVD SyAoY2lkID0gKCBTRUxFQ1QgcmxzX3RibF8yLnNlY2x2KworICAgIEZST00gcmxzX3RibF8yKSk7 CisoMSByb3cpCisKKy0tIFdpdGggcHJldHR5IGZvcm1hdHRpbmcKK1xwc2V0IGZvcm1hdCB1bmFs aWduZWQKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDEnLCAncHJldHR5JywgJ3RydWUnKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZ IHJsc19wMSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgVVNJTkcgKGRsZXZl bCA8PSAoKCBTRUxFQ1QgcmxzX3RibF8yLnNlY2x2CisgICBGUk9NIHJsc190YmxfMgorICBXSEVS RSBybHNfdGJsXzIucGd1c2VyID0gQ1VSUkVOVF9VU0VSKSkpOworKDEgcm93KQorU0VMRUNUICog RlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMicsICdwcmV0dHknLCAn dHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AyIE9OIHJlZ3Jl c3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBBUyBSRVNUUklDVElWRQorICAgIFVTSU5HIChj aWQgPD4gNDQgQU5EIGNpZCA8IDUwKTsKKygxIHJvdykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLCAncHJldHR5JywgJ3RydWUnKTsKK3BnX2dl dF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiByZWdyZXNzX3Jsc19zY2hlbWEu cmxzX3RibF8xCisgICAgVVNJTkcgKGRhdXRob3IgPSBDVVJSRU5UX1VTRVIpOworKDEgcm93KQor U0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNCcsICdw cmV0dHknLCAndHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3A0 IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBGT1IgU0VMRUNUCisgICAgVVNJ TkcgKChjaWQgJSAyKSA9IDApOworKDEgcm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNScsICdwcmV0dHknLCAndHJ1ZScpOworcGdfZ2V0X3Bv bGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3A1IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNf dGJsXzEKKyAgICBGT1IgSU5TRVJUCisgICAgV0lUSCBDSEVDSyAoKGNpZCAlIDIpID0gMSk7Ciso MSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxz X3A2JywgJ3ByZXR0eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElD WSBybHNfcDYgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIEZPUiBVUERBVEUK KyAgICBVU0lORyAoKGNpZCAlIDIpID0gMCk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A3JywgJ3ByZXR0eScsICd0cnVlJyk7Citw Z19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDcgT04gcmVncmVzc19ybHNfc2No ZW1hLnJsc190YmxfMQorICAgIEZPUiBERUxFVEUKKyAgICBVU0lORyAoY2lkIDwgOCk7CisoMSBy b3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A4 JywgJ3ByZXR0eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBy bHNfcDggT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIFRPIHJlZ3Jlc3Nfcmxz X2RhdmUsIHJlZ3Jlc3NfcmxzX2FsaWNlCisgICAgVVNJTkcgKHRydWUpOworKDEgcm93KQorU0VM RUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOScsICdwcmV0 dHknLCAndHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3A5IE9O IHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBUTyByZWdyZXNzX3Jsc19leGVtcHRf dXNlcgorICAgIFdJVEggQ0hFQ0sgKGNpZCA9ICgoIFNFTEVDVCBybHNfdGJsXzIuc2VjbHYKKyAg IEZST00gcmxzX3RibF8yKSkpOworKDEgcm93KQorXHBzZXQgZm9ybWF0IGFsaWduZWQKKy0tIENs ZWFuIHVwIG9iamVjdHMgY3JlYXRlZCBmb3IgdGVzdGluZyBwZ19nZXRfcG9saWN5X2RkbCBmdW5j dGlvbi4KK0RST1AgUE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNf cDIgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AzIE9OIHJsc190YmxfMTsKK0RST1Ag UE9MSUNZIHJsc19wNCBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDUgT04gcmxzX3Ri bF8xOworRFJPUCBQT0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19w NyBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDggT04gcmxzX3RibF8xOworRFJPUCBQ T0xJQ1kgcmxzX3A5IE9OIHJsc190YmxfMTsKK0RST1AgVEFCTEUgcmxzX3RibF8xOworRFJPUCBU QUJMRSBybHNfdGJsXzI7CistLQogLS0gQ2xlYW4gdXAgb2JqZWN0cwogLS0KIFJFU0VUIFNFU1NJ T04gQVVUSE9SSVpBVElPTjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jvd3Nl Y3VyaXR5LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jvd3NlY3VyaXR5LnNxbAppbmRleCA2 YjM1NjYyNzFkZi4uYWNhNjEwMmRlNzEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L3Jvd3NlY3VyaXR5LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5z cWwKQEAgLTI1OTgsNiArMjU5OCw5MyBAQCByZXNldCBybHNfdGVzdC5ibGFoOwogZHJvcCBmdW5j dGlvbiBybHNfZih0ZXh0KTsKIGRyb3AgdGFibGUgcmxzX3QsIHRlc3RfdDsKIAorLS0KKy0tIFRl c3QgZm9yIHBnX2dldF9wb2xpY3lfZGRsKHRhYmxlLCBwb2xpY3lfbmFtZSwgVkFSSUFESUMgb3B0 aW9ucykgZnVuY3Rpb24uCistLQorQ1JFQVRFIFRBQkxFIHJsc190YmxfMSAoCisgICAgZGlkICAg ICAgICAgaW50IHByaW1hcnkga2V5LAorICAgIGNpZCAgICAgICAgIGludCwKKyAgICBkbGV2ZWwg ICAgICBpbnQgbm90IG51bGwsCisgICAgZGF1dGhvciAgICAgbmFtZSwKKyAgICBkdGl0bGUgICAg ICB0ZXh0CispOworR1JBTlQgQUxMIE9OIHJsc190YmxfMSBUTyBwdWJsaWM7CitDUkVBVEUgVEFC TEUgcmxzX3RibF8yICgKKyAgICBwZ3VzZXIgICAgICBuYW1lIHByaW1hcnkga2V5LAorICAgIHNl Y2x2ICAgICAgIGludAorKTsKK0dSQU5UIFNFTEVDVCBPTiBybHNfdGJsXzIgVE8gcHVibGljOwor CistLSBUZXN0IFBFUk1JU1NJVkUgYW5kIFJFU1RSSUNUSVZFCitDUkVBVEUgUE9MSUNZIHJsc19w MSBPTiBybHNfdGJsXzEgQVMgUEVSTUlTU0lWRQorICAgIFVTSU5HIChkbGV2ZWwgPD0gKFNFTEVD VCBzZWNsdiBGUk9NIHJsc190YmxfMiBXSEVSRSBwZ3VzZXIgPSBjdXJyZW50X3VzZXIpKTsKK0NS RUFURSBQT0xJQ1kgcmxzX3AyIE9OIHJsc190YmxfMSBBUyBSRVNUUklDVElWRSBVU0lORyAoY2lk IDw+IDQ0IEFORCBjaWQgPCA1MCk7CisKKy0tIFRlc3QgRk9SIEFMTCB8IFNFTEVDVCB8IElOU0VS VCB8IFVQREFURSB8IERFTEVURQorQ1JFQVRFIFBPTElDWSBybHNfcDMgT04gcmxzX3RibF8xIEZP UiBBTEwgVVNJTkcgKGRhdXRob3IgPSBjdXJyZW50X3VzZXIpOworQ1JFQVRFIFBPTElDWSBybHNf cDQgT04gcmxzX3RibF8xIEZPUiBTRUxFQ1QgVVNJTkcgKGNpZCAlIDIgPSAwKTsKK0NSRUFURSBQ T0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMSBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKGNpZCAlIDIg PSAxKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMSBGT1IgVVBEQVRFIFVTSU5H IChjaWQgJSAyID0gMCk7CitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiBybHNfdGJsXzEgRk9SIERF TEVURSBVU0lORyAoY2lkIDwgOCk7CisKKy0tIFRlc3QgVE8geyByb2xlX25hbWUgLi4uIH0KK0NS RUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMSBUTyByZWdyZXNzX3Jsc19kYXZlLCByZWdy ZXNzX3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CitDUkVBVEUgUE9MSUNZIHJsc19wOSBPTiBybHNf dGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVDSyAoY2lkID0gKFNFTEVD VCBzZWNsdiBGUk9NIHJsc190YmxfMikpOworCistLSBOVUxMIGlucHV0cyBzaG91bGQgcmV0dXJu IG5vIHJvd3MKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsICdy bHNfcDEnKTsKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJs XzEnLCBOVUxMKTsKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEws IE5VTEwpOworCistLSBUYWJsZSBkb2VzIG5vdCBleGlzdAorU0VMRUNUICogRlJPTSBwZ19nZXRf cG9saWN5X2RkbCgnbm9uZXhpc3RlbnRfdGJsJywgJ3Jsc19wMScpOworLS0gUG9saWN5IGRvZXMg bm90IGV4aXN0CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAn bm9uZXhpc3RlbnRfcG9sJyk7CisKKy0tIEludmFsaWQgb3B0aW9uIG5hbWUKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLCAnYmFkb3B0JywgJ3Ry dWUnKTsKKy0tIEludmFsaWQgYm9vbGVhbiB2YWx1ZSBmb3Igb3B0aW9uCitTRUxFQ1QgKiBGUk9N IHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywgJ3ByZXR0eScsICdtYXli ZScpOworLS0gRHVwbGljYXRlIG9wdGlvbgorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2Rk bCgncmxzX3RibF8xJywgJ3Jsc19wMScsICdwcmV0dHknLCAndHJ1ZScsICdwcmV0dHknLCAnZmFs c2UnKTsKKworLS0gV2l0aG91dCBwcmV0dHkgZm9ybWF0dGluZyAoZGVmYXVsdCkKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDInKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQnKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDUnKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDYnLCAncHJldHR5Jywg J2ZhbHNlJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAn cmxzX3A3JywgJ3ByZXR0eScsICdmYWxzZScpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOCcsICdwcmV0dHknLCAnZmFsc2UnKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDknLCAncHJldHR5Jywg J2ZhbHNlJyk7CisKKy0tIFdpdGggcHJldHR5IGZvcm1hdHRpbmcKK1xwc2V0IGZvcm1hdCB1bmFs aWduZWQKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDEnLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwo J3Jsc190YmxfMScsICdybHNfcDInLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLCAncHJldHR5JywgJ3RydWUn KTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQn LCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Js c190YmxfMScsICdybHNfcDUnLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDYnLCAncHJldHR5JywgJ3RydWUnKTsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCAn cHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190 YmxfMScsICdybHNfcDgnLCAncHJldHR5JywgJ3RydWUnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDknLCAncHJldHR5JywgJ3RydWUnKTsKK1xw c2V0IGZvcm1hdCBhbGlnbmVkCisKKy0tIENsZWFuIHVwIG9iamVjdHMgY3JlYXRlZCBmb3IgdGVz dGluZyBwZ19nZXRfcG9saWN5X2RkbCBmdW5jdGlvbi4KK0RST1AgUE9MSUNZIHJsc19wMSBPTiBy bHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDIgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kg cmxzX3AzIE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNCBPTiBybHNfdGJsXzE7CitE Uk9QIFBPTElDWSBybHNfcDUgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A2IE9OIHJs c190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNyBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBy bHNfcDggT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A5IE9OIHJsc190YmxfMTsKK0RS T1AgVEFCTEUgcmxzX3RibF8xOworRFJPUCBUQUJMRSBybHNfdGJsXzI7CisKIC0tCiAtLSBDbGVh biB1cCBvYmplY3RzCiAtLQotLSAKMi41MS4wCgo= --00000000000049955f06529f2da0--