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.98.2) (envelope-from ) id 1xByOB-00000003UD9-0abu for pgsql-hackers@arkaria.postgresql.org; Wed, 30 Sep 2026 17:46:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.98.2) (envelope-from ) id 1xByO9-00000003TAl-3EH1 for pgsql-hackers@arkaria.postgresql.org; Wed, 30 Sep 2026 17:46:41 +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.98.2) (envelope-from ) id 1xByO8-00000003TAd-3Tkb for pgsql-hackers@lists.postgresql.org; Wed, 30 Sep 2026 17:46:41 +0000 Received: from mail-ej2-x0d.google.com ([2a00:1450:4864:34::d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1xByO3-000000024cC-21DN for pgsql-hackers@lists.postgresql.org; Wed, 30 Sep 2026 17:46:39 +0000 Received: by mail-ej2-x0d.google.com with SMTP id a640c23a62f3a-c2e3507d4a9so5596466b.0 for ; Wed, 30 Sep 2026 10:46:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790790394; x=1791395194; darn=lists.postgresql.org; h=in-reply-to:content-language:references:cc:to:subject:from :user-agent:mime-version:date:message-id:content-type:from:to:cc :subject:date:message-id:reply-to:content-type; bh=WnFPsSCu7ZZ6ks+X6xzd9XvsmAQPaeMMQ6/GVrpk1iE=; b=a/0DuWWG8TPk6eYC8oPx76ZE7KHs3WXPW9PcvJ7Ood6Y7Ly7OjQJFvgqI+px/ldsi2 DLmpdotdo7UJ3lh4zjCt8Yn384qCKkuor8wQrugM54W3g6y57ZRBfTYCJ17jaPV+YeVz HQWUHkCVQb+OQFE1qQc36IAj2dTn7Abo+X879qW1JQoktKMJTGMGjwT34ipQpf6624Hx dutY6/HpVQudyvPwXu4PI3gxQdTyuBKOKv/Bjse9BDb5+stO3txNDHYQGpSi59zDkK+z n70TDkr3m+nkGy9qri77Sq+l5rYrBMo78i6FOW96ofgaGLZmdTqL247MVCPurJWyyBYL tL5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790790394; x=1791395194; h=in-reply-to:content-language:references:cc:to:subject:from :user-agent:mime-version:date:message-id:content-type:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=WnFPsSCu7ZZ6ks+X6xzd9XvsmAQPaeMMQ6/GVrpk1iE=; b=HQIfn2F4FyhX1aS2VahPxA+pINvIRJTwpe2WnoQwr4pd7jrfr49dUXqMJpEgq+Hpo9 5atZf3OWH8L6iFicuqd+Bq8bImDZKT762oEk8wOerkJ5JwUWrToPnaSe7HWIIf/X2k5x NZCgPxTODCaBKNqXUVDE5LqjR39qUOsLHkn1saFE12ftUVbyshXhG0ijoZQuhL8NAp+K fGrbfqGdAthXUI3Ffjamv60xSRyoE0HFOdkwZjhSjeNwkKIRWVSiZSvbc2Ub6aMrEiqb TJvgARhOEsnPoODNUN3Zws3p16UO7XiAheX35CnzSW8FxGv0lohyQevOmxE63zRaMsE2 3LKw== X-Gm-Message-State: AFuF++mYo0qVx9nGR0FeN40iHWhxX6KFhB5pN3h3www079dF8jBK7TtY w5PlgUbhlvMLaeznODw1mjshAxG+K1m3h5HaQMjyMSecBiC9JwOK4O9WX318ganh X-Gm-Gg: AYBFou3B911CUNUJGRrWhg2kbLRFo1dok8WpvY4fUQUQ49jzMObJcLgBCPkKeBdJ/aN /hIZ4oA6nz1cceF0w6JQqK8vbp50r1RgVEBjBhl90tDWa4oiJqwOqtgVerKrkcE/UP1VAudgjl0 GEYKIlCDzAI7JEMo6Bp+oAk6iu6slj4xR1CgFn9Dqqv1Sp6fwgfiNK/ZEd40hiT/820Q+bQv53h +3F4di9508EN87sGIgM3St3LhKUUj7PG2GODGk4toXqKKYyaWExo5DGEDc+GCIRpqBrbli3VSDI mee2Xkmf69szESf5lY2i4uZIvVMArhwqznX1xqo/sRo2BvZpYS0Friqctf4bddbBU/qeaHT5xYL 40U0ROI8JQltLKG/C4F5voGhXFrk0kOvMuWqNDxL6Kp50i4VJKS719Fg3WvUhL0DqUpCJJ6pBG2 HYaRUdSSA0juSt4pTTUD2qBgt6DtnTDzaFyYIYcRH/FmFMfDhKlFlfvXCX8XlzuNpRojPwmb+YW HTYwQPkSd/PJKTWzu6HgsEl/qMVgUKohENyiTNoBkptN340TF0= X-Received: by 2002:a17:907:3f90:b0:c25:c54d:d1a2 with SMTP id a640c23a62f3a-c2e23cdafdfmr183785466b.18.1790790393655; Wed, 30 Sep 2026 10:46:33 -0700 (PDT) Received: from [192.168.0.161] (c151-177-23-39.bredband.tele2.se. [151.177.23.39]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2e31a3eb32sm45113866b.3.2026.09.30.10.46.29 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 30 Sep 2026 10:46:31 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------hJmwxdXnn3IZHmjJcKWC310l" Message-ID: <39bc9cec-009d-4712-8212-aa17a9facb0f@gmail.com> Date: Wed, 30 Sep 2026 19:46:25 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Mats Kindahl Subject: Re: Recovery does not honor io_combine_limit, causing IOPS saturation To: Andrey Borodin , Markos Fountoulakis Cc: PostgreSQL Hackers References: <30e5bab4-8f61-4f03-9cec-e486540a78fb@gmail.com> <1c9fe4ba-1f49-4116-9c44-add3ed0310e5@planetscale.com> Content-Language: en-US In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------hJmwxdXnn3IZHmjJcKWC310l Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Andrey, Markos, Thank you for reviewing this. Here is a new patch fixing the bug that Andrey found. I need to get back to you regarding the benchmarks. Best wishes, Mats Kindahl On 9/14/26 20:44, Andrey Borodin wrote: > Hi Mats, Markos, > > Mats, in the original gp3 setup, did you also measure fewer device-level > reads and shorter recovery time with the normal readahead settings? > > I'd also be interested in replay performance with WAL and relation pages > already cached. Fewer syscalls could help even when the kernel already > combines disk reads, but does that saving outweigh the extra per-page > memcpy in this implementation? > > Looking at v1, I think there is a cache-validity issue with streaming: > >> + if (readSource == XLOG_FROM_STREAM) >> + wanted = Min(wanted, readLen); >> ... >> + wanted = Max(wanted, XLOG_BLCKSZ); > readLen is the valid prefix of the requested page, not the amount of > available WAL from that page onwards. It is at most XLOG_BLCKSZ, so > these bounds also leave streaming reads at one page regardless of > io_combine_limit. > > More importantly, when only part of the page has arrived, pread() still > reads the whole page and readAheadLen records the full result. Once > more WAL arrives, XLogPageRead() can be called again for the same page > with a larger reqLen. The new cache then hits and returns the old copy, > including bytes that were not valid when it was filled. > > Should the cache track how many bytes were valid at the time of the > read, and refill when reqLen exceeds that prefix? The available WAL > distance from targetPagePtr to flushedUpto could separately bound the > combined read size. > > Thanks! > > > Best regards, Andrey Borodin. --------------hJmwxdXnn3IZHmjJcKWC310l Content-Type: text/x-patch; charset=UTF-8; name="v2.0001-Combine-WAL-segment-reads-during-recovery-into-large.patch" Content-Disposition: attachment; filename*0="v2.0001-Combine-WAL-segment-reads-during-recovery-into-large"; filename*1=".patch" Content-Transfer-Encoding: base64 RnJvbSA0NWMzYTRkNWQ2YTYzYTE0NDM1YTY3YzFlODUyYjYwOTdiZTI0ZWQ1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRzIEtpbmRhaGwgPG1hdHNAa2luZGFobC5uZXQ+ CkRhdGU6IFR1ZSwgMjEgSnVsIDIwMjYgMDk6NDk6NTggKzAyMDAKU3ViamVjdDogQ29tYmlu ZSBXQUwgc2VnbWVudCByZWFkcyBkdXJpbmcgcmVjb3ZlcnkgaW50byBsYXJnZXIgcHJlYWQo KSBjYWxscwoKWExvZ1BhZ2VSZWFkKCkgdW5jb25kaXRpb25hbGx5IHJlYWQgZXhhY3RseSBv bmUgWExPR19CTENLU1ogcGFnZSBwZXIKcHJlYWQoKSBjYWxsIHJlZ2FyZGxlc3Mgb2YgaG93 IG11Y2ggbW9yZSBvZiB0aGUgc2VnbWVudCB3YXMgYWxyZWFkeQprbm93biB0byBiZSBzYWZl bHkgcmVhZGFibGUuCgpUaGlzIG1lYW5zIHVwIHRvIH4zMnggbW9yZSBJL08gb3BlcmF0aW9u cyB0aGFuIG5lY2Vzc2FyeSBmb3Igc2VxdWVudGlhbApXQUwgcmVwbGF5LCBzaW5jZSBhIHNp bmdsZSBwcmVhZCgpIHJlcXVlc3QgY291bGQgaW5zdGVhZCBjb3ZlciB1cCB0bwppb19jb21i aW5lX2xpbWl0IHBhZ2VzLgoKQWRkIGEgcmVhZC1haGVhZCBjYWNoZSBwcml2YXRlIHRvIFhM b2dQYWdlUmVhZCgpIGJ1dCBrZWVwIHRoZSBleGlzdGluZwp1c2FnZSBvZiByZXR1cm5pbmcg YSBzaW5nbGUgWExPR19CTENLU1ogcGFnZSBmb3IgZWFjaCBjYWxsLiBPbiBhIG1pc3MsCnJl YWQgYXMgbWFueSBwYWdlcyBhcyBhcmUgc2FmZSBpbiBvbmUgcHJlYWQoKSBpbnRvIHRoZSBj YWNoZSAodXAgdG8KaW9fY29tYmluZV9saW1pdCBwYWdlcykuIE9uIGEgaGl0LCBtZW1jcHkg dGhlIHJlcXVlc3RlZCBwYWdlIG91dCBvZiB0aGUKY2FjaGUuCgpBbHNvIGludHJvZHVjZXMg YSBuZXcgWGxvZ0ZpbGVDbG9zZSgpIGhlbHBlciB0aGF0IGFsc28gaW52YWxpZGF0ZXMgdGhl CmNhY2hlIGFuZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIGV4cGxpY2l0bHkgY2xvc2luZyB0aGUg ZmlsZSBlYWNoIHRpbWUuCgpGb3IgWExPR19GUk9NX1NUUkVBTSwgYSBzZWdtZW50IGZpbGUg aXMgcHJlLXNpemVkIGFoZWFkIG9mIHdoYXQgdGhlCndhbHJlY2VpdmVyIGhhcyBhY3R1YWxs eSBmbHVzaGVkLCBzbyBwcmVhZCgpIGNhbiBzaWxlbnRseSByZXR1cm4gYnl0ZXMKYmV5b25k IHdoYXQgd2FzIHJlYWxseSB2YWxpZCBhdCBmaWxsIHRpbWUuIFRyYWNrIGhvdyBtYW55IGJ5 dGVzIHdlcmUKYWN0dWFsbHkga25vd24gdG8gYmUgdmFsaWQgd2hlbiB0aGUgY2FjaGUgd2Fz IGZpbGxlZCwgYW5kIGNvbnNpZGVyIGl0IGEKY2FjaGUgbWlzcyBpZiBhIGxhdGVyIGNhbGwg aGF2ZSBtb3JlIHZhbGlkIGRhdGEuCgpBZGQgYSBUQVAgdGVzdCBleGVyY2lzaW5nIHRoaXMg dmlhIGEgbmV3IGluamVjdGlvbiBwb2ludCB0aGF0IHBhdXNlcyB0aGUKc3RhcnR1cCBwcm9j ZXNzIHJpZ2h0IGFmdGVyIGEgc3RyZWFtaW5nIGZpbGwsIHNvIHRoZSB0ZXN0IGNhbiBmb3Jj ZSBtb3JlCldBTCB0byBsYW5kIG9uIGRpc2sgYmVmb3JlIHRoZSBuZXh0IHJlYWQgb2YgdGhh dCBzYW1lIHBhZ2UuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292 ZXJ5LmMgICAgIHwgMjU5ICsrKysrKysrLS0tCiBzcmMvdGVzdC9wZXJsL1Bvc3RncmVTUUwv VGVzdC9SZWNvdmVyeS5wbSAgICAgfCA0NDAgKysrKysrKysrKysrKysrKysrCiBzcmMvdGVz dC9wZXJsL1Bvc3RncmVTUUwvVGVzdC9VdGlscy5wbSAgICAgICAgfCAgMjUgKwogc3JjL3Rl c3QvcmVjb3ZlcnkvYmVuY2gvcmVjb3ZlcnlfYmVuY2gucGwgICAgIHwgMzcwICsrKy0tLS0t LS0tLS0tLQogc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQgICAgICAgICAgICAgICAg IHwgICAxICsKIC4uLi90LzA1NV93YWxfc3RyZWFtX3JlYWRhaGVhZF9jYWNoZS5wbCAgICAg ICB8IDE1MyArKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgODg2IGluc2VydGlvbnMoKyksIDM2 MiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9wZXJsL1Bvc3Rn cmVTUUwvVGVzdC9SZWNvdmVyeS5wbQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3Jl Y292ZXJ5L3QvMDU1X3dhbF9zdHJlYW1fcmVhZGFoZWFkX2NhY2hlLnBsCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMgYi9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYwppbmRleCA1ZjNiMDY1Yjg5NC4u N2IyMWQ3MDIzNDEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2dyZWNvdmVyeS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNv dmVyeS5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAicmVwbGljYXRpb24vc2xvdC5o IgogI2luY2x1ZGUgInJlcGxpY2F0aW9uL3Nsb3RzeW5jLmgiCiAjaW5jbHVkZSAicmVwbGlj YXRpb24vd2FscmVjZWl2ZXIuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgogI2lu Y2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2lwYy5oIgogI2luY2x1 ZGUgInN0b3JhZ2UvbGF0Y2guaCIKQEAgLTYzLDYgKzY0LDggQEAKICNpbmNsdWRlICJ1dGls cy9mbWdycHJvdG9zLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCiAjaW5jbHVkZSAidXRp bHMvZ3VjX2hvb2tzLmgiCisjaW5jbHVkZSAidXRpbHMvaW5qZWN0aW9uX3BvaW50LmgiCisj aW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9wZ3N0YXRfaW50 ZXJuYWwuaCIKICNpbmNsdWRlICJ1dGlscy9wZ19sc24uaCIKICNpbmNsdWRlICJ1dGlscy9w c19zdGF0dXMuaCIKQEAgLTIzOCw2ICsyNDEsMzMgQEAgc3RhdGljIHVpbnQzMiByZWFkT2Zm ID0gMDsKIHN0YXRpYyB1aW50MzIgcmVhZExlbiA9IDA7CiBzdGF0aWMgWExvZ1NvdXJjZSBy ZWFkU291cmNlID0gWExPR19GUk9NX0FOWTsKIAorLyoKKyAqIFJlYWQtYWhlYWQgY2FjaGUg Zm9yIFdBTCBzZWdtZW50IHJlYWRzLCBhbGxvY2F0ZWQgb25jZSBieSBJbml0V2FsUmVjb3Zl cnkoKQorICogYW5kIGZpbGxlZCBieSBYTG9nUGFnZVJlYWQoKSB3aXRoIHVwIHRvIGlvX2Nv bWJpbmVfbGltaXQgWExPR19CTENLU1ogcGFnZXMgaW4KKyAqIGEgc2luZ2xlIHByZWFkKCku CisgKgorICogVGhpcyBpcyBwcml2YXRlIHRvIFhMb2dQYWdlUmVhZCgpIGFuZCBkb2VzIG5v dCBjaGFuZ2UgdGhlIHBhZ2UgcmVhZCBjb250cmFjdDoKKyAqIGNhbGxlcnMgc3RpbGwgZ2V0 IGJhY2sgb25lIFhMT0dfQkxDS1NaIHBhZ2UgcGVyIGNhbGwgaW4gdGhlIGNhbGxlci1zdXBw bGllZAorICogYnVmZmVyLgorICoKKyAqIElmIHJlYWRBaGVhZExlbiA9PSAwIG1lYW5zIHRo ZSBjYWNoZSBpcyBlbXB0eSBvciBpbnZhbGlkIGFuZCBtdXN0IGJlIHJlc2V0IHRvCisgKiAw IGF0IGV2ZXJ5IHBvaW50IHRoYXQgYWxyZWFkeSBjbG9zZXMgb3Igb3RoZXJ3aXNlIGludmFs aWRhdGVzIHJlYWRGaWxlIChzZWUKKyAqIFhMb2dSZWFkQWhlYWRJbnZhbGlkYXRlKCkpLgor ICoKKyAqIHJlYWRBaGVhZFZhbGlkIHRyYWNrcywgc2VwYXJhdGVseSBmcm9tIHJlYWRBaGVh ZExlbiwgaG93IG1hbnkgYnl0ZXMgc3RhcnRpbmcKKyAqIGF0IHJlYWRBaGVhZE9mZiB3ZXJl IGFjdHVhbGx5IGtub3duIHRvIGJlIHZhbGlkIFdBTCBjb250ZW50IGF0IHRoZSB0aW1lIHRo ZXkKKyAqIHdlcmUgcmVhZC4gRm9yIFhMT0dfRlJPTV9BUkNISVZFL1hMT0dfRlJPTV9QR19X QUwgdGhpcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMKKyAqIHJlYWRBaGVhZExlbi4gRm9yIFhM T0dfRlJPTV9TVFJFQU0gaXQgaXMgbm90OiB0aGUgc2VnbWVudCBmaWxlIGlzIGJlaW5nCisg KiBhY3RpdmVseSB3cml0dGVuIGludG8gYnkgdGhlIHdhbHJlY2VpdmVyIGFuZCBwcmVhZCgp IGhhcHBpbHkgcmV0dXJucyBieXRlcworICogYmV5b25kIHdoYXQgaGFzIGJlZW4gZmx1c2hl ZCBzbyBmYXIuIHJlYWRBaGVhZFZhbGlkIGlzIGNhcHBlZCB0byB3aGF0IHdhcworICoga25v d24tZmx1c2hlZCAocmVhZExlbikgYXQgZmlsbCB0aW1lLgorICovCitzdGF0aWMgY2hhciAq cmVhZEFoZWFkQnVmID0gTlVMTDsKK3N0YXRpYyBYTG9nU2VnTm8gcmVhZEFoZWFkU2VnTm8g PSAwOworc3RhdGljIHVpbnQzMiByZWFkQWhlYWRPZmYgPSAwOworc3RhdGljIHVpbnQzMiBy ZWFkQWhlYWRMZW4gPSAwOworc3RhdGljIHVpbnQzMiByZWFkQWhlYWRWYWxpZCA9IDA7CisK IC8qCiAgKiBLZWVwcyB0cmFjayBvZiB3aGljaCBzb3VyY2Ugd2UncmUgY3VycmVudGx5IHJl YWRpbmcgZnJvbS4gVGhpcyBpcwogICogZGlmZmVyZW50IGZyb20gcmVhZFNvdXJjZSBpbiB0 aGF0IHRoaXMgaXMgYWx3YXlzIHNldCwgZXZlbiB3aGVuIHdlIGRvbid0CkBAIC0zNzIsNiAr NDAyLDggQEAgc3RhdGljIFhMb2dSZWNvcmQgKlJlYWRSZWNvcmQoWExvZ1ByZWZldGNoZXIg Knhsb2dwcmVmZXRjaGVyLAogCiBzdGF0aWMgaW50CVhMb2dQYWdlUmVhZChYTG9nUmVhZGVy U3RhdGUgKnhsb2dyZWFkZXIsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwKIAkJCQkJCSBp bnQgcmVxTGVuLCBYTG9nUmVjUHRyIHRhcmdldFJlY1B0ciwgY2hhciAqcmVhZEJ1Zik7Citz dGF0aWMgdm9pZCBYTG9nRmlsZUNsb3NlKHZvaWQpOworc3RhdGljIHZvaWQgWExvZ1JlYWRB aGVhZEludmFsaWRhdGUodm9pZCk7CiBzdGF0aWMgWExvZ1BhZ2VSZWFkUmVzdWx0IFdhaXRG b3JXQUxUb0JlY29tZUF2YWlsYWJsZShYTG9nUmVjUHRyIFJlY1B0ciwKIAkJCQkJCQkJCQkJ CQkgIGJvb2wgcmFuZEFjY2VzcywKIAkJCQkJCQkJCQkJCQkgIGJvb2wgZmV0Y2hpbmdfY2tw dCwKQEAgLTUxOCw2ICs1NTAsMTMgQEAgSW5pdFdhbFJlY292ZXJ5KENvbnRyb2xGaWxlRGF0 YSAqQ29udHJvbEZpbGUsIGJvb2wgKndhc1NodXRkb3duX3B0ciwKIAkgKi8KIAlYTG9nUmVh ZGVyU2V0RGVjb2RlQnVmZmVyKHhsb2dyZWFkZXIsIE5VTEwsIHdhbF9kZWNvZGVfYnVmZmVy X3NpemUpOwogCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgcmVhZC1haGVhZCBjYWNoZSB1c2Vk IGJ5IFhMb2dQYWdlUmVhZCgpIHRvIGNvbWJpbmUgc2V2ZXJhbAorCSAqIFhMT0dfQkxDS1Na IHBhZ2UgcmVhZHMgaW50byBvbmUgbGFyZ2VyIHByZWFkKCkuCisJICovCisJQXNzZXJ0KHJl YWRBaGVhZEJ1ZiA9PSBOVUxMKTsKKwlyZWFkQWhlYWRCdWYgPSBwYWxsb2MoTUFYX0lPX0NP TUJJTkVfTElNSVQgKiBYTE9HX0JMQ0tTWik7CisKIAkvKiBDcmVhdGUgYSBXQUwgcHJlZmV0 Y2hlci4gKi8KIAl4bG9ncHJlZmV0Y2hlciA9IFhMb2dQcmVmZXRjaGVyQWxsb2NhdGUoeGxv Z3JlYWRlcik7CiAKQEAgLTE1MTEsMTEgKzE1NTAsNyBAQCBGaW5pc2hXYWxSZWNvdmVyeSh2 b2lkKQogCQkgKiBJZiB0aGUgZW5kaW5nIGxvZyBzZWdtZW50IGlzIHN0aWxsIG9wZW4sIGNs b3NlIGl0ICh0byBhdm9pZAogCQkgKiBwcm9ibGVtcyBvbiBXaW5kb3dzIHdpdGggdHJ5aW5n IHRvIHJlbmFtZSBvciBkZWxldGUgYW4gb3BlbiBmaWxlKS4KIAkJICovCi0JCWlmIChyZWFk RmlsZSA+PSAwKQotCQl7Ci0JCQljbG9zZShyZWFkRmlsZSk7Ci0JCQlyZWFkRmlsZSA9IC0x OwotCQl9CisJCVhMb2dGaWxlQ2xvc2UoKTsKIAl9CiAKIAkvKgpAQCAtMTU3NywxMSArMTYx Miw3IEBAIFNodXRkb3duV2FsUmVjb3Zlcnkodm9pZCkKIAlYTG9nUHJlZmV0Y2hlckNvbXB1 dGVTdGF0cyh4bG9ncHJlZmV0Y2hlcik7CiAKIAkvKiBTaHV0IGRvd24geGxvZ3JlYWRlciAq LwotCWlmIChyZWFkRmlsZSA+PSAwKQotCXsKLQkJY2xvc2UocmVhZEZpbGUpOwotCQlyZWFk RmlsZSA9IC0xOwotCX0KKwlYTG9nRmlsZUNsb3NlKCk7CiAJcGZyZWUoeGxvZ3JlYWRlci0+ cHJpdmF0ZV9kYXRhKTsKIAlYTG9nUmVhZGVyRnJlZSh4bG9ncmVhZGVyKTsKIAlYTG9nUHJl ZmV0Y2hlckZyZWUoeGxvZ3ByZWZldGNoZXIpOwpAQCAtMzE1NCwxMSArMzE4NSw3IEBAIFJl YWRSZWNvcmQoWExvZ1ByZWZldGNoZXIgKnhsb2dwcmVmZXRjaGVyLCBpbnQgZW1vZGUsCiAJ CQkJbWlzc2luZ0NvbnRyZWNQdHIgPSB4bG9ncmVhZGVyLT5taXNzaW5nQ29udHJlY1B0cjsK IAkJCX0KIAotCQkJaWYgKHJlYWRGaWxlID49IDApCi0JCQl7Ci0JCQkJY2xvc2UocmVhZEZp bGUpOwotCQkJCXJlYWRGaWxlID0gLTE7Ci0JCQl9CisJCQlYTG9nRmlsZUNsb3NlKCk7CiAK IAkJCS8qCiAJCQkgKiBXZSBvbmx5IGVuZCB1cCBoZXJlIHdpdGhvdXQgYSBtZXNzYWdlIHdo ZW4gWExvZ1BhZ2VSZWFkKCkKQEAgLTMyNTAsNiArMzI3Nyw0MCBAQCBSZWFkUmVjb3JkKFhM b2dQcmVmZXRjaGVyICp4bG9ncHJlZmV0Y2hlciwgaW50IGVtb2RlLAogCX0KIH0KIAorLyoK KyAqIEludmFsaWRhdGUgdGhlIFdBTCByZWFkLWFoZWFkIGNhY2hlLgorICoKKyAqIE11c3Qg YmUgY2FsbGVkIGF0IGV2ZXJ5IHBvaW50IHRoYXQgY2xvc2VzIG9yIG90aGVyd2lzZSBpbnZh bGlkYXRlcyByZWFkRmlsZSwKKyAqIGJ1dCBjYW4gYmUgY2FsbGVkIGF0IG90aGVyIHRpbWVz IHRvbyBhbmQgd2lsbCBmb3JjZSBhIHJlLXJlYWQgb2YgdGhlIG5leHQKKyAqIHBhZ2UuCisg Ki8KK3N0YXRpYyB2b2lkCitYTG9nUmVhZEFoZWFkSW52YWxpZGF0ZSh2b2lkKQoreworCXJl YWRBaGVhZExlbiA9IDA7CisJcmVhZEFoZWFkVmFsaWQgPSAwOworfQorCisvKgorICogQ2xv c2UgdGhlIGN1cnJlbnQgV0FMIGZpbGUgYW5kIGludmFsaWRhdGUgdGhlIHJlYWQtYWhlYWQg Y2FjaGUuCisgKgorICogSXQgaXMgc3RyaWN0bHkgc3BlYWtpbmcgbm90IG5lY2Vzc2FyeSB0 byBzZXQgcmVhZFNvdXJjZSBhbmQgcmVhZExlbiB0bworICogdGhlaXIgaW5pdGlhbCB2YWx1 ZXMsIGJ1dCB0aGUgb3JpZ2luYWwgY29kZSBkaWQgdGhhdCwgc28gd2Uga2VlcCBpdCBmb3IK KyAqIG5vdy4KKyAqLworc3RhdGljIHZvaWQKK1hMb2dGaWxlQ2xvc2Uodm9pZCkKK3sKKwlp ZiAocmVhZEZpbGUgPj0gMCkKKwl7CisJCWNsb3NlKHJlYWRGaWxlKTsKKwkJcmVhZEZpbGUg PSAtMTsKKwkJcmVhZFNvdXJjZSA9IFhMT0dfRlJPTV9BTlk7CisJCXJlYWRMZW4gPSAwOwor CQlYTG9nUmVhZEFoZWFkSW52YWxpZGF0ZSgpOworCX0KK30KKwogLyoKICAqIFJlYWQgdGhl IFhMT0cgcGFnZSBjb250YWluaW5nIHRhcmdldFBhZ2VQdHIgaW50byByZWFkQnVmIChpZiBu b3QgcmVhZAogICogYWxyZWFkeSkuICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkLCBp ZiB0aGUgcGFnZSBpcyByZWFkIHN1Y2Nlc3NmdWxseSwKQEAgLTMyODcsNyArMzM0OCw2IEBA IFhMb2dQYWdlUmVhZChYTG9nUmVhZGVyU3RhdGUgKnhsb2dyZWFkZXIsIFhMb2dSZWNQdHIg dGFyZ2V0UGFnZVB0ciwgaW50IHJlcUxlbiwKIAlpbnQJCQllbW9kZSA9IHByaXZhdGUtPmVt b2RlOwogCXVpbnQzMgkJdGFyZ2V0UGFnZU9mZjsKIAlYTG9nU2VnTm8JdGFyZ2V0U2VnTm8g UEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZOwotCXNzaXplX3QJCXI7CiAJaW5zdHJfdGltZQlp b19zdGFydDsKIAogCUFzc2VydChBbVN0YXJ0dXBQcm9jZXNzKCkgfHwgIUlzVW5kZXJQb3N0 bWFzdGVyKTsKQEAgLTMzMTYsOSArMzM3Niw3IEBAIFhMb2dQYWdlUmVhZChYTG9nUmVhZGVy U3RhdGUgKnhsb2dyZWFkZXIsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwgaW50IHJlcUxl biwKIAkJCX0KIAkJfQogCi0JCWNsb3NlKHJlYWRGaWxlKTsKLQkJcmVhZEZpbGUgPSAtMTsK LQkJcmVhZFNvdXJjZSA9IFhMT0dfRlJPTV9BTlk7CisJCVhMb2dGaWxlQ2xvc2UoKTsKIAl9 CiAKIAlYTEJ5dGVUb1NlZyh0YXJnZXRQYWdlUHRyLCByZWFkU2VnTm8sIHdhbF9zZWdtZW50 X3NpemUpOwpAQCAtMzM0NiwxMSArMzQwNCw3IEBAIHJldHJ5OgogCQkJY2FzZSBYTFJFQURf V09VTERCTE9DSzoKIAkJCQlyZXR1cm4gWExSRUFEX1dPVUxEQkxPQ0s7CiAJCQljYXNlIFhM UkVBRF9GQUlMOgotCQkJCWlmIChyZWFkRmlsZSA+PSAwKQotCQkJCQljbG9zZShyZWFkRmls ZSk7Ci0JCQkJcmVhZEZpbGUgPSAtMTsKLQkJCQlyZWFkTGVuID0gMDsKLQkJCQlyZWFkU291 cmNlID0gWExPR19GUk9NX0FOWTsKKwkJCQlYTG9nRmlsZUNsb3NlKCk7CiAJCQkJcmV0dXJu IFhMUkVBRF9GQUlMOwogCQkJY2FzZSBYTFJFQURfU1VDQ0VTUzoKIAkJCQlicmVhazsKQEAg LTMzODMsNDUgKzM0MzcsMTMxIEBAIHJldHJ5OgogCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCBw YWdlICovCiAJcmVhZE9mZiA9IHRhcmdldFBhZ2VPZmY7CiAKLQkvKiBNZWFzdXJlIEkvTyB0 aW1pbmcgd2hlbiByZWFkaW5nIHNlZ21lbnQgKi8KLQlpb19zdGFydCA9IHBnc3RhdF9wcmVw YXJlX2lvX3RpbWUodHJhY2tfd2FsX2lvX3RpbWluZyk7Ci0KLQlwZ3N0YXRfcmVwb3J0X3dh aXRfc3RhcnQoV0FJVF9FVkVOVF9XQUxfUkVBRCk7Ci0JciA9IHBnX3ByZWFkKHJlYWRGaWxl LCByZWFkQnVmLCBYTE9HX0JMQ0tTWiwgKHBnb2ZmX3QpIHJlYWRPZmYpOwotCWlmIChyICE9 IFhMT0dfQkxDS1NaKQorCS8qCisJICogSWYgdGhlIHJlcXVlc3RlZCBwYWdlIGlzIG5vdCBp biB0aGUgcmVhZC1haGVhZCBjYWNoZSBmcm9tIGEgcHJldmlvdXMsCisJICogbGFyZ2VyIHJl YWQsIHRoZSBjYWNoZSBpcyBpbnZhbGlkLCBvciBhbGwgYmxvY2tzIGZyb20gdGhlIGNhY2hl IGlzCisJICogcmVhZC4gSW4gdGhhdCBjYXNlLCBmZXRjaCBhIGxhcmdlIGJsb2NrIGZyb20g ZGlzayAodXAgdG8KKwkgKiBpb19jb21iaW5lX2xpbWl0IHBhZ2VzKS4KKwkgKgorCSAqIFRo ZSBjYWNoZSBpcyBpbnZhbGlkYXRlZCBhdCBldmVyeSBwb2ludCB0aGF0IGNvdWxkIG1ha2Ug cmVhZFNlZ05vIG1lYW4KKwkgKiBhIGRpZmZlcmVudCB1bmRlcmx5aW5nIGZpbGUsIHNvIHRo b3NlIGZvdXIgY29uZGl0aW9ucyBhcmUgYWx3YXlzIHNhZmUKKwkgKiB0byB0cnVzdC4gQnV0 IHdoZW4gc3RyZWFtaW5nIGZyb20gdGhlIHByaW1hcnksIHJlYWRMZW4gY2FuIGdyb3cgYmV0 d2VlbgorCSAqIGNhbGxzIGZvciB0aGUgcGFnZSBhcyBtb3JlIFdBTCBhcnJpdmVzLiBSZXF1 aXJlIHRoYXQgZXZlcnl0aGluZyB0aGUKKwkgKiBjdXJyZW50IHJlYWRMZW4gaXMgYWJvdXQg dG8gcHJvbWlzZSB0aGUgY2FsbGVyIGlzIGtub3duIHRvIGJlIHZhbGlkCisJICogd2hlbiB0 aGUgY2FjaGUgd2FzIGZpbGxlZCwgb3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCBhbmQgcmUtcmVh ZCBmcmVzaAorCSAqIGRhdGEuCisJICovCisJaWYgKHJlYWRBaGVhZExlbiA8PSAwIHx8CisJ CXJlYWRBaGVhZFNlZ05vICE9IHJlYWRTZWdObyB8fAorCQlyZWFkT2ZmIDwgcmVhZEFoZWFk T2ZmIHx8CisJCXJlYWRPZmYgKyBYTE9HX0JMQ0tTWiA+IHJlYWRBaGVhZE9mZiArIHJlYWRB aGVhZExlbiB8fAorCQlyZWFkT2ZmICsgcmVhZExlbiA+IHJlYWRBaGVhZE9mZiArIHJlYWRB aGVhZFZhbGlkKQogCXsKLQkJY2hhcgkJZm5hbWVbTUFYRk5BTUVMRU5dOwotCQlpbnQJCQlz YXZlX2Vycm5vID0gZXJybm87CisJCXVpbnQzMgkJd2FudGVkOworCQlzc2l6ZV90CQlyOwor CisJCUFzc2VydChyZWFkQWhlYWRCdWYgIT0gTlVMTCk7CisKKwkJLyogUmVhZCBhdCBtb3N0 IHRvIHRoZSBlbmQgb2YgdGhlIFdBTCBzZWdtZW50IGFuZCBub3QgYmV5b25kICovCisJCXdh bnRlZCA9ICh1aW50MzIpIHdhbF9zZWdtZW50X3NpemUgLSB0YXJnZXRQYWdlT2ZmOworCisJ CS8qCisJCSAqIElmIHdlIHN0cmVhbSBmcm9tIHRoZSBwcmltYXJ5LCB3ZSBjYW5ub3QgcmVh ZCBtb3JlIHRoYW4gd2UgaGF2ZSBpbgorCQkgKiB0aGUgYnVmZmVyLCBzbyBjYXAgdGhlIHJl YWQgYXQgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJaWYg KHJlYWRTb3VyY2UgPT0gWExPR19GUk9NX1NUUkVBTSkKKwkJCXdhbnRlZCA9IE1pbih3YW50 ZWQsIHJlYWRMZW4pOworCisJCS8qIE5ldmVyIHJlYWQgbW9yZSBibG9ja3MgdGhhbiB3aGF0 IGlvX2NvbWJpbmVfbGltaXQgc2F5cyAqLworCQl3YW50ZWQgPSBNaW4od2FudGVkLCBpb19j b21iaW5lX2xpbWl0ICogWExPR19CTENLU1opOworCisJCS8qIFJlYWQgYXQgbGVhc3Qgb25l IHBhZ2UgKi8KKwkJd2FudGVkID0gTWF4KHdhbnRlZCwgWExPR19CTENLU1opOworCisJCS8q IE1lYXN1cmUgSS9PIHRpbWluZyB3aGVuIHJlYWRpbmcgc2VnbWVudCAqLworCQlpb19zdGFy dCA9IHBnc3RhdF9wcmVwYXJlX2lvX3RpbWUodHJhY2tfd2FsX2lvX3RpbWluZyk7CiAKKwkJ cGdzdGF0X3JlcG9ydF93YWl0X3N0YXJ0KFdBSVRfRVZFTlRfV0FMX1JFQUQpOworCQlyID0g cGdfcHJlYWQocmVhZEZpbGUsIHJlYWRBaGVhZEJ1Ziwgd2FudGVkLCAocGdvZmZfdCkgcmVh ZE9mZik7CiAJCXBnc3RhdF9yZXBvcnRfd2FpdF9lbmQoKTsKIAotCQkvKiBDb3VudCBJL08g c3RhdHMgb25seSBmb3Igc3VjY2Vzc2Z1bCBzaG9ydCByZWFkcyAqLwotCQlpZiAociA+IDAp Ci0JCQlwZ3N0YXRfY291bnRfaW9fb3BfdGltZShJT09CSkVDVF9XQUwsIElPQ09OVEVYVF9O T1JNQUwsIElPT1BfUkVBRCwKLQkJCQkJCQkJCWlvX3N0YXJ0LCAxLCByKTsKKwkJaWYgKHIg PCBYTE9HX0JMQ0tTWikKKwkJeworCQkJY2hhcgkJZm5hbWVbTUFYRk5BTUVMRU5dOworCQkJ aW50CQkJc2F2ZV9lcnJubyA9IGVycm5vOworCisJCQkvKiBDb3VudCBJL08gc3RhdHMgb25s eSBmb3Igc3VjY2Vzc2Z1bCBzaG9ydCByZWFkcyAqLworCQkJaWYgKHIgPiAwKQorCQkJCXBn c3RhdF9jb3VudF9pb19vcF90aW1lKElPT0JKRUNUX1dBTCwgSU9DT05URVhUX05PUk1BTCwg SU9PUF9SRUFELAorCQkJCQkJCQkJCWlvX3N0YXJ0LCAxLCByKTsKIAotCQlYTG9nRmlsZU5h bWUoZm5hbWUsIGN1ckZpbGVUTEksIHJlYWRTZWdObywgd2FsX3NlZ21lbnRfc2l6ZSk7Ci0J CWlmIChyIDwgMCkKKwkJCVhMb2dGaWxlTmFtZShmbmFtZSwgY3VyRmlsZVRMSSwgcmVhZFNl Z05vLCB3YWxfc2VnbWVudF9zaXplKTsKKwkJCWlmIChyIDwgMCkKKwkJCXsKKwkJCQllcnJu byA9IHNhdmVfZXJybm87CisJCQkJZXJlcG9ydChlbW9kZV9mb3JfY29ycnVwdF9yZWNvcmQo ZW1vZGUsIHRhcmdldFBhZ2VQdHIgKyByZXFMZW4pLAorCQkJCQkJKGVycmNvZGVfZm9yX2Zp bGVfYWNjZXNzKCksCisJCQkJCQkgZXJybXNnKCJjb3VsZCBub3QgcmVhZCBmcm9tIFdBTCBz ZWdtZW50ICVzLCBMU04gJVgvJTA4WCwgb2Zmc2V0ICV1OiAlbSIsCisJCQkJCQkJCWZuYW1l LCBMU05fRk9STUFUX0FSR1ModGFyZ2V0UGFnZVB0ciksCisJCQkJCQkJCXJlYWRPZmYpKSk7 CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZXJlcG9ydChlbW9kZV9mb3JfY29ycnVwdF9y ZWNvcmQoZW1vZGUsIHRhcmdldFBhZ2VQdHIgKyByZXFMZW4pLAorCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9EQVRBX0NPUlJVUFRFRCksCisJCQkJCQkgZXJybXNnKCJjb3VsZCBub3QgcmVh ZCBmcm9tIFdBTCBzZWdtZW50ICVzLCBMU04gJVgvJTA4WCwgb2Zmc2V0ICV1OiByZWFkICV6 ZCBvZiAlenUiLAorCQkJCQkJCQlmbmFtZSwgTFNOX0ZPUk1BVF9BUkdTKHRhcmdldFBhZ2VQ dHIpLAorCQkJCQkJCQlyZWFkT2ZmLCByLCAoU2l6ZSkgd2FudGVkKSkpOworCQkJfQorCisJ CQkvKgorCQkJICogTmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZSBzbyB0aGF0IG5leHQg cmVhZCB3aWxsIHJlYWQgaW4gYQorCQkJICogY29tcGxldGUgcGFnZS4gVGhlIGN1cnJlbnQg cGFnZSBpcyBub3QgY29tcGxldGUsIHNvIHRyeWluZyB0bworCQkJICogdXNlIGl0IGluIGEg bGF0ZXIgY2FsbCBtaWdodCBjYXVzZSBhIGNvcnJ1cHRlZCBwYWdlIHRvIGJlIHVzZWQuCisJ CQkgKi8KKwkJCVhMb2dSZWFkQWhlYWRJbnZhbGlkYXRlKCk7CisJCQlnb3RvIG5leHRfcmVj b3JkX2lzX2ludmFsaWQ7CisJCX0KKworCQlwZ3N0YXRfY291bnRfaW9fb3BfdGltZShJT09C SkVDVF9XQUwsIElPQ09OVEVYVF9OT1JNQUwsIElPT1BfUkVBRCwKKwkJCQkJCQkJaW9fc3Rh cnQsIDEsIHIpOworCisJCXJlYWRBaGVhZFNlZ05vID0gcmVhZFNlZ05vOworCQlyZWFkQWhl YWRPZmYgPSByZWFkT2ZmOworCQlyZWFkQWhlYWRMZW4gPSByOworCisJCS8qCisJCSAqIEJ5 dGVzIGJleW9uZCByZWFkTGVuIG1heSBub3QgcmVhbGx5IGJlIHRoZXJlIHlldCB3aGVuIHN0 cmVhbWluZyBzbworCQkgKiBkb24ndCByZWNvcmQgdGhlbSBhcyB2YWxpZC4gRm9yIGFueSBv dGhlciBzb3VyY2UsIHRoZSBzZWdtZW50IGlzCisJCSAqIGltbXV0YWJsZSBhbmQgZXZlcnl0 aGluZyBqdXN0IHJlYWQgaXMgdHJ1c3R3b3J0aHkuCisJCSAqLworCisJCWlmIChyZWFkU291 cmNlID09IFhMT0dfRlJPTV9TVFJFQU0pCiAJCXsKLQkJCWVycm5vID0gc2F2ZV9lcnJubzsK LQkJCWVyZXBvcnQoZW1vZGVfZm9yX2NvcnJ1cHRfcmVjb3JkKGVtb2RlLCB0YXJnZXRQYWdl UHRyICsgcmVxTGVuKSwKLQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCi0JCQkJ CSBlcnJtc2coImNvdWxkIG5vdCByZWFkIGZyb20gV0FMIHNlZ21lbnQgJXMsIExTTiAlWC8l MDhYLCBvZmZzZXQgJXU6ICVtIiwKLQkJCQkJCQlmbmFtZSwgTFNOX0ZPUk1BVF9BUkdTKHRh cmdldFBhZ2VQdHIpLAotCQkJCQkJCXJlYWRPZmYpKSk7CisJCQlyZWFkQWhlYWRWYWxpZCA9 IE1pbihyLCByZWFkTGVuKTsKKworCQkJLyoKKwkJCSAqIFRlc3QgaG9vazogbGV0cyBhIFRB UCB0ZXN0IHBhdXNlIHRoZSBzdGFydHVwIHByb2Nlc3MgcmlnaHQKKwkJCSAqIGFmdGVyIGEg c3RyZWFtaW5nIGZpbGwsIHdoaWxlIHJlYWRBaGVhZExlbi9yZWFkQWhlYWRWYWxpZCBzdGls bAorCQkJICogcmVmbGVjdCBvbmx5IHdoYXQgaGFkIGFjdHVhbGx5IGFycml2ZWQgYXQgdGhp cyBtb21lbnQuIFRoZQorCQkJICogd2FscmVjZWl2ZXIgaXMgYSBzZXBhcmF0ZSBwcm9jZXNz IGFuZCBrZWVwcyB3cml0aW5nIGFuZAorCQkJICogYWR2YW5jaW5nIGZsdXNoZWRVcHRvIHdo aWxlIHRoaXMgcHJvY2VzcyBpcyBwYXVzZWQgaGVyZSwgc28gYQorCQkJICogdGVzdCBjYW4g dXNlIHRoZSBnYXAgdG8gcHJvdmUgdGhhdCBhIGxhdGVyIGNhbGwgYXNraW5nIGZvciBtb3Jl CisJCQkgKiBvZiB0aGlzIHNhbWUgcGFnZSAob25jZSB0aGF0IG5ldyBXQUwgaGFzIHRydWx5 IGFycml2ZWQpIGRvZXMKKwkJCSAqIG5vdCBzZXJ2ZSBiYWNrIHRoaXMgc3RhbGUgZmlsbC4K KwkJCSAqLworCQkJSU5KRUNUSU9OX1BPSU5UKCJ4bG9ncmVjb3Zlcnktd2FsLXN0cmVhbS1j YWNoZS1maWxsZWQiLCBOVUxMKTsKIAkJfQogCQllbHNlCi0JCQllcmVwb3J0KGVtb2RlX2Zv cl9jb3JydXB0X3JlY29yZChlbW9kZSwgdGFyZ2V0UGFnZVB0ciArIHJlcUxlbiksCi0JCQkJ CShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAotCQkJCQkgZXJybXNnKCJjb3Vs ZCBub3QgcmVhZCBmcm9tIFdBTCBzZWdtZW50ICVzLCBMU04gJVgvJTA4WCwgb2Zmc2V0ICV1 OiByZWFkICV6ZCBvZiAlenUiLAotCQkJCQkJCWZuYW1lLCBMU05fRk9STUFUX0FSR1ModGFy Z2V0UGFnZVB0ciksCi0JCQkJCQkJcmVhZE9mZiwgciwgKFNpemUpIFhMT0dfQkxDS1NaKSkp OwotCQlnb3RvIG5leHRfcmVjb3JkX2lzX2ludmFsaWQ7CisJCQlyZWFkQWhlYWRWYWxpZCA9 IHI7CiAJfQotCXBnc3RhdF9yZXBvcnRfd2FpdF9lbmQoKTsKIAotCXBnc3RhdF9jb3VudF9p b19vcF90aW1lKElPT0JKRUNUX1dBTCwgSU9DT05URVhUX05PUk1BTCwgSU9PUF9SRUFELAot CQkJCQkJCWlvX3N0YXJ0LCAxLCByKTsKKwkvKgorCSAqIFdlIGNvcHkgb3V0IHRoZSBwYWdl IGZyb20gdGhlIGNhY2hlIHNpbmNlIHJlYWRCdWYgaXMgYWxsb2NhdGVkCisJICogZWxzZXdo ZXJlLiBJdCB3YXMgY29uc2lkZXJlZCBwb2ludGluZyBpbnRvIHRoZSBjYWNoZSwgYnV0IHRo YXQgc2VlbXMKKwkgKiBsaWtlIGFuIHVubmVjZXNzYXJ5IHJpc2sgYW5kIG1vcmUgd29yayB0 aGFuIGl0J3Mgd29ydGguCisJICovCisJbWVtY3B5KHJlYWRCdWYsIHJlYWRBaGVhZEJ1ZiAr IChyZWFkT2ZmIC0gcmVhZEFoZWFkT2ZmKSwgWExPR19CTENLU1opOwogCiAJQXNzZXJ0KHRh cmdldFNlZ05vID09IHJlYWRTZWdObyk7CiAJQXNzZXJ0KHRhcmdldFBhZ2VPZmYgPT0gcmVh ZE9mZik7CkBAIC0zNDkxLDExICszNjMxLDcgQEAgbmV4dF9yZWNvcmRfaXNfaW52YWxpZDoK IAogCWxhc3RTb3VyY2VGYWlsZWQgPSB0cnVlOwogCi0JaWYgKHJlYWRGaWxlID49IDApCi0J CWNsb3NlKHJlYWRGaWxlKTsKLQlyZWFkRmlsZSA9IC0xOwotCXJlYWRMZW4gPSAwOwotCXJl YWRTb3VyY2UgPSBYTE9HX0ZST01fQU5ZOworCVhMb2dGaWxlQ2xvc2UoKTsKIAogCS8qIElu IHN0YW5kYnktbW9kZSwga2VlcCB0cnlpbmcgKi8KIAlpZiAoU3RhbmRieU1vZGUpCkBAIC0z NzczLDExICszOTA5LDggQEAgV2FpdEZvcldBTFRvQmVjb21lQXZhaWxhYmxlKFhMb2dSZWNQ dHIgUmVjUHRyLCBib29sIHJhbmRBY2Nlc3MsCiAJCQkJQXNzZXJ0KCFXYWxSY3ZTdHJlYW1p bmcoKSk7CiAKIAkJCQkvKiBDbG9zZSBhbnkgb2xkIGZpbGUgd2UgbWlnaHQgaGF2ZSBvcGVu LiAqLwotCQkJCWlmIChyZWFkRmlsZSA+PSAwKQotCQkJCXsKLQkJCQkJY2xvc2UocmVhZEZp bGUpOwotCQkJCQlyZWFkRmlsZSA9IC0xOwotCQkJCX0KKwkJCQlYTG9nRmlsZUNsb3NlKCk7 CisKIAkJCQkvKiBSZXNldCBjdXJGaWxlVExJIGlmIHJhbmRvbSBmZXRjaC4gKi8KIAkJCQlp ZiAocmFuZEFjY2VzcykKIAkJCQkJY3VyRmlsZVRMSSA9IDA7CmRpZmYgLS1naXQgYS9zcmMv dGVzdC9wZXJsL1Bvc3RncmVTUUwvVGVzdC9SZWNvdmVyeS5wbSBiL3NyYy90ZXN0L3Blcmwv UG9zdGdyZVNRTC9UZXN0L1JlY292ZXJ5LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi41MTRkNzQxODFmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0 L3BlcmwvUG9zdGdyZVNRTC9UZXN0L1JlY292ZXJ5LnBtCkBAIC0wLDAgKzEsNDQwIEBACisj IENvcHlyaWdodCAoYykgMjAyMS0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVu dCBHcm91cAorCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1Bvc3RncmVTUUw6OlRlc3Q6OlJl Y292ZXJ5IC0gc2V0IHVwLCBsb2FkLCBhbmQgY3Jhc2ggYSBjbHVzdGVyIGZvciByZWNvdmVy eSBiZW5jaG1hcmtpbmcKKworPWhlYWQxIFNZTk9QU0lTCisKKyAgdXNlIFBvc3RncmVTUUw6 OlRlc3Q6OlJlY292ZXJ5OworCisgIG15ICRyZWNvdmVyeSA9IFBvc3RncmVTUUw6OlRlc3Q6 OlJlY292ZXJ5LT5uZXcoZGF0YV9kaXIgPT4gJGRhdGFfZGlyKTsKKworICAkcmVjb3Zlcnkt PnNldHVwKGd1Y3MgPT4geyBpb19tZXRob2QgPT4gJ3dvcmtlcicgfSk7CisgICRyZWNvdmVy eS0+cHJlcGFyZSh3b3JrbG9hZCA9PiAncGdiZW5jaCcsIHNjYWxlID0+IDIwKTsKKyAgJHJl Y292ZXJ5LT5jcmFzaCgpOworCis9aGVhZDEgREVTQ1JJUFRJT04KKworUG9zdGdyZVNRTDo6 VGVzdDo6UmVjb3ZlcnkgaG9sZHMgdGhlIHNldHVwL3ByZXBhcmUvY3Jhc2ggbWVjaGFuaWNz IHVzZWQgdG8gcHV0IGEgY2x1c3RlciBpbnRvIGEKK3N0YXRlIHdoZXJlIHJlc3RhcnRpbmcg aXQgZXhlcmNpc2VzIGNyYXNoIHJlY292ZXJ5OiBDPGluaXRkYj4gKyBjb25maWd1cmUgKyBz dGFydCArIGNoZWNrcG9pbnQsCit0aGVuIGEgYnVsayB3b3JrbG9hZCB0aGF0IGxlYXZlcyBX QUwgdW5mbHVzaGVkLCB0aGVuIEM8U0lHS0lMTD4gdGhlIHBvc3RtYXN0ZXIgd2l0aG91dCBy ZXN0YXJ0aW5nCitpdCAodGhlIHJlc3RhcnQgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBsZWZ0 IHRvIHRoZSBjYWxsZXIsIGUuZy4gdW5kZXIgYSBicGZ0cmFjZSB0cmFjZSkuCisKK1VubGlr ZSBMPFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI+LCB0aGlzIG1vZHVsZSBkZWxpYmVyYXRl bHkgZG9lcyBCPG5vdD4gZGVwZW5kIG9uCitMPFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzPiBv ciBMPFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI+IC0gQzxQb3N0Z3JlU1FMOjpUZXN0OjpV dGlscz4gaGlqYWNrcworU1RET1VUL1NUREVSUiBpbnRvIGEgbG9nIGZpbGUgYXQgaW1wb3J0 IHRpbWUgKGNvcnJlY3QgZm9yIHRoZSBDPHByb3ZlPi9UQVAgaGFybmVzcywgd3JvbmcgZm9y IGFuCitpbnRlcmFjdGl2ZSBDTEkgdG9vbCksIGFuZCB0aGlzIG1vZHVsZSBpcyBtZWFudCB0 byBiZSB1c2FibGUgZnJvbSBleGFjdGx5IHN1Y2ggYSB0b29sLiBFcnJvcnMgYXJlCityZXBv cnRlZCB2aWEgcGxhaW4gQzxkaWU+IChub3QgQzxjcm9haz4vQzxCQUlMX09VVD4sIHdoaWNo IHdvdWxkIHB1bGwgaW4gYSBUQVAtc2hhcGVkIGRlcGVuZGVuY3kpLgorCis9Y3V0CisKK3Bh Y2thZ2UgUG9zdGdyZVNRTDo6VGVzdDo6UmVjb3Zlcnk7CisKK3VzZSBzdHJpY3Q7Cit1c2Ug d2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7CisKK3VzZSBJTzo6U29ja2V0OjpJTkVUOwordXNl IFRpbWU6OkhpUmVzOworCitteSAlV09SS0xPQURTID0gKAorCSdwZ2JlbmNoJyA9PiAnX3dv cmtsb2FkX3BnYmVuY2gnLAorCSdjcmVhdGVfaW5kZXgnID0+ICdfd29ya2xvYWRfY3JlYXRl X2luZGV4Jyk7CisKKz1wb2QKKworPWl0ZW0gUG9zdGdyZVNRTDo6VGVzdDo6UmVjb3Zlcnkt Pm5ldyhkYXRhX2RpciA9PiAkZGF0YV9kaXIsICVwYXJhbXMpCisKK0NvbnN0cnVjdCBhIG5l dyBpbnN0YW5jZSBib3VuZCB0byBDPCRkYXRhX2Rpcj4uIEhhcyBubyBmaWxlc3lzdGVtIHNp ZGUgZWZmZWN0cyAtIEM8c2V0dXAoKT4gaXMKK3doYXQgYWN0dWFsbHkgY3JlYXRlcyB0aGUg Y2x1c3RlcjsgQzxkYXRhX2Rpcj4gbWF5IGVxdWFsbHkgbmFtZSBhIGRpcmVjdG9yeSBDPHNl dHVwKCk+IGhhcworYWxyZWFkeSBjcmVhdGVkIGluIGFuIGVhcmxpZXIgcHJvY2VzcyAoZS5n LiBDPHByZXBhcmU+L0M8Y3Jhc2g+IGFyZSBub3JtYWxseSBpbnZva2VkIGFzIHNlcGFyYXRl Citwcm9jZXNzZXMgZnJvbSBDPHNldHVwPiwgc2luY2UgYSBicGZ0cmFjZS13cmFwcGVkIHJl c3RhcnQgbmVlZHMgdG8gaGFwcGVuIGJldHdlZW4gQzxjcmFzaD4gYW5kCit3aGF0ZXZlciBj b21lcyBuZXh0KS4KKworQzwlcGFyYW1zPiBtYXkgYWxzbyBpbmNsdWRlOgorCis9b3ZlciA0 CisKKz1pdGVtIEM8Y29ubmVjdF9kYj4gKGRlZmF1bHQgQzxwb3N0Z3Jlcz4pCisKKz1pdGVt IEM8aG9zdD4gKGRlZmF1bHQgQzxsb2NhbGhvc3Q+KQorCis9YmFjaworCis9Y3V0CisKK3N1 YiBuZXcKK3sKKwlteSAkY2xhc3MgPSBzaGlmdDsKKwlteSAoJXBhcmFtcykgPSBAXzsKKwor CWRpZSAiUG9zdGdyZVNRTDo6VGVzdDo6UmVjb3Zlcnk6Om5ldzogJ2RhdGFfZGlyJyBpcyBy ZXF1aXJlZFxuIgorCSAgdW5sZXNzIGRlZmluZWQgJHBhcmFtc3tkYXRhX2Rpcn07CisKKwly ZXR1cm4gYmxlc3MgeworCQlfZGF0YV9kaXIgPT4gJHBhcmFtc3tkYXRhX2Rpcn0sCisJCV9j b25uZWN0X2RiID0+ICRwYXJhbXN7Y29ubmVjdF9kYn0gLy8gJ3Bvc3RncmVzJywKKwkJX2hv c3QgPT4gJHBhcmFtc3tob3N0fSAvLyAnbG9jYWxob3N0JywKKwl9LCAkY2xhc3M7Cit9CisK K3N1YiBkYXRhX2RpcgoreworCW15ICgkc2VsZikgPSBAXzsKKwlyZXR1cm4gJHNlbGYtPntf ZGF0YV9kaXJ9OworfQorCitzdWIgaG9zdAoreworCW15ICgkc2VsZikgPSBAXzsKKwlyZXR1 cm4gJHNlbGYtPntfaG9zdH07Cit9CisKKyMgTGF6aWx5IHJlYWQgZnJvbSBwb3N0Z3Jlc3Fs LmNvbmYgb24gZmlyc3QgYWNjZXNzICh0aGUgdXN1YWwgY2FzZSBmb3IgYW4gb2JqZWN0IGNv bnN0cnVjdGVkIGluCisjIGEgZnJlc2ggcHJvY2VzcyBieSAicHJlcGFyZSIvImNyYXNoIiwg cG9pbnRlZCBhdCBhIGRhdGEgZGlyZWN0b3J5ICJzZXR1cCIgYWxyZWFkeSBjb25maWd1cmVk IGluCisjIGEgZGlmZmVyZW50IHByb2Nlc3MpIGFuZCBjYWNoZWQgZnJvbSB0aGVuIG9uLiAi c2V0dXAiIGluc3RlYWQgcG9wdWxhdGVzIHRoaXMgZGlyZWN0bHksIHNpbmNlIGl0CisjIGFs cmVhZHkga25vd3MgdGhlIHBvcnQgaXQganVzdCBwaWNrZWQuCitzdWIgcG9ydAoreworCW15 ICgkc2VsZikgPSBAXzsKKwlyZXR1cm4gJHNlbGYtPntfcG9ydH0gLy89ICRzZWxmLT5fcmVh ZF9wb3J0X2Zyb21fY29uZjsKK30KKworPXBvZAorCis9aXRlbSAkcmVjb3ZlcnktPnNldHVw KCVwYXJhbXMpCisKK0M8aW5pdGRiPnMgYSBmcmVzaCBjbHVzdGVyIGF0IHRoaXMgb2JqZWN0 J3MgQzxkYXRhX2Rpcj4gKG11c3Qgbm90IGFscmVhZHkgZXhpc3QpLCBzdGFydHMgaXQsIGFu ZAorY2hlY2twb2ludHMgLSBiZWZvcmUgYW55IHdvcmtsb2FkIHJ1bnMsIHNvIHRoZSB3b3Jr bG9hZCdzIFdBTCBpcyBzdGlsbCB1bmZsdXNoZWQgd2hlbiBDPGNyYXNoPgorbGF0ZXIga2ls bHMgdGhlIHNlcnZlci4gTGVhdmVzIHRoZSBzZXJ2ZXIgcnVubmluZy4KKworQzwlcGFyYW1z PjoKKworPW92ZXIgNAorCis9aXRlbSBDPGd1Y3M+IChoYXNocmVmLCBvcHRpb25hbCkKKwor RXh0cmEgQzxuYW1lID1FPGd0PiB2YWx1ZT4gR1VDcyBhcHBlbmRlZCB0byBDPHBvc3RncmVz cWwuY29uZj4gKGxhdGVyIHZhbHVlcyB3aW4pLiBVc2UgdGhpcyBmb3IKK3RoZSBHVUMgbWF0 cml4IHVuZGVyIHRlc3Q6IEM8aW9fbWV0aG9kPiwgQzxpb19jb21iaW5lX2xpbWl0PiwgQzxy ZWNvdmVyeV9wcmVmZXRjaD4sCitDPG1haW50ZW5hbmNlX2lvX2NvbmN1cnJlbmN5PiwgQzxm dWxsX3BhZ2Vfd3JpdGVzPi4KKworPWl0ZW0gQzxwb3J0PiAob3B0aW9uYWwpCisKK1VzZSB0 aGlzIHBvcnQgaW5zdGVhZCBvZiBwaWNraW5nIGEgZnJlZSBvbmUgYXV0b21hdGljYWxseS4K KworPWJhY2sKKworPWN1dAorCitzdWIgc2V0dXAKK3sKKwlteSAoJHNlbGYsICVwYXJhbXMp ID0gQF87CisJbXkgJGRhdGFfZGlyID0gJHNlbGYtPmRhdGFfZGlyOworCW15ICRob3N0ID0g JHNlbGYtPmhvc3Q7CisKKwlkaWUgInNldHVwOiAkZGF0YV9kaXIgYWxyZWFkeSBleGlzdHNc biIgaWYgLWUgJGRhdGFfZGlyOworCisJbXkgJHBvcnQgPSAkcGFyYW1ze3BvcnR9IC8vICRz ZWxmLT5fZnJlZV9wb3J0OworCSRzZWxmLT57X3BvcnR9ID0gJHBvcnQ7CisKKwlteSAlb3B0 aW9ucyA9ICgKKwkJJ3BvcnQnID0+ICRwb3J0LAorCQknbGlzdGVuX2FkZHJlc3NlcycgPT4g JGhvc3QsCisKKwkJIyBTdGF0aWMsIG5vbi1yb3RhdGluZyBsb2cgZmlsZSBzbyBhIGxhdGVy IHJlc3RhcnQgKGEgc2VwYXJhdGUKKwkJIyBwcm9jZXNzLCBwb3NzaWJseSBhZnRlciBhIGNy YXNoKSBjYW4gZmluZCBpdCBkZXRlcm1pbmlzdGljYWxseSwKKwkJIyBhbmQgc28gaXQgc3Rh eXMgaW50YWN0IGFuZCBjdW11bGF0aXZlIGFjcm9zcyB0aGUgY3Jhc2gvcmVzdGFydAorCQkj IGJvdW5kYXJ5LgorCQkibG9nZ2luZ19jb2xsZWN0b3IiID0+ICJvbiIsCisJCSJsb2dfZGly ZWN0b3J5IiA9PiAnbG9nJywKKwkJImxvZ19maWxlbmFtZSIgPT4gJ3JlY292ZXJ5X2JlbmNo LmxvZycsCisJCSJsb2dfdHJ1bmNhdGVfb25fcm90YXRpb24iID0+ICdvZmYnLAorCisJCSMg RGVmYXVsdHMgc28gYW4gYXV0b21hdGljIGNoZWNrcG9pbnQgZG9lc24ndCBzbmVhayBpbiBt aWQtd29ya2xvYWQgYW5kCisJCSMgZmx1c2ggYXdheSB0aGUgdmVyeSBXQUwgd2Ugd2FudCAi Y3Jhc2giIHRvIGxlYXZlIGZvciByZWNvdmVyeSB0bworCQkjIHJlcGxheS4gZ3VjcyA9PiB7 Li4ufSBjYW4gb3ZlcnJpZGUgdGhlc2UgKGxhdGVyIGxpbmVzIHdpbiBpbgorCQkjIHBvc3Rn cmVzcWwuY29uZikuCisJCSJjaGVja3BvaW50X3RpbWVvdXQiID0+ICcxZCcsCisJCSJtYXhf d2FsX3NpemUiID0+ICcxMEdCJyk7CisKKwlpZiAoJHBhcmFtc3tndWNzfSkKKwl7CisJCSRv cHRpb25zeyRffSA9ICRwYXJhbXN7Z3Vjc317JF99IGZvciBrZXlzICV7ICRwYXJhbXN7Z3Vj c30gfTsKKwl9CisKKwkkc2VsZi0+X3N0ZXAoCisJCSJydW5uaW5nIGluaXRkYiIsCisJCXN1 YiB7CisJCQkkc2VsZi0+X3J1bl9vcl9kaWUoCisJCQkJJ2luaXRkYicsICctLW5vLXN5bmMn LAorCQkJCSctLXBnZGF0YScgPT4gJGRhdGFfZGlyLAorCQkJCSctLWF1dGgnID0+ICd0cnVz dCcpOworCQl9KTsKKworCSRzZWxmLT5fdXBkYXRlX2NvbmYoJW9wdGlvbnMpOworCisJJHNl bGYtPl9zdGVwKAorCQkic3RhcnRpbmcgc2VydmVyIiwKKwkJc3ViIHsKKwkJCSRzZWxmLT5f cnVuX29yX2RpZSgncGdfY3RsJywgJ3N0YXJ0JywgJy1EJyA9PiAkZGF0YV9kaXIsICctdycp OworCQl9KTsKKworCSMgQ2hlY2twb2ludCBCRUZPUkUgdGhlIHdvcmtsb2FkLCBub3QgYWZ0 ZXI6IHdlIHdhbnQgdGhlIHdvcmtsb2FkJ3MgV0FMCisJIyB0byBzdGlsbCBiZSB1bmZsdXNo ZWQgYXQgY3Jhc2ggdGltZSwgc28gImNyYXNoIiBsZWF2ZXMgcmVhbCB3b3JrIGZvcgorCSMg cmVjb3ZlcnkgdG8gcmVwbGF5LiBDaGVja3BvaW50aW5nIGFmdGVyIHRoZSB3b3JrbG9hZCAo dGhlIG9yaWdpbmFsLAorCSMgd3JvbmcsIG9yZGVyKSB3b3VsZCBmbHVzaCBpdCBhbGwgdG8g ZGlzayBmaXJzdCwgbGVhdmluZyBub3RoaW5nIHRvCisJIyByZWRvLgorCSRzZWxmLT5fc3Rl cCgKKwkJImNoZWNrcG9pbnRpbmciLAorCQlzdWIgeyAkc2VsZi0+X3BzcWxfc2NhbGFyKCJD SEVDS1BPSU5UIik7IH0pOworCXJldHVybjsKK30KKworPXBvZAorCis9aXRlbSAkcmVjb3Zl cnktPnByZXBhcmUoJXBhcmFtcykKKworUnVucyBhIGJ1bGsgd29ya2xvYWQgYWdhaW5zdCB0 aGUgYWxyZWFkeS1ydW5uaW5nIHNlcnZlciBDPHNldHVwPiBsZWZ0IHVwLiBEZWxpYmVyYXRl bHkgZG9lcyBub3QKK2NoZWNrcG9pbnQgYWZ0ZXJ3YXJkIC0gdGhlIHdvcmtsb2FkJ3MgV0FM IG11c3Qgc3RpbGwgYmUgdW5mbHVzaGVkIHdoZW4gQzxjcmFzaD4ga2lsbHMgdGhlIHNlcnZl ciwKK29yIHRoZXJlJ3Mgbm90aGluZyBmb3IgcmVjb3ZlcnkgdG8gcmVwbGF5LgorCitDPCVw YXJhbXM+OgorCis9b3ZlciA0CisKKz1pdGVtIEM8d29ya2xvYWQ+IChkZWZhdWx0IEM8cGdi ZW5jaD4pCisKK0M8cGdiZW5jaCAtaSAtcyBTQ0FMRT4sIHdoaWNoIGJ1bGstbG9hZHMgdmlh IEM8Q09QWT4gLSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgZG9taW5hbnQgcmVhbC13b3JsZAor V0FMIHBhdHRlcm4gKGJ1bGsgbG9hZCkuIFRoZSBvdGhlciBjaG9pY2UsIEM8Y3JlYXRlX2lu ZGV4PiwgZG9lcyB0aGUgc2FtZSBidWxrIGxvYWQgdGhlbgorQzxDUkVBVEUgSU5ERVg+IG9u IHRoZSBsb2FkZWQgdGFibGUsIHRvIGV4ZXJjaXNlIGluZGV4LWJ1aWxkIFdBTCBzcGVjaWZp Y2FsbHkuCisKKz1pdGVtIEM8c2NhbGU+IChkZWZhdWx0IDIwKQorCitQYXNzZWQgdG8gQzxw Z2JlbmNoIC1pIC1zPi4KKworPWJhY2sKKworPWN1dAorCitzdWIgcHJlcGFyZQoreworCW15 ICgkc2VsZiwgJXBhcmFtcykgPSBAXzsKKwlteSAkd29ya2xvYWQgPSAkcGFyYW1ze3dvcmts b2FkfSAvLyAncGdiZW5jaCc7CisJbXkgJHNjYWxlID0gJHBhcmFtc3tzY2FsZX0gLy8gMjA7 CisKKwlteSAkbWV0aG9kID0gJFdPUktMT0FEU3skd29ya2xvYWR9OworCWRpZSAicHJlcGFy ZTogdW5rbm93biB3b3JrbG9hZCAnJHdvcmtsb2FkJyAod2FudCAiCisJICAuIGpvaW4oJ3wn LCBzb3J0IGtleXMgJVdPUktMT0FEUykgLiAiKVxuIgorCSAgdW5sZXNzIGRlZmluZWQgJG1l dGhvZDsKKworCSRzZWxmLT5fc3RlcCgKKwkJInJ1bm5pbmcgd29ya2xvYWQgJyR3b3JrbG9h ZCcgKHNjYWxlICRzY2FsZSkiLAorCQlzdWIgeyAkc2VsZi0+JG1ldGhvZCgkc2NhbGUpOyB9 KTsKKworCSMgRGVsaWJlcmF0ZWx5IG5vIGNoZWNrcG9pbnQgaGVyZSAtIHRoZSB3b3JrbG9h ZCdzIFdBTCBtdXN0IHN0aWxsIGJlCisJIyB1bmZsdXNoZWQgd2hlbiAiY3Jhc2giIGtpbGxz IHRoZSBzZXJ2ZXIsIG9yIHRoZXJlJ3Mgbm90aGluZyBmb3IKKwkjIHJlY292ZXJ5IHRvIHJl cGxheS4KKwlyZXR1cm47Cit9CisKK3N1YiBfd29ya2xvYWRfcGdiZW5jaAoreworCW15ICgk c2VsZiwgJHNjYWxlKSA9IEBfOworCisJIyBwZ2JlbmNoIC1pIGJ1bGstbG9hZHMgdmlhIENP UFksIGV4dGVuZGluZyBwZ2JlbmNoX2FjY291bnRzIChhbmQKKwkjIGZyaWVuZHMpIHNlcXVl bnRpYWxseSAtIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBkb21pbmFudCByZWFsLXdvcmxkIFdB TAorCSMgcGF0dGVybiAoYnVsayBsb2FkIC8gQ09QWSkgYm90aCByZWFkLWNvYWxlc2Npbmcg Zml4ZXMgdGFyZ2V0LgorCSRzZWxmLT5fcnVuX29yX2RpZSgKKwkJJ3BnYmVuY2gnLCAnLWkn LAorCQknLXMnID0+ICRzY2FsZSwKKwkJJy1oJyA9PiAkc2VsZi0+aG9zdCwKKwkJJy1wJyA9 PiAkc2VsZi0+cG9ydCwKKwkJJHNlbGYtPntfY29ubmVjdF9kYn0pOworCXJldHVybjsKK30K Kworc3ViIF93b3JrbG9hZF9jcmVhdGVfaW5kZXgKK3sKKwlteSAoJHNlbGYsICRzY2FsZSkg PSBAXzsKKworCSRzZWxmLT5fcnVuX29yX2RpZSgKKwkJJ3BnYmVuY2gnLCAnLWknLAorCQkn LXMnID0+ICRzY2FsZSwKKwkJJy1JJyA9PiAnZHRnJywKKwkJJy1oJyA9PiAkc2VsZi0+aG9z dCwKKwkJJy1wJyA9PiAkc2VsZi0+cG9ydCwKKwkJJHNlbGYtPntfY29ubmVjdF9kYn0pOwor CSRzZWxmLT5fcHNxbF9zY2FsYXIoCisJCSJDUkVBVEUgSU5ERVggYmVuY2hfYWJhbF9pZHgg T04gcGdiZW5jaF9hY2NvdW50cyAoYWJhbGFuY2UpIik7CisJcmV0dXJuOworfQorCis9cG9k CisKKz1pdGVtICRyZWNvdmVyeS0+Y3Jhc2goKQorCitTZW5kcyBDPFNJR0tJTEw+IHRvIHRo ZSBwb3N0bWFzdGVyIGFuZCB3YWl0cyBmb3IgaXQgdG8gZXhpdC4gQjxEb2VzIG5vdCByZXN0 YXJ0IHRoZSBzZXJ2ZXIuPgorVGhpcyBpcyBpbnRlbnRpb25hbDogdGhlIHJlc3RhcnQgbmVl ZHMgdG8gaGFwcGVuIHVuZGVyIGEgcnVubmluZyB0cmFjZSBzbyBubyByZWFkcyBhdCB0aGUg dmVyeQorc3RhcnQgb2YgcmVjb3ZlcnkgYXJlIG1pc3NlZC4KKworPWN1dAorCitzdWIgY3Jh c2gKK3sKKwlteSAoJHNlbGYpID0gQF87CisJbXkgJGRhdGFfZGlyID0gJHNlbGYtPmRhdGFf ZGlyOworCisJbXkgJHBpZGZpbGUgPSAiJGRhdGFfZGlyL3Bvc3RtYXN0ZXIucGlkIjsKKwlv cGVuKG15ICRmaCwgJzwnLCAkcGlkZmlsZSkKKwkgIG9yIGRpZSAiY3Jhc2g6IGNhbm5vdCBv cGVuICRwaWRmaWxlOiAkIVxuIgorCSAgLiAiKGlzIHRoZSBzZXJ2ZXIgYWN0dWFsbHkgcnVu bmluZz8gZGlkIHlvdSBhbHJlYWR5IGNyYXNoIGl0PylcbiI7CisJbXkgJHBpZCA9IDwkZmg+ OworCWNsb3NlICRmaDsKKwljaG9tcCAkcGlkOworCWRpZSAiY3Jhc2g6IG5vIFBJRCBmb3Vu ZCBpbiAkcGlkZmlsZVxuIiB1bmxlc3MgJHBpZCA9fiAvXlxkKyQvOworCisJJHNlbGYtPl9z dGVwKAorCQkic2VuZGluZyBTSUdLSUxMIHRvIHBvc3RtYXN0ZXIgKHBpZCAkcGlkKSIsCisJ CXN1YiB7CisJCQlraWxsKDksICRwaWQpCisJCQkgIG9yIGRpZSAiY3Jhc2g6IGtpbGwoJHBp ZCkgZmFpbGVkOiAkIVxuIjsKKwkJfSk7CisKKwkkc2VsZi0+X3N0ZXAoCisJCSJ3YWl0aW5n IGZvciBwb3N0bWFzdGVyIHRvIGV4aXQiLAorCQlzdWIgeworCQkJIyBTSUdLSUxMIGlzIG5v dCBpbnN0YW50YW5lb3VzIGZyb20gdGhlIGNhbGxlcidzIHBvaW50IG9mIHZpZXcuCisJCQlm b3IgKDEgLi4gMTAwKQorCQkJeworCQkJCWxhc3QgdW5sZXNzIGtpbGwoMCwgJHBpZCk7CisJ CQkJVGltZTo6SGlSZXM6OnNsZWVwKDAuMSk7CisJCQl9CisJCQlkaWUgImNyYXNoOiBwaWQg JHBpZCBzdGlsbCBhbGl2ZSBhZnRlciAxMHNcbiIgaWYga2lsbCgwLCAkcGlkKTsKKwkJfSk7 CisKKwlwcmludCAiXG49PT0gY3Jhc2ggZG9uZSAtIHNlcnZlciBpcyBET1dOLCBub3QgcmVz dGFydGVkID09PVxuIjsKKwlwcmludCAiVG8gbWVhc3VyZSByZWNvdmVyeSwgdHJhY2UgdGhl IHJlc3RhcnQsIGUuZy46XG5cbiI7CisJcHJpbnQgIiAgc3VkbyBicGZ0cmFjZSBzcmMvdG9v bHMvYnBmdHJhY2UvcmVjb3ZlcnlfcmVhZF9oaXN0LmJ0IFxcXG4iOworCXByaW50ICIgICAg ICAtYyAncGdfY3RsIHN0YXJ0IC1EICRkYXRhX2RpciAtdydcblxuIjsKKwlwcmludCAiUmVj b3ZlcnkgdGltaW5nIGFuZCBwZ19zdGF0X2lvIGRlbHRhcyBhcmUgdGhlIGNhbGxlcidzICIK KwkgIC4gInJlc3BvbnNpYmlsaXR5IC0gc2VlIFJFQURNRS5tZC5cbiI7CisJcmV0dXJuOwor fQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcHJpdmF0ZSBoZWxwZXJzCisjIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKworIyBSdW4gJGNvZGUsIHByaW50aW5nICIkZGVzY3JpcHRpb24uLi5kb25l IiBvbiBzdWNjZXNzIG9yCisjICIkZGVzY3JpcHRpb24uLi5GQUlMRUQhIiBmb2xsb3dlZCBi eSB0aGUgZXJyb3Igb24gZmFpbHVyZS4gJGNvZGUgc2lnbmFscworIyBmYWlsdXJlIHRoZSBu b3JtYWwgd2F5LCBieSBkeWluZzsgX3N0ZXAgY2F0Y2hlcyB0aGF0LCByZXBvcnRzIGl0LCBh bmQKKyMgZXhpdHMgKHJhdGhlciB0aGFuIHJlLWR5aW5nIGl0c2VsZiwgd2hpY2ggd291bGQg cmlzayB0aGUgZXJyb3IgYmVpbmcKKyMgcHJpbnRlZCB0d2ljZSAtIG9uY2UgaGVyZSwgb25j ZSBieSBhbiBvdXRlciB1bmNhdWdodC1kaWUgaGFuZGxlcikuCitzdWIgX3N0ZXAKK3sKKwlt eSAoJHNlbGYsICRkZXNjcmlwdGlvbiwgJGNvZGUpID0gQF87CisJbG9jYWwgJHwgPSAxOwor CXByaW50ICIkZGVzY3JpcHRpb24uLi4iOworCW15ICRvayA9IGV2YWwgeyAkY29kZS0+KCk7 IDEgfTsKKwlpZiAoJG9rKQorCXsKKwkJcHJpbnQgImRvbmVcbiI7CisJCXJldHVybjsKKwl9 CisJbXkgJGVycm9yID0gJEA7CisJJGVycm9yID0gInVua25vd24gZXJyb3JcbiIgdW5sZXNz IGxlbmd0aCAkZXJyb3I7CisJcHJpbnQgIkZBSUxFRCFcbiI7CisJcHJpbnQgU1RERVJSICRl cnJvcjsKKwlwcmludCBTVERFUlIgIlxuIiB1bmxlc3MgJGVycm9yID1+IC9cblx6LzsKKwll eGl0IDE7Cit9CisKK3N1YiBfdXBkYXRlX2NvbmYKK3sKKwlteSAoJHNlbGYsICVvcHRpb25z KSA9IEBfOworCW15ICRkYXRhX2RpciA9ICRzZWxmLT5kYXRhX2RpcjsKKwlvcGVuKG15ICRj b25mLCAnPj4nLCAiJGRhdGFfZGlyL3Bvc3RncmVzcWwuY29uZiIpCisJICBvciBkaWUgImNh bm5vdCBhcHBlbmQgdG8gJGRhdGFfZGlyL3Bvc3RncmVzcWwuY29uZjogJCFcbiI7CisJcHJp bnQgJGNvbmYgIlxuIyBBZGRlZCBieSBQb3N0Z3JlU1FMOjpUZXN0OjpSZWNvdmVyeVxuIjsK Kwlmb3JlYWNoIG15ICRrZXkgKGtleXMgJW9wdGlvbnMpCisJeworCQlwcmludCAkY29uZiAi JGtleSA9ICckb3B0aW9uc3ska2V5fSdcbiI7CisJfQorCXJldHVybjsKK30KKworIyBSZWNv dmVyIHRoZSBwb3J0IHNldHVwKCkgd3JvdGUgaW50byBwb3N0Z3Jlc3FsLmNvbmYuIEF2b2lk cyBuZWVkaW5nIGEKKyMgc2VwYXJhdGUgc3RhdGUgZmlsZSBzaGFyZWQgYmV0d2VlbiBwcm9j ZXNzZXMgY29uc3RydWN0ZWQgYWdhaW5zdCB0aGUKKyMgc2FtZSwgYWxyZWFkeS1zZXQtdXAg ZGF0YSBkaXJlY3RvcnkuCitzdWIgX3JlYWRfcG9ydF9mcm9tX2NvbmYKK3sKKwlteSAoJHNl bGYpID0gQF87CisJbXkgJGRhdGFfZGlyID0gJHNlbGYtPmRhdGFfZGlyOworCW9wZW4obXkg JGZoLCAnPCcsICIkZGF0YV9kaXIvcG9zdGdyZXNxbC5jb25mIikKKwkgIG9yIGRpZSAiY2Fu bm90IG9wZW4gJGRhdGFfZGlyL3Bvc3RncmVzcWwuY29uZjogJCFcbiI7CisJd2hpbGUgKG15 ICRsaW5lID0gPCRmaD4pCisJeworCQlyZXR1cm4gJDEgaWYgJGxpbmUgPX4gL15ccypwb3J0 XHMqPVxzKic/KFxkKyknPy87CisJfQorCWRpZSAiY291bGQgbm90IGZpbmQgJ3BvcnQnIGlu ICRkYXRhX2Rpci9wb3N0Z3Jlc3FsLmNvbmZcbiI7Cit9CisKKyMgQmluZCB0byBwb3J0IDAg dG8gbGV0IHRoZSBPUyBwaWNrIGEgZnJlZSBwb3J0LCB0aGVuIHJlbGVhc2UgaXQuIFNtYWxs CisjIFRPQ1RPVSByYWNlIGJldHdlZW4gdGhlIGNsb3NlKCkgaGVyZSBhbmQgcG9zdGdyZXMg YWN0dWFsbHkgYmluZGluZyBpdAorIyBsYXRlciAtIGFjY2VwdGFibGUgZm9yIGEgbWFudWFs bHktcnVuIGRldmVsb3BlciB0b29sLgorc3ViIF9mcmVlX3BvcnQKK3sKKwlteSAkc29jayA9 IElPOjpTb2NrZXQ6OklORVQtPm5ldygKKwkJTGlzdGVuID0+IDEsCisJCUxvY2FsQWRkciA9 PiAnMTI3LjAuMC4xJywKKwkJTG9jYWxQb3J0ID0+IDAsCisJCVJldXNlQWRkciA9PiAxKSBv ciBkaWUgImNhbm5vdCBhbGxvY2F0ZSBhIGZyZWUgcG9ydDogJCFcbiI7CisJbXkgJHBvcnQg PSAkc29jay0+c29ja3BvcnQ7CisJJHNvY2stPmNsb3NlOworCXJldHVybiAkcG9ydDsKK30K Kworc3ViIF9ydW5fb3JfZGllCit7CisJbXkgKCRzZWxmLCBAY21kKSA9IEBfOworCXN5c3Rl bShAY21kKSA9PSAwIG9yIGRpZSAiY29tbWFuZCBmYWlsZWQgKGV4aXQgJD8pOiBAY21kXG4i OworCXJldHVybjsKK30KKworIyBMaXN0LWZvcm0gb3Blbiwgbm90IGJhY2t0aWNrcy9zaGVs bCBpbnRlcnBvbGF0aW9uOiBzb21lIGNhbGxlcnMgcGFzcworIyBtdWx0aS1saW5lIFNRTCwg d2hpY2ggd291bGQgYmUgYXdrd2FyZCBhbmQgZnJhZ2lsZSB0byBlbWJlZCBjb3JyZWN0bHkg aW4KKyMgYSBzaGVsbCBjb21tYW5kIHN0cmluZy4KK3N1YiBfcHNxbF90cnkKK3sKKwlteSAo JHNlbGYsICRzcWwpID0gQF87CisJbXkgQGNtZCA9ICgKKwkJJ3BzcWwnLCAnLVgnLCAnLXEn LCAnLUEnLCAnLXQnLAorCQknLWgnID0+ICRzZWxmLT5ob3N0LAorCQknLXAnID0+ICRzZWxm LT5wb3J0LAorCQknLWQnID0+ICRzZWxmLT57X2Nvbm5lY3RfZGJ9LAorCQknLWMnID0+ICRz cWwpOworCisJIyBMaXN0LWZvcm0gb3BlbiBleGVjcyBkaXJlY3RseSAobm8gc2hlbGwpLCBz byBzdGRlcnIgaXMgaW5oZXJpdGVkIGZyb20KKwkjIHRoaXMgcHJvY2VzcyByYXRoZXIgdGhh biBjYXB0dXJlZCAtIHBzcWwgZXJyb3JzIHByaW50IHN0cmFpZ2h0IHRvIG91cgorCSMgb3du IHN0ZGVyciwgd2hpY2ggaXMgZmluZSBmb3IgYW4gaW50ZXJhY3RpdmUgdG9vbDsgJG91dCBi ZWxvdyBpcworCSMgc3Rkb3V0IG9ubHkuCisJb3BlbihteSAkZmgsICctfCcsIEBjbWQpCisJ ICBvciByZXR1cm4gKDAsICJjYW5ub3QgcnVuIHBzcWw6ICQhIik7CisJbG9jYWwgJC87CisJ bXkgJG91dCA9IDwkZmg+OworCWNsb3NlICRmaDsKKwlyZXR1cm4gKCQ/ID09IDAsICRvdXQg Ly8gJycpOworfQorCitzdWIgX3BzcWxfc2NhbGFyCit7CisJbXkgKCRzZWxmLCAkc3FsKSA9 IEBfOworCW15ICgkb2ssICRvdXQpID0gJHNlbGYtPl9wc3FsX3RyeSgkc3FsKTsKKwlkaWUg InF1ZXJ5IGZhaWxlZDogJHNxbFxuJG91dFxuIiB1bmxlc3MgJG9rOworCWNob21wICRvdXQ7 CisJcmV0dXJuICRvdXQ7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9wZXJsL1Bv c3RncmVTUUwvVGVzdC9VdGlscy5wbSBiL3NyYy90ZXN0L3BlcmwvUG9zdGdyZVNRTC9UZXN0 L1V0aWxzLnBtCmluZGV4IGQzZTZhYmY3YTY4Li5mMTVmNWU5YzI3MiAxMDA2NDQKLS0tIGEv c3JjL3Rlc3QvcGVybC9Qb3N0Z3JlU1FML1Rlc3QvVXRpbHMucG0KKysrIGIvc3JjL3Rlc3Qv cGVybC9Qb3N0Z3JlU1FML1Rlc3QvVXRpbHMucG0KQEAgLTEwNjksNiArMTA2OSwzMSBAQCBz dWIgY29tbWFuZF9leGl0X2lzCiAJcmV0dXJuOwogfQogCisjIFJ1biAkY29kZSwgcHJpbnRp bmcgIiRkZXNjcmlwdGlvbi4uLmRvbmUiIG9uIHN1Y2Nlc3Mgb3IKKyMgIiRkZXNjcmlwdGlv bi4uLkZBSUxFRCEiIGZvbGxvd2VkIGJ5IHRoZSBlcnJvciBvbiBmYWlsdXJlLiAkY29kZSBz aWduYWxzCisjIGZhaWx1cmUgdGhlIG5vcm1hbCB3YXksIGJ5IGR5aW5nOyBfc3RlcCBjYXRj aGVzIHRoYXQsIHJlcG9ydHMgaXQsIGFuZAorIyBleGl0cyAocmF0aGVyIHRoYW4gcmUtZHlp bmcgaXRzZWxmLCB3aGljaCB3b3VsZCByaXNrIHRoZSBlcnJvciBiZWluZworIyBwcmludGVk IHR3aWNlIC0gb25jZSBoZXJlLCBvbmNlIGJ5IGFuIG91dGVyIHVuY2F1Z2h0LWRpZSBoYW5k bGVyKS4KK3N1YiBjb21tYW5kX3N0ZXAKK3sKKwlteSAoJGRlc2NyLCAkY29kZSkgPSBAXzsK Kwlsb2NhbCAkfCA9IDE7CisJcHJpbnQgIiRkZXNjci4uLiI7CisJbXkgJG9rID0gZXZhbCB7 ICRjb2RlLT4oKTsgMSB9OworCWlmICgkb2spCisJeworCQlwcmludCAiZG9uZVxuIjsKKwkJ cmV0dXJuOworCX0KKwlteSAkZXJyb3IgPSAkQDsKKwkkZXJyb3IgPSAidW5rbm93biBlcnJv clxuIiB1bmxlc3MgbGVuZ3RoICRlcnJvcjsKKwlwcmludCAiRkFJTEVEIVxuIjsKKwlwcmlu dCBTVERFUlIgJGVycm9yOworCXByaW50IFNUREVSUiAiXG4iIHVubGVzcyAkZXJyb3IgPX4g L1xuXHovOworCWV4aXQgMTsKK30KKworCiA9cG9kCiAKID1pdGVtIHByb2dyYW1faGVscF9v ayhjbWQpCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS9iZW5jaC9yZWNvdmVyeV9i ZW5jaC5wbCBiL3NyYy90ZXN0L3JlY292ZXJ5L2JlbmNoL3JlY292ZXJ5X2JlbmNoLnBsCmlu ZGV4IGYzZDEzYmM3YzBmLi5hNzljYTBmZmY4OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVj b3ZlcnkvYmVuY2gvcmVjb3ZlcnlfYmVuY2gucGwKKysrIGIvc3JjL3Rlc3QvcmVjb3Zlcnkv YmVuY2gvcmVjb3ZlcnlfYmVuY2gucGwKQEAgLTcsMTg3ICs3LDgyIEBACiAjIHVuY29uZGl0 aW9uYWxseSBoaWphY2tzIFNURE9VVC9TVERFUlIgaW50byBhIGxvZyBmaWxlIGF0IGltcG9y dCB0aW1lCiAjIChCRUdJTiBibG9jayBpbiBVdGlscy5wbSksIHdoaWNoIGlzIGV4YWN0bHkg cmlnaHQgZm9yIHRoZSBwcm92ZS9UQVAKICMgaGFybmVzcyAob25seSAib2siLyJub3Qgb2si IGxpbmVzIGdvIHRvIHRoZSByZWFsIHRlcm1pbmFsKSBhbmQgZXhhY3RseQotIyB3cm9uZyBm b3IgYW4gaW50ZXJhY3RpdmUgQ0xJIHRvb2wsIHdoaWNoIGlzIHdoYXQgdGhpcyBpcy4KKyMg d3JvbmcgZm9yIGFuIGludGVyYWN0aXZlIENMSSB0b29sLCB3aGljaCBpcyB3aGF0IHRoaXMg aXMuIFRoZSBhY3R1YWwKKyMgc2V0dXAvcHJlcGFyZS9jcmFzaCBtZWNoYW5pY3MgbGl2ZSBp biBQb3N0Z3JlU1FMOjpUZXN0OjpSZWNvdmVyeSwgd2hpY2gKKyMgY2FycmllcyB0aGUgc2Ft ZSBjb25zdHJhaW50IC0gdGhpcyBmaWxlIGlzIGp1c3QgQ0xJIHBhcnNpbmcvZGlzcGF0Y2gK KyMgYXJvdW5kIGl0LgogIwogIyBSdW4gd2l0aCAtLWhlbHAgKG9yIHNlZSB0aGUgbWFudWFs IGFmdGVyIF9fRU5EX18gYmVsb3csIGUuZy4gdmlhCiAjIGBwZXJsZG9jIHJlY292ZXJ5X2Jl bmNoLnBsYCkgZm9yIHRoZSBmdWxsIG1hbnVhbC4KIAogdXNlIHN0cmljdDsKIHVzZSB3YXJu aW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46 OlJlYWxCaW4vLi4vLi4vcGVybCI7CiB1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnNG cm9tQXJyYXkpOwotdXNlIFRpbWU6OkhpUmVzOwotdXNlIElPOjpTb2NrZXQ6OklORVQ7CiB1 c2UgUG9kOjpVc2FnZTsKIAotc3ViIHN0ZXAgKCQkKTsKLQotbXkgJWNvbW1hbmRzID0gKAot CSdzZXR1cCcgPT4gXCZjbWRfc2V0dXAsCi0JJ3ByZXBhcmUnID0+IFwmY21kX3ByZXBhcmUs Ci0JJ2NyYXNoJyA9PiBcJmNtZF9jcmFzaCk7Ci0KLSMgTXVzdCBiZSBhc3NpZ25lZCBoZXJl LCBiZWZvcmUgdGhlIHRvcC1sZXZlbCBkaXNwYXRjaC9leGl0IGJlbG93IC0gYSAibXkiCi0j IGhhc2ggbGl0ZXJhbCBpcyBhIHJ1bnRpbWUgc3RhdGVtZW50LCBub3QgaG9pc3RlZCBsaWtl ICJzdWIgTkFNRSB7fSIgaXMsIHNvCi0jIHBsYWNpbmcgaXQgYWZ0ZXIgZXhpdCAwIChhcyBv cmlnaW5hbGx5IHdyaXR0ZW4pIGxlZnQgaXQgcGVybWFuZW50bHkgZW1wdHkuCi1teSAld29y a2xvYWQgPSAoCi0JJ3BnYmVuY2gnID0+IFwmd29ya2xvYWRfcGdiZW5jaCwKLQknY3JlYXRl X2luZGV4JyA9PiBcJndvcmtsb2FkX2NyZWF0ZV9pbmRleCk7Ci0KLW15ICRjb25uZWN0X2Ri ID0gJ3Bvc3RncmVzJzsKLW15ICRjbWQgPSBzaGlmdCBAQVJHVjsKLQotaWYgKGRlZmluZWQg JGNtZCkKLXsKLQlpZiAoJGNtZCBlcSAnLS1oZWxwJyB8fCAkY21kIGVxICctaCcpCi0Jewot CQlwb2QydXNhZ2UoLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMik7Ci0JfQotfQotZWxz ZQotewotCXVzYWdlKCJubyBzdWJjb21tYW5kIGdpdmVuIik7Ci19Ci0KLWlmIChleGlzdHMg JGNvbW1hbmRzeyRjbWR9KQotewotCSRjb21tYW5kc3skY21kfS0+KEBBUkdWKTsKLX0KLWVs c2UKLXsKLQl1c2FnZSgidW5rbm93biBzdWJjb21tYW5kICckY21kJyIpOwotfQotCi1leGl0 IDA7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6UmVjb3Zlcnk7CiAKIHN1YiB1c2FnZQogewog CW15ICgkbGluZSkgPSBAXzsKIAotCXByaW50IFNUREVSUiAiJGxpbmVcblxuIiBpZiBkZWZp bmVkICRsaW5lOwotCXBvZDJ1c2FnZSgKLQkJLWV4aXR2YWwgPT4gMSwKLQkJLXZlcmJvc2Ug PT4gOTksCi0JCS1zZWN0aW9ucyA9PiAnTkFNRXxTWU5PUFNJU3xTVUJDT01NQU5EUycpOwor CWlmIChkZWZpbmVkICRsaW5lKQorCXsKKwkJcHJpbnQgU1RERVJSICIkbGluZVxuXG4iOwor CQlwb2QydXNhZ2UoCisJCQktZXhpdHZhbCA9PiAxLAorCQkJLXZlcmJvc2UgPT4gOTksCisJ CQktc2VjdGlvbnMgPT4gJ05BTUV8U1lOT1BTSVN8U1VCQ09NTUFORFMnKTsKKwl9CisJZWxz ZQorCXsKKwkJcG9kMnVzYWdlKAorCQkJLWV4aXR2YWwgPT4gMCwKKwkJCS12ZXJib3NlID0+ IDIpOworCX0KIH0KIAotIyBBbGwgdGhyZWUgc3ViY29tbWFuZHMgb3BlcmF0ZSBvbiBhIHNp bmdsZSBQR0RBVEEsIHRha2VuIGZyb20gdGhlCi0jIGVudmlyb25tZW50IC0gdGhlIHNhbWUg dmFyaWFibGUgaW5pdGRiL3BnX2N0bC9wb3N0Z3JlcyB0aGVtc2VsdmVzCi0jIHJlc3BlY3Qg LSByYXRoZXIgdGhhbiBhIC0tZGF0YS1kaXIgb3B0aW9uLgorIyBBbGwgc3ViY29tbWFuZHMg b3BlcmF0ZSBvbiBhIHNpbmdsZSBQR0RBVEEsIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50 IC0KKyMgdGhlIHNhbWUgdmFyaWFibGUgaW5pdGRiL3BnX2N0bC9wb3N0Z3JlcyB0aGVtc2Vs dmVzIHJlc3BlY3QgLSByYXRoZXIgdGhhbgorIyBhIC0tZGF0YS1kaXIgb3B0aW9uLgogc3Vi IGdldF9kYXRhX2RpcgogewogCXJldHVybiAkRU5We1BHREFUQX0gaWYgZGVmaW5lZCAkRU5W e1BHREFUQX0gJiYgbGVuZ3RoICRFTlZ7UEdEQVRBfTsKIAlkaWUgIlBHREFUQSBlbnZpcm9u bWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0XG4iOwogfQogCi1zdWIgdXBkYXRlX2NvbmYKLXsK LQlteSAoJGRhdGFfZGlyLCAlb3B0aW9ucykgPSBAXzsKLQlvcGVuKG15ICRjb25mLCAnPj4n LCAiJGRhdGFfZGlyL3Bvc3RncmVzcWwuY29uZiIpCi0JICBvciBkaWUgImNhbm5vdCBhcHBl bmQgdG8gJGRhdGFfZGlyL3Bvc3RncmVzcWwuY29uZjogJCFcbiI7Ci0JcHJpbnQgJGNvbmYg IlxuIyBBZGRlZCBieSByZWNvdmVyeV9iZW5jaC5wbFxuIjsKLQlmb3JlYWNoIG15ICRrZXkg KGtleXMgJW9wdGlvbnMpCi0JewotCQlwcmludCAkY29uZiAiJGtleSA9ICckb3B0aW9uc3sk a2V5fSdcbiI7Ci0JfQotfQotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgc2V0dXAKICMgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogCiBzdWIgY21kX3NldHVwCiB7Ci0JbXkgJGRhdGFfZGlyID0gZ2V0 X2RhdGFfZGlyKCk7CiAJbXkgQGd1Y3M7CiAKIAlHZXRPcHRpb25zRnJvbUFycmF5KFxAXywg J2d1Yz1zJyA9PiBcQGd1Y3MsKQogCSAgb3IgdXNhZ2UoInNldHVwOiBpbnZhbGlkIG9wdGlv bnMiKTsKLQlkaWUgInNldHVwOiAkZGF0YV9kaXIgYWxyZWFkeSBleGlzdHNcbiIgaWYgLWUg JGRhdGFfZGlyOwotCi0JbXkgJGhvc3QgPSAnbG9jYWxob3N0JzsKLQlteSAkcG9ydCA9IGZy ZWVfcG9ydCgpOwotCi0JbXkgJW9wdGlvbnMgPSAoCi0JCSdwb3J0JyA9PiAkcG9ydCwKLQkJ J2xpc3Rlbl9hZGRyZXNzZXMnID0+ICRob3N0LAotCi0JCSMgU3RhdGljLCBub24tcm90YXRp bmcgbG9nIGZpbGUgc28gInJlcG9ydCIgKGEgc2VwYXJhdGUKLQkJIyBwcm9jZXNzLCBwb3Nz aWJseSBhZnRlciBhIGNyYXNoKSBjYW4gZmluZCBpdAotCQkjIGRldGVybWluaXN0aWNhbGx5 LCBhbmQgc28gaXQgc3RheXMgaW50YWN0IGFuZCBjdW11bGF0aXZlCi0JCSMgYWNyb3NzIHRo ZSBjcmFzaC9yZXN0YXJ0IGJvdW5kYXJ5LgotCQkibG9nZ2luZ19jb2xsZWN0b3IiID0+ICJv biIsCi0JCSJsb2dfZGlyZWN0b3J5IiA9PiAnbG9nJywKLQkJImxvZ19maWxlbmFtZSIgPT4g J3JlY292ZXJ5X2JlbmNoLmxvZycsCi0JCSJsb2dfdHJ1bmNhdGVfb25fcm90YXRpb24iID0+ ICdvZmYnLAotCi0JCSMgRGVmYXVsdHMgc28gYW4gYXV0b21hdGljIGNoZWNrcG9pbnQgZG9l c24ndCBzbmVhayBpbiBtaWQtd29ya2xvYWQgYW5kCi0JCSMgZmx1c2ggYXdheSB0aGUgdmVy eSBXQUwgd2Ugd2FudCAiY3Jhc2giIHRvIGxlYXZlIGZvciByZWNvdmVyeSB0bwotCQkjIHJl cGxheS4gLS1ndWMgY2FuIG92ZXJyaWRlIHRoZXNlIChsYXRlciBsaW5lcyB3aW4gaW4gcG9z dGdyZXNxbC5jb25mKS4KLQkJImNoZWNrcG9pbnRfdGltZW91dCIgPT4gJzFkJywKLQkJIm1h eF93YWxfc2l6ZSIgPT4gJzEwR0InKTsKIAorCW15ICVndWNzOwogCWZvciBteSAkZ3VjIChA Z3VjcykKIAl7CiAJCWRpZSAic2V0dXA6IC0tZ3VjIG11c3QgYmUgbmFtZT12YWx1ZSwgZ290 ICckZ3VjJ1xuIgogCQkgIHVubGVzcyAkZ3VjID1+IC9eKFtBLVphLXpfLl0rKT0oLiopJC87 Ci0JCSRvcHRpb25zeyQxfSA9ICQyOworCQkkZ3Vjc3skMX0gPSAkMjsKIAl9CiAKLQlzdGVw ICJydW5uaW5nIGluaXRkYiIsIHN1YiB7Ci0JCXJ1bl9vcl9kaWUoCi0JCQknaW5pdGRiJywg Jy0tbm8tc3luYycsCi0JCQknLS1wZ2RhdGEnID0+ICRkYXRhX2RpciwKLQkJCSctLWF1dGgn ID0+ICd0cnVzdCcpOwotCX07Ci0KLQl1cGRhdGVfY29uZigkZGF0YV9kaXIsICVvcHRpb25z KTsKLQotCXN0ZXAgInN0YXJ0aW5nIHNlcnZlciIsCi0JICBzdWIgeyBydW5fb3JfZGllKCdw Z19jdGwnLCAnc3RhcnQnLCAnLUQnID0+ICRkYXRhX2RpciwgJy13Jyk7IH07Ci0KLQkjIENo ZWNrcG9pbnQgQkVGT1JFIHRoZSB3b3JrbG9hZCwgbm90IGFmdGVyOiB3ZSB3YW50IHRoZSB3 b3JrbG9hZCdzIFdBTAotCSMgdG8gc3RpbGwgYmUgdW5mbHVzaGVkIGF0IGNyYXNoIHRpbWUs IHNvICJjcmFzaCIgbGVhdmVzIHJlYWwgd29yayBmb3IKLQkjIHJlY292ZXJ5IHRvIHJlcGxh eS4gQ2hlY2twb2ludGluZyBhZnRlciB0aGUgd29ya2xvYWQgKHRoZSBvcmlnaW5hbCwKLQkj IHdyb25nLCBvcmRlcikgd291bGQgZmx1c2ggaXQgYWxsIHRvIGRpc2sgZmlyc3QsIGxlYXZp bmcgbm90aGluZyB0bwotCSMgcmVkby4KLQlzdGVwICJjaGVja3BvaW50aW5nIiwKLQkgIHN1 YiB7IHBzcWxfc2NhbGFyKCRob3N0LCAkcG9ydCwgJGNvbm5lY3RfZGIsICJDSEVDS1BPSU5U Iik7IH07CisJUG9zdGdyZVNRTDo6VGVzdDo6UmVjb3ZlcnktPm5ldyhkYXRhX2RpciA9PiBn ZXRfZGF0YV9kaXIoKSkKKwkgIC0+c2V0dXAoZ3VjcyA9PiBcJWd1Y3MpOworCXJldHVybjsK IH0KIAotCi1zdWIgd29ya2xvYWRfcGdiZW5jaAotewotCW15ICgkaG9zdCwgJHBvcnQsICRz Y2FsZSkgPSBAXzsKLQotCSMgcGdiZW5jaCAtaSBidWxrLWxvYWRzIHZpYSBDT1BZLCBleHRl bmRpbmcgcGdiZW5jaF9hY2NvdW50cwotCSMgKGFuZCBmcmllbmRzKSBzZXF1ZW50aWFsbHkg LSByZXByZXNlbnRhdGl2ZSBvZiB0aGUKLQkjIGRvbWluYW50IHJlYWwtd29ybGQgV0FMIHBh dHRlcm4gKGJ1bGsgbG9hZCAvIENPUFkpIGJvdGgKLQkjIHJlYWQtY29hbGVzY2luZyBmaXhl cyB0YXJnZXQuCi0JcnVuX29yX2RpZSgKLQkJJ3BnYmVuY2gnLCAnLWknLAotCQknLXMnID0+ ICRzY2FsZSwKLQkJJy1oJyA9PiAkaG9zdCwKLQkJJy1wJyA9PiAkcG9ydCwKLQkJJGNvbm5l Y3RfZGIpOwotfQotCi1zdWIgd29ya2xvYWRfY3JlYXRlX2luZGV4Ci17Ci0JbXkgKCRob3N0 LCAkcG9ydCwgJHNjYWxlKSA9IEBfOwotCXJ1bl9vcl9kaWUoCi0JCSdwZ2JlbmNoJywgJy1p JywKLQkJJy1zJyA9PiAkc2NhbGUsCi0JCSctSScgPT4gJ2R0ZycsCi0JCSctaCcgPT4gJGhv c3QsCi0JCSctcCcgPT4gJHBvcnQsCi0JCSRjb25uZWN0X2RiKTsKLQlwc3FsX3NjYWxhcigk aG9zdCwgJHBvcnQsICRjb25uZWN0X2RiLAotCQkiQ1JFQVRFIElOREVYIGJlbmNoX2FiYWxf aWR4IE9OIHBnYmVuY2hfYWNjb3VudHMgKGFiYWxhbmNlKSIpOwotfQorIyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisjIHByZXBhcmUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdWIgY21kX3ByZXBh cmUKIHsKLQlteSAkZGF0YV9kaXIgPSBnZXRfZGF0YV9kaXIoKTsKIAlteSAkd29ya2xvYWQg PSAncGdiZW5jaCc7CiAJbXkgJHNjYWxlID0gMjA7CiAKQEAgLTE5NiwzOSArOTEsOSBAQCBz dWIgY21kX3ByZXBhcmUKIAkJJ3dvcmtsb2FkPXMnID0+IFwkd29ya2xvYWQsCiAJCSdzY2Fs ZT1pJyA9PiBcJHNjYWxlKSBvciB1c2FnZSgicHJlcGFyZTogaW52YWxpZCBvcHRpb25zIik7 CiAKLQlteSAkaG9zdCA9ICdsb2NhbGhvc3QnOwotCW15ICRwb3J0ID0gcmVhZF9wb3J0X2Zy b21fY29uZigkZGF0YV9kaXIpOwotCi0JaWYgKGV4aXN0cyAkd29ya2xvYWR7JHdvcmtsb2Fk fSkKLQl7Ci0JCXN0ZXAgInJ1bm5pbmcgd29ya2xvYWQgJyR3b3JrbG9hZCcgKHNjYWxlICRz Y2FsZSkiLCBzdWIgewotCQkJJHdvcmtsb2FkeyR3b3JrbG9hZH0tPigkaG9zdCwgJHBvcnQs ICRzY2FsZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZGllICJwcmVwYXJlOiB1bmtub3du IC0td29ya2xvYWQgJyR3b3JrbG9hZCcgIgotCQkgIC4gIih3YW50IHBnYmVuY2h8Y3JlYXRl X2luZGV4KVxuIjsKLQl9Ci0KLQkjIERlbGliZXJhdGVseSBubyBjaGVja3BvaW50IGhlcmUg LSB0aGUgd29ya2xvYWQncyBXQUwgbXVzdCBzdGlsbCBiZQotCSMgdW5mbHVzaGVkIHdoZW4g ImNyYXNoIiBraWxscyB0aGUgc2VydmVyLCBvciB0aGVyZSdzIG5vdGhpbmcgZm9yCi0JIyBy ZWNvdmVyeSB0byByZXBsYXkuCi19Ci0KLSMgQmluZCB0byBwb3J0IDAgdG8gbGV0IHRoZSBP UyBwaWNrIGEgZnJlZSBwb3J0LCB0aGVuIHJlbGVhc2UgaXQuIFNtYWxsCi0jIFRPQ1RPVSBy YWNlIGJldHdlZW4gdGhlIGNsb3NlKCkgaGVyZSBhbmQgcG9zdGdyZXMgYWN0dWFsbHkgYmlu ZGluZyBpdAotIyBsYXRlciAtIGFjY2VwdGFibGUgZm9yIGEgbWFudWFsbHktcnVuIGRldmVs b3BlciB0b29sLgotc3ViIGZyZWVfcG9ydAotewotCW15ICRzb2NrID0gSU86OlNvY2tldDo6 SU5FVC0+bmV3KAotCQlMaXN0ZW4gPT4gMSwKLQkJTG9jYWxBZGRyID0+ICcxMjcuMC4wLjEn LAotCQlMb2NhbFBvcnQgPT4gMCwKLQkJUmV1c2VBZGRyID0+IDEpIG9yIGRpZSAiY2Fubm90 IGFsbG9jYXRlIGEgZnJlZSBwb3J0OiAkIVxuIjsKLQlteSAkcG9ydCA9ICRzb2NrLT5zb2Nr cG9ydDsKLQkkc29jay0+Y2xvc2U7Ci0JcmV0dXJuICRwb3J0OworCVBvc3RncmVTUUw6OlRl c3Q6OlJlY292ZXJ5LT5uZXcoZGF0YV9kaXIgPT4gZ2V0X2RhdGFfZGlyKCkpCisJICAtPnBy ZXBhcmUod29ya2xvYWQgPT4gJHdvcmtsb2FkLCBzY2FsZSA9PiAkc2NhbGUpOworCXJldHVy bjsKIH0KIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzcsMTIzICsxMDIsMjggQEAgc3Vi IGZyZWVfcG9ydAogCiBzdWIgY21kX2NyYXNoCiB7Ci0JbXkgJGRhdGFfZGlyID0gZ2V0X2Rh dGFfZGlyKCk7CiAJR2V0T3B0aW9uc0Zyb21BcnJheShcQF8pIG9yIHVzYWdlKCJjcmFzaDog aW52YWxpZCBvcHRpb25zIik7CiAKLQlteSAkcGlkZmlsZSA9ICIkZGF0YV9kaXIvcG9zdG1h c3Rlci5waWQiOwotCW9wZW4obXkgJGZoLCAnPCcsICRwaWRmaWxlKQotCSAgb3IgZGllICJj cmFzaDogY2Fubm90IG9wZW4gJHBpZGZpbGU6ICQhXG4iCi0JICAuICIoaXMgdGhlIHNlcnZl ciBhY3R1YWxseSBydW5uaW5nPyBkaWQgeW91IGFscmVhZHkgY3Jhc2ggaXQ/KVxuIjsKLQlt eSAkcGlkID0gPCRmaD47Ci0JY2xvc2UgJGZoOwotCWNob21wICRwaWQ7Ci0JZGllICJjcmFz aDogbm8gUElEIGZvdW5kIGluICRwaWRmaWxlXG4iIHVubGVzcyAkcGlkID1+IC9eXGQrJC87 Ci0KLQlzdGVwICJzZW5kaW5nIFNJR0tJTEwgdG8gcG9zdG1hc3RlciAocGlkICRwaWQpIiwg c3ViIHsKLQkJa2lsbCg5LCAkcGlkKQotCQkgIG9yIGRpZSAiY3Jhc2g6IGtpbGwoJHBpZCkg ZmFpbGVkOiAkIVxuIjsKLQl9OwotCi0Jc3RlcCAid2FpdGluZyBmb3IgcG9zdG1hc3RlciB0 byBleGl0Iiwgc3ViIHsKLQkJIyBTSUdLSUxMIGlzIG5vdCBpbnN0YW50YW5lb3VzIGZyb20g dGhlIGNhbGxlcidzIHBvaW50IG9mIHZpZXcuCi0JCWZvciAoMSAuLiAxMDApCi0JCXsKLQkJ CWxhc3QgdW5sZXNzIGtpbGwoMCwgJHBpZCk7Ci0JCQlUaW1lOjpIaVJlczo6c2xlZXAoMC4x KTsKLQkJfQotCQlkaWUgImNyYXNoOiBwaWQgJHBpZCBzdGlsbCBhbGl2ZSBhZnRlciAxMHNc biIgaWYga2lsbCgwLCAkcGlkKTsKLQl9OwotCi0JcHJpbnQgIlxuPT09IGNyYXNoIGRvbmUg LSBzZXJ2ZXIgaXMgRE9XTiwgbm90IHJlc3RhcnRlZCA9PT1cbiI7Ci0JcHJpbnQgIlRvIG1l YXN1cmUgcmVjb3ZlcnksIHRyYWNlIHRoZSByZXN0YXJ0LCBlLmcuOlxuXG4iOwotCXByaW50 ICIgIHN1ZG8gYnBmdHJhY2Ugc3JjL3Rvb2xzL2JwZnRyYWNlL3JlY292ZXJ5X3JlYWRfaGlz dC5idCBcXFxuIjsKLQlwcmludCAiICAgICAgLWMgJ3BnX2N0bCBzdGFydCAtRCAkZGF0YV9k aXIgLXcnXG5cbiI7Ci0JcHJpbnQgIlJlY292ZXJ5IHRpbWluZyBhbmQgcGdfc3RhdF9pbyBk ZWx0YXMgYXJlIHRoZSBjYWxsZXIncyAiCi0JICAuICJyZXNwb25zaWJpbGl0eSBub3cgLSBz ZWUgUkVBRE1FLm1kLlxuIjsKKwlQb3N0Z3JlU1FMOjpUZXN0OjpSZWNvdmVyeS0+bmV3KGRh dGFfZGlyID0+IGdldF9kYXRhX2RpcigpKS0+Y3Jhc2goKTsKKwlyZXR1cm47CiB9CiAKLSMg LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQotIyBoZWxwZXJzCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK215ICVj b21tYW5kcyA9ICgKKwknc2V0dXAnID0+IFwmY21kX3NldHVwLAorCSdwcmVwYXJlJyA9PiBc JmNtZF9wcmVwYXJlLAorCSdjcmFzaCcgPT4gXCZjbWRfY3Jhc2gpOwogCi1zdWIgcnVuX29y X2RpZQotewotCXN5c3RlbShAXykgPT0gMCBvciBkaWUgImNvbW1hbmQgZmFpbGVkIChleGl0 ICQ/KTogQF9cbiI7Ci19CitteSAkY21kID0gc2hpZnQgQEFSR1Y7CiAKLSMgUnVuICRjb2Rl LCBwcmludGluZyAiJGRlc2NyaXB0aW9uLi4uZG9uZSIgb24gc3VjY2VzcyBvcgotIyAiJGRl c2NyaXB0aW9uLi4uRkFJTEVEISIgZm9sbG93ZWQgYnkgdGhlIGVycm9yIG9uIGZhaWx1cmUu ICRjb2RlIHNpZ25hbHMKLSMgZmFpbHVyZSB0aGUgbm9ybWFsIHdheSwgYnkgZHlpbmc7IHN0 ZXAoKSBjYXRjaGVzIHRoYXQsIHJlcG9ydHMgaXQsIGFuZAotIyBleGl0cyAocmF0aGVyIHRo YW4gcmUtZHlpbmcgaXRzZWxmLCB3aGljaCB3b3VsZCByaXNrIHRoZSBlcnJvciBiZWluZwot IyBwcmludGVkIHR3aWNlIC0gb25jZSBoZXJlLCBvbmNlIGJ5IGFuIG91dGVyIHVuY2F1Z2h0 LWRpZSBoYW5kbGVyKS4KLSMKLSMgQ2FsbGVkIGFzIGEgbGlzdG9wLCBubyBwYXJlbnM6IHN0 ZXAgImRlc2NyaXB0aW9uIiwgc3ViIHsgLi4uIH07Ci1zdWIgc3RlcCAoJCQpCi17Ci0JbXkg KCRkZXNjcmlwdGlvbiwgJGNvZGUpID0gQF87Ci0JbG9jYWwgJHwgPSAxOwotCXByaW50ICIk ZGVzY3JpcHRpb24uLi4iOwotCW15ICRvayA9IGV2YWwgeyAkY29kZS0+KCk7IDEgfTsKLQlp ZiAoJG9rKQotCXsKLQkJcHJpbnQgImRvbmVcbiI7Ci0JCXJldHVybjsKLQl9Ci0JbXkgJGVy cm9yID0gJEA7Ci0JJGVycm9yID0gInVua25vd24gZXJyb3JcbiIgdW5sZXNzIGxlbmd0aCAk ZXJyb3I7Ci0JcHJpbnQgIkZBSUxFRCFcbiI7Ci0JcHJpbnQgU1RERVJSICRlcnJvcjsKLQlw cmludCBTVERFUlIgIlxuIiB1bmxlc3MgJGVycm9yID1+IC9cblx6LzsKLQlleGl0IDE7Ci19 Cit1c2FnZSgpIGlmIGRlZmluZWQgJGNtZCAmJiAoJGNtZCBlcSAnLS1oZWxwJyB8fCAkY21k IGVxICctaCcpOwogCi0jIFJlY292ZXIgdGhlIHBvcnQgc2V0dXAoKSB3cm90ZSBpbnRvIHBv c3RncmVzcWwuY29uZi4gQXZvaWRzIG5lZWRpbmcgYQotIyBzZXBhcmF0ZSBzdGF0ZSBmaWxl IHNoYXJlZCBiZXR3ZWVuIHRoZSB0aHJlZSBzdWJjb21tYW5kcycgcHJvY2Vzc2VzLgotc3Vi IHJlYWRfcG9ydF9mcm9tX2NvbmYKLXsKLQlteSAoJGRhdGFfZGlyKSA9IEBfOwotCW9wZW4o bXkgJGZoLCAnPCcsICIkZGF0YV9kaXIvcG9zdGdyZXNxbC5jb25mIikKLQkgIG9yIGRpZSAi Y2Fubm90IG9wZW4gJGRhdGFfZGlyL3Bvc3RncmVzcWwuY29uZjogJCFcbiI7Ci0Jd2hpbGUg KG15ICRsaW5lID0gPCRmaD4pCi0JewotCQlyZXR1cm4gJDEgaWYgJGxpbmUgPX4gL15ccypw b3J0XHMqPVxzKic/KFxkKyknPy87Ci0JfQotCWRpZSAiY291bGQgbm90IGZpbmQgJ3BvcnQn IGluICRkYXRhX2Rpci9wb3N0Z3Jlc3FsLmNvbmZcbiI7Ci19Cit1c2FnZSgibm8gc3ViY29t bWFuZCBnaXZlbiIpIGlmIG5vdCBkZWZpbmVkICRjbWQ7CiAKLSMgTGlzdC1mb3JtIG9wZW4s IG5vdCBiYWNrdGlja3Mvc2hlbGwgaW50ZXJwb2xhdGlvbjogc29tZSBjYWxsZXJzIHBhc3MK LSMgbXVsdGktbGluZSBTUUwsIHdoaWNoIHdvdWxkIGJlIGF3a3dhcmQgYW5kIGZyYWdpbGUg dG8gZW1iZWQgY29ycmVjdGx5IGluCi0jIGEgc2hlbGwgY29tbWFuZCBzdHJpbmcuCi1zdWIg cHNxbF90cnkKLXsKLQlteSAoJGhvc3QsICRwb3J0LCAkZGJuYW1lLCAkc3FsKSA9IEBfOwot CW15IEBjbWQgPSAoCi0JCSdwc3FsJywgJy1YJywgJy1xJywgJy1BJywgJy10JywKLQkJJy1o JyA9PiAkaG9zdCwKLQkJJy1wJyA9PiAkcG9ydCwKLQkJJy1kJyA9PiAkZGJuYW1lLAotCQkn LWMnID0+ICRzcWwpOwotCi0JIyBMaXN0LWZvcm0gb3BlbiBleGVjcyBkaXJlY3RseSAobm8g c2hlbGwpLCBzbyBzdGRlcnIgaXMgaW5oZXJpdGVkIGZyb20KLQkjIHRoaXMgcHJvY2VzcyBy YXRoZXIgdGhhbiBjYXB0dXJlZCAtIHBzcWwgZXJyb3JzIHByaW50IHN0cmFpZ2h0IHRvIG91 cgotCSMgb3duIHN0ZGVyciwgd2hpY2ggaXMgZmluZSBmb3IgYW4gaW50ZXJhY3RpdmUgdG9v bDsgJG91dCBiZWxvdyBpcwotCSMgc3Rkb3V0IG9ubHkuCi0Jb3BlbihteSAkZmgsICctfCcs IEBjbWQpCi0JICBvciByZXR1cm4gKDAsICJjYW5ub3QgcnVuIHBzcWw6ICQhIik7Ci0JbG9j YWwgJC87Ci0JbXkgJG91dCA9IDwkZmg+OwotCWNsb3NlICRmaDsKLQlyZXR1cm4gKCQ/ID09 IDAsICRvdXQgLy8gJycpOwotfQordXNhZ2UoInVua25vd24gc3ViY29tbWFuZCAnJGNtZCci KSBpZiBub3QgZXhpc3RzICRjb21tYW5kc3skY21kfTsKIAotc3ViIHBzcWxfc2NhbGFyCi17 Ci0JbXkgKCRob3N0LCAkcG9ydCwgJGRibmFtZSwgJHNxbCkgPSBAXzsKLQlteSAoJG9rLCAk b3V0KSA9IHBzcWxfdHJ5KCRob3N0LCAkcG9ydCwgJGRibmFtZSwgJHNxbCk7Ci0JZGllICJx dWVyeSBmYWlsZWQ6ICRzcWxcbiRvdXRcbiIgdW5sZXNzICRvazsKLQljaG9tcCAkb3V0Owot CXJldHVybiAkb3V0OwotfQorJGNvbW1hbmRzeyRjbWR9LT4oQEFSR1YpOworCitleGl0IDA7 CiAKIF9fRU5EX18KIApAQCAtMzczLDcgKzE0Myw3IEBAIHJlY292ZXJ5X2JlbmNoLnBsIC0g bWFudWFsIHJlY292ZXJ5LXBlcmZvcm1hbmNlIGJlbmNobWFyayBoYXJuZXNzCiBBIHN0YW5k YWxvbmUgZGV2ZWxvcGVyIHRvb2wgZm9yIHRoZSBzZXR1cC9wcmVwYXJlL2NyYXNoIHN0ZXBz IG9mIGEKIFdBTC1yZWRvL2NyYXNoLXJlY292ZXJ5IGJlbmNobWFyaywgYmVmb3JlIGFuZCBh ZnRlciBhIGNoYW5nZSB0byB0aGUKIHJlY292ZXJ5IHJlYWQgcGF0aC4gUmVjb3ZlcnkgdGlt aW5nIGFuZCBDPHBnX3N0YXRfaW8+IHF1ZXJ5aW5nIGFyZQotZGVsaWJlcmF0ZWx5IG5vdCBk b25lIGJ5IHRoaXMgc2NyaXB0IC0gcnVuIHRob3NlIHlvdXJzZWxmLCBlLmcuIGZyb20KK2Rl bGliZXJhdGVseSBub3QgZG9uZSBieSB0aGlzIHNjcmlwdC4gUnVuIHRob3NlIHlvdXJzZWxm LCBlLmcuIGZyb20KIHRoZSB3cmFwcGVyIHNoZWxsIHNjcmlwdCB0aGF0IGRyaXZlcyB0aGUg d2hvbGUgd29ya2Zsb3cuCiAKIFRoaXMgaXMgSTxub3Q+IGEgVEFQIHRlc3Q6IGl0IGlzbid0 IHJ1biBieSBDPG1lc29uIHRlc3Q+IC8gQzxwcm92ZT4sCkBAIC0zODIsMTEgKzE1MiwxMyBA QCBDPHVzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlscz4gLSB0aGF0IG1vZHVsZSB1bmNvbmRp dGlvbmFsbHkgaGlqYWNrcwogU1RET1VUL1NUREVSUiBpbnRvIGEgbG9nIGZpbGUgYXQgaW1w b3J0IHRpbWUgKGEgQzxCRUdJTj4gYmxvY2sgaW4KIEY8VXRpbHMucG0+KSwgd2hpY2ggaXMg ZXhhY3RseSByaWdodCBmb3IgdGhlIHByb3ZlL1RBUCBoYXJuZXNzIChvbmx5CiAib2siLyJu b3Qgb2siIGxpbmVzIGdvIHRvIHRoZSByZWFsIHRlcm1pbmFsKSBhbmQgZXhhY3RseSB3cm9u ZyBmb3IgYW4KLWludGVyYWN0aXZlIENMSSB0b29sLCB3aGljaCBpcyB3aGF0IHRoaXMgaXMu CitpbnRlcmFjdGl2ZSBDTEkgdG9vbCwgd2hpY2ggaXMgd2hhdCB0aGlzIGlzLiBUaGUgYWN0 dWFsIG1lY2hhbmljcyBsaXZlCitpbiBDPFBvc3RncmVTUUw6OlRlc3Q6OlJlY292ZXJ5PiAo RjxzcmMvdGVzdC9wZXJsL1Bvc3RncmVTUUwvVGVzdC9SZWNvdmVyeS5wbT4pLAord2hpY2gg Y2FycmllcyB0aGUgc2FtZSBjb25zdHJhaW50OyB0aGlzIHNjcmlwdCBpcyBDTEkgcGFyc2lu Zy9kaXNwYXRjaAorYXJvdW5kIGl0LgogCiBBbGwgc3ViY29tbWFuZHMgb3BlcmF0ZSBvbiB0 aGUgZGF0YSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIEM8UEdEQVRBPgotZW52aXJvbm1lbnQg dmFyaWFibGUgLSB0aGUgc2FtZSB2YXJpYWJsZSBDPGluaXRkYj4vQzxwZ19jdGw+LwotQzxw b3N0Z3Jlcz4gdGhlbXNlbHZlcyByZXNwZWN0IC0gcmF0aGVyIHRoYW4gYSBjb21tYW5kLWxp bmUgb3B0aW9uLgorZW52aXJvbm1lbnQgdmFyaWFibGUgcmF0aGVyIHRoYW4gYSBjb21tYW5k LWxpbmUgb3B0aW9uLgogCiBSZXF1aXJlcyBDPGluaXRkYj4sIEM8cGdfY3RsPiwgQzxwc3Fs PiwgYW5kIEM8cGdiZW5jaD4gZnJvbSB0aGUgYnVpbGQKIHVuZGVyIHRlc3QgdG8gYmUgb24g QzxQQVRIPi4gU2VlIEY8UkVBRE1FLm1kPiBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgdGhlCkBA IC00MDEsOSArMTczLDkgQEAgZnVsbCB3b3JrZmxvdywgdGhlIEdVQyBtYXRyaXgsIGFuZCBj YXB0dXJlZCBiZWZvcmUvYWZ0ZXIgcmVzdWx0cy4KICAgICAgIC0tZ3VjIHJlY292ZXJ5X3By ZWZldGNoPW9uIC0tZ3VjIGZ1bGxfcGFnZV93cml0ZXM9b24KIAogQzxpbml0ZGI+cyBhIGZy ZXNoIGNsdXN0ZXIgYXQgQzwkUEdEQVRBPiAobXVzdCBub3QgYWxyZWFkeSBleGlzdCksCi1z dGFydHMgaXQsIGFuZCBjaGVja3BvaW50cyAtIGJlZm9yZSBhbnkgd29ya2xvYWQgcnVucywg c28gdGhlIHdvcmtsb2FkJ3MKLVdBTCBpcyBzdGlsbCB1bmZsdXNoZWQgd2hlbiBDPGNyYXNo PiBsYXRlciBraWxscyB0aGUgc2VydmVyLiBMZWF2ZXMgdGhlCi1zZXJ2ZXIgcnVubmluZy4K K3N0YXJ0cyBpdCwgYW5kIGNoZWNrcG9pbnRzLiBUaGlzIGlzIGRvbmUgYmVmb3JlIGFueSB3 b3JrbG9hZCBydW5zLCBzbwordGhlIHdvcmtsb2FkJ3MgV0FMIGlzIHN0aWxsIHVuZmx1c2hl ZCB3aGVuIEM8Y3Jhc2g+IGxhdGVyIGtpbGxzIHRoZQorc2VydmVyLiBMZWF2ZXMgdGhlIHNl cnZlciBydW5uaW5nLgogCiBPcHRpb25zOgogCkBAIC00MjIsMTAgKzE5NCwxMCBAQCBDPG1h aW50ZW5hbmNlX2lvX2NvbmN1cnJlbmN5PiwgQzxmdWxsX3BhZ2Vfd3JpdGVzPi4KICAgUEdE QVRBPS9wYXRoL3RvL3BnZGF0YSByZWNvdmVyeV9iZW5jaC5wbCBwcmVwYXJlIFwKICAgICAg IC0td29ya2xvYWQ9cGdiZW5jaCAtLXNjYWxlPTIwCiAKLVJ1bnMgdGhlIGJ1bGsgd29ya2xv YWQgYWdhaW5zdCB0aGUgYWxyZWFkeS1ydW5uaW5nIHNlcnZlciBDPHNldHVwPiBsZWZ0Ci11 cC4gRGVsaWJlcmF0ZWx5IGRvZXMgbm90IGNoZWNrcG9pbnQgYWZ0ZXJ3YXJkIC0gdGhlIHdv cmtsb2FkJ3MgV0FMIG11c3QKLXN0aWxsIGJlIHVuZmx1c2hlZCB3aGVuIEM8Y3Jhc2g+IGtp bGxzIHRoZSBzZXJ2ZXIsIG9yIHRoZXJlJ3Mgbm90aGluZwotZm9yIHJlY292ZXJ5IHRvIHJl cGxheS4KK1J1bnMgdGhlIGJ1bGsgd29ya2xvYWQgYWdhaW5zdCB0aGUgYWxyZWFkeS1ydW5u aW5nIHNlcnZlciBDPHNldHVwPgorbGVmdCB1cC4gRGVsaWJlcmF0ZWx5IGRvZXMgbm90IGNo ZWNrcG9pbnQgYWZ0ZXJ3YXJkLiBUaGUgd29ya2xvYWQncworV0FMIG11c3Qgc3RpbGwgYmUg dW5mbHVzaGVkIHdoZW4gQzxjcmFzaD4ga2lsbHMgdGhlIHNlcnZlciwgb3IgdGhlcmUncwor bm90aGluZyBmb3IgcmVjb3ZlcnkgdG8gcmVwbGF5LgogCiBPcHRpb25zOgogCkBAIC00MzMs OSArMjA1LDkgQEAgT3B0aW9uczoKIAogPWl0ZW0gQzwtLXdvcmtsb2FkPXBnYmVuY2g+IChk ZWZhdWx0KQogCi1DPHBnYmVuY2ggLWkgLXMgU0NBTEU+LCB3aGljaCBidWxrLWxvYWRzIHZp YSBDPENPUFk+IC0gcmVwcmVzZW50YXRpdmUKLW9mIHRoZSBkb21pbmFudCByZWFsLXdvcmxk IFdBTCBwYXR0ZXJuIChidWxrIGxvYWQpIGJvdGggcmVhZC1jb2FsZXNjaW5nCi1maXhlcyB0 YXJnZXQuCitDPHBnYmVuY2ggLWkgLXMgU0NBTEU+LCB3aGljaCBidWxrLWxvYWRzIHZpYSBD PENPUFk+LiBUaGlzIGlzCityZXByZXNlbnRhdGl2ZSBvZiB0aGUgZG9taW5hbnQgcmVhbC13 b3JsZCBXQUwgcGF0dGVybiAoYnVsayBsb2FkKSBib3RoCityZWFkLWNvYWxlc2NpbmcgZml4 ZXMgdGFyZ2V0LgogCiA9aXRlbSBDPC0td29ya2xvYWQ9Y3JlYXRlX2luZGV4PgogCkBAIC00 NTIsMTMgKzIyNCwxMyBAQCBQYXNzZWQgdG8gQzxwZ2JlbmNoIC1pIC1zPi4KIAogICBQR0RB VEE9L3BhdGgvdG8vcGdkYXRhIHJlY292ZXJ5X2JlbmNoLnBsIGNyYXNoCiAKLVNlbmRzIEM8 U0lHS0lMTD4gdG8gdGhlIHBvc3RtYXN0ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBleGl0LiBC PERvZXMgbm90Ci1yZXN0YXJ0IHRoZSBzZXJ2ZXIuPiBUaGlzIGlzIGludGVudGlvbmFsOiB0 aGUgcmVzdGFydCBuZWVkcyB0byBoYXBwZW4KLXVuZGVyIGEgcnVubmluZyB0cmFjZSBzbyBu byByZWFkcyBhdCB0aGUgdmVyeSBzdGFydCBvZiByZWNvdmVyeSBhcmUKLW1pc3NlZCAtIHNl ZSBGPFJFQURNRS5tZD4gZm9yIGhvdyB0byB0cmlnZ2VyIHRoZSByZXN0YXJ0IHVuZGVyIGEK LWJwZnRyYWNlIHRyYWNlLiBSZWNvdmVyeSB0aW1pbmcgKHBhcnNlZCBmcm9tIEM8PAotJFBH REFUQS9sb2cvcmVjb3ZlcnlfYmVuY2gubG9nID4+KSBhbmQgQzxwZ19zdGF0X2lvPiBkZWx0 YXMgYXJlIHRoZQotY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgb25jZSB0aGUgc2VydmVyIGlz IGJhY2sgdXAgLSBzZWUgRjxSRUFETUUubWQ+LgorU2VuZHMgQzxTSUdLSUxMPiB0byB0aGUg cG9zdG1hc3RlciBhbmQgd2FpdHMgZm9yIGl0IHRvIGV4aXQuIEI8RG9lcworbm90IHJlc3Rh cnQgdGhlIHNlcnZlci4+IFRoaXMgaXMgaW50ZW50aW9uYWw6IHRoZSByZXN0YXJ0IG5lZWRz IHRvCitoYXBwZW4gdW5kZXIgYSBydW5uaW5nIHRyYWNlIHNvIG5vIHJlYWRzIGF0IHRoZSB2 ZXJ5IHN0YXJ0IG9mIHJlY292ZXJ5CithcmUgbWlzc2VkLiBTZWUgRjxSRUFETUUubWQ+IGZv ciBob3cgdG8gdHJpZ2dlciB0aGUgcmVzdGFydCB1bmRlciBhCiticGZ0cmFjZSB0cmFjZS4g UmVjb3ZlcnkgdGltaW5nIChwYXJzZWQgZnJvbQorQzwkUEdEQVRBL2xvZy9yZWNvdmVyeV9i ZW5jaC5sb2c+KSBhbmQgQzxwZ19zdGF0X2lvPiBkZWx0YXMgYXJlIHRoZQorY2FsbGVyJ3Mg cmVzcG9uc2liaWxpdHkgb25jZSB0aGUgc2VydmVyIGlzIGJhY2sgdXAuCiAKID1oZWFkMSBT RUUgQUxTTwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZCBi L3NyYy90ZXN0L3JlY292ZXJ5L21lc29uLmJ1aWxkCmluZGV4IGFkMGQ4NWY0MTg5Li41MWM4 MDIxZDM2YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQKKysr IGIvc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQKQEAgLTYzLDYgKzYzLDcgQEAgdGVz dHMgKz0gewogICAgICAgJ3QvMDUyX2NoZWNrcG9pbnRfc2VnbWVudF9taXNzaW5nLnBsJywK ICAgICAgICd0LzA1M19zdGFuZGJ5X2xvZ2luX2V2ZW50X3RyaWdnZXIucGwnLAogICAgICAg J3QvMDU0X3VubG9nZ2VkX3NlcXVlbmNlX3Byb21vdGlvbi5wbCcsCisgICAgICAndC8wNTVf d2FsX3N0cmVhbV9yZWFkYWhlYWRfY2FjaGUucGwnLAogICAgIF0sCiAgIH0sCiB9CmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS90LzA1NV93YWxfc3RyZWFtX3JlYWRhaGVhZF9j YWNoZS5wbCBiL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDU1X3dhbF9zdHJlYW1fcmVhZGFoZWFk X2NhY2hlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4zODU4 NjE0YTlhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDU1X3dh bF9zdHJlYW1fcmVhZGFoZWFkX2NhY2hlLnBsCkBAIC0wLDAgKzEsMTUzIEBACisKKyMgQ29w eXJpZ2h0IChjKSAyMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAor CisjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBzdGFsZW5lc3MgYnVnIGluIFhMb2dQYWdlUmVh ZCgpJ3MgV0FMIHJlYWQtYWhlYWQgY2FjaGUsCisjIGZvciB0aGUgWExPR19GUk9NX1NUUkVB TSAoc3RyZWFtaW5nIHN0YW5kYnkpIHNvdXJjZS4KKyMKKyMgWExvZ1BhZ2VSZWFkKCkgY29t YmluZXMgc2V2ZXJhbCBYTE9HX0JMQ0tTWiBwYWdlIHJlYWRzIGludG8gb25lIGxhcmdlciBw cmVhZCgpCisjIHRvIGN1dCBkb3duIG9uIHN5c2NhbGxzL0lPUFMgZHVyaW5nIHJlY292ZXJ5 LCBjYWNoaW5nIHRoZSByZXN1bHQgaW4gYSBzdGF0aWMKKyMgYnVmZmVyIChyZWFkQWhlYWRC dWYgZXQgYWwuKS4gRm9yIGEgc3RyZWFtaW5nIHN0YW5kYnksIHRoZSBXQUwgc2VnbWVudCBm aWxlCisjIGJlaW5nIHJlYWQgaXMgYmVpbmcgYWN0aXZlbHkgd3JpdHRlbiBpbnRvIGJ5IHRo ZSB3YWxyZWNlaXZlci4gSXQgaXMgcHJlLXNpemVkCisjIGFoZWFkIG9mIHRoZSBkYXRhIHRo YXQgaGFzIGFjdHVhbGx5IGFycml2ZWQsIHNvIHByZWFkKCkgY2FuIHJldHVybiBieXRlcyB0 aGF0CisjIHdlcmUgcGh5c2ljYWxseSBwcmVzZW50IG9uIGRpc2sgYnV0IGhhZCBub3QgYWN0 dWFsbHkgYmVlbiBmbHVzaGVkIGJ5IHRoZQorIyB3YWxyZWNlaXZlciB5ZXQsIHdpdGggbm8g c2hvcnQtcmVhZCB0byBzaWduYWwgdGhhdC4KKyMKKyMgSWYgdGhlIGNhY2hlIGlzIGZpbGxl ZCB3aGlsZSBvbmx5IHBhcnQgb2YgdGhlIGN1cnJlbnQgcGFnZSBoYXMgYmVlbiBjb25maXJt ZWQKKyMgZmx1c2hlZCwgYW5kIGEgKmxhdGVyKiBjYWxsIGZvciB0aGF0IHNhbWUgcGFnZSAo bmVlZGluZyBtb3JlIG9mIGl0LCBiZWNhdXNlCisjIG1vcmUgV0FMIGhhcyBzaW5jZSBhcnJp dmVkKSBvbmx5IGNoZWNrcyBwaHlzaWNhbCBieXRlLXJhbmdlIGNvdmVyYWdlLCBpdCBjYW4K KyMgc2VydmUgYmFjayB0aG9zZSBzdGFsZSwgbmV2ZXItYWN0dWFsbHktdmFsaWQgYnl0ZXMg aW5zdGVhZCBvZiBub3RpY2luZyB0aGF0CisjIGZyZXNoIGRhdGEgaGFzIHNpbmNlIGxhbmRl ZCBvbiBkaXNrIGFuZCBuZWVkcyB0byBiZSByZS1yZWFkLgorIworIyBGb3JjaW5nIHRoaXMg ZGV0ZXJtaW5pc3RpY2FsbHkgcmVsaWVzIG9uIGhvdyB3YWxzZW5kZXIuYyBwYWNlcyBzZW5k czogaXQgb25seQorIyByb3VuZHMgYSBzZW5kIGRvd24gdG8gYSBXQUwgcGFnZSBib3VuZGFy eSB3aGVuIHRoZXJlIGlzICptb3JlKiBhbHJlYWR5LWZsdXNoZWQKKyMgV0FMIHdhaXRpbmcg YmV5b25kIHdoYXQgZml0cyBpbiBvbmUgbWVzc2FnZS4gT25jZSBhIHN0YW5kYnkgaXMgY2F1 Z2h0IHVwLCBlYWNoCisjIG5ldyBzZW5kIGluc3RlYWQgZ29lcyBvdXQgaW1tZWRpYXRlbHks IHR5cGljYWxseSBlbmRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIFdBTAorIyBwYWdlLgorIwor IyBTbzogZ2V0IHRoZSBzdGFuZGJ5IGZ1bGx5IGNhdWdodCB1cCwgdGhlbiBjb21taXQgdHdv IHNtYWxsLCBzZXBhcmF0ZSByb3dzIGluCisjIHRoZSBzYW1lIFdBTCBwYWdlIG9uZSBhdCBh IHRpbWUuIFRoZSBzZW5kIG9mIHRoZSBmaXJzdCBjb21taXQgbGVhdmVzIHRoZSBwYWdlCisj IG9ubHkgcGFydGlhbGx5IHZhbGlkLiBUaGUgcmVhZC1haGVhZCBjYWNoZSwgZmlsbGluZyBp biByZXNwb25zZSwgbWF5IHJlYWQKKyMgZnVydGhlciBieXRlcyBpbiB0aGF0IHNhbWUgcGh5 c2ljYWwgcGFnZSB0aGF0IHRoZSAqc2Vjb25kKiByb3cncyBieXRlcyBoYXZlCisjIG5vdCBy ZWFjaGVkIHlldC4KKyMKKyMgVGhpcyBpcyBleGVyY2lzZWQgaGVyZSB3aXRoIGFuIGluamVj dGlvbiBwb2ludCB0aGF0IHBhdXNlcyB0aGUgc3RhcnR1cCBwcm9jZXNzCisjIG9mIHRoZSBz dGFuZGJ5IHJpZ2h0IGFmdGVyIHN1Y2ggYSBmaWxsLCBzbyB0aGUgdGVzdCBjYW4gZGV0ZXJt aW5pc3RpY2FsbHkKKyMgZm9yY2UgdGhlIHNlY29uZCByb3cncyBXQUwgdG8gYWN0dWFsbHkg bGFuZCBvbiBkaXNrIGJlZm9yZSBsZXR0aW5nIHRoZSBzdGFydHVwCisjIHByb2Nlc3MgY29u dGludWUgYW5kIGFzayBmb3IgbW9yZSBvZiB0aGF0IHNhbWUgcGFnZS4KKwordXNlIHN0cmlj dDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0 OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1v cmU7CisKK2lmICgkRU5We2VuYWJsZV9pbmplY3Rpb25fcG9pbnRzfSBuZSAneWVzJykKK3sK KwlwbGFuIHNraXBfYWxsID0+ICdJbmplY3Rpb24gcG9pbnRzIG5vdCBzdXBwb3J0ZWQgYnkg dGhpcyBidWlsZCc7Cit9CisKK215ICRub2RlX3ByaW1hcnkgPSBQb3N0Z3JlU1FMOjpUZXN0 OjpDbHVzdGVyLT5uZXcoJ3ByaW1hcnknKTsKKyRub2RlX3ByaW1hcnktPmluaXQoYWxsb3dz X3N0cmVhbWluZyA9PiAxKTsKKworJG5vZGVfcHJpbWFyeS0+YXBwZW5kX2NvbmYoJ3Bvc3Rn cmVzcWwuY29uZicsIDw8J0VORF9PRl9DT05GSUcnKTsKK2F1dG92YWN1dW0gPSBvZmYKK2No ZWNrcG9pbnRfdGltZW91dCA9IDFoCitmdWxsX3BhZ2Vfd3JpdGVzID0gb2ZmCitFTkRfT0Zf Q09ORklHCisKKyRub2RlX3ByaW1hcnktPnN0YXJ0OworCitpZiAoISRub2RlX3ByaW1hcnkt PmNoZWNrX2V4dGVuc2lvbignaW5qZWN0aW9uX3BvaW50cycpKQoreworCXBsYW4gc2tpcF9h bGwgPT4gJ0V4dGVuc2lvbiBpbmplY3Rpb25fcG9pbnRzIG5vdCBpbnN0YWxsZWQnOworfQor CitteSAkYmFja3VwX25hbWUgPSAnbXlfYmFja3VwJzsKKyRub2RlX3ByaW1hcnktPmJhY2t1 cCgkYmFja3VwX25hbWUpOworCitteSAkbm9kZV9zdGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVz dDo6Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5Jyk7Ciskbm9kZV9zdGFuZGJ5LT5pbml0X2Zyb21f YmFja3VwKCRub2RlX3ByaW1hcnksICRiYWNrdXBfbmFtZSwgaGFzX3N0cmVhbWluZyA9PiAx KTsKKyRub2RlX3N0YW5kYnktPnN0YXJ0OworCisjIE1ha2UgdGhlIGluamVjdGlvbl9wb2lu dHMgbWFjaGluZXJ5IGF2YWlsYWJsZS4KKyRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9z dGdyZXMnLCAnQ1JFQVRFIEVYVEVOU0lPTiBpbmplY3Rpb25fcG9pbnRzJyk7Ciskbm9kZV9w cmltYXJ5LT53YWl0X2Zvcl9yZXBsYXlfY2F0Y2h1cCgkbm9kZV9zdGFuZGJ5KTsKKworIyBU YWJsZSBmb3IgdGhlIHJhY2UsIGFuZCBhIGZyZXNoIFdBTCBzZWdtZW50IHRvIHdvcmsgaW4g c28gdGhlIHR3bworIyB1cGNvbWluZyBzbWFsbCByZWNvcmRzIHN0YXJ0IHJpZ2h0IGF0IGEg cGFnZSBib3VuZGFyeS4KKyRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCA8 PCdFTkRfT0ZfU1FMJyk7CitDUkVBVEUgVEFCTEUgc3RyZWFtX3JhY2VfdGFiIChpZCBpbnQs IHBheWxvYWQgdGV4dCk7CitTRUxFQ1QgcGdfc3dpdGNoX3dhbCgpOworRU5EX09GX1NRTAor JG5vZGVfcHJpbWFyeS0+d2FpdF9mb3JfcmVwbGF5X2NhdGNodXAoJG5vZGVfc3RhbmRieSk7 CisKKyMgQXJtIHRoZSBpbmplY3Rpb24gcG9pbnQgb24gdGhlIHN0YW5kYnkuIEZyb20gaGVy ZSBvbiwgZXZlcnkgdGltZSB0aGUKKyMgc3RhcnR1cCBwcm9jZXNzIHJlZmlsbHMgdGhlIHN0 cmVhbWluZyByZWFkLWFoZWFkIGNhY2hlLCBpdCB3aWxsIHBhdXNlCisjIHVudGlsIHdva2Vu IHVwLiBUaGUgc3RhbmRieSBpcyBmdWxseSBjYXVnaHQgdXAgYXQgdGhpcyBwb2ludCwgc28g dGhlCisjIHZlcnkgbmV4dCBoaXQgY2FuIG9ubHkgYmUgZm9yIHRoZSByb3cgd2UncmUgYWJv dXQgdG8gaW5zZXJ0LgorJG5vZGVfc3RhbmRieS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIDw8 J0VORF9PRl9RVUVSWScpOworc2VsZWN0IGluamVjdGlvbl9wb2ludHNfYXR0YWNoKCd4bG9n cmVjb3Zlcnktd2FsLXN0cmVhbS1jYWNoZS1maWxsZWQnLCAnd2FpdCcpOworRU5EX09GX1FV RVJZCisKKyMgRmlyc3Qgcm93OiBhIHNtYWxsLCBvcmRpbmFyeSBpbnNlcnQuIFdpdGggdGhl IHN0YW5kYnkgY2F1Z2h0IHVwLCB0aGlzCisjIGNvbW1pdCdzIFdBTCBnZXRzIHNlbnQgdG8g aXQgYXMgaXRzIG93biwgdW5yb3VuZGVkLCBpbW1lZGlhdGVseS1mbHVzaGVkCisjIG1lc3Nh Z2UuCiskbm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgPDwnRU5EX09GX1FV RVJZJyk7CitpbnNlcnQgaW50byBzdHJlYW1fcmFjZV90YWIgdmFsdWVzICgxLCAnZmlyc3Qt cm93Jyk7CitFTkRfT0ZfUVVFUlkKKworIyBDb25maXJtIHRoZSBzdGFydHVwIHByb2Nlc3Mg aXMgbm93IHBhdXNlZCByaWdodCBhZnRlciBjYWNoaW5nIHRoaXMKKyMgcmVjb3JkJ3MgcGFn ZSwgd2l0aCB0aGUgY2FjaGUgdmFsaWRpdHkgd2luZG93IHJlZmxlY3Rpbmcgb25seSB3aGF0 IGhhZAorIyBhY3R1YWxseSBzdHJlYW1lZCBpbiBieSB0aGF0IHBvaW50IChpLmUuIHVwIHRv IHRoZSBlbmQgb2Ygcm93IDEsIG5vdCB0aGUKKyMgcmVzdCBvZiB0aGUgcGFnZSkuCiskbm9k ZV9zdGFuZGJ5LT53YWl0X2Zvcl9ldmVudCgnc3RhcnR1cCcsCisJJ3hsb2dyZWNvdmVyeS13 YWwtc3RyZWFtLWNhY2hlLWZpbGxlZCcpOworCisjIFNlY29uZCByb3csIHNhbWUgcGFnZS4g V2hpbGUgdGhlIHN0YXJ0dXAgcHJvY2VzcyByZW1haW5zIHBhdXNlZCwgdGhpcworIyBleHRl bmRzIHJlYWwsIHZhbGlkIFdBTCBjb250ZW50IGZ1cnRoZXIgaW50byB0aGUgc2FtZSBwaHlz aWNhbCBwYWdlIHRoYXQKKyMgd2FzIGFscmVhZHkgY2FjaGVkIGFib3ZlLgorJG5vZGVfcHJp bWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJcXtpbnNlcnQgaW50byBzdHJlYW1fcmFj ZV90YWIgdmFsdWVzICgyLCAnc2Vjb25kLXJvdycpfSk7CitteSAkZW5kX2xzbiA9CisgICRu b2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAnU0VMRUNUIHBnX2N1cnJlbnRf d2FsX2luc2VydF9sc24oKScpOworCisjIFdhaXQgdW50aWwgdGhlICp3YWxyZWNlaXZlciog aGFzIGFjdHVhbGx5IHJlY2VpdmVkIGFuZCBmbHVzaGVkIHRoZSBXQUwgb2Ygcm93CisjIDIg dG8gZGlzayBvbiB0aGUgc3RhbmRieS4gT24gYSBidWdneSBidWlsZCwgdGhlIGNhY2hlIG9m IHRoZSBzdGFydHVwIHByb2Nlc3MKKyMgZG9lcyBub3Qga25vdyB0aGlzIGhhcHBlbmVkLCBh bmQgd2lsbCBnbyBvbiB0byBzZXJ2ZSBiYWNrIHdoYXRldmVyIHdhcyBvbiBkaXNrCisjIGF0 IHRoZSBtb21lbnQgaXQgd2FzIG9yaWdpbmFsbHkgY2FjaGVkLgorJG5vZGVfcHJpbWFyeS0+ d2FpdF9mb3JfY2F0Y2h1cCgkbm9kZV9zdGFuZGJ5LCAnZmx1c2gnLCAkZW5kX2xzbik7CisK KyMgTGV0IHRoZSBzdGFydHVwIHByb2Nlc3MgY29udGludWUuIERldGFjaCBmaXJzdCBzbyB0 aGF0IHRoZSAqbmV4dCogZmlsbCBkb2VzCisjIG5vdCBhbHNvIHBhdXNlIGZvcmV2ZXIgd2Fp dGluZyBmb3IgYW5vdGhlciB3YWtldXAgd2UncmUgbm90IGV4cGVjdGluZyB0byBoYXZlCisj IHRvIGdpdmUuCiskbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgPDwnRU5E X09GX1FVRVJZJyk7CitzZWxlY3QgaW5qZWN0aW9uX3BvaW50c19kZXRhY2goJ3hsb2dyZWNv dmVyeS13YWwtc3RyZWFtLWNhY2hlLWZpbGxlZCcpOworc2VsZWN0IGluamVjdGlvbl9wb2lu dHNfd2FrZXVwKCd4bG9ncmVjb3Zlcnktd2FsLXN0cmVhbS1jYWNoZS1maWxsZWQnKTsKK0VO RF9PRl9RVUVSWQorCisjIElmIHRoZSBjYWNoZSBpbmNvcnJlY3RseSBzZXJ2ZWQgc3RhbGUg Ynl0ZXMgZm9yIHJvdyAyLCByZXBsYXkgaGl0cyBhIGNoZWNrc3VtCisjIG9yIGxlbmd0aCBm YWlsdXJlIGFuZCBuZXZlciByZWFjaGVzIHRoaXMgTFNOLiBPbiBhIGJ1Z2d5IGJ1aWxkIHRo aXMgd2FpdCBkb2VzCisjIG5vdCBzdWNjZWVkLgorJG5vZGVfcHJpbWFyeS0+d2FpdF9mb3Jf cmVwbGF5X2NhdGNodXAoJG5vZGVfc3RhbmRieSk7CisKKyMgQm90aCByb3dzIG11c3QgaGF2 ZSByZXBsYXllZCB3aXRoIHRoZWlyIHJlYWwgY29udGVudCwgbm90IHdoYXRldmVyCisjIGxl ZnRvdmVyL3VuaW5pdGlhbGl6ZWQgYnl0ZXMgYSBzdGFsZSBjYWNoZSBoaXQgbWlnaHQgaGF2 ZSBzZXJ2ZWQgZm9yCisjIHJvdyAyLgorbXkgJHJvd3MgPSAkbm9kZV9zdGFuZGJ5LT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywKKwlxe3NlbGVjdCBpZCwgcGF5bG9hZCBmcm9tIHN0cmVhbV9y YWNlX3RhYiBvcmRlciBieSBpZDt9KTsKK2lzKCRyb3dzLCAiMXxmaXJzdC1yb3dcbjJ8c2Vj b25kLXJvdyIsCisJJ3Jvd3MgaW5zZXJ0ZWQgdW5kZXIgV0FMIHN0cmVhbSByZWFkLWFoZWFk IGNhY2hlIHByZXNzdXJlIHJlcGxheSB3aXRoIGNvcnJlY3QgY29udGVudCcKKyk7CisKKyMg QSBzdGFsZS1jYWNoZSBoaXQgY29ycnVwdGluZyBhIHJlY29yZCB3b3VsZCBzaG93IHVwIGFz IHRoZSBzdGFydHVwCisjIHByb2Nlc3MgcmVwb3J0aW5nIGEgY2hlY2tzdW0gb3IgbGVuZ3Ro IGZhaWx1cmUgb24gdGhlIHN0YW5kYnkgYmVmb3JlCisjIGV2ZW50dWFsbHkgcmVjb3Zlcmlu ZyAob3Igbm90KSBmcm9tIGFub3RoZXIgV0FMIHNvdXJjZS4KK29rKCAhJG5vZGVfc3RhbmRi eS0+bG9nX2NvbnRhaW5zKAorCQlxci9pbmNvcnJlY3QgcmVzb3VyY2UgbWFuYWdlciBkYXRh IGNoZWNrc3VtfGludmFsaWQgcmVjb3JkIGxlbmd0aC8pLAorCSdubyBXQUwgY29ycnVwdGlv biByZXBvcnRlZCBieSB0aGUgc3RhbmRieSB3aGlsZSByZXBsYXlpbmcgdW5kZXIgcmVhZC1h aGVhZCBjYWNoZSBwcmVzc3VyZScKKyk7CisKKyRub2RlX3N0YW5kYnktPnN0b3A7Ciskbm9k ZV9wcmltYXJ5LT5zdG9wOworCitkb25lX3Rlc3RpbmcoKTsKLS0gCjIuNDMuMAoK --------------hJmwxdXnn3IZHmjJcKWC310l--