From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by sourceware.org (Postfix) with ESMTPS id E26D7382D395 for ; Thu, 17 Nov 2022 14:19:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E26D7382D395 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wr1-x429.google.com with SMTP id j15so3541360wrq.3 for ; Thu, 17 Nov 2022 06:19:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:from:to:cc :subject:date:message-id:reply-to; bh=TqVcHdlrVlLIEiK1xC2hz06dfscKfCU3rlY0cySDjd4=; b=PHW50dtPOmpKAFX2aS3aRFaaLf6JnNYePdrEUeEzYLufi5Zc6ak2YHyAXcK0aDkrbA 0JgSovd4ttNxi5SC9kecGSnDIdUDNCE81MPPVMc/qhWkBwgPwfqX884mQPJ0YTLmXtrz CoEQ/Gi/dTGDVkzxfJ0b1gxpzF8NzomBToHtvcjVG+L1jQhkCPqXQlnSV/Rbx+wZdRIQ MeMNjWWLl7hID9ayx49OFShHx7Z3TrNhJ7DD+7TPOiK4Il/4+kW/7XU6kYNSCZTuWQ3n 3KL0khJq0FhslBPLE7sC4JApTTWvLjK5NiQE/AeIEXAaqvTeHy06iET2bqTWqo0AYzdv jtZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TqVcHdlrVlLIEiK1xC2hz06dfscKfCU3rlY0cySDjd4=; b=bTurd6KOXQtrgdoGVoXUkU1Febr++tFMr8+9lX7wLa3Kfmi0ZLIFePWgxCBI11UqnL mYonfQ154+Lb8yn5FKRoc84OgoUEz+M4X90FHIAF0/ST8U3YhAOELrPamrp0eqCzUqHh Z89oTQKkemeJxA3f8QTlqO/19d1snmVOxA2bC6nhiGaHG1m4e6aRTNW2mPlodMONG/iU ESvSq2OkQOzKsl6y0v/AKsW9E0MgokZuerCXfUDHyf+s3lq9QdOo3SBNHe+Mezgs7ESH n+zYYMF8t7vD8821QylahM4la1BAbulemzm6ykm0+HeSQ6ugTueBhChkIQRwaqK/0lGT ptsA== X-Gm-Message-State: ANoB5pldZnO4xMQkH1zg0yTqVzKVz+DVHgLRGuY3N2/8O54Fz5Tr+QZu T7OpjhTVidhtDqS2oXTxw8DXNPzeDXxr X-Google-Smtp-Source: AA0mqf4N6KqDxG8C9/VXjkTIAAQ+IHK8H/B2An9M7wkT6gEElw3Y2ibE8Cfua41q3Xf5bBaTcsk7cw== X-Received: by 2002:a5d:68ce:0:b0:236:518d:f2b4 with SMTP id p14-20020a5d68ce000000b00236518df2b4mr1665867wrw.397.1668694775696; Thu, 17 Nov 2022 06:19:35 -0800 (PST) Received: from [192.168.1.22] (static-176-191-204-139.ftth.abo.bbox.fr. [176.191.204.139]) by smtp.gmail.com with ESMTPSA id j18-20020a05600c191200b003c83465ccbfsm6561863wmq.35.2022.11.17.06.19.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 17 Nov 2022 06:19:34 -0800 (PST) Message-ID: Date: Thu, 17 Nov 2022 15:22:38 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: en-US To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-16-arthur.cohen@embecosm.com> From: Arthur Cohen Autocrypt: addr=arthur.cohen@embecosm.com; keydata= xsFNBGIMH/sBEAC/+yKgi+y9knsqZUNIqlF85v9Lv0lZ2jOUgFgD5R10gz8j39vIYxM/DWA8 BGudqx/s0V3T2arTIJ9u9StA6846SD4lCmdFBUkE0ylOl9UjYrZpoNOYF85TrhwDBB8LxNzo pJxrQIv/WqU2pfs4+QyZuzNPWkGv1b06dDqY1hr7jUxJzAhRklGMyd6kPzr4lJUJLvIPxjQ1 Y+NXAiLrm7n7HqXeHxGBHFwxTRKMb720fcP8pkNQKZNoZBAhNr/665yIH3fV1+D/xsjbVkow BJn5MG3iburNfps50fMNNkBZgzIBRjBxdyJ7iJmpZRQkdLSEf/gpWEc/vUVs8OIdqT60vuFo ueuQUyntFuvGWyCP/o71+eaMdG1Xx8TROJM9usU+Zz3V8GwpPSUUiAI/tDhR/ANtrrJ7jbuh w/9fm7HLovGniQcpN2INgY/Ema3dmU7EWnFqeGymP8R3MQY1Ge8xqlNL1KGrp45ZHp623XgH +IDkvy1ne7RU+WuOPxKKWGeN9LfHNGfTX3ZvFCCxlnbU6KwwoeiLBVdkY1zbgA5LPIPrPtzQ vSPTivQswMkCEVrqLkBYnAXGiavx8V63HltdohJMvkE0wkH3XmsTgrbtqxADlHHz7WZbBWx9 G6OElEThcuT/H/pR9dxr83+qbkUpyIYxW3zP/kpz97oOElSyEQARAQABzShBcnRodXIgQ29o ZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+wsGOBBMBCAA4FiEEhx8wPNj7cw6CrvzG GzRlsEStnGUFAmIMH/sCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQGzRlsEStnGW7 GhAApgjuTe1IRIGxhF8o2VLRYYOHugSI6tNBPpnOjRBbt/Uj5xECBLDtIx+/GR+fUSZ/wRj7 hIpbSoClfnCwQ5/Z0055MY8T9UsCwElOPluzCNmrmRPL2snMsAhhMxDVVtX5xvF25It0qRQJ LVKWiJPoPsQbl3ouaQhPbr2zeIAa74BlWn03zbUJdTXcdjd8+ZBnSGntqwV/hP/g1NwZzuxh roOq1UafPFd3RKwcuIRUkr5JE1ymNP4R8u3GU4/gwGr9s69wIEsBohPowgYGt84ZvLZpt84y Ufsf9CH4OE4/+x1QGumD1b9VcIv5/vZsg7Z8EXKibb6X5TM2vtCcNAHv+0KsERZyLHXn+GOj PQgISzPEcxYkeGNtEnf6IhsIfZyeUe2ZiMPz48Tok9w7r0XfhMCj2SMFjbAFfsufsglDnGO7 CRuCBXtYJYZInmf5XzaQ8FfMRPs9jZeD6SFZjFH00E1o5GLsY9le5euxLo1aLqDNqMp6I8R7 0rK65c7zRAnQ9CO8watmXsBMuJ0Y6Jmf/noFXn8SGVA9b7j+uumum1zToTSmPwhn83X3KwoX TmQ9RD1eiEBJDT9/phSTVDTqhsu8GJVzOIRVXKHxRZLZJo1pGt3YzbDlTshXAV4Ln5YsJIgy AuLU6vmH50QoZhuJK3xMnUaMRdxgyqZe5ACmWXXOwU0EYgwf+wEQAL5Bd4WYiqpsBgW1k/To zz4cThT+CueIqitD5lhTzEJ73SyrAmUiZrkSmR2Vc6G1mJEqozkmeXHjjQ8gMbz6HZBmacnJ hWObf1aUTHjowIsyT0hJJVag1Exq16lBUZCelNG0Jb07TnVWTi/2xHRTLsNVzTQpKnWC3OoA y6M9KwNp5I0hk2cJaFrMjz7/Q16kx8vOov28UcsNDhbq25W64fdEYZApNZI1sKk33tAQj4t0 BxHtG1Hb6EwxbPmVZpL07fmLLVWe3nI5znekXq8AHlUcPGpb4EjUIsmK8+VnGF3f0cDeSupJ WSaHiuufc/jONsM8ZiuYJ6i9Lr8IvgeTUZMXVrjwuIDaMLn5F24dmNSheuwLukQTTiB9LKfU yKZzkFb8Opiqzjng+psvkECIVwk5xaZgraKtivyq+RHGrhSzkJv17QLb7rEiMjKl+20v3xCY l8ogR/7O/slPZMisDV5QOEZEMrWfVYZCW5UIO+vXekTweJxVzPfrkUSpzce67iyeTzzNNwPl FnS/6eB1+IKKAtuxEhbOokBsYf+WnY7xdLGCLyVTXdg99oXZ9AJUUJL3dy9eIggZciQSzkhf eKykoUDmHUAAbWTAxWLwkJ/QBku/Ay5ffRQ9ukhngdu8PsyPGwsOORNIVYbKU0hMtqU7UjOz hVviQufJY2C4KCp5ABEBAAHCwXYEGAEIACAWIQSHHzA82PtzDoKu/MYbNGWwRK2cZQUCYgwf +wIbDAAKCRAbNGWwRK2cZQJ6D/95URtl/eu1akFC1VNqdghWrOAJiL8Jgk53cXug3GXoh8qj DYXT7S6zC6Gyq2nqhGy5JdNmZRdhFCIqZAg2DyBY/1gJEM0yLXEhWZy8AxuUaadAuUG8erdn gXD2az4glSKhjAM5oxRXkWB3P9lr5I2n0Yx7tPlFusfIInV/3RKOYezPS9seoJS31hb6dvYs f3/RGF5Fau3+sm4urTn7zqhqBYgqBmih8sgsifXAzsJ+tO33Cd10SPZmKlKlZWxouTL4Nky6 e2DJHX7phX1DIZBmJBIUvkK6uA7mdJ1yzQonNJq8nABtXBioO+YnP3msZPutEJzGnBjRSpJr 0FULqeIX5JTPqa023Kj2zvnFfqKrT6rgMUomNjQxCryix+EoBUvHcHAyWPQuYb38eV15GqcC jEezziKqTXPBETXkM3rq8+STsSwxn6wz6gwgC1sbj+IXUY2jGzq8fS/99uferADYXEnzKheU 5Q4gWv2XQ/juSJh6AuxTdlr7+5ndAmVUh8U0p47S5ErJnHt1H4pLxIoR7VM9YiIZHn833Xms 2QT2JVIVzL+opHU5XdoXPgd58b8Sxd2j1Fj8LevvZ4isfpr6ZHQ3S0sdOZFtg+Sdnri0Eg+Z g28sczMMKT0W+wb/dpZCA8p3ONJE5hWUhtUpNuhV7j8A4PBVzNHOqPWx7FJmBg== Subject: Re: [PATCH Rust front-end v3 15/46] gccrs: Add expansion pass for the Rust front-end In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------kALuMuuog3JSfkwEhxTitjyD" X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP 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 an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------kALuMuuog3JSfkwEhxTitjyD Content-Type: multipart/mixed; boundary="------------n5zUTEGmthEcnb9IL7ALJ5BC"; protected-headers="v1" From: Arthur Cohen To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org Message-ID: Subject: Re: [PATCH Rust front-end v3 15/46] gccrs: Add expansion pass for the Rust front-end References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-16-arthur.cohen@embecosm.com> In-Reply-To: --------------n5zUTEGmthEcnb9IL7ALJ5BC Content-Type: multipart/mixed; boundary="------------z50DLgZGPPc3cqIP0ZRoUZ2f" --------------z50DLgZGPPc3cqIP0ZRoUZ2f Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 DQoNCk9uIDExLzE2LzIyIDE2OjQ5LCBSaWNoYXJkIEJpZW5lciB3cm90ZToNCj4gT24gVHVl LCBOb3YgMTUsIDIwMjIgYXQgMTI6MzIgUE0gQXJ0aHVyIENvaGVuIDxhcnRodXIuY29oZW5A ZW1iZWNvc20uY29tPiB3cm90ZToNCj4+DQo+Pg0KPj4NCj4+IE9uIDExLzEwLzIyIDExOjQ5 LCBSaWNoYXJkIEJpZW5lciB3cm90ZToNCj4+PiBPbiBXZWQsIE9jdCAyNiwgMjAyMiBhdCAx MDoyOCBBTSA8YXJ0aHVyLmNvaGVuQGVtYmVjb3NtLmNvbT4gd3JvdGU6DQo+Pj4+DQo+Pj4+ IEZyb206IEFydGh1ciBDb2hlbiA8YXJ0aHVyLmNvaGVuQGVtYmVjb3NtLmNvbT4NCj4+Pj4N Cj4+Pj4gVGhlIGV4cGFuc2lvbiBwYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0d28gYWN0aW9u cyBvbiBvdXIgQVNUOg0KPj4+Pg0KPj4+PiAxLiBFeHBhbmRpbmcgbWFjcm8gY2FsbHMNCj4+ Pj4gMi4gUGVyZm9ybWluZyBjb25kaXRpb25hbCBjb21waWxhdGlvbg0KPj4+Pg0KPj4+PiBD YWxscyB0byBtYWNyb3Mgc2hvdWxkIGJlIGNoZWNrZWQgYW5kIGV4cGFuZGVkIGludG8gYW4g QVNUIGZyYWdtZW50IGJhc2VkIG9uDQo+Pj4+IHRoZSBjb250ZXh0IHRoZXkndmUgYmVlbiBj YWxsZWQgaW4uIFRoaXMgaXMgc2ltaWxhciB0byB0b2tlbiBzdWJzdGl0dXRpb24sIHdpdGgN Cj4+Pj4gYSBsb3Qgb2YgaW50cmljYWNpZXMgYW5kIGNoZWNrcyBiZWluZyBwZXJmb3JtZWQu IEEgc2luZ2xlIGludm9jYXRpb24gY2FuIHJlc3VsdA0KPj4+PiBpbiBhbiBBU1QgZnJhZ21l bnQgY29udGFpbmluZyBtdWx0aXBsZSBzdGF0ZW1lbnRzIG9yIG11bHRpcGxlIGV4cHJlc3Np b25zLA0KPj4+PiB3aGljaCBuZWVkIHRvIGJlIGhhbmRsZWQgYXMgd2VsbC4gRnVydGhlcm1v cmUsIFJ1c3QgbWFjcm9zIGNhbiBjb250YWluDQo+Pj4+IHJlcGV0aXRpb25zIHJlbHlpbmcg b24gS2xlaW5lIG9wZXJhdG9ycywgc2ltaWxhciB0byByZWd1bGFyIGV4cHJlc3Npb24NCj4+ Pj4gcGF0dGVybnMsIHRoYXQgYWxzbyBuZWVkIHRvIGJlIGV4cGFuZGVkIHByb3Blcmx5Lg0K Pj4+Pg0KPj4+PiBGaW5hbGx5LCBSdXN0IGNvZGUgY2FuIGJlIGhpZGRlbiBiZWhpbmQgYGNm Z2AgZGlyZWN0aXZlcywgd2hpY2ggYWxsb3cgdGhlIHVzZXINCj4+Pj4gdG8gcGVyZm9ybSBj b25kaXRpb25hbCBjb21waWxhdGlvbi4gSWYgYSBgY2ZnYCBwcmVkaWNhdGUgaXMgbm90IG1l dCwgdGhlDQo+Pj4+IGV4cHJlc3Npb24gb3Igc3RhdGVtZW50IGl0IHJlZmVycyB0byBzaG91 bGQgYmUgbWFya2VkIGZvciBzdHJpcCBhbmQgcmVtb3ZlZA0KPj4+PiBmcm9tIHRoZSBBU1Qu DQo+Pj4NCj4+PiBJJ20ganVzdCBwaWNraW5nIG9uZSBvZiB0aGUgcHVyZWx5IHJ1c3QgZnJv bnRlbmQgc3BlY2lmaWMgcGF0Y2hlcyBhcyBleGFtcGxlIGFuZA0KPj4+IGRvIG5vdCBwbGFu IHRvIGxvb2sgb24gb3RoZXJzIC0gSSBkb24ndCB0aGluayBtZWFuaW5nZnVsIHJldmlldyBj YW4gaGFwcGVuIGJ5DQo+Pj4gc29tZWJvZHkgbm90IGRlZXBseSB1bmRlcnN0YW5kaW5nIHJ1 c3Qgb3IgdGhpcyBmcm9udGVuZCBjYW4gYmUgZG9uZSB3aGljaCBtZWFucw0KPj4+IGFwcHJv dmFsIG9mIHRob3NlIHBhcnRzIHNob3VsZG4ndCBiZSBuZWVkZWQgYnV0IHdvdWxkIGJlIGNv dmVyZWQgKGV2ZW4NCj4+PiB0aGUgaW5pdGlhbA0KPj4+IGNvbnRyaWJ1dGlvbikgYnkgeW91 ciBtYWludGFpbmVyc2hpcCBvZiB0aGUgY29kZS4NCj4+Pg0KPj4+IFRoZSBjb21taXQgY29t bWVudCBhYm92ZSBpcyBxdWl0ZSBoZWxwZnVsIGluIGdldHRpbmcgYW4gaWRlYSBvZiB3aGF0 IHRoaXMgcGFydA0KPj4+IG9mIHRoZSBydXN0IGZyb250ZW5kIGlzIGRvaW5nLiAgSSdkIGFw cHJlY2lhdGUgaWYgc29tZXRoaW5nIGFsb25nIHRoZXNlIGxpbmVzDQo+Pj4gd291bGQgYmUg YWRkZWQgdG8gZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBzb3VyY2UgZmlsZXMgKHByZWZlcmFi bHkgdGhlDQo+Pj4gaW1wbGVtZW50YXRpb24sIG5vdCB0aGUgaGVhZGVyKS4NCj4+DQo+PiBJ cyB0aGVyZSBhbnkgcmVhc29uIGFzIHRvIHdoeSB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxk IGJlIHByZWZlcmVkIG92ZXINCj4+IHRoZSBoZWFkZXI/DQo+IA0KPiBUaGF0J3MgaG93IGl0 J3MgZG9uZSBlbHNld2hlcmUgaW4gR0NDIGFuZCBpdCBhbGlnbnMgd2l0aCB0aGUgZnVuY3Rp b24NCj4gZG9jdW1lbnRhdGlvbiBwcmVzZW5jZS4NCj4gDQo+PiBUaGlzIGlzIGEgY29tbWVu dCB5b3UgYWxzbyBtYWtlIGRvd24gdGhlIGxpbmUgb24gb25lIG9mIG91cg0KPj4gZnVuY3Rp b24ncyBkb2N1bWVudGF0aW9uLiBNeSB2aWV3IGlzIHRoYXQgdGhlIGhlYWRlciBzaG91bGQg YmUga2VwdCBhcw0KPj4gc2ltcGxlIGFuZCBwb3NzaWJsZSwgd2l0aCBhcyBsaXR0bGUgY29k ZSBhcyBwb3NzaWJsZSwgYW5kIHRoYXQgaXQgaXMNCj4+IGVhc3kgdG8gZmluZCBkb2N1bWVu dGF0aW9uIGFyb3VuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIG11Y2ggZWFzaWVyDQo+PiB0 aGFuIHRvIGZpbmQgaXQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHdoZW4gY29kZSBibG9ja3Mg YXJlIHByZXNlbnQgYWxsDQo+PiBhcm91bmQuDQo+IA0KPiBUaGF0J3MgdHJ1ZSB3aGVuIHdv cmtpbmcgd2l0aCBhbiBBUEkgYnV0IG5vdCB3aGVuIHdvcmtpbmcgb24gdGhlIGltcGxlbWVu dGF0aW9uLg0KPiANCj4+IFRvIGJlIGNsZWFyLCBJJ20gbm90IG9wcG9zZWQgdG8gc3dpdGNo aW5nIHRoZSBkb2N1bWVudGF0aW9uIG92ZXIgdG8gb3VyDQo+PiBpbXBsZW1lbnRhdGlvbiAt IGp1c3QgbG9va2luZyB0byB1bmRlcnN0YW5kLiBXZSdsbCBtYWtlIHRoZSBuZWNlc3NhcnkN Cj4+IGNoYW5nZXMuDQo+IA0KPiBJIGd1ZXNzIGNvbnNpc3RlbmN5IGlzIHRoZW4gbW9zdCBp bXBvcnRhbnQgKGNvbnNpc3RlbmN5IGluIHJ1c3QvKS4gIENvbnNpc3RlbmN5DQo+IHdpdGgg R0NDIGlzIG5pY2UuICBJJ2xsIG5vdGUgdGhhdCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBy ZXNpZGVzIGluIHRoZSBoZWFkZXINCj4gbGlrZSBmb3IgdGVtcGxhdGVzIG9yIGlubGluZXMg dGhlIGRvY3VtZW50YXRpb24gYWxzbyByZXNpZGVzIHRoZXJlLiAgVGhhdCBtaWdodA0KPiBi ZSBhbiBhcmd1bWVudCBmb3IgZG9jdW1lbnRhdGlvbiBpbiB0aGUgaGVhZGVyIChpbiBvbmUg cGxhY2UpLg0KPiANCg0KVGhhbmtzIGZvciB0YWtpbmcgdGhlIHRpbWUgdG8gZXhwbGFpbi4g SSdsbCBtb3ZlIG92ZXIgdGhlIGRvY3VtZW50YXRpb24gDQp0byB0aGUgaW1wbGVtZW50YXRp b24gaW5zdGVhZCBvZiB0aGUgaGVhZGVycy4gV2UnbGwgaGF2ZSB0aGlzIGluIHRoZSB2NCAN CndoaWNoIEknbSB3b3JraW5nIG9uIGF0IHRoZSBtb21lbnQgYW5kIHdpbGwgc2VuZCBzaG9y dGx5Lg0KDQo+Pj4gRG9jdW1lbnRhdGlvbiBvZiB0aGUgc3ViLWRpcmVjdG9yeSBzdHJ1Y3R1 cmUgd291bGQNCj4+PiBhbHNvIGJlIG5pY2UsDQo+Pj4gd2UgaGF2ZSAoaGFkIC4uKSBzb3Vy Y2VidWlsZC50ZXhpIHdoaWNoIGNvbnRhaW5zIHNvbWUgb2YgdGhhdCBidXQgbm90IHJlYWxs eSBmb3INCj4+PiBzcGVjaWZpYyBmcm9udGVuZHMgKHNvZmFyKS4NCj4+DQo+PiBSaWdodC4g V2Ugd2lsbCB3b3JrIG9uIGFkZGluZyBwcm9wZXIgZG9jdW1lbnRhdGlvbiBBU0FQLg0KPj4N Cj4+PiBTb21lIGNvbW1lbnRzIG9uIHRoaXMgcGFydGljdWxhciBwYXRjaCB0aGF0IHByb2Jh Ymx5IGFwcGx5IHRvIGFsbCBvdGhlcnMgYXMgd2VsbA0KPj4+IGlubGluZSBiZWxvdy4NCj4+ Pg0KPj4+PiBDby1hdXRob3JlZC1ieTogUGhpbGlwIEhlcnJvbiA8cGhpbGlwLmhlcnJvbkBl bWJlY29zbS5jb20+DQo+Pj4+IENvLWF1dGhvcmVkLWJ5OiBUaGUgT3RoZXIgPHNpbXBseXRo ZW90aGVyQGdtYWlsLmNvbT4NCj4+Pj4gLS0tDQo+Pj4+ICAgIGdjYy9ydXN0L2V4cGFuZC9y dXN0LWF0dHJpYnV0ZS12aXNpdG9yLmNjICAgIHwgMzQ0NSArKysrKysrKysrKysrKysrKysN Cj4+Pj4gICAgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZpc2l0b3IuaCAgICAg fCAgMzE2ICsrDQo+Pj4+ICAgIGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5z LmNjICAgICAgIHwgIDQ4NCArKysNCj4+Pj4gICAgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFj cm8tYnVpbHRpbnMuaCAgICAgICAgfCAgMTA3ICsNCj4+Pj4gICAgZ2NjL3J1c3QvZXhwYW5k L3J1c3QtbWFjcm8tZXhwYW5kLmNjICAgICAgICAgfCAxMDEyICsrKysrDQo+Pj4+ICAgIGdj Yy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWV4cGFuZC5oICAgICAgICAgIHwgIDM2NiArKw0K Pj4+PiAgICBnY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5jYyAgICB8 ICAgMjkgKw0KPj4+PiAgICBnY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhl ci5oICAgICB8ICAgNjQgKw0KPj4+PiAgICBnY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1z dWJzdGl0dXRlLWN0eC5jYyB8ICAzMTIgKysNCj4+Pj4gICAgZ2NjL3J1c3QvZXhwYW5kL3J1 c3QtbWFjcm8tc3Vic3RpdHV0ZS1jdHguaCAgfCAgIDkzICsNCj4+Pj4gICAgMTAgZmlsZXMg Y2hhbmdlZCwgNjIyOCBpbnNlcnRpb25zKCspDQo+Pj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnY2MvcnVzdC9leHBhbmQvcnVzdC1hdHRyaWJ1dGUtdmlzaXRvci5jYw0KPj4+PiAgICBj cmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZpc2l0 b3IuaA0KPj4+PiAgICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3Qt bWFjcm8tYnVpbHRpbnMuY2MNCj4+Pj4gICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0 L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5zLmgNCj4+Pj4gICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWV4cGFuZC5jYw0KPj4+PiAgICBjcmVh dGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tZXhwYW5kLmgNCj4+ Pj4gICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWlu dm9jLWxleGVyLmNjDQo+Pj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9leHBh bmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5oDQo+Pj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1zdWJzdGl0dXRlLWN0eC5jYw0KPj4+PiAg ICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tc3Vic3Rp dHV0ZS1jdHguaA0KPj4+Pg0KPj4+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1 c3QtYXR0cmlidXRlLXZpc2l0b3IuY2MgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1hdHRyaWJ1 dGUtdmlzaXRvci5jYw0KPj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4+PiBpbmRleCAw MDAwMDAwMDAwMC4uODAxNmY5NDMwZWINCj4+Pj4gLS0tIC9kZXYvbnVsbA0KPj4+PiArKysg Yi9nY2MvcnVzdC9leHBhbmQvcnVzdC1hdHRyaWJ1dGUtdmlzaXRvci5jYw0KPj4+PiBAQCAt MCwwICsxLDM0NDUgQEANCj4+Pj4gKy8vIENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4+PiArDQo+Pj4+ICsvLyBUaGlzIGZpbGUg aXMgcGFydCBvZiBHQ0MuDQo+Pj4+ICsNCj4+Pj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+Pj4+ ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+Pj4gKy8v IHZlcnNpb24uDQo+Pj4+ICsNCj4+Pj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+Pj4gKy8v IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hB TlRBQklMSVRZIG9yDQo+Pj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+Pj4gKy8vIGZvciBt b3JlIGRldGFpbHMuDQo+Pj4+ICsNCj4+Pj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+Pj4+ICsvLyBh bG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4+ PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4+PiArDQo+Pj4+ICsj aW5jbHVkZSAicnVzdC1hdHRyaWJ1dGUtdmlzaXRvci5oIg0KPj4+PiArI2luY2x1ZGUgInJ1 c3Qtc2Vzc2lvbi1tYW5hZ2VyLmgiDQo+Pj4+ICsNCj4+Pj4gK25hbWVzcGFjZSBSdXN0IHsN Cj4+Pj4gKw0KPj4+PiArLy8gVmlzaXRvciB1c2VkIHRvIGV4cGFuZCBhdHRyaWJ1dGVzLg0K Pj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OmV4cGFuZF9zdHJ1Y3RfZmllbGRzIChz dGQ6OnZlY3RvcjxBU1Q6OlN0cnVjdEZpZWxkPiAmZmllbGRzKQ0KPj4+PiArew0KPj4+PiAr ICBmb3IgKGF1dG8gaXQgPSBmaWVsZHMuYmVnaW4gKCk7IGl0ICE9IGZpZWxkcy5lbmQgKCk7 KQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGF1dG8gJmZpZWxkID0gKml0Ow0KPj4+PiAr DQo+Pj4+ICsgICAgICBhdXRvICZmaWVsZF9hdHRycyA9IGZpZWxkLmdldF9vdXRlcl9hdHRy cyAoKTsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGZpZWxkX2F0 dHJzKTsNCj4+Pj4gKyAgICAgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQg KGZpZWxkX2F0dHJzKSkNCj4+Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAgICAgICBpdCA9IGZp ZWxkcy5lcmFzZSAoaXQpOw0KPj4+PiArICAgICAgICAgY29udGludWU7DQo+Pj4+ICsgICAg ICAgfQ0KPj4+PiArDQo+Pj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3Jv RXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgLy8g ZXhwYW5kIHN1Yi10eXBlcyBvZiB0eXBlLCBidXQgY2FuJ3Qgc3RyaXAgdHlwZSBpdHNlbGYN Cj4+Pj4gKyAgICAgIGF1dG8gJnR5cGUgPSBmaWVsZC5nZXRfZmllbGRfdHlwZSAoKTsNCj4+ Pj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAg ICAgbWF5YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBpZiAo dHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9y X2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKw0KPj4+PiAr ICAgICAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIC8v IGlmIG5vdGhpbmcgZWxzZSBoYXBwZW5zLCBpbmNyZW1lbnQNCj4+Pj4gKyAgICAgICsraXQ7 DQo+Pj4+ICsgICAgfQ0KPj4+PiArfQ0KPj4+PiArDQo+Pj4NCj4+PiBUaGUgY29kaW5nIGNv bnZlbnRpb25zIHdhcnJhbnQgYSBmdW5jdGlvbiBsZXZlbCBjb21tZW50IGZvciBlYWNoIGZ1 bmN0aW9uLg0KPj4+IElmIHRoZXJlJ3MgYW55dGhpbmcgbWVhbmluZ2Z1bCB0byBzYXkgKGlu IHRoaXMgY2FzZSAiLy8gZXhwYW5kIHR1cGxlIGZpZWxkcyINCj4+PiB3b3VsZG4ndCBiZSBt ZWFuaW5nZnVsKSBwbGVhc2UgY29uc2lkZXIgYWRkaW5nIHN1Y2ggdG8gYWxsIGZ1bmN0aW9u cy4gIEluDQo+Pj4gbXkgdmlldyBldmVyeSBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgZml0IGlu IGEgODB4MjQgdGVybWluYWwgd2FycmFudHMgb25lLg0KPj4+DQo+Pj4+ICt2b2lkDQo+Pj4+ ICtBdHRyVmlzaXRvcjo6ZXhwYW5kX3R1cGxlX2ZpZWxkcyAoc3RkOjp2ZWN0b3I8QVNUOjpU dXBsZUZpZWxkPiAmZmllbGRzKQ0KPj4+PiArew0KPj4+PiArICBmb3IgKGF1dG8gaXQgPSBm aWVsZHMuYmVnaW4gKCk7IGl0ICE9IGZpZWxkcy5lbmQgKCk7KQ0KPj4+PiArICAgIHsNCj4+ Pj4gKyAgICAgIGF1dG8gJmZpZWxkID0gKml0Ow0KPj4+PiArDQo+Pj4+ICsgICAgICBhdXRv ICZmaWVsZF9hdHRycyA9IGZpZWxkLmdldF9vdXRlcl9hdHRycyAoKTsNCj4+Pj4gKyAgICAg IGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGZpZWxkX2F0dHJzKTsNCj4+Pj4gKyAgICAg IGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGZpZWxkX2F0dHJzKSkNCj4+ Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAgICAgICBpdCA9IGZpZWxkcy5lcmFzZSAoaXQpOw0K Pj4+PiArICAgICAgICAgY29udGludWU7DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArDQo+Pj4+ ICsgICAgICAvLyBleHBhbmQgc3ViLXR5cGVzIG9mIHR5cGUsIGJ1dCBjYW4ndCBzdHJpcCB0 eXBlIGl0c2VsZg0KPj4+PiArICAgICAgYXV0byAmdHlwZSA9IGZpZWxkLmdldF9maWVsZF90 eXBlICgpOw0KPj4+PiArICAgICAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiAr ICAgICAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAg cnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAg ICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4N Cj4+PiBXaGVuIHJlYWRpbmcgdGhlIG90aGVyIHBhdGNoZXMgSSB3b25kZXJlZCB3aGV0aGVy IHJ1c3RfZXJyb3JfYXQgYXJlDQo+Pj4gdXNlci1mYWNpbmcgZGlhZ25vc3RpY3Mgb3IgaW50 ZXJuYWwgZXJyb3JzPw0KPj4+DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIC8vIGlmIG5vdGhpbmcg ZWxzZSBoYXBwZW5zLCBpbmNyZW1lbnQNCj4+Pj4gKyAgICAgICsraXQ7DQo+Pj4+ICsgICAg fQ0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6ZXhw YW5kX2Z1bmN0aW9uX3BhcmFtcyAoc3RkOjp2ZWN0b3I8QVNUOjpGdW5jdGlvblBhcmFtPiAm cGFyYW1zKQ0KPj4+PiArew0KPj4+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3Jv RXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKw0KPj4+PiArICBmb3IgKGF1 dG8gaXQgPSBwYXJhbXMuYmVnaW4gKCk7IGl0ICE9IHBhcmFtcy5lbmQgKCk7KQ0KPj4+PiAr ICAgIHsNCj4+Pj4gKyAgICAgIGF1dG8gJnBhcmFtID0gKml0Ow0KPj4+PiArDQo+Pj4+ICsg ICAgICBhdXRvICZwYXJhbV9hdHRycyA9IHBhcmFtLmdldF9vdXRlcl9hdHRycyAoKTsNCj4+ Pj4gKyAgICAgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHBhcmFtX2F0dHJzKTsNCj4+ Pj4gKyAgICAgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHBhcmFtX2F0 dHJzKSkNCj4+Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAgICAgICBpdCA9IHBhcmFtcy5lcmFz ZSAoaXQpOw0KPj4+PiArICAgICAgICAgY29udGludWU7DQo+Pj4+ICsgICAgICAgfQ0KPj4+ PiArDQo+Pj4+ICsgICAgICAvLyBUT0RPOiBzaG91bGQgYW4gdW53YW50ZWQgc3RyaXAgbGVh ZCB0byBicmVhayBvdXQgb2YgbG9vcD8NCj4+Pj4gKyAgICAgIGF1dG8gJnBhdHRlcm4gPSBw YXJhbS5nZXRfcGF0dGVybiAoKTsNCj4+Pg0KPj4+ICdhdXRvJyBpcyB1c2VkIGEgbG90IGlu IHRoZSBmcm9udGVuZCwgaXQgZG9lcyBtYWtlIHJlYWRpbmcgY29kZSBoYXJkZXIgYmVjYXVz ZQ0KPj4+IGNyaXRpY2FsIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgaXMgbG9zdC4gIEhlcmUg SSBjYW4gYXQgbGVhc3QgMm5kIGd1ZXNzDQo+Pj4gJ3BhcmFtJyBiZWluZyBvZiB0eXBlIEFT VDo6RnVuY3Rpb25QYXJhbSBhbmQgdGh1cyBmaW5kIGdldF9wYXR0ZXJuICgpLA0KPj4+IGJ1 dCBJIHdpbGwgaGF2ZSB0byBmaW5kIHRoYXQgdG8gYmUgYWJsZSB0byBmaW5kIGFjY2VwdF92 aXMgKCkgYmVsb3cuDQo+Pj4NCj4+PiBJbiBteSBtaW5kICdhdXRvJyBpcyB1c2VmdWwgd2hl biBpdCBoaWRlcyBpbmZvcm1hdGlvbiB0aGF0J3Mgbm90IHVzZWQgYXMgaW4NCj4+Pg0KPj4+ ICAgIGZvciAoYXV0byBpdCA9IC4uLikNCj4+PiAgICAgIHsNCj4+PiAgICAgICAgIEFTVDo6 RnVuY3Rpb25QYXJhbSAmcGFyYW0gPSAqaXQ7DQo+Pj4NCj4+PiBidXQgbm90IHNvIG11Y2gg Zm9yIGJlaW5nIGxhenkgd2hlbiB0eXBpbmcuDQo+Pj4NCj4+PiBBdCBsZWFzdCB3aXRoIChz b21lIG9mKSB0aGUgdXNlcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIG1ldGhvZHMgbG9vaw0K Pj4+IHVuaXF1ZSBlbm91Z2ggc28gZ3JlcCB3aWxsIGJlIG9mIGhlbHAsIE9UT0ggaXNfbWFy a2VkX2Zvcl9zdHJpcA0KPj4+IGlzIGRlZmluZWQgYSBsb3QuDQo+Pj4NCj4+DQo+PiBJIHRo aW5rIHJlbW92aW5nIGFsbCB0aGUgYGF1dG9gcyBmcm9tIHRoZSBnY2NycyBjb2RlYmFzZSB3 b3VsZCBiZSBhDQo+PiBoZXJjdWxlYW4gdGFzayBhdCB0aGlzIHBvaW50LCBhcyBhIHF1aWNr IGdyZXAgZm9yICdhdXRvICcgaW4gb3VyDQo+PiBmcm9udGVuZCByZXZlYWxzIGFyb3VuZCAy NzAwIG1hdGNoZXMuDQo+Pg0KPj4gICBGcm9tIHRoZSBsaXR0bGUgcmVzZWFyY2ggSSBkaWQs IGl0IHNlZW1zIHRoZSBDKysgZnJvbnRlbmQgYWxzbyB1c2VzIGl0DQo+PiBzb21ld2hhdCwg YXMgd2VsbCBhcyB0aGUgRCBmcm9udGVuZCAoYnV0IHRoYXQgZnJvbnRlbmQgaXMgd3JpdHRl biBpbiBELA0KPj4gc28gdGhhdCBtaWdodCBiZSBtb290KS4NCj4+DQo+PiBQYWlyZWQgd2l0 aCBkZXNjcmlwdGl2ZSB2YXJpYWJsZSBuYW1lcyBhbmQgc2hvcnQgZnVuY3Rpb25zLCBJIHBl cnNvbmFsbHkNCj4+IGRvbid0IGhhdmUgYW4gaXNzdWUgd2l0aCByZXZpZXdpbmcgY29kZSB0 aGF0IHVzZXMgYGF1dG9gIGJ1dCBJIHNlZSBob3cNCj4+IHRoYXQgbWlnaHQgYmUgdGhlIGNh c2UsIGVzcGVjaWFsbHkgZm9yIHNvbWVvbmUgd2hvIGlzIG5vdCBmYW1pbGlhciB3aXRoDQo+ PiBvdXIgZnJvbnRlbmQuDQo+Pg0KPj4gU28gSSB0aGluayB0aGUgcXVlc3Rpb24gSSdtIGFz a2luZyBpcyBhcyBmb2xsb3dzOiBjb25zaWRlcmluZyBQaGlsaXAgYW5kDQo+PiBJIHdpbGwg YmUgcmV2aWV3ZXJzIG9mIHRoZSBSdXN0IGZyb250ZW5kIHBhcnQgc3BlY2lmaWNhbGx5LCBp cyBpdCBva2F5DQo+PiB0byBub3QgbWFrZSBzdWNoIGEgaHVnZSBjaGFuZ2UgdG8gdGhlIGZy b250ZW5kIHdoaWNoIHdvdWxkIGNvc3QgdXMgYSBsb3QNCj4+IG9mIHRpbWUgd2hpbGUgbm90 IG5lY2Vzc2FyaWx5IG1ha2luZyBhIGRpZmZlcmVuY2UgdG8gdXM/IEFnYWluLCBJDQo+PiB1 bmRlcnN0YW5kIHRoYXQgdGhpcyBtYWtlcyBhIGRpZmZlcmVuY2UgdG8gc29tZSBwZW9wbGUs IGJ1dCBhcyB5b3UNCj4+IG1lbnRpb25lZCBJJ20gbm90IHN1cmUgYW55b25lIHdvdWxkIGJl IHdpbGxpbmcgdG8gcmV2aWV3IGFsbCBvZiBvdXINCj4+IGZyb250ZW5kIGNvZGUsIGVzcGVj aWFsbHkgYXMgaXQgY29udGFpbnMgYXJvdW5kIDE2MCAwMDAgbGluZXMgb2YgY29kZS4NCj4g DQo+IFllcywgbXkgcmVtYXJrIHdhcyBxdWl0ZSBnZW5lcmFsIGFib3V0ICdhdXRvJyAoSSBz ZWUgdXNlcyBjcmVlcGluZyBpbg0KPiBpbiBHQ0MgZWxzZXdoZXJlKSwgc29ycnkgd2l0aCBw dXR0aW5nIHRoaXMgaW50byBhIHJ1c3QgZnJvbnRlbmQgcmV2aWV3IG1haWwgOykNCj4gDQo+ IEl0IGp1c3Qgb2NjdXJlZCB0byBtZSB0aGF0IHdyaXRpbmcgJ3RyZWUnIGlzbid0IGFueSBi aWdnZXIgdGhhbiAnYXV0bycgYnV0IGl0DQo+IHdvdWxkIGhhdmUgaGVscGVkIG1lIGEgbG90 IGlkZW50aWZ5aW5nIHBpZWNlcyB0aGF0IHdvcmsgd2l0aCBHRU5FUklDLg0KPiANCj4+IEZ1 cnRoZXJpbmcgbXkgcG9pbnQgb24gdGhlIEQgZnJvbnRlbmQ6IGl0J3MgYWxzbyBubyBzZWNy ZXQgdGhhdCB3ZSB3b3VsZA0KPj4gbGlrZSB0byByZXdyaXRlIHNvbWUgcGFydHMgb2YgdGhl IGZyb250ZW5kIGluIFJ1c3QgaW4gdGhlIGZ1dHVyZSwgYXMgYQ0KPj4gZnVuY3Rpb25hbCBw cm9ncmFtbWluZyBsYW5ndWFnZSBpcyB3ZWxsIHN1aXRlZCB0byB0aGUgY29tcGlsYXRpb24g b2YNCj4+IFJ1c3QuIFdoZW4gdGhhdCBpcyB0aGUgY2FzZSwgd2Ugd2lsbCB1c2Ugd2hhdCBJ IHdvdWxkIGNvbnNpZGVyDQo+PiAiaWRpb21hdGljIFJ1c3QiLCB3aGljaCBtYWtlcyBoZWF2 eSB1c2Ugb2YgdGhlIGBsZXRgIGtleXdvcmQgKHNpbWlsYXIgaW4NCj4+IG1hbnkgd2F5cyB0 byBgYXV0b2ApIGFuZCB0eXBlIGluZmVyZW5jZS4gVHlwZXMgYXJlIHJhcmVseSBleHBsaWNp dGx5DQo+PiBzcGVjaWZpZWQgZm9yIHZhcmlhYmxlcywgYnV0IGFyZSBhbHdheXMgc3BlY2lm aWVkIGZvciBmdW5jdGlvbiBhcmd1bWVudHMNCj4+IG9yIGZ1bmN0aW9uIHJldHVybiB0eXBl cyAoYXMgd2UgZG8gcHJlc2VudGx5IGluIHRoZSBDKysgaW1wbGVtZW50YXRpb24NCj4+IG9m IG91ciBmcm9udGVuZCkuDQo+Pg0KPj4+PiArICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAo KnRoaXMpOw0KPj4+PiArICAgICAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAg KCkpDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgp LA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBp biB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGF1dG8gJnR5cGUgPSBw YXJhbS5nZXRfdHlwZSAoKTsNCj4+Pj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKw0KPj4+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4+ PiArDQo+Pj4+ICsgICAgICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsg ICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRp b24iKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgLy8gaW5jcmVtZW50DQo+Pj4+ICsgICAgICAr K2l0Ow0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBleHBhbmRlci5wb3BfY29udGV4 dCAoKTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6 OmV4cGFuZF9nZW5lcmljX2FyZ3MgKEFTVDo6R2VuZXJpY0FyZ3MgJmFyZ3MpDQo+Pj4+ICt7 DQo+Pj4+ICsgIC8vIGxpZmV0aW1lIGFyZ3MgY2FuJ3QgYmUgZXhwYW5kZWQNCj4+Pj4gKyAg Ly8gRklYTUU6IENhbiB3ZSBoYXZlIG1hY3JvIGludm9jYXRpb25zIGZvciBsaWZldGltZXM/ DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVy OjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gZXhwYW5kIHR5cGUg YXJncyAtIHN0cmlwIHN1Yi10eXBlcyBvbmx5DQo+Pj4+ICsgIGZvciAoYXV0byAmYXJnIDog YXJncy5nZXRfZ2VuZXJpY19hcmdzICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHN3 aXRjaCAoYXJnLmdldF9raW5kICgpKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAg IGNhc2UgQVNUOjpHZW5lcmljQXJnOjpLaW5kOjpUeXBlOiB7DQo+Pj4+ICsgICAgICAgICAg IGF1dG8gJnR5cGUgPSBhcmcuZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgICAgICAgICAgIHR5cGUt PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgICAgICAgICAgbWF5YmVfZXhwYW5kX3R5 cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAgICAgIGlmICh0eXBlLT5pc19tYXJr ZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgICAgICAgIHJ1c3RfZXJyb3JfYXQgKHR5 cGUtPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArICAgICAgICAg ICBicmVhazsNCj4+Pj4gKyAgICAgICAgIH0NCj4+Pj4gKyAgICAgICAgIGNhc2UgQVNUOjpH ZW5lcmljQXJnOjpLaW5kOjpDb25zdDogew0KPj4+PiArICAgICAgICAgICBhdXRvICZleHBy ID0gYXJnLmdldF9leHByZXNzaW9uICgpOw0KPj4+PiArICAgICAgICAgICBleHByLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICAgICAgIG1heWJlX2V4cGFuZF9leHByIChl eHByKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgICAgICBpZiAoZXhwci0+aXNfbWFya2VkX2Zv cl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICAgICAgICBydXN0X2Vycm9yX2F0IChleHByLT5n ZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5v dCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKyAgICAgICAg ICAgYnJlYWs7DQo+Pj4+ICsgICAgICAgICB9DQo+Pj4+ICsgICAgICAgZGVmYXVsdDoNCj4+ Pj4gKyAgICAgICAgIGJyZWFrOw0KPj4+PiArICAgICAgICAgLy8gRklYTUU6IEZpZ3VyZSBv dXQgd2hhdCB0byBkbyBoZXJlIGlmIHRoZXJlIGlzIGFtYmlndWl0eS4gU2luY2UgdGhlDQo+ Pj4+ICsgICAgICAgICAvLyByZXNvbHZlciBjb21lcyBhZnRlciB0aGUgZXhwYW5zaW9uLCB3 ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgYSB3YXkgdG8NCj4+Pj4gKyAgICAgICAgIC8vIHN0cmlw IGFtYmlndW91cyB2YWx1ZXMgaGVyZQ0KPj4+PiArICAgICAgICAgLy8gVE9ETzogQXJ0aHVy OiBQcm9iYWJseSBhZGQgYSBgbWFya19hc19zdHJpcGAgbWV0aG9kIHRvIGBHZW5lcmljQXJn YA0KPj4+PiArICAgICAgICAgLy8gb3Igc29tZXRoaW5nLiBUaGlzIHdvdWxkIGNsZWFuIHVw IHRoaXMgd2hvbGUgdGhpbmcNCj4+Pj4gKyAgICAgICB9DQo+Pj4+ICsgICAgfQ0KPj4+PiAr DQo+Pj4+ICsgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4+PiArDQo+Pj4+ICsgIC8v IEZJWE1FOiBDYW4gd2UgaGF2ZSBtYWNybyBpbnZvY2F0aW9ucyBpbiBnZW5lcmljIHR5cGUg YmluZGluZ3M/DQo+Pj4+ICsgIC8vIGV4cGFuZCBiaW5kaW5nIGFyZ3MgLSBzdHJpcCBzdWIt dHlwZXMgb25seQ0KPj4+PiArICBmb3IgKGF1dG8gJmJpbmRpbmcgOiBhcmdzLmdldF9iaW5k aW5nX2FyZ3MgKCkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgYXV0byAmdHlwZSA9IGJp bmRpbmcuZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgICAgICB0eXBlLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlw ICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1cyAoKSwN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhp cyBwb3NpdGlvbiIpOw0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArdm9p ZA0KPj4+PiArQXR0clZpc2l0b3I6OmV4cGFuZF9xdWFsaWZpZWRfcGF0aF90eXBlIChBU1Q6 OlF1YWxpZmllZFBhdGhUeXBlICZwYXRoX3R5cGUpDQo+Pj4+ICt7DQo+Pj4+ICsgIGV4cGFu ZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0K Pj4+PiArDQo+Pj4+ICsgIGF1dG8gJnR5cGUgPSBwYXRoX3R5cGUuZ2V0X3R5cGUgKCk7DQo+ Pj4+ICsgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICBtYXli ZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIucG9wX2Nv bnRleHQgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3Ry aXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLCAi Y2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArDQo+Pj4+ICsg IGlmIChwYXRoX3R5cGUuaGFzX2FzX2NsYXVzZSAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsg ICAgICBhdXRvICZ0eXBlX3BhdGggPSBwYXRoX3R5cGUuZ2V0X2FzX3R5cGVfcGF0aCAoKTsN Cj4+Pj4gKyAgICAgIHZpc2l0ICh0eXBlX3BhdGgpOw0KPj4+PiArICAgICAgaWYgKHR5cGVf cGF0aC5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3Jf YXQgKHR5cGVfcGF0aC5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCB0eXBlIHBhdGggaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiAr ICAgIH0NCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6 OkF0dHJWaXNpdG9yOjpleHBhbmRfY2xvc3VyZV9wYXJhbXMgKA0KPj4+PiArICBzdGQ6OnZl Y3RvcjxBU1Q6OkNsb3N1cmVQYXJhbT4gJnBhcmFtcykNCj4+Pj4gK3sNCj4+Pj4gKyAgZm9y IChhdXRvIGl0ID0gcGFyYW1zLmJlZ2luICgpOyBpdCAhPSBwYXJhbXMuZW5kICgpOykNCj4+ Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBhdXRvICZwYXJhbSA9ICppdDsNCj4+Pj4gKw0KPj4+ PiArICAgICAgYXV0byAmcGFyYW1fYXR0cnMgPSBwYXJhbS5nZXRfb3V0ZXJfYXR0cnMgKCk7 DQo+Pj4+ICsgICAgICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChwYXJhbV9hdHRycyk7 DQo+Pj4+ICsgICAgICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChwYXJh bV9hdHRycykpDQo+Pj4+ICsgICAgICAgew0KPj4+PiArICAgICAgICAgaXQgPSBwYXJhbXMu ZXJhc2UgKGl0KTsNCj4+Pj4gKyAgICAgICAgIGNvbnRpbnVlOw0KPj4+PiArICAgICAgIH0N Cj4+Pj4gKw0KPj4+PiArICAgICAgYXV0byAmcGF0dGVybiA9IHBhcmFtLmdldF9wYXR0ZXJu ICgpOw0KPj4+PiArICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiAr ICAgICAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAg ICAgcnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9u Iik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChwYXJhbS5oYXNfdHlwZV9naXZlbiAoKSkN Cj4+Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQg KE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKyAgICAgICAgIGF1 dG8gJnR5cGUgPSBwYXJhbS5nZXRfdHlwZSAoKTsNCj4+Pj4gKyAgICAgICAgIHR5cGUtPmFj Y2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgICAgbWF5YmVfZXhwYW5k X3R5cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAgICBpZiAodHlwZS0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICAgICAgcnVzdF9lcnJvcl9hdCAodHlw ZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fu bm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArDQo+Pj4+ICsgICAg ICAgICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+Pj4gKyAgICAgICB9DQo+Pj4+ICsN Cj4+Pj4gKyAgICAgIC8vIGluY3JlbWVudCBpZiBmb3VuZCBub3RoaW5nIGVsc2Ugc28gZmFy DQo+Pj4+ICsgICAgICArK2l0Ow0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gKw0KPj4+ PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OmV4cGFuZF9zZWxmX3BhcmFtIChBU1Q6OlNl bGZQYXJhbSAmc2VsZl9wYXJhbSkNCj4+Pj4gK3sNCj4+Pj4gKyAgaWYgKHNlbGZfcGFyYW0u aGFzX3R5cGUgKCkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwYW5kZXIucHVzaF9j b250ZXh0IChNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+Pj4+ICsgICAg ICBhdXRvICZ0eXBlID0gc2VsZl9wYXJhbS5nZXRfdHlwZSAoKTsNCj4+Pj4gKyAgICAgIHR5 cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgbWF5YmVfZXhw YW5kX3R5cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBpZiAodHlwZS0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5n ZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJp cCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgZXhwYW5k ZXIucG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArICAvKiBUT0RPOiBtYXli ZSBjaGVjayBmb3IgaW52YXJpYW50cyBiZWluZyB2aW9sYXRlZCAtIGUuZy4gYm90aCB0eXBl IGFuZA0KPj4+PiArICAgKiBsaWZldGltZT8gKi8NCj4+Pg0KPj4+IEMtc3R5bGUgY29tbWVu dCB3aGVyZSBJIHNlZSBDKystc3R5bGUgY29tbWVudHMgZXZlcnl3aGVyZSBlbHNlLg0KPj4+ DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjpleHBh bmRfd2hlcmVfY2xhdXNlIChBU1Q6OldoZXJlQ2xhdXNlICZ3aGVyZV9jbGF1c2UpDQo+Pj4+ ICt7DQo+Pj4+ICsgIC8vIGl0ZW1zIGNhbm5vdCBiZSBzdHJpcHBlZCBjb25jZXB0dWFsbHks IHNvIGp1c3QgYWNjZXB0IHZpc2l0b3INCj4+Pj4gKyAgZm9yIChhdXRvICZpdGVtIDogd2hl cmVfY2xhdXNlLmdldF9pdGVtcyAoKSkNCj4+Pj4gKyAgICBpdGVtLT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9y OjpleHBhbmRfdHJhaXRfZnVuY3Rpb25fZGVjbCAoQVNUOjpUcmFpdEZ1bmN0aW9uRGVjbCAm ZGVjbCkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8ganVzdCBleHBhbmQgc3ViLXN0dWZmIC0gY2Fu J3QgYWN0dWFsbHkgc3RyaXAgZ2VuZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0KPj4+PiArICBm b3IgKGF1dG8gJnBhcmFtIDogZGVjbC5nZXRfZ2VuZXJpY19wYXJhbXMgKCkpDQo+Pj4+ICsg ICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAvKiBzdHJp cCBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkIC0gdGhpcyBpcyBzcGVjaWZpY2Fs bHkNCj4+Pj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+Pj4+ICsgIGV4cGFuZF9mdW5j dGlvbl9wYXJhbXMgKGRlY2wuZ2V0X2Z1bmN0aW9uX3BhcmFtcyAoKSk7DQo+Pj4+ICsNCj4+ Pj4gKyAgaWYgKGRlY2wuaGFzX3JldHVybl90eXBlICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4g KyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5 cGU6OlRZUEUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBhdXRvICZyZXR1cm5fdHlwZSA9IGRl Y2wuZ2V0X3JldHVybl90eXBlICgpOw0KPj4+PiArICAgICAgcmV0dXJuX3R5cGUtPmFjY2Vw dF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5cGUg KHJldHVybl90eXBlKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgaWYgKHJldHVybl90eXBlLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHJl dHVybl90eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKw0KPj4+PiAr ICAgICAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+ Pj4+ICsgIGlmIChkZWNsLmhhc193aGVyZV9jbGF1c2UgKCkpDQo+Pj4+ICsgICAgZXhwYW5k X3doZXJlX2NsYXVzZSAoZGVjbC5nZXRfd2hlcmVfY2xhdXNlICgpKTsNCj4+Pj4gK30NCj4+ Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OmV4cGFuZF90cmFpdF9tZXRo b2RfZGVjbCAoQVNUOjpUcmFpdE1ldGhvZERlY2wgJmRlY2wpDQo+Pj4+ICt7DQo+Pj4+ICsg IC8vIGp1c3QgZXhwYW5kIHN1Yi1zdHVmZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVy aWMgcGFyYW1zIHRoZW1zZWx2ZXMNCj4+Pj4gKyAgZm9yIChhdXRvICZwYXJhbSA6IGRlY2wu Z2V0X2dlbmVyaWNfcGFyYW1zICgpKQ0KPj4+PiArICAgIHBhcmFtLT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgLyogYXNzdW1pbmcgeW91IGNhbid0IHN0cmlwIHNl bGYgcGFyYW0gLSB3b3VsZG4ndCBiZSBhIG1ldGhvZA0KPj4+PiArICAgKiBhbnltb3JlLiBz cGVjIGFsbG93cyBvdXRlciBhdHRycyBvbiBzZWxmIHBhcmFtLCBidXQgZG9lc24ndA0KPj4+ PiArICAgKiBzcGVjaWZ5IHdoZXRoZXIgY2ZnIGlzIHVzZWQuICovDQo+Pj4+ICsgIGV4cGFu ZF9zZWxmX3BhcmFtIChkZWNsLmdldF9zZWxmX3BhcmFtICgpKTsNCj4+Pj4gKw0KPj4+PiAr ICAvKiBzdHJpcCBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkIC0gdGhpcyBpcyBz cGVjaWZpY2FsbHkNCj4+Pj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+Pj4+ICsgIGV4 cGFuZF9mdW5jdGlvbl9wYXJhbXMgKGRlY2wuZ2V0X2Z1bmN0aW9uX3BhcmFtcyAoKSk7DQo+ Pj4+ICsNCj4+Pj4gKyAgaWYgKGRlY2wuaGFzX3JldHVybl90eXBlICgpKQ0KPj4+PiArICAg IHsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6 Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBhdXRvICZyZXR1cm5f dHlwZSA9IGRlY2wuZ2V0X3JldHVybl90eXBlICgpOw0KPj4+PiArICAgICAgcmV0dXJuX3R5 cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgbWF5YmVfZXhw YW5kX3R5cGUgKHJldHVybl90eXBlKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgaWYgKHJldHVy bl90eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJy b3JfYXQgKHJldHVybl90eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4g Kw0KPj4+PiArICAgICAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsgICAgfQ0K Pj4+PiArDQo+Pj4+ICsgIGlmIChkZWNsLmhhc193aGVyZV9jbGF1c2UgKCkpDQo+Pj4+ICsg ICAgZXhwYW5kX3doZXJlX2NsYXVzZSAoZGVjbC5nZXRfd2hlcmVfY2xhdXNlICgpKTsNCj4+ Pj4gK30NCj4+Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChB U1Q6OlRva2VuICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNob3VsZG4ndCByZXF1aXJlPw0K Pj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkRl bGltVG9rZW5UcmVlICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNob3VsZG4ndCByZXF1aXJl Pw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OkF0dHJJbnB1dE1ldGFJdGVtQ29udGFpbmVyICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNo b3VsZG4ndCByZXF1aXJlPw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0 b3I6OnZpc2l0IChBU1Q6OklkZW50aWZpZXJFeHByICZpZGVudF9leHByKQ0KPj4+PiArew0K Pj4+PiArICAvLyBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4 cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGlkZW50X2V4cHIuZ2V0X291dGVyX2F0dHJzICgp KTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaWRlbnRf ZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGlk ZW50X2V4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ ICsgICAgfQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OkxpZmV0aW1lICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNob3VsZG4ndCByZXF1 aXJlPw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChB U1Q6OkxpZmV0aW1lUGFyYW0gJikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gc3VwcG9zZWRseSBk b2VzIG5vdCByZXF1aXJlIC0gY2ZnIGRvZXMgbm90aGluZw0KPj4+PiArfQ0KPj4+PiArdm9p ZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkNvbnN0R2VuZXJpY1BhcmFtICYp DQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGxpa2V3aXNlDQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4g K3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpNYWNyb0ludm9jYXRpb24g Jm1hY3JvX2ludm9jKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3Qg YmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRy cyAobWFjcm9faW52b2MuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAobWFjcm9faW52b2MuZ2V0X291dGVyX2F0dHJz ICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBtYWNyb19pbnZvYy5tYXJrX2Zvcl9z dHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+ Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgc2ltcGxlIHBhdGgNCj4+Pj4gKw0KPj4+PiArICAvLyBJ IGRvbid0IHRoaW5rIGFueSBtYWNybyB0b2tlbiB0cmVlcyBjYW4gYmUgc3RyaXBwZWQgaW4g YW55IHdheQ0KPj4+PiArDQo+Pj4+ICsgIC8vIFRPRE86IG1heWJlIGhhdmUgY2ZnISBtYWNy byBzdHJpcHBpbmcgYmVoYXZpb3VyIGhlcmU/DQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9p bnZvYyAobWFjcm9faW52b2MsIG1hY3JvX2ludm9jLmhhc19zZW1pY29sb24gKCkpOw0KPj4+ PiArfQ0KPj4+PiArDQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6UGF0aEluRXhwcmVzc2lvbiAmcGF0aCkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlh bCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4 cGFuZF9jZmdfYXR0cnMgKHBhdGguZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYg KGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAocGF0aC5nZXRfb3V0ZXJfYXR0cnMg KCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHBhdGgubWFya19mb3Jfc3RyaXAgKCk7 DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGZv ciAoYXV0byAmc2VnbWVudCA6IHBhdGguZ2V0X3NlZ21lbnRzICgpKQ0KPj4+PiArICAgIHsN Cj4+Pj4gKyAgICAgIGlmIChzZWdtZW50Lmhhc19nZW5lcmljX2FyZ3MgKCkpDQo+Pj4+ICsg ICAgICAgZXhwYW5kX2dlbmVyaWNfYXJncyAoc2VnbWVudC5nZXRfZ2VuZXJpY19hcmdzICgp KTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRv cjo6dmlzaXQgKEFTVDo6VHlwZVBhdGhTZWdtZW50ICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8v IHNob3VsZG4ndCByZXF1aXJlDQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlz aXRvcjo6dmlzaXQgKEFTVDo6VHlwZVBhdGhTZWdtZW50R2VuZXJpYyAmc2VnbWVudCkNCj4+ Pj4gK3sNCj4+Pj4gKyAgLy8gVE9ETzogc3RyaXAgaW5zaWRlIGdlbmVyaWMgYXJncw0KPj4+ PiArDQo+Pj4+ICsgIGlmICghc2VnbWVudC5oYXNfZ2VuZXJpY19hcmdzICgpKQ0KPj4+PiAr ICAgIHJldHVybjsNCj4+Pj4gKw0KPj4+PiArICBleHBhbmRfZ2VuZXJpY19hcmdzIChzZWdt ZW50LmdldF9nZW5lcmljX2FyZ3MgKCkpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiAr QXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR5cGVQYXRoU2VnbWVudEZ1bmN0aW9uICZzZWdt ZW50KQ0KPj4+PiArew0KPj4+PiArICBhdXRvICZ0eXBlX3BhdGhfZnVuY3Rpb24gPSBzZWdt ZW50LmdldF90eXBlX3BhdGhfZnVuY3Rpb24gKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgZm9yIChh dXRvICZ0eXBlIDogdHlwZV9wYXRoX2Z1bmN0aW9uLmdldF9wYXJhbXMgKCkpDQo+Pj4+ICsg ICAgew0KPj4+PiArICAgICAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICAg ICAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAgcnVz dF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsg ICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGlmICh0eXBlX3BhdGhfZnVuY3Rpb24uaGFzX3JldHVy bl90eXBlICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29u dGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4+PiArDQo+Pj4+ ICsgICAgICBhdXRvICZyZXR1cm5fdHlwZSA9IHR5cGVfcGF0aF9mdW5jdGlvbi5nZXRfcmV0 dXJuX3R5cGUgKCk7DQo+Pj4+ICsgICAgICByZXR1cm5fdHlwZS0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBtYXliZV9leHBhbmRfdHlwZSAocmV0dXJuX3R5 cGUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAocmV0dXJuX3R5cGUt PmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0 cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBleHBh bmRlci5wb3BfY29udGV4dCAoKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICt9DQo+Pj4+ICt2b2lk DQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHlwZVBhdGggJnBhdGgpDQo+Pj4+ ICt7DQo+Pj4+ICsgIC8vIHRoaXMgc2hvdWxkbid0IHN0cmlwIGFueSBzZWdtZW50cywgYnV0 IGNhbiBzdHJpcCBpbnNpZGUgdGhlbQ0KPj4+PiArICBmb3IgKGF1dG8gJnNlZ21lbnQgOiBw YXRoLmdldF9zZWdtZW50cyAoKSkNCj4+Pj4gKyAgICBzZWdtZW50LT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQg KEFTVDo6UXVhbGlmaWVkUGF0aEluRXhwcmVzc2lvbiAmcGF0aCkNCj4+Pj4gK3sNCj4+Pj4g KyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsg IGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHBhdGguZ2V0X291dGVyX2F0dHJzICgpKTsN Cj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAocGF0aC5nZXRf b3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHBhdGgubWFya19m b3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiAr DQo+Pj4+ICsgIGV4cGFuZF9xdWFsaWZpZWRfcGF0aF90eXBlIChwYXRoLmdldF9xdWFsaWZp ZWRfcGF0aF90eXBlICgpKTsNCj4+Pj4gKw0KPj4+PiArICBmb3IgKGF1dG8gJnNlZ21lbnQg OiBwYXRoLmdldF9zZWdtZW50cyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBpZiAo c2VnbWVudC5oYXNfZ2VuZXJpY19hcmdzICgpKQ0KPj4+PiArICAgICAgIGV4cGFuZF9nZW5l cmljX2FyZ3MgKHNlZ21lbnQuZ2V0X2dlbmVyaWNfYXJncyAoKSk7DQo+Pj4+ICsgICAgfQ0K Pj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlF1 YWxpZmllZFBhdGhJblR5cGUgJnBhdGgpDQo+Pj4+ICt7DQo+Pj4+ICsgIGV4cGFuZF9xdWFs aWZpZWRfcGF0aF90eXBlIChwYXRoLmdldF9xdWFsaWZpZWRfcGF0aF90eXBlICgpKTsNCj4+ Pj4gKw0KPj4+PiArICAvLyB0aGlzIHNob3VsZG4ndCBzdHJpcCBhbnkgc2VnbWVudHMsIGJ1 dCBjYW4gc3RyaXAgaW5zaWRlIHRoZW0NCj4+Pj4gKyAgZm9yIChhdXRvICZzZWdtZW50IDog cGF0aC5nZXRfc2VnbWVudHMgKCkpDQo+Pj4+ICsgICAgc2VnbWVudC0+YWNjZXB0X3ZpcyAo KnRoaXMpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRv cjo6dmlzaXQgKEFTVDo6TGl0ZXJhbEV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8v IGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBh bmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVy X2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0 cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+ Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBdHRySW5wdXRMaXRl cmFsICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNob3VsZG4ndCByZXF1aXJlPw0KPj4+PiAr fQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1ldGFJdGVt TGl0RXhwciAmKQ0KPj4+PiArew0KPj4+PiArICAvLyBzaG91bGRuJ3QgcmVxdWlyZT8NCj4+ Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpNZXRh SXRlbVBhdGhMaXQgJikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gc2hvdWxkbid0IHJlcXVpcmU/ DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 Qm9ycm93RXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0 ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdf YXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVy LmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+ PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsg ICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlwIGFu eSBpbnRlcm5hbCBzdWItZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24ndA0K Pj4+PiArICAgKiBhbGxvd2VkIHRvIGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlz IHBvc2l0aW9uIHNvIGNhbid0IGJlDQo+Pj4+ICsgICAqIHN0cmlwcGVkLiAqLw0KPj4+PiAr ICBhdXRvICZib3Jyb3dlZF9leHByID0gZXhwci5nZXRfYm9ycm93ZWRfZXhwciAoKTsNCj4+ Pj4gKyAgYm9ycm93ZWRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAo Ym9ycm93ZWRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0 X2Vycm9yX2F0IChib3Jyb3dlZF9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAt IG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxv d2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQg KEFTVDo6RGVyZWZlcmVuY2VFeHByICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0 aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIu ZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBp ZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRy cyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAo KTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAg Lyogc3RyaXAgYW55IGludGVybmFsIHN1Yi1leHByZXNzaW9ucyAtIGV4cHJlc3Npb24gaXRz ZWxmIGlzbid0DQo+Pj4+ICsgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBhdHRyaWJ1 dGVzIGluIHRoaXMgcG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+Pj4gKyAgICogc3RyaXBwZWQu ICovDQo+Pj4+ICsgIGF1dG8gJmRlcmVmZXJlbmNlZF9leHByID0gZXhwci5nZXRfZGVyZWZl cmVuY2VkX2V4cHIgKCk7DQo+Pj4+ICsgIGRlcmVmZXJlbmNlZF9leHByLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChkZXJlZmVyZW5jZWRfZXhwci0+aXNfbWFya2VkX2Zv cl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChkZXJlZmVyZW5jZWRfZXhw ci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJp cCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiAr dm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkVycm9yUHJvcGFnYXRpb25F eHByICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFz ZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo ZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNf Y2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAg ew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJl dHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLyogc3RyaXAgYW55IGludGVy bmFsIHN1Yi1leHByZXNzaW9ucyAtIGV4cHJlc3Npb24gaXRzZWxmIGlzbid0DQo+Pj4+ICsg ICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBhdHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRp b24gc28gY2FuJ3QgYmUNCj4+Pj4gKyAgICogc3RyaXBwZWQuICovDQo+Pj4+ICsgIGF1dG8g JnByb3BhZ2F0aW5nX2V4cHIgPSBleHByLmdldF9wcm9wYWdhdGluZ19leHByICgpOw0KPj4+ PiArICBwcm9wYWdhdGluZ19leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlm IChwcm9wYWdhdGluZ19leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAg IHJ1c3RfZXJyb3JfYXQgKHByb3BhZ2F0aW5nX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+Pj4g KyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBv c2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMg bm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9y Ojp2aXNpdCAoQVNUOjpOZWdhdGlvbkV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8v IGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBh bmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVy X2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0 cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+ PiArICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zIC0gZXhwcmVzc2lv biBpdHNlbGYgaXNuJ3QNCj4+Pj4gKyAgICogYWxsb3dlZCB0byBoYXZlIGV4dGVybmFsIGF0 dHJpYnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBjYW4ndCBiZQ0KPj4+PiArICAgKiBzdHJp cHBlZC4gKi8NCj4+Pj4gKyAgYXV0byAmbmVnYXRlZF9leHByID0gZXhwci5nZXRfbmVnYXRl ZF9leHByICgpOw0KPj4+PiArICBuZWdhdGVkX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+Pj4gKyAgaWYgKG5lZ2F0ZWRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ Pj4gKyAgICBydXN0X2Vycm9yX2F0IChuZWdhdGVkX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlz IHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0 ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNp dG9yOjp2aXNpdCAoQVNUOjpBcml0aG1ldGljT3JMb2dpY2FsRXhwciAmZXhwcikNCj4+Pj4g K3sNCj4+Pj4gKyAgLyogb3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9yZSB0 aGVzZS4gd2hpbGUgY2Fubm90IHN0cmlwDQo+Pj4+ICsgICAqIHR3byBkaXJlY3QgZGVzY2Vu ZGFudCBleHByZXNzaW9ucywgY2FuIHN0cmlwIG9uZXMgYmVsb3cgdGhhdCAqLw0KPj4+PiAr DQo+Pj4+ICsgIC8qIHNob3VsZCBoYXZlIG5vIHBvc3NpYmlsaXR5IGZvciBvdXRlciBhdHRy cyBhcyB3b3VsZCBiZSBwYXJzZWQNCj4+Pj4gKyAgICogd2l0aCBvdXRlciBleHByICovDQo+ Pj4+ICsgIGF1dG8gJmxfZXhwciA9IGV4cHIuZ2V0X2xlZnRfZXhwciAoKTsNCj4+Pj4gKyAg bF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIG1heWJlX2V4cGFuZF9leHBy IChsX2V4cHIpOw0KPj4+PiArDQo+Pj4+ICsgIC8qIHNob3VsZCBzeW50YWN0aWNhbGx5IG5v dCBoYXZlIG91dGVyIGF0dHJpYnV0ZXMsIHRob3VnaCB0aGlzIG1heQ0KPj4+PiArICAgKiBu b3QgaGF2ZSB3b3JrZWQgaW4gcHJhY3RpY2UgKi8NCj4+Pj4gKyAgYXV0byAmcl9leHByID0g ZXhwci5nZXRfcmlnaHRfZXhwciAoKTsNCj4+Pj4gKyAgcl9leHByLT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+Pj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChyX2V4cHIpOw0KPj4+PiArDQo+ Pj4+ICsgIC8vIGVuc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBtYXJrZWQgZm9yIHN0cmlwDQo+ Pj4+ICsgIGlmIChleHByLmdldF9sZWZ0X2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAg KCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfbGVmdF9leHByICgpLT5n ZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4 cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAg ICAgICAgICJhdHRyaWJ1dGVzIGFyZSBuZXZlciBhbGxvd2VkICINCj4+Pj4gKyAgICAgICAg ICAgICAgICAgICJiZWZvcmUgYmluYXJ5IG9wIGV4cHJzIik7DQo+Pj4+ICsgIGlmIChleHBy LmdldF9yaWdodF9leHByICgpLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAg IHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCktPmdldF9sb2N1cyAoKSwN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0 aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJp YnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJW aXNpdG9yOjp2aXNpdCAoQVNUOjpDb21wYXJpc29uRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+ Pj4gKyAgLyogb3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4g d2hpbGUgY2Fubm90IHN0cmlwDQo+Pj4+ICsgICAqIHR3byBkaXJlY3QgZGVzY2VuZGFudCBl eHByZXNzaW9ucywgY2FuIHN0cmlwIG9uZXMgYmVsb3cgdGhhdCAqLw0KPj4+PiArDQo+Pj4+ ICsgIC8qIHNob3VsZCBoYXZlIG5vIHBvc3NpYmlsaXR5IGZvciBvdXRlciBhdHRycyBhcyB3 b3VsZCBiZSBwYXJzZWQNCj4+Pj4gKyAgICogd2l0aCBvdXRlciBleHByICovDQo+Pj4+ICsg IGF1dG8gJmxfZXhwciA9IGV4cHIuZ2V0X2xlZnRfZXhwciAoKTsNCj4+Pj4gKyAgbF9leHBy LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChsX2V4 cHIpOw0KPj4+PiArDQo+Pj4+ICsgIC8qIHNob3VsZCBzeW50YWN0aWNhbGx5IG5vdCBoYXZl IG91dGVyIGF0dHJpYnV0ZXMsIHRob3VnaCB0aGlzIG1heQ0KPj4+PiArICAgKiBub3QgaGF2 ZSB3b3JrZWQgaW4gcHJhY3RpY2UgKi8NCj4+Pj4gKyAgYXV0byAmcl9leHByID0gZXhwci5n ZXRfcmlnaHRfZXhwciAoKTsNCj4+Pj4gKyAgcl9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7 DQo+Pj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChyX2V4cHIpOw0KPj4+PiArDQo+Pj4+ICsg IC8vIGVuc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBtYXJrZWQgZm9yIHN0cmlwDQo+Pj4+ICsg IGlmIChleHByLmdldF9sZWZ0X2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfbGVmdF9leHByICgpLT5nZXRfbG9j dXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Np b24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJhdHRyaWJ1dGVzIGFyZSBuZXZlciBhbGxvd2VkICINCj4+Pj4gKyAgICAgICAgICAgICAg ICAgICJiZWZvcmUgYmluYXJ5IG9wIGV4cHJzIik7DQo+Pj4+ICsgIGlmIChleHByLmdldF9y aWdodF9leHByICgpLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3Rf ZXJyb3JfYXQgKGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCktPmdldF9sb2N1cyAoKSwNCj4+Pj4g KyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBv c2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMg bm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pg0KPj4+IHZlcnRpY2FsIHNwYWNlIGJldHdl ZW4gZnVuY3Rpb24gZGVmaW5pdGlvbnMgbWlzc2luZyBoZXJlIChhbmQgYWJvdmUgYW5kIGJl bG93KQ0KPj4+DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 TGF6eUJvb2xlYW5FeHByICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvKiBvdXRlciBhdHRy aWJ1dGVzIG5ldmVyIGFsbG93ZWQgYmVmb3JlIHRoZXNlLiB3aGlsZSBjYW5ub3Qgc3RyaXAN Cj4+Pj4gKyAgICogdHdvIGRpcmVjdCBkZXNjZW5kYW50IGV4cHJlc3Npb25zLCBjYW4gc3Ry aXAgb25lcyBiZWxvdyB0aGF0ICovDQo+Pj4+ICsNCj4+Pj4gKyAgLyogc2hvdWxkIGhhdmUg bm8gcG9zc2liaWxpdHkgZm9yIG91dGVyIGF0dHJzIGFzIHdvdWxkIGJlIHBhcnNlZA0KPj4+ PiArICAgKiB3aXRoIG91dGVyIGV4cHIgKi8NCj4+Pj4gKyAgYXV0byAmbF9leHByID0gZXhw ci5nZXRfbGVmdF9leHByICgpOw0KPj4+PiArICBsX2V4cHItPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKyAgbWF5YmVfZXhwYW5kX2V4cHIgKGxfZXhwcik7DQo+Pj4+ICsNCj4+Pj4g KyAgLyogc2hvdWxkIHN5bnRhY3RpY2FsbHkgbm90IGhhdmUgb3V0ZXIgYXR0cmlidXRlcywg dGhvdWdoIHRoaXMgbWF5DQo+Pj4+ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBwcmFjdGlj ZSAqLw0KPj4+PiArICBhdXRvICZyX2V4cHIgPSBleHByLmdldF9yaWdodF9leHByICgpOw0K Pj4+PiArICByX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgbWF5YmVfZXhw YW5kX2V4cHIgKHJfZXhwcik7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gZW5zdXJlIHRoYXQgdGhl eSBhcmUgbm90IG1hcmtlZCBmb3Igc3RyaXANCj4+Pj4gKyAgaWYgKGV4cHIuZ2V0X2xlZnRf ZXhwciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9y X2F0IChleHByLmdldF9sZWZ0X2V4cHIgKCktPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9u IC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgYXJlIG5l dmVyIGFsbG93ZWQgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImJlZm9yZSBiaW5hcnkg b3AgZXhwcnMiKTsNCj4+Pj4gKyAgaWYgKGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCktPmlzX21h cmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRf cmlnaHRfZXhwciAoKS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+ PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR5cGVD YXN0RXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLyogb3V0ZXIgYXR0cmlidXRlcyBu ZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4gd2hpbGUgY2Fubm90IHN0cmlwDQo+Pj4+ICsg ICAqIGRpcmVjdCBkZXNjZW5kYW50IGV4cHJlc3Npb24sIGNhbiBzdHJpcCBvbmVzIGJlbG93 IHRoYXQgKi8NCj4+Pj4gKw0KPj4+PiArICBhdXRvICZjYXN0ZWRfZXhwciA9IGV4cHIuZ2V0 X2Nhc3RlZF9leHByICgpOw0KPj4+PiArICAvKiBzaG91bGQgaGF2ZSBubyBwb3NzaWJpbGl0 eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUgcGFyc2VkDQo+Pj4+ICsgICAqIHdpdGgg b3V0ZXIgZXhwciAqLw0KPj4+PiArICBjYXN0ZWRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4+PiArDQo+Pj4+ICsgIC8vIGVuc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBtYXJrZWQg Zm9yIHN0cmlwDQo+Pj4+ICsgIGlmIChjYXN0ZWRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChjYXN0ZWRfZXhwci0+Z2V0X2xvY3Vz ICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9u IGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAi YXR0cmlidXRlcyBhcmUgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgY2FzdCBleHBycyIpOw0KPj4+ PiArDQo+Pj4+ICsgIC8vIFRPRE86IHN0cmlwIHN1Yi10eXBlcyBvZiB0eXBlDQo+Pj4+ICsg IGF1dG8gJnR5cGUgPSBleHByLmdldF90eXBlX3RvX2Nhc3RfdG8gKCk7DQo+Pj4+ICsgIHR5 cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKHR5cGUtPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3Vz ICgpLCAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArfQ0K Pj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkFzc2lnbm1lbnRF eHByICZleHByKQ0KPj4+PiArew0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJz IChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWls c19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAg ICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAg cmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvKiBzaG91bGQgaGF2ZSBu byBwb3NzaWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUgcGFyc2VkDQo+Pj4+ ICsgICAqIHdpdGggb3V0ZXIgZXhwciAqLw0KPj4+PiArICBhdXRvICZsX2V4cHIgPSBleHBy LmdldF9sZWZ0X2V4cHIgKCk7DQo+Pj4+ICsgIGxfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4+PiArICBtYXliZV9leHBhbmRfZXhwciAobF9leHByKTsNCj4+Pj4gKw0KPj4+PiAr ICAvKiBzaG91bGQgc3ludGFjdGljYWxseSBub3QgaGF2ZSBvdXRlciBhdHRyaWJ1dGVzLCB0 aG91Z2ggdGhpcyBtYXkNCj4+Pj4gKyAgICogbm90IGhhdmUgd29ya2VkIGluIHByYWN0aWNl ICovDQo+Pj4+ICsgIGF1dG8gJnJfZXhwciA9IGV4cHIuZ2V0X3JpZ2h0X2V4cHIgKCk7DQo+ Pj4+ICsgIHJfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBtYXliZV9leHBh bmRfZXhwciAocl9leHByKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBlbnN1cmUgdGhhdCB0aGV5 IGFyZSBub3QgbWFya2VkIGZvciBzdHJpcA0KPj4+PiArICBpZiAoZXhwci5nZXRfbGVmdF9l eHByICgpLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3Jf YXQgKGV4cHIuZ2V0X2xlZnRfZXhwciAoKS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAg ICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24g LSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBhcmUgbmV2 ZXIgYWxsb3dlZCAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYmVmb3JlIGJpbmFyeSBv cCBleHBycyIpOw0KPj4+PiArICBpZiAoZXhwci5nZXRfcmlnaHRfZXhwciAoKS0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChleHByLmdldF9y aWdodF9leHByICgpLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6Q29tcG91 bmRBc3NpZ25tZW50RXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLyogb3V0ZXIgYXR0 cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4gd2hpbGUgY2Fubm90IHN0cmlw DQo+Pj4+ICsgICAqIHR3byBkaXJlY3QgZGVzY2VuZGFudCBleHByZXNzaW9ucywgY2FuIHN0 cmlwIG9uZXMgYmVsb3cgdGhhdCAqLw0KPj4+PiArDQo+Pj4+ICsgIC8qIHNob3VsZCBoYXZl IG5vIHBvc3NpYmlsaXR5IGZvciBvdXRlciBhdHRycyBhcyB3b3VsZCBiZSBwYXJzZWQNCj4+ Pj4gKyAgICogd2l0aCBvdXRlciBleHByICovDQo+Pj4+ICsgIGF1dG8gJmxfZXhwciA9IGV4 cHIuZ2V0X2xlZnRfZXhwciAoKTsNCj4+Pj4gKyAgbF9leHByLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChsX2V4cHIpOw0KPj4+PiArDQo+Pj4+ ICsgIC8qIHNob3VsZCBzeW50YWN0aWNhbGx5IG5vdCBoYXZlIG91dGVyIGF0dHJpYnV0ZXMs IHRob3VnaCB0aGlzIG1heQ0KPj4+PiArICAgKiBub3QgaGF2ZSB3b3JrZWQgaW4gcHJhY3Rp Y2UgKi8NCj4+Pj4gKyAgYXV0byAmcl9leHByID0gZXhwci5nZXRfcmlnaHRfZXhwciAoKTsN Cj4+Pj4gKyAgcl9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIG1heWJlX2V4 cGFuZF9leHByIChyX2V4cHIpOw0KPj4+PiArDQo+Pj4+ICsgIC8vIGVuc3VyZSB0aGF0IHRo ZXkgYXJlIG5vdCBtYXJrZWQgZm9yIHN0cmlwDQo+Pj4+ICsgIGlmIChleHByLmdldF9sZWZ0 X2V4cHIgKCktPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJv cl9hdCAoZXhwci5nZXRfbGVmdF9leHByICgpLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAg ICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlv biAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIGFyZSBu ZXZlciBhbGxvd2VkICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJiZWZvcmUgYmluYXJ5 IG9wIGV4cHJzIik7DQo+Pj4+ICsgIGlmIChleHByLmdldF9yaWdodF9leHByICgpLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0 X3JpZ2h0X2V4cHIgKCktPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0K Pj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpHcm91 cGVkRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0 IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiAr ICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAg ICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlwIHRlc3Qg YmFzZWQgb24gaW5uZXIgYXR0cnMgLSBzcGVjIHNheXMgdGhlc2UgYXJlIGlubmVyDQo+Pj4+ ICsgICAqIGF0dHJpYnV0ZXMsIG5vdCBvdXRlciBhdHRyaWJ1dGVzIG9mIGlubmVyIGV4cHIg Ki8NCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfaW5uZXJf YXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5k IChleHByLmdldF9pbm5lcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAg ZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAg ICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLyogc3RyaXAgYW55IGludGVybmFsIHN1Yi1leHByZXNz aW9ucyAtIGV4cHJlc3Npb24gaXRzZWxmIGlzbid0DQo+Pj4+ICsgICAqIGFsbG93ZWQgdG8g aGF2ZSBleHRlcm5hbCBhdHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRpb24gc28gY2FuJ3QgYmUN Cj4+Pj4gKyAgICogc3RyaXBwZWQuICovDQo+Pj4+ICsgIGF1dG8gJmlubmVyX2V4cHIgPSBl eHByLmdldF9leHByX2luX3BhcmVucyAoKTsNCj4+Pj4gKyAgaW5uZXJfZXhwci0+YWNjZXB0 X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAoaW5uZXJfZXhwci0+aXNfbWFya2VkX2Zvcl9z dHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChpbm5lcl9leHByLT5nZXRfbG9j dXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Np b24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6QXJyYXlFbGVtc1ZhbHVlcyAmZWxlbXMpDQo+ Pj4+ICt7DQo+Pj4+ICsgIC8qIGFwcGFyZW50bHkgb3V0ZXIgYXR0cmlidXRlcyBhcmUgYWxs b3dlZCBpbiAiZWxlbWVudHMgb2YgYXJyYXkNCj4+Pj4gKyAgICogZXhwcmVzc2lvbnMiIGFj Y29yZGluZyB0byBzcGVjICovDQo+Pj4+ICsgIGV4cGFuZF9wb2ludGVyX2FsbG93X3N0cmlw IChlbGVtcy5nZXRfdmFsdWVzICgpKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0 dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBcnJheUVsZW1zQ29waWVkICZlbGVtcykNCj4+Pj4g K3sNCj4+Pj4gKyAgLyogYXBwYXJlbnRseSBvdXRlciBhdHRyaWJ1dGVzIGFyZSBhbGxvd2Vk IGluICJlbGVtZW50cyBvZiBhcnJheQ0KPj4+PiArICAgKiBleHByZXNzaW9ucyIgYWNjb3Jk aW5nIHRvIHNwZWMuIG9uIHRoZSBvdGhlciBoYW5kLCBpdCB3b3VsZCBub3QNCj4+Pj4gKyAg ICogbWFrZSBjb25jZXB0dWFsIHNlbnNlIHRvIGJlIGFibGUgdG8gcmVtb3ZlIGVpdGhlciBl eHByZXNzaW9uLiBBcw0KPj4+PiArICAgKiBzdWNoLCBub3QgaW1wbGVtZW50aW5nLiBUT0RP IGNsZWFyIHVwIHRoZSBhbWJpZ3VpdHkgaGVyZSAqLw0KPj4+PiArDQo+Pj4+ICsgIC8vIG9u bHkgaW50ZW5kIHN0cmlwcGluZyBmb3IgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zDQo+Pj4+ ICsgIGF1dG8gJmNvcGllZF9leHByID0gZWxlbXMuZ2V0X2VsZW1fdG9fY29weSAoKTsNCj4+ Pj4gKyAgY29waWVkX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGNv cGllZF9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJy b3JfYXQgKGNvcGllZF9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVy ICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7 DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmY29weV9jb3VudCA9IGVsZW1zLmdldF9udW1fY29w aWVzICgpOw0KPj4+PiArICBjb3B5X2NvdW50LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ ICsgIGlmIChjb3B5X2NvdW50LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAg IHJ1c3RfZXJyb3JfYXQgKGNvcHlfY291bnQtPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9u IC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFs bG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNp dCAoQVNUOjpBcnJheUV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRpYWwg c3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBh bmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChl eHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgp KSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0K Pj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvKiBz dHJpcCB0ZXN0IGJhc2VkIG9uIGlubmVyIGF0dHJzIC0gc3BlYyBzYXlzIHRoZXJlIGFyZSBz ZXBhcmF0ZQ0KPj4+PiArICAgKiBpbm5lciBhdHRyaWJ1dGVzLCBub3QganVzdCBvdXRlciBh dHRyaWJ1dGVzIG9mIGlubmVyIGV4cHJzICovDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIGFzc3Vt aW5nIHlvdSBjYW4ndCBzdHJpcCBhd2F5IHRoZSBBcnJheUVsZW1zIHR5cGUsIGJ1dCBjYW4g c3RyaXANCj4+Pj4gKyAgICogaW50ZXJuYWwgZXhwcmVzc2lvbnMgYW5kIHdoYXRldmVyICov DQo+Pj4+ICsgIGV4cHIuZ2V0X2FycmF5X2VsZW1zICgpLT5hY2NlcHRfdmlzICgqdGhpcyk7 DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 QXJyYXlJbmRleEV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8qIGl0IGlzIHVuY2xl YXIgd2hldGhlciBvdXRlciBhdHRyaWJ1dGVzIGFyZSBzdXBwb3NlZCB0byBiZQ0KPj4+PiAr ICAgKiBhbGxvd2VkLCBidXQgY29uY2VwdHVhbGx5IGl0IHdvdWxkbid0IG1ha2UgbXVjaCBz ZW5zZSwgYnV0DQo+Pj4+ICsgICAqIGhhdmluZyBleHBhbnNpb24gY29kZSBhbnl3YXkuIFRP RE8gKi8NCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0 dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVy X2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFu ZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAg IGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsg ICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlwIGFueSBpbnRlcm5hbCBzdWItZXhwcmVz c2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24ndA0KPj4+PiArICAgKiBhbGxvd2VkIHRv IGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlzIHBvc2l0aW9uIHNvIGNhbid0IGJl DQo+Pj4+ICsgICAqIHN0cmlwcGVkLiAqLw0KPj4+PiArICBhdXRvICZhcnJheV9leHByID0g ZXhwci5nZXRfYXJyYXlfZXhwciAoKTsNCj4+Pj4gKyAgYXJyYXlfZXhwci0+YWNjZXB0X3Zp cyAoKnRoaXMpOw0KPj4+PiArICBpZiAoYXJyYXlfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChhcnJheV9leHByLT5nZXRfbG9jdXMg KCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24g aW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJh dHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmaW5kZXhf ZXhwciA9IGV4cHIuZ2V0X2luZGV4X2V4cHIgKCk7DQo+Pj4+ICsgIGluZGV4X2V4cHItPmFj Y2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGluZGV4X2V4cHItPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaW5kZXhfZXhwci0+Z2V0 X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHBy ZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0K Pj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR1cGxlRXhwciAmZXhwcikNCj4+Pj4g K3sNCj4+Pj4gKyAgLyogYWNjb3JkaW5nIHRvIHNwZWMsIG91dGVyIGF0dHJpYnV0ZXMgYXJl IGFsbG93ZWQgb24gImVsZW1lbnRzIG9mDQo+Pj4+ICsgICAqIHR1cGxlIGV4cHJlc3Npb25z IiAqLw0KPj4+PiArDQo+Pj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBv dXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdl dF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0 aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0K Pj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvKiBzdHJpcCB0ZXN0IGJhc2VkIG9uIGlu bmVyIGF0dHJzIC0gc3BlYyBzYXlzIHRoZXNlIGFyZSBpbm5lcg0KPj4+PiArICAgKiBhdHRy aWJ1dGVzLCBub3Qgb3V0ZXIgYXR0cmlidXRlcyBvZiBpbm5lciBleHByICovDQo+Pj4+ICsg IGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsN Cj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRf aW5uZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19m b3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiAr DQo+Pj4+ICsgIC8qIGFwcGFyZW50bHkgb3V0ZXIgYXR0cmlidXRlcyBhcmUgYWxsb3dlZCBp biAiZWxlbWVudHMgb2YgdHVwbGUNCj4+Pj4gKyAgICogZXhwcmVzc2lvbnMiIGFjY29yZGlu ZyB0byBzcGVjICovDQo+Pj4+ICsgIGV4cGFuZF9wb2ludGVyX2FsbG93X3N0cmlwIChleHBy LmdldF90dXBsZV9lbGVtcyAoKSk7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRy VmlzaXRvcjo6dmlzaXQgKEFTVDo6VHVwbGVJbmRleEV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+ Pj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+ PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAo KSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIu Z2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1h cmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+ Pj4gKw0KPj4+PiArICAvKiB3b3VsZG4ndCBzdHJpcCB0aGlzIGRpcmVjdGx5IChhcyBvdXRl ciBhdHRycyBzaG91bGQgYmUNCj4+Pj4gKyAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGV2 ZWwpLCBidXQgYW55IHN1Yi1leHByZXNzaW9ucyB3b3VsZCBiZQ0KPj4+PiArICAgKiBzdHJp cHBlZC4gVGh1cywgbm8gbmVlZCB0byBlcmFzZSB3aGVuIHN0cmlwIGNoZWNrIGNhbGxlZC4g Ki8NCj4+Pj4gKyAgYXV0byAmdHVwbGVfZXhwciA9IGV4cHIuZ2V0X3R1cGxlX2V4cHIgKCk7 DQo+Pj4+ICsgIHR1cGxlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYg KHR1cGxlX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9l cnJvcl9hdCAodHVwbGVfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAg ICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRl ciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIp Ow0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OlN0cnVjdEV4cHJTdHJ1Y3QgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRpYWwg c3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBh bmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChl eHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgp KSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0K Pj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvKiBz dHJpcCB0ZXN0IGJhc2VkIG9uIGlubmVyIGF0dHJzIC0gc3BlYyBzYXlzIHRoZXNlIGFyZSBp bm5lcg0KPj4+PiArICAgKiBhdHRyaWJ1dGVzLCBub3Qgb3V0ZXIgYXR0cmlidXRlcyBvZiBp bm5lciBleHByICovDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIu Z2V0X2lubmVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193 aXRoX2V4cGFuZCAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+ Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47 DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIHN0cmlwIHN1Yi1leHBycyBvZiBw YXRoDQo+Pj4+ICsgIGF1dG8gJnN0cnVjdF9uYW1lID0gZXhwci5nZXRfc3RydWN0X25hbWUg KCk7DQo+Pj4+ICsgIHZpc2l0IChzdHJ1Y3RfbmFtZSk7DQo+Pj4+ICsgIGlmIChzdHJ1Y3Rf bmFtZS5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQg KHN0cnVjdF9uYW1lLmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJj YW5ub3Qgc3RyaXAgcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICt9DQo+Pj4+ICt2 b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6U3RydWN0RXhwckZpZWxkSWRl bnRpZmllciAmKQ0KPj4+PiArew0KPj4+PiArICAvLyBhcyBubyBhdHRycyAoYXQgbW9tZW50 LCBhdCBsZWFzdCksIG5vIHN0cmlwcGluZyBwb3NzaWJsZQ0KPj4+DQo+Pj4gaGFzDQo+Pj4N Cj4+PiBpcyB0aGVyZSBhIHJlYXNvbiB0byBub3QgcHV0IGEgZ2NjX3VucmVhY2hhYmxlICgp IGhlcmU/DQo+Pj4NCj4+DQo+PiBUaGUgdmlzaXRvciBnb2VzIHRocm91Z2ggYWxsIHRoZSBu b2RlcyBpbiBhIGNyYXRlLCBldmVuIGlmIHRoZXJlIGlzDQo+PiBub3RoaW5nIHRvIGRvLiBJ biB0aGUgY2FzZSBvZiB0aGUgQXR0cmlidXRlIHZpc2l0b3IsIHRoZXJlIGN1cnJlbnRseQ0K Pj4gaXNuJ3QgYW55dGhpbmcgdG8gZG8gZm9yIHRoZSBmb2xsb3dpbmcgcGF0dGVybiAod2hp Y2ggaXMgd2hhdA0KPj4gYFN0cnVjdEV4cHJlRmllbGRJZGVudGlmaWVyYCBpcyB0aGUgbm9k ZSBmb3IpDQo+Pg0KPj4gYGBgcnVzdA0KPj4gc3RydWN0IEZvbyB7DQo+PiAgICAgICBhOiBp MzIsDQo+PiAgICAgICBiOiBpMzIsDQo+PiB9DQo+Pg0KPj4gZm4gaW5pdF9zdHJ1Y3Rfd2l0 aF9hKGE6IGkzMikgLT4gRm9vIHsNCj4+ICAgICAgIEZvbyB7DQo+PiAgICAgICAgICAgYSwg ICAgICAgIC8vIDwtLS0gaGVyZQ0KPj4gICAgICAgICAgIGI6IHNvbWVfZm4oKSwNCj4+ICAg ICAgIH0NCj4+IH0NCj4+IGBgYA0KPj4NCj4+IHdoZXJlIGEgc3RydWN0J3MgZmllbGQgaXMg aW5pdGlhbGl6ZWQgYnkgYSB2YXJpYWJsZSBvZiB0aGUgc2FtZSBuYW1lDQo+PiAodGhpcyBp cyBhIHNob3J0LWhhbmQgZm9yIGBhOiBhYCkuDQo+Pg0KPj4gQnV0IHRoYXQgZG9lcyBub3Qg bWVhbiB0aGF0IHRoZSBub2RlIGlzIG5vdCB2aXNpdGVkLiBXaGF0IGhhcHBlbnMgaXMNCj4+ IHRoYXQgd2UgdmlzaXQgYWxsIHRoZSBub2RlcyBvZiBhIHN0cnVjdCdzIGluaXRpYWxpemF0 aW9uLCB3aGljaCBhcmUgb2YNCj4+IHRoZSBiYXNlIGNsYXNzIGBTdHJ1Y3RFeHByRmllbGRg IGFuZCB0aGVuIGR5bmFtaWNhbGx5IGRpc3BhdGNoIHRvIHRoZQ0KPj4gcHJvcGVyIHZpc2l0 b3IgZnVuY3Rpb25zLCB3ZSBtdXN0IGhhbmRsZSB0aGUgY2FzZSBvZiBhDQo+PiBgU3RydWN0 RXhwckZpZWxkSWRlbnRpZmllcmAgYmVpbmcgdmlzaXRlZCBldmVuIGlmIHRoZXJlIGlzIG5v dGhpbmcgdG8gZG8uDQo+Pg0KPj4gSWYgd2UgYWRkIGEgYGdjY191bnJlYWNoYWJsZWAgaGVy ZSwgdGhlIGFib3ZlIHRlc3QgY2FzZSB3b3VsZCBjcmFzaCwgYXMNCj4+IGl0IHdvdWxkIHRy eSBzdHJpcHBpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgYm90aCBmaWVsZCBpbml0YWxpemF0aW9u cy4gRm9yDQo+PiB0aGUgZmlyc3QgY2FzZSwgdGhlcmUgaXMgbm90aGluZyB0byBkby4gRm9y IHRoZSBzZWNvbmQgY2FzZSwgd2Ugd2FudCB0bw0KPj4gbWFrZSBzdXJlIHdlIHNob3VsZCBu b3QgYmUgc3RyaXBwaW5nIHRoZSBzdWItZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8NCj4+IGBz b21lX2ZuYCkNCj4gDQo+IEFoIC0gSSBjb25mdXNlZCAnbm8gc3RyaXBwaW5nIHBvc3NpYmxl JyB3aXRoICdubyBzdHJpcHBpbmcgbmVlZGVkJyB0aGVuDQo+IChvciByYXRoZXIgeW91IGRp ZD8pDQo+IA0KDQpXaGVuIFBoaWxpcCBvcmlnaW5hbGx5IHdyb3RlIHRoaXMgcGFzcywgSSBi ZWxpZXZlIHdoYXQgaGUgbWVhbnQgYnkgIm5vIA0Kc3RyaXBwaW5nIHBvc3NpYmxlIiB3YXMg dGhhdCBpdCB3YXNuJ3QgcG9zc2libGUgZm9yIGNvbmRpdGlvbmFsIA0KY29tcGlsYXRpb24g dG8gYmUgcHJlc2VudCBoZXJlIC0gYXMgaW4gdGhlIGxhbmd1YWdlIGFuZCBwYXJzZXIgZG8g bm90IA0KYWxsb3cgaXQuIFRoaXMgdHVybnMgb3V0IHRvIG1lYW4sIGFzIHlvdSBwb2ludCBv dXQsIHRoYXQgIm5vIHN0cmlwcGluZyANCltpc10gbmVlZGVkIiBmb3IgdGhhdCBBU1Qgbm9k ZSwgd2hpY2ggaXMgdGhlIHNtYWUgKGluIG15IG9waW5pb24pIGFzICJubyANCnN0cmlwcGlu ZyBwb3NzaWJsZSBbaGVyZV0iLiBTbyB0aGUgd2F5IEkgc2VlIGl0LCB5b3UgYW5kIFBoaWxp cCBhcmUgYm90aCANCnJpZ2h0IDopDQoNCkkgZG9uJ3QgbWluZCBjaGFuZ2luZyB0aGUgY29t bWVudCBvdmVyIHRvICJubyBzdHJpcHBpbmcgbmVlZGVkIiBpbiB0aGlzIA0KZmlsZSBpZiBp dCBtYWtlcyBpdCBjbGVhcmVyIGZvciByZXZpZXdlcnMuIEl0J3MgYW4gZWFzeSBmaXguDQoN Cj4+DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6U3RydWN0RXhwckZpZWxkSWRlbnRpZmllclZhbHVlICZmaWVsZCkNCj4+Pj4gK3sNCj4+ Pj4gKyAgLyogYXMgbm8gYXR0cnMgcG9zc2libGUgKGF0IG1vbWVudCwgYXQgbGVhc3QpLCBv bmx5IHN1Yi1leHByZXNzaW9uDQo+Pj4+ICsgICAqIHN0cmlwcGluZyBpcyBwb3NzaWJsZSAq Lw0KPj4+PiArICBhdXRvICZ2YWx1ZSA9IGZpZWxkLmdldF92YWx1ZSAoKTsNCj4+Pj4gKyAg dmFsdWUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKHZhbHVlLT5pc19tYXJr ZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHZhbHVlLT5nZXRf bG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJl c3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAg ICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+ Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6U3RydWN0RXhwckZpZWxkSW5kZXhWYWx1 ZSAmZmllbGQpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8qIGFzIG5vIGF0dHJzIHBvc3NpYmxlIChh dCBtb21lbnQsIGF0IGxlYXN0KSwgb25seSBzdWItZXhwcmVzc2lvbg0KPj4+PiArICAgKiBz dHJpcHBpbmcgaXMgcG9zc2libGUgKi8NCj4+Pj4gKyAgYXV0byAmdmFsdWUgPSBmaWVsZC5n ZXRfdmFsdWUgKCk7DQo+Pj4+ICsgIHZhbHVlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ ICsgIGlmICh2YWx1ZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0 X2Vycm9yX2F0ICh2YWx1ZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAg ICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0K Pj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlN0 cnVjdEV4cHJTdHJ1Y3RGaWVsZHMgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRp YWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5l eHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlm IChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJz ICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgp Ow0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAv KiBzdHJpcCB0ZXN0IGJhc2VkIG9uIGlubmVyIGF0dHJzIC0gc3BlYyBzYXlzIHRoZXNlIGFy ZSBpbm5lcg0KPj4+PiArICAgKiBhdHRyaWJ1dGVzLCBub3Qgb3V0ZXIgYXR0cmlidXRlcyBv ZiBpbm5lciBleHByICovDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4 cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2Nm Z193aXRoX2V4cGFuZCAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsN Cj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1 cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIHN0cmlwIHN1Yi1leHBycyBv ZiBwYXRoDQo+Pj4+ICsgIGF1dG8gJnN0cnVjdF9uYW1lID0gZXhwci5nZXRfc3RydWN0X25h bWUgKCk7DQo+Pj4+ICsgIHZpc2l0IChzdHJ1Y3RfbmFtZSk7DQo+Pj4+ICsgIGlmIChzdHJ1 Y3RfbmFtZS5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3Jf YXQgKHN0cnVjdF9uYW1lLmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJjYW5ub3Qgc3RyaXAgcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4g KyAgLyogc3BlYyBkb2VzIG5vdCBzcGVjaWZ5IHdoZXRoZXIgZXhwcmVzc2lvbnMgYXJlIGFs bG93ZWQgdG8gYmUNCj4+Pj4gKyAgICogc3RyaXBwZWQgYXQgdG9wIGxldmVsIG9mIHN0cnVj dCBmaWVsZHMsIGJ1dCBJIHdvdWxkbid0IHRoaW5rDQo+Pj4+ICsgICAqIHRoYXQgdGhleSB3 b3VsZCBiZSwgc28gb3BlcmF0aW5nIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgb25seQ0K Pj4+PiArICAgKiBzdWItZXhwcmVzc2lvbnMgY2FuIGJlIHN0cmlwcGVkLiAqLw0KPj4+PiAr ICBmb3IgKGF1dG8gJmZpZWxkIDogZXhwci5nZXRfZmllbGRzICgpKQ0KPj4+PiArICAgIHsN Cj4+Pj4gKyAgICAgIGZpZWxkLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICAv LyBzaG91bGRuJ3Qgc3RyaXAgaW4gdGhpcw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiAr ICAvKiBzdHJ1Y3QgYmFzZSBwcmVzdW1hYmx5IGNhbid0IGJlIHN0cmlwcGVkLCBhcyB0aGUg Jy4uJyBpcyBiZWZvcmUNCj4+Pj4gKyAgICogdGhlIGV4cHJlc3Npb24uIGFzIHN1Y2gsIGNh biBvbmx5IHN0cmlwIHN1Yi1leHByZXNzaW9ucy4gKi8NCj4+Pj4gKyAgaWYgKGV4cHIuaGFz X3N0cnVjdF9iYXNlICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGF1dG8gJmJhc2Vf c3RydWN0X2V4cHIgPSBleHByLmdldF9zdHJ1Y3RfYmFzZSAoKS5nZXRfYmFzZV9zdHJ1Y3Qg KCk7DQo+Pj4+ICsgICAgICBiYXNlX3N0cnVjdF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7 DQo+Pj4+ICsgICAgICBpZiAoYmFzZV9zdHJ1Y3RfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChiYXNlX3N0cnVjdF9leHByLT5n ZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJp cCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKyAgICB9 DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 U3RydWN0RXhwclN0cnVjdEJhc2UgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRp YWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5l eHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlm IChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJz ICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgp Ow0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAv KiBzdHJpcCB0ZXN0IGJhc2VkIG9uIGlubmVyIGF0dHJzIC0gc3BlYyBzYXlzIHRoZXNlIGFy ZSBpbm5lcg0KPj4+PiArICAgKiBhdHRyaWJ1dGVzLCBub3Qgb3V0ZXIgYXR0cmlidXRlcyBv ZiBpbm5lciBleHByICovDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4 cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2Nm Z193aXRoX2V4cGFuZCAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsN Cj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1 cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIHN0cmlwIHN1Yi1leHBycyBv ZiBwYXRoDQo+Pj4+ICsgIGF1dG8gJnN0cnVjdF9uYW1lID0gZXhwci5nZXRfc3RydWN0X25h bWUgKCk7DQo+Pj4+ICsgIHZpc2l0IChzdHJ1Y3RfbmFtZSk7DQo+Pj4+ICsgIGlmIChzdHJ1 Y3RfbmFtZS5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3Jf YXQgKHN0cnVjdF9uYW1lLmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJjYW5ub3Qgc3RyaXAgcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4g KyAgLyogc3RydWN0IGJhc2UgcHJlc3VtYWJseSBjYW4ndCBiZSBzdHJpcHBlZCwgYXMgdGhl ICcuLicgaXMgYmVmb3JlDQo+Pj4+ICsgICAqIHRoZSBleHByZXNzaW9uLiBhcyBzdWNoLCBj YW4gb25seSBzdHJpcCBzdWItZXhwcmVzc2lvbnMuICovDQo+Pj4+ICsgIHJ1c3RfYXNzZXJ0 ICghZXhwci5nZXRfc3RydWN0X2Jhc2UgKCkuaXNfaW52YWxpZCAoKSk7DQo+Pj4+ICsgIGF1 dG8gJmJhc2Vfc3RydWN0X2V4cHIgPSBleHByLmdldF9zdHJ1Y3RfYmFzZSAoKS5nZXRfYmFz ZV9zdHJ1Y3QgKCk7DQo+Pj4+ICsgIGJhc2Vfc3RydWN0X2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+Pj4gKyAgaWYgKGJhc2Vfc3RydWN0X2V4cHItPmlzX21hcmtlZF9mb3Jfc3Ry aXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYmFzZV9zdHJ1Y3RfZXhwci0+Z2V0 X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHBy ZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0K Pj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkNhbGxFeHByICZleHByKQ0KPj4+PiAr ew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMN Cj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0 cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChl eHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhw ci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9 DQo+Pj4+ICsNCj4+Pj4gKyAgLyogc2hvdWxkIG5vdCBiZSBvdXRlciBhdHRycyBvbiAiZnVu Y3Rpb24iIGV4cHJlc3Npb24gLSBvdXRlciBhdHRycw0KPj4+PiArICAgKiBzaG91bGQgYmUg YXNzb2NpYXRlZCB3aXRoIGNhbGwgZXhwciBhcyBhIHdob2xlLiBvbmx5IHN1Yi1leHByDQo+ Pj4+ICsgICAqIGV4cGFuc2lvbiBpcyBwb3NzaWJsZS4gKi8NCj4+Pj4gKyAgYXV0byAmZnVu Y3Rpb24gPSBleHByLmdldF9mdW5jdGlvbl9leHByICgpOw0KPj4+PiArICBmdW5jdGlvbi0+ YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAoZnVuY3Rpb24tPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZnVuY3Rpb24tPmdldF9s b2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVz c2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAg ICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKw0KPj4+PiArICAvKiBzcGVj IHNheXMgb3V0ZXIgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWNhbGx5IGFsbG93ZWQgZm9yIGVs ZW1lbnRzDQo+Pj4+ICsgICAqIG9mIGNhbGwgZXhwcmVzc2lvbnMsIHNvIGZ1bGwgc3RyaXBw aW5nIHBvc3NpYmxlICovDQo+Pj4+ICsgIC8vIEZJWE1FOiBBcnRodXI6IEZpZ3VyZSBvdXQg aG93IHRvIHJlZmFjdG9yIHRoaXMgLSBUaGlzIGlzIHNpbWlsYXIgdG8NCj4+Pj4gKyAgLy8g ZXhwYW5kaW5nIGl0ZW1zIGluIHRoZSBjcmF0ZSBvciBzdG10cyBpbiBibG9ja3MNCj4+Pj4g KyAgZXhwYW5kX3BvaW50ZXJfYWxsb3dfc3RyaXAgKGV4cHIuZ2V0X3BhcmFtcyAoKSk7DQo+ Pj4+ICsgIGF1dG8gJnBhcmFtcyA9IGV4cHIuZ2V0X3BhcmFtcyAoKTsNCj4+Pj4gKyAgZm9y IChhdXRvIGl0ID0gcGFyYW1zLmJlZ2luICgpOyBpdCAhPSBwYXJhbXMuZW5kICgpOykNCj4+ Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBhdXRvICZzdG10ID0gKml0Ow0KPj4+PiArDQo+Pj4+ ICsgICAgICBzdG10LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAg IGF1dG8gZmluYWxfZnJhZ21lbnQgPSBleHBhbmRfbWFjcm9fZnJhZ21lbnRfcmVjdXJzaXZl ICgpOw0KPj4+PiArICAgICAgaWYgKGZpbmFsX2ZyYWdtZW50LnNob3VsZF9leHBhbmQgKCkp DQo+Pj4+ICsgICAgICAgew0KPj4+PiArICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50 IGV4cGFuZGVkIGludm9jYXRpb24NCj4+Pj4gKyAgICAgICAgIGl0ID0gcGFyYW1zLmVyYXNl IChpdCk7DQo+Pj4+ICsgICAgICAgICBmb3IgKGF1dG8gJm5vZGUgOiBmaW5hbF9mcmFnbWVu dC5nZXRfbm9kZXMgKCkpDQo+Pj4+ICsgICAgICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAg ICBpdCA9IHBhcmFtcy5pbnNlcnQgKGl0LCBub2RlLnRha2VfZXhwciAoKSk7DQo+Pj4+ICsg ICAgICAgICAgICAgaXQrKzsNCj4+Pj4gKyAgICAgICAgICAgfQ0KPj4+PiArICAgICAgIH0N Cj4+Pj4gKyAgICAgIGVsc2UgaWYgKHN0bXQtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgICAgaXQgPSBwYXJhbXMuZXJhc2UgKGl0KTsNCj4+Pj4gKyAgICAgIGVsc2UN Cj4+Pj4gKyAgICAgICBpdCsrOw0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gK3ZvaWQN Cj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpNZXRob2RDYWxsRXhwciAmZXhwcikN Cj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVy IGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291 dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4 cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAg ICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHNob3VsZCBub3QgYmUgb3V0ZXIgYXR0cnMg b24gInJlY2VpdmVyIiBleHByZXNzaW9uIC0gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgICogc2hv dWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBjYWxsIGV4cHIgYXMgYSB3aG9sZS4gb25seSBzdWIt ZXhwcg0KPj4+PiArICAgKiBleHBhbnNpb24gaXMgcG9zc2libGUuICovDQo+Pj4+ICsgIGF1 dG8gJnJlY2VpdmVyID0gZXhwci5nZXRfcmVjZWl2ZXJfZXhwciAoKTsNCj4+Pj4gKyAgcmVj ZWl2ZXItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKHJlY2VpdmVyLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHJlY2VpdmVy LT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlw IGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAg ICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICsNCj4+Pj4gKyAg YXV0byAmbWV0aG9kX25hbWUgPSBleHByLmdldF9tZXRob2RfbmFtZSAoKTsNCj4+Pj4gKyAg aWYgKG1ldGhvZF9uYW1lLmhhc19nZW5lcmljX2FyZ3MgKCkpDQo+Pj4+ICsgICAgZXhwYW5k X2dlbmVyaWNfYXJncyAobWV0aG9kX25hbWUuZ2V0X2dlbmVyaWNfYXJncyAoKSk7DQo+Pj4+ ICsNCj4+Pj4gKyAgLyogc3BlYyBzYXlzIG91dGVyIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmlj YWxseSBhbGxvd2VkIGZvciBlbGVtZW50cw0KPj4+PiArICAgKiBvZiBtZXRob2QgY2FsbCBl eHByZXNzaW9ucywgc28gZnVsbCBzdHJpcHBpbmcgcG9zc2libGUgKi8NCj4+Pj4gKyAgZXhw YW5kX3BvaW50ZXJfYWxsb3dfc3RyaXAgKGV4cHIuZ2V0X3BhcmFtcyAoKSk7DQo+Pj4+ICt9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RmllbGRBY2Nl c3NFeHByICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3Qg YmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRy cyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFp bHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsg ICAgew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAg IHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLyogc2hvdWxkIG5vdCBi ZSBvdXRlciBhdHRycyBvbiAicmVjZWl2ZXIiIGV4cHJlc3Npb24gLSBvdXRlciBhdHRycw0K Pj4+PiArICAgKiBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGZpZWxkIGV4cHIgYXMgYSB3 aG9sZS4gb25seSBzdWItZXhwcg0KPj4+PiArICAgKiBleHBhbnNpb24gaXMgcG9zc2libGUu ICovDQo+Pj4+ICsgIGF1dG8gJnJlY2VpdmVyID0gZXhwci5nZXRfcmVjZWl2ZXJfZXhwciAo KTsNCj4+Pj4gKyAgcmVjZWl2ZXItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYg KHJlY2VpdmVyLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJy b3JfYXQgKHJlY2VpdmVyLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICIN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+ Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6Q2xv c3VyZUV4cHJJbm5lciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJp cCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlw IGNsb3N1cmUgcGFyYW1ldGVycyBpZiByZXF1aXJlZCAtIHRoaXMgaXMgc3BlY2lmaWNhbGx5 DQo+Pj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAqLw0KPj4+PiArICBleHBhbmRfY2xvc3Vy ZV9wYXJhbXMgKGV4cHIuZ2V0X3BhcmFtcyAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2Fu J3Qgc3RyaXAgZXhwcmVzc2lvbiBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Np b25zDQo+Pj4+ICsgIGF1dG8gJmRlZmluaXRpb25fZXhwciA9IGV4cHIuZ2V0X2RlZmluaXRp b25fZXhwciAoKTsNCj4+Pj4gKyAgZGVmaW5pdGlvbl9leHByLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsgIGlmIChkZWZpbml0aW9uX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAg KCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZGVmaW5pdGlvbl9leHByLT5nZXRfbG9j dXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Np b24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3Zv aWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpCbG9ja0V4cHIgJmV4cHIpDQo+ Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBh dHRycw0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRl cl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBh bmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAg ICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiAr ICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvKiBzdHJpcCB0ZXN0IGJhc2VkIG9uIGlubmVyIGF0 dHJzIC0gc3BlYyBzYXlzIHRoZXJlIGFyZSBpbm5lcg0KPj4+PiArICAgKiBhdHRyaWJ1dGVz LCBub3QganVzdCBvdXRlciBhdHRyaWJ1dGVzIG9mIGlubmVyIHN0bXRzICovDQo+Pj4+ICsg IGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X2lubmVyX2F0dHJzICgpKTsN Cj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRf aW5uZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19m b3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiAr DQo+Pj4+ICsgIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPEFTVDo6U3RtdD4gKEFT VDo6U2luZ2xlQVNUTm9kZSk+IGV4dHJhY3Rvcg0KPj4+PiArICAgID0gW10gKEFTVDo6U2lu Z2xlQVNUTm9kZSBub2RlKSB7IHJldHVybiBub2RlLnRha2Vfc3RtdCAoKTsgfTsNCj4+Pj4g Kw0KPj4+PiArICBleHBhbmRfbWFjcm9fY2hpbGRyZW4gKE1hY3JvRXhwYW5kZXI6OkJMT0NL LCBleHByLmdldF9zdGF0ZW1lbnRzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAg ICAgZXh0cmFjdG9yKTsNCj4+Pj4gKw0KPj4+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQg KE1hY3JvRXhwYW5kZXI6OkJMT0NLKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBzdHJpcCB0YWls IGV4cHJlc3Npb24gaWYgZXhpc3RzIC0gY2FuIGFjdHVhbGx5IGZ1bGx5IHJlbW92ZSBpdA0K Pj4+PiArICBpZiAoZXhwci5oYXNfdGFpbF9leHByICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4g KyAgICAgIGF1dG8gJnRhaWxfZXhwciA9IGV4cHIuZ2V0X3RhaWxfZXhwciAoKTsNCj4+Pj4g Kw0KPj4+PiArICAgICAgdGFpbF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsg ICAgICBtYXliZV9leHBhbmRfZXhwciAodGFpbF9leHByKTsNCj4+Pj4gKw0KPj4+PiArICAg ICAgaWYgKHRhaWxfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAg ICBleHByLnN0cmlwX3RhaWxfZXhwciAoKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsgIGV4cGFu ZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICt2b2lkDQo+Pj4+ ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6Q2xvc3VyZUV4cHJJbm5lclR5cGVkICZleHBy KQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0 ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRf b3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhf ZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiAr ICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+ Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLyogc3RyaXAgY2xvc3VyZSBwYXJhbWV0ZXJz IGlmIHJlcXVpcmVkIC0gdGhpcyBpcyBzcGVjaWZpY2FsbHkNCj4+Pj4gKyAgICogYWxsb3dl ZCBieSBzcGVjICovDQo+Pj4+ICsgIGV4cGFuZF9jbG9zdXJlX3BhcmFtcyAoZXhwci5nZXRf cGFyYW1zICgpKTsNCj4+Pj4gKw0KPj4+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1h Y3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBj YW4ndCBzdHJpcCByZXR1cm4gdHlwZSwgYnV0IGNhbiBzdHJpcCBzdWItdHlwZXMNCj4+Pj4g KyAgYXV0byAmdHlwZSA9IGV4cHIuZ2V0X3JldHVybl90eXBlICgpOw0KPj4+PiArICB0eXBl LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgbWF5YmVfZXhwYW5kX3R5 cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgIGlmICh0eXBlLT5pc19tYXJrZWRfZm9yX3N0 cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdldF9sb2N1cyAoKSwg ImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKw0KPj4+PiAr ICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBz dHJpcCBleHByZXNzaW9uIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMN Cj4+Pj4gKyAgYXV0byAmZGVmaW5pdGlvbl9ibG9jayA9IGV4cHIuZ2V0X2RlZmluaXRpb25f YmxvY2sgKCk7DQo+Pj4+ICsgIGRlZmluaXRpb25fYmxvY2stPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKyAgaWYgKGRlZmluaXRpb25fYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAg KCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZGVmaW5pdGlvbl9ibG9jay0+Z2V0X2xv Y3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBl eHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9p ZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkNvbnRpbnVlRXhwciAmZXhwcikN Cj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVy IGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291 dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4 cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAg ICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ ICsgICAgfQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OkJyZWFrRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBz dHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFu ZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4 cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkp KQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+ Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHNw ZWMgZG9lcyBub3Qgc2F5IHRoYXQgeW91IGNhbiBoYXZlIG91dGVyIGF0dHJpYnV0ZXMgb24N Cj4+Pj4gKyAgICogZXhwcmVzc2lvbiwgc28gYXNzdW1pbmcgeW91IGNhbid0LiBzdHJpcHBp bmcgZm9yIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICAgKiBpcyB0aGUgb25seSB0aGluZyB0 aGF0IGNhbiBiZSBkb25lICovDQo+Pj4+ICsgIGlmIChleHByLmhhc19icmVha19leHByICgp KQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGF1dG8gJmJyZWFrX2V4cHIgPSBleHByLmdl dF9icmVha19leHByICgpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBicmVha19leHByLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChicmVha19leHByLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKGJy ZWFrX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0K Pj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2 aXNpdCAoQVNUOjpSYW5nZUZyb21Ub0V4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8q IG91dGVyIGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgdGhlc2UuIHdoaWxlIGNh bm5vdCBzdHJpcA0KPj4+PiArICAgKiB0d28gZGlyZWN0IGRlc2NlbmRhbnQgZXhwcmVzc2lv bnMsIGNhbiBzdHJpcCBvbmVzIGJlbG93IHRoYXQgKi8NCj4+Pj4gKw0KPj4+PiArICAvKiBz aG91bGQgaGF2ZSBubyBwb3NzaWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUg cGFyc2VkDQo+Pj4+ICsgICAqIHdpdGggb3V0ZXIgZXhwciAqLw0KPj4+PiArICBleHByLmdl dF9mcm9tX2V4cHIgKCktPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgLyogc2hvdWxk IHN5bnRhY3RpY2FsbHkgbm90IGhhdmUgb3V0ZXIgYXR0cmlidXRlcywgdGhvdWdoIHRoaXMg bWF5DQo+Pj4+ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBwcmFjdGljZSAqLw0KPj4+PiAr ICBleHByLmdldF90b19leHByICgpLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+ Pj4gKyAgLy8gZW5zdXJlIHRoYXQgdGhleSBhcmUgbm90IG1hcmtlZCBmb3Igc3RyaXANCj4+ Pj4gKyAgaWYgKGV4cHIuZ2V0X2Zyb21fZXhwciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChleHByLmdldF9mcm9tX2V4cHIgKCktPmdl dF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhw cmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAg ICAgICAgImF0dHJpYnV0ZXMgYXJlIG5ldmVyIGFsbG93ZWQgIg0KPj4+PiArICAgICAgICAg ICAgICAgICAgImJlZm9yZSByYW5nZSBleHBycyIpOw0KPj4+PiArICBpZiAoZXhwci5nZXRf dG9fZXhwciAoKS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vy cm9yX2F0IChleHByLmdldF90b19leHByICgpLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAg ICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlv biAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBh bGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6UmFuZ2VGcm9tRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLyogb3V0 ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2VkIGJlZm9yZSB0aGVzZS4gd2hpbGUgY2Fubm90 IHN0cmlwDQo+Pj4+ICsgICAqIGRpcmVjdCBkZXNjZW5kYW50IGV4cHJlc3Npb24sIGNhbiBz dHJpcCBvbmVzIGJlbG93IHRoYXQgKi8NCj4+Pj4gKw0KPj4+PiArICAvKiBzaG91bGQgaGF2 ZSBubyBwb3NzaWJpbGl0eSBmb3Igb3V0ZXIgYXR0cnMgYXMgd291bGQgYmUgcGFyc2VkDQo+ Pj4+ICsgICAqIHdpdGggb3V0ZXIgZXhwciAqLw0KPj4+PiArICBhdXRvICZmcm9tX2V4cHIg PSBleHByLmdldF9mcm9tX2V4cHIgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgZnJvbV9leHByLT5h Y2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGZyb21fZXhwci0+aXNf bWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChmcm9tX2V4 cHItPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3Ry aXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAg ICAgICAgICAgICAgImF0dHJpYnV0ZXMgYXJlIG5ldmVyIGFsbG93ZWQgYmVmb3JlIHJhbmdl IGV4cHJzIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6UmFuZ2VUb0V4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8qIG91dGVy IGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBiZWZvcmUgdGhlc2UuIHdoaWxlIGNhbm5vdCBz dHJpcA0KPj4+PiArICAgKiBkaXJlY3QgZGVzY2VuZGFudCBleHByZXNzaW9uLCBjYW4gc3Ry aXAgb25lcyBiZWxvdyB0aGF0ICovDQo+Pj4+ICsNCj4+Pj4gKyAgLyogc2hvdWxkIHN5bnRh Y3RpY2FsbHkgbm90IGhhdmUgb3V0ZXIgYXR0cmlidXRlcywgdGhvdWdoIHRoaXMgbWF5DQo+ Pj4+ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBpbiBwcmFjdGljZSAqLw0KPj4+PiArICBhdXRv ICZ0b19leHByID0gZXhwci5nZXRfdG9fZXhwciAoKTsNCj4+Pj4gKw0KPj4+PiArICB0b19l eHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHRvX2V4cHIt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodG9f ZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBz dHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAg ICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+ PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlJhbmdlRnVsbEV4cHIg JikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gb3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2Vk IGJlZm9yZSB0aGVzZSwgc28gbm8gc3RyaXBwaW5nDQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+ Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmFuZ2VGcm9tVG9JbmNsRXhwciAmZXhw cikNCj4+Pj4gK3sNCj4+Pj4gKyAgLyogb3V0ZXIgYXR0cmlidXRlcyBuZXZlciBhbGxvd2Vk IGJlZm9yZSB0aGVzZS4gd2hpbGUgY2Fubm90IHN0cmlwDQo+Pj4+ICsgICAqIHR3byBkaXJl Y3QgZGVzY2VuZGFudCBleHByZXNzaW9ucywgY2FuIHN0cmlwIG9uZXMgYmVsb3cgdGhhdCAq Lw0KPj4+PiArDQo+Pj4+ICsgIC8qIHNob3VsZCBoYXZlIG5vIHBvc3NpYmlsaXR5IGZvciBv dXRlciBhdHRycyBhcyB3b3VsZCBiZSBwYXJzZWQNCj4+Pj4gKyAgICogd2l0aCBvdXRlciBl eHByICovDQo+Pj4+ICsgIGV4cHIuZ2V0X2Zyb21fZXhwciAoKS0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4+PiArICAvKiBzaG91bGQgc3ludGFjdGljYWxseSBub3QgaGF2ZSBvdXRlciBh dHRyaWJ1dGVzLCB0aG91Z2ggdGhpcyBtYXkNCj4+Pj4gKyAgICogbm90IGhhdmUgd29ya2Vk IGluIHByYWN0aWNlICovDQo+Pj4+ICsgIGV4cHIuZ2V0X3RvX2V4cHIgKCktPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBlbnN1cmUgdGhhdCB0aGV5IGFyZSBu b3QgbWFya2VkIGZvciBzdHJpcA0KPj4+PiArICBpZiAoZXhwci5nZXRfZnJvbV9leHByICgp LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4 cHIuZ2V0X2Zyb21fZXhwciAoKS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAg ICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRl ciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBhcmUgbmV2ZXIgYWxs b3dlZCAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYmVmb3JlIHJhbmdlIGV4cHJzIik7 DQo+Pj4+ICsgIGlmIChleHByLmdldF90b19leHByICgpLT5pc19tYXJrZWRfZm9yX3N0cmlw ICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X3RvX2V4cHIgKCktPmdl dF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhw cmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAg ICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQN Cj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpSYW5nZVRvSW5jbEV4cHIgJmV4cHIp DQo+Pj4+ICt7DQo+Pj4+ICsgIC8qIG91dGVyIGF0dHJpYnV0ZXMgbmV2ZXIgYWxsb3dlZCBi ZWZvcmUgdGhlc2UuIHdoaWxlIGNhbm5vdCBzdHJpcA0KPj4+PiArICAgKiBkaXJlY3QgZGVz Y2VuZGFudCBleHByZXNzaW9uLCBjYW4gc3RyaXAgb25lcyBiZWxvdyB0aGF0ICovDQo+Pj4+ ICsNCj4+Pj4gKyAgLyogc2hvdWxkIHN5bnRhY3RpY2FsbHkgbm90IGhhdmUgb3V0ZXIgYXR0 cmlidXRlcywgdGhvdWdoIHRoaXMgbWF5DQo+Pj4+ICsgICAqIG5vdCBoYXZlIHdvcmtlZCBp biBwcmFjdGljZSAqLw0KPj4+PiArICBhdXRvICZ0b19leHByID0gZXhwci5nZXRfdG9fZXhw ciAoKTsNCj4+Pj4gKw0KPj4+PiArICB0b19leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+ Pj4+ICsNCj4+Pj4gKyAgaWYgKHRvX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodG9fZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9z aXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBu b3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6 OnZpc2l0IChBU1Q6OlJldHVybkV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGlu aXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRl ci5leHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsg IGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0 dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlw ICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiAr ICAvKiBzcGVjIGRvZXMgbm90IHNheSB0aGF0IHlvdSBjYW4gaGF2ZSBvdXRlciBhdHRyaWJ1 dGVzIG9uDQo+Pj4+ICsgICAqIGV4cHJlc3Npb24sIHNvIGFzc3VtaW5nIHlvdSBjYW4ndC4g c3RyaXBwaW5nIGZvciBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgICogaXMgdGhlIG9ubHkg dGhpbmcgdGhhdCBjYW4gYmUgZG9uZSAqLw0KPj4+PiArICBpZiAoZXhwci5oYXNfcmV0dXJu ZWRfZXhwciAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBhdXRvICZyZXR1cm5lZF9l eHByID0gZXhwci5nZXRfcmV0dXJuZWRfZXhwciAoKTsNCj4+Pj4gKw0KPj4+PiArICAgICAg cmV0dXJuZWRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsgICAg ICBpZiAocmV0dXJuZWRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAg ICAgICBydXN0X2Vycm9yX2F0IChyZXR1cm5lZF9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRo aXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgImF0 dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsgIC8qIFRPRE86 IGNvbmNlcHR1YWxseSwgeW91IHdvdWxkIG1heWJlIGJlIGFibGUgdG8gcmVtb3ZlIGEgcmV0 dXJuZWQNCj4+Pj4gKyAgICogZXhwciAtIGUuZy4gaWYgeW91IGhhZCBjb25kaXRpb25hbCBj b21waWxhdGlvbiByZXR1cm5pbmcgdm9pZCBvcg0KPj4+PiArICAgKiByZXR1cm5pbmcgYSB0 eXBlLiBPbiB0aGUgb3RoZXIgaGFuZCwgSSB0aGluayB0aGF0IGZ1bmN0aW9uDQo+Pj4+ICsg ICAqIHJldHVybiB0eXBlIGNhbm5vdCBiZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkLCBzbyBJ IGFzc3VtZWQgeW91DQo+Pj4+ICsgICAqIGNhbid0IGRvIHRoaXMgZWl0aGVyLiAqLw0KPj4+ PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlVuc2Fm ZUJsb2NrRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0 ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdf YXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVy LmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+ PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsg ICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0 cmlwIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4g KyAgYXV0byAmYmxvY2tfZXhwciA9IGV4cHIuZ2V0X2Jsb2NrX2V4cHIgKCk7DQo+Pj4+ICsg IGJsb2NrX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGJsb2NrX2V4 cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAo YmxvY2tfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNh bm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0K Pj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Okxv b3BFeHByICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3Qg YmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRy cyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFp bHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsg ICAgew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAg IHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAg YmxvY2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBh dXRvICZsb29wX2Jsb2NrID0gZXhwci5nZXRfbG9vcF9ibG9jayAoKTsNCj4+Pj4gKyAgbG9v cF9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAobG9vcF9ibG9jay0+ aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChsb29w X2Jsb2NrLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90 IHN0cmlwIGJsb2NrIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6V2hpbGVM b29wRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0 IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiAr ICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAg ICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlw IHByZWRpY2F0ZSBleHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMN Cj4+Pj4gKyAgYXV0byAmcHJlZGljYXRlX2V4cHIgPSBleHByLmdldF9wcmVkaWNhdGVfZXhw ciAoKTsNCj4+Pj4gKyAgcHJlZGljYXRlX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ Pj4gKyAgaWYgKHByZWRpY2F0ZV9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+ PiArICAgIHJ1c3RfZXJyb3JfYXQgKHByZWRpY2F0ZV9leHByLT5nZXRfbG9jdXMgKCksDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhp cyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1 dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgYmxv Y2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBhdXRv ICZsb29wX2Jsb2NrID0gZXhwci5nZXRfbG9vcF9ibG9jayAoKTsNCj4+Pj4gKyAgbG9vcF9i bG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAobG9vcF9ibG9jay0+aXNf bWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChsb29wX2Js b2NrLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0 cmlwIGJsb2NrIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4g KyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6V2hpbGVMZXRM b29wRXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0 IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0 cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiAr ICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAg ICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGZvciAoYXV0byAmcGF0 dGVybiA6IGV4cHIuZ2V0X3BhdHRlcm5zICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAg IHBhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgICAgIGlmIChwYXR0ZXJu LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQg KHBhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArICAgIH0N Cj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBzY3J1dGluZWUgZXhwciBpdHNlbGYs IGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+Pj4+ICsgIGF1dG8gJnNjcnV0aW5l ZV9leHByID0gZXhwci5nZXRfc2NydXRpbmVlX2V4cHIgKCk7DQo+Pj4+ICsgIHNjcnV0aW5l ZV9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChzY3J1dGluZWVfZXhw ci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChz Y3J1dGluZWVfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAg ImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+ PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJp cCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0byAmbG9vcF9ibG9jayA9IGV4cHIuZ2V0 X2xvb3BfYmxvY2sgKCk7DQo+Pj4+ICsgIGxvb3BfYmxvY2stPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKyAgaWYgKGxvb3BfYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAobG9vcF9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4+ PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9uIGlu IHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0 cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0 clZpc2l0b3I6OnZpc2l0IChBU1Q6OkZvckxvb3BFeHByICZleHByKQ0KPj4+PiArew0KPj4+ PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4g KyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkp Ow0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdl dF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwci5tYXJr X2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ ICsNCj4+Pj4gKyAgLy8gc3RyaXAgc3ViLXBhdHRlcm5zIG9mIHBhdHRlcm4NCj4+Pj4gKyAg YXV0byAmcGF0dGVybiA9IGV4cHIuZ2V0X3BhdHRlcm4gKCk7DQo+Pj4+ICsgIHBhdHRlcm4t PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9m b3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xv Y3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJu IGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBz Y3J1dGluZWUgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+ Pj4+ICsgIGF1dG8gJml0ZXJhdG9yX2V4cHIgPSBleHByLmdldF9pdGVyYXRvcl9leHByICgp Ow0KPj4+PiArICBpdGVyYXRvcl9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsg IGlmIChpdGVyYXRvcl9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAg IHJ1c3RfZXJyb3JfYXQgKGl0ZXJhdG9yX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0 aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90 IGFsbG93ZWQiKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBibG9jayBpdHNl bGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+Pj4+ICsgIGF1dG8gJmxvb3Bf YmxvY2sgPSBleHByLmdldF9sb29wX2Jsb2NrICgpOw0KPj4+PiArICBsb29wX2Jsb2NrLT5h Y2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChsb29wX2Jsb2NrLT5pc19tYXJrZWRf Zm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGxvb3BfYmxvY2stPmdl dF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxv Y2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAg ICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4g K3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJZkV4cHIgJmV4cHIpDQo+ Pj4+ICt7DQo+Pj4+ICsgIC8vIHJ1c3QgcGxheWdyb3VuZCB0ZXN0IHNob3dzIHRoYXQgSWZF eHByIGRvZXMgc3VwcG9ydCBvdXRlciBhdHRycywgYXQgbGVhc3QNCj4+Pj4gKyAgLy8gd2hl biB1c2VkIGFzIHN0YXRlbWVudA0KPj4+PiArDQo+Pj4+ICsgIC8vIGluaXRpYWwgc3RyaXAg dGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2Zn X2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRl ci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiAr ICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBz dHJpcCBjb25kaXRpb24gZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Np b25zDQo+Pj4+ICsgIGF1dG8gJmNvbmRpdGlvbl9leHByID0gZXhwci5nZXRfY29uZGl0aW9u X2V4cHIgKCk7DQo+Pj4+ICsgIGNvbmRpdGlvbl9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7 DQo+Pj4+ICsgIG1heWJlX2V4cGFuZF9leHByIChjb25kaXRpb25fZXhwcik7DQo+Pj4+ICsg IGlmIChjb25kaXRpb25fZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAg ICBydXN0X2Vycm9yX2F0IChjb25kaXRpb25fZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9z aXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBu b3QgYWxsb3dlZCIpOw0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGlmIGJsb2Nr IGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0byAm aWZfYmxvY2sgPSBleHByLmdldF9pZl9ibG9jayAoKTsNCj4+Pj4gKyAgaWZfYmxvY2stPmFj Y2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGlmX2Jsb2NrLT5pc19tYXJrZWRfZm9y X3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGlmX2Jsb2NrLT5nZXRfbG9j dXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2NrIGV4 cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAg ICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lk DQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6SWZFeHByQ29uc2VxRWxzZSAmZXhw cikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91 dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0 X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRo X2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4g KyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+ Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGNvbmRpdGlvbiBl eHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0 byAmY29uZGl0aW9uX2V4cHIgPSBleHByLmdldF9jb25kaXRpb25fZXhwciAoKTsNCj4+Pj4g KyAgY29uZGl0aW9uX2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgbWF5YmVf ZXhwYW5kX2V4cHIgKGNvbmRpdGlvbl9leHByKTsNCj4+Pj4gKyAgaWYgKGNvbmRpdGlvbl9l eHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQg KGNvbmRpdGlvbl9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICIN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+ Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgaWYgYmxvY2sgaXRzZWxmLCBidXQgY2Fu IHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBhdXRvICZpZl9ibG9jayA9IGV4cHIu Z2V0X2lmX2Jsb2NrICgpOw0KPj4+PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4+PiArICBpZiAoaWZfYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ ICsgICAgcnVzdF9lcnJvcl9hdCAoaWZfYmxvY2stPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlz IHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0 ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBlbHNl IGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAg YXV0byAmZWxzZV9ibG9jayA9IGV4cHIuZ2V0X2Vsc2VfYmxvY2sgKCk7DQo+Pj4+ICsgIGVs c2VfYmxvY2stPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGVsc2VfYmxvY2st PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZWxz ZV9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5v dCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+ PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OklmRXhw ckNvbnNlcUlmICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRl c3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19h dHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIu ZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ ICsgICAgew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAg ICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3Ry aXAgY29uZGl0aW9uIGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9u cw0KPj4+PiArICBhdXRvICZjb25kaXRpb25fZXhwciA9IGV4cHIuZ2V0X2NvbmRpdGlvbl9l eHByICgpOw0KPj4+PiArICBjb25kaXRpb25fZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0K Pj4+PiArICBtYXliZV9leHBhbmRfZXhwciAoY29uZGl0aW9uX2V4cHIpOw0KPj4+PiArICBp ZiAoY29uZGl0aW9uX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAg cnVzdF9lcnJvcl9hdCAoY29uZGl0aW9uX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0 aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90 IGFsbG93ZWQiKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBpZiBibG9jayBp dHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+Pj4+ICsgIGF1dG8gJmlm X2Jsb2NrID0gZXhwci5nZXRfaWZfYmxvY2sgKCk7DQo+Pj4+ICsgIGlmX2Jsb2NrLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChpZl9ibG9jay0+aXNfbWFya2VkX2Zvcl9z dHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChpZl9ibG9jay0+Z2V0X2xvY3Vz ICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBleHBy ZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArDQo+Pj4+ICsgIC8vIGNh bid0IHN0cmlwIGlmIGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9u cw0KPj4+PiArICBhdXRvICZjb25zZXFfaWZfZXhwciA9IGV4cHIuZ2V0X2NvbnNlcV9pZl9l eHByICgpOw0KPj4+PiArICBjb25zZXFfaWZfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0K Pj4+PiArICBpZiAoY29uc2VxX2lmX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoY29uc2VxX2lmX2V4cHItPmdldF9sb2N1cyAoKSwN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgY29uc2VxdWVudCBpZiBl eHByZXNzaW9uIGluIHRoaXMgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgInBvc2l0aW9u IC0gb3V0ZXIgYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9p ZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OklmRXhwckNvbnNlcUlmTGV0ICZl eHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24g b3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5n ZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dp dGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+ PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsN Cj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgY29uZGl0aW9u IGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBh dXRvICZjb25kaXRpb25fZXhwciA9IGV4cHIuZ2V0X2NvbmRpdGlvbl9leHByICgpOw0KPj4+ PiArICBjb25kaXRpb25fZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBtYXli ZV9leHBhbmRfZXhwciAoY29uZGl0aW9uX2V4cHIpOw0KPj4+PiArICBpZiAoY29uZGl0aW9u X2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9h dCAoY29uZGl0aW9uX2V4cHItPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAg ICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIg Ig0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsN Cj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBpZiBibG9jayBpdHNlbGYsIGJ1dCBj YW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+Pj4+ICsgIGF1dG8gJmlmX2Jsb2NrID0gZXhw ci5nZXRfaWZfYmxvY2sgKCk7DQo+Pj4+ICsgIGlmX2Jsb2NrLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsgIGlmIChpZl9ibG9jay0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ Pj4gKyAgICBydXN0X2Vycm9yX2F0IChpZl9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRo aXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmli dXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGlm IGxldCBleHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4g KyAgYXV0byAmY29uc2VxX2lmX2xldF9leHByID0gZXhwci5nZXRfY29uc2VxX2lmX2xldF9l eHByICgpOw0KPj4+PiArICBjb25zZXFfaWZfbGV0X2V4cHItPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKyAgaWYgKGNvbnNlcV9pZl9sZXRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChjb25zZXFfaWZfbGV0X2V4cHItPmdl dF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgY29u c2VxdWVudCBpZiBsZXQgZXhwcmVzc2lvbiBpbiB0aGlzICINCj4+Pj4gKyAgICAgICAgICAg ICAgICAgICJwb3NpdGlvbiAtIG91dGVyIGF0dHJpYnV0ZXMgbm90ICINCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICJhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtB dHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6SWZMZXRFeHByICZleHByKQ0KPj4+PiArew0KPj4+ PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4g KyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkp Ow0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdl dF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwci5tYXJr X2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ ICsNCj4+Pj4gKyAgZm9yIChhdXRvICZwYXR0ZXJuIDogZXhwci5nZXRfcGF0dGVybnMgKCkp DQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4+PiArICAgICAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4+ PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlz IHBvc2l0aW9uIik7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0 cmlwIHZhbHVlIGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0K Pj4+PiArICBhdXRvICZ2YWx1ZV9leHByID0gZXhwci5nZXRfdmFsdWVfZXhwciAoKTsNCj4+ Pj4gKyAgdmFsdWVfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAodmFs dWVfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9y X2F0ICh2YWx1ZV9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICIN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+ Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgaWYgYmxvY2sgaXRzZWxmLCBidXQgY2Fu IHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBhdXRvICZpZl9ibG9jayA9IGV4cHIu Z2V0X2lmX2Jsb2NrICgpOw0KPj4+PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4+PiArICBpZiAoaWZfYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ ICsgICAgcnVzdF9lcnJvcl9hdCAoaWZfYmxvY2stPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlz IHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0 ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNp dG9yOjp2aXNpdCAoQVNUOjpJZkxldEV4cHJDb25zZXFFbHNlICZleHByKQ0KPj4+PiArew0K Pj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMg KCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHBy LmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwci5t YXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+ Pj4+ICsNCj4+Pj4gKyAgZm9yIChhdXRvICZwYXR0ZXJuIDogZXhwci5nZXRfcGF0dGVybnMg KCkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4+PiArICAgICAgaWYgKHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0K Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0 aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0 IHN0cmlwIHZhbHVlIGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9u cw0KPj4+PiArICBhdXRvICZ2YWx1ZV9leHByID0gZXhwci5nZXRfdmFsdWVfZXhwciAoKTsN Cj4+Pj4gKyAgdmFsdWVfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAo dmFsdWVfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vy cm9yX2F0ICh2YWx1ZV9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVy ICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7 DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgaWYgYmxvY2sgaXRzZWxmLCBidXQg Y2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBhdXRvICZpZl9ibG9jayA9IGV4 cHIuZ2V0X2lmX2Jsb2NrICgpOw0KPj4+PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4+PiArICBpZiAoaWZfYmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoaWZfYmxvY2stPmdldF9sb2N1cyAoKSwNCj4+Pj4g KyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0 aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJp YnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBl bHNlIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4g KyAgYXV0byAmZWxzZV9ibG9jayA9IGV4cHIuZ2V0X2Vsc2VfYmxvY2sgKCk7DQo+Pj4+ICsg IGVsc2VfYmxvY2stPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGVsc2VfYmxv Y2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAo ZWxzZV9ibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNh bm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAi DQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0K Pj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Oklm TGV0RXhwckNvbnNlcUlmICZleHByKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0 cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5k X2NmZ19hdHRycyAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhw YW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9vdXRlcl9hdHRycyAoKSkp DQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgZm9yIChh dXRvICZwYXR0ZXJuIDogZXhwci5nZXRfcGF0dGVybnMgKCkpDQo+Pj4+ICsgICAgew0KPj4+ PiArICAgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICAgICAgaWYg KHBhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAgcnVzdF9l cnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIHZhbHVlIGV4cHIgaXRz ZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBhdXRvICZ2YWx1 ZV9leHByID0gZXhwci5nZXRfdmFsdWVfZXhwciAoKTsNCj4+Pj4gKyAgdmFsdWVfZXhwci0+ YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAodmFsdWVfZXhwci0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0ICh2YWx1ZV9leHByLT5n ZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4 cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAg ICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8g Y2FuJ3Qgc3RyaXAgaWYgYmxvY2sgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNz aW9ucw0KPj4+PiArICBhdXRvICZpZl9ibG9jayA9IGV4cHIuZ2V0X2lmX2Jsb2NrICgpOw0K Pj4+PiArICBpZl9ibG9jay0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAoaWZf YmxvY2stPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9h dCAoaWZfYmxvY2stPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJj YW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIg Ig0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsN Cj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBpZiBleHByIGl0c2VsZiwgYnV0IGNh biBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0byAmY29uc2VxX2lmX2V4cHIg PSBleHByLmdldF9jb25zZXFfaWZfZXhwciAoKTsNCj4+Pj4gKyAgY29uc2VxX2lmX2V4cHIt PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGNvbnNlcV9pZl9leHByLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGNvbnNlcV9p Zl9leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90 IHN0cmlwIGNvbnNlcXVlbnQgaWYgZXhwcmVzc2lvbiBpbiB0aGlzICINCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICJwb3NpdGlvbiAtIG91dGVyIGF0dHJpYnV0ZXMgbm90IGFsbG93ZWQi KTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpJZkxldEV4cHJDb25zZXFJZkxldCAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5p dGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVy LmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAg aWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0 cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAg KCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsg IGZvciAoYXV0byAmcGF0dGVybiA6IGV4cHIuZ2V0X3BhdHRlcm5zICgpKQ0KPj4+PiArICAg IHsNCj4+Pj4gKyAgICAgIHBhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAg ICAgIGlmIChwYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAg IHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAg ICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIp Ow0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCB2YWx1ZSBl eHByIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0 byAmdmFsdWVfZXhwciA9IGV4cHIuZ2V0X3ZhbHVlX2V4cHIgKCk7DQo+Pj4+ICsgIHZhbHVl X2V4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKHZhbHVlX2V4cHItPmlz X21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodmFsdWVf ZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBz dHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAg ICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArDQo+Pj4+ ICsgIC8vIGNhbid0IHN0cmlwIGlmIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWIt ZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0byAmaWZfYmxvY2sgPSBleHByLmdldF9pZl9ibG9j ayAoKTsNCj4+Pj4gKyAgaWZfYmxvY2stPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAg aWYgKGlmX2Jsb2NrLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3Rf ZXJyb3JfYXQgKGlmX2Jsb2NrLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAg ICAgICAiY2Fubm90IHN0cmlwIGJsb2NrIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAt IG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxv d2VkIik7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3RyaXAgaWYgbGV0IGV4cHIgaXRz ZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9ucw0KPj4+PiArICBhdXRvICZjb25z ZXFfaWZfbGV0X2V4cHIgPSBleHByLmdldF9jb25zZXFfaWZfbGV0X2V4cHIgKCk7DQo+Pj4+ ICsgIGNvbnNlcV9pZl9sZXRfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBp ZiAoY29uc2VxX2lmX2xldF9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiAr ICAgIHJ1c3RfZXJyb3JfYXQgKGNvbnNlcV9pZl9sZXRfZXhwci0+Z2V0X2xvY3VzICgpLA0K Pj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBjb25zZXF1ZW50IGlmIGxl dCBleHByZXNzaW9uIGluIHRoaXMgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgInBvc2l0 aW9uIC0gb3V0ZXIgYXR0cmlidXRlcyBub3QgIg0KPj4+PiArICAgICAgICAgICAgICAgICAg ImFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2 aXNpdCAoQVNUOjpNYXRjaEV4cHIgJmV4cHIpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRp YWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5l eHBhbmRfY2ZnX2F0dHJzIChleHByLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlm IChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGV4cHIuZ2V0X291dGVyX2F0dHJz ICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBleHByLm1hcmtfZm9yX3N0cmlwICgp Ow0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAv LyBpbm5lciBhdHRyIHN0cmlwIHRlc3QNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19h dHRycyAoZXhwci5nZXRfaW5uZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIu ZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChleHByLmdldF9pbm5lcl9hdHRycyAoKSkpDQo+Pj4+ ICsgICAgew0KPj4+PiArICAgICAgZXhwci5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAg ICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3Ry aXAgc2NydXRpbmVlIGV4cHIgaXRzZWxmLCBidXQgY2FuIHN0cmlwIHN1Yi1leHByZXNzaW9u cw0KPj4+PiArICBhdXRvICZzY3J1dGluZWVfZXhwciA9IGV4cHIuZ2V0X3NjcnV0aW5lZV9l eHByICgpOw0KPj4+PiArICBzY3J1dGluZWVfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0K Pj4+PiArICBpZiAoc2NydXRpbmVlX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoc2NydXRpbmVlX2V4cHItPmdldF9sb2N1cyAoKSwN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0 aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0dHJp YnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBzdHJpcCBtYXRjaCBj YXNlcw0KPj4+PiArICBhdXRvICZtYXRjaF9jYXNlcyA9IGV4cHIuZ2V0X21hdGNoX2Nhc2Vz ICgpOw0KPj4+PiArICBmb3IgKGF1dG8gaXQgPSBtYXRjaF9jYXNlcy5iZWdpbiAoKTsgaXQg IT0gbWF0Y2hfY2FzZXMuZW5kICgpOykNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBhdXRv ICZtYXRjaF9jYXNlID0gKml0Ow0KPj4+PiArDQo+Pj4+ICsgICAgICAvLyBzdHJpcCBtYXRj aCBjYXNlIGJhc2VkIG9uIG91dGVyIGF0dHJpYnV0ZXMgaW4gbWF0Y2ggYXJtDQo+Pj4+ICsg ICAgICBhdXRvICZtYXRjaF9hcm0gPSBtYXRjaF9jYXNlLmdldF9hcm0gKCk7DQo+Pj4+ICsg ICAgICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChtYXRjaF9hcm0uZ2V0X291dGVyX2F0 dHJzICgpKTsNCj4+Pj4gKyAgICAgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBh bmQgKG1hdGNoX2FybS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgICAgIHsNCj4+ Pj4gKyAgICAgICAgIC8vIHN0cmlwIG1hdGNoIGNhc2UNCj4+Pj4gKyAgICAgICAgIGl0ID0g bWF0Y2hfY2FzZXMuZXJhc2UgKGl0KTsNCj4+Pj4gKyAgICAgICAgIGNvbnRpbnVlOw0KPj4+ PiArICAgICAgIH0NCj4+Pj4gKw0KPj4+PiArICAgICAgZm9yIChhdXRvICZwYXR0ZXJuIDog bWF0Y2hfYXJtLmdldF9wYXR0ZXJucyAoKSkNCj4+Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAg ICAgICBwYXR0ZXJuLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICAgICBpZiAo cGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICAgICAgcnVz dF9lcnJvcl9hdCAocGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAg ICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIp Ow0KPj4+PiArICAgICAgIH0NCj4+Pj4gKw0KPj4+PiArICAgICAgLyogYXNzdW1pbmcgdGhh dCBndWFyZCBleHByZXNzaW9uIGNhbm5vdCBiZSBzdHJpcHBlZCBhcw0KPj4+PiArICAgICAg ICogc3RyaWN0bHkgc3BlYWtpbmcgeW91IHdvdWxkIGhhdmUgdG8gc3RyaXAgdGhlIHdob2xl IGd1YXJkIHRvDQo+Pj4+ICsgICAgICAgKiBtYWtlIHN5bnRhY3RpY2FsIHNlbnNlLCB3aGlj aCB5b3UgY2FuJ3QgZG8uIGFzIHN1Y2gsIG9ubHkNCj4+Pj4gKyAgICAgICAqIHN0cmlwIHN1 Yi1leHByZXNzaW9ucyAqLw0KPj4+PiArICAgICAgaWYgKG1hdGNoX2FybS5oYXNfbWF0Y2hf YXJtX2d1YXJkICgpKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIGF1dG8gJmd1 YXJkX2V4cHIgPSBtYXRjaF9hcm0uZ2V0X2d1YXJkX2V4cHIgKCk7DQo+Pj4+ICsgICAgICAg ICBndWFyZF9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICAgICBpZiAo Z3VhcmRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICAgICAg cnVzdF9lcnJvcl9hdCAoZ3VhcmRfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhpcyBw b3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0 dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gKyAgICAgICB9DQo+Pj4+ICsNCj4+Pj4g KyAgICAgIC8vIHN0cmlwIHN1Yi1leHByZXNzaW9ucyBmcm9tIG1hdGNoIGNhc2VzDQo+Pj4+ ICsgICAgICBhdXRvICZjYXNlX2V4cHIgPSBtYXRjaF9jYXNlLmdldF9leHByICgpOw0KPj4+ PiArICAgICAgY2FzZV9leHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICBp ZiAoY2FzZV9leHByLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1 c3RfZXJyb3JfYXQgKGNhc2VfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9u IC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5v dCBhbGxvd2VkIik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIC8vIGluY3JlbWVudCB0byBuZXh0 IGNhc2UgaWYgaGF2ZW4ndCBjb250aW51ZWQNCj4+Pj4gKyAgICAgICsraXQ7DQo+Pj4+ICsg ICAgfQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChB U1Q6OkF3YWl0RXhwciAmZXhwcikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJp cCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhwci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIGNhbid0 IHN0cmlwIGF3YWl0ZWQgZXhwciBpdHNlbGYsIGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Np b25zDQo+Pj4+ICsgICAqIC0gdGhpcyBpcyBiZWNhdXNlIHlvdSBjYW4ndCBoYXZlIG5vIGV4 cHIgdG8gYXdhaXQgKi8NCj4+Pj4gKyAgYXV0byAmYXdhaXRlZF9leHByID0gZXhwci5nZXRf YXdhaXRlZF9leHByICgpOw0KPj4+PiArICBhd2FpdGVkX2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+Pj4gKyAgaWYgKGF3YWl0ZWRfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChhd2FpdGVkX2V4cHItPmdldF9sb2N1cyAo KSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBp biB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+PiArICAgICAgICAgICAgICAgICAgImF0 dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0 dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpBc3luY0Jsb2NrRXhwciAmZXhwcikNCj4+Pj4gK3sN Cj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+ Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4cHIuZ2V0X291dGVyX2F0dHJz ICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZXhw ci5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cHIu bWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0K Pj4+PiArDQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBz dHJpcCBzdWItZXhwcmVzc2lvbnMNCj4+Pj4gKyAgYXV0byAmYmxvY2tfZXhwciA9IGV4cHIu Z2V0X2Jsb2NrX2V4cHIgKCk7DQo+Pj4+ICsgIGJsb2NrX2V4cHItPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+Pj4gKyAgaWYgKGJsb2NrX2V4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp DQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoYmxvY2tfZXhwci0+Z2V0X2xvY3VzICgpLA0K Pj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBibG9jayBleHByZXNzaW9u IGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAi YXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICt2b2lk DQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHlwZVBhcmFtICZwYXJhbSkNCj4+ Pj4gK3sNCj4+Pj4gKyAgLy8gb3V0ZXIgYXR0cmlidXRlcyBkb24ndCBhY3R1YWxseSBkbyBh bnl0aGluZywgc28gaWdub3JlIHRoZW0NCj4+Pj4gKw0KPj4+PiArICBpZiAocGFyYW0uaGFz X3R5cGVfcGFyYW1fYm91bmRzICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIC8vIGRv bid0IHN0cmlwIGRpcmVjdGx5LCBvbmx5IGNvbXBvbmVudHMgb2YgYm91bmRzDQo+Pj4+ICsg ICAgICBmb3IgKGF1dG8gJmJvdW5kIDogcGFyYW0uZ2V0X3R5cGVfcGFyYW1fYm91bmRzICgp KQ0KPj4+PiArICAgICAgIGJvdW5kLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAg fQ0KPj4+PiArDQo+Pj4+ICsgIGlmIChwYXJhbS5oYXNfdHlwZSAoKSkNCj4+Pj4gKyAgICB7 DQo+Pj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6OkNv bnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKyAgICAgIGF1dG8gJnR5cGUgPSBwYXJhbS5nZXRf dHlwZSAoKTsNCj4+Pj4gKyAgICAgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4g Kw0KPj4+PiArICAgICAgbWF5YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ ICsgICAgICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAg ICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ Pj4gKw0KPj4+PiArICAgICAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsgICAg fQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OkxpZmV0aW1lV2hlcmVDbGF1c2VJdGVtICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNob3Vs ZG4ndCByZXF1aXJlDQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6VHlwZUJvdW5kV2hlcmVDbGF1c2VJdGVtICZpdGVtKQ0KPj4+PiArew0K Pj4+PiArICAvLyBmb3IgbGlmZXRpbWVzIHNob3VsZG4ndCByZXF1aXJlDQo+Pj4+ICsNCj4+ Pj4gKyAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlw ZTo6VFlQRSk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmdHlwZSA9IGl0ZW0uZ2V0X3R5cGUg KCk7DQo+Pj4+ICsgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiAr ICBtYXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHR5cGUt PmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAodHlw ZS0+Z2V0X2xvY3VzICgpLCAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIp Ow0KPj4+PiArDQo+Pj4+ICsgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4+PiArDQo+ Pj4+ICsgIC8vIGRvbid0IHN0cmlwIGRpcmVjdGx5LCBvbmx5IGNvbXBvbmVudHMgb2YgYm91 bmRzDQo+Pj4+ICsgIGZvciAoYXV0byAmYm91bmQgOiBpdGVtLmdldF90eXBlX3BhcmFtX2Jv dW5kcyAoKSkNCj4+Pj4gKyAgICBib3VuZC0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiAr fQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1ldGhvZCAm bWV0aG9kKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0 ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAobWV0aG9kLmdl dF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0 aF9leHBhbmQgKG1ldGhvZC5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+ Pj4gKyAgICAgIG1ldGhvZC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVy bjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8ganVzdCBleHBhbmQgc3ViLXN0 dWZmIC0gY2FuJ3QgYWN0dWFsbHkgc3RyaXAgZ2VuZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0K Pj4+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogbWV0aG9kLmdldF9nZW5lcmljX3BhcmFtcyAo KSkNCj4+Pj4gKyAgICBwYXJhbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ ICsgIC8qIGFzc3VtaW5nIHlvdSBjYW4ndCBzdHJpcCBzZWxmIHBhcmFtIC0gd291bGRuJ3Qg YmUgYSBtZXRob2QNCj4+Pj4gKyAgICogYW55bW9yZS4gc3BlYyBhbGxvd3Mgb3V0ZXIgYXR0 cnMgb24gc2VsZiBwYXJhbSwgYnV0IGRvZXNuJ3QNCj4+Pj4gKyAgICogc3BlY2lmeSB3aGV0 aGVyIGNmZyBpcyB1c2VkLiAqLw0KPj4+PiArICBleHBhbmRfc2VsZl9wYXJhbSAobWV0aG9k LmdldF9zZWxmX3BhcmFtICgpKTsNCj4+Pj4gKw0KPj4+PiArICAvKiBzdHJpcCBtZXRob2Qg cGFyYW1ldGVycyBpZiByZXF1aXJlZCAtIHRoaXMgaXMgc3BlY2lmaWNhbGx5DQo+Pj4+ICsg ICAqIGFsbG93ZWQgYnkgc3BlYyAqLw0KPj4+PiArICBleHBhbmRfZnVuY3Rpb25fcGFyYW1z IChtZXRob2QuZ2V0X2Z1bmN0aW9uX3BhcmFtcyAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYg KG1ldGhvZC5oYXNfcmV0dXJuX3R5cGUgKCkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAg ZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQ RSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGF1dG8gJnJldHVybl90eXBlID0gbWV0aG9kLmdl dF9yZXR1cm5fdHlwZSAoKTsNCj4+Pj4gKyAgICAgIHJldHVybl90eXBlLT5hY2NlcHRfdmlz ICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIG1heWJlX2V4cGFuZF90eXBlIChyZXR1 cm5fdHlwZSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChyZXR1cm5f dHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5u b3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAg IGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiAr ICBpZiAobWV0aG9kLmhhc193aGVyZV9jbGF1c2UgKCkpDQo+Pj4+ICsgICAgZXhwYW5kX3do ZXJlX2NsYXVzZSAobWV0aG9kLmdldF93aGVyZV9jbGF1c2UgKCkpOw0KPj4+PiArDQo+Pj4+ ICsgIC8qIGJvZHkgc2hvdWxkIGFsd2F5cyBleGlzdCAtIGlmIGVycm9yIHN0YXRlLCBzaG91 bGQgaGF2ZSByZXR1cm5lZA0KPj4+PiArICAgKiBiZWZvcmUgbm93ICovDQo+Pj4+ICsgIC8v IGNhbid0IHN0cmlwIGJsb2NrIGl0c2VsZiwgYnV0IGNhbiBzdHJpcCBzdWItZXhwcmVzc2lv bnMNCj4+Pj4gKyAgYXV0byAmYmxvY2tfZXhwciA9IG1ldGhvZC5nZXRfZGVmaW5pdGlvbiAo KTsNCj4+Pj4gKyAgYmxvY2tfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBp ZiAoYmxvY2tfZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0 X2Vycm9yX2F0IChibG9ja19leHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2NrIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlv biAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBh bGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6TW9kdWxlICZtb2R1bGUpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHN0cmlwIHRl c3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19h dHRycyAobW9kdWxlLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRl ci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKG1vZHVsZS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIG1vZHVsZS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gQSBs b2FkZWQgbW9kdWxlIG1pZ2h0IGhhdmUgaW5uZXIgYXR0cmlidXRlcw0KPj4+PiArICBpZiAo bW9kdWxlLmdldF9raW5kICgpID09IEFTVDo6TW9kdWxlOjpNb2R1bGVLaW5kOjpMT0FERUQp DQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgLy8gc3RyaXAgdGVzdCBiYXNlZCBvbiBpbm5l ciBhdHRycw0KPj4+PiArICAgICAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAobW9kdWxl LmdldF9pbm5lcl9hdHRycyAoKSk7DQo+Pj4+ICsgICAgICBpZiAoZXhwYW5kZXIuZmFpbHNf Y2ZnX3dpdGhfZXhwYW5kIChtb2R1bGUuZ2V0X2lubmVyX2F0dHJzICgpKSkNCj4+Pj4gKyAg ICAgICB7DQo+Pj4+ICsgICAgICAgICBtb2R1bGUubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ ICsgICAgICAgICByZXR1cm47DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArICAgIH0NCj4+Pj4g Kw0KPj4+PiArICAvLyBQYXJzZSB0aGUgbW9kdWxlJ3MgaXRlbXMgaWYgdGhleSBoYXZlbid0 IGJlZW4gZXhwYW5kZWQgYW5kIHRoZSBmaWxlDQo+Pj4+ICsgIC8vIHNob3VsZCBiZSBwYXJz ZWQgKGkuZSBpc24ndCBoaWRkZW4gYmVoaW5kIGFuIHVudHJ1ZSBvciBpbXBvc3NpYmxlIGNm Zw0KPj4+PiArICAvLyBkaXJlY3RpdmUpDQo+Pj4+ICsgIGlmICghbW9kdWxlLmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkNCj4+Pj4gKyAgICAgICYmIG1vZHVsZS5nZXRfa2luZCAoKSA9PSBB U1Q6Ok1vZHVsZTo6TW9kdWxlS2luZDo6VU5MT0FERUQpDQo+Pj4+ICsgICAgew0KPj4+PiAr ICAgICAgbW9kdWxlLmxvYWRfaXRlbXMgKCk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ ICsgIC8vIHN0cmlwIGl0ZW1zIGlmIHJlcXVpcmVkDQo+Pj4+ICsgIGV4cGFuZF9wb2ludGVy X2FsbG93X3N0cmlwIChtb2R1bGUuZ2V0X2l0ZW1zICgpKTsNCj4+Pj4gK30NCj4+Pj4gK3Zv aWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpFeHRlcm5DcmF0ZSAmZXh0ZXJu X2NyYXRlKQ0KPj4+PiArew0KPj4+PiArICAvLyBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVy IGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGV4dGVybl9jcmF0 ZS5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2Zn X3dpdGhfZXhwYW5kIChleHRlcm5fY3JhdGUuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4g KyAgICB7DQo+Pj4+ICsgICAgICBleHRlcm5fY3JhdGUubWFya19mb3Jfc3RyaXAgKCk7DQo+ Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGlmICgh ZXh0ZXJuX2NyYXRlLnJlZmVyZW5jZXNfc2VsZiAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsg ICAgICBTZXNzaW9uICZzZXNzaW9uID0gU2Vzc2lvbjo6Z2V0X2luc3RhbmNlICgpOw0KPj4+ PiArICAgICAgc2Vzc2lvbi5sb2FkX2V4dGVybl9jcmF0ZSAoZXh0ZXJuX2NyYXRlLmdldF9y ZWZlcmVuY2VkX2NyYXRlICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBleHRlcm5fY3JhdGUuZ2V0X2xvY3VzICgpKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICt9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VXNlVHJlZUds b2IgJikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gc2hvdWxkbid0IHJlcXVpcmU/DQo+Pj4+ICt9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VXNlVHJlZUxp c3QgJikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gc2hvdWxkbid0IHJlcXVpcmU/DQo+Pj4+ICt9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VXNlVHJlZVJl YmluZCAmKQ0KPj4+PiArew0KPj4+PiArICAvLyBzaG91bGRuJ3QgcmVxdWlyZT8NCj4+Pj4g K30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpVc2VEZWNs YXJhdGlvbiAmdXNlX2RlY2wpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHN0cmlwIHRlc3QgYmFz ZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo dXNlX2RlY2wuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAodXNlX2RlY2wuZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+ Pj4gKyAgICB7DQo+Pj4+ICsgICAgICB1c2VfZGVjbC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+ Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+ Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RnVuY3Rpb24gJmZ1bmN0aW9uKQ0KPj4+ PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+ Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZnVuY3Rpb24uZ2V0X291dGVyX2F0 dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAo ZnVuY3Rpb24uZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAg ICBmdW5jdGlvbi5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+ Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8ganVzdCBleHBhbmQgc3ViLXN0dWZmIC0g Y2FuJ3QgYWN0dWFsbHkgc3RyaXAgZ2VuZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0KPj4+PiAr ICBmb3IgKGF1dG8gJnBhcmFtIDogZnVuY3Rpb24uZ2V0X2dlbmVyaWNfcGFyYW1zICgpKQ0K Pj4+PiArICAgIHBhcmFtLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAg Lyogc3RyaXAgZnVuY3Rpb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZCAtIHRoaXMgaXMgc3Bl Y2lmaWNhbGx5DQo+Pj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAqLw0KPj4+PiArICBleHBh bmRfZnVuY3Rpb25fcGFyYW1zIChmdW5jdGlvbi5nZXRfZnVuY3Rpb25fcGFyYW1zICgpKTsN Cj4+Pj4gKw0KPj4+PiArICBpZiAoZnVuY3Rpb24uaGFzX3JldHVybl90eXBlICgpKQ0KPj4+ PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBh bmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBhdXRvICZy ZXR1cm5fdHlwZSA9IGZ1bmN0aW9uLmdldF9yZXR1cm5fdHlwZSAoKTsNCj4+Pj4gKyAgICAg IHJldHVybl90eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAg IG1heWJlX2V4cGFuZF90eXBlIChyZXR1cm5fdHlwZSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAg IGlmIChyZXR1cm5fdHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAg ICBydXN0X2Vycm9yX2F0IChyZXR1cm5fdHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAg ICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9u Iik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4+ PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBpZiAoZnVuY3Rpb24uaGFzX3doZXJlX2NsYXVz ZSAoKSkNCj4+Pj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlIChmdW5jdGlvbi5nZXRfd2hl cmVfY2xhdXNlICgpKTsNCj4+Pj4gKw0KPj4+PiArICAvKiBib2R5IHNob3VsZCBhbHdheXMg ZXhpc3QgLSBpZiBlcnJvciBzdGF0ZSwgc2hvdWxkIGhhdmUgcmV0dXJuZWQNCj4+Pj4gKyAg ICogYmVmb3JlIG5vdyAqLw0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBibG9jayBpdHNlbGYs IGJ1dCBjYW4gc3RyaXAgc3ViLWV4cHJlc3Npb25zDQo+Pj4+ICsgIGF1dG8gJmJsb2NrX2V4 cHIgPSBmdW5jdGlvbi5nZXRfZGVmaW5pdGlvbiAoKTsNCj4+Pj4gKyAgYmxvY2tfZXhwci0+ YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAoYmxvY2tfZXhwci0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChibG9ja19leHByLT5n ZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJs b2NrIGV4cHJlc3Npb24gaW4gdGhpcyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHlwZUFsaWFzICZ0eXBl X2FsaWFzKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0 ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAodHlwZV9hbGlh cy5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2Zn X3dpdGhfZXhwYW5kICh0eXBlX2FsaWFzLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsg ICAgew0KPj4+PiArICAgICAgdHlwZV9hbGlhcy5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4g KyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8ganVzdCBl eHBhbmQgc3ViLXN0dWZmIC0gY2FuJ3QgYWN0dWFsbHkgc3RyaXAgZ2VuZXJpYyBwYXJhbXMg dGhlbXNlbHZlcw0KPj4+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogdHlwZV9hbGlhcy5nZXRf Z2VuZXJpY19wYXJhbXMgKCkpDQo+Pj4+ICsgICAgcGFyYW0tPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKw0KPj4+PiArICBpZiAodHlwZV9hbGlhcy5oYXNfd2hlcmVfY2xhdXNlICgp KQ0KPj4+PiArICAgIGV4cGFuZF93aGVyZV9jbGF1c2UgKHR5cGVfYWxpYXMuZ2V0X3doZXJl X2NsYXVzZSAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmdHlwZSA9IHR5cGVfYWxpYXMu Z2V0X3R5cGVfYWxpYXNlZCAoKTsNCj4+Pj4gKyAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMp Ow0KPj4+PiArICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAg ICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksICJjYW5ub3Qgc3RyaXAgdHlw ZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRy VmlzaXRvcjo6dmlzaXQgKEFTVDo6U3RydWN0U3RydWN0ICZzdHJ1Y3RfaXRlbSkNCj4+Pj4g K3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHN0cnVjdF9pdGVtLmdldF9vdXRlcl9h dHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQg KHN0cnVjdF9pdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiAr ICAgICAgc3RydWN0X2l0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1 cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGp1c3QgZXhwYW5kIHN1Yi1z dHVmZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVyaWMgcGFyYW1zIHRoZW1zZWx2ZXMN Cj4+Pj4gKyAgZm9yIChhdXRvICZwYXJhbSA6IHN0cnVjdF9pdGVtLmdldF9nZW5lcmljX3Bh cmFtcyAoKSkNCj4+Pj4gKyAgICBwYXJhbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiAr DQo+Pj4+ICsgIGlmIChzdHJ1Y3RfaXRlbS5oYXNfd2hlcmVfY2xhdXNlICgpKQ0KPj4+PiAr ICAgIGV4cGFuZF93aGVyZV9jbGF1c2UgKHN0cnVjdF9pdGVtLmdldF93aGVyZV9jbGF1c2Ug KCkpOw0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlwIHN0cnVjdCBmaWVsZHMgaWYgcmVxdWly ZWQgLSB0aGlzIGlzIHByZXN1bWFibHkNCj4+Pj4gKyAgICogYWxsb3dlZCBieSBzcGVjICov DQo+Pj4+ICsgIGV4cGFuZF9zdHJ1Y3RfZmllbGRzIChzdHJ1Y3RfaXRlbS5nZXRfZmllbGRz ICgpKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAo QVNUOjpUdXBsZVN0cnVjdCAmdHVwbGVfc3RydWN0KQ0KPj4+PiArew0KPj4+PiArICAvLyBp bml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhw YW5kX2NmZ19hdHRycyAodHVwbGVfc3RydWN0LmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHR1cGxlX3N0cnVjdC5n ZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHR1cGxlX3N0 cnVjdC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAg ICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8ganVzdCBleHBhbmQgc3ViLXN0dWZmIC0gY2FuJ3Qg YWN0dWFsbHkgc3RyaXAgZ2VuZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0KPj4+PiArICBmb3Ig KGF1dG8gJnBhcmFtIDogdHVwbGVfc3RydWN0LmdldF9nZW5lcmljX3BhcmFtcyAoKSkNCj4+ Pj4gKyAgICBwYXJhbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsgIC8q IHN0cmlwIHN0cnVjdCBmaWVsZHMgaWYgcmVxdWlyZWQgLSB0aGlzIGlzIHByZXN1bWFibHkN Cj4+Pj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+Pj4+ICsgIGV4cGFuZF90dXBsZV9m aWVsZHMgKHR1cGxlX3N0cnVjdC5nZXRfZmllbGRzICgpKTsNCj4+Pj4gKw0KPj4+PiArICBp ZiAodHVwbGVfc3RydWN0Lmhhc193aGVyZV9jbGF1c2UgKCkpDQo+Pj4+ICsgICAgZXhwYW5k X3doZXJlX2NsYXVzZSAodHVwbGVfc3RydWN0LmdldF93aGVyZV9jbGF1c2UgKCkpOw0KPj4+ PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkVudW1J dGVtICZpdGVtKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24g b3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5n ZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dp dGhfZXhwYW5kIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+ PiArICAgICAgaXRlbS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsN Cj4+Pj4gKyAgICB9DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6RW51bUl0ZW1UdXBsZSAmaXRlbSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8g aW5pdGlhbCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4 cGFuZF9jZmdfYXR0cnMgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYg KGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMg KCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGl0ZW0ubWFya19mb3Jfc3RyaXAgKCk7 DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8q IHN0cmlwIGl0ZW0gZmllbGRzIGlmIHJlcXVpcmVkIC0gdGhpcyBpcyBwcmVzdW1hYmx5DQo+ Pj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAqLw0KPj4+PiArICBleHBhbmRfdHVwbGVfZmll bGRzIChpdGVtLmdldF90dXBsZV9maWVsZHMgKCkpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0K Pj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkVudW1JdGVtU3RydWN0ICZpdGVtKQ0K Pj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMN Cj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5nZXRfb3V0ZXJfYXR0 cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChp dGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgaXRl bS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9 DQo+Pj4+ICsNCj4+Pj4gKyAgLyogc3RyaXAgaXRlbSBmaWVsZHMgaWYgcmVxdWlyZWQgLSB0 aGlzIGlzIHByZXN1bWFibHkNCj4+Pj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+Pj4+ ICsgIGV4cGFuZF9zdHJ1Y3RfZmllbGRzIChpdGVtLmdldF9zdHJ1Y3RfZmllbGRzICgpKTsN Cj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpF bnVtSXRlbURpc2NyaW1pbmFudCAmaXRlbSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlh bCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGl0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlw IGFueSBpbnRlcm5hbCBzdWItZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24n dA0KPj4+PiArICAgKiBhbGxvd2VkIHRvIGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0 aGlzIHBvc2l0aW9uIHNvIGNhbid0IGJlDQo+Pj4+ICsgICAqIHN0cmlwcGVkLiAqLw0KPj4+ PiArICBhdXRvICZleHByID0gaXRlbS5nZXRfZXhwciAoKTsNCj4+Pj4gKyAgZXhwci0+YWNj ZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAoZXhwci0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChleHByLT5nZXRfbG9jdXMgKCksDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGV4cHJlc3Npb24gaW4gdGhp cyBwb3NpdGlvbiAtIG91dGVyICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJhdHRyaWJ1 dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlz aXRvcjo6dmlzaXQgKEFTVDo6RW51bSAmZW51bV9pdGVtKQ0KPj4+PiArew0KPj4+PiArICAv LyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIu ZXhwYW5kX2NmZ19hdHRycyAoZW51bV9pdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGVudW1faXRlbS5nZXRf b3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGVudW1faXRlbS5t YXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+ Pj4+ICsNCj4+Pj4gKyAgLy8ganVzdCBleHBhbmQgc3ViLXN0dWZmIC0gY2FuJ3QgYWN0dWFs bHkgc3RyaXAgZ2VuZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0KPj4+PiArICBmb3IgKGF1dG8g JnBhcmFtIDogZW51bV9pdGVtLmdldF9nZW5lcmljX3BhcmFtcyAoKSkNCj4+Pj4gKyAgICBw YXJhbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsgIGlmIChlbnVtX2l0 ZW0uaGFzX3doZXJlX2NsYXVzZSAoKSkNCj4+Pj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNl IChlbnVtX2l0ZW0uZ2V0X3doZXJlX2NsYXVzZSAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgLyog c3RyaXAgZW51bSBmaWVsZHMgaWYgcmVxdWlyZWQgLSB0aGlzIGlzIHByZXN1bWFibHkNCj4+ Pj4gKyAgICogYWxsb3dlZCBieSBzcGVjICovDQo+Pj4+ICsgIGV4cGFuZF9wb2ludGVyX2Fs bG93X3N0cmlwIChlbnVtX2l0ZW0uZ2V0X3ZhcmlhbnRzICgpKTsNCj4+Pj4gK30NCj4+Pj4g K3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpVbmlvbiAmdW5pb25faXRl bSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0 dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKHVuaW9uX2l0ZW0uZ2V0 X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRo X2V4cGFuZCAodW5pb25faXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsN Cj4+Pj4gKyAgICAgIHVuaW9uX2l0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAg ICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGp1c3QgZXhwYW5k IHN1Yi1zdHVmZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVyaWMgcGFyYW1zIHRoZW1z ZWx2ZXMNCj4+Pj4gKyAgZm9yIChhdXRvICZwYXJhbSA6IHVuaW9uX2l0ZW0uZ2V0X2dlbmVy aWNfcGFyYW1zICgpKQ0KPj4+PiArICAgIHBhcmFtLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+ Pj4+ICsNCj4+Pj4gKyAgaWYgKHVuaW9uX2l0ZW0uaGFzX3doZXJlX2NsYXVzZSAoKSkNCj4+ Pj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlICh1bmlvbl9pdGVtLmdldF93aGVyZV9jbGF1 c2UgKCkpOw0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlwIHVuaW9uIGZpZWxkcyBpZiByZXF1 aXJlZCAtIHRoaXMgaXMgcHJlc3VtYWJseQ0KPj4+PiArICAgKiBhbGxvd2VkIGJ5IHNwZWMg Ki8NCj4+Pj4gKyAgZXhwYW5kX3N0cnVjdF9maWVsZHMgKHVuaW9uX2l0ZW0uZ2V0X3Zhcmlh bnRzICgpKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNp dCAoQVNUOjpDb25zdGFudEl0ZW0gJmNvbnN0X2l0ZW0pDQo+Pj4+ICt7DQo+Pj4+ICsgIC8v IGluaXRpYWwgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5l eHBhbmRfY2ZnX2F0dHJzIChjb25zdF9pdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGNvbnN0X2l0ZW0uZ2V0 X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBjb25zdF9pdGVt Lm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0N Cj4+Pj4gKw0KPj4+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6 OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBzdHJpcCBhbnkgc3Vi LXR5cGVzDQo+Pj4+ICsgIGF1dG8gJnR5cGUgPSBjb25zdF9pdGVtLmdldF90eXBlICgpOw0K Pj4+PiArICB0eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgbWF5 YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgIGlmICh0eXBlLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUtPmdl dF9sb2N1cyAoKSwgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+ Pj4gKw0KPj4+PiArICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+Pj4gKw0KPj4+PiAr ICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zIC0gZXhwcmVzc2lvbiBp dHNlbGYgaXNuJ3QNCj4+Pj4gKyAgICogYWxsb3dlZCB0byBoYXZlIGV4dGVybmFsIGF0dHJp YnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBjYW4ndCBiZQ0KPj4+PiArICAgKiBzdHJpcHBl ZC4gKi8NCj4+Pj4gKyAgYXV0byAmZXhwciA9IGNvbnN0X2l0ZW0uZ2V0X2V4cHIgKCk7DQo+ Pj4+ICsgIGV4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGV4cHItPmlz X21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci0+ Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBl eHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAiYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9p ZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlN0YXRpY0l0ZW0gJnN0YXRpY19p dGVtKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0ZXIg YXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoc3RhdGljX2l0ZW0u Z2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193 aXRoX2V4cGFuZCAoc3RhdGljX2l0ZW0uZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAg ICB7DQo+Pj4+ICsgICAgICBzdGF0aWNfaXRlbS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4g KyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIu cHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+Pj4+ ICsNCj4+Pj4gKyAgLy8gc3RyaXAgYW55IHN1Yi10eXBlcw0KPj4+PiArICBhdXRvICZ0eXBl ID0gc3RhdGljX2l0ZW0uZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgIHR5cGUtPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICBtYXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+ Pj4+ICsNCj4+Pj4gKyAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ ICsgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLCAiY2Fubm90IHN0cmlw IHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArDQo+Pj4+ICsgIGV4cGFuZGVyLnBv cF9jb250ZXh0ICgpOw0KPj4+PiArDQo+Pj4+ICsgIC8qIHN0cmlwIGFueSBpbnRlcm5hbCBz dWItZXhwcmVzc2lvbnMgLSBleHByZXNzaW9uIGl0c2VsZiBpc24ndA0KPj4+PiArICAgKiBh bGxvd2VkIHRvIGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlzIHBvc2l0aW9uIHNv IGNhbid0IGJlDQo+Pj4+ICsgICAqIHN0cmlwcGVkLiAqLw0KPj4+PiArICBhdXRvICZleHBy ID0gc3RhdGljX2l0ZW0uZ2V0X2V4cHIgKCk7DQo+Pj4+ICsgIGV4cHItPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGV4cHItPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAoZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAg ICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRp b24gLSBvdXRlciAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBub3Qg YWxsb3dlZCIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZp c2l0IChBU1Q6OlRyYWl0SXRlbUZ1bmMgJml0ZW0pDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGlu aXRpYWwgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBh bmRfY2ZnX2F0dHJzIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChl eHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgp KSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBpdGVtLm1hcmtfZm9yX3N0cmlwICgpOw0K Pj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBleHBh bmRfdHJhaXRfZnVuY3Rpb25fZGVjbCAoaXRlbS5nZXRfdHJhaXRfZnVuY3Rpb25fZGVjbCAo KSk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGl0ZW0uaGFzX2RlZmluaXRpb24gKCkpDQo+Pj4+ ICsgICAgew0KPj4+PiArICAgICAgLyogc3RyaXAgYW55IGludGVybmFsIHN1Yi1leHByZXNz aW9ucyAtIGV4cHJlc3Npb24gaXRzZWxmIGlzbid0DQo+Pj4+ICsgICAgICAgKiBhbGxvd2Vk IHRvIGhhdmUgZXh0ZXJuYWwgYXR0cmlidXRlcyBpbiB0aGlzIHBvc2l0aW9uIHNvIGNhbid0 IGJlDQo+Pj4+ICsgICAgICAgKiBzdHJpcHBlZC4gKi8NCj4+Pj4gKyAgICAgIGF1dG8gJmJs b2NrID0gaXRlbS5nZXRfZGVmaW5pdGlvbiAoKTsNCj4+Pj4gKyAgICAgIGJsb2NrLT5hY2Nl cHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICBpZiAoYmxvY2stPmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAoYmxvY2stPmdldF9sb2N1 cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIGJsb2Nr IGV4cHJlc3Npb24gaW4gdGhpcyAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgInBv c2l0aW9uIC0gb3V0ZXIgYXR0cmlidXRlcyBub3QgYWxsb3dlZCIpOw0KPj4+PiArICAgIH0N Cj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpU cmFpdEl0ZW1NZXRob2QgJml0ZW0pDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRpYWwgdGVz dCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0 dHJzIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5m YWlsc19jZmdfd2l0aF9leHBhbmQgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKSkNCj4+Pj4g KyAgICB7DQo+Pj4+ICsgICAgICBpdGVtLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAg ICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBleHBhbmRfdHJhaXRf bWV0aG9kX2RlY2wgKGl0ZW0uZ2V0X3RyYWl0X21ldGhvZF9kZWNsICgpKTsNCj4+Pj4gKw0K Pj4+PiArICBpZiAoaXRlbS5oYXNfZGVmaW5pdGlvbiAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ ICsgICAgICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3ViLWV4cHJlc3Npb25zIC0gZXhwcmVz c2lvbiBpdHNlbGYgaXNuJ3QNCj4+Pj4gKyAgICAgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRl cm5hbCBhdHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+Pj4gKyAg ICAgICAqIHN0cmlwcGVkLiAqLw0KPj4+PiArICAgICAgYXV0byAmYmxvY2sgPSBpdGVtLmdl dF9kZWZpbml0aW9uICgpOw0KPj4+PiArICAgICAgYmxvY2stPmFjY2VwdF92aXMgKCp0aGlz KTsNCj4+Pj4gKyAgICAgIGlmIChibG9jay0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+ Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChibG9jay0+Z2V0X2xvY3VzICgpLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgYmxvY2sgZXhwcmVzc2lvbiBp biB0aGlzICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gLSBvdXRl ciBhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+Pj4+ICsgICAgfQ0KPj4+PiArfQ0KPj4+ PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlRyYWl0SXRlbUNvbnN0 ICZpdGVtKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHRlc3QgYmFzZWQgb24gb3V0 ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5nZXRf b3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhf ZXhwYW5kIChpdGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiAr ICAgICAgaXRlbS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+ Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNy b0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gc3Ry aXAgYW55IHN1Yi10eXBlcw0KPj4+PiArICBhdXRvICZ0eXBlID0gaXRlbS5nZXRfdHlwZSAo KTsNCj4+Pj4gKyAgdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsg IG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+Pj4gKw0KPj4+PiArICBpZiAodHlwZS0+ aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0ICh0eXBl LT5nZXRfbG9jdXMgKCksICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7 DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIucG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsNCj4+ Pj4gKyAgLyogc3RyaXAgYW55IGludGVybmFsIHN1Yi1leHByZXNzaW9ucyAtIGV4cHJlc3Np b24gaXRzZWxmIGlzbid0DQo+Pj4+ICsgICAqIGFsbG93ZWQgdG8gaGF2ZSBleHRlcm5hbCBh dHRyaWJ1dGVzIGluIHRoaXMgcG9zaXRpb24gc28gY2FuJ3QgYmUNCj4+Pj4gKyAgICogc3Ry aXBwZWQgKi8NCj4+Pj4gKyAgaWYgKGl0ZW0uaGFzX2V4cHJlc3Npb24gKCkpDQo+Pj4+ICsg ICAgew0KPj4+PiArICAgICAgYXV0byAmZXhwciA9IGl0ZW0uZ2V0X2V4cHIgKCk7DQo+Pj4+ ICsgICAgICBleHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgICAgICBpZiAoZXhw ci0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0 IChleHByLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNh bm5vdCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24gLSBvdXRlciAiDQo+Pj4+ ICsgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgbm90IGFsbG93ZWQiKTsNCj4+ Pj4gKyAgICB9DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6VHJhaXRJdGVtVHlwZSAmaXRlbSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5p dGlhbCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFu ZF9jZmdfYXR0cnMgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4 cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkp KQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGl0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+ Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGlmIChp dGVtLmhhc190eXBlX3BhcmFtX2JvdW5kcyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAg ICAvLyBkb24ndCBzdHJpcCBkaXJlY3RseSwgb25seSBjb21wb25lbnRzIG9mIGJvdW5kcw0K Pj4+PiArICAgICAgZm9yIChhdXRvICZib3VuZCA6IGl0ZW0uZ2V0X3R5cGVfcGFyYW1fYm91 bmRzICgpKQ0KPj4+PiArICAgICAgIGJvdW5kLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ ICsgICAgfQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OlRyYWl0ICZ0cmFpdCkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gaW5pdGlhbCBzdHJp cCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKHRyYWl0LmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBh bmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHRyYWl0LmdldF9vdXRlcl9hdHRycyAoKSkp DQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgdHJhaXQubWFya19mb3Jfc3RyaXAgKCk7DQo+ Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIHN0 cmlwIHRlc3QgYmFzZWQgb24gaW5uZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5k X2NmZ19hdHRycyAodHJhaXQuZ2V0X2lubmVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4 cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAodHJhaXQuZ2V0X2lubmVyX2F0dHJzICgp KSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICB0cmFpdC5tYXJrX2Zvcl9zdHJpcCAoKTsN Cj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8g anVzdCBleHBhbmQgc3ViLXN0dWZmIC0gY2FuJ3QgYWN0dWFsbHkgc3RyaXAgZ2VuZXJpYyBw YXJhbXMgdGhlbXNlbHZlcw0KPj4+PiArICBmb3IgKGF1dG8gJnBhcmFtIDogdHJhaXQuZ2V0 X2dlbmVyaWNfcGFyYW1zICgpKQ0KPj4+PiArICAgIHBhcmFtLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHRyYWl0Lmhhc190eXBlX3BhcmFtX2JvdW5kcyAo KSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICAvLyBkb24ndCBzdHJpcCBkaXJlY3RseSwg b25seSBjb21wb25lbnRzIG9mIGJvdW5kcw0KPj4+PiArICAgICAgZm9yIChhdXRvICZib3Vu ZCA6IHRyYWl0LmdldF90eXBlX3BhcmFtX2JvdW5kcyAoKSkNCj4+Pj4gKyAgICAgICBib3Vu ZC0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBp ZiAodHJhaXQuaGFzX3doZXJlX2NsYXVzZSAoKSkNCj4+Pj4gKyAgICBleHBhbmRfd2hlcmVf Y2xhdXNlICh0cmFpdC5nZXRfd2hlcmVfY2xhdXNlICgpKTsNCj4+Pj4gKw0KPj4+PiArICBz dGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRyYWl0SXRlbT4gKEFTVDo6U2lu Z2xlQVNUTm9kZSk+IGV4dHJhY3Rvcg0KPj4+PiArICAgID0gW10gKEFTVDo6U2luZ2xlQVNU Tm9kZSBub2RlKSB7IHJldHVybiBub2RlLnRha2VfdHJhaXRfaXRlbSAoKTsgfTsNCj4+Pj4g Kw0KPj4+PiArICBleHBhbmRfbWFjcm9fY2hpbGRyZW4gKE1hY3JvRXhwYW5kZXI6OlRSQUlU LCB0cmFpdC5nZXRfdHJhaXRfaXRlbXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICBleHRyYWN0b3IpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0 b3I6OnZpc2l0IChBU1Q6OkluaGVyZW50SW1wbCAmaW1wbCkNCj4+Pj4gK3sNCj4+Pj4gKyAg Ly8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4 cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGltcGwuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaW1wbC5nZXRfb3V0 ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGltcGwubWFya19mb3Jf c3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+ Pj4+ICsgIC8vIHN0cmlwIHRlc3QgYmFzZWQgb24gaW5uZXIgYXR0cnMNCj4+Pj4gKyAgZXhw YW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaW1wbC5nZXRfaW5uZXJfYXR0cnMgKCkpOw0KPj4+ PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChpbXBsLmdldF9pbm5l cl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgaW1wbC5tYXJrX2Zvcl9z dHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+ Pj4gKyAgLy8ganVzdCBleHBhbmQgc3ViLXN0dWZmIC0gY2FuJ3QgYWN0dWFsbHkgc3RyaXAg Z2VuZXJpYyBwYXJhbXMgdGhlbXNlbHZlcw0KPj4+PiArICBmb3IgKGF1dG8gJnBhcmFtIDog aW1wbC5nZXRfZ2VuZXJpY19wYXJhbXMgKCkpDQo+Pj4+ICsgICAgcGFyYW0tPmFjY2VwdF92 aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1h Y3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKw0KPj4+PiArICBhdXRv ICZ0eXBlID0gaW1wbC5nZXRfdHlwZSAoKTsNCj4+Pj4gKyAgdHlwZS0+YWNjZXB0X3ZpcyAo KnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsgIG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+ Pj4gKw0KPj4+PiArICBpZiAodHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4g KyAgICBydXN0X2Vycm9yX2F0ICh0eXBlLT5nZXRfbG9jdXMgKCksICJjYW5ub3Qgc3RyaXAg dHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIucG9w X2NvbnRleHQgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGltcGwuaGFzX3doZXJlX2NsYXVz ZSAoKSkNCj4+Pj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlIChpbXBsLmdldF93aGVyZV9j bGF1c2UgKCkpOw0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVf cHRyPEFTVDo6SW5oZXJlbnRJbXBsSXRlbT4gKEFTVDo6U2luZ2xlQVNUTm9kZSk+DQo+Pj4+ ICsgICAgZXh0cmFjdG9yID0gW10gKEFTVDo6U2luZ2xlQVNUTm9kZSBub2RlKSB7IHJldHVy biBub2RlLnRha2VfaW1wbF9pdGVtICgpOyB9Ow0KPj4+PiArDQo+Pj4+ICsgIGV4cGFuZF9t YWNyb19jaGlsZHJlbiAoTWFjcm9FeHBhbmRlcjo6SU1QTCwgaW1wbC5nZXRfaW1wbF9pdGVt cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvcik7DQo+Pj4+ ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHJhaXRJ bXBsICZpbXBsKQ0KPj4+PiArew0KPj4+PiArICAvLyBpbml0aWFsIHN0cmlwIHRlc3QgYmFz ZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo aW1wbC5nZXRfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNf Y2ZnX3dpdGhfZXhwYW5kIChpbXBsLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAg ew0KPj4+PiArICAgICAgaW1wbC5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJl dHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNl ZCBvbiBpbm5lciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChp bXBsLmdldF9pbm5lcl9hdHRycyAoKSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19j Zmdfd2l0aF9leHBhbmQgKGltcGwuZ2V0X2lubmVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7 DQo+Pj4+ICsgICAgICBpbXBsLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0 dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvLyBqdXN0IGV4cGFuZCBzdWIt c3R1ZmYgLSBjYW4ndCBhY3R1YWxseSBzdHJpcCBnZW5lcmljIHBhcmFtcyB0aGVtc2VsdmVz DQo+Pj4+ICsgIGZvciAoYXV0byAmcGFyYW0gOiBpbXBsLmdldF9nZW5lcmljX3BhcmFtcyAo KSkNCj4+Pj4gKyAgICBwYXJhbS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ ICsgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6 OlRZUEUpOw0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gJnR5cGUgPSBpbXBsLmdldF90eXBlICgp Ow0KPj4+PiArICB0eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAg bWF5YmVfZXhwYW5kX3R5cGUgKHR5cGUpOw0KPj4+PiArDQo+Pj4+ICsgIGlmICh0eXBlLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHR5cGUt PmdldF9sb2N1cyAoKSwgImNhbm5vdCBzdHJpcCB0eXBlIGluIHRoaXMgcG9zaXRpb24iKTsN Cj4+Pj4gKw0KPj4+PiArICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+Pj4gKw0KPj4+ PiArICBhdXRvICZ0cmFpdF9wYXRoID0gaW1wbC5nZXRfdHJhaXRfcGF0aCAoKTsNCj4+Pj4g KyAgdmlzaXQgKHRyYWl0X3BhdGgpOw0KPj4+PiArICBpZiAodHJhaXRfcGF0aC5pc19tYXJr ZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHRyYWl0X3BhdGgu Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCB0 eXBlcGF0aCBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGltcGwu aGFzX3doZXJlX2NsYXVzZSAoKSkNCj4+Pj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlIChp bXBsLmdldF93aGVyZV9jbGF1c2UgKCkpOw0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6ZnVuY3Rp b248c3RkOjp1bmlxdWVfcHRyPEFTVDo6VHJhaXRJbXBsSXRlbT4gKEFTVDo6U2luZ2xlQVNU Tm9kZSk+DQo+Pj4+ICsgICAgZXh0cmFjdG9yDQo+Pj4+ICsgICAgPSBbXSAoQVNUOjpTaW5n bGVBU1ROb2RlIG5vZGUpIHsgcmV0dXJuIG5vZGUudGFrZV90cmFpdF9pbXBsX2l0ZW0gKCk7 IH07DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kX21hY3JvX2NoaWxkcmVuIChNYWNyb0V4cGFu ZGVyOjpUUkFJVF9JTVBMLCBpbXBsLmdldF9pbXBsX2l0ZW1zICgpLA0KPj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+ Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpFeHRlcm5hbFN0YXRpY0l0ZW0gJml0ZW0p DQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMN Cj4+Pj4gKyAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoaXRlbS5nZXRfb3V0ZXJfYXR0 cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChp dGVtLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgaXRl bS5tYXJrX2Zvcl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9 DQo+Pj4+ICsNCj4+Pj4gKyAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4cGFuZGVy OjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmdHlwZSA9IGl0 ZW0uZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgIHR5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ Pj4gKw0KPj4+PiArICBtYXliZV9leHBhbmRfdHlwZSAodHlwZSk7DQo+Pj4+ICsNCj4+Pj4g KyAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9l cnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLCAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhp cyBwb3NpdGlvbiIpOw0KPj4+PiArDQo+Pj4+ICsgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgp Ow0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OkV4dGVybmFsRnVuY3Rpb25JdGVtICZpdGVtKQ0KPj4+PiArew0KPj4+PiArICAvLyBzdHJp cCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ICsgIGV4cGFuZGVyLmV4cGFuZF9j ZmdfYXR0cnMgKGl0ZW0uZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFu ZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoaXRlbS5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGl0ZW0ubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIGp1c3Qg ZXhwYW5kIHN1Yi1zdHVmZiAtIGNhbid0IGFjdHVhbGx5IHN0cmlwIGdlbmVyaWMgcGFyYW1z IHRoZW1zZWx2ZXMNCj4+Pj4gKyAgZm9yIChhdXRvICZwYXJhbSA6IGl0ZW0uZ2V0X2dlbmVy aWNfcGFyYW1zICgpKQ0KPj4+PiArICAgIHBhcmFtLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+ Pj4+ICsNCj4+Pj4gKyAgLyogc3RyaXAgZnVuY3Rpb24gcGFyYW1ldGVycyBpZiByZXF1aXJl ZCAtIHRoaXMgaXMgc3BlY2lmaWNhbGx5DQo+Pj4+ICsgICAqIGFsbG93ZWQgYnkgc3BlYyAq Lw0KPj4+PiArICBhdXRvICZwYXJhbXMgPSBpdGVtLmdldF9mdW5jdGlvbl9wYXJhbXMgKCk7 DQo+Pj4+ICsgIGZvciAoYXV0byBpdCA9IHBhcmFtcy5iZWdpbiAoKTsgaXQgIT0gcGFyYW1z LmVuZCAoKTspDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgYXV0byAmcGFyYW0gPSAqaXQ7 DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGF1dG8gJnBhcmFtX2F0dHJzID0gcGFyYW0uZ2V0X291 dGVyX2F0dHJzICgpOw0KPj4+PiArICAgICAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo cGFyYW1fYXR0cnMpOw0KPj4+PiArICAgICAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRo X2V4cGFuZCAocGFyYW1fYXR0cnMpKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAg IGl0ID0gcGFyYW1zLmVyYXNlIChpdCk7DQo+Pj4+ICsgICAgICAgICBjb250aW51ZTsNCj4+ Pj4gKyAgICAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4 dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4+PiArDQo+Pj4+ICsg ICAgICBhdXRvICZ0eXBlID0gcGFyYW0uZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgICAgICB0eXBl LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIG1heWJlX2V4cGFu ZF90eXBlICh0eXBlKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgaWYgKHR5cGUtPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0 X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg dHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGV4cGFuZGVy LnBvcF9jb250ZXh0ICgpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAvLyBpbmNyZW1lbnQgaWYg bm90aGluZyBlbHNlIGhhcHBlbnMNCj4+Pj4gKyAgICAgICsraXQ7DQo+Pj4+ICsgICAgfQ0K Pj4+PiArICAvKiBOT1RFOiB0aGVzZSBhcmUgZXh0ZXJuIGZ1bmN0aW9uIHBhcmFtcywgd2hp Y2ggbWF5IGhhdmUgZGlmZmVyZW50DQo+Pj4+ICsgICAqIHJ1bGVzIGFuZCByZXN0cmljdGlv bnMgdG8gIm5vcm1hbCIgZnVuY3Rpb24gcGFyYW1zLiBTbyBleHBhbnNpb24NCj4+Pj4gKyAg ICogaGFuZGxlZCBzZXBhcmF0ZWx5LiAqLw0KPj4+PiArDQo+Pj4+ICsgIC8qIFRPRE86IGFz c3VtaW5nIHRoYXQgdmFyaWFkaWMgbmF0dXJlIGNhbm5vdCBiZSBzdHJpcHBlZC4gSWYgdGhp cw0KPj4+PiArICAgKiBpcyBub3QgdHJ1ZSwgdGhlbiBoYXZlIGNvZGUgaGVyZSB0byBkbyBz by4gKi8NCj4+Pj4gKw0KPj4+PiArICBpZiAoaXRlbS5oYXNfcmV0dXJuX3R5cGUgKCkpDQo+ Pj4+ICsgICAgew0KPj4+PiArICAgICAgZXhwYW5kZXIucHVzaF9jb250ZXh0IChNYWNyb0V4 cGFuZGVyOjpDb250ZXh0VHlwZTo6VFlQRSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGF1dG8g JnJldHVybl90eXBlID0gaXRlbS5nZXRfcmV0dXJuX3R5cGUgKCk7DQo+Pj4+ICsgICAgICBy ZXR1cm5fdHlwZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBt YXliZV9leHBhbmRfdHlwZSAocmV0dXJuX3R5cGUpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBp ZiAocmV0dXJuX3R5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAg cnVzdF9lcnJvcl9hdCAocmV0dXJuX3R5cGUtPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIp Ow0KPj4+PiArDQo+Pj4+ICsgICAgICBleHBhbmRlci5wb3BfY29udGV4dCAoKTsNCj4+Pj4g KyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGl0ZW0uaGFzX3doZXJlX2NsYXVzZSAoKSkN Cj4+Pj4gKyAgICBleHBhbmRfd2hlcmVfY2xhdXNlIChpdGVtLmdldF93aGVyZV9jbGF1c2Ug KCkpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6 dmlzaXQgKEFTVDo6RXh0ZXJuQmxvY2sgJmJsb2NrKQ0KPj4+PiArew0KPj4+PiArICAvLyBp bml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhwYW5k ZXIuZXhwYW5kX2NmZ19hdHRycyAoYmxvY2suZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4g KyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoYmxvY2suZ2V0X291dGVy X2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBibG9jay5tYXJrX2Zvcl9z dHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+ Pj4gKyAgLy8gc3RyaXAgdGVzdCBiYXNlZCBvbiBpbm5lciBhdHRycw0KPj4+PiArICBleHBh bmRlci5leHBhbmRfY2ZnX2F0dHJzIChibG9jay5nZXRfaW5uZXJfYXR0cnMgKCkpOw0KPj4+ PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChibG9jay5nZXRfaW5u ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGJsb2NrLm1hcmtfZm9y X3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0K Pj4+PiArICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4dGVybmFsSXRl bT4gKEFTVDo6U2luZ2xlQVNUTm9kZSk+DQo+Pj4+ICsgICAgZXh0cmFjdG9yDQo+Pj4+ICsg ICAgPSBbXSAoQVNUOjpTaW5nbGVBU1ROb2RlIG5vZGUpIHsgcmV0dXJuIG5vZGUudGFrZV9l eHRlcm5hbF9pdGVtICgpOyB9Ow0KPj4+PiArDQo+Pj4+ICsgIGV4cGFuZF9tYWNyb19jaGls ZHJlbiAoTWFjcm9FeHBhbmRlcjo6RVhURVJOLCBibG9jay5nZXRfZXh0ZXJuX2l0ZW1zICgp LA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yKTsNCj4+Pj4gK30N Cj4+Pj4gKw0KPj4+PiArLy8gSSBkb24ndCB0aGluayBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0 byBzdHJpcCBtYWNyb3Mgd2l0aG91dCBleHBhbnNpb24NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0 dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpNYWNyb01hdGNoRnJhZ21lbnQgJikNCj4+Pj4gK3t9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWFjcm9NYXRj aFJlcGV0aXRpb24gJikNCj4+Pj4gK3t9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRv cjo6dmlzaXQgKEFTVDo6TWFjcm9NYXRjaGVyICYpDQo+Pj4+ICt7fQ0KPj4+PiArdm9pZA0K Pj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1hY3JvUnVsZXNEZWZpbml0aW9uICZy dWxlc19kZWYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNl ZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChy dWxlc19kZWYuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+Pj4gKyAgaWYgKGV4cGFuZGVyLmZh aWxzX2NmZ193aXRoX2V4cGFuZCAocnVsZXNfZGVmLmdldF9vdXRlcl9hdHRycyAoKSkpDQo+ Pj4+ICsgICAgew0KPj4+PiArICAgICAgcnVsZXNfZGVmLm1hcmtfZm9yX3N0cmlwICgpOw0K Pj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvLyBJ IGRvbid0IHRoaW5rIGFueSBtYWNybyBydWxlcyBjYW4gYmUgc3RyaXBwZWQgaW4gYW55IHdh eQ0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gcGF0aCA9IFJlc29sdmVyOjpDYW5vbmljYWxQYXRo OjpuZXdfc2VnIChydWxlc19kZWYuZ2V0X25vZGVfaWQgKCksDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzX2RlZi5nZXRfcnVs ZV9uYW1lICgpKTsNCj4+Pj4gKyAgZXhwYW5kZXIucmVzb2x2ZXItPmdldF9tYWNyb19zY29w ZSAoKS5pbnNlcnQgKHBhdGgsIHJ1bGVzX2RlZi5nZXRfbm9kZV9pZCAoKSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNfZGVm LmdldF9sb2N1cyAoKSk7DQo+Pj4+ICsgIGV4cGFuZGVyLm1hcHBpbmdzLT5pbnNlcnRfbWFj cm9fZGVmICgmcnVsZXNfZGVmKTsNCj4+Pj4gKyAgcnVzdF9kZWJ1Z19sb2MgKHJ1bGVzX2Rl Zi5nZXRfbG9jdXMgKCksICJpbnNlcnRpbmcgbWFjcm8gZGVmOiBbJXNdIiwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgcGF0aC5nZXQgKCkuY19zdHIgKCkpOw0KPj4+PiArfQ0KPj4+PiAr DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6TWV0YUl0ZW1Q YXRoICYpDQo+Pj4+ICt7fQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6Ok1ldGFJdGVtU2VxICYpDQo+Pj4+ICt7fQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0 clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1ldGFXb3JkICYpDQo+Pj4+ICt7fQ0KPj4+PiArdm9p ZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6Ok1ldGFOYW1lVmFsdWVTdHIgJikN Cj4+Pj4gK3t9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 TWV0YUxpc3RQYXRocyAmKQ0KPj4+PiAre30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNp dG9yOjp2aXNpdCAoQVNUOjpNZXRhTGlzdE5hbWVWYWx1ZVN0ciAmKQ0KPj4+PiAre30NCj4+ Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkxpdGVy YWxQYXR0ZXJuICYpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIG5vdCBwb3NzaWJsZQ0KPj4+PiAr fQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OklkZW50aWZp ZXJQYXR0ZXJuICZwYXR0ZXJuKQ0KPj4+PiArew0KPj4+PiArICAvLyBjYW4gb25seSBzdHJp cCBzdWItcGF0dGVybnMgb2YgdGhlIGlubmVyIHBhdHRlcm4gdG8gYmluZA0KPj4+PiArICBp ZiAoIXBhdHRlcm4uaGFzX3BhdHRlcm5fdG9fYmluZCAoKSkNCj4+Pj4gKyAgICByZXR1cm47 DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmc3ViX3BhdHRlcm4gPSBwYXR0ZXJuLmdldF9wYXR0 ZXJuX3RvX2JpbmQgKCk7DQo+Pj4+ICsgIHN1Yl9wYXR0ZXJuLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsgIGlmIChzdWJfcGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkN Cj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChzdWJfcGF0dGVybi0+Z2V0X2xvY3VzICgpLA0K Pj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMg cG9zaXRpb24iKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2 aXNpdCAoQVNUOjpXaWxkY2FyZFBhdHRlcm4gJikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gbm90 IHBvc3NpYmxlDQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlz aXQgKEFTVDo6UmFuZ2VQYXR0ZXJuQm91bmRMaXRlcmFsICYpDQo+Pj4+ICt7DQo+Pj4+ICsg IC8vIG5vdCBwb3NzaWJsZQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0 b3I6OnZpc2l0IChBU1Q6OlJhbmdlUGF0dGVybkJvdW5kUGF0aCAmYm91bmQpDQo+Pj4+ICt7 DQo+Pj4+ICsgIC8vIGNhbiBleHBhbmQgcGF0aCwgYnV0IG5vdCBzdHJpcCBpdCBkaXJlY3Rs eQ0KPj4+PiArICBhdXRvICZwYXRoID0gYm91bmQuZ2V0X3BhdGggKCk7DQo+Pj4+ICsgIHZp c2l0IChwYXRoKTsNCj4+Pj4gKyAgaWYgKHBhdGguaXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkN Cj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChwYXRoLmdldF9sb2N1cyAoKSwgImNhbm5vdCBz dHJpcCBwYXRoIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+ Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpSYW5nZVBhdHRlcm5Cb3VuZFF1YWxQYXRo ICZib3VuZCkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gY2FuIGV4cGFuZCBwYXRoLCBidXQgbm90 IHN0cmlwIGl0IGRpcmVjdGx5DQo+Pj4+ICsgIGF1dG8gJnBhdGggPSBib3VuZC5nZXRfcXVh bGlmaWVkX3BhdGggKCk7DQo+Pj4+ICsgIHZpc2l0IChwYXRoKTsNCj4+Pj4gKyAgaWYgKHBh dGguaXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChw YXRoLmdldF9sb2N1cyAoKSwgImNhbm5vdCBzdHJpcCBwYXRoIGluIHRoaXMgcG9zaXRpb24i KTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpSYW5nZVBhdHRlcm4gJnBhdHRlcm4pDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIHNob3VsZCBo YXZlIG5vIGNhcGFiaWxpdHkgdG8gc3RyaXAgbG93ZXIgb3IgdXBwZXIgYm91bmRzLCBvbmx5 IGV4cGFuZA0KPj4+PiArICBwYXR0ZXJuLmdldF9sb3dlcl9ib3VuZCAoKS0+YWNjZXB0X3Zp cyAoKnRoaXMpOw0KPj4+PiArICBwYXR0ZXJuLmdldF91cHBlcl9ib3VuZCAoKS0+YWNjZXB0 X3ZpcyAoKnRoaXMpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6 OnZpc2l0IChBU1Q6OlJlZmVyZW5jZVBhdHRlcm4gJnBhdHRlcm4pDQo+Pj4+ICt7DQo+Pj4+ ICsgIGF1dG8gJnN1Yl9wYXR0ZXJuID0gcGF0dGVybi5nZXRfcmVmZXJlbmNlZF9wYXR0ZXJu ICgpOw0KPj4+PiArICBzdWJfcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiAr ICBpZiAoc3ViX3BhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAg cnVzdF9lcnJvcl9hdCAoc3ViX3BhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7 DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6 U3RydWN0UGF0dGVybkZpZWxkVHVwbGVQYXQgJmZpZWxkKQ0KPj4+PiArew0KPj4+PiArICAv LyBpbml0aWFsIHN0cmlwIHRlc3QgYmFzZWQgb24gb3V0ZXIgYXR0cnMNCj4+Pj4gKyAgZXhw YW5kZXIuZXhwYW5kX2NmZ19hdHRycyAoZmllbGQuZ2V0X291dGVyX2F0dHJzICgpKTsNCj4+ Pj4gKyAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZmllbGQuZ2V0X291 dGVyX2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBmaWVsZC5tYXJrX2Zv cl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsN Cj4+Pj4gKyAgLy8gc3RyaXAgc3ViLXBhdHRlcm5zIChjYW4ndCBzdHJpcCB0b3AtbGV2ZWwg cGF0dGVybikNCj4+Pj4gKyAgYXV0byAmc3ViX3BhdHRlcm4gPSBmaWVsZC5nZXRfaW5kZXhf cGF0dGVybiAoKTsNCj4+Pj4gKyAgc3ViX3BhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+Pj4gKyAgaWYgKHN1Yl9wYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+ PiArICAgIHJ1c3RfZXJyb3JfYXQgKHN1Yl9wYXR0ZXJuLT5nZXRfbG9jdXMgKCksDQo+Pj4+ ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3Np dGlvbiIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0 IChBU1Q6OlN0cnVjdFBhdHRlcm5GaWVsZElkZW50UGF0ICZmaWVsZCkNCj4+Pj4gK3sNCj4+ Pj4gKyAgLy8gaW5pdGlhbCBzdHJpcCB0ZXN0IGJhc2VkIG9uIG91dGVyIGF0dHJzDQo+Pj4+ ICsgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGZpZWxkLmdldF9vdXRlcl9hdHRycyAo KSk7DQo+Pj4+ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKGZpZWxk LmdldF9vdXRlcl9hdHRycyAoKSkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgZmllbGQu bWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAgfQ0K Pj4+PiArDQo+Pj4+ICsgIC8vIHN0cmlwIHN1Yi1wYXR0ZXJucyAoY2FuJ3Qgc3RyaXAgdG9w LWxldmVsIHBhdHRlcm4pDQo+Pj4+ICsgIGF1dG8gJnN1Yl9wYXR0ZXJuID0gZmllbGQuZ2V0 X2lkZW50X3BhdHRlcm4gKCk7DQo+Pj4+ICsgIHN1Yl9wYXR0ZXJuLT5hY2NlcHRfdmlzICgq dGhpcyk7DQo+Pj4+ICsgIGlmIChzdWJfcGF0dGVybi0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChzdWJfcGF0dGVybi0+Z2V0X2xvY3VzICgp LA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBwYXR0ZXJuIGluIHRo aXMgcG9zaXRpb24iKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9y Ojp2aXNpdCAoQVNUOjpTdHJ1Y3RQYXR0ZXJuRmllbGRJZGVudCAmZmllbGQpDQo+Pj4+ICt7 DQo+Pj4+ICsgIC8vIGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0K Pj4+PiArICBleHBhbmRlci5leHBhbmRfY2ZnX2F0dHJzIChmaWVsZC5nZXRfb3V0ZXJfYXR0 cnMgKCkpOw0KPj4+PiArICBpZiAoZXhwYW5kZXIuZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChm aWVsZC5nZXRfb3V0ZXJfYXR0cnMgKCkpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGZp ZWxkLm1hcmtfZm9yX3N0cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAg IH0NCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNU OjpTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKQ0KPj4+PiArew0KPj4+PiArICAvLyBleHBhbmQg KGJ1dCBkb24ndCBzdHJpcCkgcGF0aA0KPj4+PiArICBhdXRvICZwYXRoID0gcGF0dGVybi5n ZXRfcGF0aCAoKTsNCj4+Pj4gKyAgdmlzaXQgKHBhdGgpOw0KPj4+PiArICBpZiAocGF0aC5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHBhdGgu Z2V0X2xvY3VzICgpLCAiY2Fubm90IHN0cmlwIHBhdGggaW4gdGhpcyBwb3NpdGlvbiIpOw0K Pj4+PiArDQo+Pj4+ICsgIC8qIFRPRE86IGFwcGFyZW50bHkgc3RydWN0IHBhdHRlcm4gZmll bGRzIGNhbiBoYXZlIG91dGVyIGF0dHJzLiBzbyBjYW4gdGhleQ0KPj4+PiArICAgKiBiZSBz dHJpcHBlZD8gKi8NCj4+Pj4gKyAgaWYgKCFwYXR0ZXJuLmhhc19zdHJ1Y3RfcGF0dGVybl9l bGVtcyAoKSkNCj4+Pj4gKyAgICByZXR1cm47DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byAmZWxl bXMgPSBwYXR0ZXJuLmdldF9zdHJ1Y3RfcGF0dGVybl9lbGVtcyAoKTsNCj4+Pj4gKw0KPj4+ PiArICAvLyBhc3N1bWluZyB5b3UgY2FuIHN0cmlwIHN0cnVjdCBwYXR0ZXJuIGZpZWxkcw0K Pj4+PiArICBleHBhbmRfcG9pbnRlcl9hbGxvd19zdHJpcCAoZWxlbXMuZ2V0X3N0cnVjdF9w YXR0ZXJuX2ZpZWxkcyAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gYXNzdW1pbmcgeW91IGNh biBzdHJpcCB0aGUgIi4uIiBwYXJ0DQo+Pj4+ICsgIGlmIChlbGVtcy5oYXNfZXRjICgpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLmV4cGFuZF9jZmdfYXR0cnMgKGVs ZW1zLmdldF9ldGNfb3V0ZXJfYXR0cnMgKCkpOw0KPj4+PiArICAgICAgaWYgKGV4cGFuZGVy LmZhaWxzX2NmZ193aXRoX2V4cGFuZCAoZWxlbXMuZ2V0X2V0Y19vdXRlcl9hdHRycyAoKSkp DQo+Pj4+ICsgICAgICAgZWxlbXMuc3RyaXBfZXRjICgpOw0KPj4+PiArICAgIH0NCj4+Pj4g K30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUdXBsZVN0 cnVjdEl0ZW1zTm9SYW5nZSAmdHVwbGVfaXRlbXMpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGNh bid0IHN0cmlwIGluZGl2aWR1YWwgcGF0dGVybnMsIG9ubHkgc3ViLXBhdHRlcm5zDQo+Pj4+ ICsgIGZvciAoYXV0byAmcGF0dGVybiA6IHR1cGxlX2l0ZW1zLmdldF9wYXR0ZXJucyAoKSkN Cj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBwYXR0ZXJuLT5hY2NlcHRfdmlzICgqdGhpcyk7 DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChwYXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlw ICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4tPmdldF9sb2N1cyAo KSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4g aW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArICAgICAgLy8gVE9ETzogcXVpdCBzdHJpcHBp bmcgbm93PyBvciBrZWVwIGdvaW5nPw0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gK3Zv aWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUdXBsZVN0cnVjdEl0ZW1zUmFu Z2UgJnR1cGxlX2l0ZW1zKQ0KPj4+PiArew0KPj4+PiArICAvLyBjYW4ndCBzdHJpcCBpbmRp dmlkdWFsIHBhdHRlcm5zLCBvbmx5IHN1Yi1wYXR0ZXJucw0KPj4+PiArICBmb3IgKGF1dG8g Jmxvd2VyX3BhdHRlcm4gOiB0dXBsZV9pdGVtcy5nZXRfbG93ZXJfcGF0dGVybnMgKCkpDQo+ Pj4+ICsgICAgew0KPj4+PiArICAgICAgbG93ZXJfcGF0dGVybi0+YWNjZXB0X3ZpcyAoKnRo aXMpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBpZiAobG93ZXJfcGF0dGVybi0+aXNfbWFya2Vk X2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChsb3dlcl9wYXR0 ZXJuLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgImNhbm5v dCBzdHJpcCBwYXR0ZXJuIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gKyAgICAgIC8vIFRP RE86IHF1aXQgc3RyaXBwaW5nIG5vdz8gb3Iga2VlcCBnb2luZz8NCj4+Pj4gKyAgICB9DQo+ Pj4+ICsgIGZvciAoYXV0byAmdXBwZXJfcGF0dGVybiA6IHR1cGxlX2l0ZW1zLmdldF91cHBl cl9wYXR0ZXJucyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICB1cHBlcl9wYXR0ZXJu LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmICh1cHBlcl9w YXR0ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJy b3JfYXQgKHVwcGVyX3BhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAg ICAgICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0K Pj4+PiArICAgICAgLy8gVE9ETzogcXVpdCBzdHJpcHBpbmcgbm93PyBvciBrZWVwIGdvaW5n Pw0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9y Ojp2aXNpdCAoQVNUOjpUdXBsZVN0cnVjdFBhdHRlcm4gJnBhdHRlcm4pDQo+Pj4+ICt7DQo+ Pj4+ICsgIC8vIGV4cGFuZCAoYnV0IGRvbid0IHN0cmlwKSBwYXRoDQo+Pj4+ICsgIGF1dG8g JnBhdGggPSBwYXR0ZXJuLmdldF9wYXRoICgpOw0KPj4+PiArICB2aXNpdCAocGF0aCk7DQo+ Pj4+ICsgIGlmIChwYXRoLmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVz dF9lcnJvcl9hdCAocGF0aC5nZXRfbG9jdXMgKCksICJjYW5ub3Qgc3RyaXAgcGF0aCBpbiB0 aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHBhdHRlcm4uaGFzX2l0ZW1z ICgpKQ0KPj4+PiArICAgIHBhdHRlcm4uZ2V0X2l0ZW1zICgpLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFT VDo6VHVwbGVQYXR0ZXJuSXRlbXNNdWx0aXBsZSAmdHVwbGVfaXRlbXMpDQo+Pj4+ICt7DQo+ Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGluZGl2aWR1YWwgcGF0dGVybnMsIG9ubHkgc3ViLXBh dHRlcm5zDQo+Pj4+ICsgIGZvciAoYXV0byAmcGF0dGVybiA6IHR1cGxlX2l0ZW1zLmdldF9w YXR0ZXJucyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBwYXR0ZXJuLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChwYXR0ZXJuLT5pc19tYXJr ZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRlcm4t PmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0 cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArICAgICAgLy8gVE9ETzog cXVpdCBzdHJpcHBpbmcgbm93PyBvciBrZWVwIGdvaW5nPw0KPj4+PiArICAgIH0NCj4+Pj4g K30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUdXBsZVBh dHRlcm5JdGVtc1JhbmdlZCAmdHVwbGVfaXRlbXMpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGNh bid0IHN0cmlwIGluZGl2aWR1YWwgcGF0dGVybnMsIG9ubHkgc3ViLXBhdHRlcm5zDQo+Pj4+ ICsgIGZvciAoYXV0byAmbG93ZXJfcGF0dGVybiA6IHR1cGxlX2l0ZW1zLmdldF9sb3dlcl9w YXR0ZXJucyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBsb3dlcl9wYXR0ZXJuLT5h Y2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChsb3dlcl9wYXR0 ZXJuLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3Jf YXQgKGxvd2VyX3BhdHRlcm4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAiY2Fubm90IHN0cmlwIHBhdHRlcm4gaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+ PiArICAgICAgLy8gVE9ETzogcXVpdCBzdHJpcHBpbmcgbm93PyBvciBrZWVwIGdvaW5nPw0K Pj4+PiArICAgIH0NCj4+Pj4gKyAgZm9yIChhdXRvICZ1cHBlcl9wYXR0ZXJuIDogdHVwbGVf aXRlbXMuZ2V0X3VwcGVyX3BhdHRlcm5zICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAg IHVwcGVyX3BhdHRlcm4tPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAg ICAgaWYgKHVwcGVyX3BhdHRlcm4tPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsg ICAgICAgcnVzdF9lcnJvcl9hdCAodXBwZXJfcGF0dGVybi0+Z2V0X2xvY3VzICgpLA0KPj4+ PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBpbiB0aGlz IHBvc2l0aW9uIik7DQo+Pj4+ICsgICAgICAvLyBUT0RPOiBxdWl0IHN0cmlwcGluZyBub3c/ IG9yIGtlZXAgZ29pbmc/DQo+Pj4+ICsgICAgfQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+ PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OlR1cGxlUGF0dGVybiAmcGF0dGVybikNCj4+ Pj4gK3sNCj4+Pj4gKyAgaWYgKHBhdHRlcm4uaGFzX3R1cGxlX3BhdHRlcm5faXRlbXMgKCkp DQo+Pj4+ICsgICAgcGF0dGVybi5nZXRfaXRlbXMgKCktPmFjY2VwdF92aXMgKCp0aGlzKTsN Cj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpH cm91cGVkUGF0dGVybiAmcGF0dGVybikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gY2FuJ3Qgc3Ry aXAgaW5uZXIgcGF0dGVybiwgb25seSBzdWItcGF0dGVybnMNCj4+Pj4gKyAgYXV0byAmcGF0 dGVybl9pbl9wYXJlbnMgPSBwYXR0ZXJuLmdldF9wYXR0ZXJuX2luX3BhcmVucyAoKTsNCj4+ Pj4gKw0KPj4+PiArICBwYXR0ZXJuX2luX3BhcmVucy0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0K Pj4+PiArDQo+Pj4+ICsgIGlmIChwYXR0ZXJuX2luX3BhcmVucy0+aXNfbWFya2VkX2Zvcl9z dHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChwYXR0ZXJuX2luX3BhcmVucy0+ Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdHJpcCBw YXR0ZXJuIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4g K0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpTbGljZVBhdHRlcm4gJnBhdHRlcm4pDQo+Pj4+ ICt7DQo+Pj4+ICsgIC8vIGNhbid0IHN0cmlwIGluZGl2aWR1YWwgcGF0dGVybnMsIG9ubHkg c3ViLXBhdHRlcm5zDQo+Pj4+ICsgIGZvciAoYXV0byAmaXRlbSA6IHBhdHRlcm4uZ2V0X2l0 ZW1zICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGl0ZW0tPmFjY2VwdF92aXMgKCp0 aGlzKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgaWYgKGl0ZW0tPmlzX21hcmtlZF9mb3Jfc3Ry aXAgKCkpDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAoaXRlbS0+Z2V0X2xvY3VzICgp LA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgcGF0dGVybiBp biB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsgICAgICAvLyBUT0RPOiBxdWl0IHN0cmlwcGlu ZyBub3c/IG9yIGtlZXAgZ29pbmc/DQo+Pj4+ICsgICAgfQ0KPj4+PiArfQ0KPj4+PiArDQo+ Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6RW1wdHlTdG10ICYp DQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGFzc3VtaW5nIG5vIG91dGVyIGF0dHJpYnV0ZXMsIHNv IG5vdGhpbmcgY2FuIGhhcHBlbg0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZp c2l0b3I6OnZpc2l0IChBU1Q6OkxldFN0bXQgJnN0bXQpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8v IGluaXRpYWwgc3RyaXAgdGVzdCBiYXNlZCBvbiBvdXRlciBhdHRycw0KPj4+PiArICBleHBh bmRlci5leHBhbmRfY2ZnX2F0dHJzIChzdG10LmdldF9vdXRlcl9hdHRycyAoKSk7DQo+Pj4+ ICsgIGlmIChleHBhbmRlci5mYWlsc19jZmdfd2l0aF9leHBhbmQgKHN0bXQuZ2V0X291dGVy X2F0dHJzICgpKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBzdG10Lm1hcmtfZm9yX3N0 cmlwICgpOw0KPj4+PiArICAgICAgcmV0dXJuOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+ PiArICAvLyBjYW4ndCBzdHJpcCBwYXR0ZXJuLCBidXQgY2FsbCBmb3Igc3ViLXBhdHRlcm5z DQo+Pj4+ICsgIGF1dG8gJnBhdHRlcm4gPSBzdG10LmdldF9wYXR0ZXJuICgpOw0KPj4+PiAr ICBwYXR0ZXJuLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChwYXR0ZXJuLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHBhdHRl cm4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3Ry aXAgcGF0dGVybiBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gc2lt aWxhciBmb3IgdHlwZQ0KPj4+PiArICBpZiAoc3RtdC5oYXNfdHlwZSAoKSkNCj4+Pj4gKyAg ICB7DQo+Pj4+ICsgICAgICBleHBhbmRlci5wdXNoX2NvbnRleHQgKE1hY3JvRXhwYW5kZXI6 OkNvbnRleHRUeXBlOjpUWVBFKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgYXV0byAmdHlwZSA9 IHN0bXQuZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgICAgICB0eXBlLT5hY2NlcHRfdmlzICgqdGhp cyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIG1heWJlX2V4cGFuZF90eXBlICh0eXBlKTsNCj4+ Pj4gKw0KPj4+PiArICAgICAgaWYgKHR5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+ Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0 aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnBvcF9jb250ZXh0ICgpOw0K Pj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvKiBzdHJpcCBhbnkgaW50ZXJuYWwgc3Vi LWV4cHJlc3Npb25zIC0gZXhwcmVzc2lvbiBpdHNlbGYgaXNuJ3QNCj4+Pj4gKyAgICogYWxs b3dlZCB0byBoYXZlIGV4dGVybmFsIGF0dHJpYnV0ZXMgaW4gdGhpcyBwb3NpdGlvbiBzbyBj YW4ndCBiZQ0KPj4+PiArICAgKiBzdHJpcHBlZCAqLw0KPj4+PiArICBpZiAoc3RtdC5oYXNf aW5pdF9leHByICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGF1dG8gJmluaXRfZXhw ciA9IHN0bXQuZ2V0X2luaXRfZXhwciAoKTsNCj4+Pj4gKyAgICAgIGluaXRfZXhwci0+YWNj ZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBpZiAoaW5pdF9leHByLT5p c19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKGlu aXRfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJj YW5ub3Qgc3RyaXAgZXhwcmVzc2lvbiBpbiB0aGlzIHBvc2l0aW9uIC0gb3V0ZXIgIg0KPj4+ PiArICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIik7DQo+ Pj4+ICsNCj4+Pj4gKyAgICAgIG1heWJlX2V4cGFuZF9leHByIChpbml0X2V4cHIpOw0KPj4+ PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNp dCAoQVNUOjpFeHByU3RtdFdpdGhvdXRCbG9jayAmc3RtdCkNCj4+Pj4gK3sNCj4+Pj4gKyAg Ly8gb3V0ZXIgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggZXhwciwgc28gcmVseSBvbiBl eHByDQo+Pj4+ICsNCj4+Pj4gKyAgLy8gZ3VhcmQgLSBzaG91bGQgcHJldmVudCBudWxsIHBv aW50ZXIgZXhwcg0KPj4+PiArICBpZiAoc3RtdC5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0K Pj4+PiArICAgIHJldHVybjsNCj4+Pj4gKw0KPj4+PiArICAvLyBzdHJpcCBpZiBleHByIGlz IHRvIGJlIHN0cmlwcGVkDQo+Pj4+ICsgIGF1dG8gJmV4cHIgPSBzdG10LmdldF9leHByICgp Ow0KPj4+PiArICBleHByLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChleHBy LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHN0 bXQubWFya19mb3Jfc3RyaXAgKCk7DQo+Pj4+ICsgICAgICByZXR1cm47DQo+Pj4+ICsgICAg fQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6 OkV4cHJTdG10V2l0aEJsb2NrICZzdG10KQ0KPj4+PiArew0KPj4+PiArICAvLyBvdXRlciBh dHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBleHByLCBzbyByZWx5IG9uIGV4cHINCj4+Pj4g Kw0KPj4+PiArICAvLyBndWFyZCAtIHNob3VsZCBwcmV2ZW50IG51bGwgcG9pbnRlciBleHBy DQo+Pj4+ICsgIGlmIChzdG10LmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAg cmV0dXJuOw0KPj4+PiArDQo+Pj4+ICsgIC8vIHN0cmlwIGlmIGV4cHIgaXMgdG8gYmUgc3Ry aXBwZWQNCj4+Pj4gKyAgYXV0byAmZXhwciA9IHN0bXQuZ2V0X2V4cHIgKCk7DQo+Pj4+ICsg IGV4cHItPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGV4cHItPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgc3RtdC5tYXJrX2Zv cl9zdHJpcCAoKTsNCj4+Pj4gKyAgICAgIHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICt9 DQo+Pj4+ICsNCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpU cmFpdEJvdW5kICZib3VuZCkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gbm90aGluZyBpbiBmb3Ig bGlmZXRpbWVzIHRvIHN0cmlwDQo+Pj4+ICsNCj4+Pj4gKyAgLy8gZXhwYW5kIGJ1dCBkb24n dCBzdHJpcCB0eXBlIHBhdGgNCj4+Pj4gKyAgYXV0byAmcGF0aCA9IGJvdW5kLmdldF90eXBl X3BhdGggKCk7DQo+Pj4+ICsgIHZpc2l0IChwYXRoKTsNCj4+Pj4gKyAgaWYgKHBhdGguaXNf bWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChwYXRoLmdl dF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlw ZSBwYXRoIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4g K0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpJbXBsVHJhaXRUeXBlICZ0eXBlKQ0KPj4+PiAr ew0KPj4+PiArICAvLyBkb24ndCBzdHJpcCBkaXJlY3RseSwgb25seSBjb21wb25lbnRzIG9m IGJvdW5kcw0KPj4+PiArICBmb3IgKGF1dG8gJmJvdW5kIDogdHlwZS5nZXRfdHlwZV9wYXJh bV9ib3VuZHMgKCkpDQo+Pj4+ICsgICAgYm91bmQtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ Pj4gK30NCj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUcmFp dE9iamVjdFR5cGUgJnR5cGUpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGRvbid0IHN0cmlwIGRp cmVjdGx5LCBvbmx5IGNvbXBvbmVudHMgb2YgYm91bmRzDQo+Pj4+ICsgIGZvciAoYXV0byAm Ym91bmQgOiB0eXBlLmdldF90eXBlX3BhcmFtX2JvdW5kcyAoKSkNCj4+Pj4gKyAgICBib3Vu ZC0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0 clZpc2l0b3I6OnZpc2l0IChBU1Q6OlBhcmVudGhlc2lzZWRUeXBlICZ0eXBlKQ0KPj4+PiAr ew0KPj4+PiArICAvLyBleHBhbmQgYnV0IGRvbid0IHN0cmlwIGlubmVyIHR5cGUNCj4+Pj4g KyAgYXV0byAmaW5uZXJfdHlwZSA9IHR5cGUuZ2V0X3R5cGVfaW5fcGFyZW5zICgpOw0KPj4+ PiArICBpbm5lcl90eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChpbm5l cl90eXBlLT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3Jf YXQgKGlubmVyX3R5cGUtPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICt9DQo+Pj4+ ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6SW1wbFRyYWl0VHlwZU9u ZUJvdW5kICZ0eXBlKQ0KPj4+PiArew0KPj4+PiArICAvLyBubyBzdHJpcHBpbmcgcG9zc2li bGUNCj4+Pj4gKyAgdmlzaXQgKHR5cGUuZ2V0X3RyYWl0X2JvdW5kICgpKTsNCj4+Pj4gK30N Cj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpUcmFpdE9iamVj dFR5cGVPbmVCb3VuZCAmdHlwZSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gbm8gc3RyaXBwaW5n IHBvc3NpYmxlDQo+Pj4+ICsgIHZpc2l0ICh0eXBlLmdldF90cmFpdF9ib3VuZCAoKSk7DQo+ Pj4+ICt9DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6VHVw bGVUeXBlICZ0eXBlKQ0KPj4+PiArew0KPj4+PiArICAvLyBUT0RPOiBhc3N1bWluZyB0aGF0 IHR5cGVzIGNhbid0IGJlIHN0cmlwcGVkIGFzIHR5cGVzIGRvbid0IGhhdmUgb3V0ZXINCj4+ Pj4gKyAgLy8gYXR0cmlidXRlcw0KPj4+PiArICBmb3IgKGF1dG8gJmVsZW1fdHlwZSA6IHR5 cGUuZ2V0X2VsZW1zICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGVsZW1fdHlwZS0+ YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbWFy a2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICBydXN0X2Vycm9yX2F0IChlbGVtX3R5 cGUtPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90 IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArICAgIH0NCj4+Pj4gK30N Cj4+Pj4gK3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpOZXZlclR5cGUg JikNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gbm8gc3RyaXBwaW5nIHBvc3NpYmxlDQo+Pj4+ICt9 DQo+Pj4+ICt2b2lkDQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6UmF3UG9pbnRl clR5cGUgJnR5cGUpDQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGV4cGFuZCBidXQgZG9uJ3Qgc3Ry aXAgdHlwZSBwb2ludGVkIHRvDQo+Pj4+ICsgIGF1dG8gJnBvaW50ZWRfdHlwZSA9IHR5cGUu Z2V0X3R5cGVfcG9pbnRlZF90byAoKTsNCj4+Pj4gKyAgcG9pbnRlZF90eXBlLT5hY2NlcHRf dmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChwb2ludGVkX3R5cGUtPmlzX21hcmtlZF9mb3Jf c3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9hdCAocG9pbnRlZF90eXBlLT5nZXRf bG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUg aW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZp c2l0b3I6OnZpc2l0IChBU1Q6OlJlZmVyZW5jZVR5cGUgJnR5cGUpDQo+Pj4+ICt7DQo+Pj4+ ICsgIC8vIGV4cGFuZCBidXQgZG9uJ3Qgc3RyaXAgdHlwZSByZWZlcmVuY2VkDQo+Pj4+ICsg IGF1dG8gJnJlZmVyZW5jZWRfdHlwZSA9IHR5cGUuZ2V0X3R5cGVfcmVmZXJlbmNlZCAoKTsN Cj4+Pj4gKyAgcmVmZXJlbmNlZF90eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsg IGlmIChyZWZlcmVuY2VkX3R5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsg ICAgcnVzdF9lcnJvcl9hdCAocmVmZXJlbmNlZF90eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ ICsgICAgICAgICAgICAgICAgICAiY2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlv biIpOw0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChB U1Q6OkFycmF5VHlwZSAmdHlwZSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gZXhwYW5kIGJ1dCBk b24ndCBzdHJpcCB0eXBlIHJlZmVyZW5jZWQNCj4+Pj4gKyAgYXV0byAmYmFzZV90eXBlID0g dHlwZS5nZXRfZWxlbV90eXBlICgpOw0KPj4+PiArICBiYXNlX3R5cGUtPmFjY2VwdF92aXMg KCp0aGlzKTsNCj4+Pj4gKyAgaWYgKGJhc2VfdHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAo KSkNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChiYXNlX3R5cGUtPmdldF9sb2N1cyAoKSwN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBv c2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gc2FtZSBmb3IgZXhwcmVzc2lvbg0KPj4+ PiArICBhdXRvICZzaXplX2V4cHIgPSB0eXBlLmdldF9zaXplX2V4cHIgKCk7DQo+Pj4+ICsg IHNpemVfZXhwci0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+PiArICBpZiAoc2l6ZV9leHBy LT5pc19tYXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKHNp emVfZXhwci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImNhbm5v dCBzdHJpcCBleHByZXNzaW9uIGluIHRoaXMgcG9zaXRpb24iKTsNCj4+Pj4gK30NCj4+Pj4g K3ZvaWQNCj4+Pj4gK0F0dHJWaXNpdG9yOjp2aXNpdCAoQVNUOjpTbGljZVR5cGUgJnR5cGUp DQo+Pj4+ICt7DQo+Pj4+ICsgIC8vIGV4cGFuZCBidXQgZG9uJ3Qgc3RyaXAgZWxlbSB0eXBl DQo+Pj4+ICsgIGF1dG8gJmVsZW1fdHlwZSA9IHR5cGUuZ2V0X2VsZW1fdHlwZSAoKTsNCj4+ Pj4gKyAgZWxlbV90eXBlLT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsgIGlmIChlbGVt X3R5cGUtPmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgcnVzdF9lcnJvcl9h dCAoZWxlbV90eXBlLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAi Y2Fubm90IHN0cmlwIHR5cGUgaW4gdGhpcyBwb3NpdGlvbiIpOw0KPj4+PiArfQ0KPj4+PiAr dm9pZA0KPj4+PiArQXR0clZpc2l0b3I6OnZpc2l0IChBU1Q6OkluZmVycmVkVHlwZSAmKQ0K Pj4+PiArew0KPj4+PiArICAvLyBub25lIHBvc3NpYmxlDQo+Pj4+ICt9DQo+Pj4+ICt2b2lk DQo+Pj4+ICtBdHRyVmlzaXRvcjo6dmlzaXQgKEFTVDo6QmFyZUZ1bmN0aW9uVHlwZSAmdHlw ZSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gc2VlbSB0byBiZSBubyBnZW5lcmljcw0KPj4+PiAr DQo+Pj4+ICsgIC8vIHByZXN1bWFibHkgZnVuY3Rpb24gcGFyYW1zIGNhbiBiZSBzdHJpcHBl ZA0KPj4+PiArICBhdXRvICZwYXJhbXMgPSB0eXBlLmdldF9mdW5jdGlvbl9wYXJhbXMgKCk7 DQo+Pj4+ICsgIGZvciAoYXV0byBpdCA9IHBhcmFtcy5iZWdpbiAoKTsgaXQgIT0gcGFyYW1z LmVuZCAoKTspDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgYXV0byAmcGFyYW0gPSAqaXQ7 DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGF1dG8gJnBhcmFtX2F0dHJzID0gcGFyYW0uZ2V0X291 dGVyX2F0dHJzICgpOw0KPj4+PiArICAgICAgZXhwYW5kZXIuZXhwYW5kX2NmZ19hdHRycyAo cGFyYW1fYXR0cnMpOw0KPj4+PiArICAgICAgaWYgKGV4cGFuZGVyLmZhaWxzX2NmZ193aXRo X2V4cGFuZCAocGFyYW1fYXR0cnMpKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAg IGl0ID0gcGFyYW1zLmVyYXNlIChpdCk7DQo+Pj4+ICsgICAgICAgICBjb250aW51ZTsNCj4+ Pj4gKyAgICAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGV4cGFuZGVyLnB1c2hfY29udGV4 dCAoTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OlRZUEUpOw0KPj4+PiArDQo+Pj4+ICsg ICAgICBhdXRvICZ0eXBlID0gcGFyYW0uZ2V0X3R5cGUgKCk7DQo+Pj4+ICsgICAgICB0eXBl LT5hY2NlcHRfdmlzICgqdGhpcyk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIG1heWJlX2V4cGFu ZF90eXBlICh0eXBlKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgaWYgKHR5cGUtPmlzX21hcmtl ZF9mb3Jfc3RyaXAgKCkpDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAodHlwZS0+Z2V0 X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAg dHlwZSBpbiB0aGlzIHBvc2l0aW9uIik7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGV4cGFuZGVy LnBvcF9jb250ZXh0ICgpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAvLyBpbmNyZW1lbnQgaWYg bm90aGluZyBlbHNlIGhhcHBlbnMNCj4+Pj4gKyAgICAgICsraXQ7DQo+Pj4+ICsgICAgfQ0K Pj4+PiArDQo+Pj4+ICsgIC8qIFRPRE86IGFzc3VtaW5nIHRoYXQgdmFyaWFkaWMgbmF0dXJl IGNhbm5vdCBiZSBzdHJpcHBlZC4gSWYgdGhpcw0KPj4+PiArICAgKiBpcyBub3QgdHJ1ZSwg dGhlbiBoYXZlIGNvZGUgaGVyZSB0byBkbyBzby4gKi8NCj4+Pj4gKw0KPj4+PiArICBpZiAo dHlwZS5oYXNfcmV0dXJuX3R5cGUgKCkpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgLy8g RklYTUU6IENhbiB3ZSBoYXZlIHR5cGUgZXhwYW5zaW9uIGluIHRoaXMgcG9zaXRpb24/DQo+ Pj4+ICsgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gaGFuZGxlIEFTVDo6VHlw ZU5vQm91bmRzIG9uIHRvcCBvZiBqdXN0DQo+Pj4+ICsgICAgICAvLyBBU1Q6OlR5cGVzDQo+ Pj4+ICsgICAgICBhdXRvICZyZXR1cm5fdHlwZSA9IHR5cGUuZ2V0X3JldHVybl90eXBlICgp Ow0KPj4+PiArICAgICAgcmV0dXJuX3R5cGUtPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+Pj4g KyAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4g KyAgICAgICBydXN0X2Vycm9yX2F0IChyZXR1cm5fdHlwZS0+Z2V0X2xvY3VzICgpLA0KPj4+ PiArICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RyaXAgdHlwZSBpbiB0aGlzIHBv c2l0aW9uIik7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIG5vIHdoZXJlIGNs YXVzZSwgYXBwYXJlbnRseQ0KPj4+PiArfQ0KPj4+PiArdm9pZA0KPj4+PiArQXR0clZpc2l0 b3I6Om1heWJlX2V4cGFuZF9leHByIChzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpFeHByPiAmZXhw cikNCj4+Pj4gK3sNCj4+Pj4gKyAgYXV0byBmaW5hbF9mcmFnbWVudCA9IGV4cGFuZF9tYWNy b19mcmFnbWVudF9yZWN1cnNpdmUgKCk7DQo+Pj4+ICsgIGlmIChmaW5hbF9mcmFnbWVudC5z aG91bGRfZXhwYW5kICgpKQ0KPj4+PiArICAgIGV4cHIgPSBmaW5hbF9mcmFnbWVudC50YWtl X2V4cHJlc3Npb25fZnJhZ21lbnQgKCk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3ZvaWQN Cj4+Pj4gK0F0dHJWaXNpdG9yOjptYXliZV9leHBhbmRfdHlwZSAoc3RkOjp1bmlxdWVfcHRy PEFTVDo6VHlwZT4gJnR5cGUpDQo+Pj4+ICt7DQo+Pj4+ICsgIGF1dG8gZmluYWxfZnJhZ21l bnQgPSBleHBhbmRfbWFjcm9fZnJhZ21lbnRfcmVjdXJzaXZlICgpOw0KPj4+PiArICBpZiAo ZmluYWxfZnJhZ21lbnQuc2hvdWxkX2V4cGFuZCAoKSkNCj4+Pj4gKyAgICB0eXBlID0gZmlu YWxfZnJhZ21lbnQudGFrZV90eXBlX2ZyYWdtZW50ICgpOw0KPj4+PiArfQ0KPj4+PiArfSAv LyBuYW1lc3BhY2UgUnVzdA0KPj4+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1 c3QtYXR0cmlidXRlLXZpc2l0b3IuaCBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LWF0dHJpYnV0 ZS12aXNpdG9yLmgNCj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+Pj4gaW5kZXggMDAw MDAwMDAwMDAuLjBmOWQxMDY1MzM0DQo+Pj4+IC0tLSAvZGV2L251bGwNCj4+Pj4gKysrIGIv Z2NjL3J1c3QvZXhwYW5kL3J1c3QtYXR0cmlidXRlLXZpc2l0b3IuaA0KPj4+PiBAQCAtMCww ICsxLDMxNiBAQA0KPj4+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+Pj4+ICsNCj4+Pj4gKy8vIFRoaXMgZmlsZSBpcyBw YXJ0IG9mIEdDQy4NCj4+Pj4gKw0KPj4+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+Pj4gKy8v IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlDQo+Pj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4+PiArLy8gdmVy c2lvbi4NCj4+Pj4gKw0KPj4+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4+PiArLy8gV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFC SUxJVFkgb3INCj4+Pj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4+PiArLy8gZm9yIG1vcmUg ZGV0YWlscy4NCj4+Pj4gKw0KPj4+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+Pj4gKy8vIGFsb25n IHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+Pj4+ICsv LyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+Pj4+ICsNCj4+Pj4gKyNpbmNs dWRlICJydXN0LWFzdC12aXNpdG9yLmgiDQo+Pj4+ICsjaW5jbHVkZSAicnVzdC1hc3QuaCIN Cj4+Pj4gKyNpbmNsdWRlICJydXN0LW1hY3JvLWV4cGFuZC5oIg0KPj4+PiArDQo+Pj4+ICtu YW1lc3BhY2UgUnVzdCB7DQo+Pj4+ICsvLyBWaXNpdG9yIHVzZWQgdG8gZXhwYW5kIGF0dHJp YnV0ZXMuDQo+Pj4+ICtjbGFzcyBBdHRyVmlzaXRvciA6IHB1YmxpYyBBU1Q6OkFTVFZpc2l0 b3INCj4+Pj4gK3sNCj4+Pj4gK3ByaXZhdGU6DQo+Pj4+ICsgIE1hY3JvRXhwYW5kZXIgJmV4 cGFuZGVyOw0KPj4+PiArICB2b2lkIG1heWJlX2V4cGFuZF9leHByIChzdGQ6OnVuaXF1ZV9w dHI8QVNUOjpFeHByPiAmZXhwcik7DQo+Pj4+ICsgIHZvaWQgbWF5YmVfZXhwYW5kX3R5cGUg KHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlR5cGU+ICZleHByKTsNCj4+Pj4gKw0KPj4+PiArcHVi bGljOg0KPj4+PiArICBBdHRyVmlzaXRvciAoTWFjcm9FeHBhbmRlciAmZXhwYW5kZXIpIDog ZXhwYW5kZXIgKGV4cGFuZGVyKSB7fQ0KPj4+PiArDQo+Pj4+ICsgIHZvaWQgZXhwYW5kX3N0 cnVjdF9maWVsZHMgKHN0ZDo6dmVjdG9yPEFTVDo6U3RydWN0RmllbGQ+ICZmaWVsZHMpOw0K Pj4+PiArICB2b2lkIGV4cGFuZF90dXBsZV9maWVsZHMgKHN0ZDo6dmVjdG9yPEFTVDo6VHVw bGVGaWVsZD4gJmZpZWxkcyk7DQo+Pj4+ICsgIHZvaWQgZXhwYW5kX2Z1bmN0aW9uX3BhcmFt cyAoc3RkOjp2ZWN0b3I8QVNUOjpGdW5jdGlvblBhcmFtPiAmcGFyYW1zKTsNCj4+Pj4gKyAg dm9pZCBleHBhbmRfZ2VuZXJpY19hcmdzIChBU1Q6OkdlbmVyaWNBcmdzICZhcmdzKTsNCj4+ Pj4gKyAgdm9pZCBleHBhbmRfcXVhbGlmaWVkX3BhdGhfdHlwZSAoQVNUOjpRdWFsaWZpZWRQ YXRoVHlwZSAmcGF0aF90eXBlKTsNCj4+Pj4gKyAgdm9pZCBleHBhbmRfY2xvc3VyZV9wYXJh bXMgKHN0ZDo6dmVjdG9yPEFTVDo6Q2xvc3VyZVBhcmFtPiAmcGFyYW1zKTsNCj4+Pj4gKyAg dm9pZCBleHBhbmRfc2VsZl9wYXJhbSAoQVNUOjpTZWxmUGFyYW0gJnNlbGZfcGFyYW0pOw0K Pj4+PiArICB2b2lkIGV4cGFuZF93aGVyZV9jbGF1c2UgKEFTVDo6V2hlcmVDbGF1c2UgJndo ZXJlX2NsYXVzZSk7DQo+Pj4+ICsgIHZvaWQgZXhwYW5kX3RyYWl0X2Z1bmN0aW9uX2RlY2wg KEFTVDo6VHJhaXRGdW5jdGlvbkRlY2wgJmRlY2wpOw0KPj4+PiArICB2b2lkIGV4cGFuZF90 cmFpdF9tZXRob2RfZGVjbCAoQVNUOjpUcmFpdE1ldGhvZERlY2wgJmRlY2wpOw0KPj4+PiAr DQo+Pj4+ICsgIC8qKg0KPj4+PiArICAgKiBFeHBhbmQgVGhlIGN1cnJlbnQgbWFjcm8gZnJh Z21lbnQgcmVjdXJzaXZlbHkgdW50aWwgaXQgY291bGQgbm90IGJlDQo+Pj4+ICsgICAqIGV4 cGFuZGVkIGZ1cnRoZXIuDQo+Pj4+ICsgICAqDQo+Pj4+ICsgICAqIFRoZSByZXR1cm4gdmFs dWUgY2hlY2tpbmcgd29ya3MgYmVjYXVzZSBjb3JyZWN0bHkNCj4+Pj4gKyAgICogZXhwYW5k ZWQgZnJhZ21lbnQgY2FuIG5ldmVyIGJlIGFuIGVycm9yIChpZiB0aGUgZnJhZ21lbnQgY2Fu IG5vdCBiZQ0KPj4+PiArICAgKiBleHBhbmRlZCwgYSBzdGFuZC1pbiBlcnJvciBmcmFnbWVu dCB3aWxsIGJlIHJldHVybmVkOyBmb3IgZnJhZ21lbnRzIHRoYXQNCj4+Pj4gKyAgICogY291 bGQgbm90IGJlIGZ1cnRoZXIgZXhwYW5kZWQ6IHRoZSBmcmFnbWVudCBwcmlvciB0byB0aGUg ZXhwYW5zaW9uIGZhaWx1cmUNCj4+Pj4gKyAgICogd2lsbCBiZSByZXR1cm5lZCkuDQo+Pj4+ ICsgICAqDQo+Pj4+ICsgICAqIEByZXR1cm4gRWl0aGVyIHRoZSBleHBhbmRlZCBmcmFnbWVu dCBvciBhbiBlbXB0eSBlcnJvcmVkLW91dCBmcmFnbWVudA0KPj4+PiArICAgKiBpbmRpY2F0 aW5nIGFuIGV4cGFuc2lvbiBmYWlsdXJlLg0KPj4+PiArICAgKi8NCj4+Pj4gKyAgQVNUOjpB U1RGcmFnbWVudCBleHBhbmRfbWFjcm9fZnJhZ21lbnRfcmVjdXJzaXZlICgpDQo+Pj4NCj4+ PiBXaHkgaXMgdGhpcyBpbiB0aGUgaGVhZGVyPw0KPj4NCj4+IERvIHlvdSBtZWFuIHRoZSBk ZWZpbml0aW9uIG9yIHRoZSBkb2N1bWVudGF0aW9uPyBJZiB5b3UgcmVmZXIgdG8gdGhlDQo+ PiBkZWZpbml0aW9uLCB0aGVuIHRoYXQgaXMgYSBtaXN0YWtlIGFuZCBzaG91bGQgYmUgaW4g dGhlIGltcGxlbWVudGF0aW9uLg0KPiANCj4gWWVwLCB0aGUgZGVmaW5pdGlvbi4NCj4gDQo+ Pj4+ICsgIHsNCj4+Pj4gKyAgICBhdXRvIGZyYWdtZW50ID0gZXhwYW5kZXIudGFrZV9leHBh bmRlZF9mcmFnbWVudCAoKnRoaXMpOw0KPj4+PiArICAgIHVuc2lnbmVkIGludCBvcmlnaW5h bF9kZXB0aCA9IGV4cGFuZGVyLmV4cGFuc2lvbl9kZXB0aDsNCj4+Pj4gKyAgICBhdXRvIGZp bmFsX2ZyYWdtZW50ID0gQVNUOjpBU1RGcmFnbWVudCAoe30sIHRydWUpOw0KPj4+PiArDQo+ Pj4+ICsgICAgd2hpbGUgKGZyYWdtZW50LnNob3VsZF9leHBhbmQgKCkpDQo+Pj4+ICsgICAg ICB7DQo+Pj4+ICsgICAgICAgZmluYWxfZnJhZ21lbnQgPSBzdGQ6Om1vdmUgKGZyYWdtZW50 KTsNCj4+Pj4gKyAgICAgICBleHBhbmRlci5leHBhbnNpb25fZGVwdGgrKzsNCj4+Pj4gKyAg ICAgICAvLyBmdXJ0aGVyIGV4cGFuZCB0aGUgcHJldmlvdXNseSBleHBhbmRlZCBtYWNybyBm cmFnbWVudA0KPj4+PiArICAgICAgIGF1dG8gbmV3X2ZyYWdtZW50ID0gZXhwYW5kZXIudGFr ZV9leHBhbmRlZF9mcmFnbWVudCAoKnRoaXMpOw0KPj4+PiArICAgICAgIGlmIChuZXdfZnJh Z21lbnQuaXNfZXJyb3IgKCkpDQo+Pj4+ICsgICAgICAgICBicmVhazsNCj4+Pj4gKyAgICAg ICBmcmFnbWVudCA9IHN0ZDo6bW92ZSAobmV3X2ZyYWdtZW50KTsNCj4+Pj4gKyAgICAgIH0N Cj4+Pj4gKyAgICBleHBhbmRlci5leHBhbnNpb25fZGVwdGggPSBvcmlnaW5hbF9kZXB0aDsN Cj4+Pj4gKyAgICByZXR1cm4gZmluYWxfZnJhZ21lbnQ7DQo+Pj4+ICsgIH0NCj4+Pj4gKw0K Pj4+PiArICAvKioNCj4+Pj4gKyAgICogRXhwYW5kIGEgc2V0IG9mIHZhbHVlcywgZXJhc2lu ZyB0aGVtIGlmIHRoZXkgYXJlIG1hcmtlZCBmb3Igc3RyaXAsIGFuZA0KPj4+PiArICAgKiBy ZXBsYWNpbmcgdGhlbSB3aXRoIGV4cGFuZGVkIG1hY3JvIG5vZGVzIGlmIG5lY2Vzc2FyeS4N Cj4+Pj4gKyAgICogVGhpcyBmdW5jdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBg ZXhwYW5kX3BvaW50ZXJfYWxsb3dfc3RyaXBgIGFzDQo+Pj4+ICsgICAqIGl0IGNhbiBvbmx5 IGJlIGNhbGxlZCBpbiBjZXJ0YWluIGV4cGFuc2lvbiBjb250ZXh0cyAtIHdoZXJlIG1hY3Jv DQo+Pj4+ICsgICAqIGludm9jYXRpb25zIGFyZSBhbGxvd2VkLg0KPj4+PiArICAgKg0KPj4+ PiArICAgKiBAcGFyYW0gY3R4IENvbnRleHQgdG8gdXNlIGZvciBtYWNybyBleHBhbnNpb24N Cj4+Pj4gKyAgICogQHBhcmFtIHZhbHVlcyBJdGVyYWJsZSByZWZlcmVuY2Ugb3ZlciB2YWx1 ZXMgdG8gcmVwbGFjZSBvciBlcmFzZQ0KPj4+PiArICAgKiBAcGFyYW0gZXh0cmFjdG9yIEZ1 bmN0aW9uIHRvIGNhbGwgd2hlbiByZXBsYWNpbmcgdmFsdWVzIHdpdGggdGhlIGNvbnRlbnQN Cj4+Pj4gKyAgICogICAgICAgICAgIG9mIGFuIGV4cGFuZGVkIEFTVCBub2RlDQo+Pj4+ICsg ICAqLw0KPj4+PiArICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4NCj4+Pj4g KyAgdm9pZCBleHBhbmRfbWFjcm9fY2hpbGRyZW4gKE1hY3JvRXhwYW5kZXI6OkNvbnRleHRU eXBlIGN0eCwgVCAmdmFsdWVzLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdGQ6OmZ1bmN0aW9uPFUgKEFTVDo6U2luZ2xlQVNUTm9kZSk+IGV4dHJhY3RvcikNCj4+ Pj4gKyAgew0KPj4+PiArICAgIGV4cGFuZGVyLnB1c2hfY29udGV4dCAoY3R4KTsNCj4+Pj4g Kw0KPj4+PiArICAgIGZvciAoYXV0byBpdCA9IHZhbHVlcy5iZWdpbiAoKTsgaXQgIT0gdmFs dWVzLmVuZCAoKTspDQo+Pj4+ICsgICAgICB7DQo+Pj4+ICsgICAgICAgYXV0byAmdmFsdWUg PSAqaXQ7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAvLyBtYXJrIGZvciBzdHJpcHBpbmcgaWYg cmVxdWlyZWQNCj4+Pj4gKyAgICAgICB2YWx1ZS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4+ PiArDQo+Pj4+ICsgICAgICAgLy8gcmVjdXJzaXZlbHkgZXhwYW5kIHRoZSBjaGlsZHJlbg0K Pj4+PiArICAgICAgIGF1dG8gZmluYWxfZnJhZ21lbnQgPSBleHBhbmRfbWFjcm9fZnJhZ21l bnRfcmVjdXJzaXZlICgpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAgaWYgKGZpbmFsX2ZyYWdt ZW50LnNob3VsZF9leHBhbmQgKCkpDQo+Pj4+ICsgICAgICAgICB7DQo+Pj4+ICsgICAgICAg ICAgIGl0ID0gdmFsdWVzLmVyYXNlIChpdCk7DQo+Pj4+ICsgICAgICAgICAgIGZvciAoYXV0 byAmbm9kZSA6IGZpbmFsX2ZyYWdtZW50LmdldF9ub2RlcyAoKSkNCj4+Pj4gKyAgICAgICAg ICAgICB7DQo+Pj4+ICsgICAgICAgICAgICAgICBhdXRvIG5ld19ub2RlID0gZXh0cmFjdG9y IChub2RlKTsNCj4+Pj4gKyAgICAgICAgICAgICAgIGlmIChuZXdfbm9kZSAhPSBudWxscHRy ICYmICFuZXdfbm9kZS0+aXNfbWFya2VkX2Zvcl9zdHJpcCAoKSkNCj4+Pj4gKyAgICAgICAg ICAgICAgICAgew0KPj4+PiArICAgICAgICAgICAgICAgICAgIGl0ID0gdmFsdWVzLmluc2Vy dCAoaXQsIHN0ZDo6bW92ZSAobmV3X25vZGUpKTsNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICBpdCsrOw0KPj4+PiArICAgICAgICAgICAgICAgICB9DQo+Pj4+ICsgICAgICAgICAgICAg fQ0KPj4+PiArICAgICAgICAgfQ0KPj4+PiArICAgICAgIGVsc2UgaWYgKHZhbHVlLT5pc19t YXJrZWRfZm9yX3N0cmlwICgpKQ0KPj4+PiArICAgICAgICAgew0KPj4+PiArICAgICAgICAg ICBpdCA9IHZhbHVlcy5lcmFzZSAoaXQpOw0KPj4+PiArICAgICAgICAgfQ0KPj4+PiArICAg ICAgIGVsc2UNCj4+Pj4gKyAgICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAgKytpdDsNCj4+ Pj4gKyAgICAgICAgIH0NCj4+Pj4gKyAgICAgIH0NCj4+Pj4gKw0KPj4+PiArICAgIGV4cGFu ZGVyLnBvcF9jb250ZXh0ICgpOw0KPj4+PiArICB9DQo+Pj4+ICsNCj4+Pj4gKyAgdGVtcGxh dGUgPHR5cGVuYW1lIFQ+IHZvaWQgZXhwYW5kX3BvaW50ZXJfYWxsb3dfc3RyaXAgKFQgJnZh bHVlcykNCj4+Pj4gKyAgew0KPj4+PiArICAgIGZvciAoYXV0byBpdCA9IHZhbHVlcy5iZWdp biAoKTsgaXQgIT0gdmFsdWVzLmVuZCAoKTspDQo+Pj4+ICsgICAgICB7DQo+Pj4+ICsgICAg ICAgYXV0byAmdmFsdWUgPSAqaXQ7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAvLyBtYXJrIGZv ciBzdHJpcHBpbmcgaWYgcmVxdWlyZWQNCj4+Pj4gKyAgICAgICB2YWx1ZS0+YWNjZXB0X3Zp cyAoKnRoaXMpOw0KPj4+PiArICAgICAgIGlmICh2YWx1ZS0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAgaXQgPSB2YWx1ZXMu ZXJhc2UgKGl0KTsNCj4+Pj4gKyAgICAgICAgIH0NCj4+Pj4gKyAgICAgICBlbHNlDQo+Pj4+ ICsgICAgICAgICB7DQo+Pj4+ICsgICAgICAgICAgICsraXQ7DQo+Pj4+ICsgICAgICAgICB9 DQo+Pj4+ICsgICAgICB9DQo+Pj4+ICsgIH0NCj4+Pj4gKw0KPj4+PiArICB2b2lkIHZpc2l0 IChBU1Q6OlRva2VuICYpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OkRl bGltVG9rZW5UcmVlICYpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OkF0 dHJJbnB1dE1ldGFJdGVtQ29udGFpbmVyICYpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZp c2l0IChBU1Q6OklkZW50aWZpZXJFeHByICZpZGVudF9leHByKSBvdmVycmlkZTsNCj4+Pj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpMaWZldGltZSAmKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9p ZCB2aXNpdCAoQVNUOjpMaWZldGltZVBhcmFtICYpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lk IHZpc2l0IChBU1Q6OkNvbnN0R2VuZXJpY1BhcmFtICYpIG92ZXJyaWRlOw0KPj4+PiArDQo+ Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWFjcm9JbnZvY2F0aW9uICZtYWNyb19pbnZvYykg b3ZlcnJpZGU7DQo+Pj4+ICsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpQYXRoSW5FeHBy ZXNzaW9uICZwYXRoKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUeXBl UGF0aFNlZ21lbnQgJikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHlw ZVBhdGhTZWdtZW50R2VuZXJpYyAmc2VnbWVudCkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6VHlwZVBhdGhTZWdtZW50RnVuY3Rpb24gJnNlZ21lbnQpIG92ZXJyaWRl Ow0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVQYXRoICZwYXRoKSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9uICZw YXRoKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpRdWFsaWZpZWRQYXRo SW5UeXBlICZwYXRoKSBvdmVycmlkZTsNCj4+Pj4gKw0KPj4+PiArICB2b2lkIHZpc2l0IChB U1Q6OkxpdGVyYWxFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAo QVNUOjpBdHRySW5wdXRMaXRlcmFsICYpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0 IChBU1Q6Ok1ldGFJdGVtTGl0RXhwciAmKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpNZXRhSXRlbVBhdGhMaXQgJikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6Qm9ycm93RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6RGVyZWZlcmVuY2VFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9p ZCB2aXNpdCAoQVNUOjpFcnJvclByb3BhZ2F0aW9uRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+ Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TmVnYXRpb25FeHByICZleHByKSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpBcml0aG1ldGljT3JMb2dpY2FsRXhwciAmZXhw cikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6Q29tcGFyaXNvbkV4cHIg JmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OkxhenlCb29sZWFu RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHlwZUNh c3RFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpBc3Np Z25tZW50RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6 Q29tcG91bmRBc3NpZ25tZW50RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6R3JvdXBlZEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lk IHZpc2l0IChBU1Q6OkFycmF5RWxlbXNWYWx1ZXMgJmVsZW1zKSBvdmVycmlkZTsNCj4+Pj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpBcnJheUVsZW1zQ29waWVkICZlbGVtcykgb3ZlcnJpZGU7 DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6QXJyYXlFeHByICZleHByKSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpBcnJheUluZGV4RXhwciAmZXhwcikgb3ZlcnJp ZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHVwbGVFeHByICZleHByKSBvdmVycmlk ZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUdXBsZUluZGV4RXhwciAmZXhwcikgb3Zl cnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6U3RydWN0RXhwclN0cnVjdCAmZXhw cikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6U3RydWN0RXhwckZpZWxk SWRlbnRpZmllciAmKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpTdHJ1 Y3RFeHByRmllbGRJZGVudGlmaWVyVmFsdWUgJmZpZWxkKSBvdmVycmlkZTsNCj4+Pj4gKw0K Pj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdEV4cHJGaWVsZEluZGV4VmFsdWUgJmZp ZWxkKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpTdHJ1Y3RFeHByU3Ry dWN0RmllbGRzICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpT dHJ1Y3RFeHByU3RydWN0QmFzZSAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6Q2FsbEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0 IChBU1Q6Ok1ldGhvZENhbGxFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpGaWVsZEFjY2Vzc0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2 b2lkIHZpc2l0IChBU1Q6OkNsb3N1cmVFeHBySW5uZXIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+ PiArDQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6QmxvY2tFeHByICZleHByKSBvdmVycmlk ZTsNCj4+Pj4gKw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OkNsb3N1cmVFeHBySW5uZXJU eXBlZCAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6Q29udGlu dWVFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpCcmVh a0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlJhbmdl RnJvbVRvRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6 UmFuZ2VGcm9tRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6UmFuZ2VUb0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChB U1Q6OlJhbmdlRnVsbEV4cHIgJikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFT VDo6UmFuZ2VGcm9tVG9JbmNsRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6UmFuZ2VUb0luY2xFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpSZXR1cm5FeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpVbnNhZmVCbG9ja0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+ PiArICB2b2lkIHZpc2l0IChBU1Q6Okxvb3BFeHByICZleHByKSBvdmVycmlkZTsNCj4+Pj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpXaGlsZUxvb3BFeHByICZleHByKSBvdmVycmlkZTsNCj4+ Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpXaGlsZUxldExvb3BFeHByICZleHByKSBvdmVycmlk ZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpGb3JMb29wRXhwciAmZXhwcikgb3ZlcnJp ZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6SWZFeHByICZleHByKSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpJZkV4cHJDb25zZXFFbHNlICZleHByKSBvdmVy cmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpJZkV4cHJDb25zZXFJZiAmZXhwcikg b3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6SWZFeHByQ29uc2VxSWZMZXQg JmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OklmTGV0RXhwciAm ZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6SWZMZXRFeHByQ29u c2VxRWxzZSAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6SWZM ZXRFeHByQ29uc2VxSWYgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChB U1Q6OklmTGV0RXhwckNvbnNlcUlmTGV0ICZleHByKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9p ZCB2aXNpdCAoQVNUOjpNYXRjaEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lk IHZpc2l0IChBU1Q6OkF3YWl0RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6QXN5bmNCbG9ja0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4+PiArICB2 b2lkIHZpc2l0IChBU1Q6OlR5cGVQYXJhbSAmcGFyYW0pIG92ZXJyaWRlOw0KPj4+PiArICB2 b2lkIHZpc2l0IChBU1Q6OkxpZmV0aW1lV2hlcmVDbGF1c2VJdGVtICYpIG92ZXJyaWRlOw0K Pj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVCb3VuZFdoZXJlQ2xhdXNlSXRlbSAmaXRl bSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWV0aG9kICZtZXRob2Qp IG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok1vZHVsZSAmbW9kdWxlKSBv dmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpFeHRlcm5DcmF0ZSAmY3JhdGUp IG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlVzZVRyZWVHbG9iICYpIG92 ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlVzZVRyZWVMaXN0ICYpIG92ZXJy aWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlVzZVRyZWVSZWJpbmQgJikgb3ZlcnJp ZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VXNlRGVjbGFyYXRpb24gJnVzZV9kZWNs KSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpGdW5jdGlvbiAmZnVuY3Rp b24pIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR5cGVBbGlhcyAmdHlw ZV9hbGlhcykgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6U3RydWN0U3Ry dWN0ICZzdHJ1Y3RfaXRlbSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6 VHVwbGVTdHJ1Y3QgJnR1cGxlX3N0cnVjdCkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6RW51bUl0ZW0gJml0ZW0pIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0 IChBU1Q6OkVudW1JdGVtVHVwbGUgJml0ZW0pIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZp c2l0IChBU1Q6OkVudW1JdGVtU3RydWN0ICZpdGVtKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9p ZCB2aXNpdCAoQVNUOjpFbnVtSXRlbURpc2NyaW1pbmFudCAmaXRlbSkgb3ZlcnJpZGU7DQo+ Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6RW51bSAmZW51bV9pdGVtKSBvdmVycmlkZTsNCj4+ Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpVbmlvbiAmdW5pb25faXRlbSkgb3ZlcnJpZGU7DQo+ Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6Q29uc3RhbnRJdGVtICZjb25zdF9pdGVtKSBvdmVy cmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpTdGF0aWNJdGVtICZzdGF0aWNfaXRl bSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHJhaXRJdGVtRnVuYyAm aXRlbSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHJhaXRJdGVtTWV0 aG9kICZpdGVtKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUcmFpdEl0 ZW1Db25zdCAmaXRlbSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHJh aXRJdGVtVHlwZSAmaXRlbSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6 VHJhaXQgJnRyYWl0KSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpJbmhl cmVudEltcGwgJmltcGwpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlRy YWl0SW1wbCAmaW1wbCkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6RXh0 ZXJuYWxTdGF0aWNJdGVtICZpdGVtKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAo QVNUOjpFeHRlcm5hbEZ1bmN0aW9uSXRlbSAmaXRlbSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZv aWQgdmlzaXQgKEFTVDo6RXh0ZXJuQmxvY2sgJmJsb2NrKSBvdmVycmlkZTsNCj4+Pj4gKw0K Pj4+PiArICAvLyBJIGRvbid0IHRoaW5rIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHN0cmlw IG1hY3JvcyB3aXRob3V0IGV4cGFuc2lvbg0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6Ok1h Y3JvTWF0Y2hGcmFnbWVudCAmKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNU OjpNYWNyb01hdGNoUmVwZXRpdGlvbiAmKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNp dCAoQVNUOjpNYWNyb01hdGNoZXIgJikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQg KEFTVDo6TWFjcm9SdWxlc0RlZmluaXRpb24gJnJ1bGVzX2RlZikgb3ZlcnJpZGU7DQo+Pj4+ ICsgIHZvaWQgdmlzaXQgKEFTVDo6TWV0YUl0ZW1QYXRoICYpIG92ZXJyaWRlOw0KPj4+PiAr ICB2b2lkIHZpc2l0IChBU1Q6Ok1ldGFJdGVtU2VxICYpIG92ZXJyaWRlOw0KPj4+PiArICB2 b2lkIHZpc2l0IChBU1Q6Ok1ldGFXb3JkICYpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZp c2l0IChBU1Q6Ok1ldGFOYW1lVmFsdWVTdHIgJikgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6TWV0YUxpc3RQYXRocyAmKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2 aXNpdCAoQVNUOjpNZXRhTGlzdE5hbWVWYWx1ZVN0ciAmKSBvdmVycmlkZTsNCj4+Pj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpMaXRlcmFsUGF0dGVybiAmKSBvdmVycmlkZTsNCj4+Pj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpJZGVudGlmaWVyUGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7 DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6V2lsZGNhcmRQYXR0ZXJuICYpIG92ZXJyaWRl Ow0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlJhbmdlUGF0dGVybkJvdW5kTGl0ZXJhbCAm KSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpSYW5nZVBhdHRlcm5Cb3Vu ZFBhdGggJmJvdW5kKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpSYW5n ZVBhdHRlcm5Cb3VuZFF1YWxQYXRoICZib3VuZCkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQg dmlzaXQgKEFTVDo6UmFuZ2VQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsNCj4+Pj4gKyAg dm9pZCB2aXNpdCAoQVNUOjpSZWZlcmVuY2VQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpTdHJ1Y3RQYXR0ZXJuRmllbGRUdXBsZVBhdCAm ZmllbGQpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlN0cnVjdFBhdHRl cm5GaWVsZElkZW50UGF0ICZmaWVsZCkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQg KEFTVDo6U3RydWN0UGF0dGVybkZpZWxkSWRlbnQgJmZpZWxkKSBvdmVycmlkZTsNCj4+Pj4g KyAgdm9pZCB2aXNpdCAoQVNUOjpTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpUdXBsZVN0cnVjdEl0ZW1zTm9SYW5nZSAmdHVw bGVfaXRlbXMpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR1cGxlU3Ry dWN0SXRlbXNSYW5nZSAmdHVwbGVfaXRlbXMpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZp c2l0IChBU1Q6OlR1cGxlU3RydWN0UGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7DQo+Pj4+ ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHVwbGVQYXR0ZXJuSXRlbXNNdWx0aXBsZSAmdHVwbGVf aXRlbXMpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR1cGxlUGF0dGVy bkl0ZW1zUmFuZ2VkICZ0dXBsZV9pdGVtcykgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlz aXQgKEFTVDo6VHVwbGVQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9p ZCB2aXNpdCAoQVNUOjpHcm91cGVkUGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7DQo+Pj4+ ICsgIHZvaWQgdmlzaXQgKEFTVDo6U2xpY2VQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsN Cj4+Pj4gKw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OkVtcHR5U3RtdCAmKSBvdmVycmlk ZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpMZXRTdG10ICZzdG10KSBvdmVycmlkZTsN Cj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpFeHByU3RtdFdpdGhvdXRCbG9jayAmc3RtdCkg b3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6RXhwclN0bXRXaXRoQmxvY2sg JnN0bXQpIG92ZXJyaWRlOw0KPj4+PiArDQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHJh aXRCb3VuZCAmYm91bmQpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6Oklt cGxUcmFpdFR5cGUgJnR5cGUpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6 OlRyYWl0T2JqZWN0VHlwZSAmdHlwZSkgb3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQg KEFTVDo6UGFyZW50aGVzaXNlZFR5cGUgJnR5cGUpIG92ZXJyaWRlOw0KPj4+PiArICB2b2lk IHZpc2l0IChBU1Q6OkltcGxUcmFpdFR5cGVPbmVCb3VuZCAmdHlwZSkgb3ZlcnJpZGU7DQo+ Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6VHJhaXRPYmplY3RUeXBlT25lQm91bmQgJnR5cGUp IG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlR1cGxlVHlwZSAmdHlwZSkg b3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6TmV2ZXJUeXBlICYpIG92ZXJy aWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlJhd1BvaW50ZXJUeXBlICZ0eXBlKSBv dmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpSZWZlcmVuY2VUeXBlICZ0eXBl KSBvdmVycmlkZTsNCj4+Pj4gKyAgdm9pZCB2aXNpdCAoQVNUOjpBcnJheVR5cGUgJnR5cGUp IG92ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OlNsaWNlVHlwZSAmdHlwZSkg b3ZlcnJpZGU7DQo+Pj4+ICsgIHZvaWQgdmlzaXQgKEFTVDo6SW5mZXJyZWRUeXBlICYpIG92 ZXJyaWRlOw0KPj4+PiArICB2b2lkIHZpc2l0IChBU1Q6OkJhcmVGdW5jdGlvblR5cGUgJnR5 cGUpIG92ZXJyaWRlOw0KPj4+PiArfTsNCj4+Pj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ Pj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5zLmNj IGIvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8tYnVpbHRpbnMuY2MNCj4+Pj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQNCj4+Pj4gaW5kZXggMDAwMDAwMDAwMDAuLjVlYWNlMTNkMTk3DQo+ Pj4+IC0tLSAvZGV2L251bGwNCj4+Pj4gKysrIGIvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFj cm8tYnVpbHRpbnMuY2MNCj4+Pj4gQEAgLTAsMCArMSw0ODQgQEANCj4+Pj4gKy8vIENvcHly aWdodCAoQykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4+ PiArDQo+Pj4+ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+Pj4+ICsNCj4+Pj4g Ky8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5IGl0IHVuZGVyDQo+Pj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4+PiArLy8g U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXINCj4+Pj4gKy8vIHZlcnNpb24uDQo+Pj4+ICsNCj4+Pj4gKy8vIEdD QyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBi dXQgV0lUSE9VVCBBTlkNCj4+Pj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+Pj4+ICsvLyBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UNCj4+Pj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+Pj4+ICsNCj4+Pj4gKy8v IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlDQo+Pj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENP UFlJTkczLiAgSWYgbm90IHNlZQ0KPj4+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8+Lg0KPj4+PiArDQo+Pj4+ICsjaW5jbHVkZSAicnVzdC1tYWNyby1idWlsdGlucy5o Ig0KPj4+PiArI2luY2x1ZGUgInJ1c3QtZGlhZ25vc3RpY3MuaCINCj4+Pj4gKyNpbmNsdWRl ICJydXN0LWV4cHIuaCINCj4+Pj4gKyNpbmNsdWRlICJydXN0LXNlc3Npb24tbWFuYWdlci5o Ig0KPj4+PiArI2luY2x1ZGUgInJ1c3QtbWFjcm8taW52b2MtbGV4ZXIuaCINCj4+Pj4gKyNp bmNsdWRlICJydXN0LWxleC5oIg0KPj4+PiArI2luY2x1ZGUgInJ1c3QtcGFyc2UuaCINCj4+ Pj4gKw0KPj4+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4+PiArbmFtZXNwYWNlIHsNCj4+Pj4g K3N0ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4cHI+DQo+Pj4+ICttYWtlX3N0cmluZyAoTG9jYXRp b24gbG9jdXMsIHN0ZDo6c3RyaW5nIHZhbHVlKQ0KPj4+PiArew0KPj4+PiArICByZXR1cm4g c3RkOjp1bmlxdWVfcHRyPEFTVDo6RXhwcj4gKA0KPj4+PiArICAgIG5ldyBBU1Q6OkxpdGVy YWxFeHByICh2YWx1ZSwgQVNUOjpMaXRlcmFsOjpTVFJJTkcsDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgUHJpbWl0aXZlQ29yZVR5cGU6OkNPUkVUWVBFX1NUUiwge30sIGxv Y3VzKSk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gKy8qIE1hdGNoIHRoZSBlbmQgdG9rZW4g b2YgYSBtYWNybyBnaXZlbiB0aGUgc3RhcnQgZGVsaW1pdGVyIG9mIHRoZSBtYWNybyAqLw0K Pj4+PiArDQo+Pj4+ICtzdGF0aWMgaW5saW5lIFRva2VuSWQNCj4+Pj4gK21hY3JvX2VuZF90 b2tlbiAoQVNUOjpEZWxpbVRva2VuVHJlZSAmaW52b2NfdG9rZW5fdHJlZSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICBQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyKQ0KPj4+PiAr ew0KPj4+PiArICBhdXRvIGxhc3RfdG9rZW5faWQgPSBUb2tlbklkOjpSSUdIVF9DVVJMWTsN Cj4+Pj4gKyAgc3dpdGNoIChpbnZvY190b2tlbl90cmVlLmdldF9kZWxpbV90eXBlICgpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICBjYXNlIEFTVDo6RGVsaW1UeXBlOjpQQVJFTlM6DQo+ Pj4+ICsgICAgICBsYXN0X3Rva2VuX2lkID0gVG9rZW5JZDo6UklHSFRfUEFSRU47DQo+Pj4+ ICsgICAgICBydXN0X2Fzc2VydCAocGFyc2VyLnNraXBfdG9rZW4gKExFRlRfUEFSRU4pKTsN Cj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgY2FzZSBBU1Q6OkRlbGlt VHlwZTo6Q1VSTFk6DQo+Pj4+ICsgICAgICBydXN0X2Fzc2VydCAocGFyc2VyLnNraXBfdG9r ZW4gKExFRlRfQ1VSTFkpKTsNCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsg ICAgY2FzZSBBU1Q6OkRlbGltVHlwZTo6U1FVQVJFOg0KPj4+PiArICAgICAgbGFzdF90b2tl bl9pZCA9IFRva2VuSWQ6OlJJR0hUX1NRVUFSRTsNCj4+Pj4gKyAgICAgIHJ1c3RfYXNzZXJ0 IChwYXJzZXIuc2tpcF90b2tlbiAoTEVGVF9TUVVBUkUpKTsNCj4+Pj4gKyAgICAgIGJyZWFr Ow0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICByZXR1cm4gbGFzdF90b2tlbl9pZDsN Cj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArLyogUGFyc2UgYSBzaW5nbGUgc3RyaW5nIGxpdGVy YWwgZnJvbSB0aGUgZ2l2ZW4gZGVsaW1pdGVkIHRva2VuIHRyZWUsDQo+Pj4+ICsgICBhbmQg cmV0dXJuIHRoZSBMaXRlcmFsRXhwciBmb3IgaXQuIEFsbG93IGZvciBhbiBvcHRpb25hbCB0 cmFpbGluZyBjb21tYSwNCj4+Pj4gKyAgIGJ1dCBvdGhlcndpc2UgZW5mb3JjZSB0aGF0IHRo ZXNlIGFyZSB0aGUgb25seSB0b2tlbnMuICAqLw0KPj4+PiArDQo+Pj4+ICtzdGQ6OnVuaXF1 ZV9wdHI8QVNUOjpMaXRlcmFsRXhwcj4NCj4+Pj4gK3BhcnNlX3NpbmdsZV9zdHJpbmdfbGl0 ZXJhbCAoQVNUOjpEZWxpbVRva2VuVHJlZSAmaW52b2NfdG9rZW5fdHJlZSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiBpbnZvY19sb2N1cykNCj4+Pj4g K3sNCj4+Pj4gKyAgTWFjcm9JbnZvY0xleGVyIGxleCAoaW52b2NfdG9rZW5fdHJlZS50b190 b2tlbl9zdHJlYW0gKCkpOw0KPj4+PiArICBQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiBwYXJz ZXIgKGxleCk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byBsYXN0X3Rva2VuX2lkID0gbWFjcm9f ZW5kX3Rva2VuIChpbnZvY190b2tlbl90cmVlLCBwYXJzZXIpOw0KPj4+PiArDQo+Pj4+ICsg IHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkxpdGVyYWxFeHByPiBsaXRfZXhwciA9IG51bGxwdHI7 DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHBhcnNlci5wZWVrX2N1cnJlbnRfdG9rZW4gKCktPmdl dF9pZCAoKSA9PSBTVFJJTkdfTElURVJBTCkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBs aXRfZXhwciA9IHBhcnNlci5wYXJzZV9saXRlcmFsX2V4cHIgKCk7DQo+Pj4+ICsgICAgICBw YXJzZXIubWF5YmVfc2tpcF90b2tlbiAoQ09NTUEpOw0KPj4+PiArICAgICAgaWYgKHBhcnNl ci5wZWVrX2N1cnJlbnRfdG9rZW4gKCktPmdldF9pZCAoKSAhPSBsYXN0X3Rva2VuX2lkKQ0K Pj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIGxpdF9leHByID0gbnVsbHB0cjsNCj4+ Pj4gKyAgICAgICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jX2xvY3VzLCAibWFjcm8gdGFrZXMg MSBhcmd1bWVudCIpOw0KPj4+PiArICAgICAgIH0NCj4+Pj4gKyAgICB9DQo+Pj4+ICsgIGVs c2UgaWYgKHBhcnNlci5wZWVrX2N1cnJlbnRfdG9rZW4gKCktPmdldF9pZCAoKSA9PSBsYXN0 X3Rva2VuX2lkKQ0KPj4+PiArICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jX2xvY3VzLCAibWFj cm8gdGFrZXMgMSBhcmd1bWVudCIpOw0KPj4+PiArICBlbHNlDQo+Pj4+ICsgICAgcnVzdF9l cnJvcl9hdCAoaW52b2NfbG9jdXMsICJhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVy YWwiKTsNCj4+Pj4gKw0KPj4+PiArICBwYXJzZXIuc2tpcF90b2tlbiAobGFzdF90b2tlbl9p ZCk7DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIGxpdF9leHByOw0KPj4+PiArfQ0KPj4+PiAr DQo+Pj4+ICsvKiBUcmVhdCBQQVRIIGFzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNl IGZpbGUgY3VycmVudGx5IGJlaW5nDQo+Pj4+ICsgICBjb21waWxlZCwgYW5kIHJldHVybiB0 aGUgYWJzb2x1dGUgcGF0aCBmb3IgaXQuICAqLw0KPj4+PiArDQo+Pj4+ICtzdGQ6OnN0cmlu Zw0KPj4+PiArc291cmNlX3JlbGF0aXZlX3BhdGggKHN0ZDo6c3RyaW5nIHBhdGgsIExvY2F0 aW9uIGxvY3VzKQ0KPj4+PiArew0KPj4+PiArICBzdGQ6OnN0cmluZyBjb21waWxlX2ZuYW1l DQo+Pj4+ICsgICAgPSBTZXNzaW9uOjpnZXRfaW5zdGFuY2UgKCkubGluZW1hcC0+bG9jYXRp b25fZmlsZSAobG9jdXMpOw0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gZGlyX3NlcGFyYXRvcl9w b3MgPSBjb21waWxlX2ZuYW1lLnJmaW5kIChmaWxlX3NlcGFyYXRvcik7DQo+Pj4+ICsNCj4+ Pj4gKyAgLyogSWYgdGhlcmUgaXMgbm8gZmlsZV9zZXBhcmF0b3IgaW4gdGhlIHBhdGgsIHVz ZSBjdXJyZW50IGRpciAoJy4nKS4gICovDQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIGRpcm5hbWU7 DQo+Pj4+ICsgIGlmIChkaXJfc2VwYXJhdG9yX3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykN Cj4+Pj4gKyAgICBkaXJuYW1lID0gc3RkOjpzdHJpbmcgKCIuIikgKyBmaWxlX3NlcGFyYXRv cjsNCj4+Pj4gKyAgZWxzZQ0KPj4+PiArICAgIGRpcm5hbWUgPSBjb21waWxlX2ZuYW1lLnN1 YnN0ciAoMCwgZGlyX3NlcGFyYXRvcl9wb3MpICsgZmlsZV9zZXBhcmF0b3I7DQo+Pj4+ICsN Cj4+Pj4gKyAgcmV0dXJuIGRpcm5hbWUgKyBwYXRoOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ ICsvKiBSZWFkIHRoZSBmdWxsIGNvbnRlbnRzIG9mIHRoZSBmaWxlIEZJTEVOQU1FIGFuZCBy ZXR1cm4gdGhlbSBpbiBhIHZlY3Rvci4NCj4+Pj4gKyAgIEZJWE1FOiBwbGF0Zm9ybSBzcGVj aWZpYy4gICovDQo+Pj4+ICsNCj4+Pj4gK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+DQo+Pj4+ICts b2FkX2ZpbGVfYnl0ZXMgKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQ0KPj4+PiArew0KPj4+PiAr ICBSQUlJRmlsZSBmaWxlX3dyYXAgKGZpbGVuYW1lKTsNCj4+Pj4gKyAgaWYgKGZpbGVfd3Jh cC5nZXRfcmF3ICgpID09IG51bGxwdHIpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgcnVz dF9lcnJvcl9hdCAoTG9jYXRpb24gKCksICJjYW5ub3Qgb3BlbiBmaWxlbmFtZSAlczogJW0i LCBmaWxlbmFtZSk7DQo+Pj4+ICsgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4g KCk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIEZJTEUgKmYgPSBmaWxlX3dyYXAu Z2V0X3JhdyAoKTsNCj4+Pj4gKyAgZnNlZWsgKGYsIDBMLCBTRUVLX0VORCk7DQo+Pj4+ICsg IGxvbmcgZnNpemUgPSBmdGVsbCAoZik7DQo+Pj4+ICsgIGZzZWVrIChmLCAwTCwgU0VFS19T RVQpOw0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZiAoZnNpemUp Ow0KPj4+PiArDQo+Pj4+ICsgIGlmIChmcmVhZCAoJmJ1ZlswXSwgZnNpemUsIDEsIGYpICE9 IDEpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgcnVzdF9lcnJvcl9hdCAoTG9jYXRpb24g KCksICJlcnJvciByZWFkaW5nIGZpbGUgJXM6ICVtIiwgZmlsZW5hbWUpOw0KPj4+PiArICAg ICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICgpOw0KPj4+PiArICAgIH0NCj4+Pj4g Kw0KPj4+PiArICByZXR1cm4gYnVmOw0KPj4+PiArfQ0KPj4+PiArfSAvLyBuYW1lc3BhY2UN Cj4+Pj4gKw0KPj4+PiArQVNUOjpBU1RGcmFnbWVudA0KPj4+PiArTWFjcm9CdWlsdGluOjph c3NlcnQgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZv YykNCj4+Pj4gK3sNCj4+Pj4gKyAgcnVzdF9kZWJ1ZyAoImFzc2VydCEoKSBjYWxsZWQiKTsN Cj4+Pj4gKw0KPj4+PiArICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9y ICgpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICtN YWNyb0J1aWx0aW46OmZpbGUgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3JvSW52 b2NEYXRhICZpbnZvYykNCj4+Pj4gK3sNCj4+Pj4gKyAgYXV0byBjdXJyZW50X2ZpbGUNCj4+ Pj4gKyAgICA9IFNlc3Npb246OmdldF9pbnN0YW5jZSAoKS5saW5lbWFwLT5sb2NhdGlvbl9m aWxlIChpbnZvY19sb2N1cyk7DQo+Pj4+ICsgIGF1dG8gZmlsZV9zdHIgPSBBU1Q6OlNpbmds ZUFTVE5vZGUgKG1ha2Vfc3RyaW5nIChpbnZvY19sb2N1cywgY3VycmVudF9maWxlKSk7DQo+ Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQgKHtmaWxlX3N0cn0pOw0K Pj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICtNYWNyb0J1 aWx0aW46OmNvbHVtbiAoTG9jYXRpb24gaW52b2NfbG9jdXMsIEFTVDo6TWFjcm9JbnZvY0Rh dGEgJmludm9jKQ0KPj4+PiArew0KPj4+PiArICBhdXRvIGN1cnJlbnRfY29sdW1uDQo+Pj4+ ICsgICAgPSBTZXNzaW9uOjpnZXRfaW5zdGFuY2UgKCkubGluZW1hcC0+bG9jYXRpb25fdG9f Y29sdW1uIChpbnZvY19sb2N1cyk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byBjb2x1bW5fbm8g PSBBU1Q6OlNpbmdsZUFTVE5vZGUgKHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4cHI+ICgNCj4+ Pj4gKyAgICBuZXcgQVNUOjpMaXRlcmFsRXhwciAoc3RkOjp0b19zdHJpbmcgKGN1cnJlbnRf Y29sdW1uKSwgQVNUOjpMaXRlcmFsOjpJTlQsDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgUHJpbWl0aXZlQ29yZVR5cGU6OkNPUkVUWVBFX1UzMiwge30sIGludm9jX2xvY3Vz KSkpOw0KPj4+PiArDQo+Pj4+ICsgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50ICh7Y29sdW1u X25vfSk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gKy8qIEV4cGFuZCBidWlsdGluIG1hY3Jv IGluY2x1ZGVfYnl0ZXMhKCJmaWxlbmFtZSIpLCB3aGljaCBpbmNsdWRlcyB0aGUgY29udGVu dHMNCj4+Pj4gKyAgIG9mIHRoZSBnaXZlbiBmaWxlIGFzIHJlZmVyZW5jZSB0byBhIGJ5dGUg YXJyYXkuIFlpZWxkcyBhbiBleHByZXNzaW9uIG9mIHR5cGUNCj4+Pj4gKyAgICYnc3RhdGlj IFt1ODsgTl0uICAqLw0KPj4+PiArDQo+Pj4+ICtBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICtN YWNyb0J1aWx0aW46OmluY2x1ZGVfYnl0ZXMgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6 Ok1hY3JvSW52b2NEYXRhICZpbnZvYykNCj4+Pj4gK3sNCj4+Pj4gKyAgLyogR2V0IHRhcmdl dCBmaWxlbmFtZSBmcm9tIHRoZSBtYWNybyBpbnZvY2F0aW9uLCB3aGljaCBpcyB0cmVhdGVk IGFzIGEgcGF0aA0KPj4+PiArICAgICByZWxhdGl2ZSB0byB0aGUgaW5jbHVkZSEtaW5nIGZp bGUgKGN1cnJlbnRseSBiZWluZyBjb21waWxlZCkuICAqLw0KPj4+PiArICBhdXRvIGxpdF9l eHByDQo+Pj4+ICsgICAgPSBwYXJzZV9zaW5nbGVfc3RyaW5nX2xpdGVyYWwgKGludm9jLmdl dF9kZWxpbV90b2tfdHJlZSAoKSwgaW52b2NfbG9jdXMpOw0KPj4+PiArICBpZiAobGl0X2V4 cHIgPT0gbnVsbHB0cikNCj4+Pj4gKyAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3Jl YXRlX2Vycm9yICgpOw0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIHRhcmdldF9maWxl bmFtZQ0KPj4+PiArICAgID0gc291cmNlX3JlbGF0aXZlX3BhdGggKGxpdF9leHByLT5hc19z dHJpbmcgKCksIGludm9jX2xvY3VzKTsNCj4+Pj4gKw0KPj4+PiArICBzdGQ6OnZlY3Rvcjx1 aW50OF90PiBieXRlcyA9IGxvYWRfZmlsZV9ieXRlcyAodGFyZ2V0X2ZpbGVuYW1lLmNfc3Ry ICgpKTsNCj4+Pj4gKw0KPj4+PiArICAvKiBJcyB0aGVyZSBhIG1vcmUgZWZmaWNpZW50IHdh eSB0byBkbyB0aGlzPyAgKi8NCj4+Pg0KPj4+IFdlbGwsIGZpcnN0IG9mIGFsbCB5b3UgZG9u J3QgbmVlZCB0byByZWFkIGFsbCBvZiB0aGUgZmlsZSBhdCBvbmNlLCBzZWNvbmQgeW91DQo+ Pj4gY291bGQgcHJlLWFsbG9jYXRlICdlbHRzJyB0byB0aGUgY29ycmVjdCBzaXplIGFuZCBm aW5hbCB5b3UgY291bGQgb2J2aW91c2x5DQo+Pj4gY2hvb3NlIGEgY2hlYXBlciByZXByZXNl bnRhdGlvbiA7KQ0KPj4+DQo+Pj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxB U1Q6OkV4cHI+PiBlbHRzOw0KPj4+PiArICBmb3IgKHVpbnQ4X3QgYiA6IGJ5dGVzKQ0KPj4+ PiArICAgIHsNCj4+Pj4gKyAgICAgIGVsdHMuZW1wbGFjZV9iYWNrICgNCj4+Pj4gKyAgICAg ICBuZXcgQVNUOjpMaXRlcmFsRXhwciAoc3RkOjpzdHJpbmcgKDEsIChjaGFyKSBiKSwgQVNU OjpMaXRlcmFsOjpCWVRFLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQ cmltaXRpdmVDb3JlVHlwZTo6Q09SRVRZUEVfVTgsDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHt9IC8qIG91dGVyX2F0dHJzICovLCBpbnZvY19sb2N1cykpOw0KPj4+ PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBhdXRvIGVsZW1zID0gc3RkOjp1bmlxdWVfcHRy PEFTVDo6QXJyYXlFbGVtcz4gKA0KPj4+PiArICAgIG5ldyBBU1Q6OkFycmF5RWxlbXNWYWx1 ZXMgKHN0ZDo6bW92ZSAoZWx0cyksIGludm9jX2xvY3VzKSk7DQo+Pj4+ICsNCj4+Pj4gKyAg YXV0byBhcnJheSA9IHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkV4cHI+ICgNCj4+Pj4gKyAgICBu ZXcgQVNUOjpBcnJheUV4cHIgKHN0ZDo6bW92ZSAoZWxlbXMpLCB7fSwge30sIGludm9jX2xv Y3VzKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byBib3Jyb3cgPSBzdGQ6OnVuaXF1ZV9wdHI8 QVNUOjpFeHByPiAoDQo+Pj4+ICsgICAgbmV3IEFTVDo6Qm9ycm93RXhwciAoc3RkOjptb3Zl IChhcnJheSksIGZhbHNlLCBmYWxzZSwge30sIGludm9jX2xvY3VzKSk7DQo+Pj4+ICsNCj4+ Pj4gKyAgYXV0byBub2RlID0gQVNUOjpTaW5nbGVBU1ROb2RlIChzdGQ6Om1vdmUgKGJvcnJv dykpOw0KPj4+PiArICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudCAoe25vZGV9KTsNCj4+Pj4g K30NCj4+Pj4gKw0KPj4+PiArLyogRXhwYW5kIGJ1aWx0aW4gbWFjcm8gaW5jbHVkZV9zdHIh KCJmaWxlbmFtZSIpLCB3aGljaCBpbmNsdWRlcyB0aGUgY29udGVudHMNCj4+Pj4gKyAgIG9m IHRoZSBnaXZlbiBmaWxlIGFzIGEgc3RyaW5nLiBUaGUgZmlsZSBtdXN0IGJlIFVURi04IGVu Y29kZWQuIFlpZWxkcyBhbg0KPj4+PiArICAgZXhwcmVzc2lvbiBvZiB0eXBlICYnc3RhdGlj IHN0ci4gICovDQo+Pj4+ICsNCj4+Pj4gK0FTVDo6QVNURnJhZ21lbnQNCj4+Pj4gK01hY3Jv QnVpbHRpbjo6aW5jbHVkZV9zdHIgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3Jv SW52b2NEYXRhICZpbnZvYykNCj4+Pj4gK3sNCj4+Pj4gKyAgLyogR2V0IHRhcmdldCBmaWxl bmFtZSBmcm9tIHRoZSBtYWNybyBpbnZvY2F0aW9uLCB3aGljaCBpcyB0cmVhdGVkIGFzIGEg cGF0aA0KPj4+PiArICAgICByZWxhdGl2ZSB0byB0aGUgaW5jbHVkZSEtaW5nIGZpbGUgKGN1 cnJlbnRseSBiZWluZyBjb21waWxlZCkuICAqLw0KPj4+PiArICBhdXRvIGxpdF9leHByDQo+ Pj4+ICsgICAgPSBwYXJzZV9zaW5nbGVfc3RyaW5nX2xpdGVyYWwgKGludm9jLmdldF9kZWxp bV90b2tfdHJlZSAoKSwgaW52b2NfbG9jdXMpOw0KPj4+PiArICBpZiAobGl0X2V4cHIgPT0g bnVsbHB0cikNCj4+Pj4gKyAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vy cm9yICgpOw0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIHRhcmdldF9maWxlbmFtZQ0K Pj4+PiArICAgID0gc291cmNlX3JlbGF0aXZlX3BhdGggKGxpdF9leHByLT5hc19zdHJpbmcg KCksIGludm9jX2xvY3VzKTsNCj4+Pj4gKw0KPj4+PiArICBzdGQ6OnZlY3Rvcjx1aW50OF90 PiBieXRlcyA9IGxvYWRfZmlsZV9ieXRlcyAodGFyZ2V0X2ZpbGVuYW1lLmNfc3RyICgpKTsN Cj4+Pj4gKw0KPj4+PiArICAvKiBGSVhNRTogRW5mb3JjZSB0aGF0IHRoZSBmaWxlIGNvbnRl bnRzIGFyZSB2YWxpZCBVVEYtOC4gICovDQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIHN0ciAoKGNv bnN0IGNoYXIgKikgJmJ5dGVzWzBdLCBieXRlcy5zaXplICgpKTsNCj4+Pj4gKw0KPj4+PiAr ICBhdXRvIG5vZGUgPSBBU1Q6OlNpbmdsZUFTVE5vZGUgKG1ha2Vfc3RyaW5nIChpbnZvY19s b2N1cywgc3RyKSk7DQo+Pj4+ICsgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50ICh7bm9kZX0p Ow0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICsvKiBFeHBhbmQgYnVpbHRpbiBtYWNybyBjb21w aWxlX2Vycm9yISgiZXJyb3IiKSwgd2hpY2ggZm9yY2VzIGEgY29tcGlsZSBlcnJvcg0KPj4+ PiArICAgZHVyaW5nIHRoZSBjb21waWxlIHRpbWUuICovDQo+Pj4+ICtBU1Q6OkFTVEZyYWdt ZW50DQo+Pj4+ICtNYWNyb0J1aWx0aW46OmNvbXBpbGVfZXJyb3IgKExvY2F0aW9uIGludm9j X2xvY3VzLCBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYykNCj4+Pj4gK3sNCj4+Pj4gKyAg YXV0byBsaXRfZXhwcg0KPj4+PiArICAgID0gcGFyc2Vfc2luZ2xlX3N0cmluZ19saXRlcmFs IChpbnZvYy5nZXRfZGVsaW1fdG9rX3RyZWUgKCksIGludm9jX2xvY3VzKTsNCj4+Pj4gKyAg aWYgKGxpdF9leHByID09IG51bGxwdHIpDQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6QVNURnJh Z21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+Pj4gKw0KPj4+PiArICBzdGQ6OnN0cmluZyBl cnJvcl9zdHJpbmcgPSBsaXRfZXhwci0+YXNfc3RyaW5nICgpOw0KPj4+PiArICBydXN0X2Vy cm9yX2F0IChpbnZvY19sb2N1cywgIiVzIiwgZXJyb3Jfc3RyaW5nLmNfc3RyICgpKTsNCj4+ Pj4gKw0KPj4+PiArICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgp Ow0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICsvKiBFeHBhbmQgYnVpbHRpbiBtYWNybyBjb25j YXQhKCksIHdoaWNoIGpvaW5zIGFsbCB0aGUgbGl0ZXJhbCBwYXJhbWV0ZXJzDQo+Pj4+ICsg ICBpbnRvIGEgc3RyaW5nIHdpdGggbm8gZGVsaW1pdGVyLiAqLw0KPj4+PiArDQo+Pj4+ICtB U1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICtNYWNyb0J1aWx0aW46OmNvbmNhdCAoTG9jYXRpb24g aW52b2NfbG9jdXMsIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKQ0KPj4+PiArew0KPj4+ PiArICBhdXRvIGludm9jX3Rva2VuX3RyZWUgPSBpbnZvYy5nZXRfZGVsaW1fdG9rX3RyZWUg KCk7DQo+Pj4+ICsgIE1hY3JvSW52b2NMZXhlciBsZXggKGludm9jX3Rva2VuX3RyZWUudG9f dG9rZW5fc3RyZWFtICgpKTsNCj4+Pj4gKyAgUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gcGFy c2VyIChsZXgpOw0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gc3RyID0gc3RkOjpzdHJpbmcgKCk7 DQo+Pj4+ICsgIGJvb2wgaGFzX2Vycm9yID0gZmFsc2U7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0 byBsYXN0X3Rva2VuX2lkID0gbWFjcm9fZW5kX3Rva2VuIChpbnZvY190b2tlbl90cmVlLCBw YXJzZXIpOw0KPj4+PiArDQo+Pj4+ICsgIC8qIE5PVEU6IGNvbmNhdCEgY291bGQgYWNjZXB0 IG5vIGFyZ3VtZW50LCBzbyB3ZSBkb24ndCBoYXZlIGFueSBjaGVja3MgaGVyZSAqLw0KPj4+ PiArICB3aGlsZSAocGFyc2VyLnBlZWtfY3VycmVudF90b2tlbiAoKS0+Z2V0X2lkICgpICE9 IGxhc3RfdG9rZW5faWQpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgYXV0byBsaXRfZXhw ciA9IHBhcnNlci5wYXJzZV9saXRlcmFsX2V4cHIgKCk7DQo+Pj4+ICsgICAgICBpZiAobGl0 X2V4cHIpDQo+Pj4+ICsgICAgICAgew0KPj4+PiArICAgICAgICAgc3RyICs9IGxpdF9leHBy LT5hc19zdHJpbmcgKCk7DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArICAgICAgZWxzZQ0KPj4+ PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIGF1dG8gY3VycmVudF90b2tlbiA9IHBhcnNl ci5wZWVrX2N1cnJlbnRfdG9rZW4gKCk7DQo+Pj4+ICsgICAgICAgICBydXN0X2Vycm9yX2F0 IChjdXJyZW50X3Rva2VuLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSBhIGNvbnN0YW50IGxpdGVyYWwiKTsNCj4+Pj4g KyAgICAgICAgIGhhc19lcnJvciA9IHRydWU7DQo+Pj4+ICsgICAgICAgICAvLyBKdXN0IGNy YXNoIGlmIHRoZSBjdXJyZW50IHRva2VuIGNhbid0IGJlIHNraXBwZWQNCj4+Pj4gKyAgICAg ICAgIHJ1c3RfYXNzZXJ0IChwYXJzZXIuc2tpcF90b2tlbiAoY3VycmVudF90b2tlbi0+Z2V0 X2lkICgpKSk7DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArICAgICAgcGFyc2VyLm1heWJlX3Nr aXBfdG9rZW4gKENPTU1BKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgcGFyc2Vy LnNraXBfdG9rZW4gKGxhc3RfdG9rZW5faWQpOw0KPj4+PiArDQo+Pj4+ICsgIGlmIChoYXNf ZXJyb3IpDQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJv ciAoKTsNCj4+Pj4gKw0KPj4+PiArICBhdXRvIG5vZGUgPSBBU1Q6OlNpbmdsZUFTVE5vZGUg KG1ha2Vfc3RyaW5nIChpbnZvY19sb2N1cywgc3RyKSk7DQo+Pj4+ICsgIHJldHVybiBBU1Q6 OkFTVEZyYWdtZW50ICh7bm9kZX0pOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICsvKiBFeHBh bmQgYnVpbHRpbiBtYWNybyBlbnYhKCksIHdoaWNoIGluc3BlY3RzIGFuIGVudmlyb25tZW50 IHZhcmlhYmxlIGF0DQo+Pj4+ICsgICBjb21waWxlIHRpbWUuICovDQo+Pj4+ICsNCj4+Pj4g K0FTVDo6QVNURnJhZ21lbnQNCj4+Pj4gK01hY3JvQnVpbHRpbjo6ZW52IChMb2NhdGlvbiBp bnZvY19sb2N1cywgQVNUOjpNYWNyb0ludm9jRGF0YSAmaW52b2MpDQo+Pj4+ICt7DQo+Pj4+ ICsgIGF1dG8gaW52b2NfdG9rZW5fdHJlZSA9IGludm9jLmdldF9kZWxpbV90b2tfdHJlZSAo KTsNCj4+Pj4gKyAgTWFjcm9JbnZvY0xleGVyIGxleCAoaW52b2NfdG9rZW5fdHJlZS50b190 b2tlbl9zdHJlYW0gKCkpOw0KPj4+PiArICBQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiBwYXJz ZXIgKGxleCk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byBsYXN0X3Rva2VuX2lkID0gbWFjcm9f ZW5kX3Rva2VuIChpbnZvY190b2tlbl90cmVlLCBwYXJzZXIpOw0KPj4+PiArDQo+Pj4+ICsg IGlmIChwYXJzZXIucGVla19jdXJyZW50X3Rva2VuICgpLT5nZXRfaWQgKCkgIT0gU1RSSU5H X0xJVEVSQUwpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgaWYgKHBhcnNlci5wZWVrX2N1 cnJlbnRfdG9rZW4gKCktPmdldF9pZCAoKSA9PSBsYXN0X3Rva2VuX2lkKQ0KPj4+PiArICAg ICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jX2xvY3VzLCAiZW52ISB0YWtlcyAxIG9yIDIgYXJn dW1lbnRzIik7DQo+Pj4+ICsgICAgICBlbHNlDQo+Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9h dCAocGFyc2VyLnBlZWtfY3VycmVudF90b2tlbiAoKS0+Z2V0X2xvY3VzICgpLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVy YWwiKTsNCj4+Pj4gKyAgICAgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50OjpjcmVhdGVfZXJy b3IgKCk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gbGl0X2V4cHIgPSBw YXJzZXIucGFyc2VfbGl0ZXJhbF9leHByICgpOw0KPj4+PiArICBhdXRvIGNvbW1hX3NraXBw ZWQgPSBwYXJzZXIubWF5YmVfc2tpcF90b2tlbiAoQ09NTUEpOw0KPj4+PiArDQo+Pj4+ICsg IHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OkxpdGVyYWxFeHByPiBlcnJvcl9leHByID0gbnVsbHB0 cjsNCj4+Pj4gKw0KPj4+PiArICBpZiAocGFyc2VyLnBlZWtfY3VycmVudF90b2tlbiAoKS0+ Z2V0X2lkICgpICE9IGxhc3RfdG9rZW5faWQpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAg aWYgKCFjb21tYV9za2lwcGVkKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIHJ1 c3RfZXJyb3JfYXQgKHBhcnNlci5wZWVrX2N1cnJlbnRfdG9rZW4gKCktPmdldF9sb2N1cyAo KSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0b2tlbjogJTws JT4iKTsNCj4+Pj4gKyAgICAgICAgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50OjpjcmVhdGVf ZXJyb3IgKCk7DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArICAgICAgaWYgKHBhcnNlci5wZWVr X2N1cnJlbnRfdG9rZW4gKCktPmdldF9pZCAoKSAhPSBTVFJJTkdfTElURVJBTCkNCj4+Pj4g KyAgICAgICB7DQo+Pj4+ICsgICAgICAgICBydXN0X2Vycm9yX2F0IChwYXJzZXIucGVla19j dXJyZW50X3Rva2VuICgpLT5nZXRfbG9jdXMgKCksDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBsaXRlcmFsIik7DQo+Pj4+ICsg ICAgICAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0KPj4+ PiArICAgICAgIH0NCj4+Pj4gKw0KPj4+PiArICAgICAgZXJyb3JfZXhwciA9IHBhcnNlci5w YXJzZV9saXRlcmFsX2V4cHIgKCk7DQo+Pj4+ICsgICAgICBwYXJzZXIubWF5YmVfc2tpcF90 b2tlbiAoQ09NTUEpOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBpZiAocGFyc2Vy LnBlZWtfY3VycmVudF90b2tlbiAoKS0+Z2V0X2lkICgpICE9IGxhc3RfdG9rZW5faWQpDQo+ Pj4+ICsgICAgew0KPj4+PiArICAgICAgcnVzdF9lcnJvcl9hdCAoaW52b2NfbG9jdXMsICJl bnYhIHRha2VzIDEgb3IgMiBhcmd1bWVudHMiKTsNCj4+Pj4gKyAgICAgIHJldHVybiBBU1Q6 OkFTVEZyYWdtZW50OjpjcmVhdGVfZXJyb3IgKCk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+ Pj4+ICsgIHBhcnNlci5za2lwX3Rva2VuIChsYXN0X3Rva2VuX2lkKTsNCj4+Pj4gKw0KPj4+ PiArICBhdXRvIGVudl92YWx1ZSA9IGdldGVudiAobGl0X2V4cHItPmFzX3N0cmluZyAoKS5j X3N0ciAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGVudl92YWx1ZSA9PSBudWxscHRyKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGlmIChlcnJvcl9leHByID09IG51bGxwdHIpDQo+ Pj4+ICsgICAgICAgcnVzdF9lcnJvcl9hdCAoaW52b2NfbG9jdXMsICJlbnZpcm9ubWVudCB2 YXJpYWJsZSAlcXMgbm90IGRlZmluZWQiLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAg IGxpdF9leHByLT5hc19zdHJpbmcgKCkuY19zdHIgKCkpOw0KPj4+PiArICAgICAgZWxzZQ0K Pj4+PiArICAgICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jX2xvY3VzLCAiJXMiLCBlcnJvcl9l eHByLT5hc19zdHJpbmcgKCkuY19zdHIgKCkpOw0KPj4+PiArICAgICAgcmV0dXJuIEFTVDo6 QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+ Pj4gKyAgYXV0byBub2RlID0gQVNUOjpTaW5nbGVBU1ROb2RlIChtYWtlX3N0cmluZyAoaW52 b2NfbG9jdXMsIGVudl92YWx1ZSkpOw0KPj4+PiArICByZXR1cm4gQVNUOjpBU1RGcmFnbWVu dCAoe25vZGV9KTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArQVNUOjpBU1RGcmFnbWVudA0K Pj4+PiArTWFjcm9CdWlsdGluOjpjZmcgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1h Y3JvSW52b2NEYXRhICZpbnZvYykNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gb25seSBwYXJzZSBp ZiBub3QgYWxyZWFkeSBwYXJzZWQNCj4+Pj4gKyAgaWYgKCFpbnZvYy5pc19wYXJzZWQgKCkp DQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgc3RkOjp1bmlxdWVfcHRyPEFTVDo6QXR0cklu cHV0TWV0YUl0ZW1Db250YWluZXI+IGNvbnZlcnRlZF9pbnB1dCAoDQo+Pj4+ICsgICAgICAg aW52b2MuZ2V0X2RlbGltX3Rva190cmVlICgpLnBhcnNlX3RvX21ldGFfaXRlbSAoKSk7DQo+ Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChjb252ZXJ0ZWRfaW5wdXQgPT0gbnVsbHB0cikNCj4+ Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAgICAgICBydXN0X2RlYnVnICgiREVCVUc6IGZhaWxl ZCB0byBwYXJzZSBtYWNybyB0byBtZXRhIGl0ZW0iKTsNCj4+Pj4gKyAgICAgICAgIC8vIFRP RE86IGRvIHNvbWV0aGluZyBub3c/IGlzIHRoaXMgYW4gYWN0dWFsIGVycm9yPw0KPj4+PiAr ICAgICAgIH0NCj4+Pj4gKyAgICAgIGVsc2UNCj4+Pj4gKyAgICAgICB7DQo+Pj4+ICsgICAg ICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpNZXRhSXRlbUlubmVyPj4g bWV0YV9pdGVtcyAoDQo+Pj4+ICsgICAgICAgICAgIHN0ZDo6bW92ZSAoY29udmVydGVkX2lu cHV0LT5nZXRfaXRlbXMgKCkpKTsNCj4+Pj4gKyAgICAgICAgIGludm9jLnNldF9tZXRhX2l0 ZW1fb3V0cHV0IChzdGQ6Om1vdmUgKG1ldGFfaXRlbXMpKTsNCj4+Pj4gKyAgICAgICB9DQo+ Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8qIFRPRE86IGFzc3VtaW5nIHRoYXQgY2Zn ISBtYWNyb3MgY2FuIG9ubHkgaGF2ZSBvbmUgbWV0YSBpdGVtIGlubmVyLCBsaWtlIGNmZw0K Pj4+PiArICAgKiBhdHRyaWJ1dGVzICovDQo+Pj4+ICsgIGlmIChpbnZvYy5nZXRfbWV0YV9p dGVtcyAoKS5zaXplICgpICE9IDEpDQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6QVNURnJhZ21l bnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+Pj4gKw0KPj4+PiArICBib29sIHJlc3VsdCA9IGlu dm9jLmdldF9tZXRhX2l0ZW1zICgpWzBdLT5jaGVja19jZmdfcHJlZGljYXRlICgNCj4+Pj4g KyAgICBTZXNzaW9uOjpnZXRfaW5zdGFuY2UgKCkpOw0KPj4+PiArICBhdXRvIGxpdGVyYWxf ZXhwID0gQVNUOjpTaW5nbGVBU1ROb2RlIChzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpFeHByPiAo DQo+Pj4+ICsgICAgbmV3IEFTVDo6TGl0ZXJhbEV4cHIgKHJlc3VsdCA/ICJ0cnVlIiA6ICJm YWxzZSIsIEFTVDo6TGl0ZXJhbDo6Qk9PTCwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICBQcmltaXRpdmVDb3JlVHlwZTo6Q09SRVRZUEVfQk9PTCwge30sIGludm9jX2xvY3Vz KSkpOw0KPj4+PiArDQo+Pj4+ICsgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50ICh7bGl0ZXJh bF9leHB9KTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArLyogRXhwYW5kIGJ1aWx0aW4gbWFj cm8gaW5jbHVkZSEoKSwgd2hpY2ggaW5jbHVkZXMgYSBzb3VyY2UgZmlsZSBhdCB0aGUgY3Vy cmVudA0KPj4+PiArIHNjb3BlIGNvbXBpbGUgdGltZS4gKi8NCj4+Pj4gKw0KPj4+PiArQVNU OjpBU1RGcmFnbWVudA0KPj4+PiArTWFjcm9CdWlsdGluOjppbmNsdWRlIChMb2NhdGlvbiBp bnZvY19sb2N1cywgQVNUOjpNYWNyb0ludm9jRGF0YSAmaW52b2MpDQo+Pj4+ICt7DQo+Pj4+ ICsgIC8qIEdldCB0YXJnZXQgZmlsZW5hbWUgZnJvbSB0aGUgbWFjcm8gaW52b2NhdGlvbiwg d2hpY2ggaXMgdHJlYXRlZCBhcyBhIHBhdGgNCj4+Pj4gKyAgICAgcmVsYXRpdmUgdG8gdGhl IGluY2x1ZGUhLWluZyBmaWxlIChjdXJyZW50bHkgYmVpbmcgY29tcGlsZWQpLiAgKi8NCj4+ Pj4gKyAgYXV0byBsaXRfZXhwcg0KPj4+PiArICAgID0gcGFyc2Vfc2luZ2xlX3N0cmluZ19s aXRlcmFsIChpbnZvYy5nZXRfZGVsaW1fdG9rX3RyZWUgKCksIGludm9jX2xvY3VzKTsNCj4+ Pj4gKyAgaWYgKGxpdF9leHByID09IG51bGxwdHIpDQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6 QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+Pj4gKw0KPj4+PiArICBzdGQ6OnN0 cmluZyBmaWxlbmFtZQ0KPj4+PiArICAgID0gc291cmNlX3JlbGF0aXZlX3BhdGggKGxpdF9l eHByLT5hc19zdHJpbmcgKCksIGludm9jX2xvY3VzKTsNCj4+Pj4gKyAgYXV0byB0YXJnZXRf ZmlsZW5hbWUNCj4+Pj4gKyAgICA9IFJ1c3Q6OlNlc3Npb246OmdldF9pbnN0YW5jZSAoKS5p bmNsdWRlX2V4dHJhX2ZpbGUgKHN0ZDo6bW92ZSAoZmlsZW5hbWUpKTsNCj4+Pj4gKw0KPj4+ PiArICBSQUlJRmlsZSB0YXJnZXRfZmlsZSAodGFyZ2V0X2ZpbGVuYW1lKTsNCj4+Pj4gKyAg TGluZW1hcCAqbGluZW1hcCA9IFNlc3Npb246OmdldF9pbnN0YW5jZSAoKS5saW5lbWFwOw0K Pj4+PiArDQo+Pj4+ICsgIGlmICghdGFyZ2V0X2ZpbGUub2sgKCkpDQo+Pj4+ICsgICAgew0K Pj4+PiArICAgICAgcnVzdF9lcnJvcl9hdCAobGl0X2V4cHItPmdldF9sb2N1cyAoKSwNCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBvcGVuIGluY2x1ZGVkIGZpbGUgJXFz OiAlbSIsIHRhcmdldF9maWxlbmFtZSk7DQo+Pj4+ICsgICAgICByZXR1cm4gQVNUOjpBU1RG cmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiAr ICBydXN0X2RlYnVnICgiQXR0ZW1wdGluZyB0byBwYXJzZSBpbmNsdWRlZCBmaWxlICVzIiwg dGFyZ2V0X2ZpbGVuYW1lKTsNCj4+Pj4gKw0KPj4+PiArICBMZXhlciBsZXggKHRhcmdldF9m aWxlbmFtZSwgc3RkOjptb3ZlICh0YXJnZXRfZmlsZSksIGxpbmVtYXApOw0KPj4+PiArICBQ YXJzZXI8TGV4ZXI+IHBhcnNlciAobGV4KTsNCj4+Pj4gKw0KPj4+PiArICBhdXRvIHBhcnNl ZF9pdGVtcyA9IHBhcnNlci5wYXJzZV9pdGVtcyAoKTsNCj4+Pj4gKyAgYm9vbCBoYXNfZXJy b3IgPSAhcGFyc2VyLmdldF9lcnJvcnMgKCkuZW1wdHkgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAg Zm9yIChjb25zdCBhdXRvICZlcnJvciA6IHBhcnNlci5nZXRfZXJyb3JzICgpKQ0KPj4+PiAr ICAgIGVycm9yLmVtaXRfZXJyb3IgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKGhhc19lcnJv cikNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICAvLyBpbmZvcm0gdGhlIHVzZXIgdGhhdCB0 aGUgZXJyb3JzIGFib3ZlIGFyZSBmcm9tIGEgaW5jbHVkZWQgZmlsZQ0KPj4+PiArICAgICAg cnVzdF9pbmZvcm0gKGludm9jX2xvY3VzLCAiaW5jbHVkZWQgZnJvbSBoZXJlIik7DQo+Pj4+ ICsgICAgICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudDo6Y3JlYXRlX2Vycm9yICgpOw0KPj4+ PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBzdGQ6OnZlY3RvcjxBU1Q6OlNpbmdsZUFTVE5v ZGU+IG5vZGVze307DQo+Pj4+ICsgIGZvciAoYXV0byAmaXRlbSA6IHBhcnNlZF9pdGVtcykN Cj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBBU1Q6OlNpbmdsZUFTVE5vZGUgbm9kZSAoc3Rk Ojptb3ZlIChpdGVtKSk7DQo+Pj4+ICsgICAgICBub2Rlcy5wdXNoX2JhY2sgKG5vZGUpOw0K Pj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudCAo bm9kZXMpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ ICtNYWNyb0J1aWx0aW46OmxpbmUgKExvY2F0aW9uIGludm9jX2xvY3VzLCBBU1Q6Ok1hY3Jv SW52b2NEYXRhICZpbnZvYykNCj4+Pj4gK3sNCj4+Pj4gKyAgYXV0byBjdXJyZW50X2xpbmUN Cj4+Pj4gKyAgICA9IFNlc3Npb246OmdldF9pbnN0YW5jZSAoKS5saW5lbWFwLT5sb2NhdGlv bl90b19saW5lIChpbnZvY19sb2N1cyk7DQo+Pj4+ICsNCj4+Pj4gKyAgYXV0byBsaW5lX25v ID0gQVNUOjpTaW5nbGVBU1ROb2RlIChzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpFeHByPiAoDQo+ Pj4+ICsgICAgbmV3IEFTVDo6TGl0ZXJhbEV4cHIgKHN0ZDo6dG9fc3RyaW5nIChjdXJyZW50 X2xpbmUpLCBBU1Q6OkxpdGVyYWw6OklOVCwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICBQcmltaXRpdmVDb3JlVHlwZTo6Q09SRVRZUEVfVTMyLCB7fSwgaW52b2NfbG9jdXMp KSk7DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQgKHtsaW5lX25v fSk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+Pj4g ZGlmZiAtLWdpdCBhL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1aWx0aW5zLmggYi9n Y2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1idWlsdGlucy5oDQo+Pj4+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0DQo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwLi45MWYzNzI3ZDQ1MA0KPj4+PiAt LS0gL2Rldi9udWxsDQo+Pj4+ICsrKyBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWJ1 aWx0aW5zLmgNCj4+Pj4gQEAgLTAsMCArMSwxMDcgQEANCj4+Pj4gKy8vIENvcHlyaWdodCAo QykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4+PiArDQo+ Pj4+ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+Pj4+ICsNCj4+Pj4gKy8vIEdD QyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5IGl0IHVuZGVyDQo+Pj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4+PiArLy8gU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXINCj4+Pj4gKy8vIHZlcnNpb24uDQo+Pj4+ICsNCj4+Pj4gKy8vIEdDQyBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lU SE9VVCBBTlkNCj4+Pj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+Pj4+ICsvLyBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UNCj4+Pj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+Pj4+ICsNCj4+Pj4gKy8vIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlDQo+Pj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcz LiAgSWYgbm90IHNlZQ0KPj4+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ Lg0KPj4+PiArDQo+Pj4+ICsjaWZuZGVmIFJVU1RfTUFDUk9fQlVJTFRJTlNfSA0KPj4+PiAr I2RlZmluZSBSVVNUX01BQ1JPX0JVSUxUSU5TX0gNCj4+Pj4gKw0KPj4+PiArI2luY2x1ZGUg InJ1c3QtYXN0LmgiDQo+Pj4+ICsjaW5jbHVkZSAicnVzdC1sb2NhdGlvbi5oIg0KPj4+PiAr DQo+Pj4+ICsvKioNCj4+Pj4gKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBsaXN0IG9mIGJ1 aWx0aW4gbWFjcm9zIGltcGxlbWVudGVkIGJ5IHRoZSBjb21waWxlci4NCj4+Pj4gKyAqIFRo ZSBmdW5jdGlvbnMgZGVmaW5lZCBhcmUgY2FsbGVkICJidWlsdGluIHRyYW5zY3JpYmVycyIg aW4gdGhhdCB0aGV5IHJlcGxhY2UNCj4+Pj4gKyAqIHRoZSB0cmFuc2NyaWJpbmcgcGFydCBv ZiBhIG1hY3JvIGRlZmluaXRpb24uDQo+Pj4+ICsgKg0KPj4+PiArICogTGlrZSByZWd1bGFy IG1hY3JvIHRyYW5zY3JpYmVycywgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5n IGFuZA0KPj4+PiArICogcmV0dXJuaW5nIGFuIEFTVCBmcmFnbWVudDogYmFzaWNhbGx5IGEg dmVjdG9yIG9mIEFTVCBub2RlcyBwdXQgdG9nZXRoZXIuDQo+Pj4+ICsgKg0KPj4+PiArICog VW5saWtlIHJlZ3VsYXIgZGVjbGFyYXRpdmUgbWFjcm9zIHdoZXJlIGVhY2ggbWF0Y2ggYXJt IGhhcyBpdHMgb3duIGFzc29jaWF0ZWQNCj4+Pj4gKyAqIHRyYW5zY3JpYmVyLCBidWlsdGlu IHRyYW5zY3JpYmVycyBhcmUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGFsbCBtYXRjaCBh cm1zDQo+Pj4+ICsgKiBvZiB0aGUgbWFjcm8uIFRoaXMgbWVhbnMgdGhhdCB5b3Ugc2hvdWxk IHRha2UgZXh0cmEgY2FyZSB3aGVuIGltcGxlbWVudGluZyBhDQo+Pj4+ICsgKiBidWlsdGlu IGNvbnRhaW5pbmcgbXVsdGlwbGUgbWF0Y2ggYXJtczogWW91IHdpbGwgcHJvYmFibHkgbmVl ZCB0byBkbyBzb21lDQo+Pj4+ICsgKiBsb29rYWhlYWQgaW4gb3JkZXIgdG8gZGV0ZXJtaW5l IHdoaWNoIG1hdGNoIGFybSB0aGUgdXNlciBpbnRlbmRlZCB0byB1c2UuDQo+Pj4+ICsgKg0K Pj4+PiArICogQW4gZXhhbXBsZSBvZiB0aGlzIGlzIHRoZSBgYXNzZXJ0ISgpYCBtYWNybzoN Cj4+Pj4gKyAqDQo+Pj4+ICsgKiBgYGANCj4+Pj4gKyAqICBtYWNyb19ydWxlcyEgYXNzZXJ0 IHsNCj4+Pj4gKyAqICAgICAoJGNvbmQ6ZXhwciAkKCwpPykgPT4ge3sgLi4uIH19Ow0KPj4+ PiArICogICAgICgkY29uZCA6IGV4cHIsICQgKCRhcmcgOiB0dCkgKykgPSA+IHt7IC4uLiB9 fTsNCj4+Pj4gKyAqIH0NCj4+Pj4gKyAqIGBgYA0KPj4+PiArICoNCj4+Pj4gKyAqIElmIG1v cmUgdG9rZW5zIGV4aXN0IGJleW9uZCB0aGUgb3B0aW9uYWwgY29tbWEsIHRoZXkgbmVlZCB0 byBiZSBoYW5kbGVkIGFzDQo+Pj4+ICsgKiBhIHRva2VuLXRyZWUgZm9yIGEgY3VzdG9tIHBh bmljIG1lc3NhZ2UuDQo+Pj4+ICsgKg0KPj4+PiArICogVGhlc2UgYnVpbHRpbiBtYWNyb3Mg d2l0aCBlbXB0eSB0cmFuc2NyaWJlcnMgYXJlIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkDQo+ Pj4+ICsgKiBsaWJyYXJ5LiBUaGV5IGFyZSBtYXJrZWQgd2l0aCBhIHNwZWNpYWwgYXR0cmli dXRlLCBgI1tydXN0Y19idWlsdGluX21hY3JvXWAuDQo+Pj4+ICsgKiBXaGVuIHRoaXMgYXR0 cmlidXRlIGlzIHByZXNlbnQgb24gYSBtYWNybyBkZWZpbml0aW9uLCB0aGUgY29tcGlsZXIg c2hvdWxkDQo+Pj4+ICsgKiBsb29rIGZvciBhbiBhc3NvY2lhdGVkIHRyYW5zY3JpYmVyIGlu IHRoZSBtYXBwaW5ncy4gTWVhbmluZyB0aGF0IHlvdSBtdXN0DQo+Pj4+ICsgKiByZW1lbWJl ciB0byBpbnNlcnQgeW91ciB0cmFuc2NyaWJlciBpbiB0aGUgYGJ1aWx0aW5fbWFjcm9zYCBt YXAgb2YgdGhlDQo+Pj4+ICsgKmBNYXBwaW5nc2AuDQo+Pj4+ICsgKg0KPj4+PiArICogVGhp cyBtYXAgaXMgYnVpbHQgYXMgYSBzdGF0aWMgdmFyaWFibGUgaW4gdGhlIGBpbnNlcnRfbWFj cm9fZGVmKClgIG1ldGhvZA0KPj4+PiArICogb2YgdGhlIGBNYXBwaW5nc2AgY2xhc3MuDQo+ Pj4+ICsgKi8NCj4+Pj4gKw0KPj4+PiArLyogSWYgYXNzZXJ0IGlzIGRlZmluZWQgYXMgYSBt YWNybyB0aGlzIGZpbGUgd2lsbCBub3QgcGFyc2UsIHNvIHVuZGVmaW5lIHRoaXMNCj4+Pj4g KyAgIGJlZm9yZSBjb250aW51aW5nLiAgKi8NCj4+Pj4gKyNpZmRlZiBhc3NlcnQNCj4+Pj4g KyN1bmRlZiBhc3NlcnQNCj4+Pj4gKyNlbmRpZg0KPj4+PiArDQo+Pj4+ICtuYW1lc3BhY2Ug UnVzdCB7DQo+Pj4+ICtjbGFzcyBNYWNyb0J1aWx0aW4NCj4+Pj4gK3sNCj4+Pj4gK3B1Ymxp YzoNCj4+Pj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21lbnQgYXNzZXJ0IChMb2NhdGlvbiBp bnZvY19sb2N1cywNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFT VDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsNCj4+Pj4gKw0KPj4+PiArICBzdGF0aWMgQVNU OjpBU1RGcmFnbWVudCBmaWxlIChMb2NhdGlvbiBpbnZvY19sb2N1cywNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYyk7 DQo+Pj4+ICsNCj4+Pj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21lbnQgY29sdW1uIChMb2Nh dGlvbiBpbnZvY19sb2N1cywNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9jKTsNCj4+Pj4gKw0KPj4+PiArICBzdGF0 aWMgQVNUOjpBU1RGcmFnbWVudCBpbmNsdWRlX2J5dGVzIChMb2NhdGlvbiBpbnZvY19sb2N1 cywNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6 Ok1hY3JvSW52b2NEYXRhICZpbnZvYyk7DQo+Pj4+ICsNCj4+Pj4gKyAgc3RhdGljIEFTVDo6 QVNURnJhZ21lbnQgaW5jbHVkZV9zdHIgKExvY2F0aW9uIGludm9jX2xvY3VzLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvSW52b2NE YXRhICZpbnZvYyk7DQo+Pj4+ICsNCj4+Pj4gKyAgc3RhdGljIEFTVDo6QVNURnJhZ21lbnQg Y29tcGlsZV9lcnJvciAoTG9jYXRpb24gaW52b2NfbG9jdXMsDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpNYWNyb0ludm9jRGF0YSAmaW52 b2MpOw0KPj4+PiArDQo+Pj4+ICsgIHN0YXRpYyBBU1Q6OkFTVEZyYWdtZW50IGNvbmNhdCAo TG9jYXRpb24gaW52b2NfbG9jdXMsDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYyk7DQo+Pj4+ICsNCj4+Pj4gKyAg c3RhdGljIEFTVDo6QVNURnJhZ21lbnQgZW52IChMb2NhdGlvbiBpbnZvY19sb2N1cywNCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEg Jmludm9jKTsNCj4+Pj4gKw0KPj4+PiArICBzdGF0aWMgQVNUOjpBU1RGcmFnbWVudCBjZmcg KExvY2F0aW9uIGludm9jX2xvY3VzLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQVNUOjpNYWNyb0ludm9jRGF0YSAmaW52b2MpOw0KPj4+PiArDQo+Pj4+ICsgIHN0 YXRpYyBBU1Q6OkFTVEZyYWdtZW50IGluY2x1ZGUgKExvY2F0aW9uIGludm9jX2xvY3VzLA0K Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9JbnZv Y0RhdGEgJmludm9jKTsNCj4+Pj4gKw0KPj4+PiArICBzdGF0aWMgQVNUOjpBU1RGcmFnbWVu dCBsaW5lIChMb2NhdGlvbiBpbnZvY19sb2N1cywNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYyk7DQo+Pj4+ICt9Ow0K Pj4+PiArfSAvLyBuYW1lc3BhY2UgUnVzdA0KPj4+PiArDQo+Pj4+ICsjZW5kaWYgLy8gUlVT VF9NQUNST19CVUlMVElOU19IDQo+Pj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9leHBhbmQv cnVzdC1tYWNyby1leHBhbmQuY2MgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1leHBh bmQuY2MNCj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+Pj4gaW5kZXggMDAwMDAwMDAw MDAuLjFkNTdlMzk0MjIwDQo+Pj4+IC0tLSAvZGV2L251bGwNCj4+Pj4gKysrIGIvZ2NjL3J1 c3QvZXhwYW5kL3J1c3QtbWFjcm8tZXhwYW5kLmNjDQo+Pj4+IEBAIC0wLDAgKzEsMTAxMiBA QA0KPj4+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuDQo+Pj4+ICsNCj4+Pj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdD Qy4NCj4+Pj4gKw0KPj4+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+Pj4gKy8vIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo ZSBGcmVlDQo+Pj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAz LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4+PiArLy8gdmVyc2lvbi4NCj4+ Pj4gKw0KPj4+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4+PiArLy8gV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IN Cj4+Pj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4N Cj4+Pj4gKw0KPj4+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+Pj4gKy8vIGFsb25nIHdpdGggR0ND OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+Pj4+ICsvLyA8aHR0cDov L3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+Pj4+ICsNCj4+Pj4gKyNpbmNsdWRlICJydXN0 LW1hY3JvLWV4cGFuZC5oIg0KPj4+PiArI2luY2x1ZGUgInJ1c3QtbWFjcm8tc3Vic3RpdHV0 ZS1jdHguaCINCj4+Pj4gKyNpbmNsdWRlICJydXN0LWFzdC1mdWxsLmgiDQo+Pj4+ICsjaW5j bHVkZSAicnVzdC1hc3QtdmlzaXRvci5oIg0KPj4+PiArI2luY2x1ZGUgInJ1c3QtZGlhZ25v c3RpY3MuaCINCj4+Pj4gKyNpbmNsdWRlICJydXN0LXBhcnNlLmgiDQo+Pj4+ICsjaW5jbHVk ZSAicnVzdC1hdHRyaWJ1dGUtdmlzaXRvci5oIg0KPj4+PiArDQo+Pj4+ICtuYW1lc3BhY2Ug UnVzdCB7DQo+Pj4+ICtBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICtNYWNyb0V4cGFuZGVyOjpl eHBhbmRfZGVjbF9tYWNybyAoTG9jYXRpb24gaW52b2NfbG9jdXMsDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvSW52b2NEYXRhICZpbnZvYywN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9SdWxl c0RlZmluaXRpb24gJnJ1bGVzX2RlZiwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJvb2wgc2VtaWNvbG9uKQ0KPj4+PiArew0KPj4+PiArICAvLyBlbnN1cmUg dGhhdCBib3RoIGludm9jYXRpb24gYW5kIHJ1bGVzIGFyZSBpbiBhIHZhbGlkIHN0YXRlDQo+ Pj4+ICsgIHJ1c3RfYXNzZXJ0ICghaW52b2MuaXNfbWFya2VkX2Zvcl9zdHJpcCAoKSk7DQo+ Pj4+ICsgIHJ1c3RfYXNzZXJ0ICghcnVsZXNfZGVmLmlzX21hcmtlZF9mb3Jfc3RyaXAgKCkp Ow0KPj4+PiArICBydXN0X2Fzc2VydCAocnVsZXNfZGVmLmdldF9tYWNyb19ydWxlcyAoKS5z aXplICgpID4gMCk7DQo+Pj4+ICsNCj4+Pj4gKyAgLyogcHJvYmFibHkgc29tZXRoaW5nIGhl cmUgYWJvdXQgcGFyc2luZyBpbnZvYyBhbmQgcnVsZXMgZGVmIHRva2VuIHRyZWVzIHRvDQo+ Pj4+ICsgICAqIHRva2VuIHN0cmVhbS4gaWYgbm90LCBob3cgd291bGQgcGFyc2VyIGhhbmRs ZSB0aGUgY2FwdHVyZXMgb2YgZXhwcnMgYW5kDQo+Pj4+ICsgICAqIHN0dWZmPyBvbiB0aGUg b3RoZXIgaGFuZCwgdG9rZW4gdHJlZXMgbWF5IGJlIGtpbmQgb2YgdXNlZnVsIGluIHJ1bGVz IGRlZiBhcw0KPj4+PiArICAgKiBjcmVhdGluZyBhIHBvaW50IHdoZXJlIHJlY3Vyc2lvbiBj YW4gb2NjdXIgKGxpa2UgaGF2aW5nDQo+Pj4+ICsgICAqICJjb21wYXJlX21hY3JvX21hdGNo IiBhbmQgdGhlbiBpdCBjYWxsaW5nIGl0c2VsZiB3aGVuIGl0IGZpbmRzIGRlbGltaXRlcnMp DQo+Pj4+ICsgICAqLw0KPj4+PiArDQo+Pj4+ICsgIC8qIGZpbmQgbWF0Y2hpbmcgcnVsZSB0 byBpbnZvYyB0b2tlbiB0cmVlLCBiYXNlZCBvbiBtYWNybyBydWxlJ3MgbWF0Y2hlci4gaWYN Cj4+Pj4gKyAgICogbm9uZSBleGlzdCwgZXJyb3IuDQo+Pj4+ICsgICAqIC0gc3BlY2lmaWNh bGx5LCBjaGVjayBlYWNoIG1hdGNoZXIgaW4gb3JkZXIuIGlmIG9uZSBmYWlscyB0byBtYXRj aCwgbW92ZQ0KPj4+PiArICAgKiBvbnRvIG5leHQuICovDQo+Pj4+ICsgIC8qIFRPRE86IGRv ZXMgZG9pbmcgdGhpcyByZXF1aXJlIHBhcnNpbmcgZXhwcmVzc2lvbnMgYW5kIHdoYXRldmVy IGluIHRoZQ0KPj4+PiArICAgKiBpbnZvYz8gaWYgc28sIG1pZ2h0IGFzIHdlbGwgc2F2ZSB0 aGUgcmVzdWx0cyBpZiByZWZlcmVuY2VkIHVzaW5nICQgb3INCj4+Pj4gKyAgICogd2hhdGV2 ZXIuIElmIG5vdCwgZG8gYW5vdGhlciBwYXNzIHNhdmluZyB0aGVtLiBFeGNlcHQgdGhpcyBp cyBwcm9iYWJseQ0KPj4+PiArICAgKiB1c2VsZXNzIGFzIGRpZmZlcmVudCBydWxlcyBjb3Vs ZCBoYXZlIGRpZmZlcmVudCBzdGFydGluZyBwb2ludHMgZm9yIGV4cHJzDQo+Pj4+ICsgICAq IG9yIHdoYXRldmVyLiBEZWNpc2lvbiB0cmVlcyBjb3VsZCBhdm9pZCB0aGlzLCBidXQgdGhl eSBoYXZlIHRoZWlyIG93bg0KPj4+PiArICAgKiBpc3N1ZXMuICovDQo+Pj4+ICsgIC8qIFRP RE86IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhlIHBhcnNlciBzbyB0aGF0IGl0IGNhbiBlc3Nl bnRpYWxseSAiY2F0Y2giDQo+Pj4+ICsgICAqIGVycm9ycyAtIG1heWJlICJ0cnlfcGFyc2Vf ZXhwciIgb3Igd2hhdGV2ZXIgbWV0aG9kcy4gKi8NCj4+Pj4gKyAgLy8gdGhpcyB0ZWNobmlj YWxseSBjcmVhdGVzIGEgYmFjay10cmFja2luZyBwYXJzZXIgLSB0aGlzIHdpbGwgYmUgdGhl DQo+Pj4+ICsgIC8vIGltcGxlbWVudGF0aW9uIHN0eWxlDQo+Pj4+ICsNCj4+Pj4gKyAgLyog dGhlbiwgYWZ0ZXIgcmVzdWx0cyBhcmUgc2F2ZWQsIGdlbmVyYXRlIHRoZSBtYWNybyBvdXRw dXQgZnJvbSB0aGUNCj4+Pj4gKyAgICogdHJhbnNjcmliZXIgdG9rZW4gdHJlZS4gaWYgaSB1 bmRlcnN0YW5kIHRoaXMgY29ycmVjdGx5LCB0aGUgbWFjcm8NCj4+Pj4gKyAgICogaW52b2Nh dGlvbiBnZXRzIHJlcGxhY2VkIGJ5IHRoZSB0cmFuc2NyaWJlciB0b2tlbnMsIGV4Y2VwdCB3 aXRoDQo+Pj4+ICsgICAqIHN1YnN0aXR1dGlvbnMgbWFkZSAoZS5nLiBmb3IgJGkgdmFyaWFi bGVzKSAqLw0KPj4+PiArDQo+Pj4+ICsgIC8qIFRPRE86IGl0IGlzIHByb2JhYmx5IGJldHRl ciB0byBtb2RpZnkgQVNUOjpUb2tlbiB0byBzdG9yZSBhIHBvaW50ZXIgdG8gYQ0KPj4+PiAr ICAgKiBMZXhlcjo6VG9rZW4gKHJhdGhlciB0aGFuIGJlaW5nIGNvbnZlcnRlZCkgLSBpLmUu IG5vdCBzbyBtdWNoIGhhdmUNCj4+Pj4gKyAgICogQVNUOjpUb2tlbiBhcyBhIFRva2VuIGJ1 dCByYXRoZXIgYSBUb2tlbkNvbnRhaW5lciAoYXMgaXQgaXMgYW5vdGhlciB0eXBlIG9mDQo+ Pj4+ICsgICAqIFRva2VuVHJlZSkuIFRoaXMgd2lsbCBwcmV2ZW50IHJlLWNvbnZlcnNpb24g b2YgVG9rZW5zIGJldHdlZW4gZWFjaCB0eXBlDQo+Pj4+ICsgICAqIGFsbCB0aGUgdGltZSwg d2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGhldGVyb2dlbm91cyBzdG9yYWdlIG9mIHRva2Vu IHRyZWVzLg0KPj4+PiArICAgKi8NCj4+Pj4gKw0KPj4+PiArICBBU1Q6OkRlbGltVG9rZW5U cmVlICZpbnZvY190b2tlbl90cmVlID0gaW52b2MuZ2V0X2RlbGltX3Rva190cmVlICgpOw0K Pj4+PiArDQo+Pj4+ICsgIC8vIGZpbmQgbWF0Y2hpbmcgYXJtDQo+Pj4+ICsgIEFTVDo6TWFj cm9SdWxlICptYXRjaGVkX3J1bGUgPSBudWxscHRyOw0KPj4+PiArICBzdGQ6Om1hcDxzdGQ6 OnN0cmluZywgTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVyPiBtYXRjaGVkX2ZyYWdtZW50czsN Cj4+Pj4gKyAgZm9yIChhdXRvICZydWxlIDogcnVsZXNfZGVmLmdldF9ydWxlcyAoKSkNCj4+ Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBzdWJfc3RhY2sucHVzaCAoKTsNCj4+Pj4gKyAgICAg IGJvb2wgZGlkX21hdGNoX3J1bGUgPSB0cnlfbWF0Y2hfcnVsZSAocnVsZSwgaW52b2NfdG9r ZW5fdHJlZSk7DQo+Pj4+ICsgICAgICBtYXRjaGVkX2ZyYWdtZW50cyA9IHN1Yl9zdGFjay5w b3AgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGlmIChkaWRfbWF0Y2hfcnVsZSkNCj4+Pj4g KyAgICAgICB7DQo+Pj4+ICsgICAgICAgICAvLyAgLy8gRGVidWdnaW5nDQo+Pj4+ICsgICAg ICAgICAvLyAgZm9yIChhdXRvICZrdiA6IG1hdGNoZWRfZnJhZ21lbnRzKQ0KPj4+PiArICAg ICAgICAgLy8gICAgcnVzdF9kZWJ1ZyAoIltmcmFnbWVudF06ICVzICglbGQgLSAlcykiLCBr di5maXJzdC5jX3N0ciAoKSwNCj4+Pj4gKyAgICAgICAgIC8vICAgICAgICAgICAga3Yuc2Vj b25kLmdldF9mcmFnbWVudHMgKCkuc2l6ZSAoKSwNCj4+Pj4gKyAgICAgICAgIC8vICAgICAg ICAgICAga3Yuc2Vjb25kLmdldF9raW5kICgpDQo+Pj4+ICsgICAgICAgICAvLyAgICAgICAg ICAgICAgICA9PSBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI6OktpbmQ6OlJlcGV0aXRpb24N Cj4+Pj4gKyAgICAgICAgIC8vICAgICAgICAgICAgICA/ICJyZXBldGl0aW9uIg0KPj4+PiAr ICAgICAgICAgLy8gICAgICAgICAgICAgIDogIm1ldGF2YXIiKTsNCj4+Pj4gKw0KPj4+PiAr ICAgICAgICAgbWF0Y2hlZF9ydWxlID0gJnJ1bGU7DQo+Pj4+ICsgICAgICAgICBicmVhazsN Cj4+Pj4gKyAgICAgICB9DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIGlmIChtYXRj aGVkX3J1bGUgPT0gbnVsbHB0cikNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBSaWNoTG9j YXRpb24gciAoaW52b2NfbG9jdXMpOw0KPj4+PiArICAgICAgci5hZGRfcmFuZ2UgKHJ1bGVz X2RlZi5nZXRfbG9jdXMgKCkpOw0KPj4+PiArICAgICAgcnVzdF9lcnJvcl9hdCAociwgIkZh aWxlZCB0byBtYXRjaCBhbnkgcnVsZSB3aXRoaW4gbWFjcm8iKTsNCj4+Pj4gKyAgICAgIHJl dHVybiBBU1Q6OkFTVEZyYWdtZW50OjpjcmVhdGVfZXJyb3IgKCk7DQo+Pj4+ICsgICAgfQ0K Pj4+PiArDQo+Pj4+ICsgIHJldHVybiB0cmFuc2NyaWJlX3J1bGUgKCptYXRjaGVkX3J1bGUs IGludm9jX3Rva2VuX3RyZWUsIG1hdGNoZWRfZnJhZ21lbnRzLA0KPj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbWljb2xvbiwgcGVla19jb250ZXh0ICgpKTsNCj4+Pj4gK30N Cj4+Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArTWFjcm9FeHBhbmRlcjo6ZXhwYW5kX2ludm9j IChBU1Q6Ok1hY3JvSW52b2NhdGlvbiAmaW52b2MsIGJvb2wgaGFzX3NlbWljb2xvbikNCj4+ Pj4gK3sNCj4+Pj4gKyAgaWYgKGRlcHRoX2V4Y2VlZHNfcmVjdXJzaW9uX2xpbWl0ICgpKQ0K Pj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGludm9jLmdldF9sb2N1 cyAoKSwgInJlYWNoZWQgcmVjdXJzaW9uIGxpbWl0Iik7DQo+Pj4+ICsgICAgICByZXR1cm47 DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmlu dm9jX2RhdGEgPSBpbnZvYy5nZXRfaW52b2NfZGF0YSAoKTsNCj4+Pj4gKw0KPj4+PiArICAv LyA/Pw0KPj4+PiArICAvLyBzd2l0Y2ggb24gdHlwZSBvZiBtYWNybzoNCj4+Pj4gKyAgLy8g IC0gJyEnIHN5bnRheCBtYWNybyAoaW5uZXIgc3dpdGNoKQ0KPj4+PiArICAvLyAgICAgIC0g cHJvY2VkdXJhbCBtYWNybyAtICJBIHRva2VuLWJhc2VkIGZ1bmN0aW9uLWxpa2UgbWFjcm8i DQo+Pj4+ICsgIC8vICAgICAgLSAnbWFjcm9fcnVsZXMnIChieSBleGFtcGxlL3BhdHRlcm4t bWF0Y2gpIG1hY3JvPyBvciBub3Q/ICJhbg0KPj4+PiArICAvLyBBU1QtYmFzZWQgZnVuY3Rp b24tbGlrZSBtYWNybyINCj4+Pj4gKyAgLy8gICAgICAtIGVsc2UgaXMgdW5yZWFjaGFibGUN Cj4+Pj4gKyAgLy8gIC0gYXR0cmlidXRlIHN5bnRheCBtYWNybyAoaW5uZXIgc3dpdGNoKQ0K Pj4+PiArICAvLyAgLSBwcm9jZWR1cmFsIG1hY3JvIGF0dHJpYnV0ZSBzeW50YXggLSAiQSB0 b2tlbi1iYXNlZCBhdHRyaWJ1dGUNCj4+Pj4gKyAgLy8gbWFjcm8iDQo+Pj4+ICsgIC8vICAg ICAgLSBsZWdhY3kgbWFjcm8gYXR0cmlidXRlIHN5bnRheD8gLSAiYW4gQVNULWJhc2VkIGF0 dHJpYnV0ZSBtYWNybyINCj4+Pj4gKyAgLy8gICAgICAtIG5vbi1tYWNybyBhdHRyaWJ1dGU6 IG1hcmsga25vd24NCj4+Pj4gKyAgLy8gICAgICAtIGVsc2UgaXMgdW5yZWFjaGFibGUNCj4+ Pj4gKyAgLy8gIC0gZGVyaXZlIG1hY3JvIChpbm5lciBzd2l0Y2gpDQo+Pj4+ICsgIC8vICAg ICAgLSBkZXJpdmUgb3IgbGVnYWN5IGRlcml2ZSAtICJ0b2tlbi1iYXNlZCIgdnMgIkFTVC1i YXNlZCINCj4+Pj4gKyAgLy8gICAgICAtIGVsc2UgaXMgdW5yZWFjaGFibGUNCj4+Pj4gKyAg Ly8gIC0gZGVyaXZlIGNvbnRhaW5lciBtYWNybyAtIHVucmVhY2hhYmxlDQo+Pj4+ICsNCj4+ Pj4gKyAgLy8gbG9va3VwIHRoZSBydWxlcyBmb3IgdGhpcyBtYWNybw0KPj4+PiArICBOb2Rl SWQgcmVzb2x2ZWRfbm9kZSA9IFVOS05PV05fTk9ERUlEOw0KPj4+PiArICBOb2RlSWQgc291 cmNlX25vZGUgPSBVTktOT1dOX05PREVJRDsNCj4+Pj4gKyAgaWYgKGhhc19zZW1pY29sb24p DQo+Pj4+ICsgICAgc291cmNlX25vZGUgPSBpbnZvYy5nZXRfbWFjcm9fbm9kZV9pZCAoKTsN Cj4+Pj4gKyAgZWxzZQ0KPj4+PiArICAgIHNvdXJjZV9ub2RlID0gaW52b2MuZ2V0X3BhdHRl cm5fbm9kZV9pZCAoKTsNCj4+Pj4gKyAgYXV0byBzZWcNCj4+Pj4gKyAgICA9IFJlc29sdmVy OjpDYW5vbmljYWxQYXRoOjpuZXdfc2VnIChzb3VyY2Vfbm9kZSwNCj4+Pj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jX2RhdGEuZ2V0X3BhdGggKCku YXNfc3RyaW5nICgpKTsNCj4+Pj4gKw0KPj4+PiArICBib29sIGZvdW5kID0gcmVzb2x2ZXIt PmdldF9tYWNyb19zY29wZSAoKS5sb29rdXAgKHNlZywgJnJlc29sdmVkX25vZGUpOw0KPj4+ PiArICBpZiAoIWZvdW5kKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIHJ1c3RfZXJyb3Jf YXQgKGludm9jLmdldF9sb2N1cyAoKSwgInVua25vd24gbWFjcm86IFslc10iLA0KPj4+PiAr ICAgICAgICAgICAgICAgICAgICBzZWcuZ2V0ICgpLmNfc3RyICgpKTsNCj4+Pj4gKyAgICAg IHJldHVybjsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gbG9va3VwIHRoZSBy dWxlcw0KPj4+PiArICBBU1Q6Ok1hY3JvUnVsZXNEZWZpbml0aW9uICpydWxlc19kZWYgPSBu dWxscHRyOw0KPj4+PiArICBib29sIG9rID0gbWFwcGluZ3MtPmxvb2t1cF9tYWNyb19kZWYg KHJlc29sdmVkX25vZGUsICZydWxlc19kZWYpOw0KPj4+PiArICBydXN0X2Fzc2VydCAob2sp Ow0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gZnJhZ21lbnQgPSBBU1Q6OkFTVEZyYWdtZW50Ojpj cmVhdGVfZXJyb3IgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgaWYgKHJ1bGVzX2RlZi0+aXNfYnVp bHRpbiAoKSkNCj4+Pj4gKyAgICBmcmFnbWVudA0KPj4+PiArICAgICAgPSBydWxlc19kZWYt PmdldF9idWlsdGluX3RyYW5zY3JpYmVyICgpIChpbnZvYy5nZXRfbG9jdXMgKCksIGludm9j X2RhdGEpOw0KPj4+PiArICBlbHNlDQo+Pj4+ICsgICAgZnJhZ21lbnQgPSBleHBhbmRfZGVj bF9tYWNybyAoaW52b2MuZ2V0X2xvY3VzICgpLCBpbnZvY19kYXRhLCAqcnVsZXNfZGVmLA0K Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX3NlbWljb2xvbik7 DQo+Pj4+ICsNCj4+Pj4gKyAgc2V0X2V4cGFuZGVkX2ZyYWdtZW50IChzdGQ6Om1vdmUgKGZy YWdtZW50KSk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gKy8qIERldGVybWluZXMgd2hldGhl ciBhbnkgY2ZnIHByZWRpY2F0ZSBpcyBmYWxzZSBhbmQgaGVuY2UgaXRlbSB3aXRoIGF0dHJp YnV0ZXMNCj4+Pj4gKyAqIHNob3VsZCBiZSBzdHJpcHBlZC4gTm90ZSB0aGF0IGF0dHJpYnV0 ZXMgbXVzdCBiZSBleHBhbmRlZCBiZWZvcmUgY2FsbGluZy4gKi8NCj4+Pj4gK2Jvb2wNCj4+ Pj4gK01hY3JvRXhwYW5kZXI6OmZhaWxzX2NmZyAoY29uc3QgQVNUOjpBdHRyVmVjICZhdHRy cykgY29uc3QNCj4+Pj4gK3sNCj4+Pj4gKyAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogYXR0 cnMpDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgaWYgKGF0dHIuZ2V0X3BhdGggKCkgPT0g ImNmZyIgJiYgIWF0dHIuY2hlY2tfY2ZnX3ByZWRpY2F0ZSAoc2Vzc2lvbikpDQo+Pj4+ICsg ICAgICAgcmV0dXJuIHRydWU7DQo+Pj4+ICsgICAgfQ0KPj4+PiArICByZXR1cm4gZmFsc2U7 DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gKy8qIERldGVybWluZXMgd2hldGhlciBhbnkgY2Zn IHByZWRpY2F0ZSBpcyBmYWxzZSBhbmQgaGVuY2UgaXRlbSB3aXRoIGF0dHJpYnV0ZXMNCj4+ Pj4gKyAqIHNob3VsZCBiZSBzdHJpcHBlZC4gV2lsbCBleHBhbmQgYXR0cmlidXRlcyBhcyB3 ZWxsLiAqLw0KPj4+PiArYm9vbA0KPj4+PiArTWFjcm9FeHBhbmRlcjo6ZmFpbHNfY2ZnX3dp dGhfZXhwYW5kIChBU1Q6OkF0dHJWZWMgJmF0dHJzKSBjb25zdA0KPj4+PiArew0KPj4+PiAr ICAvLyBUT0RPOiBtYXliZSBoYXZlIHNvbWV0aGluZyB0aGF0IHN0cmlwcyBjZmcgYXR0cmli dXRlcyB0aGF0IGV2YWx1YXRlIHRydWU/DQo+Pj4+ICsgIGZvciAoYXV0byAmYXR0ciA6IGF0 dHJzKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGlmIChhdHRyLmdldF9wYXRoICgpID09 ICJjZmciKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIGlmICghYXR0ci5pc19w YXJzZWRfdG9fbWV0YV9pdGVtICgpKQ0KPj4+PiArICAgICAgICAgICBhdHRyLnBhcnNlX2F0 dHJfdG9fbWV0YV9pdGVtICgpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAgICAvLyBERUJVRw0K Pj4+PiArICAgICAgICAgaWYgKCFhdHRyLmlzX3BhcnNlZF90b19tZXRhX2l0ZW0gKCkpDQo+ Pj4+ICsgICAgICAgICAgIHJ1c3RfZGVidWcgKCJmYWlsZWQgdG8gcGFyc2UgYXR0ciB0byBt ZXRhIGl0ZW0sIHJpZ2h0IGJlZm9yZSAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICJjZmcgcHJlZGljYXRlIGNoZWNrIik7DQo+Pj4+ICsgICAgICAgICBlbHNlDQo+Pj4+ICsg ICAgICAgICAgIHJ1c3RfZGVidWcgKCJhdHRyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwYXJz ZWQgdG8gbWV0YSBpdGVtLCAiDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICJyaWdo dCBiZWZvcmUgY2ZnIHByZWRpY2F0ZSBjaGVjayIpOw0KPj4+PiArDQo+Pj4+ICsgICAgICAg ICBpZiAoIWF0dHIuY2hlY2tfY2ZnX3ByZWRpY2F0ZSAoc2Vzc2lvbikpDQo+Pj4+ICsgICAg ICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAgICAvLyBERUJVRw0KPj4+PiArICAgICAgICAg ICAgIHJ1c3RfZGVidWcgKA0KPj4+PiArICAgICAgICAgICAgICAgImNmZyBwcmVkaWNhdGUg ZmFpbGVkIGZvciBhdHRyaWJ1dGU6IFwwMzNbMDszMW0nJXMnXDAzM1swbSIsDQo+Pj4+ICsg ICAgICAgICAgICAgICBhdHRyLmFzX3N0cmluZyAoKS5jX3N0ciAoKSk7DQo+Pj4+ICsNCj4+ Pj4gKyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCj4+Pj4gKyAgICAgICAgICAgfQ0KPj4+ PiArICAgICAgICAgZWxzZQ0KPj4+PiArICAgICAgICAgICB7DQo+Pj4+ICsgICAgICAgICAg ICAgLy8gREVCVUcNCj4+Pj4gKyAgICAgICAgICAgICBydXN0X2RlYnVnICgiY2ZnIHByZWRp Y2F0ZSBzdWNjZWVkZWQgZm9yIGF0dHJpYnV0ZTogIg0KPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICJcMDMzWzA7MzFtJyVzJ1wwMzNbMG0iLA0KPj4+PiArICAgICAgICAgICAg ICAgICAgICAgICAgIGF0dHIuYXNfc3RyaW5nICgpLmNfc3RyICgpKTsNCj4+Pj4gKyAgICAg ICAgICAgfQ0KPj4+PiArICAgICAgIH0NCj4+Pj4gKyAgICB9DQo+Pj4+ICsgIHJldHVybiBm YWxzZTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArLy8gRXhwYW5kcyBjZmdfYXR0ciBhdHRy aWJ1dGVzLg0KPj4+PiArdm9pZA0KPj4+PiArTWFjcm9FeHBhbmRlcjo6ZXhwYW5kX2NmZ19h dHRycyAoQVNUOjpBdHRyVmVjICZhdHRycykNCj4+Pj4gK3sNCj4+Pj4gKyAgZm9yIChzdGQ6 OnNpemVfdCBpID0gMDsgaSA8IGF0dHJzLnNpemUgKCk7IGkrKykNCj4+Pj4gKyAgICB7DQo+ Pj4+ICsgICAgICBhdXRvICZhdHRyID0gYXR0cnNbaV07DQo+Pj4+ICsgICAgICBpZiAoYXR0 ci5nZXRfcGF0aCAoKSA9PSAiY2ZnX2F0dHIiKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAg ICAgICAgIGlmICghYXR0ci5pc19wYXJzZWRfdG9fbWV0YV9pdGVtICgpKQ0KPj4+PiArICAg ICAgICAgICBhdHRyLnBhcnNlX2F0dHJfdG9fbWV0YV9pdGVtICgpOw0KPj4+PiArDQo+Pj4+ ICsgICAgICAgICBpZiAoYXR0ci5jaGVja19jZmdfcHJlZGljYXRlIChzZXNzaW9uKSkNCj4+ Pj4gKyAgICAgICAgICAgew0KPj4+PiArICAgICAgICAgICAgIC8vIHNwbGl0IG9mZiBjZmdf YXR0cg0KPj4+PiArICAgICAgICAgICAgIEFTVDo6QXR0clZlYyBuZXdfYXR0cnMgPSBhdHRy LnNlcGFyYXRlX2NmZ19hdHRycyAoKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgICAgICAgIC8v IHJlbW92ZSBhdHRyIGZyb20gdmVjdG9yDQo+Pj4+ICsgICAgICAgICAgICAgYXR0cnMuZXJh c2UgKGF0dHJzLmJlZ2luICgpICsgaSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAgICAgICAv LyBhZGQgbmV3IGF0dHJzIHRvIHZlY3Rvcg0KPj4+PiArICAgICAgICAgICAgIGF0dHJzLmlu c2VydCAoYXR0cnMuYmVnaW4gKCkgKyBpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IgKG5ld19hdHRycy5iZWdpbiAoKSksDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRv ciAobmV3X2F0dHJzLmVuZCAoKSkpOw0KPj4+PiArICAgICAgICAgICB9DQo+Pj4+ICsNCj4+ Pj4gKyAgICAgICAgIC8qIGRvIHNvbWV0aGluZyAtIGlmIGZlYXR1cmUgKGZpcnN0IHRva2Vu IGluIHRyZWUpIGlzIGluIGZhY3QgZW5hYmxlZCwNCj4+Pj4gKyAgICAgICAgICAqIG1ha2Ug dG9rZW5zIGxpc3RlZCBhZnRlcndhcmRzIGludG8gYXR0cmlidXRlcy4gaS5lLjogZm9yDQo+ Pj4+ICsgICAgICAgICAgKiBbY2ZnX2F0dHIoZmVhdHVyZSA9ICJ3b3ciLCB3b3cxLCB3b3cy KV0sIGlmICJ3b3ciIGlzIHRydWUsIHRoZW4gYWRkDQo+Pj4+ICsgICAgICAgICAgKiBhdHRy aWJ1dGVzIFt3b3cxXSBhbmQgW3dvdzJdIHRvIGF0dHJpYnV0ZSBsaXN0LiBUaGlzIGNhbiBh bHNvIGJlDQo+Pj4+ICsgICAgICAgICAgKiByZWN1cnNpdmUsIHNvIGNoZWNrIGZvciBleHBh bmRlZCBhdHRyaWJ1dGVzIGJlaW5nIHJlY3Vyc2l2ZSBhbmQNCj4+Pj4gKyAgICAgICAgICAq IHBvc3NpYmx5IHJlY3Vyc2l2ZWx5IGNhbGwgdGhlIGV4cGFuZF9hdHRycz8gKi8NCj4+Pj4g KyAgICAgICB9DQo+Pj4+ICsgICAgICBlbHNlDQo+Pj4+ICsgICAgICAgew0KPj4+PiArICAg ICAgICAgaSsrOw0KPj4+PiArICAgICAgIH0NCj4+Pj4gKyAgICB9DQo+Pj4+ICsgIGF0dHJz LnNocmlua190b19maXQgKCk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3ZvaWQNCj4+Pj4g K01hY3JvRXhwYW5kZXI6OmV4cGFuZF9jcmF0ZSAoKQ0KPj4+PiArew0KPj4+PiArICBOb2Rl SWQgc2NvcGVfbm9kZV9pZCA9IGNyYXRlLmdldF9ub2RlX2lkICgpOw0KPj4+PiArICByZXNv bHZlci0+Z2V0X21hY3JvX3Njb3BlICgpLnB1c2ggKHNjb3BlX25vZGVfaWQpOw0KPj4+PiAr DQo+Pj4+ICsgIC8qIGZpbGwgbWFjcm8vZGVjb3JhdG9yIG1hcCBmcm9tIGluaXQgbGlzdD8g bm90IHN1cmUgd2hlcmUgaW5pdCBsaXN0IGNvbWVzDQo+Pj4+ICsgICAqIGZyb20/ICovDQo+ Pj4+ICsNCj4+Pj4gKyAgLy8gVE9ETzogZG9lcyBjZmcgYXBwbHkgZm9yIGlubmVyIGF0dHJp YnV0ZXM/IHJlc2VhcmNoLg0KPj4+PiArICAvLyB0aGUgYXBwYXJlbnQgYW5zd2VyIChmcm9t IHBsYXlncm91bmQgdGVzdCkgaXMgeWVzDQo+Pj4+ICsNCj4+Pj4gKyAgLy8gZXhwYW5kIGNy YXRlIGNmZ19hdHRyIGF0dHJpYnV0ZXMNCj4+Pj4gKyAgZXhwYW5kX2NmZ19hdHRycyAoY3Jh dGUuaW5uZXJfYXR0cnMpOw0KPj4+PiArDQo+Pj4+ICsgIGlmIChmYWlsc19jZmdfd2l0aF9l eHBhbmQgKGNyYXRlLmlubmVyX2F0dHJzKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICAv LyBiYXNpY2FsbHksIGRlbGV0ZSB3aG9sZSBjcmF0ZQ0KPj4+PiArICAgICAgY3JhdGUuc3Ry aXBfY3JhdGUgKCk7DQo+Pj4+ICsgICAgICAvLyBUT0RPOiBtYXliZSBjcmVhdGUgd2Fybmlu ZyBoZXJlPyBwcm9iYWJseSBub3QgZGVzaXJlZCBiZWhhdmlvdXINCj4+Pj4gKyAgICB9DQo+ Pj4+ICsgIC8vIGV4cGFuZCBtb2R1bGUgYXR0cmlidXRlcz8NCj4+Pj4gKw0KPj4+PiArICBw dXNoX2NvbnRleHQgKElURU0pOw0KPj4+PiArDQo+Pj4+ICsgIC8vIGV4cGFuZCBhdHRyaWJ1 dGVzIHJlY3Vyc2l2ZWx5IGFuZCBzdHJpcCBpdGVtcyBpZiByZXF1aXJlZA0KPj4+PiArICBB dHRyVmlzaXRvciBhdHRyX3Zpc2l0b3IgKCp0aGlzKTsNCj4+Pj4gKyAgYXV0byAmaXRlbXMg PSBjcmF0ZS5pdGVtczsNCj4+Pj4gKyAgZm9yIChhdXRvIGl0ID0gaXRlbXMuYmVnaW4gKCk7 IGl0ICE9IGl0ZW1zLmVuZCAoKTspDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgYXV0byAm aXRlbSA9ICppdDsNCj4+Pj4gKw0KPj4+PiArICAgICAgLy8gbWFyayBmb3Igc3RyaXBwaW5n IGlmIHJlcXVpcmVkDQo+Pj4+ICsgICAgICBpdGVtLT5hY2NlcHRfdmlzIChhdHRyX3Zpc2l0 b3IpOw0KPj4+PiArDQo+Pj4+ICsgICAgICBhdXRvIGZyYWdtZW50ID0gdGFrZV9leHBhbmRl ZF9mcmFnbWVudCAoYXR0cl92aXNpdG9yKTsNCj4+Pj4gKyAgICAgIGlmIChmcmFnbWVudC5z aG91bGRfZXhwYW5kICgpKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIC8vIFJl bW92ZSB0aGUgY3VycmVudCBleHBhbmRlZCBpbnZvY2F0aW9uDQo+Pj4+ICsgICAgICAgICBp dCA9IGl0ZW1zLmVyYXNlIChpdCk7DQo+Pj4+ICsgICAgICAgICBmb3IgKGF1dG8gJm5vZGUg OiBmcmFnbWVudC5nZXRfbm9kZXMgKCkpDQo+Pj4+ICsgICAgICAgICAgIHsNCj4+Pj4gKyAg ICAgICAgICAgICBpdCA9IGl0ZW1zLmluc2VydCAoaXQsIG5vZGUudGFrZV9pdGVtICgpKTsN Cj4+Pj4gKyAgICAgICAgICAgICBpdCsrOw0KPj4+PiArICAgICAgICAgICB9DQo+Pj4+ICsg ICAgICAgfQ0KPj4+PiArICAgICAgZWxzZSBpZiAoaXRlbS0+aXNfbWFya2VkX2Zvcl9zdHJp cCAoKSkNCj4+Pj4gKyAgICAgICBpdCA9IGl0ZW1zLmVyYXNlIChpdCk7DQo+Pj4+ICsgICAg ICBlbHNlDQo+Pj4+ICsgICAgICAgaXQrKzsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4g KyAgcG9wX2NvbnRleHQgKCk7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gVE9ETzogc2hvdWxkIHJl Y3Vyc2l2ZSBhdHRyaWJ1dGUgYW5kIG1hY3JvIGV4cGFuc2lvbiBiZSBkb25lIGluIHRoZSBz YW1lDQo+Pj4+ICsgIC8vIHRyYW5zdmVyc2FsPyBPciBpbiBzZXBhcmF0ZSBvbmVzIGxpa2Ug Y3VycmVudGx5Pw0KPj4+PiArDQo+Pj4+ICsgIC8vIGV4cGFuZCBtb2R1bGUgdHJlZSByZWN1 cnNpdmVseQ0KPj4+PiArDQo+Pj4+ICsgIC8vIHBvc3QtcHJvY2Vzcw0KPj4+PiArDQo+Pj4+ ICsgIC8vIGV4dHJhY3QgZXhwb3J0ZWQgbWFjcm9zPw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ ICtib29sDQo+Pj4+ICtNYWNyb0V4cGFuZGVyOjpkZXB0aF9leGNlZWRzX3JlY3Vyc2lvbl9s aW1pdCAoKSBjb25zdA0KPj4+PiArew0KPj4+PiArICByZXR1cm4gZXhwYW5zaW9uX2RlcHRo ID49IGNmZy5yZWN1cnNpb25fbGltaXQ7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK2Jvb2wN Cj4+Pj4gK01hY3JvRXhwYW5kZXI6OnRyeV9tYXRjaF9ydWxlIChBU1Q6Ok1hY3JvUnVsZSAm bWF0Y2hfcnVsZSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6 RGVsaW1Ub2tlblRyZWUgJmludm9jX3Rva2VuX3RyZWUpDQo+Pj4+ICt7DQo+Pj4+ICsgIE1h Y3JvSW52b2NMZXhlciBsZXggKGludm9jX3Rva2VuX3RyZWUudG9fdG9rZW5fc3RyZWFtICgp KTsNCj4+Pj4gKyAgUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gcGFyc2VyIChsZXgpOw0KPj4+ PiArDQo+Pj4+ICsgIEFTVDo6TWFjcm9NYXRjaGVyICZtYXRjaGVyID0gbWF0Y2hfcnVsZS5n ZXRfbWF0Y2hlciAoKTsNCj4+Pj4gKw0KPj4+PiArICBleHBhbnNpb25fZGVwdGgrKzsNCj4+ Pj4gKyAgaWYgKCFtYXRjaF9tYXRjaGVyIChwYXJzZXIsIG1hdGNoZXIpKQ0KPj4+PiArICAg IHsNCj4+Pj4gKyAgICAgIGV4cGFuc2lvbl9kZXB0aC0tOw0KPj4+PiArICAgICAgcmV0dXJu IGZhbHNlOw0KPj4+PiArICAgIH0NCj4+Pj4gKyAgZXhwYW5zaW9uX2RlcHRoLS07DQo+Pj4+ ICsNCj4+Pj4gKyAgYm9vbCB1c2VkX2FsbF9pbnB1dF90b2tlbnMgPSBwYXJzZXIuc2tpcF90 b2tlbiAoRU5EX09GX0ZJTEUpOw0KPj4+PiArICByZXR1cm4gdXNlZF9hbGxfaW5wdXRfdG9r ZW5zOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtib29sDQo+Pj4+ICtNYWNyb0V4cGFuZGVy OjptYXRjaF9mcmFnbWVudCAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwNCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9NYXRjaEZyYWdt ZW50ICZmcmFnbWVudCkNCj4+Pj4gK3sNCj4+Pj4gKyAgc3dpdGNoIChmcmFnbWVudC5nZXRf ZnJhZ19zcGVjICgpLmdldF9raW5kICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICBjYXNl IEFTVDo6TWFjcm9GcmFnU3BlYzo6RVhQUjoNCj4+Pj4gKyAgICAgIHBhcnNlci5wYXJzZV9l eHByICgpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsNCj4+Pj4gKyAgICBjYXNlIEFT VDo6TWFjcm9GcmFnU3BlYzo6QkxPQ0s6DQo+Pj4+ICsgICAgICBwYXJzZXIucGFyc2VfYmxv Y2tfZXhwciAoKTsNCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgY2Fz ZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OklERU5UOg0KPj4+PiArICAgICAgcGFyc2VyLnBhcnNl X2lkZW50aWZpZXJfcGF0dGVybiAoKTsNCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArDQo+ Pj4+ICsgICAgY2FzZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OkxJVEVSQUw6DQo+Pj4+ICsgICAg ICBwYXJzZXIucGFyc2VfbGl0ZXJhbF9leHByICgpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+ Pj4+ICsNCj4+Pj4gKyAgICBjYXNlIEFTVDo6TWFjcm9GcmFnU3BlYzo6SVRFTToNCj4+Pj4g KyAgICAgIHBhcnNlci5wYXJzZV9pdGVtIChmYWxzZSk7DQo+Pj4+ICsgICAgICBicmVhazsN Cj4+Pj4gKw0KPj4+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpUWToNCj4+Pj4g KyAgICAgIHBhcnNlci5wYXJzZV90eXBlICgpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ ICsNCj4+Pj4gKyAgICBjYXNlIEFTVDo6TWFjcm9GcmFnU3BlYzo6UEFUOg0KPj4+PiArICAg ICAgcGFyc2VyLnBhcnNlX3BhdHRlcm4gKCk7DQo+Pj4+ICsgICAgICBicmVhazsNCj4+Pj4g Kw0KPj4+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpQQVRIOg0KPj4+PiArICAg ICAgcGFyc2VyLnBhcnNlX3BhdGhfaW5fZXhwcmVzc2lvbiAoKTsNCj4+Pj4gKyAgICAgIGJy ZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgY2FzZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OlZJUzoN Cj4+Pj4gKyAgICAgIHBhcnNlci5wYXJzZV92aXNpYmlsaXR5ICgpOw0KPj4+PiArICAgICAg YnJlYWs7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpT VE1UOiB7DQo+Pj4+ICsgICAgICAgYXV0byByZXN0cmljdGlvbnMgPSBQYXJzZVJlc3RyaWN0 aW9ucyAoKTsNCj4+Pj4gKyAgICAgICByZXN0cmljdGlvbnMuY29uc3VtZV9zZW1pID0gZmFs c2U7DQo+Pj4+ICsgICAgICAgcGFyc2VyLnBhcnNlX3N0bXQgKHJlc3RyaWN0aW9ucyk7DQo+ Pj4+ICsgICAgICAgYnJlYWs7DQo+Pj4+ICsgICAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgICBj YXNlIEFTVDo6TWFjcm9GcmFnU3BlYzo6TElGRVRJTUU6DQo+Pj4+ICsgICAgICBwYXJzZXIu cGFyc2VfbGlmZXRpbWVfcGFyYW1zICgpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsN Cj4+Pj4gKyAgICAgIC8vIGlzIG1ldGEgYXR0cmlidXRlcz8NCj4+Pj4gKyAgICBjYXNlIEFT VDo6TWFjcm9GcmFnU3BlYzo6TUVUQToNCj4+Pj4gKyAgICAgIHBhcnNlci5wYXJzZV9hdHRy aWJ1dGVfYm9keSAoKTsNCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAg Y2FzZSBBU1Q6Ok1hY3JvRnJhZ1NwZWM6OlRUOg0KPj4+PiArICAgICAgcGFyc2VyLnBhcnNl X3Rva2VuX3RyZWUgKCk7DQo+Pj4+ICsgICAgICBicmVhazsNCj4+Pj4gKw0KPj4+PiArICAg ICAgLy8gaSBndWVzcyB3ZSBqdXN0IGlnbm9yZSBpbnZhbGlkIGFuZCBqdXN0IGVycm9yIG91 dA0KPj4+PiArICAgIGNhc2UgQVNUOjpNYWNyb0ZyYWdTcGVjOjpJTlZBTElEOg0KPj4+PiAr ICAgICAgcmV0dXJuIGZhbHNlOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvLyBp dCBtYXRjaGVzIGlmIHRoZSBwYXJzZXIgZGlkIG5vdCBwcm9kdWNlIGVycm9ycyB0cnlpbmcg dG8gcGFyc2UgdGhhdCB0eXBlDQo+Pj4+ICsgIC8vIG9mIGl0ZW0NCj4+Pj4gKyAgcmV0dXJu ICFwYXJzZXIuaGFzX2Vycm9ycyAoKTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArYm9vbA0K Pj4+PiArTWFjcm9FeHBhbmRlcjo6bWF0Y2hfbWF0Y2hlciAoUGFyc2VyPE1hY3JvSW52b2NM ZXhlcj4gJnBhcnNlciwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNU OjpNYWNyb01hdGNoZXIgJm1hdGNoZXIpDQo+Pj4+ICt7DQo+Pj4+ICsgIGlmIChkZXB0aF9l eGNlZWRzX3JlY3Vyc2lvbl9saW1pdCAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBy dXN0X2Vycm9yX2F0IChtYXRjaGVyLmdldF9tYXRjaF9sb2N1cyAoKSwgInJlYWNoZWQgcmVj dXJzaW9uIGxpbWl0Iik7DQo+Pj4+ICsgICAgICByZXR1cm4gZmFsc2U7DQo+Pj4+ICsgICAg fQ0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gZGVsaW1pdGVyID0gcGFyc2VyLnBlZWtfY3VycmVu dF90b2tlbiAoKTsNCj4+Pj4gKw0KPj4+PiArICAvLyB0aGlzIGlzIHVzZWQgc28gd2UgY2Fu IGNoZWNrIHRoYXQgd2UgZGVsaW1pdCB0aGUgc3RyZWFtIGNvcnJlY3RseS4NCj4+Pj4gKyAg c3dpdGNoIChkZWxpbWl0ZXItPmdldF9pZCAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAg ICBjYXNlIExFRlRfUEFSRU46IHsNCj4+Pj4gKyAgICAgICBpZiAoIXBhcnNlci5za2lwX3Rv a2VuIChMRUZUX1BBUkVOKSkNCj4+Pj4gKyAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+Pj4g KyAgICAgIH0NCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgICBjYXNl IExFRlRfU1FVQVJFOiB7DQo+Pj4+ICsgICAgICAgaWYgKCFwYXJzZXIuc2tpcF90b2tlbiAo TEVGVF9TUVVBUkUpKQ0KPj4+PiArICAgICAgICAgcmV0dXJuIGZhbHNlOw0KPj4+PiArICAg ICAgfQ0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIGNhc2UgTEVG VF9DVVJMWTogew0KPj4+PiArICAgICAgIGlmICghcGFyc2VyLnNraXBfdG9rZW4gKExFRlRf Q1VSTFkpKQ0KPj4+PiArICAgICAgICAgcmV0dXJuIGZhbHNlOw0KPj4+PiArICAgICAgfQ0K Pj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsgICAgZGVmYXVsdDoNCj4+Pj4gKyAgICAgIGdj Y191bnJlYWNoYWJsZSAoKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgY29uc3Qg TWFjcm9JbnZvY0xleGVyICZzb3VyY2UgPSBwYXJzZXIuZ2V0X3Rva2VuX3NvdXJjZSAoKTsN Cj4+Pj4gKw0KPj4+PiArICBmb3IgKGF1dG8gJm1hdGNoIDogbWF0Y2hlci5nZXRfbWF0Y2hl cyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBzaXplX3Qgb2Zmc19iZWdpbiA9IHNv dXJjZS5nZXRfb2ZmcyAoKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgc3dpdGNoIChtYXRjaC0+ Z2V0X21hY3JvX21hdGNoX3R5cGUgKCkpDQo+Pj4+ICsgICAgICAgew0KPj4+PiArICAgICAg ICAgY2FzZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpGcmFnbWVudDogew0K Pj4+PiArICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hGcmFnbWVudCAqZnJhZ21lbnQNCj4+ Pj4gKyAgICAgICAgICAgICA9IHN0YXRpY19jYXN0PEFTVDo6TWFjcm9NYXRjaEZyYWdtZW50 ICo+IChtYXRjaC5nZXQgKCkpOw0KPj4+PiArICAgICAgICAgICBpZiAoIW1hdGNoX2ZyYWdt ZW50IChwYXJzZXIsICpmcmFnbWVudCkpDQo+Pj4+ICsgICAgICAgICAgICAgcmV0dXJuIGZh bHNlOw0KPj4+PiArDQo+Pj4+ICsgICAgICAgICAgIC8vIG1hdGNoZWQgZnJhZ21lbnQgZ2V0 IHRoZSBvZmZzZXQgaW4gdGhlIHRva2VuIHN0cmVhbQ0KPj4+PiArICAgICAgICAgICBzaXpl X3Qgb2Zmc19lbmQgPSBzb3VyY2UuZ2V0X29mZnMgKCk7DQo+Pj4+ICsgICAgICAgICAgIHN1 Yl9zdGFjay5pbnNlcnRfbWV0YXZhciAoDQo+Pj4+ICsgICAgICAgICAgICAgTWF0Y2hlZEZy YWdtZW50IChmcmFnbWVudC0+Z2V0X2lkZW50ICgpLCBvZmZzX2JlZ2luLCBvZmZzX2VuZCkp Ow0KPj4+PiArICAgICAgICAgfQ0KPj4+PiArICAgICAgICAgYnJlYWs7DQo+Pj4+ICsNCj4+ Pj4gKyAgICAgICAgIGNhc2UgQVNUOjpNYWNyb01hdGNoOjpNYWNyb01hdGNoVHlwZTo6VG9r OiB7DQo+Pj4+ICsgICAgICAgICAgIEFTVDo6VG9rZW4gKnRvayA9IHN0YXRpY19jYXN0PEFT VDo6VG9rZW4gKj4gKG1hdGNoLmdldCAoKSk7DQo+Pj4+ICsgICAgICAgICAgIGlmICghbWF0 Y2hfdG9rZW4gKHBhcnNlciwgKnRvaykpDQo+Pj4+ICsgICAgICAgICAgICAgcmV0dXJuIGZh bHNlOw0KPj4+PiArICAgICAgICAgfQ0KPj4+PiArICAgICAgICAgYnJlYWs7DQo+Pj4+ICsN Cj4+Pj4gKyAgICAgICAgIGNhc2UgQVNUOjpNYWNyb01hdGNoOjpNYWNyb01hdGNoVHlwZTo6 UmVwZXRpdGlvbjogew0KPj4+PiArICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hSZXBldGl0 aW9uICpyZXANCj4+Pj4gKyAgICAgICAgICAgICA9IHN0YXRpY19jYXN0PEFTVDo6TWFjcm9N YXRjaFJlcGV0aXRpb24gKj4gKG1hdGNoLmdldCAoKSk7DQo+Pj4+ICsgICAgICAgICAgIGlm ICghbWF0Y2hfcmVwZXRpdGlvbiAocGFyc2VyLCAqcmVwKSkNCj4+Pj4gKyAgICAgICAgICAg ICByZXR1cm4gZmFsc2U7DQo+Pj4+ICsgICAgICAgICB9DQo+Pj4+ICsgICAgICAgICBicmVh azsNCj4+Pj4gKw0KPj4+PiArICAgICAgICAgY2FzZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3Jv TWF0Y2hUeXBlOjpNYXRjaGVyOiB7DQo+Pj4+ICsgICAgICAgICAgIEFTVDo6TWFjcm9NYXRj aGVyICptDQo+Pj4+ICsgICAgICAgICAgICAgPSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0 Y2hlciAqPiAobWF0Y2guZ2V0ICgpKTsNCj4+Pj4gKyAgICAgICAgICAgZXhwYW5zaW9uX2Rl cHRoKys7DQo+Pj4+ICsgICAgICAgICAgIGlmICghbWF0Y2hfbWF0Y2hlciAocGFyc2VyLCAq bSkpDQo+Pj4+ICsgICAgICAgICAgICAgew0KPj4+PiArICAgICAgICAgICAgICAgZXhwYW5z aW9uX2RlcHRoLS07DQo+Pj4+ICsgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQo+Pj4+ ICsgICAgICAgICAgICAgfQ0KPj4+PiArICAgICAgICAgICBleHBhbnNpb25fZGVwdGgtLTsN Cj4+Pj4gKyAgICAgICAgIH0NCj4+Pj4gKyAgICAgICAgIGJyZWFrOw0KPj4+PiArICAgICAg IH0NCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgc3dpdGNoIChkZWxpbWl0ZXItPmdl dF9pZCAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBjYXNlIExFRlRfUEFSRU46IHsN Cj4+Pj4gKyAgICAgICBpZiAoIXBhcnNlci5za2lwX3Rva2VuIChSSUdIVF9QQVJFTikpDQo+ Pj4+ICsgICAgICAgICByZXR1cm4gZmFsc2U7DQo+Pj4+ICsgICAgICB9DQo+Pj4+ICsgICAg ICBicmVhazsNCj4+Pj4gKw0KPj4+PiArICAgICAgY2FzZSBMRUZUX1NRVUFSRTogew0KPj4+ PiArICAgICAgIGlmICghcGFyc2VyLnNraXBfdG9rZW4gKFJJR0hUX1NRVUFSRSkpDQo+Pj4+ ICsgICAgICAgICByZXR1cm4gZmFsc2U7DQo+Pj4+ICsgICAgICB9DQo+Pj4+ICsgICAgICBi cmVhazsNCj4+Pj4gKw0KPj4+PiArICAgICAgY2FzZSBMRUZUX0NVUkxZOiB7DQo+Pj4+ICsg ICAgICAgaWYgKCFwYXJzZXIuc2tpcF90b2tlbiAoUklHSFRfQ1VSTFkpKQ0KPj4+PiArICAg ICAgICAgcmV0dXJuIGZhbHNlOw0KPj4+PiArICAgICAgfQ0KPj4+PiArICAgICAgYnJlYWs7 DQo+Pj4+ICsgICAgZGVmYXVsdDoNCj4+Pj4gKyAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsN Cj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIHRydWU7DQo+Pj4+ICt9DQo+ Pj4+ICsNCj4+Pj4gK2Jvb2wNCj4+Pj4gK01hY3JvRXhwYW5kZXI6Om1hdGNoX3Rva2VuIChQ YXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLCBBU1Q6OlRva2VuICZ0b2tlbikNCj4+ Pj4gK3sNCj4+Pj4gKyAgLy8gRklYTUUgdGhpcyBuZWVkcyB0byBhY3R1YWxseSBtYXRjaCB0 aGUgY29udGVudCBhbmQgdGhlIHR5cGUNCj4+Pj4gKyAgcmV0dXJuIHBhcnNlci5za2lwX3Rv a2VuICh0b2tlbi5nZXRfaWQgKCkpOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtib29sDQo+ Pj4+ICtNYWNyb0V4cGFuZGVyOjptYXRjaF9uX21hdGNoZXMgKFBhcnNlcjxNYWNyb0ludm9j TGV4ZXI+ICZwYXJzZXIsDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg QVNUOjpNYWNyb01hdGNoUmVwZXRpdGlvbiAmcmVwLA0KPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNpemVfdCAmbWF0Y2hfYW1vdW50LCBzaXplX3QgbG9fYm91bmQs DQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhpX2JvdW5k KQ0KPj4+PiArew0KPj4+PiArICBtYXRjaF9hbW91bnQgPSAwOw0KPj4+PiArICBhdXRvICZt YXRjaGVzID0gcmVwLmdldF9tYXRjaGVzICgpOw0KPj4+PiArDQo+Pj4+ICsgIGNvbnN0IE1h Y3JvSW52b2NMZXhlciAmc291cmNlID0gcGFyc2VyLmdldF90b2tlbl9zb3VyY2UgKCk7DQo+ Pj4+ICsgIHdoaWxlICh0cnVlKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIC8vIElmIHRo ZSBjdXJyZW50IHRva2VuIGlzIGEgY2xvc2luZyBtYWNybyBkZWxpbWl0ZXIsIGJyZWFrIGF3 YXkuDQo+Pj4+ICsgICAgICAvLyBUT0RPOiBJcyB0aGlzIGNvcnJlY3Q/DQo+Pj4+ICsgICAg ICBhdXRvIHRfaWQgPSBwYXJzZXIucGVla19jdXJyZW50X3Rva2VuICgpLT5nZXRfaWQgKCk7 DQo+Pj4+ICsgICAgICBpZiAodF9pZCA9PSBSSUdIVF9QQVJFTiB8fCB0X2lkID09IFJJR0hU X1NRVUFSRSB8fCB0X2lkID09IFJJR0hUX0NVUkxZKQ0KPj4+PiArICAgICAgIGJyZWFrOw0K Pj4+PiArDQo+Pj4+ICsgICAgICAvLyBTa2lwIHBhcnNpbmcgYSBzZXBhcmF0b3Igb24gdGhl IGZpcnN0IG1hdGNoLCBvdGhlcndpc2UgY29uc3VtZSBpdC4NCj4+Pj4gKyAgICAgIC8vIElm IGl0IGlzbid0IHByZXNlbnQsIHRoaXMgaXMgYW4gZXJyb3INCj4+Pj4gKyAgICAgIGlmIChy ZXAuaGFzX3NlcCAoKSAmJiBtYXRjaF9hbW91bnQgPiAwKQ0KPj4+PiArICAgICAgIGlmICgh bWF0Y2hfdG9rZW4gKHBhcnNlciwgKnJlcC5nZXRfc2VwICgpKSkNCj4+Pj4gKyAgICAgICAg IGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgICBib29sIHZhbGlkX2N1cnJlbnRfbWF0Y2gg PSBmYWxzZTsNCj4+Pj4gKyAgICAgIGZvciAoYXV0byAmbWF0Y2ggOiBtYXRjaGVzKQ0KPj4+ PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIHNpemVfdCBvZmZzX2JlZ2luID0gc291cmNl LmdldF9vZmZzICgpOw0KPj4+PiArICAgICAgICAgc3dpdGNoIChtYXRjaC0+Z2V0X21hY3Jv X21hdGNoX3R5cGUgKCkpDQo+Pj4+ICsgICAgICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAg ICBjYXNlIEFTVDo6TWFjcm9NYXRjaDo6TWFjcm9NYXRjaFR5cGU6OkZyYWdtZW50OiB7DQo+ Pj4+ICsgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hGcmFnbWVudCAqZnJhZ21lbnQN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgPSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0Y2hG cmFnbWVudCAqPiAobWF0Y2guZ2V0ICgpKTsNCj4+Pj4gKyAgICAgICAgICAgICAgIHZhbGlk X2N1cnJlbnRfbWF0Y2ggPSBtYXRjaF9mcmFnbWVudCAocGFyc2VyLCAqZnJhZ21lbnQpOw0K Pj4+PiArDQo+Pj4+ICsgICAgICAgICAgICAgICAvLyBtYXRjaGVkIGZyYWdtZW50IGdldCB0 aGUgb2Zmc2V0IGluIHRoZSB0b2tlbiBzdHJlYW0NCj4+Pj4gKyAgICAgICAgICAgICAgIHNp emVfdCBvZmZzX2VuZCA9IHNvdXJjZS5nZXRfb2ZmcyAoKTsNCj4+Pj4gKw0KPj4+PiArICAg ICAgICAgICAgICAgLy8gVGhlIG1haW4gZGlmZmVyZW5jZSB3aXRoIG1hdGNoX21hdGNoZXIg aGFwcGVucyBoZXJlOiBJbnN0ZWFkDQo+Pj4+ICsgICAgICAgICAgICAgICAvLyBvZiBpbnNl cnRpbmcgYSBuZXcgZnJhZ21lbnQsIHdlIGFwcGVuZCB0byBvbmUuIElmIHRoYXQNCj4+Pj4g KyAgICAgICAgICAgICAgIC8vIGZyYWdtZW50IGRvZXMgbm90IGV4aXN0LCB0aGVuIHRoZSBv cGVyYXRpb24gaXMgc2ltaWxhciB0bw0KPj4+PiArICAgICAgICAgICAgICAgLy8gYGluc2Vy dF9mcmFnbWVudGAgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHdlIGFyZSBub3QNCj4+Pj4g KyAgICAgICAgICAgICAgIC8vIGNyZWF0aW5nIGEgbWV0YXZhcmlhYmxlLCBidXQgYSByZXBl dGl0aW9uIG9mIG9uZSwgd2hpY2ggaXMNCj4+Pj4gKyAgICAgICAgICAgICAgIC8vIHJlYWxs eSBkaWZmZXJlbnQuDQo+Pj4+ICsgICAgICAgICAgICAgICBzdWJfc3RhY2suYXBwZW5kX2Zy YWdtZW50ICgNCj4+Pj4gKyAgICAgICAgICAgICAgICAgTWF0Y2hlZEZyYWdtZW50IChmcmFn bWVudC0+Z2V0X2lkZW50ICgpLCBvZmZzX2JlZ2luLA0KPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG9mZnNfZW5kKSk7DQo+Pj4+ICsgICAgICAgICAgICAgfQ0K Pj4+PiArICAgICAgICAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgICAgICAgICAg Y2FzZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpUb2s6IHsNCj4+Pj4gKyAg ICAgICAgICAgICAgIEFTVDo6VG9rZW4gKnRvayA9IHN0YXRpY19jYXN0PEFTVDo6VG9rZW4g Kj4gKG1hdGNoLmdldCAoKSk7DQo+Pj4+ICsgICAgICAgICAgICAgICB2YWxpZF9jdXJyZW50 X21hdGNoID0gbWF0Y2hfdG9rZW4gKHBhcnNlciwgKnRvayk7DQo+Pj4+ICsgICAgICAgICAg ICAgfQ0KPj4+PiArICAgICAgICAgICAgIGJyZWFrOw0KPj4+PiArDQo+Pj4+ICsgICAgICAg ICAgICAgY2FzZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0Y2hUeXBlOjpSZXBldGl0aW9u OiB7DQo+Pj4+ICsgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hSZXBldGl0aW9uICpy ZXANCj4+Pj4gKyAgICAgICAgICAgICAgICAgPSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0 Y2hSZXBldGl0aW9uICo+IChtYXRjaC5nZXQgKCkpOw0KPj4+PiArICAgICAgICAgICAgICAg dmFsaWRfY3VycmVudF9tYXRjaCA9IG1hdGNoX3JlcGV0aXRpb24gKHBhcnNlciwgKnJlcCk7 DQo+Pj4+ICsgICAgICAgICAgICAgfQ0KPj4+PiArICAgICAgICAgICAgIGJyZWFrOw0KPj4+ PiArDQo+Pj4+ICsgICAgICAgICAgICAgY2FzZSBBU1Q6Ok1hY3JvTWF0Y2g6Ok1hY3JvTWF0 Y2hUeXBlOjpNYXRjaGVyOiB7DQo+Pj4+ICsgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0 Y2hlciAqbQ0KPj4+PiArICAgICAgICAgICAgICAgICA9IHN0YXRpY19jYXN0PEFTVDo6TWFj cm9NYXRjaGVyICo+IChtYXRjaC5nZXQgKCkpOw0KPj4+PiArICAgICAgICAgICAgICAgdmFs aWRfY3VycmVudF9tYXRjaCA9IG1hdGNoX21hdGNoZXIgKHBhcnNlciwgKm0pOw0KPj4+PiAr ICAgICAgICAgICAgIH0NCj4+Pj4gKyAgICAgICAgICAgICBicmVhazsNCj4+Pj4gKyAgICAg ICAgICAgfQ0KPj4+PiArICAgICAgIH0NCj4+Pj4gKyAgICAgIC8vIElmIHdlJ3ZlIGVuY291 bnRlcmVkIGFuIGVycm9yIG9uY2UsIHN0b3AgdHJ5aW5nIHRvIG1hdGNoIG1vcmUNCj4+Pj4g KyAgICAgIC8vIHJlcGV0aXRpb25zDQo+Pj4+ICsgICAgICBpZiAoIXZhbGlkX2N1cnJlbnRf bWF0Y2gpDQo+Pj4+ICsgICAgICAgYnJlYWs7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgIG1hdGNo X2Ftb3VudCsrOw0KPj4+PiArDQo+Pj4+ICsgICAgICAvLyBCcmVhayBlYXJseSBpZiB3ZSBu b3RpY2UgdGhlcmUncyB0b28gbWFueSBleHByZXNzaW9ucyBhbHJlYWR5DQo+Pj4+ICsgICAg ICBpZiAoaGlfYm91bmQgJiYgbWF0Y2hfYW1vdW50ID4gaGlfYm91bmQpDQo+Pj4+ICsgICAg ICAgYnJlYWs7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIENoZWNrIGlmIHRo ZSBhbW91bnQgb2YgbWF0Y2hlcyB3ZSBnb3QgaXMgdmFsaWQ6IElzIGl0IG1vcmUgdGhhbiB0 aGUgbG93ZXINCj4+Pj4gKyAgLy8gYm91bmQgYW5kIGxlc3MgdGhhbiB0aGUgaGlnaGVyIGJv dW5kPw0KPj4+PiArICBib29sIGRpZF9tZWV0X2xvX2JvdW5kID0gbWF0Y2hfYW1vdW50ID49 IGxvX2JvdW5kOw0KPj4+PiArICBib29sIGRpZF9tZWV0X2hpX2JvdW5kID0gaGlfYm91bmQg PyBtYXRjaF9hbW91bnQgPD0gaGlfYm91bmQgOiB0cnVlOw0KPj4+PiArDQo+Pj4+ICsgIC8v IElmIHRoZSBlbmQtcmVzdWx0IGlzIHZhbGlkLCB0aGVuIHdlIGNhbiBjbGVhciB0aGUgcGFy c2UgZXJyb3JzOiBTaW5jZQ0KPj4+PiArICAvLyByZXBldGl0aW9ucyBhcmUgcGFyc2VkIGVh Z2VybHksIGl0IGlzIG9rYXkgdG8gZmFpbCBpbiBzb21lIGNhc2VzDQo+Pj4+ICsgIGF1dG8g cmVzID0gZGlkX21lZXRfbG9fYm91bmQgJiYgZGlkX21lZXRfaGlfYm91bmQ7DQo+Pj4+ICsg IGlmIChyZXMpDQo+Pj4+ICsgICAgcGFyc2VyLmNsZWFyX2Vycm9ycyAoKTsNCj4+Pj4gKw0K Pj4+PiArICByZXR1cm4gcmVzOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtib29sDQo+Pj4+ ICtNYWNyb0V4cGFuZGVyOjptYXRjaF9yZXBldGl0aW9uIChQYXJzZXI8TWFjcm9JbnZvY0xl eGVyPiAmcGFyc2VyLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBB U1Q6Ok1hY3JvTWF0Y2hSZXBldGl0aW9uICZyZXApDQo+Pj4+ICt7DQo+Pj4+ICsgIHNpemVf dCBtYXRjaF9hbW91bnQgPSAwOw0KPj4+PiArICBib29sIHJlcyA9IGZhbHNlOw0KPj4+PiAr DQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIGxvX3N0cjsNCj4+Pj4gKyAgc3RkOjpzdHJpbmcgaGlf c3RyOw0KPj4+PiArICBzd2l0Y2ggKHJlcC5nZXRfb3AgKCkpDQo+Pj4+ICsgICAgew0KPj4+ PiArICAgIGNhc2UgQVNUOjpNYWNyb01hdGNoUmVwZXRpdGlvbjo6TWFjcm9SZXBPcDo6QU5Z Og0KPj4+PiArICAgICAgbG9fc3RyID0gIjAiOw0KPj4+PiArICAgICAgaGlfc3RyID0gIitp bmYiOw0KPj4+PiArICAgICAgcmVzID0gbWF0Y2hfbl9tYXRjaGVzIChwYXJzZXIsIHJlcCwg bWF0Y2hfYW1vdW50KTsNCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiArICAgIGNhc2UgQVNU OjpNYWNyb01hdGNoUmVwZXRpdGlvbjo6TWFjcm9SZXBPcDo6T05FX09SX01PUkU6DQo+Pj4+ ICsgICAgICBsb19zdHIgPSAiMSI7DQo+Pj4+ICsgICAgICBoaV9zdHIgPSAiK2luZiI7DQo+ Pj4+ICsgICAgICByZXMgPSBtYXRjaF9uX21hdGNoZXMgKHBhcnNlciwgcmVwLCBtYXRjaF9h bW91bnQsIDEpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsgICAgY2FzZSBBU1Q6Ok1h Y3JvTWF0Y2hSZXBldGl0aW9uOjpNYWNyb1JlcE9wOjpaRVJPX09SX09ORToNCj4+Pj4gKyAg ICAgIGxvX3N0ciA9ICIwIjsNCj4+Pj4gKyAgICAgIGhpX3N0ciA9ICIxIjsNCj4+Pj4gKyAg ICAgIHJlcyA9IG1hdGNoX25fbWF0Y2hlcyAocGFyc2VyLCByZXAsIG1hdGNoX2Ftb3VudCwg MCwgMSk7DQo+Pj4+ICsgICAgICBicmVhazsNCj4+Pj4gKyAgICBkZWZhdWx0Og0KPj4+PiAr ICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOw0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiAr ICBpZiAoIXJlcykNCj4+Pj4gKyAgICBydXN0X2Vycm9yX2F0IChyZXAuZ2V0X21hdGNoX2xv Y3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgImludmFsaWQgYW1vdW50IG9mIG1h dGNoZXMgZm9yIG1hY3JvIGludm9jYXRpb24uIEV4cGVjdGVkICINCj4+Pj4gKyAgICAgICAg ICAgICAgICAgICJiZXR3ZWVuICVzIGFuZCAlcywgZ290ICVsdSIsDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICBsb19zdHIuY19zdHIgKCksIGhpX3N0ci5jX3N0ciAoKSwNCj4+Pj4gKyAg ICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBtYXRjaF9hbW91bnQpOw0KPj4+PiAr DQo+Pj4+ICsgIHJ1c3RfZGVidWdfbG9jIChyZXAuZ2V0X21hdGNoX2xvY3VzICgpLCAiJXMg bWF0Y2hlZCAlbHUgdGltZXMiLA0KPj4+PiArICAgICAgICAgICAgICAgICByZXMgPyAic3Vj Y2Vzc2Z1bGx5IiA6ICJ1bnN1Y2Nlc3NmdWxseSIsDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICh1bnNpZ25lZCBsb25nKSBtYXRjaF9hbW91bnQpOw0KPj4+PiArDQo+Pj4+ICsgIC8vIFdl IGhhdmUgdG8gaGFuZGxlIHplcm8gZnJhZ21lbnRzIGRpZmZlcmVudGx5OiBUaGV5IHdpbGwg bm90IGhhdmUgYmVlbg0KPj4+PiArICAvLyAibWF0Y2hlZCIgYnV0IHRoZXkgYXJlIHN0aWxs IHZhbGlkIGFuZCBzaG91bGQgYmUgaW5zZXJ0ZWQgYXMgYSBzcGVjaWFsDQo+Pj4+ICsgIC8v IGNhc2UuIFNvIHdlIGdvIHRocm91Z2ggdGhlIHN0YWNrIG1hcCwgYW5kIGZvciBldmVyeSBm cmFnbWVudCB3aGljaCBkb2Vzbid0DQo+Pj4+ICsgIC8vIGV4aXN0LCBpbnNlcnQgYSB6ZXJv LW1hdGNoZWQgZnJhZ21lbnQuDQo+Pj4+ICsgIGF1dG8gJnN0YWNrX21hcCA9IHN1Yl9zdGFj ay5wZWVrICgpOw0KPj4+PiArICBmb3IgKGF1dG8gJm1hdGNoIDogcmVwLmdldF9tYXRjaGVz ICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGlmIChtYXRjaC0+Z2V0X21hY3JvX21h dGNoX3R5cGUgKCkNCj4+Pj4gKyAgICAgICAgID09IEFTVDo6TWFjcm9NYXRjaDo6TWFjcm9N YXRjaFR5cGU6OkZyYWdtZW50KQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIGF1 dG8gZnJhZ21lbnQgPSBzdGF0aWNfY2FzdDxBU1Q6Ok1hY3JvTWF0Y2hGcmFnbWVudCAqPiAo bWF0Y2guZ2V0ICgpKTsNCj4+Pj4gKyAgICAgICAgIGF1dG8gaXQgPSBzdGFja19tYXAuZmlu ZCAoZnJhZ21lbnQtPmdldF9pZGVudCAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAgIGlm IChpdCA9PSBzdGFja19tYXAuZW5kICgpKQ0KPj4+PiArICAgICAgICAgICBzdWJfc3RhY2su aW5zZXJ0X21hdGNoZXMgKGZyYWdtZW50LT5nZXRfaWRlbnQgKCksDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVy Ojp6ZXJvICgpKTsNCj4+Pj4gKyAgICAgICB9DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ ICsgIHJldHVybiByZXM7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gKy8qKg0KPj4+PiArICog SGVscGVyIGZ1bmN0aW9uIHRvIHJlZmFjdG9yIGNhbGxpbmcgYSBwYXJzaW5nIGZ1bmN0aW9u IDAgb3IgbW9yZSB0aW1lcw0KPj4+PiArICovDQo+Pj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFn bWVudA0KPj4+PiArcGFyc2VfbWFueSAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNl ciwgVG9rZW5JZCAmZGVsaW1pdGVyLA0KPj4+PiArICAgICAgICAgICBzdGQ6OmZ1bmN0aW9u PEFTVDo6U2luZ2xlQVNUTm9kZSAoKT4gcGFyc2VfZm4pDQo+Pj4+ICt7DQo+Pj4+ICsgIHN0 ZDo6dmVjdG9yPEFTVDo6U2luZ2xlQVNUTm9kZT4gbm9kZXM7DQo+Pj4+ICsgIHdoaWxlICh0 cnVlKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAgICAgIGlmIChwYXJzZXIucGVla19jdXJyZW50 X3Rva2VuICgpLT5nZXRfaWQgKCkgPT0gZGVsaW1pdGVyKQ0KPj4+PiArICAgICAgIGJyZWFr Ow0KPj4+PiArDQo+Pj4+ICsgICAgICBhdXRvIG5vZGUgPSBwYXJzZV9mbiAoKTsNCj4+Pj4g KyAgICAgIG5vZGVzLmVtcGxhY2VfYmFjayAoc3RkOjptb3ZlIChub2RlKSk7DQo+Pj4+ICsg ICAgfQ0KPj4+PiArDQo+Pj4+ICsgIHJldHVybiBBU1Q6OkFTVEZyYWdtZW50IChzdGQ6Om1v dmUgKG5vZGVzKSk7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gKy8qKg0KPj4+PiArICogVHJh bnNjcmliZSAwIG9yIG1vcmUgaXRlbXMgZnJvbSBhIG1hY3JvIGludm9jYXRpb24NCj4+Pj4g KyAqDQo+Pj4+ICsgKiBAcGFyYW0gcGFyc2VyIFBhcnNlciB0byBleHRyYWN0IGl0ZW1zIGZy b20NCj4+Pj4gKyAqIEBwYXJhbSBkZWxpbWl0ZXIgSWQgb2YgdGhlIHRva2VuIG9uIHdoaWNo IHBhcnNpbmcgc2hvdWxkIHN0b3ANCj4+Pj4gKyAqLw0KPj4+PiArc3RhdGljIEFTVDo6QVNU RnJhZ21lbnQNCj4+Pj4gK3RyYW5zY3JpYmVfbWFueV9pdGVtcyAoUGFyc2VyPE1hY3JvSW52 b2NMZXhlcj4gJnBhcnNlciwgVG9rZW5JZCAmZGVsaW1pdGVyKQ0KPj4+PiArew0KPj4+PiAr ICByZXR1cm4gcGFyc2VfbWFueSAocGFyc2VyLCBkZWxpbWl0ZXIsIFsmcGFyc2VyXSAoKSB7 DQo+Pj4+ICsgICAgYXV0byBpdGVtID0gcGFyc2VyLnBhcnNlX2l0ZW0gKHRydWUpOw0KPj4+ PiArICAgIHJldHVybiBBU1Q6OlNpbmdsZUFTVE5vZGUgKHN0ZDo6bW92ZSAoaXRlbSkpOw0K Pj4+PiArICB9KTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArLyoqDQo+Pj4+ICsgKiBUcmFu c2NyaWJlIDAgb3IgbW9yZSBleHRlcm5hbCBpdGVtcyBmcm9tIGEgbWFjcm8gaW52b2NhdGlv bg0KPj4+PiArICoNCj4+Pj4gKyAqIEBwYXJhbSBwYXJzZXIgUGFyc2VyIHRvIGV4dHJhY3Qg aXRlbXMgZnJvbQ0KPj4+PiArICogQHBhcmFtIGRlbGltaXRlciBJZCBvZiB0aGUgdG9rZW4g b24gd2hpY2ggcGFyc2luZyBzaG91bGQgc3RvcA0KPj4+PiArICovDQo+Pj4+ICtzdGF0aWMg QVNUOjpBU1RGcmFnbWVudA0KPj4+PiArdHJhbnNjcmliZV9tYW55X2V4dCAoUGFyc2VyPE1h Y3JvSW52b2NMZXhlcj4gJnBhcnNlciwgVG9rZW5JZCAmZGVsaW1pdGVyKQ0KPj4+PiArew0K Pj4+PiArICByZXR1cm4gcGFyc2VfbWFueSAocGFyc2VyLCBkZWxpbWl0ZXIsIFsmcGFyc2Vy XSAoKSB7DQo+Pj4+ICsgICAgYXV0byBpdGVtID0gcGFyc2VyLnBhcnNlX2V4dGVybmFsX2l0 ZW0gKCk7DQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6U2luZ2xlQVNUTm9kZSAoc3RkOjptb3Zl IChpdGVtKSk7DQo+Pj4+ICsgIH0pOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICsvKioNCj4+ Pj4gKyAqIFRyYW5zY3JpYmUgMCBvciBtb3JlIHRyYWl0IGl0ZW1zIGZyb20gYSBtYWNybyBp bnZvY2F0aW9uDQo+Pj4+ICsgKg0KPj4+PiArICogQHBhcmFtIHBhcnNlciBQYXJzZXIgdG8g ZXh0cmFjdCBpdGVtcyBmcm9tDQo+Pj4+ICsgKiBAcGFyYW0gZGVsaW1pdGVyIElkIG9mIHRo ZSB0b2tlbiBvbiB3aGljaCBwYXJzaW5nIHNob3VsZCBzdG9wDQo+Pj4+ICsgKi8NCj4+Pj4g K3N0YXRpYyBBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICt0cmFuc2NyaWJlX21hbnlfdHJhaXRf aXRlbXMgKFBhcnNlcjxNYWNyb0ludm9jTGV4ZXI+ICZwYXJzZXIsDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgVG9rZW5JZCAmZGVsaW1pdGVyKQ0KPj4+PiArew0KPj4+ PiArICByZXR1cm4gcGFyc2VfbWFueSAocGFyc2VyLCBkZWxpbWl0ZXIsIFsmcGFyc2VyXSAo KSB7DQo+Pj4+ICsgICAgYXV0byBpdGVtID0gcGFyc2VyLnBhcnNlX3RyYWl0X2l0ZW0gKCk7 DQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6U2luZ2xlQVNUTm9kZSAoc3RkOjptb3ZlIChpdGVt KSk7DQo+Pj4+ICsgIH0pOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICsvKioNCj4+Pj4gKyAq IFRyYW5zY3JpYmUgMCBvciBtb3JlIGltcGwgaXRlbXMgZnJvbSBhIG1hY3JvIGludm9jYXRp b24NCj4+Pj4gKyAqDQo+Pj4+ICsgKiBAcGFyYW0gcGFyc2VyIFBhcnNlciB0byBleHRyYWN0 IGl0ZW1zIGZyb20NCj4+Pj4gKyAqIEBwYXJhbSBkZWxpbWl0ZXIgSWQgb2YgdGhlIHRva2Vu IG9uIHdoaWNoIHBhcnNpbmcgc2hvdWxkIHN0b3ANCj4+Pj4gKyAqLw0KPj4+PiArc3RhdGlj IEFTVDo6QVNURnJhZ21lbnQNCj4+Pj4gK3RyYW5zY3JpYmVfbWFueV9pbXBsX2l0ZW1zIChQ YXJzZXI8TWFjcm9JbnZvY0xleGVyPiAmcGFyc2VyLCBUb2tlbklkICZkZWxpbWl0ZXIpDQo+ Pj4+ICt7DQo+Pj4+ICsgIHJldHVybiBwYXJzZV9tYW55IChwYXJzZXIsIGRlbGltaXRlciwg WyZwYXJzZXJdICgpIHsNCj4+Pj4gKyAgICBhdXRvIGl0ZW0gPSBwYXJzZXIucGFyc2VfaW5o ZXJlbnRfaW1wbF9pdGVtICgpOw0KPj4+PiArICAgIHJldHVybiBBU1Q6OlNpbmdsZUFTVE5v ZGUgKHN0ZDo6bW92ZSAoaXRlbSkpOw0KPj4+PiArICB9KTsNCj4+Pj4gK30NCj4+Pj4gKw0K Pj4+PiArLyoqDQo+Pj4+ICsgKiBUcmFuc2NyaWJlIDAgb3IgbW9yZSB0cmFpdCBpbXBsIGl0 ZW1zIGZyb20gYSBtYWNybyBpbnZvY2F0aW9uDQo+Pj4+ICsgKg0KPj4+PiArICogQHBhcmFt IHBhcnNlciBQYXJzZXIgdG8gZXh0cmFjdCBpdGVtcyBmcm9tDQo+Pj4+ICsgKiBAcGFyYW0g ZGVsaW1pdGVyIElkIG9mIHRoZSB0b2tlbiBvbiB3aGljaCBwYXJzaW5nIHNob3VsZCBzdG9w DQo+Pj4+ICsgKi8NCj4+Pj4gK3N0YXRpYyBBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ICt0cmFu c2NyaWJlX21hbnlfdHJhaXRfaW1wbF9pdGVtcyAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4g JnBhcnNlciwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vu SWQgJmRlbGltaXRlcikNCj4+Pj4gK3sNCj4+Pj4gKyAgcmV0dXJuIHBhcnNlX21hbnkgKHBh cnNlciwgZGVsaW1pdGVyLCBbJnBhcnNlcl0gKCkgew0KPj4+PiArICAgIGF1dG8gaXRlbSA9 IHBhcnNlci5wYXJzZV90cmFpdF9pbXBsX2l0ZW0gKCk7DQo+Pj4+ICsgICAgcmV0dXJuIEFT VDo6U2luZ2xlQVNUTm9kZSAoc3RkOjptb3ZlIChpdGVtKSk7DQo+Pj4+ICsgIH0pOw0KPj4+ PiArfQ0KPj4+PiArDQo+Pj4+ICsvKioNCj4+Pj4gKyAqIFRyYW5zY3JpYmUgMCBvciBtb3Jl IHN0YXRlbWVudHMgZnJvbSBhIG1hY3JvIGludm9jYXRpb24NCj4+Pj4gKyAqDQo+Pj4+ICsg KiBAcGFyYW0gcGFyc2VyIFBhcnNlciB0byBleHRyYWN0IHN0YXRlbWVudHMgZnJvbQ0KPj4+ PiArICogQHBhcmFtIGRlbGltaXRlciBJZCBvZiB0aGUgdG9rZW4gb24gd2hpY2ggcGFyc2lu ZyBzaG91bGQgc3RvcA0KPj4+PiArICovDQo+Pj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFnbWVu dA0KPj4+PiArdHJhbnNjcmliZV9tYW55X3N0bXRzIChQYXJzZXI8TWFjcm9JbnZvY0xleGVy PiAmcGFyc2VyLCBUb2tlbklkICZkZWxpbWl0ZXIpDQo+Pj4+ICt7DQo+Pj4+ICsgIGF1dG8g cmVzdHJpY3Rpb25zID0gUGFyc2VSZXN0cmljdGlvbnMgKCk7DQo+Pj4+ICsgIHJlc3RyaWN0 aW9ucy5jb25zdW1lX3NlbWkgPSBmYWxzZTsNCj4+Pj4gKw0KPj4+PiArICAvLyBGSVhNRTog VGhpcyBpcyBpbnZhbGlkISBJdCBuZWVkcyB0byBhbHNvIGhhbmRsZSBjYXNlcyB3aGVyZSB0 aGUgbWFjcm8NCj4+Pj4gKyAgLy8gdHJhbnNjcmliZXIgaXMgYW4gZXhwcmVzc2lvbiwgYnV0 IHNpbmNlIHRoZSBtYWNybyBjYWxsIGlzIGZvbGxvd2VkIGJ5DQo+Pj4+ICsgIC8vIGEgc2Vt aWNvbG9uLCBpdCdzIGEgdmFsaWQgRXhwclN0bXQNCj4+Pj4gKyAgcmV0dXJuIHBhcnNlX21h bnkgKHBhcnNlciwgZGVsaW1pdGVyLCBbJnBhcnNlciwgcmVzdHJpY3Rpb25zXSAoKSB7DQo+ Pj4+ICsgICAgYXV0byBzdG10ID0gcGFyc2VyLnBhcnNlX3N0bXQgKHJlc3RyaWN0aW9ucyk7 DQo+Pj4+ICsgICAgcmV0dXJuIEFTVDo6U2luZ2xlQVNUTm9kZSAoc3RkOjptb3ZlIChzdG10 KSk7DQo+Pj4+ICsgIH0pOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICsvKioNCj4+Pj4gKyAq IFRyYW5zY3JpYmUgb25lIGV4cHJlc3Npb24gZnJvbSBhIG1hY3JvIGludm9jYXRpb24NCj4+ Pj4gKyAqDQo+Pj4+ICsgKiBAcGFyYW0gcGFyc2VyIFBhcnNlciB0byBleHRyYWN0IHN0YXRl bWVudHMgZnJvbQ0KPj4+PiArICovDQo+Pj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFnbWVudA0K Pj4+PiArdHJhbnNjcmliZV9leHByZXNzaW9uIChQYXJzZXI8TWFjcm9JbnZvY0xleGVyPiAm cGFyc2VyKQ0KPj4+PiArew0KPj4+PiArICBhdXRvIGV4cHIgPSBwYXJzZXIucGFyc2VfZXhw ciAoKTsNCj4+Pj4gKw0KPj4+PiArICByZXR1cm4gQVNUOjpBU1RGcmFnbWVudCAoe3N0ZDo6 bW92ZSAoZXhwcil9KTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArLyoqDQo+Pj4+ICsgKiBU cmFuc2NyaWJlIG9uZSB0eXBlIGZyb20gYSBtYWNybyBpbnZvY2F0aW9uDQo+Pj4+ICsgKg0K Pj4+PiArICogQHBhcmFtIHBhcnNlciBQYXJzZXIgdG8gZXh0cmFjdCBzdGF0ZW1lbnRzIGZy b20NCj4+Pj4gKyAqLw0KPj4+PiArc3RhdGljIEFTVDo6QVNURnJhZ21lbnQNCj4+Pj4gK3Ry YW5zY3JpYmVfdHlwZSAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlcikNCj4+Pj4g K3sNCj4+Pj4gKyAgYXV0byB0eXBlID0gcGFyc2VyLnBhcnNlX3R5cGUgKCk7DQo+Pj4+ICsN Cj4+Pj4gKyAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQgKHtzdGQ6Om1vdmUgKHR5cGUpfSk7 DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3N0YXRpYyBBU1Q6OkFTVEZyYWdtZW50DQo+Pj4+ ICt0cmFuc2NyaWJlX29uX2RlbGltaXRlciAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBh cnNlciwgYm9vbCBzZW1pY29sb24sDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBB U1Q6OkRlbGltVHlwZSBkZWxpbWl0ZXIsIFRva2VuSWQgbGFzdF90b2tlbl9pZCkNCj4+Pj4g K3sNCj4+Pj4gKyAgaWYgKHNlbWljb2xvbiB8fCBkZWxpbWl0ZXIgPT0gQVNUOjpEZWxpbVR5 cGU6OkNVUkxZKQ0KPj4+PiArICAgIHJldHVybiB0cmFuc2NyaWJlX21hbnlfc3RtdHMgKHBh cnNlciwgbGFzdF90b2tlbl9pZCk7DQo+Pj4+ICsgIGVsc2UNCj4+Pj4gKyAgICByZXR1cm4g dHJhbnNjcmliZV9leHByZXNzaW9uIChwYXJzZXIpOw0KPj4+PiArfSAvLyBuYW1lc3BhY2Ug UnVzdA0KPj4+PiArDQo+Pj4+ICtzdGF0aWMgQVNUOjpBU1RGcmFnbWVudA0KPj4+PiArdHJh bnNjcmliZV9jb250ZXh0IChNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZSBjdHgsDQo+Pj4+ ICsgICAgICAgICAgICAgICAgICAgUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwg Ym9vbCBzZW1pY29sb24sDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgQVNUOjpEZWxpbVR5 cGUgZGVsaW1pdGVyLCBUb2tlbklkIGxhc3RfdG9rZW5faWQpDQo+Pj4+ICt7DQo+Pj4+ICsg IC8vIFRoZSBmbG93LWNoYXJ0IGluIG9yZGVyIHRvIGNob29zZSBhIHBhcnNpbmcgZnVuY3Rp b24gaXMgYXMgZm9sbG93czoNCj4+Pj4gKyAgLy8NCj4+Pj4gKyAgLy8gW3N3aXRjaCBzcGVj aWFsIGNvbnRleHRdDQo+Pj4+ICsgIC8vICAgICAtLSBJdGVtIC0tPiBwYXJzZXIucGFyc2Vf aXRlbSgpOw0KPj4+PiArICAvLyAgICAgLS0gVHJhaXQgLS0+IHBhcnNlci5wYXJzZV90cmFp dF9pdGVtKCk7DQo+Pj4+ICsgIC8vICAgICAtLSBJbXBsIC0tPiBwYXJzZXIucGFyc2VfaW1w bF9pdGVtKCk7DQo+Pj4+ICsgIC8vICAgICAtLSBFeHRlcm4gLS0+IHBhcnNlci5wYXJzZV9l eHRlcm5faXRlbSgpOw0KPj4+PiArICAvLyAgICAgLS0gTm9uZSAtLT4gW2hhcyBzZW1pY29s b24/XQ0KPj4+PiArICAvLyAgICAgICAgICAgICAgICAgLS0gWWVzIC0tPiBwYXJzZXIucGFy c2Vfc3RtdCgpOw0KPj4+PiArICAvLyAgICAgICAgICAgICAgICAgLS0gTm8gLS0+IFtzd2l0 Y2ggaW52b2NhdGlvbi5kZWxpbWl0ZXIoKV0NCj4+Pj4gKyAgLy8gICAgICAgICAgICAgICAg ICAgICAgICAgICAgIC0tIHsgfSAtLT4gcGFyc2VyLnBhcnNlX3N0bXQoKTsNCj4+Pj4gKyAg Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIF8gLS0+IHBhcnNlci5wYXJzZV9l eHByKCk7IC8vIG9uY2UhDQo+Pj4+ICsNCj4+Pj4gKyAgLy8gSWYgdGhlcmUgaXMgYSBzZW1p Y29sb24gT1Igd2UgYXJlIGV4cGFuZGluZyBhIE1hY3JvSW52b2NhdGlvblNlbWksIHRoZW4N Cj4+Pj4gKyAgLy8gd2UgY2FuIHBhcnNlIG11bHRpcGxlIGl0ZW1zLiBPdGhlcndpc2UsIHBh cnNlICpvbmUqIGV4cHJlc3Npb24NCj4+Pj4gKw0KPj4+PiArICBzd2l0Y2ggKGN0eCkNCj4+ Pj4gKyAgICB7DQo+Pj4+ICsgICAgY2FzZSBNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6 SVRFTToNCj4+Pj4gKyAgICAgIHJldHVybiB0cmFuc2NyaWJlX21hbnlfaXRlbXMgKHBhcnNl ciwgbGFzdF90b2tlbl9pZCk7DQo+Pj4+ICsgICAgICBicmVhazsNCj4+Pj4gKyAgICBjYXNl IE1hY3JvRXhwYW5kZXI6OkNvbnRleHRUeXBlOjpUUkFJVDoNCj4+Pj4gKyAgICAgIHJldHVy biB0cmFuc2NyaWJlX21hbnlfdHJhaXRfaXRlbXMgKHBhcnNlciwgbGFzdF90b2tlbl9pZCk7 DQo+Pj4+ICsgICAgICBicmVhazsNCj4+Pj4gKyAgICBjYXNlIE1hY3JvRXhwYW5kZXI6OkNv bnRleHRUeXBlOjpJTVBMOg0KPj4+PiArICAgICAgcmV0dXJuIHRyYW5zY3JpYmVfbWFueV9p bXBsX2l0ZW1zIChwYXJzZXIsIGxhc3RfdG9rZW5faWQpOw0KPj4+PiArICAgICAgYnJlYWs7 DQo+Pj4+ICsgICAgY2FzZSBNYWNyb0V4cGFuZGVyOjpDb250ZXh0VHlwZTo6VFJBSVRfSU1Q TDoNCj4+Pj4gKyAgICAgIHJldHVybiB0cmFuc2NyaWJlX21hbnlfdHJhaXRfaW1wbF9pdGVt cyAocGFyc2VyLCBsYXN0X3Rva2VuX2lkKTsNCj4+Pj4gKyAgICAgIGJyZWFrOw0KPj4+PiAr ICAgIGNhc2UgTWFjcm9FeHBhbmRlcjo6Q29udGV4dFR5cGU6OkVYVEVSTjoNCj4+Pj4gKyAg ICAgIHJldHVybiB0cmFuc2NyaWJlX21hbnlfZXh0IChwYXJzZXIsIGxhc3RfdG9rZW5faWQp Ow0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsgICAgY2FzZSBNYWNyb0V4cGFuZGVyOjpD b250ZXh0VHlwZTo6VFlQRToNCj4+Pj4gKyAgICAgIHJldHVybiB0cmFuc2NyaWJlX3R5cGUg KHBhcnNlcik7DQo+Pj4+ICsgICAgICBicmVhazsNCj4+Pj4gKyAgICBkZWZhdWx0Og0KPj4+ PiArICAgICAgcmV0dXJuIHRyYW5zY3JpYmVfb25fZGVsaW1pdGVyIChwYXJzZXIsIHNlbWlj b2xvbiwgZGVsaW1pdGVyLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGxhc3RfdG9rZW5faWQpOw0KPj4+PiArICAgIH0NCj4+Pj4gK30NCj4+Pj4gKw0K Pj4+PiArc3RhdGljIHN0ZDo6c3RyaW5nDQo+Pj4+ICt0b2tlbnNfdG9fc3RyIChzdGQ6OnZl Y3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+ICZ0b2tlbnMpDQo+Pj4+ICt7DQo+ Pj4+ICsgIHN0ZDo6c3RyaW5nIHN0cjsNCj4+Pj4gKyAgaWYgKCF0b2tlbnMuZW1wdHkgKCkp DQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAgc3RyICs9IHRva2Vuc1swXS0+YXNfc3RyaW5n ICgpOw0KPj4+PiArICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCB0b2tlbnMuc2l6ZSAo KTsgaSsrKQ0KPj4+PiArICAgICAgIHN0ciArPSAiICIgKyB0b2tlbnNbaV0tPmFzX3N0cmlu ZyAoKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIHN0cjsNCj4+Pj4g K30NCj4+Pj4gKw0KPj4+PiArQVNUOjpBU1RGcmFnbWVudA0KPj4+PiArTWFjcm9FeHBhbmRl cjo6dHJhbnNjcmliZV9ydWxlICgNCj4+Pj4gKyAgQVNUOjpNYWNyb1J1bGUgJm1hdGNoX3J1 bGUsIEFTVDo6RGVsaW1Ub2tlblRyZWUgJmludm9jX3Rva2VuX3RyZWUsDQo+Pj4+ICsgIHN0 ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI+ICZtYXRjaGVk X2ZyYWdtZW50cywNCj4+Pj4gKyAgYm9vbCBzZW1pY29sb24sIENvbnRleHRUeXBlIGN0eCkN Cj4+Pj4gK3sNCj4+Pj4gKyAgLy8gd2UgY2FuIG1hbmlwdWxhdGUgdGhlIHRva2VuIHRyZWUg dG8gc3Vic3RpdHV0ZSB0aGUgZG9sbGFyIGlkZW50aWZpZXJzIHNvDQo+Pj4+ICsgIC8vIHRo YXQgd2hlbiB3ZSBjYWxsIHBhcnNlIGl0cyBhbHJlYWR5IHN1YnN0aXR1dGVkIGZvciB1cw0K Pj4+PiArICBBU1Q6Ok1hY3JvVHJhbnNjcmliZXIgJnRyYW5zY3JpYmVyID0gbWF0Y2hfcnVs ZS5nZXRfdHJhbnNjcmliZXIgKCk7DQo+Pj4+ICsgIEFTVDo6RGVsaW1Ub2tlblRyZWUgJnRy YW5zY3JpYmVfdHJlZSA9IHRyYW5zY3JpYmVyLmdldF90b2tlbl90cmVlICgpOw0KPj4+PiAr DQo+Pj4+ICsgIGF1dG8gaW52b2Nfc3RyZWFtID0gaW52b2NfdG9rZW5fdHJlZS50b190b2tl bl9zdHJlYW0gKCk7DQo+Pj4+ICsgIGF1dG8gbWFjcm9fcnVsZV90b2tlbnMgPSB0cmFuc2Ny aWJlX3RyZWUudG9fdG9rZW5fc3RyZWFtICgpOw0KPj4+PiArDQo+Pj4+ICsgIGF1dG8gc3Vi c3RpdHV0ZV9jb250ZXh0DQo+Pj4+ICsgICAgPSBTdWJzdGl0dXRlQ3R4IChpbnZvY19zdHJl YW0sIG1hY3JvX3J1bGVfdG9rZW5zLCBtYXRjaGVkX2ZyYWdtZW50cyk7DQo+Pj4+ICsgIHN0 ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4gc3Vic3RpdHV0ZWRfdG9r ZW5zDQo+Pj4+ICsgICAgPSBzdWJzdGl0dXRlX2NvbnRleHQuc3Vic3RpdHV0ZV90b2tlbnMg KCk7DQo+Pj4+ICsNCj4+Pj4gKyAgcnVzdF9kZWJ1ZyAoInN1YnN0aXR1dGVkIHRva2Vuczog JXMiLA0KPj4+PiArICAgICAgICAgICAgIHRva2Vuc190b19zdHIgKHN1YnN0aXR1dGVkX3Rv a2VucykuY19zdHIgKCkpOw0KPj4+PiArDQo+Pj4+ICsgIC8vIHBhcnNlIGl0IHRvIGFuIEFT VEZyYWdtZW50DQo+Pj4+ICsgIE1hY3JvSW52b2NMZXhlciBsZXggKHN0ZDo6bW92ZSAoc3Vi c3RpdHV0ZWRfdG9rZW5zKSk7DQo+Pj4+ICsgIFBhcnNlcjxNYWNyb0ludm9jTGV4ZXI+IHBh cnNlciAobGV4KTsNCj4+Pj4gKw0KPj4+PiArICBhdXRvIGxhc3RfdG9rZW5faWQgPSBUb2tl bklkOjpSSUdIVF9DVVJMWTsNCj4+Pj4gKw0KPj4+PiArICAvLyB0aGlzIGlzIHVzZWQgc28g d2UgY2FuIGNoZWNrIHRoYXQgd2UgZGVsaW1pdCB0aGUgc3RyZWFtIGNvcnJlY3RseS4NCj4+ Pj4gKyAgc3dpdGNoICh0cmFuc2NyaWJlX3RyZWUuZ2V0X2RlbGltX3R5cGUgKCkpDQo+Pj4+ ICsgICAgew0KPj4+PiArICAgIGNhc2UgQVNUOjpEZWxpbVR5cGU6OlBBUkVOUzoNCj4+Pj4g KyAgICAgIGxhc3RfdG9rZW5faWQgPSBUb2tlbklkOjpSSUdIVF9QQVJFTjsNCj4+Pj4gKyAg ICAgIHJ1c3RfYXNzZXJ0IChwYXJzZXIuc2tpcF90b2tlbiAoTEVGVF9QQVJFTikpOw0KPj4+ PiArICAgICAgYnJlYWs7DQo+Pj4+ICsNCj4+Pj4gKyAgICBjYXNlIEFTVDo6RGVsaW1UeXBl OjpDVVJMWToNCj4+Pj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChwYXJzZXIuc2tpcF90b2tlbiAo TEVGVF9DVVJMWSkpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+Pj4+ICsNCj4+Pj4gKyAgICBj YXNlIEFTVDo6RGVsaW1UeXBlOjpTUVVBUkU6DQo+Pj4+ICsgICAgICBsYXN0X3Rva2VuX2lk ID0gVG9rZW5JZDo6UklHSFRfU1FVQVJFOw0KPj4+PiArICAgICAgcnVzdF9hc3NlcnQgKHBh cnNlci5za2lwX3Rva2VuIChMRUZUX1NRVUFSRSkpOw0KPj4+PiArICAgICAgYnJlYWs7DQo+ Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20v UnVzdC1HQ0MvZ2NjcnMvaXNzdWVzLzIyDQo+Pj4+ICsgIC8vIFRMO0RSOg0KPj4+PiArICAv LyAgIC0gVHJlYXQgYWxsIG1hY3JvIGludm9jYXRpb25zIHdpdGggcGFyZW50aGVzZXMsICgp LCBvciBzcXVhcmUgYnJhY2tldHMsDQo+Pj4+ICsgIC8vICAgW10sIGFzIGV4cHJlc3Npb25z Lg0KPj4+PiArICAvLyAgIC0gSWYgdGhlIG1hY3JvIGludm9jYXRpb24gaGFzIGN1cmx5IGJy YWNrZXRzLCB7fSwgaXQgbWF5IGJlIHBhcnNlZCBhcyBhDQo+Pj4+ICsgIC8vICAgc3RhdGVt ZW50IGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4NCj4+Pj4gKyAgLy8gICAtIElmIHRoZSBt YWNybyBpbnZvY2F0aW9uIGhhcyBhIHNlbWljb2xvbiBhdCB0aGUgZW5kLCBpdCBtdXN0IGJl IHBhcnNlZA0KPj4+PiArICAvLyAgIGFzIGEgc3RhdGVtZW50IChlaXRoZXIgdmlhIEV4cHJl c3Npb25TdGF0ZW1lbnQgb3INCj4+Pj4gKyAgLy8gICBNYWNyb0ludm9jYXRpb25XaXRoU2Vt aSkNCj4+Pj4gKw0KPj4+PiArICBhdXRvIGZyYWdtZW50DQo+Pj4+ICsgICAgPSB0cmFuc2Ny aWJlX2NvbnRleHQgKGN0eCwgcGFyc2VyLCBzZW1pY29sb24sDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgaW52b2NfdG9rZW5fdHJlZS5nZXRfZGVsaW1fdHlwZSAoKSwgbGFz dF90b2tlbl9pZCk7DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gZW1pdCBhbnkgZXJyb3JzDQo+Pj4+ ICsgIGlmIChwYXJzZXIuaGFzX2Vycm9ycyAoKSkNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAg ICBmb3IgKGF1dG8gJmVyciA6IHBhcnNlci5nZXRfZXJyb3JzICgpKQ0KPj4+PiArICAgICAg IHJ1c3RfZXJyb3JfYXQgKGVyci5sb2N1cywgIiVzIiwgZXJyLm1lc3NhZ2UuY19zdHIgKCkp Ow0KPj4+PiArICAgICAgcmV0dXJuIEFTVDo6QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAo KTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgLy8gYXJlIGFsbCB0aGUgdG9rZW5z IHVzZWQ/DQo+Pj4+ICsgIGJvb2wgZGlkX2RlbGltaXQgPSBwYXJzZXIuc2tpcF90b2tlbiAo bGFzdF90b2tlbl9pZCk7DQo+Pj4+ICsNCj4+Pj4gKyAgYm9vbCByZWFjaGVkX2VuZF9vZl9z dHJlYW0gPSBkaWRfZGVsaW1pdCAmJiBwYXJzZXIuc2tpcF90b2tlbiAoRU5EX09GX0ZJTEUp Ow0KPj4+PiArICBpZiAoIXJlYWNoZWRfZW5kX29mX3N0cmVhbSkNCj4+Pj4gKyAgICB7DQo+ Pj4+ICsgICAgICBjb25zdF9Ub2tlblB0ciBjdXJyZW50X3Rva2VuID0gcGFyc2VyLnBlZWtf Y3VycmVudF90b2tlbiAoKTsNCj4+Pj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGN1cnJlbnRf dG9rZW4tPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgInRva2Vu cyBoZXJlIGFuZCBhZnRlciBhcmUgdW5wYXJzZWQiKTsNCj4+Pj4gKyAgICB9DQo+Pj4+ICsN Cj4+Pj4gKyAgcmV0dXJuIGZyYWdtZW50Ow0KPj4+PiArfQ0KPj4+PiArfSAvLyBuYW1lc3Bh Y2UgUnVzdA0KPj4+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8t ZXhwYW5kLmggYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1leHBhbmQuaA0KPj4+PiBu ZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4+PiBpbmRleCAwMDAwMDAwMDAwMC4uOTRkNjcwMmVj YjgNCj4+Pj4gLS0tIC9kZXYvbnVsbA0KPj4+PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVz dC1tYWNyby1leHBhbmQuaA0KPj4+PiBAQCAtMCwwICsxLDM2NiBAQA0KPj4+PiArLy8gQ29w eXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+ Pj4+ICsNCj4+Pj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+Pj4gKw0KPj4+ PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+Pj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+Pj4+ICsv LyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlcg0KPj4+PiArLy8gdmVyc2lvbi4NCj4+Pj4gKw0KPj4+PiArLy8g R0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws IGJ1dCBXSVRIT1VUIEFOWQ0KPj4+PiArLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCj4+Pj4gKy8vIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQ0KPj4+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+Pj4gKw0KPj4+PiAr Ly8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UNCj4+Pj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUg Q09QWUlORzMuICBJZiBub3Qgc2VlDQo+Pj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uDQo+Pj4+ICsNCj4+Pj4gKyNpZm5kZWYgUlVTVF9NQUNST19FWFBBTkRfSA0K Pj4+PiArI2RlZmluZSBSVVNUX01BQ1JPX0VYUEFORF9IDQo+Pj4+ICsNCj4+Pj4gKyNpbmNs dWRlICJydXN0LWJ1ZmZlcmVkLXF1ZXVlLmgiDQo+Pj4+ICsjaW5jbHVkZSAicnVzdC1wYXJz ZS5oIg0KPj4+PiArI2luY2x1ZGUgInJ1c3QtdG9rZW4uaCINCj4+Pj4gKyNpbmNsdWRlICJy dXN0LWFzdC5oIg0KPj4+PiArI2luY2x1ZGUgInJ1c3QtbWFjcm8uaCINCj4+Pj4gKyNpbmNs dWRlICJydXN0LWhpci1tYXAuaCINCj4+Pj4gKyNpbmNsdWRlICJydXN0LW5hbWUtcmVzb2x2 ZXIuaCINCj4+Pj4gKyNpbmNsdWRlICJydXN0LW1hY3JvLWludm9jLWxleGVyLmgiDQo+Pj4+ ICsNCj4+Pj4gKy8vIFByb3ZpZGVzIG9iamVjdHMgYW5kIG1ldGhvZCBwcm90b3R5cGVzIGZv ciBtYWNybyBleHBhbnNpb24NCj4+Pj4gKw0KPj4+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4+ PiArLy8gZm9yd2FyZCBkZWNscyBmb3IgQVNUDQo+Pj4+ICtuYW1lc3BhY2UgQVNUIHsNCj4+ Pj4gK2NsYXNzIE1hY3JvSW52b2NhdGlvbjsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiArLy8g T2JqZWN0IHVzZWQgdG8gc3RvcmUgY29uZmlndXJhdGlvbiBkYXRhIGZvciBtYWNybyBleHBh bnNpb24uDQo+Pj4+ICsvLyBOT1RFOiBLZWVwIGFsbCB0aGVzZSBpdGVtcyBjb21wbHlpbmcg d2l0aCB0aGUgbGF0ZXN0IHJ1c3RjLg0KPj4+PiArc3RydWN0IEV4cGFuc2lvbkNmZw0KPj4+ PiArew0KPj4+PiArICAvLyBmZWF0dXJlcz8NCj4+Pj4gKyAgLy8gVE9ETzogQWRkIGBmZWF0 dXJlcycgd2hlbiB3ZSBoYXZlIGl0Lg0KPj4+PiArICB1bnNpZ25lZCBpbnQgcmVjdXJzaW9u X2xpbWl0ID0gMTAyNDsNCj4+Pj4gKyAgYm9vbCB0cmFjZV9tYWMgPSBmYWxzZTsgICAvLyB0 cmFjZSBtYWNybw0KPj4+PiArICBib29sIHNob3VsZF90ZXN0ID0gZmFsc2U7IC8vIHN0cmlw ICNbdGVzdF0gbm9kZXMgaWYgZmFsc2UNCj4+Pj4gKyAgYm9vbCBrZWVwX21hY3MgPSBmYWxz ZTsgICAvLyBrZWVwIG1hY3JvIGRlZmluaXRpb25zDQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIGNy YXRlX25hbWUgPSAiIjsNCj4+Pj4gK307DQo+Pj4+ICsNCj4+Pj4gK3N0cnVjdCBNYXRjaGVk RnJhZ21lbnQNCj4+Pj4gK3sNCj4+Pj4gKyAgc3RkOjpzdHJpbmcgZnJhZ21lbnRfaWRlbnQ7 DQo+Pj4+ICsgIHNpemVfdCB0b2tlbl9vZmZzZXRfYmVnaW47DQo+Pj4+ICsgIHNpemVfdCB0 b2tlbl9vZmZzZXRfZW5kOw0KPj4+PiArDQo+Pj4+ICsgIE1hdGNoZWRGcmFnbWVudCAoc3Rk OjpzdHJpbmcgaWRlbnRpZmllciwgc2l6ZV90IHRva2VuX29mZnNldF9iZWdpbiwNCj4+Pj4g KyAgICAgICAgICAgICAgICAgIHNpemVfdCB0b2tlbl9vZmZzZXRfZW5kKQ0KPj4+PiArICAg IDogZnJhZ21lbnRfaWRlbnQgKGlkZW50aWZpZXIpLCB0b2tlbl9vZmZzZXRfYmVnaW4gKHRv a2VuX29mZnNldF9iZWdpbiksDQo+Pj4+ICsgICAgICB0b2tlbl9vZmZzZXRfZW5kICh0b2tl bl9vZmZzZXRfZW5kKQ0KPj4+PiArICB7fQ0KPj4+PiArDQo+Pj4+ICsgIC8qKg0KPj4+PiAr ICAgKiBFbXB0eSBjb25zdHJ1Y3RvciBmb3IgdW5pbml0aWFsaXplZCBmcmFnbWVudHMNCj4+ Pj4gKyAgICovDQo+Pj4+ICsgIE1hdGNoZWRGcmFnbWVudCAoKSA6IE1hdGNoZWRGcmFnbWVu dCAoIiIsIDAsIDApIHt9DQo+Pj4+ICsNCj4+Pj4gKyAgc3RkOjpzdHJpbmcgYXNfc3RyaW5n ICgpIGNvbnN0DQo+Pj4+ICsgIHsNCj4+Pj4gKyAgICByZXR1cm4gZnJhZ21lbnRfaWRlbnQg KyAiPSIgKyBzdGQ6OnRvX3N0cmluZyAodG9rZW5fb2Zmc2V0X2JlZ2luKSArICI6Ig0KPj4+ PiArICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcgKHRva2VuX29mZnNldF9lbmQpOw0KPj4+ PiArICB9DQo+Pj4+ICt9Ow0KPj4+PiArDQo+Pj4+ICtjbGFzcyBNYXRjaGVkRnJhZ21lbnRD b250YWluZXINCj4+Pj4gK3sNCj4+Pj4gK3B1YmxpYzoNCj4+Pj4gKyAgLy8gRG9lcyB0aGUg Y29udGFpbmVyIHJlZmVyIHRvIGEgc2ltcGxlIG1ldGF2YXJpYWJsZSwgZGlmZmVyZW50IGZy b20gYQ0KPj4+PiArICAvLyByZXBldGl0aW9uIHJlcGVhdGVkIG9uY2UNCj4+Pj4gKyAgZW51 bSBjbGFzcyBLaW5kDQo+Pj4+ICsgIHsNCj4+Pj4gKyAgICBNZXRhVmFyLA0KPj4+PiArICAg IFJlcGV0aXRpb24sDQo+Pj4+ICsgIH07DQo+Pj4+ICsNCj4+Pj4gKyAgTWF0Y2hlZEZyYWdt ZW50Q29udGFpbmVyIChzdGQ6OnZlY3RvcjxNYXRjaGVkRnJhZ21lbnQ+IGZyYWdtZW50cywN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQga2luZCA9IEtpbmQ6OlJl cGV0aXRpb24pDQo+Pj4+ICsgICAgOiBmcmFnbWVudHMgKGZyYWdtZW50cyksIGtpbmQgKGtp bmQpDQo+Pj4+ICsgIHt9DQo+Pj4+ICsNCj4+Pj4gKyAgLyoqDQo+Pj4+ICsgICAqIENyZWF0 ZSBhIHZhbGlkIGZyYWdtZW50IG1hdGNoZWQgemVybyB0aW1lcy4gVGhpcyBpcyB1c2VmdWwg Zm9yIHJlcGV0aXRpb25zDQo+Pj4+ICsgICAqIHdoaWNoIGFsbG93IHRoZSBhYnNlbmNlIG9m IGEgZnJhZ21lbnQsIHN1Y2ggYXMgKiBhbmQgPw0KPj4+PiArICAgKi8NCj4+Pj4gKyAgc3Rh dGljIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lciB6ZXJvICgpDQo+Pj4+ICsgIHsNCj4+Pj4g KyAgICByZXR1cm4gTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVyICh7fSk7DQo+Pj4+ICsgIH0N Cj4+Pj4gKw0KPj4+PiArICAvKioNCj4+Pj4gKyAgICogQ3JlYXRlIGEgdmFsaWQgZnJhZ21l bnQgbWF0Y2hlZCBvbmUgdGltZQ0KPj4+PiArICAgKi8NCj4+Pj4gKyAgc3RhdGljIE1hdGNo ZWRGcmFnbWVudENvbnRhaW5lciBtZXRhdmFyIChNYXRjaGVkRnJhZ21lbnQgZnJhZ21lbnQp DQo+Pj4+ICsgIHsNCj4+Pj4gKyAgICByZXR1cm4gTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVy ICh7ZnJhZ21lbnR9LCBLaW5kOjpNZXRhVmFyKTsNCj4+Pj4gKyAgfQ0KPj4+PiArDQo+Pj4+ ICsgIC8qKg0KPj4+PiArICAgKiBBZGQgYSBtYXRjaGVkIGZyYWdtZW50IHRvIHRoZSBjb250 YWluZXINCj4+Pj4gKyAgICovDQo+Pj4+ICsgIHZvaWQgYWRkX2ZyYWdtZW50IChNYXRjaGVk RnJhZ21lbnQgZnJhZ21lbnQpDQo+Pj4+ICsgIHsNCj4+Pj4gKyAgICBydXN0X2Fzc2VydCAo IWlzX3NpbmdsZV9mcmFnbWVudCAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgICBmcmFnbWVudHMu ZW1wbGFjZV9iYWNrIChmcmFnbWVudCk7DQo+Pj4+ICsgIH0NCj4+Pj4gKw0KPj4+PiArICBz aXplX3QgZ2V0X21hdGNoX2Ftb3VudCAoKSBjb25zdCB7IHJldHVybiBmcmFnbWVudHMuc2l6 ZSAoKTsgfQ0KPj4+PiArICBjb25zdCBzdGQ6OnZlY3RvcjxNYXRjaGVkRnJhZ21lbnQ+ICZn ZXRfZnJhZ21lbnRzICgpIGNvbnN0DQo+Pj4+ICsgIHsNCj4+Pj4gKyAgICByZXR1cm4gZnJh Z21lbnRzOw0KPj4+PiArICB9DQo+Pj4+ICsgIC8vIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRf ZnJhZ21lbnRfbmFtZSAoKSBjb25zdCB7IHJldHVybiBmcmFnbWVudF9uYW1lOyB9DQo+Pj4+ ICsNCj4+Pj4gKyAgYm9vbCBpc19zaW5nbGVfZnJhZ21lbnQgKCkgY29uc3QNCj4+Pj4gKyAg ew0KPj4+PiArICAgIHJldHVybiBnZXRfbWF0Y2hfYW1vdW50ICgpID09IDEgJiYga2luZCA9 PSBLaW5kOjpNZXRhVmFyOw0KPj4+PiArICB9DQo+Pj4+ICsNCj4+Pj4gKyAgY29uc3QgTWF0 Y2hlZEZyYWdtZW50IGdldF9zaW5nbGVfZnJhZ21lbnQgKCkgY29uc3QNCj4+Pj4gKyAgew0K Pj4+PiArICAgIHJ1c3RfYXNzZXJ0IChpc19zaW5nbGVfZnJhZ21lbnQgKCkpOw0KPj4+PiAr DQo+Pj4+ICsgICAgcmV0dXJuIGZyYWdtZW50c1swXTsNCj4+Pj4gKyAgfQ0KPj4+PiArDQo+ Pj4+ICsgIGNvbnN0IEtpbmQgJmdldF9raW5kICgpIGNvbnN0IHsgcmV0dXJuIGtpbmQ7IH0N Cj4+Pj4gKw0KPj4+PiArcHJpdmF0ZToNCj4+Pj4gKyAgLyoqDQo+Pj4+ICsgICAqIEZyYWdt ZW50cyBtYXRjaGVkIGBtYXRjaF9hbW91bnRgIHRpbWVzLiBUaGlzIGNhbiBiZSBhbiBlbXB0 eSB2ZWN0b3INCj4+Pj4gKyAgICogaW4gY2FzZSBoYXZpbmcgemVybyBtYXRjaGVzIGlzIGFs bG93ZWQgKGkuZSA/IG9yICogb3BlcmF0b3JzKQ0KPj4+PiArICAgKi8NCj4+Pj4gKyAgc3Rk Ojp2ZWN0b3I8TWF0Y2hlZEZyYWdtZW50PiBmcmFnbWVudHM7DQo+Pj4+ICsgIEtpbmQga2lu ZDsNCj4+Pj4gK307DQo+Pj4+ICsNCj4+Pj4gK2NsYXNzIFN1YnN0aXR1dGlvblNjb3BlDQo+ Pj4+ICt7DQo+Pj4+ICtwdWJsaWM6DQo+Pj4+ICsgIFN1YnN0aXR1dGlvblNjb3BlICgpIDog c3RhY2sgKCkge30NCj4+Pj4gKw0KPj4+PiArICB2b2lkIHB1c2ggKCkgeyBzdGFjay5wdXNo X2JhY2sgKHt9KTsgfQ0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBN YXRjaGVkRnJhZ21lbnRDb250YWluZXI+IHBvcCAoKQ0KPj4+PiArICB7DQo+Pj4+ICsgICAg YXV0byB0b3AgPSBzdGFjay5iYWNrICgpOw0KPj4+PiArICAgIHN0YWNrLnBvcF9iYWNrICgp Ow0KPj4+PiArICAgIHJldHVybiB0b3A7DQo+Pj4+ICsgIH0NCj4+Pj4gKw0KPj4+PiArICBz dGQ6Om1hcDxzdGQ6OnN0cmluZywgTWF0Y2hlZEZyYWdtZW50Q29udGFpbmVyPiAmcGVlayAo KQ0KPj4+PiArICB7DQo+Pj4+ICsgICAgcmV0dXJuIHN0YWNrLmJhY2sgKCk7DQo+Pj4+ICsg IH0NCj4+Pj4gKw0KPj4+PiArICAvKioNCj4+Pj4gKyAgICogSW5zZXJ0IGEgbmV3IG1hdGNo ZWQgbWV0YXZhciBpbnRvIHRoZSBjdXJyZW50IHN1YnN0aXR1dGlvbiBtYXANCj4+Pj4gKyAg ICovDQo+Pj4+ICsgIHZvaWQgaW5zZXJ0X21ldGF2YXIgKE1hdGNoZWRGcmFnbWVudCBmcmFn bWVudCkNCj4+Pj4gKyAgew0KPj4+PiArICAgIGF1dG8gJmN1cnJlbnRfbWFwID0gc3RhY2su YmFjayAoKTsNCj4+Pj4gKyAgICBhdXRvIGl0ID0gY3VycmVudF9tYXAuZmluZCAoZnJhZ21l bnQuZnJhZ21lbnRfaWRlbnQpOw0KPj4+PiArDQo+Pj4+ICsgICAgaWYgKGl0ID09IGN1cnJl bnRfbWFwLmVuZCAoKSkNCj4+Pj4gKyAgICAgIGN1cnJlbnRfbWFwLmluc2VydCAoe2ZyYWdt ZW50LmZyYWdtZW50X2lkZW50LA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICBN YXRjaGVkRnJhZ21lbnRDb250YWluZXI6Om1ldGF2YXIgKGZyYWdtZW50KX0pOw0KPj4+PiAr ICAgIGVsc2UNCj4+Pj4gKyAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsNCj4+Pj4gKyAgfQ0K Pj4+PiArDQo+Pj4+ICsgIC8qKg0KPj4+PiArICAgKiBBcHBlbmQgYSBuZXcgbWF0Y2hlZCBm cmFnbWVudCB0byBhIHJlcGV0aXRpb24gaW50byB0aGUgY3VycmVudCBzdWJzdGl0dXRpb24N Cj4+Pj4gKyAgICogbWFwDQo+Pj4+ICsgICAqLw0KPj4+PiArICB2b2lkIGFwcGVuZF9mcmFn bWVudCAoTWF0Y2hlZEZyYWdtZW50IGZyYWdtZW50KQ0KPj4+PiArICB7DQo+Pj4+ICsgICAg YXV0byAmY3VycmVudF9tYXAgPSBzdGFjay5iYWNrICgpOw0KPj4+PiArICAgIGF1dG8gaXQg PSBjdXJyZW50X21hcC5maW5kIChmcmFnbWVudC5mcmFnbWVudF9pZGVudCk7DQo+Pj4+ICsN Cj4+Pj4gKyAgICBpZiAoaXQgPT0gY3VycmVudF9tYXAuZW5kICgpKQ0KPj4+PiArICAgICAg Y3VycmVudF9tYXAuaW5zZXJ0ICgNCj4+Pj4gKyAgICAgICB7ZnJhZ21lbnQuZnJhZ21lbnRf aWRlbnQsIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lciAoe2ZyYWdtZW50fSl9KTsNCj4+Pj4g KyAgICBlbHNlDQo+Pj4+ICsgICAgICBpdC0+c2Vjb25kLmFkZF9mcmFnbWVudCAoZnJhZ21l bnQpOw0KPj4+PiArICB9DQo+Pj4+ICsNCj4+Pj4gKyAgdm9pZCBpbnNlcnRfbWF0Y2hlcyAo c3RkOjpzdHJpbmcga2V5LCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXIgbWF0Y2hlcykNCj4+ Pj4gKyAgew0KPj4+PiArICAgIGF1dG8gJmN1cnJlbnRfbWFwID0gc3RhY2suYmFjayAoKTsN Cj4+Pj4gKyAgICBhdXRvIGl0ID0gY3VycmVudF9tYXAuZmluZCAoa2V5KTsNCj4+Pj4gKyAg ICBydXN0X2Fzc2VydCAoaXQgPT0gY3VycmVudF9tYXAuZW5kICgpKTsNCj4+Pj4gKw0KPj4+ PiArICAgIGN1cnJlbnRfbWFwLmluc2VydCAoe2tleSwgbWF0Y2hlc30pOw0KPj4+PiArICB9 DQo+Pj4+ICsNCj4+Pj4gK3ByaXZhdGU6DQo+Pj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6bWFw PHN0ZDo6c3RyaW5nLCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI+PiBzdGFjazsNCj4+Pj4g K307DQo+Pj4+ICsNCj4+Pj4gKy8vIE9iamVjdCB1c2VkIHRvIHN0b3JlIHNoYXJlZCBkYXRh IChiZXR3ZWVuIGZ1bmN0aW9ucykgZm9yIG1hY3JvIGV4cGFuc2lvbi4NCj4+Pj4gK3N0cnVj dCBNYWNyb0V4cGFuZGVyDQo+Pj4+ICt7DQo+Pj4+ICsgIGVudW0gQ29udGV4dFR5cGUNCj4+ Pj4gKyAgew0KPj4+PiArICAgIElURU0sDQo+Pj4+ICsgICAgQkxPQ0ssDQo+Pj4+ICsgICAg RVhURVJOLA0KPj4+PiArICAgIFRZUEUsDQo+Pj4+ICsgICAgVFJBSVQsDQo+Pj4+ICsgICAg SU1QTCwNCj4+Pj4gKyAgICBUUkFJVF9JTVBMLA0KPj4+PiArICB9Ow0KPj4+PiArDQo+Pj4+ ICsgIEV4cGFuc2lvbkNmZyBjZmc7DQo+Pj4+ICsgIHVuc2lnbmVkIGludCBleHBhbnNpb25f ZGVwdGggPSAwOw0KPj4+PiArDQo+Pj4+ICsgIE1hY3JvRXhwYW5kZXIgKEFTVDo6Q3JhdGUg JmNyYXRlLCBFeHBhbnNpb25DZmcgY2ZnLCBTZXNzaW9uICZzZXNzaW9uKQ0KPj4+PiArICAg IDogY2ZnIChjZmcpLCBjcmF0ZSAoY3JhdGUpLCBzZXNzaW9uIChzZXNzaW9uKSwNCj4+Pj4g KyAgICAgIHN1Yl9zdGFjayAoU3Vic3RpdHV0aW9uU2NvcGUgKCkpLA0KPj4+PiArICAgICAg ZXhwYW5kZWRfZnJhZ21lbnQgKEFTVDo6QVNURnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKSks DQo+Pj4+ICsgICAgICByZXNvbHZlciAoUmVzb2x2ZXI6OlJlc29sdmVyOjpnZXQgKCkpLA0K Pj4+PiArICAgICAgbWFwcGluZ3MgKEFuYWx5c2lzOjpNYXBwaW5nczo6Z2V0ICgpKQ0KPj4+ PiArICB7fQ0KPj4+PiArDQo+Pj4+ICsgIH5NYWNyb0V4cGFuZGVyICgpID0gZGVmYXVsdDsN Cj4+Pj4gKw0KPj4+PiArICAvLyBFeHBhbmRzIGFsbCBtYWNyb3MgaW4gdGhlIGNyYXRlIHBh c3NlZCBpbi4NCj4+Pj4gKyAgdm9pZCBleHBhbmRfY3JhdGUgKCk7DQo+Pj4+ICsNCj4+Pj4g KyAgLyogRXhwYW5kcyBhIG1hY3JvIGludm9jYXRpb24gLSBwb3NzaWJseSBtYWtlIGJvdGgN Cj4+Pj4gKyAgICogaGF2ZSBzaW1pbGFyIGR1Y2stdHlwZWQgaW50ZXJmYWNlIGFuZCB1c2Ug dGVtcGxhdGVzPyovDQo+Pj4+ICsgIC8vIHNob3VsZCB0aGlzIGJlIHB1YmxpYyBvciBwcml2 YXRlPw0KPj4+PiArICB2b2lkIGV4cGFuZF9pbnZvYyAoQVNUOjpNYWNyb0ludm9jYXRpb24g Jmludm9jLCBib29sIGhhc19zZW1pY29sb24pOw0KPj4+PiArDQo+Pj4+ICsgIC8vIEV4cGFu ZHMgYSBzaW5nbGUgZGVjbGFyYXRpdmUgbWFjcm8uDQo+Pj4+ICsgIEFTVDo6QVNURnJhZ21l bnQgZXhwYW5kX2RlY2xfbWFjcm8gKExvY2F0aW9uIGxvY3VzLA0KPj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFjcm9JbnZvY0RhdGEgJmludm9j LA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVDo6TWFj cm9SdWxlc0RlZmluaXRpb24gJnJ1bGVzX2RlZiwNCj4+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBib29sIHNlbWljb2xvbik7DQo+Pj4+ICsNCj4+Pj4gKyAg dm9pZCBleHBhbmRfY2ZnX2F0dHJzIChBU1Q6OkF0dHJWZWMgJmF0dHJzKTsNCj4+Pj4gKyAg Ym9vbCBmYWlsc19jZmcgKGNvbnN0IEFTVDo6QXR0clZlYyAmYXR0cikgY29uc3Q7DQo+Pj4+ ICsgIGJvb2wgZmFpbHNfY2ZnX3dpdGhfZXhwYW5kIChBU1Q6OkF0dHJWZWMgJmF0dHJzKSBj b25zdDsNCj4+Pj4gKw0KPj4+PiArICBib29sIGRlcHRoX2V4Y2VlZHNfcmVjdXJzaW9uX2xp bWl0ICgpIGNvbnN0Ow0KPj4+PiArDQo+Pj4+ICsgIGJvb2wgdHJ5X21hdGNoX3J1bGUgKEFT VDo6TWFjcm9SdWxlICZtYXRjaF9ydWxlLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAg IEFTVDo6RGVsaW1Ub2tlblRyZWUgJmludm9jX3Rva2VuX3RyZWUpOw0KPj4+PiArDQo+Pj4+ ICsgIEFTVDo6QVNURnJhZ21lbnQgdHJhbnNjcmliZV9ydWxlICgNCj4+Pj4gKyAgICBBU1Q6 Ok1hY3JvUnVsZSAmbWF0Y2hfcnVsZSwgQVNUOjpEZWxpbVRva2VuVHJlZSAmaW52b2NfdG9r ZW5fdHJlZSwNCj4+Pj4gKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWF0Y2hlZEZyYWdt ZW50Q29udGFpbmVyPiAmbWF0Y2hlZF9mcmFnbWVudHMsDQo+Pj4+ICsgICAgYm9vbCBzZW1p Y29sb24sIENvbnRleHRUeXBlIGN0eCk7DQo+Pj4+ICsNCj4+Pj4gKyAgYm9vbCBtYXRjaF9m cmFnbWVudCAoUGFyc2VyPE1hY3JvSW52b2NMZXhlcj4gJnBhcnNlciwNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hGcmFnbWVudCAmZnJhZ21lbnQpOw0K Pj4+PiArDQo+Pj4+ICsgIGJvb2wgbWF0Y2hfdG9rZW4gKFBhcnNlcjxNYWNyb0ludm9jTGV4 ZXI+ICZwYXJzZXIsIEFTVDo6VG9rZW4gJnRva2VuKTsNCj4+Pj4gKw0KPj4+PiArICBib29s IG1hdGNoX3JlcGV0aXRpb24gKFBhcnNlcjxNYWNyb0ludm9jTGV4ZXI+ICZwYXJzZXIsDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBBU1Q6Ok1hY3JvTWF0Y2hSZXBldGl0aW9u ICZyZXApOw0KPj4+PiArDQo+Pj4+ICsgIGJvb2wgbWF0Y2hfbWF0Y2hlciAoUGFyc2VyPE1h Y3JvSW52b2NMZXhlcj4gJnBhcnNlciwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIEFT VDo6TWFjcm9NYXRjaGVyICZtYXRjaGVyKTsNCj4+Pj4gKw0KPj4+PiArICAvKioNCj4+Pj4g KyAgICogTWF0Y2ggYW55IGFtb3VudCBvZiBtYXRjaGVzDQo+Pj4+ICsgICAqDQo+Pj4+ICsg ICAqIEBwYXJhbSBwYXJzZXIgUGFyc2VyIHRvIHVzZSBmb3IgbWF0Y2hpbmcNCj4+Pj4gKyAg ICogQHBhcmFtIHJlcCBSZXBldGl0aW9uIHRvIHRyeSBhbmQgbWF0Y2gNCj4+Pj4gKyAgICog QHBhcmFtIG1hdGNoX2Ftb3VudCBSZWZlcmVuY2UgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGFt bW91bnQgb2Ygc3VjY2VzZnVsDQo+Pj4+ICsgICAqIGFuZCB2YWxpZCBtYXRjaGVzDQo+Pj4+ ICsgICAqDQo+Pj4+ICsgICAqIEBwYXJhbSBsb19ib3VuZCBMb3dlciBib3VuZCBvZiB0aGUg bWF0Y2hlci4gV2hlbiBzcGVjaWZpZWQsIHRoZSBtYXRjaGVyDQo+Pj4+ICsgICAqIHdpbGwg b25seSBzdWNjZWVkIGlmIGl0IHBhcnNlcyBhdCAqbGVhc3QqIGBsb19ib3VuZGAgZnJhZ21l bnRzLiBJZg0KPj4+PiArICAgKiB1bnNwZWNpZmllZCwgdGhlIG1hdGNoZXIgY291bGQgc3Vj Y2VlZCB3aGVuIHBhcnNpbmcgMCBmcmFnbWVudHMuDQo+Pj4+ICsgICAqDQo+Pj4+ICsgICAq IEBwYXJhbSBoaV9ib3VuZCBIaWdoZXIgYm91bmQgb2YgdGhlIG1hdGNoZXIuIFdoZW4gc3Bl Y2lmaWVkLCB0aGUgbWF0Y2hlcg0KPj4+PiArICAgKiB3aWxsIG9ubHkgc3VjY2VlZCBpZiBp dCBwYXJzZXMgKmxlc3MgdGhhbiogYGhpX2JvdW5kYCBmcmFnbWVudHMuIElmDQo+Pj4+ICsg ICAqIHVuc3BlY2lmaWVkLCB0aGUgbWF0Y2hlciBjb3VsZCBzdWNjZWVkIHdoZW4gcGFyc2lu ZyBhbiBpbmZpbml0eSBvZg0KPj4+PiArICAgKiBmcmFnbWVudHMuDQo+Pj4+ICsgICAqDQo+ Pj4+ICsgICAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGluZyB3YXMgc3VjY2Vzc2Z1bCBhbmQg d2l0aGluIHRoZSBnaXZlbiBsaW1pdHMsIGZhbHNlDQo+Pj4+ICsgICAqIG90aGVyd2lzZQ0K Pj4+PiArICAgKi8NCj4+Pj4gKyAgYm9vbCBtYXRjaF9uX21hdGNoZXMgKFBhcnNlcjxNYWNy b0ludm9jTGV4ZXI+ICZwYXJzZXIsDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgIEFT VDo6TWFjcm9NYXRjaFJlcGV0aXRpb24gJnJlcCwgc2l6ZV90ICZtYXRjaF9hbW91bnQsDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsb19ib3VuZCA9IDAsIHNpemVf dCBoaV9ib3VuZCA9IDApOw0KPj4+PiArDQo+Pj4+ICsgIHZvaWQgcHVzaF9jb250ZXh0IChD b250ZXh0VHlwZSB0KSB7IGNvbnRleHQucHVzaF9iYWNrICh0KTsgfQ0KPj4+PiArDQo+Pj4+ ICsgIENvbnRleHRUeXBlIHBvcF9jb250ZXh0ICgpDQo+Pj4+ICsgIHsNCj4+Pj4gKyAgICBy dXN0X2Fzc2VydCAoIWNvbnRleHQuZW1wdHkgKCkpOw0KPj4+PiArDQo+Pj4+ICsgICAgQ29u dGV4dFR5cGUgdCA9IGNvbnRleHQuYmFjayAoKTsNCj4+Pj4gKyAgICBjb250ZXh0LnBvcF9i YWNrICgpOw0KPj4+PiArDQo+Pj4+ICsgICAgcmV0dXJuIHQ7DQo+Pj4+ICsgIH0NCj4+Pj4g Kw0KPj4+PiArICBDb250ZXh0VHlwZSBwZWVrX2NvbnRleHQgKCkgeyByZXR1cm4gY29udGV4 dC5iYWNrICgpOyB9DQo+Pj4+ICsNCj4+Pj4gKyAgdm9pZCBzZXRfZXhwYW5kZWRfZnJhZ21l bnQgKEFTVDo6QVNURnJhZ21lbnQgJiZmcmFnbWVudCkNCj4+Pj4gKyAgew0KPj4+PiArICAg IGV4cGFuZGVkX2ZyYWdtZW50ID0gc3RkOjptb3ZlIChmcmFnbWVudCk7DQo+Pj4+ICsgIH0N Cj4+Pj4gKw0KPj4+PiArICBBU1Q6OkFTVEZyYWdtZW50IHRha2VfZXhwYW5kZWRfZnJhZ21l bnQgKEFTVDo6QVNUVmlzaXRvciAmdmlzKQ0KPj4+PiArICB7DQo+Pj4+ICsgICAgQVNUOjpB U1RGcmFnbWVudCBvbGRfZnJhZ21lbnQgPSBzdGQ6Om1vdmUgKGV4cGFuZGVkX2ZyYWdtZW50 KTsNCj4+Pj4gKyAgICBhdXRvIGFjY3VtdWxhdG9yID0gc3RkOjp2ZWN0b3I8QVNUOjpTaW5n bGVBU1ROb2RlPiAoKTsNCj4+Pj4gKyAgICBleHBhbmRlZF9mcmFnbWVudCA9IEFTVDo6QVNU RnJhZ21lbnQ6OmNyZWF0ZV9lcnJvciAoKTsNCj4+Pj4gKw0KPj4+PiArICAgIGZvciAoYXV0 byAmbm9kZSA6IG9sZF9mcmFnbWVudC5nZXRfbm9kZXMgKCkpDQo+Pj4+ICsgICAgICB7DQo+ Pj4+ICsgICAgICAgZXhwYW5zaW9uX2RlcHRoKys7DQo+Pj4+ICsgICAgICAgbm9kZS5hY2Nl cHRfdmlzICh2aXMpOw0KPj4+PiArICAgICAgIC8vIHdlJ2xsIGRlY2lkZSB0aGUgbmV4dCBt b3ZlIGFjY29yZGluZyB0byB0aGUgb3V0Y29tZSBvZiB0aGUgbWFjcm8NCj4+Pj4gKyAgICAg ICAvLyBleHBhbnNpb24NCj4+Pj4gKyAgICAgICBpZiAoZXhwYW5kZWRfZnJhZ21lbnQuaXNf ZXJyb3IgKCkpDQo+Pj4+ICsgICAgICAgICBhY2N1bXVsYXRvci5wdXNoX2JhY2sgKG5vZGUp OyAvLyBpZiBleHBhbnNpb24gZmFpbHMsIHRoZXJlIG1pZ2h0IGJlIGENCj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1tYWNybyBleHByZXNz aW9uIHdlIG5lZWQgdG8ga2VlcA0KPj4+PiArICAgICAgIGVsc2UNCj4+Pj4gKyAgICAgICAg IHsNCj4+Pj4gKyAgICAgICAgICAgLy8gaWYgZXhwYW5zaW9uIHN1Y2NlZWRlZCwgdGhlbiB3 ZSBuZWVkIHRvIG1lcmdlIHRoZSBmcmFnbWVudCB3aXRoDQo+Pj4+ICsgICAgICAgICAgIC8v IHRoZSBjb250ZW50cyBpbiB0aGUgYWNjdW11bGF0b3IsIHNvIHRoYXQgb3VyIGZpbmFsIGV4 cGFuc2lvbg0KPj4+PiArICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBjb250YWluIG5vbi1t YWNybyBub2RlcyBhcyBpdCBzaG91bGQNCj4+Pj4gKyAgICAgICAgICAgYXV0byBuZXdfbm9k ZXMgPSBleHBhbmRlZF9mcmFnbWVudC5nZXRfbm9kZXMgKCk7DQo+Pj4+ICsgICAgICAgICAg IHN0ZDo6bW92ZSAobmV3X25vZGVzLmJlZ2luICgpLCBuZXdfbm9kZXMuZW5kICgpLA0KPj4+ PiArICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlciAoYWNjdW11bGF0 b3IpKTsNCj4+Pj4gKyAgICAgICAgICAgZXhwYW5kZWRfZnJhZ21lbnQgPSBBU1Q6OkFTVEZy YWdtZW50IChhY2N1bXVsYXRvcik7DQo+Pj4+ICsgICAgICAgICB9DQo+Pj4+ICsgICAgICAg ZXhwYW5zaW9uX2RlcHRoLS07DQo+Pj4+ICsgICAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgICBy ZXR1cm4gb2xkX2ZyYWdtZW50Ow0KPj4+PiArICB9DQo+Pj4+ICsNCj4+Pj4gK3ByaXZhdGU6 DQo+Pj4+ICsgIEFTVDo6Q3JhdGUgJmNyYXRlOw0KPj4+PiArICBTZXNzaW9uICZzZXNzaW9u Ow0KPj4+PiArICBTdWJzdGl0dXRpb25TY29wZSBzdWJfc3RhY2s7DQo+Pj4+ICsgIHN0ZDo6 dmVjdG9yPENvbnRleHRUeXBlPiBjb250ZXh0Ow0KPj4+PiArICBBU1Q6OkFTVEZyYWdtZW50 IGV4cGFuZGVkX2ZyYWdtZW50Ow0KPj4+PiArDQo+Pj4+ICtwdWJsaWM6DQo+Pj4+ICsgIFJl c29sdmVyOjpSZXNvbHZlciAqcmVzb2x2ZXI7DQo+Pj4+ICsgIEFuYWx5c2lzOjpNYXBwaW5n cyAqbWFwcGluZ3M7DQo+Pj4+ICt9Ow0KPj4+PiArDQo+Pj4+ICt9IC8vIG5hbWVzcGFjZSBS dXN0DQo+Pj4+ICsNCj4+Pj4gKyNlbmRpZg0KPj4+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3Qv ZXhwYW5kL3J1c3QtbWFjcm8taW52b2MtbGV4ZXIuY2MgYi9nY2MvcnVzdC9leHBhbmQvcnVz dC1tYWNyby1pbnZvYy1sZXhlci5jYw0KPj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4+ PiBpbmRleCAwMDAwMDAwMDAwMC4uOGE0M2QyOWUwZDENCj4+Pj4gLS0tIC9kZXYvbnVsbA0K Pj4+PiArKysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1pbnZvYy1sZXhlci5jYw0K Pj4+PiBAQCAtMCwwICsxLDI5IEBADQo+Pj4+ICsjaW5jbHVkZSAicnVzdC1tYWNyby1pbnZv Yy1sZXhlci5oIg0KPj4+PiArDQo+Pj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+Pj4+ICsNCj4+ Pj4gK2NvbnN0X1Rva2VuUHRyDQo+Pj4+ICtNYWNyb0ludm9jTGV4ZXI6OnBlZWtfdG9rZW4g KGludCBuKQ0KPj4+PiArew0KPj4+PiArICBpZiAoKG9mZnMgKyBuKSA+PSB0b2tlbl9zdHJl YW0uc2l6ZSAoKSkNCj4+Pj4gKyAgICByZXR1cm4gVG9rZW46Om1ha2UgKEVORF9PRl9GSUxF LCBMb2NhdGlvbiAoKSk7DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIHRva2VuX3N0cmVhbS5h dCAob2ZmcyArIG4pLT5nZXRfdG9rX3B0ciAoKTsNCj4+Pj4gK30NCj4+Pj4gKw0KPj4+PiAr Ly8gQWR2YW5jZXMgY3VycmVudCB0b2tlbiB0byBuICsgMSB0b2tlbnMgYWhlYWQgb2YgY3Vy cmVudCBwb3NpdGlvbi4NCj4+Pj4gK3ZvaWQNCj4+Pj4gK01hY3JvSW52b2NMZXhlcjo6c2tp cF90b2tlbiAoaW50IG4pDQo+Pj4+ICt7DQo+Pj4+ICsgIG9mZnMgKz0gKG4gKyAxKTsNCj4+ Pj4gK30NCj4+Pj4gKw0KPj4+PiArdm9pZA0KPj4+PiArTWFjcm9JbnZvY0xleGVyOjpzcGxp dF9jdXJyZW50X3Rva2VuIChUb2tlbklkIG5ld19sZWZ0IF9fYXR0cmlidXRlX18gKCh1bnVz ZWQpKSwNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tl bklkIG5ld19yaWdodA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkNCj4+Pj4gK3sNCj4+Pj4gKyAgLy8gRklY TUUNCj4+Pj4gKyAgZ2NjX3VucmVhY2hhYmxlICgpOw0KPj4+PiArfQ0KPj4+PiArfSAvLyBu YW1lc3BhY2UgUnVzdA0KPj4+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvZXhwYW5kL3J1c3Qt bWFjcm8taW52b2MtbGV4ZXIuaCBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3JvLWludm9j LWxleGVyLmgNCj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+Pj4gaW5kZXggMDAwMDAw MDAwMDAuLjBmZDQ1NTRkMDJmDQo+Pj4+IC0tLSAvZGV2L251bGwNCj4+Pj4gKysrIGIvZ2Nj L3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8taW52b2MtbGV4ZXIuaA0KPj4+PiBAQCAtMCwwICsx LDY0IEBADQo+Pj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24sIEluYy4NCj4+Pj4gKw0KPj4+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQg b2YgR0NDLg0KPj4+PiArDQo+Pj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KPj4+PiArLy8gdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUNCj4+Pj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+Pj4+ICsvLyB2ZXJzaW9u Lg0KPj4+PiArDQo+Pj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+Pj4+ICsvLyBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElU WSBvcg0KPj4+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+Pj4+ICsvLyBmb3IgbW9yZSBkZXRh aWxzLg0KPj4+PiArDQo+Pj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4+PiArLy8gYWxvbmcgd2l0 aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+Pj4gKy8vIDxo dHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+Pj4gKw0KPj4+PiArI2lmbmRlZiBS VVNUX01BQ1JPX0lOVk9DX0xFWEVSX0gNCj4+Pj4gKyNkZWZpbmUgUlVTVF9NQUNST19JTlZP Q19MRVhFUl9IDQo+Pj4+ICsNCj4+Pj4gKyNpbmNsdWRlICJydXN0LWFzdC5oIg0KPj4+PiAr DQo+Pj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+Pj4+ICtjbGFzcyBNYWNyb0ludm9jTGV4ZXIN Cj4+Pj4gK3sNCj4+Pj4gK3B1YmxpYzoNCj4+Pj4gKyAgTWFjcm9JbnZvY0xleGVyIChzdGQ6 OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+IHN0cmVhbSkNCj4+Pj4gKyAg ICA6IG9mZnMgKDApLCB0b2tlbl9zdHJlYW0gKHN0ZDo6bW92ZSAoc3RyZWFtKSkNCj4+Pj4g KyAge30NCj4+Pj4gKw0KPj4+PiArICAvLyBSZXR1cm5zIHRva2VuIG4gdG9rZW5zIGFoZWFk IG9mIGN1cnJlbnQgcG9zaXRpb24uDQo+Pj4+ICsgIGNvbnN0X1Rva2VuUHRyIHBlZWtfdG9r ZW4gKGludCBuKTsNCj4+Pj4gKw0KPj4+PiArICAvLyBQZWVrcyB0aGUgY3VycmVudCB0b2tl bi4NCj4+Pj4gKyAgY29uc3RfVG9rZW5QdHIgcGVla190b2tlbiAoKSB7IHJldHVybiBwZWVr X3Rva2VuICgwKTsgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIEFkdmFuY2VzIGN1cnJlbnQgdG9r ZW4gdG8gbiArIDEgdG9rZW5zIGFoZWFkIG9mIGN1cnJlbnQgcG9zaXRpb24uDQo+Pj4+ICsg IHZvaWQgc2tpcF90b2tlbiAoaW50IG4pOw0KPj4+PiArDQo+Pj4+ICsgIC8vIFNraXBzIHRo ZSBjdXJyZW50IHRva2VuLg0KPj4+PiArICB2b2lkIHNraXBfdG9rZW4gKCkgeyBza2lwX3Rv a2VuICgwKTsgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIFNwbGl0cyB0aGUgY3VycmVudCB0b2tl biBpbnRvIHR3by4gSW50ZW5kZWQgZm9yIHVzZSB3aXRoIG5lc3RlZCBnZW5lcmljcw0KPj4+ PiArICAvLyBjbG9zZXMgKGkuZS4gVDxVPFg+PiB3aGVyZSA+PiBpcyB3cm9uZ2x5IGxleGVk IGFzIG9uZSB0b2tlbikuIE5vdGUgdGhhdA0KPj4+PiArICAvLyB0aGlzIHdpbGwgb25seSB3 b3JrIHdpdGggInNpbXBsZSIgdG9rZW5zIGxpa2UgcHVuY3R1YXRpb24uDQo+Pj4+ICsgIHZv aWQgc3BsaXRfY3VycmVudF90b2tlbiAoVG9rZW5JZCBuZXdfbGVmdCwgVG9rZW5JZCBuZXdf cmlnaHQpOw0KPj4+PiArDQo+Pj4+ICsgIHN0ZDo6c3RyaW5nIGdldF9maWxlbmFtZSAoKSBj b25zdA0KPj4+PiArICB7DQo+Pj4+ICsgICAgLy8gRklYTUUNCj4+Pj4gKyAgICBnY2NfdW5y ZWFjaGFibGUgKCk7DQo+Pj4+ICsgICAgcmV0dXJuICJGSVhNRSI7DQo+Pj4+ICsgIH0NCj4+ Pj4gKw0KPj4+PiArICBzaXplX3QgZ2V0X29mZnMgKCkgY29uc3QgeyByZXR1cm4gb2Zmczsg fQ0KPj4+PiArDQo+Pj4+ICtwcml2YXRlOg0KPj4+PiArICBzaXplX3Qgb2ZmczsNCj4+Pj4g KyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+PiB0b2tlbl9zdHJl YW07DQo+Pj4+ICt9Ow0KPj4+PiArfSAvLyBuYW1lc3BhY2UgUnVzdA0KPj4+PiArDQo+Pj4+ ICsjZW5kaWYgLy8gUlVTVF9NQUNST19JTlZPQ19MRVhFUl9IDQo+Pj4+IGRpZmYgLS1naXQg YS9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1zdWJzdGl0dXRlLWN0eC5jYyBiL2djYy9y dXN0L2V4cGFuZC9ydXN0LW1hY3JvLXN1YnN0aXR1dGUtY3R4LmNjDQo+Pj4+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0DQo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwLi45NTkyZDJkMmE5ZQ0KPj4+ PiAtLS0gL2Rldi9udWxsDQo+Pj4+ICsrKyBiL2djYy9ydXN0L2V4cGFuZC9ydXN0LW1hY3Jv LXN1YnN0aXR1dGUtY3R4LmNjDQo+Pj4+IEBAIC0wLDAgKzEsMzEyIEBADQo+Pj4+ICsjaW5j bHVkZSAicnVzdC1tYWNyby1zdWJzdGl0dXRlLWN0eC5oIg0KPj4+PiArDQo+Pj4+ICtuYW1l c3BhY2UgUnVzdCB7DQo+Pj4+ICsNCj4+Pj4gK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0 cjxBU1Q6OlRva2VuPj4NCj4+Pj4gK1N1YnN0aXR1dGVDdHg6OnN1YnN0aXR1dGVfbWV0YXZh ciAoc3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+ICZtZXRhdmFyKQ0KPj4+PiArew0KPj4+ PiArICBhdXRvIG1ldGF2YXJfbmFtZSA9IG1ldGF2YXItPmdldF9zdHIgKCk7DQo+Pj4+ICsN Cj4+Pj4gKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+PiBleHBh bmRlZDsNCj4+Pj4gKyAgYXV0byBpdCA9IGZyYWdtZW50cy5maW5kIChtZXRhdmFyX25hbWUp Ow0KPj4+PiArICBpZiAoaXQgPT0gZnJhZ21lbnRzLmVuZCAoKSkNCj4+Pj4gKyAgICB7DQo+ Pj4+ICsgICAgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCB0b2tlbg0KPj4+ PiArICAgICAgZXhwYW5kZWQucHVzaF9iYWNrIChtZXRhdmFyLT5jbG9uZV90b2tlbiAoKSk7 DQo+Pj4+ICsgICAgfQ0KPj4+PiArICBlbHNlDQo+Pj4+ICsgICAgew0KPj4+PiArICAgICAg Ly8gSWYgd2UgYXJlIGV4cGFuZGluZyBhIG1ldGF2YXIgd2hpY2ggaGFzIGEgbG9mIG9mIG1h dGNoZXMsIHdlIGFyZQ0KPj4+PiArICAgICAgLy8gY3VycmVudGx5IGV4cGFuZGluZyBhIHJl cGV0aXRpb24gbWV0YXZhciAtIG5vdCBhIHNpbXBsZSBtZXRhdmFyLiBXZQ0KPj4+PiArICAg ICAgLy8gbmVlZCB0byBlcnJvciBvdXQgYW5kIGluZm9ybSB0aGUgdXNlci4NCj4+Pj4gKyAg ICAgIC8vIEFzc29jaWF0ZWQgdGVzdCBjYXNlIGZvciBhbiBleGFtcGxlOiBjb21waWxlL21h Y3JvLWlzc3VlMTIyNC5ycw0KPj4+PiArICAgICAgaWYgKGl0LT5zZWNvbmQuZ2V0X21hdGNo X2Ftb3VudCAoKSAhPSAxKQ0KPj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIHJ1c3Rf ZXJyb3JfYXQgKG1ldGF2YXItPmdldF9sb2N1cyAoKSwNCj4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICJtZXRhdmFyaWFibGUgaXMgc3RpbGwgcmVwZWF0aW5nIGF0IHRoaXMgZGVw dGgiKTsNCj4+Pj4gKyAgICAgICAgIHJ1c3RfaW5mb3JtICgNCj4+Pj4gKyAgICAgICAgICAg bWV0YXZhci0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAgICAgICAieW91IHByb2JhYmx5 IGZvcmdvdCB0aGUgcmVwZXRpdGlvbiBvcGVyYXRvcjogJTwlcyVzJXMlPiIsICIkKCIsDQo+ Pj4+ICsgICAgICAgICAgIG1ldGF2YXItPmFzX3N0cmluZyAoKS5jX3N0ciAoKSwgIikqIik7 DQo+Pj4+ICsgICAgICAgICByZXR1cm4gZXhwYW5kZWQ7DQo+Pj4+ICsgICAgICAgfQ0KPj4+ PiArDQo+Pj4+ICsgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHZlY3RvciB3aGVu IGV4cGFuZGluZyByZXBldGl0aW9ucy4NCj4+Pj4gKyAgICAgIC8vIEp1c3QgYWNjZXNzIHRo ZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IuDQo+Pj4+ICsgICAgICBhdXRvICZmcmFn ID0gaXQtPnNlY29uZC5nZXRfc2luZ2xlX2ZyYWdtZW50ICgpOw0KPj4+PiArICAgICAgZm9y IChzaXplX3Qgb2ZmcyA9IGZyYWcudG9rZW5fb2Zmc2V0X2JlZ2luOyBvZmZzIDwgZnJhZy50 b2tlbl9vZmZzZXRfZW5kOw0KPj4+PiArICAgICAgICAgIG9mZnMrKykNCj4+Pj4gKyAgICAg ICB7DQo+Pj4+ICsgICAgICAgICBhdXRvICZ0b2sgPSBpbnB1dC5hdCAob2Zmcyk7DQo+Pj4+ ICsgICAgICAgICBleHBhbmRlZC5wdXNoX2JhY2sgKHRvay0+Y2xvbmVfdG9rZW4gKCkpOw0K Pj4+PiArICAgICAgIH0NCj4+Pj4gKyAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIGV4 cGFuZGVkOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtib29sDQo+Pj4+ICtTdWJzdGl0dXRl Q3R4OjpjaGVja19yZXBldGl0aW9uX2Ftb3VudCAoc2l6ZV90IHBhdHRlcm5fc3RhcnQsDQo+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGF0 dGVybl9lbmQsDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzaXplX3QgJmV4cGVjdGVkX3JlcGV0aXRpb25fYW1vdW50KQ0KPj4+PiArew0KPj4+PiAr ICBib29sIGZpcnN0X2ZyYWdtZW50X2ZvdW5kID0gZmFsc2U7DQo+Pj4+ICsgIGJvb2wgaXNf dmFsaWQgPSB0cnVlOw0KPj4+PiArDQo+Pj4+ICsgIGZvciAoc2l6ZV90IGkgPSBwYXR0ZXJu X3N0YXJ0OyBpIDwgcGF0dGVybl9lbmQ7IGkrKykNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAg ICBpZiAobWFjcm8uYXQgKGkpLT5nZXRfaWQgKCkgPT0gRE9MTEFSX1NJR04pDQo+Pj4+ICsg ICAgICAgew0KPj4+PiArICAgICAgICAgYXV0byAmZnJhZ190b2tlbiA9IG1hY3JvLmF0IChp ICsgMSk7DQo+Pj4+ICsgICAgICAgICBpZiAoZnJhZ190b2tlbi0+Z2V0X2lkICgpID09IElE RU5USUZJRVIpDQo+Pj4+ICsgICAgICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAgICBhdXRv IGl0ID0gZnJhZ21lbnRzLmZpbmQgKGZyYWdfdG9rZW4tPmdldF9zdHIgKCkpOw0KPj4+PiAr ICAgICAgICAgICAgIGlmIChpdCA9PSBmcmFnbWVudHMuZW5kICgpKQ0KPj4+PiArICAgICAg ICAgICAgICAgew0KPj4+PiArICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVwZXRpdGlv biBpcyBub3QgYW55dGhpbmcgd2Uga25vdyAoaWUgbm8gZGVjbGFyZWQNCj4+Pj4gKyAgICAg ICAgICAgICAgICAgLy8gbWV0YXZhcnMsIG9yIG1ldGF2YXJzIHdoaWNoIGFyZW4ndCBwcmVz ZW50IGluIHRoZQ0KPj4+PiArICAgICAgICAgICAgICAgICAvLyBmcmFnbWVudCksIHdlIGNh biBqdXN0IGVycm9yIG91dC4gTm8gbmVlZCB0byBwYXN0ZSB0aGUNCj4+Pj4gKyAgICAgICAg ICAgICAgICAgLy8gdG9rZW5zIGFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLg0KPj4+PiAr ICAgICAgICAgICAgICAgICBydXN0X2Vycm9yX2F0IChmcmFnX3Rva2VuLT5nZXRfbG9jdXMg KCksDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyICVz IHVzZWQgaW4gcmVwZXRpdGlvbiBkb2VzIG5vdCBleGlzdCIsDQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZyYWdfdG9rZW4tPmdldF9zdHIgKCkuY19zdHIgKCkp Ow0KPj4+PiArDQo+Pj4+ICsgICAgICAgICAgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7DQo+ Pj4+ICsgICAgICAgICAgICAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAgICAgICBhdXRv ICZmcmFnbWVudCA9IGl0LT5zZWNvbmQ7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAgICAgICBz aXplX3QgcmVwZWF0X2Ftb3VudCA9IGZyYWdtZW50LmdldF9tYXRjaF9hbW91bnQgKCk7DQo+ Pj4+ICsgICAgICAgICAgICAgaWYgKCFmaXJzdF9mcmFnbWVudF9mb3VuZCkNCj4+Pj4gKyAg ICAgICAgICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAgICAgICAgZmlyc3RfZnJhZ21lbnRf Zm91bmQgPSB0cnVlOw0KPj4+PiArICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXBldGl0 aW9uX2Ftb3VudCA9IHJlcGVhdF9hbW91bnQ7DQo+Pj4+ICsgICAgICAgICAgICAgICB9DQo+ Pj4+ICsgICAgICAgICAgICAgZWxzZQ0KPj4+PiArICAgICAgICAgICAgICAgew0KPj4+PiAr ICAgICAgICAgICAgICAgICBpZiAocmVwZWF0X2Ftb3VudCAhPSBleHBlY3RlZF9yZXBldGl0 aW9uX2Ftb3VudA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgJiYgIWZyYWdtZW50Lmlz X3NpbmdsZV9mcmFnbWVudCAoKSkNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICB7DQo+Pj4+ ICsgICAgICAgICAgICAgICAgICAgICBydXN0X2Vycm9yX2F0ICgNCj4+Pj4gKyAgICAgICAg ICAgICAgICAgICAgICAgZnJhZ190b2tlbi0+Z2V0X2xvY3VzICgpLA0KPj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAiZGlmZmVyZW50IGFtb3VudCBvZiBtYXRjaGVzIHVzZWQgaW4g bWVyZ2VkICINCj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGV0aXRpb25zOiBl eHBlY3RlZCAlbHUsIGdvdCAlbHUiLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAo dW5zaWduZWQgbG9uZykgZXhwZWN0ZWRfcmVwZXRpdGlvbl9hbW91bnQsDQo+Pj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSByZXBlYXRfYW1vdW50KTsNCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7DQo+Pj4+ICsgICAg ICAgICAgICAgICAgICAgfQ0KPj4+PiArICAgICAgICAgICAgICAgfQ0KPj4+PiArICAgICAg ICAgICB9DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICBy ZXR1cm4gaXNfdmFsaWQ7DQo+Pj4+ICt9DQo+Pj4+ICsNCj4+Pj4gK3N0ZDo6dmVjdG9yPHN0 ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4NCj4+Pj4gK1N1YnN0aXR1dGVDdHg6OnN1YnN0 aXR1dGVfcmVwZXRpdGlvbiAoDQo+Pj4+ICsgIHNpemVfdCBwYXR0ZXJuX3N0YXJ0LCBzaXpl X3QgcGF0dGVybl9lbmQsDQo+Pj4+ICsgIHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPiBz ZXBhcmF0b3JfdG9rZW4pDQo+Pj4+ICt7DQo+Pj4+ICsgIHJ1c3RfYXNzZXJ0IChwYXR0ZXJu X2VuZCA8IG1hY3JvLnNpemUgKCkpOw0KPj4+PiArDQo+Pj4+ICsgIHNpemVfdCByZXBlYXRf YW1vdW50ID0gMDsNCj4+Pj4gKyAgaWYgKCFjaGVja19yZXBldGl0aW9uX2Ftb3VudCAocGF0 dGVybl9zdGFydCwgcGF0dGVybl9lbmQsIHJlcGVhdF9hbW91bnQpKQ0KPj4+PiArICAgIHJl dHVybiB7fTsNCj4+Pj4gKw0KPj4+PiArICBydXN0X2RlYnVnICgicmVwZXRpdGlvbiBhbW91 bnQgdG8gdXNlOiAlbHUiLCAodW5zaWduZWQgbG9uZykgcmVwZWF0X2Ftb3VudCk7DQo+Pj4+ ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4gZXhwYW5kZWQ7 DQo+Pj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4gbmV3 X21hY3JvOw0KPj4+PiArDQo+Pj4+ICsgIC8vIFdlIHdhbnQgdG8gZ2VuZXJhdGUgYSAibmV3 IG1hY3JvIiB0byBzdWJzdGl0dXRlIHdpdGguIFRoaXMgbmV3IG1hY3JvDQo+Pj4+ICsgIC8v IHNob3VsZCBjb250YWluIG9ubHkgdGhlIHRva2VucyBpbnNpZGUgdGhlIHBhdHRlcm4NCj4+ Pj4gKyAgZm9yIChzaXplX3QgdG9rX2lkeCA9IHBhdHRlcm5fc3RhcnQ7IHRva19pZHggPCBw YXR0ZXJuX2VuZDsgdG9rX2lkeCsrKQ0KPj4+PiArICAgIG5ld19tYWNyby5lbXBsYWNlX2Jh Y2sgKG1hY3JvLmF0ICh0b2tfaWR4KS0+Y2xvbmVfdG9rZW4gKCkpOw0KPj4+PiArDQo+Pj4+ ICsgIC8vIFRoZW4sIHdlIHdhbnQgdG8gY3JlYXRlIGEgc3Vic2V0IG9mIHRoZSBtYXRjaGVz IHNvIHRoYXQNCj4+Pj4gKyAgLy8gYHN1YnN0aXR1dGVfdG9rZW5zKClgIGNhbiBvbmx5IHNl ZSBvbmUgZnJhZ21lbnQgcGVyIG1ldGF2YXIuIExldCdzIHNheSB3ZQ0KPj4+PiArICAvLyBo YXZlIHRoZSBmb2xsb3dpbmcgdXNlciBpbnB1dDogKDEgMTQ1ICdoJykNCj4+Pj4gKyAgLy8g b24gdGhlIGZvbGxvd2luZyBtYXRjaCBhcm06ICgkKCRsaXQ6bGl0ZXJhbCkqKQ0KPj4+PiAr ICAvLyB3aGljaCBjYXVzZXMgdGhlIGZvbGxvd2luZyBtYXRjaGVzOiB7ICJsaXQiOiBbMSwg MTQ1LCAnaCddIH0NCj4+Pj4gKyAgLy8NCj4+Pj4gKyAgLy8gVGhlIHBhdHRlcm4gKG5ld19t YWNybykgaXMgYCRsaXQ6bGl0ZXJhbGANCj4+Pj4gKyAgLy8gVGhlIGZpcnN0IHRpbWUgd2Ug ZXhwYW5kIGl0LCB3ZSB3YW50ICRsaXQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHRva2VuOiAx DQo+Pj4+ICsgIC8vIFRoZSBzZWNvbmQgdGltZSwgMTQ1DQo+Pj4+ICsgIC8vIFRoZSB0aGly ZCBhbmQgZmluYWwgdGltZSwgJ2gnDQo+Pj4+ICsgIC8vDQo+Pj4+ICsgIC8vIEluIG9yZGVy IHRvIGRvIHNvIHdlIG11c3QgY3JlYXRlICJzdWIgbWFwcyIsIHdoaWNoIG9ubHkgY29udGFp biBwYXJ0cyBvZg0KPj4+PiArICAvLyB0aGUgb3JpZ2luYWwgbWF0Y2hlcw0KPj4+PiArICAv LyBzdWItbWFwczogWyB7ICJsaXQiOiAxIH0sIHsgImxpdCI6IDE0NSB9LCB7ICJsaXQiOiAn aCcgfSBdDQo+Pj4+ICsgIC8vDQo+Pj4+ICsgIC8vIGFuZCBnaXZlIHRoZW0gdG8gYHN1YnN0 aXR1dGVfdG9rZW5zYCBvbmUgYnkgb25lLg0KPj4+PiArDQo+Pj4+ICsgIGZvciAoc2l6ZV90 IGkgPSAwOyBpIDwgcmVwZWF0X2Ftb3VudDsgaSsrKQ0KPj4+PiArICAgIHsNCj4+Pj4gKyAg ICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNYXRjaGVkRnJhZ21lbnRDb250YWluZXI+IHN1 Yl9tYXA7DQo+Pj4+ICsgICAgICBmb3IgKGF1dG8gJmt2X21hdGNoIDogZnJhZ21lbnRzKQ0K Pj4+PiArICAgICAgIHsNCj4+Pj4gKyAgICAgICAgIE1hdGNoZWRGcmFnbWVudCBzdWJfZnJh Z21lbnQ7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICAgIC8vIEZJWE1FOiBIYWNrOiBJZiBhIGZy YWdtZW50IGlzIG5vdCByZXBlYXRlZCwgaG93IGRvZXMgaXQgZml0IGluIHRoZQ0KPj4+PiAr ICAgICAgICAgLy8gc3VibWFwPyBEbyB3ZSByZWFsbHkgd2FudCB0byBleHBhbmQgaXQ/IElz IHRoaXMgbm9ybWFsIGJlaGF2aW9yPw0KPj4+PiArICAgICAgICAgaWYgKGt2X21hdGNoLnNl Y29uZC5pc19zaW5nbGVfZnJhZ21lbnQgKCkpDQo+Pj4+ICsgICAgICAgICAgIHN1Yl9mcmFn bWVudCA9IGt2X21hdGNoLnNlY29uZC5nZXRfc2luZ2xlX2ZyYWdtZW50ICgpOw0KPj4+PiAr ICAgICAgICAgZWxzZQ0KPj4+PiArICAgICAgICAgICBzdWJfZnJhZ21lbnQgPSBrdl9tYXRj aC5zZWNvbmQuZ2V0X2ZyYWdtZW50cyAoKVtpXTsNCj4+Pj4gKw0KPj4+PiArICAgICAgICAg c3ViX21hcC5pbnNlcnQgKA0KPj4+PiArICAgICAgICAgICB7a3ZfbWF0Y2guZmlyc3QsIE1h dGNoZWRGcmFnbWVudENvbnRhaW5lcjo6bWV0YXZhciAoc3ViX2ZyYWdtZW50KX0pOw0KPj4+ PiArICAgICAgIH0NCj4+Pj4gKw0KPj4+PiArICAgICAgYXV0byBzdWJzdGl0dXRlX2NvbnRl eHQgPSBTdWJzdGl0dXRlQ3R4IChpbnB1dCwgbmV3X21hY3JvLCBzdWJfbWFwKTsNCj4+Pj4g KyAgICAgIGF1dG8gbmV3X3Rva2VucyA9IHN1YnN0aXR1dGVfY29udGV4dC5zdWJzdGl0dXRl X3Rva2VucyAoKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgcmVw ZXRpdGlvbiwgYnV0IGFkZCB0aGUgc2VwYXJhdG9yIHRvIHRoZSBleHBhbmRlZA0KPj4+PiAr ICAgICAgLy8gdG9rZW5zIGlmIGl0IGlzIHByZXNlbnQNCj4+Pj4gKyAgICAgIGlmIChpICE9 IDAgJiYgc2VwYXJhdG9yX3Rva2VuKQ0KPj4+PiArICAgICAgIGV4cGFuZGVkLmVtcGxhY2Vf YmFjayAoc2VwYXJhdG9yX3Rva2VuLT5jbG9uZV90b2tlbiAoKSk7DQo+Pj4+ICsNCj4+Pj4g KyAgICAgIGZvciAoYXV0byAmbmV3X3Rva2VuIDogbmV3X3Rva2VucykNCj4+Pj4gKyAgICAg ICBleHBhbmRlZC5lbXBsYWNlX2JhY2sgKG5ld190b2tlbi0+Y2xvbmVfdG9rZW4gKCkpOw0K Pj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiArICAvLyBGSVhNRTogV2UgYWxzbyBuZWVkIHRv IG1ha2Ugc3VyZSB0aGF0IGFsbCBzdWJzZXF1ZW50IGZyYWdtZW50cw0KPj4+PiArICAvLyBj b250YWluIHRoZSBzYW1lIGFtb3VudCBvZiByZXBldGl0aW9ucyBhcyB0aGUgZmlyc3Qgb25l DQo+Pj4+ICsNCj4+Pj4gKyAgcmV0dXJuIGV4cGFuZGVkOw0KPj4+PiArfQ0KPj4+PiArDQo+ Pj4+ICtzdGF0aWMgYm9vbA0KPj4+PiAraXNfcmVwX29wIChzdGQ6OnVuaXF1ZV9wdHI8QVNU OjpUb2tlbj4gJnRvaykNCj4+Pj4gK3sNCj4+Pj4gKyAgYXV0byBpZCA9IHRvay0+Z2V0X2lk ICgpOw0KPj4+PiArICByZXR1cm4gaWQgPT0gUVVFU1RJT05fTUFSSyB8fCBpZCA9PSBBU1RF UklTSyB8fCBpZCA9PSBQTFVTOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICtzdGQ6OnBhaXI8 c3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+Piwgc2l6ZV90Pg0KPj4+ PiArU3Vic3RpdHV0ZUN0eDo6c3Vic3RpdHV0ZV90b2tlbiAoc2l6ZV90IHRva2VuX2lkeCkN Cj4+Pj4gK3sNCj4+Pj4gKyAgYXV0byAmdG9rZW4gPSBtYWNyby5hdCAodG9rZW5faWR4KTsN Cj4+Pj4gKyAgc3dpdGNoICh0b2tlbi0+Z2V0X2lkICgpKQ0KPj4+PiArICAgIHsNCj4+Pj4g KyAgICBjYXNlIElERU5USUZJRVI6DQo+Pj4+ICsgICAgICBydXN0X2RlYnVnICgiZXhwYW5k aW5nIG1ldGF2YXI6ICVzIiwgdG9rZW4tPmdldF9zdHIgKCkuY19zdHIgKCkpOw0KPj4+PiAr ICAgICAgcmV0dXJuIHtzdWJzdGl0dXRlX21ldGF2YXIgKHRva2VuKSwgMX07DQo+Pj4+ICsg ICAgICBjYXNlIExFRlRfUEFSRU46IHsNCj4+Pj4gKyAgICAgICAvLyBXZSBuZWVkIHRvIHBh cnNlIHVwIHVudGlsIHRoZSBjbG9zaW5nIGRlbGltaXRlciBhbmQgZXhwYW5kIHRoaXMNCj4+ Pj4gKyAgICAgICAvLyBmcmFnbWVudC0+biB0aW1lcy4NCj4+Pj4gKyAgICAgICBydXN0X2Rl YnVnICgiZXhwYW5kaW5nIHJlcGV0aXRpb24iKTsNCj4+Pj4gKw0KPj4+PiArICAgICAgIC8v IFdlJ3JlIGluIGEgY29udGV4dCB3aGVyZSBtYWNybyByZXBldGl0aW9ucyBoYXZlIGFscmVh ZHkgYmVlbg0KPj4+PiArICAgICAgIC8vIHBhcnNlZCBhbmQgdmFsaWRhdGVkOiBUaGlzIG1l YW5zIHRoYXQNCj4+Pj4gKyAgICAgICAvLyAxLyBUaGVyZSB3aWxsIGJlIG5vIGRlbGltaXRl cnMgYXMgdGhhdCBpcyBhbiBlcnJvcg0KPj4+PiArICAgICAgIC8vIDIvIFRoZXJlIGFyZSBu byBmcmFnbWVudCBzcGVjaWZpZXJzIGFueW1vcmUsIHdoaWNoIHByZXZlbnRzIHVzDQo+Pj4+ ICsgICAgICAgLy8gZnJvbSByZXVzaW5nIHBhcnNlciBmdW5jdGlvbnMuDQo+Pj4+ICsgICAg ICAgLy8NCj4+Pj4gKyAgICAgICAvLyBSZXBldGl0aW9uIHBhdHRlcm5zIGFyZSBhbHNvIHNw ZWNpYWwgaW4gdGhhdCB0aGV5IGNhbm5vdCBjb250YWluDQo+Pj4+ICsgICAgICAgLy8gInJv Z3VlIiBkZWxpbWl0ZXJzOiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBpbnZhbGlkLCBhcyB0aGV5 IGFyZQ0KPj4+PiArICAgICAgIC8vIHBhcnNlZCBhcyBNYWNyb01hdGNoZXMgYW5kIG11c3Qg Y29udGFpbiBhIGNvcnJlY3QgYW1vdW50IG9mDQo+Pj4+ICsgICAgICAgLy8gZGVsaW1pdGVy cy4NCj4+Pj4gKyAgICAgICAvLyBgJCgkZTpleHByICkgKWANCj4+Pj4gKyAgICAgICAvLyAg ICAgICAgICAgIF4gcm9ndWUgY2xvc2luZyBwYXJlbnRoZXNpcw0KPj4+PiArICAgICAgIC8v DQo+Pj4+ICsgICAgICAgLy8gV2l0aCBhbGwgb2YgdGhhdCBpbiBtaW5kLCB3ZSBjYW4gc2lt cGx5IHNraXAgYWhlYWQgZnJvbSBvbmUNCj4+Pj4gKyAgICAgICAvLyBwYXJlbnRoZXNpcyB0 byB0aGUgb3RoZXIgdG8gZmluZCB0aGUgcGF0dGVybiB0byBleHBhbmQuIE9mIGNvdXJzZSwN Cj4+Pj4gKyAgICAgICAvLyBwYWlycyBvZiBkZWxpbWl0ZXJzLCBpbmNsdWRpbmcgcGFyZW50 aGVzZXMsIGFyZSBhbGxvd2VkLg0KPj4+PiArICAgICAgIC8vIGAkKCRlOmV4cHIgKCApIClg DQo+Pj4+ICsgICAgICAgLy8gUGFyZW50aGVzZXMgYXJlIHRoZSBzb2xlIGRlbGltaXRlciBm b3Igd2hpY2ggd2UgbmVlZCBhIHNwZWNpYWwNCj4+Pj4gKyAgICAgICAvLyBiZWhhdmlvciBz aW5jZSB0aGV5IGRlbGltaXQgdGhlIHJlcGV0aXRpb24gcGF0dGVybg0KPj4+PiArDQo+Pj4+ ICsgICAgICAgc2l6ZV90IHBhdHRlcm5fc3RhcnQgPSB0b2tlbl9pZHggKyAxOw0KPj4+PiAr ICAgICAgIHNpemVfdCBwYXR0ZXJuX2VuZCA9IHBhdHRlcm5fc3RhcnQ7DQo+Pj4+ICsgICAg ICAgYXV0byBwYXJlbnRoZXNlc19zdGFjayA9IDA7DQo+Pj4+ICsgICAgICAgZm9yIChzaXpl X3QgaWR4ID0gcGF0dGVybl9zdGFydDsgaWR4IDwgbWFjcm8uc2l6ZSAoKTsgaWR4KyspDQo+ Pj4+ICsgICAgICAgICB7DQo+Pj4+ICsgICAgICAgICAgIGlmIChtYWNyby5hdCAoaWR4KS0+ Z2V0X2lkICgpID09IExFRlRfUEFSRU4pDQo+Pj4+ICsgICAgICAgICAgICAgew0KPj4+PiAr ICAgICAgICAgICAgICAgcGFyZW50aGVzZXNfc3RhY2srKzsNCj4+Pj4gKyAgICAgICAgICAg ICB9DQo+Pj4+ICsgICAgICAgICAgIGVsc2UgaWYgKG1hY3JvLmF0IChpZHgpLT5nZXRfaWQg KCkgPT0gUklHSFRfUEFSRU4pDQo+Pj4+ICsgICAgICAgICAgICAgew0KPj4+PiArICAgICAg ICAgICAgICAgaWYgKHBhcmVudGhlc2VzX3N0YWNrID09IDApDQo+Pj4+ICsgICAgICAgICAg ICAgICAgIHsNCj4+Pj4gKyAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX2VuZCA9IGlkeDsN Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICBicmVhazsNCj4+Pj4gKyAgICAgICAgICAgICAg ICAgfQ0KPj4+PiArICAgICAgICAgICAgICAgcGFyZW50aGVzZXNfc3RhY2stLTsNCj4+Pj4g KyAgICAgICAgICAgICB9DQo+Pj4+ICsgICAgICAgICB9DQo+Pj4+ICsNCj4+Pj4gKyAgICAg ICAvLyBVbnJlYWNoYWJsZSBjYXNlLCBidXQgbGV0J3MgbWFrZSBzdXJlIHdlIGRvbid0IGV2 ZXIgcnVuIGludG8gaXQNCj4+Pj4gKyAgICAgICBydXN0X2Fzc2VydCAocGF0dGVybl9lbmQg IT0gcGF0dGVybl9zdGFydCk7DQo+Pj4+ICsNCj4+Pj4gKyAgICAgICBzdGQ6OnVuaXF1ZV9w dHI8QVNUOjpUb2tlbj4gc2VwYXJhdG9yX3Rva2VuID0gbnVsbHB0cjsNCj4+Pj4gKyAgICAg ICBpZiAocGF0dGVybl9lbmQgKyAxIDw9IG1hY3JvLnNpemUgKCkpDQo+Pj4+ICsgICAgICAg ICB7DQo+Pj4+ICsgICAgICAgICAgIGF1dG8gJnBvc3RfcGF0dGVybl90b2tlbiA9IG1hY3Jv LmF0IChwYXR0ZXJuX2VuZCArIDEpOw0KPj4+PiArICAgICAgICAgICBpZiAoIWlzX3JlcF9v cCAocG9zdF9wYXR0ZXJuX3Rva2VuKSkNCj4+Pj4gKyAgICAgICAgICAgICBzZXBhcmF0b3Jf dG9rZW4gPSBwb3N0X3BhdHRlcm5fdG9rZW4tPmNsb25lX3Rva2VuICgpOw0KPj4+PiArICAg ICAgICAgfQ0KPj4+PiArDQo+Pj4+ICsgICAgICAgLy8gQW1vdW50IG9mIHRva2VucyB0byBz a2lwDQo+Pj4+ICsgICAgICAgYXV0byB0b19za2lwID0gMDsNCj4+Pj4gKyAgICAgICAvLyBQ YXJlbnRoZXNlcw0KPj4+PiArICAgICAgIHRvX3NraXAgKz0gMjsNCj4+Pj4gKyAgICAgICAv LyBSZXBldGl0aW9uIG9wZXJhdG9yDQo+Pj4+ICsgICAgICAgdG9fc2tpcCArPSAxOw0KPj4+ PiArICAgICAgIC8vIFNlcGFyYXRvcg0KPj4+PiArICAgICAgIGlmIChzZXBhcmF0b3JfdG9r ZW4pDQo+Pj4+ICsgICAgICAgICB0b19za2lwICs9IDE7DQo+Pj4+ICsNCj4+Pj4gKyAgICAg ICByZXR1cm4ge3N1YnN0aXR1dGVfcmVwZXRpdGlvbiAocGF0dGVybl9zdGFydCwgcGF0dGVy bl9lbmQsDQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 ZDo6bW92ZSAoc2VwYXJhdG9yX3Rva2VuKSksDQo+Pj4+ICsgICAgICAgICAgICAgICBwYXR0 ZXJuX2VuZCAtIHBhdHRlcm5fc3RhcnQgKyB0b19za2lwfTsNCj4+Pj4gKyAgICAgIH0NCj4+ Pj4gKyAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlICQgd2FzIGFsb25l LiBJbiB0aGF0IGNhc2UsIGRvDQo+Pj4+ICsgICAgICAvLyBub3QgZXJyb3Igb3V0OiBTaW1w bHkgYWN0IGFzIGlmIHRoZXJlIHdhcyBhbiBlbXB0eSBpZGVudGlmaWVyDQo+Pj4+ICsgICAg ICAvLyB3aXRoIG5vIGFzc29jaWF0ZWQgZnJhZ21lbnQgYW5kIHBhc3RlIHRoZSBkb2xsYXIg c2lnbiBpbiB0aGUNCj4+Pj4gKyAgICAgIC8vIHRyYW5zY3JpcHRpb24uIFVuc3VyZSBob3cg dG8gZG8gdGhhdCBzaW5jZSB3ZSBhbHdheXMgaGF2ZSBhdA0KPj4+PiArICAgICAgLy8gbGVh c3QgdGhlIGNsb3NpbmcgY3VybHkgYnJhY2UgYWZ0ZXIgYW4gZW1wdHkgJC4uLg0KPj4+PiAr ICAgIGRlZmF1bHQ6DQo+Pj4+ICsgICAgICBydXN0X2Vycm9yX2F0ICh0b2tlbi0+Z2V0X2xv Y3VzICgpLA0KPj4+PiArICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCB0b2tlbiBp biBtYWNybyB0cmFuc2NyaWJlOiBleHBlY3RlZCAiDQo+Pj4+ICsgICAgICAgICAgICAgICAg ICAgICIlPCglPiBvciBpZGVudGlmaWVyIGFmdGVyICU8JCU+LCBnb3QgJTwlcyU+IiwNCj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuX2Rlc2NyaXB0aW9uICh0b2tlbi0+ Z2V0X2lkICgpKSk7DQo+Pj4+ICsgICAgfQ0KPj4+PiArDQo+Pj4+ICsgIC8vIEZJWE1FOiBn Y2NfdW5yZWFjaGFibGUoKSBlcnJvciBjYXNlPw0KPj4+PiArICByZXR1cm4ge3N0ZDo6dmVj dG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1Q6OlRva2VuPj4gKCksIDB9Ow0KPj4+PiArfQ0KPj4+ PiArDQo+Pj4+ICtzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+DQo+ Pj4+ICtTdWJzdGl0dXRlQ3R4OjpzdWJzdGl0dXRlX3Rva2VucyAoKQ0KPj4+PiArew0KPj4+ PiArICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+IHJlcGxhY2Vk X3Rva2VuczsNCj4+Pj4gKyAgcnVzdF9kZWJ1ZyAoImV4cGFuZGluZyB0b2tlbnMiKTsNCj4+ Pj4gKw0KPj4+PiArICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hY3JvLnNpemUgKCk7IGkr KykNCj4+Pj4gKyAgICB7DQo+Pj4+ICsgICAgICBhdXRvICZ0b2sgPSBtYWNyby5hdCAoaSk7 DQo+Pj4+ICsgICAgICBpZiAodG9rLT5nZXRfaWQgKCkgPT0gRE9MTEFSX1NJR04pDQo+Pj4+ ICsgICAgICAgew0KPj4+PiArICAgICAgICAgLy8gQWFhYWFoLCBpZiBvbmx5IHdlIGhhZCBD KysxNyA6KQ0KPj4+PiArICAgICAgICAgLy8gYXV0byBbZXhwYW5kZWQsIHRva190b19za2lw XSA9IC4uLg0KPj4+PiArICAgICAgICAgYXV0byBwID0gc3Vic3RpdHV0ZV90b2tlbiAoaSAr IDEpOw0KPj4+PiArICAgICAgICAgYXV0byBleHBhbmRlZCA9IHN0ZDo6bW92ZSAocC5maXJz dCk7DQo+Pj4+ICsgICAgICAgICBhdXRvIHRva190b19za2lwID0gcC5zZWNvbmQ7DQo+Pj4+ ICsNCj4+Pj4gKyAgICAgICAgIGkgKz0gdG9rX3RvX3NraXA7DQo+Pj4+ICsNCj4+Pj4gKyAg ICAgICAgIGZvciAoYXV0byAmdG9rZW4gOiBleHBhbmRlZCkNCj4+Pj4gKyAgICAgICAgICAg cmVwbGFjZWRfdG9rZW5zLmVtcGxhY2VfYmFjayAodG9rZW4tPmNsb25lX3Rva2VuICgpKTsN Cj4+Pj4gKyAgICAgICB9DQo+Pj4+ICsgICAgICBlbHNlDQo+Pj4+ICsgICAgICAgew0KPj4+ PiArICAgICAgICAgcmVwbGFjZWRfdG9rZW5zLmVtcGxhY2VfYmFjayAodG9rLT5jbG9uZV90 b2tlbiAoKSk7DQo+Pj4+ICsgICAgICAgfQ0KPj4+PiArICAgIH0NCj4+Pj4gKw0KPj4+PiAr ICByZXR1cm4gcmVwbGFjZWRfdG9rZW5zOw0KPj4+PiArfQ0KPj4+PiArDQo+Pj4+ICt9IC8v IG5hbWVzcGFjZSBSdXN0DQo+Pj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9leHBhbmQvcnVz dC1tYWNyby1zdWJzdGl0dXRlLWN0eC5oIGIvZ2NjL3J1c3QvZXhwYW5kL3J1c3QtbWFjcm8t c3Vic3RpdHV0ZS1jdHguaA0KPj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4+PiBpbmRl eCAwMDAwMDAwMDAwMC4uODFkY2FiNzY0M2INCj4+Pj4gLS0tIC9kZXYvbnVsbA0KPj4+PiAr KysgYi9nY2MvcnVzdC9leHBhbmQvcnVzdC1tYWNyby1zdWJzdGl0dXRlLWN0eC5oDQo+Pj4+ IEBAIC0wLDAgKzEsOTMgQEANCj4+Pj4gKy8vIENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4+PiArDQo+Pj4+ICsvLyBUaGlzIGZp bGUgaXMgcGFydCBvZiBHQ0MuDQo+Pj4+ICsNCj4+Pj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+ Pj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+Pj4g Ky8vIHZlcnNpb24uDQo+Pj4+ICsNCj4+Pj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+Pj4g Ky8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVS Q0hBTlRBQklMSVRZIG9yDQo+Pj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+Pj4gKy8vIGZv ciBtb3JlIGRldGFpbHMuDQo+Pj4+ICsNCj4+Pj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+Pj4+ICsv LyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0K Pj4+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4+PiArDQo+Pj4+ ICsjaW5jbHVkZSAicnVzdC1hc3QuaCINCj4+Pj4gKyNpbmNsdWRlICJydXN0LW1hY3JvLWV4 cGFuZC5oIg0KPj4+PiArDQo+Pj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+Pj4+ICtjbGFzcyBT dWJzdGl0dXRlQ3R4DQo+Pj4+ICt7DQo+Pj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVl X3B0cjxBU1Q6OlRva2VuPj4gJmlucHV0Ow0KPj4+PiArICBzdGQ6OnZlY3RvcjxzdGQ6OnVu aXF1ZV9wdHI8QVNUOjpUb2tlbj4+ICZtYWNybzsNCj4+Pj4gKyAgc3RkOjptYXA8c3RkOjpz dHJpbmcsIE1hdGNoZWRGcmFnbWVudENvbnRhaW5lcj4gJmZyYWdtZW50czsNCj4+Pj4gKw0K Pj4+PiArICAvKioNCj4+Pj4gKyAgICogRmluZCB0aGUgcmVwZXRpdGlvbiBhbW91bnQgdG8g dXNlIHdoZW4gZXhwYW5kaW5nIGEgcmVwZXRpdGlvbiwgYW5kDQo+Pj4+ICsgICAqIGNoZWNr IHRoYXQgYWxsIGZyYWdtZW50cyB1c2VkIHJlc3BlY3QgdGhhdCByZXBldGl0aW9uIGFtb3Vu dA0KPj4+PiArICAgKg0KPj4+PiArICAgKiBAcGFyYW0gcGF0dGVybl9zdGFydCBTdGFydCBv ZiB0aGUgcmVwZXRpdGlvbiBwYXR0ZXJuDQo+Pj4+ICsgICAqIEBwYXJhbSBwYXR0ZXJuX2Vu ZCBFbmQgb2YgdGhlIHJlcGV0aXRpb24gcGF0dGVybg0KPj4+PiArICAgKiBAcGFyYW0gcmVw ZWF0X2Ftb3VudCBSZWZlcmVuY2UgdG8gZmlsbCB3aXRoIHRoZSBtYXRjaGVkIHJlcGV0aXRp b24gYW1vdW50DQo+Pj4+ICsgICAqLw0KPj4+PiArICBib29sIGNoZWNrX3JlcGV0aXRpb25f YW1vdW50IChzaXplX3QgcGF0dGVybl9zdGFydCwgc2l6ZV90IHBhdHRlcm5fZW5kLA0KPj4+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmcmVwZWF0X2Ftb3Vu dCk7DQo+Pj4+ICsNCj4+Pj4gK3B1YmxpYzoNCj4+Pj4gKyAgU3Vic3RpdHV0ZUN0eCAoc3Rk Ojp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+PiAmaW5wdXQsDQo+Pj4+ICsg ICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+ PiAmbWFjcm8sDQo+Pj4+ICsgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcs IE1hdGNoZWRGcmFnbWVudENvbnRhaW5lcj4gJmZyYWdtZW50cykNCj4+Pj4gKyAgICA6IGlu cHV0IChpbnB1dCksIG1hY3JvIChtYWNybyksIGZyYWdtZW50cyAoZnJhZ21lbnRzKQ0KPj4+ PiArICB7fQ0KPj4+PiArDQo+Pj4+ICsgIC8qKg0KPj4+PiArICAgKiBTdWJzdGl0dXRlIGEg bWV0YXZhcmlhYmxlIGJ5IGl0cyBnaXZlbiBmcmFnbWVudCBpbiBhIHRyYW5zY3JpYmluZyBj b250ZXh0LA0KPj4+PiArICAgKiBpLmUuIHJlcGxhY2luZyAkdmFyIHdpdGggdGhlIGFzc29j aWF0ZWQgZnJhZ21lbnQuDQo+Pj4+ICsgICAqDQo+Pj4+ICsgICAqIEBwYXJhbSBtZXRhdmFy IE1ldGF2YXJpYWJsZSB0byB0cnkgYW5kIHJlcGxhY2UNCj4+Pj4gKyAgICoNCj4+Pj4gKyAg ICogQHJldHVybiBBIHRva2VuIGNvbnRhaW5pbmcgdGhlIGFzc29jaWF0ZWQgZnJhZ21lbnQg ZXhwYW5kZWQgaW50byB0b2tlbnMgaWYNCj4+Pj4gKyAgICogYW55LCBvciB0aGUgY2xvbmVk IHRva2VuIGlmIG5vIGZyYWdtZW50IHdhcyBhc3NvY2lhdGVkDQo+Pj4+ICsgICAqLw0KPj4+ PiArICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+DQo+Pj4+ICsg IHN1YnN0aXR1dGVfbWV0YXZhciAoc3RkOjp1bmlxdWVfcHRyPEFTVDo6VG9rZW4+ICZtZXRh dmFyKTsNCj4+Pj4gKw0KPj4+PiArICAvKioNCj4+Pj4gKyAgICogU3Vic3RpdHV0ZSBhIG1h Y3JvIHJlcGV0aXRpb24gYnkgaXRzIGdpdmVuIGZyYWdtZW50cw0KPj4+PiArICAgKg0KPj4+ PiArICAgKiBAcGFyYW0gcGF0dGVybl9zdGFydCBTdGFydCBpbmRleCBvZiB0aGUgcGF0dGVy biB0b2tlbnMNCj4+Pj4gKyAgICogQHBhcmFtIHBhdHRlcm5fZW5kIEVuZCBpbmRleCBvZiB0 aGUgcGF0dGVybnMgdG9rZW5zDQo+Pj4+ICsgICAqIEBwYXJhbSBzZXBhcmF0b3IgT3B0aW9u YWwgc2VwYXJhdG9yIHRvIGluY2x1ZGUgd2hlbiBleHBhbmRpbmcgdG9rZW5zDQo+Pj4+ICsg ICAqDQo+Pj4+ICsgICAqIEByZXR1cm4gQSB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmVwZWF0 ZWQgcGF0dGVybg0KPj4+PiArICAgKi8NCj4+Pj4gKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlx dWVfcHRyPEFTVDo6VG9rZW4+Pg0KPj4+PiArICBzdWJzdGl0dXRlX3JlcGV0aXRpb24gKHNp emVfdCBwYXR0ZXJuX3N0YXJ0LCBzaXplX3QgcGF0dGVybl9lbmQsDQo+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4gc2VwYXJhdG9y KTsNCj4+Pj4gKw0KPj4+PiArICAvKioNCj4+Pj4gKyAgICogU3Vic3RpdHV0ZSBhIGdpdmVu IHRva2VuIGJ5IGl0cyBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbg0KPj4+PiArICAgKg0K Pj4+PiArICAgKiBAcGFyYW0gdG9rZW5faWR4IEN1cnJlbnQgdG9rZW4gdG8gdHJ5IGFuZCBz dWJzdGl0dXRlDQo+Pj4+ICsgICAqDQo+Pj4+ICsgICAqIEByZXR1cm4gQSB0b2tlbiBjb250 YWluaW5nIHRoZSBhc3NvY2lhdGVkIGZyYWdtZW50IGV4cGFuZGVkIGludG8gdG9rZW5zIGlm DQo+Pj4+ICsgICAqIGFueSwgb3IgdGhlIGNsb25lZCB0b2tlbiBpZiBubyBmcmFnbWVudCB3 YXMgYXNzb2NpYXRlZCwgYXMgd2VsbCBhcyB0aGUNCj4+Pj4gKyAgICogYW1vdW50IG9mIHRv a2VucyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJlZm9yZSB0aGUgbmV4dCBpbnZvY2F0aW9u LiBTaW5jZQ0KPj4+PiArICAgKiB0aGlzIGZ1bmN0aW9uIG1heSBjb25zdW1lIG1vcmUgdGhh biBqdXN0IG9uZSB0b2tlbiwgaXQgaXMgaW1wb3J0YW50IHRvIHNraXANCj4+Pj4gKyAgICog YWhlYWQgb2YgdGhlIGlucHV0IHRvIGF2b2lkIG1pcy1zdWJzdGl0dXRpb25zDQo+Pj4+ICsg ICAqLw0KPj4+PiArICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFT VDo6VG9rZW4+Piwgc2l6ZV90Pg0KPj4+PiArICBzdWJzdGl0dXRlX3Rva2VuIChzaXplX3Qg dG9rZW5faWR4KTsNCj4+Pj4gKw0KPj4+PiArICAvKioNCj4+Pj4gKyAgICogU3Vic3RpdHV0 ZSBhbGwgdG9rZW5zIGJ5IHRoZWlyIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uDQo+Pj4+ ICsgICAqDQo+Pj4+ICsgICAqIEByZXR1cm4gQSB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3Vi c3RpdHV0ZWQgdG9rZW5zDQo+Pj4+ICsgICAqLw0KPj4+PiArICBzdGQ6OnZlY3RvcjxzdGQ6 OnVuaXF1ZV9wdHI8QVNUOjpUb2tlbj4+IHN1YnN0aXR1dGVfdG9rZW5zICgpOw0KPj4+PiAr fTsNCj4+Pj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+Pj4gLS0NCj4+Pj4gMi4zNy4yDQo+ Pj4+DQo+Pg0KPj4NCj4+IEtpbmRseSwNCj4+DQo+PiBBcnRodXINCg0KLS0gDQpBcnRodXIg Q29oZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+DQoNClRvb2xjaGFpbiBFbmdpbmVl cg0KDQpFbWJlY29zbSBHbWJIDQoNCkdlc2Now6RmdHNmw7xocmVyOiBKZXJlbXkgQmVubmV0 dA0KTmllZGVybGFzc3VuZzogTsO8cm5iZXJnDQpIYW5kZWxzcmVnaXN0ZXI6IEhSLUIgMzYz NjgNCnd3dy5lbWJlY29zbS5kZQ0KDQpGw7xydGhlciBTdHIuIDI3DQo5MDQyOSBOw7xybmJl cmcNCg0KDQpUZWwuOiAwOTEgLSAxMjggNzA3IDA0MA0KRmF4OiAwOTEgLSAxMjggNzA3IDA3 Nw0K --------------z50DLgZGPPc3cqIP0ZRoUZ2f Content-Type: application/pgp-keys; name="OpenPGP_0x1B3465B044AD9C65.asc" Content-Disposition: attachment; filename="OpenPGP_0x1B3465B044AD9C65.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- xsFNBGIMH/sBEAC/+yKgi+y9knsqZUNIqlF85v9Lv0lZ2jOUgFgD5R10gz8j39vI YxM/DWA8BGudqx/s0V3T2arTIJ9u9StA6846SD4lCmdFBUkE0ylOl9UjYrZpoNOY F85TrhwDBB8LxNzopJxrQIv/WqU2pfs4+QyZuzNPWkGv1b06dDqY1hr7jUxJzAhR klGMyd6kPzr4lJUJLvIPxjQ1Y+NXAiLrm7n7HqXeHxGBHFwxTRKMb720fcP8pkNQ KZNoZBAhNr/665yIH3fV1+D/xsjbVkowBJn5MG3iburNfps50fMNNkBZgzIBRjBx dyJ7iJmpZRQkdLSEf/gpWEc/vUVs8OIdqT60vuFoueuQUyntFuvGWyCP/o71+eaM dG1Xx8TROJM9usU+Zz3V8GwpPSUUiAI/tDhR/ANtrrJ7jbuhw/9fm7HLovGniQcp N2INgY/Ema3dmU7EWnFqeGymP8R3MQY1Ge8xqlNL1KGrp45ZHp623XgH+IDkvy1n e7RU+WuOPxKKWGeN9LfHNGfTX3ZvFCCxlnbU6KwwoeiLBVdkY1zbgA5LPIPrPtzQ vSPTivQswMkCEVrqLkBYnAXGiavx8V63HltdohJMvkE0wkH3XmsTgrbtqxADlHHz 7WZbBWx9G6OElEThcuT/H/pR9dxr83+qbkUpyIYxW3zP/kpz97oOElSyEQARAQAB zShBcnRodXIgQ29oZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+wsGOBBMB CAA4FiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmIMH/sCGwMFCwkIBwIGFQoJCAsC BBYCAwECHgECF4AACgkQGzRlsEStnGW7GhAApgjuTe1IRIGxhF8o2VLRYYOHugSI 6tNBPpnOjRBbt/Uj5xECBLDtIx+/GR+fUSZ/wRj7hIpbSoClfnCwQ5/Z0055MY8T 9UsCwElOPluzCNmrmRPL2snMsAhhMxDVVtX5xvF25It0qRQJLVKWiJPoPsQbl3ou aQhPbr2zeIAa74BlWn03zbUJdTXcdjd8+ZBnSGntqwV/hP/g1NwZzuxhroOq1Uaf PFd3RKwcuIRUkr5JE1ymNP4R8u3GU4/gwGr9s69wIEsBohPowgYGt84ZvLZpt84y Ufsf9CH4OE4/+x1QGumD1b9VcIv5/vZsg7Z8EXKibb6X5TM2vtCcNAHv+0KsERZy LHXn+GOjPQgISzPEcxYkeGNtEnf6IhsIfZyeUe2ZiMPz48Tok9w7r0XfhMCj2SMF jbAFfsufsglDnGO7CRuCBXtYJYZInmf5XzaQ8FfMRPs9jZeD6SFZjFH00E1o5GLs Y9le5euxLo1aLqDNqMp6I8R70rK65c7zRAnQ9CO8watmXsBMuJ0Y6Jmf/noFXn8S GVA9b7j+uumum1zToTSmPwhn83X3KwoXTmQ9RD1eiEBJDT9/phSTVDTqhsu8GJVz OIRVXKHxRZLZJo1pGt3YzbDlTshXAV4Ln5YsJIgyAuLU6vmH50QoZhuJK3xMnUaM RdxgyqZe5ACmWXXOwU0EYgwf+wEQAL5Bd4WYiqpsBgW1k/Tozz4cThT+CueIqitD 5lhTzEJ73SyrAmUiZrkSmR2Vc6G1mJEqozkmeXHjjQ8gMbz6HZBmacnJhWObf1aU THjowIsyT0hJJVag1Exq16lBUZCelNG0Jb07TnVWTi/2xHRTLsNVzTQpKnWC3OoA y6M9KwNp5I0hk2cJaFrMjz7/Q16kx8vOov28UcsNDhbq25W64fdEYZApNZI1sKk3 3tAQj4t0BxHtG1Hb6EwxbPmVZpL07fmLLVWe3nI5znekXq8AHlUcPGpb4EjUIsmK 8+VnGF3f0cDeSupJWSaHiuufc/jONsM8ZiuYJ6i9Lr8IvgeTUZMXVrjwuIDaMLn5 F24dmNSheuwLukQTTiB9LKfUyKZzkFb8Opiqzjng+psvkECIVwk5xaZgraKtivyq +RHGrhSzkJv17QLb7rEiMjKl+20v3xCYl8ogR/7O/slPZMisDV5QOEZEMrWfVYZC W5UIO+vXekTweJxVzPfrkUSpzce67iyeTzzNNwPlFnS/6eB1+IKKAtuxEhbOokBs Yf+WnY7xdLGCLyVTXdg99oXZ9AJUUJL3dy9eIggZciQSzkhfeKykoUDmHUAAbWTA xWLwkJ/QBku/Ay5ffRQ9ukhngdu8PsyPGwsOORNIVYbKU0hMtqU7UjOzhVviQufJ Y2C4KCp5ABEBAAHCwXYEGAEIACAWIQSHHzA82PtzDoKu/MYbNGWwRK2cZQUCYgwf +wIbDAAKCRAbNGWwRK2cZQJ6D/95URtl/eu1akFC1VNqdghWrOAJiL8Jgk53cXug 3GXoh8qjDYXT7S6zC6Gyq2nqhGy5JdNmZRdhFCIqZAg2DyBY/1gJEM0yLXEhWZy8 AxuUaadAuUG8erdngXD2az4glSKhjAM5oxRXkWB3P9lr5I2n0Yx7tPlFusfIInV/ 3RKOYezPS9seoJS31hb6dvYsf3/RGF5Fau3+sm4urTn7zqhqBYgqBmih8sgsifXA zsJ+tO33Cd10SPZmKlKlZWxouTL4Nky6e2DJHX7phX1DIZBmJBIUvkK6uA7mdJ1y zQonNJq8nABtXBioO+YnP3msZPutEJzGnBjRSpJr0FULqeIX5JTPqa023Kj2zvnF fqKrT6rgMUomNjQxCryix+EoBUvHcHAyWPQuYb38eV15GqcCjEezziKqTXPBETXk M3rq8+STsSwxn6wz6gwgC1sbj+IXUY2jGzq8fS/99uferADYXEnzKheU5Q4gWv2X Q/juSJh6AuxTdlr7+5ndAmVUh8U0p47S5ErJnHt1H4pLxIoR7VM9YiIZHn833Xms 2QT2JVIVzL+opHU5XdoXPgd58b8Sxd2j1Fj8LevvZ4isfpr6ZHQ3S0sdOZFtg+Sd nri0Eg+Zg28sczMMKT0W+wb/dpZCA8p3ONJE5hWUhtUpNuhV7j8A4PBVzNHOqPWx 7FJmBg=3D=3D =3DQnyj -----END PGP PUBLIC KEY BLOCK----- --------------z50DLgZGPPc3cqIP0ZRoUZ2f-- --------------n5zUTEGmthEcnb9IL7ALJ5BC-- --------------kALuMuuog3JSfkwEhxTitjyD Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmN2Q64FAwAAAAAACgkQGzRlsEStnGWb cQ//QoAsBSdUNi4R7Y/hXAOBcpO3RStuslmxxqCLDmE/e8AxCU9mWl8BT+DmRJLM9nYD01t1CD9f fDkyv1Fuo9hYpN99HggRR5cHc0RgUYTILmbemGUKq9KsJudUlYZuN5QNNXPy5fUv31OVlMSHs3Xv UWHshXJNsjQJVaPkG2Wx+lN2b9dAsDJqGqWBEEAOZoMq2rLbIk5qG4PfF93Y+dhlg0xe6lzP/lwO mwBRnU1a9jMUlfXgdCIOtpDNIaciObJB4IgPOEaFXv409aQ324hXbY61hwtV6rnS0A3LCklwYWSA Cqd+1BzWPgvdwlOuVw4O0z0EgD74+qOqc0SwqTMSARV+jWsGpQBCwQCvtMFZckG3ZDGOg5rUVp7G B/nJr06Na6dRwTAW9gunEb35rIZ5Ti5gpjU+sk7luwblrA8TCdSvbne04P7cTPWCAtJw22ycQHFV 3p84le3t8FijDCHEOf/WR5XM8YvUUV3OY/wrJj2CFmG6WFdsWvxzUZ+idpgoJk1l3GusWCqCfxno VoynF4LYCr/imLeqPVcCJ0o2C1jmMdlA45CdXppqmUJlAHMLWwEpciQ51zYZEhlkyJyvFc3cfE3P AQfvySwOgPqwdXSKqaqplOPY3++oCuU6oTj8jfKfWd2PyVPOYGabKPOf2lVBsnVfmX6ZSET8Vehn 1wQ= =WyRs -----END PGP SIGNATURE----- --------------kALuMuuog3JSfkwEhxTitjyD--