aW1wb3J0IFcKaW1wb3J0IHN5cwppbXBvcnQgUWQKCl9fdmVyc2lvbl9fID0gIjAuMiIKX19hdXRob3JfXyA9ICJqdnIiCgpjbGFzcyBfbW9kdWxlYnJvd3NlcjoKCQoJZGVmIF9faW5pdF9fKHNlbGYpOgoJCXNlbGYuZWRpdG1vZHVsZXMgPSBbXQoJCXNlbGYubW9kdWxlcyA9IFtdCgkJc2VsZi53aW5kb3cgPSBXLldpbmRvdygoMTk0LCAxMDAwKSwgIk1vZHVsZSBCcm93c2VyIiwgbWluc2l6ZSA9ICgxOTQsIDE2MCksIG1heHNpemUgPSAoMzQwLCAyMDAwMCkpCgkJCgkJI3NlbGYud2luZG93LmJldmVsYm94ID0gVy5CZXZlbEJveCgoMCwgMCwgMCwgNTYpKQoJCXNlbGYud2luZG93Lm9wZW5idXR0b24gPSBXLkJ1dHRvbigoMTAsIDgsIDgwLCAxNiksICJPcGVuIiwgc2VsZi5vcGVuYnV0dG9uaGl0KQoJCXNlbGYud2luZG93LmJyb3dzZWJ1dHRvbiA9IFcuQnV0dG9uKCgxMDAsIDgsIDgwLCAxNiksICJCcm93c2WKIiwgc2VsZi5icm93c2VidXR0b25oaXQpCgkJc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uID0gVy5CdXR0b24oKDEwLCAzMiwgODAsIDE2KSwgIlJlbG9hZCIsIHNlbGYucmVsb2FkYnV0dG9uaGl0KQoJCXNlbGYud2luZG93Lm9wZW5vdGhlcmJ1dHRvbiA9IFcuQnV0dG9uKCgxMDAsIDMyLCA4MCwgMTYpLCAiT3BlbiBvdGhlcooiLCBzZWxmLm9wZW5vdGhlcikKCQkKCQlzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgwKQoJCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKCQlzZWxmLndpbmRvdy5icm93c2VidXR0b24uZW5hYmxlKDApCgkJc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5icm93c2VidXR0b24pCgkJCgkJc2VsZi53aW5kb3cuYmluZCgiY21kciIsIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5wdXNoKQoJCXNlbGYud2luZG93LmJpbmQoImNtZGIiLCBzZWxmLndpbmRvdy5icm93c2VidXR0b24ucHVzaCkKCQoJCXNlbGYud2luZG93LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQoJCXNlbGYud2luZG93LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmNsb3NlKQoJCQoJCXNlbGYud2luZG93Lmxpc3QgPSBXLkxpc3QoKC0xLCA1NiwgMSwgLTE0KSwgW10sIHNlbGYubGlzdGhpdCkKCQkKCQlzZWxmLndpbmRvdy5vcGVuKCkKCQlzZWxmLmNoZWNrYnV0dG9ucygpCgkKCWRlZiBjbG9zZShzZWxmKToKCQlnbG9iYWwgX2Jyb3dzZXIKCQlfYnJvd3NlciA9IE5vbmUKCQoJZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKCQlpZiBvbm9mZjoKCQkJc2VsZi5tYWtlbGlzdCgpCgkJCglkZWYgbGlzdGhpdChzZWxmLCBpc2RibCk6CgkJc2VsZi5jaGVja2J1dHRvbnMoKQoJCWlmIGlzZGJsOgoJCQlpZiBzZWxmLndpbmRvdy5fZGVmYXVsdGJ1dHRvbjoKCQkJCXNlbGYud2luZG93Ll9kZWZhdWx0YnV0dG9uLnB1c2goKQoJCglkZWYgY2hlY2tidXR0b25zKHNlbGYpOgoJCXNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKCQlpZiBzZWw6CgkJCWZvciBpIGluIHNlbDoKCQkJCWlmIHNlbGYuZWRpdG1vZHVsZXNbaV06CgkJCQkJc2VsZi53aW5kb3cub3BlbmJ1dHRvbi5lbmFibGUoMSkKCQkJCQlzZWxmLndpbmRvdy5yZWxvYWRidXR0b24uZW5hYmxlKDEpCgkJCQkJc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5vcGVuYnV0dG9uKQoJCQkJCWJyZWFrCgkJCWVsc2U6CgkJCQlzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgwKQoJCQkJc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uLmVuYWJsZSgwKQoJCQkJc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5icm93c2VidXR0b24pCgkJCXNlbGYud2luZG93LmJyb3dzZWJ1dHRvbi5lbmFibGUoMSkKCQllbHNlOgoJCQkjc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5icm93c2VidXR0b24pCgkJCXNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDApCgkJCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKCQkJc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLmVuYWJsZSgwKQoJCglkZWYgb3BlbmJ1dHRvbmhpdChzZWxmKToKCQlpbXBvcnQgaW1wCgkJc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQoJCVcuU2V0Q3Vyc29yKCJ3YXRjaCIpCgkJZm9yIGkgaW4gc2VsOgoJCQltb2RuYW1lID0gc2VsZi53aW5kb3cubGlzdFtpXQoJCQl0cnk6CgkJCQlzZWxmLm9wZW5zY3JpcHQoc3lzLm1vZHVsZXNbbW9kbmFtZV0uX19maWxlX18sIG1vZG5hbWUpCgkJCWV4Y2VwdCBJT0Vycm9yOgoJCQkJdHJ5OgoJCQkJCWZpbGUsIHBhdGgsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUpCgkJCQlleGNlcHQgSW1wb3J0RXJyb3I6CgkJCQkJVy5TZXRDdXJzb3IoImFycm93IikKCQkJCQlXLk1lc3NhZ2UoIkNhbrl0IGZpbmQgZmlsZSBmb3IgbW9kdWxlILMlc7IuIiAKCQkJCQkJCSUgbW9kbmFtZSkKCQkJCWVsc2U6CgkJCQkJc2VsZi5vcGVuc2NyaXB0KHBhdGgsIG1vZG5hbWUpCQkJCQkKCQoJZGVmIG9wZW5zY3JpcHQoc2VsZiwgcGF0aCwgbW9kbmFtZSk6CgkJaW1wb3J0IG9zCgkJaWYgcGF0aFstMzpdID09ICcucHknOgoJCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChwYXRoLCBtb2RuYW1lPW1vZG5hbWUpCgkJZWxpZiBwYXRoWy00Ol0gaW4gWycucHljJywgJy5weW8nXToKCQkJVy5nZXRhcHBsaWNhdGlvbigpLm9wZW5zY3JpcHQocGF0aFs6LTFdLCBtb2RuYW1lPW1vZG5hbWUpCgkJZWxzZToKCQkJVy5NZXNzYWdlKCJDYW65dCBlZGl0ILMlc7I7IGl0IG1pZ2h0IGJlIGEgc2hhcmVkIGxpYnJhcnkgb3IgYSAucHljIGZpbGUuIiAKCQkJCQklIG1vZG5hbWUpCgkKCWRlZiBvcGVub3RoZXIoc2VsZik6CgkJaW1wb3J0IGltcAoJCWltcG9ydCBFYXN5RGlhbG9ncwoJCQoJCW1vZG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIk9wZW4gbW9kdWxlOiIpCgkJaWYgbW9kbmFtZToKCQkJdHJ5OgoJCQkJZmlsZSwgcGF0aCwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUobW9kbmFtZSkKCQkJZXhjZXB0IEltcG9ydEVycm9yOgoJCQkJaWYgbW9kbmFtZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CgkJCQkJYWxlcnR0ZXh0ID0gIrMlc7IgaXMgYSBidWlsdGluIG1vZHVsZSwgd2hpY2ggeW91IGNhbrl0IGVkaXQuIiAlIG1vZG5hbWUKCQkJCWVsc2U6CgkJCQkJYWxlcnR0ZXh0ID0gIk5vIG1vZHVsZSBuYW1lZCCzJXOyLiIgJSBtb2RuYW1lCgkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsIGFsZXJ0dGV4dAoJCQlzZWxmLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZSkKCQoJZGVmIHJlbG9hZGJ1dHRvbmhpdChzZWxmKToKCQlzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGlvbigpCgkJVy5TZXRDdXJzb3IoIndhdGNoIikKCQlmb3IgaSBpbiBzZWw6CgkJCW1uYW1lID0gc2VsZi53aW5kb3cubGlzdFtpXQoJCQltID0gc3lzLm1vZHVsZXNbbW5hbWVdCgkJCSMgU2V0IHRoZSBfX25hbWVfXyBhdHRyaWJ1dGUgb2YgdGhlIG1vZHVsZSB0byBpdHMgcmVhbCBuYW1lLgoJCQkjIHJlbG9hZCgpIGNvbXBsYWlucyBpZiBpdCdzIF9fbWFpbl9fLCB3aGljaCBpcyB0cnVlCgkJCSMgd2hlbiBpdCByZWNlbnRseSBoYXMgYmVlbiBydW4gYXMgYSBzY3JpcHQgd2l0aCAiUnVuIGFzIF9fbWFpbl9fIiAKCQkJIyBlbmFibGVkLgoJCQltLl9fbmFtZV9fID0gbW5hbWUKCQkJcmVsb2FkKG0pCgkKCWRlZiBicm93c2VidXR0b25oaXQoc2VsZik6CgkJc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQoJCWlmIG5vdCBzZWw6CgkJCXJldHVybgoJCWltcG9ydCBQeUJyb3dzZXIKCQlmb3IgaSBpbiBzZWw6CgkJCVB5QnJvd3Nlci5Ccm93c2VyKHN5cy5tb2R1bGVzW3NlbGYud2luZG93Lmxpc3RbaV1dKQoJCglkZWYgbWFrZWxpc3Qoc2VsZik6CgkJZWRpdG1vZHVsZXMsIG1vZHVsZXMgPSBnZXRtb2R1bGVzbGlzdCgpCgkJaWYgbW9kdWxlcyA9PSBzZWxmLm1vZHVsZXM6CgkJCXJldHVybgoJCXNlbGYuZWRpdG1vZHVsZXMsIHNlbGYubW9kdWxlcyA9IGVkaXRtb2R1bGVzLCBtb2R1bGVzCgkJc2VsZi53aW5kb3cubGlzdC5zZXRkcmF3aW5nbW9kZSgwKQoJCXNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKCQlzZWxmLndpbmRvdy5saXN0LnNldChzZWxmLm1vZHVsZXMpCgkJc2VsZi53aW5kb3cubGlzdC5zZXRzZWxlY3RlZG9iamVjdHMoc2VsKQoJCXNlbGYud2luZG93Lmxpc3Quc2V0ZHJhd2luZ21vZGUoMSkKCgpkZWYgZ2V0bW9kdWxlc2xpc3QoKToKCWltcG9ydCBQeUJyb3dzZXIJIyBmb3IgY2FzZWxlc3Nzb3J0IGZ1bmN0aW9uCgltb2R1bGVpdGVtcyA9IHN5cy5tb2R1bGVzLml0ZW1zKCkKCW1vZHVsZWl0ZW1zID0gZmlsdGVyKGxhbWJkYSAobmFtZSwgbW9kdWxlKTogbW9kdWxlIGlzIG5vdCBOb25lLCBtb2R1bGVpdGVtcykKCW1vZHVsZXMgPSBtYXAobGFtYmRhIChuYW1lLCBtb2R1bGUpOiBuYW1lLCBtb2R1bGVpdGVtcykKCW1vZHVsZXMgPSBQeUJyb3dzZXIuY2FzZWxlc3Nzb3J0KG1vZHVsZXMpCgllZGl0bW9kdWxlcyA9IFtdCglzeXNtb2R1bGVzID0gc3lzLm1vZHVsZXMKCW1vZHVsZXNhcHBlbmQgPSBlZGl0bW9kdWxlcy5hcHBlbmQKCWZvciBtIGluIG1vZHVsZXM6CgkJbW9kdWxlID0gc3lzbW9kdWxlc1ttXQoJCXRyeToKCQkJaWYgc3lzbW9kdWxlc1ttXS5fX2ZpbGVfX1stMzpdID09ICcucHknIG9yIFwKCQkJCQlzeXNtb2R1bGVzW21dLl9fZmlsZV9fWy00Ol0gaW4gWycucHljJywgJy5weW8nXToKCQkJCW1vZHVsZXNhcHBlbmQoMSkKCQkJZWxzZToKCQkJCW1vZHVsZXNhcHBlbmQoMCkKCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6CgkJCW1vZHVsZXNhcHBlbmQoMCkKCXJldHVybiBlZGl0bW9kdWxlcywgbW9kdWxlcwoJCgkKCl9icm93c2VyID0gTm9uZQoKZGVmIE1vZHVsZUJyb3dzZXIoKToKCWdsb2JhbCBfYnJvd3NlcgoJaWYgX2Jyb3dzZXIgaXMgbm90IE5vbmU6CgkJX2Jyb3dzZXIud2luZG93LnNlbGVjdCgpCgllbHNlOgoJCV9icm93c2VyID0gX21vZHVsZWJyb3dzZXIoKQo=