{"product_id":"ascend-glide-and-traverse-across-armenia-s-wild-highlands","title":"ARMENIA PEAK TO PEAK TRIO CHALLENGE","description":"\u003cbody\u003e\n\u003cscript\u003ewindow.__resources = {};\u003c\/script\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n\u003cscript src=\"data:text\/javascript;base64,Ly8gR0VORVJBVEVEIGZyb20gZGMtcnVudGltZS9zcmMvKi50cyDigJQgZG8gbm90IGVkaXQuIFJlYnVpbGQgd2l0aCBgY2QgZGMtcnVudGltZSAmJiBidW4gcnVuIGJ1aWxkYC4KInVzZSBzdHJpY3QiOwooKCkgPT4gewogIHZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgdmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlOwogIHZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gInN5bWJvbCIgPyBrZXkgKyAiIiA6IGtleSwgdmFsdWUpOwoKICAvLyBzcmMvcmVhY3QudHMKICBmdW5jdGlvbiBnZXRSZWFjdCgpIHsKICAgIGNvbnN0IFIgPSB3aW5kb3cuUmVhY3Q7CiAgICBpZiAoIVIpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0IGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUjsKICB9CiAgZnVuY3Rpb24gZ2V0UmVhY3RET00oKSB7CiAgICBjb25zdCBSRCA9IHdpbmRvdy5SZWFjdERPTTsKICAgIGlmICghUkQpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0RE9NIGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUkQ7CiAgfQogIHZhciBoID0gKCguLi5hcmdzKSA9PiBnZXRSZWFjdCgpLmNyZWF0ZUVsZW1lbnQoCiAgICAuLi5hcmdzCiAgKSk7CgogIC8vIHNyYy9wYXJzZS50cwogIGZ1bmN0aW9uIHBhcnNlRGNEb2N1bWVudChkb2MpIHsKICAgIGNvbnN0IGRjID0gZG9jLnF1ZXJ5U2VsZWN0b3IoIngtZGMiKTsKICAgIGlmICghZGMpIHJldHVybiBudWxsOwogICAgY29uc3Qgc2NyaXB0RWwgPSBkb2MucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZGMtc2NyaXB0XSIpOwogICAgY29uc3QgeyBwcm9wcywgcHJldmlldyB9ID0gcGFyc2VEYXRhUHJvcHMoCiAgICAgIHNjcmlwdEVsPy5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvcHMiKSA\/PyBudWxsCiAgICApOwogICAgcmV0dXJuIHsKICAgICAgdGVtcGxhdGU6IGRjLmlubmVySFRNTCwKICAgICAganM6IHNjcmlwdEVsID8gc2NyaXB0RWwudGV4dENvbnRlbnQgfHwgIiIgOiAiIiwKICAgICAgcHJvcHMsCiAgICAgIHByZXZpZXcKICAgIH07CiAgfQogIGZ1bmN0aW9uIHBhcnNlRGNUZXh0KHNyYykgewogICAgY29uc3Qgb3Blbk1hdGNoID0gLzx4LWRjKD86XHNbXj5dKik\/Pi8uZXhlYyhzcmMpOwogICAgaWYgKCFvcGVuTWF0Y2gpIHJldHVybiBudWxsOwogICAgY29uc3QgY2xvc2UgPSBzcmMubGFzdEluZGV4T2YoIjwveC1kYz4iKTsKICAgIGlmIChjbG9zZSA9PT0gLTEgfHwgY2xvc2UgPCBvcGVuTWF0Y2guaW5kZXgpIHJldHVybiBudWxsOwogICAgY29uc3QgdGVtcGxhdGUgPSBzcmMuc2xpY2Uob3Blbk1hdGNoLmluZGV4ICsgb3Blbk1hdGNoWzBdLmxlbmd0aCwgY2xvc2UpOwogICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzcmMsICJ0ZXh0L2h0bWwiKTsKICAgIGNvbnN0IHNjcmlwdEVsID0gZG9jLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWRjLXNjcmlwdF0iKTsKICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKAogICAgICBzY3JpcHRFbD8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb3BzIikgPz8gbnVsbAogICAgKTsKICAgIHJldHVybiB7CiAgICAgIHRlbXBsYXRlLAogICAgICBqczogc2NyaXB0RWwgPyBzY3JpcHRFbC50ZXh0Q29udGVudCB8fCAiIiA6ICIiLAogICAgICBwcm9wcywKICAgICAgcHJldmlldwogICAgfTsKICB9CiAgZnVuY3Rpb24gcGFyc2VEYXRhUHJvcHMocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIGxldCBwYXJzZWQ7CiAgICB0cnkgewogICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIH0KICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICJvYmplY3QiIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgewogICAgICByZXR1cm4geyBwcm9wczogbnVsbCwgcHJldmlldzogbnVsbCB9OwogICAgfQogICAgY29uc3Qgb2JqID0gcGFyc2VkOwogICAgY29uc3QgcHJldmlldyA9IG9iai4kcHJldmlldyAmJiB0eXBlb2Ygb2JqLiRwcmV2aWV3ID09PSAib2JqZWN0IiA\/IG9iai4kcHJldmlldyA6IG51bGw7CiAgICBjb25zdCByZXN0ID0ge307CiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob2JqKSkgewogICAgICBpZiAoa1swXSAhPT0gIiQiKSByZXN0W2tdID0gb2JqW2tdOwogICAgfQogICAgcmV0dXJuIHsgcHJvcHM6IE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA\/IHJlc3QgOiBudWxsLCBwcmV2aWV3IH07CiAgfQogIGZ1bmN0aW9uIGRjTmFtZUZyb21QYXRoKHBhdGhuYW1lKSB7CiAgICBsZXQgcCA9IHBhdGhuYW1lIHx8ICIiOwogICAgdHJ5IHsKICAgICAgcCA9IGRlY29kZVVSSUNvbXBvbmVudChwKTsKICAgIH0gY2F0Y2ggewogICAgfQogICAgY29uc3QgYmFzZSA9IHAuc3BsaXQoIi8iKS5wb3AoKSB8fCAiUm9vdCI7CiAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLmRjXC5odG1sJC8sICIiKS5yZXBsYWNlKC9cLmh0bWw\/JC8sICIiKSB8fCAiUm9vdCI7CiAgfQoKICAvLyBzcmMvYm9vdC50cwogIHZhciBCQVNFX0NTUyA9IGAKICAgIC5zYy1wbGFjZWhvbGRlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjMpO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuNSk7CiAgICAgIGJvcmRlci1yYWRpdXM6MnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW59CiAgICBAa2V5ZnJhbWVzIHNjLXNoaW5lezAle2JhY2tncm91bmQtcG9zaXRpb246MTAwJSA1MCV9MTAwJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAlIDUwJX19CiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtcGxhY2Vob2xkZXIsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmd7cG9zaXRpb246cmVsYXRpdmU7CiAgICAgIGJhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUlLHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOjpiZWZvcmUsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmc6OmJlZm9yZXtjb250ZW50OicnOwogICAgICBwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3BvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHJnYmEoMjE3LDExOSw4NywwKSAyNSUscmdiYSgyNDcsMjI1LDIxMSwuOTUpIDM3JSxyZ2JhKDIxNywxMTksODcsMCkgNjMlKTsKICAgICAgYmFja2dyb3VuZC1zaXplOjQwMCUgMTAwJTthbmltYXRpb246c2Mtc2hpbmUgMS40cyBlYXNlIGluZmluaXRlfQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOm50aC1jaGlsZChuKzkgb2YgLnNjLXBsYWNlaG9sZGVyKTo6YmVmb3JlLAogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLWludGVycC5zYy1taXNzaW5nOm50aC1jaGlsZChuKzkgb2YgLnNjLWludGVycC5zYy1taXNzaW5nKTo6YmVmb3Jle2FuaW1hdGlvbjpub25lOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCl9CiAgICAuc2MtcGxhY2Vob2xkZXItZXJyb3J7cGFkZGluZzo0cHggOHB4O2ZvbnQ6MTFweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgY29sb3I6cmdiYSgwLDAsMCwuNyk7d29yZC1icmVhazpicmVhay13b3JkfQogICAgLnNjLWludGVycC5zYy1taXNzaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MWVtO292ZXJmbG93OmhpZGRlbjsKICAgICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjUpOwogICAgICBib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dHJhbnNwYXJlbnQ7CiAgICAgIHVzZXItc2VsZWN0Om5vbmV9CiAgICAuc2MtaW50ZXJwLnNjLXVucmVzb2x2ZWR7Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6Ljg1ZW07CiAgICAgIGNvbG9yOnJnYmEoMCwwLDAsLjUpO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2JvcmRlci1yYWRpdXM6M3B4OwogICAgICBwYWRkaW5nOjAgM3B4fQogICAgLnNjLWhvc3Quc2MtaGFzLWVycm9ye3Bvc2l0aW9uOnJlbGF0aXZlfQogICAgLnNjLWxvZ2ljLWVycm9ye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7bGVmdDo4cHg7ei1pbmRleDoyMTQ3NDgzNjQ3O21heC13aWR0aDo2MGNoOwogICAgICBwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6I2IwMDAyMDtjb2xvcjojZmZmO2ZvbnQ6MTJweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgYm9yZGVyLXJhZGl1czo0cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC8qIE1pcnJvcnMgUFJJTlRfQkFTRUxJTkVfQ1NTIGluIGFwcHMvd2ViIGRlY2stc3RhZ2UtZXhwb3J0LnRzIFx1MjAxNCBrZWVwIGJvdGgKICAgICAgIGluIHN5bmMgdW50aWwgZGMtcnVudGltZSByZWdhaW5zIGEgYnVpbGQgc3RlcC4gKi8KICAgIEBtZWRpYSBwcmludCB7CiAgICAgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQogICAgICBmaWd1cmUsIHRhYmxlIHsgYnJlYWstaW5zaWRlOiBhdm9pZDsgfQogICAgICAjZGMtcm9vdCwgI2RjLXJvb3QgPiAuc2MtaG9zdCB7IGhlaWdodDogYXV0bzsgfQogICAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsKICAgICAgICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0OyAtd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDogZXhhY3Q7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtOTlzICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1kdXJhdGlvbjogLjAwMXMgIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGggIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZyAhaW1wb3J0YW50OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwcyAhaW1wb3J0YW50OwogICAgICB9CiAgICB9CiAgYDsKICB2YXIgRlVMTF9QQUdFX0NTUyA9ICJodG1sLGJvZHl7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9I2RjLXJvb3QsI2RjLXJvb3Q+LnNjLWhvc3R7aGVpZ2h0OjEwMCV9IjsKICBmdW5jdGlvbiByb290TmFtZUZvckRvY3VtZW50KGRvYywgbG9jKSB7CiAgICBsZXQgYm9vdFBhdGggPSBsb2MucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoIS9cLmRjXC5odG1sPyQvaS50ZXN0KHNhZmVEZWNvZGUoYm9vdFBhdGgpKSkgewogICAgICB0cnkgewogICAgICAgIGJvb3RQYXRoID0gbmV3IFVSTChkb2MuYmFzZVVSSSB8fCAiLyIpLnBhdGhuYW1lOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRjTmFtZUZyb21QYXRoKGJvb3RQYXRoKTsKICB9CiAgZnVuY3Rpb24gc2FmZURlY29kZShzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHMpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBzOwogICAgfQogIH0KICBmdW5jdGlvbiBib290KHJ1bnRpbWUsIGRvYyA9IGRvY3VtZW50KSB7CiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURjRG9jdW1lbnQoZG9jKTsKICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IHJvb3ROYW1lID0gcm9vdE5hbWVGb3JEb2N1bWVudChkb2MsIGxvY2F0aW9uKTsKICAgIHJ1bnRpbWUubWFya0ZldGNoZWQocm9vdE5hbWUpOwogICAgcnVudGltZS5zZXRSb290TmFtZShyb290TmFtZSk7CiAgICBydW50aW1lLmFkb3B0UGFyc2VkKHJvb3ROYW1lLCBwYXJzZWQpOwogICAgZmV0Y2gobG9jYXRpb24uaHJlZikudGhlbigocmVzKSA9PiByZXMub2sgPyByZXMudGV4dCgpIDogIiIpLnRoZW4oKHQpID0+IHsKICAgICAgY29uc3QgcmF3ID0gdCA\/IHBhcnNlRGNUZXh0KHQpIDogbnVsbDsKICAgICAgaWYgKHJhdz8udGVtcGxhdGUpIHJ1bnRpbWUudXBkYXRlSHRtbChyb290TmFtZSwgcmF3LnRlbXBsYXRlKTsKICAgIH0pLmNhdGNoKCgpID0+IHsKICAgIH0pOwogICAgY29uc3QgZGMgPSBkb2MucXVlcnlTZWxlY3RvcigieC1kYyIpOwogICAgY29uc3QgaG9zdEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaG9zdEVsLmlkID0gImRjLXJvb3QiOwogICAgZGMucmVwbGFjZVdpdGgoaG9zdEVsKTsKICAgIGlmICghcGFyc2VkLnByZXZpZXcpIHsKICAgICAgY29uc3QgcyA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICBzLnRleHRDb250ZW50ID0gRlVMTF9QQUdFX0NTUzsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBjb25zdCBSb290ID0gcnVudGltZS5nZXREQyhyb290TmFtZSk7CiAgICBjb25zdCBlbnRyeSA9IHJ1bnRpbWUucmVnaXN0cnkuZ2V0KHJvb3ROYW1lKTsKICAgIGZ1bmN0aW9uIFN0YW5kYWxvbmVSb290KCkgewogICAgICBjb25zdCBbLCBzZXRUaWNrXSA9IFJlYWN0LnVzZVN0YXRlKDApOwogICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gewogICAgICAgIGNvbnN0IHN1YiA9ICgpID0+IHNldFRpY2soKG4pID0+IG4gKyAxKTsKICAgICAgICBlbnRyeS5zdWJzLmFkZChzdWIpOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICBlbnRyeS5zdWJzLmRlbGV0ZShzdWIpOwogICAgICAgIH07CiAgICAgIH0sIFtdKTsKICAgICAgcmV0dXJuIGgoUm9vdCwgZW50cnkucHJvcE92ZXJyaWRlcyB8fCBudWxsKTsKICAgIH0KICAgIGNvbnN0IFJlYWN0RE9NID0gZ2V0UmVhY3RET00oKTsKICAgIGlmIChSZWFjdERPTS5jcmVhdGVSb290KQogICAgICBSZWFjdERPTS5jcmVhdGVSb290KGhvc3RFbCkucmVuZGVyKGgoU3RhbmRhbG9uZVJvb3QpKTsKICAgIGVsc2UgUmVhY3RET00ucmVuZGVyKGgoU3RhbmRhbG9uZVJvb3QpLCBob3N0RWwpOwogICAgcmV0dXJuIHJvb3ROYW1lOwogIH0KCiAgLy8gc3JjL2V4cHIudHMKICB2YXIgSURFTlRfUkUgPSAvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKi87CiAgdmFyIE5VTUJFUl9SRSA9IC9eLT9cZCsoXC5cZCspPyQvOwogIGZ1bmN0aW9uIHJlc29sdmUodmFscywgc3JjKSB7CiAgICBjb25zdCBleHByID0gU3RyaW5nKHNyYykudHJpbSgpOwogICAgaWYgKCFleHByKSByZXR1cm4gdm9pZCAwOwogICAgaWYgKGV4cHJbMF0gPT09ICIoIiAmJiBleHByW2V4cHIubGVuZ3RoIC0gMV0gPT09ICIpIiAmJiBwYXJlbnNXcmFwV2hvbGUoZXhwcikpIHsKICAgICAgcmV0dXJuIHJlc29sdmUodmFscywgZXhwci5zbGljZSgxLCAtMSkpOwogICAgfQogICAgY29uc3QgZXEgPSBmaW5kVG9wTGV2ZWxFcXVhbGl0eShleHByKTsKICAgIGlmIChlcSkgewogICAgICBjb25zdCBsdiA9IHJlc29sdmUodmFscywgZXhwci5zbGljZSgwLCBlcS5pbmRleCkpOwogICAgICBjb25zdCBydiA9IHJlc29sdmUodmFscywgZXhwci5zbGljZShlcS5pbmRleCArIGVxLm9wLmxlbmd0aCkpOwogICAgICBzd2l0Y2ggKGVxLm9wKSB7CiAgICAgICAgY2FzZSAiPT09IjoKICAgICAgICAgIHJldHVybiBsdiA9PT0gcnY7CiAgICAgICAgY2FzZSAiIT09IjoKICAgICAgICAgIHJldHVybiBsdiAhPT0gcnY7CiAgICAgICAgY2FzZSAiPT0iOgogICAgICAgICAgcmV0dXJuIGx2ID09IHJ2OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gbHYgIT0gcnY7CiAgICAgIH0KICAgIH0KICAgIGlmIChleHByWzBdID09PSAiISIpIHJldHVybiAhcmVzb2x2ZSh2YWxzLCBleHByLnNsaWNlKDEpKTsKICAgIGlmIChleHByID09PSAidHJ1ZSIpIHJldHVybiB0cnVlOwogICAgaWYgKGV4cHIgPT09ICJmYWxzZSIpIHJldHVybiBmYWxzZTsKICAgIGlmIChleHByID09PSAibnVsbCIpIHJldHVybiBudWxsOwogICAgaWYgKGV4cHIgPT09ICJ1bmRlZmluZWQiKSByZXR1cm4gdm9pZCAwOwogICAgaWYgKE5VTUJFUl9SRS50ZXN0KGV4cHIpKSByZXR1cm4gTnVtYmVyKGV4cHIpOwogICAgaWYgKGV4cHIubGVuZ3RoID49IDIgJiYgKGV4cHJbMF0gPT09ICciJyB8fCBleHByWzBdID09PSAiJyIpICYmIGV4cHJbZXhwci5sZW5ndGggLSAxXSA9PT0gZXhwclswXSkgewogICAgICByZXR1cm4gZXhwci5zbGljZSgxLCAtMSk7CiAgICB9CiAgICByZXR1cm4gcmVzb2x2ZVBhdGgodmFscywgZXhwcik7CiAgfQogIGZ1bmN0aW9uIHBhcmVuc1dyYXBXaG9sZShleHByKSB7CiAgICBsZXQgZGVwdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByLmxlbmd0aCAtIDE7IGkrKykgewogICAgICBpZiAoZXhwcltpXSA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChleHByW2ldID09PSAiKSIpIHsKICAgICAgICBkZXB0aC0tOwogICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZmluZFRvcExldmVsRXF1YWxpdHkoZXhwcikgewogICAgbGV0IGRlcHRoID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBjID0gZXhwcltpXTsKICAgICAgaWYgKGMgPT09ICJbIiB8fCBjID09PSAiKCIpIGRlcHRoKys7CiAgICAgIGVsc2UgaWYgKGMgPT09ICJdIiB8fCBjID09PSAiKSIpIGRlcHRoLS07CiAgICAgIGVsc2UgaWYgKGRlcHRoID09PSAwICYmIChjID09PSAiPSIgfHwgYyA9PT0gIiEiKSAmJiBleHByW2kgKyAxXSA9PT0gIj0iKSB7CiAgICAgICAgaWYgKGkgPiAwICYmIChleHByW2kgLSAxXSA9PT0gIj0iIHx8IGV4cHJbaSAtIDFdID09PSAiISIpKSBjb250aW51ZTsKICAgICAgICBpZiAoIWV4cHIuc2xpY2UoMCwgaSkudHJpbSgpKSBjb250aW51ZTsKICAgICAgICBjb25zdCBvcCA9IGV4cHJbaSArIDJdID09PSAiPSIgPyBjICsgIj09IiA6IGMgKyAiPSI7CiAgICAgICAgcmV0dXJuIHsgaW5kZXg6IGksIG9wIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBmdW5jdGlvbiByZXNvbHZlUGF0aCh2YWxzLCBleHByKSB7CiAgICBjb25zdCBoZWFkID0gZXhwci5tYXRjaChJREVOVF9SRSk7CiAgICBpZiAoIWhlYWQpIHJldHVybiB2b2lkIDA7CiAgICBsZXQgY3VyID0gdmFscyA9PSBudWxsID8gdm9pZCAwIDogdmFsc1toZWFkWzBdXTsKICAgIGxldCBpID0gaGVhZFswXS5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IGV4cHIubGVuZ3RoKSB7CiAgICAgIGlmIChleHByW2ldID09PSAiLiIpIHsKICAgICAgICBjb25zdCBtID0gZXhwci5zbGljZShpICsgMSkubWF0Y2goSURFTlRfUkUpIHx8IGV4cHIuc2xpY2UoaSArIDEpLm1hdGNoKC9eXGQrLyk7CiAgICAgICAgaWYgKCFtKSByZXR1cm4gdm9pZCAwOwogICAgICAgIGN1ciA9IGN1ciA9PSBudWxsID8gdm9pZCAwIDogY3VyW21bMF1dOwogICAgICAgIGkgKz0gMSArIG1bMF0ubGVuZ3RoOwogICAgICB9IGVsc2UgaWYgKGV4cHJbaV0gPT09ICJbIikgewogICAgICAgIGxldCBkZXB0aCA9IDE7CiAgICAgICAgbGV0IGogPSBpICsgMTsKICAgICAgICB3aGlsZSAoaiA8IGV4cHIubGVuZ3RoICYmIGRlcHRoID4gMCkgewogICAgICAgICAgaWYgKGV4cHJbal0gPT09ICJbIikgZGVwdGgrKzsKICAgICAgICAgIGVsc2UgaWYgKGV4cHJbal0gPT09ICJdIikgewogICAgICAgICAgICBkZXB0aC0tOwogICAgICAgICAgICBpZiAoZGVwdGggPT09IDApIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVwdGggIT09IDApIHJldHVybiB2b2lkIDA7CiAgICAgICAgY29uc3Qga2V5ID0gcmVzb2x2ZSh2YWxzLCBleHByLnNsaWNlKGkgKyAxLCBqKSk7CiAgICAgICAgY3VyID0gY3VyID09IG51bGwgPyB2b2lkIDAgOiBjdXJba2V5XTsKICAgICAgICBpID0gaiArIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGN1cjsKICB9CgogIC8vIHNyYy9lbmNvZGUudHMKICB2YXIgQ0FNRUxfQVRUUiA9ICJzYy1jYW1lbC0iOwogIHZhciBSQVdfV1JBUCA9IHsKICAgIHNlbGVjdDogInNjLXJhdy1zZWxlY3QiLAogICAgdGFibGU6ICJzYy1yYXctdGFibGUiLAogICAgdGJvZHk6ICJzYy1yYXctdGJvZHkiLAogICAgdGhlYWQ6ICJzYy1yYXctdGhlYWQiLAogICAgdGZvb3Q6ICJzYy1yYXctdGZvb3QiLAogICAgdHI6ICJzYy1yYXctdHIiLAogICAgdGQ6ICJzYy1yYXctdGQiLAogICAgdGg6ICJzYy1yYXctdGgiLAogICAgY2FwdGlvbjogInNjLXJhdy1jYXB0aW9uIgogIH07CiAgdmFyIFJBV19VTldSQVAgPSBPYmplY3QuZnJvbUVudHJpZXMoCiAgICBPYmplY3QuZW50cmllcyhSQVdfV1JBUCkubWFwKChbaywgdl0pID0+IFt2LCBrXSkKICApOwogIHZhciBFVkVOVF9NQVAgPSB7CiAgICBvbmNsaWNrOiAib25DbGljayIsCiAgICBvbmNoYW5nZTogIm9uQ2hhbmdlIiwKICAgIG9uaW5wdXQ6ICJvbklucHV0IiwKICAgIG9uc3VibWl0OiAib25TdWJtaXQiLAogICAgb25rZXlkb3duOiAib25LZXlEb3duIiwKICAgIG9ua2V5dXA6ICJvbktleVVwIiwKICAgIG9ua2V5cHJlc3M6ICJvbktleVByZXNzIiwKICAgIG9ubW91c2Vkb3duOiAib25Nb3VzZURvd24iLAogICAgb25tb3VzZXVwOiAib25Nb3VzZVVwIiwKICAgIG9ubW91c2VlbnRlcjogIm9uTW91c2VFbnRlciIsCiAgICBvbm1vdXNlbGVhdmU6ICJvbk1vdXNlTGVhdmUiLAogICAgb25mb2N1czogIm9uRm9jdXMiLAogICAgb25ibHVyOiAib25CbHVyIiwKICAgIG9uZG91YmxlY2xpY2s6ICJvbkRvdWJsZUNsaWNrIiwKICAgIG9uY29udGV4dG1lbnU6ICJvbkNvbnRleHRNZW51IgogIH07CiAgdmFyIEFUVFJTID0gYCg\/OltePiInXXwiW14iXSoifCdbXiddKicpKmA7CiAgdmFyIElNUE9SVF9TRUxGX0NMT1NFX1JFID0gbmV3IFJlZ0V4cCgKICAgICI8KHgtaW1wb3J0fGRjLWltcG9ydCkoIiArIEFUVFJTICsgIikvPiIsCiAgICAiZ2kiCiAgKTsKICB2YXIgQ0FNRUxfQVRUUl9SRSA9IC8oXHMpKFthLXpdK1tBLVpdW0EtWmEtejAtOV0qKShccyo9KS9nOwogIGZ1bmN0aW9uIGVuY29kZUNhc2UoaHRtbCkgewogICAgaHRtbCA9IGh0bWwucmVwbGFjZSgKICAgICAgSU1QT1JUX1NFTEZfQ0xPU0VfUkUsCiAgICAgIChfLCB0LCBhKSA9PiAiPCIgKyB0ICsgYSArICI+PC8iICsgdCArICI+IgogICAgKTsKICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxoZWxtZXQoXHN8PikvZ2ksICI8c2MtaGVsbWV0JDEiKTsKICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxcL2hlbG1ldFxzKj4vZ2ksICI8L3NjLWhlbG1ldD4iKTsKICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoCiAgICAgIENBTUVMX0FUVFJfUkUsCiAgICAgIChfLCBzcCwgbmFtZSwgZXEpID0+IHNwICsgQ0FNRUxfQVRUUiArIG5hbWUucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+ICItIiArIGMudG9Mb3dlckNhc2UoKSkgKyBlcQogICAgKTsKICAgIGZvciAoY29uc3QgW3JlYWwsIGFsaWFzXSBvZiBPYmplY3QuZW50cmllcyhSQVdfV1JBUCkpIHsKICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSgKICAgICAgICBuZXcgUmVnRXhwKCIoPC8\/KSIgKyByZWFsICsgIig\/PVtcXHM+XSkiLCAiZ2kiKSwKICAgICAgICAiJDEiICsgYWxpYXMKICAgICAgKTsKICAgIH0KICAgIHJldHVybiBodG1sOwogIH0KICBmdW5jdGlvbiBrZWJhYlRvQ2FtZWwocykgewogICAgcmV0dXJuIHMucmVwbGFjZSgvLShbYS16XSkvZywgKF8sIGMpID0+IGMudG9VcHBlckNhc2UoKSk7CiAgfQogIGZ1bmN0aW9uIGNzc1RvT2JqKGNzcykgewogICAgY29uc3QgbyA9IHt9OwogICAgZm9yIChjb25zdCBkZWNsIG9mIGNzcy5zcGxpdCgiOyIpKSB7CiAgICAgIGNvbnN0IGkgPSBkZWNsLmluZGV4T2YoIjoiKTsKICAgICAgaWYgKGkgPCAwKSBjb250aW51ZTsKICAgICAgY29uc3QgcHJvcCA9IGRlY2wuc2xpY2UoMCwgaSkudHJpbSgpOwogICAgICBvW3Byb3Auc3RhcnRzV2l0aCgiLS0iKSA\/IHByb3AgOiBrZWJhYlRvQ2FtZWwocHJvcCldID0gZGVjbC5zbGljZShpICsgMSkudHJpbSgpOwogICAgfQogICAgcmV0dXJuIG87CiAgfQogIGZ1bmN0aW9uIGNvbXBpbGVBdHRyKHJhdykgewogICAgY29uc3Qgd2hvbGUgPSByYXcubWF0Y2goL15ccypce1x7KFtcc1xTXSs\/KVx9XH1ccyokLyk7CiAgICBpZiAod2hvbGUpIHsKICAgICAgY29uc3QgcGF0aCA9IHdob2xlWzFdOwogICAgICByZXR1cm4gKHZhbHMpID0+IHJlc29sdmUodmFscywgcGF0aCk7CiAgICB9CiAgICBpZiAocmF3LmluY2x1ZGVzKCJ7eyIpKSB7CiAgICAgIGNvbnN0IHBhcnRzID0gcmF3LnNwbGl0KC9ce1x7KFtcc1xTXSs\/KVx9XH0vZyk7CiAgICAgIHJldHVybiAodmFscykgPT4gcGFydHMubWFwKChzLCBpKSA9PiBpICYgMSA\/IHJlc29sdmUodmFscywgcykgPz8gIiIgOiBzKS5qb2luKCIiKTsKICAgIH0KICAgIHJldHVybiAoKSA9PiByYXc7CiAgfQoKICAvLyBzcmMvY29tcGlsZS50cwogIGZ1bmN0aW9uIGNvbGxlY3RQcm9wcyhub2RlLCBraW5kLCBob3N0KSB7CiAgICBjb25zdCBwcm9wR2V0dGVycyA9IFtdOwogICAgY29uc3QgcHNldWRvQ2xhc3NlcyA9IFtdOwogICAgbGV0IGhpbnRTaXplID0gbnVsbDsKICAgIGZvciAoY29uc3QgeyBuYW1lLCB2YWx1ZSB9IG9mIFsuLi5ub2RlLmF0dHJpYnV0ZXNdKSB7CiAgICAgIGlmIChuYW1lID09PSAic2MtbmFtZSIgfHwgbmFtZSA9PT0gImRhdGEtZGMtdHBsIikgY29udGludWU7CiAgICAgIGxldCBrZXkgPSBuYW1lOwogICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoQ0FNRUxfQVRUUikpCiAgICAgICAga2V5ID0ga2ViYWJUb0NhbWVsKGtleS5zbGljZShDQU1FTF9BVFRSLmxlbmd0aCkpOwogICAgICBpZiAoa2V5ID09PSAiaGludC1zaXplIikgewogICAgICAgIGhpbnRTaXplID0gdmFsdWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCJzdHlsZS0iKSkgewogICAgICAgIHBzZXVkb0NsYXNzZXMucHVzaChob3N0LnBzZXVkb0NsYXNzKGtleS5zbGljZSg2KSwgdmFsdWUpKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoa2luZCAhPT0gImRvbSIpIHsKICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCItIikgJiYgIShraW5kID09PSAieC1pbXBvcnQiICYmIChrZXkuc3RhcnRzV2l0aCgiYXJpYS0iKSB8fCBrZXkuc3RhcnRzV2l0aCgiZGF0YS0iKSkpKQogICAgICAgICAga2V5ID0ga2ViYWJUb0NhbWVsKGtleSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGtleSA9PT0gImNsYXNzIikga2V5ID0gImNsYXNzTmFtZSI7CiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAiZm9yIikga2V5ID0gImh0bWxGb3IiOwogICAgICAgIGVsc2UgaWYgKGtleS5zdGFydHNXaXRoKCJvbiIpKQogICAgICAgICAga2V5ID0gRVZFTlRfTUFQW2tleV0gfHwgIm9uIiArIGtleVsyXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDMpOwogICAgICB9CiAgICAgIHByb3BHZXR0ZXJzLnB1c2goW2tleSwgY29tcGlsZUF0dHIodmFsdWUpXSk7CiAgICB9CiAgICByZXR1cm4geyBwcm9wR2V0dGVycywgcHNldWRvQ2xhc3NlcywgaGludFNpemUgfTsKICB9CiAgdmFyIEhPU1RfU1RZTEVfUFJPUFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbCiAgICAicG9zaXRpb24iLAogICAgImxlZnQiLAogICAgInJpZ2h0IiwKICAgICJ0b3AiLAogICAgImJvdHRvbSIsCiAgICAiaW5zZXQiLAogICAgIndpZHRoIiwKICAgICJoZWlnaHQiLAogICAgInotaW5kZXgiLAogICAgInRyYW5zZm9ybSIKICBdKTsKICBmdW5jdGlvbiBob3N0UG9zaXRpb25TdHlsZShzdHlsZSkgewogICAgY29uc3QgYWxsID0gdHlwZW9mIHN0eWxlID09PSAic3RyaW5nIiA\/IGNzc1RvT2JqKHN0eWxlKSA6IHN0eWxlICE9IG51bGwgJiYgdHlwZW9mIHN0eWxlID09PSAib2JqZWN0IiA\/IHN0eWxlIDogbnVsbDsKICAgIGlmICghYWxsKSByZXR1cm4gdm9pZCAwOwogICAgY29uc3Qgb3V0ID0ge307CiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhbGwpKSB7CiAgICAgIGNvbnN0IGtlYmFiID0gay5yZXBsYWNlKC9bQS1aXS9nLCAoYykgPT4gIi0iICsgYy50b0xvd2VyQ2FzZSgpKTsKICAgICAgaWYgKEhPU1RfU1RZTEVfUFJPUFMuaGFzKGtlYmFiKSkgb3V0W2tdID0gdjsKICAgIH0KICAgIHJldHVybiBPYmplY3Qua2V5cyhvdXQpLmxlbmd0aCA\/IG91dCA6IHZvaWQgMDsKICB9CiAgZnVuY3Rpb24gY29tcGlsZVRlbXBsYXRlKGh0bWwsIGhvc3QpIHsKICAgIGNvbnN0IHRwbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7CiAgICAvLyEgbm9zZW1ncmVwOiBkaXJlY3QtaW5uZXItaHRtbC1hc3NpZ25tZW50CiAgICB0cGwuaW5uZXJIVE1MID0gZW5jb2RlQ2FzZShodG1sKTsKICAgIGxldCB0cGxOID0gMDsKICAgIChmdW5jdGlvbiBzdGFtcChub2RlKSB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIsIFN0cmluZyh0cGxOKyspKTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jaGlsZE5vZGVzKSBzdGFtcChjKTsKICAgIH0pKHRwbC5jb250ZW50KTsKICAgIGNvbnN0IGJ1aWxkZXJzID0gd2Fsa0NoaWxkcmVuKHRwbC5jb250ZW50LCBob3N0KTsKICAgIGNvbnN0IHJlbmRlciA9ICgodmFscywgY3R4KSA9PiBidWlsZGVycy5tYXAoKGIsIGkpID0+IGIodmFscyB8fCB7fSwgY3R4LCBpKSkpOwogICAgcmVuZGVyLl9fYW5ub3RhdGVkID0gdHBsLmlubmVySFRNTDsKICAgIHJldHVybiByZW5kZXI7CiAgfQogIGZ1bmN0aW9uIHdhbGtDaGlsZHJlbihub2RlLCBob3N0KSB7CiAgICByZXR1cm4gWy4uLm5vZGUuY2hpbGROb2Rlc10ubWFwKChjKSA9PiB3YWxrKGMsIGhvc3QpKS5maWx0ZXIoKGIpID0+IGIgIT0gbnVsbCk7CiAgfQogIGZ1bmN0aW9uIHdhbGsobm9kZSwgaG9zdCkgewogICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSByZXR1cm4gd2Fsa1RleHQobm9kZSk7CiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHJldHVybiBudWxsOwogICAgY29uc3QgZWwgPSBub2RlOwogICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgaWYgKHRhZyA9PT0gInNjLWZvciIpIHJldHVybiB3YWxrRm9yKGVsLCBob3N0KTsKICAgIGlmICh0YWcgPT09ICJzYy1pZiIpIHJldHVybiB3YWxrSWYoZWwsIGhvc3QpOwogICAgaWYgKHRhZyA9PT0gIngtaW1wb3J0IikgcmV0dXJuIHdhbGtYSW1wb3J0KGVsLCBob3N0KTsKICAgIGlmICh0YWcgPT09ICJzYy1oZWxtZXQiKSByZXR1cm4gaG9zdC5oZWxtZXQoZWwpOwogICAgaWYgKHRhZyA9PT0gImRjLWltcG9ydCIpIHJldHVybiB3YWxrQ29tcG9uZW50KGVsLCBob3N0KTsKICAgIHJldHVybiB3YWxrRWxlbWVudChlbCwgaG9zdCk7CiAgfQogIHZhciB3YXJuZWRIb2xlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgZnVuY3Rpb24gd2FyblVucmVzb2x2ZWQoY3R4LCB3aGF0KSB7CiAgICBjb25zdCBrZXkgPSAoY3R4Py5fX25hbWUgfHwgIj8iKSArICJcMCIgKyB3aGF0OwogICAgaWYgKHdhcm5lZEhvbGVzLmhhcyhrZXkpKSByZXR1cm47CiAgICB3YXJuZWRIb2xlcy5hZGQoa2V5KTsKICAgIGNvbnNvbGUud2FybigiW2RjLXJ1bnRpbWVdICIgKyAoY3R4Py5fX25hbWUgfHwgInRlbXBsYXRlIikgKyAiOiAiICsgd2hhdCk7CiAgfQogIGZ1bmN0aW9uIHdhbGtUZXh0KG5vZGUpIHsKICAgIGNvbnN0IHR4dCA9IG5vZGUubm9kZVZhbHVlID8\/ICIiOwogICAgaWYgKCF0eHQuaW5jbHVkZXMoInt7IikpIHsKICAgICAgaWYgKCF0eHQudHJpbSgpICYmICF0eHQuaW5jbHVkZXMoIiAiKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiAoKSA9PiB0eHQ7CiAgICB9CiAgICBjb25zdCBwYXJ0cyA9IHR4dC5zcGxpdCgvXHtceyhbXHNcU10rPylcfVx9L2cpOwogICAgcmV0dXJuICh2YWxzLCBjdHgsIGtleSkgPT4gaCgKICAgICAgZ2V0UmVhY3QoKS5GcmFnbWVudCwKICAgICAgeyBrZXkgfSwKICAgICAgLi4ucGFydHMubWFwKChwLCBpKSA9PiB7CiAgICAgICAgaWYgKCEoaSAmIDEpKSByZXR1cm4gcDsKICAgICAgICBjb25zdCB2ID0gcmVzb2x2ZSh2YWxzLCBwKTsKICAgICAgICBpZiAodiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBpZiAoIWN0eD8uX19zdHJlYW1pbmdOb3cpIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHk\/Lmhhc0F0dHJpYnV0ZSgiZGF0YS1kYy1lZGl0b3Itb24iKSkgewogICAgICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAgICAgInNwYW4iLAogICAgICAgICAgICAgICAgeyBrZXk6IGksIGNsYXNzTmFtZTogInNjLWludGVycCBzYy11bnJlc29sdmVkIiB9LAogICAgICAgICAgICAgICAgInt7ICIgKyBwLnRyaW0oKSArICIgfX0iCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3YXJuVW5yZXNvbHZlZCgKICAgICAgICAgICAgICBjdHgsCiAgICAgICAgICAgICAgInt7ICIgKyBwLnRyaW0oKSArICIgfX0gbmV2ZXIgcmVzb2x2ZWQgXHUyMDE0IHJlbmRlcmVkIGFzIGVtcHR5IgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAic3BhbiIsCiAgICAgICAgICAgIHsga2V5OiBpLCBjbGFzc05hbWU6ICJzYy1pbnRlcnAgc2MtbWlzc2luZyIgfSwKICAgICAgICAgICAgcC50cmltKCkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRSZWFjdCgpLmlzVmFsaWRFbGVtZW50KHYpIHx8IEFycmF5LmlzQXJyYXkodikpIHsKICAgICAgICAgIHJldHVybiBoKGdldFJlYWN0KCkuRnJhZ21lbnQsIHsga2V5OiBpIH0sIHYpOwogICAgICAgIH0KICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB0eXBlb2YgdiA9PT0gImJvb2xlYW4iKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gaCgic3BhbiIsIHsga2V5OiBpLCBjbGFzc05hbWU6ICJzYy1pbnRlcnAiIH0sIFN0cmluZyh2KSk7CiAgICAgIH0pCiAgICApOwogIH0KICBmdW5jdGlvbiB3YWxrRm9yKGVsLCBob3N0KSB7CiAgICBjb25zdCBsaXN0R2V0ID0gY29tcGlsZUF0dHIoZWwuZ2V0QXR0cmlidXRlKCJsaXN0IikgfHwgIiIpOwogICAgY29uc3QgYXNOYW1lID0gZWwuZ2V0QXR0cmlidXRlKCJhcyIpIHx8ICJpdGVtIjsKICAgIGNvbnN0IGhpbnROID0gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKCJoaW50LXBsYWNlaG9sZGVyLWNvdW50IikgfHwgIjAiLCAxMCk7CiAgICBjb25zdCBraWRzID0gd2Fsa0NoaWxkcmVuKGVsLCBob3N0KTsKICAgIGNvbnN0IGxpc3RTcmMgPSBlbC5nZXRBdHRyaWJ1dGUoImxpc3QiKSB8fCAiIjsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IHsKICAgICAgbGV0IGxpc3QgPSBsaXN0R2V0KHZhbHMpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsKICAgICAgICBpZiAoIWN0eD8uX19zdHJlYW1pbmdOb3cpIHsKICAgICAgICAgIGlmIChsaXN0ICE9PSB2b2lkIDAgJiYgbGlzdCAhPT0gbnVsbCkgewogICAgICAgICAgICB3YXJuVW5yZXNvbHZlZCgKICAgICAgICAgICAgICBjdHgsCiAgICAgICAgICAgICAgJ3NjLWZvciBsaXN0PSInICsgbGlzdFNyYyArICciIGlzIG5vdCBhbiBhcnJheSAoJyArIHR5cGVvZiBsaXN0ICsgIikiCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBsaXN0ID0gW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxpc3QgPSBoaW50TiA+IDAgPyBBcnJheShoaW50TikuZmlsbCh2b2lkIDApIDogW107CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBoKAogICAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgICAgeyBrZXkgfSwKICAgICAgICBsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gewogICAgICAgICAgY29uc3Qgc3ViID0geyAuLi52YWxzLCBbYXNOYW1lXTogaXRlbSwgJGluZGV4OiBpIH07CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgZ2V0UmVhY3QoKS5GcmFnbWVudCwKICAgICAgICAgICAgeyBrZXk6IGkgfSwKICAgICAgICAgICAga2lkcy5tYXAoKGIsIGopID0+IGIoc3ViLCBjdHgsIGopKQogICAgICAgICAgKTsKICAgICAgICB9KQogICAgICApOwogICAgfTsKICB9CiAgZnVuY3Rpb24gd2Fsa0lmKGVsLCBob3N0KSB7CiAgICBjb25zdCB2YWxHZXQgPSBjb21waWxlQXR0cihlbC5nZXRBdHRyaWJ1dGUoInZhbHVlIikgfHwgIiIpOwogICAgY29uc3QgaGludFJhdyA9IGVsLmdldEF0dHJpYnV0ZSgiaGludC1wbGFjZWhvbGRlci12YWwiKTsKICAgIGNvbnN0IGhpbnRHZXQgPSBoaW50UmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihoaW50UmF3KSA6IG51bGw7CiAgICBjb25zdCBraWRzID0gd2Fsa0NoaWxkcmVuKGVsLCBob3N0KTsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IHsKICAgICAgbGV0IHYgPSB2YWxHZXQodmFscyk7CiAgICAgIGlmICh2ID09PSB2b2lkIDAgJiYgaGludEdldCAmJiBjdHg\/Ll9fc3RyZWFtaW5nTm93KSB2ID0gaGludEdldCh2YWxzKTsKICAgICAgcmV0dXJuIHYgPyBoKAogICAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgICAgeyBrZXkgfSwKICAgICAgICBraWRzLm1hcCgoYiwgaikgPT4gYih2YWxzLCBjdHgsIGopKQogICAgICApIDogbnVsbDsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHdhbGtDb21wb25lbnQoZWwsIGhvc3QpIHsKICAgIGNvbnN0IG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSB8fCBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudCIpIHx8ICIiOwogICAgZWwucmVtb3ZlQXR0cmlidXRlKCJuYW1lIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoImNvbXBvbmVudCIpOwogICAgY29uc3QgdHBsSWQgPSBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtZGMtdHBsIik7CiAgICBjb25zdCBzdHlsZVJhdyA9IGVsLmdldEF0dHJpYnV0ZSgic3R5bGUiKTsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKTsKICAgIGNvbnN0IHN0eWxlR2V0ID0gc3R5bGVSYXcgIT0gbnVsbCA\/IGNvbXBpbGVBdHRyKHN0eWxlUmF3KSA6IG51bGw7CiAgICBjb25zdCB7IHByb3BHZXR0ZXJzLCBoaW50U2l6ZSB9ID0gY29sbGVjdFByb3BzKGVsLCAiZGMtaW1wb3J0IiwgaG9zdCk7CiAgICBjb25zdCBraWRzID0gd2Fsa0NoaWxkcmVuKGVsLCBob3N0KTsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IHsKICAgICAgY29uc3QgcHJvcHMgPSB7CiAgICAgICAga2V5LAogICAgICAgIF9faGludFNpemU6IGhpbnRTaXplLAogICAgICAgIF9fdHBsSWQ6IHRwbElkLAogICAgICAgIF9faG9zdFN0eWxlOiBzdHlsZUdldCA\/IGhvc3RQb3NpdGlvblN0eWxlKHN0eWxlR2V0KHZhbHMpKSA6IHZvaWQgMAogICAgICB9OwogICAgICBmb3IgKGNvbnN0IFtrLCBnXSBvZiBwcm9wR2V0dGVycykgewogICAgICAgIGNvbnN0IHYgPSBnKHZhbHMpOwogICAgICAgIGlmIChrID09PSAiZGNQcm9wcyIpIHsKICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAib2JqZWN0IikgT2JqZWN0LmFzc2lnbihwcm9wcywgdik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcHJvcHNba10gPSB2OwogICAgICB9CiAgICAgIGlmIChraWRzLmxlbmd0aCkgcHJvcHMuY2hpbGRyZW4gPSBraWRzLm1hcCgoYiwgaikgPT4gYih2YWxzLCBjdHgsIGopKTsKICAgICAgcmV0dXJuIGgoaG9zdC5jb21wb25lbnQobmFtZSksIHByb3BzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHdhbGtYSW1wb3J0KGVsLCBob3N0KSB7CiAgICBjb25zdCBnbG9iYWxOYW1lR2V0ID0gY29tcGlsZUF0dHIoCiAgICAgIGVsLmdldEF0dHJpYnV0ZSgiY29tcG9uZW50LWZyb20tZ2xvYmFsLXNjb3BlIikgfHwgIiIKICAgICk7CiAgICBjb25zdCBleHBvcnROYW1lR2V0ID0gY29tcGlsZUF0dHIoCiAgICAgIGVsLmdldEF0dHJpYnV0ZSgiY29tcG9uZW50IikgfHwgZWwuZ2V0QXR0cmlidXRlKCJuYW1lIikgfHwgIiIKICAgICk7CiAgICBjb25zdCBmcm9tUmF3ID0gZWwuZ2V0QXR0cmlidXRlKCJmcm9tIikgfHwgZWwuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCBlbC5nZXRBdHRyaWJ1dGUoImltcG9ydCIpIHx8ICIiOwogICAgY29uc3QgdXJscyA9IGZyb21SYXcudHJpbSgpID8gZnJvbVJhdy50cmltKCkuc3BsaXQoL1xzKy8pIDogW107CiAgICBjb25zdCB1cmwgPSB1cmxzLmxlbmd0aCA\/IHVybHNbdXJscy5sZW5ndGggLSAxXSA6ICIiOwogICAgY29uc3Qga2luZE9mID0gKHUpID0+IC9cLihqc3h8dHN4KShcP3wjfCQpL2kudGVzdCh1KSA\/ICJqc3giIDogImpzIjsKICAgIGNvbnN0IHRwbElkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIpOwogICAgY29uc3Qgc3R5bGVSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBjb25zdCBzdHlsZUdldCA9IHN0eWxlUmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihzdHlsZVJhdykgOiBudWxsOwogICAgY29uc3Qgd3JhcCA9IHRwbElkICE9IG51bGwgfHwgc3R5bGVHZXQgIT0gbnVsbDsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIGhpbnRTaXplIH0gPSBjb2xsZWN0UHJvcHMoZWwsICJ4LWltcG9ydCIsIGhvc3QpOwogICAgY29uc3QgaGFzQ29udGVudCA9IGVsLmNoaWxkcmVuLmxlbmd0aCA+IDAgfHwgISEoZWwudGV4dENvbnRlbnQgfHwgIiIpLnRyaW0oKTsKICAgIGNvbnN0IGtpZHMgPSBoYXNDb250ZW50ID8gd2Fsa0NoaWxkcmVuKGVsLCBob3N0KSA6IFtdOwogICAgY29uc3QgdXJsQmluZGFibGUgPSBmcm9tUmF3LmluY2x1ZGVzKCJ7eyIpOwogICAgaWYgKHVybHMubGVuZ3RoICYmICF1cmxCaW5kYWJsZSkgewogICAgICBsZXQgcHJldjsKICAgICAgZm9yIChjb25zdCB1IG9mIHVybHMpIHByZXYgPSBob3N0LmxvYWRFeHRlcm5hbChraW5kT2YodSksIHUsIHByZXYpOwogICAgfQogICAgY29uc3QgZXZhbE5hbWUgPSAoZywgdmFscykgPT4gewogICAgICBjb25zdCB2ID0gZyh2YWxzKTsKICAgICAgY29uc3QgcyA9IHYgPT0gbnVsbCA\/ICIiIDogU3RyaW5nKHYpOwogICAgICByZXR1cm4gcy5pbmNsdWRlcygie3siKSA\/ICIiIDogczsKICAgIH07CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGNvbnN0IGdsb2JhbE5hbWUgPSBldmFsTmFtZShnbG9iYWxOYW1lR2V0LCB2YWxzKTsKICAgICAgY29uc3QgbmFtZSA9IGdsb2JhbE5hbWUgfHwgZXZhbE5hbWUoZXhwb3J0TmFtZUdldCwgdmFscyk7CiAgICAgIGNvbnN0IEMgPSAhbmFtZSB8fCB1cmxCaW5kYWJsZSA\/IG51bGwgOiBnbG9iYWxOYW1lID8gaG9zdC5yZXNvbHZlRXh0ZXJuYWxHbG9iYWwodXJsLCBnbG9iYWxOYW1lKSA6IGhvc3QucmVzb2x2ZUV4dGVybmFsKHVybCwgbmFtZSk7CiAgICAgIGNvbnN0IGhvc3RTdHlsZSA9IHN0eWxlR2V0ID8gaG9zdFBvc2l0aW9uU3R5bGUoc3R5bGVHZXQodmFscykpIDogdm9pZCAwOwogICAgICBjb25zdCB3cmFwcGVyID0gd3JhcCA\/IHsKICAgICAgICBrZXksCiAgICAgICAgY2xhc3NOYW1lOiAic2MtaG9zdC14IiwKICAgICAgICAiZGF0YS1kYy10cGwiOiB0cGxJZCwKICAgICAgICBzdHlsZTogaG9zdFN0eWxlIHx8IHsgZGlzcGxheTogImNvbnRlbnRzIiB9CiAgICAgIH0gOiBudWxsOwogICAgICBpZiAoIUMpIHsKICAgICAgICBjb25zdCBlcnJvciA9IHVybEJpbmRhYmxlID8gIngtaW1wb3J0IGBmcm9tYCBjYW5ub3QgY29udGFpbiB7eyBcdTIwMjYgfX0gXHUyMDE0IG1vZHVsZSBVUkxzIGFyZSByZXNvbHZlZCBhdCBwYXJzZSB0aW1lOyB1c2UgYSBsaXRlcmFsIFVSTCIgOiBob3N0LnJlc29sdmVFeHRlcm5hbEVycm9yKHVybCwgbmFtZSk7CiAgICAgICAgY29uc3QgcGggPSBob3N0LnBsYWNlaG9sZGVyKHsKICAgICAgICAgIGtleTogd3JhcHBlciA\/IHZvaWQgMCA6IGtleSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBoaW50U2l6ZSwKICAgICAgICAgIGVycm9yCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHdyYXBwZXIgPyBoKCJkaXYiLCB3cmFwcGVyLCBwaCkgOiBwaDsKICAgICAgfQogICAgICBjb25zdCBwcm9wcyA9IHdyYXBwZXIgPyB7fSA6IHsga2V5IH07CiAgICAgIGxldCB1bnJlc29sdmVkSG9sZSA9IGZhbHNlOwogICAgICBmb3IgKGNvbnN0IFtrLCBnXSBvZiBwcm9wR2V0dGVycykgewogICAgICAgIGlmIChrID09PSAiY29tcG9uZW50IiB8fCBrID09PSAiY29tcG9uZW50RnJvbUdsb2JhbFNjb3BlIiB8fCBrID09PSAiZnJvbSIpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB2ID0gZyh2YWxzKTsKICAgICAgICBpZiAodiA9PT0gdm9pZCAwKSB1bnJlc29sdmVkSG9sZSA9IHRydWU7CiAgICAgICAgaWYgKGsgPT09ICJkY1Byb3BzIikgewogICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09ICJvYmplY3QiKSBPYmplY3QuYXNzaWduKHByb3BzLCB2KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBwcm9wc1trXSA9IHY7CiAgICAgIH0KICAgICAgaWYgKHVucmVzb2x2ZWRIb2xlICYmIGN0eD8uX19odG1sU3RyZWFtaW5nTm93KSB7CiAgICAgICAgY29uc3QgcGggPSBob3N0LnBsYWNlaG9sZGVyKHsKICAgICAgICAgIGtleTogd3JhcHBlciA\/IHZvaWQgMCA6IGtleSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBoaW50U2l6ZSwKICAgICAgICAgIGVycm9yOiBudWxsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHdyYXBwZXIgPyBoKCJkaXYiLCB3cmFwcGVyLCBwaCkgOiBwaDsKICAgICAgfQogICAgICBpZiAoa2lkcy5sZW5ndGgpIHByb3BzLmNoaWxkcmVuID0ga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSk7CiAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgaChDLCBwcm9wcykpIDogaChDLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrRWxlbWVudChlbCwgaG9zdCkgewogICAgY29uc3QgcmVhbFRhZyA9IFJBV19VTldSQVBbZWwubG9jYWxOYW1lXSB8fCBlbC5sb2NhbE5hbWU7CiAgICBjb25zdCB0cGxJZCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiKTsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRvbSIsIGhvc3QpOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGNvbnN0IHByb3BzID0geyBrZXksICJkYXRhLWRjLXRwbCI6IHRwbElkIH07CiAgICAgIGZvciAoY29uc3QgW2ssIGddIG9mIHByb3BHZXR0ZXJzKSB7CiAgICAgICAgbGV0IHYgPSBnKHZhbHMpOwogICAgICAgIGlmIChrID09PSAic3R5bGUiICYmIHR5cGVvZiB2ID09PSAic3RyaW5nIikgdiA9IGNzc1RvT2JqKHYpOwogICAgICAgIGlmICgoayA9PT0gInZhbHVlIiB8fCBrID09PSAiY2hlY2tlZCIpICYmIHYgPT09IHZvaWQgMCkgewogICAgICAgICAgdiA9IGsgPT09ICJjaGVja2VkIiA\/IGZhbHNlIDogIiI7CiAgICAgICAgfQogICAgICAgIHByb3BzW2tdID0gdjsKICAgICAgfQogICAgICBpZiAocHNldWRvQ2xhc3Nlcy5sZW5ndGgpIHsKICAgICAgICBwcm9wcy5jbGFzc05hbWUgPSBbcHJvcHMuY2xhc3NOYW1lLCAuLi5wc2V1ZG9DbGFzc2VzXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpOwogICAgICB9CiAgICAgIHJldHVybiBoKHJlYWxUYWcsIHByb3BzLCAuLi5raWRzLm1hcCgoYiwgaikgPT4gYih2YWxzLCBjdHgsIGopKSk7CiAgICB9OwogIH0KCiAgLy8gc3JjL2xvZ2ljLnRzCiAgdmFyIFN0cmVhbWFibGVMb2dpYyA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7CiAgICAgIF9fcHVibGljRmllbGQodGhpcywgInByb3BzIik7CiAgICAgIF9fcHVibGljRmllbGQodGhpcywgInN0YXRlIiwge30pOwogICAgICAvKiogQmFjay1wb2ludGVyIHRvIHRoZSB3cmFwcGVyIGNvbXBvbmVudCwgaW5zdGFsbGVkIGFmdGVyIGNvbnN0cnVjdGlvbi4gKi8KICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19ob3N0Iik7CiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcyB8fCB7fTsKICAgIH0KICAgIHNldFN0YXRlKHVwZGF0ZSwgY2IpIHsKICAgICAgdGhpcy5fX2hvc3QgJiYgdGhpcy5fX2hvc3QuX19zZXRMb2dpY1N0YXRlKHVwZGF0ZSwgY2IpOwogICAgfQogICAgZm9yY2VVcGRhdGUoKSB7CiAgICAgIHRoaXMuX19ob3N0ICYmIHRoaXMuX19ob3N0LmZvcmNlVXBkYXRlKCk7CiAgICB9CiAgICBjb21wb25lbnREaWRNb3VudCgpIHsKICAgIH0KICAgIGNvbXBvbmVudERpZFVwZGF0ZShfcHJldlByb3BzKSB7CiAgICB9CiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHsKICAgIH0KICAgIC8qKiBUaGUgZmxhdCBvYmplY3QgdGhlIHRlbXBsYXRlIHJlbmRlcnMgYWdhaW5zdCAobWVyZ2VkIG92ZXIgcHJvcHMpLiAqLwogICAgcmVuZGVyVmFscygpIHsKICAgICAgcmV0dXJuIHt9OwogICAgfQogIH07CiAgZnVuY3Rpb24gZXZhbERjTG9naWMoc3JjKSB7CiAgICAvLyEgbm9zZW1ncmVwOiBldmFsLWFuZC1mdW5jdGlvbi1jb25zdHJ1Y3RvcgogICAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oCiAgICAgICJEQ0xvZ2ljIiwKICAgICAgIlN0cmVhbWFibGVMb2dpYyIsCiAgICAgICJSZWFjdCIsCiAgICAgIHNyYyArICdcbjtyZXR1cm4gKHR5cGVvZiBDb21wb25lbnQhPT0idW5kZWZpbmVkIiYmQ29tcG9uZW50KXx8dW5kZWZpbmVkOycKICAgICk7CiAgICByZXR1cm4gZm4oU3RyZWFtYWJsZUxvZ2ljLCBTdHJlYW1hYmxlTG9naWMsIGdldFJlYWN0KCkpOwogIH0KCiAgLy8gc3JjL2NvbXBvbmVudC50cwogIGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChhLCBiKSB7CiAgICBpZiAoIWIpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IGFrID0gT2JqZWN0LmtleXMoYSkuZmlsdGVyKChrKSA9PiBrICE9PSAiY2hpbGRyZW4iKTsKICAgIGNvbnN0IGJrID0gT2JqZWN0LmtleXMoYikuZmlsdGVyKChrKSA9PiBrICE9PSAiY2hpbGRyZW4iKTsKICAgIGlmIChhay5sZW5ndGggIT09IGJrLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChjb25zdCBrIG9mIGFrKSBpZiAoYVtrXSAhPT0gYltrXSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIFBsYWNlaG9sZGVyKHsKICAgIG5hbWUsCiAgICBoaW50U2l6ZSwKICAgIHN0cmVhbWluZywKICAgIGVycm9yCiAgfSkgewogICAgY29uc3QgW3csIGhndF0gPSAoaGludFNpemUgfHwgIjEwMCUsNjBweCIpLnNwbGl0KCIsIik7CiAgICByZXR1cm4gaCgKICAgICAgImRpdiIsCiAgICAgIHsKICAgICAgICBjbGFzc05hbWU6ICJzYy1wbGFjZWhvbGRlciIgKyAoc3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmciIDogIiIpLAogICAgICAgIHN0eWxlOiB7IHdpZHRoOiB3LnRyaW0oKSwgaGVpZ2h0OiBoZ3QgJiYgaGd0LnRyaW0oKSB9LAogICAgICAgIHRpdGxlOiBuYW1lCiAgICAgIH0sCiAgICAgIGVycm9yID8gaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogInNjLXBsYWNlaG9sZGVyLWVycm9yIiB9LAogICAgICAgIChuYW1lID8gbmFtZSArICI6ICIgOiAiIikgKyBlcnJvcgogICAgICApIDogbnVsbAogICAgKTsKICB9CiAgZnVuY3Rpb24gaGludFRvTWluKGhpbnQpIHsKICAgIGlmICghaGludCkgcmV0dXJuIHZvaWQgMDsKICAgIGNvbnN0IFt3LCBoZ3RdID0gaGludC5zcGxpdCgiLCIpOwogICAgcmV0dXJuIHsgbWluV2lkdGg6IHcudHJpbSgpLCBtaW5IZWlnaHQ6IGhndCAmJiBoZ3QudHJpbSgpIH07CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEZhY3RvcnkocmVnaXN0cnksIGVuc3VyZUZldGNoZWQpIHsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IEFuY2VzdG9yQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoW10pOwogICAgY2xhc3MgU3RyZWFtYWJsZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7CiAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7CiAgICAgICAgc3VwZXIocHJvcHMpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fbmFtZSIpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fc3ViIik7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19uZWVkc0RpZE1vdW50IiwgZmFsc2UpOwogICAgICAgIC8qKiBTbmFwc2hvdCBvZiB0aGUgcmVnaXN0cnkncyBzdHJlYW1pbmcgZmxhZ3MgdGFrZW4gYXQgcmVuZGVyIHRpbWUg4oCUCiAgICAgICAgICogIGJ1aWxkZXJzIHJlYWQgaXQgb2ZmIHRoZSBSZW5kZXJDdHggKHRoaXMpIHRvIHBpY2sgcGxhY2Vob2xkZXIgdnMKICAgICAgICAgKiAgcmVuZGVyLW5vdGhpbmcgZm9yIHVucmVzb2x2ZWQgdmFsdWVzLiAqLwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fc3RyZWFtaW5nTm93IiwgZmFsc2UpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9faHRtbFN0cmVhbWluZ05vdyIsIGZhbHNlKTsKICAgICAgICAvKiogV2hlbiBhIGNvbnN0cnVjdCB0aHJvd3MsIHJlbWVtYmVyIHRoZSAoY2xhc3MsIHJlZ2lzdHJ5LnZlciwgcHJvcHMpCiAgICAgICAgICogIHRyaXBsZSBzbyByZW5kZXItdGltZSByZWNvbmNpbGUgZG9lc24ndCByZS1hdHRlbXB0IGl0IG9uIGV2ZXJ5IHBhcmVudAogICAgICAgICAqICByZS1yZW5kZXIuIEEgcmVnaXN0cnkgYnVtcCAobmV3IGNsYXNzLCB0ZW1wbGF0ZSwgZXh0ZXJuYWwgbW9kdWxlCiAgICAgICAgICogIHJlc29sdmluZyB2aWEgYnVtcEFsbCkgY2hhbmdlcyBgdmVyYCBhbmQgYnJlYWtzIHRoZSBtZW1vIHNvIGFuCiAgICAgICAgICogIGVudi1kZXBlbmRlbnQgY29uc3RydWN0b3IgY2FuIHNlbGYtaGVhbC4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2ZhaWxlZExvZ2ljIiwgbnVsbCk7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRVc2VyUHJvcHMiLCBudWxsKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2ZhaWxlZFZlciIsIC0xKTsKICAgICAgICAvKiogUGVyLWluc3RhbmNlIGNvbnN0cnVjdG9yIGVycm9yIOKAlCBrZXB0IGhlcmUgKG5vdCBvbiB0aGUgcmVnaXN0cnkgZW50cnkpCiAgICAgICAgICogIHNvIG9uZSBpbnN0YW5jZSdzIHN1Y2Nlc3NmdWwgY29uc3RydWN0IGNhbid0IGhpZGUgYSBzaWJsaW5nJ3MgZmFpbHVyZSwKICAgICAgICAgKiAgYW5kIGEgY29uc3RydWN0IGNhbiBuZXZlciB3aXBlIGFuIGV2YWwgZXJyb3IgYHVwZGF0ZUpzYCByZWNvcmRlZCBvbgogICAgICAgICAqICBgci5sb2dpY0Vycm9yYC4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2N0b3JFcnJvciIsIG51bGwpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgImxvZ2ljIik7CiAgICAgICAgdGhpcy5fX25hbWUgPSBwcm9wcy5fX25hbWU7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgX192OiAwLCBfX2VycjogbnVsbCB9OwogICAgICAgIHRoaXMuX19zdWIgPSAoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5fX2VycikgdGhpcy5zZXRTdGF0ZSh7IF9fZXJyOiBudWxsIH0pOwogICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5fX21ha2VMb2dpYyhyZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLkxvZ2ljLCBudWxsKTsKICAgICAgICBlbnN1cmVGZXRjaGVkKHRoaXMuX19uYW1lKTsKICAgICAgfQogICAgICAvKiogRXJyb3ItYm91bmRhcnkgaG9vazogYSByZW5kZXIgY3Jhc2ggYW55d2hlcmUgaW4gdGhpcyBEQydzIHN1YnRyZWUKICAgICAgICogIChpdHMgb3duIHRlbXBsYXRlLCBhbiB4LWltcG9ydCdkIGNvbXBvbmVudCwgYSBjaGlsZCBEQyB3aXRob3V0IGl0cwogICAgICAgKiAgb3duIGRlZXBlciBib3VuZGFyeSkgbGFuZHMgaGVyZSBpbnN0ZWFkIG9mIHVubW91bnRpbmcgdGhlIHBhZ2UuICovCiAgICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZSkgewogICAgICAgIHJldHVybiB7IF9fZXJyOiBlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpIH07CiAgICAgIH0KICAgICAgY29tcG9uZW50RGlkQ2F0Y2goZSwgaW5mbykgewogICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHJlbmRlciBlcnJvciBpbiA8IiArIHRoaXMuX19uYW1lICsgIj46IiwKICAgICAgICAgIGUsCiAgICAgICAgICBpbmZvPy5jb21wb25lbnRTdGFjayB8fCAiIgogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqIEluc3RhbnRpYXRlIHRoZSBsb2dpYyBjbGFzcyAob3IgdGhlIG5vLW9wIGJhc2UpIGFuZCBhZG9wdCBgcHJldlN0YXRlYAogICAgICAgKiAgb3ZlciBpdHMgaW5pdGlhbCBzdGF0ZSDigJQgdXNlZCBib3RoIGF0IG1vdW50IGFuZCBvbiBob3Qtc3dhcC4gKi8KICAgICAgX19tYWtlTG9naWMoTG9naWMsIHByZXZTdGF0ZSkgewogICAgICAgIGNvbnN0IEwgPSBMb2dpYyB8fCBTdHJlYW1hYmxlTG9naWM7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMubG9naWMgPSBuZXcgTCh0aGlzLl9fdXNlclByb3BzKCkpOwogICAgICAgICAgdGhpcy5fX2ZhaWxlZExvZ2ljID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMgPSBudWxsOwogICAgICAgICAgdGhpcy5fX2N0b3JFcnJvciA9IG51bGw7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRMb2dpYyA9IExvZ2ljOwogICAgICAgICAgdGhpcy5fX2ZhaWxlZFVzZXJQcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRWZXIgPSByZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnZlcjsKICAgICAgICAgIHRoaXMuX19jdG9yRXJyb3IgPSB0aGlzLl9fbmFtZSArICI6ICIgKyAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA\/IGUubWVzc2FnZSA6IFN0cmluZyhlKSk7CiAgICAgICAgICB0aGlzLmxvZ2ljID0gbmV3IFN0cmVhbWFibGVMb2dpYygKICAgICAgICAgICAgdGhpcy5fX3VzZXJQcm9wcygpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvZ2ljLl9faG9zdCA9IHRoaXM7CiAgICAgICAgaWYgKHByZXZTdGF0ZSkKICAgICAgICAgIHRoaXMubG9naWMuc3RhdGUgPSB7IC4uLnRoaXMubG9naWMuc3RhdGUgfHwge30sIC4uLnByZXZTdGF0ZSB9OwogICAgICB9CiAgICAgIC8qKiBUaGUgcHJvcHMgdGhlIGF1dGhvcidzIGxvZ2ljICsgdGVtcGxhdGUgc2VlIOKAlCBpbnRlcm5hbCBfXy1wcmVmaXhlZAogICAgICAgKiAgd2lyaW5nIHN0cmlwcGVkLiAqLwogICAgICBfX3VzZXJQcm9wcygpIHsKICAgICAgICBjb25zdCB7IF9fbmFtZSwgX19oaW50U2l6ZSwgX190cGxJZCwgX19ob3N0U3R5bGUsIC4uLnJlc3QgfSA9IHRoaXMucHJvcHM7CiAgICAgICAgcmV0dXJuIHJlc3Q7CiAgICAgIH0KICAgICAgX19zZXRMb2dpY1N0YXRlKHVwZGF0ZSwgY2IpIHsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5sb2dpYy5zdGF0ZTsKICAgICAgICBjb25zdCBwYXRjaCA9IHR5cGVvZiB1cGRhdGUgPT09ICJmdW5jdGlvbiIgPyB1cGRhdGUocHJldikgOiB1cGRhdGU7CiAgICAgICAgdGhpcy5sb2dpYy5zdGF0ZSA9IHsgLi4ucHJldiwgLi4ucGF0Y2ggfTsKICAgICAgICB0aGlzLnNldFN0YXRlKChzKSA9PiAoeyBfX3Y6IHMuX192ICsgMSB9KSwgY2IpOwogICAgICB9CiAgICAgIC8qKiBTd2FwIHRoZSBsb2dpYyBpbnN0YW5jZSB3aGVuIHRoZSByZWdpc3RyeSdzIExvZ2ljIGNsYXNzIGNoYW5nZWQKICAgICAgICogIChzdHJlYW1pbmcgY29tcGxldGlvbiwgaG90IHJlbG9hZCkuIFN0YXRlIGNhcnJpZXMgb3ZlcjsgZGlkTW91bnQKICAgICAgICogIHJlLWZpcmVzIGFmdGVyIHRoZSBzd2FwIGNvbW1pdHMgc28gcmVmcyBleGlzdC4gKi8KICAgICAgX19yZWNvbmNpbGVMb2dpYygpIHsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKTsKICAgICAgICBjb25zdCBOZXh0ID0gci5Mb2dpYzsKICAgICAgICBjb25zdCBDdXIgPSB0aGlzLmxvZ2ljLmNvbnN0cnVjdG9yOwogICAgICAgIGlmIChOZXh0ID09PSBDdXIgfHwgIU5leHQgJiYgQ3VyID09PSBTdHJlYW1hYmxlTG9naWMgfHwgTmV4dCA9PT0gdGhpcy5fX2ZhaWxlZExvZ2ljICYmIHIudmVyID09PSB0aGlzLl9fZmFpbGVkVmVyICYmIHNoYWxsb3dFcXVhbCh0aGlzLl9fdXNlclByb3BzKCksIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fX21ha2VMb2dpYyhOZXh0LCB0aGlzLmxvZ2ljLnN0YXRlKTsKICAgICAgICB0aGlzLl9fbmVlZHNEaWRNb3VudCA9IHRydWU7CiAgICAgIH0KICAgICAgY29tcG9uZW50RGlkTW91bnQoKSB7CiAgICAgICAgcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5zdWJzLmFkZCh0aGlzLl9fc3ViKTsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHsKICAgICAgICB0aGlzLmxvZ2ljLnByb3BzID0gdGhpcy5fX3VzZXJQcm9wcygpOwogICAgICAgIGlmICh0aGlzLl9fbmVlZHNEaWRNb3VudCkgewogICAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIgfHwgIXJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSkudHBsKSByZXR1cm47CiAgICAgICAgICB0aGlzLl9fbmVlZHNEaWRNb3VudCA9IGZhbHNlOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHsKICAgICAgICByZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnN1YnMuZGVsZXRlKHRoaXMuX19zdWIpOwogICAgICAgIGlmICghdGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmVuZGVyKCkgewogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpOwogICAgICAgIGNvbnN0IGNscyA9ICJzYy1ob3N0IiArIChyLmh0bWxTdHJlYW1pbmcgPyAiIHNjLXN0cmVhbWluZy1odG1sIiA6ICIiKSArIChyLmpzU3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmctanMiIDogIiIpOwogICAgICAgIGNvbnN0IGhpbnRTdHlsZSA9IHIuaHRtbFN0cmVhbWluZyA\/IGhpbnRUb01pbih0aGlzLnByb3BzLl9faGludFNpemUpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IGhvc3RTdHlsZSA9IHRoaXMucHJvcHMuX19ob3N0U3R5bGUgfHwgaGludFN0eWxlID8geyAuLi5oaW50U3R5bGUgfHwge30sIC4uLnRoaXMucHJvcHMuX19ob3N0U3R5bGUgfHwge30gfSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBob3N0QmFzZSA9IHsKICAgICAgICAgIGNsYXNzTmFtZTogY2xzLAogICAgICAgICAgc3R5bGU6IGhvc3RTdHlsZSwKICAgICAgICAgICJkYXRhLXNjLW5hbWUiOiB0aGlzLl9fbmFtZSwKICAgICAgICAgICJkYXRhLWRjLXRwbCI6IHRoaXMucHJvcHMuX190cGxJZAogICAgICAgIH07CiAgICAgICAgY29uc3QgY2hhaW4gPSBBcnJheS5pc0FycmF5KHRoaXMuY29udGV4dCkgPyB0aGlzLmNvbnRleHQgOiBbXTsKICAgICAgICBpZiAoY2hhaW4uaW5jbHVkZXModGhpcy5fX25hbWUpKSB7CiAgICAgICAgICBjb25zdCBjeWNsZSA9IFsKICAgICAgICAgICAgLi4uY2hhaW4uc2xpY2UoY2hhaW4uaW5kZXhPZih0aGlzLl9fbmFtZSkpLAogICAgICAgICAgICB0aGlzLl9fbmFtZQogICAgICAgICAgXS5qb2luKCIgXHUyMTkyICIpOwogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArICIgc2MtaGFzLWVycm9yIiB9LAogICAgICAgICAgICBoKFBsYWNlaG9sZGVyLCB7CiAgICAgICAgICAgICAgbmFtZTogdGhpcy5fX25hbWUsCiAgICAgICAgICAgICAgaGludFNpemU6IHRoaXMucHJvcHMuX19oaW50U2l6ZSwKICAgICAgICAgICAgICBlcnJvcjogImNpcmN1bGFyIGltcG9ydDogIiArIGN5Y2xlCiAgICAgICAgICAgIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zdGF0ZS5fX2VycikgewogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArICIgc2MtaGFzLWVycm9yIiB9LAogICAgICAgICAgICBoKAogICAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAic2MtbG9naWMtZXJyb3IiLCAiZGF0YS1vbWVsZXR0ZS1jaHJvbWUiOiAiIiB9LAogICAgICAgICAgICAgIHRoaXMuX19uYW1lICsgIjogIiArIHRoaXMuc3RhdGUuX19lcnIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaChQbGFjZWhvbGRlciwgewogICAgICAgICAgICAgIG5hbWU6IHRoaXMuX19uYW1lLAogICAgICAgICAgICAgIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUsCiAgICAgICAgICAgICAgZXJyb3I6IHRoaXMuc3RhdGUuX19lcnIKICAgICAgICAgICAgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19yZWNvbmNpbGVMb2dpYygpOwogICAgICAgIGlmICghci50cGwpIHsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgaG9zdEJhc2UsCiAgICAgICAgICAgIGgoUGxhY2Vob2xkZXIsIHsgbmFtZTogdGhpcy5fX25hbWUsIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVzZXJQcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICB0aGlzLmxvZ2ljLnByb3BzID0gdXNlclByb3BzOwogICAgICAgIGxldCB2YWxzID0gdXNlclByb3BzOwogICAgICAgIGxldCByZW5kZXJFcnIgPSByLmxvZ2ljRXJyb3IgfHwgdGhpcy5fX2N0b3JFcnJvcjsKICAgICAgICB0cnkgewogICAgICAgICAgdmFscyA9IHsgLi4udXNlclByb3BzLCAuLi50aGlzLmxvZ2ljLnJlbmRlclZhbHMoKSB8fCB7fSB9OwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICByZW5kZXJFcnIgPSB0aGlzLl9fbmFtZSArICIucmVuZGVyVmFscygpOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9fc3RyZWFtaW5nTm93ID0gISEoci5odG1sU3RyZWFtaW5nIHx8IHIuanNTdHJlYW1pbmcpOwogICAgICAgIHRoaXMuX19odG1sU3RyZWFtaW5nTm93ID0gISFyLmh0bWxTdHJlYW1pbmc7CiAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsgLi4uaG9zdEJhc2UsIGNsYXNzTmFtZTogY2xzICsgKHJlbmRlckVyciA\/ICIgc2MtaGFzLWVycm9yIiA6ICIiKSB9LAogICAgICAgICAgcmVuZGVyRXJyICYmIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IGNsYXNzTmFtZTogInNjLWxvZ2ljLWVycm9yIiwgImRhdGEtb21lbGV0dGUtY2hyb21lIjogIiIgfSwKICAgICAgICAgICAgcmVuZGVyRXJyCiAgICAgICAgICApLAogICAgICAgICAgaCgKICAgICAgICAgICAgQW5jZXN0b3JDb250ZXh0LlByb3ZpZGVyLAogICAgICAgICAgICB7IHZhbHVlOiBbLi4uY2hhaW4sIHRoaXMuX19uYW1lXSB9LAogICAgICAgICAgICByLnRwbCh2YWxzLCB0aGlzKQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIF9fcHVibGljRmllbGQoU3RyZWFtYWJsZUNvbXBvbmVudCwgImNvbnRleHRUeXBlIiwgQW5jZXN0b3JDb250ZXh0KTsKICAgIGNvbnN0IG5hbWVkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGZ1bmN0aW9uIGdldERDKG5hbWUpIHsKICAgICAgY29uc3QgaGl0ID0gbmFtZWQuZ2V0KG5hbWUpOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgICBmdW5jdGlvbiBEaXNwYXRjaGVyKHApIHsKICAgICAgICBjb25zdCBbLCBzZXRUaWNrXSA9IFJlYWN0LnVzZVN0YXRlKDApOwogICAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBzdWIgPSAoKSA9PiBzZXRUaWNrKChuKSA9PiBuICsgMSk7CiAgICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuc3Vicy5hZGQoc3ViKTsKICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgIHJlZ2lzdHJ5LmdldChuYW1lKS5zdWJzLmRlbGV0ZShzdWIpOwogICAgICAgICAgfTsKICAgICAgICB9LCBbXSk7CiAgICAgICAgZW5zdXJlRmV0Y2hlZChuYW1lKTsKICAgICAgICByZXR1cm4gaChTdHJlYW1hYmxlQ29tcG9uZW50LCB7IC4uLnAsIF9fbmFtZTogbmFtZSB9KTsKICAgICAgfQogICAgICBEaXNwYXRjaGVyLmRpc3BsYXlOYW1lID0gbmFtZTsKICAgICAgbmFtZWQuc2V0KG5hbWUsIERpc3BhdGNoZXIpOwogICAgICByZXR1cm4gRGlzcGF0Y2hlcjsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGdldERDLAogICAgICBTdHJlYW1hYmxlQ29tcG9uZW50CiAgICB9OwogIH0KCiAgLy8gc3JjL2V4dGVybmFsLnRzCiAgdmFyIGlzQ3VzdG9tRWxlbWVudE5hbWUgPSAobikgPT4gIW4uaW5jbHVkZXMoIi4iKSAmJiBuLmluY2x1ZGVzKCItIik7CiAgZnVuY3Rpb24gaXNSZW5kZXJhYmxlVHlwZShnKSB7CiAgICBpZiAodHlwZW9mIGcgPT09ICJmdW5jdGlvbiIpIHJldHVybiAhaXNFbGVtZW50Q2xhc3MoZyk7CiAgICByZXR1cm4gdHlwZW9mIGcgPT09ICJvYmplY3QiICYmIGcgIT09IG51bGwgJiYgdHlwZW9mIGcuJCR0eXBlb2YgPT09ICJzeW1ib2wiOwogIH0KICBmdW5jdGlvbiByZXNvbHZlRG90dGVkUGF0aChyb290LCBuYW1lKSB7CiAgICBsZXQgY3VyID0gcm9vdDsKICAgIGZvciAoY29uc3Qgc2VnIG9mIG5hbWUuc3BsaXQoIi4iKSkgewogICAgICBpZiAoY3VyID09IG51bGwpIHJldHVybiB2b2lkIDA7CiAgICAgIGN1ciA9IGN1cltzZWddOwogICAgfQogICAgcmV0dXJuIGN1cjsKICB9CiAgdmFyIEJBQkVMX1VSTCA9ICJodHRwczovL3VucGtnLmNvbS9AYmFiZWwvc3RhbmRhbG9uZUA3LjI2LjQvYmFiZWwubWluLmpzIjsKICB2YXIgR0xPQkFMX1BPTExfSU5URVJWQUxfTVMgPSA1MDsKICB2YXIgR0xPQkFMX1BPTExfVElNRU9VVF9NUyA9IDNlNDsKICBmdW5jdGlvbiBjcmVhdGVFeHRlcm5hbE1vZHVsZXMob25SZXNvbHZlZCkgewogICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgbGV0IGJhYmVsTG9hZGluZyA9IG51bGw7CiAgICBjb25zdCByZXBvcnRlZE1pc3NpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgY29uc3QgcG9sbGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBmdW5jdGlvbiBlbnN1cmVCYWJlbCgpIHsKICAgICAgaWYgKHdpbmRvdy5CYWJlbCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgICBpZiAoYmFiZWxMb2FkaW5nKSByZXR1cm4gYmFiZWxMb2FkaW5nOwogICAgICBiYWJlbExvYWRpbmcgPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHsKICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgcy5zcmMgPSBCQUJFTF9VUkw7CiAgICAgICAgcy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIHMub25sb2FkID0gKCkgPT4gcmVzKCk7CiAgICAgICAgcy5vbmVycm9yID0gcmVqOwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICAgIH0pOwogICAgICByZXR1cm4gYmFiZWxMb2FkaW5nOwogICAgfQogICAgY29uc3QgcGVuZGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmdW5jdGlvbiBsb2FkKGtpbmQsIHVybCwgYWZ0ZXIpIHsKICAgICAgY29uc3QgZXhpc3RpbmcgPSBwZW5kaW5nLmdldCh1cmwpOwogICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZzsKICAgICAgY2FjaGUuc2V0KHVybCwgbnVsbCk7CiAgICAgIGNvbnNvbGUuaW5mbygiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBsb2FkaW5nIiwgdXJsLCAiKCIgKyBraW5kICsgIikiKTsKICAgICAgY29uc3QgcmVhZHkgPSBQcm9taXNlLmFsbChbCiAgICAgICAga2luZCA9PT0gImpzeCIgPyBlbnN1cmVCYWJlbCgpIDogUHJvbWlzZS5yZXNvbHZlKCksCiAgICAgICAgYWZ0ZXIgPz8gUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgXSk7CiAgICAgIGNvbnN0IHAgPSByZWFkeS50aGVuKCgpID0+IGZldGNoKHVybCkpLnRoZW4oKHIpID0+IHsKICAgICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcigiSFRUUCAiICsgci5zdGF0dXMpOwogICAgICAgIHJldHVybiByLnRleHQoKTsKICAgICAgfSkudGhlbigoc3JjKSA9PiB7CiAgICAgICAgY29uc3QgY29kZSA9IGtpbmQgPT09ICJqc3giID8gd2luZG93LkJhYmVsLnRyYW5zZm9ybShzcmMsIHsKICAgICAgICAgIGZpbGVuYW1lOiB1cmwsCiAgICAgICAgICBwcmVzZXRzOiBbInJlYWN0IiwgInR5cGVzY3JpcHQiXQogICAgICAgIH0pLmNvZGUgOiBzcmM7CiAgICAgICAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogICAgICAgIGNvbnN0IGJlZm9yZSA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7CiAgICAgICAgLy8hIG5vc2VtZ3JlcDogZXZhbC1hbmQtZnVuY3Rpb24tY29uc3RydWN0b3IKICAgICAgICBuZXcgRnVuY3Rpb24oIlJlYWN0IiwgIm1vZHVsZSIsICJleHBvcnRzIiwgInJlcXVpcmUiLCBjb2RlKSgKICAgICAgICAgIGdldFJlYWN0KCksCiAgICAgICAgICBtb2R1bGUsCiAgICAgICAgICBtb2R1bGUuZXhwb3J0cywKICAgICAgICAgICgpID0+ICh7fSkKICAgICAgICApOwogICAgICAgIGNvbnN0IGdsb2JhbHMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMod2luZG93KSkgewogICAgICAgICAgaWYgKCFiZWZvcmUuaGFzKGspICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgZ2xvYmFsc1trXSA9IHdpbmRvd1trXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FjaGUuc2V0KHVybCwgeyBtb2Q6IG1vZHVsZS5leHBvcnRzLCBnbG9iYWxzIH0pOwogICAgICAgIGNvbnNvbGUuaW5mbygKICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IGxvYWRlZCIsCiAgICAgICAgICB1cmwsCiAgICAgICAgICAiXHUyMDE0IGV4cG9ydHM6IiwKICAgICAgICAgIE9iamVjdC5rZXlzKG1vZHVsZS5leHBvcnRzKSwKICAgICAgICAgICJ3aW5kb3cgZ2xvYmFsczoiLAogICAgICAgICAgT2JqZWN0LmtleXMoZ2xvYmFscykKICAgICAgICApOwogICAgICAgIG9uUmVzb2x2ZWQoKTsKICAgICAgfSkuY2F0Y2goKGUpID0+IHsKICAgICAgICBjYWNoZS5zZXQodXJsLCB7CiAgICAgICAgICBtb2Q6IHt9LAogICAgICAgICAgZ2xvYmFsczoge30sCiAgICAgICAgICBlcnJvcjogImZhaWxlZCB0byBsb2FkOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpCiAgICAgICAgfSk7CiAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IEZBSUxFRCB0byBsb2FkIiwKICAgICAgICAgIHVybCwKICAgICAgICAgICIoIiArIGtpbmQgKyAiKSIsCiAgICAgICAgICBlCiAgICAgICAgKTsKICAgICAgICBvblJlc29sdmVkKCk7CiAgICAgIH0pOwogICAgICBwZW5kaW5nLnNldCh1cmwsIHApOwogICAgICByZXR1cm4gcDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmUyKHVybCwgbmFtZSkgewogICAgICBjb25zdCBlbnRyeSA9IGNhY2hlLmdldCh1cmwpOwogICAgICBpZiAoIWVudHJ5KSByZXR1cm4gbnVsbDsKICAgICAgY29uc3QgeyBtb2QsIGdsb2JhbHMgfSA9IGVudHJ5OwogICAgICBjb25zdCBDID0gbW9kICYmIG1vZFtuYW1lXSB8fCBnbG9iYWxzICYmIGdsb2JhbHNbbmFtZV0gfHwgdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgJiYgd2luZG93W25hbWVdIHx8IG1vZCAmJiBtb2QuZGVmYXVsdDsKICAgICAgaWYgKHR5cGVvZiBDID09PSAiZnVuY3Rpb24iKSByZXR1cm4gQzsKICAgICAgY29uc3Qga2V5ID0gdXJsICsgIlwwIiArIG5hbWU7CiAgICAgIGlmICghcmVwb3J0ZWRNaXNzaW5nLmhhcyhrZXkpKSB7CiAgICAgICAgcmVwb3J0ZWRNaXNzaW5nLnNldCgKICAgICAgICAgIGtleSwKICAgICAgICAgIGVudHJ5LmVycm9yIHx8ICdubyBleHBvcnQgbmFtZWQgIicgKyBuYW1lICsgJyIgKGhhczogJyArIE9iamVjdC5rZXlzKG1vZCkuam9pbigiLCAiKSArICIpIgogICAgICAgICk7CiAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IG1vZHVsZSIsCiAgICAgICAgICB1cmwsCiAgICAgICAgICAibG9hZGVkIGJ1dCBoYXMgbm8gY29tcG9uZW50IG5hbWVkIiwKICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLAogICAgICAgICAgIlx1MjAxNCBhdmFpbGFibGUgZXhwb3J0czoiLAogICAgICAgICAgT2JqZWN0LmtleXMobW9kKSwKICAgICAgICAgICJ3aW5kb3cgZ2xvYmFsczoiLAogICAgICAgICAgT2JqZWN0LmtleXMoZ2xvYmFscyksCiAgICAgICAgICAiLiBUaGUgbW9kdWxlIG11c3QgYG1vZHVsZS5leHBvcnRzID0geyIgKyBuYW1lICsgIn1gIG9yIHNldCBgd2luZG93LiIgKyBuYW1lICsgImAuIgogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiB3YWl0Rm9yR2xvYmFsKG5hbWUpIHsKICAgICAgaWYgKHBvbGxpbmcuaGFzKG5hbWUpKSByZXR1cm47CiAgICAgIHBvbGxpbmcuYWRkKG5hbWUpOwogICAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTsKICAgICAgY29uc3QgaXNDRSA9IGlzQ3VzdG9tRWxlbWVudE5hbWUobmFtZSk7CiAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7CiAgICAgICAgY29uc3QgZm91bmQgPSBpc0NFID8gY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpIDogaXNSZW5kZXJhYmxlVHlwZShyZXNvbHZlRG90dGVkUGF0aCh3aW5kb3csIG5hbWUpKTsKICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgIHBvbGxpbmcuZGVsZXRlKG5hbWUpOwogICAgICAgICAgb25SZXNvbHZlZCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPj0gR0xPQkFMX1BPTExfVElNRU9VVF9NUykgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBnbG9iYWwiLAogICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSwKICAgICAgICAgICAgIm5ldmVyIGFwcGVhcmVkIG9uIHdpbmRvdyBhZnRlciAiICsgR0xPQkFMX1BPTExfVElNRU9VVF9NUyArICJtcyIKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQodGljaywgR0xPQkFMX1BPTExfSU5URVJWQUxfTVMpOwogICAgICB9OwogICAgICBzZXRUaW1lb3V0KHRpY2ssIEdMT0JBTF9QT0xMX0lOVEVSVkFMX01TKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmVHbG9iYWwodXJsLCBuYW1lKSB7CiAgICAgIGNvbnN0IGlzQ0UgPSBpc0N1c3RvbUVsZW1lbnROYW1lKG5hbWUpOwogICAgICBpZiAoIXVybCkgewogICAgICAgIGlmIChpc0NFKSB7CiAgICAgICAgICBpZiAoY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpKSByZXR1cm4gbmFtZTsKICAgICAgICAgIHdhaXRGb3JHbG9iYWwobmFtZSk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgZzIgPSByZXNvbHZlRG90dGVkUGF0aCh3aW5kb3csIG5hbWUpOwogICAgICAgIGlmIChpc1JlbmRlcmFibGVUeXBlKGcyKSkgcmV0dXJuIGcyOwogICAgICAgIHdhaXRGb3JHbG9iYWwobmFtZSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZW50cnkgPSBjYWNoZS5nZXQodXJsKTsKICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7CiAgICAgIGlmIChpc0NFICYmIGN1c3RvbUVsZW1lbnRzLmdldChuYW1lKSkgcmV0dXJuIG5hbWU7CiAgICAgIGNvbnN0IGcgPSBlbnRyeS5nbG9iYWxzW25hbWVdID8\/IHJlc29sdmVEb3R0ZWRQYXRoKHdpbmRvdywgbmFtZSk7CiAgICAgIGlmIChpc1JlbmRlcmFibGVUeXBlKGcpKSByZXR1cm4gZzsKICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoIi4iKSkgcmV0dXJuIG51bGw7CiAgICAgIGNvbnN0IGtleSA9IHVybCArICJcMGdsb2JhbFwwIiArIG5hbWU7CiAgICAgIGlmICghcmVwb3J0ZWRNaXNzaW5nLmhhcyhrZXkpKSB7CiAgICAgICAgcmVwb3J0ZWRNaXNzaW5nLnNldChrZXksIG51bGwpOwogICAgICAgIGlmIChpc0NFICYmICFjdXN0b21FbGVtZW50cy5nZXQobmFtZSkpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigKICAgICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDoiLAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICJsb2FkZWQgYnV0IG5vIGN1c3RvbSBlbGVtZW50IiwKICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksCiAgICAgICAgICAgICJpcyByZWdpc3RlcmVkIGFuZCB3aW5kb3cuIiArIG5hbWUgKyAiIGlzIG5vdCBhIGZ1bmN0aW9uIFx1MjAxNCByZW5kZXJpbmcgPCIgKyBuYW1lICsgIj4gYXMgYW4gdW5rbm93biBlbGVtZW50LiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuYW1lOwogICAgfQogICAgZnVuY3Rpb24gZ2V0RXJyb3IodXJsLCBuYW1lKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgIGlmIChlbnRyeT8uZXJyb3IpIHJldHVybiBlbnRyeS5lcnJvcjsKICAgICAgcmV0dXJuIHJlcG9ydGVkTWlzc2luZy5nZXQodXJsICsgIlwwIiArIG5hbWUpIHx8IG51bGw7CiAgICB9CiAgICByZXR1cm4geyBsb2FkLCByZXNvbHZlOiByZXNvbHZlMiwgcmVzb2x2ZUdsb2JhbCwgZ2V0RXJyb3IgfTsKICB9CiAgZnVuY3Rpb24gaXNFbGVtZW50Q2xhc3MoZykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHR5cGVvZiBnID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZy5wcm90b3R5cGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDsKICAgIH0gY2F0Y2ggewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBzcmMvYXRvbWljcy50cwogIHZhciBBVE9NSUNfQ1NTID0gKAogICAgLy8gbGF5b3V0CiAgICAiLmZ4e2Rpc3BsYXk6ZmxleH0uY29se2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmdyaWR7ZGlzcGxheTpncmlkfS5hY3thbGlnbi1pdGVtczpjZW50ZXJ9Lmpje2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lmpie2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufS5mMXtmbGV4OjF9Lm5vc2hyaW5re2ZsZXgtc2hyaW5rOjB9LndyYXB7ZmxleC13cmFwOndyYXB9LmZ3NXtmb250LXdlaWdodDo1MDB9LmZ3Nntmb250LXdlaWdodDo2MDB9LmZ3N3tmb250LXdlaWdodDo3MDB9LmZ3OHtmb250LXdlaWdodDo4MDB9LmZzMTF7Zm9udC1zaXplOjExcHh9LmZzMTJ7Zm9udC1zaXplOjEycHh9LmZzMTN7Zm9udC1zaXplOjEzcHh9LmZzMTR7Zm9udC1zaXplOjE0cHh9LmZzMTV7Zm9udC1zaXplOjE1cHh9LmZzMTZ7Zm9udC1zaXplOjE2cHh9LmZzMjB7Zm9udC1zaXplOjIwcHh9LmZzMjJ7Zm9udC1zaXplOjIycHh9LnVwcGVye3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0udGN7dGV4dC1hbGlnbjpjZW50ZXJ9Lm5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LmdhcDh7Z2FwOjhweH0uZ2FwMTB7Z2FwOjEwcHh9LmdhcDEye2dhcDoxMnB4fS5nYXAxNntnYXA6MTZweH0uZ2FwMjR7Z2FwOjI0cHh9Lm0we21hcmdpbjowfS5tdDh7bWFyZ2luLXRvcDo4cHh9Lm10MTJ7bWFyZ2luLXRvcDoxMnB4fS5tdDE2e21hcmdpbi10b3A6MTZweH0ubWI4e21hcmdpbi1ib3R0b206OHB4fS5tYjEye21hcmdpbi1ib3R0b206MTJweH0ubWIxNnttYXJnaW4tYm90dG9tOjE2cHh9LnBvc3JlbHtwb3NpdGlvbjpyZWxhdGl2ZX0ucG9zYWJze3Bvc2l0aW9uOmFic29sdXRlfS5yb3VuZHtib3JkZXItcmFkaXVzOjUwJX0ub2hpZGV7b3ZlcmZsb3c6aGlkZGVufS5iYm94e2JveC1zaXppbmc6Ym9yZGVyLWJveH0ucG9pbnRlcntjdXJzb3I6cG9pbnRlcn0udzEwMHt3aWR0aDoxMDAlfS5iMHtib3JkZXI6bm9uZX0iCiAgKTsKCiAgLy8gc3JjL2hlbG1ldC50cwogIHZhciBERVNJR05fRE9DX01PREVfUkUgPSAvPG1ldGFcYltePl0qXGJuYW1lXHMqPVxzKlsiJ11kZXNpZ25fZG9jX21vZGVbIiddW14+XSpcYig\/OmNvbnRlbnR8dmFsdWUpXHMqPVxzKlsiJ10oXHcrKVsiJ10vaTsKICB2YXIgQ0FOVkFTX0JHID0gIiNmMGVlZTkiOwogIGZ1bmN0aW9uIGNyZWF0ZUhlbG1ldE1hbmFnZXIoZG9jLCBpc1N0cmVhbWluZykgewogICAgY29uc3QgbW91bnRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBjb25zdCBsaXZlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBkZXNpZ25Eb2NNb2RlID0gbnVsbDsKICAgIGxldCBjYW52YXNTdHlsZUVsID0gbnVsbDsKICAgIGZ1bmN0aW9uIHBvc3REZXNpZ25Nb2RlKG1vZGUpIHsKICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAiX19kY19kZXNpZ25fbW9kZSIsIG1vZGUgfSwgIioiKTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldERlc2lnbkRvY01vZGUobW9kZSkgewogICAgICBpZiAobW9kZSA9PT0gZGVzaWduRG9jTW9kZSkgcmV0dXJuOwogICAgICBkZXNpZ25Eb2NNb2RlID0gbW9kZTsKICAgICAgcG9zdERlc2lnbk1vZGUobW9kZSk7CiAgICAgIGlmIChtb2RlID09PSAiY2FudmFzIikgewogICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWRjLWNhbnZhcyIsICIiKTsKICAgICAgICBjYW52YXNTdHlsZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgY2FudmFzU3R5bGVFbC5zZXRBdHRyaWJ1dGUoImRhdGEtZGMtY2FudmFzIiwgIiIpOwogICAgICAgIGNhbnZhc1N0eWxlRWwudGV4dENvbnRlbnQgPSBgaHRtbCxib2R5e2JhY2tncm91bmQ6JHtDQU5WQVNfQkd9fSNkYy1yb290Pi5zYy1ob3N0e3Bvc2l0aW9uOnJlbGF0aXZlfWA7CiAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoY2FudmFzU3R5bGVFbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZGMtY2FudmFzIik7CiAgICAgICAgY2FudmFzU3R5bGVFbD8ucmVtb3ZlKCk7CiAgICAgICAgY2FudmFzU3R5bGVFbCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKGUpID0+IHsKICAgICAgaWYgKCFkZXNpZ25Eb2NNb2RlIHx8IChlLmRhdGEgJiYgZS5kYXRhLnR5cGUpICE9PSAiX19kY19wcm9iZSIpIHJldHVybjsKICAgICAgcG9zdERlc2lnbk1vZGUoZGVzaWduRG9jTW9kZSk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIGNvbXBpbGUobm9kZSkgewogICAgICBjb25zdCByYXcgPSBbLi4ubm9kZS5jaGlsZHJlbl07CiAgICAgIGNvbnN0IGhlbG1ldENsb3NlZCA9IG5vZGUubmV4dFNpYmxpbmcgIT0gbnVsbCB8fCBub2RlLnBhcmVudE5vZGU\/Lm5leHRTaWJsaW5nICE9IG51bGw7CiAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZSgiZGF0YS1kYy1hdG9taWNzIikgJiYgIW1vdW50ZWQuaGFzKCJfX2RjLWF0b21pY3MiKSkgewogICAgICAgIG1vdW50ZWQuYWRkKCJfX2RjLWF0b21pY3MiKTsKICAgICAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGVsLmlkID0gIl9fZGMtYXRvbWljcyI7CiAgICAgICAgZWwudGV4dENvbnRlbnQgPSBBVE9NSUNfQ1NTOwogICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsKTsKICAgICAgfQogICAgICByZXR1cm4gKF92YWxzLCBjdHgpID0+IHsKICAgICAgICBjb25zdCBuYW1lID0gY3R4ICYmIGN0eC5fX25hbWUgfHwgIiI7CiAgICAgICAgY29uc3Qgc3RyZWFtaW5nID0gISEobmFtZSAmJiBpc1N0cmVhbWluZyhuYW1lKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGNoaWxkID0gcmF3W2ldOwogICAgICAgICAgY29uc3QgdGFnID0gY2hpbGQudGFnTmFtZTsKICAgICAgICAgIGNvbnN0IG1heUJlUGFydGlhbCA9IHN0cmVhbWluZyAmJiAhaGVsbWV0Q2xvc2VkICYmIGkgPT09IHJhdy5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKHRhZyA9PT0gIlNDUklQVCIpIHsKICAgICAgICAgICAgaWYgKG1heUJlUGFydGlhbCkgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IGtleSA9ICJTQ1JJUFR8IiArIChjaGlsZC5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8IGNoaWxkLnRleHRDb250ZW50IHx8ICIiKTsKICAgICAgICAgICAgaWYgKG1vdW50ZWQuaGFzKGtleSkpIGNvbnRpbnVlOwogICAgICAgICAgICBtb3VudGVkLmFkZChrZXkpOwogICAgICAgICAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICAgICAgZm9yIChjb25zdCB7IG5hbWU6IGFuLCB2YWx1ZSB9IG9mIFsuLi5jaGlsZC5hdHRyaWJ1dGVzXSkKICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoYW4sIHZhbHVlKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnRleHRDb250ZW50KSBlbC50ZXh0Q29udGVudCA9IGNoaWxkLnRleHRDb250ZW50OwogICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gIkxJTksiIHx8IHRhZyA9PT0gIk1FVEEiKSB7CiAgICAgICAgICAgIGlmIChtYXlCZVBhcnRpYWwpIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAifCIgKyAoY2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgfHwgY2hpbGQuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCBjaGlsZC5vdXRlckhUTUwpOwogICAgICAgICAgICBpZiAobW91bnRlZC5oYXMoa2V5KSkgY29udGludWU7CiAgICAgICAgICAgIG1vdW50ZWQuYWRkKGtleSk7CiAgICAgICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZSh0cnVlKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBrZXkgPSBuYW1lICsgInwiICsgaTsKICAgICAgICAgICAgbGV0IGVsID0gbGl2ZS5nZXQoa2V5KTsKICAgICAgICAgICAgaWYgKCFlbCB8fCBlbC50YWdOYW1lICE9PSB0YWcpIHsKICAgICAgICAgICAgICBpZiAoZWwpIGVsLnJlbW92ZSgpOwogICAgICAgICAgICAgIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICAgIGxpdmUuc2V0KGtleSwgZWwpOwogICAgICAgICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZTogYW4sIHZhbHVlIH0gb2YgWy4uLmNoaWxkLmF0dHJpYnV0ZXNdKSB7CiAgICAgICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZShhbikgIT09IHZhbHVlKSBlbC5zZXRBdHRyaWJ1dGUoYW4sIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZWwudGV4dENvbnRlbnQgIT09IGNoaWxkLnRleHRDb250ZW50KQogICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gY2hpbGQudGV4dENvbnRlbnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsgY29tcGlsZSwgc2V0RGVzaWduRG9jTW9kZSB9OwogIH0KCiAgLy8gc3JjL3BzZXVkby50cwogIGZ1bmN0aW9uIGNyZWF0ZVBzZXVkb1NoZWV0KGRvYykgewogICAgbGV0IGVsID0gbnVsbDsKICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBuID0gMDsKICAgIHJldHVybiAocHNldWRvLCBjc3MpID0+IHsKICAgICAgY29uc3QgayA9IHBzZXVkbyArICJ8IiArIGNzczsKICAgICAgY29uc3QgaGl0ID0gY2FjaGUuZ2V0KGspOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgICBpZiAoIWVsKSB7CiAgICAgICAgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgY29uc3QgY2xzID0gInNjcCIgKyAobisrKS50b1N0cmluZygzNik7CiAgICAgIGNvbnN0IHNlbCA9IHBzZXVkbyA9PT0gImJlZm9yZSIgfHwgcHNldWRvID09PSAiYWZ0ZXIiID8gIi4iICsgY2xzICsgIjo6IiArIHBzZXVkbyA6ICIuIiArIGNscyArICI6IiArIHBzZXVkbzsKICAgICAgZWwuc2hlZXQuaW5zZXJ0UnVsZShzZWwgKyAieyIgKyBjc3MgKyAifSIsIGVsLnNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7CiAgICAgIGNhY2hlLnNldChrLCBjbHMpOwogICAgICByZXR1cm4gY2xzOwogICAgfTsKICB9CgogIC8vIHNyYy9yZWdpc3RyeS50cwogIGZ1bmN0aW9uIGNyZWF0ZVJlZ2lzdHJ5KCkgewogICAgY29uc3QgZW50cmllcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZnVuY3Rpb24gZ2V0KG5hbWUpIHsKICAgICAgcmV0dXJuIGVudHJpZXNbbmFtZV0gfHwgKGVudHJpZXNbbmFtZV0gPSB7CiAgICAgICAgaHRtbDogIiIsCiAgICAgICAgdHBsOiBudWxsLAogICAgICAgIExvZ2ljOiBudWxsLAogICAgICAgIGpzU3RyZWFtaW5nOiBmYWxzZSwKICAgICAgICBodG1sU3RyZWFtaW5nOiBmYWxzZSwKICAgICAgICB2ZXI6IDAsCiAgICAgICAgc3ViczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgICBmZXRjaGVkOiBmYWxzZQogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1bXAobmFtZSkgewogICAgICBjb25zdCByID0gZ2V0KG5hbWUpOwogICAgICByLnZlcisrOwogICAgICBmb3IgKGNvbnN0IGZuIG9mIHIuc3VicykgZm4oKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGVudHJpZXMsCiAgICAgIGdldCwKICAgICAgYnVtcCwKICAgICAgYnVtcEFsbCgpIHsKICAgICAgICBmb3IgKGNvbnN0IG4gaW4gZW50cmllcykgYnVtcChuKTsKICAgICAgfQogICAgfTsKICB9CgogIC8vIHNyYy9ydW50aW1lLnRzCiAgdmFyIENPTVBPTkVOVF9ESVIgPSAiLiI7CiAgZnVuY3Rpb24gY3JlYXRlUnVudGltZShkb2MgPSBkb2N1bWVudCkgewogICAgY29uc3QgcmVnaXN0cnkgPSBjcmVhdGVSZWdpc3RyeSgpOwogICAgY29uc3QgcHNldWRvQ2xhc3MgPSBjcmVhdGVQc2V1ZG9TaGVldChkb2MpOwogICAgY29uc3QgaGVsbWV0ID0gY3JlYXRlSGVsbWV0TWFuYWdlcigKICAgICAgZG9jLAogICAgICAobmFtZSkgPT4gcmVnaXN0cnkuZ2V0KG5hbWUpLmh0bWxTdHJlYW1pbmcKICAgICk7CiAgICBjb25zdCBleHRlcm5hbCA9IGNyZWF0ZUV4dGVybmFsTW9kdWxlcygoKSA9PiByZWdpc3RyeS5idW1wQWxsKCkpOwogICAgY29uc3QgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudEZhY3RvcnkocmVnaXN0cnksIGVuc3VyZUZldGNoZWQpOwogICAgY29uc3QgaG9zdCA9IHsKICAgICAgY29tcG9uZW50OiAobmFtZSkgPT4gZmFjdG9yeS5nZXREQyhuYW1lKSwKICAgICAgcGxhY2Vob2xkZXI6IChwcm9wcykgPT4gaChQbGFjZWhvbGRlciwgcHJvcHMpLAogICAgICBoZWxtZXQ6IChub2RlKSA9PiBoZWxtZXQuY29tcGlsZShub2RlKSwKICAgICAgbG9hZEV4dGVybmFsOiAoa2luZCwgdXJsLCBhZnRlcikgPT4gZXh0ZXJuYWwubG9hZChraW5kLCB1cmwsIGFmdGVyKSwKICAgICAgcmVzb2x2ZUV4dGVybmFsOiAodXJsLCBuYW1lKSA9PiBleHRlcm5hbC5yZXNvbHZlKHVybCwgbmFtZSksCiAgICAgIHJlc29sdmVFeHRlcm5hbEdsb2JhbDogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwucmVzb2x2ZUdsb2JhbCh1cmwsIG5hbWUpLAogICAgICByZXNvbHZlRXh0ZXJuYWxFcnJvcjogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwuZ2V0RXJyb3IodXJsLCBuYW1lKSwKICAgICAgcHNldWRvQ2xhc3MKICAgIH07CiAgICBmdW5jdGlvbiBlbnN1cmVGZXRjaGVkKG5hbWUpIHsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgaWYgKHIuZmV0Y2hlZCkgcmV0dXJuOwogICAgICByLmZldGNoZWQgPSB0cnVlOwogICAgICBjb25zdCB1cmwgPSBDT01QT05FTlRfRElSICsgIi8iICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgIi5kYy5odG1sIjsKICAgICAgZmV0Y2godXJsKS50aGVuKChyZXMpID0+IHsKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICAgIltkYy1ydW50aW1lXSBzaWJsaW5nIGZldGNoIGZvciA8IiArIG5hbWUgKyAiLz4gZmFpbGVkOiIsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgInJldHVybmVkIiwKICAgICAgICAgICAgcmVzLnN0YXR1cywKICAgICAgICAgICAgIlx1MjAxNCB0aGUgcmVmZXJlbmNlIHJlbmRlcnMgYXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIuIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCk7CiAgICAgIH0pLnRoZW4oKHQpID0+IHsKICAgICAgICBpZiAoIXQpIHJldHVybjsKICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURjVGV4dCh0KTsKICAgICAgICBpZiAoIXBhcnNlZCkgewogICAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICAgIltkYy1ydW50aW1lXSBzaWJsaW5nIGZldGNoIGZvciA8IiArIG5hbWUgKyAiLz46IiwKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAiaGFzIG5vIDx4LWRjPiBibG9jayBcdTIwMTQgbm90IGEgRGVzaWduIENvbXBvbmVudC4iCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocGFyc2VkLnByb3BzKSByLnByb3BzTWV0YSA9IHBhcnNlZC5wcm9wczsKICAgICAgICBpZiAocGFyc2VkLnByZXZpZXcpIHIucHJldmlldyA9IHBhcnNlZC5wcmV2aWV3OwogICAgICAgIGlmIChwYXJzZWQudGVtcGxhdGUgJiYgIXIuaHRtbCkgdXBkYXRlSHRtbChuYW1lLCBwYXJzZWQudGVtcGxhdGUpOwogICAgICAgIGlmIChwYXJzZWQuanMgJiYgIXIuTG9naWMpIHVwZGF0ZUpzKG5hbWUsIHBhcnNlZC5qcyk7CiAgICAgIH0pLmNhdGNoKAogICAgICAgIChlKSA9PiBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSBzaWJsaW5nIGZldGNoIGZvciA8IiArIG5hbWUgKyAiLz4gdGhyZXc6IiwKICAgICAgICAgIHVybCwKICAgICAgICAgIGUKICAgICAgICApCiAgICAgICk7CiAgICB9CiAgICBsZXQgcm9vdE5hbWUgPSBudWxsOwogICAgZnVuY3Rpb24gdXBkYXRlSHRtbChuYW1lLCBodG1sKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIHIuaHRtbCA9IGh0bWw7CiAgICAgIGlmIChuYW1lID09PSByb290TmFtZSkgewogICAgICAgIGNvbnN0IG1vZGUgPSBERVNJR05fRE9DX01PREVfUkUuZXhlYyhodG1sKT8uWzFdID8\/IG51bGw7CiAgICAgICAgaWYgKG1vZGUgfHwgIXIuaHRtbFN0cmVhbWluZykgaGVsbWV0LnNldERlc2lnbkRvY01vZGUobW9kZSk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICByLnRwbCA9IGNvbXBpbGVUZW1wbGF0ZShodG1sLCBob3N0KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIltkYy1ydW50aW1lXSB0ZW1wbGF0ZSBjb21waWxlIEZBSUxFRCBmb3IiLCBuYW1lLCBlKTsKICAgICAgfQogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlSnMobmFtZSwgc3JjKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGNvbnN0IHNlcSA9IHIuanNTZXEgPSAoci5qc1NlcSB8fCAwKSArIDE7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgQ2xzID0gZXZhbERjTG9naWMoc3JjKTsKICAgICAgICBpZiAoci5qc1NlcSAhPT0gc2VxKSByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBDbHMgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHIubG9naWNFcnJvciA9IG5hbWUgKyAiLmRjLmh0bWw6IDxzY3JpcHQgZGF0YS1kYy1zY3JpcHQ+IG11c3QgZGVmaW5lIGBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBEQ0xvZ2ljYCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHIubG9naWNFcnJvciA9IG51bGw7CiAgICAgICAgICByLkxvZ2ljID0gQ2xzOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChyLmpzU2VxICE9PSBzZXEpIHJldHVybjsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSBsb2dpYyBjbGFzcyBldmFsIEZBSUxFRCBmb3IiLAogICAgICAgICAgbmFtZSwKICAgICAgICAgICJcdTIwMTQgdGhlIHRlbXBsYXRlIHJlbmRlcnMgd2l0aCBwcm9wcyBvbmx5LiIsCiAgICAgICAgICBlCiAgICAgICAgKTsKICAgICAgICByLmxvZ2ljRXJyb3IgPSBuYW1lICsgIjogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTsKICAgICAgfQogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtaW5nKG5hbWUsIGtpbmQsIG9uKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGlmIChraW5kID09PSAiaHRtbCIpIHIuaHRtbFN0cmVhbWluZyA9ICEhb247CiAgICAgIGVsc2Ugci5qc1N0cmVhbWluZyA9ICEhb247CiAgICAgIGxldCBhbnkgPSBmYWxzZTsKICAgICAgZm9yIChjb25zdCBuIGluIHJlZ2lzdHJ5LmVudHJpZXMpIHsKICAgICAgICBjb25zdCBlID0gcmVnaXN0cnkuZW50cmllc1tuXTsKICAgICAgICBpZiAoZSAmJiAoZS5odG1sU3RyZWFtaW5nIHx8IGUuanNTdHJlYW1pbmcpKSB7CiAgICAgICAgICBhbnkgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgic2MtZGMtc3RyZWFtaW5nIiwgYW55KTsKICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRjVXBkYXRlKG5hbWUsIGtpbmQsIGNvbnRlbnQsIHN0cmVhbWluZykgewogICAgICBpZiAoc3RyZWFtaW5nKSByZWdpc3RyeS5nZXQobmFtZSkuZmV0Y2hlZCA9IHRydWU7CiAgICAgIGlmIChraW5kID09PSAiaHRtbCIpIHsKICAgICAgICBzZXRTdHJlYW1pbmcobmFtZSwgImh0bWwiLCAhIXN0cmVhbWluZyk7CiAgICAgICAgdXBkYXRlSHRtbChuYW1lLCBjb250ZW50KTsKICAgICAgfSBlbHNlIGlmIChraW5kID09PSAianMiKSB7CiAgICAgICAgc2V0U3RyZWFtaW5nKG5hbWUsICJqcyIsICEhc3RyZWFtaW5nKTsKICAgICAgICBpZiAoIXN0cmVhbWluZykgdXBkYXRlSnMobmFtZSwgY29udGVudCk7CiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInByb3BzIikgewogICAgICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKGNvbnRlbnQpOwogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgICAgci5wcm9wc01ldGEgPSBwcm9wcyA\/PyB2b2lkIDA7CiAgICAgICAgci5wcmV2aWV3ID0gcHJldmlldzsKICAgICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZXRQcm9wcyhuYW1lLCBvdmVycmlkZXMpIHsKICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLnByb3BPdmVycmlkZXMgPSBvdmVycmlkZXMgJiYgdHlwZW9mIG92ZXJyaWRlcyA9PT0gIm9iamVjdCIgPyB7IC4uLm92ZXJyaWRlcyB9IDogbnVsbDsKICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkb3B0UGFyc2VkKG5hbWUsIHBhcnNlZCkgewogICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuOwogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICBpZiAocGFyc2VkLnByb3BzKSByLnByb3BzTWV0YSA9IHBhcnNlZC5wcm9wczsKICAgICAgaWYgKHBhcnNlZC5wcmV2aWV3KSByLnByZXZpZXcgPSBwYXJzZWQucHJldmlldzsKICAgICAgaWYgKHBhcnNlZC50ZW1wbGF0ZSkgdXBkYXRlSHRtbChuYW1lLCBwYXJzZWQudGVtcGxhdGUpOwogICAgICBpZiAocGFyc2VkLmpzKSB1cGRhdGVKcyhuYW1lLCBwYXJzZWQuanMpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgcmVnaXN0cnksCiAgICAgIGdldERDOiBmYWN0b3J5LmdldERDLAogICAgICB1cGRhdGVIdG1sLAogICAgICB1cGRhdGVKcywKICAgICAgZGNVcGRhdGUsCiAgICAgIHNldFByb3BzLAogICAgICBhZG9wdFBhcnNlZCwKICAgICAgc2V0Um9vdE5hbWU6IChuYW1lKSA9PiB7CiAgICAgICAgcm9vdE5hbWUgPSBuYW1lOwogICAgICB9LAogICAgICBtYXJrRmV0Y2hlZDogKG5hbWUpID0+IHsKICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuZmV0Y2hlZCA9IHRydWU7CiAgICAgIH0sCiAgICAgIGFubm90YXRlZFRlbXBsYXRlOiAobmFtZSkgPT4gewogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgICAgcmV0dXJuIHIudHBsICYmIHIudHBsLl9fYW5ub3RhdGVkIHx8IG51bGw7CiAgICAgIH0sCiAgICAgIHRlbXBsYXRlU291cmNlOiAobmFtZSkgPT4gcmVnaXN0cnkuZ2V0KG5hbWUpLmh0bWwgfHwgbnVsbCwKICAgICAgU3RyZWFtYWJsZUxvZ2ljCiAgICB9OwogIH0KCiAgLy8gc3JjL2luZGV4LnRzCiAgdmFyIFJFQUNUX1VSTCA9ICJodHRwczovL3VucGtnLmNvbS9yZWFjdEAxOC4zLjEvdW1kL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzIjsKICB2YXIgUkVBQ1RfU1JJID0gInNoYTM4NC1ER3lMeEF5anEwZjlTUHBWZXZENklnenRDRmxuTUY2b1cvWFFHbWZlK0lzWjhUcUVpRHJjSGtNTEtJNmZpQi9aIjsKICB2YXIgUkVBQ1RfRE9NX1VSTCA9ICJodHRwczovL3VucGtnLmNvbS9yZWFjdC1kb21AMTguMy4xL3VtZC9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMiOwogIHZhciBSRUFDVF9ET01fU1JJID0gInNoYTM4NC1nVEd4aHoyMWxWR1lOTWNkSk95cTAxRWRnMGpobi9jMjJuc3gwa3lxUDBUeGFWNVdWZHNTSDFmU0RVZjVZSmoxIjsKICBmdW5jdGlvbiBoaWRlUmF3VGVtcGxhdGUoKSB7CiAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHMudGV4dENvbnRlbnQgPSAieC1kY3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fSI7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogIH0KICBmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYywgaW50ZWdyaXR5KSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgLy8hIG5vc2VtZ3JlcDogY3JlYXRlLXNjcmlwdC1lbGVtZW50CiAgICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgcy5zcmMgPSBzcmM7CiAgICAgIHMuaW50ZWdyaXR5ID0gaW50ZWdyaXR5OwogICAgICBzLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgIHMuYXN5bmMgPSBmYWxzZTsKICAgICAgcy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlMigpOwogICAgICBzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCAke3NyY31gKSk7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gbG9hZFJlYWN0VW1kKCkgewogICAgY29uc3QgdyA9IHdpbmRvdzsKICAgIGlmICh3LlJlYWN0ICYmIHcuUmVhY3RET00pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIHJldHVybiBQcm9taXNlLmFsbChbCiAgICAgIGxvYWRTY3JpcHQoUkVBQ1RfVVJMLCBSRUFDVF9TUkkpLAogICAgICBsb2FkU2NyaXB0KFJFQUNUX0RPTV9VUkwsIFJFQUNUX0RPTV9TUkkpCiAgICBdKS50aGVuKCgpID0+IHZvaWQgMCk7CiAgfQogIGZ1bmN0aW9uIGluaXQoKSB7CiAgICBjb25zdCBydW50aW1lID0gY3JlYXRlUnVudGltZShkb2N1bWVudCk7CiAgICBsZXQgcm9vdE5hbWUgPSAiUm9vdCI7CiAgICBjb25zdCBiYXNlQ3NzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIGJhc2VDc3MudGV4dENvbnRlbnQgPSBCQVNFX0NTUzsKICAgIGRvY3VtZW50LmhlYWQucHJlcGVuZChiYXNlQ3NzKTsKICAgIGNvbnN0IG5vdGlmeUhvc3QgPSAoKSA9PiB7CiAgICAgIGlmICh3aW5kb3cucGFyZW50ID09PSB3aW5kb3cpIHJldHVybjsKICAgICAgY29uc3QgciA9IHJ1bnRpbWUucmVnaXN0cnkuZW50cmllc1tyb290TmFtZV07CiAgICAgIHRyeSB7CiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSgKICAgICAgICAgIHsKICAgICAgICAgICAgdHlwZTogIl9fZGNfYm9vdGVkIiwKICAgICAgICAgICAgcm9vdE5hbWUsCiAgICAgICAgICAgIHByb3BzTWV0YTogciAmJiByLnByb3BzTWV0YSB8fCBudWxsLAogICAgICAgICAgICBwcmV2aWV3OiByICYmIHIucHJldmlldyB8fCBudWxsCiAgICAgICAgICB9LAogICAgICAgICAgIioiCiAgICAgICAgKTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIF9fZGNVcGRhdGU6IChuYW1lLCBraW5kLCBjb250ZW50LCBzdHJlYW1pbmcpID0+IHsKICAgICAgICBydW50aW1lLmRjVXBkYXRlKG5hbWUsIGtpbmQsIGNvbnRlbnQsIHN0cmVhbWluZyk7CiAgICAgICAgaWYgKG5hbWUgPT09IHJvb3ROYW1lICYmICFzdHJlYW1pbmcgJiYga2luZCA9PT0gInByb3BzIikgbm90aWZ5SG9zdCgpOwogICAgICB9LAogICAgICBfX2RjU2V0UHJvcHM6IChuYW1lLCBvdmVycmlkZXMpID0+IHJ1bnRpbWUuc2V0UHJvcHMobmFtZSwgb3ZlcnJpZGVzKSwKICAgICAgLyoqIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBjdXJyZW50bHkgbW91bnRlZCBhcyB0aGUgcGFnZSByb290IOKAlCBEQyB0b29scwogICAgICAgKiAgcHVzaCB0aGVpciB0ZW1wbGF0ZS1zdHJlYW0gaGVyZSB3aGVuIHRhcmdldGluZyAidGhlIG9wZW4gcGFnZSIuICovCiAgICAgIF9fZGNSb290TmFtZTogKCkgPT4gcm9vdE5hbWUsCiAgICAgIC8qKiBFZGl0b3IgYnJpZGdlIOKAlCB0aGUgZW5jb2RlZCwgYGRhdGEtZGMtdHBsYC1hbm5vdGF0ZWQgdGVtcGxhdGUgc291cmNlLgogICAgICAgKiAgVGhlIGhvc3QgZWRpdG9yIHBhcnNlcyB0aGlzIGludG8gaXRzIG93biB0ZW1wbGF0ZSBET00gc28gaXQgY2FuIG1hcCBhCiAgICAgICAqICByZW5kZXJlZCBub2RlIChjYXJyeWluZyB0aGUgc2FtZSBgZGF0YS1kYy10cGxgKSBiYWNrIHRvIHRoZSBzb3VyY2UKICAgICAgICogIG5vZGUgdGhhdCBlbWl0dGVkIGl0LiBSZXR1cm5zIHRoZSBlbmNvZGVkIGZvcm0gKGA8c2MtY29tcD5gLAogICAgICAgKiAgYHNjLWNhbWVsLSpgIGF0dHJzKTsgdGhlIGVkaXRvciBkZWNvZGVzIG9uIHNlcmlhbGl6ZS4gKi8KICAgICAgX19kY0Fubm90YXRlZFRlbXBsYXRlOiAobmFtZSkgPT4gcnVudGltZS5hbm5vdGF0ZWRUZW1wbGF0ZShuYW1lKSwKICAgICAgLyoqIEVkaXRvciBicmlkZ2Ug4oCUIHRoZSAqb3JpZ2luYWwqIChkZWNvZGVkKSB0ZW1wbGF0ZSBzb3VyY2UuICovCiAgICAgIF9fZGNUZW1wbGF0ZVNvdXJjZTogKG5hbWUpID0+IHJ1bnRpbWUudGVtcGxhdGVTb3VyY2UobmFtZSksCiAgICAgIF9fZGNCb290OiAoKSA9PiB7CiAgICAgICAgcm9vdE5hbWUgPSBib290KHJ1bnRpbWUsIGRvY3VtZW50KSA\/PyByb290TmFtZTsKICAgICAgICBub3RpZnlIb3N0KCk7CiAgICAgIH0sCiAgICAgIF9fZGNSZWdpc3RyeTogcnVudGltZS5yZWdpc3RyeS5lbnRyaWVzLAogICAgICBnZXREQzogKG5hbWUpID0+IHJ1bnRpbWUuZ2V0REMobmFtZSksCiAgICAgIC8vIGBEQ0xvZ2ljYCBpcyB0aGUgZG9jdW1lbnRlZCBiYXNlIGNsYXNzIG5hbWU7IGBTdHJlYW1hYmxlTG9naWNgIGlzIHRoZQogICAgICAvLyBpbXBsZW1lbnRhdGlvbiBhbGlhcyBrZXB0IGZvciBhbnkgcHJvamVjdCB0aGF0IGFscmVhZHkgcmVmZXJlbmNlcyBpdC4KICAgICAgRENMb2dpYzogcnVudGltZS5TdHJlYW1hYmxlTG9naWMsCiAgICAgIFN0cmVhbWFibGVMb2dpYzogcnVudGltZS5TdHJlYW1hYmxlTG9naWMKICAgIH07CiAgICBPYmplY3QuYXNzaWduKHdpbmRvdywgYXBpKTsKICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIpIGFwaS5fX2RjQm9vdCgpOwogICAgZWxzZSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKCkgPT4gYXBpLl9fZGNCb290KCkpOwogIH0KICBoaWRlUmF3VGVtcGxhdGUoKTsKICBsb2FkUmVhY3RVbWQoKS50aGVuKGluaXQpLmNhdGNoKChlcnIpID0+IHsKICAgIGNvbnNvbGUuZXJyb3IoIltkY10gZmFpbGVkIHRvIGxvYWQgUmVhY3Qgb3IgYm9vdDoiLCBlcnIpOwogICAgdGhyb3cgZXJyOwogIH0pOwp9KSgpOwo=\"\u003e\u003c\/script\u003e\n\n\n\u003cx-dc\u003e\n\u003chelmet\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Figtree:ital,wght@0,300..900;1,300..900\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cscript src=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=\"\u003e\u003c\/script\u003e\n\u003cstyle\u003e\n*{box-sizing:border-box;}\nhtml,body{margin:0;}\nimage-slot{display:block!important;width:100%!important;height:100%!important;}\n\u003c\/style\u003e\n\u003c\/helmet\u003e\n\n\n\n\u003cdiv style=\"background:#FBF8F1;color:#2A2B2D;font-family:'Figtree',sans-serif;-webkit-font-smoothing:antialiased;padding:48px 24px 64px;\"\u003e\n\u003cdiv style=\"max-width:1140px;margin:0 auto;\"\u003e\n\n  \u003c!-- ===================== LEAD ===================== --\u003e\n  \u003csection\u003e\n    \u003cp style=\"max-width:860px;margin:0 auto;text-align:center;font-family:'Figtree',sans-serif;font-weight:600;font-size:clamp(21px,2.6vw,29px);line-height:1.42;letter-spacing:-.01em;color:#2A2B2D;\"\u003eA 6-day multi-activity expedition across Armenia's wild highlands — a private balloon flight over the Ararat Valley, an 8 km hike through Khosrov Reserve, paragliding over Lake Sevan, a full-day e-bike ascent to Dimats Mountain, and a descent through Lastiver Gorge.\u003c\/p\u003e\n\n    \u003c!-- fact strip --\u003e\n    \u003cdiv style=\"display:flex;flex-wrap:wrap;border:1px solid #E7E0D1;border-radius:18px;background:#fff;margin-top:34px;overflow:hidden;box-shadow:0 4px 18px rgba(0,0,0,.03);\"\u003e\n      \u003cdiv style=\"flex:1;min-width:150px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eDIFFICULTY\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003e3 \u003cspan style=\"font-size:13px;color:#9A917D;font-weight:600;\"\u003e\/ 5\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:150px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eDURATION\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003e6 Days\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:150px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eGROUP\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003eMax 10\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:150px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eSTART\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003e25 July\u003c\/div\u003e\n\u003c\/div\u003e\n\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== ITINERARY ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#E1343F;\"\u003e01 — THE ITINERARY\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 8px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;line-height:1.02;\"\u003eThe journey, day by day\u003c\/h2\u003e\n    \u003cp style=\"margin:0;max-width:660px;font-size:16px;line-height:1.6;color:#5C5848;\"\u003eThree phases across Armenia — from the capital and its volcanic gorges, up into the aerial highlands, and out through the dense forests of Tavush. Tap any day to read each leg.\u003c\/p\u003e\n\n    \u003c!-- phase selector --\u003e\n    \u003cdiv style=\"display:flex;gap:16px;margin-top:30px;flex-wrap:wrap;\"\u003e\n      \u003csc-for list=\"{{ phases }}\" as=\"ph\" hint-placeholder-count=\"3\"\u003e\n        \u003cdiv sc-camel-style=\"{{ ph.cardStyle }}\" onclick=\"{{ ph.onClick }}\"\u003e\n          \u003cdiv sc-camel-style=\"height:6px;width:100%;background:{{ ph.color }};\"\u003e\u003c\/div\u003e\n          \u003cdiv style=\"padding:18px 18px 20px;\"\u003e\n            \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;\"\u003e{{ ph.range }}\u003c\/div\u003e\n            \u003ch4 style=\"margin:8px 0 8px;font-family:'Figtree';font-weight:800;font-size:18px;letter-spacing:-.01em;color:#2A2B2D;\"\u003e{{ ph.name }}\u003c\/h4\u003e\n            \u003cp style=\"margin:0;font-size:13.5px;line-height:1.5;color:#5C5848;\"\u003e{{ ph.blurb }}\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- interactive grid --\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:340px 1fr;gap:30px;margin-top:28px;align-items:start;\"\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:9px;padding:2px 4px 2px 2px;\"\u003e\n        \u003csc-for list=\"{{ days }}\" as=\"row\" hint-placeholder-count=\"6\"\u003e\n          \u003cdiv sc-camel-style=\"{{ row.rowStyle }}\" onclick=\"{{ row.onClick }}\"\u003e\n            \u003cspan sc-camel-style=\"{{ row.numStyle }}\"\u003e{{ row.n2 }}\u003c\/span\u003e\n            \u003cspan style=\"flex:1;min-width:0;\"\u003e\n              \u003cspan sc-camel-style=\"{{ row.titleStyle }};display:block;\"\u003e{{ row.title }}\u003c\/span\u003e\n              \u003cspan sc-camel-style=\"{{ row.placeStyle }};display:block;\"\u003e{{ row.place }}\u003c\/span\u003e\n            \u003c\/span\u003e\n          \u003c\/div\u003e\n        \u003c\/sc-for\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv style=\"position:sticky;top:24px;\"\u003e\n        \u003cdiv style=\"display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px;flex-wrap:wrap;\"\u003e\n          \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:13px;letter-spacing:.02em;color:#5C5848;\"\u003e{{ progress }}\u003c\/span\u003e\n          \u003cdiv style=\"display:flex;gap:8px;align-items:center;\"\u003e\n            \u003cbutton onclick=\"{{ onPrev }}\" style=\"font:inherit;font-size:15px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:36px;height:36px;line-height:1;\"\u003e‹\u003c\/button\u003e\n            \u003cbutton onclick=\"{{ onPlay }}\" style=\"font:inherit;font-size:13px;font-weight:600;cursor:pointer;border:none;background:#2A2B2D;color:#fff;border-radius:999px;padding:0 18px;height:36px;\"\u003e{{ playLabel }}\u003c\/button\u003e\n            \u003cbutton onclick=\"{{ onNext }}\" style=\"font:inherit;font-size:15px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:36px;height:36px;line-height:1;\"\u003e›\u003c\/button\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n\n        \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:20px;padding:32px 34px;box-shadow:0 10px 30px rgba(0,0,0,.05);\"\u003e\n          \u003cdiv style=\"display:flex;align-items:center;gap:11px;margin-bottom:16px;\"\u003e\n            \u003cspan sc-camel-style=\"{{ tagStyle }}\"\u003e{{ active.phaseName }}\u003c\/span\u003e\n            \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:12px;letter-spacing:.08em;color:#9A917D;\"\u003e{{ active.dayLabel }}\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003ch3 style=\"margin:0 0 8px;font-family:'Figtree';font-weight:800;font-size:30px;letter-spacing:-.015em;\"\u003e{{ active.place }}\u003c\/h3\u003e\n          \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:13px;color:#5C5848;margin-bottom:18px;\"\u003e{{ active.route }}  ·  {{ active.modeLabel }}\u003c\/div\u003e\n          \u003cp style=\"margin:0 0 20px;font-size:16.5px;line-height:1.65;color:#3F3E3A;\"\u003e{{ active.narrative }}\u003c\/p\u003e\n          \u003csc-if value=\"{{ active.hasActs }}\" hint-placeholder-val=\"{{ true }}\"\u003e\n            \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:8px;margin-bottom:18px;\"\u003e\n              \u003csc-for list=\"{{ activeActs }}\" as=\"act\" hint-placeholder-count=\"2\"\u003e\n                \u003cspan style=\"display:inline-block;padding:6px 14px;border-radius:999px;background:#F3EEE2;color:#5C5848;font-family:'Figtree',sans-serif;font-size:11.5px;font-weight:700;letter-spacing:.03em;\"\u003e{{ act.name }}\u003c\/span\u003e\n              \u003c\/sc-for\u003e\n            \u003c\/div\u003e\n          \u003c\/sc-if\u003e\n          \u003cdiv style=\"border-top:1px solid #EEE8DA;padding-top:16px;font-size:14px;color:#6B6657;\"\u003e\n\u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.1em;color:#9A917D;\"\u003eSTAY  \u003c\/span\u003e{{ active.accom }}\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== HIGHLIGHTS ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#1E8265;\"\u003e02 — HIGHLIGHTS\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 28px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eFive things that define it\u003c\/h2\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:16px;\"\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #E1343F;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#E1343F;margin-bottom:14px;\"\u003e01\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003ePrivate hot air balloon flight over the Ararat Valley, reaching 1,000 m altitude.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #1E8265;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1E8265;margin-bottom:14px;\"\u003e02\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003e8 km guided hike through Khosrov Forest Reserve to Havuts Tar Monastery (3.5–4 hrs).\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #1CA0DC;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1CA0DC;margin-bottom:14px;\"\u003e03\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eTandem paragliding over Lake Sevan or the Caucasus mountains — photo and video included.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #F6A21E;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#F6A21E;margin-bottom:14px;\"\u003e04\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eFull-day e-bike ascent to Dimats Mountain — up to 2,400 m, 26–30 km of forest and gravel terrain.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #E1343F;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#E1343F;margin-bottom:14px;\"\u003e05\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eHiking descent through Lastiver Gorge — waterfalls, ancient caves, and 13th-century history.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== EXPERIENCE ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#F6A21E;\"\u003e03 — THE EXPERIENCE\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 28px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eWhat you're signing up for\u003c\/h2\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;\"\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n        \u003ch4 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:18px;\"\u003eWho this is for\u003c\/h4\u003e\n        \u003cp style=\"margin:0;font-size:15.5px;line-height:1.6;color:#3F3E3A;\"\u003eTravellers after a structured, active itinerary combining multiple outdoor disciplines across Armenia's landscapes — comfortable with long hiking days, sustained e-biking at altitude, and changing terrain across gorge, highland and forest environments. Minimum age 15.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n        \u003ch4 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:18px;\"\u003eJourney type\u003c\/h4\u003e\n        \u003cp style=\"margin:0 0 14px;font-size:15.5px;line-height:1.6;color:#3F3E3A;\"\u003eA multi-sport expedition combining:\u003c\/p\u003e\n        \u003cdiv style=\"display:flex;flex-direction:column;gap:9px;\"\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#1CA0DC;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eAerial experiences — balloon flight and paragliding\u003c\/span\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#1E8265;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eActive mountain days — e-biking to 2,400 m\u003c\/span\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#E1343F;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eCultural immersion — monasteries, lavash masterclass, highland villages\u003c\/span\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"grid-column:1 \/ -1;background:#2A2B2D;color:#F4EFE4;border-radius:18px;padding:36px 40px;\"\u003e\n        \u003ch4 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:20px;color:#fff;\"\u003eWhat makes it unique\u003c\/h4\u003e\n        \u003cp style=\"margin:0;max-width:840px;font-size:16.5px;line-height:1.65;color:#CDC7B8;\"\u003eThe expedition moves through three radically different environments in six days — the urban culture and volcanic basalt gorges of the capital, the aerial experiences of the Armenian highlands, and the dense ancient forests of the Tavush region. Few itineraries in the South Caucasus combine a structured aerial programme, a high-altitude e-bike expedition, and a remote gorge descent within a single coherent route.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- gallery band --\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px;margin-top:18px;\"\u003e\n      \u003cdiv\u003e\n        \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin:0 0 8px 2px;\"\u003eTHE CITY\u003c\/div\u003e\n        \u003cx-import component-from-global-scope=\"image-slot\" from=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=#\/image-slot.js\" id=\"gal-city\" placeholder=\"Drop a photo — Yerevan \u0026amp; the gorges\" shape=\"rounded\" radius=\"16\" style=\"width:100%;height:300px;display:block;\" hint-size=\"100%,300px\"\u003e\u003c\/x-import\u003e\n      \u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin:0 0 8px 2px;\"\u003eTHE HIGHLANDS\u003c\/div\u003e\n        \u003cx-import component-from-global-scope=\"image-slot\" from=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=#\/image-slot.js\" id=\"gal-highlands\" placeholder=\"Drop a photo — balloon \u0026amp; paragliding\" shape=\"rounded\" radius=\"16\" style=\"width:100%;height:300px;display:block;\" hint-size=\"100%,300px\"\u003e\u003c\/x-import\u003e\n      \u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin:0 0 8px 2px;\"\u003eTHE FORESTS\u003c\/div\u003e\n        \u003cx-import component-from-global-scope=\"image-slot\" from=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=#\/image-slot.js\" id=\"gal-forests\" placeholder=\"Drop a photo — Dimats \u0026amp; Lastiver\" shape=\"rounded\" radius=\"16\" style=\"width:100%;height:300px;display:block;\" hint-size=\"100%,300px\"\u003e\u003c\/x-import\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== WHERE YOU'LL STAY ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#1E8265;\"\u003e04 — WHERE YOU'LL STAY\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 8px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eAccommodation\u003c\/h2\u003e\n    \u003cp style=\"margin:0 0 28px;max-width:660px;font-size:16px;line-height:1.6;color:#5C5848;\"\u003eFrom a 4-star city hotel in the capital to a forested highland base in Dilijan with spa access — every stay on the expedition, slide by slide.\u003c\/p\u003e\n\n    \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:22px;padding:30px;box-shadow:0 10px 34px rgba(0,0,0,.05);\"\u003e\n      \u003csc-for list=\"{{ hotels }}\" as=\"h\" hint-placeholder-count=\"1\"\u003e\n        \u003cdiv sc-camel-style=\"{{ h.wrapStyle }}\"\u003e\n          \u003cdiv style=\"display:grid;grid-template-columns:0.8fr 1.2fr;gap:34px;align-items:center;\"\u003e\n            \u003cdiv\u003e\n              \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11.5px;letter-spacing:.14em;color:#9A917D;margin-bottom:10px;\"\u003e{{ h.where }}\u003c\/div\u003e\n              \u003ch3 style=\"margin:0 0 14px;font-family:'Figtree';font-weight:800;font-size:30px;letter-spacing:-.015em;line-height:1.04;\"\u003e{{ h.name }}\u003c\/h3\u003e\n              \u003cdiv style=\"display:flex;align-items:center;gap:10px;margin-bottom:18px;\"\u003e\n                \u003cspan style=\"color:#F6A21E;font-size:19px;letter-spacing:3px;line-height:1;\"\u003e{{ h.starText }}\u003c\/span\u003e\n                \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:11px;letter-spacing:.08em;color:#9A917D;\"\u003e{{ h.ratingLabel }}\u003c\/span\u003e\n              \u003c\/div\u003e\n              \u003cp style=\"margin:0;font-size:16px;line-height:1.65;color:#3F3E3A;\"\u003e{{ h.desc }}\u003c\/p\u003e\n            \u003c\/div\u003e\n            \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:12px;height:420px;\"\u003e\n              \u003csc-for list=\"{{ h.imgs }}\" as=\"im\" hint-placeholder-count=\"4\"\u003e\n                \u003cx-import component-from-global-scope=\"image-slot\" from=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=#\/image-slot.js\" id=\"{{ im.id }}\" placeholder=\"{{ im.ph }}\" shape=\"rounded\" radius=\"14\" style=\"width:100%;height:100%;display:block;\" hint-size=\"100%,100%\"\u003e\u003c\/x-import\u003e\n              \u003c\/sc-for\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n\n      \u003cdiv style=\"display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:26px;padding-top:24px;border-top:1px solid #EEE8DA;flex-wrap:wrap;\"\u003e\n        \u003cdiv style=\"display:flex;align-items:center;gap:14px;\"\u003e\n          \u003cbutton onclick=\"{{ onHotelPrev }}\" style=\"font:inherit;font-size:16px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:40px;height:40px;line-height:1;\"\u003e‹\u003c\/button\u003e\n          \u003cbutton onclick=\"{{ onHotelNext }}\" style=\"font:inherit;font-size:16px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:40px;height:40px;line-height:1;\"\u003e›\u003c\/button\u003e\n          \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:13px;letter-spacing:.08em;color:#5C5848;\"\u003e{{ hotelCounter }}\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv style=\"display:flex;gap:8px;align-items:center;\"\u003e\n          \u003csc-for list=\"{{ hotelDots }}\" as=\"dot\" hint-placeholder-count=\"2\"\u003e\n            \u003cspan sc-camel-style=\"{{ dot.style }}\" onclick=\"{{ dot.onClick }}\"\u003e\u003c\/span\u003e\n          \u003c\/sc-for\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== DIFFICULTY ===================== --\u003e\n  \u003csection style=\"margin-top:60px;background:#fff;border:1px solid #E7E0D1;border-radius:20px;padding:34px;display:grid;grid-template-columns:auto 1fr;gap:38px;align-items:center;\"\u003e\n    \u003cdiv style=\"text-align:center;\"\u003e\n      \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.14em;color:#9A917D;margin-bottom:8px;\"\u003eDIFFICULTY\u003c\/div\u003e\n      \u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:56px;line-height:1;color:#E1343F;\"\u003e3\u003cspan style=\"font-size:24px;color:#C9C3B5;\"\u003e\/5\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"display:flex;gap:5px;justify-content:center;margin-top:16px;\"\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#1E8265;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#F6A21E;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#E1343F;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#E7E0D1;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#E7E0D1;\"\u003e\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n      \u003cp style=\"margin:0;font-size:16.5px;line-height:1.55;color:#3F3E3A;\"\u003e\u003cstrong\u003eModerate to challenging\u003c\/strong\u003e — the programme combines easy cultural days with above-moderate physical days.\u003c\/p\u003e\n      \u003cp style=\"margin:0;font-size:16.5px;line-height:1.55;color:#3F3E3A;\"\u003e\u003cstrong\u003eDay 5 is the hardest\u003c\/strong\u003e — a full-day e-bike ascent to Dimats Mountain (2,400 m, 26–30 km) requiring good cardiovascular fitness.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== INCLUDED \/ EXCLUDED ===================== --\u003e\n  \u003csection style=\"margin-top:60px;display:grid;grid-template-columns:1fr 1fr;gap:16px;\"\u003e\n    \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n      \u003ch4 style=\"margin:0 0 20px;font-family:'Figtree';font-weight:800;font-size:18px;color:#1E8265;\"\u003eIncluded\u003c\/h4\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eAirport transfers\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eEnglish-speaking guide\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e3 nights in Yerevan + 2 nights in Dilijan\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eDaily breakfasts\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e3 lunches + lunch box (Day 5)\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e4 dinners including farewell dinner\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003ePrivate hot air balloon flight\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eParagliding experience (with photo\/video)\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eE-bike experience to Dimats Mountain\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eProfessional mountain guides where needed\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eEntrance tickets\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eTransportation (Mercedes Sprinter)\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eWater during excursions\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003eRefresh rooms before departure\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n      \u003ch4 style=\"margin:0 0 20px;font-family:'Figtree';font-weight:800;font-size:18px;color:#E1343F;\"\u003eNot included\u003c\/h4\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cline x1=\"4\" y1=\"4\" x2=\"13\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003cline x1=\"13\" y1=\"4\" x2=\"4\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003c\/svg\u003eInternational flights\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cline x1=\"4\" y1=\"4\" x2=\"13\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003cline x1=\"13\" y1=\"4\" x2=\"4\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003c\/svg\u003eTravel insurance (mandatory)\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cline x1=\"4\" y1=\"4\" x2=\"13\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003cline x1=\"13\" y1=\"4\" x2=\"4\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003c\/svg\u003eAlcohol during meals\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cline x1=\"4\" y1=\"4\" x2=\"13\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003cline x1=\"13\" y1=\"4\" x2=\"4\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003c\/svg\u003eTips\u003c\/span\u003e\n        \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cline x1=\"4\" y1=\"4\" x2=\"13\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003cline x1=\"13\" y1=\"4\" x2=\"4\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003c\/svg\u003eSelected meals\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"margin-top:24px;border-top:1px solid #EEE8DA;padding-top:20px;\"\u003e\n        \u003ch4 style=\"margin:0 0 16px;font-family:'Figtree';font-weight:800;font-size:16px;color:#2A2B2D;\"\u003eLogistics\u003c\/h4\u003e\n        \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;\"\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eARRIVAL\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eYerevan Int'l (EVN)\u003c\/div\u003e\n\u003c\/div\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eDEPARTURE\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eYerevan Int'l (EVN)\u003c\/div\u003e\n\u003c\/div\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eVISA\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eNot required (EU travelers)\u003c\/div\u003e\n\u003c\/div\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eINSURANCE\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eMandatory\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== WHAT TO BRING ===================== --\u003e\n  \u003csc-if value=\"{{ showPacking }}\" hint-placeholder-val=\"{{ true }}\"\u003e\n  \u003csection style=\"margin-top:60px;background:#2A2B2D;border-radius:20px;padding:36px;\"\u003e\n    \u003cdiv style=\"display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:6px;\"\u003e\n      \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#F6A21E;\"\u003e05 — ACTIVE DAYS\u003c\/span\u003e\n      \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:12px;color:#9A917D;\"\u003e{{ packStatus }}\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003ch2 style=\"margin:12px 0 8px;font-family:'Figtree';font-weight:800;font-size:clamp(24px,3.4vw,34px);color:#fff;letter-spacing:-.015em;\"\u003eWhat to bring\u003c\/h2\u003e\n    \u003cp style=\"margin:0 0 24px;max-width:660px;font-size:15.5px;line-height:1.6;color:#CDC7B8;\"\u003eFor the e-bike expedition to Dimats Mountain (Day 5) and the hiking days you carry personal essentials. Tap to check off your kit — E-MTBs and mountain guides are provided by the expedition team.\u003c\/p\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:repeat(2,1fr);gap:10px;\"\u003e\n      \u003csc-for list=\"{{ packing }}\" as=\"item\" hint-placeholder-count=\"10\"\u003e\n        \u003cbutton sc-camel-style=\"{{ item.style }}\" onclick=\"{{ item.onClick }}\"\u003e\n          \u003cspan sc-camel-style=\"{{ item.boxStyle }}\"\u003e\n            \u003csc-if value=\"{{ item.checked }}\" hint-placeholder-val=\"{{ false }}\"\u003e\n              \u003csvg width=\"13\" height=\"13\"\u003e\u003cpolyline points=\"2,7 5,11 11,3\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\n            \u003c\/sc-if\u003e\n          \u003c\/span\u003e\n          \u003cspan sc-camel-style=\"{{ item.textStyle }}\"\u003e{{ item.name }}\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/sc-for\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003c\/sc-if\u003e\n\n  \u003c!-- ===================== FAQ ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#1CA0DC;\"\u003e06 — FAQ\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 28px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eFrequently asked questions\u003c\/h2\u003e\n    \u003cdiv style=\"display:flex;flex-direction:column;gap:10px;\"\u003e\n      \u003csc-for list=\"{{ faqs }}\" as=\"f\" hint-placeholder-count=\"7\"\u003e\n        \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:16px;overflow:hidden;\"\u003e\n          \u003cbutton onclick=\"{{ f.onClick }}\" style=\"width:100%;font:inherit;text-align:left;cursor:pointer;background:none;border:none;padding:22px 26px;display:flex;align-items:center;justify-content:space-between;gap:18px;\"\u003e\n            \u003cspan style=\"font-family:'Figtree';font-weight:700;font-size:17px;color:#2A2B2D;line-height:1.3;\"\u003e{{ f.q }}\u003c\/span\u003e\n            \u003cspan sc-camel-style=\"{{ f.signStyle }}\"\u003e{{ f.sign }}\u003c\/span\u003e\n          \u003c\/button\u003e\n          \u003csc-if value=\"{{ f.open }}\" hint-placeholder-val=\"{{ false }}\"\u003e\n            \u003cdiv style=\"padding:0 26px 24px;\"\u003e\n              \u003cp style=\"margin:0;font-size:15.5px;line-height:1.65;color:#3F3E3A;\"\u003e{{ f.a }}\u003c\/p\u003e\n            \u003c\/div\u003e\n          \u003c\/sc-if\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== FOOTER ===================== --\u003e\n  \u003cfooter style=\"margin-top:56px;padding-top:26px;border-top:1px solid #E7E0D1;\"\u003e\n    \u003cp style=\"margin:0;font-size:13px;color:#9A917D;line-height:1.5;\"\u003eItinerary, timings and accommodation are indicative and may change due to weather, trail and local conditions. Distances and altitudes are approximate. Operated by Vital Ingredients \u0026amp; Adventures GmbH (The One Adventure), Vienna, Austria.\u003c\/p\u003e\n  \u003c\/footer\u003e\n\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/x-dc\u003e\n\u003cscript type=\"text\/x-dc\" data-dc-script=\"\" data-props='{\"autoPlayOnLoad\":{\"editor\":\"boolean\",\"default\":false,\"tsType\":\"boolean\"},\"showPackingList\":{\"editor\":\"boolean\",\"default\":true,\"tsType\":\"boolean\"}}'\u003e\nclass Component extends DCLogic {\n  constructor(props){\n    super(props);\n    this.PC = {1:'#E1343F',2:'#1E8265',3:'#1CA0DC'};\n    this.PHN = {1:'THE CITY',2:'THE HIGHLANDS',3:'THE FORESTS'};\n    this.DATA = [\n      {n:1,phase:1,title:'Arrival in Yerevan',place:'Yerevan',route:'Yerevan (EVN) \\u2192 city hotel',modeLabel:'Airport transfer',acts:[],accom:'4\\u2605 hotel, Yerevan',narrative:'Arrive at Yerevan International Airport, where the group meets and transfers to a 4-star hotel in the city. The evening is unstructured \\u2014 time to rest or explore the capital\\u2019s caf\\u00e9s and old quarter before the expedition opens with a welcome dinner.'},\n      {n:2,phase:1,title:'Ararat Valley by Air',place:'Ararat Valley \u0026 Yerevan',route:'Yerevan \\u00b7 Ararat Valley',modeLabel:'Hot air balloon',acts:['Hot air balloon','Lavash masterclass'],accom:'4\\u2605 hotel, Yerevan',narrative:'A pre-dawn private hot air balloon flight over the Ararat Valley, rising to around 1,000 m with Mount Ararat on the horizon at sunrise. The rest of the day belongs to the capital \\u2014 its volcanic basalt gorges and a traditional lavash bread masterclass.'},\n      {n:3,phase:2,title:'Khosrov Reserve \u0026 Havuts Tar',place:'Khosrov Forest Reserve',route:'Yerevan \\u2192 Khosrov Reserve \\u2192 Yerevan',modeLabel:'Trek \\u00b7 8 km',acts:['Hiking'],accom:'4\\u2605 hotel, Yerevan',narrative:'Drive to the Khosrov Forest Reserve for an 8 km guided hike (3.5\\u20134 hrs) through oak forest to the ruined Havuts Tar Monastery, with views across the Garni basalt gorge. Return to Yerevan for the final city night.'},\n      {n:4,phase:2,title:'Lake Sevan \u0026 Paragliding',place:'Lake Sevan \\u2192 Dilijan',route:'Yerevan \\u2192 Lake Sevan \\u2192 Dilijan',modeLabel:'Paragliding + transfer',acts:['Paragliding (tandem)'],accom:'4\\u2605 forest hotel, Dilijan',narrative:'Travel to Lake Sevan for an optional tandem paragliding flight over the water and the surrounding Caucasus ridges \\u2014 photo and video included. Continue into the Tavush region to a forested 4-star base in Dilijan with spa access.'},\n      {n:5,phase:3,title:'Dimats Mountain by E-bike',place:'Dimats Mountain \\u00b7 2,400 m',route:'Dilijan \\u00b7 Dimats Mountain',modeLabel:'E-bike \\u00b7 26\\u201330 km',acts:['E-bike'],accom:'4\\u2605 forest hotel, Dilijan',narrative:'The hardest day \\u2014 a full-day e-MTB expedition from Dilijan National Park up forested gravel tracks to Dimats Mountain (around 2,400 m, 26\\u201330 km), then a long technical descent past Haghartsin Monastery to Teghut village. A lunch box is carried for the route.'},\n      {n:6,phase:3,title:'Lastiver Gorge \u0026 Departure',place:'Lastiver Gorge',route:'Yenokavan \\u2192 Lastiver \\u2192 Yerevan (EVN)',modeLabel:'Trek + transfer',acts:['Hiking'],accom:'\\u2014',narrative:'A final descent into the 100 m-deep Lastiver Gorge near Yenokavan \\u2014 cascading waterfalls, 13th-century Mongol-era cave dwellings, and dense mixed forest. Transfer back to Yerevan for the onward departure flight.'}\n    ];\n    this.HOTELS = [\n      {name:'City Hotel', where:'YEREVAN', stars:4, ratingLabel:'4-star hotel', desc:'Three nights in a 4-star hotel in central Yerevan \\u2014 a comfortable base for the city, the Ararat balloon flight and the Khosrov hike, within reach of the capital\\u2019s caf\\u00e9s and old quarter.', imgs:[{id:'htl-yerevan-1',ph:'Exterior'},{id:'htl-yerevan-2',ph:'Room'},{id:'htl-yerevan-3',ph:'Lounge'},{id:'htl-yerevan-4',ph:'City view'}]},\n      {name:'Forest Hotel \u0026 Spa', where:'DILIJAN', stars:4, ratingLabel:'4-star hotel \\u00b7 spa', desc:'Two nights at a forested 4-star retreat in Dilijan with spa access \\u2014 the recovery base in the heart of Tavush, surrounded by the national park\\u2019s woodland after the e-bike and gorge days.', imgs:[{id:'htl-dilijan-1',ph:'Exterior'},{id:'htl-dilijan-2',ph:'Room'},{id:'htl-dilijan-3',ph:'Spa'},{id:'htl-dilijan-4',ph:'Forest setting'}]}\n    ];\n    this.PACK = ['Padded cycling shorts','Waterproof jacket','Hydration pack (2\\u20133 L)','Cycling gloves','Energy snacks','Sun hat \u0026 SPF50+','Warm mid-layer (balloon altitude)','Trail \/ hiking shoes','Daypack (20\\u201325 L)','Headlamp (Lastiver caves)'];\n    this.FAQ = [\n      {q:'How difficult is this Armenia tour?',a:'It is rated 3 out of 5. Most days are moderate, but Day 5 \\u2014 the full-day e-bike ascent to Dimats Mountain at 2,400 m over 26\\u201330 km \\u2014 is above moderate and requires good cardiovascular fitness. The 8 km hike on Day 3 takes 3.5\\u20134 hours with some elevation gain. Day 6 is an easy-to-moderate gorge descent. Paragliding on Day 4 is optional and beginner-friendly as a tandem flight.'},\n      {q:'Is paragliding experience required?',a:'No. All paragliding on this expedition is conducted as a tandem flight with a certified professional pilot. No prior experience is needed. The activity is optional \\u2014 travellers who prefer not to paraglide can use the time for spa access or a walk through Dilijan\\u2019s old quarter. Photo and video are included for those who fly.'},\n      {q:'What is Dimats Mountain?',a:'Dimats Mountain is located in Tavush Province, northeastern Armenia, near Dilijan. It rises to approximately 2,400 m and is accessed via forested gravel tracks from Dilijan National Park. It is one of the premier e-MTB destinations in the South Caucasus, offering sustained forest climbs and a long technical descent via Haghartsin Monastery to Teghut village. E-MTB equipment is provided.'},\n      {q:'What is Lastiver Gorge?',a:'Lastiver Gorge is a 100 m-deep forested canyon near the village of Yenokavan in Armenia\\u2019s Tavush region. It has cascading waterfalls, ancient cave dwellings used as 13th-century Mongol-era refuges, and dense mixed forest. It is consistently rated one of the most rewarding short hikes in northeastern Armenia.'},\n      {q:'What is included in the \\u20ac3,250 price?',a:'Airport transfers, English-speaking guide, 3 nights in a 4-star hotel in Yerevan and 2 nights in a 4-star hotel in Dilijan (with spa access), all breakfasts, 3 lunches and the Day 5 lunch box, 4 dinners including the farewell dinner, private hot air balloon flight, paragliding with photo and video, e-bike equipment, all entrance tickets, Mercedes Sprinter transport throughout, and water on all activity days. International flights, travel insurance, visa fees, personal gear, alcohol and tips are not included.'},\n      {q:'How large is the group?',a:'This is a small-group expedition with a maximum of 10 travellers, departing on a fixed date of 25 July. Small group size keeps the experience personal on active days and in cultural settings throughout the route.'},\n      {q:'What is the best time to do this tour?',a:'July is ideal for all five activities on this expedition \\u2014 balloon flights, paragliding, e-biking and hiking are all in optimal season. Armenia\\u2019s highland regions are at their best from May to October, with dry trails, clear skies and accessible mountain roads.'}\n    ];\n    this.state = { active:1, phase:0, playing:false, packed:{}, hotel:0, faq:{} };\n  }\n\n  componentDidMount(){\n    try{ const p=JSON.parse(localStorage.getItem('toa_pack_armenia')||'{}'); if(p\u0026\u0026typeof p==='object') this.setState({packed:p}); }catch(e){}\n    if(this.props.autoPlayOnLoad){ this._t=setInterval(()=\u003ethis.next(),1500); this.setState({playing:true}); }\n  }\n  componentWillUnmount(){ if(this._t) clearInterval(this._t); }\n\n  setDay(n){ this.setState({active:n}); }\n  next(){ this.setState(s=\u003e({active:s.active\u003e=6?1:s.active+1})); }\n  prev(){ this.setState(s=\u003e({active:s.active\u003c=1?6:s.active-1})); }\n  togglePlay(){\n    if(this.state.playing){ clearInterval(this._t); this._t=null; this.setState({playing:false}); }\n    else { this._t=setInterval(()=\u003ethis.next(),1500); this.setState({playing:true}); }\n  }\n  setPhase(p){ const start={1:1,2:3,3:5}[p]; this.setState(s=\u003e s.phase===p?{phase:0}:{phase:p,active:start}); }\n  togglePack(i){ this.setState(s=\u003e{ const k=Object.assign({},s.packed); k[i]=!k[i]; try{localStorage.setItem('toa_pack_armenia',JSON.stringify(k));}catch(e){} return {packed:k}; }); }\n  setHotel(i){ this.setState({hotel:i}); }\n  nextHotel(){ this.setState(s=\u003e({hotel:(s.hotel+1)%this.HOTELS.length})); }\n  prevHotel(){ this.setState(s=\u003e({hotel:(s.hotel-1+this.HOTELS.length)%this.HOTELS.length})); }\n  toggleFaq(i){ this.setState(s=\u003e{ const k=Object.assign({},s.faq); k[i]=!k[i]; return {faq:k}; }); }\n\n  renderVals(){\n    const PC=this.PC, a=this.state.active, pf=this.state.phase;\n    const d=this.DATA[a-1];\n    const phaseFull={1:'The City \\u00b7 Volcanic Gorges',2:'The Highlands \\u00b7 Aerial',3:'The Forests \\u00b7 Tavush'};\n\n    const days=this.DATA.map(x=\u003e{\n      const act=x.n===a;\n      return {\n        n2:String(x.n).padStart(2,'0'), title:x.title, place:x.place,\n        onClick:()=\u003ethis.setDay(x.n),\n        rowStyle:{display:'flex',gap:'13px',alignItems:'flex-start',padding:'14px 16px',borderRadius:'14px',cursor:'pointer',border:'1px solid '+(act?PC[x.phase]:'#E7E0D1'),borderLeft:'5px solid '+(act?PC[x.phase]:'#E7E0D1'),background:act?'#fff':'rgba(255,255,255,.4)',boxShadow:act?'0 8px 22px rgba(0,0,0,.07)':'none',transition:'all .18s'},\n        numStyle:{fontFamily:\"'Figtree', sans-serif\",fontWeight:800,fontSize:'14px',color:PC[x.phase],minWidth:'22px',paddingTop:'1px'},\n        titleStyle:{fontFamily:\"'Figtree', sans-serif\",fontWeight:700,fontSize:'15px',color:act?'#2A2B2D':'#54503F',lineHeight:1.2},\n        placeStyle:{fontFamily:\"'Figtree', sans-serif\",fontWeight:600,fontSize:'11px',color:'#9A917D',marginTop:'3px',letterSpacing:'.02em'}\n      };\n    });\n\n    const meta={\n      1:{range:'DAYS 01\\u201302',name:'The City \\u2014 Volcanic Gorges',blurb:'Yerevan, a dawn balloon over Ararat, and the capital\\u2019s basalt gorges.'},\n      2:{range:'DAYS 03\\u201304',name:'The Highlands \\u2014 Aerial',blurb:'A highland hike to Havuts Tar and paragliding above Lake Sevan.'},\n      3:{range:'DAYS 05\\u201306',name:'The Forests \\u2014 Tavush',blurb:'E-biking to Dimats Mountain and a descent through Lastiver Gorge.'}\n    };\n    const phases=[1,2,3].map(p=\u003e{\n      const act=pf===p;\n      return {\n        onClick:()=\u003ethis.setPhase(p), color:PC[p], range:meta[p].range, name:meta[p].name, blurb:meta[p].blurb,\n        cardStyle:{flex:'1 1 220px',minWidth:'0',background:'#fff',borderRadius:'16px',overflow:'hidden',cursor:'pointer',border:'1.5px solid '+(act?PC[p]:'#E7E0D1'),boxShadow:act?'0 14px 32px rgba(0,0,0,.10)':'0 2px 8px rgba(0,0,0,.03)',transform:act?'translateY(-3px)':'none',transition:'all .2s'}\n      };\n    });\n\n    const packed=this.state.packed;\n    const packing=this.PACK.map((t,i)=\u003e{\n      const ck=!!packed[i];\n      return {\n        name:t, checked:ck, onClick:()=\u003ethis.togglePack(i),\n        style:{display:'flex',alignItems:'center',gap:'12px',padding:'13px 15px',borderRadius:'12px',border:'1px solid '+(ck?'#1E8265':'rgba(255,255,255,.16)'),background:ck?'rgba(30,130,101,.16)':'rgba(255,255,255,.05)',cursor:'pointer',textAlign:'left',width:'100%',font:'inherit',transition:'all .15s'},\n        boxStyle:{width:'22px',height:'22px',flex:'0 0 auto',borderRadius:'6px',border:'2px solid '+(ck?'#1E8265':'rgba(255,255,255,.35)'),background:ck?'#1E8265':'transparent',display:'flex',alignItems:'center',justifyContent:'center'},\n        textStyle:{fontSize:'14px',color:ck?'#fff':'#CDC7B8',fontWeight:ck?600:500}\n      };\n    });\n    const packCount=this.PACK.reduce((n,_,i)=\u003en+(packed[i]?1:0),0);\n\n    const hi=this.state.hotel;\n    const hotels=this.HOTELS.map((h,i)=\u003e({\n      name:h.name, where:h.where, desc:h.desc, imgs:h.imgs,\n      starText:'\\u2605'.repeat(h.stars), ratingLabel:h.ratingLabel,\n      wrapStyle:{display:i===hi?'block':'none'}\n    }));\n    const hotelDots=this.HOTELS.map((h,i)=\u003e({\n      onClick:()=\u003ethis.setHotel(i),\n      style:{width:i===hi?'26px':'9px',height:'9px',borderRadius:'999px',background:i===hi?'#E1343F':'#D8D2C4',cursor:'pointer',transition:'all .2s',display:'inline-block'}\n    }));\n\n    const faqState=this.state.faq;\n    const faqs=this.FAQ.map((f,i)=\u003e{\n      const op=!!faqState[i];\n      return {\n        q:f.q, a:f.a, open:op, sign:op?'\\u2212':'+',\n        onClick:()=\u003ethis.toggleFaq(i),\n        signStyle:{flex:'0 0 auto',width:'30px',height:'30px',borderRadius:'999px',background:op?'#1CA0DC':'#F3EEE2',color:op?'#fff':'#5C5848',display:'flex',alignItems:'center',justifyContent:'center',fontSize:'18px',fontWeight:700,lineHeight:1,transition:'all .15s'}\n      };\n    });\n\n    return {\n      days, phases, packing, hotels, hotelDots, faqs,\n      hotelCounter:String(hi+1).padStart(2,'0')+' \/ '+String(this.HOTELS.length).padStart(2,'0'),\n      onHotelPrev:()=\u003ethis.prevHotel(), onHotelNext:()=\u003ethis.nextHotel(),\n      showPacking:this.props.showPackingList!==false,\n      packStatus:packCount+' \/ '+this.PACK.length+' packed',\n      active:{\n        dayLabel:'DAY '+String(a).padStart(2,'0'), title:d.title, place:d.place, route:d.route, narrative:d.narrative,\n        phaseName:this.PHN[d.phase], modeLabel:d.modeLabel, accom:d.accom, hasActs:d.acts.length\u003e0\n      },\n      activeActs:d.acts.map(x=\u003e({name:x})),\n      progress:'Day '+a+' of 6 \\u00b7 '+phaseFull[d.phase],\n      onPrev:()=\u003ethis.prev(), onNext:()=\u003ethis.next(), onPlay:()=\u003ethis.togglePlay(),\n      playLabel:this.state.playing?'Pause':'Auto-play',\n      tagStyle:{display:'inline-block',padding:'4px 11px',borderRadius:'999px',background:PC[d.phase],color:'#fff',fontFamily:\"'Figtree', sans-serif\",fontSize:'11px',fontWeight:700,letterSpacing:'.06em'}\n    };\n  }\n}\n\u003c\/script\u003e\n\u003c\/body\u003e","brand":"The One Adventure","offers":[{"title":"25 July - 30 July","offer_id":57184936984958,"sku":null,"price":3250.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/armenia-peak-to-peak-ebikers-highland-landscape-ancient-monastery.jpg?v=1779955655","url":"https:\/\/theoneadventure.com\/products\/ascend-glide-and-traverse-across-armenia-s-wild-highlands","provider":"The One Adventure","version":"1.0","type":"link"}