Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
021BCC4F1F816635C6A48B065C75E32D464D526F9E4A8FBA3F048164B8E2A2BA
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
350,000,000
Requested gas limit
GAS USED
133,758,908
Gas consumed
FEE
500000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt40000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CoKmBgoML3ZtLm1fYWRkcGtnEvClBgooZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdBKzpQYKBXBhZHYyEj9nbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvZ25vbWkvcGFkdjIaZgoLZ25vbW9kLnRvbWwSV21vZHVsZSA9ICJnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvZ25vbWkvcGFkdjIiCmdubyA9ICIwLjkiChr6kwEKEGdub3N3YXBfbGlzdC5nbm8S5JMBcGFja2FnZSBwYWR2Mg0KDQppbXBvcnQgKA0KCSJjaGFpbiINCgkic3RyY29udiINCgkic3RyaW5ncyINCgkidGltZSINCg0KCSJnbm8ubGFuZC9wL2dub3N3YXAvY29uc3RzL3YxIg0KCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIg0KCSJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Ig0KCSJnbm8ubGFuZC9yL2dub3N3YXAvZ25zIg0KCWduc3Bvb2wgImduby5sYW5kL3IvZ25vc3dhcC9wb29sIg0KCSJnbm8ubGFuZC9yL2dub3N3YXAvcG9zaXRpb24iDQoJImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIiDQopDQoNCi8vIFNhcHBoaXJlIEdub3N3YXAgcmVnaXN0cnkga2V5cyAvIHJvbGUgYWRkcmVzc2VzIChzYXBwaGlyZS0xKS4NCmNvbnN0ICgNCgl3dWdub3RUb2tlbktleSAgICAgICA9ICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCINCglnbnNUb2tlbktleSAgICAgICAgICA9ICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUyINCglnbm9zd2FwUG9vbEFkZHJTdHIgICA9ICJnMWRleGFmNmFxa2t5cjl5Znk5ZDV1cDY5bHNuN3JhODBhZjM0ZzV2Ig0KCWdub3N3YXBSb3V0ZXJBZGRyU3RyID0gImcxdmM4ODNnc2h1NXo3eXRrNWNkeW5oYzhjMmRoNjdwZHA0Y3N6a3AiDQopDQoNCi8vIGxpc3RGdW5kIHRyYWNrcyBhc3NldHMgcHVsbGVkIGZyb20gdGhlIGxpc3RpbmcgY2FsbGVyIGZvciByZWZ1bmQgLyBMUCB1Z25vdCByZWltYnVyc2UuDQp0eXBlIGxpc3RGdW5kIHN0cnVjdCB7DQoJb2sgICAgICAgICAgICAgIGJvb2wNCgljYWxsZXIgICAgICAgICAgYWRkcmVzcw0KCXB1bGxlZExwV3Vnbm90ICBpbnQ2NCAvLyByZWltYnVyc2VkIGFzIHVnbm90IGFmdGVyIHN1Y2Nlc3NmdWwgbGlzdA0KCXB1bGxlZEZlZVd1Z25vdCBpbnQ2NCAvLyBsZWZ0b3ZlciBXVUdOT1QgcmVmdW5kZWQgYWZ0ZXIgbGlzdDsgZnVsbCByZWZ1bmQgb24gZmFpbA0KCXB1bGxlZEducyAgICAgICBpbnQ2NCAvLyBDcmVhdGVQb29sIGZlZTsgY29uc3VtZWQgb24gc3VjY2Vzcw0KfQ0KDQovLyB0cnlMaXN0T25Hbm9zd2FwIHNlZWRzIGEgR25vc3dhcCBDTCBwb29sIHdpdGggcmVtYWluaW5nIG1lbWUgdG9rZW5zICsgcmFpc2VkLXNpemVkDQovLyBXVUdOT1QgYXMgTFAuIENyZWF0ZVBvb2wgZmVlIChmaXhlZCBHTlMgYW1vdW50KSBpcyBwYWlkIGZyb206DQovLyAgMSkgcHJlLWZ1bmRlZCBHTlMgb24gcGFkIChwcmVmZXJyZWQgLSBpbW11bmUgdG8gR05PVC9HTlMgcHJpY2UgbW92ZXMpLCBlbHNlDQovLyAgMikgRXhhY3RPdXQgV1VHTk9ULT5HTlMgdXNpbmcgU1VSUExVUyBpbnZlbnRvcnkgb25seSAoYWJvdmUgcmFpc2VkKSwgc28gTFAgZGVwdGgNCi8vICAgICBzdGF5cyBlcXVhbCB0byByYWlzZWQgZXZlbiB3aGVuIEdOUyBpcyBleHBlbnNpdmUuDQovLw0KLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFNvZnQgZmFpbHVyZSBzZXRzIGwuR25vc3dhcE5vdGUgYW5kIHJldHVybnMgZmFsc2UNCi8vIChjYWxsZXIga2VlcHMgaW50ZXJuYWwgQ1BNTSkuIERvZXMgbm90IHB1bGwgZnJvbSB1c2VyIC0gc2VlIHByZXBhcmVDYWxsZXJMaXN0RnVuZGluZy4NCmZ1bmMgdHJ5TGlzdE9uR25vc3dhcChjdXIgcmVhbG0sIGwgKkxhdW5jaCwgcmFpc2VkVWdub3QsIHJlbWFpbmluZ1Rva2VucyBpbnQ2NCkgYm9vbCB7DQoJaWYgcmFpc2VkVWdub3QgPD0gMCB8fCByZW1haW5pbmdUb2tlbnMgPD0gMCB7DQoJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBlbXB0eSBjYXBpdGFsIg0KCQlyZXR1cm4gZmFsc2UNCgl9DQoJcGFkQWRkciA6PSBjdXIuQWRkcmVzcygpDQoJd0JhbCA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEFkZHIpDQoJaWYgd0JhbCA8IHJhaXNlZFVnbm90IHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IG5lZWQgV1VHTk9UIGludmVudG9yeSA+PSByYWlzZWQgZm9yIExQOyBoYXZlICIgKw0KCQkJc3RyY29udi5Gb3JtYXRJbnQod0JhbCwgMTApICsgIiBuZWVkICIgKyBzdHJjb252LkZvcm1hdEludChyYWlzZWRVZ25vdCwgMTApDQoJCXJldHVybiBmYWxzZQ0KCX0NCg0KCWZlZU5lZWQgOj0gZ25zcG9vbC5HZXRQb29sQ3JlYXRpb25GZWUoKQ0KCWlmIGZlZU5lZWQgPD0gMCB7DQoJCWZlZU5lZWQgPSAxMDBfMDAwXzAwMCAvLyAxMDAgR05TIGRlZmF1bHQgKDYgZGVjaW1hbHMpDQoJfQ0KDQoJLy8gLS0tIEdOUyBmb3IgQ3JlYXRlUG9vbCBmZWUgLS0tDQoJLy8gUmVxdWlyZSBHTlMgYWxyZWFkeSBvbiBwYWQuIERvIE5PVCBBcHByb3ZlK3JvdXRlciBFeGFjdE91dCBtaWQtbGlzdDoNCgkvLyByZWFsbSBzcGVuZGVyIGZyYW1lIG9mdGVuIHBhbmljcyAiaW5zdWZmaWNpZW50IGFsbG93YW5jZSIgYW5kIHJldmVydHMgdGhlIHR4Lg0KCS8vIFVJOiBnbnMuVHJhbnNmZXIocGFkLCBmZWVOZWVkKSB0aGVuIFJldHJ5TGlzdEdub3N3YXAuDQoJZ25zQmFsIDo9IGducy5CYWxhbmNlT2YocGFkQWRkcikNCglmZWVXdWdub3QgOj0gaW50NjQoMCkNCglpZiBnbnNCYWwgPCBmZWVOZWVkIHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IG5lZWQgIiArIHN0cmNvbnYuRm9ybWF0SW50KGZlZU5lZWQsIDEwKSArDQoJCQkiIEdOUyBiYXNlIHVuaXRzIG9uIHBhZCAoVHJhbnNmZXIgR05TIHRoZW4gUmV0cnlMaXN0KS4gaGF2ZSAiICsNCgkJCXN0cmNvbnYuRm9ybWF0SW50KGduc0JhbCwgMTApICsNCgkJCSIuIE5vIG1pZC1saXN0IFdVR05PVC0+R05TIHN3YXAgKGF2b2lkcyBhbGxvd2FuY2UgcGFuaWMpLiINCgkJcmV0dXJuIGZhbHNlDQoJfQ0KDQoJbGlxV3Vnbm90IDo9IHJhaXNlZFVnbm90DQoJaWYgd3Vnbm90LkJhbGFuY2VPZihwYWRBZGRyKSA8IGxpcVd1Z25vdCB7DQoJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBXVUdOT1QgYmVsb3cgcmFpc2VkIGFmdGVyIGZlZSBwYXRoIg0KCQlyZXR1cm4gZmFsc2UNCgl9DQoNCgkvLyBMUCB0b2tlbiBhbW91bnQ6IHByZWZlciBQb29sVG9rZW4gYWxyZWFkeSBzaXplZCBpbiBncmFkdWF0ZSgpIHRvIGN1cnZlIHNwb3QuDQoJLy8gRGVmZW5zaXZlIHJlc2l6ZSBpZiBWaXJ0dWFscyBhcmUgc29tZWhvdyBzdGlsbCBzZXQgKHByZS1ncmFkdWF0ZSB0ZXN0IHBhdGhzKToNCgkvLyAgIHRva2Vuc0ZvckxQID0gcmFpc2VkVWdub3QgKiBWaXJ0dWFsVG9rZW4gLyBWaXJ0dWFsVWdub3QNCglsaXFUb2tlbnMgOj0gcmVtYWluaW5nVG9rZW5zDQoJaWYgbC5WaXJ0dWFsVWdub3QgPiAwICYmIGwuVmlydHVhbFRva2VuID4gMCAmJiBsaXFXdWdub3QgPiAwIHsNCgkJbmVlZGVkIDo9IGxpcVd1Z25vdCAqIGwuVmlydHVhbFRva2VuIC8gbC5WaXJ0dWFsVWdub3QNCgkJaWYgbmVlZGVkID4gMCAmJiBuZWVkZWQgPCByZW1haW5pbmdUb2tlbnMgew0KCQkJbGlxVG9rZW5zID0gbmVlZGVkDQoJCX0NCgl9DQoJaWYgbGlxVG9rZW5zIDw9IDAgew0KCQlsLkdub3N3YXBOb3RlID0gImxpc3Qgc2tpcDogemVybyBMUCB0b2tlbnMgYXQgY3VydmUgc3BvdCINCgkJcmV0dXJuIGZhbHNlDQoJfQ0KDQoJLy8gTWludCBMUCBzbGljZSArIGxlZnRvdmVyIGludmVudG9yeSAoTGVmdG92ZXJUb2tlbnMgc2V0IGF0IGdyYWR1YXRlKSBvbnRvIHBhZC4NCgltaW50QW10IDo9IHJlbWFpbmluZ1Rva2Vucw0KCWlmIGwuTGVmdG92ZXJUb2tlbnMgPiAwIHsNCgkJbWludEFtdCA9IHJlbWFpbmluZ1Rva2VucyArIGwuTGVmdG92ZXJUb2tlbnMNCgl9DQoJaWYgbWludEFtdCA8IGxpcVRva2VucyB7DQoJCW1pbnRBbXQgPSBsaXFUb2tlbnMNCgl9DQoJYWRkQmFsKGwsIHBhZEFkZHIsIG1pbnRBbXQpDQoNCgl0b2tlbktleSA6PSBhZGVuYUtleUZyb21Ub2tlbklEKGwuVG9rZW5JRCwgbC5TeW1ib2wpDQoJaWYgdG9rZW5LZXkgPT0gIiIgew0KCQlsLkdub3N3YXBOb3RlID0gImxpc3Qgc2tpcDogZW1wdHkgdG9rZW4gcmVnaXN0cnkga2V5Ig0KCQlyZXR1cm4gZmFsc2UNCgl9DQoNCgkvLyBTb3J0IHRva2VuMCA8IHRva2VuMSAoR25vc3dhcCBwb29sIGtleSBvcmRlcikgQkVGT1JFIHNxcnRQcmljZSArIENyZWF0ZVBvb2wgKyBNaW50Lg0KCS8vIENyZWF0ZVBvb2wgcmVvcmRlcnMgdG9rZW5zIGFuZCBJTlZFUlRTIHNxcnRQcmljZVg5NiB3aGVuIGFyZ3MgYXJlIG91dCBvZiBvcmRlcg0KCS8vIChuZXdTcXJ0ID0gUTE5Mi9vbGRTcXJ0KS4gSWYgd2UgcGFzcyB1bnNvcnRlZCBrZXlzIHdpdGggYSBwcmljZSBhbHJlYWR5IGNvbXB1dGVkDQoJLy8gZm9yIHRoZSBzb3J0ZWQgcGFpciwgdGhlIHBvb2wgaXMgYm9ybiB3aXRoIGludmVydGVkIHByaWNlIOKGkiBNaW50IG9ubHkgdGFrZXMgYQ0KCS8vIHRpbnkgc2xpdmVyIG9mIG9uZSBzaWRlIChlLmcuIH40IEdOT1Qgb2YgYSAxMGsgV1VHTk9UIHJhaXNlKS4gQWx3YXlzIGNhbGwNCgkvLyBDcmVhdGVQb29sKHQwLCB0MSwgZmVlLCBzcXJ0KSB3aXRoIHRoZSBzYW1lIHNvcnRlZCBwYWlyIGFzIE1pbnQuDQoJdDAsIHQxIDo9IHd1Z25vdFRva2VuS2V5LCB0b2tlbktleQ0KCWFtdDAsIGFtdDEgOj0gbGlxV3Vnbm90LCBsaXFUb2tlbnMNCglpZiBzdHJpbmdzLkNvbXBhcmUodDAsIHQxKSA+IDAgew0KCQl0MCwgdDEgPSB0MSwgdDANCgkJYW10MCwgYW10MSA9IGFtdDEsIGFtdDANCgl9DQoNCglzcXJ0UHJpY2UgOj0gY29tcHV0ZVNxcnRQcmljZVg5NihhbXQwLCBhbXQxKQ0KCWlmIHNxcnRQcmljZSA9PSAiIiB8fCBzcXJ0UHJpY2UgPT0gIjAiIHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IGJhZCBzcXJ0UHJpY2VYOTYiDQoJCXJldHVybiBmYWxzZQ0KCX0NCg0KCXBvb2xBZGRyIDo9IGFkZHJlc3MoZ25vc3dhcFBvb2xBZGRyU3RyKQ0KCWducy5BcHByb3ZlKGNyb3NzKGN1ciksIHBvb2xBZGRyLCBmZWVOZWVkKQ0KCXd1Z25vdC5BcHByb3ZlKGNyb3NzKGN1ciksIHBvb2xBZGRyLCBsaXFXdWdub3QpDQoJaWYgZXJyIDo9IGwubGVkZ2VyLkFwcHJvdmUocGFkQWRkciwgcG9vbEFkZHIsIGxpcVRva2Vucyk7IGVyciAhPSBuaWwgew0KCQlsLkdub3N3YXBOb3RlID0gImxpc3Qgc2tpcDogdG9rZW4gYXBwcm92ZSBmYWlsZWQ6ICIgKyBlcnIuRXJyb3IoKQ0KCQlyZXR1cm4gZmFsc2UNCgl9DQoNCgkvLyBDUklUSUNBTDogc29ydGVkICh0MCx0MSkgKyBtYXRjaGluZyBzcXJ0UHJpY2UgKGRvIE5PVCBwYXNzIG9yaWdpbmFsIHVuc29ydGVkIGtleXMpDQoJZ25zcG9vbC5DcmVhdGVQb29sKGNyb3NzKGN1ciksIHQwLCB0MSwgR25vc3dhcEZlZVRpZXIsIHNxcnRQcmljZSkNCg0KCXRpY2tMb3dlciwgdGlja1VwcGVyIDo9IGFsaWduZWRGdWxsUmFuZ2VUaWNrcyhHbm9zd2FwVGlja1NwYWNpbmcpDQoJZGVhZGxpbmUgOj0gdGltZS5Ob3coKS5Vbml4KCkgKyA2MDANCg0KCXBvc0lELCBsaXFTdHIsIGEwLCBhMSA6PSBwb3NpdGlvbi5NaW50KA0KCQljcm9zcyhjdXIpLA0KCQl0MCwNCgkJdDEsDQoJCUdub3N3YXBGZWVUaWVyLA0KCQl0aWNrTG93ZXIsDQoJCXRpY2tVcHBlciwNCgkJc3RyY29udi5Gb3JtYXRJbnQoYW10MCwgMTApLA0KCQlzdHJjb252LkZvcm1hdEludChhbXQxLCAxMCksDQoJCSIwIiwNCgkJIjAiLA0KCQlkZWFkbGluZSwNCgkJcGFkQWRkciwgLy8gcGVybWFuZW50IGxvY2s6IHBhZCBvd25zIHBvc2l0aW9uIE5GVA0KCQkiIiwNCgkpDQoNCgkvLyBBY3R1YWwgV1VHTk9UIGRlcG9zaXRlZCAod2hpY2hldmVyIHNpZGUgaXMgV1VHTk9UIGFmdGVyIHNvcnQpDQoJdXNlZDAsIF8gOj0gc3RyY29udi5QYXJzZUludChhMCwgMTAsIDY0KQ0KCXVzZWQxLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoYTEsIDEwLCA2NCkNCgl3dWdub3RVc2VkIDo9IGludDY0KDApDQoJaWYgdDAgPT0gd3Vnbm90VG9rZW5LZXkgew0KCQl3dWdub3RVc2VkID0gdXNlZDANCgl9IGVsc2UgaWYgdDEgPT0gd3Vnbm90VG9rZW5LZXkgew0KCQl3dWdub3RVc2VkID0gdXNlZDENCgl9DQoJLy8gU2FuaXR5OiBpZiBNaW50IHRvb2sgPDwgaW50ZW5kZWQgTFAgV1VHTk9ULCBtYXJrIG5vdGUgKHN0aWxsIGxpc3RlZCDigJQgcG9vbCBleGlzdHMpDQoJaWYgd3Vnbm90VXNlZCA+IDAgJiYgbGlxV3Vnbm90ID4gMCAmJiB3dWdub3RVc2VkKjIgPCBsaXFXdWdub3Qgew0KCQkvLyBrZWVwIGdvaW5nIGJ1dCBzdXJmYWNlIHVuZGVyLWRlcG9zaXQgZm9yIG9wcw0KCQljaGFpbi5FbWl0KCJMaXN0VW5kZXJEZXBvc2l0IiwNCgkJCSJpZCIsIGwuSUQsDQoJCQkid2FudFd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGxpcVd1Z25vdCwgMTApLA0KCQkJImdvdFd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KHd1Z25vdFVzZWQsIDEwKSwNCgkJKQ0KCX0NCg0KCXBvb2xQYXRoIDo9IHQwICsgIjoiICsgdDEgKyAiOiIgKyBzdHJjb252LkZvcm1hdFVpbnQodWludDY0KEdub3N3YXBGZWVUaWVyKSwgMTApDQoJbC5Hbm9zd2FwTGlzdGVkID0gdHJ1ZQ0KCWwuR25vc3dhcFBvb2xQYXRoID0gcG9vbFBhdGgNCglsLkdub3N3YXBQb3NpdGlvbklEID0gcG9zSUQNCglsLkxpc3RWZW51ZSA9IFZlbnVlR25vc3dhcA0KCWwuRmVlV3Vnbm90U3BlbnQgPSBmZWVXdWdub3QNCglpZiB3dWdub3RVc2VkID4gMCB7DQoJCWwuTGlxV3Vnbm90VXNlZCA9IHd1Z25vdFVzZWQNCgl9IGVsc2Ugew0KCQlsLkxpcVd1Z25vdFVzZWQgPSBsaXFXdWdub3QNCgl9DQoJLy8gUmVsZWFzZSBDcmVhdGUtdGltZSBHTlMgZXNjcm93IChmZWUgbGVmdCBwYWQgdmlhIENyZWF0ZVBvb2wpLg0KCWNvbnN1bWVMaXN0RmVlRXNjcm93KGwpDQoJbGVmdG92ZXJUb2sgOj0gbC5MZWZ0b3ZlclRva2Vucw0KCWlmIGxlZnRvdmVyVG9rIDwgMCB7DQoJCWxlZnRvdmVyVG9rID0gMA0KCX0NCglpZiByZW1MZWZ0IDo9IHJlbWFpbmluZ1Rva2VucyAtIGxpcVRva2VuczsgcmVtTGVmdCA+IGxlZnRvdmVyVG9rIHsNCgkJbGVmdG92ZXJUb2sgPSByZW1MZWZ0DQoJfQ0KCWwuR25vc3dhcE5vdGUgPSAibGlzdGVkIHBvb2w9IiArIHBvb2xQYXRoICsgIiBwb3M9IiArIHN0cmNvbnYuRm9ybWF0VWludChwb3NJRCwgMTApICsNCgkJIiBsaXE9IiArIGxpcVN0ciArICIgYTA9IiArIGEwICsgIiBhMT0iICsgYTEgKw0KCQkiIHd1Z25vdFVzZWQ9IiArIHN0cmNvbnYuRm9ybWF0SW50KHd1Z25vdFVzZWQsIDEwKSArDQoJCSIgZmVlV3Vnbm90PSIgKyBzdHJjb252LkZvcm1hdEludChmZWVXdWdub3QsIDEwKSArDQoJCSIgbHBUb2tlbnM9IiArIHN0cmNvbnYuRm9ybWF0SW50KGxpcVRva2VucywgMTApICsNCgkJIiBsZWZ0b3ZlclRva2Vucz0iICsgc3RyY29udi5Gb3JtYXRJbnQobGVmdG92ZXJUb2ssIDEwKQ0KDQoJY2hhaW4uRW1pdCgiR25vc3dhcExpc3RlZCIsDQoJCSJpZCIsIGwuSUQsDQoJCSJwb29sUGF0aCIsIHBvb2xQYXRoLA0KCQkicG9zaXRpb25JZCIsIHN0cmNvbnYuRm9ybWF0VWludChwb3NJRCwgMTApLA0KCQkiZmVlV3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlV3Vnbm90LCAxMCksDQoJCSJsaXFXdWdub3QiLCBzdHJjb252LkZvcm1hdEludChsaXFXdWdub3QsIDEwKSwNCgkJInd1Z25vdFVzZWQiLCBzdHJjb252LkZvcm1hdEludCh3dWdub3RVc2VkLCAxMCksDQoJCSJscFRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KGxpcVRva2VucywgMTApLA0KCQkibGVmdG92ZXJUb2tlbnMiLCBzdHJjb252LkZvcm1hdEludChsZWZ0b3ZlclRvaywgMTApLA0KCQkidG9rZW5zIiwgc3RyY29udi5Gb3JtYXRJbnQocmVtYWluaW5nVG9rZW5zLCAxMCksDQoJKQ0KCXJldHVybiB0cnVlDQp9DQoNCi8vIHByZXBhcmVDYWxsZXJMaXN0RnVuZGluZyBmaWxscyBwYWQgaW52ZW50b3J5IHNob3J0ZmFsbCBmcm9tIHRoZSBFT0EgY2FsbGVyIHZpYSBUcmFuc2ZlckZyb20uDQovLw0KLy8gcGFkdjE0KyBXVUdOT1QgcmFpc2U6IEJ1eSBhbHJlYWR5IFRyYW5zZmVyRnJvbSBXVUdOT1QgdG8gcGFkLCBzbyB3QmFsID49IHJhaXNlZA0KLy8gYXQgZ3JhZHVhdGUgaW4gdGhlIG5vcm1hbCBjYXNlIOKAlCBvbmx5IEdOUyBmZWUgKG9yIHNtYWxsIGZlZSBXVUdOT1QgYnVkZ2V0KSBtYXkgYmUgc2hvcnQuDQovLw0KLy8gTGVnYWN5IHVnbm90LXJhaXNlIHBhZHM6IHd1Z25vdC5EZXBvc2l0IGlzIEVPQS1vbmx5OyBjYWxsZXIgd3JhcHMgdGVtcCBMUCB0aGVuIHJlaW1idXJzZWQuDQpmdW5jIHByZXBhcmVDYWxsZXJMaXN0RnVuZGluZyhjdXIgcmVhbG0sIGwgKkxhdW5jaCwgcmFpc2VkVWdub3QgaW50NjQpIGxpc3RGdW5kIHsNCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJcGFkQSA6PSBjdXIuQWRkcmVzcygpDQoJb3V0IDo9IGxpc3RGdW5ke29rOiB0cnVlLCBjYWxsZXI6IGNhbGxlcn0NCg0KCWlmIHJhaXNlZFVnbm90IDw9IDAgew0KCQlsLkdub3N3YXBOb3RlID0gImxpc3Qgc2tpcDogZW1wdHkgcmFpc2UiDQoJCW91dC5vayA9IGZhbHNlDQoJCXJldHVybiBvdXQNCgl9DQoNCglmZWVOZWVkIDo9IGduc3Bvb2wuR2V0UG9vbENyZWF0aW9uRmVlKCkNCglpZiBmZWVOZWVkIDw9IDAgew0KCQlmZWVOZWVkID0gMTAwXzAwMF8wMDANCgl9DQoNCgl3QmFsIDo9IHd1Z25vdC5CYWxhbmNlT2YocGFkQSkNCglpZiB3QmFsIDwgcmFpc2VkVWdub3Qgew0KCQlzaG9ydCA6PSByYWlzZWRVZ25vdCAtIHdCYWwNCgkJaWYgIXB1bGxXdWdub3RGcm9tKGN1ciwgY2FsbGVyLCBwYWRBLCBzaG9ydCkgew0KCQkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IG5lZWQgdGVtcCBXVUdOT1Qgd3JhcCAiICsNCgkJCQlzdHJjb252LkZvcm1hdEludChzaG9ydCwgMTApICsNCgkJCQkiIHVnbm90IHVuaXRzIChEZXBvc2l0K0FwcHJvdmUgcGFkKS4gTFAgcmVpbWJ1cnNlZCBmcm9tIHBhZCB1Z25vdCBhZnRlciBsaXN0LiAiICsNCgkJCQkiRmVlOiAiICsgc3RyY29udi5Gb3JtYXRJbnQoZmVlTmVlZCwgMTApICsgIiBHTlMgb3IgV1VHTk9UIEV4YWN0T3V0IGJ1ZGdldC4iDQoJCQlvdXQub2sgPSBmYWxzZQ0KCQkJcmV0dXJuIG91dA0KCQl9DQoJCW91dC5wdWxsZWRMcFd1Z25vdCA9IHNob3J0DQoJCXdCYWwgKz0gc2hvcnQNCgl9DQoNCglnbnNCYWwgOj0gZ25zLkJhbGFuY2VPZihwYWRBKQ0KCWlmIGduc0JhbCA8IGZlZU5lZWQgew0KCQlnU2hvcnQgOj0gZmVlTmVlZCAtIGduc0JhbA0KCQlpZiBwdWxsR25zRnJvbShjdXIsIGNhbGxlciwgcGFkQSwgZ1Nob3J0KSB7DQoJCQlvdXQucHVsbGVkR25zID0gZ1Nob3J0DQoJCX0gZWxzZSB7DQoJCQkvLyBObyBHTlMgZnJvbSBjYWxsZXIgLSBwdWxsIG1vZGVzdCBXVUdOT1Qgc3VycGx1cyBmb3IgRXhhY3RPdXQg4oaSIEdOUy4NCgkJCS8vIERvIE5PVCBwdWxsIGZ1bGwgR25vc3dhcE1heEZlZVd1Z25vdCAoNTAwMCBHTk9UKSDigJQgdGhhdCBjYXVzZXMNCgkJCS8vIEluc3VmZmljaWVudENvaW5zIGZvciBub3JtYWwgd2FsbGV0cy4gTWF4RmVlIHN0aWxsIGNhcHMgRXhhY3RPdXQgc3BlbmQuDQoJCQlzdXJwbHVzIDo9IHdCYWwgLSByYWlzZWRVZ25vdA0KCQkJaWYgc3VycGx1cyA8IDEgew0KCQkJCWZlZUJ1ZGdldCA6PSBsaXN0RmVlV3Vnbm90UHVsbCgpDQoJCQkJaWYgIXB1bGxXdWdub3RGcm9tKGN1ciwgY2FsbGVyLCBwYWRBLCBmZWVCdWRnZXQpIHsNCgkJCQkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IG5lZWQgR05TIGZlZSAiICsNCgkJCQkJCXN0cmNvbnYuRm9ybWF0SW50KGZlZU5lZWQsIDEwKSArDQoJCQkJCQkiIChBcHByb3ZlIHBhZCkgT1IgV1VHTk9UIGZlZSBidWRnZXQgIiArDQoJCQkJCQlzdHJjb252LkZvcm1hdEludChmZWVCdWRnZXQsIDEwKSArDQoJCQkJCQkiIHVnbm90IGZvciBFeGFjdE91dC4gUHJlZmVyIGhvbGRpbmcgMTAwIEdOUy4iDQoJCQkJCS8vIFJvbGwgYmFjayBMUCBwdWxsLg0KCQkJCQlpZiBvdXQucHVsbGVkTHBXdWdub3QgPiAwIHsNCgkJCQkJCXNhZmVXdWdub3RUcmFuc2ZlcihjdXIsIGNhbGxlciwgb3V0LnB1bGxlZExwV3Vnbm90KQ0KCQkJCQkJb3V0LnB1bGxlZExwV3Vnbm90ID0gMA0KCQkJCQl9DQoJCQkJCW91dC5vayA9IGZhbHNlDQoJCQkJCXJldHVybiBvdXQNCgkJCQl9DQoJCQkJb3V0LnB1bGxlZEZlZVd1Z25vdCA9IGZlZUJ1ZGdldA0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBvdXQNCn0NCg0KLy8gbGlzdEZlZVd1Z25vdFB1bGwgaXMgdGhlIFdVR05PVCBhbW91bnQgcHVsbGVkIGZyb20gdGhlIGxpc3RpbmcgY2FsbGVyIGZvcg0KLy8gRXhhY3RPdXQg4oaSIEdOUyB3aGVuIHRoZXkgZG8gbm90IGhvbGQgQ3JlYXRlUG9vbCBmZWUgaW4gR05TLg0KLy8gS2VwdCB3ZWxsIGJlbG93IEdub3N3YXBNYXhGZWVXdWdub3Qgc28gTGlzdCBkb2VzIG5vdCBkZW1hbmQgNWsrIEdOT1Qgd3JhcC4NCmZ1bmMgbGlzdEZlZVd1Z25vdFB1bGwoKSBpbnQ2NCB7DQoJY29uc3QgZGVmYXVsdFB1bGwgaW50NjQgPSAxXzUwMF8wMDBfMDAwIC8vIDE1MDAgR05PVCDigJQgZW5vdWdoIGZvciB+MTAwIEdOUyBhdCDiiaQxNSBHTk9UL0dOUw0KCWlmIEdub3N3YXBNYXhGZWVXdWdub3QgPiAwICYmIEdub3N3YXBNYXhGZWVXdWdub3QgPCBkZWZhdWx0UHVsbCB7DQoJCXJldHVybiBHbm9zd2FwTWF4RmVlV3Vnbm90DQoJfQ0KCXJldHVybiBkZWZhdWx0UHVsbA0KfQ0KDQovLyBwdWxsV3Vnbm90RnJvbSBpcyBpbnRlbnRpb25hbGx5IGEgbm8tb3AgcHVsbC4NCi8vDQovLyBHUkMyMCBUcmFuc2ZlckZyb20gZnJvbSBhIHJlYWxtIG9mdGVuIHBhbmljcyAiaW5zdWZmaWNpZW50IGFsbG93YW5jZSIgZXZlbiB3aGVuDQovLyBBbGxvd2FuY2Uob3duZXIsIHBhZCkgaXMgc2V0IChzcGVuZGVyIGZyYW1lIHJlc29sdmVzIHRvIEVPQSwgbm90IHBhZCkuIFNvZnQtZmFpbA0KLy8gaW5zdGVhZCBzbyBsaXN0IGNhbiBmYWxsIGJhY2sgdG8gbm90ZXMgLyBzdXJwbHVzIC8gcHJlLWZ1bmRlZCBwYWQgaW52ZW50b3J5Lg0KLy8NCi8vIFVJIG11c3QgcHJlLWZ1bmQgcGFkIHZpYSB3dWdub3QuVHJhbnNmZXIocGFkLCBhbW91bnQpIGFuZCBnbnMuVHJhbnNmZXIocGFkLCBmZWUpDQovLyBiZWZvcmUgUmV0cnlMaXN0R25vc3dhcCDigJQgbmV2ZXIgcmVseSBvbiBBcHByb3ZlK1RyYW5zZmVyRnJvbSBpbiB0aGUgc2FtZSBmbG93Lg0KZnVuYyBwdWxsV3Vnbm90RnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgYm9vbCB7DQoJaWYgYW1vdW50IDw9IDAgew0KCQlyZXR1cm4gdHJ1ZQ0KCX0NCgkvLyBBbHJlYWR5IG9uIHBhZD8gdHJlYXQgYXMgc2F0aXNmaWVkIHdpdGhvdXQgVHJhbnNmZXJGcm9tLg0KCWlmIHd1Z25vdC5CYWxhbmNlT2YodG8pID49IGFtb3VudCAmJiBmcm9tICE9IHRvIHsNCgkJLy8gTm90IGEgZnVsbCBjaGVjayBmb3IgInJhaXNlZCIgYWNjb3VudGluZyDigJQgcHJlcGFyZUNhbGxlckxpc3RGdW5kaW5nDQoJCS8vIGFscmVhZHkgY29tcGFyZWQgcGFkIGJhbGFuY2UgdG8gcmFpc2VkIGJlZm9yZSBjYWxsaW5nIHNob3J0ZmFsbCBwdWxscy4NCgl9DQoJXyA9IGN1cg0KCV8gPSBmcm9tDQoJXyA9IHRvDQoJcmV0dXJuIGZhbHNlDQp9DQoNCmZ1bmMgcHVsbEduc0Zyb20oY3VyIHJlYWxtLCBmcm9tLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIGJvb2wgew0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcmV0dXJuIHRydWUNCgl9DQoJXyA9IGN1cg0KCV8gPSBmcm9tDQoJXyA9IHRvDQoJLy8gTmV2ZXIgVHJhbnNmZXJGcm9tIEdOUyBlaXRoZXIgKHNhbWUgc3BlbmRlci1mcmFtZSBpc3N1ZSkuDQoJcmV0dXJuIGZhbHNlDQp9DQoNCmZ1bmMgc2FmZVd1Z25vdFRyYW5zZmVyKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7DQoJaWYgYW1vdW50IDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKGN1ci5BZGRyZXNzKCkpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCWFtb3VudCA9IGhhdmUNCgl9DQoJaWYgYW1vdW50ID4gMCB7DQoJCXd1Z25vdC5UcmFuc2Zlcihjcm9zcyhjdXIpLCB0bywgYW1vdW50KQ0KCX0NCn0NCg0KZnVuYyBzYWZlR25zVHJhbnNmZXIoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiBhbW91bnQgPD0gMCB7DQoJCXJldHVybg0KCX0NCgloYXZlIDo9IGducy5CYWxhbmNlT2YoY3VyLkFkZHJlc3MoKSkNCglpZiBoYXZlIDwgYW1vdW50IHsNCgkJYW1vdW50ID0gaGF2ZQ0KCX0NCglpZiBhbW91bnQgPiAwIHsNCgkJZ25zLlRyYW5zZmVyKGNyb3NzKGN1ciksIHRvLCBhbW91bnQpDQoJfQ0KfQ0KDQpmdW5jIHJlZnVuZENhbGxlckxpc3RGdW5kaW5nKGN1ciByZWFsbSwgZnVuZCBsaXN0RnVuZCkgew0KCWlmICFmdW5kLmNhbGxlci5Jc1ZhbGlkKCkgew0KCQlyZXR1cm4NCgl9DQoJc2FmZVd1Z25vdFRyYW5zZmVyKGN1ciwgZnVuZC5jYWxsZXIsIGZ1bmQucHVsbGVkTHBXdWdub3QrZnVuZC5wdWxsZWRGZWVXdWdub3QpDQoJc2FmZUduc1RyYW5zZmVyKGN1ciwgZnVuZC5jYWxsZXIsIGZ1bmQucHVsbGVkR25zKQ0KfQ0KDQovLyBzZXR0bGVDYWxsZXJMaXN0RnVuZGluZyByZXR1cm5zIHVudXNlZCBmZWUtYnVkZ2V0IFdVR05PVCB0byB0aGUgY2FsbGVyLg0KLy8gTFAgc2hvcnRmYWxsIHB1bGwgaXMgcmFyZSBvbiBXVUdOT1QtcmFpc2UgcGFkcyAocmFpc2VkIGFscmVhZHkgb24gcGFkKTsgaWYgaXQNCi8vIGhhcHBlbmVkLCByZWltYnVyc2UgaW4gV1VHTk9UIGZyb20gYW55IGxlZnRvdmVyIHBhZCBiYWxhbmNlIGFmdGVyIGxpc3QuDQpmdW5jIHNldHRsZUNhbGxlckxpc3RGdW5kaW5nKGN1ciByZWFsbSwgZnVuZCBsaXN0RnVuZCkgew0KCWlmICFmdW5kLmNhbGxlci5Jc1ZhbGlkKCkgew0KCQlyZXR1cm4NCgl9DQoJaWYgZnVuZC5wdWxsZWRMcFd1Z25vdCA+IDAgew0KCQlzYWZlV3Vnbm90VHJhbnNmZXIoY3VyLCBmdW5kLmNhbGxlciwgZnVuZC5wdWxsZWRMcFd1Z25vdCkNCgl9DQoJLy8gTGVmdG92ZXIgZmVlLWJ1ZGdldCBXVUdOT1QgKEV4YWN0T3V0IG1heSBub3QgY29uc3VtZSBmdWxsIG1heEluKS4NCglpZiBmdW5kLnB1bGxlZEZlZVd1Z25vdCA+IDAgew0KCQlzYWZlV3Vnbm90VHJhbnNmZXIoY3VyLCBmdW5kLmNhbGxlciwgZnVuZC5wdWxsZWRGZWVXdWdub3QpDQoJfQ0KfQ0KDQovLyBsaXN0T25Hbm9zd2FwV2l0aEZ1bmRpbmcgaXMgdGhlIGZ1bGwgYXV0byBwYXRoOiBwdWxsIGludmVudG9yeSBmcm9tIGNhbGxlciBpZiBuZWVkZWQsDQovLyBDcmVhdGVQb29sK01pbnQsIHJlaW1idXJzZSBMUCB1Z25vdCAvIHJlZnVuZCBvbiBmYWlsdXJlLg0KZnVuYyBsaXN0T25Hbm9zd2FwV2l0aEZ1bmRpbmcoY3VyIHJlYWxtLCBsICpMYXVuY2gsIHJhaXNlZFVnbm90LCByZW1haW5pbmdUb2tlbnMgaW50NjQpIGJvb2wgew0KCWZ1bmQgOj0gcHJlcGFyZUNhbGxlckxpc3RGdW5kaW5nKGN1ciwgbCwgcmFpc2VkVWdub3QpDQoJaWYgIWZ1bmQub2sgew0KCQlyZXR1cm4gZmFsc2UNCgl9DQoJb2sgOj0gdHJ5TGlzdE9uR25vc3dhcChjdXIsIGwsIHJhaXNlZFVnbm90LCByZW1haW5pbmdUb2tlbnMpDQoJaWYgb2sgew0KCQlzZXR0bGVDYWxsZXJMaXN0RnVuZGluZyhjdXIsIGZ1bmQpDQoJCWlmIGZ1bmQucHVsbGVkTHBXdWdub3QgPiAwIHx8IGZ1bmQucHVsbGVkRmVlV3Vnbm90ID4gMCB8fCBmdW5kLnB1bGxlZEducyA+IDAgew0KCQkJY2hhaW4uRW1pdCgiTGlzdEZ1bmRpbmciLA0KCQkJCSJpZCIsIGwuSUQsDQoJCQkJImNhbGxlciIsIGZ1bmQuY2FsbGVyLlN0cmluZygpLA0KCQkJCSJscFd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZ1bmQucHVsbGVkTHBXdWdub3QsIDEwKSwNCgkJCQkiZmVlV3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZnVuZC5wdWxsZWRGZWVXdWdub3QsIDEwKSwNCgkJCQkiZ25zIiwgc3RyY29udi5Gb3JtYXRJbnQoZnVuZC5wdWxsZWRHbnMsIDEwKSwNCgkJCSkNCgkJfQ0KCQlyZXR1cm4gdHJ1ZQ0KCX0NCglyZWZ1bmRDYWxsZXJMaXN0RnVuZGluZyhjdXIsIGZ1bmQpDQoJcmV0dXJuIGZhbHNlDQp9DQoNCi8vIGxpc3ROZWVkT2Y6IHBvb2xVfHdIYXZlfHdOZWVkTHB8Z25zSGF2ZXxnbnNOZWVkfGZlZUduc3xmZWVXdWdub3RCdWRnZXR8cGFkQWRkcg0KZnVuYyBsaXN0TmVlZE9mKGwgKkxhdW5jaCkgc3RyaW5nIHsNCglwb29sVSA6PSBpbnQ2NCgwKQ0KCWlmIGwgIT0gbmlsICYmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCAmJiAhbC5Hbm9zd2FwTGlzdGVkIHsNCgkJcG9vbFUgPSBsLlBvb2xVZ25vdA0KCX0NCglwYWRBIDo9IHBhZEFkZHINCgl3SGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEEpDQoJZ25zSGF2ZSA6PSBnbnMuQmFsYW5jZU9mKHBhZEEpDQoJZmVlR25zIDo9IGduc3Bvb2wuR2V0UG9vbENyZWF0aW9uRmVlKCkNCglpZiBmZWVHbnMgPD0gMCB7DQoJCWZlZUducyA9IDEwMF8wMDBfMDAwDQoJfQ0KCXdOZWVkIDo9IHBvb2xVIC0gd0hhdmUNCglpZiB3TmVlZCA8IDAgew0KCQl3TmVlZCA9IDANCgl9DQoJZ05lZWQgOj0gZmVlR25zIC0gZ25zSGF2ZQ0KCWlmIGdOZWVkIDwgMCB7DQoJCWdOZWVkID0gMA0KCX0NCglmZWVCdWQgOj0gbGlzdEZlZVd1Z25vdFB1bGwoKQ0KCS8vIElmIEdOUyBhbHJlYWR5IGNvdmVyZWQsIGZlZSBXVUdOT1QgYnVkZ2V0IG5lZWQgaXMgMCBmb3IgdGhlIHdpemFyZC4NCglpZiBnTmVlZCA9PSAwIHsNCgkJZmVlQnVkID0gMA0KCX0gZWxzZSBpZiB3SGF2ZSA+IHBvb2xVIHsNCgkJLy8gRXhpc3Rpbmcgc3VycGx1cyByZWR1Y2VzIGZlZSBidWRnZXQgdG8gcHVsbA0KCQlzdXJwIDo9IHdIYXZlIC0gcG9vbFUNCgkJaWYgc3VycCA+PSBmZWVCdWQgew0KCQkJZmVlQnVkID0gMA0KCQl9IGVsc2Ugew0KCQkJZmVlQnVkID0gZmVlQnVkIC0gc3VycA0KCQl9DQoJfQ0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQod0hhdmUsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHdOZWVkLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChnbnNIYXZlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChnTmVlZCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQoZmVlR25zLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChmZWVCdWQsIDEwKSArICJ8IiArDQoJCXBhZEEuU3RyaW5nKCkNCn0NCg0KLy8gTGlzdE5lZWQgaXMgdGhlIHB1YmxpYyBxdWVyeSBmb3IgdGhlIFRva2VuIGxpc3Qgd2l6YXJkIChkZWZhdWx0IHZlbnVlKS4NCmZ1bmMgTGlzdE5lZWQoaWQgc3RyaW5nKSBzdHJpbmcgew0KCXJldHVybiBsaXN0TmVlZE9mKG11c3RMYXVuY2goaWQpKQ0KfQ0KDQovLyBMaXN0TmVlZEZvciBpcyB2ZW51ZS1hd2FyZTsgb25seSBnbm9zd2FwIGhhcyBhIE5lZWQgYWRhcHRlciB0b2RheS4NCmZ1bmMgTGlzdE5lZWRGb3IoaWQsIHZlbnVlSWQgc3RyaW5nKSBzdHJpbmcgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCgl2aWQgOj0gbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkKQ0KCWlmIHZpZCAhPSBWZW51ZUdub3N3YXAgew0KCQlwb29sVSA6PSBpbnQ2NCgwKQ0KCQlpZiBsICE9IG5pbCAmJiBsLlN0YXR1cyA9PSBTdGF0dXNHcmFkdWF0ZWQgJiYgIWwuR25vc3dhcExpc3RlZCB7DQoJCQlwb29sVSA9IGwuUG9vbFVnbm90DQoJCX0NCgkJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KHBvb2xVLCAxMCkgKyAifDB8MHwwfDB8MHwwfCIgKyBwYWRBZGRyLlN0cmluZygpDQoJfQ0KCXJldHVybiBsaXN0TmVlZE9mKGwpDQp9DQoNCi8vIExpc3RlZE9mIHJlcG9ydHMgd2hldGhlciB0aGUgbGF1bmNoIGlzIGxpc3RlZCBvbiBhbnkgdmVudWUuDQpmdW5jIExpc3RlZE9mKGlkIHN0cmluZykgYm9vbCB7DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCXJldHVybiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiINCn0NCg0KLy8gTGlzdFBvb2xQYXRoT2YgcmV0dXJucyB0aGUgcG9vbCBwYXRoIGFmdGVyIGxpc3RpbmcuDQpmdW5jIExpc3RQb29sUGF0aE9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuR25vc3dhcFBvb2xQYXRoDQp9DQoNCi8vIExpc3ROb3RlT2YgcmV0dXJucyB0aGUgbGlzdGluZyBzdGF0dXMgbm90ZS4NCmZ1bmMgTGlzdE5vdGVPZihpZCBzdHJpbmcpIHN0cmluZyB7DQoJcmV0dXJuIG11c3RMYXVuY2goaWQpLkdub3N3YXBOb3RlDQp9DQoNCmZ1bmMgc3dhcFd1Z25vdEZvckdOUyhjdXIgcmVhbG0sIGFtb3VudE91dEdOUywgbWF4SW5XdWdub3QgaW50NjQpIChzcGVudCBpbnQ2NCwgb2sgYm9vbCkgew0KCWlmIGFtb3VudE91dEdOUyA8PSAwIHx8IG1heEluV3Vnbm90IDw9IDAgew0KCQlyZXR1cm4gMCwgZmFsc2UNCgl9DQoJcm91dGVyQWRkciA6PSBhZGRyZXNzKGdub3N3YXBSb3V0ZXJBZGRyU3RyKQ0KCWJlZm9yZSA6PSB3dWdub3QuQmFsYW5jZU9mKGN1ci5BZGRyZXNzKCkpDQoJaWYgYmVmb3JlIDwgbWF4SW5XdWdub3Qgew0KCQltYXhJbld1Z25vdCA9IGJlZm9yZQ0KCX0NCglpZiBtYXhJbld1Z25vdCA8PSAwIHsNCgkJcmV0dXJuIDAsIGZhbHNlDQoJfQ0KCXd1Z25vdC5BcHByb3ZlKGNyb3NzKGN1ciksIHJvdXRlckFkZHIsIG1heEluV3Vnbm90KQ0KDQoJcm91dGUgOj0gd3Vnbm90VG9rZW5LZXkgKyAiOiIgKyBnbnNUb2tlbktleSArICI6IiArIHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQoR25vc3dhcEZlZVRpZXIpLCAxMCkNCglkZWFkbGluZSA6PSB0aW1lLk5vdygpLlVuaXgoKSArIDYwMA0KCWluU3RyLCBvdXRTdHIgOj0gcm91dGVyLkV4YWN0T3V0U3dhcFJvdXRlKA0KCQljcm9zcyhjdXIpLA0KCQl3dWdub3RUb2tlbktleSwNCgkJZ25zVG9rZW5LZXksDQoJCXN0cmNvbnYuRm9ybWF0SW50KGFtb3VudE91dEdOUywgMTApLA0KCQlyb3V0ZSwNCgkJIjEwMCIsDQoJCXN0cmNvbnYuRm9ybWF0SW50KG1heEluV3Vnbm90LCAxMCksDQoJCWRlYWRsaW5lLA0KCQkiIiwNCgkpDQoJXyA9IG91dFN0cg0KCXNwZW50SW4sIGVyciA6PSBzdHJjb252LlBhcnNlSW50KGluU3RyLCAxMCwgNjQpDQoJaWYgZXJyICE9IG5pbCB8fCBzcGVudEluIDw9IDAgew0KCQlhZnRlciA6PSB3dWdub3QuQmFsYW5jZU9mKGN1ci5BZGRyZXNzKCkpDQoJCWlmIGFmdGVyID49IGJlZm9yZSB7DQoJCQlyZXR1cm4gMCwgZmFsc2UNCgkJfQ0KCQlyZXR1cm4gYmVmb3JlIC0gYWZ0ZXIsIHRydWUNCgl9DQoJcmV0dXJuIHNwZW50SW4sIHRydWUNCn0NCg0KZnVuYyBjb21wdXRlU3FydFByaWNlWDk2KGFtb3VudDAsIGFtb3VudDEgaW50NjQpIHN0cmluZyB7DQoJaWYgYW1vdW50MCA8PSAwIHx8IGFtb3VudDEgPD0gMCB7DQoJCXJldHVybiAiIg0KCX0NCglhMCA6PSB1MjU2Lk11c3RGcm9tRGVjaW1hbChzdHJjb252LkZvcm1hdEludChhbW91bnQwLCAxMCkpDQoJYTEgOj0gdTI1Ni5NdXN0RnJvbURlY2ltYWwoc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50MSwgMTApKQ0KCW51bSA6PSB1MjU2Llplcm8oKS5NdWwoYTEsIGNvbnN0cy5RMTkyKCkpDQoJcmF0aW8gOj0gdTI1Ni5aZXJvKCkuRGl2KG51bSwgYTApDQoJc3FydCA6PSB1MjU2U3FydChyYXRpbykNCglpZiBzcXJ0Lkx0KGNvbnN0cy5NaW5TcXJ0UmF0aW8oKSkgew0KCQlyZXR1cm4gY29uc3RzLk1pblNxcnRSYXRpbygpLlRvU3RyaW5nKCkNCgl9DQoJaWYgc3FydC5HdGUoY29uc3RzLk1heFNxcnRSYXRpbygpKSB7DQoJCXJldHVybiB1MjU2Llplcm8oKS5TdWIoY29uc3RzLk1heFNxcnRSYXRpbygpLCB1MjU2Lk9uZSgpKS5Ub1N0cmluZygpDQoJfQ0KCXJldHVybiBzcXJ0LlRvU3RyaW5nKCkNCn0NCg0KZnVuYyB1MjU2U3FydCh4ICp1MjU2LlVpbnQpICp1MjU2LlVpbnQgew0KCWlmIHggPT0gbmlsIHx8IHguSXNaZXJvKCkgew0KCQlyZXR1cm4gdTI1Ni5aZXJvKCkNCgl9DQoJaWYgeC5FcSh1MjU2Lk9uZSgpKSB7DQoJCXJldHVybiB1MjU2Lk9uZSgpDQoJfQ0KCWxvIDo9IHUyNTYuWmVybygpDQoJaGkgOj0gdTI1Ni5aZXJvKCkuQWRkKHgsIHUyNTYuT25lKCkpDQoJY2FwMTI4IDo9IHUyNTYuWmVybygpLkxzaCh1MjU2Lk9uZSgpLCAxMjgpDQoJaWYgaGkuR3QoY2FwMTI4KSB7DQoJCWhpID0gY2FwMTI4LkNsb25lKCkNCgl9DQoJZm9yIGxvLkx0KHUyNTYuWmVybygpLlN1YihoaSwgdTI1Ni5PbmUoKSkpIHsNCgkJbWlkIDo9IHUyNTYuWmVybygpLkRpdih1MjU2Llplcm8oKS5BZGQobG8sIGhpKSwgdTI1Ni5OZXdVaW50KDIpKQ0KCQlpZiBtaWQuSXNaZXJvKCkgew0KCQkJbG8gPSB1MjU2Lk9uZSgpDQoJCQljb250aW51ZQ0KCQl9DQoJCXNxLCBvdmVyZmxvdyA6PSB1MjU2Llplcm8oKS5NdWxPdmVyZmxvdyhtaWQsIG1pZCkNCgkJaWYgb3ZlcmZsb3cgfHwgc3EuR3QoeCkgew0KCQkJaGkgPSBtaWQNCgkJfSBlbHNlIHsNCgkJCWxvID0gbWlkDQoJCX0NCgl9DQoJcmV0dXJuIGxvDQp9DQoNCmZ1bmMgYWxpZ25lZEZ1bGxSYW5nZVRpY2tzKHNwYWNpbmcgaW50MzIpIChpbnQzMiwgaW50MzIpIHsNCglpZiBzcGFjaW5nIDw9IDAgew0KCQlzcGFjaW5nID0gNjANCgl9DQoJdGwgOj0gKEdub3N3YXBNaW5UaWNrIC8gc3BhY2luZykgKiBzcGFjaW5nDQoJdHUgOj0gKEdub3N3YXBNYXhUaWNrIC8gc3BhY2luZykgKiBzcGFjaW5nDQoJaWYgdGwgPj0gdHUgew0KCQl0bCA9IC1zcGFjaW5nDQoJCXR1ID0gc3BhY2luZw0KCX0NCglyZXR1cm4gdGwsIHR1DQp9DQoNCi8vIEdub3N3YXBMaXN0ZWRPZiByZXBvcnRzIHdoZXRoZXIgYSBsYXVuY2ggd2FzIGF1dG8tbGlzdGVkIG9uIEdub3N3YXAuDQpmdW5jIEdub3N3YXBMaXN0ZWRPZihpZCBzdHJpbmcpIGJvb2wgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5Hbm9zd2FwTGlzdGVkDQp9DQoNCi8vIEdub3N3YXBQb29sUGF0aE9mIHJldHVybnMgdGhlIEdub3N3YXAgcG9vbCBwYXRoIGFmdGVyIGxpc3RpbmcgKG9yIGVtcHR5KS4NCmZ1bmMgR25vc3dhcFBvb2xQYXRoT2YoaWQgc3RyaW5nKSBzdHJpbmcgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5Hbm9zd2FwUG9vbFBhdGgNCn0NCg0KLy8gR25vc3dhcE5vdGVPZiByZXR1cm5zIHRoZSBsaXN0aW5nIHN0YXR1cyBub3RlLg0KZnVuYyBHbm9zd2FwTm90ZU9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuR25vc3dhcE5vdGUNCn0NChqNJwoObGlzdF92ZW51ZS5nbm8S+iZwYWNrYWdlIHBhZHYyCgppbXBvcnQgKAoJImNoYWluIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIExpc3RWZW51ZSBJRHMgKGNvbXBpbGUtdGltZSBzd2l0Y2ggaW4gdHJ5TGlzdFZlbnVlKS4gQWRkaW5nIGEgbmV3IERFWAovLyBtZWFucyBhIG5ldyBjYXNlICsgYWRhcHRlciBmaWxlIGFuZCBhIG5ldyBwYWQgdmVyc2lvbiDigJQgR25vIGNhbm5vdAovLyBkeW5hbWljYWxseSBpbXBvcnQgYnkgcGF0aCBzdHJpbmcuCmNvbnN0ICgKCVZlbnVlR25vc3dhcCA9ICJnbm9zd2FwIgoJVmVudWVaZGV4ICAgID0gInpkZXgiCikKCi8vIGxpc3RWZW51ZU1ldGEgaXMgcmVnaXN0cnkgbWV0YWRhdGEgKG5vdCBhIGNhbGxhYmxlIGFkYXB0ZXIpLgp0eXBlIGxpc3RWZW51ZU1ldGEgc3RydWN0IHsKCUlEICAgICAgICAgICBzdHJpbmcKCUxhYmVsICAgICAgICBzdHJpbmcKCUVuYWJsZWQgICAgICBib29sCglGZWVBc3NldEhpbnQgc3RyaW5nIC8vIGUuZy4gIkdOUyIgZm9yIENyZWF0ZVBvb2wgZmVlIFVYCn0KCnZhciAoCglsaXN0VmVudWVzICAgICAgIGF2bC5UcmVlIC8vIGlkIC0+ICpsaXN0VmVudWVNZXRhCglkZWZhdWx0TGlzdFZlbnVlIHN0cmluZwopCgpmdW5jIGVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKSB7CglpZiBsaXN0VmVudWVzLlNpemUoKSA+IDAgewoJCXJldHVybgoJfQoJLy8gTWFpbm5ldC1maXJzdDogemRleCBkZWZhdWx0IChodWIgbGlzdGFibGUgd2hlbiBhZGFwdGVyICsgcmVhbG0gbGl2ZSkuCgkvLyBHbm9zd2FwIHJlZ2lzdGVyZWQgYnV0IGRpc2FibGVkIHVudGlsIG1haW5uZXQgcm91dGVyL3Bvb2wgZXhpc3Qg4oCUIGVuYWJsZSB2aWEgU2V0TGlzdFZlbnVlLgoJcmVnaXN0ZXJMaXN0VmVudWUoVmVudWVaZGV4LCAiemRleCIsIHRydWUsICJ1Z25vdCIpCglyZWdpc3Rlckxpc3RWZW51ZShWZW51ZUdub3N3YXAsICJHbm9zd2FwIiwgZmFsc2UsICJHTlMiKQoJaWYgZGVmYXVsdExpc3RWZW51ZSA9PSAiIiB7CgkJZGVmYXVsdExpc3RWZW51ZSA9IFZlbnVlWmRleAoJfQp9CgpmdW5jIHJlZ2lzdGVyTGlzdFZlbnVlKGlkLCBsYWJlbCBzdHJpbmcsIGVuYWJsZWQgYm9vbCwgZmVlSGludCBzdHJpbmcpIHsKCWlkID0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5Ub0xvd2VyKGlkKSkKCWlmIGlkID09ICIiIHsKCQlyZXR1cm4KCX0KCWxhYmVsID0gc3RyaW5ncy5UcmltU3BhY2UobGFiZWwpCglpZiBsYWJlbCA9PSAiIiB7CgkJbGFiZWwgPSBpZAoJfQoJbGlzdFZlbnVlcy5TZXQoaWQsICZsaXN0VmVudWVNZXRhewoJCUlEOiAgICAgICAgICAgaWQsCgkJTGFiZWw6ICAgICAgICBsYWJlbCwKCQlFbmFibGVkOiAgICAgIGVuYWJsZWQsCgkJRmVlQXNzZXRIaW50OiBzdHJpbmdzLlRyaW1TcGFjZShmZWVIaW50KSwKCX0pCn0KCmZ1bmMgbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkIHN0cmluZykgc3RyaW5nIHsKCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQoJdiA6PSBzdHJpbmdzLlRyaW1TcGFjZShzdHJpbmdzLlRvTG93ZXIodmVudWVJZCkpCglpZiB2ID09ICIiIHsKCQlpZiBkZWZhdWx0TGlzdFZlbnVlICE9ICIiIHsKCQkJcmV0dXJuIGRlZmF1bHRMaXN0VmVudWUKCQl9CgkJcmV0dXJuIFZlbnVlWmRleAoJfQoJcmV0dXJuIHYKfQoKZnVuYyB2ZW51ZUVuYWJsZWQodmVudWVJZCBzdHJpbmcpIGJvb2wgewoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpCglpZCA6PSBub3JtYWxpemVWZW51ZUlEKHZlbnVlSWQpCglyYXcgOj0gbGlzdFZlbnVlcy5HZXQoaWQpCglpZiByYXcgPT0gbmlsIHsKCQlyZXR1cm4gZmFsc2UKCX0KCW0sIG9rIDo9IHJhdy4oKmxpc3RWZW51ZU1ldGEpCglyZXR1cm4gb2sgJiYgbSAhPSBuaWwgJiYgbS5FbmFibGVkCn0KCi8vIERlZmF1bHRMaXN0VmVudWUgcmV0dXJucyB0aGUgdmVudWUgaWQgdXNlZCB3aGVuIGNhbGxlcnMgcGFzcyAiIi4KZnVuYyBEZWZhdWx0TGlzdFZlbnVlKCkgc3RyaW5nIHsKCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQoJaWYgZGVmYXVsdExpc3RWZW51ZSA9PSAiIiB7CgkJcmV0dXJuIFZlbnVlWmRleAoJfQoJcmV0dXJuIGRlZmF1bHRMaXN0VmVudWUKfQoKLy8gU2V0RGVmYXVsdExpc3RWZW51ZSBzZXRzIHRoZSBkZWZhdWx0IGxpc3QgdmVudWUgKHByb3RvY29sIG9ubHkpLgpmdW5jIFNldERlZmF1bHRMaXN0VmVudWUoY3VyIHJlYWxtLCB2ZW51ZUlkIHN0cmluZykgewoJcmVxdWlyZVByb3RvY29sKGN1cikKCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQoJaWQgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5Ub0xvd2VyKHZlbnVlSWQpKQoJaWYgaWQgPT0gIiIgewoJCXBhbmljKCJwYWQ6IGVtcHR5IHZlbnVlIikKCX0KCWlmIGxpc3RWZW51ZXMuR2V0KGlkKSA9PSBuaWwgewoJCXBhbmljKCJwYWQ6IHVua25vd24gdmVudWUiKQoJfQoJZGVmYXVsdExpc3RWZW51ZSA9IGlkCgljaGFpbi5FbWl0KCJTZXREZWZhdWx0TGlzdFZlbnVlIiwgInZlbnVlIiwgaWQpCn0KCi8vIFNldExpc3RWZW51ZSByZWdpc3RlcnMgb3IgdXBkYXRlcyB2ZW51ZSBtZXRhZGF0YSAocHJvdG9jb2wgb25seSkuCi8vIERvZXMgbm90IGFkZCBjb21waWxlLXRpbWUgZGlzcGF0Y2gg4oCUIHVua25vd24gaWRzIHN0YXkgbm9uLWxpc3RhYmxlIHVudGlsCi8vIHRyeUxpc3RWZW51ZSBnYWlucyBhIGNhc2UgaW4gYSBmdXR1cmUgcGFkIHZlcnNpb24uCmZ1bmMgU2V0TGlzdFZlbnVlKGN1ciByZWFsbSwgaWQsIGxhYmVsIHN0cmluZywgZW5hYmxlZCBib29sLCBmZWVBc3NldEhpbnQgc3RyaW5nKSB7CglyZXF1aXJlUHJvdG9jb2woY3VyKQoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpCglpZCA9IHN0cmluZ3MuVHJpbVNwYWNlKHN0cmluZ3MuVG9Mb3dlcihpZCkpCglpZiBpZCA9PSAiIiB8fCBsZW4oaWQpID4gMzIgewoJCXBhbmljKCJwYWQ6IGludmFsaWQgdmVudWUgaWQiKQoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgaWQgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nKSB7CgkJCXBhbmljKCJwYWQ6IHZlbnVlIGlkIGNoYXJzZXQiKQoJCX0KCX0KCXJlZ2lzdGVyTGlzdFZlbnVlKGlkLCBsYWJlbCwgZW5hYmxlZCwgZmVlQXNzZXRIaW50KQoJY2hhaW4uRW1pdCgiU2V0TGlzdFZlbnVlIiwKCQkiaWQiLCBpZCwKCQkibGFiZWwiLCBzdHJpbmdzLlRyaW1TcGFjZShsYWJlbCksCgkJImVuYWJsZWQiLCBzdHJjb252LkZvcm1hdEJvb2woZW5hYmxlZCksCgkJImZlZUhpbnQiLCBzdHJpbmdzLlRyaW1TcGFjZShmZWVBc3NldEhpbnQpLAoJKQp9CgovLyBMaXN0VmVudWVzIHJldHVybnMgbmV3bGluZS1zZXBhcmF0ZWQgImlkfGxhYmVsfGVuYWJsZWR8ZmVlSGludCIgKGVuYWJsZWQgMHwxKS4KZnVuYyBMaXN0VmVudWVzKCkgc3RyaW5nIHsKCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQoJb3V0IDo9ICIiCglsaXN0VmVudWVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJbSwgb2sgOj0gdmFsdWUuKCpsaXN0VmVudWVNZXRhKQoJCWlmICFvayB8fCBtID09IG5pbCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQllbiA6PSAiMCIKCQlpZiBtLkVuYWJsZWQgewoJCQllbiA9ICIxIgoJCX0KCQlsaW5lIDo9IG0uSUQgKyAifCIgKyBtLkxhYmVsICsgInwiICsgZW4gKyAifCIgKyBtLkZlZUFzc2V0SGludAoJCWlmIG91dCAhPSAiIiB7CgkJCW91dCArPSAiXG4iCgkJfQoJCW91dCArPSBsaW5lCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgovLyBMaXN0VmVudWVPZiByZXR1cm5zIHRoZSB2ZW51ZSBpZCB1c2VkIGZvciBhIHN1Y2Nlc3NmdWwgbGlzdCAob3IgIiIpLgpmdW5jIExpc3RWZW51ZU9mKGlkIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBtdXN0TGF1bmNoKGlkKS5MaXN0VmVudWUKfQoKLy8gcmVzZXRMaXN0VmVudWVzRm9yVGVzdCBjbGVhcnMgdmVudWUgcmVnaXN0cnkgKHVuaXQgdGVzdHMpLgpmdW5jIHJlc2V0TGlzdFZlbnVlc0ZvclRlc3QoKSB7CglsaXN0VmVudWVzID0gYXZsLlRyZWV7fQoJZGVmYXVsdExpc3RWZW51ZSA9ICIiCn0KCi8vIHRyeUxpc3RWZW51ZSBkaXNwYXRjaGVzIHRvIGEgY29tcGlsZS10aW1lIGFkYXB0ZXIuIFVua25vd24gLyBkaXNhYmxlZAovLyB2ZW51ZXMgc29mdC1mYWlsIHdpdGggYSBub3RlIChubyBwYW5pYykgc28gVUkgY2FuIHNob3cgTGlzdE5lZWQgZ3VpZGFuY2UuCmZ1bmMgdHJ5TGlzdFZlbnVlKGN1ciByZWFsbSwgbCAqTGF1bmNoLCB2ZW51ZUlkIHN0cmluZywgcmFpc2VkVWdub3QsIGxpcVRva2VucyBpbnQ2NCkgYm9vbCB7CgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkKCWlkIDo9IG5vcm1hbGl6ZVZlbnVlSUQodmVudWVJZCkKCWlmICF2ZW51ZUVuYWJsZWQoaWQpIHsKCQlpZiBsICE9IG5pbCB7CgkJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiB2ZW51ZSBkaXNhYmxlZCBvciB1bmtub3duOiAiICsgaWQKCQl9CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggaWQgewoJY2FzZSBWZW51ZVpkZXg6CgkJb2sgOj0gdHJ5TGlzdE9uWmRleChjdXIsIGwsIHJhaXNlZFVnbm90LCBsaXFUb2tlbnMpCgkJaWYgb2sgJiYgbCAhPSBuaWwgewoJCQlsLkxpc3RWZW51ZSA9IFZlbnVlWmRleAoJCX0KCQlyZXR1cm4gb2sKCWNhc2UgVmVudWVHbm9zd2FwOgoJCW9rIDo9IGxpc3RPbkdub3N3YXBXaXRoRnVuZGluZyhjdXIsIGwsIHJhaXNlZFVnbm90LCBsaXFUb2tlbnMpCgkJaWYgb2sgJiYgbCAhPSBuaWwgewoJCQlsLkxpc3RWZW51ZSA9IFZlbnVlR25vc3dhcAoJCX0KCQlyZXR1cm4gb2sKCWRlZmF1bHQ6CgkJLy8gUmVnaXN0ZXJlZCBpbiBtZXRhZGF0YSBidXQgbm8gYWRhcHRlciBjYXNlIHlldC4KCQlpZiBsICE9IG5pbCB7CgkJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiB2ZW51ZSBhZGFwdGVyIG5vdCBsaW5rZWQgaW4gdGhpcyBwYWQ6ICIgKyBpZAoJCX0KCQlyZXR1cm4gZmFsc2UKCX0KfQoahYkECgttZW1lcGFkLmdubxL0iAQvLyBQYWNrYWdlIHBhZCBpcyBnbm9tZW1lcGFkOiBhIHNlbGYtY29udGFpbmVkIG1lbWUgbGF1bmNocGFkIGZvciBnbm8ubGFuZC4NCi8vDQovLwlDcmVhdGVXaXRoVmVudWUgKGJvbmQgKyB2ZW51ZS1hd2FyZSBHTlMgZXNjcm93KSAtPiBHUkMyMCArIFdVR05PVCBjdXJ2ZSAtPiBHcmFkdWF0ZQ0KLy8JICAtPiBpbnRlcm5hbCBDUE1NOyB0aGVuIGVpdGhlcjoNCi8vCSAgICAgZ25vc3dhcDogUmV0cnlMaXN0IC8gUmV0cnlMaXN0R25vc3dhcCAoZXNjcm93ZWQgR05TICsgV1VHTk9UIGludmVudG9yeSkNCi8vCSAgICAgemRleDogICAgUmVsZWFzZUxpc3RTZWVkIC0+IEVPQSBDcmVhdGVQb29sIC0+IENvbmZpcm1aZGV4TGlzdA0KLy8NCi8vIFByb2R1Y3Rpb246IEJ1eS9TZWxsL1N3YXAqIHVzZSBXVUdOT1QgKHB1c2gtcGF5ICsgcHJlcGFpZCBjcmVkaXRzKS4NCi8vIFBheW1lbnQ6IHVzZXIgd3Vnbm90LlRyYW5zZmVyKHBhZCwgYW1vdW50KSB0aGVuIEJ1eS4NCi8vIENyZWF0ZSBmZWU6IGdub3N3YXAgcHJlZmVyZW5jZSBsb2NrcyBMaXN0RmVlR25zOyB6ZGV4IHByZWZlcmVuY2UgbG9ja3MgMC4NCi8vIERlZmF1bHRMaXN0VmVudWUgc291cmNlID0gemRleDsgUGVhcmwgbWF5IFNldERlZmF1bHRMaXN0VmVudWUoZ25vc3dhcCkgYWZ0ZXIgZGVwbG95Lg0KLy8gVW5pdCB0ZXN0cyAodGVzdFNraXBCYW5rZXIpOiBPcmlnaW5TZW5kIHVnbm90IGFzIGNvbGxhdGVyYWwgdW5pdHMuDQovLyBUb2tlbnMgYXJlIHJlYWwgR1JDMjAgKG1pbnQgb24gYnV5LCBidXJuIG9uIHNlbGwpLg0KcGFja2FnZSBwYWR2Mg0KDQppbXBvcnQgKA0KCSJjaGFpbiINCgkiY2hhaW4vYmFua2VyIg0KCSJjaGFpbi9ydW50aW1lIg0KCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSINCgkic3RyY29udiINCgkic3RyaW5ncyINCg0KCSJnbm8ubGFuZC9wL250L2dyYzIwL3YwIg0KCWFtbW1hdGggImduby5sYW5kL3AvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9nbm9taS9hbW1tYXRodjIiDQoJImduby5sYW5kL3AvbnQvYXZsL3YwIg0KCSJnbm8ubGFuZC9wL250L3NlcWlkL3YwIg0KCSJnbm8ubGFuZC9yL250L2dyYzIwcmVnL3YwIg0KCSJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Ig0KCSJnbm8ubGFuZC9yL2dub3N3YXAvZ25zIg0KCS8vIGJvbmQ6IGNyZWF0ZS1ib25kIHBvbGljeSAocHJvbW8gLyBub3JtYWwpLiBTZXBhcmF0ZSBwYWNrYWdlIC0gcGFkIHVwZ3JhZGVzDQoJLy8gZG8gbm90IHJlcGxhY2UgYm9uZCBzY2hlZHVsZS4gRGVwbG95IHByZXBhcmUgcmV3cml0ZXMgdG8gcGVyc29uYWwgcGF0aC4NCgljcmVhdGVib25kICJnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvZ25vbWkvYm9uZCINCgkvLyBwb2ludHN2Mjogb3B0aW9uYWwgdHJhZGUvY3JlYXRlIGF3YXJkcyAob2ZmIGJ5IGRlZmF1bHQgdW50aWwgU2V0UG9pbnRzRW5hYmxlZCkuDQoJLy8gRGVwbG95IHByZXBhcmUgcmV3cml0ZXMgdGhpcyBpbXBvcnQgdG8gdGhlIFNhcHBoaXJlIHBlcnNvbmFsLW5hbWVzcGFjZSBwYXRoLg0KCXBvaW50c3YyICJnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvZ25vbWkvcG9pbnRzdjIiDQopDQoNCnZhciAoDQoJbGF1bmNoZXMgICAgIGF2bC5UcmVlIC8vIGlkIC0+ICpMYXVuY2gNCglieVN5bWJvbCAgICAgYXZsLlRyZWUgLy8gc3ltYm9sIC0+IGlkIHN0cmluZw0KCW5leHRJRCAgICAgICBzZXFpZC5JRA0KCW5leHRUb2tlbklEICBzZXFpZC5JRCAvLyBHUkMyMCBpZGVudGl0eSBzZXF1ZW5jZSAoc2hhcmVkIGZvciBhbGwgbGF1bmNoZXMpDQoJLy8gcGFkQWRkcjogdGhpcyByZWFsbSdzIHBhY2thZ2UgYWRkcmVzcyAoc2V0IGluIGluaXQpIC0gZm9yIGludmVudG9yeSBmdW5kaW5nLg0KCXBhZEFkZHIgYWRkcmVzcw0KCS8vIHByb3RvY29sQWRkcjogdHJlYXN1cnkgc2V0IGJ5IEluaXQgKGZpcnN0IEVPQSkuIFJlY2VpdmVzIHByb3RvY29sIGZlZSBzaGFyZS4NCglwcm90b2NvbEFkZHIgYWRkcmVzcw0KCS8vIHByb3RvY29sRmVlczogV1VHTk9ULWJhY2tlZCB0cmFkZSBmZWVzIG9uIHBhZCwgY2xhaW1hYmxlIC8gcHVzaGFibGUgdG8gcHJvdG9jb2xBZGRyLg0KCXByb3RvY29sRmVlcyBpbnQ2NA0KCS8vIHByb3RvY29sQm9uZEZlZXM6IGJhbmsgdWdub3QgZnJvbSBjcmVhdGUgQm9uZEZlZSAobm90IFdVR05PVDsgcmVhbG1zIGNhbm5vdCBEZXBvc2l0KS4NCglwcm90b2NvbEJvbmRGZWVzIGludDY0DQoJLy8gcHJvdG9jb2xGZWVzUGFpZDogbGlmZXRpbWUgdWdub3QgYWxyZWFkeSBzZW50IHRvIHByb3RvY29sQWRkciAoc3RhdHMgb25seSkuDQoJcHJvdG9jb2xGZWVzUGFpZCBpbnQ2NA0KCWluaXRlZCAgICAgICAgICAgYm9vbA0KCS8vIHRlc3RTa2lwQmFua2VyOiB3aGVuIHRydWUsIHNlbmRVZ25vdCBpcyBhIG5vLW9wICh1bml0IHRlc3RzIHdpdGhvdXQgZnVuZGVkIHJlYWxtIGJhbmspLg0KCS8vIEFsd2F5cyBmYWxzZSBpbiBwcm9kdWN0aW9uLg0KCXRlc3RTa2lwQmFua2VyIGJvb2wNCgkvLyB0ZXN0Rm9yY2VHbm9zd2FwTGlzdDogdW5pdCB0ZXN0cyBvbmx5IC0gc3R1YiB0cnlMaXN0T25Hbm9zd2FwIHN1Y2NlZWRzIHdpdGhvdXQgU2FwcGhpcmUgZGVwcy4NCgkvLyBBbHdheXMgZmFsc2UgaW4gcHJvZHVjdGlvbiAoZ25vc3dhcF9saXN0X2Z1bGwgaWdub3JlcyBpdCkuDQoJdGVzdEZvcmNlR25vc3dhcExpc3QgYm9vbA0KCS8vIHRlc3RGb3JjZVpkZXhMaXN0OiB1bml0IHRlc3RzIG9ubHkgLSBzdHViIHRyeUxpc3RPblpkZXggc3VjY2VlZHMuDQoJdGVzdEZvcmNlWmRleExpc3QgYm9vbA0KCS8vIHBvaW50c0VuYWJsZWQ6IHdoZW4gdHJ1ZSwgbm90aWZ5IHBvaW50c3YyIGFmdGVyIENyZWF0ZSAvIEJ1eSAvIFNlbGwgLyBTd2FwKi4NCgkvLyBBZG1pbiBtdXN0IGFsc28gQWxsb3dQYWQodGhpcyBwYWNrYWdlKSBvbiBwb2ludHN2Mi4NCglwb2ludHNFbmFibGVkIGJvb2wNCgkvLyBMaXZlIG11dGFibGUgZWNvbm9taWNzIChwcm90b2NvbC1nYXRlZCkuIFNlZWRlZCBmcm9tIGNvbnN0cyBpbiBJbml0Lg0KCS8vIENoYW5naW5nIGdyYWR1YXRpb24gbWlkLWZsaWdodCBhZmZlY3RzIEFMTCBTdGF0dXNDdXJ2ZSBsYXVuY2hlcw0KCS8vIChyZWFkeVRvR3JhZHVhdGUgLyBCdXkgcmFpc2UgY2FwKS4gR3JhZHVhdGVkK2xpc3RlZCBsYXVuY2hlcyBhcmUgdW5hZmZlY3RlZA0KCS8vIChQb29sVWdub3QvUG9vbFRva2VuIGFscmVhZHkgZml4ZWQgYXQgR3JhZHVhdGUpLg0KCWdyYWR1YXRpb25VZ25vdCBpbnQ2NA0KCWxpc3RGZWVHbnNMaXZlICBpbnQ2NA0KCS8vIHd1Z25vdENyZWRpdDogRU9BIGFkZHJlc3Mgc3RyaW5nIC0+IGludDY0IHByZXBhaWQgV1VHTk9UIGNsYWltYWJsZSBieSB1c2VyLg0KCS8vIHRvdGFsV3Vnbm90Q3JlZGl0OiBzdW0gb2YgYWxsIGNyZWRpdHMgKGluY2x1ZGVkIGluIHJlc2VydmVkV3Vnbm90KS4NCgkvLyBGbG93OiBUcmFuc2ZlciBXVUdOT1QgdG8gcGFkIChyYWlzZXMgZnJlZSkgLT4gQnV5IGF1dG8tbG9ja3MgZnJlZSBpbnRvIGNyZWRpdA0KCS8vIGFuZCBzcGVuZHM7IG92ZXJwYXkgcmVmdW5kIGdvZXMgYmFjayB0byBjcmVkaXQ7IENsYWltV3Vnbm90IHdpdGhkcmF3cyBjcmVkaXQuDQoJd3Vnbm90Q3JlZGl0ICAgICAgYXZsLlRyZWUNCgl0b3RhbFd1Z25vdENyZWRpdCBpbnQ2NA0KCS8vIHRvdGFsTGlzdEZlZUduczogc3VtIG9mIHBlci1sYXVuY2ggTGlzdEZlZUducyBlc2Nyb3cgKHJlc2VydmVkIEdOUyBvbiBwYWQpLg0KCS8vIGZyZWVHbnMgPSBnbnMuQmFsYW5jZU9mKHBhZCkgLSB0b3RhbExpc3RGZWVHbnMuDQoJdG90YWxMaXN0RmVlR25zIGludDY0DQopDQoNCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsNCglwYWRBZGRyID0gY3VyLkFkZHJlc3MoKQ0KfQ0KDQovLyBUcmFkZSBpcyBvbmUgcHJpY2Ugc2FtcGxlIGZvciBjaGFydHMgKGNhcHBlZCBoaXN0b3J5IHBlciBsYXVuY2gpLg0KdHlwZSBUcmFkZSBzdHJ1Y3Qgew0KCUhlaWdodCBpbnQ2NA0KCVNpZGUgICBpbnQgLy8gVHJhZGVTaWRlQnV5IHwgVHJhZGVTaWRlU2VsbCB8IFRyYWRlU2lkZU9wZW4NCglVZ25vdCAgaW50NjQNCglUb2tlbnMgaW50NjQNCglQcmljZSAgaW50NjQgLy8gdWdub3QgcGVyIHRva2VuICogMWU2IGFmdGVyIHRoZSB0cmFkZQ0KfQ0KDQovLyBMYXVuY2ggaXMgb25lIG1lbWUgbWFya2V0OiBjdXJ2ZSBwaGFzZSB0aGVuIGxvY2tlZCBwb29sIHBoYXNlLg0KLy8gdG9rZW4vbGVkZ2VyIGFyZSB1bmV4cG9ydGVkIHNvIGV4dGVybmFsIHBhY2thZ2VzIGNhbm5vdCBNaW50L0J1cm4gdmlhIGZpZWxkIGFjY2Vzcy4NCnR5cGUgTGF1bmNoIHN0cnVjdCB7DQoJSUQgICAgICBzdHJpbmcNCglOYW1lICAgIHN0cmluZw0KCVN5bWJvbCAgc3RyaW5nDQoJVVJJICAgICBzdHJpbmcNCglDcmVhdG9yIGFkZHJlc3MNCglTdGF0dXMgIGludA0KCUNyZWF0ZWQgaW50NjQgLy8gYmxvY2sgaGVpZ2h0DQoNCgkvLyBHUkMyMCAobWludC9idXJuIG9ubHkgdmlhIHBhZC1vd25lZCBwcml2YXRlIGxlZGdlcikNCgl0b2tlbiAgICpncmMyMC5Ub2tlbg0KCWxlZGdlciAgKmdyYzIwLlByaXZhdGVMZWRnZXINCglUb2tlbklEIHN0cmluZyAvLyBUb2tlbi5JRCgpIC0gcmVnaXN0cnkgLyBHbm9zd2FwIGlkZW50aXR5DQoNCgkvLyBWaXJ0dWFsIGN1cnZlIHJlc2VydmVzDQoJVmlydHVhbFVnbm90IGludDY0DQoJVmlydHVhbFRva2VuIGludDY0DQoJUmVhbFNvbGQgICAgIGludDY0IC8vIHRva2VucyBzb2xkIG9uIGN1cnZlICg8PSBDdXJ2ZVN1cHBseSkNCglSYWlzZWRVZ25vdCAgaW50NjQgLy8gbmV0IHVnbm90IGNvbGxhdGVyYWwgaW4gY3VydmUgKGV4Y2wuIGZlZSB2YXVsdHMpDQoNCgkvLyBSZWFsIHBvb2wgKHBvc3QtZ3JhZCk7IExQIHBlcm1hbmVudGx5IGxvY2tlZCAtIG5vIHJlbW92ZSBwYXRoDQoJLy8gUG9vbFRva2VuIGlzIHBhZC1pbnRlcm5hbCByZXNlcnZlIHNpemVkIHRvIGN1cnZlIHNwb3QgKG5vdCBhbHdheXMgYWxsIHVuc29sZCkuDQoJLy8gTGVmdG92ZXJUb2tlbnMgPSAoVG90YWxTdXBwbHkgLSBSZWFsU29sZCkgLSBQb29sVG9rZW47IG1pbnRlZCB0byBwYWQgYXQgbGlzdCwgbm90IExQJ2QuDQoJUG9vbFVnbm90ICAgICBpbnQ2NA0KCVBvb2xUb2tlbiAgICAgaW50NjQNCglMZWZ0b3ZlclRva2VucyBpbnQ2NA0KDQoJQ3JlYXRvckZlZXMgIGludDY0DQoJQm9uZFVnbm90ICAgIGludDY0DQoJQm9uZFJlZnVuZGVkIGJvb2wNCglVbmlxdWVCdXllcnMgYXZsLlRyZWUgLy8gYWRkcmVzcyAtPiB0cnVlDQoJQnV5ZXJDb3VudCAgIGludA0KCS8vIHNuaXBlQm91Z2h0OiBhZGRyZXNzIC0+IGN1bXVsYXRpdmUgdG9rZW5zIGJvdWdodCBkdXJpbmcgYW50aS1zbmlwZSB3aW5kb3cNCglzbmlwZUJvdWdodCBhdmwuVHJlZQ0KDQoJLy8gR25vc3dhcCBsaXN0aW5nIHN0YXRlDQoJR25vc3dhcFJlYWR5ICAgICAgYm9vbCAgIC8vIGdyYWR1YXRlZDsgdG9rZW4gaXMgbGlzdGFibGUgLyBsaXN0ZWQNCglHbm9zd2FwTGlzdGVkICAgICBib29sICAgLy8gdHJ1ZSB3aGVuIENyZWF0ZVBvb2wrTWludCBzdWNjZWVkZWQgb24gR25vc3dhcA0KCUdub3N3YXBOb3RlICAgICAgIHN0cmluZyAvLyBodW1hbiBzdGF0dXMgLyBmYWlsdXJlIHJlYXNvbg0KCUdub3N3YXBQb29sUGF0aCAgIHN0cmluZw0KCUdub3N3YXBQb3NpdGlvbklEIHVpbnQ2NA0KCS8vIEZlZVd1Z25vdFNwZW50IC8gTGlxV3Vnbm90VXNlZDogaW52ZW50b3J5IHNwZW50IGF0IGdyYWR1YXRlICgxOjEgdnMgcmFpc2VkIHVnbm90IG5vdGlvbmFsbHkpDQoJRmVlV3Vnbm90U3BlbnQgaW50NjQNCglMaXFXdWdub3RVc2VkICBpbnQ2NA0KDQoJLy8gTGlzdEZlZUduczogQ3JlYXRlLXRpbWUgR05TIGVzY3JvdyBmb3IgR25vc3dhcCBDcmVhdGVQb29sIGZlZSAocGFkdjIwKykuDQoJLy8gQ29uc3VtZWQgb24gc3VjY2Vzc2Z1bCBsaXN0OyBDbGFpbUxpc3RGZWUgcmVmdW5kcyBjcmVhdG9yIGlmIHN0aWxsIHVubGlzdGVkLg0KCUxpc3RGZWVHbnMgICAgICBpbnQ2NA0KCUxpc3RGZWVDb25zdW1lZCBib29sIC8vIHRydWUgYWZ0ZXIgbGlzdCBwYWlkIENyZWF0ZVBvb2wgZmVlIGZyb20gZXNjcm93DQoNCgkvLyBMaXN0VmVudWU6IHdoaWNoIERFWCBhZGFwdGVyIHN1Y2NlZWRlZCAoZS5nLiAiemRleCIgLyAiZ25vc3dhcCIpLiBFbXB0eSBpZiB1bmxpc3RlZC4NCglMaXN0VmVudWUgc3RyaW5nDQoJLy8gUHJlZmVycmVkVmVudWU6IGNob3NlbiBhdCBDcmVhdGUgKG9yIFNldFByZWZlcnJlZFZlbnVlKS4gVXNlZCB3aGVuIFJldHJ5TGlzdCB2ZW51ZUlkID09ICIiLg0KCVByZWZlcnJlZFZlbnVlIHN0cmluZw0KCS8vIExpc3RTZWVkUmVsZWFzZWQ6IFBvb2xVZ25vdCAoV1VHTk9UKSArIFBvb2xUb2tlbiAobWludGVkIEdSQzIwKSBzZW50IHRvIGNyZWF0b3IgZm9yIEVPQSB6ZGV4IENyZWF0ZVBvb2wuDQoJTGlzdFNlZWRSZWxlYXNlZCBib29sDQoNCgkvLyBDaGFydCBoaXN0b3J5IChvcmRlcmVkIEFWTCBrZXlzKQ0KCVRyYWRlcyAgICBhdmwuVHJlZSAvLyB0cmFkZUtleSAtPiAqVHJhZGUNCglOZXh0VHJhZGUgaW50NjQNCn0NCg0KLy8gSW5pdCBzZXRzIHRoZSBwcm90b2NvbCB0cmVhc3VyeS4gRmlyc3QgRU9BIGNhbGxlciBiZWNvbWVzIGZlZSByZWNpcGllbnQNCi8vIChwcm90b2NvbEFkZHIpLiBQcm90b2NvbCB0cmFkZSBmZWVzIGFjY3J1ZSBvbi1wYWQgdW50aWwgQ2xhaW1Qcm90b2NvbEZlZXMNCi8vICh0cmVhc3VyeSBvbmx5KSBvciBQdXNoUHJvdG9jb2xGZWVzIChhbnlvbmUgbWF5IHB1c2ggdG8gdHJlYXN1cnkpLg0KLy8gQ3JlYXRvciBmZWVzIGFsd2F5cyBuZWVkIENsYWltQ3JlYXRvckZlZXMgYnkgdGhlIHRva2VuIGNyZWF0b3IuDQovLw0KLy8gRGVwbG95IG5vdGU6IGNhbGwgSW5pdCB3aXRoIHRoZSB3YWxsZXQgdGhhdCBzaG91bGQgcmVjZWl2ZSBwcm90b2NvbCBmZWVzDQovLyAob3IgVHJhbnNmZXJQcm90b2NvbCBsYXRlcikuIEdub3N3YXAgQ3JlYXRlUG9vbCBHTlMgZmVlIGlzIHBhaWQgdG8gR25vc3dhcCwNCi8vIG5vdCB0byB0aGlzIHRyZWFzdXJ5Lg0KZnVuYyBJbml0KGN1ciByZWFsbSkgew0KCWlmIGluaXRlZCB7DQoJCXBhbmljKCJwYWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWQiKQ0KCX0NCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogRU9BIG9ubHkiKQ0KCX0NCglwcm90b2NvbEFkZHIgPSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglncmFkdWF0aW9uVWdub3QgPSBHcmFkdWF0aW9uVGhyZXNob2xkIC8vIHNlZWQgZnJvbSBjb25zdCBkZWZhdWx0DQoJbGlzdEZlZUduc0xpdmUgPSBMaXN0RmVlR25zDQoJaWYgZ3JhZHVhdGlvblVnbm90IDw9IDAgew0KCQlwYW5pYygicGFkOiBkZWZhdWx0IGdyYWR1YXRpb24gbWlzY29uZmlndXJlZCIpDQoJfQ0KCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQ0KCWluaXRlZCA9IHRydWUNCgljaGFpbi5FbWl0KCJJbml0IiwNCgkJInByb3RvY29sIiwgcHJvdG9jb2xBZGRyLlN0cmluZygpLA0KCQkiZ3JhZHVhdGlvblVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZ3JhZHVhdGlvblVnbm90LCAxMCksDQoJCSJsaXN0RmVlR25zIiwgc3RyY29udi5Gb3JtYXRJbnQobGlzdEZlZUduc0xpdmUsIDEwKSwNCgkJImRlZmF1bHRMaXN0VmVudWUiLCBEZWZhdWx0TGlzdFZlbnVlKCksDQoJKQ0KfQ0KDQpmdW5jIHJlcXVpcmVQcm90b2NvbChjdXIgcmVhbG0pIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IEVPQSBvbmx5IikNCgl9DQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHByb3RvY29sQWRkciB7DQoJCXBhbmljKCJwYWQ6IG5vdCBwcm90b2NvbCIpDQoJfQ0KfQ0KDQovLyBncmFkdWF0aW9uVGhyZXNob2xkIGlzIHRoZSBsaXZlIHJhaXNlIHRhcmdldCAodWdub3QpLiBGYWxscyBiYWNrIHRvIGNvbnN0IGlmIHVuc2V0Lg0KZnVuYyBncmFkdWF0aW9uVGhyZXNob2xkKCkgaW50NjQgew0KCWlmIGdyYWR1YXRpb25VZ25vdCA+IDAgew0KCQlyZXR1cm4gZ3JhZHVhdGlvblVnbm90DQoJfQ0KCXJldHVybiBHcmFkdWF0aW9uVGhyZXNob2xkDQp9DQoNCi8vIFNldEdyYWR1YXRpb25UaHJlc2hvbGQgdXBkYXRlcyB0aGUgbGl2ZSByYWlzZSB0YXJnZXQgKHVnbm90LCAxIEdOT1QgPSAxZTYpLg0KLy8gUHJvdG9jb2wvZGVwbG95IHdhbGxldCBvbmx5LiBBZmZlY3RzIG9wZW4gY3VydmUgbGF1bmNoZXMgKHJlbWFpbmluZyByYWlzZSAvIHJlYWR5KS4NCmZ1bmMgU2V0R3JhZHVhdGlvblRocmVzaG9sZChjdXIgcmVhbG0sIHVnbm90IGludDY0KSB7DQoJcmVxdWlyZVByb3RvY29sKGN1cikNCglpZiB1Z25vdCA8PSAwIHsNCgkJcGFuaWMoInBhZDogZ3JhZHVhdGlvbiBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJb2xkIDo9IGdyYWR1YXRpb25UaHJlc2hvbGQoKQ0KCWdyYWR1YXRpb25VZ25vdCA9IHVnbm90DQoJY2hhaW4uRW1pdCgiU2V0R3JhZHVhdGlvblRocmVzaG9sZCIsDQoJCSJmcm9tIiwgc3RyY29udi5Gb3JtYXRJbnQob2xkLCAxMCksDQoJCSJ0byIsIHN0cmNvbnYuRm9ybWF0SW50KHVnbm90LCAxMCksDQoJKQ0KfQ0KDQovLyBHcmFkdWF0aW9uVGhyZXNob2xkTGl2ZSByZXR1cm5zIHRoZSBsaXZlIHJhaXNlIHRhcmdldCAodWdub3QpIGZvciBVSXMvcWV2YWwuDQpmdW5jIEdyYWR1YXRpb25UaHJlc2hvbGRMaXZlKCkgaW50NjQgew0KCXJldHVybiBncmFkdWF0aW9uVGhyZXNob2xkKCkNCn0NCg0KLy8gU2V0TGlzdEZlZUducyB1cGRhdGVzIENyZWF0ZS10aW1lIEdOUyBlc2Nyb3cgcmVxdWlyZWQgZm9yIG5ldyBsYXVuY2hlcy4NCi8vIFByb3RvY29sL2RlcGxveSB3YWxsZXQgb25seS4gRG9lcyBub3QgY2hhbmdlIGFscmVhZHktZXNjcm93ZWQgbGF1bmNoZXMuDQpmdW5jIFNldExpc3RGZWVHbnMoY3VyIHJlYWxtLCBnbnMgaW50NjQpIHsNCglyZXF1aXJlUHJvdG9jb2woY3VyKQ0KCWlmIGducyA8IDAgew0KCQlwYW5pYygicGFkOiBsaXN0IGZlZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpDQoJfQ0KCW9sZCA6PSByZXF1aXJlZExpc3RGZWVHbnMoKQ0KCWxpc3RGZWVHbnNMaXZlID0gZ25zDQoJY2hhaW4uRW1pdCgiU2V0TGlzdEZlZUducyIsDQoJCSJmcm9tIiwgc3RyY29udi5Gb3JtYXRJbnQob2xkLCAxMCksDQoJCSJ0byIsIHN0cmNvbnYuRm9ybWF0SW50KGducywgMTApLA0KCSkNCn0NCg0KLy8gY3JlZGl0UHJvdG9jb2wgYWNjcnVlcyBwcm90b2NvbCB1Z25vdCBsaWFiaWxpdHkgb24gdGhlIHBhZCByZWFsbS4NCi8vIENhc2ggc3RheXMgaW4gcGFkIHVudGlsIENsYWltUHJvdG9jb2xGZWVzIC8gUHVzaFByb3RvY29sRmVlcy4NCmZ1bmMgY3JlZGl0UHJvdG9jb2woYW10IGludDY0KSB7DQoJaWYgYW10IDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJcHJvdG9jb2xGZWVzICs9IGFtdA0KfQ0KDQovLyBjcmVkaXRCb25kRmVlIGJvb2tzIGNyZWF0ZS1ib25kIGJhbmsgdWdub3QgYXMgcGxhdGZvcm0gZmVlIChub3QgV1VHTk9ULXJlc2VydmVkKS4NCmZ1bmMgY3JlZGl0Qm9uZEZlZShhbXQgaW50NjQpIHsNCglpZiBhbXQgPD0gMCB7DQoJCXJldHVybg0KCX0NCglwcm90b2NvbEJvbmRGZWVzICs9IGFtdA0KfQ0KDQpmdW5jIHJlcXVpcmVJbml0KCkgew0KCWlmICFpbml0ZWQgew0KCQlwYW5pYygicGFkOiBjYWxsIEluaXQgZmlyc3QiKQ0KCX0NCn0NCg0KLy8gU2V0UG9pbnRzRW5hYmxlZCB0b2dnbGVzIHBvaW50c3YyIG5vdGlmaWNhdGlvbnMgKHByb3RvY29sIGFkbWluIG9ubHkpLg0KLy8gcG9pbnRzdjIgbXVzdCBBbGxvd1BhZCh0aGlzIHBhY2thZ2UgcGF0aCkgb3IgT25UcmFkZS9PbkNyZWF0ZSB3aWxsIHBhbmljIGFuZCByZXZlcnQgdGhlIHRyYWRlLg0KZnVuYyBTZXRQb2ludHNFbmFibGVkKGN1ciByZWFsbSwgb24gYm9vbCkgew0KCXJlcXVpcmVQcm90b2NvbChjdXIpDQoJcG9pbnRzRW5hYmxlZCA9IG9uDQoJY2hhaW4uRW1pdCgiU2V0UG9pbnRzRW5hYmxlZCIsICJvbiIsIHN0cmNvbnYuRm9ybWF0Qm9vbChvbikpDQp9DQoNCi8vIFBvaW50c0VuYWJsZWQgcmVwb3J0cyB3aGV0aGVyIHBhZCBub3RpZmllcyBwb2ludHN2MiBhZnRlciB0cmFkZXMvY3JlYXRlcy4NCmZ1bmMgUG9pbnRzRW5hYmxlZCgpIGJvb2wgew0KCXJldHVybiBwb2ludHNFbmFibGVkDQp9DQoNCmZ1bmMgbm90aWZ5VHJhZGUoY3VyIHJlYWxtLCB0cmFkZXIgYWRkcmVzcywgaWQgc3RyaW5nLCBzaWRlIGludDY0LCB2b2x1bWVVZ25vdCBpbnQ2NCkgew0KCWlmICFwb2ludHNFbmFibGVkIHx8IHRlc3RTa2lwQmFua2VyIHsNCgkJcmV0dXJuDQoJfQ0KCV8gPSBwb2ludHN2Mi5PblRyYWRlKGNyb3NzKGN1ciksIHRyYWRlciwgaWQsIHNpZGUsIHZvbHVtZVVnbm90KQ0KfQ0KDQpmdW5jIG5vdGlmeUNyZWF0ZShjdXIgcmVhbG0sIGNyZWF0b3IgYWRkcmVzcywgaWQgc3RyaW5nKSB7DQoJaWYgIXBvaW50c0VuYWJsZWQgfHwgdGVzdFNraXBCYW5rZXIgew0KCQlyZXR1cm4NCgl9DQoJXyA9IHBvaW50c3YyLk9uQ3JlYXRlKGNyb3NzKGN1ciksIGNyZWF0b3IsIGlkKQ0KfQ0KDQpmdW5jIG11c3RMYXVuY2goaWQgc3RyaW5nKSAqTGF1bmNoIHsNCgkvLyBTYXBwaGlyZSBhdmwuVHJlZS5HZXQgcmV0dXJucyBhIHNpbmdsZSBhbnkgKG5pbCBpZiBtaXNzaW5nKS4NCglsLCBvayA6PSBsYXVuY2hlcy5HZXQoaWQpLigqTGF1bmNoKQ0KCWlmICFvayB7DQoJCXBhbmljKCJwYWQ6IHVua25vd24gbGF1bmNoIikNCgl9DQoJcmV0dXJuIGwNCn0NCg0KZnVuYyBiYWxPZihsICpMYXVuY2gsIGFkZHIgYWRkcmVzcykgaW50NjQgew0KCWlmIGwgPT0gbmlsIHx8IGwudG9rZW4gPT0gbmlsIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGwudG9rZW4uQmFsYW5jZU9mKGFkZHIpDQp9DQoNCi8vIGFkZEJhbCBtaW50cyAoZGVsdGE+MCkgb3IgYnVybnMgKGRlbHRhPDApIEdSQzIwIHZpYSBwYWQtb3duZWQgUHJpdmF0ZUxlZGdlci4NCmZ1bmMgYWRkQmFsKGwgKkxhdW5jaCwgYWRkciBhZGRyZXNzLCBkZWx0YSBpbnQ2NCkgew0KCWlmIGwgPT0gbmlsIHx8IGwubGVkZ2VyID09IG5pbCB7DQoJCXBhbmljKCJwYWQ6IG1pc3NpbmcgR1JDMjAgbGVkZ2VyIikNCgl9DQoJaWYgZGVsdGEgPT0gMCB7DQoJCXJldHVybg0KCX0NCglpZiBkZWx0YSA+IDAgew0KCQlpZiBlcnIgOj0gbC5sZWRnZXIuTWludChhZGRyLCBkZWx0YSk7IGVyciAhPSBuaWwgew0KCQkJcGFuaWMoInBhZDogbWludDogIiArIGVyci5FcnJvcigpKQ0KCQl9DQoJCXJldHVybg0KCX0NCglpZiBlcnIgOj0gbC5sZWRnZXIuQnVybihhZGRyLCAtZGVsdGEpOyBlcnIgIT0gbmlsIHsNCgkJcGFuaWMoInBhZDogYnVybjogIiArIGVyci5FcnJvcigpKQ0KCX0NCn0NCg0KZnVuYyByZXF1aXJlTWluT3V0KGdvdCwgbWluT3V0IGludDY0LCB3aGF0IHN0cmluZykgew0KCWlmIG1pbk91dCA8IDAgew0KCQlwYW5pYygicGFkOiBtaW5PdXQgbXVzdCBiZSBub24tbmVnYXRpdmUiKQ0KCX0NCglpZiBtaW5PdXQgPiAwICYmIGdvdCA8IG1pbk91dCB7DQoJCXBhbmljKCJwYWQ6ICIgKyB3aGF0ICsgIiBiZWxvdyBtaW5PdXQgKHNsaXBwYWdlKSIpDQoJfQ0KfQ0KDQpmdW5jIHNuaXBlQm91Z2h0T2YobCAqTGF1bmNoLCBidXllciBhZGRyZXNzKSBpbnQ2NCB7DQoJdiA6PSBsLnNuaXBlQm91Z2h0LkdldChidXllci5TdHJpbmcoKSkNCglpZiB2ID09IG5pbCB7DQoJCXJldHVybiAwDQoJfQ0KCW4sIG9rIDo9IHYuKGludDY0KQ0KCWlmICFvayB7DQoJCXJldHVybiAwDQoJfQ0KCXJldHVybiBuDQp9DQoNCmZ1bmMgY2hlY2tBbmRBZGRTbmlwZShsICpMYXVuY2gsIGJ1eWVyIGFkZHJlc3MsIHRva2Vuc091dCBpbnQ2NCkgew0KCWhlaWdodCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkNCglpZiBoZWlnaHQtbC5DcmVhdGVkID49IEFudGlTbmlwZUhlaWdodHMgew0KCQlyZXR1cm4NCgl9DQoJbWF4VG9rIDo9IFRvdGFsU3VwcGx5ICogQW50aVNuaXBlTWF4QnV5QlBTIC8gMTAwMDANCglwcmV2IDo9IHNuaXBlQm91Z2h0T2YobCwgYnV5ZXIpDQoJaWYgcHJldit0b2tlbnNPdXQgPiBtYXhUb2sgew0KCQlwYW5pYygicGFkOiBhbnRpLXNuaXBlIGN1bXVsYXRpdmUgbWF4IGJ1eSBleGNlZWRlZCIpDQoJfQ0KCWwuc25pcGVCb3VnaHQuU2V0KGJ1eWVyLlN0cmluZygpLCBwcmV2K3Rva2Vuc091dCkNCn0NCg0KZnVuYyBzZW5kVWdub3QoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiBhbW91bnQgPD0gMCB7DQoJCXJldHVybg0KCX0NCglpZiB0ZXN0U2tpcEJhbmtlciB7DQoJCXJldHVybg0KCX0NCgliayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpDQoJYmsuU2VuZENvaW5zKGN1ci5BZGRyZXNzKCksIHRvLCBjaGFpbi5Db2luc3t7RGVub206IERlbm9tVWdub3QsIEFtb3VudDogYW1vdW50fX0pDQp9DQoNCmZ1bmMgcmVxdWlyZVVzZXJQYXltZW50KGN1ciByZWFsbSkgaW50NjQgew0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpLkFtb3VudE9mKERlbm9tVWdub3QpDQoJaWYgc2VudCA8PSAwIHsNCgkJcGFuaWMoInBhZDogbmVlZCB1Z25vdCAtc2VuZCIpDQoJfQ0KCXJldHVybiBzZW50DQp9DQoNCi8vIC0tLSBXVUdOT1QgY29sbGF0ZXJhbCAocHJvZHVjdGlvbiBjdXJ2ZSAvIGludGVybmFsIENQTU0pIC0tLQ0KDQovLyByZXNlcnZlZFd1Z25vdCBpcyBXVUdOT1QgYWxyZWFkeSBjb21taXR0ZWQgKG1hcmtldHMvZmVlcy91c2VyIHByZXBhaWQgY3JlZGl0cykuDQovLyBFeGNsdWRlcyBiYW5rLW9ubHkgbGlhYmlsaXRpZXMgKGNyZWF0ZSBib25kIHVnbm90KS4NCmZ1bmMgcmVzZXJ2ZWRXdWdub3QoKSBpbnQ2NCB7DQoJcmVzZXJ2ZWQgOj0gcHJvdG9jb2xGZWVzICsgdG90YWxXdWdub3RDcmVkaXQNCglsYXVuY2hlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsNCgkJbCA6PSB2YWx1ZS4oKkxhdW5jaCkNCgkJcmVzZXJ2ZWQgKz0gbC5DcmVhdG9yRmVlcw0KCQlpZiBsLlN0YXR1cyA9PSBTdGF0dXNDdXJ2ZSB7DQoJCQlyZXNlcnZlZCArPSBsLlJhaXNlZFVnbm90DQoJCX0NCgkJLy8gSW50ZXJuYWwgQ1BNTSBob2xkcyBXVUdOT1Qgd2hlbiBub3QgbGlzdGVkIGFuZCBzZWVkIG5vdCByZWxlYXNlZCB0byBFT0EuDQoJCWlmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCAmJiAhbC5Hbm9zd2FwTGlzdGVkICYmICFsLkxpc3RTZWVkUmVsZWFzZWQgew0KCQkJcmVzZXJ2ZWQgKz0gbC5Qb29sVWdub3QNCgkJfQ0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiByZXNlcnZlZA0KfQ0KDQovLyBmcmVlV3Vnbm90T25QYWQgaXMgV1VHTk9UIG9uIHBhZCBhYm92ZSByZXNlcnZlZCBjb21taXRtZW50cy4NCi8vIEFmdGVyIHVzZXIgd3Vnbm90LlRyYW5zZmVyKHBhZCwgYW10KSwgZnJlZSByaXNlczsgQnV5IGxvY2tzIGZyZWUgaW50byBjYWxsZXIgY3JlZGl0Lg0KZnVuYyBmcmVlV3Vnbm90T25QYWQoKSBpbnQ2NCB7DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEFkZHIpDQoJZnJlZSA6PSBoYXZlIC0gcmVzZXJ2ZWRXdWdub3QoKQ0KCWlmIGZyZWUgPCAwIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGZyZWUNCn0NCg0KLy8gRnJlZVd1Z25vdCBpcyBmcmVlfGhhdmV8cmVzZXJ2ZWR8dG90YWxDcmVkaXQgZm9yIFVJIHByZWZsaWdodC4NCmZ1bmMgRnJlZVd1Z25vdCgpIHN0cmluZyB7DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEFkZHIpDQoJcmVzIDo9IHJlc2VydmVkV3Vnbm90KCkNCglmcmVlIDo9IGhhdmUgLSByZXMNCglpZiBmcmVlIDwgMCB7DQoJCWZyZWUgPSAwDQoJfQ0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChmcmVlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChoYXZlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChyZXMsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHRvdGFsV3Vnbm90Q3JlZGl0LCAxMCkNCn0NCg0KZnVuYyBwcmVwYWlkT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7DQoJaWYgIWFkZHIuSXNWYWxpZCgpIHsNCgkJcmV0dXJuIDANCgl9DQoJdiA6PSB3dWdub3RDcmVkaXQuR2V0KGFkZHIuU3RyaW5nKCkpDQoJaWYgdiA9PSBuaWwgew0KCQlyZXR1cm4gMA0KCX0NCgluLCBvayA6PSB2LihpbnQ2NCkNCglpZiAhb2sgew0KCQlyZXR1cm4gMA0KCX0NCglyZXR1cm4gbg0KfQ0KDQpmdW5jIGFkZFByZXBhaWQoYWRkciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiBhbW91bnQgPD0gMCB8fCAhYWRkci5Jc1ZhbGlkKCkgew0KCQlyZXR1cm4NCgl9DQoJbmV4dCA6PSBwcmVwYWlkT2YoYWRkcikgKyBhbW91bnQNCgl3dWdub3RDcmVkaXQuU2V0KGFkZHIuU3RyaW5nKCksIG5leHQpDQoJdG90YWxXdWdub3RDcmVkaXQgKz0gYW1vdW50DQp9DQoNCmZ1bmMgc3ViUHJlcGFpZChhZGRyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgew0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcmV0dXJuDQoJfQ0KCWhhdmUgOj0gcHJlcGFpZE9mKGFkZHIpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCXBhbmljKCJwYWQ6IHByZXBhaWQgV1VHTk9UIHVuZGVyZnVuZGVkIikNCgl9DQoJbmV4dCA6PSBoYXZlIC0gYW1vdW50DQoJaWYgbmV4dCA9PSAwIHsNCgkJd3Vnbm90Q3JlZGl0LlJlbW92ZShhZGRyLlN0cmluZygpKQ0KCX0gZWxzZSB7DQoJCXd1Z25vdENyZWRpdC5TZXQoYWRkci5TdHJpbmcoKSwgbmV4dCkNCgl9DQoJdG90YWxXdWdub3RDcmVkaXQgLT0gYW1vdW50DQp9DQoNCi8vIFByZXBhaWRCYWxhbmNlIHJldHVybnMgY2FsbGVyJ3MgY2xhaW1hYmxlIFdVR05PVCBjcmVkaXQgb24gdGhpcyBwYWQuDQpmdW5jIFByZXBhaWRCYWxhbmNlKGN1ciByZWFsbSkgaW50NjQgew0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJcmV0dXJuIHByZXBhaWRPZihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpDQp9DQoNCi8vIFByZXBhaWRPZiByZXR1cm5zIGNsYWltYWJsZSBjcmVkaXQgZm9yIGFuIGFkZHJlc3MgKHJlYWQgaGVscGVyKS4NCmZ1bmMgUHJlcGFpZE9mKGFkZHIgc3RyaW5nKSBpbnQ2NCB7DQoJcmV0dXJuIHByZXBhaWRPZihhZGRyZXNzKGFkZHIpKQ0KfQ0KDQovLyBDbGFpbVd1Z25vdCB3aXRoZHJhd3MgYWxsIG9mIHRoZSBjYWxsZXIncyBwcmVwYWlkIFdVR05PVCBjcmVkaXQgdG8gdGhlaXIgd2FsbGV0Lg0KLy8gU2FmZSBhZnRlciBCdXkgb3ZlcnBheSBvciBhZnRlciBncmFkdWF0ZS9saXN0IOKAlCBleGNlc3Mgc3RheXMgY2xhaW1hYmxlIHVudGlsIGNsYWltZWQuDQpmdW5jIENsYWltV3Vnbm90KGN1ciByZWFsbSkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCXVzZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJYW10IDo9IHByZXBhaWRPZih1c2VyKQ0KCWlmIGFtdCA8PSAwIHsNCgkJcmV0dXJuIDANCgl9DQoJc3ViUHJlcGFpZCh1c2VyLCBhbXQpDQoJcGF5V3Vnbm90T3V0KGN1ciwgdXNlciwgYW10KQ0KCWNoYWluLkVtaXQoIkNsYWltV3Vnbm90IiwNCgkJInVzZXIiLCB1c2VyLlN0cmluZygpLA0KCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW10LCAxMCksDQoJKQ0KCXJldHVybiBhbXQNCn0NCg0KLy8gdGFrZVd1Z25vdEluIGNvbGxlY3RzIGFtb3VudCBXVUdOT1QgYXMgcGF5bWVudCBmb3IgQnV5L1N3YXBCdXkuDQovLw0KLy8gMSkgQXV0by1sb2NrIGZyZWUgZmxvYXQgaW50byBjYWxsZXIncyBwcmVwYWlkICh1c2VyIG11c3QgVHJhbnNmZXIgdG8gcGFkIGZpcnN0KS4NCi8vIDIpIFNwZW5kIGFtb3VudCBmcm9tIHByZXBhaWQgKG92ZXJwYXkgc3RheXMgYXMgY3JlZGl0IHZpYSBjcmVkaXRSZWZ1bmQpLg0KLy8gTm8gVHJhbnNmZXJGcm9tLg0KLy8NCi8vIFRlc3RzICh0ZXN0U2tpcEJhbmtlcik6IE9yaWdpblNlbmQgdWdub3QgYXMgc3ludGhldGljIGNvbGxhdGVyYWwgdW5pdHMuDQpmdW5jIHRha2VXdWdub3RJbihjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgaW50NjQgew0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQkvLyBMb2NhbCB0ZXN0czogT3JpZ2luU2VuZCB1Z25vdCBzdGFuZHMgaW4gZm9yIFdVR05PVCB1bml0cy4NCgkJcmV0dXJuIHJlcXVpcmVVc2VyUGF5bWVudChjdXIpDQoJfQ0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcGFuaWMoInBhZDogYW1vdW50V3Vnbm90IG11c3QgYmUgcG9zaXRpdmUiKQ0KCX0NCgl1c2VyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWhhdmUgOj0gcHJlcGFpZE9mKHVzZXIpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCW5lZWQgOj0gYW1vdW50IC0gaGF2ZQ0KCQlmcmVlIDo9IGZyZWVXdWdub3RPblBhZCgpDQoJCWlmIGZyZWUgPCBuZWVkIHsNCgkJCWhhdmVQYWQgOj0gd3Vnbm90LkJhbGFuY2VPZihwYWRBZGRyKQ0KCQkJcmVzIDo9IHJlc2VydmVkV3Vnbm90KCkNCgkJCXBhbmljKCJwYWQ6IFRyYW5zZmVyICIgKyBzdHJjb252LkZvcm1hdEludChuZWVkLCAxMCkgKw0KCQkJCSIgbW9yZSBXVUdOT1QgdG8gcGFkIHRoZW4gQnV5IChmcmVlPSIgKyBzdHJjb252LkZvcm1hdEludChmcmVlLCAxMCkgKw0KCQkJCSIgcHJlcGFpZD0iICsgc3RyY29udi5Gb3JtYXRJbnQoaGF2ZSwgMTApICsNCgkJCQkiIGhhdmU9IiArIHN0cmNvbnYuRm9ybWF0SW50KGhhdmVQYWQsIDEwKSArDQoJCQkJIiByZXNlcnZlZD0iICsgc3RyY29udi5Gb3JtYXRJbnQocmVzLCAxMCkgKw0KCQkJCSIgbmVlZFRvdGFsPSIgKyBzdHJjb252LkZvcm1hdEludChhbW91bnQsIDEwKSArICIpIikNCgkJfQ0KCQkvLyBMb2NrIGZyZWUgaW50byB0aGlzIGNhbGxlcidzIHByZXBhaWQgKHJhaXNlcyByZXNlcnZlZCwgbG93ZXJzIGZyZWUpLg0KCQlhZGRQcmVwYWlkKHVzZXIsIG5lZWQpDQoJfQ0KCXN1YlByZXBhaWQodXNlciwgYW1vdW50KQ0KCXJldHVybiBhbW91bnQNCn0NCg0KLy8gY3JlZGl0UmVmdW5kIGtlZXBzIHVudXNlZCBCdXkgV1VHTk9UIGFzIGNsYWltYWJsZSBwcmVwYWlkIChub3QgaW5zdGFudCB3YWxsZXQgcmVmdW5kKS4NCi8vIFVzZXIgY2FsbHMgQ2xhaW1XdWdub3QgYWZ0ZXIgYnV5IC8gYWZ0ZXIgbGlzdCB3aGVuIGNvbnZlbmllbnQuDQpmdW5jIGNyZWRpdFJlZnVuZChidXllciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiB0ZXN0U2tpcEJhbmtlciB8fCBhbW91bnQgPD0gMCB7DQoJCXJldHVybg0KCX0NCglhZGRQcmVwYWlkKGJ1eWVyLCBhbW91bnQpDQp9DQoNCi8vIHBheVd1Z25vdE91dCBzZW5kcyBXVUdOT1QgZnJvbSBwYWQgdG8gdXNlciAocHJvZHVjdGlvbikuDQovLyBUZXN0czogcGF5IHVnbm90IHZpYSBiYW5rZXIgd2hlbiB0ZXN0U2tpcEJhbmtlci4NCmZ1bmMgcGF5V3Vnbm90T3V0KGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7DQoJaWYgYW1vdW50IDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQlzZW5kVWdub3QoY3VyLCB0bywgYW1vdW50KQ0KCQlyZXR1cm4NCgl9DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKGN1ci5BZGRyZXNzKCkpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCWFtb3VudCA9IGhhdmUNCgl9DQoJaWYgYW1vdW50ID4gMCB7DQoJCXd1Z25vdC5UcmFuc2Zlcihjcm9zcyhjdXIpLCB0bywgYW1vdW50KQ0KCX0NCn0NCg0KZnVuYyBub3RlQnV5ZXIobCAqTGF1bmNoLCBidXllciBhZGRyZXNzKSB7DQoJayA6PSBidXllci5TdHJpbmcoKQ0KCWlmIGwuVW5pcXVlQnV5ZXJzLkhhcyhrKSB7DQoJCXJldHVybg0KCX0NCglsLlVuaXF1ZUJ1eWVycy5TZXQoaywgdHJ1ZSkNCglsLkJ1eWVyQ291bnQrKw0KfQ0KDQpmdW5jIHRyYWRlS2V5KG4gaW50NjQpIHN0cmluZyB7DQoJcyA6PSBzdHJjb252LkZvcm1hdEludChuLCAxMCkNCglmb3IgbGVuKHMpIDwgMTIgew0KCQlzID0gIjAiICsgcw0KCX0NCglyZXR1cm4gcw0KfQ0KDQovLyBzcG90UHJpY2VTY2FsZWQgcmV0dXJucyB1Z25vdC90b2tlbiAqIDFlNiBmcm9tIGN1cnJlbnQgY3VydmUgb3IgcG9vbCByZXNlcnZlcy4NCmZ1bmMgc3BvdFByaWNlU2NhbGVkKGwgKkxhdW5jaCkgaW50NjQgew0KCWlmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCB7DQoJCWlmIGwuUG9vbFRva2VuIDw9IDAgew0KCQkJcmV0dXJuIDANCgkJfQ0KCQlyZXR1cm4gbC5Qb29sVWdub3QgKiAxMDAwMDAwIC8gbC5Qb29sVG9rZW4NCgl9DQoJaWYgbC5WaXJ0dWFsVG9rZW4gPD0gMCB7DQoJCXJldHVybiAwDQoJfQ0KCXJldHVybiBsLlZpcnR1YWxVZ25vdCAqIDEwMDAwMDAgLyBsLlZpcnR1YWxUb2tlbg0KfQ0KDQpmdW5jIHJlY29yZFRyYWRlKGwgKkxhdW5jaCwgc2lkZSBpbnQsIHVnbm90LCB0b2tlbnMgaW50NjQpIHsNCglsLk5leHRUcmFkZSsrDQoJdCA6PSAmVHJhZGV7DQoJCUhlaWdodDogcnVudGltZS5DaGFpbkhlaWdodCgpLA0KCQlTaWRlOiAgIHNpZGUsDQoJCVVnbm90OiAgdWdub3QsDQoJCVRva2VuczogdG9rZW5zLA0KCQlQcmljZTogIHNwb3RQcmljZVNjYWxlZChsKSwNCgl9DQoJbC5UcmFkZXMuU2V0KHRyYWRlS2V5KGwuTmV4dFRyYWRlKSwgdCkNCgkvLyBSaW5nIGJ1ZmZlcjogZHJvcCBvbGRlc3Qgd2hpbGUgb3ZlciBjYXAuDQoJZm9yIGwuVHJhZGVzLlNpemUoKSA+IE1heFRyYWRlSGlzdG9yeSB7DQoJCW9sZGVzdCA6PSAiIg0KCQlsLlRyYWRlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrIHN0cmluZywgXyBhbnkpIGJvb2wgew0KCQkJb2xkZXN0ID0gaw0KCQkJcmV0dXJuIHRydWUgLy8gc3RvcA0KCQl9KQ0KCQlpZiBvbGRlc3QgPT0gIiIgew0KCQkJYnJlYWsNCgkJfQ0KCQlsLlRyYWRlcy5SZW1vdmUob2xkZXN0KQ0KCX0NCn0NCg0KLy8gbWF5YmVSZWZ1bmRCb25kIGlzIGEgbm8tb3A6IGNyZWF0ZSBib25kIGlzIGEgcGxhdGZvcm0gZmVlIChjcmVkaXRlZCB0bw0KLy8gcHJvdG9jb2wgYXQgQ3JlYXRlKS4gS2VwdCBzbyBCdXkgY2FsbCBzaXRlcyBzdGF5IHN0YWJsZSBhY3Jvc3MgY3V0cy4NCmZ1bmMgbWF5YmVSZWZ1bmRCb25kKF8gcmVhbG0sIF8gKkxhdW5jaCkge30NCg0KLy8gcmVxdWlyZWRDcmVhdGVCb25kIHJldHVybnMgdWdub3QgdGhlIGNyZWF0b3IgbXVzdCBzZW5kLg0KLy8gUHJvZHVjdGlvbjogY3JlYXRlYm9uZC5DdXJyZW50Qm9uZFVnbm90KCkgKHByb21vIG9yIG5vcm1hbCkuDQovLyBVbml0IHRlc3RzICh0ZXN0U2tpcEJhbmtlcik6IGxvY2FsIENyZWF0ZUJvbmRVZ25vdCBjb25zdGFudC4NCmZ1bmMgcmVxdWlyZWRDcmVhdGVCb25kKCkgaW50NjQgew0KCWlmIHRlc3RTa2lwQmFua2VyIHsNCgkJcmV0dXJuIENyZWF0ZUJvbmRVZ25vdA0KCX0NCglyZXR1cm4gY3JlYXRlYm9uZC5DdXJyZW50Qm9uZFVnbm90KCkNCn0NCg0KLy8gQ3JlYXRlQm9uZFJlcXVpcmVkIGlzIGEgcHVibGljIGFsaWFzIGZvciBVSXMgLyBxZXZhbCAoc2FtZSBhcyByZXF1aXJlZENyZWF0ZUJvbmQpLg0KZnVuYyBDcmVhdGVCb25kUmVxdWlyZWQoKSBpbnQ2NCB7DQoJcmV0dXJuIHJlcXVpcmVkQ3JlYXRlQm9uZCgpDQp9DQoNCi8vIHJlcXVpcmVkTGlzdEZlZUducyByZXR1cm5zIEdOUyBiYXNlIHVuaXRzIHRoZSBjcmVhdG9yIG11c3QgcHJlLWZ1bmQgKGZyZWUgb24gcGFkKS4NCi8vIExpdmUgdmFsdWUgZnJvbSBTZXRMaXN0RmVlR25zOyBmYWxscyBiYWNrIHRvIExpc3RGZWVHbnMgY29uc3QuDQpmdW5jIHJlcXVpcmVkTGlzdEZlZUducygpIGludDY0IHsNCglpZiBsaXN0RmVlR25zTGl2ZSA+IDAgew0KCQlyZXR1cm4gbGlzdEZlZUduc0xpdmUNCgl9DQoJaWYgTGlzdEZlZUducyA+IDAgew0KCQlyZXR1cm4gTGlzdEZlZUducw0KCX0NCglyZXR1cm4gMTAwXzAwMF8wMDANCn0NCg0KLy8gTGlzdEZlZVJlcXVpcmVkIGlzIGEgcHVibGljIGFsaWFzIGZvciBVSXMgLyBxZXZhbC4NCmZ1bmMgTGlzdEZlZVJlcXVpcmVkKCkgaW50NjQgew0KCXJldHVybiByZXF1aXJlZExpc3RGZWVHbnMoKQ0KfQ0KDQovLyBmcmVlR25zT25QYWQgaXMgR05TIG9uIHBhZCBhYm92ZSBwZXItbGF1bmNoIGxpc3QtZmVlIGVzY3Jvdy4NCmZ1bmMgZnJlZUduc09uUGFkKCkgaW50NjQgew0KCWlmIHRlc3RTa2lwQmFua2VyIHsNCgkJLy8gVGVzdHMgc2tpcCBHTlMgaW52ZW50b3J5IGNoZWNrcy4NCgkJcmV0dXJuIHJlcXVpcmVkTGlzdEZlZUducygpDQoJfQ0KCWhhdmUgOj0gZ25zLkJhbGFuY2VPZihwYWRBZGRyKQ0KCWZyZWUgOj0gaGF2ZSAtIHRvdGFsTGlzdEZlZUducw0KCWlmIGZyZWUgPCAwIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGZyZWUNCn0NCg0KLy8gRnJlZUducyByZXR1cm5zIGZyZWV8aGF2ZXxyZXNlcnZlZCBmb3IgVUkgcHJlZmxpZ2h0IChHTlMgbGlzdCBmZWUpLg0KZnVuYyBGcmVlR25zKCkgc3RyaW5nIHsNCgloYXZlIDo9IGludDY0KDApDQoJaWYgIXRlc3RTa2lwQmFua2VyIHsNCgkJaGF2ZSA9IGducy5CYWxhbmNlT2YocGFkQWRkcikNCgl9DQoJZnJlZSA6PSBmcmVlR25zT25QYWQoKQ0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChmcmVlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChoYXZlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludCh0b3RhbExpc3RGZWVHbnMsIDEwKQ0KfQ0KDQovLyBsb2NrTGlzdEZlZUVzY3JvdyBlYXJtYXJrcyBmcmVlIEdOUyBmb3IgdGhpcyBsYXVuY2gncyBDcmVhdGVQb29sIGZlZS4NCmZ1bmMgbG9ja0xpc3RGZWVFc2Nyb3cobCAqTGF1bmNoLCBhbXQgaW50NjQpIHsNCglpZiBsID09IG5pbCB8fCBhbXQgPD0gMCB7DQoJCXJldHVybg0KCX0NCglpZiBmcmVlR25zT25QYWQoKSA8IGFtdCB7DQoJCWhhdmUgOj0gaW50NjQoMCkNCgkJaWYgIXRlc3RTa2lwQmFua2VyIHsNCgkJCWhhdmUgPSBnbnMuQmFsYW5jZU9mKHBhZEFkZHIpDQoJCX0NCgkJcGFuaWMoInBhZDogVHJhbnNmZXIgIiArIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApICsNCgkJCSIgR05TIHRvIHBhZCB0aGVuIENyZWF0ZSAoZnJlZT0iICsgc3RyY29udi5Gb3JtYXRJbnQoZnJlZUduc09uUGFkKCksIDEwKSArDQoJCQkiIGhhdmU9IiArIHN0cmNvbnYuRm9ybWF0SW50KGhhdmUsIDEwKSArDQoJCQkiIHJlc2VydmVkPSIgKyBzdHJjb252LkZvcm1hdEludCh0b3RhbExpc3RGZWVHbnMsIDEwKSArICIpIikNCgl9DQoJdG90YWxMaXN0RmVlR25zICs9IGFtdA0KCWwuTGlzdEZlZUducyA9IGFtdA0KCWwuTGlzdEZlZUNvbnN1bWVkID0gZmFsc2UNCn0NCg0KLy8gbGlzdEZlZUZvclZlbnVlOiBnbm9zd2FwIOKGkiBMaXN0RmVlUmVxdWlyZWQ7IHpkZXggLyBvdGhlciDihpIgMC4NCmZ1bmMgbGlzdEZlZUZvclZlbnVlKHZlbnVlSWQgc3RyaW5nKSBpbnQ2NCB7DQoJaWYgbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkKSA9PSBWZW51ZUdub3N3YXAgew0KCQlyZXR1cm4gcmVxdWlyZWRMaXN0RmVlR25zKCkNCgl9DQoJcmV0dXJuIDANCn0NCg0KLy8gTGlzdEZlZVJlcXVpcmVkRm9yIGlzIHZlbnVlLWF3YXJlIENyZWF0ZSBmZWUgZm9yIFVJIHByZWZsaWdodC4NCmZ1bmMgTGlzdEZlZVJlcXVpcmVkRm9yKHZlbnVlSWQgc3RyaW5nKSBpbnQ2NCB7DQoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpDQoJcmV0dXJuIGxpc3RGZWVGb3JWZW51ZSh2ZW51ZUlkKQ0KfQ0KDQovLyB1bmxvY2tMaXN0RmVlRXNjcm93IGNsZWFycyBsYXVuY2ggR05TIGVzY3JvdzsgcmVmdW5kIHNlbmRzIEdOUyBiYWNrIHRvIGNyZWF0b3IuDQpmdW5jIHVubG9ja0xpc3RGZWVFc2Nyb3coY3VyIHJlYWxtLCBsICpMYXVuY2gsIHJlZnVuZCBib29sKSB7DQoJaWYgbCA9PSBuaWwgfHwgbC5MaXN0RmVlR25zIDw9IDAgfHwgbC5MaXN0RmVlQ29uc3VtZWQgew0KCQlyZXR1cm4NCgl9DQoJYW10IDo9IGwuTGlzdEZlZUducw0KCWwuTGlzdEZlZUducyA9IDANCgl0b3RhbExpc3RGZWVHbnMgLT0gYW10DQoJaWYgdG90YWxMaXN0RmVlR25zIDwgMCB7DQoJCXRvdGFsTGlzdEZlZUducyA9IDANCgl9DQoJaWYgcmVmdW5kICYmICF0ZXN0U2tpcEJhbmtlciAmJiBhbXQgPiAwIHsNCgkJaGF2ZSA6PSBnbnMuQmFsYW5jZU9mKHBhZEFkZHIpDQoJCWlmIGhhdmUgPCBhbXQgew0KCQkJYW10ID0gaGF2ZQ0KCQl9DQoJCWlmIGFtdCA+IDAgew0KCQkJZ25zLlRyYW5zZmVyKGNyb3NzKGN1ciksIGwuQ3JlYXRvciwgYW10KQ0KCQl9DQoJfQ0KCWNoYWluLkVtaXQoIkxpc3RGZWVVbmxvY2tlZCIsDQoJCSJpZCIsIGwuSUQsDQoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChhbXQsIDEwKSwNCgkJInJlZnVuZCIsIHN0cmNvbnYuRm9ybWF0Qm9vbChyZWZ1bmQpLA0KCSkNCn0NCg0KLy8gc3luY0xpc3RGZWVGb3JWZW51ZSBhZGp1c3RzIGVzY3JvdyBhZnRlciBQcmVmZXJyZWRWZW51ZSBjaGFuZ2UgKHByZS1saXN0IG9ubHkpLg0KZnVuYyBzeW5jTGlzdEZlZUZvclZlbnVlKGN1ciByZWFsbSwgbCAqTGF1bmNoLCB2aWQgc3RyaW5nKSB7DQoJaWYgbCA9PSBuaWwgfHwgbC5MaXN0RmVlQ29uc3VtZWQgfHwgbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiIHsNCgkJcmV0dXJuDQoJfQ0KCXdhbnQgOj0gbGlzdEZlZUZvclZlbnVlKHZpZCkNCglpZiBsLkxpc3RGZWVHbnMgPT0gd2FudCB7DQoJCXJldHVybg0KCX0NCglpZiBsLkxpc3RGZWVHbnMgPiAwIHsNCgkJdW5sb2NrTGlzdEZlZUVzY3JvdyhjdXIsIGwsIHRydWUpDQoJfQ0KCWxvY2tMaXN0RmVlRXNjcm93KGwsIHdhbnQpDQp9DQoNCi8vIGNvbnN1bWVMaXN0RmVlRXNjcm93IGNsZWFycyBsYXVuY2ggZXNjcm93IGFmdGVyIHN1Y2Nlc3NmdWwgR25vc3dhcCBsaXN0DQovLyAoQ3JlYXRlUG9vbCBzcGVudCBmZWVOZWVkIEdOUyBmcm9tIHBhZCBiYWxhbmNlKS4NCmZ1bmMgY29uc3VtZUxpc3RGZWVFc2Nyb3cobCAqTGF1bmNoKSB7DQoJaWYgbCA9PSBuaWwgfHwgbC5MaXN0RmVlR25zIDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJYW10IDo9IGwuTGlzdEZlZUducw0KCXRvdGFsTGlzdEZlZUducyAtPSBhbXQNCglpZiB0b3RhbExpc3RGZWVHbnMgPCAwIHsNCgkJdG90YWxMaXN0RmVlR25zID0gMA0KCX0NCglsLkxpc3RGZWVHbnMgPSAwDQoJbC5MaXN0RmVlQ29uc3VtZWQgPSB0cnVlDQoJY2hhaW4uRW1pdCgiTGlzdEZlZUNvbnN1bWVkIiwgImlkIiwgbC5JRCwgImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApKQ0KfQ0KDQovLyBDbGFpbUxpc3RGZWUgcmVmdW5kcyBDcmVhdGUtdGltZSBHTlMgZXNjcm93IHRvIHRoZSB0b2tlbiBjcmVhdG9yIGlmIHN0aWxsIHVubGlzdGVkLg0KLy8gVXNlIHdoZW4gZ3JhZHVhdGUvbGlzdCB3aWxsIG5vdCBjb21wbGV0ZSBvciBjcmVhdG9yIGFiYW5kb25zIGxpc3RpbmcuDQpmdW5jIENsYWltTGlzdEZlZShjdXIgcmVhbG0sIGlkIHN0cmluZykgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWwgOj0gbXVzdExhdW5jaChpZCkNCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgY2FsbGVyICE9IGwuQ3JlYXRvciB7DQoJCXBhbmljKCJwYWQ6IG9ubHkgY3JlYXRvciBtYXkgY2xhaW0gbGlzdCBmZWUiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgew0KCQlwYW5pYygicGFkOiBhbHJlYWR5IGxpc3RlZCAtIGxpc3QgZmVlIHNwZW50IikNCgl9DQoJaWYgbC5MaXN0RmVlQ29uc3VtZWQgew0KCQlwYW5pYygicGFkOiBsaXN0IGZlZSBhbHJlYWR5IGNvbnN1bWVkIikNCgl9DQoJYW10IDo9IGwuTGlzdEZlZUducw0KCWlmIGFtdCA8PSAwIHsNCgkJcmV0dXJuIDANCgl9DQoJbC5MaXN0RmVlR25zID0gMA0KCXRvdGFsTGlzdEZlZUducyAtPSBhbXQNCglpZiB0b3RhbExpc3RGZWVHbnMgPCAwIHsNCgkJdG90YWxMaXN0RmVlR25zID0gMA0KCX0NCglpZiAhdGVzdFNraXBCYW5rZXIgJiYgYW10ID4gMCB7DQoJCWhhdmUgOj0gZ25zLkJhbGFuY2VPZihwYWRBZGRyKQ0KCQlpZiBoYXZlIDwgYW10IHsNCgkJCWFtdCA9IGhhdmUNCgkJfQ0KCQlpZiBhbXQgPiAwIHsNCgkJCWducy5UcmFuc2Zlcihjcm9zcyhjdXIpLCBsLkNyZWF0b3IsIGFtdCkNCgkJfQ0KCX0NCgljaGFpbi5FbWl0KCJDbGFpbUxpc3RGZWUiLA0KCQkiaWQiLCBpZCwNCgkJImNyZWF0b3IiLCBsLkNyZWF0b3IuU3RyaW5nKCksDQoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChhbXQsIDEwKSwNCgkpDQoJcmV0dXJuIGFtdA0KfQ0KDQovLyBDcmVhdGUgZGVwbG95cyBhIGZhaXItbGF1bmNoIG1lbWUuIENyZWF0ZSBib25kIChib25kIHJlYWxtIC8gZmFsbGJhY2sgY29uc3QpIGlzIGENCi8vIHBsYXRmb3JtIGZlZSBjcmVkaXRlZCB0byBwcm90b2NvbCBpbW1lZGlhdGVseSAobm90IHJlZnVuZGFibGUgZXNjcm93KS4NCi8vIEFsc28gbG9ja3MgTGlzdEZlZUducyBmcmVlIEdOUyB3aGVuIHZlbnVlIHJlcXVpcmVzIGl0IChjcmVhdG9yIFRyYW5zZmVyIEdOUyBmaXJzdCkuDQovLyBObyBwcmUtbWludDsgYWxsIHRyYWRlYWJsZSBmbG9hdCBzdGFydHMgb24gdGhlIGJvbmRpbmcgY3VydmUuDQpmdW5jIENyZWF0ZShjdXIgcmVhbG0sIG5hbWUsIHN5bWJvbCwgdXJpIHN0cmluZykgc3RyaW5nIHsNCglyZXF1aXJlSW5pdCgpDQoJc2VudCA6PSByZXF1aXJlVXNlclBheW1lbnQoY3VyKQ0KCWJvbmROZWVkIDo9IHJlcXVpcmVkQ3JlYXRlQm9uZCgpDQoJaWYgYm9uZE5lZWQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0ZSBib25kIG1pc2NvbmZpZ3VyZWQiKQ0KCX0NCglpZiBzZW50IDwgYm9uZE5lZWQgew0KCQlwYW5pYygicGFkOiBjcmVhdGUgYm9uZCB1bmRlcnBhaWQiKQ0KCX0NCglpZiBuYW1lID09ICIiIHx8IHN5bWJvbCA9PSAiIiB7DQoJCXBhbmljKCJwYWQ6IG5hbWUgYW5kIHN5bWJvbCByZXF1aXJlZCIpDQoJfQ0KCWlmIGxlbihzeW1ib2wpID4gMTIgew0KCQlwYW5pYygicGFkOiBzeW1ib2wgdG9vIGxvbmciKQ0KCX0NCglpZiBieVN5bWJvbC5IYXMoc3ltYm9sKSB7DQoJCXBhbmljKCJwYWQ6IHN5bWJvbCB0YWtlbiIpDQoJfQ0KCWV4dHJhIDo9IHNlbnQgLSBib25kTmVlZA0KCWlmIGV4dHJhID4gMCB7DQoJCWNyZWRpdFByb3RvY29sKGV4dHJhKQ0KCX0NCg0KCWNyZWF0b3IgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWQgOj0gbmV4dElELk5leHQoKS5TdHJpbmcoKQ0KDQoJLy8gUmVhbCBHUkMyMCBib3VuZCB0byB0aGlzIHBhZCByZWFsbSAobWludC9idXJuIG9ubHkgdmlhIHBhZCBsZWRnZXIpLg0KCS8vIERlY2ltYWxzPTA6IHdob2xlLXRva2VuIHVuaXRzIChtYXRjaGVzIGV4aXN0aW5nIHRyYWRlIGFtb3VudHMpLg0KCXRva2VuLCBsZWRnZXIgOj0gZ3JjMjAuTmV3VG9rZW4obmFtZSwgc3ltYm9sLCAwLCBuZXh0VG9rZW5JRC5OZXh0KCksIGN1cikNCg0KCS8vIEFkZW5hIChhbmQgR25vc3dhcCByZWdpc3RyaWVzKSByZXNvbHZlIHRva2VucyBPTkxZIHZpYSBncmMyMHJlZyB1bmRlciBrZXkNCgkvLyBwYWNrYWdlUGF0aC5TWU1CT0wgLSBUb2tlbi5JRCgpIGl0c2VsZiBpcyBwYWNrYWdlUGF0aC5TWU1CT0wuc2VxIGFuZCBpcw0KCS8vIHJlamVjdGVkIGFzICJJbnZhbGlkIHBhdGgiIGlmIHBhc3RlZCBpbnRvIEFkZW5hIHdpdGhvdXQgcmVnaXN0cmF0aW9uLg0KCS8vIFNraXAgaW4gdW5pdCB0ZXN0cyAodGVzdFNraXBCYW5rZXIpOyBwcm9kdWN0aW9uIGFsd2F5cyByZWdpc3RlcnMuDQoJcmVnS2V5IDo9ICIiDQoJaWYgIXRlc3RTa2lwQmFua2VyIHsNCgkJcmVnS2V5ID0gZ3JjMjByZWcuUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgdG9rZW4sIHN5bWJvbCkNCgl9DQoNCgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkNCglwcmVmIDo9IERlZmF1bHRMaXN0VmVudWUoKQ0KCXJldHVybiBmaW5pc2hDcmVhdGUoY3VyLCBpZCwgbmFtZSwgc3ltYm9sLCB1cmksIGNyZWF0b3IsIHRva2VuLCBsZWRnZXIsIHJlZ0tleSwgYm9uZE5lZWQsIHByZWYpDQp9DQoNCi8vIENyZWF0ZVdpdGhWZW51ZSBpcyBDcmVhdGUgKyBQcmVmZXJyZWRWZW51ZSBpbiBvbmUgTXNnQ2FsbCAoZmVlIGVzY3JvdyBmb2xsb3dzIHZlbnVlKS4NCi8vIHZlbnVlSWQ6ICJ6ZGV4IiDihpIgbm8gR05TIGxpc3QgZXNjcm93OyAiZ25vc3dhcCIg4oaSIExpc3RGZWVSZXF1aXJlZCBHTlMuDQpmdW5jIENyZWF0ZVdpdGhWZW51ZShjdXIgcmVhbG0sIG5hbWUsIHN5bWJvbCwgdXJpLCB2ZW51ZUlkIHN0cmluZykgc3RyaW5nIHsNCglyZXF1aXJlSW5pdCgpDQoJc2VudCA6PSByZXF1aXJlVXNlclBheW1lbnQoY3VyKQ0KCWJvbmROZWVkIDo9IHJlcXVpcmVkQ3JlYXRlQm9uZCgpDQoJaWYgYm9uZE5lZWQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0ZSBib25kIG1pc2NvbmZpZ3VyZWQiKQ0KCX0NCglpZiBzZW50IDwgYm9uZE5lZWQgew0KCQlwYW5pYygicGFkOiBjcmVhdGUgYm9uZCB1bmRlcnBhaWQiKQ0KCX0NCgluYW1lID0gc3RyaW5ncy5UcmltU3BhY2UobmFtZSkNCglzeW1ib2wgPSBzdHJpbmdzLlRyaW1TcGFjZShzeW1ib2wpDQoJdXJpID0gc3RyaW5ncy5UcmltU3BhY2UodXJpKQ0KCWlmIG5hbWUgPT0gIiIgfHwgc3ltYm9sID09ICIiIHsNCgkJcGFuaWMoInBhZDogbmFtZSBhbmQgc3ltYm9sIHJlcXVpcmVkIikNCgl9DQoJaWYgbGVuKHN5bWJvbCkgPiAxMiB7DQoJCXBhbmljKCJwYWQ6IHN5bWJvbCB0b28gbG9uZyIpDQoJfQ0KCWlmIGJ5U3ltYm9sLkhhcyhzeW1ib2wpIHsNCgkJcGFuaWMoInBhZDogc3ltYm9sIHRha2VuIikNCgl9DQoJZXh0cmEgOj0gc2VudCAtIGJvbmROZWVkDQoJaWYgZXh0cmEgPiAwIHsNCgkJY3JlZGl0UHJvdG9jb2woZXh0cmEpDQoJfQ0KCWNyZWF0b3IgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWQgOj0gbmV4dElELk5leHQoKS5TdHJpbmcoKQ0KCXRva2VuLCBsZWRnZXIgOj0gZ3JjMjAuTmV3VG9rZW4obmFtZSwgc3ltYm9sLCAwLCBuZXh0VG9rZW5JRC5OZXh0KCksIGN1cikNCglyZWdLZXkgOj0gIiINCglpZiAhdGVzdFNraXBCYW5rZXIgew0KCQlyZWdLZXkgPSBncmMyMHJlZy5SZWdpc3Rlcihjcm9zcyhjdXIpLCB0b2tlbiwgc3ltYm9sKQ0KCX0NCgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkNCgl2aWQgOj0gbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkKQ0KCWlmICF2ZW51ZUVuYWJsZWQodmlkKSB7DQoJCXBhbmljKCJwYWQ6IHZlbnVlIGRpc2FibGVkIG9yIHVua25vd24iKQ0KCX0NCglyZXR1cm4gZmluaXNoQ3JlYXRlKGN1ciwgaWQsIG5hbWUsIHN5bWJvbCwgdXJpLCBjcmVhdG9yLCB0b2tlbiwgbGVkZ2VyLCByZWdLZXksIGJvbmROZWVkLCB2aWQpDQp9DQoNCmZ1bmMgZmluaXNoQ3JlYXRlKA0KCWN1ciByZWFsbSwNCglpZCwgbmFtZSwgc3ltYm9sLCB1cmkgc3RyaW5nLA0KCWNyZWF0b3IgYWRkcmVzcywNCgl0b2tlbiAqZ3JjMjAuVG9rZW4sDQoJbGVkZ2VyICpncmMyMC5Qcml2YXRlTGVkZ2VyLA0KCXJlZ0tleSBzdHJpbmcsDQoJYm9uZE5lZWQgaW50NjQsDQoJcHJlZiBzdHJpbmcsDQopIHN0cmluZyB7DQoJbCA6PSAmTGF1bmNoew0KCQlJRDogICAgICAgICAgICAgaWQsDQoJCU5hbWU6ICAgICAgICAgICBuYW1lLA0KCQlTeW1ib2w6ICAgICAgICAgc3ltYm9sLA0KCQlVUkk6ICAgICAgICAgICAgdXJpLA0KCQlDcmVhdG9yOiAgICAgICAgY3JlYXRvciwNCgkJU3RhdHVzOiAgICAgICAgIFN0YXR1c0N1cnZlLA0KCQlDcmVhdGVkOiAgICAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpLA0KCQl0b2tlbjogICAgICAgICAgdG9rZW4sDQoJCWxlZGdlcjogICAgICAgICBsZWRnZXIsDQoJCVRva2VuSUQ6ICAgICAgICB0b2tlbi5JRCgpLA0KCQlWaXJ0dWFsVWdub3Q6ICAgVmlydHVhbFVnbm90MCwNCgkJVmlydHVhbFRva2VuOiAgIFZpcnR1YWxUb2tlbjAsDQoJCVVuaXF1ZUJ1eWVyczogICBhdmwuVHJlZXt9LA0KCQlzbmlwZUJvdWdodDogICAgYXZsLlRyZWV7fSwNCgkJQm9uZFVnbm90OiAgICAgIDAsICAgIC8vIGNyZWF0ZSBmZWUgYWxyZWFkeSBjcmVkaXRlZCB0byBwcm90b2NvbCBiZWxvdw0KCQlCb25kUmVmdW5kZWQ6ICAgdHJ1ZSwgLy8gbm8gY3JlYXRvciByZWZ1bmQgcGF0aA0KCQlUcmFkZXM6ICAgICAgICAgYXZsLlRyZWV7fSwNCgkJUHJlZmVycmVkVmVudWU6IHByZWYsDQoJfQ0KCS8vIENyZWF0ZSBib25kID0gcGxhdGZvcm0gZmVlIChiYW5rIHVnbm90LCBub3QgV1VHTk9UIGVzY3JvdykuIENsYWltIHZpYSBDbGFpbVByb3RvY29sRmVlcy4NCglpZiBib25kTmVlZCA+IDAgew0KCQljcmVkaXRCb25kRmVlKGJvbmROZWVkKQ0KCQljaGFpbi5FbWl0KCJCb25kRmVlIiwNCgkJCSJpZCIsIGlkLA0KCQkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGJvbmROZWVkLCAxMCksDQoJCQkiY3JlYXRvciIsIGNyZWF0b3IuU3RyaW5nKCksDQoJCSkNCgl9DQoJLy8gVmVudWUtYXdhcmUgbGlzdCBmZWU6IHpkZXgg4oaSIDAgR05TOyBnbm9zd2FwIOKGkiBMaXN0RmVlUmVxdWlyZWQuDQoJbG9ja0xpc3RGZWVFc2Nyb3cobCwgbGlzdEZlZUZvclZlbnVlKHByZWYpKQ0KCXJlY29yZFRyYWRlKGwsIFRyYWRlU2lkZU9wZW4sIDAsIDApDQoJbGF1bmNoZXMuU2V0KGlkLCBsKQ0KCWJ5U3ltYm9sLlNldChzeW1ib2wsIGlkKQ0KDQoJY2hhaW4uRW1pdCgiQ3JlYXRlZCIsDQoJCSJpZCIsIGlkLA0KCQkic3ltYm9sIiwgc3ltYm9sLA0KCQkiY3JlYXRvciIsIGNyZWF0b3IuU3RyaW5nKCksDQoJCSJ0b2tlbiIsIGwuVG9rZW5JRCwNCgkJInJlZyIsIHJlZ0tleSwNCgkJImxpc3RGZWVHbnMiLCBzdHJjb252LkZvcm1hdEludChsLkxpc3RGZWVHbnMsIDEwKSwNCgkJInByZWZlcnJlZFZlbnVlIiwgcHJlZiwNCgkJImJvbmRGZWUiLCBzdHJjb252LkZvcm1hdEludChib25kTmVlZCwgMTApLA0KCSkNCglub3RpZnlDcmVhdGUoY3VyLCBjcmVhdG9yLCBpZCkNCglyZXR1cm4gaWQNCn0NCg0KLy8gQWRlbmFQYXRoT2YgcmV0dXJucyB0aGUgZ3JjMjByZWcgLyBBZGVuYSB0b2tlbiBrZXk6IHBhY2thZ2VQYXRoLlNZTUJPTA0KLy8gKFRva2VuLklEIGlzIHBhY2thZ2VQYXRoLlNZTUJPTC5zZXEgLSBBZGVuYSByZWplY3RzIHRoYXQgZm9ybSkuDQpmdW5jIEFkZW5hUGF0aE9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJcmV0dXJuIGFkZW5hS2V5RnJvbVRva2VuSUQobC5Ub2tlbklELCBsLlN5bWJvbCkNCn0NCg0KLy8gYWRlbmFLZXlGcm9tVG9rZW5JRCBzdHJpcHMgdGhlIHRyYWlsaW5nIC5zZXEgZnJvbSBUb2tlbi5JRCB3aGVuIHByZXNlbnQuDQpmdW5jIGFkZW5hS2V5RnJvbVRva2VuSUQodG9rZW5JRCwgc3ltYm9sIHN0cmluZykgc3RyaW5nIHsNCglpZiB0b2tlbklEID09ICIiIHsNCgkJcmV0dXJuICIiDQoJfQ0KCS8vIFRva2VuLklEID0gcGFja2FnZVBhdGguc3ltYm9sLnNlcSAtPiByZWdpc3RyeSBrZXkgPSBwYWNrYWdlUGF0aC5zeW1ib2wNCglzdWZmaXggOj0gIi4iICsgc3ltYm9sICsgIi4iDQoJaWYgaSA6PSBzdHJpbmdzLkxhc3RJbmRleCh0b2tlbklELCBzdWZmaXgpOyBpID49IDAgew0KCQkvLyBwYWNrYWdlUGF0aCArICIuIiArIHN5bWJvbA0KCQlyZXR1cm4gdG9rZW5JRFs6aV0gKyAiLiIgKyBzeW1ib2wNCgl9DQoJLy8gQWxyZWFkeSBwYWNrYWdlUGF0aC5zeW1ib2wgb3IgdW5rbm93biBsYXlvdXQNCglpZiBzdHJpbmdzLkhhc1N1ZmZpeCh0b2tlbklELCAiLiIrc3ltYm9sKSB7DQoJCXJldHVybiB0b2tlbklEDQoJfQ0KCXJldHVybiB0b2tlbklEDQp9DQoNCi8vIG1heEdyb3NzRm9yTmV0SW4gZmluZHMgbGFyZ2VzdCBncm9zcyB1Z25vdCA8PSBzZW50TWF4IHdob3NlIGZlZS1zcGxpdCBuZXRJbiA8PSBtYXhOZXQuDQpmdW5jIG1heEdyb3NzRm9yTmV0SW4obWF4TmV0LCBzZW50TWF4IGludDY0KSBpbnQ2NCB7DQoJaWYgbWF4TmV0IDw9IDAgfHwgc2VudE1heCA8PSAwIHsNCgkJcmV0dXJuIDANCgl9DQoJbG8sIGhpIDo9IGludDY0KDApLCBzZW50TWF4DQoJZm9yIGxvIDwgaGkgew0KCQltaWQgOj0gKGxvICsgaGkgKyAxKSAvIDINCgkJZiA6PSBhbW1tYXRoLkFwcGx5RmVlKG1pZCwgRmVlQlBTLCBDcmVhdG9yRmVlU2hhcmVCUFMsIFByb3RvY29sRmVlU2hhcmVCUFMpDQoJCW5ldCA6PSBmLk5ldCArIGYuUmVtYWluZGVyDQoJCWlmIG5ldCA8PSBtYXhOZXQgew0KCQkJbG8gPSBtaWQNCgkJfSBlbHNlIHsNCgkJCWhpID0gbWlkIC0gMQ0KCQl9DQoJfQ0KCXJldHVybiBsbw0KfQ0KDQovLyByZWFkeVRvR3JhZHVhdGUgaXMgdHJ1ZSB3aGVuIHJhaXNlIG1ldCB0aGUgdGhyZXNob2xkLCBvciB0aGUgZW50aXJlIGN1cnZlDQovLyBmbG9hdCBpcyBzb2xkIChzb2xkLW91dCBlc2NhcGU6IHRocmVzaG9sZCBtYXkgYmUgdW5yZWFjaGFibGUgd2l0aCBiYWQgdmlydHVhbHMpLg0KZnVuYyByZWFkeVRvR3JhZHVhdGUobCAqTGF1bmNoKSBib29sIHsNCglpZiBsID09IG5pbCB8fCBsLlN0YXR1cyAhPSBTdGF0dXNDdXJ2ZSB7DQoJCXJldHVybiBmYWxzZQ0KCX0NCglpZiBsLlJhaXNlZFVnbm90IDw9IDAgew0KCQlyZXR1cm4gZmFsc2UNCgl9DQoJaWYgYW1tbWF0aC5DYW5HcmFkdWF0ZShsLlJhaXNlZFVnbm90LCBncmFkdWF0aW9uVGhyZXNob2xkKCkpIHsNCgkJcmV0dXJuIHRydWUNCgl9DQoJLy8gQ3VydmUgZXhoYXVzdGVkIGJlZm9yZSB0aHJlc2hvbGQ6IHN0aWxsIGdyYWR1YXRlIHdpdGggd2hhdGV2ZXIgd2FzIHJhaXNlZA0KCS8vIHNvIHRoZSBtYXJrZXQgaXMgbmV2ZXIgcGVybWFuZW50bHkgc3R1Y2sgb24gQnV5L0dyYWR1YXRlLg0KCXJldHVybiBsLlJlYWxTb2xkID49IEN1cnZlU3VwcGx5DQp9DQoNCi8vIEJ1eSBzcGVuZHMgV1VHTk9UIG9uIHRoZSBib25kaW5nIGN1cnZlOyBjcmVkaXRzIHRva2Vucy4NCi8vIGFtb3VudFd1Z25vdDogbWF4IHRvIHNwZW5kIChtYXkgb3ZlcnBheSkuIFVJOiBEZXBvc2l0ICsgVHJhbnNmZXIocGFkLCBhbXQpICsgQnV5Lg0KLy8gT3ZlcnBheSBzdGF5cyBhcyBjbGFpbWFibGUgcHJlcGFpZCDigJQgQ2xhaW1XdWdub3QgYW55dGltZSAoaW5jbC4gYWZ0ZXIgbGlzdCkuDQovLyBtaW5Ub2tlbnNPdXQ6IHNsaXBwYWdlIGZsb29yICgwID0gZGlzYWJsZWQpLiBBdXRvLWdyYWR1YXRlcyBhdCB0aHJlc2hvbGQgb3Igc29sZC1vdXQuDQovLw0KLy8gUHJvZHVjdGlvbjogY29sbGF0ZXJhbCBpcyByZWFsIFdVR05PVCBvbiBwYWQgLT4gR3JhZHVhdGUgY2FuIGF1dG8tbGlzdCBHbm9zd2FwLg0KLy8gVGVzdHMgKHRlc3RTa2lwQmFua2VyKTogYW1vdW50V3Vnbm90IGlnbm9yZWQ7IE9yaWdpblNlbmQgdWdub3QgaXMgdXNlZCBhcyB1bml0cy4NCi8vDQovLyBMYXN0LWZpbGwgKG5vIG92ZXJzaG9vdCk6DQovLyAgMS4gQ2FwIG5ldCBzbyBSYWlzZWRVZ25vdCBuZXZlciBleGNlZWRzIGdyYWR1YXRpb25UaHJlc2hvbGQoKSAocmVmdW5kIGV4Y2VzcyBXVUdOT1QpLg0KLy8gIDIuIENhcCBieSByZW1haW5pbmcgY3VydmUgdG9rZW5zIChDdXJ2ZVN1cHBseSAtIFJlYWxTb2xkKS4NCi8vDQovLyBJZiB0aGUgY3VydmUgaXMgYWxyZWFkeSBzb2xkIG91dCAob3IgcmFpc2UgYWxyZWFkeSBmaWxsZWQpLCBCdXkgcmVmdW5kcyB0aGUgZnVsbA0KLy8gdGFrZSBhbmQgZ3JhZHVhdGVzIHdoZW4gcmVhZHkgLSBubyBwYW5pYyBzbyB1c2VycyBhcmUgbm90IHN0dWNrIG1pZC10eC4NCmZ1bmMgQnV5KGN1ciByZWFsbSwgaWQgc3RyaW5nLCBhbW91bnRXdWdub3QsIG1pblRva2Vuc091dCBpbnQ2NCkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglzZW50IDo9IHRha2VXdWdub3RJbihjdXIsIGFtb3VudFd1Z25vdCkNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzQ3VydmUgew0KCQlwYW5pYygicGFkOiBub3Qgb24gY3VydmUgKHVzZSBTd2FwQnV5KSIpDQoJfQ0KCWJ1eWVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KDQoJcmVtYWluaW5nVG9rIDo9IEN1cnZlU3VwcGx5IC0gbC5SZWFsU29sZA0KCW5lZWRSYWlzZSA6PSBncmFkdWF0aW9uVGhyZXNob2xkKCkgLSBsLlJhaXNlZFVnbm90DQoJLy8gQWxyZWFkeSBjb21wbGV0ZTogcmVmdW5kIHBheW1lbnQgYW5kIGdyYWR1YXRlIChzb2xkLW91dCBvciByYWlzZS1maWxsZWQpLg0KCWlmIHJlbWFpbmluZ1RvayA8PSAwIHx8IG5lZWRSYWlzZSA8PSAwIHsNCgkJaWYgIXJlYWR5VG9HcmFkdWF0ZShsKSB7DQoJCQkvLyBFZGdlOiB6ZXJvIHJhaXNlIHdpdGggZW1wdHkgZmxvYXQgc2hvdWxkIG5vdCBoYXBwZW4gaW4gcHJvZHVjdGlvbi4NCgkJCWlmIHJlbWFpbmluZ1RvayA8PSAwIHsNCgkJCQlwYW5pYygicGFkOiBjdXJ2ZSBzb2xkIG91dCB3aXRoIG5vIHJhaXNlIikNCgkJCX0NCgkJCXBhbmljKCJwYWQ6IHJhaXNlIGZpbGxlZCAtIGNhbGwgR3JhZHVhdGUiKQ0KCQl9DQoJCWlmIHNlbnQgPiAwIHsNCgkJCS8vIEtlZXAgYXMgY2xhaW1hYmxlIGNyZWRpdCAoQ2xhaW1XdWdub3QpIOKAlCBzYWZlIGFmdGVyIGdyYWR1YXRlL2xpc3QgdG9vLg0KCQkJY3JlZGl0UmVmdW5kKGJ1eWVyLCBzZW50KQ0KCQkJY2hhaW4uRW1pdCgiQnV5UmVmdW5kIiwNCgkJCQkiaWQiLCBpZCwNCgkJCQkiYnV5ZXIiLCBidXllci5TdHJpbmcoKSwNCgkJCQkicmVmdW5kIiwgc3RyY29udi5Gb3JtYXRJbnQoc2VudCwgMTApLA0KCQkJCSJ0b0NyZWRpdCIsICIxIiwNCgkJCSkNCgkJfQ0KCQlncmFkdWF0ZShjdXIsIGwpDQoJCXJldHVybiAwDQoJfQ0KDQoJdXNlZEdyb3NzIDo9IHNlbnQNCglmZWUgOj0gYW1tbWF0aC5BcHBseUZlZSh1c2VkR3Jvc3MsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCS8vIE5ldCBlbnRlcnMgY3VydmU7IHJlbWFpbmRlciBib29zdHMgdmlydHVhbCB1Z25vdCAoc3RheXMgYXMgY29sbGF0ZXJhbCkuDQoJbmV0SW4gOj0gZmVlLk5ldCArIGZlZS5SZW1haW5kZXINCg0KCS8vIE1heCBuZXQgYWxsb3dlZDogbWluKHVzZXIgbmV0LCByZW1haW5pbmcgcmFpc2UsIHJlbWFpbmluZyB0b2tlbnMpLg0KCW1heE5ldCA6PSBuZXRJbg0KCWlmIG1heE5ldCA+IG5lZWRSYWlzZSB7DQoJCW1heE5ldCA9IG5lZWRSYWlzZQ0KCX0NCgltYXhOZXRUb2sgOj0gYW1tbWF0aC5NYXhOZXRJbkZvclRva2VuT3V0KGwuVmlydHVhbFVnbm90LCBsLlZpcnR1YWxUb2tlbiwgcmVtYWluaW5nVG9rKQ0KCWlmIG1heE5ldFRvayA+IDAgJiYgbWF4TmV0ID4gbWF4TmV0VG9rIHsNCgkJbWF4TmV0ID0gbWF4TmV0VG9rDQoJfQ0KCWlmIG1heE5ldCA8PSAwIHsNCgkJcGFuaWMoInBhZDogbm8gZmlsbCBjYXBhY2l0eSByZW1haW5pbmciKQ0KCX0NCg0KCS8vIENsYW1wIGdyb3NzICsgcmVjb21wdXRlIGZlZSB3aGVuIGNhcHMgYmluZCAobGFzdC1maWxsIHJlZnVuZCBwYXRoKS4NCglpZiBtYXhOZXQgPCBuZXRJbiB7DQoJCXVzZWRHcm9zcyA9IG1heEdyb3NzRm9yTmV0SW4obWF4TmV0LCBzZW50KQ0KCQlpZiB1c2VkR3Jvc3MgPD0gMCB7DQoJCQlwYW5pYygicGFkOiBidXkgdG9vIHNtYWxsIGZvciByZW1haW5pbmcgZmlsbCIpDQoJCX0NCgkJZmVlID0gYW1tbWF0aC5BcHBseUZlZSh1c2VkR3Jvc3MsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCQluZXRJbiA9IGZlZS5OZXQgKyBmZWUuUmVtYWluZGVyDQoJCWlmIG5ldEluID4gbWF4TmV0IHsNCgkJCW5ldEluID0gbWF4TmV0DQoJCX0NCgl9DQoNCgl0b2tlbnNPdXQsIG5ld1ZVLCBuZXdWVCA6PSBhbW1tYXRoLkJ1eVRva2VucyhsLlZpcnR1YWxVZ25vdCwgbC5WaXJ0dWFsVG9rZW4sIG5ldEluKQ0KCS8vIEludGVnZXIgZWRnZTogc3RlcCBkb3duIG5ldCB1bnRpbCB0b2tlbnMgPD0gcmVtYWluaW5nIGN1cnZlIHN1cHBseS4NCglmb3IgdG9rZW5zT3V0ID4gcmVtYWluaW5nVG9rICYmIG5ldEluID4gMSB7DQoJCW5ldEluLS0NCgkJdG9rZW5zT3V0LCBuZXdWVSwgbmV3VlQgPSBhbW1tYXRoLkJ1eVRva2VucyhsLlZpcnR1YWxVZ25vdCwgbC5WaXJ0dWFsVG9rZW4sIG5ldEluKQ0KCX0NCglpZiB0b2tlbnNPdXQgPiByZW1haW5pbmdUb2sgfHwgdG9rZW5zT3V0IDw9IDAgew0KCQlwYW5pYygicGFkOiBjYW5ub3QgZmlsbCByZW1haW5pbmcgY3VydmUgc3VwcGx5IikNCgl9DQoJLy8gSWYgbmV0IHdhcyByZWR1Y2VkIGZ1cnRoZXIsIHNocmluayB1c2VkR3Jvc3Mgc28gcmVmdW5kIGlzIGNvcnJlY3QuDQoJaWYgbmV0SW4gPCBtYXhOZXQgfHwgdXNlZEdyb3NzIDwgc2VudCB7DQoJCS8vIFJlLWRlcml2ZSBncm9zcyB0aGF0IHlpZWxkcyB0aGlzIG5ldEluICg8PSBzZW50KS4NCgkJZzIgOj0gbWF4R3Jvc3NGb3JOZXRJbihuZXRJbiwgc2VudCkNCgkJaWYgZzIgPiAwICYmIGcyIDwgdXNlZEdyb3NzIHsNCgkJCXVzZWRHcm9zcyA9IGcyDQoJCQlmZWUgPSBhbW1tYXRoLkFwcGx5RmVlKHVzZWRHcm9zcywgRmVlQlBTLCBDcmVhdG9yRmVlU2hhcmVCUFMsIFByb3RvY29sRmVlU2hhcmVCUFMpDQoJCQkvLyBLZWVwIGN1cnZlIG5ldEluIGFzIHNpbXVsYXRlZCAobWF5IGJlIHNsaWdodGx5IGJlbG93IGZlZS5OZXQrUmVtKS4NCgkJfQ0KCX0NCgkvLyBIYXJkIHNhZmV0eTogbmV2ZXIgb3ZlcnNob290IGdyYWR1YXRpb24gcmFpc2UgYWZ0ZXIgdGhpcyBidXkuDQoJaWYgbC5SYWlzZWRVZ25vdCtuZXRJbiA+IGdyYWR1YXRpb25UaHJlc2hvbGQoKSB7DQoJCW5ldEluID0gZ3JhZHVhdGlvblRocmVzaG9sZCgpIC0gbC5SYWlzZWRVZ25vdA0KCQlpZiBuZXRJbiA8PSAwIHsNCgkJCXBhbmljKCJwYWQ6IHJhaXNlIGZpbGxlZCAtIGNhbGwgR3JhZHVhdGUiKQ0KCQl9DQoJCXRva2Vuc091dCwgbmV3VlUsIG5ld1ZUID0gYW1tbWF0aC5CdXlUb2tlbnMobC5WaXJ0dWFsVWdub3QsIGwuVmlydHVhbFRva2VuLCBuZXRJbikNCgkJZm9yIHRva2Vuc091dCA+IHJlbWFpbmluZ1RvayAmJiBuZXRJbiA+IDEgew0KCQkJbmV0SW4tLQ0KCQkJdG9rZW5zT3V0LCBuZXdWVSwgbmV3VlQgPSBhbW1tYXRoLkJ1eVRva2VucyhsLlZpcnR1YWxVZ25vdCwgbC5WaXJ0dWFsVG9rZW4sIG5ldEluKQ0KCQl9DQoJCWlmIHRva2Vuc091dCA8PSAwIHsNCgkJCXBhbmljKCJwYWQ6IGNhbm5vdCBmaWxsIHJlbWFpbmluZyByYWlzZSIpDQoJCX0NCgkJdXNlZEdyb3NzID0gbWF4R3Jvc3NGb3JOZXRJbihuZXRJbiwgc2VudCkNCgkJaWYgdXNlZEdyb3NzIDw9IDAgew0KCQkJcGFuaWMoInBhZDogYnV5IHRvbyBzbWFsbCBmb3IgcmVtYWluaW5nIHJhaXNlIikNCgkJfQ0KCQlmZWUgPSBhbW1tYXRoLkFwcGx5RmVlKHVzZWRHcm9zcywgRmVlQlBTLCBDcmVhdG9yRmVlU2hhcmVCUFMsIFByb3RvY29sRmVlU2hhcmVCUFMpDQoJfQ0KDQoJcmVmdW5kIDo9IHNlbnQgLSB1c2VkR3Jvc3MNCglpZiByZWZ1bmQgPiAwIHsNCgkJLy8gT3ZlcnBheSBzdGF5cyBjbGFpbWFibGUg4oCUIHVzZXIgQ2xhaW1XdWdub3QgYW55dGltZSAoaW5jbC4gYWZ0ZXIgbGlzdCkuDQoJCWNyZWRpdFJlZnVuZChidXllciwgcmVmdW5kKQ0KCX0NCg0KCXJlcXVpcmVNaW5PdXQodG9rZW5zT3V0LCBtaW5Ub2tlbnNPdXQsICJ0b2tlbnMgb3V0IikNCgljaGVja0FuZEFkZFNuaXBlKGwsIGJ1eWVyLCB0b2tlbnNPdXQpDQoNCgkvLyBNdXRhdGUgb25seSBhZnRlciBhbGwgY2hlY2tzIHBhc3MuDQoJLy8gRmVlcyBzdGF5IGFzIFdVR05PVCBvbiBwYWQgKGxpYWJpbGl0aWVzKTsgbmV0SW4gaXMgcmFpc2VkIGNvbGxhdGVyYWwgZm9yIExQLg0KCWwuQ3JlYXRvckZlZXMgKz0gZmVlLkNyZWF0b3INCgljcmVkaXRQcm90b2NvbChmZWUuUHJvdG9jb2wpDQoJbC5WaXJ0dWFsVWdub3QgPSBuZXdWVQ0KCWwuVmlydHVhbFRva2VuID0gbmV3VlQNCglsLlJlYWxTb2xkICs9IHRva2Vuc091dA0KCWwuUmFpc2VkVWdub3QgKz0gbmV0SW4NCgkvLyBJbnZhcmlhbnQ6IHJhaXNlIG5ldmVyIGV4Y2VlZHMgdGhyZXNob2xkIGFmdGVyIEJ1eS4NCglpZiBsLlJhaXNlZFVnbm90ID4gZ3JhZHVhdGlvblRocmVzaG9sZCgpIHsNCgkJcGFuaWMoInBhZDogcmFpc2Ugb3ZlcnNob290IGludmFyaWFudCIpDQoJfQ0KDQoJYWRkQmFsKGwsIGJ1eWVyLCB0b2tlbnNPdXQpDQoJbm90ZUJ1eWVyKGwsIGJ1eWVyKQ0KCW1heWJlUmVmdW5kQm9uZChjdXIsIGwpDQoJcmVjb3JkVHJhZGUobCwgVHJhZGVTaWRlQnV5LCB1c2VkR3Jvc3MsIHRva2Vuc091dCkNCg0KCWNoYWluLkVtaXQoIkJ1eSIsDQoJCSJpZCIsIGlkLA0KCQkiYnV5ZXIiLCBidXllci5TdHJpbmcoKSwNCgkJInVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQodXNlZEdyb3NzLCAxMCksDQoJCSJ3dWdub3QiLCBzdHJjb252LkZvcm1hdEludCh1c2VkR3Jvc3MsIDEwKSwNCgkJInRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KHRva2Vuc091dCwgMTApLA0KCSkNCglpZiByZWZ1bmQgPiAwIHsNCgkJY2hhaW4uRW1pdCgiQnV5UmVmdW5kIiwNCgkJCSJpZCIsIGlkLA0KCQkJImJ1eWVyIiwgYnV5ZXIuU3RyaW5nKCksDQoJCQkicmVmdW5kIiwgc3RyY29udi5Gb3JtYXRJbnQocmVmdW5kLCAxMCksDQoJCSkNCgl9DQoJbm90aWZ5VHJhZGUoY3VyLCBidXllciwgaWQsIDAsIHVzZWRHcm9zcykNCg0KCWlmIHJlYWR5VG9HcmFkdWF0ZShsKSB7DQoJCWdyYWR1YXRlKGN1ciwgbCkNCgl9DQoJcmV0dXJuIHRva2Vuc091dA0KfQ0KDQovLyBSZW1haW5pbmdSYWlzZVVnbm90IGlzIG5ldCB1Z25vdCBzdGlsbCBuZWVkZWQgdG8gaGl0IGdyYWR1YXRpb25UaHJlc2hvbGQoKSAoMCBpZiBtZXQvb3ZlcikuDQpmdW5jIFJlbWFpbmluZ1JhaXNlVWdub3QoaWQgc3RyaW5nKSBpbnQ2NCB7DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0N1cnZlIHsNCgkJcmV0dXJuIDANCgl9DQoJaWYgbC5SYWlzZWRVZ25vdCA+PSBncmFkdWF0aW9uVGhyZXNob2xkKCkgew0KCQlyZXR1cm4gMA0KCX0NCglyZXR1cm4gZ3JhZHVhdGlvblRocmVzaG9sZCgpIC0gbC5SYWlzZWRVZ25vdA0KfQ0KDQovLyBTZWxsIGJ1cm5zIGN1cnZlIHRva2VucyBhbmQgcGF5cyBXVUdOT1QgKGZlZSBvbiBvdXRwdXQpLg0KLy8gbWluV3Vnbm90T3V0OiBzbGlwcGFnZSBmbG9vciAoMCA9IGRpc2FibGVkKS4gVXNlciBtYXkgd3Vnbm90LldpdGhkcmF3IHRvIHVnbm90Lg0KZnVuYyBTZWxsKGN1ciByZWFsbSwgaWQgc3RyaW5nLCB0b2tlbnNJbiwgbWluV3Vnbm90T3V0IGludDY0KSBpbnQ2NCB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJaWYgdG9rZW5zSW4gPD0gMCB7DQoJCXBhbmljKCJwYWQ6IHRva2Vuc0luIG11c3QgYmUgcG9zaXRpdmUiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzQ3VydmUgew0KCQlwYW5pYygicGFkOiBub3Qgb24gY3VydmUgKHVzZSBTd2FwU2VsbCkiKQ0KCX0NCglzZWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgYmFsT2YobCwgc2VsbGVyKSA8IHRva2Vuc0luIHsNCgkJcGFuaWMoInBhZDogaW5zdWZmaWNpZW50IHRva2VuIGJhbGFuY2UiKQ0KCX0NCg0KCWdyb3NzLCBuZXdWVSwgbmV3VlQgOj0gYW1tbWF0aC5TZWxsVG9rZW5zKGwuVmlydHVhbFVnbm90LCBsLlZpcnR1YWxUb2tlbiwgdG9rZW5zSW4pDQoJZmVlIDo9IGFtbW1hdGguQXBwbHlGZWVPbk91dHB1dChncm9zcywgRmVlQlBTLCBDcmVhdG9yRmVlU2hhcmVCUFMsIFByb3RvY29sRmVlU2hhcmVCUFMpDQoJcmVxdWlyZU1pbk91dChmZWUuTmV0LCBtaW5XdWdub3RPdXQsICJ3dWdub3Qgb3V0IikNCg0KCS8vIEZ1bGwgZ3Jvc3MgbGVmdCB2aXJ0dWFsIHJlc2VydmVzOyByZXRhaW4gZmVlIGluIHZpcnR1YWwgdWdub3QgKGNhc2ggc3RheXMgaW4gcmVhbG0pLg0KCWwuVmlydHVhbFVnbm90ID0gbmV3VlUgKyBmZWUuRmVlDQoJbC5WaXJ0dWFsVG9rZW4gPSBuZXdWVA0KCWwuUmVhbFNvbGQgLT0gdG9rZW5zSW4NCglpZiBsLlJlYWxTb2xkIDwgMCB7DQoJCWwuUmVhbFNvbGQgPSAwDQoJfQ0KDQoJLy8gVXNlciByZWNlaXZlcyBuZXQ7IGNyZWF0b3IrcHJvdG9jb2wgYmVjb21lIGZlZSBsaWFiaWxpdGllcyAobGVhdmUgUmFpc2VkKS4NCglwYXlPdXQgOj0gZmVlLk5ldCArIGZlZS5DcmVhdG9yICsgZmVlLlByb3RvY29sDQoJaWYgbC5SYWlzZWRVZ25vdCA+PSBwYXlPdXQgew0KCQlsLlJhaXNlZFVnbm90IC09IHBheU91dA0KCX0gZWxzZSB7DQoJCWwuUmFpc2VkVWdub3QgPSAwDQoJfQ0KCWwuQ3JlYXRvckZlZXMgKz0gZmVlLkNyZWF0b3INCgljcmVkaXRQcm90b2NvbChmZWUuUHJvdG9jb2wpDQoNCglhZGRCYWwobCwgc2VsbGVyLCAtdG9rZW5zSW4pDQoJcGF5V3Vnbm90T3V0KGN1ciwgc2VsbGVyLCBmZWUuTmV0KQ0KCXJlY29yZFRyYWRlKGwsIFRyYWRlU2lkZVNlbGwsIGZlZS5OZXQsIHRva2Vuc0luKQ0KDQoJY2hhaW4uRW1pdCgiU2VsbCIsDQoJCSJpZCIsIGlkLA0KCQkic2VsbGVyIiwgc2VsbGVyLlN0cmluZygpLA0KCQkidG9rZW5zIiwgc3RyY29udi5Gb3JtYXRJbnQodG9rZW5zSW4sIDEwKSwNCgkJInVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLk5ldCwgMTApLA0KCQkid3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLk5ldCwgMTApLA0KCSkNCglub3RpZnlUcmFkZShjdXIsIHNlbGxlciwgaWQsIDEsIGZlZS5OZXQpDQoJcmV0dXJuIGZlZS5OZXQNCn0NCg0KLy8gR3JhZHVhdGUgcGVybWlzc2lvbmxlc3NseSBtb3ZlcyBhIHJlYWR5IGN1cnZlIGludG8gYSBwZXJtYW5lbnRseSBsb2NrZWQgQ1BNTS4NCi8vIFJlYWR5IHdoZW4gUmFpc2VkVWdub3QgPj0gZ3JhZHVhdGlvblRocmVzaG9sZCgpLCBvciB3aGVuIFJlYWxTb2xkID49IEN1cnZlU3VwcGx5DQovLyB3aXRoIFJhaXNlZFVnbm90ID4gMCAoc29sZC1vdXQgYmVmb3JlIHRocmVzaG9sZCAtIGVzY2FwZSBoYXRjaCBmb3IgdW5yZWFjaGFibGUgcmFpc2UpLg0KZnVuYyBHcmFkdWF0ZShjdXIgcmVhbG0sIGlkIHN0cmluZykgew0KCXJlcXVpcmVJbml0KCkNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzQ3VydmUgew0KCQlwYW5pYygicGFkOiBhbHJlYWR5IGdyYWR1YXRlZCIpDQoJfQ0KCWlmICFyZWFkeVRvR3JhZHVhdGUobCkgew0KCQlwYW5pYygicGFkOiBub3QgcmVhZHkgdG8gZ3JhZHVhdGUgKG5lZWQgcmFpc2UgdGhyZXNob2xkIG9yIGN1cnZlIHNvbGQgb3V0KSIpDQoJfQ0KCWdyYWR1YXRlKGN1ciwgbCkNCn0NCg0KZnVuYyBncmFkdWF0ZShjdXIgcmVhbG0sIGwgKkxhdW5jaCkgew0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0N1cnZlIHsNCgkJcmV0dXJuDQoJfQ0KCS8vIExpcXVpZGl0eSBjYXBpdGFsID0gYWxsIHJhaXNlZCBHTk9ULiBUb2tlbiBzaWRlIGlzIHNpemVkIHRvIHRoZSBjdXJyZW50DQoJLy8gYm9uZGluZy1jdXJ2ZSBzcG90IHNvIGludGVybmFsIENQTU0gLyBHbm9zd2FwIG9wZW4gfiBsYXN0IGN1cnZlIHRyYWRlDQoJLy8gKHNlYW1sZXNzIGdyYWR1YXRlKS4gRHVtcGluZyBBTEwgdW5zb2xkIHRva2VucyBtYWRlIERFWCBzcG90IDw8IGN1cnZlIGV4aXQuDQoJcG9vbFUgOj0gbC5SYWlzZWRVZ25vdA0KCWlmIHBvb2xVIDw9IDAgew0KCQlwYW5pYygicGFkOiBlbXB0eSBwb29sIHVnbm90IikNCgl9DQoJcmVtYWluaW5nIDo9IFRvdGFsU3VwcGx5IC0gbC5SZWFsU29sZA0KCWlmIHJlbWFpbmluZyA8PSAwIHsNCgkJcGFuaWMoInBhZDogbm8gcmVtYWluaW5nIHRva2VucyBmb3IgbGlxdWlkaXR5IikNCgl9DQoJLy8gdG9rZW5zRm9yTFAgPSByYWlzZWQgKiBWaXJ0dWFsVG9rZW4gLyBWaXJ0dWFsVWdub3QgIChzYW1lIHVuaXRzIGFzIHJlc2VydmVzKS4NCgkvLyBVc2UgTXVsRGl2OiBwb29sVSAqIFZUIGNhbiBvdmVyZmxvdyBpbnQ2NCBhdCBtYWlubmV0IFZVMCAofjEwMmsgR05PVCkgc2NhbGUuDQoJcG9vbFQgOj0gcmVtYWluaW5nDQoJaWYgbC5WaXJ0dWFsVWdub3QgPiAwICYmIGwuVmlydHVhbFRva2VuID4gMCAmJiBwb29sVSA+IDAgew0KCQluZWVkZWQgOj0gYW1tbWF0aC5NdWxEaXYocG9vbFUsIGwuVmlydHVhbFRva2VuLCBsLlZpcnR1YWxVZ25vdCkNCgkJaWYgbmVlZGVkID4gMCAmJiBuZWVkZWQgPCByZW1haW5pbmcgew0KCQkJcG9vbFQgPSBuZWVkZWQNCgkJfQ0KCX0NCg0KCWwuUG9vbFVnbm90ID0gcG9vbFUNCglsLlBvb2xUb2tlbiA9IHBvb2xUDQoJbC5MZWZ0b3ZlclRva2VucyA9IHJlbWFpbmluZyAtIHBvb2xUDQoJbC5SYWlzZWRVZ25vdCA9IDANCglsLlZpcnR1YWxVZ25vdCA9IDANCglsLlZpcnR1YWxUb2tlbiA9IDANCglsLlN0YXR1cyA9IFN0YXR1c0dyYWR1YXRlZA0KDQoJLy8gTGVnYWN5OiBhbnkgcmVzaWR1YWwgQm9uZFVnbm90IChwcmUtZmVlLWN1dCBsYXVuY2hlcykg4oaSIGJhbmsgYm9uZCBmZWUgYXQgZ3JhZHVhdGUuDQoJaWYgIWwuQm9uZFJlZnVuZGVkICYmIGwuQm9uZFVnbm90ID4gMCB7DQoJCWNyZWRpdEJvbmRGZWUobC5Cb25kVWdub3QpDQoJCWwuQm9uZFVnbm90ID0gMA0KCQlsLkJvbmRSZWZ1bmRlZCA9IHRydWUNCgl9DQoNCgkvLyBNYXJrIGdyYWR1YXRpb24gb24gY2hhcnQgYXQgcG9vbCBzcG90IChtYXRjaGVzIGN1cnZlIGV4aXQgd2hlbiBzaXplZCBhYm92ZSkuDQoJcmVjb3JkVHJhZGUobCwgVHJhZGVTaWRlT3BlbiwgcG9vbFUsIHBvb2xUKQ0KDQoJLy8gTkVWRVIgYXV0by1saXN0IGluc2lkZSBCdXkvR3JhZHVhdGUuDQoJLy8gR25vc3dhcCBDcmVhdGVQb29sL01pbnQgZG9lcyBXVUdOT1QgQXBwcm92ZStUcmFuc2ZlckZyb207IHJlYWxtIHNwZW5kZXINCgkvLyBmcmFtZSBvZnRlbiBwYW5pY3MgImluc3VmZmljaWVudCBhbGxvd2FuY2UiIGFuZCBSRVZFUlRTIHRoZSBlbnRpcmUgQnV5DQoJLy8gKGluY2x1ZGluZyB0aGUgY3VydmUgZmlsbCB0aGF0IHRyaWdnZXJlZCBncmFkdWF0aW9uKS4gTGlzdCBpcyBhIHNlcGFyYXRlDQoJLy8gRU9BIGNhbGw6IHByZS1mdW5kIHBhZCBXVUdOT1QvR05TIHRoZW4gUmV0cnlMaXN0R25vc3dhcC4NCgkvLyBVbml0IHRlc3RzIG1heSBzdGlsbCBmb3JjZSBsaXN0IHZpYSB0ZXN0Rm9yY2VHbm9zd2FwTGlzdC4NCglsLkdub3N3YXBSZWFkeSA9IHRydWUNCglsaXN0ZWQgOj0gZmFsc2UNCglpZiB0ZXN0Rm9yY2VHbm9zd2FwTGlzdCB7DQoJCWxpc3RlZCA9IGxpc3RPbkdub3N3YXBXaXRoRnVuZGluZyhjdXIsIGwsIHBvb2xVLCBwb29sVCkNCgl9DQoJaWYgIWxpc3RlZCB7DQoJCS8vIEludGVybmFsIENQTU06IFBvb2xUb2tlbiBpcyBwYWQtYWNjb3VudGluZyByZXNlcnZlIChub3QgbWludGVkIEdSQzIwKS4NCgkJLy8gQ2lyY3VsYXRpbmcgPSB1c2VyIGJhbGFuY2VzOyBwb29sIHNpZGUgaXMgdmlydHVhbCByZXNlcnZlIFBvb2xUb2tlbi4NCgkJaWYgbC5Hbm9zd2FwTm90ZSA9PSAiIiB7DQoJCQlpZiBsLlByZWZlcnJlZFZlbnVlID09IFZlbnVlWmRleCB7DQoJCQkJbC5Hbm9zd2FwTm90ZSA9ICJpbnRlcm5hbCBDUE1NOyBSZWxlYXNlTGlzdFNlZWQg4oaSIEVPQSB6ZGV4IENyZWF0ZVBvb2wg4oaSIENvbmZpcm1aZGV4TGlzdCINCgkJCX0gZWxzZSB7DQoJCQkJbC5Hbm9zd2FwTm90ZSA9ICJpbnRlcm5hbCBDUE1NOyBUcmFuc2ZlciBXVUdOT1QrR05TIHRvIHBhZCB0aGVuIFJldHJ5TGlzdEdub3N3YXAiDQoJCQl9DQoJCX0NCgkJY2hhaW4uRW1pdCgiR3JhZHVhdGVkIiwNCgkJCSJpZCIsIGwuSUQsDQoJCQkicG9vbFVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFUsIDEwKSwNCgkJCSJwb29sVG9rZW4iLCBzdHJjb252LkZvcm1hdEludChwb29sVCwgMTApLA0KCQkJInRva2VuIiwgbC5Ub2tlbklELA0KCQkJImdub3N3YXBfbGlzdGVkIiwgIjAiLA0KCQkpDQoJCXJldHVybg0KCX0NCgkvLyBMaXN0ZWQgb24gR25vc3dhcCAodGVzdC1vbmx5IHBhdGgpOiBjYXBpdGFsIGlzIGluIHRoZSBDTCBwb3NpdGlvbiAoTkZUIG93bmVkIGJ5IHBhZCkuDQoJLy8gSW50ZXJuYWwgU3dhcEJ1eS9TZWxsIGRpc2FibGVkIChQb29sVWdub3QvUG9vbFRva2VuIGtlcHQgYXMgbGlzdGluZyByZWNvcmQpLg0KCWNoYWluLkVtaXQoIkdyYWR1YXRlZCIsDQoJCSJpZCIsIGwuSUQsDQoJCSJwb29sVWdub3QiLCBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApLA0KCQkicG9vbFRva2VuIiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFQsIDEwKSwNCgkJInRva2VuIiwgbC5Ub2tlbklELA0KCQkiZ25vc3dhcF9saXN0ZWQiLCAiMSIsDQoJCSJwb29sUGF0aCIsIGwuR25vc3dhcFBvb2xQYXRoLA0KCQkicG9zaXRpb25JZCIsIHN0cmNvbnYuRm9ybWF0VWludChsLkdub3N3YXBQb3NpdGlvbklELCAxMCksDQoJKQ0KfQ0KDQovLyBTZXRQcmVmZXJyZWRWZW51ZSBzZXRzIHRoZSBERVggdGFyZ2V0IHVzZWQgd2hlbiBSZXRyeUxpc3QoaWQsICIiKSBpcyBjYWxsZWQuDQovLyBDcmVhdG9yIG9yIHByb3RvY29sIG9ubHk7IGxvY2tlZCBvbmNlIGxpc3RlZC4gU3luY3MgQ3JlYXRlLXRpbWUgR05TIGVzY3Jvdw0KLy8gKGdub3N3YXAgbG9ja3MgTGlzdEZlZVJlcXVpcmVkOyB6ZGV4IHVubG9ja3MvcmVmdW5kcyBlc2Nyb3cpLg0KZnVuYyBTZXRQcmVmZXJyZWRWZW51ZShjdXIgcmVhbG0sIGlkLCB2ZW51ZUlkIHN0cmluZykgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWwgOj0gbXVzdExhdW5jaChpZCkNCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgY2FsbGVyICE9IGwuQ3JlYXRvciAmJiBjYWxsZXIgIT0gcHJvdG9jb2xBZGRyIHsNCgkJcGFuaWMoInBhZDogY3JlYXRvciBvciBwcm90b2NvbCBvbmx5IikNCgl9DQoJaWYgbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiIHsNCgkJcGFuaWMoInBhZDogYWxyZWFkeSBsaXN0ZWQiKQ0KCX0NCgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkNCgl2aWQgOj0gbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkKQ0KCWlmICF2ZW51ZUVuYWJsZWQodmlkKSB7DQoJCXBhbmljKCJwYWQ6IHZlbnVlIGRpc2FibGVkIG9yIHVua25vd24iKQ0KCX0NCglsLlByZWZlcnJlZFZlbnVlID0gdmlkDQoJc3luY0xpc3RGZWVGb3JWZW51ZShjdXIsIGwsIHZpZCkNCgljaGFpbi5FbWl0KCJTZXRQcmVmZXJyZWRWZW51ZSIsDQoJCSJpZCIsIGlkLA0KCQkidmVudWUiLCB2aWQsDQoJCSJsaXN0RmVlR25zIiwgc3RyY29udi5Gb3JtYXRJbnQobC5MaXN0RmVlR25zLCAxMCksDQoJKQ0KfQ0KDQovLyBQcmVmZXJyZWRWZW51ZU9mIHJldHVybnMgdGhlIENyZWF0ZS10aW1lIC8gU2V0UHJlZmVycmVkVmVudWUgdGFyZ2V0Lg0KZnVuYyBQcmVmZXJyZWRWZW51ZU9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuUHJlZmVycmVkVmVudWUNCn0NCg0KLy8gTGlzdFNlZWRSZWxlYXNlZE9mIHJlcG9ydHMgd2hldGhlciBSZWxlYXNlTGlzdFNlZWQgYWxyZWFkeSByYW4uDQpmdW5jIExpc3RTZWVkUmVsZWFzZWRPZihpZCBzdHJpbmcpIGJvb2wgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5MaXN0U2VlZFJlbGVhc2VkDQp9DQoNCi8vIFJlbGVhc2VMaXN0U2VlZCBzZW5kcyBncmFkdWF0ZWQgaW50ZXJuYWwtQ1BNTSBzZWVkIHRvIHRoZSBjcmVhdG9yIGZvciBFT0EgemRleCBDcmVhdGVQb29sOg0KLy8gICAtIFBvb2xVZ25vdCBhcyBXVUdOT1QgVHJhbnNmZXIgdG8gY3JlYXRvciAoRU9BIG1heSB3dWdub3QuV2l0aGRyYXcg4oaSIHVnbm90IE9yaWdpblNlbmQpDQovLyAgIC0gUG9vbFRva2VuIG1pbnRlZCBhcyBHUkMyMCB0byBjcmVhdG9yICh3YXMgcGFkLWFjY291bnRpbmcgb25seSkNCi8vIFBvb2xVZ25vdC9Qb29sVG9rZW4ga2VwdCBhcyBsaXN0aW5nLXNpemUgcmVjb3JkOyByZXNlcnZlZFd1Z25vdCBza2lwcyB2aWEgTGlzdFNlZWRSZWxlYXNlZC4NCi8vIERpc2FibGVzIGludGVybmFsIFN3YXBCdXkvU2VsbC4gQ3JlYXRvciBvciBwcm90b2NvbCBtYXkgY2FsbDsgYXNzZXRzIGFsd2F5cyBnbyB0byBjcmVhdG9yLg0KZnVuYyBSZWxlYXNlTGlzdFNlZWQoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGNhbGxlciAhPSBsLkNyZWF0b3IgJiYgY2FsbGVyICE9IHByb3RvY29sQWRkciB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0b3Igb3IgcHJvdG9jb2wgb25seSIpDQoJfQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0dyYWR1YXRlZCB7DQoJCXBhbmljKCJwYWQ6IG5vdCBncmFkdWF0ZWQiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlwYW5pYygicGFkOiBhbHJlYWR5IGxpc3RlZCIpDQoJfQ0KCWlmIGwuTGlzdFNlZWRSZWxlYXNlZCB7DQoJCXBhbmljKCJwYWQ6IGxpc3Qgc2VlZCBhbHJlYWR5IHJlbGVhc2VkIikNCgl9DQoJcG9vbFUgOj0gbC5Qb29sVWdub3QNCglwb29sVCA6PSBsLlBvb2xUb2tlbg0KCWlmIHBvb2xVIDw9IDAgfHwgcG9vbFQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGVtcHR5IGludGVybmFsIHBvb2wiKQ0KCX0NCgkvLyBGYWlsLWNsb3NlZDogbXVzdCBmdWxseSBmdW5kIGNyZWF0b3IgYmVmb3JlIGtpbGxpbmcgaW50ZXJuYWwgQ1BNTS4NCglpZiAhdGVzdFNraXBCYW5rZXIgew0KCQloYXZlIDo9IHd1Z25vdC5CYWxhbmNlT2YocGFkQWRkcikNCgkJaWYgaGF2ZSA8IHBvb2xVIHsNCgkJCXBhbmljKCJwYWQ6IHVuZGVyZnVuZGVkIFdVR05PVCBmb3IgbGlzdCBzZWVkIHJlbGVhc2UiKQ0KCQl9DQoJfQ0KCS8vIE1hcmsgcmVsZWFzZWQgYmVmb3JlIFRyYW5zZmVyIHNvIHJlc2VydmVkV3Vnbm90IGRyb3BzIGluIHNhbWUgdHguDQoJLy8gS2VlcCBQb29sVWdub3QvUG9vbFRva2VuIGFzIGxpc3Rpbmctc2l6ZSByZWNvcmQgKHJlc2VydmVkV3Vnbm90IHNraXBzIHZpYSBMaXN0U2VlZFJlbGVhc2VkKS4NCglsLkxpc3RTZWVkUmVsZWFzZWQgPSB0cnVlDQoJbC5MaXFXdWdub3RVc2VkID0gcG9vbFUNCglsLkdub3N3YXBOb3RlID0gImxpc3Qgc2VlZCByZWxlYXNlZCB0byBjcmVhdG9yIGZvciB6ZGV4IENyZWF0ZVBvb2w7IHRoZW4gQ29uZmlybVpkZXhMaXN0Ig0KCWlmICF0ZXN0U2tpcEJhbmtlciB7DQoJCXd1Z25vdC5UcmFuc2Zlcihjcm9zcyhjdXIpLCBsLkNyZWF0b3IsIHBvb2xVKQ0KCX0gZWxzZSB7DQoJCXBheVd1Z25vdE91dChjdXIsIGwuQ3JlYXRvciwgcG9vbFUpDQoJfQ0KCWFkZEJhbChsLCBsLkNyZWF0b3IsIHBvb2xUKQ0KCWNoYWluLkVtaXQoIlJlbGVhc2VMaXN0U2VlZCIsDQoJCSJpZCIsIGlkLA0KCQkidG8iLCBsLkNyZWF0b3IuU3RyaW5nKCksDQoJCSJ3dWdub3QiLCBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApLA0KCQkidG9rZW5zIiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFQsIDEwKSwNCgkpDQp9DQoNCi8vIENvbmZpcm1aZGV4TGlzdCBtYXJrcyBhIGxhdW5jaCBsaXN0ZWQgb24gemRleCBhZnRlciBFT0EgQ3JlYXRlUG9vbCBzdWNjZWVkZWQuDQovLyBwb29sSWQgZS5nLiAidWdub3R8U1lNQk9MIiAobXVzdCBiZSBub24tZW1wdHk7IG5vIG9uLWNoYWluIHBvb2wgdmVyaWZ5KS4NCi8vIENyZWF0b3Igb3IgcHJvdG9jb2wuIFByZWZlciBSZWxlYXNlTGlzdFNlZWQgZmlyc3Qgd2hlbiBwYWQgc3RpbGwgaG9sZHMgTFAgc2VlZC4NCmZ1bmMgQ29uZmlybVpkZXhMaXN0KGN1ciByZWFsbSwgaWQsIHBvb2xJZCBzdHJpbmcpIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGNhbGxlciAhPSBsLkNyZWF0b3IgJiYgY2FsbGVyICE9IHByb3RvY29sQWRkciB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0b3Igb3IgcHJvdG9jb2wgb25seSIpDQoJfQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0dyYWR1YXRlZCB7DQoJCXBhbmljKCJwYWQ6IG5vdCBncmFkdWF0ZWQiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlwYW5pYygicGFkOiBhbHJlYWR5IGxpc3RlZCIpDQoJfQ0KCS8vIEF2b2lkIG1hcmtpbmcgbGlzdGVkIHdoaWxlIHBhZCBzdGlsbCBob2xkcyB1bnJlbGVhc2VkIExQIGNhcGl0YWwuDQoJaWYgIWwuTGlzdFNlZWRSZWxlYXNlZCAmJiAobC5Qb29sVWdub3QgPiAwIHx8IGwuUG9vbFRva2VuID4gMCkgew0KCQlwYW5pYygicGFkOiBSZWxlYXNlTGlzdFNlZWQgZmlyc3QgKG9yIGVtcHR5IHBvb2wpIikNCgl9DQoJcG9vbElkID0gc3RyaW5ncy5UcmltU3BhY2UocG9vbElkKQ0KCWlmIHBvb2xJZCA9PSAiIiB7DQoJCXBhbmljKCJwYWQ6IGVtcHR5IHBvb2xJZCIpDQoJfQ0KCWwuTGlzdFZlbnVlID0gVmVudWVaZGV4DQoJbC5Hbm9zd2FwTGlzdGVkID0gdHJ1ZSAvLyBVSS9jb21wYXQ6ICJsaXN0ZWQgb24gREVYIg0KCWwuR25vc3dhcFBvb2xQYXRoID0gcG9vbElkDQoJbC5Hbm9zd2FwUG9zaXRpb25JRCA9IDANCglpZiBsLkxpcVd1Z25vdFVzZWQgPT0gMCB7DQoJCWwuTGlxV3Vnbm90VXNlZCA9IGwuUG9vbFVnbm90DQoJfQ0KCWwuR25vc3dhcE5vdGUgPSAiY29uZmlybWVkIHpkZXggbGlzdDsgcG9vbD0iICsgcG9vbElkDQoJY2hhaW4uRW1pdCgiQ29uZmlybVpkZXhMaXN0IiwNCgkJImlkIiwgaWQsDQoJCSJwb29sUGF0aCIsIHBvb2xJZCwNCgkJInN5bWJvbCIsIGwuU3ltYm9sLA0KCQkidmVudWUiLCBWZW51ZVpkZXgsDQoJKQ0KCWNoYWluLkVtaXQoIkxpc3RlZFJldHJ5IiwNCgkJImlkIiwgaWQsDQoJCSJ2ZW51ZSIsIFZlbnVlWmRleCwNCgkJInBvb2xQYXRoIiwgcG9vbElkLA0KCQkicG9zaXRpb25JZCIsICIwIiwNCgkJInBvb2xVZ25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGwuUG9vbFVnbm90LCAxMCksDQoJCSJwb29sVG9rZW4iLCBzdHJjb252LkZvcm1hdEludChsLlBvb2xUb2tlbiwgMTApLA0KCSkNCn0NCg0KLy8gUmV0cnlMaXN0IGxpc3RzIGEgZ3JhZHVhdGVkIGxhdW5jaCBvbiB0aGUgY2hvc2VuIHZlbnVlLg0KLy8gUGVybWlzc2lvbmxlc3MgRU9BIE1zZ0NhbGwuIFVzZXMgUG9vbFVnbm90IC8gUG9vbFRva2VuIChjdXJ2ZS1zcG90IHNpemVkKS4NCi8vIHZlbnVlSWQ6IGVtcHR5IOKGkiBQcmVmZXJyZWRWZW51ZSDihpIgRGVmYXVsdExpc3RWZW51ZSgpOyB1bmtub3duL2Rpc2FibGVkIOKGkiBzb2Z0LWZhaWwgbm90ZS4NCmZ1bmMgUmV0cnlMaXN0KGN1ciByZWFsbSwgaWQsIHZlbnVlSWQgc3RyaW5nKSBib29sIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzR3JhZHVhdGVkIHsNCgkJcGFuaWMoInBhZDogbm90IGdyYWR1YXRlZCIpDQoJfQ0KCWlmIGwuR25vc3dhcExpc3RlZCB8fCBsLkxpc3RWZW51ZSAhPSAiIiB7DQoJCXBhbmljKCJwYWQ6IGFscmVhZHkgbGlzdGVkIikNCgl9DQoJaWYgbC5MaXN0U2VlZFJlbGVhc2VkIHsNCgkJcGFuaWMoInBhZDogbGlzdCBzZWVkIHJlbGVhc2VkIC0gdXNlIENvbmZpcm1aZGV4TGlzdCBhZnRlciBFT0EgQ3JlYXRlUG9vbCIpDQoJfQ0KCXBvb2xVIDo9IGwuUG9vbFVnbm90DQoJcG9vbFQgOj0gbC5Qb29sVG9rZW4NCglpZiBwb29sVSA8PSAwIHx8IHBvb2xUIDw9IDAgew0KCQlwYW5pYygicGFkOiBlbXB0eSBpbnRlcm5hbCBwb29sIikNCgl9DQoJcmF3IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHZlbnVlSWQpDQoJaWYgcmF3ID09ICIiICYmIGwuUHJlZmVycmVkVmVudWUgIT0gIiIgew0KCQlyYXcgPSBsLlByZWZlcnJlZFZlbnVlDQoJfQ0KCXZpZCA6PSBub3JtYWxpemVWZW51ZUlEKHJhdykNCglvayA6PSB0cnlMaXN0VmVudWUoY3VyLCBsLCB2aWQsIHBvb2xVLCBwb29sVCkNCglpZiBvayB7DQoJCWNoYWluLkVtaXQoIkxpc3RlZFJldHJ5IiwNCgkJCSJpZCIsIGwuSUQsDQoJCQkidmVudWUiLCBsLkxpc3RWZW51ZSwNCgkJCSJwb29sUGF0aCIsIGwuR25vc3dhcFBvb2xQYXRoLA0KCQkJInBvc2l0aW9uSWQiLCBzdHJjb252LkZvcm1hdFVpbnQobC5Hbm9zd2FwUG9zaXRpb25JRCwgMTApLA0KCQkJInBvb2xVZ25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KHBvb2xVLCAxMCksDQoJCQkicG9vbFRva2VuIiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFQsIDEwKSwNCgkJKQ0KCQkvLyBDb21wYXQgZXZlbnQgbmFtZSBmb3IgaW5kZXhlcnMgdGhhdCBsaXN0ZW4gZm9yIEdub3N3YXBMaXN0ZWRSZXRyeS4NCgkJaWYgbC5MaXN0VmVudWUgPT0gVmVudWVHbm9zd2FwIHsNCgkJCWNoYWluLkVtaXQoIkdub3N3YXBMaXN0ZWRSZXRyeSIsDQoJCQkJImlkIiwgbC5JRCwNCgkJCQkicG9vbFBhdGgiLCBsLkdub3N3YXBQb29sUGF0aCwNCgkJCQkicG9zaXRpb25JZCIsIHN0cmNvbnYuRm9ybWF0VWludChsLkdub3N3YXBQb3NpdGlvbklELCAxMCksDQoJCQkJInBvb2xVZ25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KHBvb2xVLCAxMCksDQoJCQkJInBvb2xUb2tlbiIsIHN0cmNvbnYuRm9ybWF0SW50KHBvb2xULCAxMCksDQoJCQkpDQoJCX0NCgl9IGVsc2UgaWYgbC5Hbm9zd2FwTm90ZSA9PSAiIiB7DQoJCWwuR25vc3dhcE5vdGUgPSAicmV0cnkgbGlzdCBmYWlsZWQgLSBjaGVjayBMaXN0TmVlZCAvIExpc3ROZWVkRm9yOyB2ZW51ZT0iICsgdmlkDQoJfQ0KCXJldHVybiBvaw0KfQ0KDQovLyBSZXRyeUxpc3RHbm9zd2FwIGlzIHRoZSBHbm9zd2FwLXNwZWNpZmljIHdyYXBwZXIgKGNvbXBhdCBmb3IgZXhpc3RpbmcgVUkpLg0KZnVuYyBSZXRyeUxpc3RHbm9zd2FwKGN1ciByZWFsbSwgaWQgc3RyaW5nKSBib29sIHsNCglyZXR1cm4gUmV0cnlMaXN0KGN1ciwgaWQsIFZlbnVlR25vc3dhcCkNCn0NCg0KLy8gVG9rZW5JRE9mIHJldHVybnMgdGhlIEdSQzIwIFRva2VuLklEKCkgZm9yIGEgbGF1bmNoLg0KZnVuYyBUb2tlbklET2YoaWQgc3RyaW5nKSBzdHJpbmcgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5Ub2tlbklEDQp9DQoNCi8vIEdSQzIwQmFuayByZXR1cm5zIHRoZSB1bmRlcmx5aW5nICpncmMyMC5Ub2tlbiBmb3IgaW50ZXJvcCAobWV0YWRhdGEgLyBleHRlcm5hbCBERVgpLg0KLy8gRG9lcyBub3QgZXhwb3NlIFByaXZhdGVMZWRnZXIgLSBtaW50L2J1cm4gc3RheSBwYWQtb25seS4NCmZ1bmMgR1JDMjBCYW5rKGlkIHN0cmluZykgKmdyYzIwLlRva2VuIHsNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC50b2tlbiA9PSBuaWwgew0KCQlwYW5pYygicGFkOiBubyB0b2tlbiIpDQoJfQ0KCXJldHVybiBsLnRva2VuDQp9DQoNCi8vIFN3YXBCdXkgYnV5cyB0b2tlbnMgZnJvbSB0aGUgZ3JhZHVhdGVkIGludGVybmFsIHBvb2wgd2l0aCBXVUdOT1QuDQovLyBhbW91bnRXdWdub3Q6IG1heCB0byBzcGVuZCAoQXBwcm92ZSBwYWQpLiBtaW5Ub2tlbnNPdXQ6IHNsaXBwYWdlICgwID0gb2ZmKS4NCi8vIERpc2FibGVkIHdoZW4gbGlzdGVkIG9uIEdub3N3YXAgKHRyYWRlIHZpYSByb3V0ZXIpLg0KZnVuYyBTd2FwQnV5KGN1ciByZWFsbSwgaWQgc3RyaW5nLCBhbW91bnRXdWdub3QsIG1pblRva2Vuc091dCBpbnQ2NCkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglzZW50IDo9IHRha2VXdWdub3RJbihjdXIsIGFtb3VudFd1Z25vdCkNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzR3JhZHVhdGVkIHsNCgkJcGFuaWMoInBhZDogbm90IGdyYWR1YXRlZCAodXNlIEJ1eSkiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlwYW5pYygicGFkOiBsaXN0ZWQgb24gREVYIC0gdHJhZGUgdmlhIHJvdXRlciwgbm90IHBhZCBTd2FwQnV5IikNCgl9DQoJaWYgbC5MaXN0U2VlZFJlbGVhc2VkIHsNCgkJcGFuaWMoInBhZDogbGlzdCBzZWVkIHJlbGVhc2VkIC0gZmluaXNoIHpkZXggQ3JlYXRlUG9vbCArIENvbmZpcm1aZGV4TGlzdCIpDQoJfQ0KCWJ1eWVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KDQoJZmVlIDo9IGFtbW1hdGguQXBwbHlGZWUoc2VudCwgRmVlQlBTLCBDcmVhdG9yRmVlU2hhcmVCUFMsIFByb3RvY29sRmVlU2hhcmVCUFMpDQoJdG9rZW5zT3V0LCBuZXdQVSwgbmV3UFQgOj0gYW1tbWF0aC5Qb29sU3dhcFVnbm90Rm9yVG9rZW4oDQoJCWwuUG9vbFVnbm90LCBsLlBvb2xUb2tlbiwgZmVlLk5ldCwgZmVlLlJlbWFpbmRlciwNCgkpDQoJcmVxdWlyZU1pbk91dCh0b2tlbnNPdXQsIG1pblRva2Vuc091dCwgInRva2VucyBvdXQiKQ0KDQoJLy8gUmVmdW5kIHVudXNlZCBncm9zcyBpZiBwb29sIG1hdGggdXNlZCBsZXNzIChyYXJlKTsgZmVlcyBmcm9tIHNlbnQuDQoJLy8gUG9vbCBzd2FwIHVzZXMgZmVlLk5ldCBpbnRvIHBvb2w7IGZ1bGwgc2VudCBzdGF5cyBhcyBmZWUrcG9vbCBjb250cmlidXRpb24uDQoJbC5DcmVhdG9yRmVlcyArPSBmZWUuQ3JlYXRvcg0KCWNyZWRpdFByb3RvY29sKGZlZS5Qcm90b2NvbCkNCglsLlBvb2xVZ25vdCA9IG5ld1BVDQoJbC5Qb29sVG9rZW4gPSBuZXdQVA0KCWFkZEJhbChsLCBidXllciwgdG9rZW5zT3V0KQ0KCW5vdGVCdXllcihsLCBidXllcikNCglyZWNvcmRUcmFkZShsLCBUcmFkZVNpZGVCdXksIHNlbnQsIHRva2Vuc091dCkNCg0KCWNoYWluLkVtaXQoIlN3YXBCdXkiLA0KCQkiaWQiLCBpZCwNCgkJImJ1eWVyIiwgYnV5ZXIuU3RyaW5nKCksDQoJCSJ1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KHNlbnQsIDEwKSwNCgkJInd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KHNlbnQsIDEwKSwNCgkJInRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KHRva2Vuc091dCwgMTApLA0KCSkNCglub3RpZnlUcmFkZShjdXIsIGJ1eWVyLCBpZCwgMCwgc2VudCkNCglyZXR1cm4gdG9rZW5zT3V0DQp9DQoNCi8vIFN3YXBTZWxsIHNlbGxzIHRva2VucyBpbnRvIHRoZSBncmFkdWF0ZWQgcG9vbCBmb3IgV1VHTk9ULg0KLy8gbWluV3Vnbm90T3V0OiBzbGlwcGFnZSBmbG9vciAoMCA9IGRpc2FibGVkKS4NCmZ1bmMgU3dhcFNlbGwoY3VyIHJlYWxtLCBpZCBzdHJpbmcsIHRva2Vuc0luLCBtaW5XdWdub3RPdXQgaW50NjQpIGludDY0IHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglpZiB0b2tlbnNJbiA8PSAwIHsNCgkJcGFuaWMoInBhZDogdG9rZW5zSW4gbXVzdCBiZSBwb3NpdGl2ZSIpDQoJfQ0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglpZiBsLlN0YXR1cyAhPSBTdGF0dXNHcmFkdWF0ZWQgew0KCQlwYW5pYygicGFkOiBub3QgZ3JhZHVhdGVkICh1c2UgU2VsbCkiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlwYW5pYygicGFkOiBsaXN0ZWQgb24gREVYIC0gdHJhZGUgdmlhIHJvdXRlciwgbm90IHBhZCBTd2FwU2VsbCIpDQoJfQ0KCWlmIGwuTGlzdFNlZWRSZWxlYXNlZCB7DQoJCXBhbmljKCJwYWQ6IGxpc3Qgc2VlZCByZWxlYXNlZCAtIGZpbmlzaCB6ZGV4IENyZWF0ZVBvb2wgKyBDb25maXJtWmRleExpc3QiKQ0KCX0NCglzZWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgYmFsT2YobCwgc2VsbGVyKSA8IHRva2Vuc0luIHsNCgkJcGFuaWMoInBhZDogaW5zdWZmaWNpZW50IHRva2VuIGJhbGFuY2UiKQ0KCX0NCg0KCWdyb3NzLCBuZXdQVSwgbmV3UFQgOj0gYW1tbWF0aC5Qb29sU3dhcFRva2VuRm9yVWdub3QobC5Qb29sVWdub3QsIGwuUG9vbFRva2VuLCB0b2tlbnNJbikNCglmZWUgOj0gYW1tbWF0aC5BcHBseUZlZU9uT3V0cHV0KGdyb3NzLCBGZWVCUFMsIENyZWF0b3JGZWVTaGFyZUJQUywgUHJvdG9jb2xGZWVTaGFyZUJQUykNCglyZXF1aXJlTWluT3V0KGZlZS5OZXQsIG1pbld1Z25vdE91dCwgInd1Z25vdCBvdXQiKQ0KDQoJLy8gUmV0YWluIGZlZSBpbiBwb29sIHVnbm90IChjYXNoIHN0YXlzKTsgdXNlciBnZXRzIG5ldCBXVUdOT1QuDQoJbC5Qb29sVWdub3QgPSBuZXdQVSArIGZlZS5GZWUNCglsLlBvb2xUb2tlbiA9IG5ld1BUDQoJbC5DcmVhdG9yRmVlcyArPSBmZWUuQ3JlYXRvcg0KCWNyZWRpdFByb3RvY29sKGZlZS5Qcm90b2NvbCkNCg0KCWFkZEJhbChsLCBzZWxsZXIsIC10b2tlbnNJbikNCglwYXlXdWdub3RPdXQoY3VyLCBzZWxsZXIsIGZlZS5OZXQpDQoJcmVjb3JkVHJhZGUobCwgVHJhZGVTaWRlU2VsbCwgZmVlLk5ldCwgdG9rZW5zSW4pDQoNCgljaGFpbi5FbWl0KCJTd2FwU2VsbCIsDQoJCSJpZCIsIGlkLA0KCQkic2VsbGVyIiwgc2VsbGVyLlN0cmluZygpLA0KCQkidG9rZW5zIiwgc3RyY29udi5Gb3JtYXRJbnQodG9rZW5zSW4sIDEwKSwNCgkJInVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLk5ldCwgMTApLA0KCQkid3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLk5ldCwgMTApLA0KCSkNCglub3RpZnlUcmFkZShjdXIsIHNlbGxlciwgaWQsIDEsIGZlZS5OZXQpDQoJcmV0dXJuIGZlZS5OZXQNCn0NCg0KLy8gVHJhbnNmZXIgbW92ZXMgR1JDMjAgdG9rZW5zIGJldHdlZW4gYWRkcmVzc2VzICh1c2VyLWluaXRpYXRlZCkuDQpmdW5jIFRyYW5zZmVyKGN1ciByZWFsbSwgaWQgc3RyaW5nLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglpZiBhbW91bnQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJaWYgIXRvLklzVmFsaWQoKSB7DQoJCXBhbmljKCJwYWQ6IGludmFsaWQgdG8iKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJZnJvbSA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZiBmcm9tID09IHRvIHsNCgkJcGFuaWMoInBhZDogc2VsZiB0cmFuc2ZlciIpDQoJfQ0KCWlmIGwubGVkZ2VyID09IG5pbCB7DQoJCXBhbmljKCJwYWQ6IG5vIEdSQzIwIGxlZGdlciIpDQoJfQ0KCWlmIGVyciA6PSBsLmxlZGdlci5UcmFuc2Zlcihmcm9tLCB0bywgYW1vdW50KTsgZXJyICE9IG5pbCB7DQoJCXBhbmljKCJwYWQ6IHRyYW5zZmVyOiAiICsgZXJyLkVycm9yKCkpDQoJfQ0KCWNoYWluLkVtaXQoIlRyYW5zZmVyIiwgImlkIiwgaWQsICJmcm9tIiwgZnJvbS5TdHJpbmcoKSwgInRvIiwgdG8uU3RyaW5nKCksDQoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChhbW91bnQsIDEwKSkNCn0NCg0KLy8gQXBwcm92ZSBzZXRzIEdSQzIwIGFsbG93YW5jZSBzbyBERVgvY29udHJhY3RzIGNhbiBUcmFuc2ZlckZyb20uDQpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCBpZCBzdHJpbmcsIHNwZW5kZXIgYWRkcmVzcywgYW1vdW50IGludDY0KSB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJaWYgIXNwZW5kZXIuSXNWYWxpZCgpIHsNCgkJcGFuaWMoInBhZDogaW52YWxpZCBzcGVuZGVyIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwubGVkZ2VyID09IG5pbCB7DQoJCXBhbmljKCJwYWQ6IG5vIEdSQzIwIGxlZGdlciIpDQoJfQ0KCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGVyciA6PSBsLmxlZGdlci5BcHByb3ZlKG93bmVyLCBzcGVuZGVyLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsNCgkJcGFuaWMoInBhZDogYXBwcm92ZTogIiArIGVyci5FcnJvcigpKQ0KCX0NCgljaGFpbi5FbWl0KCJBcHByb3ZhbCIsICJpZCIsIGlkLCAib3duZXIiLCBvd25lci5TdHJpbmcoKSwgInNwZW5kZXIiLCBzcGVuZGVyLlN0cmluZygpLA0KCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCkpDQp9DQoNCi8vIFRyYW5zZmVyRnJvbSBzcGVuZHMgYWxsb3dhbmNlOiBzcGVuZGVyID0gTXNnQ2FsbCBFT0EgY2FsbGVyLg0KLy8gRW5hYmxlcyBERVggLyByb3V0ZXJzIHRoYXQgaG9sZCBhbGxvd2FuY2UgZnJvbSBBcHByb3ZlLg0KZnVuYyBUcmFuc2ZlckZyb20oY3VyIHJlYWxtLCBpZCBzdHJpbmcsIGZyb20sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcGFuaWMoInBhZDogYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQ0KCX0NCglpZiAhZnJvbS5Jc1ZhbGlkKCkgfHwgIXRvLklzVmFsaWQoKSB7DQoJCXBhbmljKCJwYWQ6IGludmFsaWQgYWRkcmVzcyIpDQoJfQ0KCWlmIGZyb20gPT0gdG8gew0KCQlwYW5pYygicGFkOiBzZWxmIHRyYW5zZmVyIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwubGVkZ2VyID09IG5pbCB7DQoJCXBhbmljKCJwYWQ6IG5vIEdSQzIwIGxlZGdlciIpDQoJfQ0KCXNwZW5kZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgZXJyIDo9IGwubGVkZ2VyLlRyYW5zZmVyRnJvbShmcm9tLCBzcGVuZGVyLCB0bywgYW1vdW50KTsgZXJyICE9IG5pbCB7DQoJCXBhbmljKCJwYWQ6IHRyYW5zZmVyRnJvbTogIiArIGVyci5FcnJvcigpKQ0KCX0NCgljaGFpbi5FbWl0KCJUcmFuc2ZlckZyb20iLCAiaWQiLCBpZCwgImZyb20iLCBmcm9tLlN0cmluZygpLCAidG8iLCB0by5TdHJpbmcoKSwNCgkJInNwZW5kZXIiLCBzcGVuZGVyLlN0cmluZygpLCAiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCkpDQp9DQoNCi8vIENsYWltQ3JlYXRvckZlZXMgd2l0aGRyYXdzIGFjY3J1ZWQgY3JlYXRvciBmZWVzIGZvciBhIGxhdW5jaC4NCi8vIE9ubHkgdGhlIHRva2VuIGNyZWF0b3IgbWF5IGNsYWltLiBGZWVzIHN0YXkgb24gcGFkIHVudGlsIGNsYWltZWQuDQpmdW5jIENsYWltQ3JlYXRvckZlZXMoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIGludDY0IHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGNhbGxlciAhPSBsLkNyZWF0b3Igew0KCQlwYW5pYygicGFkOiBub3QgY3JlYXRvciIpDQoJfQ0KCWFtdCA6PSBsLkNyZWF0b3JGZWVzDQoJaWYgYW10IDw9IDAgew0KCQlyZXR1cm4gMA0KCX0NCglsLkNyZWF0b3JGZWVzID0gMA0KCS8vIFByb2R1Y3Rpb246IGZlZXMgYWNjcnVlIGFzIFdVR05PVCBvbiBwYWQuIFRlc3RzIHBheSB1Z25vdCB2aWEgcGF5V3Vnbm90T3V0Lg0KCXBheVd1Z25vdE91dChjdXIsIGNhbGxlciwgYW10KQ0KCWNoYWluLkVtaXQoIkNsYWltQ3JlYXRvciIsICJpZCIsIGlkLCAiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW10LCAxMCkpDQoJcmV0dXJuIGFtdA0KfQ0KDQovLyBwYXlvdXRQcm90b2NvbEZlZXMgc2VuZHMgYWxsIHBlbmRpbmcgcHJvdG9jb2wgZmVlcyB0byBwcm90b2NvbEFkZHIuDQovLyBUcmFkZSBmZWVzIChXVUdOT1QpICsgY3JlYXRlIEJvbmRGZWUgKGJhbmsgdWdub3QpLiBTaGFyZWQgYnkgQ2xhaW0vUHVzaC4NCmZ1bmMgcGF5b3V0UHJvdG9jb2xGZWVzKGN1ciByZWFsbSkgaW50NjQgew0KCXdBbXQgOj0gcHJvdG9jb2xGZWVzDQoJYkFtdCA6PSBwcm90b2NvbEJvbmRGZWVzDQoJYW10IDo9IHdBbXQgKyBiQW10DQoJaWYgYW10IDw9IDAgew0KCQlyZXR1cm4gMA0KCX0NCglpZiAhcHJvdG9jb2xBZGRyLklzVmFsaWQoKSB7DQoJCXBhbmljKCJwYWQ6IHByb3RvY29sIGFkZHJlc3MgdW5zZXQiKQ0KCX0NCglwcm90b2NvbEZlZXMgPSAwDQoJcHJvdG9jb2xCb25kRmVlcyA9IDANCglwcm90b2NvbEZlZXNQYWlkICs9IGFtdA0KCWlmIHdBbXQgPiAwIHsNCgkJcGF5V3Vnbm90T3V0KGN1ciwgcHJvdG9jb2xBZGRyLCB3QW10KQ0KCX0NCglpZiBiQW10ID4gMCB7DQoJCXNlbmRVZ25vdChjdXIsIHByb3RvY29sQWRkciwgYkFtdCkNCgl9DQoJY2hhaW4uRW1pdCgiQ2xhaW1Qcm90b2NvbCIsDQoJCSJ0byIsIHByb3RvY29sQWRkci5TdHJpbmcoKSwNCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApLA0KCQkid3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQod0FtdCwgMTApLA0KCQkiYm9uZFVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoYkFtdCwgMTApLA0KCSkNCglyZXR1cm4gYW10DQp9DQoNCi8vIENsYWltUHJvdG9jb2xGZWVzIHdpdGhkcmF3cyBwZW5kaW5nIHByb3RvY29sIGZlZXMgdG8gcHJvdG9jb2xBZGRyLg0KLy8gT25seSB0aGUgY3VycmVudCBwcm90b2NvbCB0cmVhc3VyeSBrZXkgbWF5IGNhbGwgKHNhbWUgd2FsbGV0IHRoYXQgSW5pdCdkLA0KLy8gdW5sZXNzIFRyYW5zZmVyUHJvdG9jb2wgd2FzIHVzZWQpLg0KZnVuYyBDbGFpbVByb3RvY29sRmVlcyhjdXIgcmVhbG0pIGludDY0IHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcHJvdG9jb2xBZGRyIHsNCgkJcGFuaWMoInBhZDogbm90IHByb3RvY29sIikNCgl9DQoJcmV0dXJuIHBheW91dFByb3RvY29sRmVlcyhjdXIpDQp9DQoNCi8vIFB1c2hQcm90b2NvbEZlZXMgc2VuZHMgcGVuZGluZyBwcm90b2NvbCBmZWVzIHRvIHByb3RvY29sQWRkci4NCi8vIFBlcm1pc3Npb25sZXNzOiBhbnlvbmUgbWF5IGNhbGwgc28gdHJlYXN1cnkgY2FuIGJlIHBhaWQgd2l0aG91dCB0aGUgcHJvdG9jb2wNCi8vIGtleSBzaWduaW5nIChzdGlsbCBvbmx5IHBheXMgdGhlIGNvbmZpZ3VyZWQgcHJvdG9jb2xBZGRyKS4NCmZ1bmMgUHVzaFByb3RvY29sRmVlcyhjdXIgcmVhbG0pIGludDY0IHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglyZXR1cm4gcGF5b3V0UHJvdG9jb2xGZWVzKGN1cikNCn0NCg0KLy8gVHJhbnNmZXJQcm90b2NvbCByb3RhdGVzIHRoZSBwcm90b2NvbCBmZWUgcmVjaXBpZW50IChjdXJyZW50IHByb3RvY29sIG9ubHkpLg0KLy8gUGVuZGluZyBwcm90b2NvbEZlZXMgc3RheSBvbiBwYWQgdW50aWwgY2xhaW1lZC9wdXNoZWQgdG8gdGhlICpuZXcqIGFkZHJlc3MuDQpmdW5jIFRyYW5zZmVyUHJvdG9jb2woY3VyIHJlYWxtLCBuZXdBZGRyIGFkZHJlc3MpIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcHJvdG9jb2xBZGRyIHsNCgkJcGFuaWMoInBhZDogbm90IHByb3RvY29sIikNCgl9DQoJaWYgIW5ld0FkZHIuSXNWYWxpZCgpIHsNCgkJcGFuaWMoInBhZDogaW52YWxpZCBuZXcgcHJvdG9jb2wgYWRkcmVzcyIpDQoJfQ0KCWlmIG5ld0FkZHIgPT0gcHJvdG9jb2xBZGRyIHsNCgkJcGFuaWMoInBhZDogc2FtZSBwcm90b2NvbCBhZGRyZXNzIikNCgl9DQoJb2xkIDo9IHByb3RvY29sQWRkcg0KCXByb3RvY29sQWRkciA9IG5ld0FkZHINCgljaGFpbi5FbWl0KCJUcmFuc2ZlclByb3RvY29sIiwgImZyb20iLCBvbGQuU3RyaW5nKCksICJ0byIsIG5ld0FkZHIuU3RyaW5nKCkpDQp9DQoNCi8vIFByb3RvY29sQWRkcmVzcyByZXR1cm5zIHRoZSBjdXJyZW50IHByb3RvY29sIHRyZWFzdXJ5IGFkZHJlc3MgKGJlY2gzMikuDQpmdW5jIFByb3RvY29sQWRkcmVzcygpIHN0cmluZyB7DQoJcmV0dXJuIHByb3RvY29sQWRkci5TdHJpbmcoKQ0KfQ0KDQovLyBQcm90b2NvbEZlZXNQYWlkIHJldHVybnMgbGlmZXRpbWUgdWdub3QgYWxyZWFkeSBwYWlkIG91dCB0byB0aGUgdHJlYXN1cnkuDQpmdW5jIFByb3RvY29sRmVlc1BhaWQoKSBpbnQ2NCB7DQoJcmV0dXJuIHByb3RvY29sRmVlc1BhaWQNCn0NCg0KLy8gRmVlSW5mbyByZXR1cm5zIHByb3RvY29sQWRkcnxwZW5kaW5nVWdub3R8cGFpZFVnbm90IGZvciBVSXMuDQpmdW5jIEZlZUluZm8oKSBzdHJpbmcgew0KCXJldHVybiBwcm90b2NvbEFkZHIuU3RyaW5nKCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChwcm90b2NvbEZlZXMrcHJvdG9jb2xCb25kRmVlcywgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQocHJvdG9jb2xGZWVzUGFpZCwgMTApDQp9DQoNCi8vIFBhZEFkZHJlc3MgcmV0dXJucyB0aGlzIHBhZCByZWFsbSdzIGJlY2gzMiBwYWNrYWdlIGFkZHJlc3MgKGZ1bmQgV1VHTk9UIGhlcmUpLg0KZnVuYyBQYWRBZGRyZXNzKCkgc3RyaW5nIHsNCglyZXR1cm4gcGFkQWRkci5TdHJpbmcoKQ0KfQ0KDQovLyBBZG1pbkluZm8gaXMgYSBzaW5nbGUtbGluZSBkYXNoYm9hcmQgc25hcHNob3QgZm9yIHRoZSBvcHMgVUk6DQovLw0KLy8JcHJvdG9jb2xBZGRyfHBlbmRpbmdGZWVzfHBhaWRGZWVzfHJlc2VydmVkVWdub3R8bGF1bmNoQ291bnR8cG9pbnRzT258aW5pdGVkfHBhZEFkZHINCi8vDQovLyBwb2ludHNPbi9pbml0ZWQgYXJlIDB8MS4NCmZ1bmMgQWRtaW5JbmZvKCkgc3RyaW5nIHsNCglwdHMgOj0gIjAiDQoJaWYgcG9pbnRzRW5hYmxlZCB7DQoJCXB0cyA9ICIxIg0KCX0NCglpbmkgOj0gIjAiDQoJaWYgaW5pdGVkIHsNCgkJaW5pID0gIjEiDQoJfQ0KCXJldHVybiBwcm90b2NvbEFkZHIuU3RyaW5nKCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChwcm90b2NvbEZlZXMrcHJvdG9jb2xCb25kRmVlcywgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQocHJvdG9jb2xGZWVzUGFpZCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQocmVzZXJ2ZWRVZ25vdCgpLCAxMCkgKyAifCIgKw0KCQlzdHJjb252Lkl0b2EobGF1bmNoZXMuU2l6ZSgpKSArICJ8IiArDQoJCXB0cyArICJ8IiArDQoJCWluaSArICJ8IiArDQoJCXBhZEFkZHIuU3RyaW5nKCkNCn0NCg0KLy8gSXNQcm90b2NvbCByZXBvcnRzIHdoZXRoZXIgYWRkciBpcyB0aGUgY3VycmVudCB0cmVhc3VyeSAoZm9yIFVJIGdhdGluZykuDQpmdW5jIElzUHJvdG9jb2woYWRkciBzdHJpbmcpIGJvb2wgew0KCWlmICFpbml0ZWQgfHwgIXByb3RvY29sQWRkci5Jc1ZhbGlkKCkgew0KCQlyZXR1cm4gZmFsc2UNCgl9DQoJcmV0dXJuIHByb3RvY29sQWRkci5TdHJpbmcoKSA9PSBhZGRyDQp9DQoNCi8vIHJlc2VydmVkVWdub3QgaXMgYmFuayB1Z25vdCB0aGUgcGFkIG11c3Qga2VlcCAoY3JlYXRlIEJvbmRGZWUgKyBsZWdhY3kgQm9uZFVnbm90KS4NCi8vIEN1cnZlIC8gQ1BNTSAvIHRyYWRlIHByb3RvY29sRmVlcyBhcmUgV1VHTk9UIOKAlCBzZWUgcmVzZXJ2ZWRXdWdub3QuDQpmdW5jIHJlc2VydmVkVWdub3QoKSBpbnQ2NCB7DQoJcmVzZXJ2ZWQgOj0gcHJvdG9jb2xCb25kRmVlcw0KCWxhdW5jaGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgew0KCQlsIDo9IHZhbHVlLigqTGF1bmNoKQ0KCQlpZiAhbC5Cb25kUmVmdW5kZWQgew0KCQkJcmVzZXJ2ZWQgKz0gbC5Cb25kVWdub3QNCgkJfQ0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiByZXNlcnZlZA0KfQ0KDQovLyBSZXNlcnZlZFVnbm90IGlzIHVnbm90IHRoZSBwYWQgbXVzdCBrZWVwIGZvciBtYXJrZXRzICsgcGVuZGluZyBjbGFpbXMuDQpmdW5jIFJlc2VydmVkVWdub3QoKSBpbnQ2NCB7DQoJcmV0dXJuIHJlc2VydmVkVWdub3QoKQ0KfQ0KDQovLyBmcmVlVWdub3QgcmVwb3J0cyBiYW5rIHVnbm90IGFib3ZlIHJlc2VydmVkIGxpYWJpbGl0aWVzICgwIGlmIHNob3J0L3Rlc3QpLg0KZnVuYyBmcmVlVWdub3QoY3VyIHJlYWxtKSBpbnQ2NCB7DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQlyZXR1cm4gMA0KCX0NCgliayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhZG9ubHksIGN1cikNCgliYWwgOj0gYmsuR2V0Q29pbnMoY3VyLkFkZHJlc3MoKSkuQW1vdW50T2YoRGVub21VZ25vdCkNCglmcmVlIDo9IGJhbCAtIHJlc2VydmVkVWdub3QoKQ0KCWlmIGZyZWUgPCAwIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGZyZWUNCn0NCg0KLy8gV2l0aGRyYXdQcm90b2NvbFVnbm90IGxldHMgdGhlIHRyZWFzdXJ5IHB1bGwgZnJlZSB1Z25vdCBmcm9tIHRoZSBwYWQgYmFuaw0KLy8gKGUuZy4gcmFpc2VkIGJhY2tsb2cgYWZ0ZXIgR25vc3dhcCBsaXN0LCB0byByZS13cmFwIGFzIFdVR05PVCBpbnZlbnRvcnkpLg0KLy8gQ2FwcGVkIGJ5IGZyZWUgYmFsYW5jZTsgcGFuaWNzIGlmIGFtb3VudCA+IGZyZWUuDQpmdW5jIFdpdGhkcmF3UHJvdG9jb2xVZ25vdChjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBwcm90b2NvbEFkZHIgew0KCQlwYW5pYygicGFkOiBub3QgcHJvdG9jb2wiKQ0KCX0NCglpZiBhbW91bnQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJZnJlZSA6PSBmcmVlVWdub3QoY3VyKQ0KCWlmIGFtb3VudCA+IGZyZWUgew0KCQlwYW5pYygicGFkOiBhbW91bnQgZXhjZWVkcyBmcmVlIHVnbm90IChyZXNlcnZlZCBmb3IgbWFya2V0cy9mZWVzKSIpDQoJfQ0KCXNlbmRVZ25vdChjdXIsIHByb3RvY29sQWRkciwgYW1vdW50KQ0KCWNoYWluLkVtaXQoIldpdGhkcmF3UHJvdG9jb2xVZ25vdCIsDQoJCSJ0byIsIHByb3RvY29sQWRkci5TdHJpbmcoKSwNCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApLA0KCQkiZnJlZUxlZnQiLCBzdHJjb252LkZvcm1hdEludChmcmVlLWFtb3VudCwgMTApLA0KCSkNCglyZXR1cm4gYW1vdW50DQp9DQoNCi8vIC0tLSByZWFkIGhlbHBlcnMgKG5vbi1jcm9zc2luZykgLS0tDQoNCmZ1bmMgQmFsYW5jZU9mKGlkIHN0cmluZywgb3duZXIgYWRkcmVzcykgaW50NjQgew0KCXJldHVybiBiYWxPZihtdXN0TGF1bmNoKGlkKSwgb3duZXIpDQp9DQoNCi8vIEFsbG93YW5jZSByZXR1cm5zIGhvdyBtYW55IHRva2VucyBgc3BlbmRlcmAgbWF5IFRyYW5zZmVyRnJvbSBmcm9tIGBvd25lcmANCi8vIChzYW1lIEdSQzIwIHNlbWFudGljcyBhcyB3dWdub3QvZ25zLkFsbG93YW5jZSwga2V5ZWQgYnkgbGF1bmNoIGlkKS4NCmZ1bmMgQWxsb3dhbmNlKGlkIHN0cmluZywgb3duZXIsIHNwZW5kZXIgYWRkcmVzcykgaW50NjQgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglpZiBsLnRva2VuID09IG5pbCB7DQoJCXJldHVybiAwDQoJfQ0KCWlmICFvd25lci5Jc1ZhbGlkKCkgfHwgIXNwZW5kZXIuSXNWYWxpZCgpIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGwudG9rZW4uQWxsb3dhbmNlKG93bmVyLCBzcGVuZGVyKQ0KfQ0KDQovLyBMaXN0QnV5ZXJzIHJldHVybnMgdW5pcXVlIGJ1eWVyIGFkZHJlc3NlcyAob25lIHBlciBsaW5lKSwgY2FwcGVkIGZvciBxdWVyeSBzaXplLg0KLy8gT25seSBhZGRyZXNzZXMgdGhhdCBib3VnaHQgYXQgbGVhc3Qgb25jZSBvbiB0aGlzIHBhZCAoVW5pcXVlQnV5ZXJzKS4gTm90IGZ1bGwgR1JDMjAgaG9sZGVycw0KLy8gd2hvIHJlY2VpdmVkIHRva2VucyB2aWEgdHJhbnNmZXIuDQpmdW5jIExpc3RCdXllcnMoaWQgc3RyaW5nKSBzdHJpbmcgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCgljb25zdCBtYXhOID0gMTAwDQoJb3V0IDo9ICIiDQoJbiA6PSAwDQoJbC5VbmlxdWVCdXllcnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgew0KCQlpZiBuID49IG1heE4gew0KCQkJcmV0dXJuIHRydWUNCgkJfQ0KCQlpZiBvdXQgIT0gIiIgew0KCQkJb3V0ICs9ICJcbiINCgkJfQ0KCQlvdXQgKz0ga2V5DQoJCW4rKw0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiBvdXQNCn0NCg0KZnVuYyBHZXRTdGF0dXMoaWQgc3RyaW5nKSBpbnQgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5TdGF0dXMNCn0NCg0KZnVuYyBHZXRSYWlzZWQoaWQgc3RyaW5nKSBpbnQ2NCB7DQoJcmV0dXJuIG11c3RMYXVuY2goaWQpLlJhaXNlZFVnbm90DQp9DQoNCmZ1bmMgR2V0UG9vbChpZCBzdHJpbmcpICh1Z25vdCwgdG9rZW4gaW50NjQpIHsNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJcmV0dXJuIGwuUG9vbFVnbm90LCBsLlBvb2xUb2tlbg0KfQ0KDQpmdW5jIEdldENyZWF0b3JGZWVzKGlkIHN0cmluZykgaW50NjQgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5DcmVhdG9yRmVlcw0KfQ0KDQpmdW5jIFByb3RvY29sRmVlcygpIGludDY0IHsNCglyZXR1cm4gcHJvdG9jb2xGZWVzICsgcHJvdG9jb2xCb25kRmVlcw0KfQ0KDQovLyBQcm90b2NvbEJvbmRGZWVzIHJldHVybnMgcGVuZGluZyBjcmVhdGUtYm9uZCBiYW5rIHVnbm90IChzdWJzZXQgb2YgUHJvdG9jb2xGZWVzKS4NCmZ1bmMgUHJvdG9jb2xCb25kRmVlcygpIGludDY0IHsNCglyZXR1cm4gcHJvdG9jb2xCb25kRmVlcw0KfQ0KDQpmdW5jIExhdW5jaENvdW50KCkgaW50IHsNCglyZXR1cm4gbGF1bmNoZXMuU2l6ZSgpDQp9DQoNCmZ1bmMgUmVzb2x2ZVN5bWJvbChzeW1ib2wgc3RyaW5nKSBzdHJpbmcgew0KCXMsIG9rIDo9IGJ5U3ltYm9sLkdldChzeW1ib2wpLihzdHJpbmcpDQoJaWYgIW9rIHsNCgkJcmV0dXJuICIiDQoJfQ0KCXJldHVybiBzDQp9DQoNCi8vIExpc3RJRHMgcmV0dXJucyBuZXdsaW5lLXNlcGFyYXRlZCBsYXVuY2ggSURzIChzb3J0ZWQgYnkgQVZMIGtleSAvIGNyZWF0aW9uIG9yZGVyKS4NCmZ1bmMgTGlzdElEcygpIHN0cmluZyB7DQoJb3V0IDo9ICIiDQoJbGF1bmNoZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgew0KCQlpZiBvdXQgIT0gIiIgew0KCQkJb3V0ICs9ICJcbiINCgkJfQ0KCQlvdXQgKz0ga2V5DQoJCXJldHVybiBmYWxzZQ0KCX0pDQoJcmV0dXJuIG91dA0KfQ0KDQovLyBMYXVuY2hJbmZvIHJldHVybnMgYSBzaW5nbGUtbGluZSBwaXBlLWRlbGltaXRlZCBzdW1tYXJ5IGZvciBVSXMvaW5kZXhlcnM6DQovLw0KLy8JaWR8bmFtZXxzeW1ib2x8c3RhdHVzfHJhaXNlZHxzb2xkfGJ1eWVyc3xjcmVhdG9yRmVlc3xwb29sVWdub3R8cG9vbFRva2VufHVyaXxjcmVhdG9yfHZpcnR1YWxVZ25vdHx2aXJ0dWFsVG9rZW58Y3JlYXRlZHx0b2tlbklEfGdub3N3YXBSZWFkeXxnbm9zd2FwTGlzdGVkfGdub3N3YXBQb29sUGF0aHxnbm9zd2FwTm90ZXxsaXN0VmVudWUNCi8vDQovLyBzdGF0dXM6IDA9Y3VydmUgMT1ncmFkdWF0ZWQ7IGdub3N3YXBSZWFkeS9saXN0ZWQ6IDB8MQ0KLy8gZ25vc3dhcE5vdGU6IG9wdGlvbmFsIChwYWR2MTIrKTsgcGlwZXMgc3RyaXBwZWQgZm9yIGRlbGltaXRlciBzYWZldHkuDQovLyBsaXN0VmVudWU6IG9wdGlvbmFsIChwYWR2MjMrKTsgZW1wdHkgaWYgdW5saXN0ZWQuDQpmdW5jIExhdW5jaEluZm8oaWQgc3RyaW5nKSBzdHJpbmcgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglncyA6PSAiMCINCglpZiBsLkdub3N3YXBSZWFkeSB7DQoJCWdzID0gIjEiDQoJfQ0KCWdsIDo9ICIwIg0KCWlmIGwuR25vc3dhcExpc3RlZCB7DQoJCWdsID0gIjEiDQoJfQ0KCW5vdGUgOj0gc3RyaW5ncy5SZXBsYWNlQWxsKGwuR25vc3dhcE5vdGUsICJ8IiwgIi8iKQ0KCXZlbnVlIDo9IHN0cmluZ3MuUmVwbGFjZUFsbChsLkxpc3RWZW51ZSwgInwiLCAiLyIpDQoJcmV0dXJuIGwuSUQgKyAifCIgKw0KCQlsLk5hbWUgKyAifCIgKw0KCQlsLlN5bWJvbCArICJ8IiArDQoJCXN0cmNvbnYuSXRvYShsLlN0YXR1cykgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLlJhaXNlZFVnbm90LCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLlJlYWxTb2xkLCAxMCkgKyAifCIgKw0KCQlzdHJjb252Lkl0b2EobC5CdXllckNvdW50KSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KGwuQ3JlYXRvckZlZXMsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KGwuUG9vbFVnbm90LCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLlBvb2xUb2tlbiwgMTApICsgInwiICsNCgkJbC5VUkkgKyAifCIgKw0KCQlsLkNyZWF0b3IuU3RyaW5nKCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLlZpcnR1YWxVZ25vdCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQobC5WaXJ0dWFsVG9rZW4sIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KGwuQ3JlYXRlZCwgMTApICsgInwiICsNCgkJbC5Ub2tlbklEICsgInwiICsNCgkJZ3MgKyAifCIgKw0KCQlnbCArICJ8IiArDQoJCWwuR25vc3dhcFBvb2xQYXRoICsgInwiICsNCgkJbm90ZSArICJ8IiArDQoJCXZlbnVlDQp9DQoNCi8vIFBhcmFtc0luZm8gcmV0dXJucyBwYXJhbWV0ZXJzIGZvciBVSSBkaXNwbGF5Lg0KLy8gdG90YWx8Y3VydmV8cG9vbFNlZWR8Z3JhZFRocmVzaG9sZHxmZWVCcHN8Y3JlYXRlQm9uZHxsaXN0RmVlR25zDQovLyBjcmVhdGVCb25kIGlzIGxpdmUgZnJvbSBib25kIHJlYWxtIHdoZW4gbm90IGluIHVuaXQtdGVzdCBtb2RlLg0KLy8gbGlzdEZlZUduczogQ3JlYXRlLXRpbWUgR05TIGVzY3JvdyByZXF1aXJlZCAocGFkdjIwKykuDQpmdW5jIFBhcmFtc0luZm8oKSBzdHJpbmcgew0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChUb3RhbFN1cHBseSwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQoQ3VydmVTdXBwbHksIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KFBvb2xTZWVkLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChncmFkdWF0aW9uVGhyZXNob2xkKCksIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KEZlZUJQUywgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQocmVxdWlyZWRDcmVhdGVCb25kKCksIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHJlcXVpcmVkTGlzdEZlZUducygpLCAxMCkNCn0NCg0KLy8gVHJhZGVIaXN0b3J5IHJldHVybnMgbmV3bGluZS1zZXBhcmF0ZWQgY2hhcnQgcG9pbnRzOg0KLy8NCi8vCWhlaWdodHxzaWRlfHVnbm90fHRva2Vuc3xwcmljZVNjYWxlZA0KLy8NCi8vIHNpZGU6IDA9YnV5IDE9c2VsbCAyPW9wZW4vZ3JhZHVhdGUuIE9yZGVyZWQgb2xkZXN0IC0+IG5ld2VzdC4NCmZ1bmMgVHJhZGVIaXN0b3J5KGlkIHN0cmluZykgc3RyaW5nIHsNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJb3V0IDo9ICIiDQoJbC5UcmFkZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7DQoJCXQgOj0gdmFsdWUuKCpUcmFkZSkNCgkJbGluZSA6PSBzdHJjb252LkZvcm1hdEludCh0LkhlaWdodCwgMTApICsgInwiICsNCgkJCXN0cmNvbnYuSXRvYSh0LlNpZGUpICsgInwiICsNCgkJCXN0cmNvbnYuRm9ybWF0SW50KHQuVWdub3QsIDEwKSArICJ8IiArDQoJCQlzdHJjb252LkZvcm1hdEludCh0LlRva2VucywgMTApICsgInwiICsNCgkJCXN0cmNvbnYuRm9ybWF0SW50KHQuUHJpY2UsIDEwKQ0KCQlpZiBvdXQgIT0gIiIgew0KCQkJb3V0ICs9ICJcbiINCgkJfQ0KCQlvdXQgKz0gbGluZQ0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiBvdXQNCn0NCg0KLy8gVHJhZGVDb3VudCByZXR1cm5zIG51bWJlciBvZiBzdG9yZWQgY2hhcnQgc2FtcGxlcyBmb3IgYSBsYXVuY2guDQpmdW5jIFRyYWRlQ291bnQoaWQgc3RyaW5nKSBpbnQgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5UcmFkZXMuU2l6ZSgpDQp9DQoNCi8vIHJlc2V0Rm9yVGVzdCBjbGVhcnMgcGFja2FnZSBzdGF0ZSBiZXR3ZWVuIHVuaXQgdGVzdHMuDQpmdW5jIHJlc2V0Rm9yVGVzdCgpIHsNCglsYXVuY2hlcyA9IGF2bC5UcmVle30NCglieVN5bWJvbCA9IGF2bC5UcmVle30NCgluZXh0SUQgPSAwDQoJbmV4dFRva2VuSUQgPSAwDQoJdmFyIHplcm8gYWRkcmVzcw0KCXByb3RvY29sQWRkciA9IHplcm8NCgkvLyBwYWRBZGRyIGlzIHNldCBpbiBwYWNrYWdlIGluaXQgLSBkbyBub3QgY2xlYXIgKHJlYWxtIGFkZHJlc3MgaXMgZml4ZWQpLg0KCXByb3RvY29sRmVlcyA9IDANCglwcm90b2NvbEJvbmRGZWVzID0gMA0KCXByb3RvY29sRmVlc1BhaWQgPSAwDQoJaW5pdGVkID0gZmFsc2UNCglwb2ludHNFbmFibGVkID0gZmFsc2UNCglncmFkdWF0aW9uVWdub3QgPSAwDQoJbGlzdEZlZUduc0xpdmUgPSAwDQoJdGVzdFNraXBCYW5rZXIgPSB0cnVlIC8vIHVuaXQgdGVzdHMgc2tpcCBiYW5rZXI7IGludGVncmF0aW9uL2NoYWluIHRlc3RzIGxlYXZlIGZhbHNlDQoJdGVzdEZvcmNlR25vc3dhcExpc3QgPSBmYWxzZQ0KCXRlc3RGb3JjZVpkZXhMaXN0ID0gZmFsc2UNCgl0b3RhbExpc3RGZWVHbnMgPSAwDQoJdG90YWxXdWdub3RDcmVkaXQgPSAwDQoJd3Vnbm90Q3JlZGl0ID0gYXZsLlRyZWV7fQ0KCXJlc2V0TGlzdFZlbnVlc0ZvclRlc3QoKQ0KfQ0KGqwaCgpwYXJhbXMuZ25vEp0acGFja2FnZSBwYWR2Mg0KDQovLyBQcm90b2NvbCBwYXJhbWV0ZXJzLg0KLy8gRGVmYXVsdHMgYXJlIGNvbXBpbGUtdGltZSBjb25zdGFudHM7IEdyYWR1YXRpb25UaHJlc2hvbGQgYW5kIExpc3RGZWVHbnMgYWxzbyBoYXZlDQovLyBsaXZlIGNvcGllcyBzZXQgaW4gSW5pdCBhbmQgYWRqdXN0YWJsZSBieSBwcm90b2NvbCB2aWEgU2V0R3JhZHVhdGlvblRocmVzaG9sZCAvDQovLyBTZXRMaXN0RmVlR25zIChzZWUgbWVtZXBhZC5nbm8pLiBCb25kIGNyZWF0ZSBmZWUgaXMgb3duZWQgYnkgdGhlIGJvbmQgcmVhbG0uDQoNCmNvbnN0ICgNCgkvLyBUb2tlbiBlY29ub21pY3MNCglUb3RhbFN1cHBseSBpbnQ2NCA9IDFfMDAwXzAwMF8wMDANCglDdXJ2ZVN1cHBseSBpbnQ2NCA9IDgwMF8wMDBfMDAwIC8vIHNvbGQgb24gYm9uZGluZyBjdXJ2ZQ0KCS8vIFBvb2xTZWVkIGlzIGxlZ2FjeS4gR3JhZHVhdGlvbiBzaXplcyBMUCB0b2tlbnMgdG8gY3VydmUgc3BvdA0KCS8vIChyYWlzZWQgKiBWaXJ0dWFsVG9rZW4gLyBWaXJ0dWFsVWdub3QpOyB1bnNvbGQgcmVtYWluZGVyID0gTGVmdG92ZXJUb2tlbnMuDQoJUG9vbFNlZWQgaW50NjQgPSAyMDBfMDAwXzAwMA0KDQoJLy8gVmlydHVhbCBjb25zdGFudC1wcm9kdWN0IHNlZWQgKFB1bXAtc3R5bGUpLg0KCS8vIE1heCBuZXQgcmFpc2Ugd2hlbiBzZWxsaW5nIGZ1bGwgQ3VydmVTdXBwbHk6DQoJLy8gICBSID0gVmlydHVhbFVnbm90MCAqIEN1cnZlU3VwcGx5IC8gKFZpcnR1YWxUb2tlbjAgLSBDdXJ2ZVN1cHBseSkNCgkvLyBNYWlubmV0OiBWVTDiiYgxMDIuMzc1ZTkgKyBWVDDiiYgxLjA3M2U5ID0+IG1heCByYWlzZSDiiYgzMDBrIEdOT1Qgc28KCS8vIERlZmF1bHRHcmFkdWF0aW9uVGhyZXNob2xkIDMwMF8wMDAgR05PVCBpcyByZWFjaGFibGUgYmVmb3JlIHNvbGQtb3V0LgoJVmlydHVhbFVnbm90MCBpbnQ2NCA9IDEwMl8zNzVfMDcxXzYyNSAvLyBtYWlubmV0OiBtYXggcmFpc2Ug4omlIDMwMGsgR05PVAoJVmlydHVhbFRva2VuMCBpbnQ2NCA9IDFfMDczXzAwMF8xOTEgLy8gdmlydHVhbCB0b2tlbiBzaWRlDQoNCgkvLyBEZWZhdWx0IGdyYWR1YXRpb24gcmFpc2UgKHVnbm90KS4gTGl2ZSB2YWx1ZSBzdGFydHMgaGVyZSBpbiBJbml0Ow0KCS8vIHByb3RvY29sIG1heSBjYWxsIFNldEdyYWR1YXRpb25UaHJlc2hvbGQgYWZ0ZXJ3YXJkLg0KCUdyYWR1YXRpb25UaHJlc2hvbGQgaW50NjQgPSAzMDBfMDAwXzAwMF8wMDAgLy8gMzAwXzAwMCBHTk9UIChTZXRHcmFkdWF0aW9uVGhyZXNob2xkIGxhdGVyKQoNCgkvLyBGZWVzOiAxLjIwJSB0b3RhbC4gT2YgdGhlIGZlZTogNDAlIGNyZWF0b3IsIDQwJSBwcm90b2NvbCwgMjAlIExQL2sgcmVtYWluZGVyLg0KCUZlZUJQUyAgICAgICAgICAgICAgaW50NjQgPSAxMjANCglDcmVhdG9yRmVlU2hhcmVCUFMgIGludDY0ID0gNDAwMA0KCVByb3RvY29sRmVlU2hhcmVCUFMgaW50NjQgPSA0MDAwDQoNCgkvLyBGYWxsYmFjayBjcmVhdGUgYm9uZCBmb3IgdW5pdCB0ZXN0cyAvIGlmIGJvbmQgcmVhbG0gdW5hdmFpbGFibGUuDQoJLy8gUHJvZHVjdGlvbiBwYWQgdXNlcyBjcmVhdGVib25kLkN1cnJlbnRCb25kVWdub3QoKSAoc2VlIGJvbmQgcGFja2FnZSkuDQoJLy8gU2FwcGhpcmUgbm9ybWFsIGJvbmQgPSAyIEdOT1Q7IHByb21vIH4gJDIwIGluIHVnbm90IHNldCBvbiBib25kLlN0YXJ0UHJvbW8uDQoJQ3JlYXRlQm9uZFVnbm90IGludDY0ID0gMTUwXzAwMF8wMDAgLy8gMTUwIEdOT1QgZmFsbGJhY2s7IGxpdmUgPSBib25kIHJlYWxtDQoJQm9uZFJlZnVuZEJ1eWVycyAgICAgaW50ICAgPSA1DQoJQm9uZFJlZnVuZE1pblJhaXNlZCAgaW50NjQgPSA1XzAwMF8wMDAgLy8gPj01IEdOT1QgcmFpc2VkDQoJQm9uZFJlZnVuZE1heEhlaWdodHMgaW50NjQgPSAxMDBfMDAwDQoNCgkvLyBBbnRpLXNuaXBlOiBmaXJzdCBOIGhlaWdodHMsIG1heCBjdW11bGF0aXZlIHRva2VucyBwZXIgYWRkcmVzcyAoQlBTIG9mIFRvdGFsU3VwcGx5KS4NCglBbnRpU25pcGVIZWlnaHRzICAgaW50NjQgPSAyMA0KCUFudGlTbmlwZU1heEJ1eUJQUyBpbnQ2NCA9IDUwMCAvLyA1JSBwZXIgYWRkcmVzcyBpbiB3aW5kb3cNCg0KCS8vIFN0YXR1cw0KCVN0YXR1c0N1cnZlICAgICA9IDANCglTdGF0dXNHcmFkdWF0ZWQgPSAxDQoNCgkvLyBUcmFkZSBoaXN0b3J5IHJpbmcgYnVmZmVyLg0KCU1heFRyYWRlSGlzdG9yeSA9IDEyOA0KCS8vIFRyYWRlIHNpZGVzIHN0b3JlZCBpbiBoaXN0b3J5DQoJVHJhZGVTaWRlQnV5ICA9IDANCglUcmFkZVNpZGVTZWxsID0gMQ0KCVRyYWRlU2lkZU9wZW4gPSAyIC8vIGluaXRpYWwgbGlzdGluZyBtYXJrDQoNCglEZW5vbVVnbm90ID0gInVnbm90Ig0KDQoJLy8gLS0tIEdub3N3YXAgYXV0by1saXN0IChTYXBwaGlyZSkgLS0tDQoJLy8gQ3VydmUgY29sbGF0ZXJhbCBpcyBXVUdOT1QgKEJ1eSBUcmFuc2ZlckZyb20pLiBBdCBncmFkdWF0ZSwgcGFkIGFscmVhZHkgaG9sZHMNCgkvLyByYWlzZWQgV1VHTk9UIGZvciBMUCAtIG5vIHJlYWxtIHNlbGYtd3JhcCBuZWVkZWQuDQoJLy8gQ3JlYXRlUG9vbCBmZWUgaXMgZml4ZWQgaW4gR05TICh0eXBpY2FsbHkgMTAwZTYgPSAxMDAgR05TKToNCgkvLyAgIEZlZSA9IHByZS1mdW5kZWQgR05TIG9uIHBhZCBPUiBzdXJwbHVzIFdVR05PVCAoZmVlcyByZXRhaW5lZCkgRXhhY3RPdXQgLT4gR05TDQoJR25vc3dhcEZlZVRpZXIgICAgIHVpbnQzMiA9IDMwMDAgLy8gMC4zJSBtZW1lIHRpZXINCglHbm9zd2FwVGlja1NwYWNpbmcgaW50MzIgID0gNjANCglHbm9zd2FwTWluVGljayAgICAgaW50MzIgID0gLTg4NzI3Mg0KCUdub3N3YXBNYXhUaWNrICAgICBpbnQzMiAgPSA4ODcyNzINCgkvLyBNYXggV1VHTk9UIHVzZWQgYXMgRXhhY3RPdXQgbWF4SW4gZm9yIGZlZSBidXkgKGNlaWxpbmcgLyBzbGlwcGFnZSkuDQoJLy8gUHJlZmVyIHByZS1mdW5kaW5nID49MTAwIEdOUyBvbiBwYWQgc28gTFAgZGVwdGggc3RheXMgPSByYWlzZWQuDQoJR25vc3dhcE1heEZlZVd1Z25vdCBpbnQ2NCA9IDFfNTAwXzAwMF8wMDAgLy8gMTUwMCBHTk9UDQoNCgkvLyBDcmVhdGUtdGltZSBHTlMgbGlzdCBmZWUgZXNjcm93IChwYWR2MjArKS4NCgkvLyBDcmVhdG9yIG11c3QgVHJhbnNmZXIgPj0gTGlzdEZlZUducyBmcmVlIEdOUyB0byBwYWQgYmVmb3JlIENyZWF0ZS4NCgkvLyBMb2NrZWQgcGVyLWxhdW5jaCB1bnRpbCBHbm9zd2FwIGxpc3QgY29uc3VtZXMgaXQsIG9yIENsYWltTGlzdEZlZSByZWZ1bmRzIGNyZWF0b3IuDQoJLy8gTWF0Y2hlcyB0eXBpY2FsIGduc3Bvb2wuR2V0UG9vbENyZWF0aW9uRmVlKCkgKDEwMCBHTlMsIDYgZGVjaW1hbHMpLg0KCUxpc3RGZWVHbnMgaW50NjQgPSAxMDBfMDAwXzAwMA0KKQ0KGuM6CgpyZW5kZXIuZ25vEtQ6cGFja2FnZSBwYWR2Mg0KDQppbXBvcnQgKA0KCSJzdHJjb252Ig0KCSJzdHJpbmdzIg0KDQoJYW1tbWF0aCAiZ25vLmxhbmQvcC9nMW40cGw1dWM0eXQ1cjk2bTl3NmZtZHpueDN4MGp5ZzhsNmFyaG10L2dub21pL2FtbW1hdGh2MiINCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIg0KKQ0KDQovLyBSZW5kZXIgcHJvdmlkZXMgb24tY2hhaW4gZGlzY292ZXJ5IChnbm93ZWIpLiBSZWFkLW9ubHkgYnkgY29udmVudGlvbi4NCi8vDQovLyBQYXRoczoNCi8vDQovLwkiIiAgICAgICAgICAgICAgLSBob21lIC8gbGlzdA0KLy8JdG9rZW4ve2lkfSAgICAgIC0gbGF1bmNoIGRldGFpbA0KLy8JaGVscCAgICAgICAgICAgIC0gQVBJIGhlbHANCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgew0KCXBhdGggPSBzdHJpbmdzLlRyaW0ocGF0aCwgIi8iKQ0KCWlmIHBhdGggPT0gIiIgew0KCQlyZXR1cm4gcmVuZGVySG9tZSgpDQoJfQ0KCWlmIHBhdGggPT0gImhlbHAiIHsNCgkJcmV0dXJuIHJlbmRlckhlbHAoKQ0KCX0NCglpZiBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAidG9rZW4vIikgew0KCQlpZCA6PSBzdHJpbmdzLlRyaW1QcmVmaXgocGF0aCwgInRva2VuLyIpDQoJCXJldHVybiByZW5kZXJUb2tlbihpZCkNCgl9DQoJcmV0dXJuICI+IFshV0FSTklOR11cbj4gUGF0aCBub3QgZm91bmQ6ICIgKyBzYW5pdGl6ZShwYXRoKSArICJcbiINCn0NCg0KZnVuYyBzYW5pdGl6ZShzIHN0cmluZykgc3RyaW5nIHsNCglzID0gc3RyaW5ncy5SZXBsYWNlQWxsKHMsICJgIiwgIiciKQ0KCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIjwiLCAiIikNCglzID0gc3RyaW5ncy5SZXBsYWNlQWxsKHMsICI+IiwgIiIpDQoJcmV0dXJuIHMNCn0NCg0KZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsNCglvdXQgOj0gIiMgZ25vbWlcblxuIg0KCW91dCArPSAiTWVtZSBsYXVuY2hwYWQgLSBXVUdOT1QgYm9uZGluZyBjdXJ2ZSAtPiByZW1haW5pbmcgdG9rZW5zICsgcmFpc2VkIFdVR05PVCBzZWVkIEdub3N3YXAgTFAgKGF1dG8tbGlzdCkuXG5cbiINCglpZiAhaW5pdGVkIHsNCgkJb3V0ICs9ICI+IFshQ0FVVElPTl1cbj4gUHJvdG9jb2wgbm90IGluaXRpYWxpemVkLiBDYWxsIEluaXQgZmlyc3QuXG5cbiINCgkJcmV0dXJuIG91dA0KCX0NCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItIExhdW5jaGVzOiAqKiVkKipcbiIsIGxhdW5jaGVzLlNpemUoKSkNCglpZiBwcm90b2NvbEFkZHIuSXNWYWxpZCgpIHsNCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBQcm90b2NvbCB0cmVhc3VyeTogYCVzYFxuIiwgcHJvdG9jb2xBZGRyLlN0cmluZygpKQ0KCX0NCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFByb3RvY29sIGZlZXMgcGVuZGluZyAoY2xhaW0vcHVzaCk6ICoqJWQqKiB1Z25vdFxuIiwgcHJvdG9jb2xGZWVzKQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gUHJvdG9jb2wgZmVlcyBwYWlkIChsaWZldGltZSk6ICoqJWQqKiB1Z25vdFxuXG4iLCBwcm90b2NvbEZlZXNQYWlkKQ0KCW91dCArPSAiIyMgTWFya2V0c1xuXG4iDQoJaWYgbGF1bmNoZXMuU2l6ZSgpID09IDAgew0KCQlvdXQgKz0gIl9ObyBsYXVuY2hlcyB5ZXQuIENhbGwgQ3JlYXRlIHdpdGggbmFtZSwgc3ltYm9sLCB1cmkgYW5kIGJvbmQuX1xuIg0KCQlyZXR1cm4gb3V0DQoJfQ0KCWxhdW5jaGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7DQoJCWwgOj0gdmFsdWUuKCpMYXVuY2gpDQoJCXN0IDo9ICJjdXJ2ZSINCgkJaWYgbC5TdGF0dXMgPT0gU3RhdHVzR3JhZHVhdGVkIHsNCgkJCXN0ID0gImdyYWR1YXRlZCINCgkJfQ0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFslcyAoJCVzKV0odG9rZW4vJXMpIC0gJXMgLSByYWlzZWQgJWQgdWdub3QgLSBidXllcnMgJWRcbiIsDQoJCQlzYW5pdGl6ZShsLk5hbWUpLCBzYW5pdGl6ZShsLlN5bWJvbCksIGwuSUQsIHN0LCBsLlJhaXNlZFVnbm90LCBsLkJ1eWVyQ291bnQpDQoJCXJldHVybiBmYWxzZQ0KCX0pDQoJb3V0ICs9ICJcbltIZWxwXShoZWxwKVxuIg0KCXJldHVybiBvdXQNCn0NCg0KZnVuYyByZW5kZXJUb2tlbihpZCBzdHJpbmcpIHN0cmluZyB7DQoJaWQgPSBzYW5pdGl6ZShpZCkNCglsLCBvayA6PSBsYXVuY2hlcy5HZXQoaWQpLigqTGF1bmNoKQ0KCWlmICFvayB7DQoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IFVua25vd24gbGF1bmNoICIgKyBpZCArICJcblxuW0hvbWVdKC4vKVxuIg0KCX0NCglzdCA6PSAiYm9uZGluZyBjdXJ2ZSINCglpZiBsLlN0YXR1cyA9PSBTdGF0dXNHcmFkdWF0ZWQgew0KCQlzdCA9ICJncmFkdWF0ZWQgcG9vbCAoTFAgbG9ja2VkKSINCgl9DQoJb3V0IDo9IHVmbXQuU3ByaW50ZigiIyAlcyAoJCVzKVxuXG4iLCBzYW5pdGl6ZShsLk5hbWUpLCBzYW5pdGl6ZShsLlN5bWJvbCkpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSAqKklEOioqICVzXG4iLCBsLklEKQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gKipTdGF0dXM6KiogJXNcbiIsIHN0KQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gKipDcmVhdG9yOioqICVzXG4iLCBsLkNyZWF0b3IuU3RyaW5nKCkpDQoJaWYgbC5VUkkgIT0gIiIgew0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItICoqVVJJOioqICVzXG4iLCBzYW5pdGl6ZShsLlVSSSkpDQoJfQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gKipVbmlxdWUgYnV5ZXJzOioqICVkXG4iLCBsLkJ1eWVyQ291bnQpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSAqKkNyZWF0b3IgZmVlcyAoY2xhaW1hYmxlKToqKiAlZCB1Z25vdFxuXG4iLCBsLkNyZWF0b3JGZWVzKQ0KDQoJaWYgbC5TdGF0dXMgPT0gU3RhdHVzQ3VydmUgew0KCQlyZW1haW5pbmcgOj0gQ3VydmVTdXBwbHkgLSBsLlJlYWxTb2xkDQoJCXBjdCA6PSBpbnQ2NCgwKQ0KCQlpZiBncmFkdWF0aW9uVGhyZXNob2xkKCkgPiAwIHsNCgkJCXBjdCA9IGwuUmFpc2VkVWdub3QgKiAxMDAgLyBncmFkdWF0aW9uVGhyZXNob2xkKCkNCgkJCWlmIHBjdCA+IDEwMCB7DQoJCQkJcGN0ID0gMTAwDQoJCQl9DQoJCX0NCgkJc3BvdCA6PSBhbW1tYXRoLlNwb3RQcmljZVVnbm90UGVyVG9rZW4obC5WaXJ0dWFsVWdub3QsIGwuVmlydHVhbFRva2VuKQ0KCQlvdXQgKz0gIiMjIEJvbmRpbmcgY3VydmVcblxuIg0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFJhaXNlZDogKiolZCoqIC8gJWQgdWdub3QgKCVkJSUpXG4iLCBsLlJhaXNlZFVnbm90LCBncmFkdWF0aW9uVGhyZXNob2xkKCksIHBjdCkNCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBUb2tlbnMgc29sZDogKiolZCoqIC8gJWRcbiIsIGwuUmVhbFNvbGQsIEN1cnZlU3VwcGx5KQ0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFJlbWFpbmluZyBvbiBjdXJ2ZTogKiolZCoqXG4iLCByZW1haW5pbmcpDQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gU3BvdCAodWdub3QvdG9rZW4geDFlNik6ICoqJWQqKlxuIiwgc3BvdCkNCgkJb3V0ICs9ICJcblByb2dyZXNzIHRvd2FyZCBncmFkdWF0aW9uOlxuXG4iDQoJCW91dCArPSBwcm9ncmVzc0JhcihwY3QpICsgIlxuIg0KCX0gZWxzZSB7DQoJCXNwb3QgOj0gYW1tbWF0aC5TcG90UHJpY2VVZ25vdFBlclRva2VuKGwuUG9vbFVnbm90LCBsLlBvb2xUb2tlbikNCgkJb3V0ICs9ICIjIyBMaXF1aWRpdHkgKHBvc3QtZ3JhZHVhdGUpXG5cbiINCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBSYWlzZWQgY2FwaXRhbCAocmVjb3JkKTogKiolZCoqIHVnbm90XG4iLCBsLlBvb2xVZ25vdCkNCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBMUCB0b2tlbnMgKGN1cnZlLXNwb3Qgc2l6ZWQpOiAqKiVkKipcbiIsIGwuUG9vbFRva2VuKQ0KCQlpZiBsLkxlZnRvdmVyVG9rZW5zID4gMCB7DQoJCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIExlZnRvdmVyIG9uIHBhZCAobm90IGluIExQKTogKiolZCoqXG4iLCBsLkxlZnRvdmVyVG9rZW5zKQ0KCQl9DQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gU3BvdCAodWdub3QvdG9rZW4geDFlNik6ICoqJWQqKlxuIiwgc3BvdCkNCgkJaWYgbC5Hbm9zd2FwTGlzdGVkIHsNCgkJCW91dCArPSB1Zm10LlNwcmludGYoIi0gKipHbm9zd2FwIGxpc3RlZDoqKiBgJXNgXG4iLCBzYW5pdGl6ZShsLkdub3N3YXBQb29sUGF0aCkpDQoJCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFBvc2l0aW9uIE5GVCBpZDogKiolZCoqIChwYWQtb3duZWQsIGxvY2tlZClcbiIsIGwuR25vc3dhcFBvc2l0aW9uSUQpDQoJCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIEZlZSBXVUdOT1Qgc3BlbnQ6ICoqJWQqKiB8IExQIFdVR05PVDogKiolZCoqXG4iLCBsLkZlZVd1Z25vdFNwZW50LCBsLkxpcVd1Z25vdFVzZWQpDQoJCQlvdXQgKz0gIlxuPiBbIU5PVEVdXG4+IFRyYWRlIG9uIEdub3N3YXAgcm91dGVyIC0gcGFkIFN3YXBCdXkvU3dhcFNlbGwgZGlzYWJsZWQgYWZ0ZXIgYXV0by1saXN0LlxuIg0KCQl9IGVsc2Ugew0KCQkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBHbm9zd2FwOiAlc1xuIiwgc2FuaXRpemUobC5Hbm9zd2FwTm90ZSkpDQoJCQlvdXQgKz0gIlxuPiBbIU5PVEVdXG4+IEludGVybmFsIENQTU0uIExpc3Q6IHd1Z25vdC5EZXBvc2l0IC0+IEFwcHJvdmUocGFkKSAtPiBSZXRyeUxpc3RHbm9zd2FwIChMUCB1Z25vdCByZWltYnVyc2VkOyBwcmVmZXIgR05TIGZvciBmZWUpLlxuIg0KCQkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBMaXN0TmVlZDogYCVzYFxuIiwgbGlzdE5lZWRPZihsKSkNCgkJfQ0KCX0NCg0KCW91dCArPSAiXG4jIyBUcmFkZVxuXG4iDQoJb3V0ICs9ICJVc2Ugd2FsbGV0IE1zZ0NhbGwgKHBheWFibGUgdHhzKTpcblxuIg0KCWlmIGwuU3RhdHVzID09IFN0YXR1c0N1cnZlIHsNCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBCdXkoaWQpIHdpdGggLXNlbmQgdWdub3QgLSBpZD0lc1xuIiwgbC5JRCkNCgkJb3V0ICs9ICItIFNlbGwoaWQsIHRva2Vuc0luKVxuIg0KCQlvdXQgKz0gIi0gR3JhZHVhdGUoaWQpIHdoZW4gdGhyZXNob2xkIG1ldFxuIg0KCX0gZWxzZSBpZiBsLkdub3N3YXBMaXN0ZWQgew0KCQlvdXQgKz0gIi0gVHJhZGUgb24gR25vc3dhcCByb3V0ZXIgKHBhZCBTd2FwQnV5L1NlbGwgZGlzYWJsZWQpXG4iDQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gUG9vbDogYCVzYFxuIiwgc2FuaXRpemUobC5Hbm9zd2FwUG9vbFBhdGgpKQ0KCX0gZWxzZSB7DQoJCW91dCArPSAiLSBTd2FwQnV5KGlkKSB3aXRoIC1zZW5kIHVnbm90XG4iDQoJCW91dCArPSAiLSBTd2FwU2VsbChpZCwgdG9rZW5zSW4pXG4iDQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gUmV0cnlMaXN0R25vc3dhcChpZCkgLSBhdXRvLXB1bGwgV1VHTk9UL0dOUyBmcm9tIGNhbGxlciBpZiBBcHByb3ZlZCAtIGlkPSVzXG4iLCBsLklEKQ0KCX0NCglvdXQgKz0gIlxuW0hvbWVdKC4vKSB8IFtIZWxwXShoZWxwKVxuIg0KCXJldHVybiBvdXQNCn0NCg0KZnVuYyBwcm9ncmVzc0JhcihwY3QgaW50NjQpIHN0cmluZyB7DQoJaWYgcGN0IDwgMCB7DQoJCXBjdCA9IDANCgl9DQoJaWYgcGN0ID4gMTAwIHsNCgkJcGN0ID0gMTAwDQoJfQ0KCWZpbGxlZCA6PSBpbnQocGN0IC8gNSkNCgliYXIgOj0gIlsiDQoJZm9yIGkgOj0gMDsgaSA8IDIwOyBpKysgew0KCQlpZiBpIDwgZmlsbGVkIHsNCgkJCWJhciArPSAiIyINCgkJfSBlbHNlIHsNCgkJCWJhciArPSAiLiINCgkJfQ0KCX0NCgliYXIgKz0gIl0gIiArIHN0cmNvbnYuRm9ybWF0SW50KHBjdCwgMTApICsgIiUiDQoJcmV0dXJuIGJhcg0KfQ0KDQpmdW5jIHJlbmRlckhlbHAoKSBzdHJpbmcgew0KCW91dCA6PSAiIyBnbm9taSBBUElcblxuIg0KCW91dCArPSAiIyMgTGlmZWN5Y2xlXG5cbiINCglvdXQgKz0gIjEuIEluaXQoKSAtIG9uY2U7IGNhbGxlciBiZWNvbWVzIHByb3RvY29sIHRyZWFzdXJ5XG4iDQoJb3V0ICs9ICIyLiBDcmVhdGUobmFtZSwgc3ltYm9sLCB1cmkpICsgYm9uZCBmcm9tIGJvbmQgcmVhbG0gKHByb21vL25vcm1hbClcbiINCglvdXQgKz0gIjMuIEJ1eShpZCwgbWluVG9rZW5zT3V0KSAvIFNlbGwoaWQsIGFtb3VudCwgbWluVWdub3RPdXQpIC0gYm9uZGluZyBjdXJ2ZVxuIg0KCW91dCArPSAiNC4gQXV0byBvciBHcmFkdWF0ZShpZCkgYXQgdGhyZXNob2xkXG4iDQoJb3V0ICs9ICI1LiBHcmFkdWF0ZSBzZWVkcyByZW1haW5pbmcgdG9rZW5zICsgcmFpc2VkIGFzIGxpcXVpZGl0eVxuIg0KCW91dCArPSAiICAgLT4gYXV0byBHbm9zd2FwIENyZWF0ZVBvb2wrTWludCBpZiBwYWQgaGFzIFdVR05PVCBpbnZlbnRvcnlcbiINCglvdXQgKz0gIiAgIC0+IGVsc2UgbG9ja2VkIGludGVybmFsIENQTU0gKFN3YXBCdXkvU3dhcFNlbGwpXG4iDQoJb3V0ICs9ICI2LiBUcmFuc2ZlciAvIEFwcHJvdmUgLyBUcmFuc2ZlckZyb20gLSBHUkMyMFxuIg0KCW91dCArPSAiNy4gRmVlczpcbiINCglvdXQgKz0gIiAgIC0gQ3JlYXRvcjogQ2xhaW1DcmVhdG9yRmVlcyhpZCkgLSBvbmx5IGNyZWF0b3IsICoqbXVzdCBjbGFpbSoqXG4iDQoJb3V0ICs9ICIgICAtIFByb3RvY29sOiBDbGFpbVByb3RvY29sRmVlcygpICh0cmVhc3VyeSkgb3IgUHVzaFByb3RvY29sRmVlcygpIChhbnlvbmUgLT4gdHJlYXN1cnkpXG4iDQoJb3V0ICs9ICIgICAtIFRyYW5zZmVyUHJvdG9jb2wobmV3QWRkcikgLyBXaXRoZHJhd1Byb3RvY29sVWdub3QoYW1vdW50KSAtIHRyZWFzdXJ5IG9wc1xuIg0KCW91dCArPSAiICAgLSBHbm9zd2FwIENyZWF0ZVBvb2wgR05TIGZlZSBnb2VzIHRvIEdub3N3YXAsIG5vdCBwYWQgdHJlYXN1cnlcblxuIg0KCW91dCArPSAiIyMgUGFyYW1zIChNVlApXG5cbiINCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFRvdGFsIHN1cHBseTogJWRcbiIsIFRvdGFsU3VwcGx5KQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gQ3VydmUgc2FsZTogJWRcbiIsIEN1cnZlU3VwcGx5KQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gTFAgdG9rZW5zIGF0IGdyYWQ6IFRvdGFsU3VwcGx5IC0gUmVhbFNvbGQgKHdhcyBQb29sU2VlZD0lZClcbiIsIFBvb2xTZWVkKQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gR3JhZHVhdGlvbjogJWQgdWdub3RcbiIsIGdyYWR1YXRpb25UaHJlc2hvbGQoKSkNCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItIEZlZTogJWQgQlBTXG4iLCBGZWVCUFMpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBDcmVhdGUgYm9uZCAobGl2ZSk6ICVkIHVnbm90XG5cbiIsIHJlcXVpcmVkQ3JlYXRlQm9uZCgpKQ0KCW91dCArPSAiIyMgRGVzaWduXG5cbiINCglvdXQgKz0gIi0gUmVtYWluaW5nIHRva2VucyArIHJhaXNlZCBHTk9UIC0+IGxpcXVpZGl0eSBhdCBncmFkdWF0ZVxuIg0KCW91dCArPSAiLSBQYXJ0IG9mIFdVR05PVCBpbnZlbnRvcnkgc3dhcHMgdG8gR05TIGZvciBDcmVhdGVQb29sIGZlZVxuIg0KCW91dCArPSAiLSBQZXJtYW5lbnQgTFAgbG9jayAocGFkIGhvbGRzIEdub3N3YXAgcG9zaXRpb24gTkZUKVxuIg0KCW91dCArPSAiLSBFT0EgKyBPcmlnaW5TZW5kIHBheW1lbnQgZ3VhcmRzXG5cbiINCglvdXQgKz0gIltIb21lXSguLylcbiINCglyZXR1cm4gb3V0DQp9DQoasAoKDXpkZXhfbGlzdC5nbm8SngpwYWNrYWdlIHBhZHYyCgovLyB0cnlMaXN0T25aZGV4IOKAlCBzdHViIHVudGlsIFpkZXggaHViIGFsbG93cyBmYXJtL3JlYWxtIENyZWF0ZVBvb2wuCi8vIExpdmUgUGVhcmwvbWFpbm5ldDogQ3JlYXRlUG9vbCBpcyBFT0Etb25seSArIHJlcXVpcmVMaXN0ZWQuCi8vIFBhZCBwYXRoIHRvZGF5OgovLyAgMSkgUmVsZWFzZUxpc3RTZWVkKGlkKSDigJQgV1VHTk9UICsgbWludGVkIFBvb2xUb2tlbiDihpIgY3JlYXRvcgovLyAgMikgRU9BOiBvcHRpb25hbCB3dWdub3QuV2l0aGRyYXcg4oaSIEFwcHJvdmUoemRleCBSZWFsbUFkZHIpIOKGkiBDcmVhdGVQb29sCi8vICAzKSBDb25maXJtWmRleExpc3QoaWQsIHBvb2xJZCkg4oCUIG1hcmsgTGlzdFZlbnVlPXpkZXgKLy8KLy8gUGVhcmwgaHViOiBnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvemRleC92MwovLyBDcmVhdGVQb29sKGN1ciwgdG9rZW5LZXksIHN5bWJvbCwgYW1vdW50VSwgYW1vdW50VCwgZmVlQnBzKSBzdHJpbmcKZnVuYyB0cnlMaXN0T25aZGV4KGN1ciByZWFsbSwgbCAqTGF1bmNoLCByYWlzZWRVZ25vdCwgbGlxVG9rZW5zIGludDY0KSBib29sIHsKCV8gPSBjdXIKCV8gPSByYWlzZWRVZ25vdAoJXyA9IGxpcVRva2VucwoJaWYgdGVzdEZvcmNlWmRleExpc3QgJiYgbCAhPSBuaWwgewoJCWwuR25vc3dhcExpc3RlZCA9IHRydWUgLy8gY29tcGF0ICJsaXN0ZWQiIGZsYWcgdXNlZCBieSBVSQoJCWwuR25vc3dhcFBvb2xQYXRoID0gInVnbm90fCIgKyBsLlN5bWJvbAoJCWwuR25vc3dhcFBvc2l0aW9uSUQgPSAwCgkJbC5MaXFXdWdub3RVc2VkID0gcmFpc2VkVWdub3QKCQlsLkdub3N3YXBOb3RlID0gImxpc3RlZCAodGVzdCBmb3JjZSB6ZGV4KSIKCQlsLkxpc3RWZW51ZSA9IFZlbnVlWmRleAoJCXJldHVybiB0cnVlCgl9CglpZiBsICE9IG5pbCB7CgkJaWYgbC5MaXN0U2VlZFJlbGVhc2VkIHsKCQkJbC5Hbm9zd2FwTm90ZSA9CgkJCQkiemRleDogc2VlZCByZWxlYXNlZCDigJQgRU9BIENyZWF0ZVBvb2wgdGhlbiBDb25maXJtWmRleExpc3QoaWQsIHVnbm90fFNZTUJPTCk7IFByZWZlcnJlZFZlbnVlPSIgKwoJCQkJCWwuUHJlZmVycmVkVmVudWUKCQl9IGVsc2UgewoJCQlsLkdub3N3YXBOb3RlID0KCQkJCSJ6ZGV4OiBSZWxlYXNlTGlzdFNlZWQg4oaSIEVPQSBDcmVhdGVQb29sIChXVUdOT1QgV2l0aGRyYXcgKyBBcHByb3ZlIFJlYWxtQWRkcikg4oaSIENvbmZpcm1aZGV4TGlzdDsgUHJlZmVycmVkVmVudWU9IiArCgkJCQkJbC5QcmVmZXJyZWRWZW51ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINNDAwMDAwMDB1Z25vdBITCIDO5M0CEgs1MDAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIxSbkPBmCe3ZSFiaUJ+zL/6L8e1SaZWRYmaiswDMtJkBJAeFi4QVF1wSt2tsuB6vmB3nd97fqcn72W2RB+nruEgWVO7i9hSvEYCs6DPp6A1LgfY/o8T+QNg6rFP7qUm3AVchooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==