From unknown Mon Jun 23 16:45:03 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#19193 <19193@debbugs.gnu.org> To: bug#19193 <19193@debbugs.gnu.org> Subject: Status: Announcing "untangle" for Grep 2.21; R.I.P. Dad Reply-To: bug#19193 <19193@debbugs.gnu.org> Date: Mon, 23 Jun 2025 23:45:03 +0000 retitle 19193 Announcing "untangle" for Grep 2.21; R.I.P. Dad reassign 19193 grep submitter 19193 behoffski severity 19193 normal tag 19193 notabug thanks From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 26 08:39:44 2014 Received: (at submit) by debbugs.gnu.org; 26 Nov 2014 13:39:44 +0000 Received: from localhost ([127.0.0.1]:45699 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xtcop-0004zL-UA for submit@debbugs.gnu.org; Wed, 26 Nov 2014 08:39:44 -0500 Received: from eggs.gnu.org ([208.118.235.92]:36509) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xtcom-0004zC-OS for submit@debbugs.gnu.org; Wed, 26 Nov 2014 08:39:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XtcoR-0005Sx-Q3 for submit@debbugs.gnu.org; Wed, 26 Nov 2014 08:39:40 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:56033) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XtcoR-0005Sp-LM for submit@debbugs.gnu.org; Wed, 26 Nov 2014 08:39:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37929) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xtco3-0001gD-UQ for bug-grep@gnu.org; Wed, 26 Nov 2014 08:39:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xtcni-0005O1-SN for bug-grep@gnu.org; Wed, 26 Nov 2014 08:38:55 -0500 Received: from ipmail04.adl6.internode.on.net ([150.101.137.141]:1506) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xtcnb-0005LO-1c for bug-grep@gnu.org; Wed, 26 Nov 2014 08:38:34 -0500 X-IronPort-Anti-Spam-NotFiltered: toobig Received: from ppp118-210-51-60.lns20.adl2.internode.on.net (HELO [192.168.178.20]) ([118.210.51.60]) by ipmail04.adl6.internode.on.net with ESMTP; 27 Nov 2014 00:08:07 +1030 Message-ID: <5475D7BC.2010909@grouse.com.au> Date: Thu, 27 Nov 2014 00:08:04 +1030 From: behoffski User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: bug-grep@gnu.org Subject: Announcing "untangle" for Grep 2.21; R.I.P. Dad Content-Type: multipart/mixed; boundary="------------090402070104080205090307" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" This is a multi-part message in MIME format. --------------090402070104080205090307 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit G'day, Congratulations to all on the GNU Grep 2.21 release. I'm continuing my attempt to do a "bottom-up" refactoring of the code to make it more modular, via the Lua script "untangle" that you've seen recently. This email contains an updated version of the script, tracking the changes to the sources (especially to dfa.c) since the last release. I've also added some code to make the modules more robust: 1. Added C++ C wrappers to the header files: #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ [... body of header goes here ... ] #ifdef __cplusplus } #endif /* __cplusplus */ 2. Strengthened pointer passing between modules Although the code uses strong typing (opaque types) for pointers representing instances created, manipulated and destroyed by each module, there are various ways -- intentional or unintentional -- that an invalid pointer might be presented, masquerading as an instance of the module. To reduce the likelihood of this happening, along with adding checking fro some other cases such as gross memory corruption, and perhaps also use-after-free, I've added sentinel magic numbers at the top and bottom of each of the refactored modules, and these sentinels are checked each time an external party interacts with the module. The charclass module has had a couple of extra additions: "bitcount" reports how many members of the class are set; and "next_member" allows a client to enumerate the members in an ordered fashion. I've tested the "untangle" script with Lua 5.1. I haven't included the files generated by this script -- if people are interested, I'm happy to post these to the list. cheers, behoffski (Brenton Hoff) Programmer, Grouse Software FINALLY: RIP to my Dad, who passed away a year ago today (27 November 2013): He did so much to encourage my interest in science and technology, and also personally did a lot to help me through some tough times. Thanks Dad, for everything. This release is dedicated to his memory. --------------090402070104080205090307 Content-Type: text/plain; charset=us-ascii; name="untangle" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="untangle" IyEvYmluL2VudiBsdWEKCi0tLSBVbnRhbmdsZSAtLSBTY3JpcHQgdG8gZW5hYmxlIHJlZmFj dG9yaW5nIGRmYS5jICg+NDAwMCBsaW5lcykKCi0tW1sKICAgQ29weXJpZ2h0IChDKSAyMDEz LTIwMTQgR3JvdXNlIFNvZnR3YXJlLgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g Mywgb3IgKGF0IHlvdXIgb3B0aW9uKQogICBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRo aXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICBGb3Vu ZGF0aW9uLCBJbmMuLAogICA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9z dG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBCi0tXV0KCi0tIEluaXRpYWwgZGVzaWduIGFuZCBp bXBsZW1lbnRhdGlvbiBieSBiZWhvZmZza2kgb2YgR3JvdXNlIFNvZnR3YXJlLAotLSAyMDEz LTIwMTQuCgotLVtbCiAgIGRmYS5jIGlzIGEgcGFydGljdWxhcmx5IGJpZyBhbmQgY29tcGxl eCBwaWVjZSBvZiBzb2Z0d2FyZSwgYW5kIHNlcnZlcwogICBhIG1hc3NpdmUgc2V0IG9mIHVz ZSBjYXNlcyBhbmQgbWFjaGluZSBlbnZpcm9ubWVudHMuICBIb3dldmVyLCB0byBhCiAgIGxp bWl0ZWQgZXh0ZW50LCBpdCBoYXMgYmVjb21lIHByaXNvbmVyIG9mIGl0cyBvd24gY29tcGxl eGl0eTogIFdoaWxlCiAgIGltcHJvdmVtZW50cyBpbiBvbmUgYXJlYSBtYXkgYmUgZmVhc2li bGUsIHRoZSBpbnRlcnZlbmluZyBsYXllcnMgbWF5CiAgIHJlLWNvZGUgdGhlIHBhdHRlcm4g aW4gYSBmYXNoaW9uIHRoYXQgbWFrZXMgdGhlIGltcHJvdmVtZW50IGhhcmQgdG8KICAgaW1w bGVtZW50LgoKICAgU28sIHRoaXMgc2NyaXB0IHRyaWVzIHRvIHVudGFuZ2xlIGRmYS5jIGEg bGl0dGxlOiAgVG8gYnJlYWsgdGhlCiAgIGxleGljYWwgYW5hbHlzaXMgKHRva2VuIGRlZmlu aXRpb24sIGNoYXItY2xhc3MgYW5kIG11bHRpYnl0ZS1jbGFzcwogICBzdG9yYWdlIG1hbmFn ZW1lbnQsIHBhdHRlcm4gaW50ZXJwcmV0YXRpb24gb3B0aW9ucykgaW50byBzZXBhcmF0ZQog ICBtb2R1bGUocykgKGZzYWxleC5bY2hdLCBmc2F0b2tlbnMuaCwgZnNhdXRpbHMuW2NoXSwg Li4uID8gbm90IHN1cmUpLgoKICAgSW5pdGlhbGx5LCBpdCBpcyBsaWtlbHkgdGhhdCB0aGUg InVudGFuZ2xlZCIgdmVyc2lvbiB3aWxsIGhhdmUgdGhlCiAgIHNhbWUgaW1wbGVtZW50YXRp b24gYXMgdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhhdCB0aGUgaW50ZWdyaXR5IG9mCiAg IHRoZSBzcGxpdCBzb3VyY2VzIGNhbiBiZSBjaGVja2VkLiAgRG93biB0aGUgdHJhY2ssIG15 IGhvcGUgaXMgdG8KICAgY2hhbmdlIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBpcyBjdXJlbnRs eSBjb21tdW5pY2F0ZWQgYnkgI2lmZGVmcwogICBhbmQvb3Igc2VwYXJhdGUgdmFyaWFibGVz IGludG8gYSBsYXJnZXIsIG1vcmUgZXhwbGljaXQgc2V0IG9mIGxleGljYWwKICAgdG9rZW5z LCBzbyB0aGF0IHRoZSBwYXJzZXIsIGFuZCB0aGUgZm9sbG93aW5nIERGQSBjb21waWxhdGlv biBhbmQKICAgYW5hbHlzaXMsIGFyZSBzaW1wbGlmaWVkIGJ5IHRoZSBpbXByb3ZlZCB0b2tl biBzZXQsIGFuZCB0aGUgZXh0cmEKICAgaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIHRv a2VucyBlbmFibGVzIG1vcmUgc29waGlzdGljYXRlZAogICBhbmFseXNpcyBvZiB0aGUgcGF0 dGVybiwgbGVhZGluZyB0byBiZXR0ZXIgc2VhcmNoIGVuZ2luZSBjaG9pY2VzLgoKICAgQXQg dGhlIHRpbWUgb2Ygd3JpdGluZyAoMTcgRmViIDIwMTQpLCBteSBjdXJyZW50IGd1ZXNzIGlz IHRoYXQgdG9rZW5zCiAgIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdCAzMiBi aXRzIHdpZGUsIHRoZSBsb3dlc3QgYml0cyAoPz8KICAgcHJvYmFibHkgOCBiaXRzKSB3aWxs IGFsd2F5cyBjb250YWluIHRoZSB0b2tlbiB0eXBlIChvcGNvZGUpLCBhbmQKICAgdGhlIGhp Z2hlciBiaXRzIGNhbiBvcHRpb25hbGx5IGNvbnRhaW4gaW5mb3JtYXRpb24gcmVsYXRpbmcg dG8gdGhlCiAgIHRva2VuICg/PyAyNC1iaXQgaW5kZXggcG9pbnRlciBmb3IgY2hhcmFjdGVy IHNldHMvbXVsdGlieXRlIGNoYXJzZXRzOwogICAyNC1iaXQgdmFsdWUgZm9yIGEgbXVsdGli eXRlIGNoYXJhY3RlcjsgYW4gOC1iaXQgdmFsdWUgZm9yIGFuIEFTQ0lJCiAgIGNoYXJhY3Rl ciB3aXRoIGFuIGV4dHJhIGJpdCAoQyBsb2NhbGUpKS4gIEV4aXN0aW5nIChzb21ldGltZXMK ICAgaW1wbGllZCkgb3Bjb2RlcyB3aWxsIGJlIGV4cGFuZGVkIGludG8gZmFtaWxpZXMgdG8g ZXhwbGljaXRseSBuYW1lCiAgIHBhcmFtZXRlciBpbnRlcnByZXRhdGlvbiwgZS5nLiBDSEFS X0VYQUNULCBDSEFSX0NBU0VfSU5TRU5TSVRJVkUsCiAgIENIQVJfQ0FTRV9ET05UX0NBUkUs IE1CQ0hBUl9FWEFDVCwgTUJDSEFSX0NBU0VfSU5TRU5TSVRJVkUsCiAgIE1CQ0hBUl9DQVNF X0RPTlRfQ0FSRSwgZXRjLiAgSSdtIG5vdCBzdXJlIGlmIENMQVNTIGFuZCBDTEFTU19JTlZF UlQKICAgb3Bjb2RlcyBhcmUgd2FycmFudGVkLCBidXQgaXQncyBwb3NzaWJsZTogIFRoZSBl bmQtb2YtbGluZSBjaGFyYWN0ZXIKICAgcHJvY2Vzc2luZyBpcyBwZXJoYXBzIGJlc3QgZGVm ZXJyZWQgdG8gdGhlIHBhcnNlIHN0YWdlIGluIGRmYS5jLgogICAoPz8gTWVtbyB0byBzZWxm OiAgUGVyaGFwcyBsYXRlciBvbiwgc3BsaXQgb3V0IHBhcnNlciB0bwogICBmc2FwYXJzZS5b Y2hdLikKCiAgIEluY2lkZW50YWxseSwgSSB1c2UgImZzYSIgcmF0aGVyIHRoYW4gImRmYSIg aW4gdGhlIG5hbWVzIGFib3ZlLCBhcwogICB0aGUgZGV0ZXJtaW5pc3RpYy9ub25kZXRlcm1p bmlzdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWFyY2gKICAgZW5naW5lIGlzbid0IGRp cmVjdGx5IHJlbGV2YW50IGR1cmluZyBsZXhpbmcgYW5kIHBhcnNpbmcuICBUaGVyZSBhcmUK ICAgaW5kaXJlY3QgaW5mbHVlbmNlcywgc3VjaCBhcyBjaG9vc2luZyBjaGFyYWN0ZXItYnkt Y2hhcmFjdGVyCiAgIHJlcHJlc2VudGF0aW9uIG9mIHNpbXBsZSBzdHJpbmdzIGluIHRoZSBp bnB1dCBwYXR0ZXJuLCBhbmQgdGhlbgogICB3b3JraW5nIGxhdGVyIHRvIGV4dHJhY3QgdGhl c2Ugc3RyaW5ncyAodGhlICJtdXN0cyIpIHNpbmNlCiAgIHNraXAtYmFzZWQgc3RyaW5nIHNl YXJjaGVzIGFyZSB2ZXJ5IGVmZmljaWVudC4gIFRoZSBjaG9zZW4KICAgcmVwcmVzZW50YXRp b24gYWxsb3dzIGZvciBhIHNpbXBsZSwgdW5pZm9ybSB3YXkgb2YgbmFtaW5nIHN0YXRlcwog ICB0aGF0IGFyZSBhbGl2ZSBkdXJpbmcgdGhlIHNlYXJjaCwgYW5kIHRoaXMgZml0cyB3ZWxs IHdpdGggdGhlIERGQSdzCiAgIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgc2VhcmNoIHN0cmF0 ZWd5LgoKICAgVGhlIHNjcmlwdCBpcyB3cml0dGVuIGluIEx1YSAoaHR0cDovL3d3dy5sdWEu b3JnKSwgYW5kIHdhcyBkZXZlbG9wZWQKICAgdXNpbmcgTHVhIDUuMS41LiAgSSd2ZSBhbHNv IHJ1biBpdCBzdWNjZXNzZnVsbHkgd2l0aCBMdWEgNS4yLjMuCgogICBUaGUgcmVhc29ucyBm b3IgcGVyZm9ybWluZyB0aGlzIHJlZmFjdG9yaW5nIGFzIGEgTHVhIHNjcmlwdCBpcwogICBi ZWNhdXNlOgogICAgIChhKSBUaGUgcmVmYWN0b3Jpbmcgd2lsbCB0YWtlIGEgKmxvbmcqIHRp bWUgdG8gZ2V0IHRvIGEgY29oZXJlbnQKICAgICAgICAgbGV2ZWwsIGFuZCB0aGVyZWZvcmUg a2VlcGluZyB0cmFjayBvZiBjb2RlIGNoYW5nZXMgaW4gdGhlCiAgICAgICAgIG9yaWdpbmFs IGlzIGNyaXRpY2FsLiAgVGhlIHNjcmlwdCBsZXRzIG1lIHNwbGl0IHVwIHRoZSBjb2RlCiAg ICAgICAgIGludG8gc25pcHBldHMgKHNlZ21lbnRzKSBpbiBhbiBhdXRvbWF0ZWQgZmFzaGlv biwgYW5kIHZlcmlmeQogICAgICAgICB0aGF0IHRoZSBvcmlnaW5hbCBjYW4gYmUgZnVsbHkg cmVjcmVhdGVkIGZyb20gdGhlIHNsaWNlZC11cAogICAgICAgICB2ZXJzaW9uLiAgRWFjaCBz bmlwcGV0IGdldHMgYW4gdW5pcXVlIG5hbWUsIGFuZCB0aGlzIGlzIHVzZWQKICAgICAgICAg d2hlbiBzcGVjaWZ5aW5nIG1vZGlmaWVkIHZlcnNpb25zOyB0aHVzLCB0aGUgb3V0cHV0IGhh cyBzb21lCiAgICAgICAgIHByb3RlY3Rpb24gZnJvbSBjaGFuZ2VzIHRvIHRoZSBpbnB1dDsK CiAgICAgKGIpIEx1YSBpcyBhIHNtYWxsLCBwb3dlcmZ1bCBzY3JpcHRpbmcgbGFuZ3VhZ2Ug aW5mbHVlbmNlZCBieQogICAgICAgICBTY2hlbWUsIENMVSwgTW9kdWxhLTIgYW5kIG90aGVy czsgaXRzIHNwZWVkIGlzIGltcHJlc3NpdmU7CiAgICAgICAgIHdyaXRpbmcgcmVhZGFibGUg Y29kZSBpcyBmYWlybHkgZWFzeSwgYW5kIGl0cyByZXB1dGF0aW9uIGFuZAogICAgICAgICBz cGhlcmUgb2YgaW5mbHVlbmNlIGlzIGdyb3dpbmc7CgogICAgIChjKSBMdWEgaGFzIGEgY29t cGFjdCwgYnV0IHZlcnkgcG93ZXJmdWwgYW5kIGZsZXhpYmxlLCBzdHJpbmcKICAgICAgICAg bWFuaXB1bGF0aW9uIGxpYnJhcnksIHdoaWNoIHdpbGwgYmUgdXNlZnVsIHdoZW4gd2FudGlu ZyB0bwogICAgICAgICBwZXJmb3JtIHRyaWNreSBjb2RlIGVkaXRzIGluIGFuIGF1dG9tYXRl ZCBmYXNoaW9uOyBhbmQKCiAgICAgKGQpIEx1YSdzIGxpY2VuY2UgKGZyb20gNS4wIG9ud2Fy ZHM7IEknbSB1c2luZyA1LjEpIGlzIHRoZSBNSVQKICAgICAgICAgbGljZW5zZSwgd2hpY2gg aXMgT3BlbiBTb3VyY2UtY29tcGF0aWJsZSwgc28sIHdoaWxlIGl0IGlzbid0CiAgICAgICAg IEZyZWUgU29mdHdhcmUsIGl0IGlzIGNvbXBhdGlibGUgZm9yIGEgb25jZS1vZmYgcmVmYWN0 b3JpbmcKICAgICAgICAgcHJvamVjdC4gIChUaGlzIHNjcmlwdCBpcyBsaWNlbmNlZCBhcyBH UEwzLCBidXQgdGhhdCdzIGFuCiAgICAgICAgIGluZGVwZW5kZW50IGNob2ljZS4pCgotLV1d CgoKbG9jYWwgaW8gICAgID0gcmVxdWlyZSgiaW8iKQpsb2NhbCBvcyAgICAgPSByZXF1aXJl KCJvcyIpCmxvY2FsIHN0cmluZyA9IHJlcXVpcmUoInN0cmluZyIpCmxvY2FsIHRhYmxlICA9 IHJlcXVpcmUoInRhYmxlIikKCi0tIFVzZSBzdHJpY3RuZXNzIHRvIHN0b3AgZ2xvYmFsIHZh cmlhYmxlcyBmcmVlbHkgc3ByaW5naW5nIGludG8gZXhpc3RlbmNlCi0tIHdoZW4gbWVudGlv bmVkLi4uIHRoaXMgaXMgY29udmVuaWVudCBpbiBtYW55IHBsYWNlcywgYnV0IGZvciBhIHNj cmlwdAotLSBvZiB0aGlzIG5hdHVyZSwgd2UgbmVlZCB0byBiZSBtb3JlIGV4YWN0aW5nIHRv IGF2b2lkIHR5cG9zLgpyZXF1aXJlKCJsdWFyb2Nrcy5sb2FkZXIiKQpsb2NhbCBzdHJpY3Ru ZXNzID0gcmVxdWlyZSgic3RyaWN0bmVzcyIpCgpzdHJpY3RuZXNzLnN0cmljdChfRykKCi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCgotLSBQYW5kZXIgdG8gIm1ha2Ugc3ludGF4LWNoZWNrIidz IGV4cGVjdGF0aW9uIHRoYXQgZXJyb3IgbWVzc2FnZXMgYmUKLS0gbWFya2VkIGZvciB0cmFu c2xhdGlvbiBieSBoYXZpbmcgXyguLi4pIHdyYXBwaW5nLiAgVGhlIEMgc291cmNlcwotLSBh cmUgYWxyZWFkeSBtYXJrZWQgY29ycmVjdGx5OyB0aGUgb25seSBwcm9ibGVtIGlzIHRoYXQg c3ludGF4LWNoZWNrCi0tIGFsc28gZGVtYW5kcyB0aGF0IHRoaXMgc2NyaXB0IGNvbmZvcm0u ICBJIGNhbid0IGJlIGJvdGhlcmVkIHRyeWluZwotLSB0byBmaW5lLXR1bmUgdGhlIHNvdXJj ZXMsIHNvIGp1c3QgZHVtbXkgdXAgYSBsdWEgZnVuY3Rpb24gdG8gbWltaWMKLS0gaW4gYSB0 cml2aWFsIGZhc2hpb24gdGhlIGxheW91dCB0aGF0IHN5bnRheC1jaGVjayBkZW1hbmRzLgoK bG9jYWwgZnVuY3Rpb24gXyguLi4pCiAgICAgICAgcmV0dXJuIC4uLgplbmQKCi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCgotLSBXZSByZWZlciB0byBsaW5lIG51bWJlcnMgYXMgb2Zmc2V0cyBm cm9tIGEgc2VjdGlvbiBib3VuZGFyeSwgc28gdGhhdAotLSBpZiBpbnNlcnRpb25zL2RlbGV0 aW9ucyBvY2N1ciwgd2UgbW9zdGx5IG9ubHkgaGF2ZSB0byByZWRlZmluZSB0aGUKLS0gbG9j YWwgbGluZSBudW1iZXJzIHBsdXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG51bWJlcnMsIG5v dCBldmVyeQotLSBsaW5lIHJlZmVyZW5jZSB0aHJvdWdob3V0IHRoZSByZXN0IG9mIHRoZSBm aWxlLgoKbG9jYWwgU2VjdGlvbkluZm8KZG8KICAgICAgICBsb2NhbCBJbml0aWFsU291cmNl ID0ge0ZpbGVuYW1lID0gIi1ub25lLSIsIFByZXZMaW5lID0gLTEsIH0KICAgICAgICBTZWN0 aW9uSW5mbyA9IHtUaXRsZSA9ICIodW50aXRsZWQpIiwKICAgICAgICAgICAgICAgICAgICAg ICBTb3VyY2UgPSBJbml0aWFsU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgIExpbmVO ciA9IDB9CmVuZAoKbG9jYWwgZnVuY3Rpb24gU2VjdGlvbihUaXRsZSwgU291cmNlLCBMaW5l TnIpCiAgICAgICAgaWYgdHlwZShTb3VyY2UpIH49ICJ0YWJsZSIgdGhlbgogICAgICAgICAg ICAgICBlcnJvcihfKCI6U291cmNlIG11c3QgYmUgYSBmaWxlLWFzLWxpbmVzIHRhYmxlIG9i amVjdCIpKQogICAgICAgIGVuZAoKICAgICAgICAtLSBBcHBlbmQgYSBuZXcgc2VjdGlvbiBl bnRyeSB0byB0aGUgbGlzdCBvZiBzZWN0aW9ucwogICAgICAgIFNlY3Rpb25JbmZvWyNTZWN0 aW9uSW5mbyArIDFdID0KICAgICAgICAgICAgICAgIHtUaXRsZSA9IFRpdGxlLCBTb3VyY2Ug PSBTb3VyY2UsIExpbmVOciA9IExpbmVOcn0KCiAgICAgICAgLS0gUGVyaGFwcyB3ZSBzaG91 bGQgY2hlY2sgdGhhdCBzZWN0aW9ucyBkbyBub3Qgb3ZlcmxhcCBhbmQvb3IKICAgICAgICAt LSBza2lwIGxpbmVzLCBidXQgbW9zdCBvZiBvdXIgbmVlZHMgYXJlIG1ldCBieSB0aGUgc2Vn bWVudAogICAgICAgIC0tIHRhZ2dpbmcgZmFjaWxpdHkgYW55d2F5LCBzbyBpdCdzIG5vdCBh IHByaW9yaXR5IGF0IHRoZQogICAgICAgIC0tIG1vbWVudC4KZW5kCgotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKLS0gTmV3RmlsZVRhYmxlIHJlYWRzIGEgZmlsZSwgbGluZS1ieS1saW5lLCBp bnRvIGEgdGFibGUsIGFuZCByZXR1cm5zCi0tIHRoZSB0YWJsZS4gIEFycmF5IChzZXF1ZW5j ZSAxLi5uKSByZWZlcmVuY2VzIGFyZSBmaWxlIHRleHQgZW50cmllczsKLS0gTmFtZS9WYWx1 ZSBwYWlycyBob2xkIG90aGVyIHZhbHVlcyAoZS5nLiBrZXlzICJGaWxlbmFtZSIsICJQcmV2 TGluZSIpCmxvY2FsIGZ1bmN0aW9uIE5ld0ZpbGVUYWJsZShGaWxlbmFtZSkKICAgICAgIGxv Y2FsIGYgPSBhc3NlcnQoaW8ub3BlbihGaWxlbmFtZSkpCiAgICAgICBsb2NhbCBUYWJsZSA9 IHtGaWxlbmFtZSA9IEZpbGVuYW1lLCBQcmV2TGluZSA9IDF9CiAgICAgICBmb3IgbCBpbiBm OmxpbmVzKCkgZG8KICAgICAgICAgICAgICBUYWJsZVsjVGFibGUgKyAxXSA9IGwKICAgICAg IGVuZAogICAgICAgYXNzZXJ0KGY6Y2xvc2UoKSkKICAgICAgIHJldHVybiBUYWJsZQplbmQK Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotLSBSZWFkIGRmYS5jLCBkZmEuaCBhbmQgTWFrZWZp bGUuYW0sIGxpbmUtYnktbGluZSwgaW50byB0YWJsZXMKbG9jYWwgZGZhYyAgICAgICA9IE5l d0ZpbGVUYWJsZSgiZGZhLmMiKQpsb2NhbCBkZmFoICAgICAgID0gTmV3RmlsZVRhYmxlKCJk ZmEuaCIpCmxvY2FsIG1ha2VmaWxlYW0gPSBOZXdGaWxlVGFibGUoIk1ha2VmaWxlLmFtIikK Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBmdW5jdGlvbiBwcmludGYoRm9ybWF0LCAu Li4pCiAgICAgICAgaW8ud3JpdGUoc3RyaW5nLmZvcm1hdChGb3JtYXQsIC4uLikpCmVuZAoK LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tIEZ1bmN0aW9uIHRvIGluZGVudCB0ZXh0IHdpdGgg ZW1iZWRkZWQgbmV3bGluZXMKbG9jYWwgZnVuY3Rpb24gSW5kZW50KFRleHQsIExldmVsKQog ICAgICAgIGxvY2FsIFNwYWNpbmcgPSBzdHJpbmcucmVwKCIgIiwgTGV2ZWwpCiAgICAgICAg cmV0dXJuIFNwYWNpbmcgLi4gVGV4dDpnc3ViKCJcbiIsICJcbiIgLi4gU3BhY2luZykKZW5k CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLS0gSGVscGVyIGZ1bmN0aW9uIHRvIHNpbXBsaWZ5 IGV4dHJhY3RpbmcgbGluZXMgKHBhcmFncmFwaChzKSkgYXMgYQotLSBuZXdsaW5lLXRlcm1p bmF0ZWQgc3RyaW5nLgpsb2NhbCBmdW5jdGlvbiBMaW5lcyhUYWJsZSwgU3RhcnQsIEVuZCkK LS0gICAgICAgIEVuZCA9IEVuZCBvciBTdGFydAogICAgICAgIHJldHVybiB0YWJsZS5jb25j YXQoVGFibGUsICJcbiIsIFN0YXJ0LCBFbmQpIC4uICJcbiIKZW5kCgotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKbG9jYWwgU2VncyA9IHtTZWdMaXN0ID0ge30sIFNlZ1NlcSA9IHt9fQoKLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KCi0tIEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHRhZ2dlZCBlbnRy eSB3aXRoIGEgY29weSBvZiBsaW5lcyBmcm9tIGEKLS0gc291cmNlIGZpbGUKZnVuY3Rpb24g U2VnczpUYWcoTmFtZSwgU3RhcnQsIEVuZCkKICAgICAgICBpZiBzZWxmLlNlZ0xpc3RbTmFt ZV0gfj0gbmlsIHRoZW4KICAgICAgICAgICAgICAgIGVycm9yKF8oImR1cGxpY2F0ZSBzZWdt ZW50IHRhZzogIiAuLiBOYW1lKSkKICAgICAgICBlbmQKICAgICAgICBFbmQgPSBFbmQgb3Ig U3RhcnQKCiAgICAgICAgLS0gQ29udmVydCBzZWN0aW9uLW9mZnNldCBsaW5lIG51bWJlcnMg aW50byBhYnNvbHV0ZSB2YWx1ZXMKICAgICAgICBsb2NhbCBDdXJyZW50U2VjdGlvbiA9IFNl Y3Rpb25JbmZvWyNTZWN0aW9uSW5mb10KICAgICAgICBsb2NhbCBTb3VyY2UgPSBDdXJyZW50 U2VjdGlvbi5Tb3VyY2UKICAgICAgICBTdGFydCA9IFN0YXJ0ICsgQ3VycmVudFNlY3Rpb24u TGluZU5yCiAgICAgICAgRW5kICAgPSBFbmQgICArIEN1cnJlbnRTZWN0aW9uLkxpbmVOcgoK ICAgICAgICBsb2NhbCBFbnRyeSA9CiAgICAgICAgICAgICAgICB7TmFtZSAgICA9IE5hbWUs CiAgICAgICAgICAgICAgICAgU291cmNlICA9IFNvdXJjZSwKICAgICAgICAgICAgICAgICBT dGFydCAgID0gU3RhcnQsCiAgICAgICAgICAgICAgICAgRW5kICAgICA9IEVuZCwKICAgICAg ICAgICAgICAgICBSYXdUZXh0ID0gTGluZXMoU291cmNlLCBTdGFydCwgRW5kKSwKICAgICAg ICAgICAgICAgICBTZWN0aW9uID0gQ3VycmVudFNlY3Rpb24sCiAgICAgICAgfQoKICAgICAg ICAtLSBBc3N1bWUgdGhhdCB0YWdzIGFyZSBpc3N1ZWQgaW4gYXNjZW5kaW5nLWxpbmUtbnVt YmVyIHNlcXVlbmNlLAogICAgICAgIC0tIGFuZCBzbyBrZWVwIHRyYWNrIG9mIGludGVydmVu aW5nIHRleHQgYmV0d2VlbiB0YWdnZWQgc2VjdGlvbnMuCiAgICAgICAgLS0gKFRoZXNlIHNo b3VsZCAqb25seSogYmUgYmxhbmsgbGluZXM7IGFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3Iu KQogICAgICAgIGlmIFNvdXJjZS5QcmV2TGluZSA8IFN0YXJ0IHRoZW4KICAgICAgICAgICAg ICAgIEVudHJ5LlByZXZUZXh0ID0gTGluZXMoU291cmNlLCBTb3VyY2UuUHJldkxpbmUsIFN0 YXJ0IC0gMSkKICAgICAgICBlbmQKICAgICAgICBTb3VyY2UuUHJldkxpbmUgPSBFbmQgKyAx CgogICAgICAgIC0tIFJlY29yZCBuZXcgZW50cnksIGJvdGggYnkgbmFtZSBhbmQgYnkgc2Vx dWVuY2UKICAgICAgICBzZWxmLlNlZ0xpc3RbTmFtZV0gPSBFbnRyeQogICAgICAgIHNlbGYu U2VnU2VxWyNzZWxmLlNlZ1NlcSArIDFdID0gRW50cnkKCi0tW1sgV2FybmluZyB0dXJuZWQg b2ZmIGZvciB0aGUgbW9tZW50OiBJdCdzIG5vdCB0b3Agb2YgdGhlIHByaW9yaXR5IGxpc3Qu CiAgICAgICAgLS0gUmVwb3J0IGhvcml6b250YWwgdGFicyBpbiB0aGUgc291cmNlCiAgICAg ICAgaWYgRW50cnkuUmF3VGV4dDptYXRjaCgiXHQiKSB0aGVuCiAgICAgICAgICAgICAgICBw cmludCgiV2FybmluZzogU2VnbWVudCAiIC4uCiAgICAgICAgICAgICAgICAgICAgICAgICBF bnRyeS5OYW1lIC4uIiBjb250YWlucyB0YWJzLiIpCiAgICAgICAgZW5kCi0tXV0KZW5kCgot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQoKLS1bWyAgLS0gREVCVUc6IE9taXR0ZWQgZm9yIG5vdywg YnV0IGl0J3MgdmVyeSBoYW5keSB0byBoYXZlIHdoZW4KLS0gbWVyZ2luZyBnaXQgbWFzdGVy IGNoYW5nZXMgd2l0aCBsb2NhbCBicmFuY2ggY2hhbmdlcy4KCi0tIFByaW50IG91dCBhbGwg dGhlIHNlZ21lbnRzIGV4dHJhY3RlZCAob3IgbWFudWZhY3R1cmVkKSBzbyBmYXIKZm9yIF8s IFNlZyBpbiBpcGFpcnMoU2Vncy5TZWdTZXEpIGRvCiAgICAgICAgcHJpbnRmKCIlczpcbiVz XG4iLCBTZWcuTmFtZSwgSW5kZW50KFNlZy5SYXdUZXh0LCA4KSkKZW5kCi0tXV0KCi0tIFtb IF1dIC0tIEVtYWNzIHByZXR0eS1wcmludGluZyBnZXQgY29uZnVzZWQgaWYgdGhpcyBsaW5l IGlzbid0IHByZXNlbnQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLS0gQ2hlY2sgdGhhdCBu byBpbXBvcnRhbnQgdGV4dCAoYW55dGhpbmcgb3RoZXIgdGhhbiBuZXdsaW5lcykgaGFzCi0t IGJlZW4gbGVmdCB1bnRhZ2dlZCAoaXQgaXMgY2FwdHVyZWQgYnkgVGFnJ3MgUHJldlRleHQg ZmFjaWxpdHkpLgpmb3IgXywgU2VnIGluIGlwYWlycyhTZWdzLlNlZ1NlcSkgZG8KICAgICAg ICBsb2NhbCBQcmV2VGV4dCA9IFNlZy5QcmV2VGV4dAogICAgICAgIGlmIFByZXZUZXh0IGFu ZCBub3QgUHJldlRleHQ6bWF0Y2goIl5cbiokIikgdGhlbgogICAgICAgICAgICAgICAgLS0g V2UndmUgZm91bmQgc29tZSB1bnRhZ2dlZCB0ZXh0CiAgICAgICAgICAgICAgICBwcmludGYo IkVSUk9SOiAlczolZDolcSBoYXMgcHJlY2VkaW5nIG9taXR0ZWQgdGV4dDogXG4lc1xuIiwK ICAgICAgICAgICAgICAgICAgICAgICBTZWcuU291cmNlLkZpbGVuYW1lLCBTZWcuU3RhcnQs CiAgICAgICAgICAgICAgICAgICAgICAgU2VnLk5hbWUsIEluZGVudChQcmV2VGV4dCwgOCkp CiAgICAgICAgZW5kCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tLSBSZWNvbnN0cnVj dEZpbGUgLS0gUmVjb25zdHJ1Y3QgZmlsZSBmcm9tIHRhZ2dlZCBmcmFnbWVudHMKLS0gVGhp cyBmdW5jdGlvbiBpcyBhIHNhbml0eSBjaGVjayB0aGF0IHdlIGNhbiBmYWl0aGZ1bGx5IHJl LWFzc2VtYmxlCi0tIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBmcm9tIHRoZSBicm9rZW4t ZG93biBwaWVjZXMuICBJZiBub3QsIGFueQotLSBmdXJ0aGVyIHByb2Nlc3NpbmcgaGFzIGEg aGlnaGVyIHByb2JhYmlsaXR5IG9mIGhhdmluZyBkZWZlY3RzLgpsb2NhbCBmdW5jdGlvbiBS ZWNvbnN0cnVjdEZpbGUoU291cmNlKQogICAgICAgIC0tIEZvcm0gYSBzaW1wbGUgZmlsZW5h bWUgZm9yIHRoZSByZWNvbnN0cnVjdGlvbgogICAgICAgIGxvY2FsIFJlY29uc0ZpbGUgPSAi cmVjb25zdHJ1Y3RlZC0iIC4uIFNvdXJjZS5GaWxlbmFtZQogICAgICAgIGxvY2FsIGYgPSBh c3NlcnQoaW8ub3BlbihSZWNvbnNGaWxlLCAidyIpKQoKICAgICAgICAtLSBTZWFyY2ggZm9y IGVhY2ggc25pcHBldCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlLCBhbmQgd3JpdGUKICAg ICAgICAtLSBpdCAocGx1cyBhbnkgcHJlY2VkaW5nIHRleHQpIHRvIHRoZSBmaWxlLgogICAg ICAgIGZvciBfLCBTZWcgaW4gaXBhaXJzKFNlZ3MuU2VnU2VxKSBkbwogICAgICAgICAgICAg ICAgaWYgU2VnLlNvdXJjZSA9PSBTb3VyY2UgdGhlbgogICAgICAgICAgICAgICAgICAgICAg ICBpZiBTZWcuUHJldlRleHQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGFzc2VydChmOndyaXRlKFNlZy5QcmV2VGV4dCkpCiAgICAgICAgICAgICAgICAgICAgICAg IGVuZAogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZjp3cml0ZShTZWcuUmF3VGV4 dCkpCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgICAgICBhc3NlcnQoZjpj bG9zZSgpKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotLS0gV3JpdGVGaWxlIC0tIFJl cGxhY2UgZmlsZSB3aXRoIHNlZ21lbnRzIHN0b3JlZCBpbnRlcm5hbGx5Ci0tIFRoaXMgaXMg YSBwbGFjZWhvbGRlciBmdW5jdGlvbiB0byB1c2Ugd2hlbiBvbmx5IG1pbm9yIGVkaXRzIHRv IGEKLS0gZmlsZSBhcmUgbWFkZSwgYW5kIHRoZSBzZWdtZW50IGxpc3QgY2FuIHN0aWxsIGJl IHVzZWQgaW4gb3JkZXIuCmxvY2FsIGZ1bmN0aW9uIFdyaXRlRmlsZShTb3VyY2UpCiAgICAg ICAgLS0gRm9ybSBhIHNpbXBsZSBmaWxlbmFtZSBmb3IgdGhlIHJlY29uc3RydWN0aW9uCiAg ICAgICAgbG9jYWwgZiA9IGFzc2VydChpby5vcGVuKFNvdXJjZS5GaWxlbmFtZSwgInciKSkK CiAgICAgICAgLS0gU2VhcmNoIGZvciBlYWNoIHNuaXBwZXQgZnJvbSB0aGUgc3BlY2lmaWVk IHNvdXJjZSwgYW5kIHdyaXRlCiAgICAgICAgLS0gaXQgKHBsdXMgYW55IHByZWNlZGluZyB0 ZXh0KSB0byB0aGUgZmlsZS4KICAgICAgICBmb3IgXywgU2VnIGluIGlwYWlycyhTZWdzLlNl Z1NlcSkgZG8KICAgICAgICAgICAgICAgIGlmIFNlZy5Tb3VyY2UgPT0gU291cmNlIHRoZW4K ICAgICAgICAgICAgICAgICAgICAgICAgaWYgU2VnLlByZXZUZXh0IHRoZW4KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZjp3cml0ZShTZWcuUHJldlRleHQpKQog ICAgICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgYXNz ZXJ0KGY6d3JpdGUoU2VnLlJhd1RleHQpKQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAg ZW5kCiAgICAgICAgYXNzZXJ0KGY6Y2xvc2UoKSkKZW5kCgotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoKLS0tIFJhd1RleHQgLS0gUmV0dXJuIHJhdyB0ZXh0IGFzc29jaWF0ZWQgd2l0aCBuYW1l ZCBzZWdtZW50Ci0tIEBwYXJhbSBUYWcgLS0gVGFnIGdpdmVuIHRvIHNlZ21lbnQgdXBvbiBj cmVhdGlvbi4KLS0gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVwb3J0IGFu eSB3aGl0ZXNwYWNlIHRoYXQgbWF5Ci0tIHByZWNlZGUgdGhlIHNlZ21lbnQuCmxvY2FsIGZ1 bmN0aW9uIFJhd1RleHQoVGFnKQogICAgICAgIGxvY2FsIFJhd1RleHQgPSBTZWdzLlNlZ0xp c3RbVGFnXS5SYXdUZXh0CiAgICAgICAgaWYgbm90IFJhd1RleHQgdGhlbgogICAgICAgICAg ICAgICAgZXJyb3IoXygiOlJhd1RleHQ6IE5vbmV4aXN0ZW50IHRhZyByZXF1ZXN0ZWQ6ICIg Li4gVGFnKSkKICAgICAgICBlbmQKICAgICAgICByZXR1cm4gUmF3VGV4dAplbmQKCi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCgotLS0gRWRpdGVkVGV4dCAtLSBPYnRhaW4gcmF3IHRleHQgYm9k eSBvZiB0YWcsIHdpdGggYXBwbGllZCBlZGl0cwotLSBAcGFyYW0gVGFnTmFtZSAtLSBUYWcg bmFtZSBvZiBjb2RlIHNuaXBwZXQKLS0gQHBhcmFtIC4uLiAtLSBQYXR0ZXJuL1N1YnN0IHBh aXJzLCBlLmcuICJjaGFyY2xhc3MgYyIsICJjaGFyY2xhc3MgKmMiCi0tIEByZXR1cm4gTW9k aWZpZWQgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0tIFRoaXMgZnVuY3Rpb24gc2ltcGxpZmll cyB0aGUgY29kZSBuZWVkZWQgdG8gbWFrZSBnbG9iYWwKLS0gc2VhcmNoLWFuZC1yZXBsYWNl IGNoYW5nZXMgb24gc291cmNlIGZpbGVzLiAgU29tZSBjYXJlIGFuZCBwcmVjaXNpb24KLS0g aXMgbmVlZGVkIGluIHRoZSBzb3VyY2Ugc2VsZWN0aW9uIHRvIGF2b2lkIG1ha2luZyB1bmlu dGVuZGVkIGNoYW5nZXMuCmxvY2FsIGZ1bmN0aW9uIEVkaXRlZFRleHQoVGFnTmFtZSwgLi4u KQogICAgICAgIGxvY2FsIGggPSBSYXdUZXh0KFRhZ05hbWUpCgogICAgICAgICAtLSBJZiB0 aGVyZSBhcmUgb3B0aW9uYWwgcGFyYW1ldGVycywgdHJlYXQgdGhlbSBhcyBwYXR0ZXJuL3N1 YnN0CiAgICAgICAgIC0tIHBhaXJzLCBhbmQgYXBwbHkgdGhlbSB0byB0aGUgaGVhZGVyLgog ICAgICAgICBsb2NhbCBhcmdzID0gey4uLn0KICAgICAgICAgaWYgI2FyZ3MgJSAyIH49IDAg dGhlbgogICAgICAgICAgICAgICAgIGVycm9yKAogICAiOkVkaXRlZFRleHQ6IFBhdHRlcm4g c3VwcGxpZWQgd2l0aG91dCBhIG1hdGNoaW5nIHN1YnN0IGl0ZW0iKQogICAgICAgICBlbmQK ICAgICAgICAgZm9yIGkgPSAxLCAjYXJncywgMiBkbwogICAgICAgICAgICAgICAgIGggPSBo OmdzdWIoYXJnc1tpXSwgYXJnc1tpICsgMV0pCiAgICAgICAgIGVuZAogICAgICAgICByZXR1 cm4gaAplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotLS0gVGV4dFN1YnN0IC0tIExpa2Ug Z3N1YigpLCBidXQgd2l0aCBubyByZWdleHAgcGF0dGVybiBtYXRjaGluZwotLSBUaGlzIGZ1 bmN0aW9uIGlzIGludGVuZGVkIGZvciByZXdyaXRpbmcgYmxvY2tzIG9mIGNvZGUsIHdoZXJl IHRoZQotLSBvcmlnaW5hbCBoYXMgbG90cyBvZiBwYXR0ZXJuLW1hZ2ljIGNoYXJhY3RlcnMg c3VjaCBhcyAiLSIsICIoIiwgIiUiCi0tIGV0Yy4gIFdlIHVzZSBzdHJpbmcuZmluZCgpIGFz IGl0IGhhcyBhICJwbGFpbiB0ZXh0IiBzZWFyY2ggb3B0aW9uLgpsb2NhbCBmdW5jdGlvbiBU ZXh0U3Vic3QoT3JpZ2luYWwsIFNlYXJjaCwgUmVwbGFjZW1lbnQpCiAgICAgICAgbG9jYWwg UG9zID0gMQogICAgICAgIGxvY2FsIFRleHQgPSBPcmlnaW5hbAogICAgICAgIGxvY2FsIEZv dW5kID0gZmFsc2UKICAgICAgICB3aGlsZSB0cnVlIGRvCiAgICAgICAgICAgLS0gRmluZCB0 aGUgc3RhcnQgYW5kIGVuZGluZyBpbmRpY2VzIG9mIFNlYXJjaCBpbiB0aGUgZmlsZQogICAg ICAgICAgIGxvY2FsIFN0YXJ0LCBFbmQgPSBUZXh0OmZpbmQoU2VhcmNoLCBQb3MsIHRydWUp OwotLSAgICAgICAgICAgcHJpbnQoIlN0YXJ0LCBFbmQsIFBvcywgU2VhcmNoOiAiLCBTdGFy dCwgRW5kLCBQb3MsIFNlYXJjaCkKICAgICAgICAgICBpZiBub3QgU3RhcnQgdGhlbgogICAg ICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgZW5kCiAgICAgICAgICAgRm91bmQgPSB0cnVl CgogICAgICAgICAgIC0tIFNwbGljZSB0aGUgcmVwbGFjZW1lbnQgaW4sIGluIHBsYWNlIG9m IHRoZSBzZWFyY2ggdGV4dAogICAgICAgICAgIFRleHQgPSBUZXh0OnN1YigxLCBTdGFydCAt IDEpIC4uIFJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgIC4uIFRleHQ6c3ViKEVuZCAr IDEpCiAgICAgICAgICAgUG9zID0gU3RhcnQgKyAjUmVwbGFjZW1lbnQKICAgICAgICBlbmQK CiAgICAgICAgYXNzZXJ0KEZvdW5kLCAiVGV4dFN1YnN0IGV4cGVjdGVkIGF0IGxlYXN0IDEg bWF0Y2g6ICIgLi4gU2VhcmNoKQoKICAgICAgICByZXR1cm4gVGV4dAplbmQKCi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCgotLS0gV3JpdGVFeHRlcm5EZWNsIC0tIFdyaXRlIGZ1bmN0aW9uIGRl Y2xhcmF0aW9uIHRvIGdpdmVuIGZpbGUuCi0tIEBwYXJhbSBGaWxlIEZpbGUgKHN0cmVhbSkg b2JqZWN0IHRvIHJlY2VpdmUgZWRpdGVkIGRlY2xhcmF0aW9uLgotLSBAUGFyYW0gRGVjbGFy YXRpb24gRnVuY3Rpb24gZGVjbGFyYXRpb24gKHdpdGggbm8gcHJlY2VkaW5nIGxpZmV0aW1l Ci0tICAgICAgICBzcGVjaWZpZXIsIGFuZCBhbHNvIHdpdGhvdXQgYSB0cmFpbGluZyBzZW1p Y29sb24pLgotLSBEZWNsYXJhdGlvbnMgZm9yIGdsb2JhbGx5LXZpc2libGUgKGludGVyZmFj ZSkgZnVuY3Rpb25zIG5lZWQgdG8gYmUKLS0gZW1pdHRlZCBhdCBsZWFzdCB0d2ljZTogIE9u Y2UgaW4gdGhlIGhlYWRlciBmaWxlLCBhbmQgYWdhaW4gaW4gdGhlCi0tIGJvZHkgb2YgdGhl IGltcGxlbWVudGluZyBtb2R1bGUuICBUaGlzIGZ1bmN0aW9uIGVkaXRzIHRoZSB0ZXh0IG9m Ci0tIHRoZSBkZWNsYXJhdGlvbiB0byBjb25mb3JtIHRvIHRoZSByZXF1aXJlbWVudGVzIG9m IHRoZSBoZWFkZXIgZmlsZSwKLS0gbmFtZWx5LCBhIHByZWNlZGluZyAiZXh0ZXJuIiBrZXl3 b3JkLCBwbHVzIGEgdHJhaWxpbmcgc2VtaWNvbG9uCi0tIGJlZm9yZSB0aGUgZmluYWwgbmV3 bGluZS4gIFRoZSBlZGl0ZWQgdGV4dCBpcyB0aGVuIHdyaXR0ZW4gdG8gdGhlCi0tIGdpdmVu IGZpbGUsIGFsb25nIHdpdGggdGhlIHVzdWFsIGFzc2VydCBlcnJvciBjaGVja2luZy4KbG9j YWwgZnVuY3Rpb24gV3JpdGVFeHRlcm5EZWNsKEZpbGUsIERlY2xhcmF0aW9uKQogICAgICAg IGxvY2FsIENvbW1lbnQsIERlY2wKICAgICAgICBDb21tZW50LCBEZWNsID0gRGVjbGFyYXRp b246bWF0Y2goIigvJSouLSUqL1xuKykoLiopIikKICAgICAgICBpZiBub3QgRGVjbCB0aGVu CiAgICAgICAgICAgICAgICBDb21tZW50ID0gIiIKICAgICAgICAgICAgICAgIERlY2wgPSBE ZWNsYXJhdGlvbgogICAgICAgIGVuZAoKICAgICAgICAtLSBBZGQgImV4dGVybiIgYmVmb3Jl IHRoZSB0ZXh0IG9mIHRoZSBkZWNsYXJhdGlvbgogICAgICAgIERlY2wgPSBEZWNsOmdzdWIo Il4iLCAiZXh0ZXJuICIpCgogICAgICAgLS0gSW5zZXJ0IGEgc2VtaWNvbG9uIGJlZm9yZSB0 aGUgZmluYWwgbmV3bGluZSBvZiB0aGUgZGVjbGFyYXRpb24uCiAgICAgICBEZWNsID0gRGVj bDpnc3ViKCJcbiVzKiQiLCAiO1xuIikKCiAgICAgICAtLSBGaW5hbGx5LCB3cml0ZSB0aGUg cmVzdWx0IHRvIHRoZSBmaWxlLCB3aXRoIGVycm9yIGNoZWNraW5nCiAgICAgICBhc3NlcnQo RmlsZTp3cml0ZShDb21tZW50LCBEZWNsLCAiXG4iKSkKZW5kCgotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKLS0gUHJvY2VzcyBkZmEuaApTZWN0aW9uKCJkZmEuaCBoZWFkZXIiLCBkZmFoLCAw KQoKU2VnczpUYWcoIkRlc2NyaXB0aW9uLmRmYWgiLCAgICAgICAgICAgICAgIDEpClNlZ3M6 VGFnKCJDb3B5cmlnaHQuZGZhaCIsICAgICAgICAgICAgICAgICAyKQpTZWdzOlRhZygiTGlj ZW5zZVdhcnJhbnR5LmRmYWgiLCAgICAgICAgICAgNCwgIDE3KQpTZWdzOlRhZygiQXV0aG9y cy5kZmFoIiwgICAgICAgICAgICAgICAgICAxOSwgIDE5KQoKU2VjdGlvbigiZGZhLmg6aW5j bHVkZXMiLCBkZmFoLCAyMSkKU2VnczpUYWcoInJlZ2V4LmgiLCAgICAgICAgICAgICAgICAg ICAgICAgIDApClNlZ3M6VGFnKCJzdGRib29sLmgiLCAgICAgICAgICAgICAgICAgICAgICAx KQpTZWdzOlRhZygic3RkZGVmLmgiLCAgICAgICAgICAgICAgICAgICAgICAgMikKClNlY3Rp b24oInN0cnVjdCBkZmFtdXN0IGRlZm4iLCBkZmFoLCAyNSkKU2VnczpUYWcoImRmYW11c3Qt c3RydWN0IGRlc2NyaXB0aW9uIiwgICAgIDAsICAgMSkKU2VnczpUYWcoImRmYW11c3Qtc3Ry dWN0IGRlY2xhcmF0aW9uIiwgICAgIDIsICAgOSkKClNlY3Rpb24oImRmYSBvcGFxdWUgc3Ry dWN0IiwgZGZhaCwgMzYpClNlZ3M6VGFnKCJzdHJ1Y3QgZGZhIiwgICAgICAgICAgICAgICAg ICAgICAwLCAgIDEpCgpTZWN0aW9uKCJkZmEuaDpFbnRyeSBQb2ludHMiLCBkZmFoLCAzOSkK U2VnczpUYWcoIkVudHJ5IFBvaW50cyBoZWFkZXIiLCAgICAgICAgICAgIDApClNlZ3M6VGFn KCJkZmFhbGxvYyBkZXNjcmlwdGlvbiIsICAgICAgICAgICAyLCAgIDQpClNlZ3M6VGFnKCJk ZmFhbGxvYyBkZWNsYXJhdGlvbiIsICAgICAgICAgICA1KQpTZWdzOlRhZygiZGZhbXVzdHMg ZGVzY3JpcHRpb24iLCAgICAgICAgICAgNykKU2VnczpUYWcoImRmYW11c3RzIGRlY2xhcmF0 aW9uIiwgICAgICAgICAgIDgpClNlZ3M6VGFnKCJkZmFzeW50YXggZGVjbGFyYXRpb24iLCAg ICAgICAgIDEwLCAgMTMpClNlZ3M6VGFnKCJkZmFjb21wIGRlY2xhcmF0aW9uIiwgICAgICAg ICAgIDE1LCAgMTgpCgpTZWN0aW9uKCJkZmFleGVjIGVudHJ5IHBvaW50IiwgZGZhaCwgNTkp ClNlZ3M6VGFnKCJkZmFleGVjIGRlc2NyaXB0aW9uIiwgICAgICAgICAgICAwLCAgMTEpClNl Z3M6VGFnKCJkZmFleGVjIGRlY2xhcmF0aW9uIiwgICAgICAgICAgIDEyLCAgMTMpCgpTZWN0 aW9uKCJSZW1haW5pbmcgZW50cnkgcG9pbnRzIiwgZGZhaCwgNzQpClNlZ3M6VGFnKCJkZmFz dXBlcnNldCBkZWNsYXJhdGlvbiIsICAgICAgICAwLCAgIDUpClNlZ3M6VGFnKCJkZmFpc2Zh c3QgZGVjbGFyYXRpb24iLCAgICAgICAgICA2LCAgIDcpClNlZ3M6VGFnKCJkZmFmcmVlIGRl Y2xhcmF0aW9uIiwgICAgICAgICAgICA5LCAgMTApCgpTZWN0aW9uKCJTcGVjaWFsaXN0IGVu dHJ5IHBvaW50cyIsIGRmYWgsIDg2KQpTZWdzOlRhZygiRW50cnkgcG9pbnRzIGZvciBwZW9w bGUgd2hvIGtub3ciLCAwKQpTZWdzOlRhZygiZGZhaW5pdCBkZWNsYXJhdGlvbiIsICAgICAg ICAgICAgMiwgICAzKQpTZWdzOlRhZygiZGZhcGFyc2UgZGVjbGFyYXRpb24iLCAgICAgICAg ICAgNSwgICA2KQpTZWdzOlRhZygiZGZhYW5hbHl6ZSBkZWNsYXJhdGlvbiIsICAgICAgICAg OCwgIDEwKQpTZWdzOlRhZygiZGZhc3RhdGUgZGVjbGFyYXRpb24iLCAgICAgICAgICAxMiwg IDE0KQoKU2VjdGlvbigiZGZhaCBFcnJvciBoYW5kbGluZyIsIGRmYWgsIDEwMikKU2VnczpU YWcoIkVycm9yIGhhbmRsaW5nIGludHJvZHVjdGlvbiIsICAgIDApClNlZ3M6VGFnKCJkZmF3 YXJuIGRlY2xhcmF0aW9uIiwgICAgICAgICAgICAyLCAgIDYpClNlZ3M6VGFnKCJkZmFlcnJv ciBkZWNsYXJhdGlvbiIsICAgICAgICAgICA4LCAgMTEpCgpTZWN0aW9uKCJleHBvc2UtdXNp bmctdXRmOCIsIGRmYWgsIDExNSkKU2VnczpUYWcoInVzaW5nLXV0ZjgtZXh0ZXJuIiwgICAg ICAgICAgICAgIDApCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLS0gUHJvY2VzcyBkZmEuYwpT ZWN0aW9uKCJkZmEuYyBoZWFkZXIiLCBkZmFjLCAwKQoKU2VnczpUYWcoIkRlc2NyaXB0aW9u LmRmYWMiLCAgICAgICAgICAgICAgIDEpClNlZ3M6VGFnKCJDb3B5cmlnaHQuZGZhYyIsICAg ICAgICAgICAgICAgICAyLCAgIDMpClNlZ3M6VGFnKCJMaWNlbnNlV2FycmFudHkuZGZhYyIs ICAgICAgICAgICA1LCAgMTgpClNlZ3M6VGFnKCJBdXRob3JzLmRmYWMiLCAgICAgICAgICAg ICAgICAgIDIwLCAgMjEpClNlZ3M6VGFnKCJDb25maWdFbnYiLCAgICAgICAgICAgICAgICAg ICAgIDIzKQpTZWdzOlRhZygiT3duRGVmcy5kZmFjIiwgICAgICAgICAgICAgICAgICAyNSkK U2VnczpUYWcoIkdsb2JhbEluY2x1ZGVzIiwgICAgICAgICAgICAgICAgMjcsICAzMykKClNl Y3Rpb24oInZhcmlvdXMtbWFjcm9zLWFuZC1oZWxwZXItZm5zIiwgZGZhYywgMzUpClNlZ3M6 VGFnKCJTVFJFUSIsICAgICAgICAgICAgICAgICAgICAgICAgICAwKQpTZWdzOlRhZygiSVNB U0NJSURJR0lUIiwgICAgICAgICAgICAgICAgICAgMiwgIDEwKQpTZWdzOlRhZygiTmF0dXJh bExhbmdTdXBwb3J0IiwgICAgICAgICAgICAxMiwgIDEzKQoKU2VnczpUYWcoImRmYS13Y2hh ci13Y3R5cGUgaW5jbHVkZSIsICAgICAgMTUsICAxNikKClNlZ3M6VGFnKCJ4YWxsb2MiLCAg ICAgICAgICAgICAgICAgICAgICAgIDE4KSAtLSBtYWxsb2MrcmVhbGxvYytPT00gY2hlY2sg Zm5zCgotLSAqSW5pdGlhbCBwYXJ0KiBvZiBjb2RlIHRvIG1vZGVsIGNoYXJhY3RlciBjbGFz c2VzIGFzIGJpdCB2ZWN0b3JzIGluIGludHMKU2VjdGlvbigiSW5pdGlhbC1jaGFyY2xhc3Mt c2V0dXAtY29kZSIsIGRmYWMsIDU1KQpTZWdzOlRhZygiTm9IUFVYQml0T3BzIiwgICAgICAg ICAgICAgICAgICAgMCwgICA2KQpTZWdzOlRhZygiTk9UQ0hBUiIsICAgICAgICAgICAgICAg ICAgICAgICAgOCwgICA5KQpTZWdzOlRhZygiY2hhcmNsYXNzX3dvcmQgdHlwZWRlZiIsICAg ICAgICAxMSwgIDEzKQotLSB4eFJlbW92ZWQgU2VnczpUYWcoIklOVEJJVFMiLCAgICAgICAg ICAgICAgICAgICAgICAgMTYsICAxOSkKU2VnczpUYWcoIkNIQVJDTEFTU19XT1JEX0JJVFMi LCAgICAgICAgICAgMTUsICAxNykKU2VnczpUYWcoIkNIQVJDTEFTU19XT1JEX01BU0siLCAg ICAgICAgICAgMTksICAyMSkKU2VnczpUYWcoIkNIQVJDTEFTU19XT1JEUyBlbnVtIiwgICAg ICAgICAgMjMsICAyNykKU2VnczpUYWcoImNoYXJjbGFzc190eXBlZGVmIiwgICAgICAgICAg ICAgMjksICAzMCkKU2VnczpUYWcoInRvX3VjaGFyX3R5cGVjaGVjayIsICAgICAgICAgICAg MzIsICAzOSkKClNlY3Rpb24oIkNvbnRleHRzIiwgZGZhYywgOTYpCi0tIFNvbWV3aGF0IGhh aXJ5IGNvbnRleHQgbWFjaGluZXJ5OiBJbml0aWFsIGNoYXIgY2xhc3NpZmljYXRpb24gYml0 cwpTZWdzOlRhZygiQ29udGV4dF9CaXRtYXNrcyIsICAgICAgICAgICAgICAgMCwgIDE1KQot LSBDb250ZXh0IG1hY2hpbmVyeTogQ29uc3RyYWludHMgdG8gbWF0Y2ggYnkgKENyaXRlcmlh LCBQcmV2Q2gsIEN1cnJDaCkKLS0gc3BlY2lmaWNhdGlvbnMuClNlZ3M6VGFnKCJTVUNDRUVE U19JTl9DT05URVhUIiwgICAgICAgICAgIDE3LCAgMzkpCi0tIENvbnRleHQgbWFjaGluZXJ5 OiBNYWNyb3MgdG8gZGVmaW5lIHdoYXQgYSBjb25zdHJhaW50IGRlcGVuZHMgdXBvbgpTZWdz OlRhZygiUFJFVl8qX0RFUEVOREVOVCIsICAgICAgICAgICAgICA0MSwgIDQ5KQotLSBDb250 ZXh0IG1hY2hpbmVyeTogRmluYWxseSwgdGhlIGNvbnN0cmFpbnQgbWFnaWMgbnVtYmVycyB0 aGVtc2VsdmVzOgotLSBCaXQgOC0xMTogVmFsaWQgY29udGV4dHMgd2hlbiBuZXh0IGlzIENU WF9ORVdMSU5FOwotLSBCaXQgNC03OiAgVmFsaWQgY29udGV4dHMgd2hlbiBuZXh0IGlzIENU WF9MRVRURVI7IGFuZAotLSBCaXQgMC0zOiAgVmFsaWQgY2ludGV4dHMgd2hlbiBuZXh0IGlz IENUWF9OT05FLgotLSBOb3RlIHRoYXQgIkNUWF9OT05FIiBwcm9iYWJseSBzaG91bGQgYmUg Y2FsbGVkICJDVFhfT1RIRVJTIiwgYW5kCi0tIGRlZmluZWQgYWZ0ZXIgQ1RYX05FV0xJTkUg YW5kIENUWF9MRVRURVIsIGJ1dCBiZWZvcmUgQ1RYX0FMTApTZWdzOlRhZygiQ29udGV4dF9N QUdJQ19OVU1TIiwgICAgICAgICAgICA1MSwgIDYxKQoKU2VjdGlvbigiTGV4aWNhbCBUb2tl bnMiLCBkZmFjLCAxNTkpCi0tID8/IGRvZXMgdG9rZW4gbmVlZCB0byBiZSBwdHJkaWZmX3Q/ ICBTaG91bGQgd2Ugc2VwYXJhdGUgY29tbWVudCBmcm9tCi0tIGNvZGU/ClNlZ3M6VGFnKCJS ZWdleHBUb2tlblR5cGUiLCAgICAgICAgICAgICAgICAwLCAgIDQpCgotLSBMaXN0IG9mIGFs bCBwcmVkZWZpbmVkIHRva2Vucy4gIEluaXRpYWxseSwgd2UgbWVyZWx5IGp1c3QgZ3JhYiBh bGwKLS0gdGhlIGRlZmluaXRpb25zIGluIG9uZSBzbGFiLiAgSG93ZXZlciwgdGhlIGNvbW1l bnQgc3RhdGVzIHRoYXQgc29tZQotLSB2YWx1ZXMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUg bGV4aWNhbCBhbmFseXplciwgc28gbGF0ZXIgb24sIHdlCi0tIG1heSBtb3ZlIHRoZXNlIGlu dG8gYSBzZXBhcmF0ZSBibG9jayB0byBsaW1pdCB0aGVpciB2aXNpYmlsaXR5L3Njb3BlLgpT ZWdzOlRhZygiUHJlZGVmaW5lZFRva2VucyIsICAgICAgICAgICAgICAgNiwgIDkyKQoKLS0g UmVjb2duaXplciAodG9rZW4gcG9zaXRpb24gKyBjb25zdHJhaW50KSBwb3NpdGlvbiB0eXBl IChhdG9tKSwgcGx1cwotLSB0aGUgcG9zaXRpb25fc2V0IHN0cnVjdHVyZSB0byBkeW5hbWlj YWxseSBtYW5hZ2UgYXJyYXlzIG9mIHBvc2l0aW9uIGF0b21zLgpTZWdzOlRhZygiUG9zaXRp b25BdG9tK0R5blNldCIsICAgICAgICAgICA5NSwgMTExKQoKLS0gPz8gU2VjdGlvbiBkZWZu PwoKLS0gVGhlIGxlYWZfc2V0IHR5cGUgc2VlbXMgb3V0LW9mLXBsYWNlIGhlcmU6IFRoZSBj b21tZW50IHJlZmVycyB0bwotLSBwb3NpdGlvbl9zZXQsIGJ1dCB0aGUgZWxlbWVudCBwb2lu dGVyIGRvZXMgbm90IChzaXplX3QpLCBhbmQgdGhlIG9ubHkgdXNlCi0tIG9mIHRoaXMgdHlw ZSBpcyBpbiBkZmFzdGF0ZSAobmVhciBsaW5lIDI1MDApLCBhZnRlciBsZXggYW5kIHBhcnNl LgpTZWdzOlRhZygibGVhZl9zZXRfdHlwZWRlZiIsICAgICAgICAgICAgIDExMiwgMTE4KQoK U2VjdGlvbigiREZBIHN0YXRlIiwgZGZhYywgMjc5KQoKLS0gRGVmaW5lIGRmYV9zdGF0ZSB0 eXBlOiBXaGlsZSB0aGUgbGV4ZXIvcGFyc2VyIGFyZSBub3QgREZBL05GQS1zcGVjaWZpYywK LS0gdGhpcyB0eXBlIGZlYXR1cmVzIHByb21pbmVudGx5IGluIHByb2R1Y2luZyBhIGRmYS11 c2FibGUgZGVzY3JpcHRpb24gb2YKLS0gdGhlIHNlYXJjaCBleHByZXNzaW9uLiAgU2VlIGVz cGVjaWFsbHkgZmllbGQgInN0YXRlcyIgb2YgInN0cnVjdCBkZmEiLgpTZWdzOlRhZygiZGZh X3N0YXRlX3R5cGVkZWYiLCAgICAgICAgICAgICAgMCwgIDE1KQpTZWdzOlRhZygic3RhdGVf bnVtX3R5cGVkZWYiLCAgICAgICAgICAgICAxNiwgIDE5KQoKU2VjdGlvbigiY2xhc3Nlcywg YWxsb2MsIG1pc2MuIGJpdHMiLCBkZmFjLCAzMDApCgotLSBTdHJ1Y3QgdG8gaGFuZGxlIGJv dGggY2hhci1iYXNlZCBhbmQgd2lkZS1jaGFyLWJhc2VkIGNoYXJhY3RlciBjbGFzc2VzCi0t ICJlLmcuLCBbYS1jXSwgW1s6YWxwaGE6XV0sIGV0Yy4iCi0tIENIQVJfQklUIGlzIGF0IG1p bmltdW0gOCwgYnV0IGNhbiBiZSBtb3JlIChlLmcuIDMyIG9uIHNvbWUgRFNQcykuCi0tID8/ IENIQVJfQklUIDxsaW1pdHMuaD4gdmVyc3VzIENIQVJCSVRTPwpTZWdzOlRhZygibWJfY2hh cl9jbGFzc2VzX3N0cnVjdCIsICAgICAgICAgMCwgIDIwKQoKLS0gTWFpbiBkZmEgc3RydWN0 dXJlIC0tIChPY3QgMjAxMyBmaXJzdCBpbXByZXNzaW9uOikgQml0IG9mIGEgZG9nJ3MKLS0g YnJlYWtmYXN0IHdpdGggZXZlcnl0aGluZyB0aHJvd24gaW4uICBJbml0aWFsbHksIG1lcmVs eSBjYXB0dXJlIHRoZQotLSB3aG9sZSBzdHJ1Y3R1cmUgaW4gYSBzaW5nbGUgc2VnbWVudCwg dGhlbiwgYXMgdGltZSBhbmQKLS0gdW5kZXJzdGFuZGluZyBhZHZhbmNlcywgYnJlYWsgaW50 byBtb3JlIGZvY3Vzc2VkIHNtYWxsZXIgc2Vncy4KU2VnczpUYWcoImRmYS1zdHJ1Y3QgaW50 cm8taGVhZGVyIiwgICAgICAgMjIsICAyNCkKU2VnczpUYWcoImRmYS1zdHJ1Y3Qgc2Nhbm5l ciIsICAgICAgICAgICAgMjUsICAyOCkKU2VnczpUYWcoImRmYS1zdHJ1Y3QgcGFyc2VyIiwg ICAgICAgICAgICAgMzAsICA0MykKU2VnczpUYWcoImRmYS1zdHJ1Y3QgZGZhZXhlYy1mbiIs ICAgICAgICAgNDUsICA0NikKU2VnczpUYWcoImRmYS1zdHJ1Y3QgcGFyc2VyLW11bHRpYnl0 ZSIsICAgNDgsICA2NykKU2VnczpUYWcoImRmYS1zdHJ1Y3QgbWJydG93Y19jYWNoZSIsICAg ICAgNjksICA3MikKClNlY3Rpb24oImRmYSBzdHJ1Y3Q6IGJyYWNrZXQvc3RhdGUvcGFyc2Ui LCBkZmFjLCAzNzQpClNlZ3M6VGFnKCJkZmEtc3RydWN0IGJyYWNrZXQtZXhwcmVzc2lvbnMt YXJyYXkiLCAwLCAgIDMpClNlZ3M6VGFnKCJkZmEtc3RydWN0IHN1cGVyc2V0IiwgICAgICAg ICAgICA1LCAgIDYpClNlZ3M6VGFnKCJkZmEtc3RydWN0IHN0YXRlLWJ1aWxkZXIiLCAgICAg ICA4LCAgMTEpClNlZ3M6VGFnKCJkZmEtc3RydWN0IHBhcnNlLT5uZmEiLCAgICAgICAgIDEz LCAgMjcpClNlZ3M6VGFnKCJkZmEtc3RydWN0IGRmYWV4ZWMiLCAgICAgICAgICAgIDI5LCAg NTcpClNlZ3M6VGFnKCJkZmEtc3RydWN0IG11c3RzIGxpc3QiLCAgICAgICAgIDU4LCAgNjAp ClNlZ3M6VGFnKCJkZmEtc3RydWN0IG1iX2ZvbGxvd3MiLCAgICAgICAgIDYxLCAgNjIpClNl Z3M6VGFnKCJkZmEtc3RydWN0IG1iX21hdGNoX2xlbnMiLCAgICAgIDYzLCAgNjUpClNlZ3M6 VGFnKCJkZmEtc3RydWN0IGNsb3Npbmcgc3ludGF4IiwgICAgIDY2KQoKLS0gIlNvbWUgbWFj cm9zIGZvciB1c2VyIGFjY2VzcyB0byBkZmEgaW50ZXJuYWxzLiAiClNlY3Rpb24oImRmYSBo ZWxwZXIgbWFjcm9zIGFuZCBkZWNscyIsIGRmYWMsIDQ0MikKU2VnczpUYWcoImRmYS1hY2Nl c3MtbWFjcm9zLWNtdCIsICAgICAgICAgIDApClNlZ3M6VGFnKCJBQ0NFUFRJTkciLCAgICAg ICAgICAgICAgICAgICAgICAyLCAgMykKU2VnczpUYWcoIkFDQ0VQVFNfSU5fQ09OVEVYVCIs ICAgICAgICAgICAgIDUsICA3KQoKLS0gPz8gTm90IHN1cmUgd2h5IGZvcndhcmQgZGVjbGFy YXRpb25zIG9mIGRmYW11c3QgYW5kIHJlZ2V4cCBhcmUgaGVyZS4KLS0gUmVnZXhwIGFuc3dl cjogIFJlZ2V4cCBpcyBuZWVkZWQgaW4gYXRvbSAoTFBBUkVOIHJlZ2V4cCBSUEFSRU4pLgpT ZWdzOlRhZygiZGZhbXVzdC1mb3J3YXJkLWRlZiIsICAgICAgICAgICAgOSkKU2VnczpUYWco InJlZ2V4cC1mb3J3YXJkLWRlZiIsICAgICAgICAgICAgMTApCgotLSBDb2RlIHRvIG1pbmlt aXNlIGV4cGVuc2l2ZSBjYWxscyB0byBtYnJ0b3djIGJ5IEZFVENIX1dDLiAgVGhpcyBpcwot LSBkb25lIGJ5IG9ic2VydmluZyBob3cgdGhlIGZ1bmN0aW9uIHJlYWN0cyB0byBzaW5nbGUt b2N0ZXQgaW5wdXRzLAotLSBhbmQgc3BsaXR0aW5nIHRoZSByZXN1bHRzIGludG8gInJldHVy biBvY3RldCIgYW5kICJwcm9iZSBmdXJ0aGVyIgotLSBzZXRzICh3aXRoIFdFT0YgdGhlIHNl bnRpbmVsIGZvciAicHJvYmUgZnVydGhlciIsIGFuZCBvY3RldCB2YWx1ZXMKLS0gbWVhbmlu ZyAicmV0dXJuIHRoaXMgdmFsdWUiKS4KU2VjdGlvbigiZGZhbWJjYWNoZSBhbmQgbWJzX3Rv X3djaGFyIiwgZGZhYywgNDU0KQpTZWdzOlRhZygiZGZhbWJjYWNoZSIsICAgICAgICAgICAg ICAgICAgICAgMCwgIDEyKQpTZWdzOlRhZygibWJzX3RvX3djaGFyIiwgICAgICAgICAgICAg ICAgICAxNCwgIDUxKQoKLS0gRGVidWcgdXRpbGl0eSBwcnRvaywgd2l0aCBwcmVwcm9jZXNz b3IgZGlyZWN0aXZlcyBzZXBhcmF0ZWQgb3V0ClNlY3Rpb24oInBydG9rIGRlYnVnIiwgZGZh YywgNTA3KQpTZWdzOlRhZygicHJ0b2staWZkZWYtREVCVUctc3RhcnQiLCAgICAgICAgMCkK U2VnczpUYWcoInBydG9rLWZuLWRlY2wiLCAgICAgICAgICAgICAgICAgIDIsICAgMykKU2Vn czpUYWcoInBydG9rLWZuLWJvZHkiLCAgICAgICAgICAgICAgICAgIDQsICA3NSkKU2VnczpU YWcoInBydG9rLWlmZGVmLURFQlVHLWVuZCIsICAgICAgICAgNzYpCgotLSBDaGFyYWN0ZXIg Y2xhc3MgZmFjaWxpdGllczogc2luZ2xlLWJpdCBiaXQgdGVzdC9zZXQvY2xlYXIKU2VjdGlv bigiQ2hhcmFjdGVyIGNsYXNzZXMtaW50cm8gYW5kIGJpdG9wcyIsIGRmYWMsIDU4NSkKU2Vn czpUYWcoImNoYXJjbGFzcy1zZWN0aW9uLWludHJvZHVjdGlvbiIsIDApClNlZ3M6VGFnKCJj aGNsYXNzLXRzdGJpdC1kZWNsIiwgICAgICAgICAgICAyLCAgIDMpClNlZ3M6VGFnKCJjaGNs YXNzLXRzdGJpdC1ib2R5IiwgICAgICAgICAgICA0LCAgIDYpClNlZ3M6VGFnKCJjaGNsYXNz LXNldGJpdC1kZWNsIiwgICAgICAgICAgICA4LCAgIDkpClNlZ3M6VGFnKCJjaGNsYXNzLXNl dGJpdC1ib2R5IiwgICAgICAgICAgIDEwLCAgMTIpClNlZ3M6VGFnKCJjaGNsYXNzLWNscmJp dC1kZWNsIiwgICAgICAgICAgIDE0LCAgMTUpClNlZ3M6VGFnKCJjaGNsYXNzLWNscmJpdC1i b2R5IiwgICAgICAgICAgIDE2LCAgMTkpCgotLSAuLi4gd2hvbGUtc2V0IGNvcHksIGNsZWFy LCBpbnZlcnQsIGNvbXBhcmUKU2VjdGlvbigiQ2hhcmFjdGVyIGNsYXNzZXMtc2V0IG9wZXJh dGlvbnMiLCBkZmFjLCA2MDYpClNlZ3M6VGFnKCJjaGNsYXNzLWNvcHlzZXQtZGVjbCIsICAg ICAgICAgICAwLCAgIDEpClNlZ3M6VGFnKCJjaGNsYXNzLWNvcHlzZXQtYm9keSIsICAgICAg ICAgICAyLCAgIDQpClNlZ3M6VGFnKCJjaGNsYXNzLXplcm9zZXQtZGVjbCIsICAgICAgICAg ICA2LCAgIDcpClNlZ3M6VGFnKCJjaGNsYXNzLXplcm9zZXQtYm9keSIsICAgICAgICAgICA4 LCAgMTApClNlZ3M6VGFnKCJjaGNsYXNzLW5vdHNldC1kZWNsIiwgICAgICAgICAgIDEyLCAg MTMpClNlZ3M6VGFnKCJjaGNsYXNzLW5vdHNldC1ib2R5IiwgICAgICAgICAgIDE0LCAgMTkp ClNlZ3M6VGFnKCJjaGNsYXNzLWVxdWFsLWRlY2wiLCAgICAgICAgICAgIDIxLCAgMjIpClNl Z3M6VGFnKCJjaGNsYXNzLWVxdWFsLWJvZHkiLCAgICAgICAgICAgIDIzLCAgMjUpCgotLSBt YXliZV9yZWFsbG9jIC0tIFJlcGxhY2UgUkVBTExPQ19JRl9ORUNTU0FSWSBtYWNybyB3aXRo IGZ1bmN0aW9uClNlY3Rpb24oIk1heWJlLXJlYWxsb2MgZm4iLCBkZmFjLCA2MzMpClNlZ3M6 VGFnKCJtYXliZS1yZWFsbG9jIiwgICAgICAgICAgICAgICAgICAwLCAgMTUpCgotLSBSZXR1 cm4gdW5pcXVlIGluZGV4IHJlcHJlc2VudGluZyBzcGVjaWZpZWQgc2V0LiAgUmVmZXIgdG8g YW4gZXhpc3RpbmcKLS0gc2V0IGlmIHBvc3NpYmxlLCBvdGhlcndpZGUgYWRkIHRoaXMgc2V0 IHRvIHRoZSBzdG9yZWQgbGlzdC4KU2VjdGlvbigiQ2hhcmNsYXNzIHN0b3JhZ2UgYWxsb2Nh dGlvbiwgaW4tZGZhIiwgZGZhYywgNjUwKQpTZWdzOlRhZygiY2hhcmNsYXNzLWluZGV4LXBs dXMtZGZhIiwgICAgICAgMCwgIDE0KQpTZWdzOlRhZygiUmVsb2NhdGVkIGRmYSBmb3J3YXJk IGRlY2wiLCAgICAxNiwgIDE3KQpTZWdzOlRhZygicmVkZWZpbmVkIGNoYXJjbGFzc19pbmRl eCIsICAgICAxOSwgIDI0KQoKLS0gVmFyaWFibGVzIGhvbGRpbmcgRlNBIG9wdGlvbnMgc3Bl Y2lmaWVkIGJ5IGRmYXN5bnRheCgpClNlY3Rpb24oIkZTQSBzeW50YXggb3B0aW9ucyBzdXBw bGllZCBieSBkZmFzeW50YXgoKSIsIGRmYWMsIDY3NikKU2VnczpUYWcoIm1pc2M6IHN5bnRh eF9iaXRzX3NldCwgc3ludGF4X2JpdHMsIGNhc2VfZm9sZCwgZW9sX2J5dGUiLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICA3KQoKLS0gU3VkZGVu bHkgc3dpdGggYmFjayBpbnRvIGNoYXJhY3RlciBjb250ZXh0IGhhbmRsaW5nICh3ZSBub3cg aGF2ZSB0aGUKLS0gZGVmaW5pdGlvbiBvZiBlb2xieXRlIHRvIHVzZSBmb3IgQ1RYX05FV0xJ TkUpClNlY3Rpb24oIk1vcmUgY2hhcmFjdGVyIGNvbnRleHQgaGFuZGxpbmcgc3R1ZmYiLCBk ZmFjLCA2ODUpClNlZ3M6VGFnKCJjb250ZXh0OiBzYml0LCBsZXR0ZXJzLCBuZXdsaW5lIiwg MCwgICA3KQpTZWdzOlRhZygiSVNfV09SRF9DT05TVElUVUVOVCIsICAgICAgICAgICAgOSwg IDIwKQpTZWdzOlRhZygiY2hhcl9jb250ZXh0ICsgd2NoYXJfY3R4dCIsICAgICAyMiwgIDQw KQoKLS0gVXNlciBmdW5jdGlvbiB0aGF0IGdsb2JhbGx5IHNldHMgREZBIG9wdGlvbnMKU2Vj dGlvbigiZGZhc3ludGF4IiwgZGZhYywgNzI3KQpTZWdzOlRhZygiZGZhc3ludGF4IiwgICAg ICAgICAgICAgICAgICAgICAgMCwgIDI0KQoKU2VjdGlvbigid2lkZS1jaGFyLXNldGJpdCBm bnMiLCBkZmFjLCA3NTMpClNlZ3M6VGFnKCJzZXRiaXQ6OndjaGFyX3QgY29tbWVudCIsICAg ICAgICAwLCAgIDQpClNlZ3M6VGFnKCJNQlNfU1VQUE9SVDo6c2V0Yml0X3djIiwgICAgICAg ICA1LCAgMTQpClNlZ3M6VGFnKCJzZXRiaXRfY2FzZV9mb2xkX2MiLCAgICAgICAgICAgIDE2 LCAgMjYpCgpTZWN0aW9uKCJVVEYtOCBlbmNvZGluZyB1dGlscyIsIGRmYWMsIDc4MykKU2Vn czpUYWcoInVzaW5nX3V0ZjgiLCAgICAgICAgICAgICAgICAgICAgIDAsICAxMykKCi0tIFNp bmdsZS1ieXRlICsgQVNDSUkgb3B0aW1pc2F0aW9uIHRlc3QgZm4gYWRkZWQgKE1hciAyMDE0 KQpTZWN0aW9uKCJVc2luZy1zaW1wbGUtbG9jYWxlIiwgZGZhYywgNzk4KQpTZWdzOlRhZygi dXNpbmctc2ltcGxlLWxvY2FsZSIsICAgICAgICAgICAgMCwgIDM4KQoKLS0gVXNpbmcgdGhl IHRlcm0gImRyb3NzIiBoZXJlIGNvbWVzIGZyb20gdGhlIHNvdXJjZXMgLS0gYW5kIGl0J3Mg YSBnb29kCi0tIG5hbWUgdG8gd3JhcCB1cCB0aGUgYXNzb3J0bWVudCBvZiBzdGF0aWMgdmFy aWFibGVzIGRlZmluZWQgaGVyZS4KU2VjdGlvbigiTGV4aWNhbCBBbmFseXplciBEcm9zcyIs IGRmYWMsIDgzOCkKCi0tIFN0YXJ0IGJ5IGhhdmluZyBhbGwgdmFycyBpbiBhIHNpbmdsZSBj bHVtcDsgcHJvYmFibHkgYnJlYWsgdGhlbSBhcGFydAotLSBsYXRlciB3aGVuIHdlIGtub3cg bW9yZSBhYm91dCB3aGF0IHdlJ3JlIGRvaW5nLgpTZWdzOlRhZygibGV4LW1hbnktc3RhdGlj LXZhcnMiLCAgICAgICAgICAgMCwgIDE5KQpTZWdzOlRhZygiRkVUQ0hfV0MiLCAgICAgICAg ICAgICAgICAgICAgICAyMiwgIDQ4KQoKU2VjdGlvbigiTUlOIChhbmQgcHJldmlvdXNseSBN QVgpIiwgZGZhYywgODg4KQpTZWdzOlRhZygiTUlOIiwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgMCwgICAyKQotLSBTZWdzOlRhZygiTUFYIiwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgMywgICA1KQoKLS0gSGFuZGxlIGhhaXJ5IFVuaWNvZGUgbm9uLWxpbmVhciBjYXNl IGZvbGRpbmcgY2FzZXMKU2VjdGlvbigiSGFpcnkgVW5pY29kZSBjYXNlX2ZvbGRlZF9jb3Vu dGVycGFydHMiLCBkZmFjLCA4OTIpClNlZ3M6VGFnKCJ1bmljb2RlLWxvbmVzb21lLWxvd2Vy LXRhYmxlIiwgICAwLCAgMTUpClNlZ3M6VGFnKCJkZWYtQ0FTRV9GT0xERURfQlVGU0laRSIs ICAgICAgIDE3LCAgMjIpClNlZ3M6VGFnKCJjYXNlX2ZvbGRlZF9jb3VudGVycGFydHMtZGVj bCIsIDI0LCAgMjgpClNlZ3M6VGFnKCJjYXNlX2ZvbGRlZF9jb3VudGVycGFydHMtYm9keSIs IDI5LCAgNDUpCgotLSAiYWxwaGEiLT5pc2FscGhhKCksICJwdW5jdCItPmlzcHVuY3QoKSwg ImRpZ2l0Ii0+aXNkaWdpdCgpIGV0Yy4gbWFwcGluZwpTZWN0aW9uKCJmaW5kLVBvc2l4LW5h bWVkLXByZWRpY2F0ZSIsIGRmYWMsIDkzOSkKU2VnczpUYWcoInByZWRpY2F0ZS10eXBlZGVm IiwgICAgICAgICAgICAgIDApClNlZ3M6VGFnKCJuYW1lLXByZWQtaXNieXRlLWF0b20iLCAg ICAgICAgICAyLCAgMTEpClNlZ3M6VGFnKCJwcmVkbmFtZXMtbGlzdCIsICAgICAgICAgICAg ICAgIDEzLCAgMjcpClNlZ3M6VGFnKCJmaW5kLXByZWQiLCAgICAgICAgICAgICAgICAgICAg IDI5LCAgMzgpCgotLSBOT1RFOiBUaGUgY29tbWVudCBwcmVjZWRpbmcgcGFyc2VfYnJhY2tl dF9leHAgaXMgbWlzbGVhZGluZzogVGhlCi0tIGZ1bmN0aW9uIGhhbmRsZXMgKmJvdGgqIG11 bHRpYnl0ZS1jaGFyIChwcm9kdWNlcyBhIHN0cnVjdCBtYl9jaGFyX2NsYXNzKQotLSBhbmQg c2luZ2xlLWJ5dGUtY2hhciBjbGFzc2VzIChwcm9kdWNlcyBhIGNoYXJjbGFzcyksIG5vdCBq dXN0IG11bHRpYnl0ZS4KCi0tIEZvciBzdGFydGVycywgbWVyZWx5IGNvcHkgbWFzc2l2ZSBm dW5jdGlvbnMgdmVyYmF0aW0KU2VjdGlvbigiY2hhcmNsYXNzLXBhcnNlci1hbmQtbGV4ZXIi LCBkZmFjLCA5NzkpClNlZ3M6VGFnKCJwYXJzZV9icmFja2V0X2V4cC1kZWNsIiwgICAgICAg ICAwLCAgIDMpClNlZ3M6VGFnKCJwYXJzZV9icmFja2V0X2V4cC1ib2R5IiwgICAgICAgICA0 LCAyNzEpClNlZ3M6VGFnKCJwdXNoX2FuZF9wb3BfbGV4X3N0YXRlIiwgICAgICAgMjczLCAy ODUpClNlZ3M6VGFnKCJsZXgtZGVjbCIsICAgICAgICAgICAgICAgICAgICAgMjg3LCAyODgp ClNlZ3M6VGFnKCJsZXgtYm9keSIsICAgICAgICAgICAgICAgICAgICAgMjg5LCA2MTApCgpT ZWN0aW9uKCJSZWN1cnNpdmUtRGVzY2VudCBQYXJzZXIiLCBkZmFjLCAxNTkxKQpTZWdzOlRh ZygicmVjdXJzaXZlLWRlc2NlbnQgcGFyc2VyIGludHJvIiwgMCkKU2VnczpUYWcoImxvb2th aGVhZCB0b2tlbiIsICAgICAgICAgICAgICAgIDIpClNlZ3M6VGFnKCJkZWZlcnJlZC1wcm9k LXN0YWNrLWRlcHRoIiwgICAgICAzLCAgIDcpClNlZ3M6VGFnKCJhZGR0b2tfbWIiLCAgICAg ICAgICAgICAgICAgICAgICA5LCAgNDgpClNlZ3M6VGFnKCJhZGR0b2tfd2MgZndkIGRlY2wi LCAgICAgICAgICAgIDUwKQpTZWdzOlRhZygiYWRkdG9rIiwgICAgICAgICAgICAgICAgICAg ICAgICA1MiwgMTA2KQpTZWdzOlRhZygiYWRkdG9rX3djIiwgICAgICAgICAgICAgICAgICAg IDEwOCwgMTM4KQoKLS0gQm9keSBpcyB2b2lkIGlmIE1CU19TVVBQT1JUIGlzbid0IHRydWU7 IHRoaXMgaXMgYSBzaW1wbGUgdHJhbnNmb3JtYXRpb24sCi0tIGFuZCBzbyBpc24ndCBicm9r ZW4gb3V0IGJ5IG91ciBzZWdtZW50IHRhZ2dpbmcgYXQgcHJlc2VudC4KU2VjdGlvbigiYWRk X3V0ZjhfYW55Y2hhciIsIGRmYWMsIDE3MzEpClNlZ3M6VGFnKCJhZGRfdXRmOF9hbnljaGFy LWRlY2wiLCAgICAgICAgICAwLCAgIDEpClNlZ3M6VGFnKCJhZGRfdXRmOF9hbnljaGFyLWJv ZHktc3RhcnQiLCAgICAyKQpTZWdzOlRhZygiYWRkX3V0ZjhfYW55Y2hhci1jbGFzc2VzLWFy cmF5IiwgMywgIDIxKQpTZWdzOlRhZygiYWRkX3V0ZjhfYW55Y2hhci1jbGFzcy10YWlsb3Ii LCAyMywgIDM3KQpTZWdzOlRhZygiYWRkX3V0ZjhfYW55Y2hhci1kZXNjcmlwdGlvbiIsICAz OSwgIDQ4KQpTZWdzOlRhZygiYWRkX3V0ZjhfYW55Y2hhci1hZGQtdG9rZW5zIiwgICA0OSwg IDU2KQpTZWdzOlRhZygiYWRkX3V0ZjhfYW55Y2hhci1ib2R5LWVuZCIsICAgICA1NykKClNl Y3Rpb24oIlBhcnNlciIsIGRmYWMsIDE3OTApClNlZ3M6VGFnKCJHcmFtbWFyIHN1bW1hcnkg Y29tbWVudCIsICAgICAgICAwLCAgMzMpClNlZ3M6VGFnKCJhdG9tIiwgICAgICAgICAgICAg ICAgICAgICAgICAgIDM1LCAgOTApClNlZ3M6VGFnKCJuc3VidG9rcyIsICAgICAgICAgICAg ICAgICAgICAgIDkyLCAxMTEpClNlZ3M6VGFnKCJjb3B5dG9rcyIsICAgICAgICAgICAgICAg ICAgICAgMTEzLCAxMjUpCgpTZWN0aW9uKCJQYXJzZXIsIFBhcnQgMiIsIGRmYWMsIDE5MTcp ClNlZ3M6VGFnKCJjbG9zdXJlIiwgICAgICAgICAgICAgICAgICAgICAgICAwLCAgNDApClNl Z3M6VGFnKCJicmFuY2giLCAgICAgICAgICAgICAgICAgICAgICAgIDQyLCAgNTEpClNlZ3M6 VGFnKCJyZWdleHAiLCAgICAgICAgICAgICAgICAgICAgICAgIDUzLCAgNjMpCi0tIGRmYXBh cnNlOiBFeHRlcm5hbCB1c2VyJ3MgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBhcnNlcgot LSBTdWRkZW5seSwgdGhlIGRmYSBzdHJ1Y3QgaXMgc2VlbiBtb3JlIGluIHBhcmFtZXRlciBs aXN0cyAoYXMgImQiKSwKLS0gYWx0aG91Z2ggaXQncyBjb3BpZWQgdG8gdGhlIGZpbGUtZ2xv YmFsLXNjb3BlIHZhcmlhYmxlICJkZmEiIGhlcmUuClNlZ3M6VGFnKCJkZmFwYXJzZS1kZWNs IiwgICAgICAgICAgICAgICAgIDY1LCAgNjkpClNlZ3M6VGFnKCJkZmFwYXJzZS1ib2R5Iiwg ICAgICAgICAgICAgICAgIDcwLCAxMDIpCgotLSA/PyAgT3V0IG9mIEZTQSB0ZXJyaXRvcnks IGFuZCBpbnRvIERGQSB0ZXJyaXRvcnkuLi4geWV0PwoKU2VjdGlvbigiZGZhOiBwb3NpdGlv bl9zZXQgb3BlcmF0aW9ucyIsIGRmYWMsIDIwMjApClNlZ3M6VGFnKCJwb3NpdGlvbl9zZXQg aW50cm8iLCAgICAgICAgICAgICAwKQotLSBGdW5jdGlvbiBuYW1lcyAiY29weSIsICJpbnNl cnQiLCAibWVyZ2UiIGFuZCAiZGVsZXRlIiBhcmUgdG9vIGdlbmVyaWMKLS0gZm9yIG15IGxp a2luZy4gIEhvd2V2ZXIsIHRoZXkgZ2l2ZSBoaW50cyB0byB0aGUgaGlzdG9yeSBvZiB0aGUg Y29kZToKLS0gVGhlc2Ugd2VyZSBsaWtlbHkga2V5IHBhcnRzIG9mIHRoZSBlYXJseSBERkEg aW1wbGVtZW50YXRpb24sIGFuZCBzbwotLSBkaWRuJ3QgbmVlZCBoaWdobHktcXVhbGlmaWVk IG5hbWVzIC0tIGxhdGVyIGFkZGl0aW9ucyBuZWVkZWQgbG9uZ2VyCi0tIG5hbWVzIGluIG9y ZGVyIHRvIGF2b2lkIG5hbWVzcGFjZSBjbGFzaGVzLiAgVGhlcmUncyBhbHNvIHRoZSBwcm9i bGVtCi0tIHRoYXQgZWFybHkgY29tcGlsZXJzIG9ubHkgdXNlZCB0aGUgZmlyc3QgZmV3IGNo YXJzIG9mIGEgbmFtZSAoNj8pIGZvcgotLSBleHRlcm5hbGx5LXZpc2libGUgaWRlbnRpZmll cnMsIHNvIHZlcnktdGVyc2UgbmFtZXMgd2VyZSBuZWVkZWQgdG8KLS0gc3Vydml2ZSBpbiB0 aGlzIGVudmlyb25tZW50LgpTZWdzOlRhZygiY29weSIsICAgICAgICAgICAgICAgICAgICAg ICAgICAgMiwgIDE0KQpTZWdzOlRhZygiYWxsb2NfcG9zaXRpb25fc2V0IiwgICAgICAgICAg ICAxNiwgIDIyKQpTZWdzOlRhZygiaW5zZXJ0IiwgICAgICAgICAgICAgICAgICAgICAgICAy NCwgIDU0KQpTZWdzOlRhZygibWVyZ2UiLCAgICAgICAgICAgICAgICAgICAgICAgICA1Niwg IDg0KQpTZWdzOlRhZygiZGVsZXRlIiwgICAgICAgICAgICAgICAgICAgICAgICA4NiwgIDk4 KQpTZWdzOlRhZygic3RhdGVfaW5kZXgiLCAgICAgICAgICAgICAgICAgIDEwMCwgMTYwKSAt LSBmaW5kIGFuZC9vciBjcmVhdGUgaXRlbQpTZWdzOlRhZygiZXBzY2xvc3VyZSIsICAgICAg ICAgICAgICAgICAgIDE2MiwgMjI2KSAtLSBlcHNpbG9uIGNsb3N1cmUKCi0tIFNvbWUgbW9y ZSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBjb250ZXh0cwoKU2VjdGlvbigiQ29udGV4dC1m bnMiLCBkZmFjLCAyMjQ4KQpTZWdzOlRhZygiY2hhcmNsYXNzX2NvbnRleHQiLCAgICAgICAg ICAgICAgMCwgIDIxKQpTZWdzOlRhZygic3RhdGVfc2VwYXJhdGVfY29udGV4dHMiLCAgICAg ICAyMywgIDQ0KQoKU2VjdGlvbigiZGZhYW5hbHl6ZSIsIGRmYWMsIDIyOTUpClNlZ3M6VGFn KCJkZmFhbmFseXNlIHN1bW1hcnkgY29tbWVudCIsICAgICAwLCAgNTEpClNlZ3M6VGFnKCJk ZmFhbmFseXNlIiwgICAgICAgICAgICAgICAgICAgIDUyLCAyNjUpCgpTZWN0aW9uKCJkZmFz dGF0ZSIsIGRmYWMsIDI1NjMpClNlZ3M6VGFnKCJkZmFzdGF0ZSBzdW1tYXJ5IGNvbW1lbnQi LCAgICAgICAwLCAgMjkpClNlZ3M6VGFnKCJkZmFzdGF0ZSIsICAgICAgICAgICAgICAgICAg ICAgIDMwLCAyODQpClNlZ3M6VGFnKCJyZWFsbG9jX3RyYW5zX2lmX25lY2Vzc2FyeSIsICAg Mjg2LCAzMDkpClNlZ3M6VGFnKCJidWlsZF9zdGF0ZSIsICAgICAgICAgICAgICAgICAgMzEx LCAzNzIpCgpTZWN0aW9uKCJNdWx0aWJ5dGUgZm5zIGZvciBkZmFleGVjIiwgZGZhYywgMjkz NykKU2VnczpUYWcoIk11bHRpYnl0ZSBmbnMgc2VjdGlvbiBjb21tZW50IiwgIDApClNlZ3M6 VGFnKCJzdGF0dXNfdHJhbnNpdF9zdGF0ZSB0eXBlZGVmIiwgICAyLCAgIDkpClNlZ3M6VGFn KCJ0cmFuc2l0X3N0YXRlX3NpbmdsZWJ5dGUiLCAgICAgIDExLCAgNDcpClNlZ3M6VGFnKCJt YXRjaF9hbnljaGFyIiwgICAgICAgICAgICAgICAgIDQ5LCAgNzYpClNlZ3M6VGFnKCJtYXRj aF9tYl9jaGFyc2V0IiwgICAgICAgICAgICAgIDc4LCAxNjcpCgpTZWN0aW9uKCJNdWx0aWJ5 dGUgZm5zIGZvciBkZmFleGVjIC0gcGFydCAyIiwgZGZhYywgMzEwNikKU2VnczpUYWcoImNo ZWNrX21hdGNoaW5nX3dpdGhfbXVsdGlieXRlX29wcyIsICAgMCwgIDI5KQpTZWdzOlRhZygi dHJhbnNpdF9zdGF0ZV9jb25zdW1lXzFjaGFyIiwgICAzMSwgIDc3KQpTZWdzOlRhZygidHJh bnNpdF9zdGF0ZSIsICAgICAgICAgICAgICAgICA3OSwgMTU3KQoKU2VjdGlvbigiZGZhZXhl Yy9pbml0L29wdCIsIGRmYWMsIDMyNjUpClNlZ3M6VGFnKCJza2lwX3JlbWFpbnNfbWIiLCAg ICAgICAgICAgICAgICAwLCAgMjMpClNlZ3M6VGFnKCJkZmFleGVjX21haW4iLCAgICAgICAg ICAgICAgICAgIDI1LCAxMjcpClNlZ3M6VGFnKCJkZmFleGVjLVN0YXRlX3RyYW5zaXRpb24i LCAgICAgMTI5LCAxNjgpClNlZ3M6VGFnKCJkZmFleGVjLW1haW4tY29udGludWVkIiwgICAg ICAgMTcwLCAyNTApCgpTZWN0aW9uKCJkZmFleGVjIHNpbmdsZS9tdWx0aWJ5dGUgdmFyaWFu dHMiLCBkZmFjLCAzNTE3KQpTZWdzOlRhZygiZGZhZXhlYyB2YXJpYW50IHN1bW1hcnkiLCAg ICAgICAgMCwgICAxKQpTZWdzOlRhZygiZGZhZXhlY19tYiIsICAgICAgICAgICAgICAgICAg ICAgMywgICA4KQpTZWdzOlRhZygiZGZhZXhlY19zYiIsICAgICAgICAgICAgICAgICAgICAx MCwgIDE1KQpTZWdzOlRhZygiZGZhZXhlYyIsICAgICAgICAgICAgICAgICAgICAgICAxNywg IDI1KQoKU2VjdGlvbigiZGZhIHN1cGVyc2V0L3V0aWxzL2luaXQvb3B0IiwgZGZhYywgMzU0 NCkKU2VnczpUYWcoImRmYXN1cGVyc2V0IiwgICAgICAgICAgICAgICAgICAgIDAsICAgNCkK U2VnczpUYWcoImRkYWlzZmFzdCIsICAgICAgICAgICAgICAgICAgICAgIDYsICAxMCkKU2Vn czpUYWcoImZyZWVfbWJkYXRhIiwgICAgICAgICAgICAgICAgICAgMTIsICA0MCkKU2VnczpU YWcoImRmYWluaXQiLCAgICAgICAgICAgICAgICAgICAgICAgNDIsICA1MSkKU2VnczpUYWco ImRmYW9wdGltaXplIiwgICAgICAgICAgICAgICAgICAgNTMsICA5MSkKClNlY3Rpb24oInN1 cGVyc2V0LWJ1aWxkLCBjb21wLCBmcmVlIiwgZGZhYywgMzYzNykKU2VnczpUYWcoImRmYXNz YnVpbGQiLCAgICAgICAgICAgICAgICAgICAgIDAsICA4MSkKU2VnczpUYWcoImRmYWNvbXAi LCAgICAgICAgICAgICAgICAgICAgICAgODMsICA5OSkKU2VnczpUYWcoImRmYWZyZWUiLCAg ICAgICAgICAgICAgICAgICAgICAxMDAsIDE1MSkKLS0gZGZhYWxsb2MgKGFwcHJveC4gbGlu ZSA0MTA2KSBwcm9iYWJseSBzaG91bGQgYmUgaGVyZS4uLgoKLS0gS25vd2luZyBtdXN0LWhh dmUgc3RyaW5ncyBpcyBoaWdobHkgdmFsdWFibGUsIGFzIHdlIGNhbiB1c2UgdmVyeSBmYXN0 Ci0tIHNlYXJjaCBhbGdvcml0aG1zIChlLmcuIEJveWVyLU1vb3JlKSBpbnN0ZWFkIG9mIHRo ZSBzbG93LCBncmluZGluZwotLSBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHdvcmsgb2YgdGhl IERGQSBzZWFyY2ggZW5naW5lLiAgVGhlIGlkZWEgaXMgdGhhdAotLSB0aGUgZmFzdCBzZWFy Y2ggd2lsbCBob3BlZnVsbHkgZWxpbWluYXRlIG5lYXJseSBhbGwgdGhlIGxpbmVzIGluIHRo ZQotLSBmaWxlIChidWZmZXIpIChlLmcuIHBvc3NpYmx5IDk5JSksIHNvIHdlIGNhbiBoYXZl IG91ciBjYWtlIGFuZCBlYXQgaXQ6Ci0tIEEgY29tYmluYXRpb24gb2YgYSB2ZXJ5IGZhc3Qg c2VhcmNoIHByb2dyYW0sIHRvZ2V0aGVyIHdpdGggYW4gZXhwcmVzc2l2ZQotLSBzZWFyY2gg ZW5naW5lIHRoYXQgY2FuIGhhbmRsZSBzb3BoaXN0aWNhdGVkIGNvbnN0cnVjdHMgc3VjaCBh cyB7bixtfQotLSByZXBlYXQgY29uc3RydWN0cywgbXVsdGlieXRlIGNoYXJhY3RlcnMgKGlu Y2x1ZGluZyBjb2xsYXRpb24gY2xhc3NlcykgaW4KLS0gbXVsdGlwbGUgbG9jYWxlcywgYW5k IGJhY2tyZWZlcmVuY2VzLgpTZWN0aW9uKCJtdXN0aGF2ZS1zdHJpbmdzOiBkb2NzLXN1cHBv cnQiLCBkZmFjLCAzNzkwKQpTZWdzOlRhZygiJ211c3RzJyBleHBsYW5hdGlvbiIsICAgICAg ICAgICAgMCwgIDgyKQpTZWdzOlRhZygiaWNhdGFsbG9jIiwgICAgICAgICAgICAgICAgICAg ICA4NCwgIDk2KQpTZWdzOlRhZygiZnJlZWxpc3QiLCAgICAgICAgICAgICAgICAgICAgICA5 OCwgMTAzKQpTZWdzOlRhZygiZW5saXN0IiwgICAgICAgICAgICAgICAgICAgICAgIDEwNSwg MTM2KQpTZWdzOlRhZygiY29tc3VicyIsICAgICAgICAgICAgICAgICAgICAgIDEzOCwgMTYz KQpTZWdzOlRhZygiYWRkbGlzdHMiLCAgICAgICAgICAgICAgICAgICAgIDE2NSwgMTcxKQpT ZWdzOlRhZygiaW5ib3RoIiwgICAgICAgICAgICAgICAgICAgICAgIDE3MywgMTkyKQoKU2Vj dGlvbigibXVzdGhhdmUtc3RyaW5nczogSGlnaGVyIGZucyIsIGRmYWMsIDM5ODQpClNlZ3M6 VGFnKCJtdXN0IHR5cGVkZWYiLCAgICAgICAgICAgICAgICAgICAwLCAgMTEpClNlZ3M6VGFn KCJhbGxvY211c3QiLCAgICAgICAgICAgICAgICAgICAgIDEzLCAgMjUpClNlZ3M6VGFnKCJy ZXNldG11c3QiLCAgICAgICAgICAgICAgICAgICAgIDI3LCAgMzUpClNlZ3M6VGFnKCJmcmVl bXVzdCIsICAgICAgICAgICAgICAgICAgICAgIDM3LCAgNDYpClNlZ3M6VGFnKCJkZmFtdXN0 IGRlY2xhcmF0aW9uIiwgICAgICAgICAgIDQ4LCAgNDkpClNlZ3M6VGFnKCJkZmFtdXN0IGRl ZmluaXRpb24iLCAgICAgICAgICAgIDUwLCAyNTApCi0tIGRmYWFsbG9jIHNob3VsZCBiZSBu ZWFyIGRmYWZyZWUgKGFwcHJveC4gbGluZSAzNTUwKSwgYXMgdGhleSBhcmUgYSBwYWlyClNl Z3M6VGFnKCJkZmFhbGxvYyIsICAgICAgICAgICAgICAgICAgICAgMjUyLCAyNTYpClNlZ3M6 VGFnKCJkZmFtdXN0cyIsICAgICAgICAgICAgICAgICAgICAgMjU4LCAyNjIpCgpTZWN0aW9u KCJlbmQtY29uZmlndXJlLXZpbS1hdHRyaWJ1dGVzIiwgZGZhYywgNDI0OCkKClNlZ3M6VGFn KCJ2aW06IHNldCBzaGlmdHdpZHRoPTIiLCAgICAgICAgICAwKQoKLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCi0tIFByb2Nlc3MgTWFrZWZpbGUuYW0KU2VjdGlvbigiQXV0b21ha2UgZmlsZSBo ZWFkZXIiLCBtYWtlZmlsZWFtLCAwKQpTZWdzOlRhZygiYXV0b21ha2UtcHJvY2Vzcy1oaW50 IiwgICAgICAgICAgMSkKU2VnczpUYWcoIkNvcHlyaWdodC5tYWtlZmlsZWFtIiwgICAgICAg ICAgIDIpClNlZ3M6VGFnKCJDb21tZW50LWJsb2NrLXNwYWNlci0xIiwgICAgICAgICAzKQpT ZWdzOlRhZygiTGljZW5zZVdhcnJhbnR5Lm1ha2VmaWxlYW0iLCAgICAgNCwgIDE1KQoKLS0g RGVmaW5lICJhdXRvbWFrZS1wZXJzaXN0ZW50IiBzaGFkb3cgdmVyc2lvbnMgb2YgYnVpbGQt dGltZSBtYWNyb3MKU2VjdGlvbigiYW0tcGVyc2lzdGVudC1tYWNyb3MiLCBtYWtlZmlsZWFt LCAxNykKU2VnczpUYWcoImFtOkxOIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDApClNl Z3M6VGFnKCJhbTpBTV9DRkxBR1MiLCAgICAgICAgICAgICAgICAgICAyKQpTZWdzOlRhZygi YW06QU1fTERGTEFHUyIsICAgICAgICAgICAgICAgICAgNCwgICA1KQoKU2VjdGlvbigiYW0t cHJvZ3JhbXMtZ2VuZXJhdGVkIiwgbWFrZWZpbGVhbSwgMjQpClNlZ3M6VGFnKCJhbTpiaW5f UFJPR1JBTVMiLCAgICAgICAgICAgICAgICAwKQpTZWdzOlRhZygiYW06YmluX1NDUklQVFMi LCAgICAgICAgICAgICAgICAgMSkKClNlY3Rpb24oInNvdXJjZXMtYW5kLWhlYWRlcnMiLCBt YWtlZmlsZWFtLCAyNikKU2VnczpUYWcoImdyZXBfU09VUkNFUyIsICAgICAgICAgICAgICAg ICAgIDAsICAgMykKU2VnczpUYWcoIm5vaW5zdF9IRUFERVJTIiwgICAgICAgICAgICAgICAg IDQpCgpTZWN0aW9uKCJhZGRpdGlvbmFsIGxpbmsgbGlicyIsIG1ha2VmaWxlYW0sIDMyKQpT ZWdzOlRhZygiTElCSU5UTCBkb2N1bWVudGF0aW9uIiwgICAgICAgICAgIDAsICAgNCkKU2Vn czpUYWcoIkxEQUREIGRlZm4iLCAgICAgICAgICAgICAgICAgICAgICA1LCAgIDcpClNlZ3M6 VGFnKCJncmVwX0xEQUREIiwgICAgICAgICAgICAgICAgICAgICAgOSkKU2VnczpUYWcoImFt OmxvY2FsZWRpciIsICAgICAgICAgICAgICAgICAgIDEwKQpTZWdzOlRhZygiYW06QU1fQ1BQ RkxBR1MiLCAgICAgICAgICAgICAgICAgMTEpCgotLSBQZXJoYXBzIENQUEZMQUdTIHNob3Vs ZCBiZSBncm91cGVkIHdpdGggb3RoZXIgQXV0b21ha2Ugb3ZlcnJpZGVzIChsbiAxNyk/CgpT ZWN0aW9uKCJhbTpFWFRSQV9ESVNUIiwgbWFrZWZpbGVhbSwgNDUpClNlZ3M6VGFnKCJhbTpk b3NidWYuYyIsICAgICAgICAgICAgICAgICAgICAgMCkKClNlY3Rpb24oImFtOmVncmVwIGZn cmVwIiwgbWFrZWZpbGVhbSwgNDcpClNlZ3M6VGFnKCJlZ3JlcC1mZ3JlcCBzY3JpcHRzIiwg ICAgICAgICAgICAgMCwgMTQpCgpTZWN0aW9uKCJhbTogY2xlYW4gZmlsZXMiLCBtYWtlZmls ZWFtLCA2MykKU2VnczpUYWcoImFtOkNMRUFORklMRVMiLCAgICAgICAgICAgICAgICAgICAw KQoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotLVtbCgotLSBERUJVRzogT21pdHRlZCBmb3Ig bm93CgotLSBQcmludCBvdXQgYWxsIHRoZSBzZWdtZW50cyB3ZSd2ZSBleHRyYWN0ZWQgKG9y IG1hbnVmYWN0dXJlZCkgc28gZmFyCmZvciBfLCBTZWcgaW4gaXBhaXJzKFNlZ3MuU2VnU2Vx KSBkbwogICAgICAgIHByaW50ZigiJXM6XG4lc1xuIiwgU2VnLk5hbWUsIEluZGVudChTZWcu UmF3VGV4dCwgOCkpCmVuZAoKLS1dXQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tIENoZWNr IHRoYXQgbm8gaW1wb3J0YW50IHRleHQgKGFueXRoaW5nIG90aGVyIHRoYW4gbmV3bGluZXMp IGhhcyBiZWVuCi0tIGxlZnQgdW50YWdnZWQgKGl0IGlzIGNhcHR1cmVkIGJ5IFRhZydzIFBy ZXZUZXh0IGZhY2lsaXR5KS4KZm9yIF8sIFNlZyBpbiBpcGFpcnMoU2Vncy5TZWdTZXEpIGRv CiAgICAgICAgbG9jYWwgUHJldlRleHQgPSBTZWcuUHJldlRleHQKICAgICAgICBpZiBQcmV2 VGV4dCBhbmQgbm90IFByZXZUZXh0Om1hdGNoKCJeXG4qJCIpIHRoZW4KICAgICAgICAgICAg ICAgIC0tIFdlJ3ZlIGZvdW5kIHNvbWUgdW50YWdnZWQgdGV4dAogICAgICAgICAgICAgICAg cHJpbnRmKCJFUlJPUjogJXM6JWQ6JXEgaGFzIHByZWNlZGluZyBvbWl0dGVkIHRleHQ6IFxu JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgU2VnLlNvdXJjZS5GaWxlbmFtZSwgU2Vn LlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFNlZy5OYW1lLCBJbmRlbnQoUHJldlRl eHQsIDgpKQogICAgICAgIGVuZAplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotLSBDaGVj ayBpbnRlZ2l0eSBvZiBvZiBvdXIgZGVjb25zdHJ1Y3Rpb24gb2YgZWFjaCBmaWxlIGJ5IHJl Y29uc3RpdHV0aW5nCi0tIGl0IGZyb20gdGhlIGluZGl2aWR1YWwgcGllY2VzLgpSZWNvbnN0 cnVjdEZpbGUoZGZhYykKUmVjb25zdHJ1Y3RGaWxlKGRmYWgpClJlY29uc3RydWN0RmlsZSht YWtlZmlsZWFtKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tIFRpbWUgZm9yIHRoZSBydWJi ZXIgdG8gaGl0IHRoZSByb2FkOiBDcmVhdGUgbmV3IGZpbGVzIHdpdGgKLS0gZXhpc3Rpbmcg Y29udGVudCByZS1vcmRlcmVkIGludG8gKGhvcGVmdWxseSkgbW9yZSBjb2hlcmVudAotLSBn cm91cHMvbW9kdWxlcywgYW5kIGFsc28gbW9kaWZ5IE1ha2VmaWxlLmFtIHRvIGtub3cgYWJv dXQgdGhlCi0tIG5ldyBzb3VyY2VzLiAgQXQgcHJlc2VudCwgdGhpcyBzY3JpcHQgZG9lc24n dCByZS1ydW4gYXV0b21ha2UKLS0gYWZ0ZXIgZWRpdGluZyBNYWtlZmlsZS5hbTsgbWF5YmUg bGF0ZXI/CgoKLS0gRWRpdCBmdW5jdGlvbiBoZWFkZXJzL2RlY2xhcmF0aW9ucyBiZWZvcmUg d29ya2luZyBvbiBpbmRpdmlkdWFsIGZpbGVzLAotLSBhcyB3ZSB1c2UgdGhlc2UgcHVibGlj IHZlcnNpb24gYm90aCBpbiB0aGUgaGVhZGVycyBhbmQgaW4gdGhlCi0tIGltcGxlbWVudGF0 aW9ucy4KCmxvY2FsIERlY2xzID0ge30KLS0gRnVuY3Rpb25zIGZyb20gY2hhcmNsYXNzLltj aF0KCkRlY2xzWyJjaGFyY2xhc3MtaW5pdGlhbGlzZSJdID0gW1sKdm9pZApjaGFyY2xhc3Nf aW5pdGlhbGlzZSAoc2l6ZV90IGluaXRpYWxfcG9vbF9zaXplKQpdXQoKRGVjbHNbImNoYXJj bGFzcy1kZXN0cm95LW1vZHVsZSJdID0gW1sKdm9pZApjaGFyY2xhc3NfZGVzdHJveV9tb2R1 bGUgKHZvaWQpCl1dCgpEZWNsc1sidHN0Yml0Il0gID0gW1sKYm9vbCBfR0xfQVRUUklCVVRF X1BVUkUKY2hhcmNsYXNzX3RzdGJpdCAoaW50IGIsIGNoYXJjbGFzc190IGNvbnN0ICpjY2wp Cl1dCkRlY2xzWyJzZXRiaXQiXSAgPSBbWwp2b2lkCmNoYXJjbGFzc19zZXRiaXQgKGludCBi LCBjaGFyY2xhc3NfdCAqY2NsKQpdXQpEZWNsc1siY2xyYml0Il0gID0gW1sKdm9pZApjaGFy Y2xhc3NfY2xyYml0IChpbnQgYiwgY2hhcmNsYXNzX3QgKmNjbCkKXV0KRGVjbHNbInNldGJp dF9yYW5nZSJdICA9IFtbCnZvaWQKY2hhcmNsYXNzX3NldGJpdF9yYW5nZSAoaW50IHN0YXJ0 LCBpbnQgZW5kLCBjaGFyY2xhc3NfdCAqY2NsKQpdXQpEZWNsc1siY2xyYml0X3JhbmdlIl0g ID0gW1sKdm9pZApjaGFyY2xhc3NfY2xyYml0X3JhbmdlIChpbnQgc3RhcnQsIGludCBlbmQs IGNoYXJjbGFzc190ICpjY2wpCl1dCkRlY2xzWyJjb3B5c2V0Il0gPSBbWwp2b2lkCmNoYXJj bGFzc19jb3B5c2V0IChjaGFyY2xhc3NfdCBjb25zdCAqc3JjLCBjaGFyY2xhc3NfdCAqZHN0 KQpdXQpEZWNsc1siemVyb3NldCJdID0gW1sKdm9pZApjaGFyY2xhc3NfemVyb3NldCAoY2hh cmNsYXNzX3QgKmNjbCkKXV0KRGVjbHNbIm5vdHNldCJdID0gW1sKdm9pZApjaGFyY2xhc3Nf bm90c2V0IChjaGFyY2xhc3NfdCAqY2NsKQpdXQpEZWNsc1siZXF1YWwiXSA9IFtbCmludCBf R0xfQVRUUklCVVRFX1BVUkUKY2hhcmNsYXNzX2VxdWFsIChjaGFyY2xhc3NfdCBjb25zdCAq Y2NsMSwgY2hhcmNsYXNzX3QgY29uc3QgKmNjbDIpCl1dCkRlY2xzWyJ1bmlvbnNldCJdID0g W1sKdm9pZApjaGFyY2xhc3NfdW5pb25zZXQgKGNoYXJjbGFzc190IGNvbnN0ICpzcmMsIGNo YXJjbGFzc190ICpkc3QpCl1dCkRlY2xzWyJpbnRlcnNlY3RzZXQiXSA9IFtbCnZvaWQKY2hh cmNsYXNzX2ludGVyc2VjdHNldCAoY2hhcmNsYXNzX3QgY29uc3QgKnNyYywgY2hhcmNsYXNz X3QgKmRzdCkKXV0KRGVjbHNbImNoYXJjbGFzcy1iaXRjb3VudCJdID0gW1sKLyogUmVwb3J0 IGhvdyBtYW55IG1lbWJlcnMgYXJlIGluIHRoZSBzZXQuICAqLwppbnQgX0dMX0FUVFJJQlVU RV9QVVJFCmNoYXJjbGFzc19iaXRjb3VudCAoY2hhcmNsYXNzX3QgKmNjbCkKXV0KRGVjbHNb Im5leHQtbWVtYmVyIl0gPSBbWwovKiBBbGxvdyBlbnVtZXJhdGlvbiBvZiBhbGwgbWVtYmVy cyBvZiBhIHNldCwgc3RhcnRpbmcgZnJvbSB0aGUKICAgZ2l2ZW4gb3JkaW5hbCB2YWx1ZSwg YW5kIHdvcmtpbmcgdXAgaW4gc2VxdWVuY2UuICBJZiBhIG1lbWJlciBpcwogICBmb3VuZCwg aXRzIHZhbHVlIGlzIHdyaXR0ZW4gdG8gKmZvdW5kX21lbWJlciwgYW5kIHRoZSBmdW5jdGlv bgogICByZXR1cm5zIHRydWUuCgogICBJZiBubyBtb3JlIG1lbWJlcnMgYXJlIGZvdW5kLCB0 aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgYW5kCiAgICpmb3VuZF9tZW1iZXIgcmVtYWlu cyB1bmNoYW5nZWQuICAqLwpib29sCmNoYXJjbGFzc19uZXh0X21lbWJlciAoY2hhcmNsYXNz X3QgKmNjbCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VhcmNoX3N0YXJ0X21lbWJl ciwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZvdW5kX21lbWJlcikKXV0KCi0tIEZ1 bmN0aW9ucyBmcm9tIGZzYXRva2VuLltjaF0KCkRlY2xzWyJwcnRvayJdICAgPSBFZGl0ZWRU ZXh0KCJwcnRvay1mbi1kZWNsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl5z dGF0aWMlcysiLCAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBydG9rICUo dG9rZW4gdCUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmc2F0 b2tlbl9wcnRvayAoZnNhdG9rZW5fdG9rZW5fdCB0KSIpCgotLSBGdW5jdGlvbnMgZnJvbSBt YmNzZXRzLltjaF0KCkRlY2xzWyJtYmNzZXRzLWluaXRpYWxpc2UiXSA9IFtbCi8qIFByZXBh cmUgbW9kdWxlIGZvciBvcGVyYXRpb24uICAqLwp2b2lkCm1iY3NldHNfaW5pdGlhbGlzZSAo dm9pZCkKXV0KCkRlY2xzWyJtYmNzZXRzLWRlc3Ryb3ktbW9kdWxlIl0gPSBbWwovKiBEZXN0 cm95IGFsbCBjbGFzc2VzLCBwbHVzIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcyBvd25lZCBi eSB0aGUKICAgbW9kdWxlLiAgKi8Kdm9pZAptYmNzZXRzX2Rlc3Ryb3lfbW9kdWxlICh2b2lk KQpdXQoKRGVjbHNbIm1iY3NldHMtbmV3Il0gPSBbWwovKiBHZW5lcmF0ZSBhIG5ldyBpbnN0 YW5jZSBvZiBhIG11bHRpYnl0ZS1jaGFyYWN0ZXIgc2V0IGRlc2NyaXB0b3IuICAqLwptYmNz ZXRzX3NldF90ICoKbWJjc2V0c19uZXcgKHZvaWQpCl1dCgpEZWNsc1sibWJjc2V0cy1hZGQt d2NoYXIiXSA9IFtbCi8qIEluZGl2aWR1YWwgd2lkZSBjaGFyYWN0ZXJzLiAgKi8Kdm9pZApt YmNzZXRzX2FkZF93Y2hhciAobWJjc2V0c19zZXRfdCAqbWJjLCB3aW50X3Qgd2MpCl1dCgpE ZWNsc1sibWJjc2V0cy1hZGQtd2NoYXItbGlzdCJdID0gW1sKLyogQWRkIGEgbGlzdCBvZiB3 aWRlIGNoYXJhY3RlcnMgKG5vdGU6IG5vdCB3aWRlIGludGVnZXJzKS4gICovCnZvaWQKbWJj c2V0c19hZGRfd2NoYXJfbGlzdCAobWJjc2V0c19zZXRfdCAqbWJjLAogICAgICAgICAgICAg ICAgICAgICAgICBzaXplX3QgbGVuLCB3Y2hhcl90ICp3Y19saXN0KQpdXQoKRGVjbHNbIm1i Y3NldHMtYWRkLWNsYXNzIl0gPSBbWwovKiBDb21tb24gY2hhcmFjdGVyIGNsYXNzZXMsIGUu Zy4gYWxwaGEsIGRpZ2l0LCBwdW5jdCBldGMuICAqLwp2b2lkCm1iY3NldHNfYWRkX2NsYXNz IChtYmNzZXRzX3NldF90ICptYmMsIHdjdHlwZV90IHdjaGFyX2NsYXNzKQpdXQoKRGVjbHNb Im1iY3NldHMtc2V0LW1hdGNoLXNlbnNlIl0gPSBbWwovKiBCeSBkZWZhdWx0LCBjbGFzc2Vz IG1hdGNoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycy4gIFJlZ3VsYXIKICAgZXhwcmVzc2lv bnMgYWxsb3cgdGhpcyBzZW5zZSB0byBiZSBpbnZlcnRlZCwgdXN1YWxseSBieSB0aGUKICAg Y29udmVudGlvbiBvZiAiXiIgYmVpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGJyYWNr ZXRlZCBjbGFzcy4KICAgQnkgZGVmYXVsdCwgcG9zaXRpdmUgc2Vuc2UgaXMgc2VsZWN0ZWQ7 IHRoaXMgZnVuY3Rpb24gbGV0cyB0aGUKICAgdXNlciBzcGVjaWZ5IHRoZSBzZW5zZSwgcHJv YmFibHkgdG8gc3BlY2lmeSBpbnZlcnRlZCBtYXRjaGluZy4gICAqLwp2b2lkCm1iY3NldHNf c2V0X21hdGNoX3NlbnNlIChtYmNzZXRzX3NldF90ICptYmMsIGJvb2wgaW52ZXJ0KQpdXQoK RGVjbHNbIm1iY3NldHMtYWRkLXJhbmdlIl0gPSBbWwovKiBFeHBsaWNpdCBjaGFyYWN0ZXIg cmFuZ2VzLiAgKi8Kdm9pZAptYmNzZXRzX2FkZF9yYW5nZSAobWJjc2V0c19zZXRfdCAqbWJj LCB3aW50X3QgYmVnLCB3aW50X3QgZW5kKQpdXQoKRGVjbHNbIm1iY3NldHMtYWRkLWVxdWl2 cyJdID0gW1sKdm9pZAptYmNzZXRzX2FkZF9lcXVpdnMgKG1iY3NldHNfc2V0X3QgKm1iYywg d2ludF90IHdjKQpdXQoKRGVjbHNbIm1iY3NldHMtYWRkLWNvbGxhdGlvbiJdID0gW1sKdm9p ZAptYmNzZXRzX2FkZF9jb2xsYXRpb24gKG1iY3NldHNfc2V0X3QgKm1iYywgd2ludF90IHdj KQpdXQoKRGVjbHNbIm1iY3NldHMtcmVjZWl2ZS1pbmNvbXBsZXRlLWNoYXJjbGFzcyJdID0g W1sKLyogUmVjZWl2ZSBhbiAiaW4td29yayIgY2hhcmFjdGVyIGNsYXNzLCB3aGljaCBtYXkg b3IgbWF5IG5vdCBoYXZlCiAgIG1lbWJlcnMuICBNYmNzZXQgdGFrZXMgb3duZXJzaGlwIG9m IHRoaXMgc2V0LCBhbmQsIGRlcGVuZGluZyBvbgogICB0aGUgY2lyY3Vtc3RhbmNlcywgZWl0 aGVyIG1haW50YWlucyBpdCBpbnRlcm5hbGx5LCBvciBlbHNlIGNvcGllcwogICBpdHMgY29u dGVudHMgKGlmIGFueSkgdG8gaXRzIGludGVybmFscywgYW5kIHJlbGVhc2VzIChhYmFuZG9u cykKICAgdGhlIHN1cHBsaWVkIHNldC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYXBwbGll ZCB0byBhIHNldCB0aGF0CiAgIGhhcyBiZWVuIGNvbXBsZXRlZC4gICovCnZvaWQKbWJjc2V0 c19yZWNlaXZlX2luY29tcGxldGVfY2hhcmNsYXNzIChtYmNzZXRzX3NldF90ICptYmMsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmNsYXNzX3QgKmNjbCkK XV0KCkRlY2xzWyJtYmNzZXRzLWdldC1jaGFycyJdID0gW1sKLyogQ29weSB3aWRlIGNoYXIg bGlzdCB0byBjYWxsZXIncyB3b3JrIGFyZWEuICAqLwp2b2lkCm1iY3NldHNfZ2V0X2NoYXJz IChtYmNzZXRzX3NldF90ICptYmMsIHdjaGFyX3QgKmNoYXJfbGlzdCkKXV0KCkRlY2xzWyJt YmNzZXRzLWNvbXBsZXRlZCJdID0gW1sKLyogTWFyayBhIHNldCBhcyBjb21wbGV0ZWQ7IHRo ZSBpbXBsZW1lbnRhdGlvbiBtYXkgYWxzbyBhbmFseXNlIGFuZAogICBvcHRpbWlzZSB0aGUg c2V0IGF0IHRoaXMgcG9pbnQgKGUuZy4gdXNlIGNoYXJjbGFzc2VzIHRvIHJlcHJlc2VudAog ICB1bmlieXRlIGNoYXJhY3RlcnM7IG1lcmdlIG92ZXJsYXBwaW5nIHJhbmdlczsgcmVtb3Zl IHRoZQogICBpbmRpdmlkdWFsIGxpc3Rpbmcgb2YgYSBjaGFyYWN0ZXIgaWYgaXQgaXMgY292 ZXJlZCBieSBhIHJhbmdlLAogICBldGMuKQoKICAgSW4gYWRkaXRpb24sIG5vdGUgdGhhdCBu byBmdXJ0aGVyIGNoYW5nZXMgKGUuZy4gcmVjZWl2ZSBhbm90aGVyCiAgIGluY29tcGxldGUg Y2hhcmNsYXNzKSBhcmUgYWxsb3dlZCBmb3IgdGhpcyBzZXQsIG9uY2UgImNvbXBsZXRlZCIK ICAgaXMgY2FsbGVkLiAgKi8Kdm9pZAptYmNzZXRzX2NvbXBsZXRlZCAobWJjc2V0c19zZXRf dCAqbWJjKQpdXQoKRGVjbHNbIm1iY3NldHMtZ2V0LWNoYXJhY3RlcmlzdGljcyJdID0gW1sK LyogUmV0cmlldmUgaGlnaC1sZXZlbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3MsIHdo aWNoIGlzIHVzZWZ1bAogICAoaW4gZnNhcGFyc2UpIGZvciBkZWNpZGluZyBvbiBob3cgdG8g ZGVhbCB3aXRoIGl0LiAgV2UgYXJlIGZvcmNlZAogICB0byBwcm92aWRlIHNpZ25pZmljYW50 IHF1ZXJ5IHJlc291cmNlcyBzaW5jZSB3ZSBkZW1hbmQgdGhhdCB0aGUKICAgdHlwZSBpbnRl cm5hbCByZW1haW4gb3BhcXVlIChldmVuIHRob3VnaCB0aGUgaW5pdGlhbAogICBpbXBsZW1l bnRhdGlvbiBtYXkgZG8gYSBwb29yIGpvYiBvZiB0aGlzIGVmZm9ydCkuICAqLwp2b2lkCm1i Y3NldHNfZ2V0X2NoYXJhY3RlcmlzdGljcyAobWJjc2V0c19zZXRfdCAqbWJjLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnBfaW52ZXJ0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNoYXJjbGFzc190ICoqcHBfY2hhcmNsYXNzLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNpemVfdCAqcF9uY2hhcnMsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZV90ICpwX25jaF9jbGFzc2VzLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNpemVfdCAqcF9ucmFuZ2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNpemVfdCAqcF9uZXF1aXZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVf dCAqcF9uY29sbF9lbGVtcykKXV0KCi0tIEZ1bmN0aW9ucyBmcm9tIGZzYWxleC5bY2hdCgpE ZWNsc1sibGV4LWluaXRpYWxpc2UiXSA9IFtbCi8qIFByZXBhcmUgbW9kdWxlIGZvciBvcGVy YXRpb24uICAqLwp2b2lkCmZzYWxleF9pbml0aWFsaXNlICh2b2lkKQpdXQoKRGVjbHNbImxl eC1kZXN0cm95LW1vZHVsZSJdID0gW1sKLyogRGVzdHJveSBhbGwgbGV4ZXIgaW5zdGFuY2Vz LCBwbHVzIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcyBvd25lZCBieSB0aGUKICAgbW9kdWxl LiAgKi8Kdm9pZApmc2FsZXhfZGVzdHJveV9tb2R1bGUgKHZvaWQpCl1dCgpEZWNsc1sibGV4 LW5ldyJdID0gW1sKLyogR2VuZXJhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gRlNBIGxleGVy LiAgKi8KZnNhbGV4X2N0eHRfdCAqCmZzYWxleF9uZXcgKHZvaWQpCl1dCgotLSBSZWRlZmlu ZSAibGV4IiBhcyAiZnNhbGV4X2xleCIsIHNvIHdlIGNhbiBydW4gaXQgaW4gcGFyYWxsZWwg d2l0aCB0aGUKLS0gb3JpZ2luYWwgY29kZSBpbiBkZmEuYy4gIEFsc28gYWRkIGEgKGN1cnJl bnRseS11bnVzZWQpIGNvbnRleHQgcG9pbnRlciwKLS0gKHZvaWQqLCBzaWdoKSwgc28gdGhh dCB3ZSBjYW4gaGF2ZSBhIGZ1bGx5LXJlZW50cmFudCBsZXhlciBzb21ldGltZS4KRGVjbHNb ImxleCJdID0gRWRpdGVkVGV4dCgibGV4LWRlY2wiLAogICAgICAgICAgICAgICAgICAibGV4 ICUodm9pZCUpIiwgImZzYWxleF9sZXggKGZzYWxleF9jdHh0X3QgKmxleGVyKSIsCiAgICAg ICAgICAgICAgICAgICJec3RhdGljJXMrdG9rZW4iLCAiZnNhdG9rZW5fdG9rZW5fdCIpCgot LSBBcyBwZXIgZGZhX3N5bnRheCBpbiBkZmEuYywgY3JlYXRlIGEgZnVuY3Rpb24gdG8gcmVj ZWl2ZSBkaXJlY3RpdmVzIG9uCi0tIGhvdyB0byBpbnRlcnByZXQgUkVzLgpEZWNsc1sibGV4 LXN5bnRheCJdID0gW1sKLyogUmVjZWl2ZSBzeW50YXggZGlyZWN0aXZlcywgYW5kIG90aGVy IHBhdHRlcm4gaW50ZXJwcmV0YXRpb24KICAgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgY2FzZSBm b2xkaW5nIGFuZCBlbmQtb2YtbGluZSBjaGFyYWN0ZXIuCiAgIEluIGFkZGl0aW9uLCB0aGlz IGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdmFyaW91cyBpbnRlcm5hbCBzdHJ1Y3R1cmVzCiAgIGJh c2VkIG9uIHRoZSBsb2NhbGUgaW4gZm9yY2UuICAqLwp2b2lkCmZzYWxleF9zeW50YXggKGZz YWxleF9jdHh0X3QgKmxleGVyLAogICAgICAgICAgICAgICByZWdfc3ludGF4X3QgYml0cywg aW50IGZvbGQsIHVuc2lnbmVkIGNoYXIgZW9sKQpdXQoKRGVjbHNbImxleC1wYXR0ZXJuIl0g PSBbWwovKiBSZWNlaXZlIHRoZSBwYXR0ZXJuLCBhbmQgcmVzZXQgdGhlIGxleGljYWwgYW5h bHlzZXIgc3RhdGUuICBUaGUKICAgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNoYXJzIChvY3Rl dHM/KSBpbiB0aGUgcGF0dGVybiAoQVNDSUkgY2hhcnM/CiAgIHZhcmlhYmxlLWxlbmd0aCBV VEYtOCBzZXF1ZW5jZXM/ICBTaW1wbGlmaWVkIENoaW5lc2U/ICBldGMuKSBkZXBlbmRzIG9u CiAgIHRoZSBsb2NhbGUgdGhhdCB3YXMgaW4gZm9yY2Ugd2hlbiBmc2FsZXhfc3ludGF4ICgp IHdhcyBjYWxsZWQuICBOVUxzIG1heQogICBiZSBwcmVzZW50IGFtb25nc3QgdGhlIGNvZGVz LCB3aGljaCBpcyB3aHkgdGhlIGxlbmd0aCBpcyBnaXZlbgogICBleHBsaWNpdGx5LCByYXRo ZXIgdGhhbiByZWx5aW5nIG9uIHN0cmxlbigzKS4gICovCnZvaWQKZnNhbGV4X3BhdHRlcm4g KGZzYWxleF9jdHh0X3QgKmxleGVyLAogICAgICAgICAgICAgICAgY2hhciBjb25zdCAqcGF0 dGVybiwgc2l6ZV90IGNvbnN0IHBhdHRlcm5fbGVuKQoKXV0KCkRlY2xzWyJsZXgtZXhjaGFu Z2UiXSA9IFtbCi8qIERlZmluZSBleHRlcm5hbCBmdW5jdGlvbiB0byBkbyBub24tY29yZSBk YXRhIGV4Y2hhbmdlcyBiZXR3ZWVuIHRoZSBsZXhlcgogICBhbmQgdGhlIHBhcnNlci4gIFRo aXMgZnVuY3Rpb24gbXVzdCBjb25mb3JtIHRvCiAgIHByb3RvX2xleHBhcnNlX2V4Y2hhbmdl X2ZuX3QuICBUaGlzIGludGVyZmFjZSBsZXRzIHR3byBpbnN0YW5jZXMKICAgY29tbXVuaWNh dGUgd2l0aG91dCByZXF1aXJpbmcgaGVscCBmcm9tIGFuIG91dHNpZGUgcGFydHkuICAqLwpp bnQKZnNhbGV4X2V4Y2hhbmdlIChmc2FsZXhfY3R4dF90ICpsZXhlciwKICAgICAgICAgICAg ICAgICBwcm90b19sZXhwYXJzZV9vcGNvZGVfdCBvcGNvZGUsCiAgICAgICAgICAgICAgICAg dm9pZCAqcGFyYW0pCl1dCgpEZWNsc1sibGV4LWV4Y2VwdGlvbi1mbnMiXSA9IFtbCi8qIFJl Y2VpdmUgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBleGNlcHRpb25zIGRldGVjdGVkIGJ5IHRo ZSBsZXhlcjoKICAgV2FybmluZ3MgYW5kIGVycm9ycy4gIEludGVybmFsbHksIHdlIGFkZCB0 aGUgX05vcmV0dXJuIGF0dHJpYnV0ZQogICB0byB0aGUgZXJyb3IgY2FsbGJhY2ssIHRvIGhl bHAgdGhlIGNvbXBpbGVyIHdpdGggY29kZSBmbG93CiAgIGFuYWx5c2lzLiAgKi8Kdm9pZApm c2FsZXhfZXhjZXB0aW9uX2ZucyAoZnNhbGV4X2N0eHRfdCAqbGV4ZXIsCiAgICAgICAgICAg ICAgICAgICAgICBmc2FsZXhfd2Fybl9jYWxsYmFja19mbiAqd2FybmluZ2ZuLAogICAgICAg ICAgICAgICAgICAgICAgZnNhbGV4X2Vycm9yX2NhbGxiYWNrX2ZuICplcnJvcmZuKQpdXQoK LS0gRnVuY3Rpb25zIGZyb20gZnNhcGFyc2UuW2NoXQoKRGVjbHNbInBhcnNlLWluaXRpYWxp c2UiXSA9IFtbCi8qIFByZXBhcmUgbW9kdWxlIGZvciBvcGVyYXRpb24uICAqLwp2b2lkCmZz YXBhcnNlX2luaXRpYWxpc2UgKHZvaWQpCl1dCgpEZWNsc1sicGFyc2UtZGVzdHJveS1tb2R1 bGUiXSA9IFtbCi8qIERlc3Ryb3kgYWxsIHBhcnNlciBpbnN0YW5jZXMsIHBsdXMgYW55IGFz c29jaWF0ZWQgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZQogICBtb2R1bGUuICAqLwp2b2lkCmZz YXBhcnNlX2Rlc3Ryb3lfbW9kdWxlICh2b2lkKQpdXQoKRGVjbHNbInBhcnNlLW5ldyJdID0g W1sKLyogR2VuZXJhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gRlNBIHBhcnNlci4gICovCmZz YXBhcnNlX2N0eHRfdCAqCmZzYXBhcnNlX25ldyAodm9pZCkKXV0KCi0tW1sKRklYTUU6IElt cHJvdmUgdGhlIGRvY3VtZW50YXRpb24gaGVyZSB0byBkZXNjcmliZSB0aGUgImV4Y2hhbmdl IiBmdW5jdGlvbi4KLS1dXQoKRGVjbHNbInBhcnNlLWxleGVyIl0gPSBbWwovKiBSZWNlaXZl IGEgbGV4ZXIgZnVuY3Rpb24sIHBsdXMgbGV4ZXIgaW5zdGFuY2UgY29udGV4dCBwb2ludGVy LCBmb3IgdXNlIGJ5CiAgIHRoZSBwYXJzZXIuICBBbHRob3VnaCBub3QgbmVlZGVkIGluaXRp YWxseSwgdGhpcyBwbHVnLWluIGFyY2hpdGVjdHVyZSBtYXkKICAgYmUgdXNlZnVsIGluIHRo ZSBmdXR1cmUsIGFuZCBpdCBicmVha3MgdXAgc29tZSBvZiB0aGUgaW50cmljYXRlCiAgIGNv bm5lY3Rpb25zIHRoYXQgbWFkZSB0aGUgb3JpZ2luYWwgZGZhLmMgY29kZSBzbyBkYXVudGlu Zy4gICovCnZvaWQKZnNhcGFyc2VfbGV4ZXIgKGZzYXBhcnNlX2N0eHRfdCAqcGFyc2VyLAog ICAgICAgICAgICAgICAgdm9pZCAqbGV4ZXJfY29udGV4dCwKICAgICAgICAgICAgICAgIHBy b3RvX2xleHBhcnNlX2xleF9mbl90ICpsZXhfZm4sCiAgICAgICAgICAgICAgICBwcm90b19s ZXhwYXJzZV9leGNoYW5nZV9mbl90ICpsZXhfZXhjaGFuZ2VfZm4pCl1dCgotLSBSZXdyaXRl IGhlYWRlciBvZiBmc2FwYXJzZV9wYXJzZSBjb21wbGV0ZWx5IGhlcmUsIGFzIHNwbGl0dGlu ZyB0aGUgbGV4ZXIKLS0gaW50byBhIHNlcGFyYXRlIGVudGl0eSBtYWtlcyBtdWNoIG9mIHRo ZSBoZWFkZXIgaXJyZWxldmFudC4KRGVjbHNbInBhcnNlIl0gPSBbWwovKiBNYWluIGVudHJ5 IHBvaW50IGZvciB0aGUgcGFyc2VyLiAgUGFyc2VyIGlzIGEgcG9pbnRlciB0byBhIHBhcnNl cgogICBjb250ZXh0IHN0cnVjdCBjcmVhdGVkIGJ5IGZzYXBhcnNlX25ldy4gIEJlZm9yZSBj YWxsaW5nIHRoaXMgZnVuY3Rpb24sCiAgIHRoZSBwYXJzZXIgaW5zdGFuY2UgbXVzdCBiZSBz dXBwbGllZCB3aXRoIGEgbGV4ZXIgKGZzYXBhcnNlX2xleGVyKSwgYW5kCiAgIGFsc28gd2l0 aCBjYWxsYmFjayBmdW5jdGlvbnMgdG8gcmVjZWl2ZSB3YXJuaW5nIGFuZCBlcnJvciByZXBv cnRzCiAgIChmc2FwYXJzZV9lc2NlcHRpb25fZm5zKS4gICovCnZvaWQKZnNhcGFyc2VfcGFy c2UgKGZzYXBhcnNlX2N0eHRfdCAqcGFyc2VyKQpdXQoKRGVjbHNbInBhcnNlLWdldC10b2tl bi1saXN0Il0gPSBbWwovKiBBZnRlciBwYXJzaW5nLCByZXBvcnQgYSBsaXN0IG9mIHRva2Vu cyBkZXNjcmliaW5nIHRoZSBwYXR0ZXJuLiAgQ29tcGxleAogICBzdHJ1Y3R1cmVzIHN1Y2gg YXMgYWx0ZXJuYXRpb24sIGJhY2tyZWZlcmVuY2VzLCBhbmQgbG9jYWxlLWluZHVjZWQKICAg Y29tcGxleGl0eSBzdWNoIGFzIHZhcmlhYmxlLWxlbmd0aCB1dGY4IHNlcXVlbmNlcyBhcmUg ZGVzY3JpYmVkIGhlcmUgYnkKICAgYXBwZW5kaW5nIG9wZXJhdG9ycyB0aGF0IGFwcGx5IHRv IHRoZSBwcmVjZWRpbmcgaXRlbShzKSAocG9zdGZpeAogICBub3RhdGlvbikuICAqLwp2b2lk CmZzYXBhcnNlX2dldF90b2tlbl9saXN0IChmc2FwYXJzZV9jdHh0X3QgKnBhcnNlciwKICAg ICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbnJfdG9rZW5zLAogICAgICAgICAgICAg ICAgICAgICAgICAgZnNhdG9rZW5fdG9rZW5fdCAqKnRva2VuX2xpc3QpCl1dCgotLSBGdW5j dGlvbnMgZnJvbSBmc2FtdXN0cy5bY2hdCgpEZWNsc1sibXVzdCJdID0gW1sKLyogUmVjZWl2 ZSBhbiBleGlzdGluZyBsaXN0IChwb3NzaWJseSBlbXB0eSkgb2YgbXVzdC1oYXZlIHN0cmlu Z3MsIHRvZ2V0aGVyCiAgIHdpdGggYSBsaXN0IG9mIHRoZSB0b2tlbnMgZm9yIHRoZSBjdXJy ZW50IEZTQSAocG9zdGZpeCB0cmVlIG9yZGVyKSwgYW5kCiAgIGlmIHRoZXJlIGFyZSBhbnkg bW9yZSBtdXN0LWhhdmUgc3RyaW5ncyBpbiB0aGUgdG9rZW4gbGlzdCwgYWRkIHRoZW0gdG8K ICAgdGhlIG11c3QtaGF2ZSBsaXN0LiAgUmV0dXJucyB0aGUgcG9zc2libHktbW9kaWZpZWQg bGlzdCB0byB0aGUgY2FsbGVyLgogICBMb2NhbGUgYW5kIHN5bnRheCBpdGVtcyBhcmUgcGFy dGlhbGx5IGNvdmVyZWQgaGVyZSBieSB0aGUgY2FzZV9mb2xkIGFuZAogICB1bmlieXRlX2xv Y2FsZSBmbGFncywgYnV0IHRoaXMgaXMgaW5jb21wbGV0ZSwgYW5kIHNob3VsZCBiZSBhZGRy ZXNzZWQgYnkKICAgU3RhZ2UgMiAoaW1wcm92aW5nIHRoZSBleHByZXNzaXZlbmVzcyBvZiB0 b2tlbnMpLiAgKi8KZnNhbXVzdHNfbGlzdF9lbGVtZW50X3QgKgpmc2FtdXN0c19tdXN0IChm c2FtdXN0c19saXN0X2VsZW1lbnRfdCAqbXVzdF9saXN0LAogICAgICAgICAgICAgIHNpemVf dCBucl90b2tlbnMsIGZzYXRva2VuX3Rva2VuX3QgKnRva2VuX2xpc3QsCiAgICAgICAgICAg ICAgYm9vbCBjYXNlX2ZvbGQsIGJvb2wgdW5pYnl0ZV9sb2NhbGUpCl1dCgotLSBGdW5jdGlv bnMgZnJvbSBoaWdoLWxldmVsLWRmYS5bY2hdCgpEZWNsc1siaGxkZmEtaW5pdGlhbGlzZSJd ID0gW1sKLyogUHJlcGFyZSBtb2R1bGUgZm9yIG9wZXJhdGlvbi4gICovCnZvaWQKaGxkZmFf aW5pdGlhbGlzZSAodm9pZCkKXV0KCkRlY2xzWyJobGRmYS1kZXN0cm95LW1vZHVsZSJdID0g W1sKLyogRGVzdHJveSBhbGwgaGlnaC1sZXZlbCBkZmEgaW5zdGFuY2VzLCBwbHVzIGFueSBh c3NvY2lhdGVkIHJlc291cmNlcyBvd25lZAogICBieSB0aGUgbW9kdWxlLiAgKi8Kdm9pZApo bGRmYV9kZXN0cm95X21vZHVsZSAodm9pZCkKXV0KCi0tLS0tLS0tLS0tLS0tLS0qKioqKioq KiBjaGFyY2xhc3MuaCAqKioqKioqKi0tLS0tLS0tLS0tLS0tLS0KCnByaW50KCJDcmVhdGlu ZyBjaGFyY2xhc3MuaC4uLiIpCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbigiY2hhcmNsYXNz LmgiLCAidyIpKQphc3NlcnQoZjp3cml0ZShbWwovKiBjaGFyY2xhc3MgLS0gVG9vbHMgdG8g Y3JlYXRlIGFuZCBtYW5pcHVsYXRlIHNldHMgb2YgY2hhcmFjdGVycyAob2N0ZXRzKQoKXV0p KQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJDb3B5cmlnaHQuZGZhYyIpLCAiXG4iKSkKYXNz ZXJ0KGY6d3JpdGUoUmF3VGV4dCgiTGljZW5zZVdhcnJhbnR5LmRmYWMiKSwgIlxuIikpCmFz c2VydChmOndyaXRlKFJhd1RleHQoIkF1dGhvcnMuZGZhYyIpKSkKYXNzZXJ0KGY6d3JpdGUo W1sKCi8qIDIwMTQ6IFJlcGFja2FnZWQgYnkgInVudGFuZ2xlIiBzY3JpcHQsIHdyaXR0ZW4g YnkgYmVob2Zmc2tpLiAgKi8KCi8qIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHNlcnZpY2VzIHRv IGFsbG9jYXRlLCBtYW5pcHVsYXRlLCBjb25zb2xpZGF0ZQogICBhbmQgZGlzY2FyZCAyNTYt Yml0IHZlY3RvcnMsIHVzZWQgdG8gZGVzY3JpYmUgOC1iaXQgKG9jdGV0KSBzZXRzLgogICBP Y3RldCBpcyB1c2VkIGFzIHRoZSBtZW1iZXIgbmFtZSBoZXJlLCBhcyAiYnl0ZSIgb3IgImNo YXIiIGNhbgogICBzb21ldGltZXMgcmVmZXIgdG8gZGlmZmVyZW50IGJpdCBzaXplcyAoZS5n LiBjaGFyIC0+IDYgYml0cyBvbiBzb21lCiAgIElCTS9DeWJlciBhcmNoaXRlY3R1cmVzOyBj aGFyIC0+IDMyIGJpdHMgb24gc29tZSBEU1AgYXJjaGl0ZWN0dXJlczsKICAgaW4gQywgc2l6 ZW9mIChjaGFyKSA9PSAxIGJ5IGRlZmluaXRpb24gb24gYWxsIGFyY2hpdGVjdHVyZXMpLgoK ICAgVGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGVzZSAiY2hhcmNsYXNzIiBzZXRzIGFuZCBz ZXQgZXhwcmVzc2lvbiBieQogICBSRSB0b29scyBjYW4gYmUgbm9uLXRyaXZpYWw6ICBNYW55 IFVuaWNvZGUgY2hhcmFjdGVycyBjYW5ub3QgZml0CiAgIGludG8gOCBiaXRzLCBhbmQgZXZl biB3aGVyZSBvY3RldC1iYXNlZCBjb2RlIHBhZ2VzIGFyZSB1c2VkLAogICBub250cml2aWFs IGNhc2VzIGNhbiBhcHBlYXIgKGUuZy4gQ29kZSBwYWdlIDg1NywgTVMtRE9TIFR1cmtpc2gs CiAgIHdoaWNoIGhhcyBib3RoIGEgZG90dGVkIGFuZCBhIGRvdGxlc3MgbG93ZXJjYXNlIGFu ZCB1cHBlcmNhc2UgIkkiKS4KCiAgIE9uIHRoZSBzdG9yYWdlIHNpZGUsIHRoaW5ncyBhcmUg c2xpZ2h0bHkgdHJpY2t5IGFuZCBwZXJoYXBzIGV2ZW4KICAgbXVya3kgYXQgdGltZXMuICBU aGUgY2xpZW50IHN0YXJ0cyBieSBhbGxvY2F0aW5nIGEgY2hhcmNsYXNzLAogICB3b3JraW5n IG9uIGl0LCBhbmQgdGhlbiBlaXRoZXIgY29tcGxldGluZyBpdCAodXN1YWxseSkgb3IgYWJh bmRvbmluZwogICBpdC4gIFRoZSB3b3JraW5nIGNsYXNzIChwdW4gaW50ZW5kZWQpIGlzIHJl cHJlc2VudGVkIGJ5IGEgcG9pbnRlci4KICAgSWYgbm90IGFiYW5kb25lZCwgdGhpcyBwb2lu dGVyIGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluIHZhbGlkIGZvciB0aGUKICAgbGlmZXRpbWUg b2YgdGhlIG1vZHVsZS4KCiAgIFRoZSBtb2R1bGUgdHJpZXMgYWdncmVzc2l2ZWx5IHRvIGVs aW1pbmF0ZSBkdXBsaWNhdGVzOyB0aGlzIGlzCiAgIHBlcmhhcHMgdGhlIG1haW4gZnVuY3Rp b24gb2YgdGhlIGNvbXBsZXRpb24gc3RlcC4gIFNvLCB0aGUgcG9pbnRlcgogICB0aGF0IHJl cHJlc2VudHMgdGhlIGNsYXNzIGFmdGVyIGNvbXBsZXRpb24gbWF5IG5vdCBiZSB0aGUgd29y a2luZwogICBwb2ludGVyLgoKICAgSW4gYWRkaXRpb24gdG8gdGhlIHBvaW50ZXIgbWV0aG9k IG9mIHJlZmVycmluZyB0byBhIGNsYXNzLCB0aGUKICAgY2xhc3NlcyBjYW4gYmUgdmlld2Vk IGFzIGFuIGFycmF5LCB3aXRoIHRoZSBmaXJzdCBjbGFzcyByZWNlaXZpbmcKICAgaW5kZXgg MCwgdGhlIHNlY29uZCByZWNlaXZpbmcgaW5kZXggMSwgYW5kIHNvIG9uLiAgRnVuY3Rpb25z IGFyZQogICBwcm92aWRlZCB0byBtYXAgcG9pbnRlcnMgdG8gaW5kZXhlcywgYW5kIHZpY2Ug dmVyc2EuICBUaGUgaW5kZXgKICAgcmVwcmVzZW50YXRpb24gaXMgaGFuZHkgYXMgaXQgaXMg dmVyeSBjb21wYWN0ICh0eXBpY2FsbHkgbXVjaCBmZXdlcgogICB0aGFuIDI0IGJpdHMpLCB3 aGVyZWFzIHBvaW50ZXJzIGFyZSBhcmNoaXRlY3R1cmUgYW5kIE9TLXNwZWNpZmljLAogICBh bmQgbWF5IGJlIDY0IGJpdHMgb3IgbW9yZS4KCiAgIEluZGV4IDAgaXMgc3BlY2lhbDsgaXQg d2lsbCBhbHdheXMgcmVwcmVzZW50IHRoZSB6ZXJvLWNsYXNzIChubwogICBtZW1iZXJzIHNl dCkuICBVc2VycyB3YW50aW5nIHRvIHN0b3JlIGEgc2V0IG9mIG5vbi16ZXJvY2xhc3MgY2xh c3NlcwogICAoZS5nLiB1dGY4KSBjYW4gdXNlIHRoaXMgcHJvcGVydHkgYXMgYSBzZW50aW5l bCAoYSB2YWx1ZSBvZiAwIGZvciBhCiAgIHN0YXRpYyB2YXJpYWJsZSBjYW4gbWVhbiAibm90 IGluaXRpYWxpc2VkIikuCgogICBGaW5hbGx5LCB0aGVyZSBhcmUgc29tZSAiZ3V0dGVyIiBi aXRzLCBhdCBsZWFzdCAzIG9uIGVhY2ggZW5kIG9mCiAgIHRoZSBjbGFzcywgc28gdGhhdCwg dG8gYSBsaW1pdGVkIGV4dGVudCAoYW5kIGVzcGVjaWFsbHkgZm9yIHRoZQogICBjb21tb24g Y2FzZSBvZiBFT0YgPT0gLTEpLCBiaXRzIGNhbiBiZSBzZXQgYW5kIGNsZWFyZWQgd2l0aG91 dAogICBjYXVzaW5nIHByb2JsZW1zLCBhbmQgdGhlIGNvZGUgZG9lcyBub3QgbmVlZCB0byBp bmNsdWRlIHRoZSBvdmVyaGVhZAogICBvZiBjaGVja3MgZm9yIG91dC1vZi1ib3VuZCBiaXQg bnVtYmVycy4gIFRoZXNlIGd1dHRlciBiaXRzIGFyZQogICBjbGVhcmVkIHdoZW4gdGhlIGNs YXNzIGlzIGNvbXBsZXRlZCwgc28gRU9GIChmb3IgaW5zdGFuY2UpIHNob3VsZAogICBuZXZl ciBiZSBtZW1iZXIgb2YgYSBjbGFzcy4gICovCgpdXSkpCgotLSBBZGQgcHJlcHJvY2Vzc29y IGxpbmVzIHRvIG1ha2UgdGhpcyBoZWFkZXIgZmlsZSBpZGVtcG90ZW50Lgphc3NlcnQoZjp3 cml0ZShbWwoKI2lmbmRlZiBDSEFSQ0xBU1NfSAojZGVmaW5lIENIQVJDTEFTU19IIDEKCi8q IEFsd2F5cyBpbXBvcnQgZW52aXJvbm1lbnQtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpdGVt cyBmaXJzdC4gKi8KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2luY2x1ZGUgPGxpbWl0cy5oPgoj aW5jbHVkZSA8c3RkYm9vbC5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CgojaWZkZWYgX19jcGx1 c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKLyogRGVmaW5l IGNoYXJjbGFzcyBhcyBhbiBvcGFxdWUgdHlwZS4gICovCnR5cGVkZWYgc3RydWN0IGNoYXJj bGFzc19zdHJ1Y3QgY2hhcmNsYXNzX3Q7CgovKiBGaXJzdCBpbnRlZ2VyIHZhbHVlIHRoYXQg aXMgZ3JlYXRlciB0aGFuIGFueSB1bmlieXRlIGNoYXIuICBFYWNoCiAgIGNsYXNzIGNhbiBt b2RlbCBbMCAuLiBDSEFSQ0xBU1NfTk9UQ0hBUiAtIDFdIG1lbWJlcnMuICBUaGUgdXNlciBt YXkKICAgcmVmZXJlbmNlIGEgZmV3IG1lbWJlcnMgYWJvdmUgb3IgYmVsb3cgdGhpcyByYW5n ZSwgdGhhbmtzIHRvIHRoZQogICBleHBsaWNpdCBndXR0ZXJzLCBidXQgdGhlIG1hcmdpbnMg cHJvdmlkZWQgYnkgdGhpcyBmYWNpbGl0eSBhcmUKICAgc21hbGwuICAqLwplbnVtIHsgQ0hB UkNMQVNTX05PVENIQVIgPSAxIDw8IENIQVJfQklUIH07CgovKiBJbmRpY2VzIHRvIHZhbGlk IGNoYXJjbGFzc2VzIGFyZSBhbHdheXMgbm9uLW5lZ2F0aXZlOyB6ZXJvIGlzCiAgIHJlc2Vy dmVkIGFzIGFuIGluZGV4IHRvIHRoZSB6ZXJvY2FzcywgYW5kIGFsbCBvdGhlciBjbGFzcyBl bnRpdGllcwogICBoYXZlIHBvc2l0aXZlIGluZGljZXMuICBXZSB1c2UgcHRyZGlmZl90IHJh dGhlciB0aGFuIHNpemVfdCBoZXJlCiAgIGFzIC0xIGNhbiBiZSB1c2VkIGFzIGEgc2VudGlu ZWwgaW4gc29tZSBwbGFjZXMuICAqLwp0eXBlZGVmIHB0cmRpZmZfdCBjaGFyY2xhc3NfaW5k ZXhfdDsKCi8qIEluZGV4IHplcm8gaXMgc3BlY2lhbDogIEl0IGlzIHRoZSB6ZXJvLWNsYXNz IChubyBiaXRzIHNldCkgY2xhc3MuICAqLwplbnVtCnsKICBDSEFSQ0xBU1NfWkVST0NMQVNT X0lOREVYID0gMAp9OwoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogRW50aXJlLW1vZHVs ZSBpbml0aWFsaXNhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgVGhlIGNsaWVu dAogICBzcGVjaWZpZXMgc3RhcnRpbmcgc2l6ZSBmb3IgdGhlIGNsYXNzIHBvb2wuICBEZXN0 cm95X21vZHVsZSByZWxlYXNlcwogICBhbGwgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IHRoaXMg bW9kdWxlLiAgKi8KCl1dKSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJjaGFyY2xhc3Mt aW5pdGlhbGlzZSJdKQpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNbImNoYXJjbGFzcy1kZXN0 cm95LW1vZHVsZSJdKQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogU2luZ2xlLWJpdCBvcGVyYXRp b25zICh0ZXN0LCBzZXQsIGNsZWFyKS4gICovCgpdXSkpCgotLSBXcml0ZSBkZWNsYXJhdGlv biB3aXRoICJleHRlcm4iIHByZWNlZGluZyBhbmQgIjsiIGZvbGxvd2luZyB0ZXh0LgpXcml0 ZUV4dGVybkRlY2woZiwgRGVjbHNbInRzdGJpdCJdKQpXcml0ZUV4dGVybkRlY2woZiwgRGVj bHNbInNldGJpdCJdKQpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNbImNscmJpdCJdKQoKYXNz ZXJ0KGY6d3JpdGUoW1sKLyogUmFuZ2Utb2YtYml0cyBzZXQgYW5kIGNsZWFyIG9wZXJhdGlv bnMuICBUaGVzZSBhcmUgZWFzaWVyIHRvIHJlYWQsCiAgIGFuZCBhbHNvIG1vcmUgZWZmaWNp ZW50LCB0aGFuIG11bHRpcGxlIHNpbmdsZS1iaXQgY2FsbHMuICAqLwoKXV0pKQoKV3JpdGVF eHRlcm5EZWNsKGYsIERlY2xzWyJzZXRiaXRfcmFuZ2UiXSkKV3JpdGVFeHRlcm5EZWNsKGYs IERlY2xzWyJjbHJiaXRfcmFuZ2UiXSkKCmFzc2VydChmOndyaXRlKFtbCi8qIFdob2xlLW9m LXNldCBvcGVyYXRpb25zIChjb3B5LCB6ZXJvLCBpbnZlcnQsIGNvbXBhcmUtZXF1YWwpLiAg Ki8KCl1dKSkKCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1siY29weXNldCJdKQpXcml0ZUV4 dGVybkRlY2woZiwgRGVjbHNbInplcm9zZXQiXSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xz WyJub3RzZXQiXSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJlcXVhbCJdKQoKYXNzZXJ0 KGY6d3JpdGUoW1sKLyogQWRkICJ1bmlvbnNldCIgYW5kICJpbnRlcnNlY3RzZXQiIGZ1bmN0 aW9ucyBzaW5jZSB3aG9sZS1vZi1jbGFzcwogICBvcGVyYXRpb25zIHRlbmQgdG8gYmUgcmVh c29uYWJseSBleHByZXNzaXZlIGFuZCBzZWxmLWRvY3VtZW50aW5nLgogICBJbiBib3RoIGNh c2VzLCB0aGUgc291cmNlIG1vZGlmaWVzIHRoZSBkZXN0aW5hdGlvbjsgT1JlZCBpbiwgaW4K ICAgdGhlIGNhc2Ugb2YgdW5pb25zZXQ7IEFORGVkIGluLCBpbiB0aGUgY2FzZSBvZiBpbnRl cnNlY3RzZXQuICAqLwpdXSkpCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1sidW5pb25zZXQi XSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJpbnRlcnNlY3RzZXQiXSkKCldyaXRlRXh0 ZXJuRGVjbChmLCBEZWNsc1siY2hhcmNsYXNzLWJpdGNvdW50Il0pCldyaXRlRXh0ZXJuRGVj bChmLCBEZWNsc1sibmV4dC1tZW1iZXIiXSkKCmFzc2VydChmOndyaXRlKFtbCl1dKSkKCmFz c2VydChmOndyaXRlKFtbCi8qIEZ1bmN0aW9ucyB0byBhbGxvY2F0ZSwgY29tcGxldGUgYW5k IGFiYW5kb24gY2hhcmNsYXNzZXMuICBOb3RlIHRoYXQKICAgdGhlIG1vZHVsZSBhZ2dyZXNz aXZlbHkgdHJpZXMgdG8gcmV1c2UgZXhpc3RpbmcgY29tcGxldGVkIGNsYXNzZXMKICAgcmF0 aGVyIHRoYW4gY3JlYXRlIG5ldyBvbmVzLiAgVGhlIG1vZHVsZSByZXR1cm5zIGFuIHVuaXF1 ZSBpbmRleAogICB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgbW9kdWxlOyB0 aGlzIGluZGV4IHN1cGVyY2VkZXMgdGhlCiAgIHBvaW50ZXIgdXNlZCBkdXJpbmcgdGhlIHdv cmsgcGhhc2UsIGUuZy46CgogICAgICAgIHdvcmtfY2xhc3NfcG9pbnRlciA9IGNoYXJjbGFz c19hbGxvYyAoKTsKICAgICAgICAuLi4oU2V0L2NsZWFyIG1lbWJlcnMgYXMgcmVxdWlyZWQg dG8gY29uc3RydWN0IGEgY2xhc3MgaW4KICAgICAgICAgICAgIHdvcmtfY2xhc3NfcG9pbnRl ci4pLi4uCiAgICAgICAgY2xhc3NfaW5kZXggPSBjaGFyY2xhc3NfY29tcGxldGVkICh3b3Jr X2NsYXNzX3BvaW50ZXIpOwogICAgICAgIGNvbXBsZXRlZF9jbGFzc19wb2ludGVyID0gY2hh cmNsYXNzX2dldF9wb2ludGVyIChjbGFzc19pbmRleCk7CiAgICAgICAgLi4uKGNvbXBsZXRl ZF9jbGFzc19wb2ludGVyIG1pZ2h0IG5vdCA9PSB3b3JrX2NsYXNzX3BvaW50ZXIuKS4uLgoK ICAgVGhlIGFnZ3Jlc3NpdmUtcmV1c2UgcG9saWN5IGFsc28gbWVhbnMgdGhhdCBjb21wbGV0 ZWQgY2xhc3NlcyBtdXN0CiAgIG5vdCB1bmRlcmdvIGZ1cnRoZXIgbW9kaWZpY2F0aW9uLiAg QW5vdGhlciBwaWVjZSBvZiBjb2RpbmcgaHlnaWVuZQogICBpcyB0aGF0IHRoZSBwb2ludGVy IHZhbHVlIHVzZWQgdG8gY29uc3RydWN0IHRoZSBjbGFzcyBzaG91bGQgbm90CiAgIGJlIHVz ZWQgb25jZSB0aGUgY2xhc3MgaXMgZWl0aGVyIGNvbXBsZXRlZCBvciBhYmFuZG9uZWQuCgog ICBBbGxvY2F0aW5nIGFuZCB0aGVuIGFiYW5kb25pbmcgY2xhc3NlcyBpcyB1c2VmdWwgd2hl cmUgYW4KICAgb3BlcmF0aW9uIHJlcXVpcmVzIHRlbXBvcmFyeSBjbGFzc2VzIGZvciBhIHdo aWxlLCBidXQgdGhlc2UgZG8gbm90CiAgIG5lZWQgdG8gYmUgbWFpbnRhaW5lZCBvbmNlIHRo ZSB3b3JrIGlzIGNvbXBsZXRlLgoKICAgMiBNYXkgMjAxNDogTm90ZSB0byBzZWxmIGFuZCBv dGhlcnM6IEkgd2FzIHVzaW5nIHRoZSB0ZXJtCiAgICJmaW5hbGlzZSIgaW5zdGVhZCBvZiAi Y29tcGxldGVkIiBmb3IgdGhlIG9wZXJhdGlvbiB3aGVyZSBhIGNsYXNzCiAgIGhhcyBiZWVu IGNvbnN0cnVjdGVkIGFuZCBpcyBub3cgcmVhZHkgdG8gYmUgdXNlZDsgSSd2ZSBkZWNpZGVk IHRvCiAgIGNoYW5nZSB0aGUgdGVybWlub2xvZ3kgYWZ0ZXIgcmVhZGluZyBpbiB2YXJpb3Vz IHBsYWNlcyBob3cgdGhlCiAgIHRlcm0gImZpbmFsaXNlIiBpcyB1c3VhbGx5IHN0cm9uZ2x5 IGNvbm5lY3RlZCB3aXRoIGVuZC1vZi1saWZlCiAgIG9wZXJhdGlvbnMgb24gYW4gb2JqZWN0 IGFuZC9vciBjbGFzcywgbm90IGEgcmVhZHktZm9yLXVzZQogICBvcGVyYXRpb24uICBUaGlz IG5vdGUgaXMgYSByZW1pbmRlciB0byBteXNlbGYgYW5kIGEgaGludCB0byBvdGhlcnMKICAg YWJvdXQgdGhpcyBjaGFuZ2UsIGluIGNhc2UgdmVzdGlnZXMgb2YgdGhlIGVhcmxpZXIgbmFt aW5nIHNjaGVtZQogICBzbGlwIHRocm91Z2ggbXkgZWRpdHMgYW5kL29yIGFwcGVhciBpbiB0 aGUgY29kZS4gICovCgpleHRlcm4gY2hhcmNsYXNzX3QgKgpjaGFyY2xhc3NfYWxsb2MgKHZv aWQpOwoKZXh0ZXJuIGNoYXJjbGFzc19pbmRleF90CmNoYXJjbGFzc19jb21wbGV0ZWQgKGNo YXJjbGFzc190ICpjY2wpOwoKZXh0ZXJuIHZvaWQKY2hhcmNsYXNzX2FiYW5kb24gKGNoYXJj bGFzc190ICpjY2wpOwoKLyogRnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIHBvaW50ZXIgcmVm ZXJlbmNlcyBhbmQgaW5kZXggcmVmZXJlbmNlcwogICBmb3IgYSBjaGFyY2xhc3MuICBBcyBl eHBsYWluZWQgYWJvdmUsIHRoZSBpbmRleCBpcyBjb252ZW5pZW50IGFzCiAgIGl0IGlzIHR5 cGljYWxseSBhbiBhcnJheSByZWZlcmVuY2UsIGFuZCBpcyB1c3VhbGx5IG5vdCBtdWNoIGxh cmdlcgogICB0aGFuIHRoZSBudW1iZXIgb2YgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBhbGxv Y2F0ZWQuICAqLwoKZXh0ZXJuIGNoYXJjbGFzc190ICogX0dMX0FUVFJJQlVURV9QVVJFCmNo YXJjbGFzc19nZXRfcG9pbnRlciAoY2hhcmNsYXNzX2luZGV4X3QgY29uc3QgaW5kZXgpOwoK ZXh0ZXJuIGNoYXJjbGFzc19pbmRleF90IF9HTF9BVFRSSUJVVEVfUFVSRQpjaGFyY2xhc3Nf Z2V0X2luZGV4IChjaGFyY2xhc3NfdCBjb25zdCAqY2NsKTsKCi8qIFJldHVybiBhIHN0YXRp YyBzdHJpbmcgZGVzY3JpYmluZyBhIGNsYXNzIChOb3RlOiBub3QKICAgcmVlbnRyYW50KS4g ICovCmV4dGVybiBjaGFyICoKY2hhcmNsYXNzX2Rlc2NyaWJlIChjaGFyY2xhc3NfdCBjb25z dCAqY2NsKTsKCl1dKSkKCi0tIEZpbmFsbHksIGFkZCB0cmFpbGVyIGxpbmVzIChjKyssIGlk ZW1wb3RlbmN5LCB2aW0pCmFzc2VydChmOndyaXRlKFtbCiNpZmRlZiBfX2NwbHVzcGx1cwp9 CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKI2VuZGlmIC8qIENIQVJDTEFTU19IICovCgov KiB2aW06c2V0IHNoaWZ0d2lkdGg9MjogKi8KXV0pKQoKYXNzZXJ0KGY6Y2xvc2UoKSkKCi0t LS0tLS0tLS0tLS0tLS0qKioqKioqKiBjaGFyY2xhc3MuYyAqKioqKioqKi0tLS0tLS0tLS0t LS0tLS0KCnByaW50KCJDcmVhdGluZyBjaGFyY2xhc3MuYy4uLiIpCmxvY2FsIGYgPSBhc3Nl cnQoaW8ub3BlbigiY2hhcmNsYXNzLmMiLCAidyIpKQphc3NlcnQoZjp3cml0ZShbWwovKiBj aGFyY2xhc3MgLS0gVG9vbHMgdG8gY3JlYXRlIGFuZCBtYW5pcHVsYXRlIHNldHMgb2YgQyAi Y2hhciJzCgpUaGlzIG1vZHVsZSBwcm92aWRlcyB0b29scyB0byBjcmVhdGUsIG1vZGlmeSwg c3RvcmUgYW5kIHJldHJpZXZlCmNoYXJhY3RlciBjbGFzc2VzLCBhbmQgcHJvdmlkZXMgdG9v bHMgdHVuZWQgdG8gdGhlIG5lZWRzIG9mIFJFCmxleGljYWwgYW5hbHlzZXJzLgoKVGhlIGNs YXNzIGl0c2VsZiBpcyBhbiBvcGFxdWUgdHlwZSwgcmVmZXJlbmNlZCBieSBhIHBvaW50ZXIg d2hpbGUKdW5kZXIgY29uc3RydWN0aW9uLCBhbmQgbGF0ZXIgYnkgYW4gdW5pcXVlIGluZGV4 IHdoZW4gY29tcGxldGVkLgpUaGUgbW9kdWxlIHRyaWVzIGFnZ3Jlc3NpdmVseSB0byByZXVz ZSBleGlzdGluZyBjb21wbGV0ZWQgY2xhc3NlcywKcmF0aGVyIHRoYW4gY3JlYXRlIGR1cGxp Y2F0ZXMuICBGdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvIG1hcApiZXR3ZWVuIGluZGV4ZXMg YW5kIHBvaW50ZXJzLiAgQmVjYXVzZSBvZiB0aGUgZGVkdXBsaWNhdGlvbiBlZmZvcnQsCnRo ZSBpbmRleCByZXBvcnRlZCBmb3IgYSBjbGFzcyB1cG9uIGNvbXBsZXRpb24gbWF5IG1hcCB0 byBhCmRpZmZlcmVudCBwb2ludGVyIHRoYW4gdGhlIG9uZSBzdXBwbGllZCBieSBuZXcgKCku CgpDbGFzc2VzIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgbGV4ZXIgaW5zdGFu Y2VzLCBhbHRob3VnaCwKYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyAoMTAgQXByaWwgMjAxNCkg aXQgaXMgbm90IHRocmVhZC1zYWZlLiAgSW4KbWFueSBjYXNlcywgdGhlcmUgbWlnaHQgb25s eSBiZSBvbmUgY2xhc3MgdW5kZXIgY29uc3RydWN0aW9uIGF0IGFueQp0aW1lLCB3aXRoIHRo ZSBlZmZvcnQgZWl0aGVyIGNvbXBsZXRlZCBvciBhYmFuZG9uZWQgcXVpY2tseS4KSG93ZXZl ciwgdGhpcyBtb2R1bGUgcmVjb2duaXNlcyB0aGF0IHNvbWV0aW1lcyBtdWx0aXBsZSBjbGFz c2VzCm1pZ2h0IGJlIHdvcmtlZCBvbiBpbiBwYXJhbGxlbCwgYW5kIHNvIGV4cGxpY2l0bHkg bWFya3MgZWFjaAphbGxvY2F0ZWQgY2xhc3MgYXJlYSBhcyBvbmUgb2YgInVudXNlZCIsICJ3 b3JrIiBvciAiY29tcGxldGVkIi4KVGhpcyBtYXJraW5nIGlzIGRvbmUgYnkgYW4gYXJyYXkg b2Ygc3RhdGUgYnl0ZXMgZHluYW1pY2FsbHkKYWxsb2NhdGVkIHdoZW4gdGhlIHBvb2wgaXMg Y3JlYXRlZC4KCl1dKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29weXJpZ2h0LmRmYWMi KSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VXYXJyYW50eS5kZmFj IiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3JzLmRmYWMiKSkpCmFz c2VydChmOndyaXRlKFtbCgovKiAyMDE0OiBSZXBhY2thZ2VkIGJ5ICJ1bnRhbmdsZSIgc2Ny aXB0LCB3cml0dGVuIGJ5IGJlaG9mZnNraS4gICovCgovKiBBbHdheXMgaW1wb3J0IGVudmly b25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaXRlbXMgZmlyc3QuICAqLwojaW5jbHVk ZSA8Y29uZmlnLmg+CgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJjaGFyY2xhc3Mu aCIKI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgojaW5jbHVkZSA8 c3RkZGVmLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIGZv ciBFT0YgYXNzZXJ0IHRlc3QuICAqLwojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx3 Y2hhci5oPiAvKiBmb3IgV0VPRiBhc3NlcnQgdGVzdC4gICovCiNpbmNsdWRlICJ4YWxsb2Mu aCIKCi8qIExvd2VyIGJvdW5kIGZvciBzaXplIG9mIGZpcnN0IHBvb2wgaW4gdGhlIGxpc3Qu ICAqLwovKiA/PyBTZXQgdG8gMiBmb3IgcG9vbCBkZWJ1ZzsgIFVzZSAxMCBpbiBwcm9kdWN0 aW9uPyAgKi8KI2RlZmluZSBQT09MX01JTklNVU1fSU5JVElBTF9TSVpFICAgICAgICAgIDEw CgojaWZuZGVmIE1BWAojIGRlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIp KQojZW5kaWYKCiNpZm5kZWYgTUlOCiMgZGVmaW5lIE1JTihhLGIpICgoYSkgPCAoYikgPyAo YSkgOiAoYikpCiNlbmRpZgoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogV2UgbWFpbnRh aW4gYSBsaXN0LW9mLXBvb2xzIGhlcmUsIGNob29zaW5nIHRvIG1hbGxvYyBhIG5ldyBzbGFi IG9mCiAgIG1lbW9yeSBlYWNoIHRpbWUgd2UgcnVuIG91dCwgaW5zdGVhZCBvZiBhIHJlYWxs b2Mgc3RyYXRlZ3kuICBUaGlzCiAgIGlzIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUgYSBndWFy YW50ZWUgdG8gdGhlIHVzZXIgdGhhdCBhbnkgY2xhc3MKICAgcG9pbnRlciBpc3N1ZWQgcmVt YWlucyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBtb2R1bGUuICAqLwoKdHlwZWRl ZiBzaXplX3QgcG9vbF9saXN0X2luZGV4X3Q7CgovKiBEZXNpZ25hdG9yIGZvciBlYWNoIGNo YXJjbGFzcyBpbiBlYWNoIHBvb2wuICBOb3RlIHRoYXQgZW51bXMgYXJlCiAgIGludHMgYnkg ZGVmYXVsdCwgYnV0IHdlIHVzZSBhIHNpbmdsZSB1bnNpZ25lZCBjaGFyIHBlciBjbGFzcyBp biBvdXIKICAgZXhwbGljaXQgbWVtb3J5IGFsbG9jYXRpb24uICAqLwp0eXBlZGVmIGVudW0K ewogIFNUQVRFX1VOVVNFRCA9IDAsCiAgU1RBVEVfV09SS0lORyA9IDEsCiAgU1RBVEVfQ09N UExFVEVEID0gMgp9IGNoYXJjbGFzc19zdGF0ZV90OwoKdHlwZWRlZiBzdHJ1Y3QgcG9vbF9p bmZvX3N0cnVjdCB7CiAgLyogU2lnbmF0dXJlIGlkZW50aWZ5aW5nIHRvcCBvZiBzdHJ1Y3Qs IHdoaWNoIGFsc28gc2VydmVzIGFzIGEKICAgICBjYW5hcnkgdGhhdCBtYXkgaGVscCB1bm1h c2sgdW5pbnRlbmRlZCBkYW1hZ2UgYnkgb3V0c2lkZXJzLiAgKi8KICB1bnNpZ25lZCBsb25n IHBvb2xfdG9wX2ZlbmNlX21hZ2ljX25yOwoKICBjaGFyY2xhc3NfaW5kZXhfdCBmaXJzdF9p bmRleDsKICBzaXplX3QgYWxsb2M7ICAgICAgLyogPz8gVXNlIHBvb2xfbGlzdF9pbmRleF90 IHR5cGUgZm9yIHRoZXNlPyAgKi8KICBzaXplX3QgdXNlZDsKICBjaGFyY2xhc3NfdCAqY2xh c3NlczsKCiAgLyogQ2hhcmNsYXNzIGRlc2lnbmF0b3IgYnl0ZSBhcnJheSwgb25lIHBlciBp dGVtLCBhbGxvY2F0ZWQKICAgICBkeW5hbWljYWxseS4gICovCiAgdW5zaWduZWQgY2hhciAq Y2xhc3Nfc3RhdGU7CgogIC8qIFNpZ25hdHVyZS9jYW5hcnkgdG9rZW4gZm9yIGJvdHRvbSBv ZiBzdHJ1Y3QuICAqLwogIHVuc2lnbmVkIGxvbmcgcG9vbF9ib3R0b21fZmVuY2VfbWFnaWNf bnI7Cn0gcG9vbF90OwojZGVmaW5lIFBPT0xfVE9QX0ZFTkNFX01BR0lDX05SICAgIDB4ZDk0 MWY2MGR1TAojZGVmaW5lIFBPT0xfQk9UVE9NX0ZFTkNFX01BR0lDX05SIDB4NzUyYzQ0ODV1 TAojZGVmaW5lIENIRUNLX1BPT0wocG9vbCkgIFwKICBhc3NlcnQgKCgocG9vbCkgIT0gTlVM TCkgICAgICAgXAogICAmJiAoKHBvb2wpLT5wb29sX3RvcF9mZW5jZV9tYWdpY19uciAgICA9 PSBQT09MX1RPUF9GRU5DRV9NQUdJQ19OUikgIFwKICAgJiYgKChwb29sKS0+cG9vbF9ib3R0 b21fZmVuY2VfbWFnaWNfbnIgPT0gUE9PTF9CT1RUT01fRkVOQ0VfTUFHSUNfTlIpKQoKc3Rh dGljIHBvb2xfbGlzdF9pbmRleF90IHBvb2xfbGlzdF91c2VkICA9IDA7CnN0YXRpYyBwb29s X2xpc3RfaW5kZXhfdCBwb29sX2xpc3RfYWxsb2MgPSAwOwpzdGF0aWMgcG9vbF90ICpwb29s X2xpc3QgPSBOVUxMOwoKLyogV2hpbGUgdGhlIGhlYWRlciBvbmx5IGd1YXJhbnRlZXMgYSAz LWJpdCBndXR0ZXIgYXQgZWFjaCBlbmQgb2YKICAgZWFjaCBjbGFzcywgd2UgdXNlIGFuIGVu dGlyZSB3b3JkICh0eXBpY2FsbHkgMzIgYml0cykgZm9yIHRoZQogICBndXR0ZXIsIHdpdGgg YXQgbGVhc3QgMSB3b3JkIHBsYWNlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBwb29sLCAxCiAg IHdvcmQgYXMgYSBzaGFyZWQgZ3V0dGVyIGJldHdlZW4gZWFjaCBjbGFzcywgYW5kIDEgd29y ZCBhZnRlciB0aGUKICAgbGFzdCBjbGFzcy4gICovCgpdXSkpCgotLSBEZWZpbmUgQ0hBUkJJ VFMsIElOVEJJVFMsIGFuZCBDSEFSQ0xBU1NfV09SRFMgdXNlZCB0byBzY29wZSBvdXQKLS0g c2l6ZSAoaW4gaW50ZWdlcnMpIG9mIGJpdC12ZWN0b3IgYXJyYXkuCmFzc2VydChmOndyaXRl KFJhd1RleHQoIk5vSFBVWEJpdE9wcyIpLCAiXG4iKSkKLS0geHhSZW1vdmVkOiBhc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJDSEFSQklUUy1vY3RldHMiKSwgIlxuIikpCi0tIHh4UmVtb3Zl ZDogYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiSU5UQklUUyIpLCAiXG4iKSkKYXNzZXJ0KGY6 d3JpdGUoUmF3VGV4dCgiY2hhcmNsYXNzX3dvcmQgdHlwZWRlZiIpLCAiXG4iKSkKYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiQ0hBUkNMQVNTX1dPUkRfQklUUyIpLCAiXG4iKSkKYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiQ0hBUkNMQVNTX1dPUkRfTUFTSyIpLCAiXG4iKSkKYXNzZXJ0 KGY6d3JpdGUoVGV4dFN1YnN0KFJhd1RleHQoIkNIQVJDTEFTU19XT1JEUyBlbnVtIiksCiAg ICAgICAgICAgICAgICAgICAgICAgICJOT1RDSEFSIiwgIkNIQVJDTEFTU19OT1RDSEFSIiks ICJcbiIpKQotLV1dCgphc3NlcnQoZjp3cml0ZShbWwovKiBGbGVzaCBvdXQgb3BhcXVlIGNo YXJjbGFzcyB0eXBlIGdpdmVuIGluIHRoZSBoZWFkZXIgICovCi8qIFRoZSBndXR0ZXIgZWxl bWVudCBmb2xsb3dpbmcgdGhlIGNsYXNzIG1lbWJlciBzdG9yYWdlIGFsc28gc2VydmVzCiAg IGFzIHRoZSBndXR0ZXIgZWxlbWVudCBwcmVjZWRpbmcgdGhlIG5leHQgY2xhc3MgbWVtYmVy IGluIHRoZSBsaXN0LgoKICAgTm90ZSB0aGF0IHNpbmNlIHRoZSAiZ3V0dGVyIiBub3Rpb24g ZXhwbGljaXRseSBwZXJtaXRzIGEKICAgcmVzdHJpY3RlZCBzZXQgb2YgbmVnYXRpdmUgaW5k aWNlcywgbWVtYmVycyBuZWVkIHRvIGJlIHNpZ25lZCwKICAgbm90IHVuc2lnbmVkLCBzbyB0 aGF0IGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgY2FuIGJlIHVzZWQgd2hlcmUKICAgcG9zc2li bGUgKGUuZy4gLTggPj4gOCA9PSAtMSwgbm90IC04IC8gMjU2ID09IDApLiAgKi8KCnN0cnVj dCBjaGFyY2xhc3Nfc3RydWN0IHsKICAgY2hhcmNsYXNzX3dvcmQgbWVtYmVyc1tDSEFSQ0xB U1NfV09SRFNdOwogICBjaGFyY2xhc3Nfd29yZCBndXR0ZXJfZm9sbG93aW5nOwp9OwoKXV0p KQoKLS0gSGVscGVyIGZ1bmN0aW9ucyAocHJvYmFibHkgcmVwbGFjZWQgYnkgbW9yZSBlZmZp Y2llbnQgZXh0ZXJuYWwKLS0gZnVuY3Rpb25zIGxhdGVyKS4KYXNzZXJ0KGY6d3JpdGUoW1sK c3RhdGljIGludApjaGFyY2xhc3Nfd29yZF9iaXRjb3VudCAoY2hhcmNsYXNzX3dvcmQgbWVt YmVyKQp7CiAgdW5zaWduZWQgbG9uZyBjOwogIC8qID8/IEZJWE1FOiBNaWdodCBuZWVkIHRv IGltcHJvdmUgdHlwZWRlZiBpZiB3ZSB3YW50IHRvIGRlYWwKICAgICB3aXRoICJ2ZXJ5IGxv bmciIHdvcmQgc2l6ZXMgKGFzIHNlZW4gYnkgdGhlIGNvbXBpbGVyKS4gIFRoaXMKICAgICBp cyB3aHkgdGhlIDY0LWJpdCBjYXNlIGJlbG93IGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZQog ICAgIG1vbWVudC4gICovCgogIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB0YWtlbiBmcm9t IHRoZSBzaXRlOgpodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9+c2VhbmRlci9iaXRo YWNrcy5odG1sI0NvdW50Qml0c1NldFBhcmFsbGVsCiAgICAgd2hpY2ggbm90ZXMgdGhhdCBh bGwgY29kZSBzbmlwcGV0cyBvbiB0aGUgcGFnZSBhcmUgaW4gdGhlCiAgICAgcHVibGljIGRv bWFpbiAodW5sZXNzIG90aGVyd2lzZSBub3RlZCkuICBJIGJlbGlldmUgdGhhdCwgaW4KICAg ICB0aGUgYWJzZW5jZSBvZiBhIG5vdGUgdG8gdGhlIGNvbnRyYXJ5LCB0aGF0IHRoZSBmb2xs b3dpbmcgY29kZQogICAgIGluIHRoaXMgZnVuY3Rpb24gKGFsb25lKSBpcyBwdWJsaWMgZG9t YWluOyBHUEwzIGFwcGxpZXMKICAgICBlbHNld2hlcmUgaW4gdGhpcyBmaWxlIHVubGVzcyBl eHBsaWNpdGx5IGRpc2NsYWltZWQuICAgKi8KICBzd2l0Y2ggKENIQVJDTEFTU19XT1JEX0JJ VFMpCiAgIHsKICAgY2FzZSAxNjoKICAgICBjID0gbWVtYmVyICYgMHhmZmZmOwogICAgIGMg PSBjIC0gKChjID4+ICAxKSAmIDB4NTU1NSk7CiAgICAgYyA9ICAgICAoKGMgPj4gIDIpICYg MHgzMzMzKSArIChjICYgMHgzMzMzKTsKICAgICBjID0gICAgICgoYyA+PiAgNCkgKyBjKSAm IDB4MGYwZjsKICAgICBjID0gICAgICgoYyA+PiAgOCkgKyBjKSAmIDB4MDBmZjsKICAgICBi cmVhazsKICAgY2FzZSAzMjoKICAgICBjID0gbWVtYmVyICYgMHhmZmZmZmZmZnVMOwogICAg IGMgPSBjIC0gKChjID4+ICAxKSAmIDB4NTU1NTU1NTV1TCk7CiAgICAgYyA9ICAgICAoKGMg Pj4gIDIpICYgMHgzMzMzMzMzM3VMKSArIChjICYgMHgzMzMzMzMzM3VMKTsKICAgICBjID0g ICAgICgoYyA+PiAgNCkgKyBjKSAmIDB4MGYwZjBmMGZ1TDsKICAgICBjID0gICAgICgoYyA+ PiAgOCkgKyBjKSAmIDB4MDBmZjAwZmZ1TDsKICAgICBjID0gICAgICgoYyA+PiAxNikgKyBj KSAmIDB4MDAwMGZmZmZ1TDsKICAgICBicmVhazsKI2lmIDAKICAgY2FzZSA2NDoKICAgICBj ID0gbWVtYmVyICYgMHhmZmZmZmZmZmZmZmZmZmZmdUxMOwogICAgIGMgPSBjIC0gKChjID4+ ICAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NXVMTCk7CiAgICAgYyA9ICAgICAoKGMgPj4gIDIp ICYgMHgzMzMzMzMzMzMzMzMzMzMzdUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKyAoYyAmIDB4MzMzMzMzMzMzMzMzMzMzM3VMTCk7CiAgICAgYyA9ICAgICAoKGMgPj4g IDQpICsgYykgJiAweDBmMGYwZjBmMGYwZjBmMGZ1TEw7CiAgICAgYyA9ICAgICAoKGMgPj4g IDgpICsgYykgJiAweDAwZmYwMGZmMDBmZjAwZmZ1TEw7CiAgICAgYyA9ICAgICAoKGMgPj4g MTYpICsgYykgJiAweDAwMDBmZmZmMDAwMGZmZmZ1TEw7CiAgICAgYyA9ICAgICAoKGMgPj4g MzIpICsgYykgJiAweDAwMDAwMDAwZmZmZmZmZmZ1TEw7CiAgICAgYnJlYWs7CiNlbmRpZiAv KiAwICovCiAgICAgZGVmYXVsdDoKICAgICAgIGFzc2VydCAoIQogICAgICAgICAgICJVbnJl Y29nbmlzZWQgd29yZCBzaXplIGluIGNoYXJjbGFzc193b3JkX2JpdGNvdW50Iik7CiAgICAg YnJlYWs7CiAgfQoKICByZXR1cm4gYzsKfQoKXV0pKQoKLS0gRGVmaW5lIHB1YmxpYyBmdW5j dGlvbnMuICBXZSd2ZSBtYWRlIGNoYXJjbGFzcyBhbiBvcGFxdWUgY2xhc3MsIHNvCi0tIG5l ZWQgdG8gZWRpdCBlYWNoIGJvZHkgdG8gY2hhbmdlIHBhcmFtZXRlciAiYyIgdG8gIipjIiwg YW5kIGluIGJvZHkKLS0gY2hhbmdlICJjIiB0byAiYy0+bWVtYmVycyIuCgphc3NlcnQoZjp3 cml0ZShbWwovKiBEZWZpbmUgY2xhc3MgYml0IG9wZXJhdGlvbnM6IHRlc3QsIHNldCBhbmQg Y2xlYXIgYSBiaXQuCgogICBHcnJyci4gIEkgd2FudGVkIHRvIGV4cGxvaXQgYXJpdGhtZXRp YyByaWdodCBzaGlmdCB0byBjb21lIHVwCiAgIHdpdGggYSByZWFsbHkgY2hlYXAgYW5kIG5l YXQgd2F5IG9mIHJlZHVjaW5nIHNtYWxsIG5lZ2F0aXZlIGJpdAogICB2YWx1ZXMsIGVzcGVj aWFsbHkgaWYgYiA9PSBFT0YgPT0gLTEsIHRvIGFuIGluZGV4IG9mIC0xIHRoYXQKICAgZmFs bHMgbmVhdGx5IGludG8gdGhlIGd1dHRlciwgYnV0IHN0cmljdCBDIGNvbmZvcm1hbmNlIGRv ZXMgbm90CiAgIGd1YXJhbnRlZSB0aGlzLiAgVGhlIGNvZGUgYmVsb3cgaGFuZGxlcyB0aGUg dHdvIG1vc3QgbGlrZWx5CiAgIHNjZW5hcmlvcywgYnV0LCBhcyB3aXRoIGFueXRoaW5nIHRo YXQgaXMgdW5kZWZpbmVkLCB0aGlzIGlzCiAgIHBsYXlpbmcgd2l0aCBmaXJlLiAgKi8KCiNp ZiBJTlRfTUFYID09IDIxNDc0ODM2NDcKLyogbG9nMiAoc2l6ZW9mIChpbnQpKSArIGxvZzIg KENIQVJDTEFTU19XT1JEX0JJVFMpICovCiMgZGVmaW5lIElOVF9CSVRTX0xPRzIgNQojZWxz ZQojIGVycm9yICJOb3QgaW1wbGVtZW50ZWQ6IEFyY2hpdGVjdHVyZXMgd2l0aCBpbnRzIG90 aGVyIHRoYW4gMzIgYml0cyIKI2VuZGlmCgojaWYgKCh+MCA+PiAxKSA8IDApCiAgLyogQXJp dGhtZXRpYyBzaGlmdCByaWdodDogQm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIGNhc2VzIGFy ZSBvay4gICovCiMgZGVmaW5lIEFSSVRIX1NISUZUX1JfSU5UKGIpICgoYikgPj4gSU5UX0JJ VFNfTE9HMikKI2Vsc2UKICAvKiBBdm9pZCB1c2luZyByaWdodCBzaGlmdCBpZiBiIGlzIG5l Z2F0aXZlLiAgVGhlIG1hY3JvIG1heSBldmFsdWF0ZQogICAgIGIgdHdpY2UgaW4gc29tZSBj aXJjdW1zdGFuY2VzLiAgKi8KIyBkZWZpbmUgQVJJVEhfU0hJRlRfUl9JTlQoYikgXAogICAg ICAoKChiKSA8IDApID8gLTEgOiAoKGIpID4+IElOVF9CSVRTX0xPRzIpKQojZW5kaWYKCl1d KSkKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbInRzdGJpdCJdKSkKbG9jYWwgYm9keSA9IEVkaXRl ZFRleHQoImNoY2xhc3MtdHN0Yml0LWJvZHkiLAogICAgICAgICJjJVtiIC8gQ0hBUkNMQVNT X1dPUkRfQklUUyVdIiwKICAgICAgICAiY2NsLT5tZW1iZXJzW0FSSVRIX1NISUZUX1JfSU5U IChiKV0iKQphc3NlcnQoZjp3cml0ZShib2R5LCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoRGVj bHNbInNldGJpdCJdKSkKbG9jYWwgYm9keSA9IEVkaXRlZFRleHQoImNoY2xhc3Mtc2V0Yml0 LWJvZHkiLAogICAgICAgICJjJVtiIC8gQ0hBUkNMQVNTX1dPUkRfQklUUyVdIiwKICAgICAg ICAiY2NsLT5tZW1iZXJzW0FSSVRIX1NISUZUX1JfSU5UIChiKV0iKQphc3NlcnQoZjp3cml0 ZShib2R5LCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbImNscmJpdCJdKSkKbG9jYWwg Ym9keSA9IEVkaXRlZFRleHQoImNoY2xhc3MtY2xyYml0LWJvZHkiLAogICAgICAgICJjJVti IC8gQ0hBUkNMQVNTX1dPUkRfQklUUyVdIiwKICAgICAgICAiY2NsLT5tZW1iZXJzW0FSSVRI X1NISUZUX1JfSU5UIChiKV0iKQphc3NlcnQoZjp3cml0ZShib2R5LCAiXG4iKSkKCi0tIEFk ZCAic2V0Yml0X3JhbmdlIiBhbmQgImNscmJpdF9yYW5nZSIsIG1haW5seSBhcyBpdCBhbGxv d3MgdGhlCi0tIGNsaWVudCB0byB3cml0ZSBzaWduaWZpY2FudGx5IGNsZWFuZXIgY29kZSBp biBzb21lIGNhc2VzICh1dGY4KSwKLS0gYnV0IGFsc28gYmVjYXVzZSB0aGlzIGNvZGUgaXMg KGluaXRpYWxseSkgbW9kZXN0bHkgbW9yZSBlZmZpY2llbnQuCi0tIChJIGNvdWxkIGltcGxl bWVudCBiaXRtYXNrcyBoZXJlIHRvIGltcHJvdmUgZWZmaWNpZW5jeSBtdWNoIG1vcmUsCi0t IGJ1dCB0aGVyZSBhcmUgc28gbWFueSB0aGluZ3MgdG8gZG8gdGhhdCBJJ20gc2tpcHBpbmcg aXQgZm9yIG5vdy4pCmFzc2VydChmOndyaXRlKERlY2xzWyJzZXRiaXRfcmFuZ2UiXSwgW1sK ewogIGludCBiaXQ7CgogIC8qIERvIG5vdGhpbmcgaWYgdGhlIHJhbmdlIGRvZXNuJ3QgbWFr ZSBzZW5zZS4gICovCiAgaWYgKGVuZCA8IHN0YXJ0KQogICAgcmV0dXJuOwogIGlmIChzdGFy dCA+PSBDSEFSQ0xBU1NfTk9UQ0hBUikKICAgIHJldHVybjsKCiAgLyogQ2xpcCB0aGUgcmFu Z2UgdG8gYmUgaW4gdGhlIGludGVydmFsIFstMS4uTk9UQ0hBUiAtIDFdICovCiAgc3RhcnQg PSBNQVggKHN0YXJ0LCAtMSk7CiAgZW5kICAgPSBNQVggKGVuZCwgICAtMSk7CiAgLyogV2Ug a25vdyBzdGFydCBpcyA8IENIQVJDTEFTU19OT1RDSEFSIGZyb20gdGhlIHRlc3QgYWJvdmUu ICAqLwogIGVuZCAgID0gTUlOIChlbmQsICAgQ0hBUkNMQVNTX05PVENIQVIgLSAxKTsKCiAg LyogPz8gQ291bGQgY2hlY2sgdGhhdCBjY2wgaXMgYSB2YWxpZCBjbGFzcywgYnV0IG5vdCBh dCBwcmVzZW50LiAgKi8KCiAgLyogT2theSwgbG9vcCB0aHJvdWdoIHRoZSByYW5nZSwgYml0 LWJ5LWJpdCwgc2V0dGluZyBtZW1iZXJzLiAgKi8KICBmb3IgKGJpdCA9IHN0YXJ0OyBiaXQg PD0gZW5kOyBiaXQrKykKICAgIGNjbC0+bWVtYmVyc1tBUklUSF9TSElGVF9SX0lOVCAoYml0 KV0KICAgICAgICAgICAgICAgfD0gMVUgPDwgYml0ICUgQ0hBUkNMQVNTX1dPUkRfQklUUzsK fQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbImNscmJpdF9yYW5nZSJdLCBbWwp7CiAg aW50IGJpdDsKCiAgLyogRG8gbm90aGluZyBpZiB0aGUgcmFuZ2UgZG9lc24ndCBtYWtlIHNl bnNlLiAgKi8KICBpZiAoZW5kIDwgc3RhcnQpCiAgICByZXR1cm47CiAgaWYgKHN0YXJ0ID49 IENIQVJDTEFTU19OT1RDSEFSKQogICAgcmV0dXJuOwoKICAvKiBDbGlwIHRoZSByYW5nZSB0 byBiZSBpbiB0aGUgaW50ZXJ2YWwgWy0xLi5OT1RDSEFSIC0gMV0gKi8KICBzdGFydCA9IE1B WCAoc3RhcnQsIC0xKTsKICBlbmQgICA9IE1BWCAoZW5kLCAgIC0xKTsKICAvKiBXZSBrbm93 IHN0YXJ0IGlzIDwgQ0hBUkNMQVNTX05PVENIQVIgZnJvbSB0aGUgdGVzdCBhYm92ZS4gICov CiAgZW5kICAgPSBNSU4gKGVuZCwgICBDSEFSQ0xBU1NfTk9UQ0hBUiAtIDEpOwoKICAvKiA/ PyBDb3VsZCBjaGVjayB0aGF0IGNjbCBpcyBhIHZhbGlkIGNsYXNzLCBidXQgbm90IGF0IHBy ZXNlbnQuICAqLwoKICAvKiBPa2F5LCBsb29wIHRocm91Z2ggdGhlIHJhbmdlLCBiaXQtYnkt Yml0LCBjbGVhcmluZyBtZW1iZXJzLiAgKi8KICBmb3IgKGJpdCA9IHN0YXJ0OyBiaXQgPD0g ZW5kOyBiaXQrKykKICAgIGNjbC0+bWVtYmVyc1tBUklUSF9TSElGVF9SX0lOVCAoYml0KV0K ICAgICAgICAgICAgICAgJj0gfigxVSA8PCBiaXQgJSBDSEFSQ0xBU1NfV09SRF9CSVRTKTsK fQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogRGVmaW5lIHdob2xlLXNldCBvcGVyYXRp b25zOiBDb3B5LCBjbGVhciwgaW52ZXJ0LCBjb21wYXJlIGFuZCB1bmlvbiAgKi8KCl1dKSkK CmFzc2VydChmOndyaXRlKERlY2xzWyJjb3B5c2V0Il0pKQpsb2NhbCBib2R5ID0gRWRpdGVk VGV4dCgiY2hjbGFzcy1jb3B5c2V0LWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAi XG4gIG1lbWNweSAuLVxuIiwKICAgICAgICAiXG4gIG1lbWNweSAoZHN0LT5tZW1iZXJzLCBz cmMtPm1lbWJlcnMsIHNpemVvZiAoc3JjLT5tZW1iZXJzKSk7XG4iKQphc3NlcnQoZjp3cml0 ZShib2R5LCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbInplcm9zZXQiXSkpCmxvY2Fs IGJvZHkgPSBFZGl0ZWRUZXh0KCJjaGNsYXNzLXplcm9zZXQtYm9keSIsCiAgICAgICAgICAg ICAgICAgICJcbiAgbWVtc2V0IC4tXG4iLAogICAgICAgICAgICAgICAgICAiXG4gIG1lbXNl dCAoY2NsLT5tZW1iZXJzLCAwLCBzaXplb2YgKGNjbC0+bWVtYmVycykpO1xuIikKYXNzZXJ0 KGY6d3JpdGUoYm9keSwgIlxuIikpCmFzc2VydChmOndyaXRlKERlY2xzWyJub3RzZXQiXSkp CmxvY2FsIGJvZHkgPSBFZGl0ZWRUZXh0KCJjaGNsYXNzLW5vdHNldC1ib2R5IiwKICAgICAg ICAgICAgICAiICAgIHMlW2klXSA9IENIQVJDTEFTU19XT1JEX01BU0sgJiB+cyVbaSVdIiwK ICAgICAgICAgICAgICAiICAgIGNjbC0+bWVtYmVyc1tpXSA9IENIQVJDTEFTU19XT1JEX01B U0sgJiB+Y2NsLT5tZW1iZXJzW2ldIikKYXNzZXJ0KGY6d3JpdGUoYm9keSwgIlxuIikpCmFz c2VydChmOndyaXRlKERlY2xzWyJlcXVhbCJdKSkKbG9jYWwgYm9keSA9IEVkaXRlZFRleHQo ImNoY2xhc3MtZXF1YWwtYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgcmV0 dXJuIC4tXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAiXG4gIHJldHVybiBtZW1jbXAg KGNjbDEtPm1lbWJlcnMsIGNjbDItPm1lbWJlcnMsXG4iCiAgICAgICAgICAuLiAiICAgICAg IHNpemVvZiAoY2NsMS0+bWVtYmVycykpID09IDA7XG4iKQphc3NlcnQoZjp3cml0ZShib2R5 LCAiXG4iKSkKCi0tIEFkZCAidW5pb25zZXQiIGFuZCAiaW50ZXJzZWN0c2V0IiBmdW5jdGlv bnMgc28gd2UgY2FuIHVzZSBjbGFzc2VzIG1vcmUKLS0gZXhwcmVzc2l2ZWx5IGFuZCBkaXJl Y3RseS4KYXNzZXJ0KGY6d3JpdGUoRGVjbHNbInVuaW9uc2V0Il0sIFtbCnsKICBpbnQgaTsK CiAgZm9yIChpID0gMDsgaSA8IENIQVJDTEFTU19XT1JEUzsgKytpKQogICAgZHN0LT5tZW1i ZXJzW2ldIHw9IHNyYy0+bWVtYmVyc1tpXTsKfQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVj bHNbImludGVyc2VjdHNldCJdLCBbWwp7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBD SEFSQ0xBU1NfV09SRFM7ICsraSkKICAgIGRzdC0+bWVtYmVyc1tpXSAmPSBzcmMtPm1lbWJl cnNbaV07Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJjaGFyY2xhc3MtYml0Y291 bnQiXSwgW1sKewogIGludCBpOwogIGludCBjb3VudDsKCiAgY291bnQgPSAwOwogIGZvciAo aSA9IDA7IGkgPCBDSEFSQ0xBU1NfV09SRFM7ICsraSkKICAgIHsKICAgICAgY2hhcmNsYXNz X3dvcmQgdzsKCiAgICAgIHcgPSBjY2wtPm1lbWJlcnNbaV07CiAgICAgIGlmICh3ICE9IDAp CiAgICAgICAgY291bnQgKz0gY2hhcmNsYXNzX3dvcmRfYml0Y291bnQgKHcpOwogICAgfQoK ICByZXR1cm4gY291bnQ7Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJuZXh0LW1l bWJlciJdLCBbWwp7CiAgaW50IGk7CgogIC8qIFVzZSBhIHNpbXBsZSBsb29wIGZvciBub3cg KGluaXRpYWxseSkuICBUaGlzIGNvZGUgY291bGQgZXhwbG9pdAogICAgIGl0cyBrbm93bGVk Z2Ugb2YgdGhlIGludGVybmFscywgYW5kIGJlIG1vcmUgZWZmaWNpZW50LCBidXQsIGF0CiAg ICAgdGhlIHRpbWUgb2Ygd3JpdGluZywgb3RoZXIgYXJlYXMgYXJlIG1vcmUgcHJlc3Npbmcg aW4gdGVybXMgb2YKICAgICBwcm92aWRpbmcgb3Bwb3J0dW5pdGllcyBmb3IgcGVyZm9ybWFu Y2UgZW5oYW5jZW1lbnQuICAqLwogIGZvciAoaSA9IHNlYXJjaF9zdGFydF9tZW1iZXI7IGkg PCBDSEFSQ0xBU1NfTk9UQ0hBUjsgaSsrKQogICAgaWYgKGNoYXJjbGFzc190c3RiaXQgKGks IGNjbCkpCiAgICAgIHsKICAgICAgICAqZm91bmRfbWVtYmVyID0gaTsKICAgICAgICByZXR1 cm4gdHJ1ZTsKICAgICAgfQoKICAvKiBObyBtZW1iZXIgZm91bmQuICAqLwogIHJldHVybiBm YWxzZTsKfQoKXV0pKQoKLS0gUmV3cml0ZSBjaGFyY2xhc3Mgc3RvcmFnZSBoYW5kbGluZy4g IFRoZSBvcmlnaW5hbCBjb2RlIHJlbGF0aW5nCi0tIHRvIHRoaXMgc3RhcnRzIGF0IGFib3V0 IGxpbmUgNTk1IGluIGRmYS5jLCBidXQgdGhpcyBjb2RlIGlzCi0tIHN1ZmZpY2llbnRseSBk aWZmZXJlbnQgdGhhdCBJJ20gd3JpdGluZyBpdCBmcm9tIHNjcmF0Y2guCmFzc2VydChmOndy aXRlKFtbCi8qICNpZmRlZiBERUJVRyAqLwoKLyogTnliYmxlICg0Yml0KS10by1jaGFyIGNv bnZlcnNpb24gYXJyYXkgZm9yIGxpdHRsZS1iaXQtZW5kaWFuCiAgIG55YmJsZXMuICAqLwpz dGF0aWMgY29uc3QgY2hhciAqZGlzcF9ueWJibGUgPSAiMDg0YzJhNmUxOTVkM2I3ZiI7Cgov KiBSZXR1cm4gYSBzdGF0aWMgc3RyaW5nIGRlc2NyaWJpbmcgYSBjbGFzcyAoTm90ZTogbm90 IHJlZW50cmFudCkuICAqLwpjaGFyICoKY2hhcmNsYXNzX2Rlc2NyaWJlIChjaGFyY2xhc3Nf dCBjb25zdCAqY2NsKQp7CiAgLyogRGVmaW5lIGEgc3RhdGljIGJ1ZmZlciB0byBob2xkIHRo ZSBjaGFyY2xhc3MgZGVzY3JpcHRpb24uICAqLwogIHN0YXRpYyBjaGFyIGJ1ZlszMiArIDkg KiBDSEFSQ0xBU1NfV09SRFNdOwogIGNoYXIgKnBfYnVmID0gYnVmOwogIGludCBpOwoKICBw X2J1ZiArPSBzcHJpbnRmIChwX2J1ZiwgIjB4JTA4bHg6IiwgKHVuc2lnbmVkIGxvbmcpIGNj bCk7CiAgZm9yIChpID0gMDsgaSA8IENIQVJDTEFTU19XT1JEUzsgaSArPSAyKQogICAgewog ICAgICBpbnQgaiA9IGNjbC0+bWVtYmVyc1tpXTsKICAgICAgKnBfYnVmKysgPSAnICc7CiAg ICAgICpwX2J1ZisrID0gZGlzcF9ueWJibGVbKGogPj4gIDApICYgMHgwZl07CiAgICAgICpw X2J1ZisrID0gZGlzcF9ueWJibGVbKGogPj4gIDQpICYgMHgwZl07CiAgICAgICpwX2J1Zisr ID0gZGlzcF9ueWJibGVbKGogPj4gIDgpICYgMHgwZl07CiAgICAgICpwX2J1ZisrID0gZGlz cF9ueWJibGVbKGogPj4gMTIpICYgMHgwZl07CiAgICAgICpwX2J1ZisrID0gZGlzcF9ueWJi bGVbKGogPj4gMTYpICYgMHgwZl07CiAgICAgICpwX2J1ZisrID0gZGlzcF9ueWJibGVbKGog Pj4gMjApICYgMHgwZl07CiAgICAgICpwX2J1ZisrID0gZGlzcF9ueWJibGVbKGogPj4gMjQp ICYgMHgwZl07CiAgICAgICpwX2J1ZisrID0gZGlzcF9ueWJibGVbKGogPj4gMjgpICYgMHgw Zl07CgogICAgICBqID0gY2NsLT5tZW1iZXJzW2kgKyAxXTsKICAgICAgKnBfYnVmKysgPSBk aXNwX255YmJsZVsoaiA+PiAgMCkgJiAweDBmXTsKICAgICAgKnBfYnVmKysgPSBkaXNwX255 YmJsZVsoaiA+PiAgNCkgJiAweDBmXTsKICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJsZVso aiA+PiAgOCkgJiAweDBmXTsKICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJsZVsoaiA+PiAx MikgJiAweDBmXTsKICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJsZVsoaiA+PiAxNikgJiAw eDBmXTsKICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJsZVsoaiA+PiAyMCkgJiAweDBmXTsK ICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJsZVsoaiA+PiAyNCkgJiAweDBmXTsKICAgICAg KnBfYnVmKysgPSBkaXNwX255YmJsZVsoaiA+PiAyOCkgJiAweDBmXTsKICAgIH0KICAqcF9i dWYrKyA9ICdcMCc7CiAgcmV0dXJuIGJ1ZjsKfQoKLyogc3RhdGljICovIHZvaWQKZGVidWdf cG9vbHMgKGNvbnN0IGNoYXIgKmxhYmVsLCBib29sIGNsYXNzX2NvbnRlbnRzKQp7CiAgcG9v bF9saXN0X2luZGV4X3QgcG9vbF9ucjsKICBzaXplX3QgY2xhc3NfbnI7CgogIHByaW50ZiAo IlxuUG9vbCAlcCBkZWJ1Zyglcyk6IFthbGxvYywgdXNlZDogJWxkICVsZF1cbiIsCiAgICAg ICAgICAodm9pZCAqKSBwb29sX2xpc3QsIGxhYmVsLAogICAgICAgICAgcG9vbF9saXN0X2Fs bG9jLCBwb29sX2xpc3RfdXNlZCk7CiAgZm9yIChwb29sX25yID0gMDsgcG9vbF9uciA8IHBv b2xfbGlzdF91c2VkOyBwb29sX25yKyspCiAgICB7CiAgICAgIHBvb2xfdCAqcG9vbCA9ICZw b29sX2xpc3RbcG9vbF9ucl07CiAgICAgIHByaW50ZiAoCiIgJTNsZDogZmlyc3RfaW5kZXgs IGFsbG9jLCB1c2VkLCBjbGFzc2VzOiAlNGxkICUzbHUgJTNsdSAlcFxuIiwKICAgICAgICAg ICAgICBwb29sX25yLCBwb29sLT5maXJzdF9pbmRleCwgcG9vbC0+YWxsb2MsIHBvb2wtPnVz ZWQsCiAgICAgICAgICAgICAgKHZvaWQgKikgcG9vbC0+Y2xhc3Nlcyk7CiAgICAgIHByaW50 ZiAoIiAgICAgY2xhc3Nfc3RhdGVzOiAiKTsKICAgICAgZm9yIChjbGFzc19uciA9IDA7IGNs YXNzX25yIDwgcG9vbC0+YWxsb2M7IGNsYXNzX25yKyspCiAgICAgICAgc3dpdGNoIChwb29s LT5jbGFzc19zdGF0ZVtjbGFzc19ucl0pIHsKICAgICAgICAgIGNhc2UgU1RBVEVfVU5VU0VE OiAgICBwdXRjaGFyICgnLicpOyBicmVhazsKICAgICAgICAgIGNhc2UgU1RBVEVfV09SS0lO RzogICBwdXRjaGFyICgndycpOyBicmVhazsKICAgICAgICAgIGNhc2UgU1RBVEVfQ09NUExF VEVEOiBwdXRjaGFyICgnQycpOyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IHByaW50ZiAo Ij8lMDJ4IiwgcG9vbC0+Y2xhc3Nfc3RhdGVbY2xhc3NfbnJdKTsKICAgICAgICB9CiAgICAg IHB1dGNoYXIgKCdcbicpOwogICAgfQoKICAvKiBJZiBjbGFzcyBjb250ZW50cyByZXF1ZXN0 ZWQsIHByaW50IHRoZW0gb3V0IGFzIHdlbGwuICAqLwogIGlmIChjbGFzc19jb250ZW50cykK ICAgIGZvciAocG9vbF9uciA9IDA7IHBvb2xfbnIgPCBwb29sX2xpc3RfdXNlZDsgcG9vbF9u cisrKQogICAgICB7CiAgICAgICAgcG9vbF90ICpwb29sID0gJnBvb2xfbGlzdFtwb29sX25y XTsKICAgICAgICBmb3IgKGNsYXNzX25yID0gMDsgY2xhc3NfbnIgPCBwb29sLT51c2VkOyBj bGFzc19ucisrKQogICAgICAgICAgcHJpbnRmICgiJXNcbiIsCiAgICAgICAgICAgICAgICAg IGNoYXJjbGFzc19kZXNjcmliZSAoJnBvb2wtPmNsYXNzZXNbY2xhc3NfbnJdKSk7CiAgICAg IH0KfQoKLyogI2VuZGlmICogREVCVUcgKi8KCnN0YXRpYyBwb29sX3QgKgphZGRfbmV3X3Bv b2wgKHZvaWQpCnsKICBwb29sX3QgKnByZXYsICpwb29sOwogIHNpemVfdCBwb29sX2NsYXNz X2FsbG9jOwogIGNoYXJjbGFzc190ICphbGxvY19tZW07CgogIC8qIElmIHRoZSBwb29scyBs aXN0IGlzIGZ1bGwsIHVzZSB4Mm5yZWFsbG9jIHRvIGV4cGFuZCBpdHMgc2l6ZS4gICovCiAg aWYgKHBvb2xfbGlzdF91c2VkID09IHBvb2xfbGlzdF9hbGxvYykKICAgICAgcG9vbF9saXN0 ID0geDJucmVhbGxvYyAocG9vbF9saXN0LCAmcG9vbF9saXN0X2FsbG9jLCBzaXplb2YgKHBv b2xfdCkpOwoKICAvKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBsYXN0IGNoYXJjbGFzcyBwb29s IGluIHRoZSAob2xkKSBsaXN0LgogICAgIFNjYWxlIHVwIHRoZSBzaXplIHNvIHRoYXQgbWFs bG9jIGFjdGl2aXR5IHdpbGwgZGVjcmVhc2UgYXMgdGhlCiAgICAgbnVtYmVyIG9mIHBvb2xz IGluY3JlYXNlcy4gIEFsc28sIGFkZCAxIGhlcmUgYXMgd2Uga25vY2sgb2ZmIDEKICAgICB0 byB1c2UgYXMgYSBndXR0ZXIgbGF0ZXIuICAqLwogIHByZXYgPSAmcG9vbF9saXN0W3Bvb2xf bGlzdF91c2VkIC0gMV07CiAgcG9vbF9jbGFzc19hbGxvYyA9IChwcmV2LT5hbGxvYyAqIDUg LyAyKSArIDE7CiAgYWxsb2NfbWVtID0gWE5NQUxMT0MgKHBvb2xfY2xhc3NfYWxsb2MsIGNo YXJjbGFzc190KTsKCiAgLyogQWRkIHRoZSBuZXcgcG9vbCBtZW1vcnkgdG8gdGhlIHBvb2wg bGlzdC4gICovCiAgcG9vbCA9ICZwb29sX2xpc3RbcG9vbF9saXN0X3VzZWQrK107CgogIC8q IEltbWVkaWF0ZWx5IHNldCB1cCB0b3AgYW5kIGJvdHRvbSBjb250ZXh0IGNhbmFyeS9mZW5j ZXMuICAqLwogIHBvb2wtPnBvb2xfdG9wX2ZlbmNlX21hZ2ljX25yICAgID0gUE9PTF9UT1Bf RkVOQ0VfTUFHSUNfTlI7CiAgcG9vbC0+cG9vbF9ib3R0b21fZmVuY2VfbWFnaWNfbnIgPSBQ T09MX0JPVFRPTV9GRU5DRV9NQUdJQ19OUjsKCiAgLyogQWNxdWlyZSBjbGFzcyBtZW1vcnks IGluY2x1ZGluZyBzaGlmdGluZyB0aGUgYWxsb2MgcG9pbnRlciB0bwogICAgIGNyZWF0ZSB0 aGUgZ3V0dGVyIHByZWNlZGluZyB0aGUgZmlyc3QgY2xhc3Mgb2YgdGhlIHBvb2wuICAqLwog IHBvb2wtPmNsYXNzZXMgPSBhbGxvY19tZW0gKyAxOwogIHBvb2wtPmZpcnN0X2luZGV4ID0g cHJldi0+Zmlyc3RfaW5kZXggKyBwcmV2LT5hbGxvYzsKICBwb29sLT5hbGxvYyA9IHBvb2xf Y2xhc3NfYWxsb2MgLSAxOwogIHBvb2wtPnVzZWQgPSAwOwogIHBvb2wtPmNsYXNzX3N0YXRl ID0geHphbGxvYyAocG9vbC0+YWxsb2MpOwoKICBDSEVDS19QT09MIChwb29sKTsKCiAgcmV0 dXJuIHBvb2w7Cn0KCmNoYXJjbGFzc190ICoKY2hhcmNsYXNzX2FsbG9jICh2b2lkKQp7CiAg cG9vbF9saXN0X2luZGV4X3QgcG9vbF9ucjsKICBjaGFyY2xhc3NfdCAqY2xhc3M7CiAgcG9v bF90ICpwb29sID0gTlVMTDsKICBzaXplX3QgY2xhc3NfbnI7CiAgc2l6ZV90IGNsYXNzX2xh c3RfbnI7CiAgY2hhcmNsYXNzX3dvcmQgKmd1dHRlcl9wcmVjZWRpbmc7CgogIC8qIExvY2F0 ZSBhIHBvb2wgd2l0aCB1bnVzZWQgZW50cmllcyAoaWYgYW55KS4gICovCiAgZm9yIChwb29s X25yID0gMDsgcG9vbF9uciA8IHBvb2xfbGlzdF91c2VkOyBwb29sX25yKyspCiAgICB7CiAg ICAgIHBvb2wgPSAmcG9vbF9saXN0W3Bvb2xfbnJdOwoKICAgICAgLyogVHJ5IHVzZSB0aGUg ZWFybGllc3QgcG9vbCBwb3NzaWJsZSwgZmlyc3QgYnkgZmlsbGluZyBpbiBhCiAgICAgICAg IGhvbGUgZnJvbSBhIHdpdGhkcmF3biBjbGFzcywgb3IgYnkgZ3JhYmJpbmcgYW4gdW51c2Vk IGNsYXNzCiAgICAgICAgIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCiAgICAgIGNs YXNzX2xhc3RfbnIgPSBNSU4gKHBvb2wtPnVzZWQgKyAxLCBwb29sLT5hbGxvYyk7CiAgICAg IGZvciAoY2xhc3NfbnIgPSAwOyBjbGFzc19uciA8IGNsYXNzX2xhc3RfbnI7IGNsYXNzX25y KyspCiAgICAgICB7CiAgICAgICAgICBpZiAocG9vbC0+Y2xhc3Nfc3RhdGVbY2xhc3NfbnJd ID09IFNUQVRFX1VOVVNFRCkKICAgICAgICAgICAgZ290byBmb3VuZF9wb29sX2FuZF9jbGFz czsKICAgICAgIH0KICAgIH0KCiAgLyogTm8gc3BhY2UgZm91bmQsIHNvIHByZXBhcmUgYSBu ZXcgcG9vbCBhbmQgbWFrZSB0aGlzIGNsYXNzIGl0cwogICAgIGZpcnN0IGVsZW1lbnQuICAq LwogIHBvb2wgPSBhZGRfbmV3X3Bvb2wgKCk7CiAgY2xhc3NfbnIgPSAwOwogIC8qIEZBTExU SFJPVUdIICovCgpmb3VuZF9wb29sX2FuZF9jbGFzczoKICAvKiBNYXJrIHRoZSBmb3VuZCBj bGFzcyBzdGF0ZSBhcyB3b3JraW5nLCB6ZXJvIGl0cyBlbGVtZW50cywgYW5kCiAgICAgcmV0 dXJuIGNsYXNzIHBvaW50ZXIgdG8gY2FsbGVyLiAgWmVyb2luZyBpcyBuZWVkZWQgYXMgdGhp cwogICAgIGNsYXNzIG1heSBoYXZlIGJlZW4gcHJldmlvdXNseSB3b3JrZWQgb24sIGJ1dCB0 aGVuIGFiYW5kb25lZCBvcgogICAgIHdpdGhkcmF3bi4gICovCiAgcG9vbC0+Y2xhc3Nfc3Rh dGVbY2xhc3NfbnJdID0gU1RBVEVfV09SS0lORzsKICBpZiAoY2xhc3NfbnIgPj0gcG9vbC0+ dXNlZCkKICAgIHBvb2wtPnVzZWQgPSBjbGFzc19uciArIDE7CiAgY2xhc3MgPSAmcG9vbC0+ Y2xhc3Nlc1tjbGFzc19ucl07CgogIC8qIFplcm8gb3V0IHRoZSBjbGFzcycgbWVtYmVycywg YW5kIGFsc28gdGhlIGd1dHRlcnMgb24gZWFjaAogICAgIHNpZGUuICAqLwogIG1lbXNldCAo Y2xhc3MsIDAsIHNpemVvZiAoKmNsYXNzKSk7CiAgZ3V0dGVyX3ByZWNlZGluZyA9ICgoY2hh cmNsYXNzX3dvcmQgKikgY2xhc3MpIC0gMTsKICAqZ3V0dGVyX3ByZWNlZGluZyA9IDA7Cgog IHJldHVybiBjbGFzczsKfQoKcG9vbF90ICogX0dMX0FUVFJJQlVURV9QVVJFCmZpbmRfY2xh c3NfcG9vbCAoY2hhcmNsYXNzX3QgY29uc3QgKmNjbCkKewogIHBvb2xfbGlzdF9pbmRleF90 IHBvb2xfbnI7CiAgcG9vbF90ICpwb29sID0gTlVMTDsKICBwdHJkaWZmX3QgY2xhc3NfcHRy X29mZnNldDsKCiAgLyogTG9jYXRlIHRoZSBwb29sIHdob3NlIG1lbW9yeSBhZGRyZXNzIHNw YWNlIGNvdmVycyB0aGlzIGNsYXNzLiAgKi8KICAvKiA/PyBQZXJoYXBzIGNoZWNrICZwb29s LT5jbGFzc2VzW3Bvb2wtPmFsbG9jXSBpbiB0aGlzIGZpcnN0CiAgICAgbG9vcCwgYW5kIHRo ZW4gY2hlY2sgdGhhdCB0aGUgaW5kZXggaXMgaW4gdGhlICJ1c2VkIiBwb3J0aW9uCiAgICAg bGF0ZXIsIHNvIHdlIGNhbiBkaWFnbm9zZSBtYWxmb3JtZWQgcG9pbnRlcnMgbW9yZSBleGFj dGx5LiAgKi8KICBmb3IgKHBvb2xfbnIgPSAwOyBwb29sX25yIDwgcG9vbF9saXN0X3VzZWQ7 IHBvb2xfbnIrKykKICAgIHsKICAgICAgcG9vbCA9ICZwb29sX2xpc3RbcG9vbF9ucl07CiAg ICAgIGlmICgocG9vbC0+Y2xhc3NlcyA8PSBjY2wpICYmIChjY2wgPCAmcG9vbC0+Y2xhc3Nl c1twb29sLT5hbGxvY10pKQogICAgICAgIGdvdG8gZm91bmRfcG9vbDsKICAgIH0KCiAgLyog Tm8gY3JlZGlibGUgcG9vbCBjYW5kaWRhdGUgd2FzIGZvdW5kLiAgKi8KICBhc3NlcnQgKCEg ImZpbmRfY2xhc3NfcG9vbDogbm8gcG9vbCBmb3VuZCIpOwogIHJldHVybiBOVUxMOwoKZm91 bmRfcG9vbDoKICAvKiBNYWtlIHN1cmUgdGhlIGNsYXNzIGNsZWFybHkgbGllcyBvbiBhbiBh cnJheSBib3VuZGFyeSB3aXRoaW4KICAgICB0aGUgcG9vbCdzIG1lbW9yeSBhbGxvY2F0aW9u LiAgKi8KICBjbGFzc19wdHJfb2Zmc2V0ID0gKGNoYXIgKikgY2NsIC0gKGNoYXIgKikgcG9v bC0+Y2xhc3NlczsKICBpZiAoKGNsYXNzX3B0cl9vZmZzZXQgJSBzaXplb2YgKGNoYXJjbGFz c190KSkgIT0gMCkKICAgIHsKICAgICAgLyogUG9pbnRlciBkb2VzIG5vdCBsaWUgYXQgdGhl IHN0YXJ0IG9mIGEgcG9vbCBtZW1iZXIuICAqLwogICAgICBhc3NlcnQgKCEgImZpbmRfY2xh c3NfcG9vbDogcG9pbnRlciBub3QgYWxpZ25lZC4iKTsKICAgICAgcmV0dXJuIE5VTEw7CiAg ICB9CgogIHJldHVybiBwb29sOwp9CgpzdGF0aWMgdm9pZAp3aXRoZHJhd19jbGFzcyAoY2hh cmNsYXNzX3QgKmNjbCwgcG9vbF90ICpjbGFzc19wb29sKQp7CiAgcG9vbF90ICpwb29sOwog IHNpemVfdCBjbGFzc19ucjsKICBpbnQgKmd1dHRlcl9wcmVjZWRpbmc7CgogIC8qIFVzZSBw b29sIHJlZmVyZW5jZSBpZiBnaXZlbiwgb3RoZXJ3aXNlIHdvcmsgYmFjayBmcm9tIHRoZSBj bGFzcwogICAgIHBvaW50ZXIgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCBwb29sLiAgKi8KICBw b29sID0gKGNsYXNzX3Bvb2wgIT0gTlVMTCkgPyBjbGFzc19wb29sIDogZmluZF9jbGFzc19w b29sIChjY2wpOwoKICBpZiAocG9vbCA9PSBOVUxMKQogICAgYXNzZXJ0ICghICJDb3VsZCBu b3QgbG9jYXRlIGEgcG9vbCBmb3IgdGhpcyBjaGFyY2xhc3MiKTsKCiAgQ0hFQ0tfUE9PTCAo cG9vbCk7CgogIC8qIFplcm8gb3V0IHRoZSBndXR0ZXJzIGVhY2ggc2lkZSBvZiB0aGUgY2xh c3MuICAqLwogIGNjbC0+Z3V0dGVyX2ZvbGxvd2luZyA9IDA7CiAgZ3V0dGVyX3ByZWNlZGlu ZyA9ICgoaW50ICopIGNjbCkgLSAxOwogICpndXR0ZXJfcHJlY2VkaW5nID0gMDsKCiAgLyog V29yayBvdXQgdGhlIGNsYXNzIGluZGV4IGluIHRoZSBwb29sLiAgKi8KICBjbGFzc19uciA9 IGNjbCAtIHBvb2wtPmNsYXNzZXM7CiAgcG9vbC0+Y2xhc3Nfc3RhdGVbY2xhc3NfbnJdID0g U1RBVEVfVU5VU0VEOwoKICAvKiBJcyB0aGlzIHRoZSBsYXN0IGl0ZW0gd2l0aGluIHRoZSBw b29sJ3MgY2xhc3MgbGlzdD8gKi8KICBpZiAoY2xhc3NfbnIgPT0gcG9vbC0+dXNlZCAtIDEp CiAgICB7CiAgICAgIC8qIFllcywgcmVkdWNlIHRoZSBwb29sIG1lbWJlciBjb3VudCBieSAx LiAgKi8KICAgICAgcG9vbC0+dXNlZC0tOwogICAgICByZXR1cm47CiAgICB9Cn0KCi8qIEZp bmlzaCBvZmYgY3JlYXRpbmcgYSBjbGFzcywgYW5kIHJlcG9ydCBhbiBpbmRleCB0aGF0IGNh biBiZSB1c2VkCiAgIHRvIHJlZmVyZW5jZSB0aGUgY2xhc3MuICAqLwpjaGFyY2xhc3NfaW5k ZXhfdApjaGFyY2xhc3NfY29tcGxldGVkIChjaGFyY2xhc3NfdCAqY2NsKQp7CiAgY2hhcmNs YXNzX3dvcmQgKmd1dHRlcl9wcmVjZWRpbmc7CiAgcG9vbF9saXN0X2luZGV4X3QgcG9vbF9u cjsKICBwb29sX3QgKnBvb2w7CiAgY2hhcmNsYXNzX3QgKmZvdW5kID0gTlVMTDsKICBzaXpl X3QgY2xhc3NfbnI7CiAgcG9vbF90ICpteV9wb29sID0gTlVMTDsKICBzaXplX3QgbXlfY2xh c3NfbnIgPSAwOwoKICAvKiBTZWFyY2ggYWxsIHBvb2xzIGZvciBhIGNvbXBsZXRlZCBjbGFz cyBtYXRjaGluZyB0aGlzIGNsYXNzLAogICAgIGFuZCwgaWYgZm91bmQsIHVzZSBpdCBpbiBw cmVmZXJlbmNlIHRvIHRoZSBuZXcgb25lLiAgV2hpbGUKICAgICBzZWFyY2hpbmcsIGFsc28g cmVjb3JkIHdoZXJlIHRoZSB3b3JrIGNsYXNzIGlzIGxvY2F0ZWQuICBJZiB3ZQogICAgIGNh bid0IGZpbmQgb3Vyc2VsdmVzLCB0aGUgcG9pbnRlciBpcyBpbnZhbGlkLCBhbmQgc28gdGhy b3cgYW4KICAgICBhc3NlcnRpb24uICAgKi8KICBmb3IgKHBvb2xfbnIgPSAwOyBwb29sX25y IDwgcG9vbF9saXN0X3VzZWQ7IHBvb2xfbnIrKykKICAgIHsKICAgICAgcG9vbCA9ICZwb29s X2xpc3RbcG9vbF9ucl07CiAgICAgIGZvciAoY2xhc3NfbnIgPSAwOyBjbGFzc19uciA8IHBv b2wtPnVzZWQ7IGNsYXNzX25yKyspCiAgICAgICAgewogICAgICAgICAgY2hhcmNsYXNzX3Qg KnNlYXJjaCA9ICZwb29sLT5jbGFzc2VzW2NsYXNzX25yXTsKICAgICAgICAgIC8qIEhhdmUg d2UgZm91bmQgb3Vyc2VsdmVzIGluIHRoZSBsaXN0PyAqLwogICAgICAgICAgaWYgKHNlYXJj aCA9PSBjY2wpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBZZXMsIHJlbWVtYmVy IHRoaXMgcGxhY2UgaW4gY2FzZSBubyBkdXBsaWNhdGUgaXMKICAgICAgICAgICAgICAgICBm b3VuZC4gICovCiAgICAgICAgICAgICAgbXlfcG9vbCA9IHBvb2w7CiAgICAgICAgICAgICAg bXlfY2xhc3NfbnIgPSBjbGFzc19ucjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwb29s LT5jbGFzc19zdGF0ZVtjbGFzc19ucl0gIT0gU1RBVEVfQ09NUExFVEVEKQogICAgICAgICAg ICBjb250aW51ZTsKICAgICAgICAgIGlmIChjaGFyY2xhc3NfZXF1YWwgKHNlYXJjaCwgY2Ns KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIEFub3RoZXIgY2xhc3MsIGNvbXBs ZXRlZCwgbWF0Y2hlczogIFVzZSBpdCBpbgogICAgICAgICAgICAgICAgIHByZWZlcmVuY2Ug dG8gcG90ZW50aWFsbHkgY3JlYXRpbmcgYSBkdXBsaWNhdGUuICAqLwogICAgICAgICAgICAg IHdpdGhkcmF3X2NsYXNzIChjY2wsIG15X3Bvb2wpOwogICAgICAgICAgICAgIGZvdW5kID0g c2VhcmNoOwogICAgICAgICAgICAgIGdvdG8gZm91bmRfbWF0Y2hpbmdfY2xhc3M7CiAgICAg ICAgICAgIH0KICAgICAgICB9CiAgICB9CgogIC8qIE5vIGR1cGxpY2F0ZSBmb3VuZC4uLiBi dXQgbWFrZSBzdXJlIHRoZSBzZWFyY2ggcG9pbnRlciBpcwogICAgIGtub3duLiAqLwogIGFz c2VydCAobXlfcG9vbCAhPSBOVUxMKTsKICBhc3NlcnQgKG15X3Bvb2wtPmNsYXNzX3N0YXRl W215X2NsYXNzX25yXSA9PSBTVEFURV9XT1JLSU5HKTsKCiAgLyogUHJlcGFyZSB0byBjb252 ZXJ0IHRoZSBzZWFyY2ggKHdvcmspIGNsYXNzIGludG8gYSBjb21wbGV0ZWQKICAgICBjbGFz cy4gICovCiAgcG9vbCA9IG15X3Bvb2w7CiAgY2xhc3NfbnIgPSBteV9jbGFzc19ucjsKICBm b3VuZCA9ICZwb29sLT5jbGFzc2VzW2NsYXNzX25yXTsKICAvKiBGQUxMVEhST1VHSCAqLwoK Zm91bmRfbWF0Y2hpbmdfY2xhc3M6CiAgLyogQ2xlYXIgb3V0IHRoZSBndXR0ZXIgaW50ZWdl cnMgZWFjaCBzaWRlIG9mIHRoZSBjbGFzcyBlbnRyeS4gICovCiAgZ3V0dGVyX3ByZWNlZGlu ZyA9IGZvdW5kLT5tZW1iZXJzIC0gMTsKICAqZ3V0dGVyX3ByZWNlZGluZyA9IDA7CiAgZm91 bmQtPmd1dHRlcl9mb2xsb3dpbmcgPSAwOwogIHBvb2wtPmNsYXNzX3N0YXRlW2NsYXNzX25y XSA9IFNUQVRFX0NPTVBMRVRFRDsKCiAgLyogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY2xh c3MuICAqLwogIHJldHVybiBwb29sLT5maXJzdF9pbmRleCArIGNsYXNzX25yOwp9Cgp2b2lk CmNoYXJjbGFzc19hYmFuZG9uIChjaGFyY2xhc3NfdCAqY2NsKQp7CiAgd2l0aGRyYXdfY2xh c3MgKGNjbCwgTlVMTCk7Cn0KCi8qIEFkZGl0aW9uYWwgZnVuY3Rpb25zIHRvIGhlbHAgY2xp ZW50cyB3b3JrIHdpdGggY2xhc3Nlcy4gICovCgpjaGFyY2xhc3NfdCAqIF9HTF9BVFRSSUJV VEVfUFVSRQpjaGFyY2xhc3NfZ2V0X3BvaW50ZXIgKGNoYXJjbGFzc19pbmRleF90IGNvbnN0 IGluZGV4KQp7CiAgcG9vbF9saXN0X2luZGV4X3QgcG9vbF9ucjsKICBwb29sX3QgKnBvb2w7 CgogIC8qIERvZXMgdGhpcyBjbGFzcyBtYXRjaCBhbnkgY2xhc3Mgd2UndmUgc2VlbiBwcmV2 aW91c2x5PyAqLwogIGZvciAocG9vbF9uciA9IDA7IHBvb2xfbnIgPCBwb29sX2xpc3RfdXNl ZDsgcG9vbF9ucisrKQogICAgewogICAgICAvKiBJcyB0aGUgaW5kZXggaW5zaWRlIHRoaXMg cG9vbD8gKi8KICAgICAgcG9vbCA9ICZwb29sX2xpc3RbcG9vbF9ucl07CiAgICAgIGlmIChw b29sLT5maXJzdF9pbmRleCA8PSBpbmRleAogICAgICAgICAgICAgICYmIGluZGV4IDwgKHBv b2wtPmZpcnN0X2luZGV4ICsgcG9vbC0+dXNlZCkpCiAgICAgICAgewogICAgICAgICAgLyog WWVzLCBmaW5kIHRoZSBwb2ludGVyIHdpdGhpbiB0aGUgcG9vbCBhbmQgcmV0dXJuCiAgICAg ICAgICAgICBpdC4gICovCiAgICAgICAgICByZXR1cm4gJnBvb2wtPmNsYXNzZXNbaW5kZXgg LSBwb29sLT5maXJzdF9pbmRleF07CiAgICAgICAgfQogICAgfQoKICAvKiBUaGUgbWFwcGlu ZyBhYm92ZSBzaG91bGQgbmV2ZXIgZmFpbDsgd2UgY291bGQgcmV0dXJuIE5VTEwsIGJ1dAog ICAgIHdlIGNob29zZSB0byBhYm9ydCBpbnN0ZWFkLiAgKi8KICBhc3NlcnQgKCEiaW5kZXgt dG8tY2hhcmNsYXNzIG1hcHBpbmcgZmFpbGVkIik7CiAgcmV0dXJuIE5VTEw7Cn0KCmNoYXJj bGFzc19pbmRleF90IF9HTF9BVFRSSUJVVEVfUFVSRQpjaGFyY2xhc3NfZ2V0X2luZGV4IChj aGFyY2xhc3NfdCBjb25zdCAqY2NsKQp7CiAgcG9vbF90ICpwb29sOwoKICAvKiBUaGlzIGNv ZGUgaXMgc2ltaWxhciB0byBjaGFyY2xhc3NfY29tcGxldGVkLi4uIHBlcmhhcHMKICAgICBt ZXJnZT8gICovCiAgcG9vbCA9IGZpbmRfY2xhc3NfcG9vbCAoY2NsKTsKICBpZiAocG9vbCA9 PSBOVUxMKQogICAgcmV0dXJuIC0xOwoKICAvKiBSZXBvcnQgdGhlIGluZGV4IHRvIHRoZSBj YWxsZXIuICAqLwogIHJldHVybiBwb29sLT5maXJzdF9pbmRleCArIChjY2wgLSBwb29sLT5j bGFzc2VzKTsKfQoKLyogRnVuY3Rpb25zIHRvIGluaXRpYWxpc2UgbW9kdWxlIG9uIHN0YXJ0 dXAsIGFuZCB0byBzaHV0IGRvd24gYW5kCiAgIHJlbGVhc2UgYWNxdWlyZWQgcmVzb3VyY2Vz IGF0IGV4aXQuICAqLwoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbImNoYXJjbGFzcy1k ZXN0cm95LW1vZHVsZSJdLCBbWwp7CiAgcG9vbF90ICpsb2NhbF9saXN0OwogIGludCBpOwog IGNoYXJjbGFzc190ICphbGxvY19tZW07CgogIC8qIE1vdmUgdGhlIGdsb2JhbCBsaXN0IGhl YWQgaW50byBhIGxvY2FsIHZhcmlhYmxlLCBhbmQKICAgICBpbW1lZGlhdGVseSBjbGVhciB0 aGUgZ2xvYmFsLiAgVGhpcyBpcyBhIGhhbGYtaGVhcnRlZCBhdHRlbXB0CiAgICAgdG8gYXZv aWQgcmFjZSBjb25kaXRpb25zOyB0byBkbyB0aGluZ3MgcHJvcGVybHksIGEKICAgICBzeXN0 ZW0td2lkZSBhdG9taWMgb3BlcmF0aW9uIChsb2NrZWQsIGluY2x1ZGluZyBtdWx0aS1DUFUg Y2FjaGUKICAgICBjb2hlcmVuY3kpIG9wZXJhdGlvbiBzaG91bGQgYmUgdXNlZC4gICovCiAg bG9jYWxfbGlzdCA9IHBvb2xfbGlzdDsKICBwb29sX2xpc3QgPSBOVUxMOwoKICAvKiBJZiB0 aGUgbGlzdCBpcyBhbHJlYWR5IGVtcHR5LCBmaW5pc2ggbm93LiAgKi8KICBpZiAoISBsb2Nh bF9saXN0KQogICAgcmV0dXJuOwoKICAvKiBEaXNjYXJkIHRoZSBjaGFyY2xhc3MgbWVtb3J5 IGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBvb2wsCiAgICAgaW5jbHVkaW5nIGNhdGVyaW5nIGZv ciB0aGUgb2Zmc2V0IHVzZWQgdXBvbiBjcmVhdGlvbi4gICovCiAgZm9yIChpID0gMDsgaSA8 IHBvb2xfbGlzdF91c2VkOyBpKyspCiAgICB7CiAgICAgIHBvb2xfdCAqcG9vbDsKCiAgICAg IHBvb2wgPSAmbG9jYWxfbGlzdFtpXTsKCiAgICAgIC8qIFdlIHNraXBwZWQgYW4gaW5pdGlh bCBjbGFzcyBhZnRlciBhbGxvY2F0aW9uLCBpbiBvcmRlciB0bwogICAgICAgICBnaXZlIHRo ZSBmaXJzdCBjbGFzcyBpbiB0aGUgcG9vbCBhIGd1dHRlciwgc28gdW5kbyB0aGUKICAgICAg ICAgb2Zmc2V0IGhlcmUgd2hlbiBmcmVlaW5nLiAgKi8KICAgICAgYWxsb2NfbWVtID0gcG9v bC0+Y2xhc3NlczsKICAgICAgZnJlZSAoYWxsb2NfbWVtIC0gMSk7CgogICAgICAvKiBBbHNv IGZyZWUgdXAgdGhlIGNsYXNzX3N0YXRlIG1lbW9yeS4gICovCiAgICAgIGZyZWUgKHBvb2wt PmNsYXNzX3N0YXRlKTsKCiAgICAgIC8qIERlc3Ryb3kgdGhlIHRvcCAmIGJvdHRvbSBmZW5j ZXMgb2YgdGhpcyBwb29sIHNvIHRoYXQgc29tZQogICAgICAgICBtb3JlIGJ1ZyBjYXNlcyAo ZS5nLiByZXVzZS1hZnRlci1mcmVlKSBhcmUgdmlzaWJsZS4gICovCiAgICAgIHBvb2wtPnBv b2xfdG9wX2ZlbmNlX21hZ2ljX25yICs9IDB4NWE1YTVhNWF1TDsKICAgICAgcG9vbC0+cG9v bF9ib3R0b21fZmVuY2VfbWFnaWNfbnIgKz0gMHg1YTVhNWE1YXVMOwogICAgfQoKCiAgLyog RmluYWxseSwgZnJlZSB1cCB0aGUgcG9vbCBsaXN0IGl0c2VsZi4gICovCiAgZnJlZSAobG9j YWxfbGlzdCk7CiAgcG9vbF9saXN0X3VzZWQgPSAwOwp9CgpdXSkpCgphc3NlcnQoZjp3cml0 ZShEZWNsc1siY2hhcmNsYXNzLWluaXRpYWxpc2UiXSkpCmFzc2VydChmOndyaXRlKFtbCnsK ICBzaXplX3QgaW5pdGlhbF9hbGxvYzsKICBjaGFyY2xhc3NfdCAqYWxsb2NfbWVtOwogIHBv b2xfdCAqcG9vbDsKICBjaGFyY2xhc3NfdCAqY2NsOwogIGNoYXJjbGFzc19pbmRleF90IHpl cm9jbGFzc19pbmRleDsKCiAgLyogVXN1YWxseSAoZ251bGliIGFzc3VtcHRpb24/KSBFT0Yg PSBXRU9GID0gLTEsIGJ1dCB0aGUgc3RhbmRhcmQKICAgICBtZXJlbHkgc3RhdGVzIHRoYXQg RU9GIG11c3QgYmUgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBub3QKICAgICBuZWNlc3NhcmlseSAt MTsgZnVydGhlcm1vcmUsIHRoZSBkZWZpbml0aW9uIGZvciAoSVNPIEM5MCkgV0VPRgogICAg IHN0YXRlcyB0aGF0IGl0IG5lZWQgbm90IGJlIG5lZ2F0aXZlIGF0IGFsbCwgbGV0IGFsb25l CiAgICAgZ3VhcmFudGVlZCB0byBiZSAtMS4KCiAgICAgSW4gdGhpcyBkZW1vbnN0cmF0aW9u L3Byb3RvdHlwZSBjb2RlLCB3ZSBkZW1hbmQgdGhhdCBib3RoIEVPRgogICAgIGFuZCBXRU9G IGJlIC0xLCBhcyB0aGlzIHZhbHVlIG1ha2VzIHRoZSBndXR0ZXJzIHdvcnRod2hpbGU6CiAg ICAgVGhlIHVzZXIgY2FuIGJlIHJlbGlldmVkIG9mIHNvbWUgZWRnZSBjYXNlIHByb2Nlc3Np bmcgaWYgLTEgaXMKICAgICB0aHJvd24gbmVhdGx5IGludG8gdGhlIGd1dHRlciAuICAqLwog IGFzc2VydCAoRU9GID09IC0xKTsKICBhc3NlcnQgKFdFT0YgPT0gLTEpOwoKICAvKiBGaXJz dCwgc2V0IHVwIHRoZSBsaXN0LW9mLXBvb2xzIHN0cnVjdHVyZSB3aXRoIGluaXRpYWwKICAg ICBzdG9yYWdlLiAgKi8KICBwb29sX2xpc3RfYWxsb2MgPSA0OwogIHBvb2xfbGlzdCA9IChw b29sX3QgKikgeG5tYWxsb2MgKHBvb2xfbGlzdF9hbGxvYywgc2l6ZW9mIChwb29sX3QpKTsK CiAgLyogSWYgaW5pdGlhbCBwb29sIHNpemUgaXMgc21hbGwsIGluZmxhdGUgaXQgaGVyZSBh cyB3ZSBwcmVmZXIgdG8KICAgICB3YXN0ZSBhIGxpdHRsZSBtZW1vcnksIHJhdGhlciB0aGFu IGlzc3VlIG1hbnkgY2FsbHMgdG8KICAgICB4bWFsbG9jICgpLiAgVGhpcyBtaW5pbXVtIGFs c28gZW5zdXJlcyB0aGF0IG91ciBkb3VibGUtdXAgcG9vbAogICAgIHNpemUgc3RyYXRlZ3kg aGFzIGEgc2FuZSAocGVyaGFwcyBvdmVybHkgZ2VuZXJvdXM/KSBzdGFydGluZwogICAgIHBv aW50LiAgKi8KICBpbml0aWFsX2FsbG9jID0gTUFYIChpbml0aWFsX3Bvb2xfc2l6ZSwKICAg ICAgICAgICAgICAgICAgICAgICBQT09MX01JTklNVU1fSU5JVElBTF9TSVpFKTsKCiAgLyog U2V0IHVwIHRoZSBmaXJzdCBwb29sIHVzaW5nIG91ciBjaG9zZW4gZmlyc3QgYWxsb2Mgc2l6 ZS4KICAgICBBbGxvY2F0ZSBhbiBleHRyYSBjbGFzcywgYW5kIG9mZnNldCB0aGUgcG9vbCBi eSB0aGlzIGFtb3VudCwgaW4KICAgICBvcmRlciB0byBhY2NvbW1vZGF0ZSB0aGUgaW5pdGlh bCBndXR0ZXIgaW50ZWdlci4gIChOb3RlIGZvciB0aGUKICAgICBmdXR1cmU6ICBJZiBjaGFy Y2xhc3MgYWxpZ25tZW50IGJlY29tZXMgc2lnbmlmaWNhbnQsIHRoZW4KICAgICBzaXplb2Yg KGNoYXJjbGFzcykgYW5kIHRoaXMgb2Zmc2V0IG1heSBuZWVkIHRvIGJlIGNoYW5nZWQsCiAg ICAgcGVyaGFwcyBmb3IgU0lNRCBpbnN0cnVjdGlvbnMuKSAgKi8KICBwb29sX2xpc3RfdXNl ZCA9IDE7CiAgcG9vbCA9ICZwb29sX2xpc3RbMF07CiAgcG9vbC0+Zmlyc3RfaW5kZXggPSAw OwogIHBvb2wtPmFsbG9jID0gaW5pdGlhbF9hbGxvYzsKICBwb29sLT51c2VkID0gMDsKICBh bGxvY19tZW0gPSBYTk1BTExPQyAocG9vbC0+YWxsb2MgKyAxLCBjaGFyY2xhc3NfdCk7CiAg cG9vbC0+Y2xhc3NlcyA9IGFsbG9jX21lbSArIDE7CiAgcG9vbC0+Y2xhc3Nfc3RhdGUgPSB4 emFsbG9jIChwb29sLT5hbGxvYyk7CgogIC8qIEltbWVkaWF0ZWx5IHNldCB1cCB0b3AgYW5k IGJvdHRvbSBjb250ZXh0IGNhbmFyeS9mZW5jZXMgZm9yCiAgICAgdGhlIGFsd2F5cy1hbGxv Y2F0ZWQgZmlyc3QgcG9vbCBpbiB0aGUgaW5pdGlhbCBsaXN0LiAgKi8KICBwb29sLT5wb29s X3RvcF9mZW5jZV9tYWdpY19uciAgICA9IFBPT0xfVE9QX0ZFTkNFX01BR0lDX05SOwogIHBv b2wtPnBvb2xfYm90dG9tX2ZlbmNlX21hZ2ljX25yID0gUE9PTF9CT1RUT01fRkVOQ0VfTUFH SUNfTlI7CgogIC8qIEVuZm9yY2UgdGhlIGFsbC16ZXJvZXMgY2xhc3MgdG8gYmUgdGhlIGZp cnN0IGNsYXNzLiAgVGhpcyBpcwogICAgIG5lZWRlZCBhcyAiYWJhbmRvbiIgbWF5IGxlYXZl IGEgaG9sZSBpbiBhIHBvb2wgaW4gc29tZSBjYXNlcywKICAgICBhbmQgaW4gdGhlc2UgY2Fz ZXMgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBuby1vbmUgZWxzZSBwaWNrcyBpdAogICAgIHVw IGJ5IGFjY2lkZW50IChhcyB0aGlzIHdvdWxkIGludmFsaWRhdGUgdGhlIGd1YXJhbnRlZSB0 aGF0IHRoZQogICAgIG1vZHVsZSBlbGltaW5hdGVzIGFsbCBkdXBsaWNhdGVzLCBmcm9tIHRo ZSBwb2ludCBvZiB2aWV3IG9mIHRoZQogICAgIHVzZXIpLiAgU28sIHdlIHNldCB0aGUgZmly c3QgY2xhc3MgdG8gYWxsLXplcm9lcywgYW5kIGFsc28gemVybwogICAgIG91dCBhYmFuZG9u ZWQgY2xhc3NlcyB3aGVyZSBhIGhvbGUgaXMgdW5hdm9pZGFibGUuICAqLwogIC8qIEFub3Ro ZXIgcmVhc29uIGZvciBjbGFzcyAwIHRvIGJlIGFuIGVtcHR5LXNldCBjbGFzcyBpcyB0aGF0 IHdlCiAgICAgZXhwbGljaXRseSBsZXQgY29uc3VtZXJzIGV4cGxvaXQgdGhpcyBwcm9wZXJ0 eSBpbiB0aGVpciBjb2RlLAogICAgIHNpbXBsaWZ5aW5nIHRoZWlyIG9wZXJhdGlvbnMgaW4g c29tZSBzaXR1YXRpb25zLiAgKi8KICBjY2wgPSBjaGFyY2xhc3NfYWxsb2MgKCk7IC8qIEFs bG9jIHByb3ZpZGVzIGFuIGFsbC16ZXJvZXMgY2xhc3MuICAqLwogIHplcm9jbGFzc19pbmRl eCA9IGNoYXJjbGFzc19jb21wbGV0ZWQgKGNjbCk7CiAgYXNzZXJ0ICh6ZXJvY2xhc3NfaW5k ZXggPT0gQ0hBUkNMQVNTX1pFUk9DTEFTU19JTkRFWCk7CgogIC8qIENoZWNrIHRoYXQgdGhl IGluaXRpYWwgcG9vbCBzdGlsbCBwYXNzZXMgdGhlIHNpbXBsZSBzYW5pdHkKICAgICBjaGVj ayAoaXQgbWlnaHQgaGF2ZSBiZWVuIGNvbXByb21pc2VkIHNpbmNlIHRoZSBzZW50aW5lbHMg d2VyZQogICAgIHNldCB1cCwgYWx0aG91Z2ggc3VjaCBhIGJ1ZyBhbmQvb3IgZXh0ZXJuYWwg aW50ZXJmZXJlbmNlIGlzCiAgICAgdmVyeSB1bmxpa2VseS4gICovCiAgLyogPz8gTm90ZSBm b3IgdGhlIHB1cmlzdHM6ICBJZiB3ZSB3YW50ZWQgdG8gZ2V0IG1vcmUgdGl0Y2h5IGFib3V0 CiAgICAgZGF0YSBzdHJ1Y3R1cmVzLCB0aGUgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIGFkZCBh IGNoZWNrc3VtIChlLmcuCiAgICAgdGhlIENhc3RhZ25vbGkgQ1JDLTMyKSBvZiB0aGUgZW50 aXJlIHN0cnVjdHVyZSdzIGNvbnRlbnRzLCBhbmQKICAgICBpbmNsdWRlIGEgY2hlY2sgdGhh dCB0aGUgY2hlY2tzdW0gaXMgaW50YWN0IGluIHRoZSBDSEVDS19QT09MCiAgICAgbWFjcm8u ICBTdGlsbCBub3QgcGVyZmVjdCwgYnV0IGFuIGltcHJvdmVtZW50Li4uIGJ1dCBub3QKICAg ICBpbXBsZW1lbnRlZCBhdCBwcmVzZW50LiAgICovCiAgQ0hFQ0tfUE9PTCAocG9vbCk7Cgog IC8qIEZpbmFsbHksIHVzZSBhdGV4aXQgKCkgdG8gYXJyYW5nZSBmb3IgbW9kdWxlIGNsZWFu dXAgb24gZXhpdC4gICovCiAgYXRleGl0IChjaGFyY2xhc3NfZGVzdHJveV9tb2R1bGUpOwp9 CgpdXSkpCgotLSBGaW5hbGx5LCBhZGQgdHJhaWxlciBsaW5lICh2aW0pCmFzc2VydChmOndy aXRlKFtbCi8qIHZpbTpzZXQgc2hpZnR3aWR0aD0yOiAqLwpdXSkpCgphc3NlcnQoZjpjbG9z ZSgpKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tLSBGU0FUb2tlblN1YnN0IC0tIFN1YnN0 aXR1dGUgYmFyZSB0b2tlbiBuYW1lcyB3aXRoIG1vZHVsZS1wcmVmaXhlZCBuYW1lcwotLSBL bm93bGVkZ2Ugb2YgdGhlIG9yaWdpbmFsIG5hbWUsIGFuZCBhbHNvIGFsbC1jYXBzIHZlcnN1 cyBhbGwtbG93ZXJjYXNlCi0tIHZhcmlhbnRzLCBhcmUgY29sbGVjdGVkIGhlcmUsIGFzIG11 bHRpcGxlIHBhcnRpZXMgd2FudCB0byBjb252ZXJ0Ci0tIHRva2VucyBpbiB0aGVpciB0ZXh0 LgotLSBAcGFybWV0ZXIgT3JpZ2luYWwgLS0gU291cmNlIGNvZGUgdG8gYmUgbW9kaWZpZWQK LS0gQHJldHVybiBDb2RlIHdpdGgga2V5d29yZHMvbmFtZXMgcXVhbGlmaWVkIHdpdGggYSBw cmVmaXggYXMgYXBwcm9wcmlhdGUKCmxvY2FsIGZ1bmN0aW9uIEZTQVRva2VuU3Vic3QoT3Jp Z2luYWwpCiAgIGxvY2FsIE1vZGlmaWVkID0gT3JpZ2luYWwKCiAgIC0tIEhhbmRsZSBtYWNy by91cHBlcmNhc2UgbmFtZXMgdGhhdCBhcmUgbm90IHRva2VucyAocHJlZml4IEZTQVRPS0VO XykKICAgZm9yIF8sIFVwcGVyY2FzZUtleXdvcmQgaW4gaXBhaXJzeyJOT1RDSEFSIn0gZG8K ICAgICAgbG9jYWwgU2VhcmNoID0gIiVmW18ld10iIC4uIFVwcGVyY2FzZUtleXdvcmQgLi4g IiVmWyVXXSIKICAgICAgbG9jYWwgUmVwbGFjZSA9ICJGU0FUT0tFTl8iIC4uIFVwcGVyY2Fz ZUtleXdvcmQKICAgICAgTW9kaWZpZWQgPSBNb2RpZmllZDpnc3ViKFNlYXJjaCwgUmVwbGFj ZSkKICAgZW5kCgogICAtLSBGaW5hbGx5LCBoYW5kbGUgdG9rZW4gdmFsdWVzIChwcmVmaXgg d2l0aCBGU0FUT0tFTl9US18pCiAgIGZvciBfLCBVcHBlcmNhc2VUb2tlbiBpbiBpcGFpcnN7 CiAgICAgICAgICAiRU5EIiwgIkVNUFRZIiwgIkJBQ0tSRUYiLCAiQkVHTElORSIsICJFTkRM SU5FIiwKICAgICAgICAgICJCRUdXT1JEIiwgIkVORFdPUkQiLCAiTElNV09SRCIsICJOT1RM SU1XT1JEIiwgIlFNQVJLIiwKICAgICAgICAgICJTVEFSIiwgIlBMVVMiLCAiUkVQTU4iLCAi Q0FUIiwgIk9SIiwgIkxQQVJFTiIsICJSUEFSRU4iLAogICAgICAgICAgIkFOWUNIQVIiLCAi TUJDU0VUIiwgIldDSEFSIiwgIkNTRVQifSBkbwogICAgICBsb2NhbCBTZWFyY2ggPSAiJWZb JXdfXSIgLi4gVXBwZXJjYXNlVG9rZW4gLi4gIiVmWyVXXSIKICAgICAgbG9jYWwgUmVwbGFj ZSA9ICJGU0FUT0tFTl9US18iIC4uIFVwcGVyY2FzZVRva2VuCiAgICAgIE1vZGlmaWVkID0g TW9kaWZpZWQ6Z3N1YihTZWFyY2gsIFJlcGxhY2UpCiAgIGVuZAoKICAgLS0gTm90ZTogV2Ug ZG8gbm90IHRyeSB0byBtYWludGFpbiBpbmRlbnRhdGlvbiBvZiBhbnkgY29tbWVudHMgYWZ0 ZXIKICAgLS0gdGhlIHN1YnN0aXR1dGVkIHRleHQuICBUaGlzIGlzIGJlY2F1c2UgdGhpcyBw cmVmaXhpbmcgaXMgKGF0IHByZXNlbnQpCiAgIC0tIGEgdGVtcG9yYXJ5IGhhY2sgdG8ga2Vl cCB0aGUgb3JpZ2luYWwgY29kZSdzIGFuZCBGU0FUb2tlbidzIGNvZGUKICAgLS0gbmFtZXNw YWNlcyBlbnRpcmVseSBzZXBhcmF0ZSwgc28gdGhhdCBib3RoIGNhbiBiZSBydW4gc2lkZS1i eS1zaWRlCiAgIC0tIGFuZCB0aGUgb3V0cHV0cyBjb21wYXJlZC4gIExhdGVyLCBpZi93aGVu IHRoZSB1bnRhbmdsZWQgY29kZSBpcwogICAtLSBjaG9zZW4gdG8gcmVwbGFjZSB0aGUgb3Jp Z2luYWwsIHRoZSBwcmVmaXhpbmcgY2FuIGJlIGVsaW1pbmF0ZWQsCiAgIC0tIGFuZC9vciB0 aGlzIGZ1bmN0aW9uIGNhbiBkbyBtb3JlIHRvIG1haW50YWluIGluZGVudGF0aW9uLgoKICAg cmV0dXJuIE1vZGlmaWVkCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tLS0tLS0tLS0t LS0tLS0qKioqKioqKiBmc2F0b2tlbi5oICoqKioqKioqLS0tLS0tLS0tLS0tLS0tLQoKcHJp bnQoIkNyZWF0aW5nIGZzYXRva2VuLmguLi4iKQpsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4o ImZzYXRva2VuLmgiLCAidyIpKQphc3NlcnQoZjp3cml0ZShbWwovKiBmc2F0b2tlbiAtIENy ZWF0ZSB0b2tlbnMgZm9yIGEgY29tcGFjdCwgY29oZXJlbnQgcmVndWxhciBleHByZXNzaW9u IGxhbmd1YWdlCgpdXSkpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkNvcHlyaWdodC5kZmFj IiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJMaWNlbnNlV2FycmFudHkuZGZh YyIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQXV0aG9ycy5kZmFjIikpKQph c3NlcnQoZjp3cml0ZShbWwoKLyogMjAxNDogUmVwYWNrYWdlZCBieSAidW50YW5nbGUiIHNj cmlwdCwgd3JpdHRlbiBieSBiZWhvZmZza2kuICAqLwoKLyogUmVndWxhciBleHByZXNzaW9u IHBhdHRlcm5zIGFyZSBwcmVzZW50ZWQgYXMgdGV4dCwgcG9zc2libHkgQVNDSUk7CiAgIHRo ZSBmb3JtYXQgaXMgdmVyeSBleHByZXNzaXZlLCBidXQgdGhpcyBjb21lcyBhdCB0aGUgY29z dCBvZiBiZWluZwogICBzb21ld2hhdCBleHBlbnNpdmUgdG8gaW50ZXJwcmV0IChpbmNsdWRp bmcgaWRlbnRpZnlpbmcgaW52YWxpZAogICBwYXR0ZXJucykuICBCeSB0b2tlbmlzaW5nIHRo ZSBwYXR0ZXJuLCB3ZSBtYWtlIGxpZmUgbXVjaCBlYXNpZXIgZm9yCiAgIHRoZSBwYXJzZXIg YW5kIG90aGVyIHNlYXJjaCBtYWNoaW5lcnkgdGhhdCBmb2xsb3dzLgoKICAgVGhpcyBmaWxl IGRlZmluZXMgdGhlIHRva2VucyB0aGF0IHdlIHVzZSwgYm90aCBmb3IgdGhlIGJlbmVmaXQg b2YKICAgdGhlIGxleGVyL3BhcnNlci9kZmEgYW5hbHlzZXIgdGhhdCBzaGFyZSB0aGlzIGlu Zm9ybWF0aW9uLCBhbmQgZm9yCiAgIG90aGVyIG1hY2hpbmVyeSAoc3VjaCBhcyB0aGUgQyBj b21waWxlcikgdGhhdCBtYXkgbmVlZCB0byBzdG9yZQogICBhbmQvb3IgbWFuaXB1bGF0ZSB0 aGVzZSBpdGVtcy4gICovCgpdXSkpCgotLSBBZGQgcHJlcHJvY2Vzc29yIGxpbmVzIHRvIG1h a2UgdGhpcyBoZWFkZXIgZmlsZSBpZGVtcG90ZW50Lgphc3NlcnQoZjp3cml0ZShbWwoKI2lm bmRlZiBGU0FUT0tFTl9ICiNkZWZpbmUgRlNBVE9LRU5fSCAxCgovKiBBbHdheXMgaW1wb3J0 IGVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaXRlbXMgZmlyc3QuICAqLwoj aW5jbHVkZSA8Y29uZmlnLmg+CgovKiBPYnRhaW4gZGVmbi4gb2YgcHRyZGlmZl90IGZyb20g c3RkZGVmLmgsIGFuZCBDSEFSX0JJVCBmcm9tIGxpbWl0cy5oICAqLwojaW5jbHVkZSA8bGlt aXRzLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KCi8qIEMgc3RyZWFtIG9jdGV0cywgYW5kIG5v bi1zdHJlYW0gRU9GLCBhcmUgc2VsZi1yZXByZXNlbnRpbmcgdG9rZW5zLgogICBXZSBuZWVk IHRvIGluY2x1ZGUgc3RkaW8uaCB0byBvYnRhaW4gdGhlIGRlZmluaXRpb24gb2YgRU9GLiAg Ki8KI2luY2x1ZGUgPHN0ZGlvLmg+CgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7 CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKXV0pKQoKLS0gV3JpdGUgb3V0IHRva2VuLXNw ZWNpZmljIGNvZGUgZXh0cmFjdGVkIGZyb20gZGZhLmMKLS0geHhSZW1vdmVkOiBhc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJDSEFSQklUUy1vY3RldHMiKSwgIlxuIikpCmFzc2VydChmOndy aXRlKEZTQVRva2VuU3Vic3QoUmF3VGV4dCgiTk9UQ0hBUiIpKSwgIlxuIikpCmFzc2VydChm OndyaXRlKEVkaXRlZFRleHQoIlJlZ2V4cFRva2VuVHlwZSIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAidHlwZWRlZiBwdHJkaWZmX3QgdG9rZW4iLAogICAgICAgICAgICAgICAgICAg ICAgICAgInR5cGVkZWYgcHRyZGlmZl90IGZzYXRva2VuX3Rva2VuX3QiKSwgIlxuIikpCmFz c2VydChmOndyaXRlKEZTQVRva2VuU3Vic3QoUmF3VGV4dCgiUHJlZGVmaW5lZFRva2VucyIp KSwgIlxuIikpCgotLSBEZWZpbmUgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHByb3ZpZGVk IGJ5IG1vZHVsZSBib2R5Lgphc3NlcnQoZjp3cml0ZShbWwoKLyogcHJ0b2sgLSBEaXNwbGF5 IHRva2VuIG5hbWUgKGZvciBkZWJ1Z2dpbmcpICovCiNpZmRlZiBERUJVRwpdXSkpCldyaXRl RXh0ZXJuRGVjbChmLCBEZWNsc1sicHJ0b2siXSkKYXNzZXJ0KGY6d3JpdGUoW1sKI2VuZGlm IC8qIERFQlVHICovCl1dKSkKCi0tIEZpbmFsbHksIGFkZCB0cmFpbGVyIGxpbmVzIChjKyss IGlkZW1wb3RlbmN5LCB2aW0pCmFzc2VydChmOndyaXRlKFtbCgojaWZkZWYgX19jcGx1c3Bs dXMKfQojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KCiNlbmRpZiAvKiBGU0FUT0tFTl9IICov CgovKiB2aW06c2V0IHNoaWZ0d2lkdGg9MjogKi8KXV0pKQoKYXNzZXJ0KGY6Y2xvc2UoKSkK Ci0tLS0tLS0tLS0tLS0tLS0qKioqKioqKiBmc2F0b2tlbi5jICoqKioqKioqLS0tLS0tLS0t LS0tLS0tLQoKcHJpbnQoIkNyZWF0aW5nIGZzYXRva2VuLmMuLi4iKQpsb2NhbCBmID0gYXNz ZXJ0KGlvLm9wZW4oImZzYXRva2VuLmMiLCAidyIpKQphc3NlcnQoZjp3cml0ZShbWwovKiBm c2F0b2tlbiAtIFN1cHBvcnQgcm91dGluZXMgc3BlY2lmaWMgdG8gdG9rZW4gZGVmaW5pdGlv bnMKCl1dKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29weXJpZ2h0LmRmYWMiKSwgIlxu IikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VXYXJyYW50eS5kZmFjIiksICJc biIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3JzLmRmYWMiKSkpCmFzc2VydChm OndyaXRlKFtbCgovKiAyMDE0OiBSZXBhY2thZ2VkIGJ5ICJ1bnRhbmdsZSIgc2NyaXB0LCB3 cml0dGVuIGJ5IGJlaG9mZnNraS4gICovCgovKiBUaGUgbWFqb3JpdHkgb2YgdGhlIGZzYXRv a2VuW2NoXSBtb2R1bGUgaXMgaW4gZnNhdG9rZW4uaCwgYXMgaXQgaXMKICAgc2hhcmVkIGJ5 IG90aGVyIG1vZHVsZXMuICBUaGlzIGZpbGUgcHJvdmlkZXMgdG9rZW4tc3BlY2lmaWMgc3Vw cG9ydAogICBmdW5jdGlvbnMsIHN1Y2ggYXMgZnVuY3Rpb25zIHRvIHByaW50IHRva2VucyAo Zm9yIGRlYnVnZ2luZykuCgogICBBbHRob3VnaCB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBi ZXR3ZWVuIHNvbWUgZ2VuZXJpYyBjb25zdHJ1Y3RzCiAgIHN1Y2ggYXMgY2hhcmFjdGVyIGNs YXNzZXMgYW5kIHRoZSBDU0VUIHRva2VuIGRlZmluZWQgaGVyZSwgdGhlCiAgIGdlbmVyaWMg aXRlbXMgYXJlIGRlZmluZWQgaW4gYSBzZXBhcmF0ZSBzdXBwb3J0IGxpYnJhcnksIG5vdCBp biB0aGlzCiAgIG1vZHVsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGVzZSB0b2tlbnMgYXJlIHZl cnkgRlNBL2dyZXAtc3BlY2lmaWMsCiAgIHdoZXJlYXMgdGhlIGdlbmVyaWMgY29uc3J1Y3Rz IGFyZSBwb3RlbnRpYWxseSB3aWRlbHkgdXNlYWJsZSwgYW5kIG1heQogICBldmVuIGJlIGFt ZW5hYmxlIHRvIGhhcmR3YXJlLXNwZWNpZmljIG9wdGltaXNhdGlvbnMgKHN1Y2ggYXMKICAg c3VwZXJzY2FsYXIgb3Bjb2RlcyBzdWNoIGFzOgogICAgICAgICAtIGFuZC9vci9zZXQvY2xl YXIvdGVzdC1hbmQtc2V0L3Rlc3QtYW5kLWNsZWFyOyBhbmQvb3IKICAgICAgICAgLSBiaXQg Y291bnRpbmcKICAgb3BlcmF0aW9ucykuICAqLwoKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9u bWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUg PGNvbmZpZy5oPgoKI2luY2x1ZGUgImZzYXRva2VuLmgiCiNpbmNsdWRlIDxzdGRpby5oPgoK XV0pKQoKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgicHJ0b2staWZkZWYtREVCVUctc3RhcnQi KSwgIlxuIikpCmFzc2VydChmOndyaXRlKERlY2xzWyJwcnRvayJdKSkKYXNzZXJ0KGY6d3Jp dGUoRlNBVG9rZW5TdWJzdChSYXdUZXh0KCJwcnRvay1mbi1ib2R5IikpLCAiXG4iKSkKYXNz ZXJ0KGY6d3JpdGUoUmF3VGV4dCgicHJ0b2staWZkZWYtREVCVUctZW5kIikpKQoKLS0gRmlu YWxseSwgYWRkIHRyYWlsZXIgbGluZSAodmltKQphc3NlcnQoZjp3cml0ZShbWwovKiB2aW06 c2V0IHNoaWZ0d2lkdGg9MjogKi8KXV0pKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tLS0t LS0tLS0tLS0tLS0qKioqKioqKiBtYmNzZXRzLmggKioqKioqKiotLS0tLS0tLS0tLS0tLS0t CgpwcmludCgiQ3JlYXRpbmcgbWJjc2V0cy5oLi4uIikKbG9jYWwgZiA9IGFzc2VydChpby5v cGVuKCJtYmNzZXRzLmgiLCAidyIpKQphc3NlcnQoZjp3cml0ZShbWwovKiBtYmNzZXRzIC0t IEhhbmRsZSBtdWx0aS1ieXRlIGFuZC9vciBsb2NhbGUtZGVwZW5kZW50IHNldHMgb2YgY2hh cnMuCgpdXSkpCgphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJDb3B5cmlnaHQuZGZhYyIpLCAi XG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiTGljZW5zZVdhcnJhbnR5LmRmYWMiKSwg IlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkF1dGhvcnMuZGZhYyIpKSkKYXNzZXJ0 KGY6d3JpdGUoW1sKCi8qIDIwMTQ6IENyZWF0ZWQgYnkgInVudGFuZ2xlIiBzY3JpcHQsIHdy aXR0ZW4gYnkgYmVob2Zmc2tpLgoKPz8gbW9yZSBzdHVmZiBoZXJlCgoqLwoKXV0pKQoKLS0g QWRkIHByZXByb2Nlc3NvciBsaW5lcyB0byBtYWtlIHRoaXMgaGVhZGVyIGZpbGUgaWRlbXBv dGVudC4KYXNzZXJ0KGY6d3JpdGUoW1sKI2lmbmRlZiBNQkNTRVRTX0gKI2RlZmluZSBNQkNT RVRTX0ggMQoKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1 cmF0aW9uIGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2luY2x1ZGUg ImNoYXJjbGFzcy5oIgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDx3Y3R5cGUuaD4K CiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmIC8qIF9fY3BsdXNwbHVz ICovCgovKiBEZWZpbmUgdGhlIG11bHRpYnl0ZS1zZXQgZGVzY3JpcHRvciBhcyBhbiBvcGFx dWUgdHlwZS4gICovCnR5cGVkZWYgc3RydWN0IG1iY3NldHNfc2V0X3N0cnVjdCBtYmNzZXRz X3NldF90OwoKXV0pKQoKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJtYmNzZXRzLWluaXRp YWxpc2UiXSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJtYmNzZXRzLWRlc3Ryb3ktbW9k dWxlIl0pCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1sibWJjc2V0cy1uZXciXSkKV3JpdGVF eHRlcm5EZWNsKGYsIERlY2xzWyJtYmNzZXRzLXNldC1tYXRjaC1zZW5zZSJdKQpXcml0ZUV4 dGVybkRlY2woZiwgRGVjbHNbIm1iY3NldHMtYWRkLXdjaGFyIl0pCldyaXRlRXh0ZXJuRGVj bChmLCBEZWNsc1sibWJjc2V0cy1hZGQtd2NoYXItbGlzdCJdKQpXcml0ZUV4dGVybkRlY2wo ZiwgRGVjbHNbIm1iY3NldHMtYWRkLWNsYXNzIl0pCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNs c1sibWJjc2V0cy1hZGQtcmFuZ2UiXSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJtYmNz ZXRzLXJlY2VpdmUtaW5jb21wbGV0ZS1jaGFyY2xhc3MiXSkKV3JpdGVFeHRlcm5EZWNsKGYs IERlY2xzWyJtYmNzZXRzLWdldC1jaGFyYWN0ZXJpc3RpY3MiXSkKV3JpdGVFeHRlcm5EZWNs KGYsIERlY2xzWyJtYmNzZXRzLWdldC1jaGFycyJdKQoKLS0gYWRkX2VxdWl2cyBhbmQgYWRk X2NvbGxhdGlvbiBub3QgaW1wbGVtZW50ZWQgeWV0Li4uIHJlbW92ZSB0aGVtIGZyb20KLS0g dGhlIG1vZHVsZSwgc28gdGhhdCBnY2MgZG9lc24ndCBjb21wbGFpbiBhYm91dCBzdWNoIHBh c3NpdmUgY29kZS4KLS1bPVsKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJtYmNzZXRzLWFk ZC1lcXVpdnMiXSkKV3JpdGVFeHRlcm5EZWNsKGYsIERlY2xzWyJtYmNzZXRzLWFkZC1jb2xs YXRpb24iXSkKLS1dPV0KCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1sibWJjc2V0cy1jb21w bGV0ZWQiXSkKCi0tIEZpbmFsbHksIGFkZCB0cmFpbGVyIGxpbmVzIChpZGVtcG90ZW5jeSwg dmltKQphc3NlcnQoZjp3cml0ZShbWwojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYgLyog X19jcGx1c3BsdXMgKi8KCiNlbmRpZiAvKiBNQkNTRVRTX0ggKi8KCi8qIHZpbTpzZXQgc2hp ZnR3aWR0aD0yOiAqLwpdXSkpCgphc3NlcnQoZjpjbG9zZSgpKQoKLS0tLS0tLS0tLS0tLS0t LSoqKioqKioqIG1iY3NldHMuYyAqKioqKioqKi0tLS0tLS0tLS0tLS0tLS0KCnByaW50KCJD cmVhdGluZyBtYmNzZXRzLmMuLi4iKQpsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oIm1iY3Nl dHMuYyIsICJ3IikpCmFzc2VydChmOndyaXRlKFtbCi8qIG1iY3NldHMgLS0gSGFuZGxlIG11 bHRpLWJ5dGUgYW5kL29yIGxvY2FsZS1kZXBlbmRlbnQgc2V0cyBvZiBjaGFycy4KCl1dKSkK YXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29weXJpZ2h0LmRmYWMiKSwgIlxuIikpCmFzc2Vy dChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VXYXJyYW50eS5kZmFjIiksICJcbiIpKQphc3Nl cnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3JzLmRmYWMiKSkpCmFzc2VydChmOndyaXRlKFtb CgovKiAyMDE0OiBSZXBhY2thZ2VkIGJ5ICJ1bnRhbmdsZSIgc2NyaXB0LCB3cml0dGVuIGJ5 IGJlaG9mZnNraS4gICovCgovKiA/PyBOZWVkIHRvIGRvY3VtZW50IHRoaW5ncyBoZXJlLi4u CiAqLwoKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0 aW9uIGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2luY2x1ZGUgPGFz c2VydC5oPgojaW5jbHVkZSAiY2hhcmNsYXNzLmgiCiNpbmNsdWRlICJtYmNzZXRzLmgiCiNp bmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGli Lmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHdjdHlwZS5oPgojaW5jbHVkZSAi eGFsbG9jLmgiCgovKiBGbGVzaCBvdXQgb3BhcXVlIHR5cGUgZ2l2ZW4gaW4gdGhlIGhlYWRl ci4gICovCnN0cnVjdCBtYmNzZXRzX3NldF9zdHJ1Y3QKewogIC8qIFNpZ25hdHVyZS9jYW5h cnkgdG9rZW4gZm9yIHRvcCBvZiBzdHJ1Y3QuICAqLwogIHVuc2lnbmVkIGxvbmcgdG9wX2Zl bmNlX21hZ2ljX25yOwoKICAvKiBTaW5nbHktbGlua2VkIGxpc3Qgb2YgYWxsIGluc3RhbmNl cywgc28gZGVzdHJveV9tb2R1bGUgY2FuIHJlbGVhc2UKICAgICBhbGwgcmVzb3VyY2VzIGJ5 IHRyYXZlcnNpbmcgdGhlIGxpc3QuICAqLwogIG1iY3NldHNfc2V0X3QgKm5leHRfaW5zdGFu Y2U7CgogIGNoYXJjbGFzc190ICpjaGFyY2xhc3M7CiAgYm9vbCBpbnZlcnQ7CiAgd2NoYXJf dCAqY2hhcnM7ICAgICAgICAgICAgICAgLyogTm9ybWFsIGNoYXJhY3RlcnMuICAqLwogIHNp emVfdCBuY2hhcnM7CiAgc2l6ZV90IGNoYXJzX2FsbG9jOwogIHdjdHlwZV90ICpjaF9jbGFz c2VzOyAgICAgICAgIC8qIENoYXJhY3RlciBjbGFzc2VzLiAgKi8KICBzaXplX3QgbmNoX2Ns YXNzZXM7CiAgc2l6ZV90IGNoX2NsYXNzZXNfYWxsb2M7CiAgc3RydWN0ICAgICAgICAgICAg ICAgICAgICAgICAgLyogUmFuZ2UgY2hhcmFjdGVycy4gICovCiAgewogICAgd2NoYXJfdCBi ZWc7ICAgICAgICAgICAgICAgIC8qIFJhbmdlIHN0YXJ0LiAgKi8KICAgIHdjaGFyX3QgZW5k OyAgICAgICAgICAgICAgICAvKiBSYW5nZSBlbmQuICAqLwogIH0gKnJhbmdlczsKICBzaXpl X3QgbnJhbmdlczsKICBzaXplX3QgcmFuZ2VzX2FsbG9jOwogIGNoYXIgKiplcXVpdnM7ICAg ICAgICAgICAgICAgIC8qIEVxdWl2YWxlbmNlIGNsYXNzZXMuICAqLwogIHNpemVfdCBuZXF1 aXZzOwogIHNpemVfdCBlcXVpdnNfYWxsb2M7CiAgY2hhciAqKmNvbGxfZWxlbXM7CiAgc2l6 ZV90IG5jb2xsX2VsZW1zOyAgICAgICAgICAgLyogQ29sbGF0aW5nIGVsZW1lbnRzLiAgKi8K ICBzaXplX3QgY29sbF9hbGxvYzsKCiAgLyogU2lnbmF0dXJlL2NhbmFyeSB0b2tlbiBmb3Ig Ym90dG9tIG9mIHN0cnVjdC4gICovCiAgdW5zaWduZWQgbG9uZyBib3R0b21fZmVuY2VfbWFn aWNfbnI7Cn07CiNkZWZpbmUgTUJDU0VUU19UT1BfRkVOQ0VfTUFHSUNfTlIgICAgMHg2YzA0 MGMzMnVMCiNkZWZpbmUgTUJDU0VUU19CT1RUT01fRkVOQ0VfTUFHSUNfTlIgMHgxMGRkYzU4 Y3VMCiNkZWZpbmUgQ0hFQ0tfQ09OVEVYVChjdHh0KSAgXAogIGFzc2VydCAoKChjdHh0KSAh PSBOVUxMKSAgICAgICBcCiAgICYmICgoY3R4dCktPnRvcF9mZW5jZV9tYWdpY19uciAgICA9 PSBNQkNTRVRTX1RPUF9GRU5DRV9NQUdJQ19OUikgIFwKICAgJiYgKChjdHh0KS0+Ym90dG9t X2ZlbmNlX21hZ2ljX25yID09IE1CQ1NFVFNfQk9UVE9NX0ZFTkNFX01BR0lDX05SKSkKCi8q IExpbmtlZCBsaXN0IG9mIGFsbCBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGlzIG1vZHVsZS4g ICovCnN0YXRpYyBtYmNzZXRzX3NldF90ICptYmNzZXRzX2luc3RhbmNlc19saXN0X2hlYWQg PSBOVUxMOwoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgibWF5YmUtcmVhbGxvYyIp LCAiXG4iKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJtYmNzZXRzLXNldC1tYXRjaC1zZW5z ZSJdLCBbWwp7CiAgQ0hFQ0tfQ09OVEVYVCAobWJjKTsKCiAgbWJjLT5pbnZlcnQgPSBpbnZl cnQ7Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJtYmNzZXRzLWFkZC13Y2hhciJd LCBbWwp7CiAgQ0hFQ0tfQ09OVEVYVCAobWJjKTsKCiAgLyogPz8gUXVpZXRseSBpZ25vcmUg V0VPRi4uLiBpcyB0aGlzIHJlYXNvbmFibGU/ICAqLwogIGlmICh3YyA9PSBXRU9GKQogICAg cmV0dXJuOwoKICAvKiBDb3VsZCB0aGlzIGNoYXJhY3RlciBmaXQgaW50byBhIGNoYXJjbGFz cyBzZXQ/ICovCiAgLyogPz8gV2UgZG9uJ3Qga25vdyBkaXJlY3RseSB0aGUgc2lnbmVkbmVz cyBvZiB3aW50X3Q7IGluIGdudWxpYiwgaXQKICAgICBpcyB1bnNpZ25lZCwgYW5kIHNvIHRl c3RpbmcgZm9yICJ3YyA+PSAwIiBpcyBmbGFnZ2VkIGFzIGFuIGVycm9yCiAgICAgYXMgaXQg aXMgcmVkdW5kYW50LiAgSGF2ZSByZW1vdmVkIHRoZSB0ZXN0IGhlcmUgZm9yIG5vdywgYnV0 IG5vdAogICAgIGNvbmZpZGVudCB0aGF0IHRoaXMgaXMgdGhlIGJlc3QgdHJlYXRtZW50LiAg Ki8KICBpZiAoLyogd2MgPj0gMCAmJiAqLyB3YyA8IENIQVJDTEFTU19OT1RDSEFSKQogICAg ewogICAgIC8qIFllcywgZG9lcyB0aGlzIHdpZGUgY2hhciBoYXZlIGEgdmFsaWQgdW5pY2hh ciByZXByZXNlbnRhdGlvbj8gKi8KICAgICAvKiA/PyBUaGUgZG9jdW1lbnRhdGlvbiBzdGF0 ZXMgdGhhdCB3Y3RvYiBzaG91bGQgbm90IGJlIHVzZWQ7CiAgICAgICAgcGVyaGFwcyB0aGUg dW5pYnl0ZSBjYWNoZSBtYnJ0b3djX2NhY2hlIGluIGZzYWxleCwgYnVpbHQgYnkKICAgICAg ICBpbml0aWFsaXNlX3VjaGFyX3RvX3djX2NhY2hlICgpLCBtaWdodCBiZSByZWxldmFudCBo ZXJlPyAgKi8KICAgICBpbnQgYiA9IHdjdG9iICh3Yyk7CiAgICAgaWYgKGIgIT0gRU9GKQog ICAgICAgewogICAgICAgICAvKiBZZXMsIGFkZCB0aGUgY2hhciAoYnl0ZT8pIChvY3RldD8p IHRvIHRoZSBjaGFyY2xhc3Mgc2V0LiAgKi8KICAgICAgICAgY2hhcmNsYXNzX3NldGJpdCAo YiwgbWJjLT5jaGFyY2xhc3MpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICB9Cgog IC8qIEVuc3VyZSB3ZSBoYXZlIHNwYWNlIHRvIHN0b3JlIGFub3RoZXIgY2hhcmFjdGVyLiAg Ki8KICBtYmMtPmNoYXJzID0gbWF5YmVfcmVhbGxvYyhtYmMtPmNoYXJzLCBtYmMtPm5jaGFy cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWJjLT5jaGFyc19hbGxvYywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKm1iYy0+Y2hhcnMpOwoKICAvKiBB ZGQgdGhlIGNoYXJhY3RlciB0byB0aGUgbGlzdC4gICovCiAgbWJjLT5jaGFyc1ttYmMtPm5j aGFycysrXSA9IHdjOwp9CgpdXSkpCgphc3NlcnQoZjp3cml0ZShEZWNsc1sibWJjc2V0cy1h ZGQtd2NoYXItbGlzdCJdLCBbWwp7CiAgc2l6ZV90IGk7CgogIENIRUNLX0NPTlRFWFQgKG1i Yyk7CgogIC8qIEVuc3VyZSB3ZSBoYXZlIHNwYWNlIHRvIHN0b3JlIHRoZSBpbmNvbWluZyBs aXN0IGVsZW1lbnQocykuICAqLwogIG1iYy0+Y2hhcnMgPSBtYXliZV9yZWFsbG9jKG1iYy0+ Y2hhcnMsIG1iYy0+bmNoYXJzICsgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZtYmMtPmNoYXJzX2FsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVv ZiAqbWJjLT5jaGFycyk7CgogIC8qIEFkZCBhbGwgdGhlIGNoYXJhY3RlcnMgdG8gdGhlIGxp c3QuICAoPz8gdXNlIG1lbWNweSBoZXJlPykgICovCiAgZm9yIChpID0gMDsgaSA8IGxlbjsg aSsrKQogICAgbWJjLT5jaGFyc1ttYmMtPm5jaGFycysrXSA9IHdjX2xpc3RbaV07Cn0KCl1d KSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJtYmNzZXRzLWFkZC1jbGFzcyJdLCBbWwp7CiAg Q0hFQ0tfQ09OVEVYVCAobWJjKTsKCiAgLyogRW5zdXJlIHdlIGhhdmUgc3BhY2UgdG8gc3Rv cmUgYW5vdGhlciBjbGFzcyBkZXNjcmlwdG9yLiAgKi8KICBtYmMtPmNoX2NsYXNzZXMgPSBt YXliZV9yZWFsbG9jKG1iYy0+Y2hfY2xhc3NlcywgbWJjLT5uY2hfY2xhc3NlcywKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYmMtPmNoX2NsYXNzZXNfYWxsb2MsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKm1iYy0+Y2hfY2xhc3Nl cyk7CgogIC8qIEFkZCB0aGUgY2xhc3MgZGVzY3JpcHRvciB0byB0aGUgbGlzdC4gICovCiAg bWJjLT5jaF9jbGFzc2VzW21iYy0+bmNoX2NsYXNzZXMrK10gPSB3Y2hhcl9jbGFzczsKfQoK XV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbIm1iY3NldHMtYWRkLXJhbmdlIl0sIFtbCnsK ICBDSEVDS19DT05URVhUIChtYmMpOwoKICAvKiA/PyBXZSBkb24ndCBjaGVjayB0aGF0IHRo ZSBiZWdpbi9lbmQgY2hhcnMgYXJlIHZhbGlkLiAgKi8KCiAgLyogRW5zdXJlIHdlIGhhdmUg c3BhY2UgdG8gc3RvcmUgYW5vdGhlciBiZWdpbi9lbmQgY2hhciBwYWlyLiAgKi8KICBtYmMt PnJhbmdlcyA9IG1heWJlX3JlYWxsb2MobWJjLT5yYW5nZXMsIG1iYy0+bnJhbmdlcyArIDEs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYmMtPnJhbmdlc19hbGxvYywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICptYmMtPnJhbmdlcyk7CgogIC8q IEFkZCB0aGUgcmFuZ2UgdG8gdGhlIGxpc3QuICAqLwogIG1iYy0+cmFuZ2VzW21iYy0+bnJh bmdlc10uYmVnICAgPSBiZWc7CiAgbWJjLT5yYW5nZXNbbWJjLT5ucmFuZ2VzKytdLmVuZCA9 IGVuZDsKfQoKXV0pKQoKLS0gYWRkX2VxdWl2cyBhbmQgYWRkX2NvbGxhdGlvbiBub3QgaW1w bGVtZW50ZWQgeWV0Li4uIHJlbW92ZSB0aGVtIGZyb20KLS0gdGhlIG1vZHVsZSwgc28gdGhh dCBnY2MgZG9lc24ndCBjb21wbGFpbiBhYm91dCBwYXNzaXZlIGNvZGUuCi0tWz1bCmFzc2Vy dChmOndyaXRlKERlY2xzWyJtYmNzZXRzLWFkZC1lcXVpdnMiXSwgW1sKewp9CgpdXSkpCgph c3NlcnQoZjp3cml0ZShEZWNsc1sibWJjc2V0cy1hZGQtY29sbGF0aW9uIl0sIFtbCnsKfQoK XV0pKQotLV09XQoKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbIm1iY3NldHMtcmVjZWl2ZS1pbmNv bXBsZXRlLWNoYXJjbGFzcyJdLCBbWwp7CiAgQ0hFQ0tfQ09OVEVYVCAobWJjKTsKCiAgY2hh cmNsYXNzX3VuaW9uc2V0IChjY2wsIG1iYy0+Y2hhcmNsYXNzKTsKICBjaGFyY2xhc3NfYWJh bmRvbiAoY2NsKTsKfQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbIm1iY3NldHMtY29t cGxldGVkIl0sIFtbCnsKICBjaGFyY2xhc3NfdCAqemVyb3NldDsKCiAgQ0hFQ0tfQ09OVEVY VCAobWJjKTsKCiAgLyogRGlkIHdlIGVuZCB1cCBwdXR0aW5nIGFueXRoaW5nIGludG8gdGhl IGNoYXJjbGFzcz8gICovCiAgemVyb3NldCA9IGNoYXJjbGFzc19nZXRfcG9pbnRlciAoMCk7 CiAgaWYgKGNoYXJjbGFzc19lcXVhbCAobWJjLT5jaGFyY2xhc3MsIHplcm9zZXQpKQogICAg ewogICAgICAvKiBObywgYWJhbmRvbiB0aGUgY2xhc3MsIGFuZCB1c2UgTlVMTCBhcyBvdXIg c2VudGluZWwuICAqLwogICAgICBjaGFyY2xhc3NfYWJhbmRvbiAobWJjLT5jaGFyY2xhc3Mp OwogICAgICBtYmMtPmNoYXJjbGFzcyA9IE5VTEw7CiAgICB9CiAgICBlbHNlCiAgICB7CiAg ICAgIC8qIFllcywgY29tcGxldGUgdGhlIGNsYXNzLCBhbmQgb2J0YWluIGEgcGVyc2lzdGVu dCBwb2ludGVyLiAgKi8KICAgICAgY2hhcmNsYXNzX2luZGV4X3QgaW5kZXg7CiAgICAgIGlu ZGV4ID0gY2hhcmNsYXNzX2NvbXBsZXRlZCAobWJjLT5jaGFyY2xhc3MpOwogICAgICBtYmMt PmNoYXJjbGFzcyA9IGNoYXJjbGFzc19nZXRfcG9pbnRlciAoaW5kZXgpOwogICAgfQp9Cgpd XSkpCgphc3NlcnQoZjp3cml0ZShEZWNsc1sibWJjc2V0cy1nZXQtY2hhcmFjdGVyaXN0aWNz Il0sIFtbCnsKICBDSEVDS19DT05URVhUIChtYmMpOwoKICAqcF9pbnZlcnQgICAgICA9IG1i Yy0+aW52ZXJ0OwogICpwcF9jaGFyY2xhc3MgID0gbWJjLT5jaGFyY2xhc3M7CiAgKnBfbmNo YXJzICAgICAgPSBtYmMtPm5jaGFyczsKICAqcF9uY2hfY2xhc3NlcyA9IG1iYy0+bmNoX2Ns YXNzZXM7CiAgKnBfbnJhbmdlcyAgICAgPSBtYmMtPm5yYW5nZXM7CiAgKnBfbmVxdWl2cyAg ICAgPSBtYmMtPm5lcXVpdnM7CiAgKnBfbmNvbGxfZWxlbXMgPSBtYmMtPm5jb2xsX2VsZW1z Owp9CgpdXSkpCgphc3NlcnQoZjp3cml0ZShEZWNsc1sibWJjc2V0cy1nZXQtY2hhcnMiXSwg W1sKewogIENIRUNLX0NPTlRFWFQgKG1iYyk7CgogIG1lbWNweSAoY2hhcl9saXN0LCBtYmMt PmNoYXJzLCBtYmMtPm5jaGFycyAqIHNpemVvZigqY2hhcl9saXN0KSk7Cn0KCl1dKSkKCgph c3NlcnQoZjp3cml0ZShEZWNsc1sibWJjc2V0cy1pbml0aWFsaXNlIl0sIFtbCnsKICAvKiBJ bml0aWFsaXNlIHRoZSBsaW5rZWQgbGlzdCBvZiBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGlz IG1vZHVsZS4gICovCiAgbWJjc2V0c19pbnN0YW5jZXNfbGlzdF9oZWFkID0gTlVMTDsKCiAg YXRleGl0IChtYmNzZXRzX2Rlc3Ryb3lfbW9kdWxlKTsKfQoKXV0pKQoKYXNzZXJ0KGY6d3Jp dGUoW1sKLyogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZnJlZSBhbGwgcmVzb3VyY2VzIGRpcmVj dGx5IG9yIGluZGlyZWN0bHkgdXNlZCBieQogICBhbiBpbnN0YW5jZS4gIFRoZSBwb2ludGVy IGlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGNhbGwuICAqLwpzdGF0aWMgdm9pZApm cmVlX2luc3RhbmNlIChtYmNzZXRzX3NldF90ICptYmMpCnsKICBzaXplX3QgaTsKCiAgQ0hF Q0tfQ09OVEVYVCAobWJjKTsKCiAgZnJlZSAobWJjLT5jaGFycyk7CiAgZnJlZSAobWJjLT5j aF9jbGFzc2VzKTsKICBmcmVlIChtYmMtPnJhbmdlcyk7CgogIGZvciAoaSA9IDA7IGkgPCBt YmMtPm5lcXVpdnM7ICsraSkKICAgIGZyZWUgKG1iYy0+ZXF1aXZzW2ldKTsKICBmcmVlICht YmMtPmVxdWl2cyk7CgogIGZvciAoaSA9IDA7IGkgPCBtYmMtPm5jb2xsX2VsZW1zOyArK2kp CiAgICBmcmVlIChtYmMtPmNvbGxfZWxlbXNbaV0pOwogIGZyZWUgKG1iYy0+Y29sbF9lbGVt cyk7CgogIC8qIERlc3Ryb3kgdG9wL2JvdHRvbSBmZW5jZS9jYW5hcnkgc2VudGluZWxzIHRv IGF2b2lkIGNvbmZ1c2lvbi4gICovCiAgbWJjLT50b3BfZmVuY2VfbWFnaWNfbnIgICAgKz0g MHg1YTVhNWE1YTsKICBtYmMtPmJvdHRvbV9mZW5jZV9tYWdpY19uciArPSAweDVhNWE1YTVh OwoKICBmcmVlIChtYmMpOwp9CgpdXSkpCgphc3NlcnQoZjp3cml0ZShEZWNsc1sibWJjc2V0 cy1kZXN0cm95LW1vZHVsZSJdLCBbWwp7CiAgbWJjc2V0c19zZXRfdCAqcF9saXN0OwogIG1i Y3NldHNfc2V0X3QgKnBfbmV4dDsKCiAgLyogTW92ZSB0aGUgZ2xvYmFsIGxpc3QgaGVhZCBp bnRvIGEgbG9jYWwgdmFyaWFibGUsIGFuZCBpbW1lZGlhdGVseQogICAgIGNsZWFyIHRoZSBn bG9iYWwuICBUaGlzIGlzIGEgaGFsZi1oZWFydGVkIGF0dGVtcHQgdG8gYXZvaWQgcmFjZQog ICAgIGNvbmRpdGlvbnM7IHRvIGRvIHRoaW5ncyBwcm9wZXJseSwgYSBzeXN0ZW0td2lkZSBh dG9taWMgb3BlcmF0aW9uCiAgICAgKGxvY2tlZCwgaW5jbHVkaW5nIG11bHRpLUNQVSBjYWNo ZSBjb2hlcmVuY3kpIG9wZXJhdGlvbiBzaG91bGQgYmUKICAgICB1c2VkLiAgKi8KICBwX2xp c3QgPSBtYmNzZXRzX2luc3RhbmNlc19saXN0X2hlYWQ7CiAgbWJjc2V0c19pbnN0YW5jZXNf bGlzdF9oZWFkID0gTlVMTDsKCiAgLyogVHJhdmVyc2UgdGhlIGxpc3Qgb2YgaW5zdGFuY2Vz LCByZWxlYXNpbmcgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkCiAgICAgd2l0aCBlYWNoIG9u ZS4gICovCiAgd2hpbGUgKHBfbGlzdCkKICAgIHsKICAgICAgcF9uZXh0ID0gcF9saXN0LT5u ZXh0X2luc3RhbmNlOwogICAgICBmcmVlX2luc3RhbmNlIChwX2xpc3QpOwogICAgICBwX2xp c3QgPSBwX25leHQ7CiAgICB9Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJtYmNz ZXRzLW5ldyJdLCBbWwp7CiAgbWJjc2V0c19zZXRfdCAqbmV3X3NldDsKCiAgLyogQWxsb2Nh dGUgbWVtb3J5IGZvciBuZXcgaW5zdGFuY2UuICAqLwogIG5ld19zZXQgPSB4emFsbG9jIChz aXplb2YgKCpuZXdfc2V0KSk7CgogIC8qIEltbWVkaWF0ZWx5IHNldCB1cCB0b3AgYW5kIGJv dHRvbSBjb250ZXh0IGNhbmFyeS9mZW5jZXMuICAqLwogIG5ld19zZXQtPnRvcF9mZW5jZV9t YWdpY19uciAgICA9IE1CQ1NFVFNfVE9QX0ZFTkNFX01BR0lDX05SOwogIG5ld19zZXQtPmJv dHRvbV9mZW5jZV9tYWdpY19uciA9IE1CQ1NFVFNfQk9UVE9NX0ZFTkNFX01BR0lDX05SOwoK ICAvKiBMaW50IG5ldyBpbnN0YW5jZSBpbnRvIGxpc3Qgb2YgaW5zdGFuY2VzIGNyZWF0ZWQg YnkgdGhpcyBtb2R1bGUuICAqLwogIG5ld19zZXQtPm5leHRfaW5zdGFuY2UgPSBtYmNzZXRz X2luc3RhbmNlc19saXN0X2hlYWQ7CiAgbWJjc2V0c19pbnN0YW5jZXNfbGlzdF9oZWFkID0g bmV3X3NldDsKCiAgLyogQWxsb2NhdGUgYSBjaGFyY2xhc3Mgc2V0IHRvIHRoZSBpbnN0YW5j ZSwgc28gd2UgY2FuIGVhc2lseSBwdXNoCiAgICAgY29kZXMgaW50byB0aGF0IHJlcHJlc2Vu dGF0aW9uIGlmIHBvc3NpYmxlLiAgKi8KICBuZXdfc2V0LT5jaGFyY2xhc3MgPSBjaGFyY2xh c3NfYWxsb2MgKCk7CgogIC8qIFJlcG9ydCBjcmVhdGVkIGluc3RhbmNlIHRvIHRoZSBjYWxs ZXIuICAqLwogIHJldHVybiBuZXdfc2V0Owp9CgpdXSkpCgoKLS0gRmluYWxseSwgYWRkIHRy YWlsZXIgbGluZSAodmltKQphc3NlcnQoZjp3cml0ZShbWwovKiB2aW06c2V0IHNoaWZ0d2lk dGg9MjogKi8KXV0pKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tLS0tLS0tLS0tLS0tLS0q KioqKioqKiBwcm90by1sZXhwYXJzZS5oICoqKioqKioqLS0tLS0tLS0tLS0tLS0tLQoKcHJp bnQoIkNyZWF0aW5nIHByb3RvLWxleHBhcnNlLmguLi4iKQpsb2NhbCBmID0gYXNzZXJ0KGlv Lm9wZW4oInByb3RvLWxleHBhcnNlLmgiLCAidyIpKQphc3NlcnQoZjp3cml0ZShbWwovKiBw cm90by1sZXhwYXJzZSAtLSBEZWZpbmUgaG93IGxleGVyIGFuZCBwYXJzZXIgY2FuIGludGVy YWN0LgoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29weXJpZ2h0LmRmYWMiKSwg IlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VXYXJyYW50eS5kZmFjIiks ICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3JzLmRmYWMiKSkpCmFzc2Vy dChmOndyaXRlKFtbCgovKiAyMDE0OiBDcmVhdGVkIGJ5ICJ1bnRhbmdsZSIgc2NyaXB0LCB3 cml0dGVuIGJ5IGJlaG9mZnNraS4KCihFVkVOVFVBTExZUkVXUklURU1FOiBBIHZlcnkgbGVu Z3RoeSBlZGl0b3JpYWwvZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZQpmb2xsb3dzLCBwYXJ0 aWFsbHkgaW50ZXJzcGVyc2VkIHdpdGggYSBkZXNjcmlwdGlvbiBvZiBpdHMgaW50ZW5kZWQK ZnVuY3Rpb24uICBDb21tZW50cyBhbmQgY3JpdGljaXNtIGFyZSB3ZWxjb21lOyBpZiBhZG9w dGVkLCBJIGV4cGVjdCB0aGF0CnRoaXMgY29tbWVudCBibG9jayB3aWxsIGJlIHJld3JpdHRl biB0byBiZSBtdWNoIG1vcmUgZm9jdXNzZWQgYW5kIG11Y2gKc2hvcnRlci4pCgpUaGlzIGZp bGUgaGFzIGJlZW4gYWRkZWQgdmVyeSwgdmVyeSBsYXRlIGluIHRoZSBub24tbGluZWFyIHBy b2Nlc3Mgb2YKZGV2ZWxvcGluZyB0aGlzIGNvZGUuICBJdCBhZGRyZXNzZXMgYSBmZWF0dXJl IHRoYXQgd2FzIG5vdCBhbnRpY2lwYXRlZCBlYXJseQpvbiwgYnV0IHdoaWNoIEkgYmVsaWV2 ZSBpcyB3b3J0aCBleHBsb3JpbmcgaW4gdGhlIGZ1dHVyZTogIFRoZSBwcmVzZW5jZSBvZgpw bHVnZ2FibGUgbGV4ZXJzIHRvIHN1cHBseSB0byB0aGUgcGFyc2VyLCBvciwgZXF1aXZhbGVu dGx5LCBicmVha2luZyB1cCB0aGUKbWFzdGVyL3NsYXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVu IHRoZSBwYXJzZXIgYW5kIHRoZSBsZXhlciwgYW5kIHJlcGxhY2luZyBpdAp3aXRoIGEgcGVl ci10by1wZWVyIGNvbnZlcnNhdGlvbiAocGVyaGFwcyB0aGUgc29mdHdhcmUgZXF1aXZhbGVu dCBvZiBhCnNoYXJlZCBidXMpLgoKUXVpdGUgYSBiaXQgb2YgdGhlIG5lZWQgZm9yIHRoaXMg cHJvdG9jb2wvaW50ZXJmYWNlIG1vZHVsZSBpcyB0aGF0IEkndmUKZGVtYW5kZWQgdGhhdCB0 aGUgaW5kaXZpZHVhbCBtb2R1bGVzIHN0cmljdGx5IGhpZGUgdGhlaXIgaW50ZXJuYWxzLCBh bmQgb25seQpzaGFyZSBpbmZvcm1hdGlvbiBhbmQvb3IgY29udHJvbCBvZiByZXNvdXJjZXMg KHN1Y2ggYXMgdGhlIHBhcnNlciBjYWxsaW5nCmxleCAoKSkgaW4gYW4gZXhwbGljaXQgZmFz aGlvbi4gIEVhcmx5IG9uLCB0aGUgbmF0dXJlIG9mIGNvbm5lY3Rpb25zIGJldHdlZW4KdGhl IGxleGVyIGFuZCB0aGUgcGFyc2VyIGFwcGVhcmVkIHdpdGggdGhlIG5lZWQgdG8gY29tbXVu aWNhdGUge21pbixtYXh9CnZhbHVlcyBhcyBwYXJ0IG9mIHRoZSBSRVBNTiB0b2tlbjsgdGhl biB0aGUgbmVlZCB0byBjb21tdW5pY2F0ZSB0aGUgd2lkZQpjaGFyYWN0ZXIgaW1wbGllZCBi eSB0aGUgV0NIQVIgdG9rZW4uCgpUaGUgY3Jpc2lzIGNhbWUgYXJvc2UgZnJvbSBhbiBlYXJs eSBkZWNpc2lvbiB0aGF0IGF0IHRoZSB0aW1lIHNlZW1lZCBmYWlybHkKbWlsZCwgYnV0IGdy YWR1YWxseSBncmV3IGFuZCBncmV3IG92ZXIgdGltZTogd2hlbiBJIGRlY2lkZWQgdG8gZXh0 ZW5kIHRoZQptZWFuaW5nIG9mIHRoZSBmc2FsZXhfc3ludGF4ICgpIGNhbGwgdG8gbm90IG9u bHkgaW5jbHVkZSB0aGUgcGFyYW1ldGVycwpuYW1lZCBpbiB0aGUgY2FsbCAocmVnX3N5bnRh eF90LCBjYXNlIGZvbGRpbmcsIGVvbCBjaGFyKSwgYnV0IHRvIGFsc28KY2FwdHVyZSB0aGUg bG9jYWxlIGluIGZvcmNlIGF0IHRoYXQgcG9pbnQsIGFuZCBtYWtlIHRoZSBsZXhlcidzIGJl aGF2aW91cgpvYmV5IHRoYXQgbG9jYWxlLCBldmVuIGlmIHRoZSBsb2NhbGUgd2FzIHN1YnNl cXVlbnRseSBjaGFuZ2VkLgoKQW5vdGhlciBleGFtcGxlIG9mIGRhdGEgaW50ZXJjaGFuZ2Ug aXMgdGhhdCB0aGUgbGV4ZXIgYnVpbGRzIHN0cnVjdHVyZXMgdG8KbW9kZWwgbXVsdGlieXRl IGNoYXJhY3RlciBzZXRzLCBidXQgKGF0IHRoZSB0aW1lIG9yIHdyaXRpbmcpIGRvZXMgbm90 IHByb3ZpZGUKYW4gaW50ZXJmYWNlIGZvciBjbGllbnRzIHRvIGFjY2VzcyB0aGlzIGluZm9y bWF0aW9uLiAgVGhlIG5lZWQgZm9yIG1hbnkgYW5kCnZhcmllZCBpbnRlcmZhY2UgZnVuY3Rp b24gaGFzIGJlZW4gc3RlYWRpbHkgZ3Jvd2luZywgYW5kIHRoaXMgaXMganVzdCBhbm90aGVy CmV4YW1wbGUuCgpUaGUgYnJlYWtpbmcgcG9pbnQgY2FtZSB3aGVuIEkgc2F3IHRoYXQgdGhl IHBhcnNlciBuZWVkZWQgdG8ga25vdyBpZiBpdCB3YXMKaW4gYSB1bmlieXRlIG9yIG11bHRp Ynl0ZSBsb2NhbGUgKGN1cnJlbnRseSBkb25lIGJ5IHRlc3RpbmcgTUJfQ1VSX01BWCA+IDEp LgpJZiB0aGUgbGV4ZXIgd2FzIHRoZSBhdXRob3JpdHkgb24gdGhlIGxvY2FsZSwgdGhlbiB0 aGUgcGFyc2VyIG5lZWRlZCB0bwpxdWVyeSB0aGUgbGV4ZXIsIHNpbmNlLCBiZWNhdXNlIG9m IHRoZSAgcGx1Z2dhYmxlLWxleGVyIGFyY2hpdGVjdHVyZSBJJ2QKY3JlYXRlZCwgdGhlIGxl eGVyIHdhcyBhbHJlYWR5IHRoZSBhdXRob3JpdHksIGJ1dCBuZWVkZWQgdG8gc2hhcmUgaXRz CmluZm9ybWF0aW9uIHdpdGggb3RoZXJzLiAgVGhlIG51bWJlciBvZiBzcGVjaWFsaXNlZCBn ZXQvc2V0IGZ1bmN0aW9ucyBuZWVkZWQKd2FzIG91dCBvZiBjb250cm9sLCBhbmQsIGlmIGEg cGx1Z2dhYmxlIGFyY2hpdGVjdHVyZSB3YXMgdG8gYmUgbWFpbnRhaW5lZCx0aGUKbnVtYmVy IGhhZCB0byBiZSBkcmFzdGljYWxseSByZWR1Y2VkLgoKSGVuY2UsIHRoaXMgbW9kdWxlLCB0 aGF0IGRlZmluZXMgdGhlIGludGVyZmFjZS9wcm90b2NvbCB0aGF0IGFueSBsZXhlciBtdXN0 CnNlcnZlLCBhbmQgd2hpY2ggYWxsb3dzIGEgbGV4ZXIgYW5kIGl0cyBjbGllbnQgdG8gZXhj aGFuZ2UgaW5mb3JtYXRpb24gYW5kCm5lZ290aWF0ZSBpbiBhIGZsZXhpYmxlIGZhc2hpb24u ICBUaGlzIGNvbWVzIGF0IHRoZSBleHRlbnQgb2YgdHlwZSBzYWZldHkgaW4KbWFueSBjYXNl cywgYnV0IG1ha2VzIGRhdGEgZXhjaGFuZ2UgbW9yZSBmb3JtYWwuCgpUaGlzIG1vZHVsZSBv bmx5IG1vZGVscyBlc3NlbnRpYWwgZXhjaGFuZ2VzIGJldHdlZW4gdGhlIHBhcnNlciBhbmQg bGV4ZXIKaW5zdGFuY2VzLCBhbmQgZW5jb3VyYWdlcyB0aGUgdXNlciB0byBuZWdvdGlhdGUg ZGlyZWN0bHkgd2l0aCB0aGUgbW9kdWxlcwpmb3IgdW5yZWxhdGVkIHRvcGljcy4gIEZvciBl eGFtcGxlLCB0aGUgcGFyc2VyIGRvZXMgbm90IG5lZWQgdG8ga25vdyB3aGF0IHRoZQpvcmln aW5hbCBwbGFpbi10ZXh0IHBhdHRlcm4gd2FzOyBpdCByZWNlaXZlcyBhIGZ1bGwgZGVzY3Jp cHRpb24gb2YgdGhlCnBhdHRlcm4gdmlhIHRoZSBsZXhlciB0b2tlbnMgYW5kIGFzc29jaWF0 ZWQgcGFyYW1ldGVycy9zdHJ1Y3R1cmVzLiAgU28sIHRoZXJlCmlzIG5vICJwYXR0ZXJuIiBp bnRlcmNoYW5nZSBkZXNjcmliZWQgaGVyZTogIFRoZSBjbGllbnQgY2FuIHdvcmsgZGlyZWN0 bHkKd2l0aCB0aGUgbGV4ZXIuCgpUaGUgZGVzaWduIGlzIHRvIHNwbGl0IGludGVyYWN0aW9u cyBiZXR3ZWVuIG1vZHVsZXMgaW50byB0d28gc2V0czogIEZvciBjb2RlCnRoYXQgaXMgc28g Y2VudHJhbCB0byB0aGUgZGVzaWduIG9mIHRoZSBtb2R1bGVzIG9uIGVhY2ggc2lkZSwgd2hl cmUgYW4KaW5kaXJlY3QgYXBwcm9hY2ggd291bGQgdGVuZCB0byBzaWduaWZpY2FudGx5IGNv bXBsaWNhdGUgdGhlIGV4Y2hhbmdlLCBhbmQvb3IKd2hlcmUgZWZmaWNpZW5jeSBpcyBhIGNl bnRyYWwgY29uY2VybiwgdGhlbiBhIGRpcmVjdCBmdW5jdGlvbiBpcyBwcm92aWRlZCB0bwpm YWNpbGl0YXRlIGVhY2ggc3VjaCBwb3NzaWJsZSBleGNoYW5nZS4KClRoZSBvdGhlciBzZXQg Y29uc2lzdHMgb2YgdGhlIG1ham9yaXR5IG9mIGNhc2VzIChieSB0eXBlLCBidXQgdXN1YWxs eSBub3QgYnkKcnVudGltZSB2b2x1bWUpOiAgRm9yIHRoZXNlIGNhc2VzLCBhIGdlbmVyaWMg ImV4Y2hhbmdlIiBmdW5jdGlvbiBpcyBwcm92aWRlZApieSB0aGUgbGV4ZXIsIGFuZCBpcyBw bHVnZ2VkIGludG8gdGhlIHBhcnNlci4gIFRoaXMgZnVuY3Rpb24gaGFzIHBhcmFtZXRlcnMK YW5kIHJldHVybiB2YWx1ZXMgdGhhdCBwZXJtaXQgdGhlIHBhcnRpZXMgdG8gZXhjaGFuZ2Ug aW5mb3JtYXRpb24sIGFsdGhvdWdoCnNvbWUgc3RyaWN0IHR5cGUgc2FmZXR5IGlzIHNhY3Jp ZmljZWQgd2hlcmUgbWVtb3J5IHBvaW50ZXJzIGNhbiBjcm9zcyB0aGUKYm91bmRhcnkuICBB IHNsaWdodGx5IHNpbXBsaWZpZWQgZGVmaW5pdGlvbiBvZiB0aGUgZXhjaGFuZ2UgZnVuY3Rp b24gaXM6CgogICAgaW50IGxleGVyX3Byb3ZpZGVkX2V4Y2hhbmdlICh2b2lkICpsZXhlcl9p bnN0YW5jZV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNo YW5nZV9vcGNvZGVfZW51bSBvcGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHZvaWQgKmdlbmVyaWNfcGFyYW1ldGVyKTsKClRoZSBvcGNvZGUgZGVmaW5lcyB3aGF0 IG1lYW5pbmcgKGlmIGFueSkgaXMgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciBhbmQvb3IK dG8gdGhlIHJldHVybiB2YWx1ZS4gIFRoZSBleGNoYW5nZSBmdW5jdGlvbiwgdGhlc2Ugb3Bj b2RlcywgYW5kIHRoZSByZXF1aXJlZAptZWFuaW5nIHRoZSB2YWx1ZXMgaW52b2x2ZWQgYXJl IGZvcm1hbGx5IGRlZmluZWQgYnkgdGhpcyBtb2R1bGUsIGFuZCBib3RoIHRoZQpsZXhlciBh bmQgdGhlIHBhcnNlciBtdXN0IGNvbmZvcm0gdG8gdGhpcyBwcm90b2NvbC9pbnRlcmZhY2Uu ICBCeSBoYXZpbmcgdGhpcwptb2R1bGUgYXMgYW4gaW5kZXBlbmRlbnQgZW50aXR5LCBpdCBy ZWluZm9yY2VzIHRoZSBpbmRlcGVuZGVuY2Ugb2YgZWFjaCBwYXJ0eQppbiB0aGUgYXJyYW5n ZW1lbnQsIGFuZCBjYW4gZWFzZSB0aGUgY3JlYXRpb24gb2YgYWx0ZXJuYXRpdmVzIChlLmcu IHBlcmhhcHMKdXNlIGEgbXVjaCBzaW1wbGVyIGxleGVyIGZvciAiZ3JlcCAtRiIgaW4gYSB1 bmlieXRlIGxvY2FsZT8pLgoKT24gdGhlIGRvd25zaWRlLCBzb21lIG9mIHRoZSBpbml0aWFs IG9wY29kZXMvZXhjaGFuZ2VzIEknbSB3cml0aW5nIGhlcmUgYXJlCm9idmlvdXNseSBkaXJl Y3RseSBsaWZ0ZWQgZnJvbSB0aGUgZXhpc3RpbmcgZGZhLmMgbGV4ZXIvcGFyc2VyIGludGVy YWN0aW9ucwooZS5nLiB0aGUgbXVsdGlieXRlIHNldHMgc3RydWN0KHMpKS4gIEknbSBob3Bp bmcgdGhhdCB0aGlzIHdpbGwgbm90IGJlIGEKZmF0YWwgZmxhdywgYnV0IGluIHRoZSBmaW5h bCBhbmFseXNpcyB0aGlzIG1vZHVsZSBpcyBhIHNpZGUtZWZmZWN0IG9mCnJlcXVpcmluZyBh IHBsdWdnYWJsZSBsZXhlciBhcmNoaXRlY3R1cmUsIGFuZCB0aGlzIG1heSBub3QgYmUgYWNj ZXB0YWJsZSB0bwpvdGhlcnMuICAqLwoKXV0pKQoKLS0gQWRkIHByZXByb2Nlc3NvciBsaW5l cyB0byBtYWtlIHRoaXMgaGVhZGVyIGZpbGUgaWRlbXBvdGVudC4KYXNzZXJ0KGY6d3JpdGUo W1sKCiNpZm5kZWYgUFJPVE9fTEVYUEFSU0VfSAojZGVmaW5lIFBST1RPX0xFWFBBUlNFX0gg MQoKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9u IGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUgPGNvbmZpZy5oPgoKLyogVGhlIGxleGVyIHJl dHVybnMgYSB0b2tlbiwgZGVmaW5lZCBieSBmc2F0b2tlbi4gICovCiNpbmNsdWRlICJmc2F0 b2tlbi5oIgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYgLyogX19j cGx1c3BsdXMgKi8KCl1dKSkKCmFzc2VydChmOndyaXRlKFtbCi8qIERlZmluZSBvcGNvZGVz IGZvciBsZXhlci9wYXJzZXIgZXhjaGFuZ2VzLiAgKi8KdHlwZWRlZiBlbnVtIHByb3RvX2xl eHBhcnNlX29wY29kZV9lbnVtCnsKLyogIFBvc3NpYmxlIGZ1dHVyZSBvcGNvZGU6IFBST1RP X0xFWFBBUlNFX09QX0dFVF9MT0NBTEUsICBlbnRpcmUKICAgIGxvY2FsZSBmcm9tIHVzZWxv Y2FsZS9kdXBsb2NhbGUgKi8KICBQUk9UT19MRVhQQVJTRV9PUF9HRVRfSVNfTVVMVElCWVRF X0xPQ0FMRSwKICBQUk9UT19MRVhQQVJTRV9PUF9HRVRfUkVQTU5fTUlOLAogIFBST1RPX0xF WFBBUlNFX09QX0dFVF9SRVBNTl9NQVgsCiAgUFJPVE9fTEVYUEFSU0VfT1BfR0VUX1dJREVf Q0hBUl9MSVNUX01BWCwKICBQUk9UT19MRVhQQVJTRV9PUF9HRVRfV0lERV9DSEFSUywKICBQ Uk9UT19MRVhQQVJTRV9PUF9HRVRfRE9UQ0xBU1MsCiAgUFJPVE9fTEVYUEFSU0VfT1BfR0VU X01CQ1NFVCwKfSBwcm90b19sZXhwYXJzZV9vcGNvZGVfdDsKCi8qIE1vc3Qgb3Bjb2RlcyBh Ym92ZSBhcmUgc2VsZi1kb2N1bWVudGluZzsgdGhlICJXSURFX0NIQVIoUykiCiAgIGl0ZW1z IHJlcXVpcmUgYSBsaXR0bGUgbW9yZSBleHBsYW5hdGlvbjoKICAgMS4gV2hlbiB0aGUgbGV4 ZXIgcmV0dXJucyBhIFdDSEFSIHRva2VuLCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKICAgICAg ZXhwbGljaXQgY2hhcmFjdGVyIChzcGVjaWZpZWQgaW4gdGhlIHBhdHRlcm4pLCBwbHVzIGEg bGlzdCBvZgogICAgICB6ZXJvIG9yIG1vcmUgYWx0ZXJuYXRlIGNoYXJhY3RlcnMgdGhhdCBh bHNvIG1hdGNoICh1c3VhbGx5CiAgICAgIGJlY2F1c2UgY2FzZSBmb2xkaW5nIGlzIHNlbGVj dGVkKS4gIFRoZSBwYXJzZXIgc2hvdWxkIHVzZQogICAgICBHRVRfV0lERV9DSEFSUyBpbiBy ZXNwb25zZSB0byBhIFdDSEFSIHRva2VuIHRvIGZldGNoIHRoaXMgbGlzdAogICAgICAoaW5j bHVkaW5nIHRoZSBleHBsaWNpdCBjaGFyYWN0ZXIgYXMgdGhlIGZpcnN0IGVsZW1lbnQgb2Yg dGhlCiAgICAgIGxpc3QpOyBhbmQKICAgMi4gVGhlIEdFVF9XSURFX0NIQVJfTElTVF9NQVgg aXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgcGFyc2VyIGNhbgogICAgICBhbGxvY2F0ZSBzdG9y YWdlIGZvciB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBsaXN0LCBlaXRoZXIgYXMgYQogICAgICBv bmNlLW9mZiBhbGxvY2F0aW9uIGR1cmluZyBzdGFydHVwLCBvciBvbiBhIGNhc2UtYnktY2Fz ZQogICAgICBiYXNpcy4gICovCl1dKSkKCmFzc2VydChmOndyaXRlKFtbCi8qIERlY2xhcmUg cHJvdG90eXBlcyBmb3IgbWFpbiBsZXggZnVuY3Rpb24gKGxleCAoKSwgZmV0Y2ggYSB0b2tl biksCiAgIGFuZCB0aGUgZXhjaGFuZ2UgZnVuY3Rpb24uICAqLwp0eXBlZGVmIGZzYXRva2Vu X3Rva2VuX3QgcHJvdG9fbGV4cGFyc2VfbGV4X2ZuX3QgKHZvaWQgKmxleGVyX2NvbnRleHQp OwoKdHlwZWRlZiBpbnQgcHJvdG9fbGV4cGFyc2VfZXhjaGFuZ2VfZm5fdCAodm9pZCAqbGV4 ZXJfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cHJvdG9fbGV4cGFyc2Vfb3Bjb2RlX3Qgb3Bjb2RlLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbWV0ZXIpOwoKXV0pKQoKLS0gRmluYWxs eSwgYWRkIHRyYWlsZXIgbGluZXMgKGlkZW1wb3RlbmN5LCB2aW0pCmFzc2VydChmOndyaXRl KFtbCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KCiNl bmRpZiAvKiBQUk9UT19MRVhQQVJTRV9IICovCgovKiB2aW06c2V0IHNoaWZ0d2lkdGg9Mjog Ki8KXV0pKQoKYXNzZXJ0KGY6Y2xvc2UoKSkKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLS0t LS0tLS0tLS0tLS0tLSoqKioqKioqIGZzYWxleC5oICoqKioqKioqLS0tLS0tLS0tLS0tLS0t LQoKcHJpbnQoIkNyZWF0aW5nIGZzYWxleC5oLi4uIikKbG9jYWwgZiA9IGFzc2VydChpby5v cGVuKCJmc2FsZXguaCIsICJ3IikpCmFzc2VydChmOndyaXRlKFtbCi8qIGZzYWxleCAtIFJl cGFja2FnZSBwYXR0ZXJuIHRleHQgYXMgY29tcGFjdCwgZXhwcmVzc2l2ZSB0b2tlbnMKCl1d KSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29weXJpZ2h0LmRmYWMiKSwgIlxuIikpCmFz c2VydChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VXYXJyYW50eS5kZmFjIiksICJcbiIpKQph c3NlcnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3JzLmRmYWMiKSkpCmFzc2VydChmOndyaXRl KFtbCgovKiAyMDE0OiBSZXBhY2thZ2VkIGJ5ICJ1bnRhbmdsZSIgc2NyaXB0LCB3cml0dGVu IGJ5IGJlaG9mZnNraS4gICovCgpdXSkpCgotLSBBZGQgcHJlcHJvY2Vzc29yIGxpbmVzIHRv IG1ha2UgdGhpcyBoZWFkZXIgZmlsZSBpZGVtcG90ZW50Lgphc3NlcnQoZjp3cml0ZShbWwoK I2lmbmRlZiBGU0FMRVhfSAojZGVmaW5lIEZTQUxFWF9IIDEKCi8qIEFsd2F5cyBpbXBvcnQg ZW52aXJvbm1lbnQtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpdGVtcyBmaXJzdC4gICovCiNp bmNsdWRlIDxjb25maWcuaD4KCiNpbmNsdWRlICJmc2F0b2tlbi5oIgojaW5jbHVkZSAicHJv dG8tbGV4cGFyc2UuaCIKI2luY2x1ZGUgPHJlZ2V4Lmg+CgojaWZkZWYgX19jcGx1c3BsdXMK ZXh0ZXJuICJDIiB7CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKLyogTXVsdGlwbGUgbGV4 ZXIgaW5zdGFuY2VzIGNhbiBleGlzdCBpbiBwYXJhbGxlbCwgc28gZGVmaW5lIGFuCiAgIG9w YXF1ZSB0eXBlIHRvIGNvbGxlY3QgdG9nZXRoZXIgYWxsIHRoZSBjb250ZXh0IHJlbGF0aW5n IHRvIGVhY2gKICAgaW5zdGFuY2UuICAqLwp0eXBlZGVmIHN0cnVjdCBmc2FsZXhfY3R4dF9z dHJ1Y3QgZnNhbGV4X2N0eHRfdDsKCl1dKSkKCi0tIEZ1bmN0aW9ucyB0byBkZWFsIHdpdGgg ZW50aXJlIG1vZHVsZSBhbmQgKmFsbCogY3JlYXRlZCBpbnN0YW5jZXMuCldyaXRlRXh0ZXJu RGVjbChmLCBEZWNsc1sibGV4LWluaXRpYWxpc2UiXSkKV3JpdGVFeHRlcm5EZWNsKGYsIERl Y2xzWyJsZXgtZGVzdHJveS1tb2R1bGUiXSkKCi0tIERlY2xhcmUgYSBmdW5jdGlvbiB0byBj cmVhdGUgYSBuZXcgbGV4ZXIgc3RhdGUuCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1sibGV4 LW5ldyJdKQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogPz8gUmVzZXJ2ZSAiZnNhbGV4X2Rpc2Nh cmQgKCkiIGZvciBnZXR0aW5nIHJpZCBvZiBhIGxleGVyCiAgIGluc3RhbmNlLiAgKi8KCl1d KSkKCi0tIEFkZCBleHRlcm5hbCBkZWNscyBmb3IgZnNhbGV4X3N5bnRheCBhbmQgZnNhbGV4 X3BhdHRlcm4uCgpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNbImxleC1zeW50YXgiXSkKV3Jp dGVFeHRlcm5EZWNsKGYsIERlY2xzWyJsZXgtcGF0dGVybiJdKQoKLS0gV2hpbGUgZGZhLmgg ZGVjbGFyZXMgZGZhd2FybigpIGFuZCBkZmFlcnJvcigpLCBhbmQgZGVtYW5kcyB0aGF0IHRo ZQotLSBjbGllbnQgc3VwcGx5IGZ1bmN0aW9ucyBhdCBsaW5rIHRpbWUsIHdlIGluc3RlYWQg cHJvdmlkZSBhbgotLSBpbnRlcmZhY2UgZnVuY3Rpb24gc28gdGhhdCB0aGUgZnVuY3Rpb25z IGNhbiBiZSBoYW5kZWQgb3ZlcgotLSBleHBsaWNpdGx5LiAgVGhpcyBzdHlsZSBtYXkgYmUg dXNlZnVsIGluIHRoZSBmdXR1cmUgaWYgd2Ugd2FudCB0bwotLSBtb3ZlIGZyb20gYSBzaW5n bGUgbGV4ZXIgaW5zdGFuY2UgdG8gbXVsdGlwbGUgaW5zdGFuY2VzIChvYmplY3RzPykKYXNz ZXJ0KGY6d3JpdGUoW1sKLyogRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHdhcm5p bmcgYW5kIGVycm9yIGNhbGxiYWNrcy4gICovCnR5cGVkZWYgdm9pZApmc2FsZXhfd2Fybl9j YWxsYmFja19mbiAoY29uc3QgY2hhciAqKTsKdHlwZWRlZiB2b2lkIC8qID8/IF9Ob3JldHVy bj8gKi8KZnNhbGV4X2Vycm9yX2NhbGxiYWNrX2ZuIChjb25zdCBjaGFyICopOwoKLyogUmVj ZWl2ZSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGV4Y2VwdGlvbnMgZGV0ZWN0ZWQgYnkgdGhl IGxleGVyOgogICBXYXJuaW5ncyBhbmQgZXJyb3JzLiAgSW50ZXJuYWxseSwgd2UgYWRkIHRo ZSBfTm9yZXR1cm4gYXR0cmlidXRlCiAgIHRvIHRoZSBlcnJvciBjYWxsYmFjaywgdG8gaGVs cCB0aGUgY29tcGlsZXIgd2l0aCBjb2RlIGZsb3cKICAgYW5hbHlzaXMuICAqLwpleHRlcm4g dm9pZApmc2FsZXhfZXhjZXB0aW9uX2ZucyAoZnNhbGV4X2N0eHRfdCAqbGV4ZXIsCiAgICAg ICAgICAgICAgICAgICAgICBmc2FsZXhfd2Fybl9jYWxsYmFja19mbiAqd2FybmluZ2ZuLAog ICAgICAgICAgICAgICAgICAgICAgZnNhbGV4X2Vycm9yX2NhbGxiYWNrX2ZuICplcnJvcmZu KTsKCl1dKSkKCi0tIEFkZCBpbnRlcmZhY2UgdG8gbGV4KCkgZm9yIHVzZSBieSB0aGUgcGFy c2VyLgphc3NlcnQoZjp3cml0ZShbWwovKiBNYWluIGZ1bmN0aW9uIHRvIGluY3JlbWVudGFs bHkgY29uc3VtZSBhbmQgaW50ZXJwcmV0IHRoZSBwYXR0ZXJuCiAgIHRleHQsIGFuZCByZXR1 cm4gYSB0b2tlbiBkZXNjcmliaW5nIGEgc2luZ2xlIGxleGljYWwgZWxlbWVudCBhcyBhCiAg IHRva2VuLCBwZXJoYXBzIHdpdGggaW1wbGllZCBwYXJhbWV0ZXJzIHN1Y2ggYXMgY2hhcmFj dGVyIGNsYXNzZXMKICAgZm9yIENTRVQgdG9rZW5zLCBhbmQge21pbixtYXh9IHZhbHVlcyBm b3IgZWFjaCBSRVBNTiB0b2tlbi4gIFRoZQogICB1c2VyIHNob3VsZCBjYWxsIHRoaXMgZnVu Y3Rpb24gcmVwZWF0ZWRseSwgcmVjZWl2aW5nIG9uZSB0b2tlbiBlYWNoCiAgIHRpbWUsIHVu dGlsIHRoZSBsZXhlciBkZXRlY3RzIGEgZmF0YWwgZXJyb3IsIG9yIHJldHVybnMgdGhlIEVO RAogICB0b2tlbi4gICovCi8qIFRoaXMgZnVuY3Rpb24gbXVzdCBjb25mb3JtIHRvIHByb3Rv X2xleHBhcnNlX2xleF9mbl90LiAgKi8KXV0pKQpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNb ImxleCJdKQoKLS0gTm9uLWNvcmUgaW50ZXJhY3Rpb25zIGJldHdlZW4gbGV4ZXIgYW5kIHBh cnNlciBkb25lIGJ5IGEgcGx1Zy1pbiBmdW5jdGlvbi4KV3JpdGVFeHRlcm5EZWNsKGYsIERl Y2xzWyJsZXgtZXhjaGFuZ2UiXSkKCi0tIEZpbmFsbHksIGFkZCB0cmFpbGVyIGxpbmVzIChp ZGVtcG90ZW5jeSwgdmltKQphc3NlcnQoZjp3cml0ZShbWwoKI2lmZGVmIF9fY3BsdXNwbHVz Cn0KI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCgojZW5kaWYgLyogRlNBTEVYX0ggKi8KCi8q IHZpbTpzZXQgc2hpZnR3aWR0aD0yOiAqLwpdXSkpCgphc3NlcnQoZjpjbG9zZSgpKQoKLS0t LS0tLS0tLS0tLS0tLSoqKioqKioqIGZzYWxleC5jICoqKioqKioqLS0tLS0tLS0tLS0tLS0t LQoKcHJpbnQoIkNyZWF0aW5nIGZzYWxleC5jLi4uIikKbG9jYWwgZiA9IGFzc2VydChpby5v cGVuKCJmc2FsZXguYyIsICJ3IikpCmFzc2VydChmOndyaXRlKFtbCi8qIGZzYWxleCAtIFJl cGFja2FnZSBwYXR0ZXJuIHRleHQgYXMgY29tcGFjdCwgZXhwcmVzc2l2ZSB0b2tlbnMKCl1d KSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29weXJpZ2h0LmRmYWMiKSwgIlxuIikpCmFz c2VydChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VXYXJyYW50eS5kZmFjIiksICJcbiIpKQph c3NlcnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3JzLmRmYWMiKSkpCmFzc2VydChmOndyaXRl KFtbCgovKiAyMDE0OiBSZXBhY2thZ2VkIGJ5ICJ1bnRhbmdsZSIgc2NyaXB0LCB3cml0dGVu IGJ5IGJlaG9mZnNraS4gICovCgovKiBBbHdheXMgaW1wb3J0IGVudmlyb25tZW50LXNwZWNp ZmljIGNvbmZpZ3VyYXRpb24gaXRlbXMgZmlyc3QuICAqLwojaW5jbHVkZSA8Y29uZmlnLmg+ ICAgIC8qIGRlZmluZSBfR05VX1NPVVJDRSBmb3IgcmVnZXggZXh0ZW5zaW9ucy4gICovCgoj aW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJjaGFyY2xhc3MuaCIKI2luY2x1ZGUgPGN0 eXBlLmg+CiNpbmNsdWRlICJmc2FsZXguaCIKI2luY2x1ZGUgImZzYXRva2VuLmgiCiNpbmNs dWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGxvY2FsZS5oPgojaW5jbHVkZSAibWJjc2V0cy5o IgojaW5jbHVkZSAicHJvdG8tbGV4cGFyc2UuaCIKI2luY2x1ZGUgPHJlZ2V4Lmg+CiNpbmNs dWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPHN0ZGxpYi5o PgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx3Y3R5cGUuaD4KI2luY2x1ZGUgInhh bGxvYy5oIgoKXV0pKQoKLS0gSW5jbHVkZSBnZXR0ZXh0IGxvY2FsZSBzdXBwb3J0IGZvciBz dHJpbmdzOiBfKCJtZXNzYWdlIikKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiTmF0dXJhbExh bmdTdXBwb3J0IiksICJcbiIpKQoKLS0gR2VuZXJhbCBoZWxwZXIgbWFjcm9zCmFzc2VydChm OndyaXRlKFJhd1RleHQoIklTQVNDSUlESUdJVCIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUo UmF3VGV4dCgiU1RSRVEiKSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIk1JTiIp LCAiXG4iKSkKCi0tIERlZmluZSB0aGUgcHJlZGljYXRlICp0ZW1wbGF0ZSogbGlzdCBiZWZv cmUgZmxlc2hpbmcgb3V0IHRoZSBtYWluCi0tIGxleGVyIHN0cnVjdCwgYXMgd2UgbmVlZCB0 byBjb3B5IHRoZSB0ZW1wbGF0ZSwgdmVyYmF0aW0sIGludG8gdGhlCi0tIGxleGVyIGNvbnRl eHQgd2hlbiBhIG5ldyBsZXhlciBpcyBpbml0aWFsaXNlZCAodGhlcmUgbWF5IGJlCi0tIHJl YXNvbnMsIHN1Y2ggYXMgbG9jYWxlLCB0aGF0IHRoZSBzYW1lIHByZWRpY2F0ZSBtaWdodCBt YXAgdG8KLS0gZGlmZmVyZW50IGVsZW1lbnRzIGluIGRpZmZlcmVudCBsZXhlcnMpLgphc3Nl cnQoZjp3cml0ZShbWwovKiBUaGUgZm9sbG93aW5nIGxpc3QgbWFwcyB0aGUgbmFtZXMgb2Yg dGhlIFBvc2l4IG5hbWVkIGNoYXJhY3RlcgogICBjbGFzc2VzIHRvIHByZWRpY2F0ZSBmdW5j dGlvbnMgdGhhdCBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuCiAgIGNoYXJhY3RlciBpcyBp biB0aGUgY2xhc3MuICBUaGUgbGVhZGluZyBbIGhhcyBhbHJlYWR5IGJlZW4gZWF0ZW4gYnkK ICAgdGhlIGxleGljYWwgYW5hbHl6ZXIuICBBZGRpdGlvbmFsIG9iamVjdHMgYXJlIHByb3Zp ZGVkIHRvIGFzc2lzdAogICB0aGUgY2xpZW50OiB3Y2hhcl9kZXNjIGZvciBtdWx0aWJ5dGUg bWF0Y2hpbmcsIGFuZCBjbGFzcyBmb3Igb2N0ZXQKICAgbWF0Y2hpbmcuICBMYXp5IGV2YWx1 YXRpb24gYW5kIGNhY2hpbmcgYXJlIHVzZWQgdG8gbWluaW1pc2UKICAgcHJvY2Vzc2luZyBj b3N0cywgc28gdGhlc2UgYWRkaXRpb25hbCBpdGVtcyBhcmUgb25seSB2YWxpZCBhZnRlciBh CiAgIGNsYXNzIGhhcyBiZWVuIGxvY2F0ZWQgdXNpbmcgZmluZF9wcmVkICgpLiAgKi8KdHlw ZWRlZiBpbnQgcHJlZGljYXRlX3QgKHdpbnRfdCwgd2N0eXBlX3QpOwp0eXBlZGVmIHN0cnVj dCBwcmVkaWNhdGVfZW50cnlfc3RydWN0CnsKICBjb25zdCBjaGFyICpuYW1lOwogIHdjdHlw ZV90IHdjaGFyX2Rlc2M7CiAgY2hhcmNsYXNzX3QgKmNsYXNzOwogIGJvb2wgbWF5X2JlX211 bHRpYnl0ZTsKfSBwcmVkaWNhdGVfZW50cnlfdDsKCi8qIFRoaXMgbGlzdCBpcyBhIHRlbXBs YXRlLCBjb3BpZWQgaW50byBlYWNoIGxleGVyJ3Mgc3RhdGUsIGFuZAogICBpbnRlcnJvZ2F0 ZWQgYW5kIHVwZGF0ZWQgZnJvbSB0aGVyZS4gIFRoZSBtZW1iZXJzaGlwIG9mIGEgY2xhc3Mg Y2FuCiAgIHZhcnkgZHVlIHRvIGxvY2FsZSBhbmQgb3RoZXIgc2V0dGluZ3MsIHNvIGVhY2gg bGV4ZXIgbXVzdCBtYWludGFpbgogICBpdHMgb3duIGxpc3QuICBEdXBsaWNhdGUgY2xhc3Mg c2hhcmluZyBhY3Jvc3MgZGlmZmVyZW50IGxleGVyCiAgIGluc3RhbmNlcyBpcyBmYWNpbGl0 YXRlZCBieSBjaGVja3MgaW4gY2hhcmNsYXNzX2NvbXBsZXRlZC4gICovCi8qIExvY2FsZSBw b3J0YWJpbGl0eSBub3RlOiBXZSBtYXkgbmVlZCB0byByZWNvcmQgdGhlIGVudGlyZSBleHBs aWNpdAogICBsb2NhbGUgd2hlbiBzeW50YXggKCkgaXMgY2FsbGVkLCBhbmQgdGhlbiB1c2Ug aXNhbHBoYV9sICgpIGV0Yy4KICAgaGVyZSwgYXMgb3RoZXJ3aXNlIHRoZSB3Y2hhcl9kZXNj IG1heSBiZSBpbnRlcnByZXRlZCBhdCBydW50aW1lIGluCiAgIHRoZSBjb250ZXh0IG9mIHRo ZSBjdXJyZW50IGxvY2FsZS4gIElmIGEgY29tcGxldGUgY29weSBvZiB0aGUgbG9jYWxlCiAg IG5lZWRzIHRvIGJlIHN0b3JlZCBsb2NhbGx5LCBzZWUgdXNlbG9jYWxlKDMpIGFuZCBkdXBs b2NhbGUoMykgKGFuZAogICBmcmVlIHRoZSBjb3B5IHdpdGggZnJlZWxvY2FsZSgzKSkuICAq LwpzdGF0aWMgcHJlZGljYXRlX2VudHJ5X3QgdGVtcGxhdGVfcHJlZGljYXRlX2xpc3RbXSA9 IHsKICB7ImFscGhhIiwgIDAsIE5VTEwsIHRydWV9LAogIHsiYWxudW0iLCAgMCwgTlVMTCwg dHJ1ZX0sCiAgeyJibGFuayIsICAwLCBOVUxMLCB0cnVlfSwKICB7ImNudHJsIiwgIDAsIE5V TEwsIHRydWV9LAogIHsiZGlnaXQiLCAgMCwgTlVMTCwgZmFsc2V9LAogIHsiZ3JhcGgiLCAg MCwgTlVMTCwgdHJ1ZX0sCiAgeyJsb3dlciIsICAwLCBOVUxMLCB0cnVlfSwKICB7InByaW50 IiwgIDAsIE5VTEwsIHRydWV9LAogIHsicHVuY3QiLCAgMCwgTlVMTCwgdHJ1ZX0sCiAgeyJz cGFjZSIsICAwLCBOVUxMLCB0cnVlfSwKICB7InVwcGVyIiwgIDAsIE5VTEwsIHRydWV9LAog IHsieGRpZ2l0IiwgMCwgTlVMTCwgdHJ1ZX0sCiAge05VTEwsIDAsIE5VTEx9Cn07CgojZGVm aW5lIFBSRURJQ0FURV9URU1QTEFURV9JVEVNUyBcCiAgICAoc2l6ZW9mIHRlbXBsYXRlX3By ZWRpY2F0ZV9saXN0IC8gc2l6ZW9mICp0ZW1wbGF0ZV9wcmVkaWNhdGVfbGlzdCkKCl1dKSkK CmFzc2VydChmOndyaXRlKFtbCi8qIEZsZXNoIG91dCB0aGUgb3BhcXVlIGluc3RhbmNlIGNv bnRleHQgdHlwZSBnaXZlbiBpbiB0aGUgaGVhZGVyLiAgKi8Kc3RydWN0IGZzYWxleF9jdHh0 X3N0cnVjdAp7CiAgLyogU2lnbmF0dXJlL2NhbmFyeSB0b2tlbiBmb3IgYm90dG9tIG9mIHN0 cnVjdC4gICovCiAgdW5zaWduZWQgbG9uZyB0b3BfZmVuY2VfbWFnaWNfbnI7CgogIC8qIFNp bmdseS1saW5rZWQgbGlzdCBvZiBhbGwgbGV4ZXIgaW5zdGFuY2VzLCBzbyBkZXN0cm95X21v ZHVsZSBjYW4KICAgICByZWxlYXNlIGFsbCByZXNvdXJjZXMgYnkgdHJhdmVyc2luZyB0aGUg bGlzdC4gICovCiAgZnNhbGV4X2N0eHRfdCAqbmV4dF9pbnN0YW5jZTsKCiAgLyogVXNpbmcg dGhlIGxleGVyIHdpdGhvdXQgc2V0dGluZyB0aGUgc3ludGF4IGlzIGEgZmF0YWwgZXJyb3Is IHNvCiAgICAgdXNlIGEgZmxhZyBzbyB3ZSBjYW4gcmVwb3J0IHN1Y2ggZXJyb3JzIGluIGEg ZGlyZWN0IGZhc2hpb24uICAqLwogIGJvb2wgc3ludGF4X2luaXRpYWxpc2VkOwoKICAvKiBT eW50YXggZmxhZ3MvY2hhcmFjdGVycyBkaXJlY3RpbmcgaG93IHRvIGludGVycHJldCB0aGUg cGF0dGVybi4gICovCiAgcmVnX3N5bnRheF90IHN5bnRheF9iaXRzOwogIGJvb2wgY2FzZV9m b2xkOwogIHVuc2lnbmVkIGNoYXIgZW9sYnl0ZTsKCiAgLyogRXhjZXB0aW9uIGhhbmRsaW5n IGlzIGRvbmUgYnkgZXhwbGljaXQgY2FsbGJhY2tzLiAgKi8KICBmc2FsZXhfd2Fybl9jYWxs YmFja19mbiAqd2Fybl9jbGllbnQ7CiAgZnNhbGV4X2Vycm9yX2NhbGxiYWNrX2ZuICphYmFu ZG9uX3dpdGhfZXJyb3I7CgogIC8qIFBhdHRlcm4gcG9pbnRlci9sZW5ndGgsIHVwZGF0ZWQg YXMgcGF0dGVybiBpcyBjb25zdW1lZC4gICovCiAgY2hhciBjb25zdCAqbGV4cHRyOwogIHNp emVfdCBsZXhsZWZ0OwoKICAvKiBCcmVhayBvdXQgc29tZSByZWdleCBzeW50YXggYml0cyBp bnRvIGJvb2xlYW4gdmFycy4gIERvIHRoaXMgZm9yCiAgICAgdGhlIG9uZXMgdGhhdCBhcmUg aGVhdmlseSB1c2VkLCBhbmQvb3Igd2hlcmUgdGhlIG5hdHVyZSBvZiB0aGUKICAgICBiaXRt YXNrIGZsYWcgdGVzdCB0ZW5kcyB0byBjbHV0dGVyIHRoZSBsZXhlciBjb2RlLiAgKi8KICBi b29sIHJlX2dudV9vcHM7ICAgICAgICAgICAgIC8qIEdOVSByZWdleCBvcGVyYXRvcnMgYXJl IGFsbG93ZWQuICAqLwoKICAvKiBDYXJyeSBkb3RjbGFzcyBoZXJlLCBhcyBpdCdzIGVhc2ll ciBmb3IgY2xpZW50cyAoVVRGLTgpIHRvIHBlcmZvcm0KICAgICBjbGFzcyBvcGVyYXRpb25z IHdpdGggdGhpcyBjbGFzcywgcmF0aGVyIHRoYW4gdG8ga25vdyBpbnRpbWF0ZQogICAgIGRl dGFpbHMgb2YgdGhlIHJlZ2V4IHN5bnRheCBjb25maWd1cmF0aW9uIGJpdHMgYW5kIGl0ZW1z IHN1Y2ggYXMKICAgICBlb2xieXRlLiAgKi8KICBjaGFyY2xhc3NfdCAqZG90Y2xhc3M7ICAg ICAgICAgLyogIi4iOiBBbGwgY2hhcnMgZXhjZXB0IGVvbGJ5dGUgYW5kL29yCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUwsIGRlcGVuZGluZyBvbiBzeW50 YXggZmxhZ3MuICAqLwogIGNoYXJjbGFzc19pbmRleF90IGRvdGNsYXNzX2luZGV4OwoKICAv KiBXb3JrIHZhcmlhYmxlcyB0byBoZWxwIG9yZ2FuaXNlIGxleGVyIG9wZXJhdGlvbi4gICov CiAgZnNhdG9rZW5fdG9rZW5fdCBsYXN0dG9rOwogIGJvb2wgbGFzdHN0YXJ0OwogIHNpemVf dCBwYXJlbnM7CgogIC8qIENoYXJhY3RlciBjbGFzcyBwcmVkaWNhdGUgbWFwcGluZy9jYWNo aW5nIHRhYmxlLiAgKi8KICBwcmVkaWNhdGVfZW50cnlfdCBwcmVkaWNhdGVzW1BSRURJQ0FU RV9URU1QTEFURV9JVEVNU107CgogIC8qIE1pbnJlcCBhbmQgbWF4cmVwIGFyZSBhY3R1YWxs eSBhc3NvY2lhdGVkIHdpdGggdGhlIFJFUE1OIHRva2VuLAogICAgIGFuZCBuZWVkIHRvIGJl IGFjY2Vzc2libGUgb3V0c2lkZSB0aGlzIG1vZHVsZSAoYnkgdGhlIHBhcnNlciksCiAgICAg cGVyaGFwcyBieSBhbiBleHBsaWNpdCBpbnRlcmZhY2UgY2FsbC4gIEluIHRoZSBmYXIsIGZh ciBmdXR1cmUsCiAgICAgYSBjb21wbGV0ZWx5LXJld29ya2VkIHRva2VuIGxpc3QgbWF5IHNl ZSB0aGVzZSB2YWx1ZXMgcHJvcGVybHkKICAgICBiZWNvbWUgaW50ZWdyYXRlZCBpbnRvIHRo ZSB0b2tlbiBzdHJlYW0gKHBlcmhhcHMgYnkgYSBwYWlyIG9mCiAgICAgIlBhcmFtZXRlciIg dG9rZW5zPyAgUGVyaGFwcyBieSBhIE1JTlJFUCB0b2tlbiB3aXRoIDEgcGFyYW1ldGVyLAog ICAgIGZvbGxvd2VkIGJ5IGEgTUFYUkVQIHRva2VuIHdpdGggYSBjb3JyZXNwb25kaW5nIHBh cmFtZXRlcj8pICAqLwogIGludCBtaW5yZXAsIG1heHJlcDsKCiAgLyogQm9vbGVhbnMgdG8g c2ltcGxpZnkgdW5pYnl0ZS9tdWx0aWJ5dGUgY29kZSBzZWxlY3Rpb24gcGF0aHMuICBJbgog ICAgIGFkZGl0aW9uLCBvdGhlciBmbGFncyBhcmUgcGxhY2VkIGhlcmUgdG8gc3VtbWFyaXNl IHByb3BlcnRpZXMgb2YKICAgICB0aGUgbG9jYWxlIGluIGEgY29uY2lzZSBmYXNoaW9uIHRo YXQgY2FuIHVzZWZ1bCB3aGVuCiAgICAgaW1wbGVtZW50aW5nIG9wdGltaXNhdGlvbnMuICBU aGVyZSBtYXkgYmUgc29tZSBvdmVybGFwIGFuZC9vcgogICAgIHJlZHVuZGFuY3kgaGVyZTsg ZmxhZyBuYW1lcyBhcmUgY2hvc2VuIHRvIGxldCB0aGUgdXNlciBiZSBkaXJlY3QKICAgICBh bmQgY29uY2lzZSwgYnV0IHdlIG9ubHkgcHJvdmlkZSBuYW1lcyBmb3IgdGhlIG1vcmUgcG9w dWxhciBjYXNlcywKICAgICBub3QgYWxsLiAgKi8KICBjaGFyICpsb2NhbGVfbmFtZTsKICBi b29sIHVuaWJ5dGVfbG9jYWxlOwogIGJvb2wgbXVsdGlieXRlX2xvY2FsZTsKICBib29sIGFz Y2lpXzdiaXRfZW5jb2Rpbmc7CiAgYm9vbCB1c2luZ19zaW1wbGVfbG9jYWxlOwoKICAvKiBS RVZJRVdNRTogV2lkZS1jaGFyYWN0ZXIgc3VwcG9ydCB2YXJpYWJsZXMuICAqLwogIGludCBj dXJfbWJfbGVuOyAgICAgICAvKiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbGFzdCBjaGFy YWN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZDsgdGhpcyBpcyBuZWVk ZWQgd2hlbiBiYWNraW5nIHVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBs ZXhpbmcuICBJbiBhIG5vbi1tdWx0aWJ5dGUgc2l0dWF0aW9uCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIChsb2NhbGU/KSwgdGhpcyB2YXJpYWJsZSByZW1haW5zIGF0IDE7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgdXBkYXRlZCBhcyByZXF1 aXJlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICBGRVRDSF9XQy4gICovCgogIC8q IFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBvbmx5IGlmIGluIGEgbXVsdGlieXRlIGxvY2Fs ZS4gICovCiAgd2NoYXJfdCB3Y3RvazsgICAgICAgICAvKiBTdG9yYWdlIGZvciBhIHNpbmds ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNl ZCBib3RoIGR1cmluZyBsZXhpbmcsIGFuZCBhcyB0aGUgaW1wbGllZAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGEgV0NIQVIgdG9rZW4gcmV0dXJuZWQgYnkg dGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhlci4gICovCiAgbWJzdGF0ZV90 IG1icnRvd2Nfc3RhdGU7IC8qIFN0YXRlIG1hbmFnZW1lbnQgYXJlYSBmb3IgbWJydG93YyB0 bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UuICovCgpdXSkpCgphc3NlcnQo Zjp3cml0ZShFZGl0ZWRUZXh0KCJkZmEtc3RydWN0IG1icnRvd2NfY2FjaGUiLAogICAgICAg ICAgICAgICAgICAgICAgICAgICJOT1RDSEFSIiwgIkZTQVRPS0VOX05PVENIQVIiKSwgIlxu IikpCgotLSBVc2UgbWJjc2V0cyB0byBoYW5kbGUgbXVsdGlieXRlIHNldHMsIGluc3RlYWQg b2YgZG9pbmcgdGhlc2UKLS0gb3Vyc2VsdmVzCmFzc2VydChmOndyaXRlKFtbCiAgbWJjc2V0 c19zZXRfdCAqKm1iY3NldHM7CiAgc2l6ZV90IG5tYmNzZXRzOwogIHNpemVfdCBtYmNzZXRz X2FsbG9jOwpdXSkpCgphc3NlcnQoZjp3cml0ZShbWwogIC8qIFNpZ25hdHVyZS9jYW5hcnkg dG9rZW4gZm9yIGJvdHRvbSBvZiBzdHJ1Y3QuICAqLwogIHVuc2lnbmVkIGxvbmcgYm90dG9t X2ZlbmNlX21hZ2ljX25yOwp9OwojZGVmaW5lIENPTlRFWFRfVE9QX0ZFTkNFX01BR0lDX05S ICAgIDB4MzUxOGMzOGV1TAojZGVmaW5lIENPTlRFWFRfQk9UVE9NX0ZFTkNFX01BR0lDX05S IDB4MDIxZThlMGV1TAojZGVmaW5lIENIRUNLX0NPTlRFWFQoY3R4dCkgIFwKICBhc3NlcnQg KCgoY3R4dCkgIT0gTlVMTCkgICAgICAgXAogICAmJiAoKGN0eHQpLT50b3BfZmVuY2VfbWFn aWNfbnIgICAgPT0gQ09OVEVYVF9UT1BfRkVOQ0VfTUFHSUNfTlIpICBcCiAgICYmICgoY3R4 dCktPmJvdHRvbV9mZW5jZV9tYWdpY19uciA9PSBDT05URVhUX0JPVFRPTV9GRU5DRV9NQUdJ Q19OUikpCgovKiBMaW5rZWQgbGlzdCBvZiBhbGwgaW5zdGFuY2VzIGNyZWF0ZWQgYnkgdGhp cyBtb2R1bGUuICAqLwpzdGF0aWMgZnNhbGV4X2N0eHRfdCAqZnNhbGV4X2luc3RhbmNlX2xp c3RfaGVhZCA9IE5VTEw7CgpdXSkpCgotLSBBZGQgdXRpbGl0eSBmdW5jdGlvbiAibWF5YmUt cmVhbGxvYyIsIHByZXZpb3VzbHkKLS0gIlJFQUxMT0NfSUZfTkVDRVNTQVJZIiwgaGVyZSwg YXMgYSBnZW5lcmljIGhlbHBlciBmdW50aW9uIHBsYWNlZAotLSBpbW1lZGlhdGVseSBhZnRl ciB0aGUgdHlwZS9zdHJ1Y3R1cmUgZGVmaW5pdGlvbnMsIGJ1dCBiZWZvcmUKLS0gaW50ZXJs aW5rZWQgc2V0cyBvZiBoZWxwZXIgZnVuY3Rpb25zIHN1Y2ggYXMgInNldGJpdF9jYXNlX2Zv bGRfYyIuCmFzc2VydChmOndyaXRlKFJhd1RleHQoIm1heWJlLXJlYWxsb2MiKSwgIlxuIikp Cgphc3NlcnQoZjp3cml0ZShFZGl0ZWRUZXh0KCJzZXRiaXQ6OndjaGFyX3QgY29tbWVudCIs CiAgICAgICAgIkV2ZW4gZm9yIE1CX0NVUl9NQVggPT0gMSwiLCAiRXZlbiBpbiB1bmlieXRl IGxvY2FsZXMsIikpKQoKLS0gVXAgdW50aWwgdG9kYXkgKDkgTWFyIDIwMTQpLCBzZXRiaXRf Y2FzZV9mb2xkX2MgZnJvbSB2LiAyLjE3IHdhcyBhCi0tIGJpdCBvZiBhIG1lc3MsIGFuZCB3 ZWxsIHdpdGhpbiBteSBzaWdodHMgdG8gY2xlYW4gdXAuICBIb3dldmVyLAotLSBsYXN0IG5p Z2h0LCBJIHJlc3luY2VkIHdpdGggdGhlIGxhdGVzdCBnaXQgbWFzdGVyLCBhbmQgaXQgaGFz IGJlZW4KLS0gcmVjZW50bHkgY2xlYW5lZCB1cCBpbnRvIGEgdmVyc2lvbiB0aGF0J3MgcHJv YmFibHkgYmV0dGVyIHRoYW4gd2hhdAotLSBJIHdhcyBjb250ZW1wbGF0aW5nLiAgKE15IG1h aWwgZmVlZCBzY3Jld2VkIHVwIGp1c3QgYWZ0ZXIgdGhlIDIuMTcKLS0gcmVsZWFzZSwgYW5k IHNvIEkgbWlzc2VkIGEgd2VlayBvciB0d28ncyB3b3J0aCBvZiBtZXNzYWdlcy4pCmFzc2Vy dChmOndyaXRlKEZTQVRva2VuU3Vic3QoRWRpdGVkVGV4dCgic2V0Yml0X2Nhc2VfZm9sZF9j IiwKICAgICAgICAgICJjaGFyY2xhc3MgYyIsICJjaGFyY2xhc3NfdCAqYyIsCiAgICAgICAg ICAiXG4gICAgICBzZXRiaXQgJShpLCBjJSkiLCAiXG4gICAgICBjaGFyY2xhc3Nfc2V0Yml0 IChpLCBjKSIsCiAgICAgICAgICAiIE1CX0NVUl9NQVggbXVzdCBiZSAxLiIsICJXZSBtdXN0 IGJlIGluIGFuIHVuaWJ5dGUgbG9jYWxlLiIpKSwKICAgICAgICAgICAgICAgIlxuIikpCgot LSB0b191Y2hhciBjb252ZXJ0cyBhIGNoYXIgdG8gdW5zaWduZWQgY2hhciwgdXNpbmcgYSBm dW5jdGlvbiBjYWxsCi0tIHJhdGhlciB0aGFuIG1lcmVseSB0eXBlY2FzdGluZyBhcyBpdCBj YXRjaGVzIHNvbWUgdHlwZSBlcnJvcnMgdGhhdAotLSB0aGUgY2FzdCBkb2Vzbid0LiAgVGhp cyBmbiBpcyB1c2VkIGluIEZFVENIX1NJTkdMRV9DSEFSLgphc3NlcnQoZjp3cml0ZShSYXdU ZXh0KCJ0b191Y2hhcl90eXBlY2hlY2siKSwgIlxuIikpCgotLSBTaW5nbGUtYnl0ZSBhbmQg bXVsdGlieXRlIGNoYXJhY3RlciBmZXRjaGluZywgcmVhcnJhbmdlZCBieSBoYW5kLgotLSBN ZXJlbHkgd3JpdGUgZGZhdG9tYmNhY2hlIHZlcmJhdGltIGF0IGZpcnN0OyB3ZSB3aWxsIG5l ZWQgdG8KLS0gbW9kaWZ5IHRoaXMgdG8gd29yayBwcm9wZXJseS4KCi0tYXNzZXJ0KGY6d3Jp dGUoUmF3VGV4dCgiZGZhbWJjYWNoZS1hbmQtbWJzX3RvX3djaGFyIiksICJcbiIpKQphc3Nl cnQoZjp3cml0ZShFZGl0ZWRUZXh0KCJkZmFtYmNhY2hlIiwKICAgICAgImRmYW1iY2FjaGUg JShzdHJ1Y3QgZGZhICUqZCIsCiAgICAgICJpbml0aWFsaXNlX3VjaGFyX3RvX3djX2NhY2hl IChmc2FsZXhfY3R4dF90ICpsZXhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImQl LT5tYnJ0b3djX2NhY2hlIiwgImxleGVyLT5tYnJ0b3djX2NhY2hlIiksCiAgICAgICAgICAg ICAgICJcbiIpKQotLV1dCgphc3NlcnQoZjp3cml0ZShbWwovKiBUaGlzIGZ1bmN0aW9uIGlz IGludGltYXRlbHkgY29ubmVjdGVkIHdpdGggbXVsdGlieXRlICh3aWRlLWNoYXIpCiAgIGhh bmRsaW5nIGluIHRoZSBtYWNybyBGRVRDSF9XQyBiZWxvdywgaW4gdGhlIGNhc2Ugd2hlcmUK ICAgRkVUQ0hfU0lOR0xFX0NIQVIgaGFzIHJ1biBidXQgdGhlIHJlc3VsdCBoYXMgYmVlbiBm b3VuZCB0byBiZQogICBpbmNvbmNsdXNpdmUuICBJdCB3b3JrcyBieSB1bndpbmRpbmcgdGhl IEZFVENIX1NJTkdMRV9DSEFSCiAgIHNpZGUtZWZmZWN0cyAobGV4cHRyL2xleGxlZnQpLCB0 aGVuIGNhbGxpbmcgbWJydG93YyBvbiB0aGUgcGF0dGVybgogICBzcGFjZSwgYW5kIGNvbW11 bmljYXRlcyBtYnJ0b3djJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGUgb2N0ZXQKICAgc3RyZWFt IGJhY2sgdG8gdGhlIGNhbGxlcjoKICAgICAtIElmIGEgdmFsaWQgbXVsdGlieXRlIG9jdGV0 IHNlcXVlbmNlIGlzIG5leHQsIHRoZW4gdGhlIHdpZGUKICAgICAgIGNoYXJhY3RlciBhc3Nv Y2lhdGVkIHdpdGggdGhpcyBzZXF1ZW5jZSBpcyB3cml0dGVuIGJhY2sgdG8KICAgICAgICpw X3djaGFyLCBhbmQgdGhlIG51bWJlciBvZiBvY3RldHMgY29uc3VtZWQgaXMgcmV0dXJuZWQ7 IG9yCiAgICAgLSBJZiB0aGUgc2VxdWVuY2UgaXMgaW52YWxpZCBmb3IgYW55IHJlYXNvbiwg dGhlIG1icnRvd2Mgd29ya2luZwogICAgICAgc3RhdGUgaXMgcmVzZXQgKHplcm9lZCksICpw X3djaGFyIGlzIG5vdCBtb2RpZmllZCwgYW5kIDEgaXMKICAgICAgIHJldHVybmVkLgogICBM ZXhlciBzdGF0ZSB2YXJpYWJsZXMsIGluY2x1ZGluZyBjdXJfbWJfbGVuLCBtYnMsIGxleGxl ZnQgYW5kCiAgIGxleHB0ciwgYXJlIHVwZGF0ZWQgYXMgYXBwcm9wcmlhdGUgYnkgdGhpcyBm dW5jdGlvbiAobWFpbmx5IGlmCiAgIG1icnRvd2Mgc3VjY2VlZHMpLiAgVGhlIHdpZGUgY2hh ciBOVUwgaXMgdW51c3VhbCBhcyBpdCBpcyBhCiAgIDEtb2N0ZXQgc2VxdWVuY2UsIHRoZSBs ZW5ndGggcmV0dXJuZWQgaXMgMCwgd2UgcmVwb3J0IGl0IGFzIGxlbmd0aAogICAxLCBidXQg d3JpdGUgdGhlIGNvbnZlcnRlZCB3aWRlIGNoYXJhY3RlciBpbiB0ZW1wX3djaGFyIHRvIHRo ZQogICBjYWxsZXIuICAqLwovKiBBZGRpdGlvbmFsIG5vdGVzOiAgVGhpcyBjb2RlLCBpbiBw YXJ0bmVyc2hpcCB3aXRoIHRoZSBtYWNybwogICBGRVRDSF9XQywgaXMgY2xvc2VseSByZWxh dGVkIHRvIG1ic190b193Y2hhciBpbiBkZmEuYy4gIFRoZXJlIGlzCiAgIGRvY3VtZW50YXRp b24gdGhlcmUgKGUuZy4gcGF0dGVybiBtdXN0IGVuZCBpbiBhIHNlbnRpbmVsLCBzaGlmdAog ICBlbmNvZGluZ3Mgbm90IHN1cHBvcnRlZCwgcGx1cyBvdGhlciBjb21tZW50cy9ndWFyYW50 ZWVzKSB0aGF0IGlzCiAgIGltcG9ydGFudCwgYnV0IEknbSBkZWZlcnJpbmcgd3JpdGluZyB1 cCBhbnl0aGluZyBhdCBwcmVzZW50IHVudGlsCiAgIEkgc2VlIGhvdyB0aGlzIGNvZGUgaXMg cmVjZWl2ZWQuICAqLwpzdGF0aWMgc2l6ZV90CmZldGNoX29mZnNldF93aWRlX2NoYXIgKGZz YWxleF9jdHh0X3QgKmxleGVyLCB3Y2hhcl90ICpwX3djaGFyKQp7CiAgc2l6ZV90IG5ieXRl czsKICB3Y2hhcl90IHRlbXBfd2NoYXI7CgogIG5ieXRlcyA9IG1icnRvd2MgKCZ0ZW1wX3dj aGFyLAogICAgICAgICAgICAgICAgICAgIGxleGVyLT5sZXhwdHIgLSAxLCBsZXhlci0+bGV4 bGVmdCArIDEsCiAgICAgICAgICAgICAgICAgICAgJmxleGVyLT5tYnJ0b3djX3N0YXRlKTsK ICBzd2l0Y2ggKG5ieXRlcykKICAgIHsKICAgIGNhc2UgKHNpemVfdCkgLTI6CiAgICBjYXNl IChzaXplX3QpIC0xOgogICAgICAvKiBDb252ZXJzaW9uIGZhaWxlZDogSW5jb21wbGV0ZSAo LTIpIG9yIGludmFsaWQgKC0xKQogICAgICAgICBzZXF1ZW5jZS4gICovCiAgICAgIG1lbXNl dCAoJmxleGVyLT5tYnJ0b3djX3N0YXRlLCAwLCBzaXplb2YgKGxleGVyLT5tYnJ0b3djX3N0 YXRlKSk7CiAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgKHNpemVfdCkgMDoKICAgICAgLyog VGhpcyBpcyB0aGUgd2lkZSBOVUwgY2hhcmFjdGVyLCBhY3R1YWxseSAxIGJ5dGUgbG9uZy4g Ki8KICAgICAgbmJ5dGVzID0gMTsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAg LyogQ29udmVydGVkIGNoYXJhY3RlciBpcyBpbiB0ZW1wX3djaGFyLCBhbmQgbmJ5dGVzIGlz IGEgYnl0ZQogICAgICAgICBjb3VudC4gICovCiAgICAgIGJyZWFrOwogICAgfQogIC8qIFdl IGNvbnZlcnRlZCAxIG9yIG1vcmUgYnl0ZXMsIHRlbGwgcmVzdWx0IHRvIGNhbGxlci4gICov CiAgKnBfd2NoYXIgPSB0ZW1wX3djaGFyOwoKICAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBi eXRlcyBjb25zdW1lZCAob2Zmc2V0IGJ5IDEgc2luY2UKICAgICBGRVRDSF9TSU5HTEVfQ0hB UiBncmFiYmVkIG9uZSBlYXJsaWVyKS4gICovCiAgbGV4ZXItPmxleHB0ciAgKz0gbmJ5dGVz IC0gMTsKICBsZXhlci0+bGV4bGVmdCAtPSBuYnl0ZXMgLSAxOwoKICByZXR1cm4gbmJ5dGVz Owp9CgpdXSkpCgphc3NlcnQoZjp3cml0ZShbWwovKiBTaW5nbGUtY2hhcmFjdGVyIGlucHV0 IGZldGNoLCB3aXRoIEVPRi9lcnJvciBoYW5kbGluZy4gIE5vdGUgdGhhdAogICBjaGFyYWN0 ZXJzIGJlY29tZSB1bnNpZ25lZCBoZXJlLiAgSWYgbm8gY2hhcmFjdGVycyBhcmUgYXZhaWxh YmxlLAogICB0aGUgbWFjcm8gZWl0aGVyIHJldHVybnMgRU5EIG9yIHJlcG9ydHMgYW4gZXJy b3IsIGRlcGVuZGluZyBvbgogICBlb2ZlcnIuICBPdGhlcndpc2UsIG9uZSBjaGFyYWN0ZXIg aXMgY29uc3VtZWQgKGxleHB0ci9sZXhsZWZ0KSwKICAgdGhlIGNoYXIgaXMgY29udmVydGVk IGludG8gYW4gdW5zaWduZWQgY2hhciwgYW5kIGlzIHdyaXR0ZW4gaW50bwogICB0aGUgcGFy YW1ldGVyIGMuICAqLwojZGVmaW5lIEZFVENIX1NJTkdMRV9DSEFSKGxleGVyLCBjLCBlb2Zl cnIpICAgICAgICAgICAgICAgICAgXAogIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaWYgKCEgKGxleGVyKS0+bGV4 bGVmdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAg ICAgIGlmICgoZW9mZXJyKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAogICAgICAgICAgKGxleGVyKS0+YWJhbmRvbl93aXRoX2Vycm9yIChlb2ZlcnIpOyAg ICAgICAgICAgICAgXAogICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgcmV0dXJuIEZTQVRPS0VOX1RLX0VO RDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKGMpID0gdG9f dWNoYXIgKCoobGV4ZXIpLT5sZXhwdHIrKyk7ICAgICAgICAgICAgICAgICAgICAgXAogICAg KGxleGVyKS0+bGV4bGVmdC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAogIH0gd2hpbGUgKDApCgovKiBEbyB0aGUgZmV0Y2ggaW4gc3RhZ2VzOiBTaW5nbGUg Y2hhciwgb2N0ZXQrbXVsdGlieXRlIGNhY2hlCiAgIGNoZWNrLCBhbmQgcG9zc2libGUgd2lk ZSBjaGFyIGZldGNoIGlmIHRoZSBjYWNoZSByZXN1bHQgaW5kaWNhdGVzCiAgIHRoYXQgdGhl IGlucHV0IHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGEgc2luZ2xlIG9jdGV0LiAgVGhlIGZp cnN0CiAgIGZldGNoIGhhbmRsZXMgZW5kLW9mLWlucHV0IGNhc2VzIChpZiB0aGlzIGhhcHBl bnMsIGNvbnRyb2wgbmV2ZXIKICAgcmVhY2hlcyB0aGUgcmVzdCBvZiB0aGUgbWFjcm8pOyBv dGhlcndpc2UsIGl0IHJldHVybnMgdGVtcF91Y2hhcgogICB3aGljaCBpcyB1c2VkIGluIHRo ZSBjYWNoZSBsb29rdXAsIGFuZCBtYXkgYmUgdGhlIHNpbmdsZS1vY3RldAogICByZXN1bHQu ICBBIGNhY2hlIHJlc3VsdCBvZiBXRU9GIG1lYW5zIHRoYXQgdGhlIG9jdGV0IGlzIG5vdCBh CiAgIGNvbXBsZXRlIHNlcXVlbmNlIGJ5IGl0c2VsZiwgc28gYSBzZWNvbmQgZmV0Y2ggdHdl YWtzIGxleHB0ci9sZXhsZWZ0CiAgIHRvIHVuZG8gdGhlIHNpbmdsZS1jaGFyLWZldGNoIHNp ZGUtZWZmZWN0cywgYW5kLCBkZXBlbmRpbmcgb24KICAgbWJydG93YyB2YWxpZC9pbnZhbGlk IHJlc3VsdCwgcHJvcGFnYXRlcyBlaXRoZXIgdGhlIG11bHRpY2hhciBmZXRjaAogICBvciB0 aGUgc2luZ2xlLWNoYXIgZmV0Y2ggYmFjayB0byB0aGUgY2FsbGVyLiAgKi8KIyBkZWZpbmUg RkVUQ0hfV0MobGV4ZXIsIGMsIHdjLCBlb2ZlcnIpICAgICAgICAgICAgICAgICAgICAgIFwK ICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKICAgIHdjaGFyX3QgdGVtcF93YzsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGNoYXIgdGVtcF91Y2hhcjsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChsZXhlciktPmN1cl9tYl9sZW4gPSAx OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIEZFVENIX1NJTkdMRV9D SEFSICgobGV4ZXIpLCB0ZW1wX3VjaGFyLCAoZW9mZXJyKSk7ICAgICAgIFwKICAgIHRlbXBf d2MgPSAobGV4ZXIpLT5tYnJ0b3djX2NhY2hlW3RlbXBfdWNoYXJdOyAgICAgICAgICAgIFwK ICAgIGlmICh0ZW1wX3djICE9IFdFT0YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKICAgICAgICAoYykgID0gdGVtcF91Y2hhcjsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAod2MpID0gdGVtcF93YzsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGVsc2Ug ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK ICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKICAgICAgICBzaXplX3QgbmJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKICAgICAgICB0ZW1wX3djID0gdGVtcF91Y2hhcjsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBuYnl0ZXMgPSBmZXRjaF9vZmZz ZXRfd2lkZV9jaGFyICgobGV4ZXIpLCAmdGVtcF93Yyk7IFwKICAgICAgICAod2MpID0gdGVt cF93YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAo YykgPSBuYnl0ZXMgPT0gMSA/IHRlbXBfdWNoYXIgOiBFT0Y7ICAgICAgICAgICAgICAgIFwK ICAgICAgICAobGV4ZXIpLT5jdXJfbWJfbGVuID0gbmJ5dGVzOyAgICAgICAgICAgICAgICAg ICAgICAgIFwKICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKICB9IHdoaWxlICgwKQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUo W1sKLyogR2l2ZW4gYSBwcmVkaWNhdGUgbmFtZSwgZmluZCBpdCBpbiBhIGxpc3QsIGFuZCBy ZXBvcnQgdGhlIGxpc3QKICAgZW50cnkgdG8gdGhlIGNhbGxlci4gIElmIHRoZSBuYW1lIGlz IG5vdCByZWNvZ25pc2VkLCB0aGUgZnVuY3Rpb24KICAgcmV0dXJucyBOVUxMLiAgVGhlIGxp c3QgZW50cnkgaW5jbHVkZXMgYSBjaGFyY2xhc3Mgc2V0IGFuZCAoaWYKICAgcmVsZXZhbnQp IGEgd2lkZS1jaGFyIGRlc2NyaXB0b3IgZm9yIHRlc3RpbmcgZm9yIHRoZSBwcmVkaWNhdGUu CiAgIExhenkgZXZhbHVhdGlvbiBhbmQgY2FjaGluZyBhcmUgdXNlZCB0byBrZWVwIHByb2Nl c3NpbmcgY29zdHMKICAgZG93bi4gICovCnN0YXRpYyBwcmVkaWNhdGVfZW50cnlfdCAqCmZp bmRfcHJlZCAoZnNhbGV4X2N0eHRfdCAqbGV4ZXIsIGNvbnN0IGNoYXIgKnN0cikKewogIHBy ZWRpY2F0ZV9lbnRyeV90ICpwX2VudHJ5OwogIGNoYXJjbGFzc190ICp3b3JrX2NsYXNzOwoK ICBmb3IgKHBfZW50cnkgPSBsZXhlci0+cHJlZGljYXRlczsgcF9lbnRyeS0+bmFtZTsgcF9l bnRyeSsrKQogICAgewogICAgICBpZiAoU1RSRVEgKHN0ciwgcF9lbnRyeS0+bmFtZSkpCiAg ICAgICAgYnJlYWs7CiAgICB9CgogIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaGluZyBwcmVk aWNhdGUgbmFtZSBmb3VuZCwgcmV0dXJuIE5VTEwuICAqLwogIGlmICghIHBfZW50cnktPm5h bWUpCiAgICByZXR1cm4gTlVMTDsKCiAgLyogSXMgdGhlIGNoYXJjbGFzcyBwb2ludGVyIE5V TEwgZm9yIHRoaXMgZW50cnk/ICovCiAgaWYgKHBfZW50cnktPmNsYXNzID09IE5VTEwpCiAg ICB7CiAgICAgIC8qIFllcywgYWxsb2NhdGUsIHNldCB1cCBhbmQgY2FjaGUgYSBjaGFyY2xh c3MgZm9yIHRoaXMKICAgICAgICAgcHJlZGljYXRlLiAgTm90ZSB0aGF0IHRoZSB3Y2hhcl9k ZXNjIGVudHJpZXMgd2VyZSBzZXQgdXAgaW4KICAgICAgICAgZnNhbGV4X3N5bnRheCAoKS4g ICovCiAgICAgIGludCBpOwogICAgICBjaGFyY2xhc3NfaW5kZXhfdCBpbmRleDsKICAgICAg d2N0eXBlX3Qgd2N0eXBlX2Rlc2M7CgogICAgICB3Y3R5cGVfZGVzYyA9IHBfZW50cnktPndj aGFyX2Rlc2M7CiAgICAgIHdvcmtfY2xhc3MgPSBjaGFyY2xhc3NfYWxsb2MgKCk7CiAgICAg IGZvciAoaSA9IDA7IGkgPCBGU0FUT0tFTl9OT1RDSEFSOyBpKyspCiAgICAgICAgewogICAg ICAgICAgd2NoYXJfdCB3YzsKCiAgICAgICAgICAvKiBUcnkgaW50ZWdlci0+dW5zaWduZWQg Y2hhci0+d2lkZSBjaGFyIHVzaW5nIGxleGVyJ3MKICAgICAgICAgICAgIG1icnRvd2NfY2Fj aGUgYXJyYXksIGFuZCwgaWYgc3VjY2Vzc2Z1bCwgdGVzdCBmb3IgY2xhc3MKICAgICAgICAg ICAgIG1lbWJlcnNoaXAsIGFuZCBzZXQgdGhlIGJpdCBpbiB0aGUgY2xhc3MgaWYgdGhlIHZh bHVlIGlzCiAgICAgICAgICAgICBhIG1lbWJlci4gICovCiAgICAgICAgICAvKiBGSVhNRTog aXN3Y3R5cGUgZGVwZW5kcyBvbiB0aGUgKmN1cnJlbnQqIGxvY2FsZQogICAgICAgICAgICAg KExDX0NUWVBFKTsgdGhpcyBicmVha3MgdGhlIGxvbmctdGVybSBnb2FsIG9mIGhhdmluZyBl YWNoCiAgICAgICAgICAgICBsZXhlciBpbnN0YW5jZSB1c2Ugb25seSB0aGUgbG9jYWxlIGlu IGZvcmNlIHdoZW4KICAgICAgICAgICAgIGZzYWxleF9zeW50YXggd2FzIGNhbGxlZC4gIFdl IGNhbiBmaXggdGhpcyBieSB1c2luZwogICAgICAgICAgICAgaXNhbG51bV9sICgpIGV0YyBo ZXJlLCBidXQgY2FycnlpbmcgYXJvdW5kIGEgZnVsbCBjb3B5IG9mCiAgICAgICAgICAgICB0 aGUgbG9jYWxlIGluIHRoZSBsZXhlciBpbnN0YW5jZSBtYXkgYmUgZXhwZW5zaXZlIG9yCiAg ICAgICAgICAgICBwb3NzaWJseSBub24tcG9ydGFibGUsIHNvIGl0J3MgYmVpbmcgYXZvaWRl ZCB3aGlsZSB0aGlzCiAgICAgICAgICAgICBjb2RlIGlzIHN0aWxsIGluIGFuIGV4cGVyaW1l bnRhbC9wcm9vZi1vZi1jb25jZXB0CiAgICAgICAgICAgICBmb3JtLiAgKi8KICAgICAgICAg IHdjID0gbGV4ZXItPm1icnRvd2NfY2FjaGVbaV07CiAgICAgICAgICBpZiAoaXN3Y3R5cGUg KHdjLCB3Y3R5cGVfZGVzYykpCiAgICAgICAgICAgIGNoYXJjbGFzc19zZXRiaXQgKGksIHdv cmtfY2xhc3MpOwogICAgICAgIH0KCiAgICAgIC8qIE1hcmsgdGhlIGNsYXNzIGFzIGNvbXBs ZXRlZCwgYW5kIG9idGFpbiBhIHBlcnNpc3RlbnQgY2xhc3MKICAgICAgICAgcG9pbnRlci4g ICovCiAgICAgIGluZGV4ID0gY2hhcmNsYXNzX2NvbXBsZXRlZCAod29ya19jbGFzcyk7CiAg ICAgIHBfZW50cnktPmNsYXNzID0gY2hhcmNsYXNzX2dldF9wb2ludGVyIChpbmRleCk7Cgog ICAgfQoKICAvKiBSZXR1cm4gcHJlZGljYXRlIGVudHJ5IHRvIHRoZSBjYWxsZXIuICAqLwog IHJldHVybiBwX2VudHJ5Owp9CgpdXSkpCgotLSBSZWNlbnRseS1hZGRlZCBtdWx0aWJ5dGUg Y29kZTogbG9uZXNvbWVfbG93ZXIsIGNhc2VfZm9sZGVkX2NvdW50ZXJwYXJ0cwphc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJ1bmljb2RlLWxvbmVzb21lLWxvd2VyLXRhYmxlIiksICJcbiIp KQoKLS0gQWRkIGluIENBU0VfRk9MREVEX0JVRlNJWkUgYW5kIGNhc2VfZm9sZGVkX2NvdW50 ZXJwYXJ0cyBjb2RlCi0tIGFkZGVkIEZlYi9NYXIgMjAxNDsgcmV2aXNlZCBNYXkgMjAxNCB0 byBmaXQgd2l0aGluIFBST1RPX0xFWFBBUlNFCi0tIGluZnJhc3RydWN0dXJlLgphc3NlcnQo Zjp3cml0ZShbWwovKiBNYXhpbXVtIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMgdGhhdCBj YW4gYmUgdGhlIGNhc2UtZm9sZGVkCiAgIGNvdW50ZXJwYXJ0cyBvZiBhIHNpbmdsZSB3aWRl IGNoYXJhY3Rlciwgbm90IGNvdW50aW5nIHRoZSBjaGFyYWN0ZXIKICAgaXRzZWxmLiAgVGhp cyBpcyAxIGZvciB0b3d1cHBlciwgMSBmb3IgdG93bG93ZXIsIGFuZCAxIGZvciBlYWNoCiAg IGVudHJ5IGluIGxvbmVzb21lX2xvd2VyW10uICAqLwplbnVtIHsgQ0FTRV9GT0xERURfQlVG U0laRSA9IDEgKyAxICsgMTkgfTsKCl1dKSkKCmFzc2VydChmOndyaXRlKFtbCi8qIEdpdmVu IGEgd2lkZSBjaGFyYWN0ZXIgYywgYW5kIHdvcmtpbmcgdG8gYSBzZWFyY2ggc3BlY2lmaWNh dGlvbgogICB0aGF0IGRlbWFuZHMgdGhhdCBjYXNlLWZvbGRlZCB2YXJpYW50cyBvZiB0aGUg Y2hhcmFjdGVyIG11c3QgbWF0Y2gKICAgd2hlcmV2ZXIgdGhhdCBjaGFyYWN0ZXIgY291bGQg bWF0Y2gsIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwKICAgcG9zc2libGUgbWF0Y2ggY291bnRl cnBhcnRzIHRvIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLCBhbmQgcmV0dXJuCiAgIHRoYXQg bGlzdCwgdGhlIGNoYXJhY3RlcnMgdmlhIGEgcGFyYW1ldGVyIHBvaW50ZXIsIGFuZCB0aGUg bGlzdAogICBsZW5ndGggKHBvc3NpYmx5IDApIHZpYSB0aGUgZnVuY3Rpb24gcmV0dXJuIHZh bHVlLiAgKi8KLyogPz8gQ0hFQ0tNRTogU2hvdWxkIHBhcmFtZXRlciAiYyIgaW4sIGFuZC9v ciAiZm9sZGVkIiBvdXQsIGJlIHdpbnRfdD8gICovCnN0YXRpYyBpbnQKY2FzZV9mb2xkZWRf Y291bnRlcnBhcnRzIChmc2FsZXhfY3R4dF90ICpsZXhlciwKICAgICAgICAgICAgICAgICAg ICAgICAgICB3Y2hhcl90IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBm b2xkZWRbQ0FTRV9GT0xERURfQlVGU0laRV0pCl1dKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4 dCgiY2FzZV9mb2xkZWRfY291bnRlcnBhcnRzLWJvZHkiKSwgIlxuIikpCgotLSBXcml0ZSBv dXQgcGFyc2VfYnJhY2tldF9leHAgZGVjbGFyYXRpb24sIG1vZGlmaWVkIHRvIHJldHVybiBh bgotLSBmc2F0b2tlbiB2YWx1ZSwgYW5kIHRvIGluY2x1ZGUgYSBsZXhlciBjb250ZXh0IGEg c2luZ2xlIGlucHV0Ci0tIHBhcmFtZXRlci4KYXNzZXJ0KGY6d3JpdGUoRWRpdGVkVGV4dCgi cGFyc2VfYnJhY2tldF9leHAtZGVjbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJz dGF0aWMgdG9rZW4iLCAic3RhdGljIGZzYXRva2VuX3Rva2VuX3QiLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAiJSh2b2lkJSkiLCAiKGZzYWxleF9jdHh0X3QgKmxleGVyKSIpKSkK Ci0tIFJlbW92ZSB6ZXJvY2xhc3MgZGVmaW5pdGlvbiBmcm9tIGEgbmVzdGVkIHBsYWNlIGlu c2lkZQotLSBwYXJzZV9icmFja2V0X2V4cCBhcyB3ZSBub3cgZGVwZW5kIG9uIGNoYXJjbGFz cydzIGd1YXJhbnRlZSB0aGF0Ci0tIGNsYXNzIGluZGV4IDAgaXMgdGhlIHplcm9zZXQuCmxv Y2FsIFBhcnNlQnJhY2tldEV4cCA9IFJhd1RleHQoInBhcnNlX2JyYWNrZXRfZXhwLWJvZHki KQoKLS0gQ2xhc3NlcyBhcmUgbm93IG9wYXF1ZS4KUGFyc2VCcmFja2V0RXhwID0gVGV4dFN1 YnN0KFBhcnNlQnJhY2tldEV4cCwgW1sKewogIGJvb2wgaW52ZXJ0OwogIGludCBjLCBjMSwg YzI7CiAgY2hhcmNsYXNzIGNjbDsKXV0sIFtbCnsKICBib29sIGludmVydDsKICBpbnQgYywg YzEsIGMyOwogIGNoYXJjbGFzc190ICpjY2w7CiAgbWJjc2V0c19zZXRfdCAqd29ya19tYmMg PSBOVUxMOwoKXV0pCgotLSBSZXBsYWNlIGRmYWVycm9yIGFuZCBkZmF3YXJuIHdpdGggZXhw bGljaXRseS1wcm92aWRlZCBmdW5jdGlvbnMuClBhcnNlQnJhY2tldEV4cCA9IFRleHRTdWJz dChQYXJzZUJyYWNrZXRFeHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRmYXdh cm4gIiwgICIgbGV4ZXItPndhcm5fY2xpZW50ICIsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiIGRmYWVycm9yICIsICIgbGV4ZXItPmFiYW5kb25fd2l0aF9lcnJvciAiKQoKLS0g Pz8gVFJJQUw6IFJlbW92ZSAiRklYTUU6IG11bHRpYnl0ZSBjb2RlICd3cm9uZyBpbiBtdWx0 aXBsZSB3YXlzLCBidXQKLS0gICAgICAgICAgICAgICAgICAgbmV2ZXIgdXNlZCBpbiBwcmFj dGljZS4nIgpQYXJzZUJyYWNrZXRFeHAgPSBUZXh0U3Vic3QoUGFyc2VCcmFja2V0RXhwLCBb WwogICAgICAgICAgICAgICAgICAvKiBXaGVuIGNhc2UgZm9sZGluZyBtYXAgYSByYW5nZSwg c2F5IFttLXpdIChvciBldmVuIFtNLXpdKQogICAgICAgICAgICAgICAgICAgICB0byB0aGUg cGFpciBvZiByYW5nZXMsIFttLXpdIFtNLVpdLiAgQWx0aG91Z2ggdGhpcyBjb2RlCiAgICAg ICAgICAgICAgICAgICAgIGlzIHdyb25nIGluIG11bHRpcGxlIHdheXMsIGl0J3MgbmV2ZXIg dXNlZCBpbiBwcmFjdGljZS4KICAgICAgICAgICAgICAgICAgICAgRklYTUU6IFJlbW92ZSB0 aGlzIChhbmQgcmVsYXRlZCkgdW51c2VkIGNvZGUuICAqLwogICAgICAgICAgICAgICAgICBp ZiAod2MgIT0gV0VPRiAmJiB3YzIgIT0gV0VPRikKICAgICAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgICAgICB3b3JrX21iYy0+cmFuZ2VzCiAgICAgICAgICAgICAgICAg ICAgICAgID0gbWF5YmVfcmVhbGxvYyAod29ya19tYmMtPnJhbmdlcywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrX21iYy0+bnJhbmdlcyArIDIsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlc19hbCwgc2l6 ZW9mICp3b3JrX21iYy0+cmFuZ2VzKTsKICAgICAgICAgICAgICAgICAgICAgIHdvcmtfbWJj LT5yYW5nZXNbd29ya19tYmMtPm5yYW5nZXNdLmJlZwogICAgICAgICAgICAgICAgICAgICAg ICA9IGNhc2VfZm9sZCA/IHRvd2xvd2VyICh3YykgOiB3YzsKICAgICAgICAgICAgICAgICAg ICAgIHdvcmtfbWJjLT5yYW5nZXNbd29ya19tYmMtPm5yYW5nZXMrK10uZW5kCiAgICAgICAg ICAgICAgICAgICAgICAgID0gY2FzZV9mb2xkID8gdG93bG93ZXIgKHdjMikgOiB3YzI7Cgog ICAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VfZm9sZCAmJiAoaXN3YWxwaGEgKHdjKSB8 fCBpc3dhbHBoYSAod2MyKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgICAgICAgICAgICB3b3JrX21iYy0+cmFuZ2VzW3dvcmtfbWJjLT5ucmFuZ2VzXS5i ZWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdG93dXBwZXIgKHdjKTsKICAgICAg ICAgICAgICAgICAgICAgICAgICB3b3JrX21iYy0+cmFuZ2VzW3dvcmtfbWJjLT5ucmFuZ2Vz KytdLmVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0b3d1cHBlciAod2MyKTsK ICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KXV0sIFtb CiAgICAgICAgICAgICAgICAgIC8qIE1lcmVseSByZWNvcmQgcmFuZ2UgYXMgZ2l2ZW47IGRv bid0IHRyeSB0byBoYW5kbGUgdGhlCiAgICAgICAgICAgICAgICAgICAgIGNhc2UtZm9sZGlu ZyB2YXJpYW50cyBoZXJlIGZvciBub3cuICAqLwogICAgICAgICAgICAgICAgICBpZiAod2Mg IT0gV0VPRiAmJiB3YzIgIT0gV0VPRikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgICBtYmNzZXRzX2FkZF9yYW5nZSh3b3JrX21iYywgd2MsIHdjMik7Cgog ICAgICAgICAgICAgICAgICAgICAgLyogRklYTUUsIHBhcnQgMjogIFNpbmNlIHRoZSBjYW5v bmljYWwgbWVhc3VyZSBvZiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFs ZW5jZSBpcyB1cHBlcmNhc2UoQSkgPT0gdXBwZXJjYXNlKEIpLCBwZXJoYXBzCiAgICAgICAg ICAgICAgICAgICAgICAgICB3ZSBjb3VsZCBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uIGFib3Zl IGlmIGNhc2VfZm9sZAogICAgICAgICAgICAgICAgICAgICAgICAgaXMgdHJ1ZS4uLiBidXQg bmVlZCB0byBiZSBjYXJlZnVsIG5vdCB0byB0aHJvdyBhd2F5CiAgICAgICAgICAgICAgICAg ICAgICAgICBpbmZvcm1hdGlvbi4gICovCiAgICAgICAgICAgICAgICAgICAgfQpdXSkKCi0t IE1CQ1NFVFM6IENoYW5nZSBtdWx0aWJ5dGUgaW5pdGlhbGlzYXRpb24gdG8gdXNlIG1iY3Nl dHMgbW9kdWxlLgotLSBDaGFuZ2UgIndvcmsiIGNoYXJjbGFzcyAoY2NsKSBmcm9tIGxvY2Fs IHZhcmlhYmxlIHRvIGV4cGxpY2l0bHktYWxsb2NhdGVkCi0tIGR5bmFtaWMgY2xhc3MgZnJv bSBjaGFyY2xhc3MuClBhcnNlQnJhY2tldEV4cCA9IFRleHRTdWJzdChQYXJzZUJyYWNrZXRF eHAsIFtbCiAgLyogV29yayBhcmVhIHRvIGJ1aWxkIGEgbWJfY2hhcl9jbGFzc2VzLiAgKi8K ICBzdHJ1Y3QgbWJfY2hhcl9jbGFzc2VzICp3b3JrX21iYzsKICBzaXplX3QgY2hhcnNfYWws IHJhbmdlc19hbCwgY2hfY2xhc3Nlc19hbCwgZXF1aXZzX2FsLCBjb2xsX2VsZW1zX2FsOwoK ICBjaGFyc19hbCA9IHJhbmdlc19hbCA9IGNoX2NsYXNzZXNfYWwgPSBlcXVpdnNfYWwgPSBj b2xsX2VsZW1zX2FsID0gMDsKICBpZiAoZGZhLT5tdWx0aWJ5dGUpCiAgICB7CiAgICAgIGRm YS0+bWJjc2V0cyA9IG1heWJlX3JlYWxsb2MgKGRmYS0+bWJjc2V0cywgZGZhLT5ubWJjc2V0 cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRmYS0+bWJjc2V0c19h bGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICpkZmEt Pm1iY3NldHMpOwoKICAgICAgLyogZGZhLT5tdWx0aWJ5dGVfcHJvcFtdIGhvbGQgdGhlIGlu ZGV4IG9mIGRmYS0+bWJjc2V0cy4KICAgICAgICAgV2Ugd2lsbCB1cGRhdGUgZGZhLT5tdWx0 aWJ5dGVfcHJvcFtdIGluIGFkZHRvaywgYmVjYXVzZSB3ZSBjYW4ndAogICAgICAgICBkZWNp ZGUgdGhlIGluZGV4IGluIGRmYS0+dG9rZW5zW10uICAqLwoKICAgICAgLyogSW5pdGlhbGl6 ZSB3b3JrIGFyZWEuICAqLwogICAgICB3b3JrX21iYyA9ICYoZGZhLT5tYmNzZXRzW2RmYS0+ bm1iY3NldHMrK10pOwogICAgICBtZW1zZXQgKHdvcmtfbWJjLCAwLCBzaXplb2YgKndvcmtf bWJjKTsKICAgIH0KICBlbHNlCiAgICB3b3JrX21iYyA9IE5VTEw7CgogIG1lbXNldCAoY2Ns LCAwLCBzaXplb2YgY2NsKTsKICBGRVRDSF9XQyAoYywgd2MsIF8oInVuYmFsYW5jZWQgWyIp KTsKICBpZiAoYyA9PSAnXicpCiAgICB7CiAgICAgIEZFVENIX1dDIChjLCB3YywgXygidW5i YWxhbmNlZCBbIikpOwogICAgICBpbnZlcnQgPSB0cnVlOwogICAgICBrbm93bl9icmFja2V0 X2V4cCA9IHVzaW5nX3NpbXBsZV9sb2NhbGUgKCk7CiAgICB9CiAgZWxzZQogICAgaW52ZXJ0 ID0gZmFsc2U7Cl1dLCBbWwogIGlmIChsZXhlci0+bXVsdGlieXRlX2xvY2FsZSkKICAgIHsK ICAgICAgLyogRW5zdXJlIHdlIGhhdmUgc3BhY2UgdG8gc3RvcmUgdGhlIG5ldyBzZXQuICAq LwogICAgICBsZXhlci0+bWJjc2V0cyA9IG1heWJlX3JlYWxsb2MgKGxleGVyLT5tYmNzZXRz LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleGVyLT5ubWJjc2V0 cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV4ZXItPm1iY3Nl dHNfYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9m IHdvcmtfbWJjKTsKCiAgICAgIC8qIEluaXRpYWxpemUgd29yayBhcmVhLiAgKi8KICAgICAg d29ya19tYmMgPSBtYmNzZXRzX25ldyAoKTsKICAgICAgbGV4ZXItPm1iY3NldHNbbGV4ZXIt Pm5tYmNzZXRzKytdID0gd29ya19tYmM7CiAgICB9CgogIGNjbCA9IGNoYXJjbGFzc19hbGxv YyAoKTsKICBGRVRDSF9XQyAoYywgd2MsIF8oInVuYmFsYW5jZWQgWyIpKTsKICBpZiAoYyA9 PSAnXicpCiAgICB7CiAgICAgIEZFVENIX1dDIChjLCB3YywgXygidW5iYWxhbmNlZCBbIikp OwogICAgICBpbnZlcnQgPSB0cnVlOwogICAgICBrbm93bl9icmFja2V0X2V4cCA9IGxleGVy LT51c2luZ19zaW1wbGVfbG9jYWxlOwogICAgfQogIGVsc2UKICAgIGludmVydCA9IGZhbHNl OwpdXSkKCi0tIENoYW5nZSBmaW5kX3ByZWQgY29kZSB0byB1c2UgdGhlIHR5cGVkZWYsIGFu ZCB0byBtZXJnZSB0aGUgZm91bmQKLS0gcHJlZGljYXRlIHN0YXRpYyBjbGFzcyBpbnRvIHRo ZSBmdW5jdGlvbidzIGR5bmFtaWMgY2xhc3MuICBBbHNvCi0tIHJlcGxhY2UgZGZhZXJyb3Ig d2l0aCBpbnRlcm5hbCBhYmFuZG9uX3dpdGhfZXJyb3IuClBhcnNlQnJhY2tldEV4cCA9IFRl eHRTdWJzdChQYXJzZUJyYWNrZXRFeHAsIFtbCiAgICAgICAgICAgICAgaWYgKGMxID09ICc6 JykKICAgICAgICAgICAgICAgIC8qIEJ1aWxkIGNoYXJhY3RlciBjbGFzcy4gIFBPU0lYIGFs bG93cyBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgIGNsYXNzZXMgdG8gbWF0Y2ggbXVs dGljaGFyYWN0ZXIgY29sbGF0aW5nIGVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgYnV0 IHRoZSByZWdleCBjb2RlIGRvZXMgbm90IHN1cHBvcnQgdGhhdCwgc28gZG8gbm90CiAgICAg ICAgICAgICAgICAgICB3b3JyeSBhYm91dCB0aGF0IHBvc3NpYmlsaXR5LiAgKi8KICAgICAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqY2xhc3MKICAgICAg ICAgICAgICAgICAgICA9IChjYXNlX2ZvbGQgJiYgKFNUUkVRIChzdHIsICJ1cHBlciIpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBTVFJFUSAoc3RyLCAibG93 ZXIiKSkgPyAiYWxwaGEiIDogc3RyKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0 IGRmYV9jdHlwZSAqcHJlZCA9IGZpbmRfcHJlZCAoY2xhc3MpOwogICAgICAgICAgICAgICAg ICBpZiAoIXByZWQpCiAgICAgICAgICAgICAgICAgICAgZGZhZXJyb3IgKF8oImludmFsaWQg Y2hhcmFjdGVyIGNsYXNzIikpOwoKICAgICAgICAgICAgICAgICAgaWYgKGRmYS0+bXVsdGli eXRlICYmICFwcmVkLT5zaW5nbGVfYnl0ZV9vbmx5KQogICAgICAgICAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBjaGFyYWN0ZXIgY2xhc3MgYXMg d2N0eXBlX3QuICAqLwogICAgICAgICAgICAgICAgICAgICAgd2N0eXBlX3Qgd3QgPSB3Y3R5 cGUgKGNsYXNzKTsKCiAgICAgICAgICAgICAgICAgICAgICB3b3JrX21iYy0+Y2hfY2xhc3Nl cwogICAgICAgICAgICAgICAgICAgICAgICA9IG1heWJlX3JlYWxsb2MgKHdvcmtfbWJjLT5j aF9jbGFzc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdv cmtfbWJjLT5uY2hfY2xhc3NlcywgJmNoX2NsYXNzZXNfYWwsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICp3b3JrX21iYy0+Y2hfY2xhc3Nlcyk7 CiAgICAgICAgICAgICAgICAgICAgICB3b3JrX21iYy0+Y2hfY2xhc3Nlc1t3b3JrX21iYy0+ bmNoX2NsYXNzZXMrK10gPSB3dDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAg ICAgICAgICBmb3IgKGMyID0gMDsgYzIgPCBOT1RDSEFSOyArK2MyKQogICAgICAgICAgICAg ICAgICAgIGlmIChwcmVkLT5mdW5jIChjMikpCiAgICAgICAgICAgICAgICAgICAgICBzZXRi aXQgKGMyLCBjY2wpOwogICAgICAgICAgICAgICAgfQpdXSwgW1sKICAgICAgICAgICAgICBp ZiAoYzEgPT0gJzonKQogICAgICAgICAgICAgICAgLyogRmluZCBhbmQgbWVyZ2UgbmFtZWQg Y2hhcmFjdGVyIGNsYXNzLiAgUE9TSVggYWxsb3dzCiAgICAgICAgICAgICAgICAgICBjaGFy YWN0ZXIgY2xhc3NlcyB0byBtYXRjaCBtdWx0aWNoYXJhY3RlciBjb2xsYXRpbmcKICAgICAg ICAgICAgICAgICAgIGVsZW1lbnRzLCBidXQgdGhlIHJlZ2V4IGNvZGUgZG9lcyBub3Qgc3Vw cG9ydCB0aGF0LAogICAgICAgICAgICAgICAgICAgc28gZG8gbm90IHdvcnJ5IGFib3V0IHRo YXQgcG9zc2liaWxpdHkuICAqLwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICBjaGFyIGNvbnN0ICpjbGFzczsKICAgICAgICAgICAgICAgICAgcHJlZGljYXRlX2VudHJ5 X3QgKnByZWQ7CgogICAgICAgICAgICAgICAgICBjbGFzcyA9IHN0cjsKICAgICAgICAgICAg ICAgICAgaWYgKGNhc2VfZm9sZCAmJiAoU1RSRVEgKGNsYXNzLCAidXBwZXIiKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFNUUkVRIChjbGFzcywgImxvd2Vy IikpKQogICAgICAgICAgICAgICAgICAgIGNsYXNzID0gImFscGhhIjsKICAgICAgICAgICAg ICAgICAgcHJlZCA9IGZpbmRfcHJlZCAobGV4ZXIsIGNsYXNzKTsKICAgICAgICAgICAgICAg ICAgaWYgKCEgcHJlZCkKICAgICAgICAgICAgICAgICAgICBsZXhlci0+YWJhbmRvbl93aXRo X2Vycm9yIChfKCJpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyIpKTsKICAgICAgICAgICAgICAg ICAgY2hhcmNsYXNzX3VuaW9uc2V0IChwcmVkLT5jbGFzcywgY2NsKTsKCiAgICAgICAgICAg ICAgICAgIC8qIERvZXMgdGhpcyBjbGFzcyBoYXZlIGEgd2lkZS1jaGFyIHR5cGUgZGVzY3Jp cHRvcj8gKi8KICAgICAgICAgICAgICAgICAgaWYgKGxleGVyLT5tdWx0aWJ5dGVfbG9jYWxl ICYmIHByZWQtPm1heV9iZV9tdWx0aWJ5dGUpCiAgICAgICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgICAgbWJjc2V0c19hZGRfY2xhc3Mod29ya19tYmMsIHByZWQtPndj aGFyX2Rlc2MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KXV0p CgotLSBOb3cgaGF2ZSBhIGZsYWcsICJ1c2luZ19zaW1wbGVfbG9jYWxlIjsgYWxzbyB1c2Ug c2V0Yml0X3JhbmdlLgpQYXJzZUJyYWNrZXRFeHAgPSBUZXh0U3Vic3QoUGFyc2VCcmFja2V0 RXhwLCBbWwogICAgICAgICAgICAgIGVsc2UgaWYgKHVzaW5nX3NpbXBsZV9sb2NhbGUgKCkp CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGZvciAoYzEgPSBjOyBjMSA8 PSBjMjsgYzErKykKICAgICAgICAgICAgICAgICAgICBzZXRiaXQgKGMxLCBjY2wpOwogICAg ICAgICAgICAgICAgICBpZiAoY2FzZV9mb2xkKQogICAgICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICAgIGludCB1YyA9IHRvdXBwZXIgKGMpOwogICAgICAgICAgICAg ICAgICAgICAgaW50IHVjMiA9IHRvdXBwZXIgKGMyKTsKICAgICAgICAgICAgICAgICAgICAg IGZvciAoYzEgPSAwOyBjMSA8IE5PVENIQVI7IGMxKyspCiAgICAgICAgICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWMxID0gdG91cHBlciAoYzEp OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YyA8PSB1YzEgJiYgdWMxIDw9IHVj MikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGJpdCAoYzEsIGNjbCk7CiAgICAg ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9Cl1dLCBbWwogICAg ICAgICAgICAgIGVsc2UgaWYgKGxleGVyLT51c2luZ19zaW1wbGVfbG9jYWxlKQogICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICBjaGFyY2xhc3Nfc2V0Yml0X3JhbmdlIChj LCBjMiwgY2NsKTsKICAgICAgICAgICAgICAgICAgaWYgKGNhc2VfZm9sZCkKICAgICAgICAg ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgdWMgPSB0b3VwcGVyIChj KTsKICAgICAgICAgICAgICAgICAgICAgIGludCB1YzIgPSB0b3VwcGVyIChjMik7CiAgICAg ICAgICAgICAgICAgICAgICBmb3IgKGMxID0gMDsgYzEgPCBOT1RDSEFSOyBjMSsrKQogICAg ICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVj MSA9IHRvdXBwZXIgKGMxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWMgPD0g dWMxICYmIHVjMSA8PSB1YzIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyY2xh c3Nfc2V0Yml0IChjMSwgY2NsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAg ICAgICAgICAgICAgIH0KXV0pCgotLSBLZWVwIGNyYWNraW5nIGRvd24gb24gTUJfQ1VSX01B WCwgY2FzZS1ieS1jYXNlClBhcnNlQnJhY2tldEV4cCA9IFRleHRTdWJzdChQYXJzZUJyYWNr ZXRFeHAsIFtbCiAgICAgIGlmICghZGZhLT5tdWx0aWJ5dGUpCiAgICAgICAgewogICAgICAg ICAgaWYgKGNhc2VfZm9sZCkKICAgICAgICAgICAgc2V0Yml0X2Nhc2VfZm9sZF9jIChjLCBj Y2wpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzZXRiaXQgKGMsIGNjbCk7CiAgICAg ICAgICBjb250aW51ZTsKICAgICAgICB9Cl1dLCBbWwogICAgICBpZiAobGV4ZXItPnVuaWJ5 dGVfbG9jYWxlKQogICAgICAgIHsKICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCiAgICAgICAg ICAgIHNldGJpdF9jYXNlX2ZvbGRfYyAoYywgY2NsKTsKICAgICAgICAgIGVsc2UKICAgICAg ICAgICAgY2hhcmNsYXNzX3NldGJpdCAoYywgY2NsKTsKICAgICAgICAgIGNvbnRpbnVlOwog ICAgICAgIH0KXV0pClBhcnNlQnJhY2tldEV4cCA9IFRleHRTdWJzdChQYXJzZUJyYWNrZXRF eHAsIFtbCiAgICAgICAgICBpZiAoYzIgIT0gJ10nKQogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgaWYgKGMyID09ICdcXCcgJiYgKHN5bnRheF9iaXRzICYgUkVfQkFDS1NMQVNIX0VT Q0FQRV9JTl9MSVNUUykpCiAgICAgICAgICAgICAgICBGRVRDSF9XQyAoYzIsIHdjMiwgXygi dW5iYWxhbmNlZCBbIikpOwoKICAgICAgICAgICAgICBpZiAoZGZhLT5tdWx0aWJ5dGUpCiAg ICAgICAgICAgICAgICB7Cl1dLCBbWwogICAgICAgICAgaWYgKGMyICE9ICddJykKICAgICAg ICAgICAgewogICAgICAgICAgICAgIGlmIChjMiA9PSAnXFwnICYmIChzeW50YXhfYml0cyAm IFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMpKQogICAgICAgICAgICAgICAgRkVUQ0hf V0MgKGMyLCB3YzIsIF8oInVuYmFsYW5jZWQgWyIpKTsKCiAgICAgICAgICAgICAgaWYgKGxl eGVyLT5tdWx0aWJ5dGVfbG9jYWxlKQogICAgICAgICAgICAgICAgewpdXSkKCi0tIEhhY2sg YXJvdW5kIHdpdGggQ0FTRV9GT0xERURfQlVGU0laRSBjb2RlIGJ5IGhhbmQKUGFyc2VCcmFj a2V0RXhwID0gVGV4dFN1YnN0KFBhcnNlQnJhY2tldEV4cCwgW1sKICAgICAgICAgIHdjaGFy X3QgZm9sZGVkW0NBU0VfRk9MREVEX0JVRlNJWkUgKyAxXTsKICAgICAgICAgIGludCBpOwog ICAgICAgICAgaW50IG4gPSAoY2FzZV9mb2xkID8gY2FzZV9mb2xkZWRfY291bnRlcnBhcnRz ICh3YywgZm9sZGVkICsgMSkgKyAxCiAgICAgICAgICAgICAgICAgICA6IDEpOwogICAgICAg ICAgZm9sZGVkWzBdID0gd2M7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQog ICAgICAgICAgICBpZiAoIXNldGJpdF93YyAoZm9sZGVkW2ldLCBjY2wpKQogICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgIHdvcmtfbWJjLT5jaGFycwogICAgICAgICAgICAgICAg ICA9IG1heWJlX3JlYWxsb2MgKHdvcmtfbWJjLT5jaGFycywgd29ya19tYmMtPm5jaGFycywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfYWwsIHNpemVvZiAq d29ya19tYmMtPmNoYXJzKTsKICAgICAgICAgICAgICAgIHdvcmtfbWJjLT5jaGFyc1t3b3Jr X21iYy0+bmNoYXJzKytdID0gZm9sZGVkW2ldOwogICAgICAgICAgICAgIH0KXV0sIFtbCiAg ICAgICAgICB3Y2hhcl90IGZvbGRlZFtDQVNFX0ZPTERFRF9CVUZTSVpFICsgMV07CiAgICAg ICAgICBpbnQgbiA9IDE7CgogICAgICAgICAgZm9sZGVkWzBdID0gd2M7CiAgICAgICAgICBp ZiAoY2FzZV9mb2xkKQogICAgICAgICAgICBuICs9IGNhc2VfZm9sZGVkX2NvdW50ZXJwYXJ0 cyAobGV4ZXIsIHdjLCAmZm9sZGVkWzFdKTsKICAgICAgICAgIG1iY3NldHNfYWRkX3djaGFy X2xpc3QgKHdvcmtfbWJjLCBuLCBmb2xkZWQpOwpdXSkKCi0tIENvbnZlcnQgbW9kdWxlLWds b2JhbCB2YXJpYWJsZSByZWZlcmVuY2VzIHRvIGluc3RhbmNlLWxvY2FsIHJlZnMuClBhcnNl QnJhY2tldEV4cCA9IFRleHRTdWJzdChQYXJzZUJyYWNrZXRFeHAsIFtbCiAgICAgICAgICAg ICAgICAgIEZFVENIX1dDIChjLCB3YywgXygidW5iYWxhbmNlZCBbIikpOwogICAgICAgICAg ICAgICAgICBpZiAoKGMgPT0gYzEgJiYgKmxleHB0ciA9PSAnXScpIHx8IGxleGxlZnQgPT0g MCkKXV0sIFtbCiAgICAgICAgICAgICAgICAgIEZFVENIX1dDIChjLCB3YywgXygidW5iYWxh bmNlZCBbIikpOwogICAgICAgICAgICAgICAgICBpZiAoKGMgPT0gYzEgJiYgKmxleGVyLT5s ZXhwdHIgPT0gJ10nKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxleGVyLT5sZXhs ZWZ0ID09IDApCl1dKQpQYXJzZUJyYWNrZXRFeHAgPSBUZXh0U3Vic3QoUGFyc2VCcmFja2V0 RXhwLCBbWwogICAgICAgICAgLyogSW4gdGhlIGNhc2UgW3gtXSwgdGhlIC0gaXMgYW4gb3Jk aW5hcnkgaHlwaGVuLAogICAgICAgICAgICAgd2hpY2ggaXMgbGVmdCBpbiBjMSwgdGhlIGxv b2thaGVhZCBjaGFyYWN0ZXIuICAqLwogICAgICAgICAgbGV4cHRyIC09IGN1cl9tYl9sZW47 CiAgICAgICAgICBsZXhsZWZ0ICs9IGN1cl9tYl9sZW47Cl1dLCBbWwogICAgICAgICAgLyog SW4gdGhlIGNhc2UgW3gtXSwgdGhlIC0gaXMgYW4gb3JkaW5hcnkgaHlwaGVuLAogICAgICAg ICAgICAgd2hpY2ggaXMgbGVmdCBpbiBjMSwgdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXIuICAq LwogICAgICAgICAgbGV4ZXItPmxleHB0ciAgLT0gbGV4ZXItPmN1cl9tYl9sZW47CiAgICAg ICAgICBsZXhlci0+bGV4bGVmdCArPSBsZXhlci0+Y3VyX21iX2xlbjsKXV0pCgpQYXJzZUJy YWNrZXRFeHAgPSBUZXh0U3Vic3QoUGFyc2VCcmFja2V0RXhwLCBbPVsKICAgICAgICAgIC8q IEEgYnJhY2tldCBleHByZXNzaW9uIGxpa2UgW2EtWy5hYS5dXSBtYXRjaGVzIGFuIHVua25v d24gc2V0LgogICAgICAgICAgICAgVHJlYXQgaXQgbGlrZSBbLWFbLmFhLl1dIHdoaWxlIHBh cnNpbmcgaXQsIGFuZAogICAgICAgICAgICAgcmVtZW1iZXIgdGhhdCB0aGUgc2V0IGlzIHVu a25vd24uICAqLwogICAgICAgICAgaWYgKGMyID09ICdbJyAmJiAqbGV4cHRyID09ICcuJykK XT1dLCBbPVsKICAgICAgICAgIC8qIEEgYnJhY2tldCBleHByZXNzaW9uIGxpa2UgW2EtWy5h YS5dXSBtYXRjaGVzIGFuIHVua25vd24KICAgICAgICAgICAgIHNldC4gIFRyZWF0IGl0IGxp a2UgWy1hWy5hYS5dXSB3aGlsZSBwYXJzaW5nIGl0LCBhbmQKICAgICAgICAgICAgIHJlbWVt YmVyIHRoYXQgdGhlIHNldCBpcyB1bmtub3duLiAgKi8KICAgICAgICAgIGlmIChjMiA9PSAn WycgJiYgKmxleGVyLT5sZXhwdHIgPT0gJy4nKQpdPV0pCgpQYXJzZUJyYWNrZXRFeHAgPSBU ZXh0U3Vic3QoUGFyc2VCcmFja2V0RXhwLCBbWwogIGlmIChkZmEtPm11bHRpYnl0ZSkKICAg IHsKICAgICAgc3RhdGljIGNoYXJjbGFzcyB6ZXJvY2xhc3M7CiAgICAgIHdvcmtfbWJjLT5p bnZlcnQgPSBpbnZlcnQ7CiAgICAgIHdvcmtfbWJjLT5jc2V0ID0gZXF1YWwgKGNjbCwgemVy b2NsYXNzKSA/IC0xIDogY2hhcmNsYXNzX2luZGV4IChjY2wpOwogICAgICByZXR1cm4gTUJD U0VUOwogICAgfQoKICBpZiAoaW52ZXJ0KQogICAgewogICAgICBhc3NlcnQgKCFkZmEtPm11 bHRpYnl0ZSk7CiAgICAgIG5vdHNldCAoY2NsKTsKICAgICAgaWYgKHN5bnRheF9iaXRzICYg UkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FKQogICAgICAgIGNscmJpdCAoZW9sYnl0ZSwgY2Ns KTsKICAgIH0KCiAgcmV0dXJuIENTRVQgKyBjaGFyY2xhc3NfaW5kZXggKGNjbCk7Cl1dLCBb WwogIGlmIChsZXhlci0+bXVsdGlieXRlX2xvY2FsZSkKICAgIHsKICAgICAgbWJjc2V0c19z ZXRfbWF0Y2hfc2Vuc2UgKHdvcmtfbWJjLCBpbnZlcnQpOwogICAgICBtYmNzZXRzX3JlY2Vp dmVfaW5jb21wbGV0ZV9jaGFyY2xhc3MgKHdvcmtfbWJjLCBjY2wpOwogICAgICBtYmNzZXRz X2NvbXBsZXRlZCAod29ya19tYmMpOwogICAgICByZXR1cm4gTUJDU0VUOwogICAgfQoKICBp ZiAoaW52ZXJ0KQogICAgewogICAgICBjaGFyY2xhc3Nfbm90c2V0IChjY2wpOwogICAgICBp ZiAoc3ludGF4X2JpdHMgJiBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUpCiAgICAgICAgY2hh cmNsYXNzX2NscmJpdCAoZW9sYnl0ZSwgY2NsKTsKICAgIH0KCiAgcmV0dXJuIENTRVQgKyBj aGFyY2xhc3NfY29tcGxldGVkIChjY2wpOwpdXSkKCi0tIFJld3JpdGUgdG9rZW4gcmVmZXJl bmNlcyB0byBoYXZlIGV4cGxpY2l0IEZTQVRPS0VOXyBwcmVmaXhlcy4KUGFyc2VCcmFja2V0 RXhwID0gRlNBVG9rZW5TdWJzdChQYXJzZUJyYWNrZXRFeHApCgotLSBSZXdyaXRlIHJlZmVy ZW5jZXMgdG8gdmFyaWFibGVzIG1vdmVkIGludG8gbGV4ZXIgY29udGV4dC4KLS0gVHJ5IHBh dHRlcm4gc2VhcmNoL3JlcGxhY2UgZm9yIHRoZXNlIHZhcmlhYmxlczsgdGhpcyBtYXkgY2F1 c2UKLS0gY29sbGF0ZXJhbCBkYW1hZ2UsIGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdGVkaW91 cy4KZm9yIF8sIEtleXdvcmQgaW4gaXBhaXJzeyJjYXNlX2ZvbGQiLCAic3ludGF4X2JpdHMi LCAiZW9sYnl0ZSIsICJkb3RjbGFzcyJ9IGRvCiAgIFBhcnNlQnJhY2tldEV4cCA9IFBhcnNl QnJhY2tldEV4cDpnc3ViKCIoW14ld19dKSIgLi4gS2V5d29yZCAuLiAiKFteJXdfXSkiLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTFsZXhlci0+IiAuLiBL ZXl3b3JkIC4uICIlMiIpCmVuZApQYXJzZUJyYWNrZXRFeHAgPSBQYXJzZUJyYWNrZXRFeHA6 Z3N1YigiICBGRVRDSF9XQyAlKCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICIgIEZFVENIX1dDIChsZXhlciwgIikKYXNzZXJ0KGY6d3JpdGUoUGFyc2VCcmFj a2V0RXhwLCAiXG4iKSkKCi0tIE1hY3JvcyB0byBoYW5kbGUgc2luZ2xlLWxldmVsIHB1c2gv cG9wIGxleCBzdGF0ZSwgcHJldmlvdXNseQotLSBidXJpZWQgaW5zaWRlIHRoZSBib2R5IG9m IGxleCAoKS4gIFRoZXNlIG1hY3JvcyBoYXZlIGJlZW4KLS0gcmV3cml0dGVuIHRvIGluY2x1 ZGUgYSBsZXhlciBpbnN0YW5jZSBwYXJhbWV0ZXIuCmFzc2VydChmOndyaXRlKFtbCiNkZWZp bmUgUFVTSF9MRVhfU1RBVEUobGV4ZXIsIHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwK ICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCiAgICAgIGNoYXIgY29uc3QgKmxleHB0cl9zYXZlZCA9IChsZXhlciktPmxl eHB0cjsgICAgICAgIFwKICAgICAgc2l6ZV90IGxleGxlZnRfc2F2ZWQgPSAobGV4ZXIpLT5s ZXhsZWZ0OyAgICAgICAgICAgXAogICAgICAobGV4ZXIpLT5sZXhwdHIgPSAocyk7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIChsZXhlciktPmxleGxlZnQgPSBzdHJs ZW4gKChsZXhlciktPmxleHB0cikKCiNkZWZpbmUgUE9QX0xFWF9TVEFURShsZXhlcikgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgKGxleGVyKS0+bGV4cHRyID0gbGV4 cHRyX3NhdmVkOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAobGV4ZXIpLT5sZXhsZWZ0 ID0gbGV4bGVmdF9zYXZlZDsgICAgICAgICAgICAgICAgICBcCiAgICB9ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB3aGlsZSAoMCkK Cl1dKSkKCi0tIExleCBkZWNsIGFuZCBib2R5OyBsb3RzIG1vcmUgbGV4ZXItPiBlZGl0cyBp biB0aGUgYm9keS4uLgphc3NlcnQoZjp3cml0ZShEZWNsc1sibGV4Il0pKQpsb2NhbCBMZXhC b2R5ID0gUmF3VGV4dCgibGV4LWJvZHkiKQoKLS0gV2Ugc2V0IHVwIHN0YXRpYyAibGV0dGVy cyIgYW5kICJub3RsZXR0ZXJzIiBjbGFzc2VzIChhbmQgYXNzb2NpYXRlZAotLSBpbmRpY2Vz KSBpbiBmc2FsZXhfc3ludGF4LCBzbyB0aGUgY29kZSBoZXJlIGNhbiBiZSBtdWNoLCBtdWNo IHNpbXBsZXIuCi0tIE5vdGUgKGFnYWluKSB0aGF0ICJsZXR0ZXJzIiBpcyBhIHJvdHRlbiBu YW1lIGZvciBJU19XT1JEX0NPTlNUSVRVRU5UCi0tIGNoYXJhY3RlcnM6IGlzYWxudW0oKSBw bHVzICdfJywgYnV0IHRoYXQncyBob3cgbGV0dGVycy9ub3RsZXR0ZXJzIGlzCi0tIHNldCB1 cC4gIFdlIGFsc28gcmVtb3ZlIHZhcmlhYmxlcyBjMiBhbmQgY2NsIGZyb20gTGV4Qm9keS4g IEZpbmFsbHksCi0tIHdlIHRlc3Qgc3ludGF4X2luaXRpYWxpc2VkIGZpb3JzdCwgYXMgbGVh dmluZyB0aGlzIHVuc2V0IGlzIGEgZmF0YWwKLS0gZXJyb3IuCkxleEJvZHkgPSBUZXh0U3Vi c3QoTGV4Qm9keSwgW1sKewogIGludCBjLCBjMjsKICBib29sIGJhY2tzbGFzaCA9IGZhbHNl OwogIGNoYXJjbGFzcyBjY2w7CiAgaW50IGk7Cl1dLCBbWwp7CiAgaW50IGM7CiAgYm9vbCBi YWNrc2xhc2ggPSBmYWxzZTsKICBpbnQgaTsKICBwcmVkaWNhdGVfZW50cnlfdCAqcHJlZGlj YXRlOwogIGNoYXJjbGFzc190ICp3b3JrX2NsYXNzOwogIGNoYXJjbGFzc19pbmRleF90IGNs YXNzX2luZGV4OwogIG1iY3NldHNfc2V0X3QgKndvcmtfbWJjOwogIGJvb2wgaW52ZXJ0OwoK ICBDSEVDS19DT05URVhUIChsZXhlcik7CgogIC8qIEVuc3VyZSB0aGF0IHN5bnRheCAoKSBo YXMgYmVlbiBjYWxsZWQgb24gdGhpcyBsZXhlciBpbnN0YW5jZTsgbWFueQogICAgIHRoaW5n cyB3aWxsIGZhaWwgaWYgdGhpcyBpc24ndCBkb25lLiAgKi8KICBhc3NlcnQgKGxleGVyLT5z eW50YXhfaW5pdGlhbGlzZWQpOwpdXSkKLS0gUmVwbGFjZSBkZmFlcnJvciBhbmQgZGZhd2Fy biB3aXRoIGV4cGxpY2l0bHktcHJvdmlkZWQgZnVuY3Rpb25zLgpMZXhCb2R5ID0gTGV4Qm9k eTpnc3ViKCIgZGZhd2FybiAiLCAiIGxleGVyLT53YXJuX2NsaWVudCAiKQpMZXhCb2R5ID0g TGV4Qm9keTpnc3ViKCIgZGZhZXJyb3IgIiwgIiBsZXhlci0+YWJhbmRvbl93aXRoX2Vycm9y ICIpCgotLSBEZWFsIHdpdGggc29tZSBlYXJseSBjYXNlcyB3aGVyZSBzdGF0aWMgdmFycyBh cmUgbm93IGluIGxleGVyIHN0YXRlCkxleEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9keSwgW1sK ICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQogICAgewogICAgICBGRVRDSF9XQyAoYywgd2N0 b2ssIE5VTEwpOwoKICAgICAgc3dpdGNoIChjKQogICAgICAgIHsKICAgICAgICBjYXNlICdc XCc6CiAgICAgICAgICBpZiAoYmFja3NsYXNoKQogICAgICAgICAgICBnb3RvIG5vcm1hbF9j aGFyOwogICAgICAgICAgaWYgKGxleGxlZnQgPT0gMCkKXV0sIFtbCiAgZm9yIChpID0gMDsg aSA8IDI7ICsraSkKICAgIHsKICAgICAgRkVUQ0hfV0MgKGMsIGxleGVyLT53Y3RvaywgTlVM TCk7CgogICAgICBzd2l0Y2ggKGMpCiAgICAgICAgewogICAgICAgIGNhc2UgJ1xcJzoKICAg ICAgICAgIGlmIChiYWNrc2xhc2gpCiAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CiAg ICAgICAgICBpZiAobGV4ZXItPmxleGxlZnQgPT0gMCkKXV0pCgotLSBNYWtlICJub3QtUkVf Tk9fR05VX09QVFMiIG1vcmUgcmVhZGFibGUgYnkgdXNpbmcgYSBkaXJlY3QgZmxhZyB2YXJp YWJsZS4KTGV4Qm9keSA9IFRleHRTdWJzdChMZXhCb2R5LAogICAgICAgICAgICAgICAgICAg ICIhKHN5bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykiLAogICAgICAgICAgICAgICAgICAg ICJsZXhlci0+cmVfZ251X29wcyIpCgotLSBIYW5kbGUgIlxzIiBhbmQgIlxTIiBpbiB0aGUg c2FtZSBmYXNoaW9uIGFzICJcdyIgYW1kICJcVyIuICBIb3dldmVyLAotLSBtdWx0aWJ5dGUg aXNzdWVzIGFyZSBtb3JlIG9mIGEgZGlyZWN0IGlzc3VlIGluIHRoZSBjb2RlLgpMZXhCb2R5 ID0gVGV4dFN1YnN0KExleEJvZHksIFs9PVsKICAgICAgICBjYXNlICdzJzoKICAgICAgICBj YXNlICdTJzoKICAgICAgICAgIGlmICghYmFja3NsYXNoIHx8IChzeW50YXhfYml0cyAmIFJF X05PX0dOVV9PUFMpKQogICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOwogICAgICAgICAg aWYgKCFkZmEtPm11bHRpYnl0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHplcm9z ZXQgKGNjbCk7CiAgICAgICAgICAgICAgZm9yIChjMiA9IDA7IGMyIDwgTk9UQ0hBUjsgKytj MikKICAgICAgICAgICAgICAgIGlmIChpc3NwYWNlIChjMikpCiAgICAgICAgICAgICAgICAg IHNldGJpdCAoYzIsIGNjbCk7CiAgICAgICAgICAgICAgaWYgKGMgPT0gJ1MnKQogICAgICAg ICAgICAgICAgbm90c2V0IChjY2wpOwogICAgICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNl OwogICAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gQ1NFVCArIGNoYXJjbGFzc19pbmRl eCAoY2NsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIC8qIEZJWE1FOiBzZWUgaWYgb3B0 aW1pemluZyB0aGlzLCBhcyBpcyBkb25lIHdpdGggQU5ZQ0hBUiBhbmQKICAgICAgICAgICAg IGFkZF91dGY4X2FueWNoYXIsIG1ha2VzIHNlbnNlLiAgKi8KCiAgICAgICAgICAvKiBccyBh bmQgXFMgYXJlIGRvY3VtZW50ZWQgdG8gYmUgZXF1aXZhbGVudCB0byBbWzpzcGFjZTpdXSBh bmQKICAgICAgICAgICAgIFteWzpzcGFjZTpdXSByZXNwZWN0aXZlbHksIHNvIHRlbGwgdGhl IGxleGVyIHRvIHByb2Nlc3MgdGhvc2UKICAgICAgICAgICAgIHN0cmluZ3MsIGVhY2ggbWlu dXMgaXRzICJhbHJlYWR5IHByb2Nlc3NlZCIgJ1snLiAgKi8KICAgICAgICAgIFBVU0hfTEVY X1NUQVRFIChjID09ICdzJyA/ICJbOnNwYWNlOl1dIiA6ICJeWzpzcGFjZTpdXSIpOwoKICAg ICAgICAgIGxhc3R0b2sgPSBwYXJzZV9icmFja2V0X2V4cCAoKTsKCiAgICAgICAgICBQT1Bf TEVYX1NUQVRFICgpOwoKICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOwogICAgICAgICAg cmV0dXJuIGxhc3R0b2s7Cl09PV0sIFs9PVsKICAgICAgICBjYXNlICdzJzoKICAgICAgICBj YXNlICdTJzoKICAgICAgICAgICAvKiAiXHMiID09ICJbWzpzcGFjZTpdXSI7ICJcUyIgPT0g IlteWzpzcGFjZTpdXSIuICAqLwogICAgICAgICAgaWYgKCEgKGJhY2tzbGFzaCAmJiBsZXhl ci0+cmVfZ251X29wcykpCiAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CiAgICAgICAg ICBsZXhlci0+bGFzdHN0YXJ0ID0gZmFsc2U7CiAgICAgICAgICBpbnZlcnQgPSBjID09ICdT JzsKICAgICAgICAgIHByZWRpY2F0ZSA9IGZpbmRfcHJlZCAobGV4ZXIsICJzcGFjZSIpOwog ICAgICAgICAgaWYgKGMgPT0gJ3MnKQogICAgICAgICAgICBjbGFzc19pbmRleCA9IGNoYXJj bGFzc19nZXRfaW5kZXggKHByZWRpY2F0ZS0+Y2xhc3MpOwogICAgICAgICAgZWxzZQogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgLyogSW52ZXJ0IHRoZSBwcmVkaWNhdGUgY2xhc3Mg aW4gYSB3b3JrIGNsYXNzLiAgKi8KICAgICAgICAgICAgICB3b3JrX2NsYXNzID0gY2hhcmNs YXNzX2FsbG9jICgpOwogICAgICAgICAgICAgIGNoYXJjbGFzc19jb3B5c2V0IChwcmVkaWNh dGUtPmNsYXNzLCB3b3JrX2NsYXNzKTsKICAgICAgICAgICAgICBjaGFyY2xhc3Nfbm90c2V0 ICh3b3JrX2NsYXNzKTsKICAgICAgICAgICAgICBjbGFzc19pbmRleCA9IGNoYXJjbGFzc19j b21wbGV0ZWQgKHdvcmtfY2xhc3MpOwogICAgICAgICAgICB9CiAgICAgICAgICBpZiAobGV4 ZXItPnVuaWJ5dGVfbG9jYWxlKQogICAgICAgICAgICByZXR1cm4gbGV4ZXItPmxhc3R0b2sg PSBGU0FUT0tFTl9US19DU0VUICsgY2xhc3NfaW5kZXg7CgogICAgICAgICAgLyogRklYTUU6 IHNlZSBpZiBvcHRpbWl6aW5nIHRoaXMsIGFzIGlzIGRvbmUgd2l0aCBBTllDSEFSIGFuZAog ICAgICAgICAgICAgYWRkX3V0ZjhfYW55Y2hhciwgbWFrZXMgc2Vuc2UuICAqLwoKICAgICAg ICAgIC8qIE11bHRpYnl0ZSBsb2NhbGU6ICBGaWxsIG91dCBhbiBlbnRpcmUgc2V0IGRlc2Ny aXB0aW9uLiAgKi8KICAgICAgICAgIGxleGVyLT5tYmNzZXRzID0gbWF5YmVfcmVhbGxvYyAo bGV4ZXItPm1iY3NldHMsIGxleGVyLT5ubWJjc2V0cywKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJmxleGVyLT5tYmNzZXRzX2FsbG9jLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygd29ya19tYmMpOwogICAg ICAgICAgd29ya19tYmMgPSBtYmNzZXRzX25ldyAoKTsKICAgICAgICAgIGxleGVyLT5tYmNz ZXRzW2xleGVyLT5ubWJjc2V0cysrXSA9IHdvcmtfbWJjOwogICAgICAgICAgbWJjc2V0c19z ZXRfbWF0Y2hfc2Vuc2UgKHdvcmtfbWJjLCBpbnZlcnQpOwogICAgICAgICAgbWJjc2V0c19h ZGRfY2xhc3MgKHdvcmtfbWJjLCBwcmVkaWNhdGUtPndjaGFyX2Rlc2MpOwoKICAgICAgICAg IC8qID8/IFJFVklFV01FOiAiaW52ZXJ0IiBpbiBwYXJzZV9icmFja2V0X2V4cCBsZWFkcyB0 byBCQUNLUkVGCiAgICAgICAgICAgICAoPT0gInRoaXMgaXMgdG9vIGhhcmQgZm9yIG1lIikg dG9rZW4gdmlhIGtub3duX2JyYWNrZXRfZXhwCiAgICAgICAgICAgICBmbGFnLiAqLwogICAg ICAgICAgaWYgKChjID09ICdTJykgJiYgIWxleGVyLT51c2luZ19zaW1wbGVfbG9jYWxlKQog ICAgICAgICAgICByZXR1cm4gbGV4ZXItPmxhc3R0b2sgPSBGU0FUT0tFTl9US19CQUNLUkVG OwogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gbGV4ZXItPmxhc3R0b2sgPSBG U0FUT0tFTl9US19NQkNTRVQ7Cl09PV0pCgpMZXhCb2R5ID0gVGV4dFN1YnN0KExleEJvZHks IFtbCiAgICAgICAgY2FzZSAndyc6CiAgICAgICAgY2FzZSAnVyc6CiAgICAgICAgICBpZiAo IWJhY2tzbGFzaCB8fCAoc3ludGF4X2JpdHMgJiBSRV9OT19HTlVfT1BTKSkKICAgICAgICAg ICAgZ290byBub3JtYWxfY2hhcjsKCiAgICAgICAgICBpZiAoIWRmYS0+bXVsdGlieXRlKQog ICAgICAgICAgICB7CiAgICAgICAgICAgICAgemVyb3NldCAoY2NsKTsKICAgICAgICAgICAg ICBmb3IgKGMyID0gMDsgYzIgPCBOT1RDSEFSOyArK2MyKQogICAgICAgICAgICAgICAgaWYg KElTX1dPUkRfQ09OU1RJVFVFTlQgKGMyKSkKICAgICAgICAgICAgICAgICAgc2V0Yml0IChj MiwgY2NsKTsKICAgICAgICAgICAgICBpZiAoYyA9PSAnVycpCiAgICAgICAgICAgICAgICBu b3RzZXQgKGNjbCk7CiAgICAgICAgICAgICAgbGFzdHN0YXJ0ID0gZmFsc2U7CiAgICAgICAg ICAgICAgcmV0dXJuIGxhc3R0b2sgPSBDU0VUICsgY2hhcmNsYXNzX2luZGV4IChjY2wpOwog ICAgICAgICAgICB9Cl1dLApbPT1bCiAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICBjYXNl ICdXJzoKICAgICAgICAgICAvKiBDYW4gbWVhbiAiW19bOmFsbnVtOl1dIiAoXHcpIG9yIGl0 cyBpbnZlcnNlIChcVykuICAqLwogICAgICAgICAgIGlmICghIChiYWNrc2xhc2ggJiYgbGV4 ZXItPnJlX2dudV9vcHMpKQogICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKCiAgICAg ICAgICAgaWYgKGxleGVyLT51bmlieXRlX2xvY2FsZSkKICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgbGV4ZXItPmxhc3RzdGFydCA9IGZhbHNlOwogICAgICAgICAgICAgICBwcmVk aWNhdGUgPSBmaW5kX3ByZWQgKGxleGVyLCAiYWxudW0iKTsKICAgICAgICAgICAgICAgd29y a19jbGFzcyA9IGNoYXJjbGFzc19hbGxvYyAoKTsKICAgICAgICAgICAgICAgY2hhcmNsYXNz X2NvcHlzZXQgKHByZWRpY2F0ZS0+Y2xhc3MsIHdvcmtfY2xhc3MpOwogICAgICAgICAgICAg ICBjaGFyY2xhc3Nfc2V0Yml0ICgnXycsIHdvcmtfY2xhc3MpOwogICAgICAgICAgICAgICBp ZiAoYyA9PSAnVycpCiAgICAgICAgICAgICAgICAgY2hhcmNsYXNzX25vdHNldCAod29ya19j bGFzcyk7CiAgICAgICAgICAgICAgIHJldHVybiBsZXhlci0+bGFzdHRvayA9IEZTQVRPS0VO X1RLX0NTRVQKICAgICAgICAgICAgICAgICAgICAgICArIGNoYXJjbGFzc19jb21wbGV0ZWQg KHdvcmtfY2xhc3MpOwogICAgICAgICAgICAgfQpdPT1dKQoKTGV4Qm9keSA9IFRleHRTdWJz dChMZXhCb2R5LCBbPT1bCiAgICAgICAgICBQVVNIX0xFWF9TVEFURSAoYyA9PSAndycgPyAi X1s6YWxudW06XV0iIDogIl5fWzphbG51bTpdXSIpOwoKICAgICAgICAgIGxhc3R0b2sgPSBw YXJzZV9icmFja2V0X2V4cCAoKTsKCiAgICAgICAgICBQT1BfTEVYX1NUQVRFICgpOwoKICAg ICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGxhc3R0b2s7Cl09 PV0sIFs9PVsKICAgICAgICAgIFBVU0hfTEVYX1NUQVRFIChsZXhlciwgYyA9PSAndycKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiX1s6YWxudW06XV0iIDogIl5fWzph bG51bTpdXSIpOwoKICAgICAgICAgIGxleGVyLT5sYXN0dG9rID0gcGFyc2VfYnJhY2tldF9l eHAgKGxleGVyKTsKCiAgICAgICAgICBQT1BfTEVYX1NUQVRFIChsZXhlcik7CgogICAgICAg ICAgbGV4ZXItPmxhc3RzdGFydCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGxleGVyLT5s YXN0dG9rOwpdPT1dKQoKLS0gRWRpdCBtYXRjaC1hbnkgKCIuIikgdG8gdXNlIGEgc3RhdGlj IGNsYXNzLCBpbiBhIHNpbWlsYXIgZmFzaGlvbiB0bwotLSB0aGUgc3Vic3RpdHV0aW9uIGFi b3ZlLiAgVGhlIHdvcmsgaGFzIGJlZW4gc2hpZnRlZCBpbnRvIGZzYWxleF9zeW50YXguCkxl eEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9keSwgW1sKICAgICAgICBjYXNlICcuJzoKICAgICAg ICAgIGlmIChiYWNrc2xhc2gpCiAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CiAgICAg ICAgICBpZiAoZGZhLT5tdWx0aWJ5dGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAv KiBJbiBtdWx0aWJ5dGUgZW52aXJvbm1lbnQgcGVyaW9kIG11c3QgbWF0Y2ggd2l0aCBhIHNp bmdsZQogICAgICAgICAgICAgICAgIGNoYXJhY3RlciBub3QgYSBieXRlLiAgU28gd2UgdXNl IEFOWUNIQVIuICAqLwogICAgICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOwogICAgICAg ICAgICAgIHJldHVybiBsYXN0dG9rID0gQU5ZQ0hBUjsKICAgICAgICAgICAgfQogICAgICAg ICAgemVyb3NldCAoY2NsKTsKICAgICAgICAgIG5vdHNldCAoY2NsKTsKICAgICAgICAgIGlm ICghKHN5bnRheF9iaXRzICYgUkVfRE9UX05FV0xJTkUpKQogICAgICAgICAgICBjbHJiaXQg KGVvbGJ5dGUsIGNjbCk7CiAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9ET1RfTk9U X05VTEwpCiAgICAgICAgICAgIGNscmJpdCAoJ1wwJywgY2NsKTsKICAgICAgICAgIGxhc3Rz dGFydCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBDU0VUICsgY2hhcmNs YXNzX2luZGV4IChjY2wpOwpdXSwgW1sKICAgICAgICBjYXNlICcuJzoKICAgICAgICAgIGlm IChiYWNrc2xhc2gpCiAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CiAgICAgICAgICBs ZXhlci0+bGFzdHN0YXJ0ID0gZmFsc2U7CiAgICAgICAgICBpZiAobGV4ZXItPm11bHRpYnl0 ZV9sb2NhbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBJbiBtdWx0aWJ5dGUg ZW52aXJvbm1lbnQgcGVyaW9kIG11c3QgbWF0Y2ggd2l0aCBhIHNpbmdsZQogICAgICAgICAg ICAgICAgIGNoYXJhY3RlciBub3QgYSBieXRlLiAgU28gd2UgdXNlIEFOWUNIQVIuICAqLwog ICAgICAgICAgICAgIHJldHVybiBsZXhlci0+bGFzdHRvayA9IEZTQVRPS0VOX1RLX0FOWUNI QVI7CiAgICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsZXhlci0+bGFzdHRvayA9IEZT QVRPS0VOX1RLX0NTRVQKICAgICAgICAgICAgICAgICAgICAgICAgICsgbGV4ZXItPmRvdGNs YXNzX2luZGV4OwpdXSkKCi0tIEZpbmFsbHksIGVkaXQgbGV4Ym9keSB3aGVyZSBhbHBoYW51 bWVyaWMgY2hhcmFjdGVycyBhcmUgaGFja2VkIGludG8KLS0gY2xhc3NlcyBpZiBjYXNlIGZv bGRpbmcgaXMgc2VsZWN0ZWQuICBUaGlzIGlzIHRoZSBrZXkgcGxhY2UgdGhhdCBJCi0tIHdv dWxkIGxpa2UgdG8gYXR0YWNrIGluIFN0YWdlIDI6ICBSZWNhc3QgdGhlIHRva2VuIHNldCBz byB0aGF0Ci0tIGhpZ2gtbGV2ZWwgaW5mb3JtYXRpb24gaXMgbW9kZWxsZWQgZXhwbGljaXRs eSBmb3IgbG9uZ2VyIChlc3BlY2lhbGx5Ci0tIHVwIHRvIHdoZXJlIGRmYW11c3RzIGNhbiBj b250ZW1wbGF0ZSBmb3JtaW5nICJjYXNlLWluc2Vuc2l0aXZlIGZpeGVkCi0tIHN0cmluZ3Mi IGFzIGEgc2VhcmNoIG9wdGlvbikuCkxleEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9keSwgW1sK ICAgICAgICBkZWZhdWx0OgogICAgICAgIG5vcm1hbF9jaGFyOgogICAgICAgICAgbGFzdHN0 YXJ0ID0gZmFsc2U7CiAgICAgICAgICAvKiBGb3IgbXVsdGlieXRlIGNoYXJhY3RlciBzZXRz LCBmb2xkaW5nIGlzIGRvbmUgaW4gYXRvbS4gIEFsd2F5cwogICAgICAgICAgICAgcmV0dXJu IFdDSEFSLiAgKi8KICAgICAgICAgIGlmIChkZmEtPm11bHRpYnl0ZSkKICAgICAgICAgICAg cmV0dXJuIGxhc3R0b2sgPSBXQ0hBUjsKCiAgICAgICAgICBpZiAoY2FzZV9mb2xkICYmIGlz YWxwaGEgKGMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgemVyb3NldCAoY2NsKTsK ICAgICAgICAgICAgICBzZXRiaXRfY2FzZV9mb2xkX2MgKGMsIGNjbCk7CiAgICAgICAgICAg ICAgcmV0dXJuIGxhc3R0b2sgPSBDU0VUICsgY2hhcmNsYXNzX2luZGV4IChjY2wpOwogICAg ICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBjOwpdXSwgW1sKICAgICAg ICBkZWZhdWx0OgogICAgICAgIG5vcm1hbF9jaGFyOgogICAgICAgICAgbGV4ZXItPmxhc3Rz dGFydCA9IGZhbHNlOwogICAgICAgICAgLyogRm9yIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc2V0 cywgZm9sZGluZyBpcyBkb25lIGluIGF0b20sIHNvCiAgICAgICAgICAgICBhbHdheXMgcmV0 dXJuIFdDSEFSLiAgKi8KICAgICAgICAgIGlmIChsZXhlci0+bXVsdGlieXRlX2xvY2FsZSkK ICAgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBGU0FUT0tFTl9US19XQ0hBUjsKCiAgICAg ICAgICBpZiAoY2FzZV9mb2xkICYmIGlzYWxwaGEgKGMpKQogICAgICAgICAgICB7CiAgICAg ICAgICAgICAgY2hhcmNsYXNzX3QgKmNjbCA9IGNoYXJjbGFzc19hbGxvYyAoKTsKICAgICAg ICAgICAgICBzZXRiaXRfY2FzZV9mb2xkX2MgKGMsIGNjbCk7CiAgICAgICAgICAgICAgcmV0 dXJuIGxhc3R0b2sgPSBGU0FUT0tFTl9US19DU0VUCiAgICAgICAgICAgICAgICAgICAgICAg ICAgKyBjaGFyY2xhc3NfY29tcGxldGVkIChjY2wpOwogICAgICAgICAgICB9CgogICAgICAg ICAgcmV0dXJuIGxhc3R0b2sgPSBjOwpdXSkKCkxleEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9k eSwgW1sKICAgICAgICBjYXNlICckJzoKICAgICAgICAgIGlmIChiYWNrc2xhc2gpCiAgICAg ICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CiAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBS RV9DT05URVhUX0lOREVQX0FOQ0hPUlMKICAgICAgICAgICAgICB8fCBsZXhsZWZ0ID09IDAK ICAgICAgICAgICAgICB8fCAoc3ludGF4X2JpdHMgJiBSRV9OT19CS19QQVJFTlMKICAgICAg ICAgICAgICAgICAgPyBsZXhsZWZ0ID4gMCAmJiAqbGV4cHRyID09ICcpJwogICAgICAgICAg ICAgICAgICA6IGxleGxlZnQgPiAxICYmIGxleHB0clswXSA9PSAnXFwnICYmIGxleHB0clsx XSA9PSAnKScpCiAgICAgICAgICAgICAgfHwgKHN5bnRheF9iaXRzICYgUkVfTk9fQktfVkJB UgogICAgICAgICAgICAgICAgICA/IGxleGxlZnQgPiAwICYmICpsZXhwdHIgPT0gJ3wnCiAg ICAgICAgICAgICAgICAgIDogbGV4bGVmdCA+IDEgJiYgbGV4cHRyWzBdID09ICdcXCcgJiYg bGV4cHRyWzFdID09ICd8JykKICAgICAgICAgICAgICB8fCAoKHN5bnRheF9iaXRzICYgUkVf TkVXTElORV9BTFQpCiAgICAgICAgICAgICAgICAgICYmIGxleGxlZnQgPiAwICYmICpsZXhw dHIgPT0gJ1xuJykpCiAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gRU5ETElORTsKICAg ICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7Cl1dLCBbWwogICAgICAgIGNhc2UgJyQnOgogICAg ICAgICAgaWYgKGJhY2tzbGFzaCkKICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKICAg ICAgICAgIGlmIChzeW50YXhfYml0cyAmIFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUwogICAg ICAgICAgICAgIHx8IGxleGVyLT5sZXhsZWZ0ID09IDAKICAgICAgICAgICAgICB8fCAoc3lu dGF4X2JpdHMgJiBSRV9OT19CS19QQVJFTlMKICAgICAgICAgICAgICAgICAgPyBsZXhlci0+ bGV4bGVmdCA+IDAgJiYgKmxleGVyLT5sZXhwdHIgPT0gJyknCiAgICAgICAgICAgICAgICAg IDogbGV4ZXItPmxleGxlZnQgPiAxICYmIGxleGVyLT5sZXhwdHJbMF0gPT0gJ1xcJyAmJiBs ZXhlci0+bGV4cHRyWzFdID09ICcpJykKICAgICAgICAgICAgICB8fCAoc3ludGF4X2JpdHMg JiBSRV9OT19CS19WQkFSCiAgICAgICAgICAgICAgICAgID8gbGV4ZXItPmxleGxlZnQgPiAw ICYmICpsZXhlci0+bGV4cHRyID09ICd8JwogICAgICAgICAgICAgICAgICA6IGxleGVyLT5s ZXhsZWZ0ID4gMSAmJiBsZXhlci0+bGV4cHRyWzBdID09ICdcXCcgJiYgbGV4ZXItPmxleHB0 clsxXSA9PSAnfCcpCiAgICAgICAgICAgICAgfHwgKChzeW50YXhfYml0cyAmIFJFX05FV0xJ TkVfQUxUKQogICAgICAgICAgICAgICAgICAmJiBsZXhlci0+bGV4bGVmdCA+IDAgJiYgKmxl eGVyLT5sZXhwdHIgPT0gJ1xuJykpCiAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gRU5E TElORTsKICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7Cl1dKQoKLS0gVXNlIHRlbXBvcmFy eSBtaW5yZXAvbWF4cmVwIHZhcmlhYmxlcyBpbiBsZXhlciAie30iIHByb2Nlc3NpbmcsIGFu ZCBjb3B5Ci0tIHRoZXNlIHZhbHVlcyB0byBsZXhlci0+bWlucmVwIGFuZCBsZXhlci0+bWF4 cmVwIHdoZW4gY29tcGxldGUuCkxleEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9keSwgW1sKICAg ICAgICAgIC8qIENhc2VzOgogICAgICAgICAgICAge019IC0gZXhhY3QgY291bnQKICAgICAg ICAgICAgIHtNLH0gLSBtaW5pbXVtIGNvdW50LCBtYXhpbXVtIGlzIGluZmluaXR5CiAgICAg ICAgICAgICB7LE59IC0gMCB0aHJvdWdoIE4KICAgICAgICAgICAgIHssfSAtIDAgdG8gaW5m aW5pdHkgKHNhbWUgYXMgJyonKQogICAgICAgICAgICAge00sTn0gLSBNIHRocm91Z2ggTiAq LwogICAgICAgICAgewogICAgICAgICAgICBjaGFyIGNvbnN0ICpwID0gbGV4cHRyOwogICAg ICAgICAgICBjaGFyIGNvbnN0ICpsaW0gPSBwICsgbGV4bGVmdDsKICAgICAgICAgICAgbWlu cmVwID0gbWF4cmVwID0gLTE7Cl1dLCBbWwogICAgICAgICAgLyogQ2FzZXM6CiAgICAgICAg ICAgICB7TX0gLSBleGFjdCBjb3VudAogICAgICAgICAgICAge00sfSAtIG1pbmltdW0gY291 bnQsIG1heGltdW0gaXMgaW5maW5pdHkKICAgICAgICAgICAgIHssTn0gLSAwIHRocm91Z2gg TgogICAgICAgICAgICAgeyx9IC0gMCB0byBpbmZpbml0eSAoc2FtZSBhcyAnKicpCiAgICAg ICAgICAgICB7TSxOfSAtIE0gdGhyb3VnaCBOICovCiAgICAgICAgICB7CiAgICAgICAgICAg IGNoYXIgY29uc3QgKnAgPSBsZXhlci0+bGV4cHRyOwogICAgICAgICAgICBjaGFyIGNvbnN0 ICpsaW0gPSBwICsgbGV4ZXItPmxleGxlZnQ7CiAgICAgICAgICAgIGludCBtaW5yZXAgPSAt MTsKICAgICAgICAgICAgaW50IG1heHJlcCA9IC0xOwpdXSkKCkxleEJvZHkgPSBUZXh0U3Vi c3QoTGV4Qm9keSwgW1sKICAgICAgICAgICAgaWYgKFJFX0RVUF9NQVggPCBtYXhyZXApCiAg ICAgICAgICAgICAgbGV4ZXItPmFiYW5kb25fd2l0aF9lcnJvciAoXygicmVndWxhciBleHBy ZXNzaW9uIHRvbyBiaWciKSk7CiAgICAgICAgICAgIGxleHB0ciA9IHA7CiAgICAgICAgICAg IGxleGxlZnQgPSBsaW0gLSBwOwogICAgICAgICAgfQogICAgICAgICAgbGFzdHN0YXJ0ID0g ZmFsc2U7CiAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IFJFUE1OOwpdXSwgW1sKICAgICAg ICAgICAgaWYgKFJFX0RVUF9NQVggPCBtYXhyZXApCiAgICAgICAgICAgICAgbGV4ZXItPmFi YW5kb25fd2l0aF9lcnJvciAoXygicmVndWxhciBleHByZXNzaW9uIHRvbyBiaWciKSk7CiAg ICAgICAgICAgIGxleGVyLT5sZXhwdHIgPSBwOwogICAgICAgICAgICBsZXhlci0+bGV4bGVm dCA9IGxpbSAtIHA7CiAgICAgICAgICAgIGxleGVyLT5taW5yZXAgPSBtaW5yZXA7CiAgICAg ICAgICAgIGxleGVyLT5tYXhyZXAgPSBtYXhyZXA7CiAgICAgICAgICB9CiAgICAgICAgICBs ZXhlci0+bGFzdHN0YXJ0ID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IFJF UE1OOwpdXSkKCkxleEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9keSwgW1sKICAgICAgICBjYXNl ICdeJzoKICAgICAgICAgIGlmIChiYWNrc2xhc2gpCiAgICAgICAgICAgIGdvdG8gbm9ybWFs X2NoYXI7CiAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9DT05URVhUX0lOREVQX0FO Q0hPUlMKICAgICAgICAgICAgICB8fCBsYXN0dG9rID09IEVORCB8fCBsYXN0dG9rID09IExQ QVJFTiB8fCBsYXN0dG9rID09IE9SKQogICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IEJF R0xJTkU7CiAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOwpdXSwgW1sKICAgICAgICBjYXNl ICdeJzoKICAgICAgICAgIGlmIChiYWNrc2xhc2gpCiAgICAgICAgICAgIGdvdG8gbm9ybWFs X2NoYXI7CiAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9DT05URVhUX0lOREVQX0FO Q0hPUlMKICAgICAgICAgICAgICB8fCBsZXhlci0+bGFzdHRvayA9PSBFTkQgfHwgbGV4ZXIt Pmxhc3R0b2sgPT0gTFBBUkVOIHx8IGxleGVyLT5sYXN0dG9rID09IE9SKQogICAgICAgICAg ICByZXR1cm4gbGFzdHRvayA9IEJFR0xJTkU7CiAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFy OwpdXSkKCi0tIFJlcGxhY2UgYWxsICJyZXR1cm4gbGFzdHRvayA9ICIgY2FzZXMgd2l0aCAi cmV0dXJuIGxleGVyLT5sYXN0dG9rID0gIgpMZXhCb2R5ID0gVGV4dFN1YnN0KExleEJvZHks CiAgICAgICAgICAgICAgICAgICAgIiByZXR1cm4gbGFzdHRvayA9ICIsICIgcmV0dXJuIGxl eGVyLT5sYXN0dG9rID0gIikKCi0tIFRoZXJlJ3MgYSBmZXcgcmVtYWluaW5nICIgbGFzdHN0 YXJ0IiBjYXNlcyBpbiB0aGUgY29kZQpMZXhCb2R5ID0gVGV4dFN1YnN0KExleEJvZHksCiAg ICAgICAgICAgICAgICAgICAgIiBsYXN0c3RhcnQiLCAiIGxleGVyLT5sYXN0c3RhcnQiKQoK LS0gRGVhbCB3aXRoICJwYXJlbnMiIHZhcmlhYmxlLCBtb3ZlZCBpbnRvIGxld3hlciBzdGF0 ZQpMZXhCb2R5ID0gVGV4dFN1YnN0KExleEJvZHksICIgKytwYXJlbnM7IiwgIiArK2xleGVy LT5wYXJlbnM7IikKTGV4Qm9keSA9IFRleHRTdWJzdChMZXhCb2R5LCAiIC0tcGFyZW5zOyIs ICIgLS1sZXhlci0+cGFyZW5zOyIpCkxleEJvZHkgPSBUZXh0U3Vic3QoTGV4Qm9keSwgW1sK ICAgICAgICAgIGlmIChwYXJlbnMgPT0gMCAmJiBzeW50YXhfYml0cyAmIFJFX1VOTUFUQ0hF RF9SSUdIVF9QQVJFTl9PUkQpCl1dLCBbWwogICAgICAgICAgaWYgKGxleGVyLT5wYXJlbnMg PT0gMCAmJiBzeW50YXhfYml0cyAmIFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQpCl1d KQoKTGV4Qm9keSA9IExleEJvZHk6Z3N1YigiIEZFVENIX1dDICUoIiwgIiBGRVRDSF9XQyAo bGV4ZXIsICIpCkxleEJvZHkgPSBMZXhCb2R5OmdzdWIoIiBwYXJzZV9icmFja2V0X2V4cCAl KCUpIiwKICAgICAgICAgICAgICAgICAgICAgICAiIHBhcnNlX2JyYWNrZXRfZXhwIChsZXhl cikiKQotLSBBZGQgZnNhdG9rZW4gcHJlZml4ZXMgYWZ0ZXIgbWFqb3IgZWRpdHMgaGF2ZSBi ZWVuIGRvbmUuCkxleEJvZHkgPSBGU0FUb2tlblN1YnN0KExleEJvZHkpCgotLSBSZXdyaXRl IHJlZmVyZW5jZXMgdG8gdmFyaWFibGVzIG1vdmVkIGludG8gbGV4ZXIuCi0tIFRyeSBwYXR0 ZXJuIHNlYXJjaC9yZXBsYWNlIGZvciB0aGVzZSB2YXJpYWJsZXM7IHRoaXMgbWF5IGNhdXNl Ci0tIGNvbGxhdGVyYWwgZGFtYWdlLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRlZGlvdXMu CmZvciBfLCBLZXl3b3JkIGluIGlwYWlyc3siY2FzZV9mb2xkIiwgInN5bnRheF9iaXRzIiwg ImVvbGJ5dGUiLCAiZG90Y2xhc3MifSBkbwogICBMZXhCb2R5ID0gTGV4Qm9keTpnc3ViKCIo W14ld19dKSIgLi4gS2V5d29yZCAuLiAiKFteJXdfXSkiLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAiJTFsZXhlci0+IiAuLiBLZXl3b3JkIC4uICIlMiIpCmVuZAphc3NlcnQoZjp3 cml0ZShMZXhCb2R5LCAiXG4iKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJsZXgtcGF0dGVy biJdLCBbWwp7CiAgQ0hFQ0tfQ09OVEVYVCAobGV4ZXIpOwoKICAvKiBDb3B5IHBhcmFtZXRl cnMgdG8gaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzLiAgKi8KICBsZXhlci0+bGV4cHRyID0g cGF0dGVybjsKICBsZXhlci0+bGV4bGVmdCA9IHBhdHRlcm5fbGVuOwoKICAvKiBSZXNldCBs ZXhpY2FsIHNjYW5uZXIgc3RhdGUuICAqLwogIGxleGVyLT5sYXN0dG9rID0gRlNBVE9LRU5f VEtfRU5EOwogIGxleGVyLT5sYXN0c3RhcnQgPSAxOwogIGxleGVyLT5wYXJlbnMgPSAwOwoK ICAvKiBSZXNldCBtdWx0aWJ5dGUgcGFyc2luZyBzdGF0ZS4gICovCiAgbGV4ZXItPmN1cl9t Yl9sZW4gPSAxOwogIG1lbXNldCAoJmxleGVyLT5tYnJ0b3djX3N0YXRlLCAwLCBzaXplb2Yg KGxleGVyLT5tYnJ0b3djX3N0YXRlKSk7Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKFtbCi8q IFJlcG9ydCB3aGV0aGVyIGNvZGVzIDAtMTI3IGNvbmZvcm0gdG8gQVNDSUkgZW5jb2Rpbmcu ICBUaGlzIGlzIGhhbmR5CiAgIGZvciBvcHRpbWlzYXRpb24sIHBhcnRpY3VsYXJseSBsb3dl ci1jYXNlIGFuZCB1cHBlci1jYXNlIGNoYXJhY3RlcnMsCiAgIGFzIHRoZSBjb2RlcyBhcmUg Y29udGlndW91cywgdW5saWtlIEVCQ0RJQy4gIEFTQ0lJIGlzIGFsc28gYSBjb21tb24KICAg ZGVub21pbmF0b3IgaW4gbWFueSBvdGhlciB1bmlieXRlIGNvZGUgcGFnZXMgKGxvY2FsZXMp LCBhbmQgYWxzbyBpbgogICB0aGUgbXVsdGlieXRlIFVURi04IGxvY2FsZS4gICovCnN0YXRp YyBib29sIF9HTF9BVFRSSUJVVEVfUFVSRQpjaGFyX2VuY29kaW5nXzdiaXRzX2lzX2FzY2lp ICh2b2lkKQp7CiAgLyogVHJ1ZSBpZiB0aGUgbmF0aXZlIGNoYXJhY3RlciBzZXQgaXMga25v d24gdG8gYmUgY29tcGF0aWJsZSB3aXRoCiAgICAgdGhlIEMgbG9jYWxlLiAgVGhlIGZvbGxv d2luZyB0ZXN0IGlzbid0IHBlcmZlY3QsIGJ1dCBpdCdzIGdvb2QKICAgICBlbm91Z2ggaW4g cHJhY3RpY2UsIGFzIG9ubHkgQVNDSUkgYW5kIEVCQ0RJQyBhcmUgaW4gY29tbW9uIHVzZQog ICAgIGFuZCB0aGlzIHRlc3QgY29ycmVjdGx5IGFjY2VwdHMgQVNDSUkgYW5kIHJlamVjdHMg RUJDRElDLiAgKi8KICBjb25zdCBib29sIGlzX2FzY2lpID0KICAgICAgICAnXGInID09ICAg OCAmJiAnXHQnID09ICAgOSAmJiAnXG4nID09ICAxMCAmJiAnXHYnID09ICAxMQogICAgICYm ICdcZicgPT0gIDEyICYmICdccicgPT0gIDEzICYmICcgJyAgPT0gIDMyICYmICchJyAgPT0g IDMzCiAgICAgJiYgJyInICA9PSAgMzQgJiYgJyMnICA9PSAgMzUgJiYgJyUnICA9PSAgMzcg JiYgJyYnICA9PSAgMzgKICAgICAmJiAnXCcnID09ICAzOSAmJiAnKCcgID09ICA0MCAmJiAn KScgID09ICA0MSAmJiAnKicgID09ICA0MgogICAgICYmICcrJyAgPT0gIDQzICYmICcsJyAg PT0gIDQ0ICYmICctJyAgPT0gIDQ1ICYmICcuJyAgPT0gIDQ2CiAgICAgJiYgJy8nICA9PSAg NDcgJiYgJzAnICA9PSAgNDggJiYgJzknICA9PSAgNTcgJiYgJzonICA9PSAgNTgKICAgICAm JiAnOycgID09ICA1OSAmJiAnPCcgID09ICA2MCAmJiAnPScgID09ICA2MSAmJiAnPicgID09 ICA2MgogICAgICYmICc/JyAgPT0gIDYzICYmICdBJyAgPT0gIDY1ICYmICdaJyAgPT0gIDkw ICYmICdbJyAgPT0gIDkxCiAgICAgJiYgJ1xcJyA9PSAgOTIgJiYgJ10nICA9PSAgOTMgJiYg J14nICA9PSAgOTQgJiYgJ18nICA9PSAgOTUKICAgICAmJiAnYScgID09ICA5NyAmJiAneicg ID09IDEyMiAmJiAneycgID09IDEyMyAmJiAnfCcgID09IDEyNAogICAgICYmICd9JyAgPT0g MTI1ICYmICd+JyAgPT0gMTI2OwogIHJldHVybiBpc19hc2NpaTsKfQoKXV0pKQoKYXNzZXJ0 KGY6d3JpdGUoRGVjbHNbImxleC1zeW50YXgiXSwgW1sKewogIGNoYXJjbGFzc190ICp3b3Jr X2NsYXNzOwogIHByZWRpY2F0ZV9lbnRyeV90ICpwcmVkOwogIGNoYXIgY29uc3QgKmxvY2Fs ZV9uYW1lOwoKICBDSEVDS19DT05URVhUIChsZXhlcik7CgogIC8qIFNldCBhIGZsYWcgbm90 aW5nIHRoYXQgdGhpcyBsZXhlciBoYXMgaGFkIGl0cyBzeW50YXggcGFyYW1zCiAgICAgc2V0 LiAgKi8KICBsZXhlci0+c3ludGF4X2luaXRpYWxpc2VkID0gdHJ1ZTsKCiAgLyogUmVjb3Jk IHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGluIG91ciBsb2NhbCBjb250ZXh0LiAgKi8KICBs ZXhlci0+c3ludGF4X2JpdHMgPSBiaXRzOwogIGxleGVyLT5jYXNlX2ZvbGQgPSBmb2xkOwog IGxleGVyLT5lb2xieXRlID0gZW9sOwoKICAvKiBTZXQgdXAgdW5pYnl0ZS9tdWx0aWJ5dGUg ZmxhZ3MsIGJhc2VkIG9uIE1CX0NVUl9NQVgsIHdoaWNoCiAgICAgZGVwZW5kcyBvbiB0aGUg Y3VycmVudCBsb2NhbGUuICBXZSBjYXB0dXJlIHRoaXMgaW5mb3JtYXRpb24gaGVyZQogICAg IGFzIHRoZSBsb2NhbGUgbWF5IGNoYW5nZSBsYXRlci4gIEF0IHByZXNlbnQsIHdlIGRvbid0 IGNhcHR1cmUKICAgICBNQl9DVVJfTUFYIGl0c2VsZi4gICovCiAgaWYgKE1CX0NVUl9NQVgg PiAxKQogICAgewogICAgICAvKiBNdWx0aWJ5dGUgbG9jYWxlOiBQcmVwYXJlIGJvb2xlYW5z IHRvIG1ha2UgY29kZSBlYXNpZXIgdG8KICAgICAgICAgcmVhZCAqLwogICAgICBsZXhlci0+ dW5pYnl0ZV9sb2NhbGUgPSBmYWxzZTsKICAgICAgbGV4ZXItPm11bHRpYnl0ZV9sb2NhbGUg PSB0cnVlOwoKICAgICAgLyogRGlzY2FyZCBhbnkgZWFybGllciBzdG9yYWdlIHdlIG1heSBo YXZlIGFjcXVpcmVkLiAgKi8KICAgICAgZnJlZSAobGV4ZXItPm1iY3NldHMpOwogICAgICBs ZXhlci0+bWJjc2V0cyA9IE5VTEw7CgogICAgICAvKiBTZXQgdXAgYW4gYXJyYXkgb2Ygc3Ry dWN0dXJlcyB0byBob2xkIG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgc2V0cy4gICov CiAgICAgIGxleGVyLT5ubWJjc2V0cyA9IDA7CiAgICAgIGxleGVyLT5tYmNzZXRzX2FsbG9j ID0gMjsKICAgICAgbGV4ZXItPm1iY3NldHMgPSB4emFsbG9jIChzaXplb2YgKCpsZXhlci0+ bWJjc2V0cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxleGVy LT5tYmNzZXRzX2FsbG9jKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogVW5pYnl0 ZSBsb2NhbGU6IFByZXBhcmUgYm9vbGVhbnMgdG8gbWFrZSBjb2RlIGVhc2llciB0bwogICAg ICAgICByZWFkICovCiAgICAgIGxleGVyLT51bmlieXRlX2xvY2FsZSA9IHRydWU7CiAgICAg IGxleGVyLT5tdWx0aWJ5dGVfbG9jYWxlID0gZmFsc2U7CiAgICB9CgogIC8qIENoYXJjbGFz cyBndWFyYW50ZWVzIHRoYXQgY2xhc3MgaW5kZXggMCBpcyB6ZXJvY2xhc3MsIHNvIHdlIGRv bid0CiAgICAgbmVlZCB0byBzZXQgaXQgdXAgaGVyZS4gICovCgogLyogU2V0IHVwIGEgY2hh cmFjdGVyIGNsYXNzIHRvIG1hdGNoIGFueWNoYXIgKCcuJyksIHRhaWxvcmVkIHRvCiAgICBh Y2NvbW1vZGF0ZSBvcHRpb25zIGZyb20gdGhlIHJlZ2V4IHN5bnRheC4gICovCiAgd29ya19j bGFzcyA9IGNoYXJjbGFzc19hbGxvYyAoKTsKICBjaGFyY2xhc3Nfbm90c2V0ICh3b3JrX2Ns YXNzKTsKICBpZiAoISAobGV4ZXItPnN5bnRheF9iaXRzICYgUkVfRE9UX05FV0xJTkUpKQog ICAgewogICAgICBjaGFyY2xhc3NfY2xyYml0IChsZXhlci0+ZW9sYnl0ZSwgd29ya19jbGFz cyk7CiAgICB9CiAgaWYgKGxleGVyLT5zeW50YXhfYml0cyAmIFJFX0RPVF9OT1RfTlVMTCkK ICAgIHsKICAgICAgY2hhcmNsYXNzX2NscmJpdCAoMCwgd29ya19jbGFzcyk7CiAgICB9CiAg bGV4ZXItPmRvdGNsYXNzX2luZGV4ID0gY2hhcmNsYXNzX2NvbXBsZXRlZCAod29ya19jbGFz cyk7CiAgbGV4ZXItPmRvdGNsYXNzID0gY2hhcmNsYXNzX2dldF9wb2ludGVyIChsZXhlci0+ ZG90Y2xhc3NfaW5kZXgpOwoKICAvKiBUZXN0aW5nIGZvciB0aGUgYWJzZW5jZSBvZiBSRV9O T19HTlVfT1BTIGluIHN5bnRheF9iaXRzIGhhcHBlbnMKICAgICBvZnRlbiwgc28gc2V0IGEg ZGlyZWN0IGZsYWcgdmFyaWFibGU6ICBUaGlzIG1ha2VzIGNvZGUgbW9yZQogICAgIHJlYWRh YmxlLiAgKi8KICBsZXhlci0+cmVfZ251X29wcyA9ICEgKGxleGVyLT5zeW50YXhfYml0cyAm IFJFX05PX0dOVV9PUFMpOwoKICAvKiBJbml0aWFsaXNlIGNhY2hlIGFuZCBvdGhlciB0YWJs ZXMgdGhhdCBoYXZlIHN5bnRheCBhbmQvb3IgbG9jYWxlCiAgICAgaW5mbHVlbmNlcy4gICov CgogIC8qIFNldCB1cCB0aGUgd2NoYXJfZGVzYyBmaWVsZHMgb2YgdGhlIHByZWRpY2F0ZSB0 YWJsZS4gICovCiAgZm9yIChwcmVkID0gbGV4ZXItPnByZWRpY2F0ZXM7IHByZWQtPm5hbWUg IT0gTlVMTDsgcHJlZCsrKQogICAgcHJlZC0+d2NoYXJfZGVzYyA9IHdjdHlwZSAocHJlZC0+ bmFtZSk7CgogIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBsb2NhbGUuICBO b3RlIHRoYXQgc2V0bG9jYWxlIGNhbgogICAgIHJldHVybiBOVUxMIGZvciB0aGUgbmFtZS4g ICovCiAgbGV4ZXItPmxvY2FsZV9uYW1lID0gTlVMTDsKICBsb2NhbGVfbmFtZSA9IHNldGxv Y2FsZSAoTENfQUxMLCBOVUxMKTsKICBpZiAobG9jYWxlX25hbWUgIT0gTlVMTCkKICAgIGxl eGVyLT5sb2NhbGVfbmFtZSA9IHhzdHJkdXAgKGxvY2FsZV9uYW1lKTsKCiAgLyogRGV0ZXJt aW5lIGlmIHRoZSBsb2NhbGUncyB0cmVhdG1lbnQgb2YgY29kZXMgMC0xMjcgbWF0Y2hlcyBB U0NJSSwKICAgICBhcyBzb21lIG9wZXJhdGlvbnMgKGUuZy4gIltjLXZdIikgYmVjb21lIGVh c2llciB0byBoYW5kbGUuICAqLwogIGxleGVyLT5hc2NpaV83Yml0X2VuY29kaW5nID0gY2hh cl9lbmNvZGluZ183Yml0c19pc19hc2NpaSAoKTsKCiAgLyogRnVydGhlciBvcHRpbWlzYXRp b25zIGFyZSBwb3NzaWJsZSBpZiB0aGUgbG9jYWxlIGlzIGFuIHVuaWJ5dGUKICAgICBBU0NJ SSA3LWJpdCBDL1BPU0lYIGVudmlyb25tZW50LCBhbmQgdGhpcyBpcyBhIGNvbW1vbiBjYXNl LCBzbwogICAgIHNwZW5kIHNvbWUgZWZmb3J0IGxvb2tpbmcgZm9yIHRoaXMgc2l0dWF0aW9u LiAgKi8KICBsZXhlci0+dXNpbmdfc2ltcGxlX2xvY2FsZSA9IGZhbHNlOwogIGlmIChsZXhl ci0+dW5pYnl0ZV9sb2NhbGUgJiYgbGV4ZXItPmFzY2lpXzdiaXRfZW5jb2RpbmcpCiAgICB7 CiAgICAgIGxleGVyLT51c2luZ19zaW1wbGVfbG9jYWxlID0gISBsZXhlci0+bG9jYWxlX25h bWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBTVFJFUSAobGV4ZXIt PmxvY2FsZV9uYW1lLCAiQyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fHwgU1RSRVEgKGxleGVyLT5sb2NhbGVfbmFtZSwgIlBPU0lYIik7CiAgICB9CgogIC8qIElu aXRpYWxpc2UgY2FjaGUgdGhhdCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdW5pYnl0ZSBhbmQg bXVsdGlieXRlCiAgICAgKHdpZGUpIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGxlYWRpbmcg b2N0ZXQuICAqLwogIGluaXRpYWxpc2VfdWNoYXJfdG9fd2NfY2FjaGUgKGxleGVyKTsKCiAg LyogPz8gSWYgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBsb2NhbGUgbmVlZHMgdG8gYmUgc3Rv cmVkIHdpdGhpbgogICAgIHRoaXMgaW5zdGFuY2UsIHNlZSAgdXNlbG9jYWxlKDMpIGFuZCBk dXBsb2NhbGUoMykgKGFuZCBmcmVlIHRoZQogICAgIGNvcHkgd2l0aCBmcmVlbG9jYWxlKDMp KS4gICovCgp9CgpdXSkpCgotLSAxMiBBcHIgMjAxNDogU3VwcG9ydCB0aGUgbmV3bHktaW50 cm9kdWNlZCAiZXhjaGFuZ2UiIGludGVyZmFjZQphc3NlcnQoZjp3cml0ZShEZWNsc1sibGV4 LWV4Y2hhbmdlIl0sIFtbCnsKICBDSEVDS19DT05URVhUIChsZXhlcik7CgogIHN3aXRjaCAo b3Bjb2RlKQogICAgewogICAgY2FzZSBQUk9UT19MRVhQQVJTRV9PUF9HRVRfSVNfTVVMVElC WVRFX0xPQ0FMRToKICAgICAgcmV0dXJuIChpbnQpIGxleGVyLT5tdWx0aWJ5dGVfbG9jYWxl OwogICAgY2FzZSBQUk9UT19MRVhQQVJTRV9PUF9HRVRfUkVQTU5fTUlOOgogICAgICByZXR1 cm4gbGV4ZXItPm1pbnJlcDsKICAgIGNhc2UgUFJPVE9fTEVYUEFSU0VfT1BfR0VUX1JFUE1O X01BWDoKICAgICAgcmV0dXJuIGxleGVyLT5tYXhyZXA7CiAgICBjYXNlIFBST1RPX0xFWFBB UlNFX09QX0dFVF9XSURFX0NIQVJfTElTVF9NQVg6CiAgICAgIC8qIE9yaWdpbmFsIHRva2Vu LCBwbHVzIHVwcGVyL2xvd2VyY2FzZSwgcGx1cyBleHRlbmRlZCB2YXJpYW50cy4gICovCiAg ICAgIHJldHVybiAxICsgQ0FTRV9GT0xERURfQlVGU0laRTsKICAgIGNhc2UgUFJPVE9fTEVY UEFSU0VfT1BfR0VUX1dJREVfQ0hBUlM6CiAgICAgIHsKICAgICAgICB3Y2hhcl90ICpwX3dj ID0gKHdjaGFyX3QgKikgcGFyYW07CgogICAgICAgIC8qIFJlY29yZCB0aGUgb3JpZ2luYWwg dG9rZW4gKHdjdG9rKSBpbXBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgIFdD SEFSLiAgKi8KICAgICAgICAqcF93YysrID0gbGV4ZXItPndjdG9rOwoKICAgICAgICAvKiBB ZGQgaW4gZGlyZWN0IGFuZC9vciBpbmRpcmVjdCBjYXNlIGVxdWl2YWxlbnRzLCBhcyBhcHBy b3ByaWF0ZS4gICovCiAgICAgICAgaWYgKGxleGVyLT5jYXNlX2ZvbGQpCiAgICAgICAgICBw X3djICs9IGNhc2VfZm9sZGVkX2NvdW50ZXJwYXJ0cyAobGV4ZXIsIGxleGVyLT53Y3Rvaywg cF93Yyk7CgogICAgICAgIC8qIFJldHVybiBob3cgbWFueSB3aWRlIGNoYXJzIChhdCBsZWFz dCAxKSBhcmUgaW4gdGhlIGxpc3QuICAqLwogICAgICAgIHJldHVybiBwX3djIC0gKHdjaGFy X3QgKikgcGFyYW07CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIFBST1RPX0xFWFBB UlNFX09QX0dFVF9ET1RDTEFTUzoKICAgICAgKigoY2hhcmNsYXNzX3QgKiopIHBhcmFtKSA9 IGxleGVyLT5kb3RjbGFzczsKICAgICAgYnJlYWs7CiAgICBjYXNlIFBST1RPX0xFWFBBUlNF X09QX0dFVF9NQkNTRVQ6CiAgICAgIC8qIFJldHVybiB0aGUgc2V0IGFzc29jaWF0ZWQgd2l0 aCB0aGUgbW9zdCByZWNlbnQgTUJDU0VUIHRva2VuLiAgKi8KICAgICAgKigobWJjc2V0c19z ZXRfdCAqKikgcGFyYW0pID0gbGV4ZXItPm1iY3NldHNbbGV4ZXItPm5tYmNzZXRzIC0gMV07 CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgLyogPz8gTm90IHN1cmUgaWYgd2Ug c2hvdWxkIGNvbXBsYWluL2Fzc2VydCBvciBtZXJlbHkgaWdub3JlIGFuCiAgICAgICAgIG9w Y29kZSB0aGF0IHdlIGRvbid0IHJlY29nbmlzZSBoZXJlLiAgKi8KICAgICAgYXNzZXJ0ICgh InVucmVjb2duaXNlZCBQUk9UT19MRVhQQVJTRSBvcGNvZGUiKTsKICAgICAgLyogTk9UUkVB Q0hFRCAqLwogICAgICBicmVhazsKICAgIH0KCiAgICAvKiBJZiB3ZSByZWFjaCBoZXJlLCBy ZXR1cm4gdmFsdWUgaXMgdW5pbXBvcnRhbnQsIHNvIGp1c3Qgc2F5IDAuICAqLwogICAgcmV0 dXJuIDA7Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKERlY2xzWyJsZXgtZXhjZXB0aW9uLWZu cyJdLCBbWwp7CiAgQ0hFQ0tfQ09OVEVYVCAobGV4ZXIpOwoKICAvKiBSZWNvcmQgdGhlIHBy b3ZpZGVkIGZ1bmN0aW9ucyBpbiB0aGUgbGV4ZXIncyBjb250ZXh0LiAgKi8KICBsZXhlci0+ d2Fybl9jbGllbnQgICAgICAgID0gd2FybmluZ2ZuOwogIGxleGVyLT5hYmFuZG9uX3dpdGhf ZXJyb3IgPSBlcnJvcmZuOwp9CgpdXSkpCgphc3NlcnQoZjp3cml0ZShbWwovKiBBZGQgIm5v dCBwcm92aWRlZCEiIHN0dWIgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBpZiB0aGUgY2xp ZW50CiAgIGZhaWxzIHRvIHByb3ZpZGUgcHJvcGVyIHJlc291cmNlcy4gIFRoaXMgaXMgYSBo YWNrLCBtZXJlbHkgdG8gZ2V0CiAgIHRoZSBtb2R1bGUgc3RhcnRlZDsgYmV0dGVyIHRyZWF0 bWVudCBuZWVkcyB0byBiZSBhZGRlZCBsYXRlci4gICovCnN0YXRpYyB2b2lkCm5vX2Z1bmN0 aW9uX3Byb3ZpZGVkICh2b2lkICp1bnVzZWQpCnsKIGFzc2VydCAoISJmc2FsZXg6IFBsdWct aW4gZnVuY3Rpb24gcmVxdWlyZWQsIGJ1dCBub3QgcHJvdmlkZWQuIik7Cn0KCl1dKSkKCi0t IERlZmluZSBhICJuZXciIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuIGluaXRpYWwgcGFyc2Vy IGNvbnRleHQuCmFzc2VydChmOndyaXRlKERlY2xzWyJsZXgtbmV3Il0sIFtbCnsKICBmc2Fs ZXhfY3R4dF90ICpuZXdfY29udGV4dDsKCiAgLyogQWNxdWlyZSB6ZXJvZWQgbWVtb3J5IGZv ciBuZXcgbGV4ZXIgY29udGV4dC4gICovCiAgbmV3X2NvbnRleHQgPSBYWkFMTE9DIChmc2Fs ZXhfY3R4dF90KTsKCiAgLyogSW1tZWRpYXRlbHkgc2V0IHVwIHRvcCBhbmQgYm90dG9tIGNv bnRleHQgY2FuYXJ5L2ZlbmNlcy4gICovCiAgbmV3X2NvbnRleHQtPnRvcF9mZW5jZV9tYWdp Y19uciAgICA9IENPTlRFWFRfVE9QX0ZFTkNFX01BR0lDX05SOwogIG5ld19jb250ZXh0LT5i b3R0b21fZmVuY2VfbWFnaWNfbnIgPSBDT05URVhUX0JPVFRPTV9GRU5DRV9NQUdJQ19OUjsK CiAgLyogPz8gUG9pbnQgd2FybmluZyBhbmQgZXJyb3IgZnVuY3Rpb25zIHRvIGEgInlvdSBu ZWVkIHRvIHRlbGwgbWUKICAgICB0aGVzZSBmaXJzdCEiIGZ1bmN0aW9uPyAqLwogIG5ld19j b250ZXh0LT53YXJuX2NsaWVudCAgICAgICAgPSAoZnNhbGV4X3dhcm5fY2FsbGJhY2tfZm4g KikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fZnVuY3Rpb25fcHJv dmlkZWQ7CiAgbmV3X2NvbnRleHQtPmFiYW5kb25fd2l0aF9lcnJvciA9IChmc2FsZXhfZXJy b3JfY2FsbGJhY2tfZm4gKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bm9fZnVuY3Rpb25fcHJvdmlkZWQ7CgogIC8qIERlZmF1bHQgdG8gd29ya2luZyBpbiBhIG5v bi1tdWx0aWJ5dGUgbG9jYWxlLiAgSW4gc29tZSBjYXNlcywKICAgICBGRVRDSF9XQyBuZXZl ciBzZXRzIHRoaXMgdmFyaWFibGUgKGFzIGl0J3MgYXNzdW1lZCB0byBiZSAxKSwgc28KICAg ICBmdWxmaWwgdGhpcyBleHBlY3RhdGlvbiBoZXJlLiAgKi8KICBuZXdfY29udGV4dC0+Y3Vy X21iX2xlbiA9IDE7CgogIC8qIENvcHkgdGhlIHRlbXBsYXRlIHByZWRpY2F0ZSBsaXN0IGlu dG8gdGhpcyBjb250ZXh0LCBzbyB0aGF0IHdlCiAgICAgY2FuIGhhdmUgbGV4ZXItc3BlY2lm aWMgbmFtZWQgcHJlZGljYXRlIGNsYXNzZXMuICAqLwogIG1lbWNweSAobmV3X2NvbnRleHQt PnByZWRpY2F0ZXMsIHRlbXBsYXRlX3ByZWRpY2F0ZV9saXN0LAogICAgICAgICBzaXplb2Yg KG5ld19jb250ZXh0LT5wcmVkaWNhdGVzKSk7CgogIC8qIERlZmF1bHQgdG8gdW5pYnl0ZSBs b2NhbGUgYXQgZmlyc3Q7IHRoZSBmaW5hbCBsb2NhbGUgc2V0dGluZyBpcwogICAgIG1hZGUg YWNjb3JkaW5nIHRvIHdoYXQncyBpbiBmb3JjZSB3aGVuIGZzYWxleF9zeW50YXggKCkgaXMK ICAgICBjYWxsZWQuICAqLwogIG5ld19jb250ZXh0LT51bmlieXRlX2xvY2FsZSA9IHRydWU7 CiAgbmV3X2NvbnRleHQtPm11bHRpYnl0ZV9sb2NhbGUgPSBmYWxzZTsKCiAgLyogTWFueSB0 aGluZ3MgZGVwZW5kIG9uIGRlY2lzaW9ucyBtYWRlIGluIGZzYWxleF9zeW50YXggKCksIHNv IG5vdGUKICAgICBoZXJlIHRoYXQgaXQgaGFzbid0IGJlZW4gY2FsbGVkIHlldCwgYW5kIGZh aWwgZ3JhY2VmdWxseSBsYXRlciBpZgogICAgIHRoZSBjbGllbnQgaGFzbid0IGNhbGxlZCB0 aGUgZnVuY3Rpb24gYmVmb3JlIGNvbW1lbmNpbmcgd29yay4gICovCiAgbmV3X2NvbnRleHQt PnN5bnRheF9pbml0aWFsaXNlZCA9IGZhbHNlOwoKICAvKiBBZGQgdGhpcyBpbnN0YW5jZSBh dCB0aGUgaGVhZCBvZiB0aGUgbW9kdWxlJ3MgbGlzdC4gICovCiAgbmV3X2NvbnRleHQtPm5l eHRfaW5zdGFuY2UgPSBmc2FsZXhfaW5zdGFuY2VfbGlzdF9oZWFkOwogIGZzYWxleF9pbnN0 YW5jZV9saXN0X2hlYWQgPSBuZXdfY29udGV4dDsKCiAgQ0hFQ0tfQ09OVEVYVChuZXdfY29u dGV4dCk7CgogIHJldHVybiBuZXdfY29udGV4dDsKfQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUo W1sKLyogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZnJlZSBhbGwgcmVzb3VyY2VzIGRpcmVjdGx5 IG9yIGluZGlyZWN0bHkgdXNlZAogICBieSBhbiBpbnN0YW5jZS4gIFRoZSBwb2ludGVyIGlz IG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGNhbGwuICAqLwpzdGF0aWMgdm9pZApmcmVl X2luc3RhbmNlIChmc2FsZXhfY3R4dF90ICpsZXhlcikKewogIC8qIEZyZWUgdG9wLWxldmVs IHN0cnVjdHVyZXMuICAqLwogIGZyZWUgKGxleGVyLT5sb2NhbGVfbmFtZSk7CiAgZnJlZSAo bGV4ZXItPm1iY3NldHMpOwoKICAvKiBEZXN0cm95IHRvcC9ib3R0b20gZmVuY2UvY2FuYXJ5 IHNlbnRpbmVscyB0byBhdm9pZCBjb25mdXNpb24uICAqLwogIGxleGVyLT50b3BfZmVuY2Vf bWFnaWNfbnIgICAgKz0gMHg1YTVhNWE1YTsKICBsZXhlci0+Ym90dG9tX2ZlbmNlX21hZ2lj X25yICs9IDB4NWE1YTVhNWE7CgogIGZyZWUgKGxleGVyKTsKCiAgLyogTm90ZSB0aGF0IG11 bHRpYnl0ZSBzZXRzIGFyZSBubyBsb25nZXIgc3RvcmVkIGV4cGxpY2l0bHkgaW4KICAgICB0 aGUgaW5zdGFuY2U7IGFwYXJ0IGZyb20gdGhlIHBvaW50ZXIgbGlzdCAoZnJlZWQgYWJvdmUp LCB0aGUKICAgICBzZXQgY29udGVudHMgYXJlIGZyZWVkIHNlcGFyYXRlbHkgd2hlbiBtYmNz ZXRzIG1vZHVsZSBpcwogICAgIGRlc3Ryb3llZC4gICovCn0KCl1dKSkKCmFzc2VydChmOndy aXRlKERlY2xzWyJsZXgtZGVzdHJveS1tb2R1bGUiXSwgW1sKewogIGZzYWxleF9jdHh0X3Qg KnBfbGlzdDsKICBmc2FsZXhfY3R4dF90ICpwX25leHQ7CgogIC8qIE1vdmUgdGhlIGdsb2Jh bCBsaXN0IGhlYWQgaW50byBhIGxvY2FsIHZhcmlhYmxlLCBhbmQgaW1tZWRpYXRlbHkKICAg ICBjbGVhciB0aGUgZ2xvYmFsLiAgVGhpcyBpcyBhIGhhbGYtaGVhcnRlZCBhdHRlbXB0IHRv IGF2b2lkIHJhY2UKICAgICBjb25kaXRpb25zOyB0byBkbyB0aGluZ3MgcHJvcGVybHksIGEg c3lzdGVtLXdpZGUgYXRvbWljCiAgICAgb3BlcmF0aW9uIChsb2NrZWQsIGluY2x1ZGluZyBt dWx0aS1DUFUgY2FjaGUgY29oZXJlbmN5KSBvcGVyYXRpb24KICAgICBzaG91bGQgYmUgdXNl ZC4gICovCiAgcF9saXN0ID0gZnNhbGV4X2luc3RhbmNlX2xpc3RfaGVhZDsKICBmc2FsZXhf aW5zdGFuY2VfbGlzdF9oZWFkID0gTlVMTDsKCiAgLyogVHJhdmVyc2UgdGhlIGxpc3Qgb2Yg aW5zdGFuY2VzLCByZWxlYXNpbmcgYWxsIHJlc291cmNlcwogICAgIGFzc29jaWF0ZWQgd2l0 aCBlYWNoIG9uZS4gICovCiAgd2hpbGUgKHBfbGlzdCkKICAgIHsKICAgICAgcF9uZXh0ID0g cF9saXN0LT5uZXh0X2luc3RhbmNlOwogICAgICBmcmVlX2luc3RhbmNlIChwX2xpc3QpOwog ICAgICBwX2xpc3QgPSBwX25leHQ7CiAgICB9Cn0KCl1dKSkKCmFzc2VydChmOndyaXRlKERl Y2xzWyJsZXgtaW5pdGlhbGlzZSJdLCBbWwp7CiAgLyogSW5pdGlhbGlzZSB0aGUgbGlua2Vk IGxpc3Qgb2YgaW5zdGFuY2VzIGNyZWF0ZWQgYnkgdGhpcyBtb2R1bGUuICAqLwogIGZzYWxl eF9pbnN0YW5jZV9saXN0X2hlYWQgPSBOVUxMOwoKICBhdGV4aXQgKGZzYWxleF9kZXN0cm95 X21vZHVsZSk7Cn0KCl1dKSkKCi0tIEZpbmFsbHksIGFkZCB0cmFpbGVyIGxpbmUgKHZpbSkK YXNzZXJ0KGY6d3JpdGUoW1sKLyogdmltOnNldCBzaGlmdHdpZHRoPTI6ICovCl1dKSkKCmFz c2VydChmOmNsb3NlKCkpCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLS0tLS0tLS0tLS0tLS0t LSoqKioqKioqIGZzYXBhcnNlLmggKioqKioqKiotLS0tLS0tLS0tLS0tLS0tCgpwcmludCgi Q3JlYXRpbmcgZnNhcGFyc2UuaC4uLiIpCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbigiZnNh cGFyc2UuaCIsICJ3IikpCmFzc2VydChmOndyaXRlKFtbCi8qIGZzYXBhcnNlIC0tIEJ1aWxk IGEgc3RydWN0dXJlIG5hbWluZyByZWxhdGlvbnNoaXBzIChzZXF1ZW5jZXMsCiAgICAgICAg ICAgICAgIGFsdGVybmF0aXZlcywgb3B0aW9ucyBhbmQgcHJlY2VkZW5jZSkgb2YgdG9rZW5z CgpdXSkpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkNvcHlyaWdodC5kZmFjIiksICJcbiIp KQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJMaWNlbnNlV2FycmFudHkuZGZhYyIpLCAiXG4i KSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQXV0aG9ycy5kZmFjIikpKQphc3NlcnQoZjp3 cml0ZShbWwoKLyogMjAxNDogUmVwYWNrYWdlZCBieSAidW50YW5nbGUiIHNjcmlwdCwgd3Jp dHRlbiBieSBiZWhvZmZza2kuICAqLwoKLyogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBhIHN0 cmVhbSBvZiB0b2tlbnMgZnJvbSBmc2FsZXgsIGFuZAogICBwcm9jZXNzZXMgdGhlbSB0byBp bXBvc2UgcHJlY2VkZW5jZSBydWxlcyBhbmQgdG8gZGVzY3JpYmUgY29tcGxleAogICBwYXR0 ZXJuIGVsZW1lbnRzIHRoYXQgYXJlIGJleW9uZCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgc2lt cGxlCiAgIGxleGVyLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNhc2VzIGV4cGxpY2l0IGluIHRo ZSBzeW50YXggKGUuZy4KICAgIihhYnxjKSIsIHZhcmlhYmxlLWxlbmd0aCBtdWx0aWJ5dGUg ZW5jb2RpbmdzIChVVEYtODsgY29kZXNldHMKICAgaW5jbHVkaW5nIG1vZGlmaWVycyBhbmQv b3Igc2hpZnQgaXRlbXMpIGFsc28gcmVxdWlyZSB0aGVzZSBlbmhhbmNlZAogICBmYWNpbGl0 aWVzLiAgKi8KCl1dKSkKCi0tIEFkZCBwcmVwcm9jZXNzb3IgbGluZXMgdG8gbWFrZSB0aGlz IGhlYWRlciBmaWxlIGlkZW1wb3RlbnQuCmFzc2VydChmOndyaXRlKFtbCiNpZm5kZWYgRlNB UEFSU0VfSAojZGVmaW5lIEZTQVBBUlNFX0ggMQoKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9u bWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUg PGNvbmZpZy5oPgoKI2luY2x1ZGUgImZzYXRva2VuLmgiCiNpbmNsdWRlICJwcm90by1sZXhw YXJzZS5oIgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYgLyogX19j cGx1c3BsdXMgKi8KCi8qIE11bHRpcGxlIHBhcnNlciBpbnN0YW5jZXMgY2FuIGV4aXN0IGlu IHBhcmFsbGVsLCBzbyBkZWZpbmUgYW4gb3BhcXVlCiAgIHR5cGUgdG8gY29sbGVjdCB0b2dl dGhlciBhbGwgdGhlIGNvbnRleHQgcmVsYXRpbmcgdG8gZWFjaCBpbnN0YW5jZS4gICovCnR5 cGVkZWYgc3RydWN0IGZzYXBhcnNlX2N0eHRfc3RydWN0IGZzYXBhcnNlX2N0eHRfdDsKCi8q IEFsbG93IGNvbmZpZ3VyYWJsZSBwYXJzZXIvbGV4ZXIgY29tYmluYXRpb25zIGJ5IHVzaW5n IGEgcGx1Z2luIGludGVyZmFjZQogICBmb3IgbGV4ZXIgaW52b2NhdGlvbi4gICovCnR5cGVk ZWYgZnNhdG9rZW5fdG9rZW5fdApmc2FwYXJzZV9sZXhlcl9mbl90ICh2b2lkICpsZXhlcl9j b250ZXh0KTsKCi8qIEZ1bmN0aW9ucyB0byBpbml0aWFsaXNlIGFuZCB0ZWFyIGRvd24gZW50 aXJlIG1vZHVsZSBhbmQgYWxsIGFzc29jaWF0ZWQKICAgaW5zdGFuY2VzLiAgKi8KCl1dKSkK CldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1sicGFyc2UtaW5pdGlhbGlzZSJdKQpXcml0ZUV4 dGVybkRlY2woZiwgRGVjbHNbInBhcnNlLWRlc3Ryb3ktbW9kdWxlIl0pCgphc3NlcnQoZjp3 cml0ZShbWwovKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGEgbmV3IHBhcnNlciBpbnN0YW5jZSwg YW5kIHRvIGNvbm5lY3QgaXQgd2l0aAogICBhIGNvbXBhdGlibGUgbGV4ZXIgaW5zdGFuY2Uu ICAqLwoKXV0pKQpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNbInBhcnNlLW5ldyJdKQpXcml0 ZUV4dGVybkRlY2woZiwgRGVjbHNbInBhcnNlLWxleGVyIl0pCgotLSBGSVhNRTogVGhlIGZv bGxvd2luZyBpcyBhIGNvcHktcGFzdGUtYW5kLXJlbmFtZS1lZGl0IGZyb20gdGhlIGZzYWxl eAotLSBjb2RlLiAgSXMgdGhlcmUgYSBsZXNzIHJlZHVuZGFudCB3YXkgb2YgZG9pbmcgdGhp cz8KCi0tIFdoaWxlIGRmYS5oIGRlY2xhcmVzIGRmYXdhcm4oKSBhbmQgZGZhZXJyb3IoKSwg YW5kIGRlbWFuZHMgdGhhdCB0aGUKLS0gY2xpZW50IHN1cHBseSBmdW5jdGlvbnMgYXQgbGlu ayB0aW1lLCB3ZSBpbnN0ZWFkIHByb3ZpZGUgYW4KLS0gaW50ZXJmYWNlIGZ1bmN0aW9uIHNv IHRoYXQgdGhlIGZ1bmN0aW9ucyBjYW4gYmUgaGFuZGVkIG92ZXIKLS0gZXhwbGljaXRseS4g IFRoaXMgc3R5bGUgbWF5IGJlIHVzZWZ1bCBpbiB0aGUgZnV0dXJlIGlmIHdlIHdhbnQgdG8K LS0gbW92ZSBmcm9tIGEgc2luZ2xlIHBhcnNlciBpbnN0YW5jZSB0byBtdWx0aXBsZSBpbnN0 YW5jZXMgKG9iamVjdHM/KQphc3NlcnQoZjp3cml0ZShbWwovKiBEZWZpbmUgZnVuY3Rpb24g cHJvdG90eXBlcyBmb3Igd2FybmluZyBhbmQgZXJyb3IgY2FsbGJhY2tzLiAgKi8KdHlwZWRl ZiB2b2lkCmZzYXBhcnNlX3dhcm5fY2FsbGJhY2tfZm4gKGNvbnN0IGNoYXIgKik7CnR5cGVk ZWYgdm9pZCAvKiA/PyBfTm9yZXR1cm4/ICovCmZzYXBhcnNlX2Vycm9yX2NhbGxiYWNrX2Zu IChjb25zdCBjaGFyICopOwoKLyogUmVjZWl2ZSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGV4 Y2VwdGlvbnMgZGV0ZWN0ZWQgYnkgdGhlIHBhcnNlcjoKICAgV2FybmluZ3MgYW5kIGVycm9y cy4gIEludGVybmFsbHksIHdlIGFkZCB0aGUgX05vcmV0dXJuIGF0dHJpYnV0ZQogICB0byB0 aGUgZXJyb3IgY2FsbGJhY2ssIHRvIGhlbHAgdGhlIGNvbXBpbGVyIHdpdGggY29kZSBmbG93 CiAgIGFuYWx5c2lzLiAgKi8KZXh0ZXJuIHZvaWQKZnNhcGFyc2VfZXhjZXB0aW9uX2ZucyAo ZnNhcGFyc2VfY3R4dF90ICpwYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICBmc2FwYXJz ZV93YXJuX2NhbGxiYWNrX2ZuICp3YXJuaW5nZm4sCiAgICAgICAgICAgICAgICAgICAgICBm c2FwYXJzZV9lcnJvcl9jYWxsYmFja19mbiAqZXJyb3Jmbik7CgpdXSkpCgpXcml0ZUV4dGVy bkRlY2woZiwgRGVjbHNbInBhcnNlIl0pCgpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNbInBh cnNlLWdldC10b2tlbi1saXN0Il0pCgotLSBGaW5hbGx5LCBhZGQgdHJhaWxlciBsaW5lcyAo aWRlbXBvdGVuY3ksIHZpbSkKYXNzZXJ0KGY6d3JpdGUoW1sKI2lmZGVmIF9fY3BsdXNwbHVz Cn0KI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCgojZW5kaWYgLyogRlNBUEFSU0VfSCAqLwoK LyogdmltOnNldCBzaGlmdHdpZHRoPTI6ICovCl1dKSkKCmFzc2VydChmOmNsb3NlKCkpCgot LS0tLS0tLS0tLS0tLS0tKioqKioqKiogZnNhcGFyc2UuYyAqKioqKioqKi0tLS0tLS0tLS0t LS0tLS0KCnByaW50KCJDcmVhdGluZyBmc2FwYXJzZS5jLi4uIikKbG9jYWwgZiA9IGFzc2Vy dChpby5vcGVuKCJmc2FwYXJzZS5jIiwgInciKSkKYXNzZXJ0KGY6d3JpdGUoW1sKLyogZnNh cGFyc2UgLS0gQnVpbGQgYSBzdHJ1Y3R1cmUgbmFtaW5nIHJlbGF0aW9uc2hpcHMgKHNlcXVl bmNlcywKICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmVzLCBiYWNrcmVmZXJlbmNlcywgb3B0 aW9ucyBhbmQgcHJlY2VkZW5jZSkKICAgICAgICAgICAgICAgb2YgdG9rZW5zCgpdXSkpCmFz c2VydChmOndyaXRlKFJhd1RleHQoIkNvcHlyaWdodC5kZmFjIiksICJcbiIpKQphc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJMaWNlbnNlV2FycmFudHkuZGZhYyIpLCAiXG4iKSkKYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiQXV0aG9ycy5kZmFjIikpKQphc3NlcnQoZjp3cml0ZShbWwoK LyogMjAxNDogUmVwYWNrYWdlZCBieSAidW50YW5nbGUiIHNjcmlwdCwgd3JpdHRlbiBieSBi ZWhvZmZza2kuICAqLwoKLyogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBhIHN0cmVhbSBvZiB0 b2tlbnMgZnJvbSBmc2FsZXgsIGFuZCBwcm9jZXNzZXMKICAgdGhlbSB0byBpbXBvc2UgcHJl Y2VkZW5jZSBydWxlcyBhbmQgdG8gZGVzY3JpYmUgY29tcGxleCBwYXR0ZXJuCiAgIGVsZW1l bnRzIHRoYXQgYXJlIGJleW9uZCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgc2ltcGxlIGxleGVy LiAgSW4KICAgYWRkaXRpb24gdG8gdGhlIGNhc2VzIGV4cGxpY2l0IGluIHRoZSBzeW50YXgg KGUuZy4iKGFifGMpIiwKICAgdmFyaWFibGUtbGVuZ3RoIG11bHRpYnl0ZSBlbmNvZGluZ3Mg KFVURi04OyBjb2Rlc2V0cyBpbmNsdWRpbmcKICAgbW9kaWZpZXJzIGFuZC9vciBzaGlmdCBp dGVtcykgYWxzbyByZXF1aXJlIHRoZXNlIGVuaGFuY2VkCiAgIGZhY2lsaXRpZXMuICAqLwoK XV0pKQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9ubWVudC1z cGVjaWZpYyBjb25maWd1cmF0aW9uIGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUgPGNvbmZp Zy5oPgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSAiY2hhcmNsYXNzLmgiCiNpbmNs dWRlICJmc2FwYXJzZS5oIgojaW5jbHVkZSAiZnNhbGV4LmgiCiNpbmNsdWRlICJmc2F0b2tl bi5oIgojaW5jbHVkZSAibWJjc2V0cy5oIgojaW5jbHVkZSAicHJvdG8tbGV4cGFyc2UuaCIK I2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAieGFs bG9jLmgiCgovKiBnZXR0ZXh0LmggZW5zdXJlcyB0aGF0IHdlIGRvbid0IHVzZSBnZXR0ZXh0 IGlmIEVOQUJMRV9OTFMgaXMgbm90IGRlZmluZWQgKi8KI2luY2x1ZGUgImdldHRleHQuaCIK I2RlZmluZSBfKHN0cikgZ2V0dGV4dCAoc3RyKQoKI2luY2x1ZGUgPHdjaGFyLmg+CiNpbmNs dWRlIDx3Y3R5cGUuaD4KCl1dKSkKCi0tIEdlbmVyYWwgaGVscGVyIG1hY3Jvcwphc3NlcnQo Zjp3cml0ZShbWwojaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCiMgaW5jbHVkZSA8bGFuZ2lu Zm8uaD4KI2VuZGlmCgpdXSkpCgphc3NlcnQoZjp3cml0ZShbWwovKiBmc2FwYXJzZV9jdHh0 OiBHYXRoZXIgYWxsIHRoZSBjb250ZXh0IHRvIGRvIHdpdGggdGhlIHBhcnNlciBpbnRvIGEK ICAgc2luZ2xlIHN0cnVjdC4gIFdlIGRvIHRoaXMgbWFpbmx5IGJlY2F1c2UgaXQgbWFrZSBp dCBlYXNpZXIgdG8KICAgY29udGVtcGxhdGUgaGF2aW5nIG11bHRpcGxlIGluc3RhbmNlcyBv ZiB0aGlzIG1vZHVsZSBydW5uaW5nIGluCiAgIHBhcmFsbGVsLCBidXQgYWxzbyBiZWNhdXNl IGl0IG1ha2VzIHRyYW5zbGF0aW5nIGZyb20gImRmYS0+IiBlYXNpZXIuCiAgIFRoaXMgZGVm aW5pdGlvbiBmbGVzaGVzIG91dCB0aGUgb3BhcXVlIHR5cGUgZ2l2ZW4gaW4gdGhlIG1vZHVs ZQogICBoZWFkZXIuICAqLwpzdHJ1Y3QgZnNhcGFyc2VfY3R4dF9zdHJ1Y3QKewogIC8qIFNp Z25hdHVyZS9jYW5hcnkgdG9rZW4gZm9yIHRvcCBvZiBzdHJ1Y3QuICAqLwogIHVuc2lnbmVk IGxvbmcgdG9wX2ZlbmNlX21hZ2ljX25yOwoKICAvKiBTaW5nbHktbGlua2VkIGxpc3Qgb2Yg YWxsIHBhcnNlciBpbnN0YW5jZXMsIHNvIGRlc3Ryb3lfbW9kdWxlIGNhbgogICAgIHJlbGVh c2UgYWxsIHJlc291cmNlcyBieSB0cmF2ZXJzaW5nIHRoZSBsaXN0LiAgKi8KICBmc2FwYXJz ZV9jdHh0X3QgKm5leHRfaW5zdGFuY2U7CgogIC8qIFdhcm5pbmcgYW5kIGFib3J0IGZ1bmN0 aW9ucyBwcm92aWRlZCBieSBjbGllbnQuICAqLwogIGZzYWxleF93YXJuX2NhbGxiYWNrX2Zu ICp3YXJuX2NsaWVudDsKICBmc2FsZXhfZXJyb3JfY2FsbGJhY2tfZm4gKmFiYW5kb25fd2l0 aF9lcnJvcjsKCiAgLyogUGx1Zy1pbiBmdW5jdGlvbnMgYW5kIGNvbnRleHQgdG8gZGVhbCB3 aXRoIGxleGVyIGF0IGFybSdzCiAgICAgbGVuZ3RoLiAgKi8KICBwcm90b19sZXhwYXJzZV9s ZXhfZm5fdCAqbGV4ZXI7CiAgcHJvdG9fbGV4cGFyc2VfZXhjaGFuZ2VfZm5fdCAqbGV4X2V4 Y2hhbmdlOwogIHZvaWQgKmxleF9jb250ZXh0OwoKICAvKiBJbmZvcm1hdGlvbiBhYm91dCBs b2NhbGUgKG5lZWRzIHRvIHN5bmMgd2l0aCBsZXhlci4uLj8pICovCiAgYm9vbCBtdWx0aWJ5 dGVfbG9jYWxlOwogIGJvb2wgdW5pYnl0ZV9sb2NhbGU7CgogIC8qIFZhcmlhYmxlIHRvIHN0 b3JlIGEgZHluYW1pY2FsbHktYWxsb2NhdGVkIGxpc3Qgb2Ygd2lkZSBjaGFyYWN0ZXJzLgog ICAgIFRoZSBwYXJzZXIgbmVlZHMgdG8gZmV0Y2ggdGhpcyBsaXN0IHdoZW5ldmVyIGEgV0NI QVIgdG9rZW4gaXMKICAgICByZWNlaXZlZC4gICovCiAgaW50IHdpZGVfY2hhcnNfbWF4Owog IHdjaGFyX3QgKndpZGVfY2hhcl9saXN0OwoKICBmc2F0b2tlbl90b2tlbl90IGxvb2thaGVh ZF90b2tlbjsKCiAgc2l6ZV90IGN1cnJlbnRfZGVwdGg7ICAgICAgLyogQ3VycmVudCBkZXB0 aCBvZiBhIGh5cG90aGV0aWNhbCBzdGFjawogICAgICAgICAgICAgICAgICAgICAgICAgICAg IGhvbGRpbmcgZGVmZXJyZWQgcHJvZHVjdGlvbnMuICBUaGlzIGlzCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlcHRoIHRoYXQgd2lsbCBi ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIG9mIHRoZSByZWFsIHN0 YWNrIGxhdGVyIG9uIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZhYW5hbHl6 ZS4gICovCl1dKSkKCi0tIFVnaC4uLiBjaHVjayBpbiBhIHNsYWIgb2YgdGhlIGRmYSBzdHJ1 Y3QgaGVyZSwgc2lnaC4KYXNzZXJ0KGY6d3JpdGUoRWRpdGVkVGV4dCgiZGZhLXN0cnVjdCBw YXJzZXIiLAogICAgICAgICAgIiAgdG9rZW4gJSp0b2tlbnMiLCAiICBmc2F0b2tlbl90b2tl bl90ICp0b2tlbnMiLAogICAgICAgICAgIiAgdG9rZW4gdXRmOF9hbnljaGFyXyIsICIgIGZz YXRva2VuX3Rva2VuX3QgdXRmOF9hbnljaGFyXyIpKSkKCmFzc2VydChmOndyaXRlKFJhd1Rl eHQoImRmYS1zdHJ1Y3QgcGFyc2VyLW11bHRpYnl0ZSIpLCAiXG4iKSkKCi0tIFVzZSBtYmNz ZXRzIHRvIGhhbmRsZSBtdWx0aWJ5dGUgc2V0cywgaW5zdGVhZCBvZiBkb2luZyB0aGVzZSBv dXJzZWx2ZXMKYXNzZXJ0KGY6d3JpdGUoW1sKICBtYmNzZXRzX3NldF90ICoqbWJjc2V0czsK ICBzaXplX3Qgbm1iY3NldHM7CiAgc2l6ZV90IG1iY3NldHNfYWxsb2M7Cl1dKSkKCmFzc2Vy dChmOndyaXRlKFtbCiAgLyogU2lnbmF0dXJlL2NhbmFyeSB0b2tlbiBmb3IgYm90dG9tIG9m IHN0cnVjdC4gICovCiAgdW5zaWduZWQgbG9uZyBib3R0b21fZmVuY2VfbWFnaWNfbnI7Cn07 CiNkZWZpbmUgQ09OVEVYVF9UT1BfRkVOQ0VfTUFHSUNfTlIgICAgMHg1OWZjNDI4ZXVMCiNk ZWZpbmUgQ09OVEVYVF9CT1RUT01fRkVOQ0VfTUFHSUNfTlIgMHg3YjBiYzIwNHVMCiNkZWZp bmUgQ0hFQ0tfQ09OVEVYVChjdHh0KSAgXAogIGFzc2VydCAoKChjdHh0KSAhPSBOVUxMKSAg ICAgICBcCiAgICYmICgoY3R4dCktPnRvcF9mZW5jZV9tYWdpY19uciAgICA9PSBDT05URVhU X1RPUF9GRU5DRV9NQUdJQ19OUikgIFwKICAgJiYgKChjdHh0KS0+Ym90dG9tX2ZlbmNlX21h Z2ljX25yID09IENPTlRFWFRfQk9UVE9NX0ZFTkNFX01BR0lDX05SKSkKCi8qIExpbmtlZCBs aXN0IG9mIGFsbCBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGlzIG1vZHVsZS4gICovCnN0YXRp YyBmc2FwYXJzZV9jdHh0X3QgKmZzYXBhcnNlX2luc3RhbmNlX2xpc3RfaGVhZCA9IE5VTEw7 CgpdXSkpCgotLSBBZGQgdXRpbGl0eSBmdW5jdGlvbiAibWF5YmUtcmVhbGxvYyIsIHByZXZp b3VzbHkgIlJFQUxMT0NfSUZfTkVDRVNTQVJZIiwKLS0gaGVyZSwgYXMgYSBnZW5lcmljIGhl bHBlciBmdW50aW9uLgphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJtYXliZS1yZWFsbG9jIiks ICJcbiIpKQoKYXNzZXJ0KGY6d3JpdGUoRWRpdGVkVGV4dCgidXNpbmdfdXRmOCIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAiXG5pbnRcbnVzaW5nX3V0ZjggIiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJcbnN0YXRpYyBpbnRcbnVzaW5nX3V0ZjggIiksICJcbiIpKQoK YXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgicmVjdXJzaXZlLWRlc2NlbnQgcGFyc2VyIGludHJv IiksICJcbiIpKQoKbG9jYWwgQWRkdG9rX21iQm9keSA9IEVkaXRlZFRleHQoImFkZHRva19t YiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHRva19tYiAlKHRva2VuIHQsIiwK ICAgICAgICAgICAiYWRkdG9rX21iIChmc2FwYXJzZV9jdHh0X3QgKnBhcnNlciwgZnNhdG9r ZW5fdG9rZW5fdCB0LCIsCiAgICAgICAgICAgImRmYSUtPiIsICJwYXJzZXItPiIsCiAgICAg ICAgICAgIk1CX0NVUl9NQVggPiAxIiwgInBhcnNlci0+bXVsdGlieXRlX2xvY2FsZSIsCiAg ICAgICAgICAgIiUtJS1kZXB0aCIsICItLXBhcnNlci0+Y3VycmVudF9kZXB0aCIsCiAgICAg ICAgICAgIiUrJStkZXB0aCIsICIrK3BhcnNlci0+Y3VycmVudF9kZXB0aCIpCkFkZHRva19t YkJvZHkgPSBUZXh0U3Vic3QoQWRkdG9rX21iQm9keSwgW1sKICBpZiAoZGVwdGggPiBwYXJz ZXItPmRlcHRoKQogICAgcGFyc2VyLT5kZXB0aCA9IGRlcHRoOwpdXSwgW1sKICBpZiAocGFy c2VyLT5kZXB0aCA8IHBhcnNlci0+Y3VycmVudF9kZXB0aCkKICAgIHBhcnNlci0+ZGVwdGgg PSBwYXJzZXItPmN1cnJlbnRfZGVwdGg7Cl1dKQphc3NlcnQoZjp3cml0ZShGU0FUb2tlblN1 YnN0KEFkZHRva19tYkJvZHkpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoRWRpdGVkVGV4dCgi YWRkdG9rX3djIGZ3ZCBkZWNsIiwKICAgICAgICAgImFkZHRva193YyAlKCIsICJhZGR0b2tf d2MgKGZzYXBhcnNlX2N0eHRfdCAqcGFyc2VyLCAiKSwKICAgICAgICAgICAgICAgIlxuIikp CgotLVtbIC0tIE1CQ1NFVFMKbG9jYWwgQWRkdG9rQm9keSA9IEVkaXRlZFRleHQoImFkZHRv ayIsCiAgICAgICAgICAgIlxuYWRkdG9rICUodG9rZW4gdCUpIiwKICAgICAgICAgICAiXG5h ZGR0b2sgKGZzYXBhcnNlX2N0eHRfdCAqcGFyc2VyLCBmc2F0b2tlbl90b2tlbl90IHQpIiwK ICAgICAgICAgICAiZGZhJS0+IiwgInBhcnNlci0+IiwKICAgICAgICAgICAiTUJfQ1VSX01B WCA+IDEiLCAicGFyc2VyLT5tdWx0aWJ5dGVfbG9jYWxlIiwKICAgICAgICAgICAiICBhZGR0 b2tfd2MgJSgiLCAiICBhZGR0b2tfd2MgKHBhcnNlciwgIiwKICAgICAgICAgICAiICBhZGR0 b2tfbWIgJSgiLCAiICBhZGR0b2tfbWIgKHBhcnNlciwgIiwKICAgICAgICAgICAiICBhZGR0 b2sgJSgiLCAgICAiICBhZGR0b2sgKHBhcnNlciwgIikKYXNzZXJ0KGY6d3JpdGUoRlNBVG9r ZW5TdWJzdChBZGR0b2tCb2R5KSkpCi0tXV0KCmFzc2VydChmOndyaXRlKFtbCi8qIFNpZ2gu ICBNYmNzZXRzIGlzIHNvIGRpc3J1cHRpdmUgKGludGltYXRlIGRldGFpbHMgaGlkZGVuLCBi eQogICBkZXNpZ24pLCB0aGF0IHdlIGFyZSB3cml0aW5nIGFkZHRvayBoZXJlIGZyb20gc2Ny YXRjaC4gICovCnN0YXRpYyB2b2lkCmFkZHRvayAoZnNhcGFyc2VfY3R4dF90ICpwYXJzZXIs IGZzYXRva2VuX3Rva2VuX3QgdCkKewogIGJvb2wgbmVlZF9vciA9IGZhbHNlOwogIG1iY3Nl dHNfc2V0X3QgKndvcmtfbWJjOwogIGJvb2wgaW52ZXJ0OwogIGNoYXJjbGFzc190ICpjaGFy Y2xhc3M7CiAgc2l6ZV90IG5jaGFyczsKICBzaXplX3QgbmNoX2NsYXNzZXM7CiAgc2l6ZV90 IG5yYW5nZXM7CiAgc2l6ZV90IG5lcXVpdnM7CiAgc2l6ZV90IG5jb2xsX2VsZW1zOwoKICBp ZiAodCAhPSBGU0FUT0tFTl9US19NQkNTRVQgfHwgcGFyc2VyLT51bmlieXRlX2xvY2FsZSkK ICAgIHsKICAgICAgYWRkdG9rX21iIChwYXJzZXIsIHQsIDMpOwogICAgICByZXR1cm47CiAg ICB9CgogIHdvcmtfbWJjID0gcGFyc2VyLT5tYmNzZXRzW3BhcnNlci0+bm1iY3NldHMgLSAx XTsKICBtYmNzZXRzX2dldF9jaGFyYWN0ZXJpc3RpY3MgKHdvcmtfbWJjLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJmludmVydCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZjaGFyY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmNo YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5jaF9jbGFzc2VzLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5yYW5nZXMsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAmbmVxdWl2cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZuY29sbF9lbGVtcyk7CgogIGlmIChuY2hhcnMgJiYgIWludmVydCkKICAgIHsKICAgICAg c2l6ZV90IGk7CiAgICAgIHdjaGFyX3QgKmNoYXJfbGlzdDsKCiAgICAgIGNoYXJfbGlzdCA9 IHhubWFsbG9jIChuY2hhcnMsIHNpemVvZiAqY2hhcl9saXN0KTsKICAgICAgbWJjc2V0c19n ZXRfY2hhcnMgKHdvcmtfbWJjLCBjaGFyX2xpc3QpOwogICAgICBhZGR0b2tfd2MgKHBhcnNl ciwgY2hhcl9saXN0WzBdKTsKICAgICAgZm9yIChpID0gMTsgaSA8IG5jaGFyczsgaSsrKQog ICAgICAgIHsKICAgICAgICAgIGFkZHRva193YyAocGFyc2VyLCBjaGFyX2xpc3RbaV0pOwog ICAgICAgICAgYWRkdG9rIChwYXJzZXIsIEZTQVRPS0VOX1RLX09SKTsKICAgICAgICB9CiAg ICAgIGZyZWUgKGNoYXJfbGlzdCk7CiAgICAgIG5lZWRfb3IgPSB0cnVlOwogICAgfQoKICAv KiBJZiB0aGUgc2V0IGNvbnRhaW5zIG5vbi10cml2aWFsIGNvbXBvbmVudHMsIGl0J3MgdG9v IGhhcmQgdG8gZGVhbAogICAgIHdpdGggaGVyZSwgc28gaGFuZCBpdCBvbiB0byBoaWdoZXIt dXAgbWFjaGluZXJ5LiAgKi8KICBpZiAoaW52ZXJ0IHx8IG5jaF9jbGFzc2VzIHx8IG5yYW5n ZXMgfHwgbmNvbGxfZWxlbXMpCiAgICB7CiAgICAgIGFkZHRva19tYiAocGFyc2VyLCBGU0FU T0tFTl9US19NQkNTRVQsCiAgICAgICAgICAgICAgICAgKChwYXJzZXItPm5tYmNzZXRzIC0g MSkgPDwgMikgKyAzKTsKICAgICAgaWYgKG5lZWRfb3IpCiAgICAgICAgYWRkdG9rIChwYXJz ZXIsIEZTQVRPS0VOX1RLX09SKTsKICAgIH0KCiAgLyogSW5kaXZpZHVhbCBjaGFyYWN0ZXJz IGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlLCBzbyB0aGUgb25seSBjYXNlCiAgICAgcmVtYWlu aW5nIGlzIHdoZXJlIGNvZGVzIGhhdmUgYmVlbiBzaW1wbGlmaWVkIGludG8gY2hhcmNsYXNz CiAgICAgbWVtYmVycy4gICovCiAgZWxzZSBpZiAoY2hhcmNsYXNzKQogICAgewogICAgICBh ZGR0b2sgKHBhcnNlciwgRlNBVE9LRU5fVEtfQ1NFVCArIGNoYXJjbGFzc19nZXRfaW5kZXgg KGNoYXJjbGFzcykpOwogICAgICBpZiAobmVlZF9vcikKICAgICAgICBhZGR0b2sgKHBhcnNl ciwgRlNBVE9LRU5fVEtfT1IpOwogICAgfQp9CgpdXSkpCgotLSBDSEFOR0UsIHBvc3NpYmx5 IGJ1Z2d5OiBjdXJfbWJfbGVuIGFwcGVhcnMgaW4gY2xlYXJseS1jb25uZWN0ZWQKLS0gcGxh Y2VzIGluIHRoZSBsZXhlciAoRkVUQ0hfV0MgYW5kIHBhcnNlX2JyYWNrZXRfZXhwKTsgaG93 ZXZlciwgaXQKLS0gYWxzbyBhcHBlYXJzIGluIGFkZHRva193YywgaW4gYSB3YXkgdGhhdCBz ZWVtcyB0byBiZSBsb2NhbC1vbmx5LgotLSBJJ20gY2hvb3NpbmcgdG8gYWRkIGEgbG9jYWwg YWRkdG9rX21iX2xlbiB2YXJpYWJsZSBpbiBhZGR0b2tfd2MsCi0tIGFzIG15IGJlbGllZiAo YWZ0ZXIgcmV2aWV3aW5nIHRoZSBjb2RlKSBpcyB0aGF0IHRoZSB0d28gdXNlcyBvZgotLSB0 aGUgc2FtZSB2YXJpYWJsZSBhcmUgbm90IHJlbGF0ZWQuICBXaXRob3V0IHRoaXMgYWRkaXRp b24sIHRoZQotLSB2YXJpYWJsZSBpcyBmbGFnZ2VkIGFzIHVuZGVjbGFyZWQsIGFzIHRoZSBv dGhlciBkZWZpbml0aW9uIGlzIGluCi0tIHRoZSBsZXhlciBtb2R1bGUuCmxvY2FsIEFkZHRv a193Y01CU0JvZHkgPSBFZGl0ZWRUZXh0KCJhZGR0b2tfd2MiLAogICAgICAgICAgICJcbmFk ZHRva193YyAlKCIsICJcbmFkZHRva193YyAoZnNhcGFyc2VfY3R4dF90ICpwYXJzZXIsICIs CiAgICAgICAgICAgIiAgYWRkdG9rX21iICUoIiwgIiAgYWRkdG9rX21iIChwYXJzZXIsICIs CiAgICAgICAgICAgIiAgYWRkdG9rICUoIiwgICAgIiAgYWRkdG9rIChwYXJzZXIsICIpCgpB ZGR0b2tfd2NNQlNCb2R5ID0gVGV4dFN1YnN0KEFkZHRva193Y01CU0JvZHksIFtbCiAgdW5z aWduZWQgY2hhciBidWZbTUJfTEVOX01BWF07CiAgbWJzdGF0ZV90IHMgPSB7IDAgfTsKICBp bnQgaTsKICBzaXplX3Qgc3RvcmVkX2J5dGVzID0gd2NydG9tYiAoKGNoYXIgKikgYnVmLCB3 YywgJnMpOwoKICBpZiAoc3RvcmVkX2J5dGVzICE9IChzaXplX3QpIC0xKQpdXSwgW1sKICB1 bnNpZ25lZCBjaGFyIGJ1ZltNQl9MRU5fTUFYXTsKICBtYnN0YXRlX3QgcyA9IHsgMCB9Owog IGludCBpOwogIGludCBjdXJfbWJfbGVuOwogIHNpemVfdCBzdG9yZWRfYnl0ZXMgPSB3Y3J0 b21iICgoY2hhciAqKSBidWYsIHdjLCAmcyk7CgogIGlmIChzdG9yZWRfYnl0ZXMgIT0gKHNp emVfdCkgLTEpCl1dKQphc3NlcnQoZjp3cml0ZShGU0FUb2tlblN1YnN0KEFkZHRva193Y01C U0JvZHkpKSkKCi0tIFVzZSBiZWVmZWQtdXAgY2hhcmNsYXNzIChzZXRiaXRfcmFuZ2UpIGFu ZCBkb3RjbGFzcyAoZnJvbSBsZXhlcikgdG8KLS0gY29uc3RydWN0IGNoYXJjbGFzc2VzIGZv ciBVVEYtOCBzZXF1ZW5jZXMgd2l0aG91dCBrbm93aW5nIGNoYXJjbGFzcwotLSBpbnRlcm5h bHMgYW5kIGFsc28gd2l0aG91dCBrbm93aW5nIGRldGFpbHMgb2YgcmVnZXgKLS0gc3ludGF4 L2NvbmZpZ3VyYXRpb24gcmVnYXJkaW5nIGVuZC1vZi1saW5lLiAgV2UgYWxzbyBkZXBlbmQg b24KLS0gY2hhcmNsYXNzJ3MgcGVybWlzc2lvbiB0byB1c2UgMCBhcyBhICJub3QtaW5pdGlh bGlzZWQiIHNlbnRpbmVsCi0tIGhlcmUuCmFzc2VydChmOndyaXRlKEVkaXRlZFRleHQoImFk ZF91dGY4X2FueWNoYXItZGVjbCIsCiAgICAgICAgICAgIlxuYWRkX3V0ZjhfYW55Y2hhciAl KHZvaWQlKSIsCiAgICAgICAgICAgIlxuYWRkX3V0ZjhfYW55Y2hhciAoZnNhcGFyc2VfY3R4 dF90ICpwYXJzZXIpIikpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJhZGRfdXRmOF9hbnlj aGFyLWJvZHktc3RhcnQiKSkpCmFzc2VydChmOndyaXRlKFtbCiAgdW5zaWduZWQgaW50IGk7 CgogIC8qIEhhdmUgd2Ugc2V0IHVwIHRoZSBjbGFzc2VzIGZvciB0aGUgMS1ieXRlIHRvIDQt Ynl0ZSBzZXF1ZW5jZSB0eXBlcz8gICovCiAgaWYgKHBhcnNlci0+dXRmOF9hbnljaGFyX2Ns YXNzZXNbMF0gPT0gMCkKICAgIHsKICAgICAgLyogTm8sIGZpcnN0IHRpbWUgd2UndmUgYmVl biBjYWxsZWQsIHNvIHNldCB0aGVtIHVwIG5vdy4gICovCiAgICAgIGNoYXJjbGFzc190ICpj Y2w7CiAgICAgIGNvbnN0IGNoYXJjbGFzc190ICpkb3RjbGFzczsKCiAgICAgIC8qIEluZGV4 IDA6IDgwLWJmIC0tIE5vbi1sZWFkaW5nIGJ5dGVzLiAgKi8KICAgICAgY2NsID0gY2hhcmNs YXNzX2FsbG9jICgpOwogICAgICBjaGFyY2xhc3Nfc2V0Yml0X3JhbmdlICgweDgwLCAweGJm LCBjY2wpOwogICAgICBwYXJzZXItPnV0ZjhfYW55Y2hhcl9jbGFzc2VzWzBdID0gY2hhcmNs YXNzX2NvbXBsZXRlZCAoY2NsKTsKCiAgICAgIC8qIEluZGV4IDE6IDAwLTdmIC0tIDEtYnl0 ZSBsZWFkaW5nIHNlcSwgbWludXMgZG90Y2xhc3MgZXhjZXB0aW9ucy4gICovCiAgICAgIGNj bCA9IGNoYXJjbGFzc19hbGxvYyAoKTsKICAgICAgY2hhcmNsYXNzX3NldGJpdF9yYW5nZSAo MHgwMCwgMHg3ZiwgY2NsKTsKICAgICAgZnNhbGV4X2V4Y2hhbmdlIChwYXJzZXItPmxleF9j b250ZXh0LCBQUk9UT19MRVhQQVJTRV9PUF9HRVRfRE9UQ0xBU1MsCiAgICAgICAgICAgICAg ICAgICAgICAgJmRvdGNsYXNzKTsKICAgICAgY2hhcmNsYXNzX2ludGVyc2VjdHNldCAoZG90 Y2xhc3MsIGNjbCk7CiAgICAgIHBhcnNlci0+dXRmOF9hbnljaGFyX2NsYXNzZXNbMV0gPSBj aGFyY2xhc3NfY29tcGxldGVkIChjY2wpOwoKICAgICAgLyogSW5kZXggMjogYzItZGYgLS0g Mi1ieXRlIHNlcXVlbmNlLiAgKi8KICAgICAgY2NsID0gY2hhcmNsYXNzX2FsbG9jICgpOwog ICAgICBjaGFyY2xhc3Nfc2V0Yml0X3JhbmdlICgweGMyLCAweGRmLCBjY2wpOwogICAgICBw YXJzZXItPnV0ZjhfYW55Y2hhcl9jbGFzc2VzWzJdID0gY2hhcmNsYXNzX2NvbXBsZXRlZCAo Y2NsKTsKCiAgICAgIC8qIEluZGV4IDI6IGUwLWVmIC0tIDMtYnl0ZSBzZXF1ZW5jZS4gICov CiAgICAgIGNjbCA9IGNoYXJjbGFzc19hbGxvYyAoKTsKICAgICAgY2hhcmNsYXNzX3NldGJp dF9yYW5nZSAoMHhlMCwgMHhlZiwgY2NsKTsKICAgICAgcGFyc2VyLT51dGY4X2FueWNoYXJf Y2xhc3Nlc1szXSA9IGNoYXJjbGFzc19jb21wbGV0ZWQgKGNjbCk7CgogICAgICAvKiBJbmRl eCAyOiBmMC1mNyAtLSA0LWJ5dGUgc2VxdWVuY2UuICAqLwogICAgICBjY2wgPSBjaGFyY2xh c3NfYWxsb2MgKCk7CiAgICAgIGNoYXJjbGFzc19zZXRiaXRfcmFuZ2UgKDB4ZjAsIDB4Zjcs IGNjbCk7CiAgICAgIHBhcnNlci0+dXRmOF9hbnljaGFyX2NsYXNzZXNbNF0gPSBjaGFyY2xh c3NfY29tcGxldGVkIChjY2wpOwogICAgfQoKXV0pKQoKLS0gV3JpdGUgb3V0IHV0Zjggc2Vx dWVuY2UgZG9jdW1lbnRhdGlvbjsgZml4IHNvbWUgZG9jIHR5cG9zLgphc3NlcnQoZjp3cml0 ZShFZGl0ZWRUZXh0KCJhZGRfdXRmOF9hbnljaGFyLWRlc2NyaXB0aW9uIiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAifFsweGUwLTB4ZWZbMHg4MC0weGJmXVsweDgwLTB4YmZdIiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAifFsweGUwLTB4ZWZdWzB4ODAtMHhiZl1bMHg4 MC0weGJmXSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInxbMHhmMC1mN11bMHg4MC0w eGJmXVsweDgwLTB4YmZdWzB4ODAtMHhiZl0iLAogICAgICAgICAgICAgICAgICAgICAgICAg ICJ8WzB4ZjAtMHhmN11bMHg4MC0weGJmXVsweDgwLTB4YmZdWzB4ODAtMHhiZl0iCikpKQph c3NlcnQoZjp3cml0ZShbWwogIC8qIFdyaXRlIG91dCBsZWFmIHRva2VucyBmb3IgZWFjaCBv ZiB0aGUgZm91ciBwb3NzaWJsZSBzdGFydGluZyBieXRlcy4gICovCiAgZm9yIChpID0gMTsg aSA8IDU7IGkrKykKICAgIGFkZHRvayAocGFyc2VyLCBGU0FUT0tFTl9US19DU0VUICsgcGFy c2VyLT51dGY4X2FueWNoYXJfY2xhc3Nlc1tpXSk7CiAgLyogQWRkIGZvbGxvdy1vbiBjbGFz c2VzLCBwbHVzIHRva2VucyB0byBidWlsZCBhIHBvc3RmaXggdHJlZQogICAgIGNvdmVyaW5n IGFsbCBmb3VyIGFsdGVybmF0aXZlcyBvZiB2YWxpZCBVVEYtOCBzZXF1ZW5jZXMuICAqLwog IGZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKQogICAgewogICAgICBhZGR0b2sgKHBhcnNlciwg RlNBVE9LRU5fVEtfQ1NFVCArIHBhcnNlci0+dXRmOF9hbnljaGFyX2NsYXNzZXNbMF0pOwog ICAgICBhZGR0b2sgKHBhcnNlciwgRlNBVE9LRU5fVEtfQ0FUKTsKICAgICAgYWRkdG9rIChw YXJzZXIsIEZTQVRPS0VOX1RLX09SKTsKICAgIH0KXV0pKQphc3NlcnQoZjp3cml0ZShSYXdU ZXh0KCJhZGRfdXRmOF9hbnljaGFyLWJvZHktZW5kIiksICJcbiIpKQoKYXNzZXJ0KGY6d3Jp dGUoRlNBVG9rZW5TdWJzdChSYXdUZXh0KCJHcmFtbWFyIHN1bW1hcnkgY29tbWVudCIpKSwg IlxuIikpCgphc3NlcnQoZjp3cml0ZShbWwovKiBQcm92aWRlIGEgZm9yd2FyZCBkZWNsYXJh dGlvbiBmb3IgcmVnZXhwLCBhcyBpdCBpcyBhdCB0aGUgdG9wIG9mCiAgIHRoZSBwYXJzZSB0 cmVlLCBidXQgaXMgcmVmZXJlbmNlZCBieSBhdG9tLCBhdCB0aGUgYm90dG9tIG9mIHRoZQog ICB0cmVlLiAgKi8Kc3RhdGljIHZvaWQgcmVnZXhwIChmc2FwYXJzZV9jdHh0X3QgKnBhcnNl cik7CgpdXSkpCi0tW1tdXQoKYXNzZXJ0KGY6d3JpdGUoW1sKLyogMyBKdW5lIDIwMTQ6IEkg bXVzdCBiZSBhIHN1Y2tlciBmb3IgcHVuaXNobWVudCwgYW5kL29yIGdvaW5nIGNyYXp5Owog ICAgd2hhdGV2ZXIuICBJJ3ZlIGxvb2tlZCBhdCB0aGUgcGFydGlhbGx5LWVkaXRlZCBjb2Rl IGZvciAiYXRvbSIsCiAgICBsb29raW5nIGF0IGl0IGluIHRoZSAoaW5jb21wbGV0ZSkgbGln aHQgb2YgaW50cm9kdWNpbmcgdGhlIG1iY3NldHMKICAgIGNoYW5nZS4uLiBhbmQgaGF2ZSBk ZWNpZGVkLCBqdXN0IGFzIEkgcHJldmlvdXNseSBkaWQgd2l0aAogICAgY2xvc3VyZSAoKSBi ZWxvdywgdG8gcmV3cml0ZSBpdCBmcm9tIHNjcmF0Y2guICBTbywgaGVyZSBnb2VzLi4uICAq LwpzdGF0aWMgdm9pZAphdG9tIChmc2FwYXJzZV9jdHh0X3QgKnBhcnNlcikKewogIGZzYXRv a2VuX3Rva2VuX3QgdG9rID0gcGFyc2VyLT5sb29rYWhlYWRfdG9rZW47CgogIC8qIEZvciBh IHVuaWJ5dGUgY2hhcmFjdGVyLCBpdCBpcyBpdHMgb3duIHRva2VuLiAgKi8KICBpZiAodG9r ID49IDAgJiYgdG9rIDwgRlNBVE9LRU5fTk9UQ0hBUikKICAgIHsKICAgICAgYWRkdG9rIChw YXJzZXIsIHRvayk7CiAgICAgIHBhcnNlci0+bG9va2FoZWFkX3Rva2VuID0gcGFyc2VyLT5s ZXhlciAocGFyc2VyLT5sZXhfY29udGV4dCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgLyog Rm9yIGEgdW5pYnl0ZSBjaGFyYWN0ZXIgc2V0IChDU0VUICsgaW5kZXgpLCBpdCBpcyBpdHMg b3duIHRva2VuLiAgKi8KICBpZiAodG9rID49IEZTQVRPS0VOX1RLX0NTRVQpCiAgICB7CiAg ICAgIGFkZHRvayAocGFyc2VyLCB0b2spOwogICAgICBwYXJzZXItPmxvb2thaGVhZF90b2tl biA9IHBhcnNlci0+bGV4ZXIgKHBhcnNlci0+bGV4X2NvbnRleHQpOwogICAgICByZXR1cm47 CiAgICB9CgogIC8qIEZvciBBTllDSEFSIGluIGFuIFVURi04IHNldHRpbmcsIHVzZSBhIGhp ZXJhcmNoeSBvZiBDU0VUcy4gICovCiAgaWYgKHRvayA9PSBGU0FUT0tFTl9US19BTllDSEFS ICYmIHVzaW5nX3V0ZjggKCkpCiAgICB7CiAgICAgIC8qIEZvciBVVEYtOCwgZXhwYW5kIHRo ZSBwZXJpb2QgdG8gYSBzZXJpZXMgb2YgQ1NFVHMgdGhhdCBkZWZpbmUKICAgICAgICAgYSB2 YWxpZCBVVEYtOCBjaGFyYWN0ZXIuICBUaGlzIGF2b2lkcyB1c2luZyB0aGUgc2xvdyBtdWx0 aWJ5dGUKICAgICAgICAgcGF0aC4gIEknbSBwcmV0dHkgc3VyZSBpdCB3b3VsZCBiZSBib3Ro IHByb2ZpdGFibGUgYW5kIGNvcnJlY3QKICAgICAgICAgdG8gZG8gaXQgZm9yIGFueSBlbmNv ZGluZzsgaG93ZXZlciwgdGhlIG9wdGltaXphdGlvbiBtdXN0IGJlCiAgICAgICAgIGRvbmUg bWFudWFsbHkgYXMgaXQgaXMgZG9uZSBhYm92ZSBpbiBhZGRfdXRmOF9hbnljaGFyLiAgU28s CiAgICAgICAgIGxldCdzIHN0YXJ0IHdpdGggVVRGLTg6IGl0IGlzIHRoZSBtb3N0IHVzZWQs IGFuZCB0aGUgc3RydWN0dXJlCiAgICAgICAgIG9mIHRoZSBlbmNvZGluZyBtYWtlcyB0aGUg Y29ycmVjdG5lc3MgbW9yZSBvYnZpb3VzLiAgKi8KICAgICAgYWRkX3V0ZjhfYW55Y2hhciAo cGFyc2VyKTsKICAgICAgcGFyc2VyLT5sb29rYWhlYWRfdG9rZW4gPSBwYXJzZXItPmxleGVy IChwYXJzZXItPmxleF9jb250ZXh0KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAvKiBVc2Ug c3dpdGNoIHRvIGNhcnZlIHVwIHRoZSByZW1haW5pbmcgY2FzZXMgaW50byBncm91cHMuICAq LwogIHN3aXRjaCAodG9rKQogICAgewogICAgY2FzZSBGU0FUT0tFTl9US19XQ0hBUjoKICAg ICAgewogICAgICAgIC8qIFdpZGUgY2hhcmFjdGVyLCBwb3NzaWJseSBpbmNsdWRpbmcgZXF1 aXZhbGVudCBjaGFyYWN0ZXJzCiAgICAgICAgICAgKHByb2JhYmx5IGR1ZSB0byBzZWxlY3Rp b24gb2YgY2FzZSBmb2xkaW5nKS4gICovCiAgICAgICAgaW50IG5yX3dpZGVfY2hhcnM7Cgog ICAgICAgIG5yX3dpZGVfY2hhcnMgPSBmc2FsZXhfZXhjaGFuZ2UgKHBhcnNlci0+bGV4X2Nv bnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9f TEVYUEFSU0VfT1BfR0VUX1dJREVfQ0hBUlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGFyc2VyLT53aWRlX2NoYXJfbGlzdCk7CiAgICAgICAgYXNzZXJ0 KG5yX3dpZGVfY2hhcnMgPj0gMSk7CiAgICAgICAgaWYgKHBhcnNlci0+d2lkZV9jaGFyX2xp c3RbMF0gPT0gV0VPRikKICAgICAgICAgIGFkZHRvayAocGFyc2VyLCBGU0FUT0tFTl9US19C QUNLUkVGKTsKICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGludCBpOwoK ICAgICAgICAgICAgYWRkdG9rX3djIChwYXJzZXIsIHBhcnNlci0+d2lkZV9jaGFyX2xpc3Rb MF0pOwogICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnJfd2lkZV9jaGFyczsgaSsrKQog ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFkZHRva193YyAocGFyc2VyLCBwYXJz ZXItPndpZGVfY2hhcl9saXN0W2ldKTsKICAgICAgICAgICAgICAgIGFkZHRvayAocGFyc2Vy LCBGU0FUT0tFTl9US19PUik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAg IHBhcnNlci0+bG9va2FoZWFkX3Rva2VuID0gcGFyc2VyLT5sZXhlciAocGFyc2VyLT5sZXhf Y29udGV4dCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgY2FzZSBGU0FUT0tFTl9U S19NQkNTRVQ6CiAgICAgIHsKICAgICAgICBtYmNzZXRzX3NldF90ICp3b3JrX21iYzsKCiAg ICAgICAgLyogQWNxdWlyZSBzcGFjZSB0byBzdG9yZSBzZXQgcG9pbnRlci4gIFNhZGx5ICg/ KSwgZnNhcGFyc2UKICAgICAgICAgICBtYWludGFpbnMgYSBkdXBsaWNhdGUgbGlzdCB0byBm c2FsZXggYXQgcHJlc2VudC4gICovCiAgICAgICAgcGFyc2VyLT5tYmNzZXRzID0gbWF5YmVf cmVhbGxvYyAocGFyc2VyLT5tYmNzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBhcnNlci0+bm1iY3NldHMsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJnBhcnNlci0+bWJjc2V0c19hbGxvYywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygd29ya19tYmMpOwoKICAgICAg ICAvKiBHZXQgc2V0IHBvaW50ZXIgZnJvbSBmc2FsZXgsIGFuZCBhZGQgaXQgdG8gdGhlIGxp c3QuICAqLwogICAgICAgIGZzYWxleF9leGNoYW5nZSAocGFyc2VyLT5sZXhfY29udGV4dCwK ICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPX0xFWFBBUlNFX09QX0dFVF9NQkNTRVQs CiAgICAgICAgICAgICAgICAgICAgICAgICAmd29ya19tYmMpOwogICAgICAgIHBhcnNlci0+ bWJjc2V0c1twYXJzZXItPm5tYmNzZXRzKytdID0gd29ya19tYmM7CgogICAgICAgIC8qIFdl IGNvdWxkIGZhbGwtdGhyb3VnaCBjYXNlIGxhYmVscyB0byB0aGUgYWRkdG9rIGNvZGUgYmVs b3csCiAgICAgICAgICAgYnV0IGFtIGtlZXBpbmcgY29kZSBzZWN0aW9ucyBzZXBhcmF0ZSBk dWUgdG8gYW4gb3ZlcmFidW5kYW5jZQogICAgICAgICAgIG9mIGNhdXRpb24uICAqLwogICAg ICAgIGFkZHRvayAocGFyc2VyLCB0b2spOwogICAgICAgIHBhcnNlci0+bG9va2FoZWFkX3Rv a2VuID0gcGFyc2VyLT5sZXhlciAocGFyc2VyLT5sZXhfY29udGV4dCk7CiAgICAgICAgcmV0 dXJuOwogICAgICB9CgogICAgY2FzZSBGU0FUT0tFTl9US19BTllDSEFSOgogICAgY2FzZSBG U0FUT0tFTl9US19CQUNLUkVGOgogICAgY2FzZSBGU0FUT0tFTl9US19CRUdMSU5FOgogICAg Y2FzZSBGU0FUT0tFTl9US19FTkRMSU5FOgogICAgY2FzZSBGU0FUT0tFTl9US19CRUdXT1JE OgogICAgY2FzZSBGU0FUT0tFTl9US19FTkRXT1JEOgogICAgY2FzZSBGU0FUT0tFTl9US19M SU1XT1JEOgogICAgY2FzZSBGU0FUT0tFTl9US19OT1RMSU1XT1JEOgogICAgICBhZGR0b2sg KHBhcnNlciwgdG9rKTsKICAgICAgcGFyc2VyLT5sb29rYWhlYWRfdG9rZW4gPSBwYXJzZXIt PmxleGVyIChwYXJzZXItPmxleF9jb250ZXh0KTsKICAgICAgcmV0dXJuOwoKICAgIGNhc2Ug RlNBVE9LRU5fVEtfTFBBUkVOOgogICAgICBwYXJzZXItPmxvb2thaGVhZF90b2tlbiA9IHBh cnNlci0+bGV4ZXIgKHBhcnNlci0+bGV4X2NvbnRleHQpOwogICAgICByZWdleHAgKHBhcnNl cik7CiAgICAgIGlmIChwYXJzZXItPmxvb2thaGVhZF90b2tlbiAhPSBGU0FUT0tFTl9US19S UEFSRU4pCiAgICAgICAgcGFyc2VyLT5hYmFuZG9uX3dpdGhfZXJyb3IgKF8oInVuYmFsYW5j ZWQgKCIpKTsKICAgICAgcGFyc2VyLT5sb29rYWhlYWRfdG9rZW4gPSBwYXJzZXItPmxleGVy IChwYXJzZXItPmxleF9jb250ZXh0KTsKICAgICAgcmV0dXJuOwoKICAgIGRlZmF1bHQ6CiAg ICAgIGFkZHRvayAocGFyc2VyLCBGU0FUT0tFTl9US19FTVBUWSk7CiAgICAgIHJldHVybjsK ICB9CgogIC8qIE5PVFJFQUNIRUQgKi8KfQoKXV0pKQoKLS1bPT09Wwpsb2NhbCBBdG9tRm4g PSBSYXdUZXh0KCJhdG9tIikKQXRvbUZuID0gVGV4dFN1YnN0KEF0b21GbiwgW1sKc3RhdGlj IHZvaWQKYXRvbSAodm9pZCkKewogIGlmICh0b2sgPT0gV0NIQVIpCiAgICB7CiAgICAgIGlm ICh3Y3RvayA9PSBXRU9GKQogICAgICAgIGFkZHRvayAoQkFDS1JFRik7CiAgICAgIGVsc2UK ICAgICAgICB7CiAgICAgICAgICBhZGR0b2tfd2MgKHdjdG9rKTsKCiAgICAgICAgICBpZiAo Y2FzZV9mb2xkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgd2NoYXJfdCBmb2xkZWRb Q0FTRV9GT0xERURfQlVGU0laRV07CiAgICAgICAgICAgICAgaW50IGksIG4gPSBjYXNlX2Zv bGRlZF9jb3VudGVycGFydHMgKHdjdG9rLCBmb2xkZWQpOwogICAgICAgICAgICAgIGZvciAo aSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg IGFkZHRva193YyAoZm9sZGVkW2ldKTsKICAgICAgICAgICAgICAgICAgYWRkdG9rIChPUik7 CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9Cl1dLCBbWwpzdGF0 aWMgdm9pZAphdG9tIChmc2FwYXJzZV9jdHh0X3QgKnBhcnNlcikKewogIGZzYXRva2VuX3Rv a2VuX3QgdG9rID0gcGFyc2VyLT5sb29rYWhlYWRfdG9rZW47CgogIGlmICh0b2sgPT0gV0NI QVIpCiAgICB7CiAgICAgIGludCBucl93aWRlX2NoYXJzOwoKICAgICAgbnJfd2lkZV9jaGFy cyA9IGZzYWxleF9leGNoYW5nZSAocGFyc2VyLT5sZXhfY29udGV4dCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9fTEVYUEFSU0VfT1BfR0VUX1dJREVf Q0hBUlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+ d2lkZV9jaGFyX2xpc3QpOwogICAgICBhc3NlcnQgKG5yX3dpZGVfY2hhcnMgPj0gMSk7CiAg ICAgIGlmIChwYXJzZXItPndpZGVfY2hhcl9saXN0WzBdID09IFdFT0YpCiAgICAgICAgYWRk dG9rIChCQUNLUkVGKTsKICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGludCBpOwoK ICAgICAgICAgIGFkZHRva193YyAocGFyc2VyLT53aWRlX2NoYXJfbGlzdFswXSk7CiAgICAg ICAgICBmb3IgKGkgPSAxOyBpIDwgbnJfd2lkZV9jaGFyczsgaSsrKQogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgYWRkdG9rX3djIChwYXJzZXItPndpZGVfY2hhcl9saXN0W2ldKTsK ICAgICAgICAgICAgICBhZGR0b2sgKEZTQVRPS0VOX1RLX09SKTsKICAgICAgICAgICAgfQog ICAgICAgIH0KXV0pCkF0b21GbiA9IFRleHRTdWJzdChBdG9tRm4sIFtbCiAgZWxzZSBpZiAo dG9rID09IExQQVJFTikKICAgIHsKICAgICAgdG9rID0gbGV4ICgpOwogICAgICByZWdleHAg KCk7CiAgICAgIGlmICh0b2sgIT0gUlBBUkVOKQpdXSwgW1sKICBlbHNlIGlmICh0b2sgPT0g TFBBUkVOKQogICAgewogICAgICBwYXJzZXItPmxvb2thaGVhZF90b2tlbiA9IHBhcnNlci0+ bGV4ZXIgKHBhcnNlci0+bGV4X2NvbnRleHQpOwogICAgICByZWdleHAgKHBhcnNlcik7CiAg ICAgIHRvayA9IHBhcnNlci0+bG9va2FoZWFkX3Rva2VuOwogICAgICBpZiAodG9rICE9IFJQ QVJFTikKXV0pCkF0b21GbiA9IFRleHRTdWJzdChBdG9tRm4sCiAgICAgICAgICIgIHRvayA9 IGxleCAoKSIsCiAgICAgICAgICIgIHBhcnNlci0+bG9va2FoZWFkX3Rva2VuID0gcGFyc2Vy LT5sZXhlciAocGFyc2VyLT5sZXhfY29udGV4dCkiKQpBdG9tRm4gPSBUZXh0U3Vic3QoQXRv bUZuLAogICAgICAgICAiICBkZmFlcnJvciAoXygiLAogICAgICAgICAiICBwYXJzZXItPmFi YW5kb25fd2l0aF9lcnJvciAoXygiKQoKQXRvbUZuID0gQXRvbUZuOmdzdWIoIiAgYWRkdG9r ICUoIiwgICAgIiAgYWRkdG9rIChwYXJzZXIsICIpCkF0b21GbiA9IEF0b21Gbjpnc3ViKCIg IGFkZHRva193YyAlKCIsICIgIGFkZHRva193YyAocGFyc2VyLCAiKQpBdG9tRm4gPSBBdG9t Rm46Z3N1YigiICBhZGRfdXRmOF9hbnljaGFyICUoJSkiLAogICAgICAgICAgICAgICAgICAg ICAiICBhZGRfdXRmOF9hbnljaGFyIChwYXJzZXIpIikKYXNzZXJ0KGY6d3JpdGUoRlNBVG9r ZW5TdWJzdChBdG9tRm4pLCAiXG4iKSkKLS1dPT09XQoKCmFzc2VydChmOndyaXRlKEZTQVRv a2VuU3Vic3QoRWRpdGVkVGV4dCgibnN1YnRva3MiLAogICAgICAgICAgICJcbm5zdWJ0b2tz ICUoIiwgICJcbm5zdWJ0b2tzIChmc2FwYXJzZV9jdHh0X3QgKnBhcnNlciwgIiwKICAgICAg ICAgICAiIG5zdWJ0b2tzICUoIiwgICAiIG5zdWJ0b2tzIChwYXJzZXIsICIsCiAgICAgICAg ICAgImRmYSUtPiIsICAgICAgICAgInBhcnNlci0+IikpLAogICAgICAgICAgICAgICAiXG4i KSkKYXNzZXJ0KGY6d3JpdGUoRlNBVG9rZW5TdWJzdChFZGl0ZWRUZXh0KCJjb3B5dG9rcyIs CiAgICAgICAgICAgIlxuY29weXRva3MgJSgiLCAgIlxuY29weXRva3MgKGZzYXBhcnNlX2N0 eHRfdCAqcGFyc2VyLCAiLAogICAgICAgICAgICIgYWRkdG9rX21iICUoIiwgICIgYWRkdG9r X21iIChwYXJzZXIsICIsCiAgICAgICAgICAgImRmYSUtPiIsICAgICAgICAgInBhcnNlci0+ IiwKICAgICAgICAgICAiTUJfQ1VSX01BWCA+IDEiLCAicGFyc2VyLT5tdWx0aWJ5dGVfbG9j YWxlIikpLAogICAgICAgICAgICAgICAiXG4iKSkKCmFzc2VydChmOndyaXRlKFtbCi8qIFJl d3JpdGluZyBmc2FwYXJzZTpjbG9zdXJlICgpIGZyb20gc2NyYXRjaDsgb3JpZ2luYWwgaXMg Y2xldmVyIGJ1dCBhCiAgIGxpdHRsZSB0cmlja3kgdG8gZm9sbG93LCBzbyBJJ20gdHJ5aW5n IHRvIGJyZWFrIHVwIGEgd2hpbGUgKyBjb21wb3VuZC1pZgogICBsb29wIGludG8gYSBzaW1w bGVyIGNvbnN0cnVjdCAobW9yZSBsaWtlIGEgZmluaXRlLXN0YXRlIG1hY2hpbmUpLiAgQWxz bywKICAgZWRpdHMgc3VjaCBhcyByZXBsYWNpbmcgImRmYS0+IiB3aXRoICJwYXJzZXItPiIg YXJlIGRvbmUgaGVyZSwgYWRkaW5nCiAgICJwYXJzZXIiIGFzIGEgcGFyYW1ldGVyIGluIGxv dHMgb2YgcGxhY2VzLCBhcyB3ZWxsIGFzIHRoZSBsb25nLXdpbmRlZAogICBGU0FUT0tFTl9U S18iIHByZWZpeC4KCiAgIEknbSBub3Qgc3VyZSBpZiB0aGlzIHZlcnNpb24gaXMgYW4gaW1w cm92ZW1lbnQgb3ZlciB0aGUgb3JpZ2luYWw7IHRoZQogICBuZWVkIHRvIHVzZSAicGFyc2Vy LT5sb29rYWhlYWRfdG9rZW4iIGluc3RlYWQgb2YgInRvayIgaW5mbHVlbmNlZCBteQogICBk ZWNpc2lvbiB0byB0cnkgdGhpcy4uLiBidXQgdGhlIGp1cnkgaXMgc3RpbGwgb3V0LiAgKi8K c3RhdGljIHZvaWQKY2xvc3VyZSAoZnNhcGFyc2VfY3R4dF90ICpwYXJzZXIpCnsKcmVzdGFy dF9jbG9zdXJlOgogIGF0b20gKHBhcnNlcik7CiAgZm9yICg7OykKICAgIHsKICAgICAgc3dp dGNoIChwYXJzZXItPmxvb2thaGVhZF90b2tlbikKICAgICAgICB7CiAgICAgICAgICBjYXNl IEZTQVRPS0VOX1RLX1FNQVJLOgogICAgICAgICAgY2FzZSBGU0FUT0tFTl9US19TVEFSOgog ICAgICAgICAgY2FzZSBGU0FUT0tFTl9US19QTFVTOgogICAgICAgICAgICBhZGR0b2sgKHBh cnNlciwgcGFyc2VyLT5sb29rYWhlYWRfdG9rZW4pOwogICAgICAgICAgICBwYXJzZXItPmxv b2thaGVhZF90b2tlbiA9IHBhcnNlci0+bGV4ZXIgKHBhcnNlci0+bGV4X2NvbnRleHQpOwog ICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICBjYXNlIEZTQVRPS0VOX1RLX1JFUE1O OgogICAgICAgICAgICAvKiBSRVBNTiBuZWVkcyBleHRyYSB3b3JrOyBtb3ZlIG91dHNpZGUg dGhlIHN3aXRjaCBzdGF0ZW1lbnQuICAqLwogICAgICAgICAgICBicmVhazsKCiAgICAgICAg ICBkZWZhdWx0OgogICAgICAgICAgICAvKiBNZXJlbHkgbGV0IHRoZSBpbnRpYWwgYXRvbSBj YWxsIHN0YW5kIGFzIG91ciByZXR1cm4gcmVzdWx0LiAgKi8KICAgICAgICAgICAgcmV0dXJu OwogICAgICAgIH0KCiAgICAgIC8qIERlYWwgd2l0aCBSRVBNTnttaW4sIG1heH0gY2FzZXMg aW4gYSBzZXBhcmF0ZSBibG9jay4gICovCiAgICAgIHsKICAgICAgICBpbnQgaTsKICAgICAg ICBzaXplX3QgcHJldl9zdWJfaW5kZXgsIG50b2tlbnM7CiAgICAgICAgaW50IG1pbnJlcCwg bWF4cmVwOwoKICAgICAgICAvKiBHZXQgdGhlIHttaW4sIG1heH0gcGFpciBkZWNvZGVkIGJ5 IHRoZSBsZXhlci4gICovCiAgICAgICAgbWlucmVwID0gcGFyc2VyLT5sZXhfZXhjaGFuZ2Ug KHBhcnNlci0+bGV4X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFBST1RPX0xFWFBBUlNFX09QX0dFVF9SRVBNTl9NSU4sCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIG1heHJlcCA9IHBhcnNl ci0+bGV4X2V4Y2hhbmdlIChwYXJzZXItPmxleF9jb250ZXh0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBQUk9UT19MRVhQQVJTRV9PUF9HRVRfUkVQTU5fTUFY LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKCiAgICAg ICAgLyogRmluZCBvdXQgaG93IG1hbnkgdG9rZW5zIGFyZSBpbiB0aGUgcGVjZWRpbmcgdG9r ZW4gbGlzdCB0aGF0IGFyZQogICAgICAgICAgIGNvdmVyZWQgYnkgdGhpcyBSRVBNTiBkaXJl Y3RpdmUuICBUaGlzIGludm9sdmVzIGNhcmVmdWxseSB3b3JraW5nCiAgICAgICAgICAgYmFj a3dhcmRzIHRocm91Z2ggdGhlIGxpbmVhciwgcG9zdGZpeCB0b2tlbiBvcmRlcmluZy4gICov CiAgICAgICAgbnRva2VucyA9IG5zdWJ0b2tzIChwYXJzZXIsIHBhcnNlci0+dGluZGV4KTsK CiAgICAgICAgLyogSWYgbWluIGFuZCBtYXggYXJlIGJvdGggemVybywgbWVyZWx5IHJlbW92 ZSBwcmVjZWRpbmcKICAgICAgICAgICBzdWJleHByZXNzaW9uLCBnZXQgYSBuZXcgdG9rZW4s IGFuZCByZXN0YXJ0IHRoZSBhdG9tL2Nsb3N1cmUKICAgICAgICAgICBwcm9jZXNzaW5nIGZy b20gdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24uICBOb3Qgc3VyZSBpZiBwZW9wbGUgd2lsbAog ICAgICAgICAgIGxpa2UgdGhpcyBnb3RvIHN0YXRlbWVudCwgYnV0IHdlJ2xsIGdpdmUgaXQg YSB3aGlybC4gICAqLwogICAgICAgIGlmIChtaW5yZXAgPT0gMCAmJiBtYXhyZXAgPT0gMCkK ICAgICAgICAgIHsKICAgICAgICAgICAgcGFyc2VyLT50aW5kZXggLT0gbnRva2VuczsKICAg ICAgICAgICAgcGFyc2VyLT5sb29rYWhlYWRfdG9rZW4gPSBwYXJzZXItPmxleGVyIChwYXJz ZXItPmxleF9jb250ZXh0KTsKICAgICAgICAgICAgZ290byByZXN0YXJ0X2Nsb3N1cmU7CiAg ICAgICAgICB9CgogICAgICAgIC8qIE5vbi16ZXJvIG1pbiBvciBtYXgsIGRlZmluZWQgYXMg Zm9sbG93czoKICAgICAgICAgICAgIHtufSAgIFRoZSBwcmVjZWRpbmcgaXRlbSBpcyBtYXRj aGVkIGV4YWN0bHkgbiB0aW1lcy4KICAgICAgICAgICAgIHtuLH0gIFRoZSBwcmVjZWRpbmcg aXRlbSBpcyBtYXRjaGVkIG4gb3IgbW9yZSB0aW1lcy4KICAgICAgICAgICAgIHssbX0gIFRo ZSBwcmVjZWRpbmcgaXRlbSBpcyBtYXRjaGVkIGF0IG1vc3QgbSB0aW1lcyAoR05VIGV4dC4p CiAgICAgICAgICAgICB7bixtfSBUaGUgcHJlY2VkaW5nIGl0ZW0gaXMgbWF0Y2hlZCBhdCBs ZWFzdCBuLCBidXQgbm90IG1vcmUKICAgICAgICAgICAgICAgICAgIHRoYW4gbSB0aW1lcy4K ICAgICAgICAgICBGb3Ige24sfSBhbmQgeyxtfSBjYXNlcywgdGhlIG9taXR0ZWQgcGFyYW1l dGVyIGlzIHJlcG9ydGVkIGhlcmUKICAgICAgICAgICBhcyBhIG5lZ2F0aXZlIHZhbHVlLiAg Ki8KICAgICAgICBwcmV2X3N1Yl9pbmRleCA9IHBhcnNlci0+dGluZGV4IC0gbnRva2VuczsK ICAgICAgICBpZiAobWF4cmVwIDwgMCkKICAgICAgICAgIGFkZHRvayAocGFyc2VyLCBGU0FU T0tFTl9US19QTFVTKTsKICAgICAgICBpZiAobWlucmVwID09IDApCiAgICAgICAgICBhZGR0 b2sgKHBhcnNlciwgRlNBVE9LRU5fVEtfUU1BUkspOwogICAgICAgIGZvciAoaSA9IDE7IGkg PCBtaW5yZXA7ICsraSkKICAgICAgICAgIHsKICAgICAgICAgICAgY29weXRva3MgKHBhcnNl ciwgcHJldl9zdWJfaW5kZXgsIG50b2tlbnMpOwogICAgICAgICAgICBhZGR0b2sgKHBhcnNl ciwgRlNBVE9LRU5fVEtfQ0FUKTsKICAgICAgICAgIH0KICAgICAgICBmb3IgKDsgaSA8IG1h eHJlcDsgKytpKQogICAgICAgICAgewogICAgICAgICAgICBjb3B5dG9rcyAocGFyc2VyLCBw cmV2X3N1Yl9pbmRleCwgbnRva2Vucyk7CiAgICAgICAgICAgIGFkZHRvayAocGFyc2VyLCBG U0FUT0tFTl9US19RTUFSSyk7CiAgICAgICAgICAgIGFkZHRvayAocGFyc2VyLCBGU0FUT0tF Tl9US19DQVQpOwogICAgICAgICAgfQogICAgICAgIC8qIFByaW1lIHRoZSBwYXJzZXIgd2l0 aCB0aGUgbmV4dCB0b2tlbiBhZnRlciBSRVBNTiBhbmQgbG9vcC4gICovCiAgICAgICAgcGFy c2VyLT5sb29rYWhlYWRfdG9rZW4gPSBwYXJzZXItPmxleGVyIChwYXJzZXItPmxleF9jb250 ZXh0KTsKICAgICAgfQogICAgfQp9CgpdXSkpCgpsb2NhbCBCcmFuY2hCb2R5ID0gRWRpdGVk VGV4dCgiYnJhbmNoIiwKICAgICAgICAgICAiXG5icmFuY2ggJSh2b2lkJSkiLCAiXG5icmFu Y2ggKGZzYXBhcnNlX2N0eHRfdCAqcGFyc2VyKSIsCiAgICAgICAgICAgIiBhZGR0b2sgJSgi LCAgICAgIiBhZGR0b2sgKHBhcnNlciwgIiwKICAgICAgICAgICAiIGNsb3N1cmUgJSglKSIs ICAiIGNsb3N1cmUgKHBhcnNlcikiKQpCcmFuY2hCb2R5ID0gVGV4dFN1YnN0KEJyYW5jaEJv ZHksIFtbCnsKICBjbG9zdXJlIChwYXJzZXIpOwogIHdoaWxlICh0b2sgIT0gUlBBUkVOICYm IHRvayAhPSBPUiAmJiB0b2sgPj0gMCkKICAgIHsKICAgICAgY2xvc3VyZSAocGFyc2VyKTsK ICAgICAgYWRkdG9rIChwYXJzZXIsIENBVCk7CiAgICB9Cl1dLCBbWwp7CiAgZnNhdG9rZW5f dG9rZW5fdCB0b2s7CgogIGNsb3N1cmUgKHBhcnNlcik7CiAgdG9rID0gcGFyc2VyLT5sb29r YWhlYWRfdG9rZW47CiAgd2hpbGUgKHRvayAhPSBSUEFSRU4gJiYgdG9rICE9IE9SICYmIHRv ayA+PSAwKQogICAgewogICAgICBjbG9zdXJlIChwYXJzZXIpOwogICAgICB0b2sgPSBwYXJz ZXItPmxvb2thaGVhZF90b2tlbjsKICAgICAgYWRkdG9rIChwYXJzZXIsIENBVCk7CiAgICB9 Cl1dKQphc3NlcnQoZjp3cml0ZShGU0FUb2tlblN1YnN0KEJyYW5jaEJvZHkpLCAiXG4iKSkK CmxvY2FsIFJlZ2V4cEJvZHkgPSBFZGl0ZWRUZXh0KCJyZWdleHAiLAogICAgICAgICAgICJc bnJlZ2V4cCAlKHZvaWQlKSIsICJcbnJlZ2V4cCAoZnNhcGFyc2VfY3R4dF90ICpwYXJzZXIp IiwKICAgICAgICAgICAiZGZhJS0+IiwgICAgICAgICAicGFyc2VyLT4iLAogICAgICAgICAg ICIgYWRkdG9rICUoIiwgICAgIiBhZGR0b2sgKHBhcnNlciwgIiwKICAgICAgICAgICAiIGF0 b20gJSglKSIsICAgICIgYXRvbSAocGFyc2VyKSIsCiAgICAgICAgICAgIiBicmFuY2ggJSgl KSIsICAiIGJyYW5jaCAocGFyc2VyKSIsCiAgICAgICAgICAgIiBjbG9zdXJlICUoJSkiLCAi IGNsb3N1cmUgKHBhcnNlcikiKQpSZWdleHBCb2R5ID0gVGV4dFN1YnN0KFJlZ2V4cEJvZHks CiAgICAgICAgICIgIHRvayA9IGxleCAoKSIsCiAgICAgICAgICIgIHBhcnNlci0+bG9va2Fo ZWFkX3Rva2VuID0gcGFyc2VyLT5sZXhlciAocGFyc2VyLT5sZXhfY29udGV4dCkiKQpSZWdl eHBCb2R5ID0gVGV4dFN1YnN0KFJlZ2V4cEJvZHksIFtbCiAgd2hpbGUgKHRvayA9PSBPUikK ICAgIHsKXV0sIFtbCiAgd2hpbGUgKHBhcnNlci0+bG9va2FoZWFkX3Rva2VuID09IE9SKQog ICAgewpdXSkKCmFzc2VydChmOndyaXRlKEZTQVRva2VuU3Vic3QoUmVnZXhwQm9keSksICJc biIpKQoKLS0gUmV3cml0ZSBib2R5IG9mIGZzYXBhcnNlX3BhcnNlIChkZmFwYXJzZSkgd2l0 aG91dCBzdWJzdGl0dXRpb25zLCBhcyBtdWNoCi0tIG9mIHRoZSBpbml0aWFsaXNhdGlvbiBj b2RlIGhlcmUgaGFzIGJlZW4gbWFkZSByZWR1bmRhbnQgYXMgdGhlIGNsaWVudCBjYW4KLS0g aW5zdGFudGlhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgbGV4ZXIgaW5kZXBlbmRlbnRseS4KYXNz ZXJ0KGY6d3JpdGUoRGVjbHNbInBhcnNlIl0sIFtbCnsKICBDSEVDS19DT05URVhUIChwYXJz ZXIpOwoKICAvKiBPYnRhaW4gYW4gaW5pdGlhbCB0b2tlbiBmb3IgbG9va2FoZWFkLCBhbmQg a2VlcCB0cmFja2luZyB0cmVlIGRlcHRoLiAgKi8KICBwYXJzZXItPmxvb2thaGVhZF90b2tl biA9IHBhcnNlci0+bGV4ZXIgKHBhcnNlci0+bGV4X2NvbnRleHQpOwogIHBhcnNlci0+Y3Vy cmVudF9kZXB0aCA9IHBhcnNlci0+ZGVwdGg7CgogIC8qIFJ1biByZWdleHAgdG8gbWFuYWdl IHRoZSBuZXh0IGxldmVsIG9mIHBhcnNpbmcuICAqLwogIHJlZ2V4cCAocGFyc2VyKTsKICBp ZiAocGFyc2VyLT5sb29rYWhlYWRfdG9rZW4gIT0gRlNBVE9LRU5fVEtfRU5EKQogICAgcGFy c2VyLT5hYmFuZG9uX3dpdGhfZXJyb3IgKF8oInVuYmFsYW5jZWQgKSIpKTsKCiAgLyogSWYg bXVsdGlwbGUgZXhwcmVzc2lvbnMgYXJlIHBhcnNlZCwgc2Vjb25kIGFuZCBzdWJzZXF1ZW50 IHBhdHRlcnMgYXJlCiAgICAgcHJlc2VudGVkIGFzIGFsdGVybmF0aXZlcyB0byBwcmVjZWRp bmcgcGF0dGVybnMuICAqLwogIGFkZHRvayAocGFyc2VyLCBGU0FUT0tFTl9US19FTkQgLSBw YXJzZXItPm5yZWdleHBzKTsKICBhZGR0b2sgKHBhcnNlciwgRlNBVE9LRU5fVEtfQ0FUKTsK ICBpZiAocGFyc2VyLT5ucmVnZXhwcykKICAgIGFkZHRvayAocGFyc2VyLCBGU0FUT0tFTl9U S19PUik7CgogICsrcGFyc2VyLT5ucmVnZXhwczsKfQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUo W1sKLyogUmVjZWl2ZSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGV4Y2VwdGlvbnMgZGV0ZWN0 ZWQgYnkgdGhlIHBhcnNlcjoKICAgV2FybmluZ3MgYW5kIGVycm9ycy4gIEludGVybmFsbHks IHdlIGFkZCB0aGUgX05vcmV0dXJuIGF0dHJpYnV0ZQogICB0byB0aGUgZXJyb3IgY2FsbGJh Y2ssIHRvIGhlbHAgdGhlIGNvbXBpbGVyIHdpdGggY29kZSBmbG93CiAgIGFuYWx5c2lzLiAg Ki8KZXh0ZXJuIHZvaWQKZnNhcGFyc2VfZXhjZXB0aW9uX2ZucyAoZnNhcGFyc2VfY3R4dF90 ICpwYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICBmc2FwYXJzZV93YXJuX2NhbGxiYWNr X2ZuICp3YXJuaW5nZm4sCiAgICAgICAgICAgICAgICAgICAgICBmc2FwYXJzZV9lcnJvcl9j YWxsYmFja19mbiAqZXJyb3JmbikKewogIENIRUNLX0NPTlRFWFQgKHBhcnNlcik7CgogIC8q IEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0IGNhbGxiYWNrcy4gICov CiAgcGFyc2VyLT53YXJuX2NsaWVudCA9IHdhcm5pbmdmbjsKICBwYXJzZXItPmFiYW5kb25f d2l0aF9lcnJvciA9IGVycm9yZm47Cn0KCi8qIEFkZCAibm90IHByb3ZpZGVkISIgc3R1YiBm dW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGlmIHRoZSBjbGllbnQKICAgZmFpbHMgdG8gcHJv dmlkZSBwcm9wZXIgcmVzb3VyY2VzLiAgVGhpcyBpcyBhIGhhY2ssIG1lcmVseSB0byBnZXQg dGhlCiAgIG1vZHVsZSBzdGFydGVkOyBiZXR0ZXIgdHJlYXRtZW50IG5lZWRzIHRvIGJlIGFk ZGVkIGxhdGVyLiAgKi8Kc3RhdGljIHZvaWQKbm9fZnVuY3Rpb25fcHJvdmlkZWQgKHZvaWQg KnVudXNlZCkKewogIGFzc2VydCAoISJmc2FwYXJzZTogUGx1Zy1pbiBmdW5jdGlvbiByZXF1 aXJlZCwgYnV0IG5vdCBwcm92aWRlZC4iKTsKfQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVj bHNbInBhcnNlLWxleGVyIl0sIFtbCnsKICBib29sIGlzX211bHRpYnl0ZTsKICBpbnQgd2No YXJzX21heDsKCiAgQ0hFQ0tfQ09OVEVYVCAocGFyc2VyKTsKCiAgLyogUmVjb3JkIHN1cHBs aWVkIGxleGVyIGZ1bmN0aW9uIGFuZCBjb250ZXh0IGZvciB1c2UgbGF0ZXIuICAqLwogIHBh cnNlci0+bGV4X2NvbnRleHQgID0gbGV4ZXJfY29udGV4dDsKICBwYXJzZXItPmxleGVyICAg ICAgICA9IGxleF9mbjsKICBwYXJzZXItPmxleF9leGNoYW5nZSA9IGxleF9leGNoYW5nZV9m bjsKCiAgLyogUXVlcnkgbGV4ZXIgdG8gZ2V0IG11bHRpYnl0ZSBuYXR1cmUgb2YgdGhpcyBs b2NhbGUuICAqLwogIGlzX211bHRpYnl0ZQogICAgICA9IGxleF9leGNoYW5nZV9mbiAobGV4 ZXJfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPX0xFWFBBUlNFX09Q X0dFVF9JU19NVUxUSUJZVEVfTE9DQUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgTlVM TCk7CiAgcGFyc2VyLT5tdWx0aWJ5dGVfbG9jYWxlID0gaXNfbXVsdGlieXRlOwogIHBhcnNl ci0+dW5pYnl0ZV9sb2NhbGUgPSAhIGlzX211bHRpYnl0ZTsKCiAgLyogU2V0IHVwIFdDSEFS IHRva2VuIGluZnJhc3RydWN0dXJlOiAgV2lkZS1jaGFyIGxpc3QvYXJyYXkvd2hhdGV2ZXIu ICBXZQogICAgIGZyZWUgdGhlIHdpZGVfY2hhcl9saXN0IGZpcnN0LCBpbiBjYXNlIHNvbWVv bmUgY2FsbHMgdGhpcyBmdW5jdGlvbgogICAgIG11bHRpcGxlIHRpbWVzLCBzbyB0aGF0IGVh cmxpZXIgYWxsb2NhdGlvbnMgYXJlIGNvcnJlY3RseSBmcmVlZCB1cCwgYW5kCiAgICAgd2Ug dXNlIHRoZSB2YWx1ZSBhZHZpc2VkIGJ5IHRoZSBtb3N0IHJlY2VudCBsZXhlciBwcmVzZW50 ZWQgdG8gdXMuICAqLwogIHdjaGFyc19tYXggPSBsZXhfZXhjaGFuZ2VfZm4gKGxleGVyX2Nv bnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9fTEVYUEFSU0Vf T1BfR0VUX1dJREVfQ0hBUl9MSVNUX01BWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBOVUxMKTsKICBwYXJzZXItPndpZGVfY2hhcnNfbWF4ID0gd2NoYXJzX21heDsKICBm cmVlIChwYXJzZXItPndpZGVfY2hhcl9saXN0KTsKICBwYXJzZXItPndpZGVfY2hhcl9saXN0 ID0gTlVMTDsKICBpZiAod2NoYXJzX21heCkKICAgIHBhcnNlci0+d2lkZV9jaGFyX2xpc3Qg PSB4bm1hbGxvYyAod2NoYXJzX21heCwgc2l6ZW9mICh3Y2hhcl90KSk7Cn0KCl1dKSkKCi0t IERlZmluZSBhICJuZXciIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuIGluaXRpYWwgcGFyc2Vy IGNvbnRleHQuCmFzc2VydChmOndyaXRlKERlY2xzWyJwYXJzZS1uZXciXSwgW1sKewogIGZz YXBhcnNlX2N0eHRfdCAqbmV3X2NvbnRleHQ7CgogIC8qIEFjcXVpcmUgemVyb2VkIG1lbW9y eSBmb3IgbmV3IHBhcnNlciBjb250ZXh0LiAgKi8KICBuZXdfY29udGV4dCA9IFhaQUxMT0Mg KGZzYXBhcnNlX2N0eHRfdCk7CgogIC8qIEltbWVkaWF0ZWx5IHNldCB1cCB0b3AgYW5kIGJv dHRvbSBjb250ZXh0IGNhbmFyeS9mZW5jZXMuICAqLwogIG5ld19jb250ZXh0LT50b3BfZmVu Y2VfbWFnaWNfbnIgICAgPSBDT05URVhUX1RPUF9GRU5DRV9NQUdJQ19OUjsKICBuZXdfY29u dGV4dC0+Ym90dG9tX2ZlbmNlX21hZ2ljX25yID0gQ09OVEVYVF9CT1RUT01fRkVOQ0VfTUFH SUNfTlI7CgogIC8qID8/IFBvaW50IHdhcm5pbmcsIGVycm9yIGFuZCBsZXhlciBmdW5jdGlv bnMgdG8gYSAieW91IG5lZWQgdG8gdGVsbCBtZQogICAgIHRoZXNlIGZpcnN0ISIgZnVuY3Rp b24/ICovCiAgbmV3X2NvbnRleHQtPndhcm5fY2xpZW50ICAgICAgICA9IChmc2FwYXJzZV93 YXJuX2NhbGxiYWNrX2ZuICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG5vX2Z1bmN0aW9uX3Byb3ZpZGVkOwogIG5ld19jb250ZXh0LT5hYmFuZG9uX3dpdGhfZXJy b3IgPSAoZnNhcGFyc2VfZXJyb3JfY2FsbGJhY2tfZm4gKikKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbm9fZnVuY3Rpb25fcHJvdmlkZWQ7CiAgbmV3X2NvbnRleHQt PmxleGVyICAgICAgICAgICAgICA9IChmc2FwYXJzZV9sZXhlcl9mbl90ICAqKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19mdW5jdGlvbl9wcm92aWRlZDsKCiAg LyogRGVmYXVsdCB0byB1bmlieXRlIGxvY2FsZS4uLiBidXQgd2Ugc3luY2hyb25pc2Ugd2l0 aCB0aGUgbGV4ZXIgbGF0ZXIuICovCiAgbmV3X2NvbnRleHQtPm11bHRpYnl0ZV9sb2NhbGUg PSBmYWxzZTsKICBuZXdfY29udGV4dC0+dW5pYnl0ZV9sb2NhbGUgPSB0cnVlOwoKICAvKiBB ZGQgdGhpcyBpbnN0YW5jZSBhdCB0aGUgaGVhZCBvZiB0aGUgbW9kdWxlJ3MgbGlzdC4gICov CiAgbmV3X2NvbnRleHQtPm5leHRfaW5zdGFuY2UgPSBmc2FwYXJzZV9pbnN0YW5jZV9saXN0 X2hlYWQ7CiAgZnNhcGFyc2VfaW5zdGFuY2VfbGlzdF9oZWFkID0gbmV3X2NvbnRleHQ7Cgog IHJldHVybiBuZXdfY29udGV4dDsKfQoKXV0pKQoKLS0gRlNBTXVzdHMsIGFuZCBhbHNvIGRl YnVnZ2luZyB1c2VycywgdXNlIHRoZSBmaW5hbCB0b2tlbiBsaXN0IGdlbmVyYXRlZAotLSBi eSB0aGUgcGFyc2VyLCBzbyBwcm92aWRlIGFuIGludGVyZmFjZSBmb3IgdGhlbSB0byBhY2Nl c3MgdGhlIGxpc3QuCmFzc2VydChmOndyaXRlKERlY2xzWyJwYXJzZS1nZXQtdG9rZW4tbGlz dCJdLCBbWwp7CiAgQ0hFQ0tfQ09OVEVYVCAocGFyc2VyKTsKCiAgKm5yX3Rva2VucyAgPSBw YXJzZXItPnRpbmRleDsKICAqdG9rZW5fbGlzdCA9IHBhcnNlci0+dG9rZW5zOwp9CgpdXSkp Cgphc3NlcnQoZjp3cml0ZShbWwovKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBmcmVlIGFsbCBy ZXNvdXJjZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB1c2VkIGJ5IGFuCiAgIGluc3RhbmNl LiAgVGhlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIHZhbGlkIGFmdGVyIHRoaXMgY2FsbC4gICov CnN0YXRpYyB2b2lkCmZyZWVfaW5zdGFuY2UgKGZzYXBhcnNlX2N0eHRfdCAqcGFyc2VyKQp7 CiAgZnJlZSAocGFyc2VyLT53aWRlX2NoYXJfbGlzdCk7CiAgZnJlZSAocGFyc2VyLT50b2tl bnMpOwogIGZyZWUgKHBhcnNlci0+bXVsdGlieXRlX3Byb3ApOwoKICAvKiBEZXN0cm95IHRv cC9ib3R0b20gZmVuY2UvY2FuYXJ5IHNlbnRpbmVscyB0byBhdm9pZCBjb25mdXNpb24uICAq LwogIHBhcnNlci0+dG9wX2ZlbmNlX21hZ2ljX25yICAgICs9IDB4NWE1YTVhNWE7CiAgcGFy c2VyLT5ib3R0b21fZmVuY2VfbWFnaWNfbnIgKz0gMHg1YTVhNWE1YTsKCiAgZnJlZSAocGFy c2VyKTsKfQoKXV0pKQoKYXNzZXJ0KGY6d3JpdGUoRGVjbHNbInBhcnNlLWRlc3Ryb3ktbW9k dWxlIl0sIFtbCnsKICBmc2FwYXJzZV9jdHh0X3QgKnBfbGlzdDsKICBmc2FwYXJzZV9jdHh0 X3QgKnBfbmV4dDsKCiAgLyogTW92ZSB0aGUgZ2xvYmFsIGxpc3QgaGVhZCBpbnRvIGEgbG9j YWwgdmFyaWFibGUsIGFuZCBpbW1lZGlhdGVseSBjbGVhcgogICAgIHRoZSBnbG9iYWwuICBU aGlzIGlzIGEgaGFsZi1oZWFydGVkIGF0dGVtcHQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25z OwogICAgIHRvIGRvIHRoaW5ncyBwcm9wZXJseSwgYSBzeXN0ZW0td2lkZSBhdG9taWMgb3Bl cmF0aW9uIChsb2NrZWQsCiAgICAgaW5jbHVkaW5nIG11bHRpLUNQVSBjYWNoZSBjb2hlcmVu Y3kpIG9wZXJhdGlvbiBzaG91bGQgYmUgdXNlZC4gICovCiAgcF9saXN0ID0gZnNhcGFyc2Vf aW5zdGFuY2VfbGlzdF9oZWFkOwogIGZzYXBhcnNlX2luc3RhbmNlX2xpc3RfaGVhZCA9IE5V TEw7CgogIC8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIGluc3RhbmNlcywgcmVsZWFzaW5nIGFs bCByZXNvdXJjZXMgYXNzb2NpYXRlZAogICAgIHdpdGggZWFjaCBvbmUuICAqLwogIHdoaWxl IChwX2xpc3QpCiAgICB7CiAgICAgIHBfbmV4dCA9IHBfbGlzdC0+bmV4dF9pbnN0YW5jZTsK ICAgICAgZnJlZV9pbnN0YW5jZSAocF9saXN0KTsKICAgICAgcF9saXN0ID0gcF9uZXh0Owog ICAgfQp9CgpdXSkpCgphc3NlcnQoZjp3cml0ZShEZWNsc1sicGFyc2UtaW5pdGlhbGlzZSJd LCBbWwp7CiAgLyogSW5pdGlhbGlzZSB0aGUgbGlua2VkIGxpc3Qgb2YgaW5zdGFuY2VzIGNy ZWF0ZWQgYnkgdGhpcyBtb2R1bGUuICAqLwogIGZzYXBhcnNlX2luc3RhbmNlX2xpc3RfaGVh ZCA9IE5VTEw7CgogIC8qIENsZWFuIHVwIHJlc291cmNlcyB1cG9uIGV4aXQuICAqLwogIGF0 ZXhpdCAoZnNhcGFyc2VfZGVzdHJveV9tb2R1bGUpOwp9CgpdXSkpCgotLSBGaW5hbGx5LCBh ZGQgdHJhaWxlciBsaW5lcyAodmltKQphc3NlcnQoZjp3cml0ZShbWwovKiB2aW06c2V0IHNo aWZ0d2lkdGg9MjogKi8KXV0pKQoKYXNzZXJ0KGY6Y2xvc2UoKSkKCi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgotLS0tLS0tLS0tLS0tLS0tKioqKioqKiogZnNhbXVzdHMuaCAqKioqKioqKi0t LS0tLS0tLS0tLS0tLS0KCnByaW50KCJDcmVhdGluZyBmc2FtdXN0cy5oLi4uIikKbG9jYWwg ZiA9IGFzc2VydChpby5vcGVuKCJmc2FtdXN0cy5oIiwgInciKSkKYXNzZXJ0KGY6d3JpdGUo W1sKLyogZnNhbXVzdHMgLS0gUmVwb3J0IGEgbGlzdCBvZiBtdXN0LWhhdmUgc2ltcGxlIHN0 cmluZ3MgaW4gdGhlIHBhdHRlcm4KCl1dKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiQ29w eXJpZ2h0LmRmYWMiKSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkxpY2Vuc2VX YXJyYW50eS5kZmFjIiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJBdXRob3Jz LmRmYWMiKSkpCmFzc2VydChmOndyaXRlKFtbCgovKiAyMDE0OiBSZXBhY2thZ2VkIGJ5ICJ1 bnRhbmdsZSIgc2NyaXB0LCB3cml0dGVuIGJ5IGJlaG9mZnNraS4gICovCgovKiA/PyBJbnNl cnQgbG9uZyBkZXNjcmlwdGlvbi9kaXNjdXNzaW9uIGhlcmUuICAqLwoKXV0pKQoKLS0gQWRk IHByZXByb2Nlc3NvciBsaW5lcyB0byBtYWtlIHRoaXMgaGVhZGVyIGZpbGUgaWRlbXBvdGVu dC4KYXNzZXJ0KGY6d3JpdGUoW1sKI2lmbmRlZiBGU0FNVVNUU19ICiNkZWZpbmUgRlNBTVVT VFNfSCAxCgovKiBBbHdheXMgaW1wb3J0IGVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3Vy YXRpb24gaXRlbXMgZmlyc3QuICAqLwojaW5jbHVkZSA8Y29uZmlnLmg+CgojaW5jbHVkZSAi ZnNhdG9rZW4uaCIKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmIC8q IF9fY3BsdXNwbHVzICovCgpdXSkpCgotLSBSYXRoZXIgdGhhbiBhY2N1bXVsYXRpbmcgIm11 c3QiIHN0cmluZ3MgaW5zaWRlIHRoZSBpbnRlcm5hbHMsIGFuZAotLSBvYnRhaW5pbmcgYSBw b2ludGVyIHRvIHRoZSBsaXN0IGF0IHRoZSBlbmQsIHdlIGV4cGxpY2l0bHkgbmFtZSB0aGUK LS0gbGlzdCBpbiB0aGUgIm11c3QiIChub3RlOiAqbm90KiAibXVzdHMiKSBjYWxsLCBhbmQg cmVjZWl2ZSBhbgotLSB1cGRhdGVkIHBvaW50ZXIgYXMgdGhlIHJldHVybiB2YWx1ZS4gIEJl Y2F1c2UgdGhlIHN0cnVjdHVyZSBpcwotLSBpbnZvbHZlZCBtb3JlIGhlYXZpbHkgaW4gdGhl IGludGVyZmFjZSwgY2hhbmdlIGl0IHRvIGEgdHlwZWRlZi4KYXNzZXJ0KGY6d3JpdGUoUmF3 VGV4dCgiZGZhbXVzdC1zdHJ1Y3QgZGVzY3JpcHRpb24iKSkpCmFzc2VydChmOndyaXRlKFtb CnR5cGVkZWYgc3RydWN0IGZzYW11c3RzX2xpc3RfZWxlbWVudAp7CiAgYm9vbCBleGFjdDsK ICBib29sIGJlZ2xpbmU7CiAgYm9vbCBlbmRsaW5lOwogIGNoYXIgKm11c3Q7CiAgc3RydWN0 IGZzYW11c3RzX2xpc3RfZWxlbWVudCAqbmV4dDsKfSBmc2FtdXN0c19saXN0X2VsZW1lbnRf dDsKCl1dKSkKCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1sibXVzdCJdKQoKLS0gRmluYWxs eSwgYWRkIHRyYWlsZXIgbGluZXMgKGlkZW1wb3RlbmN5LCB2aW0pCmFzc2VydChmOndyaXRl KFtbCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KCiNl bmRpZiAvKiBGU0FNVVNUU19IICovCgovKiB2aW06c2V0IHNoaWZ0d2lkdGg9MjogKi8KXV0p KQoKYXNzZXJ0KGY6Y2xvc2UoKSkKCi0tLS0tLS0tLS0tLS0tLS0qKioqKioqKiBmc2FtdXN0 cy5jICoqKioqKioqLS0tLS0tLS0tLS0tLS0tLQoKcHJpbnQoIkNyZWF0aW5nIGZzYW11c3Rz LmMuLi4iKQpsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oImZzYW11c3RzLmMiLCAidyIpKQph c3NlcnQoZjp3cml0ZShbWwovKiBmc2FtdXN0cyAtLSBSZXBvcnQgYSBsaXN0IG9mIG11c3Qt aGF2ZSBzaW1wbGUgc3RyaW5ncyBpbiB0aGUgcGF0dGVybgoKXV0pKQphc3NlcnQoZjp3cml0 ZShSYXdUZXh0KCJDb3B5cmlnaHQuZGZhYyIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3 VGV4dCgiTGljZW5zZVdhcnJhbnR5LmRmYWMiKSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJh d1RleHQoIkF1dGhvcnMuZGZhYyIpKSkKYXNzZXJ0KGY6d3JpdGUoW1sKCi8qIDIwMTQ6IFJl cGFja2FnZWQgYnkgInVudGFuZ2xlIiBzY3JpcHQsIHdyaXR0ZW4gYnkgYmVob2Zmc2tpLiAg Ki8KCi8qICg/PyBMb25nIGRlc2NyaXB0aW9uL2Rpc2N1c3Npb24gZ29lcyBoZXJlLi4uKSAq LwoKXV0pKQotLV1dCgphc3NlcnQoZjp3cml0ZShbWwovKiBBbHdheXMgaW1wb3J0IGVudmly b25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaXRlbXMgZmlyc3QuICAqLwojaW5jbHVk ZSA8Y29uZmlnLmg+CgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJjaGFyY2xhc3Mu aCIKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJmc2FtdXN0cy5oIgojaW5jbHVkZSAi ZnNhdG9rZW4uaCIKI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgoj aW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgInhhbGxv Yy5oIgoKI2lmIERFQlVHCiNpbmNsdWRlIDxzdGRpby5oPgojZW5kaWYgLyogREVCVUcgKi8K Cl1dKSkKCmFzc2VydChmOndyaXRlKFJhd1RleHQoIlNUUkVRIiksICJcbiIpKQoKYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiJ211c3RzJyBleHBsYW5hdGlvbiIpLCAiXG4iKSkKYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiaWNhdGFsbG9jIiksICJcbiIpKQotLSBhc3NlcnQoZjp3cml0 ZShSYXdUZXh0KCJpc3Ryc3RyIiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJm cmVlbGlzdCIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiZW5saXN0IiksICJc biIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJjb21zdWJzIiksICJcbiIpKQphc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJhZGRsaXN0cyIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3 VGV4dCgiaW5ib3RoIiksICJcbiIpKQoKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgibXVzdCB0 eXBlZGVmIiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJhbGxvY211c3QiKSwg IlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoInJlc2V0bXVzdCIpLCAiXG4iKSkKYXNz ZXJ0KGY6d3JpdGUoUmF3VGV4dCgiZnJlZW11c3QiKSwgIlxuIikpCgotLSBDaGFuZ2UgZGZh bXVzdCB0byBmc2FtdXN0X211c3QsIHJlbW92ZSBkZmEgc3RydWN0LCBhbmQgcmVuYW1lIHRv a2Vucwphc3NlcnQoZjp3cml0ZShEZWNsc1sibXVzdCJdKSkKbG9jYWwgTXVzdEJvZHkgPSBF ZGl0ZWRUZXh0KCJkZmFtdXN0IGRlZmluaXRpb24iLAogICAgIiAgdG9rZW4gdDsiLCAgICIg IGZzYXRva2VuX3Rva2VuX3QgdDsiLAogICAgIiAgdG9rZW4gdCA9ICIsICIgIGZzYXRva2Vu X3Rva2VuX3QgdCA9ICIsCiAgICAiICBwcnRvayAiLCAiICBmc2F0b2tlbl9wcnRvayAiKQps b2NhbCBNdXN0Qm9keSA9IFRleHRTdWJzdChNdXN0Qm9keSwgW1sKICBzdHJ1Y3QgZGZhbXVz dCAqZG07Cl1dLCAiIikKTXVzdEJvZHkgPSBUZXh0U3Vic3QoTXVzdEJvZHksICJkLT50aW5k ZXgiLCAibnJfdG9rZW5zIikKTXVzdEJvZHkgPSBUZXh0U3Vic3QoTXVzdEJvZHksICJkLT50 b2tlbnMiLCAidG9rZW5fbGlzdCIpCk11c3RCb2R5ID0gVGV4dFN1YnN0KE11c3RCb2R5LCAi ZC0+bXVzdHMiLCAibXVzdF9saXN0IikKTXVzdEJvZHkgPSBUZXh0U3Vic3QoTXVzdEJvZHks ICIhZC0+bXVsdGlieXRlIiwgInVuaWJ5dGVfbG9jYWxlIikKCk11c3RCb2R5ID0gVGV4dFN1 YnN0KE11c3RCb2R5LCBbWwogICAgICAgICAgICAgIGNoYXJjbGFzcyAqY2NsID0gJmQtPmNo YXJjbGFzc2VzW3QgLSBDU0VUXTsKICAgICAgICAgICAgICBpbnQgajsKICAgICAgICAgICAg ICBmb3IgKGogPSAwOyBqIDwgTk9UQ0hBUjsgaisrKQogICAgICAgICAgICAgICAgaWYgKHRz dGJpdCAoaiwgKmNjbCkpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg IGlmICghIChqIDwgTk9UQ0hBUikpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg ICAgICB0ID0gajsKICAgICAgICAgICAgICB3aGlsZSAoKytqIDwgTk9UQ0hBUikKICAgICAg ICAgICAgICAgIGlmICh0c3RiaXQgKGosICpjY2wpCl1dLCBbWwogICAgICAgICAgICAgIGNo YXJjbGFzc190ICpjY2wgPSBjaGFyY2xhc3NfZ2V0X3BvaW50ZXIgKHQgLSBDU0VUKTsKICAg ICAgICAgICAgICBpbnQgajsKICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTk9UQ0hB UjsgaisrKQogICAgICAgICAgICAgICAgaWYgKGNoYXJjbGFzc190c3RiaXQgKGosIGNjbCkp CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGlmICghIChqIDwgTk9U Q0hBUikpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB0ID0gajsKICAg ICAgICAgICAgICB3aGlsZSAoKytqIDwgTk9UQ0hBUikKICAgICAgICAgICAgICAgIGlmIChj aGFyY2xhc3NfdHN0Yml0IChqLCBjY2wpCl1dKQoKTXVzdEJvZHkgPSBUZXh0U3Vic3QoTXVz dEJvZHksIFtbCmRvbmU6CiAgaWYgKCpyZXN1bHQpCiAgICB7CiAgICAgIGRtID0geG1hbGxv YyAoc2l6ZW9mICpkbSk7CiAgICAgIGRtLT5leGFjdCA9IGV4YWN0OwogICAgICBkbS0+YmVn bGluZSA9IGJlZ2xpbmU7CiAgICAgIGRtLT5lbmRsaW5lID0gZW5kbGluZTsKICAgICAgZG0t Pm11c3QgPSB4c3RyZHVwIChyZXN1bHQpOwogICAgICBkbS0+bmV4dCA9IG11c3RfbGlzdDsK ICAgICAgbXVzdF9saXN0ID0gZG07CiAgICB9CgogIHdoaWxlIChtcCkKICAgIHsKICAgICAg bXVzdCAqcHJldiA9IG1wLT5wcmV2OwogICAgICBmcmVlbXVzdCAobXApOwogICAgICBtcCA9 IHByZXY7CiAgICB9Cl1dLCBbWwpkb25lOgogIGlmIChzdHJsZW4gKHJlc3VsdCkpCiAgICB7 CiAgICAgIGZzYW11c3RzX2xpc3RfZWxlbWVudF90ICpkbTsKCiAgICAgIGRtID0geG1hbGxv YyAoc2l6ZW9mICpkbSk7CiAgICAgIGRtLT5leGFjdCA9IGV4YWN0OwogICAgICBkbS0+YmVn bGluZSA9IGJlZ2xpbmU7CiAgICAgIGRtLT5lbmRsaW5lID0gZW5kbGluZTsKICAgICAgZG0t Pm11c3QgPSB4c3RyZHVwIChyZXN1bHQpOwogICAgICBkbS0+bmV4dCA9IG11c3RfbGlzdDsK ICAgICAgbXVzdF9saXN0ID0gZG07CiAgICB9CgogIHdoaWxlIChtcCkKICAgIHsKICAgICAg bXVzdCAqcHJldiA9IG1wLT5wcmV2OwogICAgICBmcmVlbXVzdCAobXApOwogICAgICBtcCA9 IHByZXY7CiAgICB9CgogIHJldHVybiBtdXN0X2xpc3Q7Cl1dKQoKYXNzZXJ0KGY6d3JpdGUo RlNBVG9rZW5TdWJzdChNdXN0Qm9keSksICJcbiIpKQoKLS0gTm90IG5lZWRlZDogYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiZGZhbXVzdHMiKSwgIlxuIikpCgotLSBGaW5hbGx5LCBhZGQg dHJhaWxlciBsaW5lcyAodmltKQphc3NlcnQoZjp3cml0ZShbWwovKiB2aW06c2V0IHNoaWZ0 d2lkdGg9MjogKi8KXV0pKQoKYXNzZXJ0KGY6Y2xvc2UoKSkKCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCgotLVs9WwoKLS0tLS0tLS0tLS0tLS0tLSoqKioqKioqIGhpZ2gtbGV2ZWwtZGZhLmgg KioqKioqKiotLS0tLS0tLS0tLS0tLS0tCgpwcmludCgiQ3JlYXRpbmcgaGlnaC1sZXZlbC1k ZmEuaC4uLiIpCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbigiaGlnaC1sZXZlbC1kZmEuaCIs ICJ3IikpCmFzc2VydChmOndyaXRlKFtbCi8qIGhpZ2hfbGV2ZWxfZGZhIC0tIEhpZ2gtbGV2 ZWwgZGZhIGZ1bmN0aW9ucyB0aGF0IHByb2Nlc3MgbG93ZXItbGV2ZWwgaW5mbwoKXV0pKQph c3NlcnQoZjp3cml0ZShSYXdUZXh0KCJDb3B5cmlnaHQuZGZhYyIpLCAiXG4iKSkKYXNzZXJ0 KGY6d3JpdGUoUmF3VGV4dCgiTGljZW5zZVdhcnJhbnR5LmRmYWMiKSwgIlxuIikpCmFzc2Vy dChmOndyaXRlKFJhd1RleHQoIkF1dGhvcnMuZGZhYyIpKSkKYXNzZXJ0KGY6d3JpdGUoW1sK Ci8qIDIwMTQ6IFJlcGFja2FnZWQgYnkgInVudGFuZ2xlIiBzY3JpcHQsIHdyaXR0ZW4gYnkg YmVob2Zmc2tpLiAgKi8KCi8qICg/PyBMb25nIGRlc2NyaXB0aW9uL2Rpc2N1c3Npb24gZ29l cyBoZXJlLi4uKSAqLwoKXV0pKQoKLS0gQWRkIHByZXByb2Nlc3NvciBsaW5lcyB0byBtYWtl IHRoaXMgaGVhZGVyIGZpbGUgaWRlbXBvdGVudC4KYXNzZXJ0KGY6d3JpdGUoW1sKI2lmbmRl ZiBISUdIX0xFVkVMX0RGQV9ICiNkZWZpbmUgSElHSF9MRVZFTF9ERkFfSCAxCgovKiBBbHdh eXMgaW1wb3J0IGVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaXRlbXMgZmly c3QuICAqLwojaW5jbHVkZSA8Y29uZmlnLmg+CgojaW5jbHVkZSAiZnNhdG9rZW4uaCIKCiNp ZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmIC8qIF9fY3BsdXNwbHVzICov Cl1dKSkKCmFzc2VydChmOndyaXRlKFtbCi8qIEZ1bmN0aW9ucyB0byBpbml0aWFsaXNlIGFu ZCB0ZWFyIGRvd24gZW50aXJlIG1vZHVsZSBhbmQgYWxsIGFzc29jaWF0ZWQKICAgaW5zdGFu Y2VzLiAgKi8KCl1dKSkKCldyaXRlRXh0ZXJuRGVjbChmLCBEZWNsc1siaGxkZmEtaW5pdGlh bGlzZSJdKQpXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNbImhsZGZhLWRlc3Ryb3ktbW9kdWxl Il0pCgphc3NlcnQoZjp3cml0ZShbWwovKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGEgbmV3IHBh cnNlciBpbnN0YW5jZSwgYW5kIHRvIGNvbm5lY3QgaXQgd2l0aCBhCiAgIGNvbXBhdGlibGUg bGV4ZXIgaW5zdGFuY2UuICAqLwoKXV0pKQotLSBXcml0ZUV4dGVybkRlY2woZiwgRGVjbHNb ImhsZGZhLW5ldyJdKQoKLS0gRklYTUU6IFRoZSBmb2xsb3dpbmcgaXMgYSBjb3B5LXBhc3Rl LWFuZC1yZW5hbWUtZWRpdCBmcm9tIHRoZSBmc2FsZXggY29kZS4KLS0gSXMgdGhlcmUgYSBs ZXNzIHJlZHVuZGFudCB3YXkgb2YgZG9pbmcgdGhpcz8KCi0tIFdoaWxlIGRmYS5oIGRlY2xh cmVzIGRmYXdhcm4oKSBhbmQgZGZhZXJyb3IoKSwgYW5kIGRlbWFuZHMgdGhhdCB0aGUgY2xp ZW50Ci0tIHN1cHBseSBmdW5jdGlvbnMgYXQgbGluayB0aW1lLCB3ZSBpbnN0ZWFkIHByb3Zp ZGUgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uCi0tIHNvIHRoYXQgdGhlIGZ1bmN0aW9ucyBjYW4g YmUgaGFuZGVkIG92ZXIgZXhwbGljaXRseS4gIFRoaXMgc3R5bGUgbWF5IGJlCi0tIHVzZWZ1 bCBpbiB0aGUgZnV0dXJlIGlmIHdlIHdhbnQgdG8gbW92ZSBmcm9tIGEgc2luZ2xlIGhsZGZh IGluc3RhbmNlIHRvCi0tIG11bHRpcGxlIGluc3RhbmNlcyAob2JqZWN0cz8pCmFzc2VydChm OndyaXRlKFtbCi8qIERlZmluZSBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB3YXJuaW5nIGFu ZCBlcnJvciBjYWxsYmFja3MuICAqLwp0eXBlZGVmIHZvaWQKaGxkZmFfd2Fybl9jYWxsYmFj a19mbiAoY29uc3QgY2hhciAqKTsKdHlwZWRlZiB2b2lkIC8qID8/IF9Ob3JldHVybj8gKi8K aGxkZmFfX2Vycm9yX2NhbGxiYWNrX2ZuIChjb25zdCBjaGFyICopOwoKXV0pKQoKLS0gRmlu YWxseSwgYWRkIHRyYWlsZXIgbGluZXMgKGMrKywgaWRlbXBvdGVuY3ksIHZpbSkKYXNzZXJ0 KGY6d3JpdGUoW1sKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZiAvKiBfX2NwbHVzcGx1 cyAqLwoKI2VuZGlmIC8qIEhJR0hfTEVWRUxfREZBX0ggKi8KCi8qIHZpbTpzZXQgc2hpZnR3 aWR0aD0yOiAqLwpdXSkpCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLS0tLS0tLS0tLS0tLS0t LSoqKioqKioqIGhpZ2gtbGV2ZWwtZGZhLmMgKioqKioqKiotLS0tLS0tLS0tLS0tLS0tCgpw cmludCgiQ3JlYXRpbmcgaGlnaC1sZXZlbC1kZmEuYy4uLiIpCmxvY2FsIGYgPSBhc3NlcnQo aW8ub3BlbigiaGlnaC1sZXZlbC1kZmEuYyIsICJ3IikpCmFzc2VydChmOndyaXRlKFtbCi8q IGhpZ2hfbGV2ZWxfZGZhIC0tIEhpZ2gtbGV2ZWwgZGZhIGZ1bmN0aW9ucyB0aGF0IHByb2Nl c3MgbG93ZXItbGV2ZWwgaW5mbwoKXV0pKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJDb3B5 cmlnaHQuZGZhYyIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiTGljZW5zZVdh cnJhbnR5LmRmYWMiKSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoIkF1dGhvcnMu ZGZhYyIpKSkKYXNzZXJ0KGY6d3JpdGUoW1sKCi8qIDIwMTQ6IFJlcGFja2FnZWQgYnkgInVu dGFuZ2xlIiBzY3JpcHQsIHdyaXR0ZW4gYnkgYmVob2Zmc2tpLiAgKi8KCi8qICg/PyBMb25n IGRlc2NyaXB0aW9uL2Rpc2N1c3Npb24gZ29lcyBoZXJlLi4uKSAqLwoKXV0pKQoKYXNzZXJ0 KGY6d3JpdGUoW1sKLyogQWx3YXlzIGltcG9ydCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25m aWd1cmF0aW9uIGl0ZW1zIGZpcnN0LiAgKi8KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2luY2x1 ZGUgPGFzc2VydC5oPgojaW5jbHVkZSAiY2hhcmNsYXNzLmgiCiNpbmNsdWRlIDxjdHlwZS5o PgojaW5jbHVkZSAiaGlnaC1sZXZlbC1kZmEuaCIKI2luY2x1ZGUgImZzYXRva2VuLmgiCiNp bmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPHN0ZGxp Yi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ4YWxsb2MuaCIKCiNpZiBERUJV RwojaW5jbHVkZSA8c3RkaW8uaD4KI2VuZGlmIC8qIERFQlVHICovCgpGSVhNRTogVGhpcyBj b2RlIGlzIGZhbGxpbmcgb3V0IG9mIHN5bmMgd2l0aCBkZmEuYywgZS5nLiBkZmFleGVjIGZh bWlseS4KCgpdXSkpCgphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJQb3NpdGlvbkF0b20rRHlu U2V0IiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJsZWFmX3NldF90eXBlZGVm IiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJkZmFfc3RhdGVfdHlwZWRlZiIp LCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgic3RhdGVfbnVtX3R5cGVkZWYiKSwg IlxuIikpCgphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJjb3B5IiksICJcbiIpKQphc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJhbGxvY19wb3NpdGlvbl9zZXQiKSwgIlxuIikpCmFzc2VydChm OndyaXRlKFJhd1RleHQoImluc2VydCIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4 dCgibWVyZ2UiKSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoImRlbGV0ZSIpLCAi XG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgic3RhdGVfaW5kZXgiKSwgIlxuIikpCmFz c2VydChmOndyaXRlKFJhd1RleHQoImVwc2Nsb3N1cmUiKSwgIlxuIikpCgphc3NlcnQoZjp3 cml0ZShSYXdUZXh0KCJjaGFyY2xhc3NfY29udGV4dCIpLCAiXG4iKSkKYXNzZXJ0KGY6d3Jp dGUoUmF3VGV4dCgic3RhdGVfc2VwYXJhdGVfY29udGV4dHMiKSwgIlxuIikpCgphc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJkZmFhbmFseXNlIHN1bW1hcnkgY29tbWVudCIpLCAiXG4iKSkK YXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiZGZhYW5hbHlzZSIpLCAiXG4iKSkKCmFzc2VydChm OndyaXRlKFJhd1RleHQoImRmYXN0YXRlIHN1bW1hcnkgY29tbWVudCIpLCAiXG4iKSkKYXNz ZXJ0KGY6d3JpdGUoUmF3VGV4dCgiZGZhc3RhdGUiKSwgIlxuIikpCmFzc2VydChmOndyaXRl KFJhd1RleHQoInJlYWxsb2NfdHJhbnNfaWZfbmVjZXNzYXJ5IiksICJcbiIpKQphc3NlcnQo Zjp3cml0ZShSYXdUZXh0KCJidWlsZF9zdGF0ZSIpLCAiXG4iKSkKCmFzc2VydChmOndyaXRl KFJhd1RleHQoIk11bHRpYnl0ZSBmbnMgc2VjdGlvbiBjb21tZW50IiksICJcbiIpKQoKYXNz ZXJ0KGY6d3JpdGUoUmF3VGV4dCgic3RhdHVzX3RyYW5zaXRfc3RhdGUgdHlwZWRlZiIpLCAi XG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgidHJhbnNpdF9zdGF0ZV9zaW5nbGVieXRl IiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJtYXRjaF9hbnljaGFyIiksICJc biIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJtYXRjaF9tYl9jaGFyc2V0IiksICJcbiIp KQoKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiY2hlY2tfbWF0Y2hpbmdfd2l0aF9tdWx0aWJ5 dGVfb3BzIiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJ0cmFuc2l0X3N0YXRl X2NvbnN1bWVfMWNoYXIiKSwgIlxuIikpCmFzc2VydChmOndyaXRlKFJhd1RleHQoInRyYW5z aXRfc3RhdGUiKSwgIlxuIikpCgphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJkZmFleGVjIiks ICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJkZmFzdXBlcnNldCIpLCAiXG4iKSkK YXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiZGRhaXNmYXN0IiksICJcbiIpKQphc3NlcnQoZjp3 cml0ZShSYXdUZXh0KCJmcmVlX21iZGF0YSIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3 VGV4dCgiZGZhaW5pdCIpLCAiXG4iKSkKYXNzZXJ0KGY6d3JpdGUoUmF3VGV4dCgiZGZhb3B0 aW1pemUiKSwgIlxuIikpCgphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJkZmFzc2J1aWxkIiks ICJcbiIpKQphc3NlcnQoZjp3cml0ZShSYXdUZXh0KCJkZmFjb21wIiksICJcbiIpKQphc3Nl cnQoZjp3cml0ZShSYXdUZXh0KCJkZmFmcmVlIiksICJcbiIpKQphc3NlcnQoZjp3cml0ZShS YXdUZXh0KCJkZmFhbGxvYyIpLCAgIlxuIikpCgphc3NlcnQoZjpjbG9zZSgpKQoKLS1dPV0K Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotLS0tLS0tLS0tLS0tLS0tKioqKioqKiogZGZhLXBy bC5jICoqKioqKioqLS0tLS0tLS0tLS0tLS0tLQoKLS0gZGZhLXBybC5jIC0tICJQYXJhbGxl bCIgdmVyc2lvbiBvZiBkZmEuYywgd2hpY2ggaXMgdXNlZCB0byBxdWFudGlmeSB0aGUKLS0g cGVyZm9ybWFuY2Ugb2YgdGhlIG5ldyBjb2RlIGJ5IHJ1bm5pbmcgaXQgaW4gcGFyYWxsZWwg d2l0aCB0aGUgZXhpc3RpbmcKLS0gY29kZSwgYW5kIGNoZWNraW5nIHRoYXQgdGhlIG91dHB1 dHMgYXJlIGlkZW50aWNhbC4KCnByaW50KCJHZW5lcmF0aW5nIGRmYS1wcmwuYyBieSBjb3B5 aW5nIGRmYS5jIGFuZCB0aGVuIGFwcGx5aW5nIGVkaXRzLi4uIikKCm9zLmV4ZWN1dGUoImNw IC1mcCBkZmEuYyBkZmEtcHJsLmMiKQoKLS0gUmVhZCB0aGUgZW50aXJlIGZpbGUgaW50byBh IHNpbmdsZSBzZWdtZW50CmxvY2FsIGRmYXBybGMgPSBOZXdGaWxlVGFibGUoImRmYS1wcmwu YyIpClNlY3Rpb24oImRmYS1wcmwiLCBkZmFwcmxjLCAwKQpTZWdzOlRhZygiZGZhLXBybC5j IiwgMSwgI2RmYXBybGMpCgotLSBBcHBseSBlZGl0cyByYXRoZXIgY3J1ZGVseSwgc2lnaC4K LS0gZGZhc3ludGF4KCkgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gaW5pdGlhbGlzZSBmc2Fs ZXhfc3ludGF4KCk7Ci0tIHRoaXMgaXMgYWxzbyBwZXJoYXBzIHRoZSBiZXN0IHBvaW50IHRv IGFkZCBvbmNlLW9mZiBpbml0aWFsaXNhdGlvbgotLSBjYWxscyBmb3IgdGhlIG5ldyBtb2R1 bGVzLgotLSBXZSBjaGFuZ2UgZGZhLXBybC5jJ3MgbGV4KCkgZnVuY3Rpb24gaW50byBPcmln aW5hbExleEZ1bmN0aW9uKCkgKG9yCi0tIHdoYXRldmVyKSwgaW50cm9kdWNlIGEgbmV3IGxl eCgpIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIG5ldyBjb2RlIGFuZAotLSB0aGUgZXhpc3Rp bmcgY29kZSBzaWRlLWJ5LXNpZGUsIGFuZCBjb21wYXJlcyB0aGUgcmVzdWx0LgoKbG9jYWwg Ym9keSA9IFJhd1RleHQoImRmYS1wcmwuYyIpCmJvZHkgPSBUZXh0U3Vic3QoYm9keSwgW1sK I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGlv Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8 c3RyaW5nLmg+CiNpbmNsdWRlIDxsb2NhbGUuaD4KXV0sIFtbCiNpbmNsdWRlIDxhc3NlcnQu aD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3Rk bGliLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVk ZSA8bG9jYWxlLmg+CgovKiBIT09LOiBIYWNrIGluIGludGVyZmFjZXMgdG8gbmV3IGNoYXJj bGFzcyBhbmQgZnNhKiBtb2R1bGVzLiAgKi8KI2luY2x1ZGUgImNoYXJjbGFzcy5oIgojaW5j bHVkZSAiZnNhdG9rZW4uaCIKI2luY2x1ZGUgImZzYWxleC5oIgojaW5jbHVkZSAiZnNhbXVz dHMuaCIKI2luY2x1ZGUgImZzYXBhcnNlLmgiCiNpbmNsdWRlICJtYmNzZXRzLmgiCiNpbmNs dWRlICJwcm90by1sZXhwYXJzZS5oIgoKLyogSE9PSzogRmlsZSBoYW5kbGUgZm9yIGhvb2sv cGFyYWxsZWwgbGV4L3BhcnNlIGRlYnVnL2xvZyBtZXNzYWdlcyAqLwpGSUxFICpwbGxfbG9n ID0gTlVMTDsKCiNkZWZpbmUgSE9PS19MT0dfRklMRU5BTUUgICAiL3RtcC9wYXJhbGxlbC5s b2ciCgovKiBIT09LOiBTdGF0aWMgdmFyaWFibGVzIHRvIGhvbGQgb3BhcXVlIHBhcnNlciBh bmQgbGV4ZXIgY29udGV4dHMuICAqLwpzdGF0aWMgZnNhcGFyc2VfY3R4dF90ICpwYXJzZXIg PSBOVUxMOwpzdGF0aWMgZnNhbGV4X2N0eHRfdCAqbGV4ZXIgPSBOVUxMOwoKLyogSE9PSzog U3RvcmUgbXVzdHMgbGlzdCBhcyBhIHN0YXRpYyB2YXJpYWJsZSBzbyB3ZSBjYW4gZnJlZSBp dCBjb3JyZWN0bHkuICAqLwpzdGF0aWMgZnNhbXVzdHNfbGlzdF9lbGVtZW50X3QgKm11c3Rz ID0gTlVMTDsKCl1dKQoKLS0gV2hlbiBkZmFzeW50YXggcmVjZWl2ZXMgc3ludGF4IG9wdGlv bnMsIGFsc28gdGVsbCBmc2FsZXhfc3ludGF4Lgpib2R5ID0gVGV4dFN1YnN0KGJvZHksIFtb Ci8qIEVudHJ5IHBvaW50IHRvIHNldCBzeW50YXggb3B0aW9ucy4gICovCnZvaWQKZGZhc3lu dGF4IChyZWdfc3ludGF4X3QgYml0cywgaW50IGZvbGQsIHVuc2lnbmVkIGNoYXIgZW9sKQp7 CiAgdW5zaWduZWQgaW50IGk7CgogIHN5bnRheF9iaXRzX3NldCA9IDE7CiAgc3ludGF4X2Jp dHMgPSBiaXRzOwogIGNhc2VfZm9sZCA9IGZvbGQgIT0gMDsKICBlb2xieXRlID0gZW9sOwoK XV0sIFtbCnR5cGVkZWYgc3RydWN0IHJlZ2V4X25hbWVfbWFwcGluZ19zdHJ1Y3QKewogIHJl Z19zeW50YXhfdCBmbGFnOwogIGNvbnN0IGNoYXIgKm5hbWU7Cn0gcmVnZXhfbmFtZV9tYXBw aW5nX3Q7CgpzdGF0aWMgcmVnZXhfbmFtZV9tYXBwaW5nX3QgcmVnZXhfbmFtZXNbXSA9IHsK ICB7UkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUywgImJhY2tzbGFzaF9lc2NhcGVfaW5f bGlzdHMifSwKICB7UkVfQktfUExVU19RTSwgICAgICAgICAgICAgICAgImJrX3BsdXNfcW0i fSwKICB7UkVfQ0hBUl9DTEFTU0VTLCAgICAgICAgICAgICAgImNoYXJfY2xhc3NlcyJ9LAog IHtSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMsICAgICAiY29udGV4dF9pbmRlcF9hbmNob3Jz In0sCiAge1JFX0NPTlRFWFRfSU5ERVBfT1BTLCAgICAgICAgICJjb250ZXh0X2luZGVwX29w cyJ9LAogIHtSRV9DT05URVhUX0lOVkFMSURfT1BTLCAgICAgICAiY29udGV4dF9pbnZhbGlk X29wcyJ9LAogIHtSRV9ET1RfTkVXTElORSwgICAgICAgICAgICAgICAiZG90X25ld2xpbmUi fSwKICB7UkVfRE9UX05PVF9OVUxMLCAgICAgICAgICAgICAgImRvdF9ub3RfbnVsbCJ9LAog IHtSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUsICAgICAiaGF0X2xpc3RzX25vdF9uZXdsaW5l In0sCiAge1JFX0lOVEVSVkFMUywgICAgICAgICAgICAgICAgICJpbnRlcnZhbHMifSwKICB7 UkVfTElNSVRFRF9PUFMsICAgICAgICAgICAgICAgImxpbWl0ZWRfb3BzIn0sCiAge1JFX05F V0xJTkVfQUxULCAgICAgICAgICAgICAgICJuZXdsaW5lX2FsdCJ9LAogIHtSRV9OT19CS19C UkFDRVMsICAgICAgICAgICAgICAibm9fYmtfYnJhY2VzIn0sCiAge1JFX05PX0JLX1BBUkVO UywgICAgICAgICAgICAgICJub19ia19wYXJlbnMifSwKICB7UkVfTk9fQktfUkVGUywgICAg ICAgICAgICAgICAgIm5vX2JrX3JlZnMifSwKICB7UkVfTk9fQktfVkJBUiwgICAgICAgICAg ICAgICAgIm5vX2JrX3ZiYXIifSwKICB7UkVfTk9fRU1QVFlfUkFOR0VTLCAgICAgICAgICAg Im5vX2VtcHR5X3JhbmdlcyJ9LAogIHtSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JELCAi dW5tYXRjaGVkX3JpZ2h0X3BhcmVuX29yZCJ9LAogIHtSRV9OT19QT1NJWF9CQUNLVFJBQ0tJ TkcsICAgICAibm9fcG9zaXhfYmFja3RyYWNraW5nIn0sCiAge1JFX05PX0dOVV9PUFMsICAg ICAgICAgICAgICAgICJub19nbnVfb3BzIn0sCiAge1JFX0RFQlVHLCAgICAgICAgICAgICAg ICAgICAgICJkZWJ1ZyJ9LAogIHtSRV9JTlZBTElEX0lOVEVSVkFMX09SRCwgICAgICAiaW52 YWxpZF9pbnRlcnZhbF9vcmQifSwKICB7UkVfSUNBU0UsICAgICAgICAgICAgICAgICAgICAg ImljYXNlIn0sCiAge1JFX0NBUkVUX0FOQ0hPUlNfSEVSRSwgICAgICAgICJjYXJldF9hbmNo b3JzX2hlcmUifSwKICB7UkVfQ09OVEVYVF9JTlZBTElEX0RVUCwgICAgICAgImNvbnRleHRf aW52YWxpZF9kdXAifSwKICB7UkVfTk9fU1VCLCAgICAgICAgICAgICAgICAgICAgIm5vX3N1 YiJ9LAogIHswLCBOVUxMfQp9OwoKLyogRW50cnkgcG9pbnQgdG8gc2V0IHN5bnRheCBvcHRp b25zLiAgKi8Kdm9pZApkZmFzeW50YXggKHJlZ19zeW50YXhfdCBiaXRzLCBpbnQgZm9sZCwg dW5zaWduZWQgY2hhciBlb2wpCnsKICB1bnNpZ25lZCBpbnQgaTsKCiAgLyogSG9vazogRGVi dWcgYnVmZmVyIHRvIHJlY29yZCBzZWFyY2ggc3ludGF4IHNwZWNpZmljYXRpb25zLiAgKi8K ICBzdGF0aWMgY2hhciBidWZbMjU2XTsKICBjaGFyICpwX2J1ZjsKICBjaGFyICpsb2NhbGU7 CgogIHN5bnRheF9iaXRzX3NldCA9IDE7CiAgc3ludGF4X2JpdHMgPSBiaXRzOwogIGNhc2Vf Zm9sZCA9IGZvbGQgIT0gMDsKICBlb2xieXRlID0gZW9sOwoKICBIT09LX3NldF91cF9mc2Ff c3R1ZmZfaWZfbm90X2RvbmVfYWxyZWFkeSAoKTsKCiAgLyogSE9PSzogVGVsbCBmc2FsZXgg bW9kdWxlIGFib3V0IHN5bnRheCBzZWxlY3Rpb25zLiAgKi8KICBmc2FsZXhfc3ludGF4IChs ZXhlciwgYml0cywgZm9sZCwgZW9sKTsKCiAgLyogSE9PSzogUmVjb3JkIHN5bnRheCBzZWxl Y3Rpb25zIGluIGRlYnVnIGxvZ2ZpbGUuICAqLwogIGlmICghIHBsbF9sb2cpCiAgICBwbGxf bG9nID0gZm9wZW4gKEhPT0tfTE9HX0ZJTEVOQU1FLCAiYSIpOwogIGxvY2FsZSA9IHNldGxv Y2FsZSAoTENfQUxMLCBOVUxMKTsKICBmcHJpbnRmIChwbGxfbG9nLCAiXG5TeW50YXg6IENh c2UgZm9sZDogJWQ7IGVvbCBjaGFyOiAlMDJ4OyBsb2NhbGU6ICVzIiwKICAgICAgICAgIGZv bGQsIChpbnQpIGVvbCwgbG9jYWxlKTsKICBwX2J1ZiA9IGJ1ZjsKICAqcF9idWYrKyA9ICdc bic7CiAgKnBfYnVmKysgPSAnICc7CiAgKnBfYnVmICAgPSAnXDAnOwogIGZvciAoaSA9IDA7 IHJlZ2V4X25hbWVzW2ldLm5hbWU7IGkrKykKICAgIHsKICAgICAgY2hhciBmbGFnX2NoYXIg PSAoYml0cyAmIHJlZ2V4X25hbWVzW2ldLmZsYWcpID8gJysnIDogJy0nOwogICAgICBwX2J1 ZiArPSBzcHJpbnRmKHBfYnVmLCAiICVjJXMiLCBmbGFnX2NoYXIsIHJlZ2V4X25hbWVzW2ld Lm5hbWUpOwogICAgICBpZiAoc3RybGVuIChidWYpID49IDgyKQogICAgICAgIHsKICAgICAg ICAgIGZwcmludGYgKHBsbF9sb2csICIlcyIsIGJ1Zik7CiAgICAgICAgICBwX2J1ZiA9ICZi dWZbMl07CiAgICAgICAgICAqcF9idWYgPSAnXDAnOwogICAgICAgIH0KICAgIH0KICBmcHJp bnRmIChwbGxfbG9nLCAiJXNcbiIsIGJ1Zik7CgogIC8qIE9rYXksIG5vdyB0aGUgcGFyc2Vy IGNhbiB0YWxrIHRvIGEgbGV4ZXIgdGhhdCBrbm93cyBsb2NhbGUgYW5kIHN5bnRheAogICAg IGNvbmZpZ3VyYXRpb24gZGV0YWlscy4gICovCiAgZnNhcGFyc2VfbGV4ZXIgKHBhcnNlciwg bGV4ZXIsCiAgICAgICAgICAgICAgICAgIChwcm90b19sZXhwYXJzZV9sZXhfZm5fdCAqKSBm c2FsZXhfbGV4LAogICAgICAgICAgICAgICAgICAocHJvdG9fbGV4cGFyc2VfZXhjaGFuZ2Vf Zm5fdCAqKSBmc2FsZXhfZXhjaGFuZ2UpOwoKXV0pCgpib2R5ID0gVGV4dFN1YnN0IChib2R5 LCBbWwovKiBFbnRyeSBwb2ludCB0byBzZXQgc3ludGF4IG9wdGlvbnMuICAqLwp2b2lkCmRm YXN5bnRheCAocmVnX3N5bnRheF90IGJpdHMsIGludCBmb2xkLCB1bnNpZ25lZCBjaGFyIGVv bCkKXV0sIFtbCi8qIEhPT0s6IFdoZW4gd2UgYWJvcnQsIGdldCByaWQgb2YgcmVzb3VyY2Vz IHRoYXQgd2UndmUgYWNxdWlyZWQsIGJlZm9yZQogICBmaW5hbGx5IGhhbmRpbmcgY29udHJv bCB0byB0aGUgYWJvcnQgbWVjaGFuaXNtLiAgV2UgZG8gdGhpcyB0byBtaW5pbWlzZQogICBy ZXNvdXJjZSBhbGxvY2F0aW9uIGVycm9yIHJlcG9ydGVkIGJ5IFZhbGdyaW5kOyBJIGJlbGll dmUgdGhhdCBpdCBpcyBub3QKICAgdml0YWwgdG8gZG8gc28gb3RoZXJ3aXNlIChidXQgSSBt YXkgYmUgd3JvbmcpLiAgKi8Kc3RhdGljIHZvaWQKSE9PS190ZWFyX2Rvd25fYWRkaXRpb25h bF9pbmZyYXN0cnVjdHVyZSAodm9pZCkKewogIHBhcnNlciA9IE5VTEw7CiAgbGV4ZXIgPSBO VUxMOwogIC8qIGZzYXRva2VuLCBwcm90by1sZXhwYXJzZSBhbmQgZGZhLXBybCBpdHNlbGYg ZG8gbm90IG5lZWQKICAgICBhdHRlbnRpb24gKHlldD8pLiAgKi8KCiAgLyogUmVsZWFzZSB0 aGUgIm11c3RzIiBsaXN0IHdlIGNvbXBpbGVkIGVhcmxpZXIuICAqLwogIHsKICAgIGZzYW11 c3RzX2xpc3RfZWxlbWVudF90ICptbGlzdDsKICAgIGZzYW11c3RzX2xpc3RfZWxlbWVudF90 ICptbmV4dDsKCiAgICBmb3IgKG1saXN0ID0gbXVzdHM7IG1saXN0OyBtbGlzdCA9IG1uZXh0 KQogICAgICB7CiAgICAgICBtbmV4dCA9IG1saXN0LT5uZXh0OwogICAgICAgZnJlZSAobWxp c3QtPm11c3QpOwogICAgICAgZnJlZSAobWxpc3QpOwogICAgICB9CgogICAgbXVzdHMgPSBO VUxMOwogIH0KfQoKLyogSE9PSzogUHJvdmlkZSBlcnJvci93YXJuaW5nIGZ1bmN0aW9ucyB0 aGF0IGluY2x1ZGUgbG9nZ2luZy4gICovCnN0YXRpYyB2b2lkCmxleGVyX3dhcm4oY29uc3Qg Y2hhciAqd2FybmluZykKewogIGlmICghIHBsbF9sb2cpCiAgICBwbGxfbG9nID0gZm9wZW4g KEhPT0tfTE9HX0ZJTEVOQU1FLCAiYSIpOwogIGZwcmludGYgKHBsbF9sb2csICJsZXhlciB3 YXJuaW5nOiAlc1xuIiwgd2FybmluZyk7CiAgZmZsdXNoIChOVUxMKTsKICBkZmF3YXJuICh3 YXJuaW5nKTsKfQpzdGF0aWMgX05vcmV0dXJuIHZvaWQKbGV4ZXJfZXJyb3IoY29uc3QgY2hh ciAqcmVhc29uKQp7CiAgaWYgKCEgcGxsX2xvZykKICAgIHBsbF9sb2cgPSBmb3BlbiAoSE9P S19MT0dfRklMRU5BTUUsICJhIik7CiAgZnByaW50ZiAocGxsX2xvZywgImxleGVyIGVycm9y OiAlc1xuIiwgcmVhc29uKTsKICBIT09LX3RlYXJfZG93bl9hZGRpdGlvbmFsX2luZnJhc3Ry dWN0dXJlICgpOwogIGZmbHVzaCAoTlVMTCk7CiAgZGZhZXJyb3IgKHJlYXNvbik7Cn0KCnN0 YXRpYyB2b2lkCnBhcnNlcl93YXJuKGNvbnN0IGNoYXIgKndhcm5pbmcpCnsKICBpZiAoISBw bGxfbG9nKQogICAgcGxsX2xvZyA9IGZvcGVuIChIT09LX0xPR19GSUxFTkFNRSwgImEiKTsK ICBmcHJpbnRmIChwbGxfbG9nLCAicGFyc2VyIHdhcm5pbmc6ICVzXG4iLCB3YXJuaW5nKTsK ICBmZmx1c2ggKE5VTEwpOwogIGRmYXdhcm4gKHdhcm5pbmcpOwp9CnN0YXRpYyBfTm9yZXR1 cm4gdm9pZApwYXJzZXJfZXJyb3IoY29uc3QgY2hhciAqcmVhc29uKQp7CiAgaWYgKCEgcGxs X2xvZykKICAgIHBsbF9sb2cgPSBmb3BlbiAoSE9PS19MT0dfRklMRU5BTUUsICJhIik7CiAg ZnByaW50ZiAocGxsX2xvZywgInBhcnNlciBlcnJvcjogJXNcbiIsIHJlYXNvbik7CiAgSE9P S190ZWFyX2Rvd25fYWRkaXRpb25hbF9pbmZyYXN0cnVjdHVyZSAoKTsKICBmZmx1c2ggKE5V TEwpOwogIGRmYWVycm9yIChyZWFzb24pOwp9CgpzdGF0aWMgdm9pZApIT09LX3NldF91cF9m c2Ffc3R1ZmZfaWZfbm90X2RvbmVfYWxyZWFkeSAodm9pZCkKewogIC8qIElmIGxleGVyIGNv bnRleHQgaXMgcHJlc2VudCwgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBydW4gcHJldmlvdXNs eS4gICovCiAgaWYgKGxleGVyICE9IE5VTEwpCiAgICByZXR1cm47CgogIC8qIEluaXRpYWxp c2UgbW9kdWxlcyBiZWZvcmUgY3JlYXRpbmcgaW5zdGFuY2VzLiAgKi8KICBmc2FsZXhfaW5p dGlhbGlzZSAoKTsKICBmc2FwYXJzZV9pbml0aWFsaXNlICgpOwoKICAvKiBDcmVhdGUgYSBu ZXcgbGV4ZXIgaW5zdGFuY2UsIGFuZCBnaXZlIGl0IGVycm9yL3dhcm5pbmcgZm5zICAqLwog IGxleGVyID0gZnNhbGV4X25ldyAoKTsKICBmc2FsZXhfZXhjZXB0aW9uX2ZucyAobGV4ZXIs IGxleGVyX3dhcm4sIGxleGVyX2Vycm9yKTsKCiAgLyogU3RhcnQgd2l0aCBhIHBvb2wgb2Yg MTAgY2hhcmNsYXNzZXMuICAqLwogIGNoYXJjbGFzc19pbml0aWFsaXNlICgxMCk7CgogIC8q IEluaWlhbGlzZSBtdWx0aWJ5dGUtY2hhci1zZXRzIG1vZHVsZS4gICovCiAgbWJjc2V0c19p bml0aWFsaXNlICgpOwoKICAvKiBDcmVhdGUgYSBuZXcgcGFyc2VyIGluc3RhbmNlLCBhbmQg Z2l2ZSBpdCBlcnJvci93YXJuaW5nIGZ1bmN0aW9ucy4KICAgICBEZWZlciBjb25uZWN0aW5n IHVwIHRoZSBsZXhlciB1bnRpbCBsZXhlciBzeW50YXggaGFzIGJlZW4gc2V0IHVwLiAgKi8K ICBwYXJzZXIgPSBmc2FwYXJzZV9uZXcgKCk7CiAgZnNhcGFyc2VfZXhjZXB0aW9uX2ZucyAo cGFyc2VyLCBwYXJzZXJfd2FybiwgcGFyc2VyX2Vycm9yKTsKfQoKLyogRW50cnkgcG9pbnQg dG8gc2V0IHN5bnRheCBvcHRpb25zLiAgKi8Kdm9pZApkZmFzeW50YXggKHJlZ19zeW50YXhf dCBiaXRzLCBpbnQgZm9sZCwgdW5zaWduZWQgY2hhciBlb2wpCl1dKQoKLS0gV2hlbmV2ZXIg bGV4IGlzIGNhbGxlZCB0byBnZXQgYSB0b2tlbiwgY2FsbCB0aGUgb3JpZ2luYWwgbGV4IGFu ZCBhbHNvCi0tIGZzYWxleF9sZXggaW4gcGFyYWxsZWwsIGFuZCBjb21wYXJlIHRoZSByZXN1 bHRzLiAgVHdvIGNoYW5nZXMgdG8gZG8KLS0gdGhpczogMS4gUmVuYW1lICJsZXgiIHRvICJv cmlnaW5hbF9sZXgiLiAgMi4gQWRkIGEgbmV3ICJsZXgiIGZ1bmN0aW9uCi0tIHRoYXQgY2Fs bHMgYm90aCAib3JpZ2luYWxfbGV4IiBhbmQgdGhlbiAiZnNhbGV4X2xleCIsIGFuZCBjb21w YXJlcyB0aGUKLS0gcmVzdWx0Lgpib2R5ID0gVGV4dFN1YnN0KGJvZHksIFtbCnN0YXRpYyB0 b2tlbgpsZXggKHZvaWQpCnsKICBpbnQgYywgYzI7CiAgYm9vbCBiYWNrc2xhc2ggPSBmYWxz ZTsKXV0sIFtbCnN0YXRpYyB0b2tlbgpvcmlnaW5hbF9sZXggKHZvaWQpCnsKICBpbnQgYywg YzI7CiAgYm9vbCBiYWNrc2xhc2ggPSBmYWxzZTsKXV0pCmJvZHkgPSBUZXh0U3Vic3QoYm9k eSwgW1sKLyogUmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIGZvciByZWd1bGFyIGV4cHJlc3Np b25zLiAgKi8KCnN0YXRpYyB0b2tlbiB0b2s7ICAgICAgICAgICAgICAgLyogTG9va2FoZWFk IHRva2VuLiAgKi8Kc3RhdGljIHNpemVfdCBkZXB0aDsgICAgICAgICAgICAvKiBDdXJyZW50 IGRlcHRoIG9mIGEgaHlwb3RoZXRpY2FsIHN0YWNrCl1dLCBbWwpzdGF0aWMgdG9rZW4KbGV4 ICh2b2lkKQp7CiAgdG9rZW4gICAgICAgICAgICBvcmlnaW5hbF90b2tlbjsKICBmc2F0b2tl bl90b2tlbl90IGZzYWxleF90b2tlbjsKICBjb25zdCBjaGFyICphbGFybTsKCiAgb3JpZ2lu YWxfdG9rZW4gPSBvcmlnaW5hbF9sZXggKCk7CiAgZnNhbGV4X3Rva2VuICAgPSBmc2FsZXhf bGV4IChsZXhlcik7CiAgYWxhcm0gPSAiIjsKICBpZiAoKG9yaWdpbmFsX3Rva2VuICE9IGZz YWxleF90b2tlbikgJiYgKG9yaWdpbmFsX3Rva2VuIDwgQ1NFVCkpCiAgICBhbGFybSA9ICIg KioqIEVSUk9SOiBUb2tlbiBtaXNtYXRjaCI7CiAgZnByaW50ZiAocGxsX2xvZywgIlRva2Vu IGRlYnVnOiBPcmlnaW5hbCwgZnNhbGV4OiAlMDhseCAlMDhseCAlc1xuIiwKICAgICAgICAg b3JpZ2luYWxfdG9rZW4sIGZzYWxleF90b2tlbiwgYWxhcm0pOwoKICBpZiAoZnNhbGV4X3Rv a2VuID09IEZTQVRPS0VOX1RLX1JFUE1OKQogICAgewogICAgICBpbnQgeF9taW5yZXAsIHhf bWF4cmVwOwogICAgICB4X21pbnJlcCA9IGZzYWxleF9leGNoYW5nZShsZXhlciwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9fTEVYUEFSU0VfT1BfR0VUX1JFUE1O X01JTiwgTlVMTCk7CiAgICAgIHhfbWF4cmVwID0gZnNhbGV4X2V4Y2hhbmdlKGxleGVyLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UT19MRVhQQVJTRV9PUF9HRVRf UkVQTU5fTUFYLCBOVUxMKTsKICAgICAgZnByaW50ZiAocGxsX2xvZywgIiAgICAgICBPcmln aW5hbCBSRVBNTnslZCwlZH07ICAiLCBtaW5yZXAsIG1heHJlcCk7CiAgICAgIGZwcmludGYg KHBsbF9sb2csICIgIEZTQVRPS0VOX1RLX1JFUE1OeyVkLCVkfVxuIiwgeF9taW5yZXAsIHhf bWF4cmVwKTsKICAgICAgaWYgKCh4X21pbnJlcCAhPSBtaW5yZXApIHx8ICh4X21heHJlcCAh PSBtYXhyZXApKQogICAgICAgIGZwcmludGYgKHBsbF9sb2csICIgKioqIEVSUk9SOiBNaW4s IG1heCByZXAgZG9lc24ndCBtYXRjaFxuIik7CiAgICB9CgogIGVsc2UgaWYgKGZzYWxleF90 b2tlbiA+PSBGU0FUT0tFTl9US19DU0VUKQogICAgewogICAgICBzaXplX3QgaW5kZXg7CiAg ICAgIHVuc2lnbmVkIGludCAqIG9yaWdfY2NsOwogICAgICBpbnQgaTsKICAgICAgY2hhcmNs YXNzX3QgKmNoYXJzZXQ7CiAgICAgIGNoYXIgKmRlc2NyaXB0aW9uOwogICAgICBzdGF0aWMg Y2hhciBidWZbMjU2XTsKICAgICAgY2hhciAqcF9idWY7CgovKiBOeWJibGUgKDRiaXQpLXRv LWNoYXIgY29udmVyc2lvbiBhcnJheSBmb3IgbGl0dGxlLWJpdC1lbmRpYW4gbnliYmxlcy4g ICovCnN0YXRpYyBjb25zdCBjaGFyICpkaXNwX255YmJsZSA9ICIwODRjMmE2ZTE5NWQzYjdm IjsKCiAgICAgIC8qIFJlcG9ydCBkZXRhaWxzIG9mIHRoZSBvcmlnaW5hbCBjaGFyY2xhcyBw cm9kdWNlZCBieSBkZmEuYy4gICovCiAgICAgIGluZGV4ID0gb3JpZ2luYWxfdG9rZW4gLSBD U0VUOwogICAgICBwX2J1ZiA9IGJ1ZjsKICAgICAgb3JpZ19jY2wgPSBkZmEtPmNoYXJjbGFz c2VzW2luZGV4XTsKICAgICAgZm9yIChpID0gMDsgaSA8IENIQVJDTEFTU19XT1JEUzsgaSAr PSAyKQogICAgICAgIHsKICAgICAgICAgIGNoYXJjbGFzc193b3JkIGogPSBvcmlnX2NjbFtp XTsKICAgICAgICAgICpwX2J1ZisrID0gJyAnOwogICAgICAgICAgKnBfYnVmKysgPSBkaXNw X255YmJsZVsoaiA+PiAgMCkgJiAweDBmXTsKICAgICAgICAgICpwX2J1ZisrID0gZGlzcF9u eWJibGVbKGogPj4gIDQpICYgMHgwZl07CiAgICAgICAgICAqcF9idWYrKyA9IGRpc3Bfbnli YmxlWyhqID4+ICA4KSAmIDB4MGZdOwogICAgICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJs ZVsoaiA+PiAxMikgJiAweDBmXTsKICAgICAgICAgICpwX2J1ZisrID0gZGlzcF9ueWJibGVb KGogPj4gMTYpICYgMHgwZl07CiAgICAgICAgICAqcF9idWYrKyA9IGRpc3BfbnliYmxlWyhq ID4+IDIwKSAmIDB4MGZdOwogICAgICAgICAgKnBfYnVmKysgPSBkaXNwX255YmJsZVsoaiA+ PiAyNCkgJiAweDBmXTsKICAgICAgICAgICpwX2J1ZisrID0gZGlzcF9ueWJibGVbKGogPj4g MjgpICYgMHgwZl07CgogICAgICAgICAgaiA9IG9yaWdfY2NsW2kgKyAxXTsKICAgICAgICAg ICpwX2J1ZisrID0gZGlzcF9ueWJibGVbKGogPj4gIDApICYgMHgwZl07CiAgICAgICAgICAq cF9idWYrKyA9IGRpc3BfbnliYmxlWyhqID4+ICA0KSAmIDB4MGZdOwogICAgICAgICAgKnBf YnVmKysgPSBkaXNwX255YmJsZVsoaiA+PiAgOCkgJiAweDBmXTsKICAgICAgICAgICpwX2J1 ZisrID0gZGlzcF9ueWJibGVbKGogPj4gMTIpICYgMHgwZl07CiAgICAgICAgICAqcF9idWYr KyA9IGRpc3BfbnliYmxlWyhqID4+IDE2KSAmIDB4MGZdOwogICAgICAgICAgKnBfYnVmKysg PSBkaXNwX255YmJsZVsoaiA+PiAyMCkgJiAweDBmXTsKICAgICAgICAgICpwX2J1ZisrID0g ZGlzcF9ueWJibGVbKGogPj4gMjQpICYgMHgwZl07CiAgICAgICAgICAqcF9idWYrKyA9IGRp c3BfbnliYmxlWyhqID4+IDI4KSAmIDB4MGZdOwogICAgICAgIH0KICAgICAgKnBfYnVmKysg PSAnXDAnOwogICAgICBmcHJpbnRmIChwbGxfbG9nLCAiICAgICAgICAgICAgICBvcmlnaW5h bCBbJTNsdV06JXNcbiIsIGluZGV4LCBidWYpOwoKICAgICAgLyogQWxzbyByZXBvcnQgdGhl IGNoYXJjbGFzcyBtZW1iZXIgZGV0YWlscyBmcm9tIGZzYWxleCBldGMuICAqLwogICAgICBp bmRleCA9IGZzYWxleF90b2tlbiAtIEZTQVRPS0VOX1RLX0NTRVQ7CiAgICAgIGNoYXJzZXQg PSBjaGFyY2xhc3NfZ2V0X3BvaW50ZXIgKGluZGV4KTsKICAgICAgZGVzY3JpcHRpb24gPSBj aGFyY2xhc3NfZGVzY3JpYmUgKGNoYXJzZXQpOwogICAgICBpbmRleCA9IGNoYXJjbGFzc19n ZXRfaW5kZXggKGNoYXJzZXQpOwogICAgICBmcHJpbnRmIChwbGxfbG9nLCAiICAgIGZzYWxl eDogWyUzbHVdICVzXG4iLCBpbmRleCwgZGVzY3JpcHRpb24pOwogICAgICBpZiAoISBjaGFy Y2xhc3NfZXF1YWwgKGNoYXJzZXQsIChjaGFyY2xhc3NfdCBjb25zdCAqKSBvcmlnX2NjbCkp CiAgICAgICAgZnByaW50ZiAocGxsX2xvZywgIiAqKiogRVJST1I6IENoYXJjbGFzcyBtaXNt YXRjaFxuIik7CiAgICB9CgogIHJldHVybiBvcmlnaW5hbF90b2tlbjsKfQoKc3RhdGljIHZv aWQKc2hvd19tdXN0cyAoY29uc3QgY2hhciAqdGl0bGUsIGZzYW11c3RzX2xpc3RfZWxlbWVu dF90ICpsaXN0KQp7CiAgZnNhbXVzdHNfbGlzdF9lbGVtZW50X3QgKmVsZW07CiAgc3RhdGlj IGNoYXIgYnVmWzI1Nl07CiAgY2hhciAqcF9idWY7CgogIGZwcmludGYgKHBsbF9sb2csICJc biVzOlxuIiwgdGl0bGUpOwoKICBwX2J1ZiA9IGJ1ZjsKICBmb3IgKGVsZW0gPSBsaXN0OyBl bGVtICE9IE5VTEw7IGVsZW0gPSBlbGVtLT5uZXh0KQogICAgewogICAgICBpZiAoKChwX2J1 ZiAtIGJ1ZikgKyA0ICsgc3RybGVuIChlbGVtLT5tdXN0KSkgPiA3MikKICAgICAgICB7CiAg ICAgICAgICBmcHJpbnRmKHBsbF9sb2csICIgJXNcbiIsIGJ1Zik7CiAgICAgICAgICBwX2J1 ZiA9IGJ1ZjsKICAgICAgICB9CiAgICAgICAgcF9idWYgKz0gc3ByaW50ZiAocF9idWYsICIg KCVzKSA+JXM8IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLT5leGFjdCA/ICJF bnRpcmUiIDogInBhcnRpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0tPm11 c3QpOwogICAgfQogIGZwcmludGYgKHBsbF9sb2csICIlc1xuIiwgYnVmKTsKfQoKLyogUmVj dXJzaXZlIGRlc2NlbnQgcGFyc2VyIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLiAgKi8KCnN0 YXRpYyB0b2tlbiB0b2s7ICAgICAgICAgICAgICAgLyogTG9va2FoZWFkIHRva2VuLiAgKi8K c3RhdGljIHNpemVfdCBkZXB0aDsgICAgICAgICAgICAvKiBDdXJyZW50IGRlcHRoIG9mIGEg aHlwb3RoZXRpY2FsIHN0YWNrCl1dKQoKYm9keSA9IFRleHRTdWJzdChib2R5LApbWwovKiBQ YXJzZSBhbmQgYW5hbHl6ZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGdpdmVuIGxlbmd0aC4g ICovCnZvaWQKZGZhY29tcCAoY2hhciBjb25zdCAqcywgc2l6ZV90IGxlbiwgc3RydWN0IGRm YSAqZCwgaW50IHNlYXJjaGZsYWcpCnsKICBkZmFpbml0IChkKTsKICBkZmFtYmNhY2hlIChk KTsKICBkZmFwYXJzZSAocywgbGVuLCBkKTsKICBkZmFtdXN0IChkKTsKXV0sCltbCi8qIFJ1 biB0aGUgZnNhKiBldGMgbW9kdWxlcyAocGFyc2luZy9sZXhpbmcvdG9rZW5zL2NoYXJjbGFz cykgZmlyc3QsIHRoZW4KICAgcnVuIHRoZSBvcmlnaW5hbCBkZmEgY29kZSwgd2l0aCBhIGhv b2sgYWRkZWQgdGhhdCB0aGUgcGFyc2VyL2xleGVyCiAgIGludGVyZmFjZSBpbiB0aGUgb3Jp Z2luYWwgY29kZSBjYWxscyB0aGUgbmV3IGNvZGUgaW4gcGFyYWxsZWwsIHNvIHRoYXQKICAg dGhlIHZlcmFjaXR5IG9mIHRoZSBsZXhpY2FsIHRva2VuIHN0cmVhbXMgY2FuIGJlIGluc3Bl Y3RlZCAodGhleSBzaG91bGQKICAgYmUgaWRlbnRpY2FsKS4gIEFmdGVyIHRoZXNlIHJ1bnMs IHRoZSBwYXJzZXIgdG9rZW4gbGlzdCBmcm9tIGVhY2ggc2lkZQogICBpcyBleHRyYWN0ZWQg YW5kIGNvbXBhcmVkLCBhbmQgc2hvdWxkIGFsc28gYmUgaWRlbnRpY2FsLiAgICovCgovKiBQ YXJzZSBhbmQgYW5hbHl6ZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGdpdmVuIGxlbmd0aC4g ICovCnZvaWQKZGZhY29tcCAoY2hhciBjb25zdCAqcywgc2l6ZV90IGxlbiwgc3RydWN0IGRm YSAqZCwgaW50IHNlYXJjaGZsYWcpCnsKICBzaXplX3QgaTsKCiAgSE9PS19zZXRfdXBfZnNh X3N0dWZmX2lmX25vdF9kb25lX2FscmVhZHkgKCk7CgogIC8qIEhPT0s6IFdyaXRlIHRoZSBz ZWFyY2ggcGF0dGVybiB0byB0aGUgbG9nZmlsZS4uICAqLwogIGlmICghIHBsbF9sb2cpCiAg ICBwbGxfbG9nID0gZm9wZW4oSE9PS19MT0dfRklMRU5BTUUsICJhIik7CiAgZnByaW50ZiAo cGxsX2xvZywgIlBhdHRlcm46Iik7CiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQogICAg ICBmcHJpbnRmIChwbGxfbG9nLCAiICAlYyIsIGlzcHJpbnQgKHNbaV0pID8gc1tpXSA6ICcg Jyk7CiAgZnByaW50ZiAocGxsX2xvZywgIlxuICAgICAgICAiKTsKICBmb3IgKGkgPSAwOyBp IDwgbGVuOyBpKyspCiAgICBmcHJpbnRmIChwbGxfbG9nLCAiICUwMngiLCAoKHVuc2lnbmVk KSBzW2ldKSAmIDB4ZmYpOwogIGZwcmludGYgKHBsbF9sb2csICJcbiIpOwoKICAvKiBIT09L OiBSdW4gdGhlIG5ldyBjb2RlIGZpcnN0IHNvIGFueSBkZXBlbmRlbmNpZXMgb24gb2xkIGNv ZGUgYXJlIG1vcmUKICAgICBsaWtlbHkgdG8gYnJpbmcgdXAgZXJyb3JzLiAgKi8KICBmc2Fs ZXhfcGF0dGVybiAobGV4ZXIsIHMsIGxlbik7CiAgZnNhcGFyc2VfcGFyc2UgKHBhcnNlcik7 CgogIC8qIFJlLXByaW1lIGZzYWxleCAoKSB0byBhbmFseXNlIHRoZSBwYXR0ZXJuIGEgc2Vj b25kIHRpbWUsIHNvIHRoYXQKICAgICBsZXhpY2FsIHRva2VucyBmcm9tIGJvdGggc3lzdGVt cyBjYW4gYmUgY29tcGFyZWQgc2lkZS1ieS1zaWRlLgogICAgIFRoaXMgbGV4aWNhbC10b2tl bi1jaGVjayB3YXRjaGVzIHRoZSBhY3Rpdml0eSBhdCB0aGUgcGFyc2VyL2xleGVyCiAgICAg Ym91bmRhcnk7IHRoZSBjb2RlIGJlbG93IGNvbXBhcmVzIHRoZSBvdXRwdXRzIG9mIHRoZSBv cmlnaW5hbCBwYXJzZXIKICAgICBhbmQgZnNhcGFyc2UsIGFuZCB0aGV5IHNob3VsZCBhbHNv IGJlIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgKHNvbWUKICAgICBkaWZmZXJlbmNlcyBjYW4g b2NjdXIgaW4gdGhlIGluZGljZXMgYWRkZWQgdG8gQ1NFVCB0b2tlbnMsIGJ1dAogICAgIHRo ZSByZWZlcmVuY2VkIHNldCBzaG91bGQgYmUgaWRlbnRpY2FsKS4gICovCiAgZnNhbGV4X3Bh dHRlcm4gKGxleGVyLCBzLCBsZW4pOwoKICBkZmFpbml0IChkKTsKICBkZmFtYmNhY2hlIChk KTsKICBkZmFwYXJzZSAocywgbGVuLCBkKTsKICBkZmFtdXN0IChkKTsKCiAgLyogWUVUIEFO T1RIRVIgSEFDSywgMTYgQXByaWwgMjAxNCAod2FzIGl0IHJlbGF0ZWQgdG8gdGhlIGx1bmFy IGVjbGlwc2UKICAgICBsYXN0IG5pZ2h0Pz8gISE/PyApCiAgICAgQ29tcGFyZSwgc2lkZS1i eS1zaWRlLCB0aGUgbGlzdCBvZiB0b2tlbnMgZ2VuZXJhdGVkIGJ5IGRmYS5jIGFuZCBieQog ICAgIGZzYXBhcnNlLCBhbmQgd3JpdGUgdGhlc2UgdG8gdGhlIGRlYnVnIGxvZyBmaWxlLiAg QXMgZWxzZXdoZXJlLCB0aGVzZQogICAgIHNob3VsZCBiZSBpZGVudGljYWwsIGFzIHRoZSBt b2R1bGFyaXNlZCBjb2RlIHN0YXJ0cyBhcyBhIGZ1bmN0aW9uYWwKICAgICBjbG9uZSBvZiB0 aGUgb3JpZ2luYWwgY29kZS4gIChMYXRlciwgaWYvd2hlbiB0b2tlbnMgYXJlIHJld29ya2Vk IHRvCiAgICAgbWFpbnRhaW4gYWJzdHJhY3Rpb25zIGF0IGEgaGlnaGVyIGxldmVsLCB0aGUg dG9rZW4gbGlzdHMgd2lsbAogICAgIGRpZmZlci4pICAqLwogIHsKICAgIHNpemVfdCBucl90 b2tlbnM7CiAgICBmc2F0b2tlbl90b2tlbl90ICp0b2tlbl9saXN0OwogICAgc2l6ZV90IGo7 CiAgICBzaXplX3QgbWF4X2luZGV4OwoKICAgIGZzYXBhcnNlX2dldF90b2tlbl9saXN0IChw YXJzZXIsICZucl90b2tlbnMsICZ0b2tlbl9saXN0KTsKICAgIGZwcmludGYgKHBsbF9sb2cs ICJcbnRva2VuczogIG9yaWdpbmFsICBmc2FwYXJzZVxuIik7CiAgICBtYXhfaW5kZXggPSBk LT50aW5kZXggPiBucl90b2tlbnMgPyBkLT50aW5kZXggOiBucl90b2tlbnM7CiAgICBmb3Ig KGogPSAwOyBqIDwgbWF4X2luZGV4OyArK2opCiAgICAgIHsKICAgICAgICBzdGF0aWMgY2hh ciBidWZbMjU2XTsKICAgICAgICBpZiAoaiA8IGQtPnRpbmRleCkKICAgICAgICAgIHsKICAg ICAgICAgICAgc3ByaW50ZiAoYnVmLCAiJTAybHgiLCBkLT50b2tlbnNbal0pOwogICAgICAg ICAgICBmcHJpbnRmIChwbGxfbG9nLCAiJTE3cyAiLCBidWYpOwogICAgICAgICAgfQogICAg ICAgICAgZWxzZQogICAgICAgICAgICBmcHJpbnRmIChwbGxfbG9nLCAiJTE3cyIsICIiKTsK ICAgICAgICBpZiAoaiA8IG5yX3Rva2VucykKICAgICAgICAgIHsKICAgICAgICAgICAgc3By aW50ZiAoYnVmLCAiJTAybHgiLCB0b2tlbl9saXN0W2pdKTsKICAgICAgICAgICAgZnByaW50 ZiAocGxsX2xvZywgIiU5cyIsIGJ1Zik7CiAgICAgICAgICB9CiAgICAgICAgZnByaW50ZiAo cGxsX2xvZywgIlxuIik7CiAgICAgIH0KCiAgICAvKiBBbmQgZmluYWxseSwgc2VlIGhvdyBl eHRyYWN0aW5nIG11c3RzIGZyb20gZGZhLmMgY29tcGFyZXMgdG8gZXh0cmFjdGluZwogICAg ICAgbXVzdHMgdmlhIHRoZSBmc2EvY2hhcmNsYXNzIGZhbWlseSBvZiBmdW5jdGlvbnM7IGFn YWluLCB0aGVzZSBzaG91bGQKICAgICAgIGJlIGlkZW50aWNhbC4gICovCiAgICBtdXN0cyA9 IChmc2FtdXN0c19saXN0X2VsZW1lbnRfdCAqKSBkLT5tdXN0czsKICAgIHNob3dfbXVzdHMg KCJvcmlnaW5hbCBkZmEuYyIsIG11c3RzKTsKCiAgICAvKiBBTk9USEVSIFVHTFkgSEFDSzog UmVseSBvbiBkZmEuYydzIGNhc2VfZm9sZCBhbmQgdW5pYnl0ZSBsb2NhbGUgd2hlbgogICAg ICAgaW5zdHJ1Y3RpbmcgZGZhbXVzdCBob3cgdG8gb3BlcmF0ZTsgYW4gIkV4Y2hhbmdlIiBm dW5jdGlvbiBtaWdodCBiZQogICAgICAgbW9yZSBhcHByb3ByaWF0ZSBpbiB0aGUgc2hvcnQt dG8tbWlkLXRlcm0sIGJ1dCBpbiB0aGUgbG9uZ2VyIHRlcm0sCiAgICAgICB0aGUgdG9rZW4g dm9jYWJsdWFyeSBzaG91bGQgZ2V0IG1vcmUgZXhwcmVzc2l2ZSwgc28gdGhhdCBpbmZvcm1h dGlvbgogICAgICAgY2FuIGJlIGNvbnZleWVkIGRpcmVjdGx5LiAgKi8KICAgIG11c3RzID0g ZnNhbXVzdHNfbXVzdCAoTlVMTCwgbnJfdG9rZW5zLCB0b2tlbl9saXN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAvKiBkZmEuYyBjb3B5OiAqLyBjYXNlX2ZvbGQsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgKGRmYS5jKSBsb2NhbGU6ICovIE1CX0NV Ul9NQVggPT0gMSk7CiAgICBzaG93X211c3RzICgiZnNhKiBldCBhbCBmdW5jdGlvbnMiLCBt dXN0cyk7CiAgfQoKXV0pCgotLSBOb3csIGFkZCBjYWxscyBhdCB0aGUgZW5kIG9mIGRmYWZy ZWUgKCkgdG8gZGVzdHJveSB0aGUgZW50aXJlIG1vZHVsZXMKLS0gYW5kIGFzc29jaWF0ZWQg aW5zdGFuY2VzIHNldCB1cCBieSBlYXJsaWVyIGhvb2tzLgoKYm9keSA9IFRleHRTdWJzdChi b2R5LCBbWwogIGZvciAoZG0gPSBkLT5tdXN0czsgZG07IGRtID0gbmRtKQogICAgewogICAg ICBuZG0gPSBkbS0+bmV4dDsKICAgICAgZnJlZSAoZG0tPm11c3QpOwogICAgICBmcmVlIChk bSk7CiAgICB9CgogIGlmIChkLT5zdXBlcnNldCkKICAgIGRmYWZyZWUgKGQtPnN1cGVyc2V0 KTsKXV0sIFtbCiAgZm9yIChkbSA9IGQtPm11c3RzOyBkbTsgZG0gPSBuZG0pCiAgICB7CiAg ICAgIG5kbSA9IGRtLT5uZXh0OwogICAgICBmcmVlIChkbS0+bXVzdCk7CiAgICAgIGZyZWUg KGRtKTsKICAgIH0KCiAgaWYgKGQtPnN1cGVyc2V0KQogICAgZGZhZnJlZSAoZC0+c3VwZXJz ZXQpOwoKICAvKiBIT09LOiBUZWFyIGRvd24gYWxsIHRoZSBpbmZyYXN0cnVjdHVyZSBhZGRl ZCBmb3IgcGFyYWxsZWwgb3BlcmF0aW9uLiAgKi8KICBIT09LX3RlYXJfZG93bl9hZGRpdGlv bmFsX2luZnJhc3RydWN0dXJlICgpOwpdXSkKCi0tIEZpbmFsbHksIHdyaXRlIHRoZSBtb2Rp ZmllZCBkZmEgY29kZSB0byBhIHNlcGFyYXRlIEMgZmlsZS4KbG9jYWwgZiA9IGFzc2VydChp by5vcGVuKCJkZmEtcHJsLmMiLCAidyIpKQphc3NlcnQoZjp3cml0ZShib2R5KSkKYXNzZXJ0 KGY6Y2xvc2UoKSkKCi0tLS0tLS0tLS0tLS0tLS0qKioqKioqKiBNYWtlZmlsZS5hbSAqKioq KioqKi0tLS0tLS0tLS0tLS0tLS0KCnByaW50KCJNb2RpZnlpbmcgKGlmIG5lZWRlZCkgTWFr ZWZpbGUuYW07IHlvdSBtYXkgbmVlZCB0byByZS1ydW4gYXV0b21ha2UuLi4iKQpsb2NhbCBT ZWcgPSBTZWdzLlNlZ0xpc3RbImdyZXBfU09VUkNFUyJdCmxvY2FsIHQgPSBTZWcuUmF3VGV4 dAppZiBub3QgdDptYXRjaCgiIGNoYXJjbGFzcy5jIGZzYXRva2VuLmMgZnNhbGV4LmMgIgog ICAgICAgICAgICAgICAgICAgICAuLiAiZnNhcGFyc2UuYyBmc2FtdXN0cy5jIG1iY3NldHMu YyBkZmEtcHJsLmMgIikgdGhlbgogICB0ID0gdDpnc3ViKCJkZmEuYyAiLAogICAgICAiY2hh cmNsYXNzLmMgZnNhdG9rZW4uYyBmc2FsZXguYyAiCiAgICAgICAgICAgIC4uICJmc2FwYXJz ZS5jIGZzYW11c3RzLmMgbWJjc2V0cy5jIGRmYS1wcmwuYyAiKQoKICAgLS0gSXQgaXMgdmVy eSBCYWQgRm9ybSB0byBtb2RpZnkgdGhlIG9yaWdpbmFsIHJhdyBzZWdtZW50LCBidXQgd2Un cmUKICAgLS0gdGlyZWQgYXQgdGhpcyBwb2ludC4KICAgU2VnLlJhd1RleHQgPSB0CgogICAt LSBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIGZpbGU7IGFzc3VtZSBiYWNrdXAgbWFkZSBzZXBh cmF0ZWx5IChHaXQ/KQogICBXcml0ZUZpbGUobWFrZWZpbGVhbSkKZW5kCg== --------------090402070104080205090307-- From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 26 18:46:51 2014 Received: (at 19193) by debbugs.gnu.org; 26 Nov 2014 23:46:51 +0000 Received: from localhost ([127.0.0.1]:46719 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XtmIM-0000pS-VD for submit@debbugs.gnu.org; Wed, 26 Nov 2014 18:46:51 -0500 Received: from mail-yk0-f173.google.com ([209.85.160.173]:34687) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XtmIK-0000pI-Dv for 19193@debbugs.gnu.org; Wed, 26 Nov 2014 18:46:49 -0500 Received: by mail-yk0-f173.google.com with SMTP id 19so1738870ykq.32 for <19193@debbugs.gnu.org>; Wed, 26 Nov 2014 15:46:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=5iEDYxvPT3pd9K1rlitzWKVongD5v6HP7Ya2fykHAUE=; b=uOOuiibAy+Kc4WDEtgveBMFMPwOOu0Jd818Vwum4yULTDmDIXi6Bo2pHazPyMp+9bN 5W1dzpQ6cWqRzfMEtaXHz88s0PsreK9XxQssL/OwkN0+5Me2jnZ+kGNfrxW6G6L6kWK6 xryOX7LfUYFQGSV9G3+yYOM8zu2PPdcnM4AWQERdknh0oOE80tGcXPOXM+ipX4ZDTyWn e9xr1Xni9cpLjGbI0ZKRHLUf/FDEHOhpYnpdhTE2kTkBd2HJ1lPwcKbhACRug1wovhGi pEciRy78rdjVkhZRcbf+c79fqQ3uiuMWNHwg5nNb7vOOwYqKnX4PcndB7ODeUUcRB+W5 vchQ== X-Received: by 10.170.90.68 with SMTP id h65mr12560673yka.94.1417045607951; Wed, 26 Nov 2014 15:46:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.170.157.9 with HTTP; Wed, 26 Nov 2014 15:46:27 -0800 (PST) In-Reply-To: <5475D7BC.2010909@grouse.com.au> References: <5475D7BC.2010909@grouse.com.au> From: Jim Meyering Date: Wed, 26 Nov 2014 15:46:27 -0800 X-Google-Sender-Auth: -i4YnR6hRomVjklG6_zLjNwks_c Message-ID: Subject: Re: bug#19193: Announcing "untangle" for Grep 2.21; R.I.P. Dad To: behoffski Content-Type: text/plain; charset=ISO-8859-1 X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 19193 Cc: 19193@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) On Wed, Nov 26, 2014 at 5:38 AM, behoffski wrote: > G'day, > > Congratulations to all on the GNU Grep 2.21 release. > > I'm continuing my attempt to do a "bottom-up" refactoring of the code to > make > it more modular, via the Lua script "untangle" that you've seen recently. > This email contains an updated version of the script, tracking the changes > to the sources (especially to dfa.c) since the last release. Thanks for your continuing effort to contribute, and sorry to hear about your dad. I like your idea (mentioned off-list) to pursue this in its own project, so it will be separate from GNU grep, at least until you can show significant performance gains. From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 11 19:24:16 2015 Received: (at 19193) by debbugs.gnu.org; 12 Feb 2015 00:24:16 +0000 Received: from localhost ([127.0.0.1]:40415 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YLhZn-0006AX-IJ for submit@debbugs.gnu.org; Wed, 11 Feb 2015 19:24:16 -0500 Received: from ipmail07.adl2.internode.on.net ([150.101.137.131]:24326) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YLhZk-0006AK-0w for 19193@debbugs.gnu.org; Wed, 11 Feb 2015 19:24:13 -0500 Received: from ppp121-45-48-63.lns20.adl2.internode.on.net (HELO [192.168.178.20]) ([121.45.48.63]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Feb 2015 10:53:44 +1030 Message-ID: <54DBF282.6050800@grouse.com.au> Date: Thu, 12 Feb 2015 10:53:30 +1030 From: sur-behoffski User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: 19193@debbugs.gnu.org Subject: Re: bug#19193: Announcing "untangle" for Grep 2.21; R.I.P. Dad References: <5475D7BC.2010909@grouse.com.au> In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 19193 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) On 11/27/14 10:16, Jim Meyering wrote: > On Wed, Nov 26, 2014 at 5:38 AM, behoffski wrote: >> G'day, >> >> Congratulations to all on the GNU Grep 2.21 release. >> >> I'm continuing my attempt to do a "bottom-up" refactoring of the code to >> make >> it more modular, via the Lua script "untangle" that you've seen recently. >> This email contains an updated version of the script, tracking the changes >> to the sources (especially to dfa.c) since the last release. > > Thanks for your continuing effort to contribute, and sorry to hear > about your dad. > > I like your idea (mentioned off-list) to pursue this in its own project, > so it will be separate from GNU grep, at least until you can > show significant performance gains. > G'day Jim (replying via bug-grep list), Done (finally). See "hstbm", which is sometimes two or even three times faster than GNU Grep 2.21 on my machine (amd64, Gentoo GNU/Linux) for selected search patterns: > The Savannah folks have kindly agreed to host hstbm as a non-GNU > project at: > > https://savannah.nongnu.org/projects/hstbm > > The release can be downloaded as a separate tarball from: > > http://git.savannah.gnu.org/cgit/hstbm.git/snapshot/hstbm-0.13.tar.gz > > Git users probably want to clone the repository instead; the > latest sources (which may include changes after the 0.13 release) > can be retrieved via "git clone": > > git clone git://git.savannah.nongnu.org/hst cheers, sur-behoffski (Brenton Hoff) Programmer, Grouse Software From debbugs-submit-bounces@debbugs.gnu.org Sat May 30 16:04:40 2015 Received: (at control) by debbugs.gnu.org; 30 May 2015 20:04:41 +0000 Received: from localhost ([127.0.0.1]:33783 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Yymzo-0007X7-Fr for submit@debbugs.gnu.org; Sat, 30 May 2015 16:04:40 -0400 Received: from smtp.cs.ucla.edu ([131.179.128.62]:53645) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Yymzm-0007Wi-MZ for control@debbugs.gnu.org; Sat, 30 May 2015 16:04:39 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id 3C93E39E801B for ; Sat, 30 May 2015 13:04:33 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9SwSbBss7Jia for ; Sat, 30 May 2015 13:04:32 -0700 (PDT) Received: from [192.168.1.9] (pool-100-32-155-148.lsanca.fios.verizon.net [100.32.155.148]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 4CC9C39E8016 for ; Sat, 30 May 2015 13:04:32 -0700 (PDT) Message-ID: <556A17D0.4000303@cs.ucla.edu> Date: Sat, 30 May 2015 13:04:32 -0700 From: Paul Eggert Organization: UCLA Computer Science Department User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: control@debbugs.gnu.org Subject: grep bug maintainance Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) tag 20605 notabug close 20605 severity 20657 wishlist tag 20638 notabug close 20638 merge 20526 19985 19230 tag 19837 notabug close 19837 merge 16444 19777 close 19563 close 19486 tag 19330 notabug close 19330 tag 19193 notabug close 19193 tag 19071 notabug close 19071 tag 19005 notabug close 19005 close 19000 tag 18888 notabug close 18888 From unknown Mon Jun 23 16:45:03 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sun, 28 Jun 2015 11:24:07 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator