From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: References: <20180328182948.27494-1-tvrtko.ursulin@linux.intel.com> <20180329103334.766-1-tvrtko.ursulin@linux.intel.com> <63199548-08b6-446f-4185-082a87287ed3@intel.com> From: Tvrtko Ursulin Message-ID: <4d20363f-508d-2fda-e397-1eb074e5f75c@linux.intel.com> Date: Tue, 3 Apr 2018 10:36:50 +0100 MIME-Version: 1.0 In-Reply-To: <63199548-08b6-446f-4185-082a87287ed3@intel.com> Content-Language: en-GB Subject: Re: [Intel-gfx] [igt-dev] [PATCH i-g-t v2] intel-gpu-top: Rewrite the tool to be safe to use List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Eero Tamminen , Tvrtko Ursulin , igt-dev@lists.freedesktop.org Cc: Intel-gfx@lists.freedesktop.org List-ID: Ck9uIDI5LzAzLzIwMTggMTU6MzAsIEVlcm8gVGFtbWluZW4gd3JvdGU6Cj4gSGksCj4gCj4gSSB0 ZXN0ZWQgdGhpcyBvbiBIU1cgR1QyLCBCWVQsIEJEVyBHVDMsIFNLTCBHVDIgYW5kIEtCTCBHVDNl LAo+IHdpdGggVWJ1bnR1IDE2LjA0IGFuZCAxNy4xMCwgdXNpbmcgVWJ1bnR1IGRlZmF1bHQga2Vy bmVscyAoNC40IHRvIDQuMTMpCj4gYW5kIGxhdGVzdCBkcm0tdGlwIGJ1aWxkICg0LjE2LjAtcmM3 KS4KPiAKPiAKPiBHZW5lcmFsIGNvbW1lbnRzCj4gLS0tLS0tLS0tLS0tLS0tLQo+IAo+IFRoaXMg d2lsbCBiZSB1c2VkIGJ5IG91ciBjdXN0b21lcnMgYW5kIHBlb3BsZSB3aG8gYXJlbid0IG5lY2Vz c2FyaWx5Cj4gZmFtaWxpYXIgd2l0aCBpOTE1IGludGVybmFsIGRldGFpbHMuwqAgVGhlcmVmb3Jl IGl0IHNob3VsZCB1c2UKPiBjb21tb24gdGVybWlub2xvZ3kgaW4gdGhlIGZpZWxkIGFuZCBpbiBz aW1pbGFyIHRvb2xzLCBpbnN0ZWFkIG9mCj4gSTNBcyAoSW50ZWwgMy1sZXR0ZXIgQWNyb255bXMp Lgo+IAo+IEZvciBleGFtcGxlOgo+ICDCoC0gcmNzIC0+IDNEIHJlbmRlcgo+ICDCoC0gYmNzIC0+ IGJsaXR0ZXIKPiAgwqAtIHZlY3MgLT4gdmlkZW8KPiAgwqAtIHZjcyAtPiB2aWRlbyBkZWNvZGUK PiBldGMuCgpEb25lLiBBbmQgSSBhbSBvcGVuIHRvIGJpa2Utc2hlZGRpbmcgb2YgdGhlIG5hbWVz IGFuZCBkaXNwbGF5IGZvcm1hdCBmb3IgCmluc3RhbmNlIHJlcG9ydGluZy4KCj4gCj4gT2xkIHRv b2wgc2hvd2VkIGFsc28gR1BVIHN5c3RlbSBtZW1vcnkgaW50ZXJmYWNlIChHQU0pIGJ1c3luZXNz Lgo+IFRoYXQgd2FzIHZhbHVhYmxlIGluZm8sIGFuZCByZWFzb25hYmx5IGFjY3VyYXRlIGZvciBz dGFibGUgbG9hZHMuCj4gCj4gQ291bGQgdGhpcyB0b29sIHNob3cgYWxzbyBlaXRoZXIgdGhhdCBp bmZvcm1hdGlvbiAocHJlZmVycmVkKSwgb3IKPiBiYW5kd2lkdGggdXRpbGl6ZWQgYnkgR1BVL0NQ VS9kaXNwbGF5Pwo+IAo+IChMYXRlc3Qga2VybmVscyBvZmZlciBHUFUgbWVtb3J5IGJhbmR3aWR0 aCB1c2FnZSB0aHJvdWdoIHBlcmYKPiAidW5jb3JlX2ltYyIgImRhdGFfcmVhZHMiICYgImRhdGVf d3JpdGVzIiBjb3VudGVycy4pCgpFeGNlbGxlbnQgc3VnZ2VzdGlvbiBhbmQgSSd2ZSBhZGRlZCBJ TUMgZGF0YV9yZWFkcyBhbmQgZGF0YV93cml0ZXMgdG8gCnRoZSB0b29sLgoKPiAKPiAKPiBJcyAi d2FpdCIgdmFsdWUgc3VwcG9zZWQgdG8gYmUgSU8td2FpdCBmb3IgZ2l2ZW4gZW5naW5lIGludGVy ZmFjZT8KPgo+IEkgbmV2ZXIgc2F3IHRoYXQgY2hhbmdlIGZyb20gMCUsIGFsdGhvdWdoIElPLXdh aXQgaW4gdG9wIGp1bXBlZAo+IGZyb20gMCB0byAyMC0zMCUgd2l0aCBteSB0ZXN0IEdQVSBsb2Fk LgoKTm8sIHRoYXQgaXMgdGltZSBzcGVudCBpbiBNSV9XQUlUX0ZPUl9FVkVOVC4gSSB0aGluayBu b3QgdmVyeSB1c2VkIGluIApjdXJyZW50IGNvZGViYXNlLgoKPiAKPiBIVyBzcGVjaWZpYyB0ZXN0 IHJlc3VsdHMKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAKPiBCWVQ6Cj4gKiBSZXBvcnRz ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBQTVUhIiBhbHRob3VnaCBvbGQgaW50ZWxfZ3B1X3RvcAo+ ICDCoCB3b3JrcyBmaW5lLgo+IAo+IEhTVyBHVDIswqAgQkRXIEdUMywgU0tMIEdUMiBhbmQgS0JM IEdUM2Ugc2VlbXMgdG8gd29yayBmaW5lIGV4Y2VwdAo+IGZvciB0aGUgIndhaXQiIHZhbHVlLgo+ IAo+IEkgbmV2ZXIgc2F3IGJsaXR0ZXIgZW5naW5lIHRvIGRvIGFueXRoaW5nLCBidXQgdGhhdCdz IGJlY2F1c2UKPiBtb2Rlc2V0dGluZyB1c2VzIGp1c3QgM0QgcGlwZWxpbmUsIGFuZCBiZWNhdXNl IEkgY291bGRuJ3QgZ2V0Cj4gSW50ZWwgRERYIHRvIHdvcmsgd2l0aCByZXN0IG9mIGxhdGVzdCBn aXQgdmVyc2lvbiBvZiBYIC8gM0Qgc3RhY2suCgpUaGFuayB5b3UgZm9yIHRlc3RpbmcgdGhpcyBz byB0aG9yb3VnaGx5IC0gdGhpcyB3YXMgcmVhbGx5IGludmFsdWFibGUgCnNpbmNlIEkgZG9uJ3Qg aGF2ZSBhY2Nlc3MgdG9vIHN1Y2ggbnVtYmVyIG9mIHBsYXRmb3Jtcy4gSSd2ZSB0cmllZCB0byAK Zml4IGFsbCB0aGlzIGluIHRoZSBsYXRlc3QgdmVyc2lvbi4KCj4gCj4gCj4gCj4gS2VybmVsIHZl cnNpb24gc3VwcG9ydAo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAKPiBNeSBIVyBzcGVjaWZp YyB0ZXN0aW5nIGFib3ZlIHdhcyB3aXRoIGRybS10aXAga2VybmVsLCBidXQgSSBkaWQgb25lIHRl c3QKPiBhbHNvIHdpdGggVWJ1bnR1IDE2LjA0IHY0LjQga2VybmVsICh3aGljaCBpbmNsdWRlcyB2 NC42IG9yIHY0LjggaTkxNSAKPiBiYWNrcG9ydCkgb24gS0JMLsKgIEZvciB0aGF0LCB0aGUgdG9v bCByZXBvcnRlZDoKPiAiRmFpbGVkIHRvIGRldGVjdCBlbmdpbmVzISIKPiAKPiBBbHRob3VnaCB0 aGUgcHJldmlvdXMgaW50ZWxfZ3B1X3RvcCB3b3JrcyBmaW5lIHdpdGggdGhhdCBrZXJuZWwgdmVy c2lvbi4KPiAKPiBTYW1lIGhhcHBlbnMgYWxzbyB3aXRoIFVidW50dSAxNy4wNCB2NC4xMyBrZXJu ZWwuCj4gCj4gCj4gLT4gSWYgbmV3IHZlcnNpb24gbmVlZHMgYSBjZXJ0YWluIGtlcm5lbCB2ZXJz aW9uLCBpdCBzaG91bGQgdGVsbAo+ICDCoMKgIHdoaWNoIHZlcnNpb24gaXMgcmVxdWlyZWQuCgpZ ZXAsIGF0IGxlYXN0IDQuMTYgaXMgbmVlZGVkIHNvIEkgaGF2ZSBhZGRlZCB0aGlzIGluZm8gdG8g dGhlIGVycm9yIG1lc3NhZ2UuCgpUaGFua3MgYWdhaW4gZm9yIHRlc3RpbmcgaXQgYW5kIHdoZW4g eW91IGZpbmQgdGhlIHRpbWUgaWYgeW91IGNvdWxkIGRvIAppdCBvbmNlIG1vcmUgd2l0aCB0aGUg bGF0ZXN0IHZlcnNpb24gKG9uIHRoZSBwcm9ibGVtYXRpYyBwbGF0Zm9ybXMpIHRoYXQgCndvdWxk IGJlIG11Y2ggYXBwcmVjaWF0ZWQuCgpSZWdhcmRzLAoKVHZydGtvCgo+IAo+IAo+ICDCoMKgwqDC oC0gRWVybwo+IAo+IE9uIDI5LjAzLjIwMTggMTM6MzMsIFR2cnRrbyBVcnN1bGluIHdyb3RlOgo+ PiBGcm9tOiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgo+Pgo+PiBp bnRlbC1ncHUtdG9wIGlzIGEgZGFuZ2Vyb3VzIHRvb2wgd2hpY2ggY2FuIGhhbmcgbWFjaGluZXMg ZHVlIHVuc2FmZSBtbWlvCj4+IHJlZ2lzdGVyIGFjY2Vzcy4gVGhpcyBwYXRjaCByZXdyaXRlcyBp dCB0byB1c2Ugb25seSBQTVUuCj4+Cj4+IE9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1 c3luZXNzIGFuZCBHUFUgZ2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgo+PiBhbmQgZnJlcXVlbmNp ZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbmV3IHZlcnNpb24uCj4+Cj4+IEZvciBhY2Nlc3MgdG8g bW9yZSBHUFUgZnVuY3Rpb25hbCB1bml0IGxldmVsIGRhdGEsIGFuIE9BIG1ldHJpYyBiYXNlZCAK Pj4gdG9vbAo+PiBsaWtlIGdwdS10b3Agc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KPj4KPj4gdjI6 Cj4+IMKgICogU29ydCBlbmdpbmVzIGJ5IGNsYXNzIGFuZCBpbnN0YW5jZS4KPj4gwqAgKiBEbyBu b3Qgd2FpdCBmb3Igb25lIHNhbXBsaW5nIHBlcmlvZCB0byBkaXNwbGF5IHNvbWV0aGluZyBvbiBz Y3JlZW4uCj4+IMKgICogTW92ZSBjb2RlIG91dCBvZiB0aGUgYXNzZXJ0cy4gKFJpbmF0IElicmFn aW1vdikKPj4gwqAgKiBDb250aW51b3VzbHkgYWRhcHQgdG8gdGVybWluYWwgc2l6ZS4gKFJpbmF0 IEliZ3JhZ2ltb3YpCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28u dXJzdWxpbkBpbnRlbC5jb20+Cj4+IENjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNv bi5jby51az4KPj4gQ2M6IExpb25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGlu dGVsLmNvbT4KPj4gQ2M6IFBldHJpIExhdHZhbGEgPHBldHJpLmxhdHZhbGFAaW50ZWwuY29tPgo+ PiBDYzogRWVybyBUYW1taW5lbiA8ZWVyby50LnRhbW1pbmVuQGludGVsLmNvbT4KPj4gQ2M6IFJp bmF0IElicmFnaW1vdiA8aWJyYWdpbW92cmluYXRAbWFpbC5ydT4KPj4gUmV2aWV3ZWQtYnk6IExp b25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGludGVsLmNvbT4gIyB2MQo+PiBS ZXZpZXdlZC1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+ICMgdjAu NQo+PiAtLS0KPj4gwqAgdG9vbHMvTWFrZWZpbGUuYW3CoMKgwqDCoCB8wqDCoMKgIDIgKwo+PiDC oCB0b29scy9pbnRlbF9ncHVfdG9wLmMgfCAxMDA5IAo+PiArKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+IMKgIHRvb2xzL21lc29uLmJ1aWxkwqDCoMKg wqAgfMKgwqDCoCA2ICstCj4+IMKgIDMgZmlsZXMgY2hhbmdlZCwgNDQxIGluc2VydGlvbnMoKyks IDU3NiBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmFtIGIv dG9vbHMvTWFrZWZpbGUuYW0KPj4gaW5kZXggMDliNmRiY2MzZWNlLi5hMGIwMTZkZGQ3ZmYgMTAw NjQ0Cj4+IC0tLSBhL3Rvb2xzL01ha2VmaWxlLmFtCj4+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLmFt Cj4+IEBAIC0yOCw2ICsyOCw4IEBAIGludGVsX2F1YmR1bXBfbGFfTERGTEFHUyA9IC1tb2R1bGUg LWF2b2lkLXZlcnNpb24gCj4+IC1uby11bmRlZmluZWQKPj4gwqAgaW50ZWxfYXViZHVtcF9sYV9T T1VSQ0VTID0gYXViZHVtcC5jCj4+IMKgIGludGVsX2F1YmR1bXBfbGFfTElCQUREID0gJCh0b3Bf YnVpbGRkaXIpL2xpYi9saWJpbnRlbF90b29scy5sYSAtbGRsCj4+ICtpbnRlbF9ncHVfdG9wX0xE QUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJpZ3RfcGVyZi5sYQo+PiArCj4+IMKgIGJpbl9T Q1JJUFRTID0gaW50ZWxfYXViZHVtcAo+PiDCoCBDTEVBTkZJTEVTID0gJChiaW5fU0NSSVBUUykK Pj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2dwdV90b3AuYyBiL3Rvb2xzL2ludGVsX2dwdV90 b3AuYwo+PiBpbmRleCAwOThlNmNlM2ZmODYuLjk0MDkxZDk3YzRhMyAxMDA2NDQKPj4gLS0tIGEv dG9vbHMvaW50ZWxfZ3B1X3RvcC5jCj4+ICsrKyBiL3Rvb2xzL2ludGVsX2dwdV90b3AuYwo+PiBA QCAtMSw2ICsxLDUgQEAKPj4gwqAgLyoKPj4gLSAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENv cnBvcmF0aW9uCj4+IC0gKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgo+PiAr ICogQ29weXJpZ2h0IMKpIDIwMTggSW50ZWwgQ29ycG9yYXRpb24KPj4gwqDCoCAqCj4+IMKgwqAg KiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBl cnNvbiAKPj4gb2J0YWluaW5nIGEKPj4gwqDCoCAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQg YXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgCj4+ICJTb2Z0d2FyZSIpLAo+PiBA QCAtMTgsNzAxICsxNyw1NjEgQEAKPj4gwqDCoCAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuwqAgSU4gTk8gCj4+IEVWRU5UIFNIQUxMCj4+IMKg wqAgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBD TEFJTSwgREFNQUdFUyAKPj4gT1IgT1RIRVIKPj4gwqDCoCAqIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKPj4gQVJJU0lORwo+ PiAtICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUgo+PiAtICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo+PiAtICoK Pj4gLSAqIEF1dGhvcnM6Cj4+IC0gKsKgwqDCoCBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0 Pgo+PiAtICrCoMKgwqAgRXVnZW5pIERvZG9ub3YgPGV1Z2VuaS5kb2Rvbm92QGludGVsLmNvbT4K Pj4gLSAqCj4+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZU V0FSRSBPUiBUSEUgVVNFIE9SIAo+PiBPVEhFUiBERUFMSU5HUwo+PiArICogSU4gVEhFIFNPRlRX QVJFLgo+PiDCoMKgICovCj4+IC0jaW5jbHVkZSAiY29uZmlnLmgiCj4+IC0KPj4gLSNpbmNsdWRl IDxpbnR0eXBlcy5oPgo+PiAtI2luY2x1ZGUgPHVuaXN0ZC5oPgo+PiAtI2luY2x1ZGUgPHN0ZGxp Yi5oPgo+PiDCoCAjaW5jbHVkZSA8c3RkaW8uaD4KPj4gLSNpbmNsdWRlIDxlcnIuaD4KPj4gLSNp bmNsdWRlIDxzeXMvaW9jdGwuaD4KPj4gLSNpbmNsdWRlIDxzeXMvdGltZS5oPgo+PiAtI2luY2x1 ZGUgPHN5cy93YWl0Lmg+Cj4+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4+ICsjaW5jbHVkZSA8 ZGlyZW50Lmg+Cj4+ICsjaW5jbHVkZSA8c3RkaW50Lmg+Cj4+ICsjaW5jbHVkZSA8YXNzZXJ0Lmg+ Cj4+IMKgICNpbmNsdWRlIDxzdHJpbmcuaD4KPj4gLSNpZmRlZiBIQVZFX1RFUk1JT1NfSAo+PiAt I2luY2x1ZGUgPHRlcm1pb3MuaD4KPj4gLSNlbmRpZgo+PiAtI2luY2x1ZGUgImludGVsX2lvLmgi Cj4+IC0jaW5jbHVkZSAiaW5zdGRvbmUuaCIKPj4gLSNpbmNsdWRlICJpbnRlbF9yZWcuaCIKPj4g LSNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCj4+IC0jaW5jbHVkZSAiZHJtdGVzdC5oIgo+PiAt Cj4+IC0jZGVmaW5lwqAgRk9SQ0VXQUtFwqDCoMKgwqDCoMKgwqAgMHhBMThDCj4+IC0jZGVmaW5l wqAgRk9SQ0VXQUtFX0FDS8KgwqDCoMKgwqDCoMKgIDB4MTMwMDkwCj4+IC0KPj4gLSNkZWZpbmUg U0FNUExFU19QRVJfU0VDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDEwMDAwCj4+IC0jZGVmaW5l IFNBTVBMRVNfVE9fUEVSQ0VOVF9SQVRJT8KgwqDCoCAoU0FNUExFU19QRVJfU0VDIC8gMTAwKQo+ PiAtCj4+IC0jZGVmaW5lIE1BWF9OVU1fVE9QX0JJVFPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDEw MAo+PiAtCj4+IC0jZGVmaW5lIEhBU19TVEFUU19SRUdTKGRldmlkKcKgwqDCoMKgwqDCoMKgIElT Xzk2NShkZXZpZCkKPj4gLQo+PiAtc3RydWN0IHRvcF9iaXQgewo+PiAtwqDCoMKgIHN0cnVjdCBp bnN0ZG9uZV9iaXQgKmJpdDsKPj4gLcKgwqDCoCBpbnQgY291bnQ7Cj4+IC19IHRvcF9iaXRzW01B WF9OVU1fVE9QX0JJVFNdOwo+PiAtc3RydWN0IHRvcF9iaXQgKnRvcF9iaXRzX3NvcnRlZFtNQVhf TlVNX1RPUF9CSVRTXTsKPj4gLQo+PiAtc3RhdGljIHVpbnQzMl90IGluc3Rkb25lLCBpbnN0ZG9u ZTE7Cj4+IC0KPj4gLXN0YXRpYyBjb25zdCBjaGFyICpiYXJzW10gPSB7Cj4+IC3CoMKgwqAgIiAi LAo+PiAtwqDCoMKgICLilo8iLAo+PiAtwqDCoMKgICLilo4iLAo+PiAtwqDCoMKgICLilo0iLAo+ PiAtwqDCoMKgICLilowiLAo+PiAtwqDCoMKgICLilosiLAo+PiAtwqDCoMKgICLilooiLAo+PiAt wqDCoMKgICLilokiLAo+PiAtwqDCoMKgICLilogiCj4+IC19Owo+PiArI2luY2x1ZGUgPGN0eXBl Lmg+Cj4+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4+ICsj aW5jbHVkZSA8c3lzL3N0YXQuaD4KPj4gKyNpbmNsdWRlIDxmY250bC5oPgo+PiArI2luY2x1ZGUg PGludHR5cGVzLmg+Cj4+ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4+ICsjaW5jbHVkZSA8ZXJy bm8uaD4KPj4gKyNpbmNsdWRlIDxtYXRoLmg+Cj4+ICsjaW5jbHVkZSA8bG9jYWxlLmg+Cj4+ICsK Pj4gKyNpbmNsdWRlICJpZ3RfcGVyZi5oIgo+PiAtZW51bSBzdGF0c19jb3VudHMgewo+PiAtwqDC oMKgIElBX1ZFUlRJQ0VTLAo+PiAtwqDCoMKgIElBX1BSSU1JVElWRVMsCj4+IC3CoMKgwqAgVlNf SU5WT0NBVElPTiwKPj4gLcKgwqDCoCBHU19JTlZPQ0FUSU9OLAo+PiAtwqDCoMKgIEdTX1BSSU1J VElWRVMsCj4+IC3CoMKgwqAgQ0xfSU5WT0NBVElPTiwKPj4gLcKgwqDCoCBDTF9QUklNSVRJVkVT LAo+PiAtwqDCoMKgIFBTX0lOVk9DQVRJT04sCj4+IC3CoMKgwqAgUFNfREVQVEgsCj4+IC3CoMKg wqAgU1RBVFNfQ09VTlQKPj4gK3N0cnVjdCBwbXVfcGFpciB7Cj4+ICvCoMKgwqAgdWludDY0X3Qg Y3VyOwo+PiArwqDCoMKgIHVpbnQ2NF90IHByZXY7Cj4+IMKgIH07Cj4+IC1jb25zdCB1aW50MzJf dCBzdGF0c19yZWdzW1NUQVRTX0NPVU5UXSA9IHsKPj4gLcKgwqDCoCBJQV9WRVJUSUNFU19DT1VO VF9RVywKPj4gLcKgwqDCoCBJQV9QUklNSVRJVkVTX0NPVU5UX1FXLAo+PiAtwqDCoMKgIFZTX0lO Vk9DQVRJT05fQ09VTlRfUVcsCj4+IC3CoMKgwqAgR1NfSU5WT0NBVElPTl9DT1VOVF9RVywKPj4g LcKgwqDCoCBHU19QUklNSVRJVkVTX0NPVU5UX1FXLAo+PiAtwqDCoMKgIENMX0lOVk9DQVRJT05f Q09VTlRfUVcsCj4+IC3CoMKgwqAgQ0xfUFJJTUlUSVZFU19DT1VOVF9RVywKPj4gLcKgwqDCoCBQ U19JTlZPQ0FUSU9OX0NPVU5UX1FXLAo+PiAtwqDCoMKgIFBTX0RFUFRIX0NPVU5UX1FXLAo+PiAr c3RydWN0IHBtdV9jb3VudGVyIHsKPj4gK8KgwqDCoCB1aW50NjRfdCBjb25maWc7Cj4+ICvCoMKg wqAgdW5zaWduZWQgaW50IGlkeDsKPj4gK8KgwqDCoCBzdHJ1Y3QgcG11X3BhaXIgdmFsOwo+PiDC oCB9Owo+PiAtY29uc3QgY2hhciAqc3RhdHNfcmVnX25hbWVzW1NUQVRTX0NPVU5UXSA9IHsKPj4g LcKgwqDCoCAidmVydCBmZXRjaCIsCj4+IC3CoMKgwqAgInByaW0gZmV0Y2giLAo+PiAtwqDCoMKg ICJWUyBpbnZvY2F0aW9ucyIsCj4+IC3CoMKgwqAgIkdTIGludm9jYXRpb25zIiwKPj4gLcKgwqDC oCAiR1MgcHJpbXMiLAo+PiAtwqDCoMKgICJDTCBpbnZvY2F0aW9ucyIsCj4+IC3CoMKgwqAgIkNM IHByaW1zIiwKPj4gLcKgwqDCoCAiUFMgaW52b2NhdGlvbnMiLAo+PiAtwqDCoMKgICJQUyBkZXB0 aCBwYXNzIiwKPj4gK3N0cnVjdCBlbmdpbmUgewo+PiArwqDCoMKgIGNvbnN0IGNoYXIgKm5hbWU7 Cj4+ICvCoMKgwqAgc3RydWN0IHBtdV9jb3VudGVyIGJ1c3k7Cj4+ICvCoMKgwqAgc3RydWN0IHBt dV9jb3VudGVyIHdhaXQ7Cj4+ICvCoMKgwqAgc3RydWN0IHBtdV9jb3VudGVyIHNlbWE7Cj4+IMKg IH07Cj4+IC11aW50NjRfdCBzdGF0c1tTVEFUU19DT1VOVF07Cj4+IC11aW50NjRfdCBsYXN0X3N0 YXRzW1NUQVRTX0NPVU5UXTsKPj4gK3N0cnVjdCBlbmdpbmVzIHsKPj4gK8KgwqDCoCB1bnNpZ25l ZCBpbnQgbnVtX2VuZ2luZXM7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsK Pj4gK8KgwqDCoCBESVIgKnJvb3Q7Cj4+ICvCoMKgwqAgaW50IGZkOwo+PiArwqDCoMKgIHN0cnVj dCBwbXVfcGFpciB0czsKPj4gLXN0YXRpYyB1bnNpZ25lZCBsb25nCj4+IC1nZXR0aW1lKHZvaWQp Cj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IHRpbWV2YWwgdDsKPj4gLcKgwqDCoCBnZXR0aW1lb2Zk YXkoJnQsIE5VTEwpOwo+PiAtwqDCoMKgIHJldHVybiAodC50dl91c2VjICsgKHQudHZfc2VjICog MTAwMDAwMCkpOwo+PiAtfQo+PiArwqDCoMKgIGludCByYXBsX2ZkOwo+PiArwqDCoMKgIGRvdWJs ZSByYXBsX3NjYWxlOwo+PiAtc3RhdGljIGludAo+PiAtdG9wX2JpdHNfc29ydChjb25zdCB2b2lk ICphLCBjb25zdCB2b2lkICpiKQo+PiArwqDCoMKgIHN0cnVjdCBwbXVfY291bnRlciBmcmVxX3Jl cTsKPj4gK8KgwqDCoCBzdHJ1Y3QgcG11X2NvdW50ZXIgZnJlcV9hY3Q7Cj4+ICvCoMKgwqAgc3Ry dWN0IHBtdV9jb3VudGVyIGlycTsKPj4gK8KgwqDCoCBzdHJ1Y3QgcG11X2NvdW50ZXIgcmM2Owo+ PiArwqDCoMKgIHN0cnVjdCBwbXVfY291bnRlciByYXBsOwo+PiArCj4+ICvCoMKgwqAgc3RydWN0 IGVuZ2luZSBlbmdpbmU7Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgdWludDY0X3QKPj4gK2dldF9w bXVfY29uZmlnKGludCBkaXJmZCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqY291bnRl cikKPj4gwqAgewo+PiAtwqDCoMKgIHN0cnVjdCB0b3BfYml0ICogY29uc3QgKmJpdF9hID0gYTsK Pj4gLcKgwqDCoCBzdHJ1Y3QgdG9wX2JpdCAqIGNvbnN0ICpiaXRfYiA9IGI7Cj4+IC3CoMKgwqAg aW50IGFfY291bnQgPSAoKmJpdF9hKS0+Y291bnQ7Cj4+IC3CoMKgwqAgaW50IGJfY291bnQgPSAo KmJpdF9iKS0+Y291bnQ7Cj4+ICvCoMKgwqAgY2hhciBidWZbMTI4XSwgKnA7Cj4+ICvCoMKgwqAg aW50IGZkLCByZXQ7Cj4+IC3CoMKgwqAgaWYgKGFfY291bnQgPCBiX2NvdW50KQo+PiAtwqDCoMKg wqDCoMKgwqAgcmV0dXJuIDE7Cj4+IC3CoMKgwqAgZWxzZSBpZiAoYV9jb3VudCA9PSBiX2NvdW50 KQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+IC3CoMKgwqAgZWxzZQo+PiArwqDCoMKg IHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy0lcyIsIG5hbWUsIGNvdW50ZXIp Owo+PiArwqDCoMKgIGlmIChyZXQgPCAwIHx8IHJldCA9PSBzaXplb2YoYnVmKSkKPj4gwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4gLX0KPj4gLXN0YXRpYyB2b2lkCj4+IC11cGRhdGVf aWRsZV9iaXQoc3RydWN0IHRvcF9iaXQgKnRvcF9iaXQpCj4+IC17Cj4+IC3CoMKgwqAgdWludDMy X3QgcmVnX3ZhbDsKPj4gK8KgwqDCoCBmZCA9IG9wZW5hdChkaXJmZCwgYnVmLCBPX1JET05MWSk7 Cj4+ICvCoMKgwqAgaWYgKGZkIDwgMCkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4g LcKgwqDCoCBpZiAodG9wX2JpdC0+Yml0LT5yZWcgPT0gSU5TVERPTkVfMSkKPj4gLcKgwqDCoMKg wqDCoMKgIHJlZ192YWwgPSBpbnN0ZG9uZTE7Cj4+IC3CoMKgwqAgZWxzZQo+PiAtwqDCoMKgwqDC oMKgwqAgcmVnX3ZhbCA9IGluc3Rkb25lOwo+PiArwqDCoMKgIHJldCA9IHJlYWQoZmQsIGJ1Ziwg c2l6ZW9mKGJ1ZikpOwo+PiArwqDCoMKgIGNsb3NlKGZkKTsKPj4gK8KgwqDCoCBpZiAocmV0IDw9 IDApCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4+ICsKPj4gK8KgwqDCoCBwID0gaW5k ZXgoYnVmLCAnMCcpOwo+PiArwqDCoMKgIGlmICghcCkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biAtMTsKPj4gLcKgwqDCoCBpZiAoKHJlZ192YWwgJiB0b3BfYml0LT5iaXQtPmJpdCkgPT0gMCkK Pj4gLcKgwqDCoMKgwqDCoMKgIHRvcF9iaXQtPmNvdW50Kys7Cj4+ICvCoMKgwqAgcmV0dXJuIHN0 cnRvdWwocCwgTlVMTCwgMCk7Cj4+IMKgIH0KPj4gLXN0YXRpYyB2b2lkCj4+IC1wcmludF9jbG9j ayhjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvY2spIHsKPj4gLcKgwqDCoCBpZiAoY2xvY2sgPT0g LTEpCj4+IC3CoMKgwqDCoMKgwqDCoCBwcmludGYoIiVzIGNsb2NrOiB1bmtub3duIiwgbmFtZSk7 Cj4+ICsjZGVmaW5lIGVuZ2luZV9wdHIoZW5naW5lcywgbikgXAo+PiArwqDCoMKgICgoc3RydWN0 IGVuZ2luZSAqKSgodW5zaWduZWQgY2hhciAqKSgmZW5naW5lcy0+ZW5naW5lKSArIChuKSAqIAo+ PiBzaXplb2Yoc3RydWN0IGVuZ2luZSkpKQo+PiArCj4+ICtzdGF0aWMgaW50IGVuZ2luZV9jbXAo Y29uc3Qgdm9pZCAqX19hLCBjb25zdCB2b2lkICpfX2IpCj4+ICt7Cj4+ICvCoMKgwqAgY29uc3Qg c3RydWN0IGVuZ2luZSAqYSA9IChzdHJ1Y3QgZW5naW5lICopX19hOwo+PiArwqDCoMKgIGNvbnN0 IHN0cnVjdCBlbmdpbmUgKmIgPSAoc3RydWN0IGVuZ2luZSAqKV9fYjsKPj4gK8KgwqDCoCBpbnQg Y2xhc3NfYSA9IChhLT5idXN5LmNvbmZpZyAmIChfX0k5MTVfUE1VX09USEVSKDApIC0gMSkpID4+ Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJOTE1X1BNVV9DTEFTU19TSElGVDsKPj4g K8KgwqDCoCBpbnQgY2xhc3NfYiA9IChiLT5idXN5LmNvbmZpZyAmIChfX0k5MTVfUE1VX09USEVS KDApIC0gMSkpID4+Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJOTE1X1BNVV9DTEFT U19TSElGVDsKPj4gK8KgwqDCoCBpbnQgaW5zdGFuY2VfYSA9IChhLT5idXN5LmNvbmZpZyA+PiBJ OTE1X1BNVV9TQU1QTEVfQklUUykgJgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoMSA8 PCBJOTE1X1BNVV9TQU1QTEVfSU5TVEFOQ0VfQklUUykgLSAxKTsKPj4gK8KgwqDCoCBpbnQgaW5z dGFuY2VfYiA9IChiLT5idXN5LmNvbmZpZyA+PiBJOTE1X1BNVV9TQU1QTEVfQklUUykgJgo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgoMSA8PCBJOTE1X1BNVV9TQU1QTEVfSU5TVEFOQ0Vf QklUUykgLSAxKTsKPj4gKwo+PiArwqDCoMKgIGlmIChjbGFzc19hICE9IGNsYXNzX2IpCj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gY2xhc3NfYSAtIGNsYXNzX2I7Cj4+IMKgwqDCoMKgwqAgZWxz ZQo+PiAtwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCIlcyBjbG9jazogJWQgTWh6IiwgbmFtZSwgY2xv Y2spOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGluc3RhbmNlX2EgLSBpbnN0YW5jZV9iOwo+ PiDCoCB9Cj4+IC1zdGF0aWMgaW50Cj4+IC1wcmludF9jbG9ja19pbmZvKHN0cnVjdCBwY2lfZGV2 aWNlICpwY2lfZGV2KQo+PiArc3RhdGljIHN0cnVjdCBlbmdpbmVzICpkaXNjb3Zlcl9lbmdpbmVz KHZvaWQpCj4+IMKgIHsKPj4gLcKgwqDCoCB1aW50MzJfdCBkZXZpZCA9IHBjaV9kZXYtPmRldmlj ZV9pZDsKPj4gLcKgwqDCoCB1aW50MTZfdCBnY2ZnYzsKPj4gK8KgwqDCoCBjb25zdCBjaGFyICpz eXNmc19yb290ID0gIi9zeXMvZGV2aWNlcy9pOTE1L2V2ZW50cyI7Cj4+ICvCoMKgwqAgc3RydWN0 IGVuZ2luZXMgKmVuZ2luZXM7Cj4+ICvCoMKgwqAgc3RydWN0IGRpcmVudCAqZGVudDsKPj4gK8Kg wqDCoCBpbnQgcmV0ID0gMDsKPj4gK8KgwqDCoCBESVIgKmQ7Cj4+IC3CoMKgwqAgaWYgKElTX0dN NDUoZGV2aWQpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpbnQgY29yZV9jbG9jayA9IC0xOwo+PiAr wqDCoMKgIGVuZ2luZXMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbmdpbmVzKSk7Cj4+ICvCoMKg wqAgaWYgKCFlbmdpbmVzKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+IC3CoMKg wqDCoMKgwqDCoCBwY2lfZGV2aWNlX2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVf R0NGR0MpOwo+PiArwqDCoMKgIG1lbXNldChlbmdpbmVzLCAwLCBzaXplb2YoKmVuZ2luZXMpKTsK Pj4gLcKgwqDCoMKgwqDCoMKgIHN3aXRjaCAoZ2NmZ2MgJiAweGYpIHsKPj4gLcKgwqDCoMKgwqDC oMKgIGNhc2UgODoKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29yZV9jbG9jayA9IDI2NjsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNl IDk6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvcmVfY2xvY2sgPSAzMjA7Cj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiAtwqDCoMKgwqDCoMKgwqAgY2FzZSAxMToKPj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29yZV9jbG9jayA9IDQwMDsKPj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNlIDEzOgo+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBjb3JlX2Nsb2NrID0gNTMzOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBicmVhazsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgIHByaW50 X2Nsb2NrKCJjb3JlIiwgY29yZV9jbG9jayk7Cj4+IC3CoMKgwqAgfSBlbHNlIGlmIChJU185NjUo ZGV2aWQpICYmIElTX01PQklMRShkZXZpZCkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIGludCByZW5k ZXJfY2xvY2sgPSAtMSwgc2FtcGxlcl9jbG9jayA9IC0xOwo+PiArwqDCoMKgIGVuZ2luZXMtPm51 bV9lbmdpbmVzID0gMDsKPj4gLcKgwqDCoMKgwqDCoMKgIHBjaV9kZXZpY2VfY2ZnX3JlYWRfdTE2 KHBjaV9kZXYsICZnY2ZnYywgSTkxNV9HQ0ZHQyk7Cj4+ICvCoMKgwqAgZCA9IG9wZW5kaXIoc3lz ZnNfcm9vdCk7Cj4+ICvCoMKgwqAgaWYgKCFkKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5V TEw7Cj4+IC3CoMKgwqDCoMKgwqDCoCBzd2l0Y2ggKGdjZmdjICYgMHhmKSB7Cj4+IC3CoMKgwqDC oMKgwqDCoCBjYXNlIDI6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbmRlcl9jbG9jayA9 IDI1MDsgc2FtcGxlcl9jbG9jayA9IDI2NzsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJl YWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNlIDM6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHJlbmRlcl9jbG9jayA9IDMyMDsgc2FtcGxlcl9jbG9jayA9IDMzMzsKPj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNlIDQ6Cj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJlbmRlcl9jbG9jayA9IDQwMDsgc2FtcGxlcl9jbG9jayA9IDQ0NDsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNl IDU6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbmRlcl9jbG9jayA9IDUwMDsgc2FtcGxl cl9jbG9jayA9IDUzMzsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKg wqDCoMKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgIHByaW50X2Nsb2NrKCJyZW5kZXIi LCByZW5kZXJfY2xvY2spOwo+PiAtwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCLCoCAiKTsKPj4gLcKg wqDCoMKgwqDCoMKgIHByaW50X2Nsb2NrKCJzYW1wbGVyIiwgc2FtcGxlcl9jbG9jayk7Cj4+IC3C oMKgwqAgfSBlbHNlIGlmIChJU185NDUoZGV2aWQpICYmIElTX01PQklMRShkZXZpZCkpIHsKPj4g LcKgwqDCoMKgwqDCoMKgIGludCByZW5kZXJfY2xvY2sgPSAtMSwgZGlzcGxheV9jbG9jayA9IC0x Owo+PiArwqDCoMKgIHdoaWxlICgoZGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKPj4gK8Kg wqDCoMKgwqDCoMKgIGNvbnN0IGNoYXIgKmVuZHN3aXRoID0gIi1idXN5IjsKPj4gK8KgwqDCoMKg wqDCoMKgIGNvbnN0IHVuc2lnbmVkIGludCBlbmRsZW4gPSBzdHJsZW4oZW5kc3dpdGgpOwo+PiAr wqDCoMKgwqDCoMKgwqAgc3RydWN0IGVuZ2luZSAqZW5naW5lID0KPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBlbmdpbmVfcHRyKGVuZ2luZXMsIGVuZ2luZXMtPm51bV9lbmdpbmVz KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGNoYXIgYnVmWzI1Nl07Cj4+IC3CoMKgwqDCoMKgwqDCoCBw Y2lfZGV2aWNlX2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOwo+PiAr wqDCoMKgwqDCoMKgwqAgaWYgKGRlbnQtPmRfdHlwZSAhPSBEVF9SRUcpCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+PiAtwqDCoMKgwqDCoMKgwqAgc3dpdGNoIChnY2ZnYyAm IDB4Nykgewo+PiAtwqDCoMKgwqDCoMKgwqAgY2FzZSAwOgo+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZW5kZXJfY2xvY2sgPSAxNjY7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFr Owo+PiAtwqDCoMKgwqDCoMKgwqAgY2FzZSAxOgo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBy ZW5kZXJfY2xvY2sgPSAyMDA7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiAt wqDCoMKgwqDCoMKgwqAgY2FzZSAzOgo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZW5kZXJf Y2xvY2sgPSAyNTA7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiAtwqDCoMKg wqDCoMKgwqAgY2FzZSA1Ogo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZW5kZXJfY2xvY2sg PSA0MDA7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoc3RybGVuKGRlbnQtPmRfbmFtZSkgPj0gc2l6 ZW9mKGJ1ZikpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gLTE7Cj4+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiAt wqDCoMKgwqDCoMKgwqAgc3dpdGNoIChnY2ZnYyAmIDB4NzApIHsKPj4gLcKgwqDCoMKgwqDCoMKg IGNhc2UgMDoKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGlzcGxheV9jbG9jayA9IDIwMDsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNl IDQ6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRpc3BsYXlfY2xvY2sgPSAzMjA7Cj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDC oMKgwqDCoMKgwqAgaWYgKGdjZmdjICYgKDEgPDwgNykpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGRpc3BsYXlfY2xvY2sgPSAxMzM7Cj4+ICvCoMKgwqDCoMKgwqDCoCBzdHJjcHkoYnVmLCBk ZW50LT5kX25hbWUpOwo+PiAtwqDCoMKgwqDCoMKgwqAgcHJpbnRfY2xvY2soInJlbmRlciIsIHJl bmRlcl9jbG9jayk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcmludGYoIsKgICIpOwo+PiAtwqDCoMKg wqDCoMKgwqAgcHJpbnRfY2xvY2soImRpc3BsYXkiLCBkaXNwbGF5X2Nsb2NrKTsKPj4gLcKgwqDC oCB9IGVsc2UgaWYgKElTXzkxNShkZXZpZCkgJiYgSVNfTU9CSUxFKGRldmlkKSkgewo+PiAtwqDC oMKgwqDCoMKgwqAgaW50IHJlbmRlcl9jbG9jayA9IC0xLCBkaXNwbGF5X2Nsb2NrID0gLTE7Cj4+ ICvCoMKgwqDCoMKgwqDCoCAvKiB4eHhOLWJ1c3kgKi8KPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChz dHJsZW4oYnVmKSA8IChlbmRsZW4gKyA0KSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29u dGludWU7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoc3RyY21wKCZidWZbc3RybGVuKGJ1ZikgLSBl bmRsZW5dLCBlbmRzd2l0aCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+ PiAtwqDCoMKgwqDCoMKgwqAgcGNpX2RldmljZV9jZmdfcmVhZF91MTYocGNpX2RldiwgJmdjZmdj LCBJOTE1X0dDRkdDKTsKPj4gK8KgwqDCoMKgwqDCoMKgIG1lbXNldChlbmdpbmUsIDAsIHNpemVv ZigqZW5naW5lKSk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBzd2l0Y2ggKGdjZmdjICYgMHg3KSB7Cj4+ IC3CoMKgwqDCoMKgwqDCoCBjYXNlIDA6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbmRl cl9jbG9jayA9IDE2MDsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKg wqDCoMKgwqDCoCBjYXNlIDE6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbmRlcl9jbG9j ayA9IDE5MDsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKg wqDCoCBjYXNlIDQ6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbmRlcl9jbG9jayA9IDMz MzsKPj4gK8KgwqDCoMKgwqDCoMKgIGJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxlbl0gPSAwOwo+PiAr wqDCoMKgwqDCoMKgwqAgZW5naW5lLT5uYW1lID0gc3RyZHVwKGJ1Zik7Cj4+ICvCoMKgwqDCoMKg wqDCoCBpZiAoIWVuZ2luZS0+bmFtZSkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQg PSAtMTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IMKgwqDCoMKgwqDC oMKgwqDCoCB9Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoZ2NmZ2MgJiAoMSA8PCAxMykpCj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbmRlcl9jbG9jayA9IDEzMzsKPj4gLcKgwqDCoMKgwqDC oMKgIHN3aXRjaCAoZ2NmZ2MgJiAweDcwKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNlIDA6Cj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRpc3BsYXlfY2xvY2sgPSAxOTA7Cj4+ICvCoMKgwqDC oMKgwqDCoCBlbmdpbmUtPmJ1c3kuY29uZmlnID0gZ2V0X3BtdV9jb25maWcoZGlyZmQoZCksIGVu Z2luZS0+bmFtZSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICJidXN5Iik7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoZW5naW5lLT5i dXN5LmNvbmZpZyA9PSAtMSkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSAtMTsK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBj YXNlIDQ6Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRpc3BsYXlfY2xvY2sgPSAzMzM7Cj4+ ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGVuZ2luZXMtPm51bV9l bmdpbmVzKys7Cj4+ICvCoMKgwqDCoMKgwqDCoCBlbmdpbmVzID0gcmVhbGxvYyhlbmdpbmVzLCBz aXplb2Yoc3RydWN0IGVuZ2luZXMpICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZW5naW5lcy0+bnVtX2VuZ2luZXMgKiBzaXplb2Yoc3RydWN0IGVuZ2luZSkpOwo+PiAr wqDCoMKgwqDCoMKgwqAgaWYgKCFlbmdpbmVzKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHJldCA9IC1FTk9NRU07Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGdjZmdjICYgKDEgPDwg NykpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRpc3BsYXlfY2xvY2sgPSAxMzM7Cj4+ICvC oMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgIGZyZWUo ZW5naW5lcyk7Cj4+ICvCoMKgwqAgZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBxc29ydChlbmdp bmVfcHRyKGVuZ2luZXMsIDApLCBlbmdpbmVzLT5udW1fZW5naW5lcywKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHNpemVvZihzdHJ1Y3QgZW5naW5lKSwgZW5naW5lX2NtcCk7Cj4+IC3C oMKgwqDCoMKgwqDCoCBwcmludF9jbG9jaygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKPj4gLcKg wqDCoMKgwqDCoMKgIHByaW50ZigiwqAgIik7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcmludF9jbG9j aygiZGlzcGxheSIsIGRpc3BsYXlfY2xvY2spOwo+PiArwqDCoMKgwqDCoMKgwqAgZW5naW5lcy0+ cm9vdCA9IGQ7Cj4+IMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgIHJldHVybiByZXQgPT0gMCA/IGVu Z2luZXMgOiBOVUxMOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50Cj4+ICtmaWxlbmFtZV90b19i dWYoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZnNpemUp Cj4+ICt7Cj4+ICvCoMKgwqAgaW50IGZkOwo+PiArwqDCoMKgIHNzaXplX3QgcmV0Owo+PiArCj4+ ICvCoMKgwqAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Cj4+ICvCoMKgwqAgaWYgKGZk IDwgMCkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4gKwo+PiArwqDCoMKgIHJldCA9 IHJlYWQoZmQsIGJ1ZiwgYnVmc2l6ZSAtIDEpOwo+PiArwqDCoMKgIGNsb3NlKGZkKTsKPj4gK8Kg wqDCoCBpZiAocmV0IDwgMSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4gKwo+PiAr wqDCoMKgIGJ1ZltyZXRdID0gJ1wwJzsKPj4gLcKgwqDCoCBwcmludGYoIlxuIik7Cj4+IC3CoMKg wqAgcmV0dXJuIC0xOwo+PiArwqDCoMKgIHJldHVybiAwOwo+PiDCoCB9Cj4+IC0jZGVmaW5lIFNU QVRTX0xFTiAoMjApCj4+IC0jZGVmaW5lIFBFUkNFTlRBR0VfQkFSX0VORMKgwqDCoCAoNzkgLSBT VEFUU19MRU4pCj4+ICtzdGF0aWMgdWludDY0X3QgZmlsZW5hbWVfdG9fdTY0KGNvbnN0IGNoYXIg KmZpbGVuYW1lLCBpbnQgYmFzZSkKPj4gK3sKPj4gK8KgwqDCoCBjaGFyIGJ1Zls2NF0sICpiOwo+ PiAtc3RhdGljIHZvaWQKPj4gLXByaW50X3BlcmNlbnRhZ2VfYmFyKGZsb2F0IHBlcmNlbnQsIGlu dCBjdXJfbGluZV9sZW4pCj4+ICvCoMKgwqAgaWYgKGZpbGVuYW1lX3RvX2J1ZihmaWxlbmFtZSwg YnVmLCBzaXplb2YoYnVmKSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiAr wqDCoMKgIC8qCj4+ICvCoMKgwqDCoCAqIEhhbmRsZSBib3RoIHNpbmdsZSBpbnRlZ2VyIGFuZCBr ZXk9dmFsdWUgZm9ybWF0cyBieSBza2lwcGluZwo+PiArwqDCoMKgwqAgKiBsZWFkaW5nIG5vbi1k aWdpdHMuCj4+ICvCoMKgwqDCoCAqLwo+PiArwqDCoMKgIGIgPSBidWY7Cj4+ICvCoMKgwqAgd2hp bGUgKCpiICYmICFpc2RpZ2l0KCpiKSkKPj4gK8KgwqDCoMKgwqDCoMKgIGIrKzsKPj4gKwo+PiAr wqDCoMKgIHJldHVybiBzdHJ0b3VsbChiLCBOVUxMLCBiYXNlKTsKPj4gK30KPj4gKwo+PiArc3Rh dGljIHVpbnQ2NF90IHJhcGxfdHlwZV9pZCh2b2lkKQo+PiDCoCB7Cj4+IC3CoMKgwqAgaW50IGJh cl9hdmFpbF9sZW4gPSAoUEVSQ0VOVEFHRV9CQVJfRU5EIC0gY3VyX2xpbmVfbGVuIC0gMSkgKiA4 Owo+PiAtwqDCoMKgIGludCBiYXJfbGVuID0gYmFyX2F2YWlsX2xlbiAqIChwZXJjZW50ICsgLjUp IC8gMTAwLjA7Cj4+IC3CoMKgwqAgaW50IGk7Cj4+ICvCoMKgwqAgcmV0dXJuIGZpbGVuYW1lX3Rv X3U2NCgiL3N5cy9kZXZpY2VzL3Bvd2VyL3R5cGUiLCAxMCk7Cj4+ICt9Cj4+IC3CoMKgwqAgZm9y IChpID0gYmFyX2xlbjsgaSA+PSA4OyBpIC09IDgpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByaW50 ZigiJXMiLCBiYXJzWzhdKTsKPj4gLcKgwqDCoMKgwqDCoMKgIGN1cl9saW5lX2xlbisrOwo+PiAt wqDCoMKgIH0KPj4gLcKgwqDCoCBpZiAoaSkgewo+PiAtwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCIl cyIsIGJhcnNbaV0pOwo+PiAtwqDCoMKgwqDCoMKgwqAgY3VyX2xpbmVfbGVuKys7Cj4+IC3CoMKg wqAgfQo+PiArc3RhdGljIHVpbnQ2NF90IHJhcGxfZ3B1X3Bvd2VyKHZvaWQpCj4+ICt7Cj4+ICvC oMKgwqAgcmV0dXJuIGZpbGVuYW1lX3RvX3U2NCgiL3N5cy9kZXZpY2VzL3Bvd2VyL2V2ZW50cy9l bmVyZ3ktZ3B1IiwgMCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBkb3VibGUgZmlsZW5hbWVfdG9f ZG91YmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQo+PiArewo+PiArwqDCoMKgIGNoYXIgKm9sZGxv Y2FsZTsKPj4gK8KgwqDCoCBjaGFyIGJ1Zls4MF07Cj4+ICvCoMKgwqAgZG91YmxlIHY7Cj4+ICsK Pj4gK8KgwqDCoCBpZiAoZmlsZW5hbWVfdG9fYnVmKGZpbGVuYW1lLCBidWYsIHNpemVvZihidWYp KSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiAtwqDCoMKgIC8qIE5COiBXZSBjYW4n dCB1c2UgYSBmaWVsZCB3aWR0aCB3aXRoIHV0Zjggc28gd2UgbWFudWFsbHkKPj4gLcKgwqDCoCAq IGd1YXJhbnRlZSBhIGZpZWxkIHdpdGggb2YgNDUgY2hhcnMgZm9yIGFueSBiYXIuICovCj4+IC3C oMKgwqAgcHJpbnRmKCIlKnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQgLSBjdXJfbGluZV9sZW4sICIi KTsKPj4gK8KgwqDCoCBvbGRsb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCAiQyIpOwo+PiArwqDC oMKgIHYgPSBzdHJ0b2QoYnVmLCBOVUxMKTsKPj4gK8KgwqDCoCBzZXRsb2NhbGUoTENfQUxMLCBv bGRsb2NhbGUpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHY7Cj4+IMKgIH0KPj4gLXN0cnVjdCBy aW5nIHsKPj4gLcKgwqDCoCBjb25zdCBjaGFyICpuYW1lOwo+PiAtwqDCoMKgIHVpbnQzMl90IG1t aW87Cj4+IC3CoMKgwqAgaW50IGhlYWQsIHRhaWwsIHNpemU7Cj4+IC3CoMKgwqAgdWludDY0X3Qg ZnVsbDsKPj4gLcKgwqDCoCBpbnQgaWRsZTsKPj4gLX07Cj4+ICtzdGF0aWMgZG91YmxlIHJhcGxf Z3B1X3Bvd2VyX3NjYWxlKHZvaWQpCj4+ICt7Cj4+ICvCoMKgwqAgcmV0dXJuIAo+PiBmaWxlbmFt ZV90b19kb3VibGUoIi9zeXMvZGV2aWNlcy9wb3dlci9ldmVudHMvZW5lcmd5LWdwdS5zY2FsZSIp Owo+PiArfQo+PiAtc3RhdGljIHVpbnQzMl90IHJpbmdfcmVhZChzdHJ1Y3QgcmluZyAqcmluZywg dWludDMyX3QgcmVnKQo+PiArI2RlZmluZSBfX29wZW5fcG11KGVuZ2luZXMsIHBtdSwgaWR4KSBc Cj4+ICsoeyBcCj4+ICvCoMKgwqAgaW50IGZkX187IFwKPj4gK1wKPj4gK8KgwqDCoCBmZF9fID0g cGVyZl9pOTE1X29wZW5fZ3JvdXAoKHBtdSktPmNvbmZpZywgKGVuZ2luZXMpLT5mZCk7IFwKPj4g K8KgwqDCoCBpZiAoZmRfXyA+PSAwKSB7IFwKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICgoZW5naW5l cyktPmZkID09IC0xKSBcCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChlbmdpbmVzKS0+ZmQg PSBmZF9fOyBcCj4+ICvCoMKgwqDCoMKgwqDCoCAocG11KS0+aWR4ID0gKGlkeCkrKzsgXAo+PiAr wqDCoMKgwqDCoMKgwqAgKGVuZ2luZXMpLT5udW1fY291bnRlcnMrKzsgXAo+PiArwqDCoMKgIH0g XAo+PiArXAo+PiArwqDCoMKgIGZkX187IFwKPj4gK30pCj4+ICsKPj4gK3N0YXRpYyBpbnQgcG11 X2luaXQoc3RydWN0IGVuZ2luZXMgKmVuZ2luZXMpCj4+IMKgIHsKPj4gLcKgwqDCoCByZXR1cm4g SU5SRUcocmluZy0+bW1pbyArIHJlZyk7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGlkeCA9IDA7 Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGk7Cj4+ICvCoMKgwqAgaW50IGZkOwo+PiArCj4+ICvC oMKgwqAgZW5naW5lcy0+ZmQgPSAtMTsKPj4gK8KgwqDCoCBlbmdpbmVzLT5udW1fY291bnRlcnMg PSAwOwo+PiArCj4+ICvCoMKgwqAgZW5naW5lcy0+ZnJlcV9yZXEuY29uZmlnID0gSTkxNV9QTVVf UkVRVUVTVEVEX0ZSRVFVRU5DWTsKPj4gK8KgwqDCoCBmZCA9IF9fb3Blbl9wbXUoZW5naW5lcywg JmVuZ2luZXMtPmZyZXFfcmVxLCBpZHgpOwo+PiArwqDCoMKgIGlmIChmZCA8IDApCj4+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4+ICsKPj4gK8KgwqDCoCBlbmdpbmVzLT5mcmVxX2FjdC5j b25maWcgPSBJOTE1X1BNVV9BQ1RVQUxfRlJFUVVFTkNZOwo+PiArwqDCoMKgIGZkID0gX19vcGVu X3BtdShlbmdpbmVzLCAmZW5naW5lcy0+ZnJlcV9hY3QsIGlkeCk7Cj4+ICvCoMKgwqAgaWYgKGZk IDwgMCkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4gKwo+PiArwqDCoMKgIGVuZ2lu ZXMtPmlycS5jb25maWcgPSBJOTE1X1BNVV9JTlRFUlJVUFRTOwo+PiArwqDCoMKgIGZkID0gX19v cGVuX3BtdShlbmdpbmVzLCAmZW5naW5lcy0+aXJxLCBpZHgpOwo+PiArwqDCoMKgIGlmIChmZCA8 IDApCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4+ICsKPj4gK8KgwqDCoCBlbmdpbmVz LT5yYzYuY29uZmlnID0gSTkxNV9QTVVfUkM2X1JFU0lERU5DWTsKPj4gK8KgwqDCoCBmZCA9IF9f b3Blbl9wbXUoZW5naW5lcywgJmVuZ2luZXMtPnJjNiwgaWR4KTsKPj4gK8KgwqDCoCBpZiAoZmQg PCAwKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC0xOwo+PiArCj4+ICvCoMKgwqAgZm9yIChp ID0gMDsgaSA8IGVuZ2luZXMtPm51bV9lbmdpbmVzOyBpKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKg IHN0cnVjdCBlbmdpbmUgKmVuZ2luZSA9IGVuZ2luZV9wdHIoZW5naW5lcywgaSk7Cj4+ICvCoMKg wqDCoMKgwqDCoCBzdHJ1Y3Qgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgcG11 X2NvdW50ZXIgKnBtdTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgY2hhciAqY291 bnRlcjsKPj4gK8KgwqDCoMKgwqDCoMKgIH0gKmNudCwgY291bnRlcnNbXSA9IHsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgeyAucG11ID0gJmVuZ2luZS0+YnVzeSwgLmNvdW50ZXIgPSAiYnVz eSIgfSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgeyAucG11ID0gJmVuZ2luZS0+d2FpdCwg LmNvdW50ZXIgPSAid2FpdCIgfSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgeyAucG11ID0g JmVuZ2luZS0+c2VtYSwgLmNvdW50ZXIgPSAic2VtYSIgfSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgeyAucG11ID0gTlVMTCwgLmNvdW50ZXIgPSBOVUxMIH0sCj4+ICvCoMKgwqDCoMKgwqDC oCB9Owo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGNudCA9IGNvdW50ZXJzOyBjbnQtPnBt dTsgY250KyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFjbnQtPnBtdS0+Y29u ZmlnKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNudC0+cG11LT5jb25maWcg PQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2V0X3BtdV9jb25m aWcoZGlyZmQoZW5naW5lcy0+cm9vdCksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW5naW5lLT5uYW1lLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNu dC0+Y291bnRlcik7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZkID0gX19vcGVuX3BtdShl bmdpbmVzLCBjbnQtPnBtdSwgaWR4KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGZk IDwgMCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLTE7Cj4+ICvC oMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgZW5naW5lcy0+cmFw bF9zY2FsZSA9IHJhcGxfZ3B1X3Bvd2VyX3NjYWxlKCk7Cj4+ICvCoMKgwqAgaWYgKGVuZ2luZXMt PnJhcGxfc2NhbGUgIT0gTkFOKQo+PiArwqDCoMKgwqDCoMKgwqAgZW5naW5lcy0+cmFwbF9zY2Fs ZSAqPSAxZTM7IC8qIGZyb20gbmFubyB0byBtaWNybyAqLwo+PiArwqDCoMKgIGVuZ2luZXMtPnJh cGwuY29uZmlnID0gcmFwbF9ncHVfcG93ZXIoKTsKPj4gK8KgwqDCoCBlbmdpbmVzLT5yYXBsX2Zk ID0gaWd0X3BlcmZfb3BlbihyYXBsX3R5cGVfaWQoKSwgCj4+IGVuZ2luZXMtPnJhcGwuY29uZmln KTsKPj4gK8KgwqDCoCBpZiAoZW5naW5lcy0+cmFwbF9mZCA8IDApCj4+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gLTE7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gwqAgfQo+PiAtc3RhdGlj IHZvaWQgcmluZ19pbml0KHN0cnVjdCByaW5nICpyaW5nKQo+PiArc3RhdGljIHVpbnQ2NF90IHBt dV9yZWFkX211bHRpKGludCBmZCwgdW5zaWduZWQgaW50IG51bSwgdWludDY0X3QgKnZhbCkKPj4g wqAgewo+PiAtwqDCoMKgIHJpbmctPnNpemUgPSAoKChyaW5nX3JlYWQocmluZywgUklOR19MRU4p ICYgUklOR19OUl9QQUdFUykgPj4gMTIpIAo+PiArIDEpICogNDA5NjsKPj4gK8KgwqDCoCB1aW50 NjRfdCBidWZbMiArIG51bV07Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGk7Cj4+ICvCoMKgwqAg c3NpemVfdCBsZW47Cj4+ICsKPj4gK8KgwqDCoCBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7 Cj4+ICsKPj4gK8KgwqDCoCBsZW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKPj4gK8Kg wqDCoCBhc3NlcnQobGVuID09IHNpemVvZihidWYpKTsKPj4gKwo+PiArwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBudW07IGkrKykKPj4gK8KgwqDCoMKgwqDCoMKgIHZhbFtpXSA9IGJ1ZlsyICsgaV07 Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gYnVmWzFdOwo+PiDCoCB9Cj4+IC1zdGF0aWMgdm9pZCBy aW5nX3Jlc2V0KHN0cnVjdCByaW5nICpyaW5nKQo+PiArc3RhdGljIGRvdWJsZSBwbXVfY2FsYyhz dHJ1Y3QgcG11X3BhaXIgKnAsIGRvdWJsZSBkLCBkb3VibGUgdCwgZG91YmxlIHMpCj4+IMKgIHsK Pj4gLcKgwqDCoCByaW5nLT5pZGxlID0gcmluZy0+ZnVsbCA9IDA7Cj4+ICvCoMKgwqAgZG91Ymxl IHBjdDsKPj4gKwo+PiArwqDCoMKgIHBjdCA9IHAtPmN1ciAtIHAtPnByZXY7Cj4+ICvCoMKgwqAg cGN0IC89IGQ7Cj4+ICvCoMKgwqAgcGN0IC89IHQ7Cj4+ICvCoMKgwqAgcGN0ICo9IHM7Cj4+ICsK Pj4gK8KgwqDCoCBpZiAocyA9PSAxMDAuMCAmJiBwY3QgPiAxMDAuMCkKPj4gK8KgwqDCoMKgwqDC oMKgIHBjdCA9IDEwMC4wOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHBjdDsKPj4gwqAgfQo+PiAt c3RhdGljIHZvaWQgcmluZ19zYW1wbGUoc3RydWN0IHJpbmcgKnJpbmcpCj4+ICtzdGF0aWMgdWlu dDY0X3QgX19wbXVfcmVhZF9zaW5nbGUoaW50IGZkLCB1aW50NjRfdCAqdHMpCj4+IMKgIHsKPj4g LcKgwqDCoCBpbnQgZnVsbDsKPj4gK8KgwqDCoCB1aW50NjRfdCBkYXRhWzJdID0geyB9Owo+PiAr wqDCoMKgIHNzaXplX3QgbGVuOwo+PiAtwqDCoMKgIGlmICghcmluZy0+c2l6ZSkKPj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybjsKPj4gK8KgwqDCoCBsZW4gPSByZWFkKGZkLCBkYXRhLCBzaXplb2Yo ZGF0YSkpOwo+PiArwqDCoMKgIGFzc2VydChsZW4gPT0gc2l6ZW9mKGRhdGEpKTsKPj4gLcKgwqDC oCByaW5nLT5oZWFkID0gcmluZ19yZWFkKHJpbmcsIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7Cj4+ IC3CoMKgwqAgcmluZy0+dGFpbCA9IHJpbmdfcmVhZChyaW5nLCBSSU5HX1RBSUwpICYgVEFJTF9B RERSOwo+PiArwqDCoMKgIGlmICh0cykKPj4gK8KgwqDCoMKgwqDCoMKgICp0cyA9IGRhdGFbMV07 Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gZGF0YVswXTsKPj4gK30KPj4gLcKgwqDCoCBpZiAocmlu Zy0+dGFpbCA9PSByaW5nLT5oZWFkKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmluZy0+aWRsZSsrOwo+ PiArc3RhdGljIHVpbnQ2NF90IHBtdV9yZWFkX3NpbmdsZShpbnQgZmQpCj4+ICt7Cj4+ICvCoMKg wqAgcmV0dXJuIF9fcG11X3JlYWRfc2luZ2xlKGZkLCBOVUxMKTsKPj4gK30KPj4gLcKgwqDCoCBm dWxsID0gcmluZy0+dGFpbCAtIHJpbmctPmhlYWQ7Cj4+IC3CoMKgwqAgaWYgKGZ1bGwgPCAwKQo+ PiAtwqDCoMKgwqDCoMKgwqAgZnVsbCArPSByaW5nLT5zaXplOwo+PiAtwqDCoMKgIHJpbmctPmZ1 bGwgKz0gZnVsbDsKPj4gK3N0YXRpYyB2b2lkIF9fdXBkYXRlX3NhbXBsZShzdHJ1Y3QgcG11X2Nv dW50ZXIgKmNvdW50ZXIsIHVpbnQ2NF90IHZhbCkKPj4gK3sKPj4gK8KgwqDCoCBjb3VudGVyLT52 YWwucHJldiA9IGNvdW50ZXItPnZhbC5jdXI7Cj4+ICvCoMKgwqAgY291bnRlci0+dmFsLmN1ciA9 IHZhbDsKPj4gwqAgfQo+PiAtc3RhdGljIHZvaWQgcmluZ19wcmludF9oZWFkZXIoRklMRSAqb3V0 LCBzdHJ1Y3QgcmluZyAqcmluZykKPj4gK3N0YXRpYyB2b2lkIHVwZGF0ZV9zYW1wbGUoc3RydWN0 IHBtdV9jb3VudGVyICpjb3VudGVyLCB1aW50NjRfdCAqdmFsKQo+PiDCoCB7Cj4+IC3CoMKgwqAg ZnByaW50ZihvdXQsICIlLjZzJSVcdG9wc1x0IiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmluZy0+bmFtZQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgICk7Cj4+ICvCoMKgwqAgX191cGRhdGVf c2FtcGxlKGNvdW50ZXIsIHZhbFtjb3VudGVyLT5pZHhdKTsKPj4gwqAgfQo+PiAtc3RhdGljIHZv aWQgcmluZ19wcmludChzdHJ1Y3QgcmluZyAqcmluZywgdW5zaWduZWQgbG9uZyBzYW1wbGVzX3Bl cl9zZWMpCj4+ICtzdGF0aWMgdm9pZCBwbXVfc2FtcGxlKHN0cnVjdCBlbmdpbmVzICplbmdpbmVz KQo+PiDCoCB7Cj4+IC3CoMKgwqAgaW50IHBlcmNlbnRfYnVzeSwgbGVuOwo+PiArwqDCoMKgIGNv bnN0IGludCBudW1fdmFsID0gZW5naW5lcy0+bnVtX2NvdW50ZXJzOwo+PiArwqDCoMKgIHVpbnQ2 NF90IHZhbFtudW1fdmFsXTsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgaTsKPj4gKwo+PiArwqDC oMKgIGVuZ2luZXMtPnRzLnByZXYgPSBlbmdpbmVzLT50cy5jdXI7Cj4+ICvCoMKgwqAgZW5naW5l cy0+dHMuY3VyID0gcG11X3JlYWRfbXVsdGkoZW5naW5lcy0+ZmQsIG51bV92YWwsIHZhbCk7Cj4+ ICsKPj4gK8KgwqDCoCBfX3VwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPnJhcGwsIHBtdV9yZWFkX3Np bmdsZShlbmdpbmVzLT5yYXBsX2ZkKSk7Cj4+IC3CoMKgwqAgaWYgKCFyaW5nLT5zaXplKQo+PiAt wqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+PiArwqDCoMKgIHVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMt PmZyZXFfcmVxLCB2YWwpOwo+PiArwqDCoMKgIHVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmZyZXFf YWN0LCB2YWwpOwo+PiArwqDCoMKgIHVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmlycSwgdmFsKTsK Pj4gK8KgwqDCoCB1cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5yYzYsIHZhbCk7Cj4+IC3CoMKgwqAg cGVyY2VudF9idXN5ID0gMTAwIC0gMTAwICogcmluZy0+aWRsZSAvIHNhbXBsZXNfcGVyX3NlYzsK Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgZW5naW5lcy0+bnVtX2VuZ2luZXM7IGkrKykgewo+ PiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IGVuZ2luZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdp bmVzLCBpKTsKPj4gLcKgwqDCoCBsZW4gPSBwcmludGYoIiUyNXMgYnVzeTogJTNkJSU6ICIsIHJp bmctPm5hbWUsIHBlcmNlbnRfYnVzeSk7Cj4+IC3CoMKgwqAgcHJpbnRfcGVyY2VudGFnZV9iYXIg KHBlcmNlbnRfYnVzeSwgbGVuKTsKPj4gLcKgwqDCoCBwcmludGYoIiUyNHMgc3BhY2U6ICVkLyVk XG4iLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZy0+bmFtZSwKPj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgIChpbnQpKHJpbmctPmZ1bGwgLyBzYW1wbGVzX3Blcl9zZWMpLAo+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmluZy0+c2l6ZSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1cGRhdGVfc2Ft cGxlKCZlbmdpbmUtPmJ1c3ksIHZhbCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1cGRhdGVfc2FtcGxl KCZlbmdpbmUtPnNlbWEsIHZhbCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1cGRhdGVfc2FtcGxlKCZl bmdpbmUtPndhaXQsIHZhbCk7Cj4+ICvCoMKgwqAgfQo+PiDCoCB9Cj4+IC1zdGF0aWMgdm9pZCBy aW5nX2xvZyhzdHJ1Y3QgcmluZyAqcmluZywgdW5zaWduZWQgbG9uZyBzYW1wbGVzX3Blcl9zZWMs Cj4+IC3CoMKgwqDCoMKgwqDCoCBGSUxFICpvdXRwdXQpCj4+ICtzdGF0aWMgY29uc3QgY2hhciAq YmFyc1tdID0geyAiICIsICLilo8iLCAi4paOIiwgIuKWjSIsICLilowiLCAi4paLIiwgIuKWiiIs ICLilokiLCAKPj4gIuKWiCIgfTsKPj4gKwo+PiArc3RhdGljIHZvaWQKPj4gK3ByaW50X3BlcmNl bnRhZ2VfYmFyKGRvdWJsZSBwZXJjZW50LCBpbnQgbWF4X2xlbikKPj4gwqAgewo+PiAtwqDCoMKg IGlmIChyaW5nLT5zaXplKQo+PiAtwqDCoMKgwqDCoMKgwqAgZnByaW50ZihvdXRwdXQsICIlM2Rc dCVkXHQiLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoaW50KSgxMDAgLSAxMDAgKiByaW5n LT5pZGxlIC8gc2FtcGxlc19wZXJfc2VjKSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGlu dCkocmluZy0+ZnVsbCAvIHNhbXBsZXNfcGVyX3NlYykpOwo+PiAtwqDCoMKgIGVsc2UKPj4gLcKg wqDCoMKgwqDCoMKgIGZwcmludGYob3V0cHV0LCAiLTFcdC0xXHQiKTsKPj4gK8KgwqDCoCBpbnQg YmFyX2xlbiA9IHBlcmNlbnQgKiAoOCAqIChtYXhfbGVuIC0gMikpIC8gMTAwLjA7Cj4+ICvCoMKg wqAgaW50IGk7Cj4+ICsKPj4gK8KgwqDCoCBwdXRjaGFyKCd8Jyk7Cj4+ICsKPj4gK8KgwqDCoCBm b3IgKGkgPSBiYXJfbGVuOyBpID49IDg7IGkgLT0gOCkKPj4gK8KgwqDCoMKgwqDCoMKgIHByaW50 ZigiJXMiLCBiYXJzWzhdKTsKPj4gK8KgwqDCoCBpZiAoaSkKPj4gK8KgwqDCoMKgwqDCoMKgIHBy aW50ZigiJXMiLCBiYXJzW2ldKTsKPj4gKwo+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCAobWF4 X2xlbiAtIDIgLSAoYmFyX2xlbiArIDcpIC8gOCk7IGkrKykKPj4gK8KgwqDCoMKgwqDCoMKgIHB1 dGNoYXIoJyAnKTsKPj4gKwo+PiArwqDCoMKgIHB1dGNoYXIoJ3wnKTsKPj4gwqAgfQo+PiArI2Rl ZmluZSBERUZBVUxUX1BFUklPRF9NUyAoMTAwMCkKPj4gKwo+PiDCoCBzdGF0aWMgdm9pZAo+PiDC oCB1c2FnZShjb25zdCBjaGFyICphcHBuYW1lKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgcHJpbnRm KCJpbnRlbF9ncHVfdG9wIC0gRGlzcGxheSBhIHRvcC1saWtlIHN1bW1hcnkgb2YgSW50ZWwgR1BV IAo+PiB1c2FnZVxuIgo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiXG4iCj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgICJ1c2FnZTogJXMgW3BhcmFtZXRlcnNdXG4iCj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgICJcbiIKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlRoZSBmb2xsb3dp bmcgcGFyYW1ldGVycyBhcHBseTpcbiIKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlstcyA8 c2FtcGxlcz5dwqDCoMKgwqDCoMKgIHNhbXBsZXMgcGVyIHNlY29uZHMgKGRlZmF1bHQgJWQpXG4i Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJbLWUgPGNvbW1hbmQ+XcKgwqDCoMKgwqDCoCBj b21tYW5kIHRvIHByb2ZpbGVcbiIKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlstbyA8Zmls ZT5dwqDCoMKgwqDCoMKgwqDCoMKgIG91dHB1dCBzdGF0aXN0aWNzIHRvIGZpbGUuIElmIGZpbGUg Cj4+IGlzICctJywiCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgICLCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJ1biBpbiBiYXRjaCBtb2RlIGFuZCBvdXRwdXQgCj4+ IHN0YXRpc3RpY3MgdG8gc3RkaW8gb25seSBcbiIKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg IlstaF3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaG93IHRoaXMgaGVscCBzY3Jl ZW5cbiIKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlxuIiwKPj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgYXBwbmFtZSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU0FNUExFU19QRVJf U0VDCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqAgKTsKPj4gLcKgwqDCoCByZXR1cm47Cj4+ICvCoMKg wqDCoMKgwqDCoCAiXG4iCj4+ICvCoMKgwqDCoMKgwqDCoCAiVXNhZ2U6ICVzIFtwYXJhbWV0ZXJz XVxuIgo+PiArwqDCoMKgwqDCoMKgwqAgIlxuIgo+PiArwqDCoMKgwqDCoMKgwqAgIlx0VGhlIGZv bGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbDpcbiIKPj4gK8KgwqDCoMKgwqDCoMKgICJc dFstcyA8c2FtcGxlcz5dwqDCoMKgwqDCoMKgIHJlZnJlc2ggcGVyaW9kIGluIG1zIChkZWZhdWx0 ICV1bXMpXG4iCj4+ICvCoMKgwqDCoMKgwqDCoCAiXHRbLWhdwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgc2hvdyB0aGlzIGhlbHAgdGV4dFxuIgo+PiArwqDCoMKgwqDCoMKgwqAgIlxu IiwKPj4gK8KgwqDCoMKgwqDCoMKgIGFwcG5hbWUsIERFRkFVTFRfUEVSSU9EX01TKTsKPj4gwqAg fQo+PiDCoCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4+IMKgIHsKPj4gLcKgwqDC oCB1aW50MzJfdCBkZXZpZDsKPj4gLcKgwqDCoCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldjsK Pj4gLcKgwqDCoCBzdHJ1Y3QgcmluZyByZW5kZXJfcmluZyA9IHsKPj4gLcKgwqDCoMKgwqDCoMKg IC5uYW1lID0gInJlbmRlciIsCj4+IC3CoMKgwqDCoMKgwqDCoCAubW1pbyA9IDB4MjAzMCwKPj4g LcKgwqDCoCB9LCBic2RfcmluZyA9IHsKPj4gLcKgwqDCoMKgwqDCoMKgIC5uYW1lID0gImJpdHN0 cmVhbSIsCj4+IC3CoMKgwqDCoMKgwqDCoCAubW1pbyA9IDB4NDAzMCwKPj4gLcKgwqDCoCB9LCBi c2Q2X3JpbmcgPSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCAubmFtZSA9ICJiaXRzdHJlYW0iLAo+PiAt wqDCoMKgwqDCoMKgwqAgLm1taW8gPSAweDEyMDMwLAo+PiAtwqDCoMKgIH0sIGJsdF9yaW5nID0g ewo+PiAtwqDCoMKgwqDCoMKgwqAgLm5hbWUgPSAiYmxpdHRlciIsCj4+IC3CoMKgwqDCoMKgwqDC oCAubW1pbyA9IDB4MjIwMzAsCj4+IC3CoMKgwqAgfTsKPj4gLcKgwqDCoCBpbnQgaSwgY2g7Cj4+ IC3CoMKgwqAgaW50IHNhbXBsZXNfcGVyX3NlYyA9IFNBTVBMRVNfUEVSX1NFQzsKPj4gLcKgwqDC oCBGSUxFICpvdXRwdXQgPSBOVUxMOwo+PiAtwqDCoMKgIGRvdWJsZSBlbGFwc2VkX3RpbWU9MDsK Pj4gLcKgwqDCoCBpbnQgcHJpbnRfaGVhZGVycz0xOwo+PiAtwqDCoMKgIHBpZF90IGNoaWxkX3Bp ZD0tMTsKPj4gLcKgwqDCoCBpbnQgY2hpbGRfc3RhdDsKPj4gLcKgwqDCoCBjaGFyICpjbWQ9TlVM TDsKPj4gLcKgwqDCoCBpbnQgaW50ZXJhY3RpdmU9MTsKPj4gLQo+PiAtwqDCoMKgIC8qIFBhcnNl IG9wdGlvbnM/ICovCj4+IC3CoMKgwqAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAi czpvOmU6aCIpKSAhPSAtMSkgewo+PiArwqDCoMKgIHVuc2lnbmVkIGludCBwZXJpb2RfdXMgPSBE RUZBVUxUX1BFUklPRF9NUyAqIDEwMDA7Cj4+ICvCoMKgwqAgaW50IGNvbl93ID0gLTEsIGNvbl9o ID0gLTE7Cj4+ICvCoMKgwqAgc3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7Cj4+ICvCoMKgwqAgdW5z aWduZWQgaW50IGk7Cj4+ICvCoMKgwqAgaW50IHJldCwgY2g7Cj4+ICsKPj4gK8KgwqDCoCAvKiBQ YXJzZSBvcHRpb25zICovCj4+ICvCoMKgwqAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2 LCAiczpoIikpICE9IC0xKSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBzd2l0Y2ggKGNoKSB7Cj4+ IC3CoMKgwqDCoMKgwqDCoCBjYXNlICdlJzogY21kID0gc3RyZHVwKG9wdGFyZyk7Cj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiAtwqDCoMKgwqDCoMKgwqAgY2FzZSAncyc6IHNh bXBsZXNfcGVyX3NlYyA9IGF0b2kob3B0YXJnKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKHNhbXBsZXNfcGVyX3NlYyA8IDEwMCkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHNhbXBsZXMgcGVyIHNlY29uZCBtdXN0IGJl ID49IAo+PiAxMDBcbiIpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGV4aXQo MSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgYnJlYWs7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjYXNlICdvJzoKPj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgKCFzdHJjbXAob3B0YXJnLCAiLSIpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogUnVubmluZyBpbiBub24taW50ZXJhY3RpdmUgbW9kZSAqLwo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludGVyYWN0aXZlID0gMDsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvdXRwdXQgPSBzdGRvdXQ7Cj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZWxzZQo+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG91dHB1dCA9IGZvcGVuKG9wdGFyZywgInciKTsKPj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFvdXRwdXQpCj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwZXJyb3IoImZvcGVu Iik7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXhpdCgxKTsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqAgY2FzZSAncyc6Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHBlcmlvZF91cyA9IGF0b2kob3B0YXJnKSAqIDEwMDA7Cj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgY2Fz ZSAnaCc6Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVzYWdlKGFyZ3ZbMF0pOwo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleGl0KDApOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBicmVhazsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGRlZmF1bHQ6Cj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBmbGFnICVjIVxuIiwgKGNoYXIp b3B0b3B0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnByaW50ZihzdGRlcnIsICJJbnZh bGlkIG9wdGlvbiAlYyFcbiIsIChjaGFyKW9wdG9wdCk7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHVzYWdlKGFyZ3ZbMF0pOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleGl0 KDEpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gwqDCoMKgwqDCoMKgwqDC oMKgIH0KPj4gwqDCoMKgwqDCoCB9Cj4+IC3CoMKgwqAgcGNpX2RldiA9IGludGVsX2dldF9wY2lf ZGV2aWNlKCk7Cj4+IC3CoMKgwqAgZGV2aWQgPSBwY2lfZGV2LT5kZXZpY2VfaWQ7Cj4+IC3CoMKg wqAgaW50ZWxfbW1pb191c2VfcGNpX2JhcihwY2lfZGV2KTsKPj4gLcKgwqDCoCBpbml0X2luc3Rk b25lX2RlZmluaXRpb25zKGRldmlkKTsKPj4gLQo+PiAtwqDCoMKgIC8qIERvIHdlIGhhdmUgYSBj b21tYW5kIHRvIHJ1bj8gKi8KPj4gLcKgwqDCoCBpZiAoY21kICE9IE5VTEwpIHsKPj4gLcKgwqDC oMKgwqDCoMKgIGlmIChvdXRwdXQpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnByaW50 ZihvdXRwdXQsICIjIFByb2ZpbGluZzogJXNcbiIsIGNtZCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGZmbHVzaChvdXRwdXQpOwo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgwqDC oMKgwqAgY2hpbGRfcGlkID0gZm9yaygpOwo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGNoaWxkX3Bp ZCA8IDApIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVycm9yKCJmb3JrIik7Cj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGV4aXQoMSk7Cj4+IC3CoMKgwqDCoMKgwqDCoCB9Cj4+IC3C oMKgwqDCoMKgwqDCoCBlbHNlIGlmIChjaGlsZF9waWQgPT0gMCkgewo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpbnQgcmVzOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXMgPSBzeXN0 ZW0oY21kKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJlcyA8IDApCj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVycm9yKCJydW5uaW5nIGNvbW1hbmQiKTsKPj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKG91dHB1dCkgewo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGZmbHVzaChvdXRwdXQpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGZwcmludGYob3V0cHV0LCAiIyAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIs IGNtZCwgCj4+IHJlcyk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmZsdXNo KG91dHB1dCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZnJlZShjbWQpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleGl0KDApOwo+ PiAtwqDCoMKgwqDCoMKgwqAgfSBlbHNlIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJl ZShjbWQpOwo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgIGVuZ2luZXMgPSBkaXNjb3Zl cl9lbmdpbmVzKCk7Cj4+ICvCoMKgwqAgaWYgKCFlbmdpbmVzKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oCBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBkZXRlY3QgZW5naW5lcyFcbiIpOwo+PiArwqDC oMKgwqDCoMKgwqAgcmV0dXJuIDE7Cj4+IMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBudW1faW5zdGRvbmVfYml0czsgaSsrKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCB0b3Bf Yml0c1tpXS5iaXQgPSAmaW5zdGRvbmVfYml0c1tpXTsKPj4gLcKgwqDCoMKgwqDCoMKgIHRvcF9i aXRzW2ldLmNvdW50ID0gMDsKPj4gLcKgwqDCoMKgwqDCoMKgIHRvcF9iaXRzX3NvcnRlZFtpXSA9 ICZ0b3BfYml0c1tpXTsKPj4gK8KgwqDCoCByZXQgPSBwbXVfaW5pdChlbmdpbmVzKTsKPj4gK8Kg wqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBmcHJpbnRmKHN0ZGVyciwgIkZhaWxl ZCB0byBpbml0aWFsaXplIFBNVSFcbiIpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDE7Cj4+ IMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgIC8qIEdyYWIgYWNjZXNzIHRvIHRoZSByZWdpc3RlcnMg Ki8KPj4gLcKgwqDCoCBpbnRlbF9yZWdpc3Rlcl9hY2Nlc3NfaW5pdChwY2lfZGV2LCAwLCAtMSk7 Cj4+ICvCoMKgwqAgcG11X3NhbXBsZShlbmdpbmVzKTsKPj4gLcKgwqDCoCByaW5nX2luaXQoJnJl bmRlcl9yaW5nKTsKPj4gLcKgwqDCoCBpZiAoSVNfR0VONChkZXZpZCkgfHwgSVNfR0VONShkZXZp ZCkpCj4+IC3CoMKgwqDCoMKgwqDCoCByaW5nX2luaXQoJmJzZF9yaW5nKTsKPj4gLcKgwqDCoCBp ZiAoSVNfR0VONihkZXZpZCkgfHwgSVNfR0VONyhkZXZpZCkpIHsKPj4gLcKgwqDCoMKgwqDCoMKg IHJpbmdfaW5pdCgmYnNkNl9yaW5nKTsKPj4gLcKgwqDCoMKgwqDCoMKgIHJpbmdfaW5pdCgmYmx0 X3JpbmcpOwo+PiAtwqDCoMKgIH0KPj4gK8KgwqDCoCBmb3IgKDs7KSB7Cj4+ICvCoMKgwqDCoMKg wqDCoCBkb3VibGUgdCwgZnJlcVsyXSwgaXJxLCByYzYsIHBvd2VyOwo+PiArwqDCoMKgwqDCoMKg wqAgc3RydWN0IHdpbnNpemUgd3M7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpbnQgbGluZXMgPSAwOwo+ PiAtwqDCoMKgIC8qIEluaXRpYWxpemUgR1BVIHN0YXRzICovCj4+IC3CoMKgwqAgaWYgKEhBU19T VEFUU19SRUdTKGRldmlkKSkgewo+PiAtwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IFNU QVRTX0NPVU5UOyBpKyspIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDMyX3Qgc3Rh dHNfaGlnaCwgc3RhdHNfbG93LCBzdGF0c19oaWdoXzI7Cj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBV cGRhdGUgdGVybWluYWwgc2l6ZS4gKi8KPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChpb2N0bCgwLCBU SU9DR1dJTlNaLCAmd3MpICE9IC0xKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbl93 ID0gd3Mud3NfY29sOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25faCA9IHdzLndzX3Jv dzsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZG8gewo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXRzX2hpZ2ggPSBJTlJFRyhzdGF0 c19yZWdzW2ldICsgNCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdHNf bG93ID0gSU5SRUcoc3RhdHNfcmVnc1tpXSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3RhdHNfaGlnaF8yID0gSU5SRUcoc3RhdHNfcmVnc1tpXSArIDQpOwo+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBwbXVfc2FtcGxlKGVuZ2luZXMpOwo+PiArwqDCoMKgwqDCoMKgwqAg dCA9IChkb3VibGUpKGVuZ2luZXMtPnRzLmN1ciAtIGVuZ2luZXMtPnRzLnByZXYpIC8gMWU5Owo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsYXN0X3N0YXRzW2ldID0gKHVpbnQ2NF90KXN0YXRz X2hpZ2ggPDwgMzIgfAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXRzX2xv dzsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoCBw cmludGYoIlwwMzNbSFwwMzNbSiIpOwo+PiAtwqDCoMKgIGZvciAoOzspIHsKPj4gLcKgwqDCoMKg wqDCoMKgIGludCBqOwo+PiAtwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBsb25nIHQxLCB0 aSwgdGYsIHQyOwo+PiAtwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBsb25nIGRlZl9zbGVl cCA9IDEwMDAwMDAgLyBzYW1wbGVzX3Blcl9zZWM7Cj4+IC3CoMKgwqDCoMKgwqDCoCB1bnNpZ25l ZCBsb25nIGxvbmcgbGFzdF9zYW1wbGVzX3Blcl9zZWMgPSBzYW1wbGVzX3Blcl9zZWM7Cj4+IC3C oMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBzaG9ydCBpbnQgbWF4X2xpbmVzOwo+PiAtwqDCoMKgwqDC oMKgwqAgc3RydWN0IHdpbnNpemUgd3M7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjaGFyIGNsZWFyX3Nj cmVlbltdID0gezB4MWIsICdbJywgJ0gnLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgMHgxYiwgJ1snLCAnSicsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAweDB9Owo+PiAtwqDCoMKgwqDCoMKgwqAgaW50IHBl cmNlbnQ7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpbnQgbGVuOwo+PiAtCj4+IC3CoMKgwqDCoMKgwqDC oCB0MSA9IGdldHRpbWUoKTsKPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAgcmluZ19yZXNldCgmcmVu ZGVyX3JpbmcpOwo+PiAtwqDCoMKgwqDCoMKgwqAgcmluZ19yZXNldCgmYnNkX3JpbmcpOwo+PiAt wqDCoMKgwqDCoMKgwqAgcmluZ19yZXNldCgmYnNkNl9yaW5nKTsKPj4gLcKgwqDCoMKgwqDCoMKg IHJpbmdfcmVzZXQoJmJsdF9yaW5nKTsKPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAgZm9yIChpID0g MDsgaSA8IHNhbXBsZXNfcGVyX3NlYzsgaSsrKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGxvbmcgbG9uZyBpbnRlcnZhbDsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdGkgPSBnZXR0 aW1lKCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChJU185NjUoZGV2aWQpKSB7Cj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5zdGRvbmUgPSBJTlJFRyhJTlNURE9O RV9JOTY1KTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnN0ZG9uZTEgPSBJ TlJFRyhJTlNURE9ORV8xKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSBlbHNlCj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5zdGRvbmUgPSBJTlJFRyhJTlNURE9ORSk7 Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChqID0gMDsgaiA8IG51bV9pbnN0 ZG9uZV9iaXRzOyBqKyspCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdXBkYXRl X2lkbGVfYml0KCZ0b3BfYml0c1tqXSk7Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmluZ19zYW1wbGUoJnJlbmRlcl9yaW5nKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmlu Z19zYW1wbGUoJmJzZF9yaW5nKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZ19zYW1w bGUoJmJzZDZfcmluZyk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJpbmdfc2FtcGxlKCZi bHRfcmluZyk7Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdGYgPSBnZXR0aW1lKCk7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh0ZiAtIHQxID49IDEwMDAwMDApIHsKPj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBXZSBhcmUgb3V0IG9mIHN5bmMsIGJh aWwgb3V0ICovCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGFzdF9zYW1wbGVz X3Blcl9zZWMgPSBpKzE7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aW50ZXJ2YWwgPSBkZWZfc2xlZXAgLSAodGYgLSB0aSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIChpbnRlcnZhbCA+IDApCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dXNsZWVwKGludGVydmFsKTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgwqDCoMKg IGZyZXFbMF0gPSBwbXVfY2FsYygmZW5naW5lcy0+ZnJlcV9yZXEudmFsLCAxLjAsIHQsIDEpOwo+ PiArwqDCoMKgwqDCoMKgwqAgZnJlcVsxXSA9IHBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX2FjdC52 YWwsIDEuMCwgdCwgMSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpcnEgPSBwbXVfY2FsYygmZW5naW5l cy0+aXJxLnZhbCwgMS4wLCB0LCAxKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJjNiA9IHBtdV9jYWxj KCZlbmdpbmVzLT5yYzYudmFsLCAxZTksIHQsIDEwMCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwb3dl ciA9IHBtdV9jYWxjKCZlbmdpbmVzLT5yYXBsLnZhbCwgMS4wLCB0LAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZW5naW5lcy0+cmFwbF9zY2FsZSk7Cj4+IC3CoMKgwqDCoMKg wqDCoCBpZiAoSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGZvciAoaSA9IDA7IGkgPCBTVEFUU19DT1VOVDsgaSsrKSB7Cj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdWludDMyX3Qgc3RhdHNfaGlnaCwgc3RhdHNfbG93LCBzdGF0c19o aWdoXzI7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwcmludGYoImludGVsLWdwdS10b3AgLSAlNC4wZi8l NC4wZiBNSHo7wqAgJTMuMGYlJSBSQzY7IAo+PiAlNi4wZm1XOyAlOC4wZiBpcnFzL3NcbiIsCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZyZXFbMF0sIGZyZXFbMV0sIHJjNiwgcG93 ZXIsIGlycSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBsaW5lcysrOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGRvIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0YXRzX2hpZ2ggPSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Cj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdGF0c19sb3cgPSBJTlJFRyhzdGF0c19y ZWdzW2ldKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXRz X2hpZ2hfMiA9IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7Cj4+ICvC oMKgwqDCoMKgwqDCoCBwcmludGYoIlxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCBsaW5lcysrOwo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXRzW2ldID0gKHVpbnQ2NF90KXN0 YXRzX2hpZ2ggPDwgMzIgfAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgc3RhdHNfbG93Owo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IC3CoMKgwqDCoMKg wqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgZW5naW5lcy0+bnVtX2Vu Z2luZXMgJiYgbGluZXMgPCBjb25faDsgaSsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHN0cnVjdCBlbmdpbmUgKmVuZ2luZSA9IGVuZ2luZV9wdHIoZW5naW5lcywgaSk7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBtYXhfdyA9IGNvbl93IC0gMTsKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IGxlbjsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZG91YmxlIHZhbFsyXTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hhciBi dWZbMTI4XTsKPj4gLcKgwqDCoMKgwqDCoMKgIHFzb3J0KHRvcF9iaXRzX3NvcnRlZCwgbnVtX2lu c3Rkb25lX2JpdHMsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2Yoc3RydWN0 IHRvcF9iaXQgKiksIHRvcF9iaXRzX3NvcnQpOwo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoCAvKiBM aW1pdCB0aGUgbnVtYmVyIG9mIGxpbmVzIHByaW50ZWQgdG8gdGhlIHRlcm1pbmFsIGhlaWdodCAK Pj4gc28gdGhlCj4+IC3CoMKgwqDCoMKgwqDCoMKgICogbW9zdCBpbXBvcnRhbnQgaW5mbyAoYXQg dGhlIHRvcCkgd2lsbCBzdGF5IG9uIHNjcmVlbi4gKi8KPj4gLcKgwqDCoMKgwqDCoMKgIG1heF9s aW5lcyA9IC0xOwo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGlvY3RsKDAsIFRJT0NHV0lOU1osICZ3 cykgIT0gLTEpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1heF9saW5lcyA9IHdzLndzX3Jv dyAtIDY7IC8qIGV4Y2x1ZGUgaGVhZGVyIGxpbmVzICovCj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAo bWF4X2xpbmVzID49IG51bV9pbnN0ZG9uZV9iaXRzKQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBtYXhfbGluZXMgPSBudW1faW5zdGRvbmVfYml0czsKPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAg dDIgPSBnZXR0aW1lKCk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBlbGFwc2VkX3RpbWUgKz0gKHQyIC0g dDEpIC8gMTAwMDAwMC4wOwo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoaW50ZXJhY3RpdmUp IHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCIlcyIsIGNsZWFyX3NjcmVlbik7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByaW50X2Nsb2NrX2luZm8ocGNpX2Rldik7Cj4+ IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZ19wcmludCgmcmVuZGVyX3JpbmcsIGxh c3Rfc2FtcGxlc19wZXJfc2VjKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZ19wcmlu dCgmYnNkX3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJfc2VjKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmluZ19wcmludCgmYnNkNl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYyk7Cj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJpbmdfcHJpbnQoJmJsdF9yaW5nLCBsYXN0X3NhbXBsZXNf cGVyX3NlYyk7Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCJcbiUzMHPC oCAlc1xuIiwgInRhc2siLCAicGVyY2VudCBidXN5Iik7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGZvciAoaSA9IDA7IGkgPCBtYXhfbGluZXM7IGkrKykgewo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGlmICh0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50ID4gMCkgewo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVyY2VudCA9ICh0b3BfYml0 c19zb3J0ZWRbaV0tPmNvdW50ICogMTAwKSAvCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxhc3Rfc2FtcGxlc19wZXJfc2VjOwo+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGVuID0gcHJpbnRmKCIlMzBzOiAlM2QlJTog IiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHRvcF9iaXRzX3NvcnRlZFtpXS0+Yml0LT5uYW1lLAo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVyY2VudCk7Cj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcmludF9wZXJjZW50YWdlX2Jh ciAocGVyY2VudCwgbGVuKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVs c2Ugewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCIl KnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQsICIiKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoaSA8 IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdTKGRldmlkKSkgewo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCIlMTNzOiAlbGx1ICglbGxkL3NlYyki LAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBzdGF0c19yZWdfbmFtZXNbaV0sCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIChsb25nIGxvbmcpc3RhdHNbaV0sCj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChsb25nIGxvbmcpKHN0 YXRzW2ldIC0gbGFzdF9zdGF0c1tpXSkpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgbGFzdF9zdGF0c1tpXSA9IHN0YXRzW2ldOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpZiAoIXRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQpCj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBwcmludGYoIlxuIik7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKg wqDCoMKgIH0KPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChvdXRwdXQpIHsKPj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgLyogUHJpbnQgaGVhZGVycyBmb3IgY29sdW1ucyBhdCBmaXJzdCBydW4gKi8K Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHByaW50X2hlYWRlcnMpIHsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmcHJpbnRmKG91dHB1dCwgIiMgdGltZVx0Iik7Cj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZ19wcmludF9oZWFkZXIob3V0cHV0 LCAmcmVuZGVyX3JpbmcpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJpbmdf cHJpbnRfaGVhZGVyKG91dHB1dCwgJmJzZF9yaW5nKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByaW5nX3ByaW50X2hlYWRlcihvdXRwdXQsICZic2Q2X3JpbmcpOwo+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJs dF9yaW5nKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmb3IgKGkgPSAwOyBp IDwgTUFYX05VTV9UT1BfQklUUzsgaSsrKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAoaSA8IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdTKGRldmlk KSkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm cHJpbnRmKG91dHB1dCwgIiUuNnNcdCIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdHNfcmVnX25hbWVzW2ldCj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICghdG9wX2JpdHNbaV0uY291 bnQpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNv bnRpbnVlOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmcHJpbnRmKG91dHB1dCwgIlxuIik7Cj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJpbnRfaGVhZGVycyA9IDA7Cj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBQcmludCBz dGF0aXN0aWNzICovCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZwcmludGYob3V0cHV0LCAi JS4yZlx0IiwgZWxhcHNlZF90aW1lKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZ19s b2coJnJlbmRlcl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmluZ19sb2coJmJzZF9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3Nl Yywgb3V0cHV0KTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmluZ19sb2coJmJzZDZfcmlu ZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJpbmdfbG9nKCZibHRfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Cj4+ IC0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVE9Q X0JJVFM7IGkrKykgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChpIDwg U1RBVFNfQ09VTlQgJiYgSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Cj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmcHJpbnRmKG91dHB1dCwgIiUiUFJJdTY0Ilx0IiwK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg c3RhdHNbaV0gLSBsYXN0X3N0YXRzW2ldKTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tpXTsKPj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBpZiAoIXRvcF9iaXRzW2ldLmNvdW50KQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmcHJpbnRmKG91dHB1dCwgIlxuIik7Cj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZmbHVzaChvdXRwdXQpOwo+PiAtwqDCoMKgwqDCoMKg wqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWxbMF0gPSBwbXVfY2FsYygmZW5naW5l LT53YWl0LnZhbCwgMWU5LCB0LCAxMDApOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWxb MV0gPSBwbXVfY2FsYygmZW5naW5lLT5zZW1hLnZhbCwgMWU5LCB0LCAxMDApOwo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIiU2LjJmJSUgd2FpdCwg JTYuMmYlJSBzZW1hIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHZhbFswXSwgdmFsWzFdKTsKPj4gLcKgwqDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkg PCBudW1faW5zdGRvbmVfYml0czsgaSsrKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRv cF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgPSAwOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2 YWxbMF0gPSBwbXVfY2FsYygmZW5naW5lLT5idXN5LnZhbCwgMWU5LCB0LCAxMDApOwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBsZW4gKz0gcHJpbnRmKCIlOHMgJTYuMmYlJSAiLAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVuZ2luZS0+bmFtZSwgdmFs WzBdKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJpbnRfcGVyY2VudGFnZV9iYXIodmFs WzBdLCBtYXhfdyAtIGxlbik7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChpIDwgU1RB VFNfQ09VTlQpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGFzdF9zdGF0c1tp XSA9IHN0YXRzW2ldOwo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBwcmludGYoIiVzXG4iLCBidWYpOwo+PiAtwqDCoMKgwqDCoMKgwqAgLyogQ2hlY2sgaWYg Y2hpbGQgaGFzIGdvbmUgKi8KPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChjaGlsZF9waWQgPiAwKSB7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCByZXM7Cj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGlmICgocmVzID0gd2FpdHBpZChjaGlsZF9waWQsICZjaGlsZF9zdGF0LCBXTk9IQU5H KSkgPT0gCj4+IC0xKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVycm9y KCJ3YWl0cGlkIik7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXhpdCgxKTsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAocmVzID09IDApCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChXSUZFWElURUQoY2hpbGRfc3RhdCkpCj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGxpbmVzKys7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IC3CoMKgwqAgfQo+ PiAtwqDCoMKgIGZjbG9zZShvdXRwdXQpOwo+PiArwqDCoMKgwqDCoMKgwqAgcHJpbnRmKCJcbiIp Owo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCB1c2xlZXAocGVyaW9kX3VzKTsKPj4gK8KgwqDCoCB9 Cj4+IC3CoMKgwqAgaW50ZWxfcmVnaXN0ZXJfYWNjZXNzX2ZpbmkoKTsKPj4gwqDCoMKgwqDCoCBy ZXR1cm4gMDsKPj4gwqAgfQo+PiBkaWZmIC0tZ2l0IGEvdG9vbHMvbWVzb24uYnVpbGQgYi90b29s cy9tZXNvbi5idWlsZAo+PiBpbmRleCBiZDJkMzEzZDUxNTYuLmE5MThlZWIwYmVmMSAxMDA2NDQK Pj4gLS0tIGEvdG9vbHMvbWVzb24uYnVpbGQKPj4gKysrIGIvdG9vbHMvbWVzb24uYnVpbGQKPj4g QEAgLTIzLDcgKzIzLDYgQEAgdG9vbHNfcHJvZ3MgPSBbCj4+IMKgwqDCoMKgwqAgJ2ludGVsX2dw dV9mcmVxdWVuY3knLAo+PiDCoMKgwqDCoMKgICdpbnRlbF9maXJtd2FyZV9kZWNvZGUnLAo+PiDC oMKgwqDCoMKgICdpbnRlbF9ncHVfdGltZScsCj4+IC3CoMKgwqAgJ2ludGVsX2dwdV90b3AnLAo+ PiDCoMKgwqDCoMKgICdpbnRlbF9ndHQnLAo+PiDCoMKgwqDCoMKgICdpbnRlbF9ndWNfbG9nZ2Vy JywKPj4gwqDCoMKgwqDCoCAnaW50ZWxfaW5mb2ZyYW1lcycsCj4+IEBAIC0xMTcsNiArMTE2LDEx IEBAIHNoYXJlZF9saWJyYXJ5KCdpbnRlbF9hdWJkdW1wJywgJ2F1YmR1bXAuYycsCj4+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBuYW1lX3ByZWZpeCA6ICcnLAo+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaW5zdGFsbCA6IHRydWUpCj4+ICtleGVjdXRhYmxlKCdpbnRlbF9ncHVfdG9wJywg J2ludGVsX2dwdV90b3AuYycsCj4+ICvCoMKgwqDCoMKgwqAgaW5zdGFsbCA6IHRydWUsCj4+ICvC oMKgwqDCoMKgwqAgaW5zdGFsbF9ycGF0aCA6IHJwYXRoZGlyLAo+PiArwqDCoMKgwqDCoMKgIGRl cGVuZGVuY2llcyA6IHRvb2xfZGVwcyArIFsgbGliX2lndF9wZXJmIF0pCj4+ICsKPj4gwqAgY29u Zl9kYXRhID0gY29uZmlndXJhdGlvbl9kYXRhKCkKPj4gwqAgY29uZl9kYXRhLnNldCgncHJlZml4 JywgcHJlZml4KQo+PiDCoCBjb25mX2RhdGEuc2V0KCdleGVjX3ByZWZpeCcsICcke3ByZWZpeH0n KQo+Pgo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Cj4gaWd0LWRldiBtYWlsaW5nIGxpc3QKPiBpZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRldgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZngg bWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK