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 1wWsI6-002uib-1W for pgsql-hackers@arkaria.postgresql.org; Tue, 09 Jun 2026 08:58:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wWsI5-006CqU-1A for pgsql-hackers@arkaria.postgresql.org; Tue, 09 Jun 2026 08:58:33 +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 1wWsI4-006CqJ-1c for pgsql-hackers@lists.postgresql.org; Tue, 09 Jun 2026 08:58:33 +0000 Received: from mail-ej1-x632.google.com ([2a00:1450:4864:20::632]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wWsI1-00000001p5j-29mh for pgsql-hackers@lists.postgresql.org; Tue, 09 Jun 2026 08:58:31 +0000 Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-bec429c2bb1so768548566b.1 for ; Tue, 09 Jun 2026 01:58:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780995507; cv=none; d=google.com; s=arc-20240605; b=iADZzTuBnNG/pvf5N4gbuaJrC7DDO/xfNjaP5ZJddlJRW3pgap/AOAhlaF1zFaCH5D f4qU+QTM61wNvRqxFyTqnC/OaMwx2nmcwfR8vTRu6QdxAx61kQGCj++bpvhEeRZcJHoV STrRGKWBiHlHwcC6PmZy4OsVKf8v4hCZBmIxYZTrn0hXVlX1tLDGLmhbk+VTdqkwqaG5 jls4MJHWD7KJAHYOKFc3O6N2sPwaeHqYBEHZLJ7EDtG28FTF7D2/DddidhSkpcNFhWjZ lmp7pYQTCPFQw2DN3xBcpVjLPNZkVtKdzvvtX3hZYsKLQDqGLdYkhcYLKL3cZnP3QlGE aO9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=QUIlSsAN2+yxk9NUB0BF71YOPuY7xRAscAkA5AfYd28=; fh=LSmQuNY/C6x+CFIjuN+YLSRw72EgFtWrC4c8cbUInlw=; b=JU18N24oMQVO22IcmYXDX0lpLxI3WKTPMlnqplzu4g/DcFeY1RpVn0ROHKTzlg19Cj SmWAJfPnhv2RJeHM7t5sqaBwigsK0pEtpEAblK78tDGir/9Hz5oEZ1LZSDn9Vvn7UsHQ EJnnK1/EJS+nwxcW712ralpNqJvy4PuvuH9OF7hmtPrdrg8dw66JXGk8bJxrDLiy/Qcl j4vu2KOhtdomRGY/ppxaL5WER9Eg9WaaXrIAT+l0rnVAYBl2vLWVECc416UE8itG+Nnu LJ7KbtQj1DQFqDd7h8T5wEqBbkMCtg0djdMx0Ts+QlXwAcsDRGDxj3UfMMuFioQlpmjh SUyw==; darn=lists.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=1780995507; x=1781600307; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=QUIlSsAN2+yxk9NUB0BF71YOPuY7xRAscAkA5AfYd28=; b=iHnbqUuV42ijBXI+wl3gO2uvlK+GsX04OHLx34xmkslu2hxlyPODaIwCuyiTq8r5Az VlUa14qjJUapgSR2IAeWe0k1+Xse6xdkrmZ5MwHhzpcRDDmGnK10KvyzmZkofweGnoFM gKDUc82Epjk56qheqnYj0D6Y4W6sbuws63cmSt9bWfxj8VcPkN1/8H3AhrWBUcTz9oAe 6XJt/YlXIHAplEWIkFgAmzu0fFPnkKYyC0tXpCx7AF20hu+gk73NbTnzff8VrB4qfbYQ mHs5WgdyhS1MaoW07p2cPNlPOHgypW/jGEyVqXFy3YdoYyK7MJDsrK9cJyl9+7iXLVYT 3ODg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780995507; x=1781600307; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=QUIlSsAN2+yxk9NUB0BF71YOPuY7xRAscAkA5AfYd28=; b=bUjdNeBs2WkT1ygz64Ph92N5kIJoHkXRH7xFb4G4xvBcCAsbkAVevNXqBpZ9uQPI81 TcpW30f81yR8y1HpFCNKme88lox40rVqSU2uVmiIPM8/xaGwAYZ/ZexMk83ucvJ/9K+1 nDxAcqzrdq/xqAz4yoHRh0Nmc8+Yi0vKa8xXc7UloLktviS0AnLowk7uPShK2AEkuAI8 KuEW1/+QhYlKp4d4lQQ5lRdVjOqflHwcmhiyeCzFk/Hu3r1A4iR5ZaaFzAfw6J4uWp0Z 9k/H3KVCfXelg/Y4LAx9YGmQOl5vlTdOYitvIEVTT1DNRmwKv51OPgVcICAaWdbd/gTr h1zg== X-Gm-Message-State: AOJu0YyYZBFNBhJiOWfbS5514inNohV95R0XGWPx22XttCNH0yqo2bqA fyqefMJjAb3rRaCcXkFvq6l8poHwjMsUTZMEDNo6Xnw0GiaVv2gbvDTAcz3QEmp8ng+gcP2QABX 9p+HP4NYmCpNKy0dTtCcdhZJWS/5GXgYXOSIzHoq2 X-Gm-Gg: Acq92OEur3YVrxYwQ5UI7aCeNJqcqHoG9MukKgYlV3/eZvgGnckUqQp2G5Jnw09ag9W B56fmNIYciT1D706gnenX/DhBX45X2BlchYplIUyPUfVQasg8EQX7D6tdxdzanIfS6/znBrAh5n nEFeRoHorw/iYyTDPFv68tUpprgn+E6ro6FPAQ/z+qFJDL5ZoPIxqPtuQultoDKZ5Kt6SS1Hzbu mxJzaHnn94Mao5Yp4zgJnYWo873njJ/B1dOe5ILAuBsxI8/DebRbGfJg73EeO6E7gLWpFH0O4Gg kaWCEuC6AZSJc817JrY= X-Received: by 2002:a17:907:96a1:b0:bd5:ca8:768c with SMTP id a640c23a62f3a-bf37234aa66mr931833566b.31.1780995507032; Tue, 09 Jun 2026 01:58:27 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Akshay Joshi Date: Tue, 9 Jun 2026 14:28:15 +0530 X-Gm-Features: AVVi8CedN1rwSyZHUSsRZr8SHCBhgAoLmpCqKud6mtfr1d6AuttiUL84UNes3R4 Message-ID: Subject: Re: [PATCH] Add pg_get_table_ddl() to reconstruct CREATE TABLE statements To: Zsolt Parragi , Marcos Pegoraro Cc: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000008b931b0653ce5488" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008b931b0653ce5488 Content-Type: multipart/alternative; boundary="0000000000008b931a0653ce5486" --0000000000008b931a0653ce5486 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks to Zsolt and Marcos for the review. Added *schema_qualified (boolean, default true)*. When false, the target table is emitted unqualified everywhere (e.g., CREATE TABLE, ALTER TABLE, INHERITS, PARTITION OF, identity SEQUENCE NAME, etc.); same-schema sibling references follow suit; cross-schema references (e.g. FK targets in a different schema) remain qualified for correctness. Output from the always-qualified ruleutils helpers (pg_get_indexdef_string, pg_get_constraintdef_command, pg_get_ruledef, pg_get_statisticsobjdef_string) is post-processed to strip the base-schema prefix. 1) CHECK constraints on partition children are now emitted as ALTER TABLE = =E2=80=A6 ADD CONSTRAINT =E2=80=A6 CHECK (=E2=80=A6). They had been silently dropped = because the PARTITION OF form has no column list to inline them into. 2) Inherited generated columns no longer emit a spurious ALTER COLUMN =E2= =80=A6 SET DEFAULT, which would fail at replay. 3) User-named NOT NULL constraints are now emitted inline as CONSTRAINT NOT NULL. Auto-named NOT NULLs keep the existing inline-NOT NULL + ALTER TABLE dedup behaviour so the common-case output is unchanged. 4) Added regression coverage for the three bug fixes plus the schema_qualified=3Dfalse paths (same-schema vs cross-schema, INHERITS/PARTITION OF parents, custom identity sequence name, replay into a different target schema) Attached is the v3 patch, ready for review. On Tue, Jun 9, 2026 at 2:42=E2=80=AFAM Zsolt Parragi wrote: > Hello! > > I did some basic testing with the new functions, and found a few bugs: > > 1. Seems like check constraints on partitions are ignored: > > CREATE TABLE p (id int, val int) PARTITION BY RANGE (id); > CREATE TABLE p_child PARTITION OF p (CONSTRAINT chk_inline CHECK (val > 0= )) > FOR VALUES FROM (0) TO (100); > SELECT * FROM pg_get_table_ddl('p_child', 'owner','false'); > > 2. inherited stored generated columns can't be replayed: > > CREATE TABLE par_s ( > id int, > g int GENERATED ALWAYS AS (id * 2) STORED > ); > CREATE TABLE ch_s () INHERITS (par_s); > SELECT * FROM pg_get_table_ddl('ch_s', 'owner','false'); > -- CREATE TABLE public.ch_s () INHERITS (public.par_s); > -- ALTER TABLE public.ch_s ALTER COLUMN g SET DEFAULT (id * 2); > > Dropping ch_s, executing the returned statements: > > ERROR: column "g" of relation "ch_s" is a generated column > HINT: Use ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION instead. > > 3. named not null constraints can't be replayed: > > CREATE TABLE t (a int CONSTRAINT my_nn NOT NULL); > SELECT * FROM pg_get_table_ddl('t'::regclass,'owner','false'); > -- CREATE TABLE public.t ( a integer NOT NULL); > -- ALTER TABLE public.t ADD CONSTRAINT my_nn NOT NULL a; > > Dropping t, executing the statements: > > ERROR: cannot create not-null constraint "my_nn" on column "a" of table > "t" > DETAIL: A not-null constraint named "t_a_not_null" already exists for > this column. > > > --0000000000008b931a0653ce5486 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thanks to Zsolt and Marcos for the review.=C2=A0

Ad= ded schema_qualified (boolean, default true). When false, the target= table is emitted unqualified everywhere (e.g., CREATE TABLE, ALTER TABLE, = INHERITS, PARTITION OF, identity SEQUENCE NAME, etc.); same-schema sibling = references follow suit; cross-schema references (e.g. FK targets in a diffe= rent schema) remain qualified for correctness. Output from the always-quali= fied ruleutils helpers (pg_get_indexdef_string, pg_get_constraintdef_comman= d, pg_get_ruledef, pg_get_statisticsobjdef_string) is post-processed to str= ip the base-schema prefix.

1) CHECK constraints on partition childre= n are now emitted as ALTER TABLE =E2=80=A6 ADD CONSTRAINT =E2=80=A6 CHECK (= =E2=80=A6). They had been silently dropped because the PARTITION OF form ha= s no column list to inline them into. =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
2) Inher= ited generated columns no longer emit a spurious ALTER COLUMN =E2=80=A6 SET= DEFAULT, which would fail at replay.
3) User-named NOT NULL constraints= are now emitted inline as CONSTRAINT <name> NOT NULL. Auto-named NOT= NULLs keep the existing inline-NOT NULL + ALTER TABLE dedup behaviour so t= he common-case output is unchanged.
4) Added regression coverage for the= three bug fixes plus the schema_qualified=3Dfalse paths (same-schema vs cr= oss-schema, INHERITS/PARTITION OF parents, custom identity sequence name, r= eplay into a different target schema)

Attached is the v3 patch, read= y for review.

On Tue, Jun 9, 2026 at 2:42=E2=80=AFAM Z= solt Parragi <zsolt.parragi= @percona.com> wrote:
Hello!

I did some basic testing with the new functions, and found a few bugs:

1. Seems like check constraints on partitions are ignored:

CREATE TABLE p (id int, val int) PARTITION BY RANGE (id);
CREATE TABLE p_child PARTITION OF p (CONSTRAINT chk_inline CHECK (val > = 0))
=C2=A0 =C2=A0 FOR VALUES FROM (0) TO (100);
SELECT * FROM pg_get_table_ddl('p_child', 'owner','fals= e');

2. inherited stored generated columns can't be replayed:

CREATE TABLE par_s (
=C2=A0 =C2=A0 id int,
=C2=A0 =C2=A0 g int GENERATED ALWAYS AS (id * 2) STORED
);
CREATE TABLE ch_s () INHERITS (par_s);
SELECT * FROM pg_get_table_ddl('ch_s', 'owner','false&#= 39;);
-- CREATE TABLE public.ch_s () INHERITS (public.par_s);
-- ALTER TABLE public.ch_s ALTER COLUMN g SET DEFAULT (id * 2);

Dropping ch_s, executing the returned statements:

ERROR:=C2=A0 column "g" of relation "ch_s" is a generat= ed column
HINT:=C2=A0 Use ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION instead.
3. named not null constraints can't be replayed:

CREATE TABLE t (a int CONSTRAINT my_nn NOT NULL);
SELECT * FROM pg_get_table_ddl('t'::regclass,'owner','f= alse');
-- CREATE TABLE public.t ( a integer NOT NULL);
-- ALTER TABLE public.t ADD CONSTRAINT my_nn NOT NULL a;

Dropping t, executing the statements:

ERROR:=C2=A0 cannot create not-null constraint "my_nn" on column = "a" of table "t"
DETAIL:=C2=A0 A not-null constraint named "t_a_not_null" already = exists for
this column.


--0000000000008b931a0653ce5486-- --0000000000008b931b0653ce5488 Content-Type: application/octet-stream; name="v3-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Disposition: attachment; filename="v3-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mq6epj9t0 RnJvbSA0ZDFlNTg1YzU5OTBlYmM3YTAxMTM3MWNkN2ZiYTU2NTM0YWMxMWVhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBUdWUsIDIgSnVuIDIwMjYgMTQ6MTg6NDAgKzA1MzAKU3ViamVjdDogW1BB VENIIHYzXSBBZGQgcGdfZ2V0X3RhYmxlX2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBUQUJM 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 CkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9zaGlAZW50ZXJwcmlzZWRiLmNvbT4KUmV2 aWV3ZWQtYnk6IE1hcmNvcyBQZWdvcmFybyA8bWFyY29zQGYxMC5jb20uYnI+ClJldmlld2VkLWJ5 OiBac29sdCBQYXJyYWdpIDx6c29sdC5wYXJyYWdpQHBlcmNvbmEuY29tPgotLS0KIGRvYy9zcmMv c2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sICAgICAgICAgICAgICB8ICAgNzkgKwogc3JjL2JhY2tl bmQvY29tbWFuZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgICAyNyArCiBzcmMvYmFja2Vu ZC91dGlscy9hZHQvZGRsdXRpbHMuYyAgICAgICAgICAgICAgfCAxNzQ0ICsrKysrKysrKysrKysr KysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICAgICAgfCAgICA3 ICsKIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oICAgICAgICAgICAgICB8ICAgIDEg KwogLi4uL3JlZ3Jlc3MvZXhwZWN0ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQgICAgIHwgIDYzOCAr KysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgICAgICAgICAgICB8ICAg IDIgKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BnX2dldF90YWJsZV9kZGwuc3FsICAgICB8ICAz NjggKysrKwogOCBmaWxlcyBjaGFuZ2VkLCAyODY1IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90 YWJsZV9kZGwub3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdf Z2V0X3RhYmxlX2RkbC5zcWwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWlu Zm8uc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCmluZGV4IDAwZjY0ZjUw Y2ViLi42YTM0ZGVkOTYyOCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZv LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKQEAgLTM5NjEsNiAr Mzk2MSw4NSBAQCBhY2wgICAgICB8IHtwb3N0Z3Jlcz1hcndkRHh0bS9wb3N0Z3Jlcyxmb289ci9w b3N0Z3Jlc30KICAgICAgICAgPGxpdGVyYWw+VEFCTEVTUEFDRTwvbGl0ZXJhbD4uCiAgICAgICAg PC9wYXJhPjwvZW50cnk+CiAgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5 IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4KKyAg ICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgIDxwcmltYXJ5PnBnX2dldF90YWJsZV9kZGw8L3By aW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfZ2V0X3Rh YmxlX2RkbDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFyYW1ldGVy PiA8dHlwZT5yZWdjbGFzczwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFsPiwgPGxpdGVyYWw+VkFS SUFESUM8L2xpdGVyYWw+IDxwYXJhbWV0ZXI+b3B0aW9uczwvcGFyYW1ldGVyPgorICAgICAgICA8 dHlwZT50ZXh0PC90eXBlPiA8L29wdGlvbmFsPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT5zZXRv ZiB0ZXh0PC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAg ICAgIFJlY29uc3RydWN0cyB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxFPC9jb21tYW5kPiBzdGF0 ZW1lbnQgZm9yIHRoZQorICAgICAgICBzcGVjaWZpZWQgb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQg dGFibGUsIGZvbGxvd2VkIGJ5IHRoZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRTwvY29t bWFuZD4sIDxjb21tYW5kPkNSRUFURSBJTkRFWDwvY29tbWFuZD4sCisgICAgICAgIDxjb21tYW5k PkNSRUFURSBSVUxFPC9jb21tYW5kPiwgYW5kIDxjb21tYW5kPkNSRUFURSBTVEFUSVNUSUNTPC9j b21tYW5kPgorICAgICAgICBzdGF0ZW1lbnRzIG5lZWRlZCB0byByZWNyZWF0ZSB0aGUgdGFibGUn cyBjb2x1bW5zLCBjb25zdHJhaW50cywKKyAgICAgICAgaW5kZXhlcywgcnVsZXMsIGV4dGVuZGVk IHN0YXRpc3RpY3MsIGFuZCByb3ctbGV2ZWwgc2VjdXJpdHkgZmxhZ3MuCisgICAgICAgIEluaGVy aXRlZCBjb2x1bW5zIGFuZCBjb25zdHJhaW50cyBhcmUgZW1pdHRlZCBieSB0aGUgcGFyZW50IHRh YmxlJ3MKKyAgICAgICAgRERMIGFuZCBhcmUgbm90IGR1cGxpY2F0ZWQgb24gaW5oZXJpdGFuY2Ug Y2hpbGRyZW4gb3IgcGFydGl0aW9ucy4KKyAgICAgICAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0dXJu ZWQgYXMgYSBzZXBhcmF0ZSByb3cuCisgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUg c3VwcG9ydGVkOgorICAgICAgICA8bGl0ZXJhbD5wcmV0dHk8L2xpdGVyYWw+IChib29sZWFuKSBm b3IgZm9ybWF0dGVkIG91dHB1dCwKKyAgICAgICAgPGxpdGVyYWw+b3duZXI8L2xpdGVyYWw+IChi b29sZWFuKSB0byBpbmNsdWRlIHRoZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRSAuLi4g T1dORVIgVE88L2NvbW1hbmQ+IHN0YXRlbWVudCwKKyAgICAgICAgPGxpdGVyYWw+dGFibGVzcGFj ZTwvbGl0ZXJhbD4gKGJvb2xlYW4pIHRvIGluY2x1ZGUgdGhlCisgICAgICAgIDxsaXRlcmFsPlRB QkxFU1BBQ0U8L2xpdGVyYWw+IGNsYXVzZSBvbiB0aGUKKyAgICAgICAgPGNvbW1hbmQ+Q1JFQVRF IFRBQkxFPC9jb21tYW5kPiBzdGF0ZW1lbnQsIGFuZCBhIGZhbWlseSBvZgorICAgICAgICA8bGl0 ZXJhbD5pbmNsdWRlc188cmVwbGFjZWFibGU+Y2F0ZWdvcnk8L3JlcGxhY2VhYmxlPjwvbGl0ZXJh bD4KKyAgICAgICAgYm9vbGVhbnMgdGhhdCBnYXRlIGVtaXNzaW9uIG9mIG9wdGlvbmFsIHN1Yi1v YmplY3RzOgorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19pbmRleGVzPC9saXRlcmFsPiwKKyAg ICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfY29uc3RyYWludHM8L2xpdGVyYWw+LAorICAgICAgICA8 bGl0ZXJhbD5pbmNsdWRlc19ydWxlczwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1 ZGVzX3N0YXRpc3RpY3M8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc190cmln Z2VyczwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3BvbGljaWVzPC9saXRl cmFsPiwKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfcmxzPC9saXRlcmFsPiAodGhlCisgICAg ICAgIDxjb21tYW5kPkVOQUJMRTwvY29tbWFuZD4vPGNvbW1hbmQ+Rk9SQ0UgUk9XIExFVkVMIFNF Q1VSSVRZPC9jb21tYW5kPgorICAgICAgICB0b2dnbGVzKSwgYW5kCisgICAgICAgIDxsaXRlcmFs PmluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHk8L2xpdGVyYWw+LiAgRWFjaCBvZiB0aGVzZQorICAg ICAgICBkZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4gIFRoZQorICAgICAgICA8 bGl0ZXJhbD5pbmNsdWRlc19wYXJ0aXRpb248L2xpdGVyYWw+IG9wdGlvbiwgd2hpY2ggZGVmYXVs dHMgdG8KKyAgICAgICAgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCBjb250cm9scyB3aGV0aGVy IHRoZSBEREwgZm9yIHBhcnRpdGlvbgorICAgICAgICBjaGlsZHJlbiBpcyBhcHBlbmRlZCBhZnRl ciBhIHBhcnRpdGlvbmVkLXRhYmxlIHBhcmVudC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBh cmE+CisgICAgICAgIFRoZSA8bGl0ZXJhbD5zY2hlbWFfcXVhbGlmaWVkPC9saXRlcmFsPiBvcHRp b24gKGJvb2xlYW4sIGRlZmF1bHQKKyAgICAgICAgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4pIGNv bnRyb2xzIHdoZXRoZXIgdGhlIHRhcmdldCB0YWJsZSdzIG93bgorICAgICAgICBzY2hlbWEgaXMg aW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBEREwuICBXaGVuIHNldCB0bworICAgICAgICA8bGl0 ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIHRoZSB0YWJsZSBuYW1lIGlzIGVtaXR0ZWQgdW5xdWFsaWZp ZWQKKyAgICAgICAgaW4gdGhlIDxjb21tYW5kPkNSRUFURSBUQUJMRTwvY29tbWFuZD4gYW5kIGV2 ZXJ5IHN1YnNlcXVlbnQKKyAgICAgICAgPGNvbW1hbmQ+QUxURVIgVEFCTEU8L2NvbW1hbmQ+LCA8 Y29tbWFuZD5DUkVBVEUgSU5ERVg8L2NvbW1hbmQ+LAorICAgICAgICA8Y29tbWFuZD5DUkVBVEUg UlVMRTwvY29tbWFuZD4sIGFuZAorICAgICAgICA8Y29tbWFuZD5DUkVBVEUgU1RBVElTVElDUzwv Y29tbWFuZD4gc3RhdGVtZW50LiAgUmVmZXJlbmNlcyB0bworICAgICAgICBvYmplY3RzIGluIHRo ZSBzYW1lIHNjaGVtYSBhcyB0aGUgdGFyZ2V0IHRhYmxlIChpbmhlcml0YW5jZQorICAgICAgICBw YXJlbnRzLCBwYXJ0aXRpb24gcGFyZW50cywgaWRlbnRpdHkgc2VxdWVuY2VzLCBhbmQgYW55Cisg ICAgICAgIHNhbWUtc2NoZW1hIG9iamVjdCB0aGUgZGVwYXJzZSBoZWxwZXJzIGhhcHBlbiB0byBt ZW50aW9uKSBhcmUKKyAgICAgICAgYWxzbyBlbWl0dGVkIHVucXVhbGlmaWVkLCBzbyB0aGUgc2Ny aXB0IGNhbiBiZSByZXBsYXllZCB1bmRlciBhCisgICAgICAgIGRpZmZlcmVudCA8dmFybmFtZT5z ZWFyY2hfcGF0aDwvdmFybmFtZT4gdG8gcmVjcmVhdGUgdGhlIHRhYmxlCisgICAgICAgIGluIGFu b3RoZXIgc2NoZW1hLiAgQ3Jvc3Mtc2NoZW1hIHJlZmVyZW5jZXMgKGZvciBleGFtcGxlIGEKKyAg ICAgICAgZm9yZWlnbiBrZXkgdGFyZ2V0IGluIGEgZGlmZmVyZW50IHNjaGVtYSkgcmVtYWluIHF1 YWxpZmllZCBmb3IKKyAgICAgICAgY29ycmVjdG5lc3MuCisgICAgICAgPC9wYXJhPgorICAgICAg IDxwYXJhPgorICAgICAgICBBbGwgdGhyZWUgZm9ybXMgb2YgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxF PC9jb21tYW5kPiBhcmUgc3VwcG9ydGVkOgorICAgICAgICB0aGUgb3JkaW5hcnkgY29sdW1uLWxp c3QgZm9ybSwgdGhlIHR5cGVkLXRhYmxlIGZvcm0KKyAgICAgICAgKDxsaXRlcmFsPk9GIDxyZXBs YWNlYWJsZT50eXBlX25hbWU8L3JlcGxhY2VhYmxlPjwvbGl0ZXJhbD4sIHdpdGgKKyAgICAgICAg cGVyLWNvbHVtbiA8bGl0ZXJhbD5XSVRIIE9QVElPTlM8L2xpdGVyYWw+IG92ZXJyaWRlcyBmb3Ig bG9jYWwKKyAgICAgICAgZGVmYXVsdHMsIDxsaXRlcmFsPk5PVCBOVUxMPC9saXRlcmFsPiwgYW5k IDxsaXRlcmFsPkNIRUNLPC9saXRlcmFsPgorICAgICAgICBjb25zdHJhaW50cyksIGFuZCB0aGUg PGxpdGVyYWw+UEFSVElUSU9OIE9GPC9saXRlcmFsPiBmb3JtLgorICAgICAgICA8bGl0ZXJhbD5U RU1QT1JBUlk8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5VTkxPR0dFRDwvbGl0ZXJhbD4KKyAgICAg ICAgcGVyc2lzdGVuY2UgbW9kZXMgYXJlIGVtaXR0ZWQgZnJvbQorICAgICAgICA8c3RydWN0Zmll bGQ+cmVscGVyc2lzdGVuY2U8L3N0cnVjdGZpZWxkPi4gIEZvciB0ZW1wb3JhcnkgdGFibGVzCisg ICAgICAgIHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiwgdGhlCisgICAgICAgIDxs aXRlcmFsPk9OIENPTU1JVCBERUxFVEUgUk9XUzwvbGl0ZXJhbD4gYW5kCisgICAgICAgIDxsaXRl cmFsPk9OIENPTU1JVCBEUk9QPC9saXRlcmFsPiBjbGF1c2VzIGFyZSBlbWl0dGVkOyB0aGUgZGVm YXVsdAorICAgICAgICA8bGl0ZXJhbD5PTiBDT01NSVQgUFJFU0VSVkUgUk9XUzwvbGl0ZXJhbD4g aXMgb21pdHRlZC4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8 L3Rib2R5PgogICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRz LmMKaW5kZXggYTMzZTIyZThlNjEuLjZhYTQwMWQ5NDNjIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy90YWJsZWNtZHMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNt ZHMuYwpAQCAtMTk1NTgsNiArMTk1NTgsMzMgQEAgcmVtb3ZlX29uX2NvbW1pdF9hY3Rpb24oT2lk IHJlbGlkKQogCX0KIH0KIAorLyoKKyAqIExvb2sgdXAgdGhlIHJlZ2lzdGVyZWQgT04gQ09NTUlU IGFjdGlvbiBmb3IgYSByZWxhdGlvbi4KKyAqCisgKiBSZXR1cm5zIE9OQ09NTUlUX05PT1Agd2hl biBub3RoaW5nIHdhcyByZWdpc3RlcmVkLCB3aGljaCBhbHNvIGNvdmVycworICogdGVtcG9yYXJ5 IHRhYmxlcyBjcmVhdGVkIHdpdGggdGhlIGRlZmF1bHQgT04gQ09NTUlUIFBSRVNFUlZFIFJPV1MK KyAqIGJlaGF2aW9yIChyZWdpc3Rlcl9vbl9jb21taXRfYWN0aW9uKCkgc2tpcHMgdGhvc2UsIHNp bmNlIG5vIGFjdGlvbiBpcworICogbmVlZGVkIGF0IGNvbW1pdCkuICBFbnRyaWVzIG1hcmtlZCBm b3IgZGVsZXRpb24gaW4gdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uIGFyZSBpZ25vcmVkLgor ICovCitPbkNvbW1pdEFjdGlvbgorZ2V0X29uX2NvbW1pdF9hY3Rpb24oT2lkIHJlbGlkKQorewor CUxpc3RDZWxsICAgKmw7CisKKwlmb3JlYWNoKGwsIG9uX2NvbW1pdHMpCisJeworCQlPbkNvbW1p dEl0ZW0gKm9jID0gKE9uQ29tbWl0SXRlbSAqKSBsZmlyc3QobCk7CisKKwkJaWYgKG9jLT5yZWxp ZCAhPSByZWxpZCkKKwkJCWNvbnRpbnVlOworCQlpZiAob2MtPmRlbGV0aW5nX3N1YmlkICE9IElu dmFsaWRTdWJUcmFuc2FjdGlvbklkKQorCQkJY29udGludWU7CisJCXJldHVybiBvYy0+b25jb21t aXQ7CisJfQorCXJldHVybiBPTkNPTU1JVF9OT09QOworfQorCiAvKgogICogUGVyZm9ybSBPTiBD T01NSVQgYWN0aW9ucy4KICAqCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRs dXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jCmluZGV4IGYzMmZjZDQ1 M2VmLi4zZDY4Y2UwMWUxNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0 aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKQEAgLTIxLDEyICsy MSwyNyBAQAogI2luY2x1ZGUgImFjY2Vzcy9nZW5hbS5oIgogI2luY2x1ZGUgImFjY2Vzcy9odHVw X2RldGFpbHMuaCIKICNpbmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKKyNpbmNsdWRlICJhY2Nlc3Mv dG9hc3RfY29tcHJlc3Npb24uaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhfbWVtYmVycy5o IgogI2luY2x1ZGUgImNhdGFsb2cvcGdfYXV0aGlkLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19j bGFzcy5oIgorI2luY2x1ZGUgImNhdGFsb2cvZGVwZW5kZW5jeS5oIgogI2luY2x1ZGUgImNhdGFs b2cvcGdfY29sbGF0aW9uLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb25zdHJhaW50LmgiCiAj aW5jbHVkZSAiY2F0YWxvZy9wZ19kYXRhYmFzZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGJf cm9sZV9zZXR0aW5nLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19hbS5oIgorI2luY2x1ZGUgImNh dGFsb2cvcGdfaW5oZXJpdHMuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3BvbGljeS5oIgorI2lu Y2x1ZGUgImNhdGFsb2cvcGdfc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3N0YXRp c3RpY19leHQuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX3RhYmxlc3BhY2UuaCIKKyNpbmNsdWRl ICJjYXRhbG9nL3BnX3RyaWdnZXIuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BhcnRpdGlvbi5oIgor I2luY2x1ZGUgImNvbW1hbmRzL2RlZnJlbS5oIgorI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlY21k cy5oIgorI2luY2x1ZGUgInJld3JpdGUvcHJzMmxvY2suaCIKKyNpbmNsdWRlICJub2Rlcy9ub2Rl cy5oIgogI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlc3BhY2UuaCIKICNpbmNsdWRlICJjb21tb24v cmVscGF0aC5oIgogI2luY2x1ZGUgImZ1bmNhcGkuaCIKQEAgLTg2LDYgKzEwMSwxMDMgQEAgc3Rh dGljIExpc3QgKnBnX2dldF90YWJsZXNwYWNlX2RkbF9pbnRlcm5hbChPaWQgdHNpZCwgYm9vbCBw cmV0dHksIGJvb2wgbm9fb3duZXIKIHN0YXRpYyBEYXR1bSBwZ19nZXRfdGFibGVzcGFjZV9kZGxf c3JmKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLCBPaWQgdHNpZCwgYm9vbCBpc251bGwpOwogc3Rh dGljIExpc3QgKnBnX2dldF9kYXRhYmFzZV9kZGxfaW50ZXJuYWwoT2lkIGRiaWQsIGJvb2wgcHJl dHR5LAogCQkJCQkJCQkJCSAgYm9vbCBub19vd25lciwgYm9vbCBub190YWJsZXNwYWNlKTsKKy8q CisgKiBQZXItY29sdW1uIGNhY2hlIG9mIGxvY2FsbHktZGVjbGFyZWQgTk9UIE5VTEwgY29uc3Ry YWludHMuICBCdWlsdCBvbmNlCisgKiBieSBjb2xsZWN0X2xvY2FsX25vdF9udWxsKCkgYW5kIGNv bnN1bHRlZCBieSB0aGUgY29sdW1uLWVtaXQgaGVscGVycworICogYW5kIHRoZSBwb3N0LUNSRUFU RSBjb25zdHJhaW50IGxvb3AuICBFbnRyaWVzIHdpdGggY29ub2lkID09IEludmFsaWRPaWQKKyAq IG1lYW4gdGhlIGNvbHVtbiBoYXMgbm8gbG9jYWwgTk9UIE5VTEwgY29uc3RyYWludCByb3cgaW4g cGdfY29uc3RyYWludAorICogKHRoZSBjb2x1bW4gbWF5IHN0aWxsIGhhdmUgYXR0bm90bnVsbD10 cnVlIG9uIGEgcHJlLVBHLTE4LXVwZ3JhZGVkCisgKiBjYXRhbG9nLCBpbiB3aGljaCBjYXNlIGVt aXQgcGxhaW4gaW5saW5lIE5PVCBOVUxMKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTG9jYWxOb3RO dWxsRW50cnkKK3sKKwlPaWQJCQljb25vaWQ7CisJY2hhcgkgICAqbmFtZTsKKwlib29sCQlpc19h dXRvOwkJLyogbWF0Y2hlcyAiPHRhYmxlPl88Y29sPl9ub3RfbnVsbCIgKi8KKwlib29sCQlub19p bmhlcml0OworfSBMb2NhbE5vdE51bGxFbnRyeTsKKworLyoKKyAqIFdvcmtpbmcgY29udGV4dCB0 aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItcGFzcyBoZWxwZXJzIGJlbG93LiAgSW5wdXRzCisgKiAo Y2FsbGVyLXByb3ZpZGVkIG9wdGlvbiBmbGFncykgYXJlIGZpbGxlZCBpbiBvbmNlIGF0IHRoZSB0 b3Agb2YKKyAqIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwgYW5kIHRyZWF0ZWQgYXMgcmVhZC1v bmx5IHRoZXJlYWZ0ZXIuICBEZXJpdmVkCisgKiBmaWVsZHMgKHF1YWxuYW1lLCBzY2hlbWFfcHJl Zml4LCBubl9lbnRyaWVzLCBza2lwX25vdG51bGxfb2lkcykgYXJlCisgKiBjb21wdXRlZCBvbmNl IGR1cmluZyBzZXR1cC4gIEVhY2ggcGFzcyBhcHBlbmRzIHRvIGN0eC0+YnVmIGFuZCBwdXNoZXMK KyAqIHRoZSBmaW5pc2hlZCBzdGF0ZW1lbnQgb250byBjdHgtPnN0YXRlbWVudHMgdmlhIGFwcGVu ZF9zdG10KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFRhYmxlRGRsQ29udGV4dAoreworCVJlbGF0 aW9uCXJlbDsKKwlPaWQJCQlyZWxpZDsKKwlib29sCQlwcmV0dHk7CisJYm9vbAkJbm9fb3duZXI7 CisJYm9vbAkJbm9fdGFibGVzcGFjZTsKKwlib29sCQlpbmNsdWRlX2luZGV4ZXM7CisJYm9vbAkJ aW5jbHVkZV9jb25zdHJhaW50czsKKwlib29sCQlpbmNsdWRlX3J1bGVzOworCWJvb2wJCWluY2x1 ZGVfc3RhdGlzdGljczsKKwlib29sCQlpbmNsdWRlX3RyaWdnZXJzOworCWJvb2wJCWluY2x1ZGVf cG9saWNpZXM7CisJYm9vbAkJaW5jbHVkZV9ybHM7CisJYm9vbAkJaW5jbHVkZV9yZXBsaWNhX2lk ZW50aXR5OworCWJvb2wJCWluY2x1ZGVfcGFydGl0aW9uOworCWJvb2wJCXNjaGVtYV9xdWFsaWZp ZWQ7CisKKwkvKiBEZXJpdmVkIGR1cmluZyBzZXR1cCAqLworCU9pZAkJCWJhc2VfbmFtZXNwYWNl OworCWNoYXIJICAgKnF1YWxuYW1lOworCWNoYXIJICAgKnNjaGVtYV9wcmVmaXg7CS8qIE5VTEwg d2hlbiBzY2hlbWFfcXVhbGlmaWVkICovCisJTG9jYWxOb3ROdWxsRW50cnkgKm5uX2VudHJpZXM7 CisJTGlzdAkgICAqc2tpcF9ub3RudWxsX29pZHM7CisKKwkvKiBNdXRhYmxlIHdvcmtpbmcgc3Rh dGUgKi8KKwlTdHJpbmdJbmZvRGF0YSBidWY7CisJTGlzdAkgICAqc3RhdGVtZW50czsKK30gVGFi bGVEZGxDb250ZXh0OworCitzdGF0aWMgTGlzdCAqcGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5hbChP aWQgcmVsaWQsIGJvb2wgcHJldHR5LAorCQkJCQkJCQkJICAgYm9vbCBub19vd25lciwgYm9vbCBu b190YWJsZXNwYWNlLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX2luZGV4ZXMsCisJCQkJCQkJ CQkgICBib29sIGluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVf cnVsZXMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfc3RhdGlzdGljcywKKwkJCQkJCQkJCSAg IGJvb2wgaW5jbHVkZV90cmlnZ2VycywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9wb2xpY2ll cywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9ybHMsCisJCQkJCQkJCQkgICBib29sIGluY2x1 ZGVfcmVwbGljYV9pZGVudGl0eSwKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9wYXJ0aXRpb24s CisJCQkJCQkJCQkgICBib29sIHNjaGVtYV9xdWFsaWZpZWQpOworc3RhdGljIHZvaWQgYXBwZW5k X2NvbHVtbl9kZWZzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAor CQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCQkgICBib29sIHNjaGVt YV9xdWFsaWZpZWQsCisJCQkJCQkJICAgTG9jYWxOb3ROdWxsRW50cnkgKm5uX2VudHJpZXMpOwor c3RhdGljIHZvaWQgYXBwZW5kX3R5cGVkX2NvbHVtbl9vdmVycmlkZXMoU3RyaW5nSW5mbyBidWYs IFJlbGF0aW9uIHJlbCwKKwkJCQkJCQkJCQkgIGJvb2wgcHJldHR5LCBib29sIGluY2x1ZGVfY29u c3RyYWludHMsCisJCQkJCQkJCQkJICBMb2NhbE5vdE51bGxFbnRyeSAqbm5fZW50cmllcyk7Citz dGF0aWMgdm9pZCBhcHBlbmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRzKFN0cmluZ0luZm8gYnVm LCBSZWxhdGlvbiByZWwsCisJCQkJCQkJCQkJCWJvb2wgcHJldHR5LCBib29sICpmaXJzdCk7Citz dGF0aWMgY2hhciAqZmluZF9hdHRyZGVmX3RleHQoUmVsYXRpb24gcmVsLCBBdHRyTnVtYmVyIGF0 dG51bSwKKwkJCQkJCQkgICBMaXN0ICoqZHBjb250ZXh0KTsKK3N0YXRpYyBjaGFyICpsb29rdXBf cXVhbGlmaWVkX3JlbG5hbWUoT2lkIHJlbGlkKTsKK3N0YXRpYyBjaGFyICpsb29rdXBfcmVsbmFt ZV9mb3JfZW1pdChPaWQgcmVsaWQsIGJvb2wgc2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCSBP aWQgYmFzZV9uYW1lc3BhY2UpOworc3RhdGljIGNoYXIgKnN0cmlwX3NjaGVtYV9wcmVmaXgoY29u c3QgY2hhciAqc3RtdCwgY29uc3QgY2hhciAqcHJlZml4KTsKK3N0YXRpYyBMb2NhbE5vdE51bGxF bnRyeSAqY29sbGVjdF9sb2NhbF9ub3RfbnVsbChSZWxhdGlvbiByZWwsCisJCQkJCQkJCQkJCQkg TGlzdCAqKnNraXBfb2lkcyk7CitzdGF0aWMgTGlzdCAqZ2V0X2luaGVyaXRhbmNlX3BhcmVudHMo T2lkIHJlbGlkKTsKKworc3RhdGljIHZvaWQgYXBwZW5kX3N0bXQoVGFibGVEZGxDb250ZXh0ICpj dHgpOworc3RhdGljIHZvaWQgZW1pdF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURkbENvbnRleHQg KmN0eCk7CitzdGF0aWMgdm9pZCBlbWl0X293bmVyX3N0bXQoVGFibGVEZGxDb250ZXh0ICpjdHgp Oworc3RhdGljIHZvaWQgZW1pdF9jaGlsZF9kZWZhdWx0X292ZXJyaWRlcyhUYWJsZURkbENvbnRl eHQgKmN0eCk7CitzdGF0aWMgdm9pZCBlbWl0X2F0dG9wdGlvbnMoVGFibGVEZGxDb250ZXh0ICpj dHgpOworc3RhdGljIHZvaWQgZW1pdF9pbmRleGVzKFRhYmxlRGRsQ29udGV4dCAqY3R4KTsKK3N0 YXRpYyB2b2lkIGVtaXRfbG9jYWxfY29uc3RyYWludHMoVGFibGVEZGxDb250ZXh0ICpjdHgpOwor c3RhdGljIHZvaWQgZW1pdF9ydWxlcyhUYWJsZURkbENvbnRleHQgKmN0eCk7CitzdGF0aWMgdm9p ZCBlbWl0X3N0YXRpc3RpY3MoVGFibGVEZGxDb250ZXh0ICpjdHgpOworc3RhdGljIHZvaWQgZW1p dF9yZXBsaWNhX2lkZW50aXR5KFRhYmxlRGRsQ29udGV4dCAqY3R4KTsKK3N0YXRpYyB2b2lkIGVt aXRfcmxzX3RvZ2dsZXMoVGFibGVEZGxDb250ZXh0ICpjdHgpOworc3RhdGljIHZvaWQgZW1pdF9w YXJ0aXRpb25fY2hpbGRyZW4oVGFibGVEZGxDb250ZXh0ICpjdHgpOwogCiAKIC8qCkBAIC0xMTg1 LDMgKzEyOTcsMTYzNSBAQCBwZ19nZXRfZGF0YWJhc2VfZGRsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJ CVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKIAl9CiB9CisKKy8qCisgKiBnZXRfaW5oZXJpdGFu Y2VfcGFyZW50cworICoJCVJldHVybiBhIExpc3Qgb2YgcGFyZW50IE9JRHMgZm9yIHJlbGlkLCBv cmRlcmVkIGJ5IGluaHNlcW5vLgorICoKKyAqIGZpbmRfaW5oZXJpdGFuY2VfY2hpbGRyZW4oKSB3 YWxrcyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIChwYXJlbnQtPmNoaWxkcmVuKSwKKyAqIHNvIHdl IHNjYW4gcGdfaW5oZXJpdHMgZGlyZWN0bHkgaGVyZSB1c2luZyB0aGUgKGluaHJlbGlkLCBpbmhz ZXFubykgaW5kZXgsCisgKiB3aGljaCB5aWVsZHMgcm93cyBpbiB0aGUgb3JkZXIgdGhleSBuZWVk IHRvIGFwcGVhciBpbiB0aGUgSU5IRVJJVFMgY2xhdXNlLgorICogUGFydGl0aW9uIGNoaWxkcmVu IGFsc28gaGF2ZSBhIHBnX2luaGVyaXRzIGVudHJ5LCBzbyBjYWxsZXJzIG11c3Qgc2tpcCB0aGUK KyAqIElOSEVSSVRTIGNsYXVzZSB3aGVuIHJlbGlzcGFydGl0aW9uIGlzIHRydWUuCisgKi8KK3N0 YXRpYyBMaXN0ICoKK2dldF9pbmhlcml0YW5jZV9wYXJlbnRzKE9pZCByZWxpZCkKK3sKKwlSZWxh dGlvbglpbmhlcml0c1JlbDsKKwlTeXNTY2FuRGVzYyBzY2FuOworCVNjYW5LZXlEYXRhIGtleTsK KwlIZWFwVHVwbGUJdHVwOworCUxpc3QJICAgKnBhcmVudHMgPSBOSUw7CisKKwlpbmhlcml0c1Jl bCA9IHRhYmxlX29wZW4oSW5oZXJpdHNSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCVNj YW5LZXlJbml0KCZrZXksCisJCQkJQW51bV9wZ19pbmhlcml0c19pbmhyZWxpZCwKKwkJCQlCVEVx dWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkp OworCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oaW5oZXJpdHNSZWwsIEluaGVyaXRzUmVsaWRT ZXFub0luZGV4SWQsCisJCQkJCQkJICB0cnVlLCBOVUxMLCAxLCAma2V5KTsKKwl3aGlsZSAoSGVh cFR1cGxlSXNWYWxpZCh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHNjYW4pKSkKKwl7CisJCUZvcm1f cGdfaW5oZXJpdHMgaW5oID0gKEZvcm1fcGdfaW5oZXJpdHMpIEdFVFNUUlVDVCh0dXApOworCisJ CXBhcmVudHMgPSBsYXBwZW5kX29pZChwYXJlbnRzLCBpbmgtPmluaHBhcmVudCk7CisJfQorCXN5 c3RhYmxlX2VuZHNjYW4oc2Nhbik7CisJdGFibGVfY2xvc2UoaW5oZXJpdHNSZWwsIEFjY2Vzc1No YXJlTG9jayk7CisKKwlyZXR1cm4gcGFyZW50czsKK30KKworLyoKKyAqIGxvb2t1cF9xdWFsaWZp ZWRfcmVsbmFtZQorICoJCVJldHVybiB0aGUgc2NoZW1hLXF1YWxpZmllZCwgaWRlbnRpZmllci1x dW90ZWQgbmFtZSBvZiBhIHJlbGF0aW9uLAorICoJCW9yIHJhaXNlIEVSUkNPREVfVU5ERUZJTkVE X09CSkVDVCBpZiB0aGUgcmVsYXRpb24gaGFzIGRpc2FwcGVhcmVkLgorICoKKyAqIFJlcGxhY2Vz IHRoZSB1bnNhZmUgcGF0dGVybgorICoJICBxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihnZXRf bmFtZXNwYWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2Uob2lkKSksCisgKgkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGdldF9yZWxfbmFtZShvaWQpKQorICogd2hpY2ggZGVyZWZlcmVuY2Vz IE5VTEwgd2hlbiBhIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gaGFzIGRyb3BwZWQgdGhlCisgKiBy ZWZlcmVuY2VkIHJlbGF0aW9uIChvciBpdHMgc2NoZW1hKSBiZXR3ZWVuIHdoZW4gd2UgY2FjaGVk IGl0cyBPSUQgYW5kCisgKiB3aGVuIHdlIGFzayB0aGUgc3lzY2FjaGUgZm9yIGl0cyBuYW1lLiAg SG9sZGluZyBBY2Nlc3NTaGFyZUxvY2sgb24gYQorICogZGVwZW5kZW50IHJlbGF0aW9uIG1ha2Vz IHRoaXMgcmFjZSB2YW5pc2hpbmdseSB1bmxpa2VseSBpbiBwcmFjdGljZSwKKyAqIGJ1dCB3ZSBz dGlsbCBkZWZlbmQgYWdhaW5zdCBpdCBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSBpcyBhIFNJR1NF R1YuCisgKgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZnJlZSgpaW5nIHRoZSByZXN1 bHQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2xvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZShPaWQgcmVs aWQpCit7CisJSGVhcFR1cGxlCXRwOworCUZvcm1fcGdfY2xhc3MgcmVsdHVwOworCWNoYXIJICAg Km5zcG5hbWU7CisJY2hhcgkgICAqcmVzdWx0OworCisJdHAgPSBTZWFyY2hTeXNDYWNoZTEoUkVM T0lELCBPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHRw KSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpF Q1QpLAorCQkJCSBlcnJtc2coInJlbGF0aW9uIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0Iiwg cmVsaWQpLAorCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRy b3BwZWQuIikpKTsKKworCXJlbHR1cCA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1QodHApOwor CW5zcG5hbWUgPSBnZXRfbmFtZXNwYWNlX25hbWUocmVsdHVwLT5yZWxuYW1lc3BhY2UpOworCWlm IChuc3BuYW1lID09IE5VTEwpCisJeworCQlPaWQJCQluc3BvaWQgPSByZWx0dXAtPnJlbG5hbWVz cGFjZTsKKworCQlSZWxlYXNlU3lzQ2FjaGUodHApOworCQllcmVwb3J0KEVSUk9SLAorCQkJCShl cnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJIGVycm1zZygic2NoZW1hIHdp dGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgbnNwb2lkKSwKKwkJCQkgZXJyZGV0YWlsKCJJdCBt YXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7CisJfQorCisJcmVzdWx0ID0g cXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIobnNwbmFtZSwgTmFtZVN0cihyZWx0dXAtPnJlbG5h bWUpKTsKKworCXBmcmVlKG5zcG5hbWUpOworCVJlbGVhc2VTeXNDYWNoZSh0cCk7CisKKwlyZXR1 cm4gcmVzdWx0OworfQorCisvKgorICogbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQKKyAqCQlSZXR1 cm4gZWl0aGVyIHRoZSBzY2hlbWEtcXVhbGlmaWVkIG9yIHRoZSBiYXJlIHF1b3RlZCBuYW1lIG9m IGEKKyAqCQlyZWxhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWFfcXVhbGlmaWVkIGZsYWcu CisgKgorICogV2hlbiBzY2hlbWFfcXVhbGlmaWVkIGlzIHRydWUgdGhpcyBpcyBpZGVudGljYWwg dG8KKyAqIGxvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZS4gIFdoZW4gZmFsc2UsIHRoZSBiYXJlIHJl bG5hbWUgaXMgcmV0dXJuZWQKKyAqIG9ubHkgaWYgdGhlIHRhcmdldCByZWxhdGlvbiBsaXZlcyBp biBiYXNlX25hbWVzcGFjZSAodGhlIG5hbWVzcGFjZQorICogb2YgdGhlIHRhYmxlIHdob3NlIERE TCBpcyBiZWluZyBnZW5lcmF0ZWQpOyBvdGhlcndpc2UgdGhlIHNjaGVtYS0KKyAqIHF1YWxpZmll ZCBmb3JtIGlzIHN0aWxsIHJldHVybmVkLCBiZWNhdXNlIGNyb3NzLXNjaGVtYSByZWZlcmVuY2Vz CisgKiAoZm9yIGV4YW1wbGUgYW4gaW5oZXJpdGFuY2UgcGFyZW50IG9yIGZvcmVpZ24ga2V5IHRh cmdldCBpbiBhCisgKiBkaWZmZXJlbnQgc2NoZW1hKSBhcmUgbm90IHNhZmUgdG8gc3RyaXAuCisg KgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZnJlZSgpaW5nIHRoZSByZXN1bHQuCisg Ki8KK3N0YXRpYyBjaGFyICoKK2xvb2t1cF9yZWxuYW1lX2Zvcl9lbWl0KE9pZCByZWxpZCwgYm9v bCBzY2hlbWFfcXVhbGlmaWVkLCBPaWQgYmFzZV9uYW1lc3BhY2UpCit7CisJSGVhcFR1cGxlCXRw OworCUZvcm1fcGdfY2xhc3MgcmVsdHVwOworCWNoYXIJICAgKnJlc3VsdDsKKworCWlmIChzY2hl bWFfcXVhbGlmaWVkKQorCQlyZXR1cm4gbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lKHJlbGlkKTsK KworCXRwID0gU2VhcmNoU3lzQ2FjaGUxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShyZWxpZCkp OworCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0cCkpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVy cmNvZGUoRVJSQ09ERV9VTkRFRklORURfT0JKRUNUKSwKKwkJCQkgZXJybXNnKCJyZWxhdGlvbiB3 aXRoIE9JRCAldSBkb2VzIG5vdCBleGlzdCIsIHJlbGlkKSwKKwkJCQkgZXJyZGV0YWlsKCJJdCBt YXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7CisKKwlyZWx0dXAgPSAoRm9y bV9wZ19jbGFzcykgR0VUU1RSVUNUKHRwKTsKKwlpZiAocmVsdHVwLT5yZWxuYW1lc3BhY2UgIT0g YmFzZV9uYW1lc3BhY2UpCisJeworCQkvKiBDcm9zcy1zY2hlbWEgcmVmZXJlbmNlOiBxdWFsaWZp Y2F0aW9uIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcy4gKi8KKwkJUmVsZWFzZVN5c0NhY2hl KHRwKTsKKwkJcmV0dXJuIGxvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZShyZWxpZCk7CisJfQorCisJ cmVzdWx0ID0gcHN0cmR1cChxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIocmVsdHVwLT5yZWxuYW1l KSkpOworCVJlbGVhc2VTeXNDYWNoZSh0cCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgor ICogc3RyaXBfc2NoZW1hX3ByZWZpeAorICoJCVJldHVybiBhIHBhbGxvYydkIGNvcHkgb2Ygc3Rt dCB3aXRoIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgcHJlZml4CisgKgkJcmVtb3ZlZC4KKyAqCisgKiBV c2VkIHRvIHN0cmlwIHRoZSBxdWFsaWZpZWQtc2NoZW1hIHByZWZpeCAoZm9yIGV4YW1wbGUgIm9s ZF9zY2hlbWEuIikKKyAqIGZyb20gRERMIGVtaXR0ZWQgYnkgdGhlIGFsd2F5cy1xdWFsaWZpZWQg cnVsZXV0aWxzIGhlbHBlcnMKKyAqIChwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBwZ19n ZXRfaW5kZXhkZWZfc3RyaW5nLAorICogcGdfZ2V0X3J1bGVkZWYsIHBnX2dldF9zdGF0aXN0aWNz b2JqZGVmX3N0cmluZykgd2hlbiB0aGUgY2FsbGVyIGhhcworICogcmVxdWVzdGVkIHVucXVhbGlm aWVkIG91dHB1dCB2aWEgc2NoZW1hX3F1YWxpZmllZD1mYWxzZS4gIFRoZSBwcmVmaXgKKyAqIGlz IG1hdGNoZWQgYXMgYSBwbGFpbiBzdWJzdHJpbmcsIHdoaWNoIGlzIHNhZmUgZm9yIERETCBvdXRw dXQgYnV0IGluCisgKiB0aGVvcnkgY291bGQgbWlzLWVkaXQgYSBzdHJpbmcgbGl0ZXJhbCB3aG9z ZSBjb250ZW50cyBjb250YWluIHRoZQorICogbGl0ZXJhbCB0ZXh0ICI8c2NoZW1hPi4iIOKAlCBh Y2NlcHQgdGhhdCBhcyBhIHJhcmUgZWRnZSBjYXNlLgorICovCitzdGF0aWMgY2hhciAqCitzdHJp cF9zY2hlbWFfcHJlZml4KGNvbnN0IGNoYXIgKnN0bXQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sK KwlTdHJpbmdJbmZvRGF0YSBidWY7CisJc2l6ZV90CQlwbGVuID0gc3RybGVuKHByZWZpeCk7CisJ Y29uc3QgY2hhciAqcCA9IHN0bXQ7CisJY29uc3QgY2hhciAqcTsKKworCWluaXRTdHJpbmdJbmZv KCZidWYpOworCXdoaWxlICgocSA9IHN0cnN0cihwLCBwcmVmaXgpKSAhPSBOVUxMKQorCXsKKwkJ YXBwZW5kQmluYXJ5U3RyaW5nSW5mbygmYnVmLCBwLCBxIC0gcCk7CisJCXAgPSBxICsgcGxlbjsK Kwl9CisJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVmLCBwKTsKKwlyZXR1cm4gYnVmLmRhdGE7 Cit9CisKKy8qCisgKiBjb2xsZWN0X2xvY2FsX25vdF9udWxsCisgKgkJU2NhbiBwZ19jb25zdHJh aW50IG9uY2UgZm9yIGxvY2FsbHktZGVjbGFyZWQgTk9UIE5VTEwgY29uc3RyYWludHMKKyAqCQlv biByZWwsIHJldHVybmluZyBhIHBhbGxvYydkIGFycmF5IGluZGV4ZWQgYnkgYXR0bnVtICgxLi5u YXR0cykuCisgKgorICogRW50cmllcyB3aXRoIGNvbm9pZD09SW52YWxpZE9pZCBtZWFuICJubyBs b2NhbCBOT1QgTlVMTCByb3cgZm9yIHRoaXMKKyAqIGNvbHVtbiIuICBXaGVuIHRoZSBjb25zdHJh aW50IG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGF1dG8tZ2VuZXJhdGVkCisgKiBwYXR0ZXJuICI8 dGFibGVuYW1lPl88Y29sdW1ubmFtZT5fbm90X251bGwiLCB0aGUgY29uc3RyYWludCBPSUQgaXMK KyAqIGFwcGVuZGVkIHRvICpza2lwX29pZHMgc28gdGhlIHBvc3QtQ1JFQVRFIGNvbnN0cmFpbnQg bG9vcCBjYW4gYXZvaWQKKyAqIHJlLWVtaXR0aW5nIGl0IGFzIEFMVEVSIFRBQkxFIOKApiBBREQg Q09OU1RSQUlOVCDigJQgdGhlIGNvbHVtbi1lbWl0CisgKiBwYXNzIHdpbGwgcHJvZHVjZSBpdCBp bmxpbmUgYXMgIkNPTlNUUkFJTlQgbmFtZSBOT1QgTlVMTCIgaW5zdGVhZC4KKyAqLworc3RhdGlj IExvY2FsTm90TnVsbEVudHJ5ICoKK2NvbGxlY3RfbG9jYWxfbm90X251bGwoUmVsYXRpb24gcmVs LCBMaXN0ICoqc2tpcF9vaWRzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOworCWludAkJCW5hdHRzID0gdHVwZGVzYy0+bmF0dHM7CisJTG9jYWxOb3ROdWxs RW50cnkgKmVudHJpZXM7CisJY29uc3QgY2hhciAqcmVsbmFtZSA9IFJlbGF0aW9uR2V0UmVsYXRp b25OYW1lKHJlbCk7CisJUmVsYXRpb24JY29uUmVsOworCVN5c1NjYW5EZXNjIGNvblNjYW47CisJ U2NhbktleURhdGEgY29uS2V5OworCUhlYXBUdXBsZQljb25UdXA7CisKKwllbnRyaWVzID0gKExv Y2FsTm90TnVsbEVudHJ5ICopIHBhbGxvYzAoc2l6ZW9mKExvY2FsTm90TnVsbEVudHJ5KSAqCisJ CQkJCQkJCQkJCShuYXR0cyArIDEpKTsKKworCWNvblJlbCA9IHRhYmxlX29wZW4oQ29uc3RyYWlu dFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUluaXQoJmNvbktleSwKKwkJ CQlBbnVtX3BnX2NvbnN0cmFpbnRfY29ucmVsaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVy LCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25HZXRSZWxpZChyZWwpKSk7 CisJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nhbihjb25SZWwsIENvbnN0cmFpbnRSZWxpZFR5 cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCSB0cnVlLCBOVUxMLCAxLCAmY29uS2V5KTsKKworCXdo aWxlIChIZWFwVHVwbGVJc1ZhbGlkKGNvblR1cCA9IHN5c3RhYmxlX2dldG5leHQoY29uU2Nhbikp KQorCXsKKwkJRm9ybV9wZ19jb25zdHJhaW50IGNvbiA9IChGb3JtX3BnX2NvbnN0cmFpbnQpIEdF VFNUUlVDVChjb25UdXApOworCQlEYXR1bQkJY29ua2V5RGF0OworCQlib29sCQljb25rZXlOdWxs OworCQlBcnJheVR5cGUgICpjb25rZXlBcnI7CisJCWludDE2CSAgICpjb25rZXlWYWxzOworCQlp bnQJCQlhdHRudW07CisJCUZvcm1fcGdfYXR0cmlidXRlIGF0dDsKKwkJY2hhcgkJYXV0b25hbWVb TkFNRURBVEFMRU5dOworCisJCWlmIChjb24tPmNvbnR5cGUgIT0gQ09OU1RSQUlOVF9OT1ROVUxM KQorCQkJY29udGludWU7CisJCWlmICghY29uLT5jb25pc2xvY2FsKQorCQkJY29udGludWU7CisK KwkJY29ua2V5RGF0ID0gaGVhcF9nZXRhdHRyKGNvblR1cCwgQW51bV9wZ19jb25zdHJhaW50X2Nv bmtleSwKKwkJCQkJCQkJIFJlbGF0aW9uR2V0RGVzY3IoY29uUmVsKSwgJmNvbmtleU51bGwpOwor CQlpZiAoY29ua2V5TnVsbCkKKwkJCWNvbnRpbnVlOworCQljb25rZXlBcnIgPSBEYXR1bUdldEFy cmF5VHlwZVAoY29ua2V5RGF0KTsKKworCQkvKgorCQkgKiBEZWZlbmQgYWdhaW5zdCBhIG1hbGZv cm1lZCBjb25rZXk6IGEgTk9UIE5VTEwgY29uc3RyYWludCBpcworCQkgKiBhbHdheXMgYSBzaW5n bGUtY29sdW1uIDEtRCBpbnQyIGFycmF5LCBidXQgYSBjb3JydXB0ZWQgY2F0YWxvZworCQkgKiBv ciBhIGZ1dHVyZSBwYXRjaCB0aGF0IHN0b3JlcyB3aWRlciBjb25rZXlzIG11c3RuJ3QgdHJpcCB1 cworCQkgKiBpbnRvIHJlYWRpbmcgcGFzdCB0aGUgYXJyYXkgaGVhZGVyLgorCQkgKi8KKwkJaWYg KEFSUl9ORElNKGNvbmtleUFycikgIT0gMSB8fAorCQkJQVJSX0RJTVMoY29ua2V5QXJyKVswXSA8 IDEgfHwKKwkJCUFSUl9IQVNOVUxMKGNvbmtleUFycikgfHwKKwkJCUFSUl9FTEVNVFlQRShjb25r ZXlBcnIpICE9IElOVDJPSUQpCisJCQljb250aW51ZTsKKworCQljb25rZXlWYWxzID0gKGludDE2 ICopIEFSUl9EQVRBX1BUUihjb25rZXlBcnIpOworCQlhdHRudW0gPSBjb25rZXlWYWxzWzBdOwor CQlpZiAoYXR0bnVtIDwgMSB8fCBhdHRudW0gPiBuYXR0cykKKwkJCWNvbnRpbnVlOworCisJCWF0 dCA9IFR1cGxlRGVzY0F0dHIodHVwZGVzYywgYXR0bnVtIC0gMSk7CisJCXNucHJpbnRmKGF1dG9u YW1lLCBzaXplb2YoYXV0b25hbWUpLCAiJXNfJXNfbm90X251bGwiLAorCQkJCSByZWxuYW1lLCBO YW1lU3RyKGF0dC0+YXR0bmFtZSkpOworCisJCWVudHJpZXNbYXR0bnVtXS5jb25vaWQgPSBjb24t Pm9pZDsKKwkJZW50cmllc1thdHRudW1dLm5hbWUgPSBwc3RyZHVwKE5hbWVTdHIoY29uLT5jb25u YW1lKSk7CisJCWVudHJpZXNbYXR0bnVtXS5pc19hdXRvID0gKHN0cmNtcChOYW1lU3RyKGNvbi0+ Y29ubmFtZSksIGF1dG9uYW1lKSA9PSAwKTsKKwkJZW50cmllc1thdHRudW1dLm5vX2luaGVyaXQg PSBjb24tPmNvbm5vaW5oZXJpdDsKKworCQlpZiAoIWVudHJpZXNbYXR0bnVtXS5pc19hdXRvICYm IHNraXBfb2lkcyAhPSBOVUxMKQorCQkJKnNraXBfb2lkcyA9IGxhcHBlbmRfb2lkKCpza2lwX29p ZHMsIGNvbi0+b2lkKTsKKwl9CisJc3lzdGFibGVfZW5kc2Nhbihjb25TY2FuKTsKKwl0YWJsZV9j bG9zZShjb25SZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZXR1cm4gZW50cmllczsKK30KKwor LyoKKyAqIGZpbmRfYXR0cmRlZl90ZXh0CisgKgkJUmV0dXJuIHRoZSBkZXBhcnNlZCBERUZBVUxU L0dFTkVSQVRFRCBleHByZXNzaW9uIGZvciBhdHRudW0gb24gcmVsLAorICoJCW9yIE5VTEwgaWYg bm8gZW50cnkgZXhpc3RzIGluIFR1cGxlQ29uc3RyLT5kZWZ2YWwuCisgKgorICogVGhlIGNhbGxl ciBwYXNzZXMgYSBMaXN0ICoqIHNvIHRoYXQgdGhlIGRlcGFyc2UgY29udGV4dCBpcyBidWlsdCBs YXppbHkKKyAqIGFuZCByZXVzZWQgYWNyb3NzIGNhbGxzIChkZXBhcnNlX2NvbnRleHRfZm9yIGlz IG5vdCBjaGVhcCkuICBSZXR1cm5lZAorICogc3RyaW5nIGlzIHBhbGxvYydkIGluIHRoZSBjdXJy ZW50IG1lbW9yeSBjb250ZXh0OyBjYWxsZXIgcGZyZWUncyBpdC4KKyAqLworc3RhdGljIGNoYXIg KgorZmluZF9hdHRyZGVmX3RleHQoUmVsYXRpb24gcmVsLCBBdHRyTnVtYmVyIGF0dG51bSwgTGlz dCAqKmRwY29udGV4dCkKK3sKKwlUdXBsZUNvbnN0ciAqY29uc3RyID0gUmVsYXRpb25HZXREZXNj cihyZWwpLT5jb25zdHI7CisKKwlpZiAoY29uc3RyID09IE5VTEwpCisJCXJldHVybiBOVUxMOwor CisJZm9yIChpbnQgaiA9IDA7IGogPCBjb25zdHItPm51bV9kZWZ2YWw7IGorKykKKwl7CisJCWlm IChjb25zdHItPmRlZnZhbFtqXS5hZG51bSAhPSBhdHRudW0pCisJCQljb250aW51ZTsKKworCQlp ZiAoKmRwY29udGV4dCA9PSBOSUwpCisJCQkqZHBjb250ZXh0ID0gZGVwYXJzZV9jb250ZXh0X2Zv cihSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpLAorCQkJCQkJCQkJCQkgUmVsYXRpb25HZXRS ZWxpZChyZWwpKTsKKworCQlyZXR1cm4gZGVwYXJzZV9leHByZXNzaW9uKHN0cmluZ1RvTm9kZShj b25zdHItPmRlZnZhbFtqXS5hZGJpbiksCisJCQkJCQkJCSAgKmRwY29udGV4dCwgZmFsc2UsIGZh bHNlKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBhcHBlbmRfaW5saW5lX2NoZWNr X2NvbnN0cmFpbnRzCisgKgkJRW1pdCBlYWNoIGxvY2FsbHktZGVjbGFyZWQgQ0hFQ0sgY29uc3Ry YWludCBvbiByZWwgYXMKKyAqCQkiQ09OU1RSQUlOVCBuYW1lIDxwZ19nZXRfY29uc3RyYWludGRl Zj4iLCBzZXBhcmF0ZWQgYnkgJywnIGZyb20gYW55CisgKgkJcHJldmlvdXNseS1lbWl0dGVkIGNv bHVtbiBvciBjb25zdHJhaW50LgorICoKKyAqICpmaXJzdCB0cmFja3Mgd2hldGhlciBhbnl0aGlu ZyBoYXMgYmVlbiBlbWl0dGVkIG9uIHRoaXMgbGlzdCB5ZXQsIHNvIHRoZQorICogY2FsbGVyIGNh biBjaGFpbiBjb2x1bW4gZW1pc3Npb24gYW5kIGNvbnN0cmFpbnQgZW1pc3Npb24gdGhyb3VnaCB0 aGUgc2FtZQorICogYnVmZmVyLiAgSW5oZXJpdGVkIENIRUNLIGNvbnN0cmFpbnRzICghY29uaXNs b2NhbCkgY29tZSBmcm9tIHRoZSBwYXJlbnQncworICogRERMIGFuZCBhcmVuJ3QgcmVwZWF0ZWQg aGVyZS4KKyAqLworc3RhdGljIHZvaWQKK2FwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMo U3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBwcmV0dHksCisJCQkJCQkJCWJvb2wg KmZpcnN0KQoreworCVJlbGF0aW9uCWNvblJlbDsKKwlTeXNTY2FuRGVzYyBjb25TY2FuOworCVNj YW5LZXlEYXRhIGNvbktleTsKKwlIZWFwVHVwbGUJY29uVHVwOworCisJY29uUmVsID0gdGFibGVf b3BlbihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlTY2FuS2V5SW5p dCgmY29uS2V5LAorCQkJCUFudW1fcGdfY29uc3RyYWludF9jb25yZWxpZCwKKwkJCQlCVEVxdWFs U3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1bShSZWxhdGlvbkdl dFJlbGlkKHJlbCkpKTsKKwljb25TY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKGNvblJlbCwgQ29u c3RyYWludFJlbGlkVHlwaWROYW1lSW5kZXhJZCwKKwkJCQkJCQkJIHRydWUsIE5VTEwsIDEsICZj b25LZXkpOworCisJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoY29uVHVwID0gc3lzdGFibGVfZ2V0 bmV4dChjb25TY2FuKSkpCisJeworCQlGb3JtX3BnX2NvbnN0cmFpbnQgY29uID0gKEZvcm1fcGdf Y29uc3RyYWludCkgR0VUU1RSVUNUKGNvblR1cCk7CisJCURhdHVtCQlkZWZEYXR1bTsKKwkJY2hh cgkgICAqZGVmYm9keTsKKworCQlpZiAoY29uLT5jb250eXBlICE9IENPTlNUUkFJTlRfQ0hFQ0sp CisJCQljb250aW51ZTsKKwkJaWYgKCFjb24tPmNvbmlzbG9jYWwpCisJCQljb250aW51ZTsKKwor CQlpZiAoISpmaXJzdCkKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJywnKTsKKwkJKmZp cnN0ID0gZmFsc2U7CisJCWlmIChwcmV0dHkpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1 ZiwgIlxuICAgICIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcgJyk7 CisKKwkJZGVmRGF0dW0gPSBPaWRGdW5jdGlvbkNhbGwxKEZfUEdfR0VUX0NPTlNUUkFJTlRERUZf T0lELAorCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShjb24tPm9pZCkpOworCQlkZWZib2R5ID0g VGV4dERhdHVtR2V0Q1N0cmluZyhkZWZEYXR1bSk7CisJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAi Q09OU1RSQUlOVCAlcyAlcyIsCisJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGNvbi0+ Y29ubmFtZSkpLAorCQkJCQkJIGRlZmJvZHkpOworCQlwZnJlZShkZWZib2R5KTsKKwl9CisJc3lz dGFibGVfZW5kc2Nhbihjb25TY2FuKTsKKwl0YWJsZV9jbG9zZShjb25SZWwsIEFjY2Vzc1NoYXJl TG9jayk7Cit9CisKKy8qCisgKiBhcHBlbmRfY29sdW1uX2RlZnMKKyAqCQlBcHBlbmQgdGhlIGNv bW1hLXNlcGFyYXRlZCBjb2x1bW4gZGVmaW5pdGlvbiBsaXN0IGZvciBhIHRhYmxlLgorICoKKyAq IEVtaXRzIGVhY2ggbm9uLWRyb3BwZWQsIGxvY2FsbHktZGVjbGFyZWQgY29sdW1uIGFzCisgKgkJ bmFtZSB0eXBlIFtDT0xMQVRFIHhdIFtTVE9SQUdFIHNdIFtDT01QUkVTU0lPTiBjXQorICoJCVtH RU5FUkFURUQgLi4uIHwgREVGQVVMVCBlXSBbTk9UIE5VTExdCisgKiBmb2xsb3dlZCBieSBhbnkg bG9jYWxseS1kZWNsYXJlZCBpbmxpbmUgQ0hFQ0sgY29uc3RyYWludHMuICBPcHRpb25hbAorICog Y2xhdXNlcyBhcmUgb21pdHRlZCB3aGVuIHRoZWlyIHZhbHVlIG1hdGNoZXMgd2hhdCB0aGUgc3lz dGVtIHdvdWxkCisgKiByZWFwcGx5IG9uIHJvdW5kLXRyaXAgKGUuZy4gdHlwZS1kZWZhdWx0IENP TExBVEUsIHR5cGUtZGVmYXVsdCBTVE9SQUdFKS4KKyAqLworc3RhdGljIHZvaWQKK2FwcGVuZF9j b2x1bW5fZGVmcyhTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBib29sIHByZXR0eSwKKwkJ CQkgICBib29sIGluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJICAgYm9vbCBzY2hlbWFfcXVhbGlm aWVkLAorCQkJCSAgIExvY2FsTm90TnVsbEVudHJ5ICpubl9lbnRyaWVzKQoreworCVR1cGxlRGVz Ywl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCU9pZAkJCWJhc2VfbmFtZXNwYWNl ID0gUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKTsKKwlMaXN0CSAgICpkcGNvbnRleHQgPSBOSUw7 CisJYm9vbAkJZmlyc3QgPSB0cnVlOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5u YXR0czsgaSsrKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0 dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAqdHlwc3RyOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBl ZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIENvbHVtbnMgaW5oZXJpdGVkIGZyb20gYSBw YXJlbnQgYXJlIGVtaXR0ZWQgYnkgdGhlIElOSEVSSVRTIGNsYXVzZQorCQkgKiAob25jZSBpbXBs ZW1lbnRlZCksIG5vdCB0aGUgY29sdW1uIGxpc3QsIHVubGVzcyB0aGUgY2hpbGQKKwkJICogcmVk ZWNsYXJlZCB0aGVtIGxvY2FsbHkgKGF0dGlzbG9jYWw9dHJ1ZSkuCisJCSAqLworCQlpZiAoIWF0 dC0+YXR0aXNsb2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRT dHJpbmdJbmZvQ2hhcihidWYsICcsJyk7CisJCWZpcnN0ID0gZmFsc2U7CisKKwkJaWYgKHByZXR0 eSkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXG4gICAgIik7CisJCWVsc2UKKwkJ CWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyAnKTsKKworCQlhcHBlbmRTdHJpbmdJbmZvU3Ry aW5nKGJ1ZiwgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0dC0+YXR0bmFtZSkpKTsKKwkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcpOworCisJCXR5cHN0ciA9IGZvcm1hdF90eXBlX3dp dGhfdHlwZW1vZChhdHQtPmF0dHR5cGlkLCBhdHQtPmF0dHR5cG1vZCk7CisJCWFwcGVuZFN0cmlu Z0luZm9TdHJpbmcoYnVmLCB0eXBzdHIpOworCQlwZnJlZSh0eXBzdHIpOworCisJCS8qIENPTExB VEUgY2xhdXNlLCBvbmx5IGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQuICov CisJCWlmIChPaWRJc1ZhbGlkKGF0dC0+YXR0Y29sbGF0aW9uKSAmJgorCQkJYXR0LT5hdHRjb2xs YXRpb24gIT0gZ2V0X3R5cGNvbGxhdGlvbihhdHQtPmF0dHR5cGlkKSkKKwkJCWFwcGVuZFN0cmlu Z0luZm8oYnVmLCAiIENPTExBVEUgJXMiLAorCQkJCQkJCSBnZW5lcmF0ZV9jb2xsYXRpb25fbmFt ZShhdHQtPmF0dGNvbGxhdGlvbikpOworCisJCS8qIFNUT1JBR0UgY2xhdXNlLCBvbmx5IGlmIGl0 IGRpZmZlcnMgZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQuICovCisJCWlmIChhdHQtPmF0dHN0b3Jh Z2UgIT0gZ2V0X3R5cHN0b3JhZ2UoYXR0LT5hdHR0eXBpZCkpCisJCXsKKwkJCWNvbnN0IGNoYXIg KnN0b3JhZ2UgPSBOVUxMOworCisJCQlzd2l0Y2ggKGF0dC0+YXR0c3RvcmFnZSkKKwkJCXsKKwkJ CQljYXNlIFRZUFNUT1JBR0VfUExBSU46CisJCQkJCXN0b3JhZ2UgPSAiUExBSU4iOworCQkJCQli cmVhazsKKwkJCQljYXNlIFRZUFNUT1JBR0VfRVhURVJOQUw6CisJCQkJCXN0b3JhZ2UgPSAiRVhU RVJOQUwiOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRZUFNUT1JBR0VfTUFJTjoKKwkJCQkJc3Rv cmFnZSA9ICJNQUlOIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUWVBTVE9SQUdFX0VYVEVOREVE OgorCQkJCQlzdG9yYWdlID0gIkVYVEVOREVEIjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAo c3RvcmFnZSkKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBTVE9SQUdFICVzIiwgc3RvcmFn ZSk7CisJCX0KKworCQkvKiBDT01QUkVTU0lPTiBjbGF1c2UsIG9ubHkgaWYgZXhwbGljaXRseSBz ZXQgb24gdGhlIGNvbHVtbi4gKi8KKwkJaWYgKENvbXByZXNzaW9uTWV0aG9kSXNWYWxpZChhdHQt PmF0dGNvbXByZXNzaW9uKSkKKwkJeworCQkJY29uc3QgY2hhciAqY20gPSBOVUxMOworCisJCQlz d2l0Y2ggKGF0dC0+YXR0Y29tcHJlc3Npb24pCisJCQl7CisJCQkJY2FzZSBUT0FTVF9QR0xaX0NP TVBSRVNTSU9OOgorCQkJCQljbSA9ICJwZ2x6IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUT0FT VF9MWjRfQ09NUFJFU1NJT046CisJCQkJCWNtID0gImx6NCI7CisJCQkJCWJyZWFrOworCQkJfQor CQkJaWYgKGNtKQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIENPTVBSRVNTSU9OICVzIiwg Y20pOworCQl9CisKKwkJLyoKKwkJICogTG9vayB1cCB0aGUgZGVmYXVsdC9nZW5lcmF0ZWQgZXhw cmVzc2lvbiB0ZXh0IHVwIGZyb250OyBnZW5lcmF0ZWQKKwkJICogY29sdW1ucyBoYXZlIGF0dGhh c2RlZj10cnVlIHdpdGggYW4gZW50cnkgaW4gcGdfYXR0cmRlZiBqdXN0IGxpa2UKKwkJICogcmVn dWxhciBkZWZhdWx0cy4KKwkJICovCisJCXsKKwkJCWNoYXIJICAgKmRlZmV4cHIgPSBOVUxMOwor CisJCQlpZiAoYXR0LT5hdHRoYXNkZWYpCisJCQkJZGVmZXhwciA9IGZpbmRfYXR0cmRlZl90ZXh0 KHJlbCwgYXR0LT5hdHRudW0sICZkcGNvbnRleHQpOworCisJCQkvKiBHRU5FUkFURUQgLyBJREVO VElUWSAvIERFRkFVTFQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gKi8KKwkJCWlmIChhdHQtPmF0 dGdlbmVyYXRlZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1NUT1JFRCAmJiBkZWZleHByKQorCQkJ CWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIEdFTkVSQVRFRCBBTFdBWVMgQVMgKCVzKSBTVE9SRUQi LCBkZWZleHByKTsKKwkJCWVsc2UgaWYgKGF0dC0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9H RU5FUkFURURfVklSVFVBTCAmJiBkZWZleHByKQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAi IEdFTkVSQVRFRCBBTFdBWVMgQVMgKCVzKSBWSVJUVUFMIiwgZGVmZXhwcik7CisJCQllbHNlIGlm IChhdHQtPmF0dGlkZW50aXR5ID09IEFUVFJJQlVURV9JREVOVElUWV9BTFdBWVMgfHwKKwkJCQkJ IGF0dC0+YXR0aWRlbnRpdHkgPT0gQVRUUklCVVRFX0lERU5USVRZX0JZX0RFRkFVTFQpCisJCQl7 CisJCQkJY29uc3QgY2hhciAqaWRraW5kID0KKwkJCQkJKGF0dC0+YXR0aWRlbnRpdHkgPT0gQVRU UklCVVRFX0lERU5USVRZX0FMV0FZUykKKwkJCQkJPyAiQUxXQVlTIiA6ICJCWSBERUZBVUxUIjsK KwkJCQlPaWQJCQlzZXFpZCA9IGdldElkZW50aXR5U2VxdWVuY2UocmVsLCBhdHQtPmF0dG51bSwg dHJ1ZSk7CisKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBHRU5FUkFURUQgJXMgQVMgSURF TlRJVFkiLCBpZGtpbmQpOworCisJCQkJLyoKKwkJCQkgKiBFbWl0IG9ubHkgdGhlIHNlcXVlbmNl IG9wdGlvbnMgdGhhdCBkaWZmZXIgZnJvbSB0aGVpcgorCQkJCSAqIGRlZmF1bHRzIOKAlCBtaXJy b3JpbmcgcGdfZ2V0X2RhdGFiYXNlX2RkbCdzIHBhdHRlcm4gb2YKKwkJCQkgKiBvbWl0dGluZyB2 YWx1ZXMgdGhhdCB0aGUgc3lzdGVtIHdvdWxkIHJlYXBwbHkgb24gaXRzIG93bi4KKwkJCQkgKi8K KwkJCQlpZiAoT2lkSXNWYWxpZChzZXFpZCkpCisJCQkJeworCQkJCQlIZWFwVHVwbGUJc2VxVHVw ID0gU2VhcmNoU3lzQ2FjaGUxKFNFUVJFTElELAorCQkJCQkJCQkJCQkJCQkgT2JqZWN0SWRHZXRE YXR1bShzZXFpZCkpOworCisJCQkJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHNlcVR1cCkpCisJCQkJ CXsKKwkJCQkJCUZvcm1fcGdfc2VxdWVuY2Ugc2VxID0gKEZvcm1fcGdfc2VxdWVuY2UpIEdFVFNU UlVDVChzZXFUdXApOworCQkJCQkJU3RyaW5nSW5mb0RhdGEgb3B0czsKKwkJCQkJCWJvb2wJCWZp cnN0X29wdCA9IHRydWU7CisJCQkJCQlpbnQ2NAkJZGVmX21pbiwKKwkJCQkJCQkJCWRlZl9tYXgs CisJCQkJCQkJCQlkZWZfc3RhcnQ7CisJCQkJCQlpbnQ2NAkJdHlwX21pbiwKKwkJCQkJCQkJCXR5 cF9tYXg7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBQZXItdHlwZSBib3VuZHMgZm9yIHRoZSBzZXF1 ZW5jZSdzIHVuZGVybHlpbmcKKwkJCQkJCSAqIGludGVnZXIgdHlwZS4gIERlZmF1bHRzIHRvIGlu dDggaWYgdGhlIGNvbHVtbiB0eXBlCisJCQkJCQkgKiBpcyBzb21ldGhpbmcgZWxzZSAoc2hvdWxk bid0IGhhcHBlbiBmb3IgSURFTlRJVFksCisJCQkJCQkgKiBidXQgYmUgZGVmZW5zaXZlKS4KKwkJ CQkJCSAqLworCQkJCQkJc3dpdGNoIChhdHQtPmF0dHR5cGlkKQorCQkJCQkJeworCQkJCQkJCWNh c2UgSU5UMk9JRDoKKwkJCQkJCQkJdHlwX21pbiA9IFBHX0lOVDE2X01JTjsKKwkJCQkJCQkJdHlw X21heCA9IFBHX0lOVDE2X01BWDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBJTlQ0T0lE OgorCQkJCQkJCQl0eXBfbWluID0gUEdfSU5UMzJfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0gUEdf SU5UMzJfTUFYOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQl0eXBf bWluID0gUEdfSU5UNjRfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0gUEdfSU5UNjRfTUFYOworCQkJ CQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHNlcS0+c2VxaW5jcmVtZW50ID4gMCkK KwkJCQkJCXsKKwkJCQkJCQlkZWZfbWluID0gMTsKKwkJCQkJCQlkZWZfbWF4ID0gdHlwX21heDsK KwkJCQkJCQlkZWZfc3RhcnQgPSBkZWZfbWluOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJ eworCQkJCQkJCWRlZl9taW4gPSB0eXBfbWluOworCQkJCQkJCWRlZl9tYXggPSAtMTsKKwkJCQkJ CQlkZWZfc3RhcnQgPSBkZWZfbWF4OworCQkJCQkJfQorCisJCQkJCQlpbml0U3RyaW5nSW5mbygm b3B0cyk7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBTRVFVRU5DRSBOQU1FIOKAlCBvbWl0IHdoZW4g aXQgbWF0Y2hlcyB0aGUKKwkJCQkJCSAqIGltcGxpY2l0ICI8dGFibGVuYW1lPl88Y29sdW1ubmFt ZT5fc2VxIiBwYXR0ZXJuCisJCQkJCQkgKiBpbiB0aGUgc2FtZSBzY2hlbWEsIHNpbmNlIENSRUFU RSBUQUJMRSB3aWxsCisJCQkJCQkgKiByZWdlbmVyYXRlIHRoYXQgZXhhY3QgbmFtZS4gIFRoZSBz ZXF1ZW5jZSBpcyBhbgorCQkJCQkJICogSU5URVJOQUwgZGVwZW5kZW5jeSBvZiB0aGUgY29sdW1u LCBzbyB0aGUgbG9jaworCQkJCQkJICogd2UgaG9sZCBvbiB0aGUgdGFibGUgYWxzbyBwaW5zIGl0 LCBidXQgdGhlCisJCQkJCQkgKiBsb29rdXAgaGVscGVyIHN0aWxsIGRlZmVuZHMgYWdhaW5zdCBh IG1pc3NpbmcKKwkJCQkJCSAqIHBnX2NsYXNzIHJvdy4KKwkJCQkJCSAqLworCQkJCQkJeworCQkJ CQkJCUhlYXBUdXBsZQlzZXFDbGFzc1R1cDsKKwkJCQkJCQlGb3JtX3BnX2NsYXNzIHNlcUNsYXNz OworCQkJCQkJCWNoYXIJCWF1dG9uYW1lW05BTUVEQVRBTEVOXTsKKworCQkJCQkJCXNlcUNsYXNz VHVwID0gU2VhcmNoU3lzQ2FjaGUxKFJFTE9JRCwKKwkJCQkJCQkJCQkJCQkJICBPYmplY3RJZEdl dERhdHVtKHNlcWlkKSk7CisJCQkJCQkJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHNlcUNsYXNzVHVw KSkKKwkJCQkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1VO REVGSU5FRF9PQkpFQ1QpLAorCQkJCQkJCQkJCSBlcnJtc2coImlkZW50aXR5IHNlcXVlbmNlIHdp dGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwKKwkJCQkJCQkJCQkJCXNlcWlkKSwKKwkJCQkJCQkJ CQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7 CisJCQkJCQkJc2VxQ2xhc3MgPSAoRm9ybV9wZ19jbGFzcykgR0VUU1RSVUNUKHNlcUNsYXNzVHVw KTsKKworCQkJCQkJCXNucHJpbnRmKGF1dG9uYW1lLCBzaXplb2YoYXV0b25hbWUpLCAiJXNfJXNf c2VxIiwKKwkJCQkJCQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpLAorCQkJCQkJCQkJ IE5hbWVTdHIoYXR0LT5hdHRuYW1lKSk7CisJCQkJCQkJaWYgKHNlcUNsYXNzLT5yZWxuYW1lc3Bh Y2UgIT0gUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKSB8fAorCQkJCQkJCQlzdHJjbXAoTmFtZVN0 cihzZXFDbGFzcy0+cmVsbmFtZSksIGF1dG9uYW1lKSAhPSAwKQorCQkJCQkJCXsKKwkJCQkJCQkJ Y2hhcgkgICAqc2VxUXVhbCA9CisJCQkJCQkJCQlsb29rdXBfcmVsbmFtZV9mb3JfZW1pdChzZXFp ZCwKKwkJCQkJCQkJCQkJCQkJCXNjaGVtYV9xdWFsaWZpZWQsCisJCQkJCQkJCQkJCQkJCQliYXNl X25hbWVzcGFjZSk7CisKKwkJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzU0VRVUVO Q0UgTkFNRSAlcyIsCisJCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcVF1YWwp OworCQkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCQkJcGZyZWUoc2VxUXVhbCk7CisJ CQkJCQkJfQorCQkJCQkJCVJlbGVhc2VTeXNDYWNoZShzZXFDbGFzc1R1cCk7CisJCQkJCQl9CisK KwkJCQkJCWlmIChzZXEtPnNlcXN0YXJ0ICE9IGRlZl9zdGFydCkKKwkJCQkJCXsKKwkJCQkJCQlh cHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNTVEFSVCBXSVRIICIgSU5UNjRfRk9STUFULAorCQkJ CQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2Vxc3RhcnQpOworCQkJCQkJCWZp cnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxaW5jcmVtZW50ICE9 IDEpCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzSU5DUkVNRU5U IEJZICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNl cS0+c2VxaW5jcmVtZW50KTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJ CQkJCWlmIChzZXEtPnNlcW1pbiAhPSBkZWZfbWluKQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0 cmluZ0luZm8oJm9wdHMsICIlc01JTlZBTFVFICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJCQkg Zmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2VxbWluKTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBm YWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcW1heCAhPSBkZWZfbWF4KQorCQkJCQkJ eworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMsICIlc01BWFZBTFVFICIgSU5UNjRfRk9S TUFULAorCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2VxbWF4KTsKKwkJ CQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcWNhY2hl ICE9IDEpCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzQ0FDSEUg IiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5z ZXFjYWNoZSk7CisJCQkJCQkJZmlyc3Rfb3B0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlpZiAo c2VxLT5zZXFjeWNsZSkKKwkJCQkJCXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAi JXNDWUNMRSIsIGZpcnN0X29wdCA/ICIiIDogIiAiKTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxz ZTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKCFmaXJzdF9vcHQpCisJCQkJCQkJYXBwZW5kU3RyaW5n SW5mbyhidWYsICIgKCVzKSIsIG9wdHMuZGF0YSk7CisKKwkJCQkJCXBmcmVlKG9wdHMuZGF0YSk7 CisJCQkJCQlSZWxlYXNlU3lzQ2FjaGUoc2VxVHVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJ CWVsc2UgaWYgKGRlZmV4cHIpCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgREVGQVVMVCAl cyIsIGRlZmV4cHIpOworCisJCQlpZiAoZGVmZXhwcikKKwkJCQlwZnJlZShkZWZleHByKTsKKwkJ fQorCisJCWlmIChhdHQtPmF0dG5vdG51bGwpCisJCXsKKwkJCUxvY2FsTm90TnVsbEVudHJ5ICpu biA9ICZubl9lbnRyaWVzW2F0dC0+YXR0bnVtXTsKKworCQkJaWYgKG5uLT5uYW1lICE9IE5VTEwg JiYgIW5uLT5pc19hdXRvKQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIENPTlNUUkFJTlQg JXMgTk9UIE5VTEwiLAorCQkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihubi0+bmFtZSkpOworCQkJ ZWxzZQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIE5PVCBOVUxMIik7CisJCQlp ZiAobm4tPm5hbWUgIT0gTlVMTCAmJiBubi0+bm9faW5oZXJpdCkKKwkJCQlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKGJ1ZiwgIiBOTyBJTkhFUklUIik7CisJCX0KKwl9CisKKwkvKgorCSAqIFRhYmxl LWxldmVsIENIRUNLIGNvbnN0cmFpbnRzIOKAlCBlbWl0dGVkIGlubGluZSBpbiB0aGUgQ1JFQVRF IFRBQkxFCisJICogYm9keSBzbyB0aGV5IGFwcGVhciBhbG9uZ3NpZGUgdGhlIGNvbHVtbnMgKHRo ZSBwZ19kdW1wIHNoYXBlKS4gIFRoZQorCSAqIGNvbnN0cmFpbnQgbG9vcCBsYXRlciBpbiBwZ19n ZXRfdGFibGVfZGRsX2ludGVybmFsIHNraXBzIENIRUNLCisJICogY29uc3RyYWludHMgdG8gYXZv aWQgZG91YmxlLWVtaXNzaW9uLgorCSAqLworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCQlh cHBlbmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRzKGJ1ZiwgcmVsLCBwcmV0dHksICZmaXJzdCk7 Cit9CisKKy8qCisgKiBhcHBlbmRfdHlwZWRfY29sdW1uX292ZXJyaWRlcworICoJCUZvciBhIHR5 cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgLi4uIE9GIHR5cGVfbmFtZSksIGFwcGVuZCB0aGUKKyAq CQlvcHRpb25hbCAiKGNvbCBXSVRIIE9QVElPTlMgLi4uLCAuLi4pIiBsaXN0IGNhcnJ5aW5nIGxv Y2FsbHkKKyAqCQlhcHBsaWVkIHBlci1jb2x1bW4gb3ZlcnJpZGVzIOKAlCBERUZBVUxULCBOT1Qg TlVMTCwgYW5kIGFueSBsb2NhbGx5CisgKgkJZGVjbGFyZWQgQ0hFQ0sgY29uc3RyYWludHMuCisg KgorICogQ29sdW1ucyB3aG9zZSB0eXBlIGlzIGZ1bGx5IGRpY3RhdGVkIGJ5IHJlbG9mdHlwZSBl bWl0IG5vdGhpbmcuICBUaGUKKyAqIHBhcmVudGhlc2lzZWQgbGlzdCBpcyBzdXBwcmVzc2VkIGVu dGlyZWx5IHdoZW4gbm8gY29sdW1uIG5lZWRzIGFuCisgKiBvdmVycmlkZSBhbmQgdGhlcmUgYXJl IG5vIGxvY2FsbHktZGVjbGFyZWQgQ0hFQ0sgY29uc3RyYWludHMsIG1hdGNoaW5nCisgKiB0aGUg Y2Fub25pY2FsICJDUkVBVEUgVEFCTEUgeCBPRiB0OyIgc2hhcGUuCisgKi8KK3N0YXRpYyB2b2lk CithcHBlbmRfdHlwZWRfY29sdW1uX292ZXJyaWRlcyhTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24g cmVsLCBib29sIHByZXR0eSwKKwkJCQkJCQkgIGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJ CQkJCQkgIExvY2FsTm90TnVsbEVudHJ5ICpubl9lbnRyaWVzKQoreworCVR1cGxlRGVzYwl0dXBk ZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCUxpc3QJICAgKmRwY29udGV4dCA9IE5JTDsK KwlTdHJpbmdJbmZvRGF0YSBpbm5lcjsKKwlib29sCQlmaXJzdCA9IHRydWU7CisKKwlpbml0U3Ry aW5nSW5mbygmaW5uZXIpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsg aSsrKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNj LCBpKTsKKwkJY2hhcgkgICAqZGVmZXhwciA9IE5VTEw7CisJCWJvb2wJCWhhc19kZWZhdWx0Owor CQlib29sCQloYXNfbm90bnVsbDsKKworCQlpZiAoYXR0LT5hdHRpc2Ryb3BwZWQpCisJCQljb250 aW51ZTsKKworCQlpZiAoYXR0LT5hdHRoYXNkZWYpCisJCQlkZWZleHByID0gZmluZF9hdHRyZGVm X3RleHQocmVsLCBhdHQtPmF0dG51bSwgJmRwY29udGV4dCk7CisKKwkJaGFzX2RlZmF1bHQgPSAo ZGVmZXhwciAhPSBOVUxMKTsKKwkJaGFzX25vdG51bGwgPSBhdHQtPmF0dG5vdG51bGw7CisKKwkJ aWYgKCFoYXNfZGVmYXVsdCAmJiAhaGFzX25vdG51bGwpCisJCXsKKwkJCWlmIChkZWZleHByKQor CQkJCXBmcmVlKGRlZmV4cHIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWZpcnN0KQor CQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmlubmVyLCAnLCcpOworCQlmaXJzdCA9IGZhbHNlOwor CQlpZiAocHJldHR5KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICJcbiAgICAi KTsKKwkJZWxzZQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmlubmVyLCAnICcpOworCisJCWFw cGVuZFN0cmluZ0luZm8oJmlubmVyLCAiJXMgV0lUSCBPUFRJT05TIiwKKwkJCQkJCSBxdW90ZV9p ZGVudGlmaWVyKE5hbWVTdHIoYXR0LT5hdHRuYW1lKSkpOworCQlpZiAoaGFzX2RlZmF1bHQpCisJ CQlhcHBlbmRTdHJpbmdJbmZvKCZpbm5lciwgIiBERUZBVUxUICVzIiwgZGVmZXhwcik7CisJCWlm IChoYXNfbm90bnVsbCkKKwkJeworCQkJTG9jYWxOb3ROdWxsRW50cnkgKm5uID0gJm5uX2VudHJp ZXNbYXR0LT5hdHRudW1dOworCisJCQlpZiAobm4tPm5hbWUgIT0gTlVMTCAmJiAhbm4tPmlzX2F1 dG8pCisJCQkJYXBwZW5kU3RyaW5nSW5mbygmaW5uZXIsICIgQ09OU1RSQUlOVCAlcyBOT1QgTlVM TCIsCisJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKG5uLT5uYW1lKSk7CisJCQllbHNlCisJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICIgTk9UIE5VTEwiKTsKKwkJCWlmIChubi0+ bmFtZSAhPSBOVUxMICYmIG5uLT5ub19pbmhlcml0KQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoJmlubmVyLCAiIE5PIElOSEVSSVQiKTsKKwkJfQorCisJCWlmIChkZWZleHByKQorCQkJcGZy ZWUoZGVmZXhwcik7CisJfQorCisJLyoKKwkgKiBMb2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0 cmFpbnRzIG9uIGEgdHlwZWQgdGFibGUgYmVsb25nIGluIHRoZQorCSAqIGNvbHVtbi1saXN0IHBh cmVudGhlc2VzLCBzYW1lIGFzIGZvciBhbiB1bnR5cGVkIHRhYmxlLiAgVGhlCisJICogb3V0LW9m LWxpbmUgY29uc3RyYWludCBsb29wIGxhdGVyIHN0aWxsIHNraXBzIENIRUNLcy4KKwkgKi8KKwlp ZiAoaW5jbHVkZV9jb25zdHJhaW50cykKKwkJYXBwZW5kX2lubGluZV9jaGVja19jb25zdHJhaW50 cygmaW5uZXIsIHJlbCwgcHJldHR5LCAmZmlyc3QpOworCisJaWYgKCFmaXJzdCkKKwl7CisJCWFw cGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiICgiKTsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmlu ZyhidWYsIGlubmVyLmRhdGEpOworCQlpZiAocHJldHR5KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZyhidWYsICJcbikiKTsKKwkJZWxzZQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAn KScpOworCX0KKwlwZnJlZShpbm5lci5kYXRhKTsKK30KKworLyoKKyAqIGFwcGVuZF9zdG10IC8g YXBwZW5kX3N0cmlwcGVkX3N0bXQKKyAqCQlQdXNoIGN0eC0+YnVmIG9udG8gY3R4LT5zdGF0ZW1l bnRzLgorICoKKyAqIGFwcGVuZF9zdG10IGlzIHVzZWQgZm9yIGVtaXNzaW9ucyB3aGVyZSB0aGUg dGFibGUgcmVmZXJlbmNlIGlzIGJ1aWx0CisgKiBmcm9tIGN0eC0+cXVhbG5hbWUgKGFscmVhZHkg cGFydGlhbC1xdWFsaWZpZWQgcGVyIHNjaGVtYV9xdWFsaWZpZWQpLgorICogYXBwZW5kX3N0cmlw cGVkX3N0bXQgaXMgdXNlZCBhZnRlciBpbnZva2luZyBhbHdheXMtcXVhbGlmaWVkIHJ1bGV1dGls cworICogaGVscGVycyAocGdfZ2V0X2NvbnN0cmFpbnRkZWZfY29tbWFuZCwgcGdfZ2V0X2luZGV4 ZGVmX3N0cmluZywKKyAqIHBnX2dldF9ydWxlZGVmLCBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9z dHJpbmcpIOKAlCB3aGVuCisgKiBzY2hlbWFfcXVhbGlmaWVkIGlzIGZhbHNlLCB0aGUgYmFzZS1z Y2hlbWEgcHJlZml4IGlzIHN0cmlwcGVkIGZyb20KKyAqIHRoZWlyIG91dHB1dCBzbyB0aGUgZW1p dHRlZCBEREwgaXMgcmVwbGF5LXJlbG9jYXRhYmxlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5k X3N0bXQoVGFibGVEZGxDb250ZXh0ICpjdHgpCit7CisJY3R4LT5zdGF0ZW1lbnRzID0gbGFwcGVu ZChjdHgtPnN0YXRlbWVudHMsIHBzdHJkdXAoY3R4LT5idWYuZGF0YSkpOworfQorCitzdGF0aWMg dm9pZAorYXBwZW5kX3N0cmlwcGVkX3N0bXQoVGFibGVEZGxDb250ZXh0ICpjdHgpCit7CisJaWYg KGN0eC0+c2NoZW1hX3ByZWZpeCAhPSBOVUxMKQorCQljdHgtPnN0YXRlbWVudHMgPSBsYXBwZW5k KGN0eC0+c3RhdGVtZW50cywKKwkJCQkJCQkJICBzdHJpcF9zY2hlbWFfcHJlZml4KGN0eC0+YnVm LmRhdGEsCisJCQkJCQkJCQkJCQkJICBjdHgtPnNjaGVtYV9wcmVmaXgpKTsKKwllbHNlCisJCWN0 eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1lbnRzLCBwc3RyZHVwKGN0eC0+YnVm LmRhdGEpKTsKK30KKworLyoKKyAqIGVtaXRfY3JlYXRlX3RhYmxlX3N0bXQKKyAqCQlCdWlsZCB0 aGUgbGVhZGluZyBDUkVBVEUgVEFCTEUgc3RhdGVtZW50LCBpbmNsdWRpbmcgcGVyc2lzdGVuY2UK KyAqCQkoVEVNUE9SQVJZIC8gVU5MT0dHRUQpLCBib2R5IChjb2x1bW4gbGlzdCAvIE9GIHR5cGVf bmFtZSAvCisgKgkJUEFSVElUSU9OIE9GIHBhcmVudCksIElOSEVSSVRTLCBQQVJUSVRJT04gQlks IFVTSU5HIG1ldGhvZCwKKyAqCQlXSVRIIChyZWxvcHRpb25zKSwgVEFCTEVTUEFDRSwgYW5kIE9O IENPTU1JVC4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfY3JlYXRlX3RhYmxlX3N0bXQoVGFibGVE ZGxDb250ZXh0ICpjdHgpCit7CisJUmVsYXRpb24JcmVsID0gY3R4LT5yZWw7CisJY2hhcgkJcmVs cGVyc2lzdGVuY2UgPSByZWwtPnJkX3JlbC0+cmVscGVyc2lzdGVuY2U7CisJY2hhcgkJcmVsa2lu ZCA9IHJlbC0+cmRfcmVsLT5yZWxraW5kOworCWJvb2wJCWlzX3R5cGVkID0gT2lkSXNWYWxpZChy ZWwtPnJkX3JlbC0+cmVsb2Z0eXBlKTsKKwlIZWFwVHVwbGUJY2xhc3N0dXA7CisJRGF0dW0JCXJl bG9wdERhdHVtOworCWJvb2wJCXJlbG9wdElzbnVsbDsKKworCWNsYXNzdHVwID0gU2VhcmNoU3lz Q2FjaGUxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSk7CisJaWYgKCFIZWFw VHVwbGVJc1ZhbGlkKGNsYXNzdHVwKSkKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWls ZWQgZm9yIHJlbGF0aW9uICV1IiwgY3R4LT5yZWxpZCk7CisKKwlyZWxvcHREYXR1bSA9IFN5c0Nh Y2hlR2V0QXR0cihSRUxPSUQsIGNsYXNzdHVwLAorCQkJCQkJCQkgIEFudW1fcGdfY2xhc3NfcmVs b3B0aW9ucywgJnJlbG9wdElzbnVsbCk7CisKKwlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsK KwlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIkNSRUFURSAiKTsKKwlpZiAocmVs cGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0VfVEVNUCkKKwkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZygmY3R4LT5idWYsICJURU1QT1JBUlkgIik7CisJZWxzZSBpZiAocmVscGVyc2lzdGVuY2Ug PT0gUkVMUEVSU0lTVEVOQ0VfVU5MT0dHRUQpCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0 eC0+YnVmLCAiVU5MT0dHRUQgIik7CisJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICJUQUJM RSAlcyIsIGN0eC0+cXVhbG5hbWUpOworCisJaWYgKHJlbC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlv bikKKwl7CisJCU9pZAkJCXBhcmVudE9pZCA9IGdldF9wYXJ0aXRpb25fcGFyZW50KGN0eC0+cmVs aWQsIHRydWUpOworCQljaGFyCSAgICpwYXJlbnRRdWFsID0gbG9va3VwX3JlbG5hbWVfZm9yX2Vt aXQocGFyZW50T2lkLAorCQkJCQkJCQkJCQkJCQkgY3R4LT5zY2hlbWFfcXVhbGlmaWVkLAorCQkJ CQkJCQkJCQkJCQkgY3R4LT5iYXNlX25hbWVzcGFjZSk7CisJCWNoYXIJICAgKnBhcmVudFJlbG5h bWUgPSBnZXRfcmVsX25hbWUocGFyZW50T2lkKTsKKwkJRGF0dW0JCWJvdW5kRGF0dW07CisJCWJv b2wJCWJvdW5kSXNudWxsOworCQljaGFyCSAgICpmb3JWYWx1ZXMgPSBOVUxMOworCQljaGFyCSAg ICpib3VuZFN0ciA9IE5VTEw7CisKKwkJaWYgKHBhcmVudFJlbG5hbWUgPT0gTlVMTCkKKwkJCWVy ZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJ CQkJCSBlcnJtc2coInBhcnRpdGlvbiBwYXJlbnQgd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3Qi LAorCQkJCQkJCXBhcmVudE9pZCksCisJCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4g Y29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKworCQlib3VuZERhdHVtID0gU3lzQ2FjaGVHZXRB dHRyKFJFTE9JRCwgY2xhc3N0dXAsCisJCQkJCQkJCQkgQW51bV9wZ19jbGFzc19yZWxwYXJ0Ym91 bmQsICZib3VuZElzbnVsbCk7CisJCWlmICghYm91bmRJc251bGwpCisJCXsKKwkJCU5vZGUJICAg KmJvdW5kTm9kZTsKKwkJCUxpc3QJICAgKmRwY29udGV4dDsKKworCQkJYm91bmRTdHIgPSBUZXh0 RGF0dW1HZXRDU3RyaW5nKGJvdW5kRGF0dW0pOworCQkJYm91bmROb2RlID0gc3RyaW5nVG9Ob2Rl KGJvdW5kU3RyKTsKKwkJCWRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9mb3IocGFyZW50UmVs bmFtZSwgcGFyZW50T2lkKTsKKwkJCWZvclZhbHVlcyA9IGRlcGFyc2VfZXhwcmVzc2lvbihib3Vu ZE5vZGUsIGRwY29udGV4dCwgZmFsc2UsIGZhbHNlKTsKKwkJfQorCisJCWFwcGVuZFN0cmluZ0lu Zm8oJmN0eC0+YnVmLCAiIFBBUlRJVElPTiBPRiAlcyAlcyIsCisJCQkJCQkgcGFyZW50UXVhbCwg Zm9yVmFsdWVzID8gZm9yVmFsdWVzIDogIkRFRkFVTFQiKTsKKwkJaWYgKGZvclZhbHVlcykKKwkJ CXBmcmVlKGZvclZhbHVlcyk7CisJCWlmIChib3VuZFN0cikKKwkJCXBmcmVlKGJvdW5kU3RyKTsK KwkJcGZyZWUocGFyZW50UXVhbCk7CisJCXBmcmVlKHBhcmVudFJlbG5hbWUpOworCX0KKwllbHNl IGlmIChpc190eXBlZCkKKwl7CisJCWNoYXIJICAgKnR5cG5hbWUgPSBmb3JtYXRfdHlwZV9iZV9x dWFsaWZpZWQocmVsLT5yZF9yZWwtPnJlbG9mdHlwZSk7CisKKwkJYXBwZW5kU3RyaW5nSW5mbygm Y3R4LT5idWYsICIgT0YgJXMiLCB0eXBuYW1lKTsKKwkJcGZyZWUodHlwbmFtZSk7CisKKwkJYXBw ZW5kX3R5cGVkX2NvbHVtbl9vdmVycmlkZXMoJmN0eC0+YnVmLCByZWwsIGN0eC0+cHJldHR5LAor CQkJCQkJCQkJICBjdHgtPmluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJCQkgIGN0eC0+bm5f ZW50cmllcyk7CisJfQorCWVsc2UKKwl7CisJCUxpc3QJICAgKnBhcmVudHM7CisJCUxpc3RDZWxs ICAgKmxjOworCQlib29sCQlmaXJzdDsKKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgt PmJ1ZiwgIiAoIik7CisKKwkJYXBwZW5kX2NvbHVtbl9kZWZzKCZjdHgtPmJ1ZiwgcmVsLCBjdHgt PnByZXR0eSwKKwkJCQkJCSAgIGN0eC0+aW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCSAgIGN0 eC0+c2NoZW1hX3F1YWxpZmllZCwgY3R4LT5ubl9lbnRyaWVzKTsKKworCQlpZiAoY3R4LT5wcmV0 dHkpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIlxuKSIpOworCQllbHNl CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmY3R4LT5idWYsICcpJyk7CisKKwkJcGFyZW50cyA9 IGdldF9pbmhlcml0YW5jZV9wYXJlbnRzKGN0eC0+cmVsaWQpOworCQlpZiAocGFyZW50cyAhPSBO SUwpCisJCXsKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiIElOSEVSSVRT ICgiKTsKKwkJCWZpcnN0ID0gdHJ1ZTsKKwkJCWZvcmVhY2gobGMsIHBhcmVudHMpCisJCQl7CisJ CQkJT2lkCQkJcG9pZCA9IGxmaXJzdF9vaWQobGMpOworCQkJCWNoYXIJICAgKnBuYW1lID0gbG9v a3VwX3JlbG5hbWVfZm9yX2VtaXQocG9pZCwKKwkJCQkJCQkJCQkJCQkJCWN0eC0+c2NoZW1hX3F1 YWxpZmllZCwKKwkJCQkJCQkJCQkJCQkJCWN0eC0+YmFzZV9uYW1lc3BhY2UpOworCisJCQkJaWYg KCFmaXJzdCkKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsICIsICIpOwor CQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYs IHBuYW1lKTsKKwkJCQlwZnJlZShwbmFtZSk7CisJCQl9CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hh cigmY3R4LT5idWYsICcpJyk7CisJCQlsaXN0X2ZyZWUocGFyZW50cyk7CisJCX0KKwl9CisKKwlp ZiAocmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKQorCXsKKwkJRGF0dW0JCXBh cnRrZXlEYXR1bTsKKwkJY2hhcgkgICAqcGFydGtleTsKKworCQlwYXJ0a2V5RGF0dW0gPSBPaWRG dW5jdGlvbkNhbGwxKEZfUEdfR0VUX1BBUlRLRVlERUYsCisJCQkJCQkJCQkJT2JqZWN0SWRHZXRE YXR1bShjdHgtPnJlbGlkKSk7CisJCXBhcnRrZXkgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKHBhcnRr ZXlEYXR1bSk7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFBBUlRJVElPTiBCWSAl cyIsIHBhcnRrZXkpOworCQlwZnJlZShwYXJ0a2V5KTsKKwl9CisKKwlpZiAoT2lkSXNWYWxpZChy ZWwtPnJkX3JlbC0+cmVsYW0pICYmCisJCXJlbC0+cmRfcmVsLT5yZWxhbSAhPSBIRUFQX1RBQkxF X0FNX09JRCkKKwl7CisJCWNoYXIJICAgKmFtbmFtZSA9IGdldF9hbV9uYW1lKHJlbC0+cmRfcmVs LT5yZWxhbSk7CisKKwkJaWYgKGFtbmFtZSAhPSBOVUxMKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJ bmZvKCZjdHgtPmJ1ZiwgIiBVU0lORyAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoYW1u YW1lKSk7CisJCQlwZnJlZShhbW5hbWUpOworCQl9CisJfQorCisJaWYgKCFyZWxvcHRJc251bGwp CisJeworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiBXSVRIICgiKTsKKwkJ Z2V0X3JlbG9wdGlvbnMoJmN0eC0+YnVmLCByZWxvcHREYXR1bSk7CisJCWFwcGVuZFN0cmluZ0lu Zm9DaGFyKCZjdHgtPmJ1ZiwgJyknKTsKKwl9CisKKwlSZWxlYXNlU3lzQ2FjaGUoY2xhc3N0dXAp OworCisJaWYgKCFjdHgtPm5vX3RhYmxlc3BhY2UgJiYgT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+ cmVsdGFibGVzcGFjZSkpCisJeworCQljaGFyCSAgICp0c25hbWUgPSBnZXRfdGFibGVzcGFjZV9u YW1lKHJlbC0+cmRfcmVsLT5yZWx0YWJsZXNwYWNlKTsKKworCQlpZiAodHNuYW1lICE9IE5VTEwp CisJCXsKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFRBQkxFU1BBQ0UgJXMiLAor CQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKHRzbmFtZSkpOworCQkJcGZyZWUodHNuYW1lKTsKKwkJ fQorCX0KKworCWlmIChyZWxwZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5DRV9URU1QKQorCXsK KwkJT25Db21taXRBY3Rpb24gb2MgPSBnZXRfb25fY29tbWl0X2FjdGlvbihjdHgtPnJlbGlkKTsK KworCQlpZiAob2MgPT0gT05DT01NSVRfREVMRVRFX1JPV1MpCisJCQlhcHBlbmRTdHJpbmdJbmZv U3RyaW5nKCZjdHgtPmJ1ZiwgIiBPTiBDT01NSVQgREVMRVRFIFJPV1MiKTsKKwkJZWxzZSBpZiAo b2MgPT0gT05DT01NSVRfRFJPUCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVm LCAiIE9OIENPTU1JVCBEUk9QIik7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmN0eC0+ YnVmLCAnOycpOworCWFwcGVuZF9zdG10KGN0eCk7Cit9CisKKy8qCisgKiBlbWl0X293bmVyX3N0 bXQKKyAqCQlBTFRFUiBUQUJMRSBxdWFsbmFtZSBPV05FUiBUTyByb2xlLgorICovCitzdGF0aWMg dm9pZAorZW1pdF9vd25lcl9zdG10KFRhYmxlRGRsQ29udGV4dCAqY3R4KQoreworCWNoYXIJICAg Km93bmVyOworCisJaWYgKGN0eC0+bm9fb3duZXIpCisJCXJldHVybjsKKworCW93bmVyID0gR2V0 VXNlck5hbWVGcm9tSWQoY3R4LT5yZWwtPnJkX3JlbC0+cmVsb3duZXIsIGZhbHNlKTsKKwlyZXNl dFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwgIkFM VEVSIFRBQkxFICVzIE9XTkVSIFRPICVzOyIsCisJCQkJCSBjdHgtPnF1YWxuYW1lLCBxdW90ZV9p ZGVudGlmaWVyKG93bmVyKSk7CisJYXBwZW5kX3N0bXQoY3R4KTsKKwlwZnJlZShvd25lcik7Cit9 CisKKy8qCisgKiBlbWl0X2NoaWxkX2RlZmF1bHRfb3ZlcnJpZGVzCisgKgkJQUxURVIgVEFCTEUg cXVhbG5hbWUgQUxURVIgQ09MVU1OIGNvbCBTRVQgREVGQVVMVCBleHByIOKAlCBvbmUgcGVyCisg KgkJaW5oZXJpdGVkIChhdHRpc2xvY2FsPWZhbHNlKSBub24tZ2VuZXJhdGVkIGNvbHVtbiBjYXJy eWluZyBhCisgKgkJbG9jYWxseS1zZXQgZGVmYXVsdC4gIEdlbmVyYXRlZCBjb2x1bW5zIGFyZSBz a2lwcGVkOiB0aGVpcgorICoJCWV4cHJlc3Npb24gaXMgaW5oZXJpdGVkIGF1dG9tYXRpY2FsbHkg YW5kIFNFVCBERUZBVUxUIHdvdWxkCisgKgkJZmFpbCBhdCByZXBsYXkuCisgKi8KK3N0YXRpYyB2 b2lkCitlbWl0X2NoaWxkX2RlZmF1bHRfb3ZlcnJpZGVzKFRhYmxlRGRsQ29udGV4dCAqY3R4KQor eworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihjdHgtPnJlbCk7CisJTGlz dAkgICAqZHBjb250ZXh0ID0gTklMOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5u YXR0czsgaSsrKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0 dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAqZGVmc3RyOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBl ZCB8fCBhdHQtPmF0dGlzbG9jYWwgfHwgIWF0dC0+YXR0aGFzZGVmKQorCQkJY29udGludWU7CisJ CWlmIChhdHQtPmF0dGdlbmVyYXRlZCAhPSAnXDAnKQorCQkJY29udGludWU7CisKKwkJZGVmc3Ry ID0gZmluZF9hdHRyZGVmX3RleHQoY3R4LT5yZWwsIGF0dC0+YXR0bnVtLCAmZHBjb250ZXh0KTsK KwkJaWYgKGRlZnN0ciA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcmVzZXRTdHJpbmdJbmZv KCZjdHgtPmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJICJBTFRF UiBUQUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgU0VUIERFRkFVTFQgJXM7IiwKKwkJCQkJCSBjdHgt PnF1YWxuYW1lLAorCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQtPmF0dG5hbWUp KSwKKwkJCQkJCSBkZWZzdHIpOworCQlhcHBlbmRfc3RtdChjdHgpOworCQlwZnJlZShkZWZzdHIp OworCX0KK30KKworLyoKKyAqIGVtaXRfYXR0b3B0aW9ucworICoJCUFMVEVSIFRBQkxFIHF1YWxu YW1lIEFMVEVSIENPTFVNTiBjb2wgU0VUICguLi4pIOKAlCBvbmUgcGVyIGNvbHVtbgorICoJCXdp dGggbm9uLW51bGwgcGdfYXR0cmlidXRlLmF0dG9wdGlvbnMuICBUaGUgaW5saW5lIGZvcm0gb2Yg dGhlc2UKKyAqCQlvcHRpb25zIGlzbid0IGF2YWlsYWJsZSBpbiBDUkVBVEUgVEFCTEUsIHNvIHRo ZXkgY29tZSBvdXQgaGVyZS4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfYXR0b3B0aW9ucyhUYWJs ZURkbENvbnRleHQgKmN0eCkKK3sKKwlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVz Y3IoY3R4LT5yZWwpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsr KQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBp KTsKKwkJSGVhcFR1cGxlCWF0dFR1cDsKKwkJRGF0dW0JCW9wdERhdHVtOworCQlib29sCQlvcHRJ c251bGw7CisKKwkJaWYgKGF0dC0+YXR0aXNkcm9wcGVkKQorCQkJY29udGludWU7CisKKwkJYXR0 VHVwID0gU2VhcmNoU3lzQ2FjaGUyKEFUVE5VTSwKKwkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0o Y3R4LT5yZWxpZCksCisJCQkJCQkJCSBJbnQxNkdldERhdHVtKGF0dC0+YXR0bnVtKSk7CisJCWlm ICghSGVhcFR1cGxlSXNWYWxpZChhdHRUdXApKQorCQkJY29udGludWU7CisKKwkJb3B0RGF0dW0g PSBTeXNDYWNoZUdldEF0dHIoQVRUTlVNLCBhdHRUdXAsCisJCQkJCQkJCSAgIEFudW1fcGdfYXR0 cmlidXRlX2F0dG9wdGlvbnMsICZvcHRJc251bGwpOworCQlpZiAoIW9wdElzbnVsbCkKKwkJewor CQkJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgt PmJ1ZiwKKwkJCQkJCQkgIkFMVEVSIFRBQkxFICVzIEFMVEVSIENPTFVNTiAlcyBTRVQgKCIsCisJ CQkJCQkJIGN0eC0+cXVhbG5hbWUsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihh dHQtPmF0dG5hbWUpKSk7CisJCQlnZXRfcmVsb3B0aW9ucygmY3R4LT5idWYsIG9wdERhdHVtKTsK KwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiKTsiKTsKKwkJCWFwcGVuZF9z dG10KGN0eCk7CisJCX0KKwkJUmVsZWFzZVN5c0NhY2hlKGF0dFR1cCk7CisJfQorfQorCisvKgor ICogZW1pdF9pbmRleGVzCisgKgkJQ1JFQVRFIElOREVYIHBlciBub24tY29uc3RyYWludC1iYWNr ZWQgaW5kZXggb24gdGhlIHJlbGF0aW9uLgorICoJCUluZGV4ZXMgdGhhdCBiYWNrIFBLIC8gVU5J UVVFIC8gRVhDTFVERSBjb25zdHJhaW50cyBhcmUgZW1pdHRlZAorICoJCW91dC1vZi1saW5lIGJ5 IGVtaXRfbG9jYWxfY29uc3RyYWludHMgKHRoZSBBTFRFUiBUQUJMRSDigKYgQURECisgKgkJQ09O U1RSQUlOVCBzdGF0ZW1lbnQgY3JlYXRlcyB0aGUgaW5kZXggaW1wbGljaXRseSkuCisgKi8KK3N0 YXRpYyB2b2lkCitlbWl0X2luZGV4ZXMoVGFibGVEZGxDb250ZXh0ICpjdHgpCit7CisJTGlzdAkg ICAqaW5kZXhvaWRzOworCUxpc3RDZWxsICAgKmxjOworCisJaWYgKCFjdHgtPmluY2x1ZGVfaW5k ZXhlcykKKwkJcmV0dXJuOworCisJaW5kZXhvaWRzID0gUmVsYXRpb25HZXRJbmRleExpc3QoY3R4 LT5yZWwpOworCWZvcmVhY2gobGMsIGluZGV4b2lkcykKKwl7CisJCU9pZAkJCWlkeG9pZCA9IGxm aXJzdF9vaWQobGMpOworCQljaGFyCSAgICppZHhkZWY7CisKKwkJaWYgKE9pZElzVmFsaWQoZ2V0 X2luZGV4X2NvbnN0cmFpbnQoaWR4b2lkKSkpCisJCQljb250aW51ZTsKKworCQlpZHhkZWYgPSBw Z19nZXRfaW5kZXhkZWZfc3RyaW5nKGlkeG9pZCk7CisJCXJlc2V0U3RyaW5nSW5mbygmY3R4LT5i dWYpOworCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwgIiVzOyIsIGlkeGRlZik7CisJCWFw cGVuZF9zdHJpcHBlZF9zdG10KGN0eCk7CisJCXBmcmVlKGlkeGRlZik7CisJfQorCWxpc3RfZnJl ZShpbmRleG9pZHMpOworfQorCisvKgorICogZW1pdF9sb2NhbF9jb25zdHJhaW50cworICoJCUFM VEVSIFRBQkxFIOKApiBBREQgQ09OU1RSQUlOVCBmb3IgZWFjaCBsb2NhbGx5LWRlZmluZWQgY29u c3RyYWludAorICoJCW9uIHRoZSByZWxhdGlvbi4gIEluaGVyaXRlZCBjb25zdHJhaW50cyAoY29u aXNsb2NhbD1mYWxzZSkgY29tZQorICoJCWZyb20gdGhlIHBhcmVudCdzIERETC4gIENIRUNLIGNv bnN0cmFpbnRzIGFyZSBlbWl0dGVkIGlubGluZSBmb3IKKyAqCQlyZWd1bGFyL3R5cGVkIHRhYmxl cyAoc2tpcCBoZXJlKSBidXQgb3V0LW9mLWxpbmUgZm9yIHBhcnRpdGlvbgorICoJCWNoaWxkcmVu IChubyBjb2x1bW4gbGlzdCB0byBsaXZlIGluKS4gIFVzZXItbmFtZWQgTk9UIE5VTEwKKyAqCQlj b25zdHJhaW50cyBhcmUgZW1pdHRlZCBpbmxpbmUgYnkgdGhlIGNvbHVtbi1lbWl0IGhlbHBlcnMg YW5kCisgKgkJYXJlIHNraXBwZWQgdmlhIHNraXBfbm90bnVsbF9vaWRzOyBhdXRvLW5hbWVkIE5P VCBOVUxMcyBmYWxsCisgKgkJdGhyb3VnaCBoZXJlIGFuZCBhcmUgZGVkdXAnZCBieSBuYW1lIGF0 IHJlcGxheS4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfbG9jYWxfY29uc3RyYWludHMoVGFibGVE ZGxDb250ZXh0ICpjdHgpCit7CisJUmVsYXRpb24JY29uUmVsOworCVN5c1NjYW5EZXNjIGNvblNj YW47CisJU2NhbktleURhdGEgY29uS2V5OworCUhlYXBUdXBsZQljb25UdXA7CisJYm9vbAkJaXNf cGFydGl0aW9uID0gY3R4LT5yZWwtPnJkX3JlbC0+cmVsaXNwYXJ0aXRpb247CisKKwlpZiAoIWN0 eC0+aW5jbHVkZV9jb25zdHJhaW50cykKKwkJcmV0dXJuOworCisJY29uUmVsID0gdGFibGVfb3Bl bihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlTY2FuS2V5SW5pdCgm Y29uS2V5LAorCQkJCUFudW1fcGdfY29uc3RyYWludF9jb25yZWxpZCwKKwkJCQlCVEVxdWFsU3Ry YXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSk7 CisJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nhbihjb25SZWwsIENvbnN0cmFpbnRSZWxpZFR5 cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCSB0cnVlLCBOVUxMLCAxLCAmY29uS2V5KTsKKworCXdo aWxlIChIZWFwVHVwbGVJc1ZhbGlkKGNvblR1cCA9IHN5c3RhYmxlX2dldG5leHQoY29uU2Nhbikp KQorCXsKKwkJRm9ybV9wZ19jb25zdHJhaW50IGNvbiA9IChGb3JtX3BnX2NvbnN0cmFpbnQpIEdF VFNUUlVDVChjb25UdXApOworCQljaGFyCSAgICpjb25kZWY7CisKKwkJaWYgKCFjb24tPmNvbmlz bG9jYWwpCisJCQljb250aW51ZTsKKwkJaWYgKGNvbi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX0NI RUNLICYmICFpc19wYXJ0aXRpb24pCisJCQljb250aW51ZTsKKwkJaWYgKGNvbi0+Y29udHlwZSA9 PSBDT05TVFJBSU5UX05PVE5VTEwgJiYgIWlzX3BhcnRpdGlvbiAmJgorCQkJbGlzdF9tZW1iZXJf b2lkKGN0eC0+c2tpcF9ub3RudWxsX29pZHMsIGNvbi0+b2lkKSkKKwkJCWNvbnRpbnVlOworCisJ CWNvbmRlZiA9IHBnX2dldF9jb25zdHJhaW50ZGVmX2NvbW1hbmQoY29uLT5vaWQpOworCQlyZXNl dFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIl czsiLCBjb25kZWYpOworCQlhcHBlbmRfc3RyaXBwZWRfc3RtdChjdHgpOworCQlwZnJlZShjb25k ZWYpOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJl bCwgQWNjZXNzU2hhcmVMb2NrKTsKK30KKworLyoKKyAqIGVtaXRfcnVsZXMKKyAqCQlDUkVBVEUg UlVMRSBwZXIgY2FjaGVkIHJld3JpdGUgcnVsZSBvbiB0aGUgcmVsYXRpb24uCisgKi8KK3N0YXRp YyB2b2lkCitlbWl0X3J1bGVzKFRhYmxlRGRsQ29udGV4dCAqY3R4KQoreworCWlmICghY3R4LT5p bmNsdWRlX3J1bGVzIHx8IGN0eC0+cmVsLT5yZF9ydWxlcyA9PSBOVUxMKQorCQlyZXR1cm47CisK Kwlmb3IgKGludCBpID0gMDsgaSA8IGN0eC0+cmVsLT5yZF9ydWxlcy0+bnVtTG9ja3M7IGkrKykK Kwl7CisJCU9pZAkJCXJ1bGVpZCA9IGN0eC0+cmVsLT5yZF9ydWxlcy0+cnVsZXNbaV0tPnJ1bGVJ ZDsKKwkJRGF0dW0JCXJ1bGVkZWY7CisJCWNoYXIJICAgKnJ1bGVkZWZfc3RyOworCisJCXJ1bGVk ZWYgPSBPaWRGdW5jdGlvbkNhbGwxKEZfUEdfR0VUX1JVTEVERUZfT0lELAorCQkJCQkJCQkgICBP YmplY3RJZEdldERhdHVtKHJ1bGVpZCkpOworCQlydWxlZGVmX3N0ciA9IFRleHREYXR1bUdldENT dHJpbmcocnVsZWRlZik7CisJCXJlc2V0U3RyaW5nSW5mbygmY3R4LT5idWYpOworCQlhcHBlbmRT dHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgcnVsZWRlZl9zdHIpOworCQlhcHBlbmRfc3RyaXBw ZWRfc3RtdChjdHgpOworCQlwZnJlZShydWxlZGVmX3N0cik7CisJfQorfQorCisvKgorICogZW1p dF9zdGF0aXN0aWNzCisgKgkJQ1JFQVRFIFNUQVRJU1RJQ1MgcGVyIGV4dGVuZGVkIHN0YXRpc3Rp Y3Mgb2JqZWN0IG9uIHRoZSByZWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfc3RhdGlz dGljcyhUYWJsZURkbENvbnRleHQgKmN0eCkKK3sKKwlSZWxhdGlvbglzdGF0UmVsOworCVN5c1Nj YW5EZXNjIHN0YXRTY2FuOworCVNjYW5LZXlEYXRhIHN0YXRLZXk7CisJSGVhcFR1cGxlCXN0YXRU dXA7CisKKwlpZiAoIWN0eC0+aW5jbHVkZV9zdGF0aXN0aWNzKQorCQlyZXR1cm47CisKKwlzdGF0 UmVsID0gdGFibGVfb3BlbihTdGF0aXN0aWNFeHRSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2sp OworCVNjYW5LZXlJbml0KCZzdGF0S2V5LAorCQkJCUFudW1fcGdfc3RhdGlzdGljX2V4dF9zdHhy ZWxpZCwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRH ZXREYXR1bShjdHgtPnJlbGlkKSk7CisJc3RhdFNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oc3Rh dFJlbCwgU3RhdGlzdGljRXh0UmVsaWRJbmRleElkLAorCQkJCQkJCQkgIHRydWUsIE5VTEwsIDEs ICZzdGF0S2V5KTsKKworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHN0YXRUdXAgPSBzeXN0YWJs ZV9nZXRuZXh0KHN0YXRTY2FuKSkpCisJeworCQlGb3JtX3BnX3N0YXRpc3RpY19leHQgc3RhdCA9 IChGb3JtX3BnX3N0YXRpc3RpY19leHQpIEdFVFNUUlVDVChzdGF0VHVwKTsKKwkJY2hhcgkgICAq c3RhdGRlZiA9IHBnX2dldF9zdGF0aXN0aWNzb2JqZGVmX3N0cmluZyhzdGF0LT5vaWQpOworCisJ CXJlc2V0U3RyaW5nSW5mbygmY3R4LT5idWYpOworCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1 ZiwgIiVzOyIsIHN0YXRkZWYpOworCQlhcHBlbmRfc3RyaXBwZWRfc3RtdChjdHgpOworCQlwZnJl ZShzdGF0ZGVmKTsKKwl9CisJc3lzdGFibGVfZW5kc2NhbihzdGF0U2Nhbik7CisJdGFibGVfY2xv c2Uoc3RhdFJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKK30KKworLyoKKyAqIGVtaXRfcmVwbGljYV9p ZGVudGl0eQorICoJCUFMVEVSIFRBQkxFIHF1YWxuYW1lIFJFUExJQ0EgSURFTlRJVFkg4oCmIOKA lCBlbWl0dGVkIG9ubHkgd2hlbiB0aGUKKyAqCQlyZWxyZXBsaWRlbnQgZGlmZmVycyBmcm9tIHRo ZSBkZWZhdWx0ICgnZCcgPSB1c2UgcHJpbWFyeSBrZXkpLgorICovCitzdGF0aWMgdm9pZAorZW1p dF9yZXBsaWNhX2lkZW50aXR5KFRhYmxlRGRsQ29udGV4dCAqY3R4KQoreworCWlmICghY3R4LT5p bmNsdWRlX3JlcGxpY2FfaWRlbnRpdHkpCisJCXJldHVybjsKKwlpZiAoY3R4LT5yZWwtPnJkX3Jl bC0+cmVscmVwbGlkZW50ID09IFJFUExJQ0FfSURFTlRJVFlfREVGQVVMVCkKKwkJcmV0dXJuOwor CisJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJc3dpdGNoIChjdHgtPnJlbC0+cmRfcmVs LT5yZWxyZXBsaWRlbnQpCisJeworCQljYXNlIFJFUExJQ0FfSURFTlRJVFlfTk9USElORzoKKwkJ CWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJCSAiQUxURVIgVEFCTEUgJXMgUkVQ TElDQSBJREVOVElUWSBOT1RISU5HOyIsCisJCQkJCQkJIGN0eC0+cXVhbG5hbWUpOworCQkJYXBw ZW5kX3N0bXQoY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIFJFUExJQ0FfSURFTlRJVFlfRlVMTDoK KwkJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJCSAiQUxURVIgVEFCTEUgJXMg UkVQTElDQSBJREVOVElUWSBGVUxMOyIsCisJCQkJCQkJIGN0eC0+cXVhbG5hbWUpOworCQkJYXBw ZW5kX3N0bXQoY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIFJFUExJQ0FfSURFTlRJVFlfSU5ERVg6 CisJCQl7CisJCQkJT2lkCQkJcmVwbGlkeCA9IFJlbGF0aW9uR2V0UmVwbGljYUluZGV4KGN0eC0+ cmVsKTsKKworCQkJCWlmIChPaWRJc1ZhbGlkKHJlcGxpZHgpKQorCQkJCXsKKwkJCQkJY2hhcgkg ICAqaWR4bmFtZSA9IGdldF9yZWxfbmFtZShyZXBsaWR4KTsKKworCQkJCQlpZiAoaWR4bmFtZSA9 PSBOVUxMKQorCQkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9V TkRFRklORURfT0JKRUNUKSwKKwkJCQkJCQkJIGVycm1zZygicmVwbGljYSBpZGVudGl0eSBpbmRl eCB3aXRoIE9JRCAldSBkb2VzIG5vdCBleGlzdCIsCisJCQkJCQkJCQkJcmVwbGlkeCksCisJCQkJ CQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikp KTsKKworCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwKKwkJCQkJCQkJCSAiQUxURVIg VEFCTEUgJXMgUkVQTElDQSBJREVOVElUWSBVU0lORyBJTkRFWCAlczsiLAorCQkJCQkJCQkJIGN0 eC0+cXVhbG5hbWUsCisJCQkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihpZHhuYW1lKSk7CisJCQkJ CWFwcGVuZF9zdG10KGN0eCk7CisJCQkJCXBmcmVlKGlkeG5hbWUpOworCQkJCX0KKwkJCX0KKwkJ CWJyZWFrOworCX0KK30KKworLyoKKyAqIGVtaXRfcmxzX3RvZ2dsZXMKKyAqCQlBTFRFUiBUQUJM RSBxdWFsbmFtZSBFTkFCTEUgLyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFkuCisgKi8KK3N0YXRp YyB2b2lkCitlbWl0X3Jsc190b2dnbGVzKFRhYmxlRGRsQ29udGV4dCAqY3R4KQoreworCWlmICgh Y3R4LT5pbmNsdWRlX3JscykKKwkJcmV0dXJuOworCisJaWYgKGN0eC0+cmVsLT5yZF9yZWwtPnJl bHJvd3NlY3VyaXR5KQorCXsKKwkJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVu ZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBFTkFCTEUgUk9X IExFVkVMIFNFQ1VSSVRZOyIsCisJCQkJCQkgY3R4LT5xdWFsbmFtZSk7CisJCWFwcGVuZF9zdG10 KGN0eCk7CisJfQorCWlmIChjdHgtPnJlbC0+cmRfcmVsLT5yZWxmb3JjZXJvd3NlY3VyaXR5KQor CXsKKwkJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0 eC0+YnVmLAorCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFk7 IiwKKwkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJYXBwZW5kX3N0bXQoY3R4KTsKKwl9Cit9CisK Ky8qCisgKiBlbWl0X3BhcnRpdGlvbl9jaGlsZHJlbgorICoJCUZvciBlYWNoIGRpcmVjdCBwYXJ0 aXRpb24gY2hpbGQgb2YgYSBwYXJ0aXRpb25lZC10YWJsZSBwYXJlbnQsCisgKgkJcmVjdXJzaXZl bHkgY2FsbCBwZ19nZXRfdGFibGVfZGRsX2ludGVybmFsIGFuZCBhcHBlbmQgdGhlIGNoaWxkJ3MK KyAqCQlzdGF0ZW1lbnRzLiAgRWFjaCBjaGlsZCdzIG93biBEREwgaGFuZGxlcyBmdXJ0aGVyIGxl dmVscyB0aHJvdWdoCisgKgkJdGhlIHNhbWUgcmVjdXJzaW9uLgorICovCitzdGF0aWMgdm9pZAor ZW1pdF9wYXJ0aXRpb25fY2hpbGRyZW4oVGFibGVEZGxDb250ZXh0ICpjdHgpCit7CisJTGlzdAkg ICAqY2hpbGRyZW47CisJTGlzdENlbGwgICAqbGM7CisKKwlpZiAoIWN0eC0+aW5jbHVkZV9wYXJ0 aXRpb24gfHwKKwkJY3R4LT5yZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElP TkVEX1RBQkxFKQorCQlyZXR1cm47CisKKwljaGlsZHJlbiA9IGZpbmRfaW5oZXJpdGFuY2VfY2hp bGRyZW4oY3R4LT5yZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlmb3JlYWNoKGxjLCBjaGlsZHJl bikKKwl7CisJCU9pZAkJCWNoaWxkb2lkID0gbGZpcnN0X29pZChsYyk7CisJCUxpc3QJICAgKmNo aWxkc3RtdHM7CisKKwkJY2hpbGRzdG10cyA9IHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwoY2hp bGRvaWQsIGN0eC0+cHJldHR5LAorCQkJCQkJCQkJCQkgICBjdHgtPm5vX293bmVyLAorCQkJCQkJ CQkJCQkgICBjdHgtPm5vX3RhYmxlc3BhY2UsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV9p bmRleGVzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJ CQkJCSAgIGN0eC0+aW5jbHVkZV9ydWxlcywKKwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX3N0 YXRpc3RpY3MsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV90cmlnZ2VycywKKwkJCQkJCQkJ CQkJICAgY3R4LT5pbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVf cmxzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfcmVwbGljYV9pZGVudGl0eSwKKwkJCQkJ CQkJCQkJICAgY3R4LT5pbmNsdWRlX3BhcnRpdGlvbiwKKwkJCQkJCQkJCQkJICAgY3R4LT5zY2hl bWFfcXVhbGlmaWVkKTsKKwkJY3R4LT5zdGF0ZW1lbnRzID0gbGlzdF9jb25jYXQoY3R4LT5zdGF0 ZW1lbnRzLCBjaGlsZHN0bXRzKTsKKwl9CisJbGlzdF9mcmVlKGNoaWxkcmVuKTsKK30KKworLyoK KyAqIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwKKyAqCQlHZW5lcmF0ZSBEREwgc3RhdGVtZW50 cyB0byByZWNyZWF0ZSBhIHJlZ3VsYXIgb3IgcGFydGl0aW9uZWQgdGFibGUuCisgKgorICogVGhl IGZpcnN0IGxpc3QgZWxlbWVudCBpcyB0aGUgQ1JFQVRFIFRBQkxFIHN0YXRlbWVudC4gIFN1YnNl cXVlbnQKKyAqIGVsZW1lbnRzIGFyZSB0aGUgQUxURVIgVEFCTEUgLyBDUkVBVEUgSU5ERVggLyBD UkVBVEUgUlVMRSAvCisgKiBDUkVBVEUgU1RBVElTVElDUyBzdGF0ZW1lbnRzIG5lZWRlZCB0byBy ZXN0b3JlIHRoZSB0YWJsZSdzIGZ1bGwKKyAqIGRlZmluaXRpb24uCisgKgorICogVHJpZ2dlciBh bmQgcG9saWN5IGVtaXNzaW9uIGFyZSBzY2FmZm9sZGVkIGJ1dCBjdXJyZW50bHkgZGlzYWJsZWQK KyAqICgjaWYgMCkg4oCUIHRoZXkgd2lsbCBiZWNvbWUgYSBzaW5nbGUgaGVscGVyIGNhbGwgb25j ZSB0aGUgc3RhbmRhbG9uZQorICogcGdfZ2V0X3RyaWdnZXJfZGRsIC8gcGdfZ2V0X3BvbGljeV9k ZGwgaGVscGVycyBsYW5kLgorICovCitzdGF0aWMgTGlzdCAqCitwZ19nZXRfdGFibGVfZGRsX2lu dGVybmFsKE9pZCByZWxpZCwgYm9vbCBwcmV0dHksCisJCQkJCQkgIGJvb2wgbm9fb3duZXIsIGJv b2wgbm9fdGFibGVzcGFjZSwKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX2luZGV4ZXMsCisJCQkJCQkg IGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3J1bGVzLAor CQkJCQkJICBib29sIGluY2x1ZGVfc3RhdGlzdGljcywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3Ry aWdnZXJzLAorCQkJCQkJICBib29sIGluY2x1ZGVfcG9saWNpZXMsCisJCQkJCQkgIGJvb2wgaW5j bHVkZV9ybHMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9yZXBsaWNhX2lkZW50aXR5LAorCQkJCQkJ ICBib29sIGluY2x1ZGVfcGFydGl0aW9uLAorCQkJCQkJICBib29sIHNjaGVtYV9xdWFsaWZpZWQp Cit7CisJVGFibGVEZGxDb250ZXh0IGN0eCA9IHswfTsKKwlSZWxhdGlvbglyZWw7CisJY2hhcgkJ cmVsa2luZDsKKwlBY2xSZXN1bHQJYWNscmVzdWx0OworCisJcmVsID0gdGFibGVfb3BlbihyZWxp ZCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJlbGtpbmQgPSByZWwtPnJkX3JlbC0+cmVsa2luZDsK KworCS8qCisJICogVGhlIGluaXRpYWwgY3V0IG9ubHkgc3VwcG9ydHMgb3JkaW5hcnkgYW5kIHBh cnRpdGlvbmVkIHRhYmxlcy4gIFZpZXdzLAorCSAqIG1hdHZpZXdzLCBmb3JlaWduIHRhYmxlcywg c2VxdWVuY2VzLCBpbmRleGVzLCBjb21wb3NpdGUgdHlwZXMsIGFuZAorCSAqIFRPQVNUIHRhYmxl cyBhcmUgb3V0IG9mIHNjb3BlIGZvciBub3cuCisJICovCisJaWYgKHJlbGtpbmQgIT0gUkVMS0lO RF9SRUxBVElPTiAmJiByZWxraW5kICE9IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpCisJewor CQljaGFyCSAgICpyZWxuYW1lID0gcHN0cmR1cChSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwp KTsKKworCQl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJCWVyZXBvcnQoRVJS T1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1RfVFlQRSksCisJCQkJIGVycm1z ZygiXCIlc1wiIGlzIG5vdCBhbiBvcmRpbmFyeSBvciBwYXJ0aXRpb25lZCB0YWJsZSIsCisJCQkJ CQlyZWxuYW1lKSkpOworCX0KKworCS8qIENhbGxlciBuZWVkcyBTRUxFQ1Qgb24gdGhlIHRhYmxl IHRvIHJlYWQgaXRzIGRlZmluaXRpb24uICovCisJYWNscmVzdWx0ID0gcGdfY2xhc3NfYWNsY2hl Y2socmVsaWQsIEdldFVzZXJJZCgpLCBBQ0xfU0VMRUNUKTsKKwlpZiAoYWNscmVzdWx0ICE9IEFD TENIRUNLX09LKQorCQlhY2xjaGVja19lcnJvcihhY2xyZXN1bHQsIE9CSkVDVF9UQUJMRSwKKwkJ CQkJICAgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisKKwljdHgucmVsID0gcmVsOwor CWN0eC5yZWxpZCA9IHJlbGlkOworCWN0eC5wcmV0dHkgPSBwcmV0dHk7CisJY3R4Lm5vX293bmVy ID0gbm9fb3duZXI7CisJY3R4Lm5vX3RhYmxlc3BhY2UgPSBub190YWJsZXNwYWNlOworCWN0eC5p bmNsdWRlX2luZGV4ZXMgPSBpbmNsdWRlX2luZGV4ZXM7CisJY3R4LmluY2x1ZGVfY29uc3RyYWlu dHMgPSBpbmNsdWRlX2NvbnN0cmFpbnRzOworCWN0eC5pbmNsdWRlX3J1bGVzID0gaW5jbHVkZV9y dWxlczsKKwljdHguaW5jbHVkZV9zdGF0aXN0aWNzID0gaW5jbHVkZV9zdGF0aXN0aWNzOworCWN0 eC5pbmNsdWRlX3RyaWdnZXJzID0gaW5jbHVkZV90cmlnZ2VyczsKKwljdHguaW5jbHVkZV9wb2xp Y2llcyA9IGluY2x1ZGVfcG9saWNpZXM7CisJY3R4LmluY2x1ZGVfcmxzID0gaW5jbHVkZV9ybHM7 CisJY3R4LmluY2x1ZGVfcmVwbGljYV9pZGVudGl0eSA9IGluY2x1ZGVfcmVwbGljYV9pZGVudGl0 eTsKKwljdHguaW5jbHVkZV9wYXJ0aXRpb24gPSBpbmNsdWRlX3BhcnRpdGlvbjsKKwljdHguc2No ZW1hX3F1YWxpZmllZCA9IHNjaGVtYV9xdWFsaWZpZWQ7CisJY3R4LmJhc2VfbmFtZXNwYWNlID0g UmVsYXRpb25HZXROYW1lc3BhY2UocmVsKTsKKwljdHgucXVhbG5hbWUgPSBsb29rdXBfcmVsbmFt ZV9mb3JfZW1pdChyZWxpZCwgc2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCQkgICBjdHguYmFz ZV9uYW1lc3BhY2UpOworCisJLyoKKwkgKiBXaGVuIHNjaGVtYV9xdWFsaWZpZWQgaXMgZmFsc2Us IHByZS1jb21wdXRlICI8c2NoZW1hPi4iIHNvIHRoYXQKKwkgKiB0aGUgc3ViLW9iamVjdCBsb29w cyBjYW4gc3RyaXAgaXQgZnJvbSBoZWxwZXIgb3V0cHV0IHRoYXQgYWx3YXlzCisJICogc2NoZW1h LXF1YWxpZmllcyAoY29uc3RyYWludGRlZl9jb21tYW5kLCBpbmRleGRlZl9zdHJpbmcsIHJ1bGVk ZWYsCisJICogc3RhdGlzdGljc29iamRlZl9zdHJpbmcpLiAgQ3Jvc3Mtc2NoZW1hIHJlZmVyZW5j ZXMgaW5zaWRlIHRob3NlCisJICogc3RhdGVtZW50cyAoZGlmZmVyZW50IHNjaGVtYSBuYW1lKSBh cmUgdW5hZmZlY3RlZC4KKwkgKi8KKwlpZiAoIXNjaGVtYV9xdWFsaWZpZWQpCisJeworCQljaGFy CSAgICpuc3BuYW1lID0gZ2V0X25hbWVzcGFjZV9uYW1lKGN0eC5iYXNlX25hbWVzcGFjZSk7CisK KwkJaWYgKG5zcG5hbWUgIT0gTlVMTCkKKwkJeworCQkJY3R4LnNjaGVtYV9wcmVmaXggPSBwc3By aW50ZigiJXMuIiwgcXVvdGVfaWRlbnRpZmllcihuc3BuYW1lKSk7CisJCQlwZnJlZShuc3BuYW1l KTsKKwkJfQorCX0KKworCS8qCisJICogQ2FjaGUgbG9jYWxseS1kZWNsYXJlZCBOT1QgTlVMTCBj b25zdHJhaW50IG1ldGFkYXRhIHNvIHRoZSBjb2x1bW4tCisJICogZW1pdCBoZWxwZXJzIGNhbiBw cm9kdWNlICJDT05TVFJBSU5UIG5hbWUgTk9UIE5VTEwiIGlubGluZSBmb3IKKwkgKiB1c2VyLW5h bWVkIGNvbnN0cmFpbnRzLCBhbmQgc28gdGhlIGNvbnN0cmFpbnQgbG9vcCBjYW4gYXZvaWQKKwkg KiBkb3VibGUtZW1pdHRpbmcgdGhlbS4KKwkgKi8KKwljdHgubm5fZW50cmllcyA9IGNvbGxlY3Rf bG9jYWxfbm90X251bGwocmVsLCAmY3R4LnNraXBfbm90bnVsbF9vaWRzKTsKKworCWluaXRTdHJp bmdJbmZvKCZjdHguYnVmKTsKKworCS8qCisJICogRWFjaCBwYXNzIGJlbG93IGFwcGVuZHMgemVy byBvciBtb3JlIGZpbmlzaGVkIHN0YXRlbWVudHMgdG8KKwkgKiBjdHguc3RhdGVtZW50cyB2aWEg YXBwZW5kX3N0bXQgLyBhcHBlbmRfc3RyaXBwZWRfc3RtdC4gIE9yZGVyIGlzCisJICogc2lnbmlm aWNhbnQ6IENSRUFURSBUQUJMRSBmaXJzdDsgT1dORVIgYW5kIHRoZSBwZXItY29sdW1uIEFMVEVS CisJICogQ09MVU1OIHBhc3NlcyBiZWZvcmUgc3ViLW9iamVjdCBlbWlzc2lvbjsgc3ViLW9iamVj dHMgaW4KKwkgKiBkZXBlbmRlbmN5LWZyaWVuZGx5IG9yZGVyIChpbmRleGVzIGJlZm9yZSBjb25z dHJhaW50cywgc2luY2UKKwkgKiBjb25zdHJhaW50LWJhY2tlZCBpbmRleGVzIGFyZSBlbWl0dGVk IG91dC1vZi1saW5lIGJ5IHRoZQorCSAqIGNvbnN0cmFpbnQgbG9vcCk7IGFuZCBwYXJ0aXRpb24g Y2hpbGRyZW4gbGFzdCBzbyB0aGUgcGFyZW50CisJICogYWxyZWFkeSBleGlzdHMgYXQgcmVwbGF5 IHRpbWUuCisJICovCisJZW1pdF9jcmVhdGVfdGFibGVfc3RtdCgmY3R4KTsKKwllbWl0X293bmVy X3N0bXQoJmN0eCk7CisJZW1pdF9jaGlsZF9kZWZhdWx0X292ZXJyaWRlcygmY3R4KTsKKwllbWl0 X2F0dG9wdGlvbnMoJmN0eCk7CisJZW1pdF9pbmRleGVzKCZjdHgpOworCWVtaXRfbG9jYWxfY29u c3RyYWludHMoJmN0eCk7CisJZW1pdF9ydWxlcygmY3R4KTsKKwllbWl0X3N0YXRpc3RpY3MoJmN0 eCk7CisJZW1pdF9yZXBsaWNhX2lkZW50aXR5KCZjdHgpOworCWVtaXRfcmxzX3RvZ2dsZXMoJmN0 eCk7CisKKwkvKgorCSAqIFRyaWdnZXJzIGFuZCByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMg 4oCUIGRpc2FibGVkIHVudGlsIHRoZQorCSAqIHN0YW5kYWxvbmUgcGdfZ2V0X3RyaWdnZXJfZGRs KCkgYW5kIHBnX2dldF9wb2xpY3lfZGRsKCkgaGVscGVycworCSAqIGxhbmQuICBUaGUgc2NhbiAr IGxvY2sgKyBmaWx0ZXIgc2NhZmZvbGRpbmcgYmVsb3cgaXMgcHJlc2VydmVkCisJICogKGluc2lk ZSAjaWYgMCkgc28gd2lyaW5nIHVwIGVhY2ggZW1pc3Npb24gYmVjb21lcyBhIG9uZS1saW5lciBp bgorCSAqIHRoZSBsb29wIGJvZHkgb25jZSB0aG9zZSBoZWxwZXJzIGFyZSBhdmFpbGFibGUuCisJ ICovCisjaWYgMAorCWlmIChpbmNsdWRlX3RyaWdnZXJzKQorCXsKKwkJUmVsYXRpb24JdHJpZ1Jl bDsKKwkJU3lzU2NhbkRlc2MgdHJpZ1NjYW47CisJCVNjYW5LZXlEYXRhIHRyaWdLZXk7CisJCUhl YXBUdXBsZQl0cmlnVHVwOworCisJCXRyaWdSZWwgPSB0YWJsZV9vcGVuKFRyaWdnZXJSZWxhdGlv bklkLCBBY2Nlc3NTaGFyZUxvY2spOworCQlTY2FuS2V5SW5pdCgmdHJpZ0tleSwKKwkJCQkJQW51 bV9wZ190cmlnZ2VyX3RncmVsaWQsCisJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURF USwKKwkJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCQl0cmlnU2NhbiA9IHN5c3RhYmxl X2JlZ2luc2Nhbih0cmlnUmVsLCBUcmlnZ2VyUmVsaWROYW1lSW5kZXhJZCwKKwkJCQkJCQkJCSAg dHJ1ZSwgTlVMTCwgMSwgJnRyaWdLZXkpOworCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZCh0cmln VHVwID0gc3lzdGFibGVfZ2V0bmV4dCh0cmlnU2NhbikpKQorCQl7CisJCQlGb3JtX3BnX3RyaWdn ZXIgdHJnID0gKEZvcm1fcGdfdHJpZ2dlcikgR0VUU1RSVUNUKHRyaWdUdXApOworCisJCQlpZiAo dHJnLT50Z2lzaW50ZXJuYWwpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRPRE86IGFwcGVuZCBw Z19nZXRfdHJpZ2dlcl9kZGwodHJnLT5vaWQpIG91dHB1dCBoZXJlLiAqLworCQl9CisJCXN5c3Rh YmxlX2VuZHNjYW4odHJpZ1NjYW4pOworCQl0YWJsZV9jbG9zZSh0cmlnUmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworCX0KKworCWlmIChpbmNsdWRlX3BvbGljaWVzKQorCXsKKwkJUmVsYXRpb24JcG9s UmVsOworCQlTeXNTY2FuRGVzYyBwb2xTY2FuOworCQlTY2FuS2V5RGF0YSBwb2xLZXk7CisJCUhl YXBUdXBsZQlwb2xUdXA7CisKKwkJcG9sUmVsID0gdGFibGVfb3BlbihQb2xpY3lSZWxhdGlvbklk LCBBY2Nlc3NTaGFyZUxvY2spOworCQlTY2FuS2V5SW5pdCgmcG9sS2V5LAorCQkJCQlBbnVtX3Bn X3BvbGljeV9wb2xyZWxpZCwKKwkJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAor CQkJCQlPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJCXBvbFNjYW4gPSBzeXN0YWJsZV9iZWdp bnNjYW4ocG9sUmVsLCBQb2xpY3lQb2xyZWxpZFBvbG5hbWVJbmRleElkLAorCQkJCQkJCQkJIHRy dWUsIE5VTEwsIDEsICZwb2xLZXkpOworCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChwb2xUdXAg PSBzeXN0YWJsZV9nZXRuZXh0KHBvbFNjYW4pKSkKKwkJeworCQkJLyogVE9ETzogYXBwZW5kIHBn X2dldF9wb2xpY3lfZGRsKHJlbGlkLCBwb2xuYW1lKSBvdXRwdXQgaGVyZS4gKi8KKwkJfQorCQlz eXN0YWJsZV9lbmRzY2FuKHBvbFNjYW4pOworCQl0YWJsZV9jbG9zZShwb2xSZWwsIEFjY2Vzc1No YXJlTG9jayk7CisJfQorI2Vsc2UKKwkodm9pZCkgaW5jbHVkZV90cmlnZ2VyczsKKwkodm9pZCkg aW5jbHVkZV9wb2xpY2llczsKKyNlbmRpZgorCisJZW1pdF9wYXJ0aXRpb25fY2hpbGRyZW4oJmN0 eCk7CisKKwl7CisJCWludAkJCW5hdHRzID0gUmVsYXRpb25HZXREZXNjcihyZWwpLT5uYXR0czsK KworCQlmb3IgKGludCBpID0gMTsgaSA8PSBuYXR0czsgaSsrKQorCQkJaWYgKGN0eC5ubl9lbnRy aWVzW2ldLm5hbWUgIT0gTlVMTCkKKwkJCQlwZnJlZShjdHgubm5fZW50cmllc1tpXS5uYW1lKTsK Kwl9CisJcGZyZWUoY3R4Lm5uX2VudHJpZXMpOworCisJdGFibGVfY2xvc2UocmVsLCBBY2Nlc3NT aGFyZUxvY2spOworCXBmcmVlKGN0eC5idWYuZGF0YSk7CisJcGZyZWUoY3R4LnF1YWxuYW1lKTsK KwlpZiAoY3R4LnNjaGVtYV9wcmVmaXggIT0gTlVMTCkKKwkJcGZyZWUoY3R4LnNjaGVtYV9wcmVm aXgpOworCWxpc3RfZnJlZShjdHguc2tpcF9ub3RudWxsX29pZHMpOworCisJcmV0dXJuIGN0eC5z dGF0ZW1lbnRzOworfQorCisvKgorICogcGdfZ2V0X3RhYmxlX2RkbAorICoJCVJldHVybiBEREwg dG8gcmVjcmVhdGUgYSB0YWJsZSBhcyBhIHNldCBvZiB0ZXh0IHJvd3MuCisgKi8KK0RhdHVtCitw Z19nZXRfdGFibGVfZGRsKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJRnVuY0NhbGxDb250ZXh0ICpm dW5jY3R4OworCUxpc3QJICAgKnN0YXRlbWVudHM7CisKKwlpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgp KQorCXsKKwkJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCQlPaWQJCQlyZWxpZDsKKwkJRGRs T3B0aW9uCW9wdHNbXSA9IHsKKwkJCXsicHJldHR5IiwgRERMX09QVF9CT09MfSwKKwkJCXsib3du ZXIiLCBERExfT1BUX0JPT0x9LAorCQkJeyJ0YWJsZXNwYWNlIiwgRERMX09QVF9CT09MfSwKKwkJ CXsiaW5jbHVkZXNfaW5kZXhlcyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX2NvbnN0 cmFpbnRzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfcnVsZXMiLCBERExfT1BUX0JP T0x9LAorCQkJeyJpbmNsdWRlc19zdGF0aXN0aWNzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5j bHVkZXNfdHJpZ2dlcnMiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19wb2xpY2llcyIs IERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3JscyIsIERETF9PUFRfQk9PTH0sCisJCQl7 ImluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHkiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRl c19wYXJ0aXRpb24iLCBERExfT1BUX0JPT0x9LAorCQkJeyJzY2hlbWFfcXVhbGlmaWVkIiwgRERM X09QVF9CT09MfSwKKwkJfTsKKworCQlmdW5jY3R4ID0gU1JGX0ZJUlNUQ0FMTF9JTklUKCk7CisJ CW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0eC0+bXVsdGlfY2FsbF9t ZW1vcnlfY3R4KTsKKworCQlpZiAoUEdfQVJHSVNOVUxMKDApKQorCQl7CisJCQlNZW1vcnlDb250 ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisJCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CisJ CX0KKworCQlyZWxpZCA9IFBHX0dFVEFSR19PSUQoMCk7CisJCXBhcnNlX2RkbF9vcHRpb25zKGZj aW5mbywgMSwgb3B0cywgbGVuZ3Rob2Yob3B0cykpOworCisJCXN0YXRlbWVudHMgPSBwZ19nZXRf dGFibGVfZGRsX2ludGVybmFsKHJlbGlkLAorCQkJCQkJCQkJCQkgICBvcHRzWzBdLmlzc2V0ICYm IG9wdHNbMF0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgb3B0c1sxXS5pc3NldCAmJiAhb3B0c1sx XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICBvcHRzWzJdLmlzc2V0ICYmICFvcHRzWzJdLmJvb2x2 YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzNdLmlzc2V0IHx8IG9wdHNbM10uYm9vbHZhbCwKKwkJ CQkJCQkJCQkJICAgIW9wdHNbNF0uaXNzZXQgfHwgb3B0c1s0XS5ib29sdmFsLAorCQkJCQkJCQkJ CQkgICAhb3B0c1s1XS5pc3NldCB8fCBvcHRzWzVdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFv cHRzWzZdLmlzc2V0IHx8IG9wdHNbNl0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbN10u aXNzZXQgfHwgb3B0c1s3XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s4XS5pc3NldCB8 fCBvcHRzWzhdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzldLmlzc2V0IHx8IG9wdHNb OV0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbMTBdLmlzc2V0IHx8IG9wdHNbMTBdLmJv b2x2YWwsCisJCQkJCQkJCQkJCSAgIG9wdHNbMTFdLmlzc2V0ICYmIG9wdHNbMTFdLmJvb2x2YWws CisJCQkJCQkJCQkJCSAgICFvcHRzWzEyXS5pc3NldCB8fCBvcHRzWzEyXS5ib29sdmFsKTsKKwkJ ZnVuY2N0eC0+dXNlcl9mY3R4ID0gc3RhdGVtZW50czsKKwkJZnVuY2N0eC0+bWF4X2NhbGxzID0g bGlzdF9sZW5ndGgoc3RhdGVtZW50cyk7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNv bnRleHQpOworCX0KKworCWZ1bmNjdHggPSBTUkZfUEVSQ0FMTF9TRVRVUCgpOworCXN0YXRlbWVu dHMgPSAoTGlzdCAqKSBmdW5jY3R4LT51c2VyX2ZjdHg7CisKKwlpZiAoZnVuY2N0eC0+Y2FsbF9j bnRyIDwgZnVuY2N0eC0+bWF4X2NhbGxzKQorCXsKKwkJY2hhcgkgICAqc3RtdDsKKworCQlzdG10 ID0gbGlzdF9udGgoc3RhdGVtZW50cywgZnVuY2N0eC0+Y2FsbF9jbnRyKTsKKworCQlTUkZfUkVU VVJOX05FWFQoZnVuY2N0eCwgQ1N0cmluZ0dldFRleHREYXR1bShzdG10KSk7CisJfQorCWVsc2UK Kwl7CisJCWxpc3RfZnJlZV9kZWVwKHN0YXRlbWVudHMpOworCQlTUkZfUkVUVVJOX0RPTkUoZnVu Y2N0eCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRh dCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggYmUxNTdhNWZiZTkuLmU0 NTZjMjI2ZjUzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0Cisr KyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTg2MTUsNiArODYxNSwxMyBA QAogICBwcm9hcmd0eXBlcyA9PiAncmVnZGF0YWJhc2UgdGV4dCcsIHByb2FsbGFyZ3R5cGVzID0+ ICd7cmVnZGF0YWJhc2UsdGV4dH0nLAogICBwcm9hcmdtb2RlcyA9PiAne2ksdn0nLCBwcm9hcmdk ZWZhdWx0cyA9PiAne05VTEx9JywKICAgcHJvc3JjID0+ICdwZ19nZXRfZGF0YWJhc2VfZGRsJyB9 LAoreyBvaWQgPT4gJzgyMTUnLCBkZXNjciA9PiAnZ2V0IERETCB0byByZWNyZWF0ZSBhIHRhYmxl JywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X3RhYmxlX2RkbCcsIHByb3Jvd3MgPT4gJzUwJywgcHJv dmFyaWFkaWMgPT4gJ3RleHQnLAorICBwcm9pc3N0cmljdCA9PiAnZicsIHByb3JldHNldCA9PiAn dCcsIHByb3ZvbGF0aWxlID0+ICdzJywgcHJvcGFyYWxsZWwgPT4gJ3InLAorICBwcm9uYXJnZGVm YXVsdHMgPT4gJzEnLCBwcm9yZXR0eXBlID0+ICd0ZXh0JywKKyAgcHJvYXJndHlwZXMgPT4gJ3Jl Z2NsYXNzIHRleHQnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3JlZ2NsYXNzLHRleHR9JywKKyAgcHJv YXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJnZGVmYXVsdHMgPT4gJ3tOVUxMfScsCisgIHByb3Ny YyA9PiAncGdfZ2V0X3RhYmxlX2RkbCcgfSwKIHsgb2lkID0+ICcyNTA5JywKICAgZGVzY3IgPT4g J2RlcGFyc2UgYW4gZW5jb2RlZCBleHByZXNzaW9uIHdpdGggcHJldHR5LXByaW50IG9wdGlvbics CiAgIHByb25hbWUgPT4gJ3BnX2dldF9leHByJywgcHJvdm9sYXRpbGUgPT4gJ3MnLCBwcm9yZXR0 eXBlID0+ICd0ZXh0JywKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21k cy5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmgKaW5kZXggYzNkODUxOGNiNjIu LjIwODUwMjdjOWIxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMu aAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaApAQCAtOTIsNiArOTIsNyBA QCBleHRlcm4gdm9pZCBjaGVja19vZl90eXBlKEhlYXBUdXBsZSB0eXBldHVwbGUpOwogCiBleHRl cm4gdm9pZCByZWdpc3Rlcl9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxpZCwgT25Db21taXRBY3Rp b24gYWN0aW9uKTsKIGV4dGVybiB2b2lkIHJlbW92ZV9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxp ZCk7CitleHRlcm4gT25Db21taXRBY3Rpb24gZ2V0X29uX2NvbW1pdF9hY3Rpb24oT2lkIHJlbGlk KTsKIAogZXh0ZXJuIHZvaWQgUHJlQ29tbWl0X29uX2NvbW1pdF9hY3Rpb25zKHZvaWQpOwogZXh0 ZXJuIHZvaWQgQXRFT1hhY3Rfb25fY29tbWl0X2FjdGlvbnMoYm9vbCBpc0NvbW1pdCk7CmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0IGIv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wZ19nZXRfdGFibGVfZGRsLm91dApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNDM2ZjkyZTk0ZmQKLS0tIC9kZXYvbnVsbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0CkBAIC0w LDAgKzEsNjM4IEBACistLQorLS0gcGdfZ2V0X3RhYmxlX2RkbAorLS0KKy0tIEFsbCB0ZXN0cyBw YXNzIG93bmVyPT5mYWxzZSBzbyB0aGUgQUxURVIgVEFCTEUgT1dORVIgVE8gbGluZSBpcyBub3QK Ky0tIGVtaXR0ZWQsIGtlZXBpbmcgb3V0cHV0IHN0YWJsZSBhY3Jvc3MgdGVzdCBydW5uZXJzICh3 aGljaCBtYXkgcnVuIHVuZGVyCistLSBkaWZmZXJlbnQgcm9sZSBuYW1lcykuCistLQorQ1JFQVRF IFNDSEVNQSBwZ3RibF9kZGxfdGVzdDsKK1NFVCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF90ZXN0 OworLS0gQmFzaWMgdGFibGUgd2l0aCBQUklNQVJZIEtFWSwgTk9UIE5VTEwsIERFRkFVTFQsIENP TExBVEUuCitDUkVBVEUgVEFCTEUgYmFzaWMgKAorICAgIGlkIGludCBQUklNQVJZIEtFWSwKKyAg ICBuYW1lIHRleHQgTk9UIE5VTEwgREVGQVVMVCAnYW5vbicgQ09MTEFURSAiQyIKKyk7CitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyAoIGlkIGludGVnZXIg Tk9UIE5VTEwsIG5hbWUgdGV4dCBDT0xMQVRFICJDIiBERUZBVUxUICdhbm9uJzo6dGV4dCBOT1Qg TlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQg YmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rl c3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBuYW1l OworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2lj X3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIElkZW50aXR5IGNvbHVtbnMg KHdpdGggZGVmYXVsdCBhbmQgY3VzdG9tIHNlcXVlbmNlIG9wdGlvbnMpLgorQ1JFQVRFIFRBQkxF IGlkX2NvbHMgKAorICAgIGlkX2Fsd2F5cyBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElU WSwKKyAgICBpZF9kZWZhdWx0IGludCBHRU5FUkFURUQgQlkgREVGQVVMVCBBUyBJREVOVElUWQor KTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY29scyc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Q1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgKCBpZF9hbHdheXMgaW50ZWdlciBH RU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIE5PVCBOVUxMLCBpZF9kZWZhdWx0IGludGVnZXIg R0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkgTk9UIE5VTEwpOworIEFMVEVSIFRBQkxF IHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgQUREIENPTlNUUkFJTlQgaWRfY29sc19pZF9hbHdheXNf bm90X251bGwgTk9UIE5VTEwgaWRfYWx3YXlzOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0 LmlkX2NvbHMgQUREIENPTlNUUkFJTlQgaWRfY29sc19pZF9kZWZhdWx0X25vdF9udWxsIE5PVCBO VUxMIGlkX2RlZmF1bHQ7CisoMyByb3dzKQorCitDUkVBVEUgVEFCTEUgaWRfY3VzdG9tICgKKyAg ICB2IGludCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZICgKKyAgICAgICAgU0VRVUVOQ0Ug TkFNRSBpZF9jdXN0b21fdl9zZXEKKyAgICAgICAgU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5UIEJZ IDUKKyAgICAgICAgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMAorICAgICAgICBDQUNIRSAxMCBD WUNMRQorICAgICkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2N1c3Rv bSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZF9j dXN0b20gKCB2IGludGVnZXIgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSAoU1RBUlQgV0lU SCAxMDAgSU5DUkVNRU5UIEJZIDUgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMCBDQUNIRSAxMCBD WUNMRSkgTk9UIE5VTEwpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2N1c3RvbSBB REQgQ09OU1RSQUlOVCBpZF9jdXN0b21fdl9ub3RfbnVsbCBOT1QgTlVMTCB2OworKDIgcm93cykK KworLS0gR2VuZXJhdGVkIHN0b3JlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgZ2VuX2NvbHMgKAor ICAgIGNlbnRzIGludCwKKyAgICBkb2xsYXJzIG51bWVyaWMgR0VORVJBVEVEIEFMV0FZUyBBUyAo Y2VudHMgLyAxMDAuMCkgU1RPUkVECispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRs KCdnZW5fY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2Rk bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0Lmdlbl9jb2xz ICggY2VudHMgaW50ZWdlciwgZG9sbGFycyBudW1lcmljIEdFTkVSQVRFRCBBTFdBWVMgQVMgKCgo Y2VudHMpOjpudW1lcmljIC8gMTAwLjApKSBTVE9SRUQpOworKDEgcm93KQorCistLSBTVE9SQUdF IGFuZCBDT01QUkVTU0lPTiAob25seSBlbWl0dGVkIHdoZW4gbm9uLWRlZmF1bHQgZm9yIHRoZSB0 eXBlKS4KK0NSRUFURSBUQUJMRSBzdG9yYWdlX2NvbHMgKAorICAgIGEgdGV4dCBTVE9SQUdFIEVY VEVSTkFMLAorICAgIGIgdGV4dCBTVE9SQUdFIE1BSU4sCisgICAgYyB0ZXh0IENPTVBSRVNTSU9O IHBnbHoKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0b3JhZ2VfY29scyc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5zdG9yYWdlX2NvbHMgKCBhIHRleHQgU1RPUkFHRSBFWFRFUk5BTCwgYiB0ZXh0 IFNUT1JBR0UgTUFJTiwgYyB0ZXh0IENPTVBSRVNTSU9OIHBnbHopOworKDEgcm93KQorCistLSBD b25zdHJhaW50czogQ0hFQ0ssIFVOSVFVRSwgRk9SRUlHTiBLRVkgKERFRkVSUkFCTEUpLgorQ1JF QVRFIFRBQkxFIHJlZmQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgY29ucyAo CisgICAgYSBpbnQgQ0hFQ0sgKGEgPiAwKSwKKyAgICBiIGludCBVTklRVUUsCisgICAgYyBpbnQg UkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJFRAorKTsKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0 YmxfZGRsX3Rlc3QuY29ucyAoIGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBjIGludGVnZXIsIENPTlNU UkFJTlQgY29uc19hX2NoZWNrIENIRUNLICgoYSA+IDApKSk7CisgQUxURVIgVEFCTEUgcGd0Ymxf ZGRsX3Rlc3QuY29ucyBBREQgQ09OU1RSQUlOVCBjb25zX2Jfa2V5IFVOSVFVRSAoYik7CisgQUxU RVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyBBREQgQ09OU1RSQUlOVCBjb25zX2NfZmtleSBG T1JFSUdOIEtFWSAoYykgUkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxFIElOSVRJQUxMWSBE RUZFUlJFRDsKKygzIHJvd3MpCisKKy0tIEluZGV4ZXM6IGZ1bmN0aW9uYWwgYW5kIHBhcnRpYWwu ICBDb25zdHJhaW50LWJhY2tpbmcgaW5kZXhlcyBhcmUKKy0tIHN1cHByZXNzZWQgKHRoZXkgYXJl IGVtaXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCkuCitDUkVBVEUgVEFCTEUgaWR4ZCAoaWQg aW50IFBSSU1BUlkgS0VZLCBuYW1lIHRleHQpOworQ1JFQVRFIElOREVYIGlkeGRfbG93ZXIgT04g aWR4ZCAobG93ZXIobmFtZSkpOworQ1JFQVRFIElOREVYIGlkeGRfcGFydGlhbCBPTiBpZHhkIChp ZCkgV0hFUkUgaWQgPiAxMDA7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQn OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LmlkeGQgKCBpZCBpbnRlZ2VyIE5PVCBOVUxMLCBuYW1lIHRleHQpOworIENSRUFURSBJ TkRFWCBpZHhkX2xvd2VyIE9OIHBndGJsX2RkbF90ZXN0LmlkeGQgVVNJTkcgYnRyZWUgKGxvd2Vy KG5hbWUpKTsKKyBDUkVBVEUgSU5ERVggaWR4ZF9wYXJ0aWFsIE9OIHBndGJsX2RkbF90ZXN0Lmlk eGQgVVNJTkcgYnRyZWUgKGlkKSBXSEVSRSAoaWQgPiAxMDApOworIEFMVEVSIFRBQkxFIHBndGJs X2RkbF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9pZF9ub3RfbnVsbCBOT1QgTlVMTCBp ZDsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZHhkIEFERCBDT05TVFJBSU5UIGlkeGRf cGtleSBQUklNQVJZIEtFWSAoaWQpOworKDUgcm93cykKKworLS0gSW5oZXJpdGFuY2UsIGluY2x1 ZGluZyBhIGNoaWxkIERFRkFVTFQgb3ZlcnJpZGUgb24gYW4gaW5oZXJpdGVkIGNvbHVtbi4KK0NS RUFURSBUQUJMRSBwYXIgKGEgaW50IERFRkFVTFQgMSwgYiB0ZXh0KTsKK0NSRUFURSBUQUJMRSBj aCAoYyBpbnQpIElOSEVSSVRTIChwYXIpOworQUxURVIgVEFCTEUgY2ggQUxURVIgQ09MVU1OIGEg U0VUIERFRkFVTFQgOTk5OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjaCc6OnJl Z2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY2ggKCBjIGludGVnZXIp IElOSEVSSVRTIChwZ3RibF9kZGxfdGVzdC5wYXIpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90 ZXN0LmNoIEFMVEVSIENPTFVNTiBhIFNFVCBERUZBVUxUIDk5OTsKKygyIHJvd3MpCisKKy0tIFBl ci1jb2x1bW4gYXR0b3B0aW9uczogZW1pdHRlZCBhcyBBTFRFUiBDT0xVTU4gU0VUICguLi4pLgor Q1JFQVRFIFRBQkxFIGF0dG9wdCAoYSBpbnQsIGIgdGV4dCk7CitBTFRFUiBUQUJMRSBhdHRvcHQg QUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgnYXR0b3B0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LmF0dG9wdCAoIGEgaW50ZWdlciwgYiB0ZXh0KTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9k ZGxfdGVzdC5hdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0PScxMDAnKTsKKygy IHJvd3MpCisKKy0tIFBhcnRpdGlvbmVkIHRhYmxlIHBhcmVudCAoUkFOR0UgYW5kIEhBU0gpLgor Q1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZSAoaWQgaW50LCBrIGludCkgUEFSVElUSU9OIEJZIFJB TkdFIChpZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZSc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRlZ2VyLCBrIGludGVnZXIp IFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworKDEgcm93KQorCitDUkVBVEUgVEFCTEUgcGFydGVk X2hhc2ggKGlkIGludCkgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9oYXNoICggaWQgaW50ZWdlcikgUEFSVElUSU9O IEJZIEhBU0ggKGlkKTsKKygxIHJvdykKKworLS0gUGFydGl0aW9uIGNoaWxkcmVuOiBGUk9NL1RP LCBXSVRIIChtb2R1bHVzLCByZW1haW5kZXIpLCBERUZBVUxULgorQ1JFQVRFIFRBQkxFIHBhcnRl ZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UKKyAgICBGT1IgVkFMVUVTIEZST00g KDApIFRPICgxMDApOworQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsg U0VUIERFRkFVTFQgNzsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3Jh bmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxF IHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVz dC5wYXJ0ZWRfcmFuZ2UgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKKyBBTFRFUiBUQUJM RSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfMSBBTFRFUiBDT0xVTU4gayBTRVQgREVGQVVM VCA3OworKDIgcm93cykKKworQ1JFQVRFIFRBQkxFIHBhcnRlZF9oYXNoXzAgUEFSVElUSU9OIE9G IHBhcnRlZF9oYXNoCisgICAgRk9SIFZBTFVFUyBXSVRIIChtb2R1bHVzIDIsIHJlbWFpbmRlciAw KTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2hfMCc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFU RSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfaGFzaF8wIFBBUlRJVElPTiBPRiBwZ3RibF9k ZGxfdGVzdC5wYXJ0ZWRfaGFzaCBGT1IgVkFMVUVTIFdJVEggKG1vZHVsdXMgMiwgcmVtYWluZGVy IDApOworKDEgcm93KQorCitDUkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJT04g T0YgcGFydGVkX3JhbmdlIERFRkFVTFQ7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J3BhcnRlZF9yYW5nZV9kZWYnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFu Z2VfZGVmIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgREVGQVVMVDsK KygxIHJvdykKKworLS0gUnVsZXMuCitDUkVBVEUgVEFCTEUgcnQgKGlkIGludCk7CitDUkVBVEUg VEFCTEUgcnRfbG9nIChpZCBpbnQpOworQ1JFQVRFIFJVTEUgcnRfbG9nX2luc2VydCBBUyBPTiBJ TlNFUlQgVE8gcnQKKyAgICBETyBBTFNPIElOU0VSVCBJTlRPIHJ0X2xvZyBWQUxVRVMgKE5FVy5p ZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxf dGVzdC5ydCAoIGlkIGludGVnZXIpOworIENSRUFURSBSVUxFIHJ0X2xvZ19pbnNlcnQgQVMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICBPTiBJTlNFUlQgVE8gcGd0Ymxf ZGRsX3Rlc3QucnQgRE8gIElOU0VSVCBJTlRPIHJ0X2xvZyAoaWQpKworICAgVkFMVUVTIChuZXcu aWQpOworKDIgcm93cykKKworLS0gRXh0ZW5kZWQgc3RhdGlzdGljcy4KK0NSRUFURSBUQUJMRSBz dHggKGEgaW50LCBiIGludCwgYyBpbnQpOworQ1JFQVRFIFNUQVRJU1RJQ1Mgc3R4X25kdiAobmRp c3RpbmN0KSBPTiBhLCBiIEZST00gc3R4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRs KCdzdHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5zdHggKCBhIGludGVn ZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyKTsKKyBDUkVBVEUgU1RBVElTVElDUyBwZ3RibF9kZGxf dGVzdC5zdHhfbmR2IChuZGlzdGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7CisoMiByb3dzKQorCist LSBSb3ctbGV2ZWwgc2VjdXJpdHkgdG9nZ2xlcy4KK0NSRUFURSBUQUJMRSBybHMgKGlkIGludCk7 CitBTFRFUiBUQUJMRSBybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKK0FMVEVSIFRBQkxF IHJscyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ3Jscyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFU RSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsKKyBBTFRFUiBUQUJMRSBw Z3RibF9kZGxfdGVzdC5ybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKKyBBTFRFUiBUQUJM RSBwZ3RibF9kZGxfdGVzdC5ybHMgRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOworKDMgcm93cykK KworLS0gUkVQTElDQSBJREVOVElUWTogZW1pdHRlZCBvbmx5IHdoZW4gbm90IHRoZSBkZWZhdWx0 LgorQ1JFQVRFIFRBQkxFIHJpX2Z1bGwgKGEgaW50KTsKK0FMVEVSIFRBQkxFIHJpX2Z1bGwgUkVQ TElDQSBJREVOVElUWSBGVUxMOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9m dWxsJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAg cGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxF IHBndGJsX2RkbF90ZXN0LnJpX2Z1bGwgKCBhIGludGVnZXIpOworIEFMVEVSIFRBQkxFIHBndGJs X2RkbF90ZXN0LnJpX2Z1bGwgUkVQTElDQSBJREVOVElUWSBGVUxMOworKDIgcm93cykKKworQ1JF QVRFIFRBQkxFIHJpX2lkeCAoYSBpbnQgTk9UIE5VTEwpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBy aV9pZHhfYSBPTiByaV9pZHggKGEpOworQUxURVIgVEFCTEUgcmlfaWR4IFJFUExJQ0EgSURFTlRJ VFkgVVNJTkcgSU5ERVggcmlfaWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J3JpX2lkeCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxf dGVzdC5yaV9pZHggKCBhIGludGVnZXIgTk9UIE5VTEwpOworIENSRUFURSBVTklRVUUgSU5ERVgg cmlfaWR4X2EgT04gcGd0YmxfZGRsX3Rlc3QucmlfaWR4IFVTSU5HIGJ0cmVlIChhKTsKKyBBTFRF UiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggQUREIENPTlNUUkFJTlQgcmlfaWR4X2Ffbm90 X251bGwgTk9UIE5VTEwgYTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggUkVQ TElDQSBJREVOVElUWSBVU0lORyBJTkRFWCByaV9pZHhfYTsKKyg0IHJvd3MpCisKKy0tIFVOTE9H R0VEICsgcmVsb3B0aW9ucy4KK0NSRUFURSBVTkxPR0dFRCBUQUJMRSB1bm8gKGlkIGludCkgV0lU SCAoZmlsbGZhY3RvciA9IDcwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndW5v Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFVOTE9HR0VEIFRBQkxFIHBndGJsX2Rk bF90ZXN0LnVubyAoIGlkIGludGVnZXIpIFdJVEggKGZpbGxmYWN0b3I9JzcwJyk7CisoMSByb3cp CisKKy0tIFR5cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgT0YgdHlwZV9uYW1lKS4gIENvbHVtbnMg aW5oZXJpdGVkIGZyb20gdGhlCistLSB0eXBlIGVtaXQgbm90aGluZzsgbG9jYWxseS1hcHBsaWVk IERFRkFVTFQsIE5PVCBOVUxMIGFuZCBDSEVDSyBjb21lCistLSBvdXQgdGhyb3VnaCBhIHNpbmds ZSAiKGNvbCBXSVRIIE9QVElPTlMgLi4uKSIgbGlzdC4KK0NSRUFURSBUWVBFIHR5cGVkX3QgQVMg KGEgaW50LCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIHR5cGVkX3BsYWluIE9GIHR5cGVkX3Q7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3R5cGVkX3BsYWluJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVf ZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxF IHBndGJsX2RkbF90ZXN0LnR5cGVkX3BsYWluIE9GIHBndGJsX2RkbF90ZXN0LnR5cGVkX3Q7Ciso MSByb3cpCisKK0NSRUFURSBUQUJMRSB0eXBlZF9vdmVyIE9GIHR5cGVkX3QgKAorICAgIGEgV0lU SCBPUFRJT05TIERFRkFVTFQgNyBOT1QgTlVMTCwKKyAgICBiIFdJVEggT1BUSU9OUyBOT1QgTlVM TCwKKyAgICBDT05TVFJBSU5UIGJfbm9uZW1wdHkgQ0hFQ0sgKGxlbmd0aChiKSA+IDApCispOwor U0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0eXBlZF9vdmVyJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90 ZXN0LnR5cGVkX292ZXIgT0YgcGd0YmxfZGRsX3Rlc3QudHlwZWRfdCAoIGEgV0lUSCBPUFRJT05T IERFRkFVTFQgNyBOT1QgTlVMTCwgYiBXSVRIIE9QVElPTlMgTk9UIE5VTEwsIENPTlNUUkFJTlQg Yl9ub25lbXB0eSBDSEVDSyAoKGxlbmd0aChiKSA+IDApKSk7CisgQUxURVIgVEFCTEUgcGd0Ymxf ZGRsX3Rlc3QudHlwZWRfb3ZlciBBREQgQ09OU1RSQUlOVCB0eXBlZF9vdmVyX2Ffbm90X251bGwg Tk9UIE5VTEwgYTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC50eXBlZF9vdmVyIEFERCBD T05TVFJBSU5UIHR5cGVkX292ZXJfYl9ub3RfbnVsbCBOT1QgTlVMTCBiOworKDMgcm93cykKKwor LS0gVGVtcG9yYXJ5IHRhYmxlcyArIE9OIENPTU1JVC4gIFRlbXAgdGFibGVzIGxpdmUgaW4gYSBz ZXNzaW9uLWxvY2FsCistLSBuYW1lc3BhY2Ugd2hvc2UgbmFtZSB2YXJpZXMgYmV0d2VlbiBydW5z LCBzbyB3ZSBzdHJpcCB0aGUgc2NoZW1hCistLSBwcmVmaXguICBPTiBDT01NSVQgRFJPUCBvbmx5 IGZpcmVzIGF0IGNvbW1pdCwgc28gdGhlIHF1ZXJpZXMgdGhhdAorLS0gbmVlZCB0byBzZWUgdGhl IGNhdGFsb2cgZW50cnkgbXVzdCBydW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKy0tIHRo ZSBDUkVBVEUuCitCRUdJTjsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVmYXVsdCAoaWQgaW50 KTsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVsZXRlIChpZCBpbnQpIE9OIENPTU1JVCBERUxF VEUgUk9XUzsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZHJvcCAoaWQgaW50KSBPTiBDT01NSVQg RFJPUDsKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wu JywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2RlZmF1 bHQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBMSUtF ICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVtcC50 ZW1wX2RlZmF1bHQgKCBpZCBpbnRlZ2VyKTsKKygxIHJvdykKKworU0VMRUNUIHJlZ2V4cF9yZXBs YWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVsZXRlJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUnOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEVNUE9SQVJZ IFRBQkxFIHBnX3RlbXAudGVtcF9kZWxldGUgKCBpZCBpbnRlZ2VyKSBPTiBDT01NSVQgREVMRVRF IFJPV1M7CisoMSByb3cpCisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1w Xz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRs KCd0ZW1wX2Ryb3AnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUg bGluZSBMSUtFICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVtcC50ZW1wX2Ryb3AgKCBpZCBpbnRlZ2VyKSBP TiBDT01NSVQgRFJPUDsKKygxIHJvdykKKworUk9MTEJBQ0s7CistLSBQcmV0dHkgbW9kZS4KK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVyJywg J2ZhbHNlJywgJ3ByZXR0eScsICd0cnVlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5iYXNpYyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAr CisgICAgIGlkIGludGVnZXIgTk9UIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgICAgbmFtZSB0ZXh0IENPTExBVEUgIkMi IERFRkFVTFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAg KworICk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQg YmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rl c3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBuYW1l OworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2lj X3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIGluY2x1ZGVzXyogZ2F0aW5n OiBlYWNoIHN1Yi1vYmplY3QgY2F0ZWdvcnkgY2FuIGJlIHN1cHByZXNzZWQgaW5kaXZpZHVhbGx5 LgorLS0gaW5jbHVkZXNfaW5kZXhlcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIElOREVYIHN0YXRl bWVudHMuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVk ZXNfaW5kZXhlcycsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBn X2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCAoIGlkIGludGVn ZXIgTk9UIE5VTEwsIG5hbWUgdGV4dCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4 ZCBBREQgQ09OU1RSQUlOVCBpZHhkX2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVSIFRB QkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9wa2V5IFBSSU1BUlkg S0VZIChpZCk7CisoMyByb3dzKQorCistLSBpbmNsdWRlc19jb25zdHJhaW50cz1mYWxzZSBoaWRl cyBib3RoIGlubGluZSBDSEVDSyBpbiBDUkVBVEUgVEFCTEUgYW5kCistLSB0aGUgQUxURVIgVEFC TEUgLi4uIEFERCBDT05TVFJBSU5UIGxpbmVzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2NvbnN0cmFpbnRzJywgJ2ZhbHNlJyk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNvbnMg KCBhIGludGVnZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyKTsKKygxIHJvdykKKworLS0gaW5jbHVk ZXNfcnVsZXM9ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBSVUxFLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdydCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19ydWxlcycsICdmYWxzZScpOworICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LnJ0ICggaWQgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3N0YXRpc3Rp Y3M9ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBTVEFUSVNUSUNTLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdzdHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfc3RhdGlzdGljcycsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu c3R4ICggYSBpbnRlZ2VyLCBiIGludGVnZXIsIGMgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGlu Y2x1ZGVzX3Jscz1mYWxzZSBoaWRlcyB0aGUgRU5BQkxFL0ZPUkNFIFJPVyBMRVZFTCBTRUNVUklU WSB0b2dnbGVzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5j bHVkZXNfcmxzJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsK KygxIHJvdykKKworLS0gaW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eT1mYWxzZSBoaWRlcyB0aGUg UkVQTElDQSBJREVOVElUWSBjbGF1c2UuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J3JpX2Z1bGwnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAnaW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eScsICdmYWxzZScpOworICAg ICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFC TEUgcGd0YmxfZGRsX3Rlc3QucmlfZnVsbCAoIGEgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGlu Y2x1ZGVzX3BhcnRpdGlvbjogZGVmYXVsdCBpcyBmYWxzZSwgc28gdGhlIHBhcnRpdGlvbmVkLXRh YmxlIHBhcmVudAorLS0gRERMIG9uIGl0cyBvd24gZG9lcyBub3QgaW5jbHVkZSBpdHMgY2hpbGRy ZW4uICBTZXR0aW5nIGl0IHRvIHRydWUKKy0tIGFwcGVuZHMgdGhlIGNoaWxkcmVuJ3MgRERMIGFm dGVyIHRoZSBwYXJlbnQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9y YW5nZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdpbmNsdWRlc19wYXJ0aXRpb24nLCAndHJ1ZScpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRlZ2VyLCBrIGludGVnZXIp IFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5w YXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlIEZP UiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu cGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKKyBDUkVBVEUgVEFC TEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJT04gT0YgcGd0YmxfZGRs X3Rlc3QucGFydGVkX3JhbmdlIERFRkFVTFQ7CisoNCByb3dzKQorCistLSBzY2hlbWFfcXVhbGlm aWVkPWZhbHNlIHN0cmlwcyB0aGUgc2NoZW1hIGZyb20gdGhlIHRhcmdldCB0YWJsZSBpdHNlbGYK Ky0tIGFuZCBmcm9tIHNhbWUtc2NoZW1hIHNpYmxpbmcgcmVmZXJlbmNlcyAoaW5oZXJpdGFuY2Uv cGFydGl0aW9uCistLSBwYXJlbnRzLCBpZGVudGl0eSBzZXF1ZW5jZXMgaW4gdGhlIHNhbWUgc2No ZW1hKSwgd2hpbGUgY3Jvc3Mtc2NoZW1hCistLSByZWZlcmVuY2VzIGFyZSBrZXB0IHF1YWxpZmll ZCBmb3IgY29ycmVjdG5lc3MuCistLQorLS0gQmFyZSBDUkVBVEUgVEFCTEUgZm9yIGFuIG9yZGlu YXJ5IHRhYmxlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdz Y2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Q1JFQVRFIFRBQkxFIGJhc2ljICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0IENPTExB VEUgIkMiIERFRkFVTFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBiYXNp YyBBREQgQ09OU1RSQUlOVCBiYXNpY19pZF9ub3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBU QUJMRSBiYXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19uYW1lX25vdF9udWxsIE5PVCBOVUxMIG5h bWU7CisgQUxURVIgVEFCTEUgYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfcGtleSBQUklNQVJZ IEtFWSAoaWQpOworKDQgcm93cykKKworLS0gSU5IRVJJVFMgcGFyZW50IGluIHRoZSBzYW1lIHNj aGVtYSBpcyBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdjaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBjaCAoIGMgaW50ZWdl cikgSU5IRVJJVFMgKHBhcik7CisgQUxURVIgVEFCTEUgY2ggQUxURVIgQ09MVU1OIGEgU0VUIERF RkFVTFQgOTk5OworKDIgcm93cykKKworLS0gUGFydGl0aW9uIHBhcmVudCBpbiB0aGUgc2FtZSBz Y2hlbWEgaXMgZW1pdHRlZCB1bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncGFydGVkX3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIENSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJT04gT0YgcGFydGVkX3Jhbmdl IEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGFydGVkX3Jhbmdl XzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKKygyIHJvd3MpCisKKy0tIENyb3NzLXNj aGVtYSBGSyB0YXJnZXQga2VlcHMgcXVhbGlmaWNhdGlvbi4gIFRoZSAncmVmZCcgdGFibGUgaXMg aW4KKy0tIHBndGJsX2RkbF90ZXN0OyBwbGFjZSBhbiBGSyB0YXJnZXQgaW4gYSBkaWZmZXJlbnQg c2NoZW1hIGFuZCB2ZXJpZnkgaXQKKy0tIHN0YXlzIHF1YWxpZmllZCBldmVuIHdpdGggc2NoZW1h X3F1YWxpZmllZD1mYWxzZS4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX290aGVyOworQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF9vdGhlci5wYXJlbnQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVB VEUgVEFCTEUgeHNjaGVtYV9mayAoCisgICAgaWQgIGludCBQUklNQVJZIEtFWSwKKyAgICBwaWQg aW50IFJFRkVSRU5DRVMgcGd0YmxfZGRsX290aGVyLnBhcmVudAorKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgneHNjaGVtYV9mayc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2Un LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2Zh bHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgeHNjaGVtYV9mayAoIGlkIGludGVnZXIgTk9U IE5VTEwsIHBpZCBpbnRlZ2VyKTsKKyBBTFRFUiBUQUJMRSB4c2NoZW1hX2ZrIEFERCBDT05TVFJB SU5UIHhzY2hlbWFfZmtfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgeHNj aGVtYV9mayBBREQgQ09OU1RSQUlOVCB4c2NoZW1hX2ZrX3BpZF9ma2V5IEZPUkVJR04gS0VZIChw aWQpIFJFRkVSRU5DRVMgcGd0YmxfZGRsX290aGVyLnBhcmVudChpZCk7CisgQUxURVIgVEFCTEUg eHNjaGVtYV9mayBBREQgQ09OU1RSQUlOVCB4c2NoZW1hX2ZrX3BrZXkgUFJJTUFSWSBLRVkgKGlk KTsKKyg0IHJvd3MpCisKKy0tIElkZW50aXR5IGNvbHVtbiB3aXRoIGEgY3VzdG9tIHNlcXVlbmNl IG5hbWUgaW4gdGhlIHNhbWUgc2NoZW1hIGlzCistLSBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZF9jdXN0b20nOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxp ZmllZCcsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIGlkX2N1c3Rv bSAoIHYgaW50ZWdlciBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIChTVEFSVCBXSVRIIDEw MCBJTkNSRU1FTlQgQlkgNSBNSU5WQUxVRSA1MCBNQVhWQUxVRSAxMDAwIENBQ0hFIDEwIENZQ0xF KSBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgaWRfY3VzdG9tIEFERCBDT05TVFJBSU5UIGlkX2N1 c3RvbV92X25vdF9udWxsIE5PVCBOVUxMIHY7CisoMiByb3dzKQorCistLSBSb3VuZC10cmlwOiB3 aXRoIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2UsIGFmdGVyIFNFVCBzZWFyY2hfcGF0aCB0aGUKKy0t IERETCBjYW4gYmUgcmVwbGF5ZWQgaW50byBhIGRpZmZlcmVudCB0YXJnZXQgc2NoZW1hLgorQ1JF QVRFIFNDSEVNQSBwZ3RibF9kZGxfcmVwbGF5OworRE8gJCQKK0RFQ0xBUkUKKyAgICBzdG10IHRl eHQ7CitCRUdJTgorICAgIFNFVCBMT0NBTCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF9yZXBsYXk7 CisgICAgRk9SIHN0bXQgSU4KKyAgICAgICAgU0VMRUNUIGxpbmUgRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdwZ3RibF9kZGxfdGVzdC5iYXNpYyc6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJykg QVMgbGluZQorICAgIExPT1AKKyAgICAgICAgRVhFQ1VURSBzdG10OworICAgIEVORCBMT09QOwor RU5EICQkOworU0VMRUNUIHJlbG5hbWVzcGFjZTo6cmVnbmFtZXNwYWNlOjp0ZXh0LCByZWxuYW1l CitGUk9NIHBnX2NsYXNzIFdIRVJFIG9pZCA9ICdwZ3RibF9kZGxfcmVwbGF5LmJhc2ljJzo6cmVn Y2xhc3M7CisgICByZWxuYW1lc3BhY2UgICB8IHJlbG5hbWUgCistLS0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tCisgcGd0YmxfZGRsX3JlcGxheSB8IGJhc2ljCisoMSByb3cpCisKK0RST1AgU0NI RU1BIHBndGJsX2RkbF9yZXBsYXkgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8g dGFibGUgcGd0YmxfZGRsX3JlcGxheS5iYXNpYworRFJPUCBUQUJMRSB4c2NoZW1hX2ZrOworRFJP UCBTQ0hFTUEgcGd0YmxfZGRsX290aGVyIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVz IHRvIHRhYmxlIHBndGJsX2RkbF9vdGhlci5wYXJlbnQKKy0tIExvY2FsbHktZGVjbGFyZWQgQ0hF Q0sgb24gYSBwYXJ0aXRpb24gY2hpbGQgaGFzIG5vIGlubGluZSBjb2x1bW4KKy0tIGxpc3QgdG8g bGl2ZSBpbiAoUEFSVElUSU9OIE9GIGZvcm0pLCBzbyBpdCBtdXN0IGNvbWUgb3V0IGFzIGEKKy0t IHNlcGFyYXRlIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBzdGF0ZW1lbnQuCitDUkVB VEUgVEFCTEUgcGFydGVkX2NoayAoaWQgaW50LCB2YWwgaW50KSBQQVJUSVRJT04gQlkgUkFOR0Ug KGlkKTsKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfY2hrX2NoaWxkIFBBUlRJVElPTiBPRiBwYXJ0ZWRf Y2hrCisgICAgKENPTlNUUkFJTlQgY2hrX2lubGluZSBDSEVDSyAodmFsID4gMCkpCisgICAgRk9S IFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgncGFydGVkX2Noa19jaGlsZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVf ZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX2Noa19jaGlsZCBQQVJUSVRJT04g T0YgcGd0YmxfZGRsX3Rlc3QucGFydGVkX2NoayBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMDAp OworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9jaGtfY2hpbGQgQUREIENPTlNU UkFJTlQgY2hrX2lubGluZSBDSEVDSyAoKHZhbCA+IDApKTsKKygyIHJvd3MpCisKK0RST1AgVEFC TEUgcGFydGVkX2NoazsKKy0tIEluaGVyaXRhbmNlIGNoaWxkcmVuIG9mIGEgcGFyZW50IHdpdGgg YSBnZW5lcmF0ZWQgY29sdW1uIHNob3VsZCBub3QKKy0tIGVtaXQgYW4gQUxURVIgQ09MVU1OIC4u LiBTRVQgREVGQVVMVCBmb3IgdGhlIGluaGVyaXRlZCBnZW5lcmF0ZWQKKy0tIGNvbHVtbjogdGhl IEdFTkVSQVRFRCBleHByZXNzaW9uIGNhcnJpZXMgZG93biB0aHJvdWdoIGluaGVyaXRhbmNlLAor LS0gYW5kIFNFVCBERUZBVUxUIHdvdWxkIGZhaWwgYXQgcmVwbGF5IGFnYWluc3QgYSBnZW5lcmF0 ZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxFIHBhcl9nZW4gKAorICAgIGlkIGludCwKKyAgICBnICBp bnQgR0VORVJBVEVEIEFMV0FZUyBBUyAoaWQgKiAyKSBTVE9SRUQKKyk7CitDUkVBVEUgVEFCTEUg Y2hfZ2VuICgpIElOSEVSSVRTIChwYXJfZ2VuKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgnY2hfZ2VuJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNo X2dlbiAoKSBJTkhFUklUUyAocGd0YmxfZGRsX3Rlc3QucGFyX2dlbik7CisoMSByb3cpCisKK0RS T1AgVEFCTEUgcGFyX2dlbiBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJs ZSBjaF9nZW4KKy0tIFVzZXItbmFtZWQgTk9UIE5VTEwgY29uc3RyYWludCBtdXN0IGJlIGVtaXR0 ZWQgaW5saW5lIGFzCistLSAiQ09OU1RSQUlOVCBuYW1lIE5PVCBOVUxMIiBzbyBhIHJlcGxheSBk b2VzIG5vdCBjb2xsaWRlIHdpdGggdGhlCistLSBhdXRvLW5hbWVkIE5PVCBOVUxMIHRoYXQgUG9z dGdyZVNRTCB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIGZyb20gYQorLS0gcGxhaW4gaW5saW5lICJO T1QgTlVMTCIuICBUaGUgY29uc3RyYWludCBsb29wIHNraXBzIHRoZSB1c2VyLW5hbWVkCistLSBl bnRyeSB0byBhdm9pZCBkb3VibGUtZW1pc3Npb24uCitDUkVBVEUgVEFCTEUgbm5fbmFtZWQgKAor ICAgIGEgaW50IENPTlNUUkFJTlQgbXlfbm4gTk9UIE5VTEwsCisgICAgYiBpbnQgTk9UIE5VTEwK Kyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ25uX25hbWVkJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF90ZXN0Lm5uX25hbWVkICggYSBpbnRlZ2VyIENPTlNUUkFJTlQgbXlf bm4gTk9UIE5VTEwsIGIgaW50ZWdlciBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRs X3Rlc3Qubm5fbmFtZWQgQUREIENPTlNUUkFJTlQgbm5fbmFtZWRfYl9ub3RfbnVsbCBOT1QgTlVM TCBiOworKDIgcm93cykKKworRFJPUCBUQUJMRSBubl9uYW1lZDsKKy0tIEVycm9yOiBub3QgYW4g b3JkaW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUuCitDUkVBVEUgVklFVyB2IEFTIFNFTEVDVCAx IEFTIHg7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3YnOjpyZWdjbGFzcyk7CitF UlJPUjogICJ2IiBpcyBub3QgYW4gb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUKK0NSRUFU RSBTRVFVRU5DRSBzOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzJzo6cmVnY2xh c3MpOworRVJST1I6ICAicyIgaXMgbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxl CistLSBOVUxMIGFyZ3VtZW50IHJldHVybnMgbm8gcm93cy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbChOVUxMKTsKKyBwZ19nZXRfdGFibGVfZGRsIAorLS0tLS0tLS0tLS0tLS0tLS0t CisoMCByb3dzKQorCistLSBVbnJlY29nbml6ZWQgb3B0aW9uLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnYm9ndXMnLCAndHJ1ZScpOworRVJST1I6 ICB1bnJlY29nbml6ZWQgb3B0aW9uOiAiYm9ndXMiCistLSBPZGQgbnVtYmVyIG9mIHZhcmlhZGlj IGFyZ3MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3Ms ICdwcmV0dHknKTsKK0VSUk9SOiAgdmFyaWFkaWMgYXJndW1lbnRzIG11c3QgYmUgbmFtZS92YWx1 ZSBwYWlycworSElOVDogIFByb3ZpZGUgYW4gZXZlbiBudW1iZXIgb2YgdmFyaWFkaWMgYXJndW1l bnRzIHRoYXQgY2FuIGJlIGRpdmlkZWQgaW50byBwYWlycy4KKy0tIFJvdW5kLXRyaXAgdmVyaWZp Y2F0aW9uLiAgRm9yIGV2ZXJ5IHRlc3QgdGFibGUsIGNhcHR1cmUgdGhlIERETCB0aGUKKy0tIGZ1 bmN0aW9uIGVtaXRzLCBkcm9wIHRoZSBzY2hlbWEsIHJlcGxheSBlYWNoIHRhYmxlJ3MgRERMIGlu CistLSBkZXBlbmRlbmN5IG9yZGVyLCBhbmQgY29uZmlybSB0aGF0IHBnX2dldF90YWJsZV9kZGwg b24gdGhlIHJlY3JlYXRlZAorLS0gcmVsYXRpb24gbWF0Y2hlcyB0aGUgb3JpZ2luYWwgbGluZS1m b3ItbGluZS4gIFRoZSBmaW5hbCBTRUxFQ1QgbXVzdAorLS0gcmV0dXJuIHplcm8gcm93cy4KK0NS RUFURSBURU1QIFRBQkxFIHBndGJsX2RkbF9ydF9vcmlnIChuYW1lIHRleHQsIG9yZCBpbnQsIGxp bmUgdGV4dCk7CitJTlNFUlQgSU5UTyBwZ3RibF9kZGxfcnRfb3JpZworU0VMRUNUIHQubmFtZSwg by5vcmQsIG8ubGluZQorRlJPTSAoVkFMVUVTCisgICAgICAgICgnYmFzaWMnKSwgKCdpZF9jb2xz JyksICgnaWRfY3VzdG9tJyksICgnZ2VuX2NvbHMnKSwgKCdzdG9yYWdlX2NvbHMnKSwKKyAgICAg ICAgKCdyZWZkJyksICgnY29ucycpLCAoJ2lkeGQnKSwKKyAgICAgICAgKCdwYXInKSwgKCdjaCcp LCAoJ2F0dG9wdCcpLAorICAgICAgICAoJ3BhcnRlZF9yYW5nZScpLCAoJ3BhcnRlZF9yYW5nZV8x JyksICgncGFydGVkX3JhbmdlX2RlZicpLAorICAgICAgICAoJ3BhcnRlZF9oYXNoJyksICgncGFy dGVkX2hhc2hfMCcpLAorICAgICAgICAoJ3J0X2xvZycpLCAoJ3J0JyksCisgICAgICAgICgnc3R4 JyksICgncmxzJyksICgncmlfZnVsbCcpLCAoJ3JpX2lkeCcpLCAoJ3VubycpCisgICAgICkgQVMg dChuYW1lKSwKKyAgICAgTEFURVJBTCBwZ19nZXRfdGFibGVfZGRsKCgncGd0YmxfZGRsX3Rlc3Qu JyB8fCB0Lm5hbWUpOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdv d25lcicsICdmYWxzZScpIFdJVEggT1JESU5BTElUWSBvKGxpbmUsIG9yZCk7CitETyAkJAorREVD TEFSRQorICAgIHRhYmxlcyBDT05TVEFOVCB0ZXh0W10gOj0gQVJSQVlbCisgICAgICAgICdiYXNp YycsICdpZF9jb2xzJywgJ2lkX2N1c3RvbScsICdnZW5fY29scycsICdzdG9yYWdlX2NvbHMnLAor ICAgICAgICAncmVmZCcsICdjb25zJywgJ2lkeGQnLAorICAgICAgICAncGFyJywgJ2NoJywgJ2F0 dG9wdCcsCisgICAgICAgICdwYXJ0ZWRfcmFuZ2UnLCAncGFydGVkX3JhbmdlXzEnLCAncGFydGVk X3JhbmdlX2RlZicsCisgICAgICAgICdwYXJ0ZWRfaGFzaCcsICdwYXJ0ZWRfaGFzaF8wJywKKyAg ICAgICAgJ3J0X2xvZycsICdydCcsCisgICAgICAgICdzdHgnLCAncmxzJywgJ3JpX2Z1bGwnLCAn cmlfaWR4JywgJ3VubycKKyAgICBdOworICAgIHQgdGV4dDsKKyAgICBzdG10IHRleHQ7CitCRUdJ TgorICAgIERST1AgU0NIRU1BIHBndGJsX2RkbF90ZXN0IENBU0NBREU7CisgICAgQ1JFQVRFIFND SEVNQSBwZ3RibF9kZGxfdGVzdDsKKyAgICBGT1JFQUNIIHQgSU4gQVJSQVkgdGFibGVzIExPT1AK KyAgICAgICAgRk9SIHN0bXQgSU4KKyAgICAgICAgICAgIFNFTEVDVCBsaW5lIEZST00gcGd0Ymxf ZGRsX3J0X29yaWcgV0hFUkUgbmFtZSA9IHQgT1JERVIgQlkgb3JkCisgICAgICAgIExPT1AKKyAg ICAgICAgICAgIEVYRUNVVEUgc3RtdDsKKyAgICAgICAgRU5EIExPT1A7CisgICAgRU5EIExPT1A7 CitFTkQgJCQ7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIDI1IG90aGVyIG9iamVjdHMKK0RF VEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgYmFzaWMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFi bGUgaWRfY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZF9jdXN0b20KK2Ryb3AgY2FzY2Fk ZXMgdG8gdGFibGUgZ2VuX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgc3RvcmFnZV9jb2xz Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJlZmQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgY29u cworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZHhkCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBh cgorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjaAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBhdHRv cHQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFydGVkX3JhbmdlCitkcm9wIGNhc2NhZGVzIHRv IHRhYmxlIHBhcnRlZF9oYXNoCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJ0Citkcm9wIGNhc2Nh ZGVzIHRvIHRhYmxlIHJ0X2xvZworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBzdHgKK2Ryb3AgY2Fz Y2FkZXMgdG8gdGFibGUgcmxzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJpX2Z1bGwKK2Ryb3Ag Y2FzY2FkZXMgdG8gdGFibGUgcmlfaWR4Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHVubworZHJv cCBjYXNjYWRlcyB0byB0eXBlIHR5cGVkX3QKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdHlwZWRf cGxhaW4KK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdHlwZWRfb3ZlcgorZHJvcCBjYXNjYWRlcyB0 byB2aWV3IHYKK2Ryb3AgY2FzY2FkZXMgdG8gc2VxdWVuY2UgcworV0lUSCBhZnRlcl9kZGwgQVMg KAorICAgIFNFTEVDVCB0Lm5hbWUsIG8ub3JkLCBvLmxpbmUKKyAgICBGUk9NIChTRUxFQ1QgRElT VElOQ1QgbmFtZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnKSBBUyB0LAorICAgICAgICAgTEFURVJB TCBwZ19nZXRfdGFibGVfZGRsKCgncGd0YmxfZGRsX3Rlc3QuJyB8fCB0Lm5hbWUpOjpyZWdjbGFz cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnKSBX SVRIIE9SRElOQUxJVFkgbyhsaW5lLCBvcmQpCispCisoU0VMRUNUICdtaXNzaW5nLWluLWNvcHkn IEFTIGtpbmQsIG5hbWUsIG9yZCwgbGluZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnCisgRVhDRVBU CisgU0VMRUNUICdtaXNzaW5nLWluLWNvcHknLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBhZnRlcl9k ZGwpCitVTklPTiBBTEwKKyhTRUxFQ1QgJ2V4dHJhLWluLWNvcHknIEFTIGtpbmQsIG5hbWUsIG9y ZCwgbGluZSBGUk9NIGFmdGVyX2RkbAorIEVYQ0VQVAorIFNFTEVDVCAnZXh0cmEtaW4tY29weScs IG5hbWUsIG9yZCwgbGluZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnKQorT1JERVIgQlkga2luZCwg bmFtZSwgb3JkOworIGtpbmQgfCBuYW1lIHwgb3JkIHwgbGluZSAKKy0tLS0tLSstLS0tLS0rLS0t LS0rLS0tLS0tCisoMCByb3dzKQorCistLSBDbGVhbnVwLgorRFJPUCBTQ0hFTUEgcGd0YmxfZGRs X3Rlc3QgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gMjAgb3RoZXIgb2JqZWN0 cworREVUQUlMOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBiYXNpYworZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBpZF9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlkX2N1c3RvbQorZHJvcCBj YXNjYWRlcyB0byB0YWJsZSBnZW5fY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBzdG9yYWdl X2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmVmZAorZHJvcCBjYXNjYWRlcyB0byB0YWJs ZSBjb25zCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlkeGQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFi bGUgcGFyCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGNoCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxl IGF0dG9wdAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwYXJ0ZWRfcmFuZ2UKK2Ryb3AgY2FzY2Fk ZXMgdG8gdGFibGUgcGFydGVkX2hhc2gKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcnRfbG9nCitk cm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJ0Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHN0eAorZHJv cCBjYXNjYWRlcyB0byB0YWJsZSBybHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfZnVsbAor ZHJvcCBjYXNjYWRlcyB0byB0YWJsZSByaV9pZHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdW5v CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlIGIvc3JjL3Rl c3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQppbmRleCA4ZmEwYTZjNDdmYi4uOWVjYTY0Y2Nh M2IgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKKysrIGIv c3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQpAQCAtODEsNyArODEsNyBAQCB0ZXN0 OiBjcmVhdGVfdGFibGVfbGlrZSBhbHRlcl9nZW5lcmljIGFsdGVyX29wZXJhdG9yIG1pc2MgYXN5 bmMgZGJzaXplIG1lcmdlIG1pcwogIyBjb2xsYXRlLmxpbnV4LnV0ZjggYW5kIGNvbGxhdGUuaWN1 LnV0ZjggdGVzdHMgY2Fubm90IGJlIHJ1biBpbiBwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXIKICMg cHNxbCBkZXBlbmRzIG9uIGNyZWF0ZV9hbQogIyBhbXV0aWxzIGRlcGVuZHMgb24gZ2VvbWV0cnks IGNyZWF0ZV9pbmRleF9zcGdpc3QsIGhhc2hfaW5kZXgsIGJyaW4KLXRlc3Q6IHJ1bGVzIHBzcWwg cHNxbF9jcm9zc3RhYiBwc3FsX3BpcGVsaW5lIGFtdXRpbHMgc3RhdHNfZXh0IGNvbGxhdGUubGlu dXgudXRmOCBjb2xsYXRlLndpbmRvd3Mud2luMTI1MgordGVzdDogcnVsZXMgcHNxbCBwc3FsX2Ny b3NzdGFiIHBzcWxfcGlwZWxpbmUgYW11dGlscyBzdGF0c19leHQgY29sbGF0ZS5saW51eC51dGY4 IGNvbGxhdGUud2luZG93cy53aW4xMjUyIHBnX2dldF90YWJsZV9kZGwKIAogIyAtLS0tLS0tLS0t CiAjIFJ1biB0aGVzZSBhbG9uZSBzbyB0aGV5IGRvbid0IHJ1biBvdXQgb2YgcGFyYWxsZWwgd29y a2VycwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5z cWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRsLnNxbApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNzVlMDdmMzUwNWYKLS0tIC9kZXYvbnVsbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRsLnNxbApAQCAtMCwwICsx LDM2OCBAQAorLS0KKy0tIHBnX2dldF90YWJsZV9kZGwKKy0tCistLSBBbGwgdGVzdHMgcGFzcyBv d25lcj0+ZmFsc2Ugc28gdGhlIEFMVEVSIFRBQkxFIE9XTkVSIFRPIGxpbmUgaXMgbm90CistLSBl bWl0dGVkLCBrZWVwaW5nIG91dHB1dCBzdGFibGUgYWNyb3NzIHRlc3QgcnVubmVycyAod2hpY2gg bWF5IHJ1biB1bmRlcgorLS0gZGlmZmVyZW50IHJvbGUgbmFtZXMpLgorLS0KK0NSRUFURSBTQ0hF TUEgcGd0YmxfZGRsX3Rlc3Q7CitTRVQgc2VhcmNoX3BhdGggPSBwZ3RibF9kZGxfdGVzdDsKKwor LS0gQmFzaWMgdGFibGUgd2l0aCBQUklNQVJZIEtFWSwgTk9UIE5VTEwsIERFRkFVTFQsIENPTExB VEUuCitDUkVBVEUgVEFCTEUgYmFzaWMgKAorICAgIGlkIGludCBQUklNQVJZIEtFWSwKKyAgICBu YW1lIHRleHQgTk9UIE5VTEwgREVGQVVMVCAnYW5vbicgQ09MTEFURSAiQyIKKyk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScpOworCistLSBJZGVudGl0eSBjb2x1bW5zICh3aXRoIGRlZmF1bHQgYW5kIGN1c3RvbSBzZXF1 ZW5jZSBvcHRpb25zKS4KK0NSRUFURSBUQUJMRSBpZF9jb2xzICgKKyAgICBpZF9hbHdheXMgaW50 IEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFksCisgICAgaWRfZGVmYXVsdCBpbnQgR0VORVJB VEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ2lkX2NvbHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBU QUJMRSBpZF9jdXN0b20gKAorICAgIHYgaW50IEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkg KAorICAgICAgICBTRVFVRU5DRSBOQU1FIGlkX2N1c3RvbV92X3NlcQorICAgICAgICBTVEFSVCBX SVRIIDEwMCBJTkNSRU1FTlQgQlkgNQorICAgICAgICBNSU5WQUxVRSA1MCBNQVhWQUxVRSAxMDAw CisgICAgICAgIENBQ0hFIDEwIENZQ0xFCisgICAgKQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgnaWRfY3VzdG9tJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCist LSBHZW5lcmF0ZWQgc3RvcmVkIGNvbHVtbi4KK0NSRUFURSBUQUJMRSBnZW5fY29scyAoCisgICAg Y2VudHMgaW50LAorICAgIGRvbGxhcnMgbnVtZXJpYyBHRU5FUkFURUQgQUxXQVlTIEFTIChjZW50 cyAvIDEwMC4wKSBTVE9SRUQKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2dl bl9jb2xzJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBTVE9SQUdFIGFuZCBD T01QUkVTU0lPTiAob25seSBlbWl0dGVkIHdoZW4gbm9uLWRlZmF1bHQgZm9yIHRoZSB0eXBlKS4K K0NSRUFURSBUQUJMRSBzdG9yYWdlX2NvbHMgKAorICAgIGEgdGV4dCBTVE9SQUdFIEVYVEVSTkFM LAorICAgIGIgdGV4dCBTVE9SQUdFIE1BSU4sCisgICAgYyB0ZXh0IENPTVBSRVNTSU9OIHBnbHoK Kyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0b3JhZ2VfY29scyc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gQ29uc3RyYWludHM6IENIRUNLLCBVTklRVUUs IEZPUkVJR04gS0VZIChERUZFUlJBQkxFKS4KK0NSRUFURSBUQUJMRSByZWZkIChpZCBpbnQgUFJJ TUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIGNvbnMgKAorICAgIGEgaW50IENIRUNLIChhID4gMCks CisgICAgYiBpbnQgVU5JUVVFLAorICAgIGMgaW50IFJFRkVSRU5DRVMgcmVmZChpZCkgREVGRVJS QUJMRSBJTklUSUFMTFkgREVGRVJSRUQKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIEluZGV4ZXM6IGZ1 bmN0aW9uYWwgYW5kIHBhcnRpYWwuICBDb25zdHJhaW50LWJhY2tpbmcgaW5kZXhlcyBhcmUKKy0t IHN1cHByZXNzZWQgKHRoZXkgYXJlIGVtaXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCkuCitD UkVBVEUgVEFCTEUgaWR4ZCAoaWQgaW50IFBSSU1BUlkgS0VZLCBuYW1lIHRleHQpOworQ1JFQVRF IElOREVYIGlkeGRfbG93ZXIgT04gaWR4ZCAobG93ZXIobmFtZSkpOworQ1JFQVRFIElOREVYIGlk eGRfcGFydGlhbCBPTiBpZHhkIChpZCkgV0hFUkUgaWQgPiAxMDA7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0t IEluaGVyaXRhbmNlLCBpbmNsdWRpbmcgYSBjaGlsZCBERUZBVUxUIG92ZXJyaWRlIG9uIGFuIGlu aGVyaXRlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgcGFyIChhIGludCBERUZBVUxUIDEsIGIgdGV4 dCk7CitDUkVBVEUgVEFCTEUgY2ggKGMgaW50KSBJTkhFUklUUyAocGFyKTsKK0FMVEVSIFRBQkxF IGNoIEFMVEVSIENPTFVNTiBhIFNFVCBERUZBVUxUIDk5OTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgnY2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFBlci1j b2x1bW4gYXR0b3B0aW9uczogZW1pdHRlZCBhcyBBTFRFUiBDT0xVTU4gU0VUICguLi4pLgorQ1JF QVRFIFRBQkxFIGF0dG9wdCAoYSBpbnQsIGIgdGV4dCk7CitBTFRFUiBUQUJMRSBhdHRvcHQgQUxU RVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgnYXR0b3B0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBQ YXJ0aXRpb25lZCB0YWJsZSBwYXJlbnQgKFJBTkdFIGFuZCBIQVNIKS4KK0NSRUFURSBUQUJMRSBw YXJ0ZWRfcmFuZ2UgKGlkIGludCwgayBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2UnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfaGFzaCAoaWQgaW50KSBQQVJU SVRJT04gQlkgSEFTSCAoaWQpOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0 ZWRfaGFzaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gUGFydGl0aW9uIGNo aWxkcmVuOiBGUk9NL1RPLCBXSVRIIChtb2R1bHVzLCByZW1haW5kZXIpLCBERUZBVUxULgorQ1JF QVRFIFRBQkxFIHBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UKKyAgICBG T1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEg QUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncGFydGVkX3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NS RUFURSBUQUJMRSBwYXJ0ZWRfaGFzaF8wIFBBUlRJVElPTiBPRiBwYXJ0ZWRfaGFzaAorICAgIEZP UiBWQUxVRVMgV0lUSCAobW9kdWx1cyAyLCByZW1haW5kZXIgMCk7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3BhcnRlZF9oYXNoXzAnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl Jyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2VfZGVmIFBBUlRJVElPTiBPRiBwYXJ0ZWRf cmFuZ2UgREVGQVVMVDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3Jh bmdlX2RlZic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gUnVsZXMuCitDUkVB VEUgVEFCTEUgcnQgKGlkIGludCk7CitDUkVBVEUgVEFCTEUgcnRfbG9nIChpZCBpbnQpOworQ1JF QVRFIFJVTEUgcnRfbG9nX2luc2VydCBBUyBPTiBJTlNFUlQgVE8gcnQKKyAgICBETyBBTFNPIElO U0VSVCBJTlRPIHJ0X2xvZyBWQUxVRVMgKE5FVy5pZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBFeHRlbmRl ZCBzdGF0aXN0aWNzLgorQ1JFQVRFIFRBQkxFIHN0eCAoYSBpbnQsIGIgaW50LCBjIGludCk7CitD UkVBVEUgU1RBVElTVElDUyBzdHhfbmR2IChuZGlzdGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0eCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKworLS0gUm93LWxldmVsIHNlY3VyaXR5IHRvZ2dsZXMuCitDUkVBVEUgVEFCTEUg cmxzIChpZCBpbnQpOworQUxURVIgVEFCTEUgcmxzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7 CitBTFRFUiBUQUJMRSBybHMgRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOworU0VMRUNUICogRlJP TSBwZ19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisK Ky0tIFJFUExJQ0EgSURFTlRJVFk6IGVtaXR0ZWQgb25seSB3aGVuIG5vdCB0aGUgZGVmYXVsdC4K K0NSRUFURSBUQUJMRSByaV9mdWxsIChhIGludCk7CitBTFRFUiBUQUJMRSByaV9mdWxsIFJFUExJ Q0EgSURFTlRJVFkgRlVMTDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmlfZnVs bCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworQ1JFQVRFIFRBQkxFIHJpX2lkeCAo YSBpbnQgTk9UIE5VTEwpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCByaV9pZHhfYSBPTiByaV9pZHgg KGEpOworQUxURVIgVEFCTEUgcmlfaWR4IFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggcmlf aWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3JpX2lkeCc6OnJlZ2NsYXNz LCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gVU5MT0dHRUQgKyByZWxvcHRpb25zLgorQ1JFQVRF IFVOTE9HR0VEIFRBQkxFIHVubyAoaWQgaW50KSBXSVRIIChmaWxsZmFjdG9yID0gNzApOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd1bm8nOjpyZWdjbGFzcywgJ293bmVyJywgJ2Zh bHNlJyk7CisKKy0tIFR5cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgT0YgdHlwZV9uYW1lKS4gIENv bHVtbnMgaW5oZXJpdGVkIGZyb20gdGhlCistLSB0eXBlIGVtaXQgbm90aGluZzsgbG9jYWxseS1h cHBsaWVkIERFRkFVTFQsIE5PVCBOVUxMIGFuZCBDSEVDSyBjb21lCistLSBvdXQgdGhyb3VnaCBh IHNpbmdsZSAiKGNvbCBXSVRIIE9QVElPTlMgLi4uKSIgbGlzdC4KK0NSRUFURSBUWVBFIHR5cGVk X3QgQVMgKGEgaW50LCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIHR5cGVkX3BsYWluIE9GIHR5cGVk X3Q7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3R5cGVkX3BsYWluJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgdHlwZWRfb3ZlciBPRiB0eXBl ZF90ICgKKyAgICBhIFdJVEggT1BUSU9OUyBERUZBVUxUIDcgTk9UIE5VTEwsCisgICAgYiBXSVRI IE9QVElPTlMgTk9UIE5VTEwsCisgICAgQ09OU1RSQUlOVCBiX25vbmVtcHR5IENIRUNLIChsZW5n dGgoYikgPiAwKQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndHlwZWRfb3Zl cic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gVGVtcG9yYXJ5IHRhYmxlcyAr IE9OIENPTU1JVC4gIFRlbXAgdGFibGVzIGxpdmUgaW4gYSBzZXNzaW9uLWxvY2FsCistLSBuYW1l c3BhY2Ugd2hvc2UgbmFtZSB2YXJpZXMgYmV0d2VlbiBydW5zLCBzbyB3ZSBzdHJpcCB0aGUgc2No ZW1hCistLSBwcmVmaXguICBPTiBDT01NSVQgRFJPUCBvbmx5IGZpcmVzIGF0IGNvbW1pdCwgc28g dGhlIHF1ZXJpZXMgdGhhdAorLS0gbmVlZCB0byBzZWUgdGhlIGNhdGFsb2cgZW50cnkgbXVzdCBy dW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKy0tIHRoZSBDUkVBVEUuCitCRUdJTjsKK0NS RUFURSBURU1QIFRBQkxFIHRlbXBfZGVmYXVsdCAoaWQgaW50KTsKK0NSRUFURSBURU1QIFRBQkxF IHRlbXBfZGVsZXRlIChpZCBpbnQpIE9OIENPTU1JVCBERUxFVEUgUk9XUzsKK0NSRUFURSBURU1Q IFRBQkxFIHRlbXBfZHJvcCAoaWQgaW50KSBPTiBDT01NSVQgRFJPUDsKKworU0VMRUNUIHJlZ2V4 cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBs aW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVmYXVsdCc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnKSBBUyBsaW5lCitXSEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKKworU0VM RUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVt cC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVsZXRlJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUn OworCitTRUxFQ1QgcmVnZXhwX3JlcGxhY2UobGluZSwgJyI/cGdfdGVtcF8/WzAtOV0rIj9cLics ICdwZ190ZW1wLicpIEFTIGxpbmUKK0ZST00gcGdfZ2V0X3RhYmxlX2RkbCgndGVtcF9kcm9wJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JF QVRFICUnOworUk9MTEJBQ0s7CisKKy0tIFByZXR0eSBtb2RlLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLCAncHJldHR5 JywgJ3RydWUnKTsKKworLS0gaW5jbHVkZXNfKiBnYXRpbmc6IGVhY2ggc3ViLW9iamVjdCBjYXRl Z29yeSBjYW4gYmUgc3VwcHJlc3NlZCBpbmRpdmlkdWFsbHkuCistLSBpbmNsdWRlc19pbmRleGVz PWZhbHNlIGhpZGVzIHRoZSBDUkVBVEUgSU5ERVggc3RhdGVtZW50cy4KK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgnaWR4ZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19pbmRleGVzJywgJ2ZhbHNlJyk7 CisKKy0tIGluY2x1ZGVzX2NvbnN0cmFpbnRzPWZhbHNlIGhpZGVzIGJvdGggaW5saW5lIENIRUNL IGluIENSRUFURSBUQUJMRSBhbmQKKy0tIHRoZSBBTFRFUiBUQUJMRSAuLi4gQUREIENPTlNUUkFJ TlQgbGluZXMuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5j bHVkZXNfY29uc3RyYWludHMnLCAnZmFsc2UnKTsKKworLS0gaW5jbHVkZXNfcnVsZXM9ZmFsc2Ug aGlkZXMgdGhlIENSRUFURSBSVUxFLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdy dCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICdpbmNsdWRlc19ydWxlcycsICdmYWxzZScpOworCistLSBpbmNsdWRlc19zdGF0aXN0 aWNzPWZhbHNlIGhpZGVzIHRoZSBDUkVBVEUgU1RBVElTVElDUy4KK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgnc3R4Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX3N0YXRpc3RpY3MnLCAnZmFsc2UnKTsK KworLS0gaW5jbHVkZXNfcmxzPWZhbHNlIGhpZGVzIHRoZSBFTkFCTEUvRk9SQ0UgUk9XIExFVkVM IFNFQ1VSSVRZIHRvZ2dsZXMuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Jscyc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdpbmNsdWRlc19ybHMnLCAnZmFsc2UnKTsKKworLS0gaW5jbHVkZXNfcmVwbGljYV9pZGVu dGl0eT1mYWxzZSBoaWRlcyB0aGUgUkVQTElDQSBJREVOVElUWSBjbGF1c2UuCitTRUxFQ1QgKiBG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ3JpX2Z1bGwnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcmVwbGljYV9pZGVu dGl0eScsICdmYWxzZScpOworCistLSBpbmNsdWRlc19wYXJ0aXRpb246IGRlZmF1bHQgaXMgZmFs c2UsIHNvIHRoZSBwYXJ0aXRpb25lZC10YWJsZSBwYXJlbnQKKy0tIERETCBvbiBpdHMgb3duIGRv ZXMgbm90IGluY2x1ZGUgaXRzIGNoaWxkcmVuLiAgU2V0dGluZyBpdCB0byB0cnVlCistLSBhcHBl bmRzIHRoZSBjaGlsZHJlbidzIERETCBhZnRlciB0aGUgcGFyZW50LgorU0VMRUNUICogRlJPTSBw Z19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2UnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcGFydGl0aW9uJywg J3RydWUnKTsKKworLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSBzdHJpcHMgdGhlIHNjaGVtYSBm cm9tIHRoZSB0YXJnZXQgdGFibGUgaXRzZWxmCistLSBhbmQgZnJvbSBzYW1lLXNjaGVtYSBzaWJs aW5nIHJlZmVyZW5jZXMgKGluaGVyaXRhbmNlL3BhcnRpdGlvbgorLS0gcGFyZW50cywgaWRlbnRp dHkgc2VxdWVuY2VzIGluIHRoZSBzYW1lIHNjaGVtYSksIHdoaWxlIGNyb3NzLXNjaGVtYQorLS0g cmVmZXJlbmNlcyBhcmUga2VwdCBxdWFsaWZpZWQgZm9yIGNvcnJlY3RuZXNzLgorLS0KKy0tIEJh cmUgQ1JFQVRFIFRBQkxFIGZvciBhbiBvcmRpbmFyeSB0YWJsZS4KK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor CistLSBJTkhFUklUUyBwYXJlbnQgaW4gdGhlIHNhbWUgc2NoZW1hIGlzIGVtaXR0ZWQgdW5xdWFs aWZpZWQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NoJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9x dWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gUGFydGl0aW9uIHBhcmVudCBpbiB0aGUgc2FtZSBz Y2hlbWEgaXMgZW1pdHRlZCB1bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncGFydGVkX3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor CistLSBDcm9zcy1zY2hlbWEgRksgdGFyZ2V0IGtlZXBzIHF1YWxpZmljYXRpb24uICBUaGUgJ3Jl ZmQnIHRhYmxlIGlzIGluCistLSBwZ3RibF9kZGxfdGVzdDsgcGxhY2UgYW4gRksgdGFyZ2V0IGlu IGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgdmVyaWZ5IGl0CistLSBzdGF5cyBxdWFsaWZpZWQgZXZl biB3aXRoIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2UuCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9v dGhlcjsKK0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfb3RoZXIucGFyZW50IChpZCBpbnQgUFJJTUFS WSBLRVkpOworQ1JFQVRFIFRBQkxFIHhzY2hlbWFfZmsgKAorICAgIGlkICBpbnQgUFJJTUFSWSBL RVksCisgICAgcGlkIGludCBSRUZFUkVOQ0VTIHBndGJsX2RkbF9vdGhlci5wYXJlbnQKKyk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3hzY2hlbWFfZmsnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1 YWxpZmllZCcsICdmYWxzZScpOworCistLSBJZGVudGl0eSBjb2x1bW4gd2l0aCBhIGN1c3RvbSBz ZXF1ZW5jZSBuYW1lIGluIHRoZSBzYW1lIHNjaGVtYSBpcworLS0gZW1pdHRlZCB1bnF1YWxpZmll ZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY3VzdG9tJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVt YV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gUm91bmQtdHJpcDogd2l0aCBzY2hlbWFfcXVh bGlmaWVkPWZhbHNlLCBhZnRlciBTRVQgc2VhcmNoX3BhdGggdGhlCistLSBEREwgY2FuIGJlIHJl cGxheWVkIGludG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHNjaGVtYS4KK0NSRUFURSBTQ0hFTUEgcGd0 YmxfZGRsX3JlcGxheTsKK0RPICQkCitERUNMQVJFCisgICAgc3RtdCB0ZXh0OworQkVHSU4KKyAg ICBTRVQgTE9DQUwgc2VhcmNoX3BhdGggPSBwZ3RibF9kZGxfcmVwbGF5OworICAgIEZPUiBzdG10 IElOCisgICAgICAgIFNFTEVDVCBsaW5lIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGd0YmxfZGRs X3Rlc3QuYmFzaWMnOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpIEFTIGxpbmUKKyAgICBM T09QCisgICAgICAgIEVYRUNVVEUgc3RtdDsKKyAgICBFTkQgTE9PUDsKK0VORCAkJDsKK1NFTEVD VCByZWxuYW1lc3BhY2U6OnJlZ25hbWVzcGFjZTo6dGV4dCwgcmVsbmFtZQorRlJPTSBwZ19jbGFz cyBXSEVSRSBvaWQgPSAncGd0YmxfZGRsX3JlcGxheS5iYXNpYyc6OnJlZ2NsYXNzOworRFJPUCBT Q0hFTUEgcGd0YmxfZGRsX3JlcGxheSBDQVNDQURFOworRFJPUCBUQUJMRSB4c2NoZW1hX2ZrOwor RFJPUCBTQ0hFTUEgcGd0YmxfZGRsX290aGVyIENBU0NBREU7CisKKy0tIExvY2FsbHktZGVjbGFy ZWQgQ0hFQ0sgb24gYSBwYXJ0aXRpb24gY2hpbGQgaGFzIG5vIGlubGluZSBjb2x1bW4KKy0tIGxp c3QgdG8gbGl2ZSBpbiAoUEFSVElUSU9OIE9GIGZvcm0pLCBzbyBpdCBtdXN0IGNvbWUgb3V0IGFz IGEKKy0tIHNlcGFyYXRlIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBzdGF0ZW1lbnQu CitDUkVBVEUgVEFCTEUgcGFydGVkX2NoayAoaWQgaW50LCB2YWwgaW50KSBQQVJUSVRJT04gQlkg UkFOR0UgKGlkKTsKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfY2hrX2NoaWxkIFBBUlRJVElPTiBPRiBw YXJ0ZWRfY2hrCisgICAgKENPTlNUUkFJTlQgY2hrX2lubGluZSBDSEVDSyAodmFsID4gMCkpCisg ICAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgncGFydGVkX2Noa19jaGlsZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK K0RST1AgVEFCTEUgcGFydGVkX2NoazsKKworLS0gSW5oZXJpdGFuY2UgY2hpbGRyZW4gb2YgYSBw YXJlbnQgd2l0aCBhIGdlbmVyYXRlZCBjb2x1bW4gc2hvdWxkIG5vdAorLS0gZW1pdCBhbiBBTFRF UiBDT0xVTU4gLi4uIFNFVCBERUZBVUxUIGZvciB0aGUgaW5oZXJpdGVkIGdlbmVyYXRlZAorLS0g Y29sdW1uOiB0aGUgR0VORVJBVEVEIGV4cHJlc3Npb24gY2FycmllcyBkb3duIHRocm91Z2ggaW5o ZXJpdGFuY2UsCistLSBhbmQgU0VUIERFRkFVTFQgd291bGQgZmFpbCBhdCByZXBsYXkgYWdhaW5z dCBhIGdlbmVyYXRlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgcGFyX2dlbiAoCisgICAgaWQgaW50 LAorICAgIGcgIGludCBHRU5FUkFURUQgQUxXQVlTIEFTIChpZCAqIDIpIFNUT1JFRAorKTsKK0NS RUFURSBUQUJMRSBjaF9nZW4gKCkgSU5IRVJJVFMgKHBhcl9nZW4pOworU0VMRUNUICogRlJPTSBw Z19nZXRfdGFibGVfZGRsKCdjaF9nZW4nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CitE Uk9QIFRBQkxFIHBhcl9nZW4gQ0FTQ0FERTsKKworLS0gVXNlci1uYW1lZCBOT1QgTlVMTCBjb25z dHJhaW50IG11c3QgYmUgZW1pdHRlZCBpbmxpbmUgYXMKKy0tICJDT05TVFJBSU5UIG5hbWUgTk9U IE5VTEwiIHNvIGEgcmVwbGF5IGRvZXMgbm90IGNvbGxpZGUgd2l0aCB0aGUKKy0tIGF1dG8tbmFt ZWQgTk9UIE5VTEwgdGhhdCBQb3N0Z3JlU1FMIHdvdWxkIG90aGVyd2lzZSBjcmVhdGUgZnJvbSBh CistLSBwbGFpbiBpbmxpbmUgIk5PVCBOVUxMIi4gIFRoZSBjb25zdHJhaW50IGxvb3Agc2tpcHMg dGhlIHVzZXItbmFtZWQKKy0tIGVudHJ5IHRvIGF2b2lkIGRvdWJsZS1lbWlzc2lvbi4KK0NSRUFU RSBUQUJMRSBubl9uYW1lZCAoCisgICAgYSBpbnQgQ09OU1RSQUlOVCBteV9ubiBOT1QgTlVMTCwK KyAgICBiIGludCBOT1QgTlVMTAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn bm5fbmFtZWQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CitEUk9QIFRBQkxFIG5uX25h bWVkOworCistLSBFcnJvcjogbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlLgor 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== --0000000000008b931b0653ce5488--