Market Smart Contract

Words
1
Reading
1 min
Listen
Play
6y

{"id":"ssc-mainnet-hive","json":{"contractName":"contract","contractAction":"update","contractPayload":{"name":"market","params":"","code":"LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLw0KLyogZ2xvYmFsIGFjdGlvbnMsIGFwaSAqLw0KY29uc3QgSElWRV9QRUdHRURfU1lNQk9MID0gJ1NXQVAuSElWRSc7DQpjb25zdCBISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OID0gODsNCmNvbnN0IENPTlRSQUNUX05BTUUgPSAnbWFya2V0JzsNCg0KY29uc3QgZ2V0TWV0cmljID0gYXN5bmMgKHN5bWJvbCkgPT4gew0KICBsZXQgbWV0cmljID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ21ldHJpY3MnLCB7IHN5bWJvbCB9KTsNCg0KICBpZiAobWV0cmljID09PSBudWxsKSB7DQogICAgbWV0cmljID0ge307DQogICAgbWV0cmljLnN5bWJvbCA9IHN5bWJvbDsNCiAgICBtZXRyaWMudm9sdW1lID0gJzAnOw0KICAgIG1ldHJpYy52b2x1bWVFeHBpcmF0aW9uID0gMDsNCiAgICBtZXRyaWMubGFzdFByaWNlID0gJzAnOw0KICAgIG1ldHJpYy5sb3dlc3RBc2sgPSAnMCc7DQogICAgbWV0cmljLmhpZ2hlc3RCaWQgPSAnMCc7DQogICAgbWV0cmljLmxhc3REYXlQcmljZSA9ICcwJzsNCiAgICBtZXRyaWMubGFzdERheVByaWNlRXhwaXJhdGlvbiA9IDA7DQogICAgbWV0cmljLnByaWNlQ2hhbmdlSGl2ZSA9ICcwJzsNCiAgICBtZXRyaWMucHJpY2VDaGFuZ2VQZXJjZW50ID0gJzAnOw0KDQogICAgY29uc3QgbmV3TWV0cmljID0gYXdhaXQgYXBpLmRiLmluc2VydCgnbWV0cmljcycsIG1ldHJpYyk7DQogICAgcmV0dXJuIG5ld01ldHJpYzsNCiAgfQ0KDQogIHJldHVybiBtZXRyaWM7DQp9Ow0KDQpjb25zdCB1cGRhdGVWb2x1bWVNZXRyaWMgPSBhc3luYyAoc3ltYm9sLCBxdWFudGl0eSwgYWRkID0gdHJ1ZSkgPT4gew0KICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7DQogIGNvbnN0IHRpbWVzdGFtcFNlYyA9IGJsb2NrRGF0ZS5nZXRUaW1lKCkgLyAxMDAwOw0KICBjb25zdCBtZXRyaWMgPSBhd2FpdCBnZXRNZXRyaWMoc3ltYm9sKTsNCg0KICBpZiAoYWRkID09PSB0cnVlKSB7DQogICAgaWYgKG1ldHJpYy52b2x1bWVFeHBpcmF0aW9uIDwgdGltZXN0YW1wU2VjKSB7DQogICAgICBtZXRyaWMudm9sdW1lID0gJzAuMDAwJzsNCiAgICB9DQogICAgbWV0cmljLnZvbHVtZSA9IGFwaS5CaWdOdW1iZXIobWV0cmljLnZvbHVtZSkNCiAgICAgIC5wbHVzKHF1YW50aXR5KQ0KICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQogICAgbWV0cmljLnZvbHVtZUV4cGlyYXRpb24gPSBibG9ja0RhdGUuc2V0RGF0ZShibG9ja0RhdGUuZ2V0RGF0ZSgpICsgMSkgLyAxMDAwOw0KICB9IGVsc2Ugew0KICAgIG1ldHJpYy52b2x1bWUgPSBhcGkuQmlnTnVtYmVyKG1ldHJpYy52b2x1bWUpDQogICAgICAubWludXMocXVhbnRpdHkpDQogICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCiAgfQ0KDQogIGlmIChhcGkuQmlnTnVtYmVyKG1ldHJpYy52b2x1bWUpLmx0KDApKSB7DQogICAgbWV0cmljLnZvbHVtZSA9ICcwLjAwMCc7DQogIH0NCg0KICBhd2FpdCBhcGkuZGIudXBkYXRlKCdtZXRyaWNzJywgbWV0cmljKTsNCn07DQoNCmNvbnN0IHVwZGF0ZVByaWNlTWV0cmljcyA9IGFzeW5jIChzeW1ib2wsIHByaWNlKSA9PiB7DQogIGNvbnN0IGJsb2NrRGF0ZSA9IG5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKTsNCiAgY29uc3QgdGltZXN0YW1wU2VjID0gYmxvY2tEYXRlLmdldFRpbWUoKSAvIDEwMDA7DQoNCiAgY29uc3QgbWV0cmljID0gYXdhaXQgZ2V0TWV0cmljKHN5bWJvbCk7DQoNCiAgbWV0cmljLmxhc3RQcmljZSA9IHByaWNlOw0KDQogIGlmIChtZXRyaWMubGFzdERheVByaWNlRXhwaXJhdGlvbiA8IHRpbWVzdGFtcFNlYykgew0KICAgIG1ldHJpYy5sYXN0RGF5UHJpY2UgPSBwcmljZTsNCiAgICBtZXRyaWMubGFzdERheVByaWNlRXhwaXJhdGlvbiA9IGJsb2NrRGF0ZS5zZXREYXRlKGJsb2NrRGF0ZS5nZXREYXRlKCkgKyAxKSAvIDEwMDA7DQogICAgbWV0cmljLnByaWNlQ2hhbmdlSGl2ZSA9ICcwJzsNCiAgICBtZXRyaWMucHJpY2VDaGFuZ2VQZXJjZW50ID0gJzAlJzsNCiAgfSBlbHNlIHsNCiAgICBtZXRyaWMucHJpY2VDaGFuZ2VIaXZlID0gYXBpLkJpZ051bWJlcihwcmljZSkNCiAgICAgIC5taW51cyhtZXRyaWMubGFzdERheVByaWNlKQ0KICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQogICAgbWV0cmljLnByaWNlQ2hhbmdlUGVyY2VudCA9IGAke2FwaS5CaWdOdW1iZXIobWV0cmljLnByaWNlQ2hhbmdlSGl2ZSkuZGl2aWRlZEJ5KG1ldHJpYy5sYXN0RGF5UHJpY2UpLm11bHRpcGxpZWRCeSgxMDApLnRvRml4ZWQoMil9JWA7DQogIH0NCg0KICBhd2FpdCBhcGkuZGIudXBkYXRlKCdtZXRyaWNzJywgbWV0cmljKTsNCn07DQoNCmNvbnN0IHVwZGF0ZUJpZE1ldHJpYyA9IGFzeW5jIChzeW1ib2wpID0+IHsNCiAgY29uc3QgbWV0cmljID0gYXdhaXQgZ2V0TWV0cmljKHN5bWJvbCk7DQoNCiAgY29uc3QgYnV5T3JkZXJCb29rID0gYXdhaXQgYXBpLmRiLmZpbmQoJ2J1eUJvb2snLA0KICAgIHsNCiAgICAgIHN5bWJvbCwNCiAgICB9LCAxLCAwLA0KICAgIFsNCiAgICAgIHsgaW5kZXg6ICdwcmljZURlYycsIGRlc2NlbmRpbmc6IHRydWUgfSwNCiAgICBdKTsNCg0KDQogIGlmIChidXlPcmRlckJvb2subGVuZ3RoID4gMCkgew0KICAgIG1ldHJpYy5oaWdoZXN0QmlkID0gYnV5T3JkZXJCb29rWzBdLnByaWNlOw0KICB9IGVsc2Ugew0KICAgIG1ldHJpYy5oaWdoZXN0QmlkID0gJzAnOw0KICB9DQoNCiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnbWV0cmljcycsIG1ldHJpYyk7DQp9Ow0KDQpjb25zdCB1cGRhdGVBc2tNZXRyaWMgPSBhc3luYyAoc3ltYm9sKSA9PiB7DQogIGNvbnN0IG1ldHJpYyA9IGF3YWl0IGdldE1ldHJpYyhzeW1ib2wpOw0KDQogIGNvbnN0IHNlbGxPcmRlckJvb2sgPSBhd2FpdCBhcGkuZGIuZmluZCgnc2VsbEJvb2snLA0KICAgIHsNCiAgICAgIHN5bWJvbCwNCiAgICB9LCAxLCAwLA0KICAgIFsNCiAgICAgIHsgaW5kZXg6ICdwcmljZURlYycsIGRlc2NlbmRpbmc6IGZhbHNlIH0sDQogICAgXSk7DQoNCiAgaWYgKHNlbGxPcmRlckJvb2subGVuZ3RoID4gMCkgew0KICAgIG1ldHJpYy5sb3dlc3RBc2sgPSBzZWxsT3JkZXJCb29rWzBdLnByaWNlOw0KICB9IGVsc2Ugew0KICAgIG1ldHJpYy5sb3dlc3RBc2sgPSAnMCc7DQogIH0NCg0KICBhd2FpdCBhcGkuZGIudXBkYXRlKCdtZXRyaWNzJywgbWV0cmljKTsNCn07DQoNCmNvbnN0IHVwZGF0ZVRyYWRlc0hpc3RvcnkgPSBhc3luYyAodHlwZSwgYnV5ZXIsIHNlbGxlciwgc3ltYm9sLCBxdWFudGl0eSwgcHJpY2UsIHZvbHVtZSkgPT4gew0KICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7DQogIGNvbnN0IHRpbWVzdGFtcFNlYyA9IGJsb2NrRGF0ZS5nZXRUaW1lKCkgLyAxMDAwOw0KICBjb25zdCB0aW1lc3RhbXBNaW51czI0aHJzID0gYmxvY2tEYXRlLnNldERhdGUoYmxvY2tEYXRlLmdldERhdGUoKSAtIDEpIC8gMTAwMDsNCiAgLy8gY2xlYW4gaGlzdG9yeQ0KDQogIGxldCB0cmFkZXNUb0RlbGV0ZSA9IGF3YWl0IGFwaS5kYi5maW5kKA0KICAgICd0cmFkZXNIaXN0b3J5JywNCiAgICB7DQogICAgICBzeW1ib2wsDQogICAgICB0aW1lc3RhbXA6IHsNCiAgICAgICAgJGx0OiB0aW1lc3RhbXBNaW51czI0aHJzLA0KICAgICAgfSwNCiAgICB9LA0KICApOw0KICBsZXQgbmJUcmFkZXNUb0RlbGV0ZSA9IHRyYWRlc1RvRGVsZXRlLmxlbmd0aDsNCg0KICB3aGlsZSAobmJUcmFkZXNUb0RlbGV0ZSA+IDApIHsNCiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbmJUcmFkZXNUb0RlbGV0ZTsgaW5kZXggKz0gMSkgew0KICAgICAgY29uc3QgdHJhZGUgPSB0cmFkZXNUb0RlbGV0ZVtpbmRleF07DQogICAgICBhd2FpdCB1cGRhdGVWb2x1bWVNZXRyaWModHJhZGUuc3ltYm9sLCB0cmFkZS52b2x1bWUsIGZhbHNlKTsNCiAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoJ3RyYWRlc0hpc3RvcnknLCB0cmFkZSk7DQogICAgfQ0KICAgIHRyYWRlc1RvRGVsZXRlID0gYXdhaXQgYXBpLmRiLmZpbmQoDQogICAgICAndHJhZGVzSGlzdG9yeScsDQogICAgICB7DQogICAgICAgIHN5bWJvbCwNCiAgICAgICAgdGltZXN0YW1wOiB7DQogICAgICAgICAgJGx0OiB0aW1lc3RhbXBNaW51czI0aHJzLA0KICAgICAgICB9LA0KICAgICAgfSwNCiAgICApOw0KICAgIG5iVHJhZGVzVG9EZWxldGUgPSB0cmFkZXNUb0RlbGV0ZS5sZW5ndGg7DQogIH0NCiAgLy8gYWRkIG9yZGVyIHRvIHRoZSBoaXN0b3J5DQogIGNvbnN0IG5ld1RyYWRlID0ge307DQogIG5ld1RyYWRlLnR5cGUgPSB0eXBlOw0KICBuZXdUcmFkZS5idXllciA9IGJ1eWVyOw0KICBuZXdUcmFkZS5zZWxsZXIgPSBzZWxsZXI7DQogIG5ld1RyYWRlLnN5bWJvbCA9IHN5bWJvbDsNCiAgbmV3VHJhZGUucXVhbnRpdHkgPSBxdWFudGl0eTsNCiAgbmV3VHJhZGUucHJpY2UgPSBwcmljZTsNCiAgbmV3VHJhZGUudGltZXN0YW1wID0gdGltZXN0YW1wU2VjOw0KICBuZXdUcmFkZS52b2x1bWUgPSB2b2x1bWU7DQogIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3RyYWRlc0hpc3RvcnknLCBuZXdUcmFkZSk7DQogIGF3YWl0IHVwZGF0ZVByaWNlTWV0cmljcyhzeW1ib2wsIHByaWNlKTsNCn07DQoNCmNvbnN0IGNvdW50RGVjaW1hbHMgPSB2YWx1ZSA9PiBhcGkuQmlnTnVtYmVyKHZhbHVlKS5kcCgpOw0KDQpjb25zdCByZW1vdmVFeHBpcmVkT3JkZXJzID0gYXN5bmMgKHRhYmxlKSA9PiB7DQogIGNvbnN0IHRpbWVzdGFtcFNlYyA9IGFwaS5CaWdOdW1iZXIobmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApLmdldFRpbWUoKSkNCiAgICAuZGl2aWRlZEJ5KDEwMDApDQogICAgLnRvTnVtYmVyKCk7DQoNCiAgLy8gY2xlYW4gb3JkZXJzDQogIGxldCBuYk9yZGVyc1RvRGVsZXRlID0gMDsNCiAgbGV0IG9yZGVyc1RvRGVsZXRlID0gYXdhaXQgYXBpLmRiLmZpbmQoDQogICAgdGFibGUsDQogICAgew0KICAgICAgZXhwaXJhdGlvbjogew0KICAgICAgICAkbHRlOiB0aW1lc3RhbXBTZWMsDQogICAgICB9LA0KICAgIH0sDQogICk7DQoNCiAgbmJPcmRlcnNUb0RlbGV0ZSA9IG9yZGVyc1RvRGVsZXRlLmxlbmd0aDsNCiAgd2hpbGUgKG5iT3JkZXJzVG9EZWxldGUgPiAwKSB7DQogICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5iT3JkZXJzVG9EZWxldGU7IGluZGV4ICs9IDEpIHsNCiAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzVG9EZWxldGVbaW5kZXhdOw0KICAgICAgbGV0IHF1YW50aXR5Ow0KICAgICAgbGV0IHN5bWJvbDsNCg0KICAgICAgaWYgKHRhYmxlID09PSAnYnV5Qm9vaycpIHsNCiAgICAgICAgc3ltYm9sID0gSElWRV9QRUdHRURfU1lNQk9MOw0KICAgICAgICBxdWFudGl0eSA9IG9yZGVyLnRva2Vuc0xvY2tlZDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZw0KICAgICAgICBzeW1ib2wgPSBvcmRlci5zeW1ib2w7DQogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZw0KICAgICAgICBxdWFudGl0eSA9IG9yZGVyLnF1YW50aXR5Ow0KICAgICAgfQ0KDQogICAgICAvLyB1bmxvY2sgdG9rZW5zDQogICAgICBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnMob3JkZXIuYWNjb3VudCwgc3ltYm9sLCBxdWFudGl0eSwgJ3VzZXInKTsNCg0KICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSh0YWJsZSwgb3JkZXIpOw0KDQogICAgICBpZiAodGFibGUgPT09ICdidXlCb29rJykgew0KICAgICAgICBhcGkuZW1pdCgnb3JkZXJFeHBpcmVkJywgeyB0eXBlOiAnYnV5JywgdHhJZDogb3JkZXIudHhJZCB9KTsNCg0KICAgICAgICBhd2FpdCB1cGRhdGVBc2tNZXRyaWMob3JkZXIuc3ltYm9sKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGFwaS5lbWl0KCdvcmRlckV4cGlyZWQnLCB7IHR5cGU6ICdzZWxsJywgdHhJZDogb3JkZXIudHhJZCB9KTsNCg0KICAgICAgICBhd2FpdCB1cGRhdGVCaWRNZXRyaWMob3JkZXIuc3ltYm9sKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBvcmRlcnNUb0RlbGV0ZSA9IGF3YWl0IGFwaS5kYi5maW5kKA0KICAgICAgdGFibGUsDQogICAgICB7DQogICAgICAgIGV4cGlyYXRpb246IHsNCiAgICAgICAgICAkbHRlOiB0aW1lc3RhbXBTZWMsDQogICAgICAgIH0sDQogICAgICB9LA0KICAgICk7DQoNCiAgICBuYk9yZGVyc1RvRGVsZXRlID0gb3JkZXJzVG9EZWxldGUubGVuZ3RoOw0KICB9DQp9Ow0KDQphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsNCiAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoJ2J1eUJvb2snKTsNCg0KICBpZiAodGFibGVFeGlzdHMgPT09IGZhbHNlKSB7DQogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdidXlCb29rJywgWydzeW1ib2wnLCAnYWNjb3VudCcsICdwcmljZURlYycsICdleHBpcmF0aW9uJywgJ3R4SWQnXSk7DQogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdzZWxsQm9vaycsIFsnc3ltYm9sJywgJ2FjY291bnQnLCAncHJpY2VEZWMnLCAnZXhwaXJhdGlvbicsICd0eElkJ10pOw0KICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndHJhZGVzSGlzdG9yeScsIFsnc3ltYm9sJ10pOw0KICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnbWV0cmljcycsIFsnc3ltYm9sJ10pOw0KICB9DQp9Ow0KDQphY3Rpb25zLmNhbmNlbCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7DQogIGNvbnN0IHsgdHlwZSwgaWQsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsNCg0KICBjb25zdCB0eXBlcyA9IFsnYnV5JywgJ3NlbGwnXTsNCg0KICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQ0KICAgICYmIGFwaS5hc3NlcnQodHlwZSAmJiB0eXBlcy5pbmNsdWRlcyh0eXBlKQ0KICAgICAgJiYgaWQsICdpbnZhbGlkIHBhcmFtcycpKSB7DQogICAgY29uc3QgdGFibGUgPSB0eXBlID09PSAnYnV5JyA/ICdidXlCb29rJyA6ICdzZWxsQm9vayc7DQoNCiAgICBsZXQgb3JkZXIgPSBudWxsOw0KICAgIC8vIGdldCBvcmRlcg0KICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA8IDUwKSB7DQogICAgICBvcmRlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKHRhYmxlLCB7IHR4SWQ6IGlkIH0pOw0KICAgIH0NCg0KICAgIGlmIChhcGkuYXNzZXJ0KG9yZGVyICE9PSBudWxsLCAnb3JkZXIgZG9lcyBub3QgZXhpc3Qgb3IgaW52YWxpZCBwYXJhbXMnKQ0KICAgICAgJiYgb3JkZXIuYWNjb3VudCA9PT0gYXBpLnNlbmRlcikgew0KICAgICAgbGV0IHF1YW50aXR5Ow0KICAgICAgbGV0IHN5bWJvbDsNCg0KICAgICAgaWYgKHR5cGUgPT09ICdidXknKSB7DQogICAgICAgIHN5bWJvbCA9IEhJVkVfUEVHR0VEX1NZTUJPTDsNCiAgICAgICAgcXVhbnRpdHkgPSBvcmRlci50b2tlbnNMb2NrZWQ7DQogICAgICB9IGVsc2Ugew0KICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmcNCiAgICAgICAgc3ltYm9sID0gb3JkZXIuc3ltYm9sOw0KICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmcNCiAgICAgICAgcXVhbnRpdHkgPSBvcmRlci5xdWFudGl0eTsNCiAgICAgIH0NCg0KICAgICAgLy8gdW5sb2NrIHRva2Vucw0KICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFwaS5zZW5kZXIsIHN5bWJvbCwgcXVhbnRpdHksICd1c2VyJyk7DQoNCiAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUodGFibGUsIG9yZGVyKTsNCg0KICAgICAgaWYgKHR5cGUgPT09ICdzZWxsJykgew0KICAgICAgICBhd2FpdCB1cGRhdGVBc2tNZXRyaWMob3JkZXIuc3ltYm9sKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGF3YWl0IHVwZGF0ZUJpZE1ldHJpYyhvcmRlci5zeW1ib2wpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfTsNCg0KY29uc3QgZmluZE1hdGNoaW5nU2VsbE9yZGVycyA9IGFzeW5jIChvcmRlciwgdG9rZW5QcmVjaXNpb24pID0+IHsNCiAgY29uc3Qgew0KICAgIGFjY291bnQsDQogICAgc3ltYm9sLA0KICAgIHByaWNlRGVjLA0KICB9ID0gb3JkZXI7DQoNCiAgY29uc3QgYnV5T3JkZXIgPSBvcmRlcjsNCiAgbGV0IG9mZnNldCA9IDA7DQogIGxldCB2b2x1bWVUcmFkZWQgPSAwOw0KDQogIGF3YWl0IHJlbW92ZUV4cGlyZWRPcmRlcnMoJ3NlbGxCb29rJyk7DQoNCiAgLy8gZ2V0IHRoZSBvcmRlcnMgdGhhdCBtYXRjaCB0aGUgc3ltYm9sIGFuZCB0aGUgcHJpY2UNCiAgbGV0IHNlbGxPcmRlckJvb2sgPSBhd2FpdCBhcGkuZGIuZmluZCgnc2VsbEJvb2snLCB7DQogICAgc3ltYm9sLA0KICAgIHByaWNlRGVjOiB7DQogICAgICAkbHRlOiBwcmljZURlYywNCiAgICB9LA0KICB9LCAxMDAwLCBvZmZzZXQsDQogIFsNCiAgICB7IGluZGV4OiAncHJpY2VEZWMnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LA0KICAgIHsgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LA0KICBdKTsNCg0KICBkbyB7DQogICAgY29uc3QgbmJPcmRlcnMgPSBzZWxsT3JkZXJCb29rLmxlbmd0aDsNCiAgICBsZXQgaW5jID0gMDsNCg0KICAgIHdoaWxlIChpbmMgPCBuYk9yZGVycyAmJiBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnF1YW50aXR5KS5ndCgwKSkgew0KICAgICAgY29uc3Qgc2VsbE9yZGVyID0gc2VsbE9yZGVyQm9va1tpbmNdOw0KICAgICAgaWYgKGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucXVhbnRpdHkpLmx0ZShzZWxsT3JkZXIucXVhbnRpdHkpKSB7DQogICAgICAgIGxldCBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKHNlbGxPcmRlci5wcmljZSkNCiAgICAgICAgICAubXVsdGlwbGllZEJ5KGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04pOw0KDQogICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHF0eVRva2Vuc1RvU2VuZCkuZ3QoYnV5T3JkZXIudG9rZW5zTG9ja2VkKSkgew0KICAgICAgICAgIHF0eVRva2Vuc1RvU2VuZCA9IGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnByaWNlKQ0KICAgICAgICAgICAgLm11bHRpcGxpZWRCeShidXlPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF0eVRva2Vuc1RvU2VuZCkuZ3QoMCkNCiAgICAgICAgICAmJiBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnF1YW50aXR5KS5ndCgwKSwgJ3RoZSBvcmRlciBjYW5ub3QgYmUgZmlsbGVkJykpIHsNCiAgICAgICAgICAvLyB0cmFuc2ZlciB0aGUgdG9rZW5zIHRvIHRoZSBidXllcg0KICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnMoYWNjb3VudCwgc3ltYm9sLCBidXlPcmRlci5xdWFudGl0eSwgJ3VzZXInKTsNCg0KICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICBhcGkuZGVidWcoYWNjb3VudCk7DQogICAgICAgICAgICBhcGkuZGVidWcoc3ltYm9sKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhidXlPcmRlci5xdWFudGl0eSk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgc2VsbGVyDQogICAgICAgICAgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKHNlbGxPcmRlci5hY2NvdW50LCBISVZFX1BFR0dFRF9TWU1CT0wsIHF0eVRva2Vuc1RvU2VuZCwgJ3VzZXInKTsNCg0KICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICBhcGkuZGVidWcoc2VsbE9yZGVyLmFjY291bnQpOw0KICAgICAgICAgICAgYXBpLmRlYnVnKEhJVkVfUEVHR0VEX1NZTUJPTCk7DQogICAgICAgICAgICBhcGkuZGVidWcocXR5VG9rZW5zVG9TZW5kKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlbGwgb3JkZXINCiAgICAgICAgICBjb25zdCBxdHlMZWZ0U2VsbE9yZGVyID0gYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgICAubWludXMoYnV5T3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgICAudG9GaXhlZCh0b2tlblByZWNpc2lvbik7DQogICAgICAgICAgY29uc3QgbmJUb2tlbnNUb0ZpbGxPcmRlciA9IGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnByaWNlKQ0KICAgICAgICAgICAgLm11bHRpcGxpZWRCeShxdHlMZWZ0U2VsbE9yZGVyKQ0KICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQoNCiAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihxdHlMZWZ0U2VsbE9yZGVyKS5ndCgwKQ0KICAgICAgICAgICAgJiYgKGFwaS5CaWdOdW1iZXIobmJUb2tlbnNUb0ZpbGxPcmRlcikuZ3RlKCcwLjAwMDAwMDAxJykpKSB7DQogICAgICAgICAgICBzZWxsT3JkZXIucXVhbnRpdHkgPSBxdHlMZWZ0U2VsbE9yZGVyOw0KDQogICAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdzZWxsQm9vaycsIHNlbGxPcmRlcik7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHF0eUxlZnRTZWxsT3JkZXIpLmd0KDApKSB7DQogICAgICAgICAgICAgIGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhzZWxsT3JkZXIuYWNjb3VudCwgc3ltYm9sLCBxdHlMZWZ0U2VsbE9yZGVyLCAndXNlcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYXBpLmVtaXQoJ29yZGVyQ2xvc2VkJywgeyBhY2NvdW50OiBzZWxsT3JkZXIuYWNjb3VudCwgdHlwZTogJ3NlbGwnLCB0eElkOiBzZWxsT3JkZXIudHhJZCB9KTsNCiAgICAgICAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoJ3NlbGxCb29rJywgc2VsbE9yZGVyKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyB1bmxvY2sgcmVtYWluaW5nIHRva2VucywgdXBkYXRlIHRoZSBxdWFudGl0eSB0byBnZXQgYW5kIHJlbW92ZSB0aGUgYnV5IG9yZGVyDQogICAgICAgICAgY29uc3QgdG9rZW5zVG9VbmxvY2sgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCkNCiAgICAgICAgICAgIC5taW51cyhxdHlUb2tlbnNUb1NlbmQpDQogICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHRva2Vuc1RvVW5sb2NrKS5ndCgwKSkgew0KICAgICAgICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFjY291bnQsIEhJVkVfUEVHR0VEX1NZTUJPTCwgdG9rZW5zVG9VbmxvY2ssICd1c2VyJyk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gYWRkIHRoZSB0cmFkZSB0byB0aGUgaGlzdG9yeQ0KICAgICAgICAgIGF3YWl0IHVwZGF0ZVRyYWRlc0hpc3RvcnkoJ2J1eScsIGFjY291bnQsIHNlbGxPcmRlci5hY2NvdW50LCBzeW1ib2wsIGJ1eU9yZGVyLnF1YW50aXR5LCBzZWxsT3JkZXIucHJpY2UsIHF0eVRva2Vuc1RvU2VuZCk7DQoNCiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHZvbHVtZQ0KICAgICAgICAgIHZvbHVtZVRyYWRlZCA9IGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5wbHVzKHF0eVRva2Vuc1RvU2VuZCk7DQoNCiAgICAgICAgICBidXlPcmRlci5xdWFudGl0eSA9ICcwJzsNCiAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdidXlCb29rJywgYnV5T3JkZXIpOw0KICAgICAgICAgIGFwaS5lbWl0KCdvcmRlckNsb3NlZCcsIHsgYWNjb3VudDogYnV5T3JkZXIuYWNjb3VudCwgdHlwZTogJ2J1eScsIHR4SWQ6IGJ1eU9yZGVyLnR4SWQgfSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGxldCBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKHNlbGxPcmRlci5wcmljZSkNCiAgICAgICAgICAubXVsdGlwbGllZEJ5KHNlbGxPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihxdHlUb2tlbnNUb1NlbmQpLmd0KGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCkpIHsNCiAgICAgICAgICBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKHNlbGxPcmRlci5wcmljZSkNCiAgICAgICAgICAgIC5tdWx0aXBsaWVkQnkoc2VsbE9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocXR5VG9rZW5zVG9TZW5kKS5ndCgwKQ0KICAgICAgICAgICYmIGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucXVhbnRpdHkpLmd0KDApLCAndGhlIG9yZGVyIGNhbm5vdCBiZSBmaWxsZWQnKSkgew0KICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIGJ1eWVyDQogICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhhY2NvdW50LCBzeW1ib2wsIHNlbGxPcmRlci5xdWFudGl0eSwgJ3VzZXInKTsNCg0KICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICBhcGkuZGVidWcoYWNjb3VudCk7DQogICAgICAgICAgICBhcGkuZGVidWcoc3ltYm9sKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhzZWxsT3JkZXIucXVhbnRpdHkpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIHNlbGxlcg0KICAgICAgICAgIHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhzZWxsT3JkZXIuYWNjb3VudCwgSElWRV9QRUdHRURfU1lNQk9MLCBxdHlUb2tlbnNUb1NlbmQsICd1c2VyJyk7DQoNCiAgICAgICAgICBpZiAocmVzLmVycm9ycykgew0KICAgICAgICAgICAgYXBpLmRlYnVnKHJlcy5lcnJvcnMpOw0KICAgICAgICAgICAgYXBpLmRlYnVnKGBUWElEOiAke2FwaS50cmFuc2FjdGlvbklkfWApOw0KICAgICAgICAgICAgYXBpLmRlYnVnKHNlbGxPcmRlci5hY2NvdW50KTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhISVZFX1BFR0dFRF9TWU1CT0wpOw0KICAgICAgICAgICAgYXBpLmRlYnVnKHF0eVRva2Vuc1RvU2VuZCk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gcmVtb3ZlIHRoZSBzZWxsIG9yZGVyDQogICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2VsbEJvb2snLCBzZWxsT3JkZXIpOw0KICAgICAgICAgIGFwaS5lbWl0KCdvcmRlckNsb3NlZCcsIHsgYWNjb3VudDogc2VsbE9yZGVyLmFjY291bnQsIHR5cGU6ICdzZWxsJywgdHhJZDogc2VsbE9yZGVyLnR4SWQgfSk7DQoNCiAgICAgICAgICAvLyB1cGRhdGUgdG9rZW5zTG9ja2VkIGFuZCB0aGUgcXVhbnRpdHkgdG8gZ2V0DQogICAgICAgICAgYnV5T3JkZXIudG9rZW5zTG9ja2VkID0gYXBpLkJpZ051bWJlcihidXlPcmRlci50b2tlbnNMb2NrZWQpDQogICAgICAgICAgICAubWludXMocXR5VG9rZW5zVG9TZW5kKQ0KICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQogICAgICAgICAgYnV5T3JkZXIucXVhbnRpdHkgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLm1pbnVzKHNlbGxPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgIC50b0ZpeGVkKHRva2VuUHJlY2lzaW9uKTsNCg0KICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBvcmRlciBjYW4gc3RpbGwgYmUgZmlsbGVkDQogICAgICAgICAgY29uc3QgbmJUb2tlbnNUb0ZpbGxPcmRlciA9IGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucHJpY2UpDQogICAgICAgICAgICAubXVsdGlwbGllZEJ5KGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQoNCiAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihuYlRva2Vuc1RvRmlsbE9yZGVyKS5sdCgnMC4wMDAwMDAwMScpKSB7DQogICAgICAgICAgICBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnMoYWNjb3VudCwgSElWRV9QRUdHRURfU1lNQk9MLCBidXlPcmRlci50b2tlbnNMb2NrZWQsICd1c2VyJyk7DQoNCiAgICAgICAgICAgIGJ1eU9yZGVyLnF1YW50aXR5ID0gJzAnOw0KICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnYnV5Qm9vaycsIGJ1eU9yZGVyKTsNCiAgICAgICAgICAgIGFwaS5lbWl0KCdvcmRlckNsb3NlZCcsIHsgYWNjb3VudDogYnV5T3JkZXIuYWNjb3VudCwgdHlwZTogJ2J1eScsIHR4SWQ6IGJ1eU9yZGVyLnR4SWQgfSk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gYWRkIHRoZSB0cmFkZSB0byB0aGUgaGlzdG9yeQ0KICAgICAgICAgIGF3YWl0IHVwZGF0ZVRyYWRlc0hpc3RvcnkoJ2J1eScsIGFjY291bnQsIHNlbGxPcmRlci5hY2NvdW50LCBzeW1ib2wsIHNlbGxPcmRlci5xdWFudGl0eSwgc2VsbE9yZGVyLnByaWNlLCBxdHlUb2tlbnNUb1NlbmQpOw0KDQogICAgICAgICAgLy8gdXBkYXRlIHRoZSB2b2x1bWUNCiAgICAgICAgICB2b2x1bWVUcmFkZWQgPSBhcGkuQmlnTnVtYmVyKHZvbHVtZVRyYWRlZCkucGx1cyhxdHlUb2tlbnNUb1NlbmQpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGluYyArPSAxOw0KICAgIH0NCg0KICAgIG9mZnNldCArPSAxMDAwOw0KDQogICAgaWYgKGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucXVhbnRpdHkpLmd0KDApKSB7DQogICAgICAvLyBnZXQgdGhlIG9yZGVycyB0aGF0IG1hdGNoIHRoZSBzeW1ib2wgYW5kIHRoZSBwcmljZQ0KICAgICAgc2VsbE9yZGVyQm9vayA9IGF3YWl0IGFwaS5kYi5maW5kKCdzZWxsQm9vaycsIHsNCiAgICAgICAgc3ltYm9sLA0KICAgICAgICBwcmljZURlYzogew0KICAgICAgICAgICRsdGU6IHByaWNlRGVjLA0KICAgICAgICB9LA0KICAgICAgfSwgMTAwMCwgb2Zmc2V0LA0KICAgICAgWw0KICAgICAgICB7IGluZGV4OiAncHJpY2VEZWMnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LA0KICAgICAgICB7IGluZGV4OiAnX2lkJywgZGVzY2VuZGluZzogZmFsc2UgfSwNCiAgICAgIF0pOw0KICAgIH0NCiAgfSB3aGlsZSAoc2VsbE9yZGVyQm9vay5sZW5ndGggPiAwICYmIGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucXVhbnRpdHkpLmd0KDApKTsNCg0KICAvLyB1cGRhdGUgdGhlIGJ1eSBvcmRlciBpZiBwYXJ0aWFsbHkgZmlsbGVkDQogIGlmIChhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnF1YW50aXR5KS5ndCgwKSkgew0KICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2J1eUJvb2snLCBidXlPcmRlcik7DQogIH0NCiAgaWYgKGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5ndCgwKSkgew0KICAgIGF3YWl0IHVwZGF0ZVZvbHVtZU1ldHJpYyhzeW1ib2wsIHZvbHVtZVRyYWRlZCk7DQogIH0NCiAgYXdhaXQgdXBkYXRlQXNrTWV0cmljKHN5bWJvbCk7DQogIGF3YWl0IHVwZGF0ZUJpZE1ldHJpYyhzeW1ib2wpOw0KfTsNCg0KY29uc3QgZmluZE1hdGNoaW5nQnV5T3JkZXJzID0gYXN5bmMgKG9yZGVyLCB0b2tlblByZWNpc2lvbikgPT4gew0KICBjb25zdCB7DQogICAgYWNjb3VudCwNCiAgICBzeW1ib2wsDQogICAgcHJpY2VEZWMsDQogIH0gPSBvcmRlcjsNCg0KICBjb25zdCBzZWxsT3JkZXIgPSBvcmRlcjsNCiAgbGV0IG9mZnNldCA9IDA7DQogIGxldCB2b2x1bWVUcmFkZWQgPSAwOw0KDQogIGF3YWl0IHJlbW92ZUV4cGlyZWRPcmRlcnMoJ2J1eUJvb2snKTsNCg0KICAvLyBnZXQgdGhlIG9yZGVycyB0aGF0IG1hdGNoIHRoZSBzeW1ib2wgYW5kIHRoZSBwcmljZQ0KICBsZXQgYnV5T3JkZXJCb29rID0gYXdhaXQgYXBpLmRiLmZpbmQoJ2J1eUJvb2snLCB7DQogICAgc3ltYm9sLA0KICAgIHByaWNlRGVjOiB7DQogICAgICAkZ3RlOiBwcmljZURlYywNCiAgICB9LA0KICB9LCAxMDAwLCBvZmZzZXQsDQogIFsNCiAgICB7IGluZGV4OiAncHJpY2VEZWMnLCBkZXNjZW5kaW5nOiB0cnVlIH0sDQogICAgeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH0sDQogIF0pOw0KDQogIGRvIHsNCiAgICBjb25zdCBuYk9yZGVycyA9IGJ1eU9yZGVyQm9vay5sZW5ndGg7DQogICAgbGV0IGluYyA9IDA7DQoNCiAgICB3aGlsZSAoaW5jIDwgbmJPcmRlcnMgJiYgYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucXVhbnRpdHkpLmd0KDApKSB7DQogICAgICBjb25zdCBidXlPcmRlciA9IGJ1eU9yZGVyQm9va1tpbmNdOw0KICAgICAgaWYgKGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnF1YW50aXR5KS5sdGUoYnV5T3JkZXIucXVhbnRpdHkpKSB7DQogICAgICAgIGxldCBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnByaWNlKQ0KICAgICAgICAgIC5tdWx0aXBsaWVkQnkoc2VsbE9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04pOw0KDQogICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHF0eVRva2Vuc1RvU2VuZCkuZ3QoYnV5T3JkZXIudG9rZW5zTG9ja2VkKSkgew0KICAgICAgICAgIHF0eVRva2Vuc1RvU2VuZCA9IGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucHJpY2UpDQogICAgICAgICAgICAubXVsdGlwbGllZEJ5KHNlbGxPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF0eVRva2Vuc1RvU2VuZCkuZ3QoMCkNCiAgICAgICAgICAmJiBhcGkuQmlnTnVtYmVyKHNlbGxPcmRlci5xdWFudGl0eSkuZ3QoMCksICd0aGUgb3JkZXIgY2Fubm90IGJlIGZpbGxlZCcpKSB7DQogICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgYnV5ZXINCiAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGJ1eU9yZGVyLmFjY291bnQsIHN5bWJvbCwgc2VsbE9yZGVyLnF1YW50aXR5LCAndXNlcicpOw0KDQogICAgICAgICAgaWYgKHJlcy5lcnJvcnMpIHsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhyZXMuZXJyb3JzKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhgVFhJRDogJHthcGkudHJhbnNhY3Rpb25JZH1gKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhidXlPcmRlci5hY2NvdW50KTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhzeW1ib2wpOw0KICAgICAgICAgICAgYXBpLmRlYnVnKHNlbGxPcmRlci5xdWFudGl0eSk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgc2VsbGVyDQogICAgICAgICAgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFjY291bnQsIEhJVkVfUEVHR0VEX1NZTUJPTCwgcXR5VG9rZW5zVG9TZW5kLCAndXNlcicpOw0KDQogICAgICAgICAgaWYgKHJlcy5lcnJvcnMpIHsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhyZXMuZXJyb3JzKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhgVFhJRDogJHthcGkudHJhbnNhY3Rpb25JZH1gKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhhY2NvdW50KTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhISVZFX1BFR0dFRF9TWU1CT0wpOw0KICAgICAgICAgICAgYXBpLmRlYnVnKHF0eVRva2Vuc1RvU2VuZCk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gdXBkYXRlIHRoZSBidXkgb3JkZXINCiAgICAgICAgICBjb25zdCBxdHlMZWZ0QnV5T3JkZXIgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLm1pbnVzKHNlbGxPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgIC50b0ZpeGVkKHRva2VuUHJlY2lzaW9uKTsNCg0KICAgICAgICAgIGNvbnN0IGJ1eU9yZGVydG9rZW5zTG9ja2VkID0gYXBpLkJpZ051bWJlcihidXlPcmRlci50b2tlbnNMb2NrZWQpDQogICAgICAgICAgICAubWludXMocXR5VG9rZW5zVG9TZW5kKQ0KICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQogICAgICAgICAgY29uc3QgbmJUb2tlbnNUb0ZpbGxPcmRlciA9IGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucHJpY2UpDQogICAgICAgICAgICAubXVsdGlwbGllZEJ5KHF0eUxlZnRCdXlPcmRlcikNCiAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04pOw0KDQogICAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIocXR5TGVmdEJ1eU9yZGVyKS5ndCgwKQ0KICAgICAgICAgICAgJiYgKGFwaS5CaWdOdW1iZXIobmJUb2tlbnNUb0ZpbGxPcmRlcikuZ3RlKCcwLjAwMDAwMDAxJykpKSB7DQogICAgICAgICAgICBidXlPcmRlci5xdWFudGl0eSA9IHF0eUxlZnRCdXlPcmRlcjsNCiAgICAgICAgICAgIGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCA9IGJ1eU9yZGVydG9rZW5zTG9ja2VkOw0KDQogICAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdidXlCb29rJywgYnV5T3JkZXIpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihidXlPcmRlcnRva2Vuc0xvY2tlZCkuZ3QoMCkpIHsNCiAgICAgICAgICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGJ1eU9yZGVyLmFjY291bnQsIEhJVkVfUEVHR0VEX1NZTUJPTCwgYnV5T3JkZXJ0b2tlbnNMb2NrZWQsICd1c2VyJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhcGkuZW1pdCgnb3JkZXJDbG9zZWQnLCB7IGFjY291bnQ6IGJ1eU9yZGVyLmFjY291bnQsIHR5cGU6ICdidXknLCB0eElkOiBidXlPcmRlci50eElkIH0pOw0KICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnYnV5Qm9vaycsIGJ1eU9yZGVyKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBhZGQgdGhlIHRyYWRlIHRvIHRoZSBoaXN0b3J5DQogICAgICAgICAgYXdhaXQgdXBkYXRlVHJhZGVzSGlzdG9yeSgnc2VsbCcsIGJ1eU9yZGVyLmFjY291bnQsIGFjY291bnQsIHN5bWJvbCwgc2VsbE9yZGVyLnF1YW50aXR5LCBidXlPcmRlci5wcmljZSwgcXR5VG9rZW5zVG9TZW5kKTsNCg0KICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdm9sdW1lDQogICAgICAgICAgdm9sdW1lVHJhZGVkID0gYXBpLkJpZ051bWJlcih2b2x1bWVUcmFkZWQpLnBsdXMocXR5VG9rZW5zVG9TZW5kKTsNCg0KICAgICAgICAgIHNlbGxPcmRlci5xdWFudGl0eSA9IDA7DQogICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2VsbEJvb2snLCBzZWxsT3JkZXIpOw0KICAgICAgICAgIGFwaS5lbWl0KCdvcmRlckNsb3NlZCcsIHsgYWNjb3VudDogc2VsbE9yZGVyLmFjY291bnQsIHR5cGU6ICdzZWxsJywgdHhJZDogc2VsbE9yZGVyLnR4SWQgfSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGxldCBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnByaWNlKQ0KICAgICAgICAgIC5tdWx0aXBsaWVkQnkoYnV5T3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQoNCiAgICAgICAgaWYgKHF0eVRva2Vuc1RvU2VuZCA+IGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCkgew0KICAgICAgICAgIHF0eVRva2Vuc1RvU2VuZCA9IGFwaS5CaWdOdW1iZXIoYnV5T3JkZXIucHJpY2UpDQogICAgICAgICAgICAubXVsdGlwbGllZEJ5KGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocXR5VG9rZW5zVG9TZW5kKS5ndCgwKQ0KICAgICAgICAgICYmIGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnF1YW50aXR5KS5ndCgwKSwgJ3RoZSBvcmRlciBjYW5ub3QgYmUgZmlsbGVkJykpIHsNCiAgICAgICAgICAvLyB0cmFuc2ZlciB0aGUgdG9rZW5zIHRvIHRoZSBidXllcg0KICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnMoYnV5T3JkZXIuYWNjb3VudCwgc3ltYm9sLCBidXlPcmRlci5xdWFudGl0eSwgJ3VzZXInKTsNCg0KICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICBhcGkuZGVidWcoYnV5T3JkZXIuYWNjb3VudCk7DQogICAgICAgICAgICBhcGkuZGVidWcoc3ltYm9sKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhidXlPcmRlci5xdWFudGl0eSk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgc2VsbGVyDQogICAgICAgICAgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFjY291bnQsIEhJVkVfUEVHR0VEX1NZTUJPTCwgcXR5VG9rZW5zVG9TZW5kLCAndXNlcicpOw0KDQogICAgICAgICAgaWYgKHJlcy5lcnJvcnMpIHsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhyZXMuZXJyb3JzKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhgVFhJRDogJHthcGkudHJhbnNhY3Rpb25JZH1gKTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhhY2NvdW50KTsNCiAgICAgICAgICAgIGFwaS5kZWJ1ZyhISVZFX1BFR0dFRF9TWU1CT0wpOw0KICAgICAgICAgICAgYXBpLmRlYnVnKHF0eVRva2Vuc1RvU2VuZCk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgY29uc3QgYnV5T3JkZXJ0b2tlbnNMb2NrZWQgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCkNCiAgICAgICAgICAgIC5taW51cyhxdHlUb2tlbnNUb1NlbmQpDQogICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKGJ1eU9yZGVydG9rZW5zTG9ja2VkKS5ndCgwKSkgew0KICAgICAgICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGJ1eU9yZGVyLmFjY291bnQsIEhJVkVfUEVHR0VEX1NZTUJPTCwgYnV5T3JkZXJ0b2tlbnNMb2NrZWQsICd1c2VyJyk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gcmVtb3ZlIHRoZSBidXkgb3JkZXINCiAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdidXlCb29rJywgYnV5T3JkZXIpOw0KICAgICAgICAgIGFwaS5lbWl0KCdvcmRlckNsb3NlZCcsIHsgYWNjb3VudDogYnV5T3JkZXIuYWNjb3VudCwgdHlwZTogJ2J1eScsIHR4SWQ6IGJ1eU9yZGVyLnR4SWQgfSk7DQoNCiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHF1YW50aXR5IHRvIGdldA0KICAgICAgICAgIHNlbGxPcmRlci5xdWFudGl0eSA9IGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLm1pbnVzKGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgLnRvRml4ZWQodG9rZW5QcmVjaXNpb24pOw0KDQogICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIG9yZGVyIGNhbiBzdGlsbCBiZSBmaWxsZWQNCiAgICAgICAgICBjb25zdCBuYlRva2Vuc1RvRmlsbE9yZGVyID0gYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucHJpY2UpDQogICAgICAgICAgICAubXVsdGlwbGllZEJ5KHNlbGxPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04pOw0KDQogICAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIobmJUb2tlbnNUb0ZpbGxPcmRlcikubHQoJzAuMDAwMDAwMDEnKSkgew0KICAgICAgICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFjY291bnQsIHN5bWJvbCwgc2VsbE9yZGVyLnF1YW50aXR5LCAndXNlcicpOw0KDQogICAgICAgICAgICBzZWxsT3JkZXIucXVhbnRpdHkgPSAnMCc7DQogICAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdzZWxsQm9vaycsIHNlbGxPcmRlcik7DQogICAgICAgICAgICBhcGkuZW1pdCgnb3JkZXJDbG9zZWQnLCB7IGFjY291bnQ6IHNlbGxPcmRlci5hY2NvdW50LCB0eXBlOiAnc2VsbCcsIHR4SWQ6IHNlbGxPcmRlci50eElkIH0pOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIGFkZCB0aGUgdHJhZGUgdG8gdGhlIGhpc3RvcnkNCiAgICAgICAgICBhd2FpdCB1cGRhdGVUcmFkZXNIaXN0b3J5KCdzZWxsJywgYnV5T3JkZXIuYWNjb3VudCwgYWNjb3VudCwgc3ltYm9sLCBidXlPcmRlci5xdWFudGl0eSwgYnV5T3JkZXIucHJpY2UsIHF0eVRva2Vuc1RvU2VuZCk7DQoNCiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHZvbHVtZQ0KICAgICAgICAgIHZvbHVtZVRyYWRlZCA9IGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5wbHVzKHF0eVRva2Vuc1RvU2VuZCk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgaW5jICs9IDE7DQogICAgfQ0KDQogICAgb2Zmc2V0ICs9IDEwMDA7DQoNCiAgICBpZiAoYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucXVhbnRpdHkpLmd0KDApKSB7DQogICAgICAvLyBnZXQgdGhlIG9yZGVycyB0aGF0IG1hdGNoIHRoZSBzeW1ib2wgYW5kIHRoZSBwcmljZQ0KICAgICAgYnV5T3JkZXJCb29rID0gYXdhaXQgYXBpLmRiLmZpbmQoJ2J1eUJvb2snLCB7DQogICAgICAgIHN5bWJvbCwNCiAgICAgICAgcHJpY2VEZWM6IHsNCiAgICAgICAgICAkZ3RlOiBwcmljZURlYywNCiAgICAgICAgfSwNCiAgICAgIH0sIDEwMDAsIG9mZnNldCwNCiAgICAgIFsNCiAgICAgICAgeyBpbmRleDogJ3ByaWNlRGVjJywgZGVzY2VuZGluZzogdHJ1ZSB9LA0KICAgICAgICB7IGluZGV4OiAnX2lkJywgZGVzY2VuZGluZzogZmFsc2UgfSwNCiAgICAgIF0pOw0KICAgIH0NCiAgfSB3aGlsZSAoYnV5T3JkZXJCb29rLmxlbmd0aCA+IDAgJiYgYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucXVhbnRpdHkpLmd0KDApKTsNCg0KICAvLyB1cGRhdGUgdGhlIHNlbGwgb3JkZXIgaWYgcGFydGlhbGx5IGZpbGxlZA0KICBpZiAoYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucXVhbnRpdHkpLmd0KDApKSB7DQogICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnc2VsbEJvb2snLCBzZWxsT3JkZXIpOw0KICB9DQoNCiAgaWYgKGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5ndCgwKSkgew0KICAgIGF3YWl0IHVwZGF0ZVZvbHVtZU1ldHJpYyhzeW1ib2wsIHZvbHVtZVRyYWRlZCk7DQogIH0NCiAgYXdhaXQgdXBkYXRlQXNrTWV0cmljKHN5bWJvbCk7DQogIGF3YWl0IHVwZGF0ZUJpZE1ldHJpYyhzeW1ib2wpOw0KfTsNCg0KYWN0aW9ucy5idXkgPSBhc3luYyAocGF5bG9hZCkgPT4gew0KICBjb25zdCB7DQogICAgc3ltYm9sLA0KICAgIHF1YW50aXR5LA0KICAgIHByaWNlLA0KICAgIGV4cGlyYXRpb24sDQogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LA0KICB9ID0gcGF5bG9hZDsNCg0KICAvLyBidXkgKHF1YW50aXR5KSBvZiAoc3ltYm9sKSBhdCAocHJpY2UpKEhJVkVfUEVHR0VEX1NZTUJPTCkgcGVyIChzeW1ib2wpDQogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpDQogICAgJiYgYXBpLmFzc2VydChwcmljZSAmJiB0eXBlb2YgcHJpY2UgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHByaWNlKS5pc05hTigpDQogICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycgJiYgc3ltYm9sICE9PSBISVZFX1BFR0dFRF9TWU1CT0wNCiAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmlzTmFOKCkNCiAgICAgICYmIChleHBpcmF0aW9uID09PSB1bmRlZmluZWQgfHwgKGV4cGlyYXRpb24gJiYgTnVtYmVyLmlzSW50ZWdlcihleHBpcmF0aW9uKSAmJiBleHBpcmF0aW9uID4gMCkpLCAnaW52YWxpZCBwYXJhbXMnKQ0KICApIHsNCiAgICAvLyBnZXQgdGhlIHRva2VuIHBhcmFtcw0KICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2wgfSk7DQoNCiAgICAvLyBwZXJmb3JtIGEgZmV3IHZlcmlmaWNhdGlvbnMNCiAgICBpZiAoYXBpLmFzc2VydCh0b2tlbg0KICAgICAgJiYgYXBpLkJpZ051bWJlcihwcmljZSkuZ3QoMCkNCiAgICAgICYmIGNvdW50RGVjaW1hbHMocHJpY2UpIDw9IEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04NCiAgICAgICYmIGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ2ludmFsaWQgcGFyYW1zJykpIHsNCiAgICAgIC8vIGluaXRpYXRlIGEgdHJhbnNmZXIgZnJvbSBhcGkuc2VuZGVyIHRvIGNvbnRyYWN0IGJhbGFuY2UNCg0KICAgICAgY29uc3QgbmJUb2tlbnNUb0xvY2sgPSBhcGkuQmlnTnVtYmVyKHByaWNlKQ0KICAgICAgICAubXVsdGlwbGllZEJ5KHF1YW50aXR5KQ0KICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihuYlRva2Vuc1RvTG9jaykuZ3RlKCcwLjAwMDAwMDAxJyksICdvcmRlciBjYW5ub3QgYmUgcGxhY2VkIGFzIGl0IGNhbm5vdCBiZSBmaWxsZWQnKSkgew0KICAgICAgICAvLyBsb2NrIEhJVkVfUEVHR0VEX1NZTUJPTCB0b2tlbnMNCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXJUb0NvbnRyYWN0JywgeyBzeW1ib2w6IEhJVkVfUEVHR0VEX1NZTUJPTCwgcXVhbnRpdHk6IG5iVG9rZW5zVG9Mb2NrLCB0bzogQ09OVFJBQ1RfTkFNRSB9KTsNCg0KICAgICAgICBpZiAocmVzLmVycm9ycyA9PT0gdW5kZWZpbmVkDQogICAgICAgICAgJiYgcmVzLmV2ZW50cyAmJiByZXMuZXZlbnRzLmZpbmQoZWwgPT4gZWwuY29udHJhY3QgPT09ICd0b2tlbnMnICYmIGVsLmV2ZW50ID09PSAndHJhbnNmZXJUb0NvbnRyYWN0JyAmJiBlbC5kYXRhLmZyb20gPT09IGFwaS5zZW5kZXIgJiYgZWwuZGF0YS50byA9PT0gQ09OVFJBQ1RfTkFNRSAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBuYlRva2Vuc1RvTG9jayAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gSElWRV9QRUdHRURfU1lNQk9MKSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgY29uc3QgdGltZXN0YW1wU2VjID0gYXBpLkJpZ051bWJlcihuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpKQ0KICAgICAgICAgICAgLmRpdmlkZWRCeSgxMDAwKQ0KICAgICAgICAgICAgLnRvTnVtYmVyKCk7DQoNCiAgICAgICAgICAvLyBvcmRlcg0KICAgICAgICAgIGNvbnN0IG9yZGVyID0ge307DQoNCiAgICAgICAgICBvcmRlci50eElkID0gYXBpLnRyYW5zYWN0aW9uSWQ7DQogICAgICAgICAgb3JkZXIudGltZXN0YW1wID0gdGltZXN0YW1wU2VjOw0KICAgICAgICAgIG9yZGVyLmFjY291bnQgPSBhcGkuc2VuZGVyOw0KICAgICAgICAgIG9yZGVyLnN5bWJvbCA9IHN5bWJvbDsNCiAgICAgICAgICBvcmRlci5xdWFudGl0eSA9IGFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTsNCiAgICAgICAgICBvcmRlci5wcmljZSA9IGFwaS5CaWdOdW1iZXIocHJpY2UpLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQogICAgICAgICAgb3JkZXIucHJpY2VEZWMgPSB7ICRudW1iZXJEZWNpbWFsOiBvcmRlci5wcmljZSB9Ow0KICAgICAgICAgIG9yZGVyLnRva2Vuc0xvY2tlZCA9IG5iVG9rZW5zVG9Mb2NrOw0KICAgICAgICAgIG9yZGVyLmV4cGlyYXRpb24gPSBleHBpcmF0aW9uID09PSB1bmRlZmluZWQgfHwgZXhwaXJhdGlvbiA+IDI1OTIwMDANCiAgICAgICAgICAgID8gdGltZXN0YW1wU2VjICsgMjU5MjAwMA0KICAgICAgICAgICAgOiB0aW1lc3RhbXBTZWMgKyBleHBpcmF0aW9uOw0KDQogICAgICAgICAgY29uc3Qgb3JkZXJJbkRiID0gYXdhaXQgYXBpLmRiLmluc2VydCgnYnV5Qm9vaycsIG9yZGVyKTsNCg0KICAgICAgICAgIGF3YWl0IGZpbmRNYXRjaGluZ1NlbGxPcmRlcnMob3JkZXJJbkRiLCB0b2tlbi5wcmVjaXNpb24pOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQp9Ow0KDQphY3Rpb25zLnNlbGwgPSBhc3luYyAocGF5bG9hZCkgPT4gew0KICBjb25zdCB7DQogICAgc3ltYm9sLA0KICAgIHF1YW50aXR5LA0KICAgIHByaWNlLA0KICAgIGV4cGlyYXRpb24sDQogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LA0KICB9ID0gcGF5bG9hZDsNCiAgLy8gc2VsbCAocXVhbnRpdHkpIG9mIChzeW1ib2wpIGF0IChwcmljZSkoSElWRV9QRUdHRURfU1lNQk9MKSBwZXIgKHN5bWJvbCkNCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykNCiAgICAmJiBhcGkuYXNzZXJ0KHByaWNlICYmIHR5cGVvZiBwcmljZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocHJpY2UpLmlzTmFOKCkNCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJyAmJiBzeW1ib2wgIT09IEhJVkVfUEVHR0VEX1NZTUJPTA0KICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKQ0KICAgICAgJiYgKGV4cGlyYXRpb24gPT09IHVuZGVmaW5lZCB8fCAoZXhwaXJhdGlvbiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGV4cGlyYXRpb24pICYmIGV4cGlyYXRpb24gPiAwKSksICdpbnZhbGlkIHBhcmFtcycpKSB7DQogICAgLy8gZ2V0IHRoZSB0b2tlbiBwYXJhbXMNCiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ3Rva2VucycsIHsgc3ltYm9sIH0pOw0KDQogICAgLy8gcGVyZm9ybSBhIGZldyB2ZXJpZmljYXRpb25zDQogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4NCiAgICAgICYmIGFwaS5CaWdOdW1iZXIocHJpY2UpLmd0KDApDQogICAgICAmJiBjb3VudERlY2ltYWxzKHByaWNlKSA8PSBISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9ODQogICAgICAmJiBjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdpbnZhbGlkIHBhcmFtcycpKSB7DQogICAgICBjb25zdCBuYlRva2Vuc1RvRmlsbE9yZGVyID0gYXBpLkJpZ051bWJlcihwcmljZSkNCiAgICAgICAgLm11bHRpcGxpZWRCeShxdWFudGl0eSkNCiAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQoNCiAgICAgIGlmIChhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobmJUb2tlbnNUb0ZpbGxPcmRlcikuZ3RlKCcwLjAwMDAwMDAxJyksICdvcmRlciBjYW5ub3QgYmUgcGxhY2VkIGFzIGl0IGNhbm5vdCBiZSBmaWxsZWQnKSkgew0KICAgICAgICAvLyBpbml0aWF0ZSBhIHRyYW5zZmVyIGZyb20gYXBpLnNlbmRlciB0byBjb250cmFjdCBiYWxhbmNlDQogICAgICAgIC8vIGxvY2sgc3ltYm9sIHRva2Vucw0KICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlclRvQ29udHJhY3QnLCB7IHN5bWJvbCwgcXVhbnRpdHksIHRvOiBDT05UUkFDVF9OQU1FIH0pOw0KDQogICAgICAgIGlmIChyZXMuZXJyb3JzID09PSB1bmRlZmluZWQNCiAgICAgICAgICAmJiByZXMuZXZlbnRzICYmIHJlcy5ldmVudHMuZmluZChlbCA9PiBlbC5jb250cmFjdCA9PT0gJ3Rva2VucycgJiYgZWwuZXZlbnQgPT09ICd0cmFuc2ZlclRvQ29udHJhY3QnICYmIGVsLmRhdGEuZnJvbSA9PT0gYXBpLnNlbmRlciAmJiBlbC5kYXRhLnRvID09PSBDT05UUkFDVF9OQU1FICYmIGVsLmRhdGEucXVhbnRpdHkgPT09IHF1YW50aXR5ICYmIGVsLmRhdGEuc3ltYm9sID09PSBzeW1ib2wpICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICBjb25zdCB0aW1lc3RhbXBTZWMgPSBhcGkuQmlnTnVtYmVyKG5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKS5nZXRUaW1lKCkpDQogICAgICAgICAgICAuZGl2aWRlZEJ5KDEwMDApDQogICAgICAgICAgICAudG9OdW1iZXIoKTsNCg0KICAgICAgICAgIC8vIG9yZGVyDQogICAgICAgICAgY29uc3Qgb3JkZXIgPSB7fTsNCg0KICAgICAgICAgIG9yZGVyLnR4SWQgPSBhcGkudHJhbnNhY3Rpb25JZDsNCiAgICAgICAgICBvcmRlci50aW1lc3RhbXAgPSB0aW1lc3RhbXBTZWM7DQogICAgICAgICAgb3JkZXIuYWNjb3VudCA9IGFwaS5zZW5kZXI7DQogICAgICAgICAgb3JkZXIuc3ltYm9sID0gc3ltYm9sOw0KICAgICAgICAgIG9yZGVyLnF1YW50aXR5ID0gYXBpLkJpZ051bWJlcihxdWFudGl0eSkudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOw0KICAgICAgICAgIG9yZGVyLnByaWNlID0gYXBpLkJpZ051bWJlcihwcmljZSkudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCiAgICAgICAgICBvcmRlci5wcmljZURlYyA9IHsgJG51bWJlckRlY2ltYWw6IG9yZGVyLnByaWNlIH07DQogICAgICAgICAgb3JkZXIuZXhwaXJhdGlvbiA9IGV4cGlyYXRpb24gPT09IHVuZGVmaW5lZCB8fCBleHBpcmF0aW9uID4gMjU5MjAwMA0KICAgICAgICAgICAgPyB0aW1lc3RhbXBTZWMgKyAyNTkyMDAwDQogICAgICAgICAgICA6IHRpbWVzdGFtcFNlYyArIGV4cGlyYXRpb247DQoNCiAgICAgICAgICBjb25zdCBvcmRlckluRGIgPSBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdzZWxsQm9vaycsIG9yZGVyKTsNCg0KICAgICAgICAgIGF3YWl0IGZpbmRNYXRjaGluZ0J1eU9yZGVycyhvcmRlckluRGIsIHRva2VuLnByZWNpc2lvbik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCn07DQoNCmFjdGlvbnMubWFya2V0QnV5ID0gYXN5bmMgKHBheWxvYWQpID0+IHsNCiAgY29uc3Qgew0KICAgIHN5bWJvbCwNCiAgICBxdWFudGl0eSwNCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksDQogIH0gPSBwYXlsb2FkOw0KDQogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpDQogICAgJiYgc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnICYmIHN5bWJvbCAhPT0gSElWRV9QRUdHRURfU1lNQk9MDQogICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSkgew0KICAgIC8vIGdldCB0aGUgdG9rZW4gcGFyYW1zDQogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbCB9KTsNCg0KICAgIC8vIHBlcmZvcm0gYSBmZXcgdmVyaWZpY2F0aW9ucw0KICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuDQogICAgICAmJiBjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSBISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OLCAnaW52YWxpZCBwYXJhbXMnKSkgew0KICAgICAgLy8gaW5pdGlhdGUgYSB0cmFuc2ZlciBmcm9tIGFwaS5zZW5kZXIgdG8gY29udHJhY3QgYmFsYW5jZQ0KICAgICAgLy8gbG9jayBISVZFX1BFR0dFRF9TWU1CT0wgdG9rZW5zDQogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlclRvQ29udHJhY3QnLCB7IHN5bWJvbDogSElWRV9QRUdHRURfU1lNQk9MLCBxdWFudGl0eSwgdG86IENPTlRSQUNUX05BTUUgfSk7DQoNCiAgICAgIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQNCiAgICAgICAgJiYgcmVzdWx0LmV2ZW50cyAmJiByZXN1bHQuZXZlbnRzLmZpbmQoZWwgPT4gZWwuY29udHJhY3QgPT09ICd0b2tlbnMnICYmIGVsLmV2ZW50ID09PSAndHJhbnNmZXJUb0NvbnRyYWN0JyAmJiBlbC5kYXRhLmZyb20gPT09IGFwaS5zZW5kZXIgJiYgZWwuZGF0YS50byA9PT0gQ09OVFJBQ1RfTkFNRSAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBxdWFudGl0eSAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gSElWRV9QRUdHRURfU1lNQk9MKSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgIGxldCBoaXZlUmVtYWluaW5nID0gcXVhbnRpdHk7DQogICAgICAgIGxldCBvZmZzZXQgPSAwOw0KICAgICAgICBsZXQgdm9sdW1lVHJhZGVkID0gMDsNCg0KICAgICAgICBhd2FpdCByZW1vdmVFeHBpcmVkT3JkZXJzKCdzZWxsQm9vaycpOw0KDQogICAgICAgIC8vIGdldCB0aGUgb3JkZXJzIHRoYXQgbWF0Y2ggdGhlIHN5bWJvbCBhbmQgdGhlIHByaWNlDQogICAgICAgIGxldCBzZWxsT3JkZXJCb29rID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3NlbGxCb29rJywgew0KICAgICAgICAgIHN5bWJvbCwNCiAgICAgICAgfSwgMTAwMCwgb2Zmc2V0LA0KICAgICAgICBbDQogICAgICAgICAgeyBpbmRleDogJ3ByaWNlRGVjJywgZGVzY2VuZGluZzogZmFsc2UgfSwNCiAgICAgICAgICB7IGluZGV4OiAnX2lkJywgZGVzY2VuZGluZzogZmFsc2UgfSwNCiAgICAgICAgXSk7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgIGNvbnN0IG5iT3JkZXJzID0gc2VsbE9yZGVyQm9vay5sZW5ndGg7DQogICAgICAgICAgbGV0IGluYyA9IDA7DQoNCiAgICAgICAgICB3aGlsZSAoaW5jIDwgbmJPcmRlcnMgJiYgYXBpLkJpZ051bWJlcihoaXZlUmVtYWluaW5nKS5ndCgwKSkgew0KICAgICAgICAgICAgY29uc3Qgc2VsbE9yZGVyID0gc2VsbE9yZGVyQm9va1tpbmNdOw0KICAgICAgICAgICAgY29uc3QgcXR5VG9rZW5zVG9TZW5kID0gYXBpLkJpZ051bWJlcihoaXZlUmVtYWluaW5nKQ0KICAgICAgICAgICAgICAuZGl2aWRlZEJ5KHNlbGxPcmRlci5wcmljZSkNCiAgICAgICAgICAgICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOw0KDQogICAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihxdHlUb2tlbnNUb1NlbmQpLmx0ZShzZWxsT3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgICAgICYmIGFwaS5CaWdOdW1iZXIocXR5VG9rZW5zVG9TZW5kKS5ndCgwKSkgew0KICAgICAgICAgICAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF0eVRva2Vuc1RvU2VuZCkuZ3QoMCkNCiAgICAgICAgICAgICAgICAmJiBhcGkuQmlnTnVtYmVyKGhpdmVSZW1haW5pbmcpLmd0KDApLCAndGhlIG9yZGVyIGNhbm5vdCBiZSBmaWxsZWQnKSkgew0KICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIGJ1eWVyDQogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhhcGkuc2VuZGVyLCBzeW1ib2wsIHF0eVRva2Vuc1RvU2VuZCwgJ3VzZXInKTsNCg0KICAgICAgICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYXBpLnNlbmRlcik7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoc3ltYm9sKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhxdHlUb2tlbnNUb1NlbmQpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIHNlbGxlcg0KICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhzZWxsT3JkZXIuYWNjb3VudCwgSElWRV9QRUdHRURfU1lNQk9MLCBoaXZlUmVtYWluaW5nLCAndXNlcicpOw0KDQogICAgICAgICAgICAgICAgaWYgKHJlcy5lcnJvcnMpIHsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhyZXMuZXJyb3JzKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhgVFhJRDogJHthcGkudHJhbnNhY3Rpb25JZH1gKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhzZWxsT3JkZXIuYWNjb3VudCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoSElWRV9QRUdHRURfU1lNQk9MKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhoaXZlUmVtYWluaW5nKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlbGwgb3JkZXINCiAgICAgICAgICAgICAgICBjb25zdCBxdHlMZWZ0U2VsbE9yZGVyID0gYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgICAgICAgICAubWludXMocXR5VG9rZW5zVG9TZW5kKQ0KICAgICAgICAgICAgICAgICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTsNCiAgICAgICAgICAgICAgICBjb25zdCBuYlRva2Vuc1RvRmlsbE9yZGVyID0gYXBpLkJpZ051bWJlcihzZWxsT3JkZXIucHJpY2UpDQogICAgICAgICAgICAgICAgICAubXVsdGlwbGllZEJ5KHF0eUxlZnRTZWxsT3JkZXIpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHF0eUxlZnRTZWxsT3JkZXIpLmd0KDApDQogICAgICAgICAgICAgICAgICAmJiAoYXBpLkJpZ051bWJlcihuYlRva2Vuc1RvRmlsbE9yZGVyKS5ndGUoJzAuMDAwMDAwMDEnKSkpIHsNCiAgICAgICAgICAgICAgICAgIHNlbGxPcmRlci5xdWFudGl0eSA9IHF0eUxlZnRTZWxsT3JkZXI7DQoNCiAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3NlbGxCb29rJywgc2VsbE9yZGVyKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIocXR5TGVmdFNlbGxPcmRlcikuZ3QoMCkpIHsNCiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKHNlbGxPcmRlci5hY2NvdW50LCBzeW1ib2wsIHF0eUxlZnRTZWxsT3JkZXIsICd1c2VyJyk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdzZWxsQm9vaycsIHNlbGxPcmRlcik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gYWRkIHRoZSB0cmFkZSB0byB0aGUgaGlzdG9yeQ0KICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVRyYWRlc0hpc3RvcnkoJ2J1eScsIGFwaS5zZW5kZXIsIHNlbGxPcmRlci5hY2NvdW50LCBzeW1ib2wsIHF0eVRva2Vuc1RvU2VuZCwgc2VsbE9yZGVyLnByaWNlLCBoaXZlUmVtYWluaW5nKTsNCg0KICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdm9sdW1lDQogICAgICAgICAgICAgICAgdm9sdW1lVHJhZGVkID0gYXBpLkJpZ051bWJlcih2b2x1bWVUcmFkZWQpLnBsdXMoaGl2ZVJlbWFpbmluZyk7DQoNCiAgICAgICAgICAgICAgICBoaXZlUmVtYWluaW5nID0gJzAnOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS5CaWdOdW1iZXIocXR5VG9rZW5zVG9TZW5kKS5ndCgwKSkgew0KICAgICAgICAgICAgICBsZXQgcXR5SGl2ZVRvU2VuZCA9IGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnByaWNlKQ0KICAgICAgICAgICAgICAgIC5tdWx0aXBsaWVkQnkoc2VsbE9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04pOw0KDQogICAgICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHF0eUhpdmVUb1NlbmQpLmd0KGhpdmVSZW1haW5pbmcpKSB7DQogICAgICAgICAgICAgICAgcXR5SGl2ZVRvU2VuZCA9IGFwaS5CaWdOdW1iZXIoc2VsbE9yZGVyLnByaWNlKQ0KICAgICAgICAgICAgICAgICAgLm11bHRpcGxpZWRCeShzZWxsT3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOw0KICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdHlIaXZlVG9TZW5kKS5ndCgwKQ0KICAgICAgICAgICAgICAgICYmIGFwaS5CaWdOdW1iZXIoaGl2ZVJlbWFpbmluZykuZ3QoMCksICd0aGUgb3JkZXIgY2Fubm90IGJlIGZpbGxlZCcpKSB7DQogICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgYnV5ZXINCiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFwaS5zZW5kZXIsIHN5bWJvbCwgc2VsbE9yZGVyLnF1YW50aXR5LCAndXNlcicpOw0KDQogICAgICAgICAgICAgICAgaWYgKHJlcy5lcnJvcnMpIHsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhyZXMuZXJyb3JzKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhgVFhJRDogJHthcGkudHJhbnNhY3Rpb25JZH1gKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhhcGkuc2VuZGVyKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhzeW1ib2wpOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKHNlbGxPcmRlci5xdWFudGl0eSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgc2VsbGVyDQogICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKHNlbGxPcmRlci5hY2NvdW50LCBISVZFX1BFR0dFRF9TWU1CT0wsIHF0eUhpdmVUb1NlbmQsICd1c2VyJyk7DQoNCiAgICAgICAgICAgICAgICBpZiAocmVzLmVycm9ycykgew0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKHJlcy5lcnJvcnMpOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKGBUWElEOiAke2FwaS50cmFuc2FjdGlvbklkfWApOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKHNlbGxPcmRlci5hY2NvdW50KTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhISVZFX1BFR0dFRF9TWU1CT0wpOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKHF0eUhpdmVUb1NlbmQpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc2VsbCBvcmRlcg0KICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoJ3NlbGxCb29rJywgc2VsbE9yZGVyKTsNCg0KICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0b2tlbnNMb2NrZWQgYW5kIHRoZSBxdWFudGl0eSB0byBnZXQNCiAgICAgICAgICAgICAgICBoaXZlUmVtYWluaW5nID0gYXBpLkJpZ051bWJlcihoaXZlUmVtYWluaW5nKQ0KICAgICAgICAgICAgICAgICAgLm1pbnVzKHF0eUhpdmVUb1NlbmQpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdHJhZGUgdG8gdGhlIGhpc3RvcnkNCiAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVUcmFkZXNIaXN0b3J5KCdidXknLCBhcGkuc2VuZGVyLCBzZWxsT3JkZXIuYWNjb3VudCwgc3ltYm9sLCBzZWxsT3JkZXIucXVhbnRpdHksIHNlbGxPcmRlci5wcmljZSwgcXR5SGl2ZVRvU2VuZCk7DQoNCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHZvbHVtZQ0KICAgICAgICAgICAgICAgIHZvbHVtZVRyYWRlZCA9IGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5wbHVzKHF0eUhpdmVUb1NlbmQpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGluYyArPSAxOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIG9mZnNldCArPSAxMDAwOw0KDQogICAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIoaGl2ZVJlbWFpbmluZykuZ3QoMCkpIHsNCiAgICAgICAgICAgIC8vIGdldCB0aGUgb3JkZXJzIHRoYXQgbWF0Y2ggdGhlIHN5bWJvbCBhbmQgdGhlIHByaWNlDQogICAgICAgICAgICBzZWxsT3JkZXJCb29rID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3NlbGxCb29rJywgew0KICAgICAgICAgICAgICBzeW1ib2wsDQogICAgICAgICAgICB9LCAxMDAwLCBvZmZzZXQsDQogICAgICAgICAgICBbDQogICAgICAgICAgICAgIHsgaW5kZXg6ICdwcmljZURlYycsIGRlc2NlbmRpbmc6IGZhbHNlIH0sDQogICAgICAgICAgICAgIHsgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LA0KICAgICAgICAgICAgXSk7DQogICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlIChzZWxsT3JkZXJCb29rLmxlbmd0aCA+IDAgJiYgYXBpLkJpZ051bWJlcihoaXZlUmVtYWluaW5nKS5ndCgwKSk7DQoNCiAgICAgICAgLy8gdXBkYXRlIHRoZSBidXkgb3JkZXIgaWYgcGFydGlhbGx5IGZpbGxlZA0KICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihoaXZlUmVtYWluaW5nKS5ndCgwKSkgew0KICAgICAgICAgIGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhhcGkuc2VuZGVyLCBISVZFX1BFR0dFRF9TWU1CT0wsIGhpdmVSZW1haW5pbmcsICd1c2VyJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5ndCgwKSkgew0KICAgICAgICAgIGF3YWl0IHVwZGF0ZVZvbHVtZU1ldHJpYyhzeW1ib2wsIHZvbHVtZVRyYWRlZCk7DQogICAgICAgIH0NCiAgICAgICAgYXdhaXQgdXBkYXRlQXNrTWV0cmljKHN5bWJvbCk7DQogICAgICAgIGF3YWl0IHVwZGF0ZUJpZE1ldHJpYyhzeW1ib2wpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfTsNCg0KYWN0aW9ucy5tYXJrZXRTZWxsID0gYXN5bmMgKHBheWxvYWQpID0+IHsNCiAgY29uc3Qgew0KICAgIHN5bWJvbCwNCiAgICBxdWFudGl0eSwNCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksDQogIH0gPSBwYXlsb2FkOw0KDQogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpDQogICAgJiYgc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnICYmIHN5bWJvbCAhPT0gSElWRV9QRUdHRURfU1lNQk9MDQogICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSkgew0KICAgIC8vIGdldCB0aGUgdG9rZW4gcGFyYW1zDQogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbCB9KTsNCg0KICAgIC8vIHBlcmZvcm0gYSBmZXcgdmVyaWZpY2F0aW9ucw0KICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuDQogICAgICAmJiBjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdpbnZhbGlkIHBhcmFtcycpKSB7DQogICAgICAvLyBpbml0aWF0ZSBhIHRyYW5zZmVyIGZyb20gYXBpLnNlbmRlciB0byBjb250cmFjdCBiYWxhbmNlDQogICAgICAvLyBsb2NrIHN5bWJvbCB0b2tlbnMNCiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ3RyYW5zZmVyVG9Db250cmFjdCcsIHsgc3ltYm9sLCBxdWFudGl0eSwgdG86IENPTlRSQUNUX05BTUUgfSk7DQoNCiAgICAgIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQNCiAgICAgICAgJiYgcmVzdWx0LmV2ZW50cyAmJiByZXN1bHQuZXZlbnRzLmZpbmQoZWwgPT4gZWwuY29udHJhY3QgPT09ICd0b2tlbnMnICYmIGVsLmV2ZW50ID09PSAndHJhbnNmZXJUb0NvbnRyYWN0JyAmJiBlbC5kYXRhLmZyb20gPT09IGFwaS5zZW5kZXIgJiYgZWwuZGF0YS50byA9PT0gQ09OVFJBQ1RfTkFNRSAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBxdWFudGl0eSAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gc3ltYm9sKSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgIGxldCB0b2tlbnNSZW1haW5pbmcgPSBxdWFudGl0eTsNCiAgICAgICAgbGV0IG9mZnNldCA9IDA7DQogICAgICAgIGxldCB2b2x1bWVUcmFkZWQgPSAwOw0KDQogICAgICAgIGF3YWl0IHJlbW92ZUV4cGlyZWRPcmRlcnMoJ2J1eUJvb2snKTsNCg0KICAgICAgICAvLyBnZXQgdGhlIG9yZGVycyB0aGF0IG1hdGNoIHRoZSBzeW1ib2wNCiAgICAgICAgbGV0IGJ1eU9yZGVyQm9vayA9IGF3YWl0IGFwaS5kYi5maW5kKCdidXlCb29rJywgew0KICAgICAgICAgIHN5bWJvbCwNCiAgICAgICAgfSwgMTAwMCwgb2Zmc2V0LA0KICAgICAgICBbDQogICAgICAgICAgeyBpbmRleDogJ3ByaWNlRGVjJywgZGVzY2VuZGluZzogdHJ1ZSB9LA0KICAgICAgICAgIHsgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LA0KICAgICAgICBdKTsNCg0KICAgICAgICBkbyB7DQogICAgICAgICAgY29uc3QgbmJPcmRlcnMgPSBidXlPcmRlckJvb2subGVuZ3RoOw0KICAgICAgICAgIGxldCBpbmMgPSAwOw0KDQogICAgICAgICAgd2hpbGUgKGluYyA8IG5iT3JkZXJzICYmIGFwaS5CaWdOdW1iZXIodG9rZW5zUmVtYWluaW5nKS5ndCgwKSkgew0KICAgICAgICAgICAgY29uc3QgYnV5T3JkZXIgPSBidXlPcmRlckJvb2tbaW5jXTsNCiAgICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHRva2Vuc1JlbWFpbmluZykubHRlKGJ1eU9yZGVyLnF1YW50aXR5KSkgew0KICAgICAgICAgICAgICBsZXQgcXR5VG9rZW5zVG9TZW5kID0gYXBpLkJpZ051bWJlcihidXlPcmRlci5wcmljZSkNCiAgICAgICAgICAgICAgICAubXVsdGlwbGllZEJ5KHRva2Vuc1JlbWFpbmluZykNCiAgICAgICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCg0KICAgICAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihxdHlUb2tlbnNUb1NlbmQpLmd0KGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCkpIHsNCiAgICAgICAgICAgICAgICBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnByaWNlKQ0KICAgICAgICAgICAgICAgICAgLm11bHRpcGxpZWRCeSh0b2tlbnNSZW1haW5pbmcpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOw0KICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdHlUb2tlbnNUb1NlbmQpLmd0KDApDQogICAgICAgICAgICAgICAgJiYgYXBpLkJpZ051bWJlcih0b2tlbnNSZW1haW5pbmcpLmd0KDApLCAndGhlIG9yZGVyIGNhbm5vdCBiZSBmaWxsZWQnKSkgew0KICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIGJ1eWVyDQogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhidXlPcmRlci5hY2NvdW50LCBzeW1ib2wsIHRva2Vuc1JlbWFpbmluZywgJ3VzZXInKTsNCg0KICAgICAgICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYnV5T3JkZXIuYWNjb3VudCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoc3ltYm9sKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1Zyh0b2tlbnNSZW1haW5pbmcpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIHNlbGxlcg0KICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhhcGkuc2VuZGVyLCBISVZFX1BFR0dFRF9TWU1CT0wsIHF0eVRva2Vuc1RvU2VuZCwgJ3VzZXInKTsNCg0KICAgICAgICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYXBpLnNlbmRlcik7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoSElWRV9QRUdHRURfU1lNQk9MKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhxdHlUb2tlbnNUb1NlbmQpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYnV5IG9yZGVyDQogICAgICAgICAgICAgICAgY29uc3QgcXR5TGVmdEJ1eU9yZGVyID0gYXBpLkJpZ051bWJlcihidXlPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgICAgICAgIC5taW51cyh0b2tlbnNSZW1haW5pbmcpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOw0KDQogICAgICAgICAgICAgICAgY29uc3QgYnV5T3JkZXJ0b2tlbnNMb2NrZWQgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnRva2Vuc0xvY2tlZCkNCiAgICAgICAgICAgICAgICAgIC5taW51cyhxdHlUb2tlbnNUb1NlbmQpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZChISVZFX1BFR0dFRF9TWU1CT0xfUFJFU0lDSU9OKTsNCiAgICAgICAgICAgICAgICBjb25zdCBuYlRva2Vuc1RvRmlsbE9yZGVyID0gYXBpLkJpZ051bWJlcihidXlPcmRlci5wcmljZSkNCiAgICAgICAgICAgICAgICAgIC5tdWx0aXBsaWVkQnkocXR5TGVmdEJ1eU9yZGVyKQ0KICAgICAgICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQoNCiAgICAgICAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihxdHlMZWZ0QnV5T3JkZXIpLmd0KDApDQogICAgICAgICAgICAgICAgICAmJiAoYXBpLkJpZ051bWJlcihuYlRva2Vuc1RvRmlsbE9yZGVyKS5ndGUoJzAuMDAwMDAwMDEnKSkpIHsNCiAgICAgICAgICAgICAgICAgIGJ1eU9yZGVyLnF1YW50aXR5ID0gcXR5TGVmdEJ1eU9yZGVyOw0KICAgICAgICAgICAgICAgICAgYnV5T3JkZXIudG9rZW5zTG9ja2VkID0gYnV5T3JkZXJ0b2tlbnNMb2NrZWQ7DQoNCiAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2J1eUJvb2snLCBidXlPcmRlcik7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKGJ1eU9yZGVydG9rZW5zTG9ja2VkKS5ndCgwKSkgew0KICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnMoYnV5T3JkZXIuYWNjb3VudCwgSElWRV9QRUdHRURfU1lNQk9MLCBidXlPcmRlcnRva2Vuc0xvY2tlZCwgJ3VzZXInKTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoJ2J1eUJvb2snLCBidXlPcmRlcik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gYWRkIHRoZSB0cmFkZSB0byB0aGUgaGlzdG9yeQ0KICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVRyYWRlc0hpc3RvcnkoJ3NlbGwnLCBidXlPcmRlci5hY2NvdW50LCBhcGkuc2VuZGVyLCBzeW1ib2wsIHRva2Vuc1JlbWFpbmluZywgYnV5T3JkZXIucHJpY2UsIHF0eVRva2Vuc1RvU2VuZCk7DQoNCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHZvbHVtZQ0KICAgICAgICAgICAgICAgIHZvbHVtZVRyYWRlZCA9IGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5wbHVzKHF0eVRva2Vuc1RvU2VuZCk7DQoNCiAgICAgICAgICAgICAgICB0b2tlbnNSZW1haW5pbmcgPSAwOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBsZXQgcXR5VG9rZW5zVG9TZW5kID0gYXBpLkJpZ051bWJlcihidXlPcmRlci5wcmljZSkNCiAgICAgICAgICAgICAgICAubXVsdGlwbGllZEJ5KGJ1eU9yZGVyLnF1YW50aXR5KQ0KICAgICAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04pOw0KDQogICAgICAgICAgICAgIGlmIChxdHlUb2tlbnNUb1NlbmQgPiBidXlPcmRlci50b2tlbnNMb2NrZWQpIHsNCiAgICAgICAgICAgICAgICBxdHlUb2tlbnNUb1NlbmQgPSBhcGkuQmlnTnVtYmVyKGJ1eU9yZGVyLnByaWNlKQ0KICAgICAgICAgICAgICAgICAgLm11bHRpcGxpZWRCeShidXlPcmRlci5xdWFudGl0eSkNCiAgICAgICAgICAgICAgICAgIC50b0ZpeGVkKEhJVkVfUEVHR0VEX1NZTUJPTF9QUkVTSUNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7DQogICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF0eVRva2Vuc1RvU2VuZCkuZ3QoMCkNCiAgICAgICAgICAgICAgICAmJiBhcGkuQmlnTnVtYmVyKHRva2Vuc1JlbWFpbmluZykuZ3QoMCksICd0aGUgb3JkZXIgY2Fubm90IGJlIGZpbGxlZCcpKSB7DQogICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgYnV5ZXINCiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGJ1eU9yZGVyLmFjY291bnQsIHN5bWJvbCwgYnV5T3JkZXIucXVhbnRpdHksICd1c2VyJyk7DQoNCiAgICAgICAgICAgICAgICBpZiAocmVzLmVycm9ycykgew0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKHJlcy5lcnJvcnMpOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKGBUWElEOiAke2FwaS50cmFuc2FjdGlvbklkfWApOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKGJ1eU9yZGVyLmFjY291bnQpOw0KICAgICAgICAgICAgICAgICAgYXBpLmRlYnVnKHN5bWJvbCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYnV5T3JkZXIucXVhbnRpdHkpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0b2tlbnMgdG8gdGhlIHNlbGxlcg0KICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhhcGkuc2VuZGVyLCBISVZFX1BFR0dFRF9TWU1CT0wsIHF0eVRva2Vuc1RvU2VuZCwgJ3VzZXInKTsNCg0KICAgICAgICAgICAgICAgIGlmIChyZXMuZXJyb3JzKSB7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcocmVzLmVycm9ycyk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYFRYSUQ6ICR7YXBpLnRyYW5zYWN0aW9uSWR9YCk7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoYXBpLnNlbmRlcik7DQogICAgICAgICAgICAgICAgICBhcGkuZGVidWcoSElWRV9QRUdHRURfU1lNQk9MKTsNCiAgICAgICAgICAgICAgICAgIGFwaS5kZWJ1ZyhxdHlUb2tlbnNUb1NlbmQpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGNvbnN0IGJ1eU9yZGVydG9rZW5zTG9ja2VkID0gYXBpLkJpZ051bWJlcihidXlPcmRlci50b2tlbnNMb2NrZWQpDQogICAgICAgICAgICAgICAgICAubWludXMocXR5VG9rZW5zVG9TZW5kKQ0KICAgICAgICAgICAgICAgICAgLnRvRml4ZWQoSElWRV9QRUdHRURfU1lNQk9MX1BSRVNJQ0lPTik7DQoNCiAgICAgICAgICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihidXlPcmRlcnRva2Vuc0xvY2tlZCkuZ3QoMCkpIHsNCiAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhidXlPcmRlci5hY2NvdW50LCBISVZFX1BFR0dFRF9TWU1CT0wsIGJ1eU9yZGVydG9rZW5zTG9ja2VkLCAndXNlcicpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgYnV5IG9yZGVyDQogICAgICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnYnV5Qm9vaycsIGJ1eU9yZGVyKTsNCg0KICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcXVhbnRpdHkgdG8gZ2V0DQogICAgICAgICAgICAgICAgdG9rZW5zUmVtYWluaW5nID0gYXBpLkJpZ051bWJlcih0b2tlbnNSZW1haW5pbmcpDQogICAgICAgICAgICAgICAgICAubWludXMoYnV5T3JkZXIucXVhbnRpdHkpDQogICAgICAgICAgICAgICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOw0KDQogICAgICAgICAgICAgICAgLy8gYWRkIHRoZSB0cmFkZSB0byB0aGUgaGlzdG9yeQ0KICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVRyYWRlc0hpc3RvcnkoJ3NlbGwnLCBidXlPcmRlci5hY2NvdW50LCBhcGkuc2VuZGVyLCBzeW1ib2wsIGJ1eU9yZGVyLnF1YW50aXR5LCBidXlPcmRlci5wcmljZSwgcXR5VG9rZW5zVG9TZW5kKTsNCg0KICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdm9sdW1lDQogICAgICAgICAgICAgICAgdm9sdW1lVHJhZGVkID0gYXBpLkJpZ051bWJlcih2b2x1bWVUcmFkZWQpLnBsdXMocXR5VG9rZW5zVG9TZW5kKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpbmMgKz0gMTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICBvZmZzZXQgKz0gMTAwMDsNCg0KICAgICAgICAgIGlmIChhcGkuQmlnTnVtYmVyKHRva2Vuc1JlbWFpbmluZykuZ3QoMCkpIHsNCiAgICAgICAgICAgIC8vIGdldCB0aGUgb3JkZXJzIHRoYXQgbWF0Y2ggdGhlIHN5bWJvbCBhbmQgdGhlIHByaWNlDQogICAgICAgICAgICBidXlPcmRlckJvb2sgPSBhd2FpdCBhcGkuZGIuZmluZCgnYnV5Qm9vaycsIHsNCiAgICAgICAgICAgICAgc3ltYm9sLA0KICAgICAgICAgICAgfSwgMTAwMCwgb2Zmc2V0LA0KICAgICAgICAgICAgWw0KICAgICAgICAgICAgICB7IGluZGV4OiAncHJpY2VEZWMnLCBkZXNjZW5kaW5nOiB0cnVlIH0sDQogICAgICAgICAgICAgIHsgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LA0KICAgICAgICAgICAgXSk7DQogICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlIChidXlPcmRlckJvb2subGVuZ3RoID4gMCAmJiBhcGkuQmlnTnVtYmVyKHRva2Vuc1JlbWFpbmluZykuZ3QoMCkpOw0KDQogICAgICAgIC8vIHNlbmQgYmFjayB0aGUgcmVtYWluaW5nIHRva2Vucw0KICAgICAgICBpZiAoYXBpLkJpZ051bWJlcih0b2tlbnNSZW1haW5pbmcpLmd0KDApKSB7DQogICAgICAgICAgYXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFwaS5zZW5kZXIsIHN5bWJvbCwgdG9rZW5zUmVtYWluaW5nLCAndXNlcicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIodm9sdW1lVHJhZGVkKS5ndCgwKSkgew0KICAgICAgICAgIGF3YWl0IHVwZGF0ZVZvbHVtZU1ldHJpYyhzeW1ib2wsIHZvbHVtZVRyYWRlZCk7DQogICAgICAgIH0NCiAgICAgICAgYXdhaXQgdXBkYXRlQXNrTWV0cmljKHN5bWJvbCk7DQogICAgICAgIGF3YWl0IHVwZGF0ZUJpZE1ldHJpYyhzeW1ib2wpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfTsNCg=="}}}

Market Smart Contract | Ecency