Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
8D4B7494C3CCE3103B32B789FD1491C5C38F67691D12AB6D4F496968639C9C2A
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
71,636,773
Requested gas limit
GAS USED
47,091,125
Gas consumed
FEE
71637ugnot
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
CvuSAgoML3ZtLm1fYWRkcGtnEumSAgooZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcBKrkgIKBmhsZ25vdBI6Z25vLmxhbmQvci9nMXpkYXo2c3lwazV0ZHNqYzJmenNxcnJuNHR0bjhxem1ubDR3YXFwL2hsZ25vdBphCgtnbm9tb2QudG9tbBJSbW9kdWxlID0gImduby5sYW5kL3IvZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcC9obGdub3QiCmdubyA9ICIwLjkiChrckAIKCmhsZ25vdC5nbm8SzJACLy8gUGFja2FnZSBobGdub3QgaXMgdGhlIEdOT1QgbG9jazogdGhlIGJyaWRnZSdzIEdOT1Qgcm91dGUgb24gZ25vLmxhbmQgKGJyaWRnZS9QTEFOLm1kIMKnNS4yLCDCpzUuNCwgwqc1LjUpLgovLwovLyBPdXQuIFRyYW5zZmVyUmVtb3RlIHRha2VzIHRoZSBjb2lucyBhIGRpcmVjdCB1c2VyIGNhbGwgc2VuZHMg4oCUIGV4YWN0bHkgYW1vdW50ICsgZmVlIGluIHVnbm90IOKAlCBrZWVwcyB0aGUgYW1vdW50Ci8vIGluIHRoZSBsb2NrLCBwYXlzIHRoZSBmZWUgdG8gci9obGZlZXMsIGFuZCBzZW5kcyBhIHRva2VuIG1lc3NhZ2UgdGhyb3VnaCByL2hsbWFpbGJveCB0byB0aGUgc3ludGhldGljIEdOT1QKLy8gcHJvZ3JhbSBvbiBTb2xhbmEsIHdoaWNoIG1pbnRzIGFzIG11Y2ggdGhlcmUuCi8vCi8vIEluLiBBIGJ1cm4gb24gU29sYW5hIGNvbWVzIGJhY2sgYXMgYSB0b2tlbiBtZXNzYWdlOiBQcm9jZXNzIHRha2VzIGl0IGZyb20gdGhlIG1haWxib3ggKHdoaWNoIGNoZWNrcyB0aGUgYWN0aXZlCi8vIHZlcmlmaWVyIGFuZCB0aGF0IGl0IHdhcyBuZXZlciBkZWxpdmVyZWQpLCBjaGVja3MgaXQgY2FtZSBmcm9tIHRoZSBlbnJvbGxlZCByb3V0ZXIsIGFuZCB3cml0ZXMgYSBjbGFpbSBpbiB0aGUKLy8gcmVjaXBpZW50J3MgcXVldWUg4oCUIG5ldmVyIGEgcGF5bWVudCBvbiB0aGUgc3BvdC4gQ2xhaW0gcGF5cyBjbGFpbXMgaW4gdHVybnMgdW5kZXIgdGhlIG1ldGVyczogYSB0ZW50aCBvZiB0aGUKLy8gbG9jayBhIGRheSAobmV2ZXIgYmVsb3cgdGhlIGZsb29yKSwgYSBxdWFydGVyIG9mIHRoYXQgZm9yIGFueSBvbmUgcmVjaXBpZW50LCB0aGUgZmVlIGFzIHRoZSBmaXJzdCBpbnN0YWxsbWVudCwKLy8gZnJvbSBhIG1ldGVyIHRoYXQgc3RhcnRzIGVtcHR5IGF0IGxhdW5jaCBhbmQgYWZ0ZXIgZXZlcnkgdW5wYXVzZSB0aGF0IGNsZWFycyBhIHBheW91dHMgZmxhZy4gQSBidXJuIGJlbG93IHRoZQovLyBmZWUsIG9yIHRvIGEgcmVhbG0gYWRkcmVzcywgaXMgY3JlZGl0ZWQgdG8gdGhlIHN3ZWVwIHF1ZXVlLCB3aGljaCBvbmx5IGEgR292REFPIGRlY2lzaW9uIHBheXMuCi8vCi8vIFdobyBtYXkgY2hhbmdlIHdoYXQuIE5vYm9keTogZXZlcnkgc2V0dGluZyBtb3ZlcyBieSBhIGRlY2lzaW9uIG1hZGUgd2l0aCB0aGUgYnVpbGRlcnMgYmVsb3cgKHRoZSBmZWUgYW5kCi8vIG1pbmltdW0sIHRoZSBmZWUgZmxvb3IsIHRoZSBjYXAgZmxvb3IsIHRoZSBwZXItbWVzc2FnZSBtYXhpbXVtLCB0aGUgcm91dGVyOyBhIHZvaWQsIGEgcmVzdG9yZSBvciBhIGNyZWRpdCBieQovLyBtZXNzYWdlIGlkOyBhIHN3ZWVwIHBheW1lbnQ7IGEgcmVmdW5kIGJ5IGlkOyBhIG1pZ3JhdGlvbiB0byBhIHN1Y2Nlc3NvciksIGF0IG9uY2Ugb3IgYWZ0ZXIgNyBkYXlzIGFzIMKnNS4zIHNheXMg4oCUCi8vIHRoZSBnb3Zlcm5vcidzIG93biBkZWNpc2lvbiB0aHJvdWdoIEdvdmVybiB1bnRpbCBpdCB5aWVsZHMgb24gci9obG1haWxib3gsIGEgR292REFPIHByb3Bvc2FsJ3MgYWZ0ZXIgKE0xayk7Ci8vIHRoZSBndWFyZGlhbnMgYW5kIHdhdGNoIGtleXMgY2FuIG9ubHkgcGF1c2UgKHNlbmRzLCBjcmVkaXRzLCBwYXlvdXRzKSB0aHJvdWdoIHIvaGxtYWlsYm94LiBFdmVyeSBsYXVuY2ggdmFsdWUgaXMKLy8gY29tcGlsZWQgaW4gYmVsb3cgYW5kIHdyaXR0ZW4gYXQgZGVwbG95OyBub3RoaW5nIGlzIHNlbnQgb3IgY3JlZGl0ZWQgdW50aWwgdGhlIExhdW5jaCBkZWNpc2lvbiBleGVjdXRlcy4KLy8KLy8gVGhlIHN0YXRlIG1hY2hpbmUg4oCUIGNsYWltcywgbWV0ZXJzLCBjb3VudGVycywgdGhlIGlkZW50aXR5IG9mIMKnNS45IOKAlCBpcyBnbm8ubGFuZC9wL+KApi9obHJvdXRlL3YwOyB0aGlzIHJlYWxtCi8vIGhvbGRzIHRoZSBjb2lucyBhbmQgbWFrZXMgdGhlIGNhbGxzLgpwYWNrYWdlIGhsZ25vdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJlbmNvZGluZy9oZXgiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcC9kZWNpc2lvbnMvdjAiCgkiZ25vLmxhbmQvcC9nMXpkYXo2c3lwazV0ZHNqYzJmenNxcnJuNHR0bjhxem1ubDR3YXFwL2hscm91dGUvdjAiCglobCAiZ25vLmxhbmQvcC9nMXpkYXo2c3lwazV0ZHNqYzJmenNxcnJuNHR0bjhxem1ubDR3YXFwL2h5cGVybGFuZS92MCIKCSJnbm8ubGFuZC9yL2cxemRhejZzeXBrNXRkc2pjMmZ6c3Fycm40dHRuOHF6bW5sNHdhcXAvaGxtYWlsYm94IgoJImduby5sYW5kL3IvZ292L2RhbyIKKQoKY29uc3QgKAoJbmFtZXNwYWNlID0gImduby5sYW5kL3IvZzF6ZGF6NnN5cGs1dGRzamMyZnpzcXJybjR0dG44cXptbmw0d2FxcC8iCglwa2dQYXRoICAgPSBuYW1lc3BhY2UgKyAiaGxnbm90IiAvLyBtdXN0IG1hdGNoIGdub21vZC50b21sCgoJbWFpbGJveFBhdGggID0gbmFtZXNwYWNlICsgImhsbWFpbGJveCIKCWZlZXNQYXRoICAgICA9IG5hbWVzcGFjZSArICJobGZlZXMiCglidWJibGVQYXRoICAgPSAiZ25vLmxhbmQvci9nMWxldThkMnZzcGxoZWhjZmtqZzUwbXdnZHB4ZGt0OHR6dHU5NXdyL2J1YmJsZSIgLy8gdGhlIGxpdmUgdG9rZW4gcmVhbG0sIG5ldmVyIHJlZGVwbG95ZWQKCWhsYnViYmxlUGF0aCA9IG5hbWVzcGFjZSArICJobGJ1YmJsZSIKCWhsZ292UGF0aCAgICA9IG5hbWVzcGFjZSArICJobGdvdiIKCglnbm90ID0gaW50NjQoMV8wMDBfMDAwKSAvLyBvbmUgR05PVCBpbiB1Z25vdAoKCS8vIFRoZSBsYXVuY2ggdmFsdWVzICjCpzUuMywgwqc1LjUpOiB0aGUgZmVlLCB0aGUgbWluaW11bSwgdGhlIGZlZSBmbG9vciwgdGhlIGNhcCBmbG9vciwgdGhlIHBlci1tZXNzYWdlIG1heGltdW0sCgkvLyBhbmQgdGhlIHJvdXRlciDigJQgdGhlIHN5bnRoZXRpYyBHTk9UIHByb2dyYW0gb24gU29sYW5hLiBUaGUgcm91dGVyIGlzIGEgUExBQ0VIT0xERVIgKHRoZSB0ZXN0IHJvdXRlIG9mIHRoZQoJLy8gdmVjdG9ycykgdW50aWwgdGhlIHNldHVwIHN0ZXAgKMKnNS44KSBnaXZlcyB0aGUgcHJvZ3JhbSBpZDsgYnJpZGdlL2xvY2FsL2UyZS5zaCBzd2FwcyBpdCBmb3IgaXRzIHJ1bidzLgoJbGF1bmNoRmVlICAgICAgPSA1ICogZ25vdAoJbGF1bmNoTWluaW11bSAgPSAxMCAqIGdub3QKCWxhdW5jaEZlZUZsb29yID0gMiAqIGdub3QKCWxhdW5jaENhcEZsb29yID0gMTBfMDAwICogZ25vdAoJbGF1bmNoTWF4aW11bSAgPSAyNV8wMDAgKiBnbm90CglsYXVuY2hSb3V0ZXIgICA9ICI5Yzc5ZTY0NzRkNWU0Y2IyZTFiYjQ3OWRmNDljOGQ3YzAyNDRhZjBiYjFjZjQ1MmFhNTczMzg2NjMyODk0ODk1IiAvLyB0aGUgR05PVCB0b2tlbiBwcm9ncmFtIEJYcFFrRmNzSEVzcVZ4dkZRMmU0VlNnZkRTTkJDS1FzdUt4OVFkMnh0S2oyCgoJbWF4STY0ID0gdWludDY0KDE8PDYzIC0gMSkKKQoKLy8gbGF1bmNoR292ZXJub3IgaXMgdGhlIGdvdmVybm9yIChNMWspOiB0aGUgbWFpbGJveCdzLCBjb21waWxlZCBoZXJlIHRvbyBzbyBhIG1lbWJlciByZWFkcyBpdCBpbiB0aGlzIHJlYWxtJ3MKLy8gc2VydmVkIHNvdXJjZTsgaW5pdCByZWZ1c2VzIGEgZGVwbG95IHdpdGggYW5vdGhlci4gYnJpZGdlL2xvY2FsL2UyZS5zaCBzd2FwcyBpdCBmb3IgZ25vZGV2J3MgdGVzdDEuCmNvbnN0IGxhdW5jaEdvdmVybm9yID0gYWRkcmVzcygiZzFlY3N1ajBxNTcyanIwZGh1MjlxOW5qdG5tdzAzaHl1N3R5eXZ2NiIpCgp2YXIgKAoJc3QgPSBobHJvdXRlLk5ldyhobHJvdXRlLkxhdW5jaHtTeW1ib2w6ICJHTk9UIiwgRmVlOiBsYXVuY2hGZWUsIE1pbmltdW06IGxhdW5jaE1pbmltdW0sIEZlZUZsb29yOiBsYXVuY2hGZWVGbG9vciwKCQlDYXBGbG9vcjogbGF1bmNoQ2FwRmxvb3IsIE1heGltdW06IGxhdW5jaE1heGltdW0sIERvbWFpbjogaGxtYWlsYm94LkxhdW5jaE9yaWdpbigpLCBSb3V0ZXI6IG11c3RLZXkobGF1bmNoUm91dGVyKSwKCQlOb3c6IHRpbWUuTm93KCkuVW5peCgpfSkKCgkvLyByZWFsbXMgYXJlIHRoZSBhZGRyZXNzZXMgYSB0cmFuc2ZlciBtYXkgbm90IG5hbWUgYXMgaXRzIHJlY2lwaWVudCBvbiBlaXRoZXIgc2lkZSAowqc1LjIpOiBhIGJ1cm4gdG8gb25lIG9mCgkvLyB0aGVtIGdvZXMgdG8gdGhlIHN3ZWVwIHF1ZXVlLCBhIHNlbmQgdG8gb25lIGlzIHJlZnVzZWQuCglyZWFsbXMgPSBbXWFkZHJlc3N7Y2hhaW4uUGFja2FnZUFkZHJlc3MocGtnUGF0aCksIGNoYWluLlBhY2thZ2VBZGRyZXNzKG1haWxib3hQYXRoKSwgY2hhaW4uUGFja2FnZUFkZHJlc3MoZmVlc1BhdGgpLAoJCWNoYWluLlBhY2thZ2VBZGRyZXNzKGJ1YmJsZVBhdGgpLCBjaGFpbi5QYWNrYWdlQWRkcmVzcyhobGJ1YmJsZVBhdGgpLCBjaGFpbi5QYWNrYWdlQWRkcmVzcyhobGdvdlBhdGgpfQopCgovLyBpbml0IHJlZnVzZXMgYSBkZXBsb3kgd2hvc2UgY29tcGlsZWQgZ292ZXJub3IgaXMgbm90IHRoZSBtYWlsYm94J3MgKE0xayk6IHRoZSBicmlkZ2UncyByZWFsbXMgYXJlIGdvdmVybmVkIGJ5Ci8vIG9uZSBrZXkgdW50aWwgaXQgeWllbGRzLCBvciBieSBHb3ZEQU8gZnJvbSB0aGUgZmlyc3QgYmxvY2ssIG5ldmVyIGEgbWl4LgpmdW5jIGluaXQoKSB7CglpZiBsYXVuY2hHb3Zlcm5vciAhPSBobG1haWxib3guR292ZXJub3IoKSB7CgkJcGFuaWMoImhsZ25vdDogdGhlIGNvbXBpbGVkIGdvdmVybm9yICIgKyBzdHJpbmcobGF1bmNoR292ZXJub3IpICsgIiBpcyBub3QgdGhlIG1haWxib3gncyAiICsgc3RyaW5nKGhsbWFpbGJveC5Hb3Zlcm5vcigpKSkKCX0KfQoKZnVuYyBtdXN0S2V5KHMgc3RyaW5nKSBbMzJdYnl0ZSB7CglrLCBlcnIgOj0gaGwuUGFyc2VLZXkzMihzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CglyZXR1cm4gawp9CgpmdW5jIG5vdygpIGludDY0IHsgcmV0dXJuIHRpbWUuTm93KCkuVW5peCgpIH0KCmZ1bmMgdTMyKG4gdWludDMyKSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRVaW50KHVpbnQ2NChuKSwgMTApIH0KZnVuYyBpdG9hKG4gaW50NjQpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdEludChuLCAxMCkgfQoKZnVuYyBjYWxsZXIoY3VyIHJlYWxtKSBhZGRyZXNzIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJobGdub3Q6IHRoYXQgcmVhbG0gdmFsdWUgaXMgbm90IGxpdmU7IHBhc3MgeW91ciBvd24gY3VyIikKCX0KCXJldHVybiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKfQoKZnVuYyBtdXN0SGV4KHMsIHdoYXQgc3RyaW5nKSBbXWJ5dGUgewoJYiwgZXJyIDo9IGhleC5EZWNvZGVTdHJpbmcoc3RyaW5ncy5UcmltUHJlZml4KHN0cmluZ3MuVHJpbVNwYWNlKHMpLCAiMHgiKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJobGdub3Q6IHRoZSAiICsgd2hhdCArICIgaXMgbm90IGhleCIpCgl9CglyZXR1cm4gYgp9CgovLyBpc1JlYWxtIGlzIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBhIHJlYWxtIG9mIHRoZSBicmlkZ2U6IHRoZSBzaXggY29tcGlsZWQgaGVyZSwgZXZlcnkgcm91dGUgcmVhbG0gdGhlIG1haWxib3gKLy8gcmVnaXN0ZXJzIChSMzkpIGFuZCBldmVyeSBvbmUgaXQgZHJvcHBlZCAoQVQ2OiBhIHJlLXBvaW50ZWQtYXdheSBzdWNjZXNzb3IsIGEgcm91dGUgbm8gbW9yZSB0aGF0IG5vdGhpbmcgb2YgdGhlCi8vIGxpbmUgY2FuIG1vdmUgY29pbnMgb3V0IG9mKSDigJQgYSBzdWNjZXNzb3IncyBhZGRyZXNzLCB3aGljaCBpdHMgcGFnZSBwcmludHMgYXMgdGhlIGxvY2sncyBob2xkZXIgYW5kIGEgaG9sZGVyCi8vIHBhc3RlcyBhcyBhIGRlcG9zaXQgYWRkcmVzcywgaXMgcmVmdXNlZCBhcyBhIHJlY2lwaWVudCBhdCBzZW5kIGFuZCBzd2VwdCBhdCBhIGNyZWRpdCwgdG8gYmUgY3JlZGl0ZWQgdG8gaXRzCi8vIG93bmVyIGJ5IGlkLCBuZXZlciBwYWlkIGludG8gYSByZWFsbSdzIGFjY291bnQgb3V0c2lkZSBldmVyeSBjb3VudGVyLiBBIGhhbmRmdWwgb2YgcmVhZHMuCmZ1bmMgaXNSZWFsbShhIGFkZHJlc3MpIGJvb2wgewoJZm9yIF8sIHIgOj0gcmFuZ2UgcmVhbG1zIHsKCQlpZiByID09IGEgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCWZvciBfLCBwIDo9IHJhbmdlIGhsbWFpbGJveC5Sb3V0ZXMoKSB7CgkJaWYgY2hhaW4uUGFja2FnZUFkZHJlc3MocCkgPT0gYSB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJZm9yIF8sIHAgOj0gcmFuZ2UgaGxtYWlsYm94LkRyb3BwZWRSb3V0ZXMoKSB7CgkJaWYgY2hhaW4uUGFja2FnZUFkZHJlc3MocCkgPT0gYSB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgbXVzdEJlTGl2ZSgpIHsKCWlmICFobG1haWxib3guTGl2ZSgpIHsKCQlwYW5pYygiaGxnbm90OiBub3QgbGF1bmNoZWQ6IG5vdGhpbmcgaXMgc2VudCwgY3JlZGl0ZWQgb3IgcGFpZCBiZWZvcmUgdGhlIExhdW5jaCBkZWNpc2lvbiIpCgl9Cn0KCmZ1bmMgbXVzdE5vdEJlUGF1c2VkKGZuIHN0cmluZykgewoJaWYgaGxtYWlsYm94LlBhdXNlZChwa2dQYXRoLCBmbikgewoJCXBhbmljKCJobGdub3Q6ICIgKyBmbiArICIgYXJlIHBhdXNlZCBieSBhIGd1YXJkaWFuIG9yIGEgd2F0Y2gga2V5IikKCX0KfQoKLy8gbXVzdE5vdEJlRHJvcHBlZCByZWZ1c2VzIGEgcmVhbG0gdGhlIG1haWxib3ggZHJvcHBlZCBmcm9tIGl0cyBsaW5lIChSMzUpOiBpdHMgcHJlZGVjZXNzb3IgcmUtcG9pbnRlZCB0aGUgbWlncmF0aW9uCi8vIHRvIGFub3RoZXIgc3VjY2Vzc29yIHdoaWxlIHRoaXMgcmVhbG0gaGFkIHB1bGxlZCBub3RoaW5nLCBzbyBpdCBpcyBhIHJvdXRlIG5vIG1vcmUg4oCUIFNvbGFuYSdzIHRva2VuIG1heSBzdGlsbAovLyBuYW1lIGl0IHRoZSByb3V0ZXIgdW50aWwgdGhlIG5leHQga2luZCA2LCBhbmQgYSBzZW5kIG9yIGEgY3JlZGl0IGhlcmUgd291bGQgYmUgYWdhaW5zdCBhIGxvY2sgbm8gcmVhbG0gb2YgdGhlCi8vIGxpbmUgaG9sZHMuIFRoZSBtYWlsYm94IHJlZnVzZXMgaXRzIERpc3BhdGNoIGFuZCBpdHMgUHJvY2VzcyB0b287IHRoZSBsaW5lJ3MgbGFzdCByZWFsbSB0YWtlcyBldmVyeSBtZXNzYWdlCi8vIGFkZHJlc3NlZCB0byBpdCBvbmNlIGl0cyBpbXBvcnQgaGFzIGVuZGVkLgpmdW5jIG11c3ROb3RCZURyb3BwZWQoKSB7CglpZiBieSA6PSBobG1haWxib3guRHJvcHBlZChwa2dQYXRoKTsgYnkgIT0gIiIgewoJCXBhbmljKCJobGdub3Q6IGEgcm91dGUgbm8gbW9yZTogIiArIGJ5ICsgIiByZS1wb2ludGVkIGl0cyBtaWdyYXRpb24gdG8gYW5vdGhlciBzdWNjZXNzb3I7IHRoZSBsaW5lJ3MgbGFzdCByZWFsbSB0YWtlcyBldmVyeSBtZXNzYWdlIGFuZCBzZW5kIikKCX0KfQoKLy8gc3luY0xhdW5jaCBlbXB0aWVzIHRoZSBtZXRlcnMgYXQgdGhlIGxhdW5jaCwgb25jZTogdGhleSBzdGFydCBlbXB0eSB0aGVyZSBhcyBhdCBhIGRlcGxveSAowqc1LjQpLgpmdW5jIHN5bmNMYXVuY2goKSB7CglpZiBsYSA6PSBobG1haWxib3guTGF1bmNoZWRBdCgpOyBsYSAhPSBzdC5MYXVuY2hTZWVuIHsKCQlzdC5SZXNldE1ldGVycyhsYSkKCQlzdC5MYXVuY2hTZWVuID0gbGEKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFkaW5nIC0tCgovLyBBZGRyZXNzIGlzIHRoaXMgcmVhbG0ncyBhZGRyZXNzOiB0aGUgaG9sZGVyIG9mIHRoZSBsb2NrLCBhbmQgKGFzIDMyIGJ5dGVzKSB0aGUgcm91dGVyIHRoZSBTb2xhbmEgcHJvZ3JhbSBlbnJvbGxzLgpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIGNoYWluLlBhY2thZ2VBZGRyZXNzKHBrZ1BhdGgpIH0KCi8vIExvY2tlZCBpcyB0aGUgbG9jazogd2hhdCBiYWNrcyBzeW50aGV0aWMgR05PVCBvbiBTb2xhbmEsIGJ5IHRoZSBjb3VudGVycyAoc2VudCDiiJIgcGFpZCkuCmZ1bmMgTG9ja2VkKCkgaW50NjQgeyByZXR1cm4gc3QuTG9jayB9CgovLyBCYWxhbmNlIGlzIHRoZSB1Z25vdCB0aGlzIHJlYWxtJ3MgYWNjb3VudCBob2xkczsgaXQgaXMgdGhlIGxvY2sgdW5sZXNzIHNvbWVvbmUgc2VudCBjb2lucyBoZXJlIG91dHNpZGUgYSB0cmFuc2Zlci4KZnVuYyBCYWxhbmNlKCkgaW50NjQgeyByZXR1cm4gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbihBZGRyZXNzKCksICJ1Z25vdCIpIH0KCi8vIFJvdXRlciBpcyB0aGUgZW5yb2xsZWQgcm91dGVyIG9uIFNvbGFuYSwgaW4gaGV4LgpmdW5jIFJvdXRlcigpIHN0cmluZyB7IHJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoc3QuUm91dGVyWzpdKSB9CgovLyBEb21haW4gaXMgdGhlIFNvbGFuYSBkb21haW4gdGhpcyByb3V0ZSBzZW5kcyB0byBhbmQgdGFrZXMgZnJvbS4KZnVuYyBEb21haW4oKSB1aW50MzIgeyByZXR1cm4gc3QuRG9tYWluIH0KCmZ1bmMgRmVlKCkgaW50NjQgICAgICB7IHJldHVybiBzdC5GZWUgfQpmdW5jIE1pbmltdW0oKSBpbnQ2NCAgeyByZXR1cm4gc3QuTWluaW11bSB9CmZ1bmMgRmVlRmxvb3IoKSBpbnQ2NCB7IHJldHVybiBzdC5GZWVGbG9vciB9CmZ1bmMgQ2FwRmxvb3IoKSBpbnQ2NCB7IHJldHVybiBzdC5DYXBGbG9vciB9CmZ1bmMgTWF4aW11bSgpIGludDY0ICB7IHJldHVybiBzdC5NYXhpbXVtIH0KZnVuYyBDYXAoKSBpbnQ2NCAgICAgIHsgcmV0dXJuIHN0LkNhcCgpIH0KCi8vIENvdW50ZXJzIGlzIHRoZSBpZGVudGl0eSdzIGZpdmUgY291bnRlcnMgKMKnNS45KTogc2VudFRvdGFsLCBwYWlkVG90YWwsIG93ZWQsIHZvaWRlZCwgbG9zdC4KZnVuYyBDb3VudGVycygpIChzZW50VG90YWwsIHBhaWRUb3RhbCwgb3dlZCwgdm9pZGVkLCBsb3N0IGludDY0KSB7CglyZXR1cm4gc3QuU2VudFRvdGFsLCBzdC5QYWlkVG90YWwsIHN0Lk93ZWQsIHN0LlZvaWRlZCwgc3QuTG9zdAp9CgovLyBNaWdyYXRlZCBpcyB0aGUgc3VjY2Vzc29yJ3MgcGtncGF0aCBvbmNlIGEgbWlncmF0aW9uIGFwcGxpZWQsICIiIGJlZm9yZS4KZnVuYyBNaWdyYXRlZCgpIHN0cmluZyB7IHJldHVybiBzdC5NaWdyYXRlZFRvIH0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3V0IC0tCgovLyBUcmFuc2ZlclJlbW90ZSBzZW5kcyBhbW91bnQgb2YgR05PVCB0byByZWNpcGllbnQgb24gZGVzdGluYXRpb24gKGEgU29sYW5hIGFkZHJlc3MgaW4gYmFzZTU4LCBvciAzMiBieXRlcyBpbgovLyBoZXgpIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGlkIGluIGhleC4gVGhlIGNhbGwgbXVzdCBiZSBhIGRpcmVjdCB1c2VyIGNhbGwgc2VuZGluZyBleGFjdGx5IGFtb3VudCArIGZlZSBpbgovLyB1Z25vdDogdGhlIGFtb3VudCBpcyBsb2NrZWQgaGVyZSwgdGhlIGZlZSBnb2VzIHRvIHIvaGxmZWVzLiBUaGUgYW1vdW50IGlzIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIHRoZQovLyBwZXItbWVzc2FnZSBtYXhpbXVtOyBhIHJlYWxtJ3MgYWRkcmVzcyBhcyByZWNpcGllbnQgaXMgcmVmdXNlZC4KZnVuYyBUcmFuc2ZlclJlbW90ZShjdXIgcmVhbG0sIGRlc3RpbmF0aW9uIHVpbnQzMiwgcmVjaXBpZW50IHN0cmluZywgYW1vdW50IGludDY0KSBzdHJpbmcgewoJbXVzdEJlTGl2ZSgpCgltdXN0Tm90QmVQYXVzZWQoaGxtYWlsYm94LkZuU2VuZHMpCgltdXN0Tm90QmVEcm9wcGVkKCkKCXN0Lk11c3RTZW5kKGhsbWFpbGJveC5QcmVkZWNlc3Nvcihwa2dQYXRoKSwgZW52KGN1cikpIC8vIGEgc3VjY2Vzc29yIHRha2VzIG5vIHNlbmQgYmVmb3JlIGl0cyBsYXN0IHBhZ2UgaXMgaW4gKFIzNSwgRjI4KSBhbmQgYmVmb3JlIGtpbmQgNiBuYW1lcyBpdCAoQVQ3KQoJaWYgZGVzdGluYXRpb24gIT0gc3QuRG9tYWluIHsKCQlwYW5pYygiaGxnbm90OiBubyByb3V0ZSB0byBkb21haW4gIiArIHUzMihkZXN0aW5hdGlvbikpCgl9CglzdC5DaGVja1NlbmQoYW1vdW50KQoJdG8sIGVyciA6PSBobC5QYXJzZUtleTMyKHJlY2lwaWVudCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoJaWYgdG8gPT0gKFszMl1ieXRle30pIHsKCQlwYW5pYygiaGxnbm90OiB0aGUgcmVjaXBpZW50IGlzIGFsbCB6ZXJvcyIpCgl9CglpZiBhLCBlcnIgOj0gaGwuQnl0ZXMzMlRvQWRkcmVzcyh0byk7IGVyciA9PSBuaWwgJiYgaXNSZWFsbShhKSB7CgkJcGFuaWMoImhsZ25vdDogdGhlIHJlY2lwaWVudCBpcyBhIHJlYWxtIG9mIHRoZSBicmlkZ2UiKQoJfQoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJaWYgIXByZXYuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygiaGxnbm90OiBhIGRpcmVjdCB1c2VyIGNhbGwgb25seSIpCgl9Cgl3YW50IDo9IGFtb3VudCArIHN0LkZlZQoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpCglpZiBsZW4oc2VudCkgIT0gMSB8fCBzZW50WzBdLkRlbm9tICE9ICJ1Z25vdCIgfHwgc2VudFswXS5BbW91bnQgIT0gd2FudCB7CgkJcGFuaWMoImhsZ25vdDogc2VuZCBleGFjdGx5ICIgKyBpdG9hKHdhbnQpICsgInVnbm90ICh0aGUgYW1vdW50IHBsdXMgdGhlIGZlZSBvZiAiICsgaXRvYShzdC5GZWUpICsgIiksIG5vdCAiICsgc2VudC5TdHJpbmcoKSkKCX0KCXJ1bnRpbWUuQXNzZXJ0T3JpZ2luQ2FsbCgpIC8vIGEgZGlyZWN0IE1zZ0NhbGwsIHNvIHRoZSBlbnZlbG9wZSBsYW5kZWQgaGVyZSBhbmQgbm90aGluZyByYW4gaW4gYmV0d2VlbgoJd2hvIDo9IHByZXYuQWRkcmVzcygpCgliYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlT3JpZ2luU2VuZCwgY3VyKS5TZW5kQ29pbnMoQWRkcmVzcygpLCBjaGFpbi5QYWNrYWdlQWRkcmVzcyhmZWVzUGF0aCksIGNoYWluLkNvaW5ze3sidWdub3QiLCBzdC5GZWV9fSkKCWlkIDo9IGhsbWFpbGJveC5EaXNwYXRjaChjcm9zcyhjdXIpLCBkZXN0aW5hdGlvbiwgc3QuUm91dGVyLCBobC5Ub2tlbk1lc3NhZ2UodG8sIHVpbnQ2NChhbW91bnQpLCBuaWwpKQoJaWRIZXggOj0gaGV4LkVuY29kZVRvU3RyaW5nKGlkWzpdKQoJc3QuU2VuZChub3coKSwgaWRIZXgsIHdobywgYW1vdW50KQoJY2hhaW4uRW1pdCgiU2VudFRyYW5zZmVyUmVtb3RlIiwKCQkiZGVzdGluYXRpb24iLCB1MzIoZGVzdGluYXRpb24pLAoJCSJyZWNpcGllbnQiLCBoZXguRW5jb2RlVG9TdHJpbmcodG9bOl0pLAoJCSJhbW91bnQiLCBpdG9hKGFtb3VudCksCgkJImZlZSIsIGl0b2Eoc3QuRmVlKSwKCQkiZnJvbSIsIHN0cmluZyh3aG8pLAoJCSJpZCIsIGlkSGV4LAoJKQoJcmV0dXJuIGlkSGV4Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGluIC0tCgovLyBQcm9jZXNzIHRha2VzIGEgdG9rZW4gbWVzc2FnZSBmcm9tIFNvbGFuYSBhbmQgY3JlZGl0cyBhIGNsYWltIHRvIGl0cyByZWNpcGllbnQuIEFueW9uZSBtYXkgY2FsbCBpdCDigJQgYSByZWxheWVyLAovLyB1c3VhbGx5IOKAlCB3aXRoIHRoZSB2ZXJpZmllcidzIG1ldGFkYXRhIGFuZCB0aGUgbWVzc2FnZSwgYm90aCBpbiBoZXguIFRoZSBtYWlsYm94IGNoZWNrcyB0aGUgdmVyaWZpZXIgYW5kIHRoYXQKLy8gdGhlIG1lc3NhZ2Ugd2FzIG5ldmVyIGRlbGl2ZXJlZDsgdGhpcyBjaGVja3MgaXQgY2FtZSBmcm9tIHRoZSBlbnJvbGxlZCByb3V0ZXIgKHRoZSBvbGQgb25lIHRvbywgZm9yIDcgZGF5cyBhZnRlcgovLyBhIHN3YXApLiBBIHJlZnVzZWQgbWVzc2FnZSBzdGF5cyB1bmRlbGl2ZXJlZCBhbmQgY2FuIGJlIGJyb3VnaHQgYWdhaW4uIEEgcmVhbG0gcmVnaXN0ZXJlZCBhcyBhIHN1Y2Nlc3NvciBjcmVkaXRzCi8vIG5vdGhpbmcgYmVmb3JlIHRoZSBsYXN0IHBhZ2Ugb2YgaXRzIHByZWRlY2Vzc29yJ3MgbWlncmF0aW9uIGlzIGluIChSMzIpIOKAlCBhIG1lc3NhZ2UgYWRkcmVzc2VkIHRvIGl0c2VsZiBhcyBtdWNoCi8vIGFzIG9uZSBhZGRyZXNzZWQgdG8gdGhlIHByZWRlY2Vzc29yIChBUTE6IHRoZSBtYWlsYm94IGhhbmRzIGEgbWlncmF0ZWQgcm91dGUncyBtZXNzYWdlcyB0byBpdHMgc3VjY2Vzc29yKSDigJQgYW5kCi8vIGEgbWlncmF0ZWQgcmVhbG0gcmVmdXNlcyBiZWZvcmUgdGhlIG1haWxib3ggaXMgYXNrZWQ6IHRoZSBzdWNjZXNzb3IgdGFrZXMgaXQuCmZ1bmMgUHJvY2VzcyhjdXIgcmVhbG0sIG1ldGFkYXRhLCBtZXNzYWdlIHN0cmluZykgewoJY2FsbGVyKGN1cikKCW11c3RCZUxpdmUoKQoJbXVzdE5vdEJlUGF1c2VkKGhsbWFpbGJveC5GbkNyZWRpdHMpCgltdXN0Tm90QmVEcm9wcGVkKCkKCW1zZyA6PSBtdXN0SGV4KG1lc3NhZ2UsICJtZXNzYWdlIikKCW0sIGVyciA6PSBobC5QYXJzZU1lc3NhZ2UobXNnKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CglpZiBzdC5NaWdyYXRlZCgpIHsKCQlwYW5pYygiaGxnbm90OiBtaWdyYXRlZCB0byAiICsgc3QuTWlncmF0ZWRUbyArICI6IHRoZSBzdWNjZXNzb3IgdGFrZXMgdGhpcyBtZXNzYWdlIikKCX0KCWlmIHNlbGYsIGVyciA6PSBobC5BZGRyZXNzVG9CeXRlczMyKEFkZHJlc3MoKSk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfSBlbHNlIHsKCQlzdC5NdXN0VGFrZShtLlJlY2lwaWVudCA9PSBzZWxmLCBobG1haWxib3guUHJlZGVjZXNzb3IocGtnUGF0aCkpCgl9Cgl0IDo9IG5vdygpCglpZiBtLk9yaWdpbiAhPSBzdC5Eb21haW4gfHwgIXN0LlJvdXRlckFjY2VwdHModCwgbS5TZW5kZXIpIHsKCQlwYW5pYygiaGxnbm90OiB0aGUgbWVzc2FnZSBpcyBub3QgZnJvbSB0aGUgcm91dGVyIGVucm9sbGVkIGZvciBkb21haW4gIiArIHUzMihzdC5Eb21haW4pKQoJfQoJcmNwdCwgYW1vdW50LCBfLCBlcnIgOj0gaGwuUGFyc2VUb2tlbk1lc3NhZ2UobS5Cb2R5KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CglpZiBhbW91bnQgPiBtYXhJNjQgewoJCXBhbmljKCJobGdub3Q6IHRoZSBhbW91bnQgaXMgcGFzdCB3aGF0IEdOT1QgY2FuIGhvbGQiKQoJfQoJb3JpZ2luLCBzZW5kZXIsIGJvZHkgOj0gaGxtYWlsYm94LlByb2Nlc3MoY3Jvc3MoY3VyKSwgbXVzdEhleChtZXRhZGF0YSwgIm1ldGFkYXRhIiksIG1zZykKCWlmIG9yaWdpbiAhPSBtLk9yaWdpbiB8fCBzZW5kZXIgIT0gbS5TZW5kZXIgfHwgc3RyaW5nKGJvZHkpICE9IHN0cmluZyhtLkJvZHkpIHsKCQlwYW5pYygiaGxnbm90OiB0aGUgbWFpbGJveCByZWFkIHRoZSBtZXNzYWdlIGRpZmZlcmVudGx5IikgLy8gY2Fubm90IGhhcHBlbjogdGhlIHNhbWUgYnl0ZXMsIHRoZSBzYW1lIHBhcnNlcgoJfQoJLy8gYSByZWNpcGllbnQgdGhhdCBpcyBubyBnbm8gYWRkcmVzcyAoaXRzIHRvcCB0d2VsdmUgYnl0ZXMgbm90IHplcm8sIMKnMTMpIG9yIGEgcmVhbG0gb2YgdGhlIGJyaWRnZSBpcyBzd2VwdDoKCS8vIG93ZWQsIHBheWluZyBub2JvZHkgdW50aWwgR292REFPIGNyZWRpdHMgaXQgYnkgaWQgdG8gaXRzIG93bmVyCgl0bywgZXJyIDo9IGhsLkJ5dGVzMzJUb0FkZHJlc3MocmNwdCkKCXJlY2lwaWVudCA6PSBzdHJpbmcodG8pCglpZiBlcnIgIT0gbmlsIHsKCQlyZWNpcGllbnQgPSBoZXguRW5jb2RlVG9TdHJpbmcocmNwdFs6XSkKCX0KCWlkYiA6PSBobC5JRChtc2cpCglpZCA6PSBoZXguRW5jb2RlVG9TdHJpbmcoaWRiWzpdKQoJZXBvY2gsIF8gOj0gaGxtYWlsYm94LlBheW91dHNFcG9jaChwa2dQYXRoKQoJc3dlcHQgOj0gc3QuQ3JlZGl0KHQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgZXBvY2gsIGlkLCB0bywgaW50NjQoYW1vdW50KSwgaGxyb3V0ZS5CeVNpZ25lcnMsIGVyciAhPSBuaWwgfHwgaXNSZWFsbSh0bykpCgljaGFpbi5FbWl0KCJDcmVkaXRlZCIsCgkJIm9yaWdpbiIsIHUzMihvcmlnaW4pLAoJCSJyZWNpcGllbnQiLCByZWNpcGllbnQsCgkJImFtb3VudCIsIGl0b2EoaW50NjQoYW1vdW50KSksCgkJImlkIiwgaWQsCgkJInN3ZXB0Iiwgc3RyY29udi5Gb3JtYXRCb29sKHN3ZXB0KSwKCSkKfQoKLy8gQ2xhaW0gcGF5cyB1cCB0byBuIGNsYWltcyAobiDiiaQgMjApIHRha2luZyByZWNpcGllbnRzIGluIHR1cm5zIHVuZGVyIHRoZSBtZXRlcnMsIHRoZSBmZWUgYXMgZWFjaCBjbGFpbSdzIGZpcnN0Ci8vIGluc3RhbGxtZW50LiBBbnlvbmUgbWF5IGNhbGwgaXQ7IHRoZSByZWxheWVycyBkby4gSXQgcmV0dXJucyBob3cgbWFueSBjbGFpbXMgaXQgcGFpZCBzb21ldGhpbmcgb24uCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBuIGludCkgaW50IHsKCWNhbGxlcihjdXIpCgltdXN0QmVMaXZlKCkKCW11c3ROb3RCZVBhdXNlZChobG1haWxib3guRm5QYXlvdXRzKQoJbXVzdE5vdEJlRHJvcHBlZCgpCglzeW5jTGF1bmNoKCkKCWVwb2NoLCBhdCA6PSBobG1haWxib3guUGF5b3V0c0Vwb2NoKHBrZ1BhdGgpCglwYWlkIDo9IHN0LkNsYWltKG5vdygpLCBuLCBlcG9jaCwgYXQsIGVudihjdXIpKQoJY2hhaW4uRW1pdCgiQ2xhaW1lZCIsICJjb3VudCIsIHN0cmNvbnYuSXRvYShwYWlkKSkKCXJldHVybiBwYWlkCn0KCmZ1bmMgcGF5KGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7CgliYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpLlNlbmRDb2lucyhBZGRyZXNzKCksIHRvLCBjaGFpbi5Db2luc3t7InVnbm90IiwgYW1vdW50fX0pCn0KCi8vIGVudiBpcyB3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIGFza3Mgb2YgdGhpcyByZWFsbS4KZnVuYyBlbnYoY3VyIHJlYWxtKSBobHJvdXRlLkVudiB7CglyZXR1cm4gaGxyb3V0ZS5FbnZ7CgkJRmxhZ2dlZDogICAgZnVuYyhpZCBzdHJpbmcsIGhlaWdodCBpbnQ2NCwgdmVyaWZpZXIgYm9vbCkgYm9vbCB7IHJldHVybiBobG1haWxib3guRmxhZ2dlZChwa2dQYXRoLCBpZCwgaGVpZ2h0LCB2ZXJpZmllcikgfSwKCQlDbGVhckZsYWdzOiBmdW5jKGZuIHN0cmluZykgYm9vbCB7IHJldHVybiBobG1haWxib3guQ2xlYXJGbGFncyhjcm9zcyhjdXIpLCBmbikgfSwKCQlSZW1vdmVTZWF0OiBmdW5jKHNlYXQgaW50LCBob2xkZXIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBobG1haWxib3guVmFjYXRlU2VhdChjcm9zcyhjdXIpLCBzZWF0LCBob2xkZXIpIH0sCgkJRGVsaXZlcmVkOiAgZnVuYyhpZCBzdHJpbmcpIGJvb2wgeyByZXR1cm4gaGxtYWlsYm94LkRlbGl2ZXJlZChpZCkgIT0gMCB9LAoJCU1hcmtEb25lOiAgIGZ1bmMoaWQgc3RyaW5nKSB7IGhsbWFpbGJveC5NYXJrRG9uZShjcm9zcyhjdXIpLCBpZCkgfSwKCQlFcG9jaDogICAgICBmdW5jKCkgaW50NjQgeyBlLCBfIDo9IGhsbWFpbGJveC5QYXlvdXRzRXBvY2gocGtnUGF0aCk7IHJldHVybiBlIH0sCgkJSGVpZ2h0OiAgICAgZnVuYygpIGludDY0IHsgcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB9LAoJCVBheTogICAgICAgIGZ1bmModG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7IHBheShjdXIsIHRvLCBhbW91bnQpIH0sCgkJUGF5RmVlOiAgICAgZnVuYyhhbW91bnQgaW50NjQpIHsgcGF5KGN1ciwgY2hhaW4uUGFja2FnZUFkZHJlc3MoZmVlc1BhdGgpLCBhbW91bnQpIH0sCgkJQWRkUm91dGU6ICAgICBmdW5jKHBhdGggc3RyaW5nKSB7IGhsbWFpbGJveC5BZGRSb3V0ZShjcm9zcyhjdXIpLCBwYXRoKSB9LAoJCUFubm91bmNlZEZvcjogZnVuYyhwYXRoIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIGhsbWFpbGJveC5TdWNjZXNzb3JGb3IocGF0aCkgfSwKCQlQcmVkZWNlc3NvcjogIGZ1bmMoKSBzdHJpbmcgeyByZXR1cm4gaGxtYWlsYm94LlByZWRlY2Vzc29yKHBrZ1BhdGgpIH0sCgkJSXNSb3V0ZTogICAgICBmdW5jKHBhdGggc3RyaW5nKSBib29sIHsgcmV0dXJuIGhsbWFpbGJveC5Jc1JvdXRlKHBhdGgpIH0sCgkJRW5yb2xsZWQ6ICAgICBmdW5jKCkgKGludDY0LCBpbnQ2NCkgeyByZXR1cm4gaGxtYWlsYm94LkVucm9sbGVkKHBrZ1BhdGgpIH0sCgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBidWlsZGVycyAtLQoKLy8gVGhlIGJ1aWxkZXJzICjCpzUuMyk6IGEgZGVjaXNpb24gbWFkZSB3aXRoIG9uZSBvZiB0aGVzZSBpcyB0aGUgb25seSB3YXkgYSBzZXR0aW5nIGNoYW5nZXMg4oCUIHRoZSBnb3Zlcm5vcidzIG93biwKLy8gdGhyb3VnaCBHb3Zlcm4sIHVudGlsIGl0IHlpZWxkcyBvbiByL2hsbWFpbGJveCAoTTFrKToKLy8KLy8JaGxnbm90LkdvdmVybihjcm9zcyhjdXIpLCBobGdub3QuTmV3U2V0Q2FwRmxvb3JSZXF1ZXN0KGNyb3NzKGN1ciksIDEyXzAwMF8wMDBfMDAwKSkKLy8KLy8gYW5kIGEgR292REFPIHByb3Bvc2FsIGFmdGVyOgovLwovLwlyZXEgOj0gaGxnbm90Lk5ld1NldENhcEZsb29yUmVxdWVzdChjcm9zcyhjdXIpLCAxMl8wMDBfMDAwXzAwMCkKLy8JZGFvLk11c3RDcmVhdGVQcm9wb3NhbChjcm9zcyhjdXIpLCByZXEuUHJvcG9zYWwoKSkKLy8KLy8gRWFjaCBjaGVja3MgaXRzIHBhcmFtZXRlcnMsIHdyaXRlcyB0aGVtIGFzIHRoZSBwcm9wb3NhbCdzIGRlc2NyaXB0aW9uLCBhbmQgcmV0dXJucyBhIFJlcXVlc3Qgd2hvc2UgY2xvc3VyZSDigJQKLy8gdGhlIG9uZSBjbG9zdXJlLCBydW4gYnkgdGhlIGdvdmVybm9yIHRocm91Z2ggR292ZXJuIG9yIGJ5IEdvdkRBTydzIHByb3h5IHdoZW4gdGhlIHByb3Bvc2FsIGV4ZWN1dGVzIOKAlCByZWNvcmRzCi8vIHRoZSBkZWNpc2lvbiBhbmQgc2V0dGxlcyBpdHMgYXQtb25jZSB0ZXN0IGFnYWluc3QgdGhlIGxpdmUgc3RhdGU6IGEgbG93ZXJpbmcsIGEgY2FuY2VsLCBhIHJlc3RvcmUgb2YgYSB3aXRoaGVsZAovLyBjbGFpbSBhbmQgdGhlIHZvaWQgb2YgaWRzIGEgZ3VhcmRpYW4ncyBzdGFuZGluZyBwYXlvdXRzIGZsYWcgbmFtZXMgYXBwbHkgYXQgb25jZTsgYSByYWlzZSwgYSBzd2FwLCBhIGNyZWRpdCwgYQovLyBzd2VlcCBwYXltZW50LCBhIG1pZ3JhdGlvbiwgYSB2b2lkIG9mIHVubmFtZWQgaWRzIGFuZCBhIHJlc3RvcmUgb2YgYSBmb3JnZWQgY2xhaW0gd2FpdCA3IGRheXMsIGFuZCBhbnlvbmUKLy8gYXBwbGllcyB0aGVtIHdpdGggRXhlY3V0ZShpZCk7IGEgcmVmdW5kIHdhaXRzIDcgZGF5cyB0b28gYW5kIGlzIHRoZW4gYXBwbGllZCBieSB0aGUgZ292ZXJub3IncyAoR292REFPJ3MsIGFmdGVyCi8vIHRoZSB5aWVsZCkgb3duIGF0LW9uY2UgZGVjaXNpb24gKE5ld0FwcGx5UmVmdW5kUmVxdWVzdCwgQVQyKSwgbmV2ZXIgYnkgRXhlY3V0ZS4gQmVmb3JlIHRoZSBMYXVuY2ggZGVjaXNpb24gb25seQovLyBjYW5jZWwgaXMgcHJvcG9zZWQuCgovLyBSZXF1ZXN0IGlzIHdoYXQgYSBidWlsZGVyIHJldHVybnMgKE0xayk6IHRoZSBwcm9wb3NhbCBHb3ZEQU8ncyBwcm94eSBleGVjdXRlcyBhZnRlciB0aGUgeWllbGQgKFByb3Bvc2FsKSwgYW5kCi8vIHRoZSBzYW1lIGRlY2lzaW9uIHRoZSBnb3Zlcm5vciBydW5zIGRpcmVjdGx5IGJlZm9yZSBpdCAoR292ZXJuKS4gVGhlIGNsb3N1cmUgaXMgb25lOyBvbmx5IHdobyBtYXkgcnVuIGl0Ci8vIGNoYW5nZXMgd2l0aCB0aGUgeWllbGQuIEEgUmVxdWVzdCBjb21lcyBmcm9tIGEgYnVpbGRlciBhbG9uZSDigJQgdGhlIHR5cGUgaXMgdGhpcyByZWFsbSdzIGFuZCB0aGUgY2xvc3VyZQovLyB1bmV4cG9ydGVkLCBzbyBubyBvdGhlciBjb2RlIGNhbiBidWlsZCBvbmUgb3IgY2hhbmdlIHdoYXQgaXQgZGVjaWRlcyDigJQgYW5kIGEgc3RyYW5nZXIgaG9sZGluZyBvbmUgY2FuIG9ubHkKLy8gaGFuZCBpdCBiYWNrIHRvIEdvdmVybiwgd2hpY2ggcmVmdXNlcyBldmVyeW9uZSBidXQgdGhlIGdvdmVybm9yLgp0eXBlIFJlcXVlc3Qgc3RydWN0IHsKCXByb3Bvc2FsIGRhby5Qcm9wb3NhbFJlcXVlc3QKCXRleHQgICAgIHN0cmluZwoJZGVjaWRlICAgZnVuYyhjdXIgcmVhbG0pIGVycm9yCn0KCi8vIFByb3Bvc2FsIGlzIHRoZSByZXF1ZXN0IGFzIGEgR292REFPIHByb3Bvc2FsOiBgZGFvLk11c3RDcmVhdGVQcm9wb3NhbChjcm9zcyhjdXIpLCByZXEuUHJvcG9zYWwoKSlgLgpmdW5jIChyIFJlcXVlc3QpIFByb3Bvc2FsKCkgZGFvLlByb3Bvc2FsUmVxdWVzdCB7IHJldHVybiByLnByb3Bvc2FsIH0KCi8vIERlc2NyaXB0aW9uIGlzIHRoZSBwcm9wb3NhbCdzOiB0aGUgcGFyYW1ldGVycyBhcyB0aGUgYnVpbGRlciB3cm90ZSB0aGVtLgpmdW5jIChyIFJlcXVlc3QpIERlc2NyaXB0aW9uKCkgc3RyaW5nIHsgcmV0dXJuIHIudGV4dCB9CgovLyB3aG8gbmFtZXMgYSBwcmV2aW91cyByZWFsbSBpbiBhIHJlZnVzYWw6IGl0cyBwa2dwYXRoLCBvciBhIHVzZXIncyBhZGRyZXNzLgpmdW5jIHdobyhwYXRoIHN0cmluZywgYSBhZGRyZXNzKSBzdHJpbmcgewoJaWYgcGF0aCAhPSAiIiB7CgkJcmV0dXJuIHBhdGgKCX0KCXJldHVybiBzdHJpbmcoYSkKfQoKLy8gbXVzdEJlR292ZXJub3IgaXMgYSBkZWNpc2lvbidzIGlkZW50aXR5IGNoZWNrIChNMWspLCByZWFkIGZyb20gdGhlIGNsb3N1cmUncyBvd24gbGl2ZSBjdXI6IHVudGlsIHRoZSBnb3Zlcm5vcgovLyB5aWVsZHMgb24gci9obG1haWxib3gsIHRoZSBnb3Zlcm5vcidzIG93biBjYWxsIOKAlCB0aGUgY29tcGlsZWQgYWRkcmVzcywgYnkgaXRzIG93biB0cmFuc2FjdGlvbiAoY3VyLlByZXZpb3VzKCkgYQovLyB1c2VyIHJlYWxtOiBhIE1zZ0NhbGwncywgb3IgYSBNc2dSdW4gc2NyaXB0J3MgZXBoZW1lcmFsIHJlYWxtLCB3aG9zZSBhZGRyZXNzIGlzIHRoZSBzaWduZXInczsgbmV2ZXIgYW5vdGhlcgovLyByZWFsbSksIHdoaWNoIGlzIEdvdmVybidzIG5vbi1jcm9zc2luZyBjYWxsIG9mIHRoZSBjbG9zdXJlIOKAlCBhbmQgZ25vLmxhbmQvci9nb3YvZGFvJ3MgcHJvcG9zYWxzIHJlZnVzZWQ7IGFmdGVyCi8vIGl0LCBvciB3aGVuIG5vIGdvdmVybm9yIHdhcyBjb21waWxlZCwgdGhlIHByb3h5J3MgZXhhY3QgcGtncGF0aCwgYXMgYmVmb3JlIE0xaywgYW5kIHRoZSBnb3Zlcm5vciByZWZ1c2VkIGxpa2UKLy8gYW55b25lLiBBIHJlZnVzYWwgaXMgYSBwYW5pYzogYSBwcm9wb3NhbCBtYWRlIGJlZm9yZSB0aGUgeWllbGQgc3Vydml2ZXMgZm9yIGEgcmV0cnkgYWZ0ZXIgaXQsIHdpdGhpbiBpdHMgMTQKLy8gZGF5cy4KZnVuYyBtdXN0QmVHb3Zlcm5vcihjdXIgcmVhbG0pIHsKCXByZXYgOj0gY3VyLlByZXZpb3VzKCkKCWlmIGRlY2lzaW9ucy5EQU9Hb3Zlcm5zKGxhdW5jaEdvdmVybm9yLCBobG1haWxib3guWWllbGRlZCgpKSB7CgkJaWYgcCA6PSBwcmV2LlBrZ1BhdGgoKTsgcCAhPSBkZWNpc2lvbnMuREFPUGF0aCB7CgkJCXBhbmljKCJobGdub3Q6IG9ubHkgIiArIGRlY2lzaW9ucy5EQU9QYXRoICsgIiBleGVjdXRlcyBhIGRlY2lzaW9uLCBub3QgIiArIHdobyhwcmV2LlBrZ1BhdGgoKSwgcHJldi5BZGRyZXNzKCkpKQoJCX0KCQlyZXR1cm4KCX0KCWlmICFwcmV2LklzVXNlcigpIHx8IHByZXYuQWRkcmVzcygpICE9IGxhdW5jaEdvdmVybm9yIHsKCQlwYW5pYygiaGxnbm90OiB1bnRpbCB0aGUgZ292ZXJub3IgeWllbGRzLCAiICsgc3RyaW5nKGxhdW5jaEdvdmVybm9yKSArICIgYWxvbmUgZGVjaWRlcywgYnkgR292ZXJuIGZyb20gaXRzIG93biBrZXk6IG5vdCAiICsgd2hvKHByZXYuUGtnUGF0aCgpLCBwcmV2LkFkZHJlc3MoKSkgKyAiIChhIEdvdkRBTyBwcm9wb3NhbCBpcyByZWZ1c2VkIHVudGlsIHRoZSB5aWVsZCkiKQoJfQp9CgpmdW5jIHByb3Bvc2UoY3VyIHJlYWxtLCBkIGhscm91dGUuRHJhZnQpIFJlcXVlc3QgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImhsZ25vdDogdGhhdCByZWFsbSB2YWx1ZSBpcyBub3QgbGl2ZTsgcGFzcyB5b3VyIG93biBjdXIiKQoJfQoJbWFkZSA6PSBub3coKQoJY2IgOj0gZnVuYyhjdXIgcmVhbG0pIGVycm9yIHsKCQltdXN0QmVHb3Zlcm5vcihjdXIpCgkJdCA6PSBub3coKQoJCWlmIGVyciA6PSBkZWNpc2lvbnMuRXhwaXJlZChtYWRlLCB0KTsgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9CgkJaWYgZC5LaW5kICE9IGhscm91dGUuS2luZENhbmNlbCB7CgkJCW11c3RCZUxpdmUoKQoJCX0KCQlpZiBkLktpbmQgPT0gaGxyb3V0ZS5LaW5kQXBwbHlSZWZ1bmQgewoJCQltdXN0Tm90QmVQYXVzZWQoaGxtYWlsYm94LkZuUGF5b3V0cykgLy8gYSByZWZ1bmQgbW92ZXMgY29pbnMgb3V0IG9mIHRoZSBsb2NrOiB1bmRlciBhIHN0YW5kaW5nIHBheW91dHMgZmxhZyBpdCB3YWl0cyBsaWtlIGEgY2xhaW0gKMKnNS45OyB0aGUgcHJvcG9zYWwgc3Vydml2ZXMgZm9yIGEgcmV0cnkpCgkJfQoJCWRlYyA6PSBzdC5EZWNpZGUobWFkZSwgdCwgZCwgZW52KGN1cikpCgkJY2hhaW4uRW1pdCgiRGVjaXNpb24iLCAiaWQiLCBpdG9hKGRlYy5JRCksICJraW5kIiwgZGVjLktpbmQsICJzdGF0ZSIsIGRlYy5TdGF0ZSgpKQoJCXJldHVybiBuaWwKCX0KCXJldHVybiBSZXF1ZXN0e3Byb3Bvc2FsOiBkYW8uTmV3UHJvcG9zYWxSZXF1ZXN0KCJobGdub3Q6ICIrZC5LaW5kLCBkLlRleHQsIGRhby5OZXdTaW1wbGVFeGVjdXRvcigwLCBjdXIsIGNiLCBkLlRleHQpKSwgdGV4dDogZC5UZXh0LCBkZWNpZGU6IGNifQp9CgovLyBHb3Zlcm4gaXMgdGhlIGdvdmVybm9yJ3Mgd2F5IGluIGJlZm9yZSB0aGUgeWllbGQgKE0xayk6IHRoZSBnb3Zlcm5vciDigJQgdGhlIGNvbXBpbGVkIGxhdW5jaEdvdmVybm9yLCBieSBpdHMgb3duCi8vIHRyYW5zYWN0aW9uICh0aGUgTXNnUnVuIHNjcmlwdCB0aGF0IG1ha2VzIHRoZSByZXF1ZXN0IGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uOyBuZXZlciB0aHJvdWdoIGFub3RoZXIgcmVhbG0pIOKAlAovLyBtYWtlcyBhIGJ1aWxkZXIncyBkZWNpc2lvbiBkaXJlY3RseSwgdGhlIHNhbWUgY2xvc3VyZSBHb3ZEQU8ncyBwcm94eSBydW5zIGFmdGVyIHRoZSB5aWVsZDogdGhlIHNhbWUgY2hlY2tzLCB0aGUKLy8gc2FtZSBhdC1vbmNlIHRlc3QsIHRoZSBzYW1lIDctZGF5IHF1ZXVlIGFuZCAxNC1kYXkgZGVhZGxpbmUsIHRoZSBzYW1lIHJlY29yZCBhbmQgZXZlbnRzLiBUaGUgY2xvc3VyZSBpcyBjYWxsZWQKLy8gbm9uLWNyb3NzaW5nLCBpbiB0aGlzIGZyYW1lLCBzbyBpdCByZWFkcyB0aGUgZ292ZXJub3IgZnJvbSBjdXIuUHJldmlvdXMoKSBhcyBpdCByZWFkcyB0aGUgcHJveHkgYWZ0ZXIgdGhlIHlpZWxkLgovLyBSZWZ1c2VkIGZvciBhbnlvbmUgZWxzZSwgYW5kIGZvciBldmVyeW9uZSBvbmNlIHRoZSBnb3Zlcm5vciB5aWVsZGVkIG9uIHIvaGxtYWlsYm94IChvciB3aGVuIG5vbmUgd2FzIGNvbXBpbGVkKToKLy8gR292REFPJ3MgcHJvcG9zYWxzIGRlY2lkZSB0aGVuLiBBIHJlcXVlc3QgcGFzdCBpdHMgMTQgZGF5cyBpcyByZWZ1c2VkICh0aGUgZGVhZGxpbmUgZXJyb3IpIGFuZCBtYWRlIGFmcmVzaC4KZnVuYyBHb3Zlcm4oY3VyIHJlYWxtLCByIFJlcXVlc3QpIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJobGdub3Q6IHRoYXQgcmVhbG0gdmFsdWUgaXMgbm90IGxpdmU7IHBhc3MgeW91ciBvd24gY3VyIikKCX0KCWlmIHIuZGVjaWRlID09IG5pbCB7CgkJcGFuaWMoImhsZ25vdDogbm90IGEgYnVpbGRlcidzIHJlcXVlc3QiKQoJfQoJaWYgeWllbGRlZCA6PSBobG1haWxib3guWWllbGRlZCgpOyBkZWNpc2lvbnMuREFPR292ZXJucyhsYXVuY2hHb3Zlcm5vciwgeWllbGRlZCkgewoJCWlmIGxhdW5jaEdvdmVybm9yID09ICIiIHsKCQkJcGFuaWMoImhsZ25vdDogbm8gZ292ZXJub3Igd2FzIGNvbXBpbGVkLCAiICsgZGVjaXNpb25zLkRBT1BhdGggKyAiIGdvdmVybnMgZnJvbSB0aGUgZmlyc3QgYmxvY2s6IGEgZGVjaXNpb24gaXMgYSBHb3ZEQU8gcHJvcG9zYWwsIG5ldmVyIEdvdmVybiIpCgkJfQoJCXBhbmljKCJobGdub3Q6IHRoZSBnb3Zlcm5vciB5aWVsZGVkIGF0IGhlaWdodCAiICsgaXRvYSh5aWVsZGVkKSArICIsICIgKyBkZWNpc2lvbnMuREFPUGF0aCArICIgZ292ZXJucyBzaW5jZTogYSBkZWNpc2lvbiBpcyBhIEdvdkRBTyBwcm9wb3NhbCwgbmV2ZXIgR292ZXJuIikKCX0KCW11c3RCZUdvdmVybm9yKGN1cikKCWlmIGVyciA6PSByLmRlY2lkZShjdXIpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiaGxnbm90OiAiICsgZXJyLkVycm9yKCkpCgl9Cn0KCi8vIE5ld1NldENhcEZsb29yUmVxdWVzdCBzZXRzIHRoZSBkYXkgY2FwJ3MgZmxvb3IgKGluIHVnbm90KTogYSBsb3dlcmluZyBhdCBvbmNlLCBuZXZlciBiZWxvdyB0aGUgbGF1bmNoIGZsb29yOyBhCi8vIHJhaXNlIGFmdGVyIDcgZGF5cy4KZnVuYyBOZXdTZXRDYXBGbG9vclJlcXVlc3QoY3VyIHJlYWxtLCBuIGludDY0KSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdENhcEZsb29yKG4pKQp9CgovLyBOZXdTZXRNYXhpbXVtUmVxdWVzdCBzZXRzIHRoZSBwZXItbWVzc2FnZSBtYXhpbXVtIChpbiB1Z25vdCksIG5ldmVyIGJlbG93IHRoZSBtaW5pbXVtOiBhIGxvd2VyaW5nIGF0IG9uY2UsIGEKLy8gcmFpc2UgYWZ0ZXIgNyBkYXlzLgpmdW5jIE5ld1NldE1heGltdW1SZXF1ZXN0KGN1ciByZWFsbSwgbiBpbnQ2NCkgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRNYXhpbXVtKG4pKQp9CgovLyBOZXdTZXRGZWVSZXF1ZXN0IHNldHMgdGhlIGZlZSBhbmQgdGhlIG1pbmltdW0gdG9nZXRoZXIgKGluIHVnbm90KSwgdGhlIGZlZSBub3QgYmVsb3cgdGhlIGZlZSBmbG9vcjogbG93ZXJpbmcKLy8gYm90aCBhdCBvbmNlLCByYWlzaW5nIGVpdGhlciBhZnRlciA3IGRheXMuCmZ1bmMgTmV3U2V0RmVlUmVxdWVzdChjdXIgcmVhbG0sIGZlZSwgbWluaW11bSBpbnQ2NCkgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRGZWUoZmVlLCBtaW5pbXVtKSkKfQoKLy8gTmV3U2V0RmVlRmxvb3JSZXF1ZXN0IHNldHMgdGhlIGZlZSBmbG9vciAoaW4gdWdub3QpLCBub3QgYWJvdmUgdGhlIGZlZTogYSBsb3dlcmluZyBhdCBvbmNlLCBhIHJhaXNlIGFmdGVyIDcgZGF5cy4KZnVuYyBOZXdTZXRGZWVGbG9vclJlcXVlc3QoY3VyIHJlYWxtLCBuIGludDY0KSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdEZlZUZsb29yKG4pKQp9CgovLyBOZXdTZXRSb3V0ZXJSZXF1ZXN0IHN3YXBzIHRoZSByb3V0ZXIgKGEgU29sYW5hIHByb2dyYW0gaWQgaW4gYmFzZTU4LCBvciAzMiBieXRlcyBpbiBoZXgpIGFmdGVyIDcgZGF5czsgdGhlIG9sZAovLyByb3V0ZXIncyBtZXNzYWdlcyBzdGF5IGFjY2VwdGVkIGZvciA3IGRheXMgbW9yZS4KZnVuYyBOZXdTZXRSb3V0ZXJSZXF1ZXN0KGN1ciByZWFsbSwgcm91dGVyIHN0cmluZykgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRSb3V0ZXIobXVzdEtleShyb3V0ZXIpLCByb3V0ZXIpKQp9CgovLyBOZXdWb2lkUmVxdWVzdCB2b2lkcyBjcmVkaXRzIGJ5IG1lc3NhZ2UgaWQgKGNvbW1hIHNlcGFyYXRlZCwgdXAgdG8gMjU2OyBhIGNsYWltLCBvciBhIHN3ZWVwIGVudHJ5IGFzIGZvcmdlZCkgb3IKLy8gYnkgYSByYW5nZSBvZiBjcmVkaXRzICgiaGVpZ2h0czo8ZnJvbT4tPHRvPiIsIGV2ZXJ5IGNyZWRpdCBhdCB0aG9zZSBibG9jayBoZWlnaHRzOyAic2luY2U6PGZyb20+IiwgZXZlcnkgY3JlZGl0Ci8vIHRoZSB2ZXJpZmllciBtYWRlIGZyb20gdGhhdCBoZWlnaHQgb24pLCBjbG9zZWQgYXQgdGhlIGhlaWdodCB0aGUgcHJvcG9zYWwgaXMgbWFkZSBhbmQgY292ZXJpbmcgYXQgbW9zdCAxLDAwMAovLyBjcmVkaXRzIChhIGJpZ2dlciByYW5nZSBpcyBzcGxpdCBieSBoZWlnaHRzKSwgYXMgd2l0aGhlbGQgKHRoZSByZW1haW5kZXIgc3RheXMgYm9va2VkLCByZXN0b3JhYmxlKSBvciBhcyBmb3JnZWQKLy8gKHRoZSByZW1haW5kZXIgZHJvcHBlZCwgdGhlIHBhaWQgcGFydCBsb3N0OyBhIHN3ZWVwIGVudHJ5J3MgYW1vdW50IGRyb3BwZWQgZnJvbSB3aGF0IGlzIG93ZWQpLiBBIGNyZWRpdCBhCi8vIGd1YXJkaWFuJ3Mgc3RhbmRpbmcgcGF5b3V0cyBmbGFnIG5hbWVzIOKAlCBieSBpZCwgb3IgYnkgYSByYW5nZSBjb3ZlcmluZyBpdCDigJQgaXMgdm9pZGVkIHRoZSBtb21lbnQgdGhlIHByb3Bvc2FsCi8vIGV4ZWN1dGVzOyB0aGUgcmVzdCB3YWl0IDcgZGF5cy4gVGhlIHVucGF1c2Ugb3B0aW9uIHRha2VzIHRoZSB1bnBhdXNlIGJ1aWxkZXIncyBwYXJhbWV0ZXJzIOKAlCB0aGUgZnVuY3Rpb25zIHdob3NlCi8vIGZsYWdzIHRvIGNsZWFyIChzZW5kcywgY3JlZGl0cywgcGF5b3V0czsgY29tbWEgc2VwYXJhdGVkLCAiIiBmb3Igbm9uZSkgYW5kIHRoZSBzZWF0cyB0byB2YWNhdGUgKGNvbW1hIHNlcGFyYXRlZCwKLy8gIiIgZm9yIG5vbmU7IGVhY2ggc2VhdCdzIGhvbGRlciBub3cgaXMgcmVjb3JkZWQsIGFuZCBhIHNlYXQgd2hvc2Ugb2NjdXBhbnQgY2hhbmdlZCBieSBleGVjdXRpb24gaXMgc2tpcHBlZCkg4oCUCi8vIGFwcGxpZWQgaW4gdGhlIHNhbWUgY2xvc3VyZSwgYWZ0ZXIgdGhlIHZvaWQuCmZ1bmMgTmV3Vm9pZFJlcXVlc3QoY3VyIHJlYWxtLCBpZHMgc3RyaW5nLCBmb3JnZWQgYm9vbCwgdW5wYXVzZUZucywgcmVtb3ZlU2VhdHMgc3RyaW5nKSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdFZvaWQoaWRzLCBmb3JnZWQsIHVucGF1c2VGbnMsIHJlbW92ZVNlYXRzLCBydW50aW1lLkNoYWluSGVpZ2h0KCksIGhsbWFpbGJveC5TZWF0KSkKfQoKLy8gTmV3UmVzdG9yZVJlcXVlc3QgcmVzdG9yZXMgdm9pZGVkIGNsYWltcyBieSBtZXNzYWdlIGlkOiBhIHdpdGhoZWxkIG9uZSBhdCBvbmNlLCBhIGZvcmdlZCBvbmUgYWZ0ZXIgNyBkYXlzLgpmdW5jIE5ld1Jlc3RvcmVSZXF1ZXN0KGN1ciByZWFsbSwgaWRzIHN0cmluZykgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRSZXN0b3JlKGlkcykpCn0KCi8vIE5ld0NyZWRpdFJlcXVlc3QgY3JlZGl0cyBhIGNsYWltIGJ5IGhhbmQgYWZ0ZXIgNyBkYXlzOiBhbW91bnQgKGluIHVnbm90KSB0byBhIHJlY2lwaWVudCB1bmRlciBhIG1lc3NhZ2UgaWQuIEl0Ci8vIG1hcmtzIHRoZSBpZCBkb25lIGFuZCByZWZ1c2VzIGFuIGlkIGFscmVhZHkgZG9uZSwgdW5sZXNzIHRoYXQgaWQncyBjbGFpbSBzdGFuZHMgdm9pZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBjbGFpbQovLyBpcyByZXN0b3JlZCBhbmQgaXRzIHJlbWFpbmRlciByZXBsYWNlZCBieSB0aGlzIHJlY2lwaWVudCBhbmQgYW1vdW50IGF0IHRoZSBiYWNrIG9mIHRoZSByZWNpcGllbnQncyBxdWV1ZS4KZnVuYyBOZXdDcmVkaXRSZXF1ZXN0KGN1ciByZWFsbSwgaWQgc3RyaW5nLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIFJlcXVlc3QgewoJbXVzdEJlTGl2ZSgpCglpZiAhdG8uSXNWYWxpZCgpIHx8IGlzUmVhbG0odG8pIHsKCQlwYW5pYygiaGxnbm90OiB0aGUgcmVjaXBpZW50IG11c3QgYmUgYW4gYWRkcmVzcyBvdXRzaWRlIHRoZSBicmlkZ2UncyByZWFsbXMiKQoJfQoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdENyZWRpdChpZCwgdG8sIGFtb3VudCwgaGxtYWlsYm94LkRlbGl2ZXJlZChpZCkgIT0gMCkpCn0KCi8vIE5ld1N3ZWVwUmVxdWVzdCBwYXlzIHN3ZWVwIGVudHJpZXMsIG5hbWVkIGJ5IG1lc3NhZ2UgaWQgKGNvbW1hIHNlcGFyYXRlZCwgdXAgdG8gMjU2KSwgdG8gYW4gYWRkcmVzcyBhZnRlciA3Ci8vIGRheXM6IHRoZWlyIHN1bSwgYXQgbW9zdCB0aGUgbG9jay4gVGhlIHBhaWQgZW50cmllcyBhcmUgZHJvcHBlZCAoUjE5KSwgc28gbm9uZSBpcyBldmVyIHBhaWQsIGNyZWRpdGVkIGJ5IGlkIG9yCi8vIHZvaWRlZCB0d2ljZTsgYW4gZW50cnkgdm9pZGVkIG9yIGdvbmUgYnkgdGhlbiBpcyBza2lwcGVkLCB0aGUgZGVjaXNpb24ncyBub3RlIHNheWluZyBzby4KZnVuYyBOZXdTd2VlcFJlcXVlc3QoY3VyIHJlYWxtLCBpZHMgc3RyaW5nLCB0byBhZGRyZXNzKSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJaWYgIXRvLklzVmFsaWQoKSB8fCBpc1JlYWxtKHRvKSB7CgkJcGFuaWMoImhsZ25vdDogdGhlIHJlY2lwaWVudCBtdXN0IGJlIGFuIGFkZHJlc3Mgb3V0c2lkZSB0aGUgYnJpZGdlJ3MgcmVhbG1zIikKCX0KCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRTd2VlcChpZHMsIHRvKSkKfQoKLy8gTmV3UmVmdW5kUmVxdWVzdCBxdWV1ZXMgYSByZWZ1bmQgb2Ygc2VuZHMgYnkgbWVzc2FnZSBpZCAoY29tbWEgc2VwYXJhdGVkKSB0byB0aGVpciBzZW5kZXJzLCA3IGRheXM6IHRoZSBjdXJlIGZvcgovLyBzZW5kcyBhIG1pZ3JhdGlvbiBzdHJhbmRlZCB1bmRlbGl2ZXJlZCDigJQgdGhlIHNlbmRzIGltcG9ydGVkIGZyb20gdGhlIHByZWRlY2Vzc29yLCBvbmNlIGtpbmQgNiBoYXMgZW5yb2xsZWQgdGhpcwovLyByZWFsbSBvbiBTb2xhbmEgZm9yIDE0IGRheXMgYnkgci9obGdvdidzIG5vdGUgd2l0aCB0aGUgbWFpbGJveCAoQVIxLCBSMzc6IGEgcmVmdW5kZWQgc2VuZCBzdGF5cyBkZWxpdmVyYWJsZQovLyB0aGVyZSB1bnRpbCB0aGUgcHJlZGVjZXNzb3IncyByb3V0ZXIgaXMgcmVwbGFjZWQpLCBjaGVja2VkIHdoZW4gdGhlIHByb3Bvc2FsIGlzIG1hZGUgYW5kIHdoZW4gaXQgYXBwbGllcy4gQWZ0ZXIKLy8gdGhlIDcgZGF5cyBHb3ZEQU8gYXBwbGllcyBpdCBieSBOZXdBcHBseVJlZnVuZFJlcXVlc3QgKEFUMiksIG5ldmVyIGFueW9uZSBieSBFeGVjdXRlLgpmdW5jIE5ld1JlZnVuZFJlcXVlc3QoY3VyIHJlYWxtLCBpZHMgc3RyaW5nKSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdFJlZnVuZChpZHMsIG5vdygpLCBlbnYoY3VyKSkpCn0KCi8vIE5ld0FwcGx5UmVmdW5kUmVxdWVzdCBhcHBsaWVzIGEgcXVldWVkIHJlZnVuZCBkZWNpc2lvbiB3aG9zZSA3IGRheXMgaGF2ZSBwYXNzZWQsIGF0IG9uY2UgKEFUMik6IEdvdkRBTydzIG93biBhY3QsCi8vIHRoZSBtZW1iZXIgaGF2aW5nIHJlYWQgaGx3YXRjaCdzIGdhdGUgZmlyc3Qg4oCUIHRoZSB0b2tlbidzIHJvdXRlciBvbiBTb2xhbmEgaXMgdGhpcyByZWFsbSBhbmQgdGhlIGtpbmQgNiBpcwovLyBleGVjdXRlZCB0aGVyZSDigJQgc2luY2UgdGhpcyByZWFsbSBjYW5ub3Qgc2VlIFNvbGFuYSwgYW5kIGEgcmVmdW5kIGFwcGxpZWQgd2hpbGUgdGhlIHByZWRlY2Vzc29yIGlzIHN0aWxsIHRoZQovLyByb3V0ZXIgbGV0cyB0aGUgcmVmdW5kZWQgc2VuZGVyIGRlbGl2ZXIgaGlzIHNlbmQgdGhlcmUgYWZ0ZXIgaXQgKG1pbnRlZCB0d2ljZSwgQVIxKTsgRXhlY3V0ZSByZWZ1c2VzIGEgcmVmdW5kLgovLyBUaGUgYXBwbHkgaXMgdGhlIGRlbGF5J3Mgb3duOiB0aGUgbm90ZSdzIDE0IGRheXMgYXNrZWQgYWdhaW4sIHRoZSBzdW0gYXQgbW9zdCB0aGUgbG9jazsgdW5kZXIgYSBzdGFuZGluZwovLyBwYXlvdXRzIGZsYWcgaXQgd2FpdHMgZm9yIHRoZSB1bnBhdXNlIGxpa2UgYSBjbGFpbSAodGhlIGNsb3N1cmUgcmVmdXNlcywgdGhlIHByb3Bvc2FsIHJldHJpZWQgd2l0aGluIGl0cyAxNAovLyBkYXlzKS4gUmVmdXNlZCBmb3IgYSBkZWNpc2lvbiB0aGF0IGlzIG5vIHJlZnVuZCwgbm90IHBlbmRpbmcsIG9yIG5vdCB5ZXQgZHVlOyB0aGUgZGVzY3JpcHRpb24gbmFtZXMgdGhlIHJlZnVuZAovLyBkZWNpc2lvbiBhbmQgY2FycmllcyBpdHMgdGV4dCwgdGhlIGlkcyBpbmNsdWRlZC4KZnVuYyBOZXdBcHBseVJlZnVuZFJlcXVlc3QoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRBcHBseVJlZnVuZChpZCwgbm93KCksIGVudihjdXIpKSkKfQoKLy8gTmV3V3JpdGVPZmZSZXF1ZXN0IGJvb2tzIHJlZnVuZGVkIHNlbmRzLCBieSBtZXNzYWdlIGlkIChjb21tYSBzZXBhcmF0ZWQpLCBhcyBsb3N0IGFmdGVyIDcgZGF5cyAoQVIxKTogYSByZWZ1bmRlZAovLyBzZW5kIGRlbGl2ZXJlZCBvbiBTb2xhbmEgYWZ0ZXIgYWxsIChhIHN0cmFuZ2VyJ3MgUmVlbWl0KSBtaW50ZWQgYSBzZWNvbmQgdGltZSBhZ2FpbnN0IG5vdGhpbmcsIGFuZCB0aGUgd3JpdGUtb2ZmCi8vIGNsb3NlcyB0aGUgaWRlbnRpdHkgYnkgaXRzIGFtb3VudDsgb25seSBhIHJlZnVuZGVkIHNlbmQsIG9uY2Ug4oCUIHRoZSBtZW1iZXIgcmVhZHMgaGx3YXRjaCdzIERFTElWRVJFRCBsaW5lIGZvciB0aGUKLy8gaWQgZmlyc3QuCmZ1bmMgTmV3V3JpdGVPZmZSZXF1ZXN0KGN1ciByZWFsbSwgaWRzIHN0cmluZykgUmVxdWVzdCB7CgltdXN0QmVMaXZlKCkKCXJldHVybiBwcm9wb3NlKGN1ciwgc3QuRHJhZnRXcml0ZU9mZihpZHMpKQp9CgovLyBOZXdNaWdyYXRlUmVxdWVzdCBoYW5kcyB0aGUgbG9jaywgdGhlIGNsYWltcyBhbmQgdGhlIHNlbmQgcmVjb3JkcyB0byBhIHN1Y2Nlc3NvciByZWFsbSBhZnRlciA3IGRheXM6IHRoZQovLyBzdWNjZXNzb3IgdGhlbiBjYWxscyBQdWxsIGZyb20gaXRzIG93biBjb2RlIGFuZCB0YWtlcyB0aGVtIG92ZXIuIFRoZSBzdWNjZXNzb3IgbXVzdCBoYXZlIGFubm91bmNlZCBpdHNlbGYgdG8KLy8gdGhlIG1haWxib3ggZnJvbSBpdHMgb3duIGNvZGUgZmlyc3QsIGZvciB0aGUgR05PVCByb3V0ZSAoaGxtYWlsYm94LkFubm91bmNlU3VjY2Vzc29yKGN1ciwgIkdOT1QiKSwgUjI1IGFuZAovLyBBUTUpLCBhbmQgbXVzdCBub3QgYmUgYSByb3V0ZSB0aGUgbWFpbGJveCByZWdpc3RlcnMgYWxyZWFkeSAoUjMxKSDigJQgY2hlY2tlZCB3aGVuIHRoZSBwcm9wb3NhbCBpcyBtYWRlIGFuZCB3aGVuCi8vIGl0IGFwcGxpZXMsIHNvIHRoZSBsb2NrIG5ldmVyIGdvZXMgdG8gYSBwYXRoIHdpdGggbm8gcmVhbG0gYmVoaW5kIGl0LCBub3IgdG8gdGhlIEJVQkJMRSByb3V0ZSdzIHN1Y2Nlc3NvciBieSBhCi8vIHNsaXAuIEEgcmVhbG0gdGhhdCBzdWNjZWVkcyBhbm90aGVyIChhIHN1Y2Nlc3NvciByZWdpc3RlcmVkIGJ5IGl0cyBwcmVkZWNlc3NvcidzIG1pZ3JhdGUpIG1pZ3JhdGVzIG9uIG9ubHkgb25jZQovLyBpdHMgb3duIGltcG9ydCBoYXMgZW5kZWQgKFIzMSk6IGJlZm9yZSBwYWdlIDAgbm90aGluZyBoYXMgbW92ZWQgYW5kIHRoZSBsb2NrIHdvdWxkIGJlIHN0cmFuZGVkIGZvciBnb29kLgpmdW5jIE5ld01pZ3JhdGVSZXF1ZXN0KGN1ciByZWFsbSwgdG8gc3RyaW5nKSBSZXF1ZXN0IHsKCW11c3RCZUxpdmUoKQoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdE1pZ3JhdGUodG8sIHBrZ1BhdGgsIGVudihjdXIpKSkKfQoKLy8gTmV3Q2FuY2VsUmVxdWVzdCBjYW5jZWxzIGEgcGVuZGluZyBkZWNpc2lvbiBvZiB0aGlzIHJvdXRlLCBhdCBvbmNlLiBJdCBpcyBwcm9wb3NlZCBiZWZvcmUgTGF1bmNoIHRvby4KZnVuYyBOZXdDYW5jZWxSZXF1ZXN0KGN1ciByZWFsbSwgaWQgaW50NjQpIFJlcXVlc3QgewoJcmV0dXJuIHByb3Bvc2UoY3VyLCBzdC5EcmFmdENhbmNlbChpZCkpCn0KCi8vIEV4ZWN1dGUgYXBwbGllcyBhIHF1ZXVlZCBkZWNpc2lvbiB3aG9zZSA3IGRheXMgaGF2ZSBwYXNzZWQuIEFueW9uZSBtYXkgY2FsbCBpdDsgdGhlIHJlbGF5ZXJzIGRvLiBBIHN3ZWVwCi8vIHBheW1lbnQgbW92ZXMgY29pbnMgb3V0IG9mIHRoZSBsb2NrLCBzbyB1bmRlciBhIHN0YW5kaW5nIHBheW91dHMgZmxhZyBpdCB3YWl0cyBmb3IgdGhlIHVucGF1c2UgbGlrZSBhIGNsYWltCi8vICjCpzUuOTogbm90aGluZyBwYWlkIHVuZGVyIGEgc3VzcGVjdCB2ZXJpZmllcikuIEEgcmVmdW5kIGlzIG5ldmVyIEV4ZWN1dGUncyAoQVQyKTogdGhlIHN0YXRlIHJlZnVzZXMgdGhlIGtpbmQsIGFuZAovLyBHb3ZEQU8gYXBwbGllcyBpdCBieSBOZXdBcHBseVJlZnVuZFJlcXVlc3QgYWZ0ZXIgaGx3YXRjaCdzIFNvbGFuYSBjaGVjay4KZnVuYyBFeGVjdXRlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCWNhbGxlcihjdXIpCgltdXN0QmVMaXZlKCkKCWlmIGQgOj0gc3QuTGVkZ2VyLkdldChpZCk7IGQgIT0gbmlsICYmIGQuS2luZCA9PSBobHJvdXRlLktpbmRTd2VlcCB7CgkJbXVzdE5vdEJlUGF1c2VkKGhsbWFpbGJveC5GblBheW91dHMpCgl9CglkZWMgOj0gc3QuRXhlY3V0ZShub3coKSwgaWQsIGVudihjdXIpKQoJY2hhaW4uRW1pdCgiRGVjaXNpb24iLCAiaWQiLCBpdG9hKGRlYy5JRCksICJraW5kIiwgZGVjLktpbmQsICJzdGF0ZSIsIGRlYy5TdGF0ZSgpKQp9CgovLyBQdWxsIGlzIHRoZSBzdWNjZXNzb3Inczogb25jZSBhIG1pZ3JhdGUgZGVjaXNpb24gbmFtZXMgaXQsIHRoZSByZWFsbSBhdCB0aGF0IHBrZ3BhdGggY2FsbHMgUHVsbCBmcm9tIGl0cyBvd24KLy8gY29kZSwgcGFnZSBieSBwYWdlIGZyb20gMCwgYW5kIHJlY2VpdmVzIHRoZSBsb2NrIChwYWlkIHRvIGl0cyBhZGRyZXNzLCB3aXRoIHBhZ2UgMCkgYW5kIHRoZSByZWNvcmRzIHRvIGltcG9ydCwKLy8gdXAgdG8gNTAwIGEgcGFnZSAodGhlIHNuYXBzaG90J3MgTW9yZSBzYXlzIHdoZXRoZXIgYSBwYWdlIGZvbGxvd3MpOyBhIHBhZ2UgcHVsbGVkIGFscmVhZHkgaGFuZHMgb3ZlciBub3RoaW5nLgovLyBQYWdlIDAgbW92ZXMgdGhlIGxvY2ssIHNvIHVuZGVyIGEgc3RhbmRpbmcgcGF5b3V0cyBmbGFnIGl0IHdhaXRzIGZvciB0aGUgdW5wYXVzZSBsaWtlIGEgc3dlZXAgcGF5bWVudCAoUjI3LCBSMTY6Ci8vIG5vdGhpbmcgcGFpZCB1bmRlciBhIHN1c3BlY3QgdmVyaWZpZXIpOyB0aGUgZmxhZyBmb2xsb3dzIHRoZSBjbGFpbXMgdG8gdGhlIHN1Y2Nlc3NvciAoaGxtYWlsYm94LkFkZFJvdXRlKS4KZnVuYyBQdWxsKGN1ciByZWFsbSwgcGFnZSBpbnQpICpobHJvdXRlLlNuYXBzaG90IHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJobGdub3Q6IHRoYXQgcmVhbG0gdmFsdWUgaXMgbm90IGxpdmU7IHBhc3MgeW91ciBvd24gY3VyIikKCX0KCXBhdGggOj0gY3VyLlByZXZpb3VzKCkuUGtnUGF0aCgpCglpZiBzdC5NaWdyYXRlZFRvID09ICIiIHx8IHBhdGggIT0gc3QuTWlncmF0ZWRUbyB7CgkJcGFuaWMoImhsZ25vdDogb25seSB0aGUgc3VjY2Vzc29yIG5hbWVkIGJ5IGEgbWlncmF0ZSBkZWNpc2lvbiBwdWxscyIpCgl9CglpZiBwYWdlID09IDAgewoJCW11c3ROb3RCZVBhdXNlZChobG1haWxib3guRm5QYXlvdXRzKQoJfQoJc25hcCA6PSBzdC5FeHBvcnQocGFnZSwgaGxyb3V0ZS5QdWxsUGFnZSkKCWlmIHBhZ2UgPT0gMCB7CgkJaGxtYWlsYm94Lk5vdGVQdWxsZWQoY3Jvc3MoY3VyKSwgcGF0aCkgLy8gdGhlIGxvY2sgbW92ZWQ6IHRoZSBtYWlsYm94IGFuc3dlcnMgUHVsbGVkIChSMzUpIOKAlCBraW5kIDYgbWF5IGVucm9sIHRoZSBzdWNjZXNzb3IsIGFuZCB0aGUgbWlncmF0aW9uIGlzIG5ldmVyIHJlLXBvaW50ZWQKCX0KCWlmIHNuYXAuTG9jayA+IDAgewoJCXBheShjdXIsIGNoYWluLlBhY2thZ2VBZGRyZXNzKHBhdGgpLCBzbmFwLkxvY2spCgl9CgljaGFpbi5FbWl0KCJNaWdyYXRlZCIsICJ0byIsIHBhdGgsICJwYWdlIiwgc3RyY29udi5JdG9hKHBhZ2UpLCAibG9jayIsIGl0b2Eoc25hcC5Mb2NrKSwgImNsYWltcyIsIHN0cmNvbnYuSXRvYShsZW4oc25hcC5DbGFpbXMpKSwgInN3ZWVwcyIsIHN0cmNvbnYuSXRvYShsZW4oc25hcC5Td2VlcHMpKSwgInNlbmRzIiwgc3RyY29udi5JdG9hKGxlbihzbmFwLlNlbmRzKSksICJtb3JlIiwgc3RyY29udi5Gb3JtYXRCb29sKHNuYXAuTW9yZSkpCglyZXR1cm4gc25hcAp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGFnZXMgLS0KCmZ1bmMgcGF1c2VkVGV4dCgpIHN0cmluZyB7Cgl2YXIgZm5zIFtdc3RyaW5nCglmb3IgXywgZm4gOj0gcmFuZ2UgW11zdHJpbmd7aGxtYWlsYm94LkZuU2VuZHMsIGhsbWFpbGJveC5GbkNyZWRpdHMsIGhsbWFpbGJveC5GblBheW91dHN9IHsKCQlpZiBobG1haWxib3guUGF1c2VkKHBrZ1BhdGgsIGZuKSB7CgkJCWZucyA9IGFwcGVuZChmbnMsIGZuKQoJCX0KCX0KCXJldHVybiBzdHJpbmdzLkpvaW4oZm5zLCAiLCAiKQp9CgovLyBSZW5kZXI6Ci8vCi8vCSIiICAgICAgICAgICAgICAgIHRoZSByb3V0ZSdzIHBhZ2UgKHRoZSBmaXJzdCAxMDAgd2FpdGluZyBjbGFpbXMgYW5kIHN3ZWVwIGVudHJpZXMsIHRoZSByZXN0IGNvdW50ZWQpCi8vCSJkZWNpc2lvbnMiICAgICAgIHRoZSBkZWNpc2lvbnMgcGFnZTogdGhlIGxhc3QgMTAwIHBlbmRpbmcgYW5kIGV4ZWN1dGVkIHBlciBraW5kCi8vCSJqc29uIiAgICAgICAgICAgIHRoZSBmaWd1cmVzIGZvciB0aGUgYWdlbnRzCi8vCSJkZWNpc2lvbnMuanNvbiIgIGV2ZXJ5IGRlY2lzaW9uCi8vCSJjbGFpbS88aWQ+IiAgICAgIG9uZSBjbGFpbSBieSBtZXNzYWdlIGlkLCBvciB0aGUgc3dlcHQgYW1vdW50LCBvciAibnVsbCIKLy8JImNsYWltcy88ZnJvbT4iICAgdXAgdG8gMTAwIHdhaXRpbmcgY2xhaW1zIGZyb20gdGhlIDxmcm9tPi10aCBvbiwgaW4gdGhlIHBhZ2UncyBvcmRlciwgYXMgYSBKU09OIGFycmF5Ci8vCSJzd2VlcHMvPGZyb20+IiAgIHVwIHRvIDEwMCBzd2VlcCBlbnRyaWVzIGZyb20gdGhlIDxmcm9tPi10aCBvbiwgYnkgaWQsIGFzIGEgSlNPTiBhcnJheQovLwkic2VuZC88aWQ+IiAgICAgICBvbmUgc2VuZCBieSBtZXNzYWdlIGlkICh7ImlkIiwiZnJvbSIsImFtb3VudCIsImF0IiwiaW1wb3J0ZWQiLCJyZWZ1bmRlZCIsIndyaXR0ZW5PZmYifSksIG9yICJudWxsIgovLwkicmVmdW5kcy88ZnJvbT4iICB1cCB0byAxMDAgc2VuZHMgcmVmdW5kZWQgaGVyZSBmcm9tIHRoZSA8ZnJvbT4tdGggb24sIGJ5IGlkLCBhcyBhIEpTT04gYXJyYXkgKEFRMjogd2hhdCB0aGUKLy8JICAgICAgICAgICAgICAgICAgbW9uaXRvcnMgcmVhZCB0byBkcm9wIGEgcmVmdW5kZWQgc2VuZCBmcm9tIHdoYXQgaXMgaW4gZmxpZ2h0KQpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWVwb2NoLCBhdCA6PSBobG1haWxib3guUGF5b3V0c0Vwb2NoKHBrZ1BhdGgpCglzd2l0Y2ggewoJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAiY2xhaW1zLyIpOgoJCXJldHVybiBzdC5DbGFpbXNQYWdlKHBhcnNlRnJvbShwYXRoW2xlbigiY2xhaW1zLyIpOl0pKQoJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAic3dlZXBzLyIpOgoJCXJldHVybiBzdC5Td2VlcHNQYWdlKHBhcnNlRnJvbShwYXRoW2xlbigic3dlZXBzLyIpOl0pKQoJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAic2VuZC8iKToKCQlyZXR1cm4gc3QuU2VuZEpTT04ocGF0aFtsZW4oInNlbmQvIik6XSkKCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgInJlZnVuZHMvIik6CgkJcmV0dXJuIHN0LlJlZnVuZHNQYWdlKHBhcnNlRnJvbShwYXRoW2xlbigicmVmdW5kcy8iKTpdKSkKCWNhc2UgcGF0aCA9PSAiIjoKCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKCIjIEdOT1QgYWNyb3NzIGNoYWluc1xuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIlRoZSBicmlkZ2UncyBHTk9UIHJvdXRlIG9uIGduby5sYW5kLiBHTk9UIHNlbnQgdG8gU29sYW5hIGlzIGxvY2tlZCBoZXJlLCBhbmQgdGhlIHN5bnRoZXRpYyBHTk9UIHRoZXJlIGlzIGJhY2tlZCBieSBpdCBvbmUgdG8gb25lOyBhIGJ1cm4gdGhlcmUgaXMgY3JlZGl0ZWQgaGVyZSBhcyBhIGNsYWltLCBwYWlkIHVuZGVyIHRoZSBtZXRlcnMuIEV2ZXJ5IHNldHRpbmcgbW92ZXMgb25seSBieSBhIGRlY2lzaW9uIG1hZGUgd2l0aCB0aGlzIHJlYWxtJ3MgYnVpbGRlcnMg4oCUIHRoZSBnb3Zlcm5vcidzIG93biB1bnRpbCBpdCB5aWVsZHMsIGEgR292REFPIHByb3Bvc2FsIGFmdGVyLlxuXG4iKQoJCWlmIGhsbWFpbGJveC5MaXZlKCkgewoJCQliLldyaXRlU3RyaW5nKCItICoqbGl2ZSoqIHNpbmNlICIgKyBpdG9hKGhsbWFpbGJveC5MYXVuY2hlZEF0KCkpICsgIlxuIikKCQl9IGVsc2UgewoJCQliLldyaXRlU3RyaW5nKCItICoqbm90IGxhdW5jaGVkKio6IHRoZSB2YWx1ZXMgYmVsb3cgYXJlIHRoZSBjb21waWxlZCBsYXVuY2ggdmFsdWVzLCB3YWl0aW5nIGZvciB0aGUgTGF1bmNoIGRlY2lzaW9uXG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCItICIgKyBkZWNpc2lvbnMuR292ZXJub3JMaW5lKGxhdW5jaEdvdmVybm9yLCBobG1haWxib3guWWllbGRlZCgpKSArICJcbiIpCgkJYi5Xcml0ZVN0cmluZygiLSBiYWxhbmNlOiAiICsgc3QuQW1vdW50KEJhbGFuY2UoKSkgKyAiXG4iKQoJCWIuV3JpdGVTdHJpbmcoc3QuRmlndXJlcyhub3coKSwgZXBvY2gsIGF0LCBobG1haWxib3guTGF1bmNoZWRBdCgpLCBwYXVzZWRUZXh0KCkpKQoJCWIuV3JpdGVTdHJpbmcoIlxuIyMgRGVjaXNpb25zXG5cbiIgKyBzdC5MZWRnZXIuUGFnZSgpKQoJCXJldHVybiBiLlN0cmluZygpCgljYXNlIHBhdGggPT0gImRlY2lzaW9ucyI6CgkJcmV0dXJuICIjIERlY2lzaW9uc1xuXG4iICsgc3QuTGVkZ2VyLlBhZ2UoKQoJY2FzZSBwYXRoID09ICJqc29uIjoKCQlyZXR1cm4gIntcImFkZHJlc3NcIjoiICsgc3RyY29udi5RdW90ZShzdHJpbmcoQWRkcmVzcygpKSkgKyAiLFwibGl2ZVwiOiIgKyBzdHJjb252LkZvcm1hdEJvb2woaGxtYWlsYm94LkxpdmUoKSkgKwoJCQkiLCIgKyBkZWNpc2lvbnMuR292ZXJub3JKU09OKGxhdW5jaEdvdmVybm9yLCBobG1haWxib3guWWllbGRlZCgpKSArCgkJCSIsXCJiYWxhbmNlXCI6IiArIGl0b2EoQmFsYW5jZSgpKSArICIsXCJwYXVzZWRcIjoiICsgc3RyY29udi5RdW90ZShwYXVzZWRUZXh0KCkpICsgIiwiICsgc3QuSlNPTihub3coKSwgZXBvY2gsIGF0LCBobG1haWxib3guTGF1bmNoZWRBdCgpKSArICJ9IgoJY2FzZSBwYXRoID09ICJkZWNpc2lvbnMuanNvbiI6CgkJcmV0dXJuIHN0LkxlZGdlci5KU09OKCkKCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgImNsYWltLyIpOgoJCXJldHVybiBzdC5DbGFpbUpTT04ocGF0aFtsZW4oImNsYWltLyIpOl0pCgl9CglyZXR1cm4gInVua25vd24gcGF0aDsgc2VlIHRoZSByb3V0ZSdzIHBhZ2UiCn0KCi8vIHBhcnNlRnJvbSByZWFkcyBhIHBhZ2UncyBvZmZzZXQ7IC0xIChhbiBlbXB0eSBwYWdlKSBmb3IgYW55dGhpbmcgYnV0IGEgbnVtYmVyLgpmdW5jIHBhcnNlRnJvbShzIHN0cmluZykgaW50IHsKCW4sIGVyciA6PSBzdHJjb252LkF0b2kocykKCWlmIGVyciAhPSBuaWwgfHwgbiA8IDAgewoJCXJldHVybiAtMQoJfQoJcmV0dXJuIG4KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDjEwMDAwMDAwMHVnbm90EhEIytyoRBIKNzE2Mzd1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNy5oxOaLDVK04cbMpPjvqT/ZJE+cCmnmxN1AFOMMg0WxJA6h/4VP2529e/iV7r9xDfCeD1g3TC3BgET1NDjLNsACw2gyKO/uI1Z/vP1EHClejfk57CJNm3Oz85pKbgLi9DnhooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==