{"product_id":"georgia-vines-peaks-old-stones","title":"Georgia: Vines, Peaks \u0026 Old Stones — 8-Day Wine, Culture \u0026 Mountain Adventure","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\/JC8sICIiKSB8fCAiUm9vdCI7CiAgfQoKICAvLyBzcmMvYm9vdC50cwogIHZhciBCQVNFX0NTUyA9IGAKICAgIC5zYy1wbGFjZWhvbGRlcntiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlcjoxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUwJSx0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlci1yYWRpdXM6MnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW59CiAgICBAa2V5ZnJhbWVzIHNjLXNoaW5lezAle2JhY2tncm91bmQtcG9zaXRpb246MTAwJSA1MCV9MTAwJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAlIDUwJX19CiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtcGxhY2Vob2xkZXIsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmd7cG9zaXRpb246cmVsYXRpdmU7CiAgICAgIGJhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUlLHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOjpiZWZvcmUsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmc6OmJlZm9yZXtjb250ZW50OicnOwogICAgICBwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3BvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHJnYmEoMjE3LDExOSw4NywwKSAyNSUscmdiYSgyNDcsMjI1LDIxMSwuOTUpIDM3JSxyZ2JhKDIxNywxMTksODcsMCkgNjMlKTsKICAgICAgYmFja2dyb3VuZC1zaXplOjQwMCUgMTAwJTthbmltYXRpb246c2Mtc2hpbmUgMS40cyBlYXNlIGluZmluaXRlfQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOm50aC1jaGlsZChuKzkgb2YgLnNjLXBsYWNlaG9sZGVyKTo6YmVmb3JlLAogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLWludGVycC5zYy1taXNzaW5nOm50aC1jaGlsZChuKzkgb2YgLnNjLWludGVycC5zYy1taXNzaW5nKTo6YmVmb3Jle2FuaW1hdGlvbjpub25lOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCl9CiAgICAuc2MtcGxhY2Vob2xkZXItZXJyb3J7cGFkZGluZzo0cHggOHB4O2ZvbnQ6MTFweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgY29sb3I6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDcwJSx0cmFuc3BhcmVudCk7d29yZC1icmVhazpicmVhay13b3JkfQogICAgLnNjLWludGVycC5zYy1taXNzaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MWVtO292ZXJmbG93OmhpZGRlbjsKICAgICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjUpOwogICAgICBib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dHJhbnNwYXJlbnQ7CiAgICAgIHVzZXItc2VsZWN0Om5vbmV9CiAgICAuc2MtaW50ZXJwLnNjLXVucmVzb2x2ZWR7Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6Ljg1ZW07CiAgICAgIGNvbG9yOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA1MCUsdHJhbnNwYXJlbnQpOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciAxMCUsdHJhbnNwYXJlbnQpO2JvcmRlci1yYWRpdXM6M3B4OwogICAgICBwYWRkaW5nOjAgM3B4fQogICAgLnNjLWhvc3Quc2MtaGFzLWVycm9ye3Bvc2l0aW9uOnJlbGF0aXZlfQogICAgLnNjLWxvZ2ljLWVycm9ye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7bGVmdDo4cHg7ei1pbmRleDoyMTQ3NDgzNjQ3O21heC13aWR0aDo2MGNoOwogICAgICBwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6I2IwMDAyMDtjb2xvcjojZmZmO2ZvbnQ6MTJweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgYm9yZGVyLXJhZGl1czo0cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC8qIE1pcnJvcnMgUFJJTlRfQkFTRUxJTkVfQ1NTIGluIGFwcHMvd2ViIGRlY2stc3RhZ2UtZXhwb3J0LnRzIFx1MjAxNCBrZWVwIGJvdGgKICAgICAgIGluIHN5bmMgdW50aWwgZGMtcnVudGltZSByZWdhaW5zIGEgYnVpbGQgc3RlcC4gKi8KICAgIEBtZWRpYSBwcmludCB7CiAgICAgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQogICAgICBmaWd1cmUsIHRhYmxlIHsgYnJlYWstaW5zaWRlOiBhdm9pZDsgfQogICAgICAjZGMtcm9vdCwgI2RjLXJvb3QgPiAuc2MtaG9zdCB7IGhlaWdodDogYXV0bzsgfQogICAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsKICAgICAgICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0OyAtd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDogZXhhY3Q7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtOTlzICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1kdXJhdGlvbjogLjAwMXMgIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGggIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZyAhaW1wb3J0YW50OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwcyAhaW1wb3J0YW50OwogICAgICB9CiAgICB9CiAgYDsKICB2YXIgRlVMTF9QQUdFX0NTUyA9ICJodG1sLGJvZHl7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9I2RjLXJvb3QsI2RjLXJvb3Q+LnNjLWhvc3R7aGVpZ2h0OjEwMCV9IjsKICBmdW5jdGlvbiByb290TmFtZUZvckRvY3VtZW50KGRvYywgbG9jKSB7CiAgICBsZXQgYm9vdFBhdGggPSBsb2MucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoIS9cLmRjXC5odG1sPyQvaS50ZXN0KHNhZmVEZWNvZGUoYm9vdFBhdGgpKSkgewogICAgICB0cnkgewogICAgICAgIGJvb3RQYXRoID0gbmV3IFVSTChkb2MuYmFzZVVSSSB8fCAiLyIpLnBhdGhuYW1lOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRjTmFtZUZyb21QYXRoKGJvb3RQYXRoKTsKICB9CiAgZnVuY3Rpb24gc2FmZURlY29kZShzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHMpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBzOwogICAgfQogIH0KICBmdW5jdGlvbiBib290KHJ1bnRpbWUsIGRvYyA9IGRvY3VtZW50KSB7CiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURjRG9jdW1lbnQoZG9jKTsKICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IHJvb3ROYW1lID0gcm9vdE5hbWVGb3JEb2N1bWVudChkb2MsIGxvY2F0aW9uKTsKICAgIHJ1bnRpbWUubWFya0ZldGNoZWQocm9vdE5hbWUpOwogICAgcnVudGltZS5zZXRSb290TmFtZShyb290TmFtZSk7CiAgICBydW50aW1lLmFkb3B0UGFyc2VkKHJvb3ROYW1lLCBwYXJzZWQpOwogICAgZmV0Y2gobG9jYXRpb24uaHJlZikudGhlbigocmVzKSA9PiByZXMub2sgPyByZXMudGV4dCgpIDogIiIpLnRoZW4oKHQpID0+IHsKICAgICAgY29uc3QgcmF3ID0gdCA\/IHBhcnNlRGNUZXh0KHQpIDogbnVsbDsKICAgICAgaWYgKHJhdz8udGVtcGxhdGUpIHJ1bnRpbWUudXBkYXRlSHRtbChyb290TmFtZSwgcmF3LnRlbXBsYXRlKTsKICAgIH0pLmNhdGNoKCgpID0+IHsKICAgIH0pOwogICAgY29uc3QgZGMgPSBkb2MucXVlcnlTZWxlY3RvcigieC1kYyIpOwogICAgY29uc3QgaG9zdEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaG9zdEVsLmlkID0gImRjLXJvb3QiOwogICAgZGMucmVwbGFjZVdpdGgoaG9zdEVsKTsKICAgIGlmICghcGFyc2VkLnByZXZpZXcpIHsKICAgICAgY29uc3QgcyA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICBzLnRleHRDb250ZW50ID0gRlVMTF9QQUdFX0NTUzsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBjb25zdCBSb290ID0gcnVudGltZS5nZXREQyhyb290TmFtZSk7CiAgICBjb25zdCBlbnRyeSA9IHJ1bnRpbWUucmVnaXN0cnkuZ2V0KHJvb3ROYW1lKTsKICAgIGZ1bmN0aW9uIFN0YW5kYWxvbmVSb290KCkgewogICAgICBjb25zdCBbLCBzZXRUaWNrXSA9IFJlYWN0LnVzZVN0YXRlKDApOwogICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gewogICAgICAgIGNvbnN0IHN1YiA9ICgpID0+IHNldFRpY2soKG4pID0+IG4gKyAxKTsKICAgICAgICBlbnRyeS5zdWJzLmFkZChzdWIpOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICBlbnRyeS5zdWJzLmRlbGV0ZShzdWIpOwogICAgICAgIH07CiAgICAgIH0sIFtdKTsKICAgICAgY29uc3QgZGVmYXVsdHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHsKICAgICAgICBjb25zdCBkID0ge307CiAgICAgICAgZm9yIChjb25zdCBrIGluIGVudHJ5LnByb3BzTWV0YSB8fCB7fSkgewogICAgICAgICAgY29uc3QgdiA9IGVudHJ5LnByb3BzTWV0YT8uW2tdPy5kZWZhdWx0OwogICAgICAgICAgaWYgKHYgIT09IHZvaWQgMCkgZFtrXSA9IHY7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkOwogICAgICB9LCBbZW50cnkucHJvcHNNZXRhXSk7CiAgICAgIHJldHVybiBoKFJvb3QsIHsgLi4uZGVmYXVsdHMsIC4uLmVudHJ5LnByb3BPdmVycmlkZXMgfHwge30gfSk7CiAgICB9CiAgICBjb25zdCBSZWFjdERPTSA9IGdldFJlYWN0RE9NKCk7CiAgICBpZiAoUmVhY3RET00uY3JlYXRlUm9vdCkKICAgICAgUmVhY3RET00uY3JlYXRlUm9vdChob3N0RWwpLnJlbmRlcihoKFN0YW5kYWxvbmVSb290KSk7CiAgICBlbHNlIFJlYWN0RE9NLnJlbmRlcihoKFN0YW5kYWxvbmVSb290KSwgaG9zdEVsKTsKICAgIHJldHVybiByb290TmFtZTsKICB9CgogIC8vIHNyYy9leHByLnRzCiAgdmFyIElERU5UX1JFID0gL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSovOwogIHZhciBOVU1CRVJfUkUgPSAvXi0\/XGQrKFwuXGQrKT8kLzsKICBmdW5jdGlvbiByZXNvbHZlKHZhbHMsIHNyYykgewogICAgY29uc3QgZXhwciA9IFN0cmluZyhzcmMpLnRyaW0oKTsKICAgIGlmICghZXhwcikgcmV0dXJuIHZvaWQgMDsKICAgIGlmIChleHByWzBdID09PSAiKCIgJiYgZXhwcltleHByLmxlbmd0aCAtIDFdID09PSAiKSIgJiYgcGFyZW5zV3JhcFdob2xlKGV4cHIpKSB7CiAgICAgIHJldHVybiByZXNvbHZlKHZhbHMsIGV4cHIuc2xpY2UoMSwgLTEpKTsKICAgIH0KICAgIGNvbnN0IGVxID0gZmluZFRvcExldmVsRXF1YWxpdHkoZXhwcik7CiAgICBpZiAoZXEpIHsKICAgICAgY29uc3QgbHYgPSByZXNvbHZlKHZhbHMsIGV4cHIuc2xpY2UoMCwgZXEuaW5kZXgpKTsKICAgICAgY29uc3QgcnYgPSByZXNvbHZlKHZhbHMsIGV4cHIuc2xpY2UoZXEuaW5kZXggKyBlcS5vcC5sZW5ndGgpKTsKICAgICAgc3dpdGNoIChlcS5vcCkgewogICAgICAgIGNhc2UgIj09PSI6CiAgICAgICAgICByZXR1cm4gbHYgPT09IHJ2OwogICAgICAgIGNhc2UgIiE9PSI6CiAgICAgICAgICByZXR1cm4gbHYgIT09IHJ2OwogICAgICAgIGNhc2UgIj09IjoKICAgICAgICAgIHJldHVybiBsdiA9PSBydjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGx2ICE9IHJ2OwogICAgICB9CiAgICB9CiAgICBpZiAoZXhwclswXSA9PT0gIiEiKSByZXR1cm4gIXJlc29sdmUodmFscywgZXhwci5zbGljZSgxKSk7CiAgICBpZiAoZXhwciA9PT0gInRydWUiKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChleHByID09PSAiZmFsc2UiKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZXhwciA9PT0gIm51bGwiKSByZXR1cm4gbnVsbDsKICAgIGlmIChleHByID09PSAidW5kZWZpbmVkIikgcmV0dXJuIHZvaWQgMDsKICAgIGlmIChOVU1CRVJfUkUudGVzdChleHByKSkgcmV0dXJuIE51bWJlcihleHByKTsKICAgIGlmIChleHByLmxlbmd0aCA+PSAyICYmIChleHByWzBdID09PSAnIicgfHwgZXhwclswXSA9PT0gIiciKSAmJiBleHByW2V4cHIubGVuZ3RoIC0gMV0gPT09IGV4cHJbMF0pIHsKICAgICAgcmV0dXJuIGV4cHIuc2xpY2UoMSwgLTEpOwogICAgfQogICAgcmV0dXJuIHJlc29sdmVQYXRoKHZhbHMsIGV4cHIpOwogIH0KICBmdW5jdGlvbiBwYXJlbnNXcmFwV2hvbGUoZXhwcikgewogICAgbGV0IGRlcHRoID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgaWYgKGV4cHJbaV0gPT09ICIoIikgZGVwdGgrKzsKICAgICAgZWxzZSBpZiAoZXhwcltpXSA9PT0gIikiKSB7CiAgICAgICAgZGVwdGgtLTsKICAgICAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIGZpbmRUb3BMZXZlbEVxdWFsaXR5KGV4cHIpIHsKICAgIGxldCBkZXB0aCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYyA9IGV4cHJbaV07CiAgICAgIGlmIChjID09PSAiWyIgfHwgYyA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChjID09PSAiXSIgfHwgYyA9PT0gIikiKSBkZXB0aC0tOwogICAgICBlbHNlIGlmIChkZXB0aCA9PT0gMCAmJiAoYyA9PT0gIj0iIHx8IGMgPT09ICIhIikgJiYgZXhwcltpICsgMV0gPT09ICI9IikgewogICAgICAgIGlmIChpID4gMCAmJiAoZXhwcltpIC0gMV0gPT09ICI9IiB8fCBleHByW2kgLSAxXSA9PT0gIiEiKSkgY29udGludWU7CiAgICAgICAgaWYgKCFleHByLnNsaWNlKDAsIGkpLnRyaW0oKSkgY29udGludWU7CiAgICAgICAgY29uc3Qgb3AgPSBleHByW2kgKyAyXSA9PT0gIj0iID8gYyArICI9PSIgOiBjICsgIj0iOwogICAgICAgIHJldHVybiB7IGluZGV4OiBpLCBvcCB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gcmVzb2x2ZVBhdGgodmFscywgZXhwcikgewogICAgY29uc3QgaGVhZCA9IGV4cHIubWF0Y2goSURFTlRfUkUpOwogICAgaWYgKCFoZWFkKSByZXR1cm4gdm9pZCAwOwogICAgbGV0IGN1ciA9IHZhbHMgPT0gbnVsbCA\/IHZvaWQgMCA6IHZhbHNbaGVhZFswXV07CiAgICBsZXQgaSA9IGhlYWRbMF0ubGVuZ3RoOwogICAgd2hpbGUgKGkgPCBleHByLmxlbmd0aCkgewogICAgICBpZiAoZXhwcltpXSA9PT0gIi4iKSB7CiAgICAgICAgY29uc3QgbSA9IGV4cHIuc2xpY2UoaSArIDEpLm1hdGNoKElERU5UX1JFKSB8fCBleHByLnNsaWNlKGkgKyAxKS5tYXRjaCgvXlxkKy8pOwogICAgICAgIGlmICghbSkgcmV0dXJuIHZvaWQgMDsKICAgICAgICBjdXIgPSBjdXIgPT0gbnVsbCA\/IHZvaWQgMCA6IGN1clttWzBdXTsKICAgICAgICBpICs9IDEgKyBtWzBdLmxlbmd0aDsKICAgICAgfSBlbHNlIGlmIChleHByW2ldID09PSAiWyIpIHsKICAgICAgICBsZXQgZGVwdGggPSAxOwogICAgICAgIGxldCBqID0gaSArIDE7CiAgICAgICAgd2hpbGUgKGogPCBleHByLmxlbmd0aCAmJiBkZXB0aCA+IDApIHsKICAgICAgICAgIGlmIChleHByW2pdID09PSAiWyIpIGRlcHRoKys7CiAgICAgICAgICBlbHNlIGlmIChleHByW2pdID09PSAiXSIpIHsKICAgICAgICAgICAgZGVwdGgtLTsKICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGRlcHRoICE9PSAwKSByZXR1cm4gdm9pZCAwOwogICAgICAgIGNvbnN0IGtleSA9IHJlc29sdmUodmFscywgZXhwci5zbGljZShpICsgMSwgaikpOwogICAgICAgIGN1ciA9IGN1ciA9PSBudWxsID8gdm9pZCAwIDogY3VyW2tleV07CiAgICAgICAgaSA9IGogKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjdXI7CiAgfQoKICAvLyBzcmMvZW5jb2RlLnRzCiAgdmFyIENBTUVMX0FUVFIgPSAic2MtY2FtZWwtIjsKICB2YXIgSU5MSU5FX1RFWFRfVEFHUyA9IG5ldyBTZXQoCiAgICAiYSBhYmJyIGIgYmRpIGJkbyBiciBjaXRlIGNvZGUgZGVsIGRmbiBlbSBpIGlucyBrYmQgbWFyayBxIHMgc2FtcCBzbWFsbCBzcGFuIHN0cmlrZSBzdHJvbmcgc3ViIHN1cCB1IHZhciB3YnIiLnNwbGl0KAogICAgICAiICIKICAgICkKICApOwogIHZhciBSQVdfV1JBUCA9IHsKICAgIHNlbGVjdDogInNjLXJhdy1zZWxlY3QiLAogICAgdGFibGU6ICJzYy1yYXctdGFibGUiLAogICAgdGJvZHk6ICJzYy1yYXctdGJvZHkiLAogICAgdGhlYWQ6ICJzYy1yYXctdGhlYWQiLAogICAgdGZvb3Q6ICJzYy1yYXctdGZvb3QiLAogICAgdHI6ICJzYy1yYXctdHIiLAogICAgdGQ6ICJzYy1yYXctdGQiLAogICAgdGg6ICJzYy1yYXctdGgiLAogICAgY2FwdGlvbjogInNjLXJhdy1jYXB0aW9uIgogIH07CiAgdmFyIFJBV19VTldSQVAgPSBPYmplY3QuZnJvbUVudHJpZXMoCiAgICBPYmplY3QuZW50cmllcyhSQVdfV1JBUCkubWFwKChbaywgdl0pID0+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+IGIodmFscywgY3R4LCBqKSk7CiAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgaChDLCBwcm9wcykpIDogaChDLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjb250ZW50S2V5KGVsKSB7CiAgICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSh0cnVlKTsKICAgIGZvciAoY29uc3QgZCBvZiBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCIqIikpIHsKICAgICAgd2hpbGUgKGQuYXR0cmlidXRlcy5sZW5ndGgpIGQucmVtb3ZlQXR0cmlidXRlKGQuYXR0cmlidXRlc1swXS5uYW1lKTsKICAgIH0KICAgIGNvbnN0IHMgPSBjbG9uZS5pbm5lckhUTUw7CiAgICBsZXQgaDIgPSA1MzgxOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBoMiA9IChoMiA8PCA1KSArIGgyICsgcy5jaGFyQ29kZUF0KGkpIHwgMDsKICAgIHJldHVybiBzLmxlbmd0aCArICIuIiArIChoMiA+Pj4gMCkudG9TdHJpbmcoMzYpOwogIH0KICB2YXIgTkVWRVJfQ09OVEVOVF9LRVlFRCA9IG5ldyBTZXQoCiAgICAic2NyaXB0IHN0eWxlIHRleHRhcmVhIG9wdGlvbiB0aXRsZSBzZWxlY3QgY2FudmFzIGlmcmFtZSB2aWRlbyBhdWRpbyIuc3BsaXQoCiAgICAgICIgIgogICAgKQogICk7CiAgdmFyIE5PVF9JTkxJTkVfU0VMRUNUT1IgPSAiOm5vdCgiICsgWy4uLklOTElORV9URVhUX1RBR1NdLmpvaW4oIiwiKSArICIpIjsKICBmdW5jdGlvbiB3YWxrRWxlbWVudChlbCwgaG9zdCkgewogICAgY29uc3QgcmVhbFRhZyA9IFJBV19VTldSQVBbZWwubG9jYWxOYW1lXSB8fCBlbC5sb2NhbE5hbWU7CiAgICBjb25zdCB0cGxJZCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiKTsKICAgIGNvbnN0IGlubGluZU9ubHkgPSBlbC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgIU5FVkVSX0NPTlRFTlRfS0VZRUQuaGFzKHJlYWxUYWcpICYmIGVsLnF1ZXJ5U2VsZWN0b3IoTk9UX0lOTElORV9TRUxFQ1RPUikgPT09IG51bGw7CiAgICBjb25zdCBrZXlTdWZmaXggPSBpbmxpbmVPbmx5ID8gInwiICsgY29udGVudEtleShlbCkgOiAiIjsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRvbSIsIGhvc3QpOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGNvbnN0IHByb3BzID0gewogICAgICAgIGtleToga2V5ICsga2V5U3VmZml4LAogICAgICAgICJkYXRhLWRjLXRwbCI6IHRwbElkCiAgICAgIH07CiAgICAgIGZvciAoY29uc3QgW2ssIGddIG9mIHByb3BHZXR0ZXJzKSB7CiAgICAgICAgbGV0IHYgPSBnKHZhbHMpOwogICAgICAgIGlmIChrID09PSAic3R5bGUiICYmIHR5cGVvZiB2ID09PSAic3RyaW5nIikgdiA9IGNzc1RvT2JqKHYpOwogICAgICAgIGlmICgoayA9PT0gInZhbHVlIiB8fCBrID09PSAiY2hlY2tlZCIpICYmIHYgPT09IHZvaWQgMCkgewogICAgICAgICAgdiA9IGsgPT09ICJjaGVja2VkIiA\/IGZhbHNlIDogIiI7CiAgICAgICAgfQogICAgICAgIHByb3BzW2tdID0gdjsKICAgICAgfQogICAgICBpZiAocHNldWRvQ2xhc3Nlcy5sZW5ndGgpIHsKICAgICAgICBwcm9wcy5jbGFzc05hbWUgPSBbcHJvcHMuY2xhc3NOYW1lLCAuLi5wc2V1ZG9DbGFzc2VzXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpOwogICAgICB9CiAgICAgIHJldHVybiBoKHJlYWxUYWcsIHByb3BzLCAuLi5raWRzLm1hcCgoYiwgaikgPT4gYih2YWxzLCBjdHgsIGopKSk7CiAgICB9OwogIH0KCiAgLy8gc3JjL2xvZ2ljLnRzCiAgdmFyIFN0cmVhbWFibGVMb2dpYyA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7CiAgICAgIF9fcHVibGljRmllbGQodGhpcywgInByb3BzIik7CiAgICAgIF9fcHVibGljRmllbGQodGhpcywgInN0YXRlIiwge30pOwogICAgICAvKiogQmFjay1wb2ludGVyIHRvIHRoZSB3cmFwcGVyIGNvbXBvbmVudCwgaW5zdGFsbGVkIGFmdGVyIGNvbnN0cnVjdGlvbi4gKi8KICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19ob3N0Iik7CiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcyB8fCB7fTsKICAgIH0KICAgIHNldFN0YXRlKHVwZGF0ZSwgY2IpIHsKICAgICAgdGhpcy5fX2hvc3QgJiYgdGhpcy5fX2hvc3QuX19zZXRMb2dpY1N0YXRlKHVwZGF0ZSwgY2IpOwogICAgfQogICAgZm9yY2VVcGRhdGUoKSB7CiAgICAgIHRoaXMuX19ob3N0ICYmIHRoaXMuX19ob3N0LmZvcmNlVXBkYXRlKCk7CiAgICB9CiAgICBjb21wb25lbnREaWRNb3VudCgpIHsKICAgIH0KICAgIGNvbXBvbmVudERpZFVwZGF0ZShfcHJldlByb3BzKSB7CiAgICB9CiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHsKICAgIH0KICAgIC8qKiBUaGUgZmxhdCBvYmplY3QgdGhlIHRlbXBsYXRlIHJlbmRlcnMgYWdhaW5zdCAobWVyZ2VkIG92ZXIgcHJvcHMpLiAqLwogICAgcmVuZGVyVmFscygpIHsKICAgICAgcmV0dXJuIHt9OwogICAgfQogIH07CiAgZnVuY3Rpb24gZXZhbERjTG9naWMoc3JjKSB7CiAgICAvLyEgbm9zZW1ncmVwOiBldmFsLWFuZC1mdW5jdGlvbi1jb25zdHJ1Y3RvcgogICAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oCiAgICAgICJEQ0xvZ2ljIiwKICAgICAgIlN0cmVhbWFibGVMb2dpYyIsCiAgICAgICJSZWFjdCIsCiAgICAgIHNyYyArICdcbjtyZXR1cm4gKHR5cGVvZiBDb21wb25lbnQhPT0idW5kZWZpbmVkIiYmQ29tcG9uZW50KXx8dW5kZWZpbmVkOycKICAgICk7CiAgICByZXR1cm4gZm4oU3RyZWFtYWJsZUxvZ2ljLCBTdHJlYW1hYmxlTG9naWMsIGdldFJlYWN0KCkpOwogIH0KCiAgLy8gc3JjL2NvbXBvbmVudC50cwogIGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChhLCBiKSB7CiAgICBpZiAoIWIpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IGFrID0gT2JqZWN0LmtleXMoYSkuZmlsdGVyKChrKSA9PiBrICE9PSAiY2hpbGRyZW4iKTsKICAgIGNvbnN0IGJrID0gT2JqZWN0LmtleXMoYikuZmlsdGVyKChrKSA9PiBrICE9PSAiY2hpbGRyZW4iKTsKICAgIGlmIChhay5sZW5ndGggIT09IGJrLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChjb25zdCBrIG9mIGFrKSBpZiAoYVtrXSAhPT0gYltrXSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIFBsYWNlaG9sZGVyKHsKICAgIG5hbWUsCiAgICBoaW50U2l6ZSwKICAgIHN0cmVhbWluZywKICAgIGVycm9yCiAgfSkgewogICAgY29uc3QgW3csIGhndF0gPSAoaGludFNpemUgfHwgIjEwMCUsNjBweCIpLnNwbGl0KCIsIik7CiAgICByZXR1cm4gaCgKICAgICAgImRpdiIsCiAgICAgIHsKICAgICAgICBjbGFzc05hbWU6ICJzYy1wbGFjZWhvbGRlciIgKyAoc3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmciIDogIiIpLAogICAgICAgIHN0eWxlOiB7IHdpZHRoOiB3LnRyaW0oKSwgaGVpZ2h0OiBoZ3QgJiYgaGd0LnRyaW0oKSB9LAogICAgICAgIHRpdGxlOiBuYW1lCiAgICAgIH0sCiAgICAgIGVycm9yID8gaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogInNjLXBsYWNlaG9sZGVyLWVycm9yIiB9LAogICAgICAgIChuYW1lID8gbmFtZSArICI6ICIgOiAiIikgKyBlcnJvcgogICAgICApIDogbnVsbAogICAgKTsKICB9CiAgZnVuY3Rpb24gaGludFRvTWluKGhpbnQpIHsKICAgIGlmICghaGludCkgcmV0dXJuIHZvaWQgMDsKICAgIGNvbnN0IFt3LCBoZ3RdID0gaGludC5zcGxpdCgiLCIpOwogICAgcmV0dXJuIHsgbWluV2lkdGg6IHcudHJpbSgpLCBtaW5IZWlnaHQ6IGhndCAmJiBoZ3QudHJpbSgpIH07CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEZhY3RvcnkocmVnaXN0cnksIGVuc3VyZUZldGNoZWQpIHsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IEFuY2VzdG9yQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoW10pOwogICAgY2xhc3MgU3RyZWFtYWJsZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7CiAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7CiAgICAgICAgc3VwZXIocHJvcHMpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fbmFtZSIpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fc3ViIik7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19uZWVkc0RpZE1vdW50IiwgZmFsc2UpOwogICAgICAgIC8qKiBTbmFwc2hvdCBvZiB0aGUgcmVnaXN0cnkncyBzdHJlYW1pbmcgZmxhZ3MgdGFrZW4gYXQgcmVuZGVyIHRpbWUg4oCUCiAgICAgICAgICogIGJ1aWxkZXJzIHJlYWQgaXQgb2ZmIHRoZSBSZW5kZXJDdHggKHRoaXMpIHRvIHBpY2sgcGxhY2Vob2xkZXIgdnMKICAgICAgICAgKiAgcmVuZGVyLW5vdGhpbmcgZm9yIHVucmVzb2x2ZWQgdmFsdWVzLiAqLwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fc3RyZWFtaW5nTm93IiwgZmFsc2UpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9faHRtbFN0cmVhbWluZ05vdyIsIGZhbHNlKTsKICAgICAgICAvKiogV2hlbiBhIGNvbnN0cnVjdCB0aHJvd3MsIHJlbWVtYmVyIHRoZSAoY2xhc3MsIHJlZ2lzdHJ5LnZlciwgcHJvcHMpCiAgICAgICAgICogIHRyaXBsZSBzbyByZW5kZXItdGltZSByZWNvbmNpbGUgZG9lc24ndCByZS1hdHRlbXB0IGl0IG9uIGV2ZXJ5IHBhcmVudAogICAgICAgICAqICByZS1yZW5kZXIuIEEgcmVnaXN0cnkgYnVtcCAobmV3IGNsYXNzLCB0ZW1wbGF0ZSwgZXh0ZXJuYWwgbW9kdWxlCiAgICAgICAgICogIHJlc29sdmluZyB2aWEgYnVtcEFsbCkgY2hhbmdlcyBgdmVyYCBhbmQgYnJlYWtzIHRoZSBtZW1vIHNvIGFuCiAgICAgICAgICogIGVudi1kZXBlbmRlbnQgY29uc3RydWN0b3IgY2FuIHNlbGYtaGVhbC4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2ZhaWxlZExvZ2ljIiwgbnVsbCk7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRVc2VyUHJvcHMiLCBudWxsKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2ZhaWxlZFZlciIsIC0xKTsKICAgICAgICAvKiogUGVyLWluc3RhbmNlIGNvbnN0cnVjdG9yIGVycm9yIOKAlCBrZXB0IGhlcmUgKG5vdCBvbiB0aGUgcmVnaXN0cnkgZW50cnkpCiAgICAgICAgICogIHNvIG9uZSBpbnN0YW5jZSdzIHN1Y2Nlc3NmdWwgY29uc3RydWN0IGNhbid0IGhpZGUgYSBzaWJsaW5nJ3MgZmFpbHVyZSwKICAgICAgICAgKiAgYW5kIGEgY29uc3RydWN0IGNhbiBuZXZlciB3aXBlIGFuIGV2YWwgZXJyb3IgYHVwZGF0ZUpzYCByZWNvcmRlZCBvbgogICAgICAgICAqICBgci5sb2dpY0Vycm9yYC4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2N0b3JFcnJvciIsIG51bGwpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgImxvZ2ljIik7CiAgICAgICAgdGhpcy5fX25hbWUgPSBwcm9wcy5fX25hbWU7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgX192OiAwLCBfX2VycjogbnVsbCB9OwogICAgICAgIHRoaXMuX19zdWIgPSAoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5fX2VycikgdGhpcy5zZXRTdGF0ZSh7IF9fZXJyOiBudWxsIH0pOwogICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5fX21ha2VMb2dpYyhyZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLkxvZ2ljLCBudWxsKTsKICAgICAgICBlbnN1cmVGZXRjaGVkKHRoaXMuX19uYW1lKTsKICAgICAgfQogICAgICAvKiogRXJyb3ItYm91bmRhcnkgaG9vazogYSByZW5kZXIgY3Jhc2ggYW55d2hlcmUgaW4gdGhpcyBEQydzIHN1YnRyZWUKICAgICAgICogIChpdHMgb3duIHRlbXBsYXRlLCBhbiB4LWltcG9ydCdkIGNvbXBvbmVudCwgYSBjaGlsZCBEQyB3aXRob3V0IGl0cwogICAgICAgKiAgb3duIGRlZXBlciBib3VuZGFyeSkgbGFuZHMgaGVyZSBpbnN0ZWFkIG9mIHVubW91bnRpbmcgdGhlIHBhZ2UuICovCiAgICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZSkgewogICAgICAgIHJldHVybiB7IF9fZXJyOiBlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpIH07CiAgICAgIH0KICAgICAgY29tcG9uZW50RGlkQ2F0Y2goZSwgaW5mbykgewogICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHJlbmRlciBlcnJvciBpbiA8IiArIHRoaXMuX19uYW1lICsgIj46IiwKICAgICAgICAgIGUsCiAgICAgICAgICBpbmZvPy5jb21wb25lbnRTdGFjayB8fCAiIgogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqIEluc3RhbnRpYXRlIHRoZSBsb2dpYyBjbGFzcyAob3IgdGhlIG5vLW9wIGJhc2UpIGFuZCBhZG9wdCBgcHJldlN0YXRlYAogICAgICAgKiAgb3ZlciBpdHMgaW5pdGlhbCBzdGF0ZSDigJQgdXNlZCBib3RoIGF0IG1vdW50IGFuZCBvbiBob3Qtc3dhcC4gKi8KICAgICAgX19tYWtlTG9naWMoTG9naWMsIHByZXZTdGF0ZSkgewogICAgICAgIGNvbnN0IEwgPSBMb2dpYyB8fCBTdHJlYW1hYmxlTG9naWM7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMubG9naWMgPSBuZXcgTCh0aGlzLl9fdXNlclByb3BzKCkpOwogICAgICAgICAgdGhpcy5fX2ZhaWxlZExvZ2ljID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMgPSBudWxsOwogICAgICAgICAgdGhpcy5fX2N0b3JFcnJvciA9IG51bGw7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRMb2dpYyA9IExvZ2ljOwogICAgICAgICAgdGhpcy5fX2ZhaWxlZFVzZXJQcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRWZXIgPSByZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnZlcjsKICAgICAgICAgIHRoaXMuX19jdG9yRXJyb3IgPSB0aGlzLl9fbmFtZSArICI6ICIgKyAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA\/IGUubWVzc2FnZSA6IFN0cmluZyhlKSk7CiAgICAgICAgICB0aGlzLmxvZ2ljID0gbmV3IFN0cmVhbWFibGVMb2dpYygKICAgICAgICAgICAgdGhpcy5fX3VzZXJQcm9wcygpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvZ2ljLl9faG9zdCA9IHRoaXM7CiAgICAgICAgaWYgKHByZXZTdGF0ZSkKICAgICAgICAgIHRoaXMubG9naWMuc3RhdGUgPSB7IC4uLnRoaXMubG9naWMuc3RhdGUgfHwge30sIC4uLnByZXZTdGF0ZSB9OwogICAgICB9CiAgICAgIC8qKiBUaGUgcHJvcHMgdGhlIGF1dGhvcidzIGxvZ2ljICsgdGVtcGxhdGUgc2VlIOKAlCBpbnRlcm5hbCBfXy1wcmVmaXhlZAogICAgICAgKiAgd2lyaW5nIHN0cmlwcGVkLiAqLwogICAgICBfX3VzZXJQcm9wcygpIHsKICAgICAgICBjb25zdCB7IF9fbmFtZSwgX19oaW50U2l6ZSwgX190cGxJZCwgX19ob3N0U3R5bGUsIC4uLnJlc3QgfSA9IHRoaXMucHJvcHM7CiAgICAgICAgcmV0dXJuIHJlc3Q7CiAgICAgIH0KICAgICAgX19zZXRMb2dpY1N0YXRlKHVwZGF0ZSwgY2IpIHsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5sb2dpYy5zdGF0ZTsKICAgICAgICBjb25zdCBwYXRjaCA9IHR5cGVvZiB1cGRhdGUgPT09ICJmdW5jdGlvbiIgPyB1cGRhdGUocHJldikgOiB1cGRhdGU7CiAgICAgICAgdGhpcy5sb2dpYy5zdGF0ZSA9IHsgLi4ucHJldiwgLi4ucGF0Y2ggfTsKICAgICAgICB0aGlzLnNldFN0YXRlKChzKSA9PiAoeyBfX3Y6IHMuX192ICsgMSB9KSwgY2IpOwogICAgICB9CiAgICAgIC8qKiBTd2FwIHRoZSBsb2dpYyBpbnN0YW5jZSB3aGVuIHRoZSByZWdpc3RyeSdzIExvZ2ljIGNsYXNzIGNoYW5nZWQKICAgICAgICogIChzdHJlYW1pbmcgY29tcGxldGlvbiwgaG90IHJlbG9hZCkuIFN0YXRlIGNhcnJpZXMgb3ZlcjsgZGlkTW91bnQKICAgICAgICogIHJlLWZpcmVzIGFmdGVyIHRoZSBzd2FwIGNvbW1pdHMgc28gcmVmcyBleGlzdC4gKi8KICAgICAgX19yZWNvbmNpbGVMb2dpYygpIHsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKTsKICAgICAgICBjb25zdCBOZXh0ID0gci5Mb2dpYzsKICAgICAgICBjb25zdCBDdXIgPSB0aGlzLmxvZ2ljLmNvbnN0cnVjdG9yOwogICAgICAgIGlmIChOZXh0ID09PSBDdXIgfHwgIU5leHQgJiYgQ3VyID09PSBTdHJlYW1hYmxlTG9naWMgfHwgTmV4dCA9PT0gdGhpcy5fX2ZhaWxlZExvZ2ljICYmIHIudmVyID09PSB0aGlzLl9fZmFpbGVkVmVyICYmIHNoYWxsb3dFcXVhbCh0aGlzLl9fdXNlclByb3BzKCksIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fX21ha2VMb2dpYyhOZXh0LCB0aGlzLmxvZ2ljLnN0YXRlKTsKICAgICAgICB0aGlzLl9fbmVlZHNEaWRNb3VudCA9IHRydWU7CiAgICAgIH0KICAgICAgY29tcG9uZW50RGlkTW91bnQoKSB7CiAgICAgICAgcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5zdWJzLmFkZCh0aGlzLl9fc3ViKTsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHsKICAgICAgICB0aGlzLmxvZ2ljLnByb3BzID0gdGhpcy5fX3VzZXJQcm9wcygpOwogICAgICAgIGlmICh0aGlzLl9fbmVlZHNEaWRNb3VudCkgewogICAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIgfHwgIXJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSkudHBsKSByZXR1cm47CiAgICAgICAgICB0aGlzLl9fbmVlZHNEaWRNb3VudCA9IGZhbHNlOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHsKICAgICAgICByZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnN1YnMuZGVsZXRlKHRoaXMuX19zdWIpOwogICAgICAgIGlmICghdGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmVuZGVyKCkgewogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpOwogICAgICAgIGNvbnN0IGNscyA9ICJzYy1ob3N0IiArIChyLmh0bWxTdHJlYW1pbmcgPyAiIHNjLXN0cmVhbWluZy1odG1sIiA6ICIiKSArIChyLmpzU3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmctanMiIDogIiIpOwogICAgICAgIGNvbnN0IGhpbnRTdHlsZSA9IHIuaHRtbFN0cmVhbWluZyA\/IGhpbnRUb01pbih0aGlzLnByb3BzLl9faGludFNpemUpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IGhvc3RTdHlsZSA9IHRoaXMucHJvcHMuX19ob3N0U3R5bGUgfHwgaGludFN0eWxlID8geyAuLi5oaW50U3R5bGUgfHwge30sIC4uLnRoaXMucHJvcHMuX19ob3N0U3R5bGUgfHwge30gfSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBob3N0QmFzZSA9IHsKICAgICAgICAgIGNsYXNzTmFtZTogY2xzLAogICAgICAgICAgc3R5bGU6IGhvc3RTdHlsZSwKICAgICAgICAgICJkYXRhLXNjLW5hbWUiOiB0aGlzLl9fbmFtZSwKICAgICAgICAgICJkYXRhLWRjLXRwbCI6IHRoaXMucHJvcHMuX190cGxJZAogICAgICAgIH07CiAgICAgICAgY29uc3QgY2hhaW4gPSBBcnJheS5pc0FycmF5KHRoaXMuY29udGV4dCkgPyB0aGlzLmNvbnRleHQgOiBbXTsKICAgICAgICBpZiAoY2hhaW4uaW5jbHVkZXModGhpcy5fX25hbWUpKSB7CiAgICAgICAgICBjb25zdCBjeWNsZSA9IFsKICAgICAgICAgICAgLi4uY2hhaW4uc2xpY2UoY2hhaW4uaW5kZXhPZih0aGlzLl9fbmFtZSkpLAogICAgICAgICAgICB0aGlzLl9fbmFtZQogICAgICAgICAgXS5qb2luKCIgXHUyMTkyICIpOwogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArICIgc2MtaGFzLWVycm9yIiB9LAogICAgICAgICAgICBoKFBsYWNlaG9sZGVyLCB7CiAgICAgICAgICAgICAgbmFtZTogdGhpcy5fX25hbWUsCiAgICAgICAgICAgICAgaGludFNpemU6IHRoaXMucHJvcHMuX19oaW50U2l6ZSwKICAgICAgICAgICAgICBlcnJvcjogImNpcmN1bGFyIGltcG9ydDogIiArIGN5Y2xlCiAgICAgICAgICAgIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zdGF0ZS5fX2VycikgewogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArICIgc2MtaGFzLWVycm9yIiB9LAogICAgICAgICAgICBoKAogICAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAic2MtbG9naWMtZXJyb3IiLCAiZGF0YS1vbWVsZXR0ZS1jaHJvbWUiOiAiIiB9LAogICAgICAgICAgICAgIHRoaXMuX19uYW1lICsgIjogIiArIHRoaXMuc3RhdGUuX19lcnIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaChQbGFjZWhvbGRlciwgewogICAgICAgICAgICAgIG5hbWU6IHRoaXMuX19uYW1lLAogICAgICAgICAgICAgIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUsCiAgICAgICAgICAgICAgZXJyb3I6IHRoaXMuc3RhdGUuX19lcnIKICAgICAgICAgICAgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19yZWNvbmNpbGVMb2dpYygpOwogICAgICAgIGlmICghci50cGwpIHsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgaG9zdEJhc2UsCiAgICAgICAgICAgIGgoUGxhY2Vob2xkZXIsIHsgbmFtZTogdGhpcy5fX25hbWUsIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVzZXJQcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICB0aGlzLmxvZ2ljLnByb3BzID0gdXNlclByb3BzOwogICAgICAgIGxldCB2YWxzID0gdXNlclByb3BzOwogICAgICAgIGxldCByZW5kZXJFcnIgPSByLmxvZ2ljRXJyb3IgfHwgdGhpcy5fX2N0b3JFcnJvcjsKICAgICAgICB0cnkgewogICAgICAgICAgdmFscyA9IHsgLi4udXNlclByb3BzLCAuLi50aGlzLmxvZ2ljLnJlbmRlclZhbHMoKSB8fCB7fSB9OwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICByZW5kZXJFcnIgPSB0aGlzLl9fbmFtZSArICIucmVuZGVyVmFscygpOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9fc3RyZWFtaW5nTm93ID0gISEoci5odG1sU3RyZWFtaW5nIHx8IHIuanNTdHJlYW1pbmcpOwogICAgICAgIHRoaXMuX19odG1sU3RyZWFtaW5nTm93ID0gISFyLmh0bWxTdHJlYW1pbmc7CiAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsgLi4uaG9zdEJhc2UsIGNsYXNzTmFtZTogY2xzICsgKHJlbmRlckVyciA\/ICIgc2MtaGFzLWVycm9yIiA6ICIiKSB9LAogICAgICAgICAgcmVuZGVyRXJyICYmIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IGNsYXNzTmFtZTogInNjLWxvZ2ljLWVycm9yIiwgImRhdGEtb21lbGV0dGUtY2hyb21lIjogIiIgfSwKICAgICAgICAgICAgcmVuZGVyRXJyCiAgICAgICAgICApLAogICAgICAgICAgaCgKICAgICAgICAgICAgQW5jZXN0b3JDb250ZXh0LlByb3ZpZGVyLAogICAgICAgICAgICB7IHZhbHVlOiBbLi4uY2hhaW4sIHRoaXMuX19uYW1lXSB9LAogICAgICAgICAgICByLnRwbCh2YWxzLCB0aGlzKQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIF9fcHVibGljRmllbGQoU3RyZWFtYWJsZUNvbXBvbmVudCwgImNvbnRleHRUeXBlIiwgQW5jZXN0b3JDb250ZXh0KTsKICAgIGNvbnN0IG5hbWVkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGZ1bmN0aW9uIGdldERDKG5hbWUpIHsKICAgICAgY29uc3QgaGl0ID0gbmFtZWQuZ2V0KG5hbWUpOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgICBmdW5jdGlvbiBEaXNwYXRjaGVyKHApIHsKICAgICAgICBjb25zdCBbLCBzZXRUaWNrXSA9IFJlYWN0LnVzZVN0YXRlKDApOwogICAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBzdWIgPSAoKSA9PiBzZXRUaWNrKChuKSA9PiBuICsgMSk7CiAgICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuc3Vicy5hZGQoc3ViKTsKICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgIHJlZ2lzdHJ5LmdldChuYW1lKS5zdWJzLmRlbGV0ZShzdWIpOwogICAgICAgICAgfTsKICAgICAgICB9LCBbXSk7CiAgICAgICAgZW5zdXJlRmV0Y2hlZChuYW1lKTsKICAgICAgICByZXR1cm4gaChTdHJlYW1hYmxlQ29tcG9uZW50LCB7IC4uLnAsIF9fbmFtZTogbmFtZSB9KTsKICAgICAgfQogICAgICBEaXNwYXRjaGVyLmRpc3BsYXlOYW1lID0gbmFtZTsKICAgICAgbmFtZWQuc2V0KG5hbWUsIERpc3BhdGNoZXIpOwogICAgICByZXR1cm4gRGlzcGF0Y2hlcjsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGdldERDLAogICAgICBTdHJlYW1hYmxlQ29tcG9uZW50CiAgICB9OwogIH0KCiAgLy8gc3JjL2V4dGVybmFsLnRzCiAgdmFyIGlzQ3VzdG9tRWxlbWVudE5hbWUgPSAobikgPT4gIW4uaW5jbHVkZXMoIi4iKSAmJiBuLmluY2x1ZGVzKCItIik7CiAgZnVuY3Rpb24gaXNSZW5kZXJhYmxlVHlwZShnKSB7CiAgICBpZiAodHlwZW9mIGcgPT09ICJmdW5jdGlvbiIpIHJldHVybiAhaXNFbGVtZW50Q2xhc3MoZyk7CiAgICByZXR1cm4gdHlwZW9mIGcgPT09ICJvYmplY3QiICYmIGcgIT09IG51bGwgJiYgdHlwZW9mIGcuJCR0eXBlb2YgPT09ICJzeW1ib2wiOwogIH0KICBmdW5jdGlvbiByZXNvbHZlRG90dGVkUGF0aChyb290LCBuYW1lKSB7CiAgICBsZXQgY3VyID0gcm9vdDsKICAgIGZvciAoY29uc3Qgc2VnIG9mIG5hbWUuc3BsaXQoIi4iKSkgewogICAgICBpZiAoY3VyID09IG51bGwpIHJldHVybiB2b2lkIDA7CiAgICAgIGN1ciA9IGN1cltzZWddOwogICAgfQogICAgcmV0dXJuIGN1cjsKICB9CiAgdmFyIEJBQkVMX1VSTCA9ICJodHRwczovL3VucGtnLmNvbS9AYmFiZWwvc3RhbmRhbG9uZUA3LjI5LjAvYmFiZWwubWluLmpzIjsKICB2YXIgQkFCRUxfU1JJID0gInNoYTM4NC1tMDhLaWRpTnFMZHBKcUxxOTVHL0xFaThRdmpsL3hVWWxsM1FJTHlwTW9RNjVRb3JKOUx2dHAyUlhZR0JGajF5IjsKICB2YXIgR0xPQkFMX1BPTExfSU5URVJWQUxfTVMgPSA1MDsKICB2YXIgR0xPQkFMX1BPTExfVElNRU9VVF9NUyA9IDNlNDsKICBmdW5jdGlvbiBjcmVhdGVFeHRlcm5hbE1vZHVsZXMob25SZXNvbHZlZCkgewogICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgbGV0IGJhYmVsTG9hZGluZyA9IG51bGw7CiAgICBjb25zdCByZXBvcnRlZE1pc3NpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgY29uc3QgcG9sbGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBmdW5jdGlvbiBlbnN1cmVCYWJlbCgpIHsKICAgICAgaWYgKHdpbmRvdy5CYWJlbCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgICBpZiAoYmFiZWxMb2FkaW5nKSByZXR1cm4gYmFiZWxMb2FkaW5nOwogICAgICBiYWJlbExvYWRpbmcgPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHsKICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgcy5zcmMgPSBCQUJFTF9VUkw7CiAgICAgICAgcy5pbnRlZ3JpdHkgPSBCQUJFTF9TUkk7CiAgICAgICAgcy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIHMub25sb2FkID0gKCkgPT4gcmVzKCk7CiAgICAgICAgcy5vbmVycm9yID0gcmVqOwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICAgIH0pOwogICAgICByZXR1cm4gYmFiZWxMb2FkaW5nOwogICAgfQogICAgY29uc3QgcGVuZGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmdW5jdGlvbiBsb2FkKGtpbmQsIHVybCwgYWZ0ZXIpIHsKICAgICAgY29uc3QgZXhpc3RpbmcgPSBwZW5kaW5nLmdldCh1cmwpOwogICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZzsKICAgICAgY2FjaGUuc2V0KHVybCwgbnVsbCk7CiAgICAgIGNvbnNvbGUuaW5mbygiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBsb2FkaW5nIiwgdXJsLCAiKCIgKyBraW5kICsgIikiKTsKICAgICAgY29uc3QgcmVhZHkgPSBQcm9taXNlLmFsbChbCiAgICAgICAga2luZCA9PT0gImpzeCIgPyBlbnN1cmVCYWJlbCgpIDogUHJvbWlzZS5yZXNvbHZlKCksCiAgICAgICAgYWZ0ZXIgPz8gUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgXSk7CiAgICAgIGNvbnN0IHAgPSByZWFkeS50aGVuKCgpID0+IGZldGNoKHVybCkpLnRoZW4oKHIpID0+IHsKICAgICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcigiSFRUUCAiICsgci5zdGF0dXMpOwogICAgICAgIHJldHVybiByLnRleHQoKTsKICAgICAgfSkudGhlbigoc3JjKSA9PiB7CiAgICAgICAgY29uc3QgY29kZSA9IGtpbmQgPT09ICJqc3giID8gd2luZG93LkJhYmVsLnRyYW5zZm9ybShzcmMsIHsKICAgICAgICAgIGZpbGVuYW1lOiB1cmwsCiAgICAgICAgICBwcmVzZXRzOiBbInJlYWN0IiwgInR5cGVzY3JpcHQiXQogICAgICAgIH0pLmNvZGUgOiBzcmM7CiAgICAgICAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogICAgICAgIGNvbnN0IGJlZm9yZSA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7CiAgICAgICAgLy8hIG5vc2VtZ3JlcDogZXZhbC1hbmQtZnVuY3Rpb24tY29uc3RydWN0b3IKICAgICAgICBuZXcgRnVuY3Rpb24oIlJlYWN0IiwgIm1vZHVsZSIsICJleHBvcnRzIiwgInJlcXVpcmUiLCBjb2RlKSgKICAgICAgICAgIGdldFJlYWN0KCksCiAgICAgICAgICBtb2R1bGUsCiAgICAgICAgICBtb2R1bGUuZXhwb3J0cywKICAgICAgICAgICgpID0+ICh7fSkKICAgICAgICApOwogICAgICAgIGNvbnN0IGdsb2JhbHMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMod2luZG93KSkgewogICAgICAgICAgaWYgKCFiZWZvcmUuaGFzKGspICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgZ2xvYmFsc1trXSA9IHdpbmRvd1trXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FjaGUuc2V0KHVybCwgeyBtb2Q6IG1vZHVsZS5leHBvcnRzLCBnbG9iYWxzIH0pOwogICAgICAgIGNvbnNvbGUuaW5mbygKICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IGxvYWRlZCIsCiAgICAgICAgICB1cmwsCiAgICAgICAgICAiXHUyMDE0IGV4cG9ydHM6IiwKICAgICAgICAgIE9iamVjdC5rZXlzKG1vZHVsZS5leHBvcnRzKSwKICAgICAgICAgICJ3aW5kb3cgZ2xvYmFsczoiLAogICAgICAgICAgT2JqZWN0LmtleXMoZ2xvYmFscykKICAgICAgICApOwogICAgICAgIG9uUmVzb2x2ZWQoKTsKICAgICAgfSkuY2F0Y2goKGUpID0+IHsKICAgICAgICBjYWNoZS5zZXQodXJsLCB7CiAgICAgICAgICBtb2Q6IHt9LAogICAgICAgICAgZ2xvYmFsczoge30sCiAgICAgICAgICBlcnJvcjogImZhaWxlZCB0byBsb2FkOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpCiAgICAgICAgfSk7CiAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IEZBSUxFRCB0byBsb2FkIiwKICAgICAgICAgIHVybCwKICAgICAgICAgICIoIiArIGtpbmQgKyAiKSIsCiAgICAgICAgICBlCiAgICAgICAgKTsKICAgICAgICBvblJlc29sdmVkKCk7CiAgICAgIH0pOwogICAgICBwZW5kaW5nLnNldCh1cmwsIHApOwogICAgICByZXR1cm4gcDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmUyKHVybCwgbmFtZSkgewogICAgICBjb25zdCBlbnRyeSA9IGNhY2hlLmdldCh1cmwpOwogICAgICBpZiAoIWVudHJ5KSByZXR1cm4gbnVsbDsKICAgICAgY29uc3QgeyBtb2QsIGdsb2JhbHMgfSA9IGVudHJ5OwogICAgICBjb25zdCBDID0gbW9kICYmIG1vZFtuYW1lXSB8fCBnbG9iYWxzICYmIGdsb2JhbHNbbmFtZV0gfHwgdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgJiYgd2luZG93W25hbWVdIHx8IG1vZCAmJiBtb2QuZGVmYXVsdDsKICAgICAgaWYgKHR5cGVvZiBDID09PSAiZnVuY3Rpb24iKSByZXR1cm4gQzsKICAgICAgY29uc3Qga2V5ID0gdXJsICsgIlwwIiArIG5hbWU7CiAgICAgIGlmICghcmVwb3J0ZWRNaXNzaW5nLmhhcyhrZXkpKSB7CiAgICAgICAgcmVwb3J0ZWRNaXNzaW5nLnNldCgKICAgICAgICAgIGtleSwKICAgICAgICAgIGVudHJ5LmVycm9yIHx8ICdubyBleHBvcnQgbmFtZWQgIicgKyBuYW1lICsgJyIgKGhhczogJyArIE9iamVjdC5rZXlzKG1vZCkuam9pbigiLCAiKSArICIpIgogICAgICAgICk7CiAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IG1vZHVsZSIsCiAgICAgICAgICB1cmwsCiAgICAgICAgICAibG9hZGVkIGJ1dCBoYXMgbm8gY29tcG9uZW50IG5hbWVkIiwKICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLAogICAgICAgICAgIlx1MjAxNCBhdmFpbGFibGUgZXhwb3J0czoiLAogICAgICAgICAgT2JqZWN0LmtleXMobW9kKSwKICAgICAgICAgICJ3aW5kb3cgZ2xvYmFsczoiLAogICAgICAgICAgT2JqZWN0LmtleXMoZ2xvYmFscyksCiAgICAgICAgICAiLiBUaGUgbW9kdWxlIG11c3QgYG1vZHVsZS5leHBvcnRzID0geyIgKyBuYW1lICsgIn1gIG9yIHNldCBgd2luZG93LiIgKyBuYW1lICsgImAuIgogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiB3YWl0Rm9yR2xvYmFsKG5hbWUpIHsKICAgICAgaWYgKHBvbGxpbmcuaGFzKG5hbWUpKSByZXR1cm47CiAgICAgIHBvbGxpbmcuYWRkKG5hbWUpOwogICAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTsKICAgICAgY29uc3QgaXNDRSA9IGlzQ3VzdG9tRWxlbWVudE5hbWUobmFtZSk7CiAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7CiAgICAgICAgY29uc3QgZm91bmQgPSBpc0NFID8gY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpIDogaXNSZW5kZXJhYmxlVHlwZShyZXNvbHZlRG90dGVkUGF0aCh3aW5kb3csIG5hbWUpKTsKICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgIHBvbGxpbmcuZGVsZXRlKG5hbWUpOwogICAgICAgICAgb25SZXNvbHZlZCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPj0gR0xPQkFMX1BPTExfVElNRU9VVF9NUykgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBnbG9iYWwiLAogICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSwKICAgICAgICAgICAgIm5ldmVyIGFwcGVhcmVkIG9uIHdpbmRvdyBhZnRlciAiICsgR0xPQkFMX1BPTExfVElNRU9VVF9NUyArICJtcyIKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQodGljaywgR0xPQkFMX1BPTExfSU5URVJWQUxfTVMpOwogICAgICB9OwogICAgICBzZXRUaW1lb3V0KHRpY2ssIEdMT0JBTF9QT0xMX0lOVEVSVkFMX01TKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmVHbG9iYWwodXJsLCBuYW1lKSB7CiAgICAgIGNvbnN0IGlzQ0UgPSBpc0N1c3RvbUVsZW1lbnROYW1lKG5hbWUpOwogICAgICBpZiAoIXVybCkgewogICAgICAgIGlmIChpc0NFKSB7CiAgICAgICAgICBpZiAoY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpKSByZXR1cm4gbmFtZTsKICAgICAgICAgIHdhaXRGb3JHbG9iYWwobmFtZSk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgZzIgPSByZXNvbHZlRG90dGVkUGF0aCh3aW5kb3csIG5hbWUpOwogICAgICAgIGlmIChpc1JlbmRlcmFibGVUeXBlKGcyKSkgcmV0dXJuIGcyOwogICAgICAgIHdhaXRGb3JHbG9iYWwobmFtZSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZW50cnkgPSBjYWNoZS5nZXQodXJsKTsKICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7CiAgICAgIGlmIChpc0NFICYmIGN1c3RvbUVsZW1lbnRzLmdldChuYW1lKSkgcmV0dXJuIG5hbWU7CiAgICAgIGNvbnN0IGcgPSBlbnRyeS5nbG9iYWxzW25hbWVdID8\/IHJlc29sdmVEb3R0ZWRQYXRoKHdpbmRvdywgbmFtZSk7CiAgICAgIGlmIChpc1JlbmRlcmFibGVUeXBlKGcpKSByZXR1cm4gZzsKICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoIi4iKSkgcmV0dXJuIG51bGw7CiAgICAgIGNvbnN0IGtleSA9IHVybCArICJcMGdsb2JhbFwwIiArIG5hbWU7CiAgICAgIGlmICghcmVwb3J0ZWRNaXNzaW5nLmhhcyhrZXkpKSB7CiAgICAgICAgcmVwb3J0ZWRNaXNzaW5nLnNldChrZXksIG51bGwpOwogICAgICAgIGlmIChpc0NFICYmICFjdXN0b21FbGVtZW50cy5nZXQobmFtZSkpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigKICAgICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDoiLAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICJsb2FkZWQgYnV0IG5vIGN1c3RvbSBlbGVtZW50IiwKICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksCiAgICAgICAgICAgICJpcyByZWdpc3RlcmVkIGFuZCB3aW5kb3cuIiArIG5hbWUgKyAiIGlzIG5vdCBhIGZ1bmN0aW9uIFx1MjAxNCByZW5kZXJpbmcgPCIgKyBuYW1lICsgIj4gYXMgYW4gdW5rbm93biBlbGVtZW50LiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuYW1lOwogICAgfQogICAgZnVuY3Rpb24gZ2V0RXJyb3IodXJsLCBuYW1lKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgIGlmIChlbnRyeT8uZXJyb3IpIHJldHVybiBlbnRyeS5lcnJvcjsKICAgICAgcmV0dXJuIHJlcG9ydGVkTWlzc2luZy5nZXQodXJsICsgIlwwIiArIG5hbWUpIHx8IG51bGw7CiAgICB9CiAgICByZXR1cm4geyBsb2FkLCByZXNvbHZlOiByZXNvbHZlMiwgcmVzb2x2ZUdsb2JhbCwgZ2V0RXJyb3IgfTsKICB9CiAgZnVuY3Rpb24gaXNFbGVtZW50Q2xhc3MoZykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHR5cGVvZiBnID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZy5wcm90b3R5cGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDsKICAgIH0gY2F0Y2ggewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBzcmMvYXRvbWljcy50cwogIHZhciBBVE9NSUNfQ1NTID0gKAogICAgLy8gbGF5b3V0CiAgICAiLmZ4e2Rpc3BsYXk6ZmxleH0uY29se2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmdyaWR7ZGlzcGxheTpncmlkfS5hY3thbGlnbi1pdGVtczpjZW50ZXJ9Lmpje2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lmpie2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufS5mMXtmbGV4OjF9Lm5vc2hyaW5re2ZsZXgtc2hyaW5rOjB9LndyYXB7ZmxleC13cmFwOndyYXB9LmZ3NXtmb250LXdlaWdodDo1MDB9LmZ3Nntmb250LXdlaWdodDo2MDB9LmZ3N3tmb250LXdlaWdodDo3MDB9LmZ3OHtmb250LXdlaWdodDo4MDB9LmZzMTF7Zm9udC1zaXplOjExcHh9LmZzMTJ7Zm9udC1zaXplOjEycHh9LmZzMTN7Zm9udC1zaXplOjEzcHh9LmZzMTR7Zm9udC1zaXplOjE0cHh9LmZzMTV7Zm9udC1zaXplOjE1cHh9LmZzMTZ7Zm9udC1zaXplOjE2cHh9LmZzMjB7Zm9udC1zaXplOjIwcHh9LmZzMjJ7Zm9udC1zaXplOjIycHh9LnVwcGVye3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0udGN7dGV4dC1hbGlnbjpjZW50ZXJ9Lm5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LmdhcDh7Z2FwOjhweH0uZ2FwMTB7Z2FwOjEwcHh9LmdhcDEye2dhcDoxMnB4fS5nYXAxNntnYXA6MTZweH0uZ2FwMjR7Z2FwOjI0cHh9Lm0we21hcmdpbjowfS5tdDh7bWFyZ2luLXRvcDo4cHh9Lm10MTJ7bWFyZ2luLXRvcDoxMnB4fS5tdDE2e21hcmdpbi10b3A6MTZweH0ubWI4e21hcmdpbi1ib3R0b206OHB4fS5tYjEye21hcmdpbi1ib3R0b206MTJweH0ubWIxNnttYXJnaW4tYm90dG9tOjE2cHh9LnBvc3JlbHtwb3NpdGlvbjpyZWxhdGl2ZX0ucG9zYWJze3Bvc2l0aW9uOmFic29sdXRlfS5yb3VuZHtib3JkZXItcmFkaXVzOjUwJX0ub2hpZGV7b3ZlcmZsb3c6aGlkZGVufS5iYm94e2JveC1zaXppbmc6Ym9yZGVyLWJveH0ucG9pbnRlcntjdXJzb3I6cG9pbnRlcn0udzEwMHt3aWR0aDoxMDAlfS5iMHtib3JkZXI6bm9uZX0iCiAgKTsKCiAgLy8gc3JjL2hlbG1ldC50cwogIHZhciBERVNJR05fRE9DX01PREVfUkUgPSAvPG1ldGFcYltePl0qXGJuYW1lXHMqPVxzKlsiJ11kZXNpZ25fZG9jX21vZGVbIiddW14+XSpcYig\/OmNvbnRlbnR8dmFsdWUpXHMqPVxzKlsiJ10oXHcrKVsiJ10vaTsKICB2YXIgQ0FOVkFTX0JHX0xJR0hUID0gIiNmMGVlZTYiOwogIHZhciBDQU5WQVNfQkdfREFSSyA9ICIjMmUyYzI2IjsKICBmdW5jdGlvbiBjcmVhdGVIZWxtZXRNYW5hZ2VyKGRvYywgaXNTdHJlYW1pbmcpIHsKICAgIGNvbnN0IG1vdW50ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgY29uc3QgbGl2ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBsZXQgZGVzaWduRG9jTW9kZSA9IG51bGw7CiAgICBsZXQgY2FudmFzU3R5bGVFbCA9IG51bGw7CiAgICBsZXQgYXBwVGhlbWUgPSAibGlnaHQiOwogICAgdHJ5IHsKICAgICAgY29uc3QgZHMgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQudGhlbWU7CiAgICAgIGFwcFRoZW1lID0gZHMgPT09ICJkYXJrIiB8fCBkcyA9PT0gImxpZ2h0IiA\/IGRzIDogbmV3IFVSTFNlYXJjaFBhcmFtcyhkb2MuZGVmYXVsdFZpZXc\/LmxvY2F0aW9uLnNlYXJjaCA\/PyAiIikuZ2V0KAogICAgICAgICJ0aGVtZSIKICAgICAgKSA9PT0gImRhcmsiID8gImRhcmsiIDogImxpZ2h0IjsKICAgIH0gY2F0Y2ggewogICAgfQogICAgZnVuY3Rpb24gYXBwbHlDYW52YXNCZygpIHsKICAgICAgaWYgKCFjYW52YXNTdHlsZUVsKSByZXR1cm47CiAgICAgIGNvbnN0IGJnID0gYXBwVGhlbWUgPT09ICJkYXJrIiA\/IENBTlZBU19CR19EQVJLIDogQ0FOVkFTX0JHX0xJR0hUOwogICAgICBjYW52YXNTdHlsZUVsLnRleHRDb250ZW50ID0gYGh0bWwsYm9keXtiYWNrZ3JvdW5kOiR7Ymd9fSNkYy1yb290Pi5zYy1ob3N0e3Bvc2l0aW9uOnJlbGF0aXZlfWA7CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0RGVzaWduTW9kZShtb2RlKSB7CiAgICAgIGlmICh3aW5kb3cucGFyZW50ID09PSB3aW5kb3cpIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgdHlwZTogIl9fZGNfZGVzaWduX21vZGUiLCBtb2RlIH0sICIqIik7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZXREZXNpZ25Eb2NNb2RlKG1vZGUpIHsKICAgICAgaWYgKG1vZGUgPT09IGRlc2lnbkRvY01vZGUpIHJldHVybjsKICAgICAgZGVzaWduRG9jTW9kZSA9IG1vZGU7CiAgICAgIHBvc3REZXNpZ25Nb2RlKG1vZGUpOwogICAgICBpZiAobW9kZSA9PT0gImNhbnZhcyIpIHsKICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgiZGF0YS1kYy1jYW52YXMiLCAiIik7CiAgICAgICAgY2FudmFzU3R5bGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGNhbnZhc1N0eWxlRWwuc2V0QXR0cmlidXRlKCJkYXRhLWRjLWNhbnZhcyIsICIiKTsKICAgICAgICBhcHBseUNhbnZhc0JnKCk7CiAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoY2FudmFzU3R5bGVFbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZGMtY2FudmFzIik7CiAgICAgICAgY2FudmFzU3R5bGVFbD8ucmVtb3ZlKCk7CiAgICAgICAgY2FudmFzU3R5bGVFbCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKGUpID0+IHsKICAgICAgY29uc3QgdHlwZSA9IGUuZGF0YSAmJiBlLmRhdGEudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICJfX2RjX3RoZW1lIikgewogICAgICAgIGNvbnN0IHQgPSBlLmRhdGEudGhlbWU7CiAgICAgICAgaWYgKHQgPT09ICJsaWdodCIgfHwgdCA9PT0gImRhcmsiKSB7CiAgICAgICAgICBhcHBUaGVtZSA9IHQ7CiAgICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQudGhlbWUgPSB0OwogICAgICAgICAgYXBwbHlDYW52YXNCZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFkZXNpZ25Eb2NNb2RlIHx8IHR5cGUgIT09ICJfX2RjX3Byb2JlIikgcmV0dXJuOwogICAgICBwb3N0RGVzaWduTW9kZShkZXNpZ25Eb2NNb2RlKTsKICAgIH0pOwogICAgZnVuY3Rpb24gY29tcGlsZShub2RlKSB7CiAgICAgIGNvbnN0IHJhdyA9IFsuLi5ub2RlLmNoaWxkcmVuXTsKICAgICAgY29uc3QgaGVsbWV0Q2xvc2VkID0gbm9kZS5uZXh0U2libGluZyAhPSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZT8ubmV4dFNpYmxpbmcgIT0gbnVsbDsKICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKCJkYXRhLWRjLWF0b21pY3MiKSAmJiAhbW91bnRlZC5oYXMoIl9fZGMtYXRvbWljcyIpKSB7CiAgICAgICAgbW91bnRlZC5hZGQoIl9fZGMtYXRvbWljcyIpOwogICAgICAgIGNvbnN0IGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgZWwuaWQgPSAiX19kYy1hdG9taWNzIjsKICAgICAgICBlbC50ZXh0Q29udGVudCA9IEFUT01JQ19DU1M7CiAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWwpOwogICAgICB9CiAgICAgIHJldHVybiAoX3ZhbHMsIGN0eCkgPT4gewogICAgICAgIGNvbnN0IG5hbWUgPSBjdHggJiYgY3R4Ll9fbmFtZSB8fCAiIjsKICAgICAgICBjb25zdCBzdHJlYW1pbmcgPSAhIShuYW1lICYmIGlzU3RyZWFtaW5nKG5hbWUpKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY2hpbGQgPSByYXdbaV07CiAgICAgICAgICBjb25zdCB0YWcgPSBjaGlsZC50YWdOYW1lOwogICAgICAgICAgY29uc3QgbWF5QmVQYXJ0aWFsID0gc3RyZWFtaW5nICYmICFoZWxtZXRDbG9zZWQgJiYgaSA9PT0gcmF3Lmxlbmd0aCAtIDE7CiAgICAgICAgICBpZiAodGFnID09PSAiU0NSSVBUIikgewogICAgICAgICAgICBpZiAobWF5QmVQYXJ0aWFsKSBjb250aW51ZTsKICAgICAgICAgICAgY29uc3Qga2V5ID0gIlNDUklQVHwiICsgKGNoaWxkLmdldEF0dHJpYnV0ZSgic3JjIikgfHwgY2hpbGQudGV4dENvbnRlbnQgfHwgIiIpOwogICAgICAgICAgICBpZiAobW91bnRlZC5oYXMoa2V5KSkgY29udGludWU7CiAgICAgICAgICAgIG1vdW50ZWQuYWRkKGtleSk7CiAgICAgICAgICAgIGNvbnN0IGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZTogYW4sIHZhbHVlIH0gb2YgWy4uLmNoaWxkLmF0dHJpYnV0ZXNdKQogICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShhbiwgdmFsdWUpOwogICAgICAgICAgICBpZiAoY2hpbGQudGV4dENvbnRlbnQpIGVsLnRleHRDb250ZW50ID0gY2hpbGQudGV4dENvbnRlbnQ7CiAgICAgICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsKTsKICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09PSAiTElOSyIgfHwgdGFnID09PSAiTUVUQSIpIHsKICAgICAgICAgICAgaWYgKG1heUJlUGFydGlhbCkgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRhZyArICJ8IiArIChjaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSB8fCBjaGlsZC5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8IGNoaWxkLm91dGVySFRNTCk7CiAgICAgICAgICAgIGlmIChtb3VudGVkLmhhcyhrZXkpKSBjb250aW51ZTsKICAgICAgICAgICAgbW91bnRlZC5hZGQoa2V5KTsKICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoY2hpbGQuY2xvbmVOb2RlKHRydWUpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGtleSA9IG5hbWUgKyAifCIgKyBpOwogICAgICAgICAgICBsZXQgZWwgPSBsaXZlLmdldChrZXkpOwogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnRhZ05hbWUgIT09IHRhZykgewogICAgICAgICAgICAgIGlmIChlbCkgZWwucmVtb3ZlKCk7CiAgICAgICAgICAgICAgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWcudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgbGl2ZS5zZXQoa2V5LCBlbCk7CiAgICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lOiBhbiwgdmFsdWUgfSBvZiBbLi4uY2hpbGQuYXR0cmlidXRlc10pIHsKICAgICAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGFuKSAhPT0gdmFsdWUpIGVsLnNldEF0dHJpYnV0ZShhbiwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gY2hpbGQudGV4dENvbnRlbnQpCiAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4geyBjb21waWxlLCBzZXREZXNpZ25Eb2NNb2RlIH07CiAgfQoKICAvLyBzcmMvcHNldWRvLnRzCiAgZnVuY3Rpb24gY3JlYXRlUHNldWRvU2hlZXQoZG9jKSB7CiAgICBsZXQgZWwgPSBudWxsOwogICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgbGV0IG4gPSAwOwogICAgcmV0dXJuIChwc2V1ZG8sIGNzcykgPT4gewogICAgICBjb25zdCBrID0gcHNldWRvICsgInwiICsgY3NzOwogICAgICBjb25zdCBoaXQgPSBjYWNoZS5nZXQoayk7CiAgICAgIGlmIChoaXQpIHJldHVybiBoaXQ7CiAgICAgIGlmICghZWwpIHsKICAgICAgICBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsKTsKICAgICAgfQogICAgICBjb25zdCBjbHMgPSAic2NwIiArIChuKyspLnRvU3RyaW5nKDM2KTsKICAgICAgY29uc3Qgc2VsID0gcHNldWRvID09PSAiYmVmb3JlIiB8fCBwc2V1ZG8gPT09ICJhZnRlciIgPyAiLiIgKyBjbHMgKyAiOjoiICsgcHNldWRvIDogIi4iICsgY2xzICsgIjoiICsgcHNldWRvOwogICAgICBlbC5zaGVldC5pbnNlcnRSdWxlKHNlbCArICJ7IiArIGNzcyArICJ9IiwgZWwuc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTsKICAgICAgY2FjaGUuc2V0KGssIGNscyk7CiAgICAgIHJldHVybiBjbHM7CiAgICB9OwogIH0KCiAgLy8gc3JjL3JlZ2lzdHJ5LnRzCiAgZnVuY3Rpb24gY3JlYXRlUmVnaXN0cnkoKSB7CiAgICBjb25zdCBlbnRyaWVzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmdW5jdGlvbiBnZXQobmFtZSkgewogICAgICByZXR1cm4gZW50cmllc1tuYW1lXSB8fCAoZW50cmllc1tuYW1lXSA9IHsKICAgICAgICBodG1sOiAiIiwKICAgICAgICB0cGw6IG51bGwsCiAgICAgICAgTG9naWM6IG51bGwsCiAgICAgICAganNTdHJlYW1pbmc6IGZhbHNlLAogICAgICAgIGh0bWxTdHJlYW1pbmc6IGZhbHNlLAogICAgICAgIHZlcjogMCwKICAgICAgICBzdWJzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLAogICAgICAgIGZldGNoZWQ6IGZhbHNlCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gYnVtcChuYW1lKSB7CiAgICAgIGNvbnN0IHIgPSBnZXQobmFtZSk7CiAgICAgIHIudmVyKys7CiAgICAgIGZvciAoY29uc3QgZm4gb2Ygci5zdWJzKSBmbigpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgZW50cmllcywKICAgICAgZ2V0LAogICAgICBidW1wLAogICAgICBidW1wQWxsKCkgewogICAgICAgIGZvciAoY29uc3QgbiBpbiBlbnRyaWVzKSBidW1wKG4pOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gc3JjL3J1bnRpbWUudHMKICB2YXIgQ09NUE9ORU5UX0RJUiA9ICIuIjsKICBmdW5jdGlvbiBjcmVhdGVSdW50aW1lKGRvYyA9IGRvY3VtZW50KSB7CiAgICBjb25zdCByZWdpc3RyeSA9IGNyZWF0ZVJlZ2lzdHJ5KCk7CiAgICBjb25zdCBwc2V1ZG9DbGFzcyA9IGNyZWF0ZVBzZXVkb1NoZWV0KGRvYyk7CiAgICBjb25zdCBoZWxtZXQgPSBjcmVhdGVIZWxtZXRNYW5hZ2VyKAogICAgICBkb2MsCiAgICAgIChuYW1lKSA9PiByZWdpc3RyeS5nZXQobmFtZSkuaHRtbFN0cmVhbWluZwogICAgKTsKICAgIGNvbnN0IGV4dGVybmFsID0gY3JlYXRlRXh0ZXJuYWxNb2R1bGVzKCgpID0+IHJlZ2lzdHJ5LmJ1bXBBbGwoKSk7CiAgICBjb25zdCBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50RmFjdG9yeShyZWdpc3RyeSwgZW5zdXJlRmV0Y2hlZCk7CiAgICBjb25zdCBob3N0ID0gewogICAgICBjb21wb25lbnQ6IChuYW1lKSA9PiBmYWN0b3J5LmdldERDKG5hbWUpLAogICAgICBwbGFjZWhvbGRlcjogKHByb3BzKSA9PiBoKFBsYWNlaG9sZGVyLCBwcm9wcyksCiAgICAgIGhlbG1ldDogKG5vZGUpID0+IGhlbG1ldC5jb21waWxlKG5vZGUpLAogICAgICBsb2FkRXh0ZXJuYWw6IChraW5kLCB1cmwsIGFmdGVyKSA9PiBleHRlcm5hbC5sb2FkKGtpbmQsIHVybCwgYWZ0ZXIpLAogICAgICByZXNvbHZlRXh0ZXJuYWw6ICh1cmwsIG5hbWUpID0+IGV4dGVybmFsLnJlc29sdmUodXJsLCBuYW1lKSwKICAgICAgcmVzb2x2ZUV4dGVybmFsR2xvYmFsOiAodXJsLCBuYW1lKSA9PiBleHRlcm5hbC5yZXNvbHZlR2xvYmFsKHVybCwgbmFtZSksCiAgICAgIHJlc29sdmVFeHRlcm5hbEVycm9yOiAodXJsLCBuYW1lKSA9PiBleHRlcm5hbC5nZXRFcnJvcih1cmwsIG5hbWUpLAogICAgICBwc2V1ZG9DbGFzcwogICAgfTsKICAgIGZ1bmN0aW9uIGVuc3VyZUZldGNoZWQobmFtZSkgewogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICBpZiAoci5mZXRjaGVkKSByZXR1cm47CiAgICAgIHIuZmV0Y2hlZCA9IHRydWU7CiAgICAgIGNvbnN0IHVybCA9IENPTVBPTkVOVF9ESVIgKyAiLyIgKyBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAiLmRjLmh0bWwiOwogICAgICBmZXRjaCh1cmwpLnRoZW4oKHJlcykgPT4gewogICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHNpYmxpbmcgZmV0Y2ggZm9yIDwiICsgbmFtZSArICIvPiBmYWlsZWQ6IiwKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAicmV0dXJuZWQiLAogICAgICAgICAgICByZXMuc3RhdHVzLAogICAgICAgICAgICAiXHUyMDE0IHRoZSByZWZlcmVuY2UgcmVuZGVycyBhcyBhbiBlbXB0eSBwbGFjZWhvbGRlci4iCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzLnRleHQoKTsKICAgICAgfSkudGhlbigodCkgPT4gewogICAgICAgIGlmICghdCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGNUZXh0KHQpOwogICAgICAgIGlmICghcGFyc2VkKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHNpYmxpbmcgZmV0Y2ggZm9yIDwiICsgbmFtZSArICIvPjoiLAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICJoYXMgbm8gPHgtZGM+IGJsb2NrIFx1MjAxNCBub3QgYSBEZXNpZ24gQ29tcG9uZW50LiIKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChwYXJzZWQucHJvcHMpIHIucHJvcHNNZXRhID0gcGFyc2VkLnByb3BzOwogICAgICAgIGlmIChwYXJzZWQucHJldmlldykgci5wcmV2aWV3ID0gcGFyc2VkLnByZXZpZXc7CiAgICAgICAgaWYgKHBhcnNlZC50ZW1wbGF0ZSAmJiAhci5odG1sKSB1cGRhdGVIdG1sKG5hbWUsIHBhcnNlZC50ZW1wbGF0ZSk7CiAgICAgICAgaWYgKHBhcnNlZC5qcyAmJiAhci5Mb2dpYykgdXBkYXRlSnMobmFtZSwgcGFyc2VkLmpzKTsKICAgICAgfSkuY2F0Y2goCiAgICAgICAgKGUpID0+IGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHNpYmxpbmcgZmV0Y2ggZm9yIDwiICsgbmFtZSArICIvPiB0aHJldzoiLAogICAgICAgICAgdXJsLAogICAgICAgICAgZQogICAgICAgICkKICAgICAgKTsKICAgIH0KICAgIGxldCByb290TmFtZSA9IG51bGw7CiAgICBmdW5jdGlvbiB1cGRhdGVIdG1sKG5hbWUsIGh0bWwpIHsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgci5odG1sID0gaHRtbDsKICAgICAgaWYgKG5hbWUgPT09IHJvb3ROYW1lKSB7CiAgICAgICAgY29uc3QgbW9kZSA9IERFU0lHTl9ET0NfTU9ERV9SRS5leGVjKGh0bWwpPy5bMV0gPz8gbnVsbDsKICAgICAgICBpZiAobW9kZSB8fCAhci5odG1sU3RyZWFtaW5nKSBoZWxtZXQuc2V0RGVzaWduRG9jTW9kZShtb2RlKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHIudHBsID0gY29tcGlsZVRlbXBsYXRlKGh0bWwsIGhvc3QpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiW2RjLXJ1bnRpbWVdIHRlbXBsYXRlIGNvbXBpbGUgRkFJTEVEIGZvciIsIG5hbWUsIGUpOwogICAgICB9CiAgICAgIHJlZ2lzdHJ5LmJ1bXAobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVKcyhuYW1lLCBzcmMpIHsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgY29uc3Qgc2VxID0gci5qc1NlcSA9IChyLmpzU2VxIHx8IDApICsgMTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBDbHMgPSBldmFsRGNMb2dpYyhzcmMpOwogICAgICAgIGlmIChyLmpzU2VxICE9PSBzZXEpIHJldHVybjsKICAgICAgICBpZiAodHlwZW9mIENscyAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgci5sb2dpY0Vycm9yID0gbmFtZSArICIuZGMuaHRtbDogPHNjcmlwdCBkYXRhLWRjLXNjcmlwdD4gbXVzdCBkZWZpbmUgYGNsYXNzIENvbXBvbmVudCBleHRlbmRzIERDTG9naWNgIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgci5sb2dpY0Vycm9yID0gbnVsbDsKICAgICAgICAgIHIuTG9naWMgPSBDbHM7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHIuanNTZXEgIT09IHNlcSkgcmV0dXJuOwogICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIGxvZ2ljIGNsYXNzIGV2YWwgRkFJTEVEIGZvciIsCiAgICAgICAgICBuYW1lLAogICAgICAgICAgIlx1MjAxNCB0aGUgdGVtcGxhdGUgcmVuZGVycyB3aXRoIHByb3BzIG9ubHkuIiwKICAgICAgICAgIGUKICAgICAgICApOwogICAgICAgIHIubG9naWNFcnJvciA9IG5hbWUgKyAiOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpOwogICAgICB9CiAgICAgIHJlZ2lzdHJ5LmJ1bXAobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRTdHJlYW1pbmcobmFtZSwga2luZCwgb24pIHsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgaWYgKGtpbmQgPT09ICJodG1sIikgci5odG1sU3RyZWFtaW5nID0gISFvbjsKICAgICAgZWxzZSByLmpzU3RyZWFtaW5nID0gISFvbjsKICAgICAgbGV0IGFueSA9IGZhbHNlOwogICAgICBmb3IgKGNvbnN0IG4gaW4gcmVnaXN0cnkuZW50cmllcykgewogICAgICAgIGNvbnN0IGUgPSByZWdpc3RyeS5lbnRyaWVzW25dOwogICAgICAgIGlmIChlICYmIChlLmh0bWxTdHJlYW1pbmcgfHwgZS5qc1N0cmVhbWluZykpIHsKICAgICAgICAgIGFueSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJzYy1kYy1zdHJlYW1pbmciLCBhbnkpOwogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gZGNVcGRhdGUobmFtZSwga2luZCwgY29udGVudCwgc3RyZWFtaW5nKSB7CiAgICAgIGlmIChzdHJlYW1pbmcpIHJlZ2lzdHJ5LmdldChuYW1lKS5mZXRjaGVkID0gdHJ1ZTsKICAgICAgaWYgKGtpbmQgPT09ICJodG1sIikgewogICAgICAgIHNldFN0cmVhbWluZyhuYW1lLCAiaHRtbCIsICEhc3RyZWFtaW5nKTsKICAgICAgICB1cGRhdGVIdG1sKG5hbWUsIGNvbnRlbnQpOwogICAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJqcyIpIHsKICAgICAgICBzZXRTdHJlYW1pbmcobmFtZSwgImpzIiwgISFzdHJlYW1pbmcpOwogICAgICAgIGlmICghc3RyZWFtaW5nKSB1cGRhdGVKcyhuYW1lLCBjb250ZW50KTsKICAgICAgfSBlbHNlIGlmIChraW5kID09PSAicHJvcHMiKSB7CiAgICAgICAgY29uc3QgeyBwcm9wcywgcHJldmlldyB9ID0gcGFyc2VEYXRhUHJvcHMoY29udGVudCk7CiAgICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgICByLnByb3BzTWV0YSA9IHByb3BzID8\/IHZvaWQgMDsKICAgICAgICByLnByZXZpZXcgPSBwcmV2aWV3OwogICAgICAgIHJlZ2lzdHJ5LmJ1bXAobmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldFByb3BzKG5hbWUsIG92ZXJyaWRlcykgewogICAgICByZWdpc3RyeS5nZXQobmFtZSkucHJvcE92ZXJyaWRlcyA9IG92ZXJyaWRlcyAmJiB0eXBlb2Ygb3ZlcnJpZGVzID09PSAib2JqZWN0IiA\/IHsgLi4ub3ZlcnJpZGVzIH0gOiBudWxsOwogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gYWRvcHRQYXJzZWQobmFtZSwgcGFyc2VkKSB7CiAgICAgIGlmICghcGFyc2VkKSByZXR1cm47CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGlmIChwYXJzZWQucHJvcHMpIHIucHJvcHNNZXRhID0gcGFyc2VkLnByb3BzOwogICAgICBpZiAocGFyc2VkLnByZXZpZXcpIHIucHJldmlldyA9IHBhcnNlZC5wcmV2aWV3OwogICAgICBpZiAocGFyc2VkLnRlbXBsYXRlKSB1cGRhdGVIdG1sKG5hbWUsIHBhcnNlZC50ZW1wbGF0ZSk7CiAgICAgIGlmIChwYXJzZWQuanMpIHVwZGF0ZUpzKG5hbWUsIHBhcnNlZC5qcyk7CiAgICB9CiAgICByZXR1cm4gewogICAgICByZWdpc3RyeSwKICAgICAgZ2V0REM6IGZhY3RvcnkuZ2V0REMsCiAgICAgIHVwZGF0ZUh0bWwsCiAgICAgIHVwZGF0ZUpzLAogICAgICBkY1VwZGF0ZSwKICAgICAgc2V0UHJvcHMsCiAgICAgIGFkb3B0UGFyc2VkLAogICAgICBzZXRSb290TmFtZTogKG5hbWUpID0+IHsKICAgICAgICByb290TmFtZSA9IG5hbWU7CiAgICAgIH0sCiAgICAgIG1hcmtGZXRjaGVkOiAobmFtZSkgPT4gewogICAgICAgIHJlZ2lzdHJ5LmdldChuYW1lKS5mZXRjaGVkID0gdHJ1ZTsKICAgICAgfSwKICAgICAgYW5ub3RhdGVkVGVtcGxhdGU6IChuYW1lKSA9PiB7CiAgICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgICByZXR1cm4gci50cGwgJiYgci50cGwuX19hbm5vdGF0ZWQgfHwgbnVsbDsKICAgICAgfSwKICAgICAgdGVtcGxhdGVTb3VyY2U6IChuYW1lKSA9PiByZWdpc3RyeS5nZXQobmFtZSkuaHRtbCB8fCBudWxsLAogICAgICBTdHJlYW1hYmxlTG9naWMKICAgIH07CiAgfQoKICAvLyBzcmMvaW5kZXgudHMKICB2YXIgUkVBQ1RfVVJMID0gImh0dHBzOi8vdW5wa2cuY29tL3JlYWN0QDE4LjMuMS91bWQvcmVhY3QucHJvZHVjdGlvbi5taW4uanMiOwogIHZhciBSRUFDVF9TUkkgPSAic2hhMzg0LURHeUx4QXlqcTBmOVNQcFZldkQ2SWd6dENGbG5NRjZvVy9YUUdtZmUrSXNaOFRxRWlEcmNIa01MS0k2ZmlCL1oiOwogIHZhciBSRUFDVF9ET01fVVJMID0gImh0dHBzOi8vdW5wa2cuY29tL3JlYWN0LWRvbUAxOC4zLjEvdW1kL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcyI7CiAgdmFyIFJFQUNUX0RPTV9TUkkgPSAic2hhMzg0LWdUR3hoejIxbFZHWU5NY2RKT3lxMDFFZGcwamhuL2MyMm5zeDBreXFQMFR4YVY1V1Zkc1NIMWZTRFVmNVlKajEiOwogIGZ1bmN0aW9uIGhpZGVSYXdUZW1wbGF0ZSgpIHsKICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgcy50ZXh0Q29udGVudCA9ICJ4LWRje2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9IjsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgfQogIGZ1bmN0aW9uIGxvYWRTY3JpcHQoc3JjLCBpbnRlZ3JpdHkpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAvLyEgbm9zZW1ncmVwOiBjcmVhdGUtc2NyaXB0LWVsZW1lbnQKICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICBzLnNyYyA9IHNyYzsKICAgICAgcy5pbnRlZ3JpdHkgPSBpbnRlZ3JpdHk7CiAgICAgIHMuY3Jvc3NPcmlnaW4gPSAiYW5vbnltb3VzIjsKICAgICAgcy5hc3luYyA9IGZhbHNlOwogICAgICBzLm9ubG9hZCA9ICgpID0+IHJlc29sdmUyKCk7CiAgICAgIHMub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkICR7c3JjfWApKTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBsb2FkUmVhY3RVbWQoKSB7CiAgICBjb25zdCB3ID0gd2luZG93OwogICAgaWYgKHcuUmVhY3QgJiYgdy5SZWFjdERPTSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgcmV0dXJuIFByb21pc2UuYWxsKFsKICAgICAgbG9hZFNjcmlwdChSRUFDVF9VUkwsIFJFQUNUX1NSSSksCiAgICAgIGxvYWRTY3JpcHQoUkVBQ1RfRE9NX1VSTCwgUkVBQ1RfRE9NX1NSSSkKICAgIF0pLnRoZW4oKCkgPT4gdm9pZCAwKTsKICB9CiAgZnVuY3Rpb24gaW5pdCgpIHsKICAgIGNvbnN0IHJ1bnRpbWUgPSBjcmVhdGVSdW50aW1lKGRvY3VtZW50KTsKICAgIGxldCByb290TmFtZSA9ICJSb290IjsKICAgIGNvbnN0IGJhc2VDc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgYmFzZUNzcy50ZXh0Q29udGVudCA9IEJBU0VfQ1NTOwogICAgZG9jdW1lbnQuaGVhZC5wcmVwZW5kKGJhc2VDc3MpOwogICAgY29uc3Qgbm90aWZ5SG9zdCA9ICgpID0+IHsKICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOwogICAgICBjb25zdCByID0gcnVudGltZS5yZWdpc3RyeS5lbnRyaWVzW3Jvb3ROYW1lXTsKICAgICAgdHJ5IHsKICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKAogICAgICAgICAgewogICAgICAgICAgICB0eXBlOiAiX19kY19ib290ZWQiLAogICAgICAgICAgICByb290TmFtZSwKICAgICAgICAgICAgcHJvcHNNZXRhOiByICYmIHIucHJvcHNNZXRhIHx8IG51bGwsCiAgICAgICAgICAgIHByZXZpZXc6IHIgJiYgci5wcmV2aWV3IHx8IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICAiKiIKICAgICAgICApOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IGFwaSA9IHsKICAgICAgX19kY1VwZGF0ZTogKG5hbWUsIGtpbmQsIGNvbnRlbnQsIHN0cmVhbWluZykgPT4gewogICAgICAgIHJ1bnRpbWUuZGNVcGRhdGUobmFtZSwga2luZCwgY29udGVudCwgc3RyZWFtaW5nKTsKICAgICAgICBpZiAobmFtZSA9PT0gcm9vdE5hbWUgJiYgIXN0cmVhbWluZyAmJiBraW5kID09PSAicHJvcHMiKSBub3RpZnlIb3N0KCk7CiAgICAgIH0sCiAgICAgIF9fZGNTZXRQcm9wczogKG5hbWUsIG92ZXJyaWRlcykgPT4gcnVudGltZS5zZXRQcm9wcyhuYW1lLCBvdmVycmlkZXMpLAogICAgICAvKiogTmFtZSBvZiB0aGUgY29tcG9uZW50IGN1cnJlbnRseSBtb3VudGVkIGFzIHRoZSBwYWdlIHJvb3Qg4oCUIERDIHRvb2xzCiAgICAgICAqICBwdXNoIHRoZWlyIHRlbXBsYXRlLXN0cmVhbSBoZXJlIHdoZW4gdGFyZ2V0aW5nICJ0aGUgb3BlbiBwYWdlIi4gKi8KICAgICAgX19kY1Jvb3ROYW1lOiAoKSA9PiByb290TmFtZSwKICAgICAgLyoqIEVkaXRvciBicmlkZ2Ug4oCUIHRoZSBlbmNvZGVkLCBgZGF0YS1kYy10cGxgLWFubm90YXRlZCB0ZW1wbGF0ZSBzb3VyY2UuCiAgICAgICAqICBUaGUgaG9zdCBlZGl0b3IgcGFyc2VzIHRoaXMgaW50byBpdHMgb3duIHRlbXBsYXRlIERPTSBzbyBpdCBjYW4gbWFwIGEKICAgICAgICogIHJlbmRlcmVkIG5vZGUgKGNhcnJ5aW5nIHRoZSBzYW1lIGBkYXRhLWRjLXRwbGApIGJhY2sgdG8gdGhlIHNvdXJjZQogICAgICAgKiAgbm9kZSB0aGF0IGVtaXR0ZWQgaXQuIFJldHVybnMgdGhlIGVuY29kZWQgZm9ybSAoYDxzYy1jb21wPmAsCiAgICAgICAqICBgc2MtY2FtZWwtKmAgYXR0cnMpOyB0aGUgZWRpdG9yIGRlY29kZXMgb24gc2VyaWFsaXplLiAqLwogICAgICBfX2RjQW5ub3RhdGVkVGVtcGxhdGU6IChuYW1lKSA9PiBydW50aW1lLmFubm90YXRlZFRlbXBsYXRlKG5hbWUpLAogICAgICAvKiogRWRpdG9yIGJyaWRnZSDigJQgdGhlICpvcmlnaW5hbCogKGRlY29kZWQpIHRlbXBsYXRlIHNvdXJjZS4gKi8KICAgICAgX19kY1RlbXBsYXRlU291cmNlOiAobmFtZSkgPT4gcnVudGltZS50ZW1wbGF0ZVNvdXJjZShuYW1lKSwKICAgICAgX19kY0Jvb3Q6ICgpID0+IHsKICAgICAgICByb290TmFtZSA9IGJvb3QocnVudGltZSwgZG9jdW1lbnQpID8\/IHJvb3ROYW1lOwogICAgICAgIG5vdGlmeUhvc3QoKTsKICAgICAgfSwKICAgICAgX19kY1JlZ2lzdHJ5OiBydW50aW1lLnJlZ2lzdHJ5LmVudHJpZXMsCiAgICAgIGdldERDOiAobmFtZSkgPT4gcnVudGltZS5nZXREQyhuYW1lKSwKICAgICAgLy8gYERDTG9naWNgIGlzIHRoZSBkb2N1bWVudGVkIGJhc2UgY2xhc3MgbmFtZTsgYFN0cmVhbWFibGVMb2dpY2AgaXMgdGhlCiAgICAgIC8vIGltcGxlbWVudGF0aW9uIGFsaWFzIGtlcHQgZm9yIGFueSBwcm9qZWN0IHRoYXQgYWxyZWFkeSByZWZlcmVuY2VzIGl0LgogICAgICBEQ0xvZ2ljOiBydW50aW1lLlN0cmVhbWFibGVMb2dpYywKICAgICAgU3RyZWFtYWJsZUxvZ2ljOiBydW50aW1lLlN0cmVhbWFibGVMb2dpYwogICAgfTsKICAgIE9iamVjdC5hc3NpZ24od2luZG93LCBhcGkpOwogICAgd2luZG93Ll9fZGNDb250ZW50S2V5ZWQgPSB0cnVlOwogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICJsb2FkaW5nIikgYXBpLl9fZGNCb290KCk7CiAgICBlbHNlIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoKSA9PiBhcGkuX19kY0Jvb3QoKSk7CiAgfQogIGhpZGVSYXdUZW1wbGF0ZSgpOwogIGxvYWRSZWFjdFVtZCgpLnRoZW4oaW5pdCkuY2F0Y2goKGVycikgPT4gewogICAgY29uc29sZS5lcnJvcigiW2RjXSBmYWlsZWQgdG8gbG9hZCBSZWFjdCBvciBib290OiIsIGVycik7CiAgICB0aHJvdyBlcnI7CiAgfSk7Cn0pKCk7Cg==\"\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\"\u003e\n\u003cstyle\u003e\/* latin-ext *\/\n@font-face {\n  font-family: 'Figtree';\n  font-style: normal;\n  font-weight: 400 900;\n  font-display: swap;\n  src: url(\"data:font\/woff2;base64,d09GMgABAAAAACgoABQAAAAAV4gAACe4AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoJ+G5NGHIFWP0hWQVKECQZgP1NUQVSBHCcqAIQML2oRCAq7NLELC4J6ADCwMgE2AiQDhXAEIAWHQgeLSQwHG39PBePYFOA8gHLiagQeRbBxABELq4r\/ywNTbkcNYcHQARZHY2kgSJrSxmpqOhoxDJuOO3kPSIPpROEAJ9pOHa4+hySESdiHwfhsCoR8bNiVLaJs3bB6d1U22nEPjpBkliiyVWUeWVOzW8cAEgH1HrNGEpAMpJ1GBI91xLvZzz4QyUONYsNGsIIKiCClKUUQQewUETtoR8SaYmI0pbXrlkTzz6Sbcs3zWq6l3N2\/Uoop\/Sfa1r\/ZnS1gqbTBPPGq\/XB3P6Md4H5FXlRYgYFRcLoGghgUz\/N\/7Pt97psoK+CZ5cm1vJOiqYI5vzV+8Larc5ogIdncdZspCuwUr2vXV3vcT9\/7SekuGQAqVP4XgIRvbWqnUbKb36bm9bD7RjTOujJV21ucb\/6lDJKgQoLDe94ZKjroS8oJVCW1Ll00HwTeP180nswgFF6ZyTNPwgFUxiuBUIadqxDTOUP5nbJC6xQ7ks4dVapzSE3hvnKrykVdGp6v6f\/suznZ2V9aJnmfWo18+UJlBoUReGYz+9tmCaUvpXeVAYdqRaiPwzK45jCuNKcQ0qFDdAls30MvVryb6BJZCfzvtDkjHGEUY4zwi3E0nfuQVRBQAaQHyOIwLAgJQkaBBAqChAiDRIiC0MVDEiVCkiVDmNIgbBmQTHxIFhFEQgHJoYJo6CEGJohZEaREGcTCDnGogtSohdRzQ5q0Qtp1Qbr1QPr0QQYshQwaggwbgay2FrLeZshW2yA77IHscxBy2BHIMc9CRo0iGDeB4GXTCM46iwBBwAyIn1HjJjj\/PgjYDwYsDswNgyAwPmC7LCDgqc8f9gbPDEuj4+FYPJFMT\/WcIJOLugUiabFx9PiExKQUVjo7ky+TK7JValNZpaupFRAEtqYCAQYsxbDtdywoh6CTDu\/xQBAiYExrQGAIJx7t80DCAbYh+qDtkgRhQB7NWny5QICuf24qQjEcSTAEB9JFrQ11XwhAFN001+2AI7hbH3d\/wIGpCWjWltnuRL0CISrR10QgyFC3oQ1A3VUCLGk4kRQIisZuCYRaiFHTws\/lrxN4k3+09uEt3Cro4VrBYRhXv6x4ZgoQBglGMAj9RX6EDlzp35OXC5\/NvsItWe73pBoXctnA5ZIg2ghmKyDwF3Ru7ma+LwAtetzP0MjK+vF5dU57JLkgznxzAchQnXsx3LRv0Xr3SDwXd9C35JDk4Tm4WjyTM\/jm7WRjOZKs9rqglhHtQrsw45eWw8Srivdk3i\/U5wkJvFbMg3jp1pYy0\/r4nMq3FJ+s6qSEA4Hag2fEcgEWGBqPWFrW1pH+x1aqPXZB8wqTJA+izlwx3mgfm9GP05YlKQsvZtzJ+OcVasuV4X7ViZdBrhHd5boGOfGw8jpNDxN2+RYcr3y5mx9NwstmsLwxvw4PzFOwWxUlb8nCJkc1wxr1CzmtWc3tSV85uKU8Ybcu1BXxzNdadKiLLp5QdxX4oCHFyOx4hGXO6MLuxGSFUJIuyAAkcAIIJgwaUURDJ4EkmLDhIkCMDCVqdORhoggLNuw4qaUeN62000Xvl\/r5AbsDmwOrX2jDgpBhy1PO6nq\/RYwmq6wO6ftR329tEugeF\/OxS9n0XOVJd8ofZfn2lfpIvSov62fVDjWsfFKvS08S0gUyi1Y\/WALgZDT3HBtBtN6cHMdnifZOEK25pcwstxCk2+EhQFQ\/z9r1FETLD9Y7bh1DKdyYyJHs43CbuCBTuGALuPC6nx\/Fo0tcZV18HScTU3fr9euy+D8P5CwMGZZ+OMwxuSDnJM0CRN3rYzxJ5KOx0Bk1jXiCP1r20+tP3YozOzwsyyfXpI9HJgRDQOQnUJAO5anxLTW0cunoGeQzMjErVMTCysbOoZJTlRoNXPosNmi5FYaN2P38ffY74KDRrwc1AeizHB3TMoQSkNxhJyPYg7ApkWqQpvEWjk19zGkFYXkCTDBky3LYwmGLSUKFbSIINSFFUoPkXdOrbWSLkyc5U5bzTwTxw0QIVS7QedH+gQ6FPlVjsa1w9VyytffppI8BFrOEpWxl23HQJoTQo0ePHj169OjRo5eVrp+XpcadwgrYsOOgEidV1FBLAy7cNNFCK8OMHAKzTaZy7Wx2xXovHbbHXgUMCJ4qMrOc1lGjkzzJkTryyA7v5Z37nQ3tEATm5zdZ6MiEixdIMNZpmY2wkCt1N2A8ziK5dgQcAS+WwYRhCwnyZ8OOUVf7cK\/Jb0C8eIvcAsyvm3oBM3DxrQ6QMPHT\/hpBXhRJJVLiRa0j9AKoitZJTFkWdZJ0rEpUhHpYqA4EFrZXCtbhhEJfwBQtSpgqblqAECgqYdoQ6rYYjLUZAjqFZIUJYdXigoAhaCRVJTkSQdaV5ZvzvxNwOqozcmnOuzN\/x8SwQ1KBgJfe6ZLGolMzibRukKsXjKRFRccyWKkcnkAqU+iNVltNvau7f\/EgIASwNRWw4p6qZ4jPd6UNmx+o68oO7OZNnUPww9bNvw+cqr+Y39X\/G8NVgUs\/2c6MLGiv+xK4HZA\/agZYGgGCkGHA\/MjA8rBzj23uQQB+gMEvRBGQYLHYJHIVc2qGAOYJG2hAwfIBqGeAADI7irppc1LXNedmTpu3McL8bZVgCx2MCYCPP5P8gqtfZ3hkmFjAQq1gQMzzqhMrNgotAoFuFymgHRyHvISYaenjb4mBiC7w76x2zCvRhZn08CJOdgwxpyR1cWd5rpWtxPVmBRqiMc1nXbnkkSX\/Y+Qwzo9pRN4OoAWTFm74kUYdY4pTHlda816ZZ34gNJiQf7+l9xipBxBHta7v\/r95cj4ZSP6VnEoeA\/j0XoBPrvrqJ0BmB2V9DsssN2yTPZ437rhZc\/72mxn\/g8I\/ONSbYkNgQWJH5oBzoqiyQKVANYLUCuVC1SCMW4h6kZpFaBKlFU2LWB1itGPoFM9rEbouiXok68M0INUSLIulWYptENcKHMtlGMI3ItOwLKuJrCW0hsR6cpvIbCS1QY6tcu2isYPeHlo76eyWbz+zwwqVOKbMs0o9g8hKYTOVbUwOMtjH6IAiRyBgbhgkjD\/c0oit9jSrtQk0gxyRmUh2zFtAZkOKxf8gcyAlwImWmAuprb0jyDyhgrY0yHwJE3t\/sgAEjU\/NBfAMIOcBx4Kpc8D0TWDqC9DuAygYwtjVi++rzTQ6DXLASNqLCqyIJibVBZtTWAcKuPp0vq5i0gQUVp7nyVW+0LArbAA2p\/MKipqoBwhjlKYQLd1OP5jT5tJkzyja2XaXDrPzpmNtEktYsbxYC+c1b\/QCDlzWugaLwyzYV4xYHIqlJWdtLT5Rq8XSHbPTG8Amj5z6LCTkcRVvGdjHmyZ8dconWz7lOOYQOReXfWmJl1yecTPcvKnzW7e4uHHjoWByFSFcvy4Qc3Hr1p35ZBUTDEvQ8sjpt2yozm\/eM0BZvdgdz0RlABQIS0sjeZOkUMrQ7Y+MvKGFcVFZl8VLKoElbTbMXrgcnfPvunHDaNIguc9OF714aLKXStQWu6+IMdxDMbLTYBT8etpAXfkSqw\/S7KJlVOc23tCtXC3WwhryotDTlVeg9LgBl0WGgxfH0Qw3r\/3vmbZc6Ses1l9RtYkfGl7+mNrU6CxjKK\/MS8v59Py8Aw7Nv18blmA8EZf4cLecnUxJQJcFL0DTosuN\/dLCGqv11158BbWKNyUWyyxE1LHTZWkWxfLWdpSzkLZ32cap9wvsQHju83rpQlde5gNA+ZfJNExW7YqC\/JPXOQbnqm4Ca1ZUCMYb2sxOV9p8RlosI\/\/4B9dLgU9D1THb3t4SfPrWzup6ycSlTVR6tlJ1VGuYP7Iya2BW330gP\/XibBkUw6gexhGZwI3HAKMDpulqodQEVXke8qpYbCcvOH81NMzKn1UnQOlMnH2RZtdtpvMdkHJZapHliH1kqZnX9Pom+N6u4cjb6N0O7+mER2\/8Aco2IQNlQvJtwrHZJcrbLzEzfzkVrKg+H9AXltaodTMpLyX1NhmlQjacSdmtxMUYW\/A1Vj6vzlH7Tr24RKFU5hgXS5rNi1XsKW9G4lV\/O3WUohP8+Uoc5U5+uH4d6O71zAAirKbdaJuV2fpN7QE0Z+X0EXK6zOXaKk\/q8qbj5qvK2Xur8X5lXb3uii5MIjJ1Md\/5E4Dj57gbEcHfArQNrfHxes4oDf96iD5mHSlvT8RQAgmHrtqjtaYct1n2RdMZWcbu0+PtvIRWXhDZhLTTJ2DoqmXDnW7Jdec+AIzd7UjOrlOP4O3k6Y\/l4aPHjy3QWW\/Pn6pBFGgYu\/ro6kHpuoJ1gGdf1GTDc+2fGG6mkxq9yUZ\/RJQDff2WFf2witKwz2l9trXV8uxeZ73cm1ZZsFJlNKoqk3hFS8y6dRUO3fpl5uLMSpYxz6za5Sjt4oBr5sOa7fbSw02NZ77tFTXbpNtFVey8YmaLQgG5kZ3vqGg7FOXI5LKvc\/geXTM7ZWWP5DI5tUwGhyitzzmdz7a0qazeWoUtifbsUWKpQWiNY9vWmAvWOeyU6dmW36VUeQwn5X\/K7UXrNpvBNaMSjYpUS3cLRguAGJH9KFvz3wqV9Tpn4Cy+qOidlJuvlqoyuCnGJJ7F8LbqZymzTC0qil63pbAYywu5MsWQmWZVaUMjn3a4TAYEQRa+VHZ6NaU8mn2p3KIq+9ZihbCP6S+V7pfiBXUChaBAZ7r7MUfTN1hpfa61zdOeyoaGvc7yZ1tby5\/bXVknLRow52J4hW7dYlVrjZC5ptf8pLZdkXZJwTVzS+POkjiVuhK3KnwyXf8SvTbIfwO9YpSlSmZq0jWO0ry9kE2R22kPV584E9SgNzjdepmkSmOk6kP+X8jO0Amq+5u7dQ1cRe6OF631b5F9XfKUYq2oQx\/cQvO2ZwuF9jYhZFFC1WHX3uxNT1BnG1QqY55GmXPuuvhfkUqpllFVsaW1FfWaMmbE9cttFQSXq8LpboQ\/Pf0ysuz7YahZWNCn0fQWvKl6U86vdAhkcoeAXynv7okCbe+ABr5tuei6UHG6QvW\/issVqs8vnnOi+OViIDke7jV9UJ50U7N4EvBlH+Rdk8XNv2Lwk9xeX2ww1pfYdxGK1EW5nNeENq1ZHcHS2oTpbaUBYqKu0ZRm5eWmJJoksZsN3\/O4KgEkUAweTXav2azs9Wjy8jqyb8lbS3lCUWkW16lUZjjLskSiMlGx6XOPDoLkGrdG2ldglvZSnhkO0ZVExYwUc1yZWW\/w8rNSqxRImVpFRmZWURa7SqnkVOljGCJk4iyxXB+ftoWf3HaNPq8+VzBQtItY7WoukRVL2ulJcyWLfhSaM5h6LZPLMTN5ebCgwWkKFe0qOUNUBSVmlaRyK\/LElx1CqcatlvaYTNIut0ojdQgu2xSzNpWvQ8wjb0P7SoU81ZEvmMQCtkOu4FT+PgfTjCJ8QwlHLLNz+W4oi1RAWYpFQ0\/LK2quRiAXZ4l\/lg1MKZpXzMOn\/cHJCumb70pjSHATmVB0klwOpNxcrqbexoUf\/ik899q1DPM4scQ6ST\/JDIQGyP7yyfasIB6+aV6CmTeWcCSj10PthjNzVmZTrGtYf+lWf8XByqQOjV4kKrEA5q5gh39EwTSvsF+rScsSs4vpAkMODeYp0pL45ENlRCM7XZifzkqqMgdoQgy56TpHgTM9lxZ4xXrnqwXCd1Mj8IBxSi47P5HDURXGw1MKMBu0ygpxxSHFoaPio0rW56kBjdUjU5IBOxNmiSbydBMA8uV2Lr9xD1xKS08tlLmhhAunxv5TbDq0+VBuH9h4QNF7MuXGg5sOQv3HwRff0WcPxRVdZNZ+9F\/29MSpiZx5bVSrB\/hZ0nUy8YZM2cZsMXyAb+HvyjO5Spm8JLlJvIEl\/NnC1rRwyS55pfYlkUy8z6LN2Sc\/J1t9pkankWa71aUuTjabRYWnvTXPJBBbADP84iFUuXK5ZWA5fLu6b9CyYhDGlPWDFW2DD\/oJiAgqlQH38lcsQ+X9g7qbVY46TlimRIuXFa66RfTC+nUheFaSkc84mKJIOMDhbEhQpGw0MGC9gNbXF3ki2on\/WiMtsrFvMJnJSk5hMcEgj0luEwZQQSsOX3IwJur2UksQFUsQd44yH8L2o2wpDL6KKnbaYQjIL67x+k6brxX46rw7pP3LVlP\/NGe0rsnIfW+06qXo\/FW2f14msiYzRaXdbEt9N1+tCg39xM2Zs8LqzyusO2NjjM0b\/3f3lx+YzOMLU4WvOy3r0cakD6SArQgB004aNU7lp4rTTi84mzmA\/7IJdcaLU77KT6ZjcfgAvmwPJFgo2AgOjGFxLAHZtCM2EwSEnz7pC3OwbNK3JpacTh4w4Ox8FT39pnHEpQkhx3GHOY27adN1dF\/v7M8HEtJJt6qklL0+qFIU6qp3juGSE94lN3xm43SDYy6b8pktAw68cNw8ekGaZhqzKYMW+EqJWaTE9WF4pXemj92YDJdC\/OKzY2nz2QzOoU5Puor60eNuUMVp7y07l3VCwv98CuQ9OuECFCcjKY6mPB33LQXFSSPZqKOWD4fiRyckQHHKsXQsMVJ+undy0bxzqn96z5ix122peLQ3AdOmbuhJY67kPlSHE3lEVXWR7hItu3VnDLNp66yOiKvGbLfsI\/TkedNO+RNaUX6ibcFkPWZOPCd7539w+1Y0NkmvdPYFHJ\/m87mIdLf6yV\/O95qBg77flpxX9RfZaz39Pae73TIcnPidmjq1klxh5aPH7aLSaZtY1Z6oL5RCjf\/Yc3qAddMmvhucmi0486meDJosOFptkYsu2b7p5CmW2W1ZK1wwfZudTYy1eLIRyN5W79fQPDzic1Rx1L103JrqUI6NJewZb+Lo4MS31NSMrbd7P+BUqo93hH+FOoD+d+k7N6ovuX95qv\/S6h9OBZe+dDn2NcDacFA3tEYPMZkjuw7XDH6dr5cubkB87b1coM6nUUzj+bcUl8\/fUUe8iDm\/lhZZdMat5gN4Eklq6wQm3uPKwvC95Z+sZ705gUcb3nEUZNHGRB7ZTg8rkUJmLNu\/rPK66JNX1R2UOTUrvh6gnqIyo9lUfOQyNnYaCyQgBv4KgLi1NYfgMyWkqpp\/3tbolxQ16Kjj1eaGwESrKUu8Hg7ao1EgPuKFJgFq2+YjXn8Tfmn7tkanF6fO57y6AQy2svN2AeJ7aUDmfLO1tR1ij4DMwmCrsgIoEDUfOtWROfKWl9nxGMjP7YMxjO\/r5XGMW3GozNLX4hyoubGaSPLkTHVZPqw90oHqgSm4ZM2I5W3XyC4\/O1kUmpAtjlDBHGShjSvHaaItKvHDBZLc6Z8XKAC3AkiYwxJjfjaX1jYKha9UwH+oCC8L7PydebOrGvpvGkUyR2bRJeUt\/Z9h1Dkv4YM8Ly6ggl3l8bqag6L\/OhAQGMhNZgC5DWAeKTJIqOXz6DdkvR0mnXXZV\/5yLwjJkDbK6FIYa6rjycpsyM4cyguZzJlcTyATeVj+lLpoxajMUpexyqqyltX+erZerf4aqVg9aZlN1rTN1Mqbs21uB9pzbaK91epbe+tvIy22OCzDWmzFebgEr8Lr8EX4Knwvfgw\/jz24B5\/BYTzNgF8eU8IsYFYwa5iHmKeYn5hRJsakWJZVseezl7PXs7ez97M+9mf2b3YLu4c9ylazYxzmFFwWV8DN5ZZxLu487hruce55jnBvcv9xB7mTXB3Xz0lclEvwt\/P384\/zL\/Ae\/m3+D\/4038CP8jE+JbCCUjAKxcI8YZngEs4T7hUeFZ4V3hQ+FL4UfhT+EP5Pn77Dwoj7wTiwBsGQPRQNjqFtWDZsGV4cZoeaoXXoG9KURWcTz6aazTBb8daQsjeEgIwGzP6\/bx9xfIZffLHvBzbY7n1o790e1\/jA5cCD+PC5r8g9OdbNTWqUrCUpI\/yek0AFUYi5NnS09CRXivwXMyl5bH4l6zFVBQD22agUtHwjsaTOUVDw96a6iaTtAje8mmKSkdr\/\/rDn56kBJ28aIx2VW\/\/++gOI\/u2GvKt9d8VlVqVmyHwJBx2SUZQ+Jr2HO4gyUsDi94cZx2IJdTDhy8PBhoPbGw42BJ1UiCVeSK9XPM2Q+hwD\/Hbwu7ddVBl8JAP5JQERJT4KJKxMv39sbMOGk4GEKKGJwMnit\/b\/\/eX7DV\/+vd9R4jdHdzmSusYxoUULeY7Vup\/K+q0ljy7PnamgP5hz4LGVeeTcOlNi9g00kcrqElDCfTCPsElDoa2EhqQUmp754IttbZLqHLzV3OBw5SfuOjAOzvj443B4dGgY\/MQLyGdJxCb2\/F8hG+Ve4bFuGoitrSVpqXDUl6qoF\/zU3fCwH2UCj2wsI0mVqwb25ROOv\/dzILSQwGFAobzAR7sZFVyCeWn6fLygVilKoOznXgAAjN9\/eQmkktfpu1aRYlDBUM4524vVLMFUHCiHVBDk0VzKocIx\/MKjzhJdPGvo1eehguH28r1gI2I8bnI1tC5uQy84BSLBSYZFcUONjlyLciE+H\/b7r7Z84WaEYVuaB79QOjyoun3vgfZ7eErywjO+EoBEhoMLQNd6g6Jo\/z501hDvfSEltK1cIMSiJDcHtJbZ\/vvfRYtUq6TTh0u3j9e4J2A43tNORRRpmS3iuHHyv0LmZLDHAHSeEo\/Lda+rSlclvvHpdGRAk5qyx8BxSIMk1RLadXQm1Nr6l6HCriiNk08m+Qce9tAWup8I80Kq0Jwc24QWMX59VErAaIRoisI0xghRSvl4MEwVLig6vaXg7qJkS4WIUql0esyVne\/nXOmFHOsCFqVQUi6NWlC2LOpHK5m5TqiqrXq6mCa\/GNh23rpiC612F78qjYyNXz6cPNNZ+TymLZcDh3iZ6aGenvYGotp\/ADzMDdqme\/Z+6GKSnPVOU5bQ7Ax0gBOq2GUTiamhnuCdlYmpfV4RnZhurq5tYYbCo2Nx4d3v\/HH71Qhm6JdmsnsiGYExQnQUK2qca5vcLmVmrP5YTV2nNBLzaEUh3LDha\/TG0QFZgdNelKOjE1XOuW0svxJ2jRUNwBjlSW3gtqMKJmQ\/2NbhqW2oLePlKn+etfluFFlXNvon3A6TZ79guR52qoPdPmuZFRN4mRB9pPO2uj4OLxWouobbLv37yY62NRBEIy87MyrG0zo8e0ThGaywF\/AZbu0dRuwD+OCykWPkghwDQ3AB8JtMieEOv6DLRTJtYmDfbyhbZBPhLsGhjNJKeOuCm\/osJ79z57RVyWAvpBjUOEVp6dPScdQsMRZrYCL6wQLlaPKFsp7rQw+sLrmV2Qwy4nG5OMtl1uuq5itKKuiBFZSUapd6m5sP0QeempyMu2C4n999r8cD9aQCGAIvEGATRY7DHdl+AO4ciG2HJMn1tKp0EJetl8HcSxXU02+\/Tai3n7647pe4W8q+n8a7mAVhUO5CAC6Axg8p98SLI2F7LTNUf8+UNruoRBoYjGttRc7S4oGQFBGT0iCGFmWsYtiBQYgyDT0Dvu8Io7JpoGfcQyXSwig1OgNLl5Zpo20MHccZS73F\/QPB\/AP91TURZd5Z533TM5ySmea7EfJ+fUOHCb6qGWo31Nky4JBv2CnASfLVvzM2n+wLxTxUAkRNHQzDuefy+cEq3mgI288d0TOyFZyxkyT4ZfNwuDKQN2XL0XhQ2WGQ64oL\/983iLIudMGjkY76d\/3rKNAChXgArdeOtOz+5V2I\/u6EvGu6r2SVZonX84JakFOUapQ6xdWAsSk\/2NsXlPx9vcG2Q3v2LFp06MCxDvlE5U7HubMyLC+8rImvsZgJEYTg+CywjAeZiry6gASPPVYUEVYPbXgfd\/pPF+Re5dUmsAgioOy2KB4ZscUku5X0oJk2OKZmIqIk5zTmTccWeyaWwmm51epSMdlJf40uRI7clZX1ITAvdgOFvCWL9vdrcoxVbBYw4VSqVOA4xJ2+PC41FtyzYylBlTtv3j2NXOrMyR2OfB2+fdeOYyGcfWE9RBKC02lBHiMVaWvTl4IlyVOjOGg0yebduHRzyqtEQT2YKClVhYW006Oux3QhQW35YJGVjQy08AqW0STajln96cCetAKnu3q5iFwCbbxxr9eGWW3ZDd2+7gouMIgplZpOyO69p9ENUVkqG+fNXsV0gqI9SFARnVIrpJ57zpFC9234CHeyoY8uuGEg98g45GTrIaU6uEHg2Kb+\/pskpDBnjdRZVrYtWDurWXDTS4No4kEGhYdKAedhT3353vsfNgpGBqFFFnll1dbXXhYrl6CZ+ANgpdPIY4VCt9WCnvICdtCXk8l4C148b\/EatMXnwGKQ2moxUm3DI2LBRaEpYo+Us5Dwdeh8VjIIiPy3304PpBxgpAZO\/0ZY+cOPdaFNQlCJLTtgZMOxOXhkeCZkGaiEeRDDEnt7b3DcffHpzj+cTc9gMfHAzQSCBH2wt\/SICDyvRtaAAqitcvStul6qvLQaxvpIoPaFIElZ9FOn1mgAJ\/R+1ZLB16G+7N7eq+w2k9IlnlNausWC1dOqeTdUAo0T0\/C0PGwuI7laVxaoHyh3\/EgNPdHXtyVNWvLKUv6dWqLUsgJGLfduB+CyGhx8KoDA0xyFMYMRzQeNcdQP2XcZiR7mUdi+zJUAdxiXkVwC4sqV2lpVzqLKZttlqHmw2VmCX3\/90z19pUYOwq3rHCK1CxepIDcy56R5diZcWqKTxWoteIbh6RkmAqLaYu4ZmhDsayHimpxOu4WlZb1EE09whYvK4SFflez2t\/gHwzMeXXJmOnDqMLy3jk5pzDqdHPM89jknE9Oj0tk5GfD\/XxHc39LV1c+cTatsWTmnG8PyuddDpOPPc5Y62bk8RBGimZ1K5ZVegEXYmnh3a3NT\/wiORCzafHgrU+rHZ\/UWq8123ZKj7VtwBCyUxCfSjDjZhAWh7Pt43BHg2RZFNGRVsdjR3MAquo1eNOyiYmv5mliQEkKrsn78cb1sb7h02cv53S0xppxAsV7W+GVX2h5QweoJXLOZcNWNITYYzLiGXaYBll\/Y7PaWbsnQXUHjIiG0r8OSJUcOHKyy40+nqPSMh116L6Wvy8u5O4L++vvdbDe7Z\/uUlFoglch9A7HbmtW1bEvoHXzY30eQnQH9b0TC3jmHH2FVQycdE\/Zne4BS41wxZO2ZuTcL2fyaYp1emskJvH1pzvygRn\/goM+8Xc9CNyGCSvtYl9d6XGvDicvGWVT5PJ0hImfgydilzqR+2AAhhA4AfOt66ut64fFkFz7\/N9iy\/71Q5DboyrbLcVt9fldHIl4K6IuJldHmFbHryN1OIZhUQBPhmuCbQZJ9s6vqYGK50p7m9+\/\/xl3dSU8b4n5aO9bM\/9FuR2zWwo5IZZ6xUaa4\/O67UE0qFLvSJn5t6v\/JydqfHUSxe\/ehHkd22\/aePrptiwXA4HTDUe\/UoxrPg02dxEY1r+TG9naPXqmLdepgxGc2u9TPLjcdPtwdYewczkS6D8e7Iqwzn410Hc4VYlLRKoeHday6akBCy0fk\/\/1XP0QVzKOG6v8rGwK6R3\/2STLqBYmA5IXQ5EbxmaeA9uTI5VbDDr6G0RXncHIiKbqb0\/5CzQhtQcgycwoOjeZeD16Im8pH0HCUoOEtosM8hihm3FXlD4ZrbaiWxjdfh8bbd0oF4DkgUjRFIcQVQbMidJlOwA2ApgDuSQPvzOw3hRwhRCGKQhRisNyGYzFcdKHDYUp0yhu7I2JOaY4Y6Z5lo966CADMRjnDskghl9U3d43G5Waz3qCRCe5VTq+5rTu60++fUtyUWhTPtL37d6SkR2f1IEq3gH7uYeB6K5Ak+QIjNJonKgeazcBlGSakgXAkPNgZqBdxx7CUE2vODUVeouWZgsK5z1hiE9EsKDmZqEAnDbCb9FmGlMRg1W6dbaXXeflWni8utHuJhjc7bGwUhMz5y8sxf\/mKRCIWeE3G8kVmTLFx3orz1Fpjilq6KDdjtUt7zaejFQaLQWO1qfWOOYtW86pWLk8k30mrC1rKBNINyNYOzeI1AxWzg45yEbxXoIz0l1+11SxU\/Ekm0CHABzcKmwH4YnGVfLSOjq6gbQN6GEDAVxdZ3VmRfv8vyfGz7uE\/U17nKnvgt6XX4BdOcBX+Y+\/SS7hKfwrr+v92FEzFjwrZMR95hztDTv\/ZQk5U70bVRVwYIT11Q4mNdYdiIvAnL61ck24hNjICs2LhMMmjHFNsnIGXVBdF+PCnmNvWmFiJCddLL6KQDv40JgSicdbnivqN4acbSzd9iOlrHsxGpo5pgI8q0r3W2NCECbm6Yi3O6GiY+HH6TOPnI5xirzCF61ZAqY8Mp0tcRNi6Iz1gx7UfyEdopY8LjIO6490GfK6EhfDrGnY2+AXNBJ4AVgbmBhaJF57r4RDwDAuSRv6QmdnIxkWT7S\/VCQAezOcLAw3JqwImKFsEAl5WZRKZhp+QViCRYiGIKNFHhcCjPgECmD04k3cZgkAtkiVXnSAHuh8FBQT4TBAh1mVBCcEmBRUwbBHUyNYIGjQeQYvKKegkkAl6OJ5gEC3CMJLge9gEB\/bVqUMdj3w96rRr0UCvRZMePm5uHBqEuow2352Z0BmgjDoanes6XLRrJA2uEqupjFuHUKDkqkSBGVyX6dVBuLOhNNGktyB5ADYVjOY1VuCrPXk5plc3mQyj02l282jUGR49eql0b3Zz4+rk05RuRVHDKobvYraIdJeBj4uHh++HyhUqUki3qnLpJbixwxmmNvNZi\/lo5d\/RtHGGcgG3q4hRLPFOravZEJdQ69XE7Czh8hlY+iSatPCSe9XjarBVIoM7eWsblzatwHPnLotlaJzPTYXpznD8Bt\/\/WJ8BlvdWKEQjjBhI8diIesQBM2QkwC9YwZEcKZAIae4lCKmQWnpCQsVOqAcJSzhOInATKSO0RCXatzITk9jEhY6fRWEQJj4JSSRKku89THJSwiQOK6kkSUt62OGES5aM8JIZPkUELiaLMkI\/ZonciCOJNDJ6TwJosyjkRRkEhmQnJ6qoGd2PJtrkMkUXvVs5N4bkM8cYk8IUKIo5hSnynZIUpySlKVOa8lhYYo0tdtZU+MGjOFLJFmeq2FOdmtSmLvUcaYgr7jRypinNqtLipzyAkAfTbjgd8aQz3nTFl+70pDd96c9AFmdJlmZZBrM8K3zlm959hM\/d5\/bvPaWFl6nN9VefXNfg6\/T4q09t6vS42yjaP7217F+cbsK1R3X2RNTvsTablHtkXVSp5Emv87CuHtexav11GyO6sLypIy7k8\/G8te6IaDiizkcxwNlY\/q7++Rsi+ZLGpieqCQy+1eOutCyioaIk4XCcOlcBc1MgaT29iXZvR3tdrMafpKkh8ahwPneZCMxFEaM38nt4SZk6qY4k76MrE5uk9uiWgWqsCrUzhynbT+0tkRqSGSPM3HiByS3uf0FCPoY3vrq+MFdNciuqSX7tzXB\/OLqEgxjQ+QcSwlNYCse5KtXrKKqoMnJT0LuJ2mbL9N1T3O3Aul6jN6vXvoqZy5gbs0Oac3NipeQXtcR7bs9cjpGPxz45q5cl6cpf6lIXV\/x0PvqJn84v\/uJf\/2UG5\/A2D6v4kn18Xkq9OTzBGxv82sDdfyGPW3BrfMvYmBTv5OHWtfcE\/AB1lL1lLzi7dpdENcH3uE3DQHl\/1JPtb+8Jeqzb\/yvz2s7+cxnXb+AbAQA=\") format('woff2');\n  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\/* latin *\/\n@font-face {\n  font-family: 'Figtree';\n  font-style: normal;\n  font-weight: 400 900;\n  font-display: swap;\n  src: url(\"data:font\/woff2;base64,d09GMgABAAAAAE68ABQAAAAAnJQAAE5KAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoI0G6hGHIY4P0hWQVKFZAZgP1NUQVSBHCcqAIUEL2oRCAr5BN8eC4QUADDgIgE2AiQDiCQEIAWHQgeIaAwHG0CMB2Ruzj+i9Gb12Xunc3hhwo2h9zgYGdxnFNJpPSqa\/f9\/TG6MoT2g2X9gpAglMo1quFjbo3Y3vLua3qiN5u7gXYeNmV0Hh0HYYxGWsrICCUaXbQcyilFkrKowNteGqyLIQK7Y5SA4KLFTTmMcfNlhKjB3OnPjZ\/W9r+FnEi98XGRkRUFX99sH+lCCofinZEqmZMoLHnTG9R8OzxVvega4k6MRcsITj3P1Zn6SpmmqmGyxrohxJsqeen6xE1HO1VhYJT\/w2+x9WkriQ0uVfEAMEBliIRZiFHONte2UVVuX5VXtct0XrltX4fJc6FSooFUtsvqG95OPkiiMwPEbhdFohBHoJaoffuuZd5eFDYCRKcikvsNSXxFS+ZQlhdAUxiDUSbvD09z+WT\/AmIQSOZZ5t4ttt9t2q2RrxihxkhZoAwYqVgJ2gwFGYvzqGPzO+mCSgVofBGWO\/HoUu3deshw017eV32SVbFVOYsaaUTxMQszQhw2DD6OV8yFn9X\/a+\/ef3i1\/bkIq95CasOJCXTITyKw42\/Jc4Df8Vl2mfzf\/O8Frck3bJ+Ksif3tl0mgz0S20ytWp4pZIWgESYgohJAgYe+L++XdLYWkL\/CpA2BLbsJOGLpa29AaqUKXEkiNLp5e3JG3vQO2wcbVQv6vpta1vjr9JGXImjzP9HIHtNsaVAbuiXb5BHwjfPdSVSut6rLGbdpIsp3IdkAOtmQnT3ZI1lA77CxlsuQB4grMvI6Hetge9ALQDRjfffZwuBFcDqfl4f+XObtvb6r81FlFk6tyIhwIhdAYM8ynTR6ld9W6R3MiUaIpThxFxRqEhv\/nOZnu4gQHYp0X\/USj4kAgTTj\/aW3VnX288sEnId7KxIjZxyTEpYpFEvHEWrx4qRyUk7TM6ns3JohDKM1p\/Q9ZsxqQ0M8t1rOch5HGCCGGaRxCwBSpZb1\/P4v9fv8zu4Lac5WMU0hGSt7X54Vgdl0eytx7m1IE8dznq02tO4Kh4IVdzuT3wFENwf93naICQhUehBpyCC1MECZJhjCbA8JcWRDWkQthA0UQNlMLYVcNELpMhXCwGRCOMgvCMRZC+MYVCEOGGJZZzrDaCCOIIuKKiyAI4CO4DFlmudVGCHAwPDAJ0A6ohAcUQYmdhyG5j7nzOAEC9+Ae2wgnkAJB1hiWl+rqqqYb7U63Z1wqyoqq6SGeQAgqKCqllzFYHIFUgWK4RmcwBqsLEAx08gJK205CsvsuQMAYQbi1P+uPgLnka1sAEwcgjp096ryun00B12JyIH7a9VAPKNfo0hveGTjuO1eXfFQ8cviCevdInHNuLToRVO76L+edNQz35GXYJXj6230Fdg2Cs2haHFhtijvrLryC8xk6B+04n\/nK7Z8ZFWGciQ6cNj9kN2g+ZT4A2wr7i4M\/ZM6ZA\/jJ+BALEvLiU4rN+OP4cbyD1KHsdabS1MP4U6Z\/TTv5a9b5mN7QE4zfhQvjQizIQi8uBXcx\/CB8nIObYBp6CN2ALrBjbH83tFGeS0x923stbDqskczYAow8O1e2FPEjMeQPl+A5sydR5Q3ArLfU2cXpp\/FftB929wXA7Mz77Q7Bfb7J+5KWTWxu9UPdLhXmX9vtj58yfzj9bqex1cksmpnEGKZvSrGcUr\/5Ddln1bo3uyDuH6tTp3N\/0NfexLJ6nAK7IuQz7KEf+kb1ktadfDzVU5CGK+fHdz8udQe1NqX84w2fnN+\/kid\/QL9f+esS8Py6FGnfNJWL0y8I6jnYpKBv\/QfDWCLZvH18arMuHzNu1PygPtCImpulU79hPpkuXy5OCPu072uO0oPr11bQhVU9CR4ak1Etd8N4JDhEOMawJS1ca98\/DzT3F5WsUHVXwqQDn9c6Ht\/rRJ5l5wlaXXrmKpuFjHhW5hm3p1Oj822mKJ5yRsGj5bOIxXPL\/mCEalvbEIHqG5Zn+U+xPyme4jHvzdSdaDb10bD+CD3ReE7rgdICMiOPV7B3umZXJMr7R2dfy6QdXqKUxsdnnMijM6rXbfeNR4eMHVJsHU51R09dspVjnqo7G51FbI\/7GuqVEYqJmdujySJKrcXE1BPDGR9OESjYOHYloYURQeB0XMKikqqy\/oRg+sG4s8R7gY1jQUyIxr6avHgDmRz+HLRtcMOpJ1heCyb7i8A7TjJ3FB95v5VhbaAcN5afKwN+hefCST4c5KL5\/DMvLnvEuzKxFDX1z0340MzoKL\/IBvJcPjF4vGwrXpnXpnjoodun4dWxzbq+IP5EkrKLf7KUtk4GfEgLi1j58GvtaOltO6eEG0JJk\/ndNkZUpnBgS+Ui4uYjWe2ndIKvJd7ouWZjNME0L+0y0zxpgAlvAfA\/I31LqWTjFo5ZHHTKAnfPA6Hz38eO\/x1RbPf+wNe5CEeaBc\/RPZF+XukfUCHwUCHwWCHwYiHwciHwakt5w+HygdNnlOxMcWngWt3DM1VyO\/D38azF9y+ozlohszskSY0goPyvCQh7ywZMBMgf+bmOffbNiWOJHWQVSbQGvXK9czf\/7NzWrX0t6OhbuG9dI\/J8eXfCnYrgq7cIbiE46JDTzrjghtuohnNjlwy+F6++qtLoDHe9xO+5PD4sEIrEEh1Z88sdGhmbeO+bXwiy2fDrkRBcPeDY92nKtBmz5swj51+2A7x6u2gMhMURiCQyhUqjM5jjFkiW2Zx0vfTgwwKhSJxJQprdkpmUKrVGz2SB0PRX+AA1b4Hwy+ldHYLMUf3VD8A\/1nE7wO3lrtAYCIsjEElkCpVGZzC5PD4sEIrE0tpg4xzoRjPhxCMVNAbC4ghEEplCpdEZzHFrWM9nc9L10oMPC4QicSYJaXZLZlKq1Bq9Uy2IZh9DI+MyGXb+GTvDml3tojEQFkcgksgUKo3OYHJ5fFggFIml4y1wHX1DI+OTNxGPP3BH7AwigV3QGAiLIxBJZAqVRmcwxy2gA2xOusbjw4IMEYkzSUizWzKTUqXW6HXmG2eccca15KT7V4DKtyADERPOXy4AOR\/qjDNYxZHoypQqtUbPpEO4zBcvG84NHUFjICyOQCSRKVQanTE0W5oJ61CFk66XHnxYIBSJM0lIs1syk1Kl1uiNt0ACfUMj41OTQfQwIBFIMKA8h1qYMJ8xZ1cMjYyXAlIRCLHGoLJ7HImuTKlSa\/RMngTq3gJhk3q4HXjdKKUZlqXRzK97GnQZoBkdqZ+GRsYtg6bO8zVAgio0BsLiCEQSmUKl0RnMsFY6bE64KwMeHxYIReJMEtLslsykVKk1eh+zMqu1RLa1MI1C8KNKR4blAECLG+7zRTtjeGsXNAbC4ghEEplCpdEZzEvPgBxQaklPfFggFImlnaEGDBgw0PmGqHi6xULMsueQzvznQnmaArxlbQj69b7y02a+MrP2WqExEBZHIJLIFCqNzmByeXxYIBSJpRsAjUBCldxbOGo6+Co34vRTwPbMdUTv7xx0wQ1rXnL9soAF2BWwG2B\/QBfgEMChgMMAhwOOABwPEEyQeR6hgaZ\/odFoNBqNRqPRaDQajUYbNKLRaDQajTY83LUAAAD4aKoRqnmoJf0t2M3+uixxiEMd5nBHOL79u7uCsMipBAEZBAABWgE5CEPCVMgD8Xmz6\/91mnSUFwuPRF7ji3CW0F30aApl333woNA99KLqoc7XWzbBg0KbBxqdnpQfXLqLR4Ik\/uOjd\/xm2iSnfD8R3g2Cvb7nFcx+XJQ5RLaNh6H+SYkzGL+SQj3Kn\/XzBgIvXG\/wvxo0BWS\/ybhHTWsOoMCzKykpJSQHTFdDipA0ywNyd4R8TrW0rtrz5cykzwV\/W+9Hv7A4n50G0VMKN6Ayn7sXqxSh30eAB4tujwcoJVQMQgHCJDHPFA+d52vCh8apC6ErLAXpf6MmXstP+cQxKqHCBpplNz\/JG1Dw4tCNcDQJIYWEgLcDIgJejdBMYStnSfm5qWoNyc3bkZlwNRKeHvAMxOZH4PghYZS+4rDSztLO\/V3o3OU6t8jzSY86w02aKmK5ZdAJ\/lMrW6hWJpWk71ZCxwEqJeetOjFU8kfjbfgkj4pHJ7vvMQjk2Vl6SwoVtkpgwhW\/gcl5U3jmyaaRjMpamCSyk1u74ueiiGFmRIAS6f61SKKUXrYLxigj5OSIrDaKg97PZ9yWG2VKLYqCMFfamhHuO1eVNpU3l0izWFqopYhnJmeRiCVrUhMhiiMOjwhbPH0VGk15JtFWvXguowwjq1QoU4Uyb7KS0VKQwVEkEERkFhSFSs4wi6vBYBmf7w2dkAcdULTi60oJiRX07R\/mObQ4fKSCyKwjSQ3wnm\/JoOfhk0eHhkoEOoPeVp6lHE7Nb3Cz+WsCSs6SIsyX1VXL1R0LPk70AST+AJS9p8tW\/zrtnB63kiMEELj4nDiaRNASw\/KCHFebLaPd6SHOlaNr0Q3Tx+agPL7gh2d5u+BLSuksDpcvEIokcghGUFxLGimz1WZ3+IOhcKQikayq+dfwzkjLrLZ59ej11aXrd7SQGRH09FUDNkrbZFf2Unly6AjsBzgQ+ZVo3iGwG6P1rdl4ozDv6wFcAEAGdTugCI\/4EooGULbXDnfM76QlAP6tuCDBZzluz8wpW1CtRtoMed1gihWVc4E6nT9XQhnM9s7o9s6ceO\/CUbRWnk6vGVapASlZp\/1nDACB4PbrfVte2KGI5NO4E6W6mdtMn45WEwqDVyogaYigh368zaNAoB6DyVIttlxUJlMrW\/cu7NJBjGP84ptifbG52FosFecV1y7e0UJvOa9lc2tGa1UcQ5oiG5cfrZSTS0NgzMTXxdpiY+y5f1b\/ATYBALHcjgHsyMKRy0cuG9Y6eofHZgHgm+evPHrlxSu\/utK3d773N70rev4rxvK9gABzAFu7pB8g50teCOnrHZ+ud1jvlG2u+d\/HTvvXf7a6bbXdVtlujbUeuK\/PRmcgBKRIk6USD5+AlIycgpJaPIyFlU3CBOF1pdlnh\/2eeD4IC6YLIXfygGJBJaqba42ZMsw2mjyZH\/ehFjPZbP\/Pa75uPfZ67E4bXHHDVTf1Oh\/gMwsc88jFkPjSQ39ZFhz\/+cTmkLnVQsf97jd\/2ISE4uDjkiBJSAUWNg4JIRExJq30NLSMdO4ySGaXKImL2Wu8RvHIlC5DFp+iCc\/tVylTroLfOOFJT1bfwj3hDBHTTDdXExlv0uAIPzA9HHkQAuS6CpXIBD0ImcmSOvYCBPHZB0lSAnauRKYkBBmcn5YM9OtMVnIPeCIyHweYYqgiFHrMqkqK4p7nEAUgqIWf6QyQvQZU\/QEcBV0FgKKYOCHsq5C0CeXwFjQc6xh5sjbkKZ8d6gtJKhG67q\/6qu\/QuBocucNSSoQVtVJqiAxizCvqpZlRgBJJTKNmdzvCiWFaygQ69PJQklDt0MJU8+YuDgxjMQ2OUZAKjbwOkDsaJUcvnPIg1LpmcJPKAjrTxXBkqYBNasGIzjVOVLfqFgUNzGdNqSlAcgkicgULMiQMZ2Q1bCg792WUx9o7FQXLAYa+w1McTcNpaPvOefRSWpiBLnu84dOiUx\/ud\/p22yLD4igIcfnats5OohwYpiSJldKyINXjtLv7rLs4ujBYPAZBJs3Y7rCJoDA0jlNTrZsss5O+\/LNx23f380nMYYwa2JE9CkrTD3TGfucVENUNpTwmD5nznGizHnM6MKlZSdRd6lEf+L38Lpp\/tEDVRhwbWAUdbXt\/5JQLZ95miyABlMm7IWAyLKTQZxFB8\/N5+hOrfOk\/JTEzPSn9Pv5S\/\/+6V7pmxZmZhn34JKL4Mfe1auU56hUYZc2vMfvSnhFNtojwN4JVkz4Z2\/hP0tCnffTGrOhCTBCJu56GbSLAZtBIZmAp6HHh\/O1zlOTllKyIGA7Yn2vLSb+6cT0UFivJmDAaSvYdw9AwjzgEVG8MawTYGvKqZBv6zXljABA1ylTyjmTNjpSI9fJkxe\/4RUX\/fvwMjGewYdot6RYcIt5dUPpbdS3XFRtRul0OuFO3qbA8ewCj0iWcKHubDoqNdtH+5kFoOYJkK6vUleoozWQsufA9mTUulLq7w2KaKBg5gnY\/dOSPAIc04TbtjdgQxyh60N37fBu6uKcL2kNUIxJlL2Kb2fYNUDxIE8WoLaRfBxMGLPiULzvbm1ekgToF6xQnqSQcRIQG1QH8hn34bD6ctQqcUlw8EhAWoetn24CHtetVtfTU8Mmz9yinNc9VOmy5dT5rx2PULDnjwoPrlp4DAas4E4jSvMOX\/tbc7MGlTuXqLyrvMWpxK1bcPtwRr\/N8mEywVd4sqKaspigQAO5xC17MqDu2VhhMp4DrxilcnaenFm98lmOw+WpOaMosrE1vD1xdN1\/zh7+uO2ye+8JCIAGSIYrrXbS+Bkf0bnzmUlN9zcWVfjjpRdna2KNvfY5UfzoziGFIihukpVQXkCOzxUrD3f2MjIWxiX7zqG7ZRaAmGRPiYopNS7epq\/3Qz2b8Fi2aqa9nL9nToU+378KGx+g+MepuePUBTBG76MjRCDjbcHIBDrtbifDDqemiGsLojHRGHLIG\/Yy+0DuLvb5DK8im6aIc6VuFjdbsp7nie9F1KnkGigXJFkO20GrP6wT7zKxlZ\/vOhiZpxg1iq2Iq8msKOj0vNSufeuO6jU3nzboFTKn3xzIEQEn9YZt7Mr\/ofdnce7PU3nLWCqcqK9KcviaVho\/h8wQy+t4HKK5xOvm+ZgmGQ9gUpBgMCGYAJpSWynDYIET9KsWLtC2CW58ER4SGj822tHNPb6QMXQRvxnFKjb5Ja\/mNqXIzHqYOlLyXVaefNZFk8RoS0faWbQ2zkGaq2edc7DB5gMTDKUG24OMldFfFOoaoyRaORVm5DWjkXKfFuzazYHiU6ss6AtCLkvLdMveoTMnIdQlmLdoZv2w4YdLsbGK2raEmCN21h5Zvd5u3OSm9OMbETTPJM\/Xg71LjnFnLzJbX9RPrVt0RqYliZsKY393JW368NN1zu9MWuRDcCqdxq6\/JaDXWw7cu25a0e7M2kDP2Zua3R6TWSYkDEYVaL4x4ZIsF28lML9tNpXpK\/rqR093T2SHG13RXGv7vJphWTd\/1Cf4eJI7O5vdeKYlTchyj8uRGuodTs85I1ofHumpO5ZowHNFgg0339Dndpda2UfoyNxqwQJRojIlmim\/bKGup\/QcuJiVvVd87Q0n5JlLuaREJ12KqTTqr3Jb8bZ0sVnCKM3c1di+6BrImpvdF8HrJv\/FHP\/+FsV3GlIkhM1VIU6N8oLx1Pu55wCbJo72WebhfP1yfTfkX7VP0EuJS8Glbjfrdgy8d2g0mEzrQbWUMZiG+A1GqvS\/LqNcxRFfjr47YLnznHNL2Z3IsBHthvGTCWIIuY\/LeGNOp2aTbdChIGWKNv8FCs6TWAc633TPhrV\/No2nIIycnPt\/TgEYE2WxThfNuuGmXht2lPra5J\/uHnuvzSCtklD11IrvQoxY0O8eCc03Ev55rlPm+QhiRsRiDML+HIPpP\/v7d8hO4z3HlzWHDQnVJVdX+INR2PaGtS\/+whn6zSVnjLePNM0I7fi50mfq0tNWsU+CcrtY0KL+6dWJLmeVlRhEJ+ZLVWSjiETfvZ2Ww2Wjxe\/YHk09FDao7VCrvsphTzuspx2KMNmF0hTNuWwiocyr\/oA7olE6n2+EOJD2VCsvouvBaVYrXNXzIRJaex\/oXNb6fXWm8NtUQHIczFmM+EsXY48vqHCFbDIRrgSAlEzEhzIp1k7PbIwBMYmmL2DKNUROGerLxjogi\/poajED3GhwJD\/d1xjqyPl3c6RHCZ31B4NLgAPWLWLiu3icODHUoE4bk0AQx6FsnZpzg2BfSea+O830o2RwiJWdhl\/Iq5iEa1Ij0+9htS6AxcHGfBUMYe1VBalZufOUhem1H+B7ikU7dzRZku1c3WO2FdWB2rOFIrR4JOoNZH968uILs7c6Woh8UTApX7OMHhMS3nZ8WEsmn3pOZVZnKyJlFcl\/iJ8476nnnjiRr+FbMp2FXYtEIIG\/thBYVbx3w6PeCrVBQmTOwb61uVnPUtZP2UemgAmuXYzf\/uXkL6bZ3g7TiIXJUDKE3zKfTnJHXE8z9ZVG3z20rX9IG0ga2PUR9\/2AoluFDN79ZuOKN45w\/D0FBePh1UzVf6cNgsWswhPhRTO6r5BvPoectHj1OJsyB7dh5gtLjGj\/p2A6WpVfviAX2p1Ll+7fHqrAWXtTeQVitRJQhcc13GLvDEeOqhQ63NMqxmhzEloi3VQjCwy8mNoa8\/dPqgtvGcGIDshGKC0xu9nQcB444fZlCG4FLi2LoB9pCM2uGN5tQYYNfN1LPu6VLUakafJueOhCL7Z8+I+DoLaWcXhbSHB3rNSsDhYLgCoe9OxIipuegpVVNNJnPYt9hIVf3WgeoGSagoxDhs\/aj9g0+fJ+Kqy4Zn1lCa6NNnns6Zd1k2rTVWRZcKNnzbXwprdj1mPXabS8hFrGsDEm5+RHxBcL26SBXHggP4+VWv1OE4ksdOQFCn6k22+lDX1Sw4P8FRJEXLP5\/oXur7Zq\/nJgaygOYq9HAgdQMT9ui1dXbY\/79qZT\/wNZoEnG1OwxQwsbueQR\/mmEe1ft\/p04fWNgWWdEGhNVDrpqhiYczJzmG28GGhvKD22LV8XV+14E5c4Jrjz+K2GdRuu6aGrJ7DmWXvNO4OhLhcSx0erhN+fN\/nayFVElCK0uGYPR8mvE8ZgtSpkjQtB1Ug2Fi\/nbRE254vNwJZjS2vo6OAV7OLVkWTsxXWOMfDruwY10k6uaIXPlPNTVfaWz+g16vhU51f4YrVDG10VNLZJ\/mU0eKKic+uVoWPsohmGyST0a8pu1Ak46Fcv7uPTU4sZoyx2opVBUnrRnU5LedArFRXtFWP8tYLcINmw4HqnDKGjCpYT3USNGm57Q0aJTK0AwleNh5A30K\/aQTEpPsc0lyjn2EGMFk0YgcxQKODJufKbt+Tjspcun+fe6i8iWLgIQ5RD45Z3DVs4bAR68Pea+GB8LEufD13ss7Q75T7vNukPa79yJc+ALreZY94iQOPCt6TgRIjL8vsb3g16RNlmUAO\/qC6Tm0kH7KgdvpoSq32VrlCW0Z49K5DMI7yqDeoZvC0QeV\/Bne8fBYY52NF5AYWGU2VcFa8ycSESEHnReeDCbyvfOkEgPTGByXUGhrk+0LQi\/cqKhlGL6430cKanY3hqFZqdV8cxOpmeNwqOc0kJSpyiBvd20ZW1FT70HdqoYixgNP8WdKh5hN6dkioYMtMQEoHQlDz4+OIMN42fMPAULWksgchx2Z60UOpcKlEMbVakEcnQqJVcE947DYogCq9ENgdTOZGjWvYymvRAl5FaLY5yHFMZ8CgnyQ2\/ZOkxFMTK9OnWt3IHN2TiIR6EYZPoyMjtyIQPckFteAj4psUoVLIYjv3KIw7qp8hEm1+S2+8TElON6p41dmPfqmRrCeYK+SrFI25nY517s0khQEeQ4siYxakGqO0uPxMbXoWgJO4A6j1UQbeuzdyU1nJaT4TnjnNfD0y0JbJrTFMziWmFim8HBFYRN8PaJEyFodMttmQ1prCRKJyK8H8ftBYmYjLHnKuMIojnEjFnkTKRdEMFwY\/dOkYBjPXu0RwmhIJKsFvqk4KGOVk0U8k6u+YhRw\/YL\/wvE5PrE+fc6uJ9za9gPx1BhX0RHvTiTNnpTjcrvRBlivbRFtQ1z99Efn5jvPiR3Hx3oCp3O\/H8PA9otqtKnezJNi5SqeyY2h3qpm0FqEgzJ6+W6mlqqvGJXRoqfvWOMRqkBXarS4Suoj3DgXZcXgz\/ZNPw+WOk\/FI8POMZEWa5Jt+Y0qO\/Bjuz0r80eWucuKz985UnYjQvu6MOkwDe\/\/6L5rUM\/+KRb8goeeS\/AUsMBdJDdrc0A\/EE8ps8831irgKy18DiPuGE9ONhv4xog9xjfkTLhR+dv7MuUz3Clp44\/TDAJLmVBIOEtBwZOIIhCT4HhUIi9XqcX+gQASwFG5u5JvlGASi0eHEm7KJDKNNdiK3+JiTotG47JhT4L\/ITjMenUYDvfhfXvgPWrOO9zxdRVdZ1QAgIREsjrLjdMXcU3cruLVHhG4\/NLPmounLpzSxlJw8djPeE\/f2r4ut2vNLnx299Rrent6Qdol3PHH5o6bnbvNR3+8OMqy9sV1x0HVy53FjqQVuobYlfs+4jQXTlw8of1lLVGqCcgUSDcKr5aiazQwuLOe0AuPPyvI\/fk6n\/Qlrk5noQ6sf0K5ly\/Yq6znB42y7M8LGLtZPy1Sm8GlbqGBzaJEIhYVOwV6f9DY9tCzBzk5QiHH8CRSAU+6qz1m2J9KeXx2urJSJ4LHHPLucFiwOPHgPyfwUW2rm8dBM099MB8fBjhKb36Hv6f9QNKYy6ogmUKhvnRwHTHh6ihrXIjoq+RQSCWHKhfvmH2Ob2KnUEBOF9vyU4zfnyLbOLZwQCeH9bWlhjQkLd6qxUphslRYWNyXOWCuNWTz8LhY6ZEpUDv1wBjVa9B4rRzMHCSlule0j7enbR+U\/vB\/ACXpbG+2VXz4\/voavsReEbPZozErx1ka7i9saERlWT8\/q8+i62tVaC1JYjX1KmBMt1TCqsSUhcY4a62xIiFG5bUlCxt+s4kYzS2Xn7hybHGjxWqo34xqAmitSI9IbVyeTSrlWQX7pF3BmrTJqIGiyo4OdARNdABZurlZogmgGmP8yGeQF1LB5dViQlclVpWroNz67EhJrEG1gSaJGfHUOTTaUOKBPPTvedzvW5EyagzqYXXQZjTQUsPpDIFxI9YEuKdovfxkUi\/TyK5WmSkL8UTIuYIuZAHyVmONSs3dUbpX7jZ9IH34NfbqwAci7TB4TJPaIV6S0PEqbZBUZoWioiN4ScFTYjRMmbCwWISAifqPBnRP7XLDB3eIVJmz6usz9DwwiXw1c+rUSgfi\/Cq7cEUZfXnd3zNarrF0diPECGNW+KveoS+kn32iAutoCr3g2brzUwuYx0qmLh3FmCyaJHMWvs5hBb4NvSScLE4U5VaXZpN3jYcJWiHrZGkJ45YtVwiCPW8Nc6s+psv8XLgnvsSgOwiGaHktL74RmDKQw\/qWyXyPme05tTD7g0+R9wOavI+6fnBlFaosFkTjcYCrNISECqKwIsvf\/wKn+Cc7XvhOBoxVjE4+fOlNLvdlIQdz235lfMtkfscYcT+MbwE29dbcj4emJ1NIkbQN3KGZvFoF7DWYJG2AFel9RCnYrOKSHA4np6R4Cvsu\/UJB0QCdPlBUcCGHsKqlMquWIKxamdSmBl\/Tij\/qoAuezVChuiJffoPL+VjE9qRDdXBBBJZn+ftvFb7C\/J7B+I45RjGY\/3H8g6GCA0BiQubxzM8VCGZBD03Gh2DWTs4AWu\/ufs2vN5ZPKHpurTf\/Jl4VP1dk0+ck2++qC4MXBKaIW68tdxtkNuHtzYl1pJVIyuEIhsrDMcWd+cV3s3ZmPbeCUixMBgIlu6unPQ1MHir9\/Ur+1ZP5+Sev0HyYen8E8J74mgV1yx4wx0zrahjcK+T2I7+7R9wHAendfmcOqG0cUqDr8pGwLHxvJAu2PdwJmOibrNeSk8u0IOwz3LdFAmw8IkAAA2FRZK9yIhtEV6vfsa3j7wkE+buj13eI920b+X0+L7\/ftkFIgNZqQkRYN2SW11ewWzd+T3xjXVdjBQO1OI4WwLwMzuE0ODChWfulFK3cRktGjXk2quDOYMKX2gnNATjtsIFB5i55VipCq9pWCXRenalg9ZyM0UnJw5XonTXurZ35w5OqIlQVXnPoKtwxqK5e1o2aaWYUnK3+vaUbbLMsH1ptDjZeZXB56h8TaX5lwt73cIj3kKmvx4HnEoSU77QB4suxH2pOrmDUK3XH9AsW6o\/V1emPLliQPNbFd+lbF6iP1jlFbT4DRFtluRZXYu\/sODLDSCHT42josbjiephckLsks6y8MK4OKzYnGrpQV2gjmmpAN4fD6BZ42YiFuInM4utbmnN9hYa47ykdrsK41yB3CAUupULg4WcTIExEI0K5VykuM11hW+V3wtJi\/iYhq5ZV7Lk9d93fUu9Hk1tWWghvIZ9LUmyB2Mbk60Vsrl6PpiyypV+8yoHtBlwVYxkoRhIlKjyb1nnBx0+jIViW1BKyZAhC0fMlcRpBkwUvra+iOAqwMOotZfbfO5ctkWnwnuMw3+P3N9r1qDnuDsko+r217E88PL44yWV+Huq3Z3i9Em08WPmPzES\/vI62bPZWhup7FvNdwe56iRQqbKW\/nHnxFT1PqtgH9NmDHRkenxD0ptk64eoquNNmo1VdnZgt37WqOlBVVWrfD\/lk4hCKyl32yiBpUK565L\/3aKMCNjo0asoJl2z9Zmvno0gIFqamANRV4YhjVS4QWOmIViQsmC5AdQZOcs1mbhJWcSuBE6ZZyaqVKpibxCKYpU1AUFJLQJViaolaSWih5HuYYWbUCTq5BX9fbpytVM9QNuxAsx9lT3krVwmCK9c8q9Ee1Hc\/XLmfPKghfNoZXYgB6ZoBBm4xLqoZDPR8CNxGR6S+CxWdKSk+UVR4orjkDKh++yf0J6rjl9HLCOIuSmDssGN4avLjjMukYcws4Jn5PB5l4Qk0zeNTo8U3L93u5dVR1HLXU+LpUnGdWMSPc+l0yxUTNc1s+lDaO7dX9+XyTLINMKeYKll7bs\/5I+gm3CG1TOLFiEnf7\/JxuYTY31BRrwlxm9atEAWVasKqVkg3fkVMrMiuqVVJJK6EpHbRLGwWmJvuXhAznuHcrPkxlyTKM9t17r9UBMVg4HGHAjdbsarCrmEa2SrqX3e2xRsRbpqgOKU42XV+7wI7WpD9ct4JF+Y6hkgDIQmCBMTSEPElZragqMWGHRvBRvqwSUEUaNji+0tMeSNuwv3wlsKv8NUi9+itPbmFPCj7cChbSyHXfBu5\/e8dpFfBnPHIQtuBBo9nmtcWsOo83rb8xtf2XKZsTONs9ACNLcgGZP3I7WsBn6c0T3SQFmutfSR49cvsAcePILeRW4j8tvyf03cgO0AHD6lHVMlepBdUfJPjGHlv\/q8T815PQvTHZfRSt\/Ldkoz8N9yw\/K0xoGf2PkrfRy3YRZH9FBiV7kk2g9ZFo91RYbbXrGANDePHR9NEI2OiO\/BfqPlhyPnzUM8koYHLsoglLHM0hYFqlohZltJ7XLVYrOZyHKc32mFO7IFwsLuCWWu+zT33rzx\/BOlBPvj93Cz\/GMwSD73gR7KVtp7czf\/IH\/cDQPSD3pRjBgA2d0cgU92xuLx9MfhI\/TlF6R9Llywc5W9bZBwt\/6jnSMB+ldhS0svC6buEwtV0nLXGXALelufMnTs1oJxcXc7Uul1vFyabw2Rx2MCP5TNnKMdngCw4e35vfu6vJ1RMzBhNh6V\/Y3hP+lH5YsZlwPt9ES3ju5yC1IoCw7NHxzyXx1xW3dHasjt7sB70s9tNjVFwJUAAErziD\/6iVlMPPvlz\/n3yl5Q++RB7HmqHKTe0wCO6iKKxQ8PHjMUKxiINgp+D8beyL+MzILUD1KhyTHhD1UNHL9V4RbW+rVYG7zIBu5mAS0zAZE0dM4jG3fO0+RwUZ3AH5\/lRzkvjDB0uwy5yJGojzxlYHRs8oQHoxRe48rJjWKrIi3Wbrf2IN0EfGHw9YF\/GRw1rKg6MxrbkN2P8iwEpscFTGjDwTWj801jSw+MBmtg82YSWFwODxAYPb6jBB6EWvxFzXgx8wfz50StZNCxLxklru7TXSkezdE6U13X\/RjPgEgBnI78+mm\/NL\/xOv\/f4g\/5Y60+wGTLA6\/0b5uhU\/MFov0YMSHBVngYeO\/aarOH3nOgNzJQU64c\/cZV3dT2CVTUGu0ntMZLWDFmU2flNBIc7YDoS9zwE90yR1ieSJ6zpe2ogbk73vAd\/uxy6v4q1WLmj04t8eMTgdzgccf8\/jh8BGPX10M2VzsbR3+ELW07g8X9pud03j3PHUX4FgGFAAHrmqf\/mdEbYMHk78rt9Ju337RMGMhxti5Fkw+1Bv+R5cVN+r++Q4sYoZt9woQPZ3eBOdLW+GWFDjVJoqjelDSOtFvpr6hSbwbZsu7iP3dzx3BupTuqlgg5lOMQhMxT4ABfX4G02gDS3nwHJGR6Qkx9iu\/0Wl6TpCiqo+XtY08f\/lvfJ3f12SHPWDVhg1VsnJO+Tu3FUpcZX9iQB9pCxblmRdj9QKOPWUGOsxqayBcR2hYC28MDmhux39axoRsthgJeyFA\/I3JaxmvRDfcrhs\/AK9CsVisgtZNpYxoP3wJ5m\/LZ\/a2PlYoi69g8sC3UvhTC5Uo\/e2jKrdD7y7PPfmGwqGK7laQGSZOfU3Z4pAchZsDnTMpXQPOX8bmc3PofqZ0HuudJD7J3dzHUDXeRId0B6dQ5bIVU3rHj7wI8srdaCrp15i\/7PYXy1f5EQQFDQMcUA6AQA5OlYOWXIV6bWAkvtd9yDMKW55Dz5K2l87\/ZNS1vbti53awQNtWXYvAuuZrP31X7e8m3YmfVSZ6bjtvjP4mfhvzA\/mc+an1kEhKOEywk3ED5FqCA0E1qdM87Djm3FEYUEiQeIU8QriJvW+zYGjZCcpMWkA7YTtgu267b7dqo4ijyO3ECOkOeSWxNPJV5KvJX4237H\/tiBk1SpF+UblCrKZMp0ynxKh3\/ef8p\/yX\/LjzleOF3Ws4t\/4Chz4pAQoSjFKCmSJ7vJydInj8kbEhRctEZrb21a622zrdIaMGMSulDGQ3gS7+L\/OIMlbCKEBLLAQUFAE1GlatrVpB5t0gE9q7iNmcpKzNpD9rS9Yu\/aJ3bK5s1jXvNa3ii3+7GbPNN38F4\/6QuecCEsLGV1lpylZ9lZLlZmClOdcF7P+zkdT7zJhS\/EBnthy9hWdho7p4GG+mf5c3D+b9VJL9xrro2bxh33n77vVU7QTAqoIcxMvuBdTrNOEmKjPAnPyZu2zr0wzxIrrjZd8C\/42RbZ5DTn2eaDfugJz7mi0XvDQLeNBHxqAeHqXw\/29rjoT\/N\/Oah61wO\/+GsNmw3HaQ34tABynYPFkf3CQBdMa36f6jDkfZ4qouJul8xL5GL\/HvuK2GvEdvxVqGN+Jo1ogoTp8x2y+mHpDnQw6mjgcn7izVV\/QUkHz7wr43f\/GbZfApuunAskkb+E9hjS4akqUZSYNk7LJVsnPfr+Fe1Of2Hh6Xe73NfFSTDW9vSlWTOPw+HzGDMr30jFb8Bl0fUKUwh\/nEAIvPk2u86SdONUb0Kj0y27LyZ7B\/Lr4LVAMqxEZ\/+Y0qpYQLWn7f4\/Hzyz7OUnoPk\/BlSzp3cPF3mNUuqMEiBnIq2o4r0sWO11MUQimmSN1hClbz0hE55zaU+CTKVQwLpB9KS2m1ET03lw3\/Pau7olkFNIUwwRhLnVvkJbZ7Rb8F22f2XZi4+nX\/x4RS8X9Ftzb1rTW5qDCMU2Jbzjuw0a218y9C3lwP8MkrxNhDRp8rG32GGHHXYi5d5lvRYGbHnwygbssGuIQMvoT7T7y8vHUE5zeDQa\/xnXwhxiBDyXJDsmsekSUomoVa\/M\/A8WoCIbDeU0RdKNotkufNl64tKzWXbEV4d7ms16EnwmI26PF\/mfXiBJPM2Ac3AHQHrqhlR58W70c5CytJlfJD\/hfOZy04hUnzE6961lrZb13SCkZxv\/EIhBLvYdwGX9OeD6km1Pa98OFtbU3Sd2\/+8y5MrTNC5ZaEqyPzRXCQ1UfEqlpRk5XWUpaaNX8a5fnUFFzR7BMx2\/Jp2Ghj2M34\/S7p2MKNGN\/FQMJ6mW+S21JTlKkqCjN8MLneZwAwSt7hh7vJMmz5uCz7U2kQE7npUEHbfDVWNQBUrkCL9XcXk4dPKBe\/jGYA0AsSPrAlMtiDL47BM4TYgBHJPE3UKZoZWIVSBOlP4E+R1j41prHfhpRCzI37cjJ53dn47t8RUeiJHAIlVR8JOVr12iX+l9\/5\/rK25vjCwz8KFVPQmQ4u2fzQCcgRAjJGBBgBAZajUpIb3dcPC0rq5YK2pNw2y3F8eyVc9lRVkEpF4mBgAVAZLgnTEC534\/78wRtealSUMOBBBt+pd9LvxUF5Jb2yLHNZoDiFSA\/cMZuIteakeqBVJrbJDt+Ug6OkcSOwPdUOdPouRcfX3AeTKn1ZIsfuEoEdSniSQpIXqQj51yaYHT6wOXTF6XuPLslUPJPeuWZ3D7Dc3C1PdPxE68+sYUdGvDcrhUA9u\/rtIz1mNT2UEP5Vsl+IexThNHWypTiXiBwwbffPJjYJeBEJVxNXJ\/aS8bVyQYP57xMmc3FLAkwo81KkVQpK2v3r+ZoOreTPiXlwCNx\/7T1hToUb1dhGkZMhr10afrg7fCp6EJyJouUPc2KdYCj6lNiJYDQZSPnKiP8qBemh6JVKbHfnd+WBe99\/+evRDtFX0R31OT5gtzU7bsoEaPrQv+Xc4J4nSFMlAM3gytfgkIWbc1TeN4LgHHfv4MAsCqSl7iSx9z9xyNyTOptt3cYCd\/M1o9stwtGq\/2XziaFlJSpWDI71+NGC0roFpRRxxpNDwFPILbJnA23Y9lNdSFR8U9j29FYkWWU60Co68mMfcNdrRZ6ddhaoOCi2+7O6IFXCfO7Qkl9qyJ+biP+Mhykd1GjcvkEaJvaVycocryb+iIRsIAL6wTTYwGbX4De+1sq9b+XGgaMK2C6eBaiwa540+Fbk6S9SWOSwyhZP\/9pD8afqqp+PdaXw5xh0B+6AyDLrfVP18Mg7GHN+zq44NsyMxfnQOWqz\/i7r6r5GzjRkDvVhyyTu67vbFjSPQZxSJLw2CnTBz+NKxjuM1dQiZ6YWPkZJv9HyBbmiygWH7CEIl3ii5tGE7o9Lpf+UNzM1RVICKa35800FYnwUSQFsgfrDMan+ywl\/Vl0PdFT9Pud8\/DpvNHHeWEClBQ3okAdAJiCFhrMmPrJBtOy3QDbwbkBlNfpWoEJAbMbLxJsYo+zFZRdanVLVCDgtlhDjwXgbwNQXCngouWur1koTTeAo6+Fk5\/ltGiIHV0jL1RId0r5XBEMVTp\/qsPmK4iSMhA1NG\/Evk90BupmvJPELgAY3Y4CwirEQi\/LzjlK1GqpS5gsLRQArnr2SnVEE9FW9S5HeZWfwswnfV\/7os5rs64ORKuLkxixaQSgo38rnyh6+IHpYqUtXBNlkeibSOZhmOyhlpRSKcnTalCJU3FsAku3CrjKEanzMoVLYnSxcLrL20tITxTdU3M\/GOrKd6mtsKQDeIyHgvALYWJcZe6jn64EAU6AoQrCuLFi\/BlQTkfxMvlsXSIjMIYC0uYZrawDQ\/FmfRDkQTZoYrcwusFTYVaHwmM8wvbjvnGUejgPvb7jyrgLhbzYXRiGCNhDsfvZ90IfPy1TUxUPxPz7eUf+KsQlg1\/2qC8FjzxO3Y0H6hwLpw91AdzGiFxtLF4IR4v0y4C54hY1Tglm50shcipYiEGYPuHUwtoTHX9CjK3VofhBM5hSpa\/axgTIWxLK6kqv7ag3G1LTrLZkpLp23P0BYI2KS\/CSFtBe0CobYDI1r2XlX4uO0qFvKhYArQKo37VU1VIVhA2j\/kypDy\/YlrHAZotA6S38CC9sPRRaD4uAtWcGcdRmSpjDLoPzQ4gHOXb6CgiSiTdSwSZXVvcfmPS36tb+YGnwQvJfiEoqfpgA4cZ1AOfWYujA5JrSdTQUXGZBZFDi\/lPRu\/NfYhFn6BAOcsjmzPGzKFqrnbX8Wzmox8\/XPaun165jimOGRfQojxqxzA0RYy8nBkvWthT37wtBnPrVOxjw3W4bfoFVUxuLOLtQGc851aueD5cqnd6WomTWaIspzpgSlcuped0djw7dpNlZjvrv3LkTulwUHmUvG62Na324V81atcSVevFXq+e1EAiE2waNPzQL3EKCHtnQLo93aXyKnJXIO3XvdCVY5vbbPX1FlzNd16j5RJ+tfWDLcoiL5gIU5l1Ar0nhX4DgjJW+qG8b6L2CkJ\/E0guqMsl1CRxE2iqnAxUm5jkC5llMFAIMIugl2+Hh6oaGlXuvHn3x5nlALzUrY6muDGjAUmppB10SvxD2S2ZHijcW4XAPHm3aLyJnFfJJa8JPWAJzZg+o8YCClYz0tXa\/Q319XXQlBlJhkPoldFzEd4S2WQVzPGY7t\/mhnT40twn6DZXMutCc80FLFeTX\/4powLpmamYxbJRjep+e+33GPJYGQrTXZoF5LL304sfPP5ksq\/T5FAR8Bljcs0v1C\/HA1UulIrLWCnXGIWnJzjEpjjya+crta\/IgEIaRnyKqcQe\/WcdU4iaClHB1jOoQtP5Jino+v0AQGf9\/SA1l9OVsCqKriuM1jFw9mgs7P+JviTSQiJLPXdToNJtBcFIJfBem03dHJmGBc426SAxERSrcyQ2YWN79YFR\/RewgUSU\/o74cejFP2e1POgcvwaYZy0wxoLbMHLlyRnEiLgJcAL+ZGnh+t3qmsri0sLC4qLsQFZ29iFTCTPPUozOqtywIjV0oyBhZUillkq+GBe4btuUNZID2xJlpVUFo7yOeLN5vbWHNdNWHnJeQz8lrK4GQsT5GSf97JmEOo7riPF\/ftdYf\/xQs+F0+9Xi40s+QKJ6D4LOStvK+w7aODWhlk1Q9dLpEBFx9HyzQiPzotRe4\/Vx0cgrDeN90RW6YhVUYyDm8V4dcCSZ9qQHC699tzKY5tHn2NzlIdLeAm03ZJYrUZq5W0dQw388OFQihBwBgvLOgfZPn1zPdese256Nm5Jp9VgnjtVVfUljQ2NQD0pWOyOHdp3Oc0Fle7Y7RbkSej+ZGZd7ZsaJrDG1ob6qqmEhsR1bh53T\/c8ulmZ8rlwj7yQczyUvI11p4lLVqKk1KwVnhBAQciLhVVqW1VnQWAQYphaJOCS3HXvVtuuTPPCgje1gSBqpShlXxXBLK\/jX4T3DN\/1CLpdmkSThxMRnbY1nP5cuhYvvQl1Jo2hZqPNsg0xxMCmp1hpocuw2zIyJlRQgYnZssNk9bs5HLzP7FZZJ7ZSrtQ2p9dT6GZbERXtSJJZIzk127NBQgyYUELxdZPB8kxs3LVysUX5vhsMRj0eiIIPd7qLjO4oWtVV6BohFpn+5XlkRXNom4rD5XLrZqmyEkq+L\/oeuVmUIF3mrcWPH+cGWq9PqFC01GZRfjjcYPI3PNBuMYk+mFFKZNZtNfrru3n6kv7FThMea0SQR9LbcrTTGEv1WzZfHUMsFN6f8u+oJ0YM1IZ6xvL4N06dFsBduqWqiz7ATSxhbGENosMC6af9f46+mnh9NAr+1nKzsA+Nquw0PeWDWzE\/7mI13TYe2FbZbJ\/3doBMyqEWRCMBLj4wBcpqMN3kvAr7OuE\/aKjSp5nugkDQ6ueUBs31cMMeXmoAxGv9N7\/93JvTSxbu6F2ZZ1mcGItMi9nmPr6K2dbLGmobYuH6ymoMjdNb\/IudMACGI4G0A15zRmc41MG01asn7DazfwcpDsevo+6Uyb\/BMUflAUCG1kYUe8ILKZTKD8e4CooKixWIVMG3Ul6hmknBBq3LSJZ69PT8C8CNAZJWJo5lFVcGwUQgtSgUIYzi\/rQgRpU5oY6pXDba7DMy4\/Zy3fSTQnhL4qZ85xoRAgjBCmsSrSJvpwFnSmNFK9uveDMVn9xxtnpC5W2+GdjCCYGm8eKcbUBY541lex1VvjmgKPXUDFVZzjWltWvu5SDTtxg5Kk2siM58r+ogqKb8cw3Zas2A9f7Ccr830EhCx6Ljfm1dTy6I0Kmjgg4+hfXN+GympcEcOh\/vWvXstlY2NZqE6F6Y1IuS2Y98pSJah988yijiUGOXTJ666JY2IzuErO\/JV1saXWVKhJKcm2rapEYOU2SOxt9dNqDuzyCcw6c1zRBPqi1xw9ps788brzzw1z7ioPF1Zo6gKrcZbKGaTPrQfWbpKd5GNr8UVpfccopytB+F7jfPcdLCwTWxmo4XfZHIG42+Ye7SObZ4T1X0iX252Rq7DqIZYyoJYa0fZ8c7kYCOyKawbk7A3FiRg2rXzR+kOkSphCfeyEsK2qdAK07x4q5S0cJxK+0zt9mVMnlRYkKTXqpTQSGNNRSt\/alZIU1xOyJ4TB0pmbdXCcikcpVxqBPw68CJV+kqLEnWhmSBGYPzuhVqaHF7AEmFZ1RaOH0UD\/\/a5Db\/8wV4R74V9EYhnEXTlXBhsBoK8DW0tHJkuE7FOshjiyBT4H\/4Wd1Eild7JFeiOKVNo1WqRSMoefvmKzoHxuZLldxwtLla8cimm4ikjUgFamSUOwcXcnqKxpIcfPrQpAexrq28mURgTbVhuj5FuBUMT4tXCK2d37qQ43e2Vg8QJuWviXGgmuuSE\/LZr3gJKNjnKE3mJNMEqiEId4TvuUq\/yTsZQxqXuddud3jWPn8rUjYRsLJXArGdO\/TC5SqJWgDIzkVZAvoK7LfUcgjGxqJlga1\/IdfLjhtY3tTk6lZziHyCadpMyIBdkx55bGUSQAS73lln9XE75cw7s\/bDzof1C4UaOKpC0jI21PNbSWOkpVgCufw8YaXja49SMqRGZLJFPOWSJHg\/8DInYn1PwMXuKONlUAF3k9mMEBSQodl1QNDax919v0grT945\/L6BFRwD3pLZP1MfKpbUxigaGbQR6XeQ\/HEQMH8RCqlCRiI4eL5omtvBehTYhoLckOweahi22sQE2Ed\/jdSeteJnS6YBhW\/kahcZsoZgTIuajJl9mZQfacUYs4WVbjGIATa8kA6BRNJ2oGfQoHw+VxRlN2VjP1SGybFqy8KgfHRm5Ck3UsKInXdYhQQ+KmGrTAWLtRezEBJcdqpDcKOWRHqVpht4BT5KKyxPhryni9xUalsfdlCRINW6cwzWTn23ll7siuYjMHZEDGTvyhqA3N0TXboHbN1Ao7PAaVYy8XIyouJeecMUdF15lrESXuQSlWQGtiU2FEIMha0cpu6QSQxIUCUXOl5aqEkv\/6Otm4wrlTYJHsi66BVTmx3tg8H+5WQKviXTdSDY7UFyCRaUSsGKHoEheLabUOgGjOwcY1lptWapS9RONJ6JBZBsRgUYRgRABWzcJSS5wtkzFNsNAeHuD4LvxwP\/KOGcXHBaZP\/kC7IOR214hSmlqbjzdy7Ajz\/E2hU8rDEm+8T2mZjdB2uslRkymWC2KQL\/qHr5kSMZGpbWwUMqyXem9Cq4XTmbjm+QO2cSXIVDlOeshno3wOHQ+hzJsy+u4a4ij9AkxNTI5ynpVVgyfxh2hBoatiFZNFCWqZJqSE170bm+1VSAPGfUEtF4LOkMnozgFqRuqjguf\/f0r7RMBFSiXFhnPDijrA7mnMgZCBYZBepT3z9OL6IM7GJDl0pOFz03Za\/U1inxQYVXOW1TF0zC72KmM4o2YN4D7o7jYCn6L8SA3ngfJpTJX1V6pSg1OFyXoUIwoRx2ByFYC0GKj7505u5l\/FeQ3Z9+DYEtXyQzOKnGpEc2gy+WH6IlU2noq5rhVPLLXpsJka5459SMPomMw4vnoLU2cDruXtxOWRk7eQ8FQkL8d+p6PXYtN0f2G\/FUNoGK4WDgAyGCHYsTtqWeNqTh8u5AukQdMa7652jdgyt3tuQ+sZW67iBwU20p5+aGHmxRyg9pAWV95R+PrrNA6fYECAVJUIAEWFGPAZ+kmIpV+EPO8BE\/\/X0wwLu5LGqOUhHg4yltVgWloDThVng0F7ZT6ehhXVlBoZqqh7astcUxLnIGWSAYjZpFbEeE5v5gDLNZ+pZJHLLJRYaglmfHcERcbT8an9Rn3e\/EXW3PvY8bcVt5OQLlE\/QQwLTfc6OSKi6EN0YSKlILpLrgOHINj88tcm7JkBiySsUhtrihYfrerstqoJRY1wgSirr2kLxYyzA0twGLh+x\/TuQsX2Ww8bHtMwITchCQdvW4\/zPzficMyoIegj73F0W8lxgHRdpsf3JR81Q3L7KgTRDkk1qwKQ409jWIYGUfbZSZUDYF8+QKQTsGl3eChkZ+zUYAzKKmyphPXXBpb\/Wb+RllPuCNdYinHUMEvVonAcwFZkIhIuQ3+ccj3Oi+ES0B5gXFlrQOxIBzXYcixCL07nrNSE5k5LRMdkli1T5Ybk6FgsPSNe5dnwDkYPyIYBAdsrAyOiEhZOg8IyKMQjN6LI5RaT22QPVepWOywyqBGr\/bP7p1zWdqBP4\/yNs654KpNOvZ9y3DarfLQvpY7FpwLrvna8AtyDUhviWw\/KQNeAD875c1VKeDlDZjc38r7HMTdYrN3TV+DLHgB\/AeqWRE5uQuTyS9B69LRoSaw+5Teb4C\/nHhvySLYIw97YeR7aYK9ATB8bhtU22NFx4ydq7KgWvpXzx2c3e0wrtp7AYhukXvwk4y0ZZwXnjOVpJZkwHNgV7S79nEPdRPmD6P8T17o0PWQsGcx6kXiiOdFdWf4lbKLyv3JJiB4FZh5NwuadhxDFhxJgEATVp7WHXCGQgEmIYIhR+88rRjhmMR0FTfPuDteIftQOZ\/SbRPxeEkKPimse1b78TYBj0gZi+VyMV5HE93sNBze3vIfGDdnIgkh5NQYpJWlezf3uFEJsiY2mxoOruUBc3RWVo4PZX6vwsp9Ev9wN0gHwFCrjUVxvkpQu7OxLCUxqNIypUkCkzTRsHqpd2m3HxHZBhElZWowxrgyKzRcA45Bkun0bakGCoixNXgzlTVXoKsXC+BhOTQLYYRgOtpjuPWv76TUIs1qHl0aJJrPeE9uWEnW\/YljsLTfgK\/XtZ6DIOngdAhw5D5IXQfIVldZXGmRFzp1bCBE3BeptMC+GeQvxcBq4eLvAqtnt7Y1NPjJx1RP+s+sOilc3faGEfS5H\/w7JRVqOc3jaXEgHFk9vckCBn7wzX4FdT6+tGle7N19NBLP4K\/9tp4ku1A5TC1Gh5EAXfbuKJeE2kjnSElWchGOEmSuST80Ql5MvZz1JHqjKo1UJmD2+F+8lND7WRIV7EyoupAuYC+laVeBZE6WEj5eC8r20jnqEHV5v4PetbO4qISXSRaW8RLJsPSjF80ydLVK079ZtcrZvrRzGaF7RXWJlmY9nqV7PMOTGc8pvI3XsmRDlxAPSBgNcARus3lGGxA9bHmYEjC0suNy3DYgOFYHrgse\/\/714hwD0F5000piAVVASh8DCx5\/4kc3RASsdilfYEH7gpTCf22jpMYrKR0QE6IlYHBYVQSNkmxqRk+7Ms3zEFnT+Dj0mqyZ9nvOKDR4yEOYch8jSFasa3Vdk0ZaisiSBKalG5IoMBTdGEGsaWhNtdmUBYFj7zmSbCIqKaGa0\/WDcZSqOgcCHE61GXLXo1ITDQuhhcpuh0Qmdz7sABnd+Hn2eWEkOGeu4PsgHb2R5Odn4ATLWrhKk0kZrdxj4DNjKUyEiCNiKcclfwPAX4l52EVaGAa6zcrkojYcktDWnC8C6WeuLV4fZV2fesz70FgbE7tLhnnTdOpbcyZGoif59A9unmaT0ZXG1oxS7xkZfW0Wpt84Mldx8565UGM7dm\/FGMDvkQ5XOx\/ux7Yu\/H8X4WIdFx6huEEBcNtsDUc\/vZDz\/7809Dn6HCYKp1YZ1Tj5vSLp0ObT1ES0WCyREZI8w7XIV7fktAbZULWxV\/Fxw7bF7e2DUrgPxyOQoPgMadWVFUnigUwknSnxvMqhSfk1mYW\/rjFEOlQ6qVzGIXSgIRdK8uPb8gYZuhlRU2aorv5le0Rrctc0YajQKKOONaD+LhzyPlenNcsdQaE9e+R5KbWy9tW\/THablLMikcgEX4qcRwFD9eKhqoVQGEJ+vN6kEvoiVkSBOsXrPfizHE6sZV1d3am01OsFAYsGtrGopflBxd2ezyq7+BGdF2KfSeIX\/Mb607QPjs6rjHdIjxxSndDhInRwwaD+KeigTdKA5HhdQWsEFlqcUut1dyq3n5pbbyTtb86c6uh7f8u1A1JAHfSB8nO9fwOgIUJ\/8vKzYHxB+EsQM4S78jQB\/vc4+Td7sUHXx18CKEvkVg5Lrx2U3XT\/tR\/9o8hGEKZYxE+mqDTdz4+P51NrNX7vTCY+yjGf3qzKIrm2uqk30KWl6cSDACAByGBBMUwrfdmQIAjN439HXBi\/xksNgDLvz2vh+DXai25Bepp9NOv7WLL\/Lkd7k17ITjtZf9XsG3fMDQF6\/waU9APmJNkoPQAa6jGjvB087Kaem3ai0pGyBnt4O7OmpDg0utCfV\/hcGUj0TymAbXzP13w9sW+9x294TD+XwfrIyWewdOkNZ0JIvGoaimXHMmuVMpNKfI5cFH2yfMPIYF5ySP1mMOgAyp4nkLCoIWrOy\/tUOev3y58x48\/mv1\/I1PJsEGUStZotjqsvedvMmYB6ECACNRgiQYAS6ruJ+UDwSPhSnsdlsbuyAhifjwXq6wPIsNTo2NiPMxnRbzSy0zsKCKQ3VasZt2vgHg00A3qKdJslS\/cgBa+3AAkmnO9NehcPGOcO6j8oYj69DIoseufLS9qde+ix82duuKxAmxE8c13b14xPh3nN6iR4cwqUzaEXFIzGIuXHOf2ebrVMLvQ8s2s4uojHXIeztUyXacmBLrpYF7xmXd1XDse4QVIqCzTtXit3+VyJLu9QX7srTpt0i3F0fLbDg35u5uILO3U3fTD0uYHznNWMv8wEoT3ZzmY3NFODtqG8A5bVGWKa4owQceb7CUDQ0fEdENtBY3jnmzmJ5Apgt4GXf1T+2kxjmBpNkbv7RAS1IUFVLYaCUKhAjdGSmKIrzAqGgun08v8eUhuhWSmFmqr8lUJ5QxUKUR6b2jfcjXXUXkgeWUSQpnZaPsZQSfYvFZ2ifBK55+rljqCWrUh1UrVYiIs2z7BHpUJlNOK24xRrG7318zJJGGkpkBVkEkE6lCm06us16uxTLjEh1u97DbE3GjsgHRpdohvb4HsfDfEp8m839Rs8lx32JufJUShXtcVJWqbwDP5eWabAwet15pCSGFYeZ5JZMPcy430EHyhQuv8eOH\/uTHT\/l\/DmFwBf\/FLWA\/DDiZl225a3uis8HwE8FACBb+ZhOUeuBLOegXckX8KS1BeE24W6DJjvD6Z7CvcoO1uWzvsTNm+JMAEJi66jxw2hELRuIMaDFCc0pR9PoxsLFwmuPJn01AlMyzKYGAZ2ZtbVVQ8uRiFM\/kI3cVSKqi8KheqfqOahoG4ib\/zK6mHPMyYGVsvB6lNQCQx8UPRo5B1pJBMVmhS4xEcoRrbAvGxCzXcnixOHGSQaOa7AicAq2K2mp5UFMxUkuM40FwjCQe6IZCrICRYfz2sEWhN3qMkgga4KygtTroz+l2nJI09zXRcn8dcyqierRFYb82DdIhtbObA2cDNezkxlDNAFfmiAJKiBAITAY3enizriPSiFvExkzZt5ZhpLmlyVUvK8xbReeEU0zo3CNZrlhK3WPsXbDWJ5t3R7wDPszsDc4\/PExHrZoxG+8dxPWw5BDdk8T7g4PXydiSrwxY6InQHEN7SUuzrgbAzkEWjKuTHRnsXcIbdwYdB\/sPDWaoxkV78ppTAtrlAFVUhaYCP3ulRC7e3lkrl53XLkQ02HrSCyHMQeHHsvR1Q+rGLBOjj6NrSp7KUS6BJqQAXMTc1LoRm6Uu\/ye7eXzV2JoN17LTLTukooXADin0jY+YTvZWAaHAVMfnd+Y3cYCBHZAVUq2JMjqhMAbxFIXx8EJMk2SOyLjBByw2br41mv4CSBW3IpY1KS\/w4rGXkgbJiSTqcjZq7Ik8GTg+EMsyKelEeV3P4EQnGcfsCTcjrhgU6dhFM0uxUOCfksnKbRznCGnJXhLEUfhHMo9IXzhJrDBRy14QoqrnAlKlPCVcT4rJpyMPIaVGBLLV4zQbM8M00wVZNJfJo05D2nq1MHkykwwTFlXVncnGMuwyaQtbRrCOcqFjd4R0iUL1PnNTGIwR6RolAE4WPM8lpWuQiUYuWzzMBLqCKENba1hWuyxD4yYgYXK2tJnXWa1StrLlKUaI7NmJilsMXpGrSUq2KVeWi6GUS2UMHOwjY47evoNAHFAnKOqJK+wCsVmVLBs+CyecVEjmrUtWUUygXqKsqyoGRaTE58UuHmDLOQ4C3At6xgQKW5QZOw6ywTWUxyJmYVonP+FGFTEILmcw+bx6qedhjhSF5QfCW7D7MkgXb7g+NlE60wyUof0dIJ07vLoM4+BxxkZBLP7JDDjjgKC\/5bQt3+enbHHNfgpI+tslqiB5Ikf7OozCmn9brPSOWSxu2+UbI1BWxye92v+VEOnxa57vGLYFE77RvQu50102xzQuAoRSGK8U2mPrxzlZpngYXm+8kia5R5qFyFSm+rUm2xVm2WqBEyWq0+W43xne9xv9WV\/o2i\/jeWkIYsviQlkJSEkpaMZCUXO07c0HjxEyRMlDhJ0uKSJU+RMlXqNLbrt9RQtOnSw8uYjNhiaSKzDIHrqfzsH29i4FGQHlPxWNZaJxONkF2N5+H1r\/+st8FGm\/zpLzvtQiSgTQynesO73vGeDuPc0WkHskzwuq5gmPztsUcoKMl9aqkJMmJBkcnZSsheYkkll5IjZ6m5fCDL+8657LwLepL2dVLkN+EgXOgXHYpaQdQytUh2bmclzh490OY4LUvL6wJpzZz75duK2mi2LMKX+naYW\/H5htbJaM79dI3Ehs7gaM9eZ0QreiGBNudCwp5Fp+DkW+TLUHNemogEvl8qJ6WZSq8QKVR9oeqniBRd8vEogSYCRYdKoZlCIdBJh6pDodDM58rTxG5GeWnMcjdE7eMeHK7tJYUbuqEFPgEcenRii3T0wpyuQZncn720tLj6HI4H85qmHPYrkjTxQndbl6kNBq6THdjIh7jM\/fVm3G9NIC+l1oZzQWTbyYJ5zErL0vqRHnCVsg8QpwmPbg\/SNlHWUotv4ssVuggAAAA=\") format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\u003c\/style\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:880px;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;\"\u003eAn 8-day Georgian adventure built for travellers who want the full cultural and natural breadth of the country without the extreme physical demands — a qvevri wine tasting straight from the clay vessel in Kakheti, a private encounter with a former Minister of Culture, a 2-hour horseback ride through meadows near Tbilisi, the iconic Gergeti Trinity Church in the shadow of Mt. Kazbek, and a mountain hike to the Gveleti Waterfall in the Greater Caucasus.\u003c\/p\u003e\n\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;\"\u003e2 \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;\"\u003e8 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;\"\u003eSEASON\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003eMay – Sep 2027\u003c\/div\u003e\n\u003c\/div\u003e\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:680px;font-size:16px;line-height:1.6;color:#5C5848;\"\u003eThree phases across Georgia — the vine country of Kakheti, the mountain world of Kazbegi, and the ancient stone of Mtskheta. Tap any day to read each leg.\u003c\/p\u003e\n\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 style=\"{{ ph.cardStyle }}\" onclick=\"{{ ph.onClick }}\"\u003e\n          \u003cdiv 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    \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=\"8\"\u003e\n          \u003cdiv style=\"{{ row.rowStyle }}\" onclick=\"{{ row.onClick }}\"\u003e\n            \u003cspan style=\"{{ row.numStyle }}\"\u003e{{ row.n2 }}\u003c\/span\u003e\n            \u003cspan style=\"flex:1;min-width:0;\"\u003e\n              \u003cspan style=\"{{ row.titleStyle }};display:block;\"\u003e{{ row.title }}\u003c\/span\u003e\n              \u003cspan 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;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;flex-wrap:wrap;\"\u003e\n            \u003cspan 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\n          \u003csc-if value=\"{{ active.hasStats }}\" hint-placeholder-val=\"{{ false }}\"\u003e\n            \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:10px;margin-bottom:18px;\"\u003e\n              \u003csc-for list=\"{{ activeStats }}\" as=\"st\" hint-placeholder-count=\"3\"\u003e\n                \u003cdiv style=\"background:#F6F2E8;border:1px solid #EEE8DA;border-radius:12px;padding:10px 14px;min-width:96px;\"\u003e\n                  \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003e{{ st.label }}\u003c\/div\u003e\n                  \u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:16px;color:#2A2B2D;\"\u003e{{ st.value }}\u003c\/div\u003e\n                \u003c\/div\u003e\n              \u003c\/sc-for\u003e\n            \u003c\/div\u003e\n          \u003c\/sc-if\u003e\n\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\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;\"\u003eSix 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 #1CA0DC;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1CA0DC;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;\"\u003eQvevri wine tasting at the Vakho Oqruashvili Wine Cellar in Kakheti — wine drawn straight from a buried clay amphora using a traditional clay bowl, in a family marani unchanged for generations.\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;\"\u003e02\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003ePrivate encounter with a former Georgian Minister of Culture — lunch and a tasting that goes beyond the cellar into 8,000 years of winemaking history.\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;\"\u003e03\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003e2-hour horseback ride through open meadows at Ferma Village — accessible for all levels, with professional instruction and a countryside picnic.\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;\"\u003e04\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eGergeti Trinity Church at 2,170 m in the direct shadow of Mt. Kazbek (5,047 m) — the most dramatically positioned church in the Caucasus.\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;\"\u003e05\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eNekresi Monastery — a 4th-century monastery reached by a 3 km scenic trek above the Alazani Valley, with panoramic views over the great wine plain of Kakheti.\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;\"\u003e06\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eRooms Hotel Kazbegi — the glass-and-concrete mountain landmark with unobstructed views of Mt. Kazbek and the Gergeti Trinity Church across the valley.\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 who want the depth and authenticity of a boutique Georgia expedition without the physical demands of the alpine itineraries. Active and culturally engaged — comfortable with a half-day hike and two hours on horseback — but not here to climb glaciers or skin backcountry ridgelines. Suitable for all fitness levels; no specialist skills required. Minimum age 12.\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-layered cultural and nature 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\u003eKakheti wine immersion — qvevri tasting, Shumi Winery, culinary masterclass\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:#F6A21E;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eAccessible mountain activities — horseback riding, Gveleti Waterfall hike\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\u003eSacred architecture — Gergeti, Nekresi, Svetitskhoveli, Jvari, Ananuri\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\u003ePremium mountain accommodation — Rooms Hotel Kazbegi\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:860px;font-size:16.5px;line-height:1.65;color:#CDC7B8;\"\u003eGeorgia has been on the global cultural radar for years, but most visitors see it through a short city break in Tbilisi or a ski trip to Gudauri. This expedition covers the three essential layers of the country — the wine civilisation, the mountain world, and the religious architecture — in a single coherent arc. The Vakho Oqruashvili tasting is the most distinctive wine experience in the portfolio: not a tasting room, but a working family marani using the same vessel-based method practised here for 8,000 years. The Rooms Hotel Kazbegi night delivers the mountain experience in comfort — the panoramic view of Mt. Kazbek from the hotel terrace is enough on its own.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\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 VINE\u003c\/div\u003e\n       \u003cimg class=\"second-sec-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/images_2.jpg\"\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 PEAK\u003c\/div\u003e\n        \u003cimg class=\"second-sec-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/pxcIOzu5LdjIzTH5rFIdizUXfgWlar.jpg\"\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 STONE\u003c\/div\u003e\n       \u003cimg class=\"second-sec-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/43.jpg\"\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:680px;font-size:16px;line-height:1.6;color:#5C5848;\"\u003eFrom a boutique design hotel in Tbilisi to a lakeside resort in Kakheti and the architecturally celebrated Rooms Hotel Kazbegi — all in twin rooms with breakfast included.\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 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 12px;font-family:'Figtree';font-weight:800;font-size:29px;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;flex-wrap:wrap;\"\u003e\n                \u003cspan style=\"display:inline-block;padding:5px 13px;border-radius:999px;background:#F3EEE2;font-family:'Figtree',sans-serif;font-size:11px;font-weight:700;letter-spacing:.06em;color:#5C5848;\"\u003e{{ h.nights }}\u003c\/span\u003e\n                \u003cspan style=\"display:inline-block;padding:5px 13px;border-radius:999px;background:#EAF4EE;font-family:'Figtree',sans-serif;font-size:11px;font-weight:700;letter-spacing:.06em;color:#1E8265;\"\u003e{{ h.tag }}\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=\"3\"\u003e\n            \u003cspan 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;\"\u003e2\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:#E7E0D1;\"\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\u003eThe most accessible expedition in the Georgia portfolio.\u003c\/strong\u003e The Nekresi Monastery trek (3 km) and Gveleti Waterfall hike (4 km) are suitable for most fitness levels.\u003c\/p\u003e\n      \u003cp style=\"margin:0;font-size:16.5px;line-height:1.55;color:#3F3E3A;\"\u003e\u003cstrong\u003eThe horseback riding\u003c\/strong\u003e is designed for beginners and experienced riders alike. No technical skills required anywhere on this itinerary.\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;\"\u003eWhat's included\u003c\/h4\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n        \u003csc-for list=\"{{ included }}\" as=\"it\" hint-placeholder-count=\"10\"\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\u003e{{ it.t }}\u003c\/span\u003e\n        \u003c\/sc-for\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;\"\u003eWhat's not included\u003c\/h4\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n        \u003csc-for list=\"{{ excluded }}\" as=\"it\" hint-placeholder-count=\"6\"\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\u003e{{ it.t }}\u003c\/span\u003e\n        \u003c\/sc-for\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;\"\u003eTbilisi Int'l (TBS)\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;\"\u003eTbilisi Int'l (TBS)\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;\"\u003eCheck for your nationality\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 — WHAT TO BRING\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;\"\u003eKit for the active days\u003c\/h2\u003e\n    \u003cp style=\"margin:0 0 24px;max-width:680px;font-size:15.5px;line-height:1.6;color:#CDC7B8;\"\u003eOrganised by activity — tap to check off your kit as you pack.\u003c\/p\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:repeat(2,1fr);gap:24px;\"\u003e\n      \u003csc-for list=\"{{ packGroups }}\" as=\"grp\" hint-placeholder-count=\"4\"\u003e\n        \u003cdiv\u003e\n          \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#F6A21E;margin-bottom:12px;\"\u003e{{ grp.name }}\u003c\/div\u003e\n          \u003cdiv style=\"display:flex;flex-direction:column;gap:8px;\"\u003e\n            \u003csc-for list=\"{{ grp.items }}\" as=\"item\" hint-placeholder-count=\"4\"\u003e\n              \u003cbutton style=\"{{ item.style }}\" onclick=\"{{ item.onClick }}\"\u003e\n                \u003cspan 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 style=\"{{ item.textStyle }}\"\u003e{{ item.name }}\u003c\/span\u003e\n              \u003c\/button\u003e\n            \u003c\/sc-for\u003e\n          \u003c\/div\u003e\n        \u003c\/div\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=\"6\"\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 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.55;\"\u003eItinerary, timings and accommodation are indicative and may change due to weather, trail and local conditions. Distances and altitudes are approximate. Horseback riding and hiking carry inherent risks; participation is at the guest's own risk with mandatory travel insurance. Operated by Vital Ingredients \u0026amp; Adventures GmbH (The One Adventure), Wiedner Hauptstraße 142\/1\/5, 1050 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},\"showPackingList\":{\"editor\":\"boolean\",\"default\":true}}'\u003e\nclass Component extends DCLogic {\n  constructor(props){\n    super(props);\n    this.PC={1:'#1CA0DC',2:'#1E8265',3:'#E1343F'};\n    this.PHN={1:'THE VINE',2:'THE PEAK',3:'THE STONE'};\n    this.DATA=[\n      {n:1,phase:1,title:'Arrival',place:'Tbilisi',route:'Tbilisi (TBS) \\u2192 Hotel IOTA',modeLabel:'Airport transfer',acts:[],stats:[],accom:'Hotel IOTA, Tbilisi',narrative:'Arrive in Tbilisi and transfer to the boutique Hotel IOTA in the heart of the city. The evening is at leisure \\u2014 the old town, the sulphur baths, and the wine bars are all within walking distance.'},\n      {n:2,phase:1,title:'Qvevri Tasting \u0026 Culinary Masterclass',place:'Velistsikhe \\u2192 Kvareli',route:'Tbilisi \\u2192 Velistsikhe \\u2192 Kvareli',modeLabel:'Drive \\u00b7 ~2 hrs',acts:['Qvevri wine tasting','Culinary masterclass'],stats:[{label:'DIFFICULTY',value:'1 \/ 5'}],accom:'Kvareli Lake Resort',narrative:'We depart for Kakheti \\u2014 Georgia\\u2019s winemaking heartland. The day opens at the Vakho Oqruashvili Wine Cellar in Velistsikhe: a traditional family marani where we witness the ancient qvevri method \\u2014 pressed grape juice channelled through wall-integrated funnels into buried clay amphorae \\u2014 and taste wine drawn straight from the vessel using a traditional clay bowl. An encounter with a practice unchanged in 8,000 years. A hands-on culinary masterclass follows: you prepare the lunch, you eat the lunch. Evening at the Kvareli Lake Resort.'},\n      {n:3,phase:1,title:'Nekresi Monastery \u0026 Shumi Winery',place:'Kakheti \\u2192 Tbilisi',route:'Kvareli \\u2192 Nekresi \\u2192 Tsinandali \\u2192 Tbilisi',modeLabel:'Trek 3 km + drive ~2 hrs',acts:['Mountain trek','Wine tasting'],stats:[{label:'TREK',value:'3 km'},{label:'DIFFICULTY',value:'2 \/ 5'}],accom:'Hotel IOTA, Tbilisi',narrative:'The morning opens with an ascent to Nekresi Monastery \\u2014 a 3 km scenic trek rewarded with panoramic views over the entire Alazani Valley, the great agricultural plain of Kakheti. We continue to Tsinandali for a visit to the Shumi Winery, a tour of the grounds, and a structured tasting covering Georgian grape varieties, terroir, and the qvevri vs. European barrel debate. Return to Tbilisi in the evening.'},\n      {n:4,phase:2,title:'Horseback Riding at Ferma Village',place:'Ferma Village \\u2192 Tbilisi',route:'Tbilisi \\u2192 Ferma Village \\u2192 Tbilisi',modeLabel:'Horseback \\u00b7 2 hrs',acts:['Horseback riding'],stats:[{label:'RIDING',value:'2 hrs'},{label:'DIFFICULTY',value:'2 \/ 5'}],accom:'Hotel IOTA, Tbilisi',narrative:'30 minutes from Tbilisi, the landscape opens into open meadows. At Ferma Village, we spend two hours on horseback with professional instructors \\u2014 a guided ride through pastoral Georgian countryside, grazing livestock, traditional village life, and wide open sky. Accessible for all levels, whether you have ridden before or are on a horse for the first time. Picnic lunch in the countryside. Return to Tbilisi in the afternoon with the evening free in the capital.'},\n      {n:5,phase:2,title:'Ananuri Fortress \u0026 Gergeti Trinity Church',place:'Ananuri \\u2192 Stepantsminda',route:'Tbilisi \\u2192 Ananuri Fortress \\u2192 Stepantsminda',modeLabel:'Drive \\u00b7 ~2.5 hrs',acts:['Cultural exploration'],stats:[{label:'ALTITUDE',value:'2,170 m'},{label:'DIFFICULTY',value:'1 \/ 5'}],accom:'Rooms Hotel Kazbegi',narrative:'We head north on the Georgian Military Highway. Our first stop is the 17th-century Ananuri Fortress Complex, perched on the Jinvali Reservoir \\u2014 stone towers, an ornate cathedral, and intricate bas-relief carvings. We continue to Stepantsminda and the Gergeti Trinity Church: a 14th-century Georgian Orthodox church at 2,170 m, in the direct shadow of Mt. Kazbek (5,047 m). Check into the Rooms Hotel Kazbegi \\u2014 one of the most architecturally celebrated hotels in Georgia \\u2014 with the evening free and the mountain view from the terrace.'},\n      {n:6,phase:2,title:'Gveleti Waterfall Hike',place:'Gveleti Waterfall \\u00b7 Kazbegi',route:'Stepantsminda \\u2192 Gveleti Waterfall \\u2192 Stepantsminda',modeLabel:'Trek \\u00b7 4 km',acts:['Mountain hiking'],stats:[{label:'DISTANCE',value:'~4 km'},{label:'DIFFICULTY',value:'2 \/ 5'}],accom:'Rooms Hotel Kazbegi',narrative:'A morning walk to the Gveleti Waterfall in the Caucasus foothills above Stepantsminda \\u2014 a 4 km round-trip trail through rocky gorge terrain with a brief, steeper ascent to the waterfall viewpoint. Not a technical hike; a genuine mountain walk in crisp Caucasus air, with the peaks above and the Terek River valley below. The afternoon is free to explore Stepantsminda or rest at the Rooms Hotel with the mountain view.'},\n      {n:7,phase:3,title:'Mtskheta \u0026 Return to Tbilisi',place:'Mtskheta \\u2192 Tbilisi',route:'Stepantsminda \\u2192 Mtskheta \\u2192 Tbilisi',modeLabel:'Drive \\u00b7 ~2.5 hrs',acts:['Cultural exploration'],stats:[],accom:'Hotel IOTA, Tbilisi',narrative:'We return to the capital via Mtskheta \\u2014 the ancient ecclesiastical capital of Georgia. The Svetitskhoveli Cathedral stands as the spiritual centre of Georgian Christianity, and the 6th-century Jvari Monastery overlooks the confluence of the Aragvi and Mtkvari rivers from a clifftop above the town. A free evening in Tbilisi to close the expedition.'},\n      {n:8,phase:3,title:'Departure',place:'Tbilisi',route:'Hotel IOTA \\u2192 Tbilisi (TBS)',modeLabel:'Departure transfer',acts:[],stats:[],accom:'\\u2014',narrative:'Transfer to Tbilisi International Airport for the onward departure flight, closing the expedition.'}\n    ];\n    this.HOTELS=[\n      {name:'Hotel IOTA',where:'TBILISI',nights:'NIGHTS 1, 3, 4 \u0026 7',tag:'Boutique design',desc:'A boutique design hotel in central Tbilisi \\u2014 the base for four nights throughout the expedition, within reach of the old town, sulphur baths, and the capital\\u2019s wine bars.',imgs:[{id:'vi-1',ph:'Exterior'},{id:'vi-2',ph:'Room'},{id:'vi-3',ph:'Lounge'},{id:'vi-4',ph:'Tbilisi'}]},\n      {name:'Kvareli Lake Resort',where:'KVARELI · KAKHETI',nights:'NIGHT 2',tag:'Lakeside resort',desc:'A lakeside resort in the wine country of Kakheti \\u2014 the base for the qvevri tasting and culinary masterclass day, with the Alazani Valley and the Greater Caucasus foothills outside.',imgs:[{id:'vk-1',ph:'Exterior'},{id:'vk-2',ph:'Room'},{id:'vk-3',ph:'Lake view'},{id:'vk-4',ph:'Resort'}]},\n      {name:'Rooms Hotel Kazbegi',where:'STEPANTSMINDA',nights:'NIGHTS 5 \u0026 6',tag:'Mountain landmark',desc:'One of the most architecturally celebrated hotels in Georgia \\u2014 a glass-and-concrete mountain hotel at 1,700 m with full-frontage views of the Gergeti Trinity Church and Mt. Kazbek (5,047 m) across the valley.',imgs:[{id:'vr-1',ph:'Exterior'},{id:'vr-2',ph:'Room'},{id:'vr-3',ph:'Terrace view'},{id:'vr-4',ph:'Mt. Kazbek view'}]}\n    ];\n    this.PACKG=[\n      {name:'WINE DAYS (DAYS 2 \u0026 3 — KAKHETI)',items:['Comfortable, relaxed clothing — smart enough for a private lunch','Sturdy walking shoes for the Nekresi Monastery trek','Sun hat and sunscreen (Kakheti summer is hot and sunny)','An interest in wine — no prior knowledge required']},\n      {name:'HORSEBACK RIDE (DAY 4 — FERMA VILLAGE)',items:['Close-fitting trousers (jeans or riding-style)','Closed-toe shoes or boots','Sunscreen and hat','Lightweight layering jacket']},\n      {name:'GVELETI HIKE (DAY 6 — KAZBEGI)',items:['Comfortable hiking shoes or trail trainers','Light layers — Kazbegi mornings can be cool','Reusable water bottle','Waterproof jacket (mountain weather can change quickly)']},\n      {name:'GENERAL',items:['Valid passport and travel insurance documentation','Camera (the Rooms Hotel view of Mt. Kazbek is worth the lens)','Light daypack for excursions','Personal medication','Small snacks for travel days']}\n    ];\n    this.INCLUDED=['Transportation by van throughout','English-speaking qualified guide','All accommodation (twin room with breakfast) as listed','Wine tasting, cellar tour, and culinary masterclass at Vakho Oqruashvili Wine Cellar','Tour and wine tasting at Shumi Winery, Tsinandali','Horseback riding and countryside picnic at Ferma Village','Entrance fee: Ananuri Fortress Complex','Entrance fees: Jvari Monastery, Svetitskhoveli Cathedral (Mtskheta), Nekresi Monastery'];\n    this.EXCLUDED=['Single room supplement: +\\u20ac500 (if requested)','International flights to\/from Tbilisi','Travel insurance (mandatory)','Visa fees (if applicable)','Personal expenses and selected meals'];\n    this.FAQ=[\n      {q:'What is Kakheti and why is it considered the world\\'s oldest wine region?',a:'Kakheti is the eastern wine-growing region of Georgia, bordering Azerbaijan and the Greater Caucasus mountains. Archaeological evidence of wine production \\u2014 including grape seeds, qvevri fragments, and vine residue \\u2014 found in Georgia dates to approximately 6,000 BC, making the South Caucasus the site of the world\\u2019s oldest known winemaking tradition. Kakheti produces the majority of Georgian wine today and is home to over 500 indigenous grape varieties. The qvevri method is recognised by UNESCO as an Intangible Cultural Heritage.'},\n      {q:'What is a qvevri and how is it used?',a:'A qvevri is a large egg-shaped clay amphora, lined with beeswax and buried to the neck in the earth. In the traditional Georgian method, crushed grapes are placed inside with their skins, seeds, and stems, sealed, and left to ferment naturally \\u2014 often for 6 months to a year. The result is a distinctive amber or \\u201corange\\u201d wine with more tannin and complexity than conventional white wine. At the Vakho Oqruashvili cellar, we taste wine drawn directly from the qvevri using a traditional clay bowl \\u2014 the same way it has been drunk in Georgia for 8,000 years.'},\n      {q:'What is the Rooms Hotel Kazbegi?',a:'Rooms Hotel Kazbegi is a landmark contemporary hotel in Stepantsminda, set at approximately 1,700 m above sea level with full-frontage views of the Gergeti Trinity Church and Mt. Kazbek (5,047 m). Designed by the Georgian architecture firm Adjara Group, it is widely considered one of the most architecturally significant hotels in the Caucasus. The terrace view \\u2014 church, glacier, mountain \\u2014 is one of the iconic images of the region.'},\n      {q:'What is the Gergeti Trinity Church?',a:'The Gergeti Trinity Church (Tsminda Sameba) is a 14th-century Georgian Orthodox church and bell tower built at 2,170 m above sea level on a rocky peak above Stepantsminda. In direct view of Mt. Kazbek (5,047 m) and reflected in the Terek River below, it is the most photographed religious building in Georgia. The church has served as a place of refuge throughout Georgian history \\u2014 icons and treasures from Mtskheta were carried there for safekeeping during invasions.'},\n      {q:'Is this tour suitable for families or older travellers?',a:'Yes. At difficulty 2\/5, this is the most accessible expedition in the Georgia portfolio and is suitable for active travellers of most ages. The horseback riding at Ferma Village is led by professional instructors and designed for all levels. The Gveleti Waterfall hike is a 4 km walk on a trail. The Nekresi Monastery trek is a 3 km scenic walk. The minimum age is 12, and there is no upper age limit. Guests with mobility concerns should contact us before booking to discuss specific days.'},\n      {q:'How does this expedition compare to the other Georgia tours?',a:'This is the entry-level Georgia expedition \\u2014 the widest cultural coverage at the lowest physical demand. The Upward Path and From Roots to Peaks are both 3\/5 difficulty with 4-hour horseback rides at 2,200 m altitude, 7 km alpine treks, and whitewater rafting. The two winter tours (Silk Snow and The White Path) are 3\\u20134\/5 and ski-focused. Vines, Peaks \u0026 Old Stones covers more of Georgia\\u2019s cultural breadth \\u2014 Kakheti wine culture, the Kazbegi mountain world, Mtskheta and ancient Christianity \\u2014 in a format accessible to guests who want to be active without training for an expedition.'}\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_vines')||'{}');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  setDay(n){this.setState({active:n});}\n  next(){this.setState(s=\u003e({active:s.active\u003e=8?1:s.active+1}));}\n  prev(){this.setState(s=\u003e({active:s.active\u003c=1?8:s.active-1}));}\n  togglePlay(){if(this.state.playing){clearInterval(this._t);this._t=null;this.setState({playing:false});}else{this._t=setInterval(()=\u003ethis.next(),1500);this.setState({playing:true});}}\n  setPhase(p){const start={1:1,2:4,3:7}[p];this.setState(s=\u003es.phase===p?{phase:0}:{phase:p,active:start});}\n  togglePack(key){this.setState(s=\u003e{const k=Object.assign({},s.packed);k[key]=!k[key];try{localStorage.setItem('toa_pack_vines',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 Vine \\u00b7 Kakheti Wine',2:'The Peak \\u00b7 Kazbegi',3:'The Stone \\u00b7 Ancient Georgia'};\n    const days=this.DATA.map(x=\u003e{\n      const act=x.n===a;\n      return{n2:String(x.n).padStart(2,'0'),title:x.title,place:x.place,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    const meta={\n      1:{range:'DAYS 01\\u201303',name:'The Vine \\u2014 Kakheti \u0026 Wine',blurb:'Qvevri tasting, culinary masterclass, Nekresi Monastery and Shumi Winery.'},\n      2:{range:'DAYS 04\\u201306',name:'The Peak \\u2014 Kazbegi',blurb:'Horseback riding at Ferma Village, Ananuri Fortress, and Gergeti Trinity Church.'},\n      3:{range:'DAYS 07\\u201308',name:'The Stone \\u2014 Ancient Georgia',blurb:'Mtskheta, Svetitskhoveli Cathedral, Jvari Monastery and departure.'}\n    };\n    const phases=[1,2,3].map(p=\u003e{\n      const act=pf===p;\n      return{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    const packed=this.state.packed;\n    let packCount=0,packTotal=0;\n    const packGroups=this.PACKG.map((g,gi)=\u003e({name:g.name,items:g.items.map((t,ii)=\u003e{\n      const key=gi+'-'+ii;const ck=!!packed[key];packTotal++;if(ck)packCount++;\n      return{name:t,checked:ck,onClick:()=\u003ethis.togglePack(key),\n        style:{display:'flex',alignItems:'center',gap:'12px',padding:'12px 14px',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:'13.5px',color:ck?'#fff':'#CDC7B8',fontWeight:ck?600:500,lineHeight:1.3}\n      };\n    })}));\n    const hi=this.state.hotel;\n    const hotels=this.HOTELS.map((h,i)=\u003e({name:h.name,where:h.where,desc:h.desc,imgs:h.imgs,nights:h.nights,tag:h.tag,wrapStyle:{display:i===hi?'block':'none'}}));\n    const hotelDots=this.HOTELS.map((h,i)=\u003e({onClick:()=\u003ethis.setHotel(i),style:{width:i===hi?'26px':'9px',height:'9px',borderRadius:'999px',background:i===hi?'#E1343F':'#D8D2C4',cursor:'pointer',transition:'all .2s',display:'inline-block'}}));\n    const faqState=this.state.faq;\n    const faqs=this.FAQ.map((f,i)=\u003e{const op=!!faqState[i];return{q:f.q,a:f.a,open:op,sign:op?'\\u2212':'+',onClick:()=\u003ethis.toggleFaq(i),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    return{\n      days,phases,packGroups,hotels,hotelDots,faqs,\n      included:this.INCLUDED.map(t=\u003e({t})),excluded:this.EXCLUDED.map(t=\u003e({t})),\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+' \/ '+packTotal+' packed',\n      active:{dayLabel:'DAY '+String(a).padStart(2,'0'),place:d.place,route:d.route,narrative:d.narrative,phaseName:this.PHN[d.phase],modeLabel:d.modeLabel,accom:d.accom,hasActs:d.acts.length\u003e0,hasStats:d.stats.length\u003e0},\n      activeActs:d.acts.map(x=\u003e({name:x})),\n      activeStats:d.stats.map(s=\u003e({label:s.label,value:s.value})),\n      progress:'Day '+a+' of 8 \\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":"Jan – Mar 2027","offer_id":57626077954430,"sku":null,"price":3200.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/Emily-Lush-places-in-Georgia-Rkoni-Valley.jpg?v=1782808098","url":"https:\/\/theoneadventure.com\/products\/georgia-vines-peaks-old-stones","provider":"The One Adventure","version":"1.0","type":"link"}