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 1wWYBx-002h9o-2e for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Jun 2026 11:30:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wWYBw-00282n-2R for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Jun 2026 11:30:52 +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 1wWYBv-00282S-2t for pgsql-hackers@lists.postgresql.org; Mon, 08 Jun 2026 11:30:52 +0000 Received: from mail-ej1-x633.google.com ([2a00:1450:4864:20::633]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wWYBt-00000001g4y-0kOD for pgsql-hackers@postgresql.org; Mon, 08 Jun 2026 11:30:50 +0000 Received: by mail-ej1-x633.google.com with SMTP id a640c23a62f3a-bec450b950dso582738666b.2 for ; Mon, 08 Jun 2026 04:30:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780918247; cv=none; d=google.com; s=arc-20240605; b=Uj4AAOidEGhcKuW7qfZk7XtUFjJPY4uTkIRaoHFeEFOd92yVLU7fEvrYl458/H6pTc o7iTMQ1DDczGpVCfAAvr8gvMkjnzXvwMhE3kKi9zjbsradqkyFW9KvnoBAC/WM0N+HKa 70k5iR2NMGDQclbdoLXpxu4VBKJ8semQJyw2PwDq7Vm2NbRQGBIBJ+rnmuJkeVNpvvGT 0pu0/hht211HslhYdF9lLaqSAW3r2kGnV6xZ5e5j1dnlbONZBGebP5KPI2BE6YO4Qhvj UAVBTjhYzDhI7Hs8CirudiluZl8Qoe6MckFu+BLA7UYG3U6Dx68s55eyRIcSK+eMyZm7 cSgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=vQDR/6RUv8nBlJShZfNL8rOsUJkPg+VOfKr6H2Cw13E=; fh=RfrkJab44jNT7RraF/sJO97r9/nkUL0AAgzmC7PBS2w=; b=fTimhnx90NPfvG4hja/xcnYpUFpKmNHseZFx86LAmSy0hYj+xmeEjJVIy3XRkAjgJt rp3cjfwrphxIbd4BecHgTb9lKoG8cb/O+ye7qCJZFpH3VMHrv1WaQHE5sx37od22HJX0 IWSRv8DbVJ0cQT3fBYxL7YKHL4Xt3cLZqKZIeejU1C7sa7W+OfYWP475kL76PTmHShnR HSF5t+y3XcGqnmuZJ8vwiczmL5knhMVYZupSh6fUqn1w768wmVaiFcFvPl+KnZ1Um91Q MQufQLcab/eEzz6DmTLTehjh8JNFr1aJfz+t358KTDyKr2wFvOU7Pyl8eEJ59gm8gzua FMSQ==; 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=1780918247; x=1781523047; darn=postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=vQDR/6RUv8nBlJShZfNL8rOsUJkPg+VOfKr6H2Cw13E=; b=X/f7bpPoQ5nMpewEeyM2q2wuN/VIJa8AHaQ/JKlA4rdTQ3GbUO5TSRfyzIrJi6U2HN B7GIPRPlhiQSSTUUjZ2N97uZW0jrxb02RcjQJkaT8cWjkZhJDhiorGnLs4VBHFIRSXRA QDYhv+HGjTxMAO0fpj/16r2Z+HfTnStAkDH2+QTr1/RcDJQqNwhLwlCdSzMXW/46ENdr Yxq/VD8rKmgyCDtg4y5PtZlLwS3aPIzoHA8b5jxITpTB4lXynT5pwfi62xtddw9eBd4V TCUgyWi5RBR4cxrzfnKMgGomMdrEOfQWBc1MPBktwrC5jivVYEsk62Cfjqm9Dk7WLKMa UgBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780918247; x=1781523047; h=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=vQDR/6RUv8nBlJShZfNL8rOsUJkPg+VOfKr6H2Cw13E=; b=dnFfLzSYZUAlY+rQ9cyryMlVzfznc9R7ZeUdUhiwOR8Eyz6UJQ1+dNH2E+YQA2aNyH xpK9C0dDWuzAq2Bvyr+beRCioUiy9IZjpjocw9ZABwlUK7J88JodevjbBabMTjhezRCQ KjzJW2YGBbfDbTofWuiKydnW2XY7kF2IFXaxmjqjXK50Dskk/+mQcf5c51EwG3IWPkyY fOqoXYac5nWukPQM/+Er/ExtprfuL/cyFs8kzhfw+DjnmfZUOb23+bKwkvMKN2+JB9xu Ebbk7hCCD0dg2Ipsuoh4X9p2ysjtRTL2EGULSda3wdkCUimbGEpi4wkWsMdcJGzj4/Ux vvBA== X-Gm-Message-State: AOJu0YxH2+LY8vH5UQUaYZTzDGYmKizbLzJxLN52SFIEQM5pQQXpzlPK EtKQX4fjPFIIH19w71JCFcmL7HbbHbtwkwqGP+Sbu99NyymFOKgdS2KIYHfULO9tsYYIWffCsqR zm1eHR2rWreGkTI0+6jlGd8HioGysS9uRBxKr0FSwonNBo/LVnLq/wQ== X-Gm-Gg: Acq92OGzzFv1jChvIKSUcs/3wZnpe90wvQAV3kobX7ppNZ9RonOD+xDb5Ceb4kqzoco mvHKAL842XL1IghBXVqV7D4jJp6znOj7h0NUAvFi6fjTmUcrAAvNNfJNcMajt9p1WUer+O43XDG WdIq5AtcB124laWHTVuGSdxaUZ0Rp8BIUxV6hA9IMXrw6iBy59WX1mB6Cg2MjS5N+8CsV4bs6gh JiRfs0ck3puAUDXFCxvDYa1ZBvk4S6hBi9FmF5qLy91ke35ZWNOlxceiBjd/gAknY/iQmfpK/7e YowJf5/bUEZno8ifYzs= X-Received: by 2002:a17:907:75f2:b0:bec:2ad0:cba5 with SMTP id a640c23a62f3a-bf372159cbemr414250366b.29.1780918246492; Mon, 08 Jun 2026 04:30:46 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Akshay Joshi Date: Mon, 8 Jun 2026 17:00:32 +0530 X-Gm-Features: AVVi8CcyIPrBnyxotbvlhJMoQ26qvkh8w53tr9lmMt9-FlnJuc7ePo0HkF-r3Pg Message-ID: Subject: Re: [PATCH] Add pg_get_table_ddl() to reconstruct CREATE TABLE statements To: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000752c840653bc57a2" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000752c840653bc57a2 Content-Type: multipart/alternative; boundary="000000000000752c810653bc57a0" --000000000000752c810653bc57a0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Hackers, Attached is the v2 patch, which fixes the Meson build failure, and the rebased patch. On Wed, Jun 3, 2026 at 6:28=E2=80=AFPM Akshay Joshi wrote: > Hackers, > > Attached is a patch adding pg_get_table_ddl(regclass, VARIADIC text[]), > extending the existing pg_get_database/role/tablespace_ddl family. > relations. It returns the CREATE TABLE statement plus the follow-up ALTER > TABLE, CREATE INDEX, CREATE RULE, and CREATE STATISTICS statements needed > for a full reconstruction, one per row. > > *Coverage* > -------- > *Per-column:* typmod, COLLATE, STORAGE, COMPRESSION (pglz/lz4), GENERATED > STORED/VIRTUAL, IDENTITY ALWAYS/BY DEFAULT (with non-default sequence > options), DEFAULT, NOT NULL, attoptions. > > *Table-level:* UNLOGGED, INHERITS, PARTITION BY (RANGE/LIST/HASH), > PARTITION OF ... FOR VALUES, USING access method, WITH (reloptions), > TABLESPACE, inline CHECK. > > *Sub-objects:* Indexes, Constraints (PK/UNIQUE/FK/EXCLUDE/named NOT > NULL), Rules, extended statistics, REPLICA IDENTITY, ENABLE/FORCE RLS, an= d > child-local DEFAULT overrides. > *Triggers and policies are TODOs pending pg_get_trigger_ddl (Phil's > re-roll) and pg_get_policy_ddl (Waiting for review/commit)*. > > Options (pretty, owner, tablespace, and a family of *includes_** toggles > for each sub-object class) let callers fine-tune the output. Every clause > is omitted when its value equals what the system would reapply on > round-trip same default-omission convention as the existing _ddl function= s. > > I deliberately did *not* add pg_get_index_ddl / _constraint_ddl / > _rule_ddl / _stat_ddl wrappers. The existing C helpers in ruleutils.c > (pg_get_indexdef_string, pg_get_constraintdef_command, etc.) already emit > reproducible statements, so pg_get_table_ddl_internal calls them directly= . > Happy to revisit if reviewers prefer separate SQL-level surfaces. > > *Testing: * > pg_regress test at src/test/regress/sql/pg_get_table_ddl.sql covering the > matrix above plus error paths. I kept it as pg_regress rather than TAP > (where the sibling _ddl tests live) since exact-.out diffs are the more > rigorous check for a deparse function, and the pg_regress restriction tha= t > drove the TAP choice for CREATE DATABASE/TABLESPACE doesn't apply to > tables. A manual round-trip across IDENTITY/GENERATED/ > STORAGE/COMPRESSION/PK produces an empty EXCEPT diff against the original= . > > *Out of scope:* COMMENT ON, GRANT/REVOKE (matching the existing _ddl > family), and typed tables (CREATE TABLE name OF type). > > Feedback is welcome, particularly on the option naming and the decision t= o > reuse the C helpers directly rather than add new SQL wrappers. > > ----- > Regards, > Akshay Joshi > Principal Engineer | Engineering Manager | pgAdmin Hacker > EDB (EnterpriseDB) > > --000000000000752c810653bc57a0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Hackers,

Attached is the v2 patch, which fixes t= he Meson build failure, and the rebased patch.

On Wed, Jun 3, 2026 at 6:28= =E2=80=AFPM Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
=
Hac= kers,

Attached is a patch adding pg_get_table_ddl(regclass, VARIADIC= text[]), extending the existing pg_get_database/role/tablespace_ddl family= . relations. It returns the CREATE TABLE statement plus the follow-up ALTER= TABLE, CREATE INDEX, CREATE RULE, and CREATE STATISTICS statements needed = for a full reconstruction, one per row.

Coverage
--------<= br>Per-column: typmod, COLLATE, STORAGE, COMPRESSION (pglz/lz4), GEN= ERATED STORED/VIRTUAL, IDENTITY ALWAYS/BY DEFAULT (with non-default sequenc= e options), DEFAULT, NOT NULL, attoptions.

Tabl= e-level: UNLOGGED, INHERITS, PARTITION BY (RANGE/LIST/HASH), PARTITION = OF ... FOR VALUES, USING access method, WITH (reloptions), TABLESPACE, inli= ne CHECK.

Sub-objects:=C2=A0Indexes, Constraints (PK/UNIQUE/F= K/EXCLUDE/named NOT NULL), Rules, extended statistics, REPLICA IDENTITY, EN= ABLE/FORCE RLS, and child-local DEFAULT overrides.
Triggers and polic= ies are TODOs pending pg_get_trigger_ddl (Phil's re-roll) and pg_get_po= licy_ddl (Waiting for review/commit).

Options (pretty, owner, ta= blespace, and a family of includes_* toggles for each sub-object cla= ss) let callers fine-tune the output. Every clause is omitted when its valu= e equals what the system would reapply on round-trip same default-omission = convention as the existing _ddl functions.

I deliberately did *not* = add pg_get_index_ddl / _constraint_ddl / _rule_ddl / _stat_ddl wrappers. Th= e existing C helpers in ruleutils.c (pg_get_indexdef_string, pg_get_constra= intdef_command, etc.) already emit reproducible statements, so pg_get_table= _ddl_internal calls them directly. Happy to revisit if reviewers prefer sep= arate SQL-level surfaces.

Testing:=C2=A0
pg_regress test a= t src/test/regress/sql/pg_get_table_ddl.sql covering the matrix above plus = error paths. I kept it as pg_regress rather than TAP (where the sibling _dd= l tests live) since exact-.out diffs are the more rigorous check for a depa= rse function, and the pg_regress restriction that drove the TAP choice for = CREATE DATABASE/TABLESPACE doesn't apply to tables. A manual round-trip= across IDENTITY/GENERATED/ STORAGE/COMPRESSION/PK produces an empty EXCEPT= diff against the original.

Out of scope: COMMENT ON, GRANT/R= EVOKE (matching the existing _ddl family), and typed tables (CREATE TABLE n= ame OF type).

Feedback is welcome, particularly on the option naming= and the decision to reuse the C helpers directly rather than add new SQL w= rappers.

-----
Regards,
Akshay Joshi
Principal Engineer | Engineering= Manager | pgAdmin Hacker
EDB (EnterpriseDB)

=
--000000000000752c810653bc57a0-- --000000000000752c840653bc57a2 Content-Type: application/octet-stream; name="v2-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Disposition: attachment; filename="v2-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mq54phos0 RnJvbSA2ZmU4ZmM0Zjc2NGNhYzcxOGIzMGUwYWViODljOTAyOTRlYmNjM2MxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBUdWUsIDIgSnVuIDIwMjYgMTQ6MTg6NDAgKzA1MzAKU3ViamVjdDogW1BB VENIIHYyXSBBZGQgcGdfZ2V0X3RhYmxlX2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBUQUJM RQogc3RhdGVtZW50cwoKVGhlIGZ1bmN0aW9uIHJlY29uc3RydWN0cyB0aGUgQ1JFQVRFIFRBQkxF IHN0YXRlbWVudCBmb3IgYW4gb3JkaW5hcnkgb3IKcGFydGl0aW9uZWQgdGFibGUsIGZvbGxvd2Vk IGJ5IHRoZSBBTFRFUiBUQUJMRSAvIENSRUFURSBJTkRFWCAvCkNSRUFURSBSVUxFIC8gQ1JFQVRF IFNUQVRJU1RJQ1Mgc3RhdGVtZW50cyBuZWVkZWQgdG8gcmVzdG9yZSBpdHMgZnVsbApkZWZpbml0 aW9uLiAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSByb3cuCgpTdXBw b3J0ZWQgcGVyLWNvbHVtbiBmZWF0dXJlczogZGF0YSB0eXBlIHdpdGggdHlwZSBtb2RpZmllcnMs IENPTExBVEUsClNUT1JBR0UsIENPTVBSRVNTSU9OIChwZ2x6IC8gbHo0KSwgR0VORVJBVEVEIEFM V0FZUyBBUyAoZXhwcikKU1RPUkVEL1ZJUlRVQUwsIEdFTkVSQVRFRCBBTFdBWVN8QlkgREVGQVVM VCBBUyBJREVOVElUWSAod2l0aCBzZXF1ZW5jZQpvcHRpb25zKSwgREVGQVVMVCwgTk9UIE5VTEws IGFuZCBwZXItY29sdW1uIGF0dG9wdGlvbnMgZW1pdHRlZCBhcwpBTFRFUiBDT0xVTU4gU0VUICgu Li4pLgoKU3VwcG9ydGVkIHRhYmxlLWxldmVsIGZlYXR1cmVzOiBVTkxPR0dFRCwgSU5IRVJJVFMs IFBBUlRJVElPTiBCWSAoUkFOR0UKLyBMSVNUIC8gSEFTSCBwYXJlbnRzKSwgUEFSVElUSU9OIE9G IHBhcmVudCBGT1IgVkFMVUVTIChGUk9NL1RPLCBXSVRICm1vZHVsdXMvcmVtYWluZGVyLCBERUZB VUxUKSwgVVNJTkcgdGFibGUgYWNjZXNzIG1ldGhvZCwgV0lUSAoocmVsb3B0aW9ucyksIFRBQkxF U1BBQ0UsIGFuZCBpbmxpbmUgQ0hFQ0sgY29uc3RyYWludHMgaW4gdGhlCkNSRUFURSBUQUJMRSBi b2R5LgoKU3VwcG9ydGVkIHN1Yi1vYmplY3RzIChyZS11c2luZyBleGlzdGluZyBkZXBhcnNlIGhl bHBlcnMgZnJvbQpydWxldXRpbHMuYyk6IGluZGV4ZXMgdmlhIHBnX2dldF9pbmRleGRlZl9zdHJp bmcsIGNvbnN0cmFpbnRzCihQUklNQVJZIEtFWSwgVU5JUVVFLCBGT1JFSUdOIEtFWSwgRVhDTFVE RSwgbmFtZWQgTk9UIE5VTEwpIHZpYQpwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBydWxl cyB2aWEgcGdfZ2V0X3J1bGVkZWYsIGV4dGVuZGVkCnN0YXRpc3RpY3MgdmlhIHBnX2dldF9zdGF0 aXN0aWNzb2JqZGVmX3N0cmluZywgUkVQTElDQSBJREVOVElUWQpOT1RISU5HL0ZVTEwvVVNJTkcg SU5ERVgsIEFMVEVSIFRBQkxFIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFksCmFuZCBj aGlsZC1sb2NhbCBERUZBVUxUIG92ZXJyaWRlcyBvbiBpbmhlcml0YW5jZS9wYXJ0aXRpb24gY2hp bGRyZW4uCgpEZWZhdWx0IG9taXNzaW9uIGNvbnZlbnRpb246IGV2ZXJ5IG9wdGlvbmFsIGNsYXVz ZSBpcyBkcm9wcGVkIHdoZW4gaXRzCnZhbHVlIGVxdWFscyB3aGF0IHRoZSBzeXN0ZW0gd291bGQg cmVhcHBseSBvbiByb3VuZC10cmlwLCBpbmNsdWRpbmcKdHlwZS1kZWZhdWx0IENPTExBVEUsIHBl ci10eXBlIFNUT1JBR0UsIHRoZSBhdXRvLWdlbmVyYXRlZCBpZGVudGl0eQpzZXF1ZW5jZSBuYW1l IGFuZCBwYXJhbWV0ZXIgZGVmYXVsdHMsIGhlYXAgYWNjZXNzIG1ldGhvZCwgZGVmYXVsdApSRVBM SUNBIElERU5USVRZLCBkaXNhYmxlZCBSTFMgdG9nZ2xlcywgZW1wdHkgcmVsb3B0aW9ucywgYW5k IHRoZQpkZWZhdWx0IHRhYmxlc3BhY2UuCgpBIHJlZ3Jlc3Npb24gdGVzdCB1bmRlciBzcmMvdGVz dC9yZWdyZXNzIGNvdmVycyBvcmRpbmFyeSB0YWJsZXMsCmlkZW50aXR5IChkZWZhdWx0IGFuZCBj dXN0b20gc2VxdWVuY2Ugb3B0aW9ucyksIGdlbmVyYXRlZCBjb2x1bW5zLApTVE9SQUdFL0NPTVBS RVNTSU9OLCBjb25zdHJhaW50cyAoQ0hFQ0svVU5JUVVFL0ZLIHdpdGggZGVmZXJyYWJsZSksCmZ1 bmN0aW9uYWwgYW5kIHBhcnRpYWwgaW5kZXhlcywgaW5oZXJpdGFuY2UgYW5kIHBhcnRpdGlvbmlu ZywKcGFydGl0aW9uIGNoaWxkcmVuIHdpdGggRk9SIFZBTFVFUyBGUk9NL1RPLCBXSVRIIG1vZHVs dXMvcmVtYWluZGVyLCBhbmQKREVGQVVMVCwgcnVsZXMsIGV4dGVuZGVkIHN0YXRpc3RpY3MsIFJM UyB0b2dnbGVzLCBSRVBMSUNBIElERU5USVRZLApVTkxPR0dFRCB3aXRoIHJlbG9wdGlvbnMsIHBl ci1jb2x1bW4gYXR0b3B0aW9ucywgY2hpbGQgREVGQVVMVApvdmVycmlkZXMsIHByZXR0eSBtb2Rl LCBvd25lcj1mYWxzZSwgYW5kIHRoZSBlcnJvciBwYXRocyBmb3Igdmlld3MsCnNlcXVlbmNlcywg TlVMTCwgdW5rbm93biBvcHRpb25zLCBhbmQgb2RkLXZhcmlhZGljIGFyZ3VtZW50IGNvdW50cy4K CkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9zaGlAZW50ZXJwcmlzZWRiLmNvbT4KLS0t CiBkb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbCAgICAgICAgICAgICAgfCAgIDYxICsK IHNyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jICAgICAgICAgICAgICB8ICAgMjcgKwog c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMgICAgICAgICAgICAgIHwgMTMyNSArKysr KysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAg ICAgIHwgICAgNyArCiBzcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaCAgICAgICAgICAg ICAgfCAgICAxICsKIC4uLi9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0ICAg ICB8ICA0OTggKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICAg ICAgICAgIHwgICAgMiArLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5z cWwgICAgIHwgIDI3OCArKysrCiA4IGZpbGVzIGNoYW5nZWQsIDIxOTggaW5zZXJ0aW9ucygrKSwg MSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdy ZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRsLnNxbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9m dW5jL2Z1bmMtaW5mby5zZ21sIGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKaW5k ZXggMDBmNjRmNTBjZWIuLjQ4ZTk4NzIwOGQ1IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVu Yy9mdW5jLWluZm8uc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbApA QCAtMzk2MSw2ICszOTYxLDY3IEBAIGFjbCAgICAgIHwge3Bvc3RncmVzPWFyd2REeHRtL3Bvc3Rn cmVzLGZvbz1yL3Bvc3RncmVzfQogICAgICAgICA8bGl0ZXJhbD5UQUJMRVNQQUNFPC9saXRlcmFs Pi4KICAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKyAg ICAgICA8ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWdu YXR1cmUiPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+cGdfZ2V0X3Rh YmxlX2RkbDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlv bj5wZ19nZXRfdGFibGVfZGRsPC9mdW5jdGlvbj4KKyAgICAgICAgKCA8cGFyYW1ldGVyPnRhYmxl PC9wYXJhbWV0ZXI+IDx0eXBlPnJlZ2NsYXNzPC90eXBlPgorICAgICAgICA8b3B0aW9uYWw+LCA8 bGl0ZXJhbD5WQVJJQURJQzwvbGl0ZXJhbD4gPHBhcmFtZXRlcj5vcHRpb25zPC9wYXJhbWV0ZXI+ CisgICAgICAgIDx0eXBlPnRleHQ8L3R5cGU+IDwvb3B0aW9uYWw+ICkKKyAgICAgICAgPHJldHVy bnZhbHVlPnNldG9mIHRleHQ8L3JldHVybnZhbHVlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8 cGFyYT4KKyAgICAgICAgUmVjb25zdHJ1Y3RzIHRoZSA8Y29tbWFuZD5DUkVBVEUgVEFCTEU8L2Nv bW1hbmQ+IHN0YXRlbWVudCBmb3IgdGhlCisgICAgICAgIHNwZWNpZmllZCBvcmRpbmFyeSBvciBw YXJ0aXRpb25lZCB0YWJsZSwgZm9sbG93ZWQgYnkgdGhlCisgICAgICAgIDxjb21tYW5kPkFMVEVS IFRBQkxFPC9jb21tYW5kPiwgPGNvbW1hbmQ+Q1JFQVRFIElOREVYPC9jb21tYW5kPiwKKyAgICAg ICAgPGNvbW1hbmQ+Q1JFQVRFIFJVTEU8L2NvbW1hbmQ+LCBhbmQgPGNvbW1hbmQ+Q1JFQVRFIFNU QVRJU1RJQ1M8L2NvbW1hbmQ+CisgICAgICAgIHN0YXRlbWVudHMgbmVlZGVkIHRvIHJlY3JlYXRl IHRoZSB0YWJsZSdzIGNvbHVtbnMsIGNvbnN0cmFpbnRzLAorICAgICAgICBpbmRleGVzLCBydWxl cywgZXh0ZW5kZWQgc3RhdGlzdGljcywgYW5kIHJvdy1sZXZlbCBzZWN1cml0eSBmbGFncy4KKyAg ICAgICAgSW5oZXJpdGVkIGNvbHVtbnMgYW5kIGNvbnN0cmFpbnRzIGFyZSBlbWl0dGVkIGJ5IHRo ZSBwYXJlbnQgdGFibGUncworICAgICAgICBEREwgYW5kIGFyZSBub3QgZHVwbGljYXRlZCBvbiBp bmhlcml0YW5jZSBjaGlsZHJlbiBvciBwYXJ0aXRpb25zLgorICAgICAgICBFYWNoIHN0YXRlbWVu dCBpcyByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIHJvdy4KKyAgICAgICAgVGhlIGZvbGxvd2luZyBv cHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgIDxsaXRlcmFsPnByZXR0eTwvbGl0ZXJhbD4g KGJvb2xlYW4pIGZvciBmb3JtYXR0ZWQgb3V0cHV0LAorICAgICAgICA8bGl0ZXJhbD5vd25lcjwv bGl0ZXJhbD4gKGJvb2xlYW4pIHRvIGluY2x1ZGUgdGhlCisgICAgICAgIDxjb21tYW5kPkFMVEVS IFRBQkxFIC4uLiBPV05FUiBUTzwvY29tbWFuZD4gc3RhdGVtZW50LAorICAgICAgICA8bGl0ZXJh bD50YWJsZXNwYWNlPC9saXRlcmFsPiAoYm9vbGVhbikgdG8gaW5jbHVkZSB0aGUKKyAgICAgICAg PGxpdGVyYWw+VEFCTEVTUEFDRTwvbGl0ZXJhbD4gY2xhdXNlIG9uIHRoZQorICAgICAgICA8Y29t bWFuZD5DUkVBVEUgVEFCTEU8L2NvbW1hbmQ+IHN0YXRlbWVudCwgYW5kIGEgZmFtaWx5IG9mCisg ICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzXzxyZXBsYWNlYWJsZT5jYXRlZ29yeTwvcmVwbGFjZWFi bGU+PC9saXRlcmFsPgorICAgICAgICBib29sZWFucyB0aGF0IGdhdGUgZW1pc3Npb24gb2Ygb3B0 aW9uYWwgc3ViLW9iamVjdHM6CisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX2luZGV4ZXM8L2xp dGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19jb25zdHJhaW50czwvbGl0ZXJhbD4s CisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3J1bGVzPC9saXRlcmFsPiwKKyAgICAgICAgPGxp dGVyYWw+aW5jbHVkZXNfc3RhdGlzdGljczwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmlu Y2x1ZGVzX3RyaWdnZXJzPC9saXRlcmFsPiwKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfcG9s aWNpZXM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19ybHM8L2xpdGVyYWw+ ICh0aGUKKyAgICAgICAgPGNvbW1hbmQ+RU5BQkxFPC9jb21tYW5kPi88Y29tbWFuZD5GT1JDRSBS T1cgTEVWRUwgU0VDVVJJVFk8L2NvbW1hbmQ+CisgICAgICAgIHRvZ2dsZXMpLCBhbmQKKyAgICAg ICAgPGxpdGVyYWw+aW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eTwvbGl0ZXJhbD4uICBFYWNoIG9m IHRoZXNlCisgICAgICAgIGRlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LiAgVGhl CisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3BhcnRpdGlvbjwvbGl0ZXJhbD4gb3B0aW9uLCB3 aGljaCBkZWZhdWx0cyB0bworICAgICAgICA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIGNvbnRy b2xzIHdoZXRoZXIgdGhlIERETCBmb3IgcGFydGl0aW9uCisgICAgICAgIGNoaWxkcmVuIGlzIGFw cGVuZGVkIGFmdGVyIGEgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50LgorICAgICAgIDwvcGFyYT4K KyAgICAgICA8cGFyYT4KKyAgICAgICAgQWxsIHRocmVlIGZvcm1zIG9mIDxjb21tYW5kPkNSRUFU RSBUQUJMRTwvY29tbWFuZD4gYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgdGhlIG9yZGluYXJ5IGNv bHVtbi1saXN0IGZvcm0sIHRoZSB0eXBlZC10YWJsZSBmb3JtCisgICAgICAgICg8bGl0ZXJhbD5P RiA8cmVwbGFjZWFibGU+dHlwZV9uYW1lPC9yZXBsYWNlYWJsZT48L2xpdGVyYWw+LCB3aXRoCisg ICAgICAgIHBlci1jb2x1bW4gPGxpdGVyYWw+V0lUSCBPUFRJT05TPC9saXRlcmFsPiBvdmVycmlk ZXMgZm9yIGxvY2FsCisgICAgICAgIGRlZmF1bHRzLCA8bGl0ZXJhbD5OT1QgTlVMTDwvbGl0ZXJh bD4sIGFuZCA8bGl0ZXJhbD5DSEVDSzwvbGl0ZXJhbD4KKyAgICAgICAgY29uc3RyYWludHMpLCBh bmQgdGhlIDxsaXRlcmFsPlBBUlRJVElPTiBPRjwvbGl0ZXJhbD4gZm9ybS4KKyAgICAgICAgPGxp dGVyYWw+VEVNUE9SQVJZPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+VU5MT0dHRUQ8L2xpdGVyYWw+ CisgICAgICAgIHBlcnNpc3RlbmNlIG1vZGVzIGFyZSBlbWl0dGVkIGZyb20KKyAgICAgICAgPHN0 cnVjdGZpZWxkPnJlbHBlcnNpc3RlbmNlPC9zdHJ1Y3RmaWVsZD4uICBGb3IgdGVtcG9yYXJ5IHRh YmxlcworICAgICAgICByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24sIHRoZQorICAg ICAgICA8bGl0ZXJhbD5PTiBDT01NSVQgREVMRVRFIFJPV1M8L2xpdGVyYWw+IGFuZAorICAgICAg ICA8bGl0ZXJhbD5PTiBDT01NSVQgRFJPUDwvbGl0ZXJhbD4gY2xhdXNlcyBhcmUgZW1pdHRlZDsg dGhlIGRlZmF1bHQKKyAgICAgICAgPGxpdGVyYWw+T04gQ09NTUlUIFBSRVNFUlZFIFJPV1M8L2xp dGVyYWw+IGlzIG9taXR0ZWQuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4K ICAgICAgPC90Ym9keT4KICAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3Rh YmxlY21kcy5jCmluZGV4IGExODQ1MjQwYTk4Li5iMDJkZmI0NTFmOCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv dGFibGVjbWRzLmMKQEAgLTE5NTgzLDYgKzE5NTgzLDMzIEBAIHJlbW92ZV9vbl9jb21taXRfYWN0 aW9uKE9pZCByZWxpZCkKIAl9CiB9CiAKKy8qCisgKiBMb29rIHVwIHRoZSByZWdpc3RlcmVkIE9O IENPTU1JVCBhY3Rpb24gZm9yIGEgcmVsYXRpb24uCisgKgorICogUmV0dXJucyBPTkNPTU1JVF9O T09QIHdoZW4gbm90aGluZyB3YXMgcmVnaXN0ZXJlZCwgd2hpY2ggYWxzbyBjb3ZlcnMKKyAqIHRl bXBvcmFyeSB0YWJsZXMgY3JlYXRlZCB3aXRoIHRoZSBkZWZhdWx0IE9OIENPTU1JVCBQUkVTRVJW RSBST1dTCisgKiBiZWhhdmlvciAocmVnaXN0ZXJfb25fY29tbWl0X2FjdGlvbigpIHNraXBzIHRo b3NlLCBzaW5jZSBubyBhY3Rpb24gaXMKKyAqIG5lZWRlZCBhdCBjb21taXQpLiAgRW50cmllcyBt YXJrZWQgZm9yIGRlbGV0aW9uIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiBhcmUgaWdu b3JlZC4KKyAqLworT25Db21taXRBY3Rpb24KK2dldF9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxp ZCkKK3sKKwlMaXN0Q2VsbCAgICpsOworCisJZm9yZWFjaChsLCBvbl9jb21taXRzKQorCXsKKwkJ T25Db21taXRJdGVtICpvYyA9IChPbkNvbW1pdEl0ZW0gKikgbGZpcnN0KGwpOworCisJCWlmIChv Yy0+cmVsaWQgIT0gcmVsaWQpCisJCQljb250aW51ZTsKKwkJaWYgKG9jLT5kZWxldGluZ19zdWJp ZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gb2Mt Pm9uY29tbWl0OworCX0KKwlyZXR1cm4gT05DT01NSVRfTk9PUDsKK30KKwogLyoKICAqIFBlcmZv cm0gT04gQ09NTUlUIGFjdGlvbnMuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L2RkbHV0aWxzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYwppbmRleCBm MzJmY2Q0NTNlZi4uMzc2MWY2NWUxNTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9kZGx1dGlscy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jCkBAIC0y MSwxMiArMjEsMjcgQEAKICNpbmNsdWRlICJhY2Nlc3MvZ2VuYW0uaCIKICNpbmNsdWRlICJhY2Nl c3MvaHR1cF9kZXRhaWxzLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCisjaW5jbHVkZSAi YWNjZXNzL3RvYXN0X2NvbXByZXNzaW9uLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoX21l bWJlcnMuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhpZC5oIgorI2luY2x1ZGUgImNhdGFs b2cvcGdfY2xhc3MuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2RlcGVuZGVuY3kuaCIKICNpbmNsdWRl ICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWlu dC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9n L3BnX2RiX3JvbGVfc2V0dGluZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfYW0uaCIKKyNpbmNs dWRlICJjYXRhbG9nL3BnX2luaGVyaXRzLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19wb2xpY3ku aCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3NlcXVlbmNlLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9w Z19zdGF0aXN0aWNfZXh0LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCisj aW5jbHVkZSAiY2F0YWxvZy9wZ190cmlnZ2VyLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wYXJ0aXRp b24uaCIKKyNpbmNsdWRlICJjb21tYW5kcy9kZWZyZW0uaCIKKyNpbmNsdWRlICJjb21tYW5kcy90 YWJsZWNtZHMuaCIKKyNpbmNsdWRlICJyZXdyaXRlL3ByczJsb2NrLmgiCisjaW5jbHVkZSAibm9k ZXMvbm9kZXMuaCIKICNpbmNsdWRlICJjb21tYW5kcy90YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAi Y29tbW9uL3JlbHBhdGguaCIKICNpbmNsdWRlICJmdW5jYXBpLmgiCkBAIC04Niw2ICsxMDEsMjcg QEAgc3RhdGljIExpc3QgKnBnX2dldF90YWJsZXNwYWNlX2RkbF9pbnRlcm5hbChPaWQgdHNpZCwg Ym9vbCBwcmV0dHksIGJvb2wgbm9fb3duZXIKIHN0YXRpYyBEYXR1bSBwZ19nZXRfdGFibGVzcGFj ZV9kZGxfc3JmKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLCBPaWQgdHNpZCwgYm9vbCBpc251bGwp Owogc3RhdGljIExpc3QgKnBnX2dldF9kYXRhYmFzZV9kZGxfaW50ZXJuYWwoT2lkIGRiaWQsIGJv b2wgcHJldHR5LAogCQkJCQkJCQkJCSAgYm9vbCBub19vd25lciwgYm9vbCBub190YWJsZXNwYWNl KTsKK3N0YXRpYyBMaXN0ICpwZ19nZXRfdGFibGVfZGRsX2ludGVybmFsKE9pZCByZWxpZCwgYm9v bCBwcmV0dHksCisJCQkJCQkJCQkgICBib29sIG5vX293bmVyLCBib29sIG5vX3RhYmxlc3BhY2Us CisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfaW5kZXhlcywKKwkJCQkJCQkJCSAgIGJvb2wgaW5j bHVkZV9jb25zdHJhaW50cywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9ydWxlcywKKwkJCQkJ CQkJCSAgIGJvb2wgaW5jbHVkZV9zdGF0aXN0aWNzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRl X3RyaWdnZXJzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJ ICAgYm9vbCBpbmNsdWRlX3JscywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9yZXBsaWNhX2lk ZW50aXR5LAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX3BhcnRpdGlvbik7CitzdGF0aWMgdm9p ZCBhcHBlbmRfY29sdW1uX2RlZnMoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBw cmV0dHksCisJCQkJCQkJICAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzKTsKK3N0YXRpYyB2b2lk IGFwcGVuZF90eXBlZF9jb2x1bW5fb3ZlcnJpZGVzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiBy ZWwsCisJCQkJCQkJCQkJICBib29sIHByZXR0eSwgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzKTsK K3N0YXRpYyB2b2lkIGFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMoU3RyaW5nSW5mbyBi dWYsIFJlbGF0aW9uIHJlbCwKKwkJCQkJCQkJCQkJYm9vbCBwcmV0dHksIGJvb2wgKmZpcnN0KTsK K3N0YXRpYyBjaGFyICpmaW5kX2F0dHJkZWZfdGV4dChSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIg YXR0bnVtLAorCQkJCQkJCSAgIExpc3QgKipkcGNvbnRleHQpOworc3RhdGljIGNoYXIgKmxvb2t1 cF9xdWFsaWZpZWRfcmVsbmFtZShPaWQgcmVsaWQpOworc3RhdGljIExpc3QgKmdldF9pbmhlcml0 YW5jZV9wYXJlbnRzKE9pZCByZWxpZCk7CiAKIAogLyoKQEAgLTExODUsMyArMTIyMSwxMjkyIEBA IHBnX2dldF9kYXRhYmFzZV9kZGwoUEdfRlVOQ1RJT05fQVJHUykKIAkJU1JGX1JFVFVSTl9ET05F KGZ1bmNjdHgpOwogCX0KIH0KKworLyoKKyAqIGdldF9pbmhlcml0YW5jZV9wYXJlbnRzCisgKgkJ UmV0dXJuIGEgTGlzdCBvZiBwYXJlbnQgT0lEcyBmb3IgcmVsaWQsIG9yZGVyZWQgYnkgaW5oc2Vx bm8uCisgKgorICogZmluZF9pbmhlcml0YW5jZV9jaGlsZHJlbigpIHdhbGtzIHRoZSBvcHBvc2l0 ZSBkaXJlY3Rpb24gKHBhcmVudC0+Y2hpbGRyZW4pLAorICogc28gd2Ugc2NhbiBwZ19pbmhlcml0 cyBkaXJlY3RseSBoZXJlIHVzaW5nIHRoZSAoaW5ocmVsaWQsIGluaHNlcW5vKSBpbmRleCwKKyAq IHdoaWNoIHlpZWxkcyByb3dzIGluIHRoZSBvcmRlciB0aGV5IG5lZWQgdG8gYXBwZWFyIGluIHRo ZSBJTkhFUklUUyBjbGF1c2UuCisgKiBQYXJ0aXRpb24gY2hpbGRyZW4gYWxzbyBoYXZlIGEgcGdf aW5oZXJpdHMgZW50cnksIHNvIGNhbGxlcnMgbXVzdCBza2lwIHRoZQorICogSU5IRVJJVFMgY2xh dXNlIHdoZW4gcmVsaXNwYXJ0aXRpb24gaXMgdHJ1ZS4KKyAqLworc3RhdGljIExpc3QgKgorZ2V0 X2luaGVyaXRhbmNlX3BhcmVudHMoT2lkIHJlbGlkKQoreworCVJlbGF0aW9uCWluaGVyaXRzUmVs OworCVN5c1NjYW5EZXNjIHNjYW47CisJU2NhbktleURhdGEga2V5OworCUhlYXBUdXBsZQl0dXA7 CisJTGlzdAkgICAqcGFyZW50cyA9IE5JTDsKKworCWluaGVyaXRzUmVsID0gdGFibGVfb3BlbihJ bmhlcml0c1JlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUluaXQoJmtleSwK KwkJCQlBbnVtX3BnX2luaGVyaXRzX2luaHJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJl ciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJc2NhbiA9IHN5c3Rh YmxlX2JlZ2luc2Nhbihpbmhlcml0c1JlbCwgSW5oZXJpdHNSZWxpZFNlcW5vSW5kZXhJZCwKKwkJ CQkJCQkgIHRydWUsIE5VTEwsIDEsICZrZXkpOworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHR1 cCA9IHN5c3RhYmxlX2dldG5leHQoc2NhbikpKQorCXsKKwkJRm9ybV9wZ19pbmhlcml0cyBpbmgg PSAoRm9ybV9wZ19pbmhlcml0cykgR0VUU1RSVUNUKHR1cCk7CisKKwkJcGFyZW50cyA9IGxhcHBl bmRfb2lkKHBhcmVudHMsIGluaC0+aW5ocGFyZW50KTsKKwl9CisJc3lzdGFibGVfZW5kc2Nhbihz Y2FuKTsKKwl0YWJsZV9jbG9zZShpbmhlcml0c1JlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJl dHVybiBwYXJlbnRzOworfQorCisvKgorICogbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lCisgKgkJ UmV0dXJuIHRoZSBzY2hlbWEtcXVhbGlmaWVkLCBpZGVudGlmaWVyLXF1b3RlZCBuYW1lIG9mIGEg cmVsYXRpb24sCisgKgkJb3IgcmFpc2UgRVJSQ09ERV9VTkRFRklORURfT0JKRUNUIGlmIHRoZSBy ZWxhdGlvbiBoYXMgZGlzYXBwZWFyZWQuCisgKgorICogUmVwbGFjZXMgdGhlIHVuc2FmZSBwYXR0 ZXJuCisgKgkgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKGdldF9uYW1lc3BhY2VfbmFtZShn ZXRfcmVsX25hbWVzcGFjZShvaWQpKSwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z2V0X3JlbF9uYW1lKG9pZCkpCisgKiB3aGljaCBkZXJlZmVyZW5jZXMgTlVMTCB3aGVuIGEgY29u Y3VycmVudCB0cmFuc2FjdGlvbiBoYXMgZHJvcHBlZCB0aGUKKyAqIHJlZmVyZW5jZWQgcmVsYXRp b24gKG9yIGl0cyBzY2hlbWEpIGJldHdlZW4gd2hlbiB3ZSBjYWNoZWQgaXRzIE9JRCBhbmQKKyAq IHdoZW4gd2UgYXNrIHRoZSBzeXNjYWNoZSBmb3IgaXRzIG5hbWUuICBIb2xkaW5nIEFjY2Vzc1No YXJlTG9jayBvbiBhCisgKiBkZXBlbmRlbnQgcmVsYXRpb24gbWFrZXMgdGhpcyByYWNlIHZhbmlz aGluZ2x5IHVubGlrZWx5IGluIHByYWN0aWNlLAorICogYnV0IHdlIHN0aWxsIGRlZmVuZCBhZ2Fp bnN0IGl0IGJlY2F1c2UgdGhlIGFsdGVybmF0aXZlIGlzIGEgU0lHU0VHVi4KKyAqCisgKiBDYWxs ZXIgaXMgcmVzcG9uc2libGUgZm9yIHBmcmVlKClpbmcgdGhlIHJlc3VsdC4KKyAqLworc3RhdGlj IGNoYXIgKgorbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lKE9pZCByZWxpZCkKK3sKKwlIZWFwVHVw bGUJdHA7CisJRm9ybV9wZ19jbGFzcyByZWx0dXA7CisJY2hhcgkgICAqbnNwbmFtZTsKKwljaGFy CSAgICpyZXN1bHQ7CisKKwl0cCA9IFNlYXJjaFN5c0NhY2hlMShSRUxPSUQsIE9iamVjdElkR2V0 RGF0dW0ocmVsaWQpKTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHApKQorCQllcmVwb3J0KEVS Uk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJIGVycm1z ZygicmVsYXRpb24gd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLCByZWxpZCksCisJCQkJIGVy cmRldGFpbCgiSXQgbWF5IGhhdmUgYmVlbiBjb25jdXJyZW50bHkgZHJvcHBlZC4iKSkpOworCisJ cmVsdHVwID0gKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVCh0cCk7CisJbnNwbmFtZSA9IGdldF9u YW1lc3BhY2VfbmFtZShyZWx0dXAtPnJlbG5hbWVzcGFjZSk7CisJaWYgKG5zcG5hbWUgPT0gTlVM TCkKKwl7CisJCU9pZAkJCW5zcG9pZCA9IHJlbHR1cC0+cmVsbmFtZXNwYWNlOworCisJCVJlbGVh c2VTeXNDYWNoZSh0cCk7CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9V TkRFRklORURfT0JKRUNUKSwKKwkJCQkgZXJybXNnKCJzY2hlbWEgd2l0aCBPSUQgJXUgZG9lcyBu b3QgZXhpc3QiLCBuc3BvaWQpLAorCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29u Y3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwl9CisKKwlyZXN1bHQgPSBxdW90ZV9xdWFsaWZpZWRf aWRlbnRpZmllcihuc3BuYW1lLCBOYW1lU3RyKHJlbHR1cC0+cmVsbmFtZSkpOworCisJcGZyZWUo bnNwbmFtZSk7CisJUmVsZWFzZVN5c0NhY2hlKHRwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisK Ky8qCisgKiBmaW5kX2F0dHJkZWZfdGV4dAorICoJCVJldHVybiB0aGUgZGVwYXJzZWQgREVGQVVM VC9HRU5FUkFURUQgZXhwcmVzc2lvbiBmb3IgYXR0bnVtIG9uIHJlbCwKKyAqCQlvciBOVUxMIGlm IG5vIGVudHJ5IGV4aXN0cyBpbiBUdXBsZUNvbnN0ci0+ZGVmdmFsLgorICoKKyAqIFRoZSBjYWxs ZXIgcGFzc2VzIGEgTGlzdCAqKiBzbyB0aGF0IHRoZSBkZXBhcnNlIGNvbnRleHQgaXMgYnVpbHQg bGF6aWx5CisgKiBhbmQgcmV1c2VkIGFjcm9zcyBjYWxscyAoZGVwYXJzZV9jb250ZXh0X2ZvciBp cyBub3QgY2hlYXApLiAgUmV0dXJuZWQKKyAqIHN0cmluZyBpcyBwYWxsb2MnZCBpbiB0aGUgY3Vy cmVudCBtZW1vcnkgY29udGV4dDsgY2FsbGVyIHBmcmVlJ3MgaXQuCisgKi8KK3N0YXRpYyBjaGFy ICoKK2ZpbmRfYXR0cmRlZl90ZXh0KFJlbGF0aW9uIHJlbCwgQXR0ck51bWJlciBhdHRudW0sIExp c3QgKipkcGNvbnRleHQpCit7CisJVHVwbGVDb25zdHIgKmNvbnN0ciA9IFJlbGF0aW9uR2V0RGVz Y3IocmVsKS0+Y29uc3RyOworCisJaWYgKGNvbnN0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsK KworCWZvciAoaW50IGogPSAwOyBqIDwgY29uc3RyLT5udW1fZGVmdmFsOyBqKyspCisJeworCQlp ZiAoY29uc3RyLT5kZWZ2YWxbal0uYWRudW0gIT0gYXR0bnVtKQorCQkJY29udGludWU7CisKKwkJ aWYgKCpkcGNvbnRleHQgPT0gTklMKQorCQkJKmRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9m b3IoUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSwKKwkJCQkJCQkJCQkJIFJlbGF0aW9uR2V0 UmVsaWQocmVsKSk7CisKKwkJcmV0dXJuIGRlcGFyc2VfZXhwcmVzc2lvbihzdHJpbmdUb05vZGUo Y29uc3RyLT5kZWZ2YWxbal0uYWRiaW4pLAorCQkJCQkJCQkgICpkcGNvbnRleHQsIGZhbHNlLCBm YWxzZSk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogYXBwZW5kX2lubGluZV9jaGVj a19jb25zdHJhaW50cworICoJCUVtaXQgZWFjaCBsb2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0 cmFpbnQgb24gcmVsIGFzCisgKgkJIkNPTlNUUkFJTlQgbmFtZSA8cGdfZ2V0X2NvbnN0cmFpbnRk ZWY+Iiwgc2VwYXJhdGVkIGJ5ICcsJyBmcm9tIGFueQorICoJCXByZXZpb3VzbHktZW1pdHRlZCBj b2x1bW4gb3IgY29uc3RyYWludC4KKyAqCisgKiAqZmlyc3QgdHJhY2tzIHdoZXRoZXIgYW55dGhp bmcgaGFzIGJlZW4gZW1pdHRlZCBvbiB0aGlzIGxpc3QgeWV0LCBzbyB0aGUKKyAqIGNhbGxlciBj YW4gY2hhaW4gY29sdW1uIGVtaXNzaW9uIGFuZCBjb25zdHJhaW50IGVtaXNzaW9uIHRocm91Z2gg dGhlIHNhbWUKKyAqIGJ1ZmZlci4gIEluaGVyaXRlZCBDSEVDSyBjb25zdHJhaW50cyAoIWNvbmlz bG9jYWwpIGNvbWUgZnJvbSB0aGUgcGFyZW50J3MKKyAqIERETCBhbmQgYXJlbid0IHJlcGVhdGVk IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCithcHBlbmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRz KFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCQkJCQlib29s ICpmaXJzdCkKK3sKKwlSZWxhdGlvbgljb25SZWw7CisJU3lzU2NhbkRlc2MgY29uU2NhbjsKKwlT Y2FuS2V5RGF0YSBjb25LZXk7CisJSGVhcFR1cGxlCWNvblR1cDsKKworCWNvblJlbCA9IHRhYmxl X29wZW4oQ29uc3RyYWludFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUlu aXQoJmNvbktleSwKKwkJCQlBbnVtX3BnX2NvbnN0cmFpbnRfY29ucmVsaWQsCisJCQkJQlRFcXVh bFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25H ZXRSZWxpZChyZWwpKSk7CisJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nhbihjb25SZWwsIENv bnN0cmFpbnRSZWxpZFR5cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCSB0cnVlLCBOVUxMLCAxLCAm Y29uS2V5KTsKKworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKGNvblR1cCA9IHN5c3RhYmxlX2dl dG5leHQoY29uU2NhbikpKQorCXsKKwkJRm9ybV9wZ19jb25zdHJhaW50IGNvbiA9IChGb3JtX3Bn X2NvbnN0cmFpbnQpIEdFVFNUUlVDVChjb25UdXApOworCQlEYXR1bQkJZGVmRGF0dW07CisJCWNo YXIJICAgKmRlZmJvZHk7CisKKwkJaWYgKGNvbi0+Y29udHlwZSAhPSBDT05TVFJBSU5UX0NIRUNL KQorCQkJY29udGludWU7CisJCWlmICghY29uLT5jb25pc2xvY2FsKQorCQkJY29udGludWU7CisK KwkJaWYgKCEqZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcsJyk7CisJCSpm aXJzdCA9IGZhbHNlOworCQlpZiAocHJldHR5KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhi dWYsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcp OworCisJCWRlZkRhdHVtID0gT2lkRnVuY3Rpb25DYWxsMShGX1BHX0dFVF9DT05TVFJBSU5UREVG X09JRCwKKwkJCQkJCQkJCU9iamVjdElkR2V0RGF0dW0oY29uLT5vaWQpKTsKKwkJZGVmYm9keSA9 IFRleHREYXR1bUdldENTdHJpbmcoZGVmRGF0dW0pOworCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Ziwg IkNPTlNUUkFJTlQgJXMgJXMiLAorCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihjb24t PmNvbm5hbWUpKSwKKwkJCQkJCSBkZWZib2R5KTsKKwkJcGZyZWUoZGVmYm9keSk7CisJfQorCXN5 c3RhYmxlX2VuZHNjYW4oY29uU2Nhbik7CisJdGFibGVfY2xvc2UoY29uUmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworfQorCisvKgorICogYXBwZW5kX2NvbHVtbl9kZWZzCisgKgkJQXBwZW5kIHRoZSBj b21tYS1zZXBhcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gbGlzdCBmb3IgYSB0YWJsZS4KKyAqCisg KiBFbWl0cyBlYWNoIG5vbi1kcm9wcGVkLCBsb2NhbGx5LWRlY2xhcmVkIGNvbHVtbiBhcworICoJ CW5hbWUgdHlwZSBbQ09MTEFURSB4XSBbU1RPUkFHRSBzXSBbQ09NUFJFU1NJT04gY10KKyAqCQlb R0VORVJBVEVEIC4uLiB8IERFRkFVTFQgZV0gW05PVCBOVUxMXQorICogZm9sbG93ZWQgYnkgYW55 IGxvY2FsbHktZGVjbGFyZWQgaW5saW5lIENIRUNLIGNvbnN0cmFpbnRzLiAgT3B0aW9uYWwKKyAq IGNsYXVzZXMgYXJlIG9taXR0ZWQgd2hlbiB0aGVpciB2YWx1ZSBtYXRjaGVzIHdoYXQgdGhlIHN5 c3RlbSB3b3VsZAorICogcmVhcHBseSBvbiByb3VuZC10cmlwIChlLmcuIHR5cGUtZGVmYXVsdCBD T0xMQVRFLCB0eXBlLWRlZmF1bHQgU1RPUkFHRSkuCisgKi8KK3N0YXRpYyB2b2lkCithcHBlbmRf Y29sdW1uX2RlZnMoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBwcmV0dHksCisJ CQkJICAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0g UmVsYXRpb25HZXREZXNjcihyZWwpOworCUxpc3QJICAgKmRwY29udGV4dCA9IE5JTDsKKwlib29s CQlmaXJzdCA9IHRydWU7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBp KyspCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2Ms IGkpOworCQljaGFyCSAgICp0eXBzdHI7CisKKwkJaWYgKGF0dC0+YXR0aXNkcm9wcGVkKQorCQkJ Y29udGludWU7CisKKwkJLyoKKwkJICogQ29sdW1ucyBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBh cmUgZW1pdHRlZCBieSB0aGUgSU5IRVJJVFMgY2xhdXNlCisJCSAqIChvbmNlIGltcGxlbWVudGVk KSwgbm90IHRoZSBjb2x1bW4gbGlzdCwgdW5sZXNzIHRoZSBjaGlsZAorCQkgKiByZWRlY2xhcmVk IHRoZW0gbG9jYWxseSAoYXR0aXNsb2NhbD10cnVlKS4KKwkJICovCisJCWlmICghYXR0LT5hdHRp c2xvY2FsKQorCQkJY29udGludWU7CisKKwkJaWYgKCFmaXJzdCkKKwkJCWFwcGVuZFN0cmluZ0lu Zm9DaGFyKGJ1ZiwgJywnKTsKKwkJZmlyc3QgPSBmYWxzZTsKKworCQlpZiAocHJldHR5KQorCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBwZW5k U3RyaW5nSW5mb0NoYXIoYnVmLCAnICcpOworCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVm LCBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoYXR0LT5hdHRuYW1lKSkpOworCQlhcHBlbmRTdHJp bmdJbmZvQ2hhcihidWYsICcgJyk7CisKKwkJdHlwc3RyID0gZm9ybWF0X3R5cGVfd2l0aF90eXBl bW9kKGF0dC0+YXR0dHlwaWQsIGF0dC0+YXR0dHlwbW9kKTsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZyhidWYsIHR5cHN0cik7CisJCXBmcmVlKHR5cHN0cik7CisKKwkJLyogQ09MTEFURSBjbGF1 c2UsIG9ubHkgaWYgaXQgZGlmZmVycyBmcm9tIHRoZSB0eXBlJ3MgZGVmYXVsdC4gKi8KKwkJaWYg KE9pZElzVmFsaWQoYXR0LT5hdHRjb2xsYXRpb24pICYmCisJCQlhdHQtPmF0dGNvbGxhdGlvbiAh PSBnZXRfdHlwY29sbGF0aW9uKGF0dC0+YXR0dHlwaWQpKQorCQkJYXBwZW5kU3RyaW5nSW5mbyhi dWYsICIgQ09MTEFURSAlcyIsCisJCQkJCQkJIGdlbmVyYXRlX2NvbGxhdGlvbl9uYW1lKGF0dC0+ YXR0Y29sbGF0aW9uKSk7CisKKwkJLyogU1RPUkFHRSBjbGF1c2UsIG9ubHkgaWYgaXQgZGlmZmVy cyBmcm9tIHRoZSB0eXBlJ3MgZGVmYXVsdC4gKi8KKwkJaWYgKGF0dC0+YXR0c3RvcmFnZSAhPSBn ZXRfdHlwc3RvcmFnZShhdHQtPmF0dHR5cGlkKSkKKwkJeworCQkJY29uc3QgY2hhciAqc3RvcmFn ZSA9IE5VTEw7CisKKwkJCXN3aXRjaCAoYXR0LT5hdHRzdG9yYWdlKQorCQkJeworCQkJCWNhc2Ug VFlQU1RPUkFHRV9QTEFJTjoKKwkJCQkJc3RvcmFnZSA9ICJQTEFJTiI7CisJCQkJCWJyZWFrOwor CQkJCWNhc2UgVFlQU1RPUkFHRV9FWFRFUk5BTDoKKwkJCQkJc3RvcmFnZSA9ICJFWFRFUk5BTCI7 CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVFlQU1RPUkFHRV9NQUlOOgorCQkJCQlzdG9yYWdlID0g Ik1BSU4iOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRZUFNUT1JBR0VfRVhURU5ERUQ6CisJCQkJ CXN0b3JhZ2UgPSAiRVhURU5ERUQiOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdG9yYWdl KQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIFNUT1JBR0UgJXMiLCBzdG9yYWdlKTsKKwkJ fQorCisJCS8qIENPTVBSRVNTSU9OIGNsYXVzZSwgb25seSBpZiBleHBsaWNpdGx5IHNldCBvbiB0 aGUgY29sdW1uLiAqLworCQlpZiAoQ29tcHJlc3Npb25NZXRob2RJc1ZhbGlkKGF0dC0+YXR0Y29t cHJlc3Npb24pKQorCQl7CisJCQljb25zdCBjaGFyICpjbSA9IE5VTEw7CisKKwkJCXN3aXRjaCAo YXR0LT5hdHRjb21wcmVzc2lvbikKKwkJCXsKKwkJCQljYXNlIFRPQVNUX1BHTFpfQ09NUFJFU1NJ T046CisJCQkJCWNtID0gInBnbHoiOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRPQVNUX0xaNF9D T01QUkVTU0lPTjoKKwkJCQkJY20gPSAibHo0IjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAo Y20pCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgQ09NUFJFU1NJT04gJXMiLCBjbSk7CisJ CX0KKworCQkvKgorCQkgKiBMb29rIHVwIHRoZSBkZWZhdWx0L2dlbmVyYXRlZCBleHByZXNzaW9u IHRleHQgdXAgZnJvbnQ7IGdlbmVyYXRlZAorCQkgKiBjb2x1bW5zIGhhdmUgYXR0aGFzZGVmPXRy dWUgd2l0aCBhbiBlbnRyeSBpbiBwZ19hdHRyZGVmIGp1c3QgbGlrZQorCQkgKiByZWd1bGFyIGRl ZmF1bHRzLgorCQkgKi8KKwkJeworCQkJY2hhcgkgICAqZGVmZXhwciA9IE5VTEw7CisKKwkJCWlm IChhdHQtPmF0dGhhc2RlZikKKwkJCQlkZWZleHByID0gZmluZF9hdHRyZGVmX3RleHQocmVsLCBh dHQtPmF0dG51bSwgJmRwY29udGV4dCk7CisKKwkJCS8qIEdFTkVSQVRFRCAvIElERU5USVRZIC8g REVGQVVMVCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworCQkJaWYgKGF0dC0+YXR0Z2VuZXJh dGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfU1RPUkVEICYmIGRlZmV4cHIpCisJCQkJYXBwZW5k U3RyaW5nSW5mbyhidWYsICIgR0VORVJBVEVEIEFMV0FZUyBBUyAoJXMpIFNUT1JFRCIsIGRlZmV4 cHIpOworCQkJZWxzZSBpZiAoYXR0LT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRF RF9WSVJUVUFMICYmIGRlZmV4cHIpCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgR0VORVJB VEVEIEFMV0FZUyBBUyAoJXMpIFZJUlRVQUwiLCBkZWZleHByKTsKKwkJCWVsc2UgaWYgKGF0dC0+ YXR0aWRlbnRpdHkgPT0gQVRUUklCVVRFX0lERU5USVRZX0FMV0FZUyB8fAorCQkJCQkgYXR0LT5h dHRpZGVudGl0eSA9PSBBVFRSSUJVVEVfSURFTlRJVFlfQllfREVGQVVMVCkKKwkJCXsKKwkJCQlj b25zdCBjaGFyICppZGtpbmQgPQorCQkJCQkoYXR0LT5hdHRpZGVudGl0eSA9PSBBVFRSSUJVVEVf SURFTlRJVFlfQUxXQVlTKQorCQkJCQk/ICJBTFdBWVMiIDogIkJZIERFRkFVTFQiOworCQkJCU9p ZAkJCXNlcWlkID0gZ2V0SWRlbnRpdHlTZXF1ZW5jZShyZWwsIGF0dC0+YXR0bnVtLCB0cnVlKTsK KworCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIEdFTkVSQVRFRCAlcyBBUyBJREVOVElUWSIs IGlka2luZCk7CisKKwkJCQkvKgorCQkJCSAqIEVtaXQgb25seSB0aGUgc2VxdWVuY2Ugb3B0aW9u cyB0aGF0IGRpZmZlciBmcm9tIHRoZWlyCisJCQkJICogZGVmYXVsdHMg4oCUIG1pcnJvcmluZyBw Z19nZXRfZGF0YWJhc2VfZGRsJ3MgcGF0dGVybiBvZgorCQkJCSAqIG9taXR0aW5nIHZhbHVlcyB0 aGF0IHRoZSBzeXN0ZW0gd291bGQgcmVhcHBseSBvbiBpdHMgb3duLgorCQkJCSAqLworCQkJCWlm IChPaWRJc1ZhbGlkKHNlcWlkKSkKKwkJCQl7CisJCQkJCUhlYXBUdXBsZQlzZXFUdXAgPSBTZWFy Y2hTeXNDYWNoZTEoU0VRUkVMSUQsCisJCQkJCQkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKHNl cWlkKSk7CisKKwkJCQkJaWYgKEhlYXBUdXBsZUlzVmFsaWQoc2VxVHVwKSkKKwkJCQkJeworCQkJ CQkJRm9ybV9wZ19zZXF1ZW5jZSBzZXEgPSAoRm9ybV9wZ19zZXF1ZW5jZSkgR0VUU1RSVUNUKHNl cVR1cCk7CisJCQkJCQlTdHJpbmdJbmZvRGF0YSBvcHRzOworCQkJCQkJYm9vbAkJZmlyc3Rfb3B0 ID0gdHJ1ZTsKKwkJCQkJCWludDY0CQlkZWZfbWluLAorCQkJCQkJCQkJZGVmX21heCwKKwkJCQkJ CQkJCWRlZl9zdGFydDsKKwkJCQkJCWludDY0CQl0eXBfbWluLAorCQkJCQkJCQkJdHlwX21heDsK KworCQkJCQkJLyoKKwkJCQkJCSAqIFBlci10eXBlIGJvdW5kcyBmb3IgdGhlIHNlcXVlbmNlJ3Mg dW5kZXJseWluZworCQkJCQkJICogaW50ZWdlciB0eXBlLiAgRGVmYXVsdHMgdG8gaW50OCBpZiB0 aGUgY29sdW1uIHR5cGUKKwkJCQkJCSAqIGlzIHNvbWV0aGluZyBlbHNlIChzaG91bGRuJ3QgaGFw cGVuIGZvciBJREVOVElUWSwKKwkJCQkJCSAqIGJ1dCBiZSBkZWZlbnNpdmUpLgorCQkJCQkJICov CisJCQkJCQlzd2l0Y2ggKGF0dC0+YXR0dHlwaWQpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBJTlQy T0lEOgorCQkJCQkJCQl0eXBfbWluID0gUEdfSU5UMTZfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0g UEdfSU5UMTZfTUFYOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIElOVDRPSUQ6CisJCQkJ CQkJCXR5cF9taW4gPSBQR19JTlQzMl9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQzMl9N QVg7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXR5cF9taW4gPSBQ R19JTlQ2NF9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQ2NF9NQVg7CisJCQkJCQkJCWJy ZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgPiAwKQorCQkJCQkJ eworCQkJCQkJCWRlZl9taW4gPSAxOworCQkJCQkJCWRlZl9tYXggPSB0eXBfbWF4OworCQkJCQkJ CWRlZl9zdGFydCA9IGRlZl9taW47CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJ CQkJZGVmX21pbiA9IHR5cF9taW47CisJCQkJCQkJZGVmX21heCA9IC0xOworCQkJCQkJCWRlZl9z dGFydCA9IGRlZl9tYXg7CisJCQkJCQl9CisKKwkJCQkJCWluaXRTdHJpbmdJbmZvKCZvcHRzKTsK KworCQkJCQkJLyoKKwkJCQkJCSAqIFNFUVVFTkNFIE5BTUUg4oCUIG9taXQgd2hlbiBpdCBtYXRj aGVzIHRoZQorCQkJCQkJICogaW1wbGljaXQgIjx0YWJsZW5hbWU+Xzxjb2x1bW5uYW1lPl9zZXEi IHBhdHRlcm4KKwkJCQkJCSAqIGluIHRoZSBzYW1lIHNjaGVtYSwgc2luY2UgQ1JFQVRFIFRBQkxF IHdpbGwKKwkJCQkJCSAqIHJlZ2VuZXJhdGUgdGhhdCBleGFjdCBuYW1lLiAgVGhlIHNlcXVlbmNl IGlzIGFuCisJCQkJCQkgKiBJTlRFUk5BTCBkZXBlbmRlbmN5IG9mIHRoZSBjb2x1bW4sIHNvIHRo ZSBsb2NrCisJCQkJCQkgKiB3ZSBob2xkIG9uIHRoZSB0YWJsZSBhbHNvIHBpbnMgaXQsIGJ1dCB0 aGUKKwkJCQkJCSAqIGxvb2t1cCBoZWxwZXIgc3RpbGwgZGVmZW5kcyBhZ2FpbnN0IGEgbWlzc2lu ZworCQkJCQkJICogcGdfY2xhc3Mgcm93LgorCQkJCQkJICovCisJCQkJCQl7CisJCQkJCQkJSGVh cFR1cGxlCXNlcUNsYXNzVHVwOworCQkJCQkJCUZvcm1fcGdfY2xhc3Mgc2VxQ2xhc3M7CisJCQkJ CQkJY2hhcgkJYXV0b25hbWVbTkFNRURBVEFMRU5dOworCisJCQkJCQkJc2VxQ2xhc3NUdXAgPSBT ZWFyY2hTeXNDYWNoZTEoUkVMT0lELAorCQkJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0o c2VxaWQpKTsKKwkJCQkJCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoc2VxQ2xhc3NUdXApKQorCQkJ CQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVE X09CSkVDVCksCisJCQkJCQkJCQkJIGVycm1zZygiaWRlbnRpdHkgc2VxdWVuY2Ugd2l0aCBPSUQg JXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCQkJCQkJc2VxaWQpLAorCQkJCQkJCQkJCSBlcnJk ZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwkJCQkJ CQlzZXFDbGFzcyA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1Qoc2VxQ2xhc3NUdXApOworCisJ CQkJCQkJc25wcmludGYoYXV0b25hbWUsIHNpemVvZihhdXRvbmFtZSksICIlc18lc19zZXEiLAor CQkJCQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkgTmFtZVN0 cihhdHQtPmF0dG5hbWUpKTsKKwkJCQkJCQlpZiAoc2VxQ2xhc3MtPnJlbG5hbWVzcGFjZSAhPSBS ZWxhdGlvbkdldE5hbWVzcGFjZShyZWwpIHx8CisJCQkJCQkJCXN0cmNtcChOYW1lU3RyKHNlcUNs YXNzLT5yZWxuYW1lKSwgYXV0b25hbWUpICE9IDApCisJCQkJCQkJeworCQkJCQkJCQljaGFyCSAg ICpzZXFRdWFsID0KKwkJCQkJCQkJCWxvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZShzZXFpZCk7CisK KwkJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzU0VRVUVOQ0UgTkFNRSAlcyIsCisJ CQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcVF1YWwpOworCQkJCQkJCQlmaXJz dF9vcHQgPSBmYWxzZTsKKwkJCQkJCQkJcGZyZWUoc2VxUXVhbCk7CisJCQkJCQkJfQorCQkJCQkJ CVJlbGVhc2VTeXNDYWNoZShzZXFDbGFzc1R1cCk7CisJCQkJCQl9CisKKwkJCQkJCWlmIChzZXEt PnNlcXN0YXJ0ICE9IGRlZl9zdGFydCkKKwkJCQkJCXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZv KCZvcHRzLCAiJXNTVEFSVCBXSVRIICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJCQkgZmlyc3Rf b3B0ID8gIiIgOiAiICIsIHNlcS0+c2Vxc3RhcnQpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNl OworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxaW5jcmVtZW50ICE9IDEpCisJCQkJCQl7CisJ CQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzSU5DUkVNRU5UIEJZICIgSU5UNjRfRk9S TUFULAorCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2VxaW5jcmVtZW50 KTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNl cW1pbiAhPSBkZWZfbWluKQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMs ICIlc01JTlZBTFVFICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIg OiAiICIsIHNlcS0+c2VxbWluKTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0K KwkJCQkJCWlmIChzZXEtPnNlcW1heCAhPSBkZWZfbWF4KQorCQkJCQkJeworCQkJCQkJCWFwcGVu ZFN0cmluZ0luZm8oJm9wdHMsICIlc01BWFZBTFVFICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJ CQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2VxbWF4KTsKKwkJCQkJCQlmaXJzdF9vcHQg PSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcWNhY2hlICE9IDEpCisJCQkJCQl7 CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzQ0FDSEUgIiBJTlQ2NF9GT1JNQVQs CisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFjYWNoZSk7CisJCQkJ CQkJZmlyc3Rfb3B0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlpZiAoc2VxLT5zZXFjeWNsZSkK KwkJCQkJCXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNDWUNMRSIsIGZpcnN0 X29wdCA/ICIiIDogIiAiKTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwor CQkJCQkJaWYgKCFmaXJzdF9vcHQpCisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgKCVz KSIsIG9wdHMuZGF0YSk7CisKKwkJCQkJCXBmcmVlKG9wdHMuZGF0YSk7CisJCQkJCQlSZWxlYXNl U3lzQ2FjaGUoc2VxVHVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRlZmV4 cHIpCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgREVGQVVMVCAlcyIsIGRlZmV4cHIpOwor CisJCQlpZiAoZGVmZXhwcikKKwkJCQlwZnJlZShkZWZleHByKTsKKwkJfQorCisJCWlmIChhdHQt PmF0dG5vdG51bGwpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiBOT1QgTlVMTCIp OworCX0KKworCS8qCisJICogVGFibGUtbGV2ZWwgQ0hFQ0sgY29uc3RyYWludHMg4oCUIGVtaXR0 ZWQgaW5saW5lIGluIHRoZSBDUkVBVEUgVEFCTEUKKwkgKiBib2R5IHNvIHRoZXkgYXBwZWFyIGFs b25nc2lkZSB0aGUgY29sdW1ucyAodGhlIHBnX2R1bXAgc2hhcGUpLiAgVGhlCisJICogY29uc3Ry YWludCBsb29wIGxhdGVyIGluIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwgc2tpcHMgQ0hFQ0sK KwkgKiBjb25zdHJhaW50cyB0byBhdm9pZCBkb3VibGUtZW1pc3Npb24uCisJICovCisJaWYgKGlu Y2x1ZGVfY29uc3RyYWludHMpCisJCWFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMoYnVm LCByZWwsIHByZXR0eSwgJmZpcnN0KTsKK30KKworLyoKKyAqIGFwcGVuZF90eXBlZF9jb2x1bW5f b3ZlcnJpZGVzCisgKgkJRm9yIGEgdHlwZWQgdGFibGUgKENSRUFURSBUQUJMRSAuLi4gT0YgdHlw ZV9uYW1lKSwgYXBwZW5kIHRoZQorICoJCW9wdGlvbmFsICIoY29sIFdJVEggT1BUSU9OUyAuLi4s IC4uLikiIGxpc3QgY2FycnlpbmcgbG9jYWxseQorICoJCWFwcGxpZWQgcGVyLWNvbHVtbiBvdmVy cmlkZXMg4oCUIERFRkFVTFQsIE5PVCBOVUxMLCBhbmQgYW55IGxvY2FsbHkKKyAqCQlkZWNsYXJl ZCBDSEVDSyBjb25zdHJhaW50cy4KKyAqCisgKiBDb2x1bW5zIHdob3NlIHR5cGUgaXMgZnVsbHkg ZGljdGF0ZWQgYnkgcmVsb2Z0eXBlIGVtaXQgbm90aGluZy4gIFRoZQorICogcGFyZW50aGVzaXNl ZCBsaXN0IGlzIHN1cHByZXNzZWQgZW50aXJlbHkgd2hlbiBubyBjb2x1bW4gbmVlZHMgYW4KKyAq IG92ZXJyaWRlIGFuZCB0aGVyZSBhcmUgbm8gbG9jYWxseS1kZWNsYXJlZCBDSEVDSyBjb25zdHJh aW50cywgbWF0Y2hpbmcKKyAqIHRoZSBjYW5vbmljYWwgIkNSRUFURSBUQUJMRSB4IE9GIHQ7IiBz aGFwZS4KKyAqLworc3RhdGljIHZvaWQKK2FwcGVuZF90eXBlZF9jb2x1bW5fb3ZlcnJpZGVzKFN0 cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCQkJCSAgYm9vbCBp bmNsdWRlX2NvbnN0cmFpbnRzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOworCUxpc3QJICAgKmRwY29udGV4dCA9IE5JTDsKKwlTdHJpbmdJbmZvRGF0YSBp bm5lcjsKKwlib29sCQlmaXJzdCA9IHRydWU7CisKKwlpbml0U3RyaW5nSW5mbygmaW5uZXIpOwor CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCXsKKwkJRm9ybV9w Z19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAq ZGVmZXhwciA9IE5VTEw7CisJCWJvb2wJCWhhc19kZWZhdWx0OworCQlib29sCQloYXNfbm90bnVs bDsKKworCQlpZiAoYXR0LT5hdHRpc2Ryb3BwZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoYXR0 LT5hdHRoYXNkZWYpCisJCQlkZWZleHByID0gZmluZF9hdHRyZGVmX3RleHQocmVsLCBhdHQtPmF0 dG51bSwgJmRwY29udGV4dCk7CisKKwkJaGFzX2RlZmF1bHQgPSAoZGVmZXhwciAhPSBOVUxMKTsK KwkJaGFzX25vdG51bGwgPSBhdHQtPmF0dG5vdG51bGw7CisKKwkJaWYgKCFoYXNfZGVmYXVsdCAm JiAhaGFzX25vdG51bGwpCisJCXsKKwkJCWlmIChkZWZleHByKQorCQkJCXBmcmVlKGRlZmV4cHIp OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5m b0NoYXIoJmlubmVyLCAnLCcpOworCQlmaXJzdCA9IGZhbHNlOworCQlpZiAocHJldHR5KQorCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoJmlubmVyLCAnICcpOworCisJCWFwcGVuZFN0cmluZ0luZm8oJmlu bmVyLCAiJXMgV0lUSCBPUFRJT05TIiwKKwkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIo YXR0LT5hdHRuYW1lKSkpOworCQlpZiAoaGFzX2RlZmF1bHQpCisJCQlhcHBlbmRTdHJpbmdJbmZv KCZpbm5lciwgIiBERUZBVUxUICVzIiwgZGVmZXhwcik7CisJCWlmIChoYXNfbm90bnVsbCkKKwkJ CWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmlubmVyLCAiIE5PVCBOVUxMIik7CisKKwkJaWYgKGRl ZmV4cHIpCisJCQlwZnJlZShkZWZleHByKTsKKwl9CisKKwkvKgorCSAqIExvY2FsbHktZGVjbGFy ZWQgQ0hFQ0sgY29uc3RyYWludHMgb24gYSB0eXBlZCB0YWJsZSBiZWxvbmcgaW4gdGhlCisJICog Y29sdW1uLWxpc3QgcGFyZW50aGVzZXMsIHNhbWUgYXMgZm9yIGFuIHVudHlwZWQgdGFibGUuICBU aGUKKwkgKiBvdXQtb2YtbGluZSBjb25zdHJhaW50IGxvb3AgbGF0ZXIgc3RpbGwgc2tpcHMgQ0hF Q0tzLgorCSAqLworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCQlhcHBlbmRfaW5saW5lX2No ZWNrX2NvbnN0cmFpbnRzKCZpbm5lciwgcmVsLCBwcmV0dHksICZmaXJzdCk7CisKKwlpZiAoIWZp cnN0KQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgKCIpOworCQlhcHBlbmRT dHJpbmdJbmZvU3RyaW5nKGJ1ZiwgaW5uZXIuZGF0YSk7CisJCWlmIChwcmV0dHkpCisJCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlxuKSIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJ bmZvQ2hhcihidWYsICcpJyk7CisJfQorCXBmcmVlKGlubmVyLmRhdGEpOworfQorCisvKgorICog cGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5hbAorICoJCUdlbmVyYXRlIERETCBzdGF0ZW1lbnRzIHRv IHJlY3JlYXRlIGEgcmVndWxhciBvciBwYXJ0aXRpb25lZCB0YWJsZS4KKyAqCisgKiBUaGUgZmly c3QgbGlzdCBlbGVtZW50IGlzIHRoZSBDUkVBVEUgVEFCTEUgc3RhdGVtZW50LiAgU3Vic2VxdWVu dAorICogZWxlbWVudHMgYXJlIHRoZSBBTFRFUiBUQUJMRSAvIENSRUFURSBJTkRFWCAvIENSRUFU RSBSVUxFIC8KKyAqIENSRUFURSBTVEFUSVNUSUNTIHN0YXRlbWVudHMgbmVlZGVkIHRvIHJlc3Rv cmUgdGhlIHRhYmxlJ3MgZnVsbAorICogZGVmaW5pdGlvbi4KKyAqCisgKiBUcmlnZ2VyIGFuZCBw b2xpY3kgZW1pc3Npb24gYXJlIHNjYWZmb2xkZWQgYnV0IG5vdCB5ZXQgd2lyZWQgdXAg4oCUIHRo ZXkKKyAqIGFyZSBnYXRlZCBvbiBzdGFuZGFsb25lIHBnX2dldF90cmlnZ2VyX2RkbCAvIHBnX2dl dF9wb2xpY3lfZGRsIGhlbHBlcnMKKyAqIGxhbmRpbmcuCisgKi8KK3N0YXRpYyBMaXN0ICoKK3Bn X2dldF90YWJsZV9kZGxfaW50ZXJuYWwoT2lkIHJlbGlkLCBib29sIHByZXR0eSwKKwkJCQkJCSAg Ym9vbCBub19vd25lciwgYm9vbCBub190YWJsZXNwYWNlLAorCQkJCQkJICBib29sIGluY2x1ZGVf aW5kZXhlcywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzLAorCQkJCQkJICBib29s IGluY2x1ZGVfcnVsZXMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9zdGF0aXN0aWNzLAorCQkJCQkJ ICBib29sIGluY2x1ZGVfdHJpZ2dlcnMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9wb2xpY2llcywK KwkJCQkJCSAgYm9vbCBpbmNsdWRlX3JscywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3JlcGxpY2Ff aWRlbnRpdHksCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9wYXJ0aXRpb24pCit7CisJUmVsYXRpb24J cmVsOworCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzID0gTklMOwor CWNoYXIJICAgKnF1YWxuYW1lOworCWNoYXIJCXJlbGtpbmQ7CisJY2hhcgkJcmVscGVyc2lzdGVu Y2U7CisJYm9vbAkJaXNfdHlwZWQ7CisJQWNsUmVzdWx0CWFjbHJlc3VsdDsKKworCXJlbCA9IHRh YmxlX29wZW4ocmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZWxraW5kID0gcmVsLT5yZF9y ZWwtPnJlbGtpbmQ7CisJcmVscGVyc2lzdGVuY2UgPSByZWwtPnJkX3JlbC0+cmVscGVyc2lzdGVu Y2U7CisJaXNfdHlwZWQgPSBPaWRJc1ZhbGlkKHJlbC0+cmRfcmVsLT5yZWxvZnR5cGUpOworCisJ LyoKKwkgKiBUaGUgaW5pdGlhbCBjdXQgb25seSBzdXBwb3J0cyBvcmRpbmFyeSBhbmQgcGFydGl0 aW9uZWQgdGFibGVzLiAgVmlld3MsCisJICogbWF0dmlld3MsIGZvcmVpZ24gdGFibGVzLCBzZXF1 ZW5jZXMsIGluZGV4ZXMsIGNvbXBvc2l0ZSB0eXBlcywgYW5kCisJICogVE9BU1QgdGFibGVzIGFy ZSBvdXQgb2Ygc2NvcGUgZm9yIG5vdy4KKwkgKi8KKwlpZiAocmVsa2luZCAhPSBSRUxLSU5EX1JF TEFUSU9OICYmIHJlbGtpbmQgIT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKKwl7CisJCWNo YXIJICAgKnJlbG5hbWUgPSBwc3RyZHVwKFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpOwor CisJCXRhYmxlX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJZXJlcG9ydChFUlJPUiwK KwkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKKwkJCQkgZXJybXNnKCJc IiVzXCIgaXMgbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlIiwKKwkJCQkJCXJl bG5hbWUpKSk7CisJfQorCisJLyogQ2FsbGVyIG5lZWRzIFNFTEVDVCBvbiB0aGUgdGFibGUgdG8g cmVhZCBpdHMgZGVmaW5pdGlvbi4gKi8KKwlhY2xyZXN1bHQgPSBwZ19jbGFzc19hY2xjaGVjayhy ZWxpZCwgR2V0VXNlcklkKCksIEFDTF9TRUxFQ1QpOworCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hF Q0tfT0spCisJCWFjbGNoZWNrX2Vycm9yKGFjbHJlc3VsdCwgT0JKRUNUX1RBQkxFLAorCQkJCQkg ICBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKTsKKworCXF1YWxuYW1lID0gbG9va3VwX3F1 YWxpZmllZF9yZWxuYW1lKHJlbGlkKTsKKworCWluaXRTdHJpbmdJbmZvKCZidWYpOworCisJLyog cGdfY2xhc3MgdHVwbGUg4oCUIGZvciByZWxwYXJ0Ym91bmQgYW5kIHJlbG9wdGlvbnMgKi8KKwl7 CisJCUhlYXBUdXBsZQljbGFzc3R1cDsKKwkJRGF0dW0JCXJlbG9wdERhdHVtOworCQlib29sCQly ZWxvcHRJc251bGw7CisKKwkJY2xhc3N0dXAgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lELCBPYmpl Y3RJZEdldERhdHVtKHJlbGlkKSk7CisJCWlmICghSGVhcFR1cGxlSXNWYWxpZChjbGFzc3R1cCkp CisJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24gJXUiLCBy ZWxpZCk7CisKKwkJcmVsb3B0RGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoUkVMT0lELCBjbGFzc3R1 cCwKKwkJCQkJCQkJCSAgQW51bV9wZ19jbGFzc19yZWxvcHRpb25zLCAmcmVsb3B0SXNudWxsKTsK KworCQkvKgorCQkgKiBDUkVBVEUgW1RFTVBPUkFSWSB8IFVOTE9HR0VEXSBUQUJMRSBxdWFsbmFt ZSAuLi4KKwkJICoKKwkJICogUGVyc2lzdGVuY2UgYXBwbGllcyB1bmlmb3JtbHkgdG8gYWxsIHRo cmVlIENSRUFURSBUQUJMRSBmb3JtcworCQkgKiAocmVndWxhciBjb2x1bW4gbGlzdCwgT0YgdHlw ZV9uYW1lLCBhbmQgUEFSVElUSU9OIE9GKS4gIE9ubHkgb25lCisJCSAqIG9mIFRFTVBPUkFSWSAv IFVOTE9HR0VEIGNhbiBiZSBzZXQ7IHRoZSByZWxwZXJzaXN0ZW5jZSBjYXRhbG9nCisJCSAqIGZp ZWxkIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoLgorCQkgKi8KKwkJYXBwZW5kU3RyaW5n SW5mb1N0cmluZygmYnVmLCAiQ1JFQVRFICIpOworCQlpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVM UEVSU0lTVEVOQ0VfVEVNUCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmJ1ZiwgIlRFTVBP UkFSWSAiKTsKKwkJZWxzZSBpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0VfVU5M T0dHRUQpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYsICJVTkxPR0dFRCAiKTsKKwkJ YXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiVEFCTEUgJXMiLCBxdWFsbmFtZSk7CisKKwkJaWYgKHJl bC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlvbikKKwkJeworCQkJLyogUEFSVElUSU9OIE9GIHBhcmVu dCBGT1IgVkFMVUVTIC4uLiAqLworCQkJT2lkCQkJcGFyZW50T2lkID0gZ2V0X3BhcnRpdGlvbl9w YXJlbnQocmVsaWQsIHRydWUpOworCQkJY2hhcgkgICAqcGFyZW50UXVhbCA9IGxvb2t1cF9xdWFs aWZpZWRfcmVsbmFtZShwYXJlbnRPaWQpOworCQkJY2hhcgkgICAqcGFyZW50UmVsbmFtZSA9IGdl dF9yZWxfbmFtZShwYXJlbnRPaWQpOworCQkJRGF0dW0JCWJvdW5kRGF0dW07CisJCQlib29sCQli b3VuZElzbnVsbDsKKwkJCWNoYXIJICAgKmZvclZhbHVlcyA9IE5VTEw7CisJCQljaGFyCSAgICpi b3VuZFN0ciA9IE5VTEw7CisKKwkJCWlmIChwYXJlbnRSZWxuYW1lID09IE5VTEwpCisJCQkJZXJl cG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJ CQkJCQkgZXJybXNnKCJwYXJ0aXRpb24gcGFyZW50IHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0 IiwKKwkJCQkJCQkJcGFyZW50T2lkKSwKKwkJCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJl ZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKworCQkJYm91bmREYXR1bSA9IFN5c0NhY2hl R2V0QXR0cihSRUxPSUQsIGNsYXNzdHVwLAorCQkJCQkJCQkJCSBBbnVtX3BnX2NsYXNzX3JlbHBh cnRib3VuZCwgJmJvdW5kSXNudWxsKTsKKwkJCWlmICghYm91bmRJc251bGwpCisJCQl7CisJCQkJ Tm9kZQkgICAqYm91bmROb2RlOworCQkJCUxpc3QJICAgKmRwY29udGV4dDsKKworCQkJCWJvdW5k U3RyID0gVGV4dERhdHVtR2V0Q1N0cmluZyhib3VuZERhdHVtKTsKKwkJCQlib3VuZE5vZGUgPSBz dHJpbmdUb05vZGUoYm91bmRTdHIpOworCQkJCWRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9m b3IocGFyZW50UmVsbmFtZSwgcGFyZW50T2lkKTsKKwkJCQlmb3JWYWx1ZXMgPSBkZXBhcnNlX2V4 cHJlc3Npb24oYm91bmROb2RlLCBkcGNvbnRleHQsIGZhbHNlLCBmYWxzZSk7CisJCQl9CisKKwkJ CWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIiBQQVJUSVRJT04gT0YgJXMgJXMiLAorCQkJCQkJCSBw YXJlbnRRdWFsLCBmb3JWYWx1ZXMgPyBmb3JWYWx1ZXMgOiAiREVGQVVMVCIpOworCQkJaWYgKGZv clZhbHVlcykKKwkJCQlwZnJlZShmb3JWYWx1ZXMpOworCQkJaWYgKGJvdW5kU3RyKQorCQkJCXBm cmVlKGJvdW5kU3RyKTsKKwkJCXBmcmVlKHBhcmVudFF1YWwpOworCQkJcGZyZWUocGFyZW50UmVs bmFtZSk7CisKKwkJCS8qCisJCQkgKiBDb2x1bW4tbGV2ZWwgb3ZlcnJpZGVzIHJlZGVjbGFyZWQg b24gdGhlIGNoaWxkIGFyZSBlbWl0dGVkCisJCQkgKiBvdXQtb2YtbGluZTogTk9UIE5VTEwvQ0hF Q0sgY29tZSB0aHJvdWdoIHRoZSBjb25zdHJhaW50IGxvb3AKKwkJCSAqIChjb25pc2xvY2FsPXRy dWUpLCBhbmQgREVGQVVMVCBjb21lcyB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQKKwkJCSAqIEFMVEVS IENPTFVNTiBTRVQgREVGQVVMVCBwYXNzIGJlbG93LgorCQkJICovCisJCX0KKwkJZWxzZSBpZiAo aXNfdHlwZWQpCisJCXsKKwkJCS8qCisJCQkgKiBUeXBlZCB0YWJsZTogQ1JFQVRFIFRBQkxFIG5h bWUgT0YgdHlwZV9uYW1lIFsoY29sIFdJVEgKKwkJCSAqIE9QVElPTlMgLi4uKV0uICBUaGUgY29s dW1uIGxpc3QgKHdoZW4gcHJlc2VudCkgY2FycmllcyBvbmx5CisJCQkgKiBsb2NhbGx5LWFwcGxp ZWQgb3ZlcnJpZGVzIOKAlCBkZWZhdWx0cywgTk9UIE5VTEwgdG9nZ2xlcywgYW5kCisJCQkgKiBs b2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0cmFpbnRzIOKAlCBmb3IgY29sdW1ucyB3aG9zZSB0 eXBlCisJCQkgKiBpcyBvdGhlcndpc2UgZGljdGF0ZWQgYnkgcmVsb2Z0eXBlLgorCQkJICovCisJ CQljaGFyCSAgICp0eXBuYW1lID0gZm9ybWF0X3R5cGVfYmVfcXVhbGlmaWVkKHJlbC0+cmRfcmVs LT5yZWxvZnR5cGUpOworCisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICIgT0YgJXMiLCB0eXBu YW1lKTsKKwkJCXBmcmVlKHR5cG5hbWUpOworCisJCQlhcHBlbmRfdHlwZWRfY29sdW1uX292ZXJy aWRlcygmYnVmLCByZWwsIHByZXR0eSwgaW5jbHVkZV9jb25zdHJhaW50cyk7CisJCX0KKwkJZWxz ZQorCQl7CisJCQlMaXN0CSAgICpwYXJlbnRzOworCQkJTGlzdENlbGwgICAqbGM7CisJCQlib29s CQlmaXJzdDsKKworCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVmLCAiICgiKTsKKworCQkJ YXBwZW5kX2NvbHVtbl9kZWZzKCZidWYsIHJlbCwgcHJldHR5LCBpbmNsdWRlX2NvbnN0cmFpbnRz KTsKKworCQkJaWYgKHByZXR0eSkKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYsICJc bikiKTsKKwkJCWVsc2UKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAnKScpOworCisJ CQkvKiBJTkhFUklUUyAocGFyZW50MSwgcGFyZW50MiwgLi4uKSDigJQgbm9uLXBhcnRpdGlvbiBp bmhlcml0YW5jZSBvbmx5ICovCisJCQlwYXJlbnRzID0gZ2V0X2luaGVyaXRhbmNlX3BhcmVudHMo cmVsaWQpOworCQkJaWYgKHBhcmVudHMgIT0gTklMKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0lu Zm9TdHJpbmcoJmJ1ZiwgIiBJTkhFUklUUyAoIik7CisJCQkJZmlyc3QgPSB0cnVlOworCQkJCWZv cmVhY2gobGMsIHBhcmVudHMpCisJCQkJeworCQkJCQlPaWQJCQlwb2lkID0gbGZpcnN0X29pZChs Yyk7CisJCQkJCWNoYXIJICAgKnBuYW1lID0gbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lKHBvaWQp OworCisJCQkJCWlmICghZmlyc3QpCisJCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYs ICIsICIpOworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KCZidWYsIHBuYW1lKTsKKwkJCQkJcGZyZWUocG5hbWUpOworCQkJCX0KKwkJCQlhcHBlbmRTdHJp bmdJbmZvQ2hhcigmYnVmLCAnKScpOworCQkJCWxpc3RfZnJlZShwYXJlbnRzKTsKKwkJCX0KKwkJ fQorCisJCS8qIFBBUlRJVElPTiBCWSDigJQgYXBwbGllcyB3aGVuZXZlciB0aGlzIHJlbGF0aW9u IGlzIGEgcGFydGl0aW9uZWQgdGFibGUgKi8KKwkJaWYgKHJlbGtpbmQgPT0gUkVMS0lORF9QQVJU SVRJT05FRF9UQUJMRSkKKwkJeworCQkJRGF0dW0JCXBhcnRrZXlEYXR1bTsKKwkJCWNoYXIJICAg KnBhcnRrZXk7CisKKwkJCXBhcnRrZXlEYXR1bSA9IE9pZEZ1bmN0aW9uQ2FsbDEoRl9QR19HRVRf UEFSVEtFWURFRiwKKwkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCQkJcGFy dGtleSA9IFRleHREYXR1bUdldENTdHJpbmcocGFydGtleURhdHVtKTsKKwkJCWFwcGVuZFN0cmlu Z0luZm8oJmJ1ZiwgIiBQQVJUSVRJT04gQlkgJXMiLCBwYXJ0a2V5KTsKKwkJCXBmcmVlKHBhcnRr ZXkpOworCQl9CisKKwkJLyoKKwkJICogVVNJTkcgbWV0aG9kIOKAlCBlbWl0IG9ubHkgd2hlbiB0 aGUgdGFibGUgYWNjZXNzIG1ldGhvZCBkaWZmZXJzCisJCSAqIGZyb20gaGVhcCAodGhlIGNsdXN0 ZXIgZGVmYXVsdCkuICBQbHVnZ2FibGUgdGFibGUgQU1zIGhhdmUgYmVlbgorCQkgKiBzdXBwb3J0 ZWQgc2luY2UgUG9zdGdyZVNRTCAxMi4KKwkJICovCisJCWlmIChPaWRJc1ZhbGlkKHJlbC0+cmRf cmVsLT5yZWxhbSkgJiYKKwkJCXJlbC0+cmRfcmVsLT5yZWxhbSAhPSBIRUFQX1RBQkxFX0FNX09J RCkKKwkJeworCQkJY2hhcgkgICAqYW1uYW1lID0gZ2V0X2FtX25hbWUocmVsLT5yZF9yZWwtPnJl bGFtKTsKKworCQkJaWYgKGFtbmFtZSAhPSBOVUxMKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0lu Zm8oJmJ1ZiwgIiBVU0lORyAlcyIsIHF1b3RlX2lkZW50aWZpZXIoYW1uYW1lKSk7CisJCQkJcGZy ZWUoYW1uYW1lKTsKKwkJCX0KKwkJfQorCisJCS8qIFdJVEggKHJlbG9wdGlvbnMpICovCisJCWlm ICghcmVsb3B0SXNudWxsKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYsICIg V0lUSCAoIik7CisJCQlnZXRfcmVsb3B0aW9ucygmYnVmLCByZWxvcHREYXR1bSk7CisJCQlhcHBl bmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAnKScpOworCQl9CisKKwkJUmVsZWFzZVN5c0NhY2hlKGNs YXNzdHVwKTsKKwl9CisKKwkvKiBUQUJMRVNQQUNFICovCisJaWYgKCFub190YWJsZXNwYWNlICYm IE9pZElzVmFsaWQocmVsLT5yZF9yZWwtPnJlbHRhYmxlc3BhY2UpKQorCXsKKwkJY2hhcgkgICAq dHNuYW1lID0gZ2V0X3RhYmxlc3BhY2VfbmFtZShyZWwtPnJkX3JlbC0+cmVsdGFibGVzcGFjZSk7 CisKKwkJaWYgKHRzbmFtZSAhPSBOVUxMKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYs ICIgVEFCTEVTUEFDRSAlcyIsIHF1b3RlX2lkZW50aWZpZXIodHNuYW1lKSk7CisJCQlwZnJlZSh0 c25hbWUpOworCQl9CisJfQorCisJLyoKKwkgKiBPTiBDT01NSVQgYXBwbGllcyBvbmx5IHRvIHRl bXBvcmFyeSB0YWJsZXMuICBUaGUgYWN0aW9uIGxpdmVzIGluIGEKKwkgKiBiYWNrZW5kLWxvY2Fs IGxpc3QgKG5vdCB0aGUgY2F0YWxvZykgc2luY2UgaXQncyBhIHNlc3Npb24tc2NvcGVkCisJICog cHJvcGVydHksIHNvIHRoaXMgaXMgYmVzdC1lZmZvcnQ6IHdlIGNhbiBvbmx5IHNlZSBlbnRyaWVz IHJlZ2lzdGVyZWQKKwkgKiBpbiB0aGUgY3VycmVudCBiYWNrZW5kLiAgUFJFU0VSVkUgUk9XUyBp cyB0aGUgZGVmYXVsdCBhbmQgaXMgbm90CisJICogZW1pdHRlZDsgTk9PUCBpbmRpY2F0ZXMgbm8g ZW50cnkgd2FzIGZvdW5kLgorCSAqLworCWlmIChyZWxwZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNU RU5DRV9URU1QKQorCXsKKwkJT25Db21taXRBY3Rpb24gb2MgPSBnZXRfb25fY29tbWl0X2FjdGlv bihyZWxpZCk7CisKKwkJaWYgKG9jID09IE9OQ09NTUlUX0RFTEVURV9ST1dTKQorCQkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZygmYnVmLCAiIE9OIENPTU1JVCBERUxFVEUgUk9XUyIpOworCQllbHNl IGlmIChvYyA9PSBPTkNPTU1JVF9EUk9QKQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVm LCAiIE9OIENPTU1JVCBEUk9QIik7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1Ziwg JzsnKTsKKwlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRh KSk7CisKKwkvKiBPV05FUiAqLworCWlmICghbm9fb3duZXIpCisJeworCQljaGFyCSAgICpvd25l ciA9IEdldFVzZXJOYW1lRnJvbUlkKHJlbC0+cmRfcmVsLT5yZWxvd25lciwgZmFsc2UpOworCisJ CXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQUxURVIg VEFCTEUgJXMgT1dORVIgVE8gJXM7IiwKKwkJCQkJCSBxdWFsbmFtZSwgcXVvdGVfaWRlbnRpZmll cihvd25lcikpOworCQlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1 Zi5kYXRhKSk7CisJCXBmcmVlKG93bmVyKTsKKwl9CisKKwkvKgorCSAqIFBlci1jb2x1bW4gREVG QVVMVCBvdmVycmlkZXMgb24gaW5oZXJpdGVkL3BhcnRpdGlvbiBjaGlsZHJlbi4gIFRoZQorCSAq IGNvbHVtbiBsaXN0IGluc2lkZSBDUkVBVEUgVEFCTEUgb25seSBlbWl0cyBsb2NhbGx5LWRlY2xh cmVkIGNvbHVtbnMKKwkgKiAoYXR0aXNsb2NhbD10cnVlKSwgc28gYW55IGRlZmF1bHQgc2V0IGxv Y2FsbHkgb24gYSBjb2x1bW4gdGhhdCBjYW1lCisJICogZnJvbSBhIHBhcmVudCB0YWJsZSBuZWVk cyB0byBiZSByZS1hcHBsaWVkIHdpdGggQUxURVIgQ09MVU1OIFNFVAorCSAqIERFRkFVTFQuICBO b3RlOiBOT1QgTlVMTCBvdmVycmlkZXMgY29tZSBvdXQgdGhyb3VnaCB0aGUgY29uc3RyYWludAor CSAqIGxvb3AgKFBHIDE4IHN0b3JlcyB0aGVtIGFzIG5hbWVkIHBnX2NvbnN0cmFpbnQgZW50cmll cyB3aXRoCisJICogY29uaXNsb2NhbD10cnVlKSwgYW5kIENIRUNLIG92ZXJyaWRlcyBkbyB0b28u CisJICovCisJeworCQlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsK KwkJTGlzdAkgICAqZHBjb250ZXh0ID0gTklMOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHVw ZGVzYy0+bmF0dHM7IGkrKykKKwkJeworCQkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVE ZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJCWNoYXIJICAgKmRlZnN0cjsKKworCQkJaWYgKGF0dC0+ YXR0aXNkcm9wcGVkIHx8IGF0dC0+YXR0aXNsb2NhbCB8fCAhYXR0LT5hdHRoYXNkZWYpCisJCQkJ Y29udGludWU7CisKKwkJCWRlZnN0ciA9IGZpbmRfYXR0cmRlZl90ZXh0KHJlbCwgYXR0LT5hdHRu dW0sICZkcGNvbnRleHQpOworCQkJaWYgKGRlZnN0ciA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOwor CisJCQlyZXNldFN0cmluZ0luZm8oJmJ1Zik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsCisJ CQkJCQkJICJBTFRFUiBUQUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgU0VUIERFRkFVTFQgJXM7IiwK KwkJCQkJCQkgcXVhbG5hbWUsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQt PmF0dG5hbWUpKSwKKwkJCQkJCQkgZGVmc3RyKTsKKwkJCXN0YXRlbWVudHMgPSBsYXBwZW5kKHN0 YXRlbWVudHMsIHBzdHJkdXAoYnVmLmRhdGEpKTsKKwkJCXBmcmVlKGRlZnN0cik7CisJCX0KKwl9 CisKKwkvKgorCSAqIFBlci1jb2x1bW4gYXR0b3B0aW9ucyDigJQgdGhlc2UgY2FuJ3QgYmUgc2V0 IGlubGluZSBpbiBDUkVBVEUgVEFCTEUsCisJICogc28gdGhleSBjb21lIG91dCBhcyBBTFRFUiBU QUJMRSAuLi4gQUxURVIgQ09MVU1OIGNvbCBTRVQgKC4uLikgYWZ0ZXIKKwkgKiB0aGUgdGFibGUg aXMgY3JlYXRlZC4gIFR5cGljYWwgdXNlOiBuX2Rpc3RpbmN0IG92ZXJyaWRlcyBmb3IgdGhlCisJ ICogcGxhbm5lci4KKwkgKi8KKwl7CisJCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHVwZGVzYy0+bmF0dHM7IGkrKykK KwkJeworCQkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBp KTsKKwkJCUhlYXBUdXBsZQlhdHRUdXA7CisJCQlEYXR1bQkJb3B0RGF0dW07CisJCQlib29sCQlv cHRJc251bGw7CisKKwkJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCQljb250aW51ZTsKKwor CQkJYXR0VHVwID0gU2VhcmNoU3lzQ2FjaGUyKEFUVE5VTSwKKwkJCQkJCQkJCSBPYmplY3RJZEdl dERhdHVtKHJlbGlkKSwKKwkJCQkJCQkJCSBJbnQxNkdldERhdHVtKGF0dC0+YXR0bnVtKSk7CisJ CQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoYXR0VHVwKSkKKwkJCQljb250aW51ZTsKKworCQkJb3B0 RGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoQVRUTlVNLCBhdHRUdXAsCisJCQkJCQkJCQkgICBBbnVt X3BnX2F0dHJpYnV0ZV9hdHRvcHRpb25zLCAmb3B0SXNudWxsKTsKKwkJCWlmICghb3B0SXNudWxs KQorCQkJeworCQkJCXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZv KCZidWYsICJBTFRFUiBUQUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgU0VUICgiLAorCQkJCQkJCQkg cXVhbG5hbWUsCisJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoYXR0LT5hdHRuYW1l KSkpOworCQkJCWdldF9yZWxvcHRpb25zKCZidWYsIG9wdERhdHVtKTsKKwkJCQlhcHBlbmRTdHJp bmdJbmZvU3RyaW5nKCZidWYsICIpOyIpOworCQkJCXN0YXRlbWVudHMgPSBsYXBwZW5kKHN0YXRl bWVudHMsIHBzdHJkdXAoYnVmLmRhdGEpKTsKKwkJCX0KKwkJCVJlbGVhc2VTeXNDYWNoZShhdHRU dXApOworCQl9CisJfQorCisJLyoKKwkgKiBJbmRleGVzIOKAlCBlbWl0IGEgQ1JFQVRFIElOREVY IGZvciBlYWNoIG5vbi1jb25zdHJhaW50LWJhY2tlZCBpbmRleCBvbgorCSAqIHRoZSB0YWJsZS4g IEluZGV4ZXMgdGhhdCBiYWNrIFBLL1VOSVFVRS9FWENMVURFIGNvbnN0cmFpbnRzIGFyZQorCSAq IGVtaXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBBTFRF UiBUQUJMRSAuLi4KKwkgKiBBREQgQ09OU1RSQUlOVCBzdGF0ZW1lbnQsIHdoaWNoIGNyZWF0ZXMg dGhlIGluZGV4IGltcGxpY2l0bHkuCisJICovCisJaWYgKGluY2x1ZGVfaW5kZXhlcykKKwl7CisJ CUxpc3QJICAgKmluZGV4b2lkcyA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KHJlbCk7CisJCUxpc3RD ZWxsICAgKmxjOworCisJCWZvcmVhY2gobGMsIGluZGV4b2lkcykKKwkJeworCQkJT2lkCQkJaWR4 b2lkID0gbGZpcnN0X29pZChsYyk7CisJCQljaGFyCSAgICppZHhkZWY7CisKKwkJCWlmIChPaWRJ c1ZhbGlkKGdldF9pbmRleF9jb25zdHJhaW50KGlkeG9pZCkpKQorCQkJCWNvbnRpbnVlOworCisJ CQlpZHhkZWYgPSBwZ19nZXRfaW5kZXhkZWZfc3RyaW5nKGlkeG9pZCk7CisJCQlyZXNldFN0cmlu Z0luZm8oJmJ1Zik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICIlczsiLCBpZHhkZWYpOwor CQkJc3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOwor CQkJcGZyZWUoaWR4ZGVmKTsKKwkJfQorCQlsaXN0X2ZyZWUoaW5kZXhvaWRzKTsKKwl9CisKKwkv KgorCSAqIENvbnN0cmFpbnRzIOKAlCBlbWl0IGFuIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RS QUlOVCBmb3IgZWFjaAorCSAqIGxvY2FsbHktZGVmaW5lZCBjb25zdHJhaW50IG9uIHRoZSB0YWJs ZS4gIEluaGVyaXRlZCBjb25zdHJhaW50cworCSAqIChjb25pc2xvY2FsPWZhbHNlKSBhcmUgcHJv ZHVjZWQgYnkgdGhlIHBhcmVudCdzIERETCBhbmQgcHJvcGFnYXRlZAorCSAqIGF1dG9tYXRpY2Fs bHkgYnkgSU5IRVJJVFMgLyBQQVJUSVRJT04gT0YsIHNvIHdlIHNraXAgdGhlbSBoZXJlLgorCSAq LworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCXsKKwkJUmVsYXRpb24JY29uUmVsOworCQlT eXNTY2FuRGVzYyBjb25TY2FuOworCQlTY2FuS2V5RGF0YSBjb25LZXk7CisJCUhlYXBUdXBsZQlj b25UdXA7CisKKwkJY29uUmVsID0gdGFibGVfb3BlbihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNj ZXNzU2hhcmVMb2NrKTsKKwkJU2NhbktleUluaXQoJmNvbktleSwKKwkJCQkJQW51bV9wZ19jb25z dHJhaW50X2NvbnJlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJ CQkJCU9iamVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2lu c2Nhbihjb25SZWwsIENvbnN0cmFpbnRSZWxpZFR5cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCQkg dHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoY29u VHVwID0gc3lzdGFibGVfZ2V0bmV4dChjb25TY2FuKSkpCisJCXsKKwkJCUZvcm1fcGdfY29uc3Ry YWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJCWNo YXIJICAgKmNvbmRlZjsKKworCQkJaWYgKCFjb24tPmNvbmlzbG9jYWwpCisJCQkJY29udGludWU7 CisJCQkvKiBDSEVDSyBjb25zdHJhaW50cyBhcmUgZW1pdHRlZCBpbmxpbmUgaW4gdGhlIGNvbHVt biBsaXN0LiAqLworCQkJaWYgKGNvbi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX0NIRUNLKQorCQkJ CWNvbnRpbnVlOworCisJCQljb25kZWYgPSBwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kKGNv bi0+b2lkKTsKKwkJCXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJCWFwcGVuZFN0cmluZ0luZm8o JmJ1ZiwgIiVzOyIsIGNvbmRlZik7CisJCQlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0ZW1lbnRz LCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJCQlwZnJlZShjb25kZWYpOworCQl9CisJCXN5c3RhYmxl X2VuZHNjYW4oY29uU2Nhbik7CisJCXRhYmxlX2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hhcmVMb2Nr KTsKKwl9CisKKwkvKgorCSAqIFJ1bGVzIOKAlCBlbWl0IGEgQ1JFQVRFIFJVTEUgZm9yIGVhY2gg Y2FjaGVkIHJld3JpdGUgcnVsZSBvbiB0aGUKKwkgKiByZWxhdGlvbi4gIEludGVybmFsIHJ1bGVz IChzdWNoIGFzIHRoZSBfUkVUVVJOIHJ1bGUgb24gdmlld3MpIGxpdmUgb24KKwkgKiB2aWV3cy9t YXR2aWV3cyBhbmQgZG9uJ3QgYXBwZWFyIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IHJlc3RyaWN0 ZWQKKwkgKiByZWxraW5kIGFib3ZlLgorCSAqLworCWlmIChpbmNsdWRlX3J1bGVzICYmIHJlbC0+ cmRfcnVsZXMgIT0gTlVMTCkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVsLT5yZF9ydWxl cy0+bnVtTG9ja3M7IGkrKykKKwkJeworCQkJT2lkCQkJcnVsZWlkID0gcmVsLT5yZF9ydWxlcy0+ cnVsZXNbaV0tPnJ1bGVJZDsKKwkJCURhdHVtCQlydWxlZGVmOworCQkJY2hhcgkgICAqcnVsZWRl Zl9zdHI7CisKKwkJCXJ1bGVkZWYgPSBPaWRGdW5jdGlvbkNhbGwxKEZfUEdfR0VUX1JVTEVERUZf T0lELAorCQkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShydWxlaWQpKTsKKwkJCXJ1bGVkZWZf c3RyID0gVGV4dERhdHVtR2V0Q1N0cmluZyhydWxlZGVmKTsKKwkJCXJlc2V0U3RyaW5nSW5mbygm YnVmKTsKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmJ1ZiwgcnVsZWRlZl9zdHIpOworCQkJ c3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCQkJ cGZyZWUocnVsZWRlZl9zdHIpOworCQl9CisJfQorCisJLyoKKwkgKiBFeHRlbmRlZCBzdGF0aXN0 aWNzIOKAlCBpdGVyYXRlIHBnX3N0YXRpc3RpY19leHQgYnkgc3R4cmVsaWQgYW5kIGVtaXQKKwkg KiBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9zdHJpbmcoKSBmb3IgZWFjaC4KKwkgKi8KKwlpZiAo aW5jbHVkZV9zdGF0aXN0aWNzKQorCXsKKwkJUmVsYXRpb24Jc3RhdFJlbDsKKwkJU3lzU2NhbkRl c2Mgc3RhdFNjYW47CisJCVNjYW5LZXlEYXRhIHN0YXRLZXk7CisJCUhlYXBUdXBsZQlzdGF0VHVw OworCisJCXN0YXRSZWwgPSB0YWJsZV9vcGVuKFN0YXRpc3RpY0V4dFJlbGF0aW9uSWQsIEFjY2Vz c1NoYXJlTG9jayk7CisJCVNjYW5LZXlJbml0KCZzdGF0S2V5LAorCQkJCQlBbnVtX3BnX3N0YXRp c3RpY19leHRfc3R4cmVsaWQsCisJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwK KwkJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCQlzdGF0U2NhbiA9IHN5c3RhYmxlX2Jl Z2luc2NhbihzdGF0UmVsLCBTdGF0aXN0aWNFeHRSZWxpZEluZGV4SWQsCisJCQkJCQkJCQkgIHRy dWUsIE5VTEwsIDEsICZzdGF0S2V5KTsKKworCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChzdGF0 VHVwID0gc3lzdGFibGVfZ2V0bmV4dChzdGF0U2NhbikpKQorCQl7CisJCQlGb3JtX3BnX3N0YXRp c3RpY19leHQgc3RhdCA9IChGb3JtX3BnX3N0YXRpc3RpY19leHQpIEdFVFNUUlVDVChzdGF0VHVw KTsKKwkJCWNoYXIJICAgKnN0YXRkZWYgPSBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9zdHJpbmco c3RhdC0+b2lkKTsKKworCQkJcmVzZXRTdHJpbmdJbmZvKCZidWYpOworCQkJYXBwZW5kU3RyaW5n SW5mbygmYnVmLCAiJXM7Iiwgc3RhdGRlZik7CisJCQlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0 ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJCQlwZnJlZShzdGF0ZGVmKTsKKwkJfQorCQlz eXN0YWJsZV9lbmRzY2FuKHN0YXRTY2FuKTsKKwkJdGFibGVfY2xvc2Uoc3RhdFJlbCwgQWNjZXNz U2hhcmVMb2NrKTsKKwl9CisKKwkvKgorCSAqIFJFUExJQ0EgSURFTlRJVFkg4oCUIGVtaXQgb25s eSB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdAorCSAqICgnZCcgPSB1c2UgcHJpbWFy eSBrZXkpLiAgVGhpcyBhZmZlY3RzIGxvZ2ljYWwgcmVwbGljYXRpb24KKwkgKiBiZWhhdmlvciwg c28gcm91bmQtdHJpcCBmaWRlbGl0eSBtYXR0ZXJzLgorCSAqLworCWlmIChpbmNsdWRlX3JlcGxp Y2FfaWRlbnRpdHkgJiYKKwkJcmVsLT5yZF9yZWwtPnJlbHJlcGxpZGVudCAhPSBSRVBMSUNBX0lE RU5USVRZX0RFRkFVTFQpCisJeworCQlyZXNldFN0cmluZ0luZm8oJmJ1Zik7CisJCXN3aXRjaCAo cmVsLT5yZF9yZWwtPnJlbHJlcGxpZGVudCkKKwkJeworCQkJY2FzZSBSRVBMSUNBX0lERU5USVRZ X05PVEhJTkc6CisJCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQUxURVIgVEFCTEUgJXMgUkVQ TElDQSBJREVOVElUWSBOT1RISU5HOyIsCisJCQkJCQkJCSBxdWFsbmFtZSk7CisJCQkJc3RhdGVt ZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCQkJCWJyZWFr OworCQkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0ZVTEw6CisJCQkJYXBwZW5kU3RyaW5nSW5mbygm YnVmLCAiQUxURVIgVEFCTEUgJXMgUkVQTElDQSBJREVOVElUWSBGVUxMOyIsCisJCQkJCQkJCSBx dWFsbmFtZSk7CisJCQkJc3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChi dWYuZGF0YSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0lOREVYOgor CQkJCXsKKwkJCQkJT2lkCQkJcmVwbGlkeCA9IFJlbGF0aW9uR2V0UmVwbGljYUluZGV4KHJlbCk7 CisKKwkJCQkJaWYgKE9pZElzVmFsaWQocmVwbGlkeCkpCisJCQkJCXsKKwkJCQkJCWNoYXIJICAg KmlkeG5hbWUgPSBnZXRfcmVsX25hbWUocmVwbGlkeCk7CisKKwkJCQkJCWlmIChpZHhuYW1lID09 IE5VTEwpCisJCQkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVf VU5ERUZJTkVEX09CSkVDVCksCisJCQkJCQkJCQkgZXJybXNnKCJyZXBsaWNhIGlkZW50aXR5IGlu ZGV4IHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwKKwkJCQkJCQkJCQkJcmVwbGlkeCksCisJ CQkJCQkJCQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVk LiIpKSk7CisKKwkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwKKwkJCQkJCQkJCQkgIkFMVEVS IFRBQkxFICVzIFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggJXM7IiwKKwkJCQkJCQkJCQkg cXVhbG5hbWUsCisJCQkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoaWR4bmFtZSkpOworCQkJCQkJ c3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCQkJ CQkJcGZyZWUoaWR4bmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwl9CisK KwkvKiBFTkFCTEUgLyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFkgKi8KKwlpZiAoaW5jbHVkZV9y bHMgJiYgcmVsLT5yZF9yZWwtPnJlbHJvd3NlY3VyaXR5KQorCXsKKwkJcmVzZXRTdHJpbmdJbmZv KCZidWYpOworCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICJBTFRFUiBUQUJMRSAlcyBFTkFCTEUg Uk9XIExFVkVMIFNFQ1VSSVRZOyIsCisJCQkJCQkgcXVhbG5hbWUpOworCQlzdGF0ZW1lbnRzID0g bGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJfQorCWlmIChpbmNsdWRl X3JscyAmJiByZWwtPnJkX3JlbC0+cmVsZm9yY2Vyb3dzZWN1cml0eSkKKwl7CisJCXJlc2V0U3Ry aW5nSW5mbygmYnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQUxURVIgVEFCTEUgJXMg Rk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOyIsCisJCQkJCQkgcXVhbG5hbWUpOworCQlzdGF0ZW1l bnRzID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJfQorCisJLyoK KwkgKiBUcmlnZ2VycyDigJQgc2NhZmZvbGRpbmcgb25seS4gIFRoZSBzdGFuZGFsb25lIHBnX2dl dF90cmlnZ2VyX2RkbCgpCisJICogZnVuY3Rpb24gKFBoaWwncyByZS1yb2xsKSBpcyB0aGUgaW50 ZW5kZWQgZW1pc3Npb24gcGF0aDsgb25jZSBpdAorCSAqIGxhbmRzIHRoZSBib2R5IG9mIHRoaXMg bG9vcCBiZWNvbWVzIGEgc2luZ2xlIGNhbGwgaW50byBpdC4gIFRoZQorCSAqIHNjYW4gc3RydWN0 dXJlLCBsb2NrIGFjcXVpc2l0aW9uLCBhbmQgdGdpc2ludGVybmFsIGZpbHRlciAod2hpY2gKKwkg KiBza2lwcyBGSy1iYWNraW5nIGFuZCBvdGhlciBzeXN0ZW0tZ2VuZXJhdGVkIHRyaWdnZXJzKSBh cmUgc2V0dGxlZAorCSAqIGhlcmUgc28gdGhhdCBjaGFuZ2Ugc3RheXMgbWluaW1hbC4KKwkgKi8K KwlpZiAoaW5jbHVkZV90cmlnZ2VycykKKwl7CisJCVJlbGF0aW9uCXRyaWdSZWw7CisJCVN5c1Nj YW5EZXNjIHRyaWdTY2FuOworCQlTY2FuS2V5RGF0YSB0cmlnS2V5OworCQlIZWFwVHVwbGUJdHJp Z1R1cDsKKworCQl0cmlnUmVsID0gdGFibGVfb3BlbihUcmlnZ2VyUmVsYXRpb25JZCwgQWNjZXNz U2hhcmVMb2NrKTsKKwkJU2NhbktleUluaXQoJnRyaWdLZXksCisJCQkJCUFudW1fcGdfdHJpZ2dl cl90Z3JlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJCU9i amVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJdHJpZ1NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4o dHJpZ1JlbCwgVHJpZ2dlclJlbGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCQkgIHRydWUsIE5VTEws IDEsICZ0cmlnS2V5KTsKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQodHJpZ1R1cCA9IHN5c3Rh YmxlX2dldG5leHQodHJpZ1NjYW4pKSkKKwkJeworCQkJRm9ybV9wZ190cmlnZ2VyIHRyZyA9IChG b3JtX3BnX3RyaWdnZXIpIEdFVFNUUlVDVCh0cmlnVHVwKTsKKworCQkJaWYgKHRyZy0+dGdpc2lu dGVybmFsKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUT0RPOiBhcHBlbmQgcGdfZ2V0X3RyaWdn ZXJfZGRsKHRyZy0+b2lkKSBvdXRwdXQgaGVyZS4gKi8KKwkJCSh2b2lkKSB0cmc7CisJCX0KKwkJ c3lzdGFibGVfZW5kc2Nhbih0cmlnU2Nhbik7CisJCXRhYmxlX2Nsb3NlKHRyaWdSZWwsIEFjY2Vz c1NoYXJlTG9jayk7CisJfQorCisJLyoKKwkgKiBSb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMg 4oCUIHNjYWZmb2xkaW5nIG9ubHkuICBPbmNlCisJICogcGdfZ2V0X3BvbGljeV9kZGwoKSAoYWxy ZWFkeS1zdWJtaXR0ZWQgcGF0Y2gpIGxhbmRzLCB0aGUgYm9keSBvZgorCSAqIHRoaXMgbG9vcCBi ZWNvbWVzIGEgcGVyLXBvbGljeSBjYWxsIGludG8gaXQuICBUaGUgRU5BQkxFL0ZPUkNFCisJICog Uk9XIExFVkVMIFNFQ1VSSVRZIHRvZ2dsZXMgYWJvdmUgYXJlIHRoZSBjb21wYW5pb24gY2F0YWxv ZyBmbGFncworCSAqIGFuZCBhcmUgYWxyZWFkeSBlbWl0dGVkIGluZGVwZW5kZW50bHkgb2YgcG9s aWNpZXMuCisJICovCisJaWYgKGluY2x1ZGVfcG9saWNpZXMpCisJeworCQlSZWxhdGlvbglwb2xS ZWw7CisJCVN5c1NjYW5EZXNjIHBvbFNjYW47CisJCVNjYW5LZXlEYXRhIHBvbEtleTsKKwkJSGVh cFR1cGxlCXBvbFR1cDsKKworCQlwb2xSZWwgPSB0YWJsZV9vcGVuKFBvbGljeVJlbGF0aW9uSWQs IEFjY2Vzc1NoYXJlTG9jayk7CisJCVNjYW5LZXlJbml0KCZwb2xLZXksCisJCQkJCUFudW1fcGdf cG9saWN5X3BvbHJlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJ CQkJCU9iamVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJcG9sU2NhbiA9IHN5c3RhYmxlX2JlZ2lu c2Nhbihwb2xSZWwsIFBvbGljeVBvbHJlbGlkUG9sbmFtZUluZGV4SWQsCisJCQkJCQkJCQkgdHJ1 ZSwgTlVMTCwgMSwgJnBvbEtleSk7CisJCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHBvbFR1cCA9 IHN5c3RhYmxlX2dldG5leHQocG9sU2NhbikpKQorCQl7CisJCQlGb3JtX3BnX3BvbGljeSBwb2wg PSAoRm9ybV9wZ19wb2xpY3kpIEdFVFNUUlVDVChwb2xUdXApOworCisJCQkvKiBUT0RPOiBhcHBl bmQgcGdfZ2V0X3BvbGljeV9kZGwocmVsaWQsIHBvbG5hbWUpIG91dHB1dCBoZXJlLiAqLworCQkJ KHZvaWQpIHBvbDsKKwkJfQorCQlzeXN0YWJsZV9lbmRzY2FuKHBvbFNjYW4pOworCQl0YWJsZV9j bG9zZShwb2xSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJfQorCisJLyoKKwkgKiBQYXJ0aXRpb24g Y2hpbGRyZW4g4oCUIHdoZW4gaW5jbHVkZV9wYXJ0aXRpb24gaXMgdHJ1ZSBhbmQgdGhpcyByZWxh dGlvbgorCSAqIGlzIGEgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50LCByZWN1cnNpdmVseSBlbWl0 IHRoZSBEREwgZm9yIGVhY2gKKwkgKiBkaXJlY3QgcGFydGl0aW9uIGNoaWxkLiAgRWFjaCBjaGls ZCdzIG93biBEREwgaGFuZGxlcyBmdXJ0aGVyIGxldmVscworCSAqIG9mIHN1Yi1wYXJ0aXRpb25p bmcgdGhyb3VnaCB0aGUgc2FtZSByZWN1cnNpb24uCisJICovCisJaWYgKGluY2x1ZGVfcGFydGl0 aW9uICYmIHJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKKwl7CisJCUxpc3QJ ICAgKmNoaWxkcmVuID0gZmluZF9pbmhlcml0YW5jZV9jaGlsZHJlbihyZWxpZCwgQWNjZXNzU2hh cmVMb2NrKTsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJZm9yZWFjaChsYywgY2hpbGRyZW4pCisJ CXsKKwkJCU9pZAkJCWNoaWxkb2lkID0gbGZpcnN0X29pZChsYyk7CisJCQlMaXN0CSAgICpjaGls ZHN0bXRzOworCisJCQljaGlsZHN0bXRzID0gcGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5hbChjaGls ZG9pZCwgcHJldHR5LAorCQkJCQkJCQkJCQkJICAgbm9fb3duZXIsIG5vX3RhYmxlc3BhY2UsCisJ CQkJCQkJCQkJCQkgICBpbmNsdWRlX2luZGV4ZXMsCisJCQkJCQkJCQkJCQkgICBpbmNsdWRlX2Nv bnN0cmFpbnRzLAorCQkJCQkJCQkJCQkJICAgaW5jbHVkZV9ydWxlcywKKwkJCQkJCQkJCQkJCSAg IGluY2x1ZGVfc3RhdGlzdGljcywKKwkJCQkJCQkJCQkJCSAgIGluY2x1ZGVfdHJpZ2dlcnMsCisJ CQkJCQkJCQkJCQkgICBpbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJCQkJICAgaW5jbHVkZV9y bHMsCisJCQkJCQkJCQkJCQkgICBpbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHksCisJCQkJCQkJCQkJ CQkgICBpbmNsdWRlX3BhcnRpdGlvbik7CisJCQlzdGF0ZW1lbnRzID0gbGlzdF9jb25jYXQoc3Rh dGVtZW50cywgY2hpbGRzdG10cyk7CisJCX0KKwkJbGlzdF9mcmVlKGNoaWxkcmVuKTsKKwl9CisK Kwl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJcGZyZWUoYnVmLmRhdGEpOwor CXBmcmVlKHF1YWxuYW1lKTsKKworCXJldHVybiBzdGF0ZW1lbnRzOworfQorCisvKgorICogcGdf Z2V0X3RhYmxlX2RkbAorICoJCVJldHVybiBEREwgdG8gcmVjcmVhdGUgYSB0YWJsZSBhcyBhIHNl dCBvZiB0ZXh0IHJvd3MuCisgKi8KK0RhdHVtCitwZ19nZXRfdGFibGVfZGRsKFBHX0ZVTkNUSU9O X0FSR1MpCit7CisJRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworCUxpc3QJICAgKnN0YXRlbWVu dHM7CisKKwlpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgpKQorCXsKKwkJTWVtb3J5Q29udGV4dCBvbGRj b250ZXh0OworCQlPaWQJCQlyZWxpZDsKKwkJRGRsT3B0aW9uCW9wdHNbXSA9IHsKKwkJCXsicHJl dHR5IiwgRERMX09QVF9CT09MfSwKKwkJCXsib3duZXIiLCBERExfT1BUX0JPT0x9LAorCQkJeyJ0 YWJsZXNwYWNlIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfaW5kZXhlcyIsIERETF9P UFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX2NvbnN0cmFpbnRzIiwgRERMX09QVF9CT09MfSwKKwkJ CXsiaW5jbHVkZXNfcnVsZXMiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19zdGF0aXN0 aWNzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfdHJpZ2dlcnMiLCBERExfT1BUX0JP T0x9LAorCQkJeyJpbmNsdWRlc19wb2xpY2llcyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1 ZGVzX3JscyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHki LCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19wYXJ0aXRpb24iLCBERExfT1BUX0JPT0x9 LAorCQl9OworCisJCWZ1bmNjdHggPSBTUkZfRklSU1RDQUxMX0lOSVQoKTsKKwkJb2xkY29udGV4 dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21lbW9yeV9jdHgp OworCisJCWlmIChQR19BUkdJU05VTEwoMCkpCisJCXsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRjb250ZXh0KTsKKwkJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKKwkJfQorCisJCXJl bGlkID0gUEdfR0VUQVJHX09JRCgwKTsKKwkJcGFyc2VfZGRsX29wdGlvbnMoZmNpbmZvLCAxLCBv cHRzLCBsZW5ndGhvZihvcHRzKSk7CisKKwkJc3RhdGVtZW50cyA9IHBnX2dldF90YWJsZV9kZGxf aW50ZXJuYWwocmVsaWQsCisJCQkJCQkJCQkJCSAgIG9wdHNbMF0uaXNzZXQgJiYgb3B0c1swXS5i b29sdmFsLAorCQkJCQkJCQkJCQkgICBvcHRzWzFdLmlzc2V0ICYmICFvcHRzWzFdLmJvb2x2YWws CisJCQkJCQkJCQkJCSAgIG9wdHNbMl0uaXNzZXQgJiYgIW9wdHNbMl0uYm9vbHZhbCwKKwkJCQkJ CQkJCQkJICAgIW9wdHNbM10uaXNzZXQgfHwgb3B0c1szXS5ib29sdmFsLAorCQkJCQkJCQkJCQkg ICAhb3B0c1s0XS5pc3NldCB8fCBvcHRzWzRdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRz WzVdLmlzc2V0IHx8IG9wdHNbNV0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbNl0uaXNz ZXQgfHwgb3B0c1s2XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s3XS5pc3NldCB8fCBv cHRzWzddLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzhdLmlzc2V0IHx8IG9wdHNbOF0u Ym9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbOV0uaXNzZXQgfHwgb3B0c1s5XS5ib29sdmFs LAorCQkJCQkJCQkJCQkgICAhb3B0c1sxMF0uaXNzZXQgfHwgb3B0c1sxMF0uYm9vbHZhbCwKKwkJ CQkJCQkJCQkJICAgb3B0c1sxMV0uaXNzZXQgJiYgb3B0c1sxMV0uYm9vbHZhbCk7CisJCWZ1bmNj dHgtPnVzZXJfZmN0eCA9IHN0YXRlbWVudHM7CisJCWZ1bmNjdHgtPm1heF9jYWxscyA9IGxpc3Rf bGVuZ3RoKHN0YXRlbWVudHMpOworCisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0 KTsKKwl9CisKKwlmdW5jY3R4ID0gU1JGX1BFUkNBTExfU0VUVVAoKTsKKwlzdGF0ZW1lbnRzID0g KExpc3QgKikgZnVuY2N0eC0+dXNlcl9mY3R4OworCisJaWYgKGZ1bmNjdHgtPmNhbGxfY250ciA8 IGZ1bmNjdHgtPm1heF9jYWxscykKKwl7CisJCWNoYXIJICAgKnN0bXQ7CisKKwkJc3RtdCA9IGxp c3RfbnRoKHN0YXRlbWVudHMsIGZ1bmNjdHgtPmNhbGxfY250cik7CisKKwkJU1JGX1JFVFVSTl9O RVhUKGZ1bmNjdHgsIENTdHJpbmdHZXRUZXh0RGF0dW0oc3RtdCkpOworCX0KKwllbHNlCisJewor CQlsaXN0X2ZyZWVfZGVlcChzdGF0ZW1lbnRzKTsKKwkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgp OworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IGJlMTU3YTVmYmU5Li5lNDU2YzIy NmY1MyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC04NjE1LDYgKzg2MTUsMTMgQEAKICAg cHJvYXJndHlwZXMgPT4gJ3JlZ2RhdGFiYXNlIHRleHQnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3Jl Z2RhdGFiYXNlLHRleHR9JywKICAgcHJvYXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJnZGVmYXVs dHMgPT4gJ3tOVUxMfScsCiAgIHByb3NyYyA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcgfSwKK3sg b2lkID0+ICc4MjE1JywgZGVzY3IgPT4gJ2dldCBEREwgdG8gcmVjcmVhdGUgYSB0YWJsZScsCisg IHByb25hbWUgPT4gJ3BnX2dldF90YWJsZV9kZGwnLCBwcm9yb3dzID0+ICc1MCcsIHByb3Zhcmlh ZGljID0+ICd0ZXh0JywKKyAgcHJvaXNzdHJpY3QgPT4gJ2YnLCBwcm9yZXRzZXQgPT4gJ3QnLCBw cm92b2xhdGlsZSA9PiAncycsIHByb3BhcmFsbGVsID0+ICdyJywKKyAgcHJvbmFyZ2RlZmF1bHRz ID0+ICcxJywgcHJvcmV0dHlwZSA9PiAndGV4dCcsCisgIHByb2FyZ3R5cGVzID0+ICdyZWdjbGFz cyB0ZXh0JywgcHJvYWxsYXJndHlwZXMgPT4gJ3tyZWdjbGFzcyx0ZXh0fScsCisgIHByb2FyZ21v ZGVzID0+ICd7aSx2fScsIHByb2FyZ2RlZmF1bHRzID0+ICd7TlVMTH0nLAorICBwcm9zcmMgPT4g J3BnX2dldF90YWJsZV9kZGwnIH0sCiB7IG9pZCA9PiAnMjUwOScsCiAgIGRlc2NyID0+ICdkZXBh cnNlIGFuIGVuY29kZWQgZXhwcmVzc2lvbiB3aXRoIHByZXR0eS1wcmludCBvcHRpb24nLAogICBw cm9uYW1lID0+ICdwZ19nZXRfZXhwcicsIHByb3ZvbGF0aWxlID0+ICdzJywgcHJvcmV0dHlwZSA9 PiAndGV4dCcsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaCBi L3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oCmluZGV4IGMzZDg1MThjYjYyLi4yMDg1 MDI3YzliMSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmgKKysr IGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmgKQEAgLTkyLDYgKzkyLDcgQEAgZXh0 ZXJuIHZvaWQgY2hlY2tfb2ZfdHlwZShIZWFwVHVwbGUgdHlwZXR1cGxlKTsKIAogZXh0ZXJuIHZv aWQgcmVnaXN0ZXJfb25fY29tbWl0X2FjdGlvbihPaWQgcmVsaWQsIE9uQ29tbWl0QWN0aW9uIGFj dGlvbik7CiBleHRlcm4gdm9pZCByZW1vdmVfb25fY29tbWl0X2FjdGlvbihPaWQgcmVsaWQpOwor ZXh0ZXJuIE9uQ29tbWl0QWN0aW9uIGdldF9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxpZCk7CiAK IGV4dGVybiB2b2lkIFByZUNvbW1pdF9vbl9jb21taXRfYWN0aW9ucyh2b2lkKTsKIGV4dGVybiB2 b2lkIEF0RU9YYWN0X29uX2NvbW1pdF9hY3Rpb25zKGJvb2wgaXNDb21taXQpOwpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wZ19nZXRfdGFibGVfZGRsLm91dCBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmE1ZmM4YWRkNTE1Ci0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wZ19nZXRfdGFibGVfZGRsLm91dApAQCAtMCwwICsx LDQ5OCBAQAorLS0KKy0tIHBnX2dldF90YWJsZV9kZGwKKy0tCistLSBBbGwgdGVzdHMgcGFzcyBv d25lcj0+ZmFsc2Ugc28gdGhlIEFMVEVSIFRBQkxFIE9XTkVSIFRPIGxpbmUgaXMgbm90CistLSBl bWl0dGVkLCBrZWVwaW5nIG91dHB1dCBzdGFibGUgYWNyb3NzIHRlc3QgcnVubmVycyAod2hpY2gg bWF5IHJ1biB1bmRlcgorLS0gZGlmZmVyZW50IHJvbGUgbmFtZXMpLgorLS0KK0NSRUFURSBTQ0hF TUEgcGd0YmxfZGRsX3Rlc3Q7CitTRVQgc2VhcmNoX3BhdGggPSBwZ3RibF9kZGxfdGVzdDsKKy0t IEJhc2ljIHRhYmxlIHdpdGggUFJJTUFSWSBLRVksIE5PVCBOVUxMLCBERUZBVUxULCBDT0xMQVRF LgorQ1JFQVRFIFRBQkxFIGJhc2ljICgKKyAgICBpZCBpbnQgUFJJTUFSWSBLRVksCisgICAgbmFt ZSB0ZXh0IE5PVCBOVUxMIERFRkFVTFQgJ2Fub24nIENPTExBVEUgIkMiCispOworU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2Un KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dl dF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgKCBpZCBpbnRlZ2VyIE5PVCBO VUxMLCBuYW1lIHRleHQgQ09MTEFURSAiQyIgREVGQVVMVCAnYW5vbic6OnRleHQgTk9UIE5VTEwp OworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2lj X2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJh c2ljIEFERCBDT05TVFJBSU5UIGJhc2ljX25hbWVfbm90X251bGwgTk9UIE5VTEwgbmFtZTsKKyBB TFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19wa2V5 IFBSSU1BUlkgS0VZIChpZCk7CisoNCByb3dzKQorCistLSBJZGVudGl0eSBjb2x1bW5zICh3aXRo IGRlZmF1bHQgYW5kIGN1c3RvbSBzZXF1ZW5jZSBvcHRpb25zKS4KK0NSRUFURSBUQUJMRSBpZF9j b2xzICgKKyAgICBpZF9hbHdheXMgaW50IEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFksCisg ICAgaWRfZGVmYXVsdCBpbnQgR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkKKyk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2NvbHMnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFU RSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZF9jb2xzICggaWRfYWx3YXlzIGludGVnZXIgR0VORVJB VEVEIEFMV0FZUyBBUyBJREVOVElUWSBOT1QgTlVMTCwgaWRfZGVmYXVsdCBpbnRlZ2VyIEdFTkVS QVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZIE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5pZF9jb2xzIEFERCBDT05TVFJBSU5UIGlkX2NvbHNfaWRfYWx3YXlzX25vdF9u dWxsIE5PVCBOVUxMIGlkX2Fsd2F5czsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZF9j b2xzIEFERCBDT05TVFJBSU5UIGlkX2NvbHNfaWRfZGVmYXVsdF9ub3RfbnVsbCBOT1QgTlVMTCBp ZF9kZWZhdWx0OworKDMgcm93cykKKworQ1JFQVRFIFRBQkxFIGlkX2N1c3RvbSAoCisgICAgdiBp bnQgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSAoCisgICAgICAgIFNFUVVFTkNFIE5BTUUg aWRfY3VzdG9tX3Zfc2VxCisgICAgICAgIFNUQVJUIFdJVEggMTAwIElOQ1JFTUVOVCBCWSA1Cisg ICAgICAgIE1JTlZBTFVFIDUwIE1BWFZBTFVFIDEwMDAKKyAgICAgICAgQ0FDSEUgMTAgQ1lDTEUK KyAgICApCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZF9jdXN0b20nOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJs ZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWRfY3VzdG9t ICggdiBpbnRlZ2VyIEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkgKFNUQVJUIFdJVEggMTAw IElOQ1JFTUVOVCBCWSA1IE1JTlZBTFVFIDUwIE1BWFZBTFVFIDEwMDAgQ0FDSEUgMTAgQ1lDTEUp IE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZF9jdXN0b20gQUREIENP TlNUUkFJTlQgaWRfY3VzdG9tX3Zfbm90X251bGwgTk9UIE5VTEwgdjsKKygyIHJvd3MpCisKKy0t IEdlbmVyYXRlZCBzdG9yZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxFIGdlbl9jb2xzICgKKyAgICBj ZW50cyBpbnQsCisgICAgZG9sbGFycyBudW1lcmljIEdFTkVSQVRFRCBBTFdBWVMgQVMgKGNlbnRz IC8gMTAwLjApIFNUT1JFRAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnZ2Vu X2NvbHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5nZW5fY29scyAoIGNl bnRzIGludGVnZXIsIGRvbGxhcnMgbnVtZXJpYyBHRU5FUkFURUQgQUxXQVlTIEFTICgoKGNlbnRz KTo6bnVtZXJpYyAvIDEwMC4wKSkgU1RPUkVEKTsKKygxIHJvdykKKworLS0gU1RPUkFHRSBhbmQg Q09NUFJFU1NJT04gKG9ubHkgZW1pdHRlZCB3aGVuIG5vbi1kZWZhdWx0IGZvciB0aGUgdHlwZSku CitDUkVBVEUgVEFCTEUgc3RvcmFnZV9jb2xzICgKKyAgICBhIHRleHQgU1RPUkFHRSBFWFRFUk5B TCwKKyAgICBiIHRleHQgU1RPUkFHRSBNQUlOLAorICAgIGMgdGV4dCBDT01QUkVTU0lPTiBwZ2x6 CispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzdG9yYWdlX2NvbHMnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRs X3Rlc3Quc3RvcmFnZV9jb2xzICggYSB0ZXh0IFNUT1JBR0UgRVhURVJOQUwsIGIgdGV4dCBTVE9S QUdFIE1BSU4sIGMgdGV4dCBDT01QUkVTU0lPTiBwZ2x6KTsKKygxIHJvdykKKworLS0gQ29uc3Ry YWludHM6IENIRUNLLCBVTklRVUUsIEZPUkVJR04gS0VZIChERUZFUlJBQkxFKS4KK0NSRUFURSBU QUJMRSByZWZkIChpZCBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIGNvbnMgKAorICAg IGEgaW50IENIRUNLIChhID4gMCksCisgICAgYiBpbnQgVU5JUVVFLAorICAgIGMgaW50IFJFRkVS RU5DRVMgcmVmZChpZCkgREVGRVJSQUJMRSBJTklUSUFMTFkgREVGRVJSRUQKKyk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LmNvbnMgKCBhIGludGVnZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyLCBDT05TVFJBSU5U IGNvbnNfYV9jaGVjayBDSEVDSyAoKGEgPiAwKSkpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90 ZXN0LmNvbnMgQUREIENPTlNUUkFJTlQgY29uc19iX2tleSBVTklRVUUgKGIpOworIEFMVEVSIFRB QkxFIHBndGJsX2RkbF90ZXN0LmNvbnMgQUREIENPTlNUUkFJTlQgY29uc19jX2ZrZXkgRk9SRUlH TiBLRVkgKGMpIFJFRkVSRU5DRVMgcmVmZChpZCkgREVGRVJSQUJMRSBJTklUSUFMTFkgREVGRVJS RUQ7CisoMyByb3dzKQorCistLSBJbmRleGVzOiBmdW5jdGlvbmFsIGFuZCBwYXJ0aWFsLiAgQ29u c3RyYWludC1iYWNraW5nIGluZGV4ZXMgYXJlCistLSBzdXBwcmVzc2VkICh0aGV5IGFyZSBlbWl0 dGVkIGJ5IHRoZSBjb25zdHJhaW50IGxvb3ApLgorQ1JFQVRFIFRBQkxFIGlkeGQgKGlkIGludCBQ UklNQVJZIEtFWSwgbmFtZSB0ZXh0KTsKK0NSRUFURSBJTkRFWCBpZHhkX2xvd2VyIE9OIGlkeGQg KGxvd2VyKG5hbWUpKTsKK0NSRUFURSBJTkRFWCBpZHhkX3BhcnRpYWwgT04gaWR4ZCAoaWQpIFdI RVJFIGlkID4gMTAwOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5pZHhkICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0KTsKKyBDUkVBVEUgSU5ERVgg aWR4ZF9sb3dlciBPTiBwZ3RibF9kZGxfdGVzdC5pZHhkIFVTSU5HIGJ0cmVlIChsb3dlcihuYW1l KSk7CisgQ1JFQVRFIElOREVYIGlkeGRfcGFydGlhbCBPTiBwZ3RibF9kZGxfdGVzdC5pZHhkIFVT SU5HIGJ0cmVlIChpZCkgV0hFUkUgKGlkID4gMTAwKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxf dGVzdC5pZHhkIEFERCBDT05TVFJBSU5UIGlkeGRfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7Cisg QUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCBBREQgQ09OU1RSQUlOVCBpZHhkX3BrZXkg UFJJTUFSWSBLRVkgKGlkKTsKKyg1IHJvd3MpCisKKy0tIEluaGVyaXRhbmNlLCBpbmNsdWRpbmcg YSBjaGlsZCBERUZBVUxUIG92ZXJyaWRlIG9uIGFuIGluaGVyaXRlZCBjb2x1bW4uCitDUkVBVEUg VEFCTEUgcGFyIChhIGludCBERUZBVUxUIDEsIGIgdGV4dCk7CitDUkVBVEUgVEFCTEUgY2ggKGMg aW50KSBJTkhFUklUUyAocGFyKTsKK0FMVEVSIFRBQkxFIGNoIEFMVEVSIENPTFVNTiBhIFNFVCBE RUZBVUxUIDk5OTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2gnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19n ZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNoICggYyBpbnRlZ2VyKSBJTkhF UklUUyAocGd0YmxfZGRsX3Rlc3QucGFyKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5j aCBBTFRFUiBDT0xVTU4gYSBTRVQgREVGQVVMVCA5OTk7CisoMiByb3dzKQorCistLSBQZXItY29s dW1uIGF0dG9wdGlvbnM6IGVtaXR0ZWQgYXMgQUxURVIgQ09MVU1OIFNFVCAoLi4uKS4KK0NSRUFU RSBUQUJMRSBhdHRvcHQgKGEgaW50LCBiIHRleHQpOworQUxURVIgVEFCTEUgYXR0b3B0IEFMVEVS IENPTFVNTiBhIFNFVCAobl9kaXN0aW5jdCA9IDEwMCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ2F0dG9wdCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5hdHRvcHQgKCBhIGludGVnZXIsIGIgdGV4dCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rl c3QuYXR0b3B0IEFMVEVSIENPTFVNTiBhIFNFVCAobl9kaXN0aW5jdD0nMTAwJyk7CisoMiByb3dz KQorCistLSBQYXJ0aXRpb25lZCB0YWJsZSBwYXJlbnQgKFJBTkdFIGFuZCBIQVNIKS4KK0NSRUFU RSBUQUJMRSBwYXJ0ZWRfcmFuZ2UgKGlkIGludCwgayBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAo aWQpOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2UnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUg cGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlICggaWQgaW50ZWdlciwgayBpbnRlZ2VyKSBQQVJU SVRJT04gQlkgUkFOR0UgKGlkKTsKKygxIHJvdykKKworQ1JFQVRFIFRBQkxFIHBhcnRlZF9oYXNo IChpZCBpbnQpIFBBUlRJVElPTiBCWSBIQVNIIChpZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ3BhcnRlZF9oYXNoJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJM RSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfaGFzaCAoIGlkIGludGVnZXIpIFBBUlRJVElPTiBCWSBI QVNIIChpZCk7CisoMSByb3cpCisKKy0tIFBhcnRpdGlvbiBjaGlsZHJlbjogRlJPTS9UTywgV0lU SCAobW9kdWx1cywgcmVtYWluZGVyKSwgREVGQVVMVC4KK0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFu Z2VfMSBQQVJUSVRJT04gT0YgcGFydGVkX3JhbmdlCisgICAgRk9SIFZBTFVFUyBGUk9NICgwKSBU TyAoMTAwKTsKK0FMVEVSIFRBQkxFIHBhcnRlZF9yYW5nZV8xIEFMVEVSIENPTFVNTiBrIFNFVCBE RUZBVUxUIDc7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV8x Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFy dGVkX3JhbmdlIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGd0 YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsK KygyIHJvd3MpCisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfaGFzaF8wIFBBUlRJVElPTiBPRiBwYXJ0 ZWRfaGFzaAorICAgIEZPUiBWQUxVRVMgV0lUSCAobW9kdWx1cyAyLCByZW1haW5kZXIgMCk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9oYXNoXzAnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFC TEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX2hhc2hfMCBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rl c3QucGFydGVkX2hhc2ggRk9SIFZBTFVFUyBXSVRIIChtb2R1bHVzIDIsIHJlbWFpbmRlciAwKTsK KygxIHJvdykKKworQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZV9kZWYgUEFSVElUSU9OIE9GIHBh cnRlZF9yYW5nZSBERUZBVUxUOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0 ZWRfcmFuZ2VfZGVmJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlX2Rl ZiBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlIERFRkFVTFQ7CisoMSBy b3cpCisKKy0tIFJ1bGVzLgorQ1JFQVRFIFRBQkxFIHJ0IChpZCBpbnQpOworQ1JFQVRFIFRBQkxF IHJ0X2xvZyAoaWQgaW50KTsKK0NSRUFURSBSVUxFIHJ0X2xvZ19pbnNlcnQgQVMgT04gSU5TRVJU IFRPIHJ0CisgICAgRE8gQUxTTyBJTlNFUlQgSU5UTyBydF9sb2cgVkFMVUVTIChORVcuaWQpOwor U0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdydCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu cnQgKCBpZCBpbnRlZ2VyKTsKKyBDUkVBVEUgUlVMRSBydF9sb2dfaW5zZXJ0IEFTICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgICAgT04gSU5TRVJUIFRPIHBndGJsX2RkbF90 ZXN0LnJ0IERPICBJTlNFUlQgSU5UTyBydF9sb2cgKGlkKSsKKyAgIFZBTFVFUyAobmV3LmlkKTsK KygyIHJvd3MpCisKKy0tIEV4dGVuZGVkIHN0YXRpc3RpY3MuCitDUkVBVEUgVEFCTEUgc3R4IChh IGludCwgYiBpbnQsIGMgaW50KTsKK0NSRUFURSBTVEFUSVNUSUNTIHN0eF9uZHYgKG5kaXN0aW5j dCkgT04gYSwgYiBGUk9NIHN0eDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnc3R4 Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Quc3R4ICggYSBpbnRlZ2VyLCBi IGludGVnZXIsIGMgaW50ZWdlcik7CisgQ1JFQVRFIFNUQVRJU1RJQ1MgcGd0YmxfZGRsX3Rlc3Qu c3R4X25kdiAobmRpc3RpbmN0KSBPTiBhLCBiIEZST00gc3R4OworKDIgcm93cykKKworLS0gUm93 LWxldmVsIHNlY3VyaXR5IHRvZ2dsZXMuCitDUkVBVEUgVEFCTEUgcmxzIChpZCBpbnQpOworQUxU RVIgVEFCTEUgcmxzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CitBTFRFUiBUQUJMRSBybHMg Rk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRs KCdybHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAg ICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFC TEUgcGd0YmxfZGRsX3Rlc3QucmxzICggaWQgaW50ZWdlcik7CisgQUxURVIgVEFCTEUgcGd0Ymxf ZGRsX3Rlc3QucmxzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CisgQUxURVIgVEFCTEUgcGd0 YmxfZGRsX3Rlc3QucmxzIEZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWTsKKygzIHJvd3MpCisKKy0t IFJFUExJQ0EgSURFTlRJVFk6IGVtaXR0ZWQgb25seSB3aGVuIG5vdCB0aGUgZGVmYXVsdC4KK0NS RUFURSBUQUJMRSByaV9mdWxsIChhIGludCk7CitBTFRFUiBUQUJMRSByaV9mdWxsIFJFUExJQ0Eg SURFTlRJVFkgRlVMTDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmlfZnVsbCc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgIHBnX2dl dF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5yaV9mdWxsICggYSBpbnRlZ2VyKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxf dGVzdC5yaV9mdWxsIFJFUExJQ0EgSURFTlRJVFkgRlVMTDsKKygyIHJvd3MpCisKK0NSRUFURSBU QUJMRSByaV9pZHggKGEgaW50IE5PVCBOVUxMKTsKK0NSRUFURSBVTklRVUUgSU5ERVggcmlfaWR4 X2EgT04gcmlfaWR4IChhKTsKK0FMVEVSIFRBQkxFIHJpX2lkeCBSRVBMSUNBIElERU5USVRZIFVT SU5HIElOREVYIHJpX2lkeF9hOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9p ZHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu cmlfaWR4ICggYSBpbnRlZ2VyIE5PVCBOVUxMKTsKKyBDUkVBVEUgVU5JUVVFIElOREVYIHJpX2lk eF9hIE9OIHBndGJsX2RkbF90ZXN0LnJpX2lkeCBVU0lORyBidHJlZSAoYSk7CisgQUxURVIgVEFC TEUgcGd0YmxfZGRsX3Rlc3QucmlfaWR4IEFERCBDT05TVFJBSU5UIHJpX2lkeF9hX25vdF9udWxs IE5PVCBOVUxMIGE7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucmlfaWR4IFJFUExJQ0Eg SURFTlRJVFkgVVNJTkcgSU5ERVggcmlfaWR4X2E7CisoNCByb3dzKQorCistLSBVTkxPR0dFRCAr IHJlbG9wdGlvbnMuCitDUkVBVEUgVU5MT0dHRUQgVEFCTEUgdW5vIChpZCBpbnQpIFdJVEggKGZp bGxmYWN0b3IgPSA3MCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Vubyc6OnJl Z2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBVTkxPR0dFRCBUQUJMRSBwZ3RibF9kZGxfdGVz dC51bm8gKCBpZCBpbnRlZ2VyKSBXSVRIIChmaWxsZmFjdG9yPSc3MCcpOworKDEgcm93KQorCist LSBUeXBlZCB0YWJsZSAoQ1JFQVRFIFRBQkxFIE9GIHR5cGVfbmFtZSkuICBDb2x1bW5zIGluaGVy aXRlZCBmcm9tIHRoZQorLS0gdHlwZSBlbWl0IG5vdGhpbmc7IGxvY2FsbHktYXBwbGllZCBERUZB VUxULCBOT1QgTlVMTCBhbmQgQ0hFQ0sgY29tZQorLS0gb3V0IHRocm91Z2ggYSBzaW5nbGUgIihj b2wgV0lUSCBPUFRJT05TIC4uLikiIGxpc3QuCitDUkVBVEUgVFlQRSB0eXBlZF90IEFTIChhIGlu dCwgYiB0ZXh0KTsKK0NSRUFURSBUQUJMRSB0eXBlZF9wbGFpbiBPRiB0eXBlZF90OworU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0eXBlZF9wbGFpbic6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC50eXBlZF9wbGFpbiBPRiBwZ3RibF9kZGxfdGVzdC50eXBlZF90OworKDEgcm93 KQorCitDUkVBVEUgVEFCTEUgdHlwZWRfb3ZlciBPRiB0eXBlZF90ICgKKyAgICBhIFdJVEggT1BU SU9OUyBERUZBVUxUIDcgTk9UIE5VTEwsCisgICAgYiBXSVRIIE9QVElPTlMgTk9UIE5VTEwsCisg ICAgQ09OU1RSQUlOVCBiX25vbmVtcHR5IENIRUNLIChsZW5ndGgoYikgPiAwKQorKTsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndHlwZWRfb3Zlcic6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC50 eXBlZF9vdmVyIE9GIHBndGJsX2RkbF90ZXN0LnR5cGVkX3QgKCBhIFdJVEggT1BUSU9OUyBERUZB VUxUIDcgTk9UIE5VTEwsIGIgV0lUSCBPUFRJT05TIE5PVCBOVUxMLCBDT05TVFJBSU5UIGJfbm9u ZW1wdHkgQ0hFQ0sgKChsZW5ndGgoYikgPiAwKSkpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90 ZXN0LnR5cGVkX292ZXIgQUREIENPTlNUUkFJTlQgdHlwZWRfb3Zlcl9hX25vdF9udWxsIE5PVCBO VUxMIGE7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QudHlwZWRfb3ZlciBBREQgQ09OU1RS QUlOVCB0eXBlZF9vdmVyX2Jfbm90X251bGwgTk9UIE5VTEwgYjsKKygzIHJvd3MpCisKKy0tIFRl bXBvcmFyeSB0YWJsZXMgKyBPTiBDT01NSVQuICBUZW1wIHRhYmxlcyBsaXZlIGluIGEgc2Vzc2lv bi1sb2NhbAorLS0gbmFtZXNwYWNlIHdob3NlIG5hbWUgdmFyaWVzIGJldHdlZW4gcnVucywgc28g d2Ugc3RyaXAgdGhlIHNjaGVtYQorLS0gcHJlZml4LiAgT04gQ09NTUlUIERST1Agb25seSBmaXJl cyBhdCBjb21taXQsIHNvIHRoZSBxdWVyaWVzIHRoYXQKKy0tIG5lZWQgdG8gc2VlIHRoZSBjYXRh bG9nIGVudHJ5IG11c3QgcnVuIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzCistLSB0aGUgQ1JF QVRFLgorQkVHSU47CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2RlZmF1bHQgKGlkIGludCk7CitD UkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2RlbGV0ZSAoaWQgaW50KSBPTiBDT01NSVQgREVMRVRFIFJP V1M7CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2Ryb3AgKGlkIGludCkgT04gQ09NTUlUIERST1A7 CitTRUxFQ1QgcmVnZXhwX3JlcGxhY2UobGluZSwgJyI/cGdfdGVtcF8/WzAtOV0rIj9cLicsICdw Z190ZW1wLicpIEFTIGxpbmUKK0ZST00gcGdfZ2V0X3RhYmxlX2RkbCgndGVtcF9kZWZhdWx0Jzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JF QVRFICUnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEVNUE9SQVJZIFRBQkxFIHBnX3RlbXAudGVtcF9k ZWZhdWx0ICggaWQgaW50ZWdlcik7CisoMSByb3cpCisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShs aW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBw Z19nZXRfdGFibGVfZGRsKCd0ZW1wX2RlbGV0ZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2Un KSBBUyBsaW5lCitXSEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRFTVBPUkFSWSBUQUJM RSBwZ190ZW1wLnRlbXBfZGVsZXRlICggaWQgaW50ZWdlcikgT04gQ09NTUlUIERFTEVURSBST1dT OworKDEgcm93KQorCitTRUxFQ1QgcmVnZXhwX3JlcGxhY2UobGluZSwgJyI/cGdfdGVtcF8/WzAt OV0rIj9cLicsICdwZ190ZW1wLicpIEFTIGxpbmUKK0ZST00gcGdfZ2V0X3RhYmxlX2RkbCgndGVt cF9kcm9wJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUg TElLRSAnQ1JFQVRFICUnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVB VEUgVEVNUE9SQVJZIFRBQkxFIHBnX3RlbXAudGVtcF9kcm9wICggaWQgaW50ZWdlcikgT04gQ09N TUlUIERST1A7CisoMSByb3cpCisKK1JPTExCQUNLOworLS0gUHJldHR5IG1vZGUuCitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScsICdwcmV0dHknLCAndHJ1ZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFz aWMgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAg ICBpZCBpbnRlZ2VyIE5PVCBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICArCisgICAgIG5hbWUgdGV4dCBDT0xMQVRFICJDIiBERUZB VUxUICdhbm9uJzo6dGV4dCBOT1QgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAp OworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2lj X2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJh c2ljIEFERCBDT05TVFJBSU5UIGJhc2ljX25hbWVfbm90X251bGwgTk9UIE5VTEwgbmFtZTsKKyBB TFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19wa2V5 IFBSSU1BUlkgS0VZIChpZCk7CisoNCByb3dzKQorCistLSBpbmNsdWRlc18qIGdhdGluZzogZWFj aCBzdWItb2JqZWN0IGNhdGVnb3J5IGNhbiBiZSBzdXBwcmVzc2VkIGluZGl2aWR1YWxseS4KKy0t IGluY2x1ZGVzX2luZGV4ZXM9ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBJTkRFWCBzdGF0ZW1lbnRz LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2lu ZGV4ZXMnLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRf dGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgKCBpZCBpbnRlZ2VyIE5P VCBOVUxMLCBuYW1lIHRleHQpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgQURE IENPTlNUUkFJTlQgaWR4ZF9pZF9ub3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBUQUJMRSBw Z3RibF9kZGxfdGVzdC5pZHhkIEFERCBDT05TVFJBSU5UIGlkeGRfcGtleSBQUklNQVJZIEtFWSAo aWQpOworKDMgcm93cykKKworLS0gaW5jbHVkZXNfY29uc3RyYWludHM9ZmFsc2UgaGlkZXMgYm90 aCBpbmxpbmUgQ0hFQ0sgaW4gQ1JFQVRFIFRBQkxFIGFuZAorLS0gdGhlIEFMVEVSIFRBQkxFIC4u LiBBREQgQ09OU1RSQUlOVCBsaW5lcy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn Y29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdpbmNsdWRlc19jb25zdHJhaW50cycsICdmYWxzZScpOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jb25zICggYSBp bnRlZ2VyLCBiIGludGVnZXIsIGMgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3J1 bGVzPWZhbHNlIGhpZGVzIHRoZSBDUkVBVEUgUlVMRS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgncnQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcnVsZXMnLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5ydCAoIGlkIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRlc19zdGF0aXN0aWNzPWZh bHNlIGhpZGVzIHRoZSBDUkVBVEUgU1RBVElTVElDUy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgnc3R4Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX3N0YXRpc3RpY3MnLCAnZmFsc2UnKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnN0eCAo IGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBjIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRl c19ybHM9ZmFsc2UgaGlkZXMgdGhlIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFkgdG9n Z2xlcy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVz X3JscycsICdmYWxzZScpOworICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucmxzICggaWQgaW50ZWdlcik7CisoMSBy b3cpCisKKy0tIGluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHk9ZmFsc2UgaGlkZXMgdGhlIFJFUExJ Q0EgSURFTlRJVFkgY2xhdXNlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9m dWxsJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJ2luY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHknLCAnZmFsc2UnKTsKKyAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF90ZXN0LnJpX2Z1bGwgKCBhIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRl c19wYXJ0aXRpb246IGRlZmF1bHQgaXMgZmFsc2UsIHNvIHRoZSBwYXJ0aXRpb25lZC10YWJsZSBw YXJlbnQKKy0tIERETCBvbiBpdHMgb3duIGRvZXMgbm90IGluY2x1ZGUgaXRzIGNoaWxkcmVuLiAg U2V0dGluZyBpdCB0byB0cnVlCistLSBhcHBlbmRzIHRoZSBjaGlsZHJlbidzIERETCBhZnRlciB0 aGUgcGFyZW50LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2Un OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAnaW5jbHVkZXNfcGFydGl0aW9uJywgJ3RydWUnKTsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUg cGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlICggaWQgaW50ZWdlciwgayBpbnRlZ2VyKSBQQVJU SVRJT04gQlkgUkFOR0UgKGlkKTsKKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVk X3JhbmdlXzEgUEFSVElUSU9OIE9GIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZSBGT1IgVkFM VUVTIEZST00gKDApIFRPICgxMDApOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRl ZF9yYW5nZV8xIEFMVEVSIENPTFVNTiBrIFNFVCBERUZBVUxUIDc7CisgQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZV9kZWYgUEFSVElUSU9OIE9GIHBndGJsX2RkbF90ZXN0 LnBhcnRlZF9yYW5nZSBERUZBVUxUOworKDQgcm93cykKKworLS0gRXJyb3I6IG5vdCBhbiBvcmRp bmFyeSBvciBwYXJ0aXRpb25lZCB0YWJsZS4KK0NSRUFURSBWSUVXIHYgQVMgU0VMRUNUIDEgQVMg eDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndic6OnJlZ2NsYXNzKTsKK0VSUk9S OiAgInYiIGlzIG5vdCBhbiBvcmRpbmFyeSBvciBwYXJ0aXRpb25lZCB0YWJsZQorQ1JFQVRFIFNF UVVFTkNFIHM7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3MnOjpyZWdjbGFzcyk7 CitFUlJPUjogICJzIiBpcyBub3QgYW4gb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUKKy0t IE5VTEwgYXJndW1lbnQgcmV0dXJucyBubyByb3dzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKE5VTEwpOworIHBnX2dldF90YWJsZV9kZGwgCistLS0tLS0tLS0tLS0tLS0tLS0KKygw IHJvd3MpCisKKy0tIFVucmVjb2duaXplZCBvcHRpb24uCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdib2d1cycsICd0cnVlJyk7CitFUlJPUjogIHVu cmVjb2duaXplZCBvcHRpb246ICJib2d1cyIKKy0tIE9kZCBudW1iZXIgb2YgdmFyaWFkaWMgYXJn cy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ3By ZXR0eScpOworRVJST1I6ICB2YXJpYWRpYyBhcmd1bWVudHMgbXVzdCBiZSBuYW1lL3ZhbHVlIHBh aXJzCitISU5UOiAgUHJvdmlkZSBhbiBldmVuIG51bWJlciBvZiB2YXJpYWRpYyBhcmd1bWVudHMg dGhhdCBjYW4gYmUgZGl2aWRlZCBpbnRvIHBhaXJzLgorLS0gUm91bmQtdHJpcCB2ZXJpZmljYXRp b24uICBGb3IgZXZlcnkgdGVzdCB0YWJsZSwgY2FwdHVyZSB0aGUgRERMIHRoZQorLS0gZnVuY3Rp b24gZW1pdHMsIGRyb3AgdGhlIHNjaGVtYSwgcmVwbGF5IGVhY2ggdGFibGUncyBEREwgaW4KKy0t IGRlcGVuZGVuY3kgb3JkZXIsIGFuZCBjb25maXJtIHRoYXQgcGdfZ2V0X3RhYmxlX2RkbCBvbiB0 aGUgcmVjcmVhdGVkCistLSByZWxhdGlvbiBtYXRjaGVzIHRoZSBvcmlnaW5hbCBsaW5lLWZvci1s aW5lLiAgVGhlIGZpbmFsIFNFTEVDVCBtdXN0CistLSByZXR1cm4gemVybyByb3dzLgorQ1JFQVRF IFRFTVAgVEFCTEUgcGd0YmxfZGRsX3J0X29yaWcgKG5hbWUgdGV4dCwgb3JkIGludCwgbGluZSB0 ZXh0KTsKK0lOU0VSVCBJTlRPIHBndGJsX2RkbF9ydF9vcmlnCitTRUxFQ1QgdC5uYW1lLCBvLm9y ZCwgby5saW5lCitGUk9NIChWQUxVRVMKKyAgICAgICAgKCdiYXNpYycpLCAoJ2lkX2NvbHMnKSwg KCdpZF9jdXN0b20nKSwgKCdnZW5fY29scycpLCAoJ3N0b3JhZ2VfY29scycpLAorICAgICAgICAo J3JlZmQnKSwgKCdjb25zJyksICgnaWR4ZCcpLAorICAgICAgICAoJ3BhcicpLCAoJ2NoJyksICgn YXR0b3B0JyksCisgICAgICAgICgncGFydGVkX3JhbmdlJyksICgncGFydGVkX3JhbmdlXzEnKSwg KCdwYXJ0ZWRfcmFuZ2VfZGVmJyksCisgICAgICAgICgncGFydGVkX2hhc2gnKSwgKCdwYXJ0ZWRf aGFzaF8wJyksCisgICAgICAgICgncnRfbG9nJyksICgncnQnKSwKKyAgICAgICAgKCdzdHgnKSwg KCdybHMnKSwgKCdyaV9mdWxsJyksICgncmlfaWR4JyksICgndW5vJykKKyAgICAgKSBBUyB0KG5h bWUpLAorICAgICBMQVRFUkFMIHBnX2dldF90YWJsZV9kZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8 IHQubmFtZSk6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVy JywgJ2ZhbHNlJykgV0lUSCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKTsKK0RPICQkCitERUNMQVJF CisgICAgdGFibGVzIENPTlNUQU5UIHRleHRbXSA6PSBBUlJBWVsKKyAgICAgICAgJ2Jhc2ljJywg J2lkX2NvbHMnLCAnaWRfY3VzdG9tJywgJ2dlbl9jb2xzJywgJ3N0b3JhZ2VfY29scycsCisgICAg ICAgICdyZWZkJywgJ2NvbnMnLCAnaWR4ZCcsCisgICAgICAgICdwYXInLCAnY2gnLCAnYXR0b3B0 JywKKyAgICAgICAgJ3BhcnRlZF9yYW5nZScsICdwYXJ0ZWRfcmFuZ2VfMScsICdwYXJ0ZWRfcmFu Z2VfZGVmJywKKyAgICAgICAgJ3BhcnRlZF9oYXNoJywgJ3BhcnRlZF9oYXNoXzAnLAorICAgICAg ICAncnRfbG9nJywgJ3J0JywKKyAgICAgICAgJ3N0eCcsICdybHMnLCAncmlfZnVsbCcsICdyaV9p ZHgnLCAndW5vJworICAgIF07CisgICAgdCB0ZXh0OworICAgIHN0bXQgdGV4dDsKK0JFR0lOCisg ICAgRFJPUCBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3QgQ0FTQ0FERTsKKyAgICBDUkVBVEUgU0NIRU1B IHBndGJsX2RkbF90ZXN0OworICAgIEZPUkVBQ0ggdCBJTiBBUlJBWSB0YWJsZXMgTE9PUAorICAg ICAgICBGT1Igc3RtdCBJTgorICAgICAgICAgICAgU0VMRUNUIGxpbmUgRlJPTSBwZ3RibF9kZGxf cnRfb3JpZyBXSEVSRSBuYW1lID0gdCBPUkRFUiBCWSBvcmQKKyAgICAgICAgTE9PUAorICAgICAg ICAgICAgRVhFQ1VURSBzdG10OworICAgICAgICBFTkQgTE9PUDsKKyAgICBFTkQgTE9PUDsKK0VO RCAkJDsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gMjUgb3RoZXIgb2JqZWN0cworREVUQUlM OiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBiYXNpYworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBp ZF9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlkX2N1c3RvbQorZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBnZW5fY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBzdG9yYWdlX2NvbHMKK2Ry b3AgY2FzY2FkZXMgdG8gdGFibGUgcmVmZAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjb25zCitk cm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlkeGQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFyCitk cm9wIGNhc2NhZGVzIHRvIHRhYmxlIGNoCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGF0dG9wdAor ZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwYXJ0ZWRfcmFuZ2UKK2Ryb3AgY2FzY2FkZXMgdG8gdGFi bGUgcGFydGVkX2hhc2gKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcnQKK2Ryb3AgY2FzY2FkZXMg dG8gdGFibGUgcnRfbG9nCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHN0eAorZHJvcCBjYXNjYWRl cyB0byB0YWJsZSBybHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfZnVsbAorZHJvcCBjYXNj YWRlcyB0byB0YWJsZSByaV9pZHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdW5vCitkcm9wIGNh c2NhZGVzIHRvIHR5cGUgdHlwZWRfdAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSB0eXBlZF9wbGFp bgorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSB0eXBlZF9vdmVyCitkcm9wIGNhc2NhZGVzIHRvIHZp ZXcgdgorZHJvcCBjYXNjYWRlcyB0byBzZXF1ZW5jZSBzCitXSVRIIGFmdGVyX2RkbCBBUyAoCisg ICAgU0VMRUNUIHQubmFtZSwgby5vcmQsIG8ubGluZQorICAgIEZST00gKFNFTEVDVCBESVNUSU5D VCBuYW1lIEZST00gcGd0YmxfZGRsX3J0X29yaWcpIEFTIHQsCisgICAgICAgICBMQVRFUkFMIHBn X2dldF90YWJsZV9kZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8IHQubmFtZSk6OnJlZ2NsYXNzLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScpIFdJVEgg T1JESU5BTElUWSBvKGxpbmUsIG9yZCkKKykKKyhTRUxFQ1QgJ21pc3NpbmctaW4tY29weScgQVMg a2luZCwgbmFtZSwgb3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcKKyBFWENFUFQKKyBT RUxFQ1QgJ21pc3NpbmctaW4tY29weScsIG5hbWUsIG9yZCwgbGluZSBGUk9NIGFmdGVyX2RkbCkK K1VOSU9OIEFMTAorKFNFTEVDVCAnZXh0cmEtaW4tY29weScgQVMga2luZCwgbmFtZSwgb3JkLCBs aW5lIEZST00gYWZ0ZXJfZGRsCisgRVhDRVBUCisgU0VMRUNUICdleHRyYS1pbi1jb3B5JywgbmFt ZSwgb3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcpCitPUkRFUiBCWSBraW5kLCBuYW1l LCBvcmQ7Cisga2luZCB8IG5hbWUgfCBvcmQgfCBsaW5lIAorLS0tLS0tKy0tLS0tLSstLS0tLSst LS0tLS0KKygwIHJvd3MpCisKKy0tIENsZWFudXAuCitEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVz dCBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byAyMCBvdGhlciBvYmplY3RzCitE RVRBSUw6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGJhc2ljCitkcm9wIGNhc2NhZGVzIHRvIHRh YmxlIGlkX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWRfY3VzdG9tCitkcm9wIGNhc2Nh ZGVzIHRvIHRhYmxlIGdlbl9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHN0b3JhZ2VfY29s cworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSByZWZkCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGNv bnMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWR4ZAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBw YXIKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgY2gKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgYXR0 b3B0Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRlZF9yYW5nZQorZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBwYXJ0ZWRfaGFzaAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBydF9sb2cKK2Ryb3Ag Y2FzY2FkZXMgdG8gdGFibGUgcnQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgc3R4Citkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIHJscworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSByaV9mdWxsCitkcm9w IGNhc2NhZGVzIHRvIHRhYmxlIHJpX2lkeAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSB1bm8KZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgYi9zcmMvdGVzdC9y ZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlCmluZGV4IDhmYTBhNmM0N2ZiLi45ZWNhNjRjY2EzYiAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQorKysgYi9zcmMv dGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlCkBAIC04MSw3ICs4MSw3IEBAIHRlc3Q6IGNy ZWF0ZV90YWJsZV9saWtlIGFsdGVyX2dlbmVyaWMgYWx0ZXJfb3BlcmF0b3IgbWlzYyBhc3luYyBk YnNpemUgbWVyZ2UgbWlzCiAjIGNvbGxhdGUubGludXgudXRmOCBhbmQgY29sbGF0ZS5pY3UudXRm OCB0ZXN0cyBjYW5ub3QgYmUgcnVuIGluIHBhcmFsbGVsIHdpdGggZWFjaCBvdGhlcgogIyBwc3Fs IGRlcGVuZHMgb24gY3JlYXRlX2FtCiAjIGFtdXRpbHMgZGVwZW5kcyBvbiBnZW9tZXRyeSwgY3Jl YXRlX2luZGV4X3NwZ2lzdCwgaGFzaF9pbmRleCwgYnJpbgotdGVzdDogcnVsZXMgcHNxbCBwc3Fs X2Nyb3NzdGFiIHBzcWxfcGlwZWxpbmUgYW11dGlscyBzdGF0c19leHQgY29sbGF0ZS5saW51eC51 dGY4IGNvbGxhdGUud2luZG93cy53aW4xMjUyCit0ZXN0OiBydWxlcyBwc3FsIHBzcWxfY3Jvc3N0 YWIgcHNxbF9waXBlbGluZSBhbXV0aWxzIHN0YXRzX2V4dCBjb2xsYXRlLmxpbnV4LnV0ZjggY29s bGF0ZS53aW5kb3dzLndpbjEyNTIgcGdfZ2V0X3RhYmxlX2RkbAogCiAjIC0tLS0tLS0tLS0KICMg UnVuIHRoZXNlIGFsb25lIHNvIHRoZXkgZG9uJ3QgcnVuIG91dCBvZiBwYXJhbGxlbCB3b3JrZXJz CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRsLnNxbCBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BnX2dldF90YWJsZV9kZGwuc3FsCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5jN2Y3MmJiODI0YwotLS0gL2Rldi9udWxsCisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BnX2dldF90YWJsZV9kZGwuc3FsCkBAIC0wLDAgKzEsMjc4 IEBACistLQorLS0gcGdfZ2V0X3RhYmxlX2RkbAorLS0KKy0tIEFsbCB0ZXN0cyBwYXNzIG93bmVy PT5mYWxzZSBzbyB0aGUgQUxURVIgVEFCTEUgT1dORVIgVE8gbGluZSBpcyBub3QKKy0tIGVtaXR0 ZWQsIGtlZXBpbmcgb3V0cHV0IHN0YWJsZSBhY3Jvc3MgdGVzdCBydW5uZXJzICh3aGljaCBtYXkg cnVuIHVuZGVyCistLSBkaWZmZXJlbnQgcm9sZSBuYW1lcykuCistLQorQ1JFQVRFIFNDSEVNQSBw Z3RibF9kZGxfdGVzdDsKK1NFVCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF90ZXN0OworCistLSBC YXNpYyB0YWJsZSB3aXRoIFBSSU1BUlkgS0VZLCBOT1QgTlVMTCwgREVGQVVMVCwgQ09MTEFURS4K K0NSRUFURSBUQUJMRSBiYXNpYyAoCisgICAgaWQgaW50IFBSSU1BUlkgS0VZLAorICAgIG5hbWUg dGV4dCBOT1QgTlVMTCBERUZBVUxUICdhbm9uJyBDT0xMQVRFICJDIgorKTsKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7 CisKKy0tIElkZW50aXR5IGNvbHVtbnMgKHdpdGggZGVmYXVsdCBhbmQgY3VzdG9tIHNlcXVlbmNl IG9wdGlvbnMpLgorQ1JFQVRFIFRBQkxFIGlkX2NvbHMgKAorICAgIGlkX2Fsd2F5cyBpbnQgR0VO RVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSwKKyAgICBpZF9kZWZhdWx0IGludCBHRU5FUkFURUQg QlkgREVGQVVMVCBBUyBJREVOVElUWQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgnaWRfY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworQ1JFQVRFIFRBQkxF IGlkX2N1c3RvbSAoCisgICAgdiBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSAoCisg ICAgICAgIFNFUVVFTkNFIE5BTUUgaWRfY3VzdG9tX3Zfc2VxCisgICAgICAgIFNUQVJUIFdJVEgg MTAwIElOQ1JFTUVOVCBCWSA1CisgICAgICAgIE1JTlZBTFVFIDUwIE1BWFZBTFVFIDEwMDAKKyAg ICAgICAgQ0FDSEUgMTAgQ1lDTEUKKyAgICApCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdpZF9jdXN0b20nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIEdl bmVyYXRlZCBzdG9yZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxFIGdlbl9jb2xzICgKKyAgICBjZW50 cyBpbnQsCisgICAgZG9sbGFycyBudW1lcmljIEdFTkVSQVRFRCBBTFdBWVMgQVMgKGNlbnRzIC8g MTAwLjApIFNUT1JFRAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnZ2VuX2Nv bHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFNUT1JBR0UgYW5kIENPTVBS RVNTSU9OIChvbmx5IGVtaXR0ZWQgd2hlbiBub24tZGVmYXVsdCBmb3IgdGhlIHR5cGUpLgorQ1JF QVRFIFRBQkxFIHN0b3JhZ2VfY29scyAoCisgICAgYSB0ZXh0IFNUT1JBR0UgRVhURVJOQUwsCisg ICAgYiB0ZXh0IFNUT1JBR0UgTUFJTiwKKyAgICBjIHRleHQgQ09NUFJFU1NJT04gcGdsegorKTsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnc3RvcmFnZV9jb2xzJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworCistLSBDb25zdHJhaW50czogQ0hFQ0ssIFVOSVFVRSwgRk9S RUlHTiBLRVkgKERFRkVSUkFCTEUpLgorQ1JFQVRFIFRBQkxFIHJlZmQgKGlkIGludCBQUklNQVJZ IEtFWSk7CitDUkVBVEUgVEFCTEUgY29ucyAoCisgICAgYSBpbnQgQ0hFQ0sgKGEgPiAwKSwKKyAg ICBiIGludCBVTklRVUUsCisgICAgYyBpbnQgUkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxF IElOSVRJQUxMWSBERUZFUlJFRAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn Y29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gSW5kZXhlczogZnVuY3Rp b25hbCBhbmQgcGFydGlhbC4gIENvbnN0cmFpbnQtYmFja2luZyBpbmRleGVzIGFyZQorLS0gc3Vw cHJlc3NlZCAodGhleSBhcmUgZW1pdHRlZCBieSB0aGUgY29uc3RyYWludCBsb29wKS4KK0NSRUFU RSBUQUJMRSBpZHhkIChpZCBpbnQgUFJJTUFSWSBLRVksIG5hbWUgdGV4dCk7CitDUkVBVEUgSU5E RVggaWR4ZF9sb3dlciBPTiBpZHhkIChsb3dlcihuYW1lKSk7CitDUkVBVEUgSU5ERVggaWR4ZF9w YXJ0aWFsIE9OIGlkeGQgKGlkKSBXSEVSRSBpZCA+IDEwMDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgnaWR4ZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gSW5o ZXJpdGFuY2UsIGluY2x1ZGluZyBhIGNoaWxkIERFRkFVTFQgb3ZlcnJpZGUgb24gYW4gaW5oZXJp dGVkIGNvbHVtbi4KK0NSRUFURSBUQUJMRSBwYXIgKGEgaW50IERFRkFVTFQgMSwgYiB0ZXh0KTsK K0NSRUFURSBUQUJMRSBjaCAoYyBpbnQpIElOSEVSSVRTIChwYXIpOworQUxURVIgVEFCTEUgY2gg QUxURVIgQ09MVU1OIGEgU0VUIERFRkFVTFQgOTk5OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdjaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gUGVyLWNvbHVt biBhdHRvcHRpb25zOiBlbWl0dGVkIGFzIEFMVEVSIENPTFVNTiBTRVQgKC4uLikuCitDUkVBVEUg VEFCTEUgYXR0b3B0IChhIGludCwgYiB0ZXh0KTsKK0FMVEVSIFRBQkxFIGF0dG9wdCBBTFRFUiBD T0xVTU4gYSBTRVQgKG5fZGlzdGluY3QgPSAxMDApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdhdHRvcHQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFBhcnRp dGlvbmVkIHRhYmxlIHBhcmVudCAoUkFOR0UgYW5kIEhBU0gpLgorQ1JFQVRFIFRBQkxFIHBhcnRl ZF9yYW5nZSAoaWQgaW50LCBrIGludCkgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZSc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKworQ1JFQVRFIFRBQkxFIHBhcnRlZF9oYXNoIChpZCBpbnQpIFBBUlRJVElP TiBCWSBIQVNIIChpZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9o YXNoJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBQYXJ0aXRpb24gY2hpbGRy ZW46IEZST00vVE8sIFdJVEggKG1vZHVsdXMsIHJlbWFpbmRlciksIERFRkFVTFQuCitDUkVBVEUg VEFCTEUgcGFydGVkX3JhbmdlXzEgUEFSVElUSU9OIE9GIHBhcnRlZF9yYW5nZQorICAgIEZPUiBW QUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitBTFRFUiBUQUJMRSBwYXJ0ZWRfcmFuZ2VfMSBBTFRF UiBDT0xVTU4gayBTRVQgREVGQVVMVCA3OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRs KCdwYXJ0ZWRfcmFuZ2VfMSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworQ1JFQVRF IFRBQkxFIHBhcnRlZF9oYXNoXzAgUEFSVElUSU9OIE9GIHBhcnRlZF9oYXNoCisgICAgRk9SIFZB TFVFUyBXSVRIIChtb2R1bHVzIDIsIHJlbWFpbmRlciAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgncGFydGVkX2hhc2hfMCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK KworQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZV9kZWYgUEFSVElUSU9OIE9GIHBhcnRlZF9yYW5n ZSBERUZBVUxUOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2Vf ZGVmJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBSdWxlcy4KK0NSRUFURSBU QUJMRSBydCAoaWQgaW50KTsKK0NSRUFURSBUQUJMRSBydF9sb2cgKGlkIGludCk7CitDUkVBVEUg UlVMRSBydF9sb2dfaW5zZXJ0IEFTIE9OIElOU0VSVCBUTyBydAorICAgIERPIEFMU08gSU5TRVJU IElOVE8gcnRfbG9nIFZBTFVFUyAoTkVXLmlkKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncnQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIEV4dGVuZGVkIHN0 YXRpc3RpY3MuCitDUkVBVEUgVEFCTEUgc3R4IChhIGludCwgYiBpbnQsIGMgaW50KTsKK0NSRUFU RSBTVEFUSVNUSUNTIHN0eF9uZHYgKG5kaXN0aW5jdCkgT04gYSwgYiBGUk9NIHN0eDsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnc3R4Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScpOworCistLSBSb3ctbGV2ZWwgc2VjdXJpdHkgdG9nZ2xlcy4KK0NSRUFURSBUQUJMRSBybHMg KGlkIGludCk7CitBTFRFUiBUQUJMRSBybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKK0FM VEVSIFRBQkxFIHJscyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFk7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3Jscyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0g UkVQTElDQSBJREVOVElUWTogZW1pdHRlZCBvbmx5IHdoZW4gbm90IHRoZSBkZWZhdWx0LgorQ1JF QVRFIFRBQkxFIHJpX2Z1bGwgKGEgaW50KTsKK0FMVEVSIFRBQkxFIHJpX2Z1bGwgUkVQTElDQSBJ REVOVElUWSBGVUxMOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9mdWxsJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgcmlfaWR4IChhIGlu dCBOT1QgTlVMTCk7CitDUkVBVEUgVU5JUVVFIElOREVYIHJpX2lkeF9hIE9OIHJpX2lkeCAoYSk7 CitBTFRFUiBUQUJMRSByaV9pZHggUkVQTElDQSBJREVOVElUWSBVU0lORyBJTkRFWCByaV9pZHhf YTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmlfaWR4Jzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworCistLSBVTkxPR0dFRCArIHJlbG9wdGlvbnMuCitDUkVBVEUgVU5M T0dHRUQgVEFCTEUgdW5vIChpZCBpbnQpIFdJVEggKGZpbGxmYWN0b3IgPSA3MCk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Vubyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2Un KTsKKworLS0gVHlwZWQgdGFibGUgKENSRUFURSBUQUJMRSBPRiB0eXBlX25hbWUpLiAgQ29sdW1u cyBpbmhlcml0ZWQgZnJvbSB0aGUKKy0tIHR5cGUgZW1pdCBub3RoaW5nOyBsb2NhbGx5LWFwcGxp ZWQgREVGQVVMVCwgTk9UIE5VTEwgYW5kIENIRUNLIGNvbWUKKy0tIG91dCB0aHJvdWdoIGEgc2lu Z2xlICIoY29sIFdJVEggT1BUSU9OUyAuLi4pIiBsaXN0LgorQ1JFQVRFIFRZUEUgdHlwZWRfdCBB UyAoYSBpbnQsIGIgdGV4dCk7CitDUkVBVEUgVEFCTEUgdHlwZWRfcGxhaW4gT0YgdHlwZWRfdDsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndHlwZWRfcGxhaW4nOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSB0eXBlZF9vdmVyIE9GIHR5cGVkX3Qg KAorICAgIGEgV0lUSCBPUFRJT05TIERFRkFVTFQgNyBOT1QgTlVMTCwKKyAgICBiIFdJVEggT1BU SU9OUyBOT1QgTlVMTCwKKyAgICBDT05TVFJBSU5UIGJfbm9uZW1wdHkgQ0hFQ0sgKGxlbmd0aChi KSA+IDApCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0eXBlZF9vdmVyJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBUZW1wb3JhcnkgdGFibGVzICsgT04g Q09NTUlULiAgVGVtcCB0YWJsZXMgbGl2ZSBpbiBhIHNlc3Npb24tbG9jYWwKKy0tIG5hbWVzcGFj ZSB3aG9zZSBuYW1lIHZhcmllcyBiZXR3ZWVuIHJ1bnMsIHNvIHdlIHN0cmlwIHRoZSBzY2hlbWEK Ky0tIHByZWZpeC4gIE9OIENPTU1JVCBEUk9QIG9ubHkgZmlyZXMgYXQgY29tbWl0LCBzbyB0aGUg cXVlcmllcyB0aGF0CistLSBuZWVkIHRvIHNlZSB0aGUgY2F0YWxvZyBlbnRyeSBtdXN0IHJ1biBp biB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcworLS0gdGhlIENSRUFURS4KK0JFR0lOOworQ1JFQVRF IFRFTVAgVEFCTEUgdGVtcF9kZWZhdWx0IChpZCBpbnQpOworQ1JFQVRFIFRFTVAgVEFCTEUgdGVt cF9kZWxldGUgKGlkIGludCkgT04gQ09NTUlUIERFTEVURSBST1dTOworQ1JFQVRFIFRFTVAgVEFC TEUgdGVtcF9kcm9wIChpZCBpbnQpIE9OIENPTU1JVCBEUk9QOworCitTRUxFQ1QgcmVnZXhwX3Jl cGxhY2UobGluZSwgJyI/cGdfdGVtcF8/WzAtOV0rIj9cLicsICdwZ190ZW1wLicpIEFTIGxpbmUK K0ZST00gcGdfZ2V0X3RhYmxlX2RkbCgndGVtcF9kZWZhdWx0Jzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUnOworCitTRUxFQ1Qg cmVnZXhwX3JlcGxhY2UobGluZSwgJyI/cGdfdGVtcF8/WzAtOV0rIj9cLicsICdwZ190ZW1wLicp IEFTIGxpbmUKK0ZST00gcGdfZ2V0X3RhYmxlX2RkbCgndGVtcF9kZWxldGUnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBMSUtFICdDUkVBVEUgJSc7CisK K1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wuJywgJ3Bn X3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2Ryb3AnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBMSUtFICdDUkVBVEUg JSc7CitST0xMQkFDSzsKKworLS0gUHJldHR5IG1vZGUuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsICdwcmV0dHknLCAn dHJ1ZScpOworCistLSBpbmNsdWRlc18qIGdhdGluZzogZWFjaCBzdWItb2JqZWN0IGNhdGVnb3J5 IGNhbiBiZSBzdXBwcmVzc2VkIGluZGl2aWR1YWxseS4KKy0tIGluY2x1ZGVzX2luZGV4ZXM9ZmFs c2UgaGlkZXMgdGhlIENSRUFURSBJTkRFWCBzdGF0ZW1lbnRzLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2luZGV4ZXMnLCAnZmFsc2UnKTsKKwor LS0gaW5jbHVkZXNfY29uc3RyYWludHM9ZmFsc2UgaGlkZXMgYm90aCBpbmxpbmUgQ0hFQ0sgaW4g Q1JFQVRFIFRBQkxFIGFuZAorLS0gdGhlIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBs aW5lcy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRl c19jb25zdHJhaW50cycsICdmYWxzZScpOworCistLSBpbmNsdWRlc19ydWxlcz1mYWxzZSBoaWRl cyB0aGUgQ1JFQVRFIFJVTEUuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ2luY2x1ZGVzX3J1bGVzJywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVzX3N0YXRpc3RpY3M9 ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBTVEFUSVNUSUNTLgorU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdzdHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfc3RhdGlzdGljcycsICdmYWxzZScpOworCist LSBpbmNsdWRlc19ybHM9ZmFsc2UgaGlkZXMgdGhlIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VD VVJJVFkgdG9nZ2xlcy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J2luY2x1ZGVzX3JscycsICdmYWxzZScpOworCistLSBpbmNsdWRlc19yZXBsaWNhX2lkZW50aXR5 PWZhbHNlIGhpZGVzIHRoZSBSRVBMSUNBIElERU5USVRZIGNsYXVzZS4KK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgncmlfZnVsbCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19yZXBsaWNhX2lkZW50aXR5 JywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVzX3BhcnRpdGlvbjogZGVmYXVsdCBpcyBmYWxzZSwg c28gdGhlIHBhcnRpdGlvbmVkLXRhYmxlIHBhcmVudAorLS0gRERMIG9uIGl0cyBvd24gZG9lcyBu b3QgaW5jbHVkZSBpdHMgY2hpbGRyZW4uICBTZXR0aW5nIGl0IHRvIHRydWUKKy0tIGFwcGVuZHMg dGhlIGNoaWxkcmVuJ3MgRERMIGFmdGVyIHRoZSBwYXJlbnQuCitTRUxFQ1QgKiBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19wYXJ0aXRpb24nLCAndHJ1 ZScpOworCistLSBFcnJvcjogbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlLgor Q1JFQVRFIFZJRVcgdiBBUyBTRUxFQ1QgMSBBUyB4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCd2Jzo6cmVnY2xhc3MpOworCitDUkVBVEUgU0VRVUVOQ0UgczsKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3RhYmxlX2RkbCgncyc6OnJlZ2NsYXNzKTsKKworLS0gTlVMTCBhcmd1bWVudCBy ZXR1cm5zIG5vIHJvd3MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoTlVMTCk7CisK Ky0tIFVucmVjb2duaXplZCBvcHRpb24uCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J2Jhc2ljJzo6cmVnY2xhc3MsICdib2d1cycsICd0cnVlJyk7CisKKy0tIE9kZCBudW1iZXIgb2Yg dmFyaWFkaWMgYXJncy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpy ZWdjbGFzcywgJ3ByZXR0eScpOworCistLSBSb3VuZC10cmlwIHZlcmlmaWNhdGlvbi4gIEZvciBl dmVyeSB0ZXN0IHRhYmxlLCBjYXB0dXJlIHRoZSBEREwgdGhlCistLSBmdW5jdGlvbiBlbWl0cywg ZHJvcCB0aGUgc2NoZW1hLCByZXBsYXkgZWFjaCB0YWJsZSdzIERETCBpbgorLS0gZGVwZW5kZW5j eSBvcmRlciwgYW5kIGNvbmZpcm0gdGhhdCBwZ19nZXRfdGFibGVfZGRsIG9uIHRoZSByZWNyZWF0 ZWQKKy0tIHJlbGF0aW9uIG1hdGNoZXMgdGhlIG9yaWdpbmFsIGxpbmUtZm9yLWxpbmUuICBUaGUg ZmluYWwgU0VMRUNUIG11c3QKKy0tIHJldHVybiB6ZXJvIHJvd3MuCitDUkVBVEUgVEVNUCBUQUJM RSBwZ3RibF9kZGxfcnRfb3JpZyAobmFtZSB0ZXh0LCBvcmQgaW50LCBsaW5lIHRleHQpOworSU5T RVJUIElOVE8gcGd0YmxfZGRsX3J0X29yaWcKK1NFTEVDVCB0Lm5hbWUsIG8ub3JkLCBvLmxpbmUK K0ZST00gKFZBTFVFUworICAgICAgICAoJ2Jhc2ljJyksICgnaWRfY29scycpLCAoJ2lkX2N1c3Rv bScpLCAoJ2dlbl9jb2xzJyksICgnc3RvcmFnZV9jb2xzJyksCisgICAgICAgICgncmVmZCcpLCAo J2NvbnMnKSwgKCdpZHhkJyksCisgICAgICAgICgncGFyJyksICgnY2gnKSwgKCdhdHRvcHQnKSwK KyAgICAgICAgKCdwYXJ0ZWRfcmFuZ2UnKSwgKCdwYXJ0ZWRfcmFuZ2VfMScpLCAoJ3BhcnRlZF9y YW5nZV9kZWYnKSwKKyAgICAgICAgKCdwYXJ0ZWRfaGFzaCcpLCAoJ3BhcnRlZF9oYXNoXzAnKSwK KyAgICAgICAgKCdydF9sb2cnKSwgKCdydCcpLAorICAgICAgICAoJ3N0eCcpLCAoJ3JscycpLCAo J3JpX2Z1bGwnKSwgKCdyaV9pZHgnKSwgKCd1bm8nKQorICAgICApIEFTIHQobmFtZSksCisgICAg IExBVEVSQUwgcGdfZ2V0X3RhYmxlX2RkbCgoJ3BndGJsX2RkbF90ZXN0LicgfHwgdC5uYW1lKTo6 cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2Un KSBXSVRIIE9SRElOQUxJVFkgbyhsaW5lLCBvcmQpOworCitETyAkJAorREVDTEFSRQorICAgIHRh YmxlcyBDT05TVEFOVCB0ZXh0W10gOj0gQVJSQVlbCisgICAgICAgICdiYXNpYycsICdpZF9jb2xz JywgJ2lkX2N1c3RvbScsICdnZW5fY29scycsICdzdG9yYWdlX2NvbHMnLAorICAgICAgICAncmVm ZCcsICdjb25zJywgJ2lkeGQnLAorICAgICAgICAncGFyJywgJ2NoJywgJ2F0dG9wdCcsCisgICAg ICAgICdwYXJ0ZWRfcmFuZ2UnLCAncGFydGVkX3JhbmdlXzEnLCAncGFydGVkX3JhbmdlX2RlZics CisgICAgICAgICdwYXJ0ZWRfaGFzaCcsICdwYXJ0ZWRfaGFzaF8wJywKKyAgICAgICAgJ3J0X2xv ZycsICdydCcsCisgICAgICAgICdzdHgnLCAncmxzJywgJ3JpX2Z1bGwnLCAncmlfaWR4JywgJ3Vu bycKKyAgICBdOworICAgIHQgdGV4dDsKKyAgICBzdG10IHRleHQ7CitCRUdJTgorICAgIERST1Ag U0NIRU1BIHBndGJsX2RkbF90ZXN0IENBU0NBREU7CisgICAgQ1JFQVRFIFNDSEVNQSBwZ3RibF9k ZGxfdGVzdDsKKyAgICBGT1JFQUNIIHQgSU4gQVJSQVkgdGFibGVzIExPT1AKKyAgICAgICAgRk9S IHN0bXQgSU4KKyAgICAgICAgICAgIFNFTEVDVCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcg V0hFUkUgbmFtZSA9IHQgT1JERVIgQlkgb3JkCisgICAgICAgIExPT1AKKyAgICAgICAgICAgIEVY RUNVVEUgc3RtdDsKKyAgICAgICAgRU5EIExPT1A7CisgICAgRU5EIExPT1A7CitFTkQgJCQ7CisK K1dJVEggYWZ0ZXJfZGRsIEFTICgKKyAgICBTRUxFQ1QgdC5uYW1lLCBvLm9yZCwgby5saW5lCisg ICAgRlJPTSAoU0VMRUNUIERJU1RJTkNUIG5hbWUgRlJPTSBwZ3RibF9kZGxfcnRfb3JpZykgQVMg dCwKKyAgICAgICAgIExBVEVSQUwgcGdfZ2V0X3RhYmxlX2RkbCgoJ3BndGJsX2RkbF90ZXN0Licg fHwgdC5uYW1lKTo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J293bmVyJywgJ2ZhbHNlJykgV0lUSCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKQorKQorKFNFTEVD VCAnbWlzc2luZy1pbi1jb3B5JyBBUyBraW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9k ZGxfcnRfb3JpZworIEVYQ0VQVAorIFNFTEVDVCAnbWlzc2luZy1pbi1jb3B5JywgbmFtZSwgb3Jk LCBsaW5lIEZST00gYWZ0ZXJfZGRsKQorVU5JT04gQUxMCisoU0VMRUNUICdleHRyYS1pbi1jb3B5 JyBBUyBraW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBhZnRlcl9kZGwKKyBFWENFUFQKKyBTRUxF Q1QgJ2V4dHJhLWluLWNvcHknLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9kZGxfcnRfb3Jp ZykKK09SREVSIEJZIGtpbmQsIG5hbWUsIG9yZDsKKworLS0gQ2xlYW51cC4KK0RST1AgU0NIRU1B IHBndGJsX2RkbF90ZXN0IENBU0NBREU7Ci0tIAoyLjUxLjAKCg== --000000000000752c840653bc57a2--