Ly8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgTmF0dXJhbCBEb2NzLCB3aGljaCBpcyBDb3B5cmlnaHQgqSAyMDAzLTIwMTAgR3JlZyBWYWx1cmUNCi8vIE5hdHVyYWwgRG9jcyBpcyBsaWNlbnNlZCB1bmRlciB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoQUdQTCkNCi8vIFJlZmVyIHRvIExpY2Vuc2UudHh0IGZvciB0aGUgY29tcGxldGUgZGV0YWlscw0KDQovLyBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHdpdGggZG9jdW1lbnRhdGlvbiBmaWxlcyBnZW5lcmF0ZWQgYnkgTmF0dXJhbCBEb2NzLg0KLy8gU3VjaCBkb2N1bWVudGF0aW9uIGlzIG5vdCBjb3ZlcmVkIGJ5IE5hdHVyYWwgRG9jcycgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcsDQovLyBhbmQgbWF5IGhhdmUgaXRzIG93biBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyBkZWNpZGVkIGJ5IGl0cyBhdXRob3IuDQoNCg0KLy8NCi8vICBCcm93c2VyIFN0eWxlcw0KLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQp2YXIgYWd0PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsNCnZhciBicm93c2VyVHlwZTsNCnZhciBicm93c2VyVmVyOw0KDQppZiAoYWd0LmluZGV4T2YoIm9wZXJhIikgIT0gLTEpDQogICAgew0KICAgIGJyb3dzZXJUeXBlID0gIk9wZXJhIjsNCg0KICAgIGlmIChhZ3QuaW5kZXhPZigib3BlcmEgNyIpICE9IC0xIHx8IGFndC5pbmRleE9mKCJvcGVyYS83IikgIT0gLTEpDQogICAgICAgIHsgIGJyb3dzZXJWZXIgPSAiT3BlcmE3IjsgIH0NCiAgICBlbHNlIGlmIChhZ3QuaW5kZXhPZigib3BlcmEgOCIpICE9IC0xIHx8IGFndC5pbmRleE9mKCJvcGVyYS84IikgIT0gLTEpDQogICAgICAgIHsgIGJyb3dzZXJWZXIgPSAiT3BlcmE4IjsgIH0NCiAgICBlbHNlIGlmIChhZ3QuaW5kZXhPZigib3BlcmEgOSIpICE9IC0xIHx8IGFndC5pbmRleE9mKCJvcGVyYS85IikgIT0gLTEpDQogICAgICAgIHsgIGJyb3dzZXJWZXIgPSAiT3BlcmE5IjsgIH0NCiAgICB9DQoNCmVsc2UgaWYgKGFndC5pbmRleE9mKCJhcHBsZXdlYmtpdCIpICE9IC0xKQ0KICAgIHsNCiAgICBicm93c2VyVHlwZSA9ICJTYWZhcmkiOw0KDQogICAgaWYgKGFndC5pbmRleE9mKCJ2ZXJzaW9uLzMiKSAhPSAtMSkNCiAgICAgICAgeyAgYnJvd3NlclZlciA9ICJTYWZhcmkzIjsgIH0NCiAgICBlbHNlIGlmIChhZ3QuaW5kZXhPZigic2FmYXJpLzQiKSAhPSAtMSkNCiAgICAgICAgeyAgYnJvd3NlclZlciA9ICJTYWZhcmkyIjsgIH0NCiAgICB9DQoNCmVsc2UgaWYgKGFndC5pbmRleE9mKCJraHRtbCIpICE9IC0xKQ0KICAgIHsNCiAgICBicm93c2VyVHlwZSA9ICJLb25xdWVyb3IiOw0KICAgIH0NCg0KZWxzZSBpZiAoYWd0LmluZGV4T2YoIm1zaWUiKSAhPSAtMSkNCiAgICB7DQogICAgYnJvd3NlclR5cGUgPSAiSUUiOw0KDQogICAgaWYgKGFndC5pbmRleE9mKCJtc2llIDYiKSAhPSAtMSkNCiAgICAgICAgeyAgYnJvd3NlclZlciA9ICJJRTYiOyAgfQ0KICAgIGVsc2UgaWYgKGFndC5pbmRleE9mKCJtc2llIDciKSAhPSAtMSkNCiAgICAgICAgeyAgYnJvd3NlclZlciA9ICJJRTciOyAgfQ0KICAgIH0NCg0KZWxzZSBpZiAoYWd0LmluZGV4T2YoImdlY2tvIikgIT0gLTEpDQogICAgew0KICAgIGJyb3dzZXJUeXBlID0gIkZpcmVmb3giOw0KDQogICAgaWYgKGFndC5pbmRleE9mKCJydjoxLjciKSAhPSAtMSkNCiAgICAgICAgeyAgYnJvd3NlclZlciA9ICJGaXJlZm94MSI7ICB9DQogICAgZWxzZSBpZiAoYWd0LmluZGV4T2YoInJ2OjEuOCkiKSAhPSAtMSB8fCBhZ3QuaW5kZXhPZigicnY6MS44LjAiKSAhPSAtMSkNCiAgICAgICAgeyAgYnJvd3NlclZlciA9ICJGaXJlZm94MTUiOyAgfQ0KICAgIGVsc2UgaWYgKGFndC5pbmRleE9mKCJydjoxLjguMSIpICE9IC0xKQ0KICAgICAgICB7ICBicm93c2VyVmVyID0gIkZpcmVmb3gyIjsgIH0NCiAgICB9DQoNCg0KLy8NCi8vICBTdXBwb3J0IEZ1bmN0aW9ucw0KLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCmZ1bmN0aW9uIEdldFhQb3NpdGlvbihpdGVtKQ0KICAgIHsNCiAgICB2YXIgcG9zaXRpb24gPSAwOw0KDQogICAgaWYgKGl0ZW0ub2Zmc2V0V2lkdGggIT0gbnVsbCkNCiAgICAgICAgew0KICAgICAgICB3aGlsZSAoaXRlbSAhPSBkb2N1bWVudC5ib2R5ICYmIGl0ZW0gIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIHBvc2l0aW9uICs9IGl0ZW0ub2Zmc2V0TGVmdDsNCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLm9mZnNldFBhcmVudDsNCiAgICAgICAgICAgIH07DQogICAgICAgIH07DQoNCiAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KDQpmdW5jdGlvbiBHZXRZUG9zaXRpb24oaXRlbSkNCiAgICB7DQogICAgdmFyIHBvc2l0aW9uID0gMDsNCg0KICAgIGlmIChpdGVtLm9mZnNldFdpZHRoICE9IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgd2hpbGUgKGl0ZW0gIT0gZG9jdW1lbnQuYm9keSAmJiBpdGVtICE9IG51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICBwb3NpdGlvbiArPSBpdGVtLm9mZnNldFRvcDsNCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLm9mZnNldFBhcmVudDsNCiAgICAgICAgICAgIH07DQogICAgICAgIH07DQoNCiAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KDQpmdW5jdGlvbiBNb3ZlVG9Qb3NpdGlvbihpdGVtLCB4LCB5KQ0KICAgIHsNCiAgICAvLyBPcGVyYSA1IGNob2tlcyBvbiB0aGUgcHggZXh0ZW5zaW9uLCBzbyBpdCBjYW4gdXNlIHRoZSBNaWNyb3NvZnQgb25lIGluc3RlYWQuDQoNCiAgICBpZiAoaXRlbS5zdHlsZS5sZWZ0ICE9IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgaXRlbS5zdHlsZS5sZWZ0ID0geCArICJweCI7DQogICAgICAgIGl0ZW0uc3R5bGUudG9wID0geSArICJweCI7DQogICAgICAgIH0NCiAgICBlbHNlIGlmIChpdGVtLnN0eWxlLnBpeGVsTGVmdCAhPSBudWxsKQ0KICAgICAgICB7DQogICAgICAgIGl0ZW0uc3R5bGUucGl4ZWxMZWZ0ID0geDsNCiAgICAgICAgaXRlbS5zdHlsZS5waXhlbFRvcCA9IHk7DQogICAgICAgIH07DQogICAgfTsNCg0KDQovLw0KLy8gIE1lbnUNCi8vIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KDQpmdW5jdGlvbiBUb2dnbGVNZW51KGlkKQ0KICAgIHsNCiAgICBpZiAoIXdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCkNCiAgICAgICAgeyAgcmV0dXJuOyAgfTsNCg0KICAgIHZhciBkaXNwbGF5ID0gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5Ow0KDQogICAgaWYgKGRpc3BsYXkgPT0gIm5vbmUiKQ0KICAgICAgICB7ICBkaXNwbGF5ID0gImJsb2NrIjsgIH0NCiAgICBlbHNlDQogICAgICAgIHsgIGRpc3BsYXkgPSAibm9uZSI7ICB9DQoNCiAgICB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5Ow0KICAgIH0NCg0KZnVuY3Rpb24gSGlkZUFsbEJ1dChpZHMsIG1heCkNCiAgICB7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKQ0KICAgICAgICB7DQogICAgICAgIGlkcy5zb3J0KCBmdW5jdGlvbihhLGIpIHsgcmV0dXJuIGEgLSBiOyB9ICk7DQogICAgICAgIHZhciBudW1iZXIgPSAxOw0KDQogICAgICAgIHdoaWxlIChudW1iZXIgPCBtYXgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICBpZiAoaWRzLmxlbmd0aCA+IDAgJiYgbnVtYmVyID09IGlkc1swXSkNCiAgICAgICAgICAgICAgICB7ICBpZHMuc2hpZnQoKTsgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1Hcm91cENvbnRlbnQiICsgbnVtYmVyKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIG51bWJlcisrOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfTsNCiAgICB9DQoNCg0KLy8NCi8vICBUb29sdGlwcw0KLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCnZhciB0b29sdGlwVGltZXIgPSAwOw0KDQpmdW5jdGlvbiBTaG93VGlwKGV2ZW50LCB0b29sdGlwSUQsIGxpbmtJRCkNCiAgICB7DQogICAgaWYgKHRvb2x0aXBUaW1lcikNCiAgICAgICAgeyAgY2xlYXJUaW1lb3V0KHRvb2x0aXBUaW1lcik7ICB9Ow0KDQogICAgdmFyIGRvY1ggPSBldmVudC5jbGllbnRYICsgd2luZG93LnBhZ2VYT2Zmc2V0Ow0KICAgIHZhciBkb2NZID0gZXZlbnQuY2xpZW50WSArIHdpbmRvdy5wYWdlWU9mZnNldDsNCg0KICAgIHZhciBzaG93Q29tbWFuZCA9ICJSZWFsbHlTaG93VGlwKCciICsgdG9vbHRpcElEICsgIicsICciICsgbGlua0lEICsgIicsICIgKyBkb2NYICsgIiwgIiArIGRvY1kgKyAiKSI7DQoNCiAgICB0b29sdGlwVGltZXIgPSBzZXRUaW1lb3V0KHNob3dDb21tYW5kLCAxMDAwKTsNCiAgICB9DQoNCmZ1bmN0aW9uIFJlYWxseVNob3dUaXAodG9vbHRpcElELCBsaW5rSUQsIGRvY1gsIGRvY1kpDQogICAgew0KICAgIHRvb2x0aXBUaW1lciA9IDA7DQoNCiAgICB2YXIgdG9vbHRpcDsNCiAgICB2YXIgbGluazsNCg0KICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkNCiAgICAgICAgew0KICAgICAgICB0b29sdGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodG9vbHRpcElEKTsNCiAgICAgICAgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxpbmtJRCk7DQogICAgICAgIH0NCi8qICAgIGVsc2UgaWYgKGRvY3VtZW50LmFsbCkNCiAgICAgICAgew0KICAgICAgICB0b29sdGlwID0gZXZhbCgiZG9jdW1lbnQuYWxsWyciICsgdG9vbHRpcElEICsgIiddIik7DQogICAgICAgIGxpbmsgPSBldmFsKCJkb2N1bWVudC5hbGxbJyIgKyBsaW5rSUQgKyAiJ10iKTsNCiAgICAgICAgfQ0KKi8NCiAgICBpZiAodG9vbHRpcCkNCiAgICAgICAgew0KICAgICAgICB2YXIgbGVmdCA9IEdldFhQb3NpdGlvbihsaW5rKTsNCiAgICAgICAgdmFyIHRvcCA9IEdldFlQb3NpdGlvbihsaW5rKTsNCiAgICAgICAgdG9wICs9IGxpbmsub2Zmc2V0SGVpZ2h0Ow0KDQoNCiAgICAgICAgLy8gVGhlIGZhbGxiYWNrIG1ldGhvZCBpcyB0byB1c2UgdGhlIG1vdXNlIFggYW5kIFkgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LiAgV2UgdXNlIGEgc2VwYXJhdGUgaWYgYW5kIHRlc3QgaWYgaXRzIGEgbnVtYmVyDQogICAgICAgIC8vIGluIGNhc2Ugc29tZSBicm93c2VyIHNudWNrIHRocm91Z2ggdGhlIGFib3ZlIGlmIHN0YXRlbWVudCBidXQgZGlkbid0IHN1cHBvcnQgZXZlcnl0aGluZy4NCg0KICAgICAgICBpZiAoIWlzRmluaXRlKHRvcCkgfHwgdG9wID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICBsZWZ0ID0gZG9jWDsNCiAgICAgICAgICAgIHRvcCA9IGRvY1k7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgLy8gU29tZSBzcGFjaW5nIHRvIGdldCBpdCBvdXQgZnJvbSB1bmRlciB0aGUgY3Vyc29yLg0KDQogICAgICAgIHRvcCArPSAxMDsNCg0KICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRvb2x0aXAgZG9lc250IGdldCBzbXVzaGVkIGJ5IGJlaW5nIHRvbyBjbG9zZSB0byB0aGUgZWRnZSwgb3IgaW4gc29tZSBicm93c2VycywgZ28gb2ZmIHRoZSBlZGdlIG9mIHRoZQ0KICAgICAgICAvLyBwYWdlLiAgV2UgZG8gaXQgaGVyZSBiZWNhdXNlIEtvbnF1ZXJvciBkb2VzIGdldCBvZmZzZXRXaWR0aCByaWdodCBldmVuIGlmIGl0IGRvZXNudCBnZXQgdGhlIHBvc2l0aW9uaW5nIHJpZ2h0Lg0KDQogICAgICAgIGlmICh0b29sdGlwLm9mZnNldFdpZHRoICE9IG51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICB2YXIgd2lkdGggPSB0b29sdGlwLm9mZnNldFdpZHRoOw0KICAgICAgICAgICAgdmFyIGRvY1dpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsNCg0KICAgICAgICAgICAgaWYgKGxlZnQgKyB3aWR0aCA+IGRvY1dpZHRoKQ0KICAgICAgICAgICAgICAgIHsgIGxlZnQgPSBkb2NXaWR0aCAtIHdpZHRoIC0gMTsgIH0NCg0KICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIGhvcml6b250YWwgc2Nyb2xsIGJhciB3ZSBjb3VsZCBnbyBwYXN0IHplcm8gYmVjYXVzZSBpdCdzIHVzaW5nIHRoZSBwYWdlIHdpZHRoLCBub3QgdGhlIHdpbmRvdyB3aWR0aC4NCiAgICAgICAgICAgIGlmIChsZWZ0IDwgMCkNCiAgICAgICAgICAgICAgICB7ICBsZWZ0ID0gMDsgIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgTW92ZVRvUG9zaXRpb24odG9vbHRpcCwgbGVmdCwgdG9wKTsNCiAgICAgICAgdG9vbHRpcC5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KICAgICAgICB9DQogICAgfQ0KDQpmdW5jdGlvbiBIaWRlVGlwKHRvb2x0aXBJRCkNCiAgICB7DQogICAgaWYgKHRvb2x0aXBUaW1lcikNCiAgICAgICAgew0KICAgICAgICBjbGVhclRpbWVvdXQodG9vbHRpcFRpbWVyKTsNCiAgICAgICAgdG9vbHRpcFRpbWVyID0gMDsNCiAgICAgICAgfQ0KDQogICAgdmFyIHRvb2x0aXA7DQoNCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpDQogICAgICAgIHsgIHRvb2x0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b29sdGlwSUQpOyB9DQogICAgZWxzZSBpZiAoZG9jdW1lbnQuYWxsKQ0KICAgICAgICB7ICB0b29sdGlwID0gZXZhbCgiZG9jdW1lbnQuYWxsWyciICsgdG9vbHRpcElEICsgIiddIik7ICB9DQoNCiAgICBpZiAodG9vbHRpcCkNCiAgICAgICAgeyAgdG9vbHRpcC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7ICB9DQogICAgfQ0KDQoNCi8vDQovLyAgQmxvY2txdW90ZSBmaXggZm9yIElFDQovLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCg0KZnVuY3Rpb24gTkRPbkxvYWQoKQ0KICAgIHsNCiAgICBpZiAoYnJvd3NlclZlciA9PSAiSUU2IikNCiAgICAgICAgew0KICAgICAgICB2YXIgc2Nyb2xsYm94ZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmxvY2txdW90ZScpOw0KDQogICAgICAgIGlmIChzY3JvbGxib3hlcy5pdGVtKDApKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgTkREb1Jlc2l6ZSgpOw0KICAgICAgICAgICAgd2luZG93Lm9ucmVzaXplPU5ET25SZXNpemU7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9Ow0KICAgIH07DQoNCg0KdmFyIHJlc2l6ZVRpbWVyID0gMDsNCg0KZnVuY3Rpb24gTkRPblJlc2l6ZSgpDQogICAgew0KICAgIGlmIChyZXNpemVUaW1lciAhPSAwKQ0KICAgICAgICB7ICBjbGVhclRpbWVvdXQocmVzaXplVGltZXIpOyAgfTsNCg0KICAgIHJlc2l6ZVRpbWVyID0gc2V0VGltZW91dChORERvUmVzaXplLCAyNTApOw0KICAgIH07DQoNCg0KZnVuY3Rpb24gTkREb1Jlc2l6ZSgpDQogICAgew0KICAgIHZhciBzY3JvbGxib3hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdibG9ja3F1b3RlJyk7DQoNCiAgICB2YXIgaTsNCiAgICB2YXIgaXRlbTsNCg0KICAgIGkgPSAwOw0KICAgIHdoaWxlIChpdGVtID0gc2Nyb2xsYm94ZXMuaXRlbShpKSkNCiAgICAgICAgew0KICAgICAgICBpdGVtLnN0eWxlLndpZHRoID0gMTAwOw0KICAgICAgICBpKys7DQogICAgICAgIH07DQoNCiAgICBpID0gMDsNCiAgICB3aGlsZSAoaXRlbSA9IHNjcm9sbGJveGVzLml0ZW0oaSkpDQogICAgICAgIHsNCiAgICAgICAgaXRlbS5zdHlsZS53aWR0aCA9IGl0ZW0ucGFyZW50Tm9kZS5vZmZzZXRXaWR0aDsNCiAgICAgICAgaSsrOw0KICAgICAgICB9Ow0KDQogICAgY2xlYXJUaW1lb3V0KHJlc2l6ZVRpbWVyKTsNCiAgICByZXNpemVUaW1lciA9IDA7DQogICAgfQ0KDQoNCg0KLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KICAgIENsYXNzOiBTZWFyY2hQYW5lbA0KICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCiAgICBBIGNsYXNzIGhhbmRsaW5nIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWFyY2ggcGFuZWwuDQoNCiAgICBQYXJhbWV0ZXJzOg0KDQogICAgICAgIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSBzdG9yaW5nIHRoaXMgaW5zdGFuY2UuICBJcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBzZXQgdGltZW91dHMuDQogICAgICAgIG1vZGUgLSBUaGUgbW9kZSB0aGUgc2VhcmNoIGlzIGdvaW5nIHRvIHdvcmsgaW4uICBQYXNzIDxOYXR1cmFsRG9jczo6QnVpbGRlcjo6QmFzZS0+Q29tbWFuZExpbmVPcHRpb24oKT4sIHNvIHRoZQ0KICAgICAgICAgICAgICAgICAgIHZhbHVlIHdpbGwgYmUgc29tZXRoaW5nIGxpa2UgIkhUTUwiIG9yICJGcmFtZWRIVE1MIi4NCg0KICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoqLw0KDQoNCmZ1bmN0aW9uIFNlYXJjaFBhbmVsKG5hbWUsIG1vZGUsIHJlc3VsdHNQYXRoKQ0KICAgIHsNCiAgICBpZiAoIW5hbWUgfHwgIW1vZGUgfHwgIXJlc3VsdHNQYXRoKQ0KICAgICAgICB7ICBhbGVydCgiSW5jb3JyZWN0IHBhcmFtZXRlcnMgdG8gU2VhcmNoUGFuZWwuIik7ICB9Ow0KDQoNCiAgICAvLyBHcm91cDogVmFyaWFibGVzDQogICAgLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCiAgICAvKg0KICAgICAgICB2YXI6IG5hbWUNCiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgc3RvcmluZyB0aGlzIGluc3RhbmNlIG9mIHRoZSBjbGFzcy4NCiAgICAqLw0KICAgIHRoaXMubmFtZSA9IG5hbWU7DQoNCiAgICAvKg0KICAgICAgICB2YXI6IG1vZGUNCiAgICAgICAgVGhlIG1vZGUgdGhlIHNlYXJjaCBpcyBnb2luZyB0byB3b3JrIGluLCBzdWNoIGFzICJIVE1MIiBvciAiRnJhbWVkSFRNTCIuDQogICAgKi8NCiAgICB0aGlzLm1vZGUgPSBtb2RlOw0KDQogICAgLyoNCiAgICAgICAgdmFyOiByZXN1bHRzUGF0aA0KICAgICAgICBUaGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB0byB0aGUgcmVzdWx0cyBwYWdlIGRpcmVjdG9yeS4NCiAgICAqLw0KICAgIHRoaXMucmVzdWx0c1BhdGggPSByZXN1bHRzUGF0aDsNCg0KICAgIC8qDQogICAgICAgIHZhcjoga2V5VGltZW91dA0KICAgICAgICBUaGUgdGltZW91dCB1c2VkIGJldHdlZW4gYSBrZXlzdHJva2UgYW5kIHdoZW4gYSBzZWFyY2ggaXMgcGVyZm9ybWVkLg0KICAgICovDQogICAgdGhpcy5rZXlUaW1lb3V0ID0gMDsNCg0KICAgIC8qDQogICAgICAgIHZhcjoga2V5VGltZW91dExlbmd0aA0KICAgICAgICBUaGUgbGVuZ3RoIG9mIDxrZXlUaW1lb3V0PiBpbiB0aG91c2FuZHRocyBvZiBhIHNlY29uZC4NCiAgICAqLw0KICAgIHRoaXMua2V5VGltZW91dExlbmd0aCA9IDUwMDsNCg0KICAgIC8qDQogICAgICAgIHZhcjogbGFzdFNlYXJjaFZhbHVlDQogICAgICAgIFRoZSBsYXN0IHNlYXJjaCBzdHJpbmcgZXhlY3V0ZWQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub25lLg0KICAgICovDQogICAgdGhpcy5sYXN0U2VhcmNoVmFsdWUgPSAiIjsNCg0KICAgIC8qDQogICAgICAgIHZhcjogbGFzdFJlc3VsdHNQYWdlDQogICAgICAgIFRoZSBsYXN0IHJlc3VsdHMgcGFnZS4gIFRoZSB2YWx1ZSBpcyBvbmx5IHJlbGV2YW50IGlmIDxsYXN0U2VhcmNoVmFsdWU+IGlzIHNldC4NCiAgICAqLw0KICAgIHRoaXMubGFzdFJlc3VsdHNQYWdlID0gIiI7DQoNCiAgICAvKg0KICAgICAgICB2YXI6IGRlYWN0aXZhdGVUaW1lb3V0DQoNCiAgICAgICAgVGhlIHRpbWVvdXQgdXNlZCBiZXR3ZWVuIHdoZW4gYSBjb250cm9sIGlzIGRlYWN0aXZhdGVkIGFuZCB3aGVuIHRoZSBlbnRpcmUgcGFuZWwgaXMgZGVhY3RpdmF0ZWQuICBJcyBuZWNlc3NhcnkNCiAgICAgICAgYmVjYXVzZSBhIGNvbnRyb2wgbWF5IGJlIGRlYWN0aXZhdGVkIGluIGZhdm9yIG9mIGFub3RoZXIgY29udHJvbCBpbiB0aGUgc2FtZSBwYW5lbCwgaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQgc3RheQ0KICAgICAgICBhY3RpdmUuDQogICAgKi8NCiAgICB0aGlzLmRlYWN0aXZhdGVUaW1vdXQgPSAwOw0KDQogICAgLyoNCiAgICAgICAgdmFyOiBkZWFjdGl2YXRlVGltZW91dExlbmd0aA0KICAgICAgICBUaGUgbGVuZ3RoIG9mIDxkZWFjdGl2YXRlVGltZW91dD4gaW4gdGhvdXNhbmR0aHMgb2YgYSBzZWNvbmQuDQogICAgKi8NCiAgICB0aGlzLmRlYWN0aXZhdGVUaW1lb3V0TGVuZ3RoID0gMjAwOw0KDQoNCg0KDQogICAgLy8gR3JvdXA6IERPTSBFbGVtZW50cw0KICAgIC8vIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCiAgICAvLyBGdW5jdGlvbjogRE9NU2VhcmNoRmllbGQNCiAgICB0aGlzLkRPTVNlYXJjaEZpZWxkID0gZnVuY3Rpb24oKQ0KICAgICAgICB7ICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1TZWFyY2hGaWVsZCIpOyAgfTsNCg0KICAgIC8vIEZ1bmN0aW9uOiBET01TZWFyY2hUeXBlDQogICAgdGhpcy5ET01TZWFyY2hUeXBlID0gZnVuY3Rpb24oKQ0KICAgICAgICB7ICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1TZWFyY2hUeXBlIik7ICB9Ow0KDQogICAgLy8gRnVuY3Rpb246IERPTVBvcHVwU2VhcmNoUmVzdWx0cw0KICAgIHRoaXMuRE9NUG9wdXBTZWFyY2hSZXN1bHRzID0gZnVuY3Rpb24oKQ0KICAgICAgICB7ICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1TZWFyY2hSZXN1bHRzIik7ICB9Ow0KDQogICAgLy8gRnVuY3Rpb246IERPTVBvcHVwU2VhcmNoUmVzdWx0c1dpbmRvdw0KICAgIHRoaXMuRE9NUG9wdXBTZWFyY2hSZXN1bHRzV2luZG93ID0gZnVuY3Rpb24oKQ0KICAgICAgICB7ICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1TZWFyY2hSZXN1bHRzV2luZG93Iik7ICB9Ow0KDQogICAgLy8gRnVuY3Rpb246IERPTVNlYXJjaFBhbmVsDQogICAgdGhpcy5ET01TZWFyY2hQYW5lbCA9IGZ1bmN0aW9uKCkNCiAgICAgICAgeyAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNU2VhcmNoUGFuZWwiKTsgIH07DQoNCg0KDQoNCiAgICAvLyBHcm91cDogRXZlbnQgSGFuZGxlcnMNCiAgICAvLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KDQogICAgLyoNCiAgICAgICAgRnVuY3Rpb246IE9uU2VhcmNoRmllbGRGb2N1cw0KICAgICAgICBDYWxsZWQgd2hlbiBmb2N1cyBpcyBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIHNlYXJjaCBmaWVsZC4NCiAgICAqLw0KICAgIHRoaXMuT25TZWFyY2hGaWVsZEZvY3VzID0gZnVuY3Rpb24oaXNBY3RpdmUpDQogICAgICAgIHsNCiAgICAgICAgdGhpcy5BY3RpdmF0ZShpc0FjdGl2ZSk7DQogICAgICAgIH07DQoNCg0KICAgIC8qDQogICAgICAgIEZ1bmN0aW9uOiBPblNlYXJjaEZpZWxkQ2hhbmdlDQogICAgICAgIENhbGxlZCB3aGVuIHRoZSBjb250ZW50IG9mIHRoZSBzZWFyY2ggZmllbGQgaXMgY2hhbmdlZC4NCiAgICAqLw0KICAgIHRoaXMuT25TZWFyY2hGaWVsZENoYW5nZSA9IGZ1bmN0aW9uKCkNCiAgICAgICAgew0KICAgICAgICBpZiAodGhpcy5rZXlUaW1lb3V0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMua2V5VGltZW91dCk7DQogICAgICAgICAgICB0aGlzLmtleVRpbWVvdXQgPSAwOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICB2YXIgc2VhcmNoVmFsdWUgPSB0aGlzLkRPTVNlYXJjaEZpZWxkKCkudmFsdWUucmVwbGFjZSgvICsvZywgIiIpOw0KDQogICAgICAgIGlmIChzZWFyY2hWYWx1ZSAhPSB0aGlzLmxhc3RTZWFyY2hWYWx1ZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIGlmIChzZWFyY2hWYWx1ZSAhPSAiIikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5rZXlUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLm5hbWUgKyAiLlNlYXJjaCgpIiwgdGhpcy5rZXlUaW1lb3V0TGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT0gIkhUTUwiKQ0KICAgICAgICAgICAgICAgICAgICB7ICB0aGlzLkRPTVBvcHVwU2VhcmNoUmVzdWx0c1dpbmRvdygpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7ICB9Ow0KICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaFZhbHVlID0gIiI7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH07DQoNCg0KICAgIC8qDQogICAgICAgIEZ1bmN0aW9uOiBPblNlYXJjaFR5cGVGb2N1cw0KICAgICAgICBDYWxsZWQgd2hlbiBmb2N1cyBpcyBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIHNlYXJjaCB0eXBlLg0KICAgICovDQogICAgdGhpcy5PblNlYXJjaFR5cGVGb2N1cyA9IGZ1bmN0aW9uKGlzQWN0aXZlKQ0KICAgICAgICB7DQogICAgICAgIHRoaXMuQWN0aXZhdGUoaXNBY3RpdmUpOw0KICAgICAgICB9Ow0KDQoNCiAgICAvKg0KICAgICAgICBGdW5jdGlvbjogT25TZWFyY2hUeXBlQ2hhbmdlDQogICAgICAgIENhbGxlZCB3aGVuIHRoZSBzZWFyY2ggdHlwZSBpcyBjaGFuZ2VkLg0KICAgICovDQogICAgdGhpcy5PblNlYXJjaFR5cGVDaGFuZ2UgPSBmdW5jdGlvbigpDQogICAgICAgIHsNCiAgICAgICAgdmFyIHNlYXJjaFZhbHVlID0gdGhpcy5ET01TZWFyY2hGaWVsZCgpLnZhbHVlLnJlcGxhY2UoLyArL2csICIiKTsNCg0KICAgICAgICBpZiAoc2VhcmNoVmFsdWUgIT0gIiIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICB0aGlzLlNlYXJjaCgpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfTsNCg0KDQoNCiAgICAvLyBHcm91cDogQWN0aW9uIEZ1bmN0aW9ucw0KICAgIC8vIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCiAgICAvKg0KICAgICAgICBGdW5jdGlvbjogQ2xvc2VSZXN1bHRzV2luZG93DQogICAgICAgIENsb3NlcyB0aGUgcmVzdWx0cyB3aW5kb3cuDQogICAgKi8NCiAgICB0aGlzLkNsb3NlUmVzdWx0c1dpbmRvdyA9IGZ1bmN0aW9uKCkNCiAgICAgICAgew0KICAgICAgICB0aGlzLkRPTVBvcHVwU2VhcmNoUmVzdWx0c1dpbmRvdygpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgIHRoaXMuQWN0aXZhdGUoZmFsc2UsIHRydWUpOw0KICAgICAgICB9Ow0KDQoNCiAgICAvKg0KICAgICAgICBGdW5jdGlvbjogU2VhcmNoDQogICAgICAgIFBlcmZvcm1zIGEgc2VhcmNoLg0KICAgICovDQogICAgdGhpcy5TZWFyY2ggPSBmdW5jdGlvbigpDQogICAgICAgIHsNCiAgICAgICAgdGhpcy5rZXlUaW1lb3V0ID0gMDsNCg0KICAgICAgICB2YXIgc2VhcmNoVmFsdWUgPSB0aGlzLkRPTVNlYXJjaEZpZWxkKCkudmFsdWUucmVwbGFjZSgvXiArLywgIiIpOw0KICAgICAgICB2YXIgc2VhcmNoVG9waWMgPSB0aGlzLkRPTVNlYXJjaFR5cGUoKS52YWx1ZTsNCg0KICAgICAgICB2YXIgcGFnZUV4dGVuc2lvbiA9IHNlYXJjaFZhbHVlLnN1YnN0cigwLDEpOw0KDQogICAgICAgIGlmIChwYWdlRXh0ZW5zaW9uLm1hdGNoKC9eW2Etel0vaSkpDQogICAgICAgICAgICB7ICBwYWdlRXh0ZW5zaW9uID0gcGFnZUV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpOyAgfQ0KICAgICAgICBlbHNlIGlmIChwYWdlRXh0ZW5zaW9uLm1hdGNoKC9eWzAtOV0vKSkNCiAgICAgICAgICAgIHsgIHBhZ2VFeHRlbnNpb24gPSAnTnVtYmVycyc7ICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsgIHBhZ2VFeHRlbnNpb24gPSAiU3ltYm9scyI7ICB9Ow0KDQogICAgICAgIHZhciByZXN1bHRzUGFnZTsNCiAgICAgICAgdmFyIHJlc3VsdHNQYWdlV2l0aFNlYXJjaDsNCiAgICAgICAgdmFyIGhhc1Jlc3VsdHNQYWdlOw0KDQogICAgICAgIC8vIGluZGV4U2VjdGlvbnNXaXRoQ29udGVudCBpcyBkZWZpbmVkIGluIHNlYXJjaGRhdGEuanMNCiAgICAgICAgaWYgKGluZGV4U2VjdGlvbnNXaXRoQ29udGVudFtzZWFyY2hUb3BpY11bcGFnZUV4dGVuc2lvbl0gPT0gdHJ1ZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIHJlc3VsdHNQYWdlID0gdGhpcy5yZXN1bHRzUGF0aCArICcvJyArIHNlYXJjaFRvcGljICsgcGFnZUV4dGVuc2lvbiArICcuaHRtbCc7DQogICAgICAgICAgICByZXN1bHRzUGFnZVdpdGhTZWFyY2ggPSByZXN1bHRzUGFnZSsnPycrZXNjYXBlKHNlYXJjaFZhbHVlKTsNCiAgICAgICAgICAgIGhhc1Jlc3VsdHNQYWdlID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgcmVzdWx0c1BhZ2UgPSB0aGlzLnJlc3VsdHNQYXRoICsgJy9Ob1Jlc3VsdHMuaHRtbCc7DQogICAgICAgICAgICByZXN1bHRzUGFnZVdpdGhTZWFyY2ggPSByZXN1bHRzUGFnZTsNCiAgICAgICAgICAgIGhhc1Jlc3VsdHNQYWdlID0gZmFsc2U7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHZhciByZXN1bHRzRnJhbWU7DQogICAgICAgIGlmICh0aGlzLm1vZGUgPT0gIkhUTUwiKQ0KICAgICAgICAgICAgeyAgcmVzdWx0c0ZyYW1lID0gd2luZG93LmZyYW1lcy5NU2VhcmNoUmVzdWx0czsgIH0NCiAgICAgICAgZWxzZSBpZiAodGhpcy5tb2RlID09ICJGcmFtZWRIVE1MIikNCiAgICAgICAgICAgIHsgIHJlc3VsdHNGcmFtZSA9IHdpbmRvdy50b3AuZnJhbWVzWydDb250ZW50J107ICB9Ow0KDQoNCiAgICAgICAgaWYgKHJlc3VsdHNQYWdlICE9IHRoaXMubGFzdFJlc3VsdHNQYWdlIHx8DQoNCiAgICAgICAgICAgIC8vIEJ1ZyBpbiBJRS4gIElmIGV2ZXJ5dGhpbmcgYmVjb21lcyBoaWRkZW4gaW4gYSBydW4sIG5vbmUgb2YgdGhlbSB3aWxsIGJlIGFibGUgdG8gYmUgcmVzaG93biBpbiB0aGUgbmV4dCBmb3Igc29tZQ0KICAgICAgICAgICAgLy8gcmVhc29uLiAgSXQgY291bnRzIHRoZSByaWdodCBudW1iZXIgb2YgcmVzdWx0cywgYW5kIHlvdSBjYW4gZXZlbiByZWFkIHRoZSBkaXNwbGF5IGFzICJibG9jayIgYWZ0ZXIgc2V0dGluZyBpdCwgYnV0IGl0DQogICAgICAgICAgICAvLyBqdXN0IGRvZXNuJ3Qgd29yayBpbiBJRSA2IG9yIElFIDcuICBTbyBpZiB3ZSdyZSBvbiB0aGUgcmlnaHQgcGFnZSBidXQgdGhlIHByZXZpb3VzIHNlYXJjaCBoYWQgbm8gcmVzdWx0cywgcmVsb2FkIHRoZQ0KICAgICAgICAgICAgLy8gcGFnZSBhbnl3YXkgdG8gZ2V0IGFyb3VuZCB0aGUgYnVnLg0KICAgICAgICAgICAgKGJyb3dzZXJUeXBlID09ICJJRSIgJiYgaGFzUmVzdWx0c1BhZ2UgJiYNCiAgICAgICAgICAgIAkoIXJlc3VsdHNGcmFtZS5zZWFyY2hSZXN1bHRzIHx8IHJlc3VsdHNGcmFtZS5zZWFyY2hSZXN1bHRzLmxhc3RNYXRjaENvdW50ID09IDApKSApDQoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIHJlc3VsdHNGcmFtZS5sb2NhdGlvbi5ocmVmID0gcmVzdWx0c1BhZ2VXaXRoU2VhcmNoOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIC8vIFNvIGlmIHRoZSByZXN1bHRzIHBhZ2UgaXMgcmlnaHQgYW5kIHRoZXJlJ3Mgbm8gSUUgYnVnLCByZXBlcmZvcm0gdGhlIHNlYXJjaCBvbiB0aGUgZXhpc3RpbmcgcGFnZS4gIFdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlcmUNCiAgICAgICAgLy8gYXJlIHJlc3VsdHMgYmVjYXVzZSBOb1Jlc3VsdHMuaHRtbCBkb2Vzbid0IGhhdmUgYW55IEphdmFTY3JpcHQsIGFuZCBpdCB3b3VsZCBiZSB1c2VsZXNzIHRvIGRvIGFueXRoaW5nIG9uIHRoYXQgcGFnZSBldmVuDQogICAgICAgIC8vIGlmIGl0IGRpZC4NCiAgICAgICAgZWxzZSBpZiAoaGFzUmVzdWx0c1BhZ2UpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgZXhpc3RzIGluIGNhc2UgdGhlIGZyYW1lIGlzIHByZXNlbnQgYnV0IGRpZG4ndCBmaW5pc2ggbG9hZGluZy4NCiAgICAgICAgICAgIGlmIChyZXN1bHRzRnJhbWUuc2VhcmNoUmVzdWx0cykNCiAgICAgICAgICAgICAgICB7ICByZXN1bHRzRnJhbWUuc2VhcmNoUmVzdWx0cy5TZWFyY2goc2VhcmNoVmFsdWUpOyAgfQ0KDQogICAgICAgICAgICAvLyBPdGhlcndpc2UganVzdCByZWxvYWQgaW5zdGVhZCBvZiB3YWl0aW5nLg0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsgIHJlc3VsdHNGcmFtZS5sb2NhdGlvbi5ocmVmID0gcmVzdWx0c1BhZ2VXaXRoU2VhcmNoOyAgfTsNCiAgICAgICAgICAgIH07DQoNCg0KICAgICAgICB2YXIgZG9tUG9wdXBTZWFyY2hSZXN1bHRzV2luZG93ID0gdGhpcy5ET01Qb3B1cFNlYXJjaFJlc3VsdHNXaW5kb3coKTsNCg0KICAgICAgICBpZiAodGhpcy5tb2RlID09ICJIVE1MIiAmJiBkb21Qb3B1cFNlYXJjaFJlc3VsdHNXaW5kb3cuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgdmFyIGRvbVNlYXJjaFR5cGUgPSB0aGlzLkRPTVNlYXJjaFR5cGUoKTsNCg0KICAgICAgICAgICAgdmFyIGxlZnQgPSBHZXRYUG9zaXRpb24oZG9tU2VhcmNoVHlwZSk7DQogICAgICAgICAgICB2YXIgdG9wID0gR2V0WVBvc2l0aW9uKGRvbVNlYXJjaFR5cGUpICsgZG9tU2VhcmNoVHlwZS5vZmZzZXRIZWlnaHQ7DQoNCiAgICAgICAgICAgIE1vdmVUb1Bvc2l0aW9uKGRvbVBvcHVwU2VhcmNoUmVzdWx0c1dpbmRvdywgbGVmdCwgdG9wKTsNCiAgICAgICAgICAgIGRvbVBvcHVwU2VhcmNoUmVzdWx0c1dpbmRvdy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgIH07DQoNCg0KICAgICAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlOw0KICAgICAgICB0aGlzLmxhc3RSZXN1bHRzUGFnZSA9IHJlc3VsdHNQYWdlOw0KICAgICAgICB9Ow0KDQoNCg0KICAgIC8vIEdyb3VwOiBBY3RpdmF0aW9uIEZ1bmN0aW9ucw0KICAgIC8vIEZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB3aGV0aGVyIHRoZSBlbnRpcmUgcGFuZWwgaXMgYWN0aXZlIG9yIG5vdC4NCiAgICAvLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KDQogICAgLyoNCiAgICAgICAgRnVuY3Rpb246IEFjdGl2YXRlDQoNCiAgICAgICAgQWN0aXZhdGVzIG9yIGRlYWN0aXZhdGVzIHRoZSBzZWFyY2ggcGFuZWwsIHJlc2V0dGluZyB0aGluZ3MgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgaWYgbmVjZXNzYXJ5LiAgWW91IGNhbiBjYWxsIHRoaXMgb24gZXZlcnkNCiAgICAgICAgY29udHJvbCdzIE9uQmx1cigpIGFuZCBpdCB3aWxsIGhhbmRsZSBub3QgZGVhY3RpdmF0aW5nIHRoZSBlbnRpcmUgcGFuZWwgd2hlbiBmb2N1cyBpcyBqdXN0IHN3aXRjaGluZyBiZXR3ZWVuIHRoZW0gdHJhbnNwYXJlbnRseS4NCg0KICAgICAgICBQYXJhbWV0ZXJzOg0KDQogICAgICAgICAgICBpc0FjdGl2ZSAtIFdoZXRoZXIgeW91J3JlIGFjdGl2YXRpbmcgb3IgZGVhY3RpdmF0aW5nIHRoZSBwYW5lbC4NCiAgICAgICAgICAgIGlnbm9yZURlYWN0aXZhdGVEZWxheSAtIFNldCBpZiB5b3UncmUgcG9zaXRpdmUgdGhlIGFjdGlvbiB3aWxsIGRlYWN0aXZhdGUgdGhlIHBhbmVsIGFuZCB0aHVzIHdhbnQgdG8gc2tpcCB0aGUgZGVsYXkuDQogICAgKi8NCiAgICB0aGlzLkFjdGl2YXRlID0gZnVuY3Rpb24oaXNBY3RpdmUsIGlnbm9yZURlYWN0aXZhdGVEZWxheSkNCiAgICAgICAgew0KICAgICAgICAvLyBXZSB3YW50IHRvIGlnbm9yZSBpc0FjdGl2ZSBiZWluZyBmYWxzZSB3aGlsZSB0aGUgcmVzdWx0cyB3aW5kb3cgaXMgb3Blbi4NCiAgICAgICAgaWYgKGlzQWN0aXZlIHx8ICh0aGlzLm1vZGUgPT0gIkhUTUwiICYmIHRoaXMuRE9NUG9wdXBTZWFyY2hSZXN1bHRzV2luZG93KCkuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmluYWN0aXZhdGVUaW1lb3V0KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbmFjdGl2YXRlVGltZW91dCk7DQogICAgICAgICAgICAgICAgdGhpcy5pbmFjdGl2YXRlVGltZW91dCA9IDA7DQogICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgdGhpcy5ET01TZWFyY2hQYW5lbCgpLmNsYXNzTmFtZSA9ICdNU2VhcmNoUGFuZWxBY3RpdmUnOw0KDQogICAgICAgICAgICB2YXIgc2VhcmNoRmllbGQgPSB0aGlzLkRPTVNlYXJjaEZpZWxkKCk7DQoNCiAgICAgICAgICAgIGlmIChzZWFyY2hGaWVsZC52YWx1ZSA9PSAnU2VhcmNoJykNCiAgICAgICAgICAgICAgICAgeyAgc2VhcmNoRmllbGQudmFsdWUgPSAiIjsgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoIWlnbm9yZURlYWN0aXZhdGVEZWxheSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuaW5hY3RpdmF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMubmFtZSArICIuSW5hY3RpdmF0ZUFmdGVyVGltZW91dCgpIiwgdGhpcy5pbmFjdGl2YXRlVGltZW91dExlbmd0aCk7DQogICAgICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuSW5hY3RpdmF0ZUFmdGVyVGltZW91dCgpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfTsNCg0KDQogICAgLyoNCiAgICAgICAgRnVuY3Rpb246IEluYWN0aXZhdGVBZnRlclRpbWVvdXQNCg0KICAgICAgICBDYWxsZWQgYnkgPGluYWN0aXZhdGVUaW1lb3V0Piwgd2hpY2ggaXMgc2V0IGJ5IDxBY3RpdmF0ZSgpPi4gIEluYWN0aXZhdGlvbiBvY2N1cnMgb24gYSB0aW1lb3V0IGJlY2F1c2UgYSBjb250cm9sIG1heQ0KICAgICAgICByZWNlaXZlIE9uQmx1cigpIHdoZW4gZm9jdXMgaXMgcmVhbGx5IHRyYW5zZmVycmluZyB0byBhbm90aGVyIGNvbnRyb2wgaW4gdGhlIHNlYXJjaCBwYW5lbC4gIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvDQogICAgICAgIGFjdHVhbGx5IGRlYWN0aXZhdGUgdGhlIHBhbmVsIGJlY2F1c2Ugbm90IG9ubHkgd291bGQgdGhhdCBjYXVzZSBhIHZpc2libGUgZmxpY2tlciBidXQgaXQgY291bGQgYWxzbyByZXNldCB0aGUgc2VhcmNoIHZhbHVlLg0KICAgICAgICBTbyBieSBkb2luZyBpdCBvbiBhIHRpbWVvdXQgaW5zdGVhZCwgdGhlcmUncyBhIHNob3J0IHBlcmlvZCB3aGVyZSB0aGUgc2Vjb25kIGNvbnRyb2wncyBPbkZvY3VzKCkgY2FuIGNhbmNlbCB0aGUgZGVhY3RpdmF0aW9uLg0KICAgICovDQogICAgdGhpcy5JbmFjdGl2YXRlQWZ0ZXJUaW1lb3V0ID0gZnVuY3Rpb24oKQ0KICAgICAgICB7DQogICAgICAgIHRoaXMuaW5hY3RpdmF0ZVRpbWVvdXQgPSAwOw0KDQogICAgICAgIHRoaXMuRE9NU2VhcmNoUGFuZWwoKS5jbGFzc05hbWUgPSAnTVNlYXJjaFBhbmVsSW5hY3RpdmUnOw0KICAgICAgICB0aGlzLkRPTVNlYXJjaEZpZWxkKCkudmFsdWUgPSAiU2VhcmNoIjsNCg0KCSAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICIiOw0KCSAgICB0aGlzLmxhc3RSZXN1bHRzUGFnZSA9ICIiOw0KICAgICAgICB9Ow0KICAgIH07DQoNCg0KDQoNCi8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCiAgIENsYXNzOiBTZWFyY2hSZXN1bHRzDQogICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KICAgVGhlIGNsYXNzIHRoYXQgaGFuZGxlcyBldmVyeXRoaW5nIG9uIHRoZSBzZWFyY2ggcmVzdWx0cyBwYWdlLg0KICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoqLw0KDQoNCmZ1bmN0aW9uIFNlYXJjaFJlc3VsdHMobmFtZSwgbW9kZSkNCiAgICB7DQogICAgLyoNCiAgICAgICAgdmFyOiBtb2RlDQogICAgICAgIFRoZSBtb2RlIHRoZSBzZWFyY2ggaXMgZ29pbmcgdG8gd29yayBpbiwgc3VjaCBhcyAiSFRNTCIgb3IgIkZyYW1lZEhUTUwiLg0KICAgICovDQogICAgdGhpcy5tb2RlID0gbW9kZTsNCg0KICAgIC8qDQogICAgICAgIHZhcjogbGFzdE1hdGNoQ291bnQNCiAgICAgICAgVGhlIG51bWJlciBvZiBtYXRjaGVzIGZyb20gdGhlIGxhc3QgcnVuIG9mIDxTZWFyY2goKT4uDQogICAgKi8NCiAgICB0aGlzLmxhc3RNYXRjaENvdW50ID0gMDsNCg0KDQogICAgLyoNCiAgICAgICAgRnVuY3Rpb246IFRvZ2dsZQ0KICAgICAgICBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwYXNzZWQgZWxlbWVudCBJRC4NCiAgICAqLw0KICAgIHRoaXMuVG9nZ2xlID0gZnVuY3Rpb24oaWQpDQogICAgICAgIHsNCiAgICAgICAgaWYgKHRoaXMubW9kZSA9PSAiRnJhbWVkSFRNTCIpDQogICAgICAgICAgICB7ICByZXR1cm47ICB9Ow0KDQogICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KDQogICAgICAgIHZhciBlbGVtZW50ID0gcGFyZW50RWxlbWVudC5maXJzdENoaWxkOw0KDQogICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT0gcGFyZW50RWxlbWVudCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lID09ICdESVYnICYmIGVsZW1lbnQuY2xhc3NOYW1lID09ICdJU3ViSW5kZXgnKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09ICdibG9jaycpDQogICAgICAgICAgICAgICAgICAgIHsgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICJub25lIjsgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7ICB9DQogICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT0gJ0RJVicgJiYgZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpDQogICAgICAgICAgICAgICAgeyAgZWxlbWVudCA9IGVsZW1lbnQuZmlyc3RDaGlsZDsgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQubmV4dFNpYmxpbmcpDQogICAgICAgICAgICAgICAgeyAgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7ICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGRvDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT0gcGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5uZXh0U2libGluZyk7DQoNCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50ICE9IHBhcmVudEVsZW1lbnQpDQogICAgICAgICAgICAgICAgICAgIHsgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOyAgfTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfTsNCiAgICAgICAgfTsNCg0KDQogICAgLyoNCiAgICAgICAgRnVuY3Rpb246IFNlYXJjaA0KDQogICAgICAgIFNlYXJjaGVzIGZvciB0aGUgcGFzc2VkIHN0cmluZy4gIElmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciwgaXQgdGFrZXMgaXQgZnJvbSB0aGUgVVJMIHF1ZXJ5Lg0KDQogICAgICAgIEFsd2F5cyByZXR1cm5zIHRydWUsIHNpbmNlIG90aGVyIGRvY3VtZW50cyBtYXkgdHJ5IHRvIGNhbGwgaXQgYW5kIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgcG9zc2libGUuDQogICAgKi8NCiAgICB0aGlzLlNlYXJjaCA9IGZ1bmN0aW9uKHNlYXJjaCkNCiAgICAgICAgew0KICAgICAgICBpZiAoIXNlYXJjaCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIHNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2guc3Vic3RyaW5nKDEpOyAgLy8gUmVtb3ZlIHRoZSBsZWFkaW5nID8NCiAgICAgICAgICAgIHNlYXJjaCA9IHVuZXNjYXBlKHNlYXJjaCk7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9eICsvLCAiIik7DQogICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC8gKyQvLCAiIik7DQogICAgICAgIHNlYXJjaCA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpOw0KDQogICAgICAgIGlmIChzZWFyY2gubWF0Y2goL1teYS16MC05XS8pKSAvLyBKdXN0IGEgbGl0dGxlIHNwZWVkdXAgc28gaXQgZG9lc24ndCBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGJlbG93IHVubmVjZXNzYXJpbHkuDQogICAgICAgICAgICB7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXF8vZywgIl91bmQiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cICsvZ2ksICJfc3BjIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXH4vZywgIl90aWwiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cIS9nLCAiX2V4YyIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1xAL2csICJfYXR0Iik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXCMvZywgIl9udW0iKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cJC9nLCAiX2RvbCIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1wlL2csICJfcGN0Iik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXF4vZywgIl9jYXIiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cJi9nLCAiX2FtcCIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1wqL2csICJfYXN0Iik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXCgvZywgIl9scGEiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cKS9nLCAiX3JwYSIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1wtL2csICJfbWluIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXCsvZywgIl9wbHUiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cPS9nLCAiX2VxdSIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1x7L2csICJfbGJjIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXH0vZywgIl9yYmMiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cWy9nLCAiX2xiayIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1xdL2csICJfcmJrIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXDovZywgIl9jb2wiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cOy9nLCAiX3NjbyIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1wiL2csICJfcXVvIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXCcvZywgIl9hcG8iKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cPC9nLCAiX2xhbiIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1w+L2csICJfcmFuIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXCwvZywgIl9jb20iKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9cLi9nLCAiX3BlciIpOw0KICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoL1w/L2csICJfcXVlIik7DQogICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXC8vZywgIl9zbGEiKTsNCiAgICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9bXmEtejAtOVxfXWkvZ2ksICJfenp6Iik7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHZhciByZXN1bHRSb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOw0KICAgICAgICB2YXIgbWF0Y2hlcyA9IDA7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICB3aGlsZSAoaSA8IHJlc3VsdFJvd3MubGVuZ3RoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJvdyA9IHJlc3VsdFJvd3MuaXRlbShpKTsNCg0KICAgICAgICAgICAgaWYgKHJvdy5jbGFzc05hbWUgPT0gIlNSUmVzdWx0IikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHJvd01hdGNoTmFtZSA9IHJvdy5pZC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgIHJvd01hdGNoTmFtZSA9IHJvd01hdGNoTmFtZS5yZXBsYWNlKC9ec3JcZCpfLywgJycpOw0KDQogICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5sZW5ndGggPD0gcm93TWF0Y2hOYW1lLmxlbmd0aCAmJiByb3dNYXRjaE5hbWUuc3Vic3RyKDAsIHNlYXJjaC5sZW5ndGgpID09IHNlYXJjaCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByb3cuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoZXMrKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgeyAgcm93LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7ICB9Ow0KICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlNlYXJjaGluZyIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOw0KDQogICAgICAgIGlmIChtYXRjaGVzID09IDApDQogICAgICAgICAgICB7ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTm9NYXRjaGVzIikuc3R5bGUuZGlzcGxheT0iYmxvY2siOyAgfQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICB7ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTm9NYXRjaGVzIikuc3R5bGUuZGlzcGxheT0ibm9uZSI7ICB9DQoNCiAgICAgICAgdGhpcy5sYXN0TWF0Y2hDb3VudCA9IG1hdGNoZXM7DQoNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH07DQogICAgfTsNCg0K