diff --git a/муром_1.1.0.html b/муром_1.1.0.html index 8f78221..e517d90 100644 --- a/муром_1.1.0.html +++ b/муром_1.1.0.html @@ -133,10 +133,35 @@ var модули = [ "ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBtdXJvbS5zdGFydC5zdWJzY3JpYmUoZnVuY3Rpb24oKXsKICAgICAgICBjb25zb2xlLmxvZygiU1RBUlQgU3RhcnRlZCIpOwogICAgfSk7CiAgICBjb25zb2xlLmxvZygiU1RBUlQgTG9hZGVkIik7Cn07", ], +[ +"левая-область", +"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDRgdC+0LfQtNCw0YLRjNCb0LXQstGD0Y7QntCx0LvQsNGB0YLRjCgpCiAgICB7CiAgICAgICAgdmFyINC70LXQstCw0Y/QntCx0LvQsNGB0YLRjCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgINC70LXQstCw0Y/QntCx0LvQsNGB0YLRjC5pZD0i0LvQtdCy0LDRjy3QvtCx0LvQsNGB0YLRjCI7CiAgICAgICAg0LvQtdCy0LDRj9Ce0LHQu9Cw0YHRgtGMLnN0eWxlLmNzc1RleHQgPSBgCiAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgdG9wOiAwOwogICAgICAgICAgICBib3R0b206IDA7CiAgICAgICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKNC70LXQstCw0Y/QntCx0LvQsNGB0YLRjCk7CiAgICB9CiAgICDQvNGD0YDQvtC8LtGB0YLQsNGA0YIu0L/QvtC00L/QuNGB0LDRgtGMKNGB0L7Qt9C00LDRgtGM0JvQtdCy0YPRjtCe0LHQu9Cw0YHRgtGMKTsKfQo=", +], + +[ +"правая-область", +"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDRgdC+0LfQtNCw0YLRjNCf0YDQsNCy0YPRjtCe0LHQu9Cw0YHRgtGMKCkKICAgIHsKICAgICAgICB2YXIg0L7QsdC70LDRgdGC0YwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICDQvtCx0LvQsNGB0YLRjC5pZD0i0L/RgNCw0LLQsNGPLdC+0LHQu9Cw0YHRgtGMIjsKICAgICAgICDQvtCx0LvQsNGB0YLRjC5zdHlsZS5jc3NUZXh0ID0gYAogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgIHJpZ2h0OiAwOwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIGJvdHRvbTogMDsKICAgICAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBgOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0L7QsdC70LDRgdGC0YwpOwogICAgfQogICAg0LzRg9GA0L7QvC7RgdGC0LDRgNGCLtC/0L7QtNC/0LjRgdCw0YLRjCjRgdC+0LfQtNCw0YLRjNCf0YDQsNCy0YPRjtCe0LHQu9Cw0YHRgtGMKTsKfQ==", +], + +[ +"ace", +"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDQstCy0LXRgdGC0LhBQ0UoKQogICAgewogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS1idWlsZHMvYmxvYi9tYXN0ZXIvc3JjLW1pbi1ub2NvbmZsaWN0L2FjZS5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBvKG4pe3ZhciBpPWU7biYmKGVbbl18fChlW25dPXt9KSxpPWVbbl0pO2lmKCFpLmRlZmluZXx8IWkuZGVmaW5lLnBhY2thZ2VkKXQub3JpZ2luYWw9aS5kZWZpbmUsaS5kZWZpbmU9dCxpLmRlZmluZS5wYWNrYWdlZD0hMDtpZighaS5yZXF1aXJlfHwhaS5yZXF1aXJlLnBhY2thZ2VkKXIub3JpZ2luYWw9aS5yZXF1aXJlLGkucmVxdWlyZT1yLGkucmVxdWlyZS5wYWNrYWdlZD0hMH12YXIgQUNFX05BTUVTUEFDRSA9ICJhY2UiLGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTshZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJihlPXdpbmRvdyk7aWYoIUFDRV9OQU1FU1BBQ0UmJnR5cGVvZiByZXF1aXJlanMhPSJ1bmRlZmluZWQiKXJldHVybjt2YXIgdD1mdW5jdGlvbihlLG4scil7aWYodHlwZW9mIGUhPSJzdHJpbmciKXt0Lm9yaWdpbmFsP3Qub3JpZ2luYWwuYXBwbHkodGhpcyxhcmd1bWVudHMpOihjb25zb2xlLmVycm9yKCJkcm9wcGluZyBtb2R1bGUgYmVjYXVzZSBkZWZpbmUgd2Fzbid0IGEgc3RyaW5nLiIpLGNvbnNvbGUudHJhY2UoKSk7cmV0dXJufWFyZ3VtZW50cy5sZW5ndGg9PTImJihyPW4pLHQubW9kdWxlc1tlXXx8KHQucGF5bG9hZHNbZV09cix0Lm1vZHVsZXNbZV09bnVsbCl9O3QubW9kdWxlcz17fSx0LnBheWxvYWRzPXt9O3ZhciBuPWZ1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdD09InN0cmluZyIpe3ZhciBpPXMoZSx0KTtpZihpIT11bmRlZmluZWQpcmV0dXJuIG4mJm4oKSxpfWVsc2UgaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgQXJyYXldIil7dmFyIG89W107Zm9yKHZhciB1PTAsYT10Lmxlbmd0aDt1PGE7Kyt1KXt2YXIgZj1zKGUsdFt1XSk7aWYoZj09dW5kZWZpbmVkJiZyLm9yaWdpbmFsKXJldHVybjtvLnB1c2goZil9cmV0dXJuIG4mJm4uYXBwbHkobnVsbCxvKXx8ITB9fSxyPWZ1bmN0aW9uKGUsdCl7dmFyIGk9bigiIixlLHQpO3JldHVybiBpPT11bmRlZmluZWQmJnIub3JpZ2luYWw/ci5vcmlnaW5hbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aX0saT1mdW5jdGlvbihlLHQpe2lmKHQuaW5kZXhPZigiISIpIT09LTEpe3ZhciBuPXQuc3BsaXQoIiEiKTtyZXR1cm4gaShlLG5bMF0pKyIhIitpKGUsblsxXSl9aWYodC5jaGFyQXQoMCk9PSIuIil7dmFyIHI9ZS5zcGxpdCgiLyIpLnNsaWNlKDAsLTEpLmpvaW4oIi8iKTt0PXIrIi8iK3Q7d2hpbGUodC5pbmRleE9mKCIuIikhPT0tMSYmcyE9dCl7dmFyIHM9dDt0PXQucmVwbGFjZSgvXC9cLlwvLywiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywiIil9fXJldHVybiB0fSxzPWZ1bmN0aW9uKGUscil7cj1pKGUscik7dmFyIHM9dC5tb2R1bGVzW3JdO2lmKCFzKXtzPXQucGF5bG9hZHNbcl07aWYodHlwZW9mIHM9PSJmdW5jdGlvbiIpe3ZhciBvPXt9LHU9e2lkOnIsdXJpOiIiLGV4cG9ydHM6byxwYWNrYWdlZDohMH0sYT1mdW5jdGlvbihlLHQpe3JldHVybiBuKHIsZSx0KX0sZj1zKGEsbyx1KTtvPWZ8fHUuZXhwb3J0cyx0Lm1vZHVsZXNbcl09byxkZWxldGUgdC5wYXlsb2Fkc1tyXX1zPXQubW9kdWxlc1tyXT1vfHxzfXJldHVybiBzfTtvKEFDRV9OQU1FU1BBQ0UpfSkoKSxhY2UuZGVmaW5lKCJhY2UvbGliL3JlZ2V4cCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtyZXR1cm4oZS5nbG9iYWw/ImciOiIiKSsoZS5pZ25vcmVDYXNlPyJpIjoiIikrKGUubXVsdGlsaW5lPyJtIjoiIikrKGUuZXh0ZW5kZWQ/IngiOiIiKSsoZS5zdGlja3k/InkiOiIiKX1mdW5jdGlvbiB1KGUsdCxuKXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gZS5pbmRleE9mKHQsbik7Zm9yKHZhciByPW58fDA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXT09PXQpcmV0dXJuIHI7cmV0dXJuLTF9dmFyIHI9e2V4ZWM6UmVnRXhwLnByb3RvdHlwZS5leGVjLHRlc3Q6UmVnRXhwLnByb3RvdHlwZS50ZXN0LG1hdGNoOlN0cmluZy5wcm90b3R5cGUubWF0Y2gscmVwbGFjZTpTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Usc3BsaXQ6U3RyaW5nLnByb3RvdHlwZS5zcGxpdH0saT1yLmV4ZWMuY2FsbCgvKCk/Py8sIiIpWzFdPT09dW5kZWZpbmVkLHM9ZnVuY3Rpb24oKXt2YXIgZT0vXi9nO3JldHVybiByLnRlc3QuY2FsbChlLCIiKSwhZS5sYXN0SW5kZXh9KCk7aWYocyYmaSlyZXR1cm47UmVnRXhwLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PXIuZXhlYy5hcHBseSh0aGlzLGFyZ3VtZW50cyksbixhO2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmdCl7IWkmJnQubGVuZ3RoPjEmJnUodCwiIik+LTEmJihhPVJlZ0V4cCh0aGlzLnNvdXJjZSxyLnJlcGxhY2UuY2FsbChvKHRoaXMpLCJnIiwiIikpLHIucmVwbGFjZS5jYWxsKGUuc2xpY2UodC5pbmRleCksYSxmdW5jdGlvbigpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aC0yO2UrKylhcmd1bWVudHNbZV09PT11bmRlZmluZWQmJih0W2VdPXVuZGVmaW5lZCl9KSk7aWYodGhpcy5feHJlZ2V4cCYmdGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXMpZm9yKHZhciBmPTE7Zjx0Lmxlbmd0aDtmKyspbj10aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tmLTFdLG4mJih0W25dPXRbZl0pOyFzJiZ0aGlzLmdsb2JhbCYmIXRbMF0ubGVuZ3RoJiZ0aGlzLmxhc3RJbmRleD50LmluZGV4JiZ0aGlzLmxhc3RJbmRleC0tfXJldHVybiB0fSxzfHwoUmVnRXhwLnByb3RvdHlwZS50ZXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXIuZXhlYy5jYWxsKHRoaXMsZSk7cmV0dXJuIHQmJnRoaXMuZ2xvYmFsJiYhdFswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PnQuaW5kZXgmJnRoaXMubGFzdEluZGV4LS0sISF0fSl9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2VzNS1zaGltIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt9ZnVuY3Rpb24gdyhlKXt0cnl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzZW50aW5lbCIse30pLCJzZW50aW5lbCJpbiBlfWNhdGNoKHQpe319ZnVuY3Rpb24gSChlKXtyZXR1cm4gZT0rZSxlIT09ZT9lPTA6ZSE9PTAmJmUhPT0xLzAmJmUhPT0tMS8wJiYoZT0oZT4wfHwtMSkqTWF0aC5mbG9vcihNYXRoLmFicyhlKSkpLGV9ZnVuY3Rpb24gQihlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4gZT09PW51bGx8fHQ9PT0idW5kZWZpbmVkInx8dD09PSJib29sZWFuInx8dD09PSJudW1iZXIifHx0PT09InN0cmluZyJ9ZnVuY3Rpb24gaihlKXt2YXIgdCxuLHI7aWYoQihlKSlyZXR1cm4gZTtuPWUudmFsdWVPZjtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil7dD1uLmNhbGwoZSk7aWYoQih0KSlyZXR1cm4gdH1yPWUudG9TdHJpbmc7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3Q9ci5jYWxsKGUpO2lmKEIodCkpcmV0dXJuIHR9dGhyb3cgbmV3IFR5cGVFcnJvcn1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAiK24pO3ZhciBpPXUuY2FsbChhcmd1bWVudHMsMSkscz1mdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBzKXt2YXIgZT1uLmFwcGx5KHRoaXMsaS5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOnRoaXN9cmV0dXJuIG4uYXBwbHkodCxpLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfTtyZXR1cm4gbi5wcm90b3R5cGUmJihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxzLnByb3RvdHlwZT1uZXcgcixyLnByb3RvdHlwZT1udWxsKSxzfSk7dmFyIGk9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwscz1BcnJheS5wcm90b3R5cGUsbz1PYmplY3QucHJvdG90eXBlLHU9cy5zbGljZSxhPWkuYmluZChvLnRvU3RyaW5nKSxmPWkuYmluZChvLmhhc093blByb3BlcnR5KSxsLGMsaCxwLGQ7aWYoZD1mKG8sIl9fZGVmaW5lR2V0dGVyX18iKSlsPWkuYmluZChvLl9fZGVmaW5lR2V0dGVyX18pLGM9aS5iaW5kKG8uX19kZWZpbmVTZXR0ZXJfXyksaD1pLmJpbmQoby5fX2xvb2t1cEdldHRlcl9fKSxwPWkuYmluZChvLl9fbG9va3VwU2V0dGVyX18pO2lmKFsxLDJdLnNwbGljZSgwKS5sZW5ndGghPTIpaWYoIWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2YXIgdD1uZXcgQXJyYXkoZSsyKTtyZXR1cm4gdFswXT10WzFdPTAsdH12YXIgdD1bXSxuO3Quc3BsaWNlLmFwcGx5KHQsZSgyMCkpLHQuc3BsaWNlLmFwcGx5KHQsZSgyNikpLG49dC5sZW5ndGgsdC5zcGxpY2UoNSwwLCJYWFgiKSxuKzE9PXQubGVuZ3RoO2lmKG4rMT09dC5sZW5ndGgpcmV0dXJuITB9KCkpQXJyYXkucHJvdG90eXBlLnNwbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGVuZ3RoO2U+MD9lPm4mJihlPW4pOmU9PXZvaWQgMD9lPTA6ZTwwJiYoZT1NYXRoLm1heChuK2UsMCkpLGUrdDxufHwodD1uLWUpO3ZhciByPXRoaXMuc2xpY2UoZSxlK3QpLGk9dS5jYWxsKGFyZ3VtZW50cywyKSxzPWkubGVuZ3RoO2lmKGU9PT1uKXMmJnRoaXMucHVzaC5hcHBseSh0aGlzLGkpO2Vsc2V7dmFyIG89TWF0aC5taW4odCxuLWUpLGE9ZStvLGY9YStzLW8sbD1uLWEsYz1uLW87aWYoZjxhKWZvcih2YXIgaD0wO2g8bDsrK2gpdGhpc1tmK2hdPXRoaXNbYStoXTtlbHNlIGlmKGY+YSlmb3IoaD1sO2gtLTspdGhpc1tmK2hdPXRoaXNbYStoXTtpZihzJiZlPT09Yyl0aGlzLmxlbmd0aD1jLHRoaXMucHVzaC5hcHBseSh0aGlzLGkpO2Vsc2V7dGhpcy5sZW5ndGg9YytzO2ZvcihoPTA7aDxzOysraCl0aGlzW2UraF09aVtoXX19cmV0dXJuIHJ9O2Vsc2V7dmFyIHY9QXJyYXkucHJvdG90eXBlLnNwbGljZTtBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/di5hcHBseSh0aGlzLFtlPT09dm9pZCAwPzA6ZSx0PT09dm9pZCAwP3RoaXMubGVuZ3RoLWU6dF0uY29uY2F0KHUuY2FsbChhcmd1bWVudHMsMikpKTpbXX19QXJyYXkuaXNBcnJheXx8KEFycmF5LmlzQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIGEodCk9PSJbb2JqZWN0IEFycmF5XSJ9KTt2YXIgbT1PYmplY3QoImEiKSxnPW1bMF0hPSJhInx8ISgwIGluIG0pO0FycmF5LnByb3RvdHlwZS5mb3JFYWNofHwoQXJyYXkucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1hcmd1bWVudHNbMV0scz0tMSxvPXIubGVuZ3RoPj4+MDtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7d2hpbGUoKytzPG8pcyBpbiByJiZ0LmNhbGwoaSxyW3NdLHMsbil9KSxBcnJheS5wcm90b3R5cGUubWFwfHwoQXJyYXkucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPUFycmF5KGkpLG89YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIHU9MDt1PGk7dSsrKXUgaW4gciYmKHNbdV09dC5jYWxsKG8sclt1XSx1LG4pKTtyZXR1cm4gc30pLEFycmF5LnByb3RvdHlwZS5maWx0ZXJ8fChBcnJheS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9W10sbyx1PWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciBmPTA7ZjxpO2YrKylmIGluIHImJihvPXJbZl0sdC5jYWxsKHUsbyxmLG4pJiZzLnB1c2gobykpO3JldHVybiBzfSksQXJyYXkucHJvdG90eXBlLmV2ZXJ5fHwoQXJyYXkucHJvdG90eXBlLmV2ZXJ5PWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIG89MDtvPGk7bysrKWlmKG8gaW4gciYmIXQuY2FsbChzLHJbb10sbyxuKSlyZXR1cm4hMTtyZXR1cm4hMH0pLEFycmF5LnByb3RvdHlwZS5zb21lfHwoQXJyYXkucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgbz0wO288aTtvKyspaWYobyBpbiByJiZ0LmNhbGwocyxyW29dLG8sbikpcmV0dXJuITA7cmV0dXJuITF9KSxBcnJheS5wcm90b3R5cGUucmVkdWNlfHwoQXJyYXkucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MDtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoIWkmJmFyZ3VtZW50cy5sZW5ndGg9PTEpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpO3ZhciBzPTAsbztpZihhcmd1bWVudHMubGVuZ3RoPj0yKW89YXJndW1lbnRzWzFdO2Vsc2UgZG97aWYocyBpbiByKXtvPXJbcysrXTticmVha31pZigrK3M+PWkpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfXdoaWxlKCEwKTtmb3IoO3M8aTtzKyspcyBpbiByJiYobz10LmNhbGwodm9pZCAwLG8scltzXSxzLG4pKTtyZXR1cm4gb30pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodHx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodD1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MDtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoIWkmJmFyZ3VtZW50cy5sZW5ndGg9PTEpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlUmlnaHQgb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIik7dmFyIHMsbz1pLTE7aWYoYXJndW1lbnRzLmxlbmd0aD49MilzPWFyZ3VtZW50c1sxXTtlbHNlIGRve2lmKG8gaW4gcil7cz1yW28tLV07YnJlYWt9aWYoLS1vPDApdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlUmlnaHQgb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIil9d2hpbGUoITApO2RvIG8gaW4gdGhpcyYmKHM9dC5jYWxsKHZvaWQgMCxzLHJbb10sbyxuKSk7d2hpbGUoby0tKTtyZXR1cm4gc30pO2lmKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8WzAsMV0uaW5kZXhPZigxLDIpIT0tMSlBcnJheS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXt2YXIgbj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpGKHRoaXMpLHI9bi5sZW5ndGg+Pj4wO2lmKCFyKXJldHVybi0xO3ZhciBpPTA7YXJndW1lbnRzLmxlbmd0aD4xJiYoaT1IKGFyZ3VtZW50c1sxXSkpLGk9aT49MD9pOk1hdGgubWF4KDAscitpKTtmb3IoO2k8cjtpKyspaWYoaSBpbiBuJiZuW2ldPT09dClyZXR1cm4gaTtyZXR1cm4tMX07aWYoIUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZnx8WzAsMV0ubGFzdEluZGV4T2YoMCwtMykhPS0xKUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0KXt2YXIgbj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpGKHRoaXMpLHI9bi5sZW5ndGg+Pj4wO2lmKCFyKXJldHVybi0xO3ZhciBpPXItMTthcmd1bWVudHMubGVuZ3RoPjEmJihpPU1hdGgubWluKGksSChhcmd1bWVudHNbMV0pKSksaT1pPj0wP2k6ci1NYXRoLmFicyhpKTtmb3IoO2k+PTA7aS0tKWlmKGkgaW4gbiYmdD09PW5baV0pcmV0dXJuIGk7cmV0dXJuLTF9O09iamVjdC5nZXRQcm90b3R5cGVPZnx8KE9iamVjdC5nZXRQcm90b3R5cGVPZj1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fCh0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOm8pfSk7aWYoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ipe3ZhciB5PSJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhIG5vbi1vYmplY3Q6ICI7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcj1mdW5jdGlvbih0LG4pe2lmKHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiJ8fHQ9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoeSt0KTtpZighZih0LG4pKXJldHVybjt2YXIgcixpLHM7cj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9O2lmKGQpe3ZhciB1PXQuX19wcm90b19fO3QuX19wcm90b19fPW87dmFyIGk9aCh0LG4pLHM9cCh0LG4pO3QuX19wcm90b19fPXU7aWYoaXx8cylyZXR1cm4gaSYmKHIuZ2V0PWkpLHMmJihyLnNldD1zKSxyfXJldHVybiByLnZhbHVlPXRbbl0scn19T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmtleXModCl9KTtpZighT2JqZWN0LmNyZWF0ZSl7dmFyIGI7T2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX189PT1udWxsP2I9ZnVuY3Rpb24oKXtyZXR1cm57X19wcm90b19fOm51bGx9fTpiPWZ1bmN0aW9uKCl7dmFyIGU9e307Zm9yKHZhciB0IGluIGUpZVt0XT1udWxsO3JldHVybiBlLmNvbnN0cnVjdG9yPWUuaGFzT3duUHJvcGVydHk9ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZT1lLmlzUHJvdG90eXBlT2Y9ZS50b0xvY2FsZVN0cmluZz1lLnRvU3RyaW5nPWUudmFsdWVPZj1lLl9fcHJvdG9fXz1udWxsLGV9LE9iamVjdC5jcmVhdGU9ZnVuY3Rpb24odCxuKXt2YXIgcjtpZih0PT09bnVsbClyPWIoKTtlbHNle2lmKHR5cGVvZiB0IT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrdHlwZW9mIHQrIl0gIT0gJ29iamVjdCciKTt2YXIgaT1mdW5jdGlvbigpe307aS5wcm90b3R5cGU9dCxyPW5ldyBpLHIuX19wcm90b19fPXR9cmV0dXJuIG4hPT12b2lkIDAmJk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHIsbikscn19aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KXt2YXIgRT13KHt9KSxTPXR5cGVvZiBkb2N1bWVudD09InVuZGVmaW5lZCJ8fHcoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2lmKCFFfHwhUyl2YXIgeD1PYmplY3QuZGVmaW5lUHJvcGVydHl9aWYoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8eCl7dmFyIFQ9IlByb3BlcnR5IGRlc2NyaXB0aW9uIG11c3QgYmUgYW4gb2JqZWN0OiAiLE49Ik9iamVjdC5kZWZpbmVQcm9wZXJ0eSBjYWxsZWQgb24gbm9uLW9iamVjdDogIixDPSJnZXR0ZXJzICYgc2V0dGVycyBjYW4gbm90IGJlIGRlZmluZWQgb24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7T2JqZWN0LmRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKHQsbixyKXtpZih0eXBlb2YgdCE9Im9iamVjdCImJnR5cGVvZiB0IT0iZnVuY3Rpb24ifHx0PT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKE4rdCk7aWYodHlwZW9mIHIhPSJvYmplY3QiJiZ0eXBlb2YgciE9ImZ1bmN0aW9uInx8cj09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihUK3IpO2lmKHgpdHJ5e3JldHVybiB4LmNhbGwoT2JqZWN0LHQsbixyKX1jYXRjaChpKXt9aWYoZihyLCJ2YWx1ZSIpKWlmKGQmJihoKHQsbil8fHAodCxuKSkpe3ZhciBzPXQuX19wcm90b19fO3QuX19wcm90b19fPW8sZGVsZXRlIHRbbl0sdFtuXT1yLnZhbHVlLHQuX19wcm90b19fPXN9ZWxzZSB0W25dPXIudmFsdWU7ZWxzZXtpZighZCl0aHJvdyBuZXcgVHlwZUVycm9yKEMpO2YociwiZ2V0IikmJmwodCxuLHIuZ2V0KSxmKHIsInNldCIpJiZjKHQsbixyLnNldCl9cmV0dXJuIHR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzfHwoT2JqZWN0LmRlZmluZVByb3BlcnRpZXM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIHIgaW4gbilmKG4scikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbltyXSk7cmV0dXJuIHR9KSxPYmplY3Quc2VhbHx8KE9iamVjdC5zZWFsPWZ1bmN0aW9uKHQpe3JldHVybiB0fSksT2JqZWN0LmZyZWV6ZXx8KE9iamVjdC5mcmVlemU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9KTt0cnl7T2JqZWN0LmZyZWV6ZShmdW5jdGlvbigpe30pfWNhdGNoKGspe09iamVjdC5mcmVlemU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uOnQobil9fShPYmplY3QuZnJlZXplKX1PYmplY3QucHJldmVudEV4dGVuc2lvbnN8fChPYmplY3QucHJldmVudEV4dGVuc2lvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9KSxPYmplY3QuaXNTZWFsZWR8fChPYmplY3QuaXNTZWFsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuITF9KSxPYmplY3QuaXNGcm96ZW58fChPYmplY3QuaXNGcm96ZW49ZnVuY3Rpb24odCl7cmV0dXJuITF9KSxPYmplY3QuaXNFeHRlbnNpYmxlfHwoT2JqZWN0LmlzRXh0ZW5zaWJsZT1mdW5jdGlvbih0KXtpZihPYmplY3QodCk9PT10KXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIG49IiI7d2hpbGUoZih0LG4pKW4rPSI/Ijt0W25dPSEwO3ZhciByPWYodCxuKTtyZXR1cm4gZGVsZXRlIHRbbl0scn0pO2lmKCFPYmplY3Qua2V5cyl7dmFyIEw9ITAsQT1bInRvU3RyaW5nIiwidG9Mb2NhbGVTdHJpbmciLCJ2YWx1ZU9mIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjb25zdHJ1Y3RvciJdLE89QS5sZW5ndGg7Zm9yKHZhciBNIGlue3RvU3RyaW5nOm51bGx9KUw9ITE7T2JqZWN0LmtleXM9ZnVuY3Rpb24gSShlKXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24ifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIEk9W107Zm9yKHZhciB0IGluIGUpZihlLHQpJiZJLnB1c2godCk7aWYoTClmb3IodmFyIG49MCxyPU87bjxyO24rKyl7dmFyIGk9QVtuXTtmKGUsaSkmJkkucHVzaChpKX1yZXR1cm4gSX19RGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk7dmFyIF89Iglcblx4MGJcZlxyIFx1MDBhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOVx1ZmVmZiI7aWYoIVN0cmluZy5wcm90b3R5cGUudHJpbXx8Xy50cmltKCkpe189IlsiK18rIl0iO3ZhciBEPW5ldyBSZWdFeHAoIl4iK18rXysiKiIpLFA9bmV3IFJlZ0V4cChfK18rIiokIik7U3RyaW5nLnByb3RvdHlwZS50cmltPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKEQsIiIpLnJlcGxhY2UoUCwiIil9fXZhciBGPWZ1bmN0aW9uKGUpe2lmKGU9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FuJ3QgY29udmVydCAiK2UrIiB0byBvYmplY3QiKTtyZXR1cm4gT2JqZWN0KGUpfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3JlZ2V4cCIsImFjZS9saWIvZXM1LXNoaW0iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UoIi4vcmVnZXhwIiksZSgiLi9lczUtc2hpbSIpLHR5cGVvZiBFbGVtZW50IT0idW5kZWZpbmVkIiYmIUVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmUiLHtlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpfX0pfSksYWNlLmRlZmluZSgiYWNlL2xpYi91c2VyYWdlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuT1M9e0xJTlVYOiJMSU5VWCIsTUFDOiJNQUMiLFdJTkRPV1M6IldJTkRPV1MifSx0LmdldE9TPWZ1bmN0aW9uKCl7cmV0dXJuIHQuaXNNYWM/dC5PUy5NQUM6dC5pc0xpbnV4P3QuT1MuTElOVVg6dC5PUy5XSU5ET1dTfTt2YXIgcj10eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0Ij9uYXZpZ2F0b3I6e30saT0oL21hY3x3aW58bGludXgvaS5leGVjKHIucGxhdGZvcm0pfHxbIm90aGVyIl0pWzBdLnRvTG93ZXJDYXNlKCkscz1yLnVzZXJBZ2VudHx8IiIsbz1yLmFwcE5hbWV8fCIiO3QuaXNXaW49aT09IndpbiIsdC5pc01hYz1pPT0ibWFjIix0LmlzTGludXg9aT09ImxpbnV4Iix0LmlzSUU9bz09Ik1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciJ8fG8uaW5kZXhPZigiTVNBcHBIb3N0Iik+PTA/cGFyc2VGbG9hdCgocy5tYXRjaCgvKD86TVNJRSB8VHJpZGVudFwvWzAtOV0rW1wuMC05XSs7LipydjopKFswLTldK1tcLjAtOV0rKS8pfHxbXSlbMV0pOnBhcnNlRmxvYXQoKHMubWF0Y2goLyg/OlRyaWRlbnRcL1swLTldK1tcLjAtOV0rOy4qcnY6KShbMC05XStbXC4wLTldKykvKXx8W10pWzFdKSx0LmlzT2xkSUU9dC5pc0lFJiZ0LmlzSUU8OSx0LmlzR2Vja289dC5pc01vemlsbGE9cy5tYXRjaCgvIEdlY2tvXC9cZCsvKSx0LmlzT3BlcmE9dHlwZW9mIG9wZXJhPT0ib2JqZWN0IiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYSk9PSJbb2JqZWN0IE9wZXJhXSIsdC5pc1dlYktpdD1wYXJzZUZsb2F0KHMuc3BsaXQoIldlYktpdC8iKVsxXSl8fHVuZGVmaW5lZCx0LmlzQ2hyb21lPXBhcnNlRmxvYXQocy5zcGxpdCgiIENocm9tZS8iKVsxXSl8fHVuZGVmaW5lZCx0LmlzRWRnZT1wYXJzZUZsb2F0KHMuc3BsaXQoIiBFZGdlLyIpWzFdKXx8dW5kZWZpbmVkLHQuaXNBSVI9cy5pbmRleE9mKCJBZG9iZUFJUiIpPj0wLHQuaXNBbmRyb2lkPXMuaW5kZXhPZigiQW5kcm9pZCIpPj0wLHQuaXNDaHJvbWVPUz1zLmluZGV4T2YoIiBDck9TICIpPj0wLHQuaXNJT1M9L2lQYWR8aVBob25lfGlQb2QvLnRlc3QocykmJiF3aW5kb3cuTVNTdHJlYW0sdC5pc0lPUyYmKHQuaXNNYWM9ITApLHQuaXNNb2JpbGU9dC5pc0lPU3x8dC5pc0FuZHJvaWR9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2RvbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3VzZXJhZ2VudCIpLGk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiO3QuYnVpbGREb209ZnVuY3Rpb24gbyhlLHQsbil7aWYodHlwZW9mIGU9PSJzdHJpbmciJiZlKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKTtyZXR1cm4gdCYmdC5hcHBlbmRDaGlsZChyKSxyfWlmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKHR5cGVvZiBlWzBdIT0ic3RyaW5nInx8IWVbMF0pe3ZhciBpPVtdO2Zvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgdT1vKGVbc10sdCxuKTt1JiZpLnB1c2godSl9cmV0dXJuIGl9dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlWzBdKSxmPWVbMV0sbD0xO2YmJnR5cGVvZiBmPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoZikmJihsPTIpO2Zvcih2YXIgcz1sO3M8ZS5sZW5ndGg7cysrKW8oZVtzXSxhLG4pO3JldHVybiBsPT0yJiZPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWZbZV07ZT09PSJjbGFzcyI/YS5jbGFzc05hbWU9QXJyYXkuaXNBcnJheSh0KT90LmpvaW4oIiAiKTp0OnR5cGVvZiB0PT0iZnVuY3Rpb24ifHxlPT0idmFsdWUiP2FbZV09dDplPT09InJlZiI/biYmKG5bdF09YSk6dCE9bnVsbCYmYS5zZXRBdHRyaWJ1dGUoZSx0KX0pLHQmJnQuYXBwZW5kQ2hpbGQoYSksYX0sdC5nZXREb2N1bWVudEhlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fChlPWRvY3VtZW50KSxlLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZS5kb2N1bWVudEVsZW1lbnR9LHQuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlM/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHR8fGksZSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKX0sdC5yZW1vdmVDaGlsZHJlbj1mdW5jdGlvbihlKXtlLmlubmVySFRNTD0iIn0sdC5jcmVhdGVUZXh0Tm9kZT1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/dC5vd25lckRvY3VtZW50OmRvY3VtZW50O3JldHVybiBuLmNyZWF0ZVRleHROb2RlKGUpfSx0LmNyZWF0ZUZyYWdtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWU/ZS5vd25lckRvY3VtZW50OmRvY3VtZW50O3JldHVybiB0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKX0sdC5oYXNDc3NDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPShlLmNsYXNzTmFtZSsiIikuc3BsaXQoL1xzKy9nKTtyZXR1cm4gbi5pbmRleE9mKHQpIT09LTF9LHQuYWRkQ3NzQ2xhc3M9ZnVuY3Rpb24oZSxuKXt0Lmhhc0Nzc0NsYXNzKGUsbil8fChlLmNsYXNzTmFtZSs9IiAiK24pfSx0LnJlbW92ZUNzc0NsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKTtmb3IoOzspe3ZhciByPW4uaW5kZXhPZih0KTtpZihyPT0tMSlicmVhaztuLnNwbGljZShyLDEpfWUuY2xhc3NOYW1lPW4uam9pbigiICIpfSx0LnRvZ2dsZUNzc0NsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKSxyPSEwO2Zvcig7Oyl7dmFyIGk9bi5pbmRleE9mKHQpO2lmKGk9PS0xKWJyZWFrO3I9ITEsbi5zcGxpY2UoaSwxKX1yZXR1cm4gciYmbi5wdXNoKHQpLGUuY2xhc3NOYW1lPW4uam9pbigiICIpLHJ9LHQuc2V0Q3NzQ2xhc3M9ZnVuY3Rpb24oZSxuLHIpe3I/dC5hZGRDc3NDbGFzcyhlLG4pOnQucmVtb3ZlQ3NzQ2xhc3MoZSxuKX0sdC5oYXNDc3NTdHJpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI7dD10fHxkb2N1bWVudDtpZihyPXQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSl3aGlsZShuPHIubGVuZ3RoKWlmKHJbbisrXS5pZD09PWUpcmV0dXJuITB9LHQuaW1wb3J0Q3NzU3RyaW5nPWZ1bmN0aW9uKG4scixpKXt2YXIgcz1pO2lmKCFpfHwhaS5nZXRSb290Tm9kZSlzPWRvY3VtZW50O2Vsc2V7cz1pLmdldFJvb3ROb2RlKCk7aWYoIXN8fHM9PWkpcz1kb2N1bWVudH12YXIgbz1zLm93bmVyRG9jdW1lbnR8fHM7aWYociYmdC5oYXNDc3NTdHJpbmcocixzKSlyZXR1cm4gbnVsbDtyJiYobis9IlxuLyojIHNvdXJjZVVSTD1hY2UvY3NzLyIrcisiICovIik7dmFyIHU9dC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3UuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZShuKSksciYmKHUuaWQ9cikscz09byYmKHM9dC5nZXREb2N1bWVudEhlYWQobykpLHMuaW5zZXJ0QmVmb3JlKHUscy5maXJzdENoaWxkKX0sdC5pbXBvcnRDc3NTdHlsc2hlZXQ9ZnVuY3Rpb24oZSxuKXt0LmJ1aWxkRG9tKFsibGluayIse3JlbDoic3R5bGVzaGVldCIsaHJlZjplfV0sdC5nZXREb2N1bWVudEhlYWQobikpfSx0LnNjcm9sbGJhcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY3JlYXRlRWxlbWVudCgiYWNlX2lubmVyIik7bi5zdHlsZS53aWR0aD0iMTAwJSIsbi5zdHlsZS5taW5XaWR0aD0iMHB4IixuLnN0eWxlLmhlaWdodD0iMjAwcHgiLG4uc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciByPXQuY3JlYXRlRWxlbWVudCgiYWNlX291dGVyIiksaT1yLnN0eWxlO2kucG9zaXRpb249ImFic29sdXRlIixpLmxlZnQ9Ii0xMDAwMHB4IixpLm92ZXJmbG93PSJoaWRkZW4iLGkud2lkdGg9IjIwMHB4IixpLm1pbldpZHRoPSIwcHgiLGkuaGVpZ2h0PSIxNTBweCIsaS5kaXNwbGF5PSJibG9jayIsci5hcHBlbmRDaGlsZChuKTt2YXIgcz1lLmRvY3VtZW50RWxlbWVudDtzLmFwcGVuZENoaWxkKHIpO3ZhciBvPW4ub2Zmc2V0V2lkdGg7aS5vdmVyZmxvdz0ic2Nyb2xsIjt2YXIgdT1uLm9mZnNldFdpZHRoO3JldHVybiBvPT11JiYodT1yLmNsaWVudFdpZHRoKSxzLnJlbW92ZUNoaWxkKHIpLG8tdX0sdHlwZW9mIGRvY3VtZW50PT0idW5kZWZpbmVkIiYmKHQuaW1wb3J0Q3NzU3RyaW5nPWZ1bmN0aW9uKCl7fSksdC5jb21wdXRlZFN0eWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsIiIpfHx7fX0sdC5zZXRTdHlsZT1mdW5jdGlvbihlLHQsbil7ZVt0XSE9PW4mJihlW3RdPW4pfSx0LkhBU19DU1NfQU5JTUFUSU9OPSExLHQuSEFTX0NTU19UUkFOU0ZPUk1TPSExLHQuSElfRFBJPXIuaXNXaW4/dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPj0xLjU6ITA7aWYodHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIil7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5ISV9EUEkmJnMuc3R5bGUudHJhbnNmb3JtIT09dW5kZWZpbmVkJiYodC5IQVNfQ1NTX1RSQU5TRk9STVM9ITApLCFyLmlzRWRnZSYmdHlwZW9mIHMuc3R5bGUuYW5pbWF0aW9uTmFtZSE9InVuZGVmaW5lZCImJih0LkhBU19DU1NfQU5JTUFUSU9OPSEwKSxzPW51bGx9dC5IQVNfQ1NTX1RSQU5TRk9STVM/dC50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2Uuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitNYXRoLnJvdW5kKHQpKyJweCwgIitNYXRoLnJvdW5kKG4pKyJweCkifTp0LnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQsbil7ZS5zdHlsZS50b3A9TWF0aC5yb3VuZChuKSsicHgiLGUuc3R5bGUubGVmdD1NYXRoLnJvdW5kKHQpKyJweCJ9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9vb3AiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuaW5oZXJpdHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfSx0Lm1peGluPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfSx0LmltcGxlbWVudD1mdW5jdGlvbihlLG4pe3QubWl4aW4oZSxuKX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2tleXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9vb3AiKSxpPWZ1bmN0aW9uKCl7dmFyIGU9e01PRElGSUVSX0tFWVM6ezE2OiJTaGlmdCIsMTc6IkN0cmwiLDE4OiJBbHQiLDIyNDoiTWV0YSIsOTE6Ik1ldGFMZWZ0Iiw5MjoiTWV0YVJpZ2h0Iiw5MzoiQ29udGV4dE1lbnUifSxLRVlfTU9EUzp7Y3RybDoxLGFsdDoyLG9wdGlvbjoyLHNoaWZ0OjQsInN1cGVyIjo4LG1ldGE6OCxjb21tYW5kOjgsY21kOjh9LEZVTkNUSU9OX0tFWVM6ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMzoiUmV0dXJuIiwxOToiUGF1c2UiLDI3OiJFc2MiLDMyOiJTcGFjZSIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkxlZnQiLDM4OiJVcCIsMzk6IlJpZ2h0Iiw0MDoiRG93biIsNDQ6IlByaW50Iiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiw5NjoiTnVtcGFkMCIsOTc6Ik51bXBhZDEiLDk4OiJOdW1wYWQyIiw5OToiTnVtcGFkMyIsMTAwOiJOdW1wYWQ0IiwxMDE6Ik51bXBhZDUiLDEwMjoiTnVtcGFkNiIsMTAzOiJOdW1wYWQ3IiwxMDQ6Ik51bXBhZDgiLDEwNToiTnVtcGFkOSIsIi0xMyI6Ik51bXBhZEVudGVyIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bWxvY2siLDE0NToiU2Nyb2xsbG9jayJ9LFBSSU5UQUJMRV9LRVlTOnszMjoiICIsNDg6IjAiLDQ5OiIxIiw1MDoiMiIsNTE6IjMiLDUyOiI0Iiw1MzoiNSIsNTQ6IjYiLDU1OiI3Iiw1NjoiOCIsNTc6IjkiLDU5OiI7Iiw2MToiPSIsNjU6ImEiLDY2OiJiIiw2NzoiYyIsNjg6ImQiLDY5OiJlIiw3MDoiZiIsNzE6ImciLDcyOiJoIiw3MzoiaSIsNzQ6ImoiLDc1OiJrIiw3NjoibCIsNzc6Im0iLDc4OiJuIiw3OToibyIsODA6InAiLDgxOiJxIiw4MjoiciIsODM6InMiLDg0OiJ0Iiw4NToidSIsODY6InYiLDg3OiJ3Iiw4ODoieCIsODk6InkiLDkwOiJ6IiwxMDc6IisiLDEwOToiLSIsMTEwOiIuIiwxODY6IjsiLDE4NzoiPSIsMTg4OiIsIiwxODk6Ii0iLDE5MDoiLiIsMTkxOiIvIiwxOTI6ImAiLDIxOToiWyIsMjIwOiJcXCIsMjIxOiJdIiwyMjI6IiciLDExMToiLyIsMTA2OiIqIn19LHQsbjtmb3IobiBpbiBlLkZVTkNUSU9OX0tFWVMpdD1lLkZVTkNUSU9OX0tFWVNbbl0udG9Mb3dlckNhc2UoKSxlW3RdPXBhcnNlSW50KG4sMTApO2ZvcihuIGluIGUuUFJJTlRBQkxFX0tFWVMpdD1lLlBSSU5UQUJMRV9LRVlTW25dLnRvTG93ZXJDYXNlKCksZVt0XT1wYXJzZUludChuLDEwKTtyZXR1cm4gci5taXhpbihlLGUuTU9ESUZJRVJfS0VZUyksci5taXhpbihlLGUuUFJJTlRBQkxFX0tFWVMpLHIubWl4aW4oZSxlLkZVTkNUSU9OX0tFWVMpLGUuZW50ZXI9ZVsicmV0dXJuIl0sZS5lc2NhcGU9ZS5lc2MsZS5kZWw9ZVsiZGVsZXRlIl0sZVsxNzNdPSItIixmdW5jdGlvbigpe3ZhciB0PVsiY21kIiwiY3RybCIsImFsdCIsInNoaWZ0Il07Zm9yKHZhciBuPU1hdGgucG93KDIsdC5sZW5ndGgpO24tLTspZS5LRVlfTU9EU1tuXT10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gbiZlLktFWV9NT0RTW3RdfSkuam9pbigiLSIpKyItIn0oKSxlLktFWV9NT0RTWzBdPSIiLGUuS0VZX01PRFNbLTFdPSJpbnB1dC0iLGV9KCk7ci5taXhpbih0LGkpLHQua2V5Q29kZVRvU3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07cmV0dXJuIHR5cGVvZiB0IT0ic3RyaW5nIiYmKHQ9U3RyaW5nLmZyb21DaGFyQ29kZShlKSksdC50b0xvd2VyQ2FzZSgpfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYShlLHQsbil7dmFyIGE9dSh0KTtpZighaS5pc01hYyYmcyl7dC5nZXRNb2RpZmllclN0YXRlJiYodC5nZXRNb2RpZmllclN0YXRlKCJPUyIpfHx0LmdldE1vZGlmaWVyU3RhdGUoIldpbiIpKSYmKGF8PTgpO2lmKHMuYWx0R3Ipe2lmKCgzJmEpPT0zKXJldHVybjtzLmFsdEdyPTB9aWYobj09PTE4fHxuPT09MTcpe3ZhciBmPSJsb2NhdGlvbiJpbiB0P3QubG9jYXRpb246dC5rZXlMb2NhdGlvbjtpZihuPT09MTcmJmY9PT0xKXNbbl09PTEmJihvPXQudGltZVN0YW1wKTtlbHNlIGlmKG49PT0xOCYmYT09PTMmJmY9PT0yKXt2YXIgbD10LnRpbWVTdGFtcC1vO2w8NTAmJihzLmFsdEdyPSEwKX19fW4gaW4gci5NT0RJRklFUl9LRVlTJiYobj0tMSk7aWYoIWEmJm49PT0xMyl7dmFyIGY9ImxvY2F0aW9uImluIHQ/dC5sb2NhdGlvbjp0LmtleUxvY2F0aW9uO2lmKGY9PT0zKXtlKHQsYSwtbik7aWYodC5kZWZhdWx0UHJldmVudGVkKXJldHVybn19aWYoaS5pc0Nocm9tZU9TJiZhJjgpe2UodCxhLG4pO2lmKHQuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47YSY9LTl9cmV0dXJuISFhfHxuIGluIHIuRlVOQ1RJT05fS0VZU3x8biBpbiByLlBSSU5UQUJMRV9LRVlTP2UodCxhLG4pOiExfWZ1bmN0aW9uIGYoKXtzPU9iamVjdC5jcmVhdGUobnVsbCl9dmFyIHI9ZSgiLi9rZXlzIiksaT1lKCIuL3VzZXJhZ2VudCIpLHM9bnVsbCxvPTA7dC5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7aWYoZS5hZGRFdmVudExpc3RlbmVyKXJldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKTtpZihlLmF0dGFjaEV2ZW50KXt2YXIgcj1mdW5jdGlvbigpe24uY2FsbChlLHdpbmRvdy5ldmVudCl9O24uX3dyYXBwZXI9cixlLmF0dGFjaEV2ZW50KCJvbiIrdCxyKX19LHQucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcilyZXR1cm4gZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSk7ZS5kZXRhY2hFdmVudCYmZS5kZXRhY2hFdmVudCgib24iK3Qsbi5fd3JhcHBlcnx8bil9LHQuc3RvcEV2ZW50PWZ1bmN0aW9uKGUpe3JldHVybiB0LnN0b3BQcm9wYWdhdGlvbihlKSx0LnByZXZlbnREZWZhdWx0KGUpLCExfSx0LnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbj9lLnN0b3BQcm9wYWdhdGlvbigpOmUuY2FuY2VsQnViYmxlPSEwfSx0LnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITF9LHQuZ2V0QnV0dG9uPWZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PSJkYmxjbGljayI/MDplLnR5cGU9PSJjb250ZXh0bWVudSJ8fGkuaXNNYWMmJmUuY3RybEtleSYmIWUuYWx0S2V5JiYhZS5zaGlmdEtleT8yOmUucHJldmVudERlZmF1bHQ/ZS5idXR0b246ezE6MCwyOjIsNDoxfVtlLmJ1dHRvbl19LHQuY2FwdHVyZT1mdW5jdGlvbihlLG4scil7ZnVuY3Rpb24gaShlKXtuJiZuKGUpLHImJnIoZSksdC5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixuLCEwKSx0LnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixpLCEwKSx0LnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJkcmFnc3RhcnQiLGksITApfXJldHVybiB0LmFkZExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLG4sITApLHQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGksITApLHQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsImRyYWdzdGFydCIsaSwhMCksaX0sdC5hZGRNb3VzZVdoZWVsTGlzdGVuZXI9ZnVuY3Rpb24oZSxuKXsib25tb3VzZXdoZWVsImluIGU/dC5hZGRMaXN0ZW5lcihlLCJtb3VzZXdoZWVsIixmdW5jdGlvbihlKXt2YXIgdD04O2Uud2hlZWxEZWx0YVghPT11bmRlZmluZWQ/KGUud2hlZWxYPS1lLndoZWVsRGVsdGFYL3QsZS53aGVlbFk9LWUud2hlZWxEZWx0YVkvdCk6KGUud2hlZWxYPTAsZS53aGVlbFk9LWUud2hlZWxEZWx0YS90KSxuKGUpfSk6Im9ud2hlZWwiaW4gZT90LmFkZExpc3RlbmVyKGUsIndoZWVsIixmdW5jdGlvbihlKXt2YXIgdD0uMzU7c3dpdGNoKGUuZGVsdGFNb2RlKXtjYXNlIGUuRE9NX0RFTFRBX1BJWEVMOmUud2hlZWxYPWUuZGVsdGFYKnR8fDAsZS53aGVlbFk9ZS5kZWx0YVkqdHx8MDticmVhaztjYXNlIGUuRE9NX0RFTFRBX0xJTkU6Y2FzZSBlLkRPTV9ERUxUQV9QQUdFOmUud2hlZWxYPShlLmRlbHRhWHx8MCkqNSxlLndoZWVsWT0oZS5kZWx0YVl8fDApKjV9bihlKX0pOnQuYWRkTGlzdGVuZXIoZSwiRE9NTW91c2VTY3JvbGwiLGZ1bmN0aW9uKGUpe2UuYXhpcyYmZS5heGlzPT1lLkhPUklaT05UQUxfQVhJUz8oZS53aGVlbFg9KGUuZGV0YWlsfHwwKSo1LGUud2hlZWxZPTApOihlLndoZWVsWD0wLGUud2hlZWxZPShlLmRldGFpbHx8MCkqNSksbihlKX0pfSx0LmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXI9ZnVuY3Rpb24oZSxuLHIscyl7ZnVuY3Rpb24gYyhlKXt0LmdldEJ1dHRvbihlKSE9PTA/bz0wOmUuZGV0YWlsPjE/KG8rKyxvPjQmJihvPTEpKTpvPTE7aWYoaS5pc0lFKXt2YXIgYz1NYXRoLmFicyhlLmNsaWVudFgtdSk+NXx8TWF0aC5hYnMoZS5jbGllbnRZLWEpPjU7aWYoIWZ8fGMpbz0xO2YmJmNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGx9LG5bby0xXXx8NjAwKSxvPT0xJiYodT1lLmNsaWVudFgsYT1lLmNsaWVudFkpfWUuX2NsaWNrcz1vLHJbc10oIm1vdXNlZG93biIsZSk7aWYobz40KW89MDtlbHNlIGlmKG8+MSlyZXR1cm4gcltzXShsW29dLGUpfWZ1bmN0aW9uIGgoZSl7bz0yLGYmJmNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGx9LG5bby0xXXx8NjAwKSxyW3NdKCJtb3VzZWRvd24iLGUpLHJbc10obFtvXSxlKX12YXIgbz0wLHUsYSxmLGw9ezI6ImRibGNsaWNrIiwzOiJ0cmlwbGVjbGljayIsNDoicXVhZGNsaWNrIn07QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGRMaXN0ZW5lcihlLCJtb3VzZWRvd24iLGMpLGkuaXNPbGRJRSYmdC5hZGRMaXN0ZW5lcihlLCJkYmxjbGljayIsaCl9KX07dmFyIHU9IWkuaXNNYWN8fCFpLmlzT3BlcmF8fCJLZXlib2FyZEV2ZW50ImluIHdpbmRvdz9mdW5jdGlvbihlKXtyZXR1cm4gMHwoZS5jdHJsS2V5PzE6MCl8KGUuYWx0S2V5PzI6MCl8KGUuc2hpZnRLZXk/NDowKXwoZS5tZXRhS2V5Pzg6MCl9OmZ1bmN0aW9uKGUpe3JldHVybiAwfChlLm1ldGFLZXk/MTowKXwoZS5hbHRLZXk/MjowKXwoZS5zaGlmdEtleT80OjApfChlLmN0cmxLZXk/ODowKX07dC5nZXRNb2RpZmllclN0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gci5LRVlfTU9EU1t1KGUpXX0sdC5hZGRDb21tYW5kS2V5TGlzdGVuZXI9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmFkZExpc3RlbmVyO2lmKGkuaXNPbGRHZWNrb3x8aS5pc09wZXJhJiYhKCJLZXlib2FyZEV2ZW50ImluIHdpbmRvdykpe3ZhciBvPW51bGw7cihlLCJrZXlkb3duIixmdW5jdGlvbihlKXtvPWUua2V5Q29kZX0pLHIoZSwia2V5cHJlc3MiLGZ1bmN0aW9uKGUpe3JldHVybiBhKG4sZSxvKX0pfWVsc2V7dmFyIHU9bnVsbDtyKGUsImtleWRvd24iLGZ1bmN0aW9uKGUpe3NbZS5rZXlDb2RlXT0oc1tlLmtleUNvZGVdfHwwKSsxO3ZhciB0PWEobixlLGUua2V5Q29kZSk7cmV0dXJuIHU9ZS5kZWZhdWx0UHJldmVudGVkLHR9KSxyKGUsImtleXByZXNzIixmdW5jdGlvbihlKXt1JiYoZS5jdHJsS2V5fHxlLmFsdEtleXx8ZS5zaGlmdEtleXx8ZS5tZXRhS2V5KSYmKHQuc3RvcEV2ZW50KGUpLHU9bnVsbCl9KSxyKGUsImtleXVwIixmdW5jdGlvbihlKXtzW2Uua2V5Q29kZV09bnVsbH0pLHN8fChmKCkscih3aW5kb3csImZvY3VzIixmKSl9fTtpZih0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmd2luZG93LnBvc3RNZXNzYWdlJiYhaS5pc09sZElFKXt2YXIgbD0xO3QubmV4dFRpY2s9ZnVuY3Rpb24oZSxuKXtuPW58fHdpbmRvdzt2YXIgcj0iemVyby10aW1lb3V0LW1lc3NhZ2UtIitsKyssaT1mdW5jdGlvbihzKXtzLmRhdGE9PXImJih0LnN0b3BQcm9wYWdhdGlvbihzKSx0LnJlbW92ZUxpc3RlbmVyKG4sIm1lc3NhZ2UiLGkpLGUoKSl9O3QuYWRkTGlzdGVuZXIobiwibWVzc2FnZSIsaSksbi5wb3N0TWVzc2FnZShyLCIqIil9fXQuJGlkbGVCbG9ja2VkPSExLHQub25JZGxlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gcigpe3QuJGlkbGVCbG9ja2VkP3NldFRpbWVvdXQociwxMDApOmUoKX0sbil9LHQuJGlkbGVCbG9ja0lkPW51bGwsdC5ibG9ja0lkbGU9ZnVuY3Rpb24oZSl7dC4kaWRsZUJsb2NrSWQmJmNsZWFyVGltZW91dCh0LiRpZGxlQmxvY2tJZCksdC4kaWRsZUJsb2NrZWQ9ITAsdC4kaWRsZUJsb2NrSWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuJGlkbGVCbG9ja2VkPSExfSxlfHwxMDApfSx0Lm5leHRGcmFtZT10eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLHQubmV4dEZyYW1lP3QubmV4dEZyYW1lPXQubmV4dEZyYW1lLmJpbmQod2luZG93KTp0Lm5leHRGcmFtZT1mdW5jdGlvbihlKXtzZXRUaW1lb3V0KGUsMTcpfX0pLGFjZS5kZWZpbmUoImFjZS9yYW5nZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yb3ctdC5yb3d8fGUuY29sdW1uLXQuY29sdW1ufSxpPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuc3RhcnQ9e3JvdzplLGNvbHVtbjp0fSx0aGlzLmVuZD17cm93Om4sY29sdW1uOnJ9fTsoZnVuY3Rpb24oKXt0aGlzLmlzRXF1YWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT09ZS5zdGFydC5yb3cmJnRoaXMuZW5kLnJvdz09PWUuZW5kLnJvdyYmdGhpcy5zdGFydC5jb2x1bW49PT1lLnN0YXJ0LmNvbHVtbiYmdGhpcy5lbmQuY29sdW1uPT09ZS5lbmQuY29sdW1ufSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlOiBbIit0aGlzLnN0YXJ0LnJvdysiLyIrdGhpcy5zdGFydC5jb2x1bW4rIl0gLT4gWyIrdGhpcy5lbmQucm93KyIvIit0aGlzLmVuZC5jb2x1bW4rIl0ifSx0aGlzLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wfSx0aGlzLmNvbXBhcmVSYW5nZT1mdW5jdGlvbihlKXt2YXIgdCxuPWUuZW5kLHI9ZS5zdGFydDtyZXR1cm4gdD10aGlzLmNvbXBhcmUobi5yb3csbi5jb2x1bW4pLHQ9PTE/KHQ9dGhpcy5jb21wYXJlKHIucm93LHIuY29sdW1uKSx0PT0xPzI6dD09MD8xOjApOnQ9PS0xPy0yOih0PXRoaXMuY29tcGFyZShyLnJvdyxyLmNvbHVtbiksdD09LTE/LTE6dD09MT80MjowKX0sdGhpcy5jb21wYXJlUG9pbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlLnJvdyxlLmNvbHVtbil9LHRoaXMuY29udGFpbnNSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wYXJlUG9pbnQoZS5zdGFydCk9PTAmJnRoaXMuY29tcGFyZVBvaW50KGUuZW5kKT09MH0sdGhpcy5pbnRlcnNlY3RzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29tcGFyZVJhbmdlKGUpO3JldHVybiB0PT0tMXx8dD09MHx8dD09MX0sdGhpcy5pc0VuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuZC5yb3c9PWUmJnRoaXMuZW5kLmNvbHVtbj09dH0sdGhpcy5pc1N0YXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT1lJiZ0aGlzLnN0YXJ0LmNvbHVtbj09dH0sdGhpcy5zZXRTdGFydD1mdW5jdGlvbihlLHQpe3R5cGVvZiBlPT0ib2JqZWN0Ij8odGhpcy5zdGFydC5jb2x1bW49ZS5jb2x1bW4sdGhpcy5zdGFydC5yb3c9ZS5yb3cpOih0aGlzLnN0YXJ0LnJvdz1lLHRoaXMuc3RhcnQuY29sdW1uPXQpfSx0aGlzLnNldEVuZD1mdW5jdGlvbihlLHQpe3R5cGVvZiBlPT0ib2JqZWN0Ij8odGhpcy5lbmQuY29sdW1uPWUuY29sdW1uLHRoaXMuZW5kLnJvdz1lLnJvdyk6KHRoaXMuZW5kLnJvdz1lLHRoaXMuZW5kLmNvbHVtbj10KX0sdGhpcy5pbnNpZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTA/dGhpcy5pc0VuZChlLHQpfHx0aGlzLmlzU3RhcnQoZSx0KT8hMTohMDohMX0sdGhpcy5pbnNpZGVTdGFydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MD90aGlzLmlzRW5kKGUsdCk/ITE6ITA6ITF9LHRoaXMuaW5zaWRlRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wP3RoaXMuaXNTdGFydChlLHQpPyExOiEwOiExfSx0aGlzLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdGhpcy5pc011bHRpTGluZSgpJiZlPT09dGhpcy5zdGFydC5yb3c/dDx0aGlzLnN0YXJ0LmNvbHVtbj8tMTp0PnRoaXMuZW5kLmNvbHVtbj8xOjA6ZTx0aGlzLnN0YXJ0LnJvdz8tMTplPnRoaXMuZW5kLnJvdz8xOnRoaXMuc3RhcnQucm93PT09ZT90Pj10aGlzLnN0YXJ0LmNvbHVtbj8wOi0xOnRoaXMuZW5kLnJvdz09PWU/dDw9dGhpcy5lbmQuY29sdW1uPzA6MTowfSx0aGlzLmNvbXBhcmVTdGFydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09ZSYmdGhpcy5zdGFydC5jb2x1bW49PXQ/LTE6dGhpcy5jb21wYXJlKGUsdCl9LHRoaXMuY29tcGFyZUVuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuZC5yb3c9PWUmJnRoaXMuZW5kLmNvbHVtbj09dD8xOnRoaXMuY29tcGFyZShlLHQpfSx0aGlzLmNvbXBhcmVJbnNpZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmQucm93PT1lJiZ0aGlzLmVuZC5jb2x1bW49PXQ/MTp0aGlzLnN0YXJ0LnJvdz09ZSYmdGhpcy5zdGFydC5jb2x1bW49PXQ/LTE6dGhpcy5jb21wYXJlKGUsdCl9LHRoaXMuY2xpcFJvd3M9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmVuZC5yb3c+dCl2YXIgbj17cm93OnQrMSxjb2x1bW46MH07ZWxzZSBpZih0aGlzLmVuZC5yb3c8ZSl2YXIgbj17cm93OmUsY29sdW1uOjB9O2lmKHRoaXMuc3RhcnQucm93PnQpdmFyIHI9e3Jvdzp0KzEsY29sdW1uOjB9O2Vsc2UgaWYodGhpcy5zdGFydC5yb3c8ZSl2YXIgcj17cm93OmUsY29sdW1uOjB9O3JldHVybiBpLmZyb21Qb2ludHMocnx8dGhpcy5zdGFydCxufHx0aGlzLmVuZCl9LHRoaXMuZXh0ZW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jb21wYXJlKGUsdCk7aWYobj09MClyZXR1cm4gdGhpcztpZihuPT0tMSl2YXIgcj17cm93OmUsY29sdW1uOnR9O2Vsc2UgdmFyIHM9e3JvdzplLGNvbHVtbjp0fTtyZXR1cm4gaS5mcm9tUG9pbnRzKHJ8fHRoaXMuc3RhcnQsc3x8dGhpcy5lbmQpfSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PT10aGlzLmVuZC5yb3cmJnRoaXMuc3RhcnQuY29sdW1uPT09dGhpcy5lbmQuY29sdW1ufSx0aGlzLmlzTXVsdGlMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQucm93IT09dGhpcy5lbmQucm93fSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGkuZnJvbVBvaW50cyh0aGlzLnN0YXJ0LHRoaXMuZW5kKX0sdGhpcy5jb2xsYXBzZVJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmQuY29sdW1uPT0wP25ldyBpKHRoaXMuc3RhcnQucm93LDAsTWF0aC5tYXgodGhpcy5zdGFydC5yb3csdGhpcy5lbmQucm93LTEpLDApOm5ldyBpKHRoaXMuc3RhcnQucm93LDAsdGhpcy5lbmQucm93LDApfSx0aGlzLnRvU2NyZWVuUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zdGFydCksbj1lLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7cmV0dXJuIG5ldyBpKHQucm93LHQuY29sdW1uLG4ucm93LG4uY29sdW1uKX0sdGhpcy5tb3ZlQnk9ZnVuY3Rpb24oZSx0KXt0aGlzLnN0YXJ0LnJvdys9ZSx0aGlzLnN0YXJ0LmNvbHVtbis9dCx0aGlzLmVuZC5yb3crPWUsdGhpcy5lbmQuY29sdW1uKz10fX0pLmNhbGwoaS5wcm90b3R5cGUpLGkuZnJvbVBvaW50cz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgaShlLnJvdyxlLmNvbHVtbix0LnJvdyx0LmNvbHVtbil9LGkuY29tcGFyZVBvaW50cz1yLGkuY29tcGFyZVBvaW50cz1mdW5jdGlvbihlLHQpe3JldHVybiBlLnJvdy10LnJvd3x8ZS5jb2x1bW4tdC5jb2x1bW59LHQuUmFuZ2U9aX0pLGFjZS5kZWZpbmUoImFjZS9saWIvbGFuZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5sYXN0PWZ1bmN0aW9uKGUpe3JldHVybiBlW2UubGVuZ3RoLTFdfSx0LnN0cmluZ1JldmVyc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKX0sdC5zdHJpbmdSZXBlYXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIjt3aGlsZSh0PjApe3QmMSYmKG4rPWUpO2lmKHQ+Pj0xKWUrPWV9cmV0dXJuIG59O3ZhciByPS9eXHNccyovLGk9L1xzXHMqJC87dC5zdHJpbmdUcmltTGVmdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHIsIiIpfSx0LnN0cmluZ1RyaW1SaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGksIiIpfSx0LmNvcHlPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSx0LmNvcHlBcnJheT1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXSYmdHlwZW9mIGVbbl09PSJvYmplY3QiP3Rbbl09dGhpcy5jb3B5T2JqZWN0KGVbbl0pOnRbbl09ZVtuXTtyZXR1cm4gdH0sdC5kZWVwQ29weT1mdW5jdGlvbiBzKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8IWUpcmV0dXJuIGU7dmFyIHQ7aWYoQXJyYXkuaXNBcnJheShlKSl7dD1bXTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0W25dPXMoZVtuXSk7cmV0dXJuIHR9aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09IltvYmplY3QgT2JqZWN0XSIpcmV0dXJuIGU7dD17fTtmb3IodmFyIG4gaW4gZSl0W25dPXMoZVtuXSk7cmV0dXJuIHR9LHQuYXJyYXlUb01hcD1mdW5jdGlvbihlKXt2YXIgdD17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0W2Vbbl1dPTE7cmV0dXJuIHR9LHQuY3JlYXRlTWFwPWZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSx0LmFycmF5UmVtb3ZlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjw9ZS5sZW5ndGg7bisrKXQ9PT1lW25dJiZlLnNwbGljZShuLDEpfSx0LmVzY2FwZVJlZ0V4cD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csIlxcJDEiKX0sdC5lc2NhcGVIVE1MPWZ1bmN0aW9uKGUpe3JldHVybigiIitlKS5yZXBsYWNlKC8mL2csIiYjMzg7IikucmVwbGFjZSgvIi9nLCImIzM0OyIpLnJlcGxhY2UoLycvZywiJiMzOTsiKS5yZXBsYWNlKC88L2csIiYjNjA7Iil9LHQuZ2V0TWF0Y2hPZmZzZXRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49W107cmV0dXJuIGUucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe24ucHVzaCh7b2Zmc2V0OmFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTJdLGxlbmd0aDplLmxlbmd0aH0pfSksbn0sdC5kZWZlcnJlZENhbGw9ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uKCl7dD1udWxsLGUoKX0scj1mdW5jdGlvbihlKXtyZXR1cm4gci5jYW5jZWwoKSx0PXNldFRpbWVvdXQobixlfHwwKSxyfTtyZXR1cm4gci5zY2hlZHVsZT1yLHIuY2FsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbCgpLGUoKSxyfSxyLmNhbmNlbD1mdW5jdGlvbigpe3JldHVybiBjbGVhclRpbWVvdXQodCksdD1udWxsLHJ9LHIuaXNQZW5kaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LHJ9LHQuZGVsYXllZENhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9ZnVuY3Rpb24oKXtuPW51bGwsZSgpfSxpPWZ1bmN0aW9uKGUpe249PW51bGwmJihuPXNldFRpbWVvdXQocixlfHx0KSl9O3JldHVybiBpLmRlbGF5PWZ1bmN0aW9uKGUpe24mJmNsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQocixlfHx0KX0saS5zY2hlZHVsZT1pLGkuY2FsbD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsKCksZSgpfSxpLmNhbmNlbD1mdW5jdGlvbigpe24mJmNsZWFyVGltZW91dChuKSxuPW51bGx9LGkuaXNQZW5kaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGl9fSksYWNlLmRlZmluZSgiYWNlL2NsaXBib2FyZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI7bi5leHBvcnRzPXtsaW5lTW9kZTohMSxwYXN0ZUNhbmNlbGxlZDpmdW5jdGlvbigpe3JldHVybiByJiZyPkRhdGUubm93KCktNTA/ITA6cj0hMX0sY2FuY2VsOmZ1bmN0aW9uKCl7cj1EYXRlLm5vdygpfX19KSxhY2UuZGVmaW5lKCJhY2Uva2V5Ym9hcmQvdGV4dGlucHV0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvY2xpcGJvYXJkIiwiYWNlL2xpYi9rZXlzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPWUoIi4uL2xpYi9kb20iKSxvPWUoIi4uL2xpYi9sYW5nIiksdT1lKCIuLi9jbGlwYm9hcmQiKSxhPWkuaXNDaHJvbWU8MTgsZj1pLmlzSUUsbD1pLmlzQ2hyb21lPjYzLGM9NDAwLGg9ZSgiLi4vbGliL2tleXMiKSxwPWguS0VZX01PRFMsZD1pLmlzSU9TLHY9ZD8vXHMvOi9cbi8sbT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHooKXtTPSEwLG4uYmx1cigpLG4uZm9jdXMoKSxTPSExfWZ1bmN0aW9uIFgoZSl7ZS5rZXlDb2RlPT0yNyYmbi52YWx1ZS5sZW5ndGg8bi5zZWxlY3Rpb25TdGFydCYmKHl8fCh4PW4udmFsdWUpLFQ9Tj0tMSxMKCkpLFcoKX1mdW5jdGlvbiAkKCl7Y2xlYXJUaW1lb3V0KFYpLFY9c2V0VGltZW91dChmdW5jdGlvbigpe3cmJihuLnN0eWxlLmNzc1RleHQ9dyx3PSIiKSx0LnJlbmRlcmVyLiRpc01vdXNlUHJlc3NlZD0hMSx0LnJlbmRlcmVyLiRrZWVwVGV4dEFyZWFBdEN1cnNvciYmdC5yZW5kZXJlci4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKX0sMCl9ZnVuY3Rpb24gSyhlLHQsbil7dmFyIHI9bnVsbCxpPSExO24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7ciYmY2xlYXJUaW1lb3V0KHIpLGk9ITB9LCEwKSxuLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixmdW5jdGlvbihlKXtyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPSExfSwxMDApfSwhMCk7dmFyIHM9ZnVuY3Rpb24oZSl7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW4pcmV0dXJuO2lmKGl8fHl8fHQuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZClyZXR1cm47aWYobSlyZXR1cm47dmFyIHI9bi5zZWxlY3Rpb25TdGFydCxzPW4uc2VsZWN0aW9uRW5kLG89bnVsbCx1PTA7aWYocj09MClvPWgudXA7ZWxzZSBpZihyPT0xKW89aC5ob21lO2Vsc2UgaWYocz5OJiZ4W3NdPT0iXG4iKW89aC5lbmQ7ZWxzZSBpZihyPFQmJnhbci0xXT09IiAiKW89aC5sZWZ0LHU9cC5vcHRpb247ZWxzZSBpZihyPFR8fHI9PVQmJk4hPVQmJnI9PXMpbz1oLmxlZnQ7ZWxzZSBpZihzPk4mJnguc2xpY2UoMCxzKS5zcGxpdCgiXG4iKS5sZW5ndGg+MilvPWguZG93bjtlbHNlIGlmKHM+TiYmeFtzLTFdPT0iICIpbz1oLnJpZ2h0LHU9cC5vcHRpb247ZWxzZSBpZihzPk58fHM9PU4mJk4hPVQmJnI9PXMpbz1oLnJpZ2h0O3IhPT1zJiYodXw9cC5zaGlmdCk7aWYobyl7dmFyIGE9dC5vbkNvbW1hbmRLZXkoe30sdSxvKTtpZighYSYmdC5jb21tYW5kcyl7bz1oLmtleUNvZGVUb1N0cmluZyhvKTt2YXIgZj10LmNvbW1hbmRzLmZpbmRLZXlDb21tYW5kKHUsbyk7ZiYmdC5leGVjQ29tbWFuZChmKX1UPXIsTj1zLEwoIiIpfX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixzKSx0Lm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIscyl9KX12YXIgbj1zLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7bi5jbGFzc05hbWU9ImFjZV90ZXh0LWlucHV0IixuLnNldEF0dHJpYnV0ZSgid3JhcCIsIm9mZiIpLG4uc2V0QXR0cmlidXRlKCJhdXRvY29ycmVjdCIsIm9mZiIpLG4uc2V0QXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIsIm9mZiIpLG4uc2V0QXR0cmlidXRlKCJzcGVsbGNoZWNrIiwhMSksbi5zdHlsZS5vcGFjaXR5PSIwIixlLmluc2VydEJlZm9yZShuLGUuZmlyc3RDaGlsZCk7dmFyIG09ITEsZz0hMSx5PSExLGI9ITEsdz0iIjtpLmlzTW9iaWxlfHwobi5zdHlsZS5mb250U2l6ZT0iMXB4Iik7dmFyIEU9ITEsUz0hMSx4PSIiLFQ9MCxOPTA7dHJ5e3ZhciBDPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1ufWNhdGNoKGspe31yLmFkZExpc3RlbmVyKG4sImJsdXIiLGZ1bmN0aW9uKGUpe2lmKFMpcmV0dXJuO3Qub25CbHVyKGUpLEM9ITF9KSxyLmFkZExpc3RlbmVyKG4sImZvY3VzIixmdW5jdGlvbihlKXtpZihTKXJldHVybjtDPSEwO2lmKGkuaXNFZGdlKXRyeXtpZighZG9jdW1lbnQuaGFzRm9jdXMoKSlyZXR1cm59Y2F0Y2goZSl7fXQub25Gb2N1cyhlKSxpLmlzRWRnZT9zZXRUaW1lb3V0KEwpOkwoKX0pLHRoaXMuJGZvY3VzU2Nyb2xsPSExLHRoaXMuZm9jdXM9ZnVuY3Rpb24oKXtpZih3fHxsfHx0aGlzLiRmb2N1c1Njcm9sbD09ImJyb3dzZXIiKXJldHVybiBuLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSk7dmFyIGU9bi5zdHlsZS50b3A7bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLG4uc3R5bGUudG9wPSIwcHgiO3RyeXt2YXIgdD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCE9MH1jYXRjaChyKXtyZXR1cm59dmFyIGk9W107aWYodCl7dmFyIHM9bi5wYXJlbnRFbGVtZW50O3doaWxlKHMmJnMubm9kZVR5cGU9PTEpaS5wdXNoKHMpLHMuc2V0QXR0cmlidXRlKCJhY2Vfbm9jb250ZXh0IiwhMCksIXMucGFyZW50RWxlbWVudCYmcy5nZXRSb290Tm9kZT9zPXMuZ2V0Um9vdE5vZGUoKS5ob3N0OnM9cy5wYXJlbnRFbGVtZW50fW4uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSx0JiZpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZW1vdmVBdHRyaWJ1dGUoImFjZV9ub2NvbnRleHQiKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnN0eWxlLnBvc2l0aW9uPSIiLG4uc3R5bGUudG9wPT0iMHB4IiYmKG4uc3R5bGUudG9wPWUpfSwwKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7bi5ibHVyKCl9LHRoaXMuaXNGb2N1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIEN9LHQub24oImJlZm9yZUVuZE9wZXJhdGlvbiIsZnVuY3Rpb24oKXtpZih0LmN1ck9wJiZ0LmN1ck9wLmNvbW1hbmQubmFtZT09Imluc2VydHN0cmluZyIpcmV0dXJuO3kmJih4PW4udmFsdWU9IiIsVSgpKSxMKCl9KTt2YXIgTD1kP2Z1bmN0aW9uKGUpe2lmKCFDfHxtJiYhZXx8YilyZXR1cm47ZXx8KGU9IiIpO3ZhciByPSJcbiBhYiIrZSsiY2RlIGZnXG4iO3IhPW4udmFsdWUmJihuLnZhbHVlPXg9cik7dmFyIGk9NCxzPTQrKGUubGVuZ3RofHwodC5zZWxlY3Rpb24uaXNFbXB0eSgpPzA6MSkpOyhUIT1pfHxOIT1zKSYmbi5zZXRTZWxlY3Rpb25SYW5nZShpLHMpLFQ9aSxOPXN9OmZ1bmN0aW9uKCl7aWYoeXx8YilyZXR1cm47aWYoIUMmJiFfKXJldHVybjt5PSEwO3ZhciBlPXQuc2VsZWN0aW9uLHI9ZS5nZXRSYW5nZSgpLGk9ZS5jdXJzb3Iucm93LHM9ci5zdGFydC5jb2x1bW4sbz1yLmVuZC5jb2x1bW4sdT10LnNlc3Npb24uZ2V0TGluZShpKTtpZihyLnN0YXJ0LnJvdyE9aSl7dmFyIGE9dC5zZXNzaW9uLmdldExpbmUoaS0xKTtzPXIuc3RhcnQucm93PGktMT8wOnMsbys9YS5sZW5ndGgrMSx1PWErIlxuIit1fWVsc2UgaWYoci5lbmQucm93IT1pKXt2YXIgZj10LnNlc3Npb24uZ2V0TGluZShpKzEpO289ci5lbmQucm93PmkrMT9mLmxlbmd0aDpvLG8rPXUubGVuZ3RoKzEsdT11KyJcbiIrZn11Lmxlbmd0aD5jJiYoczxjJiZvPGM/dT11LnNsaWNlKDAsYyk6KHU9IlxuIixzPTAsbz0xKSk7dmFyIGw9dSsiXG5cbiI7bCE9eCYmKG4udmFsdWU9eD1sLFQ9Tj1sLmxlbmd0aCksXyYmKFQ9bi5zZWxlY3Rpb25TdGFydCxOPW4uc2VsZWN0aW9uRW5kKTtpZihOIT1vfHxUIT1zfHxuLnNlbGVjdGlvbkVuZCE9Til0cnl7bi5zZXRTZWxlY3Rpb25SYW5nZShzLG8pLFQ9cyxOPW99Y2F0Y2goaCl7fXk9ITF9O0MmJnQub25Gb2N1cygpO3ZhciBBPWZ1bmN0aW9uKGUpe3JldHVybiBlLnNlbGVjdGlvblN0YXJ0PT09MCYmZS5zZWxlY3Rpb25FbmQ+PXgubGVuZ3RoJiZlLnZhbHVlPT09eCYmeCYmZS5zZWxlY3Rpb25FbmQhPT1OfSxPPWZ1bmN0aW9uKGUpe2lmKHkpcmV0dXJuO20/bT0hMTpBKG4pJiYodC5zZWxlY3RBbGwoKSxMKCkpfSxNPW51bGw7dGhpcy5zZXRJbnB1dEhhbmRsZXI9ZnVuY3Rpb24oZSl7TT1lfSx0aGlzLmdldElucHV0SGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiBNfTt2YXIgXz0hMSxEPWZ1bmN0aW9uKGUscil7XyYmKF89ITEpO2lmKGcpcmV0dXJuIEwoKSxlJiZ0Lm9uUGFzdGUoZSksZz0hMSwiIjt2YXIgaT1uLnNlbGVjdGlvblN0YXJ0LHM9bi5zZWxlY3Rpb25FbmQsbz1ULHU9eC5sZW5ndGgtTixhPWUsZj1lLmxlbmd0aC1pLGw9ZS5sZW5ndGgtcyxjPTA7d2hpbGUobz4wJiZ4W2NdPT1lW2NdKWMrKyxvLS07YT1hLnNsaWNlKGMpLGM9MTt3aGlsZSh1PjAmJngubGVuZ3RoLWM+VC0xJiZ4W3gubGVuZ3RoLWNdPT1lW2UubGVuZ3RoLWNdKWMrKyx1LS07Zi09Yy0xLGwtPWMtMTt2YXIgaD1hLmxlbmd0aC1jKzE7cmV0dXJuIGg8MCYmKG89LWgsaD0wKSxhPWEuc2xpY2UoMCxoKSwhciYmZj09YS5sZW5ndGgmJiFvJiYhdSYmIWw/IiI6KGI9ITAsYSYmIW8mJiF1JiYhZiYmIWx8fEU/dC5vblRleHRJbnB1dChhKTp0Lm9uVGV4dElucHV0KGEse2V4dGVuZExlZnQ6byxleHRlbmRSaWdodDp1LHJlc3RvcmVTdGFydDpmLHJlc3RvcmVFbmQ6bH0pLGI9ITEseD1lLFQ9aSxOPXMsYSl9LFA9ZnVuY3Rpb24oZSl7aWYoeSlyZXR1cm4gUigpO2lmKGUmJmUuaW5wdXRUeXBlKXtpZihlLmlucHV0VHlwZT09Imhpc3RvcnlVbmRvIilyZXR1cm4gdC5leGVjQ29tbWFuZCgidW5kbyIpO2lmKGUuaW5wdXRUeXBlPT0iaGlzdG9yeVJlZG8iKXJldHVybiB0LmV4ZWNDb21tYW5kKCJyZWRvIil9dmFyIHI9bi52YWx1ZSxpPUQociwhMCk7KHIubGVuZ3RoPmMrMTAwfHx2LnRlc3QoaSkpJiZMKCl9LEg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY2xpcGJvYXJkRGF0YXx8d2luZG93LmNsaXBib2FyZERhdGE7aWYoIXJ8fGEpcmV0dXJuO3ZhciBpPWZ8fG4/IlRleHQiOiJ0ZXh0L3BsYWluIjt0cnl7cmV0dXJuIHQ/ci5zZXREYXRhKGksdCkhPT0hMTpyLmdldERhdGEoaSl9Y2F0Y2goZSl7aWYoIW4pcmV0dXJuIEgoZSx0LCEwKX19LEI9ZnVuY3Rpb24oZSxpKXt2YXIgcz10LmdldENvcHlUZXh0KCk7aWYoIXMpcmV0dXJuIHIucHJldmVudERlZmF1bHQoZSk7SChlLHMpPyhkJiYoTChzKSxtPXMsc2V0VGltZW91dChmdW5jdGlvbigpe209ITF9LDEwKSksaT90Lm9uQ3V0KCk6dC5vbkNvcHkoKSxyLnByZXZlbnREZWZhdWx0KGUpKToobT0hMCxuLnZhbHVlPXMsbi5zZWxlY3QoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT0hMSxMKCksaT90Lm9uQ3V0KCk6dC5vbkNvcHkoKX0pKX0saj1mdW5jdGlvbihlKXtCKGUsITApfSxGPWZ1bmN0aW9uKGUpe0IoZSwhMSl9LEk9ZnVuY3Rpb24oZSl7dmFyIHM9SChlKTtpZih1LnBhc3RlQ2FuY2VsbGVkKCkpcmV0dXJuO3R5cGVvZiBzPT0ic3RyaW5nIj8ocyYmdC5vblBhc3RlKHMsZSksaS5pc0lFJiZzZXRUaW1lb3V0KEwpLHIucHJldmVudERlZmF1bHQoZSkpOihuLnZhbHVlPSIiLGc9ITApfTtyLmFkZENvbW1hbmRLZXlMaXN0ZW5lcihuLHQub25Db21tYW5kS2V5LmJpbmQodCkpLHIuYWRkTGlzdGVuZXIobiwic2VsZWN0IixPKSxyLmFkZExpc3RlbmVyKG4sImlucHV0IixQKSxyLmFkZExpc3RlbmVyKG4sImN1dCIsaiksci5hZGRMaXN0ZW5lcihuLCJjb3B5IixGKSxyLmFkZExpc3RlbmVyKG4sInBhc3RlIixJKSwoISgib25jdXQiaW4gbil8fCEoIm9uY29weSJpbiBuKXx8ISgib25wYXN0ZSJpbiBuKSkmJnIuYWRkTGlzdGVuZXIoZSwia2V5ZG93biIsZnVuY3Rpb24oZSl7aWYoaS5pc01hYyYmIWUubWV0YUtleXx8IWUuY3RybEtleSlyZXR1cm47c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA2NzpGKGUpO2JyZWFrO2Nhc2UgODY6SShlKTticmVhaztjYXNlIDg4OmooZSl9fSk7dmFyIHE9ZnVuY3Rpb24oZSl7aWYoeXx8IXQub25Db21wb3NpdGlvblN0YXJ0fHx0LiRyZWFkT25seSlyZXR1cm47eT17fTtpZihFKXJldHVybjtzZXRUaW1lb3V0KFIsMCksdC5vbigibW91c2Vkb3duIix6KTt2YXIgcj10LmdldFNlbGVjdGlvblJhbmdlKCk7ci5lbmQucm93PXIuc3RhcnQucm93LHIuZW5kLmNvbHVtbj1yLnN0YXJ0LmNvbHVtbix5Lm1hcmtlclJhbmdlPXIseS5zZWxlY3Rpb25TdGFydD1ULHQub25Db21wb3NpdGlvblN0YXJ0KHkpLHkudXNlVGV4dGFyZWFGb3JJTUU/KG4udmFsdWU9IiIseD0iIixUPTAsTj0wKToobi5tc0dldElucHV0Q29udGV4dCYmKHkuY29udGV4dD1uLm1zR2V0SW5wdXRDb250ZXh0KCkpLG4uZ2V0SW5wdXRDb250ZXh0JiYoeS5jb250ZXh0PW4uZ2V0SW5wdXRDb250ZXh0KCkpKX0sUj1mdW5jdGlvbigpe2lmKCF5fHwhdC5vbkNvbXBvc2l0aW9uVXBkYXRlfHx0LiRyZWFkT25seSlyZXR1cm47aWYoRSlyZXR1cm4geigpO2lmKHkudXNlVGV4dGFyZWFGb3JJTUUpdC5vbkNvbXBvc2l0aW9uVXBkYXRlKG4udmFsdWUpO2Vsc2V7dmFyIGU9bi52YWx1ZTtEKGUpLHkubWFya2VyUmFuZ2UmJih5LmNvbnRleHQmJih5Lm1hcmtlclJhbmdlLnN0YXJ0LmNvbHVtbj15LnNlbGVjdGlvblN0YXJ0PXkuY29udGV4dC5jb21wb3NpdGlvblN0YXJ0T2Zmc2V0KSx5Lm1hcmtlclJhbmdlLmVuZC5jb2x1bW49eS5tYXJrZXJSYW5nZS5zdGFydC5jb2x1bW4rTi15LnNlbGVjdGlvblN0YXJ0KX19LFU9ZnVuY3Rpb24oZSl7aWYoIXQub25Db21wb3NpdGlvbkVuZHx8dC4kcmVhZE9ubHkpcmV0dXJuO3k9ITEsdC5vbkNvbXBvc2l0aW9uRW5kKCksdC5vZmYoIm1vdXNlZG93biIseiksZSYmUCgpfSxXPW8uZGVsYXllZENhbGwoUiw1MCkuc2NoZWR1bGUuYmluZChudWxsLG51bGwpO3IuYWRkTGlzdGVuZXIobiwiY29tcG9zaXRpb25zdGFydCIscSksci5hZGRMaXN0ZW5lcihuLCJjb21wb3NpdGlvbnVwZGF0ZSIsUiksci5hZGRMaXN0ZW5lcihuLCJrZXl1cCIsWCksci5hZGRMaXN0ZW5lcihuLCJrZXlkb3duIixXKSxyLmFkZExpc3RlbmVyKG4sImNvbXBvc2l0aW9uZW5kIixVKSx0aGlzLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sdGhpcy5zZXRDb21tYW5kTW9kZT1mdW5jdGlvbihlKXtFPWUsbi5yZWFkT25seT0hMX0sdGhpcy5zZXRSZWFkT25seT1mdW5jdGlvbihlKXtFfHwobi5yZWFkT25seT1lKX0sdGhpcy5zZXRDb3B5V2l0aEVtcHR5U2VsZWN0aW9uPWZ1bmN0aW9uKGUpe30sdGhpcy5vbkNvbnRleHRNZW51PWZ1bmN0aW9uKGUpe189ITAsTCgpLHQuX2VtaXQoIm5hdGl2ZWNvbnRleHRtZW51Iix7dGFyZ2V0OnQsZG9tRXZlbnQ6ZX0pLHRoaXMubW92ZVRvTW91c2UoZSwhMCl9LHRoaXMubW92ZVRvTW91c2U9ZnVuY3Rpb24oZSxvKXt3fHwodz1uLnN0eWxlLmNzc1RleHQpLG4uc3R5bGUuY3NzVGV4dD0obz8iei1pbmRleDoxMDAwMDA7IjoiIikrKGkuaXNJRT8ib3BhY2l0eTowLjE7IjoiIikrInRleHQtaW5kZW50OiAtIisoVCtOKSp0LnJlbmRlcmVyLmNoYXJhY3RlcldpZHRoKi41KyJweDsiO3ZhciB1PXQuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9cy5jb21wdXRlZFN0eWxlKHQuY29udGFpbmVyKSxmPXUudG9wKyhwYXJzZUludChhLmJvcmRlclRvcFdpZHRoKXx8MCksbD11LmxlZnQrKHBhcnNlSW50KHUuYm9yZGVyTGVmdFdpZHRoKXx8MCksYz11LmJvdHRvbS1mLW4uY2xpZW50SGVpZ2h0LTIsaD1mdW5jdGlvbihlKXtzLnRyYW5zbGF0ZShuLGUuY2xpZW50WC1sLTIsTWF0aC5taW4oZS5jbGllbnRZLWYtMixjKSl9O2goZSk7aWYoZS50eXBlIT0ibW91c2Vkb3duIilyZXR1cm47dC5yZW5kZXJlci4kaXNNb3VzZVByZXNzZWQ9ITAsY2xlYXJUaW1lb3V0KFYpLGkuaXNXaW4mJnIuY2FwdHVyZSh0LmNvbnRhaW5lcixoLCQpfSx0aGlzLm9uQ29udGV4dE1lbnVDbG9zZT0kO3ZhciBWLEo9ZnVuY3Rpb24oZSl7dC50ZXh0SW5wdXQub25Db250ZXh0TWVudShlKSwkKCl9O3IuYWRkTGlzdGVuZXIobiwibW91c2V1cCIsSiksci5hZGRMaXN0ZW5lcihuLCJtb3VzZWRvd24iLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSwkKCl9KSxyLmFkZExpc3RlbmVyKHQucmVuZGVyZXIuc2Nyb2xsZXIsImNvbnRleHRtZW51IixKKSxyLmFkZExpc3RlbmVyKG4sImNvbnRleHRtZW51IixKKSxkJiZLKGUsdCxuKX07dC5UZXh0SW5wdXQ9bX0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7ZS4kY2xpY2tTZWxlY3Rpb249bnVsbDt2YXIgdD1lLmVkaXRvcjt0LnNldERlZmF1bHRIYW5kbGVyKCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24uYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigiZGJsY2xpY2siLHRoaXMub25Eb3VibGVDbGljay5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJ0cmlwbGVjbGljayIsdGhpcy5vblRyaXBsZUNsaWNrLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoInF1YWRjbGljayIsdGhpcy5vblF1YWRDbGljay5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJtb3VzZXdoZWVsIix0aGlzLm9uTW91c2VXaGVlbC5iaW5kKGUpKTt2YXIgbj1bInNlbGVjdCIsInN0YXJ0U2VsZWN0Iiwic2VsZWN0RW5kIiwic2VsZWN0QWxsRW5kIiwic2VsZWN0QnlXb3Jkc0VuZCIsInNlbGVjdEJ5TGluZXNFbmQiLCJkcmFnV2FpdCIsImRyYWdXYWl0RW5kIiwiZm9jdXNXYWl0Il07bi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dGhpc1t0XX0sdGhpcyksZS5zZWxlY3RCeUxpbmVzPXRoaXMuZXh0ZW5kU2VsZWN0aW9uQnkuYmluZChlLCJnZXRMaW5lUmFuZ2UiKSxlLnNlbGVjdEJ5V29yZHM9dGhpcy5leHRlbmRTZWxlY3Rpb25CeS5iaW5kKGUsImdldFdvcmRSYW5nZSIpfWZ1bmN0aW9uIHUoZSx0LG4scil7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhuLWUsMikrTWF0aC5wb3coci10LDIpKX1mdW5jdGlvbiBhKGUsdCl7aWYoZS5zdGFydC5yb3c9PWUuZW5kLnJvdyl2YXIgbj0yKnQuY29sdW1uLWUuc3RhcnQuY29sdW1uLWUuZW5kLmNvbHVtbjtlbHNlIGlmKGUuc3RhcnQucm93PT1lLmVuZC5yb3ctMSYmIWUuc3RhcnQuY29sdW1uJiYhZS5lbmQuY29sdW1uKXZhciBuPXQuY29sdW1uLTQ7ZWxzZSB2YXIgbj0yKnQucm93LWUuc3RhcnQucm93LWUuZW5kLnJvdztyZXR1cm4gbjwwP3tjdXJzb3I6ZS5zdGFydCxhbmNob3I6ZS5lbmR9OntjdXJzb3I6ZS5lbmQsYW5jaG9yOmUuc3RhcnR9fXZhciByPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxpPTAscz01NTA7KGZ1bmN0aW9uKCl7dGhpcy5vbk1vdXNlRG93bj1mdW5jdGlvbihlKXt2YXIgdD1lLmluU2VsZWN0aW9uKCksbj1lLmdldERvY3VtZW50UG9zaXRpb24oKTt0aGlzLm1vdXNlZG93bkV2ZW50PWU7dmFyIGk9dGhpcy5lZGl0b3Iscz1lLmdldEJ1dHRvbigpO2lmKHMhPT0wKXt2YXIgbz1pLmdldFNlbGVjdGlvblJhbmdlKCksdT1vLmlzRW1wdHkoKTsodXx8cz09MSkmJmkuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKG4pLHM9PTImJihpLnRleHRJbnB1dC5vbkNvbnRleHRNZW51KGUuZG9tRXZlbnQpLHIuaXNNb3ppbGxhfHxlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybn10aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU9RGF0ZS5ub3coKTtpZih0JiYhaS5pc0ZvY3VzZWQoKSl7aS5mb2N1cygpO2lmKHRoaXMuJGZvY3VzVGltZW91dCYmIXRoaXMuJGNsaWNrU2VsZWN0aW9uJiYhaS5pbk11bHRpU2VsZWN0TW9kZSl7dGhpcy5zZXRTdGF0ZSgiZm9jdXNXYWl0IiksdGhpcy5jYXB0dXJlTW91c2UoZSk7cmV0dXJufX1yZXR1cm4gdGhpcy5jYXB0dXJlTW91c2UoZSksdGhpcy5zdGFydFNlbGVjdChuLGUuZG9tRXZlbnQuX2NsaWNrcz4xKSxlLnByZXZlbnREZWZhdWx0KCl9LHRoaXMuc3RhcnRTZWxlY3Q9ZnVuY3Rpb24oZSx0KXtlPWV8fHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMueCx0aGlzLnkpO3ZhciBuPXRoaXMuZWRpdG9yO2lmKCF0aGlzLm1vdXNlZG93bkV2ZW50KXJldHVybjt0aGlzLm1vdXNlZG93bkV2ZW50LmdldFNoaWZ0S2V5KCk/bi5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihlKTp0fHxuLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihlKSx0fHx0aGlzLnNlbGVjdCgpLG4ucmVuZGVyZXIuc2Nyb2xsZXIuc2V0Q2FwdHVyZSYmbi5yZW5kZXJlci5zY3JvbGxlci5zZXRDYXB0dXJlKCksbi5zZXRTdHlsZSgiYWNlX3NlbGVjdGluZyIpLHRoaXMuc2V0U3RhdGUoInNlbGVjdCIpfSx0aGlzLnNlbGVjdD1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5lZGl0b3Isbj10LnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMueCx0aGlzLnkpO2lmKHRoaXMuJGNsaWNrU2VsZWN0aW9uKXt2YXIgcj10aGlzLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlUG9pbnQobik7aWYocj09LTEpZT10aGlzLiRjbGlja1NlbGVjdGlvbi5lbmQ7ZWxzZSBpZihyPT0xKWU9dGhpcy4kY2xpY2tTZWxlY3Rpb24uc3RhcnQ7ZWxzZXt2YXIgaT1hKHRoaXMuJGNsaWNrU2VsZWN0aW9uLG4pO249aS5jdXJzb3IsZT1pLmFuY2hvcn10LnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IoZS5yb3csZS5jb2x1bW4pfXQuc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24obiksdC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpfSx0aGlzLmV4dGVuZFNlbGVjdGlvbkJ5PWZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5lZGl0b3Iscj1uLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMueCx0aGlzLnkpLGk9bi5zZWxlY3Rpb25bZV0oci5yb3csci5jb2x1bW4pO2lmKHRoaXMuJGNsaWNrU2VsZWN0aW9uKXt2YXIgcz10aGlzLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlUG9pbnQoaS5zdGFydCksbz10aGlzLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlUG9pbnQoaS5lbmQpO2lmKHM9PS0xJiZvPD0wKXt0PXRoaXMuJGNsaWNrU2VsZWN0aW9uLmVuZDtpZihpLmVuZC5yb3chPXIucm93fHxpLmVuZC5jb2x1bW4hPXIuY29sdW1uKXI9aS5zdGFydH1lbHNlIGlmKG89PTEmJnM+PTApe3Q9dGhpcy4kY2xpY2tTZWxlY3Rpb24uc3RhcnQ7aWYoaS5zdGFydC5yb3chPXIucm93fHxpLnN0YXJ0LmNvbHVtbiE9ci5jb2x1bW4pcj1pLmVuZH1lbHNlIGlmKHM9PS0xJiZvPT0xKXI9aS5lbmQsdD1pLnN0YXJ0O2Vsc2V7dmFyIHU9YSh0aGlzLiRjbGlja1NlbGVjdGlvbixyKTtyPXUuY3Vyc29yLHQ9dS5hbmNob3J9bi5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKHQucm93LHQuY29sdW1uKX1uLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKHIpLG4ucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKX0sdGhpcy5zZWxlY3RFbmQ9dGhpcy5zZWxlY3RBbGxFbmQ9dGhpcy5zZWxlY3RCeVdvcmRzRW5kPXRoaXMuc2VsZWN0QnlMaW5lc0VuZD1mdW5jdGlvbigpe3RoaXMuJGNsaWNrU2VsZWN0aW9uPW51bGwsdGhpcy5lZGl0b3IudW5zZXRTdHlsZSgiYWNlX3NlbGVjdGluZyIpLHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcm9sbGVyLnJlbGVhc2VDYXB0dXJlJiZ0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JvbGxlci5yZWxlYXNlQ2FwdHVyZSgpfSx0aGlzLmZvY3VzV2FpdD1mdW5jdGlvbigpe3ZhciBlPXUodGhpcy5tb3VzZWRvd25FdmVudC54LHRoaXMubW91c2Vkb3duRXZlbnQueSx0aGlzLngsdGhpcy55KSx0PURhdGUubm93KCk7KGU+aXx8dC10aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU+dGhpcy4kZm9jdXNUaW1lb3V0KSYmdGhpcy5zdGFydFNlbGVjdCh0aGlzLm1vdXNlZG93bkV2ZW50LmdldERvY3VtZW50UG9zaXRpb24oKSl9LHRoaXMub25Eb3VibGVDbGljaz1mdW5jdGlvbihlKXt2YXIgdD1lLmdldERvY3VtZW50UG9zaXRpb24oKSxuPXRoaXMuZWRpdG9yLHI9bi5zZXNzaW9uLGk9ci5nZXRCcmFja2V0UmFuZ2UodCk7aT8oaS5pc0VtcHR5KCkmJihpLnN0YXJ0LmNvbHVtbi0tLGkuZW5kLmNvbHVtbisrKSx0aGlzLnNldFN0YXRlKCJzZWxlY3QiKSk6KGk9bi5zZWxlY3Rpb24uZ2V0V29yZFJhbmdlKHQucm93LHQuY29sdW1uKSx0aGlzLnNldFN0YXRlKCJzZWxlY3RCeVdvcmRzIikpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPWksdGhpcy5zZWxlY3QoKX0sdGhpcy5vblRyaXBsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLG49dGhpcy5lZGl0b3I7dGhpcy5zZXRTdGF0ZSgic2VsZWN0QnlMaW5lcyIpO3ZhciByPW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKTtyLmlzTXVsdGlMaW5lKCkmJnIuY29udGFpbnModC5yb3csdC5jb2x1bW4pPyh0aGlzLiRjbGlja1NlbGVjdGlvbj1uLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2Uoci5zdGFydC5yb3cpLHRoaXMuJGNsaWNrU2VsZWN0aW9uLmVuZD1uLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2Uoci5lbmQucm93KS5lbmQpOnRoaXMuJGNsaWNrU2VsZWN0aW9uPW4uc2VsZWN0aW9uLmdldExpbmVSYW5nZSh0LnJvdyksdGhpcy5zZWxlY3QoKX0sdGhpcy5vblF1YWRDbGljaz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVkaXRvcjt0LnNlbGVjdEFsbCgpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPXQuZ2V0U2VsZWN0aW9uUmFuZ2UoKSx0aGlzLnNldFN0YXRlKCJzZWxlY3RBbGwiKX0sdGhpcy5vbk1vdXNlV2hlZWw9ZnVuY3Rpb24oZSl7aWYoZS5nZXRBY2NlbEtleSgpKXJldHVybjtlLmdldFNoaWZ0S2V5KCkmJmUud2hlZWxZJiYhZS53aGVlbFgmJihlLndoZWVsWD1lLndoZWVsWSxlLndoZWVsWT0wKTt2YXIgdD10aGlzLmVkaXRvcjt0aGlzLiRsYXN0U2Nyb2xsfHwodGhpcy4kbGFzdFNjcm9sbD17dDowLHZ4OjAsdnk6MCxhbGxvd2VkOjB9KTt2YXIgbj10aGlzLiRsYXN0U2Nyb2xsLHI9ZS5kb21FdmVudC50aW1lU3RhbXAsaT1yLW4udCxvPWk/ZS53aGVlbFgvaTpuLnZ4LHU9aT9lLndoZWVsWS9pOm4udnk7aTxzJiYobz0obytuLnZ4KS8yLHU9KHUrbi52eSkvMik7dmFyIGE9TWF0aC5hYnMoby91KSxmPSExO2E+PTEmJnQucmVuZGVyZXIuaXNTY3JvbGxhYmxlQnkoZS53aGVlbFgqZS5zcGVlZCwwKSYmKGY9ITApLGE8PTEmJnQucmVuZGVyZXIuaXNTY3JvbGxhYmxlQnkoMCxlLndoZWVsWSplLnNwZWVkKSYmKGY9ITApO2lmKGYpbi5hbGxvd2VkPXI7ZWxzZSBpZihyLW4uYWxsb3dlZDxzKXt2YXIgbD1NYXRoLmFicyhvKTw9MS41Kk1hdGguYWJzKG4udngpJiZNYXRoLmFicyh1KTw9MS41Kk1hdGguYWJzKG4udnkpO2w/KGY9ITAsbi5hbGxvd2VkPXIpOm4uYWxsb3dlZD0wfW4udD1yLG4udng9byxuLnZ5PXU7aWYoZilyZXR1cm4gdC5yZW5kZXJlci5zY3JvbGxCeShlLndoZWVsWCplLnNwZWVkLGUud2hlZWxZKmUuc3BlZWQpLGUuc3RvcCgpfX0pLmNhbGwoby5wcm90b3R5cGUpLHQuRGVmYXVsdEhhbmRsZXJzPW99KSxhY2UuZGVmaW5lKCJhY2UvdG9vbHRpcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHMoZSl7dGhpcy5pc09wZW49ITEsdGhpcy4kZWxlbWVudD1udWxsLHRoaXMuJHBhcmVudE5vZGU9ZX12YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpOyhmdW5jdGlvbigpe3RoaXMuJGluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZWxlbWVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJGVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfdG9vbHRpcCIsdGhpcy4kZWxlbWVudC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLiRwYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMuJGVsZW1lbnQpLHRoaXMuJGVsZW1lbnR9LHRoaXMuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbGVtZW50fHx0aGlzLiRpbml0KCl9LHRoaXMuc2V0VGV4dD1mdW5jdGlvbihlKXt0aGlzLmdldEVsZW1lbnQoKS50ZXh0Q29udGVudD1lfSx0aGlzLnNldEh0bWw9ZnVuY3Rpb24oZSl7dGhpcy5nZXRFbGVtZW50KCkuaW5uZXJIVE1MPWV9LHRoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS5sZWZ0PWUrInB4Iix0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS50b3A9dCsicHgifSx0aGlzLnNldENsYXNzTmFtZT1mdW5jdGlvbihlKXtpLmFkZENzc0NsYXNzKHRoaXMuZ2V0RWxlbWVudCgpLGUpfSx0aGlzLnNob3c9ZnVuY3Rpb24oZSx0LG4pe2UhPW51bGwmJnRoaXMuc2V0VGV4dChlKSx0IT1udWxsJiZuIT1udWxsJiZ0aGlzLnNldFBvc2l0aW9uKHQsbiksdGhpcy5pc09wZW58fCh0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5pc09wZW49ITApfSx0aGlzLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmlzT3BlbiYmKHRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuaXNPcGVuPSExKX0sdGhpcy5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkub2Zmc2V0SGVpZ2h0fSx0aGlzLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RWxlbWVudCgpLm9mZnNldFdpZHRofSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmlzT3Blbj0hMSx0aGlzLiRlbGVtZW50JiZ0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUmJnRoaXMuJGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiRlbGVtZW50KX19KS5jYWxsKHMucHJvdG90eXBlKSx0LlRvb2x0aXA9c30pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnQiLCJhY2UvdG9vbHRpcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlKXtmdW5jdGlvbiBsKCl7dmFyIHI9dS5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LHM9bi4kYW5ub3RhdGlvbnNbcl07aWYoIXMpcmV0dXJuIGMoKTt2YXIgbz10LnNlc3Npb24uZ2V0TGVuZ3RoKCk7aWYocj09byl7dmFyIGE9dC5yZW5kZXJlci5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXMoMCx1LnkpLnJvdyxsPXUuJHBvcztpZihhPnQuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KGwucm93LGwuY29sdW1uKSlyZXR1cm4gYygpfWlmKGY9PXMpcmV0dXJuO2Y9cy50ZXh0LmpvaW4oIjxici8+IiksaS5zZXRIdG1sKGYpLGkuc2hvdygpLHQuX3NpZ25hbCgic2hvd0d1dHRlclRvb2x0aXAiLGkpLHQub24oIm1vdXNld2hlZWwiLGMpO2lmKGUuJHRvb2x0aXBGb2xsb3dzTW91c2UpaCh1KTtlbHNle3ZhciBwPXUuZG9tRXZlbnQudGFyZ2V0LGQ9cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx2PWkuZ2V0RWxlbWVudCgpLnN0eWxlO3YubGVmdD1kLnJpZ2h0KyJweCIsdi50b3A9ZC5ib3R0b20rInB4In19ZnVuY3Rpb24gYygpe28mJihvPWNsZWFyVGltZW91dChvKSksZiYmKGkuaGlkZSgpLGY9bnVsbCx0Ll9zaWduYWwoImhpZGVHdXR0ZXJUb29sdGlwIixpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLGMpKX1mdW5jdGlvbiBoKGUpe2kuc2V0UG9zaXRpb24oZS54LGUueSl9dmFyIHQ9ZS5lZGl0b3Isbj10LnJlbmRlcmVyLiRndXR0ZXJMYXllcixpPW5ldyBhKHQuY29udGFpbmVyKTtlLmVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVybW91c2Vkb3duIixmdW5jdGlvbihyKXtpZighdC5pc0ZvY3VzZWQoKXx8ci5nZXRCdXR0b24oKSE9MClyZXR1cm47dmFyIGk9bi5nZXRSZWdpb24ocik7aWYoaT09ImZvbGRXaWRnZXRzIilyZXR1cm47dmFyIHM9ci5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LG89dC5zZXNzaW9uLnNlbGVjdGlvbjtpZihyLmdldFNoaWZ0S2V5KCkpby5zZWxlY3RUbyhzLDApO2Vsc2V7aWYoci5kb21FdmVudC5kZXRhaWw9PTIpcmV0dXJuIHQuc2VsZWN0QWxsKCksci5wcmV2ZW50RGVmYXVsdCgpO2UuJGNsaWNrU2VsZWN0aW9uPXQuc2VsZWN0aW9uLmdldExpbmVSYW5nZShzKX1yZXR1cm4gZS5zZXRTdGF0ZSgic2VsZWN0QnlMaW5lcyIpLGUuY2FwdHVyZU1vdXNlKHIpLHIucHJldmVudERlZmF1bHQoKX0pO3ZhciBvLHUsZjtlLmVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVybW91c2Vtb3ZlIixmdW5jdGlvbih0KXt2YXIgbj10LmRvbUV2ZW50LnRhcmdldHx8dC5kb21FdmVudC5zcmNFbGVtZW50O2lmKHIuaGFzQ3NzQ2xhc3MobiwiYWNlX2ZvbGQtd2lkZ2V0IikpcmV0dXJuIGMoKTtmJiZlLiR0b29sdGlwRm9sbG93c01vdXNlJiZoKHQpLHU9dDtpZihvKXJldHVybjtvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsdSYmIWUuaXNNb3VzZVByZXNzZWQ/bCgpOmMoKX0sNTApfSkscy5hZGRMaXN0ZW5lcih0LnJlbmRlcmVyLiRndXR0ZXIsIm1vdXNlb3V0IixmdW5jdGlvbihlKXt1PW51bGw7aWYoIWZ8fG8pcmV0dXJuO289c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxjKCl9LDUwKX0pLHQub24oImNoYW5nZVNlc3Npb24iLGMpfWZ1bmN0aW9uIGEoZSl7by5jYWxsKHRoaXMsZSl9dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZSgiLi4vbGliL29vcCIpLHM9ZSgiLi4vbGliL2V2ZW50Iiksbz1lKCIuLi90b29sdGlwIikuVG9vbHRpcDtpLmluaGVyaXRzKGEsbyksZnVuY3Rpb24oKXt0aGlzLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49d2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxyPXdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxpPXRoaXMuZ2V0V2lkdGgoKSxzPXRoaXMuZ2V0SGVpZ2h0KCk7ZSs9MTUsdCs9MTUsZStpPm4mJihlLT1lK2ktbiksdCtzPnImJih0LT0yMCtzKSxvLnByb3RvdHlwZS5zZXRQb3NpdGlvbi5jYWxsKHRoaXMsZSx0KX19LmNhbGwoYS5wcm90b3R5cGUpLHQuR3V0dGVySGFuZGxlcj11fSksYWNlLmRlZmluZSgiYWNlL21vdXNlL21vdXNlX2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPXQuTW91c2VFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuZG9tRXZlbnQ9ZSx0aGlzLmVkaXRvcj10LHRoaXMueD10aGlzLmNsaWVudFg9ZS5jbGllbnRYLHRoaXMueT10aGlzLmNsaWVudFk9ZS5jbGllbnRZLHRoaXMuJHBvcz1udWxsLHRoaXMuJGluU2VsZWN0aW9uPW51bGwsdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExfTsoZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3Iuc3RvcFByb3BhZ2F0aW9uKHRoaXMuZG9tRXZlbnQpLHRoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfSx0aGlzLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7ci5wcmV2ZW50RGVmYXVsdCh0aGlzLmRvbUV2ZW50KSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3RoaXMuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLmdldERvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9zP3RoaXMuJHBvczoodGhpcy4kcG9zPXRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMuY2xpZW50WCx0aGlzLmNsaWVudFkpLHRoaXMuJHBvcyl9LHRoaXMuaW5TZWxlY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLiRpblNlbGVjdGlvbiE9PW51bGwpcmV0dXJuIHRoaXMuJGluU2VsZWN0aW9uO3ZhciBlPXRoaXMuZWRpdG9yLHQ9ZS5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHQuaXNFbXB0eSgpKXRoaXMuJGluU2VsZWN0aW9uPSExO2Vsc2V7dmFyIG49dGhpcy5nZXREb2N1bWVudFBvc2l0aW9uKCk7dGhpcy4kaW5TZWxlY3Rpb249dC5jb250YWlucyhuLnJvdyxuLmNvbHVtbil9cmV0dXJuIHRoaXMuJGluU2VsZWN0aW9ufSx0aGlzLmdldEJ1dHRvbj1mdW5jdGlvbigpe3JldHVybiByLmdldEJ1dHRvbih0aGlzLmRvbUV2ZW50KX0sdGhpcy5nZXRTaGlmdEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50LnNoaWZ0S2V5fSx0aGlzLmdldEFjY2VsS2V5PWkuaXNNYWM/ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5tZXRhS2V5fTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50LmN0cmxLZXl9fSkuY2FsbChzLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZHJhZ2Ryb3BfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmKGUpe2Z1bmN0aW9uIFQoZSxuKXt2YXIgcj1EYXRlLm5vdygpLGk9IW58fGUucm93IT1uLnJvdyxzPSFufHxlLmNvbHVtbiE9bi5jb2x1bW47aWYoIVN8fGl8fHMpdC5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKSxTPXIseD17eDpwLHk6ZH07ZWxzZXt2YXIgbz1sKHgueCx4LnkscCxkKTtvPmE/Uz1udWxsOnItUz49dSYmKHQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSxTPW51bGwpfX1mdW5jdGlvbiBOKGUsbil7dmFyIHI9RGF0ZS5ub3coKSxpPXQucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCxzPXQucmVuZGVyZXIubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgsdT10LnJlbmRlcmVyLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9e3g6e2xlZnQ6cC11LmxlZnQscmlnaHQ6dS5yaWdodC1wfSx5Ont0b3A6ZC11LnRvcCxib3R0b206dS5ib3R0b20tZH19LGY9TWF0aC5taW4oYS54LmxlZnQsYS54LnJpZ2h0KSxsPU1hdGgubWluKGEueS50b3AsYS55LmJvdHRvbSksYz17cm93OmUucm93LGNvbHVtbjplLmNvbHVtbn07Zi9zPD0yJiYoYy5jb2x1bW4rPWEueC5sZWZ0PGEueC5yaWdodD8tMzoyKSxsL2k8PTEmJihjLnJvdys9YS55LnRvcDxhLnkuYm90dG9tPy0xOjEpO3ZhciBoPWUucm93IT1jLnJvdyx2PWUuY29sdW1uIT1jLmNvbHVtbixtPSFufHxlLnJvdyE9bi5yb3c7aHx8diYmIW0/RT9yLUU+PW8mJnQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoYyk6RT1yOkU9bnVsbH1mdW5jdGlvbiBDKCl7dmFyIGU9ZztnPXQucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMocCxkKSxUKGcsZSksTihnLGUpfWZ1bmN0aW9uIGsoKXttPXQuc2VsZWN0aW9uLnRvT3JpZW50ZWRSYW5nZSgpLGg9dC5zZXNzaW9uLmFkZE1hcmtlcihtLCJhY2Vfc2VsZWN0aW9uIix0LmdldFNlbGVjdGlvblN0eWxlKCkpLHQuY2xlYXJTZWxlY3Rpb24oKSx0LmlzRm9jdXNlZCgpJiZ0LnJlbmRlcmVyLiRjdXJzb3JMYXllci5zZXRCbGlua2luZyghMSksY2xlYXJJbnRlcnZhbCh2KSxDKCksdj1zZXRJbnRlcnZhbChDLDIwKSx5PTAsaS5hZGRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixPKX1mdW5jdGlvbiBMKCl7Y2xlYXJJbnRlcnZhbCh2KSx0LnNlc3Npb24ucmVtb3ZlTWFya2VyKGgpLGg9bnVsbCx0LnNlbGVjdGlvbi5mcm9tT3JpZW50ZWRSYW5nZShtKSx0LmlzRm9jdXNlZCgpJiYhdyYmdC4kcmVzZXRDdXJzb3JTdHlsZSgpLG09bnVsbCxnPW51bGwseT0wLEU9bnVsbCxTPW51bGwsaS5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixPKX1mdW5jdGlvbiBPKCl7QT09bnVsbCYmKEE9c2V0VGltZW91dChmdW5jdGlvbigpe0EhPW51bGwmJmgmJkwoKX0sMjApKX1mdW5jdGlvbiBNKGUpe3ZhciB0PWUudHlwZXM7cmV0dXJuIXR8fEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwodCxmdW5jdGlvbihlKXtyZXR1cm4gZT09InRleHQvcGxhaW4ifHxlPT0iVGV4dCJ9KX1mdW5jdGlvbiBfKGUpe3ZhciB0PVsiY29weSIsImNvcHltb3ZlIiwiYWxsIiwidW5pbml0aWFsaXplZCJdLG49WyJtb3ZlIiwiY29weW1vdmUiLCJsaW5rbW92ZSIsImFsbCIsInVuaW5pdGlhbGl6ZWQiXSxyPXMuaXNNYWM/ZS5hbHRLZXk6ZS5jdHJsS2V5LGk9InVuaW5pdGlhbGl6ZWQiO3RyeXtpPWUuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQudG9Mb3dlckNhc2UoKX1jYXRjaChlKXt9dmFyIG89Im5vbmUiO3JldHVybiByJiZ0LmluZGV4T2YoaSk+PTA/bz0iY29weSI6bi5pbmRleE9mKGkpPj0wP289Im1vdmUiOnQuaW5kZXhPZihpKT49MCYmKG89ImNvcHkiKSxvfXZhciB0PWUuZWRpdG9yLG49ci5jcmVhdGVFbGVtZW50KCJpbWciKTtuLnNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT0iLHMuaXNPcGVyYSYmKG4uc3R5bGUuY3NzVGV4dD0id2lkdGg6MXB4O2hlaWdodDoxcHg7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3otaW5kZXg6MjE0NzQ4MzY0NztvcGFjaXR5OjA7Iik7dmFyIGY9WyJkcmFnV2FpdCIsImRyYWdXYWl0RW5kIiwic3RhcnREcmFnIiwiZHJhZ1JlYWR5RW5kIiwib25Nb3VzZURyYWciXTtmLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT10aGlzW3RdfSx0aGlzKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRG93bi5iaW5kKGUpKTt2YXIgYz10LmNvbnRhaW5lcixoLHAsZCx2LG0sZyx5PTAsYix3LEUsUyx4O3RoaXMub25EcmFnU3RhcnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5jYW5jZWxEcmFnfHwhYy5kcmFnZ2FibGUpe3ZhciByPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLnN0YXJ0U2VsZWN0KCksci5jYXB0dXJlTW91c2UoZSl9LDApLGUucHJldmVudERlZmF1bHQoKX1tPXQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt2YXIgaT1lLmRhdGFUcmFuc2ZlcjtpLmVmZmVjdEFsbG93ZWQ9dC5nZXRSZWFkT25seSgpPyJjb3B5IjoiY29weU1vdmUiLHMuaXNPcGVyYSYmKHQuY29udGFpbmVyLmFwcGVuZENoaWxkKG4pLG4uc2Nyb2xsVG9wPTApLGkuc2V0RHJhZ0ltYWdlJiZpLnNldERyYWdJbWFnZShuLDAsMCkscy5pc09wZXJhJiZ0LmNvbnRhaW5lci5yZW1vdmVDaGlsZChuKSxpLmNsZWFyRGF0YSgpLGkuc2V0RGF0YSgiVGV4dCIsdC5zZXNzaW9uLmdldFRleHRSYW5nZSgpKSx3PSEwLHRoaXMuc2V0U3RhdGUoImRyYWciKX0sdGhpcy5vbkRyYWdFbmQ9ZnVuY3Rpb24oZSl7Yy5kcmFnZ2FibGU9ITEsdz0hMSx0aGlzLnNldFN0YXRlKG51bGwpO2lmKCF0LmdldFJlYWRPbmx5KCkpe3ZhciBuPWUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q7IWImJm49PSJtb3ZlIiYmdC5zZXNzaW9uLnJlbW92ZSh0LmdldFNlbGVjdGlvblJhbmdlKCkpLHQuJHJlc2V0Q3Vyc29yU3R5bGUoKX10aGlzLmVkaXRvci51bnNldFN0eWxlKCJhY2VfZHJhZ2dpbmciKSx0aGlzLmVkaXRvci5yZW5kZXJlci5zZXRDdXJzb3JTdHlsZSgiIil9LHRoaXMub25EcmFnRW50ZXI9ZnVuY3Rpb24oZSl7aWYodC5nZXRSZWFkT25seSgpfHwhTShlLmRhdGFUcmFuc2ZlcikpcmV0dXJuO3JldHVybiBwPWUuY2xpZW50WCxkPWUuY2xpZW50WSxofHxrKCkseSsrLGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Yj1fKGUpLGkucHJldmVudERlZmF1bHQoZSl9LHRoaXMub25EcmFnT3Zlcj1mdW5jdGlvbihlKXtpZih0LmdldFJlYWRPbmx5KCl8fCFNKGUuZGF0YVRyYW5zZmVyKSlyZXR1cm47cmV0dXJuIHA9ZS5jbGllbnRYLGQ9ZS5jbGllbnRZLGh8fChrKCkseSsrKSxBIT09bnVsbCYmKEE9bnVsbCksZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD1iPV8oZSksaS5wcmV2ZW50RGVmYXVsdChlKX0sdGhpcy5vbkRyYWdMZWF2ZT1mdW5jdGlvbihlKXt5LS07aWYoeTw9MCYmaClyZXR1cm4gTCgpLGI9bnVsbCxpLnByZXZlbnREZWZhdWx0KGUpfSx0aGlzLm9uRHJvcD1mdW5jdGlvbihlKXtpZighZylyZXR1cm47dmFyIG49ZS5kYXRhVHJhbnNmZXI7aWYodylzd2l0Y2goYil7Y2FzZSJtb3ZlIjptLmNvbnRhaW5zKGcucm93LGcuY29sdW1uKT9tPXtzdGFydDpnLGVuZDpnfTptPXQubW92ZVRleHQobSxnKTticmVhaztjYXNlImNvcHkiOm09dC5tb3ZlVGV4dChtLGcsITApfWVsc2V7dmFyIHI9bi5nZXREYXRhKCJUZXh0Iik7bT17c3RhcnQ6ZyxlbmQ6dC5zZXNzaW9uLmluc2VydChnLHIpfSx0LmZvY3VzKCksYj1udWxsfXJldHVybiBMKCksaS5wcmV2ZW50RGVmYXVsdChlKX0saS5hZGRMaXN0ZW5lcihjLCJkcmFnc3RhcnQiLHRoaXMub25EcmFnU3RhcnQuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnZW5kIix0aGlzLm9uRHJhZ0VuZC5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdlbnRlciIsdGhpcy5vbkRyYWdFbnRlci5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdvdmVyIix0aGlzLm9uRHJhZ092ZXIuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnbGVhdmUiLHRoaXMub25EcmFnTGVhdmUuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcm9wIix0aGlzLm9uRHJvcC5iaW5kKGUpKTt2YXIgQT1udWxsfWZ1bmN0aW9uIGwoZSx0LG4scil7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhuLWUsMikrTWF0aC5wb3coci10LDIpKX12YXIgcj1lKCIuLi9saWIvZG9tIiksaT1lKCIuLi9saWIvZXZlbnQiKSxzPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxvPTIwMCx1PTIwMCxhPTU7KGZ1bmN0aW9uKCl7dGhpcy5kcmFnV2FpdD1mdW5jdGlvbigpe3ZhciBlPURhdGUubm93KCktdGhpcy5tb3VzZWRvd25FdmVudC50aW1lO2U+dGhpcy5lZGl0b3IuZ2V0RHJhZ0RlbGF5KCkmJnRoaXMuc3RhcnREcmFnKCl9LHRoaXMuZHJhZ1dhaXRFbmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVkaXRvci5jb250YWluZXI7ZS5kcmFnZ2FibGU9ITEsdGhpcy5zdGFydFNlbGVjdCh0aGlzLm1vdXNlZG93bkV2ZW50LmdldERvY3VtZW50UG9zaXRpb24oKSksdGhpcy5zZWxlY3RFbmQoKX0sdGhpcy5kcmFnUmVhZHlFbmQ9ZnVuY3Rpb24oZSl7dGhpcy5lZGl0b3IuJHJlc2V0Q3Vyc29yU3R5bGUoKSx0aGlzLmVkaXRvci51bnNldFN0eWxlKCJhY2VfZHJhZ2dpbmciKSx0aGlzLmVkaXRvci5yZW5kZXJlci5zZXRDdXJzb3JTdHlsZSgiIiksdGhpcy5kcmFnV2FpdEVuZCgpfSx0aGlzLnN0YXJ0RHJhZz1mdW5jdGlvbigpe3RoaXMuY2FuY2VsRHJhZz0hMTt2YXIgZT10aGlzLmVkaXRvcix0PWUuY29udGFpbmVyO3QuZHJhZ2dhYmxlPSEwLGUucmVuZGVyZXIuJGN1cnNvckxheWVyLnNldEJsaW5raW5nKCExKSxlLnNldFN0eWxlKCJhY2VfZHJhZ2dpbmciKTt2YXIgbj1zLmlzV2luPyJkZWZhdWx0IjoibW92ZSI7ZS5yZW5kZXJlci5zZXRDdXJzb3JTdHlsZShuKSx0aGlzLnNldFN0YXRlKCJkcmFnUmVhZHkiKX0sdGhpcy5vbk1vdXNlRHJhZz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVkaXRvci5jb250YWluZXI7aWYocy5pc0lFJiZ0aGlzLnN0YXRlPT0iZHJhZ1JlYWR5Iil7dmFyIG49bCh0aGlzLm1vdXNlZG93bkV2ZW50LngsdGhpcy5tb3VzZWRvd25FdmVudC55LHRoaXMueCx0aGlzLnkpO24+MyYmdC5kcmFnRHJvcCgpfWlmKHRoaXMuc3RhdGU9PT0iZHJhZ1dhaXQiKXt2YXIgbj1sKHRoaXMubW91c2Vkb3duRXZlbnQueCx0aGlzLm1vdXNlZG93bkV2ZW50LnksdGhpcy54LHRoaXMueSk7bj4wJiYodC5kcmFnZ2FibGU9ITEsdGhpcy5zdGFydFNlbGVjdCh0aGlzLm1vdXNlZG93bkV2ZW50LmdldERvY3VtZW50UG9zaXRpb24oKSkpfX0sdGhpcy5vbk1vdXNlRG93bj1mdW5jdGlvbihlKXtpZighdGhpcy4kZHJhZ0VuYWJsZWQpcmV0dXJuO3RoaXMubW91c2Vkb3duRXZlbnQ9ZTt2YXIgdD10aGlzLmVkaXRvcixuPWUuaW5TZWxlY3Rpb24oKSxyPWUuZ2V0QnV0dG9uKCksaT1lLmRvbUV2ZW50LmRldGFpbHx8MTtpZihpPT09MSYmcj09PTAmJm4pe2lmKGUuZWRpdG9yLmluTXVsdGlTZWxlY3RNb2RlJiYoZS5nZXRBY2NlbEtleSgpfHxlLmdldFNoaWZ0S2V5KCkpKXJldHVybjt0aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU9RGF0ZS5ub3coKTt2YXIgbz1lLmRvbUV2ZW50LnRhcmdldHx8ZS5kb21FdmVudC5zcmNFbGVtZW50OyJ1bnNlbGVjdGFibGUiaW4gbyYmKG8udW5zZWxlY3RhYmxlPSJvbiIpO2lmKHQuZ2V0RHJhZ0RlbGF5KCkpe2lmKHMuaXNXZWJLaXQpe3RoaXMuY2FuY2VsRHJhZz0hMDt2YXIgdT10LmNvbnRhaW5lcjt1LmRyYWdnYWJsZT0hMH10aGlzLnNldFN0YXRlKCJkcmFnV2FpdCIpfWVsc2UgdGhpcy5zdGFydERyYWcoKTt0aGlzLmNhcHR1cmVNb3VzZShlLHRoaXMub25Nb3VzZURyYWcuYmluZCh0aGlzKSksZS5kZWZhdWx0UHJldmVudGVkPSEwfX19KS5jYWxsKGYucHJvdG90eXBlKSx0LkRyYWdkcm9wSGFuZGxlcj1mfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL3RvdWNoX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9tb3VzZV9ldmVudCIpLk1vdXNlRXZlbnQsaT1lKCIuLi9saWIvZG9tIik7dC5hZGRUb3VjaExpc3RlbmVycz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHkoKXt2YXIgZT13aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLmNsaXBib2FyZCxyPSExLHM9ZnVuY3Rpb24oKXt2YXIgbj10LmdldENvcHlUZXh0KCkscz10LnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5oYXNVbmRvKCk7Zy5yZXBsYWNlQ2hpbGQoaS5idWlsZERvbShyP1sic3BhbiIsIW4mJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246InNlbGVjdGFsbCJ9LCJTZWxlY3QgQWxsIl0sbiYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoiY29weSJ9LCJDb3B5Il0sbiYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoiY3V0In0sIkN1dCJdLGUmJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246InBhc3RlIn0sIlBhc3RlIl0scyYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoidW5kbyJ9LCJVbmRvIl0sWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoiZmluZCJ9LCJGaW5kIl0sWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoib3BlbkNvbW1hbmRQYWxsZXRlIn0sIlBhbGxldGUiXV06WyJzcGFuIl0pLGcuZmlyc3RDaGlsZCl9LG89ZnVuY3Rpb24obil7dmFyIGk9bi50YXJnZXQuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTtpZihpPT0ibW9yZSJ8fCFyKXJldHVybiByPSFyLHMoKTtpZihpPT0icGFzdGUiKWUucmVhZFRleHQoKS50aGVuKGZ1bmN0aW9uKGUpe3QuZXhlY0NvbW1hbmQoaSxlKX0pO2Vsc2UgaWYoaSl7aWYoaT09ImN1dCJ8fGk9PSJjb3B5IillP2Uud3JpdGVUZXh0KHQuZ2V0Q29weVRleHQoKSk6ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTt0LmV4ZWNDb21tYW5kKGkpfWcuZmlyc3RDaGlsZC5zdHlsZS5kaXNwbGF5PSJub25lIixyPSExLGkhPSJvcGVuQ29tbWFuZFBhbGxldGUiJiZ0LmZvY3VzKCl9O2c9aS5idWlsZERvbShbImRpdiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtbWVudSIsb250b3VjaHN0YXJ0OmZ1bmN0aW9uKGUpe249Im1lbnUiLGUuc3RvcFByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLHQudGV4dElucHV0LmZvY3VzKCl9LG9udG91Y2hlbmQ6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbyhlKX0sb25jbGljazpvfSxbInNwYW4iXSxbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJtb3JlIn0sIi4uLiJdXSx0LmNvbnRhaW5lcil9ZnVuY3Rpb24gYigpe2d8fHkoKTt2YXIgZT10LnNlbGVjdGlvbi5jdXJzb3Isbj10LnJlbmRlcmVyLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzKGUucm93LGUuY29sdW1uKSxyPXQuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2cuc3R5bGUudG9wPW4ucGFnZVktci50b3AtMysicHgiLGcuc3R5bGUucmlnaHQ9IjEwcHgiLGcuc3R5bGUuZGlzcGxheT0iIixnLmZpcnN0Q2hpbGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsdC5vbigiaW5wdXQiLHcpfWZ1bmN0aW9uIHcoZSl7ZyYmKGcuc3R5bGUuZGlzcGxheT0ibm9uZSIpLHQub2ZmKCJpbnB1dCIsdyl9ZnVuY3Rpb24gRSgpe2Y9bnVsbCxjbGVhclRpbWVvdXQoZik7dmFyIGU9dC5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxyPWUuY29udGFpbnMoaC5yb3csaC5jb2x1bW4pO2lmKGUuaXNFbXB0eSgpfHwhcil0LnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihoKSx0LnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7bj0id2FpdCIsYigpfWZ1bmN0aW9uIFMoKXtmPW51bGwsY2xlYXJUaW1lb3V0KGYpLHQuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGgpO3ZhciBlPXA+PTI/dC5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKGgucm93KTp0LnNlc3Npb24uZ2V0QnJhY2tldFJhbmdlKGgpO2UmJiFlLmlzRW1wdHkoKT90LnNlbGVjdGlvbi5zZXRSYW5nZShlKTp0LnNlbGVjdGlvbi5zZWxlY3RXb3JkKCksbj0id2FpdCJ9ZnVuY3Rpb24geCgpe2MrPTYwLGw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtjLS08PTAmJihjbGVhckludGVydmFsKGwpLGw9bnVsbCksTWF0aC5hYnMoZCk8LjAxJiYoZD0wKSxNYXRoLmFicyh2KTwuMDEmJih2PTApLGM8MjAmJihkPS45KmQpLGM8MjAmJih2PS45KnYpO3ZhciBlPXQuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKTt0LnJlbmRlcmVyLnNjcm9sbEJ5KDEwKmQsMTAqdiksZT09dC5zZXNzaW9uLmdldFNjcm9sbFRvcCgpJiYoYz0wKX0sMTApfXZhciBuPSJzY3JvbGwiLHMsbyx1LGEsZixsLGM9MCxoLHA9MCxkPTAsdj0wLG0sZztlLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixmdW5jdGlvbihlKXtpZighbSlyZXR1cm47dmFyIG49dC50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpO24uZm9jdXMoKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7dmFyIGk9ZS50b3VjaGVzO2lmKGZ8fGkubGVuZ3RoPjEpe2NsZWFyVGltZW91dChmKSxmPW51bGwsdT0tMSxuPSJ6b29tIjtyZXR1cm59bT10LiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQ9ITA7dmFyIGw9dC5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0LGc9dC5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0LHk9ZS50aW1lU3RhbXA7YT15O3ZhciBiPWlbMF0sdz1iLmNsaWVudFgseD1iLmNsaWVudFk7TWF0aC5hYnMocy13KStNYXRoLmFicyhvLXgpPmwmJih1PS0xKSxzPWUuY2xpZW50WD13LG89ZS5jbGllbnRZPXgsZD12PTA7dmFyIFQ9bmV3IHIoZSx0KTtoPVQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO2lmKHktdTw1MDAmJmkubGVuZ3RoPT0xJiYhYylwKyssZS5wcmV2ZW50RGVmYXVsdCgpLGUuYnV0dG9uPTAsUygpO2Vsc2V7cD0wO3ZhciBOPXQuc2VsZWN0aW9uLmN1cnNvcixDPXQuc2VsZWN0aW9uLmlzRW1wdHkoKT9OOnQuc2VsZWN0aW9uLmFuY2hvcixrPXQucmVuZGVyZXIuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oTiwhMCksTD10LnJlbmRlcmVyLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKEMsITApLEE9dC5yZW5kZXJlci5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxPPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUvPWcsdD10L2wtLjc1LGUqZSt0KnR9O2lmKGUuY2xpZW50WDxBLmxlZnQpe249Inpvb20iO3JldHVybn12YXIgTT1PKGUuY2xpZW50WC1BLmxlZnQtay5sZWZ0LGUuY2xpZW50WS1BLnRvcC1rLnRvcCksXz1PKGUuY2xpZW50WC1BLmxlZnQtTC5sZWZ0LGUuY2xpZW50WS1BLnRvcC1MLnRvcCk7TTwzLjUmJl88My41JiYobj1NPl8/ImN1cnNvciI6ImFuY2hvciIpLF88My41P249ImFuY2hvciI6TTwzLjU/bj0iY3Vyc29yIjpuPSJzY3JvbGwiLGY9c2V0VGltZW91dChFLDQ1MCl9dT15fSksZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7bT10LiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQ9ITEsbCYmY2xlYXJJbnRlcnZhbChsKSxuPT0iem9vbSI/KG49IiIsYz0wKTpmPyh0LnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihoKSxjPTAsYigpKTpuPT0ic2Nyb2xsIj8oeCgpLGUucHJldmVudERlZmF1bHQoKSx3KCkpOmIoKSxjbGVhclRpbWVvdXQoZiksZj1udWxsfSksZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKGUpe2YmJihjbGVhclRpbWVvdXQoZiksZj1udWxsKTt2YXIgaT1lLnRvdWNoZXM7aWYoaS5sZW5ndGg+MXx8bj09Inpvb20iKXJldHVybjt2YXIgdT1pWzBdLGw9cy11LmNsaWVudFgsYz1vLXUuY2xpZW50WTtpZihuPT0id2FpdCIpe2lmKCEobCpsK2MqYz40KSlyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO249ImN1cnNvciJ9cz11LmNsaWVudFgsbz11LmNsaWVudFksZS5jbGllbnRYPXUuY2xpZW50WCxlLmNsaWVudFk9dS5jbGllbnRZO3ZhciBoPWUudGltZVN0YW1wLHA9aC1hO2E9aDtpZihuPT0ic2Nyb2xsIil7dmFyIG09bmV3IHIoZSx0KTttLnNwZWVkPTEsbS53aGVlbFg9bCxtLndoZWVsWT1jLDEwKk1hdGguYWJzKGwpPE1hdGguYWJzKGMpJiYobD0wKSwxMCpNYXRoLmFicyhjKTxNYXRoLmFicyhsKSYmKGM9MCkscCE9MCYmKGQ9bC9wLHY9Yy9wKSx0Ll9lbWl0KCJtb3VzZXdoZWVsIixtKSxtLnByb3BhZ2F0aW9uU3RvcHBlZHx8KGQ9dj0wKX1lbHNle3ZhciBnPW5ldyByKGUsdCkseT1nLmdldERvY3VtZW50UG9zaXRpb24oKTtuPT0iY3Vyc29yIj90LnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih5KTpuPT0iYW5jaG9yIiYmdC5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKHkucm93LHkuY29sdW1uKSx0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KHkpLGUucHJldmVudERlZmF1bHQoKX19KX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL25ldCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2RvbSIpO3QuZ2V0PWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IFhNTEh0dHBSZXF1ZXN0O24ub3BlbigiR0VUIixlLCEwKSxuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe24ucmVhZHlTdGF0ZT09PTQmJnQobi5yZXNwb25zZVRleHQpfSxuLnNlbmQobnVsbCl9LHQubG9hZFNjcmlwdD1mdW5jdGlvbihlLHQpe3ZhciBuPXIuZ2V0RG9jdW1lbnRIZWFkKCksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpLnNyYz1lLG4uYXBwZW5kQ2hpbGQoaSksaS5vbmxvYWQ9aS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oZSxuKXtpZihufHwhaS5yZWFkeVN0YXRlfHxpLnJlYWR5U3RhdGU9PSJsb2FkZWQifHxpLnJlYWR5U3RhdGU9PSJjb21wbGV0ZSIpaT1pLm9ubG9hZD1pLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLG58fHQoKX19LHQucXVhbGlmeVVSTD1mdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIHQuaHJlZj1lLHQuaHJlZn19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LGk9ZnVuY3Rpb24oKXt0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0scz1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07ci5fZW1pdD1yLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fZXZlbnRSZWdpc3RyeXx8KHRoaXMuX2V2ZW50UmVnaXN0cnk9e30pLHRoaXMuX2RlZmF1bHRIYW5kbGVyc3x8KHRoaXMuX2RlZmF1bHRIYW5kbGVycz17fSk7dmFyIG49dGhpcy5fZXZlbnRSZWdpc3RyeVtlXXx8W10scj10aGlzLl9kZWZhdWx0SGFuZGxlcnNbZV07aWYoIW4ubGVuZ3RoJiYhcilyZXR1cm47aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdCl0PXt9O3QudHlwZXx8KHQudHlwZT1lKSx0LnN0b3BQcm9wYWdhdGlvbnx8KHQuc3RvcFByb3BhZ2F0aW9uPWkpLHQucHJldmVudERlZmF1bHR8fCh0LnByZXZlbnREZWZhdWx0PXMpLG49bi5zbGljZSgpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXtuW29dKHQsdGhpcyk7aWYodC5wcm9wYWdhdGlvblN0b3BwZWQpYnJlYWt9aWYociYmIXQuZGVmYXVsdFByZXZlbnRlZClyZXR1cm4gcih0LHRoaXMpfSxyLl9zaWduYWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj0odGhpcy5fZXZlbnRSZWdpc3RyeXx8e30pW2VdO2lmKCFuKXJldHVybjtuPW4uc2xpY2UoKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdKHQsdGhpcyl9LHIub25jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24gcigpe24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIpLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7aWYoIXQpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3Q9ZX0pfSxyLnNldERlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZGVmYXVsdEhhbmRsZXJzO258fChuPXRoaXMuX2RlZmF1bHRIYW5kbGVycz17X2Rpc2FibGVkXzp7fX0pO2lmKG5bZV0pe3ZhciByPW5bZV0saT1uLl9kaXNhYmxlZF9bZV07aXx8KG4uX2Rpc2FibGVkX1tlXT1pPVtdKSxpLnB1c2gocik7dmFyIHM9aS5pbmRleE9mKHQpO3MhPS0xJiZpLnNwbGljZShzLDEpfW5bZV09dH0sci5yZW1vdmVEZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2RlZmF1bHRIYW5kbGVycztpZighbilyZXR1cm47dmFyIHI9bi5fZGlzYWJsZWRfW2VdO2lmKG5bZV09PXQpciYmdGhpcy5zZXREZWZhdWx0SGFuZGxlcihlLHIucG9wKCkpO2Vsc2UgaWYocil7dmFyIGk9ci5pbmRleE9mKHQpO2khPS0xJiZyLnNwbGljZShpLDEpfX0sci5vbj1yLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e307dmFyIHI9dGhpcy5fZXZlbnRSZWdpc3RyeVtlXTtyZXR1cm4gcnx8KHI9dGhpcy5fZXZlbnRSZWdpc3RyeVtlXT1bXSksci5pbmRleE9mKHQpPT0tMSYmcltuPyJ1bnNoaWZ0IjoicHVzaCJdKHQpLHR9LHIub2ZmPXIucmVtb3ZlTGlzdGVuZXI9ci5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fTt2YXIgbj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdO2lmKCFuKXJldHVybjt2YXIgcj1uLmluZGV4T2YodCk7ciE9PS0xJiZuLnNwbGljZShyLDEpfSxyLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt0aGlzLl9ldmVudFJlZ2lzdHJ5JiYodGhpcy5fZXZlbnRSZWdpc3RyeVtlXT1bXSl9LHQuRXZlbnRFbWl0dGVyPXJ9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2FwcF9jb25maWciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsibm8gdXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKX1mdW5jdGlvbiB1KGUsdCl7dmFyIG49bmV3IEVycm9yKGUpO24uZGF0YT10LHR5cGVvZiBjb25zb2xlPT0ib2JqZWN0IiYmY29uc29sZS5lcnJvciYmY29uc29sZS5lcnJvcihuKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgbn0pfXZhciByPWUoIi4vb29wIiksaT1lKCIuL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz17c2V0T3B0aW9uczpmdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuc2V0T3B0aW9uKHQsZVt0XSl9LHRoaXMpfSxnZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O2lmKCFlKXt2YXIgbj10aGlzLiRvcHRpb25zO2U9T2JqZWN0LmtleXMobikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFuW2VdLmhpZGRlbn0pfWVsc2UgQXJyYXkuaXNBcnJheShlKXx8KHQ9ZSxlPU9iamVjdC5rZXlzKHQpKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09dGhpcy5nZXRPcHRpb24oZSl9LHRoaXMpLHR9LHNldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKHRoaXNbIiQiK2VdPT09dClyZXR1cm47dmFyIG49dGhpcy4kb3B0aW9uc1tlXTtpZighbilyZXR1cm4gbygnbWlzc3BlbGxlZCBvcHRpb24gIicrZSsnIicpO2lmKG4uZm9yd2FyZFRvKXJldHVybiB0aGlzW24uZm9yd2FyZFRvXSYmdGhpc1tuLmZvcndhcmRUb10uc2V0T3B0aW9uKGUsdCk7bi5oYW5kbGVzU2V0fHwodGhpc1siJCIrZV09dCksbiYmbi5zZXQmJm4uc2V0LmNhbGwodGhpcyx0KX0sZ2V0T3B0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJG9wdGlvbnNbZV07cmV0dXJuIHQ/dC5mb3J3YXJkVG8/dGhpc1t0LmZvcndhcmRUb10mJnRoaXNbdC5mb3J3YXJkVG9dLmdldE9wdGlvbihlKTp0JiZ0LmdldD90LmdldC5jYWxsKHRoaXMpOnRoaXNbIiQiK2VdOm8oJ21pc3NwZWxsZWQgb3B0aW9uICInK2UrJyInKX19LGE9ZnVuY3Rpb24oKXt0aGlzLiRkZWZhdWx0T3B0aW9ucz17fX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLmRlZmluZU9wdGlvbnM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLiRvcHRpb25zfHwodGhpcy4kZGVmYXVsdE9wdGlvbnNbdF09ZS4kb3B0aW9ucz17fSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdO3R5cGVvZiByPT0ic3RyaW5nIiYmKHI9e2ZvcndhcmRUbzpyfSksci5uYW1lfHwoci5uYW1lPXQpLGUuJG9wdGlvbnNbci5uYW1lXT1yLCJpbml0aWFsVmFsdWUiaW4gciYmKGVbIiQiK3IubmFtZV09ci5pbml0aWFsVmFsdWUpfSksci5pbXBsZW1lbnQoZSxzKSx0aGlzfSx0aGlzLnJlc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlLiRvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWUuJG9wdGlvbnNbdF07InZhbHVlImluIG4mJmUuc2V0T3B0aW9uKHQsbi52YWx1ZSl9KX0sdGhpcy5zZXREZWZhdWx0VmFsdWU9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlKXtmb3IoZSBpbiB0aGlzLiRkZWZhdWx0T3B0aW9ucylpZih0aGlzLiRkZWZhdWx0T3B0aW9uc1tlXVt0XSlicmVhaztpZighdGhpcy4kZGVmYXVsdE9wdGlvbnNbZV1bdF0pcmV0dXJuITF9dmFyIHI9dGhpcy4kZGVmYXVsdE9wdGlvbnNbZV18fCh0aGlzLiRkZWZhdWx0T3B0aW9uc1tlXT17fSk7clt0XSYmKHIuZm9yd2FyZFRvP3RoaXMuc2V0RGVmYXVsdFZhbHVlKHIuZm9yd2FyZFRvLHQsbik6clt0XS52YWx1ZT1uKX0sdGhpcy5zZXREZWZhdWx0VmFsdWVzPWZ1bmN0aW9uKGUsdCl7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0aGlzLnNldERlZmF1bHRWYWx1ZShlLG4sdFtuXSl9LHRoaXMpfSx0aGlzLndhcm49byx0aGlzLnJlcG9ydEVycm9yPXV9KS5jYWxsKGEucHJvdG90eXBlKSx0LkFwcENvbmZpZz1hfSksYWNlLmRlZmluZSgiYWNlL2NvbmZpZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9uZXQiLCJhY2UvbGliL2FwcF9jb25maWciXSxmdW5jdGlvbihlLHQsbil7Im5vIHVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwocil7aWYoIXV8fCF1LmRvY3VtZW50KXJldHVybjthLnBhY2thZ2VkPXJ8fGUucGFja2FnZWR8fG4ucGFja2FnZWR8fHUuZGVmaW5lJiZkZWZpbmUucGFja2FnZWQ7dmFyIGk9e30scz0iIixvPWRvY3VtZW50LmN1cnJlbnRTY3JpcHR8fGRvY3VtZW50Ll9jdXJyZW50U2NyaXB0LGY9byYmby5vd25lckRvY3VtZW50fHxkb2N1bWVudCxsPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgcD1sW2hdLGQ9cC5zcmN8fHAuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZighZCljb250aW51ZTt2YXIgdj1wLmF0dHJpYnV0ZXM7Zm9yKHZhciBtPTAsZz12Lmxlbmd0aDttPGc7bSsrKXt2YXIgeT12W21dO3kubmFtZS5pbmRleE9mKCJkYXRhLWFjZS0iKT09PTAmJihpW2MoeS5uYW1lLnJlcGxhY2UoL15kYXRhLWFjZS0vLCIiKSldPXkudmFsdWUpfXZhciBiPWQubWF0Y2goL14oLiopXC9hY2UoXC1cdyspP1wuanMoXD98JCkvKTtiJiYocz1iWzFdKX1zJiYoaS5iYXNlPWkuYmFzZXx8cyxpLnBhY2thZ2VkPSEwKSxpLmJhc2VQYXRoPWkuYmFzZSxpLndvcmtlclBhdGg9aS53b3JrZXJQYXRofHxpLmJhc2UsaS5tb2RlUGF0aD1pLm1vZGVQYXRofHxpLmJhc2UsaS50aGVtZVBhdGg9aS50aGVtZVBhdGh8fGkuYmFzZSxkZWxldGUgaS5iYXNlO2Zvcih2YXIgdyBpbiBpKXR5cGVvZiBpW3ddIT0idW5kZWZpbmVkIiYmdC5zZXQodyxpW3ddKX1mdW5jdGlvbiBjKGUpe3JldHVybiBlLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9KX12YXIgcj1lKCIuL2xpYi9sYW5nIiksaT1lKCIuL2xpYi9vb3AiKSxzPWUoIi4vbGliL25ldCIpLG89ZSgiLi9saWIvYXBwX2NvbmZpZyIpLkFwcENvbmZpZztuLmV4cG9ydHM9dD1uZXcgbzt2YXIgdT1mdW5jdGlvbigpe3JldHVybiB0aGlzfHx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93fSgpLGE9e3BhY2thZ2VkOiExLHdvcmtlclBhdGg6bnVsbCxtb2RlUGF0aDpudWxsLHRoZW1lUGF0aDpudWxsLGJhc2VQYXRoOiIiLHN1ZmZpeDoiLmpzIiwkbW9kdWxlVXJsczp7fSxsb2FkV29ya2VyRnJvbUJsb2I6ITAsc2hhcmVkUG9wdXBzOiExfTt0LmdldD1mdW5jdGlvbihlKXtpZighYS5oYXNPd25Qcm9wZXJ0eShlKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29uZmlnIGtleTogIitlKTtyZXR1cm4gYVtlXX0sdC5zZXQ9ZnVuY3Rpb24oZSx0KXtpZihhLmhhc093blByb3BlcnR5KGUpKWFbZV09dDtlbHNlIGlmKHRoaXMuc2V0RGVmYXVsdFZhbHVlKCIiLGUsdCk9PTApdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbmZpZyBrZXk6ICIrZSl9LHQuYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHIuY29weU9iamVjdChhKX0sdC4kbW9kZXM9e30sdC5tb2R1bGVVcmw9ZnVuY3Rpb24oZSx0KXtpZihhLiRtb2R1bGVVcmxzW2VdKXJldHVybiBhLiRtb2R1bGVVcmxzW2VdO3ZhciBuPWUuc3BsaXQoIi8iKTt0PXR8fG5bbi5sZW5ndGgtMl18fCIiO3ZhciByPXQ9PSJzbmlwcGV0cyI/Ii8iOiItIixpPW5bbi5sZW5ndGgtMV07aWYodD09IndvcmtlciImJnI9PSItIil7dmFyIHM9bmV3IFJlZ0V4cCgiXiIrdCsiW1xcLV9dfFtcXC1fXSIrdCsiJCIsImciKTtpPWkucmVwbGFjZShzLCIiKX0oIWl8fGk9PXQpJiZuLmxlbmd0aD4xJiYoaT1uW24ubGVuZ3RoLTJdKTt2YXIgbz1hW3QrIlBhdGgiXTtyZXR1cm4gbz09bnVsbD9vPWEuYmFzZVBhdGg6cj09Ii8iJiYodD1yPSIiKSxvJiZvLnNsaWNlKC0xKSE9Ii8iJiYobys9Ii8iKSxvK3QrcitpK3RoaXMuZ2V0KCJzdWZmaXgiKX0sdC5zZXRNb2R1bGVVcmw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS4kbW9kdWxlVXJsc1tlXT10fSx0LiRsb2FkaW5nPXt9LHQubG9hZE1vZHVsZT1mdW5jdGlvbihuLHIpe3ZhciBpLG87QXJyYXkuaXNBcnJheShuKSYmKG89blswXSxuPW5bMV0pO3RyeXtpPWUobil9Y2F0Y2godSl7fWlmKGkmJiF0LiRsb2FkaW5nW25dKXJldHVybiByJiZyKGkpO3QuJGxvYWRpbmdbbl18fCh0LiRsb2FkaW5nW25dPVtdKSx0LiRsb2FkaW5nW25dLnB1c2gocik7aWYodC4kbG9hZGluZ1tuXS5sZW5ndGg+MSlyZXR1cm47dmFyIGE9ZnVuY3Rpb24oKXtlKFtuXSxmdW5jdGlvbihlKXt0Ll9lbWl0KCJsb2FkLm1vZHVsZSIse25hbWU6bixtb2R1bGU6ZX0pO3ZhciByPXQuJGxvYWRpbmdbbl07dC4kbG9hZGluZ1tuXT1udWxsLHIuZm9yRWFjaChmdW5jdGlvbih0KXt0JiZ0KGUpfSl9KX07aWYoIXQuZ2V0KCJwYWNrYWdlZCIpKXJldHVybiBhKCk7cy5sb2FkU2NyaXB0KHQubW9kdWxlVXJsKG4sbyksYSksZigpfTt2YXIgZj1mdW5jdGlvbigpeyFhLmJhc2VQYXRoJiYhYS53b3JrZXJQYXRoJiYhYS5tb2RlUGF0aCYmIWEudGhlbWVQYXRoJiYhT2JqZWN0LmtleXMoYS4kbW9kdWxlVXJscykubGVuZ3RoJiYoY29uc29sZS5lcnJvcigiVW5hYmxlIHRvIGluZmVyIHBhdGggdG8gYWNlIGZyb20gc2NyaXB0IHNyYywiLCJ1c2UgYWNlLmNvbmZpZy5zZXQoJ2Jhc2VQYXRoJywgJ3BhdGgnKSB0byBlbmFibGUgZHluYW1pYyBsb2FkaW5nIG9mIG1vZGVzIGFuZCB0aGVtZXMiLCJvciB3aXRoIHdlYnBhY2sgdXNlIGFjZS93ZWJwYWNrLXJlc29sdmVyIiksZj1mdW5jdGlvbigpe30pfTt0LmluaXQ9bCx0LnZlcnNpb249IjEuNC42In0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMiLCJhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIsImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsImFjZS9tb3VzZS9kcmFnZHJvcF9oYW5kbGVyIiwiYWNlL21vdXNlL3RvdWNoX2hhbmRsZXIiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPWUoIi4vZGVmYXVsdF9oYW5kbGVycyIpLkRlZmF1bHRIYW5kbGVycyxvPWUoIi4vZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIpLkd1dHRlckhhbmRsZXIsdT1lKCIuL21vdXNlX2V2ZW50IikuTW91c2VFdmVudCxhPWUoIi4vZHJhZ2Ryb3BfaGFuZGxlciIpLkRyYWdkcm9wSGFuZGxlcixmPWUoIi4vdG91Y2hfaGFuZGxlciIpLmFkZFRvdWNoTGlzdGVuZXJzLGw9ZSgiLi4vY29uZmlnIiksYz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZWRpdG9yPWUsbmV3IHModGhpcyksbmV3IG8odGhpcyksbmV3IGEodGhpcyk7dmFyIG49ZnVuY3Rpb24odCl7dmFyIG49IWRvY3VtZW50Lmhhc0ZvY3VzfHwhZG9jdW1lbnQuaGFzRm9jdXMoKXx8IWUuaXNGb2N1c2VkKCkmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PShlLnRleHRJbnB1dCYmZS50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpKTtuJiZ3aW5kb3cuZm9jdXMoKSxlLmZvY3VzKCl9LHU9ZS5yZW5kZXJlci5nZXRNb3VzZUV2ZW50VGFyZ2V0KCk7ci5hZGRMaXN0ZW5lcih1LCJjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJjbGljayIpKSxyLmFkZExpc3RlbmVyKHUsIm1vdXNlbW92ZSIsdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsIm1vdXNlbW92ZSIpKSxyLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIoW3UsZS5yZW5kZXJlci5zY3JvbGxCYXJWJiZlLnJlbmRlcmVyLnNjcm9sbEJhclYuaW5uZXIsZS5yZW5kZXJlci5zY3JvbGxCYXJIJiZlLnJlbmRlcmVyLnNjcm9sbEJhckguaW5uZXIsZS50ZXh0SW5wdXQmJmUudGV4dElucHV0LmdldEVsZW1lbnQoKV0uZmlsdGVyKEJvb2xlYW4pLFs0MDAsMzAwLDI1MF0sdGhpcywib25Nb3VzZUV2ZW50Iiksci5hZGRNb3VzZVdoZWVsTGlzdGVuZXIoZS5jb250YWluZXIsdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzLCJtb3VzZXdoZWVsIikpLGYoZS5jb250YWluZXIsZSk7dmFyIGw9ZS5yZW5kZXJlci4kZ3V0dGVyO3IuYWRkTGlzdGVuZXIobCwibW91c2Vkb3duIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcm1vdXNlZG93biIpKSxyLmFkZExpc3RlbmVyKGwsImNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcmNsaWNrIikpLHIuYWRkTGlzdGVuZXIobCwiZGJsY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVyZGJsY2xpY2siKSksci5hZGRMaXN0ZW5lcihsLCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVybW91c2Vtb3ZlIikpLHIuYWRkTGlzdGVuZXIodSwibW91c2Vkb3duIixuKSxyLmFkZExpc3RlbmVyKGwsIm1vdXNlZG93biIsbiksaS5pc0lFJiZlLnJlbmRlcmVyLnNjcm9sbEJhclYmJihyLmFkZExpc3RlbmVyKGUucmVuZGVyZXIuc2Nyb2xsQmFyVi5lbGVtZW50LCJtb3VzZWRvd24iLG4pLHIuYWRkTGlzdGVuZXIoZS5yZW5kZXJlci5zY3JvbGxCYXJILmVsZW1lbnQsIm1vdXNlZG93biIsbikpLGUub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24obil7aWYodC5zdGF0ZXx8dC4kZHJhZ0RlbGF5fHwhdC4kZHJhZ0VuYWJsZWQpcmV0dXJuO3ZhciByPWUucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMobi54LG4ueSksaT1lLnNlc3Npb24uc2VsZWN0aW9uLmdldFJhbmdlKCkscz1lLnJlbmRlcmVyOyFpLmlzRW1wdHkoKSYmaS5pbnNpZGVTdGFydChyLnJvdyxyLmNvbHVtbik/cy5zZXRDdXJzb3JTdHlsZSgiZGVmYXVsdCIpOnMuc2V0Q3Vyc29yU3R5bGUoIiIpfSl9OyhmdW5jdGlvbigpe3RoaXMub25Nb3VzZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5lZGl0b3IuX2VtaXQoZSxuZXcgdSh0LHRoaXMuZWRpdG9yKSl9LHRoaXMub25Nb3VzZU1vdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeSYmdGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkubW91c2Vtb3ZlO2lmKCFufHwhbi5sZW5ndGgpcmV0dXJuO3RoaXMuZWRpdG9yLl9lbWl0KGUsbmV3IHUodCx0aGlzLmVkaXRvcikpfSx0aGlzLm9uTW91c2VXaGVlbD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyB1KHQsdGhpcy5lZGl0b3IpO24uc3BlZWQ9dGhpcy4kc2Nyb2xsU3BlZWQqMixuLndoZWVsWD10LndoZWVsWCxuLndoZWVsWT10LndoZWVsWSx0aGlzLmVkaXRvci5fZW1pdChlLG4pfSx0aGlzLnNldFN0YXRlPWZ1bmN0aW9uKGUpe3RoaXMuc3RhdGU9ZX0sdGhpcy5jYXB0dXJlTW91c2U9ZnVuY3Rpb24oZSx0KXt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy5pc01vdXNlUHJlc3NlZD0hMDt2YXIgbj10aGlzLmVkaXRvcixzPXRoaXMuZWRpdG9yLnJlbmRlcmVyO3MuJGlzTW91c2VQcmVzc2VkPSEwO3ZhciBvPXRoaXMsYT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47aWYoaS5pc1dlYktpdCYmIWUud2hpY2gmJm8ucmVsZWFzZU1vdXNlKXJldHVybiBvLnJlbGVhc2VNb3VzZSgpO28ueD1lLmNsaWVudFgsby55PWUuY2xpZW50WSx0JiZ0KGUpLG8ubW91c2VFdmVudD1uZXcgdShlLG8uZWRpdG9yKSxvLiRtb3VzZU1vdmVkPSEwfSxmPWZ1bmN0aW9uKGUpe24ub2ZmKCJiZWZvcmVFbmRPcGVyYXRpb24iLGMpLGNsZWFySW50ZXJ2YWwoaCksbCgpLG9bby5zdGF0ZSsiRW5kIl0mJm9bby5zdGF0ZSsiRW5kIl0oZSksby5zdGF0ZT0iIixvLmlzTW91c2VQcmVzc2VkPXMuJGlzTW91c2VQcmVzc2VkPSExLHMuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yJiZzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLG8uJG9uQ2FwdHVyZU1vdXNlTW92ZT1vLnJlbGVhc2VNb3VzZT1udWxsLGUmJm8ub25Nb3VzZUV2ZW50KCJtb3VzZXVwIixlKSxuLmVuZE9wZXJhdGlvbigpfSxsPWZ1bmN0aW9uKCl7b1tvLnN0YXRlXSYmb1tvLnN0YXRlXSgpLG8uJG1vdXNlTW92ZWQ9ITF9O2lmKGkuaXNPbGRJRSYmZS5kb21FdmVudC50eXBlPT0iZGJsY2xpY2siKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZihlKX0pO3ZhciBjPWZ1bmN0aW9uKGUpe2lmKCFvLnJlbGVhc2VNb3VzZSlyZXR1cm47bi5jdXJPcC5jb21tYW5kLm5hbWUmJm4uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCYmKG9bby5zdGF0ZSsiRW5kIl0mJm9bby5zdGF0ZSsiRW5kIl0oKSxvLnN0YXRlPSIiLG8ucmVsZWFzZU1vdXNlKCkpfTtuLm9uKCJiZWZvcmVFbmRPcGVyYXRpb24iLGMpLG4uc3RhcnRPcGVyYXRpb24oe2NvbW1hbmQ6e25hbWU6Im1vdXNlIn19KSxvLiRvbkNhcHR1cmVNb3VzZU1vdmU9YSxvLnJlbGVhc2VNb3VzZT1yLmNhcHR1cmUodGhpcy5lZGl0b3IuY29udGFpbmVyLGEsZik7dmFyIGg9c2V0SW50ZXJ2YWwobCwyMCl9LHRoaXMucmVsZWFzZU1vdXNlPW51bGwsdGhpcy5jYW5jZWxDb250ZXh0TWVudT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQpe2lmKHQmJnQuZG9tRXZlbnQmJnQuZG9tRXZlbnQudHlwZSE9ImNvbnRleHRtZW51IilyZXR1cm47dGhpcy5lZGl0b3Iub2ZmKCJuYXRpdmVjb250ZXh0bWVudSIsZSksdCYmdC5kb21FdmVudCYmci5zdG9wRXZlbnQodC5kb21FdmVudCl9LmJpbmQodGhpcyk7c2V0VGltZW91dChlLDEwKSx0aGlzLmVkaXRvci5vbigibmF0aXZlY29udGV4dG1lbnUiLGUpfX0pLmNhbGwoYy5wcm90b3R5cGUpLGwuZGVmaW5lT3B0aW9ucyhjLnByb3RvdHlwZSwibW91c2VIYW5kbGVyIix7c2Nyb2xsU3BlZWQ6e2luaXRpYWxWYWx1ZToyfSxkcmFnRGVsYXk6e2luaXRpYWxWYWx1ZTppLmlzTWFjPzE1MDowfSxkcmFnRW5hYmxlZDp7aW5pdGlhbFZhbHVlOiEwfSxmb2N1c1RpbWVvdXQ6e2luaXRpYWxWYWx1ZTowfSx0b29sdGlwRm9sbG93c01vdXNlOntpbml0aWFsVmFsdWU6ITB9fSksdC5Nb3VzZUhhbmRsZXI9Y30pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9mb2xkX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtlLm9uKCJjbGljayIsZnVuY3Rpb24odCl7dmFyIG49dC5nZXREb2N1bWVudFBvc2l0aW9uKCksaT1lLnNlc3Npb24scz1pLmdldEZvbGRBdChuLnJvdyxuLmNvbHVtbiwxKTtzJiYodC5nZXRBY2NlbEtleSgpP2kucmVtb3ZlRm9sZChzKTppLmV4cGFuZEZvbGQocyksdC5zdG9wKCkpO3ZhciBvPXQuZG9tRXZlbnQmJnQuZG9tRXZlbnQudGFyZ2V0O28mJnIuaGFzQ3NzQ2xhc3MobywiYWNlX2lubGluZV9idXR0b24iKSYmci5oYXNDc3NDbGFzcyhvLCJhY2VfdG9nZ2xlX3dyYXAiKSYmKGkuc2V0T3B0aW9uKCJ3cmFwIiwhaS5nZXRVc2VXcmFwTW9kZSgpKSxlLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCkpfSksZS5vbigiZ3V0dGVyY2xpY2siLGZ1bmN0aW9uKHQpe3ZhciBuPWUucmVuZGVyZXIuJGd1dHRlckxheWVyLmdldFJlZ2lvbih0KTtpZihuPT0iZm9sZFdpZGdldHMiKXt2YXIgcj10LmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csaT1lLnNlc3Npb247aS5mb2xkV2lkZ2V0cyYmaS5mb2xkV2lkZ2V0c1tyXSYmZS5zZXNzaW9uLm9uRm9sZFdpZGdldENsaWNrKHIsdCksZS5pc0ZvY3VzZWQoKXx8ZS5mb2N1cygpLHQuc3RvcCgpfX0pLGUub24oImd1dHRlcmRibGNsaWNrIixmdW5jdGlvbih0KXt2YXIgbj1lLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRSZWdpb24odCk7aWYobj09ImZvbGRXaWRnZXRzIil7dmFyIHI9dC5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LGk9ZS5zZXNzaW9uLHM9aS5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhKHIsITApLG89cy5yYW5nZXx8cy5maXJzdFJhbmdlO2lmKG8pe3I9by5zdGFydC5yb3c7dmFyIHU9aS5nZXRGb2xkQXQocixpLmdldExpbmUocikubGVuZ3RoLDEpO3U/aS5yZW1vdmVGb2xkKHUpOihpLmFkZEZvbGQoIi4uLiIsbyksZS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyh7cm93Om8uc3RhcnQucm93LGNvbHVtbjowfSkpfXQuc3RvcCgpfX0pfXZhciByPWUoIi4uL2xpYi9kb20iKTt0LkZvbGRIYW5kbGVyPWl9KSxhY2UuZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvZXZlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9rZXlzIiksaT1lKCIuLi9saWIvZXZlbnQiKSxzPWZ1bmN0aW9uKGUpe3RoaXMuJGVkaXRvcj1lLHRoaXMuJGRhdGE9e2VkaXRvcjplfSx0aGlzLiRoYW5kbGVycz1bXSx0aGlzLnNldERlZmF1bHRIYW5kbGVyKGUuY29tbWFuZHMpfTsoZnVuY3Rpb24oKXt0aGlzLnNldERlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKHRoaXMuJGRlZmF1bHRIYW5kbGVyKSx0aGlzLiRkZWZhdWx0SGFuZGxlcj1lLHRoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyKGUsMCl9LHRoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGhhbmRsZXJzO2lmKHRbdC5sZW5ndGgtMV09PWUpcmV0dXJuO3doaWxlKHRbdC5sZW5ndGgtMV0mJnRbdC5sZW5ndGgtMV0hPXRoaXMuJGRlZmF1bHRIYW5kbGVyKXRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKHRbdC5sZW5ndGgtMV0pO3RoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyKGUsMSl9LHRoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuO3R5cGVvZiBlPT0iZnVuY3Rpb24iJiYhZS5oYW5kbGVLZXlib2FyZCYmKGUuaGFuZGxlS2V5Ym9hcmQ9ZSk7dmFyIG49dGhpcy4kaGFuZGxlcnMuaW5kZXhPZihlKTtuIT0tMSYmdGhpcy4kaGFuZGxlcnMuc3BsaWNlKG4sMSksdD09dW5kZWZpbmVkP3RoaXMuJGhhbmRsZXJzLnB1c2goZSk6dGhpcy4kaGFuZGxlcnMuc3BsaWNlKHQsMCxlKSxuPT0tMSYmZS5hdHRhY2gmJmUuYXR0YWNoKHRoaXMuJGVkaXRvcil9LHRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGhhbmRsZXJzLmluZGV4T2YoZSk7cmV0dXJuIHQ9PS0xPyExOih0aGlzLiRoYW5kbGVycy5zcGxpY2UodCwxKSxlLmRldGFjaCYmZS5kZXRhY2godGhpcy4kZWRpdG9yKSwhMCl9LHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aC0xXX0sdGhpcy5nZXRTdGF0dXNUZXh0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZGF0YSx0PWUuZWRpdG9yO3JldHVybiB0aGlzLiRoYW5kbGVycy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U3RhdHVzVGV4dCYmbi5nZXRTdGF0dXNUZXh0KHQsZSl8fCIifSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKX0sdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIHMsbz0hMSx1PXRoaXMuJGVkaXRvci5jb21tYW5kcztmb3IodmFyIGE9dGhpcy4kaGFuZGxlcnMubGVuZ3RoO2EtLTspe3M9dGhpcy4kaGFuZGxlcnNbYV0uaGFuZGxlS2V5Ym9hcmQodGhpcy4kZGF0YSxlLHQsbixyKTtpZighc3x8IXMuY29tbWFuZCljb250aW51ZTtzLmNvbW1hbmQ9PSJudWxsIj9vPSEwOm89dS5leGVjKHMuY29tbWFuZCx0aGlzLiRlZGl0b3Iscy5hcmdzLHIpLG8mJnImJmUhPS0xJiZzLnBhc3NFdmVudCE9MSYmcy5jb21tYW5kLnBhc3NFdmVudCE9MSYmaS5zdG9wRXZlbnQocik7aWYobylicmVha31yZXR1cm4hbyYmZT09LTEmJihzPXtjb21tYW5kOiJpbnNlcnRzdHJpbmcifSxvPXUuZXhlYygiaW5zZXJ0c3RyaW5nIix0aGlzLiRlZGl0b3IsdCkpLG8mJnRoaXMuJGVkaXRvci5fc2lnbmFsJiZ0aGlzLiRlZGl0b3IuX3NpZ25hbCgia2V5Ym9hcmRBY3Rpdml0eSIscyksb30sdGhpcy5vbkNvbW1hbmRLZXk9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXIua2V5Q29kZVRvU3RyaW5nKG4pO3JldHVybiB0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycyh0LGksbixlKX0sdGhpcy5vblRleHRJbnB1dD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoLTEsZSl9fSkuY2FsbChzLnByb3RvdHlwZSksdC5LZXlCaW5kaW5nPXN9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2JpZGl1dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBGKGUsdCxuLHIpe3ZhciBpPXM/ZDpwLGM9bnVsbCxoPW51bGwsdj1udWxsLG09MCxnPW51bGwseT1udWxsLGI9LTEsdz1udWxsLEU9bnVsbCxUPVtdO2lmKCFyKWZvcih3PTAscj1bXTt3PG47dysrKXJbd109UihlW3ddKTtvPXMsdT0hMSxhPSExLGY9ITEsbD0hMTtmb3IoRT0wO0U8bjtFKyspe2M9bSxUW0VdPWg9cShlLHIsVCxFKSxtPWlbY11baF0sZz1tJjI0MCxtJj0xNSx0W0VdPXY9aVttXVs1XTtpZihnPjApaWYoZz09MTYpe2Zvcih3PWI7dzxFO3crKyl0W3ddPTE7Yj0tMX1lbHNlIGI9LTE7eT1pW21dWzZdO2lmKHkpYj09LTEmJihiPUUpO2Vsc2UgaWYoYj4tMSl7Zm9yKHc9Yjt3PEU7dysrKXRbd109djtiPS0xfXJbRV09PVMmJih0W0VdPTApLG98PXZ9aWYobClmb3Iodz0wO3c8bjt3KyspaWYoclt3XT09eCl7dFt3XT1zO2Zvcih2YXIgQz13LTE7Qz49MDtDLS0pe2lmKHJbQ10hPU4pYnJlYWs7dFtDXT1zfX19ZnVuY3Rpb24gSShlLHQsbil7aWYobzxlKXJldHVybjtpZihlPT0xJiZzPT1tJiYhZil7bi5yZXZlcnNlKCk7cmV0dXJufXZhciByPW4ubGVuZ3RoLGk9MCx1LGEsbCxjO3doaWxlKGk8cil7aWYodFtpXT49ZSl7dT1pKzE7d2hpbGUodTxyJiZ0W3VdPj1lKXUrKztmb3IoYT1pLGw9dS0xO2E8bDthKyssbC0tKWM9blthXSxuW2FdPW5bbF0sbltsXT1jO2k9dX1pKyt9fWZ1bmN0aW9uIHEoZSx0LG4scil7dmFyIGk9dFtyXSxvLGMsaCxwO3N3aXRjaChpKXtjYXNlIGc6Y2FzZSB5OnU9ITE7Y2FzZSBFOmNhc2UgdzpyZXR1cm4gaTtjYXNlIGI6cmV0dXJuIHU/dzpiO2Nhc2UgVDpyZXR1cm4gdT0hMCxhPSEwLHk7Y2FzZSBOOnJldHVybiBFO2Nhc2UgQzppZihyPDF8fHIrMT49dC5sZW5ndGh8fChvPW5bci0xXSkhPWImJm8hPXd8fChjPXRbcisxXSkhPWImJmMhPXcpcmV0dXJuIEU7cmV0dXJuIHUmJihjPXcpLGM9PW8/YzpFO2Nhc2UgazpvPXI+MD9uW3ItMV06UztpZihvPT1iJiZyKzE8dC5sZW5ndGgmJnRbcisxXT09YilyZXR1cm4gYjtyZXR1cm4gRTtjYXNlIEw6aWYocj4wJiZuW3ItMV09PWIpcmV0dXJuIGI7aWYodSlyZXR1cm4gRTtwPXIrMSxoPXQubGVuZ3RoO3doaWxlKHA8aCYmdFtwXT09TClwKys7aWYocDxoJiZ0W3BdPT1iKXJldHVybiBiO3JldHVybiBFO2Nhc2UgQTpoPXQubGVuZ3RoLHA9cisxO3doaWxlKHA8aCYmdFtwXT09QSlwKys7aWYocDxoKXt2YXIgZD1lW3JdLHY9ZD49MTQyNSYmZDw9MjMwM3x8ZD09NjQyODY7bz10W3BdO2lmKHYmJihvPT15fHxvPT1UKSlyZXR1cm4geX1pZihyPDF8fChvPXRbci0xXSk9PVMpcmV0dXJuIEU7cmV0dXJuIG5bci0xXTtjYXNlIFM6cmV0dXJuIHU9ITEsZj0hMCxzO2Nhc2UgeDpyZXR1cm4gbD0hMCxFO2Nhc2UgTzpjYXNlIE06Y2FzZSBEOmNhc2UgUDpjYXNlIF86dT0hMTtjYXNlIEg6cmV0dXJuIEV9fWZ1bmN0aW9uIFIoZSl7dmFyIHQ9ZS5jaGFyQ29kZUF0KDApLG49dD4+ODtyZXR1cm4gbj09MD90PjE5MT9nOkJbdF06bj09NT8vW1x1MDU5MS1cdTA1ZjRdLy50ZXN0KGUpP3k6ZzpuPT02Py9bXHUwNjEwLVx1MDYxYVx1MDY0Yi1cdTA2NWZcdTA2ZDYtXHUwNmU0XHUwNmU3LVx1MDZlZF0vLnRlc3QoZSk/QTovW1x1MDY2MC1cdTA2NjlcdTA2NmItXHUwNjZjXS8udGVzdChlKT93OnQ9PTE2NDI/TDovW1x1MDZmMC1cdTA2ZjldLy50ZXN0KGUpP2I6VDpuPT0zMiYmdDw9ODI4Nz9qW3QmMjU1XTpuPT0yNTQ/dD49NjUxMzY/VDpFOkV9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZT49Ilx1MDY0YiImJmU8PSJcdTA2NTUifXZhciByPVsiXHUwNjIxIiwiXHUwNjQxIl0saT1bIlx1MDYzYSIsIlx1MDY0YSJdLHM9MCxvPTAsdT0hMSxhPSExLGY9ITEsbD0hMSxjPSExLGg9ITEscD1bWzAsMywwLDEsMCwwLDBdLFswLDMsMCwxLDIsMiwwXSxbMCwzLDAsMTcsMiwwLDFdLFswLDMsNSw1LDQsMSwwXSxbMCwzLDIxLDIxLDQsMCwxXSxbMCwzLDUsNSw0LDIsMF1dLGQ9W1syLDAsMSwxLDAsMSwwXSxbMiwwLDEsMSwwLDIsMF0sWzIsMCwyLDEsMywyLDBdLFsyLDAsMiwzMywzLDEsMV1dLHY9MCxtPTEsZz0wLHk9MSxiPTIsdz0zLEU9NCxTPTUseD02LFQ9NyxOPTgsQz05LGs9MTAsTD0xMSxBPTEyLE89MTMsTT0xNCxfPTE1LEQ9MTYsUD0xNyxIPTE4LEI9W0gsSCxILEgsSCxILEgsSCxILHgsUyx4LE4sUyxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsUyxTLFMseCxOLEUsRSxMLEwsTCxFLEUsRSxFLEUsayxDLGssQyxDLGIsYixiLGIsYixiLGIsYixiLGIsQyxFLEUsRSxFLEUsRSxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsRSxFLEUsRSxFLEUsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLEUsRSxFLEUsSCxILEgsSCxILEgsUyxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsQyxFLEwsTCxMLEwsRSxFLEUsRSxnLEUsRSxILEUsRSxMLEwsYixiLEUsZyxFLEUsRSxiLGcsRSxFLEUsRSxFXSxqPVtOLE4sTixOLE4sTixOLE4sTixOLE4sSCxILEgsZyx5LEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLE4sUyxPLE0sXyxELFAsQyxMLEwsTCxMLEwsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsQyxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsTl07dC5MPWcsdC5SPXksdC5FTj1iLHQuT05fUj0zLHQuQU49NCx0LlJfSD01LHQuQj02LHQuUkxFPTcsdC5ET1Q9Ilx1MDBiNyIsdC5kb0JpZGlSZW9yZGVyPWZ1bmN0aW9uKGUsbixyKXtpZihlLmxlbmd0aDwyKXJldHVybnt9O3ZhciBpPWUuc3BsaXQoIiIpLG89bmV3IEFycmF5KGkubGVuZ3RoKSx1PW5ldyBBcnJheShpLmxlbmd0aCksYT1bXTtzPXI/bTp2LEYoaSxhLGkubGVuZ3RoLG4pO2Zvcih2YXIgZj0wO2Y8by5sZW5ndGg7b1tmXT1mLGYrKyk7SSgyLGEsbyksSSgxLGEsbyk7Zm9yKHZhciBmPTA7ZjxvLmxlbmd0aC0xO2YrKyluW2ZdPT09dz9hW2ZdPXQuQU46YVtmXT09PXkmJihuW2ZdPlQmJm5bZl08T3x8bltmXT09PUV8fG5bZl09PT1IKT9hW2ZdPXQuT05fUjpmPjAmJmlbZi0xXT09PSJcdTA2NDQiJiYvXHUwNjIyfFx1MDYyM3xcdTA2MjV8XHUwNjI3Ly50ZXN0KGlbZl0pJiYoYVtmLTFdPWFbZl09dC5SX0gsZisrKTtpW2kubGVuZ3RoLTFdPT09dC5ET1QmJihhW2kubGVuZ3RoLTFdPXQuQiksaVswXT09PSJcdTIwMmIiJiYoYVswXT10LlJMRSk7Zm9yKHZhciBmPTA7ZjxvLmxlbmd0aDtmKyspdVtmXT1hW29bZl1dO3JldHVybntsb2dpY2FsRnJvbVZpc3VhbDpvLGJpZGlMZXZlbHM6dX19LHQuaGFzQmlkaUNoYXJhY3RlcnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPVIoZS5jaGFyQXQocikpLCFuJiYodFtyXT09eXx8dFtyXT09VHx8dFtyXT09dykmJihuPSEwKTtyZXR1cm4gbn0sdC5nZXRWaXN1YWxGcm9tTG9naWNhbElkeD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5sb2dpY2FsRnJvbVZpc3VhbC5sZW5ndGg7bisrKWlmKHQubG9naWNhbEZyb21WaXN1YWxbbl09PWUpcmV0dXJuIG47cmV0dXJuIDB9fSksYWNlLmRlZmluZSgiYWNlL2JpZGloYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9iaWRpdXRpbCIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvYmlkaXV0aWwiKSxpPWUoIi4vbGliL2xhbmciKSxzPS9bXHUwNTkwLVx1MDVmNFx1MDYwMC1cdTA2ZmZcdTA3MDAtXHUwOGFjXHUyMDJCXS8sbz1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLmJpZGlNYXA9e30sdGhpcy5jdXJyZW50Um93PW51bGwsdGhpcy5iaWRpVXRpbD1yLHRoaXMuY2hhcldpZHRocz1bXSx0aGlzLkVPTD0iXHUwMGFjIix0aGlzLnNob3dJbnZpc2libGVzPSEwLHRoaXMuaXNSdGxEaXI9ITEsdGhpcy4kaXNSdGw9ITEsdGhpcy5saW5lPSIiLHRoaXMud3JhcEluZGVudD0wLHRoaXMuRU9GPSJcdTAwYjYiLHRoaXMuUkxFPSJcdTIwMmIiLHRoaXMuY29udGVudFdpZHRoPTAsdGhpcy5mb250TWV0cmljcz1udWxsLHRoaXMucnRsTGluZU9mZnNldD0wLHRoaXMud3JhcE9mZnNldD0wLHRoaXMuaXNNb3ZlTGVmdE9wZXJhdGlvbj0hMSx0aGlzLnNlZW5CaWRpPXMudGVzdChlLmdldFZhbHVlKCkpfTsoZnVuY3Rpb24oKXt0aGlzLmlzQmlkaVJvdz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuc2VlbkJpZGk/KGUhPT10aGlzLmN1cnJlbnRSb3cmJih0aGlzLmN1cnJlbnRSb3c9ZSx0aGlzLnVwZGF0ZVJvd0xpbmUodCxuKSx0aGlzLnVwZGF0ZUJpZGlNYXAoKSksdGhpcy5iaWRpTWFwLmJpZGlMZXZlbHMpOiExfSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuc2VlbkJpZGk/dGhpcy5jdXJyZW50Um93PW51bGw6ZS5hY3Rpb249PSJpbnNlcnQiJiZzLnRlc3QoZS5saW5lcy5qb2luKCJcbiIpKSYmKHRoaXMuc2VlbkJpZGk9ITAsdGhpcy5jdXJyZW50Um93PW51bGwpfSx0aGlzLmdldERvY3VtZW50Um93PWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMuc2Vzc2lvbi4kc2NyZWVuUm93Q2FjaGU7aWYodC5sZW5ndGgpe3ZhciBuPXRoaXMuc2Vzc2lvbi4kZ2V0Um93Q2FjaGVJbmRleCh0LHRoaXMuY3VycmVudFJvdyk7bj49MCYmKGU9dGhpcy5zZXNzaW9uLiRkb2NSb3dDYWNoZVtuXSl9cmV0dXJuIGV9LHRoaXMuZ2V0U3BsaXRJbmRleD1mdW5jdGlvbigpe3ZhciBlPTAsdD10aGlzLnNlc3Npb24uJHNjcmVlblJvd0NhY2hlO2lmKHQubGVuZ3RoKXt2YXIgbixyPXRoaXMuc2Vzc2lvbi4kZ2V0Um93Q2FjaGVJbmRleCh0LHRoaXMuY3VycmVudFJvdyk7d2hpbGUodGhpcy5jdXJyZW50Um93LWU+MCl7bj10aGlzLnNlc3Npb24uJGdldFJvd0NhY2hlSW5kZXgodCx0aGlzLmN1cnJlbnRSb3ctZS0xKTtpZihuIT09cilicmVhaztyPW4sZSsrfX1lbHNlIGU9dGhpcy5jdXJyZW50Um93O3JldHVybiBlfSx0aGlzLnVwZGF0ZVJvd0xpbmU9ZnVuY3Rpb24oZSx0KXtlPT09dW5kZWZpbmVkJiYoZT10aGlzLmdldERvY3VtZW50Um93KCkpO3ZhciBuPWU9PT10aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSxzPW4/dGhpcy5FT0Y6dGhpcy5FT0w7dGhpcy53cmFwSW5kZW50PTAsdGhpcy5saW5lPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpLHRoaXMuaXNSdGxEaXI9dGhpcy4kaXNSdGx8fHRoaXMubGluZS5jaGFyQXQoMCk9PT10aGlzLlJMRTtpZih0aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlKXt2YXIgbz10aGlzLnNlc3Npb24uJHdyYXBEYXRhW2VdO28mJih0PT09dW5kZWZpbmVkJiYodD10aGlzLmdldFNwbGl0SW5kZXgoKSksdD4wJiZvLmxlbmd0aD8odGhpcy53cmFwSW5kZW50PW8uaW5kZW50LHRoaXMud3JhcE9mZnNldD10aGlzLndyYXBJbmRlbnQqdGhpcy5jaGFyV2lkdGhzW3IuTF0sdGhpcy5saW5lPXQ8by5sZW5ndGg/dGhpcy5saW5lLnN1YnN0cmluZyhvW3QtMV0sb1t0XSk6dGhpcy5saW5lLnN1YnN0cmluZyhvW28ubGVuZ3RoLTFdKSk6dGhpcy5saW5lPXRoaXMubGluZS5zdWJzdHJpbmcoMCxvW3RdKSksdD09by5sZW5ndGgmJih0aGlzLmxpbmUrPXRoaXMuc2hvd0ludmlzaWJsZXM/czpyLkRPVCl9ZWxzZSB0aGlzLmxpbmUrPXRoaXMuc2hvd0ludmlzaWJsZXM/czpyLkRPVDt2YXIgdT10aGlzLnNlc3Npb24sYT0wLGY7dGhpcy5saW5lPXRoaXMubGluZS5yZXBsYWNlKC9cdHxbXHUxMTAwLVx1MjAyOSwgXHUyMDJGLVx1RkZFNl0vZyxmdW5jdGlvbihlLHQpe3JldHVybiBlPT09IgkifHx1LmlzRnVsbFdpZHRoKGUuY2hhckNvZGVBdCgwKSk/KGY9ZT09PSIJIj91LmdldFNjcmVlblRhYlNpemUodCthKToyLGErPWYtMSxpLnN0cmluZ1JlcGVhdChyLkRPVCxmKSk6ZX0pLHRoaXMuaXNSdGxEaXImJih0aGlzLmZvbnRNZXRyaWNzLiRtYWluLnRleHRDb250ZW50PXRoaXMubGluZS5jaGFyQXQodGhpcy5saW5lLmxlbmd0aC0xKT09ci5ET1Q/dGhpcy5saW5lLnN1YnN0cigwLHRoaXMubGluZS5sZW5ndGgtMSk6dGhpcy5saW5lLHRoaXMucnRsTGluZU9mZnNldD10aGlzLmNvbnRlbnRXaWR0aC10aGlzLmZvbnRNZXRyaWNzLiRtYWluLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKX0sdGhpcy51cGRhdGVCaWRpTWFwPWZ1bmN0aW9uKCl7dmFyIGU9W107ci5oYXNCaWRpQ2hhcmFjdGVycyh0aGlzLmxpbmUsZSl8fHRoaXMuaXNSdGxEaXI/dGhpcy5iaWRpTWFwPXIuZG9CaWRpUmVvcmRlcih0aGlzLmxpbmUsZSx0aGlzLmlzUnRsRGlyKTp0aGlzLmJpZGlNYXA9e319LHRoaXMubWFya0FzRGlydHk9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRSb3c9bnVsbH0sdGhpcy51cGRhdGVDaGFyYWN0ZXJXaWR0aHM9ZnVuY3Rpb24oZSl7aWYodGhpcy5jaGFyYWN0ZXJXaWR0aD09PWUuJGNoYXJhY3RlclNpemUud2lkdGgpcmV0dXJuO3RoaXMuZm9udE1ldHJpY3M9ZTt2YXIgdD10aGlzLmNoYXJhY3RlcldpZHRoPWUuJGNoYXJhY3RlclNpemUud2lkdGgsbj1lLiRtZWFzdXJlQ2hhcldpZHRoKCJcdTA1ZDQiKTt0aGlzLmNoYXJXaWR0aHNbci5MXT10aGlzLmNoYXJXaWR0aHNbci5FTl09dGhpcy5jaGFyV2lkdGhzW3IuT05fUl09dCx0aGlzLmNoYXJXaWR0aHNbci5SXT10aGlzLmNoYXJXaWR0aHNbci5BTl09bix0aGlzLmNoYXJXaWR0aHNbci5SX0hdPW4qLjQ1LHRoaXMuY2hhcldpZHRoc1tyLkJdPXRoaXMuY2hhcldpZHRoc1tyLlJMRV09MCx0aGlzLmN1cnJlbnRSb3c9bnVsbH0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXt0aGlzLnNob3dJbnZpc2libGVzPWUsdGhpcy5jdXJyZW50Um93PW51bGx9LHRoaXMuc2V0RW9sQ2hhcj1mdW5jdGlvbihlKXt0aGlzLkVPTD1lfSx0aGlzLnNldENvbnRlbnRXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmNvbnRlbnRXaWR0aD1lfSx0aGlzLmlzUnRsTGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kaXNSdGw/ITA6ZSE9dW5kZWZpbmVkP3RoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpLmNoYXJBdCgwKT09dGhpcy5STEU6dGhpcy5pc1J0bERpcn0sdGhpcy5zZXRSdGxEaXJlY3Rpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEN1cnNvclBvc2l0aW9uKCk7Zm9yKHZhciByPWUuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkFuY2hvcigpLnJvdztyPD1uLnJvdztyKyspIXQmJmUuc2Vzc2lvbi5nZXRMaW5lKHIpLmNoYXJBdCgwKT09PWUuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuUkxFP2Uuc2Vzc2lvbi5kb2MucmVtb3ZlSW5MaW5lKHIsMCwxKTp0JiZlLnNlc3Npb24uZ2V0TGluZShyKS5jaGFyQXQoMCkhPT1lLnNlc3Npb24uJGJpZGlIYW5kbGVyLlJMRSYmZS5zZXNzaW9uLmRvYy5pbnNlcnQoe2NvbHVtbjowLHJvdzpyfSxlLnNlc3Npb24uJGJpZGlIYW5kbGVyLlJMRSl9LHRoaXMuZ2V0UG9zTGVmdD1mdW5jdGlvbihlKXtlLT10aGlzLndyYXBJbmRlbnQ7dmFyIHQ9dGhpcy5saW5lLmNoYXJBdCgwKT09PXRoaXMuUkxFPzE6MCxuPWU+dD90aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk/ZTplLTE6dCxpPXIuZ2V0VmlzdWFsRnJvbUxvZ2ljYWxJZHgobix0aGlzLmJpZGlNYXApLHM9dGhpcy5iaWRpTWFwLmJpZGlMZXZlbHMsbz0wOyF0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkmJmU8PXQmJnNbaV0lMiE9PTAmJmkrKztmb3IodmFyIHU9MDt1PGk7dSsrKW8rPXRoaXMuY2hhcldpZHRoc1tzW3VdXTtyZXR1cm4hdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpJiZlPnQmJnNbaV0lMj09PTAmJihvKz10aGlzLmNoYXJXaWR0aHNbc1tpXV0pLHRoaXMud3JhcEluZGVudCYmKG8rPXRoaXMuaXNSdGxEaXI/LTEqdGhpcy53cmFwT2Zmc2V0OnRoaXMud3JhcE9mZnNldCksdGhpcy5pc1J0bERpciYmKG8rPXRoaXMucnRsTGluZU9mZnNldCksb30sdGhpcy5nZXRTZWxlY3Rpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iaWRpTWFwLHI9bi5iaWRpTGV2ZWxzLGkscz1bXSxvPTAsdT1NYXRoLm1pbihlLHQpLXRoaXMud3JhcEluZGVudCxhPU1hdGgubWF4KGUsdCktdGhpcy53cmFwSW5kZW50LGY9ITEsbD0hMSxjPTA7dGhpcy53cmFwSW5kZW50JiYobys9dGhpcy5pc1J0bERpcj8tMSp0aGlzLndyYXBPZmZzZXQ6dGhpcy53cmFwT2Zmc2V0KTtmb3IodmFyIGgscD0wO3A8ci5sZW5ndGg7cCsrKWg9bi5sb2dpY2FsRnJvbVZpc3VhbFtwXSxpPXJbcF0sZj1oPj11JiZoPGEsZiYmIWw/Yz1vOiFmJiZsJiZzLnB1c2goe2xlZnQ6Yyx3aWR0aDpvLWN9KSxvKz10aGlzLmNoYXJXaWR0aHNbaV0sbD1mO2YmJnA9PT1yLmxlbmd0aCYmcy5wdXNoKHtsZWZ0OmMsd2lkdGg6by1jfSk7aWYodGhpcy5pc1J0bERpcilmb3IodmFyIGQ9MDtkPHMubGVuZ3RoO2QrKylzW2RdLmxlZnQrPXRoaXMucnRsTGluZU9mZnNldDtyZXR1cm4gc30sdGhpcy5vZmZzZXRUb0NvbD1mdW5jdGlvbihlKXt0aGlzLmlzUnRsRGlyJiYoZS09dGhpcy5ydGxMaW5lT2Zmc2V0KTt2YXIgdD0wLGU9TWF0aC5tYXgoZSwwKSxuPTAscj0wLGk9dGhpcy5iaWRpTWFwLmJpZGlMZXZlbHMscz10aGlzLmNoYXJXaWR0aHNbaVtyXV07dGhpcy53cmFwSW5kZW50JiYoZS09dGhpcy5pc1J0bERpcj8tMSp0aGlzLndyYXBPZmZzZXQ6dGhpcy53cmFwT2Zmc2V0KTt3aGlsZShlPm4rcy8yKXtuKz1zO2lmKHI9PT1pLmxlbmd0aC0xKXtzPTA7YnJlYWt9cz10aGlzLmNoYXJXaWR0aHNbaVsrK3JdXX1yZXR1cm4gcj4wJiZpW3ItMV0lMiE9PTAmJmlbcl0lMj09PTA/KGU8biYmci0tLHQ9dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdKTpyPjAmJmlbci0xXSUyPT09MCYmaVtyXSUyIT09MD90PTErKGU+bj90aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl06dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3ItMV0pOnRoaXMuaXNSdGxEaXImJnI9PT1pLmxlbmd0aC0xJiZzPT09MCYmaVtyLTFdJTI9PT0wfHwhdGhpcy5pc1J0bERpciYmcj09PTAmJmlbcl0lMiE9PTA/dD0xK3RoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXToocj4wJiZpW3ItMV0lMiE9PTAmJnMhPT0wJiZyLS0sdD10aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl0pLHQ9PT0wJiZ0aGlzLmlzUnRsRGlyJiZ0KyssdCt0aGlzLndyYXBJbmRlbnR9fSkuY2FsbChvLnByb3RvdHlwZSksdC5CaWRpSGFuZGxlcj1vfSksYWNlLmRlZmluZSgiYWNlL3NlbGVjdGlvbiIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2xhbmciKSxzPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1lKCIuL3JhbmdlIikuUmFuZ2UsdT1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLmRvYz1lLmdldERvY3VtZW50KCksdGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuY3Vyc29yPXRoaXMubGVhZD10aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwwKSx0aGlzLmFuY2hvcj10aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwwKSx0aGlzLiRzaWxlbnQ9ITE7dmFyIHQ9dGhpczt0aGlzLmN1cnNvci5vbigiY2hhbmdlIixmdW5jdGlvbihlKXt0LiRjdXJzb3JDaGFuZ2VkPSEwLHQuJHNpbGVudHx8dC5fZW1pdCgiY2hhbmdlQ3Vyc29yIiksIXQuJGlzRW1wdHkmJiF0LiRzaWxlbnQmJnQuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpLCF0LiRrZWVwRGVzaXJlZENvbHVtbk9uQ2hhbmdlJiZlLm9sZC5jb2x1bW4hPWUudmFsdWUuY29sdW1uJiYodC4kZGVzaXJlZENvbHVtbj1udWxsKX0pLHRoaXMuYW5jaG9yLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7dC4kYW5jaG9yQ2hhbmdlZD0hMCwhdC4kaXNFbXB0eSYmIXQuJHNpbGVudCYmdC5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIil9KX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaXNFbXB0eXx8dGhpcy5hbmNob3Iucm93PT10aGlzLmxlYWQucm93JiZ0aGlzLmFuY2hvci5jb2x1bW49PXRoaXMubGVhZC5jb2x1bW59LHRoaXMuaXNNdWx0aUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy4kaXNFbXB0eSYmdGhpcy5hbmNob3Iucm93IT10aGlzLmN1cnNvci5yb3d9LHRoaXMuZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZC5nZXRQb3NpdGlvbigpfSx0aGlzLnNldFNlbGVjdGlvbkFuY2hvcj1mdW5jdGlvbihlLHQpe3RoaXMuJGlzRW1wdHk9ITEsdGhpcy5hbmNob3Iuc2V0UG9zaXRpb24oZSx0KX0sdGhpcy5nZXRBbmNob3I9dGhpcy5nZXRTZWxlY3Rpb25BbmNob3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaXNFbXB0eT90aGlzLmdldFNlbGVjdGlvbkxlYWQoKTp0aGlzLmFuY2hvci5nZXRQb3NpdGlvbigpfSx0aGlzLmdldFNlbGVjdGlvbkxlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFkLmdldFBvc2l0aW9uKCl9LHRoaXMuaXNCYWNrd2FyZHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFuY2hvcix0PXRoaXMubGVhZDtyZXR1cm4gZS5yb3c+dC5yb3d8fGUucm93PT10LnJvdyYmZS5jb2x1bW4+dC5jb2x1bW59LHRoaXMuZ2V0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFuY2hvcix0PXRoaXMubGVhZDtyZXR1cm4gdGhpcy4kaXNFbXB0eT9vLmZyb21Qb2ludHModCx0KTp0aGlzLmlzQmFja3dhcmRzKCk/by5mcm9tUG9pbnRzKHQsZSk6by5mcm9tUG9pbnRzKGUsdCl9LHRoaXMuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLiRpc0VtcHR5fHwodGhpcy4kaXNFbXB0eT0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSl9LHRoaXMuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy4kc2V0U2VsZWN0aW9uKDAsMCxOdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhfVkFMVUUpfSx0aGlzLnNldFJhbmdlPXRoaXMuc2V0U2VsZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P2UuZW5kOmUuc3RhcnQscj10P2Uuc3RhcnQ6ZS5lbmQ7dGhpcy4kc2V0U2VsZWN0aW9uKG4ucm93LG4uY29sdW1uLHIucm93LHIuY29sdW1uKX0sdGhpcy4kc2V0U2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJGlzRW1wdHkscz10aGlzLmluTXVsdGlTZWxlY3RNb2RlO3RoaXMuJHNpbGVudD0hMCx0aGlzLiRjdXJzb3JDaGFuZ2VkPXRoaXMuJGFuY2hvckNoYW5nZWQ9ITEsdGhpcy5hbmNob3Iuc2V0UG9zaXRpb24oZSx0KSx0aGlzLmN1cnNvci5zZXRQb3NpdGlvbihuLHIpLHRoaXMuJGlzRW1wdHk9IW8uY29tcGFyZVBvaW50cyh0aGlzLmFuY2hvcix0aGlzLmN1cnNvciksdGhpcy4kc2lsZW50PSExLHRoaXMuJGN1cnNvckNoYW5nZWQmJnRoaXMuX2VtaXQoImNoYW5nZUN1cnNvciIpLCh0aGlzLiRjdXJzb3JDaGFuZ2VkfHx0aGlzLiRhbmNob3JDaGFuZ2VkfHxpIT10aGlzLiRpc0VtcHR5fHxzKSYmdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJG1vdmVTZWxlY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZWFkO3RoaXMuJGlzRW1wdHkmJnRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKHQucm93LHQuY29sdW1uKSxlLmNhbGwodGhpcyl9LHRoaXMuc2VsZWN0VG89ZnVuY3Rpb24oZSx0KXt0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0pfSx0aGlzLnNlbGVjdFRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9KX0sdGhpcy5tb3ZlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlVG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0sdGhpcy5zZWxlY3RVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yVXApfSx0aGlzLnNlbGVjdERvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckRvd24pfSx0aGlzLnNlbGVjdFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JSaWdodCl9LHRoaXMuc2VsZWN0TGVmdD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGVmdCl9LHRoaXMuc2VsZWN0TGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQpfSx0aGlzLnNlbGVjdExpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVFbmQpfSx0aGlzLnNlbGVjdEZpbGVFbmQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckZpbGVFbmQpfSx0aGlzLnNlbGVjdEZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KX0sdGhpcy5zZWxlY3RXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRSaWdodCl9LHRoaXMuc2VsZWN0V29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KX0sdGhpcy5nZXRXb3JkUmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdD09InVuZGVmaW5lZCIpe3ZhciBuPWV8fHRoaXMubGVhZDtlPW4ucm93LHQ9bi5jb2x1bW59cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UoZSx0KX0sdGhpcy5zZWxlY3RXb3JkPWZ1bmN0aW9uKCl7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZSh0aGlzLmdldFdvcmRSYW5nZSgpKX0sdGhpcy5zZWxlY3RBV29yZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q3Vyc29yKCksdD10aGlzLnNlc3Npb24uZ2V0QVdvcmRSYW5nZShlLnJvdyxlLmNvbHVtbik7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZSh0KX0sdGhpcy5nZXRMaW5lUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZT09Im51bWJlciI/ZTp0aGlzLmxlYWQucm93LHIsaT10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUobik7cmV0dXJuIGk/KG49aS5zdGFydC5yb3cscj1pLmVuZC5yb3cpOnI9bix0PT09ITA/bmV3IG8obiwwLHIsdGhpcy5zZXNzaW9uLmdldExpbmUocikubGVuZ3RoKTpuZXcgbyhuLDAscisxLDApfSx0aGlzLnNlbGVjdExpbmU9ZnVuY3Rpb24oKXt0aGlzLnNldFNlbGVjdGlvblJhbmdlKHRoaXMuZ2V0TGluZVJhbmdlKCkpfSx0aGlzLm1vdmVDdXJzb3JVcD1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KC0xLDApfSx0aGlzLm1vdmVDdXJzb3JEb3duPWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoMSwwKX0sdGhpcy53b3VsZE1vdmVJbnRvU29mdFRhYj1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jb2x1bW4saT1lLmNvbHVtbit0O3JldHVybiBuPDAmJihyPWUuY29sdW1uLXQsaT1lLmNvbHVtbiksdGhpcy5zZXNzaW9uLmlzVGFiU3RvcChlKSYmdGhpcy5kb2MuZ2V0TGluZShlLnJvdykuc2xpY2UocixpKS5zcGxpdCgiICIpLmxlbmd0aC0xPT10fSx0aGlzLm1vdmVDdXJzb3JMZWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLmdldFBvc2l0aW9uKCksdDtpZih0PXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZS5yb3csZS5jb2x1bW4sLTEpKXRoaXMubW92ZUN1cnNvclRvKHQuc3RhcnQucm93LHQuc3RhcnQuY29sdW1uKTtlbHNlIGlmKGUuY29sdW1uPT09MCllLnJvdz4wJiZ0aGlzLm1vdmVDdXJzb3JUbyhlLnJvdy0xLHRoaXMuZG9jLmdldExpbmUoZS5yb3ctMSkubGVuZ3RoKTtlbHNle3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7dGhpcy53b3VsZE1vdmVJbnRvU29mdFRhYihlLG4sLTEpJiYhdGhpcy5zZXNzaW9uLmdldE5hdmlnYXRlV2l0aGluU29mdFRhYnMoKT90aGlzLm1vdmVDdXJzb3JCeSgwLC1uKTp0aGlzLm1vdmVDdXJzb3JCeSgwLC0xKX19LHRoaXMubW92ZUN1cnNvclJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLmdldFBvc2l0aW9uKCksdDtpZih0PXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZS5yb3csZS5jb2x1bW4sMSkpdGhpcy5tb3ZlQ3Vyc29yVG8odC5lbmQucm93LHQuZW5kLmNvbHVtbik7ZWxzZSBpZih0aGlzLmxlYWQuY29sdW1uPT10aGlzLmRvYy5nZXRMaW5lKHRoaXMubGVhZC5yb3cpLmxlbmd0aCl0aGlzLmxlYWQucm93PHRoaXMuZG9jLmdldExlbmd0aCgpLTEmJnRoaXMubW92ZUN1cnNvclRvKHRoaXMubGVhZC5yb3crMSwwKTtlbHNle3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCksZT10aGlzLmxlYWQ7dGhpcy53b3VsZE1vdmVJbnRvU29mdFRhYihlLG4sMSkmJiF0aGlzLnNlc3Npb24uZ2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicygpP3RoaXMubW92ZUN1cnNvckJ5KDAsbik6dGhpcy5tb3ZlQ3Vyc29yQnkoMCwxKX19LHRoaXMubW92ZUN1cnNvckxpbmVTdGFydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3coZSx0KSxyPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24obiwwKSxpPXRoaXMuc2Vzc2lvbi5nZXREaXNwbGF5TGluZShlLG51bGwsci5yb3csci5jb2x1bW4pLHM9aS5tYXRjaCgvXlxzKi8pO3NbMF0ubGVuZ3RoIT10JiYhdGhpcy5zZXNzaW9uLiR1c2VFbWFjc1N0eWxlTGluZVN0YXJ0JiYoci5jb2x1bW4rPXNbMF0ubGVuZ3RoKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHIpfSx0aGlzLm1vdmVDdXJzb3JMaW5lRW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLHQ9dGhpcy5zZXNzaW9uLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uKGUucm93LGUuY29sdW1uKTtpZih0aGlzLmxlYWQuY29sdW1uPT10LmNvbHVtbil7dmFyIG49dGhpcy5zZXNzaW9uLmdldExpbmUodC5yb3cpO2lmKHQuY29sdW1uPT1uLmxlbmd0aCl7dmFyIHI9bi5zZWFyY2goL1xzKyQvKTtyPjAmJih0LmNvbHVtbj1yKX19dGhpcy5tb3ZlQ3Vyc29yVG8odC5yb3csdC5jb2x1bW4pfSx0aGlzLm1vdmVDdXJzb3JGaWxlRW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSx0PXRoaXMuZG9jLmdldExpbmUoZSkubGVuZ3RoO3RoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZUN1cnNvckZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKDAsMCl9LHRoaXMubW92ZUN1cnNvckxvbmdXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuPXRoaXMuZG9jLmdldExpbmUoZSkscj1uLnN1YnN0cmluZyh0KTt0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MDt2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwxKTtpZihpKXt0aGlzLm1vdmVDdXJzb3JUbyhpLmVuZC5yb3csaS5lbmQuY29sdW1uKTtyZXR1cm59dGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhyKSYmKHQrPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCxyPW4uc3Vic3RyaW5nKHQpKTtpZih0Pj1uLmxlbmd0aCl7dGhpcy5tb3ZlQ3Vyc29yVG8oZSxuLmxlbmd0aCksdGhpcy5tb3ZlQ3Vyc29yUmlnaHQoKSxlPHRoaXMuZG9jLmdldExlbmd0aCgpLTEmJnRoaXMubW92ZUN1cnNvcldvcmRSaWdodCgpO3JldHVybn10aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKHIpJiYodCs9dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wKSx0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVDdXJzb3JMb25nV29yZExlZnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuO2lmKG49dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsLTEpKXt0aGlzLm1vdmVDdXJzb3JUbyhuLnN0YXJ0LnJvdyxuLnN0YXJ0LmNvbHVtbik7cmV0dXJufXZhciByPXRoaXMuc2Vzc2lvbi5nZXRGb2xkU3RyaW5nQXQoZSx0LC0xKTtyPT1udWxsJiYocj10aGlzLmRvYy5nZXRMaW5lKGUpLnN1YnN0cmluZygwLHQpKTt2YXIgcz1pLnN0cmluZ1JldmVyc2Uocik7dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhzKSYmKHQtPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCxzPXMuc2xpY2UodGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4KSx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCk7aWYodDw9MCl7dGhpcy5tb3ZlQ3Vyc29yVG8oZSwwKSx0aGlzLm1vdmVDdXJzb3JMZWZ0KCksZT4wJiZ0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCgpO3JldHVybn10aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKHMpJiYodC09dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wKSx0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLiRzaG9ydFdvcmRFbmRJbmRleD1mdW5jdGlvbihlKXt2YXIgdD0wLG4scj0vXHMvLGk9dGhpcy5zZXNzaW9uLnRva2VuUmU7aS5sYXN0SW5kZXg9MDtpZih0aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKGUpKXQ9dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4O2Vsc2V7d2hpbGUoKG49ZVt0XSkmJnIudGVzdChuKSl0Kys7aWYodDwxKXtpLmxhc3RJbmRleD0wO3doaWxlKChuPWVbdF0pJiYhaS50ZXN0KG4pKXtpLmxhc3RJbmRleD0wLHQrKztpZihyLnRlc3Qobikpe2lmKHQ+Mil7dC0tO2JyZWFrfXdoaWxlKChuPWVbdF0pJiZyLnRlc3QobikpdCsrO2lmKHQ+MilicmVha319fX1yZXR1cm4gaS5sYXN0SW5kZXg9MCx0fSx0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRSaWdodD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG49dGhpcy5kb2MuZ2V0TGluZShlKSxyPW4uc3Vic3RyaW5nKHQpLGk9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsMSk7aWYoaSlyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG8oaS5lbmQucm93LGkuZW5kLmNvbHVtbik7aWYodD09bi5sZW5ndGgpe3ZhciBzPXRoaXMuZG9jLmdldExlbmd0aCgpO2RvIGUrKyxyPXRoaXMuZG9jLmdldExpbmUoZSk7d2hpbGUoZTxzJiYvXlxzKiQvLnRlc3QocikpOy9eXHMrLy50ZXN0KHIpfHwocj0iIiksdD0wfXZhciBvPXRoaXMuJHNob3J0V29yZEVuZEluZGV4KHIpO3RoaXMubW92ZUN1cnNvclRvKGUsdCtvKX0sdGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkTGVmdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG47aWYobj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwtMSkpcmV0dXJuIHRoaXMubW92ZUN1cnNvclRvKG4uc3RhcnQucm93LG4uc3RhcnQuY29sdW1uKTt2YXIgcj10aGlzLnNlc3Npb24uZ2V0TGluZShlKS5zdWJzdHJpbmcoMCx0KTtpZih0PT09MCl7ZG8gZS0tLHI9dGhpcy5kb2MuZ2V0TGluZShlKTt3aGlsZShlPjAmJi9eXHMqJC8udGVzdChyKSk7dD1yLmxlbmd0aCwvXHMrJC8udGVzdChyKXx8KHI9IiIpfXZhciBzPWkuc3RyaW5nUmV2ZXJzZShyKSxvPXRoaXMuJHNob3J0V29yZEVuZEluZGV4KHMpO3JldHVybiB0aGlzLm1vdmVDdXJzb3JUbyhlLHQtbyl9LHRoaXMubW92ZUN1cnNvcldvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kc2VsZWN0TG9uZ1dvcmRzP3RoaXMubW92ZUN1cnNvckxvbmdXb3JkUmlnaHQoKTp0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRSaWdodCgpfSx0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kc2VsZWN0TG9uZ1dvcmRzP3RoaXMubW92ZUN1cnNvckxvbmdXb3JkTGVmdCgpOnRoaXMubW92ZUN1cnNvclNob3J0V29yZExlZnQoKX0sdGhpcy5tb3ZlQ3Vyc29yQnk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMubGVhZC5yb3csdGhpcy5sZWFkLmNvbHVtbikscjt0PT09MCYmKGUhPT0wJiYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3cobi5yb3csdGhpcy5sZWFkLnJvdyk/KHI9dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRQb3NMZWZ0KG4uY29sdW1uKSxuLmNvbHVtbj1NYXRoLnJvdW5kKHIvdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5jaGFyV2lkdGhzWzBdKSk6cj1uLmNvbHVtbip0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmNoYXJXaWR0aHNbMF0pLHRoaXMuJGRlc2lyZWRDb2x1bW4/bi5jb2x1bW49dGhpcy4kZGVzaXJlZENvbHVtbjp0aGlzLiRkZXNpcmVkQ29sdW1uPW4uY29sdW1uKTt2YXIgaT10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKG4ucm93K2Usbi5jb2x1bW4scik7ZSE9PTAmJnQ9PT0wJiZpLnJvdz09PXRoaXMubGVhZC5yb3cmJmkuY29sdW1uPT09dGhpcy5sZWFkLmNvbHVtbiYmdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzJiZ0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbaS5yb3ddJiYoaS5yb3c+MHx8ZT4wKSYmaS5yb3crKyx0aGlzLm1vdmVDdXJzb3JUbyhpLnJvdyxpLmNvbHVtbit0LHQ9PT0wKX0sdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLm1vdmVDdXJzb3JUbyhlLnJvdyxlLmNvbHVtbil9LHRoaXMubW92ZUN1cnNvclRvPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwxKTtyJiYoZT1yLnN0YXJ0LnJvdyx0PXIuc3RhcnQuY29sdW1uKSx0aGlzLiRrZWVwRGVzaXJlZENvbHVtbk9uQ2hhbmdlPSEwO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpOy9bXHVEQzAwLVx1REZGRl0vLnRlc3QoaS5jaGFyQXQodCkpJiZpLmNoYXJBdCh0LTEpJiYodGhpcy5sZWFkLnJvdz09ZSYmdGhpcy5sZWFkLmNvbHVtbj09dCsxP3QtPTE6dCs9MSksdGhpcy5sZWFkLnNldFBvc2l0aW9uKGUsdCksdGhpcy4ka2VlcERlc2lyZWRDb2x1bW5PbkNoYW5nZT0hMSxufHwodGhpcy4kZGVzaXJlZENvbHVtbj1udWxsKX0sdGhpcy5tb3ZlQ3Vyc29yVG9TY3JlZW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSx0KTt0aGlzLm1vdmVDdXJzb3JUbyhyLnJvdyxyLmNvbHVtbixuKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLmxlYWQuZGV0YWNoKCksdGhpcy5hbmNob3IuZGV0YWNoKCksdGhpcy5zZXNzaW9uPXRoaXMuZG9jPW51bGx9LHRoaXMuZnJvbU9yaWVudGVkUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZShlLGUuY3Vyc29yPT1lLnN0YXJ0KSx0aGlzLiRkZXNpcmVkQ29sdW1uPWUuZGVzaXJlZENvbHVtbnx8dGhpcy4kZGVzaXJlZENvbHVtbn0sdGhpcy50b09yaWVudGVkUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRSYW5nZSgpO3JldHVybiBlPyhlLnN0YXJ0LmNvbHVtbj10LnN0YXJ0LmNvbHVtbixlLnN0YXJ0LnJvdz10LnN0YXJ0LnJvdyxlLmVuZC5jb2x1bW49dC5lbmQuY29sdW1uLGUuZW5kLnJvdz10LmVuZC5yb3cpOmU9dCxlLmN1cnNvcj10aGlzLmlzQmFja3dhcmRzKCk/ZS5zdGFydDplLmVuZCxlLmRlc2lyZWRDb2x1bW49dGhpcy4kZGVzaXJlZENvbHVtbixlfSx0aGlzLmdldFJhbmdlT2ZNb3ZlbWVudHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRDdXJzb3IoKTt0cnl7ZSh0aGlzKTt2YXIgbj10aGlzLmdldEN1cnNvcigpO3JldHVybiBvLmZyb21Qb2ludHModCxuKX1jYXRjaChyKXtyZXR1cm4gby5mcm9tUG9pbnRzKHQsdCl9ZmluYWxseXt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfX0sdGhpcy50b0pTT049ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlQ291bnQpdmFyIGU9dGhpcy5yYW5nZXMubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2xvbmUoKTtyZXR1cm4gdC5pc0JhY2t3YXJkcz1lLmN1cnNvcj09ZS5zdGFydCx0fSk7ZWxzZXt2YXIgZT10aGlzLmdldFJhbmdlKCk7ZS5pc0JhY2t3YXJkcz10aGlzLmlzQmFja3dhcmRzKCl9cmV0dXJuIGV9LHRoaXMuZnJvbUpTT049ZnVuY3Rpb24oZSl7aWYoZS5zdGFydD09dW5kZWZpbmVkKXtpZih0aGlzLnJhbmdlTGlzdCYmZS5sZW5ndGg+MSl7dGhpcy50b1NpbmdsZVJhbmdlKGVbMF0pO2Zvcih2YXIgdD1lLmxlbmd0aDt0LS07KXt2YXIgbj1vLmZyb21Qb2ludHMoZVt0XS5zdGFydCxlW3RdLmVuZCk7ZVt0XS5pc0JhY2t3YXJkcyYmKG4uY3Vyc29yPW4uc3RhcnQpLHRoaXMuYWRkUmFuZ2UobiwhMCl9cmV0dXJufWU9ZVswXX10aGlzLnJhbmdlTGlzdCYmdGhpcy50b1NpbmdsZVJhbmdlKGUpLHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UoZSxlLmlzQmFja3dhcmRzKX0sdGhpcy5pc0VxdWFsPWZ1bmN0aW9uKGUpe2lmKChlLmxlbmd0aHx8dGhpcy5yYW5nZUNvdW50KSYmZS5sZW5ndGghPXRoaXMucmFuZ2VDb3VudClyZXR1cm4hMTtpZighZS5sZW5ndGh8fCF0aGlzLnJhbmdlcylyZXR1cm4gdGhpcy5nZXRSYW5nZSgpLmlzRXF1YWwoZSk7Zm9yKHZhciB0PXRoaXMucmFuZ2VzLmxlbmd0aDt0LS07KWlmKCF0aGlzLnJhbmdlc1t0XS5pc0VxdWFsKGVbdF0pKXJldHVybiExO3JldHVybiEwfX0pLmNhbGwodS5wcm90b3R5cGUpLHQuU2VsZWN0aW9uPXV9KSxhY2UuZGVmaW5lKCJhY2UvdG9rZW5pemVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9jb25maWciKSxpPTJlMyxzPWZ1bmN0aW9uKGUpe3RoaXMuc3RhdGVzPWUsdGhpcy5yZWdFeHBzPXt9LHRoaXMubWF0Y2hNYXBwaW5ncz17fTtmb3IodmFyIHQgaW4gdGhpcy5zdGF0ZXMpe3ZhciBuPXRoaXMuc3RhdGVzW3RdLHI9W10saT0wLHM9dGhpcy5tYXRjaE1hcHBpbmdzW3RdPXtkZWZhdWx0VG9rZW46InRleHQifSxvPSJnIix1PVtdO2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKXt2YXIgZj1uW2FdO2YuZGVmYXVsdFRva2VuJiYocy5kZWZhdWx0VG9rZW49Zi5kZWZhdWx0VG9rZW4pLGYuY2FzZUluc2Vuc2l0aXZlJiYobz0iZ2kiKTtpZihmLnJlZ2V4PT1udWxsKWNvbnRpbnVlO2YucmVnZXggaW5zdGFuY2VvZiBSZWdFeHAmJihmLnJlZ2V4PWYucmVnZXgudG9TdHJpbmcoKS5zbGljZSgxLC0xKSk7dmFyIGw9Zi5yZWdleCxjPShuZXcgUmVnRXhwKCIoPzooIitsKyIpfCguKSkiKSkuZXhlYygiYSIpLmxlbmd0aC0yO0FycmF5LmlzQXJyYXkoZi50b2tlbik/Zi50b2tlbi5sZW5ndGg9PTF8fGM9PTE/Zi50b2tlbj1mLnRva2VuWzBdOmMtMSE9Zi50b2tlbi5sZW5ndGg/KHRoaXMucmVwb3J0RXJyb3IoIm51bWJlciBvZiBjbGFzc2VzIGFuZCByZWdleHAgZ3JvdXBzIGRvZXNuJ3QgbWF0Y2giLHtydWxlOmYsZ3JvdXBDb3VudDpjLTF9KSxmLnRva2VuPWYudG9rZW5bMF0pOihmLnRva2VuQXJyYXk9Zi50b2tlbixmLnRva2VuPW51bGwsZi5vbk1hdGNoPXRoaXMuJGFycmF5VG9rZW5zKTp0eXBlb2YgZi50b2tlbj09ImZ1bmN0aW9uIiYmIWYub25NYXRjaCYmKGM+MT9mLm9uTWF0Y2g9dGhpcy4kYXBwbHlUb2tlbjpmLm9uTWF0Y2g9Zi50b2tlbiksYz4xJiYoL1xcXGQvLnRlc3QoZi5yZWdleCk/bD1mLnJlZ2V4LnJlcGxhY2UoL1xcKFswLTldKykvZyxmdW5jdGlvbihlLHQpe3JldHVybiJcXCIrKHBhcnNlSW50KHQsMTApK2krMSl9KTooYz0xLGw9dGhpcy5yZW1vdmVDYXB0dXJpbmdHcm91cHMoZi5yZWdleCkpLCFmLnNwbGl0UmVnZXgmJnR5cGVvZiBmLnRva2VuIT0ic3RyaW5nIiYmdS5wdXNoKGYpKSxzW2ldPWEsaSs9YyxyLnB1c2gobCksZi5vbk1hdGNofHwoZi5vbk1hdGNoPW51bGwpfXIubGVuZ3RofHwoc1swXT0wLHIucHVzaCgiJCIpKSx1LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcGxpdFJlZ2V4PXRoaXMuY3JlYXRlU3BsaXR0ZXJSZWdleHAoZS5yZWdleCxvKX0sdGhpcyksdGhpcy5yZWdFeHBzW3RdPW5ldyBSZWdFeHAoIigiK3Iuam9pbigiKXwoIikrIil8KCQpIixvKX19OyhmdW5jdGlvbigpe3RoaXMuJHNldE1heFRva2VuQ291bnQ9ZnVuY3Rpb24oZSl7aT1lfDB9LHRoaXMuJGFwcGx5VG9rZW49ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zcGxpdFJlZ2V4LmV4ZWMoZSkuc2xpY2UoMSksbj10aGlzLnRva2VuLmFwcGx5KHRoaXMsdCk7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVyblt7dHlwZTpuLHZhbHVlOmV9XTt2YXIgcj1bXTtmb3IodmFyIGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspdFtpXSYmKHJbci5sZW5ndGhdPXt0eXBlOm5baV0sdmFsdWU6dFtpXX0pO3JldHVybiByfSx0aGlzLiRhcnJheVRva2Vucz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNwbGl0UmVnZXguZXhlYyhlKTtpZighdClyZXR1cm4idGV4dCI7dmFyIG49W10scj10aGlzLnRva2VuQXJyYXk7Zm9yKHZhciBpPTAscz1yLmxlbmd0aDtpPHM7aSsrKXRbaSsxXSYmKG5bbi5sZW5ndGhdPXt0eXBlOnJbaV0sdmFsdWU6dFtpKzFdfSk7cmV0dXJuIG59LHRoaXMucmVtb3ZlQ2FwdHVyaW5nR3JvdXBzPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXFwufFxbKD86XFwufFteXFxcXV0pKnxcKFw/Wzo9IV18KFwoKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/Iig/OiI6ZX0pO3JldHVybiB0fSx0aGlzLmNyZWF0ZVNwbGl0dGVyUmVnZXhwPWZ1bmN0aW9uKGUsdCl7aWYoZS5pbmRleE9mKCIoPz0iKSE9LTEpe3ZhciBuPTAscj0hMSxpPXt9O2UucmVwbGFjZSgvKFxcLil8KFwoKD86XD9bPSFdKT8pfChcKSl8KFtcW1xdXSkvZyxmdW5jdGlvbihlLHQscyxvLHUsYSl7cmV0dXJuIHI/cj11IT0iXSI6dT9yPSEwOm8/KG49PWkuc3RhY2smJihpLmVuZD1hKzEsaS5zdGFjaz0tMSksbi0tKTpzJiYobisrLHMubGVuZ3RoIT0xJiYoaS5zdGFjaz1uLGkuc3RhcnQ9YSkpLGV9KSxpLmVuZCE9bnVsbCYmL15cKSokLy50ZXN0KGUuc3Vic3RyKGkuZW5kKSkmJihlPWUuc3Vic3RyaW5nKDAsaS5zdGFydCkrZS5zdWJzdHIoaS5lbmQpKX1yZXR1cm4gZS5jaGFyQXQoMCkhPSJeIiYmKGU9Il4iK2UpLGUuY2hhckF0KGUubGVuZ3RoLTEpIT0iJCImJihlKz0iJCIpLG5ldyBSZWdFeHAoZSwodHx8IiIpLnJlcGxhY2UoImciLCIiKSl9LHRoaXMuZ2V0TGluZVRva2Vucz1mdW5jdGlvbihlLHQpe2lmKHQmJnR5cGVvZiB0IT0ic3RyaW5nIil7dmFyIG49dC5zbGljZSgwKTt0PW5bMF0sdD09PSIjdG1wIiYmKG4uc2hpZnQoKSx0PW4uc2hpZnQoKSl9ZWxzZSB2YXIgbj1bXTt2YXIgcj10fHwic3RhcnQiLHM9dGhpcy5zdGF0ZXNbcl07c3x8KHI9InN0YXJ0IixzPXRoaXMuc3RhdGVzW3JdKTt2YXIgbz10aGlzLm1hdGNoTWFwcGluZ3Nbcl0sdT10aGlzLnJlZ0V4cHNbcl07dS5sYXN0SW5kZXg9MDt2YXIgYSxmPVtdLGw9MCxjPTAsaD17dHlwZTpudWxsLHZhbHVlOiIifTt3aGlsZShhPXUuZXhlYyhlKSl7dmFyIHA9by5kZWZhdWx0VG9rZW4sZD1udWxsLHY9YVswXSxtPXUubGFzdEluZGV4O2lmKG0tdi5sZW5ndGg+bCl7dmFyIGc9ZS5zdWJzdHJpbmcobCxtLXYubGVuZ3RoKTtoLnR5cGU9PXA/aC52YWx1ZSs9ZzooaC50eXBlJiZmLnB1c2goaCksaD17dHlwZTpwLHZhbHVlOmd9KX1mb3IodmFyIHk9MDt5PGEubGVuZ3RoLTI7eSsrKXtpZihhW3krMV09PT11bmRlZmluZWQpY29udGludWU7ZD1zW29beV1dLGQub25NYXRjaD9wPWQub25NYXRjaCh2LHIsbixlKTpwPWQudG9rZW4sZC5uZXh0JiYodHlwZW9mIGQubmV4dD09InN0cmluZyI/cj1kLm5leHQ6cj1kLm5leHQocixuKSxzPXRoaXMuc3RhdGVzW3JdLHN8fCh0aGlzLnJlcG9ydEVycm9yKCJzdGF0ZSBkb2Vzbid0IGV4aXN0IixyKSxyPSJzdGFydCIscz10aGlzLnN0YXRlc1tyXSksbz10aGlzLm1hdGNoTWFwcGluZ3Nbcl0sbD1tLHU9dGhpcy5yZWdFeHBzW3JdLHUubGFzdEluZGV4PW0pLGQuY29uc3VtZUxpbmVFbmQmJihsPW0pO2JyZWFrfWlmKHYpaWYodHlwZW9mIHA9PSJzdHJpbmciKSEhZCYmZC5tZXJnZT09PSExfHxoLnR5cGUhPT1wPyhoLnR5cGUmJmYucHVzaChoKSxoPXt0eXBlOnAsdmFsdWU6dn0pOmgudmFsdWUrPXY7ZWxzZSBpZihwKXtoLnR5cGUmJmYucHVzaChoKSxoPXt0eXBlOm51bGwsdmFsdWU6IiJ9O2Zvcih2YXIgeT0wO3k8cC5sZW5ndGg7eSsrKWYucHVzaChwW3ldKX1pZihsPT1lLmxlbmd0aClicmVhaztsPW07aWYoYysrPmkpe2M+MiplLmxlbmd0aCYmdGhpcy5yZXBvcnRFcnJvcigiaW5maW5pdGUgbG9vcCB3aXRoIGluIGFjZSB0b2tlbml6ZXIiLHtzdGFydFN0YXRlOnQsbGluZTplfSk7d2hpbGUobDxlLmxlbmd0aCloLnR5cGUmJmYucHVzaChoKSxoPXt2YWx1ZTplLnN1YnN0cmluZyhsLGwrPTUwMCksdHlwZToib3ZlcmZsb3cifTtyPSJzdGFydCIsbj1bXTticmVha319cmV0dXJuIGgudHlwZSYmZi5wdXNoKGgpLG4ubGVuZ3RoPjEmJm5bMF0hPT1yJiZuLnVuc2hpZnQoIiN0bXAiLHIpLHt0b2tlbnM6ZixzdGF0ZTpuLmxlbmd0aD9uOnJ9fSx0aGlzLnJlcG9ydEVycm9yPXIucmVwb3J0RXJyb3J9KS5jYWxsKHMucHJvdG90eXBlKSx0LlRva2VuaXplcj1zfSksYWNlLmRlZmluZSgiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9sYW5nIiksaT1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJlbXB0eV9saW5lIixyZWdleDoiXiQifSx7ZGVmYXVsdFRva2VuOiJ0ZXh0In1dfX07KGZ1bmN0aW9uKCl7dGhpcy5hZGRSdWxlcz1mdW5jdGlvbihlLHQpe2lmKCF0KXtmb3IodmFyIG4gaW4gZSl0aGlzLiRydWxlc1tuXT1lW25dO3JldHVybn1mb3IodmFyIG4gaW4gZSl7dmFyIHI9ZVtuXTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9cltpXTtpZihzLm5leHR8fHMub25NYXRjaCl0eXBlb2Ygcy5uZXh0PT0ic3RyaW5nIiYmcy5uZXh0LmluZGV4T2YodCkhPT0wJiYocy5uZXh0PXQrcy5uZXh0KSxzLm5leHRTdGF0ZSYmcy5uZXh0U3RhdGUuaW5kZXhPZih0KSE9PTAmJihzLm5leHRTdGF0ZT10K3MubmV4dFN0YXRlKX10aGlzLiRydWxlc1t0K25dPXJ9fSx0aGlzLmdldFJ1bGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJ1bGVzfSx0aGlzLmVtYmVkUnVsZXM9ZnVuY3Rpb24oZSx0LG4saSxzKXt2YXIgbz10eXBlb2YgZT09ImZ1bmN0aW9uIj8obmV3IGUpLmdldFJ1bGVzKCk6ZTtpZihpKWZvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKWlbdV09dCtpW3VdO2Vsc2V7aT1bXTtmb3IodmFyIGEgaW4gbylpLnB1c2godCthKX10aGlzLmFkZFJ1bGVzKG8sdCk7aWYobil7dmFyIGY9QXJyYXkucHJvdG90eXBlW3M/InB1c2giOiJ1bnNoaWZ0Il07Zm9yKHZhciB1PTA7dTxpLmxlbmd0aDt1KyspZi5hcHBseSh0aGlzLiRydWxlc1tpW3VdXSxyLmRlZXBDb3B5KG4pKX10aGlzLiRlbWJlZHN8fCh0aGlzLiRlbWJlZHM9W10pLHRoaXMuJGVtYmVkcy5wdXNoKHQpfSx0aGlzLmdldEVtYmVkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbWJlZHN9O3ZhciBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUhPSJzdGFydCJ8fHQubGVuZ3RoKSYmdC51bnNoaWZ0KHRoaXMubmV4dFN0YXRlLGUpLHRoaXMubmV4dFN0YXRlfSx0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc2hpZnQoKSx0LnNoaWZ0KCl8fCJzdGFydCJ9O3RoaXMubm9ybWFsaXplUnVsZXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHMpe3ZhciBvPXJbc107by5wcm9jZXNzZWQ9ITA7Zm9yKHZhciB1PTA7dTxvLmxlbmd0aDt1Kyspe3ZhciBhPW9bdV0sZj1udWxsO0FycmF5LmlzQXJyYXkoYSkmJihmPWEsYT17fSksIWEucmVnZXgmJmEuc3RhcnQmJihhLnJlZ2V4PWEuc3RhcnQsYS5uZXh0fHwoYS5uZXh0PVtdKSxhLm5leHQucHVzaCh7ZGVmYXVsdFRva2VuOmEudG9rZW59LHt0b2tlbjphLnRva2VuKyIuZW5kIixyZWdleDphLmVuZHx8YS5zdGFydCxuZXh0OiJwb3AifSksYS50b2tlbj1hLnRva2VuKyIuc3RhcnQiLGEucHVzaD0hMCk7dmFyIGw9YS5uZXh0fHxhLnB1c2g7aWYobCYmQXJyYXkuaXNBcnJheShsKSl7dmFyIGM9YS5zdGF0ZU5hbWU7Y3x8KGM9YS50b2tlbix0eXBlb2YgYyE9InN0cmluZyImJihjPWNbMF18fCIiKSxyW2NdJiYoYys9bisrKSkscltjXT1sLGEubmV4dD1jLGkoYyl9ZWxzZSBsPT0icG9wIiYmKGEubmV4dD10KTthLnB1c2gmJihhLm5leHRTdGF0ZT1hLm5leHR8fGEucHVzaCxhLm5leHQ9ZSxkZWxldGUgYS5wdXNoKTtpZihhLnJ1bGVzKWZvcih2YXIgaCBpbiBhLnJ1bGVzKXJbaF0/cltoXS5wdXNoJiZyW2hdLnB1c2guYXBwbHkocltoXSxhLnJ1bGVzW2hdKTpyW2hdPWEucnVsZXNbaF07dmFyIHA9dHlwZW9mIGE9PSJzdHJpbmciP2E6YS5pbmNsdWRlO3AmJihBcnJheS5pc0FycmF5KHApP2Y9cC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19KTpmPXJbcF0pO2lmKGYpe3ZhciBkPVt1LDFdLmNvbmNhdChmKTthLm5vRXNjYXBlJiYoZD1kLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5uZXh0fSkpLG8uc3BsaWNlLmFwcGx5KG8sZCksdS0tfWEua2V5d29yZE1hcCYmKGEudG9rZW49dGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyKGEua2V5d29yZE1hcCxhLmRlZmF1bHRUb2tlbnx8InRleHQiLGEuY2FzZUluc2Vuc2l0aXZlKSxkZWxldGUgYS5kZWZhdWx0VG9rZW4pfX12YXIgbj0wLHI9dGhpcy4kcnVsZXM7T2JqZWN0LmtleXMocikuZm9yRWFjaChpLHRoaXMpfSx0aGlzLmNyZWF0ZUtleXdvcmRNYXBwZXI9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcz1lW3RdO24mJihzPXMudG9Mb3dlckNhc2UoKSk7dmFyIG89cy5zcGxpdChyfHwifCIpO2Zvcih2YXIgdT1vLmxlbmd0aDt1LS07KWlbb1t1XV09dH0pLE9iamVjdC5nZXRQcm90b3R5cGVPZihpKSYmKGkuX19wcm90b19fPW51bGwpLHRoaXMuJGtleXdvcmRMaXN0PU9iamVjdC5rZXlzKGkpLGU9bnVsbCxuP2Z1bmN0aW9uKGUpe3JldHVybiBpW2UudG9Mb3dlckNhc2UoKV18fHR9OmZ1bmN0aW9uKGUpe3JldHVybiBpW2VdfHx0fX0sdGhpcy5nZXRLZXl3b3Jkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRrZXl3b3Jkc319KS5jYWxsKGkucHJvdG90eXBlKSx0LlRleHRIaWdobGlnaHRSdWxlcz1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbigpe3RoaXMuJGJlaGF2aW91cnM9e319OyhmdW5jdGlvbigpe3RoaXMuYWRkPWZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2godW5kZWZpbmVkKXtjYXNlIHRoaXMuJGJlaGF2aW91cnM6dGhpcy4kYmVoYXZpb3Vycz17fTtjYXNlIHRoaXMuJGJlaGF2aW91cnNbZV06dGhpcy4kYmVoYXZpb3Vyc1tlXT17fX10aGlzLiRiZWhhdmlvdXJzW2VdW3RdPW59LHRoaXMuYWRkQmVoYXZpb3Vycz1mdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlmb3IodmFyIG4gaW4gZVt0XSl0aGlzLmFkZCh0LG4sZVt0XVtuXSl9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3RoaXMuJGJlaGF2aW91cnMmJnRoaXMuJGJlaGF2aW91cnNbZV0mJmRlbGV0ZSB0aGlzLiRiZWhhdmlvdXJzW2VdfSx0aGlzLmluaGVyaXQ9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIil2YXIgbj0obmV3IGUpLmdldEJlaGF2aW91cnModCk7ZWxzZSB2YXIgbj1lLmdldEJlaGF2aW91cnModCk7dGhpcy5hZGRCZWhhdmlvdXJzKG4pfSx0aGlzLmdldEJlaGF2aW91cnM9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIHRoaXMuJGJlaGF2aW91cnM7dmFyIHQ9e307Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdGhpcy4kYmVoYXZpb3Vyc1tlW25dXSYmKHRbZVtuXV09dGhpcy4kYmVoYXZpb3Vyc1tlW25dXSk7cmV0dXJuIHR9fSkuY2FsbChyLnByb3RvdHlwZSksdC5CZWhhdmlvdXI9cn0pLGFjZS5kZWZpbmUoImFjZS90b2tlbl9pdGVyYXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9yYW5nZSIpLlJhbmdlLGk9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJHNlc3Npb249ZSx0aGlzLiRyb3c9dCx0aGlzLiRyb3dUb2tlbnM9ZS5nZXRUb2tlbnModCk7dmFyIHI9ZS5nZXRUb2tlbkF0KHQsbik7dGhpcy4kdG9rZW5JbmRleD1yP3IuaW5kZXg6LTF9OyhmdW5jdGlvbigpe3RoaXMuc3RlcEJhY2t3YXJkPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5JbmRleC09MTt3aGlsZSh0aGlzLiR0b2tlbkluZGV4PDApe3RoaXMuJHJvdy09MTtpZih0aGlzLiRyb3c8MClyZXR1cm4gdGhpcy4kcm93PTAsbnVsbDt0aGlzLiRyb3dUb2tlbnM9dGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93KSx0aGlzLiR0b2tlbkluZGV4PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgtMX1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLnN0ZXBGb3J3YXJkPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5JbmRleCs9MTt2YXIgZTt3aGlsZSh0aGlzLiR0b2tlbkluZGV4Pj10aGlzLiRyb3dUb2tlbnMubGVuZ3RoKXt0aGlzLiRyb3crPTEsZXx8KGU9dGhpcy4kc2Vzc2lvbi5nZXRMZW5ndGgoKSk7aWYodGhpcy4kcm93Pj1lKXJldHVybiB0aGlzLiRyb3c9ZS0xLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyksdGhpcy4kdG9rZW5JbmRleD0wfXJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuZ2V0Q3VycmVudFRva2VuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5nZXRDdXJyZW50VG9rZW5Sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm93fSx0aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHJvd1Rva2Vucyx0PXRoaXMuJHRva2VuSW5kZXgsbj1lW3RdLnN0YXJ0O2lmKG4hPT11bmRlZmluZWQpcmV0dXJuIG47bj0wO3doaWxlKHQ+MCl0LT0xLG4rPWVbdF0udmFsdWUubGVuZ3RoO3JldHVybiBufSx0aGlzLmdldEN1cnJlbnRUb2tlblBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJue3Jvdzp0aGlzLiRyb3csY29sdW1uOnRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fSx0aGlzLmdldEN1cnJlbnRUb2tlblJhbmdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdLHQ9dGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKTtyZXR1cm4gbmV3IHIodGhpcy4kcm93LHQsdGhpcy4kcm93LHQrZS52YWx1ZS5sZW5ndGgpfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuVG9rZW5JdGVyYXRvcj1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9saWIvb29wIiksaT1lKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIscz1lKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3Isbz1lKCIuLi8uLi9saWIvbGFuZyIpLHU9WyJ0ZXh0IiwicGFyZW4ucnBhcmVuIiwicnBhcmVuIiwicGFyZW4iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciJdLGE9WyJ0ZXh0IiwicGFyZW4ucnBhcmVuIiwicnBhcmVuIiwicGFyZW4iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImNvbW1lbnQiXSxmLGw9e30sYz17JyInOiciJywiJyI6IicifSxoPWZ1bmN0aW9uKGUpe3ZhciB0PS0xO2UubXVsdGlTZWxlY3QmJih0PWUuc2VsZWN0aW9uLmluZGV4LGwucmFuZ2VDb3VudCE9ZS5tdWx0aVNlbGVjdC5yYW5nZUNvdW50JiYobD17cmFuZ2VDb3VudDplLm11bHRpU2VsZWN0LnJhbmdlQ291bnR9KSk7aWYobFt0XSlyZXR1cm4gZj1sW3RdO2Y9bFt0XT17YXV0b0luc2VydGVkQnJhY2tldHM6MCxhdXRvSW5zZXJ0ZWRSb3c6LTEsYXV0b0luc2VydGVkTGluZUVuZDoiIixtYXliZUluc2VydGVkQnJhY2tldHM6MCxtYXliZUluc2VydGVkUm93Oi0xLG1heWJlSW5zZXJ0ZWRMaW5lU3RhcnQ6IiIsbWF5YmVJbnNlcnRlZExpbmVFbmQ6IiJ9fSxwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZW5kLnJvdy1lLnN0YXJ0LnJvdztyZXR1cm57dGV4dDpuK3QrcixzZWxlY3Rpb246WzAsZS5zdGFydC5jb2x1bW4rMSxpLGUuZW5kLmNvbHVtbisoaT8wOjEpXX19LGQ9ZnVuY3Rpb24oZSl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgdT1yLmdldEN1cnNvclBvc2l0aW9uKCksYT1pLmRvYy5nZXRMaW5lKHUucm93KTtpZihzPT0ieyIpe2gocik7dmFyIGw9ci5nZXRTZWxlY3Rpb25SYW5nZSgpLGM9aS5kb2MuZ2V0VGV4dFJhbmdlKGwpO2lmKGMhPT0iIiYmYyE9PSJ7IiYmci5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcChsLGMsInsiLCJ9Iik7aWYoZC5pc1NhbmVJbnNlcnRpb24ocixpKSlyZXR1cm4vW1xdXH1cKV0vLnRlc3QoYVt1LmNvbHVtbl0pfHxyLmluTXVsdGlTZWxlY3RNb2RlfHxlJiZlLmJyYWNlcz8oZC5yZWNvcmRBdXRvSW5zZXJ0KHIsaSwifSIpLHt0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfSk6KGQucmVjb3JkTWF5YmVJbnNlcnQocixpLCJ7Iikse3RleHQ6InsiLHNlbGVjdGlvbjpbMSwxXX0pfWVsc2UgaWYocz09In0iKXtoKHIpO3ZhciB2PWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKHY9PSJ9Iil7dmFyIG09aS4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOnUuY29sdW1uKzEscm93OnUucm93fSk7aWYobSE9PW51bGwmJmQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHUsYSxzKSlyZXR1cm4gZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nKCkse3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZXtpZihzPT0iXG4ifHxzPT0iXHJcbiIpe2gocik7dmFyIGc9IiI7ZC5pc01heWJlSW5zZXJ0ZWRDbG9zaW5nKHUsYSkmJihnPW8uc3RyaW5nUmVwZWF0KCJ9IixmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cyksZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nKCkpO3ZhciB2PWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKHY9PT0ifSIpe3ZhciB5PWkuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbisxfSwifSIpO2lmKCF5KXJldHVybiBudWxsO3ZhciBiPXRoaXMuJGdldEluZGVudChpLmdldExpbmUoeS5yb3cpKX1lbHNle2lmKCFnKXtkLmNsZWFyTWF5YmVJbnNlcnRlZENsb3NpbmcoKTtyZXR1cm59dmFyIGI9dGhpcy4kZ2V0SW5kZW50KGEpfXZhciB3PWIraS5nZXRUYWJTdHJpbmcoKTtyZXR1cm57dGV4dDoiXG4iK3crIlxuIitiK2csc2VsZWN0aW9uOlsxLHcubGVuZ3RoLDEsdy5sZW5ndGhdfX1kLmNsZWFyTWF5YmVJbnNlcnRlZENsb3NpbmcoKX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnM9PSJ7Iil7aChuKTt2YXIgbz1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSx1PW8uc3Vic3RyaW5nKGkuZW5kLmNvbHVtbixpLmVuZC5jb2x1bW4rMSk7aWYodT09In0iKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpO2YubWF5YmVJbnNlcnRlZEJyYWNrZXRzLS19fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXtpZihpPT0iKCIpe2gobik7dmFyIHM9bi5nZXRTZWxlY3Rpb25SYW5nZSgpLG89ci5kb2MuZ2V0VGV4dFJhbmdlKHMpO2lmKG8hPT0iIiYmbi5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcChzLG8sIigiLCIpIik7aWYoZC5pc1NhbmVJbnNlcnRpb24obixyKSlyZXR1cm4gZC5yZWNvcmRBdXRvSW5zZXJ0KG4sciwiKSIpLHt0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGk9PSIpIil7aChuKTt2YXIgdT1uLmdldEN1cnNvclBvc2l0aW9uKCksYT1yLmRvYy5nZXRMaW5lKHUucm93KSxmPWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKGY9PSIpIil7dmFyIGw9ci4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOnUuY29sdW1uKzEscm93OnUucm93fSk7aWYobCE9PW51bGwmJmQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHUsYSxpKSlyZXR1cm4gZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nKCkse3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzPT0iKCIpe2gobik7dmFyIG89ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksdT1vLnN1YnN0cmluZyhpLnN0YXJ0LmNvbHVtbisxLGkuc3RhcnQuY29sdW1uKzIpO2lmKHU9PSIpIilyZXR1cm4gaS5lbmQuY29sdW1uKyssaX19KSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoaT09IlsiKXtoKG4pO3ZhciBzPW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxvPXIuZG9jLmdldFRleHRSYW5nZShzKTtpZihvIT09IiImJm4uZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAocyxvLCJbIiwiXSIpO2lmKGQuaXNTYW5lSW5zZXJ0aW9uKG4scikpcmV0dXJuIGQucmVjb3JkQXV0b0luc2VydChuLHIsIl0iKSx7dGV4dDoiW10iLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihpPT0iXSIpe2gobik7dmFyIHU9bi5nZXRDdXJzb3JQb3NpdGlvbigpLGE9ci5kb2MuZ2V0TGluZSh1LnJvdyksZj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZihmPT0iXSIpe3ZhciBsPXIuJGZpbmRPcGVuaW5nQnJhY2tldCgiXSIse2NvbHVtbjp1LmNvbHVtbisxLHJvdzp1LnJvd30pO2lmKGwhPT1udWxsJiZkLmlzQXV0b0luc2VydGVkQ2xvc2luZyh1LGEsaSkpcmV0dXJuIGQucG9wQXV0b0luc2VydGVkQ2xvc2luZygpLHt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJicmFja2V0cyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzPT0iWyIpe2gobik7dmFyIG89ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksdT1vLnN1YnN0cmluZyhpLnN0YXJ0LmNvbHVtbisxLGkuc3RhcnQuY29sdW1uKzIpO2lmKHU9PSJdIilyZXR1cm4gaS5lbmQuY29sdW1uKyssaX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci4kbW9kZS4kcXVvdGVzfHxjO2lmKGkubGVuZ3RoPT0xJiZzW2ldKXtpZih0aGlzLmxpbmVDb21tZW50U3RhcnQmJnRoaXMubGluZUNvbW1lbnRTdGFydC5pbmRleE9mKGkpIT0tMSlyZXR1cm47aChuKTt2YXIgbz1pLHU9bi5nZXRTZWxlY3Rpb25SYW5nZSgpLGE9ci5kb2MuZ2V0VGV4dFJhbmdlKHUpO2lmKGEhPT0iIiYmKGEubGVuZ3RoIT0xfHwhc1thXSkmJm4uZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAodSxhLG8sbyk7aWYoIWEpe3ZhciBmPW4uZ2V0Q3Vyc29yUG9zaXRpb24oKSxsPXIuZG9jLmdldExpbmUoZi5yb3cpLGQ9bC5zdWJzdHJpbmcoZi5jb2x1bW4tMSxmLmNvbHVtbiksdj1sLnN1YnN0cmluZyhmLmNvbHVtbixmLmNvbHVtbisxKSxtPXIuZ2V0VG9rZW5BdChmLnJvdyxmLmNvbHVtbiksZz1yLmdldFRva2VuQXQoZi5yb3csZi5jb2x1bW4rMSk7aWYoZD09IlxcIiYmbSYmL2VzY2FwZS8udGVzdChtLnR5cGUpKXJldHVybiBudWxsO3ZhciB5PW0mJi9zdHJpbmd8ZXNjYXBlLy50ZXN0KG0udHlwZSksYj0hZ3x8L3N0cmluZ3xlc2NhcGUvLnRlc3QoZy50eXBlKSx3O2lmKHY9PW8pdz15IT09Yix3JiYvc3RyaW5nXC5lbmQvLnRlc3QoZy50eXBlKSYmKHc9ITEpO2Vsc2V7aWYoeSYmIWIpcmV0dXJuIG51bGw7aWYoeSYmYilyZXR1cm4gbnVsbDt2YXIgRT1yLiRtb2RlLnRva2VuUmU7RS5sYXN0SW5kZXg9MDt2YXIgUz1FLnRlc3QoZCk7RS5sYXN0SW5kZXg9MDt2YXIgeD1FLnRlc3QoZCk7aWYoU3x8eClyZXR1cm4gbnVsbDtpZih2JiYhL1tcczssLn0pXF1cXF0vLnRlc3QodikpcmV0dXJuIG51bGw7dmFyIFQ9bFtmLmNvbHVtbi0yXTtpZighKGQhPW98fFQhPW8mJiFFLnRlc3QoVCkpKXJldHVybiBudWxsO3c9ITB9cmV0dXJue3RleHQ6dz9vK286IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci4kbW9kZS4kcXVvdGVzfHxjLG89ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnMuaGFzT3duUHJvcGVydHkobykpe2gobik7dmFyIHU9ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksYT11LnN1YnN0cmluZyhpLnN0YXJ0LmNvbHVtbisxLGkuc3RhcnQuY29sdW1uKzIpO2lmKGE9PW8pcmV0dXJuIGkuZW5kLmNvbHVtbisrLGl9fSl9O2QuaXNTYW5lSW5zZXJ0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRDdXJzb3JQb3NpdGlvbigpLHI9bmV3IHModCxuLnJvdyxuLmNvbHVtbik7aWYoIXRoaXMuJG1hdGNoVG9rZW5UeXBlKHIuZ2V0Q3VycmVudFRva2VuKCl8fCJ0ZXh0Iix1KSl7aWYoL1spfVxdXS8udGVzdChlLnNlc3Npb24uZ2V0TGluZShuLnJvdylbbi5jb2x1bW5dKSlyZXR1cm4hMDt2YXIgaT1uZXcgcyh0LG4ucm93LG4uY29sdW1uKzEpO2lmKCF0aGlzLiRtYXRjaFRva2VuVHlwZShpLmdldEN1cnJlbnRUb2tlbigpfHwidGV4dCIsdSkpcmV0dXJuITF9cmV0dXJuIHIuc3RlcEZvcndhcmQoKSxyLmdldEN1cnJlbnRUb2tlblJvdygpIT09bi5yb3d8fHRoaXMuJG1hdGNoVG9rZW5UeXBlKHIuZ2V0Q3VycmVudFRva2VuKCl8fCJ0ZXh0IixhKX0sZC4kbWF0Y2hUb2tlblR5cGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5pbmRleE9mKGUudHlwZXx8ZSk+LTF9LGQucmVjb3JkQXV0b0luc2VydD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRDdXJzb3JQb3NpdGlvbigpLGk9dC5kb2MuZ2V0TGluZShyLnJvdyk7dGhpcy5pc0F1dG9JbnNlcnRlZENsb3NpbmcocixpLGYuYXV0b0luc2VydGVkTGluZUVuZFswXSl8fChmLmF1dG9JbnNlcnRlZEJyYWNrZXRzPTApLGYuYXV0b0luc2VydGVkUm93PXIucm93LGYuYXV0b0luc2VydGVkTGluZUVuZD1uK2kuc3Vic3RyKHIuY29sdW1uKSxmLmF1dG9JbnNlcnRlZEJyYWNrZXRzKyt9LGQucmVjb3JkTWF5YmVJbnNlcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPXQuZG9jLmdldExpbmUoci5yb3cpO3RoaXMuaXNNYXliZUluc2VydGVkQ2xvc2luZyhyLGkpfHwoZi5tYXliZUluc2VydGVkQnJhY2tldHM9MCksZi5tYXliZUluc2VydGVkUm93PXIucm93LGYubWF5YmVJbnNlcnRlZExpbmVTdGFydD1pLnN1YnN0cigwLHIuY29sdW1uKStuLGYubWF5YmVJbnNlcnRlZExpbmVFbmQ9aS5zdWJzdHIoci5jb2x1bW4pLGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzKyt9LGQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cz4wJiZlLnJvdz09PWYuYXV0b0luc2VydGVkUm93JiZuPT09Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kWzBdJiZ0LnN1YnN0cihlLmNvbHVtbik9PT1mLmF1dG9JbnNlcnRlZExpbmVFbmR9LGQuaXNNYXliZUluc2VydGVkQ2xvc2luZz1mdW5jdGlvbihlLHQpe3JldHVybiBmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cz4wJiZlLnJvdz09PWYubWF5YmVJbnNlcnRlZFJvdyYmdC5zdWJzdHIoZS5jb2x1bW4pPT09Zi5tYXliZUluc2VydGVkTGluZUVuZCYmdC5zdWJzdHIoMCxlLmNvbHVtbik9PWYubWF5YmVJbnNlcnRlZExpbmVTdGFydH0sZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKCl7Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kPWYuYXV0b0luc2VydGVkTGluZUVuZC5zdWJzdHIoMSksZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cy0tfSxkLmNsZWFyTWF5YmVJbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oKXtmJiYoZi5tYXliZUluc2VydGVkQnJhY2tldHM9MCxmLm1heWJlSW5zZXJ0ZWRSb3c9LTEpfSxyLmluaGVyaXRzKGQsaSksdC5Dc3R5bGVCZWhhdmlvdXI9ZH0pLGFjZS5kZWZpbmUoImFjZS91bmljb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1bNDgsOSw4LDI1LDUsMCwyLDI1LDQ4LDAsMTEsMCw1LDAsNiwyMiwyLDMwLDIsNDU3LDUsMTEsMTUsNCw4LDAsMiwwLDE4LDExNiwyLDEsMywzLDksMCwyLDIsMiwwLDIsMTksMiw4MiwyLDEzOCwyLDQsMywxNTUsMTIsMzcsMywwLDgsMzgsMTAsNDQsMiwwLDIsMSwyLDEsMiwwLDksMjYsNiwyLDMwLDEwLDcsNjEsMiw5LDUsMTAxLDIsNywzLDksMiwxOCwzLDAsMTcsNTgsMywxMDAsMTUsNTMsNSwwLDYsNDUsMjExLDU3LDMsMTgsMiw1LDMsMTEsMyw5LDIsMSw3LDYsMiwyLDIsNywzLDEsMywyMSwyLDYsMiwwLDQsMywzLDgsMywxLDMsMyw5LDAsNSwxLDIsNCwzLDExLDE2LDIsMiw1LDUsMSwzLDIxLDIsNiwyLDEsMiwxLDIsMSwzLDAsMiw0LDUsMSwzLDIsNCwwLDgsMywyLDAsOCwxNSwxMiwyLDIsOCwyLDIsMiwyMSwyLDYsMiwxLDIsNCwzLDksMiwyLDIsMiwzLDAsMTYsMywzLDksMTgsMiwyLDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsMyw4LDMsMSwzLDIsOSwxLDUsMSwyLDQsMyw5LDIsMCwxNywxLDIsNSw0LDIsMiwzLDQsMSwyLDAsMiwxLDQsMSw0LDIsNCwxMSw1LDQsNCwyLDIsMywzLDAsNywwLDE1LDksMTgsMiwyLDcsMiwyLDIsMjIsMiw5LDIsNCw0LDcsMiwyLDIsMyw4LDEsMiwxLDcsMywzLDksMTksMSwyLDcsMiwyLDIsMjIsMiw5LDIsNCwzLDgsMiwyLDIsMyw4LDEsOCwwLDIsMywzLDksMTksMSwyLDcsMiwyLDIsMjIsMiwxNSw0LDcsMiwyLDIsMywxMCwwLDksMywzLDksMTEsNSwzLDEsMiwxNyw0LDIzLDIsOCwyLDAsMyw2LDQsMCw1LDUsMiwwLDIsNywxOSwxLDE0LDU3LDYsMTQsMiw5LDQwLDEsMiwwLDMsMSwyLDAsMywwLDcsMywyLDYsMiwyLDIsMCwyLDAsMywxLDIsMTIsMiwyLDMsNCwyLDAsMiw1LDMsOSwzLDEsMzUsMCwyNCwxLDcsOSwxMiwwLDIsMCwyLDAsNSw5LDIsMzUsNSwxOSwyLDUsNSw3LDIsMzUsMTAsMCw1OCw3Myw3LDc3LDMsMzcsMTEsNDIsMiwwLDQsMzI4LDIsMywzLDYsMiwwLDIsMywzLDQwLDIsMywzLDMyLDIsMywzLDYsMiwwLDIsMywzLDE0LDIsNTYsMiwzLDMsNjYsNSwwLDMzLDE1LDE3LDg0LDEzLDYxOSwzLDE2LDIsMjUsNiw3NCwyMiwxMiwyLDYsMTIsMjAsMTIsMTksMTMsMTIsMiwyLDIsMSwxMyw1MSwzLDI5LDQsMCw1LDEsMyw5LDM0LDIsMyw5LDcsODcsOSw0Miw2LDY5LDExLDI4LDQsMTEsNSwxMSwxMSwzOSwzLDQsMTIsNDMsNSwyNSw3LDEwLDM4LDI3LDUsNjIsMiwyOCwzLDEwLDcsOSwxNCwwLDg5LDc1LDUsOSwxOCw4LDEzLDQyLDQsMTEsNzEsNTUsOSw5LDQsNDgsODMsMiwyLDMwLDE0LDIzMCwyMywyODAsMyw1LDMsMzcsMyw1LDMsNywyLDAsMiwwLDIsMCwyLDMwLDMsNTIsMiw2LDIsMCw0LDIsMiw2LDQsMywzLDUsNSwxMiw2LDIsMiw2LDY3LDEsMjAsMCwyOSwwLDE0LDAsMTcsNCw2MCwxMiw1LDAsNCwxMSwxOCwwLDUsMCwzLDksMiwwLDQsNCw3LDAsMiwwLDIsMCwyLDMsMiwxMCwzLDMsNiw0LDUsMCw1MywxLDI2ODQsNDYsMiw0NiwyLDEzMiw3LDYsMTUsMzcsMTEsNTMsMTAsMCwxNywyMiwxMCw2LDIsNiwyLDYsMiw2LDIsNiwyLDYsMiw2LDIsNiwyLDMxLDQ4LDAsNDcwLDEsMzYsNSwyLDQsNiwxLDUsODUsMywxLDMsMiwyLDg5LDIsMyw2LDQwLDQsOTMsMTgsMjMsNTcsMTUsNTEzLDY1ODEsNzUsMjA5MzksNTMsMTE2NCw2OCw0NSwzLDI2OCw0LDI3LDIxLDMxLDMsMTMsMTMsMSwyLDI0LDksNjksMTEsMSwzOCw4LDMsMTAyLDMsMSwxMTEsNDQsMjUsNTEsMTMsNjgsMTIsOSw3LDIzLDQsMCw1LDQ1LDMsMzUsMTMsMjgsNCw2NCwxNSwxMCwzOSw1NCwxMCwxMywzLDksNywyMiw0LDEsNSw2NiwyNSwyLDIyNyw0MiwyLDEsMyw5LDcsMTExNzEsMTMsMjIsNSw0OCw4NDUzLDMwMSwzLDYxLDMsMTA1LDM5LDYsMTMsNCw2LDExLDIsMTIsMiw0LDIsMCwyLDEsMiwxLDIsMTA3LDM0LDM2MiwxOSw2MywzLDUzLDQxLDExLDUsMTUsMTcsNiwxMywxLDI1LDIsMzMsNCwyLDEzNCwyMCw5LDgsMjUsNSwwLDIsMjUsMTIsODgsNCw1LDMsNSwzLDUsMywyXSxpPTAscz1bXTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTIpcy5wdXNoKGkrPXJbb10pLHJbbysxXSYmcy5wdXNoKDQ1LGkrPXJbbysxXSk7dC53b3JkQ2hhcnM9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHMpfSksYWNlLmRlZmluZSgiYWNlL21vZGUvdGV4dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9jb25maWciLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL3VuaWNvZGUiLCJhY2UvbGliL2xhbmciLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2NvbmZpZyIpLGk9ZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLHM9ZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxvPWUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cix1PWUoIi4uL3VuaWNvZGUiKSxhPWUoIi4uL2xpYi9sYW5nIiksZj1lKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsbD1lKCIuLi9yYW5nZSIpLlJhbmdlLGM9ZnVuY3Rpb24oKXt0aGlzLkhpZ2hsaWdodFJ1bGVzPXN9OyhmdW5jdGlvbigpe3RoaXMuJGRlZmF1bHRCZWhhdmlvdXI9bmV3IG8sdGhpcy50b2tlblJlPW5ldyBSZWdFeHAoIl5bIit1LndvcmRDaGFycysiXFwkX10rIiwiZyIpLHRoaXMubm9uVG9rZW5SZT1uZXcgUmVnRXhwKCJeKD86W14iK3Uud29yZENoYXJzKyJcXCRfXXxcXHNdKSsiLCJnIiksdGhpcy5nZXRUb2tlbml6ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdG9rZW5pemVyfHwodGhpcy4kaGlnaGxpZ2h0UnVsZXM9dGhpcy4kaGlnaGxpZ2h0UnVsZXN8fG5ldyB0aGlzLkhpZ2hsaWdodFJ1bGVzKHRoaXMuJGhpZ2hsaWdodFJ1bGVDb25maWcpLHRoaXMuJHRva2VuaXplcj1uZXcgaSh0aGlzLiRoaWdobGlnaHRSdWxlcy5nZXRSdWxlcygpKSksdGhpcy4kdG9rZW5pemVyfSx0aGlzLmxpbmVDb21tZW50U3RhcnQ9IiIsdGhpcy5ibG9ja0NvbW1lbnQ9IiIsdGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oZSx0LG4scil7ZnVuY3Rpb24gdyhlKXtmb3IodmFyIHQ9bjt0PD1yO3QrKyllKGkuZ2V0TGluZSh0KSx0KX12YXIgaT10LmRvYyxzPSEwLG89ITAsdT1JbmZpbml0eSxmPXQuZ2V0VGFiU2l6ZSgpLGw9ITE7aWYoIXRoaXMubGluZUNvbW1lbnRTdGFydCl7aWYoIXRoaXMuYmxvY2tDb21tZW50KXJldHVybiExO3ZhciBjPXRoaXMuYmxvY2tDb21tZW50LnN0YXJ0LGg9dGhpcy5ibG9ja0NvbW1lbnQuZW5kLHA9bmV3IFJlZ0V4cCgiXihcXHMqKSg/OiIrYS5lc2NhcGVSZWdFeHAoYykrIikiKSxkPW5ldyBSZWdFeHAoIig/OiIrYS5lc2NhcGVSZWdFeHAoaCkrIilcXHMqJCIpLHY9ZnVuY3Rpb24oZSx0KXtpZihnKGUsdCkpcmV0dXJuO2lmKCFzfHwvXFMvLnRlc3QoZSkpaS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjplLmxlbmd0aH0saCksaS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjp1fSxjKX0sbT1mdW5jdGlvbihlLHQpe3ZhciBuOyhuPWUubWF0Y2goZCkpJiZpLnJlbW92ZUluTGluZSh0LGUubGVuZ3RoLW5bMF0ubGVuZ3RoLGUubGVuZ3RoKSwobj1lLm1hdGNoKHApKSYmaS5yZW1vdmVJbkxpbmUodCxuWzFdLmxlbmd0aCxuWzBdLmxlbmd0aCl9LGc9ZnVuY3Rpb24oZSxuKXtpZihwLnRlc3QoZSkpcmV0dXJuITA7dmFyIHI9dC5nZXRUb2tlbnMobik7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspaWYocltpXS50eXBlPT09ImNvbW1lbnQiKXJldHVybiEwfX1lbHNle2lmKEFycmF5LmlzQXJyYXkodGhpcy5saW5lQ29tbWVudFN0YXJ0KSl2YXIgcD10aGlzLmxpbmVDb21tZW50U3RhcnQubWFwKGEuZXNjYXBlUmVnRXhwKS5qb2luKCJ8IiksYz10aGlzLmxpbmVDb21tZW50U3RhcnRbMF07ZWxzZSB2YXIgcD1hLmVzY2FwZVJlZ0V4cCh0aGlzLmxpbmVDb21tZW50U3RhcnQpLGM9dGhpcy5saW5lQ29tbWVudFN0YXJ0O3A9bmV3IFJlZ0V4cCgiXihcXHMqKSg/OiIrcCsiKSA/IiksbD10LmdldFVzZVNvZnRUYWJzKCk7dmFyIG09ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1hdGNoKHApO2lmKCFuKXJldHVybjt2YXIgcj1uWzFdLmxlbmd0aCxzPW5bMF0ubGVuZ3RoOyFiKGUscixzKSYmblswXVtzLTFdPT0iICImJnMtLSxpLnJlbW92ZUluTGluZSh0LHIscyl9LHk9YysiICIsdj1mdW5jdGlvbihlLHQpe2lmKCFzfHwvXFMvLnRlc3QoZSkpYihlLHUsdSk/aS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjp1fSx5KTppLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOnV9LGMpfSxnPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAudGVzdChlKX0sYj1mdW5jdGlvbihlLHQsbil7dmFyIHI9MDt3aGlsZSh0LS0mJmUuY2hhckF0KHQpPT0iICIpcisrO2lmKHIlZiE9MClyZXR1cm4hMTt2YXIgcj0wO3doaWxlKGUuY2hhckF0KG4rKyk9PSIgIilyKys7cmV0dXJuIGY+Mj9yJWYhPWYtMTpyJWY9PTB9fXZhciBFPUluZmluaXR5O3coZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNlYXJjaCgvXFMvKTtuIT09LTE/KG48dSYmKHU9biksbyYmIWcoZSx0KSYmKG89ITEpKTpFPmUubGVuZ3RoJiYoRT1lLmxlbmd0aCl9KSx1PT1JbmZpbml0eSYmKHU9RSxzPSExLG89ITEpLGwmJnUlZiE9MCYmKHU9TWF0aC5mbG9vcih1L2YpKmYpLHcobz9tOnYpfSx0aGlzLnRvZ2dsZUJsb2NrQ29tbWVudD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLmJsb2NrQ29tbWVudDtpZighaSlyZXR1cm47IWkuc3RhcnQmJmlbMF0mJihpPWlbMF0pO3ZhciBzPW5ldyBmKHQsci5yb3csci5jb2x1bW4pLG89cy5nZXRDdXJyZW50VG9rZW4oKSx1PXQuc2VsZWN0aW9uLGE9dC5zZWxlY3Rpb24udG9PcmllbnRlZFJhbmdlKCksYyxoO2lmKG8mJi9jb21tZW50Ly50ZXN0KG8udHlwZSkpe3ZhciBwLGQ7d2hpbGUobyYmL2NvbW1lbnQvLnRlc3Qoby50eXBlKSl7dmFyIHY9by52YWx1ZS5pbmRleE9mKGkuc3RhcnQpO2lmKHYhPS0xKXt2YXIgbT1zLmdldEN1cnJlbnRUb2tlblJvdygpLGc9cy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSt2O3A9bmV3IGwobSxnLG0sZytpLnN0YXJ0Lmxlbmd0aCk7YnJlYWt9bz1zLnN0ZXBCYWNrd2FyZCgpfXZhciBzPW5ldyBmKHQsci5yb3csci5jb2x1bW4pLG89cy5nZXRDdXJyZW50VG9rZW4oKTt3aGlsZShvJiYvY29tbWVudC8udGVzdChvLnR5cGUpKXt2YXIgdj1vLnZhbHVlLmluZGV4T2YoaS5lbmQpO2lmKHYhPS0xKXt2YXIgbT1zLmdldEN1cnJlbnRUb2tlblJvdygpLGc9cy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSt2O2Q9bmV3IGwobSxnLG0sZytpLmVuZC5sZW5ndGgpO2JyZWFrfW89cy5zdGVwRm9yd2FyZCgpfWQmJnQucmVtb3ZlKGQpLHAmJih0LnJlbW92ZShwKSxjPXAuc3RhcnQucm93LGg9LWkuc3RhcnQubGVuZ3RoKX1lbHNlIGg9aS5zdGFydC5sZW5ndGgsYz1uLnN0YXJ0LnJvdyx0Lmluc2VydChuLmVuZCxpLmVuZCksdC5pbnNlcnQobi5zdGFydCxpLnN0YXJ0KTthLnN0YXJ0LnJvdz09YyYmKGEuc3RhcnQuY29sdW1uKz1oKSxhLmVuZC5yb3c9PWMmJihhLmVuZC5jb2x1bW4rPWgpLHQuc2VsZWN0aW9uLmZyb21PcmllbnRlZFJhbmdlKGEpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KHQpfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe30sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqLylbMF19LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsfSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXM9ZnVuY3Rpb24oZSl7dGhpcy4kZW1iZWRzPVtdLHRoaXMuJG1vZGVzPXt9O2Zvcih2YXIgdCBpbiBlKWlmKGVbdF0pe3ZhciBuPWVbdF0saT1uLnByb3RvdHlwZS4kaWQscz1yLiRtb2Rlc1tpXTtzfHwoci4kbW9kZXNbaV09cz1uZXcgbiksci4kbW9kZXNbdF18fChyLiRtb2Rlc1t0XT1zKSx0aGlzLiRlbWJlZHMucHVzaCh0KSx0aGlzLiRtb2Rlc1t0XT1zfXZhciBvPVsidG9nZ2xlQmxvY2tDb21tZW50IiwidG9nZ2xlQ29tbWVudExpbmVzIiwiZ2V0TmV4dExpbmVJbmRlbnQiLCJjaGVja091dGRlbnQiLCJhdXRvT3V0ZGVudCIsInRyYW5zZm9ybUFjdGlvbiIsImdldENvbXBsZXRpb25zIl07Zm9yKHZhciB0PTA7dDxvLmxlbmd0aDt0KyspKGZ1bmN0aW9uKGUpe3ZhciBuPW9bdF0scj1lW25dO2Vbb1t0XV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZGVsZWdhdG9yKG4sYXJndW1lbnRzLHIpfX0pKHRoaXMpfSx0aGlzLiRkZWxlZ2F0b3I9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF18fCJzdGFydCI7aWYodHlwZW9mIHIhPSJzdHJpbmciKXtpZihBcnJheS5pc0FycmF5KHJbMl0pKXt2YXIgaT1yWzJdW3JbMl0ubGVuZ3RoLTFdLHM9dGhpcy4kbW9kZXNbaV07aWYocylyZXR1cm4gc1tlXS5hcHBseShzLFtyWzFdXS5jb25jYXQoW10uc2xpY2UuY2FsbCh0LDEpKSl9cj1yWzBdfHwic3RhcnQifWZvcih2YXIgbz0wO288dGhpcy4kZW1iZWRzLmxlbmd0aDtvKyspe2lmKCF0aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbb11dKWNvbnRpbnVlO3ZhciB1PXIuc3BsaXQodGhpcy4kZW1iZWRzW29dKTtpZighdVswXSYmdVsxXSl7dFswXT11WzFdO3ZhciBzPXRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tvXV07cmV0dXJuIHNbZV0uYXBwbHkocyx0KX19dmFyIGE9bi5hcHBseSh0aGlzLHQpO3JldHVybiBuP2E6dW5kZWZpbmVkfSx0aGlzLnRyYW5zZm9ybUFjdGlvbj1mdW5jdGlvbihlLHQsbixyLGkpe2lmKHRoaXMuJGJlaGF2aW91cil7dmFyIHM9dGhpcy4kYmVoYXZpb3VyLmdldEJlaGF2aW91cnMoKTtmb3IodmFyIG8gaW4gcylpZihzW29dW3RdKXt2YXIgdT1zW29dW3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih1KXJldHVybiB1fX19LHRoaXMuZ2V0S2V5d29yZHM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29tcGxldGlvbktleXdvcmRzKXt2YXIgdD10aGlzLiR0b2tlbml6ZXIucnVsZXMsbj1bXTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9dFtyXTtmb3IodmFyIHM9MCxvPWkubGVuZ3RoO3M8bztzKyspaWYodHlwZW9mIGlbc10udG9rZW49PSJzdHJpbmciKS9rZXl3b3JkfHN1cHBvcnR8c3RvcmFnZS8udGVzdChpW3NdLnRva2VuKSYmbi5wdXNoKGlbc10ucmVnZXgpO2Vsc2UgaWYodHlwZW9mIGlbc10udG9rZW49PSJvYmplY3QiKWZvcih2YXIgdT0wLGE9aVtzXS50b2tlbi5sZW5ndGg7dTxhO3UrKylpZigva2V5d29yZHxzdXBwb3J0fHN0b3JhZ2UvLnRlc3QoaVtzXS50b2tlblt1XSkpe3ZhciByPWlbc10ucmVnZXgubWF0Y2goL1woLis/XCkvZylbdV07bi5wdXNoKHIuc3Vic3RyKDEsci5sZW5ndGgtMikpfX10aGlzLmNvbXBsZXRpb25LZXl3b3Jkcz1ufXJldHVybiBlP24uY29uY2F0KHRoaXMuJGtleXdvcmRMaXN0fHxbXSk6dGhpcy4ka2V5d29yZExpc3R9LHRoaXMuJGNyZWF0ZUtleXdvcmRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhpZ2hsaWdodFJ1bGVzfHx0aGlzLmdldFRva2VuaXplcigpLHRoaXMuJGtleXdvcmRMaXN0PXRoaXMuJGhpZ2hsaWdodFJ1bGVzLiRrZXl3b3JkTGlzdHx8W119LHRoaXMuZ2V0Q29tcGxldGlvbnM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4ka2V5d29yZExpc3R8fHRoaXMuJGNyZWF0ZUtleXdvcmRMaXN0KCk7cmV0dXJuIGkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUsdmFsdWU6ZSxzY29yZTowLG1ldGE6ImtleXdvcmQifX0pfSx0aGlzLiRpZD0iYWNlL21vZGUvdGV4dCJ9KS5jYWxsKGMucHJvdG90eXBlKSx0Lk1vZGU9Y30pLGFjZS5kZWZpbmUoImFjZS9hcHBseV9kZWx0YSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3Rocm93IGNvbnNvbGUubG9nKCJJbnZhbGlkIERlbHRhOiIsZSksIkludmFsaWQgRGVsdGE6ICIrdH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIHQucm93Pj0wJiZ0LnJvdzxlLmxlbmd0aCYmdC5jb2x1bW4+PTAmJnQuY29sdW1uPD1lW3Qucm93XS5sZW5ndGh9ZnVuY3Rpb24gcyhlLHQpe3QuYWN0aW9uIT0iaW5zZXJ0IiYmdC5hY3Rpb24hPSJyZW1vdmUiJiZyKHQsImRlbHRhLmFjdGlvbiBtdXN0IGJlICdpbnNlcnQnIG9yICdyZW1vdmUnIiksdC5saW5lcyBpbnN0YW5jZW9mIEFycmF5fHxyKHQsImRlbHRhLmxpbmVzIG11c3QgYmUgYW4gQXJyYXkiKSwoIXQuc3RhcnR8fCF0LmVuZCkmJnIodCwiZGVsdGEuc3RhcnQvZW5kIG11c3QgYmUgYW4gcHJlc2VudCIpO3ZhciBuPXQuc3RhcnQ7aShlLHQuc3RhcnQpfHxyKHQsImRlbHRhLnN0YXJ0IG11c3QgYmUgY29udGFpbmVkIGluIGRvY3VtZW50Iik7dmFyIHM9dC5lbmQ7dC5hY3Rpb249PSJyZW1vdmUiJiYhaShlLHMpJiZyKHQsImRlbHRhLmVuZCBtdXN0IGNvbnRhaW5lZCBpbiBkb2N1bWVudCBmb3IgJ3JlbW92ZScgYWN0aW9ucyIpO3ZhciBvPXMucm93LW4ucm93LHU9cy5jb2x1bW4tKG89PTA/bi5jb2x1bW46MCk7KG8hPXQubGluZXMubGVuZ3RoLTF8fHQubGluZXNbb10ubGVuZ3RoIT11KSYmcih0LCJkZWx0YS5yYW5nZSBtdXN0IG1hdGNoIGRlbHRhIGxpbmVzIil9dC5hcHBseURlbHRhPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnN0YXJ0LnJvdyxpPXQuc3RhcnQuY29sdW1uLHM9ZVtyXXx8IiI7c3dpdGNoKHQuYWN0aW9uKXtjYXNlImluc2VydCI6dmFyIG89dC5saW5lcztpZihvLmxlbmd0aD09PTEpZVtyXT1zLnN1YnN0cmluZygwLGkpK3QubGluZXNbMF0rcy5zdWJzdHJpbmcoaSk7ZWxzZXt2YXIgdT1bciwxXS5jb25jYXQodC5saW5lcyk7ZS5zcGxpY2UuYXBwbHkoZSx1KSxlW3JdPXMuc3Vic3RyaW5nKDAsaSkrZVtyXSxlW3IrdC5saW5lcy5sZW5ndGgtMV0rPXMuc3Vic3RyaW5nKGkpfWJyZWFrO2Nhc2UicmVtb3ZlIjp2YXIgYT10LmVuZC5jb2x1bW4sZj10LmVuZC5yb3c7cj09PWY/ZVtyXT1zLnN1YnN0cmluZygwLGkpK3Muc3Vic3RyaW5nKGEpOmUuc3BsaWNlKHIsZi1yKzEscy5zdWJzdHJpbmcoMCxpKStlW2ZdLnN1YnN0cmluZyhhKSl9fX0pLGFjZS5kZWZpbmUoImFjZS9hbmNob3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9dC5BbmNob3I9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJG9uQ2hhbmdlPXRoaXMub25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLmF0dGFjaChlKSx0eXBlb2Ygbj09InVuZGVmaW5lZCI/dGhpcy5zZXRQb3NpdGlvbih0LnJvdyx0LmNvbHVtbik6dGhpcy5zZXRQb3NpdGlvbih0LG4pfTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuKXt2YXIgcj1uP2UuY29sdW1uPD10LmNvbHVtbjplLmNvbHVtbjx0LmNvbHVtbjtyZXR1cm4gZS5yb3c8dC5yb3d8fGUucm93PT10LnJvdyYmcn1mdW5jdGlvbiB0KHQsbixyKXt2YXIgaT10LmFjdGlvbj09Imluc2VydCIscz0oaT8xOi0xKSoodC5lbmQucm93LXQuc3RhcnQucm93KSxvPShpPzE6LTEpKih0LmVuZC5jb2x1bW4tdC5zdGFydC5jb2x1bW4pLHU9dC5zdGFydCxhPWk/dTp0LmVuZDtyZXR1cm4gZShuLHUscik/e3JvdzpuLnJvdyxjb2x1bW46bi5jb2x1bW59OmUoYSxuLCFyKT97cm93Om4ucm93K3MsY29sdW1uOm4uY29sdW1uKyhuLnJvdz09YS5yb3c/bzowKX06e3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW59fXIuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LHRoaXMuY29sdW1uKX0sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY3VtZW50fSx0aGlzLiRpbnNlcnRSaWdodD0hMSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe2lmKGUuc3RhcnQucm93PT1lLmVuZC5yb3cmJmUuc3RhcnQucm93IT10aGlzLnJvdylyZXR1cm47aWYoZS5zdGFydC5yb3c+dGhpcy5yb3cpcmV0dXJuO3ZhciBuPXQoZSx7cm93OnRoaXMucm93LGNvbHVtbjp0aGlzLmNvbHVtbn0sdGhpcy4kaW5zZXJ0UmlnaHQpO3RoaXMuc2V0UG9zaXRpb24obi5yb3csbi5jb2x1bW4sITApfSx0aGlzLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtuP3I9e3JvdzplLGNvbHVtbjp0fTpyPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoZSx0KTtpZih0aGlzLnJvdz09ci5yb3cmJnRoaXMuY29sdW1uPT1yLmNvbHVtbilyZXR1cm47dmFyIGk9e3Jvdzp0aGlzLnJvdyxjb2x1bW46dGhpcy5jb2x1bW59O3RoaXMucm93PXIucm93LHRoaXMuY29sdW1uPXIuY29sdW1uLHRoaXMuX3NpZ25hbCgiY2hhbmdlIix7b2xkOmksdmFsdWU6cn0pfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSl9LHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe3RoaXMuZG9jdW1lbnQ9ZXx8dGhpcy5kb2N1bWVudCx0aGlzLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKX0sdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiBlPj10aGlzLmRvY3VtZW50LmdldExlbmd0aCgpPyhuLnJvdz1NYXRoLm1heCgwLHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCktMSksbi5jb2x1bW49dGhpcy5kb2N1bWVudC5nZXRMaW5lKG4ucm93KS5sZW5ndGgpOmU8MD8obi5yb3c9MCxuLmNvbHVtbj0wKToobi5yb3c9ZSxuLmNvbHVtbj1NYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUobi5yb3cpLmxlbmd0aCxNYXRoLm1heCgwLHQpKSksdDwwJiYobi5jb2x1bW49MCksbn19KS5jYWxsKHMucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9kb2N1bWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2FwcGx5X2RlbHRhIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3JhbmdlIiwiYWNlL2FuY2hvciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2FwcGx5X2RlbHRhIikuYXBwbHlEZWx0YSxzPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1lKCIuL3JhbmdlIikuUmFuZ2UsdT1lKCIuL2FuY2hvciIpLkFuY2hvcixhPWZ1bmN0aW9uKGUpe3RoaXMuJGxpbmVzPVsiIl0sZS5sZW5ndGg9PT0wP3RoaXMuJGxpbmVzPVsiIl06QXJyYXkuaXNBcnJheShlKT90aGlzLmluc2VydE1lcmdlZExpbmVzKHtyb3c6MCxjb2x1bW46MH0sZSk6dGhpcy5pbnNlcnQoe3JvdzowLGNvbHVtbjowfSxlKX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGVuZ3RoKCktMTt0aGlzLnJlbW92ZShuZXcgbygwLDAsdCx0aGlzLmdldExpbmUodCkubGVuZ3RoKSksdGhpcy5pbnNlcnQoe3JvdzowLGNvbHVtbjowfSxlKX0sdGhpcy5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSl9LHRoaXMuY3JlYXRlQW5jaG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB1KHRoaXMsZSx0KX0sImFhYSIuc3BsaXQoL2EvKS5sZW5ndGg9PT0wP3RoaXMuJHNwbGl0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xyXG58XHIvZywiXG4iKS5zcGxpdCgiXG4iKX06dGhpcy4kc3BsaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoL1xyXG58XHJ8XG4vKX0sdGhpcy4kZGV0ZWN0TmV3TGluZT1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pO3RoaXMuJGF1dG9OZXdMaW5lPXQ/dFsxXToiXG4iLHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKX0sdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuJG5ld0xpbmVNb2RlKXtjYXNlIndpbmRvd3MiOnJldHVybiJcclxuIjtjYXNlInVuaXgiOnJldHVybiJcbiI7ZGVmYXVsdDpyZXR1cm4gdGhpcy4kYXV0b05ld0xpbmV8fCJcbiJ9fSx0aGlzLiRhdXRvTmV3TGluZT0iIix0aGlzLiRuZXdMaW5lTW9kZT0iYXV0byIsdGhpcy5zZXROZXdMaW5lTW9kZT1mdW5jdGlvbihlKXtpZih0aGlzLiRuZXdMaW5lTW9kZT09PWUpcmV0dXJuO3RoaXMuJG5ld0xpbmVNb2RlPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VOZXdMaW5lTW9kZSIpfSx0aGlzLmdldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG5ld0xpbmVNb2RlfSx0aGlzLmlzTmV3TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09IlxyXG4ifHxlPT0iXHIifHxlPT0iXG4ifSx0aGlzLmdldExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGxpbmVzW2VdfHwiIn0sdGhpcy5nZXRMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRsaW5lcy5zbGljZShlLHQrMSl9LHRoaXMuZ2V0QWxsTGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMaW5lcygwLHRoaXMuZ2V0TGVuZ3RoKCkpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRsaW5lcy5sZW5ndGh9LHRoaXMuZ2V0VGV4dFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldExpbmVzRm9yUmFuZ2UoZSkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSl9LHRoaXMuZ2V0TGluZXNGb3JSYW5nZT1mdW5jdGlvbihlKXt2YXIgdDtpZihlLnN0YXJ0LnJvdz09PWUuZW5kLnJvdyl0PVt0aGlzLmdldExpbmUoZS5zdGFydC5yb3cpLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbixlLmVuZC5jb2x1bW4pXTtlbHNle3Q9dGhpcy5nZXRMaW5lcyhlLnN0YXJ0LnJvdyxlLmVuZC5yb3cpLHRbMF09KHRbMF18fCIiKS5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4pO3ZhciBuPXQubGVuZ3RoLTE7ZS5lbmQucm93LWUuc3RhcnQucm93PT1uJiYodFtuXT10W25dLnN1YnN0cmluZygwLGUuZW5kLmNvbHVtbikpfXJldHVybiB0fSx0aGlzLmluc2VydExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydExpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgaW5zZXJ0RnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpLHRoaXMuaW5zZXJ0RnVsbExpbmVzKGUsdCl9LHRoaXMucmVtb3ZlTGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQucmVtb3ZlTGluZXMgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSByZW1vdmVGdWxsTGluZXMgbWV0aG9kIGluc3RlYWQuIiksdGhpcy5yZW1vdmVGdWxsTGluZXMoZSx0KX0sdGhpcy5pbnNlcnROZXdMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5pbnNlcnROZXdMaW5lIGlzIGRlcHJlY2F0ZWQuIFVzZSBpbnNlcnRNZXJnZWRMaW5lcyhwb3NpdGlvbiwgWycnLCAnJ10pIGluc3RlYWQuIiksdGhpcy5pbnNlcnRNZXJnZWRMaW5lcyhlLFsiIiwiIl0pfSx0aGlzLmluc2VydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmdldExlbmd0aCgpPD0xJiZ0aGlzLiRkZXRlY3ROZXdMaW5lKHQpLHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoZSx0aGlzLiRzcGxpdCh0KSl9LHRoaXMuaW5zZXJ0SW5MaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jbGlwcGVkUG9zKGUucm93LGUuY29sdW1uKSxyPXRoaXMucG9zKGUucm93LGUuY29sdW1uK3QubGVuZ3RoKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpuLGVuZDpyLGFjdGlvbjoiaW5zZXJ0IixsaW5lczpbdF19LCEwKSx0aGlzLmNsb25lUG9zKHIpfSx0aGlzLmNsaXBwZWRQb3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldExlbmd0aCgpO2U9PT11bmRlZmluZWQ/ZT1uOmU8MD9lPTA6ZT49biYmKGU9bi0xLHQ9dW5kZWZpbmVkKTt2YXIgcj10aGlzLmdldExpbmUoZSk7cmV0dXJuIHQ9PXVuZGVmaW5lZCYmKHQ9ci5sZW5ndGgpLHQ9TWF0aC5taW4oTWF0aC5tYXgodCwwKSxyLmxlbmd0aCkse3JvdzplLGNvbHVtbjp0fX0sdGhpcy5jbG9uZVBvcz1mdW5jdGlvbihlKXtyZXR1cm57cm93OmUucm93LGNvbHVtbjplLmNvbHVtbn19LHRoaXMucG9zPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3JvdzplLGNvbHVtbjp0fX0sdGhpcy4kY2xpcFBvc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGVuZ3RoKCk7cmV0dXJuIGUucm93Pj10PyhlLnJvdz1NYXRoLm1heCgwLHQtMSksZS5jb2x1bW49dGhpcy5nZXRMaW5lKHQtMSkubGVuZ3RoKTooZS5yb3c9TWF0aC5tYXgoMCxlLnJvdyksZS5jb2x1bW49TWF0aC5taW4oTWF0aC5tYXgoZS5jb2x1bW4sMCksdGhpcy5nZXRMaW5lKGUucm93KS5sZW5ndGgpKSxlfSx0aGlzLmluc2VydEZ1bGxMaW5lcz1mdW5jdGlvbihlLHQpe2U9TWF0aC5taW4oTWF0aC5tYXgoZSwwKSx0aGlzLmdldExlbmd0aCgpKTt2YXIgbj0wO2U8dGhpcy5nZXRMZW5ndGgoKT8odD10LmNvbmNhdChbIiJdKSxuPTApOih0PVsiIl0uY29uY2F0KHQpLGUtLSxuPXRoaXMuJGxpbmVzW2VdLmxlbmd0aCksdGhpcy5pbnNlcnRNZXJnZWRMaW5lcyh7cm93OmUsY29sdW1uOm59LHQpfSx0aGlzLmluc2VydE1lcmdlZExpbmVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jbGlwcGVkUG9zKGUucm93LGUuY29sdW1uKSxyPXtyb3c6bi5yb3crdC5sZW5ndGgtMSxjb2x1bW46KHQubGVuZ3RoPT0xP24uY29sdW1uOjApK3RbdC5sZW5ndGgtMV0ubGVuZ3RofTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpuLGVuZDpyLGFjdGlvbjoiaW5zZXJ0IixsaW5lczp0fSksdGhpcy5jbG9uZVBvcyhyKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jbGlwcGVkUG9zKGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKSxuPXRoaXMuY2xpcHBlZFBvcyhlLmVuZC5yb3csZS5lbmQuY29sdW1uKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDp0LGVuZDpuLGFjdGlvbjoicmVtb3ZlIixsaW5lczp0aGlzLmdldExpbmVzRm9yUmFuZ2Uoe3N0YXJ0OnQsZW5kOm59KX0pLHRoaXMuY2xvbmVQb3ModCl9LHRoaXMucmVtb3ZlSW5MaW5lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNsaXBwZWRQb3MoZSx0KSxpPXRoaXMuY2xpcHBlZFBvcyhlLG4pO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnIsZW5kOmksYWN0aW9uOiJyZW1vdmUiLGxpbmVzOnRoaXMuZ2V0TGluZXNGb3JSYW5nZSh7c3RhcnQ6cixlbmQ6aX0pfSwhMCksdGhpcy5jbG9uZVBvcyhyKX0sdGhpcy5yZW1vdmVGdWxsTGluZXM9ZnVuY3Rpb24oZSx0KXtlPU1hdGgubWluKE1hdGgubWF4KDAsZSksdGhpcy5nZXRMZW5ndGgoKS0xKSx0PU1hdGgubWluKE1hdGgubWF4KDAsdCksdGhpcy5nZXRMZW5ndGgoKS0xKTt2YXIgbj10PT10aGlzLmdldExlbmd0aCgpLTEmJmU+MCxyPXQ8dGhpcy5nZXRMZW5ndGgoKS0xLGk9bj9lLTE6ZSxzPW4/dGhpcy5nZXRMaW5lKGkpLmxlbmd0aDowLHU9cj90KzE6dCxhPXI/MDp0aGlzLmdldExpbmUodSkubGVuZ3RoLGY9bmV3IG8oaSxzLHUsYSksbD10aGlzLiRsaW5lcy5zbGljZShlLHQrMSk7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6Zi5zdGFydCxlbmQ6Zi5lbmQsYWN0aW9uOiJyZW1vdmUiLGxpbmVzOnRoaXMuZ2V0TGluZXNGb3JSYW5nZShmKX0pLGx9LHRoaXMucmVtb3ZlTmV3TGluZT1mdW5jdGlvbihlKXtlPHRoaXMuZ2V0TGVuZ3RoKCktMSYmZT49MCYmdGhpcy5hcHBseURlbHRhKHtzdGFydDp0aGlzLnBvcyhlLHRoaXMuZ2V0TGluZShlKS5sZW5ndGgpLGVuZDp0aGlzLnBvcyhlKzEsMCksYWN0aW9uOiJyZW1vdmUiLGxpbmVzOlsiIiwiIl19KX0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIG98fChlPW8uZnJvbVBvaW50cyhlLnN0YXJ0LGUuZW5kKSk7aWYodC5sZW5ndGg9PT0wJiZlLmlzRW1wdHkoKSlyZXR1cm4gZS5zdGFydDtpZih0PT10aGlzLmdldFRleHRSYW5nZShlKSlyZXR1cm4gZS5lbmQ7dGhpcy5yZW1vdmUoZSk7dmFyIG47cmV0dXJuIHQ/bj10aGlzLmluc2VydChlLnN0YXJ0LHQpOm49ZS5zdGFydCxufSx0aGlzLmFwcGx5RGVsdGFzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuYXBwbHlEZWx0YShlW3RdKX0sdGhpcy5yZXZlcnREZWx0YXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy5yZXZlcnREZWx0YShlW3RdKX0sdGhpcy5hcHBseURlbHRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5hY3Rpb249PSJpbnNlcnQiO2lmKG4/ZS5saW5lcy5sZW5ndGg8PTEmJiFlLmxpbmVzWzBdOiFvLmNvbXBhcmVQb2ludHMoZS5zdGFydCxlLmVuZCkpcmV0dXJuO24mJmUubGluZXMubGVuZ3RoPjJlND90aGlzLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YShlLDJlNCk6KGkodGhpcy4kbGluZXMsZSx0KSx0aGlzLl9zaWduYWwoImNoYW5nZSIsZSkpfSx0aGlzLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YT1mdW5jdGlvbihlLHQpe3ZhciBuPWUubGluZXMscj1uLmxlbmd0aC10KzEsaT1lLnN0YXJ0LnJvdyxzPWUuc3RhcnQuY29sdW1uO2Zvcih2YXIgbz0wLHU9MDtvPHI7bz11KXt1Kz10LTE7dmFyIGE9bi5zbGljZShvLHUpO2EucHVzaCgiIiksdGhpcy5hcHBseURlbHRhKHtzdGFydDp0aGlzLnBvcyhpK28scyksZW5kOnRoaXMucG9zKGkrdSxzPTApLGFjdGlvbjplLmFjdGlvbixsaW5lczphfSwhMCl9ZS5saW5lcz1uLnNsaWNlKG8pLGUuc3RhcnQucm93PWkrbyxlLnN0YXJ0LmNvbHVtbj1zLHRoaXMuYXBwbHlEZWx0YShlLCEwKX0sdGhpcy5yZXZlcnREZWx0YT1mdW5jdGlvbihlKXt0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnRoaXMuY2xvbmVQb3MoZS5zdGFydCksZW5kOnRoaXMuY2xvbmVQb3MoZS5lbmQpLGFjdGlvbjplLmFjdGlvbj09Imluc2VydCI/InJlbW92ZSI6Imluc2VydCIsbGluZXM6ZS5saW5lcy5zbGljZSgpfSl9LHRoaXMuaW5kZXhUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kbGluZXN8fHRoaXMuZ2V0QWxsTGluZXMoKSxyPXRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDtmb3IodmFyIGk9dHx8MCxzPW4ubGVuZ3RoO2k8cztpKyspe2UtPW5baV0ubGVuZ3RoK3I7aWYoZTwwKXJldHVybntyb3c6aSxjb2x1bW46ZStuW2ldLmxlbmd0aCtyfX1yZXR1cm57cm93OnMtMSxjb2x1bW46ZStuW3MtMV0ubGVuZ3RoK3J9fSx0aGlzLnBvc2l0aW9uVG9JbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGxpbmVzfHx0aGlzLmdldEFsbExpbmVzKCkscj10aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKS5sZW5ndGgsaT0wLHM9TWF0aC5taW4oZS5yb3csbi5sZW5ndGgpO2Zvcih2YXIgbz10fHwwO288czsrK28paSs9bltvXS5sZW5ndGgrcjtyZXR1cm4gaStlLmNvbHVtbn19KS5jYWxsKGEucHJvdG90eXBlKSx0LkRvY3VtZW50PWF9KSxhY2UuZGVmaW5lKCJhY2UvYmFja2dyb3VuZF90b2tlbml6ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9ZnVuY3Rpb24oZSx0KXt0aGlzLnJ1bm5pbmc9ITEsdGhpcy5saW5lcz1bXSx0aGlzLnN0YXRlcz1bXSx0aGlzLmN1cnJlbnRMaW5lPTAsdGhpcy50b2tlbml6ZXI9ZTt2YXIgbj10aGlzO3RoaXMuJHdvcmtlcj1mdW5jdGlvbigpe2lmKCFuLnJ1bm5pbmcpcmV0dXJuO3ZhciBlPW5ldyBEYXRlLHQ9bi5jdXJyZW50TGluZSxyPS0xLGk9bi5kb2Mscz10O3doaWxlKG4ubGluZXNbdF0pdCsrO3ZhciBvPWkuZ2V0TGVuZ3RoKCksdT0wO24ucnVubmluZz0hMTt3aGlsZSh0PG8pe24uJHRva2VuaXplUm93KHQpLHI9dDtkbyB0Kys7d2hpbGUobi5saW5lc1t0XSk7dSsrO2lmKHUlNT09PTAmJm5ldyBEYXRlLWU+MjApe24ucnVubmluZz1zZXRUaW1lb3V0KG4uJHdvcmtlciwyMCk7YnJlYWt9fW4uY3VycmVudExpbmU9dCxyPT0tMSYmKHI9dCksczw9ciYmbi5maXJlVXBkYXRlRXZlbnQocyxyKX19OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5zZXRUb2tlbml6ZXI9ZnVuY3Rpb24oZSl7dGhpcy50b2tlbml6ZXI9ZSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhdGVzPVtdLHRoaXMuc3RhcnQoMCl9LHRoaXMuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dGhpcy5kb2M9ZSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhdGVzPVtdLHRoaXMuc3RvcCgpfSx0aGlzLmZpcmVVcGRhdGVFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXtmaXJzdDplLGxhc3Q6dH07dGhpcy5fc2lnbmFsKCJ1cGRhdGUiLHtkYXRhOm59KX0sdGhpcy5zdGFydD1mdW5jdGlvbihlKXt0aGlzLmN1cnJlbnRMaW5lPU1hdGgubWluKGV8fDAsdGhpcy5jdXJyZW50TGluZSx0aGlzLmRvYy5nZXRMZW5ndGgoKSksdGhpcy5saW5lcy5zcGxpY2UodGhpcy5jdXJyZW50TGluZSx0aGlzLmxpbmVzLmxlbmd0aCksdGhpcy5zdGF0ZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsdGhpcy5zdGF0ZXMubGVuZ3RoKSx0aGlzLnN0b3AoKSx0aGlzLnJ1bm5pbmc9c2V0VGltZW91dCh0aGlzLiR3b3JrZXIsNzAwKX0sdGhpcy5zY2hlZHVsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5ydW5uaW5nfHwodGhpcy5ydW5uaW5nPXNldFRpbWVvdXQodGhpcy4kd29ya2VyLDcwMCkpfSx0aGlzLiR1cGRhdGVPbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuZW5kLnJvdy10O2lmKG49PT0wKXRoaXMubGluZXNbdF09bnVsbDtlbHNlIGlmKGUuYWN0aW9uPT0icmVtb3ZlIil0aGlzLmxpbmVzLnNwbGljZSh0LG4rMSxudWxsKSx0aGlzLnN0YXRlcy5zcGxpY2UodCxuKzEsbnVsbCk7ZWxzZXt2YXIgcj1BcnJheShuKzEpO3IudW5zaGlmdCh0LDEpLHRoaXMubGluZXMuc3BsaWNlLmFwcGx5KHRoaXMubGluZXMsciksdGhpcy5zdGF0ZXMuc3BsaWNlLmFwcGx5KHRoaXMuc3RhdGVzLHIpfXRoaXMuY3VycmVudExpbmU9TWF0aC5taW4odCx0aGlzLmN1cnJlbnRMaW5lLHRoaXMuZG9jLmdldExlbmd0aCgpKSx0aGlzLnN0b3AoKX0sdGhpcy5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5ydW5uaW5nJiZjbGVhclRpbWVvdXQodGhpcy5ydW5uaW5nKSx0aGlzLnJ1bm5pbmc9ITF9LHRoaXMuZ2V0VG9rZW5zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxpbmVzW2VdfHx0aGlzLiR0b2tlbml6ZVJvdyhlKX0sdGhpcy5nZXRTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jdXJyZW50TGluZT09ZSYmdGhpcy4kdG9rZW5pemVSb3coZSksdGhpcy5zdGF0ZXNbZV18fCJzdGFydCJ9LHRoaXMuJHRva2VuaXplUm93PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZG9jLmdldExpbmUoZSksbj10aGlzLnN0YXRlc1tlLTFdLHI9dGhpcy50b2tlbml6ZXIuZ2V0TGluZVRva2Vucyh0LG4sZSk7cmV0dXJuIHRoaXMuc3RhdGVzW2VdKyIiIT1yLnN0YXRlKyIiPyh0aGlzLnN0YXRlc1tlXT1yLnN0YXRlLHRoaXMubGluZXNbZSsxXT1udWxsLHRoaXMuY3VycmVudExpbmU+ZSsxJiYodGhpcy5jdXJyZW50TGluZT1lKzEpKTp0aGlzLmN1cnJlbnRMaW5lPT1lJiYodGhpcy5jdXJyZW50TGluZT1lKzEpLHRoaXMubGluZXNbZV09ci50b2tlbnN9fSkuY2FsbChzLnByb3RvdHlwZSksdC5CYWNrZ3JvdW5kVG9rZW5pemVyPXN9KSxhY2UuZGVmaW5lKCJhY2Uvc2VhcmNoX2hpZ2hsaWdodCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9sYW5nIiksaT1lKCIuL2xpYi9vb3AiKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNldFJlZ2V4cChlKSx0aGlzLmNsYXp6PXQsdGhpcy50eXBlPW58fCJ0ZXh0In07KGZ1bmN0aW9uKCl7dGhpcy5NQVhfUkFOR0VTPTUwMCx0aGlzLnNldFJlZ2V4cD1mdW5jdGlvbihlKXtpZih0aGlzLnJlZ0V4cCsiIj09ZSsiIilyZXR1cm47dGhpcy5yZWdFeHA9ZSx0aGlzLmNhY2hlPVtdfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlLHQsbixpKXtpZighdGhpcy5yZWdFeHApcmV0dXJuO3ZhciBvPWkuZmlyc3RSb3csdT1pLmxhc3RSb3c7Zm9yKHZhciBhPW87YTw9dTthKyspe3ZhciBmPXRoaXMuY2FjaGVbYV07Zj09bnVsbCYmKGY9ci5nZXRNYXRjaE9mZnNldHMobi5nZXRMaW5lKGEpLHRoaXMucmVnRXhwKSxmLmxlbmd0aD50aGlzLk1BWF9SQU5HRVMmJihmPWYuc2xpY2UoMCx0aGlzLk1BWF9SQU5HRVMpKSxmPWYubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgcyhhLGUub2Zmc2V0LGEsZS5vZmZzZXQrZS5sZW5ndGgpfSksdGhpcy5jYWNoZVthXT1mLmxlbmd0aD9mOiIiKTtmb3IodmFyIGw9Zi5sZW5ndGg7bC0tOyl0LmRyYXdTaW5nbGVMaW5lTWFya2VyKGUsZltsXS50b1NjcmVlblJhbmdlKG4pLHRoaXMuY2xhenosaSl9fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuU2VhcmNoSGlnaGxpZ2h0PW99KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQpe3RoaXMuZm9sZERhdGE9ZSxBcnJheS5pc0FycmF5KHQpP3RoaXMuZm9sZHM9dDp0PXRoaXMuZm9sZHM9W3RdO3ZhciBuPXRbdC5sZW5ndGgtMV07dGhpcy5yYW5nZT1uZXcgcih0WzBdLnN0YXJ0LnJvdyx0WzBdLnN0YXJ0LmNvbHVtbixuLmVuZC5yb3csbi5lbmQuY29sdW1uKSx0aGlzLnN0YXJ0PXRoaXMucmFuZ2Uuc3RhcnQsdGhpcy5lbmQ9dGhpcy5yYW5nZS5lbmQsdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0Rm9sZExpbmUodGhpcyl9LHRoaXMpfXZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2U7KGZ1bmN0aW9uKCl7dGhpcy5zaGlmdFJvdz1mdW5jdGlvbihlKXt0aGlzLnN0YXJ0LnJvdys9ZSx0aGlzLmVuZC5yb3crPWUsdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc3RhcnQucm93Kz1lLHQuZW5kLnJvdys9ZX0pfSx0aGlzLmFkZEZvbGQ9ZnVuY3Rpb24oZSl7aWYoZS5zYW1lUm93KXtpZihlLnN0YXJ0LnJvdzx0aGlzLnN0YXJ0Um93fHxlLmVuZFJvdz50aGlzLmVuZFJvdyl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGFkZCBhIGZvbGQgdG8gdGhpcyBGb2xkTGluZSBhcyBpdCBoYXMgbm8gY29ubmVjdGlvbiIpO3RoaXMuZm9sZHMucHVzaChlKSx0aGlzLmZvbGRzLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4tZS5yYW5nZS5jb21wYXJlRW5kKHQuc3RhcnQucm93LHQuc3RhcnQuY29sdW1uKX0pLHRoaXMucmFuZ2UuY29tcGFyZUVuZChlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbik+MD8odGhpcy5lbmQucm93PWUuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49ZS5lbmQuY29sdW1uKTp0aGlzLnJhbmdlLmNvbXBhcmVTdGFydChlLmVuZC5yb3csZS5lbmQuY29sdW1uKTwwJiYodGhpcy5zdGFydC5yb3c9ZS5zdGFydC5yb3csdGhpcy5zdGFydC5jb2x1bW49ZS5zdGFydC5jb2x1bW4pfWVsc2UgaWYoZS5zdGFydC5yb3c9PXRoaXMuZW5kLnJvdyl0aGlzLmZvbGRzLnB1c2goZSksdGhpcy5lbmQucm93PWUuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49ZS5lbmQuY29sdW1uO2Vsc2V7aWYoZS5lbmQucm93IT10aGlzLnN0YXJ0LnJvdyl0aHJvdyBuZXcgRXJyb3IoIlRyeWluZyB0byBhZGQgZm9sZCB0byBGb2xkUm93IHRoYXQgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgcm93Iik7dGhpcy5mb2xkcy51bnNoaWZ0KGUpLHRoaXMuc3RhcnQucm93PWUuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWUuc3RhcnQuY29sdW1ufWUuZm9sZExpbmU9dGhpc30sdGhpcy5jb250YWluc1Jvdz1mdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5zdGFydC5yb3cmJmU8PXRoaXMuZW5kLnJvd30sdGhpcy53YWxrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wLGk9dGhpcy5mb2xkcyxzLG8sdSxhPSEwO3Q9PW51bGwmJih0PXRoaXMuZW5kLnJvdyxuPXRoaXMuZW5kLmNvbHVtbik7Zm9yKHZhciBmPTA7ZjxpLmxlbmd0aDtmKyspe3M9aVtmXSxvPXMucmFuZ2UuY29tcGFyZVN0YXJ0KHQsbik7aWYobz09LTEpe2UobnVsbCx0LG4scixhKTtyZXR1cm59dT1lKG51bGwscy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4scixhKSx1PSF1JiZlKHMucGxhY2Vob2xkZXIscy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4scik7aWYodXx8bz09PTApcmV0dXJuO2E9IXMuc2FtZVJvdyxyPXMuZW5kLmNvbHVtbn1lKG51bGwsdCxuLHIsYSl9LHRoaXMuZ2V0TmV4dEZvbGRUbz1mdW5jdGlvbihlLHQpe3ZhciBuLHI7Zm9yKHZhciBpPTA7aTx0aGlzLmZvbGRzLmxlbmd0aDtpKyspe249dGhpcy5mb2xkc1tpXSxyPW4ucmFuZ2UuY29tcGFyZUVuZChlLHQpO2lmKHI9PS0xKXJldHVybntmb2xkOm4sa2luZDoiYWZ0ZXIifTtpZihyPT09MClyZXR1cm57Zm9sZDpuLGtpbmQ6Imluc2lkZSJ9fXJldHVybiBudWxsfSx0aGlzLmFkZFJlbW92ZUNoYXJzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldE5leHRGb2xkVG8oZSx0KSxpLHM7aWYocil7aT1yLmZvbGQ7aWYoci5raW5kPT0iaW5zaWRlIiYmaS5zdGFydC5jb2x1bW4hPXQmJmkuc3RhcnQucm93IT1lKXdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2coZSx0LGkpO2Vsc2UgaWYoaS5zdGFydC5yb3c9PWUpe3M9dGhpcy5mb2xkczt2YXIgbz1zLmluZGV4T2YoaSk7bz09PTAmJih0aGlzLnN0YXJ0LmNvbHVtbis9bik7Zm9yKG87bzxzLmxlbmd0aDtvKyspe2k9c1tvXSxpLnN0YXJ0LmNvbHVtbis9bjtpZighaS5zYW1lUm93KXJldHVybjtpLmVuZC5jb2x1bW4rPW59dGhpcy5lbmQuY29sdW1uKz1ufX19LHRoaXMuc3BsaXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldE5leHRGb2xkVG8oZSx0KTtpZighbnx8bi5raW5kPT0iaW5zaWRlIilyZXR1cm4gbnVsbDt2YXIgcj1uLmZvbGQscz10aGlzLmZvbGRzLG89dGhpcy5mb2xkRGF0YSx1PXMuaW5kZXhPZihyKSxhPXNbdS0xXTt0aGlzLmVuZC5yb3c9YS5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1hLmVuZC5jb2x1bW4scz1zLnNwbGljZSh1LHMubGVuZ3RoLXUpO3ZhciBmPW5ldyBpKG8scyk7cmV0dXJuIG8uc3BsaWNlKG8uaW5kZXhPZih0aGlzKSsxLDAsZiksZn0sdGhpcy5tZXJnZT1mdW5jdGlvbihlKXt2YXIgdD1lLmZvbGRzO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRoaXMuYWRkRm9sZCh0W25dKTt2YXIgcj10aGlzLmZvbGREYXRhO3Iuc3BsaWNlKHIuaW5kZXhPZihlKSwxKX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPVt0aGlzLnJhbmdlLnRvU3RyaW5nKCkrIjogWyJdO3JldHVybiB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7ZS5wdXNoKCIgICIrdC50b1N0cmluZygpKX0pLGUucHVzaCgiXSIpLGUuam9pbigiXG4iKX0sdGhpcy5pZHhUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PTA7Zm9yKHZhciBuPTA7bjx0aGlzLmZvbGRzLmxlbmd0aDtuKyspe3ZhciByPXRoaXMuZm9sZHNbbl07ZS09ci5zdGFydC5jb2x1bW4tdDtpZihlPDApcmV0dXJue3JvdzpyLnN0YXJ0LnJvdyxjb2x1bW46ci5zdGFydC5jb2x1bW4rZX07ZS09ci5wbGFjZWhvbGRlci5sZW5ndGg7aWYoZTwwKXJldHVybiByLnN0YXJ0O3Q9ci5lbmQuY29sdW1ufXJldHVybntyb3c6dGhpcy5lbmQucm93LGNvbHVtbjp0aGlzLmVuZC5jb2x1bW4rZX19fSkuY2FsbChpLnByb3RvdHlwZSksdC5Gb2xkTGluZT1pfSksYWNlLmRlZmluZSgiYWNlL3JhbmdlX2xpc3QiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vcmFuZ2UiKS5SYW5nZSxpPXIuY29tcGFyZVBvaW50cyxzPWZ1bmN0aW9uKCl7dGhpcy5yYW5nZXM9W10sdGhpcy4kYmlhcz0xfTsoZnVuY3Rpb24oKXt0aGlzLmNvbXBhcmVQb2ludHM9aSx0aGlzLnBvaW50SW5kZXg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMucmFuZ2VzO2Zvcih2YXIgcz1ufHwwO3M8ci5sZW5ndGg7cysrKXt2YXIgbz1yW3NdLHU9aShlLG8uZW5kKTtpZih1PjApY29udGludWU7dmFyIGE9aShlLG8uc3RhcnQpO3JldHVybiB1PT09MD90JiZhIT09MD8tcy0yOnM6YT4wfHxhPT09MCYmIXQ/czotcy0xfXJldHVybi1zLTF9LHRoaXMuYWRkPWZ1bmN0aW9uKGUpe3ZhciB0PSFlLmlzRW1wdHkoKSxuPXRoaXMucG9pbnRJbmRleChlLnN0YXJ0LHQpO248MCYmKG49LW4tMSk7dmFyIHI9dGhpcy5wb2ludEluZGV4KGUuZW5kLHQsbik7cmV0dXJuIHI8MD9yPS1yLTE6cisrLHRoaXMucmFuZ2VzLnNwbGljZShuLHItbixlKX0sdGhpcy5hZGRMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KXQucHVzaC5hcHBseSh0LHRoaXMuYWRkKGVbbl0pKTtyZXR1cm4gdH0sdGhpcy5zdWJzdHJhY3RQb2ludD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvaW50SW5kZXgoZSk7aWYodD49MClyZXR1cm4gdGhpcy5yYW5nZXMuc3BsaWNlKHQsMSl9LHRoaXMubWVyZ2U9ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMucmFuZ2VzO3Q9dC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoZS5zdGFydCx0LnN0YXJ0KX0pO3ZhciBuPXRbMF0scjtmb3IodmFyIHM9MTtzPHQubGVuZ3RoO3MrKyl7cj1uLG49dFtzXTt2YXIgbz1pKHIuZW5kLG4uc3RhcnQpO2lmKG88MCljb250aW51ZTtpZihvPT0wJiYhci5pc0VtcHR5KCkmJiFuLmlzRW1wdHkoKSljb250aW51ZTtpKHIuZW5kLG4uZW5kKTwwJiYoci5lbmQucm93PW4uZW5kLnJvdyxyLmVuZC5jb2x1bW49bi5lbmQuY29sdW1uKSx0LnNwbGljZShzLDEpLGUucHVzaChuKSxuPXIscy0tfXJldHVybiB0aGlzLnJhbmdlcz10LGV9LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wb2ludEluZGV4KHtyb3c6ZSxjb2x1bW46dH0pPj0wfSx0aGlzLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucG9pbnRJbmRleChlKT49MH0sdGhpcy5yYW5nZUF0UG9pbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb2ludEluZGV4KGUpO2lmKHQ+PTApcmV0dXJuIHRoaXMucmFuZ2VzW3RdfSx0aGlzLmNsaXBSb3dzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yYW5nZXM7aWYoblswXS5zdGFydC5yb3c+dHx8bltuLmxlbmd0aC0xXS5zdGFydC5yb3c8ZSlyZXR1cm5bXTt2YXIgcj10aGlzLnBvaW50SW5kZXgoe3JvdzplLGNvbHVtbjowfSk7cjwwJiYocj0tci0xKTt2YXIgaT10aGlzLnBvaW50SW5kZXgoe3Jvdzp0LGNvbHVtbjowfSxyKTtpPDAmJihpPS1pLTEpO3ZhciBzPVtdO2Zvcih2YXIgbz1yO288aTtvKyspcy5wdXNoKG5bb10pO3JldHVybiBzfSx0aGlzLnJlbW92ZUFsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmdlcy5zcGxpY2UoMCx0aGlzLnJhbmdlcy5sZW5ndGgpfSx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24mJnRoaXMuZGV0YWNoKCksdGhpcy5zZXNzaW9uPWUsdGhpcy5vbkNoYW5nZT10aGlzLiRvbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlIix0aGlzLm9uQ2hhbmdlKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXtpZighdGhpcy5zZXNzaW9uKXJldHVybjt0aGlzLnNlc3Npb24ucmVtb3ZlTGlzdGVuZXIoImNoYW5nZSIsdGhpcy5vbkNoYW5nZSksdGhpcy5zZXNzaW9uPW51bGx9LHRoaXMuJG9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQsbj1lLmVuZCxyPXQucm93LGk9bi5yb3cscz10aGlzLnJhbmdlcztmb3IodmFyIG89MCx1PXMubGVuZ3RoO288dTtvKyspe3ZhciBhPXNbb107aWYoYS5lbmQucm93Pj1yKWJyZWFrfWlmKGUuYWN0aW9uPT0iaW5zZXJ0Iil7dmFyIGY9aS1yLGw9LXQuY29sdW1uK24uY29sdW1uO2Zvcig7bzx1O28rKyl7dmFyIGE9c1tvXTtpZihhLnN0YXJ0LnJvdz5yKWJyZWFrO2Euc3RhcnQucm93PT1yJiZhLnN0YXJ0LmNvbHVtbj49dC5jb2x1bW4mJihhLnN0YXJ0LmNvbHVtbj09dC5jb2x1bW4mJnRoaXMuJGJpYXM8PTB8fChhLnN0YXJ0LmNvbHVtbis9bCxhLnN0YXJ0LnJvdys9ZikpO2lmKGEuZW5kLnJvdz09ciYmYS5lbmQuY29sdW1uPj10LmNvbHVtbil7aWYoYS5lbmQuY29sdW1uPT10LmNvbHVtbiYmdGhpcy4kYmlhczwwKWNvbnRpbnVlO2EuZW5kLmNvbHVtbj09dC5jb2x1bW4mJmw+MCYmbzx1LTEmJmEuZW5kLmNvbHVtbj5hLnN0YXJ0LmNvbHVtbiYmYS5lbmQuY29sdW1uPT1zW28rMV0uc3RhcnQuY29sdW1uJiYoYS5lbmQuY29sdW1uLT1sKSxhLmVuZC5jb2x1bW4rPWwsYS5lbmQucm93Kz1mfX19ZWxzZXt2YXIgZj1yLWksbD10LmNvbHVtbi1uLmNvbHVtbjtmb3IoO288dTtvKyspe3ZhciBhPXNbb107aWYoYS5zdGFydC5yb3c+aSlicmVhaztpZihhLmVuZC5yb3c8aSYmKHI8YS5lbmQucm93fHxyPT1hLmVuZC5yb3cmJnQuY29sdW1uPGEuZW5kLmNvbHVtbikpYS5lbmQucm93PXIsYS5lbmQuY29sdW1uPXQuY29sdW1uO2Vsc2UgaWYoYS5lbmQucm93PT1pKWlmKGEuZW5kLmNvbHVtbjw9bi5jb2x1bW4pe2lmKGZ8fGEuZW5kLmNvbHVtbj50LmNvbHVtbilhLmVuZC5jb2x1bW49dC5jb2x1bW4sYS5lbmQucm93PXQucm93fWVsc2UgYS5lbmQuY29sdW1uKz1sLGEuZW5kLnJvdys9ZjtlbHNlIGEuZW5kLnJvdz5pJiYoYS5lbmQucm93Kz1mKTtpZihhLnN0YXJ0LnJvdzxpJiYocjxhLnN0YXJ0LnJvd3x8cj09YS5zdGFydC5yb3cmJnQuY29sdW1uPGEuc3RhcnQuY29sdW1uKSlhLnN0YXJ0LnJvdz1yLGEuc3RhcnQuY29sdW1uPXQuY29sdW1uO2Vsc2UgaWYoYS5zdGFydC5yb3c9PWkpaWYoYS5zdGFydC5jb2x1bW48PW4uY29sdW1uKXtpZihmfHxhLnN0YXJ0LmNvbHVtbj50LmNvbHVtbilhLnN0YXJ0LmNvbHVtbj10LmNvbHVtbixhLnN0YXJ0LnJvdz10LnJvd31lbHNlIGEuc3RhcnQuY29sdW1uKz1sLGEuc3RhcnQucm93Kz1mO2Vsc2UgYS5zdGFydC5yb3c+aSYmKGEuc3RhcnQucm93Kz1mKX19aWYoZiE9MCYmbzx1KWZvcig7bzx1O28rKyl7dmFyIGE9c1tvXTthLnN0YXJ0LnJvdys9ZixhLmVuZC5yb3crPWZ9fX0pLmNhbGwocy5wcm90b3R5cGUpLHQuUmFuZ2VMaXN0PXN9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2VfbGlzdCIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7ZS5yb3ctPXQucm93LGUucm93PT0wJiYoZS5jb2x1bW4tPXQuY29sdW1uKX1mdW5jdGlvbiB1KGUsdCl7byhlLnN0YXJ0LHQpLG8oZS5lbmQsdCl9ZnVuY3Rpb24gYShlLHQpe2Uucm93PT0wJiYoZS5jb2x1bW4rPXQuY29sdW1uKSxlLnJvdys9dC5yb3d9ZnVuY3Rpb24gZihlLHQpe2EoZS5zdGFydCx0KSxhKGUuZW5kLHQpfXZhciByPWUoIi4uL3JhbmdlX2xpc3QiKS5SYW5nZUxpc3QsaT1lKCIuLi9saWIvb29wIikscz10LkZvbGQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmZvbGRMaW5lPW51bGwsdGhpcy5wbGFjZWhvbGRlcj10LHRoaXMucmFuZ2U9ZSx0aGlzLnN0YXJ0PWUuc3RhcnQsdGhpcy5lbmQ9ZS5lbmQsdGhpcy5zYW1lUm93PWUuc3RhcnQucm93PT1lLmVuZC5yb3csdGhpcy5zdWJGb2xkcz10aGlzLnJhbmdlcz1bXX07aS5pbmhlcml0cyhzLHIpLGZ1bmN0aW9uKCl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiciJyt0aGlzLnBsYWNlaG9sZGVyKyciICcrdGhpcy5yYW5nZS50b1N0cmluZygpfSx0aGlzLnNldEZvbGRMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuZm9sZExpbmU9ZSx0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zZXRGb2xkTGluZShlKX0pfSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yYW5nZS5jbG9uZSgpLHQ9bmV3IHMoZSx0aGlzLnBsYWNlaG9sZGVyKTtyZXR1cm4gdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Quc3ViRm9sZHMucHVzaChlLmNsb25lKCkpfSksdC5jb2xsYXBzZUNoaWxkcmVuPXRoaXMuY29sbGFwc2VDaGlsZHJlbix0fSx0aGlzLmFkZFN1YkZvbGQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5yYW5nZS5pc0VxdWFsKGUpKXJldHVybjt1KGUsdGhpcy5zdGFydCk7dmFyIHQ9ZS5zdGFydC5yb3csbj1lLnN0YXJ0LmNvbHVtbjtmb3IodmFyIHI9MCxpPS0xO3I8dGhpcy5zdWJGb2xkcy5sZW5ndGg7cisrKXtpPXRoaXMuc3ViRm9sZHNbcl0ucmFuZ2UuY29tcGFyZSh0LG4pO2lmKGkhPTEpYnJlYWt9dmFyIHM9dGhpcy5zdWJGb2xkc1tyXSxvPTA7aWYoaT09MCl7aWYocy5yYW5nZS5jb250YWluc1JhbmdlKGUpKXJldHVybiBzLmFkZFN1YkZvbGQoZSk7bz0xfXZhciB0PWUucmFuZ2UuZW5kLnJvdyxuPWUucmFuZ2UuZW5kLmNvbHVtbjtmb3IodmFyIGE9cixpPS0xO2E8dGhpcy5zdWJGb2xkcy5sZW5ndGg7YSsrKXtpPXRoaXMuc3ViRm9sZHNbYV0ucmFuZ2UuY29tcGFyZSh0LG4pO2lmKGkhPTEpYnJlYWt9aT09MCYmYSsrO3ZhciBmPXRoaXMuc3ViRm9sZHMuc3BsaWNlKHIsYS1yLGUpLGw9aT09MD9mLmxlbmd0aC0xOmYubGVuZ3RoO2Zvcih2YXIgYz1vO2M8bDtjKyspZS5hZGRTdWJGb2xkKGZbY10pO3JldHVybiBlLnNldEZvbGRMaW5lKHRoaXMuZm9sZExpbmUpLGV9LHRoaXMucmVzdG9yZVJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBmKGUsdGhpcy5zdGFydCl9fS5jYWxsKHMucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZGluZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KCl7dGhpcy5nZXRGb2xkQXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZ2V0Rm9sZExpbmUoZSk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGk9ci5mb2xkcztmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIG89aVtzXS5yYW5nZTtpZihvLmNvbnRhaW5zKGUsdCkpe2lmKG49PTEmJm8uaXNFbmQoZSx0KSYmIW8uaXNFbXB0eSgpKWNvbnRpbnVlO2lmKG49PS0xJiZvLmlzU3RhcnQoZSx0KSYmIW8uaXNFbXB0eSgpKWNvbnRpbnVlO3JldHVybiBpW3NdfX19LHRoaXMuZ2V0Rm9sZHNJblJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQsbj1lLmVuZCxyPXRoaXMuJGZvbGREYXRhLGk9W107dC5jb2x1bW4rPTEsbi5jb2x1bW4tPTE7Zm9yKHZhciBzPTA7czxyLmxlbmd0aDtzKyspe3ZhciBvPXJbc10ucmFuZ2UuY29tcGFyZVJhbmdlKGUpO2lmKG89PTIpY29udGludWU7aWYobz09LTIpYnJlYWs7dmFyIHU9cltzXS5mb2xkcztmb3IodmFyIGE9MDthPHUubGVuZ3RoO2ErKyl7dmFyIGY9dVthXTtvPWYucmFuZ2UuY29tcGFyZVJhbmdlKGUpO2lmKG89PS0yKWJyZWFrO2lmKG89PTIpY29udGludWU7aWYobz09NDIpYnJlYWs7aS5wdXNoKGYpfX1yZXR1cm4gdC5jb2x1bW4tPTEsbi5jb2x1bW4rPTEsaX0sdGhpcy5nZXRGb2xkc0luUmFuZ2VMaXN0PWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciB0PVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0PXQuY29uY2F0KHRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpKX0sdGhpcyl9ZWxzZSB2YXIgdD10aGlzLmdldEZvbGRzSW5SYW5nZShlKTtyZXR1cm4gdH0sdGhpcy5nZXRBbGxGb2xkcz1mdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcy4kZm9sZERhdGE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPTA7cjx0W25dLmZvbGRzLmxlbmd0aDtyKyspZS5wdXNoKHRbbl0uZm9sZHNbcl0pO3JldHVybiBlfSx0aGlzLmdldEZvbGRTdHJpbmdBdD1mdW5jdGlvbihlLHQsbixyKXtyPXJ8fHRoaXMuZ2V0Rm9sZExpbmUoZSk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGk9e2VuZDp7Y29sdW1uOjB9fSxzLG87Zm9yKHZhciB1PTA7dTxyLmZvbGRzLmxlbmd0aDt1Kyspe289ci5mb2xkc1t1XTt2YXIgYT1vLnJhbmdlLmNvbXBhcmVFbmQoZSx0KTtpZihhPT0tMSl7cz10aGlzLmdldExpbmUoby5zdGFydC5yb3cpLnN1YnN0cmluZyhpLmVuZC5jb2x1bW4sby5zdGFydC5jb2x1bW4pO2JyZWFrfWlmKGE9PT0wKXJldHVybiBudWxsO2k9b31yZXR1cm4gc3x8KHM9dGhpcy5nZXRMaW5lKG8uc3RhcnQucm93KS5zdWJzdHJpbmcoaS5lbmQuY29sdW1uKSksbj09LTE/cy5zdWJzdHJpbmcoMCx0LWkuZW5kLmNvbHVtbik6bj09MT9zLnN1YnN0cmluZyh0LWkuZW5kLmNvbHVtbik6c30sdGhpcy5nZXRGb2xkTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9MDt0JiYocj1uLmluZGV4T2YodCkpLHI9PS0xJiYocj0wKTtmb3IocjtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZihpLnN0YXJ0LnJvdzw9ZSYmaS5lbmQucm93Pj1lKXJldHVybiBpO2lmKGkuZW5kLnJvdz5lKXJldHVybiBudWxsfXJldHVybiBudWxsfSx0aGlzLmdldE5leHRGb2xkTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9MDt0JiYocj1uLmluZGV4T2YodCkpLHI9PS0xJiYocj0wKTtmb3IocjtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZihpLmVuZC5yb3c+PWUpcmV0dXJuIGl9cmV0dXJuIG51bGx9LHRoaXMuZ2V0Rm9sZGVkUm93Q291bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPXQtZSsxO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcz1uW2ldLG89cy5lbmQucm93LHU9cy5zdGFydC5yb3c7aWYobz49dCl7dTx0JiYodT49ZT9yLT10LXU6cj0wKTticmVha31vPj1lJiYodT49ZT9yLT1vLXU6ci09by1lKzEpfXJldHVybiByfSx0aGlzLiRhZGRGb2xkTGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZm9sZERhdGEucHVzaChlKSx0aGlzLiRmb2xkRGF0YS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3RhcnQucm93LXQuc3RhcnQucm93fSksZX0sdGhpcy5hZGRGb2xkPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj0hMSxvO2UgaW5zdGFuY2VvZiBzP289ZToobz1uZXcgcyh0LGUpLG8uY29sbGFwc2VDaGlsZHJlbj10LmNvbGxhcHNlQ2hpbGRyZW4pLHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQoby5yYW5nZSk7dmFyIHU9by5zdGFydC5yb3csYT1vLnN0YXJ0LmNvbHVtbixmPW8uZW5kLnJvdyxsPW8uZW5kLmNvbHVtbixjPXRoaXMuZ2V0Rm9sZEF0KHUsYSwxKSxoPXRoaXMuZ2V0Rm9sZEF0KGYsbCwtMSk7aWYoYyYmaD09YylyZXR1cm4gYy5hZGRTdWJGb2xkKG8pO2MmJiFjLnJhbmdlLmlzU3RhcnQodSxhKSYmdGhpcy5yZW1vdmVGb2xkKGMpLGgmJiFoLnJhbmdlLmlzRW5kKGYsbCkmJnRoaXMucmVtb3ZlRm9sZChoKTt2YXIgcD10aGlzLmdldEZvbGRzSW5SYW5nZShvLnJhbmdlKTtwLmxlbmd0aD4wJiYodGhpcy5yZW1vdmVGb2xkcyhwKSxwLmZvckVhY2goZnVuY3Rpb24oZSl7by5hZGRTdWJGb2xkKGUpfSkpO2Zvcih2YXIgZD0wO2Q8bi5sZW5ndGg7ZCsrKXt2YXIgdj1uW2RdO2lmKGY9PXYuc3RhcnQucm93KXt2LmFkZEZvbGQobykscj0hMDticmVha31pZih1PT12LmVuZC5yb3cpe3YuYWRkRm9sZChvKSxyPSEwO2lmKCFvLnNhbWVSb3cpe3ZhciBtPW5bZCsxXTtpZihtJiZtLnN0YXJ0LnJvdz09Zil7di5tZXJnZShtKTticmVha319YnJlYWt9aWYoZjw9di5zdGFydC5yb3cpYnJlYWt9cmV0dXJuIHJ8fCh2PXRoaXMuJGFkZEZvbGRMaW5lKG5ldyBpKHRoaXMuJGZvbGREYXRhLG8pKSksdGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kdXBkYXRlV3JhcERhdGEodi5zdGFydC5yb3csdi5zdGFydC5yb3cpOnRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlKHYuc3RhcnQucm93LHYuc3RhcnQucm93KSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9zaWduYWwoImNoYW5nZUZvbGQiLHtkYXRhOm8sYWN0aW9uOiJhZGQifSksb30sdGhpcy5hZGRGb2xkcz1mdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5hZGRGb2xkKGUpfSx0aGlzKX0sdGhpcy5yZW1vdmVGb2xkPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9sZExpbmUsbj10LnN0YXJ0LnJvdyxyPXQuZW5kLnJvdyxpPXRoaXMuJGZvbGREYXRhLHM9dC5mb2xkcztpZihzLmxlbmd0aD09MSlpLnNwbGljZShpLmluZGV4T2YodCksMSk7ZWxzZSBpZih0LnJhbmdlLmlzRW5kKGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pKXMucG9wKCksdC5lbmQucm93PXNbcy5sZW5ndGgtMV0uZW5kLnJvdyx0LmVuZC5jb2x1bW49c1tzLmxlbmd0aC0xXS5lbmQuY29sdW1uO2Vsc2UgaWYodC5yYW5nZS5pc1N0YXJ0KGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKSlzLnNoaWZ0KCksdC5zdGFydC5yb3c9c1swXS5zdGFydC5yb3csdC5zdGFydC5jb2x1bW49c1swXS5zdGFydC5jb2x1bW47ZWxzZSBpZihlLnNhbWVSb3cpcy5zcGxpY2Uocy5pbmRleE9mKGUpLDEpO2Vsc2V7dmFyIG89dC5zcGxpdChlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbik7cz1vLmZvbGRzLHMuc2hpZnQoKSxvLnN0YXJ0LnJvdz1zWzBdLnN0YXJ0LnJvdyxvLnN0YXJ0LmNvbHVtbj1zWzBdLnN0YXJ0LmNvbHVtbn10aGlzLiR1cGRhdGluZ3x8KHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHVwZGF0ZVdyYXBEYXRhKG4scik6dGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGUobixyKSksdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGb2xkIix7ZGF0YTplLGFjdGlvbjoicmVtb3ZlIn0pfSx0aGlzLnJlbW92ZUZvbGRzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChlW25dKTt0LmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVGb2xkKGUpfSx0aGlzKSx0aGlzLiRtb2RpZmllZD0hMH0sdGhpcy5leHBhbmRGb2xkPWZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlRm9sZChlKSxlLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7ZS5yZXN0b3JlUmFuZ2UodCksdGhpcy5hZGRGb2xkKHQpfSx0aGlzKSxlLmNvbGxhcHNlQ2hpbGRyZW4+MCYmdGhpcy5mb2xkQWxsKGUuc3RhcnQucm93KzEsZS5lbmQucm93LGUuY29sbGFwc2VDaGlsZHJlbi0xKSxlLnN1YkZvbGRzPVtdfSx0aGlzLmV4cGFuZEZvbGRzPWZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmV4cGFuZEZvbGQoZSl9LHRoaXMpfSx0aGlzLnVuZm9sZD1mdW5jdGlvbihlLHQpe3ZhciBuLGk7ZT09bnVsbD8obj1uZXcgcigwLDAsdGhpcy5nZXRMZW5ndGgoKSwwKSx0PSEwKTp0eXBlb2YgZT09Im51bWJlciI/bj1uZXcgcihlLDAsZSx0aGlzLmdldExpbmUoZSkubGVuZ3RoKToicm93ImluIGU/bj1yLmZyb21Qb2ludHMoZSxlKTpuPWUsaT10aGlzLmdldEZvbGRzSW5SYW5nZUxpc3Qobik7aWYodCl0aGlzLnJlbW92ZUZvbGRzKGkpO2Vsc2V7dmFyIHM9aTt3aGlsZShzLmxlbmd0aCl0aGlzLmV4cGFuZEZvbGRzKHMpLHM9dGhpcy5nZXRGb2xkc0luUmFuZ2VMaXN0KG4pfWlmKGkubGVuZ3RoKXJldHVybiBpfSx0aGlzLmlzUm93Rm9sZGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuISF0aGlzLmdldEZvbGRMaW5lKGUsdCl9LHRoaXMuZ2V0Um93Rm9sZEVuZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0Rm9sZExpbmUoZSx0KTtyZXR1cm4gbj9uLmVuZC5yb3c6ZX0sdGhpcy5nZXRSb3dGb2xkU3RhcnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldEZvbGRMaW5lKGUsdCk7cmV0dXJuIG4/bi5zdGFydC5yb3c6ZX0sdGhpcy5nZXRGb2xkRGlzcGxheUxpbmU9ZnVuY3Rpb24oZSx0LG4scixpKXtyPT1udWxsJiYocj1lLnN0YXJ0LnJvdyksaT09bnVsbCYmKGk9MCksdD09bnVsbCYmKHQ9ZS5lbmQucm93KSxuPT1udWxsJiYobj10aGlzLmdldExpbmUodCkubGVuZ3RoKTt2YXIgcz10aGlzLmRvYyxvPSIiO3JldHVybiBlLndhbGsoZnVuY3Rpb24oZSx0LG4sdSl7aWYodDxyKXJldHVybjtpZih0PT1yKXtpZihuPGkpcmV0dXJuO3U9TWF0aC5tYXgoaSx1KX1lIT1udWxsP28rPWU6bys9cy5nZXRMaW5lKHQpLnN1YnN0cmluZyh1LG4pfSx0LG4pLG99LHRoaXMuZ2V0RGlzcGxheUxpbmU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5nZXRGb2xkTGluZShlKTtpZighaSl7dmFyIHM7cmV0dXJuIHM9dGhpcy5kb2MuZ2V0TGluZShlKSxzLnN1YnN0cmluZyhyfHwwLHR8fHMubGVuZ3RoKX1yZXR1cm4gdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoaSxlLHQsbixyKX0sdGhpcy4kY2xvbmVGb2xkRGF0YT1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlPXRoaXMuJGZvbGREYXRhLm1hcChmdW5jdGlvbih0KXt2YXIgbj10LmZvbGRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9uZSgpfSk7cmV0dXJuIG5ldyBpKGUsbil9KSxlfSx0aGlzLnRvZ2dsZUZvbGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24sbj10LmdldFJhbmdlKCkscixpO2lmKG4uaXNFbXB0eSgpKXt2YXIgcz1uLnN0YXJ0O3I9dGhpcy5nZXRGb2xkQXQocy5yb3cscy5jb2x1bW4pO2lmKHIpe3RoaXMuZXhwYW5kRm9sZChyKTtyZXR1cm59KGk9dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0KHMpKT9uLmNvbXBhcmVQb2ludChpKT09MT9uLmVuZD1pOihuLnN0YXJ0PWksbi5zdGFydC5jb2x1bW4rKyxuLmVuZC5jb2x1bW4tLSk6KGk9dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6cy5yb3csY29sdW1uOnMuY29sdW1uKzF9KSk/KG4uY29tcGFyZVBvaW50KGkpPT0xP24uZW5kPWk6bi5zdGFydD1pLG4uc3RhcnQuY29sdW1uKyspOm49dGhpcy5nZXRDb21tZW50Rm9sZFJhbmdlKHMucm93LHMuY29sdW1uKXx8bn1lbHNle3ZhciBvPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKG4pO2lmKGUmJm8ubGVuZ3RoKXt0aGlzLmV4cGFuZEZvbGRzKG8pO3JldHVybn1vLmxlbmd0aD09MSYmKHI9b1swXSl9cnx8KHI9dGhpcy5nZXRGb2xkQXQobi5zdGFydC5yb3csbi5zdGFydC5jb2x1bW4pKTtpZihyJiZyLnJhbmdlLnRvU3RyaW5nKCk9PW4udG9TdHJpbmcoKSl7dGhpcy5leHBhbmRGb2xkKHIpO3JldHVybn12YXIgdT0iLi4uIjtpZighbi5pc011bHRpTGluZSgpKXt1PXRoaXMuZ2V0VGV4dFJhbmdlKG4pO2lmKHUubGVuZ3RoPDQpcmV0dXJuO3U9dS50cmltKCkuc3Vic3RyaW5nKDAsMikrIi4uIn10aGlzLmFkZEZvbGQodSxuKX0sdGhpcy5nZXRDb21tZW50Rm9sZFJhbmdlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uZXcgbyh0aGlzLGUsdCkscz1pLmdldEN1cnJlbnRUb2tlbigpLHU9cy50eXBlO2lmKHMmJi9eY29tbWVudHxzdHJpbmcvLnRlc3QodSkpe3U9dS5tYXRjaCgvY29tbWVudHxzdHJpbmcvKVswXSx1PT0iY29tbWVudCImJih1Kz0ifGRvYy1zdGFydCIpO3ZhciBhPW5ldyBSZWdFeHAodSksZj1uZXcgcjtpZihuIT0xKXtkbyBzPWkuc3RlcEJhY2t3YXJkKCk7d2hpbGUocyYmYS50ZXN0KHMudHlwZSkpO2kuc3RlcEZvcndhcmQoKX1mLnN0YXJ0LnJvdz1pLmdldEN1cnJlbnRUb2tlblJvdygpLGYuc3RhcnQuY29sdW1uPWkuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrMixpPW5ldyBvKHRoaXMsZSx0KTtpZihuIT0tMSl7dmFyIGw9LTE7ZG97cz1pLnN0ZXBGb3J3YXJkKCk7aWYobD09LTEpe3ZhciBjPXRoaXMuZ2V0U3RhdGUoaS4kcm93KTthLnRlc3QoYyl8fChsPWkuJHJvdyl9ZWxzZSBpZihpLiRyb3c+bClicmVha313aGlsZShzJiZhLnRlc3Qocy50eXBlKSk7cz1pLnN0ZXBCYWNrd2FyZCgpfWVsc2Ugcz1pLmdldEN1cnJlbnRUb2tlbigpO3JldHVybiBmLmVuZC5yb3c9aS5nZXRDdXJyZW50VG9rZW5Sb3coKSxmLmVuZC5jb2x1bW49aS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStzLnZhbHVlLmxlbmd0aC0yLGZ9fSx0aGlzLmZvbGRBbGw9ZnVuY3Rpb24oZSx0LG4pe249PXVuZGVmaW5lZCYmKG49MWU1KTt2YXIgcj10aGlzLmZvbGRXaWRnZXRzO2lmKCFyKXJldHVybjt0PXR8fHRoaXMuZ2V0TGVuZ3RoKCksZT1lfHwwO2Zvcih2YXIgaT1lO2k8dDtpKyspe3JbaV09PW51bGwmJihyW2ldPXRoaXMuZ2V0Rm9sZFdpZGdldChpKSk7aWYocltpXSE9InN0YXJ0Iiljb250aW51ZTt2YXIgcz10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShpKTtpZihzJiZzLmlzTXVsdGlMaW5lKCkmJnMuZW5kLnJvdzw9dCYmcy5zdGFydC5yb3c+PWUpe2k9cy5lbmQucm93O3RyeXt2YXIgbz10aGlzLmFkZEZvbGQoIi4uLiIscyk7byYmKG8uY29sbGFwc2VDaGlsZHJlbj1uKX1jYXRjaCh1KXt9fX19LHRoaXMuJGZvbGRTdHlsZXM9e21hbnVhbDoxLG1hcmtiZWdpbjoxLG1hcmtiZWdpbmVuZDoxfSx0aGlzLiRmb2xkU3R5bGU9Im1hcmtiZWdpbiIsdGhpcy5zZXRGb2xkU3R5bGU9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGZvbGRTdHlsZXNbZV0pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvbGQgc3R5bGU6ICIrZSsiWyIrT2JqZWN0LmtleXModGhpcy4kZm9sZFN0eWxlcykuam9pbigiLCAiKSsiXSIpO2lmKHRoaXMuJGZvbGRTdHlsZT09ZSlyZXR1cm47dGhpcy4kZm9sZFN0eWxlPWUsZT09Im1hbnVhbCImJnRoaXMudW5mb2xkKCk7dmFyIHQ9dGhpcy4kZm9sZE1vZGU7dGhpcy4kc2V0Rm9sZGluZyhudWxsKSx0aGlzLiRzZXRGb2xkaW5nKHQpfSx0aGlzLiRzZXRGb2xkaW5nPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGZvbGRNb2RlPT1lKXJldHVybjt0aGlzLiRmb2xkTW9kZT1lLHRoaXMub2ZmKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLm9mZigidG9rZW5pemVyVXBkYXRlIix0aGlzLiR0b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5fc2lnbmFsKCJjaGFuZ2VBbm5vdGF0aW9uIik7aWYoIWV8fHRoaXMuJGZvbGRTdHlsZT09Im1hbnVhbCIpe3RoaXMuZm9sZFdpZGdldHM9bnVsbDtyZXR1cm59dGhpcy5mb2xkV2lkZ2V0cz1bXSx0aGlzLmdldEZvbGRXaWRnZXQ9ZS5nZXRGb2xkV2lkZ2V0LmJpbmQoZSx0aGlzLHRoaXMuJGZvbGRTdHlsZSksdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZS5nZXRGb2xkV2lkZ2V0UmFuZ2UuYmluZChlLHRoaXMsdGhpcy4kZm9sZFN0eWxlKSx0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cz10aGlzLnVwZGF0ZUZvbGRXaWRnZXRzLmJpbmQodGhpcyksdGhpcy4kdG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHM9dGhpcy50b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMub24oImNoYW5nZSIsdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpLHRoaXMub24oInRva2VuaXplclVwZGF0ZSIsdGhpcy4kdG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHMpfSx0aGlzLmdldFBhcmVudEZvbGRSYW5nZURhdGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmZvbGRXaWRnZXRzO2lmKCFufHx0JiZuW2VdKXJldHVybnt9O3ZhciByPWUtMSxpO3doaWxlKHI+PTApe3ZhciBzPW5bcl07cz09bnVsbCYmKHM9bltyXT10aGlzLmdldEZvbGRXaWRnZXQocikpO2lmKHM9PSJzdGFydCIpe3ZhciBvPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKHIpO2l8fChpPW8pO2lmKG8mJm8uZW5kLnJvdz49ZSlicmVha31yLS19cmV0dXJue3JhbmdlOnIhPT0tMSYmbyxmaXJzdFJhbmdlOml9fSx0aGlzLm9uRm9sZFdpZGdldENsaWNrPWZ1bmN0aW9uKGUsdCl7dD10LmRvbUV2ZW50O3ZhciBuPXtjaGlsZHJlbjp0LnNoaWZ0S2V5LGFsbDp0LmN0cmxLZXl8fHQubWV0YUtleSxzaWJsaW5nczp0LmFsdEtleX0scj10aGlzLiR0b2dnbGVGb2xkV2lkZ2V0KGUsbik7aWYoIXIpe3ZhciBpPXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQ7aSYmL2FjZV9mb2xkLXdpZGdldC8udGVzdChpLmNsYXNzTmFtZSkmJihpLmNsYXNzTmFtZSs9IiBhY2VfaW52YWxpZCIpfX0sdGhpcy4kdG9nZ2xlRm9sZFdpZGdldD1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmdldEZvbGRXaWRnZXQpcmV0dXJuO3ZhciBuPXRoaXMuZ2V0Rm9sZFdpZGdldChlKSxyPXRoaXMuZ2V0TGluZShlKSxpPW49PT0iZW5kIj8tMToxLHM9dGhpcy5nZXRGb2xkQXQoZSxpPT09LTE/MDpyLmxlbmd0aCxpKTtpZihzKXJldHVybiB0LmNoaWxkcmVufHx0LmFsbD90aGlzLnJlbW92ZUZvbGQocyk6dGhpcy5leHBhbmRGb2xkKHMpLHM7dmFyIG89dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoZSwhMCk7aWYobyYmIW8uaXNNdWx0aUxpbmUoKSl7cz10aGlzLmdldEZvbGRBdChvLnN0YXJ0LnJvdyxvLnN0YXJ0LmNvbHVtbiwxKTtpZihzJiZvLmlzRXF1YWwocy5yYW5nZSkpcmV0dXJuIHRoaXMucmVtb3ZlRm9sZChzKSxzfWlmKHQuc2libGluZ3Mpe3ZhciB1PXRoaXMuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YShlKTtpZih1LnJhbmdlKXZhciBhPXUucmFuZ2Uuc3RhcnQucm93KzEsZj11LnJhbmdlLmVuZC5yb3c7dGhpcy5mb2xkQWxsKGEsZix0LmFsbD8xZTQ6MCl9ZWxzZSB0LmNoaWxkcmVuPyhmPW8/by5lbmQucm93OnRoaXMuZ2V0TGVuZ3RoKCksdGhpcy5mb2xkQWxsKGUrMSxmLHQuYWxsPzFlNDowKSk6byYmKHQuYWxsJiYoby5jb2xsYXBzZUNoaWxkcmVuPTFlNCksdGhpcy5hZGRGb2xkKCIuLi4iLG8pKTtyZXR1cm4gb30sdGhpcy50b2dnbGVGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLnJvdzt0PXRoaXMuZ2V0Um93Rm9sZFN0YXJ0KHQpO3ZhciBuPXRoaXMuJHRvZ2dsZUZvbGRXaWRnZXQodCx7fSk7aWYobilyZXR1cm47dmFyIHI9dGhpcy5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhKHQsITApO249ci5yYW5nZXx8ci5maXJzdFJhbmdlO2lmKG4pe3Q9bi5zdGFydC5yb3c7dmFyIGk9dGhpcy5nZXRGb2xkQXQodCx0aGlzLmdldExpbmUodCkubGVuZ3RoLDEpO2k/dGhpcy5yZW1vdmVGb2xkKGkpOnRoaXMuYWRkRm9sZCgiLi4uIixuKX19LHRoaXMudXBkYXRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydC5yb3csbj1lLmVuZC5yb3ctdDtpZihuPT09MCl0aGlzLmZvbGRXaWRnZXRzW3RdPW51bGw7ZWxzZSBpZihlLmFjdGlvbj09InJlbW92ZSIpdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UodCxuKzEsbnVsbCk7ZWxzZXt2YXIgcj1BcnJheShuKzEpO3IudW5zaGlmdCh0LDEpLHRoaXMuZm9sZFdpZGdldHMuc3BsaWNlLmFwcGx5KHRoaXMuZm9sZFdpZGdldHMscil9fSx0aGlzLnRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0LmZpcnN0IT10Lmxhc3QmJnRoaXMuZm9sZFdpZGdldHMubGVuZ3RoPnQuZmlyc3QmJnRoaXMuZm9sZFdpZGdldHMuc3BsaWNlKHQuZmlyc3QsdGhpcy5mb2xkV2lkZ2V0cy5sZW5ndGgpfX12YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZSgiLi9mb2xkX2xpbmUiKS5Gb2xkTGluZSxzPWUoIi4vZm9sZCIpLkZvbGQsbz1lKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7dC5Gb2xkaW5nPXV9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHMoKXt0aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQ9ZnVuY3Rpb24oZSx0KXtpZihlLmNvbHVtbj09MClyZXR1cm4gbnVsbDt2YXIgbj10fHx0aGlzLmdldExpbmUoZS5yb3cpLmNoYXJBdChlLmNvbHVtbi0xKTtpZihuPT0iIilyZXR1cm4gbnVsbDt2YXIgcj1uLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTtyZXR1cm4gcj9yWzFdP3RoaXMuJGZpbmRDbG9zaW5nQnJhY2tldChyWzFdLGUpOnRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldChyWzJdLGUpOm51bGx9LHRoaXMuZ2V0QnJhY2tldFJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGluZShlLnJvdyksbj0hMCxyLHM9dC5jaGFyQXQoZS5jb2x1bW4tMSksbz1zJiZzLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTtvfHwocz10LmNoYXJBdChlLmNvbHVtbiksZT17cm93OmUucm93LGNvbHVtbjplLmNvbHVtbisxfSxvPXMmJnMubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pLG49ITEpO2lmKCFvKXJldHVybiBudWxsO2lmKG9bMV0pe3ZhciB1PXRoaXMuJGZpbmRDbG9zaW5nQnJhY2tldChvWzFdLGUpO2lmKCF1KXJldHVybiBudWxsO3I9aS5mcm9tUG9pbnRzKGUsdSksbnx8KHIuZW5kLmNvbHVtbisrLHIuc3RhcnQuY29sdW1uLS0pLHIuY3Vyc29yPXIuZW5kfWVsc2V7dmFyIHU9dGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KG9bMl0sZSk7aWYoIXUpcmV0dXJuIG51bGw7cj1pLmZyb21Qb2ludHModSxlKSxufHwoci5zdGFydC5jb2x1bW4rKyxyLmVuZC5jb2x1bW4tLSksci5jdXJzb3I9ci5zdGFydH1yZXR1cm4gcn0sdGhpcy4kYnJhY2tldHM9eyIpIjoiKCIsIigiOiIpIiwiXSI6IlsiLCJbIjoiXSIsInsiOiJ9IiwifSI6InsiLCI8IjoiPiIsIj4iOiI8In0sdGhpcy4kZmluZE9wZW5pbmdCcmFja2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLiRicmFja2V0c1tlXSxzPTEsbz1uZXcgcih0aGlzLHQucm93LHQuY29sdW1uKSx1PW8uZ2V0Q3VycmVudFRva2VuKCk7dXx8KHU9by5zdGVwRm9yd2FyZCgpKTtpZighdSlyZXR1cm47bnx8KG49bmV3IFJlZ0V4cCgiKFxcLj8iK3UudHlwZS5yZXBsYWNlKCIuIiwiXFwuIikucmVwbGFjZSgicnBhcmVuIiwiLnBhcmVuIikucmVwbGFjZSgvXGIoPzplbmQpXGIvLCIoPzpzdGFydHxiZWdpbnxlbmQpIikrIikrIikpO3ZhciBhPXQuY29sdW1uLW8uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMixmPXUudmFsdWU7Zm9yKDs7KXt3aGlsZShhPj0wKXt2YXIgbD1mLmNoYXJBdChhKTtpZihsPT1pKXtzLT0xO2lmKHM9PTApcmV0dXJue3JvdzpvLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphK28uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2UgbD09ZSYmKHMrPTEpO2EtPTF9ZG8gdT1vLnN0ZXBCYWNrd2FyZCgpO3doaWxlKHUmJiFuLnRlc3QodS50eXBlKSk7aWYodT09bnVsbClicmVhaztmPXUudmFsdWUsYT1mLmxlbmd0aC0xfXJldHVybiBudWxsfSx0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMuJGJyYWNrZXRzW2VdLHM9MSxvPW5ldyByKHRoaXMsdC5yb3csdC5jb2x1bW4pLHU9by5nZXRDdXJyZW50VG9rZW4oKTt1fHwodT1vLnN0ZXBGb3J3YXJkKCkpO2lmKCF1KXJldHVybjtufHwobj1uZXcgUmVnRXhwKCIoXFwuPyIrdS50eXBlLnJlcGxhY2UoIi4iLCJcXC4iKS5yZXBsYWNlKCJscGFyZW4iLCIucGFyZW4iKS5yZXBsYWNlKC9cYig/OnN0YXJ0fGJlZ2luKVxiLywiKD86c3RhcnR8YmVnaW58ZW5kKSIpKyIpKyIpKTt2YXIgYT10LmNvbHVtbi1vLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpO2Zvcig7Oyl7dmFyIGY9dS52YWx1ZSxsPWYubGVuZ3RoO3doaWxlKGE8bCl7dmFyIGM9Zi5jaGFyQXQoYSk7aWYoYz09aSl7cy09MTtpZihzPT0wKXJldHVybntyb3c6by5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YStvLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX1lbHNlIGM9PWUmJihzKz0xKTthKz0xfWRvIHU9by5zdGVwRm9yd2FyZCgpO3doaWxlKHUmJiFuLnRlc3QodS50eXBlKSk7aWYodT09bnVsbClicmVhazthPTB9cmV0dXJuIG51bGx9fXZhciByPWUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixpPWUoIi4uL3JhbmdlIikuUmFuZ2U7dC5CcmFja2V0TWF0Y2g9c30pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9iaWRpaGFuZGxlciIsImFjZS9jb25maWciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2Uvc2VsZWN0aW9uIiwiYWNlL21vZGUvdGV4dCIsImFjZS9yYW5nZSIsImFjZS9kb2N1bWVudCIsImFjZS9iYWNrZ3JvdW5kX3Rva2VuaXplciIsImFjZS9zZWFyY2hfaGlnaGxpZ2h0IiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2xhbmciKSxzPWUoIi4vYmlkaWhhbmRsZXIiKS5CaWRpSGFuZGxlcixvPWUoIi4vY29uZmlnIiksdT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGE9ZSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb24sZj1lKCIuL21vZGUvdGV4dCIpLk1vZGUsbD1lKCIuL3JhbmdlIikuUmFuZ2UsYz1lKCIuL2RvY3VtZW50IikuRG9jdW1lbnQsaD1lKCIuL2JhY2tncm91bmRfdG9rZW5pemVyIikuQmFja2dyb3VuZFRva2VuaXplcixwPWUoIi4vc2VhcmNoX2hpZ2hsaWdodCIpLlNlYXJjaEhpZ2hsaWdodCxkPWZ1bmN0aW9uKGUsdCl7dGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy4kZGVjb3JhdGlvbnM9W10sdGhpcy4kZnJvbnRNYXJrZXJzPXt9LHRoaXMuJGJhY2tNYXJrZXJzPXt9LHRoaXMuJG1hcmtlcklkPTEsdGhpcy4kdW5kb1NlbGVjdD0hMCx0aGlzLiRmb2xkRGF0YT1bXSx0aGlzLmlkPSJzZXNzaW9uIisgKytkLiR1aWQsdGhpcy4kZm9sZERhdGEudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qb2luKCJcbiIpfSx0aGlzLm9uKCJjaGFuZ2VGb2xkIix0aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpKSx0aGlzLiRvbkNoYW5nZT10aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7aWYodHlwZW9mIGUhPSJvYmplY3QifHwhZS5nZXRMaW5lKWU9bmV3IGMoZSk7dGhpcy5zZXREb2N1bWVudChlKSx0aGlzLnNlbGVjdGlvbj1uZXcgYSh0aGlzKSx0aGlzLiRiaWRpSGFuZGxlcj1uZXcgcyh0aGlzKSxvLnJlc2V0T3B0aW9ucyh0aGlzKSx0aGlzLnNldE1vZGUodCksby5fc2lnbmFsKCJzZXNzaW9uIix0aGlzKX07ZC4kdWlkPTAsZnVuY3Rpb24oKXtmdW5jdGlvbiBtKGUpe3JldHVybiBlPDQzNTI/ITE6ZT49NDM1MiYmZTw9NDQ0N3x8ZT49NDUxNSYmZTw9NDUxOXx8ZT49NDYwMiYmZTw9NDYwN3x8ZT49OTAwMSYmZTw9OTAwMnx8ZT49MTE5MDQmJmU8PTExOTI5fHxlPj0xMTkzMSYmZTw9MTIwMTl8fGU+PTEyMDMyJiZlPD0xMjI0NXx8ZT49MTIyNzImJmU8PTEyMjgzfHxlPj0xMjI4OCYmZTw9MTIzNTB8fGU+PTEyMzUzJiZlPD0xMjQzOHx8ZT49MTI0NDEmJmU8PTEyNTQzfHxlPj0xMjU0OSYmZTw9MTI1ODl8fGU+PTEyNTkzJiZlPD0xMjY4Nnx8ZT49MTI2ODgmJmU8PTEyNzMwfHxlPj0xMjczNiYmZTw9MTI3NzF8fGU+PTEyNzg0JiZlPD0xMjgzMHx8ZT49MTI4MzImJmU8PTEyODcxfHxlPj0xMjg4MCYmZTw9MTMwNTR8fGU+PTEzMDU2JiZlPD0xOTkwM3x8ZT49MTk5NjgmJmU8PTQyMTI0fHxlPj00MjEyOCYmZTw9NDIxODJ8fGU+PTQzMzYwJiZlPD00MzM4OHx8ZT49NDQwMzImJmU8PTU1MjAzfHxlPj01NTIxNiYmZTw9NTUyMzh8fGU+PTU1MjQzJiZlPD01NTI5MXx8ZT49NjM3NDQmJmU8PTY0MjU1fHxlPj02NTA0MCYmZTw9NjUwNDl8fGU+PTY1MDcyJiZlPD02NTEwNnx8ZT49NjUxMDgmJmU8PTY1MTI2fHxlPj02NTEyOCYmZTw9NjUxMzF8fGU+PTY1MjgxJiZlPD02NTM3Nnx8ZT49NjU1MDQmJmU8PTY1NTEwfXIuaW1wbGVtZW50KHRoaXMsdSksdGhpcy5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt0aGlzLmRvYyYmdGhpcy5kb2MucmVtb3ZlTGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpLHRoaXMuZG9jPWUsZS5vbigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSksdGhpcy5iZ1Rva2VuaXplciYmdGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpLHRoaXMucmVzZXRDYWNoZXMoKX0sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY30sdGhpcy4kcmVzZXRSb3dDYWNoZT1mdW5jdGlvbihlKXtpZighZSl7dGhpcy4kZG9jUm93Q2FjaGU9W10sdGhpcy4kc2NyZWVuUm93Q2FjaGU9W107cmV0dXJufXZhciB0PXRoaXMuJGRvY1Jvd0NhY2hlLmxlbmd0aCxuPXRoaXMuJGdldFJvd0NhY2hlSW5kZXgodGhpcy4kZG9jUm93Q2FjaGUsZSkrMTt0Pm4mJih0aGlzLiRkb2NSb3dDYWNoZS5zcGxpY2Uobix0KSx0aGlzLiRzY3JlZW5Sb3dDYWNoZS5zcGxpY2Uobix0KSl9LHRoaXMuJGdldFJvd0NhY2hlSW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9ZS5sZW5ndGgtMTt3aGlsZShuPD1yKXt2YXIgaT1uK3I+PjEscz1lW2ldO2lmKHQ+cyluPWkrMTtlbHNle2lmKCEodDxzKSlyZXR1cm4gaTtyPWktMX19cmV0dXJuIG4tMX0sdGhpcy5yZXNldENhY2hlcz1mdW5jdGlvbigpe3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHdyYXBEYXRhPVtdLHRoaXMuJHJvd0xlbmd0aENhY2hlPVtdLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5iZ1Rva2VuaXplciYmdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKX0sdGhpcy5vbkNoYW5nZUZvbGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3RoaXMuJHJlc2V0Um93Q2FjaGUodC5zdGFydC5yb3cpfSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJGJpZGlIYW5kbGVyLm9uQ2hhbmdlKGUpLHRoaXMuJHJlc2V0Um93Q2FjaGUoZS5zdGFydC5yb3cpO3ZhciB0PXRoaXMuJHVwZGF0ZUludGVybmFsRGF0YU9uQ2hhbmdlKGUpOyF0aGlzLiRmcm9tVW5kbyYmdGhpcy4kdW5kb01hbmFnZXImJih0JiZ0Lmxlbmd0aCYmKHRoaXMuJHVuZG9NYW5hZ2VyLmFkZCh7YWN0aW9uOiJyZW1vdmVGb2xkcyIsZm9sZHM6dH0sdGhpcy5tZXJnZVVuZG9EZWx0YXMpLHRoaXMubWVyZ2VVbmRvRGVsdGFzPSEwKSx0aGlzLiR1bmRvTWFuYWdlci5hZGQoZSx0aGlzLm1lcmdlVW5kb0RlbHRhcyksdGhpcy5tZXJnZVVuZG9EZWx0YXM9ITAsdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuc2NoZWR1bGUoKSksdGhpcy5iZ1Rva2VuaXplciYmdGhpcy5iZ1Rva2VuaXplci4kdXBkYXRlT25DaGFuZ2UoZSksdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLGUpfSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGUpe3RoaXMuZG9jLnNldFZhbHVlKGUpLHRoaXMuc2VsZWN0aW9uLm1vdmVUbygwLDApLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5zZXRVbmRvTWFuYWdlcih0aGlzLiR1bmRvTWFuYWdlciksdGhpcy5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCl9LHRoaXMuZ2V0VmFsdWU9dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXRWYWx1ZSgpfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbn0sdGhpcy5nZXRTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRTdGF0ZShlKX0sdGhpcy5nZXRUb2tlbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGUpfSx0aGlzLmdldFRva2VuQXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhlKSxyLGk9MDtpZih0PT1udWxsKXt2YXIgcz1uLmxlbmd0aC0xO2k9dGhpcy5nZXRMaW5lKGUpLmxlbmd0aH1lbHNlIGZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXtpKz1uW3NdLnZhbHVlLmxlbmd0aDtpZihpPj10KWJyZWFrfXJldHVybiByPW5bc10scj8oci5pbmRleD1zLHIuc3RhcnQ9aS1yLnZhbHVlLmxlbmd0aCxyKTpudWxsfSx0aGlzLnNldFVuZG9NYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuJHVuZG9NYW5hZ2VyPWUsdGhpcy4kaW5mb3JtVW5kb01hbmFnZXImJnRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpO2lmKGUpe3ZhciB0PXRoaXM7ZS5hZGRTZXNzaW9uKHRoaXMpLHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcj1mdW5jdGlvbigpe3QuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpLHQubWVyZ2VVbmRvRGVsdGFzPSExfSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlcj1pLmRlbGF5ZWRDYWxsKHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcil9ZWxzZSB0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXI9ZnVuY3Rpb24oKXt9fSx0aGlzLm1hcmtVbmRvR3JvdXA9ZnVuY3Rpb24oKXt0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXImJnRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcigpfSx0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXI9e3VuZG86ZnVuY3Rpb24oKXt9LHJlZG86ZnVuY3Rpb24oKXt9LGhhc1VuZG86ZnVuY3Rpb24oKXt9LGhhc1JlZG86ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fSxhZGQ6ZnVuY3Rpb24oKXt9LGFkZFNlbGVjdGlvbjpmdW5jdGlvbigpe30sc3RhcnROZXdHcm91cDpmdW5jdGlvbigpe30sYWRkU2Vzc2lvbjpmdW5jdGlvbigpe319LHRoaXMuZ2V0VW5kb01hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdW5kb01hbmFnZXJ8fHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcn0sdGhpcy5nZXRUYWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVc2VTb2Z0VGFicygpP2kuc3RyaW5nUmVwZWF0KCIgIix0aGlzLmdldFRhYlNpemUoKSk6IgkifSx0aGlzLnNldFVzZVNvZnRUYWJzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ1c2VTb2Z0VGFicyIsZSl9LHRoaXMuZ2V0VXNlU29mdFRhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMmJiF0aGlzLiRtb2RlLiRpbmRlbnRXaXRoVGFic30sdGhpcy5zZXRUYWJTaXplPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ0YWJTaXplIixlKX0sdGhpcy5nZXRUYWJTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRhYlNpemV9LHRoaXMuaXNUYWJTdG9wPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR1c2VTb2Z0VGFicyYmZS5jb2x1bW4ldGhpcy4kdGFiU2l6ZT09PTB9LHRoaXMuc2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigibmF2aWdhdGVXaXRoaW5Tb2Z0VGFicyIsZSl9LHRoaXMuZ2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzfSx0aGlzLiRvdmVyd3JpdGU9ITEsdGhpcy5zZXRPdmVyd3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oIm92ZXJ3cml0ZSIsZSl9LHRoaXMuZ2V0T3ZlcndyaXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG92ZXJ3cml0ZX0sdGhpcy50b2dnbGVPdmVyd3JpdGU9ZnVuY3Rpb24oKXt0aGlzLnNldE92ZXJ3cml0ZSghdGhpcy4kb3ZlcndyaXRlKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZGVjb3JhdGlvbnNbZV18fCh0aGlzLiRkZWNvcmF0aW9uc1tlXT0iIiksdGhpcy4kZGVjb3JhdGlvbnNbZV0rPSIgIit0LHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRkZWNvcmF0aW9uc1tlXT0odGhpcy4kZGVjb3JhdGlvbnNbZV18fCIiKS5yZXBsYWNlKCIgIit0LCIiKSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5nZXRCcmVha3BvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRicmVha3BvaW50c30sdGhpcy5zZXRCcmVha3BvaW50cz1mdW5jdGlvbihlKXt0aGlzLiRicmVha3BvaW50cz1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLiRicmVha3BvaW50c1tlW3RdXT0iYWNlX2JyZWFrcG9pbnQiO3RoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmNsZWFyQnJlYWtwb2ludHM9ZnVuY3Rpb24oKXt0aGlzLiRicmVha3BvaW50cz1bXSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5zZXRCcmVha3BvaW50PWZ1bmN0aW9uKGUsdCl7dD09PXVuZGVmaW5lZCYmKHQ9ImFjZV9icmVha3BvaW50IiksdD90aGlzLiRicmVha3BvaW50c1tlXT10OmRlbGV0ZSB0aGlzLiRicmVha3BvaW50c1tlXSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5jbGVhckJyZWFrcG9pbnQ9ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuJGJyZWFrcG9pbnRzW2VdLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmFkZE1hcmtlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRtYXJrZXJJZCsrLHM9e3JhbmdlOmUsdHlwZTpufHwibGluZSIscmVuZGVyZXI6dHlwZW9mIG49PSJmdW5jdGlvbiI/bjpudWxsLGNsYXp6OnQsaW5Gcm9udDohIXIsaWQ6aX07cmV0dXJuIHI/KHRoaXMuJGZyb250TWFya2Vyc1tpXT1zLHRoaXMuX3NpZ25hbCgiY2hhbmdlRnJvbnRNYXJrZXIiKSk6KHRoaXMuJGJhY2tNYXJrZXJzW2ldPXMsdGhpcy5fc2lnbmFsKCJjaGFuZ2VCYWNrTWFya2VyIikpLGl9LHRoaXMuYWRkRHluYW1pY01hcmtlcj1mdW5jdGlvbihlLHQpe2lmKCFlLnVwZGF0ZSlyZXR1cm47dmFyIG49dGhpcy4kbWFya2VySWQrKztyZXR1cm4gZS5pZD1uLGUuaW5Gcm9udD0hIXQsdD8odGhpcy4kZnJvbnRNYXJrZXJzW25dPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGcm9udE1hcmtlciIpKToodGhpcy4kYmFja01hcmtlcnNbbl09ZSx0aGlzLl9zaWduYWwoImNoYW5nZUJhY2tNYXJrZXIiKSksZX0sdGhpcy5yZW1vdmVNYXJrZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kZnJvbnRNYXJrZXJzW2VdfHx0aGlzLiRiYWNrTWFya2Vyc1tlXTtpZighdClyZXR1cm47dmFyIG49dC5pbkZyb250P3RoaXMuJGZyb250TWFya2Vyczp0aGlzLiRiYWNrTWFya2VycztkZWxldGUgbltlXSx0aGlzLl9zaWduYWwodC5pbkZyb250PyJjaGFuZ2VGcm9udE1hcmtlciI6ImNoYW5nZUJhY2tNYXJrZXIiKX0sdGhpcy5nZXRNYXJrZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBlP3RoaXMuJGZyb250TWFya2Vyczp0aGlzLiRiYWNrTWFya2Vyc30sdGhpcy5oaWdobGlnaHQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJHNlYXJjaEhpZ2hsaWdodCl7dmFyIHQ9bmV3IHAobnVsbCwiYWNlX3NlbGVjdGVkLXdvcmQiLCJ0ZXh0Iik7dGhpcy4kc2VhcmNoSGlnaGxpZ2h0PXRoaXMuYWRkRHluYW1pY01hcmtlcih0KX10aGlzLiRzZWFyY2hIaWdobGlnaHQuc2V0UmVnZXhwKGUpfSx0aGlzLmhpZ2hsaWdodExpbmVzPWZ1bmN0aW9uKGUsdCxuLHIpe3R5cGVvZiB0IT0ibnVtYmVyIiYmKG49dCx0PWUpLG58fChuPSJhY2Vfc3RlcCIpO3ZhciBpPW5ldyBsKGUsMCx0LEluZmluaXR5KTtyZXR1cm4gaS5pZD10aGlzLmFkZE1hcmtlcihpLG4sImZ1bGxMaW5lIixyKSxpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJGFubm90YXRpb25zPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VBbm5vdGF0aW9uIix7fSl9LHRoaXMuZ2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYW5ub3RhdGlvbnN8fFtdfSx0aGlzLmNsZWFyQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLnNldEFubm90YXRpb25zKFtdKX0sdGhpcy4kZGV0ZWN0TmV3TGluZT1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC9eLio/KFxyP1xuKS9tKTt0P3RoaXMuJGF1dG9OZXdMaW5lPXRbMV06dGhpcy4kYXV0b05ld0xpbmU9IlxuIn0sdGhpcy5nZXRXb3JkUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldExpbmUoZSkscj0hMTt0PjAmJihyPSEhbi5jaGFyQXQodC0xKS5tYXRjaCh0aGlzLnRva2VuUmUpKSxyfHwocj0hIW4uY2hhckF0KHQpLm1hdGNoKHRoaXMudG9rZW5SZSkpO2lmKHIpdmFyIGk9dGhpcy50b2tlblJlO2Vsc2UgaWYoL15ccyskLy50ZXN0KG4uc2xpY2UodC0xLHQrMSkpKXZhciBpPS9ccy87ZWxzZSB2YXIgaT10aGlzLm5vblRva2VuUmU7dmFyIHM9dDtpZihzPjApe2RvIHMtLTt3aGlsZShzPj0wJiZuLmNoYXJBdChzKS5tYXRjaChpKSk7cysrfXZhciBvPXQ7d2hpbGUobzxuLmxlbmd0aCYmbi5jaGFyQXQobykubWF0Y2goaSkpbysrO3JldHVybiBuZXcgbChlLHMsZSxvKX0sdGhpcy5nZXRBV29yZFJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRXb3JkUmFuZ2UoZSx0KSxyPXRoaXMuZ2V0TGluZShuLmVuZC5yb3cpO3doaWxlKHIuY2hhckF0KG4uZW5kLmNvbHVtbikubWF0Y2goL1sgXHRdLykpbi5lbmQuY29sdW1uKz0xO3JldHVybiBufSx0aGlzLnNldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKGUpe3RoaXMuZG9jLnNldE5ld0xpbmVNb2RlKGUpfSx0aGlzLmdldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCl9LHRoaXMuc2V0VXNlV29ya2VyPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ1c2VXb3JrZXIiLGUpfSx0aGlzLmdldFVzZVdvcmtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VXb3JrZXJ9LHRoaXMub25SZWxvYWRUb2tlbml6ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3RoaXMuYmdUb2tlbml6ZXIuc3RhcnQodC5maXJzdCksdGhpcy5fc2lnbmFsKCJ0b2tlbml6ZXJVcGRhdGUiLGUpfSx0aGlzLiRtb2Rlcz1vLiRtb2Rlcyx0aGlzLiRtb2RlPW51bGwsdGhpcy4kbW9kZUlkPW51bGwsdGhpcy5zZXRNb2RlPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihlLmdldFRva2VuaXplcilyZXR1cm4gdGhpcy4kb25DaGFuZ2VNb2RlKGUpO3ZhciBuPWUscj1uLnBhdGh9ZWxzZSByPWV8fCJhY2UvbW9kZS90ZXh0Ijt0aGlzLiRtb2Rlc1siYWNlL21vZGUvdGV4dCJdfHwodGhpcy4kbW9kZXNbImFjZS9tb2RlL3RleHQiXT1uZXcgZik7aWYodGhpcy4kbW9kZXNbcl0mJiFuKXt0aGlzLiRvbkNoYW5nZU1vZGUodGhpcy4kbW9kZXNbcl0pLHQmJnQoKTtyZXR1cm59dGhpcy4kbW9kZUlkPXIsby5sb2FkTW9kdWxlKFsibW9kZSIscl0sZnVuY3Rpb24oZSl7aWYodGhpcy4kbW9kZUlkIT09cilyZXR1cm4gdCYmdCgpO3RoaXMuJG1vZGVzW3JdJiYhbj90aGlzLiRvbkNoYW5nZU1vZGUodGhpcy4kbW9kZXNbcl0pOmUmJmUuTW9kZSYmKGU9bmV3IGUuTW9kZShuKSxufHwodGhpcy4kbW9kZXNbcl09ZSxlLiRpZD1yKSx0aGlzLiRvbkNoYW5nZU1vZGUoZSkpLHQmJnQoKX0uYmluZCh0aGlzKSksdGhpcy4kbW9kZXx8dGhpcy4kb25DaGFuZ2VNb2RlKHRoaXMuJG1vZGVzWyJhY2UvbW9kZS90ZXh0Il0sITApfSx0aGlzLiRvbkNoYW5nZU1vZGU9ZnVuY3Rpb24oZSx0KXt0fHwodGhpcy4kbW9kZUlkPWUuJGlkKTtpZih0aGlzLiRtb2RlPT09ZSlyZXR1cm47dGhpcy4kbW9kZT1lLHRoaXMuJHN0b3BXb3JrZXIoKSx0aGlzLiR1c2VXb3JrZXImJnRoaXMuJHN0YXJ0V29ya2VyKCk7dmFyIG49ZS5nZXRUb2tlbml6ZXIoKTtpZihuLmFkZEV2ZW50TGlzdGVuZXIhPT11bmRlZmluZWQpe3ZhciByPXRoaXMub25SZWxvYWRUb2tlbml6ZXIuYmluZCh0aGlzKTtuLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIscil9aWYoIXRoaXMuYmdUb2tlbml6ZXIpe3RoaXMuYmdUb2tlbml6ZXI9bmV3IGgobik7dmFyIGk9dGhpczt0aGlzLmJnVG9rZW5pemVyLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIsZnVuY3Rpb24oZSl7aS5fc2lnbmFsKCJ0b2tlbml6ZXJVcGRhdGUiLGUpfSl9ZWxzZSB0aGlzLmJnVG9rZW5pemVyLnNldFRva2VuaXplcihuKTt0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSksdGhpcy50b2tlblJlPWUudG9rZW5SZSx0aGlzLm5vblRva2VuUmU9ZS5ub25Ub2tlblJlLHR8fChlLmF0dGFjaFRvU2Vzc2lvbiYmZS5hdHRhY2hUb1Nlc3Npb24odGhpcyksdGhpcy4kb3B0aW9ucy53cmFwTWV0aG9kLnNldC5jYWxsKHRoaXMsdGhpcy4kd3JhcE1ldGhvZCksdGhpcy4kc2V0Rm9sZGluZyhlLmZvbGRpbmdSdWxlcyksdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKSx0aGlzLl9lbWl0KCJjaGFuZ2VNb2RlIikpfSx0aGlzLiRzdG9wV29ya2VyPWZ1bmN0aW9uKCl7dGhpcy4kd29ya2VyJiYodGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsKX0sdGhpcy4kc3RhcnRXb3JrZXI9ZnVuY3Rpb24oKXt0cnl7dGhpcy4kd29ya2VyPXRoaXMuJG1vZGUuY3JlYXRlV29ya2VyKHRoaXMpfWNhdGNoKGUpe28ud2FybigiQ291bGQgbm90IGxvYWQgd29ya2VyIixlKSx0aGlzLiR3b3JrZXI9bnVsbH19LHRoaXMuZ2V0TW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb2RlfSx0aGlzLiRzY3JvbGxUb3A9MCx0aGlzLnNldFNjcm9sbFRvcD1mdW5jdGlvbihlKXtpZih0aGlzLiRzY3JvbGxUb3A9PT1lfHxpc05hTihlKSlyZXR1cm47dGhpcy4kc2Nyb2xsVG9wPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VTY3JvbGxUb3AiLGUpfSx0aGlzLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxUb3B9LHRoaXMuJHNjcm9sbExlZnQ9MCx0aGlzLnNldFNjcm9sbExlZnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy4kc2Nyb2xsTGVmdD09PWV8fGlzTmFOKGUpKXJldHVybjt0aGlzLiRzY3JvbGxMZWZ0PWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VTY3JvbGxMZWZ0IixlKX0sdGhpcy5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbExlZnR9LHRoaXMuZ2V0U2NyZWVuV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY29tcHV0ZVdpZHRoKCksdGhpcy5saW5lV2lkZ2V0cz9NYXRoLm1heCh0aGlzLmdldExpbmVXaWRnZXRNYXhXaWR0aCgpLHRoaXMuc2NyZWVuV2lkdGgpOnRoaXMuc2NyZWVuV2lkdGh9LHRoaXMuZ2V0TGluZVdpZGdldE1heFdpZHRoPWZ1bmN0aW9uKCl7aWYodGhpcy5saW5lV2lkZ2V0c1dpZHRoIT1udWxsKXJldHVybiB0aGlzLmxpbmVXaWRnZXRzV2lkdGg7dmFyIGU9MDtyZXR1cm4gdGhpcy5saW5lV2lkZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnQuc2NyZWVuV2lkdGg+ZSYmKGU9dC5zY3JlZW5XaWR0aCl9KSx0aGlzLmxpbmVXaWRnZXRXaWR0aD1lfSx0aGlzLiRjb21wdXRlV2lkdGg9ZnVuY3Rpb24oZSl7aWYodGhpcy4kbW9kaWZpZWR8fGUpe3RoaXMuJG1vZGlmaWVkPSExO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXJldHVybiB0aGlzLnNjcmVlbldpZHRoPXRoaXMuJHdyYXBMaW1pdDt2YXIgdD10aGlzLmRvYy5nZXRBbGxMaW5lcygpLG49dGhpcy4kcm93TGVuZ3RoQ2FjaGUscj0wLGk9MCxzPXRoaXMuJGZvbGREYXRhW2ldLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eSx1PXQubGVuZ3RoO2Zvcih2YXIgYT0wO2E8dTthKyspe2lmKGE+byl7YT1zLmVuZC5yb3crMTtpZihhPj11KWJyZWFrO3M9dGhpcy4kZm9sZERhdGFbaSsrXSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHl9blthXT09bnVsbCYmKG5bYV09dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgodFthXSlbMF0pLG5bYV0+ciYmKHI9blthXSl9dGhpcy5zY3JlZW5XaWR0aD1yfX0sdGhpcy5nZXRMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5nZXRMaW5lKGUpfSx0aGlzLmdldExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLmdldExpbmVzKGUsdCl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldExlbmd0aCgpfSx0aGlzLmdldFRleHRSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2MuZ2V0VGV4dFJhbmdlKGV8fHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCkpfSx0aGlzLmluc2VydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5pbnNlcnQoZSx0KX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jLnJlbW92ZShlKX0sdGhpcy5yZW1vdmVGdWxsTGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MucmVtb3ZlRnVsbExpbmVzKGUsdCl9LHRoaXMudW5kb0NoYW5nZXM9ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuO3RoaXMuJGZyb21VbmRvPSEwO2Zvcih2YXIgbj1lLmxlbmd0aC0xO24hPS0xO24tLSl7dmFyIHI9ZVtuXTtyLmFjdGlvbj09Imluc2VydCJ8fHIuYWN0aW9uPT0icmVtb3ZlIj90aGlzLmRvYy5yZXZlcnREZWx0YShyKTpyLmZvbGRzJiZ0aGlzLmFkZEZvbGRzKHIuZm9sZHMpfSF0JiZ0aGlzLiR1bmRvU2VsZWN0JiYoZS5zZWxlY3Rpb25CZWZvcmU/dGhpcy5zZWxlY3Rpb24uZnJvbUpTT04oZS5zZWxlY3Rpb25CZWZvcmUpOnRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZSwhMCkpKSx0aGlzLiRmcm9tVW5kbz0hMX0sdGhpcy5yZWRvQ2hhbmdlcz1mdW5jdGlvbihlLHQpe2lmKCFlLmxlbmd0aClyZXR1cm47dGhpcy4kZnJvbVVuZG89ITA7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07KHIuYWN0aW9uPT0iaW5zZXJ0Inx8ci5hY3Rpb249PSJyZW1vdmUiKSYmdGhpcy5kb2MuYXBwbHlEZWx0YShyKX0hdCYmdGhpcy4kdW5kb1NlbGVjdCYmKGUuc2VsZWN0aW9uQWZ0ZXI/dGhpcy5zZWxlY3Rpb24uZnJvbUpTT04oZS5zZWxlY3Rpb25BZnRlcik6dGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UodGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihlLCExKSkpLHRoaXMuJGZyb21VbmRvPSExfSx0aGlzLnNldFVuZG9TZWxlY3Q9ZnVuY3Rpb24oZSl7dGhpcy4kdW5kb1NlbGVjdD1lfSx0aGlzLiRnZXRVbmRvU2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gdD9lLmFjdGlvbiE9PSJpbnNlcnQiOmUuYWN0aW9uPT09Imluc2VydCJ9dmFyIHIsaSxzO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt2YXIgdT1lW29dO2lmKCF1LnN0YXJ0KWNvbnRpbnVlO2lmKCFyKXtuKHUpPyhyPWwuZnJvbVBvaW50cyh1LnN0YXJ0LHUuZW5kKSxzPSEwKToocj1sLmZyb21Qb2ludHModS5zdGFydCx1LnN0YXJ0KSxzPSExKTtjb250aW51ZX1uKHUpPyhpPXUuc3RhcnQsci5jb21wYXJlKGkucm93LGkuY29sdW1uKT09LTEmJnIuc2V0U3RhcnQoaSksaT11LmVuZCxyLmNvbXBhcmUoaS5yb3csaS5jb2x1bW4pPT0xJiZyLnNldEVuZChpKSxzPSEwKTooaT11LnN0YXJ0LHIuY29tcGFyZShpLnJvdyxpLmNvbHVtbik9PS0xJiYocj1sLmZyb21Qb2ludHModS5zdGFydCx1LnN0YXJ0KSkscz0hMSl9cmV0dXJuIHJ9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5yZXBsYWNlKGUsdCl9LHRoaXMubW92ZVRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZ2V0VGV4dFJhbmdlKGUpLGk9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSkscz1sLmZyb21Qb2ludHModCx0KTtpZighbil7dGhpcy5yZW1vdmUoZSk7dmFyIG89ZS5zdGFydC5yb3ctZS5lbmQucm93LHU9bz8tZS5lbmQuY29sdW1uOmUuc3RhcnQuY29sdW1uLWUuZW5kLmNvbHVtbjt1JiYocy5zdGFydC5yb3c9PWUuZW5kLnJvdyYmcy5zdGFydC5jb2x1bW4+ZS5lbmQuY29sdW1uJiYocy5zdGFydC5jb2x1bW4rPXUpLHMuZW5kLnJvdz09ZS5lbmQucm93JiZzLmVuZC5jb2x1bW4+ZS5lbmQuY29sdW1uJiYocy5lbmQuY29sdW1uKz11KSksbyYmcy5zdGFydC5yb3c+PWUuZW5kLnJvdyYmKHMuc3RhcnQucm93Kz1vLHMuZW5kLnJvdys9byl9cy5lbmQ9dGhpcy5pbnNlcnQocy5zdGFydCxyKTtpZihpLmxlbmd0aCl7dmFyIGE9ZS5zdGFydCxmPXMuc3RhcnQsbz1mLnJvdy1hLnJvdyx1PWYuY29sdW1uLWEuY29sdW1uO3RoaXMuYWRkRm9sZHMoaS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5jbG9uZSgpLGUuc3RhcnQucm93PT1hLnJvdyYmKGUuc3RhcnQuY29sdW1uKz11KSxlLmVuZC5yb3c9PWEucm93JiYoZS5lbmQuY29sdW1uKz11KSxlLnN0YXJ0LnJvdys9byxlLmVuZC5yb3crPW8sZX0pKX1yZXR1cm4gc30sdGhpcy5pbmRlbnRSb3dzPWZ1bmN0aW9uKGUsdCxuKXtuPW4ucmVwbGFjZSgvXHQvZyx0aGlzLmdldFRhYlN0cmluZygpKTtmb3IodmFyIHI9ZTtyPD10O3IrKyl0aGlzLmRvYy5pbnNlcnRJbkxpbmUoe3JvdzpyLGNvbHVtbjowfSxuKX0sdGhpcy5vdXRkZW50Um93cz1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbGxhcHNlUm93cygpLG49bmV3IGwoMCwwLDAsMCkscj10aGlzLmdldFRhYlNpemUoKTtmb3IodmFyIGk9dC5zdGFydC5yb3c7aTw9dC5lbmQucm93OysraSl7dmFyIHM9dGhpcy5nZXRMaW5lKGkpO24uc3RhcnQucm93PWksbi5lbmQucm93PWk7Zm9yKHZhciBvPTA7bzxyOysrbylpZihzLmNoYXJBdChvKSE9IiAiKWJyZWFrO288ciYmcy5jaGFyQXQobyk9PSIJIj8obi5zdGFydC5jb2x1bW49byxuLmVuZC5jb2x1bW49bysxKToobi5zdGFydC5jb2x1bW49MCxuLmVuZC5jb2x1bW49byksdGhpcy5yZW1vdmUobil9fSx0aGlzLiRtb3ZlTGluZXM9ZnVuY3Rpb24oZSx0LG4pe2U9dGhpcy5nZXRSb3dGb2xkU3RhcnQoZSksdD10aGlzLmdldFJvd0ZvbGRFbmQodCk7aWYobjwwKXt2YXIgcj10aGlzLmdldFJvd0ZvbGRTdGFydChlK24pO2lmKHI8MClyZXR1cm4gMDt2YXIgaT1yLWV9ZWxzZSBpZihuPjApe3ZhciByPXRoaXMuZ2V0Um93Rm9sZEVuZCh0K24pO2lmKHI+dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSlyZXR1cm4gMDt2YXIgaT1yLXR9ZWxzZXtlPXRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KGUpLHQ9dGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQodCk7dmFyIGk9dC1lKzF9dmFyIHM9bmV3IGwoZSwwLHQsTnVtYmVyLk1BWF9WQUxVRSksbz10aGlzLmdldEZvbGRzSW5SYW5nZShzKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5jbG9uZSgpLGUuc3RhcnQucm93Kz1pLGUuZW5kLnJvdys9aSxlfSksdT1uPT0wP3RoaXMuZG9jLmdldExpbmVzKGUsdCk6dGhpcy5kb2MucmVtb3ZlRnVsbExpbmVzKGUsdCk7cmV0dXJuIHRoaXMuZG9jLmluc2VydEZ1bGxMaW5lcyhlK2ksdSksby5sZW5ndGgmJnRoaXMuYWRkRm9sZHMobyksaX0sdGhpcy5tb3ZlTGluZXNVcD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRtb3ZlTGluZXMoZSx0LC0xKX0sdGhpcy5tb3ZlTGluZXNEb3duPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJG1vdmVMaW5lcyhlLHQsMSl9LHRoaXMuZHVwbGljYXRlTGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbW92ZUxpbmVzKGUsdCwwKX0sdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oZSx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xKSl9LHRoaXMuJGNsaXBDb2x1bW5Ub1Jvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0PDA/MDpNYXRoLm1pbih0aGlzLmRvYy5nZXRMaW5lKGUpLmxlbmd0aCx0KX0sdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudD1mdW5jdGlvbihlLHQpe3Q9TWF0aC5tYXgoMCx0KTtpZihlPDApZT0wLHQ9MDtlbHNle3ZhciBuPXRoaXMuZG9jLmdldExlbmd0aCgpO2U+PW4/KGU9bi0xLHQ9dGhpcy5kb2MuZ2V0TGluZShuLTEpLmxlbmd0aCk6dD1NYXRoLm1pbih0aGlzLmRvYy5nZXRMaW5lKGUpLmxlbmd0aCx0KX1yZXR1cm57cm93OmUsY29sdW1uOnR9fSx0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50PWZ1bmN0aW9uKGUpe2Uuc3RhcnQucm93PDA/KGUuc3RhcnQucm93PTAsZS5zdGFydC5jb2x1bW49MCk6ZS5zdGFydC5jb2x1bW49dGhpcy4kY2xpcENvbHVtblRvUm93KGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKTt2YXIgdD10aGlzLmRvYy5nZXRMZW5ndGgoKS0xO3JldHVybiBlLmVuZC5yb3c+dD8oZS5lbmQucm93PXQsZS5lbmQuY29sdW1uPXRoaXMuZG9jLmdldExpbmUodCkubGVuZ3RoKTplLmVuZC5jb2x1bW49dGhpcy4kY2xpcENvbHVtblRvUm93KGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pLGV9LHRoaXMuJHdyYXBMaW1pdD04MCx0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLiR3cmFwTGltaXRSYW5nZT17bWluOm51bGwsbWF4Om51bGx9LHRoaXMuc2V0VXNlV3JhcE1vZGU9ZnVuY3Rpb24oZSl7aWYoZSE9dGhpcy4kdXNlV3JhcE1vZGUpe3RoaXMuJHVzZVdyYXBNb2RlPWUsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTtpZihlKXt2YXIgdD10aGlzLmdldExlbmd0aCgpO3RoaXMuJHdyYXBEYXRhPUFycmF5KHQpLHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsdC0xKX10aGlzLl9zaWduYWwoImNoYW5nZVdyYXBNb2RlIil9fSx0aGlzLmdldFVzZVdyYXBNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVdyYXBNb2RlfSx0aGlzLnNldFdyYXBMaW1pdFJhbmdlPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy4kd3JhcExpbWl0UmFuZ2UubWluIT09ZXx8dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4IT09dCl0aGlzLiR3cmFwTGltaXRSYW5nZT17bWluOmUsbWF4OnR9LHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJGJpZGlIYW5kbGVyLm1hcmtBc0RpcnR5KCksdGhpcy4kdXNlV3JhcE1vZGUmJnRoaXMuX3NpZ25hbCgiY2hhbmdlV3JhcE1vZGUiKX0sdGhpcy5hZGp1c3RXcmFwTGltaXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiR3cmFwTGltaXRSYW5nZTtuLm1heDwwJiYobj17bWluOnQsbWF4OnR9KTt2YXIgcj10aGlzLiRjb25zdHJhaW5XcmFwTGltaXQoZSxuLm1pbixuLm1heCk7cmV0dXJuIHIhPXRoaXMuJHdyYXBMaW1pdCYmcj4xPyh0aGlzLiR3cmFwTGltaXQ9cix0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsdGhpcy5nZXRMZW5ndGgoKS0xKSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuX3NpZ25hbCgiY2hhbmdlV3JhcExpbWl0IikpLCEwKTohMX0sdGhpcy4kY29uc3RyYWluV3JhcExpbWl0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdCYmKGU9TWF0aC5tYXgodCxlKSksbiYmKGU9TWF0aC5taW4obixlKSksZX0sdGhpcy5nZXRXcmFwTGltaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kd3JhcExpbWl0fSx0aGlzLnNldFdyYXBMaW1pdD1mdW5jdGlvbihlKXt0aGlzLnNldFdyYXBMaW1pdFJhbmdlKGUsZSl9LHRoaXMuZ2V0V3JhcExpbWl0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm57bWluOnRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbixtYXg6dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4fX0sdGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kdXNlV3JhcE1vZGUsbj1lLmFjdGlvbixyPWUuc3RhcnQsaT1lLmVuZCxzPXIucm93LG89aS5yb3csdT1vLXMsYT1udWxsO3RoaXMuJHVwZGF0aW5nPSEwO2lmKHUhPTApaWYobj09PSJyZW1vdmUiKXt0aGlzW3Q/IiR3cmFwRGF0YSI6IiRyb3dMZW5ndGhDYWNoZSJdLnNwbGljZShzLHUpO3ZhciBmPXRoaXMuJGZvbGREYXRhO2E9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSksdGhpcy5yZW1vdmVGb2xkcyhhKTt2YXIgbD10aGlzLmdldEZvbGRMaW5lKGkucm93KSxjPTA7aWYobCl7bC5hZGRSZW1vdmVDaGFycyhpLnJvdyxpLmNvbHVtbixyLmNvbHVtbi1pLmNvbHVtbiksbC5zaGlmdFJvdygtdSk7dmFyIGg9dGhpcy5nZXRGb2xkTGluZShzKTtoJiZoIT09bCYmKGgubWVyZ2UobCksbD1oKSxjPWYuaW5kZXhPZihsKSsxfWZvcihjO2M8Zi5sZW5ndGg7YysrKXt2YXIgbD1mW2NdO2wuc3RhcnQucm93Pj1pLnJvdyYmbC5zaGlmdFJvdygtdSl9bz1zfWVsc2V7dmFyIHA9QXJyYXkodSk7cC51bnNoaWZ0KHMsMCk7dmFyIGQ9dD90aGlzLiR3cmFwRGF0YTp0aGlzLiRyb3dMZW5ndGhDYWNoZTtkLnNwbGljZS5hcHBseShkLHApO3ZhciBmPXRoaXMuJGZvbGREYXRhLGw9dGhpcy5nZXRGb2xkTGluZShzKSxjPTA7aWYobCl7dmFyIHY9bC5yYW5nZS5jb21wYXJlSW5zaWRlKHIucm93LHIuY29sdW1uKTt2PT0wPyhsPWwuc3BsaXQoci5yb3csci5jb2x1bW4pLGwmJihsLnNoaWZ0Um93KHUpLGwuYWRkUmVtb3ZlQ2hhcnMobywwLGkuY29sdW1uLXIuY29sdW1uKSkpOnY9PS0xJiYobC5hZGRSZW1vdmVDaGFycyhzLDAsaS5jb2x1bW4tci5jb2x1bW4pLGwuc2hpZnRSb3codSkpLGM9Zi5pbmRleE9mKGwpKzF9Zm9yKGM7YzxmLmxlbmd0aDtjKyspe3ZhciBsPWZbY107bC5zdGFydC5yb3c+PXMmJmwuc2hpZnRSb3codSl9fWVsc2V7dT1NYXRoLmFicyhlLnN0YXJ0LmNvbHVtbi1lLmVuZC5jb2x1bW4pLG49PT0icmVtb3ZlIiYmKGE9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSksdGhpcy5yZW1vdmVGb2xkcyhhKSx1PS11KTt2YXIgbD10aGlzLmdldEZvbGRMaW5lKHMpO2wmJmwuYWRkUmVtb3ZlQ2hhcnMocyxyLmNvbHVtbix1KX1yZXR1cm4gdCYmdGhpcy4kd3JhcERhdGEubGVuZ3RoIT10aGlzLmRvYy5nZXRMZW5ndGgoKSYmY29uc29sZS5lcnJvcigiZG9jLmdldExlbmd0aCgpIGFuZCAkd3JhcERhdGEubGVuZ3RoIGhhdmUgdG8gYmUgdGhlIHNhbWUhIiksdGhpcy4kdXBkYXRpbmc9ITEsdD90aGlzLiR1cGRhdGVXcmFwRGF0YShzLG8pOnRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlKHMsbyksYX0sdGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJHJvd0xlbmd0aENhY2hlW2VdPW51bGwsdGhpcy4kcm93TGVuZ3RoQ2FjaGVbdF09bnVsbH0sdGhpcy4kdXBkYXRlV3JhcERhdGE9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmRvYy5nZXRBbGxMaW5lcygpLGk9dGhpcy5nZXRUYWJTaXplKCksbz10aGlzLiR3cmFwRGF0YSx1PXRoaXMuJHdyYXBMaW1pdCxhLGYsbD1lO3Q9TWF0aC5taW4odCxyLmxlbmd0aC0xKTt3aGlsZShsPD10KWY9dGhpcy5nZXRGb2xkTGluZShsLGYpLGY/KGE9W10sZi53YWxrKGZ1bmN0aW9uKGUsdCxpLG8pe3ZhciB1O2lmKGUhPW51bGwpe3U9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhlLGEubGVuZ3RoKSx1WzBdPW47Zm9yKHZhciBmPTE7Zjx1Lmxlbmd0aDtmKyspdVtmXT1zfWVsc2UgdT10aGlzLiRnZXREaXNwbGF5VG9rZW5zKHJbdF0uc3Vic3RyaW5nKG8saSksYS5sZW5ndGgpO2E9YS5jb25jYXQodSl9LmJpbmQodGhpcyksZi5lbmQucm93LHJbZi5lbmQucm93XS5sZW5ndGgrMSksb1tmLnN0YXJ0LnJvd109dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMoYSx1LGkpLGw9Zi5lbmQucm93KzEpOihhPXRoaXMuJGdldERpc3BsYXlUb2tlbnMocltsXSksb1tsXT10aGlzLiRjb21wdXRlV3JhcFNwbGl0cyhhLHUsaSksbCsrKX07dmFyIGU9MSx0PTIsbj0zLHM9NCxhPTksYz0xMCxkPTExLHY9MTI7dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHM9ZnVuY3Rpb24oZSxyLGkpe2Z1bmN0aW9uIGcoKXt2YXIgdD0wO2lmKG09PT0wKXJldHVybiB0O2lmKHApZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYocj09Yyl0Kz0xO2Vsc2V7aWYociE9ZCl7aWYocj09diljb250aW51ZTticmVha310Kz1pfX1yZXR1cm4gaCYmcCE9PSExJiYodCs9aSksTWF0aC5taW4odCxtKX1mdW5jdGlvbiB5KHQpe3ZhciBuPXQtZjtmb3IodmFyIHI9ZjtyPHQ7cisrKXt2YXIgaT1lW3JdO2lmKGk9PT0xMnx8aT09PTIpbi09MX1vLmxlbmd0aHx8KGI9ZygpLG8uaW5kZW50PWIpLGwrPW4sby5wdXNoKGwpLGY9dH1pZihlLmxlbmd0aD09MClyZXR1cm5bXTt2YXIgbz1bXSx1PWUubGVuZ3RoLGY9MCxsPTAsaD10aGlzLiR3cmFwQXNDb2RlLHA9dGhpcy4kaW5kZW50ZWRTb2Z0V3JhcCxtPXI8PU1hdGgubWF4KDIqaSw4KXx8cD09PSExPzA6TWF0aC5mbG9vcihyLzIpLGI9MDt3aGlsZSh1LWY+ci1iKXt2YXIgdz1mK3ItYjtpZihlW3ctMV0+PWMmJmVbd10+PWMpe3kodyk7Y29udGludWV9aWYoZVt3XT09bnx8ZVt3XT09cyl7Zm9yKHc7dyE9Zi0xO3ctLSlpZihlW3ddPT1uKWJyZWFrO2lmKHc+Zil7eSh3KTtjb250aW51ZX13PWYrcjtmb3Iodzt3PGUubGVuZ3RoO3crKylpZihlW3ddIT1zKWJyZWFrO2lmKHc9PWUubGVuZ3RoKWJyZWFrO3kodyk7Y29udGludWV9dmFyIEU9TWF0aC5tYXgody0oci0ocj4+MikpLGYtMSk7d2hpbGUodz5FJiZlW3ddPG4pdy0tO2lmKGgpe3doaWxlKHc+RSYmZVt3XTxuKXctLTt3aGlsZSh3PkUmJmVbd109PWEpdy0tfWVsc2Ugd2hpbGUodz5FJiZlW3ddPGMpdy0tO2lmKHc+RSl7eSgrK3cpO2NvbnRpbnVlfXc9ZityLGVbd109PXQmJnctLSx5KHctYil9cmV0dXJuIG99LHRoaXMuJGdldERpc3BsYXlUb2tlbnM9ZnVuY3Rpb24obixyKXt2YXIgaT1bXSxzO3I9cnx8MDtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIHU9bi5jaGFyQ29kZUF0KG8pO2lmKHU9PTkpe3M9dGhpcy5nZXRTY3JlZW5UYWJTaXplKGkubGVuZ3RoK3IpLGkucHVzaChkKTtmb3IodmFyIGY9MTtmPHM7ZisrKWkucHVzaCh2KX1lbHNlIHU9PTMyP2kucHVzaChjKTp1PjM5JiZ1PDQ4fHx1PjU3JiZ1PDY0P2kucHVzaChhKTp1Pj00MzUyJiZtKHUpP2kucHVzaChlLHQpOmkucHVzaChlKX1yZXR1cm4gaX0sdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGg9ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PTApcmV0dXJuWzAsMF07dD09bnVsbCYmKHQ9SW5maW5pdHkpLG49bnx8MDt2YXIgcixpO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspe3I9ZS5jaGFyQ29kZUF0KGkpLHI9PTk/bis9dGhpcy5nZXRTY3JlZW5UYWJTaXplKG4pOnI+PTQzNTImJm0ocik/bis9MjpuKz0xO2lmKG4+dClicmVha31yZXR1cm5bbixpXX0sdGhpcy5saW5lV2lkZ2V0cz1udWxsLHRoaXMuZ2V0Um93TGVuZ3RoPWZ1bmN0aW9uKGUpe2lmKHRoaXMubGluZVdpZGdldHMpdmFyIHQ9dGhpcy5saW5lV2lkZ2V0c1tlXSYmdGhpcy5saW5lV2lkZ2V0c1tlXS5yb3dDb3VudHx8MDtlbHNlIHQ9MDtyZXR1cm4hdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVtlXT8xK3Q6dGhpcy4kd3JhcERhdGFbZV0ubGVuZ3RoKzErdH0sdGhpcy5nZXRSb3dMaW5lQ291bnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbZV0/MTp0aGlzLiR3cmFwRGF0YVtlXS5sZW5ndGgrMX0sdGhpcy5nZXRSb3dXcmFwSW5kZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgdD10aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLE51bWJlci5NQVhfVkFMVUUpLG49dGhpcy4kd3JhcERhdGFbdC5yb3ddO3JldHVybiBuLmxlbmd0aCYmblswXTx0LmNvbHVtbj9uLmluZGVudDowfXJldHVybiAwfSx0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW49ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSxOdW1iZXIuTUFYX1ZBTFVFKTtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKHQucm93LHQuY29sdW1uKX0sdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW49ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coZSx0KTtyZXR1cm4gdGhpcy5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKG4pfSx0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGUsdCk7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKG4sTnVtYmVyLk1BWF9WQUxVRS8xMCl9LHRoaXMuZ2V0Um93U3BsaXREYXRhPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR3cmFwRGF0YVtlXTp1bmRlZmluZWR9LHRoaXMuZ2V0U2NyZWVuVGFiU2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdGFiU2l6ZS0oZSV0aGlzLiR0YWJTaXplfDApfSx0aGlzLnNjcmVlblRvRG9jdW1lbnRSb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSx0KS5yb3d9LHRoaXMuc2NyZWVuVG9Eb2N1bWVudENvbHVtbj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLHQpLmNvbHVtbn0sdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oZSx0LG4pe2lmKGU8MClyZXR1cm57cm93OjAsY29sdW1uOjB9O3ZhciByLGk9MCxzPTAsbyx1PTAsYT0wLGY9dGhpcy4kc2NyZWVuUm93Q2FjaGUsbD10aGlzLiRnZXRSb3dDYWNoZUluZGV4KGYsZSksYz1mLmxlbmd0aDtpZihjJiZsPj0wKXZhciB1PWZbbF0saT10aGlzLiRkb2NSb3dDYWNoZVtsXSxoPWU+ZltjLTFdO2Vsc2UgdmFyIGg9IWM7dmFyIHA9dGhpcy5nZXRMZW5ndGgoKS0xLGQ9dGhpcy5nZXROZXh0Rm9sZExpbmUoaSksdj1kP2Quc3RhcnQucm93OkluZmluaXR5O3doaWxlKHU8PWUpe2E9dGhpcy5nZXRSb3dMZW5ndGgoaSk7aWYodSthPmV8fGk+PXApYnJlYWs7dSs9YSxpKyssaT52JiYoaT1kLmVuZC5yb3crMSxkPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGksZCksdj1kP2Quc3RhcnQucm93OkluZmluaXR5KSxoJiYodGhpcy4kZG9jUm93Q2FjaGUucHVzaChpKSx0aGlzLiRzY3JlZW5Sb3dDYWNoZS5wdXNoKHUpKX1pZihkJiZkLnN0YXJ0LnJvdzw9aSlyPXRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGQpLGk9ZC5zdGFydC5yb3c7ZWxzZXtpZih1K2E8PWV8fGk+cClyZXR1cm57cm93OnAsY29sdW1uOnRoaXMuZ2V0TGluZShwKS5sZW5ndGh9O3I9dGhpcy5nZXRMaW5lKGkpLGQ9bnVsbH12YXIgbT0wLGc9TWF0aC5mbG9vcihlLXUpO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgeT10aGlzLiR3cmFwRGF0YVtpXTt5JiYobz15W2ddLGc+MCYmeS5sZW5ndGgmJihtPXkuaW5kZW50LHM9eVtnLTFdfHx5W3kubGVuZ3RoLTFdLHI9ci5zdWJzdHJpbmcocykpKX1yZXR1cm4gbiE9PXVuZGVmaW5lZCYmdGhpcy4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHUrZyxpLGcpJiYodD10aGlzLiRiaWRpSGFuZGxlci5vZmZzZXRUb0NvbChuKSkscys9dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgocix0LW0pWzFdLHRoaXMuJHVzZVdyYXBNb2RlJiZzPj1vJiYocz1vLTEpLGQ/ZC5pZHhUb1Bvc2l0aW9uKHMpOntyb3c6aSxjb2x1bW46c319LHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQ9PSJ1bmRlZmluZWQiKXZhciBuPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoZS5yb3csZS5jb2x1bW4pO2Vsc2Ugbj10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGUsdCk7ZT1uLnJvdyx0PW4uY29sdW1uO3ZhciByPTAsaT1udWxsLHM9bnVsbDtzPXRoaXMuZ2V0Rm9sZEF0KGUsdCwxKSxzJiYoZT1zLnN0YXJ0LnJvdyx0PXMuc3RhcnQuY29sdW1uKTt2YXIgbyx1PTAsYT10aGlzLiRkb2NSb3dDYWNoZSxmPXRoaXMuJGdldFJvd0NhY2hlSW5kZXgoYSxlKSxsPWEubGVuZ3RoO2lmKGwmJmY+PTApdmFyIHU9YVtmXSxyPXRoaXMuJHNjcmVlblJvd0NhY2hlW2ZdLGM9ZT5hW2wtMV07ZWxzZSB2YXIgYz0hbDt2YXIgaD10aGlzLmdldE5leHRGb2xkTGluZSh1KSxwPWg/aC5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUodTxlKXtpZih1Pj1wKXtvPWguZW5kLnJvdysxO2lmKG8+ZSlicmVhaztoPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKG8saCkscD1oP2guc3RhcnQucm93OkluZmluaXR5fWVsc2Ugbz11KzE7cis9dGhpcy5nZXRSb3dMZW5ndGgodSksdT1vLGMmJih0aGlzLiRkb2NSb3dDYWNoZS5wdXNoKHUpLHRoaXMuJHNjcmVlblJvd0NhY2hlLnB1c2gocikpfXZhciBkPSIiO2gmJnU+PXA/KGQ9dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoaCxlLHQpLGk9aC5zdGFydC5yb3cpOihkPXRoaXMuZ2V0TGluZShlKS5zdWJzdHJpbmcoMCx0KSxpPWUpO3ZhciB2PTA7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciBtPXRoaXMuJHdyYXBEYXRhW2ldO2lmKG0pe3ZhciBnPTA7d2hpbGUoZC5sZW5ndGg+PW1bZ10pcisrLGcrKztkPWQuc3Vic3RyaW5nKG1bZy0xXXx8MCxkLmxlbmd0aCksdj1nPjA/bS5pbmRlbnQ6MH19cmV0dXJue3JvdzpyLGNvbHVtbjp2K3RoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKGQpWzBdfX0sdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUsdCkuY29sdW1ufSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSx0KS5yb3d9LHRoaXMuZ2V0U2NyZWVuTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PW51bGw7aWYoIXRoaXMuJHVzZVdyYXBNb2RlKXtlPXRoaXMuZ2V0TGVuZ3RoKCk7dmFyIG49dGhpcy4kZm9sZERhdGE7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspdD1uW3JdLGUtPXQuZW5kLnJvdy10LnN0YXJ0LnJvd31lbHNle3ZhciBpPXRoaXMuJHdyYXBEYXRhLmxlbmd0aCxzPTAscj0wLHQ9dGhpcy4kZm9sZERhdGFbcisrXSxvPXQ/dC5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUoczxpKXt2YXIgdT10aGlzLiR3cmFwRGF0YVtzXTtlKz11P3UubGVuZ3RoKzE6MSxzKysscz5vJiYocz10LmVuZC5yb3crMSx0PXRoaXMuJGZvbGREYXRhW3IrK10sbz10P3Quc3RhcnQucm93OkluZmluaXR5KX19cmV0dXJuIHRoaXMubGluZVdpZGdldHMmJihlKz10aGlzLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGgoKSksZX0sdGhpcy4kc2V0Rm9udE1ldHJpY3M9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGVuYWJsZVZhckNoYXIpcmV0dXJuO3RoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoPWZ1bmN0aW9uKHQsbixyKXtpZihuPT09MClyZXR1cm5bMCwwXTtufHwobj1JbmZpbml0eSkscj1yfHwwO3ZhciBpLHM7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7aT10LmNoYXJBdChzKSxpPT09IgkiP3IrPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShyKTpyKz1lLmdldENoYXJhY3RlcldpZHRoKGkpO2lmKHI+bilicmVha31yZXR1cm5bcixzXX19LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuYmdUb2tlbml6ZXImJih0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KG51bGwpLHRoaXMuYmdUb2tlbml6ZXI9bnVsbCksdGhpcy4kc3RvcFdvcmtlcigpfSx0aGlzLmlzRnVsbFdpZHRoPW19LmNhbGwoZC5wcm90b3R5cGUpLGUoIi4vZWRpdF9zZXNzaW9uL2ZvbGRpbmciKS5Gb2xkaW5nLmNhbGwoZC5wcm90b3R5cGUpLGUoIi4vZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giKS5CcmFja2V0TWF0Y2guY2FsbChkLnByb3RvdHlwZSksby5kZWZpbmVPcHRpb25zKGQucHJvdG90eXBlLCJzZXNzaW9uIix7d3JhcDp7c2V0OmZ1bmN0aW9uKGUpeyFlfHxlPT0ib2ZmIj9lPSExOmU9PSJmcmVlIj9lPSEwOmU9PSJwcmludE1hcmdpbiI/ZT0tMTp0eXBlb2YgZT09InN0cmluZyImJihlPXBhcnNlSW50KGUsMTApfHwhMSk7aWYodGhpcy4kd3JhcD09ZSlyZXR1cm47dGhpcy4kd3JhcD1lO2lmKCFlKXRoaXMuc2V0VXNlV3JhcE1vZGUoITEpO2Vsc2V7dmFyIHQ9dHlwZW9mIGU9PSJudW1iZXIiP2U6bnVsbDt0aGlzLnNldFdyYXBMaW1pdFJhbmdlKHQsdCksdGhpcy5zZXRVc2VXcmFwTW9kZSghMCl9fSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVc2VXcmFwTW9kZSgpP3RoaXMuJHdyYXA9PS0xPyJwcmludE1hcmdpbiI6dGhpcy5nZXRXcmFwTGltaXRSYW5nZSgpLm1pbj90aGlzLiR3cmFwOiJmcmVlIjoib2ZmIn0saGFuZGxlc1NldDohMH0sd3JhcE1ldGhvZDp7c2V0OmZ1bmN0aW9uKGUpe2U9ZT09ImF1dG8iP3RoaXMuJG1vZGUudHlwZSE9InRleHQiOmUhPSJ0ZXh0IixlIT10aGlzLiR3cmFwQXNDb2RlJiYodGhpcy4kd3JhcEFzQ29kZT1lLHRoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy5zZXRVc2VXcmFwTW9kZSghMCkpKX0saW5pdGlhbFZhbHVlOiJhdXRvIn0saW5kZW50ZWRTb2Z0V3JhcDp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLnNldFVzZVdyYXBNb2RlKCEwKSl9LGluaXRpYWxWYWx1ZTohMH0sZmlyc3RMaW5lTnVtYmVyOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiKX0saW5pdGlhbFZhbHVlOjF9LHVzZVdvcmtlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHVzZVdvcmtlcj1lLHRoaXMuJHN0b3BXb3JrZXIoKSxlJiZ0aGlzLiRzdGFydFdvcmtlcigpfSxpbml0aWFsVmFsdWU6ITB9LHVzZVNvZnRUYWJzOntpbml0aWFsVmFsdWU6ITB9LHRhYlNpemU6e3NldDpmdW5jdGlvbihlKXtlPXBhcnNlSW50KGUpLGU+MCYmdGhpcy4kdGFiU2l6ZSE9PWUmJih0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRyb3dMZW5ndGhDYWNoZT1bXSx0aGlzLiR0YWJTaXplPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VUYWJTaXplIikpfSxpbml0aWFsVmFsdWU6NCxoYW5kbGVzU2V0OiEwfSxuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzOntpbml0aWFsVmFsdWU6ITF9LGZvbGRTdHlsZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0Rm9sZFN0eWxlKGUpfSxoYW5kbGVzU2V0OiEwfSxvdmVyd3JpdGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLl9zaWduYWwoImNoYW5nZU92ZXJ3cml0ZSIpfSxpbml0aWFsVmFsdWU6ITF9LG5ld0xpbmVNb2RlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5kb2Muc2V0TmV3TGluZU1vZGUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXROZXdMaW5lTW9kZSgpfSxoYW5kbGVzU2V0OiEwfSxtb2RlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRNb2RlKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW9kZUlkfSxoYW5kbGVzU2V0OiEwfX0pLHQuRWRpdFNlc3Npb249ZH0pLGFjZS5kZWZpbmUoImFjZS9zZWFyY2giLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuL1x3Ly50ZXN0KGUpfHx0LnJlZ0V4cD8iXFxiIjoiIn1yZXR1cm4gbihlWzBdKStlK24oZVtlLmxlbmd0aC0xXSl9dmFyIHI9ZSgiLi9saWIvbGFuZyIpLGk9ZSgiLi9saWIvb29wIikscz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1mdW5jdGlvbigpe3RoaXMuJG9wdGlvbnM9e319OyhmdW5jdGlvbigpe3RoaXMuc2V0PWZ1bmN0aW9uKGUpe3JldHVybiBpLm1peGluKHRoaXMuJG9wdGlvbnMsZSksdGhpc30sdGhpcy5nZXRPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHIuY29weU9iamVjdCh0aGlzLiRvcHRpb25zKX0sdGhpcy5zZXRPcHRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJG9wdGlvbnM9ZX0sdGhpcy5maW5kPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJG9wdGlvbnMsbj10aGlzLiRtYXRjaEl0ZXJhdG9yKGUsdCk7aWYoIW4pcmV0dXJuITE7dmFyIHI9bnVsbDtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKGUsbixpLG8pe3JldHVybiByPW5ldyBzKGUsbixpLG8pLG49PW8mJnQuc3RhcnQmJnQuc3RhcnQuc3RhcnQmJnQuc2tpcEN1cnJlbnQhPTAmJnIuaXNFcXVhbCh0LnN0YXJ0KT8ocj1udWxsLCExKTohMH0pLHJ9LHRoaXMuZmluZEFsbD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRvcHRpb25zO2lmKCF0Lm5lZWRsZSlyZXR1cm5bXTt0aGlzLiRhc3NlbWJsZVJlZ0V4cCh0KTt2YXIgbj10LnJhbmdlLGk9bj9lLmdldExpbmVzKG4uc3RhcnQucm93LG4uZW5kLnJvdyk6ZS5kb2MuZ2V0QWxsTGluZXMoKSxvPVtdLHU9dC5yZTtpZih0LiRpc011bHRpTGluZSl7dmFyIGE9dS5sZW5ndGgsZj1pLmxlbmd0aC1hLGw7ZTpmb3IodmFyIGM9dS5vZmZzZXR8fDA7Yzw9ZjtjKyspe2Zvcih2YXIgaD0wO2g8YTtoKyspaWYoaVtjK2hdLnNlYXJjaCh1W2hdKT09LTEpY29udGludWUgZTt2YXIgcD1pW2NdLGQ9aVtjK2EtMV0sdj1wLmxlbmd0aC1wLm1hdGNoKHVbMF0pWzBdLmxlbmd0aCxtPWQubWF0Y2godVthLTFdKVswXS5sZW5ndGg7aWYobCYmbC5lbmQucm93PT09YyYmbC5lbmQuY29sdW1uPnYpY29udGludWU7by5wdXNoKGw9bmV3IHMoYyx2LGMrYS0xLG0pKSxhPjImJihjPWMrYS0yKX19ZWxzZSBmb3IodmFyIGc9MDtnPGkubGVuZ3RoO2crKyl7dmFyIHk9ci5nZXRNYXRjaE9mZnNldHMoaVtnXSx1KTtmb3IodmFyIGg9MDtoPHkubGVuZ3RoO2grKyl7dmFyIGI9eVtoXTtvLnB1c2gobmV3IHMoZyxiLm9mZnNldCxnLGIub2Zmc2V0K2IubGVuZ3RoKSl9fWlmKG4pe3ZhciB3PW4uc3RhcnQuY29sdW1uLEU9bi5zdGFydC5jb2x1bW4sZz0wLGg9by5sZW5ndGgtMTt3aGlsZShnPGgmJm9bZ10uc3RhcnQuY29sdW1uPHcmJm9bZ10uc3RhcnQucm93PT1uLnN0YXJ0LnJvdylnKys7d2hpbGUoZzxoJiZvW2hdLmVuZC5jb2x1bW4+RSYmb1toXS5lbmQucm93PT1uLmVuZC5yb3cpaC0tO289by5zbGljZShnLGgrMSk7Zm9yKGc9MCxoPW8ubGVuZ3RoO2c8aDtnKyspb1tnXS5zdGFydC5yb3crPW4uc3RhcnQucm93LG9bZ10uZW5kLnJvdys9bi5zdGFydC5yb3d9cmV0dXJuIG99LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJG9wdGlvbnMscj10aGlzLiRhc3NlbWJsZVJlZ0V4cChuKTtpZihuLiRpc011bHRpTGluZSlyZXR1cm4gdDtpZighcilyZXR1cm47dmFyIGk9ci5leGVjKGUpO2lmKCFpfHxpWzBdLmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7dD1lLnJlcGxhY2Uocix0KTtpZihuLnByZXNlcnZlQ2FzZSl7dD10LnNwbGl0KCIiKTtmb3IodmFyIHM9TWF0aC5taW4oZS5sZW5ndGgsZS5sZW5ndGgpO3MtLTspe3ZhciBvPWVbc107byYmby50b0xvd2VyQ2FzZSgpIT1vP3Rbc109dFtzXS50b1VwcGVyQ2FzZSgpOnRbc109dFtzXS50b0xvd2VyQ2FzZSgpfXQ9dC5qb2luKCIiKX1yZXR1cm4gdH0sdGhpcy4kYXNzZW1ibGVSZWdFeHA9ZnVuY3Rpb24oZSx0KXtpZihlLm5lZWRsZSBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gZS5yZT1lLm5lZWRsZTt2YXIgbj1lLm5lZWRsZTtpZighZS5uZWVkbGUpcmV0dXJuIGUucmU9ITE7ZS5yZWdFeHB8fChuPXIuZXNjYXBlUmVnRXhwKG4pKSxlLndob2xlV29yZCYmKG49dShuLGUpKTt2YXIgaT1lLmNhc2VTZW5zaXRpdmU/ImdtIjoiZ21pIjtlLiRpc011bHRpTGluZT0hdCYmL1tcblxyXS8udGVzdChuKTtpZihlLiRpc011bHRpTGluZSlyZXR1cm4gZS5yZT10aGlzLiRhc3NlbWJsZU11bHRpbGluZVJlZ0V4cChuLGkpO3RyeXt2YXIgcz1uZXcgUmVnRXhwKG4saSl9Y2F0Y2gobyl7cz0hMX1yZXR1cm4gZS5yZT1zfSx0aGlzLiRhc3NlbWJsZU11bHRpbGluZVJlZ0V4cD1mdW5jdGlvbihlLHQpe3ZhciBuPWUucmVwbGFjZSgvXHJcbnxccnxcbi9nLCIkXG5eIikuc3BsaXQoIlxuIikscj1bXTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl0cnl7ci5wdXNoKG5ldyBSZWdFeHAobltpXSx0KSl9Y2F0Y2gocyl7cmV0dXJuITF9cmV0dXJuIHJ9LHRoaXMuJG1hdGNoSXRlcmF0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRhc3NlbWJsZVJlZ0V4cCh0KTtpZighbilyZXR1cm4hMTt2YXIgcj10LmJhY2t3YXJkcz09MSxpPXQuc2tpcEN1cnJlbnQhPTAscz10LnJhbmdlLG89dC5zdGFydDtvfHwobz1zP3Nbcj8iZW5kIjoic3RhcnQiXTplLnNlbGVjdGlvbi5nZXRSYW5nZSgpKSxvLnN0YXJ0JiYobz1vW2khPXI/ImVuZCI6InN0YXJ0Il0pO3ZhciB1PXM/cy5zdGFydC5yb3c6MCxhPXM/cy5lbmQucm93OmUuZ2V0TGVuZ3RoKCktMTtpZihyKXZhciBmPWZ1bmN0aW9uKGUpe3ZhciBuPW8ucm93O2lmKGMobixvLmNvbHVtbixlKSlyZXR1cm47Zm9yKG4tLTtuPj11O24tLSlpZihjKG4sTnVtYmVyLk1BWF9WQUxVRSxlKSlyZXR1cm47aWYodC53cmFwPT0wKXJldHVybjtmb3Iobj1hLHU9by5yb3c7bj49dTtuLS0paWYoYyhuLE51bWJlci5NQVhfVkFMVUUsZSkpcmV0dXJufTtlbHNlIHZhciBmPWZ1bmN0aW9uKGUpe3ZhciBuPW8ucm93O2lmKGMobixvLmNvbHVtbixlKSlyZXR1cm47Zm9yKG4rPTE7bjw9YTtuKyspaWYoYyhuLDAsZSkpcmV0dXJuO2lmKHQud3JhcD09MClyZXR1cm47Zm9yKG49dSxhPW8ucm93O248PWE7bisrKWlmKGMobiwwLGUpKXJldHVybn07aWYodC4kaXNNdWx0aUxpbmUpdmFyIGw9bi5sZW5ndGgsYz1mdW5jdGlvbih0LGkscyl7dmFyIG89cj90LWwrMTp0O2lmKG88MClyZXR1cm47dmFyIHU9ZS5nZXRMaW5lKG8pLGE9dS5zZWFyY2goblswXSk7aWYoIXImJmE8aXx8YT09PS0xKXJldHVybjtmb3IodmFyIGY9MTtmPGw7ZisrKXt1PWUuZ2V0TGluZShvK2YpO2lmKHUuc2VhcmNoKG5bZl0pPT0tMSlyZXR1cm59dmFyIGM9dS5tYXRjaChuW2wtMV0pWzBdLmxlbmd0aDtpZihyJiZjPmkpcmV0dXJuO2lmKHMobyxhLG8rbC0xLGMpKXJldHVybiEwfTtlbHNlIGlmKHIpdmFyIGM9ZnVuY3Rpb24odCxyLGkpe3ZhciBzPWUuZ2V0TGluZSh0KSxvPVtdLHUsYT0wO24ubGFzdEluZGV4PTA7d2hpbGUodT1uLmV4ZWMocykpe3ZhciBmPXVbMF0ubGVuZ3RoO2E9dS5pbmRleDtpZighZil7aWYoYT49cy5sZW5ndGgpYnJlYWs7bi5sYXN0SW5kZXg9YSs9MX1pZih1LmluZGV4K2Y+cilicmVhaztvLnB1c2godS5pbmRleCxmKX1mb3IodmFyIGw9by5sZW5ndGgtMTtsPj0wO2wtPTIpe3ZhciBjPW9bbC0xXSxmPW9bbF07aWYoaSh0LGMsdCxjK2YpKXJldHVybiEwfX07ZWxzZSB2YXIgYz1mdW5jdGlvbih0LHIsaSl7dmFyIHM9ZS5nZXRMaW5lKHQpLG8sdTtuLmxhc3RJbmRleD1yO3doaWxlKHU9bi5leGVjKHMpKXt2YXIgYT11WzBdLmxlbmd0aDtvPXUuaW5kZXg7aWYoaSh0LG8sdCxvK2EpKXJldHVybiEwO2lmKCFhKXtuLmxhc3RJbmRleD1vKz0xO2lmKG8+PXMubGVuZ3RoKXJldHVybiExfX19O3JldHVybntmb3JFYWNoOmZ9fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuU2VhcmNoPW99KSxhY2UuZGVmaW5lKCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXt0aGlzLnBsYXRmb3JtPXR8fChpLmlzTWFjPyJtYWMiOiJ3aW4iKSx0aGlzLmNvbW1hbmRzPXt9LHRoaXMuY29tbWFuZEtleUJpbmRpbmc9e30sdGhpcy5hZGRDb21tYW5kcyhlKSx0aGlzLiRzaW5nbGVDb21tYW5kPSEwfWZ1bmN0aW9uIHUoZSx0KXtvLmNhbGwodGhpcyxlLHQpLHRoaXMuJHNpbmdsZUNvbW1hbmQ9ITF9dmFyIHI9ZSgiLi4vbGliL2tleXMiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPXIuS0VZX01PRFM7dS5wcm90b3R5cGU9by5wcm90b3R5cGUsZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUuYmluZEtleSYmZS5iaW5kS2V5LnBvc2l0aW9ufHwoZS5pc0RlZmF1bHQ/LTEwMDowKX10aGlzLmFkZENvbW1hbmQ9ZnVuY3Rpb24oZSl7dGhpcy5jb21tYW5kc1tlLm5hbWVdJiZ0aGlzLnJlbW92ZUNvbW1hbmQoZSksdGhpcy5jb21tYW5kc1tlLm5hbWVdPWUsZS5iaW5kS2V5JiZ0aGlzLl9idWlsZEtleUhhc2goZSl9LHRoaXMucmVtb3ZlQ29tbWFuZD1mdW5jdGlvbihlLHQpe3ZhciBuPWUmJih0eXBlb2YgZT09InN0cmluZyI/ZTplLm5hbWUpO2U9dGhpcy5jb21tYW5kc1tuXSx0fHxkZWxldGUgdGhpcy5jb21tYW5kc1tuXTt2YXIgcj10aGlzLmNvbW1hbmRLZXlCaW5kaW5nO2Zvcih2YXIgaSBpbiByKXt2YXIgcz1yW2ldO2lmKHM9PWUpZGVsZXRlIHJbaV07ZWxzZSBpZihBcnJheS5pc0FycmF5KHMpKXt2YXIgbz1zLmluZGV4T2YoZSk7byE9LTEmJihzLnNwbGljZShvLDEpLHMubGVuZ3RoPT0xJiYocltpXT1zWzBdKSl9fX0sdGhpcy5iaW5kS2V5PWZ1bmN0aW9uKGUsdCxuKXt0eXBlb2YgZT09Im9iamVjdCImJmUmJihuPT11bmRlZmluZWQmJihuPWUucG9zaXRpb24pLGU9ZVt0aGlzLnBsYXRmb3JtXSk7aWYoIWUpcmV0dXJuO2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0aGlzLmFkZENvbW1hbmQoe2V4ZWM6dCxiaW5kS2V5OmUsbmFtZTp0Lm5hbWV8fGV9KTtlLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj0iIjtpZihlLmluZGV4T2YoIiAiKSE9LTEpe3ZhciBpPWUuc3BsaXQoL1xzKy8pO2U9aS5wb3AoKSxpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJzZUtleXMoZSksbj1zW3QuaGFzaElkXSt0LmtleTtyKz0ocj8iICI6IiIpK24sdGhpcy5fYWRkQ29tbWFuZFRvQmluZGluZyhyLCJjaGFpbktleXMiKX0sdGhpcykscis9IiAifXZhciBvPXRoaXMucGFyc2VLZXlzKGUpLHU9c1tvLmhhc2hJZF0rby5rZXk7dGhpcy5fYWRkQ29tbWFuZFRvQmluZGluZyhyK3UsdCxuKX0sdGhpcyl9LHRoaXMuX2FkZENvbW1hbmRUb0JpbmRpbmc9ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMuY29tbWFuZEtleUJpbmRpbmcscztpZighbilkZWxldGUgaVt0XTtlbHNlIGlmKCFpW3RdfHx0aGlzLiRzaW5nbGVDb21tYW5kKWlbdF09bjtlbHNle0FycmF5LmlzQXJyYXkoaVt0XSk/KHM9aVt0XS5pbmRleE9mKG4pKSE9LTEmJmlbdF0uc3BsaWNlKHMsMSk6aVt0XT1baVt0XV0sdHlwZW9mIHIhPSJudW1iZXIiJiYocj1lKG4pKTt2YXIgbz1pW3RdO2ZvcihzPTA7czxvLmxlbmd0aDtzKyspe3ZhciB1PW9bc10sYT1lKHUpO2lmKGE+cilicmVha31vLnNwbGljZShzLDAsbil9fSx0aGlzLmFkZENvbW1hbmRzPWZ1bmN0aW9uKGUpe2UmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZVt0XTtpZighbilyZXR1cm47aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiB0aGlzLmJpbmRLZXkobix0KTt0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmKG49e2V4ZWM6bn0pO2lmKHR5cGVvZiBuIT0ib2JqZWN0IilyZXR1cm47bi5uYW1lfHwobi5uYW1lPXQpLHRoaXMuYWRkQ29tbWFuZChuKX0sdGhpcyl9LHRoaXMucmVtb3ZlQ29tbWFuZHM9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLnJlbW92ZUNvbW1hbmQoZVt0XSl9LHRoaXMpfSx0aGlzLmJpbmRLZXlzPWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5iaW5kS2V5KHQsZVt0XSl9LHRoaXMpfSx0aGlzLl9idWlsZEtleUhhc2g9ZnVuY3Rpb24oZSl7dGhpcy5iaW5kS2V5KGUuYmluZEtleSxlKX0sdGhpcy5wYXJzZUtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9bXC1cK10oW1wtXCtdKT8vKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxuPXQucG9wKCksaT1yW25dO2lmKHIuRlVOQ1RJT05fS0VZU1tpXSluPXIuRlVOQ1RJT05fS0VZU1tpXS50b0xvd2VyQ2FzZSgpO2Vsc2V7aWYoIXQubGVuZ3RoKXJldHVybntrZXk6bixoYXNoSWQ6LTF9O2lmKHQubGVuZ3RoPT0xJiZ0WzBdPT0ic2hpZnQiKXJldHVybntrZXk6bi50b1VwcGVyQ2FzZSgpLGhhc2hJZDotMX19dmFyIHM9MDtmb3IodmFyIG89dC5sZW5ndGg7by0tOyl7dmFyIHU9ci5LRVlfTU9EU1t0W29dXTtpZih1PT1udWxsKXJldHVybiB0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJmNvbnNvbGUuZXJyb3IoImludmFsaWQgbW9kaWZpZXIgIit0W29dKyIgaW4gIitlKSwhMTtzfD11fXJldHVybntrZXk6bixoYXNoSWQ6c319LHRoaXMuZmluZEtleUNvbW1hbmQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1zW3RdK247cmV0dXJuIHRoaXMuY29tbWFuZEtleUJpbmRpbmdbcl19LHRoaXMuaGFuZGxlS2V5Ym9hcmQ9ZnVuY3Rpb24oZSx0LG4scil7aWYocjwwKXJldHVybjt2YXIgaT1zW3RdK24sbz10aGlzLmNvbW1hbmRLZXlCaW5kaW5nW2ldO2UuJGtleUNoYWluJiYoZS4ka2V5Q2hhaW4rPSIgIitpLG89dGhpcy5jb21tYW5kS2V5QmluZGluZ1tlLiRrZXlDaGFpbl18fG8pO2lmKG8paWYobz09ImNoYWluS2V5cyJ8fG9bby5sZW5ndGgtMV09PSJjaGFpbktleXMiKXJldHVybiBlLiRrZXlDaGFpbj1lLiRrZXlDaGFpbnx8aSx7Y29tbWFuZDoibnVsbCJ9O2lmKGUuJGtleUNoYWluKWlmKCEhdCYmdCE9NHx8bi5sZW5ndGghPTEpe2lmKHQ9PS0xfHxyPjApZS4ka2V5Q2hhaW49IiJ9ZWxzZSBlLiRrZXlDaGFpbj1lLiRrZXlDaGFpbi5zbGljZSgwLC1pLmxlbmd0aC0xKTtyZXR1cm57Y29tbWFuZDpvfX0sdGhpcy5nZXRTdGF0dXNUZXh0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuJGtleUNoYWlufHwiIn19LmNhbGwoby5wcm90b3R5cGUpLHQuSGFzaEhhbmRsZXI9byx0Lk11bHRpSGFzaEhhbmRsZXI9dX0pLGFjZS5kZWZpbmUoImFjZS9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2tleWJvYXJkL2hhc2hfaGFuZGxlciIpLk11bHRpSGFzaEhhbmRsZXIscz1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWZ1bmN0aW9uKGUsdCl7aS5jYWxsKHRoaXMsdCxlKSx0aGlzLmJ5TmFtZT10aGlzLmNvbW1hbmRzLHRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoImV4ZWMiLGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbW1hbmQuZXhlYyhlLmVkaXRvcixlLmFyZ3N8fHt9KX0pfTtyLmluaGVyaXRzKG8saSksZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuZXhlYz1mdW5jdGlvbihlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPWUubGVuZ3RoO3ItLTspaWYodGhpcy5leGVjKGVbcl0sdCxuKSlyZXR1cm4hMDtyZXR1cm4hMX10eXBlb2YgZT09InN0cmluZyImJihlPXRoaXMuY29tbWFuZHNbZV0pO2lmKCFlKXJldHVybiExO2lmKHQmJnQuJHJlYWRPbmx5JiYhZS5yZWFkT25seSlyZXR1cm4hMTtpZih0aGlzLiRjaGVja0NvbW1hbmRTdGF0ZSE9MCYmZS5pc0F2YWlsYWJsZSYmIWUuaXNBdmFpbGFibGUodCkpcmV0dXJuITE7dmFyIGk9e2VkaXRvcjp0LGNvbW1hbmQ6ZSxhcmdzOm59O3JldHVybiBpLnJldHVyblZhbHVlPXRoaXMuX2VtaXQoImV4ZWMiLGkpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJFeGVjIixpKSxpLnJldHVyblZhbHVlPT09ITE/ITE6ITB9LHRoaXMudG9nZ2xlUmVjb3JkaW5nPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGluUmVwbGF5KXJldHVybjtyZXR1cm4gZSYmZS5fZW1pdCgiY2hhbmdlU3RhdHVzIiksdGhpcy5yZWNvcmRpbmc/KHRoaXMubWFjcm8ucG9wKCksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJleGVjIix0aGlzLiRhZGRDb21tYW5kVG9NYWNybyksdGhpcy5tYWNyby5sZW5ndGh8fCh0aGlzLm1hY3JvPXRoaXMub2xkTWFjcm8pLHRoaXMucmVjb3JkaW5nPSExKToodGhpcy4kYWRkQ29tbWFuZFRvTWFjcm98fCh0aGlzLiRhZGRDb21tYW5kVG9NYWNybz1mdW5jdGlvbihlKXt0aGlzLm1hY3JvLnB1c2goW2UuY29tbWFuZCxlLmFyZ3NdKX0uYmluZCh0aGlzKSksdGhpcy5vbGRNYWNybz10aGlzLm1hY3JvLHRoaXMubWFjcm89W10sdGhpcy5vbigiZXhlYyIsdGhpcy4kYWRkQ29tbWFuZFRvTWFjcm8pLHRoaXMucmVjb3JkaW5nPSEwKX0sdGhpcy5yZXBsYXk9ZnVuY3Rpb24oZSl7aWYodGhpcy4kaW5SZXBsYXl8fCF0aGlzLm1hY3JvKXJldHVybjtpZih0aGlzLnJlY29yZGluZylyZXR1cm4gdGhpcy50b2dnbGVSZWNvcmRpbmcoZSk7dHJ5e3RoaXMuJGluUmVwbGF5PSEwLHRoaXMubWFjcm8uZm9yRWFjaChmdW5jdGlvbih0KXt0eXBlb2YgdD09InN0cmluZyI/dGhpcy5leGVjKHQsZSk6dGhpcy5leGVjKHRbMF0sZSx0WzFdKX0sdGhpcyl9ZmluYWxseXt0aGlzLiRpblJlcGxheT0hMX19LHRoaXMudHJpbU1hY3JvPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGVbMF0hPSJzdHJpbmciJiYoZVswXT1lWzBdLm5hbWUpLGVbMV18fChlPWVbMF0pLGV9KX19LmNhbGwoby5wcm90b3R5cGUpLHQuQ29tbWFuZE1hbmFnZXI9b30pLGFjZS5kZWZpbmUoImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2NvbmZpZyIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3JldHVybnt3aW46ZSxtYWM6dH19dmFyIHI9ZSgiLi4vbGliL2xhbmciKSxpPWUoIi4uL2NvbmZpZyIpLHM9ZSgiLi4vcmFuZ2UiKS5SYW5nZTt0LmNvbW1hbmRzPVt7bmFtZToic2hvd1NldHRpbmdzTWVudSIsYmluZEtleTpvKCJDdHJsLSwiLCJDb21tYW5kLSwiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiYWNlL2V4dC9zZXR0aW5nc19tZW51IixmdW5jdGlvbih0KXt0LmluaXQoZSksZS5zaG93U2V0dGluZ3NNZW51KCl9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb1RvTmV4dEVycm9yIixiaW5kS2V5Om8oIkFsdC1FIiwiRjQiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiLi9leHQvZXJyb3JfbWFya2VyIixmdW5jdGlvbih0KXt0LnNob3dFcnJvck1hcmtlcihlLDEpfSl9LHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6ImdvVG9QcmV2aW91c0Vycm9yIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1FIiwiU2hpZnQtRjQiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiLi9leHQvZXJyb3JfbWFya2VyIixmdW5jdGlvbih0KXt0LnNob3dFcnJvck1hcmtlcihlLC0xKX0pfSxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RhbGwiLGRlc2NyaXB0aW9uOiJTZWxlY3QgYWxsIixiaW5kS2V5Om8oIkN0cmwtQSIsIkNvbW1hbmQtQSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RBbGwoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJjZW50ZXJzZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJDZW50ZXIgc2VsZWN0aW9uIixiaW5kS2V5Om8obnVsbCwiQ3RybC1MIiksZXhlYzpmdW5jdGlvbihlKXtlLmNlbnRlclNlbGVjdGlvbigpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lIixkZXNjcmlwdGlvbjoiR28gdG8gbGluZS4uLiIsYmluZEtleTpvKCJDdHJsLUwiLCJDb21tYW5kLUwiKSxleGVjOmZ1bmN0aW9uKGUsdCl7dHlwZW9mIHQ9PSJudW1iZXIiJiYhaXNOYU4odCkmJmUuZ290b0xpbmUodCksZS5wcm9tcHQoeyR0eXBlOiJnb3RvTGluZSJ9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkIixiaW5kS2V5Om8oIkFsdC1MfEN0cmwtRjEiLCJDb21tYW5kLUFsdC1MfENvbW1hbmQtRjEiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkKCExKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidW5mb2xkIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1MfEN0cmwtU2hpZnQtRjEiLCJDb21tYW5kLUFsdC1TaGlmdC1MfENvbW1hbmQtU2hpZnQtRjEiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkKCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlRm9sZFdpZGdldCIsYmluZEtleTpvKCJGMiIsIkYyIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZFdpZGdldCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVQYXJlbnRGb2xkV2lkZ2V0IixiaW5kS2V5Om8oIkFsdC1GMiIsIkFsdC1GMiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGRXaWRnZXQoITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkYWxsIixkZXNjcmlwdGlvbjoiRm9sZCBhbGwiLGJpbmRLZXk6byhudWxsLCJDdHJsLUNvbW1hbmQtT3B0aW9uLTAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi5mb2xkQWxsKCl9LHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZE90aGVyIixkZXNjcmlwdGlvbjoiRm9sZCBvdGhlciIsYmluZEtleTpvKCJBbHQtMCIsIkNvbW1hbmQtT3B0aW9uLTAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi5mb2xkQWxsKCksZS5zZXNzaW9uLnVuZm9sZChlLnNlbGVjdGlvbi5nZXRBbGxSYW5nZXMoKSl9LHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidW5mb2xkYWxsIixkZXNjcmlwdGlvbjoiVW5mb2xkIGFsbCIsYmluZEtleTpvKCJBbHQtU2hpZnQtMCIsIkNvbW1hbmQtT3B0aW9uLVNoaWZ0LTAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi51bmZvbGQoKX0sc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kbmV4dCIsZGVzY3JpcHRpb246IkZpbmQgbmV4dCIsYmluZEtleTpvKCJDdHJsLUsiLCJDb21tYW5kLUciKSxleGVjOmZ1bmN0aW9uKGUpe2UuZmluZE5leHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZHByZXZpb3VzIixkZXNjcmlwdGlvbjoiRmluZCBwcmV2aW91cyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUsiLCJDb21tYW5kLVNoaWZ0LUciKSxleGVjOmZ1bmN0aW9uKGUpe2UuZmluZFByZXZpb3VzKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE9yRmluZE5leHQiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgb3IgZmluZCBuZXh0IixiaW5kS2V5Om8oIkFsdC1LIiwiQ3RybC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdGlvbi5pc0VtcHR5KCk/ZS5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOmUuZmluZE5leHQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RPckZpbmRQcmV2aW91cyIsZGVzY3JpcHRpb246IlNlbGVjdCBvciBmaW5kIHByZXZpb3VzIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1LIiwiQ3RybC1TaGlmdC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdGlvbi5pc0VtcHR5KCk/ZS5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOmUuZmluZFByZXZpb3VzKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZCIsZGVzY3JpcHRpb246IkZpbmQiLGJpbmRLZXk6bygiQ3RybC1GIiwiQ29tbWFuZC1GIiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoImFjZS9leHQvc2VhcmNoYm94IixmdW5jdGlvbih0KXt0LlNlYXJjaChlKX0pfSxyZWFkT25seTohMH0se25hbWU6Im92ZXJ3cml0ZSIsZGVzY3JpcHRpb246Ik92ZXJ3cml0ZSIsYmluZEtleToiSW5zZXJ0IixleGVjOmZ1bmN0aW9uKGUpe2UudG9nZ2xlT3ZlcndyaXRlKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9zdGFydCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBzdGFydCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUhvbWUiLCJDb21tYW5kLVNoaWZ0LUhvbWV8Q29tbWFuZC1TaGlmdC1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6ImdvdG9zdGFydCIsZGVzY3JpcHRpb246IkdvIHRvIHN0YXJ0IixiaW5kS2V5Om8oIkN0cmwtSG9tZSIsIkNvbW1hbmQtSG9tZXxDb21tYW5kLVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlRmlsZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJzZWxlY3R1cCIsZGVzY3JpcHRpb246IlNlbGVjdCB1cCIsYmluZEtleTpvKCJTaGlmdC1VcCIsIlNoaWZ0LVVwfEN0cmwtU2hpZnQtUCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RVcCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb2xpbmV1cCIsZGVzY3JpcHRpb246IkdvIGxpbmUgdXAiLGJpbmRLZXk6bygiVXAiLCJVcHxDdHJsLVAiKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZVVwKHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2VuZCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBlbmQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1FbmQiLCJDb21tYW5kLVNoaWZ0LUVuZHxDb21tYW5kLVNoaWZ0LURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToiZ290b2VuZCIsZGVzY3JpcHRpb246IkdvIHRvIGVuZCIsYmluZEtleTpvKCJDdHJsLUVuZCIsIkNvbW1hbmQtRW5kfENvbW1hbmQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUZpbGVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6InNlbGVjdGRvd24iLGRlc2NyaXB0aW9uOiJTZWxlY3QgZG93biIsYmluZEtleTpvKCJTaGlmdC1Eb3duIiwiU2hpZnQtRG93bnxDdHJsLVNoaWZ0LU4iKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RG93bigpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb2xpbmVkb3duIixkZXNjcmlwdGlvbjoiR28gbGluZSBkb3duIixiaW5kS2V5Om8oIkRvd24iLCJEb3dufEN0cmwtTiIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlRG93bih0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0d29yZGxlZnQiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgd29yZCBsZWZ0IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtTGVmdCIsIk9wdGlvbi1TaGlmdC1MZWZ0IiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG93b3JkbGVmdCIsZGVzY3JpcHRpb246IkdvIHRvIHdvcmQgbGVmdCIsYmluZEtleTpvKCJDdHJsLUxlZnQiLCJPcHRpb24tTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZVdvcmRMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIGxpbmUgc3RhcnQiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUxlZnQiLCJDb21tYW5kLVNoaWZ0LUxlZnR8Q3RybC1TaGlmdC1BIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiR28gdG8gbGluZSBzdGFydCIsYmluZEtleTpvKCJBbHQtTGVmdHxIb21lIiwiQ29tbWFuZC1MZWZ0fEhvbWV8Q3RybC1BIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlTGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxlZnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbGVmdCIsYmluZEtleTpvKCJTaGlmdC1MZWZ0IiwiU2hpZnQtTGVmdHxDdHJsLVNoaWZ0LUIiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGVmdCIsZGVzY3JpcHRpb246IkdvIHRvIGxlZnQiLGJpbmRLZXk6bygiTGVmdCIsIkxlZnR8Q3RybC1CIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVMZWZ0KHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R3b3JkcmlnaHQiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgd29yZCByaWdodCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVJpZ2h0IiwiT3B0aW9uLVNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvd29yZHJpZ2h0IixkZXNjcmlwdGlvbjoiR28gdG8gd29yZCByaWdodCIsYmluZEtleTpvKCJDdHJsLVJpZ2h0IiwiT3B0aW9uLVJpZ2h0IiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlV29yZFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbGluZWVuZCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBsaW5lIGVuZCIsYmluZEtleTpvKCJBbHQtU2hpZnQtUmlnaHQiLCJDb21tYW5kLVNoaWZ0LVJpZ2h0fFNoaWZ0LUVuZHxDdHJsLVNoaWZ0LUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZWVuZCIsZGVzY3JpcHRpb246IkdvIHRvIGxpbmUgZW5kIixiaW5kS2V5Om8oIkFsdC1SaWdodHxFbmQiLCJDb21tYW5kLVJpZ2h0fEVuZHxDdHJsLUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVMaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHJpZ2h0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHJpZ2h0IixiaW5kS2V5Om8oIlNoaWZ0LVJpZ2h0IiwiU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0UmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3JpZ2h0IixkZXNjcmlwdGlvbjoiR28gdG8gcmlnaHQiLGJpbmRLZXk6bygiUmlnaHQiLCJSaWdodHxDdHJsLUYiKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZVJpZ2h0KHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RwYWdlZG93biIsZGVzY3JpcHRpb246IlNlbGVjdCBwYWdlIGRvd24iLGJpbmRLZXk6IlNoaWZ0LVBhZ2VEb3duIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0UGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJwYWdlZG93biIsZGVzY3JpcHRpb246IlBhZ2UgZG93biIsYmluZEtleTpvKG51bGwsIk9wdGlvbi1QYWdlRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zY3JvbGxQYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9wYWdlZG93biIsZGVzY3JpcHRpb246IkdvIHRvIHBhZ2UgZG93biIsYmluZEtleTpvKCJQYWdlRG93biIsIlBhZ2VEb3dufEN0cmwtViIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nb3RvUGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RwYWdldXAiLGRlc2NyaXB0aW9uOiJTZWxlY3QgcGFnZSB1cCIsYmluZEtleToiU2hpZnQtUGFnZVVwIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0UGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicGFnZXVwIixkZXNjcmlwdGlvbjoiUGFnZSB1cCIsYmluZEtleTpvKG51bGwsIk9wdGlvbi1QYWdlVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Nyb2xsUGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3BhZ2V1cCIsZGVzY3JpcHRpb246IkdvIHRvIHBhZ2UgdXAiLGJpbmRLZXk6IlBhZ2VVcCIsZXhlYzpmdW5jdGlvbihlKXtlLmdvdG9QYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzY3JvbGx1cCIsZGVzY3JpcHRpb246IlNjcm9sbCB1cCIsYmluZEtleTpvKCJDdHJsLVVwIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuc2Nyb2xsQnkoMCwtMiplLnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpfSxyZWFkT25seTohMH0se25hbWU6InNjcm9sbGRvd24iLGRlc2NyaXB0aW9uOiJTY3JvbGwgZG93biIsYmluZEtleTpvKCJDdHJsLURvd24iLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci5zY3JvbGxCeSgwLDIqZS5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsaW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbGluZSBzdGFydCIsYmluZEtleToiU2hpZnQtSG9tZSIsZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsaW5lZW5kIixkZXNjcmlwdGlvbjoiU2VsZWN0IGxpbmUgZW5kIixiaW5kS2V5OiJTaGlmdC1FbmQiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InRvZ2dsZXJlY29yZGluZyIsZGVzY3JpcHRpb246IlRvZ2dsZSByZWNvcmRpbmciLGJpbmRLZXk6bygiQ3RybC1BbHQtRSIsIkNvbW1hbmQtT3B0aW9uLUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29tbWFuZHMudG9nZ2xlUmVjb3JkaW5nKGUpfSxyZWFkT25seTohMH0se25hbWU6InJlcGxheW1hY3JvIixkZXNjcmlwdGlvbjoiUmVwbGF5IG1hY3JvIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRSIsIkNvbW1hbmQtU2hpZnQtRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb21tYW5kcy5yZXBsYXkoZSl9LHJlYWRPbmx5OiEwfSx7bmFtZToianVtcHRvbWF0Y2hpbmciLGRlc2NyaXB0aW9uOiJKdW1wIHRvIG1hdGNoaW5nIixiaW5kS2V5Om8oIkN0cmwtXFx8Q3RybC1QIiwiQ29tbWFuZC1cXCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5qdW1wVG9NYXRjaGluZygpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9tYXRjaGluZyIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBtYXRjaGluZyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVxcfEN0cmwtU2hpZnQtUCIsIkNvbW1hbmQtU2hpZnQtXFwiKSxleGVjOmZ1bmN0aW9uKGUpe2UuanVtcFRvTWF0Y2hpbmcoITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToiZXhwYW5kVG9NYXRjaGluZyIsZGVzY3JpcHRpb246IkV4cGFuZCB0byBtYXRjaGluZyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LU0iLCJDdHJsLVNoaWZ0LU0iKSxleGVjOmZ1bmN0aW9uKGUpe2UuanVtcFRvTWF0Y2hpbmcoITAsITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToicGFzc0tleXNUb0Jyb3dzZXIiLGRlc2NyaXB0aW9uOiJQYXNzIGtleXMgdG8gYnJvd3NlciIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbigpe30scGFzc0V2ZW50OiEwLHJlYWRPbmx5OiEwfSx7bmFtZToiY29weSIsZGVzY3JpcHRpb246IkNvcHkiLGV4ZWM6ZnVuY3Rpb24oZSl7fSxyZWFkT25seTohMH0se25hbWU6ImN1dCIsZGVzY3JpcHRpb246IkN1dCIsZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLiRjb3B5V2l0aEVtcHR5U2VsZWN0aW9uJiZlLnNlbGVjdGlvbi5pc0VtcHR5KCksbj10P2Uuc2VsZWN0aW9uLmdldExpbmVSYW5nZSgpOmUuc2VsZWN0aW9uLmdldFJhbmdlKCk7ZS5fZW1pdCgiY3V0IixuKSxuLmlzRW1wdHkoKXx8ZS5zZXNzaW9uLnJlbW92ZShuKSxlLmNsZWFyU2VsZWN0aW9uKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6InBhc3RlIixkZXNjcmlwdGlvbjoiUGFzdGUiLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLiRoYW5kbGVQYXN0ZSh0KX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmVsaW5lIixkZXNjcmlwdGlvbjoiUmVtb3ZlIGxpbmUiLGJpbmRLZXk6bygiQ3RybC1EIiwiQ29tbWFuZC1EIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZUxpbmVzKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSJ9LHtuYW1lOiJkdXBsaWNhdGVTZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJEdXBsaWNhdGUgc2VsZWN0aW9uIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRCIsIkNvbW1hbmQtU2hpZnQtRCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5kdXBsaWNhdGVTZWxlY3Rpb24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToic29ydGxpbmVzIixkZXNjcmlwdGlvbjoiU29ydCBsaW5lcyIsYmluZEtleTpvKCJDdHJsLUFsdC1TIiwiQ29tbWFuZC1BbHQtUyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zb3J0TGluZXMoKX0sc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvbiIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIn0se25hbWU6InRvZ2dsZWNvbW1lbnQiLGRlc2NyaXB0aW9uOiJUb2dnbGUgY29tbWVudCIsYmluZEtleTpvKCJDdHJsLS8iLCJDb21tYW5kLS8iKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9nZ2xlQ29tbWVudExpbmVzKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToidG9nZ2xlQmxvY2tDb21tZW50IixkZXNjcmlwdGlvbjoiVG9nZ2xlIGJsb2NrIGNvbW1lbnQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC0vIiwiQ29tbWFuZC1TaGlmdC0vIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvZ2dsZUJsb2NrQ29tbWVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToibW9kaWZ5TnVtYmVyVXAiLGRlc2NyaXB0aW9uOiJNb2RpZnkgbnVtYmVyIHVwIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtVXAiLCJBbHQtU2hpZnQtVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UubW9kaWZ5TnVtYmVyKDEpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJtb2RpZnlOdW1iZXJEb3duIixkZXNjcmlwdGlvbjoiTW9kaWZ5IG51bWJlciBkb3duIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRG93biIsIkFsdC1TaGlmdC1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vZGlmeU51bWJlcigtMSl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6InJlcGxhY2UiLGRlc2NyaXB0aW9uOiJSZXBsYWNlIixiaW5kS2V5Om8oIkN0cmwtSCIsIkNvbW1hbmQtT3B0aW9uLUYiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiYWNlL2V4dC9zZWFyY2hib3giLGZ1bmN0aW9uKHQpe3QuU2VhcmNoKGUsITApfSl9fSx7bmFtZToidW5kbyIsZGVzY3JpcHRpb246IlVuZG8iLGJpbmRLZXk6bygiQ3RybC1aIiwiQ29tbWFuZC1aIiksZXhlYzpmdW5jdGlvbihlKXtlLnVuZG8oKX19LHtuYW1lOiJyZWRvIixkZXNjcmlwdGlvbjoiUmVkbyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVp8Q3RybC1ZIiwiQ29tbWFuZC1TaGlmdC1afENvbW1hbmQtWSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZWRvKCl9fSx7bmFtZToiY29weWxpbmVzdXAiLGRlc2NyaXB0aW9uOiJDb3B5IGxpbmVzIHVwIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1VcCIsIkNvbW1hbmQtT3B0aW9uLVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvcHlMaW5lc1VwKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToibW92ZWxpbmVzdXAiLGRlc2NyaXB0aW9uOiJNb3ZlIGxpbmVzIHVwIixiaW5kS2V5Om8oIkFsdC1VcCIsIk9wdGlvbi1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb3ZlTGluZXNVcCgpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImNvcHlsaW5lc2Rvd24iLGRlc2NyaXB0aW9uOiJDb3B5IGxpbmVzIGRvd24iLGJpbmRLZXk6bygiQWx0LVNoaWZ0LURvd24iLCJDb21tYW5kLU9wdGlvbi1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvcHlMaW5lc0Rvd24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJtb3ZlbGluZXNkb3duIixkZXNjcmlwdGlvbjoiTW92ZSBsaW5lcyBkb3duIixiaW5kS2V5Om8oIkFsdC1Eb3duIiwiT3B0aW9uLURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UubW92ZUxpbmVzRG93bigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImRlbCIsZGVzY3JpcHRpb246IkRlbGV0ZSIsYmluZEtleTpvKCJEZWxldGUiLCJEZWxldGV8Q3RybC1EfFNoaWZ0LURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmUoInJpZ2h0Iil9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImJhY2tzcGFjZSIsZGVzY3JpcHRpb246IkJhY2tzcGFjZSIsYmluZEtleTpvKCJTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlIiwiQ3RybC1CYWNrc3BhY2V8U2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZXxDdHJsLUgiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlKCJsZWZ0Iil9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImN1dF9vcl9kZWxldGUiLGRlc2NyaXB0aW9uOiJDdXQgb3IgZGVsZXRlIixiaW5kS2V5Om8oIlNoaWZ0LURlbGV0ZSIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtpZighZS5zZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybiExO2UucmVtb3ZlKCJsZWZ0Iil9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgc3RhcnQiLGJpbmRLZXk6bygiQWx0LUJhY2tzcGFjZSIsIkNvbW1hbmQtQmFja3NwYWNlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVRvTGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZWVuZCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIGVuZCIsYmluZEtleTpvKCJBbHQtRGVsZXRlIiwiQ3RybC1LfENvbW1hbmQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVRvTGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVzdGFydGhhcmQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBzdGFydCBoYXJkIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtQmFja3NwYWNlIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5zdGFydC5jb2x1bW49MCxlLnNlc3Npb24ucmVtb3ZlKHQpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVlbmRoYXJkIixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgZW5kIGhhcmQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1EZWxldGUiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0LmVuZC5jb2x1bW49TnVtYmVyLk1BWF9WQUxVRSxlLnNlc3Npb24ucmVtb3ZlKHQpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV3b3JkbGVmdCIsZGVzY3JpcHRpb246IlJlbW92ZSB3b3JkIGxlZnQiLGJpbmRLZXk6bygiQ3RybC1CYWNrc3BhY2UiLCJBbHQtQmFja3NwYWNlfEN0cmwtQWx0LUJhY2tzcGFjZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVXb3JkTGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV3b3JkcmlnaHQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgd29yZCByaWdodCIsYmluZEtleTpvKCJDdHJsLURlbGV0ZSIsIkFsdC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlV29yZFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Im91dGRlbnQiLGRlc2NyaXB0aW9uOiJPdXRkZW50IixiaW5kS2V5Om8oIlNoaWZ0LVRhYiIsIlNoaWZ0LVRhYiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5ibG9ja091dGRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6ImluZGVudCIsZGVzY3JpcHRpb246IkluZGVudCIsYmluZEtleTpvKCJUYWIiLCJUYWIiKSxleGVjOmZ1bmN0aW9uKGUpe2UuaW5kZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJibG9ja291dGRlbnQiLGRlc2NyaXB0aW9uOiJCbG9jayBvdXRkZW50IixiaW5kS2V5Om8oIkN0cmwtWyIsIkN0cmwtWyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5ibG9ja091dGRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJibG9ja2luZGVudCIsZGVzY3JpcHRpb246IkJsb2NrIGluZGVudCIsYmluZEtleTpvKCJDdHJsLV0iLCJDdHJsLV0iKSxleGVjOmZ1bmN0aW9uKGUpe2UuYmxvY2tJbmRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJpbnNlcnRzdHJpbmciLGRlc2NyaXB0aW9uOiJJbnNlcnQgc3RyaW5nIixleGVjOmZ1bmN0aW9uKGUsdCl7ZS5pbnNlcnQodCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Imluc2VydHRleHQiLGRlc2NyaXB0aW9uOiJJbnNlcnQgdGV4dCIsZXhlYzpmdW5jdGlvbihlLHQpe2UuaW5zZXJ0KHIuc3RyaW5nUmVwZWF0KHQudGV4dHx8IiIsdC50aW1lc3x8MSkpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJzcGxpdGxpbmUiLGRlc2NyaXB0aW9uOiJTcGxpdCBsaW5lIixiaW5kS2V5Om8obnVsbCwiQ3RybC1PIiksZXhlYzpmdW5jdGlvbihlKXtlLnNwbGl0TGluZSgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJ0cmFuc3Bvc2VsZXR0ZXJzIixkZXNjcmlwdGlvbjoiVHJhbnNwb3NlIGxldHRlcnMiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LVgiLCJDdHJsLVQiKSxleGVjOmZ1bmN0aW9uKGUpe2UudHJhbnNwb3NlTGV0dGVycygpfSxtdWx0aVNlbGVjdEFjdGlvbjpmdW5jdGlvbihlKXtlLnRyYW5zcG9zZVNlbGVjdGlvbnMoMSl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToidG91cHBlcmNhc2UiLGRlc2NyaXB0aW9uOiJUbyB1cHBlcmNhc2UiLGJpbmRLZXk6bygiQ3RybC1VIiwiQ3RybC1VIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvVXBwZXJDYXNlKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InRvbG93ZXJjYXNlIixkZXNjcmlwdGlvbjoiVG8gbG93ZXJjYXNlIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtVSIsIkN0cmwtU2hpZnQtVSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b0xvd2VyQ2FzZSgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJleHBhbmR0b2xpbmUiLGRlc2NyaXB0aW9uOiJFeHBhbmQgdG8gbGluZSIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUwiLCJDb21tYW5kLVNoaWZ0LUwiKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5zdGFydC5jb2x1bW49dC5lbmQuY29sdW1uPTAsdC5lbmQucm93KyssZS5zZWxlY3Rpb24uc2V0UmFuZ2UodCwhMSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImpvaW5saW5lcyIsZGVzY3JpcHRpb246IkpvaW4gbGluZXMiLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uaXNCYWNrd2FyZHMoKSxuPXQ/ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpOmUuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkFuY2hvcigpLGk9dD9lLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25BbmNob3IoKTplLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25MZWFkKCksbz1lLnNlc3Npb24uZG9jLmdldExpbmUobi5yb3cpLmxlbmd0aCx1PWUuc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKGUuc2VsZWN0aW9uLmdldFJhbmdlKCkpLGE9dS5yZXBsYWNlKC9cblxzKi8sIiAiKS5sZW5ndGgsZj1lLnNlc3Npb24uZG9jLmdldExpbmUobi5yb3cpO2Zvcih2YXIgbD1uLnJvdysxO2w8PWkucm93KzE7bCsrKXt2YXIgYz1yLnN0cmluZ1RyaW1MZWZ0KHIuc3RyaW5nVHJpbVJpZ2h0KGUuc2Vzc2lvbi5kb2MuZ2V0TGluZShsKSkpO2MubGVuZ3RoIT09MCYmKGM9IiAiK2MpLGYrPWN9aS5yb3crMTxlLnNlc3Npb24uZG9jLmdldExlbmd0aCgpLTEmJihmKz1lLnNlc3Npb24uZG9jLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSksZS5jbGVhclNlbGVjdGlvbigpLGUuc2Vzc2lvbi5kb2MucmVwbGFjZShuZXcgcyhuLnJvdywwLGkucm93KzIsMCksZiksYT4wPyhlLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8obi5yb3csbi5jb2x1bW4pLGUuc2VsZWN0aW9uLnNlbGVjdFRvKG4ucm93LG4uY29sdW1uK2EpKToobz1lLnNlc3Npb24uZG9jLmdldExpbmUobi5yb3cpLmxlbmd0aD5vP28rMTpvLGUuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhuLnJvdyxvKSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMH0se25hbWU6ImludmVydFNlbGVjdGlvbiIsZGVzY3JpcHRpb246IkludmVydCBzZWxlY3Rpb24iLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXNzaW9uLmRvYy5nZXRMZW5ndGgoKS0xLG49ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKHQpLmxlbmd0aCxyPWUuc2VsZWN0aW9uLnJhbmdlTGlzdC5yYW5nZXMsaT1bXTtyLmxlbmd0aDwxJiYocj1bZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKV0pO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKW89PXIubGVuZ3RoLTEmJihyW29dLmVuZC5yb3chPT10fHxyW29dLmVuZC5jb2x1bW4hPT1uKSYmaS5wdXNoKG5ldyBzKHJbb10uZW5kLnJvdyxyW29dLmVuZC5jb2x1bW4sdCxuKSksbz09PTA/KHJbb10uc3RhcnQucm93IT09MHx8cltvXS5zdGFydC5jb2x1bW4hPT0wKSYmaS5wdXNoKG5ldyBzKDAsMCxyW29dLnN0YXJ0LnJvdyxyW29dLnN0YXJ0LmNvbHVtbikpOmkucHVzaChuZXcgcyhyW28tMV0uZW5kLnJvdyxyW28tMV0uZW5kLmNvbHVtbixyW29dLnN0YXJ0LnJvdyxyW29dLnN0YXJ0LmNvbHVtbikpO2UuZXhpdE11bHRpU2VsZWN0TW9kZSgpLGUuY2xlYXJTZWxlY3Rpb24oKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyllLnNlbGVjdGlvbi5hZGRSYW5nZShpW29dLCExKX0scmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6Im5vbmUifSx7bmFtZToib3BlbkNvbW1hbmRQYWxsZXRlIixkZXNjcmlwdGlvbjoiT3BlbiBjb21tYW5kIHBhbGxldGUiLGJpbmRLZXk6bygiRjEiLCJGMSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5wcm9tcHQoeyR0eXBlOiJjb21tYW5kcyJ9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJtb2RlU2VsZWN0IixkZXNjcmlwdGlvbjoiQ2hhbmdlIGxhbmd1YWdlIG1vZGUuLi4iLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5wcm9tcHQoeyR0eXBlOiJtb2RlcyJ9KX0scmVhZE9ubHk6ITB9XX0pLGFjZS5kZWZpbmUoImFjZS9lZGl0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIiwiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS9zZWFyY2giLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIiwiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiLCJhY2UvY29uZmlnIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL2NsaXBib2FyZCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9saWIvbGFuZyIpLG89ZSgiLi9saWIvdXNlcmFnZW50IiksdT1lKCIuL2tleWJvYXJkL3RleHRpbnB1dCIpLlRleHRJbnB1dCxhPWUoIi4vbW91c2UvbW91c2VfaGFuZGxlciIpLk1vdXNlSGFuZGxlcixmPWUoIi4vbW91c2UvZm9sZF9oYW5kbGVyIikuRm9sZEhhbmRsZXIsbD1lKCIuL2tleWJvYXJkL2tleWJpbmRpbmciKS5LZXlCaW5kaW5nLGM9ZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbixoPWUoIi4vc2VhcmNoIikuU2VhcmNoLHA9ZSgiLi9yYW5nZSIpLlJhbmdlLGQ9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix2PWUoIi4vY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIikuQ29tbWFuZE1hbmFnZXIsbT1lKCIuL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKS5jb21tYW5kcyxnPWUoIi4vY29uZmlnIikseT1lKCIuL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixiPWUoIi4vY2xpcGJvYXJkIiksdz1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRDb250YWluZXJFbGVtZW50KCk7dGhpcy5jb250YWluZXI9cix0aGlzLnJlbmRlcmVyPWUsdGhpcy5pZD0iZWRpdG9yIisgKyt3LiR1aWQsdGhpcy5jb21tYW5kcz1uZXcgdihvLmlzTWFjPyJtYWMiOiJ3aW4iLG0pLHR5cGVvZiBkb2N1bWVudD09Im9iamVjdCImJih0aGlzLnRleHRJbnB1dD1uZXcgdShlLmdldFRleHRBcmVhQ29udGFpbmVyKCksdGhpcyksdGhpcy5yZW5kZXJlci50ZXh0YXJlYT10aGlzLnRleHRJbnB1dC5nZXRFbGVtZW50KCksdGhpcy4kbW91c2VIYW5kbGVyPW5ldyBhKHRoaXMpLG5ldyBmKHRoaXMpKSx0aGlzLmtleUJpbmRpbmc9bmV3IGwodGhpcyksdGhpcy4kc2VhcmNoPShuZXcgaCkuc2V0KHt3cmFwOiEwfSksdGhpcy4kaGlzdG9yeVRyYWNrZXI9dGhpcy4kaGlzdG9yeVRyYWNrZXIuYmluZCh0aGlzKSx0aGlzLmNvbW1hbmRzLm9uKCJleGVjIix0aGlzLiRoaXN0b3J5VHJhY2tlciksdGhpcy4kaW5pdE9wZXJhdGlvbkxpc3RlbmVycygpLHRoaXMuXyRlbWl0SW5wdXRFdmVudD1zLmRlbGF5ZWRDYWxsKGZ1bmN0aW9uKCl7dGhpcy5fc2lnbmFsKCJpbnB1dCIse30pLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmJnVG9rZW5pemVyJiZ0aGlzLnNlc3Npb24uYmdUb2tlbml6ZXIuc2NoZWR1bGVTdGFydCgpfS5iaW5kKHRoaXMpKSx0aGlzLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGUsdCl7dC5fJGVtaXRJbnB1dEV2ZW50LnNjaGVkdWxlKDMxKX0pLHRoaXMuc2V0U2Vzc2lvbih0fHxuJiZuLnNlc3Npb258fG5ldyBjKCIiKSksZy5yZXNldE9wdGlvbnModGhpcyksbiYmdGhpcy5zZXRPcHRpb25zKG4pLGcuX3NpZ25hbCgiZWRpdG9yIix0aGlzKX07dy4kdWlkPTAsZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGQpLHRoaXMuJGluaXRPcGVyYXRpb25MaXN0ZW5lcnM9ZnVuY3Rpb24oKXt0aGlzLmNvbW1hbmRzLm9uKCJleGVjIix0aGlzLnN0YXJ0T3BlcmF0aW9uLmJpbmQodGhpcyksITApLHRoaXMuY29tbWFuZHMub24oImFmdGVyRXhlYyIsdGhpcy5lbmRPcGVyYXRpb24uYmluZCh0aGlzKSwhMCksdGhpcy4kb3BSZXNldFRpbWVyPXMuZGVsYXllZENhbGwodGhpcy5lbmRPcGVyYXRpb24uYmluZCh0aGlzLCEwKSksdGhpcy5vbigiY2hhbmdlIixmdW5jdGlvbigpe3RoaXMuY3VyT3B8fCh0aGlzLnN0YXJ0T3BlcmF0aW9uKCksdGhpcy5jdXJPcC5zZWxlY3Rpb25CZWZvcmU9dGhpcy4kbGFzdFNlbCksdGhpcy5jdXJPcC5kb2NDaGFuZ2VkPSEwfS5iaW5kKHRoaXMpLCEwKSx0aGlzLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLGZ1bmN0aW9uKCl7dGhpcy5jdXJPcHx8KHRoaXMuc3RhcnRPcGVyYXRpb24oKSx0aGlzLmN1ck9wLnNlbGVjdGlvbkJlZm9yZT10aGlzLiRsYXN0U2VsKSx0aGlzLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQ9ITB9LmJpbmQodGhpcyksITApfSx0aGlzLmN1ck9wPW51bGwsdGhpcy5wcmV2T3A9e30sdGhpcy5zdGFydE9wZXJhdGlvbj1mdW5jdGlvbihlKXtpZih0aGlzLmN1ck9wKXtpZighZXx8dGhpcy5jdXJPcC5jb21tYW5kKXJldHVybjt0aGlzLnByZXZPcD10aGlzLmN1ck9wfWV8fCh0aGlzLnByZXZpb3VzQ29tbWFuZD1udWxsLGU9e30pLHRoaXMuJG9wUmVzZXRUaW1lci5zY2hlZHVsZSgpLHRoaXMuY3VyT3A9dGhpcy5zZXNzaW9uLmN1ck9wPXtjb21tYW5kOmUuY29tbWFuZHx8e30sYXJnczplLmFyZ3Msc2Nyb2xsVG9wOnRoaXMucmVuZGVyZXIuc2Nyb2xsVG9wfSx0aGlzLmN1ck9wLnNlbGVjdGlvbkJlZm9yZT10aGlzLnNlbGVjdGlvbi50b0pTT04oKX0sdGhpcy5lbmRPcGVyYXRpb249ZnVuY3Rpb24oZSl7aWYodGhpcy5jdXJPcCl7aWYoZSYmZS5yZXR1cm5WYWx1ZT09PSExKXJldHVybiB0aGlzLmN1ck9wPW51bGw7aWYoZT09MSYmdGhpcy5jdXJPcC5jb21tYW5kJiZ0aGlzLmN1ck9wLmNvbW1hbmQubmFtZT09Im1vdXNlIilyZXR1cm47dGhpcy5fc2lnbmFsKCJiZWZvcmVFbmRPcGVyYXRpb24iKTtpZighdGhpcy5jdXJPcClyZXR1cm47dmFyIHQ9dGhpcy5jdXJPcC5jb21tYW5kLG49dCYmdC5zY3JvbGxJbnRvVmlldztpZihuKXtzd2l0Y2gobil7Y2FzZSJjZW50ZXItYW5pbWF0ZSI6bj0iYW5pbWF0ZSI7Y2FzZSJjZW50ZXIiOnRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSk7YnJlYWs7Y2FzZSJhbmltYXRlIjpjYXNlImN1cnNvciI6dGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpO2JyZWFrO2Nhc2Uic2VsZWN0aW9uUGFydCI6dmFyIHI9dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxpPXRoaXMucmVuZGVyZXIubGF5ZXJDb25maWc7KHIuc3RhcnQucm93Pj1pLmxhc3RSb3d8fHIuZW5kLnJvdzw9aS5maXJzdFJvdykmJnRoaXMucmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcodGhpcy5zZWxlY3Rpb24uYW5jaG9yLHRoaXMuc2VsZWN0aW9uLmxlYWQpO2JyZWFrO2RlZmF1bHQ6fW49PSJhbmltYXRlIiYmdGhpcy5yZW5kZXJlci5hbmltYXRlU2Nyb2xsaW5nKHRoaXMuY3VyT3Auc2Nyb2xsVG9wKX12YXIgcz10aGlzLnNlbGVjdGlvbi50b0pTT04oKTt0aGlzLmN1ck9wLnNlbGVjdGlvbkFmdGVyPXMsdGhpcy4kbGFzdFNlbD10aGlzLnNlbGVjdGlvbi50b0pTT04oKSx0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5hZGRTZWxlY3Rpb24ocyksdGhpcy5wcmV2T3A9dGhpcy5jdXJPcCx0aGlzLmN1ck9wPW51bGx9fSx0aGlzLiRtZXJnZWFibGVDb21tYW5kcz1bImJhY2tzcGFjZSIsImRlbCIsImluc2VydHN0cmluZyJdLHRoaXMuJGhpc3RvcnlUcmFja2VyPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRtZXJnZVVuZG9EZWx0YXMpcmV0dXJuO3ZhciB0PXRoaXMucHJldk9wLG49dGhpcy4kbWVyZ2VhYmxlQ29tbWFuZHMscj10LmNvbW1hbmQmJmUuY29tbWFuZC5uYW1lPT10LmNvbW1hbmQubmFtZTtpZihlLmNvbW1hbmQubmFtZT09Imluc2VydHN0cmluZyIpe3ZhciBpPWUuYXJnczt0aGlzLm1lcmdlTmV4dENvbW1hbmQ9PT11bmRlZmluZWQmJih0aGlzLm1lcmdlTmV4dENvbW1hbmQ9ITApLHI9ciYmdGhpcy5tZXJnZU5leHRDb21tYW5kJiYoIS9ccy8udGVzdChpKXx8L1xzLy50ZXN0KHQuYXJncykpLHRoaXMubWVyZ2VOZXh0Q29tbWFuZD0hMH1lbHNlIHI9ciYmbi5pbmRleE9mKGUuY29tbWFuZC5uYW1lKSE9PS0xO3RoaXMuJG1lcmdlVW5kb0RlbHRhcyE9ImFsd2F5cyImJkRhdGUubm93KCktdGhpcy5zZXF1ZW5jZVN0YXJ0VGltZT4yZTMmJihyPSExKSxyP3RoaXMuc2Vzc2lvbi5tZXJnZVVuZG9EZWx0YXM9ITA6bi5pbmRleE9mKGUuY29tbWFuZC5uYW1lKSE9PS0xJiYodGhpcy5zZXF1ZW5jZVN0YXJ0VGltZT1EYXRlLm5vdygpKX0sdGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXtpZihlJiZ0eXBlb2YgZT09InN0cmluZyImJmUhPSJhY2UiKXt0aGlzLiRrZXliaW5kaW5nSWQ9ZTt2YXIgbj10aGlzO2cubG9hZE1vZHVsZShbImtleWJpbmRpbmciLGVdLGZ1bmN0aW9uKHIpe24uJGtleWJpbmRpbmdJZD09ZSYmbi5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihyJiZyLmhhbmRsZXIpLHQmJnQoKX0pfWVsc2UgdGhpcy4ka2V5YmluZGluZ0lkPW51bGwsdGhpcy5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihlKSx0JiZ0KCl9LHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5QmluZGluZy5nZXRLZXlib2FyZEhhbmRsZXIoKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2Vzc2lvbj09ZSlyZXR1cm47dGhpcy5jdXJPcCYmdGhpcy5lbmRPcGVyYXRpb24oKSx0aGlzLmN1ck9wPXt9O3ZhciB0PXRoaXMuc2Vzc2lvbjtpZih0KXt0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2UiLHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZU1vZGUiLHRoaXMuJG9uQ2hhbmdlTW9kZSksdGhpcy5zZXNzaW9uLm9mZigidG9rZW5pemVyVXBkYXRlIix0aGlzLiRvblRva2VuaXplclVwZGF0ZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlVGFiU2l6ZSIsdGhpcy4kb25DaGFuZ2VUYWJTaXplKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VXcmFwTGltaXQiLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0KSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlRm9sZCIsdGhpcy4kb25DaGFuZ2VGb2xkKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VGcm9udE1hcmtlciIsdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlciksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlQmFja01hcmtlciIsdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUFubm90YXRpb24iLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbiksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlU2Nyb2xsTGVmdCIsdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKTt2YXIgbj10aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7bi5vZmYoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLG4ub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKX10aGlzLnNlc3Npb249ZSxlPyh0aGlzLiRvbkRvY3VtZW50Q2hhbmdlPXRoaXMub25Eb2N1bWVudENoYW5nZS5iaW5kKHRoaXMpLGUub24oImNoYW5nZSIsdGhpcy4kb25Eb2N1bWVudENoYW5nZSksdGhpcy5yZW5kZXJlci5zZXRTZXNzaW9uKGUpLHRoaXMuJG9uQ2hhbmdlTW9kZT10aGlzLm9uQ2hhbmdlTW9kZS5iaW5kKHRoaXMpLGUub24oImNoYW5nZU1vZGUiLHRoaXMuJG9uQ2hhbmdlTW9kZSksdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGU9dGhpcy5vblRva2VuaXplclVwZGF0ZS5iaW5kKHRoaXMpLGUub24oInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZT10aGlzLnJlbmRlcmVyLm9uQ2hhbmdlVGFiU2l6ZS5iaW5kKHRoaXMucmVuZGVyZXIpLGUub24oImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQ9dGhpcy5vbkNoYW5nZVdyYXBMaW1pdC5iaW5kKHRoaXMpLGUub24oImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGU9dGhpcy5vbkNoYW5nZVdyYXBNb2RlLmJpbmQodGhpcyksZS5vbigiY2hhbmdlV3JhcE1vZGUiLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpLHRoaXMuJG9uQ2hhbmdlRm9sZD10aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpLGUub24oImNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlcj10aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUZyb250TWFya2VyIix0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKSx0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXI9dGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUJhY2tNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlciksdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50PXRoaXMub25DaGFuZ2VCcmVha3BvaW50LmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbj10aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbi5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlQW5ub3RhdGlvbiIsdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKSx0aGlzLiRvbkN1cnNvckNoYW5nZT10aGlzLm9uQ3Vyc29yQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VPdmVyd3JpdGUiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLiRvblNjcm9sbFRvcENoYW5nZT10aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VTY3JvbGxUb3AiLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKSx0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2U9dGhpcy5vblNjcm9sbExlZnRDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZVNjcm9sbExlZnQiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSksdGhpcy5zZWxlY3Rpb249ZS5nZXRTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5vbigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2U9dGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2VsZWN0aW9uLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKSx0aGlzLm9uQ2hhbmdlTW9kZSgpLHRoaXMub25DdXJzb3JDaGFuZ2UoKSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKCksdGhpcy5vblNjcm9sbExlZnRDaGFuZ2UoKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5vbkNoYW5nZUZyb250TWFya2VyKCksdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIoKSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludCgpLHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uKCksdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMucmVuZGVyZXIuYWRqdXN0V3JhcExpbWl0KCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCkpOih0aGlzLnNlbGVjdGlvbj1udWxsLHRoaXMucmVuZGVyZXIuc2V0U2Vzc2lvbihlKSksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZXNzaW9uIix7c2Vzc2lvbjplLG9sZFNlc3Npb246dH0pLHRoaXMuY3VyT3A9bnVsbCx0JiZ0Ll9zaWduYWwoImNoYW5nZUVkaXRvciIse29sZEVkaXRvcjp0aGlzfSksZSYmZS5fc2lnbmFsKCJjaGFuZ2VFZGl0b3IiLHtlZGl0b3I6dGhpc30pLGUmJmUuYmdUb2tlbml6ZXImJmUuYmdUb2tlbml6ZXIuc2NoZWR1bGVTdGFydCgpfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9ufSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kb2Muc2V0VmFsdWUoZSksdD90PT0xP3RoaXMubmF2aWdhdGVGaWxlRW5kKCk6dD09LTEmJnRoaXMubmF2aWdhdGVGaWxlU3RhcnQoKTp0aGlzLnNlbGVjdEFsbCgpLGV9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFZhbHVlKCl9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9ufSx0aGlzLnJlc2l6ZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLm9uUmVzaXplKGUpfSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGUsdCl7dGhpcy5yZW5kZXJlci5zZXRUaGVtZShlLHQpfSx0aGlzLmdldFRoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGhlbWUoKX0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGUpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci51bnNldFN0eWxlKGUpfSx0aGlzLmdldEZvbnRTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJmb250U2l6ZSIpfHxpLmNvbXB1dGVkU3R5bGUodGhpcy5jb250YWluZXIpLmZvbnRTaXplfSx0aGlzLnNldEZvbnRTaXplPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJmb250U2l6ZSIsZSl9LHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0JiYodGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQpLHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodD1udWxsKTtpZih0aGlzLiRoaWdobGlnaHRQZW5kaW5nKXJldHVybjt2YXIgZT10aGlzO3RoaXMuJGhpZ2hsaWdodFBlbmRpbmc9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2UuJGhpZ2hsaWdodFBlbmRpbmc9ITE7dmFyIHQ9ZS5zZXNzaW9uO2lmKCF0fHwhdC5iZ1Rva2VuaXplcilyZXR1cm47dmFyIG49dC5maW5kTWF0Y2hpbmdCcmFja2V0KGUuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7aWYobil2YXIgcj1uZXcgcChuLnJvdyxuLmNvbHVtbixuLnJvdyxuLmNvbHVtbisxKTtlbHNlIGlmKHQuJG1vZGUuZ2V0TWF0Y2hpbmcpdmFyIHI9dC4kbW9kZS5nZXRNYXRjaGluZyhlLnNlc3Npb24pO3ImJih0LiRicmFja2V0SGlnaGxpZ2h0PXQuYWRkTWFya2VyKHIsImFjZV9icmFja2V0IiwidGV4dCIpKX0sNTApfSx0aGlzLiRoaWdobGlnaHRUYWdzPWZ1bmN0aW9uKCl7aWYodGhpcy4kaGlnaGxpZ2h0VGFnUGVuZGluZylyZXR1cm47dmFyIGU9dGhpczt0aGlzLiRoaWdobGlnaHRUYWdQZW5kaW5nPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLiRoaWdobGlnaHRUYWdQZW5kaW5nPSExO3ZhciB0PWUuc2Vzc2lvbjtpZighdHx8IXQuYmdUb2tlbml6ZXIpcmV0dXJuO3ZhciBuPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxyPW5ldyB5KGUuc2Vzc2lvbixuLnJvdyxuLmNvbHVtbiksaT1yLmdldEN1cnJlbnRUb2tlbigpO2lmKCFpfHwhL1xiKD86dGFnLW9wZW58dGFnLW5hbWUpLy50ZXN0KGkudHlwZSkpe3QucmVtb3ZlTWFya2VyKHQuJHRhZ0hpZ2hsaWdodCksdC4kdGFnSGlnaGxpZ2h0PW51bGw7cmV0dXJufWlmKGkudHlwZS5pbmRleE9mKCJ0YWctb3BlbiIpIT0tMSl7aT1yLnN0ZXBGb3J3YXJkKCk7aWYoIWkpcmV0dXJufXZhciBzPWkudmFsdWUsbz0wLHU9ci5zdGVwQmFja3dhcmQoKTtpZih1LnZhbHVlPT0iPCIpe2RvIHU9aSxpPXIuc3RlcEZvcndhcmQoKSxpJiZpLnZhbHVlPT09cyYmaS50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKHUudmFsdWU9PT0iPCI/bysrOnUudmFsdWU9PT0iPC8iJiZvLS0pO3doaWxlKGkmJm8+PTApfWVsc2V7ZG8gaT11LHU9ci5zdGVwQmFja3dhcmQoKSxpJiZpLnZhbHVlPT09cyYmaS50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKHUudmFsdWU9PT0iPCI/bysrOnUudmFsdWU9PT0iPC8iJiZvLS0pO3doaWxlKHUmJm88PTApO3Iuc3RlcEZvcndhcmQoKX1pZighaSl7dC5yZW1vdmVNYXJrZXIodC4kdGFnSGlnaGxpZ2h0KSx0LiR0YWdIaWdobGlnaHQ9bnVsbDtyZXR1cm59dmFyIGE9ci5nZXRDdXJyZW50VG9rZW5Sb3coKSxmPXIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCksbD1uZXcgcChhLGYsYSxmK2kudmFsdWUubGVuZ3RoKSxjPXQuJGJhY2tNYXJrZXJzW3QuJHRhZ0hpZ2hsaWdodF07dC4kdGFnSGlnaGxpZ2h0JiZjIT11bmRlZmluZWQmJmwuY29tcGFyZVJhbmdlKGMucmFuZ2UpIT09MCYmKHQucmVtb3ZlTWFya2VyKHQuJHRhZ0hpZ2hsaWdodCksdC4kdGFnSGlnaGxpZ2h0PW51bGwpLHQuJHRhZ0hpZ2hsaWdodHx8KHQuJHRhZ0hpZ2hsaWdodD10LmFkZE1hcmtlcihsLCJhY2VfYnJhY2tldCIsInRleHQiKSl9LDUwKX0sdGhpcy5mb2N1cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UuaXNGb2N1c2VkKCl8fGUudGV4dElucHV0LmZvY3VzKCl9KSx0aGlzLnRleHRJbnB1dC5mb2N1cygpfSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQoKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7dGhpcy50ZXh0SW5wdXQuYmx1cigpfSx0aGlzLm9uRm9jdXM9ZnVuY3Rpb24oZSl7aWYodGhpcy4kaXNGb2N1c2VkKXJldHVybjt0aGlzLiRpc0ZvY3VzZWQ9ITAsdGhpcy5yZW5kZXJlci5zaG93Q3Vyc29yKCksdGhpcy5yZW5kZXJlci52aXN1YWxpemVGb2N1cygpLHRoaXMuX2VtaXQoImZvY3VzIixlKX0sdGhpcy5vbkJsdXI9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGlzRm9jdXNlZClyZXR1cm47dGhpcy4kaXNGb2N1c2VkPSExLHRoaXMucmVuZGVyZXIuaGlkZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudmlzdWFsaXplQmx1cigpLHRoaXMuX2VtaXQoImJsdXIiLGUpfSx0aGlzLiRjdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpfSx0aGlzLm9uRG9jdW1lbnRDaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZSxuPWUuc3RhcnQucm93PT1lLmVuZC5yb3c/ZS5lbmQucm93OkluZmluaXR5O3RoaXMucmVuZGVyZXIudXBkYXRlTGluZXMoZS5zdGFydC5yb3csbix0KSx0aGlzLl9zaWduYWwoImNoYW5nZSIsZSksdGhpcy4kY3Vyc29yQ2hhbmdlKCksdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpfSx0aGlzLm9uVG9rZW5pemVyVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHQuZmlyc3QsdC5sYXN0KX0sdGhpcy5vblNjcm9sbFRvcENoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9ZKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSl9LHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1godGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSl9LHRoaXMub25DdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JDaGFuZ2UoKSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cygpLHRoaXMuJGhpZ2hsaWdodFRhZ3MoKSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2Vzc2lvbigpLHQ7aWYodGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZSl7aWYodGhpcy4kc2VsZWN0aW9uU3R5bGUhPSJsaW5lInx8IXRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkpdD10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7dGhpcy5yZW5kZXJlci50aGVtZSYmdGhpcy5yZW5kZXJlci50aGVtZS4kc2VsZWN0aW9uQ29sb3JDb25mbGljdCYmIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmKHQ9ITEpLHRoaXMucmVuZGVyZXIuJG1heExpbmVzJiZ0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCk9PT0xJiYhKHRoaXMucmVuZGVyZXIuJG1pbkxpbmVzPjEpJiYodD0hMSl9aWYoZS4kaGlnaGxpZ2h0TGluZU1hcmtlciYmIXQpZS5yZW1vdmVNYXJrZXIoZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5pZCksZS4kaGlnaGxpZ2h0TGluZU1hcmtlcj1udWxsO2Vsc2UgaWYoIWUuJGhpZ2hsaWdodExpbmVNYXJrZXImJnQpe3ZhciBuPW5ldyBwKHQucm93LHQuY29sdW1uLHQucm93LEluZmluaXR5KTtuLmlkPWUuYWRkTWFya2VyKG4sImFjZV9hY3RpdmUtbGluZSIsInNjcmVlbkxpbmUiKSxlLiRoaWdobGlnaHRMaW5lTWFya2VyPW59ZWxzZSB0JiYoZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5zdGFydC5yb3c9dC5yb3csZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5lbmQucm93PXQucm93LGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuc3RhcnQuY29sdW1uPXQuY29sdW1uLGUuX3NpZ25hbCgiY2hhbmdlQmFja01hcmtlciIpKX0sdGhpcy5vblNlbGVjdGlvbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb247dC4kc2VsZWN0aW9uTWFya2VyJiZ0LnJlbW92ZU1hcmtlcih0LiRzZWxlY3Rpb25NYXJrZXIpLHQuJHNlbGVjdGlvbk1hcmtlcj1udWxsO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCkscj10aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7dC4kc2VsZWN0aW9uTWFya2VyPXQuYWRkTWFya2VyKG4sImFjZV9zZWxlY3Rpb24iLHIpfWVsc2UgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpO3ZhciBpPXRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCYmdGhpcy4kZ2V0U2VsZWN0aW9uSGlnaExpZ2h0UmVnZXhwKCk7dGhpcy5zZXNzaW9uLmhpZ2hsaWdodChpKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiRnZXRTZWxlY3Rpb25IaWdoTGlnaHRSZWdleHA9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodC5pc0VtcHR5KCl8fHQuaXNNdWx0aUxpbmUoKSlyZXR1cm47dmFyIG49dC5zdGFydC5jb2x1bW4scj10LmVuZC5jb2x1bW4saT1lLmdldExpbmUodC5zdGFydC5yb3cpLHM9aS5zdWJzdHJpbmcobixyKTtpZihzLmxlbmd0aD41ZTN8fCEvW1x3XGRdLy50ZXN0KHMpKXJldHVybjt2YXIgbz10aGlzLiRzZWFyY2guJGFzc2VtYmxlUmVnRXhwKHt3aG9sZVdvcmQ6ITAsY2FzZVNlbnNpdGl2ZTohMCxuZWVkbGU6c30pLHU9aS5zdWJzdHJpbmcobi0xLHIrMSk7aWYoIW8udGVzdCh1KSlyZXR1cm47cmV0dXJuIG99LHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnJvbnRNYXJrZXJzKCl9LHRoaXMub25DaGFuZ2VCYWNrTWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQnJlYWtwb2ludHMoKX0sdGhpcy5vbkNoYW5nZUFubm90YXRpb249ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNldEFubm90YXRpb25zKHRoaXMuc2Vzc2lvbi5nZXRBbm5vdGF0aW9ucygpKX0sdGhpcy5vbkNoYW5nZU1vZGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci51cGRhdGVUZXh0KCksdGhpcy5fZW1pdCgiY2hhbmdlTW9kZSIsZSl9LHRoaXMub25DaGFuZ2VXcmFwTGltaXQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5vbkNoYW5nZVdyYXBNb2RlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5vblJlc2l6ZSghMCl9LHRoaXMub25DaGFuZ2VGb2xkPWZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpLHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLmdldFNlbGVjdGVkVGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSl9LHRoaXMuZ2V0Q29weVRleHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGVkVGV4dCgpLHQ9dGhpcy5zZXNzaW9uLmRvYy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksbj0hMTtpZighZSYmdGhpcy4kY29weVdpdGhFbXB0eVNlbGVjdGlvbil7bj0hMDt2YXIgcj10aGlzLnNlbGVjdGlvbi5nZXRBbGxSYW5nZXMoKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9cltpXTtpZihpJiZyW2ktMV0uc3RhcnQucm93PT1zLnN0YXJ0LnJvdyljb250aW51ZTtlKz10aGlzLnNlc3Npb24uZ2V0TGluZShzLnN0YXJ0LnJvdykrdH19dmFyIG89e3RleHQ6ZX07cmV0dXJuIHRoaXMuX3NpZ25hbCgiY29weSIsbyksYi5saW5lTW9kZT1uP28udGV4dDoiIixvLnRleHR9LHRoaXMub25Db3B5PWZ1bmN0aW9uKCl7dGhpcy5jb21tYW5kcy5leGVjKCJjb3B5Iix0aGlzKX0sdGhpcy5vbkN1dD1mdW5jdGlvbigpe3RoaXMuY29tbWFuZHMuZXhlYygiY3V0Iix0aGlzKX0sdGhpcy5vblBhc3RlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e3RleHQ6ZSxldmVudDp0fTt0aGlzLmNvbW1hbmRzLmV4ZWMoInBhc3RlIix0aGlzLG4pfSx0aGlzLiRoYW5kbGVQYXN0ZT1mdW5jdGlvbihlKXt0eXBlb2YgZT09InN0cmluZyImJihlPXt0ZXh0OmV9KSx0aGlzLl9zaWduYWwoInBhc3RlIixlKTt2YXIgdD1lLnRleHQsbj10PT1iLmxpbmVNb2RlLHI9dGhpcy5zZXNzaW9uO2lmKCF0aGlzLmluTXVsdGlTZWxlY3RNb2RlfHx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpbj9yLmluc2VydCh7cm93OnRoaXMuc2VsZWN0aW9uLmxlYWQucm93LGNvbHVtbjowfSx0KTp0aGlzLmluc2VydCh0KTtlbHNlIGlmKG4pdGhpcy5zZWxlY3Rpb24ucmFuZ2VMaXN0LnJhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaW5zZXJ0KHtyb3c6ZS5zdGFydC5yb3csY29sdW1uOjB9LHQpfSk7ZWxzZXt2YXIgaT10LnNwbGl0KC9cclxufFxyfFxuLykscz10aGlzLnNlbGVjdGlvbi5yYW5nZUxpc3QucmFuZ2VzLG89aS5sZW5ndGg9PTImJighaVswXXx8IWlbMV0pO2lmKGkubGVuZ3RoIT1zLmxlbmd0aHx8bylyZXR1cm4gdGhpcy5jb21tYW5kcy5leGVjKCJpbnNlcnRzdHJpbmciLHRoaXMsdCk7Zm9yKHZhciB1PXMubGVuZ3RoO3UtLTspe3ZhciBhPXNbdV07YS5pc0VtcHR5KCl8fHIucmVtb3ZlKGEpLHIuaW5zZXJ0KGEuc3RhcnQsaVt1XSl9fX0sdGhpcy5leGVjQ29tbWFuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbW1hbmRzLmV4ZWMoZSx0aGlzLHQpfSx0aGlzLmluc2VydD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbixyPW4uZ2V0TW9kZSgpLGk9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSYmIXQpe3ZhciBzPXIudHJhbnNmb3JtQWN0aW9uKG4uZ2V0U3RhdGUoaS5yb3cpLCJpbnNlcnRpb24iLHRoaXMsbixlKTtzJiYoZSE9PXMudGV4dCYmKHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZXx8KHRoaXMuc2Vzc2lvbi5tZXJnZVVuZG9EZWx0YXM9ITEsdGhpcy5tZXJnZU5leHRDb21tYW5kPSExKSksZT1zLnRleHQpfWU9PSIJIiYmKGU9dGhpcy5zZXNzaW9uLmdldFRhYlN0cmluZygpKTtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgbz10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aT10aGlzLnNlc3Npb24ucmVtb3ZlKG8pLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX1lbHNlIGlmKHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSYmZS5pbmRleE9mKCJcbiIpPT0tMSl7dmFyIG89bmV3IHAuZnJvbVBvaW50cyhpLGkpO28uZW5kLmNvbHVtbis9ZS5sZW5ndGgsdGhpcy5zZXNzaW9uLnJlbW92ZShvKX1pZihlPT0iXG4ifHxlPT0iXHJcbiIpe3ZhciB1PW4uZ2V0TGluZShpLnJvdyk7aWYoaS5jb2x1bW4+dS5zZWFyY2goL1xTfCQvKSl7dmFyIGE9dS5zdWJzdHIoaS5jb2x1bW4pLnNlYXJjaCgvXFN8JC8pO24uZG9jLnJlbW92ZUluTGluZShpLnJvdyxpLmNvbHVtbixpLmNvbHVtbithKX19dGhpcy5jbGVhclNlbGVjdGlvbigpO3ZhciBmPWkuY29sdW1uLGw9bi5nZXRTdGF0ZShpLnJvdyksdT1uLmdldExpbmUoaS5yb3cpLGM9ci5jaGVja091dGRlbnQobCx1LGUpO24uaW5zZXJ0KGksZSkscyYmcy5zZWxlY3Rpb24mJihzLnNlbGVjdGlvbi5sZW5ndGg9PTI/dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3IHAoaS5yb3csZitzLnNlbGVjdGlvblswXSxpLnJvdyxmK3Muc2VsZWN0aW9uWzFdKSk6dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3IHAoaS5yb3crcy5zZWxlY3Rpb25bMF0scy5zZWxlY3Rpb25bMV0saS5yb3crcy5zZWxlY3Rpb25bMl0scy5zZWxlY3Rpb25bM10pKSk7aWYobi5nZXREb2N1bWVudCgpLmlzTmV3TGluZShlKSl7dmFyIGg9ci5nZXROZXh0TGluZUluZGVudChsLHUuc2xpY2UoMCxpLmNvbHVtbiksbi5nZXRUYWJTdHJpbmcoKSk7bi5pbnNlcnQoe3JvdzppLnJvdysxLGNvbHVtbjowfSxoKX1jJiZyLmF1dG9PdXRkZW50KGwsbixpLnJvdyl9LHRoaXMub25UZXh0SW5wdXQ9ZnVuY3Rpb24oZSx0KXtpZighdClyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLm9uVGV4dElucHV0KGUpO3RoaXMuc3RhcnRPcGVyYXRpb24oe2NvbW1hbmQ6e25hbWU6Imluc2VydHN0cmluZyJ9fSk7dmFyIG49dGhpcy5hcHBseUNvbXBvc2l0aW9uLmJpbmQodGhpcyxlLHQpO3RoaXMuc2VsZWN0aW9uLnJhbmdlQ291bnQ/dGhpcy5mb3JFYWNoU2VsZWN0aW9uKG4pOm4oKSx0aGlzLmVuZE9wZXJhdGlvbigpfSx0aGlzLmFwcGx5Q29tcG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZih0LmV4dGVuZExlZnR8fHQuZXh0ZW5kUmlnaHQpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7bi5zdGFydC5jb2x1bW4tPXQuZXh0ZW5kTGVmdCxuLmVuZC5jb2x1bW4rPXQuZXh0ZW5kUmlnaHQsdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UobiksIWUmJiFuLmlzRW1wdHkoKSYmdGhpcy5yZW1vdmUoKX0oZXx8IXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkmJnRoaXMuaW5zZXJ0KGUsITApO2lmKHQucmVzdG9yZVN0YXJ0fHx0LnJlc3RvcmVFbmQpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7bi5zdGFydC5jb2x1bW4tPXQucmVzdG9yZVN0YXJ0LG4uZW5kLmNvbHVtbi09dC5yZXN0b3JlRW5kLHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG4pfX0sdGhpcy5vbkNvbW1hbmRLZXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmtleUJpbmRpbmcub25Db21tYW5kS2V5KGUsdCxuKX0sdGhpcy5zZXRPdmVyd3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLnNldE92ZXJ3cml0ZShlKX0sdGhpcy5nZXRPdmVyd3JpdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpfSx0aGlzLnRvZ2dsZU92ZXJ3cml0ZT1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi50b2dnbGVPdmVyd3JpdGUoKX0sdGhpcy5zZXRTY3JvbGxTcGVlZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2Nyb2xsU3BlZWQiLGUpfSx0aGlzLmdldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzY3JvbGxTcGVlZCIpfSx0aGlzLnNldERyYWdEZWxheT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZHJhZ0RlbGF5IixlKX0sdGhpcy5nZXREcmFnRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImRyYWdEZWxheSIpfSx0aGlzLnNldFNlbGVjdGlvblN0eWxlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzZWxlY3Rpb25TdHlsZSIsZSl9LHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNlbGVjdGlvblN0eWxlIil9LHRoaXMuc2V0SGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0QWN0aXZlTGluZSIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiaGlnaGxpZ2h0QWN0aXZlTGluZSIpfSx0aGlzLnNldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiLGUpfSx0aGlzLmdldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiKX0sdGhpcy5zZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodFNlbGVjdGVkV29yZCIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZH0sdGhpcy5zZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldEFuaW1hdGVkU2Nyb2xsKGUpfSx0aGlzLmdldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0QW5pbWF0ZWRTY3JvbGwoKX0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFNob3dJbnZpc2libGVzKGUpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd0ludmlzaWJsZXMoKX0sdGhpcy5zZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0RGlzcGxheUluZGVudEd1aWRlcyhlKX0sdGhpcy5nZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0RGlzcGxheUluZGVudEd1aWRlcygpfSx0aGlzLnNldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFNob3dQcmludE1hcmdpbihlKX0sdGhpcy5nZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTaG93UHJpbnRNYXJnaW4oKX0sdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFByaW50TWFyZ2luQ29sdW1uKGUpfSx0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0UHJpbnRNYXJnaW5Db2x1bW4oKX0sdGhpcy5zZXRSZWFkT25seT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigicmVhZE9ubHkiLGUpfSx0aGlzLmdldFJlYWRPbmx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJyZWFkT25seSIpfSx0aGlzLnNldEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJiZWhhdmlvdXJzRW5hYmxlZCIsZSl9LHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImJlaGF2aW91cnNFbmFibGVkIil9LHRoaXMuc2V0V3JhcEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ3cmFwQmVoYXZpb3Vyc0VuYWJsZWQiLGUpfSx0aGlzLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigid3JhcEJlaGF2aW91cnNFbmFibGVkIil9LHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzaG93Rm9sZFdpZGdldHMiLGUpfSx0aGlzLmdldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd0ZvbGRXaWRnZXRzIil9LHRoaXMuc2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiLGUpfSx0aGlzLmdldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIil9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmKGU9PSJsZWZ0Ij90aGlzLnNlbGVjdGlvbi5zZWxlY3RMZWZ0KCk6dGhpcy5zZWxlY3Rpb24uc2VsZWN0UmlnaHQoKSk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSl7dmFyIG49dGhpcy5zZXNzaW9uLHI9bi5nZXRTdGF0ZSh0LnN0YXJ0LnJvdyksaT1uLmdldE1vZGUoKS50cmFuc2Zvcm1BY3Rpb24ociwiZGVsZXRpb24iLHRoaXMsbix0KTtpZih0LmVuZC5jb2x1bW49PT0wKXt2YXIgcz1uLmdldFRleHRSYW5nZSh0KTtpZihzW3MubGVuZ3RoLTFdPT0iXG4iKXt2YXIgbz1uLmdldExpbmUodC5lbmQucm93KTsvXlxzKyQvLnRlc3QobykmJih0LmVuZC5jb2x1bW49by5sZW5ndGgpfX1pJiYodD1pKX10aGlzLnNlc3Npb24ucmVtb3ZlKHQpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRSaWdodCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRMZWZ0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVUb0xpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZVN0YXJ0KCksdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMZWZ0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVUb0xpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVFbmQoKTt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7ZS5zdGFydC5jb2x1bW49PWUuZW5kLmNvbHVtbiYmZS5zdGFydC5yb3c9PWUuZW5kLnJvdyYmKGUuZW5kLmNvbHVtbj0wLGUuZW5kLnJvdysrKSx0aGlzLnNlc3Npb24ucmVtb3ZlKGUpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5zcGxpdExpbmU9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fCh0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpKTt2YXIgZT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7dGhpcy5pbnNlcnQoIlxuIiksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0sdGhpcy50cmFuc3Bvc2VMZXR0ZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSlyZXR1cm47dmFyIGU9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLHQ9ZS5jb2x1bW47aWYodD09PTApcmV0dXJuO3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUucm93KSxyLGk7dDxuLmxlbmd0aD8ocj1uLmNoYXJBdCh0KStuLmNoYXJBdCh0LTEpLGk9bmV3IHAoZS5yb3csdC0xLGUucm93LHQrMSkpOihyPW4uY2hhckF0KHQtMSkrbi5jaGFyQXQodC0yKSxpPW5ldyBwKGUucm93LHQtMixlLnJvdyx0KSksdGhpcy5zZXNzaW9uLnJlcGxhY2UoaSxyKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGkuZW5kKX0sdGhpcy50b0xvd2VyQ2FzZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksbj10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHQpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKHQsbi50b0xvd2VyQ2FzZSgpKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShlKX0sdGhpcy50b1VwcGVyQ2FzZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksbj10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHQpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKHQsbi50b1VwcGVyQ2FzZSgpKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShlKX0sdGhpcy5pbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodC5zdGFydC5yb3c8dC5lbmQucm93KXt2YXIgbj10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTtlLmluZGVudFJvd3Mobi5maXJzdCxuLmxhc3QsIgkiKTtyZXR1cm59aWYodC5zdGFydC5jb2x1bW48dC5lbmQuY29sdW1uKXt2YXIgcj1lLmdldFRleHRSYW5nZSh0KTtpZighL15ccyskLy50ZXN0KHIpKXt2YXIgbj10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTtlLmluZGVudFJvd3Mobi5maXJzdCxuLmxhc3QsIgkiKTtyZXR1cm59fXZhciBpPWUuZ2V0TGluZSh0LnN0YXJ0LnJvdyksbz10LnN0YXJ0LHU9ZS5nZXRUYWJTaXplKCksYT1lLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oby5yb3csby5jb2x1bW4pO2lmKHRoaXMuc2Vzc2lvbi5nZXRVc2VTb2Z0VGFicygpKXZhciBmPXUtYSV1LGw9cy5zdHJpbmdSZXBlYXQoIiAiLGYpO2Vsc2V7dmFyIGY9YSV1O3doaWxlKGlbdC5zdGFydC5jb2x1bW4tMV09PSIgIiYmZil0LnN0YXJ0LmNvbHVtbi0tLGYtLTt0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZSh0KSxsPSIJIn1yZXR1cm4gdGhpcy5pbnNlcnQobCl9LHRoaXMuYmxvY2tJbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24uaW5kZW50Um93cyhlLmZpcnN0LGUubGFzdCwiCSIpfSx0aGlzLmJsb2NrT3V0ZGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTt0aGlzLnNlc3Npb24ub3V0ZGVudFJvd3MoZS5nZXRSYW5nZSgpKX0sdGhpcy5zb3J0TGluZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKSx0PXRoaXMuc2Vzc2lvbixuPVtdO2Zvcih2YXIgcj1lLmZpcnN0O3I8PWUubGFzdDtyKyspbi5wdXNoKHQuZ2V0TGluZShyKSk7bi5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKTx0LnRvTG93ZXJDYXNlKCk/LTE6ZS50b0xvd2VyQ2FzZSgpPnQudG9Mb3dlckNhc2UoKT8xOjB9KTt2YXIgaT1uZXcgcCgwLDAsMCwwKTtmb3IodmFyIHI9ZS5maXJzdDtyPD1lLmxhc3Q7cisrKXt2YXIgcz10LmdldExpbmUocik7aS5zdGFydC5yb3c9cixpLmVuZC5yb3c9cixpLmVuZC5jb2x1bW49cy5sZW5ndGgsdC5yZXBsYWNlKGksbltyLWUuZmlyc3RdKX19LHRoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFN0YXRlKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKS5yb3cpLHQ9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLmdldE1vZGUoKS50b2dnbGVDb21tZW50TGluZXMoZSx0aGlzLnNlc3Npb24sdC5maXJzdCx0Lmxhc3QpfSx0aGlzLnRvZ2dsZUJsb2NrQ29tbWVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSx0PXRoaXMuc2Vzc2lvbi5nZXRTdGF0ZShlLnJvdyksbj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZXNzaW9uLmdldE1vZGUoKS50b2dnbGVCbG9ja0NvbW1lbnQodCx0aGlzLnNlc3Npb24sbixlKX0sdGhpcy5nZXROdW1iZXJBdD1mdW5jdGlvbihlLHQpe3ZhciBuPS9bXC1dP1swLTldKyg/OlwuWzAtOV0rKT8vZztuLmxhc3RJbmRleD0wO3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpO3doaWxlKG4ubGFzdEluZGV4PHQpe3ZhciBpPW4uZXhlYyhyKTtpZihpLmluZGV4PD10JiZpLmluZGV4K2lbMF0ubGVuZ3RoPj10KXt2YXIgcz17dmFsdWU6aVswXSxzdGFydDppLmluZGV4LGVuZDppLmluZGV4K2lbMF0ubGVuZ3RofTtyZXR1cm4gc319cmV0dXJuIG51bGx9LHRoaXMubW9kaWZ5TnVtYmVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLnJvdyxuPXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLmNvbHVtbixyPW5ldyBwKHQsbi0xLHQsbiksaT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHIpO2lmKCFpc05hTihwYXJzZUZsb2F0KGkpKSYmaXNGaW5pdGUoaSkpe3ZhciBzPXRoaXMuZ2V0TnVtYmVyQXQodCxuKTtpZihzKXt2YXIgbz1zLnZhbHVlLmluZGV4T2YoIi4iKT49MD9zLnN0YXJ0K3MudmFsdWUuaW5kZXhPZigiLiIpKzE6cy5lbmQsdT1zLnN0YXJ0K3MudmFsdWUubGVuZ3RoLW8sYT1wYXJzZUZsb2F0KHMudmFsdWUpO2EqPU1hdGgucG93KDEwLHUpLG8hPT1zLmVuZCYmbjxvP2UqPU1hdGgucG93KDEwLHMuZW5kLW4tMSk6ZSo9TWF0aC5wb3coMTAscy5lbmQtbiksYSs9ZSxhLz1NYXRoLnBvdygxMCx1KTt2YXIgZj1hLnRvRml4ZWQodSksbD1uZXcgcCh0LHMuc3RhcnQsdCxzLmVuZCk7dGhpcy5zZXNzaW9uLnJlcGxhY2UobCxmKSx0aGlzLm1vdmVDdXJzb3JUbyh0LE1hdGgubWF4KHMuc3RhcnQrMSxuK2YubGVuZ3RoLXMudmFsdWUubGVuZ3RoKSl9fWVsc2UgdGhpcy50b2dnbGVXb3JkKCl9LHRoaXMuJHRvZ2dsZVdvcmRQYWlycz1bWyJmaXJzdCIsImxhc3QiXSxbInRydWUiLCJmYWxzZSJdLFsieWVzIiwibm8iXSxbIndpZHRoIiwiaGVpZ2h0Il0sWyJ0b3AiLCJib3R0b20iXSxbInJpZ2h0IiwibGVmdCJdLFsib24iLCJvZmYiXSxbIngiLCJ5Il0sWyJnZXQiLCJzZXQiXSxbIm1heCIsIm1pbiJdLFsiaG9yaXpvbnRhbCIsInZlcnRpY2FsIl0sWyJzaG93IiwiaGlkZSJdLFsiYWRkIiwicmVtb3ZlIl0sWyJ1cCIsImRvd24iXSxbImJlZm9yZSIsImFmdGVyIl0sWyJldmVuIiwib2RkIl0sWyJpbnNpZGUiLCJvdXRzaWRlIl0sWyJuZXh0IiwicHJldmlvdXMiXSxbImluY3JlYXNlIiwiZGVjcmVhc2UiXSxbImF0dGFjaCIsImRldGFjaCJdLFsiJiYiLCJ8fCJdLFsiPT0iLCIhPSJdXSx0aGlzLnRvZ2dsZVdvcmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5yb3csdD10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5jb2x1bW47dGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciBuPXRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCkscj10aGlzLnNlbGVjdGlvbi5nZXRXb3JkUmFuZ2UoKS5zdGFydC5jb2x1bW4saT1uLnJlcGxhY2UoLyhbYS16XSt8W0EtWl0rKSg/PVtBLVpfXXwkKS9nLCIkMSAiKS5zcGxpdCgvXHMvKSxvPXQtci0xO288MCYmKG89MCk7dmFyIHU9MCxhPTAsZj10aGlzO24ubWF0Y2goL1tBLVphLXowLTlfXSsvKSYmaS5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7YT11K3QubGVuZ3RoLG8+PXUmJm88PWEmJihuPXQsZi5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSxmLm1vdmVDdXJzb3JUbyhlLHUrciksZi5zZWxlY3Rpb24uc2VsZWN0VG8oZSxhK3IpKSx1PWF9KTt2YXIgbD10aGlzLiR0b2dnbGVXb3JkUGFpcnMsYztmb3IodmFyIGg9MDtoPGwubGVuZ3RoO2grKyl7dmFyIHA9bFtoXTtmb3IodmFyIGQ9MDtkPD0xO2QrKyl7dmFyIHY9KyFkLG09bi5tYXRjaChuZXcgUmVnRXhwKCJeXFxzP18/KCIrcy5lc2NhcGVSZWdFeHAocFtkXSkrIilcXHM/JCIsImkiKSk7aWYobSl7dmFyIGc9bi5tYXRjaChuZXcgUmVnRXhwKCIoW19dfF58XFxzKSgiK3MuZXNjYXBlUmVnRXhwKG1bMV0pKyIpKCR8XFxzKSIsImciKSk7ZyYmKGM9bi5yZXBsYWNlKG5ldyBSZWdFeHAocy5lc2NhcGVSZWdFeHAocFtkXSksImkiKSxmdW5jdGlvbihlKXt2YXIgdD1wW3ZdO3JldHVybiBlLnRvVXBwZXJDYXNlKCk9PWU/dD10LnRvVXBwZXJDYXNlKCk6ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKT09ZS5jaGFyQXQoMCkmJih0PXQuc3Vic3RyKDAsMCkrcFt2XS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSksdH0pLHRoaXMuaW5zZXJ0KGMpLGM9IiIpfX19fSx0aGlzLnJlbW92ZUxpbmVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLnJlbW92ZUZ1bGxMaW5lcyhlLmZpcnN0LGUubGFzdCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLmR1cGxpY2F0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2VsZWN0aW9uLHQ9dGhpcy5zZXNzaW9uLG49ZS5nZXRSYW5nZSgpLHI9ZS5pc0JhY2t3YXJkcygpO2lmKG4uaXNFbXB0eSgpKXt2YXIgaT1uLnN0YXJ0LnJvdzt0LmR1cGxpY2F0ZUxpbmVzKGksaSl9ZWxzZXt2YXIgcz1yP24uc3RhcnQ6bi5lbmQsbz10Lmluc2VydChzLHQuZ2V0VGV4dFJhbmdlKG4pLCExKTtuLnN0YXJ0PXMsbi5lbmQ9byxlLnNldFNlbGVjdGlvblJhbmdlKG4scil9fSx0aGlzLm1vdmVMaW5lc0Rvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoMSwhMSl9LHRoaXMubW92ZUxpbmVzVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoLTEsITEpfSx0aGlzLm1vdmVUZXh0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVUZXh0KGUsdCxuKX0sdGhpcy5jb3B5TGluZXNVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygtMSwhMCl9LHRoaXMuY29weUxpbmVzRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygxLCEwKX0sdGhpcy4kbW92ZUxpbmVzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXMuc2VsZWN0aW9uO2lmKCFpLmluTXVsdGlTZWxlY3RNb2RlfHx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpe3ZhciBzPWkudG9PcmllbnRlZFJhbmdlKCk7bj10aGlzLiRnZXRTZWxlY3RlZFJvd3Mocykscj10aGlzLnNlc3Npb24uJG1vdmVMaW5lcyhuLmZpcnN0LG4ubGFzdCx0PzA6ZSksdCYmZT09LTEmJihyPTApLHMubW92ZUJ5KHIsMCksaS5mcm9tT3JpZW50ZWRSYW5nZShzKX1lbHNle3ZhciBvPWkucmFuZ2VMaXN0LnJhbmdlcztpLnJhbmdlTGlzdC5kZXRhY2godGhpcy5zZXNzaW9uKSx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITA7dmFyIHU9MCxhPTAsZj1vLmxlbmd0aDtmb3IodmFyIGw9MDtsPGY7bCsrKXt2YXIgYz1sO29bbF0ubW92ZUJ5KHUsMCksbj10aGlzLiRnZXRTZWxlY3RlZFJvd3Mob1tsXSk7dmFyIGg9bi5maXJzdCxwPW4ubGFzdDt3aGlsZSgrK2w8Zil7YSYmb1tsXS5tb3ZlQnkoYSwwKTt2YXIgZD10aGlzLiRnZXRTZWxlY3RlZFJvd3Mob1tsXSk7aWYodCYmZC5maXJzdCE9cClicmVhaztpZighdCYmZC5maXJzdD5wKzEpYnJlYWs7cD1kLmxhc3R9bC0tLHU9dGhpcy5zZXNzaW9uLiRtb3ZlTGluZXMoaCxwLHQ/MDplKSx0JiZlPT0tMSYmKGM9bCsxKTt3aGlsZShjPD1sKW9bY10ubW92ZUJ5KHUsMCksYysrO3R8fCh1PTApLGErPXV9aS5mcm9tT3JpZW50ZWRSYW5nZShpLnJhbmdlc1swXSksaS5yYW5nZUxpc3QuYXR0YWNoKHRoaXMuc2Vzc2lvbiksdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExfX0sdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzPWZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHx0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLmNvbGxhcHNlUm93cygpLHtmaXJzdDp0aGlzLnNlc3Npb24uZ2V0Um93Rm9sZFN0YXJ0KGUuc3RhcnQucm93KSxsYXN0OnRoaXMuc2Vzc2lvbi5nZXRSb3dGb2xkRW5kKGUuZW5kLnJvdyl9fSx0aGlzLm9uQ29tcG9zaXRpb25TdGFydD1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNob3dDb21wb3NpdGlvbihlKX0sdGhpcy5vbkNvbXBvc2l0aW9uVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0Q29tcG9zaXRpb25UZXh0KGUpfSx0aGlzLm9uQ29tcG9zaXRpb25FbmQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmhpZGVDb21wb3NpdGlvbigpfSx0aGlzLmdldEZpcnN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldEZpcnN0VmlzaWJsZVJvdygpfSx0aGlzLmdldExhc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0TGFzdFZpc2libGVSb3coKX0sdGhpcy5pc1Jvd1Zpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93KCkmJmU8PXRoaXMuZ2V0TGFzdFZpc2libGVSb3coKX0sdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5yZW5kZXJlci5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdygpJiZlPD10aGlzLnJlbmRlcmVyLmdldExhc3RGdWxseVZpc2libGVSb3coKX0sdGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCktdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKSsxfSx0aGlzLiRtb3ZlQnlQYWdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZW5kZXJlcixyPXRoaXMucmVuZGVyZXIubGF5ZXJDb25maWcsaT1lKk1hdGguZmxvb3Ioci5oZWlnaHQvci5saW5lSGVpZ2h0KTt0PT09ITA/dGhpcy5zZWxlY3Rpb24uJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeShpLDApfSk6dD09PSExJiYodGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KGksMCksdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSk7dmFyIHM9bi5zY3JvbGxUb3A7bi5zY3JvbGxCeSgwLGkqci5saW5lSGVpZ2h0KSx0IT1udWxsJiZuLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpLG4uYW5pbWF0ZVNjcm9sbGluZyhzKX0sdGhpcy5zZWxlY3RQYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoMSwhMCl9LHRoaXMuc2VsZWN0UGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgtMSwhMCl9LHRoaXMuZ290b1BhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgxLCExKX0sdGhpcy5nb3RvUGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgtMSwhMSl9LHRoaXMuc2Nyb2xsUGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKDEpfSx0aGlzLnNjcm9sbFBhZ2VVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoLTEpfSx0aGlzLnNjcm9sbFRvUm93PWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3coZSl9LHRoaXMuc2Nyb2xsVG9MaW5lPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9MaW5lKGUsdCxuLHIpfSx0aGlzLmNlbnRlclNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSx0PXtyb3c6TWF0aC5mbG9vcihlLnN0YXJ0LnJvdysoZS5lbmQucm93LWUuc3RhcnQucm93KS8yKSxjb2x1bW46TWF0aC5mbG9vcihlLnN0YXJ0LmNvbHVtbisoZS5lbmQuY29sdW1uLWUuc3RhcnQuY29sdW1uKS8yKX07dGhpcy5yZW5kZXJlci5hbGlnbkN1cnNvcih0LC41KX0sdGhpcy5nZXRDdXJzb3JQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKX0sdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSl9LHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKX0sdGhpcy5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwoKX0sdGhpcy5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubW92ZUN1cnNvclRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9LHRoaXMuanVtcFRvTWF0Y2hpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldEN1cnNvclBvc2l0aW9uKCkscj1uZXcgeSh0aGlzLnNlc3Npb24sbi5yb3csbi5jb2x1bW4pLGk9ci5nZXRDdXJyZW50VG9rZW4oKSxzPWl8fHIuc3RlcEZvcndhcmQoKTtpZighcylyZXR1cm47dmFyIG8sdT0hMSxhPXt9LGY9bi5jb2x1bW4tcy5zdGFydCxsLGM9eyIpIjoiKCIsIigiOiIoIiwiXSI6IlsiLCJbIjoiWyIsInsiOiJ7IiwifSI6InsifTtkb3tpZihzLnZhbHVlLm1hdGNoKC9be30oKVxbXF1dL2cpKWZvcig7ZjxzLnZhbHVlLmxlbmd0aCYmIXU7ZisrKXtpZighY1tzLnZhbHVlW2ZdXSljb250aW51ZTtsPWNbcy52YWx1ZVtmXV0rIi4iK3MudHlwZS5yZXBsYWNlKCJycGFyZW4iLCJscGFyZW4iKSxpc05hTihhW2xdKSYmKGFbbF09MCk7c3dpdGNoKHMudmFsdWVbZl0pe2Nhc2UiKCI6Y2FzZSJbIjpjYXNlInsiOmFbbF0rKzticmVhaztjYXNlIikiOmNhc2UiXSI6Y2FzZSJ9IjphW2xdLS0sYVtsXT09PS0xJiYobz0iYnJhY2tldCIsdT0hMCl9fWVsc2Ugcy50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKGlzTmFOKGFbcy52YWx1ZV0pJiYoYVtzLnZhbHVlXT0wKSxpLnZhbHVlPT09IjwiP2Fbcy52YWx1ZV0rKzppLnZhbHVlPT09IjwvIiYmYVtzLnZhbHVlXS0tLGFbcy52YWx1ZV09PT0tMSYmKG89InRhZyIsdT0hMCkpO3V8fChpPXMscz1yLnN0ZXBGb3J3YXJkKCksZj0wKX13aGlsZShzJiYhdSk7aWYoIW8pcmV0dXJuO3ZhciBoLGQ7aWYobz09PSJicmFja2V0Iil7aD10aGlzLnNlc3Npb24uZ2V0QnJhY2tldFJhbmdlKG4pO2lmKCFoKXtoPW5ldyBwKHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStmLTEsci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2YtMSksZD1oLnN0YXJ0O2lmKHR8fGQucm93PT09bi5yb3cmJk1hdGguYWJzKGQuY29sdW1uLW4uY29sdW1uKTwyKWg9dGhpcy5zZXNzaW9uLmdldEJyYWNrZXRSYW5nZShkKX19ZWxzZSBpZihvPT09InRhZyIpe2lmKCFzfHxzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKT09PS0xKXJldHVybjt2YXIgdj1zLnZhbHVlO2g9bmV3IHAoci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIsci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIpO2lmKGguY29tcGFyZShuLnJvdyxuLmNvbHVtbik9PT0wKXt1PSExO2RvIHM9aSxpPXIuc3RlcEJhY2t3YXJkKCksaSYmKGkudHlwZS5pbmRleE9mKCJ0YWctY2xvc2UiKSE9PS0xJiZoLnNldEVuZChyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrMSkscy52YWx1ZT09PXYmJnMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJihpLnZhbHVlPT09IjwiP2Fbdl0rKzppLnZhbHVlPT09IjwvIiYmYVt2XS0tLGFbdl09PT0wJiYodT0hMCkpKTt3aGlsZShpJiYhdSl9cyYmcy50eXBlLmluZGV4T2YoInRhZy1uYW1lIikmJihkPWguc3RhcnQsZC5yb3c9PW4ucm93JiZNYXRoLmFicyhkLmNvbHVtbi1uLmNvbHVtbik8MiYmKGQ9aC5lbmQpKX1kPWgmJmguY3Vyc29yfHxkLGQmJihlP2gmJnQ/dGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UoaCk6aCYmaC5pc0VxdWFsKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk/dGhpcy5jbGVhclNlbGVjdGlvbigpOnRoaXMuc2VsZWN0aW9uLnNlbGVjdFRvKGQucm93LGQuY29sdW1uKTp0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oZC5yb3csZC5jb2x1bW4pKX0sdGhpcy5nb3RvTGluZT1mdW5jdGlvbihlLHQsbil7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlc3Npb24udW5mb2xkKHtyb3c6ZS0xLGNvbHVtbjp0fHwwfSksdGhpcy5leGl0TXVsdGlTZWxlY3RNb2RlJiZ0aGlzLmV4aXRNdWx0aVNlbGVjdE1vZGUoKSx0aGlzLm1vdmVDdXJzb3JUbyhlLTEsdHx8MCksdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZShlLTEpfHx0aGlzLnNjcm9sbFRvTGluZShlLTEsITAsbil9LHRoaXMubmF2aWdhdGVUbz1mdW5jdGlvbihlLHQpe3RoaXMuc2VsZWN0aW9uLm1vdmVUbyhlLHQpfSx0aGlzLm5hdmlnYXRlVXA9ZnVuY3Rpb24oZSl7aWYodGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSYmIXRoaXMuc2VsZWN0aW9uLmlzQmFja3dhcmRzKCkpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmFuY2hvci5nZXRQb3NpdGlvbigpO3JldHVybiB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfXRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KC1lfHwtMSwwKX0sdGhpcy5uYXZpZ2F0ZURvd249ZnVuY3Rpb24oZSl7aWYodGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSYmdGhpcy5zZWxlY3Rpb24uaXNCYWNrd2FyZHMoKSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uYW5jaG9yLmdldFBvc2l0aW9uKCk7cmV0dXJuIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoZXx8MSwwKX0sdGhpcy5uYXZpZ2F0ZUxlZnQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLnN0YXJ0O3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9ZWxzZXtlPWV8fDE7d2hpbGUoZS0tKXRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMZWZ0KCl9dGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlUmlnaHQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLmVuZDt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfWVsc2V7ZT1lfHwxO3doaWxlKGUtLSl0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yUmlnaHQoKX10aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZVN0YXJ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlTGluZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lRW5kKCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlRmlsZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlRW5kKCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlRmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVTdGFydCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkUmlnaHQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkTGVmdCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7dCYmdGhpcy4kc2VhcmNoLnNldCh0KTt2YXIgbj10aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pLHI9MDtyZXR1cm4gbj8odGhpcy4kdHJ5UmVwbGFjZShuLGUpJiYocj0xKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuKSx0aGlzLnJlbmRlcmVyLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KG4uc3RhcnQsbi5lbmQpLHIpOnJ9LHRoaXMucmVwbGFjZUFsbD1mdW5jdGlvbihlLHQpe3QmJnRoaXMuJHNlYXJjaC5zZXQodCk7dmFyIG49dGhpcy4kc2VhcmNoLmZpbmRBbGwodGhpcy5zZXNzaW9uKSxyPTA7aWYoIW4ubGVuZ3RoKXJldHVybiByO3ZhciBpPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oMCwwKTtmb3IodmFyIHM9bi5sZW5ndGgtMTtzPj0wOy0tcyl0aGlzLiR0cnlSZXBsYWNlKG5bc10sZSkmJnIrKztyZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoaSkscn0sdGhpcy4kdHJ5UmVwbGFjZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoZSk7cmV0dXJuIHQ9dGhpcy4kc2VhcmNoLnJlcGxhY2Uobix0KSx0IT09bnVsbD8oZS5lbmQ9dGhpcy5zZXNzaW9uLnJlcGxhY2UoZSx0KSxlKTpudWxsfSx0aGlzLmdldExhc3RTZWFyY2hPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlYXJjaC5nZXRPcHRpb25zKCl9LHRoaXMuZmluZD1mdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pLHR5cGVvZiBlPT0ic3RyaW5nInx8ZSBpbnN0YW5jZW9mIFJlZ0V4cD90Lm5lZWRsZT1lOnR5cGVvZiBlPT0ib2JqZWN0IiYmci5taXhpbih0LGUpO3ZhciBpPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5uZWVkbGU9PW51bGwmJihlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoaSl8fHRoaXMuJHNlYXJjaC4kb3B0aW9ucy5uZWVkbGUsZXx8KGk9dGhpcy5zZXNzaW9uLmdldFdvcmRSYW5nZShpLnN0YXJ0LnJvdyxpLnN0YXJ0LmNvbHVtbiksZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGkpKSx0aGlzLiRzZWFyY2guc2V0KHtuZWVkbGU6ZX0pKSx0aGlzLiRzZWFyY2guc2V0KHQpLHQuc3RhcnR8fHRoaXMuJHNlYXJjaC5zZXQoe3N0YXJ0Oml9KTt2YXIgcz10aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pO2lmKHQucHJldmVudFNjcm9sbClyZXR1cm4gcztpZihzKXJldHVybiB0aGlzLnJldmVhbFJhbmdlKHMsbiksczt0LmJhY2t3YXJkcz9pLnN0YXJ0PWkuZW5kOmkuZW5kPWkuc3RhcnQsdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UoaSl9LHRoaXMuZmluZE5leHQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmZpbmQoe3NraXBDdXJyZW50OiEwLGJhY2t3YXJkczohMX0sZSx0KX0sdGhpcy5maW5kUHJldmlvdXM9ZnVuY3Rpb24oZSx0KXt0aGlzLmZpbmQoZSx7c2tpcEN1cnJlbnQ6ITAsYmFja3dhcmRzOiEwfSx0KX0sdGhpcy5yZXZlYWxSYW5nZT1mdW5jdGlvbihlLHQpe3RoaXMuc2Vzc2lvbi51bmZvbGQoZSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZSk7dmFyIG49dGhpcy5yZW5kZXJlci5zY3JvbGxUb3A7dGhpcy5yZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyhlLnN0YXJ0LGUuZW5kLC41KSx0IT09ITEmJnRoaXMucmVuZGVyZXIuYW5pbWF0ZVNjcm9sbGluZyhuKX0sdGhpcy51bmRvPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkudW5kbyh0aGlzLnNlc3Npb24pLHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSl9LHRoaXMucmVkbz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLnJlZG8odGhpcy5zZXNzaW9uKSx0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmRlc3Ryb3koKSx0aGlzLl9zaWduYWwoImRlc3Ryb3kiLHRoaXMpLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmRlc3Ryb3koKX0sdGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3ZhciB0LG49dGhpcyxyPSExO3RoaXMuJHNjcm9sbEFuY2hvcnx8KHRoaXMuJHNjcm9sbEFuY2hvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7dmFyIGk9dGhpcy4kc2Nyb2xsQW5jaG9yO2kuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGUiLHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShpLHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpO3ZhciBzPXRoaXMub24oImNoYW5nZVNlbGVjdGlvbiIsZnVuY3Rpb24oKXtyPSEwfSksbz10aGlzLnJlbmRlcmVyLm9uKCJiZWZvcmVSZW5kZXIiLGZ1bmN0aW9uKCl7ciYmKHQ9bi5yZW5kZXJlci5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfSksdT10aGlzLnJlbmRlcmVyLm9uKCJhZnRlclJlbmRlciIsZnVuY3Rpb24oKXtpZihyJiZ0JiYobi5pc0ZvY3VzZWQoKXx8bi5zZWFyY2hCb3gmJm4uc2VhcmNoQm94LmlzRm9jdXNlZCgpKSl7dmFyIGU9bi5yZW5kZXJlcixzPWUuJGN1cnNvckxheWVyLiRwaXhlbFBvcyxvPWUubGF5ZXJDb25maWcsdT1zLnRvcC1vLm9mZnNldDtzLnRvcD49MCYmdSt0LnRvcDwwP3I9ITA6cy50b3A8by5oZWlnaHQmJnMudG9wK3QudG9wK28ubGluZUhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/cj0hMTpyPW51bGwsciE9bnVsbCYmKGkuc3R5bGUudG9wPXUrInB4IixpLnN0eWxlLmxlZnQ9cy5sZWZ0KyJweCIsaS5zdHlsZS5oZWlnaHQ9by5saW5lSGVpZ2h0KyJweCIsaS5zY3JvbGxJbnRvVmlldyhyKSkscj10PW51bGx9fSk7dGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc9ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm47ZGVsZXRlIHRoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3LHRoaXMub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLHMpLHRoaXMucmVuZGVyZXIub2ZmKCJhZnRlclJlbmRlciIsdSksdGhpcy5yZW5kZXJlci5vZmYoImJlZm9yZVJlbmRlciIsbyl9fSx0aGlzLiRyZXNldEN1cnNvclN0eWxlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kY3Vyc29yU3R5bGV8fCJhY2UiLHQ9dGhpcy5yZW5kZXJlci4kY3Vyc29yTGF5ZXI7aWYoIXQpcmV0dXJuO3Quc2V0U21vb3RoQmxpbmtpbmcoL3Ntb290aC8udGVzdChlKSksdC5pc0JsaW5raW5nPSF0aGlzLiRyZWFkT25seSYmZSE9IndpZGUiLGkuc2V0Q3NzQ2xhc3ModC5lbGVtZW50LCJhY2Vfc2xpbS1jdXJzb3JzIiwvc2xpbS8udGVzdChlKSl9LHRoaXMucHJvbXB0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2cubG9hZE1vZHVsZSgiLi9leHQvcHJvbXB0IixmdW5jdGlvbihpKXtpLnByb21wdChyLGUsdCxuKX0pfX0uY2FsbCh3LnByb3RvdHlwZSksZy5kZWZpbmVPcHRpb25zKHcucHJvdG90eXBlLCJlZGl0b3IiLHtzZWxlY3Rpb25TdHlsZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlbGVjdGlvblN0eWxlIix7ZGF0YTplfSl9LGluaXRpYWxWYWx1ZToibGluZSJ9LGhpZ2hsaWdodEFjdGl2ZUxpbmU6e3NldDpmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0saW5pdGlhbFZhbHVlOiEwfSxoaWdobGlnaHRTZWxlY3RlZFdvcmQ6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSgpfSxpbml0aWFsVmFsdWU6ITB9LHJlYWRPbmx5OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy50ZXh0SW5wdXQuc2V0UmVhZE9ubHkoZSksdGhpcy4kcmVzZXRDdXJzb3JTdHlsZSgpfSxpbml0aWFsVmFsdWU6ITF9LGNvcHlXaXRoRW1wdHlTZWxlY3Rpb246e3NldDpmdW5jdGlvbihlKXt0aGlzLnRleHRJbnB1dC5zZXRDb3B5V2l0aEVtcHR5U2VsZWN0aW9uKGUpfSxpbml0aWFsVmFsdWU6ITF9LGN1cnNvclN0eWxlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kcmVzZXRDdXJzb3JTdHlsZSgpfSx2YWx1ZXM6WyJhY2UiLCJzbGltIiwic21vb3RoIiwid2lkZSJdLGluaXRpYWxWYWx1ZToiYWNlIn0sbWVyZ2VVbmRvRGVsdGFzOnt2YWx1ZXM6WyExLCEwLCJhbHdheXMiXSxpbml0aWFsVmFsdWU6ITB9LGJlaGF2aW91cnNFbmFibGVkOntpbml0aWFsVmFsdWU6ITB9LHdyYXBCZWhhdmlvdXJzRW5hYmxlZDp7aW5pdGlhbFZhbHVlOiEwfSxhdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldyhlKX19LGtleWJvYXJkSGFuZGxlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4ka2V5YmluZGluZ0lkfSxoYW5kbGVzU2V0OiEwfSx2YWx1ZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5zZXRWYWx1ZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VmFsdWUoKX0saGFuZGxlc1NldDohMCxoaWRkZW46ITB9LHNlc3Npb246e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldFNlc3Npb24oZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb259LGhhbmRsZXNTZXQ6ITAsaGlkZGVuOiEwfSxzaG93TGluZU51bWJlcnM6e3NldDpmdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllci5zZXRTaG93TGluZU51bWJlcnMoZSksdGhpcy5yZW5kZXJlci4kbG9vcC5zY2hlZHVsZSh0aGlzLnJlbmRlcmVyLkNIQU5HRV9HVVRURVIpLGUmJnRoaXMuJHJlbGF0aXZlTGluZU51bWJlcnM/RS5hdHRhY2godGhpcyk6RS5kZXRhY2godGhpcyl9LGluaXRpYWxWYWx1ZTohMH0scmVsYXRpdmVMaW5lTnVtYmVyczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHNob3dMaW5lTnVtYmVycyYmZT9FLmF0dGFjaCh0aGlzKTpFLmRldGFjaCh0aGlzKX19LGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlOiJyZW5kZXJlciIsdlNjcm9sbEJhckFsd2F5c1Zpc2libGU6InJlbmRlcmVyIixoaWdobGlnaHRHdXR0ZXJMaW5lOiJyZW5kZXJlciIsYW5pbWF0ZWRTY3JvbGw6InJlbmRlcmVyIixzaG93SW52aXNpYmxlczoicmVuZGVyZXIiLHNob3dQcmludE1hcmdpbjoicmVuZGVyZXIiLHByaW50TWFyZ2luQ29sdW1uOiJyZW5kZXJlciIscHJpbnRNYXJnaW46InJlbmRlcmVyIixmYWRlRm9sZFdpZGdldHM6InJlbmRlcmVyIixzaG93Rm9sZFdpZGdldHM6InJlbmRlcmVyIixkaXNwbGF5SW5kZW50R3VpZGVzOiJyZW5kZXJlciIsc2hvd0d1dHRlcjoicmVuZGVyZXIiLGZvbnRTaXplOiJyZW5kZXJlciIsZm9udEZhbWlseToicmVuZGVyZXIiLG1heExpbmVzOiJyZW5kZXJlciIsbWluTGluZXM6InJlbmRlcmVyIixzY3JvbGxQYXN0RW5kOiJyZW5kZXJlciIsZml4ZWRXaWR0aEd1dHRlcjoicmVuZGVyZXIiLHRoZW1lOiJyZW5kZXJlciIsaGFzQ3NzVHJhbnNmb3JtczoicmVuZGVyZXIiLG1heFBpeGVsSGVpZ2h0OiJyZW5kZXJlciIsdXNlVGV4dGFyZWFGb3JJTUU6InJlbmRlcmVyIixzY3JvbGxTcGVlZDoiJG1vdXNlSGFuZGxlciIsZHJhZ0RlbGF5OiIkbW91c2VIYW5kbGVyIixkcmFnRW5hYmxlZDoiJG1vdXNlSGFuZGxlciIsZm9jdXNUaW1lb3V0OiIkbW91c2VIYW5kbGVyIix0b29sdGlwRm9sbG93c01vdXNlOiIkbW91c2VIYW5kbGVyIixmaXJzdExpbmVOdW1iZXI6InNlc3Npb24iLG92ZXJ3cml0ZToic2Vzc2lvbiIsbmV3TGluZU1vZGU6InNlc3Npb24iLHVzZVdvcmtlcjoic2Vzc2lvbiIsdXNlU29mdFRhYnM6InNlc3Npb24iLG5hdmlnYXRlV2l0aGluU29mdFRhYnM6InNlc3Npb24iLHRhYlNpemU6InNlc3Npb24iLHdyYXA6InNlc3Npb24iLGluZGVudGVkU29mdFdyYXA6InNlc3Npb24iLGZvbGRTdHlsZToic2Vzc2lvbiIsbW9kZToic2Vzc2lvbiJ9KTt2YXIgRT17Z2V0VGV4dDpmdW5jdGlvbihlLHQpe3JldHVybihNYXRoLmFicyhlLnNlbGVjdGlvbi5sZWFkLnJvdy10KXx8dCsxKyh0PDk/Ilx1MDBiNyI6IiIpKSsiIn0sZ2V0V2lkdGg6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBNYXRoLm1heCh0LnRvU3RyaW5nKCkubGVuZ3RoLChuLmxhc3RSb3crMSkudG9TdHJpbmcoKS5sZW5ndGgsMikqbi5jaGFyYWN0ZXJXaWR0aH0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7dC5yZW5kZXJlci4kbG9vcC5zY2hlZHVsZSh0LnJlbmRlcmVyLkNIQU5HRV9HVVRURVIpfSxhdHRhY2g6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJHJlbmRlcmVyPXRoaXMsZS5vbigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLnVwZGF0ZSksdGhpcy51cGRhdGUobnVsbCxlKX0sZGV0YWNoOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuJGd1dHRlckxheWVyLiRyZW5kZXJlcj09dGhpcyYmKGUucmVuZGVyZXIuJGd1dHRlckxheWVyLiRyZW5kZXJlcj1udWxsKSxlLm9mZigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLnVwZGF0ZSksdGhpcy51cGRhdGUobnVsbCxlKX19O3QuRWRpdG9yPXd9KSxhY2UuZGVmaW5lKCJhY2UvdW5kb21hbmFnZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG49dDtuLS07KXt2YXIgcj1lW25dO2lmKHImJiFyWzBdLmlnbm9yZSl7d2hpbGUobjx0LTEpe3ZhciBpPWQoZVtuXSxlW24rMV0pO2Vbbl09aVswXSxlW24rMV09aVsxXSxuKyt9cmV0dXJuITB9fX1mdW5jdGlvbiBhKGUpe3ZhciB0PWUuYWN0aW9uPT0iaW5zZXJ0IixuPWUuc3RhcnQscj1lLmVuZCxpPShyLnJvdy1uLnJvdykqKHQ/MTotMSkscz0oci5jb2x1bW4tbi5jb2x1bW4pKih0PzE6LTEpO3QmJihyPW4pO2Zvcih2YXIgbyBpbiB0aGlzLm1hcmtzKXt2YXIgYT10aGlzLm1hcmtzW29dLGY9dShhLG4pO2lmKGY8MCljb250aW51ZTtpZihmPT09MCYmdCl7aWYoYS5iaWFzIT0xKXthLmJpYXM9PS0xO2NvbnRpbnVlfWY9MX12YXIgbD10P2Y6dShhLHIpO2lmKGw+MCl7YS5yb3crPWksYS5jb2x1bW4rPWEucm93PT1yLnJvdz9zOjA7Y29udGludWV9IXQmJmw8PTAmJihhLnJvdz1uLnJvdyxhLmNvbHVtbj1uLmNvbHVtbixsPT09MCYmKGEuYmlhcz0xKSl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJue3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW59fWZ1bmN0aW9uIGwoZSl7cmV0dXJue3N0YXJ0OmYoZS5zdGFydCksZW5kOmYoZS5lbmQpLGFjdGlvbjplLmFjdGlvbixsaW5lczplLmxpbmVzLnNsaWNlKCl9fWZ1bmN0aW9uIGMoZSl7ZT1lfHx0aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGUubWFwKGMpLmpvaW4oIlxuIik7dmFyIHQ9IiI7ZS5hY3Rpb24/KHQ9ZS5hY3Rpb249PSJpbnNlcnQiPyIrIjoiLSIsdCs9IlsiK2UubGluZXMrIl0iKTplLnZhbHVlJiYoQXJyYXkuaXNBcnJheShlLnZhbHVlKT90PWUudmFsdWUubWFwKGgpLmpvaW4oIlxuIik6dD1oKGUudmFsdWUpKSxlLnN0YXJ0JiYodCs9aChlKSk7aWYoZS5pZHx8ZS5yZXYpdCs9IgkoIisoZS5pZHx8ZS5yZXYpKyIpIjtyZXR1cm4gdH1mdW5jdGlvbiBoKGUpe3JldHVybiBlLnN0YXJ0LnJvdysiOiIrZS5zdGFydC5jb2x1bW4rIj0+IitlLmVuZC5yb3crIjoiK2UuZW5kLmNvbHVtbn1mdW5jdGlvbiBwKGUsdCl7dmFyIG49ZS5hY3Rpb249PSJpbnNlcnQiLHI9dC5hY3Rpb249PSJpbnNlcnQiO2lmKG4mJnIpaWYobyh0LnN0YXJ0LGUuZW5kKT49MCltKHQsZSwtMSk7ZWxzZXtpZighKG8odC5zdGFydCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsMSl9ZWxzZSBpZihuJiYhcilpZihvKHQuc3RhcnQsZS5lbmQpPj0wKW0odCxlLC0xKTtlbHNle2lmKCEobyh0LmVuZCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsLTEpfWVsc2UgaWYoIW4mJnIpaWYobyh0LnN0YXJ0LGUuc3RhcnQpPj0wKW0odCxlLDEpO2Vsc2V7aWYoIShvKHQuc3RhcnQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LDEpfWVsc2UgaWYoIW4mJiFyKWlmKG8odC5zdGFydCxlLnN0YXJ0KT49MCltKHQsZSwxKTtlbHNle2lmKCEobyh0LmVuZCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsLTEpfXJldHVyblt0LGVdfWZ1bmN0aW9uIGQoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGg7bi0tOylmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKylpZighcChlW25dLHRbcl0pKXt3aGlsZShuPGUubGVuZ3RoKXt3aGlsZShyLS0pcCh0W3JdLGVbbl0pO3I9dC5sZW5ndGgsbisrfXJldHVybltlLHRdfXJldHVybiBlLnNlbGVjdGlvbkJlZm9yZT10LnNlbGVjdGlvbkJlZm9yZT1lLnNlbGVjdGlvbkFmdGVyPXQuc2VsZWN0aW9uQWZ0ZXI9bnVsbCxbdCxlXX1mdW5jdGlvbiB2KGUsdCl7dmFyIG49ZS5hY3Rpb249PSJpbnNlcnQiLHI9dC5hY3Rpb249PSJpbnNlcnQiO2lmKG4mJnIpbyhlLnN0YXJ0LHQuc3RhcnQpPDA/bSh0LGUsMSk6bShlLHQsMSk7ZWxzZSBpZihuJiYhcilvKGUuc3RhcnQsdC5lbmQpPj0wP20oZSx0LC0xKTpvKGUuc3RhcnQsdC5zdGFydCk8PTA/bSh0LGUsMSk6KG0oZSxzLmZyb21Qb2ludHModC5zdGFydCxlLnN0YXJ0KSwtMSksbSh0LGUsMSkpO2Vsc2UgaWYoIW4mJnIpbyh0LnN0YXJ0LGUuZW5kKT49MD9tKHQsZSwtMSk6byh0LnN0YXJ0LGUuc3RhcnQpPD0wP20oZSx0LDEpOihtKHQscy5mcm9tUG9pbnRzKGUuc3RhcnQsdC5zdGFydCksLTEpLG0oZSx0LDEpKTtlbHNlIGlmKCFuJiYhcilpZihvKHQuc3RhcnQsZS5lbmQpPj0wKW0odCxlLC0xKTtlbHNle2lmKCEobyh0LmVuZCxlLnN0YXJ0KTw9MCkpe3ZhciBpLHU7cmV0dXJuIG8oZS5zdGFydCx0LnN0YXJ0KTwwJiYoaT1lLGU9eShlLHQuc3RhcnQpKSxvKGUuZW5kLHQuZW5kKT4wJiYodT15KGUsdC5lbmQpKSxnKHQuZW5kLGUuc3RhcnQsZS5lbmQsLTEpLHUmJiFpJiYoZS5saW5lcz11LmxpbmVzLGUuc3RhcnQ9dS5zdGFydCxlLmVuZD11LmVuZCx1PWUpLFt0LGksdV0uZmlsdGVyKEJvb2xlYW4pfW0oZSx0LC0xKX1yZXR1cm5bdCxlXX1mdW5jdGlvbiBtKGUsdCxuKXtnKGUuc3RhcnQsdC5zdGFydCx0LmVuZCxuKSxnKGUuZW5kLHQuc3RhcnQsdC5lbmQsbil9ZnVuY3Rpb24gZyhlLHQsbixyKXtlLnJvdz09KHI9PTE/dDpuKS5yb3cmJihlLmNvbHVtbis9cioobi5jb2x1bW4tdC5jb2x1bW4pKSxlLnJvdys9cioobi5yb3ctdC5yb3cpfWZ1bmN0aW9uIHkoZSx0KXt2YXIgbj1lLmxpbmVzLHI9ZS5lbmQ7ZS5lbmQ9Zih0KTt2YXIgaT1lLmVuZC5yb3ctZS5zdGFydC5yb3cscz1uLnNwbGljZShpLG4ubGVuZ3RoKSxvPWk/dC5jb2x1bW46dC5jb2x1bW4tZS5zdGFydC5jb2x1bW47bi5wdXNoKHNbMF0uc3Vic3RyaW5nKDAsbykpLHNbMF09c1swXS5zdWJzdHIobyk7dmFyIHU9e3N0YXJ0OmYodCksZW5kOnIsbGluZXM6cyxhY3Rpb246ZS5hY3Rpb259O3JldHVybiB1fWZ1bmN0aW9uIGIoZSx0KXt0PWwodCk7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl07Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV0sbz12KHMsdCk7dD1vWzBdLG8ubGVuZ3RoIT0yJiYob1syXT8oci5zcGxpY2UoaSsxLDEsb1sxXSxvWzJdKSxpKyspOm9bMV18fChyLnNwbGljZShpLDEpLGktLSkpfXIubGVuZ3RofHxlLnNwbGljZShuLDEpfXJldHVybiBlfWZ1bmN0aW9uIHcoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyliKGUscltpXSl9fXZhciByPWZ1bmN0aW9uKCl7dGhpcy4kbWF4UmV2PTAsdGhpcy4kZnJvbVVuZG89ITEsdGhpcy5yZXNldCgpfTsoZnVuY3Rpb24oKXt0aGlzLmFkZFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy4kc2Vzc2lvbj1lfSx0aGlzLmFkZD1mdW5jdGlvbihlLHQsbil7aWYodGhpcy4kZnJvbVVuZG8pcmV0dXJuO2lmKGU9PXRoaXMuJGxhc3REZWx0YSlyZXR1cm47aWYodD09PSExfHwhdGhpcy5sYXN0RGVsdGFzKXRoaXMubGFzdERlbHRhcz1bXSx0aGlzLiR1bmRvU3RhY2sucHVzaCh0aGlzLmxhc3REZWx0YXMpLGUuaWQ9dGhpcy4kcmV2PSsrdGhpcy4kbWF4UmV2O2lmKGUuYWN0aW9uPT0icmVtb3ZlInx8ZS5hY3Rpb249PSJpbnNlcnQiKXRoaXMuJGxhc3REZWx0YT1lO3RoaXMubGFzdERlbHRhcy5wdXNoKGUpfSx0aGlzLmFkZFNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuc2VsZWN0aW9ucy5wdXNoKHt2YWx1ZTplLHJldjp0fHx0aGlzLiRyZXZ9KX0sdGhpcy5zdGFydE5ld0dyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFzdERlbHRhcz1udWxsLHRoaXMuJHJldn0sdGhpcy5tYXJrSWdub3JlZD1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKTt2YXIgbj10aGlzLiR1bmRvU3RhY2s7Zm9yKHZhciByPW4ubGVuZ3RoO3ItLTspe3ZhciBpPW5bcl1bMF07aWYoaS5pZDw9ZSlicmVhaztpLmlkPHQmJihpLmlnbm9yZT0hMCl9dGhpcy5sYXN0RGVsdGFzPW51bGx9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZWxlY3Rpb25zO2Zvcih2YXIgcj1uLmxlbmd0aDtyLS07KXt2YXIgaT1uW3JdO2lmKGkucmV2PGUpcmV0dXJuIHQmJihpPW5bcisxXSksaX19LHRoaXMuZ2V0UmV2aXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmV2fSx0aGlzLmdldERlbHRhcz1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKTt2YXIgbj10aGlzLiR1bmRvU3RhY2sscj1udWxsLGk9MDtmb3IodmFyIHM9bi5sZW5ndGg7cy0tOyl7dmFyIG89bltzXVswXTtvLmlkPHQmJiFyJiYocj1zKzEpO2lmKG8uaWQ8PWUpe2k9cysxO2JyZWFrfX1yZXR1cm4gbi5zbGljZShpLHIpfSx0aGlzLmdldENoYW5nZWRSYW5nZXM9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSl9LHRoaXMuZ2V0Q2hhbmdlZExpbmVzPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpfSx0aGlzLnVuZG89ZnVuY3Rpb24oZSx0KXt0aGlzLmxhc3REZWx0YXM9bnVsbDt2YXIgbj10aGlzLiR1bmRvU3RhY2s7aWYoIWkobixuLmxlbmd0aCkpcmV0dXJuO2V8fChlPXRoaXMuJHNlc3Npb24pLHRoaXMuJHJlZG9TdGFja0Jhc2VSZXYhPT10aGlzLiRyZXYmJnRoaXMuJHJlZG9TdGFjay5sZW5ndGgmJih0aGlzLiRyZWRvU3RhY2s9W10pLHRoaXMuJGZyb21VbmRvPSEwO3ZhciByPW4ucG9wKCkscz1udWxsO3JldHVybiByJiZyLmxlbmd0aCYmKHM9ZS51bmRvQ2hhbmdlcyhyLHQpLHRoaXMuJHJlZG9TdGFjay5wdXNoKHIpLHRoaXMuJHN5bmNSZXYoKSksdGhpcy4kZnJvbVVuZG89ITEsc30sdGhpcy5yZWRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5sYXN0RGVsdGFzPW51bGwsZXx8KGU9dGhpcy4kc2Vzc2lvbiksdGhpcy4kZnJvbVVuZG89ITA7aWYodGhpcy4kcmVkb1N0YWNrQmFzZVJldiE9dGhpcy4kcmV2KXt2YXIgbj10aGlzLmdldERlbHRhcyh0aGlzLiRyZWRvU3RhY2tCYXNlUmV2LHRoaXMuJHJldisxKTt3KHRoaXMuJHJlZG9TdGFjayxuKSx0aGlzLiRyZWRvU3RhY2tCYXNlUmV2PXRoaXMuJHJldix0aGlzLiRyZWRvU3RhY2suZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdLmlkPSsrdGhpcy4kbWF4UmV2fSx0aGlzKX12YXIgcj10aGlzLiRyZWRvU3RhY2sucG9wKCksaT1udWxsO3JldHVybiByJiYoaT1lLnJlZG9DaGFuZ2VzKHIsdCksdGhpcy4kdW5kb1N0YWNrLnB1c2gociksdGhpcy4kc3luY1JldigpKSx0aGlzLiRmcm9tVW5kbz0hMSxpfSx0aGlzLiRzeW5jUmV2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kdW5kb1N0YWNrLHQ9ZVtlLmxlbmd0aC0xXSxuPXQmJnRbMF0uaWR8fDA7dGhpcy4kcmVkb1N0YWNrQmFzZVJldj1uLHRoaXMuJHJldj1ufSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5sYXN0RGVsdGFzPW51bGwsdGhpcy4kbGFzdERlbHRhPW51bGwsdGhpcy4kdW5kb1N0YWNrPVtdLHRoaXMuJHJlZG9TdGFjaz1bXSx0aGlzLiRyZXY9MCx0aGlzLm1hcms9MCx0aGlzLiRyZWRvU3RhY2tCYXNlUmV2PXRoaXMuJHJldix0aGlzLnNlbGVjdGlvbnM9W119LHRoaXMuY2FuVW5kbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1bmRvU3RhY2subGVuZ3RoPjB9LHRoaXMuY2FuUmVkbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZWRvU3RhY2subGVuZ3RoPjB9LHRoaXMuYm9va21hcms9ZnVuY3Rpb24oZSl7ZT09dW5kZWZpbmVkJiYoZT10aGlzLiRyZXYpLHRoaXMubWFyaz1lfSx0aGlzLmlzQXRCb29rbWFyaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZXY9PT10aGlzLm1hcmt9LHRoaXMudG9KU09OPWZ1bmN0aW9uKCl7fSx0aGlzLmZyb21KU09OPWZ1bmN0aW9uKCl7fSx0aGlzLmhhc1VuZG89dGhpcy5jYW5VbmRvLHRoaXMuaGFzUmVkbz10aGlzLmNhblJlZG8sdGhpcy5pc0NsZWFuPXRoaXMuaXNBdEJvb2ttYXJrLHRoaXMubWFya0NsZWFuPXRoaXMuYm9va21hcmssdGhpcy4kcHJldHR5UHJpbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/YyhlKTpjKHRoaXMuJHVuZG9TdGFjaykrIlxuLS0tXG4iK2ModGhpcy4kcmVkb1N0YWNrKX19KS5jYWxsKHIucHJvdG90eXBlKTt2YXIgcz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1zLmNvbXBhcmVQb2ludHMsdT1zLmNvbXBhcmVQb2ludHM7dC5VbmRvTWFuYWdlcj1yfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2xpbmVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9kb20iKSxpPWZ1bmN0aW9uKGUsdCl7dGhpcy5lbGVtZW50PWUsdGhpcy5jYW52YXNIZWlnaHQ9dHx8NWU1LHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5jYW52YXNIZWlnaHQqMisicHgiLHRoaXMuY2VsbHM9W10sdGhpcy5jZWxsQ2FjaGU9W10sdGhpcy4kb2Zmc2V0Q29lZmZpY2llbnQ9MH07KGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ29udGFpbmVyPWZ1bmN0aW9uKGUpe3IudHJhbnNsYXRlKHRoaXMuZWxlbWVudCwwLC0oZS5maXJzdFJvd1NjcmVlbiplLmxpbmVIZWlnaHQldGhpcy5jYW52YXNIZWlnaHQpLWUub2Zmc2V0KnRoaXMuJG9mZnNldENvZWZmaWNpZW50KX0sdGhpcy5wYWdlQ2hhbmdlZD1mdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmZsb29yKGUuZmlyc3RSb3dTY3JlZW4qZS5saW5lSGVpZ2h0L3RoaXMuY2FudmFzSGVpZ2h0KSE9PU1hdGguZmxvb3IodC5maXJzdFJvd1NjcmVlbip0LmxpbmVIZWlnaHQvdGhpcy5jYW52YXNIZWlnaHQpfSx0aGlzLmNvbXB1dGVMaW5lVG9wPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LmZpcnN0Um93U2NyZWVuKnQubGluZUhlaWdodCxpPU1hdGguZmxvb3Ioci90aGlzLmNhbnZhc0hlaWdodCkscz1uLmRvY3VtZW50VG9TY3JlZW5Sb3coZSwwKSp0LmxpbmVIZWlnaHQ7cmV0dXJuIHMtaSp0aGlzLmNhbnZhc0hlaWdodH0sdGhpcy5jb21wdXRlTGluZUhlaWdodD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQubGluZUhlaWdodCpuLmdldFJvd0xlbmd0aChlKX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxscy5sZW5ndGh9LHRoaXMuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNlbGxzW2VdfSx0aGlzLnNoaWZ0PWZ1bmN0aW9uKCl7dGhpcy4kY2FjaGVDZWxsKHRoaXMuY2VsbHMuc2hpZnQoKSl9LHRoaXMucG9wPWZ1bmN0aW9uKCl7dGhpcy4kY2FjaGVDZWxsKHRoaXMuY2VsbHMucG9wKCkpfSx0aGlzLnB1c2g9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7dGhpcy5jZWxscy5wdXNoLmFwcGx5KHRoaXMuY2VsbHMsZSk7dmFyIHQ9ci5jcmVhdGVGcmFnbWVudCh0aGlzLmVsZW1lbnQpO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5lbGVtZW50KTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9ZWxzZSB0aGlzLmNlbGxzLnB1c2goZSksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGUuZWxlbWVudCl9LHRoaXMudW5zaGlmdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt0aGlzLmNlbGxzLnVuc2hpZnQuYXBwbHkodGhpcy5jZWxscyxlKTt2YXIgdD1yLmNyZWF0ZUZyYWdtZW50KHRoaXMuZWxlbWVudCk7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdC5hcHBlbmRDaGlsZChlW25dLmVsZW1lbnQpO3RoaXMuZWxlbWVudC5maXJzdENoaWxkP3RoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUodCx0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk6dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHQpfWVsc2UgdGhpcy5jZWxscy51bnNoaWZ0KGUpLHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLGUuZWxlbWVudCl9LHRoaXMubGFzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGxzLmxlbmd0aD90aGlzLmNlbGxzW3RoaXMuY2VsbHMubGVuZ3RoLTFdOm51bGx9LHRoaXMuJGNhY2hlQ2VsbD1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47ZS5lbGVtZW50LnJlbW92ZSgpLHRoaXMuY2VsbENhY2hlLnB1c2goZSl9LHRoaXMuY3JlYXRlQ2VsbD1mdW5jdGlvbihlLHQsbixpKXt2YXIgcz10aGlzLmNlbGxDYWNoZS5wb3AoKTtpZighcyl7dmFyIG89ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtpJiZpKG8pLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChvKSxzPXtlbGVtZW50Om8sdGV4dDoiIixyb3c6ZX19cmV0dXJuIHMucm93PWUsc319KS5jYWxsKGkucHJvdG90eXBlKSx0LkxpbmVzPWl9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvZ3V0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9sYXllci9saW5lcyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7ZS5hcHBlbmRDaGlsZCh0KTt2YXIgbj1yLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyZXR1cm4gZS5hcHBlbmRDaGlsZChuKSxlfXZhciByPWUoIi4uL2xpYi9kb20iKSxpPWUoIi4uL2xpYi9vb3AiKSxzPWUoIi4uL2xpYi9sYW5nIiksbz1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix1PWUoIi4vbGluZXMiKS5MaW5lcyxhPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfZ3V0dGVyLWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5zZXRTaG93Rm9sZFdpZGdldHModGhpcy4kc2hvd0ZvbGRXaWRnZXRzKSx0aGlzLmd1dHRlcldpZHRoPTAsdGhpcy4kYW5ub3RhdGlvbnM9W10sdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnM9dGhpcy4kdXBkYXRlQW5ub3RhdGlvbnMuYmluZCh0aGlzKSx0aGlzLiRsaW5lcz1uZXcgdSh0aGlzLmVsZW1lbnQpLHRoaXMuJGxpbmVzLiRvZmZzZXRDb2VmZmljaWVudD0xfTsoZnVuY3Rpb24oKXtpLmltcGxlbWVudCh0aGlzLG8pLHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUFubm90YXRpb25zKSx0aGlzLnNlc3Npb249ZSxlJiZlLm9uKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUFubm90YXRpb25zKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkIHVzZSBzZXNzaW9uLmFkZEd1dHRlckRlY29yYXRpb24iKSx0aGlzLnNlc3Npb24uYWRkR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQgdXNlIHNlc3Npb24ucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbiIpLHRoaXMuc2Vzc2lvbi5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kYW5ub3RhdGlvbnM9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF0scj1uLnJvdyxpPXRoaXMuJGFubm90YXRpb25zW3JdO2l8fChpPXRoaXMuJGFubm90YXRpb25zW3JdPXt0ZXh0OltdfSk7dmFyIG89bi50ZXh0O289bz9zLmVzY2FwZUhUTUwobyk6bi5odG1sfHwiIixpLnRleHQuaW5kZXhPZihvKT09PS0xJiZpLnRleHQucHVzaChvKTt2YXIgdT1uLnR5cGU7dT09ImVycm9yIj9pLmNsYXNzTmFtZT0iIGFjZV9lcnJvciI6dT09Indhcm5pbmciJiZpLmNsYXNzTmFtZSE9IiBhY2VfZXJyb3IiP2kuY2xhc3NOYW1lPSIgYWNlX3dhcm5pbmciOnU9PSJpbmZvIiYmIWkuY2xhc3NOYW1lJiYoaS5jbGFzc05hbWU9IiBhY2VfaW5mbyIpfX0sdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGFubm90YXRpb25zLmxlbmd0aClyZXR1cm47dmFyIHQ9ZS5zdGFydC5yb3csbj1lLmVuZC5yb3ctdDtpZihuIT09MClpZihlLmFjdGlvbj09InJlbW92ZSIpdGhpcy4kYW5ub3RhdGlvbnMuc3BsaWNlKHQsbisxLG51bGwpO2Vsc2V7dmFyIHI9bmV3IEFycmF5KG4rMSk7ci51bnNoaWZ0KHQsMSksdGhpcy4kYW5ub3RhdGlvbnMuc3BsaWNlLmFwcGx5KHRoaXMuJGFubm90YXRpb25zLHIpfX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5jb25maWc9ZTt2YXIgdD10aGlzLnNlc3Npb24sbj1lLmZpcnN0Um93LHI9TWF0aC5taW4oZS5sYXN0Um93K2UuZ3V0dGVyT2Zmc2V0LHQuZ2V0TGVuZ3RoKCktMSk7dGhpcy5vbGRMYXN0Um93PXIsdGhpcy5jb25maWc9ZSx0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpLHRoaXMuJHVwZGF0ZUN1cnNvclJvdygpO3ZhciBpPXQuZ2V0TmV4dEZvbGRMaW5lKG4pLHM9aT9pLnN0YXJ0LnJvdzpJbmZpbml0eSxvPW51bGwsdT0tMSxhPW47Zm9yKDs7KXthPnMmJihhPWkuZW5kLnJvdysxLGk9dC5nZXROZXh0Rm9sZExpbmUoYSxpKSxzPWk/aS5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGE+cil7d2hpbGUodGhpcy4kbGluZXMuZ2V0TGVuZ3RoKCk+dSsxKXRoaXMuJGxpbmVzLnBvcCgpO2JyZWFrfW89dGhpcy4kbGluZXMuZ2V0KCsrdSksbz9vLnJvdz1hOihvPXRoaXMuJGxpbmVzLmNyZWF0ZUNlbGwoYSxlLHRoaXMuc2Vzc2lvbixmKSx0aGlzLiRsaW5lcy5wdXNoKG8pKSx0aGlzLiRyZW5kZXJDZWxsKG8sZSxpLGEpLGErK310aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIiksdGhpcy4kdXBkYXRlR3V0dGVyV2lkdGgoZSl9LHRoaXMuJHVwZGF0ZUd1dHRlcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbixuPXQuZ3V0dGVyUmVuZGVyZXJ8fHRoaXMuJHJlbmRlcmVyLHI9dC4kZmlyc3RMaW5lTnVtYmVyLGk9dGhpcy4kbGluZXMubGFzdCgpP3RoaXMuJGxpbmVzLmxhc3QoKS50ZXh0OiIiO2lmKHRoaXMuJGZpeGVkV2lkdGh8fHQuJHVzZVdyYXBNb2RlKWk9dC5nZXRMZW5ndGgoKStyLTE7dmFyIHM9bj9uLmdldFdpZHRoKHQsaSxlKTppLnRvU3RyaW5nKCkubGVuZ3RoKmUuY2hhcmFjdGVyV2lkdGgsbz10aGlzLiRwYWRkaW5nfHx0aGlzLiRjb21wdXRlUGFkZGluZygpO3MrPW8ubGVmdCtvLnJpZ2h0LHMhPT10aGlzLmd1dHRlcldpZHRoJiYhaXNOYU4ocykmJih0aGlzLmd1dHRlcldpZHRoPXMsdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuc3R5bGUud2lkdGg9dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPU1hdGguY2VpbCh0aGlzLmd1dHRlcldpZHRoKSsicHgiLHRoaXMuX3NpZ25hbCgiY2hhbmdlR3V0dGVyV2lkdGgiLHMpKX0sdGhpcy4kdXBkYXRlQ3Vyc29yUm93PWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCk7aWYodGhpcy4kY3Vyc29yUm93PT09ZS5yb3cpcmV0dXJuO3RoaXMuJGN1cnNvclJvdz1lLnJvd30sdGhpcy51cGRhdGVMaW5lSGlnaGxpZ2h0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uY3Vyc29yLnJvdzt0aGlzLiRjdXJzb3JSb3c9ZTtpZih0aGlzLiRjdXJzb3JDZWxsJiZ0aGlzLiRjdXJzb3JDZWxsLnJvdz09ZSlyZXR1cm47dGhpcy4kY3Vyc29yQ2VsbCYmKHRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWU9dGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKCJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIsIiIpKTt2YXIgdD10aGlzLiRsaW5lcy5jZWxsczt0aGlzLiRjdXJzb3JDZWxsPW51bGw7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07aWYoci5yb3c+PXRoaXMuJGN1cnNvclJvdyl7aWYoci5yb3c+dGhpcy4kY3Vyc29yUm93KXt2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUodGhpcy4kY3Vyc29yUm93KTtpZighKG4+MCYmaSYmaS5zdGFydC5yb3c9PXRbbi0xXS5yb3cpKWJyZWFrO3I9dFtuLTFdfXIuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIityLmVsZW1lbnQuY2xhc3NOYW1lLHRoaXMuJGN1cnNvckNlbGw9cjticmVha319fSx0aGlzLnNjcm9sbExpbmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnO3RoaXMuY29uZmlnPWUsdGhpcy4kdXBkYXRlQ3Vyc29yUm93KCk7aWYodGhpcy4kbGluZXMucGFnZUNoYW5nZWQodCxlKSlyZXR1cm4gdGhpcy51cGRhdGUoZSk7dGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKTt2YXIgbj1NYXRoLm1pbihlLmxhc3RSb3crZS5ndXR0ZXJPZmZzZXQsdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTEpLHI9dGhpcy5vbGRMYXN0Um93O3RoaXMub2xkTGFzdFJvdz1uO2lmKCF0fHxyPGUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKG48dC5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYodC5maXJzdFJvdzxlLmZpcnN0Um93KWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQodC5maXJzdFJvdyxlLmZpcnN0Um93LTEpO2k+MDtpLS0pdGhpcy4kbGluZXMuc2hpZnQoKTtpZihyPm4pZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChuKzEscik7aT4wO2ktLSl0aGlzLiRsaW5lcy5wb3AoKTtlLmZpcnN0Um93PHQuZmlyc3RSb3cmJnRoaXMuJGxpbmVzLnVuc2hpZnQodGhpcy4kcmVuZGVyTGluZXMoZSxlLmZpcnN0Um93LHQuZmlyc3RSb3ctMSkpLG4+ciYmdGhpcy4kbGluZXMucHVzaCh0aGlzLiRyZW5kZXJMaW5lcyhlLHIrMSxuKSksdGhpcy51cGRhdGVMaW5lSGlnaGxpZ2h0KCksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpLHRoaXMuJHVwZGF0ZUd1dHRlcldpZHRoKGUpfSx0aGlzLiRyZW5kZXJMaW5lcz1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT10LHM9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShpKSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXtpPm8mJihpPXMuZW5kLnJvdysxLHM9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShpLHMpLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYoaT5uKWJyZWFrO3ZhciB1PXRoaXMuJGxpbmVzLmNyZWF0ZUNlbGwoaSxlLHRoaXMuc2Vzc2lvbixmKTt0aGlzLiRyZW5kZXJDZWxsKHUsZSxzLGkpLHIucHVzaCh1KSxpKyt9cmV0dXJuIHJ9LHRoaXMuJHJlbmRlckNlbGw9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHM9ZS5lbGVtZW50LG89dGhpcy5zZXNzaW9uLHU9cy5jaGlsZE5vZGVzWzBdLGE9cy5jaGlsZE5vZGVzWzFdLGY9by4kZmlyc3RMaW5lTnVtYmVyLGw9by4kYnJlYWtwb2ludHMsYz1vLiRkZWNvcmF0aW9ucyxoPW8uZ3V0dGVyUmVuZGVyZXJ8fHRoaXMuJHJlbmRlcmVyLHA9dGhpcy4kc2hvd0ZvbGRXaWRnZXRzJiZvLmZvbGRXaWRnZXRzLGQ9bj9uLnN0YXJ0LnJvdzpOdW1iZXIuTUFYX1ZBTFVFLHY9ImFjZV9ndXR0ZXItY2VsbCAiO3RoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUmJihpPT10aGlzLiRjdXJzb3JSb3d8fG4mJmk8dGhpcy4kY3Vyc29yUm93JiZpPj1kJiZ0aGlzLiRjdXJzb3JSb3c8PW4uZW5kLnJvdykmJih2Kz0iYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiLHRoaXMuJGN1cnNvckNlbGwhPWUmJih0aGlzLiRjdXJzb3JDZWxsJiYodGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZT10aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIiwiIikpLHRoaXMuJGN1cnNvckNlbGw9ZSkpLGxbaV0mJih2Kz1sW2ldKSxjW2ldJiYodis9Y1tpXSksdGhpcy4kYW5ub3RhdGlvbnNbaV0mJih2Kz10aGlzLiRhbm5vdGF0aW9uc1tpXS5jbGFzc05hbWUpLHMuY2xhc3NOYW1lIT12JiYocy5jbGFzc05hbWU9dik7aWYocCl7dmFyIG09cFtpXTttPT1udWxsJiYobT1wW2ldPW8uZ2V0Rm9sZFdpZGdldChpKSl9aWYobSl7dmFyIHY9ImFjZV9mb2xkLXdpZGdldCBhY2VfIittO209PSJzdGFydCImJmk9PWQmJmk8bi5lbmQucm93P3YrPSIgYWNlX2Nsb3NlZCI6dis9IiBhY2Vfb3BlbiIsYS5jbGFzc05hbWUhPXYmJihhLmNsYXNzTmFtZT12KTt2YXIgZz10LmxpbmVIZWlnaHQrInB4IjtyLnNldFN0eWxlKGEuc3R5bGUsImhlaWdodCIsZyksci5zZXRTdHlsZShhLnN0eWxlLCJkaXNwbGF5IiwiaW5saW5lLWJsb2NrIil9ZWxzZSBhJiZyLnNldFN0eWxlKGEuc3R5bGUsImRpc3BsYXkiLCJub25lIik7dmFyIHk9KGg/aC5nZXRUZXh0KG8saSk6aStmKS50b1N0cmluZygpO3JldHVybiB5IT09dS5kYXRhJiYodS5kYXRhPXkpLHIuc2V0U3R5bGUoZS5lbGVtZW50LnN0eWxlLCJoZWlnaHQiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lSGVpZ2h0KGksdCxvKSsicHgiKSxyLnNldFN0eWxlKGUuZWxlbWVudC5zdHlsZSwidG9wIix0aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcChpLHQsbykrInB4IiksZS50ZXh0PXksZX0sdGhpcy4kZml4ZWRXaWR0aD0hMSx0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lPSEwLHRoaXMuJHJlbmRlcmVyPSIiLHRoaXMuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbihlKXt0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lPWV9LHRoaXMuJHNob3dMaW5lTnVtYmVycz0hMCx0aGlzLiRyZW5kZXJlcj0iIix0aGlzLnNldFNob3dMaW5lTnVtYmVycz1mdW5jdGlvbihlKXt0aGlzLiRyZW5kZXJlcj0hZSYme2dldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn19fSx0aGlzLmdldFNob3dMaW5lTnVtYmVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzaG93TGluZU51bWJlcnN9LHRoaXMuJHNob3dGb2xkV2lkZ2V0cz0hMCx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXtlP3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIik6ci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9mb2xkaW5nLWVuYWJsZWQiKSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9ZSx0aGlzLiRwYWRkaW5nPW51bGx9LHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dGb2xkV2lkZ2V0c30sdGhpcy4kY29tcHV0ZVBhZGRpbmc9ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpcmV0dXJue2xlZnQ6MCxyaWdodDowfTt2YXIgZT1yLmNvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpO3JldHVybiB0aGlzLiRwYWRkaW5nPXt9LHRoaXMuJHBhZGRpbmcubGVmdD0ocGFyc2VJbnQoZS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSsocGFyc2VJbnQoZS5wYWRkaW5nTGVmdCl8fDApKzEsdGhpcy4kcGFkZGluZy5yaWdodD0ocGFyc2VJbnQoZS5ib3JkZXJSaWdodFdpZHRoKXx8MCkrKHBhcnNlSW50KGUucGFkZGluZ1JpZ2h0KXx8MCksdGhpcy4kcGFkZGluZ30sdGhpcy5nZXRSZWdpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kcGFkZGluZ3x8dGhpcy4kY29tcHV0ZVBhZGRpbmcoKSxuPXRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihlLng8dC5sZWZ0K24ubGVmdClyZXR1cm4ibWFya2VycyI7aWYodGhpcy4kc2hvd0ZvbGRXaWRnZXRzJiZlLng+bi5yaWdodC10LnJpZ2h0KXJldHVybiJmb2xkV2lkZ2V0cyJ9fSkuY2FsbChhLnByb3RvdHlwZSksdC5HdXR0ZXI9YX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9tYXJrZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWUoIi4uL2xpYi9kb20iKSxzPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfbWFya2VyLWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCl9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4scil7cmV0dXJuKGU/MTowKXwodD8yOjApfChuPzQ6MCl8KHI/ODowKX10aGlzLiRwYWRkaW5nPTAsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lfSx0aGlzLnNldE1hcmtlcnM9ZnVuY3Rpb24oZSl7dGhpcy5tYXJrZXJzPWV9LHRoaXMuZWx0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5pIT0tMSYmdGhpcy5lbGVtZW50LmNoaWxkTm9kZXNbdGhpcy5pXTtuP3RoaXMuaSsrOihuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChuKSx0aGlzLmk9LTEpLG4uc3R5bGUuY3NzVGV4dD10LG4uY2xhc3NOYW1lPWV9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjt0aGlzLmNvbmZpZz1lLHRoaXMuaT0wO3ZhciB0O2Zvcih2YXIgbiBpbiB0aGlzLm1hcmtlcnMpe3ZhciByPXRoaXMubWFya2Vyc1tuXTtpZighci5yYW5nZSl7ci51cGRhdGUodCx0aGlzLHRoaXMuc2Vzc2lvbixlKTtjb250aW51ZX12YXIgaT1yLnJhbmdlLmNsaXBSb3dzKGUuZmlyc3RSb3csZS5sYXN0Um93KTtpZihpLmlzRW1wdHkoKSljb250aW51ZTtpPWkudG9TY3JlZW5SYW5nZSh0aGlzLnNlc3Npb24pO2lmKHIucmVuZGVyZXIpe3ZhciBzPXRoaXMuJGdldFRvcChpLnN0YXJ0LnJvdyxlKSxvPXRoaXMuJHBhZGRpbmcraS5zdGFydC5jb2x1bW4qZS5jaGFyYWN0ZXJXaWR0aDtyLnJlbmRlcmVyKHQsaSxvLHMsZSl9ZWxzZSByLnR5cGU9PSJmdWxsTGluZSI/dGhpcy5kcmF3RnVsbExpbmVNYXJrZXIodCxpLHIuY2xhenosZSk6ci50eXBlPT0ic2NyZWVuTGluZSI/dGhpcy5kcmF3U2NyZWVuTGluZU1hcmtlcih0LGksci5jbGF6eixlKTppLmlzTXVsdGlMaW5lKCk/ci50eXBlPT0idGV4dCI/dGhpcy5kcmF3VGV4dE1hcmtlcih0LGksci5jbGF6eixlKTp0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXIodCxpLHIuY2xhenosZSk6dGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcih0LGksci5jbGF6eisiIGFjZV9zdGFydCIrIiBhY2VfYnIxNSIsZSl9aWYodGhpcy5pIT0tMSl3aGlsZSh0aGlzLmk8dGhpcy5lbGVtZW50LmNoaWxkRWxlbWVudENvdW50KXRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQubGFzdENoaWxkKX0sdGhpcy4kZ2V0VG9wPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUtdC5maXJzdFJvd1NjcmVlbikqdC5saW5lSGVpZ2h0fSx0aGlzLmRyYXdUZXh0TWFya2VyPWZ1bmN0aW9uKHQsbixpLHMsbyl7dmFyIHU9dGhpcy5zZXNzaW9uLGE9bi5zdGFydC5yb3csZj1uLmVuZC5yb3csbD1hLGM9MCxoPTAscD11LmdldFNjcmVlbkxhc3RSb3dDb2x1bW4obCksZD1uZXcgcihsLG4uc3RhcnQuY29sdW1uLGwsaCk7Zm9yKDtsPD1mO2wrKylkLnN0YXJ0LnJvdz1kLmVuZC5yb3c9bCxkLnN0YXJ0LmNvbHVtbj1sPT1hP24uc3RhcnQuY29sdW1uOnUuZ2V0Um93V3JhcEluZGVudChsKSxkLmVuZC5jb2x1bW49cCxjPWgsaD1wLHA9bCsxPGY/dS5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGwrMSk6bD09Zj8wOm4uZW5kLmNvbHVtbix0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHQsZCxpKyhsPT1hPyIgYWNlX3N0YXJ0IjoiIikrIiBhY2VfYnIiK2UobD09YXx8bD09YSsxJiZuLnN0YXJ0LmNvbHVtbixjPGgsaD5wLGw9PWYpLHMsbD09Zj8wOjEsbyl9LHRoaXMuZHJhd011bHRpTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXRoaXMuJHBhZGRpbmcsbz1yLmxpbmVIZWlnaHQsdT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksYT1zK3Quc3RhcnQuY29sdW1uKnIuY2hhcmFjdGVyV2lkdGg7aT1pfHwiIjtpZih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh0LnN0YXJ0LnJvdykpe3ZhciBmPXQuY2xvbmUoKTtmLmVuZC5yb3c9Zi5zdGFydC5yb3csZi5lbmQuY29sdW1uPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGYuc3RhcnQucm93KS5sZW5ndGgsdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXIoZSxmLG4rIiBhY2VfYnIxIGFjZV9zdGFydCIscixudWxsLGkpfWVsc2UgdGhpcy5lbHQobisiIGFjZV9icjEgYWNlX3N0YXJ0IiwiaGVpZ2h0OiIrbysicHg7IisicmlnaHQ6MDsiKyJ0b3A6Iit1KyJweDtsZWZ0OiIrYSsicHg7IisoaXx8IiIpKTtpZih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh0LmVuZC5yb3cpKXt2YXIgZj10LmNsb25lKCk7Zi5zdGFydC5yb3c9Zi5lbmQucm93LGYuc3RhcnQuY29sdW1uPTAsdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXIoZSxmLG4rIiBhY2VfYnIxMiIscixudWxsLGkpfWVsc2V7dT10aGlzLiRnZXRUb3AodC5lbmQucm93LHIpO3ZhciBsPXQuZW5kLmNvbHVtbipyLmNoYXJhY3RlcldpZHRoO3RoaXMuZWx0KG4rIiBhY2VfYnIxMiIsImhlaWdodDoiK28rInB4OyIrIndpZHRoOiIrbCsicHg7IisidG9wOiIrdSsicHg7IisibGVmdDoiK3MrInB4OyIrKGl8fCIiKSl9bz0odC5lbmQucm93LXQuc3RhcnQucm93LTEpKnIubGluZUhlaWdodDtpZihvPD0wKXJldHVybjt1PXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdysxLHIpO3ZhciBjPSh0LnN0YXJ0LmNvbHVtbj8xOjApfCh0LmVuZC5jb2x1bW4/MDo4KTt0aGlzLmVsdChuKyhjPyIgYWNlX2JyIitjOiIiKSwiaGVpZ2h0OiIrbysicHg7IisicmlnaHQ6MDsiKyJ0b3A6Iit1KyJweDsiKyJsZWZ0OiIrcysicHg7IisoaXx8IiIpKX0sdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkscyl7aWYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codC5zdGFydC5yb3cpKXJldHVybiB0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcihlLHQsbixyLGkscyk7dmFyIG89ci5saW5lSGVpZ2h0LHU9KHQuZW5kLmNvbHVtbisoaXx8MCktdC5zdGFydC5jb2x1bW4pKnIuY2hhcmFjdGVyV2lkdGgsYT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksZj10aGlzLiRwYWRkaW5nK3Quc3RhcnQuY29sdW1uKnIuY2hhcmFjdGVyV2lkdGg7dGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7Iisid2lkdGg6Iit1KyJweDsiKyJ0b3A6IithKyJweDsiKyJsZWZ0OiIrZisicHg7Iisoc3x8IiIpKX0sdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpLHMpe3ZhciBvPXIubGluZUhlaWdodCx1PXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxhPXRoaXMuJHBhZGRpbmcsZj10aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFNlbGVjdGlvbnModC5zdGFydC5jb2x1bW4sdC5lbmQuY29sdW1uKTtmLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7Iisid2lkdGg6IitlLndpZHRoKyhpfHwwKSsicHg7IisidG9wOiIrdSsicHg7IisibGVmdDoiKyhhK2UubGVmdCkrInB4OyIrKHN8fCIiKSl9LHRoaXMpfSx0aGlzLmRyYXdGdWxsTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxvPXIubGluZUhlaWdodDt0LnN0YXJ0LnJvdyE9dC5lbmQucm93JiYobys9dGhpcy4kZ2V0VG9wKHQuZW5kLnJvdyxyKS1zKSx0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ0b3A6IitzKyJweDsiKyJsZWZ0OjA7cmlnaHQ6MDsiKyhpfHwiIikpfSx0aGlzLmRyYXdTY3JlZW5MaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLG89ci5saW5lSGVpZ2h0O3RoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrInRvcDoiK3MrInB4OyIrImxlZnQ6MDtyaWdodDowOyIrKGl8fCIiKSl9fSkuY2FsbChzLnByb3RvdHlwZSksdC5NYXJrZXI9c30pLGFjZS5kZWZpbmUoImFjZS9sYXllci90ZXh0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9sYXllci9saW5lcyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZSgiLi4vbGliL2xhbmciKSxvPWUoIi4vbGluZXMiKS5MaW5lcyx1PWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGE9ZnVuY3Rpb24oZSl7dGhpcy5kb209aSx0aGlzLmVsZW1lbnQ9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV90ZXh0LWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy4kdXBkYXRlRW9sQ2hhcj10aGlzLiR1cGRhdGVFb2xDaGFyLmJpbmQodGhpcyksdGhpcy4kbGluZXM9bmV3IG8odGhpcy5lbGVtZW50KX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyx1KSx0aGlzLkVPRl9DSEFSPSJcdTAwYjYiLHRoaXMuRU9MX0NIQVJfTEY9Ilx1MDBhYyIsdGhpcy5FT0xfQ0hBUl9DUkxGPSJcdTAwYTQiLHRoaXMuRU9MX0NIQVI9dGhpcy5FT0xfQ0hBUl9MRix0aGlzLlRBQl9DSEFSPSJcdTIwMTQiLHRoaXMuU1BBQ0VfQ0hBUj0iXHUwMGI3Iix0aGlzLiRwYWRkaW5nPTAsdGhpcy5NQVhfTElORV9MRU5HVEg9MWU0LHRoaXMuJHVwZGF0ZUVvbENoYXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZG9jLHQ9ZS5nZXROZXdMaW5lQ2hhcmFjdGVyKCk9PSJcbiImJmUuZ2V0TmV3TGluZU1vZGUoKSE9IndpbmRvd3MiLG49dD90aGlzLkVPTF9DSEFSX0xGOnRoaXMuRU9MX0NIQVJfQ1JMRjtpZih0aGlzLkVPTF9DSEFSIT1uKXJldHVybiB0aGlzLkVPTF9DSEFSPW4sITB9LHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWUsdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbj0iMCAiK2UrInB4In0sdGhpcy5nZXRMaW5lSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZvbnRNZXRyaWNzLiRjaGFyYWN0ZXJTaXplLmhlaWdodHx8MH0sdGhpcy5nZXRDaGFyYWN0ZXJXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmb250TWV0cmljcy4kY2hhcmFjdGVyU2l6ZS53aWR0aHx8MH0sdGhpcy4kc2V0Rm9udE1ldHJpY3M9ZnVuY3Rpb24oZSl7dGhpcy4kZm9udE1ldHJpY3M9ZSx0aGlzLiRmb250TWV0cmljcy5vbigiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZnVuY3Rpb24oZSl7dGhpcy5fc2lnbmFsKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixlKX0uYmluZCh0aGlzKSksdGhpcy4kcG9sbFNpemVDaGFuZ2VzKCl9LHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3RoaXMuJGZvbnRNZXRyaWNzLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyPXRoaXMuJGZvbnRNZXRyaWNzLiRwb2xsU2l6ZUNoYW5nZXMoKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lLGUmJnRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKX0sdGhpcy5zaG93SW52aXNpYmxlcz0hMSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNob3dJbnZpc2libGVzPT1lPyExOih0aGlzLnNob3dJbnZpc2libGVzPWUsdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpLCEwKX0sdGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzPSEwLHRoaXMuc2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzPT1lPyExOih0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXM9ZSx0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCksITApfSx0aGlzLiR0YWJTdHJpbmdzPVtdLHRoaXMub25DaGFuZ2VUYWJTaXplPXRoaXMuJGNvbXB1dGVUYWJTdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpO3RoaXMudGFiU2l6ZT1lO3ZhciB0PXRoaXMuJHRhYlN0cmluZ3M9WzBdO2Zvcih2YXIgbj0xO248ZSsxO24rKylpZih0aGlzLnNob3dJbnZpc2libGVzKXt2YXIgcj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV90YWIiLHIudGV4dENvbnRlbnQ9cy5zdHJpbmdSZXBlYXQodGhpcy5UQUJfQ0hBUixuKSx0LnB1c2gocil9ZWxzZSB0LnB1c2godGhpcy5kb20uY3JlYXRlVGV4dE5vZGUocy5zdHJpbmdSZXBlYXQoIiAiLG4pLHRoaXMuZWxlbWVudCkpO2lmKHRoaXMuZGlzcGxheUluZGVudEd1aWRlcyl7dGhpcy4kaW5kZW50R3VpZGVSZT0vXHNcU3wgXHR8XHQgfFxzJC87dmFyIGk9ImFjZV9pbmRlbnQtZ3VpZGUiLG89IiIsdT0iIjtpZih0aGlzLnNob3dJbnZpc2libGVzKXtpKz0iIGFjZV9pbnZpc2libGUiLG89IiBhY2VfaW52aXNpYmxlX3NwYWNlIix1PSIgYWNlX2ludmlzaWJsZV90YWIiO3ZhciBhPXMuc3RyaW5nUmVwZWF0KHRoaXMuU1BBQ0VfQ0hBUix0aGlzLnRhYlNpemUpLGY9cy5zdHJpbmdSZXBlYXQodGhpcy5UQUJfQ0hBUix0aGlzLnRhYlNpemUpfWVsc2UgdmFyIGE9cy5zdHJpbmdSZXBlYXQoIiAiLHRoaXMudGFiU2l6ZSksZj1hO3ZhciByPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLmNsYXNzTmFtZT1pK28sci50ZXh0Q29udGVudD1hLHRoaXMuJHRhYlN0cmluZ3NbIiAiXT1yO3ZhciByPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLmNsYXNzTmFtZT1pK3Usci50ZXh0Q29udGVudD1mLHRoaXMuJHRhYlN0cmluZ3NbIgkiXT1yfX0sdGhpcy51cGRhdGVMaW5lcz1mdW5jdGlvbihlLHQsbil7aWYodGhpcy5jb25maWcubGFzdFJvdyE9ZS5sYXN0Um93fHx0aGlzLmNvbmZpZy5maXJzdFJvdyE9ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7dGhpcy5jb25maWc9ZTt2YXIgcj1NYXRoLm1heCh0LGUuZmlyc3RSb3cpLGk9TWF0aC5taW4obixlLmxhc3RSb3cpLHM9dGhpcy5lbGVtZW50LmNoaWxkTm9kZXMsbz0wO2Zvcih2YXIgdT1lLmZpcnN0Um93O3U8cjt1Kyspe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZSh1KTtpZihhKXtpZihhLmNvbnRhaW5zUm93KHIpKXtyPWEuc3RhcnQucm93O2JyZWFrfXU9YS5lbmQucm93fW8rK312YXIgZj0hMSx1PXIsYT10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHUpLGw9YT9hLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe3U+bCYmKHU9YS5lbmQucm93KzEsYT10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHUsYSksbD1hP2Euc3RhcnQucm93OkluZmluaXR5KTtpZih1PmkpYnJlYWs7dmFyIGM9c1tvKytdO2lmKGMpe3RoaXMuZG9tLnJlbW92ZUNoaWxkcmVuKGMpLHRoaXMuJHJlbmRlckxpbmUoYyx1LHU9PWw/YTohMSksZiYmKGMuc3R5bGUudG9wPXRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKHUsZSx0aGlzLnNlc3Npb24pKyJweCIpO3ZhciBoPWUubGluZUhlaWdodCp0aGlzLnNlc3Npb24uZ2V0Um93TGVuZ3RoKHUpKyJweCI7Yy5zdHlsZS5oZWlnaHQhPWgmJihmPSEwLGMuc3R5bGUuaGVpZ2h0PWgpfXUrK31pZihmKXdoaWxlKG88dGhpcy4kbGluZXMuY2VsbHMubGVuZ3RoKXt2YXIgcD10aGlzLiRsaW5lcy5jZWxsc1tvKytdO3AuZWxlbWVudC5zdHlsZS50b3A9dGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AocC5yb3csZSx0aGlzLnNlc3Npb24pKyJweCJ9fSx0aGlzLnNjcm9sbExpbmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnO3RoaXMuY29uZmlnPWU7aWYodGhpcy4kbGluZXMucGFnZUNoYW5nZWQodCxlKSlyZXR1cm4gdGhpcy51cGRhdGUoZSk7dGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKTt2YXIgbj1lLmxhc3RSb3cscj10P3QubGFzdFJvdzotMTtpZighdHx8cjxlLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZihuPHQuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKCF0fHx0Lmxhc3RSb3c8ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYoZS5sYXN0Um93PHQuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKHQuZmlyc3RSb3c8ZS5maXJzdFJvdylmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KHQuZmlyc3RSb3csZS5maXJzdFJvdy0xKTtpPjA7aS0tKXRoaXMuJGxpbmVzLnNoaWZ0KCk7aWYodC5sYXN0Um93PmUubGFzdFJvdylmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KGUubGFzdFJvdysxLHQubGFzdFJvdyk7aT4wO2ktLSl0aGlzLiRsaW5lcy5wb3AoKTtlLmZpcnN0Um93PHQuZmlyc3RSb3cmJnRoaXMuJGxpbmVzLnVuc2hpZnQodGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChlLGUuZmlyc3RSb3csdC5maXJzdFJvdy0xKSksZS5sYXN0Um93PnQubGFzdFJvdyYmdGhpcy4kbGluZXMucHVzaCh0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGUsdC5sYXN0Um93KzEsZS5sYXN0Um93KSl9LHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLHM9dCxvPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocyksdT1vP28uc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7cz51JiYocz1vLmVuZC5yb3crMSxvPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocyxvKSx1PW8/by5zdGFydC5yb3c6SW5maW5pdHkpO2lmKHM+bilicmVhazt2YXIgYT10aGlzLiRsaW5lcy5jcmVhdGVDZWxsKHMsZSx0aGlzLnNlc3Npb24pLGY9YS5lbGVtZW50O3RoaXMuZG9tLnJlbW92ZUNoaWxkcmVuKGYpLGkuc2V0U3R5bGUoZi5zdHlsZSwiaGVpZ2h0Iix0aGlzLiRsaW5lcy5jb21wdXRlTGluZUhlaWdodChzLGUsdGhpcy5zZXNzaW9uKSsicHgiKSxpLnNldFN0eWxlKGYuc3R5bGUsInRvcCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AocyxlLHRoaXMuc2Vzc2lvbikrInB4IiksdGhpcy4kcmVuZGVyTGluZShmLHMscz09dT9vOiExKSx0aGlzLiR1c2VMaW5lR3JvdXBzKCk/Zi5jbGFzc05hbWU9ImFjZV9saW5lX2dyb3VwIjpmLmNsYXNzTmFtZT0iYWNlX2xpbmUiLHIucHVzaChhKSxzKyt9cmV0dXJuIHJ9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSksdGhpcy5jb25maWc9ZTt2YXIgdD1lLmZpcnN0Um93LG49ZS5sYXN0Um93LHI9dGhpcy4kbGluZXM7d2hpbGUoci5nZXRMZW5ndGgoKSlyLnBvcCgpO3IucHVzaCh0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGUsdCxuKSl9LHRoaXMuJHRleHRUb2tlbj17dGV4dDohMCxycGFyZW46ITAsbHBhcmVuOiEwfSx0aGlzLiRyZW5kZXJUb2tlbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89LyhcdCl8KCArKXwoW1x4MDAtXHgxZlx4ODAtXHhhMFx4YWRcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBmXHUyMDI4XHUyMDI5XHUyMDJGXHUyMDVGXHVGRUZGXHVGRkY5LVx1RkZGQ10rKXwoXHUzMDAwKXwoW1x1MTEwMC1cdTExNUZcdTExQTMtXHUxMUE3XHUxMUZBLVx1MTFGRlx1MjMyOS1cdTIzMkFcdTJFODAtXHUyRTk5XHUyRTlCLVx1MkVGM1x1MkYwMC1cdTJGRDVcdTJGRjAtXHUyRkZCXHUzMDAxLVx1MzAzRVx1MzA0MS1cdTMwOTZcdTMwOTktXHUzMEZGXHUzMTA1LVx1MzEyRFx1MzEzMS1cdTMxOEVcdTMxOTAtXHUzMUJBXHUzMUMwLVx1MzFFM1x1MzFGMC1cdTMyMUVcdTMyMjAtXHUzMjQ3XHUzMjUwLVx1MzJGRVx1MzMwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNDkwLVx1QTRDNlx1QTk2MC1cdUE5N0NcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQUZGXHVGRTEwLVx1RkUxOVx1RkUzMC1cdUZFNTJcdUZFNTQtXHVGRTY2XHVGRTY4LVx1RkU2Qlx1RkYwMS1cdUZGNjBcdUZGRTAtXHVGRkU2XXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0pL2csdT10aGlzLmRvbS5jcmVhdGVGcmFnbWVudCh0aGlzLmVsZW1lbnQpLGEsZj0wO3doaWxlKGE9by5leGVjKHIpKXt2YXIgbD1hWzFdLGM9YVsyXSxoPWFbM10scD1hWzRdLGQ9YVs1XTtpZighaS5zaG93SW52aXNpYmxlcyYmYyljb250aW51ZTt2YXIgdj1mIT1hLmluZGV4P3Iuc2xpY2UoZixhLmluZGV4KToiIjtmPWEuaW5kZXgrYVswXS5sZW5ndGgsdiYmdS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZSh2LHRoaXMuZWxlbWVudCkpO2lmKGwpe3ZhciBtPWkuc2Vzc2lvbi5nZXRTY3JlZW5UYWJTaXplKHQrYS5pbmRleCk7dS5hcHBlbmRDaGlsZChpLiR0YWJTdHJpbmdzW21dLmNsb25lTm9kZSghMCkpLHQrPW0tMX1lbHNlIGlmKGMpaWYoaS5zaG93SW52aXNpYmxlcyl7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfc3BhY2UiLGcudGV4dENvbnRlbnQ9cy5zdHJpbmdSZXBlYXQoaS5TUEFDRV9DSEFSLGMubGVuZ3RoKSx1LmFwcGVuZENoaWxkKGcpfWVsc2UgdS5hcHBlbmRDaGlsZCh0aGlzLmNvbS5jcmVhdGVUZXh0Tm9kZShjLHRoaXMuZWxlbWVudCkpO2Vsc2UgaWYoaCl7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfc3BhY2UgYWNlX2ludmFsaWQiLGcudGV4dENvbnRlbnQ9cy5zdHJpbmdSZXBlYXQoaS5TUEFDRV9DSEFSLGgubGVuZ3RoKSx1LmFwcGVuZENoaWxkKGcpfWVsc2UgaWYocCl7dCs9MTt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5zdHlsZS53aWR0aD1pLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCIsZy5jbGFzc05hbWU9aS5zaG93SW52aXNpYmxlcz8iYWNlX2NqayBhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfc3BhY2UiOiJhY2VfY2prIixnLnRleHRDb250ZW50PWkuc2hvd0ludmlzaWJsZXM/aS5TUEFDRV9DSEFSOnAsdS5hcHBlbmRDaGlsZChnKX1lbHNlIGlmKGQpe3QrPTE7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuc3R5bGUud2lkdGg9aS5jb25maWcuY2hhcmFjdGVyV2lkdGgqMisicHgiLGcuY2xhc3NOYW1lPSJhY2VfY2prIixnLnRleHRDb250ZW50PWQsdS5hcHBlbmRDaGlsZChnKX19dS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZShmP3Iuc2xpY2UoZik6cix0aGlzLmVsZW1lbnQpKTtpZighdGhpcy4kdGV4dFRva2VuW24udHlwZV0pe3ZhciB5PSJhY2VfIituLnR5cGUucmVwbGFjZSgvXC4vZywiIGFjZV8iKSxnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtuLnR5cGU9PSJmb2xkIiYmKGcuc3R5bGUud2lkdGg9bi52YWx1ZS5sZW5ndGgqdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgrInB4IiksZy5jbGFzc05hbWU9eSxnLmFwcGVuZENoaWxkKHUpLGUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSBlLmFwcGVuZENoaWxkKHUpO3JldHVybiB0K3IubGVuZ3RofSx0aGlzLnJlbmRlckluZGVudEd1aWRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnNlYXJjaCh0aGlzLiRpbmRlbnRHdWlkZVJlKTtpZihyPD0wfHxyPj1uKXJldHVybiB0O2lmKHRbMF09PSIgIil7ci09ciV0aGlzLnRhYlNpemU7dmFyIGk9ci90aGlzLnRhYlNpemU7Zm9yKHZhciBzPTA7czxpO3MrKyllLmFwcGVuZENoaWxkKHRoaXMuJHRhYlN0cmluZ3NbIiAiXS5jbG9uZU5vZGUoITApKTtyZXR1cm4gdC5zdWJzdHIocil9aWYodFswXT09IgkiKXtmb3IodmFyIHM9MDtzPHI7cysrKWUuYXBwZW5kQ2hpbGQodGhpcy4kdGFiU3RyaW5nc1siCSJdLmNsb25lTm9kZSghMCkpO3JldHVybiB0LnN1YnN0cihyKX1yZXR1cm4gdH0sdGhpcy4kY3JlYXRlTGluZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuY2xhc3NOYW1lPSJhY2VfbGluZSIsdC5zdHlsZS5oZWlnaHQ9dGhpcy5jb25maWcubGluZUhlaWdodCsicHgiLHR9LHRoaXMuJHJlbmRlcldyYXBwZWRMaW5lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wLGk9MCxvPW5bMF0sdT0wLGE9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKTtlLmFwcGVuZENoaWxkKGEpO2Zvcih2YXIgZj0wO2Y8dC5sZW5ndGg7ZisrKXt2YXIgbD10W2ZdLGM9bC52YWx1ZTtpZihmPT0wJiZ0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXMpe3I9Yy5sZW5ndGgsYz10aGlzLnJlbmRlckluZGVudEd1aWRlKGEsYyxvKTtpZighYyljb250aW51ZTtyLT1jLmxlbmd0aH1pZihyK2MubGVuZ3RoPG8pdT10aGlzLiRyZW5kZXJUb2tlbihhLHUsbCxjKSxyKz1jLmxlbmd0aDtlbHNle3doaWxlKHIrYy5sZW5ndGg+PW8pdT10aGlzLiRyZW5kZXJUb2tlbihhLHUsbCxjLnN1YnN0cmluZygwLG8tcikpLGM9Yy5zdWJzdHJpbmcoby1yKSxyPW8sYT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpLGUuYXBwZW5kQ2hpbGQoYSksYS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZShzLnN0cmluZ1JlcGVhdCgiXHUwMGEwIixuLmluZGVudCksdGhpcy5lbGVtZW50KSksaSsrLHU9MCxvPW5baV18fE51bWJlci5NQVhfVkFMVUU7Yy5sZW5ndGghPTAmJihyKz1jLmxlbmd0aCx1PXRoaXMuJHJlbmRlclRva2VuKGEsdSxsLGMpKX19bltuLmxlbmd0aC0xXT50aGlzLk1BWF9MSU5FX0xFTkdUSCYmdGhpcy4kcmVuZGVyT3ZlcmZsb3dNZXNzYWdlKGEsdSxudWxsLCIiLCEwKX0sdGhpcy4kcmVuZGVyU2ltcGxlTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj10WzBdLGk9ci52YWx1ZTt0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXMmJihpPXRoaXMucmVuZGVySW5kZW50R3VpZGUoZSxpKSksaSYmKG49dGhpcy4kcmVuZGVyVG9rZW4oZSxuLHIsaSkpO2Zvcih2YXIgcz0xO3M8dC5sZW5ndGg7cysrKXtyPXRbc10saT1yLnZhbHVlO2lmKG4raS5sZW5ndGg+dGhpcy5NQVhfTElORV9MRU5HVEgpcmV0dXJuIHRoaXMuJHJlbmRlck92ZXJmbG93TWVzc2FnZShlLG4scixpKTtuPXRoaXMuJHJlbmRlclRva2VuKGUsbixyLGkpfX0sdGhpcy4kcmVuZGVyT3ZlcmZsb3dNZXNzYWdlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7biYmdGhpcy4kcmVuZGVyVG9rZW4oZSx0LG4sci5zbGljZSgwLHRoaXMuTUFYX0xJTkVfTEVOR1RILXQpKTt2YXIgcz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7cy5jbGFzc05hbWU9ImFjZV9pbmxpbmVfYnV0dG9uIGFjZV9rZXl3b3JkIGFjZV90b2dnbGVfd3JhcCIscy50ZXh0Q29udGVudD1pPyI8aGlkZT4iOiI8Y2xpY2sgdG8gc2VlIG1vcmUuLi4+IixlLmFwcGVuZENoaWxkKHMpfSx0aGlzLiRyZW5kZXJMaW5lPWZ1bmN0aW9uKGUsdCxuKXshbiYmbiE9MCYmKG49dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHQpKTtpZihuKXZhciByPXRoaXMuJGdldEZvbGRMaW5lVG9rZW5zKHQsbik7ZWxzZSB2YXIgcj10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKHQpO3ZhciBpPWU7aWYoci5sZW5ndGgpe3ZhciBzPXRoaXMuc2Vzc2lvbi5nZXRSb3dTcGxpdERhdGEodCk7aWYocyYmcy5sZW5ndGgpe3RoaXMuJHJlbmRlcldyYXBwZWRMaW5lKGUscixzKTt2YXIgaT1lLmxhc3RDaGlsZH1lbHNle3ZhciBpPWU7dGhpcy4kdXNlTGluZUdyb3VwcygpJiYoaT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpLGUuYXBwZW5kQ2hpbGQoaSkpLHRoaXMuJHJlbmRlclNpbXBsZUxpbmUoaSxyKX19ZWxzZSB0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJihpPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCksZS5hcHBlbmRDaGlsZChpKSk7aWYodGhpcy5zaG93SW52aXNpYmxlcyYmaSl7biYmKHQ9bi5lbmQucm93KTt2YXIgbz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7by5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9lb2wiLG8udGV4dENvbnRlbnQ9dD09dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTE/dGhpcy5FT0ZfQ0hBUjp0aGlzLkVPTF9DSEFSLGkuYXBwZW5kQ2hpbGQobyl9fSx0aGlzLiRnZXRGb2xkTGluZVRva2Vucz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LG4pe3ZhciBpPTAscz0wO3doaWxlKHMrZVtpXS52YWx1ZS5sZW5ndGg8dCl7cys9ZVtpXS52YWx1ZS5sZW5ndGgsaSsrO2lmKGk9PWUubGVuZ3RoKXJldHVybn1pZihzIT10KXt2YXIgbz1lW2ldLnZhbHVlLnN1YnN0cmluZyh0LXMpO28ubGVuZ3RoPm4tdCYmKG89by5zdWJzdHJpbmcoMCxuLXQpKSxyLnB1c2goe3R5cGU6ZVtpXS50eXBlLHZhbHVlOm99KSxzPXQrby5sZW5ndGgsaSs9MX13aGlsZShzPG4mJmk8ZS5sZW5ndGgpe3ZhciBvPWVbaV0udmFsdWU7by5sZW5ndGgrcz5uP3IucHVzaCh7dHlwZTplW2ldLnR5cGUsdmFsdWU6by5zdWJzdHJpbmcoMCxuLXMpfSk6ci5wdXNoKGVbaV0pLHMrPW8ubGVuZ3RoLGkrPTF9fXZhciBuPXRoaXMuc2Vzc2lvbixyPVtdLHM9bi5nZXRUb2tlbnMoZSk7cmV0dXJuIHQud2FsayhmdW5jdGlvbihlLHQsbyx1LGEpe2UhPW51bGw/ci5wdXNoKHt0eXBlOiJmb2xkIix2YWx1ZTplfSk6KGEmJihzPW4uZ2V0VG9rZW5zKHQpKSxzLmxlbmd0aCYmaShzLHUsbykpfSx0LmVuZC5yb3csdGhpcy5zZXNzaW9uLmdldExpbmUodC5lbmQucm93KS5sZW5ndGgpLHJ9LHRoaXMuJHVzZUxpbmVHcm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe319KS5jYWxsKGEucHJvdG90eXBlKSx0LlRleHQ9YX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9jdXJzb3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PXIuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9jdXJzb3ItbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLmlzVmlzaWJsZT0hMSx0aGlzLmlzQmxpbmtpbmc9ITAsdGhpcy5ibGlua0ludGVydmFsPTFlMyx0aGlzLnNtb290aEJsaW5raW5nPSExLHRoaXMuY3Vyc29ycz1bXSx0aGlzLmN1cnNvcj10aGlzLmFkZEN1cnNvcigpLHIuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfaGlkZGVuLWN1cnNvcnMiKSx0aGlzLiR1cGRhdGVDdXJzb3JzPXRoaXMuJHVwZGF0ZU9wYWNpdHkuYmluZCh0aGlzKX07KGZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlT3BhY2l0eT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmN1cnNvcnM7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspci5zZXRTdHlsZSh0W25dLnN0eWxlLCJvcGFjaXR5IixlPyIiOiIwIil9LHRoaXMuJHN0YXJ0Q3NzQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJzb3JzO2Zvcih2YXIgdD1lLmxlbmd0aDt0LS07KWVbdF0uc3R5bGUuYW5pbWF0aW9uRHVyYXRpb249dGhpcy5ibGlua0ludGVydmFsKyJtcyI7c2V0VGltZW91dChmdW5jdGlvbigpe3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfYW5pbWF0ZS1ibGlua2luZyIpfS5iaW5kKHRoaXMpKX0sdGhpcy4kc3RvcENzc0FuaW1hdGlvbj1mdW5jdGlvbigpe3IucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfYW5pbWF0ZS1ibGlua2luZyIpfSx0aGlzLiRwYWRkaW5nPTAsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lfSx0aGlzLnNldEJsaW5raW5nPWZ1bmN0aW9uKGUpe2UhPXRoaXMuaXNCbGlua2luZyYmKHRoaXMuaXNCbGlua2luZz1lLHRoaXMucmVzdGFydFRpbWVyKCkpfSx0aGlzLnNldEJsaW5rSW50ZXJ2YWw9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5ibGlua0ludGVydmFsJiYodGhpcy5ibGlua0ludGVydmFsPWUsdGhpcy5yZXN0YXJ0VGltZXIoKSl9LHRoaXMuc2V0U21vb3RoQmxpbmtpbmc9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5zbW9vdGhCbGlua2luZyYmKHRoaXMuc21vb3RoQmxpbmtpbmc9ZSxyLnNldENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX3Ntb290aC1ibGlua2luZyIsZSksdGhpcy4kdXBkYXRlQ3Vyc29ycyghMCksdGhpcy5yZXN0YXJ0VGltZXIoKSl9LHRoaXMuYWRkQ3Vyc29yPWZ1bmN0aW9uKCl7dmFyIGU9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5jbGFzc05hbWU9ImFjZV9jdXJzb3IiLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChlKSx0aGlzLmN1cnNvcnMucHVzaChlKSxlfSx0aGlzLnJlbW92ZUN1cnNvcj1mdW5jdGlvbigpe2lmKHRoaXMuY3Vyc29ycy5sZW5ndGg+MSl7dmFyIGU9dGhpcy5jdXJzb3JzLnBvcCgpO3JldHVybiBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksZX19LHRoaXMuaGlkZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSExLHIuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfaGlkZGVuLWN1cnNvcnMiKSx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLnNob3dDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLmlzVmlzaWJsZT0hMCxyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2hpZGRlbi1jdXJzb3JzIiksdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5yZXN0YXJ0VGltZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiR1cGRhdGVDdXJzb3JzO2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKSxjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpLHRoaXMuJHN0b3BDc3NBbmltYXRpb24oKSx0aGlzLnNtb290aEJsaW5raW5nJiZyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX3Ntb290aC1ibGlua2luZyIpLGUoITApO2lmKCF0aGlzLmlzQmxpbmtpbmd8fCF0aGlzLmJsaW5rSW50ZXJ2YWx8fCF0aGlzLmlzVmlzaWJsZSl7dGhpcy4kc3RvcENzc0FuaW1hdGlvbigpO3JldHVybn10aGlzLnNtb290aEJsaW5raW5nJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9zbW9vdGgtYmxpbmtpbmciKX0uYmluZCh0aGlzKSk7aWYoci5IQVNfQ1NTX0FOSU1BVElPTil0aGlzLiRzdGFydENzc0FuaW1hdGlvbigpO2Vsc2V7dmFyIHQ9ZnVuY3Rpb24oKXt0aGlzLnRpbWVvdXRJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSghMSl9LC42KnRoaXMuYmxpbmtJbnRlcnZhbCl9LmJpbmQodGhpcyk7dGhpcy5pbnRlcnZhbElkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZSghMCksdCgpfSx0aGlzLmJsaW5rSW50ZXJ2YWwpLHQoKX19LHRoaXMuZ2V0UGl4ZWxQb3NpdGlvbj1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmNvbmZpZ3x8IXRoaXMuc2Vzc2lvbilyZXR1cm57bGVmdDowLHRvcDowfTtlfHwoZT10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpKTt2YXIgbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUpLHI9dGhpcy4kcGFkZGluZysodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3cobi5yb3csZS5yb3cpP3RoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0UG9zTGVmdChuLmNvbHVtbik6bi5jb2x1bW4qdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgpLGk9KG4ucm93LSh0P3RoaXMuY29uZmlnLmZpcnN0Um93U2NyZWVuOjApKSp0aGlzLmNvbmZpZy5saW5lSGVpZ2h0O3JldHVybntsZWZ0OnIsdG9wOml9fSx0aGlzLmlzQ3Vyc29ySW5WaWV3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9wPj0wJiZlLnRvcDx0Lm1heEhlaWdodH0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5jb25maWc9ZTt2YXIgdD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMsbj0wLGk9MDtpZih0PT09dW5kZWZpbmVkfHx0Lmxlbmd0aD09PTApdD1be2N1cnNvcjpudWxsfV07Zm9yKHZhciBuPTAscz10Lmxlbmd0aDtuPHM7bisrKXt2YXIgbz10aGlzLmdldFBpeGVsUG9zaXRpb24odFtuXS5jdXJzb3IsITApO2lmKChvLnRvcD5lLmhlaWdodCtlLm9mZnNldHx8by50b3A8MCkmJm4+MSljb250aW51ZTt2YXIgdT10aGlzLmN1cnNvcnNbaSsrXXx8dGhpcy5hZGRDdXJzb3IoKSxhPXUuc3R5bGU7dGhpcy5kcmF3Q3Vyc29yP3RoaXMuZHJhd0N1cnNvcih1LG8sZSx0W25dLHRoaXMuc2Vzc2lvbik6dGhpcy5pc0N1cnNvckluVmlldyhvLGUpPyhyLnNldFN0eWxlKGEsImRpc3BsYXkiLCJibG9jayIpLHIudHJhbnNsYXRlKHUsby5sZWZ0LG8udG9wKSxyLnNldFN0eWxlKGEsIndpZHRoIixNYXRoLnJvdW5kKGUuY2hhcmFjdGVyV2lkdGgpKyJweCIpLHIuc2V0U3R5bGUoYSwiaGVpZ2h0IixlLmxpbmVIZWlnaHQrInB4IikpOnIuc2V0U3R5bGUoYSwiZGlzcGxheSIsIm5vbmUiKX13aGlsZSh0aGlzLmN1cnNvcnMubGVuZ3RoPmkpdGhpcy5yZW1vdmVDdXJzb3IoKTt2YXIgZj10aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk7dGhpcy4kc2V0T3ZlcndyaXRlKGYpLHRoaXMuJHBpeGVsUG9zPW8sdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5kcmF3Q3Vyc29yPW51bGwsdGhpcy4kc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGUpe2UhPXRoaXMub3ZlcndyaXRlJiYodGhpcy5vdmVyd3JpdGU9ZSxlP3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfb3ZlcndyaXRlLWN1cnNvcnMiKTpyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX292ZXJ3cml0ZS1jdXJzb3JzIikpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCksY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKX19KS5jYWxsKGkucHJvdG90eXBlKSx0LkN1cnNvcj1pfSksYWNlLmRlZmluZSgiYWNlL3Njcm9sbGJhciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9saWIvZXZlbnQiKSxvPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdT0zMjc2OCxhPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9zY3JvbGxiYXIgYWNlX3Njcm9sbGJhciIrdGhpcy5jbGFzc1N1ZmZpeCx0aGlzLmlubmVyPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbm5lci5jbGFzc05hbWU9ImFjZV9zY3JvbGxiYXItaW5uZXIiLHRoaXMuaW5uZXIudGV4dENvbnRlbnQ9Ilx1MDBhMCIsdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW5uZXIpLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLnNldFZpc2libGUoITEpLHRoaXMuc2tpcEV2ZW50PSExLHMuYWRkTGlzdGVuZXIodGhpcy5lbGVtZW50LCJzY3JvbGwiLHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSkscy5hZGRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsIm1vdXNlZG93biIscy5wcmV2ZW50RGVmYXVsdCl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsbyksdGhpcy5zZXRWaXNpYmxlPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5PWU/IiI6Im5vbmUiLHRoaXMuaXNWaXNpYmxlPWUsdGhpcy5jb2VmZj0xfX0pLmNhbGwoYS5wcm90b3R5cGUpO3ZhciBmPWZ1bmN0aW9uKGUsdCl7YS5jYWxsKHRoaXMsZSksdGhpcy5zY3JvbGxUb3A9MCx0aGlzLnNjcm9sbEhlaWdodD0wLHQuJHNjcm9sbGJhcldpZHRoPXRoaXMud2lkdGg9aS5zY3JvbGxiYXJXaWR0aChlLm93bmVyRG9jdW1lbnQpLHRoaXMuaW5uZXIuc3R5bGUud2lkdGg9dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPSh0aGlzLndpZHRofHwxNSkrNSsicHgiLHRoaXMuJG1pbldpZHRoPTB9O3IuaW5oZXJpdHMoZixhKSxmdW5jdGlvbigpe3RoaXMuY2xhc3NTdWZmaXg9Ii12Iix0aGlzLm9uU2Nyb2xsPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2tpcEV2ZW50KXt0aGlzLnNjcm9sbFRvcD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wO2lmKHRoaXMuY29lZmYhPTEpe3ZhciBlPXRoaXMuZWxlbWVudC5jbGllbnRIZWlnaHQvdGhpcy5zY3JvbGxIZWlnaHQ7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AqKDEtZSkvKHRoaXMuY29lZmYtZSl9dGhpcy5fZW1pdCgic2Nyb2xsIix7ZGF0YTp0aGlzLnNjcm9sbFRvcH0pfXRoaXMuc2tpcEV2ZW50PSExfSx0aGlzLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMuaXNWaXNpYmxlP3RoaXMud2lkdGg6MCx0aGlzLiRtaW5XaWR0aHx8MCl9LHRoaXMuc2V0SGVpZ2h0PWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9ZSsicHgifSx0aGlzLnNldElubmVySGVpZ2h0PXRoaXMuc2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsSGVpZ2h0PWUsZT51Pyh0aGlzLmNvZWZmPXUvZSxlPXUpOnRoaXMuY29lZmYhPTEmJih0aGlzLmNvZWZmPTEpLHRoaXMuaW5uZXIuc3R5bGUuaGVpZ2h0PWUrInB4In0sdGhpcy5zZXRTY3JvbGxUb3A9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxUb3AhPWUmJih0aGlzLnNraXBFdmVudD0hMCx0aGlzLnNjcm9sbFRvcD1lLHRoaXMuZWxlbWVudC5zY3JvbGxUb3A9ZSp0aGlzLmNvZWZmKX19LmNhbGwoZi5wcm90b3R5cGUpO3ZhciBsPWZ1bmN0aW9uKGUsdCl7YS5jYWxsKHRoaXMsZSksdGhpcy5zY3JvbGxMZWZ0PTAsdGhpcy5oZWlnaHQ9dC4kc2Nyb2xsYmFyV2lkdGgsdGhpcy5pbm5lci5zdHlsZS5oZWlnaHQ9dGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD0odGhpcy5oZWlnaHR8fDE1KSs1KyJweCJ9O3IuaW5oZXJpdHMobCxhKSxmdW5jdGlvbigpe3RoaXMuY2xhc3NTdWZmaXg9Ii1oIix0aGlzLm9uU2Nyb2xsPWZ1bmN0aW9uKCl7dGhpcy5za2lwRXZlbnR8fCh0aGlzLnNjcm9sbExlZnQ9dGhpcy5lbGVtZW50LnNjcm9sbExlZnQsdGhpcy5fZW1pdCgic2Nyb2xsIix7ZGF0YTp0aGlzLnNjcm9sbExlZnR9KSksdGhpcy5za2lwRXZlbnQ9ITF9LHRoaXMuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlP3RoaXMuaGVpZ2h0OjB9LHRoaXMuc2V0V2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPWUrInB4In0sdGhpcy5zZXRJbm5lcldpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuaW5uZXIuc3R5bGUud2lkdGg9ZSsicHgifSx0aGlzLnNldFNjcm9sbFdpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuaW5uZXIuc3R5bGUud2lkdGg9ZSsicHgifSx0aGlzLnNldFNjcm9sbExlZnQ9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxMZWZ0IT1lJiYodGhpcy5za2lwRXZlbnQ9ITAsdGhpcy5zY3JvbGxMZWZ0PXRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0PWUpfX0uY2FsbChsLnByb3RvdHlwZSksdC5TY3JvbGxCYXI9Zix0LlNjcm9sbEJhclY9Zix0LlNjcm9sbEJhckg9bCx0LlZTY3JvbGxCYXI9Zix0LkhTY3JvbGxCYXI9bH0pLGFjZS5kZWZpbmUoImFjZS9yZW5kZXJsb29wIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvZXZlbnQiKSxpPWZ1bmN0aW9uKGUsdCl7dGhpcy5vblJlbmRlcj1lLHRoaXMucGVuZGluZz0hMSx0aGlzLmNoYW5nZXM9MCx0aGlzLiRyZWN1cnNpb25MaW1pdD0yLHRoaXMud2luZG93PXR8fHdpbmRvdzt2YXIgbj10aGlzO3RoaXMuX2ZsdXNoPWZ1bmN0aW9uKGUpe24ucGVuZGluZz0hMTt2YXIgdD1uLmNoYW5nZXM7dCYmKHIuYmxvY2tJZGxlKDEwMCksbi5jaGFuZ2VzPTAsbi5vblJlbmRlcih0KSk7aWYobi5jaGFuZ2VzKXtpZihuLiRyZWN1cnNpb25MaW1pdC0tPDApcmV0dXJuO24uc2NoZWR1bGUoKX1lbHNlIG4uJHJlY3Vyc2lvbkxpbWl0PTJ9fTsoZnVuY3Rpb24oKXt0aGlzLnNjaGVkdWxlPWZ1bmN0aW9uKGUpe3RoaXMuY2hhbmdlcz10aGlzLmNoYW5nZXN8ZSx0aGlzLmNoYW5nZXMmJiF0aGlzLnBlbmRpbmcmJihyLm5leHRGcmFtZSh0aGlzLl9mbHVzaCksdGhpcy5wZW5kaW5nPSEwKX0sdGhpcy5jbGVhcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNoYW5nZXM7cmV0dXJuIHRoaXMuY2hhbmdlcz0wLHR9fSkuY2FsbChpLnByb3RvdHlwZSksdC5SZW5kZXJMb29wPWl9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvZm9udF9tZXRyaWNzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9saWIvZG9tIikscz1lKCIuLi9saWIvbGFuZyIpLG89ZSgiLi4vbGliL2V2ZW50IiksdT1lKCIuLi9saWIvdXNlcmFnZW50IiksYT1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPTI1NixsPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09ImZ1bmN0aW9uIixjPTIwMCxoPXQuRm9udE1ldHJpY3M9ZnVuY3Rpb24oZSl7dGhpcy5lbD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzKHRoaXMuZWwuc3R5bGUsITApLHRoaXMuJG1haW49aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcyh0aGlzLiRtYWluLnN0eWxlKSx0aGlzLiRtZWFzdXJlTm9kZT1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzKHRoaXMuJG1lYXN1cmVOb2RlLnN0eWxlKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuJG1haW4pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy4kbWVhc3VyZU5vZGUpLGUuYXBwZW5kQ2hpbGQodGhpcy5lbCksdGhpcy4kbWVhc3VyZU5vZGUuaW5uZXJIVE1MPXMuc3RyaW5nUmVwZWF0KCJYIixmKSx0aGlzLiRjaGFyYWN0ZXJTaXplPXt3aWR0aDowLGhlaWdodDowfSxsP3RoaXMuJGFkZE9ic2VydmVyKCk6dGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzKCl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsYSksdGhpcy4kY2hhcmFjdGVyU2l6ZT17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXM9ZnVuY3Rpb24oZSx0KXtlLndpZHRoPWUuaGVpZ2h0PSJhdXRvIixlLmxlZnQ9ZS50b3A9IjBweCIsZS52aXNpYmlsaXR5PSJoaWRkZW4iLGUucG9zaXRpb249ImFic29sdXRlIixlLndoaXRlU3BhY2U9InByZSIsdS5pc0lFPDg/ZVsiZm9udC1mYW1pbHkiXT0iaW5oZXJpdCI6ZS5mb250PSJpbmhlcml0IixlLm92ZXJmbG93PXQ/ImhpZGRlbiI6InZpc2libGUifSx0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oZSl7ZT09PXVuZGVmaW5lZCYmKGU9dGhpcy4kbWVhc3VyZVNpemVzKCkpO2lmKGUmJih0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoIT09ZS53aWR0aHx8dGhpcy4kY2hhcmFjdGVyU2l6ZS5oZWlnaHQhPT1lLmhlaWdodCkpe3RoaXMuJG1lYXN1cmVOb2RlLnN0eWxlLmZvbnRXZWlnaHQ9ImJvbGQiO3ZhciB0PXRoaXMuJG1lYXN1cmVTaXplcygpO3RoaXMuJG1lYXN1cmVOb2RlLnN0eWxlLmZvbnRXZWlnaHQ9IiIsdGhpcy4kY2hhcmFjdGVyU2l6ZT1lLHRoaXMuY2hhclNpemVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5hbGxvd0JvbGRGb250cz10JiZ0LndpZHRoPT09ZS53aWR0aCYmdC5oZWlnaHQ9PT1lLmhlaWdodCx0aGlzLl9lbWl0KCJjaGFuZ2VDaGFyYWN0ZXJTaXplIix7ZGF0YTplfSl9fSx0aGlzLiRhZGRPYnNlcnZlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kb2JzZXJ2ZXI9bmV3IHdpbmRvdy5SZXNpemVPYnNlcnZlcihmdW5jdGlvbih0KXt2YXIgbj10WzBdLmNvbnRlbnRSZWN0O2UuY2hlY2tGb3JTaXplQ2hhbmdlcyh7aGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgvZn0pfSksdGhpcy4kb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLiRtZWFzdXJlTm9kZSl9LHRoaXMuJHBvbGxTaXplQ2hhbmdlcz1mdW5jdGlvbigpe2lmKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyfHx0aGlzLiRvYnNlcnZlcilyZXR1cm4gdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9by5vbklkbGUoZnVuY3Rpb24gdCgpe2UuY2hlY2tGb3JTaXplQ2hhbmdlcygpLG8ub25JZGxlKHQsNTAwKX0sNTAwKX0sdGhpcy5zZXRQb2xsaW5nPWZ1bmN0aW9uKGUpe2U/dGhpcy4kcG9sbFNpemVDaGFuZ2VzKCk6dGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXImJihjbGVhckludGVydmFsKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyKSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj0wKX0sdGhpcy4kbWVhc3VyZVNpemVzPWZ1bmN0aW9uKGUpe3ZhciB0PXtoZWlnaHQ6KGV8fHRoaXMuJG1lYXN1cmVOb2RlKS5jbGllbnRIZWlnaHQsd2lkdGg6KGV8fHRoaXMuJG1lYXN1cmVOb2RlKS5jbGllbnRXaWR0aC9mfTtyZXR1cm4gdC53aWR0aD09PTB8fHQuaGVpZ2h0PT09MD9udWxsOnR9LHRoaXMuJG1lYXN1cmVDaGFyV2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy4kbWFpbi5pbm5lckhUTUw9cy5zdHJpbmdSZXBlYXQoZSxmKTt2YXIgdD10aGlzLiRtYWluLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiB0LndpZHRoL2Z9LHRoaXMuZ2V0Q2hhcmFjdGVyV2lkdGg9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jaGFyU2l6ZXNbZV07cmV0dXJuIHQ9PT11bmRlZmluZWQmJih0PXRoaXMuY2hhclNpemVzW2VdPXRoaXMuJG1lYXN1cmVDaGFyV2lkdGgoZSkvdGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCksdH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciksdGhpcy4kb2JzZXJ2ZXImJnRoaXMuJG9ic2VydmVyLmRpc2Nvbm5lY3QoKSx0aGlzLmVsJiZ0aGlzLmVsLnBhcmVudE5vZGUmJnRoaXMuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsKX0sdGhpcy4kZ2V0Wm9vbT1mdW5jdGlvbiBlKHQpe3JldHVybiB0Pyh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS56b29tfHwxKSplKHQucGFyZW50RWxlbWVudCk6MX0sdGhpcy4kaW5pdFRyYW5zZm9ybU1lYXN1cmVOb2Rlcz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuWyJkaXYiLHtzdHlsZToicG9zaXRpb246IGFic29sdXRlO3RvcDoiK2UrInB4O2xlZnQ6Iit0KyJweDsifV19O3RoaXMuZWxzPWkuYnVpbGREb20oW2UoMCwwKSxlKGMsMCksZSgwLGMpLGUoYyxjKV0sdGhpcy5lbCl9LHRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKGUsdCxuKXt2YXIgcj1lWzFdKnRbMF0tZVswXSp0WzFdO3JldHVyblsoLXRbMV0qblswXSt0WzBdKm5bMV0pL3IsKCtlWzFdKm5bMF0tZVswXSpuWzFdKS9yXX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuW2VbMF0tdFswXSxlWzFdLXRbMV1dfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm5bZVswXSt0WzBdLGVbMV0rdFsxXV19ZnVuY3Rpb24gbyhlLHQpe3JldHVybltlKnRbMF0sZSp0WzFdXX1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW3QubGVmdCx0LnRvcF19aWYoZSl7dmFyIG49dGhpcy4kZ2V0Wm9vbSh0aGlzLmVsKTtlPW8oMS9uLGUpfXRoaXMuZWxzfHx0aGlzLiRpbml0VHJhbnNmb3JtTWVhc3VyZU5vZGVzKCk7dmFyIGE9dSh0aGlzLmVsc1swXSksZj11KHRoaXMuZWxzWzFdKSxsPXUodGhpcy5lbHNbMl0pLGg9dSh0aGlzLmVsc1szXSkscD1yKGkoaCxmKSxpKGgsbCksaShzKGYsbCkscyhoLGEpKSksZD1vKDErcFswXSxpKGYsYSkpLHY9bygxK3BbMV0saShsLGEpKTtpZih0KXt2YXIgbT10LGc9cFswXSptWzBdL2MrcFsxXSptWzFdL2MrMSx5PXMobyhtWzBdLGQpLG8obVsxXSx2KSk7cmV0dXJuIHMobygxL2cvYyx5KSxhKX12YXIgYj1pKGUsYSksdz1yKGkoZCxvKHBbMF0sYikpLGkodixvKHBbMV0sYikpLGIpO3JldHVybiBvKGMsdyl9fSkuY2FsbChoLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvdmlydHVhbF9yZW5kZXJlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvY29uZmlnIiwiYWNlL2xheWVyL2d1dHRlciIsImFjZS9sYXllci9tYXJrZXIiLCJhY2UvbGF5ZXIvdGV4dCIsImFjZS9sYXllci9jdXJzb3IiLCJhY2Uvc2Nyb2xsYmFyIiwiYWNlL3Njcm9sbGJhciIsImFjZS9yZW5kZXJsb29wIiwiYWNlL2xheWVyL2ZvbnRfbWV0cmljcyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9jb25maWciKSxvPWUoIi4vbGF5ZXIvZ3V0dGVyIikuR3V0dGVyLHU9ZSgiLi9sYXllci9tYXJrZXIiKS5NYXJrZXIsYT1lKCIuL2xheWVyL3RleHQiKS5UZXh0LGY9ZSgiLi9sYXllci9jdXJzb3IiKS5DdXJzb3IsbD1lKCIuL3Njcm9sbGJhciIpLkhTY3JvbGxCYXIsYz1lKCIuL3Njcm9sbGJhciIpLlZTY3JvbGxCYXIsaD1lKCIuL3JlbmRlcmxvb3AiKS5SZW5kZXJMb29wLHA9ZSgiLi9sYXllci9mb250X21ldHJpY3MiKS5Gb250TWV0cmljcyxkPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdj0nLmFjZV9icjEge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7fS5hY2VfYnIyIHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4O30uYWNlX2JyMyB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDt9LmFjZV9icjQge2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI1IHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyNiB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjcge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI4IHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIDogM3B4O30uYWNlX2JyOSB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjEwe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxMXtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTJ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjEze2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxNHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTV7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O30uYWNlX2VkaXRvciB7cG9zaXRpb246IHJlbGF0aXZlO292ZXJmbG93OiBoaWRkZW47Zm9udDogMTJweC9ub3JtYWwgXCdNb25hY29cJywgXCdNZW5sb1wnLCBcJ1VidW50dSBNb25vXCcsIFwnQ29uc29sYXNcJywgXCdzb3VyY2UtY29kZS1wcm9cJywgbW9ub3NwYWNlO2RpcmVjdGlvbjogbHRyO3RleHQtYWxpZ246IGxlZnQ7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO30uYWNlX3Njcm9sbGVyIHtwb3NpdGlvbjogYWJzb2x1dGU7b3ZlcmZsb3c6IGhpZGRlbjt0b3A6IDA7Ym90dG9tOiAwO2JhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7LW1zLXVzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTt1c2VyLXNlbGVjdDogbm9uZTtjdXJzb3I6IHRleHQ7fS5hY2VfY29udGVudCB7cG9zaXRpb246IGFic29sdXRlO2JveC1zaXppbmc6IGJvcmRlci1ib3g7bWluLXdpZHRoOiAxMDAlO2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX2RyYWdnaW5nIC5hY2Vfc2Nyb2xsZXI6YmVmb3Jle3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDA7bGVmdDogMDtyaWdodDogMDtib3R0b206IDA7Y29udGVudDogXCdcJztiYWNrZ3JvdW5kOiByZ2JhKDI1MCwgMjUwLCAyNTAsIDAuMDEpO3otaW5kZXg6IDEwMDA7fS5hY2VfZHJhZ2dpbmcuYWNlX2RhcmsgLmFjZV9zY3JvbGxlcjpiZWZvcmV7YmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAxKTt9LmFjZV9zZWxlY3RpbmcsIC5hY2Vfc2VsZWN0aW5nICoge2N1cnNvcjogdGV4dCAhaW1wb3J0YW50O30uYWNlX2d1dHRlciB7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93IDogaGlkZGVuO3dpZHRoOiBhdXRvO3RvcDogMDtib3R0b206IDA7bGVmdDogMDtjdXJzb3I6IGRlZmF1bHQ7ei1pbmRleDogNDstbXMtdXNlci1zZWxlY3Q6IG5vbmU7LW1vei11c2VyLXNlbGVjdDogbm9uZTstd2Via2l0LXVzZXItc2VsZWN0OiBub25lO3VzZXItc2VsZWN0OiBub25lO2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX2d1dHRlci1hY3RpdmUtbGluZSB7cG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7cmlnaHQ6IDA7fS5hY2Vfc2Nyb2xsZXIuYWNlX3Njcm9sbC1sZWZ0IHtib3gtc2hhZG93OiAxN3B4IDAgMTZweCAtMTZweCByZ2JhKDAsIDAsIDAsIDAuNCkgaW5zZXQ7fS5hY2VfZ3V0dGVyLWNlbGwge3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDA7bGVmdDogMDtyaWdodDogMDtwYWRkaW5nLWxlZnQ6IDE5cHg7cGFkZGluZy1yaWdodDogNnB4O2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7fS5hY2VfZ3V0dGVyLWNlbGwuYWNlX2Vycm9yIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUJPRkJNVkVYLy8vLy8vLy8vUVJzd0ZBYi9VaTR3RkFZd0ZBWXdGQWFXR0FmRFJ5bXpPU0gvUHhzd0ZBYi9TaVV3RkFZd0ZBYlVQUnZqUWlEbGxvZzVIaEhkUnlic1RpMy9UeXY5VGlyK1N5ai9VQzMvLy8vWHVyZWJNQkl3RkFiL1JTSGJQeC9nVXpmZHdMM2t6TWl2S0JBd0ZBYmJ2Ym5oUHg2Nk5ob3dGQVl3RkFhWkpnOHdGQWF4S0JEWnVyZi9SQjZtTXhiL1NDTXdGQVl3RkFieFFCMytSQjR3RkFiL1FoeTRPaCs0UWlmYk5SY3dGQVl3RkFZd0ZBYi9RUnpkTmhnd0ZBWXdGQWJhdjd2L1V5N29hRTY4TUJLNUx4TGV3ci9yMk5YZXdMc3dGQWF4Snc0d0ZBYmtQUnkyUHlZd0ZBYXhLaExtMXRNd0ZBYXpQaVF3RkFhVUdBYi9RQnJmT3gzYnZydi9WQy9tYUU0d0ZBYlJQQnE2TVJPOFF5bmV3OERwMnRqZndiMHdGQWJ4NmVqdTUrYnk2dW5zNHVIOS9mMzYrdnIvR2tIakFBQUFZblJTVGxNQUd0KzY0cm5XdS9ibzhlQUE0SW5IMytEd29ON2o0ZUxpNHhQOTlOZmc0K2IrL3U5Qi9lRHMxTUQxbU83KzRQSGcyTVhhMzQ3Zzd2RGl6TUxONGVHK1B2N2k1ZXZzL3Y3OXl1N1MzL0RWNy80OThZdjI0ZUgrNHVmUTNPenUvdjcreTEzc1Jxd0FBQURMU1VSQlZIamFaYy9YRHNGZ0dJQmh0RHJzaGxpdG1rMklyYkhGcUwycHZYZi8rNzhEUG9rajcrRno5cXBVLzlVWEpJbGhtUGFUYVE2UVBhejBtbSs1Z3drZ292Y1Y2R1p6ZDVKdENRd2dzeG9IT3ZKTzE1a2xlUkxBbk1nSEZJRVNVRVBtYXdCOW5nbWVsVHRpcHd3ZkFTaWx4T0x5aVY1VVZVeVZBZmJHMGNDUEhpZytHQmt6QUVOSFMwQXN0VkY2YmFjWklPemdMbXhzSGJ0Mk9lY05nSkM4M0pFUm1lUFVZcThBUkdrSng2WHRGc2RkZEJRZ1pFMm5QUjZDSUNaaGF3akE0RmIvY2h2KzM5OWtmUitNTU1ER09RQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO30uYWNlX2d1dHRlci1jZWxsLmFjZV93YXJuaW5nIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUFtVkJNVkVYLy8vOEFBQUQvLy84QUFBQUFBQUJQU3piLzVzQUFBQUIvYmxILzczei91bGtBQUFBQUFBRDg1cGtBQUFBQUFBQUNBZ1Avdkd6L3JrRGVyR2JHclY3L3BrUUlDQWYvLy8vZTBJc0FBQUQvb0VEL3FUdmhyblVBQUFEL3lIRC9uamNBQUFEdXYyci9uei8vb1RqL3AwNjRvR2YvekhBQUFBQTlOaXIvdEZJQUFBRC90bFRpdVdmL3RrSUFBQUN5blhFQUFBQUFBQUF0SVJXN3pCcEJBQUFBTTNSU1RsTUFBQlIxbTdSWE84TG4zMVozNnpUK25lWGU1T3pvb1JEZm4rVFo0cDNoMmhUZjR0M2szdWN5ck4xSzUrWGFrczUyU2ZzOUNYZ3JBQUFBamtsRVFWUjQybzNQYlErQ0lCUUZZRXdib1BoU1lnb1l1bklxcUxuNi96OHVZZEg4Vm1kbnU5dno0V3dYZ04veFRQUkQyK3NnT2NaanNnZS93aFhaZ1VhWVl2VDhRbnVKYVVyanJIVVFyZUdjenVFYWZRQ08vU0pUdWZUYnJvV3NQZ3NsbFZocTN3SkVrMmpVU3pYM0NVRURKQzg0NzA3ZGpSYzVNVEFReG9MZ3VwV1J3VzZVQjVmUysrTlY4QWJPWmduc0M3QnBFQUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7fS5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FBQUFBQTZtS0M5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFBSjBVazVUQUFCMms4MDRBQUFBUGtsRVFWUVkwMk5nSUI2OFF1TzN0aUx6bmpBd3BLVGdOeURiTWVnd2lzQ0haVUVUVVpWMFpxT3F1QnBYajJydG5wU0pUMUFFbm5SbUwyT2dHZ0FBSUtrUlFhcDJodGdBQUFBQVNVVk9SSzVDWUlJPSIpO2JhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7fS5hY2VfZGFyayAuYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUJBTUFBQUR0M2VKU0FBQUFKRkJNVkVVQUFBQ2hvYUdBZ0lBcUtpcSt2cjZ0cmExWldWbVVsSlNibTVzOFBEeHVibTU2ZW5yZGd6ZzNBQUFBQVhSU1RsTUFRT2JZWmdBQUFDbEpSRUZVZU5wallNQVBkc01ZSGVneUpaRlFCbHNVbE1GVkNXVVlLa0FaTXhaQUdkeGxETVFCQUcrVEJQNEI2UnlKQUFBQUFFbEZUa1N1UW1DQyIpO30uYWNlX3Njcm9sbGJhciB7Y29udGFpbjogc3RyaWN0O3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogMDtib3R0b206IDA7ei1pbmRleDogNjt9LmFjZV9zY3JvbGxiYXItaW5uZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTtjdXJzb3I6IHRleHQ7bGVmdDogMDt0b3A6IDA7fS5hY2Vfc2Nyb2xsYmFyLXZ7b3ZlcmZsb3cteDogaGlkZGVuO292ZXJmbG93LXk6IHNjcm9sbDt0b3A6IDA7fS5hY2Vfc2Nyb2xsYmFyLWgge292ZXJmbG93LXg6IHNjcm9sbDtvdmVyZmxvdy15OiBoaWRkZW47bGVmdDogMDt9LmFjZV9wcmludC1tYXJnaW4ge3Bvc2l0aW9uOiBhYnNvbHV0ZTtoZWlnaHQ6IDEwMCU7fS5hY2VfdGV4dC1pbnB1dCB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDA7d2lkdGg6IDAuNWVtO2hlaWdodDogMWVtO29wYWNpdHk6IDA7YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7LW1vei1hcHBlYXJhbmNlOiBub25lO2FwcGVhcmFuY2U6IG5vbmU7Ym9yZGVyOiBub25lO3Jlc2l6ZTogbm9uZTtvdXRsaW5lOiBub25lO292ZXJmbG93OiBoaWRkZW47Zm9udDogaW5oZXJpdDtwYWRkaW5nOiAwIDFweDttYXJnaW46IDAgLTFweDtjb250YWluOiBzdHJpY3Q7LW1zLXVzZXItc2VsZWN0OiB0ZXh0Oy1tb3otdXNlci1zZWxlY3Q6IHRleHQ7LXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDt1c2VyLXNlbGVjdDogdGV4dDt3aGl0ZS1zcGFjZTogcHJlIWltcG9ydGFudDt9LmFjZV90ZXh0LWlucHV0LmFjZV9jb21wb3NpdGlvbiB7YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Y29sb3I6IGluaGVyaXQ7ei1pbmRleDogMTAwMDtvcGFjaXR5OiAxO30uYWNlX2NvbXBvc2l0aW9uX3BsYWNlaG9sZGVyIHsgY29sb3I6IHRyYW5zcGFyZW50IH0uYWNlX2NvbXBvc2l0aW9uX21hcmtlciB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZDtwb3NpdGlvbjogYWJzb2x1dGU7Ym9yZGVyLXJhZGl1czogMDttYXJnaW4tdG9wOiAxcHg7fVthY2Vfbm9jb250ZXh0PXRydWVdIHt0cmFuc2Zvcm06IG5vbmUhaW1wb3J0YW50O2ZpbHRlcjogbm9uZSFpbXBvcnRhbnQ7cGVyc3BlY3RpdmU6IG5vbmUhaW1wb3J0YW50O2NsaXAtcGF0aDogbm9uZSFpbXBvcnRhbnQ7bWFzayA6IG5vbmUhaW1wb3J0YW50O2NvbnRhaW46IG5vbmUhaW1wb3J0YW50O3BlcnNwZWN0aXZlOiBub25lIWltcG9ydGFudDttaXgtYmxlbmQtbW9kZTogaW5pdGlhbCFpbXBvcnRhbnQ7ei1pbmRleDogYXV0bzt9LmFjZV9sYXllciB7ei1pbmRleDogMTtwb3NpdGlvbjogYWJzb2x1dGU7b3ZlcmZsb3c6IGhpZGRlbjt3b3JkLXdyYXA6IG5vcm1hbDt3aGl0ZS1zcGFjZTogcHJlO2hlaWdodDogMTAwJTt3aWR0aDogMTAwJTtib3gtc2l6aW5nOiBib3JkZXItYm94O3BvaW50ZXItZXZlbnRzOiBub25lO30uYWNlX2d1dHRlci1sYXllciB7cG9zaXRpb246IHJlbGF0aXZlO3dpZHRoOiBhdXRvO3RleHQtYWxpZ246IHJpZ2h0O3BvaW50ZXItZXZlbnRzOiBhdXRvO2hlaWdodDogMTAwMDAwMHB4O2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX3RleHQtbGF5ZXIge2ZvbnQ6IGluaGVyaXQgIWltcG9ydGFudDtwb3NpdGlvbjogYWJzb2x1dGU7aGVpZ2h0OiAxMDAwMDAwcHg7d2lkdGg6IDEwMDAwMDBweDtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lLCAuYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmVfZ3JvdXAge2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDA7bGVmdDogMDtyaWdodDogMDt9LmFjZV9oaWRwaSAuYWNlX3RleHQtbGF5ZXIsLmFjZV9oaWRwaSAuYWNlX2d1dHRlci1sYXllciwuYWNlX2hpZHBpIC5hY2VfY29udGVudCwuYWNlX2hpZHBpIC5hY2VfZ3V0dGVyIHtjb250YWluOiBzdHJpY3Q7d2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTt9LmFjZV9oaWRwaSAuYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmUsIC5hY2VfaGlkcGkgLmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lX2dyb3VwIHtjb250YWluOiBzdHJpY3Q7fS5hY2VfY2prIHtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjogY2VudGVyO30uYWNlX2N1cnNvci1sYXllciB7ei1pbmRleDogNDt9LmFjZV9jdXJzb3Ige3otaW5kZXg6IDQ7cG9zaXRpb246IGFic29sdXRlO2JveC1zaXppbmc6IGJvcmRlci1ib3g7Ym9yZGVyLWxlZnQ6IDJweCBzb2xpZDt0cmFuc2Zvcm06IHRyYW5zbGF0ZXooMCk7fS5hY2VfbXVsdGlzZWxlY3QgLmFjZV9jdXJzb3Ige2JvcmRlci1sZWZ0LXdpZHRoOiAxcHg7fS5hY2Vfc2xpbS1jdXJzb3JzIC5hY2VfY3Vyc29yIHtib3JkZXItbGVmdC13aWR0aDogMXB4O30uYWNlX292ZXJ3cml0ZS1jdXJzb3JzIC5hY2VfY3Vyc29yIHtib3JkZXItbGVmdC13aWR0aDogMDtib3JkZXItYm90dG9tOiAxcHggc29saWQ7fS5hY2VfaGlkZGVuLWN1cnNvcnMgLmFjZV9jdXJzb3Ige29wYWNpdHk6IDAuMjt9LmFjZV9zbW9vdGgtYmxpbmtpbmcgLmFjZV9jdXJzb3Ige3RyYW5zaXRpb246IG9wYWNpdHkgMC4xOHM7fS5hY2VfYW5pbWF0ZS1ibGlua2luZyAuYWNlX2N1cnNvciB7YW5pbWF0aW9uLWR1cmF0aW9uOiAxMDAwbXM7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogc3RlcC1lbmQ7YW5pbWF0aW9uLW5hbWU6IGJsaW5rLWFjZS1hbmltYXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO30uYWNlX2FuaW1hdGUtYmxpbmtpbmcuYWNlX3Ntb290aC1ibGlua2luZyAuYWNlX2N1cnNvciB7YW5pbWF0aW9uLWR1cmF0aW9uOiAxMDAwbXM7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLW5hbWU6IGJsaW5rLWFjZS1hbmltYXRlLXNtb290aDt9QGtleWZyYW1lcyBibGluay1hY2UtYW5pbWF0ZSB7ZnJvbSwgdG8geyBvcGFjaXR5OiAxOyB9NjAlIHsgb3BhY2l0eTogMDsgfX1Aa2V5ZnJhbWVzIGJsaW5rLWFjZS1hbmltYXRlLXNtb290aCB7ZnJvbSwgdG8geyBvcGFjaXR5OiAxOyB9NDUlIHsgb3BhY2l0eTogMTsgfTYwJSB7IG9wYWNpdHk6IDA7IH04NSUgeyBvcGFjaXR5OiAwOyB9fS5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDM7fS5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogNTt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogNjt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmUtbGluZSB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDI7fS5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWQtd29yZCB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDQ7Ym94LXNpemluZzogYm9yZGVyLWJveDt9LmFjZV9saW5lIC5hY2VfZm9sZCB7Ym94LXNpemluZzogYm9yZGVyLWJveDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7aGVpZ2h0OiAxMXB4O21hcmdpbi10b3A6IC0ycHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCRUFBQUFKQ0FZQUFBRFU2TWNNQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFKcEpSRUZVZU5waS9QLy9Qd09sZ0FYR1lHUmtsQVZTb2tEOEdtandZMXdhc0tsalFwWUFDdHBDRmVBRGNIVlFmUXlNUUF3endBWkkzd0pLdkNMa2ZLQmFNU0NsQmxSN0JPUWlrQ0ZHUUVFcklIMFZxa2FiaUdDQXF3VWFkQXpaSlJ4UXIvMGd3aVhJYWw4elFRUG5OVlRnSjFUZGF3TDBUNWdCSVAxTVVKTmhCdjJIS29RSEhqcU5yQTRXTzR6WTBnbHlOS0xUMktJZklNQUFRc2RnR2lYdmduWUFBQUFBU1VWT1JLNUNZSUk9IiksdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQTNDQVlBQUFETk5pQTVBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUNKSlJFRlVlTnBpK1AvL2Z4Z1RBd1BEQnhEeEQwNzhSU1grWWVFeURGTUNJTUFBSTNJTm1YaXdmMllBQUFBQVNVVk9SSzVDWUlJPSIpO2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQsIHJlcGVhdC14O2JhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O2NvbG9yOiB0cmFuc3BhcmVudDtib3JkZXI6IDFweCBzb2xpZCBibGFjaztib3JkZXItcmFkaXVzOiAycHg7Y3Vyc29yOiBwb2ludGVyO3BvaW50ZXItZXZlbnRzOiBhdXRvO30uYWNlX2RhcmsgLmFjZV9mb2xkIHt9LmFjZV9mb2xkOmhvdmVye2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJFQUFBQUpDQVlBQUFEVTZNY01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUpwSlJFRlVlTnBpL1AvL1B3T2xnQVhHWUdSa2xBVlNva0Q4R21qd1kxd2FzS2xqUXBZQUN0cENGZUFEY0hWUWZReU1RQXd6d0FaSTN3Skt2Q0xrZktCYU1TQ2xCbFI3Qk9RaWtDRkdRRUVySUgwVnFrYWJpR0NBcXdVYWRBelpKUnhRci8wZ3dpWElhbDh6UVFQbk5WVGdKMVRkYXdMMFQ1Z0JJUDFNVUpOaEJ2MkhLb1FISGpxTnJBNFdPNHpZMGdseU5LTFQyS0lmSU1BQVFzZGdHaVh2Z25ZQUFBQUFTVVZPUks1Q1lJST0iKSx1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBM0NBWUFBQUROTmlBNUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBQ0JKUkVGVWVOcGkrUC8vZno0VEF3UERaeER4RDVYNGk1ZkxNRXdKZ0FBREFFUFZEYmpOdzg3WkFBQUFBRWxGVGtTdVFtQ0MiKTt9LmFjZV90b29sdGlwIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGO2JhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHRyYW5zcGFyZW50LCByZ2JhKDAsIDAsIDAsIDAuMSkpO2JvcmRlcjogMXB4IHNvbGlkIGdyYXk7Ym9yZGVyLXJhZGl1czogMXB4O2JveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7Y29sb3I6IGJsYWNrO21heC13aWR0aDogMTAwJTtwYWRkaW5nOiAzcHggNHB4O3Bvc2l0aW9uOiBmaXhlZDt6LWluZGV4OiA5OTk5OTk7Ym94LXNpemluZzogYm9yZGVyLWJveDtjdXJzb3I6IGRlZmF1bHQ7d2hpdGUtc3BhY2U6IHByZTt3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7bGluZS1oZWlnaHQ6IG5vcm1hbDtmb250LXN0eWxlOiBub3JtYWw7Zm9udC13ZWlnaHQ6IG5vcm1hbDtsZXR0ZXItc3BhY2luZzogbm9ybWFsO3BvaW50ZXItZXZlbnRzOiBub25lO30uYWNlX2ZvbGRpbmctZW5hYmxlZCA+IC5hY2VfZ3V0dGVyLWNlbGwge3BhZGRpbmctcmlnaHQ6IDEzcHg7fS5hY2VfZm9sZC13aWRnZXQge2JveC1zaXppbmc6IGJvcmRlci1ib3g7bWFyZ2luOiAwIC0xMnB4IDAgMXB4O2Rpc3BsYXk6IG5vbmU7d2lkdGg6IDExcHg7dmVydGljYWwtYWxpZ246IHRvcDtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFORWxFUVZSNDJtV0tzUTBBTUF6QzhpeExscnpRanptQmlFanAwQTZXd0JDU1BnS0FYb0xrcVNvdDduTjN5TXdSN3BaMzJOenBLa1ZvREJVeEtBQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogM3B4O2JvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O2N1cnNvcjogcG9pbnRlcjt9LmFjZV9mb2xkaW5nLWVuYWJsZWQgLmFjZV9mb2xkLXdpZGdldCB7ZGlzcGxheTogaW5saW5lLWJsb2NrOyAgIH0uYWNlX2ZvbGQtd2lkZ2V0LmFjZV9lbmQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQU5FbEVRVlI0Mm0zSHdRa0FNQWhEMFl6c1JjaEZLSTdzQWlrZVdrcnh3U2NFQjBuaDVlN0tUUFdpbVpraTR0WWZWYlgrTU5sNHB5WlhlalVPMVFBQUFBQkpSVTVFcmtKZ2dnPT0iKTt9LmFjZV9mb2xkLXdpZGdldC5hY2VfY2xvc2VkIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQU1BQUFBR0NBWUFBQUFHNVNRTUFBQUFPVWxFUVZSNDJqWEt3UWtBTUFnRHdLd3FLRDRFd1EyNnNTT2tWV2pnSUlIQXpQaUNnYXFpcW5KSFpuS0lDQkVSSE4xOTRPNWI5dmJMdUFWUkwrbDBZV25aQUFBQUFFbEZUa1N1UW1DQ1hBPT0iKTt9LmFjZV9mb2xkLXdpZGdldDpob3ZlciB7Ym9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO30uYWNlX2ZvbGQtd2lkZ2V0OmFjdGl2ZSB7Ym9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjQpO2JhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQUhrbEVRVlFJVzJQNC8vOC9Bem9HRVE3b0dDYUxMQWhXaVN3QjE0NkJBUUNTVFBZb2NxVDBBQUFBQUVsRlRrU3VRbUNDIik7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0LmFjZV9lbmQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQUgwbEVRVlFJVzJQNC8vOC9BeFE3d05qSUFqRE1nQzRBeGpDVktCaXJJQUFGMGt6MnJsaHhwQUFBQUFCSlJVNUVya0pnZ2c9PSIpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldC5hY2VfY2xvc2VkIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQU1BQUFBRkNBWUFBQUNBY1ZhaUFBQUFIRWxFUVZRSVcyUDQvLysvQXhBemdEQURsT09Bem5IQUtnUFdBd0FSamk4VUlEVGZRUUFBQUFCSlJVNUVya0pnZ2c9PSIpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldDpob3ZlciB7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0OmFjdGl2ZSB7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTt9LmFjZV9pbmxpbmVfYnV0dG9uIHtib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7ZGlzcGxheTogaW5saW5lLWJsb2NrO21hcmdpbjogLTFweCA4cHg7cGFkZGluZzogMCA1cHg7cG9pbnRlci1ldmVudHM6IGF1dG87Y3Vyc29yOiBwb2ludGVyO30uYWNlX2lubGluZV9idXR0b246aG92ZXIge2JvcmRlci1jb2xvcjogZ3JheTtiYWNrZ3JvdW5kOiByZ2JhKDIwMCwyMDAsMjAwLDAuMik7ZGlzcGxheTogaW5saW5lLWJsb2NrO3BvaW50ZXItZXZlbnRzOiBhdXRvO30uYWNlX2ZvbGQtd2lkZ2V0LmFjZV9pbnZhbGlkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkZCNEI0O2JvcmRlci1jb2xvcjogI0RFNTU1NTt9LmFjZV9mYWRlLWZvbGQtd2lkZ2V0cyAuYWNlX2ZvbGQtd2lkZ2V0IHt0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNHMgZWFzZSAwLjA1cztvcGFjaXR5OiAwO30uYWNlX2ZhZGUtZm9sZC13aWRnZXRzOmhvdmVyIC5hY2VfZm9sZC13aWRnZXQge3RyYW5zaXRpb246IG9wYWNpdHkgMC4wNXMgZWFzZSAwLjA1cztvcGFjaXR5OjE7fS5hY2VfdW5kZXJsaW5lIHt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9LmFjZV9ib2xkIHtmb250LXdlaWdodDogYm9sZDt9LmFjZV9ub2JvbGQgLmFjZV9ib2xkIHtmb250LXdlaWdodDogbm9ybWFsO30uYWNlX2l0YWxpYyB7Zm9udC1zdHlsZTogaXRhbGljO30uYWNlX2Vycm9yLW1hcmtlciB7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDAsIDAsMC4yKTtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogOTt9LmFjZV9oaWdobGlnaHQtbWFya2VyIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAwLDAuMik7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDg7fS5hY2VfbW9iaWxlLW1lbnUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtsaW5lLWhlaWdodDogMS41O2JvcmRlci1yYWRpdXM6IDRweDstbXMtdXNlci1zZWxlY3Q6IG5vbmU7LW1vei11c2VyLXNlbGVjdDogbm9uZTstd2Via2l0LXVzZXItc2VsZWN0OiBub25lO3VzZXItc2VsZWN0OiBub25lO2JhY2tncm91bmQ6IHdoaXRlO2JveC1zaGFkb3c6IDFweCAzcHggMnB4IGdyZXk7Ym9yZGVyOiAxcHggc29saWQgI2RjZGNkYztjb2xvcjogYmxhY2s7fS5hY2VfZGFyayA+IC5hY2VfbW9iaWxlLW1lbnUge2JhY2tncm91bmQ6ICMzMzM7Y29sb3I6ICNjY2M7Ym94LXNoYWRvdzogMXB4IDNweCAycHggZ3JleTtib3JkZXI6IDFweCBzb2xpZCAjNDQ0O30uYWNlX21vYmlsZS1idXR0b24ge3BhZGRpbmc6IDJweDtjdXJzb3I6IHBvaW50ZXI7b3ZlcmZsb3c6IGhpZGRlbjt9LmFjZV9tb2JpbGUtYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO29wYWNpdHk6MTt9LmFjZV9tb2JpbGUtYnV0dG9uOmFjdGl2ZSB7YmFja2dyb3VuZC1jb2xvcjogI2RkZDt9JyxtPWUoIi4vbGliL3VzZXJhZ2VudCIpLGc9bS5pc0lFO2kuaW1wb3J0Q3NzU3RyaW5nKHYsImFjZV9lZGl0b3IuY3NzIik7dmFyIHk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuY29udGFpbmVyPWV8fGkuY3JlYXRlRWxlbWVudCgiZGl2IiksaS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2VkaXRvciIpLGkuSElfRFBJJiZpLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfaGlkcGkiKSx0aGlzLnNldFRoZW1lKHQpLHRoaXMuJGd1dHRlcj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJGd1dHRlci5jbGFzc05hbWU9ImFjZV9ndXR0ZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJGd1dHRlciksdGhpcy4kZ3V0dGVyLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCEwKSx0aGlzLnNjcm9sbGVyPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5zY3JvbGxlci5jbGFzc05hbWU9ImFjZV9zY3JvbGxlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxlciksdGhpcy5jb250ZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb250ZW50LmNsYXNzTmFtZT0iYWNlX2NvbnRlbnQiLHRoaXMuc2Nyb2xsZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLiRndXR0ZXJMYXllcj1uZXcgbyh0aGlzLiRndXR0ZXIpLHRoaXMuJGd1dHRlckxheWVyLm9uKCJjaGFuZ2VHdXR0ZXJXaWR0aCIsdGhpcy5vbkd1dHRlclJlc2l6ZS5iaW5kKHRoaXMpKSx0aGlzLiRtYXJrZXJCYWNrPW5ldyB1KHRoaXMuY29udGVudCk7dmFyIHI9dGhpcy4kdGV4dExheWVyPW5ldyBhKHRoaXMuY29udGVudCk7dGhpcy5jYW52YXM9ci5lbGVtZW50LHRoaXMuJG1hcmtlckZyb250PW5ldyB1KHRoaXMuY29udGVudCksdGhpcy4kY3Vyc29yTGF5ZXI9bmV3IGYodGhpcy5jb250ZW50KSx0aGlzLiRob3JpelNjcm9sbD0hMSx0aGlzLiR2U2Nyb2xsPSExLHRoaXMuc2Nyb2xsQmFyPXRoaXMuc2Nyb2xsQmFyVj1uZXcgYyh0aGlzLmNvbnRhaW5lcix0aGlzKSx0aGlzLnNjcm9sbEJhckg9bmV3IGwodGhpcy5jb250YWluZXIsdGhpcyksdGhpcy5zY3JvbGxCYXJWLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oZSl7bi4kc2Nyb2xsQW5pbWF0aW9ufHxuLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGUuZGF0YS1uLnNjcm9sbE1hcmdpbi50b3ApfSksdGhpcy5zY3JvbGxCYXJILmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oZSl7bi4kc2Nyb2xsQW5pbWF0aW9ufHxuLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChlLmRhdGEtbi5zY3JvbGxNYXJnaW4ubGVmdCl9KSx0aGlzLnNjcm9sbFRvcD0wLHRoaXMuc2Nyb2xsTGVmdD0wLHRoaXMuY3Vyc29yUG9zPXtyb3c6MCxjb2x1bW46MH0sdGhpcy4kZm9udE1ldHJpY3M9bmV3IHAodGhpcy5jb250YWluZXIpLHRoaXMuJHRleHRMYXllci4kc2V0Rm9udE1ldHJpY3ModGhpcy4kZm9udE1ldHJpY3MpLHRoaXMuJHRleHRMYXllci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixmdW5jdGlvbihlKXtuLnVwZGF0ZUNoYXJhY3RlclNpemUoKSxuLm9uUmVzaXplKCEwLG4uZ3V0dGVyV2lkdGgsbi4kc2l6ZS53aWR0aCxuLiRzaXplLmhlaWdodCksbi5fc2lnbmFsKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixlKX0pLHRoaXMuJHNpemU9e3dpZHRoOjAsaGVpZ2h0OjAsc2Nyb2xsZXJIZWlnaHQ6MCxzY3JvbGxlcldpZHRoOjAsJGRpcnR5OiEwfSx0aGlzLmxheWVyQ29uZmlnPXt3aWR0aDoxLHBhZGRpbmc6MCxmaXJzdFJvdzowLGZpcnN0Um93U2NyZWVuOjAsbGFzdFJvdzowLGxpbmVIZWlnaHQ6MCxjaGFyYWN0ZXJXaWR0aDowLG1pbkhlaWdodDoxLG1heEhlaWdodDoxLG9mZnNldDowLGhlaWdodDoxLGd1dHRlck9mZnNldDoxfSx0aGlzLnNjcm9sbE1hcmdpbj17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjAsdjowLGg6MH0sdGhpcy5tYXJnaW49e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowLHY6MCxoOjB9LHRoaXMuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yPSFtLmlzSU9TLHRoaXMuJGxvb3A9bmV3IGgodGhpcy4kcmVuZGVyQ2hhbmdlcy5iaW5kKHRoaXMpLHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy51cGRhdGVDaGFyYWN0ZXJTaXplKCksdGhpcy5zZXRQYWRkaW5nKDQpLHMucmVzZXRPcHRpb25zKHRoaXMpLHMuX3NpZ25hbCgicmVuZGVyZXIiLHRoaXMpfTsoZnVuY3Rpb24oKXt0aGlzLkNIQU5HRV9DVVJTT1I9MSx0aGlzLkNIQU5HRV9NQVJLRVI9Mix0aGlzLkNIQU5HRV9HVVRURVI9NCx0aGlzLkNIQU5HRV9TQ1JPTEw9OCx0aGlzLkNIQU5HRV9MSU5FUz0xNix0aGlzLkNIQU5HRV9URVhUPTMyLHRoaXMuQ0hBTkdFX1NJWkU9NjQsdGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0s9MTI4LHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVD0yNTYsdGhpcy5DSEFOR0VfRlVMTD01MTIsdGhpcy5DSEFOR0VfSF9TQ1JPTEw9MTAyNCxyLmltcGxlbWVudCh0aGlzLGQpLHRoaXMudXBkYXRlQ2hhcmFjdGVyU2l6ZT1mdW5jdGlvbigpe3RoaXMuJHRleHRMYXllci5hbGxvd0JvbGRGb250cyE9dGhpcy4kYWxsb3dCb2xkRm9udHMmJih0aGlzLiRhbGxvd0JvbGRGb250cz10aGlzLiR0ZXh0TGF5ZXIuYWxsb3dCb2xkRm9udHMsdGhpcy5zZXRTdHlsZSgiYWNlX25vYm9sZCIsIXRoaXMuJGFsbG93Qm9sZEZvbnRzKSksdGhpcy5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aD10aGlzLmNoYXJhY3RlcldpZHRoPXRoaXMuJHRleHRMYXllci5nZXRDaGFyYWN0ZXJXaWR0aCgpLHRoaXMubGF5ZXJDb25maWcubGluZUhlaWdodD10aGlzLmxpbmVIZWlnaHQ9dGhpcy4kdGV4dExheWVyLmdldExpbmVIZWlnaHQoKSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwibGluZS1oZWlnaHQiLHRoaXMubGluZUhlaWdodCsicHgiKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmRvYy5vZmYoImNoYW5nZU5ld0xpbmVNb2RlIix0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUpLHRoaXMuc2Vzc2lvbj1lLGUmJnRoaXMuc2Nyb2xsTWFyZ2luLnRvcCYmZS5nZXRTY3JvbGxUb3AoKTw9MCYmZS5zZXRTY3JvbGxUb3AoLXRoaXMuc2Nyb2xsTWFyZ2luLnRvcCksdGhpcy4kY3Vyc29yTGF5ZXIuc2V0U2Vzc2lvbihlKSx0aGlzLiRtYXJrZXJCYWNrLnNldFNlc3Npb24oZSksdGhpcy4kbWFya2VyRnJvbnQuc2V0U2Vzc2lvbihlKSx0aGlzLiRndXR0ZXJMYXllci5zZXRTZXNzaW9uKGUpLHRoaXMuJHRleHRMYXllci5zZXRTZXNzaW9uKGUpO2lmKCFlKXJldHVybjt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMuc2Vzc2lvbi4kc2V0Rm9udE1ldHJpY3ModGhpcy4kZm9udE1ldHJpY3MpLHRoaXMuc2Nyb2xsQmFySC5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxUb3A9bnVsbCx0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGU9dGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlLmJpbmQodGhpcyksdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlKCksdGhpcy5zZXNzaW9uLmRvYy5vbigiY2hhbmdlTmV3TGluZU1vZGUiLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZSl9LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oZSx0LG4pe3Q9PT11bmRlZmluZWQmJih0PUluZmluaXR5KSx0aGlzLiRjaGFuZ2VkTGluZXM/KHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz5lJiYodGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PWUpLHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PHQmJih0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdz10KSk6dGhpcy4kY2hhbmdlZExpbmVzPXtmaXJzdFJvdzplLGxhc3RSb3c6dH07aWYodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c8dGhpcy5sYXllckNvbmZpZy5maXJzdFJvdyl7aWYoIW4pcmV0dXJuO3RoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PXRoaXMubGF5ZXJDb25maWcubGFzdFJvd31pZih0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c+dGhpcy5sYXllckNvbmZpZy5sYXN0Um93KXJldHVybjt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0xJTkVTKX0sdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKSx0aGlzLiR0ZXh0TGF5ZXIuJHVwZGF0ZUVvbENoYXIoKSx0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnNldEVvbENoYXIodGhpcy4kdGV4dExheWVyLkVPTF9DSEFSKX0sdGhpcy5vbkNoYW5nZVRhYlNpemU9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFR8dGhpcy5DSEFOR0VfTUFSS0VSKSx0aGlzLiR0ZXh0TGF5ZXIub25DaGFuZ2VUYWJTaXplKCl9LHRoaXMudXBkYXRlVGV4dD1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LHRoaXMudXBkYXRlRnVsbD1mdW5jdGlvbihlKXtlP3RoaXMuJHJlbmRlckNoYW5nZXModGhpcy5DSEFOR0VfRlVMTCwhMCk6dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKX0sdGhpcy51cGRhdGVGb250U2l6ZT1mdW5jdGlvbigpe3RoaXMuJHRleHRMYXllci5jaGVja0ZvclNpemVDaGFuZ2VzKCl9LHRoaXMuJGNoYW5nZXM9MCx0aGlzLiR1cGRhdGVTaXplQXN5bmM9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnBlbmRpbmc/dGhpcy4kc2l6ZS4kZGlydHk9ITA6dGhpcy5vblJlc2l6ZSgpfSx0aGlzLm9uUmVzaXplPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHRoaXMucmVzaXppbmc+MilyZXR1cm47dGhpcy5yZXNpemluZz4wP3RoaXMucmVzaXppbmcrKzp0aGlzLnJlc2l6aW5nPWU/MTowO3ZhciBpPXRoaXMuY29udGFpbmVyO3J8fChyPWkuY2xpZW50SGVpZ2h0fHxpLnNjcm9sbEhlaWdodCksbnx8KG49aS5jbGllbnRXaWR0aHx8aS5zY3JvbGxXaWR0aCk7dmFyIHM9dGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZShlLHQsbixyKTtpZighdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodHx8IW4mJiFyKXJldHVybiB0aGlzLnJlc2l6aW5nPTA7ZSYmKHRoaXMuJGd1dHRlckxheWVyLiRwYWRkaW5nPW51bGwpLGU/dGhpcy4kcmVuZGVyQ2hhbmdlcyhzfHRoaXMuJGNoYW5nZXMsITApOnRoaXMuJGxvb3Auc2NoZWR1bGUoc3x0aGlzLiRjaGFuZ2VzKSx0aGlzLnJlc2l6aW5nJiYodGhpcy5yZXNpemluZz0wKSx0aGlzLnNjcm9sbEJhclYuc2Nyb2xsTGVmdD10aGlzLnNjcm9sbEJhclYuc2Nyb2xsVG9wPW51bGx9LHRoaXMuJHVwZGF0ZUNhY2hlZFNpemU9ZnVuY3Rpb24oZSx0LG4scil7ci09dGhpcy4kZXh0cmFIZWlnaHR8fDA7dmFyIHM9MCxvPXRoaXMuJHNpemUsdT17d2lkdGg6by53aWR0aCxoZWlnaHQ6by5oZWlnaHQsc2Nyb2xsZXJIZWlnaHQ6by5zY3JvbGxlckhlaWdodCxzY3JvbGxlcldpZHRoOm8uc2Nyb2xsZXJXaWR0aH07ciYmKGV8fG8uaGVpZ2h0IT1yKSYmKG8uaGVpZ2h0PXIsc3w9dGhpcy5DSEFOR0VfU0laRSxvLnNjcm9sbGVySGVpZ2h0PW8uaGVpZ2h0LHRoaXMuJGhvcml6U2Nyb2xsJiYoby5zY3JvbGxlckhlaWdodC09dGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKSx0aGlzLnNjcm9sbEJhclYuZWxlbWVudC5zdHlsZS5ib3R0b209dGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKyJweCIsc3w9dGhpcy5DSEFOR0VfU0NST0xMKTtpZihuJiYoZXx8by53aWR0aCE9bikpe3N8PXRoaXMuQ0hBTkdFX1NJWkUsby53aWR0aD1uLHQ9PW51bGwmJih0PXRoaXMuJHNob3dHdXR0ZXI/dGhpcy4kZ3V0dGVyLm9mZnNldFdpZHRoOjApLHRoaXMuZ3V0dGVyV2lkdGg9dCxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsQmFySC5lbGVtZW50LnN0eWxlLCJsZWZ0Iix0KyJweCIpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwibGVmdCIsdCt0aGlzLm1hcmdpbi5sZWZ0KyJweCIpLG8uc2Nyb2xsZXJXaWR0aD1NYXRoLm1heCgwLG4tdC10aGlzLnNjcm9sbEJhclYuZ2V0V2lkdGgoKS10aGlzLm1hcmdpbi5oKSxpLnNldFN0eWxlKHRoaXMuJGd1dHRlci5zdHlsZSwibGVmdCIsdGhpcy5tYXJnaW4ubGVmdCsicHgiKTt2YXIgYT10aGlzLnNjcm9sbEJhclYuZ2V0V2lkdGgoKSsicHgiO2kuc2V0U3R5bGUodGhpcy5zY3JvbGxCYXJILmVsZW1lbnQuc3R5bGUsInJpZ2h0IixhKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsInJpZ2h0IixhKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImJvdHRvbSIsdGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKTtpZih0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLmFkanVzdFdyYXBMaW1pdCgpfHxlKXN8PXRoaXMuQ0hBTkdFX0ZVTEx9cmV0dXJuIG8uJGRpcnR5PSFufHwhcixzJiZ0aGlzLl9zaWduYWwoInJlc2l6ZSIsdSksc30sdGhpcy5vbkd1dHRlclJlc2l6ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRzaG93R3V0dGVyP2U6MDt0IT10aGlzLmd1dHRlcldpZHRoJiYodGhpcy4kY2hhbmdlc3w9dGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0LHRoaXMuJHNpemUud2lkdGgsdGhpcy4kc2l6ZS5oZWlnaHQpKSx0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKT90aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpOnRoaXMuJHNpemUuJGRpcnR5P3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk6dGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCl9LHRoaXMuYWRqdXN0V3JhcExpbWl0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLXRoaXMuJHBhZGRpbmcqMix0PU1hdGguZmxvb3IoZS90aGlzLmNoYXJhY3RlcldpZHRoKTtyZXR1cm4gdGhpcy5zZXNzaW9uLmFkanVzdFdyYXBMaW1pdCh0LHRoaXMuJHNob3dQcmludE1hcmdpbiYmdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW4pfSx0aGlzLnNldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJhbmltYXRlZFNjcm9sbCIsZSl9LHRoaXMuZ2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYW5pbWF0ZWRTY3JvbGx9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNob3dJbnZpc2libGVzIixlKSx0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnNldFNob3dJbnZpc2libGVzKGUpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93SW52aXNpYmxlcyIpfSx0aGlzLmdldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImRpc3BsYXlJbmRlbnRHdWlkZXMiKX0sdGhpcy5zZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJkaXNwbGF5SW5kZW50R3VpZGVzIixlKX0sdGhpcy5zZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNob3dQcmludE1hcmdpbiIsZSl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93UHJpbnRNYXJnaW4iKX0sdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigicHJpbnRNYXJnaW5Db2x1bW4iLGUpfSx0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJwcmludE1hcmdpbkNvbHVtbiIpfSx0aGlzLmdldFNob3dHdXR0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dHdXR0ZXIiKX0sdGhpcy5zZXRTaG93R3V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNldE9wdGlvbigic2hvd0d1dHRlciIsZSl9LHRoaXMuZ2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiKX0sdGhpcy5zZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIsZSl9LHRoaXMuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIpfSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbj1mdW5jdGlvbigpe2lmKCF0aGlzLiRzaG93UHJpbnRNYXJnaW4mJiF0aGlzLiRwcmludE1hcmdpbkVsKXJldHVybjtpZighdGhpcy4kcHJpbnRNYXJnaW5FbCl7dmFyIGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9wcmludC1tYXJnaW4tbGF5ZXIiLHRoaXMuJHByaW50TWFyZ2luRWw9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRwcmludE1hcmdpbkVsLmNsYXNzTmFtZT0iYWNlX3ByaW50LW1hcmdpbiIsZS5hcHBlbmRDaGlsZCh0aGlzLiRwcmludE1hcmdpbkVsKSx0aGlzLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpfXZhciB0PXRoaXMuJHByaW50TWFyZ2luRWwuc3R5bGU7dC5sZWZ0PU1hdGgucm91bmQodGhpcy5jaGFyYWN0ZXJXaWR0aCp0aGlzLiRwcmludE1hcmdpbkNvbHVtbit0aGlzLiRwYWRkaW5nKSsicHgiLHQudmlzaWJpbGl0eT10aGlzLiRzaG93UHJpbnRNYXJnaW4/InZpc2libGUiOiJoaWRkZW4iLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLiR3cmFwPT0tMSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKX0sdGhpcy5nZXRDb250YWluZXJFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyfSx0aGlzLmdldE1vdXNlRXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxlcn0sdGhpcy5nZXRUZXh0QXJlYUNvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3I9ZnVuY3Rpb24oKXtpZih0aGlzLiRpc01vdXNlUHJlc3NlZClyZXR1cm47dmFyIGU9dGhpcy50ZXh0YXJlYS5zdHlsZSx0PXRoaXMuJGNvbXBvc2l0aW9uO2lmKCF0aGlzLiRrZWVwVGV4dEFyZWFBdEN1cnNvciYmIXQpe2kudHJhbnNsYXRlKHRoaXMudGV4dGFyZWEsLTEwMCwwKTtyZXR1cm59dmFyIG49dGhpcy4kY3Vyc29yTGF5ZXIuJHBpeGVsUG9zO2lmKCFuKXJldHVybjt0JiZ0Lm1hcmtlclJhbmdlJiYobj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHQubWFya2VyUmFuZ2Uuc3RhcnQsITApKTt2YXIgcj10aGlzLmxheWVyQ29uZmlnLHM9bi50b3Asbz1uLmxlZnQ7cy09ci5vZmZzZXQ7dmFyIHU9dCYmdC51c2VUZXh0YXJlYUZvcklNRT90aGlzLmxpbmVIZWlnaHQ6Zz8wOjE7aWYoczwwfHxzPnIuaGVpZ2h0LXUpe2kudHJhbnNsYXRlKHRoaXMudGV4dGFyZWEsMCwwKTtyZXR1cm59dmFyIGE9MSxmPXRoaXMuJHNpemUuaGVpZ2h0LXU7aWYoIXQpcys9dGhpcy5saW5lSGVpZ2h0O2Vsc2UgaWYodC51c2VUZXh0YXJlYUZvcklNRSl7dmFyIGw9dGhpcy50ZXh0YXJlYS52YWx1ZTthPXRoaXMuY2hhcmFjdGVyV2lkdGgqdGhpcy5zZXNzaW9uLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChsKVswXSx1Kz0yfWVsc2Ugcys9dGhpcy5saW5lSGVpZ2h0KzI7by09dGhpcy5zY3JvbGxMZWZ0LG8+dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWEmJihvPXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1hKSxvKz10aGlzLmd1dHRlcldpZHRoK3RoaXMubWFyZ2luLmxlZnQsaS5zZXRTdHlsZShlLCJoZWlnaHQiLHUrInB4IiksaS5zZXRTdHlsZShlLCJ3aWR0aCIsYSsicHgiKSxpLnRyYW5zbGF0ZSh0aGlzLnRleHRhcmVhLE1hdGgubWluKG8sdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWEpLE1hdGgubWluKHMsZikpfSx0aGlzLmdldEZpcnN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93fSx0aGlzLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3crKHRoaXMubGF5ZXJDb25maWcub2Zmc2V0PT09MD8wOjEpfSx0aGlzLmdldExhc3RGdWxseVZpc2libGVSb3c9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxheWVyQ29uZmlnLHQ9ZS5sYXN0Um93LG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3codCwwKSplLmxpbmVIZWlnaHQ7cmV0dXJuIG4tdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpPmUuaGVpZ2h0LWUubGluZUhlaWdodD90LTE6dH0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3d9LHRoaXMuJHBhZGRpbmc9bnVsbCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lLHRoaXMuJHRleHRMYXllci5zZXRQYWRkaW5nKGUpLHRoaXMuJGN1cnNvckxheWVyLnNldFBhZGRpbmcoZSksdGhpcy4kbWFya2VyRnJvbnQuc2V0UGFkZGluZyhlKSx0aGlzLiRtYXJrZXJCYWNrLnNldFBhZGRpbmcoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSx0aGlzLnNldFNjcm9sbE1hcmdpbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLnNjcm9sbE1hcmdpbjtpLnRvcD1lfDAsaS5ib3R0b209dHwwLGkucmlnaHQ9cnwwLGkubGVmdD1ufDAsaS52PWkudG9wK2kuYm90dG9tLGkuaD1pLmxlZnQraS5yaWdodCxpLnRvcCYmdGhpcy5zY3JvbGxUb3A8PTAmJnRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCgtaS50b3ApLHRoaXMudXBkYXRlRnVsbCgpfSx0aGlzLnNldE1hcmdpbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLm1hcmdpbjtpLnRvcD1lfDAsaS5ib3R0b209dHwwLGkucmlnaHQ9cnwwLGkubGVmdD1ufDAsaS52PWkudG9wK2kuYm90dG9tLGkuaD1pLmxlZnQraS5yaWdodCx0aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHRoaXMuZ3V0dGVyV2lkdGgsdGhpcy4kc2l6ZS53aWR0aCx0aGlzLiRzaXplLmhlaWdodCksdGhpcy51cGRhdGVGdWxsKCl9LHRoaXMuZ2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaFNjcm9sbEJhckFsd2F5c1Zpc2libGV9LHRoaXMuc2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhTY3JvbGxCYXJBbHdheXNWaXNpYmxlIixlKX0sdGhpcy5nZXRWU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZX0sdGhpcy5zZXRWU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidlNjcm9sbEJhckFsd2F5c1Zpc2libGUiLGUpfSx0aGlzLiR1cGRhdGVTY3JvbGxCYXJWPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQsdD10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0OyF0aGlzLiRtYXhMaW5lcyYmdGhpcy4kc2Nyb2xsUGFzdEVuZCYmKGUtPSh0LXRoaXMubGluZUhlaWdodCkqdGhpcy4kc2Nyb2xsUGFzdEVuZCx0aGlzLnNjcm9sbFRvcD5lLXQmJihlPXRoaXMuc2Nyb2xsVG9wK3QsdGhpcy5zY3JvbGxCYXJWLnNjcm9sbFRvcD1udWxsKSksdGhpcy5zY3JvbGxCYXJWLnNldFNjcm9sbEhlaWdodChlK3RoaXMuc2Nyb2xsTWFyZ2luLnYpLHRoaXMuc2Nyb2xsQmFyVi5zZXRTY3JvbGxUb3AodGhpcy5zY3JvbGxUb3ArdGhpcy5zY3JvbGxNYXJnaW4udG9wKX0sdGhpcy4kdXBkYXRlU2Nyb2xsQmFySD1mdW5jdGlvbigpe3RoaXMuc2Nyb2xsQmFySC5zZXRTY3JvbGxXaWR0aCh0aGlzLmxheWVyQ29uZmlnLndpZHRoKzIqdGhpcy4kcGFkZGluZyt0aGlzLnNjcm9sbE1hcmdpbi5oKSx0aGlzLnNjcm9sbEJhckguc2V0U2Nyb2xsTGVmdCh0aGlzLnNjcm9sbExlZnQrdGhpcy5zY3JvbGxNYXJnaW4ubGVmdCl9LHRoaXMuJGZyb3plbj0hMSx0aGlzLmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMuJGZyb3plbj0hMH0sdGhpcy51bmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMuJGZyb3plbj0hMX0sdGhpcy4kcmVuZGVyQ2hhbmdlcz1mdW5jdGlvbihlLHQpe3RoaXMuJGNoYW5nZXMmJihlfD10aGlzLiRjaGFuZ2VzLHRoaXMuJGNoYW5nZXM9MCk7aWYoIXRoaXMuc2Vzc2lvbnx8IXRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRofHx0aGlzLiRmcm96ZW58fCFlJiYhdCl7dGhpcy4kY2hhbmdlc3w9ZTtyZXR1cm59aWYodGhpcy4kc2l6ZS4kZGlydHkpcmV0dXJuIHRoaXMuJGNoYW5nZXN8PWUsdGhpcy5vblJlc2l6ZSghMCk7dGhpcy5saW5lSGVpZ2h0fHx0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpLHRoaXMuX3NpZ25hbCgiYmVmb3JlUmVuZGVyIiksdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyJiZ0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnVwZGF0ZUNoYXJhY3RlcldpZHRocyh0aGlzLiRmb250TWV0cmljcyk7dmFyIG49dGhpcy5sYXllckNvbmZpZztpZihlJnRoaXMuQ0hBTkdFX0ZVTEx8fGUmdGhpcy5DSEFOR0VfU0laRXx8ZSZ0aGlzLkNIQU5HRV9URVhUfHxlJnRoaXMuQ0hBTkdFX0xJTkVTfHxlJnRoaXMuQ0hBTkdFX1NDUk9MTHx8ZSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCl7ZXw9dGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCl8dGhpcy4kbG9vcC5jbGVhcigpO2lmKG4uZmlyc3RSb3chPXRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cmJm4uZmlyc3RSb3dTY3JlZW49PXRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3dTY3JlZW4pe3ZhciByPXRoaXMuc2Nyb2xsVG9wKyhuLmZpcnN0Um93LXRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cpKnRoaXMubGluZUhlaWdodDtyPjAmJih0aGlzLnNjcm9sbFRvcD1yLGV8PXRoaXMuQ0hBTkdFX1NDUk9MTCxlfD10aGlzLiRjb21wdXRlTGF5ZXJDb25maWcoKXx0aGlzLiRsb29wLmNsZWFyKCkpfW49dGhpcy5sYXllckNvbmZpZyx0aGlzLiR1cGRhdGVTY3JvbGxCYXJWKCksZSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCYmdGhpcy4kdXBkYXRlU2Nyb2xsQmFySCgpLGkudHJhbnNsYXRlKHRoaXMuY29udGVudCwtdGhpcy5zY3JvbGxMZWZ0LC1uLm9mZnNldCk7dmFyIHM9bi53aWR0aCsyKnRoaXMuJHBhZGRpbmcrInB4IixvPW4ubWluSGVpZ2h0KyJweCI7aS5zZXRTdHlsZSh0aGlzLmNvbnRlbnQuc3R5bGUsIndpZHRoIixzKSxpLnNldFN0eWxlKHRoaXMuY29udGVudC5zdHlsZSwiaGVpZ2h0IixvKX1lJnRoaXMuQ0hBTkdFX0hfU0NST0xMJiYoaS50cmFuc2xhdGUodGhpcy5jb250ZW50LC10aGlzLnNjcm9sbExlZnQsLW4ub2Zmc2V0KSx0aGlzLnNjcm9sbGVyLmNsYXNzTmFtZT10aGlzLnNjcm9sbExlZnQ8PTA/ImFjZV9zY3JvbGxlciI6ImFjZV9zY3JvbGxlciBhY2Vfc2Nyb2xsLWxlZnQiKTtpZihlJnRoaXMuQ0hBTkdFX0ZVTEwpe3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsLHRoaXMuJHRleHRMYXllci51cGRhdGUobiksdGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKG4pLHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZShuKSx0aGlzLiRjdXJzb3JMYXllci51cGRhdGUobiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIik7cmV0dXJufWlmKGUmdGhpcy5DSEFOR0VfU0NST0xMKXt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbCxlJnRoaXMuQ0hBTkdFX1RFWFR8fGUmdGhpcy5DSEFOR0VfTElORVM/dGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKTp0aGlzLiR0ZXh0TGF5ZXIuc2Nyb2xsTGluZXMobiksdGhpcy4kc2hvd0d1dHRlciYmKGUmdGhpcy5DSEFOR0VfR1VUVEVSfHxlJnRoaXMuQ0hBTkdFX0xJTkVTP3RoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKTp0aGlzLiRndXR0ZXJMYXllci5zY3JvbGxMaW5lcyhuKSksdGhpcy4kbWFya2VyQmFjay51cGRhdGUobiksdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKG4pLHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKTtyZXR1cm59ZSZ0aGlzLkNIQU5HRV9URVhUPyh0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbCx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pLHRoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKSk6ZSZ0aGlzLkNIQU5HRV9MSU5FUz8odGhpcy4kdXBkYXRlTGluZXMoKXx8ZSZ0aGlzLkNIQU5HRV9HVVRURVImJnRoaXMuJHNob3dHdXR0ZXIpJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobik6ZSZ0aGlzLkNIQU5HRV9URVhUfHxlJnRoaXMuQ0hBTkdFX0dVVFRFUj90aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobik6ZSZ0aGlzLkNIQU5HRV9DVVJTT1ImJnRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUmJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZUxpbmVIaWdobGlnaHQobiksZSZ0aGlzLkNIQU5HRV9DVVJTT1ImJih0aGlzLiRjdXJzb3JMYXllci51cGRhdGUobiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSksZSYodGhpcy5DSEFOR0VfTUFSS0VSfHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCkmJnRoaXMuJG1hcmtlckZyb250LnVwZGF0ZShuKSxlJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spJiZ0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZShuKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIil9LHRoaXMuJGF1dG9zaXplPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpKnRoaXMubGluZUhlaWdodCx0PXRoaXMuJG1heExpbmVzKnRoaXMubGluZUhlaWdodCxuPU1hdGgubWluKHQsTWF0aC5tYXgoKHRoaXMuJG1pbkxpbmVzfHwxKSp0aGlzLmxpbmVIZWlnaHQsZSkpK3RoaXMuc2Nyb2xsTWFyZ2luLnYrKHRoaXMuJGV4dHJhSGVpZ2h0fHwwKTt0aGlzLiRob3JpelNjcm9sbCYmKG4rPXRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSksdGhpcy4kbWF4UGl4ZWxIZWlnaHQmJm4+dGhpcy4kbWF4UGl4ZWxIZWlnaHQmJihuPXRoaXMuJG1heFBpeGVsSGVpZ2h0KTt2YXIgcj1uPD0yKnRoaXMubGluZUhlaWdodCxpPSFyJiZlPnQ7aWYobiE9dGhpcy5kZXNpcmVkSGVpZ2h0fHx0aGlzLiRzaXplLmhlaWdodCE9dGhpcy5kZXNpcmVkSGVpZ2h0fHxpIT10aGlzLiR2U2Nyb2xsKXtpIT10aGlzLiR2U2Nyb2xsJiYodGhpcy4kdlNjcm9sbD1pLHRoaXMuc2Nyb2xsQmFyVi5zZXRWaXNpYmxlKGkpKTt2YXIgcz10aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aDt0aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9bisicHgiLHRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdGhpcy4kZ3V0dGVyV2lkdGgscyxuKSx0aGlzLmRlc2lyZWRIZWlnaHQ9bix0aGlzLl9zaWduYWwoImF1dG9zaXplIil9fSx0aGlzLiRjb21wdXRlTGF5ZXJDb25maWc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzLiRzaXplLG49dC5oZWlnaHQ8PTIqdGhpcy5saW5lSGVpZ2h0LHI9dGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpLGk9cip0aGlzLmxpbmVIZWlnaHQscz10aGlzLiRnZXRMb25nZXN0TGluZSgpLG89IW4mJih0aGlzLiRoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8dC5zY3JvbGxlcldpZHRoLXMtMip0aGlzLiRwYWRkaW5nPDApLHU9dGhpcy4kaG9yaXpTY3JvbGwhPT1vO3UmJih0aGlzLiRob3JpelNjcm9sbD1vLHRoaXMuc2Nyb2xsQmFySC5zZXRWaXNpYmxlKG8pKTt2YXIgYT10aGlzLiR2U2Nyb2xsO3RoaXMuJG1heExpbmVzJiZ0aGlzLmxpbmVIZWlnaHQ+MSYmdGhpcy4kYXV0b3NpemUoKTt2YXIgZj10LnNjcm9sbGVySGVpZ2h0K3RoaXMubGluZUhlaWdodCxsPSF0aGlzLiRtYXhMaW5lcyYmdGhpcy4kc2Nyb2xsUGFzdEVuZD8odC5zY3JvbGxlckhlaWdodC10aGlzLmxpbmVIZWlnaHQpKnRoaXMuJHNjcm9sbFBhc3RFbmQ6MDtpKz1sO3ZhciBjPXRoaXMuc2Nyb2xsTWFyZ2luO3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoTWF0aC5tYXgoLWMudG9wLE1hdGgubWluKHRoaXMuc2Nyb2xsVG9wLGktdC5zY3JvbGxlckhlaWdodCtjLmJvdHRvbSkpKSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChNYXRoLm1heCgtYy5sZWZ0LE1hdGgubWluKHRoaXMuc2Nyb2xsTGVmdCxzKzIqdGhpcy4kcGFkZGluZy10LnNjcm9sbGVyV2lkdGgrYy5yaWdodCkpKTt2YXIgaD0hbiYmKHRoaXMuJHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHx0LnNjcm9sbGVySGVpZ2h0LWkrbDwwfHx0aGlzLnNjcm9sbFRvcD5jLnRvcCkscD1hIT09aDtwJiYodGhpcy4kdlNjcm9sbD1oLHRoaXMuc2Nyb2xsQmFyVi5zZXRWaXNpYmxlKGgpKTt2YXIgZD10aGlzLnNjcm9sbFRvcCV0aGlzLmxpbmVIZWlnaHQsdj1NYXRoLmNlaWwoZi90aGlzLmxpbmVIZWlnaHQpLTEsbT1NYXRoLm1heCgwLE1hdGgucm91bmQoKHRoaXMuc2Nyb2xsVG9wLWQpL3RoaXMubGluZUhlaWdodCkpLGc9bSt2LHksYix3PXRoaXMubGluZUhlaWdodDttPWUuc2NyZWVuVG9Eb2N1bWVudFJvdyhtLDApO3ZhciBFPWUuZ2V0Rm9sZExpbmUobSk7RSYmKG09RS5zdGFydC5yb3cpLHk9ZS5kb2N1bWVudFRvU2NyZWVuUm93KG0sMCksYj1lLmdldFJvd0xlbmd0aChtKSp3LGc9TWF0aC5taW4oZS5zY3JlZW5Ub0RvY3VtZW50Um93KGcsMCksZS5nZXRMZW5ndGgoKS0xKSxmPXQuc2Nyb2xsZXJIZWlnaHQrZS5nZXRSb3dMZW5ndGgoZykqdytiLGQ9dGhpcy5zY3JvbGxUb3AteSp3O3ZhciBTPTA7aWYodGhpcy5sYXllckNvbmZpZy53aWR0aCE9c3x8dSlTPXRoaXMuQ0hBTkdFX0hfU0NST0xMO2lmKHV8fHApU3w9dGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0aGlzLmd1dHRlcldpZHRoLHQud2lkdGgsdC5oZWlnaHQpLHRoaXMuX3NpZ25hbCgic2Nyb2xsYmFyVmlzaWJpbGl0eUNoYW5nZWQiKSxwJiYocz10aGlzLiRnZXRMb25nZXN0TGluZSgpKTtyZXR1cm4gdGhpcy5sYXllckNvbmZpZz17d2lkdGg6cyxwYWRkaW5nOnRoaXMuJHBhZGRpbmcsZmlyc3RSb3c6bSxmaXJzdFJvd1NjcmVlbjp5LGxhc3RSb3c6ZyxsaW5lSGVpZ2h0OncsY2hhcmFjdGVyV2lkdGg6dGhpcy5jaGFyYWN0ZXJXaWR0aCxtaW5IZWlnaHQ6ZixtYXhIZWlnaHQ6aSxvZmZzZXQ6ZCxndXR0ZXJPZmZzZXQ6dz9NYXRoLm1heCgwLE1hdGguY2VpbCgoZCt0LmhlaWdodC10LnNjcm9sbGVySGVpZ2h0KS93KSk6MCxoZWlnaHQ6dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodH0sdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlciYmdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5zZXRDb250ZW50V2lkdGgocy10aGlzLiRwYWRkaW5nKSxTfSx0aGlzLiR1cGRhdGVMaW5lcz1mdW5jdGlvbigpe2lmKCF0aGlzLiRjaGFuZ2VkTGluZXMpcmV0dXJuO3ZhciBlPXRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdyx0PXRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93O3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsO3ZhciBuPXRoaXMubGF5ZXJDb25maWc7aWYoZT5uLmxhc3RSb3crMSlyZXR1cm47aWYodDxuLmZpcnN0Um93KXJldHVybjtpZih0PT09SW5maW5pdHkpe3RoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKSx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pO3JldHVybn1yZXR1cm4gdGhpcy4kdGV4dExheWVyLnVwZGF0ZUxpbmVzKG4sZSx0KSwhMH0sdGhpcy4kZ2V0TG9uZ2VzdExpbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U2NyZWVuV2lkdGgoKTtyZXR1cm4gdGhpcy5zaG93SW52aXNpYmxlcyYmIXRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGUmJihlKz0xKSx0aGlzLiR0ZXh0TGF5ZXImJmU+dGhpcy4kdGV4dExheWVyLk1BWF9MSU5FX0xFTkdUSCYmKGU9dGhpcy4kdGV4dExheWVyLk1BWF9MSU5FX0xFTkdUSCszMCksTWF0aC5tYXgodGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLTIqdGhpcy4kcGFkZGluZyxNYXRoLnJvdW5kKGUqdGhpcy5jaGFyYWN0ZXJXaWR0aCkpfSx0aGlzLnVwZGF0ZUZyb250TWFya2Vycz1mdW5jdGlvbigpe3RoaXMuJG1hcmtlckZyb250LnNldE1hcmtlcnModGhpcy5zZXNzaW9uLmdldE1hcmtlcnMoITApKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCl9LHRoaXMudXBkYXRlQmFja01hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLiRtYXJrZXJCYWNrLnNldE1hcmtlcnModGhpcy5zZXNzaW9uLmdldE1hcmtlcnMoKSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSyl9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGd1dHRlckxheWVyLmFkZEd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZ3V0dGVyTGF5ZXIucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnVwZGF0ZUJyZWFrcG9pbnRzPWZ1bmN0aW9uKGUpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci5zZXRBbm5vdGF0aW9ucyhlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMudXBkYXRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9DVVJTT1IpfSx0aGlzLmhpZGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5oaWRlQ3Vyc29yKCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckxheWVyLnNob3dDdXJzb3IoKX0sdGhpcy5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldz1mdW5jdGlvbihlLHQsbil7dGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldyhlLG4pLHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcodCxuKX0sdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldz1mdW5jdGlvbihlLHQsbil7aWYodGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodD09PTApcmV0dXJuO3ZhciByPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oZSksaT1yLmxlZnQscz1yLnRvcCxvPW4mJm4udG9wfHwwLHU9biYmbi5ib3R0b218fDAsYT10aGlzLiRzY3JvbGxBbmltYXRpb24/dGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpOnRoaXMuc2Nyb2xsVG9wO2Erbz5zPyh0JiZhK28+cyt0aGlzLmxpbmVIZWlnaHQmJihzLT10KnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpLHM9PT0wJiYocz0tdGhpcy5zY3JvbGxNYXJnaW4udG9wKSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMpKTphK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdTxzK3RoaXMubGluZUhlaWdodCYmKHQmJmErdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC11PHMtdGhpcy5saW5lSGVpZ2h0JiYocys9dCp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMrdGhpcy5saW5lSGVpZ2h0K3UtdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkpO3ZhciBmPXRoaXMuc2Nyb2xsTGVmdDtmPmk/KGk8dGhpcy4kcGFkZGluZysyKnRoaXMubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgmJihpPS10aGlzLnNjcm9sbE1hcmdpbi5sZWZ0KSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChpKSk6Zit0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGg8aSt0aGlzLmNoYXJhY3RlcldpZHRoP3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KE1hdGgucm91bmQoaSt0aGlzLmNoYXJhY3RlcldpZHRoLXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCkpOmY8PXRoaXMuJHBhZGRpbmcmJmktZjx0aGlzLmNoYXJhY3RlcldpZHRoJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCgwKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKX0sdGhpcy5nZXRTY3JvbGxUb3BSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxUb3AvdGhpcy5saW5lSGVpZ2h0fSx0aGlzLmdldFNjcm9sbEJvdHRvbVJvdz1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCgwLE1hdGguZmxvb3IoKHRoaXMuc2Nyb2xsVG9wK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpL3RoaXMubGluZUhlaWdodCktMSl9LHRoaXMuc2Nyb2xsVG9Sb3c9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChlKnRoaXMubGluZUhlaWdodCl9LHRoaXMuYWxpZ25DdXJzb3I9ZnVuY3Rpb24oZSx0KXt0eXBlb2YgZT09Im51bWJlciImJihlPXtyb3c6ZSxjb2x1bW46MH0pO3ZhciBuPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oZSkscj10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXRoaXMubGluZUhlaWdodCxpPW4udG9wLXIqKHR8fDApO3JldHVybiB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGkpLGl9LHRoaXMuU1RFUFM9OCx0aGlzLiRjYWxjU3RlcHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9dGhpcy5TVEVQUyxpPVtdLHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuKihNYXRoLnBvdyhlLTEsMykrMSkrdH07Zm9yKG49MDtuPHI7KytuKWkucHVzaChzKG4vdGhpcy5TVEVQUyxlLHQtZSkpO3JldHVybiBpfSx0aGlzLnNjcm9sbFRvTGluZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6ZSxjb2x1bW46MH0pLHM9aS50b3A7dCYmKHMtPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQvMik7dmFyIG89dGhpcy5zY3JvbGxUb3A7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChzKSxuIT09ITEmJnRoaXMuYW5pbWF0ZVNjcm9sbGluZyhvLHIpfSx0aGlzLmFuaW1hdGVTY3JvbGxpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNjcm9sbFRvcDtpZighdGhpcy4kYW5pbWF0ZWRTY3JvbGwpcmV0dXJuO3ZhciByPXRoaXM7aWYoZT09bilyZXR1cm47aWYodGhpcy4kc2Nyb2xsQW5pbWF0aW9uKXt2YXIgaT10aGlzLiRzY3JvbGxBbmltYXRpb24uc3RlcHM7aWYoaS5sZW5ndGgpe2U9aVswXTtpZihlPT1uKXJldHVybn19dmFyIHM9ci4kY2FsY1N0ZXBzKGUsbik7dGhpcy4kc2Nyb2xsQW5pbWF0aW9uPXtmcm9tOmUsdG86bixzdGVwczpzfSxjbGVhckludGVydmFsKHRoaXMuJHRpbWVyKSxyLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMuc2hpZnQoKSksci5zZXNzaW9uLiRzY3JvbGxUb3A9bix0aGlzLiR0aW1lcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3MubGVuZ3RoPyhyLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMuc2hpZnQoKSksci5zZXNzaW9uLiRzY3JvbGxUb3A9bik6biE9bnVsbD8oci5zZXNzaW9uLiRzY3JvbGxUb3A9LTEsci5zZXNzaW9uLnNldFNjcm9sbFRvcChuKSxuPW51bGwpOihyLiR0aW1lcj1jbGVhckludGVydmFsKHIuJHRpbWVyKSxyLiRzY3JvbGxBbmltYXRpb249bnVsbCx0JiZ0KCkpfSwxMCl9LHRoaXMuc2Nyb2xsVG9ZPWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsVG9wIT09ZSYmKHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKSx0aGlzLnNjcm9sbFRvcD1lKX0sdGhpcy5zY3JvbGxUb1g9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxMZWZ0IT09ZSYmKHRoaXMuc2Nyb2xsTGVmdD1lKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0hfU0NST0xMKX0sdGhpcy5zY3JvbGxUbz1mdW5jdGlvbihlLHQpe3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodCl9LHRoaXMuc2Nyb2xsQnk9ZnVuY3Rpb24oZSx0KXt0JiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSt0KSxlJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpK2UpfSx0aGlzLmlzU2Nyb2xsYWJsZUJ5PWZ1bmN0aW9uKGUsdCl7aWYodDwwJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk+PTEtdGhpcy5zY3JvbGxNYXJnaW4udG9wKXJldHVybiEwO2lmKHQ+MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQ8LTErdGhpcy5zY3JvbGxNYXJnaW4uYm90dG9tKXJldHVybiEwO2lmKGU8MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKT49MS10aGlzLnNjcm9sbE1hcmdpbi5sZWZ0KXJldHVybiEwO2lmKGU+MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSt0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtdGhpcy5sYXllckNvbmZpZy53aWR0aDwtMSt0aGlzLnNjcm9sbE1hcmdpbi5yaWdodClyZXR1cm4hMH0sdGhpcy5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZih0aGlzLiRoYXNDc3NUcmFuc2Zvcm1zKXtuPXt0b3A6MCxsZWZ0OjB9O3ZhciByPXRoaXMuJGZvbnRNZXRyaWNzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKFtlLHRdKTtlPXJbMV0tdGhpcy5ndXR0ZXJXaWR0aC10aGlzLm1hcmdpbi5sZWZ0LHQ9clswXX1lbHNlIG49dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgaT1lK3RoaXMuc2Nyb2xsTGVmdC1uLmxlZnQtdGhpcy4kcGFkZGluZyxzPWkvdGhpcy5jaGFyYWN0ZXJXaWR0aCxvPU1hdGguZmxvb3IoKHQrdGhpcy5zY3JvbGxUb3Atbi50b3ApL3RoaXMubGluZUhlaWdodCksdT10aGlzLiRibG9ja0N1cnNvcj9NYXRoLmZsb29yKHMpOk1hdGgucm91bmQocyk7cmV0dXJue3JvdzpvLGNvbHVtbjp1LHNpZGU6cy11PjA/MTotMSxvZmZzZXRYOml9fSx0aGlzLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodGhpcy4kaGFzQ3NzVHJhbnNmb3Jtcyl7bj17dG9wOjAsbGVmdDowfTt2YXIgcj10aGlzLiRmb250TWV0cmljcy50cmFuc2Zvcm1Db29yZGluYXRlcyhbZSx0XSk7ZT1yWzFdLXRoaXMuZ3V0dGVyV2lkdGgtdGhpcy5tYXJnaW4ubGVmdCx0PXJbMF19ZWxzZSBuPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIGk9ZSt0aGlzLnNjcm9sbExlZnQtbi5sZWZ0LXRoaXMuJHBhZGRpbmcscz1pL3RoaXMuY2hhcmFjdGVyV2lkdGgsbz10aGlzLiRibG9ja0N1cnNvcj9NYXRoLmZsb29yKHMpOk1hdGgucm91bmQocyksdT1NYXRoLmZsb29yKCh0K3RoaXMuc2Nyb2xsVG9wLW4udG9wKS90aGlzLmxpbmVIZWlnaHQpO3JldHVybiB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHUsTWF0aC5tYXgobywwKSxpKX0sdGhpcy50ZXh0VG9TY3JlZW5Db29yZGluYXRlcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUsdCksaT10aGlzLiRwYWRkaW5nKyh0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyhyLnJvdyxlKT90aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFBvc0xlZnQoci5jb2x1bW4pOk1hdGgucm91bmQoci5jb2x1bW4qdGhpcy5jaGFyYWN0ZXJXaWR0aCkpLHM9ci5yb3cqdGhpcy5saW5lSGVpZ2h0O3JldHVybntwYWdlWDpuLmxlZnQraS10aGlzLnNjcm9sbExlZnQscGFnZVk6bi50b3Arcy10aGlzLnNjcm9sbFRvcH19LHRoaXMudmlzdWFsaXplRm9jdXM9ZnVuY3Rpb24oKXtpLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZm9jdXMiKX0sdGhpcy52aXN1YWxpemVCbHVyPWZ1bmN0aW9uKCl7aS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2ZvY3VzIil9LHRoaXMuc2hvd0NvbXBvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuJGNvbXBvc2l0aW9uPWUsZS5jc3NUZXh0fHwoZS5jc3NUZXh0PXRoaXMudGV4dGFyZWEuc3R5bGUuY3NzVGV4dCksZS51c2VUZXh0YXJlYUZvcklNRT10aGlzLiR1c2VUZXh0YXJlYUZvcklNRSx0aGlzLiR1c2VUZXh0YXJlYUZvcklNRT8oaS5hZGRDc3NDbGFzcyh0aGlzLnRleHRhcmVhLCJhY2VfY29tcG9zaXRpb24iKSx0aGlzLnRleHRhcmVhLnN0eWxlLmNzc1RleHQ9IiIsdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSx0aGlzLiRjdXJzb3JMYXllci5lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiKTplLm1hcmtlcklkPXRoaXMuc2Vzc2lvbi5hZGRNYXJrZXIoZS5tYXJrZXJSYW5nZSwiYWNlX2NvbXBvc2l0aW9uX21hcmtlciIsInRleHQiKX0sdGhpcy5zZXRDb21wb3NpdGlvblRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5jdXJzb3I7dGhpcy5hZGRUb2tlbihlLCJjb21wb3NpdGlvbl9wbGFjZWhvbGRlciIsdC5yb3csdC5jb2x1bW4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCl9LHRoaXMuaGlkZUNvbXBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGNvbXBvc2l0aW9uKXJldHVybjt0aGlzLiRjb21wb3NpdGlvbi5tYXJrZXJJZCYmdGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLiRjb21wb3NpdGlvbi5tYXJrZXJJZCksaS5yZW1vdmVDc3NDbGFzcyh0aGlzLnRleHRhcmVhLCJhY2VfY29tcG9zaXRpb24iKSx0aGlzLnRleHRhcmVhLnN0eWxlLmNzc1RleHQ9dGhpcy4kY29tcG9zaXRpb24uY3NzVGV4dCx0aGlzLiRjb21wb3NpdGlvbj1udWxsLHRoaXMuJGN1cnNvckxheWVyLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0iIn0sdGhpcy5hZGRUb2tlbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLnNlc3Npb247aS5iZ1Rva2VuaXplci5saW5lc1tuXT1udWxsO3ZhciBzPXt0eXBlOnQsdmFsdWU6ZX0sbz1pLmdldFRva2VucyhuKTtpZihyPT1udWxsKW8ucHVzaChzKTtlbHNle3ZhciB1PTA7Zm9yKHZhciBhPTA7YTxvLmxlbmd0aDthKyspe3ZhciBmPW9bYV07dSs9Zi52YWx1ZS5sZW5ndGg7aWYocjw9dSl7dmFyIGw9Zi52YWx1ZS5sZW5ndGgtKHUtciksYz1mLnZhbHVlLnNsaWNlKDAsbCksaD1mLnZhbHVlLnNsaWNlKGwpO28uc3BsaWNlKGEsMSx7dHlwZTpmLnR5cGUsdmFsdWU6Y30scyx7dHlwZTpmLnR5cGUsdmFsdWU6aH0pO2JyZWFrfX19dGhpcy51cGRhdGVMaW5lcyhuLG4pfSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbyhyKXtpZihuLiR0aGVtZUlkIT1lKXJldHVybiB0JiZ0KCk7aWYoIXJ8fCFyLmNzc0NsYXNzKXRocm93IG5ldyBFcnJvcigiY291bGRuJ3QgbG9hZCBtb2R1bGUgIitlKyIgb3IgaXQgZGlkbid0IGNhbGwgZGVmaW5lIik7ci4kaWQmJihuLiR0aGVtZUlkPXIuJGlkKSxpLmltcG9ydENzc1N0cmluZyhyLmNzc1RleHQsci5jc3NDbGFzcyxuLmNvbnRhaW5lciksbi50aGVtZSYmaS5yZW1vdmVDc3NDbGFzcyhuLmNvbnRhaW5lcixuLnRoZW1lLmNzc0NsYXNzKTt2YXIgcz0icGFkZGluZyJpbiByP3IucGFkZGluZzoicGFkZGluZyJpbihuLnRoZW1lfHx7fSk/NDpuLiRwYWRkaW5nO24uJHBhZGRpbmcmJnMhPW4uJHBhZGRpbmcmJm4uc2V0UGFkZGluZyhzKSxuLiR0aGVtZT1yLmNzc0NsYXNzLG4udGhlbWU9cixpLmFkZENzc0NsYXNzKG4uY29udGFpbmVyLHIuY3NzQ2xhc3MpLGkuc2V0Q3NzQ2xhc3Mobi5jb250YWluZXIsImFjZV9kYXJrIixyLmlzRGFyayksbi4kc2l6ZSYmKG4uJHNpemUud2lkdGg9MCxuLiR1cGRhdGVTaXplQXN5bmMoKSksbi5fZGlzcGF0Y2hFdmVudCgidGhlbWVMb2FkZWQiLHt0aGVtZTpyfSksdCYmdCgpfXZhciBuPXRoaXM7dGhpcy4kdGhlbWVJZD1lLG4uX2Rpc3BhdGNoRXZlbnQoInRoZW1lQ2hhbmdlIix7dGhlbWU6ZX0pO2lmKCFlfHx0eXBlb2YgZT09InN0cmluZyIpe3ZhciByPWV8fHRoaXMuJG9wdGlvbnMudGhlbWUuaW5pdGlhbFZhbHVlO3MubG9hZE1vZHVsZShbInRoZW1lIixyXSxvKX1lbHNlIG8oZSl9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGhlbWVJZH0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihlLHQpe2kuc2V0Q3NzQ2xhc3ModGhpcy5jb250YWluZXIsZSx0IT09ITEpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7aS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixlKX0sdGhpcy5zZXRDdXJzb3JTdHlsZT1mdW5jdGlvbihlKXtpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImN1cnNvciIsZSl9LHRoaXMuc2V0TW91c2VDdXJzb3I9ZnVuY3Rpb24oZSl7aS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJjdXJzb3IiLGUpfSx0aGlzLmF0dGFjaFRvU2hhZG93Um9vdD1mdW5jdGlvbigpe2kuaW1wb3J0Q3NzU3RyaW5nKHYsImFjZV9lZGl0b3IuY3NzIix0aGlzLmNvbnRhaW5lcil9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZnJlZXplKCksdGhpcy4kZm9udE1ldHJpY3MuZGVzdHJveSgpLHRoaXMuJGN1cnNvckxheWVyLmRlc3Ryb3koKX19KS5jYWxsKHkucHJvdG90eXBlKSxzLmRlZmluZU9wdGlvbnMoeS5wcm90b3R5cGUsInJlbmRlcmVyIix7YW5pbWF0ZWRTY3JvbGw6e2luaXRpYWxWYWx1ZTohMX0sc2hvd0ludmlzaWJsZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiR0ZXh0TGF5ZXIuc2V0U2hvd0ludmlzaWJsZXMoZSkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LGluaXRpYWxWYWx1ZTohMX0sc2hvd1ByaW50TWFyZ2luOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSxpbml0aWFsVmFsdWU6ITB9LHByaW50TWFyZ2luQ29sdW1uOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSxpbml0aWFsVmFsdWU6ODB9LHByaW50TWFyZ2luOntzZXQ6ZnVuY3Rpb24oZSl7dHlwZW9mIGU9PSJudW1iZXIiJiYodGhpcy4kcHJpbnRNYXJnaW5Db2x1bW49ZSksdGhpcy4kc2hvd1ByaW50TWFyZ2luPSEhZSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd1ByaW50TWFyZ2luJiZ0aGlzLiRwcmludE1hcmdpbkNvbHVtbn19LHNob3dHdXR0ZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXIuc3R5bGUuZGlzcGxheT1lPyJibG9jayI6Im5vbmUiLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy5vbkd1dHRlclJlc2l6ZSgpfSxpbml0aWFsVmFsdWU6ITB9LGZhZGVGb2xkV2lkZ2V0czp7c2V0OmZ1bmN0aW9uKGUpe2kuc2V0Q3NzQ2xhc3ModGhpcy4kZ3V0dGVyLCJhY2VfZmFkZS1mb2xkLXdpZGdldHMiLGUpfSxpbml0aWFsVmFsdWU6ITF9LHNob3dGb2xkV2lkZ2V0czp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLnNldFNob3dGb2xkV2lkZ2V0cyhlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LGluaXRpYWxWYWx1ZTohMH0sZGlzcGxheUluZGVudEd1aWRlczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHRleHRMYXllci5zZXREaXNwbGF5SW5kZW50R3VpZGVzKGUpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSxpbml0aWFsVmFsdWU6ITB9LGhpZ2hsaWdodEd1dHRlckxpbmU6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0saW5pdGlhbFZhbHVlOiEwfSxoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZTp7c2V0OmZ1bmN0aW9uKGUpeyghdGhpcy4kaFNjcm9sbEJhckFsd2F5c1Zpc2libGV8fCF0aGlzLiRob3JpelNjcm9sbCkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKX0saW5pdGlhbFZhbHVlOiExfSx2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZTp7c2V0OmZ1bmN0aW9uKGUpeyghdGhpcy4kdlNjcm9sbEJhckFsd2F5c1Zpc2libGV8fCF0aGlzLiR2U2Nyb2xsKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpfSxpbml0aWFsVmFsdWU6ITF9LGZvbnRTaXplOntzZXQ6ZnVuY3Rpb24oZSl7dHlwZW9mIGU9PSJudW1iZXIiJiYoZSs9InB4IiksdGhpcy5jb250YWluZXIuc3R5bGUuZm9udFNpemU9ZSx0aGlzLnVwZGF0ZUZvbnRTaXplKCl9LGluaXRpYWxWYWx1ZToxMn0sZm9udEZhbWlseTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuY29udGFpbmVyLnN0eWxlLmZvbnRGYW1pbHk9ZSx0aGlzLnVwZGF0ZUZvbnRTaXplKCl9fSxtYXhMaW5lczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlRnVsbCgpfX0sbWluTGluZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRtaW5MaW5lczw1NjI5NDk5NTM0MjEzMTF8fCh0aGlzLiRtaW5MaW5lcz0wKSx0aGlzLnVwZGF0ZUZ1bGwoKX19LG1heFBpeGVsSGVpZ2h0OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVGdWxsKCl9LGluaXRpYWxWYWx1ZTowfSxzY3JvbGxQYXN0RW5kOntzZXQ6ZnVuY3Rpb24oZSl7ZT0rZXx8MDtpZih0aGlzLiRzY3JvbGxQYXN0RW5kPT1lKXJldHVybjt0aGlzLiRzY3JvbGxQYXN0RW5kPWUsdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpfSxpbml0aWFsVmFsdWU6MCxoYW5kbGVzU2V0OiEwfSxmaXhlZFdpZHRoR3V0dGVyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuJGZpeGVkV2lkdGg9ISFlLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX19LHRoZW1lOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRUaGVtZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRoZW1lSWR8fHRoaXMudGhlbWV9LGluaXRpYWxWYWx1ZToiLi90aGVtZS90ZXh0bWF0ZSIsaGFuZGxlc1NldDohMH0saGFzQ3NzVHJhbnNmb3Jtczp7fSx1c2VUZXh0YXJlYUZvcklNRTp7aW5pdGlhbFZhbHVlOiFtLmlzTW9iaWxlJiYhbS5pc0lFfX0pLHQuVmlydHVhbFJlbmRlcmVyPXl9KSxhY2UuZGVmaW5lKCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbmV0IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlKXt2YXIgdD0iaW1wb3J0U2NyaXB0cygnIitpLnF1YWxpZnlVUkwoZSkrIicpOyI7dHJ5e3JldHVybiBuZXcgQmxvYihbdF0se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSl9Y2F0Y2gobil7dmFyIHI9d2luZG93LkJsb2JCdWlsZGVyfHx3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXJ8fHdpbmRvdy5Nb3pCbG9iQnVpbGRlcixzPW5ldyByO3JldHVybiBzLmFwcGVuZCh0KSxzLmdldEJsb2IoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKX19ZnVuY3Rpb24gYShlKXtpZih0eXBlb2YgV29ya2VyPT0idW5kZWZpbmVkIilyZXR1cm57cG9zdE1lc3NhZ2U6ZnVuY3Rpb24oKXt9LHRlcm1pbmF0ZTpmdW5jdGlvbigpe319O2lmKG8uZ2V0KCJsb2FkV29ya2VyRnJvbUJsb2IiKSl7dmFyIHQ9dShlKSxuPXdpbmRvdy5VUkx8fHdpbmRvdy53ZWJraXRVUkwscj1uLmNyZWF0ZU9iamVjdFVSTCh0KTtyZXR1cm4gbmV3IFdvcmtlcihyKX1yZXR1cm4gbmV3IFdvcmtlcihlKX12YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9saWIvbmV0Iikscz1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWUoIi4uL2NvbmZpZyIpLGY9ZnVuY3Rpb24oZSl7ZS5wb3N0TWVzc2FnZXx8KGU9dGhpcy4kY3JlYXRlV29ya2VyRnJvbU9sZENvbmZpZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHRoaXMuJHdvcmtlcj1lLHRoaXMuJHNlbmREZWx0YVF1ZXVlPXRoaXMuJHNlbmREZWx0YVF1ZXVlLmJpbmQodGhpcyksdGhpcy5jaGFuZ2VMaXN0ZW5lcj10aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyksdGhpcy5vbk1lc3NhZ2U9dGhpcy5vbk1lc3NhZ2UuYmluZCh0aGlzKSx0aGlzLmNhbGxiYWNrSWQ9MSx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLiR3b3JrZXIub25tZXNzYWdlPXRoaXMub25NZXNzYWdlfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuJGNyZWF0ZVdvcmtlckZyb21PbGRDb25maWc9ZnVuY3Rpb24odCxuLHIsaSxzKXtlLm5hbWVUb1VybCYmIWUudG9VcmwmJihlLnRvVXJsPWUubmFtZVRvVXJsKTtpZihvLmdldCgicGFja2FnZWQiKXx8IWUudG9VcmwpaT1pfHxvLm1vZHVsZVVybChuLCJ3b3JrZXIiKTtlbHNle3ZhciB1PXRoaXMuJG5vcm1hbGl6ZVBhdGg7aT1pfHx1KGUudG9VcmwoImFjZS93b3JrZXIvd29ya2VyLmpzIixudWxsLCJfIikpO3ZhciBmPXt9O3QuZm9yRWFjaChmdW5jdGlvbih0KXtmW3RdPXUoZS50b1VybCh0LG51bGwsIl8iKS5yZXBsYWNlKC8oXC5qcyk/KFw/LiopPyQvLCIiKSl9KX1yZXR1cm4gdGhpcy4kd29ya2VyPWEoaSkscyYmdGhpcy5zZW5kKCJpbXBvcnRTY3JpcHRzIixzKSx0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczpmLG1vZHVsZTpuLGNsYXNzbmFtZTpyfSksdGhpcy4kd29ya2VyfSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSJldmVudCI6dGhpcy5fc2lnbmFsKHQubmFtZSx7ZGF0YTp0LmRhdGF9KTticmVhaztjYXNlImNhbGwiOnZhciBuPXRoaXMuY2FsbGJhY2tzW3QuaWRdO24mJihuKHQuZGF0YSksZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3QuaWRdKTticmVhaztjYXNlImVycm9yIjp0aGlzLnJlcG9ydEVycm9yKHQuZGF0YSk7YnJlYWs7Y2FzZSJsb2ciOndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSx0LmRhdGEpfX0sdGhpcy5yZXBvcnRFcnJvcj1mdW5jdGlvbihlKXt3aW5kb3cuY29uc29sZSYmY29uc29sZS5lcnJvciYmY29uc29sZS5lcnJvcihlKX0sdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihlKXtyZXR1cm4gaS5xdWFsaWZ5VVJMKGUpfSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX3NpZ25hbCgidGVybWluYXRlIix7fSksdGhpcy5kZWx0YVF1ZXVlPW51bGwsdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsLHRoaXMuJGRvYyYmdGhpcy4kZG9jLm9mZigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmUsYXJnczp0fSl9LHRoaXMuY2FsbD1mdW5jdGlvbihlLHQsbil7aWYobil7dmFyIHI9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3Nbcl09bix0LnB1c2gocil9dGhpcy5zZW5kKGUsdCl9LHRoaXMuZW1pdD1mdW5jdGlvbihlLHQpe3RyeXt0LmRhdGEmJnQuZGF0YS5lcnImJih0LmRhdGEuZXJyPXttZXNzYWdlOnQuZGF0YS5lcnIubWVzc2FnZSxzdGFjazp0LmRhdGEuZXJyLnN0YWNrLGNvZGU6dC5kYXRhLmVyci5jb2RlfSksdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDplLGRhdGE6e2RhdGE6dC5kYXRhfX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3Iobi5zdGFjayl9fSx0aGlzLmF0dGFjaFRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dGhpcy4kZG9jJiZ0aGlzLnRlcm1pbmF0ZSgpLHRoaXMuJGRvYz1lLHRoaXMuY2FsbCgic2V0VmFsdWUiLFtlLmdldFZhbHVlKCldKSxlLm9uKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpfSx0aGlzLmNoYW5nZUxpc3RlbmVyPWZ1bmN0aW9uKGUpe3RoaXMuZGVsdGFRdWV1ZXx8KHRoaXMuZGVsdGFRdWV1ZT1bXSxzZXRUaW1lb3V0KHRoaXMuJHNlbmREZWx0YVF1ZXVlLDApKSxlLmFjdGlvbj09Imluc2VydCI/dGhpcy5kZWx0YVF1ZXVlLnB1c2goZS5zdGFydCxlLmxpbmVzKTp0aGlzLmRlbHRhUXVldWUucHVzaChlLnN0YXJ0LGUuZW5kKX0sdGhpcy4kc2VuZERlbHRhUXVldWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRlbHRhUXVldWU7aWYoIWUpcmV0dXJuO3RoaXMuZGVsdGFRdWV1ZT1udWxsLGUubGVuZ3RoPjUwJiZlLmxlbmd0aD50aGlzLiRkb2MuZ2V0TGVuZ3RoKCk+PjE/dGhpcy5jYWxsKCJzZXRWYWx1ZSIsW3RoaXMuJGRvYy5nZXRWYWx1ZSgpXSk6dGhpcy5lbWl0KCJjaGFuZ2UiLHtkYXRhOmV9KX19KS5jYWxsKGYucHJvdG90eXBlKTt2YXIgbD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnVsbCxpPSExLHU9T2JqZWN0LmNyZWF0ZShzKSxhPVtdLGw9bmV3IGYoe21lc3NhZ2VCdWZmZXI6YSx0ZXJtaW5hdGU6ZnVuY3Rpb24oKXt9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGUpe2EucHVzaChlKTtpZighcilyZXR1cm47aT9zZXRUaW1lb3V0KGMpOmMoKX19KTtsLnNldEVtaXRTeW5jPWZ1bmN0aW9uKGUpe2k9ZX07dmFyIGM9ZnVuY3Rpb24oKXt2YXIgZT1hLnNoaWZ0KCk7ZS5jb21tYW5kP3JbZS5jb21tYW5kXS5hcHBseShyLGUuYXJncyk6ZS5ldmVudCYmdS5fc2lnbmFsKGUuZXZlbnQsZS5kYXRhKX07cmV0dXJuIHUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZSl7bC5vbk1lc3NhZ2Uoe2RhdGE6ZX0pfSx1LmNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7dGhpcy5wb3N0TWVzc2FnZSh7dHlwZToiY2FsbCIsaWQ6dCxkYXRhOmV9KX0sdS5lbWl0PWZ1bmN0aW9uKGUsdCl7dGhpcy5wb3N0TWVzc2FnZSh7dHlwZToiZXZlbnQiLG5hbWU6ZSxkYXRhOnR9KX0sby5sb2FkTW9kdWxlKFsid29ya2VyIix0XSxmdW5jdGlvbihlKXtyPW5ldyBlW25dKHUpO3doaWxlKGEubGVuZ3RoKWMoKX0pLGx9O3QuVUlXb3JrZXJDbGllbnQ9bCx0LldvcmtlckNsaWVudD1mLHQuY3JlYXRlV29ya2VyPWF9KSxhY2UuZGVmaW5lKCJhY2UvcGxhY2Vob2xkZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9yYW5nZSIpLlJhbmdlLGk9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPWUoIi4vbGliL29vcCIpLG89ZnVuY3Rpb24oZSx0LG4scixpLHMpe3ZhciBvPXRoaXM7dGhpcy5sZW5ndGg9dCx0aGlzLnNlc3Npb249ZSx0aGlzLmRvYz1lLmdldERvY3VtZW50KCksdGhpcy5tYWluQ2xhc3M9aSx0aGlzLm90aGVyc0NsYXNzPXMsdGhpcy4kb25VcGRhdGU9dGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpLHRoaXMuZG9jLm9uKCJjaGFuZ2UiLHRoaXMuJG9uVXBkYXRlKSx0aGlzLiRvdGhlcnM9cix0aGlzLiRvbkN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLm9uQ3Vyc29yQ2hhbmdlKCl9KX0sdGhpcy4kcG9zPW47dmFyIHU9ZS5nZXRVbmRvTWFuYWdlcigpLiR1bmRvU3RhY2t8fGUuZ2V0VW5kb01hbmFnZXIoKS4kdW5kb3N0YWNrfHx7bGVuZ3RoOi0xfTt0aGlzLiR1bmRvU3RhY2tEZXB0aD11Lmxlbmd0aCx0aGlzLnNldHVwKCksZS5zZWxlY3Rpb24ub24oImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpfTsoZnVuY3Rpb24oKXtzLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuc2V0dXA9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5kb2Msbj10aGlzLnNlc3Npb247dGhpcy5zZWxlY3Rpb25CZWZvcmU9bi5zZWxlY3Rpb24udG9KU09OKCksbi5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGUmJm4uc2VsZWN0aW9uLnRvU2luZ2xlUmFuZ2UoKSx0aGlzLnBvcz10LmNyZWF0ZUFuY2hvcih0aGlzLiRwb3Mucm93LHRoaXMuJHBvcy5jb2x1bW4pO3ZhciBpPXRoaXMucG9zO2kuJGluc2VydFJpZ2h0PSEwLGkuZGV0YWNoKCksaS5tYXJrZXJJZD1uLmFkZE1hcmtlcihuZXcgcihpLnJvdyxpLmNvbHVtbixpLnJvdyxpLmNvbHVtbit0aGlzLmxlbmd0aCksdGhpcy5tYWluQ2xhc3MsbnVsbCwhMSksdGhpcy5vdGhlcnM9W10sdGhpcy4kb3RoZXJzLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9dC5jcmVhdGVBbmNob3Iobi5yb3csbi5jb2x1bW4pO3IuJGluc2VydFJpZ2h0PSEwLHIuZGV0YWNoKCksZS5vdGhlcnMucHVzaChyKX0pLG4uc2V0VW5kb1NlbGVjdCghMSl9LHRoaXMuc2hvd090aGVyTWFya2Vycz1mdW5jdGlvbigpe2lmKHRoaXMub3RoZXJzQWN0aXZlKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzO3RoaXMub3RoZXJzQWN0aXZlPSEwLHRoaXMub3RoZXJzLmZvckVhY2goZnVuY3Rpb24obil7bi5tYXJrZXJJZD1lLmFkZE1hcmtlcihuZXcgcihuLnJvdyxuLmNvbHVtbixuLnJvdyxuLmNvbHVtbit0Lmxlbmd0aCksdC5vdGhlcnNDbGFzcyxudWxsLCExKX0pfSx0aGlzLmhpZGVPdGhlck1hcmtlcnM9ZnVuY3Rpb24oKXtpZighdGhpcy5vdGhlcnNBY3RpdmUpcmV0dXJuO3RoaXMub3RoZXJzQWN0aXZlPSExO2Zvcih2YXIgZT0wO2U8dGhpcy5vdGhlcnMubGVuZ3RoO2UrKyl0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMub3RoZXJzW2VdLm1hcmtlcklkKX0sdGhpcy5vblVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLiR1cGRhdGluZylyZXR1cm4gdGhpcy51cGRhdGVBbmNob3JzKGUpO3ZhciB0PWU7aWYodC5zdGFydC5yb3chPT10LmVuZC5yb3cpcmV0dXJuO2lmKHQuc3RhcnQucm93IT09dGhpcy5wb3Mucm93KXJldHVybjt0aGlzLiR1cGRhdGluZz0hMDt2YXIgbj1lLmFjdGlvbj09PSJpbnNlcnQiP3QuZW5kLmNvbHVtbi10LnN0YXJ0LmNvbHVtbjp0LnN0YXJ0LmNvbHVtbi10LmVuZC5jb2x1bW4saT10LnN0YXJ0LmNvbHVtbj49dGhpcy5wb3MuY29sdW1uJiZ0LnN0YXJ0LmNvbHVtbjw9dGhpcy5wb3MuY29sdW1uK3RoaXMubGVuZ3RoKzEscz10LnN0YXJ0LmNvbHVtbi10aGlzLnBvcy5jb2x1bW47dGhpcy51cGRhdGVBbmNob3JzKGUpLGkmJih0aGlzLmxlbmd0aCs9bik7aWYoaSYmIXRoaXMuc2Vzc2lvbi4kZnJvbVVuZG8paWYoZS5hY3Rpb249PT0iaW5zZXJ0Iilmb3IodmFyIG89dGhpcy5vdGhlcnMubGVuZ3RoLTE7bz49MDtvLS0pe3ZhciB1PXRoaXMub3RoZXJzW29dLGE9e3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW4rc307dGhpcy5kb2MuaW5zZXJ0TWVyZ2VkTGluZXMoYSxlLmxpbmVzKX1lbHNlIGlmKGUuYWN0aW9uPT09InJlbW92ZSIpZm9yKHZhciBvPXRoaXMub3RoZXJzLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgdT10aGlzLm90aGVyc1tvXSxhPXtyb3c6dS5yb3csY29sdW1uOnUuY29sdW1uK3N9O3RoaXMuZG9jLnJlbW92ZShuZXcgcihhLnJvdyxhLmNvbHVtbixhLnJvdyxhLmNvbHVtbi1uKSl9dGhpcy4kdXBkYXRpbmc9ITEsdGhpcy51cGRhdGVNYXJrZXJzKCl9LHRoaXMudXBkYXRlQW5jaG9ycz1mdW5jdGlvbihlKXt0aGlzLnBvcy5vbkNoYW5nZShlKTtmb3IodmFyIHQ9dGhpcy5vdGhlcnMubGVuZ3RoO3QtLTspdGhpcy5vdGhlcnNbdF0ub25DaGFuZ2UoZSk7dGhpcy51cGRhdGVNYXJrZXJzKCl9LHRoaXMudXBkYXRlTWFya2Vycz1mdW5jdGlvbigpe2lmKHRoaXMuJHVwZGF0aW5nKXJldHVybjt2YXIgZT10aGlzLHQ9dGhpcy5zZXNzaW9uLG49ZnVuY3Rpb24obixpKXt0LnJlbW92ZU1hcmtlcihuLm1hcmtlcklkKSxuLm1hcmtlcklkPXQuYWRkTWFya2VyKG5ldyByKG4ucm93LG4uY29sdW1uLG4ucm93LG4uY29sdW1uK2UubGVuZ3RoKSxpLG51bGwsITEpfTtuKHRoaXMucG9zLHRoaXMubWFpbkNsYXNzKTtmb3IodmFyIGk9dGhpcy5vdGhlcnMubGVuZ3RoO2ktLTspbih0aGlzLm90aGVyc1tpXSx0aGlzLm90aGVyc0NsYXNzKX0sdGhpcy5vbkN1cnNvckNoYW5nZT1mdW5jdGlvbihlKXtpZih0aGlzLiR1cGRhdGluZ3x8IXRoaXMuc2Vzc2lvbilyZXR1cm47dmFyIHQ9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTt0LnJvdz09PXRoaXMucG9zLnJvdyYmdC5jb2x1bW4+PXRoaXMucG9zLmNvbHVtbiYmdC5jb2x1bW48PXRoaXMucG9zLmNvbHVtbit0aGlzLmxlbmd0aD8odGhpcy5zaG93T3RoZXJNYXJrZXJzKCksdGhpcy5fZW1pdCgiY3Vyc29yRW50ZXIiLGUpKToodGhpcy5oaWRlT3RoZXJNYXJrZXJzKCksdGhpcy5fZW1pdCgiY3Vyc29yTGVhdmUiLGUpKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMucG9zJiZ0aGlzLnBvcy5tYXJrZXJJZCksdGhpcy5oaWRlT3RoZXJNYXJrZXJzKCksdGhpcy5kb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvblVwZGF0ZSksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLnNlc3Npb24uc2V0VW5kb1NlbGVjdCghMCksdGhpcy5zZXNzaW9uPW51bGx9LHRoaXMuY2FuY2VsPWZ1bmN0aW9uKCl7aWYodGhpcy4kdW5kb1N0YWNrRGVwdGg9PT0tMSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCksdD0oZS4kdW5kb1N0YWNrfHxlLiR1bmRvc3RhY2spLmxlbmd0aC10aGlzLiR1bmRvU3RhY2tEZXB0aDtmb3IodmFyIG49MDtuPHQ7bisrKWUudW5kbyh0aGlzLnNlc3Npb24sITApO3RoaXMuc2VsZWN0aW9uQmVmb3JlJiZ0aGlzLnNlc3Npb24uc2VsZWN0aW9uLmZyb21KU09OKHRoaXMuc2VsZWN0aW9uQmVmb3JlKX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LlBsYWNlSG9sZGVyPW99KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvbXVsdGlfc2VsZWN0X2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBlLnJvdz09dC5yb3cmJmUuY29sdW1uPT10LmNvbHVtbn1mdW5jdGlvbiBvKGUpe3ZhciB0PWUuZG9tRXZlbnQsbj10LmFsdEtleSxvPXQuc2hpZnRLZXksdT10LmN0cmxLZXksYT1lLmdldEFjY2VsS2V5KCksZj1lLmdldEJ1dHRvbigpO3UmJmkuaXNNYWMmJihmPXQuYnV0dG9uKTtpZihlLmVkaXRvci5pbk11bHRpU2VsZWN0TW9kZSYmZj09Mil7ZS5lZGl0b3IudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoZS5kb21FdmVudCk7cmV0dXJufWlmKCF1JiYhbiYmIWEpe2Y9PT0wJiZlLmVkaXRvci5pbk11bHRpU2VsZWN0TW9kZSYmZS5lZGl0b3IuZXhpdE11bHRpU2VsZWN0TW9kZSgpO3JldHVybn1pZihmIT09MClyZXR1cm47dmFyIGw9ZS5lZGl0b3IsYz1sLnNlbGVjdGlvbixoPWwuaW5NdWx0aVNlbGVjdE1vZGUscD1lLmdldERvY3VtZW50UG9zaXRpb24oKSxkPWMuZ2V0Q3Vyc29yKCksdj1lLmluU2VsZWN0aW9uKCl8fGMuaXNFbXB0eSgpJiZzKHAsZCksbT1lLngsZz1lLnkseT1mdW5jdGlvbihlKXttPWUuY2xpZW50WCxnPWUuY2xpZW50WX0sYj1sLnNlc3Npb24sdz1sLnJlbmRlcmVyLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcyhtLGcpLEU9dyxTO2lmKGwuJG1vdXNlSGFuZGxlci4kZW5hYmxlSnVtcFRvRGVmKXUmJm58fGEmJm4/Uz1vPyJibG9jayI6ImFkZCI6biYmbC4kYmxvY2tTZWxlY3RFbmFibGVkJiYoUz0iYmxvY2siKTtlbHNlIGlmKGEmJiFuKXtTPSJhZGQiO2lmKCFoJiZvKXJldHVybn1lbHNlIG4mJmwuJGJsb2NrU2VsZWN0RW5hYmxlZCYmKFM9ImJsb2NrIik7UyYmaS5pc01hYyYmdC5jdHJsS2V5JiZsLiRtb3VzZUhhbmRsZXIuY2FuY2VsQ29udGV4dE1lbnUoKTtpZihTPT0iYWRkIil7aWYoIWgmJnYpcmV0dXJuO2lmKCFoKXt2YXIgeD1jLnRvT3JpZW50ZWRSYW5nZSgpO2wuYWRkU2VsZWN0aW9uTWFya2VyKHgpfXZhciBUPWMucmFuZ2VMaXN0LnJhbmdlQXRQb2ludChwKTtsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITAsbyYmKFQ9bnVsbCx4PWMucmFuZ2VzWzBdfHx4LGwucmVtb3ZlU2VsZWN0aW9uTWFya2VyKHgpKSxsLm9uY2UoIm1vdXNldXAiLGZ1bmN0aW9uKCl7dmFyIGU9Yy50b09yaWVudGVkUmFuZ2UoKTtUJiZlLmlzRW1wdHkoKSYmcyhULmN1cnNvcixlLmN1cnNvcik/Yy5zdWJzdHJhY3RQb2ludChlLmN1cnNvcik6KG8/Yy5zdWJzdHJhY3RQb2ludCh4LmN1cnNvcik6eCYmKGwucmVtb3ZlU2VsZWN0aW9uTWFya2VyKHgpLGMuYWRkUmFuZ2UoeCkpLGMuYWRkUmFuZ2UoZSkpLGwuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMX0pfWVsc2UgaWYoUz09ImJsb2NrIil7ZS5zdG9wKCksbC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwO3ZhciBOLEM9W10saz1mdW5jdGlvbigpe3ZhciBlPWwucmVuZGVyZXIucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzKG0sZyksdD1iLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLnJvdyxlLmNvbHVtbixlLm9mZnNldFgpO2lmKHMoRSxlKSYmcyh0LGMubGVhZCkpcmV0dXJuO0U9ZSxsLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbih0KSxsLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCksbC5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzKEMpLEM9Yy5yZWN0YW5ndWxhclJhbmdlQmxvY2soRSx3KSxsLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9uJiZDLmxlbmd0aD09MSYmQ1swXS5pc0VtcHR5KCkmJihDWzBdPWwuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb24uY2xvbmUoKSksQy5mb3JFYWNoKGwuYWRkU2VsZWN0aW9uTWFya2VyLGwpLGwudXBkYXRlU2VsZWN0aW9uTWFya2VycygpfTtoJiYhYT9jLnRvU2luZ2xlUmFuZ2UoKTohaCYmYSYmKE49Yy50b09yaWVudGVkUmFuZ2UoKSxsLmFkZFNlbGVjdGlvbk1hcmtlcihOKSksbz93PWIuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGMubGVhZCk6Yy5tb3ZlVG9Qb3NpdGlvbihwKSxFPXtyb3c6LTEsY29sdW1uOi0xfTt2YXIgTD1mdW5jdGlvbihlKXtrKCksY2xlYXJJbnRlcnZhbChPKSxsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnMoQyksQy5sZW5ndGh8fChDPVtjLnRvT3JpZW50ZWRSYW5nZSgpXSksTiYmKGwucmVtb3ZlU2VsZWN0aW9uTWFya2VyKE4pLGMudG9TaW5nbGVSYW5nZShOKSk7Zm9yKHZhciB0PTA7dDxDLmxlbmd0aDt0KyspYy5hZGRSYW5nZShDW3RdKTtsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITEsbC4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbj1udWxsfSxBPWs7ci5jYXB0dXJlKGwuY29udGFpbmVyLHksTCk7dmFyIE89c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtBKCl9LDIwKTtyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpfX12YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKTt0Lm9uTW91c2VEb3duPW99KSxhY2UuZGVmaW5lKCJhY2UvY29tbWFuZHMvbXVsdGlfc2VsZWN0X2NvbW1hbmRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciJdLGZ1bmN0aW9uKGUsdCxuKXt0LmRlZmF1bHRDb21tYW5kcz1be25hbWU6ImFkZEN1cnNvckFib3ZlIixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBhYm92ZSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygtMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtVXAiLG1hYzoiQ3RybC1BbHQtVXAifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImFkZEN1cnNvckJlbG93IixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBiZWxvdyIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygxKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1Eb3duIixtYWM6IkN0cmwtQWx0LURvd24ifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImFkZEN1cnNvckFib3ZlU2tpcEN1cnJlbnQiLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGFib3ZlIChza2lwIGN1cnJlbnQpIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKC0xLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1VcCIsbWFjOiJDdHJsLUFsdC1TaGlmdC1VcCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiYWRkQ3Vyc29yQmVsb3dTa2lwQ3VycmVudCIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYmVsb3cgKHNraXAgY3VycmVudCkiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtRG93biIsbWFjOiJDdHJsLUFsdC1TaGlmdC1Eb3duIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RNb3JlQmVmb3JlIixkZXNjcmlwdGlvbjoiU2VsZWN0IG1vcmUgYmVmb3JlIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgtMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtTGVmdCIsbWFjOiJDdHJsLUFsdC1MZWZ0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RNb3JlQWZ0ZXIiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbW9yZSBhZnRlciIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtUmlnaHQiLG1hYzoiQ3RybC1BbHQtUmlnaHQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE5leHRCZWZvcmUiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbmV4dCBiZWZvcmUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKC0xLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1MZWZ0IixtYWM6IkN0cmwtQWx0LVNoaWZ0LUxlZnQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE5leHRBZnRlciIsZGVzY3JpcHRpb246IlNlbGVjdCBuZXh0IGFmdGVyIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgxLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1SaWdodCIsbWFjOiJDdHJsLUFsdC1TaGlmdC1SaWdodCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic3BsaXRJbnRvTGluZXMiLGRlc2NyaXB0aW9uOiJTcGxpdCBpbnRvIGxpbmVzIixleGVjOmZ1bmN0aW9uKGUpe2UubXVsdGlTZWxlY3Quc3BsaXRJbnRvTGluZXMoKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1MIixtYWM6IkN0cmwtQWx0LUwifSxyZWFkT25seTohMH0se25hbWU6ImFsaWduQ3Vyc29ycyIsZGVzY3JpcHRpb246IkFsaWduIGN1cnNvcnMiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5hbGlnbkN1cnNvcnMoKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1BIixtYWM6IkN0cmwtQWx0LUEifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImZpbmRBbGwiLGRlc2NyaXB0aW9uOiJGaW5kIGFsbCIsZXhlYzpmdW5jdGlvbihlKXtlLmZpbmRBbGwoKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1LIixtYWM6IkN0cmwtQWx0LUcifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH1dLHQubXVsdGlTZWxlY3RDb21tYW5kcz1be25hbWU6InNpbmdsZVNlbGVjdGlvbiIsZGVzY3JpcHRpb246IlNpbmdsZSBzZWxlY3Rpb24iLGJpbmRLZXk6ImVzYyIsZXhlYzpmdW5jdGlvbihlKXtlLmV4aXRNdWx0aVNlbGVjdE1vZGUoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITAsaXNBdmFpbGFibGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuaW5NdWx0aVNlbGVjdE1vZGV9fV07dmFyIHI9ZSgiLi4va2V5Ym9hcmQvaGFzaF9oYW5kbGVyIikuSGFzaEhhbmRsZXI7dC5rZXlib2FyZEhhbmRsZXI9bmV3IHIodC5tdWx0aVNlbGVjdENvbW1hbmRzKX0pLGFjZS5kZWZpbmUoImFjZS9tdWx0aV9zZWxlY3QiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2VfbGlzdCIsImFjZS9yYW5nZSIsImFjZS9zZWxlY3Rpb24iLCJhY2UvbW91c2UvbXVsdGlfc2VsZWN0X2hhbmRsZXIiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi9sYW5nIiwiYWNlL2NvbW1hbmRzL211bHRpX3NlbGVjdF9jb21tYW5kcyIsImFjZS9zZWFyY2giLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL2VkaXRvciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuIGMuJG9wdGlvbnMud3JhcD0hMCxjLiRvcHRpb25zLm5lZWRsZT10LGMuJG9wdGlvbnMuYmFja3dhcmRzPW49PS0xLGMuZmluZChlKX1mdW5jdGlvbiB2KGUsdCl7cmV0dXJuIGUucm93PT10LnJvdyYmZS5jb2x1bW49PXQuY29sdW1ufWZ1bmN0aW9uIG0oZSl7aWYoZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpcmV0dXJuO2UuJG9uQWRkUmFuZ2U9ZS4kb25BZGRSYW5nZS5iaW5kKGUpLGUuJG9uUmVtb3ZlUmFuZ2U9ZS4kb25SZW1vdmVSYW5nZS5iaW5kKGUpLGUuJG9uTXVsdGlTZWxlY3Q9ZS4kb25NdWx0aVNlbGVjdC5iaW5kKGUpLGUuJG9uU2luZ2xlU2VsZWN0PWUuJG9uU2luZ2xlU2VsZWN0LmJpbmQoZSksZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2U9dC5vblNlc3Npb25DaGFuZ2UuYmluZChlKSxlLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlPWUuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UuYmluZChlKSxlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZShlKSxlLm9uKCJjaGFuZ2VTZXNzaW9uIixlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSksZS5vbigibW91c2Vkb3duIixvKSxlLmNvbW1hbmRzLmFkZENvbW1hbmRzKGYuZGVmYXVsdENvbW1hbmRzKSxnKGUpfWZ1bmN0aW9uIGcoZSl7ZnVuY3Rpb24gcih0KXtuJiYoZS5yZW5kZXJlci5zZXRNb3VzZUN1cnNvcigiIiksbj0hMSl9aWYoIWUudGV4dElucHV0KXJldHVybjt2YXIgdD1lLnRleHRJbnB1dC5nZXRFbGVtZW50KCksbj0hMTt1LmFkZExpc3RlbmVyKHQsImtleWRvd24iLGZ1bmN0aW9uKHQpe3ZhciBpPXQua2V5Q29kZT09MTgmJiEodC5jdHJsS2V5fHx0LnNoaWZ0S2V5fHx0Lm1ldGFLZXkpO2UuJGJsb2NrU2VsZWN0RW5hYmxlZCYmaT9ufHwoZS5yZW5kZXJlci5zZXRNb3VzZUN1cnNvcigiY3Jvc3NoYWlyIiksbj0hMCk6biYmcigpfSksdS5hZGRMaXN0ZW5lcih0LCJrZXl1cCIsciksdS5hZGRMaXN0ZW5lcih0LCJibHVyIixyKX12YXIgcj1lKCIuL3JhbmdlX2xpc3QiKS5SYW5nZUxpc3QsaT1lKCIuL3JhbmdlIikuUmFuZ2Uscz1lKCIuL3NlbGVjdGlvbiIpLlNlbGVjdGlvbixvPWUoIi4vbW91c2UvbXVsdGlfc2VsZWN0X2hhbmRsZXIiKS5vbk1vdXNlRG93bix1PWUoIi4vbGliL2V2ZW50IiksYT1lKCIuL2xpYi9sYW5nIiksZj1lKCIuL2NvbW1hbmRzL211bHRpX3NlbGVjdF9jb21tYW5kcyIpO3QuY29tbWFuZHM9Zi5kZWZhdWx0Q29tbWFuZHMuY29uY2F0KGYubXVsdGlTZWxlY3RDb21tYW5kcyk7dmFyIGw9ZSgiLi9zZWFyY2giKS5TZWFyY2gsYz1uZXcgbCxwPWUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb247KGZ1bmN0aW9uKCl7dGhpcy5nZXRTZWxlY3Rpb25NYXJrZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlbGVjdGlvbk1hcmtlcnN9fSkuY2FsbChwLnByb3RvdHlwZSksZnVuY3Rpb24oKXt0aGlzLnJhbmdlcz1udWxsLHRoaXMucmFuZ2VMaXN0PW51bGwsdGhpcy5hZGRSYW5nZT1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybjtpZighdGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmdGhpcy5yYW5nZUNvdW50PT09MCl7dmFyIG49dGhpcy50b09yaWVudGVkUmFuZ2UoKTt0aGlzLnJhbmdlTGlzdC5hZGQobiksdGhpcy5yYW5nZUxpc3QuYWRkKGUpO2lmKHRoaXMucmFuZ2VMaXN0LnJhbmdlcy5sZW5ndGghPTIpcmV0dXJuIHRoaXMucmFuZ2VMaXN0LnJlbW92ZUFsbCgpLHR8fHRoaXMuZnJvbU9yaWVudGVkUmFuZ2UoZSk7dGhpcy5yYW5nZUxpc3QucmVtb3ZlQWxsKCksdGhpcy5yYW5nZUxpc3QuYWRkKG4pLHRoaXMuJG9uQWRkUmFuZ2Uobil9ZS5jdXJzb3J8fChlLmN1cnNvcj1lLmVuZCk7dmFyIHI9dGhpcy5yYW5nZUxpc3QuYWRkKGUpO3JldHVybiB0aGlzLiRvbkFkZFJhbmdlKGUpLHIubGVuZ3RoJiZ0aGlzLiRvblJlbW92ZVJhbmdlKHIpLHRoaXMucmFuZ2VDb3VudD4xJiYhdGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmKHRoaXMuX3NpZ25hbCgibXVsdGlTZWxlY3QiKSx0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSEwLHRoaXMuc2Vzc2lvbi4kdW5kb1NlbGVjdD0hMSx0aGlzLnJhbmdlTGlzdC5hdHRhY2godGhpcy5zZXNzaW9uKSksdHx8dGhpcy5mcm9tT3JpZW50ZWRSYW5nZShlKX0sdGhpcy50b1NpbmdsZVJhbmdlPWZ1bmN0aW9uKGUpe2U9ZXx8dGhpcy5yYW5nZXNbMF07dmFyIHQ9dGhpcy5yYW5nZUxpc3QucmVtb3ZlQWxsKCk7dC5sZW5ndGgmJnRoaXMuJG9uUmVtb3ZlUmFuZ2UodCksZSYmdGhpcy5mcm9tT3JpZW50ZWRSYW5nZShlKX0sdGhpcy5zdWJzdHJhY3RQb2ludD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnJhbmdlTGlzdC5zdWJzdHJhY3RQb2ludChlKTtpZih0KXJldHVybiB0aGlzLiRvblJlbW92ZVJhbmdlKHQpLHRbMF19LHRoaXMubWVyZ2VPdmVybGFwcGluZ1Jhbmdlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmFuZ2VMaXN0Lm1lcmdlKCk7ZS5sZW5ndGgmJnRoaXMuJG9uUmVtb3ZlUmFuZ2UoZSl9LHRoaXMuJG9uQWRkUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5yYW5nZUNvdW50PXRoaXMucmFuZ2VMaXN0LnJhbmdlcy5sZW5ndGgsdGhpcy5yYW5nZXMudW5zaGlmdChlKSx0aGlzLl9zaWduYWwoImFkZFJhbmdlIix7cmFuZ2U6ZX0pfSx0aGlzLiRvblJlbW92ZVJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMucmFuZ2VDb3VudD10aGlzLnJhbmdlTGlzdC5yYW5nZXMubGVuZ3RoO2lmKHRoaXMucmFuZ2VDb3VudD09MSYmdGhpcy5pbk11bHRpU2VsZWN0TW9kZSl7dmFyIHQ9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLnBvcCgpO2UucHVzaCh0KSx0aGlzLnJhbmdlQ291bnQ9MH1mb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9dGhpcy5yYW5nZXMuaW5kZXhPZihlW25dKTt0aGlzLnJhbmdlcy5zcGxpY2UociwxKX10aGlzLl9zaWduYWwoInJlbW92ZVJhbmdlIix7cmFuZ2VzOmV9KSx0aGlzLnJhbmdlQ291bnQ9PT0wJiZ0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYodGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMSx0aGlzLl9zaWduYWwoInNpbmdsZVNlbGVjdCIpLHRoaXMuc2Vzc2lvbi4kdW5kb1NlbGVjdD0hMCx0aGlzLnJhbmdlTGlzdC5kZXRhY2godGhpcy5zZXNzaW9uKSksdD10fHx0aGlzLnJhbmdlc1swXSx0JiYhdC5pc0VxdWFsKHRoaXMuZ2V0UmFuZ2UoKSkmJnRoaXMuZnJvbU9yaWVudGVkUmFuZ2UodCl9LHRoaXMuJGluaXRSYW5nZUxpc3Q9ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlTGlzdClyZXR1cm47dGhpcy5yYW5nZUxpc3Q9bmV3IHIsdGhpcy5yYW5nZXM9W10sdGhpcy5yYW5nZUNvdW50PTB9LHRoaXMuZ2V0QWxsUmFuZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZ2VDb3VudD90aGlzLnJhbmdlTGlzdC5yYW5nZXMuY29uY2F0KCk6W3RoaXMuZ2V0UmFuZ2UoKV19LHRoaXMuc3BsaXRJbnRvTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlQ291bnQ+MSl7dmFyIGU9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLHQ9ZVtlLmxlbmd0aC0xXSxuPWkuZnJvbVBvaW50cyhlWzBdLnN0YXJ0LHQuZW5kKTt0aGlzLnRvU2luZ2xlUmFuZ2UoKSx0aGlzLnNldFNlbGVjdGlvblJhbmdlKG4sdC5jdXJzb3I9PXQuc3RhcnQpfWVsc2V7dmFyIG49dGhpcy5nZXRSYW5nZSgpLHI9dGhpcy5pc0JhY2t3YXJkcygpLHM9bi5zdGFydC5yb3csbz1uLmVuZC5yb3c7aWYocz09byl7aWYocil2YXIgdT1uLmVuZCxhPW4uc3RhcnQ7ZWxzZSB2YXIgdT1uLnN0YXJ0LGE9bi5lbmQ7dGhpcy5hZGRSYW5nZShpLmZyb21Qb2ludHMoYSxhKSksdGhpcy5hZGRSYW5nZShpLmZyb21Qb2ludHModSx1KSk7cmV0dXJufXZhciBmPVtdLGw9dGhpcy5nZXRMaW5lUmFuZ2UocywhMCk7bC5zdGFydC5jb2x1bW49bi5zdGFydC5jb2x1bW4sZi5wdXNoKGwpO2Zvcih2YXIgYz1zKzE7YzxvO2MrKylmLnB1c2godGhpcy5nZXRMaW5lUmFuZ2UoYywhMCkpO2w9dGhpcy5nZXRMaW5lUmFuZ2UobywhMCksbC5lbmQuY29sdW1uPW4uZW5kLmNvbHVtbixmLnB1c2gobCksZi5mb3JFYWNoKHRoaXMuYWRkUmFuZ2UsdGhpcyl9fSx0aGlzLnRvZ2dsZUJsb2NrU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUNvdW50PjEpe3ZhciBlPXRoaXMucmFuZ2VMaXN0LnJhbmdlcyx0PWVbZS5sZW5ndGgtMV0sbj1pLmZyb21Qb2ludHMoZVswXS5zdGFydCx0LmVuZCk7dGhpcy50b1NpbmdsZVJhbmdlKCksdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShuLHQuY3Vyc29yPT10LnN0YXJ0KX1lbHNle3ZhciByPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5jdXJzb3IpLHM9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmFuY2hvciksbz10aGlzLnJlY3Rhbmd1bGFyUmFuZ2VCbG9jayhyLHMpO28uZm9yRWFjaCh0aGlzLmFkZFJhbmdlLHRoaXMpfX0sdGhpcy5yZWN0YW5ndWxhclJhbmdlQmxvY2s9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLHM9ZS5jb2x1bW48dC5jb2x1bW47aWYocyl2YXIgbz1lLmNvbHVtbix1PXQuY29sdW1uLGE9ZS5vZmZzZXRYLGY9dC5vZmZzZXRYO2Vsc2UgdmFyIG89dC5jb2x1bW4sdT1lLmNvbHVtbixhPXQub2Zmc2V0WCxmPWUub2Zmc2V0WDt2YXIgbD1lLnJvdzx0LnJvdztpZihsKXZhciBjPWUucm93LGg9dC5yb3c7ZWxzZSB2YXIgYz10LnJvdyxoPWUucm93O288MCYmKG89MCksYzwwJiYoYz0wKSxjPT1oJiYobj0hMCk7dmFyIHA7Zm9yKHZhciBkPWM7ZDw9aDtkKyspe3ZhciBtPWkuZnJvbVBvaW50cyh0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGQsbyxhKSx0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGQsdSxmKSk7aWYobS5pc0VtcHR5KCkpe2lmKHAmJnYobS5lbmQscCkpYnJlYWs7cD1tLmVuZH1tLmN1cnNvcj1zP20uc3RhcnQ6bS5lbmQsci5wdXNoKG0pfWwmJnIucmV2ZXJzZSgpO2lmKCFuKXt2YXIgZz1yLmxlbmd0aC0xO3doaWxlKHJbZ10uaXNFbXB0eSgpJiZnPjApZy0tO2lmKGc+MCl7dmFyIHk9MDt3aGlsZShyW3ldLmlzRW1wdHkoKSl5Kyt9Zm9yKHZhciBiPWc7Yj49eTtiLS0pcltiXS5pc0VtcHR5KCkmJnIuc3BsaWNlKGIsMSl9cmV0dXJuIHJ9fS5jYWxsKHMucHJvdG90eXBlKTt2YXIgZD1lKCIuL2VkaXRvciIpLkVkaXRvcjsoZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVNlbGVjdGlvbk1hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy5hZGRTZWxlY3Rpb25NYXJrZXI9ZnVuY3Rpb24oZSl7ZS5jdXJzb3J8fChlLmN1cnNvcj1lLmVuZCk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpO3JldHVybiBlLm1hcmtlcj10aGlzLnNlc3Npb24uYWRkTWFya2VyKGUsImFjZV9zZWxlY3Rpb24iLHQpLHRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5wdXNoKGUpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25NYXJrZXJDb3VudD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMubGVuZ3RoLGV9LHRoaXMucmVtb3ZlU2VsZWN0aW9uTWFya2VyPWZ1bmN0aW9uKGUpe2lmKCFlLm1hcmtlcilyZXR1cm47dGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcihlLm1hcmtlcik7dmFyIHQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLmluZGV4T2YoZSk7dCE9LTEmJnRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5zcGxpY2UodCwxKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uTWFya2VyQ291bnQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLmxlbmd0aH0sdGhpcy5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycztmb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXTtpZighci5tYXJrZXIpY29udGludWU7dGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcihyLm1hcmtlcik7dmFyIGk9dC5pbmRleE9mKHIpO2khPS0xJiZ0LnNwbGljZShpLDEpfXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25NYXJrZXJDb3VudD10Lmxlbmd0aH0sdGhpcy4kb25BZGRSYW5nZT1mdW5jdGlvbihlKXt0aGlzLmFkZFNlbGVjdGlvbk1hcmtlcihlLnJhbmdlKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy4kb25SZW1vdmVSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnMoZS5yYW5nZXMpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLiRvbk11bHRpU2VsZWN0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGUpcmV0dXJuO3RoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITAsdGhpcy5zZXRTdHlsZSgiYWNlX211bHRpc2VsZWN0IiksdGhpcy5rZXlCaW5kaW5nLmFkZEtleWJvYXJkSGFuZGxlcihmLmtleWJvYXJkSGFuZGxlciksdGhpcy5jb21tYW5kcy5zZXREZWZhdWx0SGFuZGxlcigiZXhlYyIsdGhpcy4kb25NdWx0aVNlbGVjdEV4ZWMpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLiRvblNpbmdsZVNlbGVjdD1mdW5jdGlvbihlKXtpZih0aGlzLnNlc3Npb24ubXVsdGlTZWxlY3QuaW5WaXJ0dWFsTW9kZSlyZXR1cm47dGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMSx0aGlzLnVuc2V0U3R5bGUoImFjZV9tdWx0aXNlbGVjdCIpLHRoaXMua2V5QmluZGluZy5yZW1vdmVLZXlib2FyZEhhbmRsZXIoZi5rZXlib2FyZEhhbmRsZXIpLHRoaXMuY29tbWFuZHMucmVtb3ZlRGVmYXVsdEhhbmRsZXIoImV4ZWMiLHRoaXMuJG9uTXVsdGlTZWxlY3RFeGVjKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKSx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kb25NdWx0aVNlbGVjdEV4ZWM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21tYW5kLG49ZS5lZGl0b3I7aWYoIW4ubXVsdGlTZWxlY3QpcmV0dXJuO2lmKCF0Lm11bHRpU2VsZWN0QWN0aW9uKXt2YXIgcj10LmV4ZWMobixlLmFyZ3N8fHt9KTtuLm11bHRpU2VsZWN0LmFkZFJhbmdlKG4ubXVsdGlTZWxlY3QudG9PcmllbnRlZFJhbmdlKCkpLG4ubXVsdGlTZWxlY3QubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpfWVsc2UgdC5tdWx0aVNlbGVjdEFjdGlvbj09ImZvckVhY2giP3I9bi5mb3JFYWNoU2VsZWN0aW9uKHQsZS5hcmdzKTp0Lm11bHRpU2VsZWN0QWN0aW9uPT0iZm9yRWFjaExpbmUiP3I9bi5mb3JFYWNoU2VsZWN0aW9uKHQsZS5hcmdzLCEwKTp0Lm11bHRpU2VsZWN0QWN0aW9uPT0ic2luZ2xlIj8obi5leGl0TXVsdGlTZWxlY3RNb2RlKCkscj10LmV4ZWMobixlLmFyZ3N8fHt9KSk6cj10Lm11bHRpU2VsZWN0QWN0aW9uKG4sZS5hcmdzfHx7fSk7cmV0dXJuIHJ9LHRoaXMuZm9yRWFjaFNlbGVjdGlvbj1mdW5jdGlvbihlLHQsbil7aWYodGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXJldHVybjt2YXIgcj1uJiZuLmtlZXBPcmRlcixpPW49PTF8fG4mJm4uJGJ5TGluZXMsbz10aGlzLnNlc3Npb24sdT10aGlzLnNlbGVjdGlvbixhPXUucmFuZ2VMaXN0LGY9KHI/dTphKS5yYW5nZXMsbDtpZighZi5sZW5ndGgpcmV0dXJuIGUuZXhlYz9lLmV4ZWModGhpcyx0fHx7fSk6ZSh0aGlzLHR8fHt9KTt2YXIgYz11Ll9ldmVudFJlZ2lzdHJ5O3UuX2V2ZW50UmVnaXN0cnk9e307dmFyIGg9bmV3IHMobyk7dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwO2Zvcih2YXIgcD1mLmxlbmd0aDtwLS07KXtpZihpKXdoaWxlKHA+MCYmZltwXS5zdGFydC5yb3c9PWZbcC0xXS5lbmQucm93KXAtLTtoLmZyb21PcmllbnRlZFJhbmdlKGZbcF0pLGguaW5kZXg9cCx0aGlzLnNlbGVjdGlvbj1vLnNlbGVjdGlvbj1oO3ZhciBkPWUuZXhlYz9lLmV4ZWModGhpcyx0fHx7fSk6ZSh0aGlzLHR8fHt9KTshbCYmZCE9PXVuZGVmaW5lZCYmKGw9ZCksaC50b09yaWVudGVkUmFuZ2UoZltwXSl9aC5kZXRhY2goKSx0aGlzLnNlbGVjdGlvbj1vLnNlbGVjdGlvbj11LHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMSx1Ll9ldmVudFJlZ2lzdHJ5PWMsdS5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCksdS5yYW5nZXNbMF0mJnUuZnJvbU9yaWVudGVkUmFuZ2UodS5yYW5nZXNbMF0pO3ZhciB2PXRoaXMucmVuZGVyZXIuJHNjcm9sbEFuaW1hdGlvbjtyZXR1cm4gdGhpcy5vbkN1cnNvckNoYW5nZSgpLHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx2JiZ2LmZyb209PXYudG8mJnRoaXMucmVuZGVyZXIuYW5pbWF0ZVNjcm9sbGluZyh2LmZyb20pLGx9LHRoaXMuZXhpdE11bHRpU2VsZWN0TW9kZT1mdW5jdGlvbigpe2lmKCF0aGlzLmluTXVsdGlTZWxlY3RNb2RlfHx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpcmV0dXJuO3RoaXMubXVsdGlTZWxlY3QudG9TaW5nbGVSYW5nZSgpfSx0aGlzLmdldFNlbGVjdGVkVGV4dD1mdW5jdGlvbigpe3ZhciBlPSIiO2lmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJiF0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpe3ZhciB0PXRoaXMubXVsdGlTZWxlY3QucmFuZ2VMaXN0LnJhbmdlcyxuPVtdO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKW4ucHVzaCh0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRbcl0pKTt2YXIgaT10aGlzLnNlc3Npb24uZ2V0RG9jdW1lbnQoKS5nZXROZXdMaW5lQ2hhcmFjdGVyKCk7ZT1uLmpvaW4oaSksZS5sZW5ndGg9PShuLmxlbmd0aC0xKSppLmxlbmd0aCYmKGU9IiIpfWVsc2UgdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwoZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSkpO3JldHVybiBlfSx0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmIXRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSl7dmFyIG49dGhpcy5tdWx0aVNlbGVjdC5yYW5nZXNbMF07aWYodGhpcy5tdWx0aVNlbGVjdC5pc0VtcHR5KCkmJnQ9PXRoaXMubXVsdGlTZWxlY3QuYW5jaG9yKXJldHVybjt2YXIgcj10PT10aGlzLm11bHRpU2VsZWN0LmFuY2hvcj9uLmN1cnNvcj09bi5zdGFydD9uLmVuZDpuLnN0YXJ0Om4uY3Vyc29yO3Iucm93IT10LnJvd3x8dGhpcy5zZXNzaW9uLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHIucm93LHIuY29sdW1uKS5jb2x1bW4hPXQuY29sdW1uP3RoaXMubXVsdGlTZWxlY3QudG9TaW5nbGVSYW5nZSh0aGlzLm11bHRpU2VsZWN0LnRvT3JpZW50ZWRSYW5nZSgpKTp0aGlzLm11bHRpU2VsZWN0Lm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKX19LHRoaXMuZmluZEFsbD1mdW5jdGlvbihlLHQsbil7dD10fHx7fSx0Lm5lZWRsZT1lfHx0Lm5lZWRsZTtpZih0Lm5lZWRsZT09dW5kZWZpbmVkKXt2YXIgcj10aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCk/dGhpcy5zZWxlY3Rpb24uZ2V0V29yZFJhbmdlKCk6dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0Lm5lZWRsZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHIpfXRoaXMuJHNlYXJjaC5zZXQodCk7dmFyIGk9dGhpcy4kc2VhcmNoLmZpbmRBbGwodGhpcy5zZXNzaW9uKTtpZighaS5sZW5ndGgpcmV0dXJuIDA7dmFyIHM9dGhpcy5tdWx0aVNlbGVjdDtufHxzLnRvU2luZ2xlUmFuZ2UoaVswXSk7Zm9yKHZhciBvPWkubGVuZ3RoO28tLTspcy5hZGRSYW5nZShpW29dLCEwKTtyZXR1cm4gciYmcy5yYW5nZUxpc3QucmFuZ2VBdFBvaW50KHIuc3RhcnQpJiZzLmFkZFJhbmdlKHIsITApLGkubGVuZ3RofSx0aGlzLnNlbGVjdE1vcmVMaW5lcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLnRvT3JpZW50ZWRSYW5nZSgpLHI9bi5jdXJzb3I9PW4uZW5kLHM9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihuLmN1cnNvcik7dGhpcy5zZWxlY3Rpb24uJGRlc2lyZWRDb2x1bW4mJihzLmNvbHVtbj10aGlzLnNlbGVjdGlvbi4kZGVzaXJlZENvbHVtbik7dmFyIG89dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzLnJvdytlLHMuY29sdW1uKTtpZighbi5pc0VtcHR5KCkpdmFyIHU9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihyP24uZW5kOm4uc3RhcnQpLGE9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbih1LnJvdytlLHUuY29sdW1uKTtlbHNlIHZhciBhPW87aWYocil7dmFyIGY9aS5mcm9tUG9pbnRzKG8sYSk7Zi5jdXJzb3I9Zi5zdGFydH1lbHNle3ZhciBmPWkuZnJvbVBvaW50cyhhLG8pO2YuY3Vyc29yPWYuZW5kfWYuZGVzaXJlZENvbHVtbj1zLmNvbHVtbjtpZighdGhpcy5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGUpdGhpcy5zZWxlY3Rpb24uYWRkUmFuZ2Uobik7ZWxzZSBpZih0KXZhciBsPW4uY3Vyc29yO3RoaXMuc2VsZWN0aW9uLmFkZFJhbmdlKGYpLGwmJnRoaXMuc2VsZWN0aW9uLnN1YnN0cmFjdFBvaW50KGwpfSx0aGlzLnRyYW5zcG9zZVNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLG49dC5tdWx0aVNlbGVjdCxyPW4ucmFuZ2VzO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KXt2YXIgcz1yW2ldO2lmKHMuaXNFbXB0eSgpKXt2YXIgbz10LmdldFdvcmRSYW5nZShzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbik7cy5zdGFydC5yb3c9by5zdGFydC5yb3cscy5zdGFydC5jb2x1bW49by5zdGFydC5jb2x1bW4scy5lbmQucm93PW8uZW5kLnJvdyxzLmVuZC5jb2x1bW49by5lbmQuY29sdW1ufX1uLm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKTt2YXIgdT1bXTtmb3IodmFyIGk9ci5sZW5ndGg7aS0tOyl7dmFyIHM9cltpXTt1LnVuc2hpZnQodC5nZXRUZXh0UmFuZ2UocykpfWU8MD91LnVuc2hpZnQodS5wb3AoKSk6dS5wdXNoKHUuc2hpZnQoKSk7Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspe3ZhciBzPXJbaV0sbz1zLmNsb25lKCk7dC5yZXBsYWNlKHMsdVtpXSkscy5zdGFydC5yb3c9by5zdGFydC5yb3cscy5zdGFydC5jb2x1bW49by5zdGFydC5jb2x1bW59bi5mcm9tT3JpZW50ZWRSYW5nZShuLnJhbmdlc1swXSl9LHRoaXMuc2VsZWN0TW9yZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5zZXNzaW9uLGk9ci5tdWx0aVNlbGVjdCxzPWkudG9PcmllbnRlZFJhbmdlKCk7aWYocy5pc0VtcHR5KCkpe3M9ci5nZXRXb3JkUmFuZ2Uocy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4pLHMuY3Vyc29yPWU9PS0xP3Muc3RhcnQ6cy5lbmQsdGhpcy5tdWx0aVNlbGVjdC5hZGRSYW5nZShzKTtpZihuKXJldHVybn12YXIgbz1yLmdldFRleHRSYW5nZShzKSx1PWgocixvLGUpO3UmJih1LmN1cnNvcj1lPT0tMT91LnN0YXJ0OnUuZW5kLHRoaXMuc2Vzc2lvbi51bmZvbGQodSksdGhpcy5tdWx0aVNlbGVjdC5hZGRSYW5nZSh1KSx0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpKSx0JiZ0aGlzLm11bHRpU2VsZWN0LnN1YnN0cmFjdFBvaW50KHMuY3Vyc29yKX0sdGhpcy5hbGlnbkN1cnNvcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD1lLm11bHRpU2VsZWN0LG49dC5yYW5nZXMscj0tMSxzPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKGUuY3Vyc29yLnJvdz09cilyZXR1cm4hMDtyPWUuY3Vyc29yLnJvd30pO2lmKCFuLmxlbmd0aHx8cy5sZW5ndGg9PW4ubGVuZ3RoLTEpe3ZhciBvPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCksdT1vLnN0YXJ0LnJvdyxmPW8uZW5kLnJvdyxsPXU9PWY7aWYobCl7dmFyIGM9dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLGg7ZG8gaD10aGlzLnNlc3Npb24uZ2V0TGluZShmKTt3aGlsZSgvWz06XS8udGVzdChoKSYmKytmPGMpO2RvIGg9dGhpcy5zZXNzaW9uLmdldExpbmUodSk7d2hpbGUoL1s9Ol0vLnRlc3QoaCkmJi0tdT4wKTt1PDAmJih1PTApLGY+PWMmJihmPWMtMSl9dmFyIHA9dGhpcy5zZXNzaW9uLnJlbW92ZUZ1bGxMaW5lcyh1LGYpO3A9dGhpcy4kcmVBbGlnblRleHQocCxsKSx0aGlzLnNlc3Npb24uaW5zZXJ0KHtyb3c6dSxjb2x1bW46MH0scC5qb2luKCJcbiIpKyJcbiIpLGx8fChvLnN0YXJ0LmNvbHVtbj0wLG8uZW5kLmNvbHVtbj1wW3AubGVuZ3RoLTFdLmxlbmd0aCksdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2Uobyl9ZWxzZXtzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5zdWJzdHJhY3RQb2ludChlLmN1cnNvcil9KTt2YXIgZD0wLHY9SW5maW5pdHksbT1uLm1hcChmdW5jdGlvbih0KXt2YXIgbj10LmN1cnNvcixyPWUuZ2V0TGluZShuLnJvdyksaT1yLnN1YnN0cihuLmNvbHVtbikuc2VhcmNoKC9cUy9nKTtyZXR1cm4gaT09LTEmJihpPTApLG4uY29sdW1uPmQmJihkPW4uY29sdW1uKSxpPHYmJih2PWkpLGl9KTtuLmZvckVhY2goZnVuY3Rpb24odCxuKXt2YXIgcj10LmN1cnNvcixzPWQtci5jb2x1bW4sbz1tW25dLXY7cz5vP2UuaW5zZXJ0KHIsYS5zdHJpbmdSZXBlYXQoIiAiLHMtbykpOmUucmVtb3ZlKG5ldyBpKHIucm93LHIuY29sdW1uLHIucm93LHIuY29sdW1uLXMrbykpLHQuc3RhcnQuY29sdW1uPXQuZW5kLmNvbHVtbj1kLHQuc3RhcnQucm93PXQuZW5kLnJvdz1yLnJvdyx0LmN1cnNvcj10LmVuZH0pLHQuZnJvbU9yaWVudGVkUmFuZ2UoblswXSksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9fSx0aGlzLiRyZUFsaWduVGV4dD1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHUoZSl7cmV0dXJuIGEuc3RyaW5nUmVwZWF0KCIgIixlKX1mdW5jdGlvbiBmKGUpe3JldHVybiBlWzJdP3UoaSkrZVsyXSt1KHMtZVsyXS5sZW5ndGgrbykrZVs0XS5yZXBsYWNlKC9eKFs9Ol0pXHMrLywiJDEgIik6ZVswXX1mdW5jdGlvbiBsKGUpe3JldHVybiBlWzJdP3UoaStzLWVbMl0ubGVuZ3RoKStlWzJdK3UobykrZVs0XS5yZXBsYWNlKC9eKFs9Ol0pXHMrLywiJDEgIik6ZVswXX1mdW5jdGlvbiBjKGUpe3JldHVybiBlWzJdP3UoaSkrZVsyXSt1KG8pK2VbNF0ucmVwbGFjZSgvXihbPTpdKVxzKy8sIiQxICIpOmVbMF19dmFyIG49ITAscj0hMCxpLHMsbztyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvKFxzKikoLio/KShccyopKFs9Ol0uKikvKTtyZXR1cm4gdD9pPT1udWxsPyhpPXRbMV0ubGVuZ3RoLHM9dFsyXS5sZW5ndGgsbz10WzNdLmxlbmd0aCx0KTooaStzK28hPXRbMV0ubGVuZ3RoK3RbMl0ubGVuZ3RoK3RbM10ubGVuZ3RoJiYocj0hMSksaSE9dFsxXS5sZW5ndGgmJihuPSExKSxpPnRbMV0ubGVuZ3RoJiYoaT10WzFdLmxlbmd0aCksczx0WzJdLmxlbmd0aCYmKHM9dFsyXS5sZW5ndGgpLG8+dFszXS5sZW5ndGgmJihvPXRbM10ubGVuZ3RoKSx0KTpbZV19KS5tYXAodD9mOm4/cj9sOmY6Yyl9fSkuY2FsbChkLnByb3RvdHlwZSksdC5vblNlc3Npb25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXNzaW9uO3QmJiF0Lm11bHRpU2VsZWN0JiYodC4kc2VsZWN0aW9uTWFya2Vycz1bXSx0LnNlbGVjdGlvbi4kaW5pdFJhbmdlTGlzdCgpLHQubXVsdGlTZWxlY3Q9dC5zZWxlY3Rpb24pLHRoaXMubXVsdGlTZWxlY3Q9dCYmdC5tdWx0aVNlbGVjdDt2YXIgbj1lLm9sZFNlc3Npb247biYmKG4ubXVsdGlTZWxlY3Qub2ZmKCJhZGRSYW5nZSIsdGhpcy4kb25BZGRSYW5nZSksbi5tdWx0aVNlbGVjdC5vZmYoInJlbW92ZVJhbmdlIix0aGlzLiRvblJlbW92ZVJhbmdlKSxuLm11bHRpU2VsZWN0Lm9mZigibXVsdGlTZWxlY3QiLHRoaXMuJG9uTXVsdGlTZWxlY3QpLG4ubXVsdGlTZWxlY3Qub2ZmKCJzaW5nbGVTZWxlY3QiLHRoaXMuJG9uU2luZ2xlU2VsZWN0KSxuLm11bHRpU2VsZWN0LmxlYWQub2ZmKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpLG4ubXVsdGlTZWxlY3QuYW5jaG9yLm9mZigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSksdCYmKHQubXVsdGlTZWxlY3Qub24oImFkZFJhbmdlIix0aGlzLiRvbkFkZFJhbmdlKSx0Lm11bHRpU2VsZWN0Lm9uKCJyZW1vdmVSYW5nZSIsdGhpcy4kb25SZW1vdmVSYW5nZSksdC5tdWx0aVNlbGVjdC5vbigibXVsdGlTZWxlY3QiLHRoaXMuJG9uTXVsdGlTZWxlY3QpLHQubXVsdGlTZWxlY3Qub24oInNpbmdsZVNlbGVjdCIsdGhpcy4kb25TaW5nbGVTZWxlY3QpLHQubXVsdGlTZWxlY3QubGVhZC5vbigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSx0Lm11bHRpU2VsZWN0LmFuY2hvci5vbigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSksdCYmdGhpcy5pbk11bHRpU2VsZWN0TW9kZSE9dC5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGUmJih0LnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZT90aGlzLiRvbk11bHRpU2VsZWN0KCk6dGhpcy4kb25TaW5nbGVTZWxlY3QoKSl9LHQuTXVsdGlTZWxlY3Q9bSxlKCIuL2NvbmZpZyIpLmRlZmluZU9wdGlvbnMoZC5wcm90b3R5cGUsImVkaXRvciIse2VuYWJsZU11bHRpc2VsZWN0OntzZXQ6ZnVuY3Rpb24oZSl7bSh0aGlzKSxlPyh0aGlzLm9uKCJjaGFuZ2VTZXNzaW9uIix0aGlzLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSksdGhpcy5vbigibW91c2Vkb3duIixvKSk6KHRoaXMub2ZmKCJjaGFuZ2VTZXNzaW9uIix0aGlzLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSksdGhpcy5vZmYoIm1vdXNlZG93biIsbykpfSx2YWx1ZTohMH0sZW5hYmxlQmxvY2tTZWxlY3Q6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRibG9ja1NlbGVjdEVuYWJsZWQ9ZX0sdmFsdWU6ITB9fSl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxpPXQuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OyhmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRMaW5lKG4pO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KHIpPyJzdGFydCI6dD09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChyKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPS9cUy8scz1lLmdldExpbmUodCksbz1zLnNlYXJjaChpKTtpZihvPT0tMSlyZXR1cm47dmFyIHU9bnx8cy5sZW5ndGgsYT1lLmdldExlbmd0aCgpLGY9dCxsPXQ7d2hpbGUoKyt0PGEpe3ZhciBjPWUuZ2V0TGluZSh0KS5zZWFyY2goaSk7aWYoYz09LTEpY29udGludWU7aWYoYzw9byl7dmFyIGg9ZS5nZXRUb2tlbkF0KHQsMCk7aWYoIWh8fGgudHlwZSE9PSJzdHJpbmciKWJyZWFrfWw9dH1pZihsPmYpe3ZhciBwPWUuZ2V0TGluZShsKS5sZW5ndGg7cmV0dXJuIG5ldyByKGYsdSxsLHApfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGUsdCxuLGkscyl7dmFyIG89e3JvdzpuLGNvbHVtbjppKzF9LHU9ZS4kZmluZENsb3NpbmdCcmFja2V0KHQsbyxzKTtpZighdSlyZXR1cm47dmFyIGE9ZS5mb2xkV2lkZ2V0c1t1LnJvd107cmV0dXJuIGE9PW51bGwmJihhPWUuZ2V0Rm9sZFdpZGdldCh1LnJvdykpLGE9PSJzdGFydCImJnUucm93Pm8ucm93JiYodS5yb3ctLSx1LmNvbHVtbj1lLmdldExpbmUodS5yb3cpLmxlbmd0aCksci5mcm9tUG9pbnRzKG8sdSl9LHRoaXMuY2xvc2luZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihlLHQsbixpLHMpe3ZhciBvPXtyb3c6bixjb2x1bW46aX0sdT1lLiRmaW5kT3BlbmluZ0JyYWNrZXQodCxvKTtpZighdSlyZXR1cm47cmV0dXJuIHUuY29sdW1uKyssby5jb2x1bW4tLSxyLmZyb21Qb2ludHModSxvKX19KS5jYWxsKGkucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS90aGVtZS90ZXh0bWF0ZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmlzRGFyaz0hMSx0LmNzc0NsYXNzPSJhY2UtdG0iLHQuY3NzVGV4dD0nLmFjZS10bSAuYWNlX2d1dHRlciB7YmFja2dyb3VuZDogI2YwZjBmMDtjb2xvcjogIzMzMzt9LmFjZS10bSAuYWNlX3ByaW50LW1hcmdpbiB7d2lkdGg6IDFweDtiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRtIC5hY2VfZm9sZCB7YmFja2dyb3VuZC1jb2xvcjogIzZCNzJFNjt9LmFjZS10bSB7YmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtjb2xvcjogYmxhY2s7fS5hY2UtdG0gLmFjZV9jdXJzb3Ige2NvbG9yOiBibGFjazt9LmFjZS10bSAuYWNlX2ludmlzaWJsZSB7Y29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS10bSAuYWNlX3N0b3JhZ2UsLmFjZS10bSAuYWNlX2tleXdvcmQge2NvbG9yOiBibHVlO30uYWNlLXRtIC5hY2VfY29uc3RhbnQge2NvbG9yOiByZ2IoMTk3LCA2LCAxMSk7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7Y29sb3I6IHJnYig4OCwgNzIsIDI0Nik7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge2NvbG9yOiByZ2IoODgsIDkyLCAyNDYpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge2NvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9pbnZhbGlkIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwgMC4xKTtjb2xvcjogcmVkO30uYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge2NvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge2NvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV90eXBlLC5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7Y29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTt9LmFjZS10bSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHtjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO30uYWNlLXRtIC5hY2Vfc3RyaW5nIHtjb2xvcjogcmdiKDMsIDEwNiwgNyk7fS5hY2UtdG0gLmFjZV9jb21tZW50IHtjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7fS5hY2UtdG0gLmFjZV9jb21tZW50LmFjZV9kb2Mge2NvbG9yOiByZ2IoMCwgMTAyLCAyNTUpO30uYWNlLXRtIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge2NvbG9yOiByZ2IoMTI4LCAxNTksIDE5MSk7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7Y29sb3I6IHJnYigwLCAwLCAyMDUpO30uYWNlLXRtIC5hY2VfdmFyaWFibGUge2NvbG9yOiByZ2IoNDksIDEzMiwgMTQ5KTt9LmFjZS10bSAuYWNlX3htbC1wZSB7Y29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7Y29sb3I6ICMwMDAwQTI7fS5hY2UtdG0gLmFjZV9oZWFkaW5nIHtjb2xvcjogcmdiKDEyLCA3LCAyNTUpO30uYWNlLXRtIC5hY2VfbGlzdCB7Y29sb3I6cmdiKDE4NSwgNiwgMTQ0KTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZyB7Y29sb3I6cmdiKDAsIDIyLCAxNDIpO30uYWNlLXRtIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7Y29sb3I6IHJnYigyNTUsIDAsIDApfS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge2JhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS10bS5hY2VfbXVsdGlzZWxlY3QgLmFjZV9zZWxlY3Rpb24uYWNlX3N0YXJ0IHtib3gtc2hhZG93OiAwIDAgM3B4IDBweCB3aGl0ZTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge2JhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7YmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7bWFyZ2luOiAtMXB4IDAgMCAtMXB4O2JvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZS1saW5lIHtiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO30uYWNlLXRtIC5hY2VfZ3V0dGVyLWFjdGl2ZS1saW5lIHtiYWNrZ3JvdW5kLWNvbG9yIDogI2RjZGNkYzt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkLXdvcmQge2JhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtdG0gLmFjZV9pbmRlbnQtZ3VpZGUge2JhY2tncm91bmQ6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFDQ0FZQUFBQ1pnYlluQUFBQUUwbEVRVlFJbVdQNC8vLy9mNGJMbHkvL0J3QW1WZ2QxL3cxMS9nQUFBQUJKUlU1RXJrSmdnZz09IikgcmlnaHQgcmVwZWF0LXk7fScsdC4kaWQ9ImFjZS90aGVtZS90ZXh0bWF0ZSI7dmFyIHI9ZSgiLi4vbGliL2RvbSIpO3IuaW1wb3J0Q3NzU3RyaW5nKHQuY3NzVGV4dCx0LmNzc0NsYXNzKX0pLGFjZS5kZWZpbmUoImFjZS9saW5lX3dpZGdldHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3RoaXMuc2Vzc2lvbj1lLHRoaXMuc2Vzc2lvbi53aWRnZXRNYW5hZ2VyPXRoaXMsdGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aD10aGlzLmdldFJvd0xlbmd0aCx0aGlzLnNlc3Npb24uJGdldFdpZGdldFNjcmVlbkxlbmd0aD10aGlzLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGgsdGhpcy51cGRhdGVPbkNoYW5nZT10aGlzLnVwZGF0ZU9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5yZW5kZXJXaWRnZXRzPXRoaXMucmVuZGVyV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMubWVhc3VyZVdpZGdldHM9dGhpcy5tZWFzdXJlV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHM9W10sdGhpcy4kb25DaGFuZ2VFZGl0b3I9dGhpcy4kb25DaGFuZ2VFZGl0b3IuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZSIsdGhpcy51cGRhdGVPbkNoYW5nZSksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VGb2xkIix0aGlzLnVwZGF0ZU9uRm9sZCksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VFZGl0b3IiLHRoaXMuJG9uQ2hhbmdlRWRpdG9yKX12YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlOyhmdW5jdGlvbigpe3RoaXMuZ2V0Um93TGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzLmxpbmVXaWRnZXRzP3Q9dGhpcy5saW5lV2lkZ2V0c1tlXSYmdGhpcy5saW5lV2lkZ2V0c1tlXS5yb3dDb3VudHx8MDp0PTAsIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbZV0/MSt0OnRoaXMuJHdyYXBEYXRhW2VdLmxlbmd0aCsxK3R9LHRoaXMuJGdldFdpZGdldFNjcmVlbkxlbmd0aD1mdW5jdGlvbigpe3ZhciBlPTA7cmV0dXJuIHRoaXMubGluZVdpZGdldHMuZm9yRWFjaChmdW5jdGlvbih0KXt0JiZ0LnJvd0NvdW50JiYhdC5oaWRkZW4mJihlKz10LnJvd0NvdW50KX0pLGV9LHRoaXMuJG9uQ2hhbmdlRWRpdG9yPWZ1bmN0aW9uKGUpe3RoaXMuYXR0YWNoKGUuZWRpdG9yKX0sdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7ZSYmZS53aWRnZXRNYW5hZ2VyJiZlLndpZGdldE1hbmFnZXIhPXRoaXMmJmUud2lkZ2V0TWFuYWdlci5kZXRhY2goKTtpZih0aGlzLmVkaXRvcj09ZSlyZXR1cm47dGhpcy5kZXRhY2goKSx0aGlzLmVkaXRvcj1lLGUmJihlLndpZGdldE1hbmFnZXI9dGhpcyxlLnJlbmRlcmVyLm9uKCJiZWZvcmVSZW5kZXIiLHRoaXMubWVhc3VyZVdpZGdldHMpLGUucmVuZGVyZXIub24oImFmdGVyUmVuZGVyIix0aGlzLnJlbmRlcldpZGdldHMpKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lZGl0b3I7aWYoIXQpcmV0dXJuO3RoaXMuZWRpdG9yPW51bGwsdC53aWRnZXRNYW5hZ2VyPW51bGwsdC5yZW5kZXJlci5vZmYoImJlZm9yZVJlbmRlciIsdGhpcy5tZWFzdXJlV2lkZ2V0cyksdC5yZW5kZXJlci5vZmYoImFmdGVyUmVuZGVyIix0aGlzLnJlbmRlcldpZGdldHMpO3ZhciBuPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztuJiZuLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmZS5lbCYmZS5lbC5wYXJlbnROb2RlJiYoZS5faW5Eb2N1bWVudD0hMSxlLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5lbCkpfSl9LHRoaXMudXBkYXRlT25Gb2xkPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5saW5lV2lkZ2V0cztpZighbnx8IWUuYWN0aW9uKXJldHVybjt2YXIgcj1lLmRhdGEsaT1yLnN0YXJ0LnJvdyxzPXIuZW5kLnJvdyxvPWUuYWN0aW9uPT0iYWRkIjtmb3IodmFyIHU9aSsxO3U8czt1Kyspblt1XSYmKG5bdV0uaGlkZGVuPW8pO25bc10mJihvP25baV0/bltzXS5oaWRkZW49bzpuW2ldPW5bc106KG5baV09PW5bc10mJihuW2ldPXVuZGVmaW5lZCksbltzXS5oaWRkZW49bykpfSx0aGlzLnVwZGF0ZU9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztpZighdClyZXR1cm47dmFyIG49ZS5zdGFydC5yb3cscj1lLmVuZC5yb3ctbjtpZihyIT09MClpZihlLmFjdGlvbj09InJlbW92ZSIpe3ZhciBpPXQuc3BsaWNlKG4rMSxyKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmdGhpcy5yZW1vdmVMaW5lV2lkZ2V0KGUpfSx0aGlzKSx0aGlzLiR1cGRhdGVSb3dzKCl9ZWxzZXt2YXIgcz1uZXcgQXJyYXkocik7cy51bnNoaWZ0KG4sMCksdC5zcGxpY2UuYXBwbHkodCxzKSx0aGlzLiR1cGRhdGVSb3dzKCl9fSx0aGlzLiR1cGRhdGVSb3dzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2lmKCFlKXJldHVybjt2YXIgdD0hMDtlLmZvckVhY2goZnVuY3Rpb24oZSxuKXtpZihlKXt0PSExLGUucm93PW47d2hpbGUoZS4kb2xkV2lkZ2V0KWUuJG9sZFdpZGdldC5yb3c9bixlPWUuJG9sZFdpZGdldH19KSx0JiYodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzPW51bGwpfSx0aGlzLmFkZExpbmVXaWRnZXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzfHwodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzPW5ldyBBcnJheSh0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCkpKTt2YXIgdD10aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddO3QmJihlLiRvbGRXaWRnZXQ9dCx0LmVsJiZ0LmVsLnBhcmVudE5vZGUmJih0LmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5lbCksdC5faW5Eb2N1bWVudD0hMSkpLHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd109ZSxlLnNlc3Npb249dGhpcy5zZXNzaW9uO3ZhciBuPXRoaXMuZWRpdG9yLnJlbmRlcmVyO2UuaHRtbCYmIWUuZWwmJihlLmVsPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5lbC5pbm5lckhUTUw9ZS5odG1sKSxlLmVsJiYoaS5hZGRDc3NDbGFzcyhlLmVsLCJhY2VfbGluZVdpZGdldENvbnRhaW5lciIpLGUuZWwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLmVsLnN0eWxlLnpJbmRleD01LG4uY29udGFpbmVyLmFwcGVuZENoaWxkKGUuZWwpLGUuX2luRG9jdW1lbnQ9ITApLGUuY292ZXJHdXR0ZXJ8fChlLmVsLnN0eWxlLnpJbmRleD0zKSxlLnBpeGVsSGVpZ2h0PT1udWxsJiYoZS5waXhlbEhlaWdodD1lLmVsLm9mZnNldEhlaWdodCksZS5yb3dDb3VudD09bnVsbCYmKGUucm93Q291bnQ9ZS5waXhlbEhlaWdodC9uLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpO3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZS5yb3csMCk7ZS4kZm9sZD1yO2lmKHIpe3ZhciBzPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztlLnJvdz09ci5lbmQucm93JiYhc1tyLnN0YXJ0LnJvd10/c1tyLnN0YXJ0LnJvd109ZTplLmhpZGRlbj0hMH1yZXR1cm4gdGhpcy5zZXNzaW9uLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTp7c3RhcnQ6e3JvdzplLnJvd319fSksdGhpcy4kdXBkYXRlUm93cygpLHRoaXMucmVuZGVyV2lkZ2V0cyhudWxsLG4pLHRoaXMub25XaWRnZXRDaGFuZ2VkKGUpLGV9LHRoaXMucmVtb3ZlTGluZVdpZGdldD1mdW5jdGlvbihlKXtlLl9pbkRvY3VtZW50PSExLGUuc2Vzc2lvbj1udWxsLGUuZWwmJmUuZWwucGFyZW50Tm9kZSYmZS5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuZWwpO2lmKGUuZWRpdG9yJiZlLmVkaXRvci5kZXN0cm95KXRyeXtlLmVkaXRvci5kZXN0cm95KCl9Y2F0Y2godCl7fWlmKHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cyl7dmFyIG49dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XTtpZihuPT1lKXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd109ZS4kb2xkV2lkZ2V0LGUuJG9sZFdpZGdldCYmdGhpcy5vbldpZGdldENoYW5nZWQoZS4kb2xkV2lkZ2V0KTtlbHNlIHdoaWxlKG4pe2lmKG4uJG9sZFdpZGdldD09ZSl7bi4kb2xkV2lkZ2V0PWUuJG9sZFdpZGdldDticmVha31uPW4uJG9sZFdpZGdldH19dGhpcy5zZXNzaW9uLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTp7c3RhcnQ6e3JvdzplLnJvd319fSksdGhpcy4kdXBkYXRlUm93cygpfSx0aGlzLmdldFdpZGdldHNBdFJvdz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24ubGluZVdpZGdldHMsbj10JiZ0W2VdLHI9W107d2hpbGUobilyLnB1c2gobiksbj1uLiRvbGRXaWRnZXQ7cmV0dXJuIHJ9LHRoaXMub25XaWRnZXRDaGFuZ2VkPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHMucHVzaChlKSx0aGlzLmVkaXRvciYmdGhpcy5lZGl0b3IucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLm1lYXN1cmVXaWRnZXRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cyxyPXQubGF5ZXJDb25maWc7aWYoIW58fCFuLmxlbmd0aClyZXR1cm47dmFyIGk9SW5maW5pdHk7Zm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspe3ZhciBvPW5bc107aWYoIW98fCFvLmVsKWNvbnRpbnVlO2lmKG8uc2Vzc2lvbiE9dGhpcy5zZXNzaW9uKWNvbnRpbnVlO2lmKCFvLl9pbkRvY3VtZW50KXtpZih0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbby5yb3ddIT1vKWNvbnRpbnVlO28uX2luRG9jdW1lbnQ9ITAsdC5jb250YWluZXIuYXBwZW5kQ2hpbGQoby5lbCl9by5oPW8uZWwub2Zmc2V0SGVpZ2h0LG8uZml4ZWRXaWR0aHx8KG8udz1vLmVsLm9mZnNldFdpZHRoLG8uc2NyZWVuV2lkdGg9TWF0aC5jZWlsKG8udy9yLmNoYXJhY3RlcldpZHRoKSk7dmFyIHU9by5oL3IubGluZUhlaWdodDtvLmNvdmVyTGluZSYmKHUtPXRoaXMuc2Vzc2lvbi5nZXRSb3dMaW5lQ291bnQoby5yb3cpLHU8MCYmKHU9MCkpLG8ucm93Q291bnQhPXUmJihvLnJvd0NvdW50PXUsby5yb3c8aSYmKGk9by5yb3cpKX1pIT1JbmZpbml0eSYmKHRoaXMuc2Vzc2lvbi5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6e3N0YXJ0Ontyb3c6aX19fSksdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRXaWR0aD1udWxsKSx0aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzPVtdfSx0aGlzLnJlbmRlcldpZGdldHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmxheWVyQ29uZmlnLHI9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2lmKCFyKXJldHVybjt2YXIgaT1NYXRoLm1pbih0aGlzLmZpcnN0Um93LG4uZmlyc3RSb3cpLHM9TWF0aC5tYXgodGhpcy5sYXN0Um93LG4ubGFzdFJvdyxyLmxlbmd0aCk7d2hpbGUoaT4wJiYhcltpXSlpLS07dGhpcy5maXJzdFJvdz1uLmZpcnN0Um93LHRoaXMubGFzdFJvdz1uLmxhc3RSb3csdC4kY3Vyc29yTGF5ZXIuY29uZmlnPW47Zm9yKHZhciBvPWk7bzw9cztvKyspe3ZhciB1PXJbb107aWYoIXV8fCF1LmVsKWNvbnRpbnVlO2lmKHUuaGlkZGVuKXt1LmVsLnN0eWxlLnRvcD0tMTAwLSh1LnBpeGVsSGVpZ2h0fHwwKSsicHgiO2NvbnRpbnVlfXUuX2luRG9jdW1lbnR8fCh1Ll9pbkRvY3VtZW50PSEwLHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHUuZWwpKTt2YXIgYT10LiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6byxjb2x1bW46MH0sITApLnRvcDt1LmNvdmVyTGluZXx8KGErPW4ubGluZUhlaWdodCp0aGlzLnNlc3Npb24uZ2V0Um93TGluZUNvdW50KHUucm93KSksdS5lbC5zdHlsZS50b3A9YS1uLm9mZnNldCsicHgiO3ZhciBmPXUuY292ZXJHdXR0ZXI/MDp0Lmd1dHRlcldpZHRoO3UuZml4ZWRXaWR0aHx8KGYtPXQuc2Nyb2xsTGVmdCksdS5lbC5zdHlsZS5sZWZ0PWYrInB4Iix1LmZ1bGxXaWR0aCYmdS5zY3JlZW5XaWR0aCYmKHUuZWwuc3R5bGUubWluV2lkdGg9bi53aWR0aCsyKm4ucGFkZGluZysicHgiKSx1LmZpeGVkV2lkdGg/dS5lbC5zdHlsZS5yaWdodD10LnNjcm9sbEJhci5nZXRXaWR0aCgpKyJweCI6dS5lbC5zdHlsZS5yaWdodD0iIn19fSkuY2FsbChvLnByb3RvdHlwZSksdC5MaW5lV2lkZ2V0cz1vfSksYWNlLmRlZmluZSgiYWNlL2V4dC9lcnJvcl9tYXJrZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGluZV93aWRnZXRzIiwiYWNlL2xpYi9kb20iLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0LG4pe3ZhciByPTAsaT1lLmxlbmd0aC0xO3doaWxlKHI8PWkpe3ZhciBzPXIraT4+MSxvPW4odCxlW3NdKTtpZihvPjApcj1zKzE7ZWxzZXtpZighKG88MCkpcmV0dXJuIHM7aT1zLTF9fXJldHVybi0ocisxKX1mdW5jdGlvbiB1KGUsdCxuKXt2YXIgcj1lLmdldEFubm90YXRpb25zKCkuc29ydChzLmNvbXBhcmVQb2ludHMpO2lmKCFyLmxlbmd0aClyZXR1cm47dmFyIGk9byhyLHtyb3c6dCxjb2x1bW46LTF9LHMuY29tcGFyZVBvaW50cyk7aTwwJiYoaT0taS0xKSxpPj1yLmxlbmd0aD9pPW4+MD8wOnIubGVuZ3RoLTE6aT09PTAmJm48MCYmKGk9ci5sZW5ndGgtMSk7dmFyIHU9cltpXTtpZighdXx8IW4pcmV0dXJuO2lmKHUucm93PT09dCl7ZG8gdT1yW2krPW5dO3doaWxlKHUmJnUucm93PT09dCk7aWYoIXUpcmV0dXJuIHIuc2xpY2UoKX12YXIgYT1bXTt0PXUucm93O2RvIGFbbjwwPyJ1bnNoaWZ0IjoicHVzaCJdKHUpLHU9cltpKz1uXTt3aGlsZSh1JiZ1LnJvdz09dCk7cmV0dXJuIGEubGVuZ3RoJiZhfXZhciByPWUoIi4uL2xpbmVfd2lkZ2V0cyIpLkxpbmVXaWRnZXRzLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZSgiLi4vcmFuZ2UiKS5SYW5nZTt0LnNob3dFcnJvck1hcmtlcj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuc2Vzc2lvbjtuLndpZGdldE1hbmFnZXJ8fChuLndpZGdldE1hbmFnZXI9bmV3IHIobiksbi53aWRnZXRNYW5hZ2VyLmF0dGFjaChlKSk7dmFyIHM9ZS5nZXRDdXJzb3JQb3NpdGlvbigpLG89cy5yb3csYT1uLndpZGdldE1hbmFnZXIuZ2V0V2lkZ2V0c0F0Um93KG8pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT0iZXJyb3JNYXJrZXIifSlbMF07YT9hLmRlc3Ryb3koKTpvLT10O3ZhciBmPXUobixvLHQpLGw7aWYoZil7dmFyIGM9ZlswXTtzLmNvbHVtbj0oYy5wb3MmJnR5cGVvZiBjLmNvbHVtbiE9Im51bWJlciI/Yy5wb3Muc2M6Yy5jb2x1bW4pfHwwLHMucm93PWMucm93LGw9ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJGFubm90YXRpb25zW3Mucm93XX1lbHNle2lmKGEpcmV0dXJuO2w9e3RleHQ6WyJMb29rcyBnb29kISJdLGNsYXNzTmFtZToiYWNlX29rIn19ZS5zZXNzaW9uLnVuZm9sZChzLnJvdyksZS5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24ocyk7dmFyIGg9e3JvdzpzLnJvdyxmaXhlZFdpZHRoOiEwLGNvdmVyR3V0dGVyOiEwLGVsOmkuY3JlYXRlRWxlbWVudCgiZGl2IiksdHlwZToiZXJyb3JNYXJrZXIifSxwPWguZWwuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSksZD1oLmVsLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpO2QuY2xhc3NOYW1lPSJlcnJvcl93aWRnZXRfYXJyb3cgIitsLmNsYXNzTmFtZTt2YXIgdj1lLnJlbmRlcmVyLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHMpLmxlZnQ7ZC5zdHlsZS5sZWZ0PXYrZS5yZW5kZXJlci5ndXR0ZXJXaWR0aC01KyJweCIsaC5lbC5jbGFzc05hbWU9ImVycm9yX3dpZGdldF93cmFwcGVyIixwLmNsYXNzTmFtZT0iZXJyb3Jfd2lkZ2V0ICIrbC5jbGFzc05hbWUscC5pbm5lckhUTUw9bC50ZXh0LmpvaW4oIjxicj4iKSxwLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpO3ZhciBtPWZ1bmN0aW9uKGUsdCxuKXtpZih0PT09MCYmKG49PT0iZXNjInx8bj09PSJyZXR1cm4iKSlyZXR1cm4gaC5kZXN0cm95KCkse2NvbW1hbmQ6Im51bGwifX07aC5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoZS4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkKXJldHVybjtlLmtleUJpbmRpbmcucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKG0pLG4ud2lkZ2V0TWFuYWdlci5yZW1vdmVMaW5lV2lkZ2V0KGgpLGUub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLGguZGVzdHJveSksZS5vZmYoImNoYW5nZVNlc3Npb24iLGguZGVzdHJveSksZS5vZmYoIm1vdXNldXAiLGguZGVzdHJveSksZS5vZmYoImNoYW5nZSIsaC5kZXN0cm95KX0sZS5rZXlCaW5kaW5nLmFkZEtleWJvYXJkSGFuZGxlcihtKSxlLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLGguZGVzdHJveSksZS5vbigiY2hhbmdlU2Vzc2lvbiIsaC5kZXN0cm95KSxlLm9uKCJtb3VzZXVwIixoLmRlc3Ryb3kpLGUub24oImNoYW5nZSIsaC5kZXN0cm95KSxlLnNlc3Npb24ud2lkZ2V0TWFuYWdlci5hZGRMaW5lV2lkZ2V0KGgpLGguZWwub25tb3VzZWRvd249ZS5mb2N1cy5iaW5kKGUpLGUucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSx7Ym90dG9tOmguZWwub2Zmc2V0SGVpZ2h0fSl9LGkuaW1wb3J0Q3NzU3RyaW5nKCIgICAgLmVycm9yX3dpZGdldF93cmFwcGVyIHsgICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7ICAgICAgICBjb2xvcjogaW5oZXJpdDsgICAgICAgIGJvcmRlcjpub25lICAgIH0gICAgLmVycm9yX3dpZGdldCB7ICAgICAgICBib3JkZXItdG9wOiBzb2xpZCAycHg7ICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAycHg7ICAgICAgICBtYXJnaW46IDVweCAwOyAgICAgICAgcGFkZGluZzogMTBweCA0MHB4OyAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX2Vycm9yLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV9lcnJvcnsgICAgICAgIGJvcmRlci1jb2xvcjogI2ZmNWE1YSAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX3dhcm5pbmcsIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX3dhcm5pbmd7ICAgICAgICBib3JkZXItY29sb3I6ICNGMUQ4MTcgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV9pbmZvLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV9pbmZveyAgICAgICAgYm9yZGVyLWNvbG9yOiAjNWE1YTVhICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2Vfb2ssIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX29reyAgICAgICAgYm9yZGVyLWNvbG9yOiAjNWFhYTVhICAgIH0gICAgLmVycm9yX3dpZGdldF9hcnJvdyB7ICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7ICAgICAgICBib3JkZXI6IHNvbGlkIDVweDsgICAgICAgIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDsgICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQhaW1wb3J0YW50OyAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDsgICAgICAgIHRvcDogLTVweDsgICAgfSIsIiIpfSksYWNlLmRlZmluZSgiYWNlL2FjZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvcmFuZ2UiLCJhY2UvZWRpdG9yIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS91bmRvbWFuYWdlciIsImFjZS92aXJ0dWFsX3JlbmRlcmVyIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciIsImFjZS9wbGFjZWhvbGRlciIsImFjZS9tdWx0aV9zZWxlY3QiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90aGVtZS90ZXh0bWF0ZSIsImFjZS9leHQvZXJyb3JfbWFya2VyIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTt2YXIgcj1lKCIuL2xpYi9kb20iKSxpPWUoIi4vbGliL2V2ZW50Iikscz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1lKCIuL2VkaXRvciIpLkVkaXRvcix1PWUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb24sYT1lKCIuL3VuZG9tYW5hZ2VyIikuVW5kb01hbmFnZXIsZj1lKCIuL3ZpcnR1YWxfcmVuZGVyZXIiKS5WaXJ0dWFsUmVuZGVyZXI7ZSgiLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLGUoIi4va2V5Ym9hcmQvaGFzaF9oYW5kbGVyIiksZSgiLi9wbGFjZWhvbGRlciIpLGUoIi4vbXVsdGlfc2VsZWN0IiksZSgiLi9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiksZSgiLi90aGVtZS90ZXh0bWF0ZSIpLGUoIi4vZXh0L2Vycm9yX21hcmtlciIpLHQuY29uZmlnPWUoIi4vY29uZmlnIiksdC5yZXF1aXJlPWUsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmKHQuZGVmaW5lPWRlZmluZSksdC5lZGl0PWZ1bmN0aW9uKGUsbil7aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgcz1lO2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocyk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJhY2UuZWRpdCBjYW4ndCBmaW5kIGRpdiAjIitzKX1pZihlJiZlLmVudiYmZS5lbnYuZWRpdG9yIGluc3RhbmNlb2YgbylyZXR1cm4gZS5lbnYuZWRpdG9yO3ZhciB1PSIiO2lmKGUmJi9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZS50YWdOYW1lKSl7dmFyIGE9ZTt1PWEudmFsdWUsZT1yLmNyZWF0ZUVsZW1lbnQoInByZSIpLGEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSxhKX1lbHNlIGUmJih1PWUudGV4dENvbnRlbnQsZS5pbm5lckhUTUw9IiIpO3ZhciBsPXQuY3JlYXRlRWRpdFNlc3Npb24odSksYz1uZXcgbyhuZXcgZihlKSxsLG4pLGg9e2RvY3VtZW50OmwsZWRpdG9yOmMsb25SZXNpemU6Yy5yZXNpemUuYmluZChjLG51bGwpfTtyZXR1cm4gYSYmKGgudGV4dGFyZWE9YSksaS5hZGRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsaC5vblJlc2l6ZSksYy5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtpLnJlbW92ZUxpc3RlbmVyKHdpbmRvdywicmVzaXplIixoLm9uUmVzaXplKSxoLmVkaXRvci5jb250YWluZXIuZW52PW51bGx9KSxjLmNvbnRhaW5lci5lbnY9Yy5lbnY9aCxjfSx0LmNyZWF0ZUVkaXRTZXNzaW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHUoZSx0KTtyZXR1cm4gbi5zZXRVbmRvTWFuYWdlcihuZXcgYSksbn0sdC5SYW5nZT1zLHQuRWRpdG9yPW8sdC5FZGl0U2Vzc2lvbj11LHQuVW5kb01hbmFnZXI9YSx0LlZpcnR1YWxSZW5kZXJlcj1mLHQudmVyc2lvbj10LmNvbmZpZy52ZXJzaW9ufSk7ICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgYWNlLnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmNvbmZpZy5pbml0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmRlZmluZSA9IGFjZS5kZWZpbmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IGE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlWyJkZWZhdWx0Il0gPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiICYmIHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICB9OwogICAg0LzRg9GA0L7QvC7RgdGC0LDRgNGCLtC/0L7QtNC/0LjRgdCw0YLRjCjQstCy0LXRgdGC0LhBQ0UpOwp9", +], + +[ +"ace-режим-js", +"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDQstCy0LXRgdGC0LjQoNC10LbQuNC8SmF2YVNjcmlwdCgpCiAgICB7CiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlLWJ1aWxkcy9ibG9iL21hc3Rlci9zcmMtbWluLW5vY29uZmxpY3QvbW9kZS1qYXZhc2NyaXB0LmpzCmFjZS5kZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMscz1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHMuZ2V0VGFnUnVsZSgpLHtkZWZhdWx0VG9rZW46ImNvbW1lbnQuZG9jIixjYXNlSW5zZW5zaXRpdmU6ITB9XX19O3IuaW5oZXJpdHMocyxpKSxzLmdldFRhZ1J1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYy50YWcuc3RvcmFnZS50eXBlIixyZWdleDoiXFxiKD86VE9ET3xGSVhNRXxYWFh8SEFDSylcXGIifX0scy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6ZX19LHMuZ2V0RW5kUnVsZT1mdW5jdGlvbihlKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixyZWdleDoiXFwqXFwvIixuZXh0OmV9fSx0LkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcz1zfSksYWNlLmRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7dmFyIGU9by5yZXBsYWNlKCJcXGQiLCJcXGRcXC0iKSx0PXtvbk1hdGNoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNoYXJBdCgxKT09Ii8iPzI6MTtpZihyPT0xKXQhPXRoaXMubmV4dFN0YXRlP24udW5zaGlmdCh0aGlzLm5leHQsdGhpcy5uZXh0U3RhdGUsMCk6bi51bnNoaWZ0KHRoaXMubmV4dCksblsyXSsrO2Vsc2UgaWYocj09MiYmdD09dGhpcy5uZXh0U3RhdGUpe25bMV0tLTtpZighblsxXXx8blsxXTwwKW4uc2hpZnQoKSxuLnNoaWZ0KCl9cmV0dXJuW3t0eXBlOiJtZXRhLnRhZy5wdW5jdHVhdGlvbi4iKyhyPT0xPyIiOiJlbmQtIikrInRhZy1vcGVuLnhtbCIsdmFsdWU6ZS5zbGljZSgwLHIpfSx7dHlwZToibWV0YS50YWcudGFnLW5hbWUueG1sIix2YWx1ZTplLnN1YnN0cihyKX1dfSxyZWdleDoiPC8/IitlKyIiLG5leHQ6ImpzeEF0dHJpYnV0ZXMiLG5leHRTdGF0ZToianN4In07dGhpcy4kcnVsZXMuc3RhcnQudW5zaGlmdCh0KTt2YXIgbj17cmVnZXg6InsiLHRva2VuOiJwYXJlbi5xdWFzaS5zdGFydCIscHVzaDoic3RhcnQifTt0aGlzLiRydWxlcy5qc3g9W24sdCx7aW5jbHVkZToicmVmZXJlbmNlIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nIn1dLHRoaXMuJHJ1bGVzLmpzeEF0dHJpYnV0ZXM9W3t0b2tlbjoibWV0YS50YWcucHVuY3R1YXRpb24udGFnLWNsb3NlLnhtbCIscmVnZXg6Ii8/PiIsb25NYXRjaDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PW5bMF0mJm4uc2hpZnQoKSxlLmxlbmd0aD09MiYmKG5bMF09PXRoaXMubmV4dFN0YXRlJiZuWzFdLS0sKCFuWzFdfHxuWzFdPDApJiZuLnNwbGljZSgwLDIpKSx0aGlzLm5leHQ9blswXXx8InN0YXJ0Iixbe3R5cGU6dGhpcy50b2tlbix2YWx1ZTplfV19LG5leHRTdGF0ZToianN4In0sbixmKCJqc3hBdHRyaWJ1dGVzIikse3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUueG1sIixyZWdleDplfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IuYXR0cmlidXRlLWVxdWFscy54bWwiLHJlZ2V4OiI9In0se3Rva2VuOiJ0ZXh0LnRhZy13aGl0ZXNwYWNlLnhtbCIscmVnZXg6IlxccysifSx7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDoiJyIsc3RhdGVOYW1lOiJqc3hfYXR0cl9xIixwdXNoOlt7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDoiJyIsbmV4dDoicG9wIn0se2luY2x1ZGU6InJlZmVyZW5jZSJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIn1dfSx7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDonIicsc3RhdGVOYW1lOiJqc3hfYXR0cl9xcSIscHVzaDpbe3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6JyInLG5leHQ6InBvcCJ9LHtpbmNsdWRlOiJyZWZlcmVuY2UifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCJ9XX0sdF0sdGhpcy4kcnVsZXMucmVmZXJlbmNlPVt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZS5yZWZlcmVuY2UueG1sIixyZWdleDoiKD86JiNbMC05XSs7KXwoPzomI3hbMC05YS1mQS1GXSs7KXwoPzomW2EtekEtWjAtOV86XFwuLV0rOykifV19ZnVuY3Rpb24gZihlKXtyZXR1cm5be3Rva2VuOiJjb21tZW50IixyZWdleDovXC9cKi8sbmV4dDpbaS5nZXRUYWdSdWxlKCkse3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwqXFwvIixuZXh0OmV8fCJwb3AifSx7ZGVmYXVsdFRva2VuOiJjb21tZW50IixjYXNlSW5zZW5zaXRpdmU6ITB9XX0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvIixuZXh0OltpLmdldFRhZ1J1bGUoKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIkfF4iLG5leHQ6ZXx8InBvcCJ9LHtkZWZhdWx0VG9rZW46ImNvbW1lbnQiLGNhc2VJbnNlbnNpdGl2ZTohMH1dfV19dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMscz1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLG89IlthLXpBLVpcXCRfXHUwMGExLVx1ZmZmZl1bYS16QS1aXFxkXFwkX1x1MDBhMS1cdWZmZmZdKiIsdT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNyZWF0ZUtleXdvcmRNYXBwZXIoeyJ2YXJpYWJsZS5sYW5ndWFnZSI6IkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIsa2V5d29yZDoiY29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXR8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufG9mfGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8ZGVidWdnZXJ8X19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19ffGNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIiwic3RvcmFnZS50eXBlIjoiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIsImNvbnN0YW50Lmxhbmd1YWdlIjoibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIiwic3VwcG9ydC5mdW5jdGlvbiI6ImFsZXJ0IiwiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiI6InRydWV8ZmFsc2UifSwiaWRlbnRpZmllciIpLG49ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGR8dm9pZCIscj0iXFxcXCg/OnhbMC05YS1mQS1GXXsyfXx1WzAtOWEtZkEtRl17NH18dXtbMC05YS1mQS1GXXsxLDZ9fXxbMC0yXVswLTddezAsMn18M1swLTddWzAtN10/fFs0LTddWzAtN10/fC4pIjt0aGlzLiRydWxlcz17bm9fcmVnZXg6W2kuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSxmKCJub19yZWdleCIpLHt0b2tlbjoic3RyaW5nIixyZWdleDoiJyg/PS4pIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiciKD89LiknLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDovMCg/Olt4WF1bMC05YS1mQS1GXSt8W29PXVswLTddK3xbYkJdWzAxXSspXGIvfSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4Oi8oPzpcZFxkKig/OlwuXGQqKT98XC5cZCspKD86W2VFXVsrLV0/XGQrXGIpPy99LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwic3VwcG9ydC5mdW5jdGlvbiIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciJdLHJlZ2V4OiIoIitvKyIpKFxcLikocHJvdG90eXBlKShcXC4pKCIrbysiKShcXHMqKSg9KSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJrZXl3b3JkLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXC4pKCIrbysiKShcXHMqKSg9KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyspKFxcdyspKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK28rIikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxccyopKDopKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJ0ZXh0IiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKDopKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJmcm9tKD89XFxzKignfFwiKSkifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIoPzoiK24rIilcXGIiLG5leHQ6InN0YXJ0In0se3Rva2VuOlsic3VwcG9ydC5jb25zdGFudCJdLHJlZ2V4Oi90aGF0XGIvfSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsInN1cHBvcnQuZnVuY3Rpb24uZmlyZWJ1ZyJdLHJlZ2V4Oi8oY29uc29sZSkoXC4pKHdhcm58aW5mb3xsb2d8ZXJyb3J8dGltZXx0cmFjZXx0aW1lRW5kfGFzc2VydClcYi99LHt0b2tlbjp0LHJlZ2V4Om99LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4Oi9bLl0oPyFbLl0pLyxuZXh0OiJwcm9wZXJ0eSJ9LHt0b2tlbjoic3RvcmFnZS50eXBlIixyZWdleDovPT4vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDovLS18XCtcK3xcLnszfXw9PT18PT18PXwhPXwhPT18PCs9P3w+Kz0/fCF8JiZ8XHxcfHxcPzp8WyEkJSYqK1wtflwvXl09Py8sbmV4dDoic3RhcnQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDovWz86LDsuXS8sbmV4dDoic3RhcnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6L1tcWyh7XS8sbmV4dDoic3RhcnQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6L1tcXSl9XS99LHt0b2tlbjoiY29tbWVudCIscmVnZXg6L14jIS4qJC99XSxwcm9wZXJ0eTpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKD86KFxccyspKFxcdyspKT8oXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6L1suXSg/IVsuXSkvfSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4Oi8ocyg/OmgoPzppZnR8b3coPzpNb2QoPzplbGVzc0RpYWxvZ3xhbERpYWxvZyl8SGVscCkpfGNyb2xsKD86WHxCeSg/OlBhZ2VzfExpbmVzKT98WXxUbyk/fHQoPzpvcHxyaWtlKXxpKD86bnx6ZVRvQ29udGVudHxkZWJhcnxnblRleHQpfG9ydHx1KD86cHxiKD86c3RyKD86aW5nKT8pPyl8cGxpKD86Y2V8dCl8ZSg/Om5kfHQoPzpSZSg/OnNpemFibGV8cXVlc3RIZWFkZXIpfE0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIbyg/OnRLZXlzfHVycyl8WWVhcnxDdXJzb3J8VGltZSg/Om91dCk/fEludGVydmFsfFpPcHRpb25zfERhdGV8VVRDKD86TSg/OmkoPzpudXRlc3xsbGlzZWNvbmRzKXxvbnRoKXxTZWNvbmRzfEhvdXJzfERhdGV8RnVsbFllYXIpfEZ1bGxZZWFyfEFjdGl2ZSl8YXJjaCl8cXJ0fGxpY2V8YXZlUHJlZmVyZW5jZXN8bWFsbCl8aCg/Om9tZXxhbmRsZUV2ZW50KXxuYXZpZ2F0ZXxjKD86aGFyKD86Q29kZUF0fEF0KXxvKD86c3xuKD86Y2F0fHRleHR1YWx8ZmlybSl8bXBpbGUpfGVpbHxsZWFyKD86VGltZW91dHxJbnRlcnZhbCk/fGEoPzpwdHVyZUV2ZW50c3xsbCl8cmVhdGUoPzpTdHlsZVNoZWV0fFBvcHVwfEV2ZW50T2JqZWN0KSl8dCg/Om8oPzpHTVRTdHJpbmd8Uyg/OnRyaW5nfG91cmNlKXxVKD86VENTdHJpbmd8cHBlckNhc2UpfExvKD86Y2FsZVN0cmluZ3x3ZXJDYXNlKSl8ZXN0fGEoPzpufGludCg/OkVuYWJsZWQpPykpfGkoPzpzKD86TmFOfEZpbml0ZSl8bmRleE9mfHRhbGljcyl8ZCg/OmlzYWJsZUV4dGVybmFsQ2FwdHVyZXx1bXB8ZXRhY2hFdmVudCl8dSg/Om4oPzpzaGlmdHx0YWludHxlc2NhcGV8d2F0Y2gpfHBkYXRlQ29tbWFuZHMpfGooPzpvaW58YXZhRW5hYmxlZCl8cCg/Om8oPzpwfHcpfHVzaHxsdWdpbnMucmVmcmVzaHxhKD86ZGRpbmdzfHJzZSg/OkludHxGbG9hdCk/KXxyKD86aW50fG9tcHR8ZWZlcmVuY2UpKXxlKD86c2NhcGV8bmFibGVFeHRlcm5hbENhcHR1cmV8dmFsfGxlbWVudEZyb21Qb2ludHx4KD86cHxlYyg/OlNjcmlwdHxDb21tYW5kKT8pKXx2YWx1ZU9mfFVUQ3xxdWVyeUNvbW1hbmQoPzpTdGF0ZXxJbmRldGVybXxFbmFibGVkfFZhbHVlKXxmKD86aSg/Om5kfGxlKD86TW9kaWZpZWREYXRlfFNpemV8Q3JlYXRlZERhdGV8VXBkYXRlZERhdGUpfHhlZCl8byg/Om50KD86c2l6ZXxjb2xvcil8cndhcmQpfGxvb3J8cm9tQ2hhckNvZGUpfHdhdGNofGwoPzppbmt8byg/OmFkfGcpfGFzdEluZGV4T2YpfGEoPzpzaW58bmNob3J8Y29zfHQoPzp0YWNoRXZlbnR8b2J8YW4oPzoyKT8pfHBwbHl8bGVydHxiKD86c3xvcnQpKXxyKD86b3UoPzpuZHx0ZUV2ZW50cyl8ZSg/OnNpemUoPzpCeXxUbyl8Y2FsY3x0dXJuVmFsdWV8cGxhY2V8dmVyc2V8bCg/Om9hZHxlYXNlKD86Q2FwdHVyZXxFdmVudHMpKSl8YW5kb20pfGcoPzpvfGV0KD86UmVzcG9uc2VIZWFkZXJ8TSg/OmkoPzpudXRlc3xsbGlzZWNvbmRzKXxvbnRoKXxTZSg/OmNvbmRzfGxlY3Rpb24pfEhvdXJzfFllYXJ8VGltZSg/OnpvbmVPZmZzZXQpP3xEYSg/Onl8dGUpfFVUQyg/Ok0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIb3Vyc3xEYSg/Onl8dGUpfEZ1bGxZZWFyKXxGdWxsWWVhcnxBKD86dHRlbnRpb258bGxSZXNwb25zZUhlYWRlcnMpKSl8bSg/OmlufG92ZSg/OkIoPzp5fGVsb3cpfFRvKD86QWJzb2x1dGUpP3xBYm92ZSl8ZXJnZUF0dHJpYnV0ZXN8YSg/OnRjaHxyZ2luc3x4KSl8Yig/OnRvYXxpZ3xvKD86bGR8cmRlcldpZHRocyl8bGlua3xhY2spKVxiKD89XCgpL30se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uLmRvbSIscmVnZXg6LyhzKD86dWIoPzpzdHJpbmdEYXRhfG1pdCl8cGxpdFRleHR8ZSg/OnQoPzpOYW1lZEl0ZW18QXR0cmlidXRlKD86Tm9kZSk/KXxsZWN0KSl8aGFzKD86Q2hpbGROb2Rlc3xGZWF0dXJlKXxuYW1lZEl0ZW18Yyg/OmwoPzppY2t8byg/OnNlfG5lTm9kZSkpfHJlYXRlKD86Qyg/Om9tbWVudHxEQVRBU2VjdGlvbnxhcHRpb24pfFQoPzpIZWFkfGV4dE5vZGV8Rm9vdCl8RG9jdW1lbnRGcmFnbWVudHxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb258RSg/Om50aXR5UmVmZXJlbmNlfGxlbWVudCl8QXR0cmlidXRlKSl8dGFiSW5kZXh8aSg/Om5zZXJ0KD86Um93fEJlZm9yZXxDZWxsfERhdGEpfHRlbSl8b3BlbnxkZWxldGUoPzpSb3d8Qyg/OmVsbHxhcHRpb24pfFQoPzpIZWFkfEZvb3QpfERhdGEpfGZvY3VzfHdyaXRlKD86bG4pP3xhKD86ZGR8cHBlbmQoPzpDaGlsZHxEYXRhKSl8cmUoPzpzZXR8cGxhY2UoPzpDaGlsZHxEYXRhKXxtb3ZlKD86TmFtZWRJdGVtfENoaWxkfEF0dHJpYnV0ZSg/Ok5vZGUpPyk/KXxnZXQoPzpOYW1lZEl0ZW18RWxlbWVudCg/OnNCeSg/Ok5hbWV8VGFnTmFtZXxDbGFzc05hbWUpfEJ5SWQpfEF0dHJpYnV0ZSg/Ok5vZGUpPyl8Ymx1cilcYig/PVwoKS99LHt0b2tlbjoic3VwcG9ydC5jb25zdGFudCIscmVnZXg6LyhzKD86eXN0ZW1MYW5ndWFnZXxjcig/OmlwdHN8b2xsYmFyc3xlZW4oPzpYfFl8VG9wfExlZnQpKXx0KD86eWxlKD86U2hlZXRzKT98YXR1cyg/OlRleHR8YmFyKT8pfGlibGluZyg/OkJlbG93fEFib3ZlKXxvdXJjZXx1ZmZpeGVzfGUoPzpjdXJpdHkoPzpQb2xpY3kpP3xsKD86ZWN0aW9ufGYpKSl8aCg/OmlzdG9yeXxvc3QoPzpuYW1lKT98YXMoPzpofEZvY3VzKSl8eXxYKD86TUxEb2N1bWVudHxTTERvY3VtZW50KXxuKD86ZXh0fGFtZSg/OnNwYWNlKD86c3xVUkkpfFByb3ApKXxNKD86SU5fVkFMVUV8QVhfVkFMVUUpfGMoPzpoYXJhY3RlclNldHxvKD86big/OnN0cnVjdG9yfHRyb2xsZXJzKXxva2llRW5hYmxlZHxsb3JEZXB0aHxtcCg/Om9uZW50c3xsZXRlKSl8dXJyZW50fHB1Q2xhc3N8bCg/OmkoPzpwKD86Ym9hcmREYXRhKT98ZW50SW5mb3JtYXRpb24pfG9zZWR8YXNzZXMpfGFsbGUoPzplfHIpfHJ5cHRvKXx0KD86byg/Om9sYmFyfHApfGV4dCg/OlRyYW5zZm9ybXxJbmRlbnR8RGVjb3JhdGlvbnxBbGlnbil8YWdzKXxTUVJUKD86MV8yfDIpfGkoPzpuKD86bmVyKD86SGVpZ2h0fFdpZHRoKXxwdXQpfGRzfGdub3JlQ2FzZSl8ekluZGV4fG8oPzpzY3B1fG4oPzpyZWFkeXN0YXRlY2hhbmdlfExpbmUpfHV0ZXIoPzpIZWlnaHR8V2lkdGgpfHAoPzpzUHJvZmlsZXxlbmVyKXxmZnNjcmVlbkJ1ZmZlcmluZyl8TkVHQVRJVkVfSU5GSU5JVFl8ZCg/OmkoPzpzcGxheXxhbG9nKD86SGVpZ2h0fFRvcHxXaWR0aHxMZWZ0fEFyZ3VtZW50cyl8cmVjdG9yaWVzKXxlKD86c2NyaXB0aW9ufGZhdWx0KD86U3RhdHVzfENoKD86ZWNrZWR8YXJzZXQpfFZpZXcpKSl8dSg/OnNlcig/OlByb2ZpbGV8TGFuZ3VhZ2V8QWdlbnQpfG4oPzppcXVlSUR8ZGVmaW5lZCl8cGRhdGVJbnRlcnZhbCl8X2NvbnRlbnR8cCg/Oml4ZWxEZXB0aHxvcnR8ZXJzb25hbGJhcnxrY3MxMXxsKD86dWdpbnN8YXRmb3JtKXxhKD86dGhuYW1lfGRkaW5nKD86UmlnaHR8Qm90dG9tfFRvcHxMZWZ0KXxyZW50KD86V2luZG93fExheWVyKT98Z2UoPzpYKD86T2Zmc2V0KT98WSg/Ok9mZnNldCk/KSl8cig/Om8oPzp0byg/OmNvbHx0eXBlKXxkdWN0KD86U3ViKT98bXB0ZXIpfGUoPzp2aW91c3xmaXgpKSl8ZSg/Om4oPzpjb2Rpbmd8YWJsZWRQbHVnaW4pfHgoPzp0ZXJuYWx8cGFuZG8pfG1iZWRzKXx2KD86aXNpYmlsaXR5fGVuZG9yKD86U3ViKT98TGlua2NvbG9yKXxVUkxVbmVuY29kZWR8UCg/Okl8T1NJVElWRV9JTkZJTklUWSl8Zig/OmlsZW5hbWV8byg/Om50KD86U2l6ZXxGYW1pbHl8V2VpZ2h0KXxybU5hbWUpfHJhbWUoPzpzfEVsZW1lbnQpfGdDb2xvcil8RXx3aGl0ZVNwYWNlfGwoPzppKD86c3RTdHlsZVR5cGV8big/OmVIZWlnaHR8a0NvbG9yKSl8byg/OmNhKD86dGlvbig/OmJhcik/fGxOYW1lKXx3c3JjKXxlKD86bmd0aHxmdCg/OkNvbnRleHQpPyl8YSg/OnN0KD86TSg/Om9kaWZpZWR8YXRjaCl8SW5kZXh8UGFyZW4pfHllcig/OnN8WCl8bmd1YWdlKSl8YSg/OnBwKD86TWlub3JWZXJzaW9ufE5hbWV8Q28oPzpkZU5hbWV8cmUpfFZlcnNpb24pfHZhaWwoPzpIZWlnaHR8VG9wfFdpZHRofExlZnQpfGxsfHIoPzppdHl8Z3VtZW50cyl8TGlua2NvbG9yfGJvdmUpfHIoPzppZ2h0KD86Q29udGV4dCk/fGUoPzpzcG9uc2UoPzpYTUx8VGV4dCl8YWR5U3RhdGUpKXxnbG9iYWx8eHxtKD86aW1lVHlwZXN8dWx0aWxpbmV8ZW51YmFyfGFyZ2luKD86UmlnaHR8Qm90dG9tfFRvcHxMZWZ0KSl8TCg/Ok4oPzoxMHwyKXxPRyg/OjEwRXwyRSkpfGIoPzpvKD86dHRvbXxyZGVyKD86V2lkdGh8UmlnaHRXaWR0aHxCb3R0b21XaWR0aHxTdHlsZXxDb2xvcnxUb3BXaWR0aHxMZWZ0V2lkdGgpKXx1ZmZlckRlcHRofGVsb3d8YWNrZ3JvdW5kKD86Q29sb3J8SW1hZ2UpKSlcYi99LHt0b2tlbjoiaWRlbnRpZmllciIscmVnZXg6b30se3JlZ2V4OiIiLHRva2VuOiJlbXB0eSIsbmV4dDoibm9fcmVnZXgifV0sc3RhcnQ6W2kuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSxmKCJzdGFydCIpLHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlxcLyIsbmV4dDoicmVnZXgifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrfF4kIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6Im5vX3JlZ2V4In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiIvW3N4bmdpbXldKiIsbmV4dDoibm9fcmVnZXgifSx7dG9rZW46ImludmFsaWQiLHJlZ2V4Oi9ce1xkK1xiLD9cZCpcfVsrKl18WysqJF4/XVsrKl18WyReXVs/XXxcP3szLH0vfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6L1woXD9bOj0hXXxcKXxce1xkK1xiLD9cZCpcfXxbKypdXD98WygpJF4rKj8uXS99LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZGVsaW1pdGVyIixyZWdleDovXHwvfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6L1xbXF4/LyxuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46ImVtcHR5IixyZWdleDoiJCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucmVnZXhwIn1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAuY2hhcmNsYXNzLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDoiXSIsbmV4dDoicmVnZXgifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6Ii0ifSx7dG9rZW46ImVtcHR5IixyZWdleDoiJCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyJ9XSxmdW5jdGlvbl9hcmd1bWVudHM6W3t0b2tlbjoidmFyaWFibGUucGFyYW1ldGVyIixyZWdleDpvfSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiWywgXSsifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiJCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6Im5vX3JlZ2V4In1dLHFxc3RyaW5nOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXFxcJCIsY29uc3VtZUxpbmVFbmQ6ITB9LHt0b2tlbjoic3RyaW5nIixyZWdleDonInwkJyxuZXh0OiJub19yZWdleCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XSxxc3RyaW5nOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXFxcJCIsY29uc3VtZUxpbmVFbmQ6ITB9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJ3wkIixuZXh0OiJub19yZWdleCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XX07aWYoIWV8fCFlLm5vRVM2KXRoaXMuJHJ1bGVzLm5vX3JlZ2V4LnVuc2hpZnQoe3JlZ2V4OiJbe31dIixvbk1hdGNoOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLm5leHQ9ZT09InsiP3RoaXMubmV4dFN0YXRlOiIiO2lmKGU9PSJ7IiYmbi5sZW5ndGgpbi51bnNoaWZ0KCJzdGFydCIsdCk7ZWxzZSBpZihlPT0ifSImJm4ubGVuZ3RoKXtuLnNoaWZ0KCksdGhpcy5uZXh0PW4uc2hpZnQoKTtpZih0aGlzLm5leHQuaW5kZXhPZigic3RyaW5nIikhPS0xfHx0aGlzLm5leHQuaW5kZXhPZigianN4IikhPS0xKXJldHVybiJwYXJlbi5xdWFzaS5lbmQifXJldHVybiBlPT0ieyI/InBhcmVuLmxwYXJlbiI6InBhcmVuLnJwYXJlbiJ9LG5leHRTdGF0ZToic3RhcnQifSx7dG9rZW46InN0cmluZy5xdWFzaS5zdGFydCIscmVnZXg6L2AvLHB1c2g6W3t0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDpyfSx7dG9rZW46InBhcmVuLnF1YXNpLnN0YXJ0IixyZWdleDovXCR7LyxwdXNoOiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nLnF1YXNpLmVuZCIscmVnZXg6L2AvLG5leHQ6InBvcCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5xdWFzaSJ9XX0pLCghZXx8ZS5qc3ghPTApJiZhLmNhbGwodGhpcyk7dGhpcy5lbWJlZFJ1bGVzKGksImRvYy0iLFtpLmdldEVuZFJ1bGUoIm5vX3JlZ2V4IildKSx0aGlzLm5vcm1hbGl6ZVJ1bGVzKCl9O3IuaW5oZXJpdHModSxzKSx0LkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcz11fSksYWNlLmRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKCl7fTsoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihlLHQpe3JldHVybi9eXHMrJC8udGVzdChlKT8vXlxzKlx9Ly50ZXN0KHQpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRMaW5lKHQpLGk9bi5tYXRjaCgvXihccypcfSkvKTtpZighaSlyZXR1cm4gMDt2YXIgcz1pWzFdLmxlbmd0aCxvPWUuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OnQsY29sdW1uOnN9KTtpZighb3x8by5yb3c9PXQpcmV0dXJuIDA7dmFyIHU9dGhpcy4kZ2V0SW5kZW50KGUuZ2V0TGluZShvLnJvdykpO2UucmVwbGFjZShuZXcgcih0LDAsdCxzLTEpLHUpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL15ccyovKVswXX19KS5jYWxsKGkucHJvdG90eXBlKSx0Lk1hdGNoaW5nQnJhY2VPdXRkZW50PWl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uLy4uL2xpYi9vb3AiKSxpPWUoIi4uLy4uL3JhbmdlIikuUmFuZ2Uscz1lKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLG89dC5Gb2xkTW9kZT1mdW5jdGlvbihlKXtlJiYodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bmV3IFJlZ0V4cCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci5zb3VyY2UucmVwbGFjZSgvXHxbXnxdKj8kLywifCIrZS5zdGFydCkpLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bmV3IFJlZ0V4cCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnNvdXJjZS5yZXBsYWNlKC9cfFtefF0qPyQvLCJ8IitlLmVuZCkpKX07ci5pbmhlcml0cyhvLHMpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9LyhbXHtcW1woXSlbXlx9XF1cKV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XChdKihbXH1cXVwpXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuc2luZ2xlTGluZUJsb2NrQ29tbWVudFJlPS9eXHMqKFwvXCopLipcKlwvXHMqJC8sdGhpcy50cmlwbGVTdGFyQmxvY2tDb21tZW50UmU9L15ccyooXC9cKlwqXCopLipcKlwvXHMqJC8sdGhpcy5zdGFydFJlZ2lvblJlPS9eXHMqKFwvXCp8XC9cLykjP3JlZ2lvblxiLyx0aGlzLl9nZXRGb2xkV2lkZ2V0QmFzZT10aGlzLmdldEZvbGRXaWRnZXQsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldExpbmUobik7aWYodGhpcy5zaW5nbGVMaW5lQmxvY2tDb21tZW50UmUudGVzdChyKSYmIXRoaXMuc3RhcnRSZWdpb25SZS50ZXN0KHIpJiYhdGhpcy50cmlwbGVTdGFyQmxvY2tDb21tZW50UmUudGVzdChyKSlyZXR1cm4iIjt2YXIgaT10aGlzLl9nZXRGb2xkV2lkZ2V0QmFzZShlLHQsbik7cmV0dXJuIWkmJnRoaXMuc3RhcnRSZWdpb25SZS50ZXN0KHIpPyJzdGFydCI6aX0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5nZXRMaW5lKG4pO2lmKHRoaXMuc3RhcnRSZWdpb25SZS50ZXN0KGkpKXJldHVybiB0aGlzLmdldENvbW1lbnRSZWdpb25CbG9jayhlLGksbik7dmFyIHM9aS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYocyl7dmFyIG89cy5pbmRleDtpZihzWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soZSxzWzFdLG4sbyk7dmFyIHU9ZS5nZXRDb21tZW50Rm9sZFJhbmdlKG4sbytzWzBdLmxlbmd0aCwxKTtyZXR1cm4gdSYmIXUuaXNNdWx0aUxpbmUoKSYmKHI/dT10aGlzLmdldFNlY3Rpb25SYW5nZShlLG4pOnQhPSJhbGwiJiYodT1udWxsKSksdX1pZih0PT09Im1hcmtiZWdpbiIpcmV0dXJuO3ZhciBzPWkubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYocyl7dmFyIG89cy5pbmRleCtzWzBdLmxlbmd0aDtyZXR1cm4gc1sxXT90aGlzLmNsb3NpbmdCcmFja2V0QmxvY2soZSxzWzFdLG4sbyk6ZS5nZXRDb21tZW50Rm9sZFJhbmdlKG4sbywtMSl9fSx0aGlzLmdldFNlY3Rpb25SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0TGluZSh0KSxyPW4uc2VhcmNoKC9cUy8pLHM9dCxvPW4ubGVuZ3RoO3QrPTE7dmFyIHU9dCxhPWUuZ2V0TGVuZ3RoKCk7d2hpbGUoKyt0PGEpe249ZS5nZXRMaW5lKHQpO3ZhciBmPW4uc2VhcmNoKC9cUy8pO2lmKGY9PT0tMSljb250aW51ZTtpZihyPmYpYnJlYWs7dmFyIGw9dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoZSwiYWxsIix0KTtpZihsKXtpZihsLnN0YXJ0LnJvdzw9cylicmVhaztpZihsLmlzTXVsdGlMaW5lKCkpdD1sLmVuZC5yb3c7ZWxzZSBpZihyPT1mKWJyZWFrfXU9dH1yZXR1cm4gbmV3IGkocyxvLHUsZS5nZXRMaW5lKHUpLmxlbmd0aCl9LHRoaXMuZ2V0Q29tbWVudFJlZ2lvbkJsb2NrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnNlYXJjaCgvXHMqJC8pLHM9ZS5nZXRMZW5ndGgoKSxvPW4sdT0vXlxzKig/OlwvXCp8XC9cL3wtLSkjPyhlbmQpP3JlZ2lvblxiLyxhPTE7d2hpbGUoKytuPHMpe3Q9ZS5nZXRMaW5lKG4pO3ZhciBmPXUuZXhlYyh0KTtpZighZiljb250aW51ZTtmWzFdP2EtLTphKys7aWYoIWEpYnJlYWt9dmFyIGw9bjtpZihsPm8pcmV0dXJuIG5ldyBpKG8scixsLHQubGVuZ3RoKX19LmNhbGwoby5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi90ZXh0IikuTW9kZSxzPWUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsbz1lKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCx1PWUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGE9ZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGY9ZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGw9ZnVuY3Rpb24oKXt0aGlzLkhpZ2hsaWdodFJ1bGVzPXMsdGhpcy4kb3V0ZGVudD1uZXcgbyx0aGlzLiRiZWhhdmlvdXI9bmV3IGEsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGZ9O3IuaW5oZXJpdHMobCxpKSxmdW5jdGlvbigpe3RoaXMubGluZUNvbW1lbnRTdGFydD0iLy8iLHRoaXMuYmxvY2tDb21tZW50PXtzdGFydDoiLyoiLGVuZDoiKi8ifSx0aGlzLiRxdW90ZXM9eyciJzonIicsIiciOiInIiwiYCI6ImAifSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLiRnZXRJbmRlbnQodCksaT10aGlzLmdldFRva2VuaXplcigpLmdldExpbmVUb2tlbnModCxlKSxzPWkudG9rZW5zLG89aS5zdGF0ZTtpZihzLmxlbmd0aCYmc1tzLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIHI7aWYoZT09InN0YXJ0Inx8ZT09Im5vX3JlZ2V4Iil7dmFyIHU9dC5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKjp8W1x7XChcW10pXHMqJC8pO3UmJihyKz1uKX1lbHNlIGlmKGU9PSJkb2Mtc3RhcnQiKXtpZihvPT0ic3RhcnQifHxvPT0ibm9fcmVnZXgiKXJldHVybiIiO3ZhciB1PXQubWF0Y2goL15ccyooXC8/KVwqLyk7dSYmKHVbMV0mJihyKz0iICIpLHIrPSIqICIpfXJldHVybiByfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KHQsbil9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQodCxuKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHUoWyJhY2UiXSwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIHQuYXR0YWNoVG9Eb2N1bWVudChlLmdldERvY3VtZW50KCkpLHQub24oImFubm90YXRlIixmdW5jdGlvbih0KXtlLnNldEFubm90YXRpb25zKHQuZGF0YSl9KSx0Lm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7ZS5jbGVhckFubm90YXRpb25zKCl9KSx0fSx0aGlzLiRpZD0iYWNlL21vZGUvamF2YXNjcmlwdCJ9LmNhbGwobC5wcm90b3R5cGUpLHQuTW9kZT1sfSk7ICAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBhY2UucmVxdWlyZShbImFjZS9tb2RlL2phdmFzY3JpcHQiXSwgZnVuY3Rpb24obSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IiAmJiB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkoKTsKICAgIH0KICAgINC80YPRgNC+0Lwu0YHRgtCw0YDRgi7Qv9C+0LTQv9C40YHQsNGC0Ywo0LLQstC10YHRgtC40KDQtdC20LjQvEphdmFTY3JpcHQpOwp9Cg==", +], + +[ +"редактор", +"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDQstCy0LXRgdGC0LjQoNC10LTQsNC60YLQvtGAKCkKICAgIHsKICAgICAgICB2YXIg0YDQtdC00LDQutGC0L7RgCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgINGA0LXQtNCw0LrRgtC+0YAuaWQgPSAi0YDQtdC00LDQutGC0L7RgCI7CiAgICAgICAg0YDQtdC00LDQutGC0L7RgC5zdHlsZS5jc3NUZXh0ID0gYAogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYDsKICAgICAgICB2YXIg0L7QsdC70LDRgdGC0YwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi0LvQtdCy0LDRjy3QvtCx0LvQsNGB0YLRjCIpOwogICAgICAgINC+0LHQu9Cw0YHRgtGMLmFwcGVuZENoaWxkKNGA0LXQtNCw0LrRgtC+0YApOwogICAgICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgCA9IHdpbmRvdy5hY2UuZWRpdCgi0YDQtdC00LDQutGC0L7RgCIpOwogICAgICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL2phdmFzY3JpcHQiKTsKICAgIH0KICAgINC80YPRgNC+0Lwu0YHRgtCw0YDRgi7Qv9C+0LTQv9C40YHQsNGC0Ywo0LLQstC10YHRgtC40KDQtdC00LDQutGC0L7RgCk7Cn0=", +], + ]; - + +