From mboxrd@z Thu Jan 1 00:00:00 1970 From: pnobili@cgg.com To: gcc-gnats@gcc.gnu.org Subject: c++/3222: Template instanciation problem, snapshot 20010611 Date: Mon, 18 Jun 2001 03:26:00 -0000 Message-id: <20010618102038.15441.qmail@sourceware.cygnus.com> X-SW-Source: 2001-06/msg00729.html List-Id: >Number: 3222 >Category: c++ >Synopsis: Template instanciation problem, snapshot 20010611 >Confidential: no >Severity: critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Jun 18 03:26:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Philippe Nobili >Release: gcc version 3.0 20010611 (prerelease) >Organization: >Environment: i686-pc-linux-gnu >Description: Snapshot 20010611 does not instanciate templates properly. Works fine with snapshot 20000911. Same problem on AIX systems (AIX 4.3.3). PR (2887) has been closed, but the problem remains. >How-To-Repeat: g++ -c -frepo tryg++.cc g++ tryg++.o ==> Unable to link correctly. >Fix: None >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="tryg++.cc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="tryg++.cc" LyogJElkJCAqLwoKI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+ CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxzdGFjaz4K I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZCA7Cgp0eXBlZGVmIGZsb2F0 IFNwQ29vcmQgOwoKY2xhc3MgUG9pbnQgewoKcHVibGljIDoKCiAgUG9pbnQoKSB7IHhfID0gMCwg eV8gPSAwLCB6XyA9IDAgOyB9CiAgUG9pbnQoU3BDb29yZCB4LFNwQ29vcmQgeSxTcENvb3JkIHop IHsgeF8gPSB4LCB5XyA9IHksIHpfID0geiA7IH0KICBQb2ludChjb25zdCBQb2ludCYgcHQpIHsg eF8gPSBwdC54XywgeV8gPSBwdC55Xywgel8gPSBwdC56XyA7IH0KICBQb2ludCYgb3BlcmF0b3Ig PShjb25zdCBQb2ludCYgcHQpIHsKICAgIGlmKCAmcHQgIT0gdGhpcyApIHsKICAgICAgeF8gPSBw dC54XywgeV8gPSBwdC55Xywgel8gPSBwdC56XyA7CiAgICB9CiAgICByZXR1cm4gKnRoaXMgOwog IH0KICB+UG9pbnQoKSB7fQoKICBib29sIG9wZXJhdG9yID09IChjb25zdCBQb2ludCYgcHQpIGNv bnN0IHsKICAgIHJldHVybiB4XyA9PSBwdC54XyAmJiB5XyA9PSBwdC55XyAmJiB6XyA9PSBwdC56 XyA7CiAgfQoKICBTcENvb3JkIHgoKSBjb25zdCB7IHJldHVybiB4XyA7IH0KICBTcENvb3JkIHko KSBjb25zdCB7IHJldHVybiB5XyA7IH0KICBTcENvb3JkIHooKSBjb25zdCB7IHJldHVybiB6XyA7 IH0KCiAgdm9pZCB4KFNwQ29vcmQgeCkgeyB4XyA9IHggOyB9CiAgdm9pZCB5KFNwQ29vcmQgeSkg eyB5XyA9IHkgOyB9CiAgdm9pZCB6KFNwQ29vcmQgeikgeyB6XyA9IHogOyB9Cgpwcml2YXRlIDoK CiAgU3BDb29yZCB4Xyx5Xyx6XyA7Cn0gOwoKY2xhc3MgUG9pbnRzIHsKCnB1YmxpYyA6CgogIFBv aW50cyAoaW50IHNpemUpIDogcG9pbnRzXyhzaXplKSB7fQogIH5Qb2ludHMoKSB7fQoKICB2b2lk IHB1c2hQb2ludChjb25zdCBQb2ludCYgcHQpIHsKICAgIHBvaW50c19bcG9pbnRzXy5zaXplKCld ID0gcHQgOwogIH0KICB2b2lkIGFkZFBvaW50QXQoY29uc3QgUG9pbnQmIHB0LGludCBwb3MpIHsK ICAgIHBvaW50c19bcG9zXSA9IHB0IDsKICB9CiAgY29uc3QgUG9pbnQmIGdldFBvaW50KGludCBw aWQpIGNvbnN0IHsKICAgIHJldHVybiBwb2ludHNfW3BpZF0gOwogIH0KCnByaXZhdGUgOgoKICBz dGQ6OnZlY3RvcjxQb2ludD4gcG9pbnRzXyA7Cn0gOwoKY2xhc3MgVmVjdG9yIHsKCnB1YmxpYyA6 CgogIFZlY3RvcigpIHsgeF8gPSAwLCB5XyA9IDAsIHpfID0gMCA7IH0KICBWZWN0b3IoU3BDb29y ZCB4LFNwQ29vcmQgeSxTcENvb3JkIHopIHsgeF8gPSB4LCB5XyA9IHksIHpfID0geiA7IH0KICBW ZWN0b3IoY29uc3QgVmVjdG9yJiB2KSB7IHhfID0gdi54XywgeV8gPSB2LnlfLCB6XyA9IHYuel8g OyB9CiAgVmVjdG9yKGNvbnN0IFBvaW50JiBvcmcsY29uc3QgUG9pbnQmIGV4dCkgewogICAgeF8g PSBleHQueCgpIC0gb3JnLngoKSA7CiAgICB5XyA9IGV4dC55KCkgLSBvcmcueSgpIDsKICAgIHpf ID0gZXh0LnooKSAtIG9yZy56KCkgOwogIH0KICBWZWN0b3IoY29uc3QgUG9pbnQmIGV4dCkgeyB4 XyA9IGV4dC54KCkgOyB5XyA9IGV4dC55KCkgOyB6XyA9IGV4dC56KCkgOyB9CiAgVmVjdG9yJiBv cGVyYXRvciA9KGNvbnN0IFZlY3RvciYgdikgewogICAgaWYoICZ2ICE9IHRoaXMgKSB7IHhfID0g di54XyA7IHlfID0gdi55XyA7IHpfID0gdi56XyA7IH0KICAgIHJldHVybiAqdGhpcyA7CiAgfQoK ICBWZWN0b3Igb3BlcmF0b3IgXihjb25zdCBWZWN0b3ImIHYpIGNvbnN0IHsKICAgIHJldHVybiBW ZWN0b3IoKHlfKnYuel8gLSB5Xyp6XyksKHpfKnYueF8gLSB2LnpfKnhfKSwoeF8qdi55XyAtIHYu eF8qeV8pKSA7CiAgfQogIFNwQ29vcmQgb3BlcmF0b3IgKihjb25zdCBWZWN0b3ImIHYpIGNvbnN0 IHsKICAgIHJldHVybiB4Xyp2LnhfICsgeV8qdi55XyArIHpfKnYuel8gOwogIH0KICBTcENvb3Jk ICB4KCkgY29uc3QgeyByZXR1cm4geF8gOyB9CiAgU3BDb29yZCAgeSgpIGNvbnN0IHsgcmV0dXJu IHlfIDsgfQogIFNwQ29vcmQgIHooKSBjb25zdCB7IHJldHVybiB6XyA7IH0KCiAgU3BDb29yZCYg eCgpIHsgcmV0dXJuIHhfIDsgfQogIFNwQ29vcmQmIHkoKSB7IHJldHVybiB5XyA7IH0KICBTcENv b3JkJiB6KCkgeyByZXR1cm4gel8gOyB9CgogIFNwQ29vcmQgc3Fub3JtKCkgY29uc3QgeyByZXR1 cm4geF8qeF8gKyB5Xyp5XyArIHpfKnpfIDsgfQoKcHJpdmF0ZSA6CgogIFNwQ29vcmQgeF8sIHlf LCB6XyA7Cn0gOwoKLy8vIE51bWVyZXJlZCBUTkFwZXguCi8qKgogIEluZGV4ZWQgYXBleCBmcm9t IDxpPjE8L2k+IHRvIDxpPm48L2k+LgogICovCmNsYXNzIFROQXBleCB7CgpwdWJsaWMgOgoKICAv KiogQ29uc3RydWN0b3IKICAgIEJ1aWxkcyB0aGUgYXBleCBudW1iZXJlZCA8aT5udW1fYXBleDwv aT4uCiAgICBAcGFyYW0gbnVtX2luZGV4IFRoZSBpbmRleCBvZiB0aGUgYXBleCBiZWluZyBidWls dC4KICAgICovCiAgVE5BcGV4IChpbnQgbnVtX2FwZXgpIHsgYXBleElkXyA9IG51bV9hcGV4IDsg fQogIH5UTkFwZXgoKSB7fQoKICAvKioKICAgIEdldHMgdGhlIGFwZXgncyBpbmRleC4KICAgIEBy ZXR1cm4gQW4gaW50ZWdlciBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA8Yj4xPC9iPi4KICAgICov CiAgaW50IGdldEFwZXhJZCgpIGNvbnN0IHsgcmV0dXJuIGFwZXhJZF8gOyB9Cgpwcml2YXRlIDoK CiAgaW50IGFwZXhJZF8gOwp9IDsKCi8vLyBFZGdlIHdpdGggYHdpbmdzJwovKioKICBUaGlzIGNs YXNzIGlzIHVzZWQgdG8gbW9kZWwgdGhlIGVkZ2Ugc2hhcmVkIGJ5IHR3byBhZGphY2VudCBjZWxs cy4KICBBbnkgZWRnZSBrbm93cyBhYm91dCB0aGUgdHdvIGNlbGxzIHRoYXQgc2hhcmUgaXQuCiAg Ki8KCmNsYXNzIFROQ2VsbCA7CgpjbGFzcyBUTkVkZ2UgewoKcHVibGljIDoKCiAgLyoqIENvbnN0 cnVjdG9yLgogICAgQnVpbGRzIGFuIGVkZ2UuIFRoZSBpbmRleCBpcyBhbiBpbnRlZ2VyID49IDxi PjE8L2I+LgogICAgKi8gICAKICBUTkVkZ2UoaW50IG51bV9hcmV0ZSkgeyBlZGdlSWRfID0gbnVt X2FyZXRlIDsgfQogIH5UTkVkZ2UoKSB7fQoKICAvKioKICAgIENvbm5lY3RzIHR3byBhcGljZXMg d2l0aGluIHRoaXMgZWRnZS4gVGhlIG9yZGVyaW5nIG9mIHRoZSB0d28gYXBpY2VzCiAgICBoYXMg bm8gaW1wb3J0YW5jZSBoZXJlLgogICAgQHBhcmFtIGExIFRoZSBmaXJzdCBhcGV4LgogICAgQHBh cmFtIGEyIFRoZSBzZWNvbmQgb25lLgogICAgKi8KICB2b2lkIGNvbm5lY3RBcGljZXMoVE5BcGV4 ICphMSxUTkFwZXggKmEyKSB7CiAgICBhcGljZXNfWzBdID0gYTEgOwogICAgYXBpY2VzX1sxXSA9 IGEyIDsKICB9CiAgLyoqCiAgICBSZXR1cm5zIG9uZSBvZiB0aGUgY2VsbHMgdGhhdCBzaGFyZSB0 aGlzIGVkZ2UuCiAgICBAcGFyYW0gd2luZyBlaXRoZXIgPGI+MDwvYj4gb3IgPGI+MTwvYj4uCiAg ICBAcmV0dXJuIEEgY29uc3QgcG9pbnRlciB0byB0aGUgY2VsbCBvciAwIGlmIHRoZSBlZGdlIGlz IG9uIGEgYm91bmRhcnkuCiAgICAqLwogIGNvbnN0IFROQ2VsbCogZ2V0V2luZyhpbnQgd2luZykg Y29uc3QgewogICAgcmV0dXJuIHdpbmdzX1t3aW5nXSA7CiAgfQogIC8qKgogICAgUmV0dXJucyBh biBhcGV4IG9mIHRoaXMgZWRnZS4KICAgIEBwYXJhbSBhcGV4IGVpdGhlciA8Yj4wPC9iPiBvciA8 Yj4xPC9iPi4KICAgIEByZXR1cm4gQSBjb25zdCBwb2ludGVyIHRvIHRoZSBhcGV4LgogICovCiAg Y29uc3QgVE5BcGV4KiBnZXRBcGV4KGludCBhcGV4KSBjb25zdCB7CiAgICByZXR1cm4gYXBpY2Vz X1thcGV4XSA7CiAgfQogIC8qKgogICAgU2V0cyBvbmUgb2YgdGhlIHR3byA8aW0+d2luZ3M8L2lt PiBvZiB0aGlzIGVkZ2UuCiAgICBAcGFyYW0gd2luZyBlaXRoZXIgPGI+MDwvYj4gb3IgPGI+MTwv Yj4uCiAgICBAcGFyYW0gdHIgVGhlIGNlbGwgb24gdGhpcyBzaWRlIG9mIHRoZSBlZ2RlLgogICAg Ki8KICB2b2lkIHNldFdpbmcoaW50IHdpbmcsVE5DZWxsKiB0cikgewogICAgd2luZ3NfW3dpbmdd ID0gdHIgOwogIH0KICAvKioKICAgIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgZWRnZS4KICAgIEBy ZXR1cm4gQW4gaW50ZWdlciA+PSA8Yj4xPC9iPi4KICAgICovCiAgaW50IGdldEVkZ2VJZCgpIGNv bnN0IHsgcmV0dXJuIGVkZ2VJZF8gOyB9CiAgCnByaXZhdGUgOgoKICBpbnQgICAgIGVkZ2VJZF8g ICAgOwogIFROQXBleCAqYXBpY2VzX1syXSA7CiAgVE5DZWxsICp3aW5nc18gWzJdIDsKfSA7Cgov Ly8gVHJpYW5ndWxhciBjZWxsLgovKioKICBBbnkgPGI+VE5DZWxsPC9iPiBtYWludGFpbnMgaXRz IGNvbm5lY3Rpdml0eSB0byBhZGphY2VudCBjZWxscy4gSXQgaGFzIDMKICA8ZW0+YXBpY2VzPC9l bT4gYW5kIDMgPGVtPmVkZ2VzPC9lbT4uIFRoZSBlZGdlcyBhcmUgb3JkZXJlZCBjbG9jay13aXNl IGFuZAogIGFwZXggPGI+azwvYj4gZmFjZXMgZWRnZSA8Yj5rPC9iPiwgd2ljaCBncmVhdGx5IHNp bXBsaWZpZXMgdGhlIHN0cnVjdHVyZQogIHRyYXZlcnNhbC4KICAqLwpjbGFzcyBUTkNlbGwgewoK cHVibGljIDoKCiAgLyoqIENvbnN0cnVjdG9yLgogICAgQnVpbGRzIGFuIGluc3RhbmNlIGZyb20g aXRzIGluZGV4LgogICAgKi8KICBUTkNlbGwoaW50IHRyaWFuZ2xlSWQpIHsgdHJpYW5nbGVJZF8g PSB0cmlhbmdsZUlkIDsgfQogIC8qKiBEZXN0cnVjdG9yLgogICAqLwogIH5UTkNlbGwoKSB7fQog IC8qKiBHZXR0aW5nIHRoZSBjZWxsJ3MgaWRlbnRpZmljYXRvci4KICAgIFRoaXMgbWV0aG9kIHJl dHVybnMgdGhlIGNlbGwncyBpZC4KICAgIEByZXR1cm4gQW4gaW50ZWdlciA+PSA8Yj4xPC9iPi4K ICAgICovCiAgaW50IGdldENlbGxJZCgpIGNvbnN0IHsgcmV0dXJuIHRyaWFuZ2xlSWRfIDsgfQog IC8qKiBDb25uZWN0aW5nIGFwaWNlcy4KICAgIENvbm5lY3RzIGFwaWNlcyA8Yj5wMTwvYj4sIDxi PnAyPC9iPiBhbmQgPGI+cDM8L2I+LgogICAgQHBhcmFtIHAxLHAyLHAzIFRoZSBhcGljZXMgdG8g YmUgY29ubmVjdGVkLgogICAgKi8KICB2b2lkIGNvbm5lY3RBcGljZXMoVE5BcGV4ICpwMSxUTkFw ZXggKnAyLFROQXBleCAqcDMpIHsKCiAgICBhcGljZXNfWzBdID0gcDEgOwogICAgYXBpY2VzX1sx XSA9IHAyIDsKICAgIGFwaWNlc19bMl0gPSBwMyA7CiAgfQogIC8qKiBDb25lY3RpbmcgZWRnZXMu CiAgICBDb25uZWN0cyBlZGdlcyA8Yj5hMTwvYj4sIDxiPmEyPC9iPiBhbmQgPGI+YTM8L2I+LiBU aGUgYXBpY2VzIGFyZQogICAgaW50ZXJuYWxseSByZWFycmFuZ2VkIHRvIGluc3VyZSB0aGUgZ2xv YmFsIGluZGV4aW5nIGlzIHJlc3BlY3RlZC4KICAgIEBwYXJhbSBhMSxhMixhMyBUaGUgZWRnZXMg dG8gYmUgY29ubmVjdGVkLgogICAgKi8KICBib29sIGNvbm5lY3RFZGdlcyhUTkVkZ2UgKmExLFRO RWRnZSAqYTIsVE5FZGdlICphMykgewoKICAgIGVkZ2VzX1swXSA9IGExIDsKICAgIGVkZ2VzX1sx XSA9IGEyIDsKICAgIGVkZ2VzX1syXSA9IGEzIDsKCiAgICAvLyBpbnRlcm5hbCByZWFycmFuZ2lu ZyBvZiBhcGljZXMuIEFwZXggbnVtYmVyIGkgbXVzdCBmYWNlIGVkZ2UgbnVtYmVyIGkuCiAgICAK ICAgIFROQXBleCAqbmV3QXBpY2VzWzNdIDsKICAgIG5ld0FwaWNlc1swXSA9IG5ld0FwaWNlc1sx XSA9IG5ld0FwaWNlc1syXSA9IDAgOwogICAgCiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IDMgOyBp KyspIHsKICAgICAgZm9yKGludCBrID0gMCA7IGsgPCAzIDsgaysrKSB7CglpZiggZWRnZXNfW2ld LT5nZXRBcGV4KDApICE9IGFwaWNlc19ba10gJiYKCSAgICBlZGdlc19baV0tPmdldEFwZXgoMSkg IT0gYXBpY2VzX1trXSApIHsKCSAgCgkgIG5ld0FwaWNlc1tpXSA9IGFwaWNlc19ba10gOwoJICBi cmVhayA7Cgl9CiAgICAgIH0KICAgIH0KICAgIGFwaWNlc19bMF0gPSBuZXdBcGljZXNbMF0gOwog ICAgYXBpY2VzX1sxXSA9IG5ld0FwaWNlc1sxXSA7CiAgICBhcGljZXNfWzJdID0gbmV3QXBpY2Vz WzJdIDsKICB9CiAgLyoqIFNldHRpbmcgdGhlIG5laWdoYm91cnMuCiAgICBTZXRzIHRoZSBuLXRo IGNlbGwncyBuZWlnaGJvdXIuIENlbGwgPGltPm48L2ltPiBpcyB0aGUgY2VsbCBvcHBvc2l0ZQog ICAgdG8gYXBleCA8aW0+bjwvaW0+LgogICAgQHBhcmFtIG4gPGI+MDwvYj4sIDxiPjE8L2I+IG9y IDxiPjI8L2I+LgogICAgQHBhcmFtIGMgVGhlIGNlbGwuCiAgICAqLwogIHZvaWQgc2V0TmVpZ2hi b3VyKGludCBuLFROQ2VsbCogYykgewogICAgaWYoIG4gPj0gMCAmJiBuIDw9IDIgKSBuZWlnaGJv dXJzX1tuXSA9IGMgOwogIH0KICAvKiogR2V0dGluZyB0aGUgbi10aCBuZWlnaGJvdXIuCiAgICBS ZXR1cm5zIHRoZSBuLXRoIG5laWdoYm91ciBjZWxsLgogICAgQHBhcmFtIG4gPGI+MDwvYj4sIDxi PjE8L2I+IG9yIDxiPjM8L2I+LgogICAgQHJldHVybiBUaGUgbmVpZ2hib3VyIGNlbGwgb3IgMCBp ZiBub25lLgogICAgKi8KICBUTkNlbGwqIGdldE5laWdoYm91cihpbnQgbikgY29uc3QgewogICAg cmV0dXJuIChuID49IDAgJiYgbiA8PSAyKSA/IG5laWdoYm91cnNfW25dIDogMCA7CiAgfQogIC8q KiBBcGV4IGZhY2luZyBlZGdlLgogICAgUmV0dXJucyB0aGUgYXBleCBmYWNpbmcgZWRnZSA8ZW0+ ZTwvZW0+LgogICAgQHBhcmFtIGUgVGhlIGVkZ2UuCiAgICBAcmV0dXJuIEEgcG9pbnRlciB0byB0 aGUgYXBleCBmYWNpbmcgPGVtPmU8L2VtPi4KICAgICovCiAgY29uc3QgVE5BcGV4KiBhcGV4RmFj aW5nRWRnZShjb25zdCBUTkVkZ2UqIGUpIGNvbnN0IHsKCiAgICBpbnQgbG9jYWxFZGdlID0gLTEg OwogICAgaWYgICAgICggZSA9PSBlZGdlc19bMF0gKSBsb2NhbEVkZ2UgPSAwIDsKICAgIGVsc2Ug aWYoIGUgPT0gZWRnZXNfWzFdICkgbG9jYWxFZGdlID0gMSA7CiAgICBlbHNlIGlmKCBlID09IGVk Z2VzX1syXSApIGxvY2FsRWRnZSA9IDIgOwogICAgcmV0dXJuIChsb2NhbEVkZ2UgIT0gLTEpID8g YXBleEZhY2luZ0VkZ2UobG9jYWxFZGdlKSA6IDA7CiAgfQogIC8qKiBBcGV4IGZhY2luZyBlZGdl IG51bWJlci4KICAgIFJldHVybnMgdGhlIGFwZXggZmFjaW5nIGVkZ2UgPGVtPkxvY2FsVE5FZGdl PC9lbT4uCiAgICBAcGFyYW0gbG9jYWxUTkVkZ2UgPGI+MDwvYj4sIDxiPjE8L2I+IG9yIDxiPjI8 L2I+LgogICAgQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIGFwZXguCiAgICAqLwogIGNvbnN0IFRO QXBleCogYXBleEZhY2luZ0VkZ2UoaW50IGxvY2FsRWRnZSkgY29uc3QgewogICAgcmV0dXJuIChs b2NhbEVkZ2UgPj0gMCAmJiBsb2NhbEVkZ2UgPD0gMikgPyBhcGljZXNfW2xvY2FsRWRnZV0gOiAw OwogIH0KICAvKiogR2V0dGluZyB0aGUgbG9jYWxBcGV4LXRoIGFwZXguCiAgICBSZXR1cm5zIGFw ZXggbnVtYmVyIDxlbT5sb2NhbFROQXBleDwvZW0+LgogICAgQHBhcmFtIGxvY2FsVE5BcGV4IDxi PjA8L2I+LCA8Yj4xPC9iPiBvciA8Yj4yPC9iPi4KICAgIEByZXR1cm4gQSBwb2ludGVyIHRvIHRo ZSBhcGV4LgogICAgKi8KICBUTkFwZXgqIGdldEFwZXgoaW50IGxvY2FsQXBleCkgY29uc3Qgewog ICAgcmV0dXJuIChsb2NhbEFwZXggPj0gMCAmJiBsb2NhbEFwZXggPD0gMikgPyBhcGljZXNfW2xv Y2FsQXBleF0gOiAwOwogIH0KICAvKiogR2V0dGluZyB0aGUgbG9jYWxFZGdlLXRoIGVkZ2UuCiAg ICBSZXR1cm5zIGVkZ2UgbnVtYmVyIDxlbT5sb2NhbFRORWRnZTwvZW0+LgogICAgQHBhcmFtIGxv Y2FsRWRnZSA8Yj4wPC9iPiwgPGI+MTwvYj4gb3IgPGI+MjwvYj4uCiAgICBAcmV0dXJuIEEgcG9p bnRlciB0byB0aGUgZWRnZS4KICAgICovCiAgVE5FZGdlKiBnZXRFZGdlKGludCBsb2NhbEVkZ2Up IGNvbnN0IHsKICAgIHJldHVybiAobG9jYWxFZGdlID49IDAgJiYgbG9jYWxFZGdlIDw9IDIpID8g ZWRnZXNfW2xvY2FsRWRnZV0gOiAwIDsKICB9Cgpwcml2YXRlIDoKCiAgaW50ICAgICAgIHRyaWFu Z2xlSWRfICAgIDsKICBUTkVkZ2UgICAgICplZGdlc18gICAgIFszXSA7CiAgVE5BcGV4ICAgICAq YXBpY2VzXyAgICBbM10gOwogIFROQ2VsbCAqbmVpZ2hib3Vyc19bM10gOwp9IDsKCi8vLyBUTkNh bnZhcwovKioKICBUaGlzIGNsYXNzIGFpbXMgYXQgZGVzY3JpYmluZyB0aGUgZ3JpZCB1c2VkIGZv ciBidWlsZGluZwogIHRoZSBpbml0aWFsIHRyaWFuZ3VsYXRlZCBuZXR3b3JrLiBJdCBnaXZlcyB0 aGUgZ3JpZCdzIGRpbWVuc2lvbnMKICBhcyB3ZWxsIGFzIHRoZSBwb3NpdGlvbiBvZiBub24tdmFs dWVkIGFwaWNlcy4KICAqLwpjbGFzcyBUTkNhbnZhcyB7CgpwdWJsaWMgOgoKICAvKiogQ29uc3Ry dWN0b3IuCiAgICBCdWlsZHMgYW4gZW1wdHkgQ2FudmFzIDxiPm54PC9iPiBieSA8Yj5ueTwvYj4g Y2VsbHMuIFRoZSBjYW52YXMgaXMgYWxzbwogICAgcmVzcG9uc2libGUgZm9yIHN0b3JpbmcgdGhl IHBvc2l0aW9uIG9mIG5vbi12YWx1ZWQgYXBpY2VzLgogICAgQHBhcmFtIG54LG55IFRoZSBudW1i ZXIgb2YgY2VsbHMgb24gYm90aCB4IGFuZCB5IGF4aXMuCiAgICAqLwogIFROQ2FudmFzIChpbnQg bngsaW50IG55KSA7CiAgLy8vIENvcHkgY29uc3RydWN0b3IuCiAgVE5DYW52YXMgKGNvbnN0IFRO Q2FudmFzJiBjYW52YXMpIDsKICB+VE5DYW52YXMoKSA7CgogIC8vLyBBc3NpZ25tZW50IG9wZXJh dG9yLgogIFROQ2FudmFzJiBvcGVyYXRvciA9KGNvbnN0IFROQ2FudmFzJikgOwoKICAvKiogU2lt cGxlIGNoZWNraW5nLgogICAgQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgY2FudmFzLiBBIGNh bnZhcyBpcyB2YWxpZCBpZiB0aGUgbnVtYmVyCiAgICBvZiBjZWxscyBvbiBlYWNoIGF4aXMgaXMg YXQgbGVhc3QgPGI+MTwvYj4uCiAgICBAcmV0dXJuIDxiPnRydWU8L2I+IG9yIDxiPmZhbHNlPC9i Pi4KICAgICovCiAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgewogICAgcmV0dXJuIG54XyA+PSAxICYm IG55XyA+PSAxIDsKICB9CiAgLyoqIEdldHRpbmcgdGhlIG51bWJlciBvZiBub2Rlcy4KICAgIFJl dHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBvZiB0aGUgZ3JpZC4KICAgIEByZXR1cm4gVU4gaW50 ZWdlciBlcXVhbCB0byA8ZW0+KG54KzEpKihueSsxKTwvZW0+LgogICAgKi8KICBpbnQgbmJQb2lu dHMoKSBjb25zdCB7IHJldHVybiAobnhfKzEpKihueV8rMSkgOyB9CgogIC8vLyBHZXR0aW5nIHRo ZSBudW1iZXIgb2YgY2VsbHMuCiAgLy9AewogIC8vLyBBbG9uZyB4IGF4aXMuCiAgaW50IGdldE54 KCkgY29uc3QgeyByZXR1cm4gbnhfIDsgfQogIC8vLyBBbG9uZyB5IGF4aXMuCiAgaW50IGdldE55 KCkgY29uc3QgeyByZXR1cm4gbnlfIDsgfQogIC8vQH0KICAKICAvLy8gTWFuYWdlbWVudCBvZiBu b24gdmFsdWVzLgogIC8vQHsKICAvLy8gRGVjbGFyZXMgYSBub24gdmFsdWVkIG5vZGUuCiAgLy8v IEBwYXJhbSBwb2ludElkIFRoZSBub2RlIGlkZW50aWZpY2F0b3IuCiAgdm9pZCBhZGROb25WYWx1 ZUF0KGludCBwb2ludElkKSB7CiAgICBub25WYWx1ZXNfLmluc2VydChwb2ludElkKSA7CiAgfQog IC8vLyBSZW1vdmVzIGEgbm9uIHZhbHVlZCBub2RlLgogIC8vLyBAcGFyYW0gcG9pbnRJZCBUaGUg bm9kZSBpZGVudGlmaWNhdG9yLgogIHZvaWQgcmVtTm9uVmFsdWVBdChpbnQgcG9pbnRJZCkgewog ICAgbm9uVmFsdWVzXy5lcmFzZShwb2ludElkKSA7CiAgfQogIC8vLyBSZXR1cm5zIHdoZXRoZXIg YSBub2RlIGlzIG5vbiB2YWx1ZWQuCiAgLy8vIEBwYXJhbSBwb2ludElkIFRoZSBub2RlIGlkZW50 aWZpY2F0b3IuCiAgYm9vbCBpc05vblZhbHVlZEF0KGludCBwb2ludElkKSBjb25zdCB7CiAgICBy ZXR1cm4gbm9uVmFsdWVzXy5maW5kKHBvaW50SWQpICE9IG5vblZhbHVlc18uZW5kKCkgOwogIH0K ICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgbm9kZSBpcyB2YWx1ZWQuCiAgLy8vIEBwYXJhbSBwb2lu dElkIFRoZSBub2RlIGlkZW50aWZpY2F0b3IuCiAgYm9vbCBpc1ZhbHVlZEF0KGludCBwb2ludElk KSBjb25zdCB7CiAgICByZXR1cm4gIWlzTm9uVmFsdWVkQXQocG9pbnRJZCkgOwogIH0KICAvL0B9 Cgpwcml2YXRlIDoKCiAgaW50IG54XywgbnlfIDsKICBTcENvb3JkIGR4XywgZHlfIDsKICBzZXQ8 aW50PiBub25WYWx1ZXNfIDsKfSA7CgovLy8gVHJpYW5ndWxhdGVkIG5ldHdvcmsuCi8qKgogIFZl cnkgc2ltcGxlIHRyaWFuZ3VsYXRlZCBuZXR3b3JrLiBJdCBpcyB1c2VkIGFzIGEgdG9wb2xvZ2lj YWwKICBiYXNpcyBmb3IgZXh0cmFjdGluZyB0cmlhbmd1bGF0ZWQgcGF0Y2hlcy4KICAqLwpjbGFz cyBUTmV0IHsKCnB1YmxpYyA6CgogIHR5cGVkZWYgdmVjdG9yPFROQ2VsbCo+OjppdGVyYXRvciBp dGVyYXRvciA7CiAgdHlwZWRlZiB2ZWN0b3I8VE5DZWxsKj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0 X2l0ZXJhdG9yICAgOwogIApwdWJsaWMgOgoKICAvLy8gQ29uc3RydWN0b3IuCiAgVE5ldCAoKSA7 CgogIC8qKiBEZXN0cnVjdG9yLgogICAgTGVzIGRlc3RydWN0ZXVyIGTpdHJ1aXQgdG91cyBsZXMg 6WxlbWVudHMgZHUgculzZWF1IChjZWxsdWxlcywgc29tbWV0cwogICAgZXQgYXLqdGVzLgogICAg Ki8KICB+VE5ldCgpIDsKCiAgLyoqCiAgICBBIHBhcnRpciBkJ3VuIGNhbmV2YXMsIGMnZXN0IOAg ZGlyZSBkZSBsYSBkb25u6WUgZCd1bmUgZ3JpbGxlIGV0IGRlCiAgICBub24gdmFsZXVycywgb24g Y29uc3RydWl0IGxlIHLpc2VhdSB0cmlhbmd1bOkuCiAgICBAcGFyYW0gY2FudmFzIExlIGNhbmV2 YXMgdXRpbGlz6SBwb3VyIGxhIGNvbnN0cnVjdGlvbgogICAgQHJldHVybiA8Yj50cnVlPC9iPiBv dSA8Yj5mYWxzZTwvYj4uCiAgICBAc2VlIFROQ2FudmFzCiAgICAqLwogIGJvb2wgIGJ1aWxkT24o Y29uc3QgVE5DYW52YXMqIGNhbnZhcykgOwoKICAvKioKICAgIFJldG91cm5lIGxlIGNhbmV2YXMg dXRpbGlz6SBwb3VyIGNvbnN0cnVpcmUgY2UgculzZWF1LgogICAgKi8KICBjb25zdCBUTkNhbnZh cyogIGdldENhbnZhcygpIGNvbnN0IHsgcmV0dXJuIGNhbnZhc18gOyB9CgogIC8vLyBJdGVyYXRl dXJzLgogIC8vLyBAewogIC8vLyBSZXRvdXJuZSB1biBpdGVyYXRldXIgZGUgY2VsbHVsZXMuCiAg aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0cmdsc18uYmVnaW4oKSA7IH0KICAvLy8gUmV0b3Vy bmUgdW4gcG9pbnRldXIgdmVycyBsYSBmaW4gZGUgbGEgbGlzdGUgZGUgY2VsbHVsZXMuCiAgaXRl cmF0b3IgZW5kICAoKSB7IHJldHVybiB0cmdsc18uZW5kICAoKSA7IH0KICAvLy8gUmV0b3VybmUg dW4gaXRlcmF0ZXVyIDxiPmNvbnN0YW50PC9iPiBkZSBjZWxsdWxlcy4KICBjb25zdF9pdGVyYXRv ciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHRyZ2xzXy5iZWdpbigpIDsgfQogIC8vLyBJZGVtLiBw b3VyIGxhIGZpbiBkZSBsYSBsaXN0ZS4KICBjb25zdF9pdGVyYXRvciBlbmQgICgpIGNvbnN0IHsg cmV0dXJuIHRyZ2xzXy5lbmQgICgpIDsgfQogIC8vLyBAfQoKcHJpdmF0ZSA6CgogIHZvaWQgY2xl YW5VcCgpIDsKICAKICB2b2lkIHNldENlbGxBdChUTkNlbGwgKnRyLGludCBwb3MpIHsKICAgIHRy Z2xzX1twb3NdID0gdHIgOwogIH0KICBUTkNlbGwqIGdldENlbGxBdChpbnQgcG9zKSBjb25zdCB7 CiAgICByZXR1cm4gdHJnbHNfW3Bvc10gOwogIH0KCnByaXZhdGUgOgoKICB2b2lkIHJlbW92ZUNl bGxzKGNvbnN0IHZlY3RvcjxUTkNlbGwqPiYgdHJnbHMpIDsgCiAgdm9pZCBidWlsZEFwaWNlcyh2 ZWN0b3I8VE5BcGV4Kj4mKSA7CiAgdm9pZCBidWlsZEVkZ2VzRnJvbUFwaWNlcyh2ZWN0b3I8VE5F ZGdlKj4mLGNvbnN0IHZlY3RvcjxUTkFwZXgqPiYpIDsKICB2b2lkIGJ1aWxkRnJvbUVkZ2VzQW5k QXBpY2VzKGNvbnN0IHZlY3RvcjxUTkVkZ2UqPiYsY29uc3QgdmVjdG9yPFROQXBleCo+JikgOwoK ICB2b2lkIGJ1aWxkTmV0d29yaygpIDsKICB2b2lkIGJ1aWxkRWRnZXNXaW5ncyhjb25zdCB2ZWN0 b3I8VE5FZGdlKj4mKSA7CgogIHZvaWQgYWNjb3VudHNGb3JOb25WYWx1ZXMoKSA7CgogIGJvb2wg bm9uVmFsdWVkQXBleChjb25zdCBUTkFwZXgqIGEpIGNvbnN0IHsKICAgIHJldHVybiBnZXRDYW52 YXMoKS0+aXNOb25WYWx1ZWRBdChhLT5nZXRBcGV4SWQoKSkgOwogIH0KCnByaXZhdGUgOgoKICBU TkNhbnZhcyAqY2FudmFzXyA7CiAgdmVjdG9yPFROQ2VsbCo+IHRyZ2xzXyA7Cn0gOwogIApUTkNh bnZhczo6VE5DYW52YXMoaW50IG54LGludCBueSkgewoKICBueF8gPSBueCA7CiAgbnlfID0gbnkg Owp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KClROQ2FudmFzOjpUTkNhbnZhcyhjb25zdCBUTkNh bnZhcyYgY2FudmFzKSB7CgogICp0aGlzID0gY2FudmFzIDsKfQovL19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCgpUTkNhbnZhcyYgVE5DYW52YXM6Om9wZXJhdG9yID0oY29uc3QgVE5DYW52YXMmIGNhbnZh cykgewoKICBpZiggdGhpcyAhPSAmY2FudmFzICkgewoKICAgIG54XyA9IGNhbnZhcy5ueF8gOwog ICAgbnlfICA9Y2FudmFzLm55XyA7CiAgICBkeF8gPSBjYW52YXMuZHhfIDsKICAgIGR5XyA9IGNh bnZhcy5keV8gOwogICAgbm9uVmFsdWVzXyA9IGNhbnZhcy5ub25WYWx1ZXNfIDsKICB9CiAgcmV0 dXJuICp0aGlzIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpUTkNhbnZhczo6flROQ2FudmFz KCkgewoKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KClROZXQ6OlROZXQoKSB7CgogIGNhbnZhc18g PSAwIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpUTmV0Ojp+VE5ldCgpIHsKCiAgY2xlYW5V cCgpIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgovLyBQdXJwb3NlIDogZGVsZWxlcyB0aGUg ZW50aXJlIHN0b3JhZ2UgKGFwaWNlcyxlZGdlcyAmIGNlbGxzKS4KCnZvaWQgVE5ldDo6Y2xlYW5V cCgpIHsKCiAgaWYoIGNhbnZhc18gKSB7CiAgICBkZWxldGUgY2FudmFzXyA7CiAgICBjYW52YXNf ID0gMCA7CiAgfQogIHJlbW92ZUNlbGxzKHRyZ2xzXykgOwp9Ci8vX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KCi8vIFB1cnBvc2UgOiBkZWxldGVzIHRoZSBjZWxscyBmcm9tIGB0cmdscycuIEFwaWNlcyAm IGVkZ2VzIGFyZSBhbHNvCi8vICAgICAgICAgICBkZWxldGVkLiBUaGlzIG1ldGhvZCBpcyBwcml2 YXRlLgoKdm9pZCBUTmV0OjpyZW1vdmVDZWxscyhjb25zdCBzdGQ6OnZlY3RvcjxUTkNlbGwqPiYg dHJnbHMpIHsKCiAgc3RkOjpzZXQ8VE5FZGdlKj4gZWRnZXNUb0RlbGV0ZSA7CiAgc3RkOjpzZXQ8 VE5BcGV4Kj4gYXBpY2VzVG9EZWxldGUgOwoKICBmb3Ioc3RkOjp2ZWN0b3I8VE5DZWxsKj46OmNv bnN0X2l0ZXJhdG9yIGkgPSB0cmdscy5iZWdpbigpIDsKICAgICAgaSAhPSB0cmdscy5lbmQoKSA7 CiAgICAgIGkrKykgewogICAgCiAgICBUTkNlbGwgKnQgPSAqaSA7CiAgICBlZGdlc1RvRGVsZXRl Lmluc2VydCAoY29uc3RfY2FzdDxUTkVkZ2UqPih0LT5nZXRFZGdlKDApKSkgOwogICAgZWRnZXNU b0RlbGV0ZS5pbnNlcnQgKGNvbnN0X2Nhc3Q8VE5FZGdlKj4odC0+Z2V0RWRnZSgxKSkpIDsKICAg IGVkZ2VzVG9EZWxldGUuaW5zZXJ0IChjb25zdF9jYXN0PFRORWRnZSo+KHQtPmdldEVkZ2UoMikp KSA7CiAgICBhcGljZXNUb0RlbGV0ZS5pbnNlcnQoY29uc3RfY2FzdDxUTkFwZXgqPih0LT5nZXRB cGV4KDApKSkgOwogICAgYXBpY2VzVG9EZWxldGUuaW5zZXJ0KGNvbnN0X2Nhc3Q8VE5BcGV4Kj4o dC0+Z2V0QXBleCgxKSkpIDsKICAgIGFwaWNlc1RvRGVsZXRlLmluc2VydChjb25zdF9jYXN0PFRO QXBleCo+KHQtPmdldEFwZXgoMikpKSA7CiAgICBkZWxldGUgdCA7CiAgfQogIGZvcihzdGQ6OnNl dDxUTkVkZ2UqPjo6aXRlcmF0b3IgaSA9IGVkZ2VzVG9EZWxldGUuYmVnaW4oKSA7CiAgICAgIGkg IT0gZWRnZXNUb0RlbGV0ZS5lbmQoKSA7CiAgICAgIGkrKykgewogICAgZGVsZXRlICppIDsKICB9 CiAgZm9yKHN0ZDo6c2V0PFROQXBleCo+OjppdGVyYXRvciBpID0gYXBpY2VzVG9EZWxldGUuYmVn aW4oKSA7CiAgICAgIGkgIT0gYXBpY2VzVG9EZWxldGUuZW5kKCkgOwogICAgICBpKyspIHsKICAg IGRlbGV0ZSAqaSA7CiAgfQp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKLy8KLy8gUHVycG9zZSA6 IGJ1aWxkcyB0aGUgaW50ZXJuYWwgdmVjdG9yIG9mIGFwaWNlcyBhbmQgcmV0dXJucyBpdCBpbnRv IGBhcGljZXMnLgovLyAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcHJpdmF0ZS4KCnZvaWQgVE5l dDo6YnVpbGRBcGljZXMoc3RkOjp2ZWN0b3I8VE5BcGV4Kj4mIGFwaWNlcykgewoKICBpbnQgbngg PSBnZXRDYW52YXMoKS0+Z2V0TngoKSA7CiAgaW50IG55ID0gZ2V0Q2FudmFzKCktPmdldE55KCkg OwoKICBhcGljZXMucmVzaXplKChueCsxKSoobnkrMSkpIDsKICAKICBmb3IoaW50IGogPSAwICA7 IGogPCAobnkrMSkgOyBqKyspIHsKICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IChueCsxKSA7IGkr KykgewogICAgICBUTkFwZXggKmFwZXggPSBuZXcgVE5BcGV4KGkraioobngrMSkrMSkgOwogICAg ICBhcGljZXNbaStqKihueCsxKV0gPSBhcGV4IDsKICAgIH0KICB9Cn0KLy9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwoKLy8KLy8gUHVycG9zZTogY29ubmVjdHMgYXBpY2VzIHRvIGJ1aWxkIGVkZ2VzLgoK dm9pZCBUTmV0OjpidWlsZEVkZ2VzRnJvbUFwaWNlcyhzdGQ6OnZlY3RvcjxUTkVkZ2UqPiYgZWRn ZXMsY29uc3Qgc3RkOjp2ZWN0b3I8VE5BcGV4Kj4mIGEpIHsKCiAgaW50IG54ID0gZ2V0Q2FudmFz KCktPmdldE54KCkgOwogIGludCBueSA9IGdldENhbnZhcygpLT5nZXROeSgpIDsKCiAgaW50IG5i VE5FZGdlcyA9ICAzKm54Km55K254K255OwogIGVkZ2VzLnJlc2l6ZShuYlRORWRnZXMpIDsKICBp bnQgc3ViMSAgICA9ICBueCoobnkrMSkgOwogIAogIGZvcihpbnQgaSA9IDAgOyBpIDwgc3ViMSA7 IGkrKykgeyAvLyBbMCxueF8qKG55XysxKVsKICAgCiAgICBUTkVkZ2UgKmUgID0gbmV3IFRORWRn ZShpKzEpIDsKICAgIGUtPmNvbm5lY3RBcGljZXMoYVtpICsgaW50KGkvbngpICAgIF0sCgkJICAg ICBhW2kgKyBpbnQoaS9ueCkgKyAxXSkgOwogICAgZWRnZXNbaV0gPSBlIDsKICB9CiAgaW50IG54 eSAgPSBueCpueSA7IAogIGludCBzdWIyID0gMipueHkrbngrbnkgOwoKICBmb3IoaW50IGkgPSBz dWIxIDsgaSA8IHN1YjIgOyBpKyspIHsgLy8gW254KihueSsxKSwyKm54Km55K254K255WwogICAg VE5FZGdlICplICA9IG5ldyBUTkVkZ2UoaSsxKSA7CiAgICBlLT5jb25uZWN0QXBpY2VzKGFbaSAg ICAtIHN1YjFdLAoJCSAgICAgYVtpICsgMSAtIG54eV0pIDsKICAgIGVkZ2VzW2ldID0gZSA7CiAg fQogIGZvcihpbnQgaSA9IHN1YjIgOyBpIDwgbmJUTkVkZ2VzIDsgaSsrKSB7IC8vIFsyKm54Xypu eV8rbnhfK255XywzKm54XypueV8rbnhfK255X1sKICAgIFRORWRnZSAqZSAgPSBuZXcgVE5FZGdl KGkrMSkgOwogICAgZS0+Y29ubmVjdEFwaWNlcyhhW2kgKyAxIC0yKm54eSAtbnggLW55ICsgaW50 KChpLTIqbnh5LW54LW55KS9ueCldLAoJCSAgICAgYVtpICsgMSAtMipueHkgLW55ICAgICArIGlu dCgoaS0yKm54eS1ueC1ueSkvbngpXSkgOwogICAgZWRnZXNbaV0gPSBlIDsKICB9Cn0KLy9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBidWlsZHMgdGhlIHRyaWFuZ3VsYXRlZCBu ZXR3b3JrIGZyb20gdGhlIGFwaWNlcyAmIGVkZ2VzLiBUaGlzCi8vICAgICAgICAgIG1ldGhvZHMg aGFuZGxlcyBkaWZmZXJlbnRseSBvZGQtIGFuZCBldmVuLSBudW1iZXJlZCBjZWxscy4KCnZvaWQg VE5ldDo6YnVpbGRGcm9tRWRnZXNBbmRBcGljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8VE5FZGdlKj4m IGUsY29uc3Qgc3RkOjp2ZWN0b3I8VE5BcGV4Kj4mIGEpIHsKICBpbnQgbnggPSBnZXRDYW52YXMo KS0+Z2V0TngoKSA7CiAgaW50IG55ID0gZ2V0Q2FudmFzKCktPmdldE55KCkgOwoKICBpbnQgbmJU TkNlbGxzID0gMipueCpueSAgOwogIHRyZ2xzXy5yZXNpemUobmJUTkNlbGxzKSA7CgogIGZvcihp bnQgaSA9IDAgOyBpIDwgbmJUTkNlbGxzIDsgaSArPSAyKSB7IC8vIE9kZCBudW1iZXJlZCB0cmlh bmdsZXMKCiAgICBpbnQgY2kgPSBpKzEgOwogICAgVE5DZWxsICp0cmdsID0gbmV3IFROQ2VsbChj aSkgOwogICAgc2V0Q2VsbEF0KHRyZ2wsaSkgOwoKICAgIHRyZ2wtPmNvbm5lY3RBcGljZXMoYVso Y2krMSkvMiAtIDEgICAgICArIGludChjaS8oMipueCkpXSwKCQkJYVsoY2krMSkvMiAgICAgKyBu eCArIGludChjaS8oMipueCkpXSwKCQkJYVsoY2krMSkvMiAgICAgICAgICArIGludChjaS8oMipu eCkpXSkgOwoKICAgIHRyZ2wtPmNvbm5lY3RFZGdlcyhlWyhjaSsxKS8yIC0gMSBdLAoJCSAgICAg ICBlWyhjaSsxKS8yIC0gMSArIG54KihueSsxKSAgICAgICAgICAgICsgaW50KGNpLygyKm54KSld LAoJCSAgICAgICBlWyhjaSsxKS8yIC0gMSArIG54KihueSsxKSArIG55KihueCsxKSAgICAgICAg ICAgICAgICBdKSA7CiAgfQogIGZvcihpbnQgaSA9IDEgOyBpIDwgbmJUTkNlbGxzIDsgaSArPSAy KSB7IC8vIEV2ZW4gbnVtYmVyZWQgdHJpYW5nbGVzCgogICAgaW50IGNpID0gaSsxIDsKICAgIFRO Q2VsbCAqdHJnbCA9IG5ldyBUTkNlbGwoY2kpIDsKICAgIHNldENlbGxBdCh0cmdsLGkpIDsKCiAg ICB0cmdsLT5jb25uZWN0QXBpY2VzKGFbY2kvMiAgICAgICAgICArIGludCgoY2ktMSkvKDIqbngp KV0sCgkJCWFbY2kvMiAgICAgKyBueCArIGludCgoY2ktMSkvKDIqbngpKV0sCgkJCWFbY2kvMiAr IDEgKyBueCArIGludCgoY2ktMSkvKDIqbngpKV0pIDsKCiAgICB0cmdsLT5jb25uZWN0RWRnZXMo ZVtjaS8yIC0gMSArIG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwK CQkgICAgICAgZVtjaS8yICAgICArIG54KihueSsxKSAgICAgICAgICAgICsgaW50KChjaS0xKS8o MipueCkpXSwKCQkgICAgICAgZVtjaS8yIC0gMSArIG54KihueSsxKSArIG55KihueCsxKSAgICAg ICAgICAgICAgICAgICAgXSkgOwogIH0KICBidWlsZEVkZ2VzV2luZ3MoZSkgOwogIGJ1aWxkTmV0 d29yaygpIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6IGVzdGFibGlz aGVzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gY2VsbHMuCgp2b2lkIFROZXQ6OmJ1aWxkTmV0d29y aygpIHsKCiAgaW50IG54ID0gZ2V0Q2FudmFzKCktPmdldE54KCkgOwogIGludCBueSA9IGdldENh bnZhcygpLT5nZXROeSgpIDsKICAKICBmb3IoaXRlcmF0b3IgaSA9IGJlZ2luKCkgOyBpICE9IGVu ZCgpIDsgaSsrKSB7CgogICAgVE5DZWxsICp0cmdsID0gKmkgOwogICBpbnQgVCA9IHRyZ2wtPmdl dENlbGxJZCgpIDsKCiAgIGJvb2wgaW5Eb21haW5bM10gOwogICBmb3IoaW50IGogPSAwIDsgaiA8 IDMgOyBqKyspIHsKICAgICBpZiggKFQlMiAgICAgID09IDEgJiYgVCA8PSAyKm54ICAgICAgICYm IGogPT0gMCApIHx8CgkgKFQlKDIqbngpID09IDEgICAgICAgICAgICAgICAgICAgICYmIGogPT0g MSApIHx8CgkgKFQlKDIqbngpID09IDAgICAgICAgICAgICAgICAgICAgICYmIGogPT0gMSApIHx8 CgkgKFQlMiAgICAgID09IDAgJiYgVCA+IDIqbngqKG55LTEpICYmIGogPT0gMCkpIHsKICAgICAg IGluRG9tYWluW2pdID0gZmFsc2UgOwogICAgIH0KICAgICBlbHNlIGluRG9tYWluW2pdID0gdHJ1 ZSA7CiAgIH0KICAgaWYoIFQlMiA9PSAwICkgeyAvLyBFdmVuIG51bWJlcmVkIHRyaWFuZ2xlCiAg ICAgdHJnbC0+c2V0TmVpZ2hib3VyKDAsKGluRG9tYWluWzBdID8gZ2V0Q2VsbEF0KFQgKyAyKm54 IC0gMikgOiAwKSkgOwogICAgIHRyZ2wtPnNldE5laWdoYm91cigxLChpbkRvbWFpblsxXSA/IGdl dENlbGxBdChUICAgICAgICAgICApIDogMCkpIDsKICAgICB0cmdsLT5zZXROZWlnaGJvdXIoMiwo aW5Eb21haW5bMl0gPyBnZXRDZWxsQXQoVCAgICAgICAgLSAyKSA6IDApKSA7CiAgIH0KICAgZWxz ZSB7IC8vIE9kZCBudW1iZXJlZCB0cmlhbmdsZQogICAgIHRyZ2wtPnNldE5laWdoYm91cigwLChp bkRvbWFpblswXSA/IGdldENlbGxBdChUIC0gMipueCkgOiAwKSkgOwogICAgIHRyZ2wtPnNldE5l aWdoYm91cigxLChpbkRvbWFpblsxXSA/IGdldENlbGxBdChUIC0gMiAgICkgOiAwKSkgOwogICAg IHRyZ2wtPnNldE5laWdoYm91cigyLChpbkRvbWFpblsyXSA/IGdldENlbGxBdChUICAgICAgICkg OiAwKSkgOwogICB9CiAgfQp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6 IGNvbm5lY3QgZWRnZXMgdG8gdGhlaXIgbmVpZ2hib3VyIHRyaWFuZ2xlcy4KCnZvaWQgVE5ldDo6 YnVpbGRFZGdlc1dpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPFRORWRnZSo+JiBlZGdlcykgewoKICBp bnQgbnggPSBnZXRDYW52YXMoKS0+Z2V0TngoKSA7CiAgaW50IG55ID0gZ2V0Q2FudmFzKCktPmdl dE55KCkgOwoKICBpbnQgc3ViMSA9IG54KihueSsxKSA7CiAgaW50IG54eSAgPSBueCpueSA7CiAK ICBmb3IoaW50IGkgPSAwIDsgaSA8IHN1YjEgOyBpKyspIHsgLy8gWzAsbnhfKihueV8rMSlbCiAg ICBUTkVkZ2UgKmEgPSBlZGdlc1tpXSA7CiAgICBpZigoaSsxKSA8PSBueHkgKSBhLT5zZXRXaW5n KDAsdHJnbHNfWzIqaV0pIDsKICAgIGlmKChpKzEpID49IG54ICApIGEtPnNldFdpbmcoMSx0cmds c19bMiooaSsxKS0yKm54LTFdKTsKICB9CiAgaW50IHN1YjIgPSAyKm54Km55ICsgbnggKyBueSA7 CiAgCiAgZm9yKGludCBpID0gc3ViMSA7IGkgPCBzdWIyIDsgaSsrKSB7IC8vIFtueCoobnkrMSks MipueCpueStueCtueVsKICAgIFRORWRnZSAqYSA9IGVkZ2VzW2ldIDsKICAgIGlmKCAoaSsxLXN1 YjEpJShueCsxKSAhPSAxICkKICAgICAgYS0+c2V0V2luZygwLHRyZ2xzX1syKihpIC0gc3ViMSAt IGludCgoaSAtIHN1YjEpLyhueCsxKSkpIC0gMV0pIDsKICAgIGlmKCAoaSsxLXN1YjEpJShueCsx KSAhPSAwKQogICAgICBhLT5zZXRXaW5nKDEsdHJnbHNfWzIqKGkgLSBzdWIxIC0gaW50KChpIC0g c3ViMSkvKG54KzEpKSldKSA7CiAgfQogIGludCBuYlRORWRnZXMgPSBlZGdlcy5zaXplKCkgOwog IAogIGZvcihpbnQgaSA9IHN1YjIgOyBpIDwgbmJUTkVkZ2VzIDsgaSsrKSB7IC8vIFsyKm54Km55 K254K255LG5iVE5FZGdlc1sKICAgIFRORWRnZSAqYSA9IGVkZ2VzW2ldIDsKICAgIGEtPnNldFdp bmcoMCx0cmdsc19bMiooaSArIDEgLSAyKm54eSAtIG54IC0gbnkpIC0gMl0pIDsKICAgIGEtPnNl dFdpbmcoMSx0cmdsc19bMiooaSArIDEgLSAyKm54eSAtIG54IC0gbnkpIC0gMV0pIDsKICB9Cgp9 Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwoKLy8KLy8gUHVycG9zZTogYWNjb3VudHMgZm9yIG5vbi12 YWx1ZWQgYXBpY2VzLgoKLy8gRE9DOiBBY2NvdW50aW5nIGZvciBub24tdmFsdWVzCgovLyBQcmlu Y2lwbGUgKGFsZ28uIEFiZGVsa3JpbSBUYWxhYWxvdXQpCi8vIGZvciBlYWNoICh0cmlhbmdsZSkg ZG8KLy8gICBpZiAob25lIG9mIHRoZSBhcGljZXMgaXMgbm9uLXZhbHVlZCkKLy8gICAgICB0aGVu Ci8vICAgICAgICAgICBkbyBub3Qgc2VsZWN0IHRoZSB0cmlhbmdsZSBpbiB0aGUgZmluYWwgbGlz dAovLyAgIGVsc2UKLy8gICAgIGZvciBlYWNoIChlZGdlICdlJykgZG8KLy8gICAgICAgIFNpIHRo ZSBhcGV4IG9wcG9zaXRlIHRvICdlJyBpcyBub24tdmFsdWVkCi8vICAgICAgICAgIDEpIFRoZSBj ZWxsIG9wcG9zaXRlIHRvICdlJyBpcyBubyBtb3JlIGEgbmVpZ2hib3VyIG9mIGB0cicKLy8gICAg ICAgICAgMikgVGhlIGNlbGwgb3Bwb3NpdGUgdG8gJ2UnIGlzIG5vIG1vcmUgYSB3aW5nIG9mICdl JwovLyAgICAgZG9uZQovLyAgICBlbmRpZgovLyBkb25lCgp2b2lkIFROZXQ6OmFjY291bnRzRm9y Tm9uVmFsdWVzKCkgewoKICBpbnQgbmJUTkNlbGxzID0gdHJnbHNfLnNpemUoKSA7CiAgCiAgc3Rk Ojp2ZWN0b3I8VE5DZWxsKj4gdHJpYW5nbGVzVG9LZWVwICAgOwogIHN0ZDo6dmVjdG9yPFROQ2Vs bCo+IHRyaWFuZ2xlc1RvUmVtb3ZlIDsKICAKICBmb3IoaXRlcmF0b3IgaSA9IGJlZ2luKCkgOyBp ICE9IGVuZCgpIDsgaSsrICkgewoKICAgVE5DZWxsICp0ciA9ICppIDsKCiAgIC8vIElmIG5vbmUg b2YgdGhlIHRocmVlIGFwaWNlcyBpcyBsb2NhdGVkIGF0IGEgbm9uLXZhbHVlZCBncmlkIHBvc2l0 aW9uLAogICAvLyBjaGVja3MgdGhlIG5laWdoYm91cnMuCiAgIAogICBpZiggIW5vblZhbHVlZEFw ZXgodHItPmdldEFwZXgoMCkpICYmCiAgICAgICAhbm9uVmFsdWVkQXBleCh0ci0+Z2V0QXBleCgx KSkgJiYKICAgICAgICFub25WYWx1ZWRBcGV4KHRyLT5nZXRBcGV4KDIpKSApIHsKCiAgICAgLy8g S2VlcHMgdGhpcyB0cmlhbmdsZSBpbiB0aGUgZmluYWwgc2V0CgogICAgIHRyaWFuZ2xlc1RvS2Vl cC5wdXNoX2JhY2sodHIpIDsKICAgICBmb3IoaW50IGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKCiAg ICAgICBUTkNlbGwgKm4gPSB0ci0+Z2V0TmVpZ2hib3VyKGkpIDsKICAgICAgIGlmKCBuICkgewoK CSBUTkVkZ2UgKmUgPSB0ci0+Z2V0RWRnZShpKSA7CgkgY29uc3QgVE5BcGV4ICpwID0gbi0+YXBl eEZhY2luZ0VkZ2UoZSkgOwoKCSAvLyBJZiAncCcgaXMgbm9uLXZhbHVlZCwgdGhlIGktdGggbmVp Z2hib3VyIG9mIHRyIGlzIHNldCB0byAwLCBhbmQKCSAvLyBUaGUgd2luZyBvZiAnZScgbG9va2lu ZyBhdCAnbicgaXMgYWxzbyBzZXQgdG8gMC4KCSAKCSBpZiggbm9uVmFsdWVkQXBleChwKSApIHsK CgkgICB0ci0+c2V0TmVpZ2hib3VyKGksMCkgOwoJICAgaWYoIGUtPmdldFdpbmcoMCkgPT0gbiAp IGUtPnNldFdpbmcoMCwwKSA7CgkgICBlbHNlICAgICAgICAgICAgICAgICAgICAgZS0+c2V0V2lu ZygxLDApIDsKCSB9CiAgICAgICB9CiAgICAgfQogICB9CiAgIGVsc2UgewogICAgIHRyaWFuZ2xl c1RvUmVtb3ZlLnB1c2hfYmFjayh0cikgOwogICB9CiAgfQogLy8gQXQgdGhlIGVuZCwgJ3RyaWFu Z2xlc1RvS2VlcCcgaG9sZHMgdGhlIHJlbWFpbmluZyB0cmlhbmdsZSB3aXRoIGNvbm5lY3Rpb25z CiAvLyBwcm9wZXJseSBzZXQtdXAuIERlbGV0ZXMgdGhlIHRyaWFuZ2xlcyBoZWxkIGJ5ICd0cmlh bmdsZXNUb1JlbW92ZScKCiB0cmdsc18gPSB0cmlhbmdsZXNUb0tlZXAgOwogLy9yZW1vdmVDZWxs cyh0cmlhbmdsZXNUb1JlbW92ZSkgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1 cnBvc2U6IGJ1aWxkIGB0aGlzJyBvbiBjYW52YXMgYGNhbnZhcycuIGBjYW52YXMnIGlzIHN1cHBv c2VkIHRvIHByb3ZpZGUKLy8gICAgICAgICAgdGhlIGdyaWQncyBnZW9tZXRyeSBhbmQgdGhlIGxv Y2F0aW9ucyBvZiB0aGUgbm9uLXZhbHVlZCBhcGljZXMuCgpib29sIFROZXQ6OmJ1aWxkT24oY29u c3QgVE5DYW52YXMqIGNhbnZhcykgewoKICBpZiggY2FudmFzID09IDAgfHwgIWNhbnZhcy0+aXNW YWxpZCgpICkgewogICAgLy8gRG8gc29tZXRoaW5nIG1vcmUgaW50ZWxsaWdlbnQgLi4uCiAgICBy ZXR1cm4gZmFsc2UgOwogIH0KICBjbGVhblVwKCkgOwogIGNhbnZhc18gPSBuZXcgVE5DYW52YXMo KmNhbnZhcykgOwoKICAvLyBhcGljZXM6IChueSsxKSoobngrMSkKICAvLyBlZGdlcyA6IDMqbngq bnkrbngrbnkKICAvLyB0cmlhbmdsZXMgOiAyKm54Km55CgogIHN0ZDo6dmVjdG9yPFROQXBleCo+ IGFwaWNlcyA7CiAgc3RkOjp2ZWN0b3I8VE5FZGdlKj4gZWRnZXMgIDsKICAKICBidWlsZEFwaWNl cyhhcGljZXMpIDsKICBidWlsZEVkZ2VzRnJvbUFwaWNlcyAoZWRnZXMsYXBpY2VzKSA7CiAgYnVp bGRGcm9tRWRnZXNBbmRBcGljZXMoZWRnZXMsYXBpY2VzKSA7CgogIGFjY291bnRzRm9yTm9uVmFs dWVzKCkgOwogIHJldHVybiB0cnVlIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgovLy8gQnJh bmNoJ3MgYm91bmRhcnkuCi8qKiBUaGlzIGNsYXNzIG1vZGVscyBhIGJyYW5jaCdzIGJvdW5kYXJ5 LiBUaGUgYm91bmRhcnkgaXMgYnVpbHQgdXAKICBmcm9tIHRoZSBzZXQgb2YgZWRnZXMgc3Vycm91 bmRpbmcgYSB0cmlhbmd1bGF0ZWQgY29udGlub3VzIHBhdGNoLgogICovCmNsYXNzIEJyYW5jaEJv dW5kYXJ5IHsKCnB1YmxpYyA6CgogIHR5cGVkZWYgc2V0PGNvbnN0IFRORWRnZSo+OjppdGVyYXRv ciBpdGVyYXRvciA7CiAgdHlwZWRlZiBzZXQ8Y29uc3QgVE5FZGdlKj46OmNvbnN0X2l0ZXJhdG9y IGNvbnN0X2l0ZXJhdG9yIDsKICAKcHVibGljIDoKCiAgQnJhbmNoQm91bmRhcnkgKCkgOwogIEJy YW5jaEJvdW5kYXJ5IChjb25zdCBCcmFuY2hCb3VuZGFyeSYpIDsKICB+QnJhbmNoQm91bmRhcnko KSA7CgogIC8qKiBBZGRpbmcgYW4gZWRnZS4KICAgIEFkZHMgYW4gZWRnZSB0byB0aGlzIGJvdW5k YXJ5LiBFZGdlIGR1cGxpY2F0aW9uIGlzCiAgICBub3QgcGVybWl0dGVkLgogICAgQHBhcmFtIGUg QSBjb25zdCBwb2ludGVyIHRvIHRoZSBlZGdlLgogICAgQHNlZSBUTkVkZ2UKICAgICovCiAgdm9p ZCBhZGRFZGdlKGNvbnN0IFRORWRnZSogZSkgeyBlZGdlc18uaW5zZXJ0KGUpIDsgfQogIC8qKiBS ZW1vdmluZyBhbiBlZGdlLgogICAgUmVtb3ZlcyBhbiBlZGdlIGZyb20gdGhpcyBib3VuZGFyeS4g VGhpcyBtYXkgaGFwcGVuIHdoZW4gc2V2ZXJhbAogICAgcGF0Y2hlcyBnZXQgbWVyZ2VkLgogICAg QHBhcmFtIGUgVGhlIGVkZ2UgYmVpbmcgcmVtb3ZlZC4KICAgIEBzZWUgVE5FZGdlCiAgICAqLwog IHZvaWQgcmVtRWRnZShjb25zdCBUTkVkZ2UqIGUpIHsgZWRnZXNfLmVyYXNlKGUpIDsgfQoKICAv Ly8gSXRlcmF0aW5nLgogIC8vQHsKICAvLy8gU3RhcnRzIGl0ZXJhdGluZy4KICAvLy8gQHJldHVy biBBbiBpdGVyYXRvciB0byB0aGUgc2V0IG9mIGJvdW5kYXJ5J3MgZWRnZXMuCiAgaXRlcmF0b3Ig YmVnaW4oKSB7IHJldHVybiBlZGdlc18uYmVnaW4oKSA7IH0KICAvLy8gU3RvcCBpdGVyYXRpbmcu CiAgLy8vIEByZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuCiAg aXRlcmF0b3IgZW5kICAoKSB7IHJldHVybiBlZGdlc18uZW5kICAoKSA7IH0KICAvL0B9CiAgY29u c3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBlZGdlc18uYmVnaW4oKSA7IH0KICBj b25zdF9pdGVyYXRvciBlbmQgICgpIGNvbnN0IHsgcmV0dXJuIGVkZ2VzXy5lbmQgICgpIDsgfQog IAogIGNvbnN0IFRORWRnZSogdmFsdWUoaXRlcmF0b3ImIGkpIGNvbnN0IHsgcmV0dXJuICppIDsg fSAgCiAgdm9pZCBuZXh0KGl0ZXJhdG9yJiBpKSAgICAgICAgICAgY29uc3QgeyBpKysgOyB9Cgog IC8qKiBTaGFyZWQgZWRnZSBkZXRlY3Rpb24uCiAgICBUZXN0cyB3aGV0aGVyIHRoaXMgYm91bmRh cnkgaXMgYWRqYWNlbnQgdG8gPGI+YjwvYj4uIFRoZXkgYXJlCiAgICBpZiB0aGV5IHNoYXJlIGF0 IGxlYXN0IG9uZSBlZGdlLgogICAgQHBhcmFtIGIgQSBwb2ludGVyIHRvIGFub3RoZXIgYm91bmRh cnkuCiAgICBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KICAgICovCiAgYm9vbCBzaGFyZUVkZ2Vz V2l0aChjb25zdCBCcmFuY2hCb3VuZGFyeSogYikgY29uc3QgewojaWYgMAogICAgc2V0PGNvbnN0 IFRORWRnZSo+IGludGVyIDsKICAgIHNldF9pbnRlcnNlY3Rpb24oYmVnaW4oKSxlbmQoKSxiLT5i ZWdpbigpLGItPmVuZCgpLAoJCSAgICAgaW5zZXJ0X2l0ZXJhdG9yPHNldDxjb25zdCBUTkVkZ2Uq PiA+KGludGVyLGludGVyLmJlZ2luKCkpKTsKICAgIHJldHVybiBpbnRlci5zaXplKCkgPiAwIDsK I2Vsc2UKICAgIGJvb2wgc2hhcmUgPSBmYWxzZTsKICAgIGZvcihjb25zdF9pdGVyYXRvciBpID0g YmVnaW4oKSA7IGkgIT0gZW5kKCkgOyBpKyspIHsKICAgICAgaWYoIGItPmVkZ2VzXy5maW5kKCpp KSAhPSBiLT5lbmQoKSApIHsKCXNoYXJlID0gdHJ1ZSA7CglicmVhayA7CiAgICAgIH0KICAgIH0K ICAgIHJldHVybiBzaGFyZSA7CiNlbmRpZgogIH0KICAvKiogSW50ZWdyYXRpbmcgYSBib3VuZGFy eS4KICAgIEludGVncmF0ZXMgYm91bmRhcnkgPGI+YjwvYj4gd2l0aGluIHRoaXMgYm91bmRhcnku CiAgICBAcGFyYW0gYiBUaGUgYm91bmRhcnkgdG8gYmUgaW50ZWdyYXRlZC4KICAgICovCiAgdm9p ZCBpbnRlZ3JhdGUoY29uc3QgQnJhbmNoQm91bmRhcnkgKmIpIDsKCnByaXZhdGUgOgoKICBzZXQ8 Y29uc3QgVE5FZGdlKj4gZWRnZXNfIDsKfSA7CgovKiogVHJpYW5ndWxhdGVkIHBhdGNoLgogIFRo aXMgY2xhc3MgcmVwcmVzZW50cyBhIHRyaWFuZ3VsYXRlZCBwYXRjaCwgdGhhdCBpcyBhIHNldCBv ZiBjb250aWd1dXMKICBjZWxscyBib3JkZXJlZCBieSBhIHNldCBvZiBlZGdlcyAoLmkuZSBhIGJv dW5kYXJ5KS4KICAqLwpjbGFzcyBCcmFuY2ggewoKcHVibGljIDoKCiAgdHlwZWRlZiBzZXQ8Y29u c3QgVE5DZWxsKj46Oml0ZXJhdG9yIGl0ZXJhdG9yIDsKICB0eXBlZGVmIHNldDxjb25zdCBUTkNl bGwqPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3IgOwogIApwdWJsaWMgOgoKICAvKiog Q29uc3RydWN0b3IuCiAgICBBIHBhdGNoIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZnJvbSBhbiBpbml0 aWFsIGNlbGwgdXNlZCBhcyBhCiAgICA8SU0+c2VlZDwvSU0+LiBUaGUgc2VlZCBpcyB0aGUgZmly c3QgY2VsbCBvZiB0aGUgcGF0Y2ggYW5kIHNldHMKICAgIGFsc28gaXRzIGZpcnN0IGJvdW5kYXJ5 LgogICAgQHBhcmFtIHNlZWQgVGhlIGluaXRpYWwgY2VsbC4KICAgIEBzZWUgVE5DZWxsCiAgICAq LwogIEJyYW5jaCAoY29uc3QgVE5DZWxsICpzZWVkKSA7CiAgQnJhbmNoIChjb25zdCBCcmFuY2gm KSA7CiAgfkJyYW5jaCgpIDsKCiAgLyoqIEJyYW5jaCBpbnRlZ3JhdGlvbi4KICAgIEludGVncmF0 ZXMgYnJhbmNoIDxCPmJyPC9CPiBpbiB0aGlzIGJyYW5jaC4gVGhlIGJvdW5kYXJpZXMgYXJlIGFs c28KICAgIG1lcmdlZC4KICAgIEBwYXJhbSBiciBUaGUgYnJhbmNoIHRvIGJlIGludGVncmF0ZWQu CiAgICBAc2VlIEJyYW5jaEJvdW5kYXJ5CiAgICAqLwogIHZvaWQgaW50ZWdyYXRlKGNvbnN0IEJy YW5jaCAqYnIpIDsKCiAgYm9vbCBhZGphY2VudFRvKGNvbnN0IEJyYW5jaCAqYnIpIGNvbnN0IHsK ICAgIHJldHVybiBib3VuZGFyeV8tPnNoYXJlRWRnZXNXaXRoKGJyLT5ib3VuZGFyeV8pIDsKICB9 CiAgU3BDb29yZCBhcmVhKCkgY29uc3QgeyByZXR1cm4gU3BDb29yZCh0cmdsc18uc2l6ZSgpKSA7 IH0KCiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0cmdsc18uYmVnaW4oKSA7IH0KICBpdGVy YXRvciBlbmQgICgpIHsgcmV0dXJuIHRyZ2xzXy5lbmQgICgpIDsgfQogIAogIGNvbnN0X2l0ZXJh dG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdHJnbHNfLmJlZ2luKCkgOyB9CiAgY29uc3RfaXRl cmF0b3IgZW5kICAoKSBjb25zdCB7IHJldHVybiB0cmdsc18uZW5kICAoKSA7IH0KCiAgYm9vbCBv d25zQ2VsbChjb25zdCBUTkNlbGwgKnRyZ2wpIGNvbnN0IHsKICAgIHJldHVybiB0cmdsc18uZmlu ZCh0cmdsKSAhPSBlbmQoKSA7CiAgfQogIHZvaWQgYWRkQ2VsbChjb25zdCBUTkNlbGwgKnRyZ2wp IHsgdHJnbHNfLmluc2VydCh0cmdsKSA7IH0KICB2b2lkIHJlbUNlbGwoY29uc3QgVE5DZWxsICp0 cmdsKSB7IHRyZ2xzXy5lcmFzZSAodHJnbCkgOyB9CiAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0 dXJuIHRyZ2xzXy5zaXplKCkgPT0gMCA7IH0KCiAgY29uc3QgVE5DZWxsKiB2YWx1ZShpdGVyYXRv ciYgaSkgY29uc3QgeyByZXR1cm4gKmkgOyB9CiAgdm9pZCBuZXh0KGl0ZXJhdG9yJiBpKSAgICAg ICAgICAgY29uc3QgeyBpKysgOyB9CiAKICBjb25zdCBCcmFuY2hCb3VuZGFyeSogZ2V0Qm91bmRh cnkoKSBjb25zdCB7CiAgICByZXR1cm4gYm91bmRhcnlfIDsKICB9CiAgY29uc3QgVE5DZWxsKiBn ZXRTZWVkKCkgY29uc3QgewogICAgcmV0dXJuIHNlZWRfIDsKICB9Cgpwcml2YXRlIDoKCiAgc2V0 PGNvbnN0IFROQ2VsbCo+IHRyZ2xzXyA7CiAgY29uc3QgVE5DZWxsICAgICAgKnNlZWRfICA7CiAg QnJhbmNoQm91bmRhcnkgICAgKmJvdW5kYXJ5XyA7Cn0gOwoKLyoqIFNldCBvZiBicmFuY2hlcy4K ICBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiBicmFuY2hlcy4gSXQgaGFzIHRoZSBwYXJ0aWN1 bGFyaXR5IHRvCiAgb3B0aW9uYWxseSBtYW5hZ2UgdGhlIGxpZmUgb2YgZW1iZWRkZWQgYnJhbmNo ZXMuIEluIHRoaXMgY2FzZSwKICB0aGUgYnJhbmNoZXMgYWRkZWQgdG8gYW4gaW5zdGFuY2Ugb2Yg dGhpcyBjbGFzcyBnZXQgZGVzdHJveWVkCiAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVk LgogICovCmNsYXNzIEJyYW5jaFNldCB7CgpwdWJsaWMgOgoKICB0eXBlZGVmIGxpc3Q8Y29uc3Qg QnJhbmNoKj46Oml0ZXJhdG9yIGl0ZXJhdG9yIDsKICB0eXBlZGVmIGxpc3Q8Y29uc3QgQnJhbmNo Kj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yIDsKICBmcmllbmQgY2xhc3MgQnJhbmNo U2V0QnVpbGRlciA7CiAgZnJpZW5kIGNsYXNzIEJyYW5jaEludGVncmF0ZXIgOwogIApwdWJsaWMg OgoKICAvLy8gQ29uc3RydWN0b3IuCiAgQnJhbmNoU2V0KCkgOwogIC8vLyBDb3B5IGNvbnN0cnVj dG9yLgogIEJyYW5jaFNldChjb25zdCBCcmFuY2hTZXQmKSA7CiAgfkJyYW5jaFNldCgpIDsKCiAg Ly8vIEl0ZXJhdGlvbi4KICAvL0B7CiAgLy8vIFN0YXJ0cyB0byBpdGVyYXRlIG92ZXIgdGhlIGJy YW5jaGVzLgogIC8vLyBAcmV0dXJuIEFuIGl0ZXJhdG9yLgogIGl0ZXJhdG9yIGJlZ2luKCkgeyBy ZXR1cm4gYnJhbmNoZXNfLmJlZ2luKCkgOyB9CiAgLy8vIFN0b3BzIGl0ZXJhdGluZy4KICAvLy8g QHJldHVybiBBIG1hcmtlciB0byB0aGUgZW5kIG9mIHRoZSBzZXQuCiAgLy9AfQogIGl0ZXJhdG9y IGVuZCAgKCkgeyByZXR1cm4gYnJhbmNoZXNfLmVuZCAgKCkgOyB9CgogIGNvbnN0X2l0ZXJhdG9y IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gYnJhbmNoZXNfLmJlZ2luKCkgOyB9CiAgY29uc3RfaXRl cmF0b3IgZW5kICAoKSBjb25zdCB7IHJldHVybiBicmFuY2hlc18uZW5kKCkgICA7IH0KCiAgY29u c3QgQnJhbmNoKiB2YWx1ZShpdGVyYXRvciYgaSkgICAgICAgY29uc3QgeyByZXR1cm4gKmkgOyB9 CiAgY29uc3QgQnJhbmNoKiB2YWx1ZShjb25zdF9pdGVyYXRvciYgaSkgY29uc3QgeyByZXR1cm4g KmkgOyB9CgogIHZvaWQgbmV4dChpdGVyYXRvciYgaSkgICAgICAgY29uc3QgeyBpKysgOyB9CiAg dm9pZCBuZXh0KGNvbnN0X2l0ZXJhdG9yJiBpKSBjb25zdCB7IGkrKyA7IH0KCiAgLyoqIFN3aXRj aGVzIG9uL29mZiBtYW5hZ2VtZW50LgogICAgVGhpcyBjYWxsIHN3aXRjaGVzIG9uIGFuZCBvZmYg YXV0b21hdGljIG1lbW9yeSBtYW5hZ2VtZW50CiAgICBvZiBlbWJlZGRlZCBicmFuY2hlcy4KICAg IEBwYXJhbSBtYW5hZ2UgTXVzdCBiZSA8Yj50cnVlPC9iPiB0byB0dXJuIG9uIGF1dG9tYXRpYyBt YW5hZ2VtZW50LgogICAgKi8KICB2b2lkIG1hbmFnZUJyYW5jaGVzKGJvb2wgbWFuYWdlKSB7CiAg ICBtYW5hZ2VCcmFuY2hlc18gPSBtYW5hZ2UgOwogIH0KICAvKiogU3RhdHVzIG9mIGF1dG9tYXRp YyBtYW5hZ2VtZW50LgogICAgUmV0dXJucyB3aGV0aGVyIGF1dG9tYXRpYyBicmFuY2gncyBtYW5h Z2VtZW50IGlzIGJlaW5nCiAgICBwZXJmb3JtZWQuCiAgICAqLwogIGJvb2wgbWFuYWdlQnJhbmNo ZXMoKSBjb25zdCB7IHJldHVybiBtYW5hZ2VCcmFuY2hlc18gOyB9Cgpwcml2YXRlIDoKCiAgdm9p ZCBjbGVhblVwKCkgOwogIHZvaWQgYWRkQnJhbmNoKGNvbnN0IEJyYW5jaCogYikgewogICAgYnJh bmNoZXNfLnB1c2hfYmFjayhtYW5hZ2VCcmFuY2hlcygpID8gbmV3IEJyYW5jaCgqYikgOiBiKSA7 CiAgfQogIHZvaWQgcmVtQnJhbmNoKEJyYW5jaCogYikgewogICAgYnJhbmNoZXNfLnJlbW92ZShi KSA7CiAgICBpZiggbWFuYWdlQnJhbmNoZXMoKSApIGRlbGV0ZSBiIDsKICB9Cgpwcml2YXRlIDoK CiAgbGlzdDxjb25zdCBCcmFuY2gqPiBicmFuY2hlc18gOwogIEJyYW5jaFNldCYgb3BlcmF0b3Ig PShjb25zdCBCcmFuY2hTZXQmKSA7CiAgYm9vbCBtYW5hZ2VCcmFuY2hlc18gOwp9IDsKCi8qKiBC dWlsZGluZyBhIHNldCBvZiBicmFuY2hlcy4KICBUaGlzIGNsYXNzIGlzIGEgcHJvY2Vzc29yIHVz ZWQgdG8gYnVpbGQgYW4gaW5pdGlhbCBzZXQgb2YKICB0cmlhbmd1bGF0ZWQgcGF0Y2hlcy4gVGhv c2UgcGF0Y2hlcyBtYXkgYmUgcG9zdC1wcm9jZXNzZWQKICBsYXRlci1vbi4gVGhlIHJlc3VsdCBv ZiB0aGUgYnVpbGRpbmcgcHJvY2VzcyBpcyBhIHNldCBvZgogIGJyYW5jaGVzLgogICovCmNsYXNz IEJyYW5jaFNldEJ1aWxkZXIgewoKcHVibGljIDoKCiAgdHlwZWRlZiBsaXN0PEJyYW5jaCo+Ojpp dGVyYXRvciBpdGVyYXRvciA7CiAgdHlwZWRlZiBsaXN0PEJyYW5jaCo+Ojpjb25zdF9pdGVyYXRv ciBjb25zdF9pdGVyYXRvciA7CgpwdWJsaWMgOgoKICAvKiogQ3JlYXRvci4KICAgIENyZWF0ZXMg YSBidWlsZGVyIGZyb20gYSB0cmlhZ3VsYXRlZCBuZXR5d29yay4gVGhlIGJ1aWxkZXIKICAgIG1h eSBiZSB1c2VkIHNldmVyYWwgdGltZXMgZm9yIGRpZmZlcmVudCBnZW9tZXRyaWVzLgogICAgQHBh cmFtIHRuZXQgVGhlIHRyaWFuZ3VsYXRlZCBuZXR3b3JrLgogICAgQHNlZSBUTmV0CiAgICAqLwog IEJyYW5jaFNldEJ1aWxkZXIoY29uc3QgVE5ldCopIDsKICB+QnJhbmNoU2V0QnVpbGRlcigpIDsK CiAgLyoqIE11bHRpLXZhbHVlZCBicmFuY2hlcy4KICAgIFJldHVybnMgd2hldGhlciBicmFuY2hl cyBhcmUgYWxsb3dlZCB0byBiZQogICAgbXVsdGktdmFsdWVkLgogICAgQHBhcmFtIG11bHRpIDxi PnRydWU8L2I+IG9yIDxiPmZhbHNlPC9iPi4KICAgICovCiAgdm9pZCBtdWx0aVZhbHVlZChib29s IG11bHRpKSB7CiAgICBtdWx0aVZhbHVlZF8gPSBtdWx0aSA7CiAgfQogIGJvb2wgbXVsdGlWYWx1 ZWQoKSBjb25zdCB7CiAgICByZXR1cm4gbXVsdGlWYWx1ZWRfIDsKICB9CiAgLyoqIEJ1aWxkaW5n IHRoZSBicmFuY2hlcy4KICAgIEJ1aWxkcyBhIHNldCBvZiBicmFuY2hlcyB1c2luZyBhIGdpdmVu IGdlb21ldHJ5LiBUaGUgZ2VvbWV0cnkgaXMKICAgIHByb3ZpZGVkIGJ5IGEgc2ltcGxlIHNldCBv ZiBwb2ludHMuCiAgICBAcGFyYW0gYnJzZXQgVGhlIHNldCBvZiBicmFuY2hlcyB0byBiZSBidWls dC4KICAgIEBwYXJhbSBwb2ludHMgVGhlIHNldCBvZiBwb2ludHMgcHJvdmlkaW5nIHRoZSBnZW9t ZXRyeS4KICAgIEByZXR1cm4gPGI+dHJ1ZTwvYj4gdXBvbiBzdWNjZXNzZnVsbCBjb21wbGV0aW9u LCA8Yj5mYWxzZTwvYj4gb3RoZXJ3aXNlLgogICAgQHNlZSBCcmFuY2hTZXQKICAgICovCiAgYm9v bCBidWlsZEZyb20oQnJhbmNoU2V0JiBicnNldCxjb25zdCBQb2ludHMmKSA7CgogIGl0ZXJhdG9y IGJlZ2luKCkgeyByZXR1cm4gYnJhbmNoZXNfLmJlZ2luKCkgOyB9CiAgaXRlcmF0b3IgZW5kICAo KSB7IHJldHVybiBicmFuY2hlc18uZW5kICAoKSA7IH0KCiAgY29uc3RfaXRlcmF0b3IgYmVnaW4o KSBjb25zdCB7IHJldHVybiBicmFuY2hlc18uYmVnaW4oKSA7IH0KICBjb25zdF9pdGVyYXRvciBl bmQgICgpIGNvbnN0IHsgcmV0dXJuIGJyYW5jaGVzXy5lbmQgICgpIDsgfQoKICBjb25zdCBCcmFu Y2gqIHZhbHVlKGl0ZXJhdG9yJiBpKSAgICAgICBjb25zdCB7IHJldHVybiAqaSA7IH0KICBjb25z dCBCcmFuY2gqIHZhbHVlKGNvbnN0X2l0ZXJhdG9yJiBpKSBjb25zdCB7IHJldHVybiAqaSA7IH0K CiAgdm9pZCBuZXh0KGl0ZXJhdG9yJiBpKSAgICAgICBjb25zdCB7IGkrKyA7IH0KICB2b2lkIG5l eHQoY29uc3RfaXRlcmF0b3ImIGkpIGNvbnN0IHsgaSsrIDsgfQoKICBjb25zdCBQb2ludCYgZ2V0 UG9pbnQoaW50IHBpZCkgY29uc3QgewogICAgcmV0dXJuIHBvaW50c18tPmdldFBvaW50KHBpZC0x KSA7CiAgfQogIApwcml2YXRlIDoKCiAgdm9pZCBjbGVhblVwKCkgOwogIHZvaWQgYnVpbGQoQnJh bmNoU2V0JikgOwogIHZvaWQgYnVpbGRCcmFuY2goQnJhbmNoKiBicmFuY2gpIDsKICBib29sIHBy b3BhZ2F0ZUJyYW5jaChCcmFuY2gqIGIsY29uc3QgVE5DZWxsKiB0LGNvbnN0IFRORWRnZSAqZSkg OwoKICB2b2lkIGFkZEJyYW5jaChCcmFuY2gqIGJyYW5jaCkgewogICAgYnJhbmNoZXNfLnB1c2hf YmFjayhicmFuY2gpIDsKICAgIHRyaWFuZ2xlTWFwX1ticmFuY2gtPmdldFNlZWQoKV0gPSBicmFu Y2ggOwogIH0KICB2b2lkIGFkZEluQnJhbmNoKEJyYW5jaCogYnJhbmNoLGNvbnN0IFROQ2VsbCAq dHJnbCkgewogICAgYnJhbmNoLT5hZGRDZWxsKHRyZ2wpIDsKICAgIHRyaWFuZ2xlTWFwX1t0cmds XSA9IGJyYW5jaCA7CiAgfQogIEJyYW5jaCogZmluZEJyYW5jaE93bmluZyhjb25zdCBUTkNlbGwg KnRyKSBjb25zdCB7CiAgICBtYXA8Y29uc3QgVE5DZWxsKixCcmFuY2gqPjo6Y29uc3RfaXRlcmF0 b3IgaSA9IHRyaWFuZ2xlTWFwXy5maW5kKHRyKSA7CiAgICByZXR1cm4gaSA9PSB0cmlhbmdsZU1h cF8uZW5kKCkgPyAwIDogaS0+c2Vjb25kIDsKICB9CiAgQnJhbmNoKiBuZXdCcmFuY2goY29uc3Qg VE5DZWxsKiBzZWVkKSB7CiAgICBCcmFuY2ggKmJyID0gbmV3IEJyYW5jaChzZWVkKSA7CiAgICBh ZGRCcmFuY2goYnIpIDsKICAgIHJldHVybiBiciA7CiAgfQoKcHJpdmF0ZSA6CgogIGJvb2wgICAg ICAgICAgICAgICAgICAgICAgICAgbXVsdGlWYWx1ZWRfIDsKICBjb25zdCBUTmV0ICAgICAgICAg ICAgICAgICAgKnRuZXRfICAgICAgICA7CiAgY29uc3QgUG9pbnRzICAgICAgICAgICAgICAgICpw b2ludHNfICAgICAgOwogIG1hcDxjb25zdCBUTkNlbGwqLEJyYW5jaCo+IHRyaWFuZ2xlTWFwXyAg IDsKICBsaXN0PEJyYW5jaCo+ICAgICAgICAgICAgICAgIGJyYW5jaGVzXyAgICA7Cn0gOwoKLyoq IEludGVncmF0aW5nIGJyYW5jaGVzLgogIEFmdGVyIGRldGVjdGlvbiwgYSBncmVhdCBudW1iZXIg b2YgYnJhbmNoZXMgbWF5IGJlIGZvdW5kLiBUaGUKICBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMg dG8gZmlsdGVyIHRoZSBpbml0aWFsIHNldCBvZiBicmFuY2hlcwogIHNvIGFzIHRvIHJlaW50ZWdy YXRlIHNvbWVvZiB0aGUgYnJhbmNoZXMgaW50byBvdGhlciBvbmVzLiBUaGUKICByZS1pbnRlZ3Jh dGlvbiBtYXUgd29yayBpbiBvbmUgb3Igc2V2ZXJhbCBwYXNzZXMuCiAgKi8KY2xhc3MgQnJhbmNo SW50ZWdyYXRlciB7CgpwdWJsaWMgOgoKICBCcmFuY2hJbnRlZ3JhdGVyKCkgOwogIHZpcnR1YWwg fkJyYW5jaEludGVncmF0ZXIoKSA7CgogIC8qKiBJbnRlZ3JhdGluZyBicmFuY2hlcy4KICAgIElu dGVncmF0ZXMgYnJhbmNoZXMgZnJvbSA8Yj5zcmM8L2I+LiBCcmFuY2hlcyBhcmUgb3V0cHV0CiAg ICBpbiA8Yj5kc3Q8L2I+LgogICAgQHBhcmFtIHNyYyBUaGUgaW5wdXQgcmVhZC1vbmx5IHNldCBv ZiBicmFuY2hlcy4KICAgIEBwYXJhbSBkc3QgVGhlIG91dHB1dCBzZXQgb2YgYnJhbmNoZXMgKGlu aXRpYWxseSBlbXB0aWVkKS4KICAgIEBzZWUgQnJhbmNoU2V0CiAgICAqLwogIHZvaWQgcnVuKGNv bnN0IEJyYW5jaFNldCYgc3JjLEJyYW5jaFNldCYgZHN0KSA7CgogIC8qKiBHZXR0aW5nIHJ1bm5p bmcgbW9kZS4KICAgIFJldHVybnMgd2hldGhlciBpbnRlZ3JhdGlvbiBtdXN0IHJ1biBpbiBvbmUg cGFzcy4KICAgIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgogICAgKi8KICBib29sIHJ1bkluT25l UGFzcygpIGNvbnN0IHsgcmV0dXJuIGluT25lUGFzc18gOyB9CiAgLyoqIFNldHRpbmcgcnVubmlu ZyBtb2RlLgogICAgU2V0cyB3aGV0aGVyICBpbnRlZ3JhdGlvbiBtdXN0IHJ1biBpbiBvbmUgcGFz cy4KICAgIEBwYXJhbSBpbk9uZVBhc3MgQSBib29sZWFuIHZhbHVlLCA8Yj50cnVlPC9iPiBmb3Ig b25lLXBhc3MgbW9kZS4KICAgICovCiAgdm9pZCBydW5Jbk9uZVBhc3MoYm9vbCBpbk9uZVBhc3Mp IHsKICAgIGluT25lUGFzc18gPSBpbk9uZVBhc3MgOwogIH0KCnByb3RlY3RlZCA6CgogIC8vLyBJ bnRlZ3JhdGlvbiBlbmdpbmVzLgogIC8vQHsKICAvLy8gRGV0ZWN0aW5nIHRoZSBicmFuY2hlcyB0 byBiZSByZS1pbnRlZ3JhdGVkLgogIC8vLyBAcGFyYW0gc2V0IFRoZSBpbml0aWFsIHNldCBvZiBi cmFuY2hlcy4KICAvLy8gQHBhcmFtIGwgVGhlIGxpc3Qgb2YgYnJhbmNoZXMgdG8gYmUgaW50ZWdy YXRlZC4KICB2aXJ0dWFsIHZvaWQgYnJhbmNoZXNUb0JlSW50ZWdyYXRlZChjb25zdCBCcmFuY2hT ZXQmLGxpc3Q8QnJhbmNoKj4mKSA7CiAgLy8vIEdldHRpbmcgdGhlIGhvc3QgYnJhbmNoIGZvciBp bnRlZ3JhdGluZyBicmFuY2hlcyB0byBiZSByZW1vdmVkLgogIC8vLyBAcGFyYW0gc2V0IFRoZSBz ZXQgb2YgYnJhbmNoZXMgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlIGJyYW5jaC4KICAvLy8gQHBh cmFtIGJyYW5jaCBUaGUgYnJhbmNoIHRvIGJlIHJlLWludGVncmF0ZWQuCiAgLy8vIEByZXR1cm4g QSBjb25zdCBwb2ludGVyIHRvIHRoZSBgaG9zdCcgYnJhbmNoLgogIHZpcnR1YWwgQnJhbmNoKiBi cmFuY2hGb3JJbnRlZ3JhdGluZyhjb25zdCBCcmFuY2hTZXQmLGNvbnN0IEJyYW5jaCopIDsKICAv L0B9Cgpwcml2YXRlIDoKCiAgYm9vbCBpbk9uZVBhc3NfIDsKfSA7CgovKiogQSBzcGVjaWFsIHB1 cnBvc2UgaW50ZWdyYXRvci4KICBUaGlzIGNsYXNzIGludGVncmF0ZXMgYnJhbmNoZXMgYmFzZWQg b24gdGhlaXIgc2l6ZSByZWdhcmRpbmcKICB0aGUgbWVhbiBzaXplIHdpdGhpbiBhbGwgcGF0Y2hl cy4gVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgb2YKICB3aGF0IGNhbiBiZSBkb25lLgogICovCmNs YXNzIFRpbnlCcmFuY2hSZW1vdmVyIDogcHVibGljIEJyYW5jaEludGVncmF0ZXIgewoKcHVibGlj IDoKCiAgVGlueUJyYW5jaFJlbW92ZXIoKSA7CiAgflRpbnlCcmFuY2hSZW1vdmVyKCkgOwoKICAv KiogU2V0dGluZyByZW1vdmFsIHJhdGlvLgogICAgU2V0cyB0aGUgcmF0aW8gKHRoZSBzaXplIG9m IHRoZSBicmFuY2ggb3ZlciB0aGUgc2l6ZSBvZiB0aGUgZ3JlYXRlc3QKICAgIGJyYW5jaCksIHVu ZGVyIHdoaWNoIHRoZSBicmFuY2ggaGFzIHRvIGJlIHJlLWludGVncmF0ZWQgaW50byBhbm90aGVy IG9uZS4KICAgIEBwYXJhbSByZW1vdmFsUmF0aW8gQSBmbG9hdGluZyBwb2ludCB2YWx1ZSAodHlw aWNhbGx5IDxiPjAuMDE8L2I+IG9yCiAgICA8Yj4wLjAwNTwvYj4pLgogICAgKi8KICB2b2lkIHNl dFJlbW92YWxSYXRpbyhTcENvb3JkIHJlbW92YWxSYXRpbykgewogICAgcmVtb3ZhbFJhdGlvXyA9 IHJlbW92YWxSYXRpbyA7CiAgfQogIC8qKiBHZXR0aW5nIHJlbW92YWwgcmF0aW8uCiAgICBHZXRz IHRoZSByZW1vdmFsIHJhdGlvIGZvciByZS1pbnRlZ3JhdGluZyBicmFuY2hlcy4gVGhlIHJhdGlv IGRlZmF1bHRzCiAgICB0byA8Yj4wLjAxPC9iPi4KICAgIEByZXR1cm4gQSBmbG9hdGluZyBwb2lu dCB2YWx1ZS4KICAgICovCiAgU3BDb29yZCBnZXRSZW1vdmFsUmF0aW8oKSBjb25zdCB7CiAgICBy ZXR1cm4gcmVtb3ZhbFJhdGlvXyA7CiAgfQoKcHJvdGVjdGVkIDoKCiAgdm9pZCBicmFuY2hlc1Rv QmVJbnRlZ3JhdGVkKGNvbnN0IEJyYW5jaFNldCYsbGlzdDxCcmFuY2gqPiYpIDsKICBCcmFuY2gq IGJyYW5jaEZvckludGVncmF0aW5nKGNvbnN0IEJyYW5jaFNldCYsY29uc3QgQnJhbmNoKikgOwoK cHJpdmF0ZSA6CiAgCiAgU3BDb29yZCBjb21wdXRlTWF4QXJlYShjb25zdCBCcmFuY2hTZXQmIGJz ZXQpIDsKICBTcENvb3JkIHJlbW92YWxSYXRpb18gOwp9IDsKCi8vCi8vIFB1cnBvc2U6IGNyZWF0 ZXMgYSBuZXcgYnJhbmNoIGZyb20gc2VlZCBgc2VlZCcuIGBzZWVkJyBpcyBhbHNvIHRoZSBmaXJz dAovLyAgICAgICAgICBjZWxsIGluIHRoZSBicmFuY2guCgpCcmFuY2g6OkJyYW5jaChjb25zdCBU TkNlbGwqIHNlZWQpIHsKCiAgYWRkQ2VsbChzZWVkXyA9IHNlZWQpIDsKICBib3VuZGFyeV8gPSBu ZXcgQnJhbmNoQm91bmRhcnkoKSA7CiAgYm91bmRhcnlfLT5hZGRFZGdlKHNlZWRfLT5nZXRFZGdl KDApKSA7CiAgYm91bmRhcnlfLT5hZGRFZGdlKHNlZWRfLT5nZXRFZGdlKDEpKSA7CiAgYm91bmRh cnlfLT5hZGRFZGdlKHNlZWRfLT5nZXRFZGdlKDIpKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwoKQnJhbmNoOjpCcmFuY2goY29uc3QgQnJhbmNoJiBicikgewoKICBib3VuZGFyeV8gPSBuZXcg QnJhbmNoQm91bmRhcnkoKmJyLmJvdW5kYXJ5XykgOwogIHRyZ2xzXyAgICA9IGJyLnRyZ2xzXyA7 Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoOjp+QnJhbmNoKCkgewoKICBkZWxldGUg Ym91bmRhcnlfIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBpbnRl Z3JhdGVzIGJyYW5jaCBgYnInIGluIGB0aGlzJy4gVGhlIHR3byBib3VuZGFyaWVzIGFyZSBhbHNv Ci8vICAgICAgICAgIG1lcmdlZC4KCnZvaWQgQnJhbmNoOjppbnRlZ3JhdGUoY29uc3QgQnJhbmNo ICpicikgewoKICBzZXQ8Y29uc3QgVE5DZWxsKj4gbmV3VHJnbHMgOwogIHNldF91bmlvbihiZWdp bigpLGVuZCgpLGJyLT5iZWdpbigpLGJyLT5lbmQoKSwKCSAgICBpbnNlcnRfaXRlcmF0b3I8c2V0 PGNvbnN0IFROQ2VsbCo+ID4obmV3VHJnbHMsbmV3VHJnbHMuYmVnaW4oKSkpIDsKICB0cmdsc18g PSBuZXdUcmdscyA7CiAgYm91bmRhcnlfLT5pbnRlZ3JhdGUoYnItPmdldEJvdW5kYXJ5KCkpIDsK fQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCgpCcmFuY2hCb3VuZGFyeTo6QnJhbmNoQm91bmRhcnko KSB7Cgp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkJyYW5jaEJvdW5kYXJ5OjpCcmFuY2hCb3Vu ZGFyeShjb25zdCBCcmFuY2hCb3VuZGFyeSYgYm91bmRhcnkpIHsKCiAgZWRnZXNfID0gYm91bmRh cnkuZWRnZXNfIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkJyYW5jaEJvdW5kYXJ5Ojp+QnJh bmNoQm91bmRhcnkoKSB7Cgp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6 IGludGVncmF0ZXMgYm91bmRhcnkgYGJyJyBpbiBgdGhpcycuIFRoZSBmaW5hbCBzZXQgb2YgZWdk ZSBFMwovLyAgICAgICAgICBpcyBFMzogKEUxIHVuaW9uIEUyKSAtIChFMSBpbnRlciBFMikKCnZv aWQgQnJhbmNoQm91bmRhcnk6OmludGVncmF0ZShjb25zdCBCcmFuY2hCb3VuZGFyeSAqYikgewoK ICAgIHNldDxjb25zdCBUTkVkZ2UqPiBzZXRJbnRlcixzZXRGaW5hbCxzZXRVbmlvbiA7CiAgICBz ZXRfdW5pb24oYmVnaW4oKSxlbmQoKSxiLT5iZWdpbigpLGItPmVuZCgpLAoJICAgICAgaW5zZXJ0 X2l0ZXJhdG9yPHNldDxjb25zdCBUTkVkZ2UqPiA+KHNldFVuaW9uLHNldFVuaW9uLmJlZ2luKCkp KSA7CiAgICBzZXRfaW50ZXJzZWN0aW9uKGJlZ2luKCksZW5kKCksYi0+YmVnaW4oKSxiLT5lbmQo KSwKCQkgICAgIGluc2VydF9pdGVyYXRvcjxzZXQ8Y29uc3QgVE5FZGdlKj4gPihzZXRJbnRlcixz ZXRJbnRlci5iZWdpbigpKSkgOwoKICAgIHNldF9kaWZmZXJlbmNlKHNldFVuaW9uLmJlZ2luKCks c2V0VW5pb24uZW5kKCksCgkJICAgc2V0SW50ZXIuYmVnaW4oKSxzZXRJbnRlci5lbmQoKSwKCQkg ICBpbnNlcnRfaXRlcmF0b3I8c2V0PGNvbnN0IFRORWRnZSo+ID4oc2V0RmluYWwsc2V0RmluYWwu YmVnaW4oKSkpIDsKCiAgICBlZGdlc18gPSBzZXRGaW5hbCA7Cn0KLy9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCgovLyBQdXJwb3NlOiByZXR1cm4gd2hldGhlciBdQSxCXSBpbnRlcnNlY3RzIFtDRF0uIFRo ZSBjYWxjdWxhdGlvbiBpcyBwZXJmb3JtZWQKLy8gICAgICAgICAgYWZ0ZXIgcHJvamVjdGlvbiBv biBhbiBob3Jpem9udGFsIHBsYW5lLgoKaW5saW5lIGJvb2wgaW50ZXJzZWN0KGNvbnN0IFBvaW50 JiBBLGNvbnN0IFBvaW50JiBCLAoJCSAgICAgIGNvbnN0IFBvaW50JiBDLGNvbnN0IFBvaW50JiBE KSB7CiAgCiAgVmVjdG9yIENBKEMsQSksQ0IoQyxCKSxEQShELEEpLERCKEQsQikgOwogIENBLnoo KSA9IDAuMCA7IENCLnooKSA9IDAuMCA7IERBLnooKSA9IDAuMCA7IERCLnooKSA9IDAuMCA7CiAg cmV0dXJuIChDQV5DQikqKERBXkRCKSA8PSAwICYmIChDQV5EQSkqKENCXkRCKSA8IDAgOwp9Ci8v X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KCkJyYW5jaFNldEJ1aWxkZXI6OkJyYW5jaFNldEJ1aWxkZXIo Y29uc3QgVE5ldCogdG5ldCkgewoKICB0bmV0XyA9IHRuZXQgOwogIG11bHRpVmFsdWVkXyA9IHRy dWUgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkJyYW5jaFNldEJ1aWxkZXI6On5CcmFuY2hT ZXRCdWlsZGVyKCkgewoKICBjbGVhblVwKCkgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8v Ci8vIFB1cnBvc2U6IGlzIGl0IHBvc3NpYmxlIHRvIHByb3BhZ2F0ZSB0aGlzIGJyYW5jaCBmcm9t IGNlbGwgJ3QnIGluCi8vICAgICAgICAgIGRpcmVjdGlvbiBvZiBlZGdlICdlJyA/Cgpib29sIEJy YW5jaFNldEJ1aWxkZXI6OnByb3BhZ2F0ZUJyYW5jaChCcmFuY2gqIGIsY29uc3QgVE5DZWxsKiB0 LGNvbnN0IFRORWRnZSAqZSkgewoKICBjb25zdCBQb2ludCYgcDEgPSBnZXRQb2ludCh0LT5nZXRB cGV4KDApLT5nZXRBcGV4SWQgKCkpIDsKICBjb25zdCBQb2ludCYgcDIgPSBnZXRQb2ludCh0LT5n ZXRBcGV4KDEpLT5nZXRBcGV4SWQgKCkpIDsKICBjb25zdCBQb2ludCYgcDMgPSBnZXRQb2ludCh0 LT5nZXRBcGV4KDIpLT5nZXRBcGV4SWQgKCkpIDsKCiAgUG9pbnQgSSgocDEueCgpICsgcDIueCgp ICsgcDMueCgpKS8zLChwMS55KCkgKyBwMi55KCkgKyBwMy55KCkpLzMsMC4wKSA7CgogIC8vIEdl dHMgdGhlIG5ldyBjZWxsLCBzaGFyaW5nIGVkZ2UgJ2UnIHdpdGggJ3QnLiBBbmQgY2hlY2sgd2hl dGhlciB0aGUKICAvLyBjZWxsIGlzICd0dXJuaW5nIGJhY2snLgogIAogIGNvbnN0IFROQ2VsbCAq bmIgPSAoZS0+Z2V0V2luZygwKSA9PSB0ID8gZS0+Z2V0V2luZygxKSA6IGUtPmdldFdpbmcoMCkp IDsKCiAgY29uc3QgVE5BcGV4ICphcGV4UyAgPSBuYi0+YXBleEZhY2luZ0VkZ2UoZSkgOwogIGNv bnN0IFROQXBleCAqYXBleE8xID0gZS0+Z2V0QXBleCgwKSA7CiAgY29uc3QgVE5BcGV4ICphcGV4 TzIgPSBlLT5nZXRBcGV4KDEpIDsKCiAgY29uc3QgUG9pbnQgJlMgID0gZ2V0UG9pbnQoYXBleFMt PmdldEFwZXhJZCAoKSkgOwogIGNvbnN0IFBvaW50ICZPMSA9IGdldFBvaW50KGFwZXhPMS0+Z2V0 QXBleElkKCkpIDsKICBjb25zdCBQb2ludCAmTzIgPSBnZXRQb2ludChhcGV4TzItPmdldEFwZXhJ ZCgpKSA7CgogIFZlY3RvciBTTzEoUyxPMSksU08yKFMsTzIpLElPMShJLE8xKSxJTzIoSSxPMikg OwogIFNPMS56KCkgPSAwLjAgOyBTTzIueigpID0gMC4wIDsgIElPMS56KCkgPSAwLjAgOyBJTzIu eigpID0gMC4wIDsKICAKICBpZiggKFNPMV5TTzIpKihJTzFeSU8yKSA+PSAwICkgcmV0dXJuIGZh bHNlIDsKCiAgLy8gaWYgbXVsdGktdmFsdWVkIGJyYW5jaGVzIGFyZSBub3QgYWxsb3dlZCwgY2hl Y2tzIHRoZSBpbnRlcnNlY3Rpb24gd2l0aAogIC8vIGFsbCBlZGdlcyBvZiB0aGUgYnJhbmNoJ3Mg Ym91bmRhcnkgKHRoaXMgaXMgdGhlIG1vc3QgdGltZS1jb25zdW1pbmcKICAvLyBhbmQgd2lsbCBo YXZlIHRvIGJlIGltcHJvdmVkLgogIAogIGlmKCAhbXVsdGlWYWx1ZWQoKSApIHsKCiAgICBjb25z dCBCcmFuY2hCb3VuZGFyeSAqYm91bmRhcnkgPSBiLT5nZXRCb3VuZGFyeSgpIDsKICAgIEJyYW5j aEJvdW5kYXJ5Ojpjb25zdF9pdGVyYXRvciBpdCA7CgogICAgZm9yKGl0ID0gYm91bmRhcnktPmJl Z2luKCkgOyBpdCAhPSBib3VuZGFyeS0+ZW5kKCkgOyBpdCsrKSB7CiAgICAgIGNvbnN0IFRORWRn ZSAqZSA9ICppdCA7CiAgICAgIGNvbnN0IFROQXBleCAqYXBleE8xMSA9IGUtPmdldEFwZXgoMCks ICphcGV4TzIyID0gZS0+Z2V0QXBleCgxKSA7CiAgICAgIGlmKCBpbnRlcnNlY3QoTzEsCgkJICAg IFMsCgkJICAgIGdldFBvaW50KGFwZXhPMTEtPmdldEFwZXhJZCgpKSwKCQkgICAgZ2V0UG9pbnQo YXBleE8yMi0+Z2V0QXBleElkKCkpKSB8fAogICAgICAgICAgaW50ZXJzZWN0KE8yLAoJCSAgICBT LAoJCSAgICBnZXRQb2ludChhcGV4TzExLT5nZXRBcGV4SWQoKSksCgkJICAgIGdldFBvaW50KGFw ZXhPMjItPmdldEFwZXhJZCgpKSkgKSB7CglicmVhayA7CiAgICAgIH0KICAgIH0KICAgIHJldHVy biBpdCA9PSBib3VuZGFyeS0+ZW5kKCkgOwogIH0KICByZXR1cm4gdHJ1ZSA7Cn0KLy9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBidWlsZHMgYSBuZXcgYnJhbmNoIGBicmFuY2gn LgoKdm9pZCBCcmFuY2hTZXRCdWlsZGVyOjpidWlsZEJyYW5jaChCcmFuY2gqIGJyYW5jaCkgewoK ICBCcmFuY2hCb3VuZGFyeSogYm91bmRhcnkgPSBjb25zdF9jYXN0PEJyYW5jaEJvdW5kYXJ5Kj4o YnJhbmNoLT5nZXRCb3VuZGFyeSgpKSA7CgogIHN0YWNrPGNvbnN0IFROQ2VsbCo+IGdhbW1hIDsK ICBnYW1tYS5wdXNoKGJyYW5jaC0+Z2V0U2VlZCgpKSA7CgogIC8vIFdoaWxlIHRoZXJlIGFyZSBj ZWxscyB0byBhZGQgLi4uLgogIAogIHdoaWxlKCAhZ2FtbWEuZW1wdHkoKSApIHsKCiAgICBjb25z dCBUTkNlbGwgKnQgPSBnYW1tYS50b3AoKSA7CiAgICBnYW1tYS5wb3AoKSA7CgogICAgLy8gR2V0 cyB0aGUgY2VsbCB0byBiZSBoYW5kbGVkLCBhbmQgZm9yIGVhY2ggb2YgaXRzIG5laWdoYm91cnMg bm90IGFscmVhZHkKICAgIC8vIHBhcnQgb2YgYSBicmFuY2gsIHRyaWVzIHRvIHByb3BhZ2F0ZSB0 aGUgYnJhbmNoIGluIGl0cyBkaXJlY3Rpb24uCiAgICAKICAgIGZvcihpbnQgaSA9IDAgOyBpIDwg MyA7IGkrKykgewogICAgICBUTkNlbGwgKm5laWdoYm91ciA9IHQtPmdldE5laWdoYm91cihpKSA7 CiAgICAgIGlmKCBuZWlnaGJvdXIgKSB7CgoJVE5FZGdlICpzaGFyZWRFZGdlID0gdC0+Z2V0RWRn ZShpKSA7CglCcmFuY2ggKm93bmVyIDsgCglpZiggKG93bmVyID0gZmluZEJyYW5jaE93bmluZyhu ZWlnaGJvdXIpKSA9PSAwICkgewoKCSAgaWYoIHByb3BhZ2F0ZUJyYW5jaChicmFuY2gsdCxzaGFy ZWRFZGdlKSApIHsKCSAgICAvLyBJZiB0aGUgcHJvcGFnYXRpb24gaXMgc3VjY2Vzc2Z1bGwsIGFk ZHMgdGhlIGNlbGwgaW50byB0aGUKCSAgICAvLyBicmFuY2ggYmVpbmcgYnVpbHQgYW5kIHB1c2hl ZCB0aGUgY2VsbCBpbnRvIHRoZSBzdGFjay4KCSAgICBhZGRJbkJyYW5jaChicmFuY2gsbmVpZ2hi b3VyKSA7CgkgICAgZ2FtbWEucHVzaChuZWlnaGJvdXIpIDsKCgkgICAgZm9yKGludCBqID0gMCA7 IGogPCAzIDsgaisrKSB7CgkgICAgICBjb25zdCBUTkVkZ2UgKmJvcmRlckVkZ2UgPSBuZWlnaGJv dXItPmdldEVkZ2UoaikgOwoJICAgICAgaWYoIGJvcmRlckVkZ2UgIT0gc2hhcmVkRWRnZSApIHsK CQlib3VuZGFyeS0+YWRkRWRnZShib3JkZXJFZGdlKSA7CgkgICAgICB9CgkgICAgfQoJICAgIC8v IFJlbW92ZXMgdGhlIHNoYXJlZCBlZGdlIGZyb20gdGhlIGJvdW5kYXJ5LCBzaW5jZSB0aGUgYnJh bmNoCgkgICAgLy8gaGFzIGJlZW4gZW5sYXJnZWQgYmV5b25kIGl0IC4uLgoJICAgIGJvdW5kYXJ5 LT5yZW1FZGdlKHNoYXJlZEVkZ2UpIDsKCSAgfQoJfQoJZWxzZSBpZiggb3duZXIgPT0gYnJhbmNo KSB7CgkgIGJvdW5kYXJ5LT5yZW1FZGdlKHNoYXJlZEVkZ2UpIDsKCX0KICAgICAgfQogICAgfQog IH0KfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCgp2b2lkIEJyYW5jaFNldEJ1aWxkZXI6OmJ1aWxk KEJyYW5jaFNldCYgYnJzZXQpIHsKCiAgYnJzZXQuY2xlYW5VcCgpIDsKICBmb3IoaXRlcmF0b3Ig aSA9IGJlZ2luKCkgOyBpICE9IGVuZCgpIDsgaSsrKSB7CiAgICBicnNldC5hZGRCcmFuY2goKmkp IDsKICB9Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKdm9pZCBCcmFuY2hTZXRCdWlsZGVyOjpj bGVhblVwKCkgewoKICBmb3IoaXRlcmF0b3IgaSA9IGJlZ2luKCkgOyBpICE9IGVuZCgpIDsgaSsr KSB7CiAgICBCcmFuY2ggKmIgPSAqaSA7CiAgICBkZWxldGUgYiA7CiAgfQogIGJyYW5jaGVzXy5j bGVhcigpIDsKICB0cmlhbmdsZU1hcF8uY2xlYXIoKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CgovLwovLyBQdXJwb3NlOiBidWlsZHMgdGhlIHNldCBvZiBicmFuY2hlcyBgYnJzZXQnLCB1c2lu ZyB0aGUgZ2VvbWV0cnkgb2YKLy8gICAgICAgICAgcG9pbnRzIGBwb2ludHMnLgoKYm9vbCBCcmFu Y2hTZXRCdWlsZGVyOjpidWlsZEZyb20oQnJhbmNoU2V0JiBicnNldCxjb25zdCBQb2ludHMmIHBv aW50cykgewoKICAvLyBDaGVja3MgaGVyZSB0aGUgdmFsaWRpdHkgb2YgJ3BvaW50cycgKC5pLiBp dHMgc2l6ZSByZWdhcmRpbmcgdGhlIGdyaWQKICAvLyBzaXplKQogIC8vIC4uLgogIHBvaW50c18g PSAmcG9pbnRzIDsKICBmb3IoVE5ldDo6Y29uc3RfaXRlcmF0b3IgbWkgPSB0bmV0Xy0+YmVnaW4o KSA7CiAgICAgIG1pICE9IHRuZXRfLT5lbmQoKSA7CiAgICAgIG1pKyspIHsKICAgIC8vIElmIHRo aXMgY2VsbCBpcyBhbHJlYWR5IGluIG9uZSBicmFuY2gsIGNvbnRpbnVlcyB3aXRoIHRoZQogICAg Ly8gbmV4dCBjZWxsLgogICAgVE5DZWxsICp0ciA9ICptaSA7CiAgICBpZiggZmluZEJyYW5jaE93 bmluZyh0cikgIT0gMCApIHsKICAgICAgY29udGludWUgOwogICAgfQogICAgLy8gSWYgbm90LCBh dHRlbXB0cyB0byBwcm9wYWdhdGUgdGhpcyBicmFuY2guCiAgICBCcmFuY2ggKmJyID0gbmV3QnJh bmNoKHRyKSA7CiAgICBidWlsZEJyYW5jaChicikgOwogIH0KICAvLyBSZW1vdmUgdGlueSBicmFu Y2hlcyAmIHJlLWludGVncmF0ZSB0aGVtIChhbm90aGVyIGNsYXNzIGNvdWxkIGFsc28gYmUgdXNl ZAogIC8vIGZvciBwb3N0LXByb2Nlc3NpbmcgYnJhbmNoZXMuCgogIGJ1aWxkKGJyc2V0KSA7CiAg Y2xlYW5VcCgpICAgIDsKICByZXR1cm4gdHJ1ZSAgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoK QnJhbmNoU2V0OjpCcmFuY2hTZXQoKSA6IGJyYW5jaGVzXygpLCBtYW5hZ2VCcmFuY2hlc18odHJ1 ZSkgewoKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpCcmFuY2hTZXQ6On5CcmFuY2hTZXQoKSB7 CgogIGNsZWFuVXAoKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoU2V0OjpCcmFu Y2hTZXQoY29uc3QgQnJhbmNoU2V0JiBicnNldCkgewoKICAqdGhpcyA9IGJyc2V0IDsKfQovL19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KCkJyYW5jaFNldCYgQnJhbmNoU2V0OjpvcGVyYXRvciA9KGNvbnN0 IEJyYW5jaFNldCYgYnJzZXQpIHsKCiAgaWYoIHRoaXMgIT0gJmJyc2V0ICkgewogICAgY2xlYW5V cCgpIDsKICAgIGZvcihjb25zdF9pdGVyYXRvciBpID0gYnJzZXQuYmVnaW4oKSA7IGkgIT0gYnJz ZXQuZW5kKCkgOyBpKyspIHsKICAgICAgYWRkQnJhbmNoKCppKSA7CiAgICB9CiAgfQogIHJldHVy biAqdGhpcyA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgp2b2lkIEJyYW5jaFNldDo6Y2xlYW5V cCgpIHsKCiAgaWYoIG1hbmFnZUJyYW5jaGVzKCkgKSB7CiAgICBmb3IoaXRlcmF0b3IgaSA9IGJl Z2luKCkgOyBpICE9IGVuZCgpIDsgaSsrKSB7CiAgICAgIEJyYW5jaCAqYiA9IGNvbnN0X2Nhc3Q8 QnJhbmNoKj4oKmkpIDsKICAgICAgZGVsZXRlIGIgOwogICAgfQogIH0KICBicmFuY2hlc18uY2xl YXIoKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoSW50ZWdyYXRlcjo6QnJhbmNo SW50ZWdyYXRlcigpIHsKCiAgaW5PbmVQYXNzXyA9IGZhbHNlOwp9Ci8vX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KCkJyYW5jaEludGVncmF0ZXI6On5CcmFuY2hJbnRlZ3JhdGVyKCkgewoKfQovL19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KCnZvaWQgQnJhbmNoSW50ZWdyYXRlcjo6YnJhbmNoZXNUb0JlSW50ZWdy YXRlZChjb25zdCBCcmFuY2hTZXQmLGxpc3Q8QnJhbmNoKj4mIGJycykgewoKICBicnMuY2xlYXIo KSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoKiBCcmFuY2hJbnRlZ3JhdGVyOjpi cmFuY2hGb3JJbnRlZ3JhdGluZyhjb25zdCBCcmFuY2hTZXQmLGNvbnN0IEJyYW5jaCopIHsKCiAg cmV0dXJuIDAgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6IHN0YXJ0 aW5nIGZyb20gYW4gaW5pdGlhbCBzZXQgb2YgYnJhbmNoZXMgYHNyYycsIGNyZWF0ZXMgYSBuZXcK Ly8gICAgICAgICAgc2V0IG9mIGJyYW5jaGVzIG9uIG91dHB1dC4gVHdvIHZpcnR1YWwgbWV0aG9k cwovLyAgICAgICAgICAnYnJhbmNoZXNUb0JlSW50ZWdyYXRlZCcgJiBgYnJhbmNoRm9ySW50ZWdy YXRpbmcnIGhhdmUgdG8gYmUKLy8gICAgICAgICAgcmUtZGVmaW5lZCBieSBjaGlsZCBjbGFzc2Vz LgoKdm9pZCBCcmFuY2hJbnRlZ3JhdGVyOjpydW4oY29uc3QgQnJhbmNoU2V0JiBzcmMsQnJhbmNo U2V0JiBkc3QpIHsKCiAgLy8gR2V0cyB0aGUgaW5pdGlhbCBzZXQgb2YgYnJhbmNoZXMgdG8gYmUg cmUtaW50ZWdyYXRlZCBpbiBgdG9SZWludGVncmF0ZScKCiAgZHN0ID0gc3JjIDsKICBsaXN0PEJy YW5jaCo+IHRvUmVpbnRlZ3JhdGUgOwogIGJyYW5jaGVzVG9CZUludGVncmF0ZWQoZHN0LHRvUmVp bnRlZ3JhdGUpIDsKCiAgLy8gV2hpbGUgdGhlcmUgYXJlIHN0aWxsIGJyYW5jaGVzIHRvIGJlIGlu dGVncmF0ZWQsIHNjYW5zIHRob3NlIGJyYW5jaGVzCiAgLy8gYW5kIGZvciBlYWNoIG9mIHRoZW0s IGxvb2sgZm9yIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGJyYW5jaCBmb3IgbWVyZ2luZwogIAogIHdo aWxlKCB0b1JlaW50ZWdyYXRlLnNpemUoKSA+IDAgKSB7CiAgICBmb3IobGlzdDxCcmFuY2gqPjo6 aXRlcmF0b3IgaSA9IHRvUmVpbnRlZ3JhdGUuYmVnaW4oKSA7CglpICE9IHRvUmVpbnRlZ3JhdGUu ZW5kKCkgOwoJaSsrKSB7CiAgICAgIC8vIExvb2sgZm9yIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGJy YW5jaCBmb3IgaW50ZWdyYXRpbmcgYHRvQmVJbnRlZ3JhdGVkJwogICAgICAvLyBpbnRvLgogICAg ICBCcmFuY2ggKnRvQmVJbnRlZ3JhdGVkID0gKmkgOwogICAgICBCcmFuY2ggKmJyID0gYnJhbmNo Rm9ySW50ZWdyYXRpbmcoZHN0LHRvQmVJbnRlZ3JhdGVkKSA7CiAgICAgIC8vIElmIHRoaXMgYnJu YWNoIGRvZXMgZXhpc3QsIGNhbGxzIEJyYW5jaDo6aW50ZWdyYXRlIGFuZCByZW1vdmVzCiAgICAg IC8vIGB0b0JlSW50ZWdyYXRlZCcgZnJvbSB0aGUgbGlzdCBvZiBicmFuY2hlcyB0byBiZSBpbnRl Z3JhdGVkLgogICAgICBpZiggYnIgJiYgYnIgIT0gdG9CZUludGVncmF0ZWQgKSB7Cglici0+aW50 ZWdyYXRlKHRvQmVJbnRlZ3JhdGVkKSA7Cglkc3QucmVtQnJhbmNoKHRvQmVJbnRlZ3JhdGVkKSA7 CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZSByZS1pbnRlZ3JhdGlvbiB3b3JrcyBpbiBvbmx5 IG9uZSBwYXNzLCBjbGVhcnMgdGhlIGxpc3QsCiAgICAvLyBvdGhlcndpc2Ugc3RhcnRzIGFsbCBv dmVyIGFnYWluIC4uLi4KICAgIGlmKCBpbk9uZVBhc3NfICkgdG9SZWludGVncmF0ZS5jbGVhcigp IDsKICAgIGVsc2UgICAgICAgICAgICAgYnJhbmNoZXNUb0JlSW50ZWdyYXRlZChkc3QsdG9SZWlu dGVncmF0ZSkgOwogIH0KfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KClRpbnlCcmFuY2hSZW1vdmVy OjpUaW55QnJhbmNoUmVtb3ZlcigpIDogQnJhbmNoSW50ZWdyYXRlcigpIHsKCiAgcmVtb3ZhbFJh dGlvXyA9IDAuMSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKVGlueUJyYW5jaFJlbW92ZXI6 On5UaW55QnJhbmNoUmVtb3ZlcigpIHsKCn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKU3BDb29y ZCBUaW55QnJhbmNoUmVtb3Zlcjo6Y29tcHV0ZU1heEFyZWEoY29uc3QgQnJhbmNoU2V0JiBic2V0 KSB7CiAgCiAgU3BDb29yZCBtYXhfYXJlYSA9IDAuMDAgOwogIGZvcihCcmFuY2hTZXQ6OmNvbnN0 X2l0ZXJhdG9yIGkgPSBic2V0LmJlZ2luKCkgOyBpICE9IGJzZXQuZW5kKCkgOyBpKyspIHsKICAg IFNwQ29vcmQgYXJlYSA9ICgqaSktPmFyZWEoKSA7CiAgICBpZiggYXJlYSA+IG1heF9hcmVhICkg bWF4X2FyZWEgID0gYXJlYSA7CiAgfQogIHJldHVybiBtYXhfYXJlYSA7Cn0KLy9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCgovLwovLyBQdXJwb3NlOiBnZXRzIHRoZSBicmFuY2hlcyB0byBiZSByZS1pbnRl Z3JhdGVkIGZyb20gdGhlIGxpc3Qgb2YKLy8gICAgICAgICAgYnJhbmNoZXMgYGJzZXQnLiBUaGUg ZGVjaXNpb24gaXMgdGFrZW4gYmFzZWQgb24gdGhlIHNpemUgb2YKLy8gICAgICAgICAgZWFjaCBi cmFuY2ggcmVnYXJkaW5nIHRoZSBzaXplIG9mIHRoZSBncmVhdGVzdCBvbmUgKHNpemUgaXMKLy8g ICAgICAgICAgY2FsY3VsYXRlZCBpbiB0ZXJtcyBvZiBudW1iZXIgb2YgY2VsbHMpLgoKdm9pZCBU aW55QnJhbmNoUmVtb3Zlcjo6YnJhbmNoZXNUb0JlSW50ZWdyYXRlZChjb25zdCBCcmFuY2hTZXQm IGJzZXQsCgkJCQkJICAgICAgIGxpc3Q8QnJhbmNoKj4mIHRvUmVpbnRlZ3JhdGUpIHsKCiAgU3BD b29yZCBtYXhfYXJlYSA9IGNvbXB1dGVNYXhBcmVhKGJzZXQpIDsKICB0b1JlaW50ZWdyYXRlLmNs ZWFyKCk7CiAgCiAgZm9yKEJyYW5jaFNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBic2V0LmJlZ2lu KCkgOyBpdCAhPSBic2V0LmVuZCgpIDsgaXQrKykgewogICAgCiAgICBpZiggKCppdCktPmFyZWEo KS9tYXhfYXJlYSA8IGdldFJlbW92YWxSYXRpbygpICkgewogICAgICB0b1JlaW50ZWdyYXRlLnB1 c2hfYmFjayhjb25zdF9jYXN0PEJyYW5jaCo+KCppdCkpIDsKICAgIH0KICB9Cn0KLy9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBmaW5kIHRoZSBsYXJnZXN0IGJyYW5jaCAtLSBp LmUgdGhhdCBvZiB0aGUgZ3JlYXRlc3QgYXJlYQovLyAgICAgICAgICBhZGphY2VudCB0byAnYnIn IC0tIGFuZCByZXR1cm5zIGl0LgoKQnJhbmNoKiBUaW55QnJhbmNoUmVtb3Zlcjo6YnJhbmNoRm9y SW50ZWdyYXRpbmcoY29uc3QgQnJhbmNoU2V0JiBic2V0LAoJCQkJCQljb25zdCBCcmFuY2gqIGJy KSB7CgogIEJyYW5jaCAqdGhlQnJhbmNoID0gMCA7CiAgU3BDb29yZCBtYXhBcmVhID0gMC4wIDsK ICAKICBmb3IoQnJhbmNoU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGJzZXQuYmVnaW4oKSA7IGl0 ICE9IGJzZXQuZW5kKCkgOyBpdCsrKSB7CiAgICBjb25zdCBCcmFuY2ggKnRvQ2hlY2sgPSAqaXQg OwogICAgU3BDb29yZCB0aGVBcmVhIDsKICAgIGlmKCB0b0NoZWNrICE9IGJyICYmCgl0b0NoZWNr LT5hZGphY2VudFRvKGJyKSAmJgoJKHRoZUFyZWEgPSB0b0NoZWNrLT5hcmVhKCkpID4gbWF4QXJl YSApIHsKICAgICAgdGhlQnJhbmNoID0gY29uc3RfY2FzdDxCcmFuY2gqPih0b0NoZWNrKSA7CiAg ICAgIG1heEFyZWEgPSB0aGVBcmVhIDsKICAgIH0KICB9CiAgcmV0dXJuIHRoZUJyYW5jaCA7Cn0K Ly9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCgppbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikgewoK ICAgcmV0dXJuIDAgOwp9Cg==