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 1wPMKc-000gDs-28 for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 15:26:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPMKa-004jrT-1i for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 15:26:05 +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 1wPMKZ-004jrL-2I for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 15:26:05 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wPMKT-00000000LZO-2wLu for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 15:26:03 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1779204354; bh=nDpWvapSACAJLrSSHYAast2wHwUEvw7lw0zVxZfQchY=; h=Date:From:To:Cc:Subject:In-Reply-To:References:Message-ID:From; b=7Uw81/0JQScbcXXJHrrcJGK5rKo+YdRsHBdmqApwvxjE8mM1NCZ2h3TY+XH2OYcLE BRQbL+yHOgBSWybd4PcsUO+p64diy1ygf+ZBPRHhuoZBC4u/0ihWXkZNgqFC/eiyJN UkGRteZp/MKCOiG7Ei1D6aLWRi8fXlDTSRNoy6UAMmnOinEoPH1HWIuMky6nmSDIwD 7YHH/cqMmGKISNlFS/XicaSRBaTEOqXQBhYt+QiO3DtirmSYnDhQigY41hdcoPPBOz QUZomxQFStP26xLrYVXUYGEjv382iw63CIuWcp7yeBdayOzJqtaU1g5DMX36thuhvR SyN7bJCryNIvg== Received: from mail.l.postgrespro.ru (webmail-slave-mstn.l.postgrespro.ru [192.168.2.28]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.pyhalov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id C665F60BF7; Tue, 19 May 2026 18:25:54 +0300 (MSK) MIME-Version: 1.0 Date: Tue, 19 May 2026 18:25:54 +0300 From: Alexander Pyhalov To: Alexander Korotkov Cc: solaimurugan vellaipandiyan , =?UTF-8?Q?=C3=81lvaro_Herrera?= , g.kashkin@postgrespro.ru, Ashutosh Bapat , PostgreSQL Hackers Subject: Re: Function scan FDW pushdown In-Reply-To: References: <202508051955.sao7ucalcce7@alvherre.pgsql> <7e2abeb3ea9bc7ca024f4e457dce33f5@postgrespro.ru> Message-ID: X-Sender: a.pyhalov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_bfa75c4dcc388950701962bdfbdb0b65" X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 3.0.0.9059, bases: 2026/05/19 13:46:00 #28202262 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_bfa75c4dcc388950701962bdfbdb0b65 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Alexander Korotkov писал(а) 2026-05-19 16:00: > Hi, Alexander. > > On Mon, May 18, 2026 at 11:06 PM Alexander Pyhalov > wrote: >> Hi. I am a bit confused about this comment (and code): >> >> /* >> * DirectModify on a foreign join: pass NIL/0 >> for >> the function >> * metadata. We don't currently push function >> RTEs through the >> * direct-modify path, so there are no >> whole-row >> Vars pointing at >> * function-RTE tuples to reconstruct. >> */ >> tupdesc = >> get_tupdesc_for_join_scan_tuples(node, >> NIL, 0); >> >> We evidently go through this code path when executing example >> >> UPDATE remote_tbl r SET b=5 FROM UNNEST(array[box '((2,3),(-2,-3))']) >> AS >> t (bx) WHERE r.a = area(t.bx) >> RETURNING a,b; >> >> But don't need whole row var in returning list.... However, we still >> can >> step on this issue. > > Yes, we go through this code path, and it works as long as whole-row > var is not needed. > >> UPDATE remote_tbl r SET b=5 FROM UNNEST(array[box '((2,3),(-2,-3))'], >> array[int '1']) AS t (bx, i) WHERE r.a = area(t.bx) >> RETURNING a,b,t; >> >> ERROR: input of anonymous composite types is not implemented >> CONTEXT: whole-row reference to foreign table "t" > > But if whole row var is actually used, then the assumption is broken. > So, we need to build a whole-row var anyway. I've fixed this in the > attached patch, and added your sample query as a regression test case. > Good evening. Found one more issue in whole row var deparsing. It can appear on a nullable outer side, and we should use the same logic as when deparsing table column reference. Otherwise we get records from nulls instead of nulls (for example, "(NULL, NULL)" instead of NULL). Also I wonder if it is possible for get_tupdesc_for_join_scan_tuples() to get NULL rtfuncdata when it looks at RTE_FUNCTION RTE here: 1759 else if (rte->rtekind == RTE_FUNCTION && rtfuncdata != NIL) 1760 { 1761 /* 1762 * A whole-row Var points at a FUNCTION RTE absorbed into the 1763 * foreign join. Synthesize an anonymous composite TupleDesc from 1764 * the per-function return-type metadata we saved at plan time; 1765 * the deparser emits these as ROW(f.c1, f.c2, ...). 1766 */ 1767 List *funcdata; 1768 TupleDesc rte_tupdesc; 1769 int num_funcs; 1770 int attnum; 1771 ListCell *lc1, ? -- Best regards, Alexander Pyhalov, Postgres Professional --=_bfa75c4dcc388950701962bdfbdb0b65 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v7-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch Content-Disposition: attachment; filename=v7-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch; size=60126 RnJvbSAyYjc4ZGVjYWUxYzBkMzMzY2EwNGJkMTM5NDAxMmY0M2NiMTRhZWEzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogVHVlLCAxOSBNYXkgMjAyNiAxNjoyODoyMiArMDMwMApTdWJqZWN0OiBb UEFUQ0hdIHBvc3RncmVzX2ZkdzogcHVzaCBkb3duIEZVTkNUSU9OIFJURSBpbnRvIGZvcmVpZ24g am9pbnMKCkEgZm9yZWlnbiBqb2luIHBsYW5uaW5nIGhvb2sgbm93IGNvbnNpZGVycyBhIChmb3Jl aWduLXRhYmxlIHggZnVuY3Rpb24tUlRFKQpJTk5FUiBqb2luIGFzIGEgcHVzaC1kb3duIGNhbmRp ZGF0ZSB3aGVuIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGlzCklNTVVUQUJMRSBhbmQgb3RoZXJ3 aXNlIHNoaXBwYWJsZS4gIFRoZSByZW1vdGUgcXVlcnkgYWJzb3JicyB0aGUgZnVuY3Rpb24KY2Fs bCBhcyBhIEZST00tbGlzdCBpdGVtIChlLmcuIHVubmVzdCguLi4pIEFTIGY8cnRpPihjMSwgYzIs IC4uLikpLCBzbyB0aGUKZm9yZWlnbiBzaWRlIHJldHVybnMgb25seSByb3dzIHRoYXQgbWF0Y2gg dGhlIGZ1bmN0aW9uLXByb2R1Y2VkIHNldCBhbmQgdGhlCmpvaW4gZXhlY3V0ZXMgZW50aXJlbHkg b24gdGhlIHJlbW90ZS4KCkFuIElNTVVUQUJMRSBmdW5jdGlvbiBnaXZlcyB0aGUgc2FtZSByZXN1 bHQgb24gYW55IHNlcnZlciwgc28gdGhlIHNhbWUKZnVuY3Rpb24gUlRFIGNhbiBiZSBhIHB1c2gt ZG93biBjYW5kaWRhdGUgZm9yIHNldmVyYWwgZGlzdGluY3QgZm9yZWlnbgpzZXJ2ZXJzIHdpdGhv dXQgc2VtYW50aWMgcmlzay4gIFRvIGtlZXAgdGhlIHBsYW5uZXIgc3RhdGUgY29uc2lzdGVudAph Y3Jvc3MgdGhvc2UgaW5kZXBlbmRlbnQgYXR0ZW1wdHMsIHRoZSBwZXItY2FsbCBzdHViIGZwaW5m byBmb3IgdGhlCmZ1bmN0aW9uIHNpZGUgbGl2ZXMgb24gdGhlIGpvaW5yZWwncyBQZ0Zkd1JlbGF0 aW9uSW5mbyAobmV3Cm91dGVyX2Z1bmNfZnBpbmZvIC8gaW5uZXJfZnVuY19mcGluZm8pLCBuZXZl ciBvbiB0aGUgZnVuY3Rpb24gcmVsIGl0c2VsZiwKYW5kIHRoZSBmdW5jdGlvbiBzaWRlIGlzIGRl dGVjdGVkIHZpYSBydGVraW5kIHJhdGhlciB0aGFuIGZkd19wcml2YXRlLgoKc2V0X2ZvcmVpZ25f cmVsX3Byb3BlcnRpZXMoKSBwcm9wYWdhdGVzIGZkd3JvdXRpbmUgb250byBhIGpvaW5yZWwgdGhh dApwYWlycyBhIGZvcmVpZ24gcmVsIHdpdGggYW4gUlRFX0ZVTkNUSU9OIHJlbCBzbyBHZXRGb3Jl aWduSm9pblBhdGhzIGdldHMKY2FsbGVkOyB0aGUgRkRXIHJldGFpbnMgZnVsbCBjb250cm9sIG92 ZXIgd2hldGhlciB0byBhY3R1YWxseSBnZW5lcmF0ZSBhCnBhdGguICBkZXBhcnNlUmFuZ2VUYmxS ZWYgYW5kIGRlcGFyc2VDb2x1bW5SZWYgZ2FpbiBhIEZVTkNUSU9OLVJURSBicmFuY2gKdGhhdCBl bWl0cyB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBhbmQgcmVzb2x2ZXMgVmFycyB0byB0aGUgZ2Vu ZXJhdGVkCmNvbHVtbiBhbGlhc2VzLgotLS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2Uu YyAgICAgICAgICAgICAgICB8IDEzMiArKysrLQogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9w b3N0Z3Jlc19mZHcub3V0ICAgIHwgNDQxICsrKysrKysrKysrKysrKysrCiBjb250cmliL3Bvc3Rn cmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyAgICAgICAgICAgfCA0NTUgKysrKysrKysrKysrKysrKyst CiBjb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCAgICAgICAgICAgfCAgMTAgKwog Y29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgICAgIHwgMTgzICsrKysr KysKIHNyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYyAgICAgICAgICB8ICAyNCAr CiA2IGZpbGVzIGNoYW5nZWQsIDEyMjEgaW5zZXJ0aW9ucygrKSwgMjQgZGVsZXRpb25zKC0pCgpk aWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jIGIvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZGVwYXJzZS5jCmluZGV4IDJkY2M2YzhhZjFiLi41NTY3ZmRiOGVkOSAxMDA2NDQK LS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCisrKyBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L2RlcGFyc2UuYwpAQCAtMTEyLDYgKzExMiw3IEBAIHR5cGVkZWYgc3RydWN0IGRlcGFy c2VfZXhwcl9jeHQKIAkJYXBwZW5kU3RyaW5nSW5mbygoYnVmKSwgIiVzJWQuIiwgUkVMX0FMSUFT X1BSRUZJWCwgKHZhcm5vKSkKICNkZWZpbmUgU1VCUVVFUllfUkVMX0FMSUFTX1BSRUZJWAkicyIK ICNkZWZpbmUgU1VCUVVFUllfQ09MX0FMSUFTX1BSRUZJWAkiYyIKKyNkZWZpbmUgRlVOQ1RJT05f UkVMX0FMSUFTX1BSRUZJWAkiZiIKIAogLyoKICAqIEZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgd2hl dGhlciBhbiBleHByZXNzaW9uIGNhbiBiZSBldmFsdWF0ZWQgc2FmZWx5IG9uCkBAIC0yMDMwLDYg KzIwMzEsNzIgQEAgZGVwYXJzZUZyb21FeHByRm9yUmVsKFN0cmluZ0luZm8gYnVmLCBQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqZm9yZWlnbnJlbCwKIAl9CiB9CiAKKy8qCisgKiBEZXBh cnNlIGEgRlVOQ1RJT04gUlRFIGFic29yYmVkIGludG8gYSBmb3JlaWduIGpvaW4uICBUaGUgZnVu Y3Rpb24gY2FsbChzKQorICogYXJlIGVtaXR0ZWQgYXMgYSBGUk9NLWxpc3QgaXRlbToKKyAqCisg KiAgIDxmdW5jZXhwcj4gQVMgZjxydGk+KGMxLCBjMiwgLi4uLCBjTikKKyAqCisgKiBGb3IgbXVs dGktZnVuY3Rpb24gUlRFcyAoU1FMIFJPV1MgRlJPTSAoZjEoKSwgZjIoKSwgLi4uKSksIGVhY2gK KyAqIGZ1bmN0aW9uIGNhbGwgYXBwZWFycyBjb21tYS1zZXBhcmF0ZWQgaW5zaWRlIFJPV1MgRlJP TSguLi4pLiAgQ29sdW1uCisgKiBhbGlhc2VzIGMxLi5jTiBjb3ZlciB0aGUgdW5pb24gb2YgZXZl cnkgZnVuY3Rpb24ncyBjb2x1bW5zLCBpbiB0aGUKKyAqIG9yZGVyIHRoZXkgYXBwZWFyOyB0aGF0 IG1hdGNoZXMgdGhlIGNvbHVtbiBvcmRlcmluZyBvZiB0aGUgUlRFLgorICovCitzdGF0aWMgdm9p ZAorZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxSZWYoU3RyaW5nSW5mbyBidWYsIFBsYW5uZXJJbmZv ICpyb290LAorCQkJCQkJICAgUmVsT3B0SW5mbyAqZm9yZWlnbnJlbCwgUmVsT3B0SW5mbyAqc2Nh bnJlbCwKKwkJCQkJCSAgIExpc3QgKipwYXJhbXNfbGlzdCkKK3sKKwlSYW5nZVRibEVudHJ5ICpy dGUgPSBwbGFubmVyX3J0X2ZldGNoKGZvcmVpZ25yZWwtPnJlbGlkLCByb290KTsKKwlkZXBhcnNl X2V4cHJfY3h0IGNvbnRleHQ7CisJTGlzdENlbGwgICAqbGM7CisJYm9vbAkJbXVsdGlfZnVuYzsK KwlpbnQJCQl0b3RhbF9jb2xzID0gMDsKKwlpbnQJCQlpOworCisJQXNzZXJ0KHJ0ZS0+cnRla2lu ZCA9PSBSVEVfRlVOQ1RJT04pOworCUFzc2VydCghcnRlLT5mdW5jb3JkaW5hbGl0eSk7CisJQXNz ZXJ0KGxpc3RfbGVuZ3RoKHJ0ZS0+ZnVuY3Rpb25zKSA+PSAxKTsKKworCW11bHRpX2Z1bmMgPSBs aXN0X2xlbmd0aChydGUtPmZ1bmN0aW9ucykgPiAxOworCisJY29udGV4dC5idWYgPSBidWY7CisJ Y29udGV4dC5yb290ID0gcm9vdDsKKwljb250ZXh0LmZvcmVpZ25yZWwgPSBzY2FucmVsOworCWNv bnRleHQuc2NhbnJlbCA9IHNjYW5yZWw7CisJY29udGV4dC5wYXJhbXNfbGlzdCA9IHBhcmFtc19s aXN0OworCisJaWYgKG11bHRpX2Z1bmMpCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAi Uk9XUyBGUk9NICgiKTsKKworCWZvcmVhY2gobGMsIHJ0ZS0+ZnVuY3Rpb25zKQorCXsKKwkJUmFu Z2VUYmxGdW5jdGlvbiAqcnRmdW5jID0gKFJhbmdlVGJsRnVuY3Rpb24gKikgbGZpcnN0KGxjKTsK KworCQlpZiAoZm9yZWFjaF9jdXJyZW50X2luZGV4KGxjKSA+IDApCisJCQlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKGJ1ZiwgIiwgIik7CisJCWRlcGFyc2VFeHByKChFeHByICopIHJ0ZnVuYy0+ZnVu Y2V4cHIsICZjb250ZXh0KTsKKwkJdG90YWxfY29scyArPSBydGZ1bmMtPmZ1bmNjb2xjb3VudDsK Kwl9CisKKwlpZiAobXVsdGlfZnVuYykKKwkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScp OworCisJLyogQWxpYXMgKyBnZW5lcmF0ZWQgY29sdW1uLW5hbWUgbGlzdC4gKi8KKwlhcHBlbmRT dHJpbmdJbmZvKGJ1ZiwgIiAlcyVkIiwgRlVOQ1RJT05fUkVMX0FMSUFTX1BSRUZJWCwgZm9yZWln bnJlbC0+cmVsaWQpOworCWlmICh0b3RhbF9jb2xzID4gMCkKKwl7CisJCWFwcGVuZFN0cmluZ0lu Zm9DaGFyKGJ1ZiwgJygnKTsKKwkJZm9yIChpID0gMTsgaSA8PSB0b3RhbF9jb2xzOyBpKyspCisJ CXsKKwkJCWlmIChpID4gMSkKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwgIik7 CisJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiVzJWQiLCBTVUJRVUVSWV9DT0xfQUxJQVNfUFJF RklYLCBpKTsKKwkJfQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisJfQorfQor CiAvKgogICogQXBwZW5kIEZST00gY2xhdXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gcmVsYXRpb24g aW50byBidWYuCiAgKiBDb25kaXRpb25zIGZyb20gbG93ZXItbGV2ZWwgU0VNSS1KT0lOcyBhcmUg YXBwZW5kZWQgdG8gYWRkaXRpb25hbF9jb25kcwpAQCAtMjA0MCw3ICsyMTA3LDIyIEBAIGRlcGFy c2VSYW5nZVRibFJlZihTdHJpbmdJbmZvIGJ1ZiwgUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKmZvcmVpZ25yZWwsCiAJCQkJICAgYm9vbCBtYWtlX3N1YnF1ZXJ5LCBJbmRleCBpZ25vcmVf cmVsLCBMaXN0ICoqaWdub3JlX2NvbmRzLAogCQkJCSAgIExpc3QgKiphZGRpdGlvbmFsX2NvbmRz LCBMaXN0ICoqcGFyYW1zX2xpc3QpCiB7Ci0JUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mbyA9IChQ Z0Zkd1JlbGF0aW9uSW5mbyAqKSBmb3JlaWducmVsLT5mZHdfcHJpdmF0ZTsKKwlQZ0Zkd1JlbGF0 aW9uSW5mbyAqZnBpbmZvOworCisJLyoKKwkgKiBGb3IgYSBmdW5jdGlvbiBSVEUgYWJzb3JiZWQg aW50byBhIGZvcmVpZ24gam9pbiwgZGVwYXJzZSB0aGUgZnVuY3Rpb24KKwkgKiBleHByZXNzaW9u IGFzIGEgRlJPTS1saXN0IGl0ZW0gYW5kIHJldHVybi4gIFRoZSBzdHViIGZwaW5mbyBzZXQgdXAg YnkKKwkgKiBmb3JlaWduX2pvaW5fb2soKSBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50IGhlcmUu CisJICovCisJaWYgKGZvcmVpZ25yZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsKKwkJ QXNzZXJ0KCFtYWtlX3N1YnF1ZXJ5KTsKKwkJZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxSZWYoYnVm LCByb290LCBmb3JlaWducmVsLCBmb3JlaWducmVsLAorCQkJCQkJCQkgICBwYXJhbXNfbGlzdCk7 CisJCXJldHVybjsKKwl9CisKKwlmcGluZm8gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgZm9yZWln bnJlbC0+ZmR3X3ByaXZhdGU7CiAKIAkvKiBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlc2Ug Y2FzZXMuICovCiAJQXNzZXJ0KElTX1NJTVBMRV9SRUwoZm9yZWlnbnJlbCkgfHwgSVNfSk9JTl9S RUwoZm9yZWlnbnJlbCkpOwpAQCAtMjcxMiw2ICsyNzk0LDU0IEBAIHN0YXRpYyB2b2lkCiBkZXBh cnNlQ29sdW1uUmVmKFN0cmluZ0luZm8gYnVmLCBpbnQgdmFybm8sIGludCB2YXJhdHRubywgUmFu Z2VUYmxFbnRyeSAqcnRlLAogCQkJCSBib29sIHF1YWxpZnlfY29sKQogeworCS8qCisJICogRnVu Y3Rpb24gUlRFIGNvbHVtbnM6IGVtaXQgYXMgZjx2YXJubz4uYzx2YXJhdHRubz4sIG1hdGNoaW5n IHRoZQorCSAqIGFsaWFzZXMgZ2VuZXJhdGVkIGJ5IGRlcGFyc2VGdW5jdGlvblJhbmdlVGJsUmVm KCkuICBBIHdob2xlLXJvdyBWYXIKKwkgKiAodmFyYXR0bm8gPT0gMCkgaXMgcmVuZGVyZWQgYXMg Uk9XKGY8dmFybm8+LmMxLCAuLi4sIGY8dmFybm8+LmM8Tj4pCisJICogd2hlcmUgTiBpcyB0aGUg dG90YWwgY29sdW1uIGNvdW50IG9mIHRoZSBmdW5jdGlvbiBSVEUgKGluY2x1ZGluZyBhbGwKKwkg KiBST1dTIEZST00gKC4uLikgbWVtYmVycykuICBTeXN0ZW0gYXR0cmlidXRlcyBzdWNoIGFzIGN0 aWQgaGF2ZSBubworCSAqIG1lYW5pbmcgZm9yIGZ1bmN0aW9uIFJURXMgYW5kIGFyZSByZWplY3Rl ZC4KKwkgKi8KKwlpZiAocnRlLT5ydGVraW5kID09IFJURV9GVU5DVElPTikKKwl7CisJCWlmICh2 YXJhdHRubyA9PSAwKQorCQl7CisJCQlpbnQJCQluY29scyA9IGxpc3RfbGVuZ3RoKHJ0ZS0+ZXJl Zi0+Y29sbmFtZXMpOworCQkJaW50CQkJaTsKKworCQkJaWYgKHF1YWxpZnlfY29sKQorCQkJewor CQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiQ0FTRSBXSEVOICgiKTsKKwkJCQlhcHBl bmRTdHJpbmdJbmZvKGJ1ZiwgIiVzJWQuIiwgRlVOQ1RJT05fUkVMX0FMSUFTX1BSRUZJWCwgdmFy bm8pOworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiKik6OnRleHQgSVMgTk9UIE5V TEwgVEhFTiAiKTsKKwkJCX0KKworCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJST1co Iik7CisJCQlmb3IgKGkgPSAxOyBpIDw9IG5jb2xzOyBpKyspCisJCQl7CisJCQkJaWYgKGkgPiAx KQorCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwgIik7CisJCQkJYXBwZW5kU3Ry aW5nSW5mbyhidWYsICIlcyVkLiVzJWQiLAorCQkJCQkJCQkgRlVOQ1RJT05fUkVMX0FMSUFTX1BS RUZJWCwgdmFybm8sCisJCQkJCQkJCSBTVUJRVUVSWV9DT0xfQUxJQVNfUFJFRklYLCBpKTsKKwkJ CX0KKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKworCQkJaWYgKHF1YWxpZnlf Y29sKQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIEVORCIpOworCQkJcmV0dXJu OworCQl9CisKKwkJaWYgKHZhcmF0dG5vIDwgMCkKKwkJCWVsb2coRVJST1IsCisJCQkJICJzeXN0 ZW0gYXR0cmlidXRlIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIFJURSBpcyBub3Qgc3VwcG9ydGVk IGluIGZvcmVpZ24gam9pbiBwdXNoZG93biIpOworCisJCWlmIChxdWFsaWZ5X2NvbCkKKwkJCWFw cGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZC4iLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklYLCB2 YXJubyk7CisJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9BTElB U19QUkVGSVgsIHZhcmF0dG5vKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIFdlIHN1cHBvcnQgZmV0 Y2hpbmcgdGhlIHJlbW90ZSBzaWRlJ3MgQ1RJRCBhbmQgT0lELiAqLwogCWlmICh2YXJhdHRubyA9 PSBTZWxmSXRlbVBvaW50ZXJBdHRyaWJ1dGVOdW1iZXIpCiAJewpkaWZmIC0tZ2l0IGEvY29udHJp Yi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggYWFmZmNmMzEyNzEuLmMyMWQw ODc2ZDM5IDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jl c19mZHcub3V0CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zk dy5vdXQKQEAgLTI4ODUsNiArMjg4NSw0NDcgQEAgU0VMRUNUIHQxLmMxLCB0Mi5jMiBGUk9NIHY0 IHQxIExFRlQgSk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZIHQxLmMKICgx MCByb3dzKQogCiBBTFRFUiBWSUVXIHY0IE9XTkVSIFRPIHJlZ3Jlc3Nfdmlld19vd25lcjsKKy0t ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKy0tIEZvcmVpZ24tam9pbiB3aXRoIEZVTkNUSU9OIFJURSBwdXNoZG93biAo SU1NVVRBQkxFIGZ1bmN0aW9ucyBvbmx5KQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gSU1NVVRBQkxFIGZ1 bmN0aW9uOiB1bm5lc3Qgb2YgY29uc3RhbnQgYXJyYXkgY2FuIGJlIHB1c2hlZCBkb3duCitFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQx LCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEu YzEgPSB1LmlkIE9SREVSIEJZIHQxLmMxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRwdXQ6IHQxLmMx LCB0MS5jMworICAgU29ydCBLZXk6IHQxLmMxCisgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAg ICBPdXRwdXQ6IHQxLmMxLCB0MS5jMworICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0MSB0 MSkgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBy MS4iQyAxIiwgcjEuYzMgRlJPTSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiB1bm5lc3QoJ3sx LDUsMTAsMTAwfSc6OmludGVnZXJbXSkgZjIoYzEpIE9OICgoKHIxLiJDIDEiID0gZjIuYzEpKSkp CisoNyByb3dzKQorCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQxLCB1bm5lc3QoQVJS QVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIE9S REVSIEJZIHQxLmMxOworIGMxICB8ICBjMyAgIAorLS0tLS0rLS0tLS0tLQorICAgMSB8IDAwMDAx CisgICA1IHwgMDAwMDUKKyAgMTAgfCAwMDAxMAorIDEwMCB8IDAwMTAwCisoNCByb3dzKQorCist LSBJTU1VVEFCTEUgZnVuY3Rpb246IGdlbmVyYXRlX3NlcmllcyB3aXRoIGNvbnN0YW50IGFyZ3MK K0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSBGUk9NIGZ0MSB0MSwg Z2VuZXJhdGVfc2VyaWVzKDEsIDQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQgT1JERVIg QlkgdDEuYzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRwdXQ6IHQx LmMxCisgICBTb3J0IEtleTogdDEuYzEKKyAgIC0+ICBGb3JlaWduIFNjYW4KKyAgICAgICAgIE91 dHB1dDogdDEuYzEKKyAgICAgICAgIFJlbGF0aW9uczogKHB1YmxpYy5mdDEgdDEpIElOTkVSIEpP SU4gKEZ1bmN0aW9uIGcpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgcjEuIkMgMSIgRlJP TSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgZjIoYzEp IE9OICgoKHIxLiJDIDEiID0gZjIuYzEpKSkpCisoNyByb3dzKQorCitTRUxFQ1QgdDEuYzEgRlJP TSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQorV0hFUkUgdDEuYzEgPSBn LmlkIE9SREVSIEJZIHQxLmMxOworIGMxIAorLS0tLQorICAxCisgIDIKKyAgMworICA0CisoNCBy b3dzKQorCistLSBWT0xBVElMRSBmdW5jdGlvbiAocmFuZG9tKSBtdXN0IE5PVCBiZSBwdXNoZWQg ZG93bgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxIEZST00gZnQx IHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20oKSAqIDApOjppbnQpIEFTIGcoaWQp CitXSEVSRSB0MS5jMSA9IGcuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9p bgorICAgT3V0cHV0OiB0MS5jMQorICAgSGFzaCBDb25kOiAoZy5pZCA9IHQxLmMxKQorICAgLT4g IEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMgZworICAgICAgICAg T3V0cHV0OiBnLmlkCisgICAgICAgICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwg KDQgKyAoKHJhbmRvbSgpICogJzAnOjpkb3VibGUgcHJlY2lzaW9uKSk6OmludGVnZXIpKQorICAg LT4gIEhhc2gKKyAgICAgICAgIE91dHB1dDogdDEuYzEKKyAgICAgICAgIC0+ICBGb3JlaWduIFNj YW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgICAgICAgT3V0cHV0OiB0MS5jMQorICAgICAg ICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZST00gIlMgMSIuIlQgMSIKKygxMSBy b3dzKQorCistLSBXSVRIIE9SRElOQUxJVFkgbXVzdCBOT1QgYmUgcHVzaGVkIGRvd24gKGxpbWl0 YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbikKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9G RikKK1NFTEVDVCB0MS5jMSwgdS5vcmQKK0ZST00gZnQxIHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwg MTBdOjppbnRbXSkgV0lUSCBPUkRJTkFMSVRZIEFTIHUoaWQsIG9yZCkKK1dIRVJFIHQxLmMxID0g dS5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgSGFzaCBKb2luCisgICBPdXRwdXQ6IHQxLmMxLCB1Lm9yZAorICAg SGFzaCBDb25kOiAodDEuYzEgPSB1LmlkKQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMu ZnQxIHQxCisgICAgICAgICBPdXRwdXQ6IHQxLmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxF Q1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAxIgorICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1dDog dS5vcmQsIHUuaWQKKyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cudW5u ZXN0IHUKKyAgICAgICAgICAgICAgIE91dHB1dDogdS5vcmQsIHUuaWQKKyAgICAgICAgICAgICAg IEZ1bmN0aW9uIENhbGw6IHVubmVzdCgnezEsNSwxMH0nOjppbnRlZ2VyW10pCisoMTEgcm93cykK KworLS0gU2FtZSBmdW5jdGlvbiBSVEUgam9pbmVkIHdpdGggdHdvIGRpZmZlcmVudCBmb3JlaWdu IHNlcnZlcnM6IHBsYW5uZXIgcGlja3MKKy0tIG9uZSBhYnNvcnB0aW9uICsgYSBsb2NhbCBqb2lu IHdpdGggdGhlIHNlY29uZCBmb3JlaWduIHNlcnZlci4gIFRoZSBmYWN0CistLSB0aGF0IHRoZSBm dW5jdGlvbiBpcyBJTU1VVEFCTEUgbWFrZXMgdGhpcyBzYWZlIGV2ZW4gaWYgYm90aCBzaWRlcyBj aG9zZSB0bworLS0gYWJzb3JiIGl0IGluZGVwZW5kZW50bHkuCitFWFBMQUlOIChWRVJCT1NFLCBD T1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5l c3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1 LmlkIEFORCB0Mi5jMSA9IHUuaWQgT1JERVIgQlkgdDEuYzE7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEpvaW4K KyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBNZXJnZSBDb25kOiAodDEuYzEgPSB1LmlkKQor ICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQxIHQxCisgICAgICAgICBPdXRwdXQ6IHQx LmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAxIiBP UkRFUiBCWSAiQyAxIiBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNvcnQKKyAgICAgICAgIE91dHB1 dDogdDIuYzEsIHUuaWQKKyAgICAgICAgIFNvcnQgS2V5OiB0Mi5jMQorICAgICAgICAgLT4gIEZv cmVpZ24gU2NhbgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMSwgdS5pZAorICAgICAgICAg ICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0NiB0MikgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdSkK KyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMi5jMSwgZjMuYzEgRlJPTSAoIlMg MSIuIlQgNCIgcjIgSU5ORVIgSk9JTiB1bm5lc3QoJ3sxLDUsMTAsMTAwfSc6OmludGVnZXJbXSkg ZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkpCisoMTMgcm93cykKKworLS0gQ29zdC1iYXNl ZCBzZWxlY3Rpb24gYmV0d2VlbiB0d28gZm9yZWlnbiBzZXJ2ZXJzOiBmdDEgKCJTIDEiLiJUIDEi KSBoYXMKKy0tIDEwMDAgcm93cywgZnQ2ICgiUyAxIi4iVCA0IikgaGFzIH4zMyByb3dzLiAgVGhl IHNhbWUgcXVlcnkgc2hhcGUgZ2V0cyBhCistLSBkaWZmZXJlbnQgcHVzaC1kb3duIHRhcmdldCBk ZXBlbmRpbmcgb24gYSBwcmVkaWNhdGUgdGhhdCBjaGFuZ2VzIHRoZQorLS0gZWZmZWN0aXZlIGNh cmRpbmFsaXR5IG9mIG9uZSBzaWRlIC0tIHRoZSBmdW5jdGlvbiAianVtcHMiIHRvIHdoaWNoZXZl cgorLS0gZm9yZWlnbiBzY2FuIGJlbmVmaXRzIG1vcmUgZnJvbSBiZWluZyBwcmUtZmlsdGVyZWQu CitBTkFMWVpFIGZ0MTsKK0FOQUxZWkUgZnQ2OworLS0gTm8gZXh0cmEgcHJlZGljYXRlOiBmdDEg aXMgdGhlIGJpZ2dlciBzaWRlLCBmdW5jdGlvbiBhYnNvcmJlZCB0aGVyZS4KK0VYUExBSU4gKFZF UkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQxLCBmdDYg dDIsIHVubmVzdChBUlJBWVszLCA2LCA5LCAxMiwgMTUsIDE4XTo6aW50W10pIEFTIHUoaWQpCitX SEVSRSB0MS5jMSA9IHUuaWQgQU5EIHQyLmMxID0gdS5pZDsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNo IEpvaW4KKyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBIYXNoIENvbmQ6ICh0MS5jMSA9IHQy LmMxKQorICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgT3V0cHV0OiB0MS5jMSwgdS5pZAor ICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0MSB0MSkgSU5ORVIgSk9JTiAoRnVuY3Rpb24g dSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMS4iQyAxIiwgZjMuYzEgRlJPTSAoIlMg MSIuIlQgMSIgcjEgSU5ORVIgSk9JTiB1bm5lc3QoJ3szLDYsOSwxMiwxNSwxOH0nOjppbnRlZ2Vy W10pIGYzKGMxKSBPTiAoKChyMS4iQyAxIiA9IGYzLmMxKSkpKQorICAgLT4gIEhhc2gKKyAgICAg ICAgIE91dHB1dDogdDIuYzEKKyAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZ0 NiB0MgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMQorICAgICAgICAgICAgICAgUmVtb3Rl IFNRTDogU0VMRUNUIGMxIEZST00gIlMgMSIuIlQgNCIKKygxMiByb3dzKQorCistLSBTZWxlY3Rp dmUgcHJlZGljYXRlIG9uIGZ0MS5jMyAobm90IGluIHRoZSBlcWNsYXNzKSBzaHJpbmtzIGZ0MSB0 byBhCistLSBoYW5kZnVsIG9mIHJlbW90ZSByb3dzOyBub3cgZnQ2IGlzIGVmZmVjdGl2ZWx5IHRo ZSBiaWdnZXIgc2lkZSBhbmQgdGhlCistLSBmdW5jdGlvbiBpcyBhYnNvcmJlZCBpbnRvIGZ0NiBp bnN0ZWFkLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxLCB0Mi5j MQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMsIDYsIDksIDEyLCAxNSwgMThd OjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQgdDIuYzEgPSB1LmlkIEFO RCB0MS5jMyA8ICcwMDAxMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1 dDogdDEuYzEsIHQyLmMxCisgICBKb2luIEZpbHRlcjogKHQxLmMxID0gdS5pZCkKKyAgIC0+ICBG b3JlaWduIFNjYW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgT3V0cHV0OiB0MS5jMQorICAg ICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZST00gIlMgMSIuIlQgMSIgV0hFUkUgKChj MyA8ICcwMDAxMCcpKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICBPdXRwdXQ6IHQyLmMx LCB1LmlkCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICAgICAgICBPdXRwdXQ6 IHQyLmMxLCB1LmlkCisgICAgICAgICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMuZnQ2IHQyKSBJ Tk5FUiBKT0lOIChGdW5jdGlvbiB1KQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNU IHIyLmMxLCBmMy5jMSBGUk9NICgiUyAxIi4iVCA0IiByMiBJTk5FUiBKT0lOIHVubmVzdCgnezMs Niw5LDEyLDE1LDE4fSc6OmludGVnZXJbXSkgZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkp CisoMTIgcm93cykKKworLS0gVGhlIHJlbWFpbmluZyBzY2VuYXJpb3MgcmV1c2UgYSBkZWRpY2F0 ZWQgZm9yZWlnbiB0YWJsZSB0byBjb3ZlciB0aGUKKy0tIGNvcm5lciBjYXNlcyBvZiBGVU5DVElP TiBSVEUgcHVzaC1kb3duOiBmdW5jdGlvbi1maXJzdCBGUk9NLCByZWNvcmQKKy0tIHJldHVybiB0 eXBlIHJlamVjdGlvbiwgd2hvbGUtcm93IHJlZmVyZW5jZSwgVVBEQVRFLi4uRlJPTS4uLiwgYW5k CistLSBtdWx0aS1mdW5jdGlvbiBST1dTIEZST00uCitDUkVBVEUgVEFCTEUgYmFzZV90YmxfZm4g KGEgaW50LCBiIGludCk7CitJTlNFUlQgSU5UTyBiYXNlX3RibF9mbgorICBTRUxFQ1QgZywgZyAr IDEwMCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMCkgZzsKK0NSRUFURSBGT1JFSUdOIFRBQkxF IHJlbW90ZV90YmwgKGEgaW50LCBiIGludCkKKyAgU0VSVkVSIGxvb3BiYWNrIE9QVElPTlMgKHRh YmxlX25hbWUgJ2Jhc2VfdGJsX2ZuJyk7CistLSBUaGUgZnVuY3Rpb24gUlRFIGFwcGVhcnMgZmly c3QgaW4gRlJPTTsgdGhlIGZvcmVpZ24gcmVsYXRpb24gbXVzdCBiZQorLS0gZm91bmQgYnkgc2Nh bm5pbmcgZnNfYmFzZV9yZWxpZHMgZm9yIGFuIFJURV9SRUxBVElPTiByYXRoZXIgdGhhbgorLS0g dXNpbmcgc2Nhbi0+ZnNfcmVsaWQgYmxpbmRseS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9G RikKK1NFTEVDVCAqIEZST00gdW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIg V0hFUkUgci5hID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgRm9yZWlnbiBTY2FuCisgICBPdXRwdXQ6IG4ubiwgci5hLCByLmIKKyAgIFJl bGF0aW9uczogKEZ1bmN0aW9uIG4pIElOTkVSIEpPSU4gKHB1YmxpYy5yZW1vdGVfdGJsIHIpCisg ICBSZW1vdGUgU1FMOiBTRUxFQ1QgZjEuYzEsIHIyLmEsIHIyLmIgRlJPTSAodW5uZXN0KCd7Miwz LDR9Jzo6aW50ZWdlcltdKSBmMShjMSkgSU5ORVIgSk9JTiBwdWJsaWMuYmFzZV90YmxfZm4gcjIg T04gKCgoZjEuYzEgPSByMi5hKSkpKQorKDQgcm93cykKKworU0VMRUNUICogRlJPTSB1bm5lc3Qo YXJyYXlbMiwgMywgNF0pIG4sIHJlbW90ZV90YmwgcgorV0hFUkUgci5hID0gbiBPUkRFUiBCWSBy LmE7CisgbiB8IGEgfCAgYiAgCistLS0rLS0tKy0tLS0tCisgMiB8IDIgfCAxMDIKKyAzIHwgMyB8 IDEwMworIDQgfCA0IHwgMTA0CisoMyByb3dzKQorCistLSBBIGZ1bmN0aW9uIHJldHVybmluZyBy ZWNvcmQgKGNvbXBvc2l0ZSkgaXMgZm9yYmlkZGVuOyBwdXNoaW5nIGl0CistLSB3b3VsZCB5aWVs ZCBhIHJlbW90ZSAiY29sdW1uIGRlZmluaXRpb24gbGlzdCBpcyByZXF1aXJlZCIgZXJyb3IuCist LSBmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2soKSByZWplY3RzIGl0IHZpYSBUWVBFRlVOQ19TQ0FM QVIuCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBmX3JldF9yZWNvcmQoKSBSRVRVUk5TIHJl Y29yZCBBUyAkJAorICBTRUxFQ1QgKDEsIDIpOjpyZWNvcmQKKyQkIExBTkdVQUdFIFNRTCBJTU1V VEFCTEU7CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgcyBGUk9NIHJlbW90 ZV90YmwgcnQsIGZfcmV0X3JlY29yZCgpIEFTIHMoYSBpbnQsIGIgaW50KQorV0hFUkUgcy5hID0g cnQuYTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgSGFzaCBKb2luCisgICBPdXRwdXQ6IHMuKgorICAgSGFzaCBDb25kOiAocnQuYSA9IHMu YSkKKyAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcnQKKyAgICAgICAg IE91dHB1dDogcnQuYSwgcnQuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJPTSBw dWJsaWMuYmFzZV90YmxfZm4KKyAgIC0+ICBIYXNoCisgICAgICAgICBPdXRwdXQ6IHMuKiwgcy5h CisgICAgICAgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwdWJsaWMuZl9yZXRfcmVjb3JkIHMKKyAg ICAgICAgICAgICAgIE91dHB1dDogcy4qLCBzLmEKKyAgICAgICAgICAgICAgIEZ1bmN0aW9uIENh bGw6IGZfcmV0X3JlY29yZCgpCisoMTEgcm93cykKKworRFJPUCBGVU5DVElPTiBmX3JldF9yZWNv cmQoKTsKKy0tIFVQREFURSAuLi4gRlJPTSB1bm5lc3QoKSB3aXRoIGEgY29tcGxleCBlbGVtZW50 IHR5cGU7IGFyZWEoYm94KQorLS0geWllbGRzIHRoZSB2YWx1ZSB0byBtYXRjaC4gIFRoZSBsb2Nr aW5nIG1hY2hpbmVyeSBmb3IgdGhlCistLSBub24tcmVsYXRpb24gUlRFIGdlbmVyYXRlcyBhIHdo b2xlLXJvdyBWYXIgdGhhdCBkZXBhcnNlQ29sdW1uUmVmCistLSBlbWl0cyBhcyBST1coZjxydGk+ LmMxLCAuLi4pLgorVVBEQVRFIHJlbW90ZV90YmwgciBTRVQgYiA9IDk5OQorRlJPTSB1bm5lc3Qo YXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKK1dIRVJFIHIuYSA9IGFyZWEo dC5ieCk7CitTRUxFQ1QgKiBGUk9NIHJlbW90ZV90YmwgV0hFUkUgYSBJTiAoMjMsIDI0LCAyNSkg T1JERVIgQlkgYTsKKyBhICB8ICBiICAKKy0tLS0rLS0tLS0KKyAyMyB8IDEyMworIDI0IHwgOTk5 CisgMjUgfCAxMjUKKygzIHJvd3MpCisKKy0tIFRoZSBzYW1lIHNoYXBlIHdpdGggQ0FTRSBhbmQg UkVUVVJOSU5HOyBleGVyY2lzZXMgdGhlIERpcmVjdE1vZGlmeQorLS0gcGF0aCBhbmQgdGhlIGV4 ZWN1dG9yJ3MgdHVwbGUtZGVzYyByZWNvbnN0cnVjdGlvbi4KK1VQREFURSByZW1vdGVfdGJsIHIK KyAgIFNFVCBiID0gQ0FTRSBXSEVOIHJhbmRvbSgpID49IDAgVEhFTiA1IEVMU0UgMCBFTkQKKyAg RlJPTSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKKyBXSEVS RSByLmEgPSBhcmVhKHQuYngpIFJFVFVSTklORyBhLCBiOworIGEgIHwgYiAKKy0tLS0rLS0tCisg MjQgfCA1CisoMSByb3cpCisKKy0tIFJFVFVSTklORyBhIHdob2xlLXJvdyByZWZlcmVuY2UgdG8g dGhlIGZ1bmN0aW9uIFJURS4gIFdpdGhvdXQgdGhlCistLSBwZXItUlRFIGZ1bmN0aW9uIG1ldGFk YXRhIGJlaW5nIHByZXNlcnZlZCBvbiB0aGUgRGlyZWN0TW9kaWZ5IHBhdGgKKy0tIChGZHdEaXJl Y3RNb2RpZnlQcml2YXRlRnVuY3Rpb25zIC8gRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZU1pblJUSW5k ZXgpLAorLS0gdGhpcyB3b3VsZCBmYWlsIHdpdGggImlucHV0IG9mIGFub255bW91cyBjb21wb3Np dGUgdHlwZXMgaXMgbm90CistLSBpbXBsZW1lbnRlZCIuCitVUERBVEUgcmVtb3RlX3RibCByIFNF VCBiID0gNworICBGUk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddLAorICAg ICAgICAgICAgICBhcnJheVtpbnQgJzEnXSkgQVMgdChieCwgaSkKKyBXSEVSRSByLmEgPSBhcmVh KHQuYngpIFJFVFVSTklORyBhLCBiLCB0OworIGEgIHwgYiB8ICAgICAgICAgIHQgICAgICAgICAg CistLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAyNCB8IDcgfCAoIigyLDMpLCgtMiwt MykiLDEpCisoMSByb3cpCisKKy0tIFJPV1MgRlJPTSAoLi4uKSB3aXRoIHNldmVyYWwgZnVuY3Rp b25zLiAgRm9yY2UgcHVzaGRvd24gYmVjYXVzZSB0aGUKKy0tIGNvc3QgbW9kZWwgb3RoZXJ3aXNl IHBpY2tzIGEgbG9jYWwgcGxhbi4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSBvZmY7CitTRVQgZW5h YmxlX21lcmdlam9pbiA9IG9mZjsKK1NFVCBlbmFibGVfbmVzdGxvb3AgPSBvZmY7CitFWFBMQUlO IChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0Lm4sIHQucworICBGUk9NIHJlbW90 ZV90YmwgciwgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChuLCBzKQor IFdIRVJFIHIuYSA9IHQubiBPUkRFUiBCWSByLmE7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIFNvcnQKKyAgIE91dHB1dDogci5hLCB0Lm4sIHQucworICAgU29ydCBLZXk6IHIu YQorICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgT3V0cHV0OiByLmEsIHQubiwgdC5zCisg ICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMucmVtb3RlX3RibCByKSBJTk5FUiBKT0lOIChGdW5j dGlvbiB0KQorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIHIxLmEsIGYyLmMxLCBmMi5jMiBG Uk9NIChwdWJsaWMuYmFzZV90YmxfZm4gcjEgSU5ORVIgSk9JTiBST1dTIEZST00gKHVubmVzdCgn ezMsNiw5fSc6OmludGVnZXJbXSksIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBmMihjMSwgYzIp IE9OICgoKHIxLmEgPSBmMi5jMSkpKSkKKyg3IHJvd3MpCisKK1NFTEVDVCByLmEsIHQubiwgdC5z CisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSks CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMp KSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKKyBhIHwgbiB8IHMg IAorLS0tKy0tLSstLS0tCisgMyB8IDMgfCAxMQorIDYgfCA2IHwgMTIKKyA5IHwgOSB8IDEzCiso MyByb3dzKQorCistLSBXaG9sZS1yb3cgVmFyIG9uIHRoZSBhYnNvcmJlZCBmdW5jdGlvbiBzaWRl IChlLmcuIHZpYSBhIGNhc3QgdG8KKy0tIHRleHQpLiAgRXhlcmNpc2VzIGJvdGggZGVwYXJzZUNv bHVtblJlZiB3aG9sZS1yb3cgYnJhbmNoIGFuZCB0aGUKKy0tIGdldF90dXBkZXNjX2Zvcl9qb2lu X3NjYW5fdHVwbGVzKCkgUlRFX0ZVTkNUSU9OIG1ldGFkYXRhIHBhdGguCitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3RibCBy LCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUg ci5hID0gdC5uIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRw dXQ6ICgodC4qKTo6dGV4dCksIHIuYQorICAgU29ydCBLZXk6IHIuYQorICAgLT4gIEZvcmVpZ24g U2NhbgorICAgICAgICAgT3V0cHV0OiAodC4qKTo6dGV4dCwgci5hCisgICAgICAgICBSZWxhdGlv bnM6IChwdWJsaWMucmVtb3RlX3RibCByKSBJTk5FUiBKT0lOIChGdW5jdGlvbiB0KQorICAgICAg ICAgUmVtb3RlIFNRTDogU0VMRUNUIENBU0UgV0hFTiAoZjIuKik6OnRleHQgSVMgTk9UIE5VTEwg VEhFTiBST1coZjIuYzEsIGYyLmMyKSBFTkQsIHIxLmEgRlJPTSAocHVibGljLmJhc2VfdGJsX2Zu IHIxIElOTkVSIEpPSU4gUk9XUyBGUk9NICh1bm5lc3QoJ3szLDYsOX0nOjppbnRlZ2VyW10pLCBn ZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgZjIoYzEsIGMyKSBPTiAoKChyMS5hID0gZjIuYzEpKSkp CisoNyByb3dzKQorCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3RibCByLCBS T1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5h ID0gdC5uIE9SREVSIEJZIHIuYTsKKyAgIHQgICAgfCBhIAorLS0tLS0tLS0rLS0tCisgKDMsMTEp IHwgMworICg2LDEyKSB8IDYKKyAoOSwxMykgfCA5CisoMyByb3dzKQorCistLSBDaGVjayB3aG9s ZS1yb3cgVmFyIHJlcHJlc2VudGVkIGJ5IGZ1bmN0aW9uIG9uIHRoZSBudWxsYWJsZQorLS0gbGVm dCBqb2luIHNpZGUKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB1LCBmdDUu YzEsIGZ0NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lOCisoZnQ0IEpPSU4g dW5uZXN0KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1MikgT04gZnQ0LmMxPXUx KQorT04gZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVSIEJZIGZ0NS5jMTsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbgorICAgT3V0cHV0OiB1LiosIGZ0NS5jMSwgZnQ1 LmMyLCBmdDQuYzEsIGZ0NC5jMgorICAgUmVsYXRpb25zOiAocHVibGljLmZ0NSkgTEVGVCBKT0lO ICgocHVibGljLmZ0NCkgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdSkpCisgICBSZW1vdGUgU1FMOiBT RUxFQ1QgQ0FTRSBXSEVOIChmMy4qKTo6dGV4dCBJUyBOT1QgTlVMTCBUSEVOIFJPVyhmMy5jMSwg ZjMuYzIpIEVORCwgcjEuYzEsIHIxLmMyLCByMi5jMSwgcjIuYzIgRlJPTSAoIlMgMSIuIlQgNCIg cjEgTEVGVCBKT0lOICgiUyAxIi4iVCAzIiByMiBJTk5FUiBKT0lOIFJPV1MgRlJPTSAodW5uZXN0 KCd7MSwyfSc6OmludGVnZXJbXSksIHVubmVzdCgnezMsNH0nOjppbnRlZ2VyW10pKSBmMyhjMSwg YzIpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkpIE9OICgoKHIxLmMxID0gcjIuYzEpKSkpIFdIRVJF ICgocjEuYzEgPCAxMCkpIE9SREVSIEJZIHIxLmMxIEFTQyBOVUxMUyBMQVNUCisoNCByb3dzKQor CitTRUxFQ1QgdSwgZnQ1LmMxLCBmdDUuYzIsIGZ0NC5jMSwgZnQ0LmMyIEZST00gZnQ1IExFRlQg Sk9JTgorKGZ0NCBKT0lOIHVubmVzdChhcnJheVsxLDJdLCBhcnJheVszLDRdKSBhcyB1ICh1MSwg dTIpIE9OIGZ0NC5jMT11MSkKK09OIGZ0NS5jMSA9IGZ0NC5jMSBXSEVSRSBmdDUuYzEgPCAxMCBP UkRFUiBCWSBmdDUuYzE7CisgdSB8IGMxIHwgYzIgfCBjMSB8IGMyIAorLS0tKy0tLS0rLS0tLSst LS0tKy0tLS0KKyAgIHwgIDMgfCAgNCB8ICAgIHwgICAKKyAgIHwgIDYgfCAgNyB8ICAgIHwgICAK KyAgIHwgIDkgfCAxMCB8ICAgIHwgICAKKygzIHJvd3MpCisKK1JFU0VUIGVuYWJsZV9oYXNoam9p bjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitSRVNFVCBlbmFibGVfbmVzdGxvb3A7CistLSBW b2xhdGlsZSBmdW5jdGlvbiBpbiBST1dTIEZST00gZGlzcXVhbGlmaWVzIHRoZSB3aG9sZSBSVEUu CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hIEZST00gcmVtb3RlX3Ri bCByLAorICAgICAgICAgICAgICAgIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxLCA0ICsgKHJhbmRv bSgpICogMCk6OmludCkpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm47CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEpvaW4KKyAgIE91dHB1dDogci5h CisgICBNZXJnZSBDb25kOiAodC5uID0gci5hKQorICAgLT4gIFNvcnQKKyAgICAgICAgIE91dHB1 dDogdC5uCisgICAgICAgICBTb3J0IEtleTogdC5uCisgICAgICAgICAtPiAgRnVuY3Rpb24gU2Nh biBvbiB0CisgICAgICAgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAgICAgICAgICAgRnVuY3Rp b24gQ2FsbDogdW5uZXN0KCd7Myw2LDl9Jzo6aW50ZWdlcltdKSwgZ2VuZXJhdGVfc2VyaWVzKDEs ICg0ICsgKChyYW5kb20oKSAqICcwJzo6ZG91YmxlIHByZWNpc2lvbikpOjppbnRlZ2VyKSkKKyAg IC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHIuYQorICAgICAgICAgU29ydCBLZXk6IHIuYQor ICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMucmVtb3RlX3RibCByCisgICAgICAg ICAgICAgICBPdXRwdXQ6IHIuYQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEg RlJPTSBwdWJsaWMuYmFzZV90YmxfZm4KKygxNSByb3dzKQorCistLSBMQVRFUkFMIGZ1bmN0aW9u IHJlZmVyZW5jaW5nIGEgZm9yZWlnbiBWYXI6IHBvc3RncmVzX2ZkdydzCistLSBmb3JlaWduLWpv aW4gcHVzaGRvd24gcmVqZWN0cyB0aGlzIHZpYSB0aGUgam9pbnJlbC0+bGF0ZXJhbF9yZWxpZHMK Ky0tIGNoZWNrOyB0aGUgcGxhbiBpcyB0aGVyZWZvcmUgYSBsb2NhbCBOZXN0TG9vcCArIEZ1bmN0 aW9uU2Nhbi4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEsIHQueCBG Uk9NIHJlbW90ZV90YmwgciwgTEFURVJBTCB1bm5lc3QoYXJyYXlbci5hXSkgQVMgdCh4KQorV0hF UkUgci5hIDw9IDMgT1JERVIgQlkgci5hOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wCisgICBPdXRwdXQ6IHIuYSwgdC54CisgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1 YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAgICAgIE91dHB1dDogci5hLCByLmIKKyAgICAgICAgIFJl bW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVibGljLmJhc2VfdGJsX2ZuIFdIRVJFICgoYSA8PSAz KSkgT1JERVIgQlkgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdf Y2F0YWxvZy51bm5lc3QgdAorICAgICAgICAgT3V0cHV0OiB0LngKKyAgICAgICAgIEZ1bmN0aW9u IENhbGw6IHVubmVzdChBUlJBWVtyLmFdKQorKDggcm93cykKKworLS0gT3V0ZXIgam9pbnMgd2l0 aCB0aGUgZnVuY3Rpb24gUlRFIGFyZSBub3QgcHVzaGVkIGRvd24gKG9ubHkgSU5ORVIKKy0tIGpv aW5zIGFyZSBzdXBwb3J0ZWQgYnkgZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKCkpLgorRVhQTEFJ TiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSwgdC5uIEZST00gcmVtb3RlX3RibCBy CisgICAgIExFRlQgSk9JTiB1bm5lc3QoYXJyYXlbMSwgMiwgM10pIEFTIHQobikgT04gci5hID0g dC5uCisgV0hFUkUgci5hIDw9IDUgT1JERVIgQlkgci5hOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE1lcmdlIExlZnQgSm9pbgorICAgT3V0cHV0OiByLmEsIHQubgorICAgTWVyZ2UgQ29u ZDogKHIuYSA9IHQubikKKyAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90Ymwg cgorICAgICAgICAgT3V0cHV0OiByLmEsIHIuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNU IGEgRlJPTSBwdWJsaWMuYmFzZV90YmxfZm4gV0hFUkUgKChhIDw9IDUpKSBPUkRFUiBCWSBhIEFT QyBOVUxMUyBMQVNUCisgICAtPiAgU29ydAorICAgICAgICAgT3V0cHV0OiB0Lm4KKyAgICAgICAg IFNvcnQgS2V5OiB0Lm4KKyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cu dW5uZXN0IHQKKyAgICAgICAgICAgICAgIE91dHB1dDogdC5uCisgICAgICAgICAgICAgICBGdW5j dGlvbiBDYWxsOiB1bm5lc3QoJ3sxLDIsM30nOjppbnRlZ2VyW10pCisoMTIgcm93cykKKworLS0g U0VNSSBqb2luIChFWElTVFMpIHdpdGggYSBmdW5jdGlvbiBSVEUgaXMgYWxzbyBub3QgcHVzaGVk IGRvd24uCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hIEZST00gcmVt b3RlX3RibCByCisgV0hFUkUgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIHVubmVzdChhcnJheVszLCA2 LCA5XSkgQVMgdChuKSBXSEVSRSB0Lm4gPSByLmEpCisgT1JERVIgQlkgci5hOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTWVyZ2UgU2VtaSBKb2lu CisgICBPdXRwdXQ6IHIuYQorICAgTWVyZ2UgQ29uZDogKHIuYSA9IHQubikKKyAgIC0+ICBGb3Jl aWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcgorICAgICAgICAgT3V0cHV0OiByLmEsIHIu YgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJPTSBwdWJsaWMuYmFzZV90YmxfZm4g T1JERVIgQlkgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNvcnQKKyAgICAgICAgIE91dHB1dDog dC5uCisgICAgICAgICBTb3J0IEtleTogdC5uCisgICAgICAgICAtPiAgRnVuY3Rpb24gU2NhbiBv biBwZ19jYXRhbG9nLnVubmVzdCB0CisgICAgICAgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAg ICAgICAgICAgRnVuY3Rpb24gQ2FsbDogdW5uZXN0KCd7Myw2LDl9Jzo6aW50ZWdlcltdKQorKDEy IHJvd3MpCisKK0RST1AgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsOworRFJPUCBUQUJMRSBiYXNl X3RibF9mbjsKIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CiAtLSBDaGVjayB0aGF0IHVzZXJpZCB0byB1c2Ugd2hl biBxdWVyeWluZyB0aGUgcmVtb3RlIHRhYmxlIGlzIGNvcnJlY3RseQogLS0gcHJvcGFnYXRlZCBp bnRvIGZvcmVpZ24gcmVscyBwcmVzZW50IGluIHN1YnF1ZXJpZXMgdW5kZXIgYW4gVU5JT04gQUxM CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDBmZjRlYzIzMTY0Li5kYzU1MmE4 NDdkOCAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKKysr IGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAgLTMxLDYgKzMxLDcgQEAK ICNpbmNsdWRlICJub2Rlcy9tYWtlZnVuY3MuaCIKICNpbmNsdWRlICJub2Rlcy9ub2RlRnVuY3Mu aCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvYXBwZW5kaW5mby5oIgorI2luY2x1ZGUgIm9wdGltaXpl ci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2Nvc3QuaCIKICNpbmNsdWRlICJvcHRp bWl6ZXIvaW5oZXJpdC5oIgogI2luY2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKQEAgLTg4 LDYgKzg5LDIyIEBAIGVudW0gRmR3U2NhblByaXZhdGVJbmRleAogCSAqIG9mIGpvaW4sIGFkZGVk IHdoZW4gdGhlIHNjYW4gaXMgam9pbgogCSAqLwogCUZkd1NjYW5Qcml2YXRlUmVsYXRpb25zLAor CisJLyoKKwkgKiBMaXN0IG9mIHBlci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEsIGluZGV4ZWQgYnkg YmFzZSBSVEkgb2Zmc2V0LiAgRWFjaAorCSAqIGVsZW1lbnQgaXMgZWl0aGVyIE5VTEwgKGZvciBu b24tUlRFX0ZVTkNUSU9OIHJlbHMgaW4gdGhpcyBzY2FuKSBvciBhCisJICogbGlzdCBvZiB0aHJl ZS1lbGVtZW50IGxpc3RzIChmdW5jaWQsIGZ1bmNyZXR0eXBlLCBmdW5jY29sbGF0aW9uKSAtLSBv bmUKKwkgKiBpbm5lciBsaXN0IHBlciBmdW5jdGlvbiBpbiB0aGUgUlRFLiAgQWxsb3dzIHRoZSBl eGVjdXRvciB0byByZWJ1aWxkCisJICogVHVwbGVEZXNjIGVudHJpZXMgZm9yIHdob2xlLXJvdyBy ZWZlcmVuY2VzIHRvIGZ1bmN0aW9uIFJURXMuCisJICovCisJRmR3U2NhblByaXZhdGVGdW5jdGlv bnMsCisKKwkvKgorCSAqIEludGVnZXIgbm9kZTogbWluaW11bSBiYXNlIFJUIGluZGV4IGNvdmVy ZWQgYnkgdGhlIHNjYW4sIHVzZWQgdG8KKwkgKiB0cmFuc2xhdGUgc2Nhbi1sb2NhbCBpbmRleGVz IHRvIGVzdGF0ZS1ydGFibGUgaW5kZXhlcyBhZnRlciBzZXRyZWZzLmMKKwkgKiBmbGF0dGVucyBy dGFibGVzLgorCSAqLworCUZkd1NjYW5Qcml2YXRlTWluUlRJbmRleCwKIH07CiAKIC8qCkBAIC0x MjQsNiArMTQxLDExIEBAIGVudW0gRmR3TW9kaWZ5UHJpdmF0ZUluZGV4CiAgKiAyKSBCb29sZWFu IGZsYWcgc2hvd2luZyBpZiB0aGUgcmVtb3RlIHF1ZXJ5IGhhcyBhIFJFVFVSTklORyBjbGF1c2UK ICAqIDMpIEludGVnZXIgbGlzdCBvZiBhdHRyaWJ1dGUgbnVtYmVycyByZXRyaWV2ZWQgYnkgUkVU VVJOSU5HLCBpZiBhbnkKICAqIDQpIEJvb2xlYW4gZmxhZyBzaG93aW5nIGlmIHdlIHNldCB0aGUg Y29tbWFuZCBlc19wcm9jZXNzZWQKKyAqIDUpIFBlci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEgKG1p cnJvcnMgRmR3U2NhblByaXZhdGVGdW5jdGlvbnM7IGxldHMKKyAqICAgIHRoZSBleGVjdXRvciBy ZWJ1aWxkIFR1cGxlRGVzYyBlbnRyaWVzIGZvciB3aG9sZS1yb3cgVmFycyBvdmVyCisgKiAgICBm dW5jdGlvbiBSVEVzIGFic29yYmVkIGludG8gYSBmb3JlaWduIGpvaW4pCisgKiA2KSBJbnRlZ2Vy IG5vZGU6IG1pbmltdW0gYmFzZSBSVCBpbmRleCBvZiB0aGUgc2NhbiAobWlycm9ycworICogICAg RmR3U2NhblByaXZhdGVNaW5SVEluZGV4KQogICovCiBlbnVtIEZkd0RpcmVjdE1vZGlmeVByaXZh dGVJbmRleAogewpAQCAtMTM1LDYgKzE1NywxMCBAQCBlbnVtIEZkd0RpcmVjdE1vZGlmeVByaXZh dGVJbmRleAogCUZkd0RpcmVjdE1vZGlmeVByaXZhdGVSZXRyaWV2ZWRBdHRycywKIAkvKiBzZXQt cHJvY2Vzc2VkIGZsYWcgKGFzIGEgQm9vbGVhbiBub2RlKSAqLwogCUZkd0RpcmVjdE1vZGlmeVBy aXZhdGVTZXRQcm9jZXNzZWQsCisJLyogUGVyLVJURSBmdW5jdGlvbiBtZXRhZGF0YSwgaW5kZXhl ZCBieSBiYXNlIFJUSSBvZmZzZXQgKi8KKwlGZHdEaXJlY3RNb2RpZnlQcml2YXRlRnVuY3Rpb25z LAorCS8qIEludGVnZXIgbm9kZTogbWluaW11bSBiYXNlIFJUIGluZGV4IGluIHRoZSBzY2FuICov CisJRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZU1pblJUSW5kZXgsCiB9OwogCiAvKgpAQCAtNzQwLDYg Kzc2Niw5IEBAIHN0YXRpYyBib29sIGZvcmVpZ25fZ3JvdXBpbmdfb2soUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKmdyb3VwZWRfcmVsLAogc3RhdGljIExpc3QgKmdldF91c2VmdWxfcGF0 aGtleXNfZm9yX3JlbGF0aW9uKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJCQkgIFJlbE9w dEluZm8gKnJlbCk7CiBzdGF0aWMgTGlzdCAqZ2V0X3VzZWZ1bF9lY3NfZm9yX3JlbGF0aW9uKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIFJlbGlkcyBnZXRfYmFz ZV9yZWxpZHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CitzdGF0aWMgaW50 CWdldF9taW5fYmFzZV9ydGkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7Citz dGF0aWMgTGlzdCAqZ2V0X2Z1bmN0aW9uc19kYXRhKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJ bmZvICpyZWwpOwogc3RhdGljIHZvaWQgYWRkX3BhdGhzX3dpdGhfcGF0aGtleXNfZm9yX3JlbChQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCQlQYXRoICplcHFf cGF0aCwgTGlzdCAqcmVzdHJpY3RsaXN0KTsKIHN0YXRpYyB2b2lkIGFkZF9mb3JlaWduX2dyb3Vw aW5nX3BhdGhzKFBsYW5uZXJJbmZvICpyb290LApAQCAtMTYzNCw5ICsxNjYzLDI2IEBAIHBvc3Rn cmVzR2V0Rm9yZWlnblBsYW4oUGxhbm5lckluZm8gKnJvb3QsCiAJZmR3X3ByaXZhdGUgPSBsaXN0 X21ha2UzKG1ha2VTdHJpbmcoc3FsLmRhdGEpLAogCQkJCQkJCSByZXRyaWV2ZWRfYXR0cnMsCiAJ CQkJCQkJIG1ha2VJbnRlZ2VyKGZwaW5mby0+ZmV0Y2hfc2l6ZSkpOworCisJLyoKKwkgKiBQb3Np dGlvbiBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9uczogZWl0aGVyIHRoZSBFWFBMQUlOIHJlbGF0aW9u IHN0cmluZworCSAqIChqb2lucy91cHBlciByZWxzKSBvciBhIE5VTEwgcGxhY2Vob2xkZXIsIHNv IHRoYXQgc3Vic2VxdWVudCBpbmRleGVzCisJICogc3RheSB2YWxpZCBmb3IgdGhlIGJhc2UtcmVs IHNjYW4gY2FzZS4KKwkgKi8KIAlpZiAoSVNfSk9JTl9SRUwoZm9yZWlnbnJlbCkgfHwgSVNfVVBQ RVJfUkVMKGZvcmVpZ25yZWwpKQogCQlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3ByaXZhdGUs CiAJCQkJCQkJICBtYWtlU3RyaW5nKGZwaW5mby0+cmVsYXRpb25fbmFtZSkpOworCWVsc2UKKwkJ ZmR3X3ByaXZhdGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLCBOVUxMKTsKKworCS8qCisJICogRmR3 U2NhblByaXZhdGVGdW5jdGlvbnMgLyBGZHdTY2FuUHJpdmF0ZU1pblJUSW5kZXggY2FycnkgdGhl IG1ldGFkYXRhCisJICogdGhlIGV4ZWN1dG9yIG5lZWRzIHRvIHJlYnVpbGQgVHVwbGVEZXNjIGVu dHJpZXMgZm9yIHdob2xlLXJvdyBWYXJzCisJICogcG9pbnRpbmcgYXQgUlRFX0ZVTkNUSU9OIHJl bHMgYWJzb3JiZWQgaW50byB0aGUgZm9yZWlnbiBzY2FuLgorCSAqLworCWZkd19wcml2YXRlID0g bGFwcGVuZChmZHdfcHJpdmF0ZSwgZ2V0X2Z1bmN0aW9uc19kYXRhKHJvb3QsIGZvcmVpZ25yZWwp KTsKKwlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3ByaXZhdGUsCisJCQkJCQkgIG1ha2VJbnRl Z2VyKGdldF9taW5fYmFzZV9ydGkocm9vdCwgZm9yZWlnbnJlbCkpKTsKIAogCS8qCiAJICogQ3Jl YXRlIHRoZSBGb3JlaWduU2NhbiBub2RlIGZvciB0aGUgZ2l2ZW4gcmVsYXRpb24uCkBAIC0xNjU3 LDkgKzE3MDMsMTUgQEAgcG9zdGdyZXNHZXRGb3JlaWduUGxhbihQbGFubmVySW5mbyAqcm9vdCwK IAogLyoKICAqIENvbnN0cnVjdCBhIHR1cGxlIGRlc2NyaXB0b3IgZm9yIHRoZSBzY2FuIHR1cGxl cyBoYW5kbGVkIGJ5IGEgZm9yZWlnbiBqb2luLgorICoKKyAqICdydGZ1bmNkYXRhJyBpcyB0aGUg RmR3U2NhblByaXZhdGVGdW5jdGlvbnMgbGlzdCBzYXZlZCBhdCBwbGFuIHRpbWUsIGFuZAorICog J3J0b2Zmc2V0JyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBleGVjdXRvcidzIFJUIGlu ZGV4ZXMgYW5kIHRoZQorICogc2Nhbi1sb2NhbCBSVCBpbmRleGVzIGNhcHR1cmVkIGluIHRoYXQg bGlzdC4gIEJvdGggbWF5IGJlIDAvTklMIHdoZW4gdGhlCisgKiBzY2FuIGhhcyBubyBSVEVfRlVO Q1RJT04gZGVwZW5kZW50cy4KICAqLwogc3RhdGljIFR1cGxlRGVzYwotZ2V0X3R1cGRlc2NfZm9y X2pvaW5fc2Nhbl90dXBsZXMoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSkKK2dldF90dXBkZXNjX2Zv cl9qb2luX3NjYW5fdHVwbGVzKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsCisJCQkJCQkJCSBMaXN0 ICpydGZ1bmNkYXRhLCBpbnQgcnRvZmZzZXQpCiB7CiAJRm9yZWlnblNjYW4gKmZzcGxhbiA9IChG b3JlaWduU2NhbiAqKSBub2RlLT5zcy5wcy5wbGFuOwogCUVTdGF0ZQkgICAqZXN0YXRlID0gbm9k ZS0+c3MucHMuc3RhdGU7CkBAIC0xNjk1LDEzICsxNzQ3LDYyIEBAIGdldF90dXBkZXNjX2Zvcl9q b2luX3NjYW5fdHVwbGVzKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpCiAJCWlmICghSXNBKHZhciwg VmFyKSB8fCB2YXItPnZhcmF0dG5vICE9IDApCiAJCQljb250aW51ZTsKIAkJcnRlID0gbGlzdF9u dGgoZXN0YXRlLT5lc19yYW5nZV90YWJsZSwgdmFyLT52YXJubyAtIDEpOwotCQlpZiAocnRlLT5y dGVraW5kICE9IFJURV9SRUxBVElPTikKLQkJCWNvbnRpbnVlOwotCQlyZWx0eXBlID0gZ2V0X3Jl bF90eXBlX2lkKHJ0ZS0+cmVsaWQpOwotCQlpZiAoIU9pZElzVmFsaWQocmVsdHlwZSkpCi0JCQlj b250aW51ZTsKLQkJYXR0LT5hdHR0eXBpZCA9IHJlbHR5cGU7Ci0JCS8qIHNob3VsZG4ndCBuZWVk IHRvIGNoYW5nZSBhbnl0aGluZyBlbHNlICovCisKKwkJaWYgKHJ0ZS0+cnRla2luZCA9PSBSVEVf UkVMQVRJT04pCisJCXsKKwkJCXJlbHR5cGUgPSBnZXRfcmVsX3R5cGVfaWQocnRlLT5yZWxpZCk7 CisJCQlpZiAoIU9pZElzVmFsaWQocmVsdHlwZSkpCisJCQkJY29udGludWU7CisJCQlhdHQtPmF0 dHR5cGlkID0gcmVsdHlwZTsKKwkJCS8qIHNob3VsZG4ndCBuZWVkIHRvIGNoYW5nZSBhbnl0aGlu ZyBlbHNlICovCisJCX0KKwkJZWxzZSBpZiAocnRlLT5ydGVraW5kID09IFJURV9GVU5DVElPTiAm JiBydGZ1bmNkYXRhICE9IE5JTCkKKwkJeworCQkJLyoKKwkJCSAqIEEgd2hvbGUtcm93IFZhciBw b2ludHMgYXQgYSBGVU5DVElPTiBSVEUgYWJzb3JiZWQgaW50byB0aGUKKwkJCSAqIGZvcmVpZ24g am9pbi4gIFN5bnRoZXNpemUgYW4gYW5vbnltb3VzIGNvbXBvc2l0ZSBUdXBsZURlc2MgZnJvbQor CQkJICogdGhlIHBlci1mdW5jdGlvbiByZXR1cm4tdHlwZSBtZXRhZGF0YSB3ZSBzYXZlZCBhdCBw bGFuIHRpbWU7CisJCQkgKiB0aGUgZGVwYXJzZXIgZW1pdHMgdGhlc2UgYXMgUk9XKGY8cnRpPi5j MSwgZjxydGk+LmMyLCAuLi4pLgorCQkJICovCisJCQlMaXN0CSAgICpmdW5jZGF0YTsKKwkJCVR1 cGxlRGVzYwlydGVfdHVwZGVzYzsKKwkJCWludAkJCW51bV9mdW5jczsKKwkJCWludAkJCWF0dG51 bTsKKwkJCUxpc3RDZWxsICAgKmxjMSwKKwkJCQkJICAgKmxjMjsKKworCQkJZnVuY2RhdGEgPSBs aXN0X250aChydGZ1bmNkYXRhLCB2YXItPnZhcm5vIC0gcnRvZmZzZXQpOworCQkJaWYgKGZ1bmNk YXRhID09IE5JTCkKKwkJCQljb250aW51ZTsKKwkJCW51bV9mdW5jcyA9IGxpc3RfbGVuZ3RoKGZ1 bmNkYXRhKTsKKwkJCUFzc2VydChudW1fZnVuY3MgPT0gbGlzdF9sZW5ndGgocnRlLT5lcmVmLT5j b2xuYW1lcykpOworCQkJcnRlX3R1cGRlc2MgPSBDcmVhdGVUZW1wbGF0ZVR1cGxlRGVzYyhudW1f ZnVuY3MpOworCisJCQlhdHRudW0gPSAxOworCQkJZm9yYm90aChsYzEsIGZ1bmNkYXRhLCBsYzIs IHJ0ZS0+ZXJlZi0+Y29sbmFtZXMpCisJCQl7CisJCQkJTGlzdAkgICAqZmRhdGEgPSBsZmlyc3Rf bm9kZShMaXN0LCBsYzEpOworCQkJCWNoYXIJICAgKmNvbG5hbWUgPSBzdHJWYWwobGZpcnN0KGxj MikpOworCQkJCU9pZAkJCWZ1bmNyZXR0eXBlOworCQkJCU9pZAkJCWZ1bmNjb2xsYXRpb247CisK KwkJCQlmdW5jcmV0dHlwZSA9IGxzZWNvbmRfbm9kZShJbnRlZ2VyLCBmZGF0YSktPml2YWw7CisJ CQkJZnVuY2NvbGxhdGlvbiA9IGx0aGlyZF9ub2RlKEludGVnZXIsIGZkYXRhKS0+aXZhbDsKKwor CQkJCWlmICghT2lkSXNWYWxpZChmdW5jcmV0dHlwZSkgfHwgZnVuY3JldHR5cGUgPT0gUkVDT1JE T0lEKQorCQkJCQllbG9nKEVSUk9SLAorCQkJCQkJICJjb3VsZCBub3QgZGV0ZXJtaW5lIHJldHVy biB0eXBlIGZvciBmdW5jdGlvbiBpbiBmb3JlaWduIHNjYW4iKTsKKworCQkJCVR1cGxlRGVzY0lu aXRFbnRyeShydGVfdHVwZGVzYywgKEF0dHJOdW1iZXIpIGF0dG51bSwgY29sbmFtZSwKKwkJCQkJ CQkJICAgZnVuY3JldHR5cGUsIC0xLCAwKTsKKwkJCQlUdXBsZURlc2NJbml0RW50cnlDb2xsYXRp b24ocnRlX3R1cGRlc2MsIChBdHRyTnVtYmVyKSBhdHRudW0sCisJCQkJCQkJCQkJCWZ1bmNjb2xs YXRpb24pOworCQkJCWF0dG51bSsrOworCQkJfQorCisJCQlhc3NpZ25fcmVjb3JkX3R5cGVfdHlw bW9kKHJ0ZV90dXBkZXNjKTsKKwkJCWF0dC0+YXR0dHlwbW9kID0gcnRlX3R1cGRlc2MtPnRkdHlw bW9kOworCQl9CiAJfQogCXJldHVybiB0dXBkZXNjOwogfQpAQCAtMTczNywxNCArMTgzOCwzMCBA QCBwb3N0Z3Jlc0JlZ2luRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwgaW50IGVm bGFncykKIAogCS8qCiAJICogSWRlbnRpZnkgd2hpY2ggdXNlciB0byBkbyB0aGUgcmVtb3RlIGFj Y2VzcyBhcy4gIFRoaXMgc2hvdWxkIG1hdGNoIHdoYXQKLQkgKiBFeGVjQ2hlY2tQZXJtaXNzaW9u cygpIGRvZXMuCisJICogRXhlY0NoZWNrUGVybWlzc2lvbnMoKSBkb2VzLiAgRm9yIGEgam9pbiwg c2NhbiB0aGUgYmFzZSByZWxpZHMgdW50aWwgd2UKKwkgKiBmaW5kIGFuIFJURV9SRUxBVElPTiAo dGhlIGZvcmVpZ24tdGFibGUgc2lkZSk7IGlnbm9yZSBhbnkgUlRFX0ZVTkNUSU9OCisJICogYWJz b3JiZWQgaW50byB0aGUgam9pbiwgd2hpY2ggY29udHJpYnV0ZXMgbm8gcmVsYXRpb24gT0lEIHRv IGxvb2sgdXAuCiAJICovCiAJdXNlcmlkID0gT2lkSXNWYWxpZChmc3BsYW4tPmNoZWNrQXNVc2Vy KSA/IGZzcGxhbi0+Y2hlY2tBc1VzZXIgOiBHZXRVc2VySWQoKTsKKwlydGUgPSBOVUxMOwogCWlm IChmc3BsYW4tPnNjYW4uc2NhbnJlbGlkID4gMCkKKwl7CiAJCXJ0aW5kZXggPSBmc3BsYW4tPnNj YW4uc2NhbnJlbGlkOworCQlydGUgPSBleGVjX3J0X2ZldGNoKHJ0aW5kZXgsIGVzdGF0ZSk7CisJ fQogCWVsc2UKLQkJcnRpbmRleCA9IGJtc19uZXh0X21lbWJlcihmc3BsYW4tPmZzX2Jhc2VfcmVs aWRzLCAtMSk7Ci0JcnRlID0gZXhlY19ydF9mZXRjaChydGluZGV4LCBlc3RhdGUpOworCXsKKwkJ cnRpbmRleCA9IC0xOworCQl3aGlsZSAoKHJ0aW5kZXggPSBibXNfbmV4dF9tZW1iZXIoZnNwbGFu LT5mc19iYXNlX3JlbGlkcywgcnRpbmRleCkpID49IDApCisJCXsKKwkJCXJ0ZSA9IGV4ZWNfcnRf ZmV0Y2gocnRpbmRleCwgZXN0YXRlKTsKKwkJCWlmIChydGUgIT0gTlVMTCAmJiBydGUtPnJ0ZWtp bmQgPT0gUlRFX1JFTEFUSU9OKQorCQkJCWJyZWFrOworCQkJcnRlID0gTlVMTDsKKwkJfQorCQlp ZiAocnRlID09IE5VTEwpCisJCQllbG9nKEVSUk9SLCAiY291bGQgbm90IGxvY2F0ZSBhIGZvcmVp Z24gcmVsYXRpb24gUlRFIGluIGZvcmVpZ24gc2NhbiIpOworCX0KIAogCS8qIEdldCBpbmZvIGFi b3V0IGZvcmVpZ24gdGFibGUuICovCiAJdGFibGUgPSBHZXRGb3JlaWduVGFibGUocnRlLT5yZWxp ZCk7CkBAIC0xNzg3LDggKzE5MDQsMTkgQEAgcG9zdGdyZXNCZWdpbkZvcmVpZ25TY2FuKEZvcmVp Z25TY2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpCiAJfQogCWVsc2UKIAl7CisJCUxpc3QJICAg KnJ0ZnVuY2RhdGEgPSAoTGlzdCAqKSBsaXN0X250aChmc3BsYW4tPmZkd19wcml2YXRlLAorCQkJ CQkJCQkJCQkJICAgRmR3U2NhblByaXZhdGVGdW5jdGlvbnMpOworCQlpbnQJCQltaW5fYmFzZV9y dGkgPSBpbnRWYWwobGlzdF9udGgoZnNwbGFuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCSAg IEZkd1NjYW5Qcml2YXRlTWluUlRJbmRleCkpOworCQlpbnQJCQlydG9mZnNldCA9IGJtc19uZXh0 X21lbWJlcihmc3BsYW4tPmZzX2Jhc2VfcmVsaWRzLCAtMSkgLQorCQkJbWluX2Jhc2VfcnRpOwor CisJCUFzc2VydChtaW5fYmFzZV9ydGkgPiAwKTsKKwkJQXNzZXJ0KHJ0b2Zmc2V0ID49IDApOwor CiAJCWZzc3RhdGUtPnJlbCA9IE5VTEw7Ci0JCWZzc3RhdGUtPnR1cGRlc2MgPSBnZXRfdHVwZGVz Y19mb3Jfam9pbl9zY2FuX3R1cGxlcyhub2RlKTsKKwkJZnNzdGF0ZS0+dHVwZGVzYyA9IGdldF90 dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUsIHJ0ZnVuY2RhdGEsCisJCQkJCQkJCQkJ CQkJCQlydG9mZnNldCk7CiAJfQogCiAJZnNzdGF0ZS0+YXR0aW5tZXRhID0gVHVwbGVEZXNjR2V0 QXR0SW5NZXRhZGF0YShmc3N0YXRlLT50dXBkZXNjKTsKQEAgLTI4MjgsNiArMjk1NiwxMCBAQCBw b3N0Z3Jlc1BsYW5EaXJlY3RNb2RpZnkoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQltYWtl Qm9vbGVhbigocmV0cmlldmVkX2F0dHJzICE9IE5JTCkpLAogCQkJCQkJCQkJcmV0cmlldmVkX2F0 dHJzLAogCQkJCQkJCQkJbWFrZUJvb2xlYW4ocGxhbi0+Y2FuU2V0VGFnKSk7CisJZnNjYW4tPmZk d19wcml2YXRlID0gbGFwcGVuZChmc2Nhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCSBnZXRfZnVu Y3Rpb25zX2RhdGEocm9vdCwgZm9yZWlnbnJlbCkpOworCWZzY2FuLT5mZHdfcHJpdmF0ZSA9IGxh cHBlbmQoZnNjYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkgbWFrZUludGVnZXIoZ2V0X21pbl9i YXNlX3J0aShyb290LCBmb3JlaWducmVsKSkpOwogCiAJLyoKIAkgKiBVcGRhdGUgdGhlIGZvcmVp Z24tam9pbi1yZWxhdGVkIGZpZWxkcy4KQEAgLTI5NDEsNyArMzA3MywyNiBAQCBwb3N0Z3Jlc0Jl Z2luRGlyZWN0TW9kaWZ5KEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpCiAJCVR1 cGxlRGVzYwl0dXBkZXNjOwogCiAJCWlmIChmc3BsYW4tPnNjYW4uc2NhbnJlbGlkID09IDApCi0J CQl0dXBkZXNjID0gZ2V0X3R1cGRlc2NfZm9yX2pvaW5fc2Nhbl90dXBsZXMobm9kZSk7CisJCXsK KwkJCS8qCisJCQkgKiBEaXJlY3RNb2RpZnkgb24gYSBmb3JlaWduIGpvaW46IHVzZSB0aGUgcGVy LVJURSBmdW5jdGlvbgorCQkJICogbWV0YWRhdGEgc2F2ZWQgYXQgcGxhbiB0aW1lIHNvIGEgd2hv bGUtcm93IFZhciBwb2ludGluZyBhdCBhCisJCQkgKiBmdW5jdGlvbiBSVEUgYWJzb3JiZWQgaW50 byB0aGUgam9pbiBjYW4gYmUgcmVidWlsdCBpbnRvIGEKKwkJCSAqIHVzYWJsZSBUdXBsZURlc2Mg KGUuZy4gUkVUVVJOSU5HIHQgZm9yIGEgam9pbiB3aXRoIFVOTkVTVCguLi4sCisJCQkgKiAuLi4p IEFTIHQoYngsIGkpKS4KKwkJCSAqLworCQkJTGlzdAkgICAqcnRmdW5jZGF0YSA9IChMaXN0ICop IGxpc3RfbnRoKGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkJICAgRmR3RGlyZWN0 TW9kaWZ5UHJpdmF0ZUZ1bmN0aW9ucyk7CisJCQlpbnQJCQltaW5fYmFzZV9ydGkgPSBpbnRWYWwo bGlzdF9udGgoZnNwbGFuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCQkgICBGZHdEaXJlY3RN b2RpZnlQcml2YXRlTWluUlRJbmRleCkpOworCQkJaW50CQkJcnRvZmZzZXQgPSBibXNfbmV4dF9t ZW1iZXIoZnNwbGFuLT5mc19iYXNlX3JlbGlkcywgLTEpIC0KKwkJCQltaW5fYmFzZV9ydGk7CisK KwkJCUFzc2VydChtaW5fYmFzZV9ydGkgPiAwKTsKKwkJCUFzc2VydChydG9mZnNldCA+PSAwKTsK KworCQkJdHVwZGVzYyA9IGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUsIHJ0 ZnVuY2RhdGEsIHJ0b2Zmc2V0KTsKKwkJfQogCQllbHNlCiAJCQl0dXBkZXNjID0gUmVsYXRpb25H ZXREZXNjcihkbXN0YXRlLT5yZWwpOwogCkBAIC0zMDU0LDcgKzMyMDUsOCBAQCBwb3N0Z3Jlc0V4 cGxhaW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlLCBFeHBsYWluU3RhdGUgKmVz KQogCSAqIFdlIGRvIHRoYXQgaGVyZSwgbm90IHdoZW4gdGhlIHBsYW4gaXMgY3JlYXRlZCwgYmVj YXVzZSB3ZSBjYW4ndCBrbm93CiAJICogd2hhdCBhbGlhc2VzIHJ1bGV1dGlscy5jIHdpbGwgYXNz aWduIGF0IHBsYW4gY3JlYXRpb24gdGltZS4KIAkgKi8KLQlpZiAobGlzdF9sZW5ndGgoZmR3X3By aXZhdGUpID4gRmR3U2NhblByaXZhdGVSZWxhdGlvbnMpCisJaWYgKGxpc3RfbGVuZ3RoKGZkd19w cml2YXRlKSA+IEZkd1NjYW5Qcml2YXRlUmVsYXRpb25zICYmCisJCWxpc3RfbnRoKGZkd19wcml2 YXRlLCBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucykgIT0gTlVMTCkKIAl7CiAJCVN0cmluZ0luZm9E YXRhIHJlbGF0aW9uczsKIAkJY2hhcgkgICAqcmF3cmVsYXRpb25zOwpAQCAtMzEwNCw2ICszMjU2 LDIyIEBAIHBvc3RncmVzRXhwbGFpbkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUs IEV4cGxhaW5TdGF0ZSAqZXMpCiAJCQkJcnRpICs9IHJ0b2Zmc2V0OwogCQkJCUFzc2VydChibXNf aXNfbWVtYmVyKHJ0aSwgcGxhbi0+ZnNfYmFzZV9yZWxpZHMpKTsKIAkJCQlydGUgPSBydF9mZXRj aChydGksIGVzLT5ydGFibGUpOworCisJCQkJLyoKKwkJCQkgKiBJZiBhIGZ1bmN0aW9uIFJURSB3 YXMgYWJzb3JiZWQgaW50byB0aGUgZm9yZWlnbiBqb2luLAorCQkJCSAqIHJlbmRlciBpdCBhcyAi RnVuY3Rpb24gPGFsaWFzPiIgc2luY2Ugd2UgaGF2ZSBubyBmb3JlaWduCisJCQkJICogcmVsaWQu CisJCQkJICovCisJCQkJaWYgKHJ0ZS0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04pCisJCQkJewor CQkJCQlyZWZuYW1lID0gKGNoYXIgKikgbGlzdF9udGgoZXMtPnJ0YWJsZV9uYW1lcywgcnRpIC0g MSk7CisJCQkJCWlmIChyZWZuYW1lID09IE5VTEwpCisJCQkJCQlyZWZuYW1lID0gcnRlLT5lcmVm LT5hbGlhc25hbWU7CisJCQkJCWFwcGVuZFN0cmluZ0luZm8oJnJlbGF0aW9ucywgIkZ1bmN0aW9u ICVzIiwKKwkJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKHJlZm5hbWUpKTsKKwkJCQkJY29udGlu dWU7CisJCQkJfQorCiAJCQkJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwog CQkJCS8qIFRoaXMgbG9naWMgc2hvdWxkIGFncmVlIHdpdGggZXhwbGFpbi5jJ3MgRXhwbGFpblRh cmdldFJlbCAqLwogCQkJCXJlbG5hbWUgPSBnZXRfcmVsX25hbWUocnRlLT5yZWxpZCk7CkBAIC0z NDc5LDggKzM2NDcsMTcgQEAgZXN0aW1hdGVfcGF0aF9jb3N0X3NpemUoUGxhbm5lckluZm8gKnJv b3QsCiAJCQkvKiBGb3Igam9pbiB3ZSBleHBlY3QgaW5uZXIgYW5kIG91dGVyIHJlbGF0aW9ucyBz ZXQgKi8KIAkJCUFzc2VydChmcGluZm8tPmlubmVycmVsICYmIGZwaW5mby0+b3V0ZXJyZWwpOwog Ci0JCQlmcGluZm9faSA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPmlubmVycmVsLT5m ZHdfcHJpdmF0ZTsKLQkJCWZwaW5mb19vID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGZwaW5mby0+ b3V0ZXJyZWwtPmZkd19wcml2YXRlOworCQkJLyoKKwkJCSAqIEZvciBhIEZVTkNUSU9OIFJURSBh YnNvcmJlZCBpbnRvIHRoZSBqb2luLCB1c2UgdGhlIHN0dWIgZnBpbmZvCisJCQkgKiB3ZSBidWls dCBpbiBmb3JlaWduX2pvaW5fb2soKSwgc2luY2UgdGhlIGZ1bmN0aW9uIHJlbCBpdHNlbGYKKwkJ CSAqIGhhcyBubyBmZHdfcHJpdmF0ZS4KKwkJCSAqLworCQkJZnBpbmZvX2kgPSBmcGluZm8tPmlu bmVyX2Z1bmNfZnBpbmZvID8KKwkJCQlmcGluZm8tPmlubmVyX2Z1bmNfZnBpbmZvIDoKKwkJCQko UGdGZHdSZWxhdGlvbkluZm8gKikgZnBpbmZvLT5pbm5lcnJlbC0+ZmR3X3ByaXZhdGU7CisJCQlm cGluZm9fbyA9IGZwaW5mby0+b3V0ZXJfZnVuY19mcGluZm8gPworCQkJCWZwaW5mby0+b3V0ZXJf ZnVuY19mcGluZm8gOgorCQkJCShQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPm91dGVycmVs LT5mZHdfcHJpdmF0ZTsKIAogCQkJLyogRXN0aW1hdGUgb2YgbnVtYmVyIG9mIHJvd3MgaW4gY3Jv c3MgcHJvZHVjdCAqLwogCQkJbnJvd3MgPSBmcGluZm9faS0+cm93cyAqIGZwaW5mb19vLT5yb3dz OwpAQCAtNjYxOSw2ICs2Nzk2LDE4MSBAQCBzZW1pam9pbl90YXJnZXRfb2soUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKmpvaW5yZWwsIFJlbE9wdEluZm8gKm91dGVycmVsLAogCXJldHVy biBvazsKIH0KIAorLyoKKyAqIGdldF9iYXNlX3JlbGlkcworICoJCVJldHVybiB0aGUgc2V0IG9m IGJhc2UgcmVsaWRzIHJlZmVyZW5jZWQgYnkgYSBmb3JlaWduIHNjYW4gcmVsLgorICoKKyAqIEZv ciBhbiB1cHBlciByZWwgd2UgdXNlIHRoZSBhbGwtcXVlcnkgcmVsaWRzIG1pbnVzIHRoZSBvdXRl ciBqb2luczsKKyAqIG90aGVyd2lzZSB0aGUgcmVsJ3Mgb3duIHJlbGlkcyBtaW51cyB0aGUgb3V0 ZXIgam9pbnMuICBUaGUgcmVzdWx0IG1hdGNoZXMKKyAqIHRoZSByZWxpZHMgdGhhdCBjcmVhdGVf Zm9yZWlnbnNjYW5fcGxhbigpIHVsdGltYXRlbHkgdXNlcyBmb3IKKyAqIEZvcmVpZ25TY2FuLmZz X2Jhc2VfcmVsaWRzLCBzbyBpdCBpcyBzdWl0YWJsZSBmb3IgYW55IHRhZ2dpbmcgd2Ugd2FudCB0 bworICogc3RvcmUgdmlhIHBsYW4tcHJpdmF0ZSBzdGF0ZS4KKyAqLworc3RhdGljIFJlbGlkcwor Z2V0X2Jhc2VfcmVsaWRzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpCit7CisJ UmVsaWRzCQlyZWxpZHM7CisKKwlpZiAocmVsLT5yZWxvcHRraW5kID09IFJFTE9QVF9VUFBFUl9S RUwpCisJCXJlbGlkcyA9IHJvb3QtPmFsbF9xdWVyeV9yZWxzOworCWVsc2UKKwkJcmVsaWRzID0g cmVsLT5yZWxpZHM7CisKKwlyZXR1cm4gYm1zX2RpZmZlcmVuY2UocmVsaWRzLCByb290LT5vdXRl cl9qb2luX3JlbHMpOworfQorCisvKgorICogZ2V0X21pbl9iYXNlX3J0aQorICoJCUxvd2VzdCBi YXNlIFJUIGluZGV4IGluIHRoZSBmb3JlaWduIHNjYW4gcmVsLgorICoKKyAqIEFmdGVyIHNldHJl ZnMuYyBmbGF0dGVucyB0aGUgcnRhYmxlLCB0aGUgc2Nhbi1sb2NhbCBpbmRleGVzIHNhdmVkIGlu CisgKiBwbGFuLXByaXZhdGUgZGF0YSBjYW4gYmUgdHJhbnNsYXRlZCB0byBlc3RhdGUgaW5kZXhl cyBieSBhZGRpbmcKKyAqIChGb3JlaWduU2Nhbi5mc19iYXNlX3JlbGlkcyBtaW4gLSB0aGlzIHZh bHVlKS4gIENhcHR1cmVkIGF0IHBsYW4gdGltZQorICogYmVjYXVzZSBjcmVhdGVfZm9yZWlnbnNj YW5fcGxhbigpIGNvbXB1dGVzIHRoZSBzYW1lIHZhbHVlIGludGVybmFsbHkuCisgKi8KK3N0YXRp YyBpbnQKK2dldF9taW5fYmFzZV9ydGkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJl bCkKK3sKKwlSZWxpZHMJCXJlbGlkcyA9IGdldF9iYXNlX3JlbGlkcyhyb290LCByZWwpOworCisJ cmV0dXJuIGJtc19uZXh0X21lbWJlcihyZWxpZHMsIC0xKTsKK30KKworLyoKKyAqIGdldF9mdW5j dGlvbnNfZGF0YQorICoJCUJ1aWxkIHRoZSBwZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhIGxpc3Qg c2F2ZWQgYXMKKyAqCQlGZHdTY2FuUHJpdmF0ZUZ1bmN0aW9ucy4KKyAqCisgKiBUaGUgcmVzdWx0 IGxpc3QgaXMgaW5kZXhlZCBieSBiYXNlIFJUIGluZGV4IHJlbGF0aXZlIHRvIHRoZSBsb3dlc3Qg YmFzZQorICogUlQgaW5kZXggb2YgdGhlIHNjYW4uICBFYWNoIGVsZW1lbnQgaXMgZWl0aGVyIE5V TEwgKGZvciBub24tUlRFX0ZVTkNUSU9OCisgKiBiYXNlIHJlbHMgaW4gdGhpcyBzY2FuKSBvciBh IExpc3Qgb2YgTGlzdCBvZiB0aHJlZSBJbnRlZ2VyIG5vZGVzOgorICogKGZ1bmNpZCwgZnVuY3Jl dHR5cGUsIGZ1bmNjb2xsYXRpb24pIC0tIG9uZSBpbm5lciBsaXN0IHBlciBSYW5nZVRibEZ1bmN0 aW9uLgorICoKKyAqIE9ubHkgUlRFX0ZVTkNUSU9OIHJlbGlkcyBhY3R1YWxseSBhcHBlYXJpbmcg aW4gdGhlIGZvcmVpZ24gc2NhbidzCisgKiBmc19iYXNlX3JlbGlkcyBjb250cmlidXRlOyBvdGhl cnMgYXJlIHBsYWNlaG9sZGVycyBzbyB0aGF0IHRoZSBjb25zdW1lcgorICogY2FuIGluZGV4IGlu dG8gdGhlIHJlc3VsdCBieSBSVEkgb2Zmc2V0LgorICovCitzdGF0aWMgTGlzdCAqCitnZXRfZnVu Y3Rpb25zX2RhdGEoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCkKK3sKKwlMaXN0 CSAgICpydGZ1bmNkYXRhID0gTklMOworCVJlbGlkcwkJZnNjYW5fcmVsaWRzID0gZ2V0X2Jhc2Vf cmVsaWRzKHJvb3QsIHJlbCk7CisJaW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCByb290LT5z aW1wbGVfcmVsX2FycmF5X3NpemU7IGkrKykKKwl7CisJCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHJv b3QtPnNpbXBsZV9ydGVfYXJyYXlbaV07CisJCUxpc3QJICAgKmZ1bmNkYXRhID0gTklMOworCQlM aXN0Q2VsbCAgICpsYzsKKworCQlpZiAocnRlID09IE5VTEwgfHwgaSA9PSAwIHx8CisJCQkhYm1z X2lzX21lbWJlcihpLCBmc2Nhbl9yZWxpZHMpIHx8CisJCQlydGUtPnJ0ZWtpbmQgIT0gUlRFX0ZV TkNUSU9OKQorCQl7CisJCQlydGZ1bmNkYXRhID0gbGFwcGVuZChydGZ1bmNkYXRhLCBOVUxMKTsK KwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yZWFjaChsYywgcnRlLT5mdW5jdGlvbnMpCisJCXsK KwkJCVJhbmdlVGJsRnVuY3Rpb24gKnJ0ZnVuYyA9IChSYW5nZVRibEZ1bmN0aW9uICopIGxmaXJz dChsYyk7CisJCQlPaWQJCQlmdW5jcmV0dHlwZTsKKwkJCU9pZAkJCWZ1bmNjb2xsYXRpb247CisJ CQlUdXBsZURlc2MJdHVwZGVzYzsKKwkJCU9pZAkJCWZ1bmNpZCA9IEludmFsaWRPaWQ7CisKKwkJ CWdldF9leHByX3Jlc3VsdF90eXBlKHJ0ZnVuYy0+ZnVuY2V4cHIsICZmdW5jcmV0dHlwZSwgJnR1 cGRlc2MpOworCisJCQlpZiAoIU9pZElzVmFsaWQoZnVuY3JldHR5cGUpIHx8IGZ1bmNyZXR0eXBl ID09IFJFQ09SRE9JRCkKKwkJCQllbG9nKEVSUk9SLAorCQkJCQkgImNvdWxkIG5vdCBkZXRlcm1p bmUgcmV0dXJuIHR5cGUgZm9yIGZ1bmN0aW9uIGluIGZvcmVpZ24gc2NhbiIpOworCisJCQlmdW5j Y29sbGF0aW9uID0gZXhwckNvbGxhdGlvbihydGZ1bmMtPmZ1bmNleHByKTsKKworCQkJaWYgKElz QShydGZ1bmMtPmZ1bmNleHByLCBGdW5jRXhwcikpCisJCQkJZnVuY2lkID0gKChGdW5jRXhwciAq KSBydGZ1bmMtPmZ1bmNleHByKS0+ZnVuY2lkOworCisJCQlmdW5jZGF0YSA9IGxhcHBlbmQoZnVu Y2RhdGEsCisJCQkJCQkJICAgbGlzdF9tYWtlMyhtYWtlSW50ZWdlcihmdW5jaWQpLAorCQkJCQkJ CQkJCSAgbWFrZUludGVnZXIoZnVuY3JldHR5cGUpLAorCQkJCQkJCQkJCSAgbWFrZUludGVnZXIo ZnVuY2NvbGxhdGlvbikpKTsKKwkJfQorCisJCXJ0ZnVuY2RhdGEgPSBsYXBwZW5kKHJ0ZnVuY2Rh dGEsIGZ1bmNkYXRhKTsKKwl9CisKKwlyZXR1cm4gcnRmdW5jZGF0YTsKK30KKworLyoKKyAqIENo ZWNrIGlmIGEgcmVsYXRpb24gaXMgYSBGVU5DVElPTiBSVEUgdGhhdCBjYW4gYmUgYWJzb3JiZWQg aW50byBhIHJlbW90ZQorICogam9pbi4gIEV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBSVEUgbXVzdAor ICoKKyAqICAgLSByZXR1cm4gYSB3ZWxsLWRlZmluZWQgc2NhbGFyIHR5cGUgLS0gd2UgZG9uJ3Qg c2hpcCByZWNvcmRzL2NvbXBvc2l0ZQorICogICAgIHNpbmNlIHRoZSByZW1vdGUgc2VydmVyIGNh bm5vdCByZWNvbnN0cnVjdCBhIGNvbHVtbiBkZWZpbml0aW9uIGxpc3QKKyAqICAgICBhbmQgb3Vy IGRlcGFyc2VyIGRvZXMgbm90IGVtaXQgb25lOworICogICAtIGhhdmUgYSBzaGlwcGFibGUgZXhw cmVzc2lvbiB3aXRoIG5vIG11dGFibGUgc3Vibm9kZXMgLS0gaXNfZm9yZWlnbl9leHByKCkKKyAq ICAgICByZWplY3RzIHZvbGF0aWxlL3N0YWJsZSBmdW5jdGlvbnMgdGhyb3VnaCBjb250YWluX211 dGFibGVfZnVuY3Rpb25zKCksCisgKiAgICAgc28gdGhlIElNTVVUQUJMRS1vbmx5IHJlc3RyaWN0 aW9uIGlzIGltcGxpY2l0OworICogICAtIG5vdCBjb250YWluIFN1YlBsYW5zIC0tIHdlJ2Qgb3Ro ZXJ3aXNlIG5lZWQgdG8gc2hpcCBzdWItcmVzdWx0cyB0bworICogICAgIHRoZSByZW1vdGUsIHdo aWNoIHdlIGRvIG5vdCBpbXBsZW1lbnQuCisgKgorICogV0lUSCBPUkRJTkFMSVRZIGlzIG5vdCBz dXBwb3J0ZWQgeWV0LgorICovCitzdGF0aWMgYm9vbAorZnVuY3Rpb25fcnRlX3B1c2hkb3duX29r KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkgUmVsT3B0SW5mbyAq ZmR3cmVsKQoreworCVJhbmdlVGJsRW50cnkgKnJ0ZTsKKwlMaXN0Q2VsbCAgICpsYzsKKworCWlm IChyZWwtPnJ0ZWtpbmQgIT0gUlRFX0ZVTkNUSU9OKQorCQlyZXR1cm4gZmFsc2U7CisJcnRlID0g cGxhbm5lcl9ydF9mZXRjaChyZWwtPnJlbGlkLCByb290KTsKKwlpZiAocnRlLT5ydGVraW5kICE9 IFJURV9GVU5DVElPTikKKwkJcmV0dXJuIGZhbHNlOworCWlmIChydGUtPmZ1bmNvcmRpbmFsaXR5 KQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFJlamVjdCB1cC1mcm9udCBhbnkgZnVuY3Rp b24gUlRFIHRoYXQgbGF0ZXJhbC1yZWZlcmVuY2VzIGFub3RoZXIKKwkgKiByZWxhdGlvbjogZm9y ZWlnbi1qb2luIHB1c2gtZG93biB3b3VsZCBuZWVkIHRvIHBhcmFtZXRlcmlzZSB0aGUgcmVtb3Rl CisJICogcXVlcnkgcGVyIG91dGVyIHJvdywgd2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCwgYW5kIGV2 ZW4gY29uc2lkZXJpbmcgdGhlCisJICogcGF0aCBpcyBleHBlbnNpdmUgb24gdGhlIHBsYW5uZXIg c2lkZS4gIFRoZSBzdXJyb3VuZGluZyBsYXRlcmFsX3JlbGlkcworCSAqIGNoZWNrIGluIHBvc3Rn cmVzR2V0Rm9yZWlnbkpvaW5QYXRocygpIHdvdWxkIG5vcm1hbGx5IGJhaWwgb3V0IGZvciB0aGUK KwkgKiBqb2lucmVsLCBidXQgZG9pbmcgdGhlIGNoZWNrIGhlcmUgYXZvaWRzIHdhbGtpbmcgdGhl IGZ1bmN0aW9uCisJICogZXhwcmVzc2lvbiBlbnRpcmVseS4KKwkgKi8KKwlpZiAoIWJtc19pc19l bXB0eShyZWwtPmxhdGVyYWxfcmVsaWRzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJQXNzZXJ0KGxp c3RfbGVuZ3RoKHJ0ZS0+ZnVuY3Rpb25zKSA+PSAxKTsKKworCWZvcmVhY2gobGMsIHJ0ZS0+ZnVu Y3Rpb25zKQorCXsKKwkJUmFuZ2VUYmxGdW5jdGlvbiAqcnRmdW5jID0gKFJhbmdlVGJsRnVuY3Rp b24gKikgbGZpcnN0KGxjKTsKKwkJVHlwZUZ1bmNDbGFzcyBmdW5jdHlwY2xhc3M7CisJCU9pZAkJ CWZ1bmNyZXR0eXBlOworCQlUdXBsZURlc2MJdHVwZGVzYzsKKworCQlmdW5jdHlwY2xhc3MgPSBn ZXRfZXhwcl9yZXN1bHRfdHlwZShydGZ1bmMtPmZ1bmNleHByLAorCQkJCQkJCQkJCQkmZnVuY3Jl dHR5cGUsICZ0dXBkZXNjKTsKKwkJaWYgKGZ1bmN0eXBjbGFzcyAhPSBUWVBFRlVOQ19TQ0FMQVIp CisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghT2lkSXNWYWxpZChmdW5jcmV0dHlwZSkgfHwKKwkJ CWZ1bmNyZXR0eXBlID09IFJFQ09SRE9JRCB8fAorCQkJZnVuY3JldHR5cGUgPT0gVk9JRE9JRCkK KwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoY29udGFpbl9zdWJwbGFucyhydGZ1bmMtPmZ1bmNl eHByKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFpc19mb3JlaWduX2V4cHIocm9vdCwgZmR3 cmVsLCAoRXhwciAqKSBydGZ1bmMtPmZ1bmNleHByKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisK KwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIEFzc2VzcyB3aGV0aGVyIHRoZSBqb2luIGJldHdl ZW4gaW5uZXIgYW5kIG91dGVyIHJlbGF0aW9ucyBjYW4gYmUgcHVzaGVkIGRvd24KICAqIHRvIHRo ZSBmb3JlaWduIHNlcnZlci4gQXMgYSBzaWRlIGVmZmVjdCwgc2F2ZSBpbmZvcm1hdGlvbiB3ZSBv YnRhaW4gaW4gdGhpcwpAQCAtNjYzNCw2ICs2OTg2LDggQEAgZm9yZWlnbl9qb2luX29rKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLCBKb2luVHlwZSBqb2ludHlwZSwKIAlQ Z0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvX2k7CiAJTGlzdENlbGwgICAqbGM7CiAJTGlzdAkgICAq am9pbmNsYXVzZXM7CisJYm9vbAkJb3V0ZXJfaXNfZnVuY3Rpb24gPSBmYWxzZTsKKwlib29sCQlp bm5lcl9pc19mdW5jdGlvbiA9IGZhbHNlOwogCiAJLyoKIAkgKiBXZSBzdXBwb3J0IHB1c2hpbmcg ZG93biBJTk5FUiwgTEVGVCwgUklHSFQsIEZVTEwgT1VURVIgYW5kIFNFTUkgam9pbnMuCkBAIC02 NjUyLDE1ICs3MDA2LDcwIEBAIGZvcmVpZ25fam9pbl9vayhQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqam9pbnJlbCwgSm9pblR5cGUgam9pbnR5cGUsCiAJCXJldHVybiBmYWxzZTsKIAog CS8qCi0JICogSWYgZWl0aGVyIG9mIHRoZSBqb2luaW5nIHJlbGF0aW9ucyBpcyBtYXJrZWQgYXMg dW5zYWZlIHRvIHB1c2hkb3duLCB0aGUKLQkgKiBqb2luIGNhbiBub3QgYmUgcHVzaGVkIGRvd24u CisJICogRGV0ZWN0IG1peGVkIChmb3JlaWduIHggZnVuY3Rpb24tUlRFKSBjYXNlcy4gIE9ubHkg SU5ORVIgam9pbnMgYXJlCisJICogc3VwcG9ydGVkIGluaXRpYWxseS4gIFdlIGRpc3BhdGNoIG9u IHJ0ZWtpbmQgaGVyZSBzbyB0aGF0IHRoZSBzYW1lCisJICogZnVuY3Rpb24gUlRFIGNhbiBiZSBh YnNvcmJlZCBpbnRvIGpvaW5zIG9uIG11bHRpcGxlIGZvcmVpZ24gc2VydmVycworCSAqIChlYWNo IGNhbGwgZ2V0cyBpdHMgb3duIHN0dWIgZnBpbmZvIGFuZCByZWNoZWNrcyBzaGlwcGFiaWxpdHkg Zm9yIHRoZQorCSAqIHNwZWNpZmljIHNlcnZlcikuCiAJICovCiAJZnBpbmZvID0gKFBnRmR3UmVs YXRpb25JbmZvICopIGpvaW5yZWwtPmZkd19wcml2YXRlOwotCWZwaW5mb19vID0gKFBnRmR3UmVs YXRpb25JbmZvICopIG91dGVycmVsLT5mZHdfcHJpdmF0ZTsKLQlmcGluZm9faSA9IChQZ0Zkd1Jl bGF0aW9uSW5mbyAqKSBpbm5lcnJlbC0+ZmR3X3ByaXZhdGU7Ci0JaWYgKCFmcGluZm9fbyB8fCAh ZnBpbmZvX28tPnB1c2hkb3duX3NhZmUgfHwKLQkJIWZwaW5mb19pIHx8ICFmcGluZm9faS0+cHVz aGRvd25fc2FmZSkKLQkJcmV0dXJuIGZhbHNlOworCWlmIChqb2ludHlwZSA9PSBKT0lOX0lOTkVS ICYmIGlubmVycmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTiAmJgorCQkoZnBpbmZvX28gPSAo UGdGZHdSZWxhdGlvbkluZm8gKikgb3V0ZXJyZWwtPmZkd19wcml2YXRlKSAmJgorCQlmcGluZm9f by0+cHVzaGRvd25fc2FmZSAmJgorCQlmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2socm9vdCwgaW5u ZXJyZWwsIG91dGVycmVsKSkKKwl7CisJCWlubmVyX2lzX2Z1bmN0aW9uID0gdHJ1ZTsKKwl9CisJ ZWxzZSBpZiAoam9pbnR5cGUgPT0gSk9JTl9JTk5FUiAmJiBvdXRlcnJlbC0+cnRla2luZCA9PSBS VEVfRlVOQ1RJT04gJiYKKwkJCSAoZnBpbmZvX2kgPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgaW5u ZXJyZWwtPmZkd19wcml2YXRlKSAmJgorCQkJIGZwaW5mb19pLT5wdXNoZG93bl9zYWZlICYmCisJ CQkgZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKHJvb3QsIG91dGVycmVsLCBpbm5lcnJlbCkpCisJ eworCQlvdXRlcl9pc19mdW5jdGlvbiA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCWZwaW5mb19v ID0gKFBnRmR3UmVsYXRpb25JbmZvICopIG91dGVycmVsLT5mZHdfcHJpdmF0ZTsKKwkJZnBpbmZv X2kgPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgaW5uZXJyZWwtPmZkd19wcml2YXRlOworCQlpZiAo IWZwaW5mb19vIHx8ICFmcGluZm9fby0+cHVzaGRvd25fc2FmZSB8fAorCQkJIWZwaW5mb19pIHx8 ICFmcGluZm9faS0+cHVzaGRvd25fc2FmZSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgor CSAqIElmIG9uZSBzaWRlIGlzIGEgZnVuY3Rpb24gUlRFLCBhbGxvY2F0ZSBhIHN0dWIgZnBpbmZv IHNvIHRoZSByZXN0IG9mCisJICogdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGNvc3QgZXN0aW1hdG9y IGNhbiB0cmVhdCBpdCB1bmlmb3JtbHkuICBXZSBoYW5kCisJICogdGhlIHN0dWIgdG8gdGhlIGpv aW5yZWwncyBkZXBhcnNlciB2aWEgdGhlIHNhbWUgcGF0aCB0aGUgZm9yZWlnbiBzaWRlCisJICog dXNlcywgYnV0IHdlIG5ldmVyIHBlcm1hbmVudGx5IGF0dGFjaCBpdCB0byB0aGUgZnVuY3Rpb24g cmVsJ3MKKwkgKiBmZHdfcHJpdmF0ZSAoZGlmZmVyZW50IGpvaW5yZWxzIG1heSBwYWlyIHRoZSBz YW1lIGZ1bmN0aW9uIFJURSB3aXRoCisJICogZGlmZmVyZW50IGZvcmVpZ24gc2VydmVycykuCisJ ICovCisJaWYgKGlubmVyX2lzX2Z1bmN0aW9uKQorCXsKKwkJZnBpbmZvX2kgPSBwYWxsb2MwX29i amVjdChQZ0Zkd1JlbGF0aW9uSW5mbyk7CisJCWZwaW5mb19pLT5wdXNoZG93bl9zYWZlID0gdHJ1 ZTsKKwkJZnBpbmZvX2ktPnNlcnZlciA9IGZwaW5mb19vLT5zZXJ2ZXI7CisJCWZwaW5mb19pLT5y ZWxhdGlvbl9uYW1lID0gcHNwcmludGYoIiV1IiwgaW5uZXJyZWwtPnJlbGlkKTsKKwkJZnBpbmZv X2ktPnJvd3MgPSBpbm5lcnJlbC0+cm93czsKKwkJZnBpbmZvX2ktPndpZHRoID0gaW5uZXJyZWwt PnJlbHRhcmdldC0+d2lkdGg7CisJCWZwaW5mb19pLT5yZXRyaWV2ZWRfcm93cyA9IGlubmVycmVs LT5yb3dzOworCQlmcGluZm9faS0+cmVsX3N0YXJ0dXBfY29zdCA9IDA7CisJCWZwaW5mb19pLT5y ZWxfdG90YWxfY29zdCA9IDA7CisJCWZwaW5mby0+aW5uZXJfZnVuY19mcGluZm8gPSBmcGluZm9f aTsKKwl9CisJZWxzZSBpZiAob3V0ZXJfaXNfZnVuY3Rpb24pCisJeworCQlmcGluZm9fbyA9IHBh bGxvYzBfb2JqZWN0KFBnRmR3UmVsYXRpb25JbmZvKTsKKwkJZnBpbmZvX28tPnB1c2hkb3duX3Nh ZmUgPSB0cnVlOworCQlmcGluZm9fby0+c2VydmVyID0gZnBpbmZvX2ktPnNlcnZlcjsKKwkJZnBp bmZvX28tPnJlbGF0aW9uX25hbWUgPSBwc3ByaW50ZigiJXUiLCBvdXRlcnJlbC0+cmVsaWQpOwor CQlmcGluZm9fby0+cm93cyA9IG91dGVycmVsLT5yb3dzOworCQlmcGluZm9fby0+d2lkdGggPSBv dXRlcnJlbC0+cmVsdGFyZ2V0LT53aWR0aDsKKwkJZnBpbmZvX28tPnJldHJpZXZlZF9yb3dzID0g b3V0ZXJyZWwtPnJvd3M7CisJCWZwaW5mb19vLT5yZWxfc3RhcnR1cF9jb3N0ID0gMDsKKwkJZnBp bmZvX28tPnJlbF90b3RhbF9jb3N0ID0gMDsKKwkJZnBpbmZvLT5vdXRlcl9mdW5jX2ZwaW5mbyA9 IGZwaW5mb19vOworCX0KIAogCS8qCiAJICogSWYgam9pbmluZyByZWxhdGlvbnMgaGF2ZSBsb2Nh bCBjb25kaXRpb25zLCB0aG9zZSBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9w b3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmggYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jl c19mZHcuaAppbmRleCBhMmJiMWZmMzUyYy4uNWIyZmZjZjA2ZjcgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3 L3Bvc3RncmVzX2Zkdy5oCkBAIC0xMDYsNiArMTA2LDE2IEBAIHR5cGVkZWYgc3RydWN0IFBnRmR3 UmVsYXRpb25JbmZvCiAJLyogam9pbmNsYXVzZXMgY29udGFpbnMgb25seSBKT0lOL09OIGNvbmRp dGlvbnMgZm9yIGFuIG91dGVyIGpvaW4gKi8KIAlMaXN0CSAgICpqb2luY2xhdXNlczsJLyogTGlz dCBvZiBSZXN0cmljdEluZm8gKi8KIAorCS8qCisJICogSWYgYSBGVU5DVElPTiBSVEUgd2FzIGFi c29yYmVkIGludG8gdGhpcyBqb2luLCB0aGVzZSBwb2ludCBhdCB0aGUgc3R1YgorCSAqIFBnRmR3 UmVsYXRpb25JbmZvIGZvciB0aGUgZnVuY3Rpb24gc2lkZSAocGFpcmVkIHdpdGggdGhlCisJICog b3V0ZXJyZWwvaW5uZXJyZWwpLCBzbyB0aGUgY29zdCBlc3RpbWF0b3IgYW5kIGRlcGFyc2VyIGNh biBmaW5kIGl0CisJICogd2l0aG91dCBjb25zdWx0aW5nIHRoZSBmdW5jdGlvbiByZWwncyBmZHdf cHJpdmF0ZS4gIEF0IG1vc3Qgb25lIG9mCisJICogb3V0ZXJfZnVuY19mcGluZm8vaW5uZXJfZnVu Y19mcGluZm8gaXMgc2V0LgorCSAqLworCXN0cnVjdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqb3V0ZXJf ZnVuY19mcGluZm87CisJc3RydWN0IFBnRmR3UmVsYXRpb25JbmZvICppbm5lcl9mdW5jX2ZwaW5m bzsKKwogCS8qIFVwcGVyIHJlbGF0aW9uIGluZm9ybWF0aW9uICovCiAJVXBwZXJSZWxhdGlvbktp bmQgc3RhZ2U7CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jl c19mZHcuc3FsIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKaW5k ZXggMjY3ZDNjMWE3ZTcuLmY0OWZiYzkzMTdlIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVz X2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbAorKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwv cG9zdGdyZXNfZmR3LnNxbApAQCAtNzkwLDYgKzc5MCwxODkgQEAgU0VMRUNUIHQxLmMxLCB0Mi5j MiBGUk9NIHY0IHQxIExFRlQgSk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZ IHQxLmMKIFNFTEVDVCB0MS5jMSwgdDIuYzIgRlJPTSB2NCB0MSBMRUZUIEpPSU4gZnQ1IHQyIE9O ICh0MS5jMSA9IHQyLmMxKSBPUkRFUiBCWSB0MS5jMSwgdDIuYzEgT0ZGU0VUIDEwIExJTUlUIDEw OwogQUxURVIgVklFVyB2NCBPV05FUiBUTyByZWdyZXNzX3ZpZXdfb3duZXI7CiAKKy0tID09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKy0tIEZvcmVpZ24tam9pbiB3aXRoIEZVTkNUSU9OIFJURSBwdXNoZG93biAoSU1NVVRB QkxFIGZ1bmN0aW9ucyBvbmx5KQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gSU1NVVRBQkxFIGZ1bmN0aW9u OiB1bm5lc3Qgb2YgY29uc3RhbnQgYXJyYXkgY2FuIGJlIHB1c2hlZCBkb3duCitFWFBMQUlOIChW RVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQxLCB1bm5l c3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1 LmlkIE9SREVSIEJZIHQxLmMxOworU0VMRUNUIHQxLmMxLCB0MS5jMyBGUk9NIGZ0MSB0MSwgdW5u ZXN0KEFSUkFZWzEsIDUsIDEwLCAxMDBdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0g dS5pZCBPUkRFUiBCWSB0MS5jMTsKKworLS0gSU1NVVRBQkxFIGZ1bmN0aW9uOiBnZW5lcmF0ZV9z ZXJpZXMgd2l0aCBjb25zdGFudCBhcmdzCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitT RUxFQ1QgdDEuYzEgRlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQor V0hFUkUgdDEuYzEgPSBnLmlkIE9SREVSIEJZIHQxLmMxOworU0VMRUNUIHQxLmMxIEZST00gZnQx IHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgQVMgZyhpZCkKK1dIRVJFIHQxLmMxID0gZy5pZCBP UkRFUiBCWSB0MS5jMTsKKworLS0gVk9MQVRJTEUgZnVuY3Rpb24gKHJhbmRvbSkgbXVzdCBOT1Qg YmUgcHVzaGVkIGRvd24KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5j MSBGUk9NIGZ0MSB0MSwgZ2VuZXJhdGVfc2VyaWVzKDEsIDQgKyAocmFuZG9tKCkgKiAwKTo6aW50 KSBBUyBnKGlkKQorV0hFUkUgdDEuYzEgPSBnLmlkOworCistLSBXSVRIIE9SRElOQUxJVFkgbXVz dCBOT1QgYmUgcHVzaGVkIGRvd24gKGxpbWl0YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbikK K0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdS5vcmQKK0ZST00g ZnQxIHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTBdOjppbnRbXSkgV0lUSCBPUkRJTkFMSVRZIEFT IHUoaWQsIG9yZCkKK1dIRVJFIHQxLmMxID0gdS5pZDsKKworLS0gU2FtZSBmdW5jdGlvbiBSVEUg am9pbmVkIHdpdGggdHdvIGRpZmZlcmVudCBmb3JlaWduIHNlcnZlcnM6IHBsYW5uZXIgcGlja3MK Ky0tIG9uZSBhYnNvcnB0aW9uICsgYSBsb2NhbCBqb2luIHdpdGggdGhlIHNlY29uZCBmb3JlaWdu IHNlcnZlci4gIFRoZSBmYWN0CistLSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBJTU1VVEFCTEUgbWFr ZXMgdGhpcyBzYWZlIGV2ZW4gaWYgYm90aCBzaWRlcyBjaG9zZSB0bworLS0gYWJzb3JiIGl0IGlu ZGVwZW5kZW50bHkuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEs IHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06 OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9IHUuaWQgT1JE RVIgQlkgdDEuYzE7CisKKy0tIENvc3QtYmFzZWQgc2VsZWN0aW9uIGJldHdlZW4gdHdvIGZvcmVp Z24gc2VydmVyczogZnQxICgiUyAxIi4iVCAxIikgaGFzCistLSAxMDAwIHJvd3MsIGZ0NiAoIlMg MSIuIlQgNCIpIGhhcyB+MzMgcm93cy4gIFRoZSBzYW1lIHF1ZXJ5IHNoYXBlIGdldHMgYQorLS0g ZGlmZmVyZW50IHB1c2gtZG93biB0YXJnZXQgZGVwZW5kaW5nIG9uIGEgcHJlZGljYXRlIHRoYXQg Y2hhbmdlcyB0aGUKKy0tIGVmZmVjdGl2ZSBjYXJkaW5hbGl0eSBvZiBvbmUgc2lkZSAtLSB0aGUg ZnVuY3Rpb24gImp1bXBzIiB0byB3aGljaGV2ZXIKKy0tIGZvcmVpZ24gc2NhbiBiZW5lZml0cyBt b3JlIGZyb20gYmVpbmcgcHJlLWZpbHRlcmVkLgorQU5BTFlaRSBmdDE7CitBTkFMWVpFIGZ0NjsK Ky0tIE5vIGV4dHJhIHByZWRpY2F0ZTogZnQxIGlzIHRoZSBiaWdnZXIgc2lkZSwgZnVuY3Rpb24g YWJzb3JiZWQgdGhlcmUuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEu YzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMywgNiwgOSwgMTIs IDE1LCAxOF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9 IHUuaWQ7CistLSBTZWxlY3RpdmUgcHJlZGljYXRlIG9uIGZ0MS5jMyAobm90IGluIHRoZSBlcWNs YXNzKSBzaHJpbmtzIGZ0MSB0byBhCistLSBoYW5kZnVsIG9mIHJlbW90ZSByb3dzOyBub3cgZnQ2 IGlzIGVmZmVjdGl2ZWx5IHRoZSBiaWdnZXIgc2lkZSBhbmQgdGhlCistLSBmdW5jdGlvbiBpcyBh YnNvcmJlZCBpbnRvIGZ0NiBpbnN0ZWFkLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQor U0VMRUNUIHQxLmMxLCB0Mi5jMQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMs IDYsIDksIDEyLCAxNSwgMThdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBB TkQgdDIuYzEgPSB1LmlkIEFORCB0MS5jMyA8ICcwMDAxMCc7CisKKy0tIFRoZSByZW1haW5pbmcg c2NlbmFyaW9zIHJldXNlIGEgZGVkaWNhdGVkIGZvcmVpZ24gdGFibGUgdG8gY292ZXIgdGhlCist LSBjb3JuZXIgY2FzZXMgb2YgRlVOQ1RJT04gUlRFIHB1c2gtZG93bjogZnVuY3Rpb24tZmlyc3Qg RlJPTSwgcmVjb3JkCistLSByZXR1cm4gdHlwZSByZWplY3Rpb24sIHdob2xlLXJvdyByZWZlcmVu Y2UsIFVQREFURS4uLkZST00uLi4sIGFuZAorLS0gbXVsdGktZnVuY3Rpb24gUk9XUyBGUk9NLgor Q1JFQVRFIFRBQkxFIGJhc2VfdGJsX2ZuIChhIGludCwgYiBpbnQpOworSU5TRVJUIElOVE8gYmFz ZV90YmxfZm4KKyAgU0VMRUNUIGcsIGcgKyAxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMzAp IGc7CitDUkVBVEUgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsIChhIGludCwgYiBpbnQpCisgIFNF UlZFUiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1lICdiYXNlX3RibF9mbicpOworCistLSBU aGUgZnVuY3Rpb24gUlRFIGFwcGVhcnMgZmlyc3QgaW4gRlJPTTsgdGhlIGZvcmVpZ24gcmVsYXRp b24gbXVzdCBiZQorLS0gZm91bmQgYnkgc2Nhbm5pbmcgZnNfYmFzZV9yZWxpZHMgZm9yIGFuIFJU RV9SRUxBVElPTiByYXRoZXIgdGhhbgorLS0gdXNpbmcgc2Nhbi0+ZnNfcmVsaWQgYmxpbmRseS4K K0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gdW5uZXN0KGFycmF5 WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIgV0hFUkUgci5hID0gbjsKK1NFTEVDVCAqIEZST00g dW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIKK1dIRVJFIHIuYSA9IG4gT1JE RVIgQlkgci5hOworCistLSBBIGZ1bmN0aW9uIHJldHVybmluZyByZWNvcmQgKGNvbXBvc2l0ZSkg aXMgZm9yYmlkZGVuOyBwdXNoaW5nIGl0CistLSB3b3VsZCB5aWVsZCBhIHJlbW90ZSAiY29sdW1u IGRlZmluaXRpb24gbGlzdCBpcyByZXF1aXJlZCIgZXJyb3IuCistLSBmdW5jdGlvbl9ydGVfcHVz aGRvd25fb2soKSByZWplY3RzIGl0IHZpYSBUWVBFRlVOQ19TQ0FMQVIuCitDUkVBVEUgT1IgUkVQ TEFDRSBGVU5DVElPTiBmX3JldF9yZWNvcmQoKSBSRVRVUk5TIHJlY29yZCBBUyAkJAorICBTRUxF Q1QgKDEsIDIpOjpyZWNvcmQKKyQkIExBTkdVQUdFIFNRTCBJTU1VVEFCTEU7CitFWFBMQUlOIChW RVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgcyBGUk9NIHJlbW90ZV90YmwgcnQsIGZfcmV0X3Jl Y29yZCgpIEFTIHMoYSBpbnQsIGIgaW50KQorV0hFUkUgcy5hID0gcnQuYTsKK0RST1AgRlVOQ1RJ T04gZl9yZXRfcmVjb3JkKCk7CisKKy0tIFVQREFURSAuLi4gRlJPTSB1bm5lc3QoKSB3aXRoIGEg Y29tcGxleCBlbGVtZW50IHR5cGU7IGFyZWEoYm94KQorLS0geWllbGRzIHRoZSB2YWx1ZSB0byBt YXRjaC4gIFRoZSBsb2NraW5nIG1hY2hpbmVyeSBmb3IgdGhlCistLSBub24tcmVsYXRpb24gUlRF IGdlbmVyYXRlcyBhIHdob2xlLXJvdyBWYXIgdGhhdCBkZXBhcnNlQ29sdW1uUmVmCistLSBlbWl0 cyBhcyBST1coZjxydGk+LmMxLCAuLi4pLgorVVBEQVRFIHJlbW90ZV90YmwgciBTRVQgYiA9IDk5 OQorRlJPTSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKK1dI RVJFIHIuYSA9IGFyZWEodC5ieCk7CitTRUxFQ1QgKiBGUk9NIHJlbW90ZV90YmwgV0hFUkUgYSBJ TiAoMjMsIDI0LCAyNSkgT1JERVIgQlkgYTsKKworLS0gVGhlIHNhbWUgc2hhcGUgd2l0aCBDQVNF IGFuZCBSRVRVUk5JTkc7IGV4ZXJjaXNlcyB0aGUgRGlyZWN0TW9kaWZ5CistLSBwYXRoIGFuZCB0 aGUgZXhlY3V0b3IncyB0dXBsZS1kZXNjIHJlY29uc3RydWN0aW9uLgorVVBEQVRFIHJlbW90ZV90 YmwgcgorICAgU0VUIGIgPSBDQVNFIFdIRU4gcmFuZG9tKCkgPj0gMCBUSEVOIDUgRUxTRSAwIEVO RAorICBGUk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddKSBBUyB0KGJ4KQor IFdIRVJFIHIuYSA9IGFyZWEodC5ieCkgUkVUVVJOSU5HIGEsIGI7CisKKy0tIFJFVFVSTklORyBh IHdob2xlLXJvdyByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIFJURS4gIFdpdGhvdXQgdGhlCist LSBwZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhIGJlaW5nIHByZXNlcnZlZCBvbiB0aGUgRGlyZWN0 TW9kaWZ5IHBhdGgKKy0tIChGZHdEaXJlY3RNb2RpZnlQcml2YXRlRnVuY3Rpb25zIC8gRmR3RGly ZWN0TW9kaWZ5UHJpdmF0ZU1pblJUSW5kZXgpLAorLS0gdGhpcyB3b3VsZCBmYWlsIHdpdGggImlu cHV0IG9mIGFub255bW91cyBjb21wb3NpdGUgdHlwZXMgaXMgbm90CistLSBpbXBsZW1lbnRlZCIu CitVUERBVEUgcmVtb3RlX3RibCByIFNFVCBiID0gNworICBGUk9NIHVubmVzdChhcnJheVtib3gg JygoMiwzKSwoLTIsLTMpKSddLAorICAgICAgICAgICAgICBhcnJheVtpbnQgJzEnXSkgQVMgdChi eCwgaSkKKyBXSEVSRSByLmEgPSBhcmVhKHQuYngpIFJFVFVSTklORyBhLCBiLCB0OworCistLSBS T1dTIEZST00gKC4uLikgd2l0aCBzZXZlcmFsIGZ1bmN0aW9ucy4gIEZvcmNlIHB1c2hkb3duIGJl Y2F1c2UgdGhlCistLSBjb3N0IG1vZGVsIG90aGVyd2lzZSBwaWNrcyBhIGxvY2FsIHBsYW4uCitT RVQgZW5hYmxlX2hhc2hqb2luID0gb2ZmOworU0VUIGVuYWJsZV9tZXJnZWpvaW4gPSBvZmY7CitT RVQgZW5hYmxlX25lc3Rsb29wID0gb2ZmOworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQor U0VMRUNUIHIuYSwgdC5uLCB0LnMKKyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5u ZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Vu ZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIg Qlkgci5hOworU0VMRUNUIHIuYSwgdC5uLCB0LnMKKyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1Mg RlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0 Lm4gT1JERVIgQlkgci5hOworCistLSBXaG9sZS1yb3cgVmFyIG9uIHRoZSBhYnNvcmJlZCBmdW5j dGlvbiBzaWRlIChlLmcuIHZpYSBhIGNhc3QgdG8KKy0tIHRleHQpLiAgRXhlcmNpc2VzIGJvdGgg ZGVwYXJzZUNvbHVtblJlZiB3aG9sZS1yb3cgYnJhbmNoIGFuZCB0aGUKKy0tIGdldF90dXBkZXNj X2Zvcl9qb2luX3NjYW5fdHVwbGVzKCkgUlRFX0ZVTkNUSU9OIG1ldGFkYXRhIHBhdGguCitFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVt b3RlX3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMp CisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKK1NFTEVDVCB0Ojp0ZXh0LCByLmEKKyAg RlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFT IHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5hOworCistLSBDaGVjayB3aG9s ZS1yb3cgVmFyIHJlcHJlc2VudGVkIGJ5IGZ1bmN0aW9uIG9uIHRoZSBudWxsYWJsZQorLS0gbGVm dCBqb2luIHNpZGUKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB1LCBmdDUu YzEsIGZ0NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lOCisoZnQ0IEpPSU4g dW5uZXN0KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1MikgT04gZnQ0LmMxPXUx KQorT04gZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVSIEJZIGZ0NS5jMTsK K1NFTEVDVCB1LCBmdDUuYzEsIGZ0NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBK T0lOCisoZnQ0IEpPSU4gdW5uZXN0KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1 MikgT04gZnQ0LmMxPXUxKQorT04gZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9S REVSIEJZIGZ0NS5jMTsKK1JFU0VUIGVuYWJsZV9oYXNoam9pbjsKK1JFU0VUIGVuYWJsZV9tZXJn ZWpvaW47CitSRVNFVCBlbmFibGVfbmVzdGxvb3A7CisKKy0tIFZvbGF0aWxlIGZ1bmN0aW9uIGlu IFJPV1MgRlJPTSBkaXNxdWFsaWZpZXMgdGhlIHdob2xlIFJURS4KK0VYUExBSU4gKFZFUkJPU0Us IENPU1RTIE9GRikKK1NFTEVDVCByLmEgRlJPTSByZW1vdGVfdGJsIHIsCisgICAgICAgICAgICAg ICAgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDEsIDQgKyAocmFuZG9tKCkgKiAwKTo6aW50KSkgQVMg dChuLCBzKQorIFdIRVJFIHIuYSA9IHQubjsKKworLS0gTEFURVJBTCBmdW5jdGlvbiByZWZlcmVu Y2luZyBhIGZvcmVpZ24gVmFyOiBwb3N0Z3Jlc19mZHcncworLS0gZm9yZWlnbi1qb2luIHB1c2hk b3duIHJlamVjdHMgdGhpcyB2aWEgdGhlIGpvaW5yZWwtPmxhdGVyYWxfcmVsaWRzCistLSBjaGVj azsgdGhlIHBsYW4gaXMgdGhlcmVmb3JlIGEgbG9jYWwgTmVzdExvb3AgKyBGdW5jdGlvblNjYW4u CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0LnggRlJPTSByZW1v dGVfdGJsIHIsIExBVEVSQUwgdW5uZXN0KGFycmF5W3IuYV0pIEFTIHQoeCkKK1dIRVJFIHIuYSA8 PSAzIE9SREVSIEJZIHIuYTsKKworLS0gT3V0ZXIgam9pbnMgd2l0aCB0aGUgZnVuY3Rpb24gUlRF IGFyZSBub3QgcHVzaGVkIGRvd24gKG9ubHkgSU5ORVIKKy0tIGpvaW5zIGFyZSBzdXBwb3J0ZWQg YnkgZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKCkpLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMg T0ZGKQorU0VMRUNUIHIuYSwgdC5uIEZST00gcmVtb3RlX3RibCByCisgICAgIExFRlQgSk9JTiB1 bm5lc3QoYXJyYXlbMSwgMiwgM10pIEFTIHQobikgT04gci5hID0gdC5uCisgV0hFUkUgci5hIDw9 IDUgT1JERVIgQlkgci5hOworCistLSBTRU1JIGpvaW4gKEVYSVNUUykgd2l0aCBhIGZ1bmN0aW9u IFJURSBpcyBhbHNvIG5vdCBwdXNoZWQgZG93bi4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9G RikKK1NFTEVDVCByLmEgRlJPTSByZW1vdGVfdGJsIHIKKyBXSEVSRSBFWElTVFMgKFNFTEVDVCAx IEZST00gdW5uZXN0KGFycmF5WzMsIDYsIDldKSBBUyB0KG4pIFdIRVJFIHQubiA9IHIuYSkKKyBP UkRFUiBCWSByLmE7CisKK0RST1AgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsOworRFJPUCBUQUJM RSBiYXNlX3RibF9mbjsKKwogLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIENoZWNrIHRoYXQgdXNlcmlkIHRv IHVzZSB3aGVuIHF1ZXJ5aW5nIHRoZSByZW1vdGUgdGFibGUgaXMgY29ycmVjdGx5CiAtLSBwcm9w YWdhdGVkIGludG8gZm9yZWlnbiByZWxzIHByZXNlbnQgaW4gc3VicXVlcmllcyB1bmRlciBhbiBV TklPTiBBTEwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUu YyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYwppbmRleCAzZmMyYzJmNzFk MC4uZjIxYWUxYmFlYjIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3Jl bG5vZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMKQEAgLTc0 Niw2ICs3NDYsMzAgQEAgc2V0X2ZvcmVpZ25fcmVsX3Byb3BlcnRpZXMoUmVsT3B0SW5mbyAqam9p bnJlbCwgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAogCQkJam9pbnJlbC0+ZmR3cm91dGluZSA9IG91 dGVyX3JlbC0+ZmR3cm91dGluZTsKIAkJfQogCX0KKwllbHNlIGlmIChPaWRJc1ZhbGlkKG91dGVy X3JlbC0+c2VydmVyaWQpICYmCisJCQkgaW5uZXJfcmVsLT5ydGVraW5kID09IFJURV9GVU5DVElP TikKKwl7CisJCS8qCisJCSAqIE9uZSBzaWRlIGlzIGEgZm9yZWlnbiByZWxhdGlvbiwgdGhlIG90 aGVyIHNpZGUgaXMgYSBmdW5jdGlvbiBSVEUuCisJCSAqIElmIHRoZSBmdW5jdGlvbiBpcyBJTU1V VEFCTEUsIHRoZSBGRFcgY2FuIGFic29yYiB0aGUgZnVuY3Rpb24gY2FsbAorCQkgKiBpbnRvIHRo ZSByZW1vdGUgcXVlcnkgKHRoZSByZXN1bHQgaXMgaWRlbnRpY2FsIHJlZ2FyZGxlc3Mgb2Ygd2hp Y2gKKwkJICogc2VydmVyIGV2YWx1YXRlcyBpdCkuICBMZXQgdGhlIEZEVyBkZWNpZGUgd2hldGhl ciB0aGUgam9pbiBpcworCQkgKiBhY3R1YWxseSBzaGlwcGFibGU7IGhlcmUgd2UganVzdCBwcm9w YWdhdGUgdGhlIEZEVyByb3V0aW5lIHNvIHRoZQorCQkgKiBGRFcgZ2V0cyBhIGNoYW5jZS4KKwkJ ICovCisJCWpvaW5yZWwtPnNlcnZlcmlkID0gb3V0ZXJfcmVsLT5zZXJ2ZXJpZDsKKwkJam9pbnJl bC0+dXNlcmlkID0gb3V0ZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5yZWwtPnVzZXJpZGlzY3VycmVu dCA9IG91dGVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lucmVsLT5mZHdyb3V0aW5lID0g b3V0ZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KKwllbHNlIGlmIChPaWRJc1ZhbGlkKGlubmVyX3Jl bC0+c2VydmVyaWQpICYmCisJCQkgb3V0ZXJfcmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTikK Kwl7CisJCWpvaW5yZWwtPnNlcnZlcmlkID0gaW5uZXJfcmVsLT5zZXJ2ZXJpZDsKKwkJam9pbnJl bC0+dXNlcmlkID0gaW5uZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5yZWwtPnVzZXJpZGlzY3VycmVu dCA9IGlubmVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lucmVsLT5mZHdyb3V0aW5lID0g aW5uZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KIH0KIAogLyoKLS0gCjIuNDMuMAoK --=_bfa75c4dcc388950701962bdfbdb0b65--