Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
1A8B1EFE1698A9CCBA2427303AECA7ED4C2B10D19F262AF3F2669FB5E3CEDE51
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
93,017,462
Requested gas limit
GAS USED
61,344,918
Gas consumed
FEE
93018ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp100000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpLqAgoML3ZtLm1fYWRkcGtnEoDqAgooZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcBLC6QIKBWhsZ292Ejlnbm8ubGFuZC9yL2cxemRhejZzeXBrNXRkc2pjMmZ6c3Fycm40dHRuOHF6bW5sNHdhcXAvaGxnb3YaYAoLZ25vbW9kLnRvbWwSUW1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxemRhejZzeXBrNXRkc2pjMmZ6c3Fycm40dHRuOHF6bW5sNHdhcXAvaGxnb3YiCmdubyA9ICIwLjkiChr25wIKCWhsZ292LmdubxLn5wIvLyBQYWNrYWdlIGhsZ292IGNhcnJpZXMgR292REFPJ3MgZGVjaXNpb25zIHRvIFNvbGFuYSAoYnJpZGdlL1BMQU4ubWQgwqc1LjMsIMKnNi41LCDCpzEzKTogYSBwcm9wb3NhbCBtYWRlIHdpdGggb25lIG9mCi8vIHRoZSBidWlsZGVycyBiZWxvdywgd2hlbiBpdCBleGVjdXRlcywgZGlzcGF0Y2hlcyBhIG1lc3NhZ2UgdGhyb3VnaCByL2hsbWFpbGJveCB0byB0aGUgYWRtaW4gcHJvZ3JhbSDigJQgdGhlCi8vIGRlY2lzaW9uJ3Mga2luZCwgaXRzIHBhcmFtZXRlcnMgYW5kIGl0cyBzZXF1ZW5jZSBudW1iZXIgKHRoaXMgcmVhbG0ncyBvd24gY291bnRlciwgdGFrZW4gYXQgZXhlY3V0aW9uKSDigJQgYW5kIHRoZQovLyBhZG1pbiBwcm9ncmFtIHJlY29yZHMgaXQgYnkgdGhhdCBudW1iZXIgYW5kIGV4ZWN1dGVzIGl0IGFmdGVyIGl0cyBjbG9jay4gQW55b25lIG1heSByZS1kaXNwYXRjaCBhbiBleGVjdXRlZAovLyBkZWNpc2lvbiAodGhlIHNhbWUgbnVtYmVyIGFuZCBwYXJhbWV0ZXJzKSB1bnRpbCB0aGUgYWRtaW4gcHJvZ3JhbSBoYXMgcmVjb3JkZWQgaXQuIFRoZSBidWlsZGVycyBjaGVjayB0aGUKLy8gcGFyYW1ldGVycyB3aXRoIHRoZSBhZG1pbiBwcm9ncmFtJ3Mgb3duIHJ1bGVzLCBzbyBhIHByb3Bvc2FsIHRoYXQgd291bGQgZmFpbCBvbiBTb2xhbmEgaXMgcmVmdXNlZCB3aGVuIGl0IGlzIG1hZGUuCi8vIEtpbmQgNCBpcyByZXNlcnZlZCBhbmQgaXRzIGJ1aWxkZXIgcmVmdXNlcyBldmVyeSBjYWxsICjCpzEzKTsgYSBjYW5jZWwncyBib2R5IHN0YXJ0cyB3aXRoIGFuIDgtYnl0ZSBzYWx0IGRyYXduIGluCi8vIHRoZSBleGVjdXRpbmcgdHJhbnNhY3Rpb24sIHNvIHR3byBjYW5jZWxzIG9mIG9uZSBsaXN0IGRpZmZlcjsga2luZCAxMiBuYW1lcyBhIHRva2VuJ3MgbWludCBsaW1pdHMgb24gdGhlIHBhdXNhYmxlCi8vIElTTSAodGhlIHBlci1tZXNzYWdlIG1heGltdW0gYW5kIHRoZSBkYXkgY2FwLCBpbiBiYXNlIHVuaXRzKSwgb25lIG9mIHRoZSA3LWRheSBncm91cC4KLy8KLy8gVHdvIGRlY2lzaW9ucyBjaGFuZ2UgdGhpcyByZWFsbSBhbG9uZTogYHNldCBkZWNpc2lvbiByZWNpcGllbnRgICh0aGUgcHJvZ3JhbSBpZCBkZWNpc2lvbnMgZ28gdG8sIGEgNy1kYXkgY2hhbmdlLAovLyBob3cgYSBzdWNjZXNzb3IgYWRtaW4gcHJvZ3JhbSBldmVyIHJlY2VpdmVzIG9uZSkgYW5kIGBzeW5jIHNlcXVlbmNlYCAoYXQgb25jZTogdGhlIGNvdW50ZXIgaXMgcmFpc2VkIOKAlCBuZXZlcgovLyBsb3dlcmVkIOKAlCB0byB0aGUgbnVtYmVyIHRoZSBhZG1pbiBwcm9ncmFtIGV4cGVjdHMgbmV4dCwgd2hlbiBhIGZvcmVpZ24gZGVjaXNpb24gaGFzIHRha2VuIG9uZSwgwqc2LjUpLiBUaGUgY291bnRlcgovLyBzdGFydHMgYXQgYSBjb21waWxlZCBudW1iZXIgKGxhdW5jaFNlcXVlbmNlOiAwIGZvciBhIGNoYWluJ3MgZmlyc3Qgci9obGdvdiwgdGhlIHByZWRlY2Vzc29yJ3MgbGFzdCBudW1iZXIgZm9yIGEKLy8gc3VjY2Vzc29yKSwgc28gbm8gbnVtYmVyIHRoZSBhZG1pbiBwcm9ncmFtIHJlY29yZGVkIGlzIGV2ZXIgcmV1c2VkLiBCZWZvcmUgdGhlIExhdW5jaCBkZWNpc2lvbiBldmVyeSBidWlsZGVyCi8vIGJ1dCB0aGUgY2FuY2VsIG9mIGEgcXVldWVkIGNoYW5nZSBoZXJlIGlzIHJlZnVzZWQuIFdobyBkZWNpZGVzIGlzIHRoZSBnb3Zlcm5vcidzIChNMWspOiB0aGUgY29tcGlsZWQKLy8gbGF1bmNoR292ZXJub3IgdGhyb3VnaCBHb3Zlcm4gdW50aWwgaXQgeWllbGRzIG9uIHIvaGxtYWlsYm94LCBHb3ZEQU8ncyBwcm9wb3NhbHMgYWZ0ZXIuIEV2ZXJ5IGxhdW5jaCB2YWx1ZSBpcwovLyBjb21waWxlZCBpbiBiZWxvdy4KcGFja2FnZSBobGdvdgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvYmluYXJ5IgoJImVuY29kaW5nL2hleCIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9nMXpkYXo2c3lwazV0ZHNqYzJmenNxcnJuNHR0bjhxem1ubDR3YXFwL2RlY2lzaW9ucy92MCIKCWhsICJnbm8ubGFuZC9wL2cxemRhejZzeXBrNXRkc2pjMmZ6c3Fycm40dHRuOHF6bW5sNHdhcXAvaHlwZXJsYW5lL3YwIgoJImduby5sYW5kL3IvZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcC9obGJ1YmJsZSIKCSJnbm8ubGFuZC9yL2cxemRhejZzeXBrNXRkc2pjMmZ6c3Fycm40dHRuOHF6bW5sNHdhcXAvaGxnbm90IgoJImduby5sYW5kL3IvZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcC9obG1haWxib3giCgkiZ25vLmxhbmQvci9nb3YvZGFvIgopCgpjb25zdCAoCgluYW1lc3BhY2UgPSAiZ25vLmxhbmQvci9nMXpkYXo2c3lwazV0ZHNqYzJmenNxcnJuNHR0bjhxem1ubDR3YXFwLyIKCXBrZ1BhdGggICA9IG5hbWVzcGFjZSArICJobGdvdiIgLy8gbXVzdCBtYXRjaCBnbm9tb2QudG9tbAoKCS8vIFRoZSBraW5kcyAowqcxMykuCglLaW5kQ2FuY2VsICAgICAgID0gdWludDgoMSkKCUtpbmRVbnBhdXNlICAgICAgPSB1aW50OCgyKQoJS2luZFRva2VuSVNNICAgICA9IHVpbnQ4KDMpCglLaW5kUmVzZXJ2ZWQgICAgID0gdWludDgoNCkgLy8gcmVzZXJ2ZWQgKMKnMTMpOiB0aGUgY2xpZW50J3Mgc3RhdGUgbGF5b3V0IGlzIGZpeGVkIGZvciB0aGUgZGVwbG95bWVudCdzIGxpZmU7IHJlZnVzZWQKCUtpbmRHdWFyZGlhbnMgICAgPSB1aW50OCg1KQoJS2luZFJvdXRlciAgICAgID0gdWludDgoNikKCUtpbmRQcm90b2NvbEZlZSA9IHVpbnQ4KDcpCglLaW5kVXBncmFkZSAgICAgPSB1aW50OCg4KQoJS2luZFN1Y2Nlc3NvciAgID0gdWludDgoOSkKCUtpbmRNaW50TGltaXRzICA9IHVpbnQ4KDEyKSAvLyBzZXQgbWludCBsaW1pdHMgKMKnMTMpOiBhIHRva2VuJ3MgcGVyLW1lc3NhZ2UgbWF4aW11bSBhbmQgZGF5IGNhcCBvbiB0aGUgcGF1c2FibGUgSVNNOyB0aGUgNy1kYXkgZ3JvdXAKCgltYXhDYW5jZWwgICAgICA9IDE2ICAgICAgICAgLy8gbnVtYmVycyBvbmUgY2FuY2VsIG5hbWVzCgltYXhQcm90b2NvbEZlZSA9IDUwXzAwMF8wMDAgLy8gbGFtcG9ydHM6IHRoZSBtYWlsYm94J3MgbWF4X3Byb3RvY29sX2ZlZSwgMC4wNSBTT0wsIGZpeGVkIGF0IGl0cyBpbml0ICjCpzUuNSkKCS8vIE1heERlY2lzaW9uQm9keSBib3VuZHMgYSBkZWNpc2lvbidzIGJvZHkgKGtpbmQg4oCWIG51bWJlciDigJYgcGFyYW1zKSBhdCB3aGF0IFNvbGFuYSBjYW4gZXZlciBkZWxpdmVyICh0aGUKCS8vIGFzc3VtcHRpb25zIGF1ZGl0J3MgRjE4LCBNMWcgcGFydCAyKTogYSBsZWdhY3kgZGVsaXZlcnkgb2YgYSBkZWNpc2lvbiBjYXJyaWVzIGF0IG1vc3QgNTM4IGJ5dGVzIG9mIGJvZHkg4oCUIDUyOQoJLy8gb2YgcGFyYW1ldGVycywgd2hhdCAxNCBhY2NvdW50IGtleXMgYW5kIDEyNyBieXRlcyBvZiBmaXhlZCBpbnN0cnVjdGlvbiBkYXRhIGxlYXZlIG9mIHRoZSAxLDIzMi1ieXRlIHBhY2tldCDigJQKCS8vIGFuZCBIeXBlcmxhbmUncyBtYWlubmV0IG1haWxib3ggZGllcyBvbiBpdHMgb3duIDMyIEtCIGhlYXAgcGFzdCBhYm91dCAyLDI1MCBwYXJhbWV0ZXIgYnl0ZXMgYW55d2F5IChNMi1OT1RFUwoJLy8gTTJmKSwgc28gYSBib2R5IG5vIG9uZSBjYW4gZGVsaXZlciB3b3VsZCBzdGljayB0aGlzIHJlYWxtJ3Mgc2VxdWVuY2Ugd2l0aCBpdHMgbnVtYmVyIHVudGFrZW4sIGluIGEgZm9ybSBubwoJLy8gcHJvZ3JhbSBvZiBvdXJzIGN1cmVzLiBFdmVyeSBidWlsZGVyJ3MgYm9keSBpcyBmYXIgYmVsb3cgKGEgY2FuY2VsIGF0IG1vc3QgMTYzIGJ5dGVzIHdpdGggaXRzIHNhbHQsIGtpbmQgNSBhdAoJLy8gbW9zdCA0IGVudHJpZXMpOyB0aGUgYm91bmQgc3RhbmRzIHdoZXJlIHRoaXMgcmVhbG0gZGlzcGF0Y2hlcywgY2hlY2tlZCB3aGVuIGEgcHJvcG9zYWwgaXMgbWFkZSBhbmQgaW4gaXRzCgkvLyBjbG9zdXJlLgoJTWF4RGVjaXNpb25Cb2R5ID0gNTEyCglzeW5jUmVhY2ggICAgICA9IHVpbnQ2NCgxKSA8PCAzMiAvLyBhIHN5bmMgc2VxdWVuY2UgcmFpc2VzIHRoZSBjb3VudGVyIGJ5IGF0IG1vc3QgdGhpcyAodGhlIHJlYWxtJ3Mgb3duIGJvdW5kLCDCpzEzOyBraW5kIDEwIGlzIHJlc2VydmVkIHNpbmNlIHYzNSkKCXNlYXRDb3VudCAgICAgID0gNgoJZ3VhcmRpYW5TZWF0cyAgPSA0CgltYXhTZWF0Q2hhbmdlcyA9IDQgLy8ga2luZCA1OiB0d28gZ3VhcmRpYW4gc2VhdHMgcGx1cyBlaXRoZXIgd2F0Y2ggc2xvdAoKCS8vIFRoZSBsYXVuY2ggdmFsdWVzICjCpzUuMywgwqc2LjUpOiB0aGUgYWRtaW4gcHJvZ3JhbSAodGhlIGZpcnN0IGRlY2lzaW9uIHJlY2lwaWVudCksIHRoZSBwYXVzYWJsZSBJU00gKHRoZSBvbmx5CgkvLyBpZCBraW5kIDMgbWF5IG5hbWUpLCB0aGUgbGlnaHQgY2xpZW50ICh0aGUgcGF1c2FibGUgSVNNJ3MgdGFyZ2V0LCB3aG9zZSBzdGF0ZSBsYXlvdXQgaXMgZml4ZWQgZm9yIHRoZQoJLy8gZGVwbG95bWVudCdzIGxpZmUg4oCUIGtpbmQgNCBpcyByZXNlcnZlZCDigJQgc2hvd24gb24gdGhlIHBhZ2UgZm9yIGEgbWVtYmVyJ3MgY2hlY2spLCBhbmQgdGhlIGZvdXIgZ3VhcmRpYW5zJyBhbmQKCS8vIHR3byB3YXRjaCBrZXlzJyBTb2xhbmEgcHVia2V5cyBhcyB0aGUgYWRtaW4gcHJvZ3JhbSdzIGluaXQgZGF0YSBjYXJyaWVzIHRoZW0uIFBMQUNFSE9MREVSUyB1bnRpbCB0aGUgU29sYW5hCgkvLyBwcm9ncmFtcyBhcmUgZGVwbG95ZWQgYW5kIHRoZSBwZW9wbGUgaGF2ZSBrZXlzOyBicmlkZ2UvbG9jYWwvZTJlLnNoIHN3YXBzIHRoZSBwcm9ncmFtIGlkcyBmb3IgaXRzIHJ1bidzLgoJbGF1bmNoUmVjaXBpZW50ICAgPSAiMzg4ODViZDc0NmFiOWRjOWI2MTc1MzMxYTYxODQyZDBhZDhlMGM0YzI1MzJmNzJlMjg2ZWY3ZGFjODJiMDM1OCIgLy8gdGhlIGFkbWluIHByb2dyYW0gNG9nUm53OWlQR2E0ZFk4cXFDczFhQld4SFF2S1N6SGg1dHR6NTNzTEZUTTkKCWxhdW5jaFBhdXNhYmxlSVNNID0gIjU2NGVhYjQ2MmEzMjExNDhmODhkNTQ4OTk2ZDBmZDVlODRjNjZhYjYzMGYwZjRkYTYzMzMxNTkyZDdkY2UyMjEiIC8vIHRoZSBwYXVzYWJsZSBJU00gNm91ZHh0bzU5a3RZcnB2cUVWWFRiNVR1bzd2ekJwa2duc1BXb1BYVkY1RnYKCWxhdW5jaENsaWVudCAgICAgID0gIjFhNTcyZDE1Njc4N2E2Mjc1MDk5OWYzNDNlNWFmNmY3Mzk0ZjkxYzExZjc1YTI5NDllOWFlZmQ4OTE0ZTA3YWQiIC8vIHRoZSBsaWdodCBjbGllbnQgMm1waFl0TFo3SG5DZnJGaEdIMmM0RG85QzlVb3lzZXZrbWtEYjhVa2JBdTIKCWxhdW5jaFNvbFNlYXQxICAgID0gIjA1YTFhZjIwMGNmZGRjM2IzYWNlNzYzNTM1MDUwOTg4NTVjOTk5NDkxM2Y3MjgyZjJlNDVjZTZlNDczZGNkNmUiIC8vIE56MnUzTjNSQU13cTlwancxVnY3a3RON25YNHJOZTRVdzVyZEw5bzljM28KCWxhdW5jaFNvbFNlYXQyICAgID0gIjAyOGIxODRjMWZlNDNhYzUwMTQwOWRiNGViNDVhNDdiYzJjZDI4MDIyNmNjYTU3MzQ1YjgwMmQyNzE3NWU1YjQiIC8vIEF2cUVlMmhkeDNISDg3TlU5Q1I1R1NhckNEMXNSNlBRMkg1QWp3U25DNGIKCWxhdW5jaFNvbFNlYXQzICAgID0gIjk1YjNiNDRlNWFkYzlhMGU4NDkyODVlNTljZjZlN2IwZGFiNTNlM2E4NzcyZjY4MDk5MGY3M2E2MTExZjQ5NGMiIC8vIEI1TmdNNG9EMXZZS1RFR1NlMzNSYVNzSGJ5R3p4S3ZvYXljR3FoamJ5RVYxCglsYXVuY2hTb2xTZWF0NCAgICA9ICIwNWVjOTlkZDMyZGJlZTMwN2ViMDY0ODkyZjY4NTgxYjlkYTllZTkyOGRmNWEwMGQ3ZjQ5MWYwZjFiNGZjM2QyIiAvLyBROEhvTUw4ZWZTdWZFaHZZc1NmZm1IQUdKNlluWWIyUXd5TVZ3UVl0OURzCglsYXVuY2hTb2xTZWF0NSAgICA9ICIxOTVhMDBmYjU4Y2UwZDdmNzYyY2MyYjNkNzIwMTcxMDA3MjQ3NjhmYTJhZTgyOGMwNTVkNTc1MzBiMzQwNzdhIiAvLyAyaHhueEdpUGY2Y3V1WVhqVGhlaHlEbmtYcFVLalFhaThmcDE0emtjZ3pqQgoJbGF1bmNoU29sU2VhdDYgICAgPSAiMjQ1NTFmMzc4ZDhiYmRjOTE1ZmQ0NDk3YWE5YmY3M2E1ZWI1Zjk5NDQ3NzU1ZWI5ZjdjNzUxYWVkM2Q1NThlMiIgLy8gM1NweGVRZjFKVGZFcnZrcGQzS3EzM1E3Mkg0eWhMeW5LUFZFQ2RqOWNrbWYKCgkvLyBsYXVuY2hTZXF1ZW5jZSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IGRlY2lzaW9uIHRoaXMgcmVhbG0ncyBwcmVkZWNlc3NvciBkaXNwYXRjaGVkIOKAlCAwIGZvciBhIGNoYWluJ3MKCS8vIGZpcnN0IHIvaGxnb3YuIEEgc3VjY2Vzc29yIHIvaGxnb3YgZm9yIGEgbmV3IGNoYWluIGlzIGRlcGxveWVkIHdpdGggaXRzIHByZWRlY2Vzc29yJ3MgbGFzdCBudW1iZXIgaGVyZQoJLy8gKMKnNS4zKSwgc28gaXRzIGNvdW50ZXIgc3RhcnRzIHdoZXJlIHRoZSBhZG1pbiBwcm9ncmFtJ3Mgc3RhbmRzIGFuZCBuZXZlciByZXN0YXJ0cyBiZWxvdyBhIHJlY29yZGVkIG51bWJlci4KCS8vIFdyaXR0ZW4gYnkgaW5pdDsgdGhlIHBhZ2Ugc2hvd3MgaXQgYmVzaWRlIHRoZSBjb3VudGVyLgoJbGF1bmNoU2VxdWVuY2UgPSB1aW50NjQoMCkKKQoKLy8gbGF1bmNoR292ZXJub3IgaXMgdGhlIGdvdmVybm9yIChNMWspOiB0aGUgbWFpbGJveCdzLCBjb21waWxlZCBoZXJlIHRvbyBzbyBhIG1lbWJlciByZWFkcyBpdCBpbiB0aGlzIHJlYWxtJ3MKLy8gc2VydmVkIHNvdXJjZTsgaW5pdCByZWZ1c2VzIGEgZGVwbG95IHdpdGggYW5vdGhlci4gYnJpZGdlL2xvY2FsL2UyZS5zaCBzd2FwcyBpdCBmb3IgZ25vZGV2J3MgdGVzdDEuCmNvbnN0IGxhdW5jaEdvdmVybm9yID0gYWRkcmVzcygiZzFlY3N1ajBxNTcyanIwZGh1MjlxOW5qdG5tdzAzaHl1N3R5eXZ2NiIpCgp2YXIgKAoJZGVzdGluYXRpb24gPSBobG1haWxib3guTGF1bmNoT3JpZ2luKCkKCXJlY2lwaWVudCAgID0gbXVzdEtleShsYXVuY2hSZWNpcGllbnQpCglmb3JtZXIgICAgICBbXVszMl1ieXRlICAgICAgICAgICAgICAgLy8gZXZlcnkgZGVjaXNpb24gcmVjaXBpZW50IGEgc3dhcCByZXBsYWNlZCAoUjI5KTogcmV0aXJlZCBhZG1pbiBwcm9ncmFtcywgd2hpY2gga2luZCA5IGFuZCBhIHN3YXAgcmVmdXNlIGZvciBnb29kCgljbGllbnQgICAgICA9IG11c3RLZXkobGF1bmNoQ2xpZW50KSAgIC8vIHRoZSBsaWdodCBjbGllbnQ6IHNob3duIG9uIHRoZSBwYWdlOyBubyBraW5kIG5hbWVzIGl0IChraW5kIDQgaXMgcmVzZXJ2ZWQpCglzb2xTZWF0cyAgICBbc2VhdENvdW50ICsgMV1bMzJdYnl0ZSAvLyBTb2xhbmEncyBzZWF0cyBhcyB0aGlzIHJlYWxtIGxhc3Qgc2V0IHRoZW06IGEgbWlycm9yIGtpbmQgNSB3YXJucyBhZ2FpbnN0LCBzaG93biBvbiB0aGUgcGFnZQoKCWxhc3QgdWludDY0ICAgLy8gdGhlIG51bWJlciBvZiB0aGUgbGFzdCBkZWNpc2lvbiBkaXNwYXRjaGVkOyB0aGUgbmV4dCBpcyBsYXN0ICsgMQoJc2VudCBhdmwuVHJlZSAvLyBzZXFLZXkobnVtYmVyKSDihpIgKmRlY2lzaW9uCgoJbGVkZ2VyIGRlY2lzaW9ucy5MZWRnZXIKKQoKLy8gZGVjaXNpb24gaXMgb25lIGRpc3BhdGNoZWQgZGVjaXNpb246IGl0cyBib2R5IChraW5kIOKAliBudW1iZXIg4oCWIHBhcmFtcykgYW5kIGl0cyBkaXNwYXRjaGVzOyBhIGtpbmQgNiBmb3IgYSByb3V0ZQovLyBvZiB0aGlzIGNoYWluIGFsc28ga2VlcHMgdGhlIHJvdXRlIGl0IGVucm9sbGVkIGFuZCB0aGUgaGVpZ2h0IGl0IG5vdGVkIHdpdGggdGhlIG1haWxib3ggKFIzNzogYSBjYW5jZWwgb2YgaXQKLy8gY2xlYXJzIHRoYXQgbm90ZSB3aGlsZSBpdCBpcyB0aGUgbGF0ZXN0KS4KdHlwZSBkZWNpc2lvbiBzdHJ1Y3QgewoJa2luZCAgIHVpbnQ4Cglib2R5ICAgW11ieXRlCglhdCAgICAgaW50NjQgIC8vIGZpcnN0IGRpc3BhdGNoZWQKCWlkICAgICBzdHJpbmcgLy8gdGhlIGxhdGVzdCBtZXNzYWdlIGlkCgljb3VudCAgaW50ICAgIC8vIGRpc3BhdGNoZXMgc28gZmFyCgl0ZXh0ICAgc3RyaW5nCglyb3V0ZSAgc3RyaW5nIC8vIGEga2luZCA2IGZvciB0aGlzIGNoYWluJ3MgZG9tYWluOiB0aGUgcm91dGUgcmVhbG0gaXQgZW5yb2xsZWQ7ICIiIG90aGVyd2lzZQoJaGVpZ2h0IGludDY0ICAvLyDigKYgYW5kIHRoZSBibG9jayBoZWlnaHQgTm90ZUVucm9sbGVkIHJlY29yZGVkIGZvciBpdAp9Cgp0eXBlICgKCXJlY2lwaWVudFBhcmFtcyBzdHJ1Y3R7IHRvIFszMl1ieXRlIH0KCXNlcXVlbmNlUGFyYW1zICBzdHJ1Y3R7IG4gdWludDY0IH0KCWNhbmNlbFBhcmFtcyAgICBzdHJ1Y3R7IGlkIGludDY0IH0KCWtpbmRQYXJhbXMgICAgICBzdHJ1Y3QgewoJCWtpbmQgICB1aW50OAoJCXBhcmFtcyBbXWJ5dGUKCQlzZWF0cyAgW11pbnQKCQlrZXlzICAgW11bMzJdYnl0ZQoJfQopCgpmdW5jIGluaXQoKSB7CgkvLyBhIGRlcGxveSB3aG9zZSBjb21waWxlZCBnb3Zlcm5vciBpcyBub3QgdGhlIG1haWxib3gncyBpcyByZWZ1c2VkIChNMWspOiB0aGUgYnJpZGdlJ3MgcmVhbG1zIGFyZSBnb3Zlcm5lZCBieQoJLy8gb25lIGtleSB1bnRpbCBpdCB5aWVsZHMsIG9yIGJ5IEdvdkRBTyBmcm9tIHRoZSBmaXJzdCBibG9jaywgbmV2ZXIgYSBtaXgKCWlmIGxhdW5jaEdvdmVybm9yICE9IGhsbWFpbGJveC5Hb3Zlcm5vcigpIHsKCQlwYW5pYygiaGxnb3Y6IHRoZSBjb21waWxlZCBnb3Zlcm5vciAiICsgc3RyaW5nKGxhdW5jaEdvdmVybm9yKSArICIgaXMgbm90IHRoZSBtYWlsYm94J3MgIiArIHN0cmluZyhobG1haWxib3guR292ZXJub3IoKSkpCgl9Cglzb2xTZWF0c1sxXSwgc29sU2VhdHNbMl0sIHNvbFNlYXRzWzNdID0gbXVzdEtleShsYXVuY2hTb2xTZWF0MSksIG11c3RLZXkobGF1bmNoU29sU2VhdDIpLCBtdXN0S2V5KGxhdW5jaFNvbFNlYXQzKQoJc29sU2VhdHNbNF0sIHNvbFNlYXRzWzVdLCBzb2xTZWF0c1s2XSA9IG11c3RLZXkobGF1bmNoU29sU2VhdDQpLCBtdXN0S2V5KGxhdW5jaFNvbFNlYXQ1KSwgbXVzdEtleShsYXVuY2hTb2xTZWF0NikKCWxhc3QgPSBsYXVuY2hTZXF1ZW5jZQp9CgpmdW5jIG11c3RLZXkocyBzdHJpbmcpIFszMl1ieXRlIHsKCWssIGVyciA6PSBobC5QYXJzZUtleTMyKHMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBrCn0KCmZ1bmMgbm93KCkgaW50NjQgeyByZXR1cm4gdGltZS5Ob3coKS5Vbml4KCkgfQoKZnVuYyBpdG9hKG4gaW50NjQpIHN0cmluZyAgIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CmZ1bmMgdTY0cyhuIHVpbnQ2NCkgc3RyaW5nICB7IHJldHVybiBzdHJjb252LkZvcm1hdFVpbnQobiwgMTApIH0KZnVuYyBoeChiIFtdYnl0ZSkgc3RyaW5nICAgIHsgcmV0dXJuIGhleC5FbmNvZGVUb1N0cmluZyhiKSB9CmZ1bmMgc2VxS2V5KG4gdWludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyaW5ncy5SZXBlYXQoIjAiLCAyMC1sZW4odTY0cyhuKSkpICsgdTY0cyhuKSB9CgpmdW5jIGNhbGxlcihjdXIgcmVhbG0pIGFkZHJlc3MgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImhsZ292OiB0aGF0IHJlYWxtIHZhbHVlIGlzIG5vdCBsaXZlOyBwYXNzIHlvdXIgb3duIGN1ciIpCgl9CglyZXR1cm4gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCn0KCmZ1bmMgbXVzdEJlTGl2ZSgpIHsKCWlmICFobG1haWxib3guTGl2ZSgpIHsKCQlwYW5pYygiaGxnb3Y6IG5vdCBsYXVuY2hlZDogYmVmb3JlIHRoZSBMYXVuY2ggZGVjaXNpb24gb25seSB0aGUgY2FuY2VsIG9mIGEgcXVldWVkIGNoYW5nZSBpcyBwcm9wb3NlZCIpCgl9Cn0KCi8vIFJlcXVlc3QgaXMgd2hhdCBhIGJ1aWxkZXIgcmV0dXJucyAoTTFrKTogdGhlIHByb3Bvc2FsIEdvdkRBTydzIHByb3h5IGV4ZWN1dGVzIGFmdGVyIHRoZSB5aWVsZCAoUHJvcG9zYWwpLCBhbmQKLy8gdGhlIHNhbWUgZGVjaXNpb24gdGhlIGdvdmVybm9yIHJ1bnMgZGlyZWN0bHkgYmVmb3JlIGl0IChHb3Zlcm4pOyBzZWUgaGxnbm90J3MuCnR5cGUgUmVxdWVzdCBzdHJ1Y3QgewoJcHJvcG9zYWwgZGFvLlByb3Bvc2FsUmVxdWVzdAoJdGV4dCAgICAgc3RyaW5nCglkZWNpZGUgICBmdW5jKGN1ciByZWFsbSkgZXJyb3IKfQoKLy8gUHJvcG9zYWwgaXMgdGhlIHJlcXVlc3QgYXMgYSBHb3ZEQU8gcHJvcG9zYWw6IGBkYW8uTXVzdENyZWF0ZVByb3Bvc2FsKGNyb3NzKGN1ciksIHJlcS5Qcm9wb3NhbCgpKWAuCmZ1bmMgKHIgUmVxdWVzdCkgUHJvcG9zYWwoKSBkYW8uUHJvcG9zYWxSZXF1ZXN0IHsgcmV0dXJuIHIucHJvcG9zYWwgfQoKLy8gRGVzY3JpcHRpb24gaXMgdGhlIHByb3Bvc2FsJ3M6IHRoZSBwYXJhbWV0ZXJzIGFzIHRoZSBidWlsZGVyIHdyb3RlIHRoZW0uCmZ1bmMgKHIgUmVxdWVzdCkgRGVzY3JpcHRpb24oKSBzdHJpbmcgeyByZXR1cm4gci50ZXh0IH0KCi8vIHdobyBuYW1lcyBhIHByZXZpb3VzIHJlYWxtIGluIGEgcmVmdXNhbDogaXRzIHBrZ3BhdGgsIG9yIGEgdXNlcidzIGFkZHJlc3MuCmZ1bmMgd2hvKHBhdGggc3RyaW5nLCBhIGFkZHJlc3MpIHN0cmluZyB7CglpZiBwYXRoICE9ICIiIHsKCQlyZXR1cm4gcGF0aAoJfQoJcmV0dXJuIHN0cmluZyhhKQp9CgovLyBtdXN0QmVHb3Zlcm5vciBpcyBhIGRlY2lzaW9uJ3MgaWRlbnRpdHkgY2hlY2sgKE0xayksIHJlYWQgZnJvbSB0aGUgY2xvc3VyZSdzIG93biBsaXZlIGN1cjogdGhlIGdvdmVybm9yJ3Mgb3duCi8vIGNhbGwgdW50aWwgaXQgeWllbGRzIG9uIHIvaGxtYWlsYm94LCBnbm8ubGFuZC9yL2dvdi9kYW8ncyBwcm94eSBleGFjdGx5IGFmdGVyIChvciBmcm9tIHRoZSBmaXJzdCBibG9jaywgd2hlbiBubwovLyBnb3Zlcm5vciB3YXMgY29tcGlsZWQpOyBzZWUgaGxnbm90J3MuCmZ1bmMgbXVzdEJlR292ZXJub3IoY3VyIHJlYWxtKSB7CglwcmV2IDo9IGN1ci5QcmV2aW91cygpCglpZiBkZWNpc2lvbnMuREFPR292ZXJucyhsYXVuY2hHb3Zlcm5vciwgaGxtYWlsYm94LllpZWxkZWQoKSkgewoJCWlmIHAgOj0gcHJldi5Qa2dQYXRoKCk7IHAgIT0gZGVjaXNpb25zLkRBT1BhdGggewoJCQlwYW5pYygiaGxnb3Y6IG9ubHkgIiArIGRlY2lzaW9ucy5EQU9QYXRoICsgIiBleGVjdXRlcyBhIGRlY2lzaW9uLCBub3QgIiArIHdobyhwcmV2LlBrZ1BhdGgoKSwgcHJldi5BZGRyZXNzKCkpKQoJCX0KCQlyZXR1cm4KCX0KCWlmICFwcmV2LklzVXNlcigpIHx8IHByZXYuQWRkcmVzcygpICE9IGxhdW5jaEdvdmVybm9yIHsKCQlwYW5pYygiaGxnb3Y6IHVudGlsIHRoZSBnb3Zlcm5vciB5aWVsZHMsICIgKyBzdHJpbmcobGF1bmNoR292ZXJub3IpICsgIiBhbG9uZSBkZWNpZGVzLCBieSBHb3Zlcm4gZnJvbSBpdHMgb3duIGtleTogbm90ICIgKyB3aG8ocHJldi5Qa2dQYXRoKCksIHByZXYuQWRkcmVzcygpKSArICIgKGEgR292REFPIHByb3Bvc2FsIGlzIHJlZnVzZWQgdW50aWwgdGhlIHlpZWxkKSIpCgl9Cn0KCi8vIEdvdmVybiBpcyB0aGUgZ292ZXJub3IncyB3YXkgaW4gYmVmb3JlIHRoZSB5aWVsZCAoTTFrKTogdGhlIHNhbWUgY2xvc3VyZSBHb3ZEQU8ncyBwcm94eSBydW5zIGFmdGVyIGl0LCBjYWxsZWQKLy8gbm9uLWNyb3NzaW5nIGluIHRoaXMgZnJhbWUgc28gaXQgcmVhZHMgdGhlIGdvdmVybm9yIGZyb20gY3VyLlByZXZpb3VzKCkg4oCUIGFuZCBkaXNwYXRjaGVzIHRocm91Z2ggdGhlIG1haWxib3gKLy8gdW5kZXIgdGhpcyByZWFsbSdzIG93biBhdXRob3JpdHksIGFzIHRoZSBwcm94eSdzIGV4ZWN1dGlvbiBkb2VzOyByZWZ1c2VkIGZvciBhbnlvbmUgZWxzZSBhbmQgZm9yIGV2ZXJ5b25lIG9uY2UKLy8gdGhlIGdvdmVybm9yIHlpZWxkZWQgb24gci9obG1haWxib3ggKG9yIHdoZW4gbm9uZSB3YXMgY29tcGlsZWQpOyBzZWUgaGxnbm90J3MuCmZ1bmMgR292ZXJuKGN1ciByZWFsbSwgciBSZXF1ZXN0KSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiaGxnb3Y6IHRoYXQgcmVhbG0gdmFsdWUgaXMgbm90IGxpdmU7IHBhc3MgeW91ciBvd24gY3VyIikKCX0KCWlmIHIuZGVjaWRlID09IG5pbCB7CgkJcGFuaWMoImhsZ292OiBub3QgYSBidWlsZGVyJ3MgcmVxdWVzdCIpCgl9CglpZiB5aWVsZGVkIDo9IGhsbWFpbGJveC5ZaWVsZGVkKCk7IGRlY2lzaW9ucy5EQU9Hb3Zlcm5zKGxhdW5jaEdvdmVybm9yLCB5aWVsZGVkKSB7CgkJaWYgbGF1bmNoR292ZXJub3IgPT0gIiIgewoJCQlwYW5pYygiaGxnb3Y6IG5vIGdvdmVybm9yIHdhcyBjb21waWxlZCwgIiArIGRlY2lzaW9ucy5EQU9QYXRoICsgIiBnb3Zlcm5zIGZyb20gdGhlIGZpcnN0IGJsb2NrOiBhIGRlY2lzaW9uIGlzIGEgR292REFPIHByb3Bvc2FsLCBuZXZlciBHb3Zlcm4iKQoJCX0KCQlwYW5pYygiaGxnb3Y6IHRoZSBnb3Zlcm5vciB5aWVsZGVkIGF0IGhlaWdodCAiICsgaXRvYSh5aWVsZGVkKSArICIsICIgKyBkZWNpc2lvbnMuREFPUGF0aCArICIgZ292ZXJucyBzaW5jZTogYSBkZWNpc2lvbiBpcyBhIEdvdkRBTyBwcm9wb3NhbCwgbmV2ZXIgR292ZXJuIikKCX0KCW11c3RCZUdvdmVybm9yKGN1cikKCWlmIGVyciA6PSByLmRlY2lkZShjdXIpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiaGxnb3Y6ICIgKyBlcnIuRXJyb3IoKSkKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFkaW5nIC0tCgovLyBBZGRyZXNzIGlzIHRoaXMgcmVhbG0ncyBhZGRyZXNzOiB0aGUgc2VuZGVyIHRoZSBhZG1pbiBwcm9ncmFtIGFjY2VwdHMuCmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgeyByZXR1cm4gY2hhaW4uUGFja2FnZUFkZHJlc3MocGtnUGF0aCkgfQoKLy8gUmVjaXBpZW50IGlzIHRoZSBwcm9ncmFtIGRlY2lzaW9ucyBhcmUgYWRkcmVzc2VkIHRvLCBpbiBoZXguCmZ1bmMgUmVjaXBpZW50KCkgc3RyaW5nIHsgcmV0dXJuIGh4KHJlY2lwaWVudFs6XSkgfQoKLy8gRm9ybWVyIGxpc3RzIGV2ZXJ5IGRlY2lzaW9uIHJlY2lwaWVudCBhIHN3YXAgcmVwbGFjZWQsIGluIGhleCwgb2xkZXN0IGZpcnN0IChSMjkpOiByZXRpcmVkIGFkbWluIHByb2dyYW1zLgpmdW5jIEZvcm1lcigpIFtdc3RyaW5nIHsKCW91dCA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oZm9ybWVyKSkKCWZvciBpLCBrIDo9IHJhbmdlIGZvcm1lciB7CgkJb3V0W2ldID0gaHgoa1s6XSkKCX0KCXJldHVybiBvdXQKfQoKZnVuYyBpc0Zvcm1lcihrIFszMl1ieXRlKSBib29sIHsKCWZvciBfLCBmIDo9IHJhbmdlIGZvcm1lciB7CgkJaWYgZiA9PSBrIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gbXVzdE5vdEJlRm9ybWVyIHJlZnVzZXMgYSByZXRpcmVkIGFkbWluIHByb2dyYW0gYXMgYSBraW5kIDkncyBzdWNjZXNzb3Igb3IgYXMgdGhlIGRlY2lzaW9uIHJlY2lwaWVudCAoUjI5KTogYQovLyBwcm9ncmFtIHdob3NlIGF1dGhvcml0aWVzIHdlbnQgdG8gYSBzdWNjZXNzb3IgYW5zd2VycyBSZXRpcmVkIHRvIGV2ZXJ5IGRlY2lzaW9uLCBhbmQgYSBraW5kIDkgbmFtaW5nIGl0IGRpZXMgb24KLy8gaXRzIHN1Y2Nlc3Nvcl9pbml0IChOb3RJbmhlcml0ZWQpLCBzbyB0aGUgZGVjaXNpb24gd291bGQgcGVuZCB1bnRpbCBhIGNhbmNlbCDigJQgYSB3YXN0ZWQgdm90ZSBhbmQgYSBzdGFuZGluZyBsaW5lCi8vIG9uIGhsd2F0Y2guIENoZWNrZWQgd2hlbiBhIHByb3Bvc2FsIGlzIG1hZGUsIGluIGl0cyBjbG9zdXJlLCBhbmQgd2hlbiBhIHF1ZXVlZCBzd2FwIHdvdWxkIGFwcGx5LgpmdW5jIG11c3ROb3RCZUZvcm1lcihrIFszMl1ieXRlLCB3aGF0IHN0cmluZykgewoJaWYgaXNGb3JtZXIoaykgewoJCXBhbmljKCJobGdvdjogbmV2ZXIgYSBmb3JtZXIgIiArIHdoYXQgKyAiICgiICsgaHgoa1s6XSkgKyAiKTogaXQgaXMgcmV0aXJlZCwgZXZlcnkgYXV0aG9yaXR5IGhhbmRlZCB0byBhIHN1Y2Nlc3NvciBieSBraW5kIDkg4oCUIGEga2luZCA5IHRvIGl0IHdvdWxkIGRpZSBvbiBpdHMgc3VjY2Vzc29yX2luaXQgKE5vdEluaGVyaXRlZCkgYW5kIGEgc3dhcCB0byBpdCB3b3VsZCBzZW5kIGV2ZXJ5IGRlY2lzaW9uIHRvIGEgcHJvZ3JhbSB0aGF0IGFuc3dlcnMgUmV0aXJlZCIpCgl9Cn0KCi8vIERlc3RpbmF0aW9uIGlzIHRoZSBTb2xhbmEgZG9tYWluIGRlY2lzaW9ucyBnbyB0by4KZnVuYyBEZXN0aW5hdGlvbigpIHVpbnQzMiB7IHJldHVybiBkZXN0aW5hdGlvbiB9CgovLyBMYXN0IGlzIHRoZSBudW1iZXIgb2YgdGhlIGxhc3QgZGVjaXNpb24gZGlzcGF0Y2hlZDsgTmV4dCB0aGUgbnVtYmVyIHRoZSBuZXh0IG9uZSB0YWtlczsgU3RhcnQgdGhlIGNvbXBpbGVkCi8vIG51bWJlciB0aGUgY291bnRlciBiZWdhbiBhdCAodGhlIHByZWRlY2Vzc29yJ3MgbGFzdCBudW1iZXI7IDAgZm9yIGEgY2hhaW4ncyBmaXJzdCByL2hsZ292KS4KZnVuYyBMYXN0KCkgdWludDY0ICB7IHJldHVybiBsYXN0IH0KZnVuYyBOZXh0KCkgdWludDY0ICB7IHJldHVybiBsYXN0ICsgMSB9CmZ1bmMgU3RhcnQoKSB1aW50NjQgeyByZXR1cm4gbGF1bmNoU2VxdWVuY2UgfQoKLy8gU29sU2VhdCBpcyB0aGUgU29sYW5hIHB1YmtleSB0aGlzIHJlYWxtIGxhc3Qgc2V0IGZvciBhIHNlYXQgKDHigJM0IGd1YXJkaWFucywgNeKAkzYgd2F0Y2gga2V5cyksIGluIGhleC4KZnVuYyBTb2xTZWF0KG4gaW50KSBzdHJpbmcgewoJaWYgbiA8IDEgfHwgbiA+IHNlYXRDb3VudCB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gaHgoc29sU2VhdHNbbl1bOl0pCn0KCi8vIEJvZHkgaXMgYSBkaXNwYXRjaGVkIGRlY2lzaW9uJ3MgYm9keSBpbiBoZXgsIGJ5IG51bWJlciAoIiIgaWYgbm9uZSkuCmZ1bmMgQm9keShuIHVpbnQ2NCkgc3RyaW5nIHsKCXYgOj0gc2VudC5HZXQoc2VxS2V5KG4pKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGh4KHYuKCpkZWNpc2lvbikuYm9keSkKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5jb2RpbmcgLS0KCmZ1bmMgYmUzMihuIHVpbnQzMikgW11ieXRlIHsgcmV0dXJuIGJpbmFyeS5CaWdFbmRpYW4uQXBwZW5kVWludDMyKG5pbCwgbikgfQpmdW5jIGJlNjQobiB1aW50NjQpIFtdYnl0ZSB7IHJldHVybiBiaW5hcnkuQmlnRW5kaWFuLkFwcGVuZFVpbnQ2NChuaWwsIG4pIH0KCi8vIGJvZHkgaXMga2luZCB1OCDigJYgc2VxIHU2NCBCRSDigJYgcGFyYW1zICjCpzEzKS4KZnVuYyBib2R5KGtpbmQgdWludDgsIG4gdWludDY0LCBwYXJhbXMgW11ieXRlKSBbXWJ5dGUgewoJYiA6PSBtYWtlKFtdYnl0ZSwgMCwgOStsZW4ocGFyYW1zKSkKCWIgPSBhcHBlbmQoYiwga2luZCkKCWIgPSBhcHBlbmQoYiwgYmU2NChuKS4uLikKCXJldHVybiBhcHBlbmQoYiwgcGFyYW1zLi4uKQp9CgovLyBtdXN0Rml0IHJlZnVzZXMgYSBib2R5IGFib3ZlIE1heERlY2lzaW9uQm9keTogdGhlIG9uZSBjaGVjayBldmVyeSBkaXNwYXRjaCBtYWtlcywgc28gbm8gYnVpbGRlciBjYW4gYXV0aG9yIGEKLy8gZGVjaXNpb24gdGhlIG1haWxib3ggY2Fubm90IGRlbGl2ZXIuCmZ1bmMgbXVzdEZpdChyYXcgW11ieXRlKSB7CglpZiBsZW4ocmF3KSA+IE1heERlY2lzaW9uQm9keSB7CgkJcGFuaWMoImhsZ292OiB0aGUgZGVjaXNpb24gYm9keSBpcyAiICsgc3RyY29udi5JdG9hKGxlbihyYXcpKSArICIgYnl0ZXMsIGFib3ZlIHRoZSAiICsgc3RyY29udi5JdG9hKE1heERlY2lzaW9uQm9keSkgKyAiIHRoZSBtYWlsYm94IGRlbGl2ZXJzIChNYXhEZWNpc2lvbkJvZHkpOiBpdCB3b3VsZCBzdGljayB0aGUgc2VxdWVuY2Ugd2l0aCBpdHMgbnVtYmVyIHVudGFrZW4iKQoJfQp9CgovLyBkaXNwYXRjaCBzZW5kcyBhIGRlY2lzaW9uIHdpdGggdGhlIG5leHQgbnVtYmVyIGFuZCByZWNvcmRzIGl0OyBhIGJvZHkgYWJvdmUgTWF4RGVjaXNpb25Cb2R5IGlzIHJlZnVzZWQgZmlyc3QuCmZ1bmMgZGlzcGF0Y2goY3VyIHJlYWxtLCBraW5kIHVpbnQ4LCBwYXJhbXMgW11ieXRlLCB0ZXh0IHN0cmluZywgdCBpbnQ2NCkgdWludDY0IHsKCW4gOj0gbGFzdCArIDEKCXJhdyA6PSBib2R5KGtpbmQsIG4sIHBhcmFtcykKCW11c3RGaXQocmF3KQoJaWQgOj0gaGxtYWlsYm94LkRpc3BhdGNoKGNyb3NzKGN1ciksIGRlc3RpbmF0aW9uLCByZWNpcGllbnQsIHJhdykKCWxhc3QgPSBuCglzZW50LlNldChzZXFLZXkobiksICZkZWNpc2lvbntraW5kOiBraW5kLCBib2R5OiByYXcsIGF0OiB0LCBpZDogaHgoaWRbOl0pLCBjb3VudDogMSwgdGV4dDogdGV4dH0pCgljaGFpbi5FbWl0KCJEZWNpc2lvblNlbnQiLCAibnVtYmVyIiwgdTY0cyhuKSwgImtpbmQiLCBzdHJjb252Lkl0b2EoaW50KGtpbmQpKSwgImlkIiwgaHgoaWRbOl0pKQoJcmV0dXJuIG4KfQoKLy8gUmVkaXNwYXRjaCBzZW5kcyBhbiBleGVjdXRlZCBkZWNpc2lvbiBhZ2FpbiDigJQgdGhlIHNhbWUgbnVtYmVyIGFuZCBwYXJhbWV0ZXJzLCBhIG5ldyBtZXNzYWdlIOKAlCBieSBhbnlvbmUsIHVudGlsCi8vIHRoZSBhZG1pbiBwcm9ncmFtIGhhcyByZWNvcmRlZCBpdCAoYSBjb3B5IGl0IGhhcyByZWNvcmRlZCBpcyBhY2NlcHRlZCBhbmQgaWdub3JlZCB0aGVyZSkuCmZ1bmMgUmVkaXNwYXRjaChjdXIgcmVhbG0sIG4gdWludDY0KSB7CgljYWxsZXIoY3VyKQoJdiA6PSBzZW50LkdldChzZXFLZXkobikpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoImhsZ292OiBubyBkZWNpc2lvbiAiICsgdTY0cyhuKSkKCX0KCWQgOj0gdi4oKmRlY2lzaW9uKQoJaWQgOj0gaGxtYWlsYm94LkRpc3BhdGNoKGNyb3NzKGN1ciksIGRlc3RpbmF0aW9uLCByZWNpcGllbnQsIGQuYm9keSkKCWQuaWQgPSBoeChpZFs6XSkKCWQuY291bnQrKwoJY2hhaW4uRW1pdCgiRGVjaXNpb25TZW50IiwgIm51bWJlciIsIHU2NHMobiksICJraW5kIiwgc3RyY29udi5JdG9hKGludChkLmtpbmQpKSwgImlkIiwgaHgoaWRbOl0pKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJ1aWxkZXJzIC0tCgpmdW5jIHByb3Bvc2UoY3VyIHJlYWxtLCBraW5kLCB0ZXh0IHN0cmluZywgYXBwbHkgZnVuYyhjdXIgcmVhbG0sIG1hZGUsIHQgaW50NjQpKSBSZXF1ZXN0IHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJobGdvdjogdGhhdCByZWFsbSB2YWx1ZSBpcyBub3QgbGl2ZTsgcGFzcyB5b3VyIG93biBjdXIiKQoJfQoJbWFkZSA6PSBub3coKQoJY2IgOj0gZnVuYyhjdXIgcmVhbG0pIGVycm9yIHsKCQltdXN0QmVHb3Zlcm5vcihjdXIpCgkJdCA6PSBub3coKQoJCWlmIGVyciA6PSBkZWNpc2lvbnMuRXhwaXJlZChtYWRlLCB0KTsgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9CgkJYXBwbHkoY3VyLCBtYWRlLCB0KQoJCXJldHVybiBuaWwKCX0KCXJldHVybiBSZXF1ZXN0e3Byb3Bvc2FsOiBkYW8uTmV3UHJvcG9zYWxSZXF1ZXN0KCJobGdvdjogIitraW5kLCB0ZXh0LCBkYW8uTmV3U2ltcGxlRXhlY3V0b3IoMCwgY3VyLCBjYiwgdGV4dCkpLCB0ZXh0OiB0ZXh0LCBkZWNpZGU6IGNifQp9CgovLyBwcm9wb3NlS2luZCBpcyBhIFNvbGFuYSBkZWNpc2lvbidzIGJ1aWxkZXI6IGF0IGV4ZWN1dGlvbiBpdCBkaXNwYXRjaGVzIHRoZSBtZXNzYWdlIGFuZCByZWNvcmRzIHRoZSBkZWNpc2lvbiBhcwovLyBhcHBsaWVkOyB0aGUgcGFyYW1ldGVycyB3ZXJlIGNoZWNrZWQgYXQgY3JlYXRpb24gYW5kIGFyZSBjaGVja2VkIGFnYWluIHRoZW4sIHRoZSBib2R5J3Mgc2l6ZSB3aXRoIHRoZW0uCmZ1bmMgcHJvcG9zZUtpbmQoY3VyIHJlYWxtLCBraW5kIHVpbnQ4LCBuYW1lLCB0ZXh0IHN0cmluZywgcGFyYW1zIFtdYnl0ZSwgY2hlY2sgZnVuYygpKSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJbXVzdEZpdChib2R5KGtpbmQsIDAsIHBhcmFtcykpCgljaGVjaygpCglyZXR1cm4gcHJvcG9zZShjdXIsIG5hbWUsIHRleHQsIGZ1bmMoY3VyIHJlYWxtLCBtYWRlLCB0IGludDY0KSB7CgkJbXVzdEJlTGl2ZSgpCgkJY2hlY2soKQoJCW4gOj0gZGlzcGF0Y2goY3VyLCBraW5kLCBwYXJhbXMsIHRleHQsIHQpCgkJZCA6PSBsZWRnZXIuUmVjb3JkKG5hbWUsIHRleHQsIGtpbmRQYXJhbXN7a2luZDoga2luZCwgcGFyYW1zOiBwYXJhbXN9LCBtYWRlLCB0LCB0KQoJCWxlZGdlci5BcHBseShkLCB0LCAiZGlzcGF0Y2hlZCBhcyBkZWNpc2lvbiAiK3U2NHMobikpCgl9KQp9CgpmdW5jIHBhcnNlTnVtYmVyKHAgc3RyaW5nKSB1aW50NjQgewoJbiwgZXJyIDo9IHN0cmNvbnYuUGFyc2VVaW50KHN0cmluZ3MuVHJpbVNwYWNlKHApLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHx8IG4gPT0gMCB7CgkJcGFuaWMoImhsZ292OiBub3QgYSBkZWNpc2lvbiBudW1iZXI6ICIgKyBwKQoJfQoJcmV0dXJuIG4KfQoKLy8gc2FsdCBpcyB0aGUgOCBieXRlcyBhIGNhbmNlbCBib2R5IHN0YXJ0cyB3aXRoICjCpzEzOiByYW5kb20sIGlnbm9yZWQgYnkgdGhlIHByb2dyYW0sCi8vIHNvIG5vIGJvZHkgaXMgcHJlZGljdGFibGUgYW5kIHR3byBjYW5jZWxzIG9mIG9uZSBsaXN0IGRpZmZlcikuIGduby5sYW5kIGdpdmVzIGEgcmVhbG0gbm8gYmxvY2sKLy8gaGFzaCwgc28gaXQgaXMgc2hhMjU2IG92ZXIgd2hhdCB0aGUgYmxvY2sgYW5kIHRoZSBkZWNpc2lvbiBnaXZlIOKAlCB0aGUgY2hhaW4gaWQsIHRoZSBoZWlnaHQsIHRoZSBibG9jayB0aW1lLCB0aGUKLy8gbWFpbGJveCdzIG5vbmNlLCB0aGUgZGVjaXNpb24gbnVtYmVyIGFuZCB0aGUgbGVkZ2VyJ3MgbmV4dCBpZCDigJQgZHJhd24gaW4gdGhlIGV4ZWN1dGluZyB0cmFuc2FjdGlvbjsgdGhlIGRlY2lzaW9uCi8vIG51bWJlciBhbG9uZSBtYWtlcyB0d28gY2FuY2VscyBvZiBvbmUgbGlzdCBkaWZmZXIsIHRoZSByZXN0IG1ha2UgaXQgYXMgdW5wcmVkaWN0YWJsZSBhcyB0aGUgYmxvY2sgaXQgbGFuZHMgaW4uCmZ1bmMgc2FsdCh0IGludDY0KSBbXWJ5dGUgewoJYiA6PSBbXWJ5dGUocnVudGltZS5DaGFpbklEKCkpCgliID0gYXBwZW5kKGIsIGJlNjQodWludDY0KHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkpLi4uKQoJYiA9IGFwcGVuZChiLCBiZTY0KHVpbnQ2NCh0KSkuLi4pCgliID0gYXBwZW5kKGIsIGJlMzIoaGxtYWlsYm94LkNvdW50KCkpLi4uKQoJYiA9IGFwcGVuZChiLCBiZTY0KGxhc3QrMSkuLi4pCgliID0gYXBwZW5kKGIsIGJlNjQodWludDY0KGxlZGdlci5MYXN0KCkrMSkpLi4uKQoJaCA6PSBzaGEyNTYuU3VtMjU2KGIpCglyZXR1cm4gaFs6OF0KfQoKLy8gTmV3Q2FuY2VsUmVxdWVzdCBpcyBraW5kIDE6IGNhbmNlbCBwZW5kaW5nIGRlY2lzaW9ucyBvZiB0aGUgbWFpbGJveCBjaGFubmVsIG9uIFNvbGFuYSAoY2hhbm5lbCAwLCB0aGUgb25seSBvbmUKLy8gdGhpcyByZWFsbSB3cml0ZXMpLCBieSBhIGxpc3Qgb2YgbnVtYmVycyAoY29tbWEgc2VwYXJhdGVkLCBhdCBtb3N0IDE2OiBmb3JtIDApIG9yIGJ5IGEgcmFuZ2UgImZyb20tdG8iLAovLyBpbmNsdXNpdmUgKGZvcm0gMSk7IGVhY2ggbnVtYmVyIG9uZSB0aGlzIHJlYWxtIGRpc3BhdGNoZWQuIEl0IGV4ZWN1dGVzIGF0IG9uY2UgdGhlcmUuIFRoZSBib2R5IGlzCi8vIGBzYWx0IHU2NCDigJYgZm9ybSB1OCDigJYg4oCmYCAowqcxMyksIHRoZSBzYWx0IGRyYXduIHdoZW4gdGhlIHByb3Bvc2FsIGV4ZWN1dGVzLCBzbyB0aGUgZGVzY3JpcHRpb24gbmFtZXMgdGhlIG51bWJlcnMKLy8gYW5kIHRoZSBsZWRnZXIncyBub3RlIGFuZCB0aGUgZGVjaXNpb24ncyBwYWdlIGNhcnJ5IHRoZSBzYWx0LgpmdW5jIE5ld0NhbmNlbFJlcXVlc3QoY3VyIHJlYWxtLCBudW1iZXJzIHN0cmluZykgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXZhciBwYXJhbXMgW11ieXRlCgl2YXIgdG9wIHVpbnQ2NAoJaWYgaSA6PSBzdHJpbmdzLkluZGV4KG51bWJlcnMsICItIik7IGkgPj0gMCB7CgkJZnJvbSwgdG8gOj0gcGFyc2VOdW1iZXIobnVtYmVyc1s6aV0pLCBwYXJzZU51bWJlcihudW1iZXJzW2krMTpdKQoJCWlmIHRvIDwgZnJvbSB7CgkJCXBhbmljKCJobGdvdjogdGhlIHJhbmdlIHJ1bnMgZnJvbSB0aGUgbG93ZXIgbnVtYmVyIHRvIHRoZSBoaWdoZXIiKQoJCX0KCQlwYXJhbXMgPSBhcHBlbmQoW11ieXRlezEsIDB9LCBiZTY0KGZyb20pLi4uKQoJCXBhcmFtcyA9IGFwcGVuZChwYXJhbXMsIGJlNjQodG8pLi4uKQoJCXRvcCA9IHRvCgl9IGVsc2UgewoJCXZhciBucyBbXXVpbnQ2NAoJCWZvciBfLCBwIDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQobnVtYmVycywgIiwiKSB7CgkJCWlmIHN0cmluZ3MuVHJpbVNwYWNlKHApID09ICIiIHsKCQkJCWNvbnRpbnVlCgkJCX0KCQkJbiA6PSBwYXJzZU51bWJlcihwKQoJCQlmb3IgXywgeCA6PSByYW5nZSBucyB7CgkJCQlpZiB4ID09IG4gewoJCQkJCXBhbmljKCJobGdvdjogbnVtYmVyICIgKyBzdHJpbmdzLlRyaW1TcGFjZShwKSArICIgbmFtZWQgdHdpY2UiKQoJCQkJfQoJCQl9CgkJCW5zID0gYXBwZW5kKG5zLCBuKQoJCQlpZiBuID4gdG9wIHsKCQkJCXRvcCA9IG4KCQkJfQoJCX0KCQlpZiBsZW4obnMpID09IDAgfHwgbGVuKG5zKSA+IG1heENhbmNlbCB7CgkJCXBhbmljKCJobGdvdjogYSBjYW5jZWwgbmFtZXMgMSB0byAiICsgc3RyY29udi5JdG9hKG1heENhbmNlbCkgKyAiIG51bWJlcnMsIG9yIGEgcmFuZ2UiKQoJCX0KCQlwYXJhbXMgPSBbXWJ5dGV7MCwgYnl0ZShsZW4obnMpKX0KCQlmb3IgXywgbiA6PSByYW5nZSBucyB7CgkJCXBhcmFtcyA9IGFwcGVuZChwYXJhbXMsIDApCgkJCXBhcmFtcyA9IGFwcGVuZChwYXJhbXMsIGJlNjQobikuLi4pCgkJfQoJfQoJdGV4dCA6PSAiY2FuY2VsIGRlY2lzaW9ucyAiICsgbnVtYmVycwoJbXVzdEZpdChib2R5KEtpbmRDYW5jZWwsIDAsIGFwcGVuZChtYWtlKFtdYnl0ZSwgOCksIHBhcmFtcy4uLikpKSAvLyB3aXRoIHRoZSBzYWx0J3MgOCBieXRlczsgZGlzcGF0Y2ggY2hlY2tzIGl0IGFnYWluCgljaGVjayA6PSBmdW5jKCkgewoJCWlmIHRvcCA+IGxhc3QgewoJCQlwYW5pYygiaGxnb3Y6IGRlY2lzaW9uICIgKyB1NjRzKHRvcCkgKyAiIHdhcyBuZXZlciBkaXNwYXRjaGVkIikKCQl9Cgl9CgljaGVjaygpCglyZXR1cm4gcHJvcG9zZShjdXIsICJjYW5jZWwiLCB0ZXh0LCBmdW5jKGN1ciByZWFsbSwgbWFkZSwgdCBpbnQ2NCkgewoJCW11c3RCZUxpdmUoKQoJCWNoZWNrKCkKCQlwIDo9IGFwcGVuZChzYWx0KHQpLCBwYXJhbXMuLi4pCgkJbiA6PSBkaXNwYXRjaChjdXIsIEtpbmRDYW5jZWwsIHAsIHRleHQsIHQpCgkJbm90ZSA6PSAiZGlzcGF0Y2hlZCBhcyBkZWNpc2lvbiAiICsgdTY0cyhuKSArICIsIHNhbHQgIiArIGh4KHBbOjhdKQoJCS8vIGEgY2FuY2VsbGVkIGtpbmQgNiBmb3IgYSByb3V0ZSBvZiB0aGlzIGNoYWluIGNsZWFycyB0aGUgZW5yb2xtZW50IG5vdGUgaXQgbGVmdCwgd2hpbGUgdGhhdCBub3RlIGlzIHRoZQoJCS8vIGxhdGVzdCAoUjM3LCBBUzIpOiB0aGUgcm91dGUncyByZWZ1bmQgY2xvY2sgcmVzdGFydHMgd2l0aCBhIHJlLXByb3Bvc2FsLCBpbnN0ZWFkIG9mIG9wZW5pbmcgb24gYSBraW5kIDYKCQkvLyBTb2xhbmEgbmV2ZXIgZXhlY3V0ZWQKCQllYWNoQ2FuY2VsbGVkKG51bWJlcnMsIGZ1bmMobnVtIHVpbnQ2NCwgZCAqZGVjaXNpb24pIHsKCQkJaWYgZC5raW5kICE9IEtpbmRSb3V0ZXIgfHwgZC5yb3V0ZSA9PSAiIiB7CgkJCQlyZXR1cm4KCQkJfQoJCQlpZiBoLCBfIDo9IGhsbWFpbGJveC5FbnJvbGxlZChkLnJvdXRlKTsgaCAhPSBkLmhlaWdodCB7CgkJCQlyZXR1cm4KCQkJfQoJCQlobG1haWxib3guQ2xlYXJFbnJvbGxlZChjcm9zcyhjdXIpLCBkLnJvdXRlKQoJCQlub3RlICs9ICI7IHRoZSBlbnJvbG1lbnQgbm90ZSBvZiAiICsgZC5yb3V0ZSArICIgY2xlYXJlZCAoa2luZCA2ICMiICsgdTY0cyhudW0pICsgIiBjYW5jZWxsZWQpOiBpdHMgcmVmdW5kIGNsb2NrIHJlc3RhcnRzIHdpdGggYSByZS1wcm9wb3NhbCIKCQl9KQoJCWQgOj0gbGVkZ2VyLlJlY29yZCgiY2FuY2VsIiwgdGV4dCwga2luZFBhcmFtc3traW5kOiBLaW5kQ2FuY2VsLCBwYXJhbXM6IHB9LCBtYWRlLCB0LCB0KQoJCWxlZGdlci5BcHBseShkLCB0LCBub3RlKQoJfSkKfQoKLy8gZWFjaENhbmNlbGxlZCB3YWxrcyB0aGUgZGVjaXNpb25zIGEgY2FuY2VsJ3MgbnVtYmVycyBuYW1lIOKAlCB0aGUgbGlzdCwgb3IgZXZlcnkgZGlzcGF0Y2hlZCBudW1iZXIgb2YgdGhlIHJhbmdlIOKAlAovLyBpbiBudW1iZXIgb3JkZXIuCmZ1bmMgZWFjaENhbmNlbGxlZChudW1iZXJzIHN0cmluZywgZm4gZnVuYyhuIHVpbnQ2NCwgZCAqZGVjaXNpb24pKSB7CglpZiBpIDo9IHN0cmluZ3MuSW5kZXgobnVtYmVycywgIi0iKTsgaSA+PSAwIHsKCQlmcm9tLCB0byA6PSBwYXJzZU51bWJlcihudW1iZXJzWzppXSksIHBhcnNlTnVtYmVyKG51bWJlcnNbaSsxOl0pCgkJc2VudC5JdGVyYXRlKHNlcUtleShmcm9tKSwgc2VxS2V5KHRvKzEpLCBmdW5jKGsgc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJCW4sIF8gOj0gc3RyY29udi5QYXJzZVVpbnQoc3RyaW5ncy5UcmltTGVmdChrLCAiMCIpLCAxMCwgNjQpCgkJCWZuKG4sIHYuKCpkZWNpc2lvbikpCgkJCXJldHVybiBmYWxzZQoJCX0pCgkJcmV0dXJuCgl9Cglmb3IgXywgcCA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KG51bWJlcnMsICIsIikgewoJCWlmIHN0cmluZ3MuVHJpbVNwYWNlKHApID09ICIiIHsKCQkJY29udGludWUKCQl9CgkJbiA6PSBwYXJzZU51bWJlcihwKQoJCWlmIHYgOj0gc2VudC5HZXQoc2VxS2V5KG4pKTsgdiAhPSBuaWwgewoJCQlmbihuLCB2LigqZGVjaXNpb24pKQoJCX0KCX0KfQoKLy8gTmV3VW5wYXVzZVJlcXVlc3QgaXMga2luZCAyOiBjbGVhciB0aGUgZmxhZ3Mgc2V0IGJlZm9yZSBpdHMgZGVsaXZlcnkgb24gdGhlIHBhdXNhYmxlIElTTSAob2JqZWN0IDApIG9yIHRoZSBhZG1pbgovLyBwcm9ncmFtIChvYmplY3QgMSksIDI0IGhvdXJzIGFmdGVyIGl0IGFycml2ZXMsIHVubGVzcyB0d28gZ3VhcmRpYW5zJyBmbGFncyBob2xkLgpmdW5jIE5ld1VucGF1c2VSZXF1ZXN0KGN1ciByZWFsbSwgb2JqZWN0IHVpbnQ4KSBSZXF1ZXN0IHsKCWlmIG9iamVjdCA+IDEgewoJCXBhbmljKCJobGdvdjogdGhlIG9iamVjdCBpcyAwICh0aGUgcGF1c2FibGUgSVNNKSBvciAxICh0aGUgYWRtaW4gcHJvZ3JhbSkiKQoJfQoJbmFtZSA6PSAidGhlIHBhdXNhYmxlIElTTSIKCWlmIG9iamVjdCA9PSAxIHsKCQluYW1lID0gInRoZSBhZG1pbiBwcm9ncmFtIgoJfQoJcmV0dXJuIHByb3Bvc2VLaW5kKGN1ciwgS2luZFVucGF1c2UsICJ1bnBhdXNlIiwgInVucGF1c2UgIituYW1lLCBbXWJ5dGV7b2JqZWN0fSwgZnVuYygpIHt9KQp9CgpmdW5jIHBhcnNlVG9rZW4odG9rZW4gdWludDgpIHN0cmluZyB7Cglzd2l0Y2ggdG9rZW4gewoJY2FzZSAwOgoJCXJldHVybiAiR05PVCIKCWNhc2UgMToKCQlyZXR1cm4gIkJVQkJMRSIKCX0KCXBhbmljKCJobGdvdjogdGhlIHRva2VuIGlzIDAgKEdOT1QpIG9yIDEgKEJVQkJMRSkiKQp9CgovLyBOZXdTZXRUb2tlbklTTVJlcXVlc3QgaXMga2luZCAzOiBwb2ludCBhIHRva2VuICgwIEdOT1QsIDEgQlVCQkxFKSBhdCB0aGUgcGF1c2FibGUgSVNNLCBvciBhdCBub25lIChhbGwgemVyb3MpLgpmdW5jIE5ld1NldFRva2VuSVNNUmVxdWVzdChjdXIgcmVhbG0sIHRva2VuIHVpbnQ4LCBpc20gc3RyaW5nKSBSZXF1ZXN0IHsKCW5hbWUgOj0gcGFyc2VUb2tlbih0b2tlbikKCWsgOj0gbXVzdEtleShpc20pCglpZiBrICE9IG11c3RLZXkobGF1bmNoUGF1c2FibGVJU00pICYmIGsgIT0gKFszMl1ieXRle30pIHsKCQlwYW5pYygiaGxnb3Y6IHRoZSBJU00gbXVzdCBiZSB0aGUgcGF1c2FibGUgSVNNICIgKyBsYXVuY2hQYXVzYWJsZUlTTSArICIgb3IgYWxsIHplcm9zIikKCX0KCXBhcmFtcyA6PSBhcHBlbmQoW11ieXRle3Rva2VufSwga1s6XS4uLikKCXJldHVybiBwcm9wb3NlS2luZChjdXIsIEtpbmRUb2tlbklTTSwgInNldCB0b2tlbiBJU00iLCAic2V0ICIrbmFtZSsiJ3MgSVNNIHRvICIraHgoa1s6XSksIHBhcmFtcywgZnVuYygpIHt9KQp9CgovLyBOZXdTZXRDbGllbnRMYXlvdXRSZXF1ZXN0IGlzIGtpbmQgNCwgd2hpY2ggwqcxMyByZXNlcnZlcyAodjI3LCBBTTcpOiB0aGUgY2xpZW50J3Mgc3RhdGUgbGF5b3V0IHRoZSBwYXVzYWJsZSBJU00KLy8gYW5kIHRoZSBpbW11dGFibGUgYWRtaW4gcHJvZ3JhbSByZWFkIGlzIGZpeGVkIGZvciB0aGUgZGVwbG95bWVudCdzIGxpZmUgKHZlcnNpb24gMSksIGEgY2xpZW50IHVwZ3JhZGUga2VlcHMgaXQsCi8vIGFuZCBhIG5ldyBsYXlvdXQgaXMgYSBzdWNjZXNzb3IgYWRtaW4gcHJvZ3JhbSBhbmQgcGF1c2FibGUgSVNNIGJ5IGtpbmQgOS4gVGhlIGJ1aWxkZXIgcmVmdXNlcyBldmVyeSBjYWxsLCBzbyBubwovLyBraW5kLTQgbWVzc2FnZSBldmVyIGxlYXZlcyBoZXJlOyB0aGUgYWRtaW4gcHJvZ3JhbSByZWZ1c2VzIG9uZSBhdCBleGVjdXRpb24gdG9vLgpmdW5jIE5ld1NldENsaWVudExheW91dFJlcXVlc3QoY3VyIHJlYWxtLCB0YXJnZXQgc3RyaW5nLCB2ZXJzaW9uIHVpbnQ4KSBSZXF1ZXN0IHsKCXBhbmljKCJobGdvdjoga2luZCA0IGlzIHJlc2VydmVkOiB0aGUgY2xpZW50J3Mgc3RhdGUgbGF5b3V0IGlzIGZpeGVkIGZvciB0aGUgZGVwbG95bWVudCdzIGxpZmUgKHZlcnNpb24gMSk7IGEgbmV3IGxheW91dCBpcyBhIHN1Y2Nlc3NvciBieSBraW5kIDkiKQp9CgovLyBwYXJzZVNlYXRDaGFuZ2VzIHJlYWRzICJzZWF0OnB1YmtleSIgcGFpcnMgKGNvbW1hIHNlcGFyYXRlZDsgdGhlIHB1YmtleSBpbiBiYXNlNTggb3IgaGV4KTogc2VhdHMgMeKAkzYsIHR3bwovLyBndWFyZGlhbiBzZWF0cyBhdCBtb3N0LCBmb3VyIGVudHJpZXMgYXQgbW9zdCwgbm8gc2VhdCBvciBrZXkgdHdpY2UuCmZ1bmMgcGFyc2VTZWF0Q2hhbmdlcyhjaGFuZ2VzIHN0cmluZykgKFtdaW50LCBbXVszMl1ieXRlKSB7Cgl2YXIgbnMgW11pbnQKCXZhciBrcyBbXVszMl1ieXRlCglnIDo9IDAKCWZvciBfLCBwIDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQoY2hhbmdlcywgIiwiKSB7CgkJaSA6PSBzdHJpbmdzLkluZGV4KHAsICI6IikKCQlpZiBpIDwgMCB7CgkJCXBhbmljKCJobGdvdjogYSBjaGFuZ2UgaXMgc2VhdDpwdWJrZXksIG5vdCAiICsgcCkKCQl9CgkJbiwgZXJyIDo9IHN0cmNvbnYuQXRvaShzdHJpbmdzLlRyaW1TcGFjZShwWzppXSkpCgkJaWYgZXJyICE9IG5pbCB8fCBuIDwgMSB8fCBuID4gc2VhdENvdW50IHsKCQkJcGFuaWMoImhsZ292OiB0aGUgc2VhdCBtdXN0IGJlIDEgdG8gNiwgbm90ICIgKyBwWzppXSkKCQl9CgkJZm9yIF8sIHggOj0gcmFuZ2UgbnMgewoJCQlpZiB4ID09IG4gewoJCQkJcGFuaWMoImhsZ292OiBzZWF0ICIgKyBzdHJjb252Lkl0b2EobikgKyAiIG5hbWVkIHR3aWNlIikKCQkJfQoJCX0KCQlrIDo9IG11c3RLZXkocFtpKzE6XSkKCQlpZiBrID09IChbMzJdYnl0ZXt9KSB7CgkJCXBhbmljKCJobGdvdjogYSBwdWJrZXkgb2YgemVyb3MiKQoJCX0KCQlmb3IgXywgeCA6PSByYW5nZSBrcyB7CgkJCWlmIHggPT0gayB7CgkJCQlwYW5pYygiaGxnb3Y6IGEgcHVia2V5IG5hbWVkIHR3aWNlIikKCQkJfQoJCX0KCQlpZiBuIDw9IGd1YXJkaWFuU2VhdHMgewoJCQlnKysKCQl9CgkJbnMgPSBhcHBlbmQobnMsIG4pCgkJa3MgPSBhcHBlbmQoa3MsIGspCgl9CglpZiBsZW4obnMpID09IDAgfHwgbGVuKG5zKSA+IG1heFNlYXRDaGFuZ2VzIHsKCQlwYW5pYygiaGxnb3Y6IDEgdG8gIiArIHN0cmNvbnYuSXRvYShtYXhTZWF0Q2hhbmdlcykgKyAiIHNlYXRzIHBlciBkZWNpc2lvbiIpCgl9CglpZiBnID4gMiB7CgkJcGFuaWMoImhsZ292OiB0d28gZ3VhcmRpYW4gc2VhdHMgYXQgbW9zdCBwZXIgZGVjaXNpb24iKQoJfQoJcmV0dXJuIG5zLCBrcwp9CgovLyBzZWF0V2FybmluZ3MgbmFtZXMgdGhlIGtleXMgdGhhdCBob2xkIGEgc2VhdCBhcyB0aGlzIHJlYWxtIGxhc3Qgc2V0IGl0LiBUaGUgcmVhbCBzZWF0cyBhcmUgU29sYW5hJ3MsIGFuZCB0aGUKLy8gYWRtaW4gcHJvZ3JhbSByZWZ1c2VzIGEgc2VhdCdzIGN1cnJlbnQga2V5IGl0c2VsZiAowqc2LjUpLCBzcGVuZGluZyB0aGUgZGVjaXNpb246IGEgdHJ1ZSBuby1vcC4gVGhlIG1pcnJvciBoZXJlCi8vIGNhbiBzaXQgYWhlYWQgb2YgdGhlIHRydXRoIChhIGtpbmQgNSB0aGUgYWRtaW4gcHJvZ3JhbSBzcGVudCkgb3IgYmVoaW5kIGl0IChhIGtpbmQgNSBvZiBhbm90aGVyIGRlY2lzaW9uIG1vdmVkIGEgc2VhdCksCi8vIHNvIGl0IGlzIG5vIGdyb3VuZCB0byByZWZ1c2UgYSBwcm9wb3NhbCDigJQgdGhlIGJ1aWxkZXIgd2FybnMgaW4gdGhlIGRlc2NyaXB0aW9uIGFuZCB0aGUgbWVtYmVyIHJlYWRzCi8vIGBobHdhdGNoYCdzIGxpc3Qgb2YgdGhlIHNlYXRzIGFzIHRoZXkgc3RhbmQuCmZ1bmMgc2VhdFdhcm5pbmdzKG5zIFtdaW50LCBrcyBbXVszMl1ieXRlKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgaSA6PSByYW5nZSBucyB7CgkJZm9yIHMgOj0gMTsgcyA8PSBzZWF0Q291bnQ7IHMrKyB7CgkJCWlmIHNvbFNlYXRzW3NdID09IGtzW2ldIHsKCQkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCBoeChrc1tpXVs6XSkrIiBob2xkcyBzZWF0ICIrc3RyY29udi5JdG9hKHMpKyIgYXMgbGFzdCBzZXQgaGVyZSIpCgkJCX0KCQl9Cgl9CglpZiBsZW4ocGFydHMpID09IDAgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuICIgKHdhcm5pbmc6ICIgKyBzdHJpbmdzLkpvaW4ocGFydHMsICI7ICIpICsgIiDigJQgdGhlIGFkbWluIHByb2dyYW0gc3BlbmRzIGEgZGVjaXNpb24gbmFtaW5nIGEgc2VhdCdzIGN1cnJlbnQga2V5LCBzbyBjaGVjayB0aGUgc2VhdHMgYXMgdGhleSBzdGFuZCBvbiBTb2xhbmEgYmVmb3JlIHZvdGluZykiCn0KCi8vIE5ld1NldEd1YXJkaWFuc1JlcXVlc3QgaXMga2luZCA1OiByZXBsYWNlIGd1YXJkaWFuIHNlYXRzICgx4oCTNCwgdHdvIGF0IG1vc3QpIGFuZCB3YXRjaCBzbG90cyAoNeKAkzYpIG9uIFNvbGFuYSwKLy8gZm91ciBlbnRyaWVzIGF0IG1vc3QuIEEga2V5IHRoYXQgaG9sZHMgYSBzZWF0IGFzIHRoaXMgcmVhbG0gbGFzdCBzZXQgaXQgaXMgd2FybmVkIGFib3V0IGluIHRoZSBkZXNjcmlwdGlvbiwKLy8gbm90IHJlZnVzZWQ6IHRoZSBhZG1pbiBwcm9ncmFtJ3Mgb3duIGNoZWNrIHNwZW5kcyBhIGRlY2lzaW9uIG5hbWluZyBhIHNlYXQncyBjdXJyZW50IGtleSwgYW5kIHRoaXMgcmVhbG0ncwovLyBtaXJyb3Igb2YgdGhlIHNlYXRzIGNhbiBkcmlmdCBmcm9tIHRoZSB0cnV0aC4gSXQgbGFuZHMgNyBkYXlzIGFmdGVyIGRlbGl2ZXJ5IHRocm91Z2ggYW55IGZsYWcgb3IgaG9sZC4KZnVuYyBOZXdTZXRHdWFyZGlhbnNSZXF1ZXN0KGN1ciByZWFsbSwgY2hhbmdlcyBzdHJpbmcpIFJlcXVlc3QgewoJbXVzdEJlTGl2ZSgpCglucywga3MgOj0gcGFyc2VTZWF0Q2hhbmdlcyhjaGFuZ2VzKQoJcGFyYW1zIDo9IFtdYnl0ZXtieXRlKGxlbihucykpfQoJcGFydHMgOj0gbWFrZShbXXN0cmluZywgbGVuKG5zKSkKCWZvciBpLCBuIDo9IHJhbmdlIG5zIHsKCQlwYXJhbXMgPSBhcHBlbmQocGFyYW1zLCBieXRlKG4pKQoJCXBhcmFtcyA9IGFwcGVuZChwYXJhbXMsIGtzW2ldWzpdLi4uKQoJCXBhcnRzW2ldID0gInNlYXQgIiArIHN0cmNvbnYuSXRvYShuKSArICIgdG8gIiArIGh4KGtzW2ldWzpdKQoJfQoJdGV4dCA6PSAic2V0IGd1YXJkaWFucyBhbmQgd2F0Y2gga2V5czogIiArIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikgKyBzZWF0V2FybmluZ3MobnMsIGtzKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCAic2V0IGd1YXJkaWFucyIsIHRleHQsIGZ1bmMoY3VyIHJlYWxtLCBtYWRlLCB0IGludDY0KSB7CgkJbXVzdEJlTGl2ZSgpCgkJbiA6PSBkaXNwYXRjaChjdXIsIEtpbmRHdWFyZGlhbnMsIHBhcmFtcywgdGV4dCwgdCkKCQlmb3IgaSwgcyA6PSByYW5nZSBucyB7CgkJCXNvbFNlYXRzW3NdID0ga3NbaV0KCQl9CgkJZCA6PSBsZWRnZXIuUmVjb3JkKCJzZXQgZ3VhcmRpYW5zIiwgdGV4dCwga2luZFBhcmFtc3traW5kOiBLaW5kR3VhcmRpYW5zLCBwYXJhbXM6IHBhcmFtcywgc2VhdHM6IG5zLCBrZXlzOiBrc30sIG1hZGUsIHQsIHQpCgkJbGVkZ2VyLkFwcGx5KGQsIHQsICJkaXNwYXRjaGVkIGFzIGRlY2lzaW9uICIrdTY0cyhuKSkKCX0pCn0KCi8vIE5ld0Vucm9sbFJvdXRlclJlcXVlc3QgaXMga2luZCA2OiBlbnJvbGwgYSB0b2tlbidzIHJlbW90ZSByb3V0ZXIgZm9yIGEgZG9tYWluLiBGb3IgZ25vLmxhbmQncyBvd24gZG9tYWluIHRoZQovLyByb3V0ZXIgbXVzdCBiZSBhIHJvdXRlIHJlYWxtIHJlZ2lzdGVyZWQgd2l0aCBobG1haWxib3gg4oCUIHRoZSBsYXVuY2ggcm91dGVzLCBhbmQgdGhlIHN1Y2Nlc3NvcnMgdGhlaXIgbWlncmF0aW9ucwovLyBuYW1lZCDigJQgYXMgMzIgYnl0ZXM6IHRoZSBzeW50aGV0aWMgcHJvZ3JhbSB0YWtlcyBldmVyeSBEaXNwYXRjaCBmcm9tIHRoZSByb3V0ZXIgaXQgZW5yb2xscyBhcyBhIG1pbnQgb3JkZXIsIGFuZAovLyBobG1haWxib3gncyBEaXNwYXRjaCBpcyBvcGVuIHRvIGFueSByZWFsbSwgc28gYW55IG90aGVyIGFkZHJlc3Mgd291bGQgbWludCBzeW50aGV0aWMgdGhhdCBubyBsb2NrIGJhY2tzOyB0aGUKLy8gdG9rZW4ncyBvd24gcm91dGUgKFIzNiksIHVubWlncmF0ZWQsIGFuZCDigJQgYSBzdWNjZXNzb3Ig4oCUIG9uZSB0aGF0IHB1bGxlZCBwYWdlIDAgKFIzNSkuIFRoZSBydWxlcyBhcmUgY2hlY2tlZAovLyB3aGVuIHRoZSBwcm9wb3NhbCBpcyBtYWRlIGFuZCBhZ2FpbiB3aGVuIGl0IGV4ZWN1dGVzLiBUaGUgY2xvc3VyZSB0aGVuIG5vdGVzIHdpdGggdGhlIG1haWxib3ggdGhlIHJvdXRlIGl0Ci8vIGVucm9sbGVkIGFuZCB0aGUgaGVpZ2h0IChobG1haWxib3guTm90ZUVucm9sbGVkLCBBUjEpOiB0aGF0IHJvdXRlJ3MgcmVmdW5kIGJ1aWxkZXIgd2FpdHMgMTQgZGF5cyBhZnRlciB0aGUgbm90ZQovLyAoUjM3OiBhIHdlZWsgZm9yIHRoZSBkZWxpdmVyeSwgYSB3ZWVrIGZvciBTb2xhbmEncyBjbG9jayksIHNpbmNlIGEgcmVmdW5kZWQgc2VuZCBzdGF5cyBkZWxpdmVyYWJsZSBvbiBTb2xhbmEKLy8gdW50aWwgdGhlIHByZWRlY2Vzc29yJ3Mgcm91dGVyIGlzIHJlcGxhY2VkOyBhIGNhbmNlbCBvZiB0aGUga2luZCA2IGNsZWFycyB0aGUgbm90ZSAoTmV3Q2FuY2VsUmVxdWVzdCkuCmZ1bmMgTmV3RW5yb2xsUm91dGVyUmVxdWVzdChjdXIgcmVhbG0sIHRva2VuIHVpbnQ4LCBkb21haW4gdWludDMyLCByb3V0ZXIgc3RyaW5nKSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJbmFtZSA6PSBwYXJzZVRva2VuKHRva2VuKQoJayA6PSBtdXN0S2V5KHJvdXRlcikKCWlmIGsgPT0gKFszMl1ieXRle30pIHx8IGRvbWFpbiA9PSAwIHsKCQlwYW5pYygiaGxnb3Y6IHRoZSByb3V0ZXIgYW5kIHRoZSBkb21haW4gbXVzdCBiZSBzZXQiKQoJfQoJbG9jYWwgOj0gZG9tYWluID09IGhsbWFpbGJveC5Mb2NhbERvbWFpbigpCgljaGVjayA6PSBmdW5jKCkgc3RyaW5nIHsKCQlpZiAhbG9jYWwgewoJCQlyZXR1cm4gIiIKCQl9CgkJcGF0aCA6PSByb3V0ZVBhdGhPZihrKQoJCWlmIHBhdGggPT0gIiIgewoJCQlwYW5pYygiaGxnb3Y6IGZvciB0aGlzIGNoYWluJ3MgZG9tYWluIHRoZSByb3V0ZXIgbXVzdCBiZSBhIHJvdXRlIHJlYWxtIHJlZ2lzdGVyZWQgd2l0aCBobG1haWxib3gsIG5vdCAiICsgaHgoa1s6XSkpCgkJfQoJCS8vIHRoZSB0b2tlbidzIG93biByb3V0ZSwgYW5kIGEgbGl2ZSBvbmUgKFIzNik6IHRoZSBvdGhlciB0b2tlbidzIHJvdXRlIOKAlCBvciBpdHMgc3VjY2Vzc29yIOKAlCBhcyB0aGlzCgkJLy8gdG9rZW4ncyByb3V0ZXIgc3RyYW5kcyB0aGlzIHRva2VuJ3MgYnVybnMgYmVoaW5kIHBlci1pZCB2b3RlcyB1bnRpbCBhIGNvcnJlY3RpdmUga2luZCA2IGxhbmRzLCByZWZ1c2VzCgkJLy8gaXRzIHNlbmRzIG9uIFNvbGFuYSBtZWFud2hpbGUsIGFuZCB3cml0ZXMgdGhlIGVucm9sbWVudCBub3RlIG9uIHRoZSBvdGhlciByb3V0ZSwgb3BlbmluZyBpdHMgcmVmdW5kcwoJCS8vIHdoaWxlIHRoZSBvdGhlciB0b2tlbidzIHJvdXRlciBzdGlsbCBkZWxpdmVycyAoQVIxJ3MgZG91YmxlIG1pbnQgYWdhaW4pOyBhIG1pZ3JhdGVkIHJvdXRlJ3Mgc3VjY2Vzc29yCgkJLy8gaXMgdGhlIHRva2VuJ3Mgcm91dGVyLCBuZXZlciB0aGUgcm91dGUgaXRzZWxmCgkJaWYgc3ltIDo9IGhsbWFpbGJveC5Sb3V0ZVN5bWJvbChwYXRoKTsgc3ltID09ICIiIHsKCQkJcGFuaWMoImhsZ292OiAiICsgcGF0aCArICIgaXMgcmVnaXN0ZXJlZCBmb3Igbm8gdG9rZW4gKGl0IG5ldmVyIGFubm91bmNlZCB0aGUgcm91dGUgaXQgc3VjY2VlZHMpOiBhIGtpbmQgNiBuYW1lcyB0aGUgdG9rZW4ncyBvd24gcm91dGUiKQoJCX0gZWxzZSBpZiBzeW0gIT0gbmFtZSB7CgkJCXBhbmljKCJobGdvdjogIiArIHBhdGggKyAiIGlzIHRoZSAiICsgc3ltICsgIiByb3V0ZSdzLCBub3QgIiArIG5hbWUgKyAiJ3M6IGEga2luZCA2IG5hbWVzIHRoZSB0b2tlbidzIG93biByb3V0ZSIpCgkJfQoJCWlmIHMgOj0gaGxtYWlsYm94LlN1Y2Nlc3NvcihwYXRoKTsgcyAhPSAiIiB7CgkJCXBhbmljKCJobGdvdjogIiArIHBhdGggKyAiIG1pZ3JhdGVkIHRvICIgKyBzICsgIjogbmV2ZXIgYSBtaWdyYXRlZCByb3V0ZSwgc2luY2UgaXRzIHN1Y2Nlc3NvciBpcyB0aGUgdG9rZW4ncyByb3V0ZXIiKQoJCX0KCQkvLyBhIHN1Y2Nlc3NvciB0aGF0IHB1bGxlZCBub3RoaW5nIGlzIG5ldmVyIGVucm9sbGVkIChSMzUpOiBiZWZvcmUgcGFnZSAwIGl0cyBtaWdyYXRpb24gbWF5IHN0aWxsIGJlCgkJLy8gcmUtcG9pbnRlZCAoQVIyKSBhbmQgdGhlIHJvdXRlIGRyb3BwZWQg4oCUIGEgcmVhbG0gaW4gbm9ib2R5J3MgY2hhaW4gdGhhdCBTb2xhbmEgd291bGQgdGhlbiBuYW1lIHRoZQoJCS8vIHJvdXRlciBmb3IgdGhlIGRlcGxveW1lbnQncyBsaWZlLCBldmVyeSBidXJuJ3MgcmVjaXBpZW50LCBmbGFnZ2FibGUgYnkgbm9ib2R5CgkJaWYgcHJlZCA6PSBobG1haWxib3guUHJlZGVjZXNzb3IocGF0aCk7IHByZWQgIT0gIiIgJiYgIWhsbWFpbGJveC5QdWxsZWQocGF0aCkgewoJCQlwYW5pYygiaGxnb3Y6ICIgKyBwYXRoICsgIiBzdWNjZWVkcyAiICsgcHJlZCArICIgYW5kIGhhcyBwdWxsZWQgbm90aGluZyB5ZXQgKHBhZ2UgMCBpcyBub3QgaW4pOiBhIGtpbmQgNiBlbnJvbGxpbmcgaXQgd2FpdHMgZm9yIGl0cyBmaXJzdCBwYWdlLCBzaW5jZSBhIG1pZ3JhdGUgdGhhdCBwdWxsZWQgbm90aGluZyBtYXkgYmUgcmUtcG9pbnRlZCBhbmQgU29sYW5hIG11c3QgbmV2ZXIgbmFtZSBhIGRyb3BwZWQgcm91dGUiKQoJCX0KCQlyZXR1cm4gcGF0aAoJfQoJcGFyYW1zIDo9IGFwcGVuZChhcHBlbmQoW11ieXRle3Rva2VufSwgYmUzMihkb21haW4pLi4uKSwga1s6XS4uLikKCXRleHQgOj0gImVucm9sbCAiICsgbmFtZSArICIncyByb3V0ZXIgZm9yIGRvbWFpbiAiICsgc3RyY29udi5Gb3JtYXRVaW50KHVpbnQ2NChkb21haW4pLCAxMCkgKyAiOiAiICsgaHgoa1s6XSkKCW11c3RGaXQoYm9keShLaW5kUm91dGVyLCAwLCBwYXJhbXMpKQoJY2hlY2soKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCAiZW5yb2xsIHJvdXRlciIsIHRleHQsIGZ1bmMoY3VyIHJlYWxtLCBtYWRlLCB0IGludDY0KSB7CgkJbXVzdEJlTGl2ZSgpCgkJcGF0aCA6PSBjaGVjaygpCgkJbiA6PSBkaXNwYXRjaChjdXIsIEtpbmRSb3V0ZXIsIHBhcmFtcywgdGV4dCwgdCkKCQlub3RlIDo9ICJkaXNwYXRjaGVkIGFzIGRlY2lzaW9uICIgKyB1NjRzKG4pCgkJaWYgcGF0aCAhPSAiIiB7CgkJCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgkJCWhsbWFpbGJveC5Ob3RlRW5yb2xsZWQoY3Jvc3MoY3VyKSwgcGF0aCwgaCkKCQkJc2QgOj0gc2VudC5HZXQoc2VxS2V5KG4pKS4oKmRlY2lzaW9uKQoJCQlzZC5yb3V0ZSwgc2QuaGVpZ2h0ID0gcGF0aCwgaAoJCQlub3RlICs9ICI7ICIgKyBwYXRoICsgIiBub3RlZCBlbnJvbGxlZCBvbiBTb2xhbmEgYXQgaGVpZ2h0ICIgKyBpdG9hKGgpCgkJfQoJCWQgOj0gbGVkZ2VyLlJlY29yZCgiZW5yb2xsIHJvdXRlciIsIHRleHQsIGtpbmRQYXJhbXN7a2luZDogS2luZFJvdXRlciwgcGFyYW1zOiBwYXJhbXN9LCBtYWRlLCB0LCB0KQoJCWxlZGdlci5BcHBseShkLCB0LCBub3RlKQoJfSkKfQoKLy8gcm91dGVQYXRoT2YgaXMgdGhlIHBrZ3BhdGggb2YgdGhlIHJvdXRlIHJlYWxtIGhsbWFpbGJveCByZWdpc3RlcnMgd2hvc2UgYWRkcmVzcywgYXMgMzIgYnl0ZXMsIGlzIGs7ICIiIGlmIG5vbmUuCmZ1bmMgcm91dGVQYXRoT2YoayBbMzJdYnl0ZSkgc3RyaW5nIHsKCWZvciBfLCBwYXRoIDo9IHJhbmdlIGhsbWFpbGJveC5Sb3V0ZXMoKSB7CgkJaWYgYiwgZXJyIDo9IGhsLkFkZHJlc3NUb0J5dGVzMzIoY2hhaW4uUGFja2FnZUFkZHJlc3MocGF0aCkpOyBlcnIgPT0gbmlsICYmIGIgPT0gayB7CgkJCXJldHVybiBwYXRoCgkJfQoJfQoJcmV0dXJuICIiCn0KCi8vIE5ld1NldFByb3RvY29sRmVlUmVxdWVzdCBpcyBraW5kIDc6IHRoZSBtYWlsYm94J3MgcHJvdG9jb2wgZmVlIChsYW1wb3J0cywgYXQgbW9zdCBpdHMgMC4wNSBTT0wgbWF4aW11bSkgYW5kIGl0cwovLyBiZW5lZmljaWFyeSAodGhlIHRyZWFzdXJlcidzIFNvbGFuYSBrZXkpLgpmdW5jIE5ld1NldFByb3RvY29sRmVlUmVxdWVzdChjdXIgcmVhbG0sIGxhbXBvcnRzIHVpbnQ2NCwgYmVuZWZpY2lhcnkgc3RyaW5nKSBSZXF1ZXN0IHsKCWlmIGxhbXBvcnRzID4gbWF4UHJvdG9jb2xGZWUgewoJCXBhbmljKCJobGdvdjogdGhlIGZlZSBpcyBhdCBtb3N0ICIgKyB1NjRzKG1heFByb3RvY29sRmVlKSArICIgbGFtcG9ydHMsIHRoZSBtYWlsYm94J3MgbWF4aW11bSIpCgl9CglrIDo9IG11c3RLZXkoYmVuZWZpY2lhcnkpCglpZiBrID09IChbMzJdYnl0ZXt9KSB7CgkJcGFuaWMoImhsZ292OiBhIGJlbmVmaWNpYXJ5IG9mIHplcm9zIikKCX0KCXBhcmFtcyA6PSBhcHBlbmQoYmU2NChsYW1wb3J0cyksIGtbOl0uLi4pCglyZXR1cm4gcHJvcG9zZUtpbmQoY3VyLCBLaW5kUHJvdG9jb2xGZWUsICJzZXQgcHJvdG9jb2wgZmVlIiwgInNldCB0aGUgcHJvdG9jb2wgZmVlIHRvICIrdTY0cyhsYW1wb3J0cykrIiBsYW1wb3J0cyBmb3IgIitoeChrWzpdKSwgcGFyYW1zLCBmdW5jKCkge30pCn0KCi8vIE5ld1VwZ3JhZGVSZXF1ZXN0IGlzIGtpbmQgODogdXBncmFkZSBhIHByb2dyYW0gZnJvbSBhIHN0YWdlZCBidWZmZXIgd2hvc2UgRUxGIGhhc2hlcyB0byBlbGZIYXNoIChzaGEyNTYsIGhleCkg4oCUCi8vIG5ldmVyIHRoZSBhZG1pbiBwcm9ncmFtJ3Mgb3duIGlkICjCpzEzOiBpdHMgdXBncmFkZSBhdXRob3JpdHkgaXMgYnVybmVkLCBzbyB0aGUgZGVjaXNpb24gY291bGQgb25seSBiZSBzcGVudDsgYQovLyBuZXcgYWRtaW4gcHJvZ3JhbSBpcyBhIHN1Y2Nlc3NvciBieSBraW5kIDkpLCBjaGVja2VkIHdoZW4gdGhlIHByb3Bvc2FsIGlzIG1hZGUgYW5kIHdoZW4gaXQgZXhlY3V0ZXMuCmZ1bmMgTmV3VXBncmFkZVJlcXVlc3QoY3VyIHJlYWxtLCBwcm9ncmFtLCBidWZmZXIsIGVsZkhhc2ggc3RyaW5nKSBSZXF1ZXN0IHsKCXAsIGIsIGggOj0gbXVzdEtleShwcm9ncmFtKSwgbXVzdEtleShidWZmZXIpLCBtdXN0S2V5KGVsZkhhc2gpCglpZiBwID09IChbMzJdYnl0ZXt9KSB8fCBiID09IChbMzJdYnl0ZXt9KSB8fCBoID09IChbMzJdYnl0ZXt9KSB8fCBwID09IGIgewoJCXBhbmljKCJobGdvdjogdGhlIHByb2dyYW0sIHRoZSBidWZmZXIgYW5kIHRoZSBoYXNoIG11c3QgYmUgc2V0IGFuZCBkaXN0aW5jdCIpCgl9CgljaGVjayA6PSBmdW5jKCkgewoJCWlmIHAgPT0gcmVjaXBpZW50IHsKCQkJcGFuaWMoImhsZ292OiBuZXZlciB0aGUgYWRtaW4gcHJvZ3JhbSdzIG93biBpZCAoIiArIGh4KHBbOl0pICsgIik6IGl0IGlzIGltbXV0YWJsZSwgYSBuZXcgYWRtaW4gcHJvZ3JhbSBpcyBhIHN1Y2Nlc3NvciBieSBraW5kIDkiKQoJCX0KCX0KCXBhcmFtcyA6PSBhcHBlbmQoYXBwZW5kKGFwcGVuZChbXWJ5dGV7fSwgcFs6XS4uLiksIGJbOl0uLi4pLCBoWzpdLi4uKQoJcmV0dXJuIHByb3Bvc2VLaW5kKGN1ciwgS2luZFVwZ3JhZGUsICJ1cGdyYWRlIiwgInVwZ3JhZGUgIitoeChwWzpdKSsiIGZyb20gYnVmZmVyICIraHgoYls6XSkrIiB3aXRoIEVMRiBzaGEyNTYgIitoeChoWzpdKSwgcGFyYW1zLCBjaGVjaykKfQoKLy8gTmV3VHJhbnNmZXJUb1N1Y2Nlc3NvclJlcXVlc3QgaXMga2luZCA5OiBoYW5kIGV2ZXJ5IGF1dGhvcml0eSB0byBhbiBpbW11dGFibGUgc3VjY2Vzc29yIGFkbWluIHByb2dyYW0g4oCUIG5ldmVyCi8vIHRoZSBhZG1pbiBwcm9ncmFtIGl0c2VsZiwgdGhlIGRlY2lzaW9uIHJlY2lwaWVudCB0aGlzIHJlYWxtIGtub3dzLCBjaGVja2VkIHdoZW4gdGhlIHByb3Bvc2FsIGlzIG1hZGUgYW5kIGFnYWluCi8vIHdoZW4gaXQgZXhlY3V0ZXMgKGEgcmVjaXBpZW50IHN3YXAgbGFuZGluZyBpbiBiZXR3ZWVuIHdvdWxkIG90aGVyd2lzZSB0dXJuIGEgcHJlLWFybWVkIHRyYW5zZmVyIGludG8gb25lIHRoZQovLyBhZG1pbiBwcm9ncmFtIG9ubHkgc3BlbmRzOiBpdCByZS1wb2ludHMgZXZlcnkgYXV0aG9yaXR5IHRvIGl0c2VsZiBhbmQgZGllcyBvbiBpdHMgb3duIFN1Y2Nlc3NvckluaXQsIHRoZQovLyBwcm9ncmFtcyBsYW5lJ3MgUy0xNSksIGFzIGtpbmQgOCByZWZ1c2VzIGl0cyBzZWxmLXVwZ3JhZGU7IGFuZCBuZXZlciBhIGZvcm1lciByZWNpcGllbnQgKFIyOSksIGEgcmV0aXJlZCBwcm9ncmFtCi8vIHdob3NlIHN1Y2Nlc3Nvcl9pbml0IGFuc3dlcnMgTm90SW5oZXJpdGVkLiBUaGUgYWRtaW4gcHJvZ3JhbSByZWZ1c2VzIGEgc3VjY2Vzc29yIHdob3NlIHByb2dyYW1kYXRhIHNob3dzIGFuCi8vIHVwZ3JhZGUgYXV0aG9yaXR5OyB0aGUgYnVpbGRlciBjYW5ub3QgcmVhZCBTb2xhbmEsIHNvIGEgbWVtYmVyIGNoZWNrcyB0aGF0IGJ5IFJQQyBiZWZvcmUgcHJvcG9zaW5nLgpmdW5jIE5ld1RyYW5zZmVyVG9TdWNjZXNzb3JSZXF1ZXN0KGN1ciByZWFsbSwgcHJvZ3JhbSBzdHJpbmcpIFJlcXVlc3QgewoJcCA6PSBtdXN0S2V5KHByb2dyYW0pCglpZiBwID09IChbMzJdYnl0ZXt9KSB7CgkJcGFuaWMoImhsZ292OiB0aGUgc3VjY2Vzc29yIG11c3QgYmUgc2V0IikKCX0KCWNoZWNrIDo9IGZ1bmMoKSB7CgkJaWYgcCA9PSByZWNpcGllbnQgewoJCQlwYW5pYygiaGxnb3Y6IG5ldmVyIHRoZSBhZG1pbiBwcm9ncmFtIGl0c2VsZiAoIiArIGh4KHBbOl0pICsgIiksIG5vdCB0aGUgY3VycmVudCBhZG1pbiBwcm9ncmFtIGFzIGl0cyBvd24gc3VjY2Vzc29yOiB0aGUgYWRtaW4gcHJvZ3JhbSB3b3VsZCBvbmx5IHNwZW5kIHRoZSBkZWNpc2lvbiIpCgkJfQoJCW11c3ROb3RCZUZvcm1lcihwLCAiYWRtaW4gcHJvZ3JhbSIpCgl9CglyZXR1cm4gcHJvcG9zZUtpbmQoY3VyLCBLaW5kU3VjY2Vzc29yLCAidHJhbnNmZXIgdG8gc3VjY2Vzc29yIiwgInRyYW5zZmVyIGV2ZXJ5IGF1dGhvcml0eSB0byAiK2h4KHBbOl0pLCBwWzpdLCBjaGVjaykKfQoKLy8gcm91dGVNYXhpbXVtIGlzIGEgdG9rZW4ncyBwZXItbWVzc2FnZSBtYXhpbXVtIG9uIGl0cyBnbm8ubGFuZCByb3V0ZSBub3cgKGJhc2UgdW5pdHMpOiB3aGF0IGEgc2VuZCBtYXkgY2Fycnkgb3V0LgpmdW5jIHJvdXRlTWF4aW11bSh0b2tlbiB1aW50OCkgdWludDY0IHsKCWlmIHRva2VuID09IDAgewoJCXJldHVybiB1aW50NjQoaGxnbm90Lk1heGltdW0oKSkKCX0KCXJldHVybiB1aW50NjQoaGxidWJibGUuTWF4aW11bSgpKQp9CgovLyBOZXdTZXRNaW50TGltaXRzUmVxdWVzdCBpcyBraW5kIDEyOiBhIHRva2VuJ3MgKDAgR05PVCwgMSBCVUJCTEUpIHBlci1tZXNzYWdlIG1heGltdW0gYW5kIHJvbGxpbmcgZGF5IGNhcCBvbiB0aGUKLy8gcGF1c2FibGUgSVNNLCBpbiBiYXNlIHVuaXRzICjCpzEzOiB0b2tlbiB1OCDigJYgbWF4aW11bSB1NjQg4oCWIGRheSBjYXAgdTY0OyBjb21waWxlZCB0aGVyZSBhdCBsYXVuY2ggYXMgMjUsMDAwIGEKLy8gbWVzc2FnZSBhbmQgMTAwLDAwMCBhIGRheSBvZiBlYWNoIHRva2VuKS4gQSBtYXhpbXVtIG9mIDAgKGV2ZXJ5IG1pbnQgcmVmdXNlZCkgYW5kIGEgZGF5IGNhcCBiZWxvdyB0aGUgbWF4aW11bSAoYQovLyBtZXNzYWdlIGF0IHRoZSBtYXhpbXVtIGNvdWxkIG5ldmVyIHBhc3MpIGFyZSByZWZ1c2VkIHdoZW4gdGhlIHByb3Bvc2FsIGlzIG1hZGU6IHRoZSBhZG1pbiBwcm9ncmFtIGFuZCB0aGUKLy8gcGF1c2FibGUgSVNNIHRha2UgYW55IHZhbHVlcywgc28gdGhlIG5vbnNlbnNlIGlzIGNhdWdodCBoZXJlLCBhcyBldmVyeSBidWlsZGVyIGNhdGNoZXMgaXQgZWFybHkuIFRoZSBtYXhpbXVtIGlzCi8vIG5ldmVyIGJlbG93IHRoZSB0b2tlbidzIHJvdXRlJ3MgcGVyLW1lc3NhZ2UgbWF4aW11bSBvbiBnbm8ubGFuZCAoUjE1KSwgY2hlY2tlZCB3aGVuIHRoZSBwcm9wb3NhbCBpcyBtYWRlIGFuZAovLyB3aGVuIGl0IGV4ZWN1dGVzOiBhIHNlbmQgYmV0d2VlbiB0aGUgdHdvIHdvdWxkIGxlYXZlIGduby5sYW5kIGFuZCBiZSByZWZ1c2VkIGF0IGRlbGl2ZXJ5IGZvciBnb29kLCBzdHJhbmRlZAovLyB1bnRpbCBhIHJlZnVuZCBieSBpZCDigJQgc28gYSByYWlzZSBpcyB0aGUgU29sYW5hIGxpbWl0IGZpcnN0ICh0aGlzKSwgdGhlIHJvdXRlJ3MgbWF4aW11bSBhZnRlciwgYW5kIGEgbG93ZXJpbmcKLy8gdGhlIG90aGVyIHdheSByb3VuZC4gSXQgbGFuZHMgNyBkYXlzIGFmdGVyIGRlbGl2ZXJ5LgpmdW5jIE5ld1NldE1pbnRMaW1pdHNSZXF1ZXN0KGN1ciByZWFsbSwgdG9rZW4gdWludDgsIG1heGltdW0sIGRheUNhcCB1aW50NjQpIFJlcXVlc3QgewoJbmFtZSA6PSBwYXJzZVRva2VuKHRva2VuKQoJaWYgbWF4aW11bSA9PSAwIHsKCQlwYW5pYygiaGxnb3Y6IHRoZSBwZXItbWVzc2FnZSBtYXhpbXVtIGlzIGF0IGxlYXN0IDEiKQoJfQoJaWYgZGF5Q2FwIDwgbWF4aW11bSB7CgkJcGFuaWMoImhsZ292OiB0aGUgZGF5IGNhcCBpcyBhdCBsZWFzdCB0aGUgcGVyLW1lc3NhZ2UgbWF4aW11bSIpCgl9CgljaGVjayA6PSBmdW5jKCkgewoJCWlmIHJtIDo9IHJvdXRlTWF4aW11bSh0b2tlbik7IG1heGltdW0gPCBybSB7CgkJCXBhbmljKCJobGdvdjogYSBwZXItbWVzc2FnZSBtYXhpbXVtIG9mICIgKyB1NjRzKG1heGltdW0pICsgIiBpcyBiZWxvdyB0aGUgIiArIG5hbWUgKyAiIHJvdXRlJ3MgbWF4aW11bSBvZiAiICsgdTY0cyhybSkgKyAiIChiYXNlIHVuaXRzKTogYSBzZW5kIGJldHdlZW4gdGhlIHR3byB3b3VsZCBzdHJhbmQgb24gU29sYW5hIOKAlCBsb3dlciB0aGUgcm91dGUncyBtYXhpbXVtIGZpcnN0LCB0aGVuIHRoaXMiKQoJCX0KCX0KCXBhcmFtcyA6PSBhcHBlbmQoW11ieXRle3Rva2VufSwgYmU2NChtYXhpbXVtKS4uLikKCXBhcmFtcyA9IGFwcGVuZChwYXJhbXMsIGJlNjQoZGF5Q2FwKS4uLikKCXRleHQgOj0gInNldCAiICsgbmFtZSArICIncyBtaW50IGxpbWl0czogIiArIHU2NHMobWF4aW11bSkgKyAiIGEgbWVzc2FnZSwgIiArIHU2NHMoZGF5Q2FwKSArICIgYSBkYXkgKGJhc2UgdW5pdHMpIgoJcmV0dXJuIHByb3Bvc2VLaW5kKGN1ciwgS2luZE1pbnRMaW1pdHMsICJzZXQgbWludCBsaW1pdHMiLCB0ZXh0LCBwYXJhbXMsIGNoZWNrKQp9CgovLyBtdXN0UmFpc2UgcmVmdXNlcyBhIHN5bmMgc2VxdWVuY2UgdGhhdCB3b3VsZCBub3QgcmFpc2UgdGhlIGNvdW50ZXIgKMKnNS4zOiBpdCBuZXZlciBsb3dlcnMgaXQpOiBuIGlzIHRoZSBudW1iZXIKLy8gdGhlIG5leHQgZGVjaXNpb24gdGFrZXMsIHNvIHRoZSBjb3VudGVyIGJlY29tZXMgbi0xLCB3aGljaCBtdXN0IGJlIGFib3ZlIHRoZSBjb3VudGVyIG5vdyDigJQgYW5kIGJ5IGF0IG1vc3QgMl4zMiwKLy8gdGhlIHJlYWxtJ3Mgb3duIGJvdW5kICjCpzEzLCBSMTg7IGtpbmQgMTAgaXMgcmVzZXJ2ZWQgc2luY2UgdjM1IGFuZCBtb3ZlcyBub3RoaW5nIG9uIFNvbGFuYSksIHNvIGEgbWlzdHlwZWQKLy8gbnVtYmVyIGNhbiBuZWl0aGVyIHdyYXAgdGhlIGNvdW50ZXIgb250byBudW1iZXJzIHRoZSBhZG1pbiBwcm9ncmFtIHJlY29yZGVkIG5vciBwdXQgZXZlcnkgZGVjaXNpb24gYmV5b25kIHRoZQovLyBuZXh0IG51bWJlciBpdCBleHBlY3RzLgpmdW5jIG11c3RSYWlzZShuIHVpbnQ2NCkgewoJaWYgbiA9PSBsYXN0KzEgewoJCXBhbmljKCJobGdvdjogdGhlIG5leHQgbnVtYmVyIGlzICIgKyB1NjRzKG4pICsgIiBhbHJlYWR5IikKCX0KCWlmIG4gPD0gbGFzdCB7CgkJcGFuaWMoImhsZ292OiBzeW5jIHNlcXVlbmNlIG9ubHkgZXZlciByYWlzZXMgdGhlIGNvdW50ZXI6IGl0IHN0YW5kcyBhdCAiICsgdTY0cyhsYXN0KSArICIgKHRoZSBuZXh0IG51bWJlciBpcyAiICsgdTY0cyhsYXN0KzEpICsgIikgYW5kICIgKyB1NjRzKG4pICsgIiBpcyBub3QgYWJvdmUgaXQiKQoJfQoJaWYgbiA+IGxhc3QrMStzeW5jUmVhY2ggewoJCXBhbmljKCJobGdvdjogc3luYyBzZXF1ZW5jZSByZWFjaGVzIGF0IG1vc3QgMl4zMiBhYm92ZSB0aGUgbmV4dCBudW1iZXIgKHRoZSByZWFsbSdzIG93biBib3VuZCk6IHRoZSBuZXh0IG51bWJlciBpcyAiICsgdTY0cyhsYXN0KzEpICsgIiBhbmQgIiArIHU2NHMobikgKyAiIGlzIGJleW9uZCAiICsgdTY0cyhsYXN0KzErc3luY1JlYWNoKSkKCX0KfQoKLy8gTmV3U3luY1NlcXVlbmNlUmVxdWVzdCByYWlzZXMgdGhpcyByZWFsbSdzIGNvdW50ZXIgc28gdGhhdCB0aGUgbmV4dCBkZWNpc2lvbiB0YWtlcyBudW1iZXIgbiDigJQgdGhlIG51bWJlciB0aGUKLy8gYWRtaW4gcHJvZ3JhbSBleHBlY3RzIG5leHQgYWZ0ZXIgYSBmb3JlaWduIGRlY2lzaW9uIHRvb2sgb25lIOKAlCBhdCBvbmNlOyBub3RoaW5nIG1vdmVzIG9uIFNvbGFuYS4gSXQgb25seSBldmVyCi8vIHJhaXNlczogYSBudW1iZXIgYXQgb3IgYmVsb3cgdGhlIG5leHQgb25lIGlzIHJlZnVzZWQgd2hlbiB0aGUgcHJvcG9zYWwgaXMgbWFkZSBhbmQgYWdhaW4gd2hlbiBpdCBleGVjdXRlcyAodGhlCi8vIGNvdW50ZXIgbWF5IGhhdmUgbW92ZWQgaW4gYmV0d2VlbiksIHNvIGEgbnVtYmVyIHRoZSBhZG1pbiBwcm9ncmFtIHJlY29yZGVkIGlzIG5ldmVyIHJldXNlZC4KZnVuYyBOZXdTeW5jU2VxdWVuY2VSZXF1ZXN0KGN1ciByZWFsbSwgbiB1aW50NjQpIFJlcXVlc3QgewoJbXVzdEJlTGl2ZSgpCglpZiBuID09IDAgewoJCXBhbmljKCJobGdvdjogdGhlIG5leHQgbnVtYmVyIGlzIGF0IGxlYXN0IDEiKQoJfQoJbXVzdFJhaXNlKG4pCgl0ZXh0IDo9ICJzeW5jIHNlcXVlbmNlOiB0aGUgbmV4dCBkZWNpc2lvbiB0YWtlcyBudW1iZXIgIiArIHU2NHMobikgKyAiIChpdCB3YXMgIiArIHU2NHMobGFzdCsxKSArICIpIgoJcmV0dXJuIHByb3Bvc2UoY3VyLCAic3luYyBzZXF1ZW5jZSIsIHRleHQsIGZ1bmMoY3VyIHJlYWxtLCBtYWRlLCB0IGludDY0KSB7CgkJbXVzdEJlTGl2ZSgpCgkJbXVzdFJhaXNlKG4pCgkJbGFzdCA9IG4gLSAxCgkJZCA6PSBsZWRnZXIuUmVjb3JkKCJzeW5jIHNlcXVlbmNlIiwgdGV4dCwgc2VxdWVuY2VQYXJhbXN7bn0sIG1hZGUsIHQsIHQpCgkJbGVkZ2VyLkFwcGx5KGQsIHQsICJhdCBvbmNlIikKCQljaGFpbi5FbWl0KCJTZXF1ZW5jZVN5bmNlZCIsICJuZXh0IiwgdTY0cyhuKSkKCX0pCn0KCi8vIE5ld1NldERlY2lzaW9uUmVjaXBpZW50UmVxdWVzdCBjaGFuZ2VzIHRoZSBwcm9ncmFtIGRlY2lzaW9ucyBhcmUgYWRkcmVzc2VkIHRvLCA3IGRheXMgYWZ0ZXIgdGhlIHByb3Bvc2FsCi8vIGV4ZWN1dGVzOiBob3cgYSBzdWNjZXNzb3IgYWRtaW4gcHJvZ3JhbSByZWNlaXZlcyB0aGVtLiBOZXZlciB0aGUgY3VycmVudCByZWNpcGllbnQsIGFuZCBuZXZlciBhIGZvcm1lciBvbmUKLy8gKFIyOTogYSByZXRpcmVkIHByb2dyYW0gYW5zd2VycyBSZXRpcmVkIHRvIGV2ZXJ5IGRlY2lzaW9uKSDigJQgY2hlY2tlZCB3aGVuIHRoZSBwcm9wb3NhbCBpcyBtYWRlLCBpbiBpdHMgY2xvc3VyZQovLyBhbmQgd2hlbiB0aGUgcXVldWVkIGNoYW5nZSB3b3VsZCBhcHBseS4KZnVuYyBOZXdTZXREZWNpc2lvblJlY2lwaWVudFJlcXVlc3QoY3VyIHJlYWxtLCBwcm9ncmFtIHN0cmluZykgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXAgOj0gbXVzdEtleShwcm9ncmFtKQoJaWYgcCA9PSAoWzMyXWJ5dGV7fSkgewoJCXBhbmljKCJobGdvdjogdGhlIHJlY2lwaWVudCBtdXN0IGJlIHNldCIpCgl9CgljaGVjayA6PSBmdW5jKCkgewoJCWlmIHAgPT0gcmVjaXBpZW50IHsKCQkJcGFuaWMoImhsZ292OiB0aGUgcmVjaXBpZW50IG11c3QgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgb25lICgiICsgaHgocFs6XSkgKyAiKSIpCgkJfQoJCW11c3ROb3RCZUZvcm1lcihwLCAiZGVjaXNpb24gcmVjaXBpZW50IikKCX0KCWNoZWNrKCkKCXRleHQgOj0gInNldCBkZWNpc2lvbiByZWNpcGllbnQgdG8gIiArIGh4KHBbOl0pICsgIiAobm93ICIgKyBoeChyZWNpcGllbnRbOl0pICsgIikiCglyZXR1cm4gcHJvcG9zZShjdXIsICJzZXQgZGVjaXNpb24gcmVjaXBpZW50IiwgdGV4dCwgZnVuYyhjdXIgcmVhbG0sIG1hZGUsIHQgaW50NjQpIHsKCQltdXN0QmVMaXZlKCkKCQljaGVjaygpCgkJZCA6PSBsZWRnZXIuUmVjb3JkKCJzZXQgZGVjaXNpb24gcmVjaXBpZW50IiwgdGV4dCwgcmVjaXBpZW50UGFyYW1ze3B9LCBtYWRlLCB0LCB0K2RlY2lzaW9ucy5EZWxheSkKCQlkLk5vdGUgPSAicXVldWVkIDcgZGF5cyIKCX0pCn0KCi8vIE5ld0NhbmNlbFF1ZXVlZFJlcXVlc3QgY2FuY2VscyBhIHF1ZXVlZCBjaGFuZ2Ugb2YgdGhpcyByZWFsbSAoYSByZWNpcGllbnQgc3dhcCksIGF0IG9uY2U7IGl0IGlzIHByb3Bvc2VkIGJlZm9yZQovLyBMYXVuY2ggdG9vLgpmdW5jIE5ld0NhbmNlbFF1ZXVlZFJlcXVlc3QoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgUmVxdWVzdCB7CglkIDo9IGxlZGdlci5HZXQoaWQpCglpZiBkID09IG5pbCB8fCAhZC5QZW5kaW5nKCkgewoJCXBhbmljKCJobGdvdjogZGVjaXNpb24gIiArIGl0b2EoaWQpICsgIiBpcyBub3QgcGVuZGluZyIpCgl9Cgl0ZXh0IDo9ICJjYW5jZWwgcXVldWVkIGNoYW5nZSAiICsgaXRvYShpZCkgKyAiICgiICsgZC5UZXh0ICsgIikiCglyZXR1cm4gcHJvcG9zZShjdXIsICJjYW5jZWwgcXVldWVkIiwgdGV4dCwgZnVuYyhjdXIgcmVhbG0sIG1hZGUsIHQgaW50NjQpIHsKCQlpZiBfLCBlcnIgOj0gbGVkZ2VyLkNhbmNlbChpZCwgdCk7IGVyciAhPSBuaWwgewoJCQlwYW5pYygiaGxnb3Y6ICIgKyBlcnIuRXJyb3IoKSkKCQl9CgkJYyA6PSBsZWRnZXIuUmVjb3JkKCJjYW5jZWwgcXVldWVkIiwgdGV4dCwgY2FuY2VsUGFyYW1ze2lkfSwgbWFkZSwgdCwgdCkKCQlsZWRnZXIuQXBwbHkoYywgdCwgImF0IG9uY2U6IGNhbmNlbGxlZCIpCgl9KQp9CgovLyBFeGVjdXRlIGFwcGxpZXMgYSBxdWV1ZWQgY2hhbmdlIChhIHJlY2lwaWVudCBzd2FwKSB3aG9zZSA3IGRheXMgaGF2ZSBwYXNzZWQ7IGFueW9uZSBtYXkgY2FsbCBpdC4gQSBzd2FwIGRlY2lkZWQKLy8gd2hpbGUgaXRzIHRhcmdldCB3YXMgbm9ib2R5IGFwcGxpZXMgb25seSB3aGlsZSB0aGF0IGhvbGRzIChSMjkpOiBvbmUgdGhhdCBmaW5kcyBpdHMgdGFyZ2V0IHRoZSByZWNpcGllbnQgYWxyZWFkeQovLyAoYSBzZWNvbmQgc3dhcCB0byB0aGUgc2FtZSBwcm9ncmFtKSBvciBhIGZvcm1lciByZWNpcGllbnQgKHJlcGxhY2VkIHNpbmNlKSBpcyByZWZ1c2VkIGFuZCBzdGF5cyBwZW5kaW5nIGZvcgovLyBHb3ZEQU8ncyBjYW5jZWw7IHRoZSByZWNpcGllbnQgaXQgcmVwbGFjZXMgam9pbnMgdGhlIGZvcm1lciBvbmVzLgpmdW5jIEV4ZWN1dGUoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJY2FsbGVyKGN1cikKCW11c3RCZUxpdmUoKQoJdCA6PSBub3coKQoJZCwgZXJyIDo9IGxlZGdlci5EdWUoaWQsIHQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygiaGxnb3Y6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXAsIG9rIDo9IGQuUGFyYW1zLihyZWNpcGllbnRQYXJhbXMpCglpZiAhb2sgewoJCXBhbmljKCJobGdvdjogZGVjaXNpb24gIiArIGl0b2EoaWQpICsgIiBoYXMgbm90aGluZyB0byBhcHBseSIpCgl9CglpZiBwLnRvID09IHJlY2lwaWVudCB7CgkJcGFuaWMoImhsZ292OiAiICsgaHgocC50b1s6XSkgKyAiIGlzIHRoZSBkZWNpc2lvbiByZWNpcGllbnQgYWxyZWFkeTogY2FuY2VsIGRlY2lzaW9uICIgKyBpdG9hKGlkKSkKCX0KCW11c3ROb3RCZUZvcm1lcihwLnRvLCAiZGVjaXNpb24gcmVjaXBpZW50IikKCWZvcm1lciA9IGFwcGVuZChmb3JtZXIsIHJlY2lwaWVudCkKCXJlY2lwaWVudCA9IHAudG8KCWxlZGdlci5BcHBseShkLCB0LCAiYXBwbGllZCBhZnRlciB0aGUgZGVsYXkiKQoJY2hhaW4uRW1pdCgiUmVjaXBpZW50U2V0IiwgInByb2dyYW0iLCBoeChyZWNpcGllbnRbOl0pKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGFnZXMgLS0KCi8vIFJlbmRlcjogIiIgdGhlIHBhZ2U7ICJqc29uIjsgImRlY2lzaW9ucyIgYW5kICJkZWNpc2lvbnMuanNvbiIgdGhlIGxlZGdlcjsgImRlY2lzaW9uLzxuPiIgb25lIGRpc3BhdGNoZWQgZGVjaXNpb24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJc3dpdGNoIHsKCWNhc2UgcGF0aCA9PSAiIjoKCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKCIjIEdvdkRBTydzIGRlY2lzaW9ucyBmb3IgU29sYW5hXG5cbiIpCgkJYi5Xcml0ZVN0cmluZygiQSBkZWNpc2lvbiBtYWRlIHdpdGggb25lIG9mIHRoaXMgcmVhbG0ncyBidWlsZGVycyDigJQgdGhlIGdvdmVybm9yJ3Mgb3duIHVudGlsIGl0IHlpZWxkcywgYSBHb3ZEQU8gcHJvcG9zYWwncyBleGVjdXRpb24gYWZ0ZXIg4oCUIHNlbmRzIGl0IHRvIHRoZSBhZG1pbiBwcm9ncmFtIG9uIFNvbGFuYSB3aXRoIHRoZSBuZXh0IHNlcXVlbmNlIG51bWJlcjsgdGhlIGFkbWluIHByb2dyYW0gcmVjb3JkcyBpdCBieSBudW1iZXIgYW5kIGV4ZWN1dGVzIGl0IGFmdGVyIGl0cyBjbG9jay4gQW55b25lIG1heSByZS1kaXNwYXRjaCBhbiBleGVjdXRlZCBkZWNpc2lvbiB1bnRpbCBpdCBpcyByZWNvcmRlZC5cblxuIikKCQlpZiBobG1haWxib3guTGl2ZSgpIHsKCQkJYi5Xcml0ZVN0cmluZygiLSAqKmxpdmUqKiBzaW5jZSAiICsgaXRvYShobG1haWxib3guTGF1bmNoZWRBdCgpKSArICJcbiIpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiLSAqKm5vdCBsYXVuY2hlZCoqOiBubyBkZWNpc2lvbiBpcyBzZW50IGJlZm9yZSB0aGUgTGF1bmNoIGRlY2lzaW9uXG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCItICIgKyBkZWNpc2lvbnMuR292ZXJub3JMaW5lKGxhdW5jaEdvdmVybm9yLCBobG1haWxib3guWWllbGRlZCgpKSArICJcbiIpCgkJYi5Xcml0ZVN0cmluZygiLSBkZXN0aW5hdGlvbjogZG9tYWluICIgKyBzdHJjb252LkZvcm1hdFVpbnQodWludDY0KGRlc3RpbmF0aW9uKSwgMTApICsgIiwgcmVjaXBpZW50IGAiICsgaHgocmVjaXBpZW50WzpdKSArICJgXG4iKQoJCWlmIGxlbihmb3JtZXIpID4gMCB7CgkJCXBhcnRzIDo9IG1ha2UoW11zdHJpbmcsIGxlbihmb3JtZXIpKQoJCQlmb3IgaSwgayA6PSByYW5nZSBmb3JtZXIgewoJCQkJcGFydHNbaV0gPSAiYCIgKyBoeChrWzpdKSArICJgIgoJCQl9CgkJCWIuV3JpdGVTdHJpbmcoIi0gZm9ybWVyIHJlY2lwaWVudHMgKHJldGlyZWQ7IG5ldmVyIGEgc3VjY2Vzc29yLCBuZXZlciB0aGUgcmVjaXBpZW50IGFnYWluKTogIiArIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikgKyAiXG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCItIGxhdW5jaCBjbGllbnQ6IGAiICsgaHgoY2xpZW50WzpdKSArICJgICh0aGUgcGF1c2FibGUgSVNNJ3MgdGFyZ2V0OyBpdHMgc3RhdGUgbGF5b3V0IGlzIGZpeGVkIGZvciB0aGUgZGVwbG95bWVudCdzIGxpZmUgYXQgdmVyc2lvbiAxIOKAlCBraW5kIDQgaXMgcmVzZXJ2ZWQgYW5kIHJlZnVzZWQgaGVyZSlcbiIpCgkJYi5Xcml0ZVN0cmluZygiLSBzZXF1ZW5jZTogc3RhcnRzIGF0ICIgKyB1NjRzKGxhdW5jaFNlcXVlbmNlKSArICIgKGNvbXBpbGVkOiB0aGUgcHJlZGVjZXNzb3IncyBsYXN0IG51bWJlciwgMCBmb3IgYSBjaGFpbidzIGZpcnN0IHIvaGxnb3YpOyBsYXN0IG51bWJlciAiICsgdTY0cyhsYXN0KSArICI7IHRoZSBuZXh0IHRha2VzIG51bWJlciAiICsgdTY0cyhsYXN0KzEpICsgIjsgIiArIHN0cmNvbnYuSXRvYShzZW50LlNpemUoKSkgKyAiIHNlbnQgZnJvbSBoZXJlXG4iKQoJCWIuV3JpdGVTdHJpbmcoIi0gIiArIGRlY2lzaW9ucy5DbG9ja3MoKSArICIgKHRoZSByZWNpcGllbnQgc3dhcCdzIGRlbGF5IGFuZCBldmVyeSBidWlsZGVyJ3MgZGVhZGxpbmU7IFNvbGFuYSdzIGNsb2NrcyBhcmUgdGhlIGFkbWluIHByb2dyYW0ncylcbiIpCgkJYi5Xcml0ZVN0cmluZygiLSBTb2xhbmEgc2VhdHMgYXMgbGFzdCBzZXQgaGVyZTpcbiIpCgkJZm9yIGkgOj0gMTsgaSA8PSBzZWF0Q291bnQ7IGkrKyB7CgkJCWtpbmQgOj0gImd1YXJkaWFuIgoJCQlpZiBpID4gZ3VhcmRpYW5TZWF0cyB7CgkJCQlraW5kID0gIndhdGNoIGtleSIKCQkJfQoJCQliLldyaXRlU3RyaW5nKCIgIC0gc2VhdCAiICsgc3RyY29udi5JdG9hKGkpICsgIiAoIiArIGtpbmQgKyAiKTogYCIgKyBoeChzb2xTZWF0c1tpXVs6XSkgKyAiYFxuIikKCQl9CgkJaWYgc2VudC5TaXplKCkgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiXG4jIyBTZW50XG5cbiIpCgkJCXNlbnQuUmV2ZXJzZUl0ZXJhdGVCeU9mZnNldCgwLCAyMCwgZnVuYyhrIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCQkJZCA6PSB2LigqZGVjaXNpb24pCgkJCQliLldyaXRlU3RyaW5nKCItICMiICsgc3RyaW5ncy5UcmltTGVmdChrLCAiMCIpICsgIiBraW5kICIgKyBzdHJjb252Lkl0b2EoaW50KGQua2luZCkpICsgIjogIiArIGQudGV4dCArICIgKHNlbnQgIiArIHN0cmNvbnYuSXRvYShkLmNvdW50KSArICLDlywgbGFzdCBpZCBgIiArIGQuaWQgKyAiYClcbiIpCgkJCQlyZXR1cm4gZmFsc2UKCQkJfSkKCQl9CgkJYi5Xcml0ZVN0cmluZygiXG4jIyBEZWNpc2lvbnNcblxuIiArIGxlZGdlci5QYWdlKCkpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCWNhc2UgcGF0aCA9PSAianNvbiI6CgkJZnMgOj0gRm9ybWVyKCkKCQlmb3IgaSA6PSByYW5nZSBmcyB7CgkJCWZzW2ldID0gc3RyY29udi5RdW90ZShmc1tpXSkKCQl9CgkJcmV0dXJuICJ7XCJhZGRyZXNzXCI6IiArIHN0cmNvbnYuUXVvdGUoc3RyaW5nKEFkZHJlc3MoKSkpICsgIixcImxpdmVcIjoiICsgc3RyY29udi5Gb3JtYXRCb29sKGhsbWFpbGJveC5MaXZlKCkpICsKCQkJIiwiICsgZGVjaXNpb25zLkdvdmVybm9ySlNPTihsYXVuY2hHb3Zlcm5vciwgaGxtYWlsYm94LllpZWxkZWQoKSkgKwoJCQkiLFwiZGVzdGluYXRpb25cIjoiICsgc3RyY29udi5Gb3JtYXRVaW50KHVpbnQ2NChkZXN0aW5hdGlvbiksIDEwKSArICIsXCJyZWNpcGllbnRcIjoiICsgc3RyY29udi5RdW90ZShoeChyZWNpcGllbnRbOl0pKSArICIsXCJmb3JtZXJcIjpbIiArIHN0cmluZ3MuSm9pbihmcywgIiwiKSArICJdIiArCgkJCSIsXCJzdGFydFwiOiIgKyB1NjRzKGxhdW5jaFNlcXVlbmNlKSArICIsXCJsYXN0XCI6IiArIHU2NHMobGFzdCkgKyAiLFwibmV4dFwiOiIgKyB1NjRzKGxhc3QrMSkgKyAiLFwiY2xvY2tzXCI6IiArIGRlY2lzaW9ucy5DbG9ja3NKU09OKCkgKyAiLFwiZGVjaXNpb25zXCI6IiArIGl0b2EobGVkZ2VyLkxhc3QoKSkgKyAifSIKCWNhc2UgcGF0aCA9PSAiZGVjaXNpb25zIjoKCQlyZXR1cm4gIiMgRGVjaXNpb25zXG5cbiIgKyBsZWRnZXIuUGFnZSgpCgljYXNlIHBhdGggPT0gImRlY2lzaW9ucy5qc29uIjoKCQlyZXR1cm4gbGVkZ2VyLkpTT04oKQoJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAiZGVjaXNpb24vIik6CgkJbiwgZXJyIDo9IHN0cmNvbnYuUGFyc2VVaW50KHBhdGhbbGVuKCJkZWNpc2lvbi8iKTpdLCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAibnVsbCIKCQl9CgkJdiA6PSBzZW50LkdldChzZXFLZXkobikpCgkJaWYgdiA9PSBuaWwgewoJCQlyZXR1cm4gIm51bGwiCgkJfQoJCWQgOj0gdi4oKmRlY2lzaW9uKQoJCXJldHVybiAie1wibnVtYmVyXCI6IiArIHU2NHMobikgKyAiLFwia2luZFwiOiIgKyBzdHJjb252Lkl0b2EoaW50KGQua2luZCkpICsgIixcImJvZHlcIjoiICsgc3RyY29udi5RdW90ZShoeChkLmJvZHkpKSArCgkJCSIsXCJpZFwiOiIgKyBzdHJjb252LlF1b3RlKGQuaWQpICsgIixcImNvdW50XCI6IiArIHN0cmNvbnYuSXRvYShkLmNvdW50KSArICIsXCJhdFwiOiIgKyBpdG9hKGQuYXQpICsgIixcInRleHRcIjoiICsgc3RyY29udi5RdW90ZShkLnRleHQpICsgIn0iCgl9CglyZXR1cm4gInVua25vd24gcGF0aDsgc2VlIHRoZSBwYWdlIgp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCIOMTAwMDAwMDAwdWdub3QSEQjs1dpYEgo5MzAxOHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohA3LmjE5osNUrThxsyk+O+pP9kkT5wKaebE3UAU4wyDRbEkB5uAAPgESph29d/kVHlVVa2lAFZYtSA8ZyRvbIZEmbv2J7Wl3pmrKukirDuLqImTVctQcj322w26vmtKHedw6yGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl