From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) by sourceware.org (Postfix) with ESMTPS id E388F3858C52 for ; Tue, 17 Oct 2023 15:23:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E388F3858C52 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivai.ai Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivai.ai ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E388F3858C52 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=54.243.244.52 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697556218; cv=none; b=xpmhP1siGYBFquLE/C60DQwAEcMbc+bTQDKaKeza9QczdFdKm8tGWtt3C0emxXk3b5BoaHFy5E3Ky9eDLz0AvVp0UWpJkIdek62mwcfOYT06t8Fc0EB84JPycB/iJK2fnkFX7E3kvvx8QM9P4j+nR5flRmAaRF5Nd8pXfyPTNX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697556218; c=relaxed/simple; bh=kBO0mYw+pso0uIrLJ0fAZgrQq1Kmt5gonKD27N2m92A=; h=Date:From:To:Subject:Mime-Version:Message-ID; b=nbUIQtM9V1e4QDmnpv950LVySIleAMpzrKYrxnGiB1L0rd2CqTMfg6IWMNJiki7TsfH202QMJflBPNDIJDdd4fkTC5v1Vj/0wUnoNXa/o9evuUw43nZMOVGL6JMXtV5cxy4Q+amrPLguW6Q3qbLl7LiSqt8ZvpspddJ9nR9V7Tw= ARC-Authentication-Results: i=1; server2.sourceware.org X-QQ-mid: bizesmtp80t1697556201tr9glrsz Received: from TABLET-POE6JQHH ( [36.36.17.183]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 17 Oct 2023 23:23:20 +0800 (CST) X-QQ-SSF: 01400000000000G0V000000A0000000 X-QQ-FEAT: 3GqwhZhMvTvgA9baPTdH+OTMijBRUtqq7iCjIb14HuH2Mzziyx5jGJw/BsUBL QGgN527I4qc4HoaiHAGGsnn6EDZ5GfOlkd8EuvNrSoMO8FvFErwMy6ZpH6KqLj0iGF6GkW+ sDRJqHO86oM3Sa6SIjqh/CRHMs1uhcLwcIKzyVErX7J8TvrBUThl7Bv+TKAz0QRUj0CLA5e cvnNmXBxvcijkUipa3P3K0VFsdvjN6SXc2m7c+nHcP1rWjyRFiUSYK7ckfH9uH2ZsIgNwmX KhILjKCVKcsuzquTx4LC5JolLXtM49srDhIWi+PzqQbCbh4bABiL7sZu7kX7YyM/93S7aJ/ Ue42JXhVemNnPsPFi/2e9tqV3j5P25UsZwjsVGbpIRUXwKfdvuEDbI3aFAiMM0wTFYMOEsI RwBGbtQ3vRRLzggTtEmSLWH05owT1EqEcLdVlReS+ZhdJ9/Ty3M+Eg== X-QQ-GoodBg: 2 X-BIZMAIL-ID: 6792365851303235433 Date: Tue, 17 Oct 2023 23:23:21 +0800 From: =?GB2312?B?1tO+09Xc?= To: =?GB2312?B?tqHA1ruq?= , gcc-patches Cc: kito.cheng , rdapp.gcc , palmer , "Jeff Law" , =?GB2312?B?tqHA1ruq?= Subject: Re: [PATCH V2 01/14] RISC-V: P1: Refactor avl_info/vl_vtype_info/vector_insn_info References: <20231017113500.1160997-1-lehua.ding@rivai.ai>, <20231017113500.1160997-2-lehua.ding@rivai.ai> X-Priority: 3 X-GUID: DFF2D568-88E6-46BC-BAA1-1D13409934D0 X-Has-Attach: no X-Mailer: Foxmail 7.2.23.121[cn] Mime-Version: 1.0 Message-ID: <8FCF3E53AF273D59+2023101723232043014245@rivai.ai> Content-Type: multipart/alternative; boundary="----=_001_NextPart477021228527_=----" X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:rivai.ai:qybglogicsvrgz:qybglogicsvrgz7a-one-0 X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00,CHARSET_FARAWAY_HEADER,GIT_PATCH_0,HTML_MESSAGE,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SCC_5_SHORT_WORD_LINES,SPF_HELO_PASS,SPF_PASS,TXREP,T_KAM_HTML_FONT_INVALID autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. ------=_001_NextPart477021228527_=---- Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 KyAgYm9vbCBoYXNfcmVnX3ZsICgpIGNvbnN0CisgIHsKKyAgICBnY2NfYXNz ZXJ0ICghbV92bCB8fCBSRUdfUCAobV92bCkpOworICAgIHJldHVybiBtX3Zs ICYmIFJFR19QIChtX3ZsKTsKKyAgfQ0KQWRkIGNvbW1lbnQgYmVmb3JlIHRo ZSBhc3NlcnRpb246DQovKiBUaGUgVkwgb3BlcmFuZCBjYW4gb25seSBiZSBl aXRoZXIgYSBOVUxMX1JUWCBvciBhIHJlZ2lzdGVyLiAgICovDQpSZW5hbWUg aGFzX3JlZ192bCBpbnRvIGhhc192bCBzaW5jZSBJIGRvbid0IHRoaW5rIHdl IG5lZWQgdG8gc3BlY2lmeSB0aGUgJ3JlZycgZm9yIFZMIG9wZXJhbmQuDQoN Cg0KDQpqdXpoZS56aG9uZ0ByaXZhaS5haQ0KIA0KRnJvbTogTGVodWEgRGlu Zw0KRGF0ZTogMjAyMy0xMC0xNyAxOTozNA0KVG86IGdjYy1wYXRjaGVzDQpD QzoganV6aGUuemhvbmc7IGtpdG8uY2hlbmc7IHJkYXBwLmdjYzsgcGFsbWVy OyBqZWZmcmV5YWxhdzsgbGVodWEuZGluZw0KU3ViamVjdDogW1BBVENIIFYy IDAxLzE0XSBSSVNDLVY6IFAxOiBSZWZhY3RvciBhdmxfaW5mby92bF92dHlw ZV9pbmZvL3ZlY3Rvcl9pbnNuX2luZm8NClRoaXMgc3ViLXBhdGNoIGNvbWJp bmUgYXZsX2luZm8vdmxfdnR5cGVfaW5mby92ZWN0b3JfaW5zbl9pbmZvIHRv DQphIHNpbmdsZSBjbGFzcyB2c2V0dmxfaW5mby4NCiANCmdjYy9DaGFuZ2VM b2c6DQogDQoqIGNvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwuY2MgKGF2bF9p bmZvOjphdmxfaW5mbyk6IFJlbW92ZWQuDQooYXZsX2luZm86OnNpbmdsZV9z b3VyY2VfZXF1YWxfcCk6IERpdHRvLg0KKGF2bF9pbmZvOjptdWx0aXBsZV9z b3VyY2VfZXF1YWxfcCk6IERpdHRvLg0KKGF2bF9pbmZvOjpvcGVyYXRvcj0p OiBEaXR0by4NCihhdmxfaW5mbzo6b3BlcmF0b3I9PSk6IERpdHRvLg0KKGF2 bF9pbmZvOjpvcGVyYXRvciE9KTogRGl0dG8uDQooYXZsX2luZm86Omhhc19u b25femVyb19hdmwpOiBEaXR0by4NCih2bF92dHlwZV9pbmZvOjp2bF92dHlw ZV9pbmZvKTogRGl0dG8uDQoodmxfdnR5cGVfaW5mbzo6b3BlcmF0b3I9PSk6 IERpdHRvLg0KKHZsX3Z0eXBlX2luZm86Om9wZXJhdG9yIT0pOiBEaXR0by4N Cih2bF92dHlwZV9pbmZvOjpzYW1lX2F2bF9wKTogRGl0dG8uDQoodmxfdnR5 cGVfaW5mbzo6c2FtZV92dHlwZV9wKTogRGl0dG8uDQooZW51bSBkZW1hbmRf ZmxhZ3MpOiBOZXcgZW51bS4NCih2bF92dHlwZV9pbmZvOjpzYW1lX3ZsbWF4 X3ApOiBSZW1vdmVkLg0KKHZlY3Rvcl9pbnNuX2luZm86Om9wZXJhdG9yPj0p OiBEaXR0by4NCihlbnVtIGNsYXNzKTogTmV3IGRlbWFuZCB0eXBlcy4NCih2 ZWN0b3JfaW5zbl9pbmZvOjpvcGVyYXRvcj09KTogRGl0dG8uDQoodmVjdG9y X2luc25faW5mbzo6cGFyc2VfaW5zbik6IERpdHRvLg0KKGNsYXNzIHZzZXR2 bF9pbmZvKTogTmV3IGNsYXNzLg0KKHZlY3Rvcl9pbnNuX2luZm86OmNvbXBh dGlibGVfcCk6IFJlbW92ZWQuDQoodmVjdG9yX2luc25faW5mbzo6c2tpcF9h dmxfY29tcGF0aWJsZV9wKTogRGl0dG8uDQoodmVjdG9yX2luc25faW5mbzo6 Y29tcGF0aWJsZV9hdmxfcCk6IERpdHRvLg0KKHZlY3Rvcl9pbnNuX2luZm86 OmNvbXBhdGlibGVfdnR5cGVfcCk6IERpdHRvLg0KKHZlY3Rvcl9pbnNuX2lu Zm86OmF2YWlsYWJsZV9wKTogRGl0dG8uDQoodmVjdG9yX2luc25faW5mbzo6 ZnVzZV9hdmwpOiBEaXR0by4NCih2ZWN0b3JfaW5zbl9pbmZvOjpmdXNlX3Nl d19sbXVsKTogRGl0dG8uDQoodmVjdG9yX2luc25faW5mbzo6ZnVzZV90YWls X3BvbGljeSk6IERpdHRvLg0KKHZlY3Rvcl9pbnNuX2luZm86OmZ1c2VfbWFz a19wb2xpY3kpOiBEaXR0by4NCih2ZWN0b3JfaW5zbl9pbmZvOjpsb2NhbF9t ZXJnZSk6IERpdHRvLg0KKHZlY3Rvcl9pbnNuX2luZm86Omdsb2JhbF9tZXJn ZSk6IERpdHRvLg0KKHZlY3Rvcl9pbnNuX2luZm86OmdldF9hdmxfb3Jfdmxf cmVnKTogRGl0dG8uDQoodmVjdG9yX2luc25faW5mbzo6dXBkYXRlX2ZhdWx0 X2ZpcnN0X2xvYWRfYXZsKTogIERpdHRvLg0KKHZsbXVsX3RvX3N0cik6IERp dHRvLg0KKHBvbGljeV90b19zdHIpOiBEaXR0by4NCih2ZWN0b3JfaW5zbl9p bmZvOjpkdW1wKTogRGl0dG8uDQoqIGNvbmZpZy9yaXNjdi9yaXNjdi12c2V0 dmwuaCAoY2xhc3MgYXZsX2luZm8pOiBEaXR0by4NCihzdHJ1Y3QgdmxfdnR5 cGVfaW5mbyk6IERpdHRvLg0KKGNsYXNzIHZlY3Rvcl9pbnNuX2luZm8pOiBE aXR0by4NCiANCi0tLQ0KZ2NjL2NvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwu Y2MgfCAxMzE1ICsrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLQ0KZ2Nj L2NvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwuaCAgfCAgMjYxIC0tLS0tLQ0K MiBmaWxlcyBjaGFuZ2VkLCA1MTUgaW5zZXJ0aW9ucygrKSwgMTA2MSBkZWxl dGlvbnMoLSkNCiANCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL3Jpc2N2L3Jp c2N2LXZzZXR2bC5jYyBiL2djYy9jb25maWcvcmlzY3YvcmlzY3YtdnNldHZs LmNjDQppbmRleCA0YjA2ZDkzZTdmOS4uNzliYTg0NjY1NTYgMTAwNjQ0DQot LS0gYS9nY2MvY29uZmlnL3Jpc2N2L3Jpc2N2LXZzZXR2bC5jYw0KKysrIGIv Z2NjL2NvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwuY2MNCkBAIC0xNTgxLDgy NyArMTU4MSw1NDIgQEAgdnNldHZsX2RvbWluYXRlZF9ieV9wIChjb25zdCBi YXNpY19ibG9jayBjZmdfYmIsDQogICByZXR1cm4gdHJ1ZTsNCn0NCiANCi1h dmxfaW5mbzo6YXZsX2luZm8gKGNvbnN0IGF2bF9pbmZvICZvdGhlcikNCi17 DQotICBtX3ZhbHVlID0gb3RoZXIuZ2V0X3ZhbHVlICgpOw0KLSAgbV9zb3Vy Y2UgPSBvdGhlci5nZXRfc291cmNlICgpOw0KLX0NCi0NCi1hdmxfaW5mbzo6 YXZsX2luZm8gKHJ0eCB2YWx1ZV9pbiwgc2V0X2luZm8gKnNvdXJjZV9pbikN Ci0gIDogbV92YWx1ZSAodmFsdWVfaW4pLCBtX3NvdXJjZSAoc291cmNlX2lu KQ0KLXt9DQotDQotYm9vbA0KLWF2bF9pbmZvOjpzaW5nbGVfc291cmNlX2Vx dWFsX3AgKGNvbnN0IGF2bF9pbmZvICZvdGhlcikgY29uc3QNCi17DQotICBz ZXRfaW5mbyAqc2V0MSA9IG1fc291cmNlOw0KLSAgc2V0X2luZm8gKnNldDIg PSBvdGhlci5nZXRfc291cmNlICgpOw0KLSAgaW5zbl9pbmZvICppbnNuMSA9 IGV4dHJhY3Rfc2luZ2xlX3NvdXJjZSAoc2V0MSk7DQotICBpbnNuX2luZm8g Kmluc24yID0gZXh0cmFjdF9zaW5nbGVfc291cmNlIChzZXQyKTsNCi0gIGlm ICghaW5zbjEgfHwgIWluc24yKQ0KLSAgICByZXR1cm4gZmFsc2U7DQotICBy ZXR1cm4gc291cmNlX2VxdWFsX3AgKGluc24xLCBpbnNuMik7DQotfQ0KLQ0K LWJvb2wNCi1hdmxfaW5mbzo6bXVsdGlwbGVfc291cmNlX2VxdWFsX3AgKGNv bnN0IGF2bF9pbmZvICZvdGhlcikgY29uc3QNCi17DQotICAvKiBXaGVuIHRo ZSBkZWYgaW5mbyBpcyBzYW1lIGluIFJUTF9TU0EgbmFtZXNwYWNlLCBpdCdz IHNhZmUNCi0gICAgIHRvIGNvbnNpZGVyIHRoZXkgYXJlIGF2bCBjb21wYXRp YmxlLiAgKi8NCi0gIGlmIChtX3NvdXJjZSA9PSBvdGhlci5nZXRfc291cmNl ICgpKQ0KLSAgICByZXR1cm4gdHJ1ZTsNCi0NCi0gIC8qIFdlIG9ubHkgY29u c2lkZXIgaGFuZGxlIFBISSBub2RlLiAgKi8NCi0gIGlmICghbV9zb3VyY2Ut Pmluc24gKCktPmlzX3BoaSAoKSB8fCAhb3RoZXIuZ2V0X3NvdXJjZSAoKS0+ aW5zbiAoKS0+aXNfcGhpICgpKQ0KLSAgICByZXR1cm4gZmFsc2U7DQotDQot ICBwaGlfaW5mbyAqcGhpMSA9IGFzX2E8cGhpX2luZm8gKj4gKG1fc291cmNl KTsNCi0gIHBoaV9pbmZvICpwaGkyID0gYXNfYTxwaGlfaW5mbyAqPiAob3Ro ZXIuZ2V0X3NvdXJjZSAoKSk7DQotDQotICBpZiAocGhpMS0+aXNfZGVnZW5l cmF0ZSAoKSAmJiBwaGkyLT5pc19kZWdlbmVyYXRlICgpKQ0KLSAgICB7DQot ICAgICAgLyogRGVnZW5lcmF0ZSBQSEkgbWVhbnMgdGhlIFBISSBub2RlIG9u bHkgaGF2ZSBvbmUgaW5wdXQuICAqLw0KLQ0KLSAgICAgIC8qIElmIGJvdGgg UEhJIG5vZGVzIGhhdmUgdGhlIHNhbWUgc2luZ2xlIGlucHV0IGluIHVzZSBs aXN0Lg0KLSBXZSBjb25zaWRlciB0aGV5IGFyZSBBVkwgY29tcGF0aWJsZS4g ICovDQotICAgICAgaWYgKHBoaTEtPmlucHV0X3ZhbHVlICgwKSA9PSBwaGky LT5pbnB1dF92YWx1ZSAoMCkpDQotIHJldHVybiB0cnVlOw0KLSAgICB9DQot ICAvKiBUT0RPOiBXZSBjYW4gc3VwcG9ydCBtb3JlIG9wdGltaXphdGlvbiBj YXNlcyBpbiB0aGUgZnV0dXJlLiAgKi8NCi0gIHJldHVybiBmYWxzZTsNCi19 DQotDQotYXZsX2luZm8gJg0KLWF2bF9pbmZvOjpvcGVyYXRvcj0gKGNvbnN0 IGF2bF9pbmZvICZvdGhlcikNCi17DQotICBtX3ZhbHVlID0gb3RoZXIuZ2V0 X3ZhbHVlICgpOw0KLSAgbV9zb3VyY2UgPSBvdGhlci5nZXRfc291cmNlICgp Ow0KLSAgcmV0dXJuICp0aGlzOw0KLX0NCi0NCi1ib29sDQotYXZsX2luZm86 Om9wZXJhdG9yPT0gKGNvbnN0IGF2bF9pbmZvICZvdGhlcikgY29uc3QNCi17 DQotICBpZiAoIW1fdmFsdWUpDQotICAgIHJldHVybiAhb3RoZXIuZ2V0X3Zh bHVlICgpOw0KLSAgaWYgKCFvdGhlci5nZXRfdmFsdWUgKCkpDQotICAgIHJl dHVybiBmYWxzZTsNCi0NCi0gIGlmIChHRVRfQ09ERSAobV92YWx1ZSkgIT0g R0VUX0NPREUgKG90aGVyLmdldF92YWx1ZSAoKSkpDQotICAgIHJldHVybiBm YWxzZTsNCi0NCi0gIC8qIEhhbmRsZSBDT05TVF9JTlQgQVZMLiAgKi8NCi0g IGlmIChDT05TVF9JTlRfUCAobV92YWx1ZSkpDQotICAgIHJldHVybiBJTlRW QUwgKG1fdmFsdWUpID09IElOVFZBTCAob3RoZXIuZ2V0X3ZhbHVlICgpKTsN Ci0NCi0gIC8qIEhhbmRsZSBWTE1BWCBBVkwuICAqLw0KLSAgaWYgKHZsbWF4 X2F2bF9wIChtX3ZhbHVlKSkNCi0gICAgcmV0dXJuIHZsbWF4X2F2bF9wIChv dGhlci5nZXRfdmFsdWUgKCkpOw0KLSAgaWYgKHZsbWF4X2F2bF9wIChvdGhl ci5nZXRfdmFsdWUgKCkpKQ0KLSAgICByZXR1cm4gZmFsc2U7DQotDQotICAv KiBJZiBhbnkgc291cmNlIGlzIHVuZGVmIHZhbHVlLCB3ZSB0aGluayB0aGV5 IGFyZSBub3QgZXF1YWwuICAqLw0KLSAgaWYgKCFtX3NvdXJjZSB8fCAhb3Ro ZXIuZ2V0X3NvdXJjZSAoKSkNCi0gICAgcmV0dXJuIGZhbHNlOw0KLQ0KLSAg LyogSWYgYm90aCBzb3VyY2VzIGFyZSBzaW5nbGUgc291cmNlIChkZWZpbmVk IGJ5IGEgc2luZ2xlIHJlYWwgUlRMKQ0KLSAgICAgYW5kIHRoZWlyIGRlZmlu aXRpb25zIGFyZSBzYW1lLiAgKi8NCi0gIGlmIChzaW5nbGVfc291cmNlX2Vx dWFsX3AgKG90aGVyKSkNCi0gICAgcmV0dXJuIHRydWU7DQotDQotICByZXR1 cm4gbXVsdGlwbGVfc291cmNlX2VxdWFsX3AgKG90aGVyKTsNCi19DQotDQot Ym9vbA0KLWF2bF9pbmZvOjpvcGVyYXRvciE9IChjb25zdCBhdmxfaW5mbyAm b3RoZXIpIGNvbnN0DQotew0KLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp Ow0KLX0NCi0NCi1ib29sDQotYXZsX2luZm86Omhhc19ub25femVyb19hdmwg KCkgY29uc3QNCi17DQotICBpZiAoaGFzX2F2bF9pbW0gKCkpDQotICAgIHJl dHVybiBJTlRWQUwgKGdldF92YWx1ZSAoKSkgPiAwOw0KLSAgaWYgKGhhc19h dmxfcmVnICgpKQ0KLSAgICByZXR1cm4gdmxtYXhfYXZsX3AgKGdldF92YWx1 ZSAoKSk7DQotICByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8qIEluaXRpYWxp emUgVkwvVlRZUEUgaW5mb3JtYXRpb24uICAqLw0KLXZsX3Z0eXBlX2luZm86 OnZsX3Z0eXBlX2luZm8gKGF2bF9pbmZvIGF2bF9pbiwgdWludDhfdCBzZXdf aW4sDQotICAgICAgIGVudW0gdmxtdWxfdHlwZSB2bG11bF9pbiwgdWludDhf dCByYXRpb19pbiwNCi0gICAgICAgYm9vbCB0YV9pbiwgYm9vbCBtYV9pbikN Ci0gIDogbV9hdmwgKGF2bF9pbiksIG1fc2V3IChzZXdfaW4pLCBtX3ZsbXVs ICh2bG11bF9pbiksIG1fcmF0aW8gKHJhdGlvX2luKSwNCi0gICAgbV90YSAo dGFfaW4pLCBtX21hIChtYV9pbikNCi17DQotICBnY2NfYXNzZXJ0ICh2YWxp ZF9zZXdfcCAobV9zZXcpICYmICJVbmV4cGVjdGVkIFNFVyIpOw0KLX0NCi0N Ci1ib29sDQotdmxfdnR5cGVfaW5mbzo6b3BlcmF0b3I9PSAoY29uc3Qgdmxf dnR5cGVfaW5mbyAmb3RoZXIpIGNvbnN0DQotew0KLSAgcmV0dXJuIHNhbWVf YXZsX3AgKG90aGVyKSAmJiBtX3NldyA9PSBvdGhlci5nZXRfc2V3ICgpDQot ICYmIG1fdmxtdWwgPT0gb3RoZXIuZ2V0X3ZsbXVsICgpICYmIG1fdGEgPT0g b3RoZXIuZ2V0X3RhICgpDQotICYmIG1fbWEgPT0gb3RoZXIuZ2V0X21hICgp ICYmIG1fcmF0aW8gPT0gb3RoZXIuZ2V0X3JhdGlvICgpOw0KLX0NCi0NCi1i b29sDQotdmxfdnR5cGVfaW5mbzo6b3BlcmF0b3IhPSAoY29uc3QgdmxfdnR5 cGVfaW5mbyAmb3RoZXIpIGNvbnN0DQotew0KLSAgcmV0dXJuICEoKnRoaXMg PT0gb3RoZXIpOw0KLX0NCi0NCi1ib29sDQotdmxfdnR5cGVfaW5mbzo6c2Ft ZV9hdmxfcCAoY29uc3QgdmxfdnR5cGVfaW5mbyAmb3RoZXIpIGNvbnN0DQot ew0KLSAgLyogV2UgbmVlZCB0byBjb21wYXJlIGJvdGggUlRMIGFuZCBTRVQu IElmIGJvdGggQVZMIGFyZSBDT05TVF9JTlQuDQotICAgICBGb3IgZXhhbXBs ZSwgY29uc3RfaW50IDMgYW5kIGNvbnN0X2ludCA0LCB3ZSBuZWVkIHRvIGNv bXBhcmUNCi0gICAgIFJUTC4gSWYgYm90aCBBVkwgYXJlIFJFRyBhbmQgdGhl aXIgUkVHTk8gYXJlIHNhbWUsIHdlIG5lZWQgdG8NCi0gICAgIGNvbXBhcmUg U0VULiAgKi8NCi0gIHJldHVybiBnZXRfYXZsICgpID09IG90aGVyLmdldF9h dmwgKCkNCi0gJiYgZ2V0X2F2bF9zb3VyY2UgKCkgPT0gb3RoZXIuZ2V0X2F2 bF9zb3VyY2UgKCk7DQotfQ0KLQ0KLWJvb2wNCi12bF92dHlwZV9pbmZvOjpz YW1lX3Z0eXBlX3AgKGNvbnN0IHZsX3Z0eXBlX2luZm8gJm90aGVyKSBjb25z dA0KLXsNCi0gIHJldHVybiBnZXRfc2V3ICgpID09IG90aGVyLmdldF9zZXcg KCkgJiYgZ2V0X3ZsbXVsICgpID09IG90aGVyLmdldF92bG11bCAoKQ0KLSAm JiBnZXRfdGEgKCkgPT0gb3RoZXIuZ2V0X3RhICgpICYmIGdldF9tYSAoKSA9 PSBvdGhlci5nZXRfbWEgKCk7DQotfQ0KKy8qIFRoaXMgZmxhZ3MgaW5kaWNh dGVzIHRoZSBtaW5pbXVtIGRlbWFuZCBvZiB0aGUgdmwgYW5kIHZ0eXBlIHZh bHVlcyBieSB0aGUNCisgICBSVlYgaW5zdHJ1Y3Rpb24uIEZvciBleGFtcGxl LCBERU1BTkRfUkFUSU9fUCBpbmRpY2F0ZXMgdGhhdCB0aGlzIFJWVg0KKyAg IGluc3RydWN0aW9uIG9ubHkgbmVlZHMgdGhlIFNFVy9MTVVMIHJhdGlvIHRv IHJlbWFpbiB0aGUgc2FtZSwgYW5kIGRvZXMgbm90DQorICAgcmVxdWlyZSBT RVcgYW5kIExNVUwgdG8gYmUgZml4ZWQuDQorICAgVGhlcmVmb3JlLCBpZiB0 aGUgZm9ybWVyIFJWViBpbnN0cnVjdGlvbiBuZWVkcyBERU1BTkRfUkFUSU9f UCBhbmQgdGhlIGxhdHRlcg0KKyAgIGluc3RydWN0aW9uIG5lZWRzIERFTUFO RF9TRVdfTE1VTF9QIGFuZCBpdHMgU0VXL0xNVUwgaXMgdGhlIHNhbWUgYXMg dGhhdCBvZg0KKyAgIHRoZSBmb3JtZXIgaW5zdHJ1Y3Rpb24sIHRoZW4gd2Ug Y2FuIG1ha2UgdGhlIG1pbmltdSBkZW1hbmQgb2YgdGhlIGZvcm1lcg0KKyAg IGluc3RydWN0aW9uIHN0cmljdCB0byBERU1BTkRfU0VXX0xNVUxfUCwgYW5k IGl0cyByZXF1aXJlZCBTRVcgYW5kIExNVUwgYXJlDQorICAgdGhlIFNFVyBh bmQgTE1VTCBvZiB0aGUgbGF0dGVyIGluc3RydWN0aW9uLCBhbmQgdGhlIHZz ZXR2bCBpbnN0cnVjdGlvbg0KKyAgIGdlbmVyYXRlZCBhY2NvcmRpbmcgdG8g dGhlIG5ldyBkZW1hbmQgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhlIGxhdHRl cg0KKyAgIGluc3RydWN0aW9uLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGlu c2VydCBhIHNlcGFyYXRlIHZzZXR2bCBpbnN0cnVjdGlvbiBmb3INCisgICB0 aGUgbGF0dGVyIGluc3RydWN0aW9uLiAgKi8NCitlbnVtIGRlbWFuZF9mbGFn cyA6IHVuc2lnbmVkDQorew0KKyAgREVNQU5EX0VNUFRZX1AgPSAwLA0KKyAg REVNQU5EX1NFV19QID0gMSA8PCAwLA0KKyAgREVNQU5EX0xNVUxfUCA9IDEg PDwgMSwNCisgIERFTUFORF9SQVRJT19QID0gMSA8PCAyLA0KKyAgREVNQU5E X0dFX1NFV19QID0gMSA8PCAzLA0KKyAgREVNQU5EX1RBSUxfUE9MSUNZX1Ag PSAxIDw8IDQsDQorICBERU1BTkRfTUFTS19QT0xJQ1lfUCA9IDEgPDwgNSwN CisgIERFTUFORF9BVkxfUCA9IDEgPDwgNiwNCisgIERFTUFORF9OT05fWkVS T19BVkxfUCA9IDEgPDwgNywNCit9Ow0KIA0KLWJvb2wNCi12bF92dHlwZV9p bmZvOjpzYW1lX3ZsbWF4X3AgKGNvbnN0IHZsX3Z0eXBlX2luZm8gJm90aGVy KSBjb25zdA0KLXsNCi0gIHJldHVybiBnZXRfcmF0aW8gKCkgPT0gb3RoZXIu Z2V0X3JhdGlvICgpOw0KLX0NCisvKiBXZSBzcGxpdCB0aGUgZGVtYW5kIGlu Zm9ybWF0aW9uIGludG8gdGhyZWUgcGFydHMuIFRoZXkgYXJlIHNldyBhbmQg bG11bA0KKyAgIHJlbGF0ZWQgKHNld19sbXVsX2RlbWFuZF90eXBlKSwgdGFp bCBhbmQgbWFzayBwb2xpY3kgcmVsYXRlZA0KKyAgIChwb2xpY3lfZGVtYW5k X3R5cGUpIGFuZCBhdmwgcmVsYXRlZCAoYXZsX2RlbWFuZF90eXBlKS4gVGhl biB3ZSBkZWZpbmUgdGhyZWUNCisgICBpbnRlcmZhY2VzIGF2YWlhYmxlX3dp dGgsIGNvbXBhdGlibGVfd2l0aCBhbmQgbWVyZ2Vfd2l0aC4gYXZhaWFibGVf d2l0aCBpcw0KKyAgIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHR3 byB2c2V0dmwgaW5mb3MgcHJldl9pbmZvIGFuZCBuZXh0X2luZm8gYXJlDQor ICAgYXZhaWxhYmxlIG9yIG5vdC4gSWYgcHJldl9pbmZvIGlzIGF2YWlsYWJs ZSBmb3IgbmV4dF9pbmZvLCBpdCBtZWFucyB0aGF0IHRoZQ0KKyAgIFJWViBp bnNuIGNvcnJlc3BvbmRpbmcgdG8gbmV4dF9pbmZvIG9uIHRoZSBwYXRoIGZy b20gcHJldl9pbmZvIHRvIG5leHRfaW5mbw0KKyAgIGNhbiBiZSB1c2VkIHdp dGhvdXQgaW5zZXJ0aW5nIGEgc2VwYXJhdGUgdnNldHZsIGluc3RydWN0aW9u LiBjb21wYXRpYmxlX3dpdGgNCisgICBpcyB1c2VkIHRvIGRldGVybWluZSB3 aGV0aGVyIHByZXZfaW5mbyBpcyBjb21wYXRpYmxlIHdpdGggbmV4dF9pbmZv LCBhbmQgaWYNCisgICBzbywgbWVyZ2Vfd2l0aCBjYW4gYmUgdXNlZCB0byBt ZXJnZSB0aGUgc3RyaWN0ZXIgZGVtYW5kIGluZm9ybWF0aW9uIGZyb20NCisg ICBuZXh0X2luZm8gaW50byBwcmV2X2luZm8gc28gdGhhdCBwcmV2X2luZm8g YmVjb21lcyBhdmFpbGFibGUgdG8gbmV4dF9pbmZvLg0KKyAqLw0KIA0KLS8q IENvbXBhcmUgdGhlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBEZW0xIGFuZCBE ZW0yLg0KLSAgIElmIERlbTEgPiBEZW0yLCBEZW0xIGhhcyBiaWdnZXIgY29t cGF0aWJpbGl0eSB0aGVuIERlbTINCi0gICBtZWFuaW5nIERlbTEgaXMgZWFz aWVyIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlcnMgdGhhbiBEZW0yDQotICAg b3IgRGVtMiBpcyBzdHJpY3RlciB0aGFuIERlbTEuDQotICAgRm9yIGV4YW1w bGUsIERlbTEgKGRlbWFuZCBTRVcgKyBMTVVMKSA+IERlbTIgKGRlbWFuZCBS QVRJTykuICAqLw0KLWJvb2wNCi12ZWN0b3JfaW5zbl9pbmZvOjpvcGVyYXRv cj49IChjb25zdCB2ZWN0b3JfaW5zbl9pbmZvICZvdGhlcikgY29uc3QNCitl bnVtIGNsYXNzIHNld19sbXVsX2RlbWFuZF90eXBlIDogdW5zaWduZWQNCnsN Ci0gIGlmIChzdXBwb3J0X3JlbGF4ZWRfY29tcGF0aWJsZV9wICgqdGhpcywg b3RoZXIpKQ0KLSAgICB7DQotICAgICAgdW5zaWduZWQgYXJyYXlfc2l6ZSA9 IHNpemVvZiAodW5hdmFpbGFibGVfY29uZHMpIC8gc2l6ZW9mIChkZW1hbmRz X2NvbmQpOw0KLSAgICAgIC8qIEJ5cGFzcyBBVkwgdW5hdmFpbGFibGUgY2Fz ZXMuICAqLw0KLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkgPCBhcnJh eV9zaXplOyBpKyspDQotIGlmICh1bmF2YWlsYWJsZV9jb25kc1tpXS5wYWly Lm1hdGNoX2NvbmRfcCAodGhpcy0+Z2V0X2RlbWFuZHMgKCksDQotICAgICBv dGhlci5nZXRfZGVtYW5kcyAoKSkNCi0gICAgICYmIHVuYXZhaWxhYmxlX2Nv bmRzW2ldLmluY29tcGF0aWJsZV9wICgqdGhpcywgb3RoZXIpKQ0KLSAgIHJl dHVybiBmYWxzZTsNCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0K LSAgaWYgKCFvdGhlci5jb21wYXRpYmxlX3AgKHN0YXRpY19jYXN0PGNvbnN0 IHZsX3Z0eXBlX2luZm8gJj4gKCp0aGlzKSkpDQotICAgIHJldHVybiBmYWxz ZTsNCi0gIGlmICghdGhpcy0+Y29tcGF0aWJsZV9wIChzdGF0aWNfY2FzdDxj b25zdCB2bF92dHlwZV9pbmZvICY+IChvdGhlcikpKQ0KLSAgICByZXR1cm4g dHJ1ZTsNCi0NCi0gIGlmICgqdGhpcyA9PSBvdGhlcikNCi0gICAgcmV0dXJu IHRydWU7DQotDQotICBmb3IgKGNvbnN0IGF1dG8gJmNvbmQgOiB1bmF2YWls YWJsZV9jb25kcykNCi0gICAgaWYgKGNvbmQucGFpci5tYXRjaF9jb25kX3Ag KHRoaXMtPmdldF9kZW1hbmRzICgpLCBvdGhlci5nZXRfZGVtYW5kcyAoKSkN Ci0gJiYgY29uZC5pbmNvbXBhdGlibGVfcCAoKnRoaXMsIG90aGVyKSkNCi0g ICAgICByZXR1cm4gZmFsc2U7DQotDQotICByZXR1cm4gdHJ1ZTsNCi19DQor ICBzZXdfbG11bCA9IGRlbWFuZF9mbGFnczo6REVNQU5EX1NFV19QIHwgZGVt YW5kX2ZsYWdzOjpERU1BTkRfTE1VTF9QLA0KKyAgcmF0aW9fb25seSA9IGRl bWFuZF9mbGFnczo6REVNQU5EX1JBVElPX1AsDQorICBzZXdfb25seSA9IGRl bWFuZF9mbGFnczo6REVNQU5EX1NFV19QLA0KKyAgZ2Vfc2V3ID0gZGVtYW5k X2ZsYWdzOjpERU1BTkRfR0VfU0VXX1AsDQorICByYXRpb19hbmRfZ2Vfc2V3 DQorICA9IGRlbWFuZF9mbGFnczo6REVNQU5EX1JBVElPX1AgfCBkZW1hbmRf ZmxhZ3M6OkRFTUFORF9HRV9TRVdfUCwNCit9Ow0KIA0KLWJvb2wNCi12ZWN0 b3JfaW5zbl9pbmZvOjpvcGVyYXRvcj09IChjb25zdCB2ZWN0b3JfaW5zbl9p bmZvICZvdGhlcikgY29uc3QNCitlbnVtIGNsYXNzIHBvbGljeV9kZW1hbmRf dHlwZSA6IHVuc2lnbmVkDQp7DQotICBnY2NfYXNzZXJ0ICghdW5pbml0X3Ag KCkgJiYgIW90aGVyLnVuaW5pdF9wICgpDQotICAgICAgICYmICJVbmluaXRp YWxpemF0aW9uIHNob3VsZCBub3QgaGFwcGVuIik7DQotDQotICAvKiBFbXB0 eSBpcyBvbmx5IGVxdWFsIHRvIGFub3RoZXIgRW1wdHkuICAqLw0KLSAgaWYg KGVtcHR5X3AgKCkpDQotICAgIHJldHVybiBvdGhlci5lbXB0eV9wICgpOw0K LSAgaWYgKG90aGVyLmVtcHR5X3AgKCkpDQotICAgIHJldHVybiBlbXB0eV9w ICgpOw0KLQ0KLSAgLyogVW5rbm93biBpcyBvbmx5IGVxdWFsIHRvIGFub3Ro ZXIgVW5rbm93bi4gICovDQotICBpZiAodW5rbm93bl9wICgpKQ0KLSAgICBy ZXR1cm4gb3RoZXIudW5rbm93bl9wICgpOw0KLSAgaWYgKG90aGVyLnVua25v d25fcCAoKSkNCi0gICAgcmV0dXJuIHVua25vd25fcCAoKTsNCi0NCi0gIGZv ciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX0RFTUFORDsgaSsrKQ0KLSAgICBp ZiAobV9kZW1hbmRzW2ldICE9IG90aGVyLmRlbWFuZF9wICgoZW51bSBkZW1h bmRfdHlwZSkgaSkpDQotICAgICAgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgLyog V2Ugc2hvdWxkIGNvbnNpZGVyIGRpZmZlcmVudCBJTlNOIGRlbWFuZHMgYXMg ZGlmZmVyZW50DQotICAgICBleHByZXNzaW9uLiAgT3RoZXJ3aXNlLCB3ZSB3 aWxsIGJlIGRvaW5nIGluY29ycmVjdCB2c2V0dmwNCi0gICAgIGVsaW1pbmF0 aW9uLiAgKi8NCi0gIGlmIChtX2luc24gIT0gb3RoZXIuZ2V0X2luc24gKCkp DQotICAgIHJldHVybiBmYWxzZTsNCi0NCi0gIGlmICghc2FtZV9hdmxfcCAo b3RoZXIpKQ0KLSAgICByZXR1cm4gZmFsc2U7DQotDQotICAvKiBJZiB0aGUg ZnVsbCBWVFlQRSBpcyB2YWxpZCwgY2hlY2sgdGhhdCBpdCBpcyB0aGUgc2Ft ZS4gICovDQotICByZXR1cm4gc2FtZV92dHlwZV9wIChvdGhlcik7DQotfQ0K KyAgdGFpbF9tYXNrX3BvbGljeQ0KKyAgPSBkZW1hbmRfZmxhZ3M6OkRFTUFO RF9UQUlMX1BPTElDWV9QIHwgZGVtYW5kX2ZsYWdzOjpERU1BTkRfTUFTS19Q T0xJQ1lfUCwNCisgIHRhaWxfcG9saWN5X29ubHkgPSBkZW1hbmRfZmxhZ3M6 OkRFTUFORF9UQUlMX1BPTElDWV9QLA0KKyAgbWFza19wb2xpY3lfb25seSA9 IGRlbWFuZF9mbGFnczo6REVNQU5EX01BU0tfUE9MSUNZX1AsDQorICBpZ25v cmVfcG9saWN5ID0gZGVtYW5kX2ZsYWdzOjpERU1BTkRfRU1QVFlfUCwNCit9 Ow0KIA0KLXZvaWQNCi12ZWN0b3JfaW5zbl9pbmZvOjpwYXJzZV9pbnNuIChy dHhfaW5zbiAqcmluc24pDQorZW51bSBjbGFzcyBhdmxfZGVtYW5kX3R5cGUg OiB1bnNpZ25lZA0Kew0KLSAgKnRoaXMgPSB2ZWN0b3JfaW5zbl9pbmZvICgp Ow0KLSAgaWYgKCFOT05ERUJVR19JTlNOX1AgKHJpbnNuKSkNCi0gICAgcmV0 dXJuOw0KLSAgaWYgKG9wdGltaXplID09IDAgJiYgIWhhc192dHlwZV9vcCAo cmluc24pKQ0KLSAgICByZXR1cm47DQotICBnY2NfYXNzZXJ0ICghdnNldHZs X2Rpc2NhcmRfcmVzdWx0X2luc25fcCAocmluc24pKTsNCi0gIG1fc3RhdGUg PSBWQUxJRDsNCi0gIGV4dHJhY3RfaW5zbl9jYWNoZWQgKHJpbnNuKTsNCi0g IHJ0eCBhdmwgPSA6OmdldF9hdmwgKHJpbnNuKTsNCi0gIG1fYXZsID0gYXZs X2luZm8gKGF2bCwgbnVsbHB0cik7DQotICBtX3NldyA9IDo6Z2V0X3NldyAo cmluc24pOw0KLSAgbV92bG11bCA9IDo6Z2V0X3ZsbXVsIChyaW5zbik7DQot ICBtX3RhID0gdGFpbF9hZ25vc3RpY19wIChyaW5zbik7DQotICBtX21hID0g bWFza19hZ25vc3RpY19wIChyaW5zbik7DQotfQ0KKyAgYXZsID0gZGVtYW5k X2ZsYWdzOjpERU1BTkRfQVZMX1AsDQorICBub25femVyb19hdmwgPSBkZW1h bmRfZmxhZ3M6OkRFTUFORF9OT05fWkVST19BVkxfUCwNCisgIGlnbm9yZV9h dmwgPSBkZW1hbmRfZmxhZ3M6OkRFTUFORF9FTVBUWV9QLA0KK307DQogDQot dm9pZA0KLXZlY3Rvcl9pbnNuX2luZm86OnBhcnNlX2luc24gKGluc25faW5m byAqaW5zbikNCitjbGFzcyB2c2V0dmxfaW5mbw0Kew0KLSAgKnRoaXMgPSB2 ZWN0b3JfaW5zbl9pbmZvICgpOw0KLQ0KLSAgLyogUmV0dXJuIGlmIGl0IGlz IGRlYnVnIGluc24gZm9yIHRoZSBjb25zaXN0ZW5jeSB3aXRoIG9wdGltaXpl ID09IDAuICAqLw0KLSAgaWYgKGluc24tPmlzX2RlYnVnX2luc24gKCkpDQot ICAgIHJldHVybjsNCitwcml2YXRlOg0KKyAgaW5zbl9pbmZvICptX2luc247 DQorICBiYl9pbmZvICptX2JiOw0KKyAgcnR4IG1fYXZsOw0KKyAgcnR4IG1f dmw7DQorICBzZXRfaW5mbyAqbV9hdmxfZGVmOw0KKyAgdWludDhfdCBtX3Nl dzsNCisgIHVpbnQ4X3QgbV9tYXhfc2V3Ow0KKyAgdmxtdWxfdHlwZSBtX3Zs bXVsOw0KKyAgdWludDhfdCBtX3JhdGlvOw0KKyAgYm9vbCBtX3RhOw0KKyAg Ym9vbCBtX21hOw0KKw0KKyAgc2V3X2xtdWxfZGVtYW5kX3R5cGUgbV9zZXdf bG11bF9kZW1hbmQ7DQorICBwb2xpY3lfZGVtYW5kX3R5cGUgbV9wb2xpY3lf ZGVtYW5kOw0KKyAgYXZsX2RlbWFuZF90eXBlIG1fYXZsX2RlbWFuZDsNCisN CisgIGVudW0gY2xhc3Mgc3RhdGVfdHlwZQ0KKyAgew0KKyAgICBVTklOSVRJ QUxJWkVELA0KKyAgICBWQUxJRCwNCisgICAgVU5LTk9XTiwNCisgICAgRU1Q VFksDQorICB9Ow0KKyAgc3RhdGVfdHlwZSBtX3N0YXRlOw0KKw0KKyAgYm9v bCBtX2lnbm9yZTsNCisgIGJvb2wgY2hhbmdlX3Z0eXBlX29ubHk7DQorICBp bnNuX2luZm8gKm1fcmVhZF92bF9pbnNuOw0KKyAgYm9vbCB1c2VfYnlfbm9u X3J2dl9pbnNuOw0KIA0KLSAgLyogV2Ugc2V0IGl0IGFzIHVua25vd24gc2lu Y2Ugd2UgZG9uJ3Qgd2hhdCB3aWxsIGhhcHBlbiBpbiBDQUxMIG9yIEFTTS4g ICovDQotICBpZiAoaW5zbi0+aXNfY2FsbCAoKSB8fCBpbnNuLT5pc19hc20g KCkpDQotICAgIHsNCi0gICAgICBzZXRfdW5rbm93biAoKTsNCitwdWJsaWM6 DQorICB2c2V0dmxfaW5mbyAoKQ0KKyAgICA6IG1faW5zbiAobnVsbHB0ciks IG1fYmIgKG51bGxwdHIpLCBtX2F2bCAoTlVMTF9SVFgpLCBtX3ZsIChOVUxM X1JUWCksDQorICAgICAgbV9hdmxfZGVmIChudWxscHRyKSwgbV9zZXcgKDAp LCBtX21heF9zZXcgKDApLCBtX3ZsbXVsIChMTVVMX1JFU0VSVkVEKSwNCisg ICAgICBtX3JhdGlvICgwKSwgbV90YSAoZmFsc2UpLCBtX21hIChmYWxzZSks DQorICAgICAgbV9zZXdfbG11bF9kZW1hbmQgKHNld19sbXVsX2RlbWFuZF90 eXBlOjpzZXdfbG11bCksDQorICAgICAgbV9wb2xpY3lfZGVtYW5kIChwb2xp Y3lfZGVtYW5kX3R5cGU6OnRhaWxfbWFza19wb2xpY3kpLA0KKyAgICAgIG1f YXZsX2RlbWFuZCAoYXZsX2RlbWFuZF90eXBlOjphdmwpLCBtX3N0YXRlIChz dGF0ZV90eXBlOjpVTklOSVRJQUxJWkVEKSwNCisgICAgICBtX2lnbm9yZSAo ZmFsc2UpLCBjaGFuZ2VfdnR5cGVfb25seSAoZmFsc2UpLCBtX3JlYWRfdmxf aW5zbiAobnVsbHB0ciksDQorICAgICAgdXNlX2J5X25vbl9ydnZfaW5zbiAo ZmFsc2UpDQorICB7fQ0KKw0KKyAgdnNldHZsX2luZm8gKGluc25faW5mbyAq aW5zbikgOiB2c2V0dmxfaW5mbyAoKSB7IHBhcnNlX2luc24gKGluc24pOyB9 DQorDQorICB2c2V0dmxfaW5mbyAocnR4X2luc24gKmluc24pIDogdnNldHZs X2luZm8gKCkgeyBwYXJzZV9pbnNuIChpbnNuKTsgfQ0KKw0KKyAgdm9pZCBz ZXRfYXZsIChydHggYXZsKSB7IG1fYXZsID0gYXZsOyB9DQorICB2b2lkIHNl dF92bCAocnR4IHZsKSB7IG1fdmwgPSB2bDsgfQ0KKyAgdm9pZCBzZXRfYXZs X2RlZiAoc2V0X2luZm8gKmF2bF9kZWYpIHsgbV9hdmxfZGVmID0gYXZsX2Rl ZjsgfQ0KKyAgdm9pZCBzZXRfc2V3ICh1aW50OF90IHNldykgeyBtX3NldyA9 IHNldzsgfQ0KKyAgdm9pZCBzZXRfdmxtdWwgKHZsbXVsX3R5cGUgdmxtdWwp IHsgbV92bG11bCA9IHZsbXVsOyB9DQorICB2b2lkIHNldF9yYXRpbyAodWlu dDhfdCByYXRpbykgeyBtX3JhdGlvID0gcmF0aW87IH0NCisgIHZvaWQgc2V0 X3RhIChib29sIHRhKSB7IG1fdGEgPSB0YTsgfQ0KKyAgdm9pZCBzZXRfbWEg KGJvb2wgbWEpIHsgbV9tYSA9IG1hOyB9DQorICB2b2lkIHNldF9pZ25vcmUg KCkgeyBtX2lnbm9yZSA9IHRydWU7IH0NCisgIHZvaWQgc2V0X2JiIChiYl9p bmZvICpiYikgeyBtX2JiID0gYmI7IH0NCisgIHZvaWQgc2V0X21heF9zZXcg KHVpbnQ4X3QgbWF4X3NldykgeyBtX21heF9zZXcgPSBtYXhfc2V3OyB9DQor ICB2b2lkIHNldF9jaGFuZ2VfdnR5cGVfb25seSAoKSB7IGNoYW5nZV92dHlw ZV9vbmx5ID0gdHJ1ZTsgfQ0KKyAgdm9pZCBzZXRfcmVhZF92bF9pbnNuIChp bnNuX2luZm8gKmluc24pIHsgbV9yZWFkX3ZsX2luc24gPSBpbnNuOyB9DQor DQorICBydHggZ2V0X2F2bCAoKSBjb25zdCB7IHJldHVybiBtX2F2bDsgfQ0K KyAgcnR4IGdldF92bCAoKSBjb25zdCB7IHJldHVybiBtX3ZsOyB9DQorICBz ZXRfaW5mbyAqZ2V0X2F2bF9kZWYgKCkgY29uc3QgeyByZXR1cm4gbV9hdmxf ZGVmOyB9DQorICB1aW50OF90IGdldF9zZXcgKCkgY29uc3QgeyByZXR1cm4g bV9zZXc7IH0NCisgIHZsbXVsX3R5cGUgZ2V0X3ZsbXVsICgpIGNvbnN0IHsg cmV0dXJuIG1fdmxtdWw7IH0NCisgIHVpbnQ4X3QgZ2V0X3JhdGlvICgpIGNv bnN0IHsgcmV0dXJuIG1fcmF0aW87IH0NCisgIGJvb2wgZ2V0X3RhICgpIGNv bnN0IHsgcmV0dXJuIG1fdGE7IH0NCisgIGJvb2wgZ2V0X21hICgpIGNvbnN0 IHsgcmV0dXJuIG1fbWE7IH0NCisgIGluc25faW5mbyAqZ2V0X2luc24gKCkg Y29uc3QgeyByZXR1cm4gbV9pbnNuOyB9DQorICBib29sIGlnbm9yZV9wICgp IGNvbnN0IHsgcmV0dXJuIG1faWdub3JlOyB9DQorICBiYl9pbmZvICpnZXRf YmIgKCkgY29uc3QgeyByZXR1cm4gbV9iYjsgfQ0KKyAgdWludDhfdCBnZXRf bWF4X3NldyAoKSBjb25zdCB7IHJldHVybiBtX21heF9zZXc7IH0NCisgIGlu c25faW5mbyAqZ2V0X3JlYWRfdmxfaW5zbiAoKSBjb25zdCB7IHJldHVybiBt X3JlYWRfdmxfaW5zbjsgfQ0KKyAgYm9vbCB1c2VfYnlfbm9uX3J2dl9pbnNu X3AgKCkgY29uc3QgeyByZXR1cm4gdXNlX2J5X25vbl9ydnZfaW5zbjsgfQ0K Kw0KKyAgYm9vbCBoYXNfaW1tX2F2bCAoKSBjb25zdCB7IHJldHVybiBtX2F2 bCAmJiBDT05TVF9JTlRfUCAobV9hdmwpOyB9DQorICBib29sIGhhc192bG1h eF9hdmwgKCkgY29uc3QgeyByZXR1cm4gdmxtYXhfYXZsX3AgKG1fYXZsKTsg fQ0KKyAgYm9vbCBoYXNfcmVnX2F2bCAoKSBjb25zdA0KKyAgew0KKyAgICBy ZXR1cm4gbV9hdmwgJiYgUkVHX1AgKG1fYXZsKSAmJiAhaGFzX3ZsbWF4X2F2 bCAoKTsNCisgIH0NCisgIGJvb2wgaGFzX25vbl96ZXJvX2F2bCAoKSBjb25z dA0KKyAgew0KKyAgICBpZiAoaGFzX2ltbV9hdmwgKCkpDQorICAgICAgcmV0 dXJuIElOVFZBTCAobV9hdmwpID4gMDsNCisgICAgcmV0dXJuIGhhc192bG1h eF9hdmwgKCk7DQorICB9DQorICBib29sIGhhc19yZWdfdmwgKCkgY29uc3QN CisgIHsNCisgICAgZ2NjX2Fzc2VydCAoIW1fdmwgfHwgUkVHX1AgKG1fdmwp KTsNCisgICAgcmV0dXJuIG1fdmwgJiYgUkVHX1AgKG1fdmwpOw0KKyAgfQ0K KyAgYm9vbCBoYXNfc2FtZV9yYXRpbyAoY29uc3QgdnNldHZsX2luZm8gJm90 aGVyKSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gZ2V0X3JhdGlvICgpID09 IG90aGVyLmdldF9yYXRpbyAoKTsNCisgIH0NCisgIGJvb2wgaXNfaW5fb3Jp Z2luX2JiICgpIGNvbnN0IHsgcmV0dXJuIGdldF9pbnNuICgpLT5iYiAoKSA9 PSBnZXRfYmIgKCk7IH0NCisgIHZvaWQgdXBkYXRlX2F2bCAoY29uc3QgdnNl dHZsX2luZm8gJm90aGVyKQ0KKyAgew0KKyAgICBtX2F2bCA9IG90aGVyLmdl dF9hdmwgKCk7DQorICAgIG1fdmwgPSBvdGhlci5nZXRfdmwgKCk7DQorICAg IG1fYXZsX2RlZiA9IG90aGVyLmdldF9hdmxfZGVmICgpOw0KKyAgfQ0KKw0K KyAgYm9vbCB1bmluaXRfcCAoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlID09 IHN0YXRlX3R5cGU6OlVOSU5JVElBTElaRUQ7IH0NCisgIGJvb2wgdmFsaWRf cCAoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlID09IHN0YXRlX3R5cGU6OlZB TElEOyB9DQorICBib29sIHVua25vd25fcCAoKSBjb25zdCB7IHJldHVybiBt X3N0YXRlID09IHN0YXRlX3R5cGU6OlVOS05PV047IH0NCisgIGJvb2wgZW1w dHlfcCAoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlID09IHN0YXRlX3R5cGU6 OkVNUFRZOyB9DQorICBib29sIGNoYW5nZV92dHlwZV9vbmx5X3AgKCkgY29u c3QgeyByZXR1cm4gY2hhbmdlX3Z0eXBlX29ubHk7IH0NCisNCisgIHZvaWQg c2V0X3ZhbGlkICgpIHsgbV9zdGF0ZSA9IHN0YXRlX3R5cGU6OlZBTElEOyB9 DQorICB2b2lkIHNldF91bmtub3duICgpIHsgbV9zdGF0ZSA9IHN0YXRlX3R5 cGU6OlVOS05PV047IH0NCisgIHZvaWQgc2V0X2VtcHR5ICgpIHsgbV9zdGF0 ZSA9IHN0YXRlX3R5cGU6OkVNUFRZOyB9DQorDQorICB2b2lkIHNldF9zZXdf bG11bF9kZW1hbmQgKHNld19sbXVsX2RlbWFuZF90eXBlIGRlbWFuZCkNCisg IHsNCisgICAgbV9zZXdfbG11bF9kZW1hbmQgPSBkZW1hbmQ7DQorICB9DQor ICB2b2lkIHNldF9wb2xpY3lfZGVtYW5kIChwb2xpY3lfZGVtYW5kX3R5cGUg ZGVtYW5kKQ0KKyAgew0KKyAgICBtX3BvbGljeV9kZW1hbmQgPSBkZW1hbmQ7 DQorICB9DQorICB2b2lkIHNldF9hdmxfZGVtYW5kIChhdmxfZGVtYW5kX3R5 cGUgZGVtYW5kKSB7IG1fYXZsX2RlbWFuZCA9IGRlbWFuZDsgfQ0KKw0KKyAg c2V3X2xtdWxfZGVtYW5kX3R5cGUgZ2V0X3Nld19sbXVsX2RlbWFuZCAoKSBj b25zdA0KKyAgew0KKyAgICByZXR1cm4gbV9zZXdfbG11bF9kZW1hbmQ7DQor ICB9DQorICBwb2xpY3lfZGVtYW5kX3R5cGUgZ2V0X3BvbGljeV9kZW1hbmQg KCkgY29uc3QgeyByZXR1cm4gbV9wb2xpY3lfZGVtYW5kOyB9DQorICBhdmxf ZGVtYW5kX3R5cGUgZ2V0X2F2bF9kZW1hbmQgKCkgY29uc3QgeyByZXR1cm4g bV9hdmxfZGVtYW5kOyB9DQorDQorICB2b2lkIG5vcm1hbGl6ZV9kZW1hbmQg KHVuc2lnbmVkIGRlbWFuZF9mbGFncykNCisgIHsNCisgICAgc3dpdGNoIChk ZW1hbmRfZmxhZ3MNCisgICAgICYgKERFTUFORF9TRVdfUCB8IERFTUFORF9M TVVMX1AgfCBERU1BTkRfUkFUSU9fUCB8IERFTUFORF9HRV9TRVdfUCkpDQor ICAgICAgew0KKyAgICAgIGNhc2UgKHVuc2lnbmVkKSBzZXdfbG11bF9kZW1h bmRfdHlwZTo6c2V3X2xtdWw6DQorIG1fc2V3X2xtdWxfZGVtYW5kID0gc2V3 X2xtdWxfZGVtYW5kX3R5cGU6OnNld19sbXVsOw0KKyBicmVhazsNCisgICAg ICBjYXNlICh1bnNpZ25lZCkgc2V3X2xtdWxfZGVtYW5kX3R5cGU6OnJhdGlv X29ubHk6DQorIG1fc2V3X2xtdWxfZGVtYW5kID0gc2V3X2xtdWxfZGVtYW5k X3R5cGU6OnJhdGlvX29ubHk7DQorIGJyZWFrOw0KKyAgICAgIGNhc2UgKHVu c2lnbmVkKSBzZXdfbG11bF9kZW1hbmRfdHlwZTo6c2V3X29ubHk6DQorIG1f c2V3X2xtdWxfZGVtYW5kID0gc2V3X2xtdWxfZGVtYW5kX3R5cGU6OnNld19v bmx5Ow0KKyBicmVhazsNCisgICAgICBjYXNlICh1bnNpZ25lZCkgc2V3X2xt dWxfZGVtYW5kX3R5cGU6OmdlX3NldzoNCisgbV9zZXdfbG11bF9kZW1hbmQg PSBzZXdfbG11bF9kZW1hbmRfdHlwZTo6Z2Vfc2V3Ow0KKyBicmVhazsNCisg ICAgICBjYXNlICh1bnNpZ25lZCkgc2V3X2xtdWxfZGVtYW5kX3R5cGU6OnJh dGlvX2FuZF9nZV9zZXc6DQorIG1fc2V3X2xtdWxfZGVtYW5kID0gc2V3X2xt dWxfZGVtYW5kX3R5cGU6OnJhdGlvX2FuZF9nZV9zZXc7DQorIGJyZWFrOw0K KyAgICAgIGRlZmF1bHQ6DQorIGdjY191bnJlYWNoYWJsZSAoKTsNCisgICAg ICB9DQorDQorICAgIHN3aXRjaCAoZGVtYW5kX2ZsYWdzICYgKERFTUFORF9U QUlMX1BPTElDWV9QIHwgREVNQU5EX01BU0tfUE9MSUNZX1ApKQ0KKyAgICAg IHsNCisgICAgICBjYXNlICh1bnNpZ25lZCkgcG9saWN5X2RlbWFuZF90eXBl Ojp0YWlsX21hc2tfcG9saWN5Og0KKyBtX3BvbGljeV9kZW1hbmQgPSBwb2xp Y3lfZGVtYW5kX3R5cGU6OnRhaWxfbWFza19wb2xpY3k7DQorIGJyZWFrOw0K KyAgICAgIGNhc2UgKHVuc2lnbmVkKSBwb2xpY3lfZGVtYW5kX3R5cGU6OnRh aWxfcG9saWN5X29ubHk6DQorIG1fcG9saWN5X2RlbWFuZCA9IHBvbGljeV9k ZW1hbmRfdHlwZTo6dGFpbF9wb2xpY3lfb25seTsNCisgYnJlYWs7DQorICAg ICAgY2FzZSAodW5zaWduZWQpIHBvbGljeV9kZW1hbmRfdHlwZTo6bWFza19w b2xpY3lfb25seToNCisgbV9wb2xpY3lfZGVtYW5kID0gcG9saWN5X2RlbWFu ZF90eXBlOjptYXNrX3BvbGljeV9vbmx5Ow0KKyBicmVhazsNCisgICAgICBj YXNlICh1bnNpZ25lZCkgcG9saWN5X2RlbWFuZF90eXBlOjppZ25vcmVfcG9s aWN5Og0KKyBtX3BvbGljeV9kZW1hbmQgPSBwb2xpY3lfZGVtYW5kX3R5cGU6 Omlnbm9yZV9wb2xpY3k7DQorIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQor IGdjY191bnJlYWNoYWJsZSAoKTsNCisgICAgICB9DQorDQorICAgIHN3aXRj aCAoZGVtYW5kX2ZsYWdzICYgKERFTUFORF9BVkxfUCB8IERFTUFORF9OT05f WkVST19BVkxfUCkpDQorICAgICAgew0KKyAgICAgIGNhc2UgKHVuc2lnbmVk KSBhdmxfZGVtYW5kX3R5cGU6OmF2bDoNCisgbV9hdmxfZGVtYW5kID0gYXZs X2RlbWFuZF90eXBlOjphdmw7DQorIGJyZWFrOw0KKyAgICAgIGNhc2UgKHVu c2lnbmVkKSBhdmxfZGVtYW5kX3R5cGU6Om5vbl96ZXJvX2F2bDoNCisgbV9h dmxfZGVtYW5kID0gYXZsX2RlbWFuZF90eXBlOjpub25femVyb19hdmw7DQor IGJyZWFrOw0KKyAgICAgIGNhc2UgKHVuc2lnbmVkKSBhdmxfZGVtYW5kX3R5 cGU6Omlnbm9yZV9hdmw6DQorIG1fYXZsX2RlbWFuZCA9IGF2bF9kZW1hbmRf dHlwZTo6aWdub3JlX2F2bDsNCisgYnJlYWs7DQorICAgICAgZGVmYXVsdDoN CisgZ2NjX3VucmVhY2hhYmxlICgpOw0KKyAgICAgIH0NCisgIH0NCisNCisg IHZvaWQgcGFyc2VfaW5zbiAocnR4X2luc24gKnJpbnNuKQ0KKyAgew0KKyAg ICBpZiAoIU5PTkRFQlVHX0lOU05fUCAocmluc24pKQ0KICAgICAgIHJldHVy bjsNCi0gICAgfQ0KLQ0KLSAgLyogSWYgdGhpcyBpcyBzb21ldGhpbmcgdGhh dCB1cGRhdGVzIFZML1ZUWVBFIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCwg c2V0DQotICAgICB0aGUgc3RhdGUgdG8gdW5rbm93bi4gICovDQotICBpZiAo IXZlY3Rvcl9jb25maWdfaW5zbl9wIChpbnNuLT5ydGwgKCkpICYmICFoYXNf dnR5cGVfb3AgKGluc24tPnJ0bCAoKSkNCi0gICAgICAmJiAoZmluZF9hY2Nl c3MgKGluc24tPmRlZnMgKCksIFZMX1JFR05VTSkNCi0gICB8fCBmaW5kX2Fj Y2VzcyAoaW5zbi0+ZGVmcyAoKSwgVlRZUEVfUkVHTlVNKSkpDQotICAgIHsN Ci0gICAgICBzZXRfdW5rbm93biAoKTsNCisgICAgaWYgKG9wdGltaXplID09 IDAgJiYgIWhhc192dHlwZV9vcCAocmluc24pKQ0KICAgICAgIHJldHVybjsN Ci0gICAgfQ0KLQ0KLSAgaWYgKCF2ZWN0b3JfY29uZmlnX2luc25fcCAoaW5z bi0+cnRsICgpKSAmJiAhaGFzX3Z0eXBlX29wIChpbnNuLT5ydGwgKCkpKQ0K LSAgICByZXR1cm47DQotDQotICAvKiBXYXJuaW5nOiBUaGlzIGZ1bmN0aW9u IGhhcyB0byB3b3JrIG9uIGJvdGggdGhlIGxvd2VyZWQgKGkuZS4gcG9zdA0K LSAgICAgZW1pdF9sb2NhbF9mb3J3YXJkX3ZzZXR2bHMpIGFuZCBwcmUtbG93 ZXJpbmcgZm9ybXMuICBUaGUgbWFpbiBpbXBsaWNhdGlvbg0KLSAgICAgb2Yg dGhpcyBpcyB0aGF0IGl0IGNhbid0IHVzZSB0aGUgdmFsdWUgb2YgYSBTRVcs IFZMLCBvciBQb2xpY3kgb3BlcmFuZCBhcw0KLSAgICAgdGhleSBtaWdodCBi ZSBzdGFsZSBhZnRlciBsb3dlcmluZy4gICovDQotICB2bF92dHlwZV9pbmZv OjpvcGVyYXRvcj0gKGdldF92bF92dHlwZV9pbmZvIChpbnNuKSk7DQotICBt X2luc24gPSBpbnNuOw0KLSAgbV9zdGF0ZSA9IFZBTElEOw0KLSAgaWYgKHZl Y3Rvcl9jb25maWdfaW5zbl9wIChpbnNuLT5ydGwgKCkpKQ0KLSAgICB7DQot ICAgICAgbV9kZW1hbmRzW0RFTUFORF9BVkxdID0gdHJ1ZTsNCi0gICAgICBt X2RlbWFuZHNbREVNQU5EX1JBVElPXSA9IHRydWU7DQorICAgIGdjY19hc3Nl cnQgKCF2c2V0dmxfZGlzY2FyZF9yZXN1bHRfaW5zbl9wIChyaW5zbikpOw0K KyAgICBzZXRfdmFsaWQgKCk7DQorICAgIGV4dHJhY3RfaW5zbl9jYWNoZWQg KHJpbnNuKTsNCisgICAgbV9hdmwgPSA6OmdldF9hdmwgKHJpbnNuKTsNCisg ICAgaWYgKGhhc192bG1heF9hdmwgKCkgfHwgdnNldHZsX2luc25fcCAocmlu c24pKQ0KKyAgICAgIG1fdmwgPSA6OmdldF92bCAocmluc24pOw0KKyAgICBt X3NldyA9IDo6Z2V0X3NldyAocmluc24pOw0KKyAgICBtX3ZsbXVsID0gOjpn ZXRfdmxtdWwgKHJpbnNuKTsNCisgICAgbV90YSA9IHRhaWxfYWdub3N0aWNf cCAocmluc24pOw0KKyAgICBtX21hID0gbWFza19hZ25vc3RpY19wIChyaW5z bik7DQorICB9DQorDQorICB2b2lkIHBhcnNlX2luc24gKGluc25faW5mbyAq aW5zbikNCisgIHsNCisgICAgbV9pbnNuID0gaW5zbjsNCisgICAgbV9iYiA9 IGluc24tPmJiICgpOw0KKyAgICAvKiBSZXR1cm4gaWYgaXQgaXMgZGVidWcg aW5zbiBmb3IgdGhlIGNvbnNpc3RlbmN5IHdpdGggb3B0aW1pemUgPT0gMC4g ICovDQorICAgIGlmIChpbnNuLT5pc19kZWJ1Z19pbnNuICgpKQ0KICAgICAg IHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgaWYgKGhhc192bF9vcCAoaW5zbi0+ cnRsICgpKSkNCi0gICAgbV9kZW1hbmRzW0RFTUFORF9BVkxdID0gdHJ1ZTsN Ci0NCi0gIGlmIChnZXRfYXR0cl9yYXRpbyAoaW5zbi0+cnRsICgpKSAhPSBJ TlZBTElEX0FUVFJJQlVURSkNCi0gICAgbV9kZW1hbmRzW0RFTUFORF9SQVRJ T10gPSB0cnVlOw0KLSAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogVE9ETzog QnkgZGVmYXVsdCwgaWYgaXQgZG9lc24ndCBkZW1hbmQgUkFUSU8sIHdlIHNl dCBpdA0KLSBkZW1hbmQgU0VXICYmIExNVUwgYm90aC4gU29tZSBpbnN0cnVj dGlvbnMgbWF5IGRlbWFuZCBTRVcNCi0gb25seSBhbmQgaWdub3JlIExNVUws IHdpbGwgZml4IGl0IGxhdGVyLiAgKi8NCi0gICAgICBtX2RlbWFuZHNbREVN QU5EX1NFV10gPSB0cnVlOw0KLSAgICAgIGlmICghaWdub3JlX3ZsbXVsX2lu c25fcCAoaW5zbi0+cnRsICgpKSkNCi0gbV9kZW1hbmRzW0RFTUFORF9MTVVM XSA9IHRydWU7DQotICAgIH0NCi0NCi0gIGlmIChnZXRfYXR0cl90YSAoaW5z bi0+cnRsICgpKSAhPSBJTlZBTElEX0FUVFJJQlVURSkNCi0gICAgbV9kZW1h bmRzW0RFTUFORF9UQUlMX1BPTElDWV0gPSB0cnVlOw0KLSAgaWYgKGdldF9h dHRyX21hIChpbnNuLT5ydGwgKCkpICE9IElOVkFMSURfQVRUUklCVVRFKQ0K LSAgICBtX2RlbWFuZHNbREVNQU5EX01BU0tfUE9MSUNZXSA9IHRydWU7DQot DQotICBpZiAodmVjdG9yX2NvbmZpZ19pbnNuX3AgKGluc24tPnJ0bCAoKSkp DQotICAgIHJldHVybjsNCi0NCi0gIGlmIChzY2FsYXJfbW92ZV9pbnNuX3Ag KGluc24tPnJ0bCAoKSkpDQotICAgIHsNCi0gICAgICBpZiAobV9hdmwuaGFz X25vbl96ZXJvX2F2bCAoKSkNCi0gbV9kZW1hbmRzW0RFTUFORF9OT05aRVJP X0FWTF0gPSB0cnVlOw0KLSAgICAgIGlmIChtX3RhKQ0KLSBtX2RlbWFuZHNb REVNQU5EX0dFX1NFV10gPSB0cnVlOw0KLSAgICB9DQotDQotICBpZiAoIW1f YXZsLmhhc19hdmxfcmVnICgpIHx8IHZsbWF4X2F2bF9wIChnZXRfYXZsICgp KSB8fCAhbV9hdmwuZ2V0X3NvdXJjZSAoKSkNCi0gICAgcmV0dXJuOw0KLSAg aWYgKCFtX2F2bC5nZXRfc291cmNlICgpLT5pbnNuICgpLT5pc19yZWFsICgp DQotICAgICAgJiYgIW1fYXZsLmdldF9zb3VyY2UgKCktPmluc24gKCktPmlz X3BoaSAoKSkNCi0gICAgcmV0dXJuOw0KLQ0KLSAgaW5zbl9pbmZvICpkZWZf aW5zbiA9IGV4dHJhY3Rfc2luZ2xlX3NvdXJjZSAobV9hdmwuZ2V0X3NvdXJj ZSAoKSk7DQotICBpZiAoIWRlZl9pbnNuIHx8ICF2c2V0dmxfaW5zbl9wIChk ZWZfaW5zbi0+cnRsICgpKSkNCi0gICAgcmV0dXJuOw0KLQ0KLSAgdmVjdG9y X2luc25faW5mbyBuZXdfaW5mbzsNCi0gIG5ld19pbmZvLnBhcnNlX2luc24g KGRlZl9pbnNuKTsNCi0gIGlmICghc2FtZV92bG1heF9wIChuZXdfaW5mbykg JiYgIXNjYWxhcl9tb3ZlX2luc25fcCAoaW5zbi0+cnRsICgpKSkNCi0gICAg cmV0dXJuOw0KLQ0KLSAgaWYgKG5ld19pbmZvLmhhc19hdmwgKCkpDQotICAg IHsNCi0gICAgICBpZiAobmV3X2luZm8uaGFzX2F2bF9pbW0gKCkpDQotIHNl dF9hdmxfaW5mbyAoYXZsX2luZm8gKG5ld19pbmZvLmdldF9hdmwgKCksIG51 bGxwdHIpKTsNCi0gICAgICBlbHNlDQotIHsNCi0gICBpZiAodmxtYXhfYXZs X3AgKG5ld19pbmZvLmdldF9hdmwgKCkpKQ0KLSAgICAgc2V0X2F2bF9pbmZv IChhdmxfaW5mbyAobmV3X2luZm8uZ2V0X2F2bCAoKSwgZ2V0X2F2bF9zb3Vy Y2UgKCkpKTsNCi0gICBlbHNlDQotICAgICB7DQotICAgICAgIC8qIENvbnNl cnZhdGl2ZWx5IHByb3BhZ2F0ZSBub24tVkxNQVggQVZMIG9mIHVzZXIgdnNl dHZsOg0KLSAxLiBUaGUgdXNlciB2c2V0dmwgc2hvdWxkIGJlIHNhbWUgYmxv Y2sgd2l0aCB0aGUgcnZ2IGluc24uDQotIDIuIFRoZSB1c2VyIHZzZXR2bCBp cyB0aGUgb25seSBkZWYgaW5zbiBvZiBydnYgaW5zbi4NCi0gMy4gVGhlIEFW TCBpcyBub3QgbW9kaWZpZWQgYmV0d2VlbiBkZWYtdXNlIGNoYWluLg0KLSA0 LiBUaGUgVkwgaXMgb25seSB1c2VkIGJ5IGluc24gd2l0aGluIEVCQi4NCi0g ICAgICAgICovDQotICAgICAgIGJvb2wgbW9kaWZpZWRfcCA9IGZhbHNlOw0K LSAgICAgICBmb3IgKGluc25faW5mbyAqaSA9IGRlZl9pbnNuLT5uZXh0X25v bmRlYnVnX2luc24gKCk7DQotICAgIHJlYWxfaW5zbl9hbmRfc2FtZV9iYl9w IChpLCBnZXRfaW5zbiAoKS0+YmIgKCkpOw0KLSAgICBpID0gaS0+bmV4dF9u b25kZWJ1Z19pbnNuICgpKQ0KLSB7DQotICAgLyogQ29uc2lkZXIgdGhpcyBm b2xsb3dpbmcgc2VxdWVuY2U6DQotDQotICAgICAgICBpbnNuIDE6IHZzZXR2 bGkgYTUsYTMsZTgsbWY0LHRhLG11DQotICAgICAgICBpbnNuIDI6IHZzZXR2 bGkgemVybyxhNSxlMzIsbTEsdGEsbWENCi0gICAgICAgIC4uLg0KLSAgICAg ICAgdmxlMzIudiB2MSwwKGExKQ0KLSAgICAgICAgdnNldHZsaSBhMix6ZXJv LGUzMixtMSx0YSxtYQ0KLSAgICAgICAgdmFkZC52diB2MSx2MSx2MQ0KLSAg ICAgICAgdnNldHZsaSB6ZXJvLGE1LGUzMixtMSx0YSxtYQ0KLSAgICAgICAg dnNlMzIudiB2MSwwKGEwKQ0KLSAgICAgICAgLi4uDQotICAgICAgICBpbnNu IDM6IHN1YiAgICAgYTMsYTMsYTUNCi0gICAgICAgIC4uLg0KLQ0KLSAgICAg ICAgV2UgY2FuIGxvY2FsIEFWTCBwcm9wYWdhdGUgImEzIiBmcm9tIGluc24g MSB0byBpbnNuIDINCi0gICAgICAgIGlmIG5vIGluc25zIGJldHdlZW4gaW5z biAxIGFuZCBpbnNuIDIgbW9kaWZ5ICJhMyBldmVuDQotICAgICAgICB0aG91 Z2ggaW5zbiAzIG1vZGlmaWVzICJhMyIuDQotICAgICAgICBPdGhlcndpc2Us IHdlIGNhbid0IHBlcmZvcm0gbG9jYWwgQVZMIHByb3BhZ2F0aW9uLg0KLQ0K LSAgICAgICAgRWFybHkgYnJlYWsgaWYgd2UgcmVhY2ggdGhlIGluc24gMi4g ICovDQotICAgaWYgKCFiZWZvcmVfcCAoaSwgaW5zbikpDQotICAgICBicmVh azsNCi0gICBpZiAoZmluZF9hY2Nlc3MgKGktPmRlZnMgKCksIFJFR05PIChu ZXdfaW5mby5nZXRfYXZsICgpKSkpDQotICAgICB7DQotICAgICAgIG1vZGlm aWVkX3AgPSB0cnVlOw0KLSAgICAgICBicmVhazsNCi0gICAgIH0NCi0gfQ0K LQ0KLSAgICAgICBib29sIGhhc19saXZlX291dF91c2UgPSBmYWxzZTsNCi0g ICAgICAgZm9yICh1c2VfaW5mbyAqdXNlIDogbV9hdmwuZ2V0X3NvdXJjZSAo KS0+YWxsX3VzZXMgKCkpDQotIHsNCi0gICBpZiAodXNlLT5pc19saXZlX291 dF91c2UgKCkpDQotICAgICB7DQotICAgICAgIGhhc19saXZlX291dF91c2Ug PSB0cnVlOw0KLSAgICAgICBicmVhazsNCi0gICAgIH0NCi0gfQ0KLSAgICAg ICBpZiAoIW1vZGlmaWVkX3AgJiYgIWhhc19saXZlX291dF91c2UNCi0gICAm JiBkZWZfaW5zbiA9PSBtX2F2bC5nZXRfc291cmNlICgpLT5pbnNuICgpDQot ICAgJiYgbV9pbnNuLT5iYiAoKSA9PSBkZWZfaW5zbi0+YmIgKCkpDQotIHNl dF9hdmxfaW5mbyAobmV3X2luZm8uZ2V0X2F2bF9pbmZvICgpKTsNCi0gICAg IH0NCi0gfQ0KLSAgICB9DQogDQotICBpZiAoc2NhbGFyX21vdmVfaW5zbl9w IChpbnNuLT5ydGwgKCkpICYmIG1fYXZsLmhhc19ub25femVyb19hdmwgKCkp DQotICAgIG1fZGVtYW5kc1tERU1BTkRfTk9OWkVST19BVkxdID0gdHJ1ZTsN Ci19DQotDQotYm9vbA0KLXZlY3Rvcl9pbnNuX2luZm86OmNvbXBhdGlibGVf cCAoY29uc3QgdmVjdG9yX2luc25faW5mbyAmb3RoZXIpIGNvbnN0DQotew0K LSAgZ2NjX2Fzc2VydCAodmFsaWRfb3JfZGlydHlfcCAoKSAmJiBvdGhlci52 YWxpZF9vcl9kaXJ0eV9wICgpDQotICAgICAgICYmICJDYW4ndCBjb21wYXJl IGludmFsaWQgZGVtYW5kZWQgaW5mb3MiKTsNCi0NCi0gIGZvciAoY29uc3Qg YXV0byAmY29uZCA6IGluY29tcGF0aWJsZV9jb25kcykNCi0gICAgaWYgKGNv bmQuZHVhbF9pbmNvbXBhdGlibGVfcCAoKnRoaXMsIG90aGVyKSkNCi0gICAg ICByZXR1cm4gZmFsc2U7DQotICByZXR1cm4gdHJ1ZTsNCi19DQotDQotYm9v bA0KLXZlY3Rvcl9pbnNuX2luZm86OnNraXBfYXZsX2NvbXBhdGlibGVfcCAo Y29uc3QgdmVjdG9yX2luc25faW5mbyAmb3RoZXIpIGNvbnN0DQotew0KLSAg Z2NjX2Fzc2VydCAodmFsaWRfb3JfZGlydHlfcCAoKSAmJiBvdGhlci52YWxp ZF9vcl9kaXJ0eV9wICgpDQotICAgICAgICYmICJDYW4ndCBjb21wYXJlIGlu dmFsaWQgZGVtYW5kZWQgaW5mb3MiKTsNCi0gIHVuc2lnbmVkIGFycmF5X3Np emUgPSBzaXplb2YgKGluY29tcGF0aWJsZV9jb25kcykgLyBzaXplb2YgKGRl bWFuZHNfY29uZCk7DQotICAvKiBCeXBhc3MgQVZMIGluY29tcGF0aWJsZSBj YXNlcy4gICovDQotICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgYXJyYXlf c2l6ZTsgaSsrKQ0KLSAgICBpZiAoaW5jb21wYXRpYmxlX2NvbmRzW2ldLmR1 YWxfaW5jb21wYXRpYmxlX3AgKCp0aGlzLCBvdGhlcikpDQotICAgICAgcmV0 dXJuIGZhbHNlOw0KLSAgcmV0dXJuIHRydWU7DQotfQ0KLQ0KLWJvb2wNCi12 ZWN0b3JfaW5zbl9pbmZvOjpjb21wYXRpYmxlX2F2bF9wIChjb25zdCB2bF92 dHlwZV9pbmZvICZvdGhlcikgY29uc3QNCi17DQotICBnY2NfYXNzZXJ0ICh2 YWxpZF9vcl9kaXJ0eV9wICgpICYmICJDYW4ndCBjb21wYXJlIGludmFsaWQg dmxfdnR5cGVfaW5mbyIpOw0KLSAgZ2NjX2Fzc2VydCAoIXVua25vd25fcCAo KSAmJiAiQ2FuJ3QgY29tcGFyZSBBVkwgaW4gdW5rbm93biBzdGF0ZSIpOw0K LSAgaWYgKCFkZW1hbmRfcCAoREVNQU5EX0FWTCkpDQotICAgIHJldHVybiB0 cnVlOw0KLSAgaWYgKGRlbWFuZF9wIChERU1BTkRfTk9OWkVST19BVkwpICYm IG90aGVyLmhhc19ub25femVyb19hdmwgKCkpDQotICAgIHJldHVybiB0cnVl Ow0KLSAgcmV0dXJuIGdldF9hdmxfaW5mbyAoKSA9PSBvdGhlci5nZXRfYXZs X2luZm8gKCk7DQotfQ0KLQ0KLWJvb2wNCi12ZWN0b3JfaW5zbl9pbmZvOjpj b21wYXRpYmxlX2F2bF9wIChjb25zdCBhdmxfaW5mbyAmb3RoZXIpIGNvbnN0 DQotew0KLSAgZ2NjX2Fzc2VydCAodmFsaWRfb3JfZGlydHlfcCAoKSAmJiAi Q2FuJ3QgY29tcGFyZSBpbnZhbGlkIHZsX3Z0eXBlX2luZm8iKTsNCi0gIGdj Y19hc3NlcnQgKCF1bmtub3duX3AgKCkgJiYgIkNhbid0IGNvbXBhcmUgQVZM IGluIHVua25vd24gc3RhdGUiKTsNCi0gIGdjY19hc3NlcnQgKGRlbWFuZF9w IChERU1BTkRfQVZMKSAmJiAiQ2FuJ3QgY29tcGFyZSBBVkwgdW5kZW1hbmQg c3RhdGUiKTsNCi0gIGlmICghZGVtYW5kX3AgKERFTUFORF9BVkwpKQ0KLSAg ICByZXR1cm4gdHJ1ZTsNCi0gIGlmIChkZW1hbmRfcCAoREVNQU5EX05PTlpF Uk9fQVZMKSAmJiBvdGhlci5oYXNfbm9uX3plcm9fYXZsICgpKQ0KLSAgICBy ZXR1cm4gdHJ1ZTsNCi0gIHJldHVybiBnZXRfYXZsX2luZm8gKCkgPT0gb3Ro ZXI7DQotfQ0KLQ0KLWJvb2wNCi12ZWN0b3JfaW5zbl9pbmZvOjpjb21wYXRp YmxlX3Z0eXBlX3AgKGNvbnN0IHZsX3Z0eXBlX2luZm8gJm90aGVyKSBjb25z dA0KLXsNCi0gIGdjY19hc3NlcnQgKHZhbGlkX29yX2RpcnR5X3AgKCkgJiYg IkNhbid0IGNvbXBhcmUgaW52YWxpZCB2bF92dHlwZV9pbmZvIik7DQotICBn Y2NfYXNzZXJ0ICghdW5rbm93bl9wICgpICYmICJDYW4ndCBjb21wYXJlIFZU WVBFIGluIHVua25vd24gc3RhdGUiKTsNCi0gIGlmIChkZW1hbmRfcCAoREVN QU5EX1NFVykpDQotICAgIHsNCi0gICAgICBpZiAoIWRlbWFuZF9wIChERU1B TkRfR0VfU0VXKSAmJiBtX3NldyAhPSBvdGhlci5nZXRfc2V3ICgpKQ0KLSBy ZXR1cm4gZmFsc2U7DQotICAgICAgaWYgKGRlbWFuZF9wIChERU1BTkRfR0Vf U0VXKSAmJiBtX3NldyA+IG90aGVyLmdldF9zZXcgKCkpDQotIHJldHVybiBm YWxzZTsNCi0gICAgfQ0KLSAgaWYgKGRlbWFuZF9wIChERU1BTkRfTE1VTCkg JiYgbV92bG11bCAhPSBvdGhlci5nZXRfdmxtdWwgKCkpDQotICAgIHJldHVy biBmYWxzZTsNCi0gIGlmIChkZW1hbmRfcCAoREVNQU5EX1JBVElPKSAmJiBt X3JhdGlvICE9IG90aGVyLmdldF9yYXRpbyAoKSkNCi0gICAgcmV0dXJuIGZh bHNlOw0KLSAgaWYgKGRlbWFuZF9wIChERU1BTkRfVEFJTF9QT0xJQ1kpICYm IG1fdGEgIT0gb3RoZXIuZ2V0X3RhICgpKQ0KLSAgICByZXR1cm4gZmFsc2U7 DQotICBpZiAoZGVtYW5kX3AgKERFTUFORF9NQVNLX1BPTElDWSkgJiYgbV9t YSAhPSBvdGhlci5nZXRfbWEgKCkpDQotICAgIHJldHVybiBmYWxzZTsNCi0g IHJldHVybiB0cnVlOw0KLX0NCi0NCi0vKiBEZXRlcm1pbmUgd2hldGhlciB0 aGUgdmVjdG9yIGluc3RydWN0aW9ucyByZXF1aXJlbWVudHMgcmVwcmVzZW50 ZWQgYnkNCi0gICBSZXF1aXJlIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIHBy ZXZpb3VzIHZzZXR2bGkgaW5zdHJ1Y3Rpb24gcmVwcmVzZW50ZWQNCi0gICBi eSB0aGlzLiAgSU5TTiBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hvc2UgcmVxdWly ZW1lbnRzIHdlJ3JlIGNvbnNpZGVyaW5nLiAgKi8NCi1ib29sDQotdmVjdG9y X2luc25faW5mbzo6Y29tcGF0aWJsZV9wIChjb25zdCB2bF92dHlwZV9pbmZv ICZjdXJyX2luZm8pIGNvbnN0DQotew0KLSAgZ2NjX2Fzc2VydCAoIXVuaW5p dF9wICgpICYmICJDYW4ndCBoYW5kbGUgdW5pbml0aWFsaXplZCBpbmZvIik7 DQotICBpZiAoZW1wdHlfcCAoKSkNCi0gICAgcmV0dXJuIGZhbHNlOw0KLQ0K LSAgLyogTm90aGluZyBpcyBjb21wYXRpYmxlIHdpdGggVW5rbm93bi4gICov DQotICBpZiAodW5rbm93bl9wICgpKQ0KLSAgICByZXR1cm4gZmFsc2U7DQot DQotICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lc24ndCBuZWVkIGFuIEFW TFJlZyBhbmQgdGhlIFNFVyBtYXRjaGVzLCBjb25zaWRlcg0KLSAgICAgaXQg Y29tcGF0aWJsZS4gICovDQotICBpZiAoIWRlbWFuZF9wIChERU1BTkRfQVZM KSkNCi0gICAgaWYgKG1fc2V3ID09IGN1cnJfaW5mby5nZXRfc2V3ICgpKQ0K LSAgICAgIHJldHVybiB0cnVlOw0KLQ0KLSAgcmV0dXJuIGNvbXBhdGlibGVf YXZsX3AgKGN1cnJfaW5mbykgJiYgY29tcGF0aWJsZV92dHlwZV9wIChjdXJy X2luZm8pOw0KLX0NCi0NCi1ib29sDQotdmVjdG9yX2luc25faW5mbzo6YXZh aWxhYmxlX3AgKGNvbnN0IHZlY3Rvcl9pbnNuX2luZm8gJm90aGVyKSBjb25z dA0KLXsNCi0gIHJldHVybiAqdGhpcyA+PSBvdGhlcjsNCi19DQotDQotdm9p ZA0KLXZlY3Rvcl9pbnNuX2luZm86OmZ1c2VfYXZsIChjb25zdCB2ZWN0b3Jf aW5zbl9pbmZvICZpbmZvMSwNCi0gICAgIGNvbnN0IHZlY3Rvcl9pbnNuX2lu Zm8gJmluZm8yKQ0KLXsNCi0gIHNldF9pbnNuIChpbmZvMS5nZXRfaW5zbiAo KSk7DQotICBpZiAoaW5mbzEuZGVtYW5kX3AgKERFTUFORF9BVkwpKQ0KLSAg ICB7DQotICAgICAgaWYgKGluZm8xLmRlbWFuZF9wIChERU1BTkRfTk9OWkVS T19BVkwpKQ0KLSB7DQotICAgaWYgKGluZm8yLmRlbWFuZF9wIChERU1BTkRf QVZMKQ0KLSAgICAgICAmJiAhaW5mbzIuZGVtYW5kX3AgKERFTUFORF9OT05a RVJPX0FWTCkpDQotICAgICB7DQotICAgICAgIHNldF9hdmxfaW5mbyAoaW5m bzIuZ2V0X2F2bF9pbmZvICgpKTsNCi0gICAgICAgc2V0X2RlbWFuZCAoREVN QU5EX0FWTCwgdHJ1ZSk7DQotICAgICAgIHNldF9kZW1hbmQgKERFTUFORF9O T05aRVJPX0FWTCwgZmFsc2UpOw0KLSAgICAgICByZXR1cm47DQotICAgICB9 DQotIH0NCi0gICAgICBzZXRfYXZsX2luZm8gKGluZm8xLmdldF9hdmxfaW5m byAoKSk7DQotICAgICAgc2V0X2RlbWFuZCAoREVNQU5EX05PTlpFUk9fQVZM LCBpbmZvMS5kZW1hbmRfcCAoREVNQU5EX05PTlpFUk9fQVZMKSk7DQotICAg IH0NCi0gIGVsc2UNCi0gICAgew0KLSAgICAgIHNldF9hdmxfaW5mbyAoaW5m bzIuZ2V0X2F2bF9pbmZvICgpKTsNCi0gICAgICBzZXRfZGVtYW5kIChERU1B TkRfTk9OWkVST19BVkwsIGluZm8yLmRlbWFuZF9wIChERU1BTkRfTk9OWkVS T19BVkwpKTsNCi0gICAgfQ0KLSAgc2V0X2RlbWFuZCAoREVNQU5EX0FWTCwN Ci0gICAgICAgaW5mbzEuZGVtYW5kX3AgKERFTUFORF9BVkwpIHx8IGluZm8y LmRlbWFuZF9wIChERU1BTkRfQVZMKSk7DQotfQ0KLQ0KLXZvaWQNCi12ZWN0 b3JfaW5zbl9pbmZvOjpmdXNlX3Nld19sbXVsIChjb25zdCB2ZWN0b3JfaW5z bl9pbmZvICZpbmZvMSwNCi0gY29uc3QgdmVjdG9yX2luc25faW5mbyAmaW5m bzIpDQotew0KLSAgLyogV2UgbmVlZCB0byBmdXNlIHNldyAmJiBsbXVsIGFj Y29yZGluZyB0byBkZW1hbmQgaW5mbzoNCi0NCi0gICAgIDEuIEdFX1NFVy4N Ci0gICAgIDIuIFNFVy4NCi0gICAgIDMuIExNVUwuDQotICAgICA0LiBSQVRJ Ty4gICovDQotICBpZiAoc2FtZV9zZXdfbG11bF9kZW1hbmRfcCAoaW5mbzEu Z2V0X2RlbWFuZHMgKCksIGluZm8yLmdldF9kZW1hbmRzICgpKSkNCi0gICAg ew0KLSAgICAgIHNldF9kZW1hbmQgKERFTUFORF9TRVcsIGluZm8yLmRlbWFu ZF9wIChERU1BTkRfU0VXKSk7DQotICAgICAgc2V0X2RlbWFuZCAoREVNQU5E X0xNVUwsIGluZm8yLmRlbWFuZF9wIChERU1BTkRfTE1VTCkpOw0KLSAgICAg IHNldF9kZW1hbmQgKERFTUFORF9SQVRJTywgaW5mbzIuZGVtYW5kX3AgKERF TUFORF9SQVRJTykpOw0KLSAgICAgIHNldF9kZW1hbmQgKERFTUFORF9HRV9T RVcsIGluZm8yLmRlbWFuZF9wIChERU1BTkRfR0VfU0VXKSk7DQotICAgICAg c2V0X3NldyAoaW5mbzIuZ2V0X3NldyAoKSk7DQotICAgICAgc2V0X3ZsbXVs IChpbmZvMi5nZXRfdmxtdWwgKCkpOw0KLSAgICAgIHNldF9yYXRpbyAoaW5m bzIuZ2V0X3JhdGlvICgpKTsNCisgICAgLyogV2Ugc2V0IGl0IGFzIHVua25v d24gc2luY2Ugd2UgZG9uJ3Qgd2hhdCB3aWxsIGhhcHBlbiBpbiBDQUxMIG9y IEFTTS4gICovDQorICAgIGlmIChpbnNuLT5pc19jYWxsICgpIHx8IGluc24t PmlzX2FzbSAoKSkNCisgICAgICB7DQorIHNldF91bmtub3duICgpOw0KKyBy ZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAvKiBJZiB0aGlzIGlzIHNvbWV0 aGluZyB0aGF0IHVwZGF0ZXMgVkwvVlRZUEUgdGhhdCB3ZSBkb24ndCBrbm93 IGFib3V0LCBzZXQNCisgICAgICAgdGhlIHN0YXRlIHRvIHVua25vd24uICAq Lw0KKyAgICBpZiAoIXZlY3Rvcl9jb25maWdfaW5zbl9wIChpbnNuLT5ydGwg KCkpICYmICFoYXNfdnR5cGVfb3AgKGluc24tPnJ0bCAoKSkNCisgJiYgKGZp bmRfYWNjZXNzIChpbnNuLT5kZWZzICgpLCBWTF9SRUdOVU0pDQorICAgICB8 fCBmaW5kX2FjY2VzcyAoaW5zbi0+ZGVmcyAoKSwgVlRZUEVfUkVHTlVNKSkp DQorICAgICAgew0KKyBzZXRfdW5rbm93biAoKTsNCisgcmV0dXJuOw0KKyAg ICAgIH0NCisNCisgICAgaWYgKCF2ZWN0b3JfY29uZmlnX2luc25fcCAoaW5z bi0+cnRsICgpKSAmJiAhaGFzX3Z0eXBlX29wIChpbnNuLT5ydGwgKCkpKQ0K KyAgICAgIC8qIHVuaW5pdGlhbGl6ZWQgKi8NCiAgICAgICByZXR1cm47DQot ICAgIH0NCi0gIGZvciAoY29uc3QgYXV0byAmcnVsZSA6IGZ1c2VfcnVsZXMp DQotICAgIHsNCi0gICAgICBpZiAocnVsZS5wYWlyLm1hdGNoX2NvbmRfcCAo aW5mbzEuZ2V0X2RlbWFuZHMgKCksIGluZm8yLmdldF9kZW1hbmRzICgpKSkN Ci0gew0KLSAgIHNldF9kZW1hbmQgKERFTUFORF9TRVcsIHJ1bGUuZGVtYW5k X3Nld19wKTsNCi0gICBzZXRfZGVtYW5kIChERU1BTkRfTE1VTCwgcnVsZS5k ZW1hbmRfbG11bF9wKTsNCi0gICBzZXRfZGVtYW5kIChERU1BTkRfUkFUSU8s IHJ1bGUuZGVtYW5kX3JhdGlvX3ApOw0KLSAgIHNldF9kZW1hbmQgKERFTUFO RF9HRV9TRVcsIHJ1bGUuZGVtYW5kX2dlX3Nld19wKTsNCi0gICBzZXRfc2V3 IChydWxlLm5ld19zZXcgKGluZm8xLCBpbmZvMikpOw0KLSAgIHNldF92bG11 bCAocnVsZS5uZXdfdmxtdWwgKGluZm8xLCBpbmZvMikpOw0KLSAgIHNldF9y YXRpbyAocnVsZS5uZXdfcmF0aW8gKGluZm8xLCBpbmZvMikpOw0KLSAgIHJl dHVybjsNCi0gfQ0KLSAgICAgIGlmIChydWxlLnBhaXIubWF0Y2hfY29uZF9w IChpbmZvMi5nZXRfZGVtYW5kcyAoKSwgaW5mbzEuZ2V0X2RlbWFuZHMgKCkp KQ0KLSB7DQotICAgc2V0X2RlbWFuZCAoREVNQU5EX1NFVywgcnVsZS5kZW1h bmRfc2V3X3ApOw0KLSAgIHNldF9kZW1hbmQgKERFTUFORF9MTVVMLCBydWxl LmRlbWFuZF9sbXVsX3ApOw0KLSAgIHNldF9kZW1hbmQgKERFTUFORF9SQVRJ TywgcnVsZS5kZW1hbmRfcmF0aW9fcCk7DQotICAgc2V0X2RlbWFuZCAoREVN QU5EX0dFX1NFVywgcnVsZS5kZW1hbmRfZ2Vfc2V3X3ApOw0KLSAgIHNldF9z ZXcgKHJ1bGUubmV3X3NldyAoaW5mbzIsIGluZm8xKSk7DQotICAgc2V0X3Zs bXVsIChydWxlLm5ld192bG11bCAoaW5mbzIsIGluZm8xKSk7DQotICAgc2V0 X3JhdGlvIChydWxlLm5ld19yYXRpbyAoaW5mbzIsIGluZm8xKSk7DQotICAg cmV0dXJuOw0KLSB9DQotICAgIH0NCi0gIGdjY191bnJlYWNoYWJsZSAoKTsN Ci19DQogDQotdm9pZA0KLXZlY3Rvcl9pbnNuX2luZm86OmZ1c2VfdGFpbF9w b2xpY3kgKGNvbnN0IHZlY3Rvcl9pbnNuX2luZm8gJmluZm8xLA0KLSAgICAg Y29uc3QgdmVjdG9yX2luc25faW5mbyAmaW5mbzIpDQotew0KLSAgaWYgKGlu Zm8xLmRlbWFuZF9wIChERU1BTkRfVEFJTF9QT0xJQ1kpKQ0KLSAgICB7DQot ICAgICAgc2V0X3RhIChpbmZvMS5nZXRfdGEgKCkpOw0KLSAgICAgIGRlbWFu ZCAoREVNQU5EX1RBSUxfUE9MSUNZKTsNCi0gICAgfQ0KLSAgZWxzZSBpZiAo aW5mbzIuZGVtYW5kX3AgKERFTUFORF9UQUlMX1BPTElDWSkpDQotICAgIHsN Ci0gICAgICBzZXRfdGEgKGluZm8yLmdldF90YSAoKSk7DQotICAgICAgZGVt YW5kIChERU1BTkRfVEFJTF9QT0xJQ1kpOw0KLSAgICB9DQotICBlbHNlDQot ICAgIHNldF90YSAoZ2V0X2RlZmF1bHRfdGEgKCkpOw0KLX0NCi0NCi12b2lk DQotdmVjdG9yX2luc25faW5mbzo6ZnVzZV9tYXNrX3BvbGljeSAoY29uc3Qg dmVjdG9yX2luc25faW5mbyAmaW5mbzEsDQotICAgICBjb25zdCB2ZWN0b3Jf aW5zbl9pbmZvICZpbmZvMikNCi17DQotICBpZiAoaW5mbzEuZGVtYW5kX3Ag KERFTUFORF9NQVNLX1BPTElDWSkpDQotICAgIHsNCi0gICAgICBzZXRfbWEg KGluZm8xLmdldF9tYSAoKSk7DQotICAgICAgZGVtYW5kIChERU1BTkRfTUFT S19QT0xJQ1kpOw0KLSAgICB9DQotICBlbHNlIGlmIChpbmZvMi5kZW1hbmRf cCAoREVNQU5EX01BU0tfUE9MSUNZKSkNCi0gICAgew0KLSAgICAgIHNldF9t YSAoaW5mbzIuZ2V0X21hICgpKTsNCi0gICAgICBkZW1hbmQgKERFTUFORF9N QVNLX1BPTElDWSk7DQotICAgIH0NCi0gIGVsc2UNCi0gICAgc2V0X21hIChn ZXRfZGVmYXVsdF9tYSAoKSk7DQotfQ0KLQ0KLXZlY3Rvcl9pbnNuX2luZm8N Ci12ZWN0b3JfaW5zbl9pbmZvOjpsb2NhbF9tZXJnZSAoY29uc3QgdmVjdG9y X2luc25faW5mbyAmbWVyZ2VfaW5mbykgY29uc3QNCi17DQotICBpZiAoIXZz ZXR2bF9pbnNuX3AgKGdldF9pbnNuICgpLT5ydGwgKCkpICYmICp0aGlzICE9 IG1lcmdlX2luZm8pDQotICAgIGdjY19hc3NlcnQgKHRoaXMtPmNvbXBhdGli bGVfcCAobWVyZ2VfaW5mbykNCi0gJiYgIkNhbid0IG1lcmdlIGluY29tcGF0 aWJsZSBkZW1hbmRlZCBpbmZvcyIpOw0KLQ0KLSAgdmVjdG9yX2luc25faW5m byBuZXdfaW5mbzsNCi0gIG5ld19pbmZvLnNldF92YWxpZCAoKTsNCi0gIC8q IEZvciBsb2NhbCBiYWNrd2FyZCBkYXRhIGZsb3csIHdlIGFsd2F5cyB1cGRh dGUgSU5TTiAmJiBBVkwgYXMgdGhlDQotICAgICBsYXRlc3QgSU5TTiBhbmQg QVZMIHNvIHRoYXQgd2UgY2FuIGtlZXAgdHJhY2sgc3RhdHVzIG9mIGVhY2gg SU5TTi4gICovDQotICBuZXdfaW5mby5mdXNlX2F2bCAobWVyZ2VfaW5mbywg KnRoaXMpOw0KLSAgbmV3X2luZm8uZnVzZV9zZXdfbG11bCAoKnRoaXMsIG1l cmdlX2luZm8pOw0KLSAgbmV3X2luZm8uZnVzZV90YWlsX3BvbGljeSAoKnRo aXMsIG1lcmdlX2luZm8pOw0KLSAgbmV3X2luZm8uZnVzZV9tYXNrX3BvbGlj eSAoKnRoaXMsIG1lcmdlX2luZm8pOw0KLSAgcmV0dXJuIG5ld19pbmZvOw0K LX0NCi0NCi12ZWN0b3JfaW5zbl9pbmZvDQotdmVjdG9yX2luc25faW5mbzo6 Z2xvYmFsX21lcmdlIChjb25zdCB2ZWN0b3JfaW5zbl9pbmZvICZtZXJnZV9p bmZvLA0KLSB1bnNpZ25lZCBpbnQgYmJfaW5kZXgpIGNvbnN0DQotew0KLSAg aWYgKCF2c2V0dmxfaW5zbl9wIChnZXRfaW5zbiAoKS0+cnRsICgpKSAmJiAq dGhpcyAhPSBtZXJnZV9pbmZvKQ0KLSAgICBnY2NfYXNzZXJ0ICh0aGlzLT5j b21wYXRpYmxlX3AgKG1lcmdlX2luZm8pDQotICYmICJDYW4ndCBtZXJnZSBp bmNvbXBhdGlibGUgZGVtYW5kZWQgaW5mb3MiKTsNCi0NCi0gIHZlY3Rvcl9p bnNuX2luZm8gbmV3X2luZm87DQotICBuZXdfaW5mby5zZXRfdmFsaWQgKCk7 DQotDQotICAvKiBGb3IgZ2xvYmFsIGRhdGEgZmxvdywgd2Ugc2hvdWxkIGtl ZXAgb3JpZ2luYWwgSU5TTiBhbmQgQVZMIGlmIHRoZXkNCi0gIHZhbGlkIHNp bmNlIHdlIHNob3VsZCBrZWVwIHRoZSBsaWZlIGluZm9ybWF0aW9uIG9mIGVh Y2ggYmxvY2suDQotDQotICBGb3IgZXhhbXBsZToNCi0gICAgYmIgMCAtPiBi YiAxLg0KLSAgV2Ugc2hvdWxkIGtlZXAgSU5TTiAmJiBBVkwgb2YgYmIgMSBz aW5jZSB3ZSB3aWxsIGV2ZW50dWFsbHkgZW1pdA0KLSAgdnNldHZsIGluc3Ry dWN0aW9uIGFjY29yZGluZyB0byBJTlNOIGFuZCBBVkwgb2YgYmIgMS4gICov DQotICBuZXdfaW5mby5mdXNlX2F2bCAoKnRoaXMsIG1lcmdlX2luZm8pOw0K LSAgLyogUmVjb21wdXRlIHRoZSBBVkwgc291cmNlIHdob3NlIGJsb2NrIGlu ZGV4IGlzIGVxdWFsIHRvIEJCX0lOREVYLiAgKi8NCi0gIGlmIChuZXdfaW5m by5nZXRfYXZsX3NvdXJjZSAoKQ0KLSAgICAgICYmIG5ld19pbmZvLmdldF9h dmxfc291cmNlICgpLT5pbnNuICgpLT5pc19waGkgKCkNCi0gICAgICAmJiBu ZXdfaW5mby5nZXRfYXZsX3NvdXJjZSAoKS0+YmIgKCktPmluZGV4ICgpICE9 IGJiX2luZGV4KQ0KLSAgICB7DQotICAgICAgaGFzaF9zZXQ8c2V0X2luZm8g Kj4gc2V0cw0KLSA9IGdldF9hbGxfc2V0cyAobmV3X2luZm8uZ2V0X2F2bF9z b3VyY2UgKCksIHRydWUsIHRydWUsIHRydWUpOw0KLSAgICAgIG5ld19pbmZv LnNldF9hdmxfc291cmNlIChudWxscHRyKTsNCi0gICAgICBib29sIGNhbl9m aW5kX3NldF9wID0gZmFsc2U7DQotICAgICAgc2V0X2luZm8gKmZpcnN0X3Nl dCA9IG51bGxwdHI7DQotICAgICAgZm9yIChzZXRfaW5mbyAqc2V0IDogc2V0 cykNCi0gew0KLSAgIGlmICghZmlyc3Rfc2V0KQ0KLSAgICAgZmlyc3Rfc2V0 ID0gc2V0Ow0KLSAgIGlmIChzZXQtPmJiICgpLT5pbmRleCAoKSA9PSBiYl9p bmRleCkNCi0gICAgIHsNCi0gICAgICAgZ2NjX2Fzc2VydCAoIWNhbl9maW5k X3NldF9wKTsNCi0gICAgICAgbmV3X2luZm8uc2V0X2F2bF9zb3VyY2UgKHNl dCk7DQotICAgICAgIGNhbl9maW5kX3NldF9wID0gdHJ1ZTsNCi0gICAgIH0N Ci0gfQ0KLSAgICAgIGlmICghY2FuX2ZpbmRfc2V0X3AgJiYgc2V0cy5lbGVt ZW50cyAoKSA9PSAxDQotICAgJiYgZmlyc3Rfc2V0LT5pbnNuICgpLT5pc19y ZWFsICgpKQ0KLSBuZXdfaW5mby5zZXRfYXZsX3NvdXJjZSAoZmlyc3Rfc2V0 KTsNCi0gICAgfQ0KLQ0KLSAgLyogTWFrZSBzdXJlIFZMTUFYIEFWTCBhbHdh eXMgaGFzIGEgc2V0X2luZm8gdGhlIGdldCBWTC4gICovDQotICBpZiAodmxt YXhfYXZsX3AgKG5ld19pbmZvLmdldF9hdmwgKCkpKQ0KLSAgICB7DQotICAg ICAgaWYgKHRoaXMtPmdldF9hdmxfc291cmNlICgpKQ0KLSBuZXdfaW5mby5z ZXRfYXZsX3NvdXJjZSAodGhpcy0+Z2V0X2F2bF9zb3VyY2UgKCkpOw0KLSAg ICAgIGVsc2UNCi0gew0KLSAgIGdjY19hc3NlcnQgKG1lcmdlX2luZm8uZ2V0 X2F2bF9zb3VyY2UgKCkpOw0KLSAgIG5ld19pbmZvLnNldF9hdmxfc291cmNl IChtZXJnZV9pbmZvLmdldF9hdmxfc291cmNlICgpKTsNCi0gfQ0KLSAgICB9 DQotDQotICBuZXdfaW5mby5mdXNlX3Nld19sbXVsICgqdGhpcywgbWVyZ2Vf aW5mbyk7DQotICBuZXdfaW5mby5mdXNlX3RhaWxfcG9saWN5ICgqdGhpcywg bWVyZ2VfaW5mbyk7DQotICBuZXdfaW5mby5mdXNlX21hc2tfcG9saWN5ICgq dGhpcywgbWVyZ2VfaW5mbyk7DQotICByZXR1cm4gbmV3X2luZm87DQotfQ0K LQ0KLS8qIFdyYXBwZXIgaGVscHMgdG8gcmV0dXJuIHRoZSBBVkwgb3IgVkwg b3BlcmFuZCBmb3IgdGhlDQotICAgdmVjdG9yX2luc25faW5mby4gUmV0dXJu IEFWTCBpZiB0aGUgQVZMIGlzIG5vdCBWTE1BWC4NCi0gICBPdGhlcndpc2Us IHJldHVybiB0aGUgVkwgb3BlcmFuZC4gICovDQotcnR4DQotdmVjdG9yX2lu c25faW5mbzo6Z2V0X2F2bF9vcl92bF9yZWcgKHZvaWQpIGNvbnN0DQotew0K LSAgZ2NjX2Fzc2VydCAoaGFzX2F2bF9yZWcgKCkpOw0KLSAgaWYgKCF2bG1h eF9hdmxfcCAoZ2V0X2F2bCAoKSkpDQotICAgIHJldHVybiBnZXRfYXZsICgp Ow0KLQ0KLSAgcnR4X2luc24gKnJpbnNuID0gZ2V0X2luc24gKCktPnJ0bCAo KTsNCi0gIGlmIChoYXNfdmxfb3AgKHJpbnNuKSB8fCB2c2V0dmxfaW5zbl9w IChyaW5zbikpDQotICAgIHsNCi0gICAgICBydHggdmwgPSA6OmdldF92bCAo cmluc24pOw0KLSAgICAgIC8qIEZvciBWTE1BWCwgd2Ugc2hvdWxkIG1ha2Ug c3VyZSB3ZSBnZXQgdGhlDQotIFJFRyB0byBlbWl0ICd2c2V0dmwgVkwsemVy bycgc2luY2UgdGhlICdWTCcNCi0gc2hvdWxkIGJlIHRoZSBSRUcgYWNjb3Jk aW5nIHRvIFJWViBJU0EuICAqLw0KLSAgICAgIGlmIChSRUdfUCAodmwpKQ0K LSByZXR1cm4gdmw7DQotICAgIH0NCi0NCi0gIC8qIFdlIGFsd2F5cyBoYXMg YXZsX3NvdXJjZSBpZiBpdCBpcyBWTE1BWCBBVkwuICAqLw0KLSAgZ2NjX2Fz c2VydCAoZ2V0X2F2bF9zb3VyY2UgKCkpOw0KLSAgcmV0dXJuIGdldF9hdmxf cmVnX3J0eCAoKTsNCi19DQorICAgIHNldF92YWxpZCAoKTsNCisNCisgICAg bV9hdmwgPSA6OmdldF9hdmwgKGluc24tPnJ0bCAoKSk7DQorICAgIGlmICht X2F2bCkNCisgICAgICB7DQorIGlmICh2c2V0dmxfaW5zbl9wIChpbnNuLT5y dGwgKCkpIHx8IGhhc192bG1heF9hdmwgKCkpDQorICAgbV92bCA9IDo6Z2V0 X3ZsIChpbnNuLT5ydGwgKCkpOw0KKw0KKyBpZiAoaGFzX3JlZ19hdmwgKCkp DQorICAgbV9hdmxfZGVmID0gZmluZF9hY2Nlc3MgKGluc24tPnVzZXMgKCks IFJFR05PIChtX2F2bCkpLT5kZWYgKCk7DQorICAgICAgfQ0KKw0KKyAgICBt X3NldyA9IDo6Z2V0X3NldyAoaW5zbi0+cnRsICgpKTsNCisgICAgbV92bG11 bCA9IDo6Z2V0X3ZsbXVsIChpbnNuLT5ydGwgKCkpOw0KKyAgICBtX3JhdGlv ID0gZ2V0X2F0dHJfcmF0aW8gKGluc24tPnJ0bCAoKSk7DQorICAgIC8qIHdo ZW4gZ2V0X2F0dHJfcmF0aW8gaXMgaW52YWxpZCwgdGhpcyBraW5kIG9mIGlu c3RydWN0aW9ucw0KKyAgICAgICBkb2Vzbid0IGNhcmUgYWJvdXQgcmF0aW8u IEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdGhpcyB2YWx1ZQ0KKyAgICAgICBp biBkZW1hbmQgaW5mbyBiYWNrd2FyZCBhbmFseXNpcy4gICovDQorICAgIGlm IChtX3JhdGlvID09IElOVkFMSURfQVRUUklCVVRFKQ0KKyAgICAgIG1fcmF0 aW8gPSBjYWxjdWxhdGVfcmF0aW8gKG1fc2V3LCBtX3ZsbXVsKTsNCisgICAg bV90YSA9IHRhaWxfYWdub3N0aWNfcCAoaW5zbi0+cnRsICgpKTsNCisgICAg bV9tYSA9IG1hc2tfYWdub3N0aWNfcCAoaW5zbi0+cnRsICgpKTsNCisNCisg ICAgLyogSWYgbWVyZ2Ugb3BlcmFuZCBpcyB1bmRlZiB2YWx1ZSwgd2UgcHJl ZmVyIGFnbm9zdGljLiAgKi8NCisgICAgaW50IG1lcmdlX29wX2lkeCA9IGdl dF9hdHRyX21lcmdlX29wX2lkeCAoaW5zbi0+cnRsICgpKTsNCisgICAgaWYg KG1lcmdlX29wX2lkeCAhPSBJTlZBTElEX0FUVFJJQlVURQ0KKyAmJiBzYXRp c2ZpZXNfY29uc3RyYWludF92dSAocmVjb2dfZGF0YS5vcGVyYW5kW21lcmdl X29wX2lkeF0pKQ0KKyAgICAgIHsNCisgbV90YSA9IHRydWU7DQorIG1fbWEg PSB0cnVlOw0KKyAgICAgIH0NCisNCisgICAgLyogRGV0ZXJtaW5lIHRoZSBk ZW1hbmQgaW5mbyBvZiB0aGUgUlZWIGluc24uICAqLw0KKyAgICBtX21heF9z ZXcgPSBnZXRfbWF4X2ludF9zZXcgKCk7DQorICAgIHVuc2lnbmVkIGRlbWFu ZF9mbGFncyA9IDA7DQorICAgIGlmICh2ZWN0b3JfY29uZmlnX2luc25fcCAo aW5zbi0+cnRsICgpKSkNCisgICAgICB7DQorIGRlbWFuZF9mbGFncyB8PSBk ZW1hbmRfZmxhZ3M6OkRFTUFORF9BVkxfUDsNCisgZGVtYW5kX2ZsYWdzIHw9 IGRlbWFuZF9mbGFnczo6REVNQU5EX1JBVElPX1A7DQorICAgICAgfQ0KKyAg ICBlbHNlDQorICAgICAgew0KKyBpZiAoaGFzX3ZsX29wIChpbnNuLT5ydGwg KCkpKQ0KKyAgIHsNCisgICAgIGlmIChzY2FsYXJfbW92ZV9pbnNuX3AgKGlu c24tPnJ0bCAoKSkpDQorICAgICAgIHsNCisgLyogSWYgdGhlIGF2bCBmb3Ig dm12LnMueCBjb21lcyBmcm9tIHRoZSB2c2V0dmwgaW5zdHJ1Y3Rpb24sIHdl DQorICAgIGRvbid0IGtub3cgaWYgdGhlIGF2bCBpcyBub24temVybywgc28g aXQgaXMgc2V0IHRvDQorICAgIERFTUFORF9BVkxfUCBmb3Igbm93LiBpdCBt YXkgYmUgY29ycmVjdGVkIHRvDQorICAgIERFTUFORF9OT05fWkVST19BVkxf UCBsYXRlciB3aGVuIG1vcmUgaW5mb3JtYXRpb24gaXMNCisgICAgYXZhaWxh YmxlLg0KKyAqLw0KKyBpZiAoaGFzX25vbl96ZXJvX2F2bCAoKSkNCisgICBk ZW1hbmRfZmxhZ3MgfD0gZGVtYW5kX2ZsYWdzOjpERU1BTkRfTk9OX1pFUk9f QVZMX1A7DQorIGVsc2UNCisgICBkZW1hbmRfZmxhZ3MgfD0gZGVtYW5kX2Zs YWdzOjpERU1BTkRfQVZMX1A7DQorICAgICAgIH0NCisgICAgIGVsc2UNCisg ICAgICAgZGVtYW5kX2ZsYWdzIHw9IGRlbWFuZF9mbGFnczo6REVNQU5EX0FW TF9QOw0KKyAgIH0NCiANCi1ib29sDQotdmVjdG9yX2luc25faW5mbzo6dXBk YXRlX2ZhdWx0X2ZpcnN0X2xvYWRfYXZsIChpbnNuX2luZm8gKmluc24pDQot ew0KLSAgLy8gVXBkYXRlIEFWTCB0byB2bC1vdXRwdXQgb2YgdGhlIGZhdWx0 IGZpcnN0IGxvYWQuDQotICBjb25zdCBpbnNuX2luZm8gKnJlYWRfdmwgPSBn ZXRfZm9yd2FyZF9yZWFkX3ZsX2luc24gKGluc24pOw0KLSAgaWYgKHJlYWRf dmwpDQotICAgIHsNCi0gICAgICBydHggdmwgPSBTRVRfREVTVCAoUEFUVEVS TiAocmVhZF92bC0+cnRsICgpKSk7DQotICAgICAgZGVmX2luZm8gKmRlZiA9 IGZpbmRfYWNjZXNzIChyZWFkX3ZsLT5kZWZzICgpLCBSRUdOTyAodmwpKTsN Ci0gICAgICBzZXRfaW5mbyAqc2V0ID0gc2FmZV9keW5fY2FzdDxzZXRfaW5m byAqPiAoZGVmKTsNCi0gICAgICBzZXRfYXZsX2luZm8gKGF2bF9pbmZvICh2 bCwgc2V0KSk7DQotICAgICAgc2V0X2luc24gKGluc24pOw0KLSAgICAgIHJl dHVybiB0cnVlOw0KLSAgICB9DQotICByZXR1cm4gZmFsc2U7DQotfQ0KKyBp ZiAoZ2V0X2F0dHJfcmF0aW8gKGluc24tPnJ0bCAoKSkgIT0gSU5WQUxJRF9B VFRSSUJVVEUpDQorICAgZGVtYW5kX2ZsYWdzIHw9IGRlbWFuZF9mbGFnczo6 REVNQU5EX1JBVElPX1A7DQorIGVsc2UNCisgICB7DQorICAgICBpZiAoc2Nh bGFyX21vdmVfaW5zbl9wIChpbnNuLT5ydGwgKCkpICYmIG1fdGEpDQorICAg ICAgIHsNCisgZGVtYW5kX2ZsYWdzIHw9IGRlbWFuZF9mbGFnczo6REVNQU5E X0dFX1NFV19QOw0KKyBtX21heF9zZXcgPSBnZXRfYXR0cl90eXBlIChpbnNu LT5ydGwgKCkpID09IFRZUEVfVkZNT1ZGVg0KKyAgICAgICA/IGdldF9tYXhf ZmxvYXRfc2V3ICgpDQorICAgICAgIDogZ2V0X21heF9pbnRfc2V3ICgpOw0K KyAgICAgICB9DQorICAgICBlbHNlDQorICAgICAgIGRlbWFuZF9mbGFncyB8 PSBkZW1hbmRfZmxhZ3M6OkRFTUFORF9TRVdfUDsNCisNCisgICAgIGlmICgh aWdub3JlX3ZsbXVsX2luc25fcCAoaW5zbi0+cnRsICgpKSkNCisgICAgICAg ZGVtYW5kX2ZsYWdzIHw9IGRlbWFuZF9mbGFnczo6REVNQU5EX0xNVUxfUDsN CisgICB9DQogDQotc3RhdGljIGNvbnN0IGNoYXIgKg0KLXZsbXVsX3RvX3N0 ciAodmxtdWxfdHlwZSB2bG11bCkNCi17DQotICBzd2l0Y2ggKHZsbXVsKQ0K LSAgICB7DQotICAgIGNhc2UgTE1VTF8xOg0KLSAgICAgIHJldHVybiAibTEi Ow0KLSAgICBjYXNlIExNVUxfMjoNCi0gICAgICByZXR1cm4gIm0yIjsNCi0g ICAgY2FzZSBMTVVMXzQ6DQotICAgICAgcmV0dXJuICJtNCI7DQotICAgIGNh c2UgTE1VTF84Og0KLSAgICAgIHJldHVybiAibTgiOw0KLSAgICBjYXNlIExN VUxfUkVTRVJWRUQ6DQotICAgICAgcmV0dXJuICJJTlZBTElEIExNVUwiOw0K LSAgICBjYXNlIExNVUxfRjg6DQotICAgICAgcmV0dXJuICJtZjgiOw0KLSAg ICBjYXNlIExNVUxfRjQ6DQotICAgICAgcmV0dXJuICJtZjQiOw0KLSAgICBj YXNlIExNVUxfRjI6DQotICAgICAgcmV0dXJuICJtZjIiOw0KKyBpZiAoIW1f dGEpDQorICAgZGVtYW5kX2ZsYWdzIHw9IGRlbWFuZF9mbGFnczo6REVNQU5E X1RBSUxfUE9MSUNZX1A7DQorIGlmICghbV9tYSkNCisgICBkZW1hbmRfZmxh Z3MgfD0gZGVtYW5kX2ZsYWdzOjpERU1BTkRfTUFTS19QT0xJQ1lfUDsNCisg ICAgICB9DQorDQorICAgIG5vcm1hbGl6ZV9kZW1hbmQgKGRlbWFuZF9mbGFn cyk7DQorDQorICAgIC8qIE9wdGltaXplIEFWTCBmcm9tIHRoZSB2c2V0dmwg aW5zdHJ1Y3Rpb24uICAqLw0KKyAgICBpbnNuX2luZm8gKmRlZl9pbnNuID0g ZXh0cmFjdF9zaW5nbGVfc291cmNlIChnZXRfYXZsX2RlZiAoKSk7DQorICAg IGlmIChkZWZfaW5zbiAmJiB2c2V0dmxfaW5zbl9wIChkZWZfaW5zbi0+cnRs ICgpKSkNCisgICAgICB7DQorIHZzZXR2bF9pbmZvIGRlZl9pbmZvID0gdnNl dHZsX2luZm8gKGRlZl9pbnNuKTsNCisgaWYgKChzY2FsYXJfbW92ZV9pbnNu X3AgKGluc24tPnJ0bCAoKSkNCisgICAgICB8fCBkZWZfaW5mby5nZXRfcmF0 aW8gKCkgPT0gZ2V0X3JhdGlvICgpKQ0KKyAgICAgJiYgKGRlZl9pbmZvLmhh c192bG1heF9hdmwgKCkgfHwgZGVmX2luZm8uaGFzX2ltbV9hdmwgKCkpKQ0K KyAgIHsNCisgICAgIHVwZGF0ZV9hdmwgKGRlZl9pbmZvKTsNCisgICAgIGlm IChzY2FsYXJfbW92ZV9pbnNuX3AgKGluc24tPnJ0bCAoKSkgJiYgaGFzX25v bl96ZXJvX2F2bCAoKSkNCisgICAgICAgbV9hdmxfZGVtYW5kID0gYXZsX2Rl bWFuZF90eXBlOjpub25femVyb19hdmw7DQorICAgfQ0KKyAgICAgIH0NCisN CisgICAgLyogRGV0ZXJtaW5lIGlmIGRlc3Qgb3BlcmFuZCh2bCkgaGFzIGJl ZW4gdXNlZCBieSBub24tUlZWIGluc3RydWN0aW9ucy4gICovDQorICAgIGlm IChoYXNfcmVnX3ZsICgpKQ0KKyAgICAgIHsNCisgY29uc3QgaGFzaF9zZXQ8 dXNlX2luZm8gKj4gdmxfdXNlcw0KKyAgID0gZ2V0X2FsbF9yZWFsX3VzZXMg KGdldF9pbnNuICgpLCBSRUdOTyAoZ2V0X3ZsICgpKSk7DQorIGZvciAodXNl X2luZm8gKnVzZSA6IHZsX3VzZXMpDQorICAgew0KKyAgICAgZ2NjX2Fzc2Vy dCAodXNlLT5pbnNuICgpLT5pc19yZWFsICgpKTsNCisgICAgIHJ0eF9pbnNu ICpyaW5zbiA9IHVzZS0+aW5zbiAoKS0+cnRsICgpOw0KKyAgICAgaWYgKCFo YXNfdmxfb3AgKHJpbnNuKQ0KKyB8fCBjb3VudF9yZWdub19vY2N1cnJlbmNl cyAocmluc24sIFJFR05PIChnZXRfdmwgKCkpKSAhPSAxKQ0KKyAgICAgICB7 DQorIHVzZV9ieV9ub25fcnZ2X2luc24gPSB0cnVlOw0KKyBicmVhazsNCisg ICAgICAgfQ0KKyAgICAgcnR4IGF2bCA9IDo6Z2V0X2F2bCAocmluc24pOw0K KyAgICAgaWYgKCFhdmwgfHwgUkVHTk8gKGdldF92bCAoKSkgIT0gUkVHTk8g KGF2bCkpDQorICAgICAgIHsNCisgdXNlX2J5X25vbl9ydnZfaW5zbiA9IHRy dWU7DQorIGJyZWFrOw0KKyAgICAgICB9DQorICAgfQ0KKyAgICAgIH0NCiAN Ci0gICAgZGVmYXVsdDoNCisgICAgLyogQ29sbGVjdCB0aGUgcmVhZCB2bCBp bnNuIGZvciB0aGUgZmF1bHQtb25seS1maXJzdCBydnYgbG9hZHMuICAqLw0K KyAgICBpZiAoZmF1bHRfZmlyc3RfbG9hZF9wIChpbnNuLT5ydGwgKCkpKQ0K KyAgICAgIHsNCisgZm9yIChpbnNuX2luZm8gKmkgPSBpbnNuLT5uZXh0X25v bmRlYnVnX2luc24gKCk7DQorICAgICAgaS0+YmIgKCkgPT0gaW5zbi0+YmIg KCk7IGkgPSBpLT5uZXh0X25vbmRlYnVnX2luc24gKCkpDQorICAgew0KKyAg ICAgaWYgKGZpbmRfYWNjZXNzIChpLT5kZWZzICgpLCBWTF9SRUdOVU0pKQ0K KyAgICAgICBicmVhazsNCisgICAgIGlmIChpLT5ydGwgKCkgJiYgcmVhZF92 bF9pbnNuX3AgKGktPnJ0bCAoKSkpDQorICAgICAgIHsNCisgbV9yZWFkX3Zs X2luc24gPSBpOw0KKyBicmVhazsNCisgICAgICAgfQ0KKyAgIH0NCisgICAg ICB9DQorICB9DQorDQorICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IHZzZXR2 bF9pbmZvICZvdGhlcikgY29uc3QNCisgIHsNCisgICAgZ2NjX2Fzc2VydCAo IXVuaW5pdF9wICgpICYmICFvdGhlci51bmluaXRfcCAoKQ0KKyAmJiAiVW5p bml0aWFsaXphdGlvbiBzaG91bGQgbm90IGhhcHBlbiIpOw0KKw0KKyAgICBp ZiAoZW1wdHlfcCAoKSkNCisgICAgICByZXR1cm4gb3RoZXIuZW1wdHlfcCAo KTsNCisgICAgaWYgKHVua25vd25fcCAoKSkNCisgICAgICByZXR1cm4gb3Ro ZXIudW5rbm93bl9wICgpOw0KKw0KKyAgICByZXR1cm4gZ2V0X2luc24gKCkg PT0gb3RoZXIuZ2V0X2luc24gKCkgJiYgZ2V0X2JiICgpID09IG90aGVyLmdl dF9iYiAoKQ0KKyAgICAmJiBnZXRfYXZsICgpID09IG90aGVyLmdldF9hdmwg KCkgJiYgZ2V0X3ZsICgpID09IG90aGVyLmdldF92bCAoKQ0KKyAgICAmJiBn ZXRfYXZsX2RlZiAoKSA9PSBvdGhlci5nZXRfYXZsX2RlZiAoKQ0KKyAgICAm JiBnZXRfc2V3ICgpID09IG90aGVyLmdldF9zZXcgKCkNCisgICAgJiYgZ2V0 X3ZsbXVsICgpID09IG90aGVyLmdldF92bG11bCAoKSAmJiBnZXRfdGEgKCkg PT0gb3RoZXIuZ2V0X3RhICgpDQorICAgICYmIGdldF9tYSAoKSA9PSBvdGhl ci5nZXRfbWEgKCkNCisgICAgJiYgZ2V0X2F2bF9kZW1hbmQgKCkgPT0gb3Ro ZXIuZ2V0X2F2bF9kZW1hbmQgKCkNCisgICAgJiYgZ2V0X3Nld19sbXVsX2Rl bWFuZCAoKSA9PSBvdGhlci5nZXRfc2V3X2xtdWxfZGVtYW5kICgpDQorICAg ICYmIGdldF9wb2xpY3lfZGVtYW5kICgpID09IG90aGVyLmdldF9wb2xpY3lf ZGVtYW5kICgpOw0KKyAgfQ0KKw0KKyAgdm9pZCBkdW1wIChGSUxFICpmaWxl LCBjb25zdCBjaGFyICppbmRlbnQgPSAiIikgY29uc3QNCisgIHsNCisgICAg aWYgKHVuaW5pdF9wICgpKQ0KKyAgICAgIHsNCisgZnByaW50ZiAoZmlsZSwg IlVOSU5JVElBTElaRUQuXG4iKTsNCisgcmV0dXJuOw0KKyAgICAgIH0NCisg ICAgZWxzZSBpZiAodW5rbm93bl9wICgpKQ0KKyAgICAgIHsNCisgZnByaW50 ZiAoZmlsZSwgIlVOS05PV04uXG4iKTsNCisgcmV0dXJuOw0KKyAgICAgIH0N CisgICAgZWxzZSBpZiAoZW1wdHlfcCAoKSkNCisgICAgICB7DQorIGZwcmlu dGYgKGZpbGUsICJFTVBUWS5cbiIpOw0KKyByZXR1cm47DQorICAgICAgfQ0K KyAgICBlbHNlIGlmICh2YWxpZF9wICgpKQ0KKyAgICAgIGZwcmludGYgKGZp bGUsICJWQUxJRCAoaW5zbiAldSwgYmIgJXUpJXNcbiIsIGdldF9pbnNuICgp LT51aWQgKCksDQorICAgICAgICBnZXRfYmIgKCktPmluZGV4ICgpLCBpZ25v cmVfcCAoKSA/ICIgKGlnbm9yZSkiIDogIiIpOw0KKyAgICBlbHNlDQogICAg ICAgZ2NjX3VucmVhY2hhYmxlICgpOw0KLSAgICB9DQotfQ0KLQ0KLXN0YXRp YyBjb25zdCBjaGFyICoNCi1wb2xpY3lfdG9fc3RyIChib29sIGFnbm9zdGlj X3ApDQotew0KLSAgcmV0dXJuIGFnbm9zdGljX3AgPyAiYWdub3N0aWMiIDog InVuZGlzdHVyYmVkIjsNCi19DQogDQotdm9pZA0KLXZlY3Rvcl9pbnNuX2lu Zm86OmR1bXAgKEZJTEUgKmZpbGUpIGNvbnN0DQotew0KLSAgZnByaW50ZiAo ZmlsZSwgIlsiKTsNCi0gIGlmICh1bmluaXRfcCAoKSkNCi0gICAgZnByaW50 ZiAoZmlsZSwgIlVOSU5JVElBTElaRUQsIik7DQotICBlbHNlIGlmICh2YWxp ZF9wICgpKQ0KLSAgICBmcHJpbnRmIChmaWxlLCAiVkFMSUQsIik7DQotICBl bHNlIGlmICh1bmtub3duX3AgKCkpDQotICAgIGZwcmludGYgKGZpbGUsICJV TktOT1dOLCIpOw0KLSAgZWxzZSBpZiAoZW1wdHlfcCAoKSkNCi0gICAgZnBy aW50ZiAoZmlsZSwgIkVNUFRZLCIpOw0KLSAgZWxzZQ0KLSAgICBmcHJpbnRm IChmaWxlLCAiRElSVFksIik7DQotDQotICBmcHJpbnRmIChmaWxlLCAiRGVt YW5kIGZpZWxkPXslZChWTCksIiwgZGVtYW5kX3AgKERFTUFORF9BVkwpKTsN Ci0gIGZwcmludGYgKGZpbGUsICIlZChERU1BTkRfTk9OWkVST19BVkwpLCIs IGRlbWFuZF9wIChERU1BTkRfTk9OWkVST19BVkwpKTsNCi0gIGZwcmludGYg KGZpbGUsICIlZChTRVcpLCIsIGRlbWFuZF9wIChERU1BTkRfU0VXKSk7DQot ICBmcHJpbnRmIChmaWxlLCAiJWQoREVNQU5EX0dFX1NFVyksIiwgZGVtYW5k X3AgKERFTUFORF9HRV9TRVcpKTsNCi0gIGZwcmludGYgKGZpbGUsICIlZChM TVVMKSwiLCBkZW1hbmRfcCAoREVNQU5EX0xNVUwpKTsNCi0gIGZwcmludGYg KGZpbGUsICIlZChSQVRJTyksIiwgZGVtYW5kX3AgKERFTUFORF9SQVRJTykp Ow0KLSAgZnByaW50ZiAoZmlsZSwgIiVkKFRBSUxfUE9MSUNZKSwiLCBkZW1h bmRfcCAoREVNQU5EX1RBSUxfUE9MSUNZKSk7DQotICBmcHJpbnRmIChmaWxl LCAiJWQoTUFTS19QT0xJQ1kpfVxuIiwgZGVtYW5kX3AgKERFTUFORF9NQVNL X1BPTElDWSkpOw0KLQ0KLSAgZnByaW50ZiAoZmlsZSwgIkFWTD0iKTsNCi0g IHByaW50X3J0bF9zaW5nbGUgKGZpbGUsIGdldF9hdmwgKCkpOw0KLSAgZnBy aW50ZiAoZmlsZSwgIlNFVz0lZCwiLCBnZXRfc2V3ICgpKTsNCi0gIGZwcmlu dGYgKGZpbGUsICJWTE1VTD0lcywiLCB2bG11bF90b19zdHIgKGdldF92bG11 bCAoKSkpOw0KLSAgZnByaW50ZiAoZmlsZSwgIlJBVElPPSVkLCIsIGdldF9y YXRpbyAoKSk7DQotICBmcHJpbnRmIChmaWxlLCAiVEFJTF9QT0xJQ1k9JXMs IiwgcG9saWN5X3RvX3N0ciAoZ2V0X3RhICgpKSk7DQotICBmcHJpbnRmIChm aWxlLCAiTUFTS19QT0xJQ1k9JXMiLCBwb2xpY3lfdG9fc3RyIChnZXRfbWEg KCkpKTsNCi0gIGZwcmludGYgKGZpbGUsICJdXG4iKTsNCi0NCi0gIGlmICh2 YWxpZF9wICgpKQ0KLSAgICB7DQotICAgICAgaWYgKGdldF9pbnNuICgpKQ0K LSB7DQotICAgZnByaW50ZiAoZmlsZSwgIlRoZSByZWFsIElOU049Iik7DQot ICAgcHJpbnRfcnRsX3NpbmdsZSAoZmlsZSwgZ2V0X2luc24gKCktPnJ0bCAo KSk7DQotIH0NCi0gICAgfQ0KLX0NCisgICAgZnByaW50ZiAoZmlsZSwgIiVz RGVtYW5kIGZpZWxkczoiLCBpbmRlbnQpOw0KKyAgICBpZiAobV9zZXdfbG11 bF9kZW1hbmQgPT0gc2V3X2xtdWxfZGVtYW5kX3R5cGU6OnNld19sbXVsKQ0K KyAgICAgIGZwcmludGYgKGZpbGUsICIgZGVtYW5kX3Nld19sbXVsIik7DQor ICAgIGVsc2UgaWYgKG1fc2V3X2xtdWxfZGVtYW5kID09IHNld19sbXVsX2Rl bWFuZF90eXBlOjpyYXRpb19vbmx5KQ0KKyAgICAgIGZwcmludGYgKGZpbGUs ICIgZGVtYW5kX3JhdGlvX29ubHkiKTsNCisgICAgZWxzZSBpZiAobV9zZXdf bG11bF9kZW1hbmQgPT0gc2V3X2xtdWxfZGVtYW5kX3R5cGU6OnNld19vbmx5 KQ0KKyAgICAgIGZwcmludGYgKGZpbGUsICIgZGVtYW5kX3Nld19vbmx5Iik7 DQorICAgIGVsc2UgaWYgKG1fc2V3X2xtdWxfZGVtYW5kID09IHNld19sbXVs X2RlbWFuZF90eXBlOjpnZV9zZXcpDQorICAgICAgZnByaW50ZiAoZmlsZSwg IiBkZW1hbmRfZ2Vfc2V3Iik7DQorICAgIGVsc2UgaWYgKG1fc2V3X2xtdWxf ZGVtYW5kID09IHNld19sbXVsX2RlbWFuZF90eXBlOjpyYXRpb19hbmRfZ2Vf c2V3KQ0KKyAgICAgIGZwcmludGYgKGZpbGUsICIgZGVtYW5kX3JhdGlvX2Fu ZF9nZV9zZXciKTsNCisNCisgICAgaWYgKG1fcG9saWN5X2RlbWFuZCA9PSBw b2xpY3lfZGVtYW5kX3R5cGU6OnRhaWxfbWFza19wb2xpY3kpDQorICAgICAg ZnByaW50ZiAoZmlsZSwgIiBkZW1hbmRfdGFpbF9tYXNrX3BvbGljeSIpOw0K KyAgICBlbHNlIGlmIChtX3BvbGljeV9kZW1hbmQgPT0gcG9saWN5X2RlbWFu ZF90eXBlOjp0YWlsX3BvbGljeV9vbmx5KQ0KKyAgICAgIGZwcmludGYgKGZp bGUsICIgZGVtYW5kX3RhaWxfcG9saWN5X29ubHkiKTsNCisgICAgZWxzZSBp ZiAobV9wb2xpY3lfZGVtYW5kID09IHBvbGljeV9kZW1hbmRfdHlwZTo6bWFz a19wb2xpY3lfb25seSkNCisgICAgICBmcHJpbnRmIChmaWxlLCAiIGRlbWFu ZF9tYXNrX3BvbGljeV9vbmx5Iik7DQorDQorICAgIGlmIChtX2F2bF9kZW1h bmQgPT0gYXZsX2RlbWFuZF90eXBlOjphdmwpDQorICAgICAgZnByaW50ZiAo ZmlsZSwgIiBkZW1hbmRfYXZsIik7DQorICAgIGVsc2UgaWYgKG1fYXZsX2Rl bWFuZCA9PSBhdmxfZGVtYW5kX3R5cGU6Om5vbl96ZXJvX2F2bCkNCisgICAg ICBmcHJpbnRmIChmaWxlLCAiIGRlbWFuZF9ub25femVyb19hdmwiKTsNCisg ICAgZnByaW50ZiAoZmlsZSwgIlxuIik7DQorDQorICAgIGZwcmludGYgKGZp bGUsICIlc1NFVz0lZCwgIiwgaW5kZW50LCBnZXRfc2V3ICgpKTsNCisgICAg ZnByaW50ZiAoZmlsZSwgIlZMTVVMPSVzLCAiLCB2bG11bF90b19zdHIgKGdl dF92bG11bCAoKSkpOw0KKyAgICBmcHJpbnRmIChmaWxlLCAiUkFUSU89JWQs ICIsIGdldF9yYXRpbyAoKSk7DQorICAgIGZwcmludGYgKGZpbGUsICJNQVhf U0VXPSVkXG4iLCBnZXRfbWF4X3NldyAoKSk7DQorDQorICAgIGZwcmludGYg KGZpbGUsICIlc1RBSUxfUE9MSUNZPSVzLCAiLCBpbmRlbnQsIHBvbGljeV90 b19zdHIgKGdldF90YSAoKSkpOw0KKyAgICBmcHJpbnRmIChmaWxlLCAiTUFT S19QT0xJQ1k9JXNcbiIsIHBvbGljeV90b19zdHIgKGdldF9tYSAoKSkpOw0K Kw0KKyAgICBmcHJpbnRmIChmaWxlLCAiJXNBVkw9IiwgaW5kZW50KTsNCisg ICAgcHJpbnRfcnRsX3NpbmdsZSAoZmlsZSwgZ2V0X2F2bCAoKSk7DQorICAg IGZwcmludGYgKGZpbGUsICIlc1ZMPSIsIGluZGVudCk7DQorICAgIHByaW50 X3J0bF9zaW5nbGUgKGZpbGUsIGdldF92bCAoKSk7DQorICAgIGlmIChjaGFu Z2VfdnR5cGVfb25seV9wICgpKQ0KKyAgICAgIGZwcmludGYgKGZpbGUsICIl c2NoYW5nZSB2dHlwZSBvbmx5XG4iLCBpbmRlbnQpOw0KKyAgICBpZiAoZ2V0 X3JlYWRfdmxfaW5zbiAoKSkNCisgICAgICBmcHJpbnRmIChmaWxlLCAiJXNy ZWFkX3ZsX2luc246IGluc24gJXVcbiIsIGluZGVudCwNCisgICAgICAgIGdl dF9yZWFkX3ZsX2luc24gKCktPnVpZCAoKSk7DQorICAgIGlmICh1c2VfYnlf bm9uX3J2dl9pbnNuX3AgKCkpDQorICAgICAgZnByaW50ZiAoZmlsZSwgIiVz dXNlX2J5X25vbl9ydnZfaW5zbj10cnVlXG4iLCBpbmRlbnQpOw0KKyAgfQ0K K307DQogDQp2ZWN0b3JfaW5mb3NfbWFuYWdlcjo6dmVjdG9yX2luZm9zX21h bmFnZXIgKCkNCnsNCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL3Jpc2N2L3Jp c2N2LXZzZXR2bC5oIGIvZ2NjL2NvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwu aA0KaW5kZXggNTM1NDlhYmZhYzUuLjllYWIyNzYxOTBlIDEwMDY0NA0KLS0t IGEvZ2NjL2NvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwuaA0KKysrIGIvZ2Nj L2NvbmZpZy9yaXNjdi9yaXNjdi12c2V0dmwuaA0KQEAgLTgyLDI2NyArODIs NiBAQCBlbnVtIGRlZl90eXBlDQogICBDTE9CQkVSX0RFRiA9IDEgPDwgNA0K fTsNCiANCi0vKiBBVkwgaW5mbyBmb3IgUlZWIGluc3RydWN0aW9uLiBNb3N0 IFJWViBpbnN0cnVjdGlvbnMgaGF2ZSBBVkwgb3BlcmFuZCBpbg0KLSAgIGlt cGxpY2l0IGRlcGVuZGVuY3kuIFRoZSBBVkwgY29tcGFyaXNvbiBiZXR3ZWVu IDIgUlZWIGluc3RydWN0aW9ucyBpcw0KLSAgIHZlcnkgaW1wb3J0YW50IHNp bmNlIGl0IGFmZmVjdHMgb3VyIGRlY2lzaW9uIHdoZXRoZXIgd2Ugc2hvdWxk IGluc2VydA0KLSAgIGEgdnNldHZsIGluc3RydWN0aW9uIGluIHRoaXMgc2l0 dWF0aW9uLiBBVkwgb3BlcmFuZCBvZiBhbGwgUlZWIGluc3RydWN0aW9ucw0K LSAgIGNhbiBvbmx5IGJlIGVpdGhlciBhIGNvbnN0X2ludCB2YWx1ZSB3aXRo IDwgMzIgb3IgYSByZWcgdmFsdWUgd2hpY2ggY2FuIGJlDQotICAgZGVmaW5l IGJ5IGVpdGhlciBhIHJlYWwgUlRMIGluc3RydWN0aW9uIG9yIGEgUEhJIGlu c3RydWN0aW9uLiBTbyB3ZSBuZWVkIGENCi0gICBzdGFuZGFsb25lIG1ldGhv ZCB0byBkZWZpbmUgQVZMIGNvbXBhcmlzb24gYW5kIHdlIGNhbiBub3Qgc2lt cGlseSB1c2UNCi0gICBvcGVyYXRvciAiPT0iIHRvIGNvbXBhcmUgMiBSVFgg dmFsdWUgc2luY2UgaXQncyB0byBzdHJpY3Qgd2hpY2ggd2lsbCBtYWtlDQot ICAgdXNlIG1pc3MgYSBsb3Qgb2Ygb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRp ZXMuIFRoaXMgbWV0aG9kIGhhbmRsZSB0aGVzZQ0KLSAgIGZvbGxvd2luZyBj YXNlczoNCi0NCi0gICAgIC0gIEJhY2tncm91bmQ6DQotICAgSW5zZXJ0LXZz ZXR2bCBQQVNTIGlzIHdvcmtpbmcgYWZ0ZXIgUkEuDQotDQotICAgICAtICBU ZXJtaW5vbG9neToNCi0gICAtIHByOiBQc2V1ZG8tcmVnaXN0ZXIuDQotICAg LSBocjogSGFyZHdhcmUtcmVnaXN0ZXIuDQotDQotICAgICAtICBDYXNlIDE6 DQotDQotIEJlZm9yZSBSQToNCi0gICBsaSBwcjEzOCwxMw0KLSAgIGluc24x IChpbXBsaWNpdCBkZXBlbmQgb24gcHIxMzgpLg0KLSAgIGxpIHByMTM4LDE0 DQotICAgaW5zbjIgKGltcGxpY2l0IGRlcGVuZCBvbiBwcjEzOSkuDQotDQot IEFmdGVyIFJBOg0KLSAgIGxpIGhyNSwxMw0KLSAgIGluc24xIChpbXBsaWNp dCBkZXBlbmQgb24gaHI1KS4NCi0gICBsaSBocjUsMTQNCi0gICBpbnNuMiAo aW1wbGljaXQgZGVwZW5kIG9uIGhyNSkuDQotDQotIENvcnJlY3QgSVIgYWZ0 ZXIgdnNldHZsIFBBU1M6DQotICAgbGkgaHI1LDEzDQotICAgdnNldHZsMSB6 ZXJvLGhyNS4uLi4NCi0gICBpbnNuMSAoaW1wbGljaXQgZGVwZW5kIG9uIGhy NSkuDQotICAgbGkgaHI1LDE0DQotICAgdnNldHZsMiB6ZXJvLGhyNS4uLi4N Ci0gICBpbnNuMiAoaW1wbGljaXQgZGVwZW5kIG9uIGhyNSkuDQotDQotICAg ICBJbiB0aGlzIGNhc2UsIGJvdGggaW5zbjEgYW5kIGluc24yIGFyZSB1c2lu ZyBocjUgYXMgdGhlIHNhbWUgQVZMLg0KLSAgICAgSWYgd2UgdXNlICJydHhf ZXF1YWxfcCIgb3IgIlJFR05PIChBVkwxKSA9PSBSRUdOTyAoQVZMKSIsIHdl IHdpbGwgZW5kDQotICAgICB1cCB3aXRoIG1pc3NpbmcgdGhlIHZzZXR2bDIg aW5zdHJ1Y3Rpb24gd2hpY2ggY3JlYXRlcyB3cm9uZyByZXN1bHQuDQotDQot ICAgICBOb3RlOiBVc2luZyAiPT0iIG9wZXJhdG9yIHRvIGNvbXBhcmUgMiBB VkwgUlRYIHN0cmljdGx5IGNhbiBmaXggdGhpcw0KLSAgICAgaXNzdWUuIEhv d2V2ZXIsIGl0IGlzIGEgdG9vIHN0cmljdCBjb21wYXJpc29uIG1ldGhvZCBz aW5jZSBub3QgYWxsIG1lbWJlcg0KLSAgICAgdmFyaWFibGVzIGluIFJUWCBk YXRhIHN0cnVjdHVyZSBhcmUgbm90IG5lY2Nlc3NhcnkgdG8gYmUgdGhlIHNh bWUuIEl0IHdpbGwNCi0gICAgIG1ha2UgdXMgbWlzcyBhIGxvdCBvZiBvcHRp bWl6YXRpb24gb3Bwb3J0dW5pdGllcy4NCi0NCi0gICAgIC0gIENhc2UgMjoN Ci0NCi0gQWZ0ZXIgUkE6DQotIGJiIDA6DQotICAgbGkgaHI1LDEzDQotIGJi IDE6DQotICAgbGkgaHI1LDE0DQotIGJiMjoNCi0gICBpbnNuMSAoaW1wbGlj aXQgZGVwZW5kIG9uIGhyNSkuDQotICAgaW5zbjIgKGltcGxpY2l0IGRlcGVu ZCBvbiBocjUpLg0KLQ0KLSAgICAgSW4gdGhpcyBjYXNlLCB3ZSBtYXkgZW5k IHVwIHdpdGggZGlmZmVyZW50IEFWTCBSVFggYW5kIHByb2R1Y2UgcmVkdW5k YW50DQotICAgICB2c2V0dmwgaW5zdHJ1Y3Rpb24uDQotDQotICAgICBWQUxV RSBpcyB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBpbiBlYWNoIFJWViBpbnN0 cnVjdGlvbi4NCi0gICAgIFNPVVJDRSBpcyB0aGUgc291cmNlIGRlZmluaXRp b24gaW5mb3JtYXRpb24gb2YgQVZMIG9wZXJhbmQuICAqLw0KLWNsYXNzIGF2 bF9pbmZvDQotew0KLXByaXZhdGU6DQotICBydHggbV92YWx1ZTsNCi0gIHJ0 bF9zc2E6OnNldF9pbmZvICptX3NvdXJjZTsNCi0NCi1wdWJsaWM6DQotICBh dmxfaW5mbyAoKSA6IG1fdmFsdWUgKE5VTExfUlRYKSwgbV9zb3VyY2UgKG51 bGxwdHIpIHt9DQotICBhdmxfaW5mbyAoY29uc3QgYXZsX2luZm8gJik7DQot ICBhdmxfaW5mbyAocnR4LCBydGxfc3NhOjpzZXRfaW5mbyAqKTsNCi0gIHJ0 eCBnZXRfdmFsdWUgKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQ0KLSAg cnRsX3NzYTo6c2V0X2luZm8gKmdldF9zb3VyY2UgKCkgY29uc3QgeyByZXR1 cm4gbV9zb3VyY2U7IH0NCi0gIHZvaWQgc2V0X3NvdXJjZSAocnRsX3NzYTo6 c2V0X2luZm8gKnNldCkgeyBtX3NvdXJjZSA9IHNldDsgfQ0KLSAgYm9vbCBz aW5nbGVfc291cmNlX2VxdWFsX3AgKGNvbnN0IGF2bF9pbmZvICYpIGNvbnN0 Ow0KLSAgYm9vbCBtdWx0aXBsZV9zb3VyY2VfZXF1YWxfcCAoY29uc3QgYXZs X2luZm8gJikgY29uc3Q7DQotICBhdmxfaW5mbyAmb3BlcmF0b3I9IChjb25z dCBhdmxfaW5mbyAmKTsNCi0gIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgYXZs X2luZm8gJikgY29uc3Q7DQotICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGF2 bF9pbmZvICYpIGNvbnN0Ow0KLQ0KLSAgYm9vbCBoYXNfYXZsX2ltbSAoKSBj b25zdA0KLSAgew0KLSAgICByZXR1cm4gZ2V0X3ZhbHVlICgpICYmIENPTlNU X0lOVF9QIChnZXRfdmFsdWUgKCkpOw0KLSAgfQ0KLSAgYm9vbCBoYXNfYXZs X3JlZyAoKSBjb25zdCB7IHJldHVybiBnZXRfdmFsdWUgKCkgJiYgUkVHX1Ag KGdldF92YWx1ZSAoKSk7IH0NCi0gIGJvb2wgaGFzX2F2bF9ub19yZWcgKCkg Y29uc3QgeyByZXR1cm4gIWdldF92YWx1ZSAoKTsgfQ0KLSAgYm9vbCBoYXNf bm9uX3plcm9fYXZsICgpIGNvbnN0Ow0KLSAgYm9vbCBoYXNfYXZsICgpIGNv bnN0IHsgcmV0dXJuIGdldF92YWx1ZSAoKTsgfQ0KLX07DQotDQotLyogQmFz aWMgc3RydWN0dXJlIHRvIHNhdmUgVkwvVlRZUEUgaW5mb3JtYXRpb24uICAq Lw0KLXN0cnVjdCB2bF92dHlwZV9pbmZvDQotew0KLXByb3RlY3RlZDoNCi0g IC8qIEFWTCBjYW4gYmUgZWl0aGVyIHJlZ2lzdGVyIG9yIGNvbnN0X2ludC4g ICovDQotICBhdmxfaW5mbyBtX2F2bDsNCi0gIC8qIEZpZWxkcyBmcm9tIFZU WVBFLiBUaGUgVlRZUEUgY2hlY2tpbmcgZGVwZW5kIG9uIHRoZSBmbGFnDQot ICAgICBkZW1fKiBiZWZvcmUuICAqLw0KLSAgdWludDhfdCBtX3NldzsNCi0g IHJpc2N2X3ZlY3Rvcjo6dmxtdWxfdHlwZSBtX3ZsbXVsOw0KLSAgdWludDhf dCBtX3JhdGlvOw0KLSAgYm9vbCBtX3RhOw0KLSAgYm9vbCBtX21hOw0KLQ0K LXB1YmxpYzoNCi0gIHZvaWQgc2V0X3NldyAodWludDhfdCBzZXcpIHsgbV9z ZXcgPSBzZXc7IH0NCi0gIHZvaWQgc2V0X3ZsbXVsIChyaXNjdl92ZWN0b3I6 OnZsbXVsX3R5cGUgdmxtdWwpIHsgbV92bG11bCA9IHZsbXVsOyB9DQotICB2 b2lkIHNldF9yYXRpbyAodWludDhfdCByYXRpbykgeyBtX3JhdGlvID0gcmF0 aW87IH0NCi0gIHZvaWQgc2V0X3RhIChib29sIHRhKSB7IG1fdGEgPSB0YTsg fQ0KLSAgdm9pZCBzZXRfbWEgKGJvb2wgbWEpIHsgbV9tYSA9IG1hOyB9DQot DQotICB2bF92dHlwZV9pbmZvICgpDQotICAgIDogbV9hdmwgKGF2bF9pbmZv ICgpKSwgbV9zZXcgKDApLCBtX3ZsbXVsIChyaXNjdl92ZWN0b3I6OkxNVUxf UkVTRVJWRUQpLA0KLSAgICAgIG1fcmF0aW8gKDApLCBtX3RhICgwKSwgbV9t YSAoMCkNCi0gIHt9DQotICB2bF92dHlwZV9pbmZvIChjb25zdCB2bF92dHlw ZV9pbmZvICYpID0gZGVmYXVsdDsNCi0gIHZsX3Z0eXBlX2luZm8gJm9wZXJh dG9yPSAoY29uc3QgdmxfdnR5cGVfaW5mbyAmKSA9IGRlZmF1bHQ7DQotICB2 bF92dHlwZV9pbmZvIChhdmxfaW5mbywgdWludDhfdCwgcmlzY3ZfdmVjdG9y Ojp2bG11bF90eXBlLCB1aW50OF90LCBib29sLA0KLSBib29sKTsNCi0NCi0g IGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgdmxfdnR5cGVfaW5mbyAmKSBjb25z dDsNCi0gIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgdmxfdnR5cGVfaW5mbyAm KSBjb25zdDsNCi0NCi0gIGJvb2wgaGFzX2F2bF9pbW0gKCkgY29uc3QgeyBy ZXR1cm4gbV9hdmwuaGFzX2F2bF9pbW0gKCk7IH0NCi0gIGJvb2wgaGFzX2F2 bF9yZWcgKCkgY29uc3QgeyByZXR1cm4gbV9hdmwuaGFzX2F2bF9yZWcgKCk7 IH0NCi0gIGJvb2wgaGFzX2F2bF9ub19yZWcgKCkgY29uc3QgeyByZXR1cm4g bV9hdmwuaGFzX2F2bF9ub19yZWcgKCk7IH0NCi0gIGJvb2wgaGFzX25vbl96 ZXJvX2F2bCAoKSBjb25zdCB7IHJldHVybiBtX2F2bC5oYXNfbm9uX3plcm9f YXZsICgpOyB9Ow0KLSAgYm9vbCBoYXNfYXZsICgpIGNvbnN0IHsgcmV0dXJu IG1fYXZsLmhhc19hdmwgKCk7IH0NCi0NCi0gIHJ0eCBnZXRfYXZsICgpIGNv bnN0IHsgcmV0dXJuIG1fYXZsLmdldF92YWx1ZSAoKTsgfQ0KLSAgY29uc3Qg YXZsX2luZm8gJmdldF9hdmxfaW5mbyAoKSBjb25zdCB7IHJldHVybiBtX2F2 bDsgfQ0KLSAgcnRsX3NzYTo6c2V0X2luZm8gKmdldF9hdmxfc291cmNlICgp IGNvbnN0IHsgcmV0dXJuIG1fYXZsLmdldF9zb3VyY2UgKCk7IH0NCi0gIHZv aWQgc2V0X2F2bF9zb3VyY2UgKHJ0bF9zc2E6OnNldF9pbmZvICpzZXQpIHsg bV9hdmwuc2V0X3NvdXJjZSAoc2V0KTsgfQ0KLSAgdm9pZCBzZXRfYXZsX2lu Zm8gKGNvbnN0IGF2bF9pbmZvICZhdmwpIHsgbV9hdmwgPSBhdmw7IH0NCi0g IHVpbnQ4X3QgZ2V0X3NldyAoKSBjb25zdCB7IHJldHVybiBtX3NldzsgfQ0K LSAgcmlzY3ZfdmVjdG9yOjp2bG11bF90eXBlIGdldF92bG11bCAoKSBjb25z dCB7IHJldHVybiBtX3ZsbXVsOyB9DQotICB1aW50OF90IGdldF9yYXRpbyAo KSBjb25zdCB7IHJldHVybiBtX3JhdGlvOyB9DQotICBib29sIGdldF90YSAo KSBjb25zdCB7IHJldHVybiBtX3RhOyB9DQotICBib29sIGdldF9tYSAoKSBj b25zdCB7IHJldHVybiBtX21hOyB9DQotDQotICBib29sIHNhbWVfYXZsX3Ag KGNvbnN0IHZsX3Z0eXBlX2luZm8gJikgY29uc3Q7DQotICBib29sIHNhbWVf dnR5cGVfcCAoY29uc3QgdmxfdnR5cGVfaW5mbyAmKSBjb25zdDsNCi0gIGJv b2wgc2FtZV92bG1heF9wIChjb25zdCB2bF92dHlwZV9pbmZvICYpIGNvbnN0 Ow0KLX07DQotDQotY2xhc3MgdmVjdG9yX2luc25faW5mbyA6IHB1YmxpYyB2 bF92dHlwZV9pbmZvDQotew0KLXByaXZhdGU6DQotICBlbnVtIHN0YXRlX3R5 cGUNCi0gIHsNCi0gICAgVU5JTklUSUFMSVpFRCwNCi0gICAgVkFMSUQsDQot ICAgIFVOS05PV04sDQotICAgIEVNUFRZLA0KLQ0KLSAgICAvKiBUaGUgYmxv Y2sgaXMgcG9sbHV0ZWQgYXMgY29udGFpbmluZyBWU0VUVkwgaW5zdHJ1Y3Rp b24gZHVyaW5nIGRlbQ0KLSAgICAgICBiYWNrd2FyZCBwcm9wYWdhdGlvbiB0 byBnYWluIGJldHRlciBMQ00gb3B0aW1pemF0aW9uIGV2ZW4gdGhvdWdoDQot ICAgICAgIHN1Y2ggVlNFVFZMIGluc3RydWN0aW9uIGlzIG5vdCByZWFsbHkg ZW1pdCB5ZXQgZHVyaW5nIHRoaXMgdGltZS4gICovDQotICAgIERJUlRZLA0K LSAgfTsNCi0NCi0gIGVudW0gc3RhdGVfdHlwZSBtX3N0YXRlOw0KLQ0KLSAg Ym9vbCBtX2RlbWFuZHNbTlVNX0RFTUFORF07DQotDQotICAvKiBUT0RPOiBB c3N1bWUgSU5TTjEgPSBJTlNOIGhvbGRpbmcgb2YgZGVmaW5pdGlvbiBvZiBB VkwuDQotICAgSU5TTjIgPSBJTlNOIHRoYXQgaXMgaW5zZXJ0ZWQgYSB2c2V0 dmwgaW5zbiBiZWZvcmUuDQotICAgICBXZSBtYXkgbmVlZCB0byBhZGQgYSBu ZXcgbWVtYmVyIHRvIHNhdmUgSU5TTiBvZiBob2xkaW5nIEFWTC4NCi0gICAg IG1faW5zbiBpcyBob2xkaW5nIHRoZSBJTlNOIHRoYXQgaXMgaW5zZXJ0ZWQg YSB2c2V0dmwgaW5zbiBiZWZvcmUgaW4NCi0gICAgIFBoYXNlIDIuIElkZWFs bHksIG1vc3Qgb2YgdGhlIHRpbWUgSU5TTjEgPT0gSU5TTjIuIEhvd2V2ZXIs IGNvbnNpZGVyaW5nDQotICAgICBzdWNoIGNhc2U6DQotDQotIHZtdi54LnMg KElOU04yKQ0KLSB2bGU4LnYgKElOU04xKQ0KLQ0KLSAgICAgSWYgdGhlc2Ug MiBpbnN0cnVjdGlvbnMgYXJlIGNvbXBhdGlibGUsIHdlIHNob3VsZCBvbmx5 IGlzc3VlIGEgdnNldHZsIElOU04NCi0gICAgICh3aXRoIEFWTCBpbmNsdWRl ZCkgYmVmb3JlIHZtdi54LnMsIGJ1dCB2bXYueC5zIGlzIG5vdCB0aGUgSU5T TiBob2xkaW5nIHRoZQ0KLSAgICAgZGVmaW5pdGlvbiBvZiBBVkwuICAqLw0K LSAgcnRsX3NzYTo6aW5zbl9pbmZvICptX2luc247DQotDQotICBmcmllbmQg Y2xhc3MgdmVjdG9yX2luZm9zX21hbmFnZXI7DQotDQotcHVibGljOg0KLSAg dmVjdG9yX2luc25faW5mbyAoKQ0KLSAgICA6IHZsX3Z0eXBlX2luZm8gKCks IG1fc3RhdGUgKFVOSU5JVElBTElaRUQpLCBtX2RlbWFuZHN7ZmFsc2V9LA0K LSAgICAgIG1faW5zbiAobnVsbHB0cikNCi0gIHt9DQotDQotICAvKiBQYXJz ZSB0aGUgaW5zdHJ1Y3Rpb24gdG8gZ2V0IFZML1ZUWVBFIGluZm9ybWF0aW9u IGFuZCBkZW1hbmRpbmcNCi0gICAqIGluZm9ybWF0aW9uLiAgKi8NCi0gIC8q IFRoaXMgaXMgb25seSBjYWxsZWQgYnkgc2ltcGxlX3ZzZXR2bCBzdWJyb3V0 aW5lIHdoZW4gb3B0aW1pemUgPT0gMC4NCi0gICAgIFNpbmNlIFJUTF9TU0Eg Y2FuIG5vdCBiZSBlbmFibGVkIHdoZW4gb3B0aW1pemUgPT0gMCwgd2UgZG9u J3QgaW5pdGlhbGl6ZQ0KLSAgICAgdGhlIG1faW5zbi4gICovDQotICB2b2lk IHBhcnNlX2luc24gKHJ0eF9pbnNuICopOw0KLSAgLyogVGhpcyBpcyBvbmx5 IGNhbGxlZCBieSBsYXp5X3ZzZXR2bCBzdWJyb3V0aW5lIHdoZW4gb3B0aW1p emUgPiAwLg0KLSAgICAgV2UgdXNlIFJUTF9TU0EgZnJhbWV3b3JrIHRvIGlu aXRpYWxpemUgdGhlIGluc25faW5mby4gICovDQotICB2b2lkIHBhcnNlX2lu c24gKHJ0bF9zc2E6Omluc25faW5mbyAqKTsNCi0NCi0gIGJvb2wgb3BlcmF0 b3I+PSAoY29uc3QgdmVjdG9yX2luc25faW5mbyAmKSBjb25zdDsNCi0gIGJv b2wgb3BlcmF0b3I9PSAoY29uc3QgdmVjdG9yX2luc25faW5mbyAmKSBjb25z dDsNCi0NCi0gIGJvb2wgdW5pbml0X3AgKCkgY29uc3QgeyByZXR1cm4gbV9z dGF0ZSA9PSBVTklOSVRJQUxJWkVEOyB9DQotICBib29sIHZhbGlkX3AgKCkg Y29uc3QgeyByZXR1cm4gbV9zdGF0ZSA9PSBWQUxJRDsgfQ0KLSAgYm9vbCB1 bmtub3duX3AgKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZSA9PSBVTktOT1dO OyB9DQotICBib29sIGVtcHR5X3AgKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0 ZSA9PSBFTVBUWTsgfQ0KLSAgYm9vbCBkaXJ0eV9wICgpIGNvbnN0IHsgcmV0 dXJuIG1fc3RhdGUgPT0gRElSVFk7IH0NCi0gIGJvb2wgdmFsaWRfb3JfZGly dHlfcCAoKSBjb25zdA0KLSAgew0KLSAgICByZXR1cm4gbV9zdGF0ZSA9PSBW QUxJRCB8fCBtX3N0YXRlID09IERJUlRZOw0KLSAgfQ0KLSAgYm9vbCBhdmFp bGFibGVfcCAoY29uc3QgdmVjdG9yX2luc25faW5mbyAmKSBjb25zdDsNCi0N Ci0gIHN0YXRpYyB2ZWN0b3JfaW5zbl9pbmZvIGdldF91bmtub3duICgpDQot ICB7DQotICAgIHZlY3Rvcl9pbnNuX2luZm8gaW5mbzsNCi0gICAgaW5mby5z ZXRfdW5rbm93biAoKTsNCi0gICAgcmV0dXJuIGluZm87DQotICB9DQotDQot ICB2b2lkIHNldF92YWxpZCAoKSB7IG1fc3RhdGUgPSBWQUxJRDsgfQ0KLSAg dm9pZCBzZXRfdW5rbm93biAoKSB7IG1fc3RhdGUgPSBVTktOT1dOOyB9DQot ICB2b2lkIHNldF9lbXB0eSAoKSB7IG1fc3RhdGUgPSBFTVBUWTsgfQ0KLSAg dm9pZCBzZXRfZGlydHkgKCkgeyBtX3N0YXRlID0gRElSVFk7IH0NCi0gIHZv aWQgc2V0X2luc24gKHJ0bF9zc2E6Omluc25faW5mbyAqaW5zbikgeyBtX2lu c24gPSBpbnNuOyB9DQotDQotICBib29sIGRlbWFuZF9wIChlbnVtIGRlbWFu ZF90eXBlIHR5cGUpIGNvbnN0IHsgcmV0dXJuIG1fZGVtYW5kc1t0eXBlXTsg fQ0KLSAgdm9pZCBkZW1hbmQgKGVudW0gZGVtYW5kX3R5cGUgdHlwZSkgeyBt X2RlbWFuZHNbdHlwZV0gPSB0cnVlOyB9DQotICB2b2lkIHNldF9kZW1hbmQg KGVudW0gZGVtYW5kX3R5cGUgdHlwZSwgYm9vbCB2YWx1ZSkNCi0gIHsNCi0g ICAgbV9kZW1hbmRzW3R5cGVdID0gdmFsdWU7DQotICB9DQotICB2b2lkIGZ1 c2VfYXZsIChjb25zdCB2ZWN0b3JfaW5zbl9pbmZvICYsIGNvbnN0IHZlY3Rv cl9pbnNuX2luZm8gJik7DQotICB2b2lkIGZ1c2Vfc2V3X2xtdWwgKGNvbnN0 IHZlY3Rvcl9pbnNuX2luZm8gJiwgY29uc3QgdmVjdG9yX2luc25faW5mbyAm KTsNCi0gIHZvaWQgZnVzZV90YWlsX3BvbGljeSAoY29uc3QgdmVjdG9yX2lu c25faW5mbyAmLCBjb25zdCB2ZWN0b3JfaW5zbl9pbmZvICYpOw0KLSAgdm9p ZCBmdXNlX21hc2tfcG9saWN5IChjb25zdCB2ZWN0b3JfaW5zbl9pbmZvICYs IGNvbnN0IHZlY3Rvcl9pbnNuX2luZm8gJik7DQotDQotICBib29sIGNvbXBh dGlibGVfcCAoY29uc3QgdmVjdG9yX2luc25faW5mbyAmKSBjb25zdDsNCi0g IGJvb2wgc2tpcF9hdmxfY29tcGF0aWJsZV9wIChjb25zdCB2ZWN0b3JfaW5z bl9pbmZvICYpIGNvbnN0Ow0KLSAgYm9vbCBjb21wYXRpYmxlX2F2bF9wIChj b25zdCB2bF92dHlwZV9pbmZvICYpIGNvbnN0Ow0KLSAgYm9vbCBjb21wYXRp YmxlX2F2bF9wIChjb25zdCBhdmxfaW5mbyAmKSBjb25zdDsNCi0gIGJvb2wg Y29tcGF0aWJsZV92dHlwZV9wIChjb25zdCB2bF92dHlwZV9pbmZvICYpIGNv bnN0Ow0KLSAgYm9vbCBjb21wYXRpYmxlX3AgKGNvbnN0IHZsX3Z0eXBlX2lu Zm8gJikgY29uc3Q7DQotICB2ZWN0b3JfaW5zbl9pbmZvIGxvY2FsX21lcmdl IChjb25zdCB2ZWN0b3JfaW5zbl9pbmZvICYpIGNvbnN0Ow0KLSAgdmVjdG9y X2luc25faW5mbyBnbG9iYWxfbWVyZ2UgKGNvbnN0IHZlY3Rvcl9pbnNuX2lu Zm8gJiwgdW5zaWduZWQgaW50KSBjb25zdDsNCi0NCi0gIHJ0bF9zc2E6Omlu c25faW5mbyAqZ2V0X2luc24gKCkgY29uc3QgeyByZXR1cm4gbV9pbnNuOyB9 DQotICBjb25zdCBib29sICpnZXRfZGVtYW5kcyAodm9pZCkgY29uc3QgeyBy ZXR1cm4gbV9kZW1hbmRzOyB9DQotICBydHggZ2V0X2F2bF9vcl92bF9yZWcg KHZvaWQpIGNvbnN0Ow0KLSAgcnR4IGdldF9hdmxfcmVnX3J0eCAodm9pZCkg Y29uc3QNCi0gIHsNCi0gICAgcmV0dXJuIGdlbl9ydHhfUkVHIChQbW9kZSwg Z2V0X2F2bF9zb3VyY2UgKCktPnJlZ25vICgpKTsNCi0gIH0NCi0gIGJvb2wg dXBkYXRlX2ZhdWx0X2ZpcnN0X2xvYWRfYXZsIChydGxfc3NhOjppbnNuX2lu Zm8gKik7DQotDQotICB2b2lkIGR1bXAgKEZJTEUgKikgY29uc3Q7DQotfTsN Ci0NCnN0cnVjdCB2ZWN0b3JfYmxvY2tfaW5mbw0Kew0KICAgLyogVGhlIGxv Y2FsX2RlbSB2ZWN0b3IgaW5zbl9pbmZvIG9mIHRoZSBibG9jay4gICovDQot LQ0KMi4zNi4zDQogDQo= ------=_001_NextPart477021228527_=------