diff --git a/муром_1.2.0.html b/муром_1.2.0.html
index 91d8e1e..d85331c 100644
--- a/муром_1.2.0.html
+++ b/муром_1.2.0.html
@@ -12,7 +12,7 @@ var murom = муром;
[
"муром.загрузка_1.0.0",
-"bXVyb20uaW5zdGFsbExvY2FsRm9yYWdlID0gZnVuY3Rpb24oKQp7Ci8qCiAgICBsb2NhbEZvcmFnZSAtLSBPZmZsaW5lIFN0b3JhZ2UsIEltcHJvdmVkCiAgICBWZXJzaW9uIDEuNy4zCiAgICBodHRwczovL2xvY2FsZm9yYWdlLmdpdGh1Yi5pby9sb2NhbEZvcmFnZQogICAgKGMpIDIwMTMtMjAxNyBNb3ppbGxhLCBBcGFjaGUgTGljZW5zZSAyLjAKKi8KIWZ1bmN0aW9uKGEpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9YSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYSk7ZWxzZXt2YXIgYjtiPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxiLmxvY2FsZm9yYWdlPWEoKX19KGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIGEoYixjLGQpe2Z1bmN0aW9uIGUoZyxoKXtpZighY1tnXSl7aWYoIWJbZ10pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFoJiZpKXJldHVybiBpKGcsITApO2lmKGYpcmV0dXJuIGYoZywhMCk7dmFyIGo9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZysiJyIpO3Rocm93IGouY29kZT0iTU9EVUxFX05PVF9GT1VORCIsan12YXIgaz1jW2ddPXtleHBvcnRzOnt9fTtiW2ddWzBdLmNhbGwoay5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbZ11bMV1bYV07cmV0dXJuIGUoY3x8YSl9LGssay5leHBvcnRzLGEsYixjLGQpfXJldHVybiBjW2ddLmV4cG9ydHN9Zm9yKHZhciBmPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGc9MDtnPGQubGVuZ3RoO2crKyllKGRbZ10pO3JldHVybiBlfSh7MTpbZnVuY3Rpb24oYSxiLGMpeyhmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYygpe2s9ITA7Zm9yKHZhciBhLGIsYz1sLmxlbmd0aDtjOyl7Zm9yKGI9bCxsPVtdLGE9LTE7KythPGM7KWJbYV0oKTtjPWwubGVuZ3RofWs9ITF9ZnVuY3Rpb24gZChhKXsxIT09bC5wdXNoKGEpfHxrfHxlKCl9dmFyIGUsZj1hLk11dGF0aW9uT2JzZXJ2ZXJ8fGEuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtpZihmKXt2YXIgZz0wLGg9bmV3IGYoYyksaT1hLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtoLm9ic2VydmUoaSx7Y2hhcmFjdGVyRGF0YTohMH0pLGU9ZnVuY3Rpb24oKXtpLmRhdGE9Zz0rK2clMn19ZWxzZSBpZihhLnNldEltbWVkaWF0ZXx8dm9pZCAwPT09YS5NZXNzYWdlQ2hhbm5lbCllPSJkb2N1bWVudCJpbiBhJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/ZnVuY3Rpb24oKXt2YXIgYj1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Iub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7YygpLGIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH0sYS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYil9OmZ1bmN0aW9uKCl7c2V0VGltZW91dChjLDApfTtlbHNle3ZhciBqPW5ldyBhLk1lc3NhZ2VDaGFubmVsO2oucG9ydDEub25tZXNzYWdlPWMsZT1mdW5jdGlvbigpe2oucG9ydDIucG9zdE1lc3NhZ2UoMCl9fXZhciBrLGw9W107Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHt9XSwyOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoKXt9ZnVuY3Rpb24gZShhKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZXNvbHZlciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt0aGlzLnN0YXRlPXMsdGhpcy5xdWV1ZT1bXSx0aGlzLm91dGNvbWU9dm9pZCAwLGEhPT1kJiZpKHRoaXMsYSl9ZnVuY3Rpb24gZihhLGIsYyl7dGhpcy5wcm9taXNlPWEsImZ1bmN0aW9uIj09dHlwZW9mIGImJih0aGlzLm9uRnVsZmlsbGVkPWIsdGhpcy5jYWxsRnVsZmlsbGVkPXRoaXMub3RoZXJDYWxsRnVsZmlsbGVkKSwiZnVuY3Rpb24iPT10eXBlb2YgYyYmKHRoaXMub25SZWplY3RlZD1jLHRoaXMuY2FsbFJlamVjdGVkPXRoaXMub3RoZXJDYWxsUmVqZWN0ZWQpfWZ1bmN0aW9uIGcoYSxiLGMpe28oZnVuY3Rpb24oKXt2YXIgZDt0cnl7ZD1iKGMpfWNhdGNoKGIpe3JldHVybiBwLnJlamVjdChhLGIpfWQ9PT1hP3AucmVqZWN0KGEsbmV3IFR5cGVFcnJvcigiQ2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZiIpKTpwLnJlc29sdmUoYSxkKX0pfWZ1bmN0aW9uIGgoYSl7dmFyIGI9YSYmYS50aGVuO2lmKGEmJigib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhKSYmImZ1bmN0aW9uIj09dHlwZW9mIGIpcmV0dXJuIGZ1bmN0aW9uKCl7Yi5hcHBseShhLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGkoYSxiKXtmdW5jdGlvbiBjKGIpe2Z8fChmPSEwLHAucmVqZWN0KGEsYikpfWZ1bmN0aW9uIGQoYil7Znx8KGY9ITAscC5yZXNvbHZlKGEsYikpfWZ1bmN0aW9uIGUoKXtiKGQsYyl9dmFyIGY9ITEsZz1qKGUpOyJlcnJvciI9PT1nLnN0YXR1cyYmYyhnLnZhbHVlKX1mdW5jdGlvbiBqKGEsYil7dmFyIGM9e307dHJ5e2MudmFsdWU9YShiKSxjLnN0YXR1cz0ic3VjY2VzcyJ9Y2F0Y2goYSl7Yy5zdGF0dXM9ImVycm9yIixjLnZhbHVlPWF9cmV0dXJuIGN9ZnVuY3Rpb24gayhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXM/YTpwLnJlc29sdmUobmV3IHRoaXMoZCksYSl9ZnVuY3Rpb24gbChhKXt2YXIgYj1uZXcgdGhpcyhkKTtyZXR1cm4gcC5yZWplY3QoYixhKX1mdW5jdGlvbiBtKGEpe2Z1bmN0aW9uIGIoYSxiKXtmdW5jdGlvbiBkKGEpe2dbYl09YSwrK2ghPT1lfHxmfHwoZj0hMCxwLnJlc29sdmUoaixnKSl9Yy5yZXNvbHZlKGEpLnRoZW4oZCxmdW5jdGlvbihhKXtmfHwoZj0hMCxwLnJlamVjdChqLGEpKX0pfXZhciBjPXRoaXM7aWYoIltvYmplY3QgQXJyYXldIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSlyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgZT1hLmxlbmd0aCxmPSExO2lmKCFlKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgZz1uZXcgQXJyYXkoZSksaD0wLGk9LTEsaj1uZXcgdGhpcyhkKTsrK2k8ZTspYihhW2ldLGkpO3JldHVybiBqfWZ1bmN0aW9uIG4oYSl7ZnVuY3Rpb24gYihhKXtjLnJlc29sdmUoYSkudGhlbihmdW5jdGlvbihhKXtmfHwoZj0hMCxwLnJlc29sdmUoaCxhKSl9LGZ1bmN0aW9uKGEpe2Z8fChmPSEwLHAucmVqZWN0KGgsYSkpfSl9dmFyIGM9dGhpcztpZigiW29iamVjdCBBcnJheV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKCJtdXN0IGJlIGFuIGFycmF5IikpO3ZhciBlPWEubGVuZ3RoLGY9ITE7aWYoIWUpcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7Zm9yKHZhciBnPS0xLGg9bmV3IHRoaXMoZCk7KytnPGU7KWIoYVtnXSk7cmV0dXJuIGh9dmFyIG89YSgxKSxwPXt9LHE9WyJSRUpFQ1RFRCJdLHI9WyJGVUxGSUxMRUQiXSxzPVsiUEVORElORyJdO2IuZXhwb3J0cz1lLGUucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRoZW4obnVsbCxhKX0sZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihhLGIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhJiZ0aGlzLnN0YXRlPT09cnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGImJnRoaXMuc3RhdGU9PT1xKXJldHVybiB0aGlzO3ZhciBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGQpO2lmKHRoaXMuc3RhdGUhPT1zKXtnKGMsdGhpcy5zdGF0ZT09PXI/YTpiLHRoaXMub3V0Y29tZSl9ZWxzZSB0aGlzLnF1ZXVlLnB1c2gobmV3IGYoYyxhLGIpKTtyZXR1cm4gY30sZi5wcm90b3R5cGUuY2FsbEZ1bGZpbGxlZD1mdW5jdGlvbihhKXtwLnJlc29sdmUodGhpcy5wcm9taXNlLGEpfSxmLnByb3RvdHlwZS5vdGhlckNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oYSl7Zyh0aGlzLnByb21pc2UsdGhpcy5vbkZ1bGZpbGxlZCxhKX0sZi5wcm90b3R5cGUuY2FsbFJlamVjdGVkPWZ1bmN0aW9uKGEpe3AucmVqZWN0KHRoaXMucHJvbWlzZSxhKX0sZi5wcm90b3R5cGUub3RoZXJDYWxsUmVqZWN0ZWQ9ZnVuY3Rpb24oYSl7Zyh0aGlzLnByb21pc2UsdGhpcy5vblJlamVjdGVkLGEpfSxwLnJlc29sdmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1qKGgsYik7aWYoImVycm9yIj09PWMuc3RhdHVzKXJldHVybiBwLnJlamVjdChhLGMudmFsdWUpO3ZhciBkPWMudmFsdWU7aWYoZClpKGEsZCk7ZWxzZXthLnN0YXRlPXIsYS5vdXRjb21lPWI7Zm9yKHZhciBlPS0xLGY9YS5xdWV1ZS5sZW5ndGg7KytlPGY7KWEucXVldWVbZV0uY2FsbEZ1bGZpbGxlZChiKX1yZXR1cm4gYX0scC5yZWplY3Q9ZnVuY3Rpb24oYSxiKXthLnN0YXRlPXEsYS5vdXRjb21lPWI7Zm9yKHZhciBjPS0xLGQ9YS5xdWV1ZS5sZW5ndGg7KytjPGQ7KWEucXVldWVbY10uY2FsbFJlamVjdGVkKGIpO3JldHVybiBhfSxlLnJlc29sdmU9ayxlLnJlamVjdD1sLGUuYWxsPW0sZS5yYWNlPW59LHsxOjF9XSwzOltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjsiZnVuY3Rpb24iIT10eXBlb2YgYi5Qcm9taXNlJiYoYi5Qcm9taXNlPWEoMikpfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7MjoyfV0sNDpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gZSgpe3RyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGluZGV4ZWREQilyZXR1cm4gaW5kZXhlZERCO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2Via2l0SW5kZXhlZERCKXJldHVybiB3ZWJraXRJbmRleGVkREI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBtb3pJbmRleGVkREIpcmV0dXJuIG1vekluZGV4ZWREQjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIE9JbmRleGVkREIpcmV0dXJuIE9JbmRleGVkREI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBtc0luZGV4ZWREQilyZXR1cm4gbXNJbmRleGVkREJ9Y2F0Y2goYSl7cmV0dXJufX1mdW5jdGlvbiBmKCl7dHJ5e2lmKCF1YSlyZXR1cm4hMTt2YXIgYT0idW5kZWZpbmVkIiE9dHlwZW9mIG9wZW5EYXRhYmFzZSYmLyhTYWZhcml8aVBob25lfGlQYWR8aVBvZCkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhL0JsYWNrQmVycnkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSxiPSJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmLTEhPT1mZXRjaC50b1N0cmluZygpLmluZGV4T2YoIltuYXRpdmUgY29kZSIpO3JldHVybighYXx8YikmJiJ1bmRlZmluZWQiIT10eXBlb2YgaW5kZXhlZERCJiYidW5kZWZpbmVkIiE9dHlwZW9mIElEQktleVJhbmdlfWNhdGNoKGEpe3JldHVybiExfX1mdW5jdGlvbiBnKGEsYil7YT1hfHxbXSxiPWJ8fHt9O3RyeXtyZXR1cm4gbmV3IEJsb2IoYSxiKX1jYXRjaChmKXtpZigiVHlwZUVycm9yIiE9PWYubmFtZSl0aHJvdyBmO2Zvcih2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIEJsb2JCdWlsZGVyP0Jsb2JCdWlsZGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgTVNCbG9iQnVpbGRlcj9NU0Jsb2JCdWlsZGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgTW96QmxvYkJ1aWxkZXI/TW96QmxvYkJ1aWxkZXI6V2ViS2l0QmxvYkJ1aWxkZXIsZD1uZXcgYyxlPTA7ZTxhLmxlbmd0aDtlKz0xKWQuYXBwZW5kKGFbZV0pO3JldHVybiBkLmdldEJsb2IoYi50eXBlKX19ZnVuY3Rpb24gaChhLGIpe2ImJmEudGhlbihmdW5jdGlvbihhKXtiKG51bGwsYSl9LGZ1bmN0aW9uKGEpe2IoYSl9KX1mdW5jdGlvbiBpKGEsYixjKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmYS50aGVuKGIpLCJmdW5jdGlvbiI9PXR5cGVvZiBjJiZhLmNhdGNoKGMpfWZ1bmN0aW9uIGooYSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoY29uc29sZS53YXJuKGErIiB1c2VkIGFzIGEga2V5LCBidXQgaXQgaXMgbm90IGEgc3RyaW5nLiIpLGE9U3RyaW5nKGEpKSxhfWZ1bmN0aW9uIGsoKXtpZihhcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0pcmV0dXJuIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdfWZ1bmN0aW9uIGwoYSl7Zm9yKHZhciBiPWEubGVuZ3RoLGM9bmV3IEFycmF5QnVmZmVyKGIpLGQ9bmV3IFVpbnQ4QXJyYXkoYyksZT0wO2U8YjtlKyspZFtlXT1hLmNoYXJDb2RlQXQoZSk7cmV0dXJuIGN9ZnVuY3Rpb24gbShhKXtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGIpe3ZhciBjPWEudHJhbnNhY3Rpb24od2EsQmEpLGQ9ZyhbIiJdKTtjLm9iamVjdFN0b3JlKHdhKS5wdXQoZCwia2V5IiksYy5vbmFib3J0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpLGIoITEpfSxjLm9uY29tcGxldGU9ZnVuY3Rpb24oKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhcZCspLyksYz1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXC8vKTtiKGN8fCFhfHxwYXJzZUludChhWzFdLDEwKT49NDMpfX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuITF9KX1mdW5jdGlvbiBuKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHhhP3ZhLnJlc29sdmUoeGEpOm0oYSkudGhlbihmdW5jdGlvbihhKXtyZXR1cm4geGE9YX0pfWZ1bmN0aW9uIG8oYSl7dmFyIGI9eWFbYS5uYW1lXSxjPXt9O2MucHJvbWlzZT1uZXcgdmEoZnVuY3Rpb24oYSxiKXtjLnJlc29sdmU9YSxjLnJlamVjdD1ifSksYi5kZWZlcnJlZE9wZXJhdGlvbnMucHVzaChjKSxiLmRiUmVhZHk/Yi5kYlJlYWR5PWIuZGJSZWFkeS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGMucHJvbWlzZX0pOmIuZGJSZWFkeT1jLnByb21pc2V9ZnVuY3Rpb24gcChhKXt2YXIgYj15YVthLm5hbWVdLGM9Yi5kZWZlcnJlZE9wZXJhdGlvbnMucG9wKCk7aWYoYylyZXR1cm4gYy5yZXNvbHZlKCksYy5wcm9taXNlfWZ1bmN0aW9uIHEoYSxiKXt2YXIgYz15YVthLm5hbWVdLGQ9Yy5kZWZlcnJlZE9wZXJhdGlvbnMucG9wKCk7aWYoZClyZXR1cm4gZC5yZWplY3QoYiksZC5wcm9taXNlfWZ1bmN0aW9uIHIoYSxiKXtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGMsZCl7aWYoeWFbYS5uYW1lXT15YVthLm5hbWVdfHxCKCksYS5kYil7aWYoIWIpcmV0dXJuIGMoYS5kYik7byhhKSxhLmRiLmNsb3NlKCl9dmFyIGU9W2EubmFtZV07YiYmZS5wdXNoKGEudmVyc2lvbik7dmFyIGY9dWEub3Blbi5hcHBseSh1YSxlKTtiJiYoZi5vbnVwZ3JhZGVuZWVkZWQ9ZnVuY3Rpb24oYil7dmFyIGM9Zi5yZXN1bHQ7dHJ5e2MuY3JlYXRlT2JqZWN0U3RvcmUoYS5zdG9yZU5hbWUpLGIub2xkVmVyc2lvbjw9MSYmYy5jcmVhdGVPYmplY3RTdG9yZSh3YSl9Y2F0Y2goYyl7aWYoIkNvbnN0cmFpbnRFcnJvciIhPT1jLm5hbWUpdGhyb3cgYztjb25zb2xlLndhcm4oJ1RoZSBkYXRhYmFzZSAiJythLm5hbWUrJyIgaGFzIGJlZW4gdXBncmFkZWQgZnJvbSB2ZXJzaW9uICcrYi5vbGRWZXJzaW9uKyIgdG8gdmVyc2lvbiAiK2IubmV3VmVyc2lvbisnLCBidXQgdGhlIHN0b3JhZ2UgIicrYS5zdG9yZU5hbWUrJyIgYWxyZWFkeSBleGlzdHMuJyl9fSksZi5vbmVycm9yPWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKSxkKGYuZXJyb3IpfSxmLm9uc3VjY2Vzcz1mdW5jdGlvbigpe2MoZi5yZXN1bHQpLHAoYSl9fSl9ZnVuY3Rpb24gcyhhKXtyZXR1cm4gcihhLCExKX1mdW5jdGlvbiB0KGEpe3JldHVybiByKGEsITApfWZ1bmN0aW9uIHUoYSxiKXtpZighYS5kYilyZXR1cm4hMDt2YXIgYz0hYS5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGEuc3RvcmVOYW1lKSxkPWEudmVyc2lvbjxhLmRiLnZlcnNpb24sZT1hLnZlcnNpb24+YS5kYi52ZXJzaW9uO2lmKGQmJihhLnZlcnNpb24hPT1iJiZjb25zb2xlLndhcm4oJ1RoZSBkYXRhYmFzZSAiJythLm5hbWUrIlwiIGNhbid0IGJlIGRvd25ncmFkZWQgZnJvbSB2ZXJzaW9uICIrYS5kYi52ZXJzaW9uKyIgdG8gdmVyc2lvbiAiK2EudmVyc2lvbisiLiIpLGEudmVyc2lvbj1hLmRiLnZlcnNpb24pLGV8fGMpe2lmKGMpe3ZhciBmPWEuZGIudmVyc2lvbisxO2Y+YS52ZXJzaW9uJiYoYS52ZXJzaW9uPWYpfXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHYoYSl7cmV0dXJuIG5ldyB2YShmdW5jdGlvbihiLGMpe3ZhciBkPW5ldyBGaWxlUmVhZGVyO2Qub25lcnJvcj1jLGQub25sb2FkZW5kPWZ1bmN0aW9uKGMpe3ZhciBkPWJ0b2EoYy50YXJnZXQucmVzdWx0fHwiIik7Yih7X19sb2NhbF9mb3JhZ2VfZW5jb2RlZF9ibG9iOiEwLGRhdGE6ZCx0eXBlOmEudHlwZX0pfSxkLnJlYWRBc0JpbmFyeVN0cmluZyhhKX0pfWZ1bmN0aW9uIHcoYSl7cmV0dXJuIGcoW2woYXRvYihhLmRhdGEpKV0se3R5cGU6YS50eXBlfSl9ZnVuY3Rpb24geChhKXtyZXR1cm4gYSYmYS5fX2xvY2FsX2ZvcmFnZV9lbmNvZGVkX2Jsb2J9ZnVuY3Rpb24geShhKXt2YXIgYj10aGlzLGM9Yi5faW5pdFJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZhciBhPXlhW2IuX2RiSW5mby5uYW1lXTtpZihhJiZhLmRiUmVhZHkpcmV0dXJuIGEuZGJSZWFkeX0pO3JldHVybiBpKGMsYSxhKSxjfWZ1bmN0aW9uIHooYSl7byhhKTtmb3IodmFyIGI9eWFbYS5uYW1lXSxjPWIuZm9yYWdlcyxkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07ZS5fZGJJbmZvLmRiJiYoZS5fZGJJbmZvLmRiLmNsb3NlKCksZS5fZGJJbmZvLmRiPW51bGwpfXJldHVybiBhLmRiPW51bGwscyhhKS50aGVuKGZ1bmN0aW9uKGIpe3JldHVybiBhLmRiPWIsdShhKT90KGEpOmJ9KS50aGVuKGZ1bmN0aW9uKGQpe2EuZGI9Yi5kYj1kO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWNbZV0uX2RiSW5mby5kYj1kfSkuY2F0Y2goZnVuY3Rpb24oYil7dGhyb3cgcShhLGIpLGJ9KX1mdW5jdGlvbiBBKGEsYixjLGQpe3ZvaWQgMD09PWQmJihkPTEpO3RyeXt2YXIgZT1hLmRiLnRyYW5zYWN0aW9uKGEuc3RvcmVOYW1lLGIpO2MobnVsbCxlKX1jYXRjaChlKXtpZihkPjAmJighYS5kYnx8IkludmFsaWRTdGF0ZUVycm9yIj09PWUubmFtZXx8Ik5vdEZvdW5kRXJyb3IiPT09ZS5uYW1lKSlyZXR1cm4gdmEucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtpZighYS5kYnx8Ik5vdEZvdW5kRXJyb3IiPT09ZS5uYW1lJiYhYS5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGEuc3RvcmVOYW1lKSYmYS52ZXJzaW9uPD1hLmRiLnZlcnNpb24pcmV0dXJuIGEuZGImJihhLnZlcnNpb249YS5kYi52ZXJzaW9uKzEpLHQoYSl9KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHooYSkudGhlbihmdW5jdGlvbigpe0EoYSxiLGMsZC0xKX0pfSkuY2F0Y2goYyk7YyhlKX19ZnVuY3Rpb24gQigpe3JldHVybntmb3JhZ2VzOltdLGRiOm51bGwsZGJSZWFkeTpudWxsLGRlZmVycmVkT3BlcmF0aW9uczpbXX19ZnVuY3Rpb24gQyhhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIHZhLnJlc29sdmUoKX12YXIgYz10aGlzLGQ9e2RiOm51bGx9O2lmKGEpZm9yKHZhciBlIGluIGEpZFtlXT1hW2VdO3ZhciBmPXlhW2QubmFtZV07Znx8KGY9QigpLHlhW2QubmFtZV09ZiksZi5mb3JhZ2VzLnB1c2goYyksYy5faW5pdFJlYWR5fHwoYy5faW5pdFJlYWR5PWMucmVhZHksYy5yZWFkeT15KTtmb3IodmFyIGc9W10saD0wO2g8Zi5mb3JhZ2VzLmxlbmd0aDtoKyspe3ZhciBpPWYuZm9yYWdlc1toXTtpIT09YyYmZy5wdXNoKGkuX2luaXRSZWFkeSgpLmNhdGNoKGIpKX12YXIgaj1mLmZvcmFnZXMuc2xpY2UoMCk7cmV0dXJuIHZhLmFsbChnKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGQuZGI9Zi5kYixzKGQpfSkudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gZC5kYj1hLHUoZCxjLl9kZWZhdWx0Q29uZmlnLnZlcnNpb24pP3QoZCk6YX0pLnRoZW4oZnVuY3Rpb24oYSl7ZC5kYj1mLmRiPWEsYy5fZGJJbmZvPWQ7Zm9yKHZhciBiPTA7YjxqLmxlbmd0aDtiKyspe3ZhciBlPWpbYl07ZSE9PWMmJihlLl9kYkluZm8uZGI9ZC5kYixlLl9kYkluZm8udmVyc2lvbj1kLnZlcnNpb24pfX0pfWZ1bmN0aW9uIEQoYSxiKXt2YXIgYz10aGlzO2E9aihhKTt2YXIgZD1uZXcgdmEoZnVuY3Rpb24oYixkKXtjLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe0EoYy5fZGJJbmZvLEFhLGZ1bmN0aW9uKGUsZil7aWYoZSlyZXR1cm4gZChlKTt0cnl7dmFyIGc9Zi5vYmplY3RTdG9yZShjLl9kYkluZm8uc3RvcmVOYW1lKSxoPWcuZ2V0KGEpO2gub25zdWNjZXNzPWZ1bmN0aW9uKCl7dmFyIGE9aC5yZXN1bHQ7dm9pZCAwPT09YSYmKGE9bnVsbCkseChhKSYmKGE9dyhhKSksYihhKX0saC5vbmVycm9yPWZ1bmN0aW9uKCl7ZChoLmVycm9yKX19Y2F0Y2goYSl7ZChhKX19KX0pLmNhdGNoKGQpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIEUoYSxiKXt2YXIgYz10aGlzLGQ9bmV3IHZhKGZ1bmN0aW9uKGIsZCl7Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXtBKGMuX2RiSW5mbyxBYSxmdW5jdGlvbihlLGYpe2lmKGUpcmV0dXJuIGQoZSk7dHJ5e3ZhciBnPWYub2JqZWN0U3RvcmUoYy5fZGJJbmZvLnN0b3JlTmFtZSksaD1nLm9wZW5DdXJzb3IoKSxpPTE7aC5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYz1oLnJlc3VsdDtpZihjKXt2YXIgZD1jLnZhbHVlO3goZCkmJihkPXcoZCkpO3ZhciBlPWEoZCxjLmtleSxpKyspO3ZvaWQgMCE9PWU/YihlKTpjLmNvbnRpbnVlKCl9ZWxzZSBiKCl9LGgub25lcnJvcj1mdW5jdGlvbigpe2QoaC5lcnJvcil9fWNhdGNoKGEpe2QoYSl9fSl9KS5jYXRjaChkKX0pO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBGKGEsYixjKXt2YXIgZD10aGlzO2E9aihhKTt2YXIgZT1uZXcgdmEoZnVuY3Rpb24oYyxlKXt2YXIgZjtkLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3JldHVybiBmPWQuX2RiSW5mbywiW29iamVjdCBCbG9iXSI9PT16YS5jYWxsKGIpP24oZi5kYikudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gYT9iOnYoYil9KTpifSkudGhlbihmdW5jdGlvbihiKXtBKGQuX2RiSW5mbyxCYSxmdW5jdGlvbihmLGcpe2lmKGYpcmV0dXJuIGUoZik7dHJ5e3ZhciBoPWcub2JqZWN0U3RvcmUoZC5fZGJJbmZvLnN0b3JlTmFtZSk7bnVsbD09PWImJihiPXZvaWQgMCk7dmFyIGk9aC5wdXQoYixhKTtnLm9uY29tcGxldGU9ZnVuY3Rpb24oKXt2b2lkIDA9PT1iJiYoYj1udWxsKSxjKGIpfSxnLm9uYWJvcnQ9Zy5vbmVycm9yPWZ1bmN0aW9uKCl7dmFyIGE9aS5lcnJvcj9pLmVycm9yOmkudHJhbnNhY3Rpb24uZXJyb3I7ZShhKX19Y2F0Y2goYSl7ZShhKX19KX0pLmNhdGNoKGUpfSk7cmV0dXJuIGgoZSxjKSxlfWZ1bmN0aW9uIEcoYSxiKXt2YXIgYz10aGlzO2E9aihhKTt2YXIgZD1uZXcgdmEoZnVuY3Rpb24oYixkKXtjLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe0EoYy5fZGJJbmZvLEJhLGZ1bmN0aW9uKGUsZil7aWYoZSlyZXR1cm4gZChlKTt0cnl7dmFyIGc9Zi5vYmplY3RTdG9yZShjLl9kYkluZm8uc3RvcmVOYW1lKSxoPWcuZGVsZXRlKGEpO2Yub25jb21wbGV0ZT1mdW5jdGlvbigpe2IoKX0sZi5vbmVycm9yPWZ1bmN0aW9uKCl7ZChoLmVycm9yKX0sZi5vbmFib3J0PWZ1bmN0aW9uKCl7dmFyIGE9aC5lcnJvcj9oLmVycm9yOmgudHJhbnNhY3Rpb24uZXJyb3I7ZChhKX19Y2F0Y2goYSl7ZChhKX19KX0pLmNhdGNoKGQpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIEgoYSl7dmFyIGI9dGhpcyxjPW5ldyB2YShmdW5jdGlvbihhLGMpe2IucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7QShiLl9kYkluZm8sQmEsZnVuY3Rpb24oZCxlKXtpZihkKXJldHVybiBjKGQpO3RyeXt2YXIgZj1lLm9iamVjdFN0b3JlKGIuX2RiSW5mby5zdG9yZU5hbWUpLGc9Zi5jbGVhcigpO2Uub25jb21wbGV0ZT1mdW5jdGlvbigpe2EoKX0sZS5vbmFib3J0PWUub25lcnJvcj1mdW5jdGlvbigpe3ZhciBhPWcuZXJyb3I/Zy5lcnJvcjpnLnRyYW5zYWN0aW9uLmVycm9yO2MoYSl9fWNhdGNoKGEpe2MoYSl9fSl9KS5jYXRjaChjKX0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiBJKGEpe3ZhciBiPXRoaXMsYz1uZXcgdmEoZnVuY3Rpb24oYSxjKXtiLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe0EoYi5fZGJJbmZvLEFhLGZ1bmN0aW9uKGQsZSl7aWYoZClyZXR1cm4gYyhkKTt0cnl7dmFyIGY9ZS5vYmplY3RTdG9yZShiLl9kYkluZm8uc3RvcmVOYW1lKSxnPWYuY291bnQoKTtnLm9uc3VjY2Vzcz1mdW5jdGlvbigpe2EoZy5yZXN1bHQpfSxnLm9uZXJyb3I9ZnVuY3Rpb24oKXtjKGcuZXJyb3IpfX1jYXRjaChhKXtjKGEpfX0pfSkuY2F0Y2goYyl9KTtyZXR1cm4gaChjLGEpLGN9ZnVuY3Rpb24gSihhLGIpe3ZhciBjPXRoaXMsZD1uZXcgdmEoZnVuY3Rpb24oYixkKXtpZihhPDApcmV0dXJuIHZvaWQgYihudWxsKTtjLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe0EoYy5fZGJJbmZvLEFhLGZ1bmN0aW9uKGUsZil7aWYoZSlyZXR1cm4gZChlKTt0cnl7dmFyIGc9Zi5vYmplY3RTdG9yZShjLl9kYkluZm8uc3RvcmVOYW1lKSxoPSExLGk9Zy5vcGVuQ3Vyc29yKCk7aS5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYz1pLnJlc3VsdDtpZighYylyZXR1cm4gdm9pZCBiKG51bGwpOzA9PT1hP2IoYy5rZXkpOmg/YihjLmtleSk6KGg9ITAsYy5hZHZhbmNlKGEpKX0saS5vbmVycm9yPWZ1bmN0aW9uKCl7ZChpLmVycm9yKX19Y2F0Y2goYSl7ZChhKX19KX0pLmNhdGNoKGQpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIEsoYSl7dmFyIGI9dGhpcyxjPW5ldyB2YShmdW5jdGlvbihhLGMpe2IucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7QShiLl9kYkluZm8sQWEsZnVuY3Rpb24oZCxlKXtpZihkKXJldHVybiBjKGQpO3RyeXt2YXIgZj1lLm9iamVjdFN0b3JlKGIuX2RiSW5mby5zdG9yZU5hbWUpLGc9Zi5vcGVuQ3Vyc29yKCksaD1bXTtnLm9uc3VjY2Vzcz1mdW5jdGlvbigpe3ZhciBiPWcucmVzdWx0O2lmKCFiKXJldHVybiB2b2lkIGEoaCk7aC5wdXNoKGIua2V5KSxiLmNvbnRpbnVlKCl9LGcub25lcnJvcj1mdW5jdGlvbigpe2MoZy5lcnJvcil9fWNhdGNoKGEpe2MoYSl9fSl9KS5jYXRjaChjKX0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiBMKGEsYil7Yj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYz10aGlzLmNvbmZpZygpO2E9ImZ1bmN0aW9uIiE9dHlwZW9mIGEmJmF8fHt9LGEubmFtZXx8KGEubmFtZT1hLm5hbWV8fGMubmFtZSxhLnN0b3JlTmFtZT1hLnN0b3JlTmFtZXx8Yy5zdG9yZU5hbWUpO3ZhciBkLGU9dGhpcztpZihhLm5hbWUpe3ZhciBmPWEubmFtZT09PWMubmFtZSYmZS5fZGJJbmZvLmRiLGc9Zj92YS5yZXNvbHZlKGUuX2RiSW5mby5kYik6cyhhKS50aGVuKGZ1bmN0aW9uKGIpe3ZhciBjPXlhW2EubmFtZV0sZD1jLmZvcmFnZXM7Yy5kYj1iO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV0uX2RiSW5mby5kYj1iO3JldHVybiBifSk7ZD1hLnN0b3JlTmFtZT9nLnRoZW4oZnVuY3Rpb24oYil7aWYoYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGEuc3RvcmVOYW1lKSl7dmFyIGM9Yi52ZXJzaW9uKzE7byhhKTt2YXIgZD15YVthLm5hbWVdLGU9ZC5mb3JhZ2VzO2IuY2xvc2UoKTtmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGc9ZVtmXTtnLl9kYkluZm8uZGI9bnVsbCxnLl9kYkluZm8udmVyc2lvbj1jfXJldHVybiBuZXcgdmEoZnVuY3Rpb24oYixkKXt2YXIgZT11YS5vcGVuKGEubmFtZSxjKTtlLm9uZXJyb3I9ZnVuY3Rpb24oYSl7ZS5yZXN1bHQuY2xvc2UoKSxkKGEpfSxlLm9udXBncmFkZW5lZWRlZD1mdW5jdGlvbigpe2UucmVzdWx0LmRlbGV0ZU9iamVjdFN0b3JlKGEuc3RvcmVOYW1lKX0sZS5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3VsdDthLmNsb3NlKCksYihhKX19KS50aGVuKGZ1bmN0aW9uKGEpe2QuZGI9YTtmb3IodmFyIGI9MDtiPGUubGVuZ3RoO2IrKyl7dmFyIGM9ZVtiXTtjLl9kYkluZm8uZGI9YSxwKGMuX2RiSW5mbyl9fSkuY2F0Y2goZnVuY3Rpb24oYil7dGhyb3cocShhLGIpfHx2YS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uKCl7fSksYn0pfX0pOmcudGhlbihmdW5jdGlvbihiKXtvKGEpO3ZhciBjPXlhW2EubmFtZV0sZD1jLmZvcmFnZXM7Yi5jbG9zZSgpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXtkW2VdLl9kYkluZm8uZGI9bnVsbH1yZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9dWEuZGVsZXRlRGF0YWJhc2UoYS5uYW1lKTtkLm9uZXJyb3I9ZC5vbmJsb2NrZWQ9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5yZXN1bHQ7YiYmYi5jbG9zZSgpLGMoYSl9LGQub25zdWNjZXNzPWZ1bmN0aW9uKCl7dmFyIGE9ZC5yZXN1bHQ7YSYmYS5jbG9zZSgpLGIoYSl9fSkudGhlbihmdW5jdGlvbihhKXtjLmRiPWE7Zm9yKHZhciBiPTA7YjxkLmxlbmd0aDtiKyspcChkW2JdLl9kYkluZm8pfSkuY2F0Y2goZnVuY3Rpb24oYil7dGhyb3cocShhLGIpfHx2YS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uKCl7fSksYn0pfSl9ZWxzZSBkPXZhLnJlamVjdCgiSW52YWxpZCBhcmd1bWVudHMiKTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gTSgpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvcGVuRGF0YWJhc2V9ZnVuY3Rpb24gTihhKXt2YXIgYixjLGQsZSxmLGc9Ljc1KmEubGVuZ3RoLGg9YS5sZW5ndGgsaT0wOyI9Ij09PWFbYS5sZW5ndGgtMV0mJihnLS0sIj0iPT09YVthLmxlbmd0aC0yXSYmZy0tKTt2YXIgaj1uZXcgQXJyYXlCdWZmZXIoZyksaz1uZXcgVWludDhBcnJheShqKTtmb3IoYj0wO2I8aDtiKz00KWM9RGEuaW5kZXhPZihhW2JdKSxkPURhLmluZGV4T2YoYVtiKzFdKSxlPURhLmluZGV4T2YoYVtiKzJdKSxmPURhLmluZGV4T2YoYVtiKzNdKSxrW2krK109Yzw8MnxkPj40LGtbaSsrXT0oMTUmZCk8PDR8ZT4+MixrW2krK109KDMmZSk8PDZ8NjMmZjtyZXR1cm4gan1mdW5jdGlvbiBPKGEpe3ZhciBiLGM9bmV3IFVpbnQ4QXJyYXkoYSksZD0iIjtmb3IoYj0wO2I8Yy5sZW5ndGg7Yis9MylkKz1EYVtjW2JdPj4yXSxkKz1EYVsoMyZjW2JdKTw8NHxjW2IrMV0+PjRdLGQrPURhWygxNSZjW2IrMV0pPDwyfGNbYisyXT4+Nl0sZCs9RGFbNjMmY1tiKzJdXTtyZXR1cm4gYy5sZW5ndGglMz09Mj9kPWQuc3Vic3RyaW5nKDAsZC5sZW5ndGgtMSkrIj0iOmMubGVuZ3RoJTM9PTEmJihkPWQuc3Vic3RyaW5nKDAsZC5sZW5ndGgtMikrIj09IiksZH1mdW5jdGlvbiBQKGEsYil7dmFyIGM9IiI7aWYoYSYmKGM9VWEuY2FsbChhKSksYSYmKCJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1jfHxhLmJ1ZmZlciYmIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PVVhLmNhbGwoYS5idWZmZXIpKSl7dmFyIGQsZT1HYTthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/KGQ9YSxlKz1JYSk6KGQ9YS5idWZmZXIsIltvYmplY3QgSW50OEFycmF5XSI9PT1jP2UrPUthOiJbb2JqZWN0IFVpbnQ4QXJyYXldIj09PWM/ZSs9TGE6IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIj09PWM/ZSs9TWE6IltvYmplY3QgSW50MTZBcnJheV0iPT09Yz9lKz1OYToiW29iamVjdCBVaW50MTZBcnJheV0iPT09Yz9lKz1QYToiW29iamVjdCBJbnQzMkFycmF5XSI9PT1jP2UrPU9hOiJbb2JqZWN0IFVpbnQzMkFycmF5XSI9PT1jP2UrPVFhOiJbb2JqZWN0IEZsb2F0MzJBcnJheV0iPT09Yz9lKz1SYToiW29iamVjdCBGbG9hdDY0QXJyYXldIj09PWM/ZSs9U2E6YihuZXcgRXJyb3IoIkZhaWxlZCB0byBnZXQgdHlwZSBmb3IgQmluYXJ5QXJyYXkiKSkpLGIoZStPKGQpKX1lbHNlIGlmKCJbb2JqZWN0IEJsb2JdIj09PWMpe3ZhciBmPW5ldyBGaWxlUmVhZGVyO2Yub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGM9RWErYS50eXBlKyJ+IitPKHRoaXMucmVzdWx0KTtiKEdhK0phK2MpfSxmLnJlYWRBc0FycmF5QnVmZmVyKGEpfWVsc2UgdHJ5e2IoSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGMpe2NvbnNvbGUuZXJyb3IoIkNvdWxkbid0IGNvbnZlcnQgdmFsdWUgaW50byBhIEpTT04gc3RyaW5nOiAiLGEpLGIobnVsbCxjKX19ZnVuY3Rpb24gUShhKXtpZihhLnN1YnN0cmluZygwLEhhKSE9PUdhKXJldHVybiBKU09OLnBhcnNlKGEpO3ZhciBiLGM9YS5zdWJzdHJpbmcoVGEpLGQ9YS5zdWJzdHJpbmcoSGEsVGEpO2lmKGQ9PT1KYSYmRmEudGVzdChjKSl7dmFyIGU9Yy5tYXRjaChGYSk7Yj1lWzFdLGM9Yy5zdWJzdHJpbmcoZVswXS5sZW5ndGgpfXZhciBmPU4oYyk7c3dpdGNoKGQpe2Nhc2UgSWE6cmV0dXJuIGY7Y2FzZSBKYTpyZXR1cm4gZyhbZl0se3R5cGU6Yn0pO2Nhc2UgS2E6cmV0dXJuIG5ldyBJbnQ4QXJyYXkoZik7Y2FzZSBMYTpyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZik7Y2FzZSBNYTpyZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGYpO2Nhc2UgTmE6cmV0dXJuIG5ldyBJbnQxNkFycmF5KGYpO2Nhc2UgUGE6cmV0dXJuIG5ldyBVaW50MTZBcnJheShmKTtjYXNlIE9hOnJldHVybiBuZXcgSW50MzJBcnJheShmKTtjYXNlIFFhOnJldHVybiBuZXcgVWludDMyQXJyYXkoZik7Y2FzZSBSYTpyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShmKTtjYXNlIFNhOnJldHVybiBuZXcgRmxvYXQ2NEFycmF5KGYpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtvd24gdHlwZTogIitkKX19ZnVuY3Rpb24gUihhLGIsYyxkKXthLmV4ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICIrYi5zdG9yZU5hbWUrIiAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwga2V5IHVuaXF1ZSwgdmFsdWUpIixbXSxjLGQpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9dGhpcyxjPXtkYjpudWxsfTtpZihhKWZvcih2YXIgZCBpbiBhKWNbZF09InN0cmluZyIhPXR5cGVvZiBhW2RdP2FbZF0udG9TdHJpbmcoKTphW2RdO3ZhciBlPW5ldyB2YShmdW5jdGlvbihhLGQpe3RyeXtjLmRiPW9wZW5EYXRhYmFzZShjLm5hbWUsU3RyaW5nKGMudmVyc2lvbiksYy5kZXNjcmlwdGlvbixjLnNpemUpfWNhdGNoKGEpe3JldHVybiBkKGEpfWMuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oZSl7UihlLGMsZnVuY3Rpb24oKXtiLl9kYkluZm89YyxhKCl9LGZ1bmN0aW9uKGEsYil7ZChiKX0pfSxkKX0pO3JldHVybiBjLnNlcmlhbGl6ZXI9VmEsZX1mdW5jdGlvbiBUKGEsYixjLGQsZSxmKXthLmV4ZWN1dGVTcWwoYyxkLGUsZnVuY3Rpb24oYSxnKXtnLmNvZGU9PT1nLlNZTlRBWF9FUlI/YS5leGVjdXRlU3FsKCJTRUxFQ1QgbmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hFUkUgdHlwZT0ndGFibGUnIEFORCBuYW1lID0gPyIsW2Iuc3RvcmVOYW1lXSxmdW5jdGlvbihhLGgpe2gucm93cy5sZW5ndGg/ZihhLGcpOlIoYSxiLGZ1bmN0aW9uKCl7YS5leGVjdXRlU3FsKGMsZCxlLGYpfSxmKX0sZik6ZihhLGcpfSxmKX1mdW5jdGlvbiBVKGEsYil7dmFyIGM9dGhpczthPWooYSk7dmFyIGQ9bmV3IHZhKGZ1bmN0aW9uKGIsZCl7Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZT1jLl9kYkluZm87ZS5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihjKXtUKGMsZSwiU0VMRUNUICogRlJPTSAiK2Uuc3RvcmVOYW1lKyIgV0hFUkUga2V5ID0gPyBMSU1JVCAxIixbYV0sZnVuY3Rpb24oYSxjKXt2YXIgZD1jLnJvd3MubGVuZ3RoP2Mucm93cy5pdGVtKDApLnZhbHVlOm51bGw7ZCYmKGQ9ZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGQpKSxiKGQpfSxmdW5jdGlvbihhLGIpe2QoYil9KX0pfSkuY2F0Y2goZCl9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gVihhLGIpe3ZhciBjPXRoaXMsZD1uZXcgdmEoZnVuY3Rpb24oYixkKXtjLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZhciBlPWMuX2RiSW5mbztlLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKGMpe1QoYyxlLCJTRUxFQ1QgKiBGUk9NICIrZS5zdG9yZU5hbWUsW10sZnVuY3Rpb24oYyxkKXtmb3IodmFyIGY9ZC5yb3dzLGc9Zi5sZW5ndGgsaD0wO2g8ZztoKyspe3ZhciBpPWYuaXRlbShoKSxqPWkudmFsdWU7aWYoaiYmKGo9ZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGopKSx2b2lkIDAhPT0oaj1hKGosaS5rZXksaCsxKSkpcmV0dXJuIHZvaWQgYihqKX1iKCl9LGZ1bmN0aW9uKGEsYil7ZChiKX0pfSl9KS5jYXRjaChkKX0pO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBXKGEsYixjLGQpe3ZhciBlPXRoaXM7YT1qKGEpO3ZhciBmPW5ldyB2YShmdW5jdGlvbihmLGcpe2UucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dm9pZCAwPT09YiYmKGI9bnVsbCk7dmFyIGg9YixpPWUuX2RiSW5mbztpLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGIsZnVuY3Rpb24oYixqKXtqP2coaik6aS5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihjKXtUKGMsaSwiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyAiK2kuc3RvcmVOYW1lKyIgKGtleSwgdmFsdWUpIFZBTFVFUyAoPywgPykiLFthLGJdLGZ1bmN0aW9uKCl7ZihoKX0sZnVuY3Rpb24oYSxiKXtnKGIpfSl9LGZ1bmN0aW9uKGIpe2lmKGIuY29kZT09PWIuUVVPVEFfRVJSKXtpZihkPjApcmV0dXJuIHZvaWQgZihXLmFwcGx5KGUsW2EsaCxjLGQtMV0pKTtnKGIpfX0pfSl9KS5jYXRjaChnKX0pO3JldHVybiBoKGYsYyksZn1mdW5jdGlvbiBYKGEsYixjKXtyZXR1cm4gVy5hcHBseSh0aGlzLFthLGIsYywxXSl9ZnVuY3Rpb24gWShhLGIpe3ZhciBjPXRoaXM7YT1qKGEpO3ZhciBkPW5ldyB2YShmdW5jdGlvbihiLGQpe2MucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGU9Yy5fZGJJbmZvO2UuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oYyl7VChjLGUsIkRFTEVURSBGUk9NICIrZS5zdG9yZU5hbWUrIiBXSEVSRSBrZXkgPSA/IixbYV0sZnVuY3Rpb24oKXtiKCl9LGZ1bmN0aW9uKGEsYil7ZChiKX0pfSl9KS5jYXRjaChkKX0pO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBaKGEpe3ZhciBiPXRoaXMsYz1uZXcgdmEoZnVuY3Rpb24oYSxjKXtiLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZhciBkPWIuX2RiSW5mbztkLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKGIpe1QoYixkLCJERUxFVEUgRlJPTSAiK2Quc3RvcmVOYW1lLFtdLGZ1bmN0aW9uKCl7YSgpfSxmdW5jdGlvbihhLGIpe2MoYil9KX0pfSkuY2F0Y2goYyl9KTtyZXR1cm4gaChjLGEpLGN9ZnVuY3Rpb24gJChhKXt2YXIgYj10aGlzLGM9bmV3IHZhKGZ1bmN0aW9uKGEsYyl7Yi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZD1iLl9kYkluZm87ZC5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihiKXtUKGIsZCwiU0VMRUNUIENPVU5UKGtleSkgYXMgYyBGUk9NICIrZC5zdG9yZU5hbWUsW10sZnVuY3Rpb24oYixjKXt2YXIgZD1jLnJvd3MuaXRlbSgwKS5jO2EoZCl9LGZ1bmN0aW9uKGEsYil7YyhiKX0pfSl9KS5jYXRjaChjKX0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiBfKGEsYil7dmFyIGM9dGhpcyxkPW5ldyB2YShmdW5jdGlvbihiLGQpe2MucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGU9Yy5fZGJJbmZvO2UuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oYyl7VChjLGUsIlNFTEVDVCBrZXkgRlJPTSAiK2Uuc3RvcmVOYW1lKyIgV0hFUkUgaWQgPSA/IExJTUlUIDEiLFthKzFdLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yy5yb3dzLmxlbmd0aD9jLnJvd3MuaXRlbSgwKS5rZXk6bnVsbDtiKGQpfSxmdW5jdGlvbihhLGIpe2QoYil9KX0pfSkuY2F0Y2goZCl9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gYWEoYSl7dmFyIGI9dGhpcyxjPW5ldyB2YShmdW5jdGlvbihhLGMpe2IucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGQ9Yi5fZGJJbmZvO2QuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oYil7VChiLGQsIlNFTEVDVCBrZXkgRlJPTSAiK2Quc3RvcmVOYW1lLFtdLGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGMucm93cy5sZW5ndGg7ZSsrKWQucHVzaChjLnJvd3MuaXRlbShlKS5rZXkpO2EoZCl9LGZ1bmN0aW9uKGEsYil7YyhiKX0pfSl9KS5jYXRjaChjKX0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiBiYShhKXtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGIsYyl7YS50cmFuc2FjdGlvbihmdW5jdGlvbihkKXtkLmV4ZWN1dGVTcWwoIlNFTEVDVCBuYW1lIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSB0eXBlPSd0YWJsZScgQU5EIG5hbWUgPD4gJ19fV2ViS2l0RGF0YWJhc2VJbmZvVGFibGVfXyciLFtdLGZ1bmN0aW9uKGMsZCl7Zm9yKHZhciBlPVtdLGY9MDtmPGQucm93cy5sZW5ndGg7ZisrKWUucHVzaChkLnJvd3MuaXRlbShmKS5uYW1lKTtiKHtkYjphLHN0b3JlTmFtZXM6ZX0pfSxmdW5jdGlvbihhLGIpe2MoYil9KX0sZnVuY3Rpb24oYSl7YyhhKX0pfSl9ZnVuY3Rpb24gY2EoYSxiKXtiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBjPXRoaXMuY29uZmlnKCk7YT0iZnVuY3Rpb24iIT10eXBlb2YgYSYmYXx8e30sYS5uYW1lfHwoYS5uYW1lPWEubmFtZXx8Yy5uYW1lLGEuc3RvcmVOYW1lPWEuc3RvcmVOYW1lfHxjLnN0b3JlTmFtZSk7dmFyIGQsZT10aGlzO3JldHVybiBkPWEubmFtZT9uZXcgdmEoZnVuY3Rpb24oYil7dmFyIGQ7ZD1hLm5hbWU9PT1jLm5hbWU/ZS5fZGJJbmZvLmRiOm9wZW5EYXRhYmFzZShhLm5hbWUsIiIsIiIsMCksYihhLnN0b3JlTmFtZT97ZGI6ZCxzdG9yZU5hbWVzOlthLnN0b3JlTmFtZV19OmJhKGQpKX0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB2YShmdW5jdGlvbihiLGMpe2EuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZShhKXtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGIsYyl7ZC5leGVjdXRlU3FsKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiK2EsW10sZnVuY3Rpb24oKXtiKCl9LGZ1bmN0aW9uKGEsYil7YyhiKX0pfSl9Zm9yKHZhciBmPVtdLGc9MCxoPWEuc3RvcmVOYW1lcy5sZW5ndGg7ZzxoO2crKylmLnB1c2goZShhLnN0b3JlTmFtZXNbZ10pKTt2YS5hbGwoZikudGhlbihmdW5jdGlvbigpe2IoKX0pLmNhdGNoKGZ1bmN0aW9uKGEpe2MoYSl9KX0sZnVuY3Rpb24oYSl7YyhhKX0pfSl9KTp2YS5yZWplY3QoIkludmFsaWQgYXJndW1lbnRzIiksaChkLGIpLGR9ZnVuY3Rpb24gZGEoKXt0cnl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBsb2NhbFN0b3JhZ2UmJiJzZXRJdGVtImluIGxvY2FsU3RvcmFnZSYmISFsb2NhbFN0b3JhZ2Uuc2V0SXRlbX1jYXRjaChhKXtyZXR1cm4hMX19ZnVuY3Rpb24gZWEoYSxiKXt2YXIgYz1hLm5hbWUrIi8iO3JldHVybiBhLnN0b3JlTmFtZSE9PWIuc3RvcmVOYW1lJiYoYys9YS5zdG9yZU5hbWUrIi8iKSxjfWZ1bmN0aW9uIGZhKCl7dmFyIGE9Il9sb2NhbGZvcmFnZV9zdXBwb3J0X3Rlc3QiO3RyeXtyZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oYSwhMCksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYSksITF9Y2F0Y2goYSl7cmV0dXJuITB9fWZ1bmN0aW9uIGdhKCl7cmV0dXJuIWZhKCl8fGxvY2FsU3RvcmFnZS5sZW5ndGg+MH1mdW5jdGlvbiBoYShhKXt2YXIgYj10aGlzLGM9e307aWYoYSlmb3IodmFyIGQgaW4gYSljW2RdPWFbZF07cmV0dXJuIGMua2V5UHJlZml4PWVhKGEsYi5fZGVmYXVsdENvbmZpZyksZ2EoKT8oYi5fZGJJbmZvPWMsYy5zZXJpYWxpemVyPVZhLHZhLnJlc29sdmUoKSk6dmEucmVqZWN0KCl9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9dGhpcyxjPWIucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPWIuX2RiSW5mby5rZXlQcmVmaXgsYz1sb2NhbFN0b3JhZ2UubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBkPWxvY2FsU3RvcmFnZS5rZXkoYyk7MD09PWQuaW5kZXhPZihhKSYmbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZCl9fSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9dGhpczthPWooYSk7dmFyIGQ9Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgYj1jLl9kYkluZm8sZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShiLmtleVByZWZpeCthKTtyZXR1cm4gZCYmKGQ9Yi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGQpKSxkfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9dGhpcyxkPWMucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7Zm9yKHZhciBiPWMuX2RiSW5mbyxkPWIua2V5UHJlZml4LGU9ZC5sZW5ndGgsZj1sb2NhbFN0b3JhZ2UubGVuZ3RoLGc9MSxoPTA7aDxmO2grKyl7dmFyIGk9bG9jYWxTdG9yYWdlLmtleShoKTtpZigwPT09aS5pbmRleE9mKGQpKXt2YXIgaj1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShpKTtpZihqJiYoaj1iLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaikpLHZvaWQgMCE9PShqPWEoaixpLnN1YnN0cmluZyhlKSxnKyspKSlyZXR1cm4gan19fSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9dGhpcyxkPWMucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGIsZD1jLl9kYkluZm87dHJ5e2I9bG9jYWxTdG9yYWdlLmtleShhKX1jYXRjaChhKXtiPW51bGx9cmV0dXJuIGImJihiPWIuc3Vic3RyaW5nKGQua2V5UHJlZml4Lmxlbmd0aCkpLGJ9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gbWEoYSl7dmFyIGI9dGhpcyxjPWIucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPWIuX2RiSW5mbyxjPWxvY2FsU3RvcmFnZS5sZW5ndGgsZD1bXSxlPTA7ZTxjO2UrKyl7dmFyIGY9bG9jYWxTdG9yYWdlLmtleShlKTswPT09Zi5pbmRleE9mKGEua2V5UHJlZml4KSYmZC5wdXNoKGYuc3Vic3RyaW5nKGEua2V5UHJlZml4Lmxlbmd0aCkpfXJldHVybiBkfSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIG5hKGEpe3ZhciBiPXRoaXMsYz1iLmtleXMoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiBvYShhLGIpe3ZhciBjPXRoaXM7YT1qKGEpO3ZhciBkPWMucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGI9Yy5fZGJJbmZvO2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGIua2V5UHJlZml4K2EpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIHBhKGEsYixjKXt2YXIgZD10aGlzO2E9aihhKTt2YXIgZT1kLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZvaWQgMD09PWImJihiPW51bGwpO3ZhciBjPWI7cmV0dXJuIG5ldyB2YShmdW5jdGlvbihlLGYpe3ZhciBnPWQuX2RiSW5mbztnLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGIsZnVuY3Rpb24oYixkKXtpZihkKWYoZCk7ZWxzZSB0cnl7bG9jYWxTdG9yYWdlLnNldEl0ZW0oZy5rZXlQcmVmaXgrYSxiKSxlKGMpfWNhdGNoKGEpeyJRdW90YUV4Y2VlZGVkRXJyb3IiIT09YS5uYW1lJiYiTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQiIT09YS5uYW1lfHxmKGEpLGYoYSl9fSl9KX0pO3JldHVybiBoKGUsYyksZX1mdW5jdGlvbiBxYShhLGIpe2lmKGI9ay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYT0iZnVuY3Rpb24iIT10eXBlb2YgYSYmYXx8e30sIWEubmFtZSl7dmFyIGM9dGhpcy5jb25maWcoKTthLm5hbWU9YS5uYW1lfHxjLm5hbWUsYS5zdG9yZU5hbWU9YS5zdG9yZU5hbWV8fGMuc3RvcmVOYW1lfXZhciBkLGU9dGhpcztyZXR1cm4gZD1hLm5hbWU/bmV3IHZhKGZ1bmN0aW9uKGIpe2IoYS5zdG9yZU5hbWU/ZWEoYSxlLl9kZWZhdWx0Q29uZmlnKTphLm5hbWUrIi8iKX0pLnRoZW4oZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWxvY2FsU3RvcmFnZS5sZW5ndGgtMTtiPj0wO2ItLSl7dmFyIGM9bG9jYWxTdG9yYWdlLmtleShiKTswPT09Yy5pbmRleE9mKGEpJiZsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShjKX19KTp2YS5yZWplY3QoIkludmFsaWQgYXJndW1lbnRzIiksaChkLGIpLGR9ZnVuY3Rpb24gcmEoYSxiKXthW2JdPWZ1bmN0aW9uKCl7dmFyIGM9YXJndW1lbnRzO3JldHVybiBhLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3JldHVybiBhW2JdLmFwcGx5KGEsYyl9KX19ZnVuY3Rpb24gc2EoKXtmb3IodmFyIGE9MTthPGFyZ3VtZW50cy5sZW5ndGg7YSsrKXt2YXIgYj1hcmd1bWVudHNbYV07aWYoYilmb3IodmFyIGMgaW4gYiliLmhhc093blByb3BlcnR5KGMpJiYoJGEoYltjXSk/YXJndW1lbnRzWzBdW2NdPWJbY10uc2xpY2UoKTphcmd1bWVudHNbMF1bY109YltjXSl9cmV0dXJuIGFyZ3VtZW50c1swXX12YXIgdGE9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGF9LHVhPWUoKTsidW5kZWZpbmVkIj09dHlwZW9mIFByb21pc2UmJmEoMyk7dmFyIHZhPVByb21pc2Usd2E9ImxvY2FsLWZvcmFnZS1kZXRlY3QtYmxvYi1zdXBwb3J0Iix4YT12b2lkIDAseWE9e30semE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxBYT0icmVhZG9ubHkiLEJhPSJyZWFkd3JpdGUiLENhPXtfZHJpdmVyOiJhc3luY1N0b3JhZ2UiLF9pbml0U3RvcmFnZTpDLF9zdXBwb3J0OmYoKSxpdGVyYXRlOkUsZ2V0SXRlbTpELHNldEl0ZW06RixyZW1vdmVJdGVtOkcsY2xlYXI6SCxsZW5ndGg6SSxrZXk6SixrZXlzOkssZHJvcEluc3RhbmNlOkx9LERhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixFYT0ifn5sb2NhbF9mb3JhZ2VfdHlwZX4iLEZhPS9efn5sb2NhbF9mb3JhZ2VfdHlwZX4oW15+XSspfi8sR2E9Il9fbGZzY19fOiIsSGE9R2EubGVuZ3RoLElhPSJhcmJmIixKYT0iYmxvYiIsS2E9InNpMDgiLExhPSJ1aTA4IixNYT0idWljOCIsTmE9InNpMTYiLE9hPSJzaTMyIixQYT0idXIxNiIsUWE9InVpMzIiLFJhPSJmbDMyIixTYT0iZmw2NCIsVGE9SGErSWEubGVuZ3RoLFVhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsVmE9e3NlcmlhbGl6ZTpQLGRlc2VyaWFsaXplOlEsc3RyaW5nVG9CdWZmZXI6TixidWZmZXJUb1N0cmluZzpPfSxXYT17X2RyaXZlcjoid2ViU1FMU3RvcmFnZSIsX2luaXRTdG9yYWdlOlMsX3N1cHBvcnQ6TSgpLGl0ZXJhdGU6VixnZXRJdGVtOlUsc2V0SXRlbTpYLHJlbW92ZUl0ZW06WSxjbGVhcjpaLGxlbmd0aDokLGtleTpfLGtleXM6YWEsZHJvcEluc3RhbmNlOmNhfSxYYT17X2RyaXZlcjoibG9jYWxTdG9yYWdlV3JhcHBlciIsX2luaXRTdG9yYWdlOmhhLF9zdXBwb3J0OmRhKCksaXRlcmF0ZTprYSxnZXRJdGVtOmphLHNldEl0ZW06cGEscmVtb3ZlSXRlbTpvYSxjbGVhcjppYSxsZW5ndGg6bmEsa2V5OmxhLGtleXM6bWEsZHJvcEluc3RhbmNlOnFhfSxZYT1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09Ynx8Im51bWJlciI9PXR5cGVvZiBhJiYibnVtYmVyIj09dHlwZW9mIGImJmlzTmFOKGEpJiZpc05hTihiKX0sWmE9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD0wO2Q8Yzspe2lmKFlhKGFbZF0sYikpcmV0dXJuITA7ZCsrfXJldHVybiExfSwkYT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfSxfYT17fSxhYj17fSxiYj17SU5ERVhFRERCOkNhLFdFQlNRTDpXYSxMT0NBTFNUT1JBR0U6WGF9LGNiPVtiYi5JTkRFWEVEREIuX2RyaXZlcixiYi5XRUJTUUwuX2RyaXZlcixiYi5MT0NBTFNUT1JBR0UuX2RyaXZlcl0sZGI9WyJkcm9wSW5zdGFuY2UiXSxlYj1bImNsZWFyIiwiZ2V0SXRlbSIsIml0ZXJhdGUiLCJrZXkiLCJrZXlzIiwibGVuZ3RoIiwicmVtb3ZlSXRlbSIsInNldEl0ZW0iXS5jb25jYXQoZGIpLGZiPXtkZXNjcmlwdGlvbjoiIixkcml2ZXI6Y2Iuc2xpY2UoKSxuYW1lOiJsb2NhbGZvcmFnZSIsc2l6ZTo0OTgwNzM2LHN0b3JlTmFtZToia2V5dmFsdWVwYWlycyIsdmVyc2lvbjoxfSxnYj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7ZCh0aGlzLGEpO2Zvcih2YXIgYyBpbiBiYilpZihiYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGU9YmJbY10sZj1lLl9kcml2ZXI7dGhpc1tjXT1mLF9hW2ZdfHx0aGlzLmRlZmluZURyaXZlcihlKX10aGlzLl9kZWZhdWx0Q29uZmlnPXNhKHt9LGZiKSx0aGlzLl9jb25maWc9c2Eoe30sdGhpcy5fZGVmYXVsdENvbmZpZyxiKSx0aGlzLl9kcml2ZXJTZXQ9bnVsbCx0aGlzLl9pbml0RHJpdmVyPW51bGwsdGhpcy5fcmVhZHk9ITEsdGhpcy5fZGJJbmZvPW51bGwsdGhpcy5fd3JhcExpYnJhcnlNZXRob2RzV2l0aFJlYWR5KCksdGhpcy5zZXREcml2ZXIodGhpcy5fY29uZmlnLmRyaXZlcikuY2F0Y2goZnVuY3Rpb24oKXt9KX1yZXR1cm4gYS5wcm90b3R5cGUuY29uZmlnPWZ1bmN0aW9uKGEpe2lmKCJvYmplY3QiPT09KHZvaWQgMD09PWE/InVuZGVmaW5lZCI6dGEoYSkpKXtpZih0aGlzLl9yZWFkeSlyZXR1cm4gbmV3IEVycm9yKCJDYW4ndCBjYWxsIGNvbmZpZygpIGFmdGVyIGxvY2FsZm9yYWdlIGhhcyBiZWVuIHVzZWQuIik7Zm9yKHZhciBiIGluIGEpe2lmKCJzdG9yZU5hbWUiPT09YiYmKGFbYl09YVtiXS5yZXBsYWNlKC9cVy9nLCJfIikpLCJ2ZXJzaW9uIj09PWImJiJudW1iZXIiIT10eXBlb2YgYVtiXSlyZXR1cm4gbmV3IEVycm9yKCJEYXRhYmFzZSB2ZXJzaW9uIG11c3QgYmUgYSBudW1iZXIuIik7dGhpcy5fY29uZmlnW2JdPWFbYl19cmV0dXJuISgiZHJpdmVyImluIGEmJmEuZHJpdmVyKXx8dGhpcy5zZXREcml2ZXIodGhpcy5fY29uZmlnLmRyaXZlcil9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhP3RoaXMuX2NvbmZpZ1thXTp0aGlzLl9jb25maWd9LGEucHJvdG90eXBlLmRlZmluZURyaXZlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IHZhKGZ1bmN0aW9uKGIsYyl7dHJ5e3ZhciBkPWEuX2RyaXZlcixlPW5ldyBFcnJvcigiQ3VzdG9tIGRyaXZlciBub3QgY29tcGxpYW50OyBzZWUgaHR0cHM6Ly9tb3ppbGxhLmdpdGh1Yi5pby9sb2NhbEZvcmFnZS8jZGVmaW5lZHJpdmVyIik7aWYoIWEuX2RyaXZlcilyZXR1cm4gdm9pZCBjKGUpO2Zvcih2YXIgZj1lYi5jb25jYXQoIl9pbml0U3RvcmFnZSIpLGc9MCxpPWYubGVuZ3RoO2c8aTtnKyspe3ZhciBqPWZbZ107aWYoKCFaYShkYixqKXx8YVtqXSkmJiJmdW5jdGlvbiIhPXR5cGVvZiBhW2pdKXJldHVybiB2b2lkIGMoZSl9KGZ1bmN0aW9uKCl7Zm9yKHZhciBiPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBiPW5ldyBFcnJvcigiTWV0aG9kICIrYSsiIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgY3VycmVudCBkcml2ZXIiKSxjPXZhLnJlamVjdChiKTtyZXR1cm4gaChjLGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdKSxjfX0sYz0wLGQ9ZGIubGVuZ3RoO2M8ZDtjKyspe3ZhciBlPWRiW2NdO2FbZV18fChhW2VdPWIoZSkpfX0pKCk7dmFyIGs9ZnVuY3Rpb24oYyl7X2FbZF0mJmNvbnNvbGUuaW5mbygiUmVkZWZpbmluZyBMb2NhbEZvcmFnZSBkcml2ZXI6ICIrZCksX2FbZF09YSxhYltkXT1jLGIoKX07Il9zdXBwb3J0ImluIGE/YS5fc3VwcG9ydCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuX3N1cHBvcnQ/YS5fc3VwcG9ydCgpLnRoZW4oayxjKTprKCEhYS5fc3VwcG9ydCk6ayghMCl9Y2F0Y2goYSl7YyhhKX19KTtyZXR1cm4gaShkLGIsYyksZH0sYS5wcm90b3R5cGUuZHJpdmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyaXZlcnx8bnVsbH0sYS5wcm90b3R5cGUuZ2V0RHJpdmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1fYVthXT92YS5yZXNvbHZlKF9hW2FdKTp2YS5yZWplY3QobmV3IEVycm9yKCJEcml2ZXIgbm90IGZvdW5kLiIpKTtyZXR1cm4gaShkLGIsYyksZH0sYS5wcm90b3R5cGUuZ2V0U2VyaWFsaXplcj1mdW5jdGlvbihhKXt2YXIgYj12YS5yZXNvbHZlKFZhKTtyZXR1cm4gaShiLGEpLGJ9LGEucHJvdG90eXBlLnJlYWR5PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLl9kcml2ZXJTZXQudGhlbihmdW5jdGlvbigpe3JldHVybiBudWxsPT09Yi5fcmVhZHkmJihiLl9yZWFkeT1iLl9pbml0RHJpdmVyKCkpLGIuX3JlYWR5fSk7cmV0dXJuIGkoYyxhLGEpLGN9LGEucHJvdG90eXBlLnNldERyaXZlcj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZCgpe2cuX2NvbmZpZy5kcml2ZXI9Zy5kcml2ZXIoKX1mdW5jdGlvbiBlKGEpe3JldHVybiBnLl9leHRlbmQoYSksZCgpLGcuX3JlYWR5PWcuX2luaXRTdG9yYWdlKGcuX2NvbmZpZyksZy5fcmVhZHl9ZnVuY3Rpb24gZihhKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zm9yKDtjPGEubGVuZ3RoOyl7dmFyIGY9YVtjXTtyZXR1cm4gYysrLGcuX2RiSW5mbz1udWxsLGcuX3JlYWR5PW51bGwsZy5nZXREcml2ZXIoZikudGhlbihlKS5jYXRjaChiKX1kKCk7dmFyIGg9bmV3IEVycm9yKCJObyBhdmFpbGFibGUgc3RvcmFnZSBtZXRob2QgZm91bmQuIik7cmV0dXJuIGcuX2RyaXZlclNldD12YS5yZWplY3QoaCksZy5fZHJpdmVyU2V0fXZhciBjPTA7cmV0dXJuIGIoKX19dmFyIGc9dGhpczskYShhKXx8KGE9W2FdKTt2YXIgaD10aGlzLl9nZXRTdXBwb3J0ZWREcml2ZXJzKGEpLGo9bnVsbCE9PXRoaXMuX2RyaXZlclNldD90aGlzLl9kcml2ZXJTZXQuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gdmEucmVzb2x2ZSgpfSk6dmEucmVzb2x2ZSgpO3JldHVybiB0aGlzLl9kcml2ZXJTZXQ9ai50aGVuKGZ1bmN0aW9uKCl7dmFyIGE9aFswXTtyZXR1cm4gZy5fZGJJbmZvPW51bGwsZy5fcmVhZHk9bnVsbCxnLmdldERyaXZlcihhKS50aGVuKGZ1bmN0aW9uKGEpe2cuX2RyaXZlcj1hLl9kcml2ZXIsZCgpLGcuX3dyYXBMaWJyYXJ5TWV0aG9kc1dpdGhSZWFkeSgpLGcuX2luaXREcml2ZXI9ZihoKX0pfSkuY2F0Y2goZnVuY3Rpb24oKXtkKCk7dmFyIGE9bmV3IEVycm9yKCJObyBhdmFpbGFibGUgc3RvcmFnZSBtZXRob2QgZm91bmQuIik7cmV0dXJuIGcuX2RyaXZlclNldD12YS5yZWplY3QoYSksZy5fZHJpdmVyU2V0fSksaSh0aGlzLl9kcml2ZXJTZXQsYixjKSx0aGlzLl9kcml2ZXJTZXR9LGEucHJvdG90eXBlLnN1cHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiEhYWJbYV19LGEucHJvdG90eXBlLl9leHRlbmQ9ZnVuY3Rpb24oYSl7c2EodGhpcyxhKX0sYS5wcm90b3R5cGUuX2dldFN1cHBvcnRlZERyaXZlcnM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspe3ZhciBlPWFbY107dGhpcy5zdXBwb3J0cyhlKSYmYi5wdXNoKGUpfXJldHVybiBifSxhLnByb3RvdHlwZS5fd3JhcExpYnJhcnlNZXRob2RzV2l0aFJlYWR5PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYj1lYi5sZW5ndGg7YTxiO2ErKylyYSh0aGlzLGViW2FdKX0sYS5wcm90b3R5cGUuY3JlYXRlSW5zdGFuY2U9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGIpfSxhfSgpLGhiPW5ldyBnYjtiLmV4cG9ydHM9aGJ9LHszOjN9XX0se30sWzRdKSg0KX0pOwp9OwoKbXVyb20uaW5zdGFsbFVuaWNvZGVCYXNlNjQgPSBmdW5jdGlvbigpCnsKLyoKCWh0dHBzOi8vZ2l0aHViLmNvbS9zb2xkZXJqcy9UZXh0RW5jb2RlckxpdGUKCUFwYWNoZSAyLjAKKi8KZnVuY3Rpb24gVGV4dEVuY29kZXJMaXRlKCl7fWZ1bmN0aW9uIFRleHREZWNvZGVyTGl0ZSgpe30oZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdXRmOFRvQnl0ZXMoc3RyaW5nLHVuaXRzKXt1bml0cz11bml0c3x8SW5maW5pdHk7dmFyIGNvZGVQb2ludDt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7dmFyIGxlYWRTdXJyb2dhdGU9bnVsbDt2YXIgYnl0ZXM9W107dmFyIGk9MDtmb3IoO2k8bGVuZ3RoO2krKyl7Y29kZVBvaW50PXN0cmluZy5jaGFyQ29kZUF0KGkpO2lmKGNvZGVQb2ludD41NTI5NSYmY29kZVBvaW50PDU3MzQ0KXtpZihsZWFkU3Vycm9nYXRlKXtpZihjb2RlUG9pbnQ8NTYzMjApe2lmKCh1bml0cy09Myk+LTEpYnl0ZXMucHVzaCgyMzksMTkxLDE4OSk7bGVhZFN1cnJvZ2F0ZT1jb2RlUG9pbnQ7Y29udGludWV9ZWxzZXtjb2RlUG9pbnQ9bGVhZFN1cnJvZ2F0ZS01NTI5Njw8MTB8Y29kZVBvaW50LTU2MzIwfDY1NTM2O2xlYWRTdXJyb2dhdGU9bnVsbH19ZWxzZXtpZihjb2RlUG9pbnQ+NTYzMTkpe2lmKCh1bml0cy09Myk+LTEpYnl0ZXMucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9ZWxzZSBpZihpKzE9PT1sZW5ndGgpe2lmKCh1bml0cy09Myk+LTEpYnl0ZXMucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9ZWxzZXtsZWFkU3Vycm9nYXRlPWNvZGVQb2ludDtjb250aW51ZX19fWVsc2UgaWYobGVhZFN1cnJvZ2F0ZSl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDIzOSwxOTEsMTg5KTtsZWFkU3Vycm9nYXRlPW51bGx9aWYoY29kZVBvaW50PDEyOCl7aWYoKHVuaXRzLT0xKTwwKWJyZWFrO2J5dGVzLnB1c2goY29kZVBvaW50KX1lbHNlIGlmKGNvZGVQb2ludDwyMDQ4KXtpZigodW5pdHMtPTIpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQ+PjZ8MTkyLGNvZGVQb2ludCY2M3wxMjgpfWVsc2UgaWYoY29kZVBvaW50PDY1NTM2KXtpZigodW5pdHMtPTMpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQ+PjEyfDIyNCxjb2RlUG9pbnQ+PjYmNjN8MTI4LGNvZGVQb2ludCY2M3wxMjgpfWVsc2UgaWYoY29kZVBvaW50PDIwOTcxNTIpe2lmKCh1bml0cy09NCk8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+MTh8MjQwLGNvZGVQb2ludD4+MTImNjN8MTI4LGNvZGVQb2ludD4+NiY2M3wxMjgsY29kZVBvaW50JjYzfDEyOCl9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpfX1yZXR1cm4gYnl0ZXN9ZnVuY3Rpb24gdXRmOFNsaWNlKGJ1ZixzdGFydCxlbmQpe3ZhciByZXM9IiI7dmFyIHRtcD0iIjtlbmQ9TWF0aC5taW4oYnVmLmxlbmd0aCxlbmR8fEluZmluaXR5KTtzdGFydD1zdGFydHx8MDtmb3IodmFyIGk9c3RhcnQ7aTxlbmQ7aSsrKXtpZihidWZbaV08PTEyNyl7cmVzKz1kZWNvZGVVdGY4Q2hhcih0bXApK1N0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTt0bXA9IiJ9ZWxzZXt0bXArPSIlIitidWZbaV0udG9TdHJpbmcoMTYpfX1yZXR1cm4gcmVzK2RlY29kZVV0ZjhDaGFyKHRtcCl9ZnVuY3Rpb24gZGVjb2RlVXRmOENoYXIoc3RyKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpfWNhdGNoKGVycil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzMpfX1UZXh0RW5jb2RlckxpdGUucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbihzdHIpe3ZhciByZXN1bHQ7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgVWludDhBcnJheSl7cmVzdWx0PXV0ZjhUb0J5dGVzKHN0cil9ZWxzZXtyZXN1bHQ9bmV3IFVpbnQ4QXJyYXkodXRmOFRvQnl0ZXMoc3RyKSl9cmV0dXJuIHJlc3VsdH07VGV4dERlY29kZXJMaXRlLnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24oYnl0ZXMpe3JldHVybiB1dGY4U2xpY2UoYnl0ZXMsMCxieXRlcy5sZW5ndGgpfX0pKCk7aWYodHlwZW9mIG1vZHVsZT09PSJvYmplY3QiJiZtb2R1bGUpe21vZHVsZS5leHBvcnRzLlRleHREZWNvZGVyTGl0ZT1UZXh0RGVjb2RlckxpdGU7bW9kdWxlLmV4cG9ydHMuVGV4dEVuY29kZXJMaXRlPVRleHRFbmNvZGVyTGl0ZX0KLyoKCWh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcwogCU1JVAoqLwooZnVuY3Rpb24ocil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKXttb2R1bGUuZXhwb3J0cz1yKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLHIpfWVsc2V7dmFyIGU7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKXtlPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT0idW5kZWZpbmVkIil7ZT1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKXtlPXNlbGZ9ZWxzZXtlPXRoaXN9ZS5iYXNlNjRqcz1yKCl9fSkoZnVuY3Rpb24oKXt2YXIgcixlLG47cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhmLGkpe2lmKCFuW2ZdKXtpZighZVtmXSl7dmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWkmJnUpcmV0dXJuIHUoZiwhMCk7aWYoYSlyZXR1cm4gYShmLCEwKTt2YXIgdj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitmKyInIik7dGhyb3cgdi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIix2fXZhciBkPW5bZl09e2V4cG9ydHM6e319O2VbZl1bMF0uY2FsbChkLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtmXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0sZCxkLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5bZl0uZXhwb3J0c31mb3IodmFyIGE9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsZj0wO2Y8dC5sZW5ndGg7ZisrKW8odFtmXSk7cmV0dXJuIG99cmV0dXJuIHJ9KCkoeyIvIjpbZnVuY3Rpb24ocixlLG4peyJ1c2Ugc3RyaWN0IjtuLmJ5dGVMZW5ndGg9ZDtuLnRvQnl0ZUFycmF5PWg7bi5mcm9tQnl0ZUFycmF5PXA7dmFyIHQ9W107dmFyIG89W107dmFyIGE9dHlwZW9mIFVpbnQ4QXJyYXkhPT0idW5kZWZpbmVkIj9VaW50OEFycmF5OkFycmF5O3ZhciBmPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjtmb3IodmFyIGk9MCx1PWYubGVuZ3RoO2k8dTsrK2kpe3RbaV09ZltpXTtvW2YuY2hhckNvZGVBdChpKV09aX1vWyItIi5jaGFyQ29kZUF0KDApXT02MjtvWyJfIi5jaGFyQ29kZUF0KDApXT02MztmdW5jdGlvbiB2KHIpe3ZhciBlPXIubGVuZ3RoO2lmKGUlND4wKXt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKX12YXIgbj1yLmluZGV4T2YoIj0iKTtpZihuPT09LTEpbj1lO3ZhciB0PW49PT1lPzA6NC1uJTQ7cmV0dXJuW24sdF19ZnVuY3Rpb24gZChyKXt2YXIgZT12KHIpO3ZhciBuPWVbMF07dmFyIHQ9ZVsxXTtyZXR1cm4obit0KSozLzQtdH1mdW5jdGlvbiBjKHIsZSxuKXtyZXR1cm4oZStuKSozLzQtbn1mdW5jdGlvbiBoKHIpe3ZhciBlO3ZhciBuPXYocik7dmFyIHQ9blswXTt2YXIgZj1uWzFdO3ZhciBpPW5ldyBhKGMocix0LGYpKTt2YXIgdT0wO3ZhciBkPWY+MD90LTQ6dDtmb3IodmFyIGg9MDtoPGQ7aCs9NCl7ZT1vW3IuY2hhckNvZGVBdChoKV08PDE4fG9bci5jaGFyQ29kZUF0KGgrMSldPDwxMnxvW3IuY2hhckNvZGVBdChoKzIpXTw8NnxvW3IuY2hhckNvZGVBdChoKzMpXTtpW3UrK109ZT4+MTYmMjU1O2lbdSsrXT1lPj44JjI1NTtpW3UrK109ZSYyNTV9aWYoZj09PTIpe2U9b1tyLmNoYXJDb2RlQXQoaCldPDwyfG9bci5jaGFyQ29kZUF0KGgrMSldPj40O2lbdSsrXT1lJjI1NX1pZihmPT09MSl7ZT1vW3IuY2hhckNvZGVBdChoKV08PDEwfG9bci5jaGFyQ29kZUF0KGgrMSldPDw0fG9bci5jaGFyQ29kZUF0KGgrMildPj4yO2lbdSsrXT1lPj44JjI1NTtpW3UrK109ZSYyNTV9cmV0dXJuIGl9ZnVuY3Rpb24gcyhyKXtyZXR1cm4gdFtyPj4xOCY2M10rdFtyPj4xMiY2M10rdFtyPj42JjYzXSt0W3ImNjNdfWZ1bmN0aW9uIGwocixlLG4pe3ZhciB0O3ZhciBvPVtdO2Zvcih2YXIgYT1lO2E8bjthKz0zKXt0PShyW2FdPDwxNiYxNjcxMTY4MCkrKHJbYSsxXTw8OCY2NTI4MCkrKHJbYSsyXSYyNTUpO28ucHVzaChzKHQpKX1yZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBwKHIpe3ZhciBlO3ZhciBuPXIubGVuZ3RoO3ZhciBvPW4lMzt2YXIgYT1bXTt2YXIgZj0xNjM4Mztmb3IodmFyIGk9MCx1PW4tbztpPHU7aSs9Zil7YS5wdXNoKGwocixpLGkrZj51P3U6aStmKSl9aWYobz09PTEpe2U9cltuLTFdO2EucHVzaCh0W2U+PjJdK3RbZTw8NCY2M10rIj09Iil9ZWxzZSBpZihvPT09Mil7ZT0ocltuLTJdPDw4KStyW24tMV07YS5wdXNoKHRbZT4+MTBdK3RbZT4+NCY2M10rdFtlPDwyJjYzXSsiPSIpfXJldHVybiBhLmpvaW4oIiIpfX0se31dfSx7fSxbXSkoIi8iKX0pOwovKgogICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvcnUvZG9jcy9XZWIvQVBJL1dpbmRvd0Jhc2U2NC9CYXNlNjRfZW5jb2RpbmdfYW5kX2RlY29kaW5nCiovCiAgICBtdXJvbS5idG9hID0gZnVuY3Rpb24oc3RyKQogICAgewogICAgICAgIHZhciBieXRlcyA9IG5ldyAoVGV4dEVuY29kZXIgfHwgVGV4dEVuY29kZXJMaXRlKSgidXRmLTgiKS5lbmNvZGUoc3RyKTsKICAgICAgICByZXR1cm4gYmFzZTY0anMuZnJvbUJ5dGVBcnJheShieXRlcyk7CiAgICB9OwogICAgbXVyb20uYXRvYiA9IGZ1bmN0aW9uKHN0cikKICAgIHsKICAgICAgICB2YXIgYnl0ZXMgPSBiYXNlNjRqcy50b0J5dGVBcnJheShzdHIpOwogICAgICAgIHJldHVybiBuZXcgKFRleHREZWNvZGVyIHx8IFRleHREZWNvZGVyTGl0ZSkoInV0Zi04IikuZGVjb2RlKGJ5dGVzKTsKICAgIH07Cn07CgptdXJvbS5tb2R1bGVQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaWQpCnsKICAgIHZhciBtID0gbXVyb20ubW9kdWxlc1tpZF07CiAgICByZXR1cm4gKHR5cGVvZiBtWzJdICE9ICJ1bmRlZmluZWQiKSA/IG1bMl0gOiB7fTsKfTsKCm11cm9tLm1vZHVsZVN0YXR1cyA9IGZ1bmN0aW9uKGlkKQp7CiAgICB2YXIgcHJvcCA9IG11cm9tLm1vZHVsZVByb3BlcnRpZXMoaWQpOwogICAgaWYgKCJzdGF0dXMiIGluIHByb3ApCiAgICB7CiAgICAgICAgcmV0dXJuIHByb3BbInN0YXR1cyJdOwogICAgfQogICAgLy8gU3RhdHVzID09IHRydWUgaWYgZXhwbGljaXQgcmVjb3JkIGlzIGFic2VudC4KICAgIHJldHVybiB0cnVlOwp9OwoKbXVyb20uc3RhcnQgPSBmdW5jdGlvbigpCnsKICAgIGNvbnNvbGUuZGVidWcoIk92ZXJyaWRlIG11cm9tLnN0YXJ0KCkgZnVuY3Rpb24gdG8gYmUgbm90aWZpZWQgd2hlbiBhbGwgbW9kdWxlcyB3ZXJlIGxvYWRlZCIpOwp9CgptdXJvbS5sb2FkTW9kdWxlcyA9IGZ1bmN0aW9uKCkKewogICAgLy8gU2tpcCBgMGAgbW9kdWxlIGJlY2F1c2UgaXQncyB1cy4KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbXVyb20ubW9kdWxlcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgICB2YXIgbW9kdWxlID0gbXVyb20ubW9kdWxlc1tpXTsKICAgICAgICB2YXIgbmFtZSA9IG1vZHVsZVswXTsKICAgICAgICB2YXIgY29kZSA9IG11cm9tLmF0b2IobW9kdWxlWzFdKTsKICAgICAgICBpZiAobXVyb20ubW9kdWxlU3RhdHVzKGkpID09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJTa2lwIGxvYWRpbmcgJyIgKyBuYW1lICsgIicgbW9kdWxlIGJlY2F1c2UgaXQncyB0dXJuZWQgb2ZmIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBldmFsKGNvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCAnIiArIG5hbWUgKyAiJyBtb2R1bGU6ICciICsgZSArICInIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIG11cm9tLnN0YXJ0KCk7Cn07CgptdXJvbS5sb2FkSW5kZXhlZERCTW9kdWxlcyA9IGZ1bmN0aW9uKGNvbXBsZXRpb25IYW5kbGVyKQp7CiAgICAvLyBTZWUgaWYgSW5kZXhlZERCIGhhcyBtb2R1bGVzLgogICAgLy8gSW5kZXhlZERCIG1vZHVsZXMgb3ZlcnJpZGUgdGhvc2UgY29taW5nIGZyb20gSFRNTC4KICAgIGxvY2FsZm9yYWdlLmNvbmZpZyh7IG5hbWU6ICJtdXJvbSIgfSk7CiAgICBsb2NhbGZvcmFnZS5nZXRJdGVtKCJtb2R1bGVzIiwgZnVuY3Rpb24oZXJyb3IsIG1vZHVsZXMpIHsKICAgICAgICBpZiAobW9kdWxlcykKICAgICAgICB7CiAgICAgICAgICAgIG11cm9tLm1vZHVsZXMgPSBtb2R1bGVzOwogICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJNb2R1bGVzIGhhdmUgYmVlbiBsb2FkZWQgZnJvbSBJbmRleGVkREIiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiQ291bGQgbm90IGdldCBtb2R1bGVzIGZyb20gSW5kZXhlZERCOiAnIiArIGVycm9yICsgIiciKTsKICAgICAgICB9CiAgICAgICAgLy8gQ29udGludWUuCiAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoKTsKICAgIH0pOwp9OwoKbXVyb20uaW5zdGFsbExvY2FsRm9yYWdlKCk7Cm11cm9tLmluc3RhbGxVbmljb2RlQmFzZTY0KCk7Ci8vIEluZGV4ZWREQiBtb2R1bGVzIG92ZXJyaWRlIEhUTUwgb25lcy4KbXVyb20ubG9hZEluZGV4ZWREQk1vZHVsZXMobXVyb20ubG9hZE1vZHVsZXMpOwo=",
+"LyoKICogTk9URSBPbmx5IEFTQ0lJIGlzIGFsbG93ZWQgaW4gdGhpcyBsb2FkaW5nIG1vZHVsZQogKiBOT1RFIGJlY2F1c2UgaXQncyBkZWNpcGhlcmVkIHdpdGggYnRvYSgpIGNhbGwsCiAqIE5PVEUgd2hpY2ggY2FuJ3QgaGFuZGxlIFVuaWNvZGUuCiAqIE5PVEUgSG93ZXZlciwgbXVyb20uYXRvYi9idG9hIGZ1bmN0aW9ucyAoZGVmaW5lZCBoZXJlKQogKiBOT1RFIHdvcmsgZmluZSB3aXRoIFVuaWNvZGUsIHNvIHlvdSBhcmUgZnJlZQogKiBOT1RFIHRvIHVzZSBVbmljb2RlIGluIG90aGVyIG1vZHVsZXMKICovCgptdXJvbS5pbnN0YWxsTG9jYWxGb3JhZ2UgPSBmdW5jdGlvbigpCnsKLyoKICAgIGxvY2FsRm9yYWdlIC0tIE9mZmxpbmUgU3RvcmFnZSwgSW1wcm92ZWQKICAgIFZlcnNpb24gMS43LjMKICAgIGh0dHBzOi8vbG9jYWxmb3JhZ2UuZ2l0aHViLmlvL2xvY2FsRm9yYWdlCiAgICAoYykgMjAxMy0yMDE3IE1vemlsbGEsIEFwYWNoZSBMaWNlbnNlIDIuMAoqLwohZnVuY3Rpb24oYSl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1hKCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxhKTtlbHNle3ZhciBiO2I9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGIubG9jYWxmb3JhZ2U9YSgpfX0oZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gYShiLGMsZCl7ZnVuY3Rpb24gZShnLGgpe2lmKCFjW2ddKXtpZighYltnXSl7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWgmJmkpcmV0dXJuIGkoZywhMCk7aWYoZilyZXR1cm4gZihnLCEwKTt2YXIgaj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitnKyInIik7dGhyb3cgai5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixqfXZhciBrPWNbZ109e2V4cG9ydHM6e319O2JbZ11bMF0uY2FsbChrLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltnXVsxXVthXTtyZXR1cm4gZShjfHxhKX0sayxrLmV4cG9ydHMsYSxiLGMsZCl9cmV0dXJuIGNbZ10uZXhwb3J0c31mb3IodmFyIGY9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsZz0wO2c8ZC5sZW5ndGg7ZysrKWUoZFtnXSk7cmV0dXJuIGV9KHsxOltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKCl7az0hMDtmb3IodmFyIGEsYixjPWwubGVuZ3RoO2M7KXtmb3IoYj1sLGw9W10sYT0tMTsrK2E8YzspYlthXSgpO2M9bC5sZW5ndGh9az0hMX1mdW5jdGlvbiBkKGEpezEhPT1sLnB1c2goYSl8fGt8fGUoKX12YXIgZSxmPWEuTXV0YXRpb25PYnNlcnZlcnx8YS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKGYpe3ZhciBnPTAsaD1uZXcgZihjKSxpPWEuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO2gub2JzZXJ2ZShpLHtjaGFyYWN0ZXJEYXRhOiEwfSksZT1mdW5jdGlvbigpe2kuZGF0YT1nPSsrZyUyfX1lbHNlIGlmKGEuc2V0SW1tZWRpYXRlfHx2b2lkIDA9PT1hLk1lc3NhZ2VDaGFubmVsKWU9ImRvY3VtZW50ImluIGEmJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT9mdW5jdGlvbigpe3ZhciBiPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtjKCksYi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfSxhLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChiKX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGMsMCl9O2Vsc2V7dmFyIGo9bmV3IGEuTWVzc2FnZUNoYW5uZWw7ai5wb3J0MS5vbm1lc3NhZ2U9YyxlPWZ1bmN0aW9uKCl7ai5wb3J0Mi5wb3N0TWVzc2FnZSgwKX19dmFyIGssbD1bXTtiLmV4cG9ydHM9ZH0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dLDI6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZCgpe31mdW5jdGlvbiBlKGEpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3RoaXMuc3RhdGU9cyx0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsYSE9PWQmJmkodGhpcyxhKX1mdW5jdGlvbiBmKGEsYixjKXt0aGlzLnByb21pc2U9YSwiZnVuY3Rpb24iPT10eXBlb2YgYiYmKHRoaXMub25GdWxmaWxsZWQ9Yix0aGlzLmNhbGxGdWxmaWxsZWQ9dGhpcy5vdGhlckNhbGxGdWxmaWxsZWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBjJiYodGhpcy5vblJlamVjdGVkPWMsdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gZyhhLGIsYyl7byhmdW5jdGlvbigpe3ZhciBkO3RyeXtkPWIoYyl9Y2F0Y2goYil7cmV0dXJuIHAucmVqZWN0KGEsYil9ZD09PWE/cC5yZWplY3QoYSxuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVzb2x2ZSBwcm9taXNlIHdpdGggaXRzZWxmIikpOnAucmVzb2x2ZShhLGQpfSl9ZnVuY3Rpb24gaChhKXt2YXIgYj1hJiZhLnRoZW47aWYoYSYmKCJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGEpJiYiZnVuY3Rpb24iPT10eXBlb2YgYilyZXR1cm4gZnVuY3Rpb24oKXtiLmFwcGx5KGEsYXJndW1lbnRzKX19ZnVuY3Rpb24gaShhLGIpe2Z1bmN0aW9uIGMoYil7Znx8KGY9ITAscC5yZWplY3QoYSxiKSl9ZnVuY3Rpb24gZChiKXtmfHwoZj0hMCxwLnJlc29sdmUoYSxiKSl9ZnVuY3Rpb24gZSgpe2IoZCxjKX12YXIgZj0hMSxnPWooZSk7ImVycm9yIj09PWcuc3RhdHVzJiZjKGcudmFsdWUpfWZ1bmN0aW9uIGooYSxiKXt2YXIgYz17fTt0cnl7Yy52YWx1ZT1hKGIpLGMuc3RhdHVzPSJzdWNjZXNzIn1jYXRjaChhKXtjLnN0YXR1cz0iZXJyb3IiLGMudmFsdWU9YX1yZXR1cm4gY31mdW5jdGlvbiBrKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcz9hOnAucmVzb2x2ZShuZXcgdGhpcyhkKSxhKX1mdW5jdGlvbiBsKGEpe3ZhciBiPW5ldyB0aGlzKGQpO3JldHVybiBwLnJlamVjdChiLGEpfWZ1bmN0aW9uIG0oYSl7ZnVuY3Rpb24gYihhLGIpe2Z1bmN0aW9uIGQoYSl7Z1tiXT1hLCsraCE9PWV8fGZ8fChmPSEwLHAucmVzb2x2ZShqLGcpKX1jLnJlc29sdmUoYSkudGhlbihkLGZ1bmN0aW9uKGEpe2Z8fChmPSEwLHAucmVqZWN0KGosYSkpfSl9dmFyIGM9dGhpcztpZigiW29iamVjdCBBcnJheV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKCJtdXN0IGJlIGFuIGFycmF5IikpO3ZhciBlPWEubGVuZ3RoLGY9ITE7aWYoIWUpcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7Zm9yKHZhciBnPW5ldyBBcnJheShlKSxoPTAsaT0tMSxqPW5ldyB0aGlzKGQpOysraTxlOyliKGFbaV0saSk7cmV0dXJuIGp9ZnVuY3Rpb24gbihhKXtmdW5jdGlvbiBiKGEpe2MucmVzb2x2ZShhKS50aGVuKGZ1bmN0aW9uKGEpe2Z8fChmPSEwLHAucmVzb2x2ZShoLGEpKX0sZnVuY3Rpb24oYSl7Znx8KGY9ITAscC5yZWplY3QoaCxhKSl9KX12YXIgYz10aGlzO2lmKCJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoIm11c3QgYmUgYW4gYXJyYXkiKSk7dmFyIGU9YS5sZW5ndGgsZj0hMTtpZighZSlyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIGc9LTEsaD1uZXcgdGhpcyhkKTsrK2c8ZTspYihhW2ddKTtyZXR1cm4gaH12YXIgbz1hKDEpLHA9e30scT1bIlJFSkVDVEVEIl0scj1bIkZVTEZJTExFRCJdLHM9WyJQRU5ESU5HIl07Yi5leHBvcnRzPWUsZS5wcm90b3R5cGUuY2F0Y2g9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudGhlbihudWxsLGEpfSxlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGEsYil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEmJnRoaXMuc3RhdGU9PT1yfHwiZnVuY3Rpb24iIT10eXBlb2YgYiYmdGhpcy5zdGF0ZT09PXEpcmV0dXJuIHRoaXM7dmFyIGM9bmV3IHRoaXMuY29uc3RydWN0b3IoZCk7aWYodGhpcy5zdGF0ZSE9PXMpe2coYyx0aGlzLnN0YXRlPT09cj9hOmIsdGhpcy5vdXRjb21lKX1lbHNlIHRoaXMucXVldWUucHVzaChuZXcgZihjLGEsYikpO3JldHVybiBjfSxmLnByb3RvdHlwZS5jYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKGEpe3AucmVzb2x2ZSh0aGlzLnByb21pc2UsYSl9LGYucHJvdG90eXBlLm90aGVyQ2FsbEZ1bGZpbGxlZD1mdW5jdGlvbihhKXtnKHRoaXMucHJvbWlzZSx0aGlzLm9uRnVsZmlsbGVkLGEpfSxmLnByb3RvdHlwZS5jYWxsUmVqZWN0ZWQ9ZnVuY3Rpb24oYSl7cC5yZWplY3QodGhpcy5wcm9taXNlLGEpfSxmLnByb3RvdHlwZS5vdGhlckNhbGxSZWplY3RlZD1mdW5jdGlvbihhKXtnKHRoaXMucHJvbWlzZSx0aGlzLm9uUmVqZWN0ZWQsYSl9LHAucmVzb2x2ZT1mdW5jdGlvbihhLGIpe3ZhciBjPWooaCxiKTtpZigiZXJyb3IiPT09Yy5zdGF0dXMpcmV0dXJuIHAucmVqZWN0KGEsYy52YWx1ZSk7dmFyIGQ9Yy52YWx1ZTtpZihkKWkoYSxkKTtlbHNle2Euc3RhdGU9cixhLm91dGNvbWU9Yjtmb3IodmFyIGU9LTEsZj1hLnF1ZXVlLmxlbmd0aDsrK2U8ZjspYS5xdWV1ZVtlXS5jYWxsRnVsZmlsbGVkKGIpfXJldHVybiBhfSxwLnJlamVjdD1mdW5jdGlvbihhLGIpe2Euc3RhdGU9cSxhLm91dGNvbWU9Yjtmb3IodmFyIGM9LTEsZD1hLnF1ZXVlLmxlbmd0aDsrK2M8ZDspYS5xdWV1ZVtjXS5jYWxsUmVqZWN0ZWQoYik7cmV0dXJuIGF9LGUucmVzb2x2ZT1rLGUucmVqZWN0PWwsZS5hbGw9bSxlLnJhY2U9bn0sezE6MX1dLDM6W2Z1bmN0aW9uKGEsYixjKXsoZnVuY3Rpb24oYil7InVzZSBzdHJpY3QiOyJmdW5jdGlvbiIhPXR5cGVvZiBiLlByb21pc2UmJihiLlByb21pc2U9YSgyKSl9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsyOjJ9XSw0OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBlKCl7dHJ5e2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgaW5kZXhlZERCKXJldHVybiBpbmRleGVkREI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3ZWJraXRJbmRleGVkREIpcmV0dXJuIHdlYmtpdEluZGV4ZWREQjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG1vekluZGV4ZWREQilyZXR1cm4gbW96SW5kZXhlZERCO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgT0luZGV4ZWREQilyZXR1cm4gT0luZGV4ZWREQjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG1zSW5kZXhlZERCKXJldHVybiBtc0luZGV4ZWREQn1jYXRjaChhKXtyZXR1cm59fWZ1bmN0aW9uIGYoKXt0cnl7aWYoIXVhKXJldHVybiExO3ZhciBhPSJ1bmRlZmluZWQiIT10eXBlb2Ygb3BlbkRhdGFiYXNlJiYvKFNhZmFyaXxpUGhvbmV8aVBhZHxpUG9kKS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIS9DaHJvbWUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvQmxhY2tCZXJyeS8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLGI9ImZ1bmN0aW9uIj09dHlwZW9mIGZldGNoJiYtMSE9PWZldGNoLnRvU3RyaW5nKCkuaW5kZXhPZigiW25hdGl2ZSBjb2RlIik7cmV0dXJuKCFhfHxiKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBpbmRleGVkREImJiJ1bmRlZmluZWQiIT10eXBlb2YgSURCS2V5UmFuZ2V9Y2F0Y2goYSl7cmV0dXJuITF9fWZ1bmN0aW9uIGcoYSxiKXthPWF8fFtdLGI9Ynx8e307dHJ5e3JldHVybiBuZXcgQmxvYihhLGIpfWNhdGNoKGYpe2lmKCJUeXBlRXJyb3IiIT09Zi5uYW1lKXRocm93IGY7Zm9yKHZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYkJ1aWxkZXI/QmxvYkJ1aWxkZXI6InVuZGVmaW5lZCIhPXR5cGVvZiBNU0Jsb2JCdWlsZGVyP01TQmxvYkJ1aWxkZXI6InVuZGVmaW5lZCIhPXR5cGVvZiBNb3pCbG9iQnVpbGRlcj9Nb3pCbG9iQnVpbGRlcjpXZWJLaXRCbG9iQnVpbGRlcixkPW5ldyBjLGU9MDtlPGEubGVuZ3RoO2UrPTEpZC5hcHBlbmQoYVtlXSk7cmV0dXJuIGQuZ2V0QmxvYihiLnR5cGUpfX1mdW5jdGlvbiBoKGEsYil7YiYmYS50aGVuKGZ1bmN0aW9uKGEpe2IobnVsbCxhKX0sZnVuY3Rpb24oYSl7YihhKX0pfWZ1bmN0aW9uIGkoYSxiLGMpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiZhLnRoZW4oYiksImZ1bmN0aW9uIj09dHlwZW9mIGMmJmEuY2F0Y2goYyl9ZnVuY3Rpb24gaihhKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjb25zb2xlLndhcm4oYSsiIHVzZWQgYXMgYSBrZXksIGJ1dCBpdCBpcyBub3QgYSBzdHJpbmcuIiksYT1TdHJpbmcoYSkpLGF9ZnVuY3Rpb24gaygpe2lmKGFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSlyZXR1cm4gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV19ZnVuY3Rpb24gbChhKXtmb3IodmFyIGI9YS5sZW5ndGgsYz1uZXcgQXJyYXlCdWZmZXIoYiksZD1uZXcgVWludDhBcnJheShjKSxlPTA7ZTxiO2UrKylkW2VdPWEuY2hhckNvZGVBdChlKTtyZXR1cm4gY31mdW5jdGlvbiBtKGEpe3JldHVybiBuZXcgdmEoZnVuY3Rpb24oYil7dmFyIGM9YS50cmFuc2FjdGlvbih3YSxCYSksZD1nKFsiIl0pO2Mub2JqZWN0U3RvcmUod2EpLnB1dChkLCJrZXkiKSxjLm9uYWJvcnQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCksYighMSl9LGMub25jb21wbGV0ZT1mdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFxkKykvKSxjPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2VcLy8pO2IoY3x8IWF8fHBhcnNlSW50KGFbMV0sMTApPj00Myl9fSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4hMX0pfWZ1bmN0aW9uIG4oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgeGE/dmEucmVzb2x2ZSh4YSk6bShhKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiB4YT1hfSl9ZnVuY3Rpb24gbyhhKXt2YXIgYj15YVthLm5hbWVdLGM9e307Yy5wcm9taXNlPW5ldyB2YShmdW5jdGlvbihhLGIpe2MucmVzb2x2ZT1hLGMucmVqZWN0PWJ9KSxiLmRlZmVycmVkT3BlcmF0aW9ucy5wdXNoKGMpLGIuZGJSZWFkeT9iLmRiUmVhZHk9Yi5kYlJlYWR5LnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYy5wcm9taXNlfSk6Yi5kYlJlYWR5PWMucHJvbWlzZX1mdW5jdGlvbiBwKGEpe3ZhciBiPXlhW2EubmFtZV0sYz1iLmRlZmVycmVkT3BlcmF0aW9ucy5wb3AoKTtpZihjKXJldHVybiBjLnJlc29sdmUoKSxjLnByb21pc2V9ZnVuY3Rpb24gcShhLGIpe3ZhciBjPXlhW2EubmFtZV0sZD1jLmRlZmVycmVkT3BlcmF0aW9ucy5wb3AoKTtpZihkKXJldHVybiBkLnJlamVjdChiKSxkLnByb21pc2V9ZnVuY3Rpb24gcihhLGIpe3JldHVybiBuZXcgdmEoZnVuY3Rpb24oYyxkKXtpZih5YVthLm5hbWVdPXlhW2EubmFtZV18fEIoKSxhLmRiKXtpZighYilyZXR1cm4gYyhhLmRiKTtvKGEpLGEuZGIuY2xvc2UoKX12YXIgZT1bYS5uYW1lXTtiJiZlLnB1c2goYS52ZXJzaW9uKTt2YXIgZj11YS5vcGVuLmFwcGx5KHVhLGUpO2ImJihmLm9udXBncmFkZW5lZWRlZD1mdW5jdGlvbihiKXt2YXIgYz1mLnJlc3VsdDt0cnl7Yy5jcmVhdGVPYmplY3RTdG9yZShhLnN0b3JlTmFtZSksYi5vbGRWZXJzaW9uPD0xJiZjLmNyZWF0ZU9iamVjdFN0b3JlKHdhKX1jYXRjaChjKXtpZigiQ29uc3RyYWludEVycm9yIiE9PWMubmFtZSl0aHJvdyBjO2NvbnNvbGUud2FybignVGhlIGRhdGFiYXNlICInK2EubmFtZSsnIiBoYXMgYmVlbiB1cGdyYWRlZCBmcm9tIHZlcnNpb24gJytiLm9sZFZlcnNpb24rIiB0byB2ZXJzaW9uICIrYi5uZXdWZXJzaW9uKycsIGJ1dCB0aGUgc3RvcmFnZSAiJythLnN0b3JlTmFtZSsnIiBhbHJlYWR5IGV4aXN0cy4nKX19KSxmLm9uZXJyb3I9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpLGQoZi5lcnJvcil9LGYub25zdWNjZXNzPWZ1bmN0aW9uKCl7YyhmLnJlc3VsdCkscChhKX19KX1mdW5jdGlvbiBzKGEpe3JldHVybiByKGEsITEpfWZ1bmN0aW9uIHQoYSl7cmV0dXJuIHIoYSwhMCl9ZnVuY3Rpb24gdShhLGIpe2lmKCFhLmRiKXJldHVybiEwO3ZhciBjPSFhLmRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoYS5zdG9yZU5hbWUpLGQ9YS52ZXJzaW9uPGEuZGIudmVyc2lvbixlPWEudmVyc2lvbj5hLmRiLnZlcnNpb247aWYoZCYmKGEudmVyc2lvbiE9PWImJmNvbnNvbGUud2FybignVGhlIGRhdGFiYXNlICInK2EubmFtZSsiXCIgY2FuJ3QgYmUgZG93bmdyYWRlZCBmcm9tIHZlcnNpb24gIithLmRiLnZlcnNpb24rIiB0byB2ZXJzaW9uICIrYS52ZXJzaW9uKyIuIiksYS52ZXJzaW9uPWEuZGIudmVyc2lvbiksZXx8Yyl7aWYoYyl7dmFyIGY9YS5kYi52ZXJzaW9uKzE7Zj5hLnZlcnNpb24mJihhLnZlcnNpb249Zil9cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gdihhKXtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IEZpbGVSZWFkZXI7ZC5vbmVycm9yPWMsZC5vbmxvYWRlbmQ9ZnVuY3Rpb24oYyl7dmFyIGQ9YnRvYShjLnRhcmdldC5yZXN1bHR8fCIiKTtiKHtfX2xvY2FsX2ZvcmFnZV9lbmNvZGVkX2Jsb2I6ITAsZGF0YTpkLHR5cGU6YS50eXBlfSl9LGQucmVhZEFzQmluYXJ5U3RyaW5nKGEpfSl9ZnVuY3Rpb24gdyhhKXtyZXR1cm4gZyhbbChhdG9iKGEuZGF0YSkpXSx7dHlwZTphLnR5cGV9KX1mdW5jdGlvbiB4KGEpe3JldHVybiBhJiZhLl9fbG9jYWxfZm9yYWdlX2VuY29kZWRfYmxvYn1mdW5jdGlvbiB5KGEpe3ZhciBiPXRoaXMsYz1iLl9pbml0UmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGE9eWFbYi5fZGJJbmZvLm5hbWVdO2lmKGEmJmEuZGJSZWFkeSlyZXR1cm4gYS5kYlJlYWR5fSk7cmV0dXJuIGkoYyxhLGEpLGN9ZnVuY3Rpb24geihhKXtvKGEpO2Zvcih2YXIgYj15YVthLm5hbWVdLGM9Yi5mb3JhZ2VzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTtlLl9kYkluZm8uZGImJihlLl9kYkluZm8uZGIuY2xvc2UoKSxlLl9kYkluZm8uZGI9bnVsbCl9cmV0dXJuIGEuZGI9bnVsbCxzKGEpLnRoZW4oZnVuY3Rpb24oYil7cmV0dXJuIGEuZGI9Yix1KGEpP3QoYSk6Yn0pLnRoZW4oZnVuY3Rpb24oZCl7YS5kYj1iLmRiPWQ7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspY1tlXS5fZGJJbmZvLmRiPWR9KS5jYXRjaChmdW5jdGlvbihiKXt0aHJvdyBxKGEsYiksYn0pfWZ1bmN0aW9uIEEoYSxiLGMsZCl7dm9pZCAwPT09ZCYmKGQ9MSk7dHJ5e3ZhciBlPWEuZGIudHJhbnNhY3Rpb24oYS5zdG9yZU5hbWUsYik7YyhudWxsLGUpfWNhdGNoKGUpe2lmKGQ+MCYmKCFhLmRifHwiSW52YWxpZFN0YXRlRXJyb3IiPT09ZS5uYW1lfHwiTm90Rm91bmRFcnJvciI9PT1lLm5hbWUpKXJldHVybiB2YS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe2lmKCFhLmRifHwiTm90Rm91bmRFcnJvciI9PT1lLm5hbWUmJiFhLmRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoYS5zdG9yZU5hbWUpJiZhLnZlcnNpb248PWEuZGIudmVyc2lvbilyZXR1cm4gYS5kYiYmKGEudmVyc2lvbj1hLmRiLnZlcnNpb24rMSksdChhKX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geihhKS50aGVuKGZ1bmN0aW9uKCl7QShhLGIsYyxkLTEpfSl9KS5jYXRjaChjKTtjKGUpfX1mdW5jdGlvbiBCKCl7cmV0dXJue2ZvcmFnZXM6W10sZGI6bnVsbCxkYlJlYWR5Om51bGwsZGVmZXJyZWRPcGVyYXRpb25zOltdfX1mdW5jdGlvbiBDKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gdmEucmVzb2x2ZSgpfXZhciBjPXRoaXMsZD17ZGI6bnVsbH07aWYoYSlmb3IodmFyIGUgaW4gYSlkW2VdPWFbZV07dmFyIGY9eWFbZC5uYW1lXTtmfHwoZj1CKCkseWFbZC5uYW1lXT1mKSxmLmZvcmFnZXMucHVzaChjKSxjLl9pbml0UmVhZHl8fChjLl9pbml0UmVhZHk9Yy5yZWFkeSxjLnJlYWR5PXkpO2Zvcih2YXIgZz1bXSxoPTA7aDxmLmZvcmFnZXMubGVuZ3RoO2grKyl7dmFyIGk9Zi5mb3JhZ2VzW2hdO2khPT1jJiZnLnB1c2goaS5faW5pdFJlYWR5KCkuY2F0Y2goYikpfXZhciBqPWYuZm9yYWdlcy5zbGljZSgwKTtyZXR1cm4gdmEuYWxsKGcpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZC5kYj1mLmRiLHMoZCl9KS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBkLmRiPWEsdShkLGMuX2RlZmF1bHRDb25maWcudmVyc2lvbik/dChkKTphfSkudGhlbihmdW5jdGlvbihhKXtkLmRiPWYuZGI9YSxjLl9kYkluZm89ZDtmb3IodmFyIGI9MDtiPGoubGVuZ3RoO2IrKyl7dmFyIGU9altiXTtlIT09YyYmKGUuX2RiSW5mby5kYj1kLmRiLGUuX2RiSW5mby52ZXJzaW9uPWQudmVyc2lvbil9fSl9ZnVuY3Rpb24gRChhLGIpe3ZhciBjPXRoaXM7YT1qKGEpO3ZhciBkPW5ldyB2YShmdW5jdGlvbihiLGQpe2MucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7QShjLl9kYkluZm8sQWEsZnVuY3Rpb24oZSxmKXtpZihlKXJldHVybiBkKGUpO3RyeXt2YXIgZz1mLm9iamVjdFN0b3JlKGMuX2RiSW5mby5zdG9yZU5hbWUpLGg9Zy5nZXQoYSk7aC5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYT1oLnJlc3VsdDt2b2lkIDA9PT1hJiYoYT1udWxsKSx4KGEpJiYoYT13KGEpKSxiKGEpfSxoLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKGguZXJyb3IpfX1jYXRjaChhKXtkKGEpfX0pfSkuY2F0Y2goZCl9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gRShhLGIpe3ZhciBjPXRoaXMsZD1uZXcgdmEoZnVuY3Rpb24oYixkKXtjLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe0EoYy5fZGJJbmZvLEFhLGZ1bmN0aW9uKGUsZil7aWYoZSlyZXR1cm4gZChlKTt0cnl7dmFyIGc9Zi5vYmplY3RTdG9yZShjLl9kYkluZm8uc3RvcmVOYW1lKSxoPWcub3BlbkN1cnNvcigpLGk9MTtoLm9uc3VjY2Vzcz1mdW5jdGlvbigpe3ZhciBjPWgucmVzdWx0O2lmKGMpe3ZhciBkPWMudmFsdWU7eChkKSYmKGQ9dyhkKSk7dmFyIGU9YShkLGMua2V5LGkrKyk7dm9pZCAwIT09ZT9iKGUpOmMuY29udGludWUoKX1lbHNlIGIoKX0saC5vbmVycm9yPWZ1bmN0aW9uKCl7ZChoLmVycm9yKX19Y2F0Y2goYSl7ZChhKX19KX0pLmNhdGNoKGQpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIEYoYSxiLGMpe3ZhciBkPXRoaXM7YT1qKGEpO3ZhciBlPW5ldyB2YShmdW5jdGlvbihjLGUpe3ZhciBmO2QucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGY9ZC5fZGJJbmZvLCJbb2JqZWN0IEJsb2JdIj09PXphLmNhbGwoYik/bihmLmRiKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBhP2I6dihiKX0pOmJ9KS50aGVuKGZ1bmN0aW9uKGIpe0EoZC5fZGJJbmZvLEJhLGZ1bmN0aW9uKGYsZyl7aWYoZilyZXR1cm4gZShmKTt0cnl7dmFyIGg9Zy5vYmplY3RTdG9yZShkLl9kYkluZm8uc3RvcmVOYW1lKTtudWxsPT09YiYmKGI9dm9pZCAwKTt2YXIgaT1oLnB1dChiLGEpO2cub25jb21wbGV0ZT1mdW5jdGlvbigpe3ZvaWQgMD09PWImJihiPW51bGwpLGMoYil9LGcub25hYm9ydD1nLm9uZXJyb3I9ZnVuY3Rpb24oKXt2YXIgYT1pLmVycm9yP2kuZXJyb3I6aS50cmFuc2FjdGlvbi5lcnJvcjtlKGEpfX1jYXRjaChhKXtlKGEpfX0pfSkuY2F0Y2goZSl9KTtyZXR1cm4gaChlLGMpLGV9ZnVuY3Rpb24gRyhhLGIpe3ZhciBjPXRoaXM7YT1qKGEpO3ZhciBkPW5ldyB2YShmdW5jdGlvbihiLGQpe2MucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7QShjLl9kYkluZm8sQmEsZnVuY3Rpb24oZSxmKXtpZihlKXJldHVybiBkKGUpO3RyeXt2YXIgZz1mLm9iamVjdFN0b3JlKGMuX2RiSW5mby5zdG9yZU5hbWUpLGg9Zy5kZWxldGUoYSk7Zi5vbmNvbXBsZXRlPWZ1bmN0aW9uKCl7YigpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKGguZXJyb3IpfSxmLm9uYWJvcnQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmVycm9yP2guZXJyb3I6aC50cmFuc2FjdGlvbi5lcnJvcjtkKGEpfX1jYXRjaChhKXtkKGEpfX0pfSkuY2F0Y2goZCl9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gSChhKXt2YXIgYj10aGlzLGM9bmV3IHZhKGZ1bmN0aW9uKGEsYyl7Yi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXtBKGIuX2RiSW5mbyxCYSxmdW5jdGlvbihkLGUpe2lmKGQpcmV0dXJuIGMoZCk7dHJ5e3ZhciBmPWUub2JqZWN0U3RvcmUoYi5fZGJJbmZvLnN0b3JlTmFtZSksZz1mLmNsZWFyKCk7ZS5vbmNvbXBsZXRlPWZ1bmN0aW9uKCl7YSgpfSxlLm9uYWJvcnQ9ZS5vbmVycm9yPWZ1bmN0aW9uKCl7dmFyIGE9Zy5lcnJvcj9nLmVycm9yOmcudHJhbnNhY3Rpb24uZXJyb3I7YyhhKX19Y2F0Y2goYSl7YyhhKX19KX0pLmNhdGNoKGMpfSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIEkoYSl7dmFyIGI9dGhpcyxjPW5ldyB2YShmdW5jdGlvbihhLGMpe2IucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7QShiLl9kYkluZm8sQWEsZnVuY3Rpb24oZCxlKXtpZihkKXJldHVybiBjKGQpO3RyeXt2YXIgZj1lLm9iamVjdFN0b3JlKGIuX2RiSW5mby5zdG9yZU5hbWUpLGc9Zi5jb3VudCgpO2cub25zdWNjZXNzPWZ1bmN0aW9uKCl7YShnLnJlc3VsdCl9LGcub25lcnJvcj1mdW5jdGlvbigpe2MoZy5lcnJvcil9fWNhdGNoKGEpe2MoYSl9fSl9KS5jYXRjaChjKX0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiBKKGEsYil7dmFyIGM9dGhpcyxkPW5ldyB2YShmdW5jdGlvbihiLGQpe2lmKGE8MClyZXR1cm4gdm9pZCBiKG51bGwpO2MucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7QShjLl9kYkluZm8sQWEsZnVuY3Rpb24oZSxmKXtpZihlKXJldHVybiBkKGUpO3RyeXt2YXIgZz1mLm9iamVjdFN0b3JlKGMuX2RiSW5mby5zdG9yZU5hbWUpLGg9ITEsaT1nLm9wZW5DdXJzb3IoKTtpLm9uc3VjY2Vzcz1mdW5jdGlvbigpe3ZhciBjPWkucmVzdWx0O2lmKCFjKXJldHVybiB2b2lkIGIobnVsbCk7MD09PWE/YihjLmtleSk6aD9iKGMua2V5KTooaD0hMCxjLmFkdmFuY2UoYSkpfSxpLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKGkuZXJyb3IpfX1jYXRjaChhKXtkKGEpfX0pfSkuY2F0Y2goZCl9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gSyhhKXt2YXIgYj10aGlzLGM9bmV3IHZhKGZ1bmN0aW9uKGEsYyl7Yi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXtBKGIuX2RiSW5mbyxBYSxmdW5jdGlvbihkLGUpe2lmKGQpcmV0dXJuIGMoZCk7dHJ5e3ZhciBmPWUub2JqZWN0U3RvcmUoYi5fZGJJbmZvLnN0b3JlTmFtZSksZz1mLm9wZW5DdXJzb3IoKSxoPVtdO2cub25zdWNjZXNzPWZ1bmN0aW9uKCl7dmFyIGI9Zy5yZXN1bHQ7aWYoIWIpcmV0dXJuIHZvaWQgYShoKTtoLnB1c2goYi5rZXkpLGIuY29udGludWUoKX0sZy5vbmVycm9yPWZ1bmN0aW9uKCl7YyhnLmVycm9yKX19Y2F0Y2goYSl7YyhhKX19KX0pLmNhdGNoKGMpfSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIEwoYSxiKXtiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBjPXRoaXMuY29uZmlnKCk7YT0iZnVuY3Rpb24iIT10eXBlb2YgYSYmYXx8e30sYS5uYW1lfHwoYS5uYW1lPWEubmFtZXx8Yy5uYW1lLGEuc3RvcmVOYW1lPWEuc3RvcmVOYW1lfHxjLnN0b3JlTmFtZSk7dmFyIGQsZT10aGlzO2lmKGEubmFtZSl7dmFyIGY9YS5uYW1lPT09Yy5uYW1lJiZlLl9kYkluZm8uZGIsZz1mP3ZhLnJlc29sdmUoZS5fZGJJbmZvLmRiKTpzKGEpLnRoZW4oZnVuY3Rpb24oYil7dmFyIGM9eWFbYS5uYW1lXSxkPWMuZm9yYWdlcztjLmRiPWI7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZFtlXS5fZGJJbmZvLmRiPWI7cmV0dXJuIGJ9KTtkPWEuc3RvcmVOYW1lP2cudGhlbihmdW5jdGlvbihiKXtpZihiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoYS5zdG9yZU5hbWUpKXt2YXIgYz1iLnZlcnNpb24rMTtvKGEpO3ZhciBkPXlhW2EubmFtZV0sZT1kLmZvcmFnZXM7Yi5jbG9zZSgpO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2cuX2RiSW5mby5kYj1udWxsLGcuX2RiSW5mby52ZXJzaW9uPWN9cmV0dXJuIG5ldyB2YShmdW5jdGlvbihiLGQpe3ZhciBlPXVhLm9wZW4oYS5uYW1lLGMpO2Uub25lcnJvcj1mdW5jdGlvbihhKXtlLnJlc3VsdC5jbG9zZSgpLGQoYSl9LGUub251cGdyYWRlbmVlZGVkPWZ1bmN0aW9uKCl7ZS5yZXN1bHQuZGVsZXRlT2JqZWN0U3RvcmUoYS5zdG9yZU5hbWUpfSxlLm9uc3VjY2Vzcz1mdW5jdGlvbigpe3ZhciBhPWUucmVzdWx0O2EuY2xvc2UoKSxiKGEpfX0pLnRoZW4oZnVuY3Rpb24oYSl7ZC5kYj1hO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKXt2YXIgYz1lW2JdO2MuX2RiSW5mby5kYj1hLHAoYy5fZGJJbmZvKX19KS5jYXRjaChmdW5jdGlvbihiKXt0aHJvdyhxKGEsYil8fHZhLnJlc29sdmUoKSkuY2F0Y2goZnVuY3Rpb24oKXt9KSxifSl9fSk6Zy50aGVuKGZ1bmN0aW9uKGIpe28oYSk7dmFyIGM9eWFbYS5uYW1lXSxkPWMuZm9yYWdlcztiLmNsb3NlKCk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2RbZV0uX2RiSW5mby5kYj1udWxsfXJldHVybiBuZXcgdmEoZnVuY3Rpb24oYixjKXt2YXIgZD11YS5kZWxldGVEYXRhYmFzZShhLm5hbWUpO2Qub25lcnJvcj1kLm9uYmxvY2tlZD1mdW5jdGlvbihhKXt2YXIgYj1kLnJlc3VsdDtiJiZiLmNsb3NlKCksYyhhKX0sZC5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYT1kLnJlc3VsdDthJiZhLmNsb3NlKCksYihhKX19KS50aGVuKGZ1bmN0aW9uKGEpe2MuZGI9YTtmb3IodmFyIGI9MDtiPGQubGVuZ3RoO2IrKylwKGRbYl0uX2RiSW5mbyl9KS5jYXRjaChmdW5jdGlvbihiKXt0aHJvdyhxKGEsYil8fHZhLnJlc29sdmUoKSkuY2F0Y2goZnVuY3Rpb24oKXt9KSxifSl9KX1lbHNlIGQ9dmEucmVqZWN0KCJJbnZhbGlkIGFyZ3VtZW50cyIpO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBNKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG9wZW5EYXRhYmFzZX1mdW5jdGlvbiBOKGEpe3ZhciBiLGMsZCxlLGYsZz0uNzUqYS5sZW5ndGgsaD1hLmxlbmd0aCxpPTA7Ij0iPT09YVthLmxlbmd0aC0xXSYmKGctLSwiPSI9PT1hW2EubGVuZ3RoLTJdJiZnLS0pO3ZhciBqPW5ldyBBcnJheUJ1ZmZlcihnKSxrPW5ldyBVaW50OEFycmF5KGopO2ZvcihiPTA7YjxoO2IrPTQpYz1EYS5pbmRleE9mKGFbYl0pLGQ9RGEuaW5kZXhPZihhW2IrMV0pLGU9RGEuaW5kZXhPZihhW2IrMl0pLGY9RGEuaW5kZXhPZihhW2IrM10pLGtbaSsrXT1jPDwyfGQ+PjQsa1tpKytdPSgxNSZkKTw8NHxlPj4yLGtbaSsrXT0oMyZlKTw8Nnw2MyZmO3JldHVybiBqfWZ1bmN0aW9uIE8oYSl7dmFyIGIsYz1uZXcgVWludDhBcnJheShhKSxkPSIiO2ZvcihiPTA7YjxjLmxlbmd0aDtiKz0zKWQrPURhW2NbYl0+PjJdLGQrPURhWygzJmNbYl0pPDw0fGNbYisxXT4+NF0sZCs9RGFbKDE1JmNbYisxXSk8PDJ8Y1tiKzJdPj42XSxkKz1EYVs2MyZjW2IrMl1dO3JldHVybiBjLmxlbmd0aCUzPT0yP2Q9ZC5zdWJzdHJpbmcoMCxkLmxlbmd0aC0xKSsiPSI6Yy5sZW5ndGglMz09MSYmKGQ9ZC5zdWJzdHJpbmcoMCxkLmxlbmd0aC0yKSsiPT0iKSxkfWZ1bmN0aW9uIFAoYSxiKXt2YXIgYz0iIjtpZihhJiYoYz1VYS5jYWxsKGEpKSxhJiYoIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PWN8fGEuYnVmZmVyJiYiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09VWEuY2FsbChhLmJ1ZmZlcikpKXt2YXIgZCxlPUdhO2EgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj8oZD1hLGUrPUlhKTooZD1hLmJ1ZmZlciwiW29iamVjdCBJbnQ4QXJyYXldIj09PWM/ZSs9S2E6IltvYmplY3QgVWludDhBcnJheV0iPT09Yz9lKz1MYToiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iPT09Yz9lKz1NYToiW29iamVjdCBJbnQxNkFycmF5XSI9PT1jP2UrPU5hOiJbb2JqZWN0IFVpbnQxNkFycmF5XSI9PT1jP2UrPVBhOiJbb2JqZWN0IEludDMyQXJyYXldIj09PWM/ZSs9T2E6IltvYmplY3QgVWludDMyQXJyYXldIj09PWM/ZSs9UWE6IltvYmplY3QgRmxvYXQzMkFycmF5XSI9PT1jP2UrPVJhOiJbb2JqZWN0IEZsb2F0NjRBcnJheV0iPT09Yz9lKz1TYTpiKG5ldyBFcnJvcigiRmFpbGVkIHRvIGdldCB0eXBlIGZvciBCaW5hcnlBcnJheSIpKSksYihlK08oZCkpfWVsc2UgaWYoIltvYmplY3QgQmxvYl0iPT09Yyl7dmFyIGY9bmV3IEZpbGVSZWFkZXI7Zi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYz1FYSthLnR5cGUrIn4iK08odGhpcy5yZXN1bHQpO2IoR2ErSmErYyl9LGYucmVhZEFzQXJyYXlCdWZmZXIoYSl9ZWxzZSB0cnl7YihKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYyl7Y29uc29sZS5lcnJvcigiQ291bGRuJ3QgY29udmVydCB2YWx1ZSBpbnRvIGEgSlNPTiBzdHJpbmc6ICIsYSksYihudWxsLGMpfX1mdW5jdGlvbiBRKGEpe2lmKGEuc3Vic3RyaW5nKDAsSGEpIT09R2EpcmV0dXJuIEpTT04ucGFyc2UoYSk7dmFyIGIsYz1hLnN1YnN0cmluZyhUYSksZD1hLnN1YnN0cmluZyhIYSxUYSk7aWYoZD09PUphJiZGYS50ZXN0KGMpKXt2YXIgZT1jLm1hdGNoKEZhKTtiPWVbMV0sYz1jLnN1YnN0cmluZyhlWzBdLmxlbmd0aCl9dmFyIGY9TihjKTtzd2l0Y2goZCl7Y2FzZSBJYTpyZXR1cm4gZjtjYXNlIEphOnJldHVybiBnKFtmXSx7dHlwZTpifSk7Y2FzZSBLYTpyZXR1cm4gbmV3IEludDhBcnJheShmKTtjYXNlIExhOnJldHVybiBuZXcgVWludDhBcnJheShmKTtjYXNlIE1hOnJldHVybiBuZXcgVWludDhDbGFtcGVkQXJyYXkoZik7Y2FzZSBOYTpyZXR1cm4gbmV3IEludDE2QXJyYXkoZik7Y2FzZSBQYTpyZXR1cm4gbmV3IFVpbnQxNkFycmF5KGYpO2Nhc2UgT2E6cmV0dXJuIG5ldyBJbnQzMkFycmF5KGYpO2Nhc2UgUWE6cmV0dXJuIG5ldyBVaW50MzJBcnJheShmKTtjYXNlIFJhOnJldHVybiBuZXcgRmxvYXQzMkFycmF5KGYpO2Nhc2UgU2E6cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoZik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua293biB0eXBlOiAiK2QpfX1mdW5jdGlvbiBSKGEsYixjLGQpe2EuZXhlY3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgIitiLnN0b3JlTmFtZSsiIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBrZXkgdW5pcXVlLCB2YWx1ZSkiLFtdLGMsZCl9ZnVuY3Rpb24gUyhhKXt2YXIgYj10aGlzLGM9e2RiOm51bGx9O2lmKGEpZm9yKHZhciBkIGluIGEpY1tkXT0ic3RyaW5nIiE9dHlwZW9mIGFbZF0/YVtkXS50b1N0cmluZygpOmFbZF07dmFyIGU9bmV3IHZhKGZ1bmN0aW9uKGEsZCl7dHJ5e2MuZGI9b3BlbkRhdGFiYXNlKGMubmFtZSxTdHJpbmcoYy52ZXJzaW9uKSxjLmRlc2NyaXB0aW9uLGMuc2l6ZSl9Y2F0Y2goYSl7cmV0dXJuIGQoYSl9Yy5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihlKXtSKGUsYyxmdW5jdGlvbigpe2IuX2RiSW5mbz1jLGEoKX0sZnVuY3Rpb24oYSxiKXtkKGIpfSl9LGQpfSk7cmV0dXJuIGMuc2VyaWFsaXplcj1WYSxlfWZ1bmN0aW9uIFQoYSxiLGMsZCxlLGYpe2EuZXhlY3V0ZVNxbChjLGQsZSxmdW5jdGlvbihhLGcpe2cuY29kZT09PWcuU1lOVEFYX0VSUj9hLmV4ZWN1dGVTcWwoIlNFTEVDVCBuYW1lIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSB0eXBlPSd0YWJsZScgQU5EIG5hbWUgPSA/IixbYi5zdG9yZU5hbWVdLGZ1bmN0aW9uKGEsaCl7aC5yb3dzLmxlbmd0aD9mKGEsZyk6UihhLGIsZnVuY3Rpb24oKXthLmV4ZWN1dGVTcWwoYyxkLGUsZil9LGYpfSxmKTpmKGEsZyl9LGYpfWZ1bmN0aW9uIFUoYSxiKXt2YXIgYz10aGlzO2E9aihhKTt2YXIgZD1uZXcgdmEoZnVuY3Rpb24oYixkKXtjLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZhciBlPWMuX2RiSW5mbztlLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKGMpe1QoYyxlLCJTRUxFQ1QgKiBGUk9NICIrZS5zdG9yZU5hbWUrIiBXSEVSRSBrZXkgPSA/IExJTUlUIDEiLFthXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMucm93cy5sZW5ndGg/Yy5yb3dzLml0ZW0oMCkudmFsdWU6bnVsbDtkJiYoZD1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZCkpLGIoZCl9LGZ1bmN0aW9uKGEsYil7ZChiKX0pfSl9KS5jYXRjaChkKX0pO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBWKGEsYil7dmFyIGM9dGhpcyxkPW5ldyB2YShmdW5jdGlvbihiLGQpe2MucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGU9Yy5fZGJJbmZvO2UuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oYyl7VChjLGUsIlNFTEVDVCAqIEZST00gIitlLnN0b3JlTmFtZSxbXSxmdW5jdGlvbihjLGQpe2Zvcih2YXIgZj1kLnJvd3MsZz1mLmxlbmd0aCxoPTA7aDxnO2grKyl7dmFyIGk9Zi5pdGVtKGgpLGo9aS52YWx1ZTtpZihqJiYoaj1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaikpLHZvaWQgMCE9PShqPWEoaixpLmtleSxoKzEpKSlyZXR1cm4gdm9pZCBiKGopfWIoKX0sZnVuY3Rpb24oYSxiKXtkKGIpfSl9KX0pLmNhdGNoKGQpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIFcoYSxiLGMsZCl7dmFyIGU9dGhpczthPWooYSk7dmFyIGY9bmV3IHZhKGZ1bmN0aW9uKGYsZyl7ZS5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2YXIgaD1iLGk9ZS5fZGJJbmZvO2kuc2VyaWFsaXplci5zZXJpYWxpemUoYixmdW5jdGlvbihiLGope2o/ZyhqKTppLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKGMpe1QoYyxpLCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICIraS5zdG9yZU5hbWUrIiAoa2V5LCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIsW2EsYl0sZnVuY3Rpb24oKXtmKGgpfSxmdW5jdGlvbihhLGIpe2coYil9KX0sZnVuY3Rpb24oYil7aWYoYi5jb2RlPT09Yi5RVU9UQV9FUlIpe2lmKGQ+MClyZXR1cm4gdm9pZCBmKFcuYXBwbHkoZSxbYSxoLGMsZC0xXSkpO2coYil9fSl9KX0pLmNhdGNoKGcpfSk7cmV0dXJuIGgoZixjKSxmfWZ1bmN0aW9uIFgoYSxiLGMpe3JldHVybiBXLmFwcGx5KHRoaXMsW2EsYixjLDFdKX1mdW5jdGlvbiBZKGEsYil7dmFyIGM9dGhpczthPWooYSk7dmFyIGQ9bmV3IHZhKGZ1bmN0aW9uKGIsZCl7Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZT1jLl9kYkluZm87ZS5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihjKXtUKGMsZSwiREVMRVRFIEZST00gIitlLnN0b3JlTmFtZSsiIFdIRVJFIGtleSA9ID8iLFthXSxmdW5jdGlvbigpe2IoKX0sZnVuY3Rpb24oYSxiKXtkKGIpfSl9KX0pLmNhdGNoKGQpfSk7cmV0dXJuIGgoZCxiKSxkfWZ1bmN0aW9uIFooYSl7dmFyIGI9dGhpcyxjPW5ldyB2YShmdW5jdGlvbihhLGMpe2IucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dmFyIGQ9Yi5fZGJJbmZvO2QuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24oYil7VChiLGQsIkRFTEVURSBGUk9NICIrZC5zdG9yZU5hbWUsW10sZnVuY3Rpb24oKXthKCl9LGZ1bmN0aW9uKGEsYil7YyhiKX0pfSl9KS5jYXRjaChjKX0pO3JldHVybiBoKGMsYSksY31mdW5jdGlvbiAkKGEpe3ZhciBiPXRoaXMsYz1uZXcgdmEoZnVuY3Rpb24oYSxjKXtiLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZhciBkPWIuX2RiSW5mbztkLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKGIpe1QoYixkLCJTRUxFQ1QgQ09VTlQoa2V5KSBhcyBjIEZST00gIitkLnN0b3JlTmFtZSxbXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMucm93cy5pdGVtKDApLmM7YShkKX0sZnVuY3Rpb24oYSxiKXtjKGIpfSl9KX0pLmNhdGNoKGMpfSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIF8oYSxiKXt2YXIgYz10aGlzLGQ9bmV3IHZhKGZ1bmN0aW9uKGIsZCl7Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZT1jLl9kYkluZm87ZS5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihjKXtUKGMsZSwiU0VMRUNUIGtleSBGUk9NICIrZS5zdG9yZU5hbWUrIiBXSEVSRSBpZCA9ID8gTElNSVQgMSIsW2ErMV0sZnVuY3Rpb24oYSxjKXt2YXIgZD1jLnJvd3MubGVuZ3RoP2Mucm93cy5pdGVtKDApLmtleTpudWxsO2IoZCl9LGZ1bmN0aW9uKGEsYil7ZChiKX0pfSl9KS5jYXRjaChkKX0pO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBhYShhKXt2YXIgYj10aGlzLGM9bmV3IHZhKGZ1bmN0aW9uKGEsYyl7Yi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZD1iLl9kYkluZm87ZC5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihiKXtUKGIsZCwiU0VMRUNUIGtleSBGUk9NICIrZC5zdG9yZU5hbWUsW10sZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yy5yb3dzLmxlbmd0aDtlKyspZC5wdXNoKGMucm93cy5pdGVtKGUpLmtleSk7YShkKX0sZnVuY3Rpb24oYSxiKXtjKGIpfSl9KX0pLmNhdGNoKGMpfSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIGJhKGEpe3JldHVybiBuZXcgdmEoZnVuY3Rpb24oYixjKXthLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKGQpe2QuZXhlY3V0ZVNxbCgiU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyIFdIRVJFIHR5cGU9J3RhYmxlJyBBTkQgbmFtZSA8PiAnX19XZWJLaXREYXRhYmFzZUluZm9UYWJsZV9fJyIsW10sZnVuY3Rpb24oYyxkKXtmb3IodmFyIGU9W10sZj0wO2Y8ZC5yb3dzLmxlbmd0aDtmKyspZS5wdXNoKGQucm93cy5pdGVtKGYpLm5hbWUpO2Ioe2RiOmEsc3RvcmVOYW1lczplfSl9LGZ1bmN0aW9uKGEsYil7YyhiKX0pfSxmdW5jdGlvbihhKXtjKGEpfSl9KX1mdW5jdGlvbiBjYShhLGIpe2I9ay5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGM9dGhpcy5jb25maWcoKTthPSJmdW5jdGlvbiIhPXR5cGVvZiBhJiZhfHx7fSxhLm5hbWV8fChhLm5hbWU9YS5uYW1lfHxjLm5hbWUsYS5zdG9yZU5hbWU9YS5zdG9yZU5hbWV8fGMuc3RvcmVOYW1lKTt2YXIgZCxlPXRoaXM7cmV0dXJuIGQ9YS5uYW1lP25ldyB2YShmdW5jdGlvbihiKXt2YXIgZDtkPWEubmFtZT09PWMubmFtZT9lLl9kYkluZm8uZGI6b3BlbkRhdGFiYXNlKGEubmFtZSwiIiwiIiwwKSxiKGEuc3RvcmVOYW1lP3tkYjpkLHN0b3JlTmFtZXM6W2Euc3RvcmVOYW1lXX06YmEoZCkpfSkudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGIsYyl7YS5kYi50cmFuc2FjdGlvbihmdW5jdGlvbihkKXtmdW5jdGlvbiBlKGEpe3JldHVybiBuZXcgdmEoZnVuY3Rpb24oYixjKXtkLmV4ZWN1dGVTcWwoIkRST1AgVEFCTEUgSUYgRVhJU1RTICIrYSxbXSxmdW5jdGlvbigpe2IoKX0sZnVuY3Rpb24oYSxiKXtjKGIpfSl9KX1mb3IodmFyIGY9W10sZz0wLGg9YS5zdG9yZU5hbWVzLmxlbmd0aDtnPGg7ZysrKWYucHVzaChlKGEuc3RvcmVOYW1lc1tnXSkpO3ZhLmFsbChmKS50aGVuKGZ1bmN0aW9uKCl7YigpfSkuY2F0Y2goZnVuY3Rpb24oYSl7YyhhKX0pfSxmdW5jdGlvbihhKXtjKGEpfSl9KX0pOnZhLnJlamVjdCgiSW52YWxpZCBhcmd1bWVudHMiKSxoKGQsYiksZH1mdW5jdGlvbiBkYSgpe3RyeXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGxvY2FsU3RvcmFnZSYmInNldEl0ZW0iaW4gbG9jYWxTdG9yYWdlJiYhIWxvY2FsU3RvcmFnZS5zZXRJdGVtfWNhdGNoKGEpe3JldHVybiExfX1mdW5jdGlvbiBlYShhLGIpe3ZhciBjPWEubmFtZSsiLyI7cmV0dXJuIGEuc3RvcmVOYW1lIT09Yi5zdG9yZU5hbWUmJihjKz1hLnN0b3JlTmFtZSsiLyIpLGN9ZnVuY3Rpb24gZmEoKXt2YXIgYT0iX2xvY2FsZm9yYWdlX3N1cHBvcnRfdGVzdCI7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShhLCEwKSxsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShhKSwhMX1jYXRjaChhKXtyZXR1cm4hMH19ZnVuY3Rpb24gZ2EoKXtyZXR1cm4hZmEoKXx8bG9jYWxTdG9yYWdlLmxlbmd0aD4wfWZ1bmN0aW9uIGhhKGEpe3ZhciBiPXRoaXMsYz17fTtpZihhKWZvcih2YXIgZCBpbiBhKWNbZF09YVtkXTtyZXR1cm4gYy5rZXlQcmVmaXg9ZWEoYSxiLl9kZWZhdWx0Q29uZmlnKSxnYSgpPyhiLl9kYkluZm89YyxjLnNlcmlhbGl6ZXI9VmEsdmEucmVzb2x2ZSgpKTp2YS5yZWplY3QoKX1mdW5jdGlvbiBpYShhKXt2YXIgYj10aGlzLGM9Yi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXtmb3IodmFyIGE9Yi5fZGJJbmZvLmtleVByZWZpeCxjPWxvY2FsU3RvcmFnZS5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGQ9bG9jYWxTdG9yYWdlLmtleShjKTswPT09ZC5pbmRleE9mKGEpJiZsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShkKX19KTtyZXR1cm4gaChjLGEpLGN9ZnVuY3Rpb24gamEoYSxiKXt2YXIgYz10aGlzO2E9aihhKTt2YXIgZD1jLnJlYWR5KCkudGhlbihmdW5jdGlvbigpe3ZhciBiPWMuX2RiSW5mbyxkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKGIua2V5UHJlZml4K2EpO3JldHVybiBkJiYoZD1iLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZCkpLGR9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz10aGlzLGQ9Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXtmb3IodmFyIGI9Yy5fZGJJbmZvLGQ9Yi5rZXlQcmVmaXgsZT1kLmxlbmd0aCxmPWxvY2FsU3RvcmFnZS5sZW5ndGgsZz0xLGg9MDtoPGY7aCsrKXt2YXIgaT1sb2NhbFN0b3JhZ2Uua2V5KGgpO2lmKDA9PT1pLmluZGV4T2YoZCkpe3ZhciBqPWxvY2FsU3RvcmFnZS5nZXRJdGVtKGkpO2lmKGomJihqPWIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqKSksdm9pZCAwIT09KGo9YShqLGkuc3Vic3RyaW5nKGUpLGcrKykpKXJldHVybiBqfX19KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz10aGlzLGQ9Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgYixkPWMuX2RiSW5mbzt0cnl7Yj1sb2NhbFN0b3JhZ2Uua2V5KGEpfWNhdGNoKGEpe2I9bnVsbH1yZXR1cm4gYiYmKGI9Yi5zdWJzdHJpbmcoZC5rZXlQcmVmaXgubGVuZ3RoKSksYn0pO3JldHVybiBoKGQsYiksZH1mdW5jdGlvbiBtYShhKXt2YXIgYj10aGlzLGM9Yi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXtmb3IodmFyIGE9Yi5fZGJJbmZvLGM9bG9jYWxTdG9yYWdlLmxlbmd0aCxkPVtdLGU9MDtlPGM7ZSsrKXt2YXIgZj1sb2NhbFN0b3JhZ2Uua2V5KGUpOzA9PT1mLmluZGV4T2YoYS5rZXlQcmVmaXgpJiZkLnB1c2goZi5zdWJzdHJpbmcoYS5rZXlQcmVmaXgubGVuZ3RoKSl9cmV0dXJuIGR9KTtyZXR1cm4gaChjLGEpLGN9ZnVuY3Rpb24gbmEoYSl7dmFyIGI9dGhpcyxjPWIua2V5cygpLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSk7cmV0dXJuIGgoYyxhKSxjfWZ1bmN0aW9uIG9hKGEsYil7dmFyIGM9dGhpczthPWooYSk7dmFyIGQ9Yy5yZWFkeSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgYj1jLl9kYkluZm87bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYi5rZXlQcmVmaXgrYSl9KTtyZXR1cm4gaChkLGIpLGR9ZnVuY3Rpb24gcGEoYSxiLGMpe3ZhciBkPXRoaXM7YT1qKGEpO3ZhciBlPWQucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7dm9pZCAwPT09YiYmKGI9bnVsbCk7dmFyIGM9YjtyZXR1cm4gbmV3IHZhKGZ1bmN0aW9uKGUsZil7dmFyIGc9ZC5fZGJJbmZvO2cuc2VyaWFsaXplci5zZXJpYWxpemUoYixmdW5jdGlvbihiLGQpe2lmKGQpZihkKTtlbHNlIHRyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShnLmtleVByZWZpeCthLGIpLGUoYyl9Y2F0Y2goYSl7IlF1b3RhRXhjZWVkZWRFcnJvciIhPT1hLm5hbWUmJiJOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRCIhPT1hLm5hbWV8fGYoYSksZihhKX19KX0pfSk7cmV0dXJuIGgoZSxjKSxlfWZ1bmN0aW9uIHFhKGEsYil7aWYoYj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhPSJmdW5jdGlvbiIhPXR5cGVvZiBhJiZhfHx7fSwhYS5uYW1lKXt2YXIgYz10aGlzLmNvbmZpZygpO2EubmFtZT1hLm5hbWV8fGMubmFtZSxhLnN0b3JlTmFtZT1hLnN0b3JlTmFtZXx8Yy5zdG9yZU5hbWV9dmFyIGQsZT10aGlzO3JldHVybiBkPWEubmFtZT9uZXcgdmEoZnVuY3Rpb24oYil7YihhLnN0b3JlTmFtZT9lYShhLGUuX2RlZmF1bHRDb25maWcpOmEubmFtZSsiLyIpfSkudGhlbihmdW5jdGlvbihhKXtmb3IodmFyIGI9bG9jYWxTdG9yYWdlLmxlbmd0aC0xO2I+PTA7Yi0tKXt2YXIgYz1sb2NhbFN0b3JhZ2Uua2V5KGIpOzA9PT1jLmluZGV4T2YoYSkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGMpfX0pOnZhLnJlamVjdCgiSW52YWxpZCBhcmd1bWVudHMiKSxoKGQsYiksZH1mdW5jdGlvbiByYShhLGIpe2FbYl09ZnVuY3Rpb24oKXt2YXIgYz1hcmd1bWVudHM7cmV0dXJuIGEucmVhZHkoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGFbYl0uYXBwbHkoYSxjKX0pfX1mdW5jdGlvbiBzYSgpe2Zvcih2YXIgYT0xO2E8YXJndW1lbnRzLmxlbmd0aDthKyspe3ZhciBiPWFyZ3VtZW50c1thXTtpZihiKWZvcih2YXIgYyBpbiBiKWIuaGFzT3duUHJvcGVydHkoYykmJigkYShiW2NdKT9hcmd1bWVudHNbMF1bY109YltjXS5zbGljZSgpOmFyZ3VtZW50c1swXVtjXT1iW2NdKX1yZXR1cm4gYXJndW1lbnRzWzBdfXZhciB0YT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGF9OmZ1bmN0aW9uKGEpe3JldHVybiBhJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgYX0sdWE9ZSgpOyJ1bmRlZmluZWQiPT10eXBlb2YgUHJvbWlzZSYmYSgzKTt2YXIgdmE9UHJvbWlzZSx3YT0ibG9jYWwtZm9yYWdlLWRldGVjdC1ibG9iLXN1cHBvcnQiLHhhPXZvaWQgMCx5YT17fSx6YT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEFhPSJyZWFkb25seSIsQmE9InJlYWR3cml0ZSIsQ2E9e19kcml2ZXI6ImFzeW5jU3RvcmFnZSIsX2luaXRTdG9yYWdlOkMsX3N1cHBvcnQ6ZigpLGl0ZXJhdGU6RSxnZXRJdGVtOkQsc2V0SXRlbTpGLHJlbW92ZUl0ZW06RyxjbGVhcjpILGxlbmd0aDpJLGtleTpKLGtleXM6Syxkcm9wSW5zdGFuY2U6TH0sRGE9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLEVhPSJ+fmxvY2FsX2ZvcmFnZV90eXBlfiIsRmE9L15+fmxvY2FsX2ZvcmFnZV90eXBlfihbXn5dKyl+LyxHYT0iX19sZnNjX186IixIYT1HYS5sZW5ndGgsSWE9ImFyYmYiLEphPSJibG9iIixLYT0ic2kwOCIsTGE9InVpMDgiLE1hPSJ1aWM4IixOYT0ic2kxNiIsT2E9InNpMzIiLFBhPSJ1cjE2IixRYT0idWkzMiIsUmE9ImZsMzIiLFNhPSJmbDY0IixUYT1IYStJYS5sZW5ndGgsVWE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxWYT17c2VyaWFsaXplOlAsZGVzZXJpYWxpemU6USxzdHJpbmdUb0J1ZmZlcjpOLGJ1ZmZlclRvU3RyaW5nOk99LFdhPXtfZHJpdmVyOiJ3ZWJTUUxTdG9yYWdlIixfaW5pdFN0b3JhZ2U6Uyxfc3VwcG9ydDpNKCksaXRlcmF0ZTpWLGdldEl0ZW06VSxzZXRJdGVtOlgscmVtb3ZlSXRlbTpZLGNsZWFyOlosbGVuZ3RoOiQsa2V5Ol8sa2V5czphYSxkcm9wSW5zdGFuY2U6Y2F9LFhhPXtfZHJpdmVyOiJsb2NhbFN0b3JhZ2VXcmFwcGVyIixfaW5pdFN0b3JhZ2U6aGEsX3N1cHBvcnQ6ZGEoKSxpdGVyYXRlOmthLGdldEl0ZW06amEsc2V0SXRlbTpwYSxyZW1vdmVJdGVtOm9hLGNsZWFyOmlhLGxlbmd0aDpuYSxrZXk6bGEsa2V5czptYSxkcm9wSW5zdGFuY2U6cWF9LFlhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1ifHwibnVtYmVyIj09dHlwZW9mIGEmJiJudW1iZXIiPT10eXBlb2YgYiYmaXNOYU4oYSkmJmlzTmFOKGIpfSxaYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aCxkPTA7ZDxjOyl7aWYoWWEoYVtkXSxiKSlyZXR1cm4hMDtkKyt9cmV0dXJuITF9LCRhPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9LF9hPXt9LGFiPXt9LGJiPXtJTkRFWEVEREI6Q2EsV0VCU1FMOldhLExPQ0FMU1RPUkFHRTpYYX0sY2I9W2JiLklOREVYRUREQi5fZHJpdmVyLGJiLldFQlNRTC5fZHJpdmVyLGJiLkxPQ0FMU1RPUkFHRS5fZHJpdmVyXSxkYj1bImRyb3BJbnN0YW5jZSJdLGViPVsiY2xlYXIiLCJnZXRJdGVtIiwiaXRlcmF0ZSIsImtleSIsImtleXMiLCJsZW5ndGgiLCJyZW1vdmVJdGVtIiwic2V0SXRlbSJdLmNvbmNhdChkYiksZmI9e2Rlc2NyaXB0aW9uOiIiLGRyaXZlcjpjYi5zbGljZSgpLG5hbWU6ImxvY2FsZm9yYWdlIixzaXplOjQ5ODA3MzYsc3RvcmVOYW1lOiJrZXl2YWx1ZXBhaXJzIix2ZXJzaW9uOjF9LGdiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtkKHRoaXMsYSk7Zm9yKHZhciBjIGluIGJiKWlmKGJiLmhhc093blByb3BlcnR5KGMpKXt2YXIgZT1iYltjXSxmPWUuX2RyaXZlcjt0aGlzW2NdPWYsX2FbZl18fHRoaXMuZGVmaW5lRHJpdmVyKGUpfXRoaXMuX2RlZmF1bHRDb25maWc9c2Eoe30sZmIpLHRoaXMuX2NvbmZpZz1zYSh7fSx0aGlzLl9kZWZhdWx0Q29uZmlnLGIpLHRoaXMuX2RyaXZlclNldD1udWxsLHRoaXMuX2luaXREcml2ZXI9bnVsbCx0aGlzLl9yZWFkeT0hMSx0aGlzLl9kYkluZm89bnVsbCx0aGlzLl93cmFwTGlicmFyeU1ldGhvZHNXaXRoUmVhZHkoKSx0aGlzLnNldERyaXZlcih0aGlzLl9jb25maWcuZHJpdmVyKS5jYXRjaChmdW5jdGlvbigpe30pfXJldHVybiBhLnByb3RvdHlwZS5jb25maWc9ZnVuY3Rpb24oYSl7aWYoIm9iamVjdCI9PT0odm9pZCAwPT09YT8idW5kZWZpbmVkIjp0YShhKSkpe2lmKHRoaXMuX3JlYWR5KXJldHVybiBuZXcgRXJyb3IoIkNhbid0IGNhbGwgY29uZmlnKCkgYWZ0ZXIgbG9jYWxmb3JhZ2UgaGFzIGJlZW4gdXNlZC4iKTtmb3IodmFyIGIgaW4gYSl7aWYoInN0b3JlTmFtZSI9PT1iJiYoYVtiXT1hW2JdLnJlcGxhY2UoL1xXL2csIl8iKSksInZlcnNpb24iPT09YiYmIm51bWJlciIhPXR5cGVvZiBhW2JdKXJldHVybiBuZXcgRXJyb3IoIkRhdGFiYXNlIHZlcnNpb24gbXVzdCBiZSBhIG51bWJlci4iKTt0aGlzLl9jb25maWdbYl09YVtiXX1yZXR1cm4hKCJkcml2ZXIiaW4gYSYmYS5kcml2ZXIpfHx0aGlzLnNldERyaXZlcih0aGlzLl9jb25maWcuZHJpdmVyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGE/dGhpcy5fY29uZmlnW2FdOnRoaXMuX2NvbmZpZ30sYS5wcm90b3R5cGUuZGVmaW5lRHJpdmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1uZXcgdmEoZnVuY3Rpb24oYixjKXt0cnl7dmFyIGQ9YS5fZHJpdmVyLGU9bmV3IEVycm9yKCJDdXN0b20gZHJpdmVyIG5vdCBjb21wbGlhbnQ7IHNlZSBodHRwczovL21vemlsbGEuZ2l0aHViLmlvL2xvY2FsRm9yYWdlLyNkZWZpbmVkcml2ZXIiKTtpZighYS5fZHJpdmVyKXJldHVybiB2b2lkIGMoZSk7Zm9yKHZhciBmPWViLmNvbmNhdCgiX2luaXRTdG9yYWdlIiksZz0wLGk9Zi5sZW5ndGg7ZzxpO2crKyl7dmFyIGo9ZltnXTtpZigoIVphKGRiLGopfHxhW2pdKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGFbal0pcmV0dXJuIHZvaWQgYyhlKX0oZnVuY3Rpb24oKXtmb3IodmFyIGI9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGI9bmV3IEVycm9yKCJNZXRob2QgIithKyIgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoZSBjdXJyZW50IGRyaXZlciIpLGM9dmEucmVqZWN0KGIpO3JldHVybiBoKGMsYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0pLGN9fSxjPTAsZD1kYi5sZW5ndGg7YzxkO2MrKyl7dmFyIGU9ZGJbY107YVtlXXx8KGFbZV09YihlKSl9fSkoKTt2YXIgaz1mdW5jdGlvbihjKXtfYVtkXSYmY29uc29sZS5pbmZvKCJSZWRlZmluaW5nIExvY2FsRm9yYWdlIGRyaXZlcjogIitkKSxfYVtkXT1hLGFiW2RdPWMsYigpfTsiX3N1cHBvcnQiaW4gYT9hLl9zdXBwb3J0JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5fc3VwcG9ydD9hLl9zdXBwb3J0KCkudGhlbihrLGMpOmsoISFhLl9zdXBwb3J0KTprKCEwKX1jYXRjaChhKXtjKGEpfX0pO3JldHVybiBpKGQsYixjKSxkfSxhLnByb3RvdHlwZS5kcml2ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJpdmVyfHxudWxsfSxhLnByb3RvdHlwZS5nZXREcml2ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPV9hW2FdP3ZhLnJlc29sdmUoX2FbYV0pOnZhLnJlamVjdChuZXcgRXJyb3IoIkRyaXZlciBub3QgZm91bmQuIikpO3JldHVybiBpKGQsYixjKSxkfSxhLnByb3RvdHlwZS5nZXRTZXJpYWxpemVyPWZ1bmN0aW9uKGEpe3ZhciBiPXZhLnJlc29sdmUoVmEpO3JldHVybiBpKGIsYSksYn0sYS5wcm90b3R5cGUucmVhZHk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWIuX2RyaXZlclNldC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1iLl9yZWFkeSYmKGIuX3JlYWR5PWIuX2luaXREcml2ZXIoKSksYi5fcmVhZHl9KTtyZXR1cm4gaShjLGEsYSksY30sYS5wcm90b3R5cGUuc2V0RHJpdmVyPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKCl7Zy5fY29uZmlnLmRyaXZlcj1nLmRyaXZlcigpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGcuX2V4dGVuZChhKSxkKCksZy5fcmVhZHk9Zy5faW5pdFN0b3JhZ2UoZy5fY29uZmlnKSxnLl9yZWFkeX1mdW5jdGlvbiBmKGEpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXtmb3IoO2M8YS5sZW5ndGg7KXt2YXIgZj1hW2NdO3JldHVybiBjKyssZy5fZGJJbmZvPW51bGwsZy5fcmVhZHk9bnVsbCxnLmdldERyaXZlcihmKS50aGVuKGUpLmNhdGNoKGIpfWQoKTt2YXIgaD1uZXcgRXJyb3IoIk5vIGF2YWlsYWJsZSBzdG9yYWdlIG1ldGhvZCBmb3VuZC4iKTtyZXR1cm4gZy5fZHJpdmVyU2V0PXZhLnJlamVjdChoKSxnLl9kcml2ZXJTZXR9dmFyIGM9MDtyZXR1cm4gYigpfX12YXIgZz10aGlzOyRhKGEpfHwoYT1bYV0pO3ZhciBoPXRoaXMuX2dldFN1cHBvcnRlZERyaXZlcnMoYSksaj1udWxsIT09dGhpcy5fZHJpdmVyU2V0P3RoaXMuX2RyaXZlclNldC5jYXRjaChmdW5jdGlvbigpe3JldHVybiB2YS5yZXNvbHZlKCl9KTp2YS5yZXNvbHZlKCk7cmV0dXJuIHRoaXMuX2RyaXZlclNldD1qLnRoZW4oZnVuY3Rpb24oKXt2YXIgYT1oWzBdO3JldHVybiBnLl9kYkluZm89bnVsbCxnLl9yZWFkeT1udWxsLGcuZ2V0RHJpdmVyKGEpLnRoZW4oZnVuY3Rpb24oYSl7Zy5fZHJpdmVyPWEuX2RyaXZlcixkKCksZy5fd3JhcExpYnJhcnlNZXRob2RzV2l0aFJlYWR5KCksZy5faW5pdERyaXZlcj1mKGgpfSl9KS5jYXRjaChmdW5jdGlvbigpe2QoKTt2YXIgYT1uZXcgRXJyb3IoIk5vIGF2YWlsYWJsZSBzdG9yYWdlIG1ldGhvZCBmb3VuZC4iKTtyZXR1cm4gZy5fZHJpdmVyU2V0PXZhLnJlamVjdChhKSxnLl9kcml2ZXJTZXR9KSxpKHRoaXMuX2RyaXZlclNldCxiLGMpLHRoaXMuX2RyaXZlclNldH0sYS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuISFhYlthXX0sYS5wcm90b3R5cGUuX2V4dGVuZD1mdW5jdGlvbihhKXtzYSh0aGlzLGEpfSxhLnByb3RvdHlwZS5fZ2V0U3VwcG9ydGVkRHJpdmVycz1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7dmFyIGU9YVtjXTt0aGlzLnN1cHBvcnRzKGUpJiZiLnB1c2goZSl9cmV0dXJuIGJ9LGEucHJvdG90eXBlLl93cmFwTGlicmFyeU1ldGhvZHNXaXRoUmVhZHk9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPWViLmxlbmd0aDthPGI7YSsrKXJhKHRoaXMsZWJbYV0pfSxhLnByb3RvdHlwZS5jcmVhdGVJbnN0YW5jZT1mdW5jdGlvbihiKXtyZXR1cm4gbmV3IGEoYil9LGF9KCksaGI9bmV3IGdiO2IuZXhwb3J0cz1oYn0sezM6M31dfSx7fSxbNF0pKDQpfSk7Cn07CgptdXJvbS5pbnN0YWxsVW5pY29kZUJhc2U2NCA9IGZ1bmN0aW9uKCkKewovKgoJaHR0cHM6Ly9naXRodWIuY29tL3NvbGRlcmpzL1RleHRFbmNvZGVyTGl0ZQoJQXBhY2hlIDIuMAoqLwpmdW5jdGlvbiBUZXh0RW5jb2RlckxpdGUoKXt9ZnVuY3Rpb24gVGV4dERlY29kZXJMaXRlKCl7fShmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1dGY4VG9CeXRlcyhzdHJpbmcsdW5pdHMpe3VuaXRzPXVuaXRzfHxJbmZpbml0eTt2YXIgY29kZVBvaW50O3ZhciBsZW5ndGg9c3RyaW5nLmxlbmd0aDt2YXIgbGVhZFN1cnJvZ2F0ZT1udWxsO3ZhciBieXRlcz1bXTt2YXIgaT0wO2Zvcig7aTxsZW5ndGg7aSsrKXtjb2RlUG9pbnQ9c3RyaW5nLmNoYXJDb2RlQXQoaSk7aWYoY29kZVBvaW50PjU1Mjk1JiZjb2RlUG9pbnQ8NTczNDQpe2lmKGxlYWRTdXJyb2dhdGUpe2lmKGNvZGVQb2ludDw1NjMyMCl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDIzOSwxOTEsMTg5KTtsZWFkU3Vycm9nYXRlPWNvZGVQb2ludDtjb250aW51ZX1lbHNle2NvZGVQb2ludD1sZWFkU3Vycm9nYXRlLTU1Mjk2PDwxMHxjb2RlUG9pbnQtNTYzMjB8NjU1MzY7bGVhZFN1cnJvZ2F0ZT1udWxsfX1lbHNle2lmKGNvZGVQb2ludD41NjMxOSl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1lbHNlIGlmKGkrMT09PWxlbmd0aCl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1lbHNle2xlYWRTdXJyb2dhdGU9Y29kZVBvaW50O2NvbnRpbnVlfX19ZWxzZSBpZihsZWFkU3Vycm9nYXRlKXtpZigodW5pdHMtPTMpPi0xKWJ5dGVzLnB1c2goMjM5LDE5MSwxODkpO2xlYWRTdXJyb2dhdGU9bnVsbH1pZihjb2RlUG9pbnQ8MTI4KXtpZigodW5pdHMtPTEpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQpfWVsc2UgaWYoY29kZVBvaW50PDIwNDgpe2lmKCh1bml0cy09Mik8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+NnwxOTIsY29kZVBvaW50JjYzfDEyOCl9ZWxzZSBpZihjb2RlUG9pbnQ8NjU1MzYpe2lmKCh1bml0cy09Myk8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+MTJ8MjI0LGNvZGVQb2ludD4+NiY2M3wxMjgsY29kZVBvaW50JjYzfDEyOCl9ZWxzZSBpZihjb2RlUG9pbnQ8MjA5NzE1Mil7aWYoKHVuaXRzLT00KTwwKWJyZWFrO2J5dGVzLnB1c2goY29kZVBvaW50Pj4xOHwyNDAsY29kZVBvaW50Pj4xMiY2M3wxMjgsY29kZVBvaW50Pj42JjYzfDEyOCxjb2RlUG9pbnQmNjN8MTI4KX1lbHNle3Rocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iil9fXJldHVybiBieXRlc31mdW5jdGlvbiB1dGY4U2xpY2UoYnVmLHN0YXJ0LGVuZCl7dmFyIHJlcz0iIjt2YXIgdG1wPSIiO2VuZD1NYXRoLm1pbihidWYubGVuZ3RoLGVuZHx8SW5maW5pdHkpO3N0YXJ0PXN0YXJ0fHwwO2Zvcih2YXIgaT1zdGFydDtpPGVuZDtpKyspe2lmKGJ1ZltpXTw9MTI3KXtyZXMrPWRlY29kZVV0ZjhDaGFyKHRtcCkrU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO3RtcD0iIn1lbHNle3RtcCs9IiUiK2J1ZltpXS50b1N0cmluZygxNil9fXJldHVybiByZXMrZGVjb2RlVXRmOENoYXIodG1wKX1mdW5jdGlvbiBkZWNvZGVVdGY4Q2hhcihzdHIpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cil9Y2F0Y2goZXJyKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzMyl9fVRleHRFbmNvZGVyTGl0ZS5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHN0cil7dmFyIHJlc3VsdDtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBVaW50OEFycmF5KXtyZXN1bHQ9dXRmOFRvQnl0ZXMoc3RyKX1lbHNle3Jlc3VsdD1uZXcgVWludDhBcnJheSh1dGY4VG9CeXRlcyhzdHIpKX1yZXR1cm4gcmVzdWx0fTtUZXh0RGVjb2RlckxpdGUucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihieXRlcyl7cmV0dXJuIHV0ZjhTbGljZShieXRlcywwLGJ5dGVzLmxlbmd0aCl9fSkoKTtpZih0eXBlb2YgbW9kdWxlPT09Im9iamVjdCImJm1vZHVsZSl7bW9kdWxlLmV4cG9ydHMuVGV4dERlY29kZXJMaXRlPVRleHREZWNvZGVyTGl0ZTttb2R1bGUuZXhwb3J0cy5UZXh0RW5jb2RlckxpdGU9VGV4dEVuY29kZXJMaXRlfQovKgoJaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzCiAJTUlUCiovCihmdW5jdGlvbihyKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPXIoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10scil9ZWxzZXt2YXIgZTtpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2U9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKXtlPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpe2U9c2VsZn1lbHNle2U9dGhpc31lLmJhc2U2NGpzPXIoKX19KShmdW5jdGlvbigpe3ZhciByLGUsbjtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGYsaSl7aWYoIW5bZl0pe2lmKCFlW2ZdKXt2YXIgdT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighaSYmdSlyZXR1cm4gdShmLCEwKTtpZihhKXJldHVybiBhKGYsITApO3ZhciB2PW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2YrIiciKTt0aHJvdyB2LmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLHZ9dmFyIGQ9bltmXT17ZXhwb3J0czp7fX07ZVtmXVswXS5jYWxsKGQuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ZdWzFdW3JdO3JldHVybiBvKG58fHIpfSxkLGQuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltmXS5leHBvcnRzfWZvcih2YXIgYT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxmPTA7Zjx0Lmxlbmd0aDtmKyspbyh0W2ZdKTtyZXR1cm4gb31yZXR1cm4gcn0oKSh7Ii8iOltmdW5jdGlvbihyLGUsbil7InVzZSBzdHJpY3QiO24uYnl0ZUxlbmd0aD1kO24udG9CeXRlQXJyYXk9aDtuLmZyb21CeXRlQXJyYXk9cDt2YXIgdD1bXTt2YXIgbz1bXTt2YXIgYT10eXBlb2YgVWludDhBcnJheSE9PSJ1bmRlZmluZWQiP1VpbnQ4QXJyYXk6QXJyYXk7dmFyIGY9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iO2Zvcih2YXIgaT0wLHU9Zi5sZW5ndGg7aTx1OysraSl7dFtpXT1mW2ldO29bZi5jaGFyQ29kZUF0KGkpXT1pfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyO29bIl8iLmNoYXJDb2RlQXQoMCldPTYzO2Z1bmN0aW9uIHYocil7dmFyIGU9ci5sZW5ndGg7aWYoZSU0PjApe3Rocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpfXZhciBuPXIuaW5kZXhPZigiPSIpO2lmKG49PT0tMSluPWU7dmFyIHQ9bj09PWU/MDo0LW4lNDtyZXR1cm5bbix0XX1mdW5jdGlvbiBkKHIpe3ZhciBlPXYocik7dmFyIG49ZVswXTt2YXIgdD1lWzFdO3JldHVybihuK3QpKjMvNC10fWZ1bmN0aW9uIGMocixlLG4pe3JldHVybihlK24pKjMvNC1ufWZ1bmN0aW9uIGgocil7dmFyIGU7dmFyIG49dihyKTt2YXIgdD1uWzBdO3ZhciBmPW5bMV07dmFyIGk9bmV3IGEoYyhyLHQsZikpO3ZhciB1PTA7dmFyIGQ9Zj4wP3QtNDp0O2Zvcih2YXIgaD0wO2g8ZDtoKz00KXtlPW9bci5jaGFyQ29kZUF0KGgpXTw8MTh8b1tyLmNoYXJDb2RlQXQoaCsxKV08PDEyfG9bci5jaGFyQ29kZUF0KGgrMildPDw2fG9bci5jaGFyQ29kZUF0KGgrMyldO2lbdSsrXT1lPj4xNiYyNTU7aVt1KytdPWU+PjgmMjU1O2lbdSsrXT1lJjI1NX1pZihmPT09Mil7ZT1vW3IuY2hhckNvZGVBdChoKV08PDJ8b1tyLmNoYXJDb2RlQXQoaCsxKV0+PjQ7aVt1KytdPWUmMjU1fWlmKGY9PT0xKXtlPW9bci5jaGFyQ29kZUF0KGgpXTw8MTB8b1tyLmNoYXJDb2RlQXQoaCsxKV08PDR8b1tyLmNoYXJDb2RlQXQoaCsyKV0+PjI7aVt1KytdPWU+PjgmMjU1O2lbdSsrXT1lJjI1NX1yZXR1cm4gaX1mdW5jdGlvbiBzKHIpe3JldHVybiB0W3I+PjE4JjYzXSt0W3I+PjEyJjYzXSt0W3I+PjYmNjNdK3RbciY2M119ZnVuY3Rpb24gbChyLGUsbil7dmFyIHQ7dmFyIG89W107Zm9yKHZhciBhPWU7YTxuO2ErPTMpe3Q9KHJbYV08PDE2JjE2NzExNjgwKSsoclthKzFdPDw4JjY1MjgwKSsoclthKzJdJjI1NSk7by5wdXNoKHModCkpfXJldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIHAocil7dmFyIGU7dmFyIG49ci5sZW5ndGg7dmFyIG89biUzO3ZhciBhPVtdO3ZhciBmPTE2MzgzO2Zvcih2YXIgaT0wLHU9bi1vO2k8dTtpKz1mKXthLnB1c2gobChyLGksaStmPnU/dTppK2YpKX1pZihvPT09MSl7ZT1yW24tMV07YS5wdXNoKHRbZT4+Ml0rdFtlPDw0JjYzXSsiPT0iKX1lbHNlIGlmKG89PT0yKXtlPShyW24tMl08PDgpK3Jbbi0xXTthLnB1c2godFtlPj4xMF0rdFtlPj40JjYzXSt0W2U8PDImNjNdKyI9Iil9cmV0dXJuIGEuam9pbigiIil9fSx7fV19LHt9LFtdKSgiLyIpfSk7Ci8qCiAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9ydS9kb2NzL1dlYi9BUEkvV2luZG93QmFzZTY0L0Jhc2U2NF9lbmNvZGluZ19hbmRfZGVjb2RpbmcKKi8KICAgIG11cm9tLmJ0b2EgPSBmdW5jdGlvbihzdHIpCiAgICB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IChUZXh0RW5jb2RlciB8fCBUZXh0RW5jb2RlckxpdGUpKCJ1dGYtOCIpLmVuY29kZShzdHIpOwogICAgICAgIHJldHVybiBiYXNlNjRqcy5mcm9tQnl0ZUFycmF5KGJ5dGVzKTsKICAgIH07CiAgICBtdXJvbS5hdG9iID0gZnVuY3Rpb24oc3RyKQogICAgewogICAgICAgIHZhciBieXRlcyA9IGJhc2U2NGpzLnRvQnl0ZUFycmF5KHN0cik7CiAgICAgICAgcmV0dXJuIG5ldyAoVGV4dERlY29kZXIgfHwgVGV4dERlY29kZXJMaXRlKSgidXRmLTgiKS5kZWNvZGUoYnl0ZXMpOwogICAgfTsKfTsKCm11cm9tLm1vZHVsZVByb3BlcnRpZXMgPSBmdW5jdGlvbihpZCkKewogICAgdmFyIG0gPSBtdXJvbS5tb2R1bGVzW2lkXTsKICAgIHJldHVybiAodHlwZW9mIG1bMl0gIT0gInVuZGVmaW5lZCIpID8gbVsyXSA6IHt9Owp9OwoKbXVyb20ubW9kdWxlU3RhdHVzID0gZnVuY3Rpb24oaWQpCnsKICAgIHZhciBwcm9wID0gbXVyb20ubW9kdWxlUHJvcGVydGllcyhpZCk7CiAgICBpZiAoInN0YXR1cyIgaW4gcHJvcCkKICAgIHsKICAgICAgICByZXR1cm4gcHJvcFsic3RhdHVzIl07CiAgICB9CiAgICAvLyBTdGF0dXMgPT0gdHJ1ZSBpZiBleHBsaWNpdCByZWNvcmQgaXMgYWJzZW50LgogICAgcmV0dXJuIHRydWU7Cn07CgptdXJvbS5zdGFydCA9IGZ1bmN0aW9uKCkKewogICAgY29uc29sZS5kZWJ1ZygiT3ZlcnJpZGUgbXVyb20uc3RhcnQoKSBmdW5jdGlvbiB0byBiZSBub3RpZmllZCB3aGVuIGFsbCBtb2R1bGVzIHdlcmUgbG9hZGVkIik7Cn0KCm11cm9tLmxvYWRNb2R1bGVzID0gZnVuY3Rpb24oKQp7CiAgICAvLyBTa2lwIGAwYCBtb2R1bGUgYmVjYXVzZSBpdCdzIHVzLgogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtdXJvbS5tb2R1bGVzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIHZhciBtb2R1bGUgPSBtdXJvbS5tb2R1bGVzW2ldOwogICAgICAgIHZhciBuYW1lID0gbW9kdWxlWzBdOwogICAgICAgIHZhciBjb2RlID0gbXVyb20uYXRvYihtb2R1bGVbMV0pOwogICAgICAgIGlmIChtdXJvbS5tb2R1bGVTdGF0dXMoaSkgPT0gZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlNraXAgbG9hZGluZyAnIiArIG5hbWUgKyAiJyBtb2R1bGUgYmVjYXVzZSBpdCdzIHR1cm5lZCBvZmYiKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGV2YWwoY29kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkNvdWxkIG5vdCBsb2FkICciICsgbmFtZSArICInIG1vZHVsZTogJyIgKyBlICsgIiciKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgbXVyb20uc3RhcnQoKTsKfTsKCm11cm9tLmxvYWRJbmRleGVkREJNb2R1bGVzID0gZnVuY3Rpb24oY29tcGxldGlvbkhhbmRsZXIpCnsKICAgIC8vIFNlZSBpZiBJbmRleGVkREIgaGFzIG1vZHVsZXMuCiAgICAvLyBJbmRleGVkREIgbW9kdWxlcyBvdmVycmlkZSB0aG9zZSBjb21pbmcgZnJvbSBIVE1MLgogICAgbG9jYWxmb3JhZ2UuY29uZmlnKHsgbmFtZTogIm11cm9tIiB9KTsKICAgIGxvY2FsZm9yYWdlLmdldEl0ZW0oIm1vZHVsZXMiLCBmdW5jdGlvbihlcnJvciwgbW9kdWxlcykgewogICAgICAgIGlmIChtb2R1bGVzKQogICAgICAgIHsKICAgICAgICAgICAgbXVyb20ubW9kdWxlcyA9IG1vZHVsZXM7CiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoIk1vZHVsZXMgaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIEluZGV4ZWREQiIpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgZ2V0IG1vZHVsZXMgZnJvbSBJbmRleGVkREI6ICciICsgZXJyb3IgKyAiJyIpOwogICAgICAgIH0KICAgICAgICAvLyBDb250aW51ZS4KICAgICAgICBjb21wbGV0aW9uSGFuZGxlcigpOwogICAgfSk7Cn07CgptdXJvbS5pbnN0YWxsTG9jYWxGb3JhZ2UoKTsKbXVyb20uaW5zdGFsbFVuaWNvZGVCYXNlNjQoKTsKLy8gSW5kZXhlZERCIG1vZHVsZXMgb3ZlcnJpZGUgSFRNTCBvbmVzLgptdXJvbS5sb2FkSW5kZXhlZERCTW9kdWxlcyhtdXJvbS5sb2FkTW9kdWxlcyk7Cg==",
{}
],
@@ -25,15 +25,8 @@ var murom = муром;
[
-"муром.uuid_1.0.0",
-"Ly8gQ3JlYXRlIEdVSUQgLyBVVUlEIGluIEphdmFTY3JpcHQ/Ci8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzCtC80YPRgNC+0LwudXVpZCA9IGZ1bmN0aW9uKCkKewogICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoCiAgICAgICAgL1t4eV0vZywKICAgICAgICBmdW5jdGlvbihjKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpOwogICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICAgICAgfQogICAgKTsKfTsK",
-{}
-],
-
-
-[
-"Уведомитель_1.0.0",
-"Ly8gUmVwb3J0ZXJTdWJzY3JpcHRpb24gY2xhc3MuCmZ1bmN0aW9uIFJlcG9ydGVyU3Vic2NyaXB0aW9uKGlkLCBjYWxsYmFjaywgcmVwb3J0ZXIpCnsKICAgIHRoaXMuaWQgPSBpZDsKICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIHRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKfQoKLy8gUmVwb3J0ZXIgY2xhc3MuCmZ1bmN0aW9uIFJlcG9ydGVyKG5hbWUpCnsKICAgIHRoaXMubmFtZSA9CiAgICAgICAgKHR5cGVvZiBuYW1lICE9PSAidW5kZWZpbmVkIikgPyAKICAgICAgICBuYW1lIDoKICAgICAgICAiIjsKICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdOwp9ClJlcG9ydGVyLnByb3RvdHlwZS5yZXBvcnQgPSBmdW5jdGlvbigpCnsKICAgIGZvciAodmFyIGlkIGluIHRoaXMuc3Vic2NyaXB0aW9ucykKICAgIHsKICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb25zW2lkXTsKICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2soKTsKICAgIH0KfQpSZXBvcnRlci5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24oY2FsbGJhY2spCnsKICAgIHZhciBpZCA9IG11cm9tLnV1aWQoKTsKICAgIHZhciBzdWJzY3JpcHRpb24gPSBuZXcgUmVwb3J0ZXJTdWJzY3JpcHRpb24oaWQsIGNhbGxiYWNrLCB0aGlzKTsKICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwp9ClJlcG9ydGVyLnByb3RvdHlwZS5zdWJzY3JpYmVNYW55ID0gZnVuY3Rpb24oZnVuY3MpCnsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnVuY3MubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpXTsKICAgICAgICB0aGlzLnN1YnNjcmliZShmdW5jKTsKICAgIH0KfQoKdmFyINCj0LLQtdC00L7QvNC40YLQtdC70YwgPSBSZXBvcnRlcjsKUmVwb3J0ZXIucHJvdG90eXBlLtGD0LLQtdC00L7QvNC40YLRjCA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5yZXBvcnQoKTsKfTsKUmVwb3J0ZXIucHJvdG90eXBlLtC/0L7QtNC/0LjRgdCw0YLRjCA9IGZ1bmN0aW9uKNGE0YPQvdC60YbQuNGPKQp7CiAgICB0aGlzLnN1YnNjcmliZSjRhNGD0L3QutGG0LjRjyk7Cn07ClJlcG9ydGVyLnByb3RvdHlwZS7Qv9C+0LTQv9C40YHQsNGC0YzQnNC90L7Qs9C+ID0gZnVuY3Rpb24oZnVuY3MpCnsKICAgIHRoaXMuc3Vic2NyaWJlTWFueShmdW5jcyk7Cn07Cg==",
+"муром.база_1.0.0",
+"LyoKICogCiAqIFVVSUQKICoKICovCgovLyBDcmVhdGUgR1VJRCAvIFVVSUQgaW4gSmF2YVNjcmlwdD8KLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxMTc1MjMK0LzRg9GA0L7QvC51dWlkID0gZnVuY3Rpb24oKQp7CiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgKICAgICAgICAvW3h5XS9nLAogICAgICAgIGZ1bmN0aW9uKGMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7CiAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgICAgICB9CiAgICApOwp9OwoKLyoKICogCiAqINCj0LLQtdC00L7QvNC40YLQtdC70YwgLyBSZXBvcnRlcgogKgogKi8KCi8vIFJlcG9ydGVyU3Vic2NyaXB0aW9uIGNsYXNzLgpmdW5jdGlvbiBSZXBvcnRlclN1YnNjcmlwdGlvbihpZCwgY2FsbGJhY2ssIHJlcG9ydGVyKQp7CiAgICB0aGlzLmlkID0gaWQ7CiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Cn0KCi8vIFJlcG9ydGVyIGNsYXNzLgpmdW5jdGlvbiBSZXBvcnRlcihuYW1lKQp7CiAgICB0aGlzLm5hbWUgPQogICAgICAgICh0eXBlb2YgbmFtZSAhPT0gInVuZGVmaW5lZCIpID8gCiAgICAgICAgbmFtZSA6CiAgICAgICAgIiI7CiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTsKfQpSZXBvcnRlci5wcm90b3R5cGUucmVwb3J0ID0gZnVuY3Rpb24oKQp7CiAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpCiAgICB7CiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9uc1tpZF07CiAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKCk7CiAgICB9Cn0KUmVwb3J0ZXIucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKQp7CiAgICB2YXIgaWQgPSBtdXJvbS51dWlkKCk7CiAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IFJlcG9ydGVyU3Vic2NyaXB0aW9uKGlkLCBjYWxsYmFjaywgdGhpcyk7CiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pOwogICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKfQpSZXBvcnRlci5wcm90b3R5cGUuc3Vic2NyaWJlTWFueSA9IGZ1bmN0aW9uKGZ1bmNzKQp7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIHZhciBmdW5jID0gZnVuY3NbaV07CiAgICAgICAgdGhpcy5zdWJzY3JpYmUoZnVuYyk7CiAgICB9Cn0KCnZhciDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMID0gUmVwb3J0ZXI7ClJlcG9ydGVyLnByb3RvdHlwZS7Rg9Cy0LXQtNC+0LzQuNGC0YwgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMucmVwb3J0KCk7Cn07ClJlcG9ydGVyLnByb3RvdHlwZS7Qv9C+0LTQv9C40YHQsNGC0YwgPSBmdW5jdGlvbijRhNGD0L3QutGG0LjRjykKewogICAgdGhpcy5zdWJzY3JpYmUo0YTRg9C90LrRhtC40Y8pOwp9OwpSZXBvcnRlci5wcm90b3R5cGUu0L/QvtC00L/QuNGB0LDRgtGM0JzQvdC+0LPQviA9IGZ1bmN0aW9uKGZ1bmNzKQp7CiAgICB0aGlzLnN1YnNjcmliZU1hbnkoZnVuY3MpOwp9OwoKLyoKICogCiAqINCf0YPRgdC6IC8gU3RhcnQKICoKICovCgrQvNGD0YDQvtC8LtC/0YPRgdC6ID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKLy8gQ2FuIGFsc28gYmUgYWNjZXNzZWQgYXMgJ211cm9tLnJ1bicuCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtdXJvbSwgInJ1biIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiDQvNGD0YDQvtC8LtC/0YPRgdC6OwogICAgfQp9KTsKbXVyb20uc3RhcnQgPSBmdW5jdGlvbigpCnsKICAgINC80YPRgNC+0Lwu0L/Rg9GB0Lou0YPQstC10LTQvtC80LjRgtGMKCk7Cn07",
{}
],