文件名:tampermonkey-backup-chrome-2020-09-21T01-39-51.856Z.txt
大小:1.58 MB
最后修改时间:2020-09-21 09:40:14

        {"created_by":"Tampermonkey","version":"1","scripts":[{"name":"网盘助手","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["newday.me","likestyle.cn"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://pan.baidu.com/*","*://yun.baidu.com/*","*://*.weiyun.com/*","*://*.lanzous.com/*","*://*.lanzoux.com/*","*://cloud.189.cn/*","*://*.newday.me/*","*://*.likestyle.cn/*"],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"$config":"o{\"uid\":\"w8i2zaai0mde20w8xkdvbj4uz03gk5tj\",\"share_list\":{\"b05aba69c\":{\"share_id\":\"b05aba69c\",\"share_pwd\":\"0\",\"share_link\":\"https://dongji.lanzous.com/b05aba69c\",\"share_source\":\"lanzous\",\"share_time\":1592877319110},\"b05a8wfcd\":{\"share_id\":\"b05a8wfcd\",\"share_pwd\":\"0\",\"share_link\":\"https://dongji.lanzous.com/b05a8wfcd\",\"share_source\":\"lanzous\",\"share_time\":1592877406144},\"b00t3gvsd\":{\"share_id\":\"b00t3gvsd\",\"share_pwd\":\"0\",\"share_link\":\"https://imims.lanzous.com/b00t3gvsd\",\"share_source\":\"lanzous\",\"share_time\":1593590748565},\"b05a873cb\":{\"share_id\":\"b05a873cb\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05a873cb\",\"share_source\":\"lanzous\",\"share_time\":1600136356455},\"b05ad3xmh\":{\"share_id\":\"b05ad3xmh\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ad3xmh\",\"share_source\":\"lanzous\",\"share_time\":1595828420286},\"b0b8ri0xi\":{\"share_id\":\"b0b8ri0xi\",\"share_pwd\":\"0\",\"share_link\":\"https://deast.lanzous.com/b0b8ri0xi\",\"share_source\":\"lanzous\",\"share_time\":1595915726825},\"b05a6vvsh\":{\"share_id\":\"b05a6vvsh\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05a6vvsh\",\"share_source\":\"lanzous\",\"share_time\":1600652319059},\"b05ai4lrg\":{\"share_id\":\"b05ai4lrg\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ai4lrg\",\"share_source\":\"lanzous\",\"share_time\":1599106485886},\"b05afd4fi\":{\"share_id\":\"b05afd4fi\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05afd4fi\",\"share_source\":\"lanzous\",\"share_time\":1599039263669},\"b05ackyli\":{\"share_id\":\"b05ackyli\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ackyli\",\"share_source\":\"lanzous\",\"share_time\":1599106764346},\"b05a7uyre\":{\"share_id\":\"b05a7uyre\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05a7uyre\",\"share_source\":\"lanzous\",\"share_time\":1596682312269},\"b05ad416f\":{\"share_id\":\"b05ad416f\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ad416f\",\"share_source\":\"lanzous\",\"share_time\":1596684113465},\"b05ae0aid\":{\"share_id\":\"b05ae0aid\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ae0aid\",\"share_source\":\"lanzous\",\"share_time\":1598494004995},\"b05aco5eb\":{\"share_id\":\"b05aco5eb\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05aco5eb\",\"share_source\":\"lanzous\",\"share_time\":1597629919634},\"b05abniqj\":{\"share_id\":\"b05abniqj\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05abniqj\",\"share_source\":\"lanzous\",\"share_time\":1597801052965},\"b05abgx3e\":{\"share_id\":\"b05abgx3e\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05abgx3e\",\"share_source\":\"lanzous\",\"share_time\":1599011107112},\"b05achvwd\":{\"share_id\":\"b05achvwd\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05achvwd\",\"share_source\":\"lanzous\",\"share_time\":1598838724213},\"b0d7dexa\":{\"share_id\":\"b0d7dexa\",\"share_pwd\":\"0\",\"share_link\":\"https://lanzous.com/b0d7dexa\",\"share_source\":\"lanzous\",\"share_time\":1598235637117},\"b05a8zscj\":{\"share_id\":\"b05a8zscj\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05a8zscj\",\"share_source\":\"lanzous\",\"share_time\":1599540178629},\"b0742hkxe\":{\"share_id\":\"b0742hkxe\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b0742hkxe\",\"share_source\":\"lanzous\",\"share_time\":1598937761240},\"b05ad6oze\":{\"share_id\":\"b05ad6oze\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ad6oze\",\"share_source\":\"lanzous\",\"share_time\":1599011039649},\"b05ae5pje\":{\"share_id\":\"b05ae5pje\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05ae5pje\",\"share_source\":\"lanzous\",\"share_time\":1599011132403},\"b05aamdmd\":{\"share_id\":\"b05aamdmd\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05aamdmd\",\"share_source\":\"lanzous\",\"share_time\":1599106652471},\"b05alr4pi\":{\"share_id\":\"b05alr4pi\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzoux.com/b05alr4pi\",\"share_source\":\"lanzous\",\"share_time\":1600047933202},\"b04sj5isd\":{\"share_id\":\"b04sj5isd\",\"share_pwd\":\"0\",\"share_link\":\"https://meiriyixue.lanzous.com/b04sj5isd\",\"share_source\":\"lanzous\",\"share_time\":1600141303066},\"b198346\":{\"share_id\":\"b198346\",\"share_pwd\":\"0\",\"share_link\":\"https://www.lanzous.com/b198346/\",\"share_source\":\"lanzous\",\"share_time\":1600238840529}},\"share_pwd\":\"1234\"}","$storage":"o{\"version_date\":\"20200921\",\"version_payload\":{\"version\":\"0.4.2\"},\"version_latest\":\"0.4.2\"}"},"ts":1600652319059},"enabled":true,"position":1,"file_url":"https://greasyfork.org/scripts/378301-%E7%BD%91%E7%9B%98%E5%8A%A9%E6%89%8B/code/%E7%BD%91%E7%9B%98%E5%8A%A9%E6%89%8B.user.js","uuid":"79e90042-f58e-4f8b-a489-f870b5ce8013","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDnvZHnm5jliqnmiYsKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vZ28ubmV3ZGF5Lm1lL3MvcGFuLWhvbWUKLy8gQHZlcnNpb24gICAgICAwLjQuNAovLyBAaWNvbiAgICAgICAgIGh0dHA6Ly9jZG4ubmV3ZGF5Lm1lL2FkZG9uL3Bhbi9mYXZpY29uLmljbwovLyBAYXV0aG9yICAgICAgIOWTqeWRtQovLyBAZGVzY3JpcHRpb24gIOWkp+amguaYr+acgOS8mOmbheWlveeUqOeahOe9keebmOWKqeaJi+S6hu+8m+aPkuS7tuS4u+imgeWKn+iDveacie+8mlsxXeeZvuW6pue9keebmOOAgeiFvuiur+W+ruS6keOAgeiTneWlj+S6keOAgeWkqee/vOS6keebmOS4h+iDvemSpeWMmSBbMl3nmb7luqbnvZHnm5jnlJ/miJDlubblsZXnpLrkuIvovb3pk77mjqUgWzNd55m+5bqm572R55uY5YiG5Lqr5pe26Ieq5a6a5LmJ5o+Q5Y+W56CBCi8vIEBtYXRjaCAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly95dW4uYmFpZHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi53ZWl5dW4uY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3VzLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91eC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9jbG91ZC4xODkuY24vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLm5ld2RheS5tZS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGlrZXN0eWxlLmNuLyoKLy8gQGNvbm5lY3QgICAgICBuZXdkYXkubWUKLy8gQGNvbm5lY3QgICAgICBsaWtlc3R5bGUuY24KLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5zdGF0aWNmaWxlLm9yZy9qcXVlcnkvMy41LjAvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLnN0YXRpY2ZpbGUub3JnL2RvbXB1cmlmeS8yLjAuMTAvcHVyaWZ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLnN0YXRpY2ZpbGUub3JnL3NuYXAuc3ZnLzAuNS4xL3NuYXAuc3ZnLW1pbi5qcwovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LXN0YXJ0Ci8vIEBncmFudCAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgR01fbGlzdFZhbHVlcwovLyBAZ3JhbnQgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgIEdNX25vdGlmaWNhdGlvbgovLyBAZ3JhbnQgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgbWFuaWZlc3QgPSB7CiAgICAgICAgIm5hbWUiOiAid3B6cyIsCiAgICAgICAgInVybHMiOiB7fSwKICAgICAgICAiYXBpcyI6IHsKICAgICAgICAgICAgInZlcnNpb24iOiAiaHR0cHM6Ly9hcGkubmV3ZGF5Lm1lL3NoYXJlL2Rpc2svdmVyc2lvbiIsCiAgICAgICAgICAgICJvcmlnaW4iOiAiaHR0cHM6Ly9hcGkubmV3ZGF5Lm1lL3NoYXJlL2Rpc2svb3JpZ2luIiwKICAgICAgICAgICAgInF1ZXJ5IjogImh0dHBzOi8vYXBpLm5ld2RheS5tZS9zaGFyZS9kaXNrL3F1ZXJ5IiwKICAgICAgICAgICAgInN0b3JlIjogImh0dHBzOi8vYXBpLm5ld2RheS5tZS9zaGFyZS9kaXNrL3N0b3JlIiwKICAgICAgICAgICAgImxpc3RzIjogImh0dHBzOi8vYXBpLm5ld2RheS5tZS9zaGFyZS9kaXNrL2xpc3RzIiwKICAgICAgICAgICAgImRlbGV0ZSI6ICJodHRwczovL2FwaS5uZXdkYXkubWUvc2hhcmUvZGlzay9kZWxldGUiCiAgICAgICAgfSwKICAgICAgICAibG9nZ2VyX2xldmVsIjogMywKICAgICAgICAib3B0aW9uc19wYWdlIjogImh0dHA6Ly9nby5uZXdkYXkubWUvcy9wYW4tb3B0aW9uIgogICAgfTsKCiAgICB2YXIgY29udGFpbmVyID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICBkZWZpbmVzOiB7fSwKICAgICAgICAgICAgbW9kdWxlczoge30KICAgICAgICB9OwoKICAgICAgICBvYmouZGVmaW5lID0gZnVuY3Rpb24gKG5hbWUsIHJlcXVpcmVzLCBjYWxsYmFjaykgewogICAgICAgICAgICBuYW1lID0gb2JqLnByb2Nlc3NOYW1lKG5hbWUpOwogICAgICAgICAgICBvYmouZGVmaW5lc1tuYW1lXSA9IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVzOiByZXF1aXJlcywKICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjawogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIG9iai5yZXF1aXJlID0gZnVuY3Rpb24gKG5hbWUsIGNhY2hlKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FjaGUgPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIGNhY2hlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmFtZSA9IG9iai5wcm9jZXNzTmFtZShuYW1lKTsKICAgICAgICAgICAgaWYgKGNhY2hlICYmIG9iai5tb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLm1vZHVsZXNbbmFtZV07CiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqLmRlZmluZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IG9iai5kZWZpbmVzW25hbWVdLnJlcXVpcmVzOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gb2JqLmRlZmluZXNbbmFtZV0uY2FsbGJhY2s7CgogICAgICAgICAgICAgICAgdmFyIG1vZHVsZSA9IG9iai51c2UocmVxdWlyZXMsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIGNhY2hlICYmIG9iai5yZWdpc3RlcihuYW1lLCBtb2R1bGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai51c2UgPSBmdW5jdGlvbiAocmVxdWlyZXMsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBtb2R1bGUgPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiB1bmRlZmluZWQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IG9iai5idWlsZFBhcmFtcyhyZXF1aXJlcywgbW9kdWxlKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIHBhcmFtcyk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJlZ2lzdGVyID0gZnVuY3Rpb24gKG5hbWUsIG1vZHVsZSkgewogICAgICAgICAgICBuYW1lID0gb2JqLnByb2Nlc3NOYW1lKG5hbWUpOwogICAgICAgICAgICBvYmoubW9kdWxlc1tuYW1lXSA9IG1vZHVsZTsKICAgICAgICB9OwoKICAgICAgICBvYmouYnVpbGRQYXJhbXMgPSBmdW5jdGlvbiAocmVxdWlyZXMsIG1vZHVsZSkgewogICAgICAgICAgICB2YXIgcGFyYW1zID0gW107CiAgICAgICAgICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKG9iai5yZXF1aXJlKG5hbWUpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHBhcmFtcy5wdXNoKG9iai5yZXF1aXJlKTsKICAgICAgICAgICAgcGFyYW1zLnB1c2gobW9kdWxlLmV4cG9ydHMpOwogICAgICAgICAgICBwYXJhbXMucHVzaChtb2R1bGUpOwogICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgIH07CgogICAgICAgIG9iai5wcm9jZXNzTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZGVmaW5lOiBvYmouZGVmaW5lLAogICAgICAgICAgICB1c2U6IG9iai51c2UsCiAgICAgICAgICAgIHJlZ2lzdGVyOiBvYmoucmVnaXN0ZXIsCiAgICAgICAgICAgIG1vZHVsZXM6IG9iai5tb2R1bGVzCiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgY29udGFpbmVyLmRlZmluZSgiZ20iLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBvYmogPSB7fTsKCiAgICAgICAgb2JqLnJlYWR5ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgR01fZ2V0VmFsdWUgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvYmoucmVhZHkoY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICAvKiogY29tbW9uICoqLwogICAgY29udGFpbmVyLmRlZmluZSgiZ21EYW8iLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBvYmogPSB7CiAgICAgICAgICAgIGl0ZW1zOiB7fQogICAgICAgIH07CgogICAgICAgIG9iai5nZXQgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gR01fZ2V0VmFsdWUobmFtZSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldEJhdGNoID0gZnVuY3Rpb24gKG5hbWVzKSB7CiAgICAgICAgICAgIHZhciBpdGVtcyA9IHt9OwogICAgICAgICAgICBuYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICBpdGVtc1tuYW1lXSA9IG9iai5nZXQobmFtZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaXRlbXM7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldEFsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRCYXRjaChHTV9saXN0VmFsdWVzKCkpOwogICAgICAgIH07CgogICAgICAgIG9iai5zZXQgPSBmdW5jdGlvbiAobmFtZSwgaXRlbSkgewogICAgICAgICAgICBHTV9zZXRWYWx1ZShuYW1lLCBpdGVtKTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2V0QmF0Y2ggPSBmdW5jdGlvbiAoaXRlbXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBpdGVtcykgewogICAgICAgICAgICAgICAgb2JqLnNldChuYW1lLCBpdGVtc1tuYW1lXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouc2V0QWxsID0gZnVuY3Rpb24gKGl0ZW1zKSB7CiAgICAgICAgICAgIHZhciBuYW1lcyA9IEdNX2xpc3RWYWx1ZXMoKTsKICAgICAgICAgICAgbmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgaWYgKCFpdGVtcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgICAgICAgICAgICAgIG9iai5yZW1vdmUobmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYmouc2V0QmF0Y2goaXRlbXMpOwogICAgICAgIH07CgogICAgICAgIG9iai5yZW1vdmUgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICBHTV9kZWxldGVWYWx1ZShuYW1lKTsKICAgICAgICB9OwoKICAgICAgICBvYmoucmVtb3ZlQmF0Y2ggPSBmdW5jdGlvbiAobmFtZXMpIHsKICAgICAgICAgICAgbmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgb2JqLnJlbW92ZShuYW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnJlbW92ZUJhdGNoKEdNX2xpc3RWYWx1ZXMoKSk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoIlNjb3BlRGFvIiwgW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRhbywgc2NvcGUpIHsKICAgICAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgICAgIGl0ZW1zOiB7fQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLml0ZW1zW25hbWVdOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLmdldEJhdGNoID0gZnVuY3Rpb24gKG5hbWVzKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB7fTsKICAgICAgICAgICAgICAgIG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2JqLml0ZW1zLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW25hbWVdID0gb2JqLml0ZW1zW25hbWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLmdldEFsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouaXRlbXM7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBvYmouc2V0ID0gZnVuY3Rpb24gKG5hbWUsIGl0ZW0pIHsKICAgICAgICAgICAgICAgIG9iai5pdGVtc1tuYW1lXSA9IGl0ZW07CgogICAgICAgICAgICAgICAgb2JqLnN5bmMoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG9iai5zZXRCYXRjaCA9IGZ1bmN0aW9uIChpdGVtcykgewogICAgICAgICAgICAgICAgb2JqLml0ZW1zID0gT2JqZWN0LmFzc2lnbihvYmouaXRlbXMsIGl0ZW1zKTsKCiAgICAgICAgICAgICAgICBvYmouc3luYygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLnNldEFsbCA9IGZ1bmN0aW9uIChpdGVtcykgewogICAgICAgICAgICAgICAgb2JqLml0ZW1zID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbXMpOwoKICAgICAgICAgICAgICAgIG9iai5zeW5jKCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBvYmoucmVtb3ZlID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouaXRlbXNbbmFtZV07CgogICAgICAgICAgICAgICAgb2JqLnN5bmMoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG9iai5yZW1vdmVCYXRjaCA9IGZ1bmN0aW9uIChuYW1lcykgewogICAgICAgICAgICAgICAgbmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouaXRlbXNbbmFtZV07CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBvYmouc3luYygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIG9iai5pdGVtcyA9IHt9OwoKICAgICAgICAgICAgICAgIG9iai5nZXREYW8oKS5yZW1vdmUob2JqLmdldFNjb3BlKCkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLmluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSBvYmouZ2V0RGFvKCkuZ2V0KG9iai5nZXRTY29wZSgpKTsKICAgICAgICAgICAgICAgIGlmIChpdGVtcyBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG9iai5pdGVtcyA9IGl0ZW1zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLnN5bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBvYmouZ2V0RGFvKCkuc2V0KG9iai5nZXRTY29wZSgpLCBvYmouaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgb2JqLmdldERhbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYW87CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBvYmouZ2V0U2NvcGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gb2JqLmluaXQoKSwgb2JqOwogICAgICAgIH07CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCJjb25maWciLCBbImZhY3RvcnkiXSwgZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5nZXRDb25maWcgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gb2JqLmdldERhbygpLmdldChuYW1lKTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2V0Q29uZmlnID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIG9iai5nZXREYW8oKS5zZXQobmFtZSwgdmFsdWUpOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRBbGwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmouZ2V0RGFvKCkuZ2V0QWxsKCk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldERhbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0Q29uZmlnRGFvKCk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoInN0b3JhZ2UiLCBbImZhY3RvcnkiXSwgZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBvYmouZ2V0RGFvKCkuZ2V0KG5hbWUpOwogICAgICAgIH07CgogICAgICAgIG9iai5zZXRWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICBvYmouZ2V0RGFvKCkuc2V0KG5hbWUsIHZhbHVlKTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0QWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLmdldERhbygpLmdldEFsbCgpOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXREYW8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldFN0b3JhZ2VEYW8oKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgib3B0aW9uIiwgWyJjb25maWciLCAiY29uc3RhbnQiXSwgZnVuY3Rpb24gKGNvbmZpZywgY29uc3RhbnQpIHsKICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICBuYW1lOiAib3B0aW9uIiwKICAgICAgICAgICAgY29uc3RhbnQ6IGNvbnN0YW50Lm9wdGlvbgogICAgICAgIH07CgogICAgICAgIG9iai5pc09wdGlvbkFjdGl2ZSA9IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgIHZhciBuYW1lID0gaXRlbS5uYW1lOwogICAgICAgICAgICB2YXIgb3B0aW9uID0gb2JqLmdldE9wdGlvbigpOwogICAgICAgICAgICByZXR1cm4gb3B0aW9uLmluZGV4T2YobmFtZSkgPj0gMCA/IHRydWUgOiBmYWxzZTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2V0T3B0aW9uQWN0aXZlID0gZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7CiAgICAgICAgICAgIHZhciBvcHRpb24gPSBvYmouZ2V0T3B0aW9uKCk7CiAgICAgICAgICAgIGlmIChvcHRpb24uaW5kZXhPZihuYW1lKSA8IDApIHsKICAgICAgICAgICAgICAgIG9wdGlvbi5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgb2JqLnNldE9wdGlvbihvcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNldE9wdGlvblVuQWN0aXZlID0gZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7CiAgICAgICAgICAgIHZhciBvcHRpb24gPSBvYmouZ2V0T3B0aW9uKCk7CiAgICAgICAgICAgIHZhciBpbmRleCA9IG9wdGlvbi5pbmRleE9mKG5hbWUpOwogICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbltpbmRleF07CiAgICAgICAgICAgICAgICBvYmouc2V0T3B0aW9uKG9wdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0T3B0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9uID0gW107CiAgICAgICAgICAgIHZhciBvcHRpb25MaXN0ID0gb2JqLmdldE9wdGlvbkxpc3QoKTsKICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvYmouY29uc3RhbnQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHZhciBuYW1lID0gaXRlbS5uYW1lOwogICAgICAgICAgICAgICAgaWYgKG9wdGlvbkxpc3QuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGlzdFtuYW1lXSAhPSAibm8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0udmFsdWUgIT0gIm5vIikgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbi5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjsKICAgICAgICB9OwoKICAgICAgICBvYmouc2V0T3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgICB2YXIgb3B0aW9uTGlzdCA9IHt9OwogICAgICAgICAgICBPYmplY3QudmFsdWVzKG9iai5jb25zdGFudCkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmluZGV4T2YobmFtZSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbkxpc3RbbmFtZV0gPSAieWVzIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGlzdFtuYW1lXSA9ICJubyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYmouc2V0T3B0aW9uTGlzdChvcHRpb25MaXN0KTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0T3B0aW9uTGlzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbkxpc3QgPSBjb25maWcuZ2V0Q29uZmlnKG9iai5uYW1lKTsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbkxpc3QgPyBvcHRpb25MaXN0IDoge307CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNldE9wdGlvbkxpc3QgPSBmdW5jdGlvbiAob3B0aW9uTGlzdCkgewogICAgICAgICAgICBjb25maWcuc2V0Q29uZmlnKG9iai5uYW1lLCBvcHRpb25MaXN0KTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgibWFuaWZlc3QiLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBvYmogPSB7CiAgICAgICAgICAgIG1hbmlmZXN0OiBtYW5pZmVzdAogICAgICAgIH07CgogICAgICAgIG9iai5nZXRJdGVtID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG9iai5tYW5pZmVzdFtuYW1lXTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0TWFuaWZlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmoubWFuaWZlc3Q7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldE5hbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmouZ2V0SXRlbSgibmFtZSIpOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRBcHBOYW1lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLmdldEl0ZW0oImFwcF9uYW1lIik7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFVybCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHZhciB1cmxzID0gb2JqLmdldEl0ZW0oInVybHMiKTsKICAgICAgICAgICAgKHVybHMgaW5zdGFuY2VvZiBPYmplY3QpIHx8ICh1cmxzID0ge30pOwogICAgICAgICAgICByZXR1cm4gdXJsc1tuYW1lXTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0QXBpID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgdmFyIGFwaXMgPSBvYmouZ2V0SXRlbSgiYXBpcyIpOwogICAgICAgICAgICAoYXBpcyBpbnN0YW5jZW9mIE9iamVjdCkgfHwgKGFwaXMgPSB7fSk7CiAgICAgICAgICAgIHJldHVybiBhcGlzW25hbWVdOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRPcHRpb25zUGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKEdNX2luZm8uc2NyaXB0Lm9wdGlvblVybCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEdNX2luZm8uc2NyaXB0Lm9wdGlvblVybDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0SXRlbSgib3B0aW9uc19wYWdlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgiZW52IiwgWyJjb25maWciLCAibWFuaWZlc3QiXSwgZnVuY3Rpb24gKGNvbmZpZywgbWFuaWZlc3QpIHsKICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICBtb2RlczogewogICAgICAgICAgICAgICAgQURET046ICJhZGRvbiIsCiAgICAgICAgICAgICAgICBTQ1JJUFQ6ICJzY3JpcHQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJyb3dzZXJzOiB7CiAgICAgICAgICAgICAgICBGSVJFRk9YOiAiZmlyZWZveCIsCiAgICAgICAgICAgICAgICBFREc6ICJlZGciLAogICAgICAgICAgICAgICAgRURHRTogImVkZ2UiLAogICAgICAgICAgICAgICAgQkFJRFU6ICJiYWlkdSIsCiAgICAgICAgICAgICAgICBMSUVCQU86ICJsaWViYW8iLAogICAgICAgICAgICAgICAgVUM6ICJ1YyIsCiAgICAgICAgICAgICAgICBRUTogInFxIiwKICAgICAgICAgICAgICAgIFNPR09VOiAic29nb3UiLAogICAgICAgICAgICAgICAgT1BFUkE6ICJvcGVyYSIsCiAgICAgICAgICAgICAgICBNQVhUSE9OOiAibWF4dGhvbiIsCiAgICAgICAgICAgICAgICBJRTIzNDU6ICIyMzQ1IiwKICAgICAgICAgICAgICAgIFNFMzYwOiAiMzYwIiwKICAgICAgICAgICAgICAgIENIUk9NRTogImNocm9tZSIsCiAgICAgICAgICAgICAgICBTQUZJUkk6ICJzYWZhcmkiLAogICAgICAgICAgICAgICAgT1RIRVI6ICJvdGhlciIKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5nZXROYW1lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gbWFuaWZlc3QuZ2V0TmFtZSgpOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoR01faW5mby5tb2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gR01faW5mby5tb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5tb2Rlcy5TQ1JJUFQ7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0QWlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoR01faW5mby5zY3JpcHRIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gR01faW5mby5zY3JpcHRIYW5kbGVyLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFVpZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHVpZCA9IGNvbmZpZy5nZXRDb25maWcoInVpZCIpOwogICAgICAgICAgICBpZiAoIXVpZCkgewogICAgICAgICAgICAgICAgdWlkID0gb2JqLnJhbmRTdHJpbmcoMzIpOwogICAgICAgICAgICAgICAgY29uZmlnLnNldENvbmZpZygidWlkIiwgdWlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdWlkOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRCcm93c2VyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIW9iai5fYnJvd3NlcikgewogICAgICAgICAgICAgICAgb2JqLl9icm93c2VyID0gb2JqLm1hdGNoQnJvd3NlclR5cGUobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9iai5fYnJvd3NlcjsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0VmVyc2lvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIEdNX2luZm8uc2NyaXB0LnZlcnNpb247CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldEVkaXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBHTV9pbmZvLnZlcnNpb247CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldEluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBtb2RlOiBvYmouZ2V0TW9kZSgpLAogICAgICAgICAgICAgICAgYWlkOiBvYmouZ2V0QWlkKCksCiAgICAgICAgICAgICAgICB1aWQ6IG9iai5nZXRVaWQoKSwKICAgICAgICAgICAgICAgIGJyb3dzZXI6IG9iai5nZXRCcm93c2VyKCksCiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBvYmouZ2V0VmVyc2lvbigpLAogICAgICAgICAgICAgICAgZWRpdGlvbjogb2JqLmdldEVkaXRpb24oKQogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIG9iai5tYXRjaEJyb3dzZXJUeXBlID0gZnVuY3Rpb24gKHVzZXJBZ2VudCkgewogICAgICAgICAgICB2YXIgYnJvd3NlciA9IG9iai5icm93c2Vycy5PVEhFUjsKICAgICAgICAgICAgdXNlckFnZW50ID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmICh1c2VyQWdlbnQubWF0Y2goL2ZpcmVmb3gvKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBicm93c2VyID0gb2JqLmJyb3dzZXJzLkZJUkVGT1g7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50Lm1hdGNoKC9lZGdlLykgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJvd3NlciA9IG9iai5icm93c2Vycy5FREdFOwogICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudC5tYXRjaCgvZWRnLykgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJvd3NlciA9IG9iai5icm93c2Vycy5FREc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50Lm1hdGNoKC9iaWR1YnJvd3Nlci8pICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyb3dzZXIgPSBvYmouYnJvd3NlcnMuQkFJRFU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50Lm1hdGNoKC9sYmJyb3dzZXIvKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBicm93c2VyID0gb2JqLmJyb3dzZXJzLkxJRUJBTzsKICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQubWF0Y2goL3Vicm93c2VyLykgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJvd3NlciA9IG9iai5icm93c2Vycy5VQzsKICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQubWF0Y2goL3FxYnJvd3NlLykgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJvd3NlciA9IG9iai5icm93c2Vycy5RUTsKICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQubWF0Y2goL21ldGFzci8pICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyb3dzZXIgPSBvYmouYnJvd3NlcnMuU09HT1U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50Lm1hdGNoKC9vcHIvKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBicm93c2VyID0gb2JqLmJyb3dzZXJzLk9QRVJBOwogICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudC5tYXRjaCgvbWF4dGhvbi8pICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyb3dzZXIgPSBvYmouYnJvd3NlcnMuTUFYVEhPTjsKICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQubWF0Y2goLzIzNDVleHBsb3Jlci8pICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyb3dzZXIgPSBvYmouYnJvd3NlcnMuSUUyMzQ1OwogICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudC5tYXRjaCgvY2hyb21lLykgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5taW1lVHlwZXMubGVuZ3RoID4gMTApIHsKICAgICAgICAgICAgICAgICAgICBicm93c2VyID0gb2JqLmJyb3dzZXJzLlNFMzYwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBicm93c2VyID0gb2JqLmJyb3dzZXJzLkNIUk9NRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQubWF0Y2goL3NhZmFyaS8pICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyb3dzZXIgPSBvYmouYnJvd3NlcnMuU0FGSVJJOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBicm93c2VyOwogICAgICAgIH07CgogICAgICAgIG9iai5yYW5kU3RyaW5nID0gZnVuY3Rpb24gKGxlbmd0aCkgewogICAgICAgICAgICB2YXIgcG9zc2libGUgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IjsKICAgICAgICAgICAgdmFyIHRleHQgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGV4dCArPSBwb3NzaWJsZS5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoImh0dHAiLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBvYmogPSB7fTsKCiAgICAgICAgb2JqLmFqYXggPSBmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgICAgIHZhciBkZXRhaWxzID0gewogICAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb24udHlwZSwKICAgICAgICAgICAgICAgIHVybDogb3B0aW9uLnVybCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9uLmRhdGFUeXBlLAogICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3RhdHVzIHx8IHBhcnNlSW50KHJlc3VsdC5zdGF0dXMgLyAxMDApID09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnN1Y2Nlc3MgJiYgb3B0aW9uLnN1Y2Nlc3MocmVzdWx0LnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi5lcnJvciAmJiBvcHRpb24uZXJyb3IoIiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmVycm9yICYmIG9wdGlvbi5lcnJvcihyZXN1bHQuZXJyb3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8g5o+Q5Lqk5pWw5o2uCiAgICAgICAgICAgIGlmIChvcHRpb24uZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5kYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmRhdGEgPSBvcHRpb24uZGF0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb3B0aW9uLmRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGksIG9wdGlvbi5kYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIOiHquWumuS5ieWktAogICAgICAgICAgICBpZiAob3B0aW9uLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIGRldGFpbHMuaGVhZGVycyA9IG9wdGlvbi5oZWFkZXJzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDotoXml7YKICAgICAgICAgICAgaWYgKG9wdGlvbi50aW1lb3V0KSB7CiAgICAgICAgICAgICAgICBkZXRhaWxzLnRpbWVvdXQgPSBvcHRpb24udGltZW91dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoZGV0YWlscyk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoInJvdXRlciIsIFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIG9iaiA9IHt9OwoKICAgICAgICBvYmouZ2V0VXJsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZjsKICAgICAgICB9OwoKICAgICAgICBvYmouZ29VcmwgPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSB1cmw7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLm9wZW5VcmwgPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLm9wZW5UYWIgPSBmdW5jdGlvbiAodXJsLCBhY3RpdmUpIHsKICAgICAgICAgICAgR01fb3BlbkluVGFiKHVybCwgIWFjdGl2ZSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmp1bXBMaW5rID0gZnVuY3Rpb24gKGp1bXBVcmwsIGp1bXBNb2RlKSB7CiAgICAgICAgICAgIHN3aXRjaCAoanVtcE1vZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAvLyBzZWxmCiAgICAgICAgICAgICAgICAgICAgb2JqLmdvVXJsKGp1bXBVcmwpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgIC8vIG5ldwogICAgICAgICAgICAgICAgICAgIG9iai5vcGVuVXJsKGp1bXBVcmwpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIC8vIG5ldyAmIG5vdCBhY3RpdmUKICAgICAgICAgICAgICAgICAgICBvYmoub3BlblRhYihqdW1wVXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgLy8gbmV3ICYgYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgb2JqLm9wZW5UYWIoanVtcFVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0VXJsUGFyYW0gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICB2YXIgcGFyYW0gPSBvYmoucGFyc2VVcmxQYXJhbShvYmouZ2V0VXJsKCkpOwogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmhhc093blByb3BlcnR5KG5hbWUpID8gcGFyYW1bbmFtZV0gOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnBhcnNlVXJsUGFyYW0gPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiPyIpKSB7CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwuc3BsaXQoIj8iKVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVnID0gLyhbXj0mXHNdKylbPVxzXSooW149JlxzXSopL2c7CiAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgd2hpbGUgKHJlZy5leGVjKHVybCkpIHsKICAgICAgICAgICAgICAgIG9ialtSZWdFeHAuJDFdID0gUmVnRXhwLiQyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoImxvZ2dlciIsIFsiZW52IiwgIm1hbmlmZXN0Il0sIGZ1bmN0aW9uIChlbnYsIG1hbmlmZXN0KSB7CiAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgY29uc3RhbnQ6IHsKICAgICAgICAgICAgICAgIERFQlVHOiAwLAogICAgICAgICAgICAgICAgSU5GTzogMSwKICAgICAgICAgICAgICAgIFdBUk46IDIsCiAgICAgICAgICAgICAgICBFUlJPUjogMywKICAgICAgICAgICAgICAgIE5PTkU6IDQKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5kZWJ1ZyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CiAgICAgICAgICAgIG9iai5sb2cobWVzc2FnZSwgb2JqLmNvbnN0YW50LkRFQlVHKTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5mbyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CiAgICAgICAgICAgIG9iai5sb2cobWVzc2FnZSwgb2JqLmNvbnN0YW50LklORk8pOwogICAgICAgIH07CgogICAgICAgIG9iai53YXJuID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsKICAgICAgICAgICAgb2JqLmxvZyhtZXNzYWdlLCBvYmouY29uc3RhbnQuV0FSTik7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsKICAgICAgICAgICAgb2JqLmxvZyhtZXNzYWdlLCBvYmouY29uc3RhbnQuRVJST1IpOwogICAgICAgIH07CgogICAgICAgIG9iai5sb2cgPSBmdW5jdGlvbiAobWVzc2FnZSwgbGV2ZWwpIHsKICAgICAgICAgICAgaWYgKGxldmVsIDwgbWFuaWZlc3QuZ2V0SXRlbSgibG9nZ2VyX2xldmVsIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc29sZS5ncm91cCgiWyIgKyBlbnYuZ2V0TmFtZSgpICsgIl0iICsgZW52LmdldE1vZGUoKSk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpOwogICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoIm1ldGEiLCBbImVudiIsICIkIl0sIGZ1bmN0aW9uIChlbnYsICQpIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5leGlzdE1ldGEgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICBuYW1lID0gb2JqLnByb2Nlc3NOYW1lKG5hbWUpOwogICAgICAgICAgICBpZiAoJCgibWV0YVtuYW1lPSciICsgbmFtZSArICInXSIpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouYXBwZW5kTWV0YSA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZW50KSB7CiAgICAgICAgICAgIG5hbWUgPSBvYmoucHJvY2Vzc05hbWUobmFtZSk7CiAgICAgICAgICAgIGNvbnRlbnQgfHwgKGNvbnRlbnQgPSAib24iKTsKICAgICAgICAgICAgJCgnPG1ldGEgbmFtZT0iJyArIG5hbWUgKyAnIiBjb250ZW50PSJvbiI+JykuYXBwZW5kVG8oJCgiaGVhZCIpKTsKICAgICAgICB9OwoKICAgICAgICBvYmoucHJvY2Vzc05hbWUgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZW52LmdldE5hbWUoKSArICI6OiIgKyBuYW1lOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCJ1bnNhZmVXaW5kb3ciLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0eXBlb2YgdW5zYWZlV2luZG93ID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdW5zYWZlV2luZG93OwogICAgICAgIH0KICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoInN2Z0NyeXB0IiwgWyJTbmFwIl0sIGZ1bmN0aW9uIChTbmFwKSB7CiAgICAgICAgdmFyIG9iaiA9IHt9OwoKICAgICAgICBvYmouZ2V0UmVxRGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHJlcVRpbWUgPSBNYXRoLnJvdW5kKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7CiAgICAgICAgICAgIHZhciByZXFQb2ludCA9IG9iai5nZXRTdHJQb2ludCgidGltZXN0YW1wOiIgKyByZXFUaW1lKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJlcV90aW1lOiByZXFUaW1lLAogICAgICAgICAgICAgICAgcmVxX3BvaW50OiByZXFQb2ludAogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTdHJQb2ludCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIjA6MCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYXRoID0gIiI7CiAgICAgICAgICAgIHZhciBjdXJyZW50LCBsYXN0ID0gc3RyWzBdLmNoYXJDb2RlQXQoKTsKICAgICAgICAgICAgdmFyIHN1bSA9IGxhc3Q7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3RyW2ldLmNoYXJDb2RlQXQoKTsKICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCArICJNIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAiIEwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyBjdXJyZW50ICsgIiAiICsgbGFzdDsKICAgICAgICAgICAgICAgIGxhc3QgPSBjdXJyZW50OwogICAgICAgICAgICAgICAgc3VtID0gc3VtICsgY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXRoID0gcGF0aCArICIgWiI7CiAgICAgICAgICAgIHZhciBpbmRleCA9IHN1bSAlIHN0ci5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gU25hcC5wYXRoLmdldFBvaW50QXRMZW5ndGgocGF0aCwgc3RyW2luZGV4XS5jaGFyQ29kZUF0KCkpOwogICAgICAgICAgICByZXR1cm4gZGF0YS5tLnggKyAiOiIgKyBkYXRhLm4ueTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgiY2FsZW5kYXIiLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBvYmogPSB7fTsKCiAgICAgICAgb2JqLmdldFRpbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwogICAgICAgIH07CgogICAgICAgIG9iai5mb3JtYXRUaW1lID0gZnVuY3Rpb24gKGZvcm1hdCwgdGltZXN0YW1wKSB7CiAgICAgICAgICAgIGZvcm1hdCB8fCAoZm9ybWF0ID0gIlktbS1kIEg6aTpzIik7CiAgICAgICAgICAgIHRpbWVzdGFtcCB8fCAodGltZXN0YW1wID0gb2JqLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wKTsKICAgICAgICAgICAgdmFyIHllYXIgPSAxOTAwICsgZGF0ZS5nZXRZZWFyKCk7CiAgICAgICAgICAgIHZhciBtb250aCA9ICIwIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTsKICAgICAgICAgICAgdmFyIGRheSA9ICIwIiArIGRhdGUuZ2V0RGF0ZSgpOwogICAgICAgICAgICB2YXIgaG91ciA9ICIwIiArIGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICAgICAgdmFyIG1pbnV0ZSA9ICIwIiArIGRhdGUuZ2V0TWludXRlcygpOwogICAgICAgICAgICB2YXIgc2Vjb25kID0gIjAiICsgZGF0ZS5nZXRTZWNvbmRzKCk7CiAgICAgICAgICAgIHZhciB2YXJzID0gewogICAgICAgICAgICAgICAgIlkiOiB5ZWFyLAogICAgICAgICAgICAgICAgIm0iOiBtb250aC5zdWJzdHJpbmcobW9udGgubGVuZ3RoIC0gMiwgbW9udGgubGVuZ3RoKSwKICAgICAgICAgICAgICAgICJkIjogZGF5LnN1YnN0cmluZyhkYXkubGVuZ3RoIC0gMiwgZGF5Lmxlbmd0aCksCiAgICAgICAgICAgICAgICAiSCI6IGhvdXIuc3Vic3RyaW5nKGhvdXIubGVuZ3RoIC0gMiwgaG91ci5sZW5ndGgpLAogICAgICAgICAgICAgICAgImkiOiBtaW51dGUuc3Vic3RyaW5nKG1pbnV0ZS5sZW5ndGggLSAyLCBtaW51dGUubGVuZ3RoKSwKICAgICAgICAgICAgICAgICJzIjogc2Vjb25kLnN1YnN0cmluZyhzZWNvbmQubGVuZ3RoIC0gMiwgc2Vjb25kLmxlbmd0aCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG9iai5yZXBsYWNlVmFycyh2YXJzLCBmb3JtYXQpOwogICAgICAgIH07CgogICAgICAgIG9iai5yZXBsYWNlVmFycyA9IGZ1bmN0aW9uICh2YXJzLCB2YWx1ZSkgewogICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShrZXksIHZhcnNba2V5XSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoIm9uZURhdGEiLCBbImVudiIsICJodHRwIl0sIGZ1bmN0aW9uIChlbnYsIGh0dHApIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5yZXF1ZXN0T25lQXBpID0gZnVuY3Rpb24gKHVybCwgZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaHR0cC5hamF4KHsKICAgICAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgZGF0YVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oZW52LmdldEluZm8oKSwgZGF0YSksCiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCIkZXh0ZW5kIiwgWyIkIiwgIkRPTVB1cmlmeSIsICJsb2dnZXIiXSwgZnVuY3Rpb24gKCQsIERPTVB1cmlmeSwgbG9nZ2VyKSB7CiAgICAgICAgdmFyIG9iaiA9IHt9OwoKICAgICAgICBvYmouaW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKERPTVB1cmlmeSAmJiBET01QdXJpZnkgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgdmFyIGRvbVB1cmlmeSA9IERPTVB1cmlmeSh3aW5kb3cpOwogICAgICAgICAgICAgICAgJC5mbi5zYWZlSHRtbCA9IGZ1bmN0aW9uIChodG1sKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5odG1sKGRvbVB1cmlmeS5zYW5pdGl6ZShodG1sKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICQuZm4uc2FmZUh0bWwgPSBmdW5jdGlvbiAoaHRtbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaHRtbChodG1sKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqLmluaXQoKSwgb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgiYXBwUnVubmVyIiwgWyJyb3V0ZXIiLCAibG9nZ2VyIiwgIm1ldGEiLCAiJCJdLCBmdW5jdGlvbiAocm91dGVyLCBsb2dnZXIsIG1ldGEsICQsIHJlcXVpcmUpIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5ydW4gPSBmdW5jdGlvbiAoYXBwTGlzdCkgewogICAgICAgICAgICB2YXIgbWV0YU5hbWUgPSAic3RhdHVzIjsKICAgICAgICAgICAgaWYgKG1ldGEuZXhpc3RNZXRhKG1ldGFOYW1lKSkgewogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInNldHVwIGFscmVhZHkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIOa3u+WKoG1ldGEKICAgICAgICAgICAgICAgIG1ldGEuYXBwZW5kTWV0YShtZXRhTmFtZSk7CgogICAgICAgICAgICAgICAgLy8g6L+Q6KGM5bqU55SoCiAgICAgICAgICAgICAgICAkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvYmoucnVuQXBwTGlzdChhcHBMaXN0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJ1bkFwcExpc3QgPSBmdW5jdGlvbiAoYXBwTGlzdCkgewogICAgICAgICAgICB2YXIgdXJsID0gcm91dGVyLmdldFVybCgpOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIGFwcExpc3QpIHsKICAgICAgICAgICAgICAgIHZhciBhcHAgPSBhcHBMaXN0W2ldOwoKICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG9iai5tYXRjaEFwcCh1cmwsIGFwcCk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZShhcHAubmFtZSkucnVuKCkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLm1hdGNoQXBwID0gZnVuY3Rpb24gKHVybCwgYXBwKSB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICBhcHAubWF0Y2hzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZihpdGVtKSA+IDAgfHwgaXRlbSA9PSAiKiIpIHsKICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIC8qKiBjdXN0b20gKiovCiAgICBjb250YWluZXIuZGVmaW5lKCJmYWN0b3J5IiwgWyJnbURhbyIsICJTY29wZURhbyJdLCBmdW5jdGlvbiAoZ21EYW8sIFNjb3BlRGFvKSB7CiAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgZGFvczoge30KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0Q29uZmlnRGFvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLmdldERhbygiY29uZmlnIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNjb3BlRGFvKGdtRGFvLCAiJGNvbmZpZyIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U3RvcmFnZURhbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG9iai5nZXREYW8oInN0b3JhZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU2NvcGVEYW8oZ21EYW8sICIkc3RvcmFnZSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0RGFvID0gZnVuY3Rpb24gKGtleSwgY3JlYXRlRnVuYykgewogICAgICAgICAgICBpZiAoIW9iai5kYW9zLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIG9iai5kYW9zW2tleV0gPSBjcmVhdGVGdW5jKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9iai5kYW9zW2tleV07CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoImNvbnN0YW50IiwgW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzb3VyY2U6IHsKICAgICAgICAgICAgICAgIGJhaWR1OiAiYmFpZHUiLAogICAgICAgICAgICAgICAgd2VpeXVuOiAid2VpeXVuIiwKICAgICAgICAgICAgICAgIGxhbnpvdXM6ICJsYW56b3VzIiwKICAgICAgICAgICAgICAgIHR5MTg5OiAiMTg5IgogICAgICAgICAgICB9LAogICAgICAgICAgICBvcHRpb246IHsKICAgICAgICAgICAgICAgIGJhaWR1X3BhZ2VfaG9tZTogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJiYWlkdV9wYWdlX2hvbWUiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJhaWR1X3BhZ2Vfc2hhcmU6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAiYmFpZHVfcGFnZV9zaGFyZSIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICJ5ZXMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYmFpZHVfcGFnZV92ZXJpZnk6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAiYmFpZHVfcGFnZV92ZXJpZnkiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJhaWR1X3NoYXJlX3N0YXR1czogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJiYWlkdV9zaGFyZV9zdGF0dXMiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJhaWR1X2N1c3RvbV9wYXNzd29yZDogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJiYWlkdV9jdXN0b21fcGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJhaWR1X3Nob3dfb3JpZ2luOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogImJhaWR1X3Nob3dfb3JpZ2luIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogInllcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBiYWlkdV9hdXRvX2p1bXA6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAiYmFpZHVfYXV0b19qdW1wIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogIm5vIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHdlaXl1bl9wYWdlX2hvbWU6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAid2VpeXVuX3BhZ2VfaG9tZSIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICJ5ZXMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd2VpeXVuX3BhZ2Vfc2hhcmU6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAid2VpeXVuX3BhZ2Vfc2hhcmUiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHdlaXl1bl9wYWdlX3ZlcmlmeTogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJ3ZWl5dW5fcGFnZV92ZXJpZnkiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHdlaXl1bl9zaGFyZV9zdGF0dXM6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAid2VpeXVuX3NoYXJlX3N0YXR1cyIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICJ5ZXMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd2VpeXVuX2F1dG9fanVtcDogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJ3ZWl5dW5fYXV0b19qdW1wIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogIm5vIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxhbnpvdXNfcGFnZV92ZXJpZnk6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAibGFuem91c19wYWdlX3ZlcmlmeSIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICJ5ZXMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGFuem91c19zaGFyZV9zdGF0dXM6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAibGFuem91c19zaGFyZV9zdGF0dXMiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxhbnpvdXNfYXV0b19qdW1wOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogImxhbnpvdXNfYXV0b19qdW1wIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogIm5vIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHR5MTg5X3BhZ2VfaG9tZTogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICIxODlfcGFnZV9ob21lIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogInllcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0eTE4OV9wYWdlX3NoYXJlOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogIjE4OV9wYWdlX3NoYXJlIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogInllcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0eTE4OV9wYWdlX3ZlcmlmeTogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICIxODlfcGFnZV92ZXJpZnkiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAieWVzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHR5MTg5X3NoYXJlX3N0YXR1czogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICIxODlfc2hhcmVfc3RhdHVzIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogInllcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0eTE4OV9hdXRvX2p1bXA6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAiMTg5X2F1dG9fanVtcCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICJubyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCJhcGkiLCBbIm1hbmlmZXN0IiwgIm9uZURhdGEiLCAic3ZnQ3J5cHQiXSwgZnVuY3Rpb24gKG1hbmlmZXN0LCBvbmVEYXRhLCBzdmdDcnlwdCkgewogICAgICAgIHZhciBvYmogPSB7fTsKCiAgICAgICAgb2JqLnZlcnNpb25RdWVyeSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICBvbmVEYXRhLnJlcXVlc3RPbmVBcGkobWFuaWZlc3QuZ2V0QXBpKCJ2ZXJzaW9uIiksIHt9LCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnF1ZXJ5U2hhcmVPcmlnaW4gPSBmdW5jdGlvbiAoc2hhcmVTb3VyY2UsIHNoYXJlSWQsIHNoYXJlTGluaywgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgICBzaGFyZV9pZDogc2hhcmVJZCwKICAgICAgICAgICAgICAgIHNoYXJlX3NvdXJjZTogc2hhcmVTb3VyY2UsCiAgICAgICAgICAgICAgICBzaGFyZV9wb2ludDogc3ZnQ3J5cHQuZ2V0U3RyUG9pbnQoc2hhcmVJZCksCiAgICAgICAgICAgICAgICBzaGFyZV9saW5rOiBzaGFyZUxpbmsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgb25lRGF0YS5yZXF1ZXN0T25lQXBpKG1hbmlmZXN0LmdldEFwaSgib3JpZ2luIiksIGRhdGEsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBvYmoucXVlcnlTaGFyZVB3ZCA9IGZ1bmN0aW9uIChzaGFyZVNvdXJjZSwgc2hhcmVJZCwgc2hhcmVMaW5rLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICAgIHNoYXJlX2lkOiBzaGFyZUlkLAogICAgICAgICAgICAgICAgc2hhcmVfc291cmNlOiBzaGFyZVNvdXJjZSwKICAgICAgICAgICAgICAgIHNoYXJlX3BvaW50OiBzdmdDcnlwdC5nZXRTdHJQb2ludChzaGFyZUlkKSwKICAgICAgICAgICAgICAgIHNoYXJlX2xpbms6IHNoYXJlTGluawogICAgICAgICAgICB9OwogICAgICAgICAgICBvbmVEYXRhLnJlcXVlc3RPbmVBcGkobWFuaWZlc3QuZ2V0QXBpKCJxdWVyeSIpLCBkYXRhLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnN0b3JlU2hhcmVQd2QgPSBmdW5jdGlvbiAoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlTGluaywgc2hhcmVTb3VyY2UsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgc2hhcmVfaWQ6IHNoYXJlSWQsCiAgICAgICAgICAgICAgICBzaGFyZV9wd2Q6IHNoYXJlUHdkLAogICAgICAgICAgICAgICAgc2hhcmVfc291cmNlOiBzaGFyZVNvdXJjZSwKICAgICAgICAgICAgICAgIHNoYXJlX3BvaW50OiBzdmdDcnlwdC5nZXRTdHJQb2ludChzaGFyZUlkKSwKICAgICAgICAgICAgICAgIHNoYXJlX2xpbms6IHNoYXJlTGluawogICAgICAgICAgICB9OwogICAgICAgICAgICBvbmVEYXRhLnJlcXVlc3RPbmVBcGkobWFuaWZlc3QuZ2V0QXBpKCJzdG9yZSIpLCBkYXRhLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnF1ZXJ5U2hhcmVMaXN0ID0gZnVuY3Rpb24gKHNoYXJlU291cmNlLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICAgIHNoYXJlX3NvdXJjZTogc2hhcmVTb3VyY2UKICAgICAgICAgICAgfTsKICAgICAgICAgICAgb25lRGF0YS5yZXF1ZXN0T25lQXBpKG1hbmlmZXN0LmdldEFwaSgibGlzdHMiKSwgZGF0YSwgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIG9iai5kZWxldGVTaGFyZSA9IGZ1bmN0aW9uIChzaGFyZUlkLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICAgIHNoYXJlX2lkOiBzaGFyZUlkLAogICAgICAgICAgICAgICAgc2hhcmVfcG9pbnQ6IHN2Z0NyeXB0LmdldFN0clBvaW50KHNoYXJlSWQpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG9uZURhdGEucmVxdWVzdE9uZUFwaShtYW5pZmVzdC5nZXRBcGkoImRlbGV0ZSIpLCBkYXRhLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoInNoYXJlTG9nIiwgWyJjb25maWciLCAiY2FsZW5kYXIiLCAiY29uc3RhbnQiLCAiYXBpIl0sIGZ1bmN0aW9uIChjb25maWcsIGNhbGVuZGFyLCBjb25zdGFudCwgYXBpKSB7CiAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgbmFtZTogInNoYXJlX2xpc3QiLAogICAgICAgICAgICBtb2RlczogewogICAgICAgICAgICAgICAgTE9DQUw6ICJsb2NhbCIsCiAgICAgICAgICAgICAgICBPTkxJTkU6ICJvbmxpbmUiCiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U2hhcmVNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2hhcmVNb2RlID0gY29uZmlnLmdldENvbmZpZygic2hhcmVfbW9kZSIpOwogICAgICAgICAgICByZXR1cm4gc2hhcmVNb2RlID09IG9iai5tb2Rlcy5MT0NBTCA/IG9iai5tb2Rlcy5MT0NBTCA6IG9iai5tb2Rlcy5PTkxJTkU7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNldFNoYXJlTW9kZSA9IGZ1bmN0aW9uIChzaGFyZU1vZGUpIHsKICAgICAgICAgICAgY29uZmlnLnNldENvbmZpZygic2hhcmVfbW9kZSIsIHNoYXJlTW9kZSA9PSBvYmoubW9kZXMuTE9DQUwgPyBvYmoubW9kZXMuTE9DQUwgOiBvYmoubW9kZXMuT05MSU5FKTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U2hhcmVMb2dMaXN0ID0gZnVuY3Rpb24gKHNoYXJlU291cmNlLCBjYWxsYmFjaykgewogICAgICAgICAgICBpZiAob2JqLmdldFNoYXJlTW9kZSgpID09IG9iai5tb2Rlcy5MT0NBTCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sob2JqLmdldExvY2FsU2hhcmVMb2dMaXN0KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgb2JqLmdldE9ubGluZVNoYXJlTG9nTGlzdChzaGFyZVNvdXJjZSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldE9ubGluZVNoYXJlTG9nTGlzdCA9IGZ1bmN0aW9uIChzaGFyZVNvdXJjZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXBpLnF1ZXJ5U2hhcmVMaXN0KHNoYXJlU291cmNlLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIE9iamVjdCAmJiByZXNwb25zZS5jb2RlID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZS5kYXRhLmxpc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0TG9jYWxTaGFyZUxvZ0xpc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzaGFyZUxpc3QgPSBjb25maWcuZ2V0Q29uZmlnKG9iai5uYW1lKTsKICAgICAgICAgICAgcmV0dXJuIHNoYXJlTGlzdCA/IHNoYXJlTGlzdCA6IHt9OwogICAgICAgIH07CgogICAgICAgIG9iai5hZGRTaGFyZUxvZyA9IGZ1bmN0aW9uIChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVMaW5rLCBzaGFyZVNvdXJjZSkgewogICAgICAgICAgICBhcGkuc3RvcmVTaGFyZVB3ZChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVMaW5rLCBzaGFyZVNvdXJjZSk7CgogICAgICAgICAgICB2YXIgc2hhcmVMaXN0ID0gb2JqLmdldExvY2FsU2hhcmVMb2dMaXN0KCk7CiAgICAgICAgICAgIHNoYXJlTGlzdFtzaGFyZUlkXSA9IHsKICAgICAgICAgICAgICAgIHNoYXJlX2lkOiBzaGFyZUlkLAogICAgICAgICAgICAgICAgc2hhcmVfcHdkOiBzaGFyZVB3ZCwKICAgICAgICAgICAgICAgIHNoYXJlX2xpbms6IHNoYXJlTGluaywKICAgICAgICAgICAgICAgIHNoYXJlX3NvdXJjZTogc2hhcmVTb3VyY2UsCiAgICAgICAgICAgICAgICBzaGFyZV90aW1lOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbmZpZy5zZXRDb25maWcob2JqLm5hbWUsIHNoYXJlTGlzdCk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJlbW92ZVNoYXJlTG9nID0gZnVuY3Rpb24gKHNoYXJlSWQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBzaGFyZUxpc3QgPSBvYmouZ2V0TG9jYWxTaGFyZUxvZ0xpc3QoKTsKICAgICAgICAgICAgZGVsZXRlIHNoYXJlTGlzdFtzaGFyZUlkXTsKICAgICAgICAgICAgY29uZmlnLnNldENvbmZpZyhvYmoubmFtZSwgc2hhcmVMaXN0KTsKCiAgICAgICAgICAgIGFwaS5kZWxldGVTaGFyZShzaGFyZUlkLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmJ1aWxkU2hhcmVMaW5rID0gZnVuY3Rpb24gKHNoYXJlSWQsIHNoYXJlU291cmNlLCBzaGFyZUxpbmspIHsKICAgICAgICAgICAgaWYgKHNoYXJlU291cmNlID09IGNvbnN0YW50LnNvdXJjZS5iYWlkdSkgewogICAgICAgICAgICAgICAgc2hhcmVMaW5rID0gImh0dHBzOi8vcGFuLmJhaWR1LmNvbS9zLzEiICsgc2hhcmVJZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzaGFyZVNvdXJjZSA9PSBjb25zdGFudC5zb3VyY2UuYmFpZHUpIHsKICAgICAgICAgICAgICAgIHNoYXJlTGluayA9ICJodHRwczovL3NoYXJlLndlaXl1bi5jb20vIiArIHNoYXJlSWQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcmVTb3VyY2UgPT0gY29uc3RhbnQuc291cmNlLmJhaWR1KSB7CiAgICAgICAgICAgICAgICBzaGFyZUxpbmsgPSAiaHR0cHM6Ly93d3cubGFuem91cy5jb20vIiArIHNoYXJlSWQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcmVTb3VyY2UgPT0gY29uc3RhbnQuc291cmNlLnR5MTg5KSB7CiAgICAgICAgICAgICAgICBzaGFyZUxpbmsgPSAiaHR0cHM6Ly9jbG91ZC4xODkuY24vdC8iICsgc2hhcmVJZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2hhcmVMaW5rOwogICAgICAgIH07CgogICAgICAgIG9iai5idWlsZFNoYXJlVGltZSA9IGZ1bmN0aW9uIChzaGFyZVRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGVuZGFyLmZvcm1hdFRpbWUoIlktbS1kIEg6aTpzIiwgc2hhcmVUaW1lKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgicnVudGltZSIsIFsicm91dGVyIiwgIm1hbmlmZXN0IiwgImNhbGVuZGFyIiwgInN0b3JhZ2UiLCAiYXBpIl0sIGZ1bmN0aW9uIChyb3V0ZXIsIG1hbmlmZXN0LCBjYWxlbmRhciwgc3RvcmFnZSwgYXBpKSB7CiAgICAgICAgdmFyIG9iaiA9IHt9OwoKICAgICAgICBvYmoub3Blbk9wdGlvbnNQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByb3V0ZXIub3BlblRhYihtYW5pZmVzdC5nZXRPcHRpb25zUGFnZSgpLCB0cnVlKTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFZlcnNpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB2ZXJzaW9uRGF0ZSA9IHBhcnNlSW50KHN0b3JhZ2UuZ2V0VmFsdWUoInZlcnNpb25fZGF0ZSIpKTsKICAgICAgICAgICAgdmFyIGN1cnJlbnREYXRlID0gY2FsZW5kYXIuZm9ybWF0VGltZSgiWW1kIik7CiAgICAgICAgICAgIGlmICghdmVyc2lvbkRhdGUgfHwgdmVyc2lvbkRhdGUgPCBjdXJyZW50RGF0ZSkgewogICAgICAgICAgICAgICAgYXBpLnZlcnNpb25RdWVyeShmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKCJ2ZXJzaW9uX2RhdGUiLCBjdXJyZW50RGF0ZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09IDEgJiYgcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmVyc2lvblBheWxvYWQgPSByZXNwb25zZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKCJ2ZXJzaW9uX3BheWxvYWQiLCB2ZXJzaW9uUGF5bG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoInZlcnNpb25fbGF0ZXN0IiwgdmVyc2lvblBheWxvYWQudmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFJ1bnRpbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5pbml0VmVyc2lvbigpOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCJjb3JlIiwgWyJydW50aW1lIiwgIiRleHRlbmQiXSwgZnVuY3Rpb24gKHJ1bnRpbWUpIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5yZWFkeSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICBydW50aW1lLmluaXRSdW50aW1lKCk7CgogICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICAvKiogYXBwICoqLwogICAgY29udGFpbmVyLmRlZmluZSgiYXBwX2JhaWR1IiwgWyJjb25maWciLCAib3B0aW9uIiwgInJvdXRlciIsICJsb2dnZXIiLCAidW5zYWZlV2luZG93IiwgImNvbnN0YW50IiwgInJ1bnRpbWUiLCAiYXBpIiwgInNoYXJlTG9nIiwgIiQiXSwgZnVuY3Rpb24gKGNvbmZpZywgb3B0aW9uLCByb3V0ZXIsIGxvZ2dlciwgdW5zYWZlV2luZG93LCBjb25zdGFudCwgcnVudGltZSwgYXBpLCBzaGFyZUxvZywgJCkgewogICAgICAgIHZhciBvYmogPSB7CiAgICAgICAgICAgIGFwcF9pZDogNzc4NzUwLAogICAgICAgICAgICB0ZW1wX3BhdGg6ICIvb25ldG1wIiwKICAgICAgICAgICAgeXVuX2RhdGE6IG51bGwsCiAgICAgICAgICAgIHZlcmlmeV9wYWdlOiB7CiAgICAgICAgICAgICAgICBzaGFyZV9wd2Q6IG51bGwsCiAgICAgICAgICAgICAgICBzZXRQd2Q6IG51bGwsCiAgICAgICAgICAgICAgICBiYWNrdXBQd2Q6IG51bGwsCiAgICAgICAgICAgICAgICByZXN0b3JlUHdkOiBudWxsLAogICAgICAgICAgICAgICAgc3VibWl0X3B3ZDogbnVsbAogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJ1biA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHVybCA9IHJvdXRlci5nZXRVcmwoKTsKICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCIuYmFpZHUuY29tL3MvIikgPiAwKSB7CiAgICAgICAgICAgICAgICBvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LmJhaWR1X3BhZ2Vfc2hhcmUpICYmIG9iai5pbml0U2hhcmVQYWdlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigiLmJhaWR1LmNvbS9kaXNrL2hvbWUiKSA+IDApIHsKICAgICAgICAgICAgICAgIG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQuYmFpZHVfcGFnZV9ob21lKSAmJiBvYmouaW5pdEhvbWVQYWdlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5kZXhPZigiLmJhaWR1LmNvbS9kaXNrL3RpbWVsaW5lIikgPiAwKSB7CiAgICAgICAgICAgICAgICBvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LmJhaWR1X3BhZ2VfaG9tZSkgJiYgb2JqLmluaXRUaW1lTGluZVBhZ2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5pbmRleE9mKCIuYmFpZHUuY29tL3NoYXJlL2luaXQiKSA+IDApIHsKICAgICAgICAgICAgICAgIG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQuYmFpZHVfcGFnZV92ZXJpZnkpICYmIG9iai5pbml0VmVyaWZ5UGFnZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFNoYXJlUGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnJlbW92ZVZpZGVvTGltaXQoKTsKCiAgICAgICAgICAgIG9iai5wcmV0dHlTaW5nbGVTaGFyZVBhZ2UoKTsKCiAgICAgICAgICAgIG9iai5pbml0QnV0dG9uU2hhcmUoKTsKCiAgICAgICAgICAgIG9iai5pbml0QnV0dG9uRXZlbnQoKTsKCiAgICAgICAgICAgIGlmIChvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LmJhaWR1X3Nob3dfb3JpZ2luKSkgewogICAgICAgICAgICAgICAgb2JqLnNob3dTaGFyZU9yaWdpbigpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmluaXRIb21lUGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnJlZ2lzdGVyQ3VzdG9tU2hhcmVQd2QoKTsKCiAgICAgICAgICAgIG9iai5pbml0QnV0dG9uSG9tZSgpOwoKICAgICAgICAgICAgb2JqLmluaXRCdXR0b25FdmVudCgpOwogICAgICAgIH07CgogICAgICAgIG9iai5pbml0VGltZUxpbmVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBvYmoucmVnaXN0ZXJDdXN0b21TaGFyZVB3ZCgpOwoKICAgICAgICAgICAgb2JqLmluaXRCdXR0b25UaW1lTGluZSgpOwoKICAgICAgICAgICAgb2JqLmluaXRCdXR0b25FdmVudCgpOwogICAgICAgIH07CgogICAgICAgIG9iai5pbml0VmVyaWZ5UGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnJlZ2lzdGVyU3RvcmVTaGFyZVB3ZCgpOwoKICAgICAgICAgICAgaWYgKG9iai5pbml0VmVyaWZ5UGFnZUVsZW1lbnQoKSkgewogICAgICAgICAgICAgICAgb2JqLmF1dG9QYWRkaW5nU2hhcmVQd2QoKTsKCiAgICAgICAgICAgICAgICBvYmoucmVnaXN0ZXJQd2RTaGFyZVN3aXRjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmluaXRWZXJpZnlQYWdlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHNoYXJlSWQgPSBvYmouZ2V0U2hhcmVJZCgpOwogICAgICAgICAgICB2YXIgJHB3ZCA9ICQoIi5pbnB1dC1hcmVhIGlucHV0Iik7CiAgICAgICAgICAgIGlmIChzaGFyZUlkICYmICRwd2QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvLyDorr7nva7mj5Dlj5bnoIEKICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5zZXRQd2QgPSBmdW5jdGlvbiAocHdkKSB7CiAgICAgICAgICAgICAgICAgICAgJHB3ZC52YWwocHdkKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8g5aSH5Lu95o+Q5Y+W56CBCiAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2UuYmFja3VwUHdkID0gZnVuY3Rpb24gKHB3ZCkgewogICAgICAgICAgICAgICAgICAgICRwd2QuYXR0cigiZGF0YS1wd2QiLCBwd2QpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyDov5jljp/mj5Dlj5bnoIEKICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5yZXN0b3JlUHdkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICRwd2QudmFsKCRwd2QuYXR0cigiZGF0YS1wd2QiKSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIOaPkOS6pOaPkOWPlueggQogICAgICAgICAgICAgICAgdmFyICRidXR0b24gPSAkKCIuaW5wdXQtYXJlYSAuZy1idXR0b24tcmlnaHQiKTsKICAgICAgICAgICAgICAgIGlmICgkYnV0dG9uLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5zdWJtaXRfcHdkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5hdXRvUGFkZGluZ1NoYXJlUHdkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2hhcmVJZCA9IG9iai5nZXRTaGFyZUlkKCk7CiAgICAgICAgICAgIHZhciBzaGFyZUxpbmsgPSByb3V0ZXIuZ2V0VXJsKCk7CiAgICAgICAgICAgIGFwaS5xdWVyeVNoYXJlUHdkKGNvbnN0YW50LnNvdXJjZS5iYWlkdSwgc2hhcmVJZCwgc2hhcmVMaW5rLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09IDEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVQd2QgPSByZXNwb25zZS5kYXRhLnNoYXJlX3B3ZDsKICAgICAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2Uuc2hhcmVfcHdkID0gc2hhcmVQd2Q7CiAgICAgICAgICAgICAgICAgICAgb2JqLnZlcmlmeV9wYWdlLnNldFB3ZChzaGFyZVB3ZCk7CiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dUaXBTdWNjZXNzKCLloavlhYXmj5Dlj5bnoIHmiJDlip8iKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQuYmFpZHVfYXV0b19qdW1wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2Uuc3VibWl0X3B3ZCAmJiBvYmoudmVyaWZ5X3BhZ2Uuc3VibWl0X3B3ZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93VGlwRXJyb3IoIuaaguaXoOS6uuWIhuS6q+aPkOWPlueggSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoucmVnaXN0ZXJQd2RTaGFyZVN3aXRjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8g5re75Yqg5byA5YWzCiAgICAgICAgICAgICQoIi5waWNrcHciKS5hZnRlcignPGRsIGNsYXNzPSJjbGVhcmZpeCI+PGR0PuaPkOWPlueggeWIhuS6q+iuvue9rjxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkIGlkPSJuZC1zaGFyZS1jaGVjayIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ij4gPGEgY2xhc3M9Im5kLW9wZW4tcGFnZS1vcHRpb24iIGhyZWY9ImphdmFzY3JpcHQ6OyIgdGl0bGU9IueCueWHu+afpeeci+abtOWkmuiEmuacrOmFjee9riI+5YWx5Lqr5o+Q5Y+W56CBPC9hPjwvc3Bhbj48L2R0PjwvZGw+Jyk7CiAgICAgICAgICAgIG9iai5pc1B3ZFNoYXJlT3BlbigpIHx8ICQoIiNuZC1zaGFyZS1jaGVjayIpLnJlbW92ZUF0dHIoImNoZWNrZWQiKTsKCiAgICAgICAgICAgIC8vIOW8gOWFsy3kuovku7YKICAgICAgICAgICAgJCgiI25kLXNoYXJlLWNoZWNrIikub24oImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNldE9wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQuYmFpZHVfc2hhcmVfc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbi5zZXRPcHRpb25VbkFjdGl2ZShvcHRpb24uY29uc3RhbnQuYmFpZHVfc2hhcmVfc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyDmiZPlvIDphY3nva7pobUKICAgICAgICAgICAgJCgiLm5kLW9wZW4tcGFnZS1vcHRpb24iKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBydW50aW1lLm9wZW5PcHRpb25zUGFnZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoucmVnaXN0ZXJTdG9yZVNoYXJlUHdkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBvYmouZ2V0SnF1ZXJ5KCkoZG9jdW1lbnQpLmFqYXhDb21wbGV0ZShmdW5jdGlvbiAoZXZlbnQsIHhociwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgdmFyIHJlcXVlc3RVcmwgPSBvcHRpb25zLnVybDsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0VXJsLmluZGV4T2YoIi9zaGFyZS92ZXJpZnkiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gb3B0aW9ucy5kYXRhLm1hdGNoKC9wd2Q9KFthLXowLTldKykvaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oInB3ZCBzaGFyZSBub3QgbWF0Y2giKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIOaLkue7nSrlj7cKICAgICAgICAgICAgICAgICAgICBpZiAob2JqLnZlcmlmeV9wYWdlLmJhY2t1cFB3ZCkgewogICAgICAgICAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2UuYmFja3VwUHdkKG1hdGNoWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChvYmoudmVyaWZ5X3BhZ2UucmVzdG9yZVB3ZCwgNTAwKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHhoci5yZXNwb25zZUpTT047CiAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJybm8gPT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCJwd2Qgc2hhcmUgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZVB3ZCA9IG1hdGNoWzFdOwogICAgICAgICAgICAgICAgICAgIGlmIChzaGFyZVB3ZCA9PSBvYmoudmVyaWZ5X3BhZ2Uuc2hhcmVfcHdkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybigicHdkIHNoYXJlIG5vdCBjaGFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghb2JqLmlzUHdkU2hhcmVPcGVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCJwd2Qgc2hhcmUgY2xvc2VkIik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVJZCA9IG9iai5nZXRTaGFyZUlkKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlTGluayA9IHJvdXRlci5nZXRVcmwoKTsKICAgICAgICAgICAgICAgICAgICBzaGFyZUxvZy5hZGRTaGFyZUxvZyhzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVMaW5rLCBjb25zdGFudC5zb3VyY2UuYmFpZHUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoucmVnaXN0ZXJDdXN0b21TaGFyZVB3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8g5Yqf6IO95byA5YWzCiAgICAgICAgICAgIGlmICghb3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC5iYWlkdV9jdXN0b21fcGFzc3dvcmQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9iai5sb2FkUGx1Z2luKCLnvZHnm5jliIbkuqsiLCAiY29tLmJhaWR1LnBhbiIpOwoKICAgICAgICAgICAgb2JqLm9uTW9kdWxlUmVhZHkoImZ1bmN0aW9uLXdpZGdldC0xOnNoYXJlL3V0aWwvc2hhcmVEaWFsb2cuanMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyDliIbkuqvkuovku7YKICAgICAgICAgICAgICAgIG9iai5hc3luYygiZnVuY3Rpb24td2lkZ2V0LTE6c2hhcmUvdXRpbC9zaGFyZURpYWxvZy5qcyIsIGZ1bmN0aW9uIChzaGFyZURpYWxvZykgewogICAgICAgICAgICAgICAgICAgIHNoYXJlRGlhbG9nLnByb3RvdHlwZS5vblZpc2liaWxpdHlDaGFuZ2VPcmlnaW4gPSBzaGFyZURpYWxvZy5wcm90b3R5cGUub25WaXNpYmlsaXR5Q2hhbmdlOwogICAgICAgICAgICAgICAgICAgIHNoYXJlRGlhbG9nLnByb3RvdHlwZS5vblZpc2liaWxpdHlDaGFuZ2UgPSBmdW5jdGlvbiAoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCIubmQtaW5wdXQtc2hhcmUtcHdkIikubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZVB3ZCA9IGNvbmZpZy5nZXRDb25maWcoInNoYXJlX3B3ZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHRyPjx0ZCBjbGFzcz0iZmlyc3QtY2hpbGQiPjxsYWJlbD7mj5Dlj5bnoIE8L2xhYmVsPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ibmQtaW5wdXQtc2hhcmUtcHdkIiB2YWx1ZT0iJyArIChzaGFyZVB3ZCA/IHNoYXJlUHdkIDogIiIpICsgJyIgcGxhY2Vob2xkZXI9IuS4uuepuuWImemaj+acuuWbm+S9jSIgc3R5bGU9InBhZGRpbmc6IDZweDsgd2lkdGg6IDEwMHB4O2JvcmRlcjogMXB4IHNvbGlkICNlOWU5ZTk7Ij48L3RkPjwvdHI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNzaGFyZSAuZGlhbG9nLWJvZHkgdGFibGUiKS5hcHBlbmQoaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2VPcmlnaW4oc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8g55Sf5oiQ5o+Q5Y+W56CBCiAgICAgICAgICAgICAgICBvYmouYXN5bmMoImZ1bmN0aW9uLXdpZGdldC0xOnNoYXJlL3V0aWwvc2hhcmVGcmllbmQvY3JlYXRlTGlua1NoYXJlLmpzIiwgZnVuY3Rpb24gKHNoYXJlTGluaykgewogICAgICAgICAgICAgICAgICAgIHNoYXJlTGluay5wcm90b3R5cGUubWFrZVByaXZhdGVQYXNzd29yZE9yaWdpbiA9IHNoYXJlTGluay5wcm90b3R5cGUubWFrZVByaXZhdGVQYXNzd29yZDsKICAgICAgICAgICAgICAgICAgICBzaGFyZUxpbmsucHJvdG90eXBlLm1ha2VQcml2YXRlUGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZVB3ZCA9IGNvbmZpZy5nZXRDb25maWcoInNoYXJlX3B3ZCIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhcmVQd2QgPyBzaGFyZVB3ZCA6IHRoaXMubWFrZVByaXZhdGVQYXNzd29yZE9yaWdpbigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyDmj5Dlj5bnoIHmm7TmlLnkuovku7YKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjaGFuZ2UiLCAiLm5kLWlucHV0LXNoYXJlLXB3ZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUubWF0Y2goL15bMC05YS16XXs0fSQvaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dUaXBFcnJvcigi5o+Q5Y+W56CB5Y+q6IO95piv5Zub5L2N5pWw5a2X5oiW5a2X5q+NIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRDb25maWcoInNoYXJlX3B3ZCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoubG9hZFBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lLCBncm91cCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIHBsdWdpbiA9IG9iai5yZXF1aXJlKCJzeXN0ZW0tY29yZTpwbHVnaW5IdWIvZGF0YS9SZWdpc3RyeS5qcyIpLmdldFBsdWdpbkJ5TmFtZUFuZEdyb3VwKG5hbWUsIGdyb3VwKTsKICAgICAgICAgICAgICAgIG9iai5yZXF1aXJlKCJzeXN0ZW0tY29yZTpwbHVnaW5IdWIvaW52b2tlci9sb2FkUGx1Z2luQXNzZXRzLmpzIikocGx1Z2luKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IH0KICAgICAgICB9OwoKICAgICAgICBvYmoub25Nb2R1bGVSZWFkeSA9IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb2JqLnJlcXVpcmUobmFtZSk7CiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9iai5vbk1vZHVsZVJlYWR5KG5hbWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmoucmVtb3ZlVmlkZW9MaW1pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBvYmouZ2V0U3lzdGVtQ29udGV4dCgpLm1lc3NhZ2U7CiAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLmNhbGxTeXN0ZW0oInNoYXJlLXZpZGVvLWFmdGVyLXRyYW5zZmVyIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigid2FpdCByZW1vdmVWaWRlb0xpbWl0Li4uIik7CiAgICAgICAgICAgICAgICBvYmouc2V0VGltZW91dChvYmoucmVtb3ZlVmlkZW9MaW1pdCwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5wcmV0dHlTaW5nbGVTaGFyZVBhZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghb2JqLmlzU2hhcmVQYWdlTXVsdGkoKSkgewogICAgICAgICAgICAgICAgJCgiI2xheW91dE1haW4iKS5jc3MoewogICAgICAgICAgICAgICAgICAgICJ3aWR0aCI6ICJhdXRvIiwKICAgICAgICAgICAgICAgICAgICAibWluLXdpZHRoIjogIjExODBweCIsCiAgICAgICAgICAgICAgICAgICAgIm1hcmdpbiI6ICI4OHB4IDMwcHgiCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5zaG93U2hhcmVPcmlnaW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGFwaS5xdWVyeVNoYXJlT3JpZ2luKGNvbnN0YW50LnNvdXJjZS5iYWlkdSwgb2JqLmdldFNoYXJlSWQoKSwgcm91dGVyLmdldFVybCgpLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09IDEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGlzdCAmJiBkYXRhLmxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDEwcHggNXB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Y2ZjZmNjsgbGluZS1oZWlnaHQ6IDMwcHg7Ij4nOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGRhdGEubGlzdFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGlzdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8cD7liIbkuqvmnaXmupDvvJo8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJyArIGl0ZW0udXJsICsgJyI+JyArIGl0ZW0udGl0bGUgKyAnPC9hPiBbPGEgY2xhc3M9InNob3ctb3JpZ2luLWRpYWxvZyIgaHJlZj0iamF2YXNjcmlwdDo7IiBzdHlsZT0iY29sb3I6I2ZmMDAwMDsiPiDmn6XnnIvmm7TlpJogPC9hPl08L3A+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxwPuWIhuS6q+adpea6kO+8mjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInICsgaXRlbS51cmwgKyAnIj4nICsgaXRlbS50aXRsZSArICc8L2E+PC9wPic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiLm1vZHVsZS1zaGFyZS1oZWFkZXIiKS5hZnRlcihodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIuc2hvdy1vcmlnaW4tZGlhbG9nIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gIuWIhuS6q+adpea6kCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9keSA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOiAyMHB4IDIwcHg7bWluLWhlaWdodDogMTIwcHg7IG1heC1oZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyI+JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICc8cD4nICsgKCsraW5kZXgpICsgJ++8mjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInICsgaXRlbS51cmwgKyAnIj4nICsgaXRlbS50aXRsZSArICc8L2E+PC9wPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvb3RlciA9IG9iai5yZW5kZXJGb290ZXJBcHBJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEaWFsb2codGl0bGUsIGJvZHksIGZvb3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqLnNob3dUaXBFcnJvcigi5pqC5pyq5p+l6K+i5Yiw5YiG5Lqr55qE5p2l5rqQIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdEJ1dHRvblNoYXJlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoJCgiLngtYnV0dG9uLWJveCIpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPGEgY2xhc3M9ImctYnV0dG9uIG5kLWJ1dHRvbi1idWlsZCI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kaXNrIiB0aXRsZT0i5LiL6L29Ij48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0Ij7nlJ/miJDpk77mjqU8L3NwYW4+PC9zcGFuPjwvYT4nOwogICAgICAgICAgICAgICAgJCgiLngtYnV0dG9uLWJveCIpLmFwcGVuZChodG1sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJ3YWl0IGluaXRCdXR0b25TaGFyZS4uLiIpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChvYmouaW5pdEJ1dHRvblNoYXJlLCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmluaXRCdXR0b25Ib21lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbGlzdFRvb2xzID0gb2JqLmdldFN5c3RlbUNvbnRleHQoKS5Ccm9rZXIuZ2V0QnV0dG9uQnJva2VyKCJsaXN0VG9vbHMiKTsKICAgICAgICAgICAgaWYgKGxpc3RUb29scyAmJiBsaXN0VG9vbHMuJGJveCkgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPGEgY2xhc3M9ImctYnV0dG9uIG5kLWJ1dHRvbi1idWlsZCI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kaXNrIiB0aXRsZT0i5LiL6L29Ij48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0Ij7nlJ/miJDpk77mjqU8L3NwYW4+PC9zcGFuPjwvYT4nOwogICAgICAgICAgICAgICAgJChsaXN0VG9vbHMuJGJveCkucHJlcGVuZChodG1sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJ3YWl0IGluaXRCdXR0b25Ib21lLi4uIik7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG9iai5pbml0QnV0dG9uSG9tZSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5pbml0QnV0dG9uVGltZUxpbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICgkKCIubW9kdWxlLW9wZXJhdGVCdG4gLmdyb3VwLWJ1dHRvbiIpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHNwYW4gY2xhc3M9ImJ1dHRvbiI+PGEgY2xhc3M9Imctdi1idXR0b24gZy12LWJ1dHRvbi1taWRkbGUgbmQtYnV0dG9uLWJ1aWxkIj48c3BhbiBjbGFzcz0iZy12LWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZGlzayI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCI+55Sf5oiQ6ZO+5o6lPC9zcGFuPjwvc3Bhbj48L2E+PC9zcGFuPic7CiAgICAgICAgICAgICAgICAkKCIubW9kdWxlLW9wZXJhdGVCdG4gLmdyb3VwLWJ1dHRvbiIpLnByZXBlbmQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigid2FpdCBpbml0QnV0dG9uVGltZUxpbmUuLi4iKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQob2JqLmluaXRCdXR0b25UaW1lTGluZSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5pbml0QnV0dG9uRXZlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIOeUn+aIkOmTvuaOpQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiLm5kLWJ1dHRvbi1idWlsZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB5dW5EYXRhID0gb2JqLmdldFl1bkRhdGEoKTsKICAgICAgICAgICAgICAgIGlmICh5dW5EYXRhLk1ZVUsgfHwgb2JqLmlzSG9tZVBhZ2UoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlTGlzdCA9IG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVTdGF0ID0gb2JqLmdldEZpbGVMaXN0U3RhdChmaWxlTGlzdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gMSAmJiBmaWxlU3RhdC5maWxlX251bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEb3dubG9hZFNlbGVjdChmaWxlTGlzdCwgZmlsZVN0YXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpbGVTdGF0LmZpbGVfbnVtID09IDEgJiYgIW9iai5pc0hvbWVQYWdlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRTaW5nbGUoZmlsZUxpc3QsIGZpbGVTdGF0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWNrID0gZmlsZVN0YXQuZmlsZV9udW0gPyBmYWxzZSA6IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLmlzSG9tZVBhZ2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRJbmZvSG9tZShmaWxlTGlzdCwgcGFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouc2hvd0Rvd25sb2FkSW5mb1NoYXJlT2ZmaWNhbChmaWxlTGlzdCwgcGFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zaG93VGlwRXJyb3IoIuivt+iHs+WwkemAieaLqeS4gOS4quaWh+S7tuaIluaWh+S7tuWkuSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93TG9naW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyDljovnvKnljIUKICAgICAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIi5uZC1idXR0b24tcGFjayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlTGlzdCA9IG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0KCk7CiAgICAgICAgICAgICAgICBpZiAob2JqLmlzSG9tZVBhZ2UoKSkgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRJbmZvSG9tZShmaWxlTGlzdCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvYmouc2hvd0Rvd25sb2FkSW5mb1NoYXJlT2ZmaWNhbChmaWxlTGlzdCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g5aSa5paH5Lu2CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIubmQtYnV0dG9uLW11bHRpIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGVMaXN0ID0gb2JqLmdldFNlbGVjdGVkRmlsZUxpc3QoKTsKCiAgICAgICAgICAgICAgICAvLyDov4fmu6Tmlofku7blpLkKICAgICAgICAgICAgICAgIGZpbGVMaXN0ID0gb2JqLmZpbHRlckZpbGVMaXN0RGlyKGZpbGVMaXN0KTsKCiAgICAgICAgICAgICAgICBpZiAob2JqLmlzSG9tZVBhZ2UoKSkgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRJbmZvSG9tZShmaWxlTGlzdCwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEb3dubG9hZEluZm9TaGFyZU9mZmljYWwoZmlsZUxpc3QsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyDovazlrZjlpJrmlofku7YKICAgICAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIi5uZC1idXR0b24tZGlzayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlTGlzdCA9IG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0KCk7CgogICAgICAgICAgICAgICAgLy8g6L+H5ruk5paH5Lu25aS5CiAgICAgICAgICAgICAgICBmaWxlTGlzdCA9IG9iai5maWx0ZXJGaWxlTGlzdERpcihmaWxlTGlzdCk7CgogICAgICAgICAgICAgICAgaWYgKG9iai5pc0hvbWVQYWdlKCkpIHsKICAgICAgICAgICAgICAgICAgICBvYmouc2hvd0Rvd25sb2FkSW5mb0hvbWUoZmlsZUxpc3QsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRJbmZvU2hhcmVUcmFuc2ZlcihmaWxlTGlzdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g5bqU55SoSUQKICAgICAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIi5uZC1jaGFuZ2UtYXBwLWlkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgb2JqLnNob3dBcHBJZENoYW5nZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJChkb2N1bWVudCkub24oImNoYW5nZSIsICIubmQtaW5wdXQtYXBwLWlkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgb2JqLnNldEFwcElkKHRoaXMudmFsdWUpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIOaJk+W8gOmFjee9rumhtQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiLm5kLW9wZW4tcGFnZS1vcHRpb24iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBydW50aW1lLm9wZW5PcHRpb25zUGFnZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIOaJk+W8gOS4tOaXtumhtemdogogICAgICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiLm5kLW9wZW4tcGFnZS10ZW1wIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcm91dGVyLm9wZW5UYWIoImh0dHBzOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUjL2FsbD92bW9kZT1saXN0JnBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudChvYmouZ2V0VGVtcFBhdGgoKSksIHRydWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd0xvZ2luID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBvYmouZ2V0SnF1ZXJ5KCkoIltub2RlLXR5cGU9J2hlYWRlci1sb2dpbi1idG4nXSIpLmNsaWNrKCk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dEb3dubG9hZEluZm9TaGFyZVRyYW5zZmVyID0gZnVuY3Rpb24gKGZpbGVMaXN0KSB7CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGZpbGVMaXN0KTsKICAgICAgICAgICAgb2JqLmFwcGx5VHJhbnNmZXJGaWxlKGZpbGVMaXN0LCBvYmouZ2V0VGVtcFBhdGgoKSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXh0cmEgJiYgcmVzcG9uc2UuZXh0cmEubGlzdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0TWFwID0ge307CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXh0cmEubGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RNYXBbaXRlbS5mcm9tX2ZzX2lkXSA9IGl0ZW07CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBkb3duTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RNYXAuaGFzT3duUHJvcGVydHkoaXRlbS5mc19pZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZGxpbmsgPSBvYmouYnVpbGREb3dubG9hZFVybChsaXN0TWFwW2l0ZW0uZnNfaWRdLnRvLCBpdGVtLnNlcnZlcl9maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duTGlzdC5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEb3dubG9hZExpbmtGaWxlKGRvd25MaXN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dEb3dubG9hZEluZm9TaGFyZU9mZmljYWwgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIHBhY2spIHsKICAgICAgICAgICAgb2JqLmdldERvd25sb2FkU2hhcmUoZmlsZUxpc3QsIHBhY2ssIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgb2JqLmhpZGVUaXAoKTsKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHJlc3BvbnNlKTsKCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGlzdCAmJiByZXNwb25zZS5saXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIOaWh+S7tgogICAgICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRMaW5rRmlsZShyZXNwb25zZS5saXN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmRsaW5rKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5Y6L57yp5YyFCiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEb3dubG9hZExpbmtQYWNrKGZpbGVMaXN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRsaW5rOiByZXNwb25zZS5kbGluawogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5YW25LuWCiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEaWFsb2dVbktub3duUmVzcG9uc2UocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd0Rvd25sb2FkSW5mb0hvbWUgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIHBhY2spIHsKICAgICAgICAgICAgbG9nZ2VyLmluZm8oZmlsZUxpc3QpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb2JqLmdldERvd25sb2FkSG9tZShmaWxlTGlzdCwgcGFjaywgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLmhpZGVUaXAoKTsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhyZXNwb25zZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChwYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kbGluayAmJiB0eXBlb2YgcmVzcG9uc2UuZGxpbmsgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWOi+e8qeWMhQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEb3dubG9hZExpbmtQYWNrKGZpbGVMaXN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxpbms6IHJlc3BvbnNlLmRsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWFtuS7lgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dEaWFsb2dVbktub3duUmVzcG9uc2UocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGxpbmsgaW5zdGFuY2VvZiBBcnJheSAmJiByZXNwb25zZS5kbGluay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkbGlua01hcHBpbmcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRsaW5rLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGlua01hcHBpbmdbaXRlbS5mc19pZF0gPSBpdGVtLmRsaW5rOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kbGluayA9IGRsaW5rTWFwcGluZ1tpdGVtLmZzX2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRsaW5rQXBpID0gb2JqLmJ1aWxkRG93bmxvYWRVcmwoaXRlbS5wYXRoLCBpdGVtLnNlcnZlcl9maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRsaW5rID0gb2JqLmJ1aWxkRG93bmxvYWRVcmwoaXRlbS5wYXRoLCBpdGVtLnNlcnZlcl9maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvYmouc2hvd0Rvd25sb2FkTGlua0ZpbGUoZmlsZUxpc3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICBpdGVtLmRsaW5rID0gb2JqLmJ1aWxkRG93bmxvYWRVcmwoaXRlbS5wYXRoLCBpdGVtLnNlcnZlcl9maWxlbmFtZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9iai5zaG93RG93bmxvYWRMaW5rRmlsZShmaWxlTGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd0Rvd25sb2FkTGlua0ZpbGUgPSBmdW5jdGlvbiAoZmlsZUxpc3QpIHsKICAgICAgICAgICAgdmFyIHRpdGxlID0gIuaWh+S7tuS4i+i9vSI7CiAgICAgICAgICAgIHZhciBib2R5ID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHggMjBweDttaW4taGVpZ2h0OiAxMjBweDsgbWF4LWhlaWdodDogMzAwcHg7IG92ZXJmbG93LXk6IGF1dG87ICI+JzsKCiAgICAgICAgICAgIHZhciByb3dTdHlsZSA9ICJkaXNwbGF5OmJsb2NrOyBvdmVyZmxvdzpoaWRkZW47IHdoaXRlLXNwYWNlOm5vd3JhcDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsiOwogICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgICAgICAgICAgYm9keSArPSAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPic7CiAgICAgICAgICAgICAgICBib2R5ICs9ICc8ZGl2PicgKyAoaW5kZXggKyAxKSArICfvvJonICsgaXRlbS5zZXJ2ZXJfZmlsZW5hbWUgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmRsaW5rQXBpKSB7CiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnPGRpdj48YSBocmVmPSInICsgaXRlbS5kbGluayArICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChpdGVtLnNlcnZlcl9maWxlbmFtZSkgKyAnIiB0aXRsZT0iJyArIGl0ZW0uZGxpbmsgKyAnIiBzdHlsZT0iJyArIHJvd1N0eWxlICsgJyI+5a6Y5pa577yaJyArIGl0ZW0uZGxpbmsgKyAnPC9hPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnPGRpdj48YSBocmVmPSInICsgaXRlbS5kbGlua0FwaSArICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChpdGVtLnNlcnZlcl9maWxlbmFtZSkgKyAnIiB0aXRsZT0iJyArIGl0ZW0uZGxpbmtBcGkgKyAnIiBzdHlsZT0iJyArIHJvd1N0eWxlICsgJyI+55u06ZO+77yaJyArIGl0ZW0uZGxpbmtBcGkgKyAnPC9hPjwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICc8ZGl2PjxhIGhyZWY9IicgKyBpdGVtLmRsaW5rICsgJyZmaWxlbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0uc2VydmVyX2ZpbGVuYW1lKSArICciIHRpdGxlPSInICsgaXRlbS5kbGluayArICciIHN0eWxlPSInICsgcm93U3R5bGUgKyAnIj4nICsgaXRlbS5kbGluayArICc8L2E+PC9kaXY+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJvZHkgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgYm9keSArPSAnPC9kaXY+JzsKICAgICAgICAgICAgdmFyIGZvb3RlciA9IG9iai5yZW5kZXJGb290ZXJBcHBJZCgpOwogICAgICAgICAgICBvYmouc2hvd0RpYWxvZyh0aXRsZSwgYm9keSwgZm9vdGVyKTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd0Rvd25sb2FkTGlua1BhY2sgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRpdGxlID0gIuaWh+S7tuS4i+i9vSI7CiAgICAgICAgICAgIHZhciBib2R5ID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHggMjBweDttaW4taGVpZ2h0OiAxMjBweDsgbWF4LWhlaWdodDogMzAwcHg7IG92ZXJmbG93LXk6IGF1dG87ICI+JzsKCiAgICAgICAgICAgIHZhciBwYWNrTmFtZSA9IG9iai5nZXREb3dubG9hZFBhY2tOYW1lKGZpbGVMaXN0KTsKICAgICAgICAgICAgYm9keSArPSAnPGRpdj4nICsgcGFja05hbWUgKyAnPC9kaXY+PGRpdj48YSBocmVmPSInICsgZGF0YS5kbGluayArICcmemlwbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhY2tOYW1lKSArICciIHRpdGxlPSInICsgZGF0YS5kbGluayArICciIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyBvdmVyZmxvdzpoaWRkZW47IHdoaXRlLXNwYWNlOm5vd3JhcDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsiPicgKyBkYXRhLmRsaW5rICsgJzwvYT48L2Rpdj4nOwoKICAgICAgICAgICAgYm9keSArPSAnPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMTVweDsiPuaJk+WMheeahOaWh+S7ti/mlofku7blpLnliJfooag8L2Rpdj4nOwogICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgICAgICAgICAgYm9keSArPSAnPGRpdiB0aXRsZT0iJyArIGl0ZW0ucGF0aCArICciIHN0eWxlPSJjb2xvcjogJyArIChpdGVtLmlzZGlyID8gImJsdWUiIDogImluaGVyaXQiKSArICc7Ij5bJyArIChpbmRleCArIDEpICsgJ10gJyArIGl0ZW0uc2VydmVyX2ZpbGVuYW1lICsgJzwvZGl2Pic7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgYm9keSArPSAnPC9kaXY+JzsKICAgICAgICAgICAgdmFyIGZvb3RlciA9IG9iai5yZW5kZXJGb290ZXJBcHBJZCgpOwogICAgICAgICAgICBvYmouc2hvd0RpYWxvZyh0aXRsZSwgYm9keSwgZm9vdGVyKTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0RG93bmxvYWRQYWNrTmFtZSA9IGZ1bmN0aW9uIChmaWxlTGlzdCkgewogICAgICAgICAgICByZXR1cm4gZmlsZUxpc3RbMF0uc2VydmVyX2ZpbGVuYW1lICsgIiDnrYkiICsgZmlsZUxpc3QubGVuZ3RoICsgIuS4quaWh+S7ti56aXAiOwogICAgICAgIH07CgogICAgICAgIG9iai5idWlsZERvd25sb2FkVXJsID0gZnVuY3Rpb24gKHBhdGgsIG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuICJodHRwczovL3Bjcy5iYWlkdS5jb20vcmVzdC8yLjAvcGNzL2ZpbGU/bWV0aG9kPWRvd25sb2FkJmFwcF9pZD0iICsgb2JqLmdldEFwcElkKCkgKyAiJmZpbGVuYW1lPSIgKyBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAiJnBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudChwYXRoKTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd0Rvd25sb2FkU2luZ2xlID0gZnVuY3Rpb24gKGZpbGVMaXN0LCBmaWxlU3RhdCkgewogICAgICAgICAgICB2YXIgdGl0bGUgPSAi6ZO+5o6l57G75Z6LIjsKICAgICAgICAgICAgdmFyIGJvZHkgPSAnPGRpdiBzdHlsZT0icGFkZGluZzogNDBweCAyMHB4OyBtYXgtaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3cteTogYXV0bzsiPic7CgogICAgICAgICAgICBib2R5ICs9ICc8ZGl2IGNsYXNzPSJub3JtYWxCdG5Cb3ggZy1jZW50ZXIiPic7CiAgICAgICAgICAgIGJvZHkgKz0gJzxhIGNsYXNzPSJnLWJ1dHRvbiBnLWJ1dHRvbi1sYXJnZSBnLWJ1dHRvbi1ncmF5LWxhcmdlIG5kLWJ1dHRvbi1tdWx0aSIgdGl0bGU9Iuiwg+eUqOWumOaWueaOpeWPo+eUn+aIkOmTvuaOpSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCI+PC9lbT4g5a6Y5pa56ZO+5o6lPC9zcGFuPjwvYT4nOwogICAgICAgICAgICBib2R5ICs9ICc8YSBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tbGFyZ2UgZy1idXR0b24tZ3JheS1sYXJnZSBuZC1idXR0b24tZGlzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OjUwcHg7IiB0aXRsZT0i6L2s5a2Y5paH5Lu254S25ZCO55Sf5oiQ5paH5Lu255u06ZO+Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxlbSBjbGFzcz0iaWNvbiBpY29uLXNhdmUtZGlzayI+PC9lbT4g6L2s5a2Y55u06ZO+PC9zcGFuPjwvYT4nOwogICAgICAgICAgICBib2R5ICs9ICc8L2Rpdj4nOwoKICAgICAgICAgICAgaWYgKGZpbGVTdGF0LmRpcl9udW0pIHsKICAgICAgICAgICAgICAgIGJvZHkgKz0gJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDQwcHg7IHBhZGRpbmctdG9wOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAtMjBweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNEMERGRTc7Ij48cCBjbGFzcz0iZy1jZW50ZXIiPumAieaLqSBb5aSa5paH5Lu2XSDkvJrov4fmu6TlvZPliY3pgInkuK3nmoQgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPicgKyBmaWxlU3RhdC5kaXJfbnVtICsgJzwvc3Bhbj4g5Liq5paH5Lu25aS5PC9wPic7CgogICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMTsKICAgICAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc2RpcikgewogICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICc8cCB0aXRsZT0iJyArIGl0ZW0ucGF0aCArICciIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlsnICsgaW5kZXggKyAnXSAnICsgaXRlbS5zZXJ2ZXJfZmlsZW5hbWUgKyAnPC9wPic7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBib2R5ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBib2R5ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICB2YXIgZm9vdGVyID0gb2JqLnJlbmRlckZvb3RlckFwcElkKCk7CiAgICAgICAgICAgIG9iai5zaG93RGlhbG9nKHRpdGxlLCBib2R5LCBmb290ZXIpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93RG93bmxvYWRTZWxlY3QgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIGZpbGVTdGF0KSB7CiAgICAgICAgICAgIHZhciB0aXRsZSA9ICLpk77mjqXnsbvlnosiOwogICAgICAgICAgICB2YXIgYm9keSA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOiA0MHB4IDIwcHg7IG1heC1oZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyI+JzsKCiAgICAgICAgICAgIGJvZHkgKz0gJzxkaXYgY2xhc3M9Im5vcm1hbEJ0bkJveCBnLWNlbnRlciI+JzsKICAgICAgICAgICAgaWYgKG9iai5pc0hvbWVQYWdlKCkpIHsKICAgICAgICAgICAgICAgIGJvZHkgKz0gJzxhIGNsYXNzPSJnLWJ1dHRvbiBnLWJ1dHRvbi1sYXJnZSBnLWJ1dHRvbi1ncmF5LWxhcmdlIG5kLWJ1dHRvbi1kaXNrIiB0aXRsZT0i5ZCI5bm25a6Y5pa56ZO+5o6l5ZKM5paH5Lu255u06ZO+Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxlbSBjbGFzcz0iaWNvbiBpY29uLXNhdmUtZGlzayI+PC9lbT4g5aSa5paH5Lu2PC9zcGFuPjwvYT4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYm9keSArPSAnPGEgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWxhcmdlIGctYnV0dG9uLWdyYXktbGFyZ2UgbmQtYnV0dG9uLW11bHRpIj48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiIHRpdGxlPSLosIPnlKjlrpjmlrnmjqXlj6PnlJ/miJDmlofku7bpk77mjqUiPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRvd25sb2FkIj48L2VtPiDlrpjmlrnlpJrmlofku7Y8L3NwYW4+PC9hPic7CiAgICAgICAgICAgICAgICBib2R5ICs9ICc8YSBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tbGFyZ2UgZy1idXR0b24tZ3JheS1sYXJnZSBuZC1idXR0b24tZGlzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OjUwcHg7IiB0aXRsZT0i6L2s5a2Y5paH5Lu254S25ZCO55Sf5oiQ5paH5Lu255u06ZO+Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxlbSBjbGFzcz0iaWNvbiBpY29uLXNhdmUtZGlzayI+PC9lbT4g6L2s5a2Y5aSa5paH5Lu2PC9zcGFuPjwvYT4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJvZHkgKz0gJzxhIGNsYXNzPSJnLWJ1dHRvbiBnLWJ1dHRvbi1sYXJnZSBnLWJ1dHRvbi1ncmF5LWxhcmdlIG5kLWJ1dHRvbi1wYWNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6NTBweDsiIHRpdGxlPSLosIPnlKjlrpjmlrnmjqXlj6PnlJ/miJDljovnvKnljIXpk77mjqUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tcG9seSI+PC9lbT4g5Y6L57yp5YyFPC9zcGFuPjwvYT4nOwogICAgICAgICAgICBib2R5ICs9ICc8L2Rpdj4nOwoKICAgICAgICAgICAgaWYgKGZpbGVTdGF0LmRpcl9udW0pIHsKICAgICAgICAgICAgICAgIGJvZHkgKz0gJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDQwcHg7IHBhZGRpbmctdG9wOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAtMjBweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNEMERGRTc7Ij48cCBjbGFzcz0iZy1jZW50ZXIiPumAieaLqSBb5aSa5paH5Lu2XSDkvJrov4fmu6TlvZPliY3pgInkuK3nmoQgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPicgKyBmaWxlU3RhdC5kaXJfbnVtICsgJzwvc3Bhbj4g5Liq5paH5Lu25aS5PC9wPic7CiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSAxOwogICAgICAgICAgICAgICAgZmlsZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzZGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJzxwIHRpdGxlPSInICsgaXRlbS5wYXRoICsgJyIgc3R5bGU9ImNvbG9yOiBibHVlOyI+WycgKyBpbmRleCArICddICcgKyBpdGVtLnNlcnZlcl9maWxlbmFtZSArICc8L3A+JzsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGJvZHkgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJvZHkgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIHZhciBmb290ZXIgPSBvYmoucmVuZGVyRm9vdGVyQXBwSWQoKTsKICAgICAgICAgICAgb2JqLnNob3dEaWFsb2codGl0bGUsIGJvZHksIGZvb3Rlcik7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dBcHBJZENoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHRpdGxlID0gIuW6lOeUqElEIjsKICAgICAgICAgICAgdmFyIGJvZHkgPSAnPGRpdiBzdHlsZT0icGFkZGluZzogNjBweCAyMHB4OyBtYXgtaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3cteTogYXV0bzsiPjxkaXYgY2xhc3M9ImctY2VudGVyIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPuW9k+WJjeW6lOeUqElE77yaPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJuZC1pbnB1dC1hcHAtaWQiIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjZjJmMmYyOyBwYWRkaW5nOiA0cHggNXB4OyIgdmFsdWU9IicgKyBvYmouZ2V0QXBwSWQoKSArICciPjwvZGl2PjxkaXYgY2xhc3M9ImctY2VudGVyIj48cD7nlKjkuo7mnoTpgKDkuKrkurrnvZHnm5jmlofku7bnmoTkuIvovb3nm7Tpk77vvIzmm7TlpJrlupTnlKhJROivt+afpeecizxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZ28ubmV3ZGF5Lm1lL3MvcGFuLXNjcmlwdCI+IOiEmuacrOS4u+mhtSA8L2E+PC9wPjwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgIHZhciBmb290ZXIgPSAnJzsKICAgICAgICAgICAgb2JqLnNob3dEaWFsb2codGl0bGUsIGJvZHksIGZvb3Rlcik7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dEaWFsb2dVbktub3duUmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgdmFyIHRpdGxlID0gIuacquefpee7k+aenCI7CiAgICAgICAgICAgIHZhciBib2R5ID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHggMjBweDsgbWF4LWhlaWdodDogMzAwcHg7IG92ZXJmbG93LXk6IGF1dG87Ij48cHJlIHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsOyI+JyArIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLCBudWxsLCA0KSArICc8L3ByZT48L2Rpdj4nOwogICAgICAgICAgICB2YXIgZm9vdGVyID0gb2JqLnJlbmRlckZvb3RlckFwcElkKCk7CiAgICAgICAgICAgIG9iai5zaG93RGlhbG9nKHRpdGxlLCBib2R5LCBmb290ZXIpOwogICAgICAgIH07CgogICAgICAgIG9iai5yZW5kZXJGb290ZXJBcHBJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICc8cCBzdHlsZT0icGFkZGluZy10b3A6IDEwcHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjRDBERkU3OyI+5bqU55SoSUTvvJonICsgb2JqLmdldEFwcElkKCkgKyAnIDxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9Im5kLWNoYW5nZS1hcHAtaWQiPuS/ruaUuTwvYT7vvIzlhbbku5bpobXpnaLvvJogPGEgY2xhc3M9Im5kLW9wZW4tcGFnZS1vcHRpb24iIGhyZWY9ImphdmFzY3JpcHQ6OyI+6YWN572u6aG16Z2iPC9hPiDjgIE8YSBjbGFzcz0ibmQtb3Blbi1wYWdlLXRlbXAiIGhyZWY9ImphdmFzY3JpcHQ6OyI+5Li05pe25paH5Lu2PC9hPjwvcD4nOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93RGlhbG9nID0gZnVuY3Rpb24gKHRpdGxlLCBib2R5LCBmb290ZXIpIHsKICAgICAgICAgICAgdmFyIGRpYWxvZyA9IG9iai5yZXF1aXJlKCJzeXN0ZW0tY29yZTpzeXN0ZW0vdWlTZXJ2aWNlL2RpYWxvZy9kaWFsb2cuanMiKS52ZXJpZnkoewogICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgaW1nOiAiaW1nIiwKICAgICAgICAgICAgICAgIHZjb2RlOiAidmNvZGUiCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g5YaF5a65CiAgICAgICAgICAgICQoZGlhbG9nLiRkaWFsb2cpLmZpbmQoIi5kaWFsb2ctYm9keSIpLnNhZmVIdG1sKGJvZHkpOwoKICAgICAgICAgICAgLy8g5bqV6YOoCiAgICAgICAgICAgICQoZGlhbG9nLiRkaWFsb2cpLmZpbmQoIi5kaWFsb2ctZm9vdGVyIikuc2FmZUh0bWwoZm9vdGVyKTsKCiAgICAgICAgICAgIGRpYWxvZy5zaG93KCk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dUaXBTdWNjZXNzID0gZnVuY3Rpb24gKG1zZywgaGFzQ2xvc2UsIGF1dG9DbG9zZSkgewogICAgICAgICAgICBvYmouc2hvd1RpcCgic3VjY2VzcyIsIG1zZywgaGFzQ2xvc2UsIGF1dG9DbG9zZSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dUaXBFcnJvciA9IGZ1bmN0aW9uIChtc2csIGhhc0Nsb3NlLCBhdXRvQ2xvc2UpIHsKICAgICAgICAgICAgb2JqLnNob3dUaXAoImZhaWx1cmUiLCBtc2csIGhhc0Nsb3NlLCBhdXRvQ2xvc2UpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93VGlwTG9hZGluZyA9IGZ1bmN0aW9uIChtc2csIGhhc0Nsb3NlLCBhdXRvQ2xvc2UpIHsKICAgICAgICAgICAgb2JqLnNob3dUaXAoImxvYWRpbmciLCBtc2csIGhhc0Nsb3NlLCBhdXRvQ2xvc2UpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93VGlwID0gZnVuY3Rpb24gKG1vZGUsIG1zZywgaGFzQ2xvc2UsIGF1dG9DbG9zZSkgewogICAgICAgICAgICB2YXIgb3B0aW9uID0gewogICAgICAgICAgICAgICAgbW9kZTogbW9kZSwKICAgICAgICAgICAgICAgIG1zZzogbXNnCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyDlhbPpl63mjInpkq4KICAgICAgICAgICAgaWYgKHR5cGVvZiBoYXNDbG9zZSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgb3B0aW9uLmhhc0Nsb3NlID0gaGFzQ2xvc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIOiHquWKqOWFs+mXrQogICAgICAgICAgICBpZiAodHlwZW9mIGF1dG9DbG9zZSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgb3B0aW9uLmF1dG9DbG9zZSA9IGF1dG9DbG9zZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgb2JqLnJlcXVpcmUoInN5c3RlbS1jb3JlOnN5c3RlbS91aVNlcnZpY2UvdGlwL3RpcC5qcyIpLnNob3cob3B0aW9uKTsKICAgICAgICB9OwoKICAgICAgICBvYmouaGlkZVRpcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnJlcXVpcmUoInN5c3RlbS1jb3JlOnN5c3RlbS91aVNlcnZpY2UvdGlwL3RpcC5qcyIpLmhpZGUoewogICAgICAgICAgICAgICAgaGlkZVRpcHNBbmltYXRpb25GbGFnOiAxCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5pc0hvbWVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdXJsID0gcm91dGVyLmdldFVybCgpOwogICAgICAgICAgICBpZiAodXJsLmluZGV4T2YoIi5iYWlkdS5jb20vZGlzayIpID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouaXNUaW1lbGluZVBhZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSByb3V0ZXIuZ2V0VXJsKCk7CiAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLmJhaWR1LmNvbS9kaXNrL3RpbWVsaW5lIikgPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5pc1NoYXJlUGFnZU11bHRpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgeXVuRGF0YSA9IG9iai5nZXRZdW5EYXRhKCk7CiAgICAgICAgICAgIGlmICh5dW5EYXRhLlNIQVJFUEFHRVRZUEUgPT0gInNpbmdsZV9maWxlX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAob2JqLmlzSG9tZVBhZ2UoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0SG9tZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0U2hhcmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0SG9tZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKG9iai5pc1RpbWVsaW5lUGFnZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnJlcXVpcmUoInBhbi10aW1lbGluZTp3aWRnZXQvc3RvcmUvaW5kZXguanMiKS5nZXR0ZXJzLmdldENob29zZWRJdGVtQXJyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5yZXF1aXJlKCdzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMnKS5pbnN0YW5jZUZvclN5c3RlbS5saXN0LmdldFNlbGVjdGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U2VsZWN0ZWRGaWxlTGlzdFNoYXJlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLnJlcXVpcmUoJ3N5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcycpLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0RmlsZUxpc3RTdGF0ID0gZnVuY3Rpb24gKGZpbGVMaXN0KSB7CiAgICAgICAgICAgIHZhciBmaWxlU3RhdCA9IHsKICAgICAgICAgICAgICAgIGZpbGVfbnVtOiAwLAogICAgICAgICAgICAgICAgZGlyX251bTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc2RpciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZVN0YXQuZmlsZV9udW0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZpbGVTdGF0LmRpcl9udW0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBmaWxlU3RhdDsKICAgICAgICB9OwoKICAgICAgICBvYmouZmlsdGVyRmlsZUxpc3REaXIgPSBmdW5jdGlvbiAoZmlsZUxpc3QpIHsKICAgICAgICAgICAgdmFyIGZpbGVMaXN0RmlsdGVyID0gW107CiAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzZGlyID09IDApIHsKICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdEZpbHRlci5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZpbGVMaXN0RmlsdGVyOwogICAgICAgIH07CgogICAgICAgIG9iai5wYXJzZUZpZExpc3QgPSBmdW5jdGlvbiAoZmlsZUxpc3QpIHsKICAgICAgICAgICAgdmFyIGZpZExpc3QgPSBbXTsKICAgICAgICAgICAgZmlsZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgZmlkTGlzdC5wdXNoKGl0ZW0uZnNfaWQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZpZExpc3Q7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldERvd25sb2FkU2hhcmUgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIHBhY2ssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIG9iai5zaG93VGlwTG9hZGluZygi55Sf5oiQ6ZO+5o6l5Lit77yM6K+356iN562JLi4uIik7CiAgICAgICAgICAgIG9iai5pbml0V2lkZ2V0Q29udGV4dCgiZnVuY3Rpb24td2lkZ2V0LTE6ZG93bmxvYWQvdXRpbC9jb250ZXh0LmpzIik7CiAgICAgICAgICAgIG9iai5hc3luYygiZnVuY3Rpb24td2lkZ2V0LTE6ZG93bmxvYWQvc2VydmljZS9kbGlua1NlcnZpY2UuanMiLCBmdW5jdGlvbiAoZGwpIHsKICAgICAgICAgICAgICAgIHZhciB5dW5EYXRhID0gb2JqLmdldFl1bkRhdGEoKTsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgICAgIGxpc3Q6IGZpbGVMaXN0LAogICAgICAgICAgICAgICAgICAgIHNoYXJlX3VrOiB5dW5EYXRhLlNIQVJFX1VLLAogICAgICAgICAgICAgICAgICAgIHNoYXJlX2lkOiB5dW5EYXRhLlNIQVJFX0lELAogICAgICAgICAgICAgICAgICAgIHNpZ246IHl1bkRhdGEuU0lHTiwKICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHl1bkRhdGEuVElNRVNUQU1QLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhY2sgPyAiYmF0Y2giIDogIm5vbGltaXQiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZGwuZ2V0RGxpbmtTaGFyZShkYXRhLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXREb3dubG9hZEhvbWUgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIHBhY2ssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIG9iai5zaG93VGlwTG9hZGluZygi55Sf5oiQ6ZO+5o6l5Lit77yM6K+356iN562JLi4uIik7CiAgICAgICAgICAgIG9iai5pbml0V2lkZ2V0Q29udGV4dCgiZnVuY3Rpb24td2lkZ2V0LTE6ZG93bmxvYWQvdXRpbC9jb250ZXh0LmpzIik7CiAgICAgICAgICAgIG9iai5hc3luYygiZnVuY3Rpb24td2lkZ2V0LTE6ZG93bmxvYWQvc2VydmljZS9kbGlua1NlcnZpY2UuanMiLCBmdW5jdGlvbiAoZGwpIHsKICAgICAgICAgICAgICAgIHZhciBmaWRMaXN0ID0gb2JqLnBhcnNlRmlkTGlzdChmaWxlTGlzdCk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHBhY2sgPyAiYmF0Y2giIDogIm5vbGltaXQiOwogICAgICAgICAgICAgICAgZGwuZ2V0RGxpbmtQYW4oSlNPTi5zdHJpbmdpZnkoZmlkTGlzdCksIHR5cGUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmFwcGx5VHJhbnNmZXJGaWxlID0gZnVuY3Rpb24gKGZpbGVMaXN0LCBwYXRoLCBjYWxsYmFjaykgewogICAgICAgICAgICBvYmoubGlzdERpcihwYXRoLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5lcnJubyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLnRyYW5zZmVyRmlsZShmaWxlTGlzdCwgcGF0aCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBvYmouY3JlYXRlRGlyKHBhdGgsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJybm8gPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnRyYW5zZmVyRmlsZShmaWxlTGlzdCwgcmVzcG9uc2UucGF0aCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai50cmFuc2ZlckZpbGUgPSBmdW5jdGlvbiAoZmlsZUxpc3QsIHBhdGgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciB5dW5EYXRhID0gb2JqLmdldFl1bkRhdGEoKTsKICAgICAgICAgICAgdmFyIGZpZExpc3QgPSBvYmoucGFyc2VGaWRMaXN0KGZpbGVMaXN0KTsKICAgICAgICAgICAgdmFyIHVybCA9ICIvc2hhcmUvdHJhbnNmZXI/b25kdXA9bmV3Y29weSZhc3luYz0xJnNoYXJlaWQ9IiArIHl1bkRhdGEuU0hBUkVfSUQgKyAiJmZyb209IiArIHl1bkRhdGEuU0hBUkVfVUs7CiAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgZnNpZGxpc3Q6ICJbIiArIGZpZExpc3Quam9pbigiLCIpICsgIl0iLAogICAgICAgICAgICAgICAgcGF0aDogcGF0aAogICAgICAgICAgICB9OwogICAgICAgICAgICBvYmouYWpheCh7CiAgICAgICAgICAgICAgICB0eXBlOiAicG9zdCIsCiAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgdGltZW91dDogMWU1LAogICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygiIik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoubGlzdERpciA9IGZ1bmN0aW9uIChwYXRoLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgdXJsID0gIi9hcGkvbGlzdCI7CiAgICAgICAgICAgIG9iai5hamF4KHsKICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgb3JkZXI6ICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICBkZXNjOiAwLAogICAgICAgICAgICAgICAgICAgIHNob3dlbXB0eTogMCwKICAgICAgICAgICAgICAgICAgICB3ZWI6IDEsCiAgICAgICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgICAgICBudW06IDEwLAogICAgICAgICAgICAgICAgICAgIGRpcjogcGF0aAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICB0aW1lb3V0OiAxZTUsCiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCIiKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5jcmVhdGVEaXIgPSBmdW5jdGlvbiAocGF0aCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHVybCA9ICIvYXBpL2NyZWF0ZT9hPWNvbW1pdCI7CiAgICAgICAgICAgIG9iai5hamF4KHsKICAgICAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgaXNkaXI6IDEsCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfbGlzdDogIltdIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICB0aW1lb3V0OiAxZTUsCiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCIiKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTaGFyZUlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbWF0Y2g7CgogICAgICAgICAgICBtYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL3NoYXJlXC9pbml0XD9zdXJsPShbYS16MC05LV9dKykvaSk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYXRjaCA9IGxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cL3NcLzEoW2EtejAtOS1fXSspL2kpOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmlzUHdkU2hhcmVPcGVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC5iYWlkdV9zaGFyZV9zdGF0dXMpOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRZdW5EYXRhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIW9iai55dW5fZGF0YSkgewogICAgICAgICAgICAgICAgb2JqLnl1bl9kYXRhID0gdW5zYWZlV2luZG93Lnl1bkRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9iai55dW5fZGF0YTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0VGVtcFBhdGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB0ZW1wUGF0aCA9IGNvbmZpZy5nZXRDb25maWcoInRlbXBfcGF0aCIpOwogICAgICAgICAgICBpZiAodGVtcFBhdGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wUGF0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmoudGVtcF9wYXRoOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNldFRlbXBQYXRoID0gZnVuY3Rpb24gKHRlbXBQYXRoKSB7CiAgICAgICAgICAgIGNvbmZpZy5zZXRDb25maWcoInRlbXBfcGF0aCIsIHRlbXBQYXRoKTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0QXBwSWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBhcHBJZCA9IGNvbmZpZy5nZXRDb25maWcoImFwcF9pZCIpOwogICAgICAgICAgICBpZiAoYXBwSWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcHBJZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXBwX2lkOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNldEFwcElkID0gZnVuY3Rpb24gKGFwcElkKSB7CiAgICAgICAgICAgIGNvbmZpZy5zZXRDb25maWcoImFwcF9pZCIsIGFwcElkKTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFdpZGdldENvbnRleHQgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb2JqLmFzeW5jKG5hbWUsIGZ1bmN0aW9uICh3aWRnZXQpIHsKICAgICAgICAgICAgICAgICAgICB3aWRnZXQuc2V0Q29udGV4dChvYmouZ2V0U3lzdGVtQ29udGV4dCgpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgfQogICAgICAgIH07CgogICAgICAgIG9iai5hamF4ID0gZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgICBvYmouZ2V0SnF1ZXJ5KCkuYWpheChvcHRpb24pOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTeXN0ZW1Db250ZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLnJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpLmluc3RhbmNlRm9yU3lzdGVtOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRKcXVlcnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmoucmVxdWlyZSgiYmFzZTp3aWRnZXQvbGlicy9qcXVlcnlwYWNrZXQuanMiKTsKICAgICAgICB9OwoKICAgICAgICBvYmoucmVxdWlyZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiB1bnNhZmVXaW5kb3cucmVxdWlyZShuYW1lKTsKICAgICAgICB9OwoKICAgICAgICBvYmouYXN5bmMgPSBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdW5zYWZlV2luZG93LnJlcXVpcmUuYXN5bmMobmFtZSwgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCJhcHBfd2VpeXVuIiwgWyJyb3V0ZXIiLCAib3B0aW9uIiwgImxvZ2dlciIsICJ1bnNhZmVXaW5kb3ciLCAiY29uc3RhbnQiLCAicnVudGltZSIsICJhcGkiLCAic2hhcmVMb2ciLCAiJCJdLCBmdW5jdGlvbiAocm91dGVyLCBvcHRpb24sIGxvZ2dlciwgdW5zYWZlV2luZG93LCBjb25zdGFudCwgcnVudGltZSwgYXBpLCBzaGFyZUxvZywgJCkgewogICAgICAgIHZhciBvYmogPSB7CiAgICAgICAgICAgIG1vZHVsZXM6IHt9LAogICAgICAgICAgICB3ZWJwYWNrX3JlcXVpcmU6IG51bGwsCiAgICAgICAgICAgIHZlcmlmeV9wYWdlOiB7CiAgICAgICAgICAgICAgICBzZXRQd2Q6IG51bGwsCiAgICAgICAgICAgICAgICBzaGFyZV9wd2Q6IG51bGwsCiAgICAgICAgICAgICAgICBzdWJtaXRfcHdkOiBudWxsCiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmoucnVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdXJsID0gcm91dGVyLmdldFVybCgpOwogICAgICAgICAgICBpZiAodXJsLmluZGV4T2YoIndlaXl1bi5jb20vZGlzayIpID4gMCkgewogICAgICAgICAgICAgICAgb3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC53ZWl5dW5fcGFnZV9ob21lKSAmJiBvYmouaW5pdEhvbWVQYWdlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigic2hhcmUud2VpeXVuLmNvbSIpID4gMCkgewogICAgICAgICAgICAgICAgb2JqLmluaXRWZXJpZnlQYWdlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5pbml0SG9tZVBhZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5pbml0V2VicGFja1JlcXVpcmUoKTsKCiAgICAgICAgICAgIHNldEludGVydmFsKG9iai5pbml0SG9tZVBhZ2VFbGVtZW50LCAxMDAwKTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdEhvbWVQYWdlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJzxkaXYgY2xhc3M9ImFjdGlvbi1pdGVtIG1vZC1hY3Rpb24td3JhcC1saW5rIj48ZGl2IGNsYXNzPSJhY3Rpb24taXRlbS1jb24iPjxpIGNsYXNzPSJpY29uIGljb24tbGluayI+PC9pPjxzcGFuIGNsYXNzPSJhY3QtdHh0Ij7mmL7npLrpk77mjqU8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgICAgICAgICAgJCgiLm1vZC1hY3Rpb24td3JhcC1tZW51Om5vdCgubmQtc2hvdy1saW5rLWFscmVhZHkpIikuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLmZpbmQoIi5pY29uLWRvd25sb2FkIikpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy5hZGRDbGFzcygibmQtc2hvdy1saW5rLWFscmVhZHkiKTsKCiAgICAgICAgICAgICAgICAgICAgJHRoaXMucHJlcGVuZCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMuZmluZCgiLm1vZC1hY3Rpb24td3JhcC1saW5rIikuY2xpY2soZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dIb21lRG93bmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmluaXRWZXJpZnlQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBvYmouaW5pdFdlYnBhY2tSZXF1aXJlKCk7CgogICAgICAgICAgICBpZiAob3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC53ZWl5dW5fcGFnZV92ZXJpZnkpKSB7CiAgICAgICAgICAgICAgICBvYmoucmVnaXN0ZXJTdG9yZVNoYXJlUHdkKCk7CgogICAgICAgICAgICAgICAgb2JqLmluaXRWZXJpZnlQYWdlRWxlbWVudChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLmF1dG9QYWRkaW5nU2hhcmVQd2QoKTsKICAgICAgICAgICAgICAgICAgICBvYmoucmVnaXN0ZXJQd2RTaGFyZVN3aXRjaCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LndlaXl1bl9wYWdlX3NoYXJlKSAmJiB1bnNhZmVXaW5kb3cuc3luY0RhdGEuc2hhcmVJbmZvLm5vdGVfbGlzdC5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgb2JqLmluaXRTaGFyZVBhZ2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5pbml0U2hhcmVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoJCgiLm1vZC1hY3Rpb24td3JhcC1saW5rIikubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9Im1vZC1hY3Rpb24td3JhcCBtb2QtYWN0aW9uLXdyYXAtbWVudSBtb2QtYWN0aW9uLXdyYXAtbGluayBjbGVhcmZpeCI+PGRpdiBjbGFzcz0iYWN0aW9uLWl0ZW0iPjxkaXYgY2xhc3M9ImFjdGlvbi1pdGVtLWNvbiI+PGkgY2xhc3M9Imljb24gaWNvbi1saW5rIj48L2k+PHNwYW4gY2xhc3M9ImFjdC10eHQiPuaYvuekuumTvuaOpTwvc3Bhbj48L2Rpdj48L2Rpdj48L2Rpdj4nOwogICAgICAgICAgICAgICAgJCgiLm1vZC1hY3Rpb24td3JhcC1jb2RlIikuYWZ0ZXIoaHRtbCk7CgogICAgICAgICAgICAgICAgJCgiLm1vZC1hY3Rpb24td3JhcC1saW5rIikuY2xpY2soZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIG9iai5zaG93U2hhcmVEb3dubG9hZCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0VGltZW91dChvYmouaW5pdFNoYXJlUGFnZSwgNTAwKTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFZlcmlmeVBhZ2VFbGVtZW50ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBzaGFyZUlkID0gb2JqLmdldFNoYXJlSWQoKTsKICAgICAgICAgICAgdmFyICRwd2QgPSAkKCIuY2FyZC1pbm5lciAuaW5wdXQtdHh0W3R5cGU9J3Bhc3N3b3JkJ10iKTsKICAgICAgICAgICAgdmFyICRidXR0b24gPSAkKCIuY2FyZC1pbm5lciAuYnRuLW1haW4iKTsKICAgICAgICAgICAgaWYgKHNoYXJlSWQgJiYgJHB3ZC5sZW5ndGggJiYgJGJ1dHRvbi5sZW5ndGgpIHsKCiAgICAgICAgICAgICAgICAvLyDmmL7npLrliIbkuqvlr4bnoIEKICAgICAgICAgICAgICAgICRwd2QuYXR0cigidHlwZSIsICJ0ZXh0Iik7CgogICAgICAgICAgICAgICAgLy8g6K6+572u5YiG5Lqr5a+G56CBCiAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2Uuc2V0UHdkID0gZnVuY3Rpb24gKHB3ZCkgewogICAgICAgICAgICAgICAgICAgICRwd2QudmFsKHB3ZCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIOmHjemAoOaMiemSrgogICAgICAgICAgICAgICAgdmFyICRpdGVtQnV0dG9uID0gJGJ1dHRvbi5wYXJlbnQoKTsKICAgICAgICAgICAgICAgICRpdGVtQnV0dG9uLnNhZmVIdG1sKCRidXR0b24ucHJvcCgib3V0ZXJIVE1MIikpOwogICAgICAgICAgICAgICAgJGJ1dHRvbiA9ICRpdGVtQnV0dG9uLmZpbmQoIi5idG4tbWFpbiIpOwoKICAgICAgICAgICAgICAgIC8vIOaMiemSruS6i+S7tgogICAgICAgICAgICAgICAgJGJ1dHRvbi5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLmdldFN0b3JlKCkgJiYgb2JqLmdldFN0b3JlKCkuZGlzcGF0Y2goInNoYXJlSW5mby9sb2FkU2hhcmVJbmZvV2l0aG91dExvZ2luIiwgJHB3ZC52YWwoKSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyDmj5DkuqTlr4bnoIEKICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5zdWJtaXRfcHdkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICRidXR0b24uY2xpY2soKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9iai5pbml0VmVyaWZ5UGFnZUVsZW1lbnQoY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5hdXRvUGFkZGluZ1NoYXJlUHdkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2hhcmVJZCA9IG9iai5nZXRTaGFyZUlkKCk7CiAgICAgICAgICAgIHZhciBzaGFyZUxpbmsgPSBvYmouZ2V0U2hhcmVMaW5rKCk7CiAgICAgICAgICAgIGFwaS5xdWVyeVNoYXJlUHdkKGNvbnN0YW50LnNvdXJjZS53ZWl5dW4sIHNoYXJlSWQsIHNoYXJlTGluaywgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY29kZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlUHdkID0gcmVzcG9uc2UuZGF0YS5zaGFyZV9wd2Q7CiAgICAgICAgICAgICAgICAgICAgb2JqLnZlcmlmeV9wYWdlLnNoYXJlX3B3ZCA9IHNoYXJlUHdkOwogICAgICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5zZXRQd2Qoc2hhcmVQd2QpOwogICAgICAgICAgICAgICAgICAgIG9iai5zaG93VGlwU3VjY2Vzcygi5aGr5YWF5a+G56CB5oiQ5YqfIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LndlaXl1bl9hdXRvX2p1bXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5zdWJtaXRfcHdkICYmIG9iai52ZXJpZnlfcGFnZS5zdWJtaXRfcHdkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dUaXBFcnJvcigi5pqC5peg5Lq65YiG5Lqr5a+G56CBIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5yZWdpc3RlclB3ZFNoYXJlU3dpdGNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyDmt7vliqDlvIDlhbMKICAgICAgICAgICAgJCgiLmNhcmQtaW5uZXIgLmZvcm0taXRlbS1sYWJlbCAuZm9ybS1pdGVtLXRpdCIpLnNhZmVIdG1sKCc8c3BhbiBjbGFzcz0iZm9ybS1pdGVtLXRpdCI+6K+36L6T5YWl5YiG5Lqr5a+G56CBPHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA0NXB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkIGlkPSJuZC1zaGFyZS1jaGVjayIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ij4gPGEgY2xhc3M9Im5kLW9wZW4tcGFnZS1vcHRpb24iIGhyZWY9ImphdmFzY3JpcHQ6OyIgdGl0bGU9IueCueWHu+afpeeci+abtOWkmuiEmuacrOmFjee9riI+5YWx5Lqr5a+G56CBPC9hPjwvc3Bhbj48L3NwYW4+Jyk7CiAgICAgICAgICAgIG9iai5pc1B3ZFNoYXJlT3BlbigpIHx8ICQoIiNuZC1zaGFyZS1jaGVjayIpLnJlbW92ZUF0dHIoImNoZWNrZWQiKTsKCiAgICAgICAgICAgIC8vIOW8gOWFsy3kuovku7YKICAgICAgICAgICAgJCgiI25kLXNoYXJlLWNoZWNrIikub24oImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNldE9wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQud2VpeXVuX3NoYXJlX3N0YXR1cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb24uc2V0T3B0aW9uVW5BY3RpdmUob3B0aW9uLmNvbnN0YW50LndlaXl1bl9zaGFyZV9zdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIOaJk+W8gOmFjee9rumhtQogICAgICAgICAgICAkKCIubmQtb3Blbi1wYWdlLW9wdGlvbiIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJ1bnRpbWUub3Blbk9wdGlvbnNQYWdlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5yZWdpc3RlclN0b3JlU2hhcmVQd2QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5hZGRSZXNwb25zZUludGVyY2VwdG9yKGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICAgICAgICAgdmFyIHJlcXVlc3RVcmwgPSByZXF1ZXN0LnJlc3BvbnNlVVJMOwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RVcmwuaW5kZXhPZigid2VpeXVuU2hhcmVOb0xvZ2luL1dlaXl1blNoYXJlVmlldyIpID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmRhdGEucnNwX2hlYWRlci5yZXRjb2RlID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gcmVzcG9uc2UuY29uZmlnLmRhdGEubWF0Y2goL1xcInNoYXJlX3B3ZFxcIjpcXCIoW1x3XSspXFwiLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybigicHdkIHNoYXJlIG5vdCBtYXRjaCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVQd2QgPSBtYXRjaFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXJlUHdkID09IG9iai52ZXJpZnlfcGFnZS5zaGFyZV9wd2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybigicHdkIHNoYXJlIG5vdCBjaGFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmouaXNQd2RTaGFyZU9wZW4oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCJwd2Qgc2hhcmUgY2xvc2VkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZUlkID0gb2JqLmdldFNoYXJlSWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlTGluayA9IG9iai5nZXRTaGFyZUxpbmsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVMb2cuYWRkU2hhcmVMb2coc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlTGluaywgY29uc3RhbnQuc291cmNlLndlaXl1bik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oInB3ZCBzaGFyZSBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcG9uc2UucmVxdWVzdCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgb2JqLmdldEF4aW9zKCkgJiYgb2JqLmdldEF4aW9zKCkuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShzdWNjZXNzLCBlcnJvcik7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dCb3ggPSBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSAnPGRpdiBjbGFzcz0ibW9kYWwgbW9kYWwtc2hvdyIgaWQ9ImZpbGUtbW9kYWwiPjxiIGNsYXNzPSJtb2RhbC1tYXNrIj48L2I+PGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy02ODAiPjxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZy1oZCBjbGVhcmZpeCI+PGg0IGNsYXNzPSJtb2RhbC1kaWFsb2ctdGl0bGUiPuaWh+S7tuS4i+i9vTwvaDQ+PGJ1dHRvbiBjbGFzcz0iYnRuLWljb24gaWNvbiBpY29uLXBvcC1jbG9zZSI+PC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nLWJkIG1vZGFsLWJvZHkiPjwvZGl2PjwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgIGlmICgkKCIjZmlsZS1tb2RhbCIpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAkKCJib2R5IikuYXBwZW5kKHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICQoIiNmaWxlLW1vZGFsIC5pY29uLXBvcC1jbG9zZSIpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjZmlsZS1tb2RhbCIpLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoIiNmaWxlLW1vZGFsIikuc2hvdygpOwogICAgICAgICAgICAkKCIjZmlsZS1tb2RhbCAubW9kYWwtYm9keSIpLnNhZmVIdG1sKGJvZHkpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93U2hhcmVEb3dubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGZpbGVEYXRhID0gb2JqLmdldFNlbGVjdGVkU2hhcmVGaWxlRGF0YSgpOwogICAgICAgICAgICBpZiAoZmlsZURhdGEubm9kZV9saXN0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnNob3dUaXBFcnJvcigi6K+36YCJ5oup6Iez5bCR5LiA5Liq5paH5Lu2L+aWh+S7tuWkuSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBvYmoucmVxdWVzdFNoYXJlRG93bmxvYWQoZmlsZURhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBvYmouc2hvd1NoYXJlRG93bmxvYWRCb3goZmlsZURhdGEsIHJlc3BvbnNlKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBvYmouc2hvd1RpcEVycm9yKHJlc3BvbnNlLm1zZyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93SG9tZURvd25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZURhdGEgPSBvYmouZ2V0U2VsZWN0ZWRTaGFyZUZpbGVEYXRhKCk7CiAgICAgICAgICAgIGlmIChmaWxlRGF0YS5ub2RlX2xpc3QubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouc2hvd1RpcEVycm9yKCLor7fpgInmi6noh7PlsJHkuIDkuKrmlofku7Yv5paH5Lu25aS5Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9iai5yZXF1ZXN0SG9tZURvd25sb2FkKGZpbGVEYXRhKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgb2JqLnNob3dTaGFyZURvd25sb2FkQm94KGZpbGVEYXRhLCByZXNwb25zZSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgb2JqLnNob3dUaXBFcnJvcihyZXNwb25zZS5tc2cpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoucGFyc2VEb3duRmlsZSA9IGZ1bmN0aW9uIChmaWxlRGF0YSkgewogICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSAiIiwgcGFja05hbWUgPSAiIjsKICAgICAgICAgICAgaWYgKGZpbGVEYXRhLmRpcl9saXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGlmIChmaWxlRGF0YS5maWxlX2xpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBhY2tOYW1lID0gZmlsZURhdGEuZGlyX2xpc3RbMF0uZmlsZW5hbWUgKyAiIOetiSIgKyAoZmlsZURhdGEuZGlyX2xpc3QubGVuZ3RoICsgZmlsZURhdGEuZmlsZV9saXN0Lmxlbmd0aCkgKyAi5Liq5paH5Lu2IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBhY2tOYW1lID0gZmlsZURhdGEuZGlyX2xpc3RbMF0uZmlsZW5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHBhY2tOYW1lICsgIi56aXAiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGZpbGVEYXRhLmZpbGVfbGlzdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgcGFja05hbWUgPSBmaWxlRGF0YS5ub2RlX2xpc3RbMF0uZ2V0TmFtZU5vRXh0KCkgKyAiIOetiSIgKyBmaWxlRGF0YS5maWxlX2xpc3QubGVuZ3RoICsgIuS4quaWh+S7tiI7CiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYWNrTmFtZSArICIuemlwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZURhdGEuZmlsZV9saXN0WzBdLmZpbGVuYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBmaWxlX25hbWU6IGZpbGVOYW1lLAogICAgICAgICAgICAgICAgcGFja19uYW1lOiBwYWNrTmFtZQogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIG9iai5yZXF1ZXN0SG9tZURvd25sb2FkID0gZnVuY3Rpb24gKGZpbGVEYXRhKSB7CiAgICAgICAgICAgIHZhciBiYXNlUmVxdWVzdCA9IG9iai5nZXRCYXNlUmVxdWVzdCgpOwogICAgICAgICAgICB2YXIgZG93bkZpbGUgPSBvYmoucGFyc2VEb3duRmlsZShmaWxlRGF0YSk7CiAgICAgICAgICAgIGlmIChiYXNlUmVxdWVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvd25GaWxlLnBhY2tfbmFtZSA/IGJhc2VSZXF1ZXN0LmdldFBhY2tVcmwoZmlsZURhdGEubm9kZV9saXN0LCB7fSkgOiBiYXNlUmVxdWVzdC5nZXRTaW5nbGVVcmwoZmlsZURhdGEubm9kZV9saXN0LCB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdCh7IHJldGNvZGU6IC0xLCBtc2c6ICLnlJ/miJDpk77mjqXlpLHotKUiIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmoucmVxdWVzdFNoYXJlRG93bmxvYWQgPSBmdW5jdGlvbiAoZmlsZURhdGEpIHsKICAgICAgICAgICAgdmFyIHNoYXJlRmlsZSA9IG9iai5nZXRTaGFyZUZpbGUoKSwgZG93bmxvYWRSZXF1ZXN0ID0gb2JqLmdldERvd25sb2FkUmVxdWVzdCgpOwogICAgICAgICAgICB2YXIgZG93bkZpbGUgPSBvYmoucGFyc2VEb3duRmlsZShmaWxlRGF0YSk7CiAgICAgICAgICAgIGlmIChzaGFyZUZpbGUgJiYgZG93bmxvYWRSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGV0YWlsID0gewogICAgICAgICAgICAgICAgICAgIHNoYXJlS2V5OiBzaGFyZUZpbGUuc2hhcmVLZXksCiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlRmlsZS5zaGFyZVB3ZCwKICAgICAgICAgICAgICAgICAgICBmaWxlT3duZXI6IHNoYXJlRmlsZS5zaGFyZU93bmVyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVHlwZTogMCwKICAgICAgICAgICAgICAgICAgICBwYWNrTmFtZTogZG93bkZpbGUucGFja19uYW1lLAogICAgICAgICAgICAgICAgICAgIHBkaXJLZXk6ICIiLAogICAgICAgICAgICAgICAgICAgIGRpckxpc3Q6IGZpbGVEYXRhLmRpcl9saXN0LAogICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0OiBmaWxlRGF0YS5maWxlX2xpc3QKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG93bkZpbGUucGFja19uYW1lID8gZG93bmxvYWRSZXF1ZXN0LnNoYXJlUGFydERvd25sb2FkKGRldGFpbCkgOiBkb3dubG9hZFJlcXVlc3Quc2hhcmVCYXRjaERvd25sb2FkKGRldGFpbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdCh7IHJldGNvZGU6IC0xLCBtc2c6ICLnlJ/miJDpk77mjqXlpLHotKUiIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd1NoYXJlRG93bmxvYWRCb3ggPSBmdW5jdGlvbiAoZmlsZURhdGEsIHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHZhciBkb3duRmlsZSA9IG9iai5wYXJzZURvd25GaWxlKGZpbGVEYXRhKTsKICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRvd25sb2FkX3VybCkgewogICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkb3duRmlsZSwgcmVzcG9uc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkb3duRmlsZSwgcmVzcG9uc2UuZmlsZV9saXN0WzBdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT0icGFkZGluZzogMjBweDsgb3ZlcmZsb3cteTogYXV0bzsiPic7CiAgICAgICAgICAgIHZhciByb3dTdHlsZSA9ICJtYXJnaW46MTBweCAwcHg7b3ZlcmZsb3c6aGlkZGVuOyB3aGl0ZS1zcGFjZTpub3dyYXA7IHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7IjsKICAgICAgICAgICAgaHRtbCArPSAnPHA+JyArIGRvd25GaWxlLmZpbGVfbmFtZSArICc8L3A+JzsKICAgICAgICAgICAgaHRtbCArPSAnPHAgc3R5bGU9IicgKyByb3dTdHlsZSArICciPjxhIHRpdGxlPSInICsgZG93bkZpbGUuZG93bmxvYWRfdXJsICsgJyIgaHJlZj0iJyArIGRvd25GaWxlLmRvd25sb2FkX3VybCArICciIHN0eWxlPSJjb2xvcjogYmx1ZTsiPicgKyBkb3duRmlsZS5kb3dubG9hZF91cmwgKyAnPC9hPjwvcD4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2Pic7CiAgICAgICAgICAgIG9iai5zaG93Qm94KGh0bWwpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93VGlwU3VjY2VzcyA9IGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgICAgb2JqLmdldE1vZGFsKCkgJiYgb2JqLmdldE1vZGFsKCkuc3VjY2Vzcyhtc2cpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93VGlwRXJyb3IgPSBmdW5jdGlvbiAobXNnKSB7CiAgICAgICAgICAgIG9iai5nZXRNb2RhbCgpICYmIG9iai5nZXRNb2RhbCgpLmVycm9yKG1zZyk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFNoYXJlSWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSByb3V0ZXIuZ2V0VXJsKCk7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IHVybC5tYXRjaCgvc2hhcmUud2VpeXVuLmNvbVwvKFswLTlhLXpdKykvaSk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogbnVsbDsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U2hhcmVMaW5rID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gcm91dGVyLmdldFVybCgpOwogICAgICAgIH07CgogICAgICAgIG9iai5pc0hvbWVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAocm91dGVyLmdldFVybCgpLmluZGV4T2YoIndlaXl1bi5jb20vZGlzayIpID49IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmlzUHdkU2hhcmVPcGVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC53ZWl5dW5fc2hhcmVfc3RhdHVzKTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U2VsZWN0ZWRTaGFyZUZpbGVEYXRhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZURhdGEgPSB7CiAgICAgICAgICAgICAgICBub2RlX2xpc3Q6IG9iai5nZXRTZWxlY3RlZEZpbGVOb2RlcygpLAogICAgICAgICAgICAgICAgZGlyX2xpc3Q6IFtdLAogICAgICAgICAgICAgICAgZmlsZV9saXN0OiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICBmaWxlRGF0YS5ub2RlX2xpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0U2l6ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiBpdGVtLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHBkaXJfa2V5OiBpdGVtLmdldFBkaXJLZXkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGl0ZW0uZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemU6IGl0ZW0uZ2V0U2l6ZSgpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVEYXRhLmRpcl9saXN0LnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlRGF0YS5maWxlX2xpc3QucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZmlsZURhdGE7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFNlbGVjdGVkRmlsZU5vZGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZU5vZGVzID0gW107CiAgICAgICAgICAgIGlmIChvYmouaXNIb21lUGFnZSgpKSB7CiAgICAgICAgICAgICAgICBmaWxlTm9kZXMgPSBvYmouZ2V0SG9tZUZpbGVOb2RlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHNoYXJlRmlsZSA9IG9iai5nZXRTaGFyZUZpbGUoKTsKICAgICAgICAgICAgICAgIGlmIChzaGFyZUZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcmVGaWxlLmlzU2luZ2xlRmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlTm9kZXMgPSBzaGFyZUZpbGUuY2hpbGROb2RlczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOb2RlcyA9IHNoYXJlRmlsZS5zZWxlY3RlZE5vZGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmlsZU5vZGVzOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRIb21lRmlsZU5vZGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZU5vZGVzID0gW107CiAgICAgICAgICAgIHZhciBzdG9yZSA9IG9iai5nZXRTdG9yZSgpOwogICAgICAgICAgICB2YXIgdXJsID0gbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgdmFyIGZpbHRlciA9IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pc1NlbGVjdGVkKCkgPyAxIDogMDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHN0b3JlIGluc3RhbmNlb2YgT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAodXJsLmluZGV4T2YoIndlaXl1bi5jb20vZGlzay9kb2MiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZU5vZGVzID0gc3RvcmUuc3RhdGUuZG9jLmN1ckNhdGVOb2RlLmdldEtpZE5vZGVzKCkuZmlsdGVyKGZpbHRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigid2VpeXVuLmNvbS9kaXNrL3Bob3RvIikgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGZpbGVOb2RlcyA9IHN0b3JlLnN0YXRlLnBob3RvLmN1ckNhdGVOb2RlLmdldEtpZE5vZGVzKCkuZmlsdGVyKGZpbHRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigid2VpeXVuLmNvbS9kaXNrL3ZpZGVvIikgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGZpbGVOb2RlcyA9IHN0b3JlLnN0YXRlLnZpZGVvLmNhdGVOb2RlLmdldEtpZE5vZGVzKCkuZmlsdGVyKGZpbHRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigid2VpeXVuLmNvbS9kaXNrL2F1aWRvIikgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGZpbGVOb2RlcyA9IHN0b3JlLnN0YXRlLmF1ZGlvLmNhdGVOb2RlLmdldEtpZE5vZGVzKCkuZmlsdGVyKGZpbHRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigid2VpeXVuLmNvbS9kaXNrL3RpbWUiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZU5vZGVzID0gc3RvcmUuc3RhdGUudGltZS5yb290Tm9kZS5nZXRLaWROb2RlcygpLmZpbHRlcihmaWx0ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodXJsLmluZGV4T2YoIndlaXl1bi5jb20vZGlzay9zaGFyZWRpciIpID49IDApIHsKICAgICAgICAgICAgICAgICAgICBmaWxlTm9kZXMgPSBzdG9yZS5zdGF0ZS5zaGFyZWRpci5jdXJOb2RlLmdldEtpZE5vZGVzKCkuZmlsdGVyKGZpbHRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigid2VpeXVuLmNvbS9kaXNrL3JlY2VudCIpID49IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2lkRmVlZHMgPSBzdG9yZS5zdGF0ZS5yZWNlbnQucm9vdE5vZGUuZ2V0S2lkRmVlZHMoKTsKICAgICAgICAgICAgICAgICAgICBraWRGZWVkcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWVkLmlzU2VsZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5vZGVzID0gZmlsZU5vZGVzLmNvbmNhdChmZWVkLmdldEtpZE5vZGVzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigid2VpeXVuLmNvbS9kaXNrL3JlY3ljbGUiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZU5vZGVzID0gc3RvcmUuc3RhdGUucmVjeWNsZS5yb290Tm9kZS5nZXRLaWROb2RlcygpLmZpbHRlcihmaWx0ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RvcmUuc3RhdGUuZGlzaykgewogICAgICAgICAgICAgICAgICAgIGZpbGVOb2RlcyA9IHN0b3JlLnN0YXRlLmRpc2suY3VyTm9kZS5nZXRLaWROb2RlcygpLmZpbHRlcihmaWx0ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmaWxlTm9kZXM7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFNoYXJlRmlsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHN0b3JlID0gb2JqLmdldFN0b3JlKCk7CiAgICAgICAgICAgIGlmIChzdG9yZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLnNoYXJlZmlsZS5zaGFyZUZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0QmFzZVJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmoubWF0Y2hXZWJwYWNrTW9kdWxlKCJiYXNlX3JlcXVlc3QiLCBmdW5jdGlvbiAobW9kdWxlLCBuYW1lKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlICYmIG1vZHVsZS5nZXRTaW5nbGVVcmwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0RG93bmxvYWRSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLm1hdGNoV2VicGFja01vZHVsZSgiZG93bmxvYWRfcmVxdWVzdCIsIGZ1bmN0aW9uIChtb2R1bGUsIG5hbWUpIHsKICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLkRvd25sb2FkUmVxdWVzdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbW9kdWxlLkRvd25sb2FkUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0QXhpb3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmoubWF0Y2hXZWJwYWNrTW9kdWxlKCJheGlvcyIsIGZ1bmN0aW9uIChtb2R1bGUsIG5hbWUpIHsKICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLkF4aW9zKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldE1vZGFsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLm1hdGNoV2VicGFja01vZHVsZSgibW9kYWwiLCBmdW5jdGlvbiAobW9kdWxlLCBuYW1lKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlICYmIG1vZHVsZS5jb25maXJtICYmIG1vZHVsZS5zdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFN0b3JlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb2JqLm1hdGNoV2VicGFja01vZHVsZSgic3RvcmUiLCBmdW5jdGlvbiAobW9kdWxlLCBuYW1lKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlICYmIG1vZHVsZS5kZWZhdWx0ICYmIG1vZHVsZS5kZWZhdWx0Ll9tb2R1bGVzTmFtZXNwYWNlTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmoubWF0Y2hXZWJwYWNrTW9kdWxlID0gZnVuY3Rpb24gKG5hbWUsIG1hdGNoRnVuYykgewogICAgICAgICAgICBpZiAoIW9iai5tb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqLndlYnBhY2tfcmVxdWlyZS5jKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hGdW5jKG9iai53ZWJwYWNrX3JlcXVpcmUoa2V5KSwga2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLm1vZHVsZXNbbmFtZV0gPSBtYXRjaDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9iai5tb2R1bGVzW25hbWVdOwogICAgICAgIH07CgogICAgICAgIG9iai5pbml0V2VicGFja1JlcXVpcmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBpbmplY3ROYW1lID0gIl9uZF9pbmplY3RfIjsKICAgICAgICAgICAgdmFyIG1vcmVNb2R1bGVzID0ge307CiAgICAgICAgICAgIG1vcmVNb2R1bGVzW2luamVjdE5hbWVdID0gZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICAgICAgICAgb2JqLndlYnBhY2tfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX187CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHVuc2FmZVdpbmRvdy53ZWJwYWNrSnNvbnAoW2luamVjdE5hbWVdLCBtb3JlTW9kdWxlcywgW2luamVjdE5hbWVdKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgiYXBwX2xhbnpvdXMiLCBbInJvdXRlciIsICJvcHRpb24iLCAibG9nZ2VyIiwgInVuc2FmZVdpbmRvdyIsICJjb25zdGFudCIsICJydW50aW1lIiwgImFwaSIsICJzaGFyZUxvZyIsICIkIl0sIGZ1bmN0aW9uIChyb3V0ZXIsIG9wdGlvbiwgbG9nZ2VyLCB1bnNhZmVXaW5kb3csIGNvbnN0YW50LCBydW50aW1lLCBhcGksIHNoYXJlTG9nLCAkKSB7CiAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgdmVyaWZ5X3BhZ2U6IHsKICAgICAgICAgICAgICAgIHNldFB3ZDogbnVsbCwKICAgICAgICAgICAgICAgIHNoYXJlX3B3ZDogbnVsbCwKICAgICAgICAgICAgICAgIHN1Ym1pdF9wd2Q6IG51bGwKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5ydW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSByb3V0ZXIuZ2V0VXJsKCk7CiAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigibGFuem91cy5jb20iKSA+IDAgfHwgdXJsLmluZGV4T2YoImxhbnpvdXguY29tIikgPiAwKSB7CiAgICAgICAgICAgICAgICBvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LmxhbnpvdXNfcGFnZV92ZXJpZnkpICYmIG9iai5pbml0VmVyaWZ5UGFnZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFZlcmlmeVBhZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5yZWdpc3RlclN0b3JlU2hhcmVQd2QoKTsKCiAgICAgICAgICAgIG9iai5pbml0VmVyaWZ5UGFnZUVsZW1lbnQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgb2JqLmF1dG9QYWRkaW5nU2hhcmVQd2QoKTsKCiAgICAgICAgICAgICAgICBvYmoucmVnaXN0ZXJQd2RTaGFyZVN3aXRjaCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFZlcmlmeVBhZ2VFbGVtZW50ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBzaGFyZUlkID0gb2JqLmdldFNoYXJlSWQoKTsKICAgICAgICAgICAgdmFyICRwd2QgPSAkKCIjcHdkIik7CiAgICAgICAgICAgIGlmIChzaGFyZUlkICYmICRwd2QubGVuZ3RoKSB7CgogICAgICAgICAgICAgICAgLy8g6K6+572u5YiG5Lqr5a+G56CBCiAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2Uuc2V0UHdkID0gZnVuY3Rpb24gKHB3ZCkgewogICAgICAgICAgICAgICAgICAgICRwd2QudmFsKHB3ZCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIOaPkOS6pOWvhueggQogICAgICAgICAgICAgICAgb2JqLnZlcmlmeV9wYWdlLnN1Ym1pdF9wd2QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI3N1YiIpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvYmouaW5pdFZlcmlmeVBhZ2VFbGVtZW50KGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouYXV0b1BhZGRpbmdTaGFyZVB3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHNoYXJlSWQgPSBvYmouZ2V0U2hhcmVJZCgpOwogICAgICAgICAgICB2YXIgc2hhcmVMaW5rID0gb2JqLmdldFNoYXJlTGluaygpOwogICAgICAgICAgICBhcGkucXVlcnlTaGFyZVB3ZChjb25zdGFudC5zb3VyY2UubGFuem91cywgc2hhcmVJZCwgc2hhcmVMaW5rLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09IDEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVQd2QgPSByZXNwb25zZS5kYXRhLnNoYXJlX3B3ZDsKICAgICAgICAgICAgICAgICAgICBvYmoudmVyaWZ5X3BhZ2Uuc2hhcmVfcHdkID0gc2hhcmVQd2Q7CiAgICAgICAgICAgICAgICAgICAgb2JqLnZlcmlmeV9wYWdlLnNldFB3ZChzaGFyZVB3ZCk7CiAgICAgICAgICAgICAgICAgICAgb2JqLnNob3dUaXAoMSwgIuWhq+WFheWvhueggeaIkOWKnyIsIDIwMDApOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC5sYW56b3VzX2F1dG9fanVtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnZlcmlmeV9wYWdlLnN1Ym1pdF9wd2QgJiYgb2JqLnZlcmlmeV9wYWdlLnN1Ym1pdF9wd2QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvYmouc2hvd1RpcCgwLCAi5pqC5peg5Lq65YiG5Lqr5a+G56CBIiwgMjAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5yZWdpc3RlclB3ZFNoYXJlU3dpdGNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbi10b3A6IDEwcHg7Ij7liIbkuqvorr7nva4gPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkIGlkPSJuZC1zaGFyZS1jaGVjayIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiA+IDxhIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7IiBjbGFzcz0ibmQtb3Blbi1wYWdlLW9wdGlvbiIgaHJlZj0iamF2YXNjcmlwdDo7IiB0aXRsZT0i54K55Ye75p+l55yL5pu05aSa6ISa5pys6YWN572uIj7lhbHkuqvlr4bnoIE8L2E+PC9kaXY+JzsKICAgICAgICAgICAgaWYgKCQoIi5vZmYiKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQoIi5vZmYiKS5hZnRlcihodG1sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICQoIi5wYXNzd2RkaXYtdXNlciIpLmFmdGVyKGh0bWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iai5pc1B3ZFNoYXJlT3BlbigpIHx8ICQoIiNuZC1zaGFyZS1jaGVjayIpLnJlbW92ZUF0dHIoImNoZWNrZWQiKTsKCiAgICAgICAgICAgIC8vIOW8gOWFsy3kuovku7YKICAgICAgICAgICAgJCgiI25kLXNoYXJlLWNoZWNrIikub24oImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNldE9wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQubGFuem91c19zaGFyZV9zdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNldE9wdGlvblVuQWN0aXZlKG9wdGlvbi5jb25zdGFudC5sYW56b3VzX3NoYXJlX3N0YXR1cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g5omT5byA6YWN572u6aG1CiAgICAgICAgICAgICQoIi5uZC1vcGVuLXBhZ2Utb3B0aW9uIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcnVudGltZS5vcGVuT3B0aW9uc1BhZ2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJlZ2lzdGVyU3RvcmVTaGFyZVB3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdW5zYWZlV2luZG93LiQoZG9jdW1lbnQpLmFqYXhDb21wbGV0ZShmdW5jdGlvbiAoZXZlbnQsIHhociwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gb3B0aW9ucy5kYXRhLm1hdGNoKC9wd2Q9KFx3KykvKTsKICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG9wdGlvbnMuZGF0YS5tYXRjaCgvcD0oXHcrKS8pOwogICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCJwd2Qgc2hhcmUgbm90IG1hdGNoIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBzaGFyZVB3ZCA9IG1hdGNoWzFdOwoKICAgICAgICAgICAgICAgIGlmIChzaGFyZVB3ZCA9PSBvYmoudmVyaWZ5X3BhZ2Uuc2hhcmVfcHdkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCJwd2Qgc2hhcmUgbm90IGNoYW5nZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghb2JqLmlzUHdkU2hhcmVPcGVuKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oInB3ZCBzaGFyZSBjbG9zZWQiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgc2hhcmVJZCA9IG9iai5nZXRTaGFyZUlkKCk7CiAgICAgICAgICAgICAgICB2YXIgc2hhcmVMaW5rID0gb2JqLmdldFNoYXJlTGluaygpOwogICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb2JqLnBhcnNlSnNvbih4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnp0ID09IDEgJiYgc2hhcmVQd2QpIHsKICAgICAgICAgICAgICAgICAgICBzaGFyZUxvZy5hZGRTaGFyZUxvZyhzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVMaW5rLCBjb25zdGFudC5zb3VyY2UubGFuem91cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigicHdkIHNoYXJlIGVycm9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93VGlwID0gZnVuY3Rpb24gKGNvZGUsIG1zZywgdGltZW91dCkgewogICAgICAgICAgICBpZiAodW5zYWZlV2luZG93LnNtcykgewogICAgICAgICAgICAgICAgdW5zYWZlV2luZG93LnNtcyhtc2cpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yOwogICAgICAgICAgICAgICAgaWYgKCQoIi5vZmYiKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9ICIjcHdkZXJyIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gIiNpbmZvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxlY3Rvcikuc2FmZUh0bWwoJzxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4nICsgbXNnICsgJzwvc3Bhbj4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoc2VsZWN0b3IpLnNhZmVIdG1sKCc8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPicgKyBtc2cgKyAnPC9zcGFuPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxlY3RvcikudGV4dCgiIik7CiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTaGFyZUlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbWF0Y2g7CgogICAgICAgICAgICBtYXRjaCA9IC9sYW56b3VzLmNvbVwvKFtcd10rKVwvKFthLXowLTktXyVdezQsfSkvZ2kuZXhlYyhsb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0gKyAiLyIgKyBtYXRjaFsyXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWF0Y2ggPSAvbGFuem91cy5jb21cLyhbYS16MC05LV9dezQsfSkvZ2kuZXhlYyhsb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5wYXRobmFtZS5zdWJzdHIoMSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFNoYXJlTGluayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRvcC5sb2NhdGlvbi5ocmVmOwogICAgICAgIH07CgogICAgICAgIG9iai5pc1B3ZFNoYXJlT3BlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQubGFuem91c19zaGFyZV9zdGF0dXMpOwogICAgICAgIH07CgogICAgICAgIG9iai5wYXJzZUpzb24gPSBmdW5jdGlvbiAoanNvblN0cikgewogICAgICAgICAgICB2YXIganNvbk9iamVjdCA9IHt9OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGpzb25TdHIpIHsKICAgICAgICAgICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uU3RyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIHJldHVybiBqc29uT2JqZWN0OwogICAgICAgIH07CgogICAgICAgIHJldHVybiBvYmo7CiAgICB9KTsKCiAgICBjb250YWluZXIuZGVmaW5lKCJhcHBfMTg5IiwgWyJyb3V0ZXIiLCAib3B0aW9uIiwgImxvZ2dlciIsICJjb25zdGFudCIsICJhcGkiLCAic2hhcmVMb2ciLCAicnVudGltZSIsICJ1bnNhZmVXaW5kb3ciLCAiJCJdLCBmdW5jdGlvbiAocm91dGVyLCBvcHRpb24sIGxvZ2dlciwgY29uc3RhbnQsIGFwaSwgc2hhcmVMb2csIHJ1bnRpbWUsIHVuc2FmZVdpbmRvdywgJCkgewogICAgICAgIHZhciBvYmogPSB7CiAgICAgICAgICAgIHZlcmlmeV9wYWdlOiB7CiAgICAgICAgICAgICAgICBzaGFyZV9wd2Q6IG51bGwKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIG9iai5ydW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSByb3V0ZXIuZ2V0VXJsKCk7CiAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiY2xvdWQuMTg5LmNuL3QiKSA+IDApIHsKICAgICAgICAgICAgICAgIG9iai5pbml0U2hhcmVQYWdlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigiY2xvdWQuMTg5LmNuL21haW4iKSA+IDAgfHwgdXJsLmluZGV4T2YoImNsb3VkLjE4OS5jbi9waG90byIpID4gMCkgewogICAgICAgICAgICAgICAgb3B0aW9uLmlzT3B0aW9uQWN0aXZlKG9wdGlvbi5jb25zdGFudC50eTE4OV9wYWdlX2hvbWUpICYmIG9iai5pbml0SG9tZVBhZ2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmluaXRIb21lUGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCQoIiNKX0NyZWF0ZSIpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJCgiI0pfQ3JlYXRlIikuYWZ0ZXIoJzxhIGNsYXNzPSJidG4gYnRuLXNob3ctbGluayIgc3R5bGU9ImJhY2tncm91bmQ6ICMyYjg5ZWE7IGNvbG9yOiAjZmZmOyBjdXJzb3I6IHBvaW50ZXIiPuaYvuekuumTvuaOpTwvYT4nKTsKICAgICAgICAgICAgICAgICQoIi5idG4tc2hvdy1saW5rIikub24oImNsaWNrIiwgb2JqLnNob3dEb3dubG9hZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoJCgiLkpDX1JlZnJlc2giKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQoIi5KQ19SZWZyZXNoIikuYWZ0ZXIoJzxhIGNsYXNzPSJidG4gYnRuLXNob3ctbGluayIgc3R5bGU9ImJhY2tncm91bmQ6ICMyYjg5ZWE7IGNvbG9yOiAjZmZmOyBjdXJzb3I6IHBvaW50ZXIiPuaYvuekuumTvuaOpTwvYT4nKTsKICAgICAgICAgICAgICAgICQoIi5idG4tc2hvdy1saW5rIikub24oImNsaWNrIiwgb2JqLnNob3dEb3dubG9hZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG9iai5pbml0SG9tZVBhZ2UsIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFNoYXJlUGFnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCQoIi5jb2RlLXBhbmVsIikubGVuZ3RoICYmIG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQudHkxODlfcGFnZV92ZXJpZnkpKSB7CiAgICAgICAgICAgICAgICBvYmouaW5pdFZlcmlmeVBhZ2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQudHkxODlfcGFnZV9zaGFyZSkpIHsKICAgICAgICAgICAgICAgIG9iai5pbml0RG93bmxvYWRQYWdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouaW5pdFZlcmlmeVBhZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5yZWdpc3RlclB3ZFNoYXJlU3dpdGNoKCk7CgogICAgICAgICAgICBvYmoucmVnaXN0ZXJTdG9yZVNoYXJlUHdkKCk7CgogICAgICAgICAgICBvYmouYXV0b1BhZGRpbmdTaGFyZVB3ZCgpOwogICAgICAgIH07CgogICAgICAgIG9iai5yZWdpc3RlclB3ZFNoYXJlU3dpdGNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaHRtbCA9ICc8c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZCBpZD0ibmQtc2hhcmUtY2hlY2siIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyI+IDxhIGNsYXNzPSJuZC1vcGVuLXBhZ2Utb3B0aW9uIG9uZS1wYW4tbGluay1tYXJrIiB0aXRsZT0i54K55Ye75p+l55yL5pu05aSa6ISa5pys6YWN572uIiBzdHlsZT0iY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsiPuWFseS6q+aPkOWPlueggTwvYT48L3NwYW4+JzsKICAgICAgICAgICAgJCgiLmNvZGUtcGFuZWwgLnRpdGxlIikuYXBwZW5kKGh0bWwpOwogICAgICAgICAgICBvYmouaXNQd2RTaGFyZU9wZW4oKSB8fCAkKCIjbmQtc2hhcmUtY2hlY2siKS5yZW1vdmVBdHRyKCJjaGVja2VkIik7CgogICAgICAgICAgICAvLyDlvIDlhbMt5LqL5Lu2CiAgICAgICAgICAgICQoIiNuZC1zaGFyZS1jaGVjayIpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5pcygnOmNoZWNrZWQnKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbi5zZXRPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LnR5MTg5X3NoYXJlX3N0YXR1cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb24uc2V0T3B0aW9uVW5BY3RpdmUob3B0aW9uLmNvbnN0YW50LnR5MTg5X3NoYXJlX3N0YXR1cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g5omT5byA6YWN572u6aG1CiAgICAgICAgICAgICQoIi5uZC1vcGVuLXBhZ2Utb3B0aW9uIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcnVudGltZS5vcGVuT3B0aW9uc1BhZ2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnJlZ2lzdGVyU3RvcmVTaGFyZVB3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdW5zYWZlV2luZG93LiQoZG9jdW1lbnQpLmFqYXhDb21wbGV0ZShmdW5jdGlvbiAoZXZlbnQsIHhociwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0geGhyLnJlc3BvbnNlSlNPTjsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVybC5pbmRleE9mKCJzaGFyZUZpbGVWZXJpZnlQYXNzLmFjdGlvbiIpID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIE9iamVjdCAmJiByZXNwb25zZS5zaGFyZUlkICYmIHJlc3BvbnNlLmFjY2Vzc0NvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlUHdkID0gcmVzcG9uc2UuYWNjZXNzQ29kZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFyZVB3ZCA9PSBvYmoudmVyaWZ5X3BhZ2Uuc2hhcmVfcHdkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oInB3ZCBzaGFyZSBub3QgY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqLmlzUHdkU2hhcmVPcGVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybigicHdkIHNoYXJlIGNsb3NlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVJZCA9IG9iai5nZXRTaGFyZUlkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZUxpbmsgPSBvYmouZ2V0U2hhcmVMaW5rKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlTG9nLmFkZFNoYXJlTG9nKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZUxpbmssIGNvbnN0YW50LnNvdXJjZS50eTE4OSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigicHdkIHNoYXJlIG5vdCBtYXRjaCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmF1dG9QYWRkaW5nU2hhcmVQd2QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzaGFyZUlkID0gb2JqLmdldFNoYXJlSWQoKTsKICAgICAgICAgICAgdmFyIHNoYXJlTGluayA9IG9iai5nZXRTaGFyZUxpbmsoKTsKICAgICAgICAgICAgYXBpLnF1ZXJ5U2hhcmVQd2QoY29uc3RhbnQuc291cmNlLnR5MTg5LCBzaGFyZUlkLCBzaGFyZUxpbmssIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZVB3ZCA9IHJlc3BvbnNlLmRhdGEuc2hhcmVfcHdkOwogICAgICAgICAgICAgICAgICAgIG9iai52ZXJpZnlfcGFnZS5zaGFyZV9wd2QgPSBzaGFyZVB3ZDsKCiAgICAgICAgICAgICAgICAgICAgJCgiI2NvZGVfdHh0IikudmFsKHNoYXJlUHdkKTsKICAgICAgICAgICAgICAgICAgICBvYmouc2hvd1RpcCgxLCAi5aGr5YWF6K6/6Zeu56CB5oiQ5YqfIiwgMjAwMCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uaXNPcHRpb25BY3RpdmUob3B0aW9uLmNvbnN0YW50LnR5MTg5X2F1dG9fanVtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhZmVXaW5kb3cuJCgiLmJ0bi52aXNpdCIpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93VGlwKDAsICLmmoLml6DkurrliIbkuqvorr/pl67noIEiLCAyMDAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLnNob3dUaXAgPSBmdW5jdGlvbiAoY29kZSwgbXNnLCB0aW1lb3V0KSB7CiAgICAgICAgICAgIHZhciAkZWxlbWVudCA9ICQoIi52aXNpdF9lcnJvciIpOwogICAgICAgICAgICBpZiAoY29kZSkgewogICAgICAgICAgICAgICAgJGVsZW1lbnQuc2FmZUh0bWwoJzxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4nICsgbXNnICsgJzwvc3Bhbj4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRlbGVtZW50LnNhZmVIdG1sKCc8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPicgKyBtc2cgKyAnPC9zcGFuPicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlbGVtZW50LnNob3coKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkZWxlbWVudC5oaWRlKCk7CiAgICAgICAgICAgIH0sIHRpbWVvdXQpOwogICAgICAgIH07CgogICAgICAgIG9iai5pbml0RG93bmxvYWRQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCIuYnRuLWRvd25sb2FkIikuYWZ0ZXIoJzxhIGNsYXNzPSJidG4gYnRuLXNob3ctbGluayIgc3R5bGU9ImJhY2tncm91bmQ6ICMyYjg5ZWE7IGN1cnNvcjogcG9pbnRlciI+5pi+56S66ZO+5o6lPC9hPicpOwogICAgICAgICAgICAkKCIuYnRuLXNob3ctbGluayIpLm9uKCJjbGljayIsIG9iai5zaG93RG93bmxvYWQpOwogICAgICAgIH07CgogICAgICAgIG9iai5zaG93RG93bmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHg7IGhlaWdodDogNDEwcHg7IG92ZXJmbG93LXk6IGF1dG87Ij4nOwogICAgICAgICAgICB2YXIgcm93U3R5bGUgPSAibWFyZ2luOjEwcHggMHB4OyBvdmVyZmxvdzpoaWRkZW47IHdoaXRlLXNwYWNlOm5vd3JhcDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsiOwoKICAgICAgICAgICAgdmFyIGZpbGVJZHMgPSBvYmouZ2V0U2VsZWN0ZWRGaWxlSWRzKCksCiAgICAgICAgICAgICAgICBmaWxlTGlzdCA9IG9iai5nZXRTZWxlY3RlZEZpbGVMaXN0KCk7CgogICAgICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgdmFyIHBhY2thZ2VVcmwgPSBvYmouYnVpbGRQYWNrYWdlVXJsKGZpbGVJZHMsICLmiZPljIXkuIvovb0uemlwIik7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8cD7ljovnvKnljIU8L3A+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxwIHN0eWxlPSInICsgcm93U3R5bGUgKyAnIj48YSB0aXRsZT0iJyArIHBhY2thZ2VVcmwgKyAnIiBocmVmPSInICsgcGFja2FnZVVybCArICciIHN0eWxlPSJjb2xvcjogYmx1ZTsiPicgKyBwYWNrYWdlVXJsICsgJzwvYT48L3A+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxwPiZuYnNwOzwvcD4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0ZvbGRlcikgewogICAgICAgICAgICAgICAgICAgIGZpbGUuZG93bmxvYWRVcmwgPSBvYmouYnVpbGRQYWNrYWdlVXJsKGZpbGUuZmlsZUlkLCBmaWxlLmZpbGVOYW1lICsgIi56aXAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZpbGUuZG93bmxvYWRVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArIGZpbGUuZG93bmxvYWRVcmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBodG1sICs9ICc8cD4nICsgKCsraW5kZXgpICsgJ++8micgKyAoZmlsZS5maWxlTmFtZSA/IGZpbGUuZmlsZU5hbWUgOiBmaWxlLmZpbGVJZCkgKyAnPC9wPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8cCBzdHlsZT0iJyArIHJvd1N0eWxlICsgJyI+PGEgdGl0bGU9IicgKyBmaWxlLmRvd25sb2FkVXJsICsgJyIgaHJlZj0iJyArIGZpbGUuZG93bmxvYWRVcmwgKyAnIiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4nICsgZmlsZS5kb3dubG9hZFVybCArICc8L2E+PC9wPic7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaHRtbCArPSAnPGRpdj4nOwogICAgICAgICAgICBvYmouc2hvd0JveChodG1sKTsKICAgICAgICB9OwoKICAgICAgICBvYmouc2hvd0JveCA9IGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICc8ZGl2IGlkPSJKX0ZpbGVNb2RhbCIgY2xhc3M9InRyZWVCb3gtbW9kYWwgbW9kYWwgaW4iIHN0eWxlPSJkaXNwbGF5OmJsb2NrIj48ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPjxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+PGEgY2xhc3M9ImNsb3NlIj7DlzwvYT48aDM+5paH5Lu25LiL6L29PC9oMz48L2Rpdj48ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij48L2Rpdj48L2Rpdj48L2Rpdj4nOwogICAgICAgICAgICBpZiAoJCgiI0pfRmlsZU1vZGFsIikubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICQoImJvZHkiKS5hcHBlbmQodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgJCgiI0pfRmlsZU1vZGFsIC5jbG9zZSIpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjSl9GaWxlTW9kYWwiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkKCIjSl9GaWxlTW9kYWwiKS5zaG93KCk7CiAgICAgICAgICAgICQoIiNKX0ZpbGVNb2RhbCAubW9kYWwtYm9keSIpLnNhZmVIdG1sKGJvZHkpOwogICAgICAgIH07CgogICAgICAgIG9iai5idWlsZFBhY2thZ2VVcmwgPSBmdW5jdGlvbiAoZmlsZUlkcywgZmlsZU5hbWUpIHsKICAgICAgICAgICAgdmFyIGRvd25sb2FkVXJsID0gdW5zYWZlV2luZG93LmVkcml2ZS5kb3dubG9hZFVybCwKICAgICAgICAgICAgICAgIHNlc3Npb25LZXkgPSB1bnNhZmVXaW5kb3cuZWRyaXZlLnNlc3Npb25LZXk7CiAgICAgICAgICAgIGZpbGVOYW1lIHx8IChmaWxlTmFtZSA9ICIiKTsKICAgICAgICAgICAgaWYgKHVuc2FmZVdpbmRvdy5fc2hhcmVJZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgZG93bmxvYWRVcmwgKyAiP3Nlc3Npb25LZXk9IiArIHNlc3Npb25LZXkgKyAiJmZpbGVJZFM9IiArIGZpbGVJZHMgKyAiJmRvd25sb2FkVHlwZT0zJnNoYXJlSWQ9IiArIHVuc2FmZVdpbmRvdy5fc2hhcmVJZCArICImZmlsZW5hbWU9IiArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wgKyBkb3dubG9hZFVybCArICI/c2Vzc2lvbktleT0iICsgc2Vzc2lvbktleSArICImZmlsZUlkUz0iICsgZmlsZUlkcyArICImZG93bmxvYWRUeXBlPTEmZmlsZW5hbWU9IiArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBvYmouZ2V0U2VsZWN0ZWRGaWxlSWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZUlkTGlzdCA9IFtdOwogICAgICAgICAgICB2YXIgZmlsZUxpc3QgPSBvYmouZ2V0U2VsZWN0ZWRGaWxlTGlzdCgpOwogICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBmaWxlSWRMaXN0LnB1c2goaXRlbS5hdHRyaWJ1dGVzLmZpbGVJZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZmlsZUlkTGlzdC5qb2luKCIsIik7CiAgICAgICAgfTsKCiAgICAgICAgb2JqLmdldFNlbGVjdGVkRmlsZUxpc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBtYWluVmlldyA9IG51bGwsIGZpbGVMaXN0ID0gW107CiAgICAgICAgICAgIGlmICh1bnNhZmVXaW5kb3cuZG93bmxvYWRVcmwpIHsKICAgICAgICAgICAgICAgIGZpbGVMaXN0ID0gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdW5zYWZlV2luZG93CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh1bnNhZmVXaW5kb3cuX3NoYXJlSWQpIHsKICAgICAgICAgICAgICAgIG1haW5WaWV3ID0gdW5zYWZlV2luZG93LmFwcFJvdXRlci5tYWluVmlldzsKICAgICAgICAgICAgICAgIGlmIChtYWluVmlldyBpbnN0YW5jZW9mIE9iamVjdCAmJiBtYWluVmlldy5maWxlTGlzdCkgewogICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0ID0gbWFpblZpZXcuZmlsZUxpc3Q7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVMaXN0LnNlbGVjdGVkKCkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0ID0gZmlsZUxpc3Quc2VsZWN0ZWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodW5zYWZlV2luZG93Lm1haW5WaWV3KSB7CiAgICAgICAgICAgICAgICBtYWluVmlldyA9IHVuc2FmZVdpbmRvdy5tYWluVmlldzsKICAgICAgICAgICAgICAgIGlmIChtYWluVmlldy5maWxlTGlzdFRhYk9iaiAmJiBtYWluVmlldy5maWxlTGlzdFRhYk9ialttYWluVmlldy5vcHRpb25zLmZpbGVJZF0pIHsKICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdCA9IG1haW5WaWV3LmZpbGVMaXN0VGFiT2JqW21haW5WaWV3Lm9wdGlvbnMuZmlsZUlkXS5maWxlTGlzdC5zZWxlY3RlZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobWFpblZpZXcuZ2V0U2VsZWN0ZWRNb2RlbHMpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdCA9IG1haW5WaWV3LmdldFNlbGVjdGVkTW9kZWxzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzZWxlY3RlZEZpbGVMaXN0ID0gW107CiAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMuZmlsZUlkID4gMCkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsZUxpc3QucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEZpbGVMaXN0OwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTaGFyZUlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdXJsID0gcm91dGVyLmdldFVybCgpOwogICAgICAgICAgICB2YXIgbWF0Y2ggPSB1cmwubWF0Y2goL2Nsb3VkXC4xODlcLmNuXC90XC8oWzAtOWEtel0rKS9pKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsOwogICAgICAgIH07CgogICAgICAgIG9iai5nZXRTaGFyZUxpbmsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmOwogICAgICAgIH07CgogICAgICAgIG9iai5pc1B3ZFNoYXJlT3BlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5pc09wdGlvbkFjdGl2ZShvcHRpb24uY29uc3RhbnQudHkxODlfc2hhcmVfc3RhdHVzKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgY29udGFpbmVyLmRlZmluZSgiYXBwX21hbmFnZSIsIFsibWV0YSIsICJ1bnNhZmVXaW5kb3ciXSwgZnVuY3Rpb24gKG1ldGEsIHVuc2FmZVdpbmRvdykgewogICAgICAgIHZhciBvYmogPSB7fTsKCiAgICAgICAgb2JqLnJ1biA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKG1ldGEuZXhpc3RNZXRhKCJtYW5hZ2UiKSkgewogICAgICAgICAgICAgICAgdW5zYWZlV2luZG93Lk9uZVBhbiA9IGNvbnRhaW5lcjsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pOwoKICAgIGNvbnRhaW5lci5kZWZpbmUoImFwcCIsIFsiYXBwUnVubmVyIl0sIGZ1bmN0aW9uIChhcHBSdW5uZXIpIHsKICAgICAgICB2YXIgb2JqID0ge307CgogICAgICAgIG9iai5ydW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGFwcFJ1bm5lci5ydW4oWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJhcHBfYmFpZHUiLAogICAgICAgICAgICAgICAgICAgIG1hdGNoczogWwogICAgICAgICAgICAgICAgICAgICAgICAiYmFpZHUuY29tIgogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogImFwcF93ZWl5dW4iLAogICAgICAgICAgICAgICAgICAgIG1hdGNoczogWwogICAgICAgICAgICAgICAgICAgICAgICAid2VpeXVuLmNvbSIKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJhcHBfbGFuem91cyIsCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICJsYW56b3VzLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYW56b3V4LmNvbSIKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJhcHBfMTg5IiwKICAgICAgICAgICAgICAgICAgICBtYXRjaHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgImNsb3VkLjE4OS5jbiIKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJhcHBfbWFuYWdlIiwKICAgICAgICAgICAgICAgICAgICBtYXRjaHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgIioiCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfSk7CgogICAgLyoqIGxpYiAqKi8KICAgIGNvbnRhaW5lci5kZWZpbmUoIiQiLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB3aW5kb3cuJDsKICAgIH0pOwogICAgY29udGFpbmVyLmRlZmluZSgiU25hcCIsIFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBTbmFwICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHJldHVybiBTbmFwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5TbmFwOwogICAgICAgIH0KICAgIH0pOwogICAgY29udGFpbmVyLmRlZmluZSgiRE9NUHVyaWZ5IiwgW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodHlwZW9mIERPTVB1cmlmeSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICByZXR1cm4gRE9NUHVyaWZ5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5ET01QdXJpZnk7CiAgICAgICAgfQogICAgfSk7CgogICAgY29udGFpbmVyLnVzZShbImdtIiwgImNvcmUiLCAiYXBwIl0sIGZ1bmN0aW9uIChnbSwgY29yZSwgYXBwKSB7CiAgICAgICAgZ20ucmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb3JlLnJlYWR5KGFwcC5ydW4pOwogICAgICAgIH0pOwogICAgfSk7Cn0pKCk7","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.staticfile.org/jquery/3.5.0/jquery.min.js","ts":1600058233636,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My41LjAgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKEMsZSl7InVzZSBzdHJpY3QiO3ZhciB0PVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLHM9dC5zbGljZSxnPXQuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gdC5mbGF0LmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbmNhdC5hcHBseShbXSxlKX0sdT10LnB1c2gsaT10LmluZGV4T2Ysbj17fSxvPW4udG9TdHJpbmcsdj1uLmhhc093blByb3BlcnR5LGE9di50b1N0cmluZyxsPWEuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlfSx4PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LEU9Qy5kb2N1bWVudCxjPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gYihlLHQsbil7dmFyIHIsaSxvPShuPW58fEUpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLHQpZm9yKHIgaW4gYykoaT10W3JdfHx0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUocikpJiZvLnNldEF0dHJpYnV0ZShyLGkpO24uaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP25bby5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGY9IjMuNS4wIixTPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBTLmZuLmluaXQoZSx0KX07ZnVuY3Rpb24gcChlKXt2YXIgdD0hIWUmJiJsZW5ndGgiaW4gZSYmZS5sZW5ndGgsbj13KGUpO3JldHVybiFtKGUpJiYheChlKSYmKCJhcnJheSI9PT1ufHwwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiYwPHQmJnQtMSBpbiBlKX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6Zixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/cy5jYWxsKHRoaXMpOmU8MD90aGlzW2UrdGhpcy5sZW5ndGhdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdH0sZWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUy5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiBuLmNhbGwoZSx0LGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCUyfSkpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soMDw9biYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDp1LHNvcnQ6dC5zb3J0LHNwbGljZTp0LnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxTLmlzUGxhaW5PYmplY3Qobik/bjp7fSxpPSExLGFbdF09Uy5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1vLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj12LmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJmEuY2FsbChuKT09PWwpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0LG4pe2IoZSx7bm9uY2U6dCYmdC5ub25jZX0sbil9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYocChlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihwKE9iamVjdChlKSk/Uy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6dS5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmkuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKHAoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPXRbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe25bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyIGQ9ZnVuY3Rpb24obil7dmFyIGUsZCxiLG8saSxoLGYsZyx3LHUsbCxULEMsYSxFLHYscyxjLHksUz0ic2l6emxlIisxKm5ldyBEYXRlLHA9bi5kb2N1bWVudCxrPTAscj0wLG09dWUoKSx4PXVlKCksQT11ZSgpLE49dWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYobD0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSx0PVtdLHE9dC5wb3AsTD10LnB1c2gsSD10LnB1c2gsTz10LnNsaWNlLFA9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixJPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixXPSJcXFsiK00rIiooIitJKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrSSsiKSl8KSIrTSsiKlxcXSIsRj0iOigiK0krIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1crIikqKXwuKilcXCl8KSIsQj1uZXcgUmVnRXhwKE0rIisiLCJnIiksJD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSx6PW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKE0rInw+IiksWD1uZXcgUmVnRXhwKEYpLFY9bmV3IFJlZ0V4cCgiXiIrSSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrSSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitJKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitJKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrVyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0YpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L0hUTUwkL2ksUT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksSz0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGVlPS9bK35dLyx0ZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iMHgiK2Uuc2xpY2UoMSktNjU1MzY7cmV0dXJuIHR8fChuPDA/U3RyaW5nLmZyb21DaGFyQ29kZShuKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKG4+PjEwfDU1Mjk2LDEwMjMmbnw1NjMyMCkpfSxyZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxpZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LG9lPWZ1bmN0aW9uKCl7VCgpfSxhZT1iZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7SC5hcHBseSh0PU8uY2FsbChwLmNoaWxkTm9kZXMpLHAuY2hpbGROb2RlcyksdFtwLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtIPXthcHBseTp0Lmxlbmd0aD9mdW5jdGlvbihlLHQpe0wuYXBwbHkoZSxPLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzZSh0LGUsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmPWUmJmUub3duZXJEb2N1bWVudCxwPWU/ZS5ub2RlVHlwZTo5O2lmKG49bnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PXAmJjkhPT1wJiYxMSE9PXApcmV0dXJuIG47aWYoIXImJihUKGUpLGU9ZXx8QyxFKSl7aWYoMTEhPT1wJiYodT1aLmV4ZWModCkpKWlmKGk9dVsxXSl7aWYoOT09PXApe2lmKCEoYT1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gbjtpZihhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZihmJiYoYT1mLmdldEVsZW1lbnRCeUlkKGkpKSYmeShlLGEpJiZhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZXtpZih1WzJdKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSksbjtpZigoaT11WzNdKSYmZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkobixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLG59aWYoZC5xc2EmJiFOW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1wfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKGM9dCxmPWUsMT09PXAmJihVLnRlc3QodCl8fHoudGVzdCh0KSkpeyhmPWVlLnRlc3QodCkmJnllKGUucGFyZW50Tm9kZSl8fGUpPT09ZSYmZC5zY29wZXx8KChzPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShyZSxpZSk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPVMpKSxvPShsPWgodCkpLmxlbmd0aDt3aGlsZShvLS0pbFtvXT0ocz8iIyIrczoiOnNjb3BlIikrIiAiK3hlKGxbb10pO2M9bC5qb2luKCIsIil9dHJ5e3JldHVybiBILmFwcGx5KG4sZi5xdWVyeVNlbGVjdG9yQWxsKGMpKSxufWNhdGNoKGUpe04odCwhMCl9ZmluYWxseXtzPT09UyYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gZyh0LnJlcGxhY2UoJCwiJDEiKSxlLG4scil9ZnVuY3Rpb24gdWUoKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe3JldHVybiByLnB1c2godCsiICIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0KyIgIl09bn19ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGVbU109ITAsZX1mdW5jdGlvbiBjZShlKXt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gZmUoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1uLmxlbmd0aDt3aGlsZShyLS0pYi5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcGUoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGRlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09dHx8ImJ1dHRvbiI9PT10KSYmZS50eXBlPT09bn19ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhZShlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2ZShhKXtyZXR1cm4gbGUoZnVuY3Rpb24obyl7cmV0dXJuIG89K28sbGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiB5ZShlKXtyZXR1cm4gZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZvcihlIGluIGQ9c2Uuc3VwcG9ydD17fSxpPXNlLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZXNwYWNlVVJJLG49KGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFZLnRlc3QodHx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0sVD1zZS5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6cDtyZXR1cm4gciE9QyYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50JiYoYT0oQz1yKS5kb2N1bWVudEVsZW1lbnQsRT0haShDKSxwIT1DJiYobj1DLmRlZmF1bHRWaWV3KSYmbi50b3AhPT1uJiYobi5hZGRFdmVudExpc3RlbmVyP24uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixvZSwhMSk6bi5hdHRhY2hFdmVudCYmbi5hdHRhY2hFdmVudCgib251bmxvYWQiLG9lKSksZC5zY29wZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChDLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCYmIWUucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIGZpZWxkc2V0IGRpdiIpLmxlbmd0aH0pLGQuYXR0cmlidXRlcz1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKEMuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPUsudGVzdChDLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGQuZ2V0QnlJZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5pZD1TLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShTKS5sZW5ndGh9KSxkLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB0JiZ0LnZhbHVlPT09bn19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksYi5maW5kLlRBRz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6ZC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sYi5maW5kLkNMQVNTPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmRSlyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxzPVtdLHY9W10sKGQucXNhPUsudGVzdChDLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGNlKGZ1bmN0aW9uKGUpe3ZhciB0O2EuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitTKyInPjwvYT48c2VsZWN0IGlkPSciK1MrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitTKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLCh0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiIiksZS5hcHBlbmRDaGlsZCh0KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPScnXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIipuYW1lIitNKyIqPSIrTSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiYSMiK1MrIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJcXFxmIiksdi5wdXNoKCJbXFxyXFxuXFxmXSIpfSksY2UoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwoZC5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KGM9YS5tYXRjaGVzfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEub01hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcikpJiZjZShmdW5jdGlvbihlKXtkLmRpc2Nvbm5lY3RlZE1hdGNoPWMuY2FsbChlLCIqIiksYy5jYWxsKGUsIltzIT0nJ106eCIpLHMucHVzaCgiIT0iLEYpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkscz1zLmxlbmd0aCYmbmV3IFJlZ0V4cChzLmpvaW4oInwiKSksdD1LLnRlc3QoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseT10fHxLLnRlc3QoYS5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWQuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09bj9lPT1DfHxlLm93bmVyRG9jdW1lbnQ9PXAmJnkocCxlKT8tMTp0PT1DfHx0Lm93bmVyRG9jdW1lbnQ9PXAmJnkocCx0KT8xOnU/UCh1LGUpLVAodSx0KTowOjQmbj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PUM/LTE6dD09Qz8xOmk/LTE6bz8xOnU/UCh1LGUpLVAodSx0KTowO2lmKGk9PT1vKXJldHVybiBwZShlLHQpO249ZTt3aGlsZShuPW4ucGFyZW50Tm9kZSlhLnVuc2hpZnQobik7bj10O3doaWxlKG49bi5wYXJlbnROb2RlKXMudW5zaGlmdChuKTt3aGlsZShhW3JdPT09c1tyXSlyKys7cmV0dXJuIHI/cGUoYVtyXSxzW3JdKTphW3JdPT1wPy0xOnNbcl09PXA/MTowfSksQ30sc2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBzZShlLG51bGwsbnVsbCx0KX0sc2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoVChlKSxkLm1hdGNoZXNTZWxlY3RvciYmRSYmIU5bdCsiICJdJiYoIXN8fCFzLnRlc3QodCkpJiYoIXZ8fCF2LnRlc3QodCkpKXRyeXt2YXIgbj1jLmNhbGwoZSx0KTtpZihufHxkLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7Tih0LCEwKX1yZXR1cm4gMDxzZSh0LEMsbnVsbCxbZV0pLmxlbmd0aH0sc2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKSx5KGUsdCl9LHNlLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKTt2YXIgbj1iLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxyPW4mJmouY2FsbChiLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhRSk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6ZC5hdHRyaWJ1dGVzfHwhRT9lLmdldEF0dHJpYnV0ZSh0KToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9LHNlLmVzY2FwZT1mdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZShyZSxpZSl9LHNlLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sc2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxpPTA7aWYobD0hZC5kZXRlY3REdXBsaWNhdGVzLHU9IWQuc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoRCksbCl7d2hpbGUodD1lW2krK10pdD09PWVbaV0mJihyPW4ucHVzaChpKSk7d2hpbGUoci0tKWUuc3BsaWNlKG5bcl0sMSl9cmV0dXJuIHU9bnVsbCxlfSxvPXNlLmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPW8oZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ugd2hpbGUodD1lW3IrK10pbis9byh0KTtyZXR1cm4gbn0sKGI9c2Uuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86bGUsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKHRlLG5lKSxlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHwiIikucmVwbGFjZSh0ZSxuZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fHNlLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJnNlLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBHLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9aChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PW1bZSsiICJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2UrIigiK00rInwkKSIpKSYmbShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXNlLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD8iIT0iPT09cjohcnx8KHQrPSIiLCI9Ij09PXI/dD09PWk6IiE9Ij09PXI/dCE9PWk6Il49Ij09PXI/aSYmMD09PXQuaW5kZXhPZihpKToiKj0iPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6IiQ9Ij09PXI/aSYmdC5zbGljZSgtaS5sZW5ndGgpPT09aToifj0iPT09cj8tMTwoIiAiK3QucmVwbGFjZShCLCIgIikrIiAiKS5pbmRleE9mKGkpOiJ8PSI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihoLGUsdCxnLHYpe3ZhciB5PSJudGgiIT09aC5zbGljZSgwLDMpLG09Imxhc3QiIT09aC5zbGljZSgtNCkseD0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ZyYmMD09PXY/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD15IT09bT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLGM9ZS5wYXJlbnROb2RlLGY9eCYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHA9IW4mJiF4LGQ9ITE7aWYoYyl7aWYoeSl7d2hpbGUobCl7YT1lO3doaWxlKGE9YVtsXSlpZih4P2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWY6MT09PWEubm9kZVR5cGUpcmV0dXJuITE7dT1sPSJvbmx5Ij09PWgmJiF1JiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKHU9W20/Yy5maXJzdENoaWxkOmMubGFzdENoaWxkXSxtJiZwKXtkPShzPShyPShpPShvPShhPWMpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSYmclsyXSxhPXMmJmMuY2hpbGROb2Rlc1tzXTt3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigxPT09YS5ub2RlVHlwZSYmKytkJiZhPT09ZSl7aVtoXT1bayxzLGRdO2JyZWFrfX1lbHNlIGlmKHAmJihkPXM9KHI9KGk9KG89KGE9ZSlbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF18fFtdKVswXT09PWsmJnJbMV0pLCExPT09ZCl3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKSYmKytkJiYocCYmKChpPShvPWFbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF09W2ssZF0pLGE9PT1lKSlicmVhaztyZXR1cm4oZC09dik9PT1nfHxkJWc9PTAmJjA8PWQvZ319fSxQU0VVRE86ZnVuY3Rpb24oZSxvKXt2YXIgdCxhPWIucHNldWRvc1tlXXx8Yi5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGFbU10/YShvKToxPGEubGVuZ3RoPyh0PVtlLGUsIiIsb10sYi5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/bGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoZSxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249UChlLHJbaV0pXT0hKHRbbl09cltpXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gYShlLDAsdCl9KTphfX0scHNldWRvczp7bm90OmxlKGZ1bmN0aW9uKGUpe3ZhciByPVtdLGk9W10scz1mKGUucmVwbGFjZSgkLCIkMSIpKTtyZXR1cm4gc1tTXT9sZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPXMoZSxudWxsLHIsW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShpPW9bYV0pJiYoZVthXT0hKHRbYV09aSkpfSk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByWzBdPWUscyhyLG51bGwsbixpKSxyWzBdPW51bGwsIWkucG9wKCl9fSksaGFzOmxlKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMDxzZSh0LGUpLmxlbmd0aH19KSxjb250YWluczpsZShmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UodGUsbmUpLGZ1bmN0aW9uKGUpe3JldHVybi0xPChlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpfX0pLGxhbmc6bGUoZnVuY3Rpb24obil7cmV0dXJuIFYudGVzdChufHwiIil8fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK24pLG49bi5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciB0O2Rve2lmKHQ9RT9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobisiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5sb2NhdGlvbiYmbi5sb2NhdGlvbi5oYXNoO3JldHVybiB0JiZ0LnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWF9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09Qy5hY3RpdmVFbGVtZW50JiYoIUMuaGFzRm9jdXN8fEMuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6Z2UoITEpLGRpc2FibGVkOmdlKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PWUuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hYi5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIEoudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFEudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dmUoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTp2ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0OnQ8bj90Om47MDw9LS1yOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp2ZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9Yi5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSliLnBzZXVkb3NbZV09ZGUoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSliLnBzZXVkb3NbZV09aGUoZSk7ZnVuY3Rpb24gbWUoKXt9ZnVuY3Rpb24geGUoZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO3Q8bjt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiBiZShzLGUsdCl7dmFyIHU9ZS5kaXIsbD1lLm5leHQsYz1sfHx1LGY9dCYmInBhcmVudE5vZGUiPT09YyxwPXIrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLHQsbil7d2hpbGUoZT1lW3VdKWlmKDE9PT1lLm5vZGVUeXBlfHxmKXJldHVybiBzKGUsdCxuKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPVtrLHBdO2lmKG4pe3doaWxlKGU9ZVt1XSlpZigoMT09PWUubm9kZVR5cGV8fGYpJiZzKGUsdCxuKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilpZihpPShvPWVbU118fChlW1NdPXt9KSlbZS51bmlxdWVJRF18fChvW2UudW5pcXVlSURdPXt9KSxsJiZsPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVt1XXx8ZTtlbHNle2lmKChyPWlbY10pJiZyWzBdPT09ayYmclsxXT09PXApcmV0dXJuIGFbMl09clsyXTtpZigoaVtjXT1hKVsyXT1zKGUsdCxuKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd2UoaSl7cmV0dXJuIDE8aS5sZW5ndGg/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkubGVuZ3RoO3doaWxlKHItLSlpZighaVtyXShlLHQsbikpcmV0dXJuITE7cmV0dXJuITB9OmlbMF19ZnVuY3Rpb24gVGUoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBDZShkLGgsZyx2LHksZSl7cmV0dXJuIHYmJiF2W1NdJiYodj1DZSh2KSkseSYmIXlbU10mJih5PUNlKHksZSkpLGxlKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVtdLHU9W10sbD10Lmxlbmd0aCxjPWV8fGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspc2UoZSx0W3JdLG4pO3JldHVybiBufShofHwiKiIsbi5ub2RlVHlwZT9bbl06bixbXSksZj0hZHx8IWUmJmg/YzpUZShjLHMsZCxuLHIpLHA9Zz95fHwoZT9kOmx8fHYpP1tdOnQ6ZjtpZihnJiZnKGYscCxuLHIpLHYpe2k9VGUocCx1KSx2KGksW10sbixyKSxvPWkubGVuZ3RoO3doaWxlKG8tLSkoYT1pW29dKSYmKHBbdVtvXV09IShmW3Vbb11dPWEpKX1pZihlKXtpZih5fHxkKXtpZih5KXtpPVtdLG89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiZpLnB1c2goZltvXT1hKTt5KG51bGwscD1bXSxpLHIpfW89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiYtMTwoaT15P1AoZSxhKTpzW29dKSYmKGVbaV09ISh0W2ldPWEpKX19ZWxzZSBwPVRlKHA9PT10P3Auc3BsaWNlKGwscC5sZW5ndGgpOnApLHk/eShudWxsLHQscCxyKTpILmFwcGx5KHQscCl9KX1mdW5jdGlvbiBFZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlWyIgIl0scz1vPzE6MCx1PWJlKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09aX0sYSwhMCksbD1iZShmdW5jdGlvbihlKXtyZXR1cm4tMTxQKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPT13KXx8KChpPXQpLm5vZGVUeXBlP3UoZSx0LG4pOmwoZSx0LG4pKTtyZXR1cm4gaT1udWxsLHJ9XTtzPHI7cysrKWlmKHQ9Yi5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W2JlKHdlKGMpLHQpXTtlbHNle2lmKCh0PWIuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtTXSl7Zm9yKG49KytzO248cjtuKyspaWYoYi5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBDZSgxPHMmJndlKGMpLDE8cyYmeGUoZS5zbGljZSgwLHMtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3MtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZSgkLCIkMSIpLHQsczxuJiZFZShlLnNsaWNlKHMsbikpLG48ciYmRWUoZT1lLnNsaWNlKG4pKSxuPHImJnhlKGUpKX1jLnB1c2godCl9cmV0dXJuIHdlKGMpfXJldHVybiBtZS5wcm90b3R5cGU9Yi5maWx0ZXJzPWIucHNldWRvcyxiLnNldEZpbHRlcnM9bmV3IG1lLGg9c2UudG9rZW5pemU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsPXhbZSsiICJdO2lmKGwpcmV0dXJuIHQ/MDpsLnNsaWNlKDApO2E9ZSxzPVtdLHU9Yi5wcmVGaWx0ZXI7d2hpbGUoYSl7Zm9yKG8gaW4gbiYmIShyPV8uZXhlYyhhKSl8fChyJiYoYT1hLnNsaWNlKHJbMF0ubGVuZ3RoKXx8YSkscy5wdXNoKGk9W10pKSxuPSExLChyPXouZXhlYyhhKSkmJihuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UoJCwiICIpfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSksYi5maWx0ZXIpIShyPUdbb10uZXhlYyhhKSl8fHVbb10mJiEocj11W29dKHIpKXx8KG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm8sbWF0Y2hlczpyfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/YS5sZW5ndGg6YT9zZS5lcnJvcihlKTp4KGUscykuc2xpY2UoMCl9LGY9c2UuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHYseSxtLHgscixpPVtdLG89W10sYT1BW2UrIiAiXTtpZighYSl7dHx8KHQ9aChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9RWUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9QShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD0iMCIsYz1lJiZbXSxmPVtdLHA9dyxkPWV8fHgmJmIuZmluZC5UQUcoIioiLGkpLGg9ays9bnVsbD09cD8xOk1hdGgucmFuZG9tKCl8fC4xLGc9ZC5sZW5ndGg7Zm9yKGkmJih3PXQ9PUN8fHR8fGkpO2whPT1nJiZudWxsIT0obz1kW2xdKTtsKyspe2lmKHgmJm8pe2E9MCx0fHxvLm93bmVyRG9jdW1lbnQ9PUN8fChUKG8pLG49IUUpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxDLG4pKXtyLnB1c2gobyk7YnJlYWt9aSYmKGs9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1xLmNhbGwocikpO2Y9VGUoZil9SC5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJnNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihrPWgsdz1wKSxjfSxtP2xlKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX0sZz1zZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJmgoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZFJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUcubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KG9bMF0udHlwZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJnhlKG8pKSlyZXR1cm4gSC5hcHBseShuLHIpLG47YnJlYWt9fX1yZXR1cm4obHx8ZihlLGMpKShyLHQsIUUsbiwhdHx8ZWUudGVzdChlKSYmeWUodC5wYXJlbnROb2RlKXx8dCksbn0sZC5zb3J0U3RhYmxlPVMuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1TLGQuZGV0ZWN0RHVwbGljYXRlcz0hIWwsVCgpLGQuc29ydERldGFjaGVkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oQy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxkLmF0dHJpYnV0ZXMmJmNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmZShSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHNlfShDKTtTLmZpbmQ9ZCxTLmV4cHI9ZC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPWQudW5pcXVlU29ydCxTLnRleHQ9ZC5nZXRUZXh0LFMuaXNYTUxEb2M9ZC5pc1hNTCxTLmNvbnRhaW5zPWQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1kLmVzY2FwZTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmUyhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LGs9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBBKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgTj0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBEKGUsbixyKXtyZXR1cm4gbShuKT9TLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KToic3RyaW5nIiE9dHlwZW9mIG4/Uy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8aS5jYWxsKG4sZSkhPT1yfSk6Uy5maWx0ZXIobixlLHIpfVMuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106Uy5maW5kLm1hdGNoZXMoZSxTLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhTKGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZihTLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKVMuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFEKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZrLnRlc3QoZSk/UyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBqLHE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8aiwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOnEuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgUz90WzBdOnQsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6RSwhMCkpLE4udGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpbSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybihpPUUuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1pLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0oZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoUyk6Uy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLGo9UyhFKTt2YXIgTD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxIPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE8oZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9UyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihTLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJlMoZSk7aWYoIWsudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKDE8by5sZW5ndGg/Uy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/aS5jYWxsKFMoZSksdGhpc1swXSk6aS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFMoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBPKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBUKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gVChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihBKGUsInRlbXBsYXRlIikmJihlPWUuY29udGVudHx8ZSksUy5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHIsaSl7Uy5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPVMubWFwKHRoaXMsaSxlKTtyZXR1cm4iVW50aWwiIT09ci5zbGljZSgtNSkmJih0PWUpLHQmJiJzdHJpbmciPT10eXBlb2YgdCYmKG49Uy5maWx0ZXIodCxuKSksMTx0aGlzLmxlbmd0aCYmKEhbcl18fFMudW5pcXVlU29ydChuKSxMLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIFIoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gTShlKXt0aHJvdyBlfWZ1bmN0aW9uIEkoZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj0ic3RyaW5nIj09dHlwZW9mIHI/KGU9cixuPXt9LFMuZWFjaChlLm1hdGNoKFApfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTpTLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Uy5lYWNoKGUsZnVuY3Rpb24oZSx0KXttKHQpP3IudW5pcXVlJiZmLmhhcyh0KXx8cy5wdXNoKHQpOnQmJnQubGVuZ3RoJiYic3RyaW5nIiE9PXcodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKC0xPChuPVMuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPFMuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hc30sbG9jazpmdW5jdGlvbigpe3JldHVybiBhPXU9W10sdHx8aXx8KHM9dD0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFhfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiBhfHwodD1bZSwodD10fHxbXSkuc2xpY2U/dC5zbGljZSgpOnRdLHUucHVzaCh0KSxpfHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fTtyZXR1cm4gZn0sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciBvPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxpPSJwZW5kaW5nIixhPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBpfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKHIpe1MuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49bShpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmbShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdKyJXaXRoIl0odGhpcyxuP1tlXTphcmd1bWVudHMpfSl9KSxpPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxuLHIpe3ZhciB1PTA7ZnVuY3Rpb24gbChpLG8sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCEoaTx1KSl7aWYoKGU9YS5hcHBseShuLHIpKT09PW8ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO3Q9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sbSh0KT9zP3QuY2FsbChlLGwodSxvLFIscyksbCh1LG8sTSxzKSk6KHUrKyx0LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scyksbCh1LG8sUixvLm5vdGlmeVdpdGgpKSk6KGEhPT1SJiYobj12b2lkIDAscj1bZV0pLChzfHxvLnJlc29sdmVXaXRoKShuLHIpKX19LHQ9cz9lOmZ1bmN0aW9uKCl7dHJ5e2UoKX1jYXRjaChlKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuc3RhY2tUcmFjZSksdTw9aSsxJiYoYSE9PU0mJihuPXZvaWQgMCxyPVtlXSksby5yZWplY3RXaXRoKG4scikpfX07aT90KCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLEMuc2V0VGltZW91dCh0KSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLG0ocik/cjpSLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLG0odCk/dDpSKSksb1syXVszXS5hZGQobCgwLGUsbShuKT9uOk0pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9TLmV4dGVuZChlLGEpOmF9fSxzPXt9O3JldHVybiBTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rIldpdGgiXSh0aGlzPT09cz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LHNbdFswXSsiV2l0aCJdPW4uZmlyZVdpdGh9KSxhLnByb21pc2UocyksZSYmZS5jYWxsKHMscyksc30sd2hlbjpmdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHQ9bixyPUFycmF5KHQpLGk9cy5jYWxsKGFyZ3VtZW50cyksbz1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP3MuY2FsbChhcmd1bWVudHMpOmUsLS1ufHxvLnJlc29sdmVXaXRoKHIsaSl9fTtpZihuPD0xJiYoSShlLG8uZG9uZShhKHQpKS5yZXNvbHZlLG8ucmVqZWN0LCFuKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fG0oaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlJKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBXPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe0MuY29uc29sZSYmQy5jb25zb2xlLndhcm4mJmUmJlcudGVzdChlLm5hbWUpJiZDLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBGPVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBCKCl7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEIpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7Uy5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwKSE9PWUmJjA8LS1TLnJlYWR5V2FpdHx8Ri5yZXNvbHZlV2l0aChFLFtTXSl9fSksUy5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09RS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1FLnJlYWR5U3RhdGUmJiFFLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9DLnNldFRpbWVvdXQoUy5yZWFkeSk6KEUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixCKSk7dmFyICQ9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXcobikpZm9yKHMgaW4gaT0hMCxuKSQoZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChTKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LF89L14tbXMtLyx6PS8tKFthLXpdKS9nO2Z1bmN0aW9uIFUoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGUucmVwbGFjZShfLCJtcy0iKS5yZXBsYWNlKHosVSl9dmFyIFY9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBHKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytHLnVpZCsrfUcudWlkPTEsRy5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxWKGUpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dDpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0aGlzLmV4cGFuZG8se3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwfSkpKSx0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9dGhpcy5jYWNoZShlKTtpZigic3RyaW5nIj09dHlwZW9mIHQpaVtYKHQpXT1uO2Vsc2UgZm9yKHIgaW4gdClpW1gocildPXRbcl07cmV0dXJuIGl9LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuY2FjaGUoZSk6ZVt0aGlzLmV4cGFuZG9dJiZlW3RoaXMuZXhwYW5kb11bWCh0KV19LGFjY2VzczpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PXR8fHQmJiJzdHJpbmciPT10eXBlb2YgdCYmdm9pZCAwPT09bj90aGlzLmdldChlLHQpOih0aGlzLnNldChlLHQsbiksdm9pZCAwIT09bj9uOnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWVbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT10KXtuPSh0PUFycmF5LmlzQXJyYXkodCk/dC5tYXAoWCk6KHQ9WCh0KSlpbiByP1t0XTp0Lm1hdGNoKFApfHxbXSkubGVuZ3RoO3doaWxlKG4tLSlkZWxldGUgclt0W25dXX0odm9pZCAwPT09dHx8Uy5pc0VtcHR5T2JqZWN0KHIpKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgZVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT10JiYhUy5pc0VtcHR5T2JqZWN0KHQpfX07dmFyIFk9bmV3IEcsUT1uZXcgRyxKPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sSz0vW0EtWl0vZztmdW5jdGlvbiBaKGUsdCxuKXt2YXIgcixpO2lmKHZvaWQgMD09PW4mJjE9PT1lLm5vZGVUeXBlKWlmKHI9ImRhdGEtIit0LnJlcGxhY2UoSywiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj0idHJ1ZSI9PT0oaT1uKXx8ImZhbHNlIiE9PWkmJigibnVsbCI9PT1pP251bGw6aT09PStpKyIiPytpOkoudGVzdChpKT9KU09OLnBhcnNlKGkpOmkpfWNhdGNoKGUpe31RLnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1TLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gUS5oYXNEYXRhKGUpfHxZLmhhc0RhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBRLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtRLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFkuYWNjZXNzKGUsdCxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtZLnJlbW92ZShlLHQpfX0pLFMuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKG4sZSl7dmFyIHQscixpLG89dGhpc1swXSxhPW8mJm8uYXR0cmlidXRlcztpZih2b2lkIDA9PT1uKXtpZih0aGlzLmxlbmd0aCYmKGk9US5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFZLmdldChvLCJoYXNEYXRhQXR0cnMiKSkpe3Q9YS5sZW5ndGg7d2hpbGUodC0tKWFbdF0mJjA9PT0ocj1hW3RdLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPVgoci5zbGljZSg1KSksWihvLHIsaVtyXSkpO1kuc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2Ygbj90aGlzLmVhY2goZnVuY3Rpb24oKXtRLnNldCh0aGlzLG4pfSk6JCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0O2lmKG8mJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PSh0PVEuZ2V0KG8sbikpP3Q6dm9pZCAwIT09KHQ9WihvLG4pKT90OnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnNldCh0aGlzLG4sZSl9KX0sbnVsbCxlLDE8YXJndW1lbnRzLmxlbmd0aCxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5yZW1vdmUodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPVkuZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9WS5hY2Nlc3MoZSx0LFMubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPVMucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89Uy5fcXVldWVIb29rcyhlLHQpOyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxmdW5jdGlvbigpe1MuZGVxdWV1ZShlLHQpfSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiBZLmdldChlLG4pfHxZLmFjY2VzcyhlLG4se2VtcHR5OlMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1kucmVtb3ZlKGUsW3QrInF1ZXVlIixuXSl9KX0pfX0pLFMuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9ImZ4IixlLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZT9TLnF1ZXVlKHRoaXNbMF0sdCk6dm9pZCAwPT09bj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVMucXVldWUodGhpcyx0LG4pO1MuX3F1ZXVlSG9va3ModGhpcyx0KSwiZngiPT09dCYmImlucHJvZ3Jlc3MiIT09ZVswXSYmUy5kZXF1ZXVlKHRoaXMsdCl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPVMuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlPWV8fCJmeCI7d2hpbGUoYS0tKShuPVkuZ2V0KG9bYV0sZSsicXVldWVIb29rcyIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxpLnByb21pc2UodCl9fSk7dmFyIGVlPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLHRlPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitlZSsiKShbYS16JV0qKSQiLCJpIiksbmU9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxyZT1FLmRvY3VtZW50RWxlbWVudCxpZT1mdW5jdGlvbihlKXtyZXR1cm4gUy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl9LG9lPXtjb21wb3NlZDohMH07cmUuZ2V0Um9vdE5vZGUmJihpZT1mdW5jdGlvbihlKXtyZXR1cm4gUy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fGUuZ2V0Um9vdE5vZGUob2UpPT09ZS5vd25lckRvY3VtZW50fSk7dmFyIGFlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIm5vbmUiPT09KGU9dHx8ZSkuc3R5bGUuZGlzcGxheXx8IiI9PT1lLnN0eWxlLmRpc3BsYXkmJmllKGUpJiYibm9uZSI9PT1TLmNzcyhlLCJkaXNwbGF5Iil9O2Z1bmN0aW9uIHNlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gUy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwoUy5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz1lLm5vZGVUeXBlJiYoUy5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJnRlLmV4ZWMoUy5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKVMuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixTLnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIHVlPXt9O2Z1bmN0aW9uIGxlKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGEscyx1LGw9W10sYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKykocj1lW2NdKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihsW2NdPVkuZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxsW2NdfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYobFtjXT0odT1hPW89dm9pZCAwLGE9KGk9cikub3duZXJEb2N1bWVudCxzPWkubm9kZU5hbWUsKHU9dWVbc10pfHwobz1hLmJvZHkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KHMpKSx1PVMuY3NzKG8sImRpc3BsYXkiKSxvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksIm5vbmUiPT09dSYmKHU9ImJsb2NrIiksdWVbc109dSkpKSk6Im5vbmUiIT09biYmKGxbY109Im5vbmUiLFkuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGM9MDtjPGY7YysrKW51bGwhPWxbY10mJihlW2NdLnN0eWxlLmRpc3BsYXk9bFtjXSk7cmV0dXJuIGV9Uy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gbGUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbGUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7YWUodGhpcyk/Uyh0aGlzKS5zaG93KCk6Uyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgY2UsZmUscGU9L14oPzpjaGVja2JveHxyYWRpbykkL2ksZGU9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2ksaGU9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pO2NlPUUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgiZGl2IikpLChmZT1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksZmUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGZlLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxjZS5hcHBlbmRDaGlsZChmZSkseS5jaGVja0Nsb25lPWNlLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxjZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISFjZS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsY2UuaW5uZXJIVE1MPSI8b3B0aW9uPjwvb3B0aW9uPiIseS5vcHRpb249ISFjZS5sYXN0Q2hpbGQ7dmFyIGdlPXt0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gdmUoZSx0KXt2YXIgbjtyZXR1cm4gbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0fHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdLHZvaWQgMD09PXR8fHQmJkEoZSx0KT9TLm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIHllKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKVkuc2V0KGVbbl0sImdsb2JhbEV2YWwiLCF0fHxZLmdldCh0W25dLCJnbG9iYWxFdmFsIikpfWdlLnRib2R5PWdlLnRmb290PWdlLmNvbGdyb3VwPWdlLmNhcHRpb249Z2UudGhlYWQsZ2UudGg9Z2UudGQseS5vcHRpb258fChnZS5vcHRncm91cD1nZS5vcHRpb249WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSk7dmFyIG1lPS88fCYjP1x3KzsvO2Z1bmN0aW9uIHhlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10sZD0wLGg9ZS5sZW5ndGg7ZDxoO2QrKylpZigobz1lW2RdKXx8MD09PW8paWYoIm9iamVjdCI9PT13KG8pKVMubWVyZ2UocCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKG1lLnRlc3Qobykpe2E9YXx8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShkZS5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9Z2Vbc118fGdlLl9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rUy5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO1MubWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD0iIixkPTA7d2hpbGUobz1wW2QrK10paWYociYmLTE8Uy5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1pZShvKSxhPXZlKGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGwmJnllKGEpLG4pe2M9MDt3aGlsZShvPWFbYysrXSloZS50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9dmFyIGJlPS9ea2V5Lyx3ZT0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sVGU9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIENlKCl7cmV0dXJuITB9ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMX1mdW5jdGlvbiBTZShlLHQpe3JldHVybiBlPT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIEUuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fSgpPT0oImZvY3VzIj09PXQpfWZ1bmN0aW9uIGtlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLHQpa2UoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9RWU7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIFMoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBBZShlLGksbyl7bz8oWS5zZXQoZSxpLCExKSxTLmV2ZW50LmFkZChlLGkse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1ZLmdldCh0aGlzLGkpO2lmKDEmZS5pc1RyaWdnZXImJnRoaXNbaV0pe2lmKHIubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbaV18fHt9KS5kZWxlZ2F0ZVR5cGUmJmUuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihyPXMuY2FsbChhcmd1bWVudHMpLFkuc2V0KHRoaXMsaSxyKSx0PW8odGhpcyxpKSx0aGlzW2ldKCksciE9PShuPVkuZ2V0KHRoaXMsaSkpfHx0P1kuc2V0KHRoaXMsaSwhMSk6bj17fSxyIT09bilyZXR1cm4gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbi52YWx1ZX1lbHNlIHIubGVuZ3RoJiYoWS5zZXQodGhpcyxpLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoclswXSxTLkV2ZW50LnByb3RvdHlwZSksci5zbGljZSgxKSx0aGlzKX0pLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1ZLmdldChlLGkpJiZTLmV2ZW50LmFkZChlLGksQ2UpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9WS5nZXQodCk7aWYoVih0KSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihyZSxpKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KGU9KGV8fCIiKS5tYXRjaChQKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9VGUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KGk/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9Uy5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmUy5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGkpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sbyksKHA9dVtkXSl8fCgocD11W2RdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGgsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGQsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGMpLGMuaGFuZGxlci5ndWlkfHwoYy5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksaT9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGMpOnAucHVzaChjKSxTLmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9WS5oYXNEYXRhKGUpJiZZLmdldChlKTtpZih2JiYodT12LmV2ZW50cykpe2w9KHQ9KHR8fCIiKS5tYXRjaChQKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9VGUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkKXtmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scD11W2Q9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGRdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1vPXAubGVuZ3RoO3doaWxlKG8tLSljPXBbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fHMmJiFzLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fFMucmVtb3ZlRXZlbnQoZSxkLHYuaGFuZGxlKSxkZWxldGUgdVtkXSl9ZWxzZSBmb3IoZCBpbiB1KVMuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7Uy5pc0VtcHR5T2JqZWN0KHUpJiZZLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksdT1TLmV2ZW50LmZpeChlKSxsPShZLmdldCh0aGlzLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbdS50eXBlXXx8W10sYz1TLmV2ZW50LnNwZWNpYWxbdS50eXBlXXx8e307Zm9yKHNbMF09dSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylzW3RdPWFyZ3VtZW50c1t0XTtpZih1LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdSkpe2E9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdSxsKSx0PTA7d2hpbGUoKGk9YVt0KytdKSYmIXUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dS5jdXJyZW50VGFyZ2V0PWkuZWxlbSxuPTA7d2hpbGUoKG89aS5oYW5kbGVyc1tuKytdKSYmIXUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl1LnJuYW1lc3BhY2UmJiExIT09by5uYW1lc3BhY2UmJiF1LnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fCh1LmhhbmRsZU9iaj1vLHUuZGF0YT1vLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8uaGFuZGxlcikuYXBwbHkoaS5lbGVtLHMpKSYmITE9PT0odS5yZXN1bHQ9cikmJih1LnByZXZlbnREZWZhdWx0KCksdS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHUpLHUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHM9W10sdT10LmRlbGVnYXRlQ291bnQsbD1lLnRhcmdldDtpZih1JiZsLm5vZGVUeXBlJiYhKCJjbGljayI9PT1lLnR5cGUmJjE8PWUuYnV0dG9uKSlmb3IoO2whPT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1sLm5vZGVUeXBlJiYoImNsaWNrIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbaV09ci5uZWVkc0NvbnRleHQ/LTE8UyhpLHRoaXMpLmluZGV4KGwpOlMuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksYVtpXSYmby5wdXNoKHIpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIGw9dGhpcyx1PHQubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczp0LnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZBZSh0LCJjbGljayIsQ2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZBZSh0LCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldDtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJlkuZ2V0KHQsImNsaWNrIil8fEEodCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5yZXN1bHQmJmUub3JpZ2luYWxFdmVudCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbil9LFMuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1lLmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09ZS5yZXR1cm5WYWx1ZT9DZTpFZSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZTLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkVlLGlzUHJvcGFnYXRpb25TdG9wcGVkOkVlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkVlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUNlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUNlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZiZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmd2UudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LFMuZXZlbnQuYWRkUHJvcCksUy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe1MuZXZlbnQuc3BlY2lhbFtlXT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyxlLFNlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBBZSh0aGlzLGUpLCEwfSxkZWxlZ2F0ZVR5cGU6dH19KSxTLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKGUsaSl7Uy5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6aSxiaW5kVHlwZTppLGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgdCxuPWUucmVsYXRlZFRhcmdldCxyPWUuaGFuZGxlT2JqO3JldHVybiBuJiYobj09PXRoaXN8fFMuY29udGFpbnModGhpcyxuKSl8fChlLnR5cGU9ci5vcmlnVHlwZSx0PXIuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPWkpLHR9fX0pLFMuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4ga2UodGhpcyxlLHQsbixyKX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBrZSh0aGlzLGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gcj1lLmhhbmRsZU9iaixTKGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGkgaW4gZSl0aGlzLm9mZihpLHQsZVtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT10JiYiZnVuY3Rpb24iIT10eXBlb2YgdHx8KG49dCx0PXZvaWQgMCksITE9PT1uJiYobj1FZSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5yZW1vdmUodGhpcyxlLG4sdCl9KX19KTt2YXIgTmU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksRGU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksamU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIHFlKGUsdCl7cmV0dXJuIEEoZSwidGFibGUiKSYmQSgxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIikmJlMoZSkuY2hpbGRyZW4oInRib2R5IilbMF18fGV9ZnVuY3Rpb24gTGUoZSl7cmV0dXJuIGUudHlwZT0obnVsbCE9PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIitlLnR5cGUsZX1mdW5jdGlvbiBIZShlKXtyZXR1cm4idHJ1ZS8iPT09KGUudHlwZXx8IiIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGV9ZnVuY3Rpb24gT2UoZSx0KXt2YXIgbixyLGksbyxhLHM7aWYoMT09PXQubm9kZVR5cGUpe2lmKFkuaGFzRGF0YShlKSYmKHM9WS5nZXQoZSkuZXZlbnRzKSlmb3IoaSBpbiBZLnJlbW92ZSh0LCJoYW5kbGUgZXZlbnRzIikscylmb3Iobj0wLHI9c1tpXS5sZW5ndGg7bjxyO24rKylTLmV2ZW50LmFkZCh0LGksc1tpXVtuXSk7US5oYXNEYXRhKGUpJiYobz1RLmFjY2VzcyhlKSxhPVMuZXh0ZW5kKHt9LG8pLFEuc2V0KHQsYSkpfX1mdW5jdGlvbiBQZShuLHIsaSxvKXtyPWcocik7dmFyIGUsdCxhLHMsdSxsLGM9MCxmPW4ubGVuZ3RoLHA9Zi0xLGQ9clswXSxoPW0oZCk7aWYoaHx8MTxmJiYic3RyaW5nIj09dHlwZW9mIGQmJiF5LmNoZWNrQ2xvbmUmJkRlLnRlc3QoZCkpcmV0dXJuIG4uZWFjaChmdW5jdGlvbihlKXt2YXIgdD1uLmVxKGUpO2gmJihyWzBdPWQuY2FsbCh0aGlzLGUsdC5odG1sKCkpKSxQZSh0LHIsaSxvKX0pO2lmKGYmJih0PShlPXhlKHIsblswXS5vd25lckRvY3VtZW50LCExLG4sbykpLmZpcnN0Q2hpbGQsMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgmJihlPXQpLHR8fG8pKXtmb3Iocz0oYT1TLm1hcCh2ZShlLCJzY3JpcHQiKSxMZSkpLmxlbmd0aDtjPGY7YysrKXU9ZSxjIT09cCYmKHU9Uy5jbG9uZSh1LCEwLCEwKSxzJiZTLm1lcmdlKGEsdmUodSwic2NyaXB0IikpKSxpLmNhbGwobltjXSx1LGMpO2lmKHMpZm9yKGw9YVthLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LFMubWFwKGEsSGUpLGM9MDtjPHM7YysrKXU9YVtjXSxoZS50ZXN0KHUudHlwZXx8IiIpJiYhWS5hY2Nlc3ModSwiZ2xvYmFsRXZhbCIpJiZTLmNvbnRhaW5zKGwsdSkmJih1LnNyYyYmIm1vZHVsZSIhPT0odS50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9TLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmUy5fZXZhbFVybCh1LnNyYyx7bm9uY2U6dS5ub25jZXx8dS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9LGwpOmIodS50ZXh0Q29udGVudC5yZXBsYWNlKGplLCIiKSx1LGwpKX1yZXR1cm4gbn1mdW5jdGlvbiBSZShlLHQsbil7Zm9yKHZhciByLGk9dD9TLmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8Uy5jbGVhbkRhdGEodmUocikpLHIucGFyZW50Tm9kZSYmKG4mJmllKHIpJiZ5ZSh2ZShyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX1TLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGM9ZS5jbG9uZU5vZGUoITApLGY9aWUoZSk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxTLmlzWE1MRG9jKGUpKSlmb3IoYT12ZShjKSxyPTAsaT0obz12ZShlKSkubGVuZ3RoO3I8aTtyKyspcz1vW3JdLHU9YVtyXSx2b2lkIDAsImlucHV0Ij09PShsPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJnBlLnRlc3Qocy50eXBlKT91LmNoZWNrZWQ9cy5jaGVja2VkOiJpbnB1dCIhPT1sJiYidGV4dGFyZWEiIT09bHx8KHUuZGVmYXVsdFZhbHVlPXMuZGVmYXVsdFZhbHVlKTtpZih0KWlmKG4pZm9yKG89b3x8dmUoZSksYT1hfHx2ZShjKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKU9lKG9bcl0sYVtyXSk7ZWxzZSBPZShlLGMpO3JldHVybiAwPChhPXZlKGMsInNjcmlwdCIpKS5sZW5ndGgmJnllKGEsIWYmJnZlKGUsInNjcmlwdCIpKSxjfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scixpPVMuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKFYobikpe2lmKHQ9bltZLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP1MuZXZlbnQucmVtb3ZlKG4scik6Uy5yZW1vdmVFdmVudChuLHIsdC5oYW5kbGUpO25bWS5leHBhbmRvXT12b2lkIDB9bltRLmV4cGFuZG9dJiYobltRLmV4cGFuZG9dPXZvaWQgMCl9fX0pLFMuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gUmUodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP1MudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD1lKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8cWUodGhpcyxlKS5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1xZSh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9MDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5cGUmJihTLmNsZWFuRGF0YSh2ZShlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbCE9ZSYmZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlKXt2YXIgdD10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1lJiYxPT09dC5ub2RlVHlwZSlyZXR1cm4gdC5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYhTmUudGVzdChlKSYmIWdlWyhkZS5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1TLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zvcig7bjxyO24rKykxPT09KHQ9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEodmUodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChlKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO1MuaW5BcnJheSh0aGlzLG4pPDAmJihTLmNsZWFuRGF0YSh2ZSh0aGlzKSksdCYmdC5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LG4pfX0pLFMuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsYSl7Uy5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1bXSxyPVMoZSksaT1yLmxlbmd0aC0xLG89MDtvPD1pO28rKyl0PW89PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksUyhyW29dKVthXSh0KSx1LmFwcGx5KG4sdC5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4pfX0pO3ZhciBNZT1uZXcgUmVnRXhwKCJeKCIrZWUrIikoPyFweClbYS16JV0rJCIsImkiKSxJZT1mdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIHQmJnQub3BlbmVyfHwodD1DKSx0LmdldENvbXB1dGVkU3R5bGUoZSl9LFdlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKGkgaW4gdClvW2ldPWUuc3R5bGVbaV0sZS5zdHlsZVtpXT10W2ldO2ZvcihpIGluIHI9bi5jYWxsKGUpLHQpZS5zdHlsZVtpXT1vW2ldO3JldHVybiByfSxGZT1uZXcgUmVnRXhwKG5lLmpvaW4oInwiKSwiaSIpO2Z1bmN0aW9uIEJlKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuc3R5bGU7cmV0dXJuKG49bnx8SWUoZSkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0pfHxpZShlKXx8KGE9Uy5zdHlsZShlLHQpKSwheS5waXhlbEJveFN0eWxlcygpJiZNZS50ZXN0KGEpJiZGZS50ZXN0KHQpJiYocj1zLndpZHRoLGk9cy5taW5XaWR0aCxvPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9aSxzLm1heFdpZHRoPW8pKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiAkZShlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighZSgpKXJldHVybih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2lmKGwpe3Uuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsbC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixyZS5hcHBlbmRDaGlsZCh1KS5hcHBlbmRDaGlsZChsKTt2YXIgZT1DLmdldENvbXB1dGVkU3R5bGUobCk7bj0iMSUiIT09ZS50b3Ascz0xMj09PXQoZS5tYXJnaW5MZWZ0KSxsLnN0eWxlLnJpZ2h0PSI2MCUiLG89MzY9PT10KGUucmlnaHQpLHI9MzY9PT10KGUud2lkdGgpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09dChsLm9mZnNldFdpZHRoLzMpLHJlLnJlbW92ZUNoaWxkKHUpLGw9bnVsbH19ZnVuY3Rpb24gdChlKXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGUpKX12YXIgbixyLGksbyxhLHMsdT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGw9RS5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGwuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09bC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxTLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG99LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksc30sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtyZXR1cm4gbnVsbD09YSYmKGU9RS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLHQ9RS5jcmVhdGVFbGVtZW50KCJ0ciIpLG49RS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHgiLHQuc3R5bGUuaGVpZ2h0PSIxcHgiLG4uc3R5bGUuaGVpZ2h0PSI5cHgiLHJlLmFwcGVuZENoaWxkKGUpLmFwcGVuZENoaWxkKHQpLmFwcGVuZENoaWxkKG4pLHI9Qy5nZXRDb21wdXRlZFN0eWxlKHQpLGE9MzxwYXJzZUludChyLmhlaWdodCkscmUucmVtb3ZlQ2hpbGQoZSkpLGF9fSkpfSgpO3ZhciBfZT1bIldlYmtpdCIsIk1veiIsIm1zIl0semU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxVZT17fTtmdW5jdGlvbiBYZShlKXt2YXIgdD1TLmNzc1Byb3BzW2VdfHxVZVtlXTtyZXR1cm4gdHx8KGUgaW4gemU/ZTpVZVtlXT1mdW5jdGlvbihlKXt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPV9lLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9X2Vbbl0rdClpbiB6ZSlyZXR1cm4gZX0oZSl8fGUpfXZhciBWZT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sR2U9L14tLS8sWWU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFFlPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiBKZShlLHQsbil7dmFyIHI9dGUuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6dH1mdW5jdGlvbiBLZShlLHQsbixyLGksbyl7dmFyIGE9IndpZHRoIj09PXQ/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1TLmNzcyhlLG4rbmVbYV0sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJih1LT1TLmNzcyhlLCJwYWRkaW5nIituZVthXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYodS09Uy5jc3MoZSwiYm9yZGVyIituZVthXSsiV2lkdGgiLCEwLGkpKSk6KHUrPVMuY3NzKGUsInBhZGRpbmciK25lW2FdLCEwLGkpLCJwYWRkaW5nIiE9PW4/dSs9Uy5jc3MoZSwiYm9yZGVyIituZVthXSsiV2lkdGgiLCEwLGkpOnMrPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKSk7cmV0dXJuIXImJjA8PW8mJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1vLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIFplKGUsdCxuKXt2YXIgcj1JZShlKSxpPSgheS5ib3hTaXppbmdSZWxpYWJsZSgpfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxvPWksYT1CZShlLHQscikscz0ib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtpZihNZS50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIXkuYm94U2l6aW5nUmVsaWFibGUoKSYmaXx8IXkucmVsaWFibGVUckRpbWVuc2lvbnMoKSYmQShlLCJ0ciIpfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1TLmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJmUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihpPSJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsciksKG89cyBpbiBlKSYmKGE9ZVtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK0tlKGUsdCxufHwoaT8iYm9yZGVyIjoiY29udGVudCIpLG8scixhKSsicHgifWZ1bmN0aW9uIGV0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBldC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfVMuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49QmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLGEscz1YKHQpLHU9R2UudGVzdCh0KSxsPWUuc3R5bGU7aWYodXx8KHQ9WGUocykpLGE9Uy5jc3NIb29rc1t0XXx8Uy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTsic3RyaW5nIj09PShvPXR5cGVvZiBuKSYmKGk9dGUuZXhlYyhuKSkmJmlbMV0mJihuPXNlKGUsdCxpKSxvPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1vfHx1fHwobis9aSYmaVszXXx8KFMuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW3RdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9WCh0KTtyZXR1cm4gR2UudGVzdCh0KXx8KHQ9WGUocykpLChhPVMuY3NzSG9va3NbdF18fFMuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihpPWEuZ2V0KGUsITAsbikpLHZvaWQgMD09PWkmJihpPUJlKGUsdCxyKSksIm5vcm1hbCI9PT1pJiZ0IGluIFFlJiYoaT1RZVt0XSksIiI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksUy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHUpe1MuY3NzSG9va3NbdV09e2dldDpmdW5jdGlvbihlLHQsbil7aWYodClyZXR1cm4hVmUudGVzdChTLmNzcyhlLCJkaXNwbGF5IikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP1plKGUsdSxuKTpXZShlLFllLGZ1bmN0aW9uKCl7cmV0dXJuIFplKGUsdSxuKX0pfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9SWUoZSksbz0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLGkpLHM9bj9LZShlLHUsbixhLGkpOjA7cmV0dXJuIGEmJm8mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit1WzBdLnRvVXBwZXJDYXNlKCkrdS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW3VdKS1LZShlLHUsImJvcmRlciIsITEsaSktLjUpKSxzJiYocj10ZS5leGVjKHQpKSYmInB4IiE9PShyWzNdfHwicHgiKSYmKGUuc3R5bGVbdV09dCx0PVMuY3NzKGUsdSkpLEplKDAsdCxzKX19fSksUy5jc3NIb29rcy5tYXJnaW5MZWZ0PSRlKHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChCZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtV2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLFMuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGksbyl7Uy5jc3NIb29rc1tpK29dPXtleHBhbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj17fSxyPSJzdHJpbmciPT10eXBlb2YgZT9lLnNwbGl0KCIgIik6W2VdO3Q8NDt0KyspbltpK25lW3RdK29dPXJbdF18fHJbdC0yXXx8clswXTtyZXR1cm4gbn19LCJtYXJnaW4iIT09aSYmKFMuY3NzSG9va3NbaStvXS5zZXQ9SmUpfSksUy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9SWUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09Uy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP1Muc3R5bGUoZSx0LG4pOlMuY3NzKGUsdCl9LGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfX0pLCgoUy5Ud2Vlbj1ldCkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpldCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHxTLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KFMuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT1ldC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6ZXQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZXQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PVMuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpldC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSkuaW5pdC5wcm90b3R5cGU9ZXQucHJvdG90eXBlLChldC5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9kZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXToodD1TLmNzcyhlLmVsZW0sZS5wcm9wLCIiKSkmJiJhdXRvIiE9PXQ/dDowfSxzZXQ6ZnVuY3Rpb24oZSl7Uy5meC5zdGVwW2UucHJvcF0/Uy5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8IVMuY3NzSG9va3NbZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW1hlKGUucHJvcCldP2UuZWxlbVtlLnByb3BdPWUubm93OlMuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpfX19KS5zY3JvbGxUb3A9ZXQucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0sUy5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxTLmZ4PWV0LnByb3RvdHlwZS5pbml0LFMuZnguc3RlcD17fTt2YXIgdHQsbnQscnQsaXQsb3Q9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGF0PS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gc3QoKXtudCYmKCExPT09RS5oaWRkZW4mJkMucmVxdWVzdEFuaW1hdGlvbkZyYW1lP0MucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0KTpDLnNldFRpbWVvdXQoc3QsUy5meC5pbnRlcnZhbCksUy5meC50aWNrKCkpfWZ1bmN0aW9uIHV0KCl7cmV0dXJuIEMuc2V0VGltZW91dChmdW5jdGlvbigpe3R0PXZvaWQgMH0pLHR0PURhdGUubm93KCl9ZnVuY3Rpb24gbHQoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowO3I8NDtyKz0yLXQpaVsibWFyZ2luIisobj1uZVtyXSldPWlbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihpLm9wYWNpdHk9aS53aWR0aD1lKSxpfWZ1bmN0aW9uIGN0KGUsdCxuKXtmb3IodmFyIHIsaT0oZnQudHdlZW5lcnNbdF18fFtdKS5jb25jYXQoZnQudHdlZW5lcnNbIioiXSksbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZnQobyxlLHQpe3ZhciBuLGEscj0wLGk9ZnQucHJlZmlsdGVycy5sZW5ndGgscz1TLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihhKXJldHVybiExO2Zvcih2YXIgZT10dHx8dXQoKSx0PU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi1lKSxuPTEtKHQvbC5kdXJhdGlvbnx8MCkscj0wLGk9bC50d2VlbnMubGVuZ3RoO3I8aTtyKyspbC50d2VlbnNbcl0ucnVuKG4pO3JldHVybiBzLm5vdGlmeVdpdGgobyxbbCxuLHRdKSxuPDEmJmk/dDooaXx8cy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTpvLHByb3BzOlMuZXh0ZW5kKHt9LGUpLG9wdHM6Uy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOlMuZWFzaW5nLl9kZWZhdWx0fSx0KSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6dCxzdGFydFRpbWU6dHR8fHV0KCksZHVyYXRpb246dC5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSx0KXt2YXIgbj1TLlR3ZWVuKG8sbC5vcHRzLGUsdCxsLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gobiksbn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgdD0wLG49ZT9sLnR3ZWVucy5sZW5ndGg6MDtpZihhKXJldHVybiB0aGlzO2ZvcihhPSEwO3Q8bjt0KyspbC50d2VlbnNbdF0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2wsZV0pKTpzLnJlamVjdFdpdGgobyxbbCxlXSksdGhpc319KSxjPWwucHJvcHM7Zm9yKCFmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE7Zm9yKG4gaW4gZSlpZihpPXRbcj1YKG4pXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPVMuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gbz1hLmV4cGFuZChvKSxkZWxldGUgZVtyXSxvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpO2Vsc2UgdFtyXT1pfShjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTtyPGk7cisrKWlmKG49ZnQucHJlZmlsdGVyc1tyXS5jYWxsKGwsbyxjLGwub3B0cykpcmV0dXJuIG0obi5zdG9wKSYmKFMuX3F1ZXVlSG9va3MobC5lbGVtLGwub3B0cy5xdWV1ZSkuc3RvcD1uLnN0b3AuYmluZChuKSksbjtyZXR1cm4gUy5tYXAoYyxjdCxsKSxtKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKG8sbCksbC5wcm9ncmVzcyhsLm9wdHMucHJvZ3Jlc3MpLmRvbmUobC5vcHRzLmRvbmUsbC5vcHRzLmNvbXBsZXRlKS5mYWlsKGwub3B0cy5mYWlsKS5hbHdheXMobC5vcHRzLmFsd2F5cyksUy5meC50aW1lcihTLmV4dGVuZCh1LHtlbGVtOm8sYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsfVMuQW5pbWF0aW9uPVMuZXh0ZW5kKGZ0LHt0d2VlbmVyczp7IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KTtyZXR1cm4gc2Uobi5lbGVtLGUsdGUuZXhlYyh0KSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24oZSx0KXttKGUpPyh0PWUsZT1bIioiXSk6ZT1lLm1hdGNoKFApO2Zvcih2YXIgbixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW49ZVtyXSxmdC50d2VlbmVyc1tuXT1mdC50d2VlbmVyc1tuXXx8W10sZnQudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGMsZj0id2lkdGgiaW4gdHx8ImhlaWdodCJpbiB0LHA9dGhpcyxkPXt9LGg9ZS5zdHlsZSxnPWUubm9kZVR5cGUmJmFlKGUpLHY9WS5nZXQoZSwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPVMuX3F1ZXVlSG9va3MoZSwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sUy5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSx0KWlmKGk9dFtyXSxvdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWl8fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9ZFtyXT12JiZ2W3JdfHxTLnN0eWxlKGUscil9aWYoKHU9IVMuaXNFbXB0eU9iamVjdCh0KSl8fCFTLmlzRW1wdHlPYmplY3QoZCkpZm9yKHIgaW4gZiYmMT09PWUubm9kZVR5cGUmJihuLm92ZXJmbG93PVtoLm92ZXJmbG93LGgub3ZlcmZsb3dYLGgub3ZlcmZsb3dZXSxudWxsPT0obD12JiZ2LmRpc3BsYXkpJiYobD1ZLmdldChlLCJkaXNwbGF5IikpLCJub25lIj09PShjPVMuY3NzKGUsImRpc3BsYXkiKSkmJihsP2M9bDoobGUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPVMuY3NzKGUsImRpc3BsYXkiKSxsZShbZV0pKSksKCJpbmxpbmUiPT09Y3x8ImlubGluZS1ibG9jayI9PT1jJiZudWxsIT1sKSYmIm5vbmUiPT09Uy5jc3MoZSwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPSJub25lIj09PWM/IiI6YykpLGguZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGQpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1ZLmFjY2VzcyhlLCJmeHNob3ciLHtkaXNwbGF5Omx9KSxvJiYodi5oaWRkZW49IWcpLGcmJmxlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8bGUoW2VdKSxZLnJlbW92ZShlLCJmeHNob3ciKSxkKVMuc3R5bGUoZSxyLGRbcl0pfSkpLHU9Y3QoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P2Z0LnByZWZpbHRlcnMudW5zaGlmdChlKTpmdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksUy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP1MuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8bShlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhbSh0KSYmdH07cmV0dXJuIFMuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFMuZnguc3BlZWRzP3IuZHVyYXRpb249Uy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1TLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZTLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sUy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPVMuaXNFbXB0eU9iamVjdCh0KSxvPVMuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1mdCh0aGlzLFMuZXh0ZW5kKHt9LHQpLG8pOyhpfHxZLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGksZSxvKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG8pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGkmJihvPWUsZT1pLGk9dm9pZCAwKSxlJiZ0aGlzLnF1ZXVlKGl8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSEwLHQ9bnVsbCE9aSYmaSsicXVldWVIb29rcyIsbj1TLnRpbWVycyxyPVkuZ2V0KHRoaXMpO2lmKHQpclt0XSYmclt0XS5zdG9wJiZhKHJbdF0pO2Vsc2UgZm9yKHQgaW4gcilyW3RdJiZyW3RdLnN0b3AmJmF0LnRlc3QodCkmJmEoclt0XSk7Zm9yKHQ9bi5sZW5ndGg7dC0tOyluW3RdLmVsZW0hPT10aGlzfHxudWxsIT1pJiZuW3RdLnF1ZXVlIT09aXx8KG5bdF0uYW5pbS5zdG9wKG8pLGU9ITEsbi5zcGxpY2UodCwxKSk7IWUmJm98fFMuZGVxdWV1ZSh0aGlzLGkpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4hMSE9PWEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLHQ9WS5nZXQodGhpcyksbj10W2ErInF1ZXVlIl0scj10W2ErInF1ZXVlSG9va3MiXSxpPVMudGltZXJzLG89bj9uLmxlbmd0aDowO2Zvcih0LmZpbmlzaD0hMCxTLnF1ZXVlKHRoaXMsYSxbXSksciYmci5zdG9wJiZyLnN0b3AuY2FsbCh0aGlzLCEwKSxlPWkubGVuZ3RoO2UtLTspaVtlXS5lbGVtPT09dGhpcyYmaVtlXS5xdWV1ZT09PWEmJihpW2VdLmFuaW0uc3RvcCghMCksaS5zcGxpY2UoZSwxKSk7Zm9yKGU9MDtlPG87ZSsrKW5bZV0mJm5bZV0uZmluaXNoJiZuW2VdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSB0LmZpbmlzaH0pfX0pLFMuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSxyKXt2YXIgaT1TLmZuW3JdO1MuZm5bcl09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShsdChyLCEwKSxlLHQsbil9fSksUy5lYWNoKHtzbGlkZURvd246bHQoInNob3ciKSxzbGlkZVVwOmx0KCJoaWRlIiksc2xpZGVUb2dnbGU6bHQoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSxyKXtTLmZuW2VdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5hbmltYXRlKHIsZSx0LG4pfX0pLFMudGltZXJzPVtdLFMuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLHQ9MCxuPVMudGltZXJzO2Zvcih0dD1EYXRlLm5vdygpO3Q8bi5sZW5ndGg7dCsrKShlPW5bdF0pKCl8fG5bdF0hPT1lfHxuLnNwbGljZSh0LS0sMSk7bi5sZW5ndGh8fFMuZnguc3RvcCgpLHR0PXZvaWQgMH0sUy5meC50aW1lcj1mdW5jdGlvbihlKXtTLnRpbWVycy5wdXNoKGUpLFMuZnguc3RhcnQoKX0sUy5meC5pbnRlcnZhbD0xMyxTLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7bnR8fChudD0hMCxzdCgpKX0sUy5meC5zdG9wPWZ1bmN0aW9uKCl7bnQ9bnVsbH0sUy5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sUy5mbi5kZWxheT1mdW5jdGlvbihyLGUpe3JldHVybiByPVMuZngmJlMuZnguc3BlZWRzW3JdfHxyLGU9ZXx8ImZ4Iix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSx0KXt2YXIgbj1DLnNldFRpbWVvdXQoZSxyKTt0LnN0b3A9ZnVuY3Rpb24oKXtDLmNsZWFyVGltZW91dChuKX19KX0scnQ9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGl0PUUuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSkscnQudHlwZT0iY2hlY2tib3giLHkuY2hlY2tPbj0iIiE9PXJ0LnZhbHVlLHkub3B0U2VsZWN0ZWQ9aXQuc2VsZWN0ZWQsKHJ0PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLHJ0LnR5cGU9InJhZGlvIix5LnJhZGlvVmFsdWU9InQiPT09cnQudmFsdWU7dmFyIHB0LGR0PVMuZXhwci5hdHRySGFuZGxlO1MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxTLmF0dHIsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksUy5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBlLmdldEF0dHJpYnV0ZT9TLnByb3AoZSx0LG4pOigxPT09byYmUy5pc1hNTERvYyhlKXx8KGk9Uy5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KFMuZXhwci5tYXRjaC5ib29sLnRlc3QodCk/cHQ6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIFMucmVtb3ZlQXR0cihlLHQpOmkmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOihlLnNldEF0dHJpYnV0ZSh0LG4rIiIpLG4pOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6bnVsbD09KHI9Uy5maW5kLmF0dHIoZSx0KSk/dm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCF5LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZBKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dCYmdC5tYXRjaChQKTtpZihpJiYxPT09ZS5ub2RlVHlwZSl3aGlsZShuPWlbcisrXSllLnJlbW92ZUF0dHJpYnV0ZShuKX19KSxwdD17c2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMT09PXQ/Uy5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0sUy5lYWNoKFMuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIGE9ZHRbdF18fFMuZmluZC5hdHRyO2R0W3RdPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89dC50b0xvd2VyQ2FzZSgpO3JldHVybiBufHwoaT1kdFtvXSxkdFtvXT1yLHI9bnVsbCE9YShlLHQsbik/bzpudWxsLGR0W29dPWkpLHJ9fSk7dmFyIGh0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksZ3Q9L14oPzphfGFyZWEpJC9pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKFApfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIHl0KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIG10KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlJiZlLm1hdGNoKFApfHxbXX1TLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsUy5wcm9wLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tTLnByb3BGaXhbZV18fGVdfSl9fSksUy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZTLmlzWE1MRG9jKGUpfHwodD1TLnByb3BGaXhbdF18fHQsaT1TLnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpodC50ZXN0KGUubm9kZU5hbWUpfHxndC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSx5Lm9wdFNlbGVjdGVkfHwoUy5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLFMuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7Uy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLFMuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSx5dCh0aGlzKSkpfSk7aWYoKGU9bXQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXl0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLHl0KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPW10KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT15dChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pd2hpbGUoLTE8ci5pbmRleE9mKCIgIitvKyIgIikpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oaSx0KXt2YXIgbz10eXBlb2YgaSxhPSJzdHJpbmciPT09b3x8QXJyYXkuaXNBcnJheShpKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZhP3Q/dGhpcy5hZGRDbGFzcyhpKTp0aGlzLnJlbW92ZUNsYXNzKGkpOm0oaSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykudG9nZ2xlQ2xhc3MoaS5jYWxsKHRoaXMsZSx5dCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLHQsbixyO2lmKGEpe3Q9MCxuPVModGhpcykscj1tdChpKTt3aGlsZShlPXJbdCsrXSluLmhhc0NsYXNzKGUpP24ucmVtb3ZlQ2xhc3MoZSk6bi5hZGRDbGFzcyhlKX1lbHNlIHZvaWQgMCE9PWkmJiJib29sZWFuIiE9PW98fCgoZT15dCh0aGlzKSkmJlkuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09aT8iIjpZLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJi0xPCgiICIrdnQoeXQobikpKyIgIikuaW5kZXhPZih0KSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgeHQ9L1xyL2c7Uy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihuKXt2YXIgcixlLGksdD10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW0obiksdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0OzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KHQ9aT9uLmNhbGwodGhpcyxlLFModGhpcykudmFsKCkpOm4pP3Q9IiI6Im51bWJlciI9PXR5cGVvZiB0P3QrPSIiOkFycmF5LmlzQXJyYXkodCkmJih0PVMubWFwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwocj1TLnZhbEhvb2tzW3RoaXMudHlwZV18fFMudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gciYmdm9pZCAwIT09ci5zZXQodGhpcyx0LCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT10KSl9KSk6dD8ocj1TLnZhbEhvb2tzW3QudHlwZV18fFMudmFsSG9va3NbdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gciYmdm9pZCAwIT09KGU9ci5nZXQodCwidmFsdWUiKSk/ZToic3RyaW5nIj09dHlwZW9mKGU9dC52YWx1ZSk/ZS5yZXBsYWNlKHh0LCIiKTpudWxsPT1lPyIiOmU6dm9pZCAwfX0pLFMuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90OnZ0KFMudGV4dChlKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT1lLm9wdGlvbnMsbz1lLnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP28rMTppLmxlbmd0aDtmb3Iocj1vPDA/dTphP286MDtyPHU7cisrKWlmKCgobj1pW3JdKS5zZWxlY3RlZHx8cj09PW8pJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFBKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKHQ9UyhuKS52YWwoKSxhKXJldHVybiB0O3MucHVzaCh0KX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUub3B0aW9ucyxvPVMubWFrZUFycmF5KHQpLGE9aS5sZW5ndGg7d2hpbGUoYS0tKSgocj1pW2FdKS5zZWxlY3RlZD0tMTxTLmluQXJyYXkoUy52YWxIb29rcy5vcHRpb24uZ2V0KHIpLG8pKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19fSksUy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Uy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPS0xPFMuaW5BcnJheShTKGUpLnZhbCgpLHQpfX0seS5jaGVja09ufHwoUy52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pLHkuZm9jdXNpbj0ib25mb2N1c2luImluIEM7dmFyIGJ0PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyx3dD1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfTtTLmV4dGVuZChTLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGYscD1bbnx8RV0sZD12LmNhbGwoZSwidHlwZSIpP2UudHlwZTplLGg9di5jYWxsKGUsIm5hbWVzcGFjZSIpP2UubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYobz1mPWE9bj1ufHxFLDMhPT1uLm5vZGVUeXBlJiY4IT09bi5ub2RlVHlwZSYmIWJ0LnRlc3QoZCtTLmV2ZW50LnRyaWdnZXJlZCkmJigtMTxkLmluZGV4T2YoIi4iKSYmKGQ9KGg9ZC5zcGxpdCgiLiIpKS5zaGlmdCgpLGguc29ydCgpKSx1PWQuaW5kZXhPZigiOiIpPDAmJiJvbiIrZCwoZT1lW1MuZXhwYW5kb10/ZTpuZXcgUy5FdmVudChkLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLmlzVHJpZ2dlcj1yPzI6MyxlLm5hbWVzcGFjZT1oLmpvaW4oIi4iKSxlLnJuYW1lc3BhY2U9ZS5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGUucmVzdWx0PXZvaWQgMCxlLnRhcmdldHx8KGUudGFyZ2V0PW4pLHQ9bnVsbD09dD9bZV06Uy5tYWtlQXJyYXkodCxbZV0pLGM9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxyfHwhYy50cmlnZ2VyfHwhMSE9PWMudHJpZ2dlci5hcHBseShuLHQpKSl7aWYoIXImJiFjLm5vQnViYmxlJiYheChuKSl7Zm9yKHM9Yy5kZWxlZ2F0ZVR5cGV8fGQsYnQudGVzdChzK2QpfHwobz1vLnBhcmVudE5vZGUpO287bz1vLnBhcmVudE5vZGUpcC5wdXNoKG8pLGE9bzthPT09KG4ub3duZXJEb2N1bWVudHx8RSkmJnAucHVzaChhLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvd3x8Qyl9aT0wO3doaWxlKChvPXBbaSsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpZj1vLGUudHlwZT0xPGk/czpjLmJpbmRUeXBlfHxkLChsPShZLmdldChvLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbZS50eXBlXSYmWS5nZXQobywiaGFuZGxlIikpJiZsLmFwcGx5KG8sdCksKGw9dSYmb1t1XSkmJmwuYXBwbHkmJlYobykmJihlLnJlc3VsdD1sLmFwcGx5KG8sdCksITE9PT1lLnJlc3VsdCYmZS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gZS50eXBlPWQscnx8ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Yy5fZGVmYXVsdCYmITEhPT1jLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksdCl8fCFWKG4pfHx1JiZtKG5bZF0pJiYheChuKSYmKChhPW5bdV0pJiYoblt1XT1udWxsKSxTLmV2ZW50LnRyaWdnZXJlZD1kLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5hZGRFdmVudExpc3RlbmVyKGQsd3QpLG5bZF0oKSxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLHd0KSxTLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsYSYmKG5bdV09YSkpLGUucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVMuZXh0ZW5kKG5ldyBTLkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO1MuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksUy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gUy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSx5LmZvY3VzaW58fFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24obixyKXt2YXIgaT1mdW5jdGlvbihlKXtTLmV2ZW50LnNpbXVsYXRlKHIsZS50YXJnZXQsUy5ldmVudC5maXgoZSkpfTtTLmV2ZW50LnNwZWNpYWxbcl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9WS5hY2Nlc3MoZSxyKTt0fHxlLmFkZEV2ZW50TGlzdGVuZXIobixpLCEwKSxZLmFjY2VzcyhlLHIsKHR8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PVkuYWNjZXNzKGUsciktMTt0P1kuYWNjZXNzKGUscix0KTooZS5yZW1vdmVFdmVudExpc3RlbmVyKG4saSwhMCksWS5yZW1vdmUoZSxyKSl9fX0pO3ZhciBUdD1DLmxvY2F0aW9uLEN0PXtndWlkOkRhdGUubm93KCl9LEV0PS9cPy87Uy5wYXJzZVhNTD1mdW5jdGlvbihlKXt2YXIgdDtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3RyeXt0PShuZXcgQy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe3Q9dm9pZCAwfXJldHVybiB0JiYhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fFMuZXJyb3IoIkludmFsaWQgWE1MOiAiK2UpLHR9O3ZhciBTdD0vXFtcXSQvLGt0PS9ccj9cbi9nLEF0PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxOdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gRHQobixlLHIsaSl7dmFyIHQ7aWYoQXJyYXkuaXNBcnJheShlKSlTLmVhY2goZSxmdW5jdGlvbihlLHQpe3J8fFN0LnRlc3Qobik/aShuLHQpOkR0KG4rIlsiKygib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPXQ/ZToiIikrIl0iLHQscixpKX0pO2Vsc2UgaWYocnx8Im9iamVjdCIhPT13KGUpKWkobixlKTtlbHNlIGZvcih0IGluIGUpRHQobisiWyIrdCsiXSIsZVt0XSxyLGkpfVMucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1tKHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PWUpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFTLmlzUGxhaW5PYmplY3QoZSkpUy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlEdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LFMuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPVMucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP1MubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIVModGhpcykuaXMoIjpkaXNhYmxlZCIpJiZOdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhQXQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49Uyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/Uy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKGt0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShrdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBqdD0vJTIwL2cscXQ9LyMuKiQvLEx0PS8oWz8mXSlfPVteJl0qLyxIdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLE90PS9eKD86R0VUfEhFQUQpJC8sUHQ9L15cL1wvLyxSdD17fSxNdD17fSxJdD0iKi8iLmNvbmNhdCgiKiIpLFd0PUUuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIEZ0KG8pe3JldHVybiBmdW5jdGlvbihlLHQpeyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSIqIik7dmFyIG4scj0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKFApfHxbXTtpZihtKHQpKXdoaWxlKG49aVtyKytdKSIrIj09PW5bMF0/KG49bi5zbGljZSgxKXx8IioiLChvW25dPW9bbl18fFtdKS51bnNoaWZ0KHQpKToob1tuXT1vW25dfHxbXSkucHVzaCh0KX19ZnVuY3Rpb24gQnQodCxpLG8sYSl7dmFyIHM9e30sdT10PT09TXQ7ZnVuY3Rpb24gbChlKXt2YXIgcjtyZXR1cm4gc1tlXT0hMCxTLmVhY2godFtlXXx8W10sZnVuY3Rpb24oZSx0KXt2YXIgbj10KGksbyxhKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIG58fHV8fHNbbl0/dT8hKHI9bik6dm9pZCAwOihpLmRhdGFUeXBlcy51bnNoaWZ0KG4pLGwobiksITEpfSkscn1yZXR1cm4gbChpLmRhdGFUeXBlc1swXSl8fCFzWyIqIl0mJmwoIioiKX1mdW5jdGlvbiAkdChlLHQpe3ZhciBuLHIsaT1TLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gdCl2b2lkIDAhPT10W25dJiYoKGlbbl0/ZTpyfHwocj17fSkpW25dPXRbbl0pO3JldHVybiByJiZTLmV4dGVuZCghMCxlLHIpLGV9V3QuaHJlZj1UdC5ocmVmLFMuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpUdC5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KFR0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkl0LHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpTLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8kdCgkdChlLFMuYWpheFNldHRpbmdzKSx0KTokdChTLmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpGdChSdCksYWpheFRyYW5zcG9ydDpGdChNdCksYWpheDpmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgYyxmLHAsbixkLHIsaCxnLGksbyx2PVMuYWpheFNldHVwKHt9LHQpLHk9di5jb250ZXh0fHx2LG09di5jb250ZXh0JiYoeS5ub2RlVHlwZXx8eS5qcXVlcnkpP1MoeSk6Uy5ldmVudCx4PVMuRGVmZXJyZWQoKSxiPVMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHc9di5zdGF0dXNDb2RlfHx7fSxhPXt9LHM9e30sdT0iY2FuY2VsZWQiLFQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihoKXtpZighbil7bj17fTt3aGlsZSh0PUh0LmV4ZWMocCkpblt0WzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oblt0WzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdCh0WzJdKX10PW5bZS50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PXQ/bnVsbDp0LmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBoP3A6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1oJiYoZT1zW2UudG9Mb3dlckNhc2UoKV09c1tlLnRvTG93ZXJDYXNlKCldfHxlLGFbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09aCYmKHYubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGgpVC5hbHdheXMoZVtULnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl3W3RdPVt3W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHx1O3JldHVybiBjJiZjLmFib3J0KHQpLGwoMCx0KSx0aGlzfX07aWYoeC5wcm9taXNlKFQpLHYudXJsPSgoZXx8di51cmx8fFR0LmhyZWYpKyIiKS5yZXBsYWNlKFB0LFR0LnByb3RvY29sKyIvLyIpLHYudHlwZT10Lm1ldGhvZHx8dC50eXBlfHx2Lm1ldGhvZHx8di50eXBlLHYuZGF0YVR5cGVzPSh2LmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goUCl8fFsiIl0sbnVsbD09di5jcm9zc0RvbWFpbil7cj1FLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7ci5ocmVmPXYudXJsLHIuaHJlZj1yLmhyZWYsdi5jcm9zc0RvbWFpbj1XdC5wcm90b2NvbCsiLy8iK1d0Lmhvc3QhPXIucHJvdG9jb2wrIi8vIityLmhvc3R9Y2F0Y2goZSl7di5jcm9zc0RvbWFpbj0hMH19aWYodi5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIHYuZGF0YSYmKHYuZGF0YT1TLnBhcmFtKHYuZGF0YSx2LnRyYWRpdGlvbmFsKSksQnQoUnQsdix0LFQpLGgpcmV0dXJuIFQ7Zm9yKGkgaW4oZz1TLmV2ZW50JiZ2Lmdsb2JhbCkmJjA9PVMuYWN0aXZlKysmJlMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksdi50eXBlPXYudHlwZS50b1VwcGVyQ2FzZSgpLHYuaGFzQ29udGVudD0hT3QudGVzdCh2LnR5cGUpLGY9di51cmwucmVwbGFjZShxdCwiIiksdi5oYXNDb250ZW50P3YuZGF0YSYmdi5wcm9jZXNzRGF0YSYmMD09PSh2LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJih2LmRhdGE9di5kYXRhLnJlcGxhY2UoanQsIisiKSk6KG89di51cmwuc2xpY2UoZi5sZW5ndGgpLHYuZGF0YSYmKHYucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2Ygdi5kYXRhKSYmKGYrPShFdC50ZXN0KGYpPyImIjoiPyIpK3YuZGF0YSxkZWxldGUgdi5kYXRhKSwhMT09PXYuY2FjaGUmJihmPWYucmVwbGFjZShMdCwiJDEiKSxvPShFdC50ZXN0KGYpPyImIjoiPyIpKyJfPSIrQ3QuZ3VpZCsrK28pLHYudXJsPWYrbyksdi5pZk1vZGlmaWVkJiYoUy5sYXN0TW9kaWZpZWRbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLFMubGFzdE1vZGlmaWVkW2ZdKSxTLmV0YWdbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsUy5ldGFnW2ZdKSksKHYuZGF0YSYmdi5oYXNDb250ZW50JiYhMSE9PXYuY29udGVudFR5cGV8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsdi5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHYuZGF0YVR5cGVzWzBdJiZ2LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dP3YuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0rKCIqIiE9PXYuZGF0YVR5cGVzWzBdPyIsICIrSXQrIjsgcT0wLjAxIjoiIik6di5hY2NlcHRzWyIqIl0pLHYuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIoaSx2LmhlYWRlcnNbaV0pO2lmKHYuYmVmb3JlU2VuZCYmKCExPT09di5iZWZvcmVTZW5kLmNhbGwoeSxULHYpfHxoKSlyZXR1cm4gVC5hYm9ydCgpO2lmKHU9ImFib3J0IixiLmFkZCh2LmNvbXBsZXRlKSxULmRvbmUodi5zdWNjZXNzKSxULmZhaWwodi5lcnJvciksYz1CdChNdCx2LHQsVCkpe2lmKFQucmVhZHlTdGF0ZT0xLGcmJm0udHJpZ2dlcigiYWpheFNlbmQiLFtULHZdKSxoKXJldHVybiBUO3YuYXN5bmMmJjA8di50aW1lb3V0JiYoZD1DLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtULmFib3J0KCJ0aW1lb3V0Iil9LHYudGltZW91dCkpO3RyeXtoPSExLGMuc2VuZChhLGwpfWNhdGNoKGUpe2lmKGgpdGhyb3cgZTtsKC0xLGUpfX1lbHNlIGwoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIGwoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXQ7aHx8KGg9ITAsZCYmQy5jbGVhclRpbWVvdXQoZCksYz12b2lkIDAscD1yfHwiIixULnJlYWR5U3RhdGU9MDxlPzQ6MCxpPTIwMDw9ZSYmZTwzMDB8fDMwND09PWUsbiYmKHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfWF8fChhPWkpfW89b3x8YX1pZihvKXJldHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLG5bb119KHYsVCxuKSksIWkmJi0xPFMuaW5BcnJheSgic2NyaXB0Iix2LmRhdGFUeXBlcykmJih2LmNvbnZlcnRlcnNbInRleHQgc2NyaXB0Il09ZnVuY3Rpb24oKXt9KSxzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19KHYscyxULGkpLGk/KHYuaWZNb2RpZmllZCYmKCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihTLmxhc3RNb2RpZmllZFtmXT11KSwodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoUy5ldGFnW2ZdPXUpKSwyMDQ9PT1lfHwiSEVBRCI9PT12LnR5cGU/bD0ibm9jb250ZW50IjozMDQ9PT1lP2w9Im5vdG1vZGlmaWVkIjoobD1zLnN0YXRlLG89cy5kYXRhLGk9IShhPXMuZXJyb3IpKSk6KGE9bCwhZSYmbHx8KGw9ImVycm9yIixlPDAmJihlPTApKSksVC5zdGF0dXM9ZSxULnN0YXR1c1RleHQ9KHR8fGwpKyIiLGk/eC5yZXNvbHZlV2l0aCh5LFtvLGwsVF0pOngucmVqZWN0V2l0aCh5LFtULGwsYV0pLFQuc3RhdHVzQ29kZSh3KSx3PXZvaWQgMCxnJiZtLnRyaWdnZXIoaT8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtULHYsaT9vOmFdKSxiLmZpcmVXaXRoKHksW1QsbF0pLGcmJihtLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW1Qsdl0pLC0tUy5hY3RpdmV8fFMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBUfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUy5nZXQoZSx0LG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFMuZ2V0KGUsdm9pZCAwLHQsInNjcmlwdCIpfX0pLFMuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihlLGkpe1NbaV09ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG0odCkmJihyPXJ8fG4sbj10LHQ9dm9pZCAwKSxTLmFqYXgoUy5leHRlbmQoe3VybDplLHR5cGU6aSxkYXRhVHlwZTpyLGRhdGE6dCxzdWNjZXNzOm59LFMuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlLmhlYWRlcnMpImNvbnRlbnQtdHlwZSI9PT10LnRvTG93ZXJDYXNlKCkmJihlLmNvbnRlbnRUeXBlPWUuaGVhZGVyc1t0XXx8IiIpfSksUy5fZXZhbFVybD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFMuYWpheCh7dXJsOmUsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oZSl7Uy5nbG9iYWxFdmFsKGUsdCxuKX19KX0sUy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXNbMF0mJihtKGUpJiYoZT1lLmNhbGwodGhpc1swXSkpLHQ9UyhlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzO3doaWxlKGUuZmlyc3RFbGVtZW50Q2hpbGQpZT1lLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24obil7cmV0dXJuIG0obik/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykud3JhcElubmVyKG4uY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVModGhpcyksdD1lLmNvbnRlbnRzKCk7dC5sZW5ndGg/dC53cmFwQWxsKG4pOmUuYXBwZW5kKG4pfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIG49bSh0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykud3JhcEFsbChuP3QuY2FsbCh0aGlzLGUpOnQpfSl9LHVud3JhcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wYXJlbnQoZSkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe1ModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksUy5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiFTLmV4cHIucHNldWRvcy52aXNpYmxlKGUpfSxTLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sUy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgQy5YTUxIdHRwUmVxdWVzdH1jYXRjaChlKXt9fTt2YXIgX3Q9ezA6MjAwLDEyMjM6MjA0fSx6dD1TLmFqYXhTZXR0aW5ncy54aHIoKTt5LmNvcnM9ISF6dCYmIndpdGhDcmVkZW50aWFscyJpbiB6dCx5LmFqYXg9enQ9ISF6dCxTLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oaSl7dmFyIG8sYTtpZih5LmNvcnN8fHp0JiYhaS5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9aS54aHIoKTtpZihyLm9wZW4oaS50eXBlLGkudXJsLGkuYXN5bmMsaS51c2VybmFtZSxpLnBhc3N3b3JkKSxpLnhockZpZWxkcylmb3IobiBpbiBpLnhockZpZWxkcylyW25dPWkueGhyRmllbGRzW25dO2ZvcihuIGluIGkubWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZSYmci5vdmVycmlkZU1pbWVUeXBlKGkubWltZVR5cGUpLGkuY3Jvc3NEb21haW58fGVbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxlKXIuc2V0UmVxdWVzdEhlYWRlcihuLGVbbl0pO289ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7byYmKG89YT1yLm9ubG9hZD1yLm9uZXJyb3I9ci5vbmFib3J0PXIub250aW1lb3V0PXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PWU/ci5hYm9ydCgpOiJlcnJvciI9PT1lPyJudW1iZXIiIT10eXBlb2Ygci5zdGF0dXM/dCgwLCJlcnJvciIpOnQoci5zdGF0dXMsci5zdGF0dXNUZXh0KTp0KF90W3Iuc3RhdHVzXXx8ci5zdGF0dXMsci5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShyLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiByLnJlc3BvbnNlVGV4dD97YmluYXJ5OnIucmVzcG9uc2V9Ont0ZXh0OnIucmVzcG9uc2VUZXh0fSxyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxyLm9ubG9hZD1vKCksYT1yLm9uZXJyb3I9ci5vbnRpbWVvdXQ9bygiZXJyb3IiKSx2b2lkIDAhPT1yLm9uYWJvcnQ/ci5vbmFib3J0PWE6ci5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09ci5yZWFkeVN0YXRlJiZDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtvJiZhKCl9KX0sbz1vKCJhYm9ydCIpO3RyeXtyLnNlbmQoaS5oYXNDb250ZW50JiZpLmRhdGF8fG51bGwpfWNhdGNoKGUpe2lmKG8pdGhyb3cgZX19LGFib3J0OmZ1bmN0aW9uKCl7byYmbygpfX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLFMuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiBTLmdsb2JhbEV2YWwoZSksZX19fSksUy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUuY2FjaGUmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLFMuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihuKXt2YXIgcixpO2lmKG4uY3Jvc3NEb21haW58fG4uc2NyaXB0QXR0cnMpcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXtyPVMoIjxzY3JpcHQ+IikuYXR0cihuLnNjcmlwdEF0dHJzfHx7fSkucHJvcCh7Y2hhcnNldDpuLnNjcmlwdENoYXJzZXQsc3JjOm4udXJsfSkub24oImxvYWQgZXJyb3IiLGk9ZnVuY3Rpb24oZSl7ci5yZW1vdmUoKSxpPW51bGwsZSYmdCgiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLEUuaGVhZC5hcHBlbmRDaGlsZChyWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtpJiZpKCl9fX0pO3ZhciBVdCxYdD1bXSxWdD0vKD0pXD8oPz0mfCQpfFw/XD8vO1MuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1YdC5wb3AoKXx8Uy5leHBhbmRvKyJfIitDdC5ndWlkKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSxTLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT0hMSE9PWUuanNvbnAmJihWdC50ZXN0KGUudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmMD09PShlLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJlZ0LnRlc3QoZS5kYXRhKSYmImRhdGEiKTtpZihhfHwianNvbnAiPT09ZS5kYXRhVHlwZXNbMF0pcmV0dXJuIHI9ZS5qc29ucENhbGxiYWNrPW0oZS5qc29ucENhbGxiYWNrKT9lLmpzb25wQ2FsbGJhY2soKTplLmpzb25wQ2FsbGJhY2ssYT9lW2FdPWVbYV0ucmVwbGFjZShWdCwiJDEiK3IpOiExIT09ZS5qc29ucCYmKGUudXJsKz0oRXQudGVzdChlLnVybCk/IiYiOiI/IikrZS5qc29ucCsiPSIrciksZS5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIG98fFMuZXJyb3IocisiIHdhcyBub3QgY2FsbGVkIiksb1swXX0sZS5kYXRhVHlwZXNbMF09Impzb24iLGk9Q1tyXSxDW3JdPWZ1bmN0aW9uKCl7bz1hcmd1bWVudHN9LG4uYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09aT9TKEMpLnJlbW92ZVByb3Aocik6Q1tyXT1pLGVbcl0mJihlLmpzb25wQ2FsbGJhY2s9dC5qc29ucENhbGxiYWNrLFh0LnB1c2gocikpLG8mJm0oaSkmJmkob1swXSksbz1pPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChVdD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PVV0LmNoaWxkTm9kZXMubGVuZ3RoKSxTLnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP1tdOigiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHR8fCh5LmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KHQ9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9RS5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChyKSk6dD1FKSxvPSFuJiZbXSwoaT1OLmV4ZWMoZSkpP1t0LmNyZWF0ZUVsZW1lbnQoaVsxXSldOihpPXhlKFtlXSx0LG8pLG8mJm8ubGVuZ3RoJiZTKG8pLnJlbW92ZSgpLFMubWVyZ2UoW10saS5jaGlsZE5vZGVzKSkpO3ZhciByLGksb30sUy5mbi5sb2FkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT10aGlzLHM9ZS5pbmRleE9mKCIgIik7cmV0dXJuLTE8cyYmKHI9dnQoZS5zbGljZShzKSksZT1lLnNsaWNlKDAscykpLG0odCk/KG49dCx0PXZvaWQgMCk6dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYoaT0iUE9TVCIpLDA8YS5sZW5ndGgmJlMuYWpheCh7dXJsOmUsdHlwZTppfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTp0fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwocj9TKCI8ZGl2PiIpLmFwcGVuZChTLnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LFMuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKHQpe3JldHVybiBTLmdyZXAoUy50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LFMub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsPVMuY3NzKGUsInBvc2l0aW9uIiksYz1TKGUpLGY9e307InN0YXRpYyI9PT1sJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxzPWMub2Zmc2V0KCksbz1TLmNzcyhlLCJ0b3AiKSx1PVMuY3NzKGUsImxlZnQiKSwoImFic29sdXRlIj09PWx8fCJmaXhlZCI9PT1sKSYmLTE8KG8rdSkuaW5kZXhPZigiYXV0byIpPyhhPShyPWMucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksbSh0KSYmKHQ9dC5jYWxsKGUsbixTLmV4dGVuZCh7fSxzKSkpLG51bGwhPXQudG9wJiYoZi50b3A9dC50b3Atcy50b3ArYSksbnVsbCE9dC5sZWZ0JiYoZi5sZWZ0PXQubGVmdC1zLmxlZnQraSksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUsZik6KCJudW1iZXIiPT10eXBlb2YgZi50b3AmJihmLnRvcCs9InB4IiksIm51bWJlciI9PXR5cGVvZiBmLmxlZnQmJihmLmxlZnQrPSJweCIpLGMuY3NzKGYpKX19LFMuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtTLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09Uy5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Uy5jc3MoZSwicG9zaXRpb24iKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT1TKGUpLm9mZnNldCgpKS50b3ArPVMuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksaS5sZWZ0Kz1TLmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1pLnRvcC1TLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OnQubGVmdC1pLmxlZnQtUy5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJiJzdGF0aWMiPT09Uy5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxyZX0pfX0pLFMuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGkpe3ZhciBvPSJwYWdlWU9mZnNldCI9PT1pO1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoeChlKT9yPWU6OT09PWUubm9kZVR5cGUmJihyPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW4pcmV0dXJuIHI/cltpXTplW3RdO3I/ci5zY3JvbGxUbyhvP3IucGFnZVhPZmZzZXQ6bixvP246ci5wYWdlWU9mZnNldCk6ZVt0XT1ufSx0LGUsYXJndW1lbnRzLmxlbmd0aCl9fSksUy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7Uy5jc3NIb29rc1tuXT0kZSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiB0PUJlKGUsbiksTWUudGVzdCh0KT9TKGUpLnBvc2l0aW9uKClbbl0rInB4Ijp0fSl9KSxTLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLHMpe1MuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpzLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24ocixvKXtTLmZuW29dPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10PyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4geChlKT8wPT09by5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIithXTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09ZS5ub2RlVHlwZT8ocj1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrYV0sclsic2Nyb2xsIithXSxlLmJvZHlbIm9mZnNldCIrYV0sclsib2Zmc2V0IithXSxyWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09bj9TLmNzcyhlLHQsaSk6Uy5zdHlsZShlLHQsbixpKX0scyxuP2U6dm9pZCAwLG4pfX0pfSksUy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXtTLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksUy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfSxob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSxTLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSxuKXtTLmZuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDA8YXJndW1lbnRzLmxlbmd0aD90aGlzLm9uKG4sbnVsbCxlLHQpOnRoaXMudHJpZ2dlcihuKX19KTt2YXIgR3Q9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO1MucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLG0oZSkpcmV0dXJuIHI9cy5jYWxsKGFyZ3VtZW50cywyKSwoaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHR8fHRoaXMsci5jb25jYXQocy5jYWxsKGFyZ3VtZW50cykpKX0pLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8Uy5ndWlkKyssaX0sUy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT9TLnJlYWR5V2FpdCsrOlMucmVhZHkoITApfSxTLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxTLnBhcnNlSlNPTj1KU09OLnBhcnNlLFMubm9kZU5hbWU9QSxTLmlzRnVuY3Rpb249bSxTLmlzV2luZG93PXgsUy5jYW1lbENhc2U9WCxTLnR5cGU9dyxTLm5vdz1EYXRlLm5vdyxTLmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD1TLnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LFMudHJpbT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShHdCwiIil9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBTfSk7dmFyIFl0PUMualF1ZXJ5LFF0PUMuJDtyZXR1cm4gUy5ub0NvbmZsaWN0PWZ1bmN0aW9uKGUpe3JldHVybiBDLiQ9PT1TJiYoQy4kPVF0KSxlJiZDLmpRdWVyeT09PVMmJihDLmpRdWVyeT1ZdCksU30sInVuZGVmaW5lZCI9PXR5cGVvZiBlJiYoQy5qUXVlcnk9Qy4kPVMpLFN9KTsK"},{"meta":{"name":"purify.min.js","url":"https://cdn.staticfile.org/dompurify/2.0.10/purify.min.js","ts":1600058233571,"mimetype":"text/javascript"},"source":"LyohIEBsaWNlbnNlIERPTVB1cmlmeSB8IChjKSBDdXJlNTMgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgbGljZW5zZSAyLjAgYW5kIE1vemlsbGEgUHVibGljIExpY2Vuc2UgMi4wIHwgZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L2Jsb2IvMi4wLjgvTElDRU5TRSAqLwohZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1lfHxzZWxmKS5ET01QdXJpZnk9dCgpfSh0aGlzLChmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuaGFzT3duUHJvcGVydHksdD1PYmplY3Quc2V0UHJvdG90eXBlT2Ysbj1PYmplY3QuaXNGcm96ZW4scj1PYmplY3Qua2V5cyxvPU9iamVjdC5mcmVlemUsaT1PYmplY3Quc2VhbCxhPSJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdCxsPWEuYXBwbHksYz1hLmNvbnN0cnVjdDtsfHwobD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuYXBwbHkodCxuKX0pLG98fChvPWZ1bmN0aW9uKGUpe3JldHVybiBlfSksaXx8KGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxjfHwoYz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoZSxbbnVsbF0uY29uY2F0KGZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD0wLG49QXJyYXkoZS5sZW5ndGgpO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XTtyZXR1cm4gbn1yZXR1cm4gQXJyYXkuZnJvbShlKX0odCkpKSl9KTt2YXIgcz1TKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSx1PVMoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpLGQ9UyhBcnJheS5wcm90b3R5cGUuam9pbiksZj1TKEFycmF5LnByb3RvdHlwZS5wb3ApLHA9UyhBcnJheS5wcm90b3R5cGUucHVzaCksbT1TKEFycmF5LnByb3RvdHlwZS5zbGljZSkseT1TKFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpLGc9UyhTdHJpbmcucHJvdG90eXBlLm1hdGNoKSxoPVMoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKSx2PVMoU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mKSxiPVMoU3RyaW5nLnByb3RvdHlwZS50cmltKSxUPVMoUmVnRXhwLnByb3RvdHlwZS50ZXN0KSxBPWsoUmVnRXhwKSx4PWsoVHlwZUVycm9yKTtmdW5jdGlvbiBTKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KG4+MT9uLTE6MCksbz0xO288bjtvKyspcltvLTFdPWFyZ3VtZW50c1tvXTtyZXR1cm4gbChlLHQscil9fWZ1bmN0aW9uIGsoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1BcnJheSh0KSxyPTA7cjx0O3IrKyluW3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gYyhlLG4pfX1mdW5jdGlvbiBMKGUscil7dCYmdChlLG51bGwpO2Zvcih2YXIgbz1yLmxlbmd0aDtvLS07KXt2YXIgaT1yW29dO2lmKCJzdHJpbmciPT10eXBlb2YgaSl7dmFyIGE9eShpKTthIT09aSYmKG4ocil8fChyW29dPWEpLGk9YSl9ZVtpXT0hMH1yZXR1cm4gZX1mdW5jdGlvbiBFKHQpe3ZhciBuPXt9LHI9dm9pZCAwO2ZvcihyIGluIHQpbChlLHQsW3JdKSYmKG5bcl09dFtyXSk7cmV0dXJuIG59dmFyIE09byhbImEiLCJhYmJyIiwiYWNyb255bSIsImFkZHJlc3MiLCJhcmVhIiwiYXJ0aWNsZSIsImFzaWRlIiwiYXVkaW8iLCJiIiwiYmRpIiwiYmRvIiwiYmlnIiwiYmxpbmsiLCJibG9ja3F1b3RlIiwiYm9keSIsImJyIiwiYnV0dG9uIiwiY2FudmFzIiwiY2FwdGlvbiIsImNlbnRlciIsImNpdGUiLCJjb2RlIiwiY29sIiwiY29sZ3JvdXAiLCJjb250ZW50IiwiZGF0YSIsImRhdGFsaXN0IiwiZGQiLCJkZWNvcmF0b3IiLCJkZWwiLCJkZXRhaWxzIiwiZGZuIiwiZGlyIiwiZGl2IiwiZGwiLCJkdCIsImVsZW1lbnQiLCJlbSIsImZpZWxkc2V0IiwiZmlnY2FwdGlvbiIsImZpZ3VyZSIsImZvbnQiLCJmb290ZXIiLCJmb3JtIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiaGVhZCIsImhlYWRlciIsImhncm91cCIsImhyIiwiaHRtbCIsImkiLCJpbWciLCJpbnB1dCIsImlucyIsImtiZCIsImxhYmVsIiwibGVnZW5kIiwibGkiLCJtYWluIiwibWFwIiwibWFyayIsIm1hcnF1ZWUiLCJtZW51IiwibWVudWl0ZW0iLCJtZXRlciIsIm5hdiIsIm5vYnIiLCJvbCIsIm9wdGdyb3VwIiwib3B0aW9uIiwib3V0cHV0IiwicCIsInBpY3R1cmUiLCJwcmUiLCJwcm9ncmVzcyIsInEiLCJycCIsInJ0IiwicnVieSIsInMiLCJzYW1wIiwic2VjdGlvbiIsInNlbGVjdCIsInNoYWRvdyIsInNtYWxsIiwic291cmNlIiwic3BhY2VyIiwic3BhbiIsInN0cmlrZSIsInN0cm9uZyIsInN0eWxlIiwic3ViIiwic3VtbWFyeSIsInN1cCIsInRhYmxlIiwidGJvZHkiLCJ0ZCIsInRlbXBsYXRlIiwidGV4dGFyZWEiLCJ0Zm9vdCIsInRoIiwidGhlYWQiLCJ0aW1lIiwidHIiLCJ0cmFjayIsInR0IiwidSIsInVsIiwidmFyIiwidmlkZW8iLCJ3YnIiXSksXz1vKFsic3ZnIiwiYSIsImFsdGdseXBoIiwiYWx0Z2x5cGhkZWYiLCJhbHRnbHlwaGl0ZW0iLCJhbmltYXRlY29sb3IiLCJhbmltYXRlbW90aW9uIiwiYW5pbWF0ZXRyYW5zZm9ybSIsImF1ZGlvIiwiY2FudmFzIiwiY2lyY2xlIiwiY2xpcHBhdGgiLCJkZWZzIiwiZGVzYyIsImVsbGlwc2UiLCJmaWx0ZXIiLCJmb250IiwiZyIsImdseXBoIiwiZ2x5cGhyZWYiLCJoa2VybiIsImltYWdlIiwibGluZSIsImxpbmVhcmdyYWRpZW50IiwibWFya2VyIiwibWFzayIsIm1ldGFkYXRhIiwibXBhdGgiLCJwYXRoIiwicGF0dGVybiIsInBvbHlnb24iLCJwb2x5bGluZSIsInJhZGlhbGdyYWRpZW50IiwicmVjdCIsInN0b3AiLCJzdHlsZSIsInN3aXRjaCIsInN5bWJvbCIsInRleHQiLCJ0ZXh0cGF0aCIsInRpdGxlIiwidHJlZiIsInRzcGFuIiwidmlkZW8iLCJ2aWV3Iiwidmtlcm4iXSksTj1vKFsiZmVCbGVuZCIsImZlQ29sb3JNYXRyaXgiLCJmZUNvbXBvbmVudFRyYW5zZmVyIiwiZmVDb21wb3NpdGUiLCJmZUNvbnZvbHZlTWF0cml4IiwiZmVEaWZmdXNlTGlnaHRpbmciLCJmZURpc3BsYWNlbWVudE1hcCIsImZlRGlzdGFudExpZ2h0IiwiZmVGbG9vZCIsImZlRnVuY0EiLCJmZUZ1bmNCIiwiZmVGdW5jRyIsImZlRnVuY1IiLCJmZUdhdXNzaWFuQmx1ciIsImZlTWVyZ2UiLCJmZU1lcmdlTm9kZSIsImZlTW9ycGhvbG9neSIsImZlT2Zmc2V0IiwiZmVQb2ludExpZ2h0IiwiZmVTcGVjdWxhckxpZ2h0aW5nIiwiZmVTcG90TGlnaHQiLCJmZVRpbGUiLCJmZVR1cmJ1bGVuY2UiXSksTz1vKFsibWF0aCIsIm1lbmNsb3NlIiwibWVycm9yIiwibWZlbmNlZCIsIm1mcmFjIiwibWdseXBoIiwibWkiLCJtbGFiZWxlZHRyIiwibW11bHRpc2NyaXB0cyIsIm1uIiwibW8iLCJtb3ZlciIsIm1wYWRkZWQiLCJtcGhhbnRvbSIsIm1yb290IiwibXJvdyIsIm1zIiwibXNwYWNlIiwibXNxcnQiLCJtc3R5bGUiLCJtc3ViIiwibXN1cCIsIm1zdWJzdXAiLCJtdGFibGUiLCJtdGQiLCJtdGV4dCIsIm10ciIsIm11bmRlciIsIm11bmRlcm92ZXIiXSksdz1vKFsiI3RleHQiXSksRD1vKFsiYWNjZXB0IiwiYWN0aW9uIiwiYWxpZ24iLCJhbHQiLCJhdXRvY2FwaXRhbGl6ZSIsImF1dG9jb21wbGV0ZSIsImF1dG9waWN0dXJlaW5waWN0dXJlIiwiYXV0b3BsYXkiLCJiYWNrZ3JvdW5kIiwiYmdjb2xvciIsImJvcmRlciIsImNhcHR1cmUiLCJjZWxscGFkZGluZyIsImNlbGxzcGFjaW5nIiwiY2hlY2tlZCIsImNpdGUiLCJjbGFzcyIsImNsZWFyIiwiY29sb3IiLCJjb2xzIiwiY29sc3BhbiIsImNvbnRyb2xzIiwiY29udHJvbHNsaXN0IiwiY29vcmRzIiwiY3Jvc3NvcmlnaW4iLCJkYXRldGltZSIsImRlY29kaW5nIiwiZGVmYXVsdCIsImRpciIsImRpc2FibGVkIiwiZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUiLCJkaXNhYmxlcmVtb3RlcGxheWJhY2siLCJkb3dubG9hZCIsImRyYWdnYWJsZSIsImVuY3R5cGUiLCJlbnRlcmtleWhpbnQiLCJmYWNlIiwiZm9yIiwiaGVhZGVycyIsImhlaWdodCIsImhpZGRlbiIsImhpZ2giLCJocmVmIiwiaHJlZmxhbmciLCJpZCIsImlucHV0bW9kZSIsImludGVncml0eSIsImlzbWFwIiwia2luZCIsImxhYmVsIiwibGFuZyIsImxpc3QiLCJsb2FkaW5nIiwibG9vcCIsImxvdyIsIm1heCIsIm1heGxlbmd0aCIsIm1lZGlhIiwibWV0aG9kIiwibWluIiwibWlubGVuZ3RoIiwibXVsdGlwbGUiLCJtdXRlZCIsIm5hbWUiLCJub3NoYWRlIiwibm92YWxpZGF0ZSIsIm5vd3JhcCIsIm9wZW4iLCJvcHRpbXVtIiwicGF0dGVybiIsInBsYWNlaG9sZGVyIiwicGxheXNpbmxpbmUiLCJwb3N0ZXIiLCJwcmVsb2FkIiwicHViZGF0ZSIsInJhZGlvZ3JvdXAiLCJyZWFkb25seSIsInJlbCIsInJlcXVpcmVkIiwicmV2IiwicmV2ZXJzZWQiLCJyb2xlIiwicm93cyIsInJvd3NwYW4iLCJzcGVsbGNoZWNrIiwic2NvcGUiLCJzZWxlY3RlZCIsInNoYXBlIiwic2l6ZSIsInNpemVzIiwic3BhbiIsInNyY2xhbmciLCJzdGFydCIsInNyYyIsInNyY3NldCIsInN0ZXAiLCJzdHlsZSIsInN1bW1hcnkiLCJ0YWJpbmRleCIsInRpdGxlIiwidHJhbnNsYXRlIiwidHlwZSIsInVzZW1hcCIsInZhbGlnbiIsInZhbHVlIiwid2lkdGgiLCJ4bWxucyJdKSxSPW8oWyJhY2NlbnQtaGVpZ2h0IiwiYWNjdW11bGF0ZSIsImFkZGl0aXZlIiwiYWxpZ25tZW50LWJhc2VsaW5lIiwiYXNjZW50IiwiYXR0cmlidXRlbmFtZSIsImF0dHJpYnV0ZXR5cGUiLCJhemltdXRoIiwiYmFzZWZyZXF1ZW5jeSIsImJhc2VsaW5lLXNoaWZ0IiwiYmVnaW4iLCJiaWFzIiwiYnkiLCJjbGFzcyIsImNsaXAiLCJjbGlwLXBhdGgiLCJjbGlwLXJ1bGUiLCJjb2xvciIsImNvbG9yLWludGVycG9sYXRpb24iLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLCJjb2xvci1wcm9maWxlIiwiY29sb3ItcmVuZGVyaW5nIiwiY3giLCJjeSIsImQiLCJkeCIsImR5IiwiZGlmZnVzZWNvbnN0YW50IiwiZGlyZWN0aW9uIiwiZGlzcGxheSIsImRpdmlzb3IiLCJkdXIiLCJlZGdlbW9kZSIsImVsZXZhdGlvbiIsImVuZCIsImZpbGwiLCJmaWxsLW9wYWNpdHkiLCJmaWxsLXJ1bGUiLCJmaWx0ZXIiLCJmaWx0ZXJ1bml0cyIsImZsb29kLWNvbG9yIiwiZmxvb2Qtb3BhY2l0eSIsImZvbnQtZmFtaWx5IiwiZm9udC1zaXplIiwiZm9udC1zaXplLWFkanVzdCIsImZvbnQtc3RyZXRjaCIsImZvbnQtc3R5bGUiLCJmb250LXZhcmlhbnQiLCJmb250LXdlaWdodCIsImZ4IiwiZnkiLCJnMSIsImcyIiwiZ2x5cGgtbmFtZSIsImdseXBocmVmIiwiZ3JhZGllbnR1bml0cyIsImdyYWRpZW50dHJhbnNmb3JtIiwiaGVpZ2h0IiwiaHJlZiIsImlkIiwiaW1hZ2UtcmVuZGVyaW5nIiwiaW4iLCJpbjIiLCJrIiwiazEiLCJrMiIsImszIiwiazQiLCJrZXJuaW5nIiwia2V5cG9pbnRzIiwia2V5c3BsaW5lcyIsImtleXRpbWVzIiwibGFuZyIsImxlbmd0aGFkanVzdCIsImxldHRlci1zcGFjaW5nIiwia2VybmVsbWF0cml4Iiwia2VybmVsdW5pdGxlbmd0aCIsImxpZ2h0aW5nLWNvbG9yIiwibG9jYWwiLCJtYXJrZXItZW5kIiwibWFya2VyLW1pZCIsIm1hcmtlci1zdGFydCIsIm1hcmtlcmhlaWdodCIsIm1hcmtlcnVuaXRzIiwibWFya2Vyd2lkdGgiLCJtYXNrY29udGVudHVuaXRzIiwibWFza3VuaXRzIiwibWF4IiwibWFzayIsIm1lZGlhIiwibWV0aG9kIiwibW9kZSIsIm1pbiIsIm5hbWUiLCJudW1vY3RhdmVzIiwib2Zmc2V0Iiwib3BlcmF0b3IiLCJvcGFjaXR5Iiwib3JkZXIiLCJvcmllbnQiLCJvcmllbnRhdGlvbiIsIm9yaWdpbiIsIm92ZXJmbG93IiwicGFpbnQtb3JkZXIiLCJwYXRoIiwicGF0aGxlbmd0aCIsInBhdHRlcm5jb250ZW50dW5pdHMiLCJwYXR0ZXJudHJhbnNmb3JtIiwicGF0dGVybnVuaXRzIiwicG9pbnRzIiwicHJlc2VydmVhbHBoYSIsInByZXNlcnZlYXNwZWN0cmF0aW8iLCJwcmltaXRpdmV1bml0cyIsInIiLCJyeCIsInJ5IiwicmFkaXVzIiwicmVmeCIsInJlZnkiLCJyZXBlYXRjb3VudCIsInJlcGVhdGR1ciIsInJlc3RhcnQiLCJyZXN1bHQiLCJyb3RhdGUiLCJzY2FsZSIsInNlZWQiLCJzaGFwZS1yZW5kZXJpbmciLCJzcGVjdWxhcmNvbnN0YW50Iiwic3BlY3VsYXJleHBvbmVudCIsInNwcmVhZG1ldGhvZCIsInN0YXJ0b2Zmc2V0Iiwic3RkZGV2aWF0aW9uIiwic3RpdGNodGlsZXMiLCJzdG9wLWNvbG9yIiwic3RvcC1vcGFjaXR5Iiwic3Ryb2tlLWRhc2hhcnJheSIsInN0cm9rZS1kYXNob2Zmc2V0Iiwic3Ryb2tlLWxpbmVjYXAiLCJzdHJva2UtbGluZWpvaW4iLCJzdHJva2UtbWl0ZXJsaW1pdCIsInN0cm9rZS1vcGFjaXR5Iiwic3Ryb2tlIiwic3Ryb2tlLXdpZHRoIiwic3R5bGUiLCJzdXJmYWNlc2NhbGUiLCJ0YWJpbmRleCIsInRhcmdldHgiLCJ0YXJnZXR5IiwidHJhbnNmb3JtIiwidGV4dC1hbmNob3IiLCJ0ZXh0LWRlY29yYXRpb24iLCJ0ZXh0LXJlbmRlcmluZyIsInRleHRsZW5ndGgiLCJ0eXBlIiwidTEiLCJ1MiIsInVuaWNvZGUiLCJ2YWx1ZXMiLCJ2aWV3Ym94IiwidmlzaWJpbGl0eSIsInZlcnNpb24iLCJ2ZXJ0LWFkdi15IiwidmVydC1vcmlnaW4teCIsInZlcnQtb3JpZ2luLXkiLCJ3aWR0aCIsIndvcmQtc3BhY2luZyIsIndyYXAiLCJ3cml0aW5nLW1vZGUiLCJ4Y2hhbm5lbHNlbGVjdG9yIiwieWNoYW5uZWxzZWxlY3RvciIsIngiLCJ4MSIsIngyIiwieG1sbnMiLCJ5IiwieTEiLCJ5MiIsInoiLCJ6b29tYW5kcGFuIl0pLEg9byhbImFjY2VudCIsImFjY2VudHVuZGVyIiwiYWxpZ24iLCJiZXZlbGxlZCIsImNsb3NlIiwiY29sdW1uc2FsaWduIiwiY29sdW1ubGluZXMiLCJjb2x1bW5zcGFuIiwiZGVub21hbGlnbiIsImRlcHRoIiwiZGlyIiwiZGlzcGxheSIsImRpc3BsYXlzdHlsZSIsImVuY29kaW5nIiwiZmVuY2UiLCJmcmFtZSIsImhlaWdodCIsImhyZWYiLCJpZCIsImxhcmdlb3AiLCJsZW5ndGgiLCJsaW5ldGhpY2tuZXNzIiwibHNwYWNlIiwibHF1b3RlIiwibWF0aGJhY2tncm91bmQiLCJtYXRoY29sb3IiLCJtYXRoc2l6ZSIsIm1hdGh2YXJpYW50IiwibWF4c2l6ZSIsIm1pbnNpemUiLCJtb3ZhYmxlbGltaXRzIiwibm90YXRpb24iLCJudW1hbGlnbiIsIm9wZW4iLCJyb3dhbGlnbiIsInJvd2xpbmVzIiwicm93c3BhY2luZyIsInJvd3NwYW4iLCJyc3BhY2UiLCJycXVvdGUiLCJzY3JpcHRsZXZlbCIsInNjcmlwdG1pbnNpemUiLCJzY3JpcHRzaXplbXVsdGlwbGllciIsInNlbGVjdGlvbiIsInNlcGFyYXRvciIsInNlcGFyYXRvcnMiLCJzdHJldGNoeSIsInN1YnNjcmlwdHNoaWZ0Iiwic3Vwc2NyaXB0c2hpZnQiLCJzeW1tZXRyaWMiLCJ2b2Zmc2V0Iiwid2lkdGgiLCJ4bWxucyJdKSxDPW8oWyJ4bGluazpocmVmIiwieG1sOmlkIiwieGxpbms6dGl0bGUiLCJ4bWw6c3BhY2UiLCJ4bWxuczp4bGluayJdKSxGPWkoL1x7XHtbXHNcU10qfFtcc1xTXSpcfVx9L2dtKSx6PWkoLzwlW1xzXFNdKnxbXHNcU10qJT4vZ20pLEk9aSgvXmRhdGEtW1wtXHcuXHUwMEI3LVx1RkZGRl0vKSxqPWkoL15hcmlhLVtcLVx3XSskLyksVT1pKC9eKD86KD86KD86ZnxodCl0cHM/fG1haWx0b3x0ZWx8Y2FsbHRvfGNpZHx4bXBwKTp8W15hLXpdfFthLXorLlwtXSsoPzpbXmEteisuXC06XXwkKSkvaSksUD1pKC9eKD86XHcrc2NyaXB0fGRhdGEpOi9pKSxXPWkoL1tcdTAwMDAtXHUwMDIwXHUwMEEwXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAyOVx1MjA1Zlx1MzAwMF0vZyksQj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX07ZnVuY3Rpb24gRyhlKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHQ9MCxuPUFycmF5KGUubGVuZ3RoKTt0PGUubGVuZ3RoO3QrKyluW3RdPWVbdF07cmV0dXJuIG59cmV0dXJuIEFycmF5LmZyb20oZSl9dmFyIHE9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvd30sSz1mdW5jdGlvbihlLHQpe2lmKCJvYmplY3QiIT09KHZvaWQgMD09PWU/InVuZGVmaW5lZCI6QihlKSl8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmNyZWF0ZVBvbGljeSlyZXR1cm4gbnVsbDt2YXIgbj1udWxsO3QuY3VycmVudFNjcmlwdCYmdC5jdXJyZW50U2NyaXB0Lmhhc0F0dHJpYnV0ZSgiZGF0YS10dC1wb2xpY3ktc3VmZml4IikmJihuPXQuY3VycmVudFNjcmlwdC5nZXRBdHRyaWJ1dGUoImRhdGEtdHQtcG9saWN5LXN1ZmZpeCIpKTt2YXIgcj0iZG9tcHVyaWZ5Iisobj8iIyIrbjoiIik7dHJ5e3JldHVybiBlLmNyZWF0ZVBvbGljeShyLHtjcmVhdGVIVE1MOmZ1bmN0aW9uKGUpe3JldHVybiBlfX0pfWNhdGNoKGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRydXN0ZWRUeXBlcyBwb2xpY3kgIityKyIgY291bGQgbm90IGJlIGNyZWF0ZWQuIiksbnVsbH19O3JldHVybiBmdW5jdGlvbiBlKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnEoKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfTtpZihuLnZlcnNpb249IjIuMC4xMCIsbi5yZW1vdmVkPVtdLCF0fHwhdC5kb2N1bWVudHx8OSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG4uaXNTdXBwb3J0ZWQ9ITEsbjt2YXIgaT10LmRvY3VtZW50LGE9ITEsbD10LmRvY3VtZW50LGM9dC5Eb2N1bWVudEZyYWdtZW50LFM9dC5IVE1MVGVtcGxhdGVFbGVtZW50LGs9dC5Ob2RlLFY9dC5Ob2RlRmlsdGVyLFk9dC5OYW1lZE5vZGVNYXAsWD12b2lkIDA9PT1ZP3QuTmFtZWROb2RlTWFwfHx0Lk1vek5hbWVkQXR0ck1hcDpZLCQ9dC5UZXh0LEo9dC5Db21tZW50LFE9dC5ET01QYXJzZXIsWj10LnRydXN0ZWRUeXBlcztpZigiZnVuY3Rpb24iPT10eXBlb2YgUyl7dmFyIGVlPWwuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtlZS5jb250ZW50JiZlZS5jb250ZW50Lm93bmVyRG9jdW1lbnQmJihsPWVlLmNvbnRlbnQub3duZXJEb2N1bWVudCl9dmFyIHRlPUsoWixpKSxuZT10ZT90ZS5jcmVhdGVIVE1MKCIiKToiIixyZT1sLG9lPXJlLmltcGxlbWVudGF0aW9uLGllPXJlLmNyZWF0ZU5vZGVJdGVyYXRvcixhZT1yZS5nZXRFbGVtZW50c0J5VGFnTmFtZSxsZT1yZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50LGNlPWkuaW1wb3J0Tm9kZSxzZT17fTtuLmlzU3VwcG9ydGVkPW9lJiZ2b2lkIDAhPT1vZS5jcmVhdGVIVE1MRG9jdW1lbnQmJjkhPT1sLmRvY3VtZW50TW9kZTt2YXIgdWU9RixkZT16LGZlPUkscGU9aixtZT1QLHllPVcsZ2U9VSxoZT1udWxsLHZlPUwoe30sW10uY29uY2F0KEcoTSksRyhfKSxHKE4pLEcoTyksRyh3KSkpLGJlPW51bGwsVGU9TCh7fSxbXS5jb25jYXQoRyhEKSxHKFIpLEcoSCksRyhDKSkpLEFlPW51bGwseGU9bnVsbCxTZT0hMCxrZT0hMCxMZT0hMSxFZT0hMSxNZT0hMSxfZT0hMSxOZT0hMSxPZT0hMSx3ZT0hMSxEZT0hMSxSZT0hMSxIZT0hMSxDZT0hMCxGZT0hMCx6ZT0hMSxJZT17fSxqZT1MKHt9LFsiYW5ub3RhdGlvbi14bWwiLCJhdWRpbyIsImNvbGdyb3VwIiwiZGVzYyIsImZvcmVpZ25vYmplY3QiLCJoZWFkIiwiaWZyYW1lIiwibWF0aCIsIm1pIiwibW4iLCJtbyIsIm1zIiwibXRleHQiLCJub2VtYmVkIiwibm9mcmFtZXMiLCJwbGFpbnRleHQiLCJzY3JpcHQiLCJzdHlsZSIsInN2ZyIsInRlbXBsYXRlIiwidGhlYWQiLCJ0aXRsZSIsInZpZGVvIiwieG1wIl0pLFVlPUwoe30sWyJhdWRpbyIsInZpZGVvIiwiaW1nIiwic291cmNlIiwiaW1hZ2UiLCJ0cmFjayJdKSxQZT1udWxsLFdlPUwoe30sWyJhbHQiLCJjbGFzcyIsImZvciIsImlkIiwibGFiZWwiLCJuYW1lIiwicGF0dGVybiIsInBsYWNlaG9sZGVyIiwic3VtbWFyeSIsInRpdGxlIiwidmFsdWUiLCJzdHlsZSIsInhtbG5zIl0pLEJlPW51bGwsR2U9bC5jcmVhdGVFbGVtZW50KCJmb3JtIikscWU9ZnVuY3Rpb24oZSl7QmUmJkJlPT09ZXx8KGUmJiJvYmplY3QiPT09KHZvaWQgMD09PWU/InVuZGVmaW5lZCI6QihlKSl8fChlPXt9KSxoZT0iQUxMT1dFRF9UQUdTImluIGU/TCh7fSxlLkFMTE9XRURfVEFHUyk6dmUsYmU9IkFMTE9XRURfQVRUUiJpbiBlP0woe30sZS5BTExPV0VEX0FUVFIpOlRlLFBlPSJBRERfVVJJX1NBRkVfQVRUUiJpbiBlP0woRShXZSksZS5BRERfVVJJX1NBRkVfQVRUUik6V2UsQWU9IkZPUkJJRF9UQUdTImluIGU/TCh7fSxlLkZPUkJJRF9UQUdTKTp7fSx4ZT0iRk9SQklEX0FUVFIiaW4gZT9MKHt9LGUuRk9SQklEX0FUVFIpOnt9LEllPSJVU0VfUFJPRklMRVMiaW4gZSYmZS5VU0VfUFJPRklMRVMsU2U9ITEhPT1lLkFMTE9XX0FSSUFfQVRUUixrZT0hMSE9PWUuQUxMT1dfREFUQV9BVFRSLExlPWUuQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFN8fCExLEVlPWUuU0FGRV9GT1JfSlFVRVJZfHwhMSxNZT1lLlNBRkVfRk9SX1RFTVBMQVRFU3x8ITEsX2U9ZS5XSE9MRV9ET0NVTUVOVHx8ITEsd2U9ZS5SRVRVUk5fRE9NfHwhMSxEZT1lLlJFVFVSTl9ET01fRlJBR01FTlR8fCExLFJlPWUuUkVUVVJOX0RPTV9JTVBPUlR8fCExLEhlPWUuUkVUVVJOX1RSVVNURURfVFlQRXx8ITEsT2U9ZS5GT1JDRV9CT0RZfHwhMSxDZT0hMSE9PWUuU0FOSVRJWkVfRE9NLEZlPSExIT09ZS5LRUVQX0NPTlRFTlQsemU9ZS5JTl9QTEFDRXx8ITEsZ2U9ZS5BTExPV0VEX1VSSV9SRUdFWFB8fGdlLE1lJiYoa2U9ITEpLERlJiYod2U9ITApLEllJiYoaGU9TCh7fSxbXS5jb25jYXQoRyh3KSkpLGJlPVtdLCEwPT09SWUuaHRtbCYmKEwoaGUsTSksTChiZSxEKSksITA9PT1JZS5zdmcmJihMKGhlLF8pLEwoYmUsUiksTChiZSxDKSksITA9PT1JZS5zdmdGaWx0ZXJzJiYoTChoZSxOKSxMKGJlLFIpLEwoYmUsQykpLCEwPT09SWUubWF0aE1sJiYoTChoZSxPKSxMKGJlLEgpLEwoYmUsQykpKSxlLkFERF9UQUdTJiYoaGU9PT12ZSYmKGhlPUUoaGUpKSxMKGhlLGUuQUREX1RBR1MpKSxlLkFERF9BVFRSJiYoYmU9PT1UZSYmKGJlPUUoYmUpKSxMKGJlLGUuQUREX0FUVFIpKSxlLkFERF9VUklfU0FGRV9BVFRSJiZMKFBlLGUuQUREX1VSSV9TQUZFX0FUVFIpLEZlJiYoaGVbIiN0ZXh0Il09ITApLF9lJiZMKGhlLFsiaHRtbCIsImhlYWQiLCJib2R5Il0pLGhlLnRhYmxlJiYoTChoZSxbInRib2R5Il0pLGRlbGV0ZSBBZS50Ym9keSksbyYmbyhlKSxCZT1lKX0sS2U9ZnVuY3Rpb24oZSl7cChuLnJlbW92ZWQse2VsZW1lbnQ6ZX0pO3RyeXtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9Y2F0Y2godCl7ZS5vdXRlckhUTUw9bmV9fSxWZT1mdW5jdGlvbihlLHQpe3RyeXtwKG4ucmVtb3ZlZCx7YXR0cmlidXRlOnQuZ2V0QXR0cmlidXRlTm9kZShlKSxmcm9tOnR9KX1jYXRjaChlKXtwKG4ucmVtb3ZlZCx7YXR0cmlidXRlOm51bGwsZnJvbTp0fSl9dC5yZW1vdmVBdHRyaWJ1dGUoZSl9LFllPWZ1bmN0aW9uKGUpe3ZhciB0PXZvaWQgMCxuPXZvaWQgMDtpZihPZSllPSI8cmVtb3ZlPjwvcmVtb3ZlPiIrZTtlbHNle3ZhciByPWcoZSwvXltcc10rLyk7bj1yJiZyWzBdfXZhciBvPXRlP3RlLmNyZWF0ZUhUTUwoZSk6ZTt0cnl7dD0obmV3IFEpLnBhcnNlRnJvbVN0cmluZyhvLCJ0ZXh0L2h0bWwiKX1jYXRjaChlKXt9aWYoYSYmTChBZSxbInRpdGxlIl0pLCF0fHwhdC5kb2N1bWVudEVsZW1lbnQpe3ZhciBpPSh0PW9lLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmJvZHk7aS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkucGFyZW50Tm9kZS5maXJzdEVsZW1lbnRDaGlsZCksaS5vdXRlckhUTUw9b31yZXR1cm4gZSYmbiYmdC5ib2R5Lmluc2VydEJlZm9yZShsLmNyZWF0ZVRleHROb2RlKG4pLHQuYm9keS5jaGlsZE5vZGVzWzBdfHxudWxsKSxhZS5jYWxsKHQsX2U/Imh0bWwiOiJib2R5IilbMF19O24uaXNTdXBwb3J0ZWQmJmZ1bmN0aW9uKCl7dHJ5e3ZhciBlPVllKCI8eC8+PHRpdGxlPiZsdDsvdGl0bGUmZ3Q7Jmx0O2ltZyZndDsiKTtUKC88XC90aXRsZS8sZS5xdWVyeVNlbGVjdG9yKCJ0aXRsZSIpLmlubmVySFRNTCkmJihhPSEwKX1jYXRjaChlKXt9fSgpO3ZhciBYZT1mdW5jdGlvbihlKXtyZXR1cm4gaWUuY2FsbChlLm93bmVyRG9jdW1lbnR8fGUsZSxWLlNIT1dfRUxFTUVOVHxWLlNIT1dfQ09NTUVOVHxWLlNIT1dfVEVYVCwoZnVuY3Rpb24oKXtyZXR1cm4gVi5GSUxURVJfQUNDRVBUfSksITEpfSwkZT1mdW5jdGlvbihlKXtyZXR1cm4hKGUgaW5zdGFuY2VvZiAkfHxlIGluc3RhbmNlb2YgSikmJiEoInN0cmluZyI9PXR5cGVvZiBlLm5vZGVOYW1lJiYic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlbW92ZUNoaWxkJiZlLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBYJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yZW1vdmVBdHRyaWJ1dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNldEF0dHJpYnV0ZSYmInN0cmluZyI9PXR5cGVvZiBlLm5hbWVzcGFjZVVSSSl9LEplPWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT09KHZvaWQgMD09PWs/InVuZGVmaW5lZCI6QihrKSk/ZSBpbnN0YW5jZW9mIGs6ZSYmIm9iamVjdCI9PT0odm9pZCAwPT09ZT8idW5kZWZpbmVkIjpCKGUpKSYmIm51bWJlciI9PXR5cGVvZiBlLm5vZGVUeXBlJiYic3RyaW5nIj09dHlwZW9mIGUubm9kZU5hbWV9LFFlPWZ1bmN0aW9uKGUsdCxyKXtzZVtlXSYmcyhzZVtlXSwoZnVuY3Rpb24oZSl7ZS5jYWxsKG4sdCxyLEJlKX0pKX0sWmU9ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO2lmKFFlKCJiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzIixlLG51bGwpLCRlKGUpKXJldHVybiBLZShlKSwhMDt2YXIgcj15KGUubm9kZU5hbWUpO2lmKFFlKCJ1cG9uU2FuaXRpemVFbGVtZW50IixlLHt0YWdOYW1lOnIsYWxsb3dlZFRhZ3M6aGV9KSwoInN2ZyI9PT1yfHwibWF0aCI9PT1yKSYmMCE9PWUucXVlcnlTZWxlY3RvckFsbCgicCwgYnIiKS5sZW5ndGgpcmV0dXJuIEtlKGUpLCEwO2lmKCFoZVtyXXx8QWVbcl0pe2lmKEZlJiYhamVbcl0mJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc2VydEFkamFjZW50SFRNTCl0cnl7dmFyIG89ZS5pbm5lckhUTUw7ZS5pbnNlcnRBZGphY2VudEhUTUwoIkFmdGVyRW5kIix0ZT90ZS5jcmVhdGVIVE1MKG8pOm8pfWNhdGNoKGUpe31yZXR1cm4gS2UoZSksITB9cmV0dXJuIm5vc2NyaXB0Ij09PXImJlQoLzxcL25vc2NyaXB0L2ksZS5pbm5lckhUTUwpfHwibm9lbWJlZCI9PT1yJiZUKC88XC9ub2VtYmVkL2ksZS5pbm5lckhUTUwpPyhLZShlKSwhMCk6KCFFZXx8ZS5maXJzdEVsZW1lbnRDaGlsZHx8ZS5jb250ZW50JiZlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGR8fCFUKC88L2csZS50ZXh0Q29udGVudCl8fChwKG4ucmVtb3ZlZCx7ZWxlbWVudDplLmNsb25lTm9kZSgpfSksZS5pbm5lckhUTUw/ZS5pbm5lckhUTUw9aChlLmlubmVySFRNTCwvPC9nLCImbHQ7Iik6ZS5pbm5lckhUTUw9aChlLnRleHRDb250ZW50LC88L2csIiZsdDsiKSksTWUmJjM9PT1lLm5vZGVUeXBlJiYodD1lLnRleHRDb250ZW50LHQ9aCh0LHVlLCIgIiksdD1oKHQsZGUsIiAiKSxlLnRleHRDb250ZW50IT09dCYmKHAobi5yZW1vdmVkLHtlbGVtZW50OmUuY2xvbmVOb2RlKCl9KSxlLnRleHRDb250ZW50PXQpKSxRZSgiYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzIixlLG51bGwpLCExKX0sZXQ9ZnVuY3Rpb24oZSx0LG4pe2lmKENlJiYoImlkIj09PXR8fCJuYW1lIj09PXQpJiYobiBpbiBsfHxuIGluIEdlKSlyZXR1cm4hMTtpZihrZSYmVChmZSx0KSk7ZWxzZSBpZihTZSYmVChwZSx0KSk7ZWxzZXtpZighYmVbdF18fHhlW3RdKXJldHVybiExO2lmKFBlW3RdKTtlbHNlIGlmKFQoZ2UsaChuLHllLCIiKSkpO2Vsc2UgaWYoInNyYyIhPT10JiYieGxpbms6aHJlZiIhPT10JiYiaHJlZiIhPT10fHwic2NyaXB0Ij09PWV8fDAhPT12KG4sImRhdGE6Iil8fCFVZVtlXSl7aWYoTGUmJiFUKG1lLGgobix5ZSwiIikpKTtlbHNlIGlmKG4pcmV0dXJuITF9ZWxzZTt9cmV0dXJuITB9LHR0PWZ1bmN0aW9uKGUpe3ZhciB0PXZvaWQgMCxvPXZvaWQgMCxpPXZvaWQgMCxhPXZvaWQgMCxsPXZvaWQgMDtRZSgiYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzIixlLG51bGwpO3ZhciBjPWUuYXR0cmlidXRlcztpZihjKXt2YXIgcz17YXR0ck5hbWU6IiIsYXR0clZhbHVlOiIiLGtlZXBBdHRyOiEwLGFsbG93ZWRBdHRyaWJ1dGVzOmJlfTtmb3IobD1jLmxlbmd0aDtsLS07KXt2YXIgcD10PWNbbF0sZz1wLm5hbWUsdj1wLm5hbWVzcGFjZVVSSTtpZihvPWIodC52YWx1ZSksaT15KGcpLHMuYXR0ck5hbWU9aSxzLmF0dHJWYWx1ZT1vLHMua2VlcEF0dHI9ITAscy5mb3JjZUtlZXBBdHRyPXZvaWQgMCxRZSgidXBvblNhbml0aXplQXR0cmlidXRlIixlLHMpLG89cy5hdHRyVmFsdWUsIXMuZm9yY2VLZWVwQXR0cil7aWYoIm5hbWUiPT09aSYmIklNRyI9PT1lLm5vZGVOYW1lJiZjLmlkKWE9Yy5pZCxjPW0oYyxbXSksVmUoImlkIixlKSxWZShnLGUpLHUoYyxhKT5sJiZlLnNldEF0dHJpYnV0ZSgiaWQiLGEudmFsdWUpO2Vsc2V7aWYoIklOUFVUIj09PWUubm9kZU5hbWUmJiJ0eXBlIj09PWkmJiJmaWxlIj09PW8mJnMua2VlcEF0dHImJihiZVtpXXx8IXhlW2ldKSljb250aW51ZTsiaWQiPT09ZyYmZS5zZXRBdHRyaWJ1dGUoZywiIiksVmUoZyxlKX1pZihzLmtlZXBBdHRyKWlmKEVlJiZUKC9cLz4vaSxvKSlWZShnLGUpO2Vsc2UgaWYoVCgvc3ZnfG1hdGgvaSxlLm5hbWVzcGFjZVVSSSkmJlQoQSgiPC8oIitkKHIoamUpLCJ8IikrIikiLCJpIiksbykpVmUoZyxlKTtlbHNle01lJiYobz1oKG8sdWUsIiAiKSxvPWgobyxkZSwiICIpKTt2YXIgeD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoZXQoeCxpLG8pKXRyeXt2P2Uuc2V0QXR0cmlidXRlTlModixnLG8pOmUuc2V0QXR0cmlidXRlKGcsbyksZihuLnJlbW92ZWQpfWNhdGNoKGUpe319fX1RZSgiYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMiLGUsbnVsbCl9fSxudD1mdW5jdGlvbiBlKHQpe3ZhciBuPXZvaWQgMCxyPVhlKHQpO2ZvcihRZSgiYmVmb3JlU2FuaXRpemVTaGFkb3dET00iLHQsbnVsbCk7bj1yLm5leHROb2RlKCk7KVFlKCJ1cG9uU2FuaXRpemVTaGFkb3dOb2RlIixuLG51bGwpLFplKG4pfHwobi5jb250ZW50IGluc3RhbmNlb2YgYyYmZShuLmNvbnRlbnQpLHR0KG4pKTtRZSgiYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSIsdCxudWxsKX07cmV0dXJuIG4uc2FuaXRpemU9ZnVuY3Rpb24oZSxyKXt2YXIgbz12b2lkIDAsYT12b2lkIDAsbD12b2lkIDAscz12b2lkIDAsdT12b2lkIDA7aWYoZXx8KGU9Ilx4M2MhLS1ceDNlIiksInN0cmluZyIhPXR5cGVvZiBlJiYhSmUoZSkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nKXRocm93IHgoInRvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoInN0cmluZyIhPXR5cGVvZihlPWUudG9TdHJpbmcoKSkpdGhyb3cgeCgiZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZyIpfWlmKCFuLmlzU3VwcG9ydGVkKXtpZigib2JqZWN0Ij09PUIodC50b1N0YXRpY0hUTUwpfHwiZnVuY3Rpb24iPT10eXBlb2YgdC50b1N0YXRpY0hUTUwpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdC50b1N0YXRpY0hUTUwoZSk7aWYoSmUoZSkpcmV0dXJuIHQudG9TdGF0aWNIVE1MKGUub3V0ZXJIVE1MKX1yZXR1cm4gZX1pZihOZXx8cWUociksbi5yZW1vdmVkPVtdLCJzdHJpbmciPT10eXBlb2YgZSYmKHplPSExKSx6ZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgaykxPT09KGE9KG89WWUoIlx4M2MhLS1ceDNlIikpLm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShlLCEwKSkubm9kZVR5cGUmJiJCT0RZIj09PWEubm9kZU5hbWV8fCJIVE1MIj09PWEubm9kZU5hbWU/bz1hOm8uYXBwZW5kQ2hpbGQoYSk7ZWxzZXtpZighd2UmJiFNZSYmIV9lJiZIZSYmLTE9PT1lLmluZGV4T2YoIjwiKSlyZXR1cm4gdGU/dGUuY3JlYXRlSFRNTChlKTplO2lmKCEobz1ZZShlKSkpcmV0dXJuIHdlP251bGw6bmV9byYmT2UmJktlKG8uZmlyc3RDaGlsZCk7Zm9yKHZhciBkPVhlKHplP2U6byk7bD1kLm5leHROb2RlKCk7KTM9PT1sLm5vZGVUeXBlJiZsPT09c3x8WmUobCl8fChsLmNvbnRlbnQgaW5zdGFuY2VvZiBjJiZudChsLmNvbnRlbnQpLHR0KGwpLHM9bCk7aWYocz1udWxsLHplKXJldHVybiBlO2lmKHdlKXtpZihEZSlmb3IodT1sZS5jYWxsKG8ub3duZXJEb2N1bWVudCk7by5maXJzdENoaWxkOyl1LmFwcGVuZENoaWxkKG8uZmlyc3RDaGlsZCk7ZWxzZSB1PW87cmV0dXJuIFJlJiYodT1jZS5jYWxsKGksdSwhMCkpLHV9dmFyIGY9X2U/by5vdXRlckhUTUw6by5pbm5lckhUTUw7cmV0dXJuIE1lJiYoZj1oKGYsdWUsIiAiKSxmPWgoZixkZSwiICIpKSx0ZSYmSGU/dGUuY3JlYXRlSFRNTChmKTpmfSxuLnNldENvbmZpZz1mdW5jdGlvbihlKXtxZShlKSxOZT0hMH0sbi5jbGVhckNvbmZpZz1mdW5jdGlvbigpe0JlPW51bGwsTmU9ITF9LG4uaXNWYWxpZEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQsbil7QmV8fHFlKHt9KTt2YXIgcj15KGUpLG89eSh0KTtyZXR1cm4gZXQocixvLG4pfSxuLmFkZEhvb2s9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHNlW2VdPXNlW2VdfHxbXSxwKHNlW2VdLHQpKX0sbi5yZW1vdmVIb29rPWZ1bmN0aW9uKGUpe3NlW2VdJiZmKHNlW2VdKX0sbi5yZW1vdmVIb29rcz1mdW5jdGlvbihlKXtzZVtlXSYmKHNlW2VdPVtdKX0sbi5yZW1vdmVBbGxIb29rcz1mdW5jdGlvbigpe3NlPXt9fSxufSgpfSkpOwovLyMgc291cmNlTWFwcGluZ1VSTD1wdXJpZnkubWluLmpzLm1hcAo="},{"meta":{"name":"snap.svg-min.js","url":"https://cdn.staticfile.org/snap.svg/0.5.1/snap.svg-min.js","ts":1600058233656,"mimetype":"text/javascript"},"source":"Ly8gU25hcC5zdmcgMC41LjAKLy8KLy8gQ29weXJpZ2h0IChjKSAyMDEzIOKAkyAyMDE3IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi8vCi8vIGJ1aWxkOiAyMDE3LTAyLTA2CgohZnVuY3Rpb24oYSl7dmFyIGIsYyxkPSIwLjUuMCIsZT0iaGFzT3duUHJvcGVydHkiLGY9L1tcLlwvXS8sZz0vXHMqLFxzKi8saD0iKiIsaT1mdW5jdGlvbihhLGIpe3JldHVybiBhLWJ9LGo9e246e319LGs9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPXRoaXMubGVuZ3RoO2I+YTthKyspaWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzW2FdKXJldHVybiB0aGlzW2FdfSxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubGVuZ3RoOy0tYTspaWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzW2FdKXJldHVybiB0aGlzW2FdfSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbj1TdHJpbmcsbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHwiW29iamVjdCBBcnJheV0iPT1tLmNhbGwoYSl9O2V2ZT1mdW5jdGlvbihhLGQpe3ZhciBlLGY9YyxnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSxoPWV2ZS5saXN0ZW5lcnMoYSksaj0wLG09W10sbj17fSxvPVtdLHA9YjtvLmZpcnN0RGVmaW5lZD1rLG8ubGFzdERlZmluZWQ9bCxiPWEsYz0wO2Zvcih2YXIgcT0wLHI9aC5sZW5ndGg7cj5xO3ErKykiekluZGV4ImluIGhbcV0mJihtLnB1c2goaFtxXS56SW5kZXgpLGhbcV0uekluZGV4PDAmJihuW2hbcV0uekluZGV4XT1oW3FdKSk7Zm9yKG0uc29ydChpKTttW2pdPDA7KWlmKGU9blttW2orK11dLG8ucHVzaChlLmFwcGx5KGQsZykpLGMpcmV0dXJuIGM9ZixvO2ZvcihxPTA7cj5xO3ErKylpZihlPWhbcV0sInpJbmRleCJpbiBlKWlmKGUuekluZGV4PT1tW2pdKXtpZihvLnB1c2goZS5hcHBseShkLGcpKSxjKWJyZWFrO2RvIGlmKGorKyxlPW5bbVtqXV0sZSYmby5wdXNoKGUuYXBwbHkoZCxnKSksYylicmVhazt3aGlsZShlKX1lbHNlIG5bZS56SW5kZXhdPWU7ZWxzZSBpZihvLnB1c2goZS5hcHBseShkLGcpKSxjKWJyZWFrO3JldHVybiBjPWYsYj1wLG99LGV2ZS5fZXZlbnRzPWosZXZlLmxpc3RlbmVycz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnLGksayxsLG09byhhKT9hOmEuc3BsaXQoZiksbj1qLHA9W25dLHE9W107Zm9yKGU9MCxnPW0ubGVuZ3RoO2c+ZTtlKyspe2ZvcihsPVtdLGk9MCxrPXAubGVuZ3RoO2s+aTtpKyspZm9yKG49cFtpXS5uLGM9W25bbVtlXV0sbltoXV0sZD0yO2QtLTspYj1jW2RdLGImJihsLnB1c2goYikscT1xLmNvbmNhdChiLmZ8fFtdKSk7cD1sfXJldHVybiBxfSxldmUuc2VwYXJhdG9yPWZ1bmN0aW9uKGEpe2E/KGE9bihhKS5yZXBsYWNlKC8oPz1bXC5cXlxdXFtcLV0pL2csIlxcIiksYT0iWyIrYSsiXSIsZj1uZXcgUmVnRXhwKGEpKTpmPS9bXC5cL10vfSxldmUub249ZnVuY3Rpb24oYSxiKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgYilyZXR1cm4gZnVuY3Rpb24oKXt9O2Zvcih2YXIgYz1vKGEpP28oYVswXSk/YTpbYV06bihhKS5zcGxpdChnKSxkPTAsZT1jLmxlbmd0aDtlPmQ7ZCsrKSFmdW5jdGlvbihhKXtmb3IodmFyIGMsZD1vKGEpP2E6bihhKS5zcGxpdChmKSxlPWosZz0wLGg9ZC5sZW5ndGg7aD5nO2crKyllPWUubixlPWUuaGFzT3duUHJvcGVydHkoZFtnXSkmJmVbZFtnXV18fChlW2RbZ11dPXtuOnt9fSk7Zm9yKGUuZj1lLmZ8fFtdLGc9MCxoPWUuZi5sZW5ndGg7aD5nO2crKylpZihlLmZbZ109PWIpe2M9ITA7YnJlYWt9IWMmJmUuZi5wdXNoKGIpfShjW2RdKTtyZXR1cm4gZnVuY3Rpb24oYSl7K2E9PSthJiYoYi56SW5kZXg9K2EpfX0sZXZlLmY9ZnVuY3Rpb24oYSl7dmFyIGI9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7ZXZlLmFwcGx5KG51bGwsW2EsbnVsbF0uY29uY2F0KGIpLmNvbmNhdChbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSkpfX0sZXZlLnN0b3A9ZnVuY3Rpb24oKXtjPTF9LGV2ZS5udD1mdW5jdGlvbihhKXt2YXIgYz1vKGIpP2Iuam9pbigiLiIpOmI7cmV0dXJuIGE/bmV3IFJlZ0V4cCgiKD86XFwufFxcL3xeKSIrYSsiKD86XFwufFxcL3wkKSIpLnRlc3QoYyk6Y30sZXZlLm50cz1mdW5jdGlvbigpe3JldHVybiBvKGIpP2I6Yi5zcGxpdChmKX0sZXZlLm9mZj1ldmUudW5iaW5kPWZ1bmN0aW9uKGEsYil7aWYoIWEpcmV0dXJuIHZvaWQoZXZlLl9ldmVudHM9aj17bjp7fX0pO3ZhciBjPW8oYSk/byhhWzBdKT9hOlthXTpuKGEpLnNwbGl0KGcpO2lmKGMubGVuZ3RoPjEpZm9yKHZhciBkPTAsaT1jLmxlbmd0aDtpPmQ7ZCsrKWV2ZS5vZmYoY1tkXSxiKTtlbHNle2M9byhhKT9hOm4oYSkuc3BsaXQoZik7dmFyIGssbCxtLGQsaSxwLHEscj1bal0scz1bXTtmb3IoZD0wLGk9Yy5sZW5ndGg7aT5kO2QrKylmb3IocD0wO3A8ci5sZW5ndGg7cCs9bS5sZW5ndGgtMil7aWYobT1bcCwxXSxrPXJbcF0ubixjW2RdIT1oKWtbY1tkXV0mJihtLnB1c2goa1tjW2RdXSkscy51bnNoaWZ0KHtuOmssbmFtZTpjW2RdfSkpO2Vsc2UgZm9yKGwgaW4gaylrW2VdKGwpJiYobS5wdXNoKGtbbF0pLHMudW5zaGlmdCh7bjprLG5hbWU6bH0pKTtyLnNwbGljZS5hcHBseShyLG0pfWZvcihkPTAsaT1yLmxlbmd0aDtpPmQ7ZCsrKWZvcihrPXJbZF07ay5uOyl7aWYoYil7aWYoay5mKXtmb3IocD0wLHE9ay5mLmxlbmd0aDtxPnA7cCsrKWlmKGsuZltwXT09Yil7ay5mLnNwbGljZShwLDEpO2JyZWFrfSFrLmYubGVuZ3RoJiZkZWxldGUgay5mfWZvcihsIGluIGsubilpZihrLm5bZV0obCkmJmsubltsXS5mKXt2YXIgdD1rLm5bbF0uZjtmb3IocD0wLHE9dC5sZW5ndGg7cT5wO3ArKylpZih0W3BdPT1iKXt0LnNwbGljZShwLDEpO2JyZWFrfSF0Lmxlbmd0aCYmZGVsZXRlIGsubltsXS5mfX1lbHNle2RlbGV0ZSBrLmY7Zm9yKGwgaW4gay5uKWsubltlXShsKSYmay5uW2xdLmYmJmRlbGV0ZSBrLm5bbF0uZn1rPWsubn1hOmZvcihkPTAsaT1zLmxlbmd0aDtpPmQ7ZCsrKXtrPXNbZF07Zm9yKGwgaW4gay5uW2submFtZV0uZiljb250aW51ZSBhO2ZvcihsIGluIGsubltrLm5hbWVdLm4pY29udGludWUgYTtkZWxldGUgay5uW2submFtZV19fX0sZXZlLm9uY2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbigpe3JldHVybiBldmUub2ZmKGEsYyksYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBldmUub24oYSxjKX0sZXZlLnZlcnNpb249ZCxldmUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iWW91IGFyZSBydW5uaW5nIEV2ZSAiK2R9LCJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1ldmU6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoImV2ZSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZXZlfSk6YS5ldmU9ZXZlfSh0aGlzKSxmdW5jdGlvbihhLGIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFsiZXZlIl0sZnVuY3Rpb24oYyl7cmV0dXJuIGIoYSxjKX0pO2Vsc2UgaWYoInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzKXt2YXIgYz1yZXF1aXJlKCJldmUiKTttb2R1bGUuZXhwb3J0cz1iKGEsYyl9ZWxzZSBiKGEsYS5ldmUpfSh3aW5kb3d8fHRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihiKXt2YXIgYyxkPXt9LGU9YS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGEud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxhLm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8YS5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxhLm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihhKXtyZXR1cm4gc2V0VGltZW91dChhLDE2LChuZXcgRGF0ZSkuZ2V0VGltZSgpKSwhMH0sZj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHwiW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9LGc9MCxoPSJNIisoK25ldyBEYXRlKS50b1N0cmluZygzNiksaT1mdW5jdGlvbigpe3JldHVybiBoKyhnKyspLnRvU3RyaW5nKDM2KX0saj1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9LGs9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZihudWxsPT1hKXJldHVybiBiLnM7dmFyIGM9Yi5zLWE7Yi5iKz1iLmR1cipjLGIuQis9Yi5kdXIqYyxiLnM9YX0sbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3JldHVybiBudWxsPT1hP2Iuc3BkOnZvaWQoYi5zcGQ9YSl9LG09ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztyZXR1cm4gbnVsbD09YT9iLmR1cjooYi5zPWIucyphL2IuZHVyLHZvaWQoYi5kdXI9YSkpfSxuPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztkZWxldGUgZFthLmlkXSxhLnVwZGF0ZSgpLGIoIm1pbmEuc3RvcC4iK2EuaWQsYSl9LG89ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EucGRpZnx8KGRlbGV0ZSBkW2EuaWRdLGEudXBkYXRlKCksYS5wZGlmPWEuZ2V0KCktYS5iKX0scD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5wZGlmJiYoYS5iPWEuZ2V0KCktYS5wZGlmLGRlbGV0ZSBhLnBkaWYsZFthLmlkXT1hLHIoKSl9LHE9ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXM7aWYoZihiLnN0YXJ0KSl7YT1bXTtmb3IodmFyIGM9MCxkPWIuc3RhcnQubGVuZ3RoO2Q+YztjKyspYVtjXT0rYi5zdGFydFtjXSsoYi5lbmRbY10tYi5zdGFydFtjXSkqYi5lYXNpbmcoYi5zKX1lbHNlIGE9K2Iuc3RhcnQrKGIuZW5kLWIuc3RhcnQpKmIuZWFzaW5nKGIucyk7Yi5zZXQoYSl9LHI9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHZvaWQoY3x8KGM9ZShyKSkpO3ZhciBmPTA7Zm9yKHZhciBnIGluIGQpaWYoZC5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGg9ZFtnXSxpPWguZ2V0KCk7ZisrLGgucz0oaS1oLmIpLyhoLmR1ci9oLnNwZCksaC5zPj0xJiYoZGVsZXRlIGRbZ10saC5zPTEsZi0tLGZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiKCJtaW5hLmZpbmlzaC4iK2EuaWQsYSl9KX0oaCkpLGgudXBkYXRlKCl9Yz1mP2Uocik6ITF9LHM9ZnVuY3Rpb24oYSxiLGMsZSxmLGcsaCl7dmFyIGo9e2lkOmkoKSxzdGFydDphLGVuZDpiLGI6YyxzOjAsZHVyOmUtYyxzcGQ6MSxnZXQ6ZixzZXQ6ZyxlYXNpbmc6aHx8cy5saW5lYXIsc3RhdHVzOmssc3BlZWQ6bCxkdXJhdGlvbjptLHN0b3A6bixwYXVzZTpvLHJlc3VtZTpwLHVwZGF0ZTpxfTtkW2ouaWRdPWo7dmFyIHQsdT0wO2Zvcih0IGluIGQpaWYoZC5oYXNPd25Qcm9wZXJ0eSh0KSYmKHUrKywyPT11KSlicmVhaztyZXR1cm4gMT09dSYmcigpLGp9O3JldHVybiBzLnRpbWU9aixzLmdldEJ5SWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGRbYV18fG51bGx9LHMubGluZWFyPWZ1bmN0aW9uKGEpe3JldHVybiBhfSxzLmVhc2VvdXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KGEsMS43KX0scy5lYXNlaW49ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KGEsLjQ4KX0scy5lYXNlaW5vdXQ9ZnVuY3Rpb24oYSl7aWYoMT09YSlyZXR1cm4gMTtpZigwPT1hKXJldHVybiAwO3ZhciBiPS40OC1hLzEuMDQsYz1NYXRoLnNxcnQoLjE3MzQrYipiKSxkPWMtYixlPU1hdGgucG93KE1hdGguYWJzKGQpLDEvMykqKDA+ZD8tMToxKSxmPS1jLWIsZz1NYXRoLnBvdyhNYXRoLmFicyhmKSwxLzMpKigwPmY/LTE6MSksaD1lK2crLjU7cmV0dXJuIDMqKDEtaCkqaCpoK2gqaCpofSxzLmJhY2tpbj1mdW5jdGlvbihhKXtpZigxPT1hKXJldHVybiAxO3ZhciBiPTEuNzAxNTg7cmV0dXJuIGEqYSooKGIrMSkqYS1iKX0scy5iYWNrb3V0PWZ1bmN0aW9uKGEpe2lmKDA9PWEpcmV0dXJuIDA7YS09MTt2YXIgYj0xLjcwMTU4O3JldHVybiBhKmEqKChiKzEpKmErYikrMX0scy5lbGFzdGljPWZ1bmN0aW9uKGEpe3JldHVybiBhPT0hIWE/YTpNYXRoLnBvdygyLC0xMCphKSpNYXRoLnNpbigoYS0uMDc1KSooMipNYXRoLlBJKS8uMykrMX0scy5ib3VuY2U9ZnVuY3Rpb24oYSl7dmFyIGIsYz03LjU2MjUsZD0yLjc1O3JldHVybiAxL2Q+YT9iPWMqYSphOjIvZD5hPyhhLT0xLjUvZCxiPWMqYSphKy43NSk6Mi41L2Q+YT8oYS09Mi4yNS9kLGI9YyphKmErLjkzNzUpOihhLT0yLjYyNS9kLGI9YyphKmErLjk4NDM3NSksYn0sYS5taW5hPXMsc30oInVuZGVmaW5lZCI9PXR5cGVvZiBiP2Z1bmN0aW9uKCl7fTpiKSxkPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoYSxiKXtpZihhKXtpZihhLm5vZGVUeXBlKXJldHVybiB3KGEpO2lmKGUoYSwiYXJyYXkiKSYmYy5zZXQpcmV0dXJuIGMuc2V0LmFwcGx5KGMsYSk7aWYoYSBpbnN0YW5jZW9mIHMpcmV0dXJuIGE7aWYobnVsbD09YilyZXR1cm4gYT15LmRvYy5xdWVyeVNlbGVjdG9yKFN0cmluZyhhKSksdyhhKX1yZXR1cm4gYT1udWxsPT1hPyIxMDAlIjphLGI9bnVsbD09Yj8iMTAwJSI6YixuZXcgdihhLGIpfWZ1bmN0aW9uIGQoYSxiKXtpZihiKXtpZigiI3RleHQiPT1hJiYoYT15LmRvYy5jcmVhdGVUZXh0Tm9kZShiLnRleHR8fGJbIiN0ZXh0Il18fCIiKSksIiNjb21tZW50Ij09YSYmKGE9eS5kb2MuY3JlYXRlQ29tbWVudChiLnRleHR8fGJbIiN0ZXh0Il18fCIiKSksInN0cmluZyI9PXR5cGVvZiBhJiYoYT1kKGEpKSwic3RyaW5nIj09dHlwZW9mIGIpcmV0dXJuIDE9PWEubm9kZVR5cGU/InhsaW5rOiI9PWIuc3Vic3RyaW5nKDAsNik/YS5nZXRBdHRyaWJ1dGVOUyhULGIuc3Vic3RyaW5nKDYpKToieG1sOiI9PWIuc3Vic3RyaW5nKDAsNCk/YS5nZXRBdHRyaWJ1dGVOUyhVLGIuc3Vic3RyaW5nKDQpKTphLmdldEF0dHJpYnV0ZShiKToidGV4dCI9PWI/YS5ub2RlVmFsdWU6bnVsbDtpZigxPT1hLm5vZGVUeXBlKXtmb3IodmFyIGMgaW4gYilpZihiW3pdKGMpKXt2YXIgZT1BKGJbY10pO2U/InhsaW5rOiI9PWMuc3Vic3RyaW5nKDAsNik/YS5zZXRBdHRyaWJ1dGVOUyhULGMuc3Vic3RyaW5nKDYpLGUpOiJ4bWw6Ij09Yy5zdWJzdHJpbmcoMCw0KT9hLnNldEF0dHJpYnV0ZU5TKFUsYy5zdWJzdHJpbmcoNCksZSk6YS5zZXRBdHRyaWJ1dGUoYyxlKTphLnJlbW92ZUF0dHJpYnV0ZShjKX19ZWxzZSJ0ZXh0ImluIGImJihhLm5vZGVWYWx1ZT1iLnRleHQpfWVsc2UgYT15LmRvYy5jcmVhdGVFbGVtZW50TlMoVSxhKTtyZXR1cm4gYX1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGI9QS5wcm90b3R5cGUudG9Mb3dlckNhc2UuY2FsbChiKSwiZmluaXRlIj09Yj9pc0Zpbml0ZShhKToiYXJyYXkiPT1iJiYoYSBpbnN0YW5jZW9mIEFycmF5fHxBcnJheS5pc0FycmF5JiZBcnJheS5pc0FycmF5KGEpKT8hMDoibnVsbCI9PWImJm51bGw9PT1hfHxiPT10eXBlb2YgYSYmbnVsbCE9PWF8fCJvYmplY3QiPT1iJiZhPT09T2JqZWN0KGEpfHxKLmNhbGwoYSkuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKT09Yn1mdW5jdGlvbiBmKGEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhfHxPYmplY3QoYSkhPT1hKXJldHVybiBhO3ZhciBiPW5ldyBhLmNvbnN0cnVjdG9yO2Zvcih2YXIgYyBpbiBhKWFbel0oYykmJihiW2NdPWYoYVtjXSkpO3JldHVybiBifWZ1bmN0aW9uIGgoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGEucHVzaChhLnNwbGljZShjLDEpWzBdKX1mdW5jdGlvbiBpKGEsYixjKXtmdW5jdGlvbiBkKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGY9ZS5qb2luKCLikIAiKSxnPWQuY2FjaGU9ZC5jYWNoZXx8e30saT1kLmNvdW50PWQuY291bnR8fFtdO3JldHVybiBnW3pdKGYpPyhoKGksZiksYz9jKGdbZl0pOmdbZl0pOihpLmxlbmd0aD49MWUzJiZkZWxldGUgZ1tpLnNoaWZ0KCldLGkucHVzaChmKSxnW2ZdPWEuYXBwbHkoYixlKSxjP2MoZ1tmXSk6Z1tmXSl9cmV0dXJuIGR9ZnVuY3Rpb24gaihhLGIsYyxkLGUsZil7aWYobnVsbD09ZSl7dmFyIGc9YS1jLGg9Yi1kO3JldHVybiBnfHxoPygxODArMTgwKkQuYXRhbjIoLWgsLWcpL0grMzYwKSUzNjA6MH1yZXR1cm4gaihhLGIsZSxmKS1qKGMsZCxlLGYpfWZ1bmN0aW9uIGsoYSl7cmV0dXJuIGElMzYwKkgvMTgwfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIDE4MCphL0glMzYwfWZ1bmN0aW9uIG0oYSl7dmFyIGI9W107cmV0dXJuIGE9YS5yZXBsYWNlKC8oPzpefFxzKShcdyspXCgoW14pXSspXCkvZyxmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQ9ZC5zcGxpdCgvXHMqLFxzKnxccysvKSwicm90YXRlIj09YyYmMT09ZC5sZW5ndGgmJmQucHVzaCgwLDApLCJzY2FsZSI9PWMmJihkLmxlbmd0aD4yP2Q9ZC5zbGljZSgwLDIpOjI9PWQubGVuZ3RoJiZkLnB1c2goMCwwKSwxPT1kLmxlbmd0aCYmZC5wdXNoKGRbMF0sMCwwKSksInNrZXdYIj09Yz9iLnB1c2goWyJtIiwxLDAsRC50YW4oayhkWzBdKSksMSwwLDBdKToic2tld1kiPT1jP2IucHVzaChbIm0iLDEsRC50YW4oayhkWzBdKSksMCwxLDAsMF0pOmIucHVzaChbYy5jaGFyQXQoMCldLmNvbmNhdChkKSksYX0pLGJ9ZnVuY3Rpb24gbihhLGIpe3ZhciBkPWFhKGEpLGU9bmV3IGMuTWF0cml4O2lmKGQpZm9yKHZhciBmPTAsZz1kLmxlbmd0aDtnPmY7ZisrKXt2YXIgaCxpLGosayxsLG09ZFtmXSxuPW0ubGVuZ3RoLG89QShtWzBdKS50b0xvd2VyQ2FzZSgpLHA9bVswXSE9byxxPXA/ZS5pbnZlcnQoKTowOyJ0Ij09byYmMj09bj9lLnRyYW5zbGF0ZShtWzFdLDApOiJ0Ij09byYmMz09bj9wPyhoPXEueCgwLDApLGk9cS55KDAsMCksaj1xLngobVsxXSxtWzJdKSxrPXEueShtWzFdLG1bMl0pLGUudHJhbnNsYXRlKGotaCxrLWkpKTplLnRyYW5zbGF0ZShtWzFdLG1bMl0pOiJyIj09bz8yPT1uPyhsPWx8fGIsZS5yb3RhdGUobVsxXSxsLngrbC53aWR0aC8yLGwueStsLmhlaWdodC8yKSk6ND09biYmKHA/KGo9cS54KG1bMl0sbVszXSksaz1xLnkobVsyXSxtWzNdKSxlLnJvdGF0ZShtWzFdLGosaykpOmUucm90YXRlKG1bMV0sbVsyXSxtWzNdKSk6InMiPT1vPzI9PW58fDM9PW4/KGw9bHx8YixlLnNjYWxlKG1bMV0sbVtuLTFdLGwueCtsLndpZHRoLzIsbC55K2wuaGVpZ2h0LzIpKTo0PT1uP3A/KGo9cS54KG1bMl0sbVszXSksaz1xLnkobVsyXSxtWzNdKSxlLnNjYWxlKG1bMV0sbVsxXSxqLGspKTplLnNjYWxlKG1bMV0sbVsxXSxtWzJdLG1bM10pOjU9PW4mJihwPyhqPXEueChtWzNdLG1bNF0pLGs9cS55KG1bM10sbVs0XSksZS5zY2FsZShtWzFdLG1bMl0saixrKSk6ZS5zY2FsZShtWzFdLG1bMl0sbVszXSxtWzRdKSk6Im0iPT1vJiY3PT1uJiZlLmFkZChtWzFdLG1bMl0sbVszXSxtWzRdLG1bNV0sbVs2XSl9cmV0dXJuIGV9ZnVuY3Rpb24gbyhhKXt2YXIgYj1hLm5vZGUub3duZXJTVkdFbGVtZW50JiZ3KGEubm9kZS5vd25lclNWR0VsZW1lbnQpfHxhLm5vZGUucGFyZW50Tm9kZSYmdyhhLm5vZGUucGFyZW50Tm9kZSl8fGMuc2VsZWN0KCJzdmciKXx8YygwLDApLGQ9Yi5zZWxlY3QoImRlZnMiKSxlPW51bGw9PWQ/ITE6ZC5ub2RlO3JldHVybiBlfHwoZT11KCJkZWZzIixiLm5vZGUpLm5vZGUpLGV9ZnVuY3Rpb24gcChhKXtyZXR1cm4gYS5ub2RlLm93bmVyU1ZHRWxlbWVudCYmdyhhLm5vZGUub3duZXJTVkdFbGVtZW50KXx8Yy5zZWxlY3QoInN2ZyIpfWZ1bmN0aW9uIHEoYSxiLGMpe2Z1bmN0aW9uIGUoYSl7aWYobnVsbD09YSlyZXR1cm4gSTtpZihhPT0rYSlyZXR1cm4gYTtkKGose3dpZHRoOmF9KTt0cnl7cmV0dXJuIGouZ2V0QkJveCgpLndpZHRofWNhdGNoKGIpe3JldHVybiAwfX1mdW5jdGlvbiBmKGEpe2lmKG51bGw9PWEpcmV0dXJuIEk7aWYoYT09K2EpcmV0dXJuIGE7ZChqLHtoZWlnaHQ6YX0pO3RyeXtyZXR1cm4gai5nZXRCQm94KCkuaGVpZ2h0fWNhdGNoKGIpe3JldHVybiAwfX1mdW5jdGlvbiBnKGQsZSl7bnVsbD09Yj9pW2RdPWUoYS5hdHRyKGQpfHwwKTpkPT1iJiYoaT1lKG51bGw9PWM/YS5hdHRyKGQpfHwwOmMpKX12YXIgaD1wKGEpLm5vZGUsaT17fSxqPWgucXVlcnlTZWxlY3RvcigiLnN2Zy0tLW1nciIpO3N3aXRjaChqfHwoaj1kKCJyZWN0IiksZChqLHt4Oi05ZTkseTotOWU5LHdpZHRoOjEwLGhlaWdodDoxMCwiY2xhc3MiOiJzdmctLS1tZ3IiLGZpbGw6Im5vbmUifSksaC5hcHBlbmRDaGlsZChqKSksYS50eXBlKXtjYXNlInJlY3QiOmcoInJ4IixlKSxnKCJyeSIsZik7Y2FzZSJpbWFnZSI6Zygid2lkdGgiLGUpLGcoImhlaWdodCIsZik7Y2FzZSJ0ZXh0IjpnKCJ4IixlKSxnKCJ5IixmKTticmVhaztjYXNlImNpcmNsZSI6ZygiY3giLGUpLGcoImN5IixmKSxnKCJyIixlKTticmVhaztjYXNlImVsbGlwc2UiOmcoImN4IixlKSxnKCJjeSIsZiksZygicngiLGUpLGcoInJ5IixmKTticmVhaztjYXNlImxpbmUiOmcoIngxIixlKSxnKCJ4MiIsZSksZygieTEiLGYpLGcoInkyIixmKTticmVhaztjYXNlIm1hcmtlciI6ZygicmVmWCIsZSksZygibWFya2VyV2lkdGgiLGUpLGcoInJlZlkiLGYpLGcoIm1hcmtlckhlaWdodCIsZik7YnJlYWs7Y2FzZSJyYWRpYWxHcmFkaWVudCI6ZygiZngiLGUpLGcoImZ5IixmKTticmVhaztjYXNlInRzcGFuIjpnKCJkeCIsZSksZygiZHkiLGYpO2JyZWFrO2RlZmF1bHQ6ZyhiLGUpfXJldHVybiBoLnJlbW92ZUNoaWxkKGopLGl9ZnVuY3Rpb24gcihhKXtlKGEsImFycmF5Iil8fChhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSk7Zm9yKHZhciBiPTAsYz0wLGQ9dGhpcy5ub2RlO3RoaXNbYl07KWRlbGV0ZSB0aGlzW2IrK107Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKykic2V0Ij09YVtiXS50eXBlP2FbYl0uZm9yRWFjaChmdW5jdGlvbihhKXtkLmFwcGVuZENoaWxkKGEubm9kZSl9KTpkLmFwcGVuZENoaWxkKGFbYl0ubm9kZSk7dmFyIGY9ZC5jaGlsZE5vZGVzO2ZvcihiPTA7YjxmLmxlbmd0aDtiKyspdGhpc1tjKytdPXcoZltiXSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gcyhhKXtpZihhLnNuYXAgaW4gVilyZXR1cm4gVlthLnNuYXBdO3ZhciBiO3RyeXtiPWEub3duZXJTVkdFbGVtZW50fWNhdGNoKGMpe310aGlzLm5vZGU9YSxiJiYodGhpcy5wYXBlcj1uZXcgdihiKSksdGhpcy50eXBlPWEudGFnTmFtZXx8YS5ub2RlTmFtZTt2YXIgZD10aGlzLmlkPVModGhpcyk7aWYodGhpcy5hbmltcz17fSx0aGlzLl89e3RyYW5zZm9ybTpbXX0sYS5zbmFwPWQsVltkXT10aGlzLCJnIj09dGhpcy50eXBlJiYodGhpcy5hZGQ9ciksdGhpcy50eXBlIGlue2c6MSxtYXNrOjEscGF0dGVybjoxLHN5bWJvbDoxfSlmb3IodmFyIGUgaW4gdi5wcm90b3R5cGUpdi5wcm90b3R5cGVbel0oZSkmJih0aGlzW2VdPXYucHJvdG90eXBlW2VdKX1mdW5jdGlvbiB0KGEpe3RoaXMubm9kZT1hfWZ1bmN0aW9uIHUoYSxiKXt2YXIgYz1kKGEpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9dyhjKTtyZXR1cm4gZX1mdW5jdGlvbiB2KGEsYil7dmFyIGMsZSxmLGc9di5wcm90b3R5cGU7aWYoYSYmYS50YWdOYW1lJiYic3ZnIj09YS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpe2lmKGEuc25hcCBpbiBWKXJldHVybiBWW2Euc25hcF07dmFyIGg9YS5vd25lckRvY3VtZW50O2M9bmV3IHMoYSksZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkZXNjIilbMF0sZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkZWZzIilbMF0sZXx8KGU9ZCgiZGVzYyIpLGUuYXBwZW5kQ2hpbGQoaC5jcmVhdGVUZXh0Tm9kZSgiQ3JlYXRlZCB3aXRoIFNuYXAiKSksYy5ub2RlLmFwcGVuZENoaWxkKGUpKSxmfHwoZj1kKCJkZWZzIiksYy5ub2RlLmFwcGVuZENoaWxkKGYpKSxjLmRlZnM9Zjtmb3IodmFyIGkgaW4gZylnW3pdKGkpJiYoY1tpXT1nW2ldKTtjLnBhcGVyPWMucm9vdD1jfWVsc2UgYz11KCJzdmciLHkuZG9jLmJvZHkpLGQoYy5ub2RlLHtoZWlnaHQ6Yix2ZXJzaW9uOjEuMSx3aWR0aDphLHhtbG5zOlV9KTtyZXR1cm4gY31mdW5jdGlvbiB3KGEpe3JldHVybiBhP2EgaW5zdGFuY2VvZiBzfHxhIGluc3RhbmNlb2YgdD9hOmEudGFnTmFtZSYmInN2ZyI9PWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpP25ldyB2KGEpOmEudGFnTmFtZSYmIm9iamVjdCI9PWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpJiYiaW1hZ2Uvc3ZnK3htbCI9PWEudHlwZT9uZXcgdihhLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3ZnIilbMF0pOm5ldyBzKGEpOmF9ZnVuY3Rpb24geChhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKyl7dmFyIGU9e3R5cGU6YVtjXS50eXBlLGF0dHI6YVtjXS5hdHRyKCl9LGY9YVtjXS5jaGlsZHJlbigpO2IucHVzaChlKSxmLmxlbmd0aCYmeChmLGUuY2hpbGROb2Rlcz1bXSl9fWMudmVyc2lvbj0iMC41LjEiLGMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iU25hcCB2Iit0aGlzLnZlcnNpb259LGMuXz17fTt2YXIgeT17d2luOmEud2luZG93LGRvYzphLndpbmRvdy5kb2N1bWVudH07Yy5fLmdsb2I9eTt2YXIgej0iaGFzT3duUHJvcGVydHkiLEE9U3RyaW5nLEI9cGFyc2VGbG9hdCxDPXBhcnNlSW50LEQ9TWF0aCxFPUQubWF4LEY9RC5taW4sRz1ELmFicyxIPShELnBvdyxELlBJKSxJPShELnJvdW5kLCIiKSxKPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsSz0vXlxzKigoI1thLWZcZF17Nn0pfCgjW2EtZlxkXXszfSl8cmdiYT9cKFxzKihbXGRcLl0rJT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSslPyg/OlxzKixccypbXGRcLl0rJT8pPylccypcKXxoc2JhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8lPylccypcKXxoc2xhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8lPylccypcKSlccyokL2ksTD0oYy5fLnNlcGFyYXRvcj0vWyxcc10rLywvW1xzXSosW1xzXSovKSxNPXtoczoxLHJnOjF9LE49LyhbYS16XSlbXHMsXSooKC0/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/W1xzXSosP1tcc10qKSspL2dpLE89LyhbcnN0bV0pW1xzLF0qKCgtP1xkKlwuP1xkKig/OmVbXC0rXT9cZCspP1tcc10qLD9bXHNdKikrKS9naSxQPS8oLT9cZCpcLj9cZCooPzplW1wtK10/XGQrKT8pW1xzXSosP1tcc10qL2dpLFE9MCxSPSJTIisoK25ldyBEYXRlKS50b1N0cmluZygzNiksUz1mdW5jdGlvbihhKXtyZXR1cm4oYSYmYS50eXBlP2EudHlwZTpJKStSKyhRKyspLnRvU3RyaW5nKDM2KX0sVD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsVT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLFY9e307Yy51cmw9ZnVuY3Rpb24oYSl7cmV0dXJuInVybCgnIyIrYSsiJykifTtjLl8uJD1kLGMuXy5pZD1TLGMuZm9ybWF0PWZ1bmN0aW9uKCl7dmFyIGE9L1x7KFteXH1dKylcfS9nLGI9Lyg/Oig/Ol58XC4pKC4rPykoPz1cW3xcLnwkfFwoKXxcWygnfCIpKC4rPylcMlxdKShcKFwpKT8vZyxjPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1kO3JldHVybiBjLnJlcGxhY2UoYixmdW5jdGlvbihhLGIsYyxkLGYpe2I9Ynx8ZCxlJiYoYiBpbiBlJiYoZT1lW2JdKSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmZiYmKGU9ZSgpKSl9KSxlPShudWxsPT1lfHxlPT1kP2E6ZSkrIiJ9O3JldHVybiBmdW5jdGlvbihiLGQpe3JldHVybiBBKGIpLnJlcGxhY2UoYSxmdW5jdGlvbihhLGIpe3JldHVybiBjKGEsYixkKX0pfX0oKSxjLl8uY2xvbmU9ZixjLl8uY2FjaGVyPWksYy5yYWQ9ayxjLmRlZz1sLGMuc2luPWZ1bmN0aW9uKGEpe3JldHVybiBELnNpbihjLnJhZChhKSl9LGMudGFuPWZ1bmN0aW9uKGEpe3JldHVybiBELnRhbihjLnJhZChhKSl9LGMuY29zPWZ1bmN0aW9uKGEpe3JldHVybiBELmNvcyhjLnJhZChhKSl9LGMuYXNpbj1mdW5jdGlvbihhKXtyZXR1cm4gYy5kZWcoRC5hc2luKGEpKX0sYy5hY29zPWZ1bmN0aW9uKGEpe3JldHVybiBjLmRlZyhELmFjb3MoYSkpfSxjLmF0YW49ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGVnKEQuYXRhbihhKSl9LGMuYXRhbjI9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGVnKEQuYXRhbjIoYSkpfSxjLmFuZ2xlPWosYy5sZW49ZnVuY3Rpb24oYSxiLGQsZSl7cmV0dXJuIE1hdGguc3FydChjLmxlbjIoYSxiLGQsZSkpfSxjLmxlbjI9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKGEtYykqKGEtYykrKGItZCkqKGItZCl9LGMuY2xvc2VzdFBvaW50PWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBkPWEueC1iLGU9YS55LWM7cmV0dXJuIGQqZCtlKmV9Zm9yKHZhciBlLGYsZyxoLGk9YS5ub2RlLGo9aS5nZXRUb3RhbExlbmd0aCgpLGs9ai9pLnBhdGhTZWdMaXN0Lm51bWJlck9mSXRlbXMqLjEyNSxsPTEvMCxtPTA7aj49bTttKz1rKShoPWQoZz1pLmdldFBvaW50QXRMZW5ndGgobSkpKTxsJiYoZT1nLGY9bSxsPWgpO2ZvcihrKj0uNTtrPi41Oyl7dmFyIG4sbyxwLHEscixzOyhwPWYtayk+PTAmJihyPWQobj1pLmdldFBvaW50QXRMZW5ndGgocCkpKTxsPyhlPW4sZj1wLGw9cik6KHE9ZitrKTw9aiYmKHM9ZChvPWkuZ2V0UG9pbnRBdExlbmd0aChxKSkpPGw/KGU9byxmPXEsbD1zKTprKj0uNX1yZXR1cm4gZT17eDplLngseTplLnksbGVuZ3RoOmYsZGlzdGFuY2U6TWF0aC5zcXJ0KGwpfX0sYy5pcz1lLGMuc25hcFRvPWZ1bmN0aW9uKGEsYixjKXtpZihjPWUoYywiZmluaXRlIik/YzoxMCxlKGEsImFycmF5Iikpe2Zvcih2YXIgZD1hLmxlbmd0aDtkLS07KWlmKEcoYVtkXS1iKTw9YylyZXR1cm4gYVtkXX1lbHNle2E9K2E7dmFyIGY9YiVhO2lmKGM+ZilyZXR1cm4gYi1mO2lmKGY+YS1jKXJldHVybiBiLWYrYX1yZXR1cm4gYn0sYy5nZXRSR0I9aShmdW5jdGlvbihhKXtpZighYXx8KGE9QShhKSkuaW5kZXhPZigiLSIpKzEpcmV0dXJue3I6LTEsZzotMSxiOi0xLGhleDoibm9uZSIsZXJyb3I6MSx0b1N0cmluZzpafTtpZigibm9uZSI9PWEpcmV0dXJue3I6LTEsZzotMSxiOi0xLGhleDoibm9uZSIsdG9TdHJpbmc6Wn07aWYoIShNW3pdKGEudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMCwyKSl8fCIjIj09YS5jaGFyQXQoKSkmJihhPVcoYSkpLCFhKXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLGVycm9yOjEsdG9TdHJpbmc6Wn07dmFyIGIsZCxmLGcsaCxpLGo9YS5tYXRjaChLKTtyZXR1cm4gaj8oalsyXSYmKGY9QyhqWzJdLnN1YnN0cmluZyg1KSwxNiksZD1DKGpbMl0uc3Vic3RyaW5nKDMsNSksMTYpLGI9QyhqWzJdLnN1YnN0cmluZygxLDMpLDE2KSksalszXSYmKGY9QygoaD1qWzNdLmNoYXJBdCgzKSkraCwxNiksZD1DKChoPWpbM10uY2hhckF0KDIpKStoLDE2KSxiPUMoKGg9alszXS5jaGFyQXQoMSkpK2gsMTYpKSxqWzRdJiYoaT1qWzRdLnNwbGl0KEwpLGI9QihpWzBdKSwiJSI9PWlbMF0uc2xpY2UoLTEpJiYoYio9Mi41NSksZD1CKGlbMV0pLCIlIj09aVsxXS5zbGljZSgtMSkmJihkKj0yLjU1KSxmPUIoaVsyXSksIiUiPT1pWzJdLnNsaWNlKC0xKSYmKGYqPTIuNTUpLCJyZ2JhIj09alsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihnPUIoaVszXSkpLGlbM10mJiIlIj09aVszXS5zbGljZSgtMSkmJihnLz0xMDApKSxqWzVdPyhpPWpbNV0uc3BsaXQoTCksYj1CKGlbMF0pLCIlIj09aVswXS5zbGljZSgtMSkmJihiLz0xMDApLGQ9QihpWzFdKSwiJSI9PWlbMV0uc2xpY2UoLTEpJiYoZC89MTAwKSxmPUIoaVsyXSksIiUiPT1pWzJdLnNsaWNlKC0xKSYmKGYvPTEwMCksKCJkZWciPT1pWzBdLnNsaWNlKC0zKXx8IsKwIj09aVswXS5zbGljZSgtMSkpJiYoYi89MzYwKSwiaHNiYSI9PWpbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpJiYoZz1CKGlbM10pKSxpWzNdJiYiJSI9PWlbM10uc2xpY2UoLTEpJiYoZy89MTAwKSxjLmhzYjJyZ2IoYixkLGYsZykpOmpbNl0/KGk9als2XS5zcGxpdChMKSxiPUIoaVswXSksIiUiPT1pWzBdLnNsaWNlKC0xKSYmKGIvPTEwMCksZD1CKGlbMV0pLCIlIj09aVsxXS5zbGljZSgtMSkmJihkLz0xMDApLGY9QihpWzJdKSwiJSI9PWlbMl0uc2xpY2UoLTEpJiYoZi89MTAwKSwoImRlZyI9PWlbMF0uc2xpY2UoLTMpfHwiwrAiPT1pWzBdLnNsaWNlKC0xKSkmJihiLz0zNjApLCJoc2xhIj09alsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihnPUIoaVszXSkpLGlbM10mJiIlIj09aVszXS5zbGljZSgtMSkmJihnLz0xMDApLGMuaHNsMnJnYihiLGQsZixnKSk6KGI9RihELnJvdW5kKGIpLDI1NSksZD1GKEQucm91bmQoZCksMjU1KSxmPUYoRC5yb3VuZChmKSwyNTUpLGc9RihFKGcsMCksMSksaj17cjpiLGc6ZCxiOmYsdG9TdHJpbmc6Wn0sai5oZXg9IiMiKygxNjc3NzIxNnxmfGQ8PDh8Yjw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKSxqLm9wYWNpdHk9ZShnLCJmaW5pdGUiKT9nOjEsaikpOntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLGVycm9yOjEsdG9TdHJpbmc6Wn19LGMpLGMuaHNiPWkoZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmhzYjJyZ2IoYSxiLGQpLmhleH0pLGMuaHNsPWkoZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmhzbDJyZ2IoYSxiLGQpLmhleH0pLGMucmdiPWkoZnVuY3Rpb24oYSxiLGMsZCl7aWYoZShkLCJmaW5pdGUiKSl7dmFyIGY9RC5yb3VuZDtyZXR1cm4icmdiYSgiK1tmKGEpLGYoYiksZihjKSwrZC50b0ZpeGVkKDIpXSsiKSJ9cmV0dXJuIiMiKygxNjc3NzIxNnxjfGI8PDh8YTw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0pO3ZhciBXPWZ1bmN0aW9uKGEpe3ZhciBiPXkuZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fHkuZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdmciKVswXSxjPSJyZ2IoMjU1LCAwLCAwKSI7cmV0dXJuKFc9aShmdW5jdGlvbihhKXtpZigicmVkIj09YS50b0xvd2VyQ2FzZSgpKXJldHVybiBjO2Iuc3R5bGUuY29sb3I9YyxiLnN0eWxlLmNvbG9yPWE7dmFyIGQ9eS5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLEkpLmdldFByb3BlcnR5VmFsdWUoImNvbG9yIik7cmV0dXJuIGQ9PWM/bnVsbDpkfSkpKGEpfSxYPWZ1bmN0aW9uKCl7cmV0dXJuImhzYigiK1t0aGlzLmgsdGhpcy5zLHRoaXMuYl0rIikifSxZPWZ1bmN0aW9uKCl7cmV0dXJuImhzbCgiK1t0aGlzLmgsdGhpcy5zLHRoaXMubF0rIikifSxaPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PXRoaXMub3BhY2l0eXx8bnVsbD09dGhpcy5vcGFjaXR5P3RoaXMuaGV4OiJyZ2JhKCIrW3RoaXMucix0aGlzLmcsdGhpcy5iLHRoaXMub3BhY2l0eV0rIikifSwkPWZ1bmN0aW9uKGEsYixkKXtpZihudWxsPT1iJiZlKGEsIm9iamVjdCIpJiYiciJpbiBhJiYiZyJpbiBhJiYiYiJpbiBhJiYoZD1hLmIsYj1hLmcsYT1hLnIpLG51bGw9PWImJmUoYSxzdHJpbmcpKXt2YXIgZj1jLmdldFJHQihhKTthPWYucixiPWYuZyxkPWYuYn1yZXR1cm4oYT4xfHxiPjF8fGQ+MSkmJihhLz0yNTUsYi89MjU1LGQvPTI1NSksW2EsYixkXX0sXz1mdW5jdGlvbihhLGIsZCxmKXthPUQucm91bmQoMjU1KmEpLGI9RC5yb3VuZCgyNTUqYiksZD1ELnJvdW5kKDI1NSpkKTt2YXIgZz17cjphLGc6YixiOmQsb3BhY2l0eTplKGYsImZpbml0ZSIpP2Y6MSxoZXg6Yy5yZ2IoYSxiLGQpLHRvU3RyaW5nOlp9O3JldHVybiBlKGYsImZpbml0ZSIpJiYoZy5vcGFjaXR5PWYpLGd9O2MuY29sb3I9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGUoYSwib2JqZWN0IikmJiJoImluIGEmJiJzImluIGEmJiJiImluIGE/KGI9Yy5oc2IycmdiKGEpLGEucj1iLnIsYS5nPWIuZyxhLmI9Yi5iLGEub3BhY2l0eT0xLGEuaGV4PWIuaGV4KTplKGEsIm9iamVjdCIpJiYiaCJpbiBhJiYicyJpbiBhJiYibCJpbiBhPyhiPWMuaHNsMnJnYihhKSxhLnI9Yi5yLGEuZz1iLmcsYS5iPWIuYixhLm9wYWNpdHk9MSxhLmhleD1iLmhleCk6KGUoYSwic3RyaW5nIikmJihhPWMuZ2V0UkdCKGEpKSxlKGEsIm9iamVjdCIpJiYiciJpbiBhJiYiZyJpbiBhJiYiYiJpbiBhJiYhKCJlcnJvciJpbiBhKT8oYj1jLnJnYjJoc2woYSksYS5oPWIuaCxhLnM9Yi5zLGEubD1iLmwsYj1jLnJnYjJoc2IoYSksYS52PWIuYik6KGE9e2hleDoibm9uZSJ9LGEucj1hLmc9YS5iPWEuaD1hLnM9YS52PWEubD0tMSxhLmVycm9yPTEpKSxhLnRvU3RyaW5nPVosYX0sYy5oc2IycmdiPWZ1bmN0aW9uKGEsYixjLGQpe2UoYSwib2JqZWN0IikmJiJoImluIGEmJiJzImluIGEmJiJiImluIGEmJihjPWEuYixiPWEucyxkPWEubyxhPWEuaCksYSo9MzYwO3ZhciBmLGcsaCxpLGo7cmV0dXJuIGE9YSUzNjAvNjAsaj1jKmIsaT1qKigxLUcoYSUyLTEpKSxmPWc9aD1jLWosYT1+fmEsZis9W2osaSwwLDAsaSxqXVthXSxnKz1baSxqLGosaSwwLDBdW2FdLGgrPVswLDAsaSxqLGosaV1bYV0sXyhmLGcsaCxkKX0sYy5oc2wycmdiPWZ1bmN0aW9uKGEsYixjLGQpe2UoYSwib2JqZWN0IikmJiJoImluIGEmJiJzImluIGEmJiJsImluIGEmJihjPWEubCxiPWEucyxhPWEuaCksKGE+MXx8Yj4xfHxjPjEpJiYoYS89MzYwLGIvPTEwMCxjLz0xMDApLGEqPTM2MDt2YXIgZixnLGgsaSxqO3JldHVybiBhPWElMzYwLzYwLGo9MipiKiguNT5jP2M6MS1jKSxpPWoqKDEtRyhhJTItMSkpLGY9Zz1oPWMtai8yLGE9fn5hLGYrPVtqLGksMCwwLGksal1bYV0sZys9W2ksaixqLGksMCwwXVthXSxoKz1bMCwwLGksaixqLGldW2FdLF8oZixnLGgsZCl9LGMucmdiMmhzYj1mdW5jdGlvbihhLGIsYyl7Yz0kKGEsYixjKSxhPWNbMF0sYj1jWzFdLGM9Y1syXTt2YXIgZCxlLGYsZztyZXR1cm4gZj1FKGEsYixjKSxnPWYtRihhLGIsYyksZD0wPT1nP251bGw6Zj09YT8oYi1jKS9nOmY9PWI/KGMtYSkvZysyOihhLWIpL2crNCxkPShkKzM2MCklNio2MC8zNjAsZT0wPT1nPzA6Zy9mLHtoOmQsczplLGI6Zix0b1N0cmluZzpYfX0sYy5yZ2IyaHNsPWZ1bmN0aW9uKGEsYixjKXtjPSQoYSxiLGMpLGE9Y1swXSxiPWNbMV0sYz1jWzJdO3ZhciBkLGUsZixnLGgsaTtyZXR1cm4gZz1FKGEsYixjKSxoPUYoYSxiLGMpLGk9Zy1oLGQ9MD09aT9udWxsOmc9PWE/KGItYykvaTpnPT1iPyhjLWEpL2krMjooYS1iKS9pKzQsZD0oZCszNjApJTYqNjAvMzYwLGY9KGcraCkvMixlPTA9PWk/MDouNT5mP2kvKDIqZik6aS8oMi0yKmYpLHtoOmQsczplLGw6Zix0b1N0cmluZzpZfX0sYy5wYXJzZVBhdGhTdHJpbmc9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGI9Yy5wYXRoKGEpO2lmKGIuYXJyKXJldHVybiBjLnBhdGguY2xvbmUoYi5hcnIpO3ZhciBkPXthOjcsYzo2LG86MixoOjEsbDoyLG06MixyOjQscTo0LHM6NCx0OjIsdjoxLHU6Myx6OjB9LGY9W107cmV0dXJuIGUoYSwiYXJyYXkiKSYmZShhWzBdLCJhcnJheSIpJiYoZj1jLnBhdGguY2xvbmUoYSkpLGYubGVuZ3RofHxBKGEpLnJlcGxhY2UoTixmdW5jdGlvbihhLGIsYyl7dmFyIGU9W10sZz1iLnRvTG93ZXJDYXNlKCk7aWYoYy5yZXBsYWNlKFAsZnVuY3Rpb24oYSxiKXtiJiZlLnB1c2goK2IpfSksIm0iPT1nJiZlLmxlbmd0aD4yJiYoZi5wdXNoKFtiXS5jb25jYXQoZS5zcGxpY2UoMCwyKSkpLGc9ImwiLGI9Im0iPT1iPyJsIjoiTCIpLCJvIj09ZyYmMT09ZS5sZW5ndGgmJmYucHVzaChbYixlWzBdXSksInIiPT1nKWYucHVzaChbYl0uY29uY2F0KGUpKTtlbHNlIGZvcig7ZS5sZW5ndGg+PWRbZ10mJihmLnB1c2goW2JdLmNvbmNhdChlLnNwbGljZSgwLGRbZ10pKSksZFtnXSk7KTt9KSxmLnRvU3RyaW5nPWMucGF0aC50b1N0cmluZyxiLmFycj1jLnBhdGguY2xvbmUoZiksZn07dmFyIGFhPWMucGFyc2VUcmFuc2Zvcm1TdHJpbmc9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGI9W107cmV0dXJuIGUoYSwiYXJyYXkiKSYmZShhWzBdLCJhcnJheSIpJiYoYj1jLnBhdGguY2xvbmUoYSkpLGIubGVuZ3RofHxBKGEpLnJlcGxhY2UoTyxmdW5jdGlvbihhLGMsZCl7dmFyIGU9W107Yy50b0xvd2VyQ2FzZSgpO2QucmVwbGFjZShQLGZ1bmN0aW9uKGEsYil7YiYmZS5wdXNoKCtiKX0pLGIucHVzaChbY10uY29uY2F0KGUpKX0pLGIudG9TdHJpbmc9Yy5wYXRoLnRvU3RyaW5nLGJ9O2MuXy5zdmdUcmFuc2Zvcm0yc3RyaW5nPW0sYy5fLnJnVHJhbnNmb3JtPS9eW2Etel1bXHNdKi0/XC4/XGQvaSxjLl8udHJhbnNmb3JtMm1hdHJpeD1uLGMuX3VuaXQycHg9cTt5LmRvYy5jb250YWluc3x8eS5kb2MuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PWR8fCEoIWR8fDEhPWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKWZvcig7YjspaWYoYj1iLnBhcmVudE5vZGUsYj09YSlyZXR1cm4hMDtyZXR1cm4hMX07Yy5fLmdldFNvbWVEZWZzPW8sYy5fLmdldFNvbWVTVkc9cCxjLnNlbGVjdD1mdW5jdGlvbihhKXtyZXR1cm4gYT1BKGEpLnJlcGxhY2UoLyhbXlxcXSk6L2csIiQxXFw6Iiksdyh5LmRvYy5xdWVyeVNlbGVjdG9yKGEpKX0sYy5zZWxlY3RBbGw9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXkuZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoYSksZD0oYy5zZXR8fEFycmF5KSgpLGU9MDtlPGIubGVuZ3RoO2UrKylkLnB1c2godyhiW2VdKSk7cmV0dXJuIGR9LHNldEludGVydmFsKGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFYpaWYoVlt6XShhKSl7dmFyIGI9VlthXSxjPWIubm9kZTsoInN2ZyIhPWIudHlwZSYmIWMub3duZXJTVkdFbGVtZW50fHwic3ZnIj09Yi50eXBlJiYoIWMucGFyZW50Tm9kZXx8Im93bmVyU1ZHRWxlbWVudCJpbiBjLnBhcmVudE5vZGUmJiFjLm93bmVyU1ZHRWxlbWVudCkpJiZkZWxldGUgVlthXX19LDFlNCkscy5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMsZj1kLm5vZGU7aWYoIWEpe2lmKDEhPWYubm9kZVR5cGUpcmV0dXJue3RleHQ6Zi5ub2RlVmFsdWV9O2Zvcih2YXIgZz1mLmF0dHJpYnV0ZXMsaD17fSxpPTAsaj1nLmxlbmd0aDtqPmk7aSsrKWhbZ1tpXS5ub2RlTmFtZV09Z1tpXS5ub2RlVmFsdWU7cmV0dXJuIGh9aWYoZShhLCJzdHJpbmciKSl7aWYoIShhcmd1bWVudHMubGVuZ3RoPjEpKXJldHVybiBiKCJzbmFwLnV0aWwuZ2V0YXR0ci4iK2EsZCkuZmlyc3REZWZpbmVkKCk7dmFyIGs9e307a1thXT1jLGE9a31mb3IodmFyIGwgaW4gYSlhW3pdKGwpJiZiKCJzbmFwLnV0aWwuYXR0ci4iK2wsZCxhW2xdKTtyZXR1cm4gZH0sYy5wYXJzZT1mdW5jdGlvbihhKXt2YXIgYj15LmRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYz0hMCxkPXkuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKGE9QShhKSxhLm1hdGNoKC9eXHMqPFxzKnN2Zyg/OlxzfD4pLyl8fChhPSI8c3ZnPiIrYSsiPC9zdmc+IixjPSExKSxkLmlubmVySFRNTD1hLGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3ZnIilbMF0paWYoYyliPWE7ZWxzZSBmb3IoO2EuZmlyc3RDaGlsZDspYi5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO3JldHVybiBuZXcgdChiKX0sYy5mcmFnbWVudD1mdW5jdGlvbigpe2Zvcih2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksYj15LmRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyl7dmFyIGY9YVtkXTtmLm5vZGUmJmYubm9kZS5ub2RlVHlwZSYmYi5hcHBlbmRDaGlsZChmLm5vZGUpLGYubm9kZVR5cGUmJmIuYXBwZW5kQ2hpbGQoZiksInN0cmluZyI9PXR5cGVvZiBmJiZiLmFwcGVuZENoaWxkKGMucGFyc2UoZikubm9kZSl9cmV0dXJuIG5ldyB0KGIpfSxjLl8ubWFrZT11LGMuXy53cmFwPXcsdi5wcm90b3R5cGUuZWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz11KGEsdGhpcy5ub2RlKTtyZXR1cm4gYiYmYy5hdHRyKGIpLGN9LHMucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9dGhpcy5ub2RlLmNoaWxkTm9kZXMsZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylhW2RdPWMoYltkXSk7cmV0dXJuIGF9LHMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB4KFt0aGlzXSxhKSxhWzBdfSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ciIsZnVuY3Rpb24oKXt2YXIgYT1iLm50KCk7YT1hLnN1YnN0cmluZyhhLmxhc3RJbmRleE9mKCIuIikrMSk7dmFyIGM9YS5yZXBsYWNlKC9bQS1aXS9nLGZ1bmN0aW9uKGEpe3JldHVybiItIithLnRvTG93ZXJDYXNlKCl9KTtyZXR1cm4gYmFbel0oYyk/dGhpcy5ub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShjKTpkKHRoaXMubm9kZSxhKX0pO3ZhciBiYT17ImFsaWdubWVudC1iYXNlbGluZSI6MCwiYmFzZWxpbmUtc2hpZnQiOjAsY2xpcDowLCJjbGlwLXBhdGgiOjAsImNsaXAtcnVsZSI6MCxjb2xvcjowLCJjb2xvci1pbnRlcnBvbGF0aW9uIjowLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiOjAsImNvbG9yLXByb2ZpbGUiOjAsImNvbG9yLXJlbmRlcmluZyI6MCxjdXJzb3I6MCxkaXJlY3Rpb246MCxkaXNwbGF5OjAsImRvbWluYW50LWJhc2VsaW5lIjowLCJlbmFibGUtYmFja2dyb3VuZCI6MCxmaWxsOjAsImZpbGwtb3BhY2l0eSI6MCwiZmlsbC1ydWxlIjowLGZpbHRlcjowLCJmbG9vZC1jb2xvciI6MCwiZmxvb2Qtb3BhY2l0eSI6MCxmb250OjAsImZvbnQtZmFtaWx5IjowLCJmb250LXNpemUiOjAsImZvbnQtc2l6ZS1hZGp1c3QiOjAsImZvbnQtc3RyZXRjaCI6MCwiZm9udC1zdHlsZSI6MCwiZm9udC12YXJpYW50IjowLCJmb250LXdlaWdodCI6MCwiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCI6MCwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiOjAsImltYWdlLXJlbmRlcmluZyI6MCxrZXJuaW5nOjAsImxldHRlci1zcGFjaW5nIjowLCJsaWdodGluZy1jb2xvciI6MCxtYXJrZXI6MCwibWFya2VyLWVuZCI6MCwibWFya2VyLW1pZCI6MCwibWFya2VyLXN0YXJ0IjowLG1hc2s6MCxvcGFjaXR5OjAsb3ZlcmZsb3c6MCwicG9pbnRlci1ldmVudHMiOjAsInNoYXBlLXJlbmRlcmluZyI6MCwic3RvcC1jb2xvciI6MCwic3RvcC1vcGFjaXR5IjowLHN0cm9rZTowLCJzdHJva2UtZGFzaGFycmF5IjowLCJzdHJva2UtZGFzaG9mZnNldCI6MCwic3Ryb2tlLWxpbmVjYXAiOjAsInN0cm9rZS1saW5lam9pbiI6MCwic3Ryb2tlLW1pdGVybGltaXQiOjAsInN0cm9rZS1vcGFjaXR5IjowLCJzdHJva2Utd2lkdGgiOjAsInRleHQtYW5jaG9yIjowLCJ0ZXh0LWRlY29yYXRpb24iOjAsInRleHQtcmVuZGVyaW5nIjowLCJ1bmljb2RlLWJpZGkiOjAsdmlzaWJpbGl0eTowLCJ3b3JkLXNwYWNpbmciOjAsIndyaXRpbmctbW9kZSI6MH07Yi5vbigic25hcC51dGlsLmF0dHIiLGZ1bmN0aW9uKGEpe3ZhciBjPWIubnQoKSxlPXt9O2M9Yy5zdWJzdHJpbmcoYy5sYXN0SW5kZXhPZigiLiIpKzEpLGVbY109YTt2YXIgZj1jLnJlcGxhY2UoLy0oXHcpL2dpLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX0pLGc9Yy5yZXBsYWNlKC9bQS1aXS9nLGZ1bmN0aW9uKGEpe3JldHVybiItIithLnRvTG93ZXJDYXNlKCl9KTtiYVt6XShnKT90aGlzLm5vZGUuc3R5bGVbZl09bnVsbD09YT9JOmE6ZCh0aGlzLm5vZGUsZSl9KSxmdW5jdGlvbihhKXt9KHYucHJvdG90eXBlKSxjLmFqYXg9ZnVuY3Rpb24oYSxjLGQsZil7dmFyIGc9bmV3IFhNTEh0dHBSZXF1ZXN0LGg9UygpO2lmKGcpe2lmKGUoYywiZnVuY3Rpb24iKSlmPWQsZD1jLGM9bnVsbDtlbHNlIGlmKGUoYywib2JqZWN0Iikpe3ZhciBpPVtdO2Zvcih2YXIgaiBpbiBjKWMuaGFzT3duUHJvcGVydHkoaikmJmkucHVzaChlbmNvZGVVUklDb21wb25lbnQoaikrIj0iK2VuY29kZVVSSUNvbXBvbmVudChjW2pdKSk7Yz1pLmpvaW4oIiYiKX1yZXR1cm4gZy5vcGVuKGM/IlBPU1QiOiJHRVQiLGEsITApLGMmJihnLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpLGcuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikpLGQmJihiLm9uY2UoInNuYXAuYWpheC4iK2grIi4wIixkKSxiLm9uY2UoInNuYXAuYWpheC4iK2grIi4yMDAiLGQpLGIub25jZSgic25hcC5hamF4LiIraCsiLjMwNCIsZCkpLGcub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09Zy5yZWFkeVN0YXRlJiZiKCJzbmFwLmFqYXguIitoKyIuIitnLnN0YXR1cyxmLGcpfSw0PT1nLnJlYWR5U3RhdGU/ZzooZy5zZW5kKGMpLGcpfX0sYy5sb2FkPWZ1bmN0aW9uKGEsYixkKXtjLmFqYXgoYSxmdW5jdGlvbihhKXt2YXIgZT1jLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkP2IuY2FsbChkLGUpOmIoZSl9KX07dmFyIGNhPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1hLm93bmVyRG9jdW1lbnQsZD1jLmJvZHksZT1jLmRvY3VtZW50RWxlbWVudCxmPWUuY2xpZW50VG9wfHxkLmNsaWVudFRvcHx8MCxoPWUuY2xpZW50TGVmdHx8ZC5jbGllbnRMZWZ0fHwwLGk9Yi50b3ArKGcud2luLnBhZ2VZT2Zmc2V0fHxlLnNjcm9sbFRvcHx8ZC5zY3JvbGxUb3ApLWYsaj1iLmxlZnQrKGcud2luLnBhZ2VYT2Zmc2V0fHxlLnNjcm9sbExlZnR8fGQuc2Nyb2xsTGVmdCktaDtyZXR1cm57eTppLHg6an19O3JldHVybiBjLmdldEVsZW1lbnRCeVBvaW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPShjLmNhbnZhcyx5LmRvYy5lbGVtZW50RnJvbVBvaW50KGEsYikpO2lmKHkud2luLm9wZXJhJiYic3ZnIj09ZC50YWdOYW1lKXt2YXIgZT1jYShkKSxmPWQuY3JlYXRlU1ZHUmVjdCgpO2YueD1hLWUueCxmLnk9Yi1lLnksZi53aWR0aD1mLmhlaWdodD0xO3ZhciBnPWQuZ2V0SW50ZXJzZWN0aW9uTGlzdChmLG51bGwpO2cubGVuZ3RoJiYoZD1nW2cubGVuZ3RoLTFdKX1yZXR1cm4gZD93KGQpOm51bGx9LGMucGx1Z2luPWZ1bmN0aW9uKGEpe2EoYyxzLHYseSx0KX0seS53aW4uU25hcD1jLGN9KGF8fHRoaXMpO3JldHVybiBkLnBsdWdpbihmdW5jdGlvbihjLGQsZSxmLGcpe2Z1bmN0aW9uIGgoYSxiKXtpZihudWxsPT1iKXt2YXIgZD0hMDtpZihiPSJsaW5lYXJHcmFkaWVudCI9PWEudHlwZXx8InJhZGlhbEdyYWRpZW50Ij09YS50eXBlP2Eubm9kZS5nZXRBdHRyaWJ1dGUoImdyYWRpZW50VHJhbnNmb3JtIik6InBhdHRlcm4iPT1hLnR5cGU/YS5ub2RlLmdldEF0dHJpYnV0ZSgicGF0dGVyblRyYW5zZm9ybSIpOmEubm9kZS5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpLCFiKXJldHVybiBuZXcgYy5NYXRyaXg7Yj1jLl8uc3ZnVHJhbnNmb3JtMnN0cmluZyhiKX1lbHNlIGI9Yy5fLnJnVHJhbnNmb3JtLnRlc3QoYik/bShiKS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyxhLl8udHJhbnNmb3JtfHwiIik6Yy5fLnN2Z1RyYW5zZm9ybTJzdHJpbmcoYiksbChiLCJhcnJheSIpJiYoYj1jLnBhdGg/Yy5wYXRoLnRvU3RyaW5nLmNhbGwoYik6bShiKSksYS5fLnRyYW5zZm9ybT1iO3ZhciBlPWMuXy50cmFuc2Zvcm0ybWF0cml4KGIsYS5nZXRCQm94KDEpKTtyZXR1cm4gZD9lOnZvaWQoYS5tYXRyaXg9ZSl9ZnVuY3Rpb24gaShhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9byhhLm5vZGUsYik7ZD1kJiZkLm1hdGNoKGcpLGQ9ZCYmZFsyXSxkJiYiIyI9PWQuY2hhckF0KCkmJihkPWQuc3Vic3RyaW5nKDEpLGQmJihpW2RdPShpW2RdfHxbXSkuY29uY2F0KGZ1bmN0aW9uKGQpe3ZhciBlPXt9O2VbYl09Yy51cmwoZCksbyhhLm5vZGUsZSl9KSkpfWZ1bmN0aW9uIGQoYSl7dmFyIGI9byhhLm5vZGUsInhsaW5rOmhyZWYiKTtiJiYiIyI9PWIuY2hhckF0KCkmJihiPWIuc3Vic3RyaW5nKDEpLGImJihpW2JdPShpW2JdfHxbXSkuY29uY2F0KGZ1bmN0aW9uKGIpe2EuYXR0cigieGxpbms6aHJlZiIsIiMiK2IpfSkpKX1mb3IodmFyIGUsZj1hLnNlbGVjdEFsbCgiKiIpLGc9L15ccyp1cmxcKCgifCd8KSguKilcMVwpXHMqJC8saD1bXSxpPXt9LGo9MCxrPWYubGVuZ3RoO2s+ajtqKyspe2U9ZltqXSxiKGUsImZpbGwiKSxiKGUsInN0cm9rZSIpLGIoZSwiZmlsdGVyIiksYihlLCJtYXNrIiksYihlLCJjbGlwLXBhdGgiKSxkKGUpO3ZhciBsPW8oZS5ub2RlLCJpZCIpO2wmJihvKGUubm9kZSx7aWQ6ZS5pZH0pLGgucHVzaCh7b2xkOmwsaWQ6ZS5pZH0pKX1mb3Ioaj0wLGs9aC5sZW5ndGg7az5qO2orKyl7dmFyIG09aVtoW2pdLm9sZF07aWYobSlmb3IodmFyIG49MCxwPW0ubGVuZ3RoO3A+bjtuKyspbVtuXShoW2pdLmlkKX19ZnVuY3Rpb24gaihhKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj1hPyI8Iit0aGlzLnR5cGU6IiIsYz10aGlzLm5vZGUuYXR0cmlidXRlcyxkPXRoaXMubm9kZS5jaGlsZE5vZGVzO2lmKGEpZm9yKHZhciBlPTAsZj1jLmxlbmd0aDtmPmU7ZSsrKWIrPSIgIitjW2VdLm5hbWUrJz0iJytjW2VdLnZhbHVlLnJlcGxhY2UoLyIvZywnXFwiJykrJyInO2lmKGQubGVuZ3RoKXtmb3IoYSYmKGIrPSI+IiksZT0wLGY9ZC5sZW5ndGg7Zj5lO2UrKykzPT1kW2VdLm5vZGVUeXBlP2IrPWRbZV0ubm9kZVZhbHVlOjE9PWRbZV0ubm9kZVR5cGUmJihiKz1zKGRbZV0pLnRvU3RyaW5nKCkpO2EmJihiKz0iPC8iK3RoaXMudHlwZSsiPiIpfWVsc2UgYSYmKGIrPSIvPiIpO3JldHVybiBifX12YXIgaz1kLnByb3RvdHlwZSxsPWMuaXMsbT1TdHJpbmcsbj1jLl91bml0MnB4LG89Yy5fLiQscD1jLl8ubWFrZSxxPWMuXy5nZXRTb21lRGVmcyxyPSJoYXNPd25Qcm9wZXJ0eSIscz1jLl8ud3JhcDtrLmdldEJCb3g9ZnVuY3Rpb24oYSl7aWYoInRzcGFuIj09dGhpcy50eXBlKXJldHVybiBjLl8uYm94KHRoaXMubm9kZS5nZXRDbGllbnRSZWN0cygpLml0ZW0oMCkpO2lmKCFjLk1hdHJpeHx8IWMucGF0aClyZXR1cm4gdGhpcy5ub2RlLmdldEJCb3goKTt2YXIgYj10aGlzLGQ9bmV3IGMuTWF0cml4O2lmKGIucmVtb3ZlZClyZXR1cm4gYy5fLmJveCgpO2Zvcig7InVzZSI9PWIudHlwZTspaWYoYXx8KGQ9ZC5hZGQoYi50cmFuc2Zvcm0oKS5sb2NhbE1hdHJpeC50cmFuc2xhdGUoYi5hdHRyKCJ4Iil8fDAsYi5hdHRyKCJ5Iil8fDApKSksYi5vcmlnaW5hbCliPWIub3JpZ2luYWw7ZWxzZXt2YXIgZT1iLmF0dHIoInhsaW5rOmhyZWYiKTtiPWIub3JpZ2luYWw9Yi5ub2RlLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5zdWJzdHJpbmcoZS5pbmRleE9mKCIjIikrMSkpfXZhciBmPWIuXyxnPWMucGF0aC5nZXRbYi50eXBlXXx8Yy5wYXRoLmdldC5kZWZsdDt0cnl7cmV0dXJuIGE/KGYuYmJveHd0PWc/Yy5wYXRoLmdldEJCb3goYi5yZWFsUGF0aD1nKGIpKTpjLl8uYm94KGIubm9kZS5nZXRCQm94KCkpLGMuXy5ib3goZi5iYm94d3QpKTooYi5yZWFsUGF0aD1nKGIpLGIubWF0cml4PWIudHJhbnNmb3JtKCkubG9jYWxNYXRyaXgsZi5iYm94PWMucGF0aC5nZXRCQm94KGMucGF0aC5tYXAoYi5yZWFsUGF0aCxkLmFkZChiLm1hdHJpeCkpKSxjLl8uYm94KGYuYmJveCkpfWNhdGNoKGgpe3JldHVybiBjLl8uYm94KCl9fTt2YXIgdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZ307ay50cmFuc2Zvcm09ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fO2lmKG51bGw9PWEpe2Zvcih2YXIgZCxlPXRoaXMsZj1uZXcgYy5NYXRyaXgodGhpcy5ub2RlLmdldENUTSgpKSxnPWgodGhpcyksaT1bZ10saj1uZXcgYy5NYXRyaXgsaz1nLnRvVHJhbnNmb3JtU3RyaW5nKCksbD1tKGcpPT1tKHRoaXMubWF0cml4KT9tKGIudHJhbnNmb3JtKTprOyJzdmciIT1lLnR5cGUmJihlPWUucGFyZW50KCkpOylpLnB1c2goaChlKSk7Zm9yKGQ9aS5sZW5ndGg7ZC0tOylqLmFkZChpW2RdKTtyZXR1cm57c3RyaW5nOmwsZ2xvYmFsTWF0cml4OmYsdG90YWxNYXRyaXg6aixsb2NhbE1hdHJpeDpnLGRpZmZNYXRyaXg6Zi5jbG9uZSgpLmFkZChnLmludmVydCgpKSxnbG9iYWw6Zi50b1RyYW5zZm9ybVN0cmluZygpLHRvdGFsOmoudG9UcmFuc2Zvcm1TdHJpbmcoKSxsb2NhbDprLHRvU3RyaW5nOnR9fXJldHVybiBhIGluc3RhbmNlb2YgYy5NYXRyaXg/KHRoaXMubWF0cml4PWEsdGhpcy5fLnRyYW5zZm9ybT1hLnRvVHJhbnNmb3JtU3RyaW5nKCkpOmgodGhpcyxhKSx0aGlzLm5vZGUmJigibGluZWFyR3JhZGllbnQiPT10aGlzLnR5cGV8fCJyYWRpYWxHcmFkaWVudCI9PXRoaXMudHlwZT9vKHRoaXMubm9kZSx7Z3JhZGllbnRUcmFuc2Zvcm06dGhpcy5tYXRyaXh9KToicGF0dGVybiI9PXRoaXMudHlwZT9vKHRoaXMubm9kZSx7cGF0dGVyblRyYW5zZm9ybTp0aGlzLm1hdHJpeH0pOm8odGhpcy5ub2RlLHt0cmFuc2Zvcm06dGhpcy5tYXRyaXh9KSksdGhpc30say5wYXJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcyh0aGlzLm5vZGUucGFyZW50Tm9kZSl9LGsuYXBwZW5kPWsuYWRkPWZ1bmN0aW9uKGEpe2lmKGEpe2lmKCJzZXQiPT1hLnR5cGUpe3ZhciBiPXRoaXM7cmV0dXJuIGEuZm9yRWFjaChmdW5jdGlvbihhKXtiLmFkZChhKX0pLHRoaXN9YT1zKGEpLHRoaXMubm9kZS5hcHBlbmRDaGlsZChhLm5vZGUpLGEucGFwZXI9dGhpcy5wYXBlcn1yZXR1cm4gdGhpc30say5hcHBlbmRUbz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmKGE9cyhhKSxhLmFwcGVuZCh0aGlzKSksdGhpc30say5wcmVwZW5kPWZ1bmN0aW9uKGEpe2lmKGEpe2lmKCJzZXQiPT1hLnR5cGUpe3ZhciBiLGM9dGhpcztyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2I/Yi5hZnRlcihhKTpjLnByZXBlbmQoYSksYj1hfSksdGhpc31hPXMoYSk7dmFyIGQ9YS5wYXJlbnQoKTt0aGlzLm5vZGUuaW5zZXJ0QmVmb3JlKGEubm9kZSx0aGlzLm5vZGUuZmlyc3RDaGlsZCksdGhpcy5hZGQmJnRoaXMuYWRkKCksYS5wYXBlcj10aGlzLnBhcGVyLHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkuYWRkKCksZCYmZC5hZGQoKX1yZXR1cm4gdGhpc30say5wcmVwZW5kVG89ZnVuY3Rpb24oYSl7cmV0dXJuIGE9cyhhKSxhLnByZXBlbmQodGhpcyksdGhpc30say5iZWZvcmU9ZnVuY3Rpb24oYSl7aWYoInNldCI9PWEudHlwZSl7dmFyIGI9dGhpcztyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGFyZW50KCk7Yi5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEubm9kZSxiLm5vZGUpLGMmJmMuYWRkKCl9KSx0aGlzLnBhcmVudCgpLmFkZCgpLHRoaXN9YT1zKGEpO3ZhciBjPWEucGFyZW50KCk7cmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLm5vZGUsdGhpcy5ub2RlKSx0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLmFkZCgpLGMmJmMuYWRkKCksYS5wYXBlcj10aGlzLnBhcGVyLHRoaXN9LGsuYWZ0ZXI9ZnVuY3Rpb24oYSl7YT1zKGEpO3ZhciBiPWEucGFyZW50KCk7cmV0dXJuIHRoaXMubm9kZS5uZXh0U2libGluZz90aGlzLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYS5ub2RlLHRoaXMubm9kZS5uZXh0U2libGluZyk6dGhpcy5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYS5ub2RlKSx0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLmFkZCgpLGImJmIuYWRkKCksYS5wYXBlcj10aGlzLnBhcGVyLHRoaXN9LGsuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEpe2E9cyhhKTt2YXIgYj10aGlzLnBhcmVudCgpO3JldHVybiBhLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGEubm9kZSksdGhpcy5wYXBlcj1hLnBhcGVyLGImJmIuYWRkKCksYS5wYXJlbnQoKSYmYS5wYXJlbnQoKS5hZGQoKSx0aGlzfSxrLmluc2VydEFmdGVyPWZ1bmN0aW9uKGEpe2E9cyhhKTt2YXIgYj10aGlzLnBhcmVudCgpO3JldHVybiBhLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGEubm9kZS5uZXh0U2libGluZyksdGhpcy5wYXBlcj1hLnBhcGVyLGImJmIuYWRkKCksYS5wYXJlbnQoKSYmYS5wYXJlbnQoKS5hZGQoKSx0aGlzfSxrLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGFyZW50KCk7cmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlJiZ0aGlzLm5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUpLGRlbGV0ZSB0aGlzLnBhcGVyLHRoaXMucmVtb3ZlZD0hMCxhJiZhLmFkZCgpLHRoaXN9LGsuc2VsZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBzKHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKGEpKX0say5zZWxlY3RBbGw9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMubm9kZS5xdWVyeVNlbGVjdG9yQWxsKGEpLGQ9KGMuc2V0fHxBcnJheSkoKSxlPTA7ZTxiLmxlbmd0aDtlKyspZC5wdXNoKHMoYltlXSkpO3JldHVybiBkfSxrLmFzUFg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YiYmKGI9dGhpcy5hdHRyKGEpKSwrbih0aGlzLGEsYil9LGsudXNlPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLm5vZGUuaWQ7cmV0dXJuIGJ8fChiPXRoaXMuaWQsbyh0aGlzLm5vZGUse2lkOmJ9KSksYT0ibGluZWFyR3JhZGllbnQiPT10aGlzLnR5cGV8fCJyYWRpYWxHcmFkaWVudCI9PXRoaXMudHlwZXx8InBhdHRlcm4iPT10aGlzLnR5cGU/cCh0aGlzLnR5cGUsdGhpcy5ub2RlLnBhcmVudE5vZGUpOnAoInVzZSIsdGhpcy5ub2RlLnBhcmVudE5vZGUpLG8oYS5ub2RlLHsieGxpbms6aHJlZiI6IiMiK2J9KSxhLm9yaWdpbmFsPXRoaXMsYX0say5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPXModGhpcy5ub2RlLmNsb25lTm9kZSghMCkpO3JldHVybiBvKGEubm9kZSwiaWQiKSYmbyhhLm5vZGUse2lkOmEuaWR9KSxpKGEpLGEuaW5zZXJ0QWZ0ZXIodGhpcyksYX0say50b0RlZnM9ZnVuY3Rpb24oKXt2YXIgYT1xKHRoaXMpO3JldHVybiBhLmFwcGVuZENoaWxkKHRoaXMubm9kZSksdGhpc30say5wYXR0ZXJuPWsudG9QYXR0ZXJuPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAoInBhdHRlcm4iLHEodGhpcykpO3JldHVybiBudWxsPT1hJiYoYT10aGlzLmdldEJCb3goKSksbChhLCJvYmplY3QiKSYmIngiaW4gYSYmKGI9YS55LGM9YS53aWR0aCxkPWEuaGVpZ2h0LGE9YS54KSxvKGUubm9kZSx7eDphLHk6Yix3aWR0aDpjLGhlaWdodDpkLHBhdHRlcm5Vbml0czoidXNlclNwYWNlT25Vc2UiLGlkOmUuaWQsdmlld0JveDpbYSxiLGMsZF0uam9pbigiICIpfSksZS5ub2RlLmFwcGVuZENoaWxkKHRoaXMubm9kZSksZX0say5tYXJrZXI9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPXAoIm1hcmtlciIscSh0aGlzKSk7cmV0dXJuIG51bGw9PWEmJihhPXRoaXMuZ2V0QkJveCgpKSxsKGEsIm9iamVjdCIpJiYieCJpbiBhJiYoYj1hLnksYz1hLndpZHRoLGQ9YS5oZWlnaHQsZT1hLnJlZlh8fGEuY3gsZj1hLnJlZll8fGEuY3ksYT1hLngpLG8oZy5ub2RlLHt2aWV3Qm94OlthLGIsYyxkXS5qb2luKCIgIiksbWFya2VyV2lkdGg6YyxtYXJrZXJIZWlnaHQ6ZCxvcmllbnQ6ImF1dG8iLHJlZlg6ZXx8MCxyZWZZOmZ8fDAsaWQ6Zy5pZH0pLGcubm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLGd9O3ZhciB1PXt9O2suZGF0YT1mdW5jdGlvbihhLGQpe3ZhciBlPXVbdGhpcy5pZF09dVt0aGlzLmlkXXx8e307aWYoMD09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYigic25hcC5kYXRhLmdldC4iK3RoaXMuaWQsdGhpcyxlLG51bGwpLGU7aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYy5pcyhhLCJvYmplY3QiKSl7Zm9yKHZhciBmIGluIGEpYVtyXShmKSYmdGhpcy5kYXRhKGYsYVtmXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIoInNuYXAuZGF0YS5nZXQuIit0aGlzLmlkLHRoaXMsZVthXSxhKSxlW2FdfXJldHVybiBlW2FdPWQsYigic25hcC5kYXRhLnNldC4iK3RoaXMuaWQsdGhpcyxkLGEpLHRoaXN9LGsucmVtb3ZlRGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT91W3RoaXMuaWRdPXt9OnVbdGhpcy5pZF0mJmRlbGV0ZSB1W3RoaXMuaWRdW2FdLHRoaXN9LGsub3V0ZXJTVkc9ay50b1N0cmluZz1qKDEpLGsuaW5uZXJTVkc9aigpLGsudG9EYXRhVVJMPWZ1bmN0aW9uKCl7aWYoYSYmYS5idG9hKXt2YXIgYj10aGlzLmdldEJCb3goKSxkPWMuZm9ybWF0KCc8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9Int3aWR0aH0iIGhlaWdodD0ie2hlaWdodH0iIHZpZXdCb3g9Int4fSB7eX0ge3dpZHRofSB7aGVpZ2h0fSI+e2NvbnRlbnRzfTwvc3ZnPicse3g6K2IueC50b0ZpeGVkKDMpLHk6K2IueS50b0ZpeGVkKDMpLHdpZHRoOitiLndpZHRoLnRvRml4ZWQoMyksaGVpZ2h0OitiLmhlaWdodC50b0ZpeGVkKDMpLGNvbnRlbnRzOnRoaXMub3V0ZXJTVkcoKX0pOwpyZXR1cm4iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiK2J0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9fSxnLnByb3RvdHlwZS5zZWxlY3Q9ay5zZWxlY3QsZy5wcm90b3R5cGUuc2VsZWN0QWxsPWsuc2VsZWN0QWxsfSksZC5wbHVnaW4oZnVuY3Rpb24oYSxkLGUsZixnKXtmdW5jdGlvbiBoKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZC5zbGljZShhLGIpO3JldHVybiAxPT1lLmxlbmd0aCYmKGU9ZVswXSksYz9jKGUpOmV9fXZhciBpPWQucHJvdG90eXBlLGo9YS5pcyxrPVN0cmluZyxsPSJoYXNPd25Qcm9wZXJ0eSIsbT1mdW5jdGlvbihhLGIsZCxlKXsiZnVuY3Rpb24iIT10eXBlb2YgZHx8ZC5sZW5ndGh8fChlPWQsZD1jLmxpbmVhciksdGhpcy5hdHRyPWEsdGhpcy5kdXI9YixkJiYodGhpcy5lYXNpbmc9ZCksZSYmKHRoaXMuY2FsbGJhY2s9ZSl9O2EuXy5BbmltYXRpb249bSxhLmFuaW1hdGlvbj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gbmV3IG0oYSxiLGMsZCl9LGkuaW5BbmltPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPVtdO2Zvcih2YXIgYyBpbiBhLmFuaW1zKWEuYW5pbXNbbF0oYykmJiFmdW5jdGlvbihhKXtiLnB1c2goe2FuaW06bmV3IG0oYS5fYXR0cnMsYS5kdXIsYS5lYXNpbmcsYS5fY2FsbGJhY2spLG1pbmE6YSxjdXJTdGF0dXM6YS5zdGF0dXMoKSxzdGF0dXM6ZnVuY3Rpb24oYil7cmV0dXJuIGEuc3RhdHVzKGIpfSxzdG9wOmZ1bmN0aW9uKCl7YS5zdG9wKCl9fSl9KGEuYW5pbXNbY10pO3JldHVybiBifSxhLmFuaW1hdGU9ZnVuY3Rpb24oYSxkLGUsZixnLGgpeyJmdW5jdGlvbiIhPXR5cGVvZiBnfHxnLmxlbmd0aHx8KGg9ZyxnPWMubGluZWFyKTt2YXIgaT1jLnRpbWUoKSxqPWMoYSxkLGksaStmLGMudGltZSxlLGcpO3JldHVybiBoJiZiLm9uY2UoIm1pbmEuZmluaXNoLiIrai5pZCxoKSxqfSxpLnN0b3A9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5pbkFuaW0oKSxiPTAsYz1hLmxlbmd0aDtjPmI7YisrKWFbYl0uc3RvcCgpO3JldHVybiB0aGlzfSxpLmFuaW1hdGU9ZnVuY3Rpb24oYSxkLGUsZil7ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fGUubGVuZ3RofHwoZj1lLGU9Yy5saW5lYXIpLGEgaW5zdGFuY2VvZiBtJiYoZj1hLmNhbGxiYWNrLGU9YS5lYXNpbmcsZD1hLmR1cixhPWEuYXR0cik7dmFyIGcsaSxuLG8scD1bXSxxPVtdLHI9e30scz10aGlzO2Zvcih2YXIgdCBpbiBhKWlmKGFbbF0odCkpe3MuZXF1YWw/KG89cy5lcXVhbCh0LGsoYVt0XSkpLGc9by5mcm9tLGk9by50byxuPW8uZik6KGc9K3MuYXR0cih0KSxpPSthW3RdKTt2YXIgdT1qKGcsImFycmF5Iik/Zy5sZW5ndGg6MTtyW3RdPWgocC5sZW5ndGgscC5sZW5ndGgrdSxuKSxwPXAuY29uY2F0KGcpLHE9cS5jb25jYXQoaSl9dmFyIHY9Yy50aW1lKCksdz1jKHAscSx2LHYrZCxjLnRpbWUsZnVuY3Rpb24oYSl7dmFyIGI9e307Zm9yKHZhciBjIGluIHIpcltsXShjKSYmKGJbY109cltjXShhKSk7cy5hdHRyKGIpfSxlKTtyZXR1cm4gcy5hbmltc1t3LmlkXT13LHcuX2F0dHJzPWEsdy5fY2FsbGJhY2s9ZixiKCJzbmFwLmFuaW1jcmVhdGVkLiIrcy5pZCx3KSxiLm9uY2UoIm1pbmEuZmluaXNoLiIrdy5pZCxmdW5jdGlvbigpe2Iub2ZmKCJtaW5hLiouIit3LmlkKSxkZWxldGUgcy5hbmltc1t3LmlkXSxmJiZmLmNhbGwocyl9KSxiLm9uY2UoIm1pbmEuc3RvcC4iK3cuaWQsZnVuY3Rpb24oKXtiLm9mZigibWluYS4qLiIrdy5pZCksZGVsZXRlIHMuYW5pbXNbdy5pZF19KSxzfX0pLGQucGx1Z2luKGZ1bmN0aW9uKGEsYixjLGQsZSl7ZnVuY3Rpb24gZihhLGIsYyxkLGUsZil7cmV0dXJuIG51bGw9PWImJiJbb2JqZWN0IFNWR01hdHJpeF0iPT1nLmNhbGwoYSk/KHRoaXMuYT1hLmEsdGhpcy5iPWEuYix0aGlzLmM9YS5jLHRoaXMuZD1hLmQsdGhpcy5lPWEuZSx2b2lkKHRoaXMuZj1hLmYpKTp2b2lkKG51bGwhPWE/KHRoaXMuYT0rYSx0aGlzLmI9K2IsdGhpcy5jPStjLHRoaXMuZD0rZCx0aGlzLmU9K2UsdGhpcy5mPStmKToodGhpcy5hPTEsdGhpcy5iPTAsdGhpcy5jPTAsdGhpcy5kPTEsdGhpcy5lPTAsdGhpcy5mPTApKX12YXIgZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9U3RyaW5nLGk9TWF0aCxqPSIiOyFmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhWzBdKmFbMF0rYVsxXSphWzFdfWZ1bmN0aW9uIGQoYSl7dmFyIGI9aS5zcXJ0KGMoYSkpO2FbMF0mJihhWzBdLz1iKSxhWzFdJiYoYVsxXS89Yil9Yi5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGcpe2lmKGEmJmEgaW5zdGFuY2VvZiBmKXJldHVybiB0aGlzLmFkZChhLmEsYS5iLGEuYyxhLmQsYS5lLGEuZik7dmFyIGg9YSp0aGlzLmErYip0aGlzLmMsaT1hKnRoaXMuYitiKnRoaXMuZDtyZXR1cm4gdGhpcy5lKz1lKnRoaXMuYStnKnRoaXMuYyx0aGlzLmYrPWUqdGhpcy5iK2cqdGhpcy5kLHRoaXMuYz1jKnRoaXMuYStkKnRoaXMuYyx0aGlzLmQ9Yyp0aGlzLmIrZCp0aGlzLmQsdGhpcy5hPWgsdGhpcy5iPWksdGhpc30sZi5wcm90b3R5cGUubXVsdExlZnQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGcpe2lmKGEmJmEgaW5zdGFuY2VvZiBmKXJldHVybiB0aGlzLm11bHRMZWZ0KGEuYSxhLmIsYS5jLGEuZCxhLmUsYS5mKTt2YXIgaD1hKnRoaXMuYStjKnRoaXMuYixpPWEqdGhpcy5jK2MqdGhpcy5kLGo9YSp0aGlzLmUrYyp0aGlzLmYrZTtyZXR1cm4gdGhpcy5iPWIqdGhpcy5hK2QqdGhpcy5iLHRoaXMuZD1iKnRoaXMuYytkKnRoaXMuZCx0aGlzLmY9Yip0aGlzLmUrZCp0aGlzLmYrZyx0aGlzLmE9aCx0aGlzLmM9aSx0aGlzLmU9aix0aGlzfSxiLmludmVydD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmEqYS5kLWEuYiphLmM7cmV0dXJuIG5ldyBmKGEuZC9iLC1hLmIvYiwtYS5jL2IsYS5hL2IsKGEuYyphLmYtYS5kKmEuZSkvYiwoYS5iKmEuZS1hLmEqYS5mKS9iKX0sYi5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZih0aGlzLmEsdGhpcy5iLHRoaXMuYyx0aGlzLmQsdGhpcy5lLHRoaXMuZil9LGIudHJhbnNsYXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZSs9YSp0aGlzLmErYip0aGlzLmMsdGhpcy5mKz1hKnRoaXMuYitiKnRoaXMuZCx0aGlzfSxiLnNjYWxlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBudWxsPT1iJiYoYj1hKSwoY3x8ZCkmJnRoaXMudHJhbnNsYXRlKGMsZCksdGhpcy5hKj1hLHRoaXMuYio9YSx0aGlzLmMqPWIsdGhpcy5kKj1iLChjfHxkKSYmdGhpcy50cmFuc2xhdGUoLWMsLWQpLHRoaXN9LGIucm90YXRlPWZ1bmN0aW9uKGIsYyxkKXtiPWEucmFkKGIpLGM9Y3x8MCxkPWR8fDA7dmFyIGU9K2kuY29zKGIpLnRvRml4ZWQoOSksZj0raS5zaW4oYikudG9GaXhlZCg5KTtyZXR1cm4gdGhpcy5hZGQoZSxmLC1mLGUsYyxkKSx0aGlzLmFkZCgxLDAsMCwxLC1jLC1kKX0sYi5za2V3WD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5za2V3KGEsMCl9LGIuc2tld1k9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2tldygwLGEpfSxiLnNrZXc9ZnVuY3Rpb24oYixjKXtiPWJ8fDAsYz1jfHwwLGI9YS5yYWQoYiksYz1hLnJhZChjKTt2YXIgZD1pLnRhbihiKS50b0ZpeGVkKDkpLGU9aS50YW4oYykudG9GaXhlZCg5KTtyZXR1cm4gdGhpcy5hZGQoMSxlLGQsMSwwLDApfSxiLng9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSp0aGlzLmErYip0aGlzLmMrdGhpcy5lfSxiLnk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSp0aGlzLmIrYip0aGlzLmQrdGhpcy5mfSxiLmdldD1mdW5jdGlvbihhKXtyZXR1cm4rdGhpc1toLmZyb21DaGFyQ29kZSg5NythKV0udG9GaXhlZCg0KX0sYi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJtYXRyaXgoIitbdGhpcy5nZXQoMCksdGhpcy5nZXQoMSksdGhpcy5nZXQoMiksdGhpcy5nZXQoMyksdGhpcy5nZXQoNCksdGhpcy5nZXQoNSldLmpvaW4oKSsiKSJ9LGIub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZS50b0ZpeGVkKDQpLHRoaXMuZi50b0ZpeGVkKDQpXX0sYi5kZXRlcm1pbmFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEqdGhpcy5kLXRoaXMuYip0aGlzLmN9LGIuc3BsaXQ9ZnVuY3Rpb24oKXt2YXIgYj17fTtiLmR4PXRoaXMuZSxiLmR5PXRoaXMuZjt2YXIgZT1bW3RoaXMuYSx0aGlzLmJdLFt0aGlzLmMsdGhpcy5kXV07Yi5zY2FsZXg9aS5zcXJ0KGMoZVswXSkpLGQoZVswXSksYi5zaGVhcj1lWzBdWzBdKmVbMV1bMF0rZVswXVsxXSplWzFdWzFdLGVbMV09W2VbMV1bMF0tZVswXVswXSpiLnNoZWFyLGVbMV1bMV0tZVswXVsxXSpiLnNoZWFyXSxiLnNjYWxleT1pLnNxcnQoYyhlWzFdKSksZChlWzFdKSxiLnNoZWFyLz1iLnNjYWxleSx0aGlzLmRldGVybWluYW50KCk8MCYmKGIuc2NhbGV4PS1iLnNjYWxleCk7dmFyIGY9ZVswXVsxXSxnPWVbMV1bMV07cmV0dXJuIDA+Zz8oYi5yb3RhdGU9YS5kZWcoaS5hY29zKGcpKSwwPmYmJihiLnJvdGF0ZT0zNjAtYi5yb3RhdGUpKTpiLnJvdGF0ZT1hLmRlZyhpLmFzaW4oZikpLGIuaXNTaW1wbGU9ISgrYi5zaGVhci50b0ZpeGVkKDkpfHxiLnNjYWxleC50b0ZpeGVkKDkpIT1iLnNjYWxleS50b0ZpeGVkKDkpJiZiLnJvdGF0ZSksYi5pc1N1cGVyU2ltcGxlPSErYi5zaGVhci50b0ZpeGVkKDkpJiZiLnNjYWxleC50b0ZpeGVkKDkpPT1iLnNjYWxleS50b0ZpeGVkKDkpJiYhYi5yb3RhdGUsYi5ub1JvdGF0aW9uPSErYi5zaGVhci50b0ZpeGVkKDkpJiYhYi5yb3RhdGUsYn0sYi50b1RyYW5zZm9ybVN0cmluZz1mdW5jdGlvbihhKXt2YXIgYj1hfHx0aGlzLnNwbGl0KCk7cmV0dXJuK2Iuc2hlYXIudG9GaXhlZCg5KT8ibSIrW3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDMpLHRoaXMuZ2V0KDQpLHRoaXMuZ2V0KDUpXTooYi5zY2FsZXg9K2Iuc2NhbGV4LnRvRml4ZWQoNCksYi5zY2FsZXk9K2Iuc2NhbGV5LnRvRml4ZWQoNCksYi5yb3RhdGU9K2Iucm90YXRlLnRvRml4ZWQoNCksKGIuZHh8fGIuZHk/InQiK1srYi5keC50b0ZpeGVkKDQpLCtiLmR5LnRvRml4ZWQoNCldOmopKyhiLnJvdGF0ZT8iciIrWytiLnJvdGF0ZS50b0ZpeGVkKDQpLDAsMF06aikrKDEhPWIuc2NhbGV4fHwxIT1iLnNjYWxleT8icyIrW2Iuc2NhbGV4LGIuc2NhbGV5LDAsMF06aikpfX0oZi5wcm90b3R5cGUpLGEuTWF0cml4PWYsYS5tYXRyaXg9ZnVuY3Rpb24oYSxiLGMsZCxlLGcpe3JldHVybiBuZXcgZihhLGIsYyxkLGUsZyl9fSksZC5wbHVnaW4oZnVuY3Rpb24oYSxjLGQsZSxmKXtmdW5jdGlvbiBnKGQpe3JldHVybiBmdW5jdGlvbihlKXtpZihiLnN0b3AoKSxlIGluc3RhbmNlb2YgZiYmMT09ZS5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoJiYoInJhZGlhbEdyYWRpZW50Ij09ZS5ub2RlLmZpcnN0Q2hpbGQudGFnTmFtZXx8ImxpbmVhckdyYWRpZW50Ij09ZS5ub2RlLmZpcnN0Q2hpbGQudGFnTmFtZXx8InBhdHRlcm4iPT1lLm5vZGUuZmlyc3RDaGlsZC50YWdOYW1lKSYmKGU9ZS5ub2RlLmZpcnN0Q2hpbGQsbih0aGlzKS5hcHBlbmRDaGlsZChlKSxlPWwoZSkpLGUgaW5zdGFuY2VvZiBjKWlmKCJyYWRpYWxHcmFkaWVudCI9PWUudHlwZXx8ImxpbmVhckdyYWRpZW50Ij09ZS50eXBlfHwicGF0dGVybiI9PWUudHlwZSl7ZS5ub2RlLmlkfHxwKGUubm9kZSx7aWQ6ZS5pZH0pO3ZhciBnPXEoZS5ub2RlLmlkKX1lbHNlIGc9ZS5hdHRyKGQpO2Vsc2UgaWYoZz1hLmNvbG9yKGUpLGcuZXJyb3Ipe3ZhciBoPWEobih0aGlzKS5vd25lclNWR0VsZW1lbnQpLmdyYWRpZW50KGUpO2g/KGgubm9kZS5pZHx8cChoLm5vZGUse2lkOmguaWR9KSxnPXEoaC5ub2RlLmlkKSk6Zz1lfWVsc2UgZz1yKGcpO3ZhciBpPXt9O2lbZF09ZyxwKHRoaXMubm9kZSxpKSx0aGlzLm5vZGUuc3R5bGVbZF09dH19ZnVuY3Rpb24gaChhKXtiLnN0b3AoKSxhPT0rYSYmKGErPSJweCIpLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1hfWZ1bmN0aW9uIGkoYSl7Zm9yKHZhciBiPVtdLGM9YS5jaGlsZE5vZGVzLGQ9MCxlPWMubGVuZ3RoO2U+ZDtkKyspe3ZhciBmPWNbZF07Mz09Zi5ub2RlVHlwZSYmYi5wdXNoKGYubm9kZVZhbHVlKSwidHNwYW4iPT1mLnRhZ05hbWUmJigxPT1mLmNoaWxkTm9kZXMubGVuZ3RoJiYzPT1mLmZpcnN0Q2hpbGQubm9kZVR5cGU/Yi5wdXNoKGYuZmlyc3RDaGlsZC5ub2RlVmFsdWUpOmIucHVzaChpKGYpKSl9cmV0dXJuIGJ9ZnVuY3Rpb24gaigpe3JldHVybiBiLnN0b3AoKSx0aGlzLm5vZGUuc3R5bGUuZm9udFNpemV9dmFyIGs9YS5fLm1ha2UsbD1hLl8ud3JhcCxtPWEuaXMsbj1hLl8uZ2V0U29tZURlZnMsbz0vXnVybFwoKFsnIl0/KShbXildKylcMVwpJC8scD1hLl8uJCxxPWEudXJsLHI9U3RyaW5nLHM9YS5fLnNlcGFyYXRvcix0PSIiO2EuZGV1cmw9ZnVuY3Rpb24oYSl7dmFyIGI9U3RyaW5nKGEpLm1hdGNoKG8pO3JldHVybiBiP2JbMl06YX0sYi5vbigic25hcC51dGlsLmF0dHIubWFzayIsZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIGN8fGEgaW5zdGFuY2VvZiBmKXtpZihiLnN0b3AoKSxhIGluc3RhbmNlb2YgZiYmMT09YS5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoJiYoYT1hLm5vZGUuZmlyc3RDaGlsZCxuKHRoaXMpLmFwcGVuZENoaWxkKGEpLGE9bChhKSksIm1hc2siPT1hLnR5cGUpdmFyIGQ9YTtlbHNlIGQ9aygibWFzayIsbih0aGlzKSksZC5ub2RlLmFwcGVuZENoaWxkKGEubm9kZSk7IWQubm9kZS5pZCYmcChkLm5vZGUse2lkOmQuaWR9KSxwKHRoaXMubm9kZSx7bWFzazpxKGQuaWQpfSl9fSksZnVuY3Rpb24oYSl7Yi5vbigic25hcC51dGlsLmF0dHIuY2xpcCIsYSksYi5vbigic25hcC51dGlsLmF0dHIuY2xpcC1wYXRoIixhKSxiLm9uKCJzbmFwLnV0aWwuYXR0ci5jbGlwUGF0aCIsYSl9KGZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBjfHxhIGluc3RhbmNlb2YgZil7Yi5zdG9wKCk7Zm9yKHZhciBkLGU9YS5ub2RlO2U7KXtpZigiY2xpcFBhdGgiPT09ZS5ub2RlTmFtZSl7ZD1uZXcgYyhlKTticmVha31pZigic3ZnIj09PWUubm9kZU5hbWUpe2Q9dm9pZCAwO2JyZWFrfWU9ZS5wYXJlbnROb2RlfWR8fChkPWsoImNsaXBQYXRoIixuKHRoaXMpKSxkLm5vZGUuYXBwZW5kQ2hpbGQoYS5ub2RlKSwhZC5ub2RlLmlkJiZwKGQubm9kZSx7aWQ6ZC5pZH0pKSxwKHRoaXMubm9kZSx7ImNsaXAtcGF0aCI6cShkLm5vZGUuaWR8fGQuaWQpfSl9fSksYi5vbigic25hcC51dGlsLmF0dHIuZmlsbCIsZygiZmlsbCIpKSxiLm9uKCJzbmFwLnV0aWwuYXR0ci5zdHJva2UiLGcoInN0cm9rZSIpKTt2YXIgdT0vXihbbHJdKSg/OlwoKFteKV0qKVwpKT8oLiopJC9pO2Iub24oInNuYXAudXRpbC5ncmFkLnBhcnNlIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBjPShiLWgpLyhhLWkpLGQ9aTthPmQ7ZCsrKWZbZF0ub2Zmc2V0PSsoK2grYyooZC1pKSkudG9GaXhlZCgyKTtpPWEsaD1ifWE9cihhKTt2YXIgYz1hLm1hdGNoKHUpO2lmKCFjKXJldHVybiBudWxsO3ZhciBkPWNbMV0sZT1jWzJdLGY9Y1szXTtlPWUuc3BsaXQoL1xzKixccyovKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuK2E9PWE/K2E6YX0pLDE9PWUubGVuZ3RoJiYwPT1lWzBdJiYoZT1bXSksZj1mLnNwbGl0KCItIiksZj1mLm1hcChmdW5jdGlvbihhKXthPWEuc3BsaXQoIjoiKTt2YXIgYj17Y29sb3I6YVswXX07cmV0dXJuIGFbMV0mJihiLm9mZnNldD1wYXJzZUZsb2F0KGFbMV0pKSxifSk7dmFyIGc9Zi5sZW5ndGgsaD0wLGk9MDtnLS07Zm9yKHZhciBqPTA7Zz5qO2orKykib2Zmc2V0ImluIGZbal0mJmIoaixmW2pdLm9mZnNldCk7cmV0dXJuIGZbZ10ub2Zmc2V0PWZbZ10ub2Zmc2V0fHwxMDAsYihnLGZbZ10ub2Zmc2V0KSx7dHlwZTpkLHBhcmFtczplLHN0b3BzOmZ9fSksYi5vbigic25hcC51dGlsLmF0dHIuZCIsZnVuY3Rpb24oYyl7Yi5zdG9wKCksbShjLCJhcnJheSIpJiZtKGNbMF0sImFycmF5IikmJihjPWEucGF0aC50b1N0cmluZy5jYWxsKGMpKSxjPXIoYyksYy5tYXRjaCgvW3J1b10vaSkmJihjPWEucGF0aC50b0Fic29sdXRlKGMpKSxwKHRoaXMubm9kZSx7ZDpjfSl9KSgtMSksYi5vbigic25hcC51dGlsLmF0dHIuI3RleHQiLGZ1bmN0aW9uKGEpe2Iuc3RvcCgpLGE9cihhKTtmb3IodmFyIGM9ZS5kb2MuY3JlYXRlVGV4dE5vZGUoYSk7dGhpcy5ub2RlLmZpcnN0Q2hpbGQ7KXRoaXMubm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUuZmlyc3RDaGlsZCk7dGhpcy5ub2RlLmFwcGVuZENoaWxkKGMpfSkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLnBhdGgiLGZ1bmN0aW9uKGEpe2Iuc3RvcCgpLHRoaXMuYXR0cih7ZDphfSl9KSgtMSksYi5vbigic25hcC51dGlsLmF0dHIuY2xhc3MiLGZ1bmN0aW9uKGEpe2Iuc3RvcCgpLHRoaXMubm9kZS5jbGFzc05hbWUuYmFzZVZhbD1hfSkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLnZpZXdCb3giLGZ1bmN0aW9uKGEpe3ZhciBjO2M9bShhLCJvYmplY3QiKSYmIngiaW4gYT9bYS54LGEueSxhLndpZHRoLGEuaGVpZ2h0XS5qb2luKCIgIik6bShhLCJhcnJheSIpP2Euam9pbigiICIpOmEscCh0aGlzLm5vZGUse3ZpZXdCb3g6Y30pLGIuc3RvcCgpfSkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLnRyYW5zZm9ybSIsZnVuY3Rpb24oYSl7dGhpcy50cmFuc2Zvcm0oYSksYi5zdG9wKCl9KSgtMSksYi5vbigic25hcC51dGlsLmF0dHIuciIsZnVuY3Rpb24oYSl7InJlY3QiPT10aGlzLnR5cGUmJihiLnN0b3AoKSxwKHRoaXMubm9kZSx7cng6YSxyeTphfSkpfSkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLnRleHRwYXRoIixmdW5jdGlvbihhKXtpZihiLnN0b3AoKSwidGV4dCI9PXRoaXMudHlwZSl7dmFyIGQsZSxmO2lmKCFhJiZ0aGlzLnRleHRQYXRoKXtmb3IoZT10aGlzLnRleHRQYXRoO2Uubm9kZS5maXJzdENoaWxkOyl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZS5ub2RlLmZpcnN0Q2hpbGQpO3JldHVybiBlLnJlbW92ZSgpLHZvaWQgZGVsZXRlIHRoaXMudGV4dFBhdGh9aWYobShhLCJzdHJpbmciKSl7dmFyIGc9bih0aGlzKSxoPWwoZy5wYXJlbnROb2RlKS5wYXRoKGEpO2cuYXBwZW5kQ2hpbGQoaC5ub2RlKSxkPWguaWQsaC5hdHRyKHtpZDpkfSl9ZWxzZSBhPWwoYSksYSBpbnN0YW5jZW9mIGMmJihkPWEuYXR0cigiaWQiKSxkfHwoZD1hLmlkLGEuYXR0cih7aWQ6ZH0pKSk7aWYoZClpZihlPXRoaXMudGV4dFBhdGgsZj10aGlzLm5vZGUsZSllLmF0dHIoeyJ4bGluazpocmVmIjoiIyIrZH0pO2Vsc2V7Zm9yKGU9cCgidGV4dFBhdGgiLHsieGxpbms6aHJlZiI6IiMiK2R9KTtmLmZpcnN0Q2hpbGQ7KWUuYXBwZW5kQ2hpbGQoZi5maXJzdENoaWxkKTtmLmFwcGVuZENoaWxkKGUpLHRoaXMudGV4dFBhdGg9bChlKX19fSkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLnRleHQiLGZ1bmN0aW9uKGEpe2lmKCJ0ZXh0Ij09dGhpcy50eXBlKXtmb3IodmFyIGM9dGhpcy5ub2RlLGQ9ZnVuY3Rpb24oYSl7dmFyIGI9cCgidHNwYW4iKTtpZihtKGEsImFycmF5IikpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYi5hcHBlbmRDaGlsZChkKGFbY10pKTtlbHNlIGIuYXBwZW5kQ2hpbGQoZS5kb2MuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBiLm5vcm1hbGl6ZSYmYi5ub3JtYWxpemUoKSxifTtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IodmFyIGY9ZChhKTtmLmZpcnN0Q2hpbGQ7KWMuYXBwZW5kQ2hpbGQoZi5maXJzdENoaWxkKX1iLnN0b3AoKX0pKC0xKSxiLm9uKCJzbmFwLnV0aWwuYXR0ci5mb250U2l6ZSIsaCkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLmZvbnQtc2l6ZSIsaCkoLTEpLGIub24oInNuYXAudXRpbC5nZXRhdHRyLnRyYW5zZm9ybSIsZnVuY3Rpb24oKXtyZXR1cm4gYi5zdG9wKCksdGhpcy50cmFuc2Zvcm0oKX0pKC0xKSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ci50ZXh0cGF0aCIsZnVuY3Rpb24oKXtyZXR1cm4gYi5zdG9wKCksdGhpcy50ZXh0UGF0aH0pKC0xKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGMoYyl7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5zdG9wKCk7dmFyIGQ9ZS5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgibWFya2VyLSIrYyk7cmV0dXJuIm5vbmUiPT1kP2Q6YShlLmRvYy5nZXRFbGVtZW50QnlJZChkLm1hdGNoKG8pWzFdKSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2Iuc3RvcCgpO3ZhciBkPSJtYXJrZXIiK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7aWYoIiI9PWN8fCFjKXJldHVybiB2b2lkKHRoaXMubm9kZS5zdHlsZVtkXT0ibm9uZSIpO2lmKCJtYXJrZXIiPT1jLnR5cGUpe3ZhciBlPWMubm9kZS5pZDtyZXR1cm4gZXx8cChjLm5vZGUse2lkOmMuaWR9KSx2b2lkKHRoaXMubm9kZS5zdHlsZVtkXT1xKGUpKX19fWIub24oInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlci1lbmQiLGMoImVuZCIpKSgtMSksYi5vbigic25hcC51dGlsLmdldGF0dHIubWFya2VyRW5kIixjKCJlbmQiKSkoLTEpLGIub24oInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlci1zdGFydCIsYygic3RhcnQiKSkoLTEpLGIub24oInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlclN0YXJ0IixjKCJzdGFydCIpKSgtMSksYi5vbigic25hcC51dGlsLmdldGF0dHIubWFya2VyLW1pZCIsYygibWlkIikpKC0xKSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ci5tYXJrZXJNaWQiLGMoIm1pZCIpKSgtMSksYi5vbigic25hcC51dGlsLmF0dHIubWFya2VyLWVuZCIsZCgiZW5kIikpKC0xKSxiLm9uKCJzbmFwLnV0aWwuYXR0ci5tYXJrZXJFbmQiLGQoImVuZCIpKSgtMSksYi5vbigic25hcC51dGlsLmF0dHIubWFya2VyLXN0YXJ0IixkKCJzdGFydCIpKSgtMSksYi5vbigic25hcC51dGlsLmF0dHIubWFya2VyU3RhcnQiLGQoInN0YXJ0IikpKC0xKSxiLm9uKCJzbmFwLnV0aWwuYXR0ci5tYXJrZXItbWlkIixkKCJtaWQiKSkoLTEpLGIub24oInNuYXAudXRpbC5hdHRyLm1hcmtlck1pZCIsZCgibWlkIikpKC0xKX0oKSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ci5yIixmdW5jdGlvbigpe3JldHVybiJyZWN0Ij09dGhpcy50eXBlJiZwKHRoaXMubm9kZSwicngiKT09cCh0aGlzLm5vZGUsInJ5Iik/KGIuc3RvcCgpLHAodGhpcy5ub2RlLCJyeCIpKTp2b2lkIDB9KSgtMSksYi5vbigic25hcC51dGlsLmdldGF0dHIudGV4dCIsZnVuY3Rpb24oKXtpZigidGV4dCI9PXRoaXMudHlwZXx8InRzcGFuIj09dGhpcy50eXBlKXtiLnN0b3AoKTt2YXIgYT1pKHRoaXMubm9kZSk7cmV0dXJuIDE9PWEubGVuZ3RoP2FbMF06YX19KSgtMSksYi5vbigic25hcC51dGlsLmdldGF0dHIuI3RleHQiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS50ZXh0Q29udGVudH0pKC0xKSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ci5maWxsIixmdW5jdGlvbihjKXtpZighYyl7Yi5zdG9wKCk7dmFyIGQ9Yigic25hcC51dGlsLmdldGF0dHIuZmlsbCIsdGhpcywhMCkuZmlyc3REZWZpbmVkKCk7cmV0dXJuIGEoYS5kZXVybChkKSl8fGR9fSkoLTEpLGIub24oInNuYXAudXRpbC5nZXRhdHRyLnN0cm9rZSIsZnVuY3Rpb24oYyl7aWYoIWMpe2Iuc3RvcCgpO3ZhciBkPWIoInNuYXAudXRpbC5nZXRhdHRyLnN0cm9rZSIsdGhpcywhMCkuZmlyc3REZWZpbmVkKCk7cmV0dXJuIGEoYS5kZXVybChkKSl8fGR9fSkoLTEpLGIub24oInNuYXAudXRpbC5nZXRhdHRyLnZpZXdCb3giLGZ1bmN0aW9uKCl7Yi5zdG9wKCk7dmFyIGM9cCh0aGlzLm5vZGUsInZpZXdCb3giKTtyZXR1cm4gYz8oYz1jLnNwbGl0KHMpLGEuXy5ib3goK2NbMF0sK2NbMV0sK2NbMl0sK2NbM10pKTp2b2lkIDB9KSgtMSksYi5vbigic25hcC51dGlsLmdldGF0dHIucG9pbnRzIixmdW5jdGlvbigpe3ZhciBhPXAodGhpcy5ub2RlLCJwb2ludHMiKTtyZXR1cm4gYi5zdG9wKCksYT9hLnNwbGl0KHMpOnZvaWQgMH0pKC0xKSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ci5wYXRoIixmdW5jdGlvbigpe3ZhciBhPXAodGhpcy5ub2RlLCJkIik7cmV0dXJuIGIuc3RvcCgpLGF9KSgtMSksYi5vbigic25hcC51dGlsLmdldGF0dHIuY2xhc3MiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5jbGFzc05hbWUuYmFzZVZhbH0pKC0xKSxiLm9uKCJzbmFwLnV0aWwuZ2V0YXR0ci5mb250U2l6ZSIsaikoLTEpLGIub24oInNuYXAudXRpbC5nZXRhdHRyLmZvbnQtc2l6ZSIsaikoLTEpfSksZC5wbHVnaW4oZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0vXFMrL2csZz1TdHJpbmcsaD1iLnByb3RvdHlwZTtoLmFkZENsYXNzPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGg9ZyhhfHwiIikubWF0Y2goZil8fFtdLGk9dGhpcy5ub2RlLGo9aS5jbGFzc05hbWUuYmFzZVZhbCxrPWoubWF0Y2goZil8fFtdO2lmKGgubGVuZ3RoKXtmb3IoYj0wO2Q9aFtiKytdOyljPWsuaW5kZXhPZihkKSx+Y3x8ay5wdXNoKGQpO2U9ay5qb2luKCIgIiksaiE9ZSYmKGkuY2xhc3NOYW1lLmJhc2VWYWw9ZSl9cmV0dXJuIHRoaXN9LGgucmVtb3ZlQ2xhc3M9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsaD1nKGF8fCIiKS5tYXRjaChmKXx8W10saT10aGlzLm5vZGUsaj1pLmNsYXNzTmFtZS5iYXNlVmFsLGs9ai5tYXRjaChmKXx8W107aWYoay5sZW5ndGgpe2ZvcihiPTA7ZD1oW2IrK107KWM9ay5pbmRleE9mKGQpLH5jJiZrLnNwbGljZShjLDEpO2U9ay5qb2luKCIgIiksaiE9ZSYmKGkuY2xhc3NOYW1lLmJhc2VWYWw9ZSl9cmV0dXJuIHRoaXN9LGguaGFzQ2xhc3M9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ub2RlLGM9Yi5jbGFzc05hbWUuYmFzZVZhbCxkPWMubWF0Y2goZil8fFtdO3JldHVybiEhfmQuaW5kZXhPZihhKX0saC50b2dnbGVDbGFzcz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpcmV0dXJuIGI/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpO3ZhciBjLGQsZSxnLGg9KGF8fCIiKS5tYXRjaChmKXx8W10saT10aGlzLm5vZGUsaj1pLmNsYXNzTmFtZS5iYXNlVmFsLGs9ai5tYXRjaChmKXx8W107Zm9yKGM9MDtlPWhbYysrXTspZD1rLmluZGV4T2YoZSksfmQ/ay5zcGxpY2UoZCwxKTprLnB1c2goZSk7cmV0dXJuIGc9ay5qb2luKCIgIiksaiE9ZyYmKGkuY2xhc3NOYW1lLmJhc2VWYWw9ZyksdGhpc319KSxkLnBsdWdpbihmdW5jdGlvbihhLGMsZCxlLGYpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuK2IudG9GaXhlZCgzKSthfX12YXIgaT17IisiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGErYn0sIi0iOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYn0sIi8iOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEvYn0sIioiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEqYn19LGo9U3RyaW5nLGs9L1thLXpdKyQvaSxsPS9eXHMqKFsrXC1cLypdKVxzKj1ccyooW1xkLmVFK1wtXSspXHMqKFteXGRcc10rKT9ccyokLztiLm9uKCJzbmFwLnV0aWwuYXR0ciIsZnVuY3Rpb24oYSl7dmFyIGM9aihhKS5tYXRjaChsKTtpZihjKXt2YXIgZD1iLm50KCksZT1kLnN1YnN0cmluZyhkLmxhc3RJbmRleE9mKCIuIikrMSksZj10aGlzLmF0dHIoZSksZz17fTtiLnN0b3AoKTt2YXIgaD1jWzNdfHwiIixtPWYubWF0Y2goayksbj1pW2NbMV1dO2lmKG0mJm09PWg/YT1uKHBhcnNlRmxvYXQoZiksK2NbMl0pOihmPXRoaXMuYXNQWChlKSxhPW4odGhpcy5hc1BYKGUpLHRoaXMuYXNQWChlLGNbMl0raCkpKSxpc05hTihmKXx8aXNOYU4oYSkpcmV0dXJuO2dbZV09YSx0aGlzLmF0dHIoZyl9fSkoLTEwKSxiLm9uKCJzbmFwLnV0aWwuZXF1YWwiLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9aih0aGlzLmF0dHIoYSl8fCIiKSxlPWooYykubWF0Y2gobCk7aWYoZSl7Yi5zdG9wKCk7dmFyIGY9ZVszXXx8IiIsbT1kLm1hdGNoKGspLG49aVtlWzFdXTtyZXR1cm4gbSYmbT09Zj97ZnJvbTpwYXJzZUZsb2F0KGQpLHRvOm4ocGFyc2VGbG9hdChkKSwrZVsyXSksZjpoKG0pfTooZD10aGlzLmFzUFgoYSkse2Zyb206ZCx0bzpuKGQsdGhpcy5hc1BYKGEsZVsyXStmKSksZjpnfSl9fSkoLTEwKX0pLGQucGx1Z2luKGZ1bmN0aW9uKGMsZCxlLGYsZyl7dmFyIGg9ZS5wcm90b3R5cGUsaT1jLmlzO2gucmVjdD1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc7cmV0dXJuIG51bGw9PWYmJihmPWUpLGkoYSwib2JqZWN0IikmJiJbb2JqZWN0IE9iamVjdF0iPT1hP2c9YTpudWxsIT1hJiYoZz17eDphLHk6Yix3aWR0aDpjLGhlaWdodDpkfSxudWxsIT1lJiYoZy5yeD1lLGcucnk9ZikpLHRoaXMuZWwoInJlY3QiLGcpfSxoLmNpcmNsZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGkoYSwib2JqZWN0IikmJiJbb2JqZWN0IE9iamVjdF0iPT1hP2Q9YTpudWxsIT1hJiYoZD17Y3g6YSxjeTpiLHI6Y30pLHRoaXMuZWwoImNpcmNsZSIsZCl9O3ZhciBqPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX1yZXR1cm4gZnVuY3Rpb24oYixjKXt2YXIgZD1mLmRvYy5jcmVhdGVFbGVtZW50KCJpbWciKSxlPWYuZG9jLmJvZHk7ZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW0iLGQub25sb2FkPWZ1bmN0aW9uKCl7Yy5jYWxsKGQpLGQub25sb2FkPWQub25lcnJvcj1udWxsLGUucmVtb3ZlQ2hpbGQoZCl9LGQub25lcnJvcj1hLGUuYXBwZW5kQ2hpbGQoZCksZC5zcmM9Yn19KCk7aC5pbWFnZT1mdW5jdGlvbihhLGIsZCxlLGYpe3ZhciBnPXRoaXMuZWwoImltYWdlIik7aWYoaShhLCJvYmplY3QiKSYmInNyYyJpbiBhKWcuYXR0cihhKTtlbHNlIGlmKG51bGwhPWEpe3ZhciBoPXsieGxpbms6aHJlZiI6YSxwcmVzZXJ2ZUFzcGVjdFJhdGlvOiJub25lIn07bnVsbCE9YiYmbnVsbCE9ZCYmKGgueD1iLGgueT1kKSxudWxsIT1lJiZudWxsIT1mPyhoLndpZHRoPWUsaC5oZWlnaHQ9Zik6aihhLGZ1bmN0aW9uKCl7Yy5fLiQoZy5ub2RlLHt3aWR0aDp0aGlzLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodH0pfSksYy5fLiQoZy5ub2RlLGgpfXJldHVybiBnfSxoLmVsbGlwc2U9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIGkoYSwib2JqZWN0IikmJiJbb2JqZWN0IE9iamVjdF0iPT1hP2U9YTpudWxsIT1hJiYoZT17Y3g6YSxjeTpiLHJ4OmMscnk6ZH0pLHRoaXMuZWwoImVsbGlwc2UiLGUpfSxoLnBhdGg9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGkoYSwib2JqZWN0IikmJiFpKGEsImFycmF5Iik/Yj1hOmEmJihiPXtkOmF9KSx0aGlzLmVsKCJwYXRoIixiKX0saC5ncm91cD1oLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbCgiZyIpO3JldHVybiAxPT1hcmd1bWVudHMubGVuZ3RoJiZhJiYhYS50eXBlP2IuYXR0cihhKTphcmd1bWVudHMubGVuZ3RoJiZiLmFkZChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpLGJ9LGguc3ZnPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7dmFyIGo9e307cmV0dXJuIGkoYSwib2JqZWN0IikmJm51bGw9PWI/aj1hOihudWxsIT1hJiYoai54PWEpLG51bGwhPWImJihqLnk9YiksbnVsbCE9YyYmKGoud2lkdGg9YyksbnVsbCE9ZCYmKGouaGVpZ2h0PWQpLG51bGwhPWUmJm51bGwhPWYmJm51bGwhPWcmJm51bGwhPWgmJihqLnZpZXdCb3g9W2UsZixnLGhdKSksdGhpcy5lbCgic3ZnIixqKX0saC5tYXNrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZWwoIm1hc2siKTtyZXR1cm4gMT09YXJndW1lbnRzLmxlbmd0aCYmYSYmIWEudHlwZT9iLmF0dHIoYSk6YXJndW1lbnRzLmxlbmd0aCYmYi5hZGQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKSxifSxoLnB0cm49ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXtpZihpKGEsIm9iamVjdCIpKXZhciBqPWE7ZWxzZSBqPXtwYXR0ZXJuVW5pdHM6InVzZXJTcGFjZU9uVXNlIn0sYSYmKGoueD1hKSxiJiYoai55PWIpLG51bGwhPWMmJihqLndpZHRoPWMpLG51bGwhPWQmJihqLmhlaWdodD1kKSxudWxsIT1lJiZudWxsIT1mJiZudWxsIT1nJiZudWxsIT1oP2oudmlld0JveD1bZSxmLGcsaF06ai52aWV3Qm94PVthfHwwLGJ8fDAsY3x8MCxkfHwwXTtyZXR1cm4gdGhpcy5lbCgicGF0dGVybiIsail9LGgudXNlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPyhhIGluc3RhbmNlb2YgZCYmKGEuYXR0cigiaWQiKXx8YS5hdHRyKHtpZDpjLl8uaWQoYSl9KSxhPWEuYXR0cigiaWQiKSksIiMiPT1TdHJpbmcoYSkuY2hhckF0KCkmJihhPWEuc3Vic3RyaW5nKDEpKSx0aGlzLmVsKCJ1c2UiLHsieGxpbms6aHJlZiI6IiMiK2F9KSk6ZC5wcm90b3R5cGUudXNlLmNhbGwodGhpcyl9LGguc3ltYm9sPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXt9O3JldHVybiBudWxsIT1hJiZudWxsIT1iJiZudWxsIT1jJiZudWxsIT1kJiYoZS52aWV3Qm94PVthLGIsYyxkXSksdGhpcy5lbCgic3ltYm9sIixlKX0saC50ZXh0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fTtyZXR1cm4gaShhLCJvYmplY3QiKT9kPWE6bnVsbCE9YSYmKGQ9e3g6YSx5OmIsdGV4dDpjfHwiIn0pLHRoaXMuZWwoInRleHQiLGQpfSxoLmxpbmU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9e307cmV0dXJuIGkoYSwib2JqZWN0Iik/ZT1hOm51bGwhPWEmJihlPXt4MTphLHgyOmMseTE6Yix5MjpkfSksdGhpcy5lbCgibGluZSIsZSl9LGgucG9seWxpbmU9ZnVuY3Rpb24oYSl7YXJndW1lbnRzLmxlbmd0aD4xJiYoYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpO3ZhciBiPXt9O3JldHVybiBpKGEsIm9iamVjdCIpJiYhaShhLCJhcnJheSIpP2I9YTpudWxsIT1hJiYoYj17cG9pbnRzOmF9KSx0aGlzLmVsKCJwb2x5bGluZSIsYil9LGgucG9seWdvbj1mdW5jdGlvbihhKXthcmd1bWVudHMubGVuZ3RoPjEmJihhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSk7dmFyIGI9e307cmV0dXJuIGkoYSwib2JqZWN0IikmJiFpKGEsImFycmF5Iik/Yj1hOm51bGwhPWEmJihiPXtwb2ludHM6YX0pLHRoaXMuZWwoInBvbHlnb24iLGIpfSxmdW5jdGlvbigpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gdGhpcy5zZWxlY3RBbGwoInN0b3AiKX1mdW5jdGlvbiBlKGEsYil7dmFyIGQ9bCgic3RvcCIpLGU9e29mZnNldDorYisiJSJ9O2E9Yy5jb2xvcihhKSxlWyJzdG9wLWNvbG9yIl09YS5oZXgsYS5vcGFjaXR5PDEmJihlWyJzdG9wLW9wYWNpdHkiXT1hLm9wYWNpdHkpLGwoZCxlKTtmb3IodmFyIGYsZz10aGlzLnN0b3BzKCksaD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaT1wYXJzZUZsb2F0KGdbaF0uYXR0cigib2Zmc2V0IikpO2lmKGk+Yil7dGhpcy5ub2RlLmluc2VydEJlZm9yZShkLGdbaF0ubm9kZSksZj0hMDticmVha319cmV0dXJuIGZ8fHRoaXMubm9kZS5hcHBlbmRDaGlsZChkKSx0aGlzfWZ1bmN0aW9uIGYoKXtpZigibGluZWFyR3JhZGllbnQiPT10aGlzLnR5cGUpe3ZhciBhPWwodGhpcy5ub2RlLCJ4MSIpfHwwLGI9bCh0aGlzLm5vZGUsIngyIil8fDEsZD1sKHRoaXMubm9kZSwieTEiKXx8MCxlPWwodGhpcy5ub2RlLCJ5MiIpfHwwO3JldHVybiBjLl8uYm94KGEsZCxtYXRoLmFicyhiLWEpLG1hdGguYWJzKGUtZCkpfXZhciBmPXRoaXMubm9kZS5jeHx8LjUsZz10aGlzLm5vZGUuY3l8fC41LGg9dGhpcy5ub2RlLnJ8fDA7cmV0dXJuIGMuXy5ib3goZi1oLGctaCwyKmgsMipoKX1mdW5jdGlvbiBnKGEpe3ZhciBkPWEsZT10aGlzLnN0b3BzKCk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYoZD1iKCJzbmFwLnV0aWwuZ3JhZC5wYXJzZSIsbnVsbCwibCgwLDAsMCwxKSIrYSkuZmlyc3REZWZpbmVkKCkuc3RvcHMpLGMuaXMoZCwiYXJyYXkiKSl7Zm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspaWYoZFtmXSl7dmFyIGc9Yy5jb2xvcihkW2ZdLmNvbG9yKSxoPXtvZmZzZXQ6ZFtmXS5vZmZzZXQrIiUifTtoWyJzdG9wLWNvbG9yIl09Zy5oZXgsZy5vcGFjaXR5PDEmJihoWyJzdG9wLW9wYWNpdHkiXT1nLm9wYWNpdHkpLGVbZl0uYXR0cihoKX1lbHNlIGVbZl0ucmVtb3ZlKCk7Zm9yKGY9ZS5sZW5ndGg7ZjxkLmxlbmd0aDtmKyspdGhpcy5hZGRTdG9wKGRbZl0uY29sb3IsZFtmXS5vZmZzZXQpO3JldHVybiB0aGlzfX1mdW5jdGlvbiBpKGEsYyl7dmFyIGQsZT1iKCJzbmFwLnV0aWwuZ3JhZC5wYXJzZSIsbnVsbCxjKS5maXJzdERlZmluZWQoKTtpZighZSlyZXR1cm4gbnVsbDtlLnBhcmFtcy51bnNoaWZ0KGEpLGQ9ImwiPT1lLnR5cGUudG9Mb3dlckNhc2UoKT9qLmFwcGx5KDAsZS5wYXJhbXMpOmsuYXBwbHkoMCxlLnBhcmFtcyksZS50eXBlIT1lLnR5cGUudG9Mb3dlckNhc2UoKSYmbChkLm5vZGUse2dyYWRpZW50VW5pdHM6InVzZXJTcGFjZU9uVXNlIn0pO2Zvcih2YXIgZj1lLnN0b3BzLGc9Zi5sZW5ndGgsaD0wO2c+aDtoKyspe3ZhciBpPWZbaF07ZC5hZGRTdG9wKGkuY29sb3IsaS5vZmZzZXQpfXJldHVybiBkfWZ1bmN0aW9uIGooYSxiLGgsaSxqKXt2YXIgaz1jLl8ubWFrZSgibGluZWFyR3JhZGllbnQiLGEpO3JldHVybiBrLnN0b3BzPWQsay5hZGRTdG9wPWUsay5nZXRCQm94PWYsay5zZXRTdG9wcz1nLG51bGwhPWImJmwoay5ub2RlLHt4MTpiLHkxOmgseDI6aSx5MjpqfSksa31mdW5jdGlvbiBrKGEsYixnLGgsaSxqKXt2YXIgaz1jLl8ubWFrZSgicmFkaWFsR3JhZGllbnQiLGEpO3JldHVybiBrLnN0b3BzPWQsay5hZGRTdG9wPWUsay5nZXRCQm94PWYsbnVsbCE9YiYmbChrLm5vZGUse2N4OmIsY3k6ZyxyOmh9KSxudWxsIT1pJiZudWxsIT1qJiZsKGsubm9kZSx7Zng6aSxmeTpqfSksa312YXIgbD1jLl8uJDtoLmdyYWRpZW50PWZ1bmN0aW9uKGEpe3JldHVybiBpKHRoaXMuZGVmcyxhKX0saC5ncmFkaWVudExpbmVhcj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gaih0aGlzLmRlZnMsYSxiLGMsZCl9LGguZ3JhZGllbnRSYWRpYWw9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gayh0aGlzLmRlZnMsYSxiLGMsZCxlKX0saC50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5ub2RlLm93bmVyRG9jdW1lbnQsZD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxlPWIuY3JlYXRlRWxlbWVudCgiZGl2IiksZj10aGlzLm5vZGUuY2xvbmVOb2RlKCEwKTtyZXR1cm4gZC5hcHBlbmRDaGlsZChlKSxlLmFwcGVuZENoaWxkKGYpLGMuXy4kKGYse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ9KSxhPWUuaW5uZXJIVE1MLGQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKSxhfSxoLnRvRGF0YVVSTD1mdW5jdGlvbigpe3JldHVybiBhJiZhLmJ0b2E/ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsIitidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0aGlzKSkpOnZvaWQgMH0saC5jbGVhcj1mdW5jdGlvbigpe2Zvcih2YXIgYSxiPXRoaXMubm9kZS5maXJzdENoaWxkO2I7KWE9Yi5uZXh0U2libGluZywiZGVmcyIhPWIudGFnTmFtZT9iLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik6aC5jbGVhci5jYWxsKHtub2RlOmJ9KSxiPWF9fSgpfSksZC5wbHVnaW4oZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShhKXt2YXIgYj1lLnBzPWUucHN8fHt9O3JldHVybiBiW2FdP2JbYV0uc2xlZXA9MTAwOmJbYV09e3NsZWVwOjEwMH0sc2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgYyBpbiBiKWJbTV0oYykmJmMhPWEmJihiW2NdLnNsZWVwLS0sIWJbY10uc2xlZXAmJmRlbGV0ZSBiW2NdKX0pLGJbYV19ZnVuY3Rpb24gZihhLGIsYyxkKXtyZXR1cm4gbnVsbD09YSYmKGE9Yj1jPWQ9MCksbnVsbD09YiYmKGI9YS55LGM9YS53aWR0aCxkPWEuaGVpZ2h0LGE9YS54KSx7eDphLHk6Yix3aWR0aDpjLHc6YyxoZWlnaHQ6ZCxoOmQseDI6YStjLHkyOmIrZCxjeDphK2MvMixjeTpiK2QvMixyMTpQLm1pbihjLGQpLzIscjI6UC5tYXgoYyxkKS8yLHIwOlAuc3FydChjKmMrZCpkKS8yLHBhdGg6eShhLGIsYyxkKSx2YjpbYSxiLGMsZF0uam9pbigiICIpfX1mdW5jdGlvbiBnKCl7cmV0dXJuIHRoaXMuam9pbigiLCIpLnJlcGxhY2UoTiwiJDEiKX1mdW5jdGlvbiBoKGEpe3ZhciBiPUwoYSk7cmV0dXJuIGIudG9TdHJpbmc9ZyxifWZ1bmN0aW9uIGkoYSxiLGMsZCxlLGYsZyxoLGkpe3JldHVybiBudWxsPT1pP3AoYSxiLGMsZCxlLGYsZyxoKTprKGEsYixjLGQsZSxmLGcsaCxxKGEsYixjLGQsZSxmLGcsaCxpKSl9ZnVuY3Rpb24gaihjLGQpe2Z1bmN0aW9uIGUoYSl7cmV0dXJuKygrYSkudG9GaXhlZCgzKX1yZXR1cm4gYS5fLmNhY2hlcihmdW5jdGlvbihhLGYsZyl7YSBpbnN0YW5jZW9mIGImJihhPWEuYXR0cigiZCIpKSxhPUcoYSk7Zm9yKHZhciBoLGosbCxtLG4sbz0iIixwPXt9LHE9MCxyPTAscz1hLmxlbmd0aDtzPnI7cisrKXtpZihsPWFbcl0sIk0iPT1sWzBdKWg9K2xbMV0saj0rbFsyXTtlbHNle2lmKG09aShoLGosbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLGxbNl0pLHErbT5mKXtpZihkJiYhcC5zdGFydCl7aWYobj1pKGgsaixsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0sbFs2XSxmLXEpLG8rPVsiQyIrZShuLnN0YXJ0LngpLGUobi5zdGFydC55KSxlKG4ubS54KSxlKG4ubS55KSxlKG4ueCksZShuLnkpXSxnKXJldHVybiBvO3Auc3RhcnQ9byxvPVsiTSIrZShuLngpLGUobi55KSsiQyIrZShuLm4ueCksZShuLm4ueSksZShuLmVuZC54KSxlKG4uZW5kLnkpLGUobFs1XSksZShsWzZdKV0uam9pbigpLHErPW0saD0rbFs1XSxqPStsWzZdO2NvbnRpbnVlfWlmKCFjJiYhZClyZXR1cm4gbj1pKGgsaixsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0sbFs2XSxmLXEpfXErPW0saD0rbFs1XSxqPStsWzZdfW8rPWwuc2hpZnQoKStsfXJldHVybiBwLmVuZD1vLG49Yz9xOmQ/cDprKGgsaixsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSwxKX0sbnVsbCxhLl8uY2xvbmUpfWZ1bmN0aW9uIGsoYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciBqPTEtaSxrPVQoaiwzKSxsPVQoaiwyKSxtPWkqaSxuPW0qaSxvPWsqYSszKmwqaSpjKzMqaippKmkqZStuKmcscD1rKmIrMypsKmkqZCszKmoqaSppKmYrbipoLHE9YSsyKmkqKGMtYSkrbSooZS0yKmMrYSkscj1iKzIqaSooZC1iKSttKihmLTIqZCtiKSxzPWMrMippKihlLWMpK20qKGctMiplK2MpLHQ9ZCsyKmkqKGYtZCkrbSooaC0yKmYrZCksdT1qKmEraSpjLHY9aipiK2kqZCx3PWoqZStpKmcseD1qKmYraSpoLHk9OTAtMTgwKlAuYXRhbjIocS1zLHItdCkvUTtyZXR1cm57eDpvLHk6cCxtOnt4OnEseTpyfSxuOnt4OnMseTp0fSxzdGFydDp7eDp1LHk6dn0sZW5kOnt4OncseTp4fSxhbHBoYTp5fX1mdW5jdGlvbiBsKGIsYyxkLGUsZyxoLGksail7YS5pcyhiLCJhcnJheSIpfHwoYj1bYixjLGQsZSxnLGgsaSxqXSk7dmFyIGs9Ri5hcHBseShudWxsLGIpO3JldHVybiBmKGsubWluLngsay5taW4ueSxrLm1heC54LWsubWluLngsay5tYXgueS1rLm1pbi55KX1mdW5jdGlvbiBtKGEsYixjKXtyZXR1cm4gYj49YS54JiZiPD1hLngrYS53aWR0aCYmYz49YS55JiZjPD1hLnkrYS5oZWlnaHR9ZnVuY3Rpb24gbihhLGIpe3JldHVybiBhPWYoYSksYj1mKGIpLG0oYixhLngsYS55KXx8bShiLGEueDIsYS55KXx8bShiLGEueCxhLnkyKXx8bShiLGEueDIsYS55Mil8fG0oYSxiLngsYi55KXx8bShhLGIueDIsYi55KXx8bShhLGIueCxiLnkyKXx8bShhLGIueDIsYi55Mil8fChhLng8Yi54MiYmYS54PmIueHx8Yi54PGEueDImJmIueD5hLngpJiYoYS55PGIueTImJmEueT5iLnl8fGIueTxhLnkyJiZiLnk+YS55KX1mdW5jdGlvbiBvKGEsYixjLGQsZSl7dmFyIGY9LTMqYis5KmMtOSpkKzMqZSxnPWEqZis2KmItMTIqYys2KmQ7cmV0dXJuIGEqZy0zKmIrMypjfWZ1bmN0aW9uIHAoYSxiLGMsZCxlLGYsZyxoLGkpe251bGw9PWkmJihpPTEpLGk9aT4xPzE6MD5pPzA6aTtmb3IodmFyIGo9aS8yLGs9MTIsbD1bLS4xMjUyLC4xMjUyLC0uMzY3OCwuMzY3OCwtLjU4NzMsLjU4NzMsLS43Njk5LC43Njk5LC0uOTA0MSwuOTA0MSwtLjk4MTYsLjk4MTZdLG09Wy4yNDkxLC4yNDkxLC4yMzM1LC4yMzM1LC4yMDMyLC4yMDMyLC4xNjAxLC4xNjAxLC4xMDY5LC4xMDY5LC4wNDcyLC4wNDcyXSxuPTAscD0wO2s+cDtwKyspe3ZhciBxPWoqbFtwXStqLHI9byhxLGEsYyxlLGcpLHM9byhxLGIsZCxmLGgpLHQ9cipyK3MqcztuKz1tW3BdKlAuc3FydCh0KX1yZXR1cm4gaipufWZ1bmN0aW9uIHEoYSxiLGMsZCxlLGYsZyxoLGkpe2lmKCEoMD5pfHxwKGEsYixjLGQsZSxmLGcsaCk8aSkpe3ZhciBqLGs9MSxsPWsvMixtPWstbCxuPS4wMTtmb3Ioaj1wKGEsYixjLGQsZSxmLGcsaCxtKTtVKGotaSk+bjspbC89MixtKz0oaT5qPzE6LTEpKmwsaj1wKGEsYixjLGQsZSxmLGcsaCxtKTtyZXR1cm4gbX19ZnVuY3Rpb24gcihhLGIsYyxkLGUsZixnLGgpe2lmKCEoUyhhLGMpPFIoZSxnKXx8UihhLGMpPlMoZSxnKXx8UyhiLGQpPFIoZixoKXx8UihiLGQpPlMoZixoKSkpe3ZhciBpPShhKmQtYipjKSooZS1nKS0oYS1jKSooZSpoLWYqZyksaj0oYSpkLWIqYykqKGYtaCktKGItZCkqKGUqaC1mKmcpLGs9KGEtYykqKGYtaCktKGItZCkqKGUtZyk7aWYoayl7dmFyIGw9aS9rLG09ai9rLG49K2wudG9GaXhlZCgyKSxvPSttLnRvRml4ZWQoMik7aWYoIShuPCtSKGEsYykudG9GaXhlZCgyKXx8bj4rUyhhLGMpLnRvRml4ZWQoMil8fG48K1IoZSxnKS50b0ZpeGVkKDIpfHxuPitTKGUsZykudG9GaXhlZCgyKXx8bzwrUihiLGQpLnRvRml4ZWQoMil8fG8+K1MoYixkKS50b0ZpeGVkKDIpfHxvPCtSKGYsaCkudG9GaXhlZCgyKXx8bz4rUyhmLGgpLnRvRml4ZWQoMikpKXJldHVybnt4OmwseTptfX19fWZ1bmN0aW9uIHMoYSxiLGMpe3ZhciBkPWwoYSksZT1sKGIpO2lmKCFuKGQsZSkpcmV0dXJuIGM/MDpbXTtmb3IodmFyIGY9cC5hcHBseSgwLGEpLGc9cC5hcHBseSgwLGIpLGg9fn4oZi84KSxpPX5+KGcvOCksaj1bXSxtPVtdLG89e30scT1jPzA6W10scz0wO2grMT5zO3MrKyl7dmFyIHQ9ay5hcHBseSgwLGEuY29uY2F0KHMvaCkpO2oucHVzaCh7eDp0LngseTp0LnksdDpzL2h9KX1mb3Iocz0wO2krMT5zO3MrKyl0PWsuYXBwbHkoMCxiLmNvbmNhdChzL2kpKSxtLnB1c2goe3g6dC54LHk6dC55LHQ6cy9pfSk7Zm9yKHM9MDtoPnM7cysrKWZvcih2YXIgdT0wO2k+dTt1Kyspe3ZhciB2PWpbc10sdz1qW3MrMV0seD1tW3VdLHk9bVt1KzFdLHo9VSh3Lngtdi54KTwuMDAxPyJ5IjoieCIsQT1VKHkueC14LngpPC4wMDE/InkiOiJ4IixCPXIodi54LHYueSx3Lngsdy55LHgueCx4LnkseS54LHkueSk7aWYoQil7aWYob1tCLngudG9GaXhlZCg0KV09PUIueS50b0ZpeGVkKDQpKWNvbnRpbnVlO29bQi54LnRvRml4ZWQoNCldPUIueS50b0ZpeGVkKDQpO3ZhciBDPXYudCtVKChCW3pdLXZbel0pLyh3W3pdLXZbel0pKSoody50LXYudCksRD14LnQrVSgoQltBXS14W0FdKS8oeVtBXS14W0FdKSkqKHkudC14LnQpO0M+PTAmJjE+PUMmJkQ+PTAmJjE+PUQmJihjP3ErKzpxLnB1c2goe3g6Qi54LHk6Qi55LHQxOkMsdDI6RH0pKX19cmV0dXJuIHF9ZnVuY3Rpb24gdChhLGIpe3JldHVybiB2KGEsYil9ZnVuY3Rpb24gdShhLGIpe3JldHVybiB2KGEsYiwxKX1mdW5jdGlvbiB2KGEsYixjKXthPUcoYSksYj1HKGIpO2Zvcih2YXIgZCxlLGYsZyxoLGksaixrLGwsbSxuPWM/MDpbXSxvPTAscD1hLmxlbmd0aDtwPm87bysrKXt2YXIgcT1hW29dO2lmKCJNIj09cVswXSlkPWg9cVsxXSxlPWk9cVsyXTtlbHNleyJDIj09cVswXT8obD1bZCxlXS5jb25jYXQocS5zbGljZSgxKSksZD1sWzZdLGU9bFs3XSk6KGw9W2QsZSxkLGUsaCxpLGgsaV0sZD1oLGU9aSk7Zm9yKHZhciByPTAsdD1iLmxlbmd0aDt0PnI7cisrKXt2YXIgdT1iW3JdO2lmKCJNIj09dVswXSlmPWo9dVsxXSxnPWs9dVsyXTtlbHNleyJDIj09dVswXT8obT1bZixnXS5jb25jYXQodS5zbGljZSgxKSksZj1tWzZdLGc9bVs3XSk6KG09W2YsZyxmLGcsaixrLGosa10sZj1qLGc9ayk7dmFyIHY9cyhsLG0sYyk7aWYoYyluKz12O2Vsc2V7Zm9yKHZhciB3PTAseD12Lmxlbmd0aDt4Pnc7dysrKXZbd10uc2VnbWVudDE9byx2W3ddLnNlZ21lbnQyPXIsdlt3XS5iZXoxPWwsdlt3XS5iZXoyPW07bj1uLmNvbmNhdCh2KX19fX19cmV0dXJuIG59ZnVuY3Rpb24gdyhhLGIsYyl7dmFyIGQ9eChhKTtyZXR1cm4gbShkLGIsYykmJnYoYSxbWyJNIixiLGNdLFsiSCIsZC54MisxMF1dLDEpJTI9PTF9ZnVuY3Rpb24geChhKXt2YXIgYj1lKGEpO2lmKGIuYmJveClyZXR1cm4gTChiLmJib3gpO2lmKCFhKXJldHVybiBmKCk7YT1HKGEpO2Zvcih2YXIgYyxkPTAsZz0wLGg9W10saT1bXSxqPTAsaz1hLmxlbmd0aDtrPmo7aisrKWlmKGM9YVtqXSwiTSI9PWNbMF0pZD1jWzFdLGc9Y1syXSxoLnB1c2goZCksaS5wdXNoKGcpO2Vsc2V7dmFyIGw9RihkLGcsY1sxXSxjWzJdLGNbM10sY1s0XSxjWzVdLGNbNl0pO2g9aC5jb25jYXQobC5taW4ueCxsLm1heC54KSxpPWkuY29uY2F0KGwubWluLnksbC5tYXgueSksZD1jWzVdLGc9Y1s2XX12YXIgbT1SLmFwcGx5KDAsaCksbj1SLmFwcGx5KDAsaSksbz1TLmFwcGx5KDAsaCkscD1TLmFwcGx5KDAsaSkscT1mKG0sbixvLW0scC1uKTtyZXR1cm4gYi5iYm94PUwocSkscX1mdW5jdGlvbiB5KGEsYixjLGQsZSl7aWYoZSlyZXR1cm5bWyJNIiwrYSsgK2UsYl0sWyJsIixjLTIqZSwwXSxbImEiLGUsZSwwLDAsMSxlLGVdLFsibCIsMCxkLTIqZV0sWyJhIixlLGUsMCwwLDEsLWUsZV0sWyJsIiwyKmUtYywwXSxbImEiLGUsZSwwLDAsMSwtZSwtZV0sWyJsIiwwLDIqZS1kXSxbImEiLGUsZSwwLDAsMSxlLC1lXSxbInoiXV07dmFyIGY9W1siTSIsYSxiXSxbImwiLGMsMF0sWyJsIiwwLGRdLFsibCIsLWMsMF0sWyJ6Il1dO3JldHVybiBmLnRvU3RyaW5nPWcsZn1mdW5jdGlvbiB6KGEsYixjLGQsZSl7aWYobnVsbD09ZSYmbnVsbD09ZCYmKGQ9YyksYT0rYSxiPStiLGM9K2MsZD0rZCxudWxsIT1lKXZhciBmPU1hdGguUEkvMTgwLGg9YStjKk1hdGguY29zKC1kKmYpLGk9YStjKk1hdGguY29zKC1lKmYpLGo9YitjKk1hdGguc2luKC1kKmYpLGs9YitjKk1hdGguc2luKC1lKmYpLGw9W1siTSIsaCxqXSxbIkEiLGMsYywwLCsoZS1kPjE4MCksMCxpLGtdXTtlbHNlIGw9W1siTSIsYSxiXSxbIm0iLDAsLWRdLFsiYSIsYyxkLDAsMSwxLDAsMipkXSxbImEiLGMsZCwwLDEsMSwwLC0yKmRdLFsieiJdXTtyZXR1cm4gbC50b1N0cmluZz1nLGx9ZnVuY3Rpb24gQShiKXt2YXIgYz1lKGIpLGQ9U3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZTtpZihjLnJlbClyZXR1cm4gaChjLnJlbCk7YS5pcyhiLCJhcnJheSIpJiZhLmlzKGImJmJbMF0sImFycmF5Iil8fChiPWEucGFyc2VQYXRoU3RyaW5nKGIpKTt2YXIgZj1bXSxpPTAsaj0wLGs9MCxsPTAsbT0wOyJNIj09YlswXVswXSYmKGk9YlswXVsxXSxqPWJbMF1bMl0saz1pLGw9aixtKyssZi5wdXNoKFsiTSIsaSxqXSkpO2Zvcih2YXIgbj1tLG89Yi5sZW5ndGg7bz5uO24rKyl7dmFyIHA9ZltuXT1bXSxxPWJbbl07aWYocVswXSE9ZC5jYWxsKHFbMF0pKXN3aXRjaChwWzBdPWQuY2FsbChxWzBdKSxwWzBdKXtjYXNlImEiOnBbMV09cVsxXSxwWzJdPXFbMl0scFszXT1xWzNdLHBbNF09cVs0XSxwWzVdPXFbNV0scFs2XT0rKHFbNl0taSkudG9GaXhlZCgzKSxwWzddPSsocVs3XS1qKS50b0ZpeGVkKDMpO2JyZWFrO2Nhc2UidiI6cFsxXT0rKHFbMV0taikudG9GaXhlZCgzKTticmVhaztjYXNlIm0iOms9cVsxXSxsPXFbMl07ZGVmYXVsdDpmb3IodmFyIHI9MSxzPXEubGVuZ3RoO3M+cjtyKyspcFtyXT0rKHFbcl0tKHIlMj9pOmopKS50b0ZpeGVkKDMpfWVsc2V7cD1mW25dPVtdLCJtIj09cVswXSYmKGs9cVsxXStpLGw9cVsyXStqKTtmb3IodmFyIHQ9MCx1PXEubGVuZ3RoO3U+dDt0KyspZltuXVt0XT1xW3RdfXZhciB2PWZbbl0ubGVuZ3RoO3N3aXRjaChmW25dWzBdKXtjYXNlInoiOmk9ayxqPWw7YnJlYWs7Y2FzZSJoIjppKz0rZltuXVt2LTFdO2JyZWFrO2Nhc2UidiI6ais9K2Zbbl1bdi0xXTticmVhaztkZWZhdWx0OmkrPStmW25dW3YtMl0sais9K2Zbbl1bdi0xXX19cmV0dXJuIGYudG9TdHJpbmc9ZyxjLnJlbD1oKGYpLGZ9ZnVuY3Rpb24gQihiKXt2YXIgYz1lKGIpO2lmKGMuYWJzKXJldHVybiBoKGMuYWJzKTtpZihLKGIsImFycmF5IikmJksoYiYmYlswXSwiYXJyYXkiKXx8KGI9YS5wYXJzZVBhdGhTdHJpbmcoYikpLCFifHwhYi5sZW5ndGgpcmV0dXJuW1siTSIsMCwwXV07dmFyIGQsZj1bXSxpPTAsaj0wLGs9MCxsPTAsbT0wOyJNIj09YlswXVswXSYmKGk9K2JbMF1bMV0saj0rYlswXVsyXSxrPWksbD1qLG0rKyxmWzBdPVsiTSIsaSxqXSk7Zm9yKHZhciBuLG8scD0zPT1iLmxlbmd0aCYmIk0iPT1iWzBdWzBdJiYiUiI9PWJbMV1bMF0udG9VcHBlckNhc2UoKSYmIloiPT1iWzJdWzBdLnRvVXBwZXJDYXNlKCkscT1tLHI9Yi5sZW5ndGg7cj5xO3ErKyl7aWYoZi5wdXNoKG49W10pLG89YltxXSxkPW9bMF0sZCE9ZC50b1VwcGVyQ2FzZSgpKXN3aXRjaChuWzBdPWQudG9VcHBlckNhc2UoKSxuWzBdKXtjYXNlIkEiOm5bMV09b1sxXSxuWzJdPW9bMl0sblszXT1vWzNdLG5bNF09b1s0XSxuWzVdPW9bNV0sbls2XT0rb1s2XStpLG5bN109K29bN10rajticmVhaztjYXNlIlYiOm5bMV09K29bMV0rajticmVhaztjYXNlIkgiOm5bMV09K29bMV0raTticmVhaztjYXNlIlIiOmZvcih2YXIgcz1baSxqXS5jb25jYXQoby5zbGljZSgxKSksdD0yLHU9cy5sZW5ndGg7dT50O3QrKylzW3RdPStzW3RdK2ksc1srK3RdPStzW3RdK2o7Zi5wb3AoKSxmPWYuY29uY2F0KEkocyxwKSk7YnJlYWs7Y2FzZSJPIjpmLnBvcCgpLHM9eihpLGosb1sxXSxvWzJdKSxzLnB1c2goc1swXSksZj1mLmNvbmNhdChzKTticmVhaztjYXNlIlUiOmYucG9wKCksZj1mLmNvbmNhdCh6KGksaixvWzFdLG9bMl0sb1szXSkpLG49WyJVIl0uY29uY2F0KGZbZi5sZW5ndGgtMV0uc2xpY2UoLTIpKTticmVhaztjYXNlIk0iOms9K29bMV0raSxsPStvWzJdK2o7ZGVmYXVsdDpmb3IodD0xLHU9by5sZW5ndGg7dT50O3QrKyluW3RdPStvW3RdKyh0JTI/aTpqKX1lbHNlIGlmKCJSIj09ZClzPVtpLGpdLmNvbmNhdChvLnNsaWNlKDEpKSxmLnBvcCgpLGY9Zi5jb25jYXQoSShzLHApKSxuPVsiUiJdLmNvbmNhdChvLnNsaWNlKC0yKSk7ZWxzZSBpZigiTyI9PWQpZi5wb3AoKSxzPXooaSxqLG9bMV0sb1syXSkscy5wdXNoKHNbMF0pLGY9Zi5jb25jYXQocyk7ZWxzZSBpZigiVSI9PWQpZi5wb3AoKSxmPWYuY29uY2F0KHooaSxqLG9bMV0sb1syXSxvWzNdKSksbj1bIlUiXS5jb25jYXQoZltmLmxlbmd0aC0xXS5zbGljZSgtMikpO2Vsc2UgZm9yKHZhciB2PTAsdz1vLmxlbmd0aDt3PnY7disrKW5bdl09b1t2XTtpZihkPWQudG9VcHBlckNhc2UoKSwiTyIhPWQpc3dpdGNoKG5bMF0pe2Nhc2UiWiI6aT0rayxqPStsO2JyZWFrO2Nhc2UiSCI6aT1uWzFdO2JyZWFrO2Nhc2UiViI6aj1uWzFdO2JyZWFrO2Nhc2UiTSI6az1uW24ubGVuZ3RoLTJdLGw9bltuLmxlbmd0aC0xXTtkZWZhdWx0Omk9bltuLmxlbmd0aC0yXSxqPW5bbi5sZW5ndGgtMV19fXJldHVybiBmLnRvU3RyaW5nPWcsYy5hYnM9aChmKSxmfWZ1bmN0aW9uIEMoYSxiLGMsZCl7cmV0dXJuW2EsYixjLGQsYyxkXX1mdW5jdGlvbiBEKGEsYixjLGQsZSxmKXt2YXIgZz0xLzMsaD0yLzM7cmV0dXJuW2cqYStoKmMsZypiK2gqZCxnKmUraCpjLGcqZitoKmQsZSxmXX1mdW5jdGlvbiBFKGIsYyxkLGUsZixnLGgsaSxqLGspe3ZhciBsLG09MTIwKlEvMTgwLG49US8xODAqKCtmfHwwKSxvPVtdLHA9YS5fLmNhY2hlcihmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSpQLmNvcyhjKS1iKlAuc2luKGMpLGU9YSpQLnNpbihjKStiKlAuY29zKGMpO3JldHVybnt4OmQseTplfX0pO2lmKCFkfHwhZSlyZXR1cm5bYixjLGksaixpLGpdO2lmKGspeT1rWzBdLHo9a1sxXSx3PWtbMl0seD1rWzNdO2Vsc2V7bD1wKGIsYywtbiksYj1sLngsYz1sLnksbD1wKGksaiwtbiksaT1sLngsaj1sLnk7dmFyIHE9KFAuY29zKFEvMTgwKmYpLFAuc2luKFEvMTgwKmYpLChiLWkpLzIpLHI9KGMtaikvMixzPXEqcS8oZCpkKStyKnIvKGUqZSk7cz4xJiYocz1QLnNxcnQocyksZD1zKmQsZT1zKmUpO3ZhciB0PWQqZCx1PWUqZSx2PShnPT1oPy0xOjEpKlAuc3FydChVKCh0KnUtdCpyKnItdSpxKnEpLyh0KnIqcit1KnEqcSkpKSx3PXYqZCpyL2UrKGIraSkvMix4PXYqLWUqcS9kKyhjK2opLzIseT1QLmFzaW4oKChjLXgpL2UpLnRvRml4ZWQoOSkpLHo9UC5hc2luKCgoai14KS9lKS50b0ZpeGVkKDkpKTt5PXc+Yj9RLXk6eSx6PXc+aT9RLXo6eiwwPnkmJih5PTIqUSt5KSwwPnomJih6PTIqUSt6KSxoJiZ5PnomJih5LT0yKlEpLCFoJiZ6PnkmJih6LT0yKlEpfXZhciBBPXoteTtpZihVKEEpPm0pe3ZhciBCPXosQz1pLEQ9ajt6PXkrbSooaCYmej55PzE6LTEpLGk9dytkKlAuY29zKHopLGo9eCtlKlAuc2luKHopLG89RShpLGosZCxlLGYsMCxoLEMsRCxbeixCLHcseF0pfUE9ei15O3ZhciBGPVAuY29zKHkpLEc9UC5zaW4oeSksSD1QLmNvcyh6KSxJPVAuc2luKHopLEo9UC50YW4oQS80KSxLPTQvMypkKkosTD00LzMqZSpKLE09W2IsY10sTj1bYitLKkcsYy1MKkZdLE89W2krSypJLGotTCpIXSxSPVtpLGpdO2lmKE5bMF09MipNWzBdLU5bMF0sTlsxXT0yKk1bMV0tTlsxXSxrKXJldHVybltOLE8sUl0uY29uY2F0KG8pO289W04sTyxSXS5jb25jYXQobykuam9pbigpLnNwbGl0KCIsIik7Zm9yKHZhciBTPVtdLFQ9MCxWPW8ubGVuZ3RoO1Y+VDtUKyspU1tUXT1UJTI/cChvW1QtMV0sb1tUXSxuKS55OnAob1tUXSxvW1QrMV0sbikueDtyZXR1cm4gU31mdW5jdGlvbiBGKGEsYixjLGQsZSxmLGcsaCl7Zm9yKHZhciBpLGosayxsLG0sbixvLHAscT1bXSxyPVtbXSxbXV0scz0wOzI+czsrK3MpaWYoMD09cz8oaj02KmEtMTIqYys2KmUsaT0tMyphKzkqYy05KmUrMypnLGs9MypjLTMqYSk6KGo9NipiLTEyKmQrNipmLGk9LTMqYis5KmQtOSpmKzMqaCxrPTMqZC0zKmIpLFUoaSk8MWUtMTIpe2lmKFUoaik8MWUtMTIpY29udGludWU7bD0tay9qLGw+MCYmMT5sJiZxLnB1c2gobCl9ZWxzZSBvPWoqai00KmsqaSxwPVAuc3FydChvKSwwPm98fChtPSgtaitwKS8oMippKSxtPjAmJjE+bSYmcS5wdXNoKG0pLG49KC1qLXApLygyKmkpLG4+MCYmMT5uJiZxLnB1c2gobikpO2Zvcih2YXIgdCx1PXEubGVuZ3RoLHY9dTt1LS07KWw9cVt1XSx0PTEtbCxyWzBdW3VdPXQqdCp0KmErMyp0KnQqbCpjKzMqdCpsKmwqZStsKmwqbCpnLHJbMV1bdV09dCp0KnQqYiszKnQqdCpsKmQrMyp0KmwqbCpmK2wqbCpsKmg7cmV0dXJuIHJbMF1bdl09YSxyWzFdW3ZdPWIsclswXVt2KzFdPWcsclsxXVt2KzFdPWgsclswXS5sZW5ndGg9clsxXS5sZW5ndGg9disyLHttaW46e3g6Ui5hcHBseSgwLHJbMF0pLHk6Ui5hcHBseSgwLHJbMV0pfSxtYXg6e3g6Uy5hcHBseSgwLHJbMF0pLHk6Uy5hcHBseSgwLHJbMV0pfX19ZnVuY3Rpb24gRyhhLGIpe3ZhciBjPSFiJiZlKGEpO2lmKCFiJiZjLmN1cnZlKXJldHVybiBoKGMuY3VydmUpO2Zvcih2YXIgZD1CKGEpLGY9YiYmQihiKSxnPXt4OjAseTowLGJ4OjAsYnk6MCxYOjAsWTowLHF4Om51bGwscXk6bnVsbH0saT17eDowLHk6MCxieDowLGJ5OjAsWDowLFk6MCxxeDpudWxsLHF5Om51bGx9LGo9KGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKCFhKXJldHVyblsiQyIsYi54LGIueSxiLngsYi55LGIueCxiLnldO3N3aXRjaCghKGFbMF1pbntUOjEsUToxfSkmJihiLnF4PWIucXk9bnVsbCksYVswXSl7Y2FzZSJNIjpiLlg9YVsxXSxiLlk9YVsyXTticmVhaztjYXNlIkEiOmE9WyJDIl0uY29uY2F0KEUuYXBwbHkoMCxbYi54LGIueV0uY29uY2F0KGEuc2xpY2UoMSkpKSk7YnJlYWs7Y2FzZSJTIjoiQyI9PWN8fCJTIj09Yz8oZD0yKmIueC1iLmJ4LGU9MipiLnktYi5ieSk6KGQ9Yi54LGU9Yi55KSxhPVsiQyIsZCxlXS5jb25jYXQoYS5zbGljZSgxKSk7YnJlYWs7Y2FzZSJUIjoiUSI9PWN8fCJUIj09Yz8oYi5xeD0yKmIueC1iLnF4LGIucXk9MipiLnktYi5xeSk6KGIucXg9Yi54LGIucXk9Yi55KSxhPVsiQyJdLmNvbmNhdChEKGIueCxiLnksYi5xeCxiLnF5LGFbMV0sYVsyXSkpO2JyZWFrO2Nhc2UiUSI6Yi5xeD1hWzFdLGIucXk9YVsyXSxhPVsiQyJdLmNvbmNhdChEKGIueCxiLnksYVsxXSxhWzJdLGFbM10sYVs0XSkpO2JyZWFrO2Nhc2UiTCI6YT1bIkMiXS5jb25jYXQoQyhiLngsYi55LGFbMV0sYVsyXSkpO2JyZWFrO2Nhc2UiSCI6YT1bIkMiXS5jb25jYXQoQyhiLngsYi55LGFbMV0sYi55KSk7YnJlYWs7Y2FzZSJWIjphPVsiQyJdLmNvbmNhdChDKGIueCxiLnksYi54LGFbMV0pKTticmVhaztjYXNlIloiOmE9WyJDIl0uY29uY2F0KEMoYi54LGIueSxiLlgsYi5ZKSl9cmV0dXJuIGF9KSxrPWZ1bmN0aW9uKGEsYil7aWYoYVtiXS5sZW5ndGg+Nyl7YVtiXS5zaGlmdCgpO2Zvcih2YXIgYz1hW2JdO2MubGVuZ3RoOyltW2JdPSJBIixmJiYobltiXT0iQSIpLGEuc3BsaWNlKGIrKywwLFsiQyJdLmNvbmNhdChjLnNwbGljZSgwLDYpKSk7YS5zcGxpY2UoYiwxKSxyPVMoZC5sZW5ndGgsZiYmZi5sZW5ndGh8fDApfX0sbD1mdW5jdGlvbihhLGIsYyxlLGcpe2EmJmImJiJNIj09YVtnXVswXSYmIk0iIT1iW2ddWzBdJiYoYi5zcGxpY2UoZywwLFsiTSIsZS54LGUueV0pLGMuYng9MCxjLmJ5PTAsYy54PWFbZ11bMV0sYy55PWFbZ11bMl0scj1TKGQubGVuZ3RoLGYmJmYubGVuZ3RofHwwKSl9LG09W10sbj1bXSxvPSIiLHA9IiIscT0wLHI9UyhkLmxlbmd0aCxmJiZmLmxlbmd0aHx8MCk7cj5xO3ErKyl7ZFtxXSYmKG89ZFtxXVswXSksIkMiIT1vJiYobVtxXT1vLHEmJihwPW1bcS0xXSkpLGRbcV09aihkW3FdLGcscCksIkEiIT1tW3FdJiYiQyI9PW8mJihtW3FdPSJDIiksayhkLHEpLGYmJihmW3FdJiYobz1mW3FdWzBdKSwiQyIhPW8mJihuW3FdPW8scSYmKHA9bltxLTFdKSksZltxXT1qKGZbcV0saSxwKSwiQSIhPW5bcV0mJiJDIj09byYmKG5bcV09IkMiKSxrKGYscSkpLGwoZCxmLGcsaSxxKSxsKGYsZCxpLGcscSk7dmFyIHM9ZFtxXSx0PWYmJmZbcV0sdT1zLmxlbmd0aCx2PWYmJnQubGVuZ3RoO2cueD1zW3UtMl0sZy55PXNbdS0xXSxnLmJ4PU8oc1t1LTRdKXx8Zy54LGcuYnk9TyhzW3UtM10pfHxnLnksaS5ieD1mJiYoTyh0W3YtNF0pfHxpLngpLGkuYnk9ZiYmKE8odFt2LTNdKXx8aS55KSxpLng9ZiYmdFt2LTJdLGkueT1mJiZ0W3YtMV19cmV0dXJuIGZ8fChjLmN1cnZlPWgoZCkpLGY/W2QsZl06ZH1mdW5jdGlvbiBIKGEsYil7aWYoIWIpcmV0dXJuIGE7dmFyIGMsZCxlLGYsZyxoLGk7Zm9yKGE9RyhhKSxlPTAsZz1hLmxlbmd0aDtnPmU7ZSsrKWZvcihpPWFbZV0sZj0xLGg9aS5sZW5ndGg7aD5mO2YrPTIpYz1iLngoaVtmXSxpW2YrMV0pLGQ9Yi55KGlbZl0saVtmKzFdKSxpW2ZdPWMsaVtmKzFdPWQ7cmV0dXJuIGF9ZnVuY3Rpb24gSShhLGIpe2Zvcih2YXIgYz1bXSxkPTAsZT1hLmxlbmd0aDtlLTIqIWI+ZDtkKz0yKXt2YXIgZj1be3g6K2FbZC0yXSx5OithW2QtMV19LHt4OithW2RdLHk6K2FbZCsxXX0se3g6K2FbZCsyXSx5OithW2QrM119LHt4OithW2QrNF0seTorYVtkKzVdfV07Yj9kP2UtND09ZD9mWzNdPXt4OithWzBdLHk6K2FbMV19OmUtMj09ZCYmKGZbMl09e3g6K2FbMF0seTorYVsxXX0sZlszXT17eDorYVsyXSx5OithWzNdfSk6ZlswXT17eDorYVtlLTJdLHk6K2FbZS0xXX06ZS00PT1kP2ZbM109ZlsyXTpkfHwoZlswXT17eDorYVtkXSx5OithW2QrMV19KSxjLnB1c2goWyJDIiwoLWZbMF0ueCs2KmZbMV0ueCtmWzJdLngpLzYsKC1mWzBdLnkrNipmWzFdLnkrZlsyXS55KS82LChmWzFdLngrNipmWzJdLngtZlszXS54KS82LChmWzFdLnkrNipmWzJdLnktZlszXS55KS82LGZbMl0ueCxmWzJdLnldKX1yZXR1cm4gY312YXIgSj1iLnByb3RvdHlwZSxLPWEuaXMsTD1hLl8uY2xvbmUsTT0iaGFzT3duUHJvcGVydHkiLE49Lyw/KFthLXpdKSw/L2dpLE89cGFyc2VGbG9hdCxQPU1hdGgsUT1QLlBJLFI9UC5taW4sUz1QLm1heCxUPVAucG93LFU9UC5hYnMsVj1qKDEpLFc9aigpLFg9aigwLDEpLFk9YS5fdW5pdDJweCxaPXtwYXRoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmF0dHIoInBhdGgiKX0sY2lyY2xlOmZ1bmN0aW9uKGEpe3ZhciBiPVkoYSk7cmV0dXJuIHooYi5jeCxiLmN5LGIucil9LGVsbGlwc2U6ZnVuY3Rpb24oYSl7dmFyIGI9WShhKTtyZXR1cm4geihiLmN4fHwwLGIuY3l8fDAsYi5yeCxiLnJ5KTsKfSxyZWN0OmZ1bmN0aW9uKGEpe3ZhciBiPVkoYSk7cmV0dXJuIHkoYi54fHwwLGIueXx8MCxiLndpZHRoLGIuaGVpZ2h0LGIucngsYi5yeSl9LGltYWdlOmZ1bmN0aW9uKGEpe3ZhciBiPVkoYSk7cmV0dXJuIHkoYi54fHwwLGIueXx8MCxiLndpZHRoLGIuaGVpZ2h0KX0sbGluZTpmdW5jdGlvbihhKXtyZXR1cm4iTSIrW2EuYXR0cigieDEiKXx8MCxhLmF0dHIoInkxIil8fDAsYS5hdHRyKCJ4MiIpLGEuYXR0cigieTIiKV19LHBvbHlsaW5lOmZ1bmN0aW9uKGEpe3JldHVybiJNIithLmF0dHIoInBvaW50cyIpfSxwb2x5Z29uOmZ1bmN0aW9uKGEpe3JldHVybiJNIithLmF0dHIoInBvaW50cyIpKyJ6In0sZGVmbHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlLmdldEJCb3goKTtyZXR1cm4geShiLngsYi55LGIud2lkdGgsYi5oZWlnaHQpfX07YS5wYXRoPWUsYS5wYXRoLmdldFRvdGFsTGVuZ3RoPVYsYS5wYXRoLmdldFBvaW50QXRMZW5ndGg9VyxhLnBhdGguZ2V0U3VicGF0aD1mdW5jdGlvbihhLGIsYyl7aWYodGhpcy5nZXRUb3RhbExlbmd0aChhKS1jPDFlLTYpcmV0dXJuIFgoYSxiKS5lbmQ7dmFyIGQ9WChhLGMsMSk7cmV0dXJuIGI/WChkLGIpLmVuZDpkfSxKLmdldFRvdGFsTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRUb3RhbExlbmd0aD90aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGgoKTp2b2lkIDB9LEouZ2V0UG9pbnRBdExlbmd0aD1mdW5jdGlvbihhKXtyZXR1cm4gVyh0aGlzLmF0dHIoImQiKSxhKX0sSi5nZXRTdWJwYXRoPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEucGF0aC5nZXRTdWJwYXRoKHRoaXMuYXR0cigiZCIpLGIsYyl9LGEuXy5ib3g9ZixhLnBhdGguZmluZERvdHNBdFNlZ21lbnQ9ayxhLnBhdGguYmV6aWVyQkJveD1sLGEucGF0aC5pc1BvaW50SW5zaWRlQkJveD1tLGEuY2xvc2VzdD1mdW5jdGlvbihiLGMsZCxlKXtmb3IodmFyIGc9MTAwLGg9ZihiLWcvMixjLWcvMixnLGcpLGk9W10saj1kWzBdLmhhc093blByb3BlcnR5KCJ4Iik/ZnVuY3Rpb24oYSl7cmV0dXJue3g6ZFthXS54LHk6ZFthXS55fX06ZnVuY3Rpb24oYSl7cmV0dXJue3g6ZFthXSx5OmVbYV19fSxrPTA7MWU2Pj1nJiYhazspe2Zvcih2YXIgbD0wLG49ZC5sZW5ndGg7bj5sO2wrKyl7dmFyIG89aihsKTtpZihtKGgsby54LG8ueSkpe2srKyxpLnB1c2gobyk7YnJlYWt9fWt8fChnKj0yLGg9ZihiLWcvMixjLWcvMixnLGcpKX1pZigxZTYhPWcpe3ZhciBwLHE9MS8wO2ZvcihsPTAsbj1pLmxlbmd0aDtuPmw7bCsrKXt2YXIgcj1hLmxlbihiLGMsaVtsXS54LGlbbF0ueSk7cT5yJiYocT1yLGlbbF0ubGVuPXIscD1pW2xdKX1yZXR1cm4gcH19LGEucGF0aC5pc0JCb3hJbnRlcnNlY3Q9bixhLnBhdGguaW50ZXJzZWN0aW9uPXQsYS5wYXRoLmludGVyc2VjdGlvbk51bWJlcj11LGEucGF0aC5pc1BvaW50SW5zaWRlPXcsYS5wYXRoLmdldEJCb3g9eCxhLnBhdGguZ2V0PVosYS5wYXRoLnRvUmVsYXRpdmU9QSxhLnBhdGgudG9BYnNvbHV0ZT1CLGEucGF0aC50b0N1YmljPUcsYS5wYXRoLm1hcD1ILGEucGF0aC50b1N0cmluZz1nLGEucGF0aC5jbG9uZT1ofSksZC5wbHVnaW4oZnVuY3Rpb24oYSxkLGUsZil7dmFyIGc9TWF0aC5tYXgsaD1NYXRoLm1pbixpPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaXRlbXM9W10sdGhpcy5iaW5kaW5ncz17fSx0aGlzLmxlbmd0aD0wLHRoaXMudHlwZT0ic2V0IixhKWZvcih2YXIgYj0wLGM9YS5sZW5ndGg7Yz5iO2IrKylhW2JdJiYodGhpc1t0aGlzLml0ZW1zLmxlbmd0aF09dGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aF09YVtiXSx0aGlzLmxlbmd0aCsrKX0saj1pLnByb3RvdHlwZTtqLnB1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIGEsYixjPTAsZD1hcmd1bWVudHMubGVuZ3RoO2Q+YztjKyspYT1hcmd1bWVudHNbY10sYSYmKGI9dGhpcy5pdGVtcy5sZW5ndGgsdGhpc1tiXT10aGlzLml0ZW1zW2JdPWEsdGhpcy5sZW5ndGgrKyk7cmV0dXJuIHRoaXN9LGoucG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoJiZkZWxldGUgdGhpc1t0aGlzLmxlbmd0aC0tXSx0aGlzLml0ZW1zLnBvcCgpfSxqLmZvckVhY2g9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPXRoaXMuaXRlbXMubGVuZ3RoO2Q+YztjKyspaWYoYS5jYWxsKGIsdGhpcy5pdGVtc1tjXSxjKT09PSExKXJldHVybiB0aGlzO3JldHVybiB0aGlzfSxqLmFuaW1hdGU9ZnVuY3Rpb24oZCxlLGYsZyl7ImZ1bmN0aW9uIiE9dHlwZW9mIGZ8fGYubGVuZ3RofHwoZz1mLGY9Yy5saW5lYXIpLGQgaW5zdGFuY2VvZiBhLl8uQW5pbWF0aW9uJiYoZz1kLmNhbGxiYWNrLGY9ZC5lYXNpbmcsZT1mLmR1cixkPWQuYXR0cik7dmFyIGg9YXJndW1lbnRzO2lmKGEuaXMoZCwiYXJyYXkiKSYmYS5pcyhoW2gubGVuZ3RoLTFdLCJhcnJheSIpKXZhciBpPSEwO3ZhciBqLGs9ZnVuY3Rpb24oKXtqP3RoaXMuYj1qOmo9dGhpcy5ifSxsPTAsbT10aGlzLG49ZyYmZnVuY3Rpb24oKXsrK2w9PW0ubGVuZ3RoJiZnLmNhbGwodGhpcyl9O3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oYSxjKXtiLm9uY2UoInNuYXAuYW5pbWNyZWF0ZWQuIithLmlkLGspLGk/aFtjXSYmYS5hbmltYXRlLmFwcGx5KGEsaFtjXSk6YS5hbmltYXRlKGQsZSxmLG4pfSl9LGoucmVtb3ZlPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmxlbmd0aDspdGhpcy5wb3AoKS5yZW1vdmUoKTtyZXR1cm4gdGhpc30sai5iaW5kPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0aGlzLmJpbmRpbmdzW2FdPWI7ZWxzZXt2YXIgZT1jfHxhO3RoaXMuYmluZGluZ3NbYV09ZnVuY3Rpb24oYSl7ZFtlXT1hLGIuYXR0cihkKX19cmV0dXJuIHRoaXN9LGouYXR0cj1mdW5jdGlvbihhKXt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSl0aGlzLmJpbmRpbmdzW2NdP3RoaXMuYmluZGluZ3NbY10oYVtjXSk6YltjXT1hW2NdO2Zvcih2YXIgZD0wLGU9dGhpcy5pdGVtcy5sZW5ndGg7ZT5kO2QrKyl0aGlzLml0ZW1zW2RdLmF0dHIoYik7cmV0dXJuIHRoaXN9LGouY2xlYXI9ZnVuY3Rpb24oKXtmb3IoO3RoaXMubGVuZ3RoOyl0aGlzLnBvcCgpfSxqLnNwbGljZT1mdW5jdGlvbihhLGIsYyl7YT0wPmE/Zyh0aGlzLmxlbmd0aCthLDApOmEsYj1nKDAsaCh0aGlzLmxlbmd0aC1hLGIpKTt2YXIgZCxlPVtdLGY9W10saj1bXTtmb3IoZD0yO2Q8YXJndW1lbnRzLmxlbmd0aDtkKyspai5wdXNoKGFyZ3VtZW50c1tkXSk7Zm9yKGQ9MDtiPmQ7ZCsrKWYucHVzaCh0aGlzW2ErZF0pO2Zvcig7ZDx0aGlzLmxlbmd0aC1hO2QrKyllLnB1c2godGhpc1thK2RdKTt2YXIgaz1qLmxlbmd0aDtmb3IoZD0wO2Q8aytlLmxlbmd0aDtkKyspdGhpcy5pdGVtc1thK2RdPXRoaXNbYStkXT1rPmQ/altkXTplW2Qta107Zm9yKGQ9dGhpcy5pdGVtcy5sZW5ndGg9dGhpcy5sZW5ndGgtPWItazt0aGlzW2RdOylkZWxldGUgdGhpc1tkKytdO3JldHVybiBuZXcgaShmKX0sai5leGNsdWRlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5sZW5ndGg7Yz5iO2IrKylpZih0aGlzW2JdPT1hKXJldHVybiB0aGlzLnNwbGljZShiLDEpLCEwO3JldHVybiExfSxqLmluc2VydEFmdGVyPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aDtiLS07KXRoaXMuaXRlbXNbYl0uaW5zZXJ0QWZ0ZXIoYSk7cmV0dXJuIHRoaXN9LGouZ2V0QkJveD1mdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPVtdLGM9W10sZD1bXSxlPXRoaXMuaXRlbXMubGVuZ3RoO2UtLTspaWYoIXRoaXMuaXRlbXNbZV0ucmVtb3ZlZCl7dmFyIGY9dGhpcy5pdGVtc1tlXS5nZXRCQm94KCk7YS5wdXNoKGYueCksYi5wdXNoKGYueSksYy5wdXNoKGYueCtmLndpZHRoKSxkLnB1c2goZi55K2YuaGVpZ2h0KX1yZXR1cm4gYT1oLmFwcGx5KDAsYSksYj1oLmFwcGx5KDAsYiksYz1nLmFwcGx5KDAsYyksZD1nLmFwcGx5KDAsZCkse3g6YSx5OmIseDI6Yyx5MjpkLHdpZHRoOmMtYSxoZWlnaHQ6ZC1iLGN4OmErKGMtYSkvMixjeTpiKyhkLWIpLzJ9fSxqLmNsb25lPWZ1bmN0aW9uKGEpe2E9bmV3IGk7Zm9yKHZhciBiPTAsYz10aGlzLml0ZW1zLmxlbmd0aDtjPmI7YisrKWEucHVzaCh0aGlzLml0ZW1zW2JdLmNsb25lKCkpO3JldHVybiBhfSxqLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNuYXDigJhzIHNldCJ9LGoudHlwZT0ic2V0IixhLlNldD1pLGEuc2V0PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJmEucHVzaC5hcHBseShhLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSksYX19KSxkLnBsdWdpbihmdW5jdGlvbihhLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3ZhciBiPWFbMF07c3dpdGNoKGIudG9Mb3dlckNhc2UoKSl7Y2FzZSJ0IjpyZXR1cm5bYiwwLDBdO2Nhc2UibSI6cmV0dXJuW2IsMSwwLDAsMSwwLDBdO2Nhc2UiciI6cmV0dXJuIDQ9PWEubGVuZ3RoP1tiLDAsYVsyXSxhWzNdXTpbYiwwXTtjYXNlInMiOnJldHVybiA1PT1hLmxlbmd0aD9bYiwxLDEsYVszXSxhWzRdXTozPT1hLmxlbmd0aD9bYiwxLDFdOltiLDFdfX1mdW5jdGlvbiBnKGIsYyxkKXtiPWJ8fG5ldyBhLk1hdHJpeCxjPWN8fG5ldyBhLk1hdHJpeCxiPWEucGFyc2VUcmFuc2Zvcm1TdHJpbmcoYi50b1RyYW5zZm9ybVN0cmluZygpKXx8W10sYz1hLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGMudG9UcmFuc2Zvcm1TdHJpbmcoKSl8fFtdO2Zvcih2YXIgZSxnLGgsaSxqPU1hdGgubWF4KGIubGVuZ3RoLGMubGVuZ3RoKSxrPVtdLG49W10sbz0wO2o+bztvKyspe2lmKGg9YltvXXx8ZihjW29dKSxpPWNbb118fGYoaCksaFswXSE9aVswXXx8InIiPT1oWzBdLnRvTG93ZXJDYXNlKCkmJihoWzJdIT1pWzJdfHxoWzNdIT1pWzNdKXx8InMiPT1oWzBdLnRvTG93ZXJDYXNlKCkmJihoWzNdIT1pWzNdfHxoWzRdIT1pWzRdKSl7Yj1hLl8udHJhbnNmb3JtMm1hdHJpeChiLGQoKSksYz1hLl8udHJhbnNmb3JtMm1hdHJpeChjLGQoKSksaz1bWyJtIixiLmEsYi5iLGIuYyxiLmQsYi5lLGIuZl1dLG49W1sibSIsYy5hLGMuYixjLmMsYy5kLGMuZSxjLmZdXTticmVha31mb3Ioa1tvXT1bXSxuW29dPVtdLGU9MCxnPU1hdGgubWF4KGgubGVuZ3RoLGkubGVuZ3RoKTtnPmU7ZSsrKWUgaW4gaCYmKGtbb11bZV09aFtlXSksZSBpbiBpJiYobltvXVtlXT1pW2VdKX1yZXR1cm57ZnJvbTptKGspLHRvOm0obiksZjpsKGspfX1mdW5jdGlvbiBoKGEpe3JldHVybiBhfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybitiLnRvRml4ZWQoMykrYX19ZnVuY3Rpb24gaihhKXtyZXR1cm4gYS5qb2luKCIgIil9ZnVuY3Rpb24gayhiKXtyZXR1cm4gYS5yZ2IoYlswXSxiWzFdLGJbMl0sYlszXSl9ZnVuY3Rpb24gbChhKXt2YXIgYixjLGQsZSxmLGcsaD0wLGk9W107Zm9yKGI9MCxjPWEubGVuZ3RoO2M+YjtiKyspe2ZvcihmPSJbIixnPVsnIicrYVtiXVswXSsnIiddLGQ9MSxlPWFbYl0ubGVuZ3RoO2U+ZDtkKyspZ1tkXT0idmFsWyIraCsrICsiXSI7Zis9ZysiXSIsaVtiXT1mfXJldHVybiBGdW5jdGlvbigidmFsIiwicmV0dXJuIFNuYXAucGF0aC50b1N0cmluZy5jYWxsKFsiK2krIl0pIil9ZnVuY3Rpb24gbShhKXtmb3IodmFyIGI9W10sYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKylmb3IodmFyIGU9MSxmPWFbY10ubGVuZ3RoO2Y+ZTtlKyspYi5wdXNoKGFbY11bZV0pO3JldHVybiBifWZ1bmN0aW9uIG4oYSl7cmV0dXJuIGlzRmluaXRlKGEpfWZ1bmN0aW9uIG8oYixjKXtyZXR1cm4gYS5pcyhiLCJhcnJheSIpJiZhLmlzKGMsImFycmF5Iik/Yi50b1N0cmluZygpPT1jLnRvU3RyaW5nKCk6ITF9dmFyIHA9e30scT0vWyVhLXpdKyQvaSxyPVN0cmluZztwLnN0cm9rZT1wLmZpbGw9ImNvbG91ciIsYy5wcm90b3R5cGUuZXF1YWw9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYigic25hcC51dGlsLmVxdWFsIix0aGlzLGEsYykuZmlyc3REZWZpbmVkKCl9LGIub24oInNuYXAudXRpbC5lcXVhbCIsZnVuY3Rpb24oYixjKXt2YXIgZCxlLGY9cih0aGlzLmF0dHIoYil8fCIiKSxzPXRoaXM7aWYoImNvbG91ciI9PXBbYl0pcmV0dXJuIGQ9YS5jb2xvcihmKSxlPWEuY29sb3IoYykse2Zyb206W2QucixkLmcsZC5iLGQub3BhY2l0eV0sdG86W2UucixlLmcsZS5iLGUub3BhY2l0eV0sZjprfTtpZigidmlld0JveCI9PWIpcmV0dXJuIGQ9dGhpcy5hdHRyKGIpLnZiLnNwbGl0KCIgIikubWFwKE51bWJlciksZT1jLnNwbGl0KCIgIikubWFwKE51bWJlcikse2Zyb206ZCx0bzplLGY6an07aWYoInRyYW5zZm9ybSI9PWJ8fCJncmFkaWVudFRyYW5zZm9ybSI9PWJ8fCJwYXR0ZXJuVHJhbnNmb3JtIj09YilyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGMmJihjPXIoYykucmVwbGFjZSgvXC57M318XHUyMDI2L2csZikpLGY9dGhpcy5tYXRyaXgsYz1hLl8ucmdUcmFuc2Zvcm0udGVzdChjKT9hLl8udHJhbnNmb3JtMm1hdHJpeChjLHRoaXMuZ2V0QkJveCgpKTphLl8udHJhbnNmb3JtMm1hdHJpeChhLl8uc3ZnVHJhbnNmb3JtMnN0cmluZyhjKSx0aGlzLmdldEJCb3goKSksZyhmLGMsZnVuY3Rpb24oKXtyZXR1cm4gcy5nZXRCQm94KDEpfSk7aWYoImQiPT1ifHwicGF0aCI9PWIpcmV0dXJuIGQ9YS5wYXRoLnRvQ3ViaWMoZixjKSx7ZnJvbTptKGRbMF0pLHRvOm0oZFsxXSksZjpsKGRbMF0pfTtpZigicG9pbnRzIj09YilyZXR1cm4gZD1yKGYpLnNwbGl0KGEuXy5zZXBhcmF0b3IpLGU9cihjKS5zcGxpdChhLl8uc2VwYXJhdG9yKSx7ZnJvbTpkLHRvOmUsZjpmdW5jdGlvbihhKXtyZXR1cm4gYX19O2lmKG4oZikmJm4oYykpcmV0dXJue2Zyb206cGFyc2VGbG9hdChmKSx0bzpwYXJzZUZsb2F0KGMpLGY6aH07dmFyIHQ9Zi5tYXRjaChxKSx1PXIoYykubWF0Y2gocSk7cmV0dXJuIHQmJm8odCx1KT97ZnJvbTpwYXJzZUZsb2F0KGYpLHRvOnBhcnNlRmxvYXQoYyksZjppKHQpfTp7ZnJvbTp0aGlzLmFzUFgoYiksdG86dGhpcy5hc1BYKGIsYyksZjpofX0pfSksZC5wbHVnaW4oZnVuY3Rpb24oYSxjLGQsZSl7Zm9yKHZhciBmPWMucHJvdG90eXBlLGc9Imhhc093blByb3BlcnR5IixoPSgiY3JlYXRlVG91Y2giaW4gZS5kb2MpLGk9WyJjbGljayIsImRibGNsaWNrIiwibW91c2Vkb3duIiwibW91c2Vtb3ZlIiwibW91c2VvdXQiLCJtb3VzZW92ZXIiLCJtb3VzZXVwIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwidG91Y2hjYW5jZWwiXSxqPXttb3VzZWRvd246InRvdWNoc3RhcnQiLG1vdXNlbW92ZToidG91Y2htb3ZlIixtb3VzZXVwOiJ0b3VjaGVuZCJ9LGs9KGZ1bmN0aW9uKGEsYil7dmFyIGM9InkiPT1hPyJzY3JvbGxUb3AiOiJzY3JvbGxMZWZ0IixkPWImJmIubm9kZT9iLm5vZGUub3duZXJEb2N1bWVudDplLmRvYztyZXR1cm4gZFtjIGluIGQuZG9jdW1lbnRFbGVtZW50PyJkb2N1bWVudEVsZW1lbnQiOiJib2R5Il1bY119KSxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKX0sbj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1oJiZqW2JdP2pbYl06YixmPWZ1bmN0aW9uKGUpe3ZhciBmPWsoInkiLGQpLGk9aygieCIsZCk7aWYoaCYmaltnXShiKSlmb3IodmFyIG49MCxvPWUudGFyZ2V0VG91Y2hlcyYmZS50YXJnZXRUb3VjaGVzLmxlbmd0aDtvPm47bisrKWlmKGUudGFyZ2V0VG91Y2hlc1tuXS50YXJnZXQ9PWF8fGEuY29udGFpbnMoZS50YXJnZXRUb3VjaGVzW25dLnRhcmdldCkpe3ZhciBwPWU7ZT1lLnRhcmdldFRvdWNoZXNbbl0sZS5vcmlnaW5hbEV2ZW50PXAsZS5wcmV2ZW50RGVmYXVsdD1sLGUuc3RvcFByb3BhZ2F0aW9uPW07YnJlYWt9dmFyIHE9ZS5jbGllbnRYK2kscj1lLmNsaWVudFkrZjtyZXR1cm4gYy5jYWxsKGQsZSxxLHIpfTtyZXR1cm4gYiE9PWUmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLGYsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGYsITEpLGZ1bmN0aW9uKCl7cmV0dXJuIGIhPT1lJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixmLCExKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxmLCExKSwhMH19LG89W10scD1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD1hLmNsaWVudFgsZT1hLmNsaWVudFksZj1rKCJ5IiksZz1rKCJ4IiksaT1vLmxlbmd0aDtpLS07KXtpZihjPW9baV0saCl7Zm9yKHZhciBqLGw9YS50b3VjaGVzJiZhLnRvdWNoZXMubGVuZ3RoO2wtLTspaWYoaj1hLnRvdWNoZXNbbF0sai5pZGVudGlmaWVyPT1jLmVsLl9kcmFnLmlkfHxjLmVsLm5vZGUuY29udGFpbnMoai50YXJnZXQpKXtkPWouY2xpZW50WCxlPWouY2xpZW50WSwoYS5vcmlnaW5hbEV2ZW50P2Eub3JpZ2luYWxFdmVudDphKS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrfX1lbHNlIGEucHJldmVudERlZmF1bHQoKTt2YXIgbT1jLmVsLm5vZGU7bS5uZXh0U2libGluZyxtLnBhcmVudE5vZGUsbS5zdHlsZS5kaXNwbGF5O2QrPWcsZSs9ZixiKCJzbmFwLmRyYWcubW92ZS4iK2MuZWwuaWQsYy5tb3ZlX3Njb3BlfHxjLmVsLGQtYy5lbC5fZHJhZy54LGUtYy5lbC5fZHJhZy55LGQsZSxhKX19LHE9ZnVuY3Rpb24oYyl7YS51bm1vdXNlbW92ZShwKS51bm1vdXNldXAocSk7Zm9yKHZhciBkLGU9by5sZW5ndGg7ZS0tOylkPW9bZV0sZC5lbC5fZHJhZz17fSxiKCJzbmFwLmRyYWcuZW5kLiIrZC5lbC5pZCxkLmVuZF9zY29wZXx8ZC5zdGFydF9zY29wZXx8ZC5tb3ZlX3Njb3BlfHxkLmVsLGMpLGIub2ZmKCJzbmFwLmRyYWcuKi4iK2QuZWwuaWQpO289W119LHI9aS5sZW5ndGg7ci0tOykhZnVuY3Rpb24oYil7YVtiXT1mW2JdPWZ1bmN0aW9uKGMsZCl7aWYoYS5pcyhjLCJmdW5jdGlvbiIpKXRoaXMuZXZlbnRzPXRoaXMuZXZlbnRzfHxbXSx0aGlzLmV2ZW50cy5wdXNoKHtuYW1lOmIsZjpjLHVuYmluZDpuKHRoaXMubm9kZXx8ZG9jdW1lbnQsYixjLGR8fHRoaXMpfSk7ZWxzZSBmb3IodmFyIGU9MCxmPXRoaXMuZXZlbnRzLmxlbmd0aDtmPmU7ZSsrKWlmKHRoaXMuZXZlbnRzW2VdLm5hbWU9PWIpdHJ5e3RoaXMuZXZlbnRzW2VdLmYuY2FsbCh0aGlzKX1jYXRjaChnKXt9cmV0dXJuIHRoaXN9LGFbInVuIitiXT1mWyJ1biIrYl09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuZXZlbnRzfHxbXSxkPWMubGVuZ3RoO2QtLTspaWYoY1tkXS5uYW1lPT1iJiYoY1tkXS5mPT1hfHwhYSkpcmV0dXJuIGNbZF0udW5iaW5kKCksYy5zcGxpY2UoZCwxKSwhYy5sZW5ndGgmJmRlbGV0ZSB0aGlzLmV2ZW50cyx0aGlzO3JldHVybiB0aGlzfX0oaVtyXSk7Zi5ob3Zlcj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5tb3VzZW92ZXIoYSxjKS5tb3VzZW91dChiLGR8fGMpfSxmLnVuaG92ZXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy51bm1vdXNlb3ZlcihhKS51bm1vdXNlb3V0KGIpfTt2YXIgcz1bXTtmLmRyYWc9ZnVuY3Rpb24oYyxkLGUsZixnLGgpe2Z1bmN0aW9uIGkoaSxqLGwpeyhpLm9yaWdpbmFsRXZlbnR8fGkpLnByZXZlbnREZWZhdWx0KCksay5fZHJhZy54PWosay5fZHJhZy55PWwsay5fZHJhZy5pZD1pLmlkZW50aWZpZXIsIW8ubGVuZ3RoJiZhLm1vdXNlbW92ZShwKS5tb3VzZXVwKHEpLG8ucHVzaCh7ZWw6ayxtb3ZlX3Njb3BlOmYsc3RhcnRfc2NvcGU6ZyxlbmRfc2NvcGU6aH0pLGQmJmIub24oInNuYXAuZHJhZy5zdGFydC4iK2suaWQsZCksYyYmYi5vbigic25hcC5kcmFnLm1vdmUuIitrLmlkLGMpLGUmJmIub24oInNuYXAuZHJhZy5lbmQuIitrLmlkLGUpLGIoInNuYXAuZHJhZy5zdGFydC4iK2suaWQsZ3x8Znx8ayxqLGwsaSl9ZnVuY3Rpb24gaihhLGMsZCl7Yigic25hcC5kcmFnaW5pdC4iK2suaWQsayxhLGMsZCl9dmFyIGs9dGhpcztpZighYXJndW1lbnRzLmxlbmd0aCl7dmFyIGw7cmV0dXJuIGsuZHJhZyhmdW5jdGlvbihhLGIpe3RoaXMuYXR0cih7dHJhbnNmb3JtOmwrKGw/IlQiOiJ0IikrW2EsYl19KX0sZnVuY3Rpb24oKXtsPXRoaXMudHJhbnNmb3JtKCkubG9jYWx9KX1yZXR1cm4gYi5vbigic25hcC5kcmFnaW5pdC4iK2suaWQsaSksay5fZHJhZz17fSxzLnB1c2goe2VsOmssc3RhcnQ6aSxpbml0Omp9KSxrLm1vdXNlZG93bihqKSxrfSxmLnVuZHJhZz1mdW5jdGlvbigpe2Zvcih2YXIgYz1zLmxlbmd0aDtjLS07KXNbY10uZWw9PXRoaXMmJih0aGlzLnVubW91c2Vkb3duKHNbY10uaW5pdCkscy5zcGxpY2UoYywxKSxiLnVuYmluZCgic25hcC5kcmFnLiouIit0aGlzLmlkKSxiLnVuYmluZCgic25hcC5kcmFnaW5pdC4iK3RoaXMuaWQpKTtyZXR1cm4hcy5sZW5ndGgmJmEudW5tb3VzZW1vdmUocCkudW5tb3VzZXVwKHEpLHRoaXN9fSksZC5wbHVnaW4oZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9KGMucHJvdG90eXBlLGQucHJvdG90eXBlKSxnPS9eXHMqdXJsXCgoLispXCkvLGg9U3RyaW5nLGk9YS5fLiQ7YS5maWx0ZXI9e30sZi5maWx0ZXI9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpczsic3ZnIiE9ZC50eXBlJiYoZD1kLnBhcGVyKTt2YXIgZT1hLnBhcnNlKGgoYikpLGY9YS5fLmlkKCksZz0oZC5ub2RlLm9mZnNldFdpZHRoLGQubm9kZS5vZmZzZXRIZWlnaHQsaSgiZmlsdGVyIikpO3JldHVybiBpKGcse2lkOmYsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIn0pLGcuYXBwZW5kQ2hpbGQoZS5ub2RlKSxkLmRlZnMuYXBwZW5kQ2hpbGQoZyksbmV3IGMoZyl9LGIub24oInNuYXAudXRpbC5nZXRhdHRyLmZpbHRlciIsZnVuY3Rpb24oKXtiLnN0b3AoKTt2YXIgYz1pKHRoaXMubm9kZSwiZmlsdGVyIik7aWYoYyl7dmFyIGQ9aChjKS5tYXRjaChnKTtyZXR1cm4gZCYmYS5zZWxlY3QoZFsxXSl9fSksYi5vbigic25hcC51dGlsLmF0dHIuZmlsdGVyIixmdW5jdGlvbihkKXtpZihkIGluc3RhbmNlb2YgYyYmImZpbHRlciI9PWQudHlwZSl7Yi5zdG9wKCk7dmFyIGU9ZC5ub2RlLmlkO2V8fChpKGQubm9kZSx7aWQ6ZC5pZH0pLGU9ZC5pZCksaSh0aGlzLm5vZGUse2ZpbHRlcjphLnVybChlKX0pfWQmJiJub25lIiE9ZHx8KGIuc3RvcCgpLHRoaXMubm9kZS5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpKX0pLGEuZmlsdGVyLmJsdXI9ZnVuY3Rpb24oYixjKXtudWxsPT1iJiYoYj0yKTt2YXIgZD1udWxsPT1jP2I6W2IsY107cmV0dXJuIGEuZm9ybWF0KCc8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSJ7ZGVmfSIvPicse2RlZjpkfSl9LGEuZmlsdGVyLmJsdXIudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcygpfSxhLmZpbHRlci5zaGFkb3c9ZnVuY3Rpb24oYixjLGQsZSxmKXtyZXR1cm4gbnVsbD09ZiYmKG51bGw9PWU/KGY9ZCxkPTQsZT0iIzAwMCIpOihmPWUsZT1kLGQ9NCkpLG51bGw9PWQmJihkPTQpLG51bGw9PWYmJihmPTEpLG51bGw9PWImJihiPTAsYz0yKSxudWxsPT1jJiYoYz1iKSxlPWEuY29sb3IoZSksYS5mb3JtYXQoJzxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0ie2JsdXJ9Ii8+PGZlT2Zmc2V0IGR4PSJ7ZHh9IiBkeT0ie2R5fSIgcmVzdWx0PSJvZmZzZXRibHVyIi8+PGZlRmxvb2QgZmxvb2QtY29sb3I9Intjb2xvcn0iLz48ZmVDb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iLz48ZmVDb21wb25lbnRUcmFuc2Zlcj48ZmVGdW5jQSB0eXBlPSJsaW5lYXIiIHNsb3BlPSJ7b3BhY2l0eX0iLz48L2ZlQ29tcG9uZW50VHJhbnNmZXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlLz48ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiLz48L2ZlTWVyZ2U+Jyx7Y29sb3I6ZSxkeDpiLGR5OmMsYmx1cjpkLG9wYWNpdHk6Zn0pfSxhLmZpbHRlci5zaGFkb3cudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcygpfSxhLmZpbHRlci5ncmF5c2NhbGU9ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWImJihiPTEpLGEuZm9ybWF0KCc8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0ie2F9IHtifSB7Y30gMCAwIHtkfSB7ZX0ge2Z9IDAgMCB7Z30ge2J9IHtofSAwIDAgMCAwIDAgMSAwIi8+Jyx7YTouMjEyNisuNzg3NCooMS1iKSxiOi43MTUyLS43MTUyKigxLWIpLGM6LjA3MjItLjA3MjIqKDEtYiksZDouMjEyNi0uMjEyNiooMS1iKSxlOi43MTUyKy4yODQ4KigxLWIpLGY6LjA3MjItLjA3MjIqKDEtYiksZzouMjEyNi0uMjEyNiooMS1iKSxoOi4wNzIyKy45Mjc4KigxLWIpfSl9LGEuZmlsdGVyLmdyYXlzY2FsZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzKCl9LGEuZmlsdGVyLnNlcGlhPWZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iJiYoYj0xKSxhLmZvcm1hdCgnPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9InthfSB7Yn0ge2N9IDAgMCB7ZH0ge2V9IHtmfSAwIDAge2d9IHtofSB7aX0gMCAwIDAgMCAwIDEgMCIvPicse2E6LjM5MysuNjA3KigxLWIpLGI6Ljc2OS0uNzY5KigxLWIpLGM6LjE4OS0uMTg5KigxLWIpLGQ6LjM0OS0uMzQ5KigxLWIpLGU6LjY4NisuMzE0KigxLWIpLGY6LjE2OC0uMTY4KigxLWIpLGc6LjI3Mi0uMjcyKigxLWIpLGg6LjUzNC0uNTM0KigxLWIpLGk6LjEzMSsuODY5KigxLWIpfSl9LGEuZmlsdGVyLnNlcGlhLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoKX0sYS5maWx0ZXIuc2F0dXJhdGU9ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWImJihiPTEpLGEuZm9ybWF0KCc8ZmVDb2xvck1hdHJpeCB0eXBlPSJzYXR1cmF0ZSIgdmFsdWVzPSJ7YW1vdW50fSIvPicse2Ftb3VudDoxLWJ9KX0sYS5maWx0ZXIuc2F0dXJhdGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcygpfSxhLmZpbHRlci5odWVSb3RhdGU9ZnVuY3Rpb24oYil7cmV0dXJuIGI9Ynx8MCxhLmZvcm1hdCgnPGZlQ29sb3JNYXRyaXggdHlwZT0iaHVlUm90YXRlIiB2YWx1ZXM9InthbmdsZX0iLz4nLHthbmdsZTpifSl9LGEuZmlsdGVyLmh1ZVJvdGF0ZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzKCl9LGEuZmlsdGVyLmludmVydD1mdW5jdGlvbihiKXtyZXR1cm4gbnVsbD09YiYmKGI9MSksYS5mb3JtYXQoJzxmZUNvbXBvbmVudFRyYW5zZmVyPjxmZUZ1bmNSIHR5cGU9InRhYmxlIiB0YWJsZVZhbHVlcz0ie2Ftb3VudH0ge2Ftb3VudDJ9Ii8+PGZlRnVuY0cgdHlwZT0idGFibGUiIHRhYmxlVmFsdWVzPSJ7YW1vdW50fSB7YW1vdW50Mn0iLz48ZmVGdW5jQiB0eXBlPSJ0YWJsZSIgdGFibGVWYWx1ZXM9InthbW91bnR9IHthbW91bnQyfSIvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj4nLHthbW91bnQ6YixhbW91bnQyOjEtYn0pfSxhLmZpbHRlci5pbnZlcnQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcygpfSxhLmZpbHRlci5icmlnaHRuZXNzPWZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iJiYoYj0xKSxhLmZvcm1hdCgnPGZlQ29tcG9uZW50VHJhbnNmZXI+PGZlRnVuY1IgdHlwZT0ibGluZWFyIiBzbG9wZT0ie2Ftb3VudH0iLz48ZmVGdW5jRyB0eXBlPSJsaW5lYXIiIHNsb3BlPSJ7YW1vdW50fSIvPjxmZUZ1bmNCIHR5cGU9ImxpbmVhciIgc2xvcGU9InthbW91bnR9Ii8+PC9mZUNvbXBvbmVudFRyYW5zZmVyPicse2Ftb3VudDpifSl9LGEuZmlsdGVyLmJyaWdodG5lc3MudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcygpfSxhLmZpbHRlci5jb250cmFzdD1mdW5jdGlvbihiKXtyZXR1cm4gbnVsbD09YiYmKGI9MSksYS5mb3JtYXQoJzxmZUNvbXBvbmVudFRyYW5zZmVyPjxmZUZ1bmNSIHR5cGU9ImxpbmVhciIgc2xvcGU9InthbW91bnR9IiBpbnRlcmNlcHQ9InthbW91bnQyfSIvPjxmZUZ1bmNHIHR5cGU9ImxpbmVhciIgc2xvcGU9InthbW91bnR9IiBpbnRlcmNlcHQ9InthbW91bnQyfSIvPjxmZUZ1bmNCIHR5cGU9ImxpbmVhciIgc2xvcGU9InthbW91bnR9IiBpbnRlcmNlcHQ9InthbW91bnQyfSIvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj4nLHthbW91bnQ6YixhbW91bnQyOi41LWIvMn0pfSxhLmZpbHRlci5jb250cmFzdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzKCl9fSksZC5wbHVnaW4oZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl8uYm94LGc9YS5pcyxoPS9eW15hLXpdKihbdGJtbHJjXSkvaSxpPWZ1bmN0aW9uKCl7cmV0dXJuIlQiK3RoaXMuZHgrIiwiK3RoaXMuZHl9O2IucHJvdG90eXBlLmdldEFsaWduPWZ1bmN0aW9uKGEsYil7bnVsbD09YiYmZyhhLCJzdHJpbmciKSYmKGI9YSxhPW51bGwpLGE9YXx8dGhpcy5wYXBlcjt2YXIgYz1hLmdldEJCb3g/YS5nZXRCQm94KCk6ZihhKSxkPXRoaXMuZ2V0QkJveCgpLGU9e307c3dpdGNoKGI9YiYmYi5tYXRjaChoKSxiPWI/YlsxXS50b0xvd2VyQ2FzZSgpOiJjIil7Y2FzZSJ0IjplLmR4PTAsZS5keT1jLnktZC55O2JyZWFrO2Nhc2UiYiI6ZS5keD0wLGUuZHk9Yy55Mi1kLnkyO2JyZWFrO2Nhc2UibSI6ZS5keD0wLGUuZHk9Yy5jeS1kLmN5O2JyZWFrO2Nhc2UibCI6ZS5keD1jLngtZC54LGUuZHk9MDticmVhaztjYXNlInIiOmUuZHg9Yy54Mi1kLngyLGUuZHk9MDticmVhaztkZWZhdWx0OmUuZHg9Yy5jeC1kLmN4LGUuZHk9MH1yZXR1cm4gZS50b1N0cmluZz1pLGV9LGIucHJvdG90eXBlLmFsaWduPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMudHJhbnNmb3JtKCIuLi4iK3RoaXMuZ2V0QWxpZ24oYSxiKSl9fSksZC5wbHVnaW4oZnVuY3Rpb24oYixjLGQsZSl7ZnVuY3Rpb24gZihhKXthPWEuc3BsaXQoLyg/PSMpLyk7dmFyIGI9bmV3IFN0cmluZyhhWzVdKTtyZXR1cm4gYls1MF09YVswXSxiWzEwMF09YVsxXSxiWzIwMF09YVsyXSxiWzMwMF09YVszXSxiWzQwMF09YVs0XSxiWzUwMF09YVs1XSxiWzYwMF09YVs2XSxiWzcwMF09YVs3XSxiWzgwMF09YVs4XSxiWzkwMF09YVs5XSxhWzEwXSYmKGIuQTEwMD1hWzEwXSxiLkEyMDA9YVsxMV0sYi5BNDAwPWFbMTJdLGIuQTcwMD1hWzEzXSksYn12YXIgZz0iI2ZmZWJlZSNmZmNkZDIjZWY5YTlhI2U1NzM3MyNlZjUzNTAjZjQ0MzM2I2U1MzkzNSNkMzJmMmYjYzYyODI4I2I3MWMxYyNmZjhhODAjZmY1MjUyI2ZmMTc0NCNkNTAwMDAiLGg9IiNGQ0U0RUMjRjhCQkQwI0Y0OEZCMSNGMDYyOTIjRUM0MDdBI0U5MUU2MyNEODFCNjAjQzIxODVCI0FEMTQ1NyM4ODBFNEYjRkY4MEFCI0ZGNDA4MSNGNTAwNTcjQzUxMTYyIixpPSIjRjNFNUY1I0UxQkVFNyNDRTkzRDgjQkE2OEM4I0FCNDdCQyM5QzI3QjAjOEUyNEFBIzdCMUZBMiM2QTFCOUEjNEExNDhDI0VBODBGQyNFMDQwRkIjRDUwMEY5I0FBMDBGRiIsaj0iI0VERTdGNiNEMUM0RTkjQjM5RERCIzk1NzVDRCM3RTU3QzIjNjczQUI3IzVFMzVCMSM1MTJEQTgjNDUyN0EwIzMxMUI5MiNCMzg4RkYjN0M0REZGIzY1MUZGRiM2MjAwRUEiLGs9IiNFOEVBRjYjQzVDQUU5IzlGQThEQSM3OTg2Q0IjNUM2QkMwIzNGNTFCNSMzOTQ5QUIjMzAzRjlGIzI4MzU5MyMxQTIzN0UjOEM5RUZGIzUzNkRGRSMzRDVBRkUjMzA0RkZFIixsPSIjRTNGMkZEI0JCREVGQiM5MENBRjkjNjRCNUY2IzY0QjVGNiMyMTk2RjMjMUU4OEU1IzE5NzZEMiMxNTY1QzAjMEQ0N0ExIzgyQjFGRiM0NDhBRkYjMjk3OUZGIzI5NjJGRiIsbT0iI0UxRjVGRSNCM0U1RkMjODFENEZBIzRGQzNGNyMyOUI2RjYjMDNBOUY0IzAzOUJFNSMwMjg4RDEjMDI3N0JEIzAxNTc5QiM4MEQ4RkYjNDBDNEZGIzAwQjBGRiMwMDkxRUEiLG49IiNFMEY3RkEjQjJFQkYyIzgwREVFQSM0REQwRTEjMjZDNkRBIzAwQkNENCMwMEFDQzEjMDA5N0E3IzAwODM4RiMwMDYwNjQjODRGRkZGIzE4RkZGRiMwMEU1RkYjMDBCOEQ0IixvPSIjRTBGMkYxI0IyREZEQiM4MENCQzQjNERCNkFDIzI2QTY5QSMwMDk2ODgjMDA4OTdCIzAwNzk2QiMwMDY5NUMjMDA0RDQwI0E3RkZFQiM2NEZGREEjMURFOUI2IzAwQkZBNSIscD0iI0U4RjVFOSNDOEU2QzkjQTVENkE3IzgxQzc4NCM2NkJCNkEjNENBRjUwIzQzQTA0NyMzODhFM0MjMkU3RDMyIzFCNUUyMCNCOUY2Q0EjNjlGMEFFIzAwRTY3NiMwMEM4NTMiLHE9IiNGMUY4RTkjRENFREM4I0M1RTFBNSNBRUQ1ODEjOUNDQzY1IzhCQzM0QSM3Q0IzNDIjNjg5RjM4IzU1OEIyRiMzMzY5MUUjQ0NGRjkwI0IyRkY1OSM3NkZGMDMjNjRERDE3IixyPSIjRjlGQkU3I0YwRjRDMyNFNkVFOUMjRENFNzc1I0Q0RTE1NyNDRERDMzkjQzBDQTMzI0FGQjQyQiM5RTlEMjQjODI3NzE3I0Y0RkY4MSNFRUZGNDEjQzZGRjAwI0FFRUEwMCIscz0iI0ZGRkRFNyNGRkY5QzQjRkZGNTlEI0ZGRjE3NiNGRkVFNTgjRkZFQjNCI0ZERDgzNSNGQkMwMkQjRjlBODI1I0Y1N0YxNyNGRkZGOEQjRkZGRjAwI0ZGRUEwMCNGRkQ2MDAiLHQ9IiNGRkY4RTEjRkZFQ0IzI0ZGRTA4MiNGRkQ1NEYjRkZDQTI4I0ZGQzEwNyNGRkIzMDAjRkZBMDAwI0ZGOEYwMCNGRjZGMDAjRkZFNTdGI0ZGRDc0MCNGRkM0MDAjRkZBQjAwIix1PSIjRkZGM0UwI0ZGRTBCMiNGRkNDODAjRkZCNzREI0ZGQTcyNiNGRjk4MDAjRkI4QzAwI0Y1N0MwMCNFRjZDMDAjRTY1MTAwI0ZGRDE4MCNGRkFCNDAjRkY5MTAwI0ZGNkQwMCIsdj0iI0ZCRTlFNyNGRkNDQkMjRkZBQjkxI0ZGOEE2NSNGRjcwNDMjRkY1NzIyI0Y0NTExRSNFNjRBMTkjRDg0MzE1I0JGMzYwQyNGRjlFODAjRkY2RTQwI0ZGM0QwMCNERDJDMDAiLHc9IiNFRkVCRTkjRDdDQ0M4I0JDQUFBNCNBMTg4N0YjOEQ2RTYzIzc5NTU0OCM2RDRDNDEjNUQ0MDM3IzRFMzQyRSMzRTI3MjMiLHg9IiNGQUZBRkEjRjVGNUY1I0VFRUVFRSNFMEUwRTAjQkRCREJEIzlFOUU5RSM3NTc1NzUjNjE2MTYxIzQyNDI0MiMyMTIxMjEiLHk9IiNFQ0VGRjEjQ0ZEOERDI0IwQkVDNSM5MEE0QUUjNzg5MDlDIzYwN0Q4QiM1NDZFN0EjNDU1QTY0IzM3NDc0RiMyNjMyMzgiO2IubXVpPXt9LGIuZmxhdD17fSxiLm11aS5yZWQ9ZihnKSxiLm11aS5waW5rPWYoaCksYi5tdWkucHVycGxlPWYoaSksYi5tdWkuZGVlcHB1cnBsZT1mKGopLGIubXVpLmluZGlnbz1mKGspLGIubXVpLmJsdWU9ZihsKSxiLm11aS5saWdodGJsdWU9ZihtKSxiLm11aS5jeWFuPWYobiksYi5tdWkudGVhbD1mKG8pLGIubXVpLmdyZWVuPWYocCksYi5tdWkubGlnaHRncmVlbj1mKHEpLGIubXVpLmxpbWU9ZihyKSxiLm11aS55ZWxsb3c9ZihzKSxiLm11aS5hbWJlcj1mKHQpLGIubXVpLm9yYW5nZT1mKHUpLGIubXVpLmRlZXBvcmFuZ2U9Zih2KSxiLm11aS5icm93bj1mKHcpLGIubXVpLmdyZXk9Zih4KSxiLm11aS5ibHVlZ3JleT1mKHkpLGIuZmxhdC50dXJxdW9pc2U9IiMxYWJjOWMiLGIuZmxhdC5ncmVlbnNlYT0iIzE2YTA4NSIsYi5mbGF0LnN1bmZsb3dlcj0iI2YxYzQwZiIsYi5mbGF0Lm9yYW5nZT0iI2YzOWMxMiIsYi5mbGF0LmVtZXJsYW5kPSIjMmVjYzcxIixiLmZsYXQubmVwaHJpdGlzPSIjMjdhZTYwIixiLmZsYXQuY2Fycm90PSIjZTY3ZTIyIixiLmZsYXQucHVtcGtpbj0iI2QzNTQwMCIsYi5mbGF0LnBldGVycml2ZXI9IiMzNDk4ZGIiLGIuZmxhdC5iZWxpemVob2xlPSIjMjk4MGI5IixiLmZsYXQuYWxpemFyaW49IiNlNzRjM2MiLGIuZmxhdC5wb21lZ3JhbmF0ZT0iI2MwMzkyYiIsYi5mbGF0LmFtZXRoeXN0PSIjOWI1OWI2IixiLmZsYXQud2lzdGVyaWE9IiM4ZTQ0YWQiLGIuZmxhdC5jbG91ZHM9IiNlY2YwZjEiLGIuZmxhdC5zaWx2ZXI9IiNiZGMzYzciLGIuZmxhdC53ZXRhc3BoYWx0PSIjMzQ0OTVlIixiLmZsYXQubWlkbmlnaHRibHVlPSIjMmMzZTUwIixiLmZsYXQuY29uY3JldGU9IiM5NWE1YTYiLGIuZmxhdC5hc2Jlc3Rvcz0iIzdmOGM4ZCIsYi5pbXBvcnRNVUlDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIGMgaW4gYi5tdWkpYi5tdWkuaGFzT3duUHJvcGVydHkoYykmJihhW2NdPWIubXVpW2NdKX19KSxkfSk7"}]},{"name":"贴吧全能助手(第三方修改)","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["http*://tieba.baidu.com/f/fdir*","http*://tieba.baidu.com/f/search*","http*://tieba.baidu.com/f/center/*"],"orig_includes":["http*://tieba.baidu.com/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-body","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"confVer":"s[1]","definedEvent":"sclick,click,1,0,1","modules":"s{}","repairDefinedEvent":"bfalse"},"ts":1600161070721},"enabled":true,"position":2,"file_url":"https://greasyfork.org/scripts/398404-%E8%B4%B4%E5%90%A7%E5%85%A8%E8%83%BD%E5%8A%A9%E6%89%8B-%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BF%AE%E6%94%B9/code/%E8%B4%B4%E5%90%A7%E5%85%A8%E8%83%BD%E5%8A%A9%E6%89%8B(%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BF%AE%E6%94%B9).user.js","uuid":"a3d3fc0e-61d0-4366-b106-a6afa997f65f","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDotLTlkKflhajog73liqnmiYso56ys5LiJ5pa55L+u5pS5KQovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly90YW1wZXJtb25rZXkubmV0LwovLyBAdmVyc2lvbiAgICAgIDIuMSgwLjAxNjk2MWJldGEpCi8vIEBkZXNjcmlwdGlvbiAg44CQ6KOF6L+Z5LiA5Liq6ISa5pys5bCx5aSf5LqG772e5Y+v6IO95piv5L2g6YGH5Yiw55qE5pyA5aW955So55qE6LS05ZCn5aKe5by66ISa5pys44CR77yM55m+5bqm6LS05ZCnIHRpZWJhLmJhaWR1LmNvbSDnnIvotLTvvIjljIXmi6zmpbzkuK3mpbzvvInml6DpobvnmbvlvZXvvIzlrozlhajljrvpmaTmibDnnLzlkozlkITnsbvlub/lkYrmqKHlnZfvvIzlhajpnaLnsr7nroDlubbnvo7ljJblkITnp43otLTlkKfpobXpnaLvvIzljrvpmaTotLTlkKfluJblrZDph4zpk77mjqXnmoTot7PovazvvIjlt7LlpLHmlYjvvInvvIzmjInlj5HluJbml7bpl7TmjpLluo/vvIzmn6XnnIvotLTlkKfnlKjmiLflj5HoqIDorrDlvZXvvIzotLTlrZDlhbPplK7lrZflsY/olL3vvIznp7vpmaTkvJrlkZjlvanlkI3vvIznm7TmjqXlnKjlvZPliY3pobXpnaLmn6XnnIvljp/lm77vvIzlj6/nvKnmlL7vvIzlj6/lpJrlvIDvvIzlj6/mi5bmi70KLy8gQGF1dGhvciAgICAgICDlv4bkuJbokKfpgaUsc2hpdGlhbnNoaXdhCi8vIEBpbmNsdWRlICAgICAgaHR0cCo6Ly90aWViYS5iYWlkdS5jb20vKgovLyBAZXhjbHVkZSAgICAgIGh0dHAqOi8vdGllYmEuYmFpZHUuY29tL2YvZmRpcioKLy8gQGV4Y2x1ZGUgICAgICBodHRwKjovL3RpZWJhLmJhaWR1LmNvbS9mL3NlYXJjaCoKLy8gQGV4Y2x1ZGUgICAgICBodHRwKjovL3RpZWJhLmJhaWR1LmNvbS9mL2NlbnRlci8qCi8vIEBydW4tYXQgICAgICAgZG9jdW1lbnQtYm9keQovLy9kb2N1bWVudC1zdGFydCxkb2N1bWVudC1pZGxlO+W/hemhu+S9v+eUqGRvY3VtZW50LWJvZHnvvIzlkKbliJnlr7nlpJrkuKrmtY/op4jlmajnmoTlhbzlrrnmgKfkvJrkuIvpmY0KLy8v5Y+q5rWL6K+V5LqGR29vZ2xlIENocm9tZSA3NS4wLjM3NzAuMTQy77yI5q2j5byP54mI5pys77yJIO+8iDY0IOS9je+8iQovLy8galF1ZXJ5IOeVmeS4gOS7veiHquW3seeUqAovLyBAcmVxdWlyZSAgICAgaHR0cDovL2Nkbi5zdGF0aWNmaWxlLm9yZy9qcXVlcnkvMi4xLjEvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgaHR0cDovL2Nkbi5zdGF0aWNmaWxlLm9yZy9qcXVlcnktc2Nyb2xsVG8vMS40LjExL2pxdWVyeS5zY3JvbGxUby5taW4uanMKCi8vLyDphY3nva7nlYzpnaIgVUkKLy8gQHJlcXVpcmUgICAgIGh0dHA6Ly9jZG4uc3RhdGljZmlsZS5vcmcvbXVzdGFjaGUuanMvMC44LjEvbXVzdGFjaGUubWluLmpzCi8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMjY1Ny9jb2RlL3RpZWJhX3VpLmpzCgovLy8g6Z2e5ZCM5q2l5pWw57uE5p6a5Li+5Zue6LCDCi8vIEByZXF1aXJlIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zNTg4L2NvZGUvSW50ZXJ2YWxfTG9vcGVyLmpzCgovLy8g5YW85a65IEdNIDEueCwgMi54Ci8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMjU5OS9jb2RlL2dtMl9wb3J0X3YxMDMuanMKLy8gQGdyYW50ICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fbGlzdFZhbHVlcwovLyBAZ3JhbnQgICAgICAgIEdNX2luZm8KLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLy9odHRwczovL2dyZWFzeWZvcmsub3JnL2VuL3NjcmlwdHMvMjY5OTItJUU4JUI0JUI0JUU1JTkwJUE3JUU1JTg1JUE4JUU4JTgzJUJEJUU1JThBJUE5JUU2JTg5JThCIOi0tOWQp+WFqOiDveWKqeaJiyBieSDlv4bkuJbokKfpgaUKLy8v55m+5bqm6LS05ZCn5oyJ5Y+R5biW5pe26Ze077yI5biW5a2QSUTvvInmjpLluo8gYnkgTlVMTAovLy/mn6XnnIvlj5HluJYgYnkg5paH56eRCi8vL+eZvuW6pui0tOWQp+WbvueJh+eCueWHu+aUvuWkpyBieSBsbGl3aHgKLy8v55m+5bqm6LS05ZCn77ya5LiN55m75b2V5Y2z5Y+v55yL6LS0IGJ5IFZBCi8vL+aipuWnrOi0tOWQp+WKqeaJiyBieSBqaXh1bgovLy90aWViYV91aS5qcyxJbnRlcnZhbF9Mb29wZXIuanMsZ20yX3BvcnRfdjEwMy5qcyBieSBKaXh1bi5Nb2UKLy8vaHR0cHM6Ly91c2Vyc3R5bGVzLm9yZy9zdHlsZXMvMTI0NzcwL3RpZWJhLW1hdmVyaWNrLTIwMTggVGllQmEgLSBNYXZlcmljayBieSBPbm94Ci8vID09L1VzZXJTY3JpcHQ9PQovKgrohJrmraXml6Xlv5cr5aSH5rOoCjIwMjA9Ny0yMyDnlLHkuo7ml6Dms5Xnoa7lrprotLTlrZDlhoXnmoTpk77mjqXlrp7pmYXmg4XlhrXvvIzmiYDku6XlhbPmjonoh6rliqjmm7/mjaLot7Povazpk77mjqUK5Y+R546waHR0cHM6Ly90aWViYS5iYWlkdS5jb20vcC84OTg0MjU4MjAg5Li76aKY6LS05YiX6KGo55qE5Y+R6LS05pel5pyf5pyJ6K+vCuWbvueJh+ivnemimOi0tOWklumdoueahOS4iuS8oOWbvueJh+WKn+iDveayoeazleWPkeWHuuWbvueJh++8jOWboOS4uuWFqOmDqOS8muiiq+ezu+e7n+WIoOmZpOOAguiAjOS4lOi/meS4quS4iuS8oOWbvueJh+WKn+iDveaYr+S9v+eUqGZsYXNo5o+S5Lu255qE5YGa55qECuS/ruWkjei0tOWtkOWGheS4i+W3peWFt+agj+eCuee/u+mhteaMiemSruWQju+8jOS4jeWGjeaYvuekuue/u+mhteWIl+ihqArmnInkupvml7blgJnpmpDol4/kvqfovrnmoI/lip/og73ml6Dms5Xlrp7njrDlrozlhajlsY/olL3mlYjmnpwKaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9pLyog6L+Z5Liq5Z+f5ZCN5YaF5peg5rOV5Yqf6IO96YO95LiN6IO95q2j5bi46L+Q6KGM77yM5L6L5aaC5LiN6IO95Zyo572R6aG15YaF5byA5YWz576O5YyW77yM6K6+572u5Yqf6IO9562JCuWPkeeOsOWInemfs+alvOWxguawlOazoeacieaYvuekuumXrumimArotLTlkKflj6rpmZDlkKfliqHlj5HoqIDml7bvvIzmloflrZfor53popjotLTlnKjkuLvpopjotLTliJfooajlm57lpI3mnInooajmg4XmmL7npLpidWco5bey5L+uKQrlsY/olL3mjL3lsIrljaHlpLHmlYgo5bey5L+uKQrlj5HnjrDotLTlrZDph4znmoTkuIvlt6XlhbfmoI/nmoTmpbzkuLvlip/og73ml6DmlYjvvIzotLTlkKfnvo7ljJbliIfmjaLmnInmmL7npLpidWco5bey5L+uKQpodHRwOi8vdGllYmEuYmFpZHUuY29tL2YvY2VudGVyL2NyZWF0ZXRiIOWIm+W7uui0tOWQpwrotLTlkKfotoXnuqfkvJrlkZjkvJrlr7zoh7TmpbzlsYLnlKjmiLflkI3lrZflkozmpbzkuK3mpbzlpLTlg4/mmL7npLrplJnor68o5bey5L+u5aSNKQrlnKjmn5DkupvotLTlrZDvvIzlj6/og73kvJrnvLrlpLHliKDpmaTlkozkuL7miqXmjInpkq4oMjAxOS0xMi0yMeW3suS/ruWkjSkK5pyJ54K55Ye75Zu+54mH5pS+5aSn5ZKM5byV55So5qW85bGC5ZKM5qW85Lit5qW85Yqf6IO95aSx5pWIYnVn77yI5LuF5Zyo5pen54mI6LS05ZCn5pyJ5pWI77yM6L+Z56eN6LS05ZCn5pivaHR0cOmTvuaOpe+8ie+8jOWbvueJh+eCueWHu+aUvuWkp+WBtuWwlOWPr+S7peeUqO+8jOW8leeUqOalvOWxguWSjOalvOS4realvOWKn+iDveWPquaciemTvuaOpeS4umh0dHDnmoTotLTlrZDlj6/ku6XnlKgKaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9pL2kvc3RvcmV0aHJlYWQg5L2/55SoaHR0cHPpk77mjqXmnIlidWfjgILljp/mnaXmmK9odHRw77yM5L2G5YG25bCU5Lya6Lez6L2s5YiwaHR0cHPlr7zoh7Tlh7rplJnvvIjku4XlnKjmiYvmnLp5YW5kZXjmtY/op4jlmajop4Hov4fov5nkuKrpl67popjvvIkK5Y+R546w5LiA5LiqYnVn77yM55S16ISR56uv6LS05ZCn5Li76aKY6LS05YiX6KGo572R6aG15Y+z6L6555qEIuWkp+WutumDveWcqOaQnCLvvIhjbGFzcz0ic2VhcmNoX2JhY2tfYm94Iinlkowi6LS05ZCn54Ot6K6u5qacIu+8iGNsYXNzPSJ0b3BpY19saXN0X2JveCLvvInlnKjnvZHpobXmi4nliLDlupXml7bkvJrlkJFjbGFzc+S4reiHquWKqOa3u+WKoCJzZWFyY2gtYmFjay1maXhlZCLlkowidG9waWMtc2VhcmNoLWJhY2stZml4ZWQiLOi/meS4quS8muWvvOiHtOWPkeS4u+mimOi0tOe8lui+keWZqOWPs+i+ueWGkuWHuuS4gOS4qiLlpKflrrbpg73lnKjmkJwi77yM5pqC5pe255So6K6h5pe25Zmo5a6a5pe25Yig6Zmk5paw5Yqg55qEY2xhc3PmnaXop6PlhrPov5nkuKrpl67popgo546w5Zyo5piv5b275bqV5Yig5LqG77yM5Zug5Li66LS05ZCn5Yig5o6J5LqG6LS05ZCn5Li76aG177yI5LiN5piv6aaW6aG177yJ55qE6LS05ZCn54Ot6K6u5qacKQoKLnRocmVhZGxpc3RfYnJpZ2h0IC50aHJlYWRsaXN0X2F1dGhvcnsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDE2JSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1pbi13aWR0aDogMTU1cHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1yaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CnVybChodHRwOi8vb25veC5xaW5pdWRuLmNvbS9tYXZlcmljay9tYXRlcmlhbGljb25zX3NhZmFyaV92MTYud29mZikgZm9ybWF0KFwnd29mZlwnKTsKYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHA6Ly9vbm94LnFpbml1ZG4uY29tL21hdmVyaWNrL3RiYmcvMS5qcGcpICFpbXBvcnRhbnQ7CiovCihmdW5jdGlvbiAoJCkgewogICAgLy9jb25zdCAkID0gdW5zYWZlV2luZG93LmpRdWVyeTsKICAgIC8qdmFyIGJhaWJhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgYmFpYmFuLnNldEF0dHJpYnV0ZSgiY2xhc3MgImJhaWJhbiIpOwogICAgYmFpYmFuLnNldEF0dHJpYnV0ZSgic3R5bGUgIndpZHRoOjk5OTlweDtoZWlnaHQ6IDk5OTk5cHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7cG9zaXRpb246IGFic29sdXRlO3RvcDogMHB4O3otaW5kZXg6IDk5OTk7Iik7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhaWJhbik7CiAgICB2YXIgYmFpYmFuMiA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNsZWFyVGltZW91dChiYWliYW4yKTsKICAgICAgICAkKCJkaXYuYmFpYmFuIikucmVtb3ZlKCk7CiAgICB9LCAxMDAwKTsqLwogICAgLyoqCiAgICAgKiDnsr7nroDlsIHoo4UgZmV0Y2gg6K+35rGC77yM6Ieq5bim6K+35rGCICsg6YCa55So6YWN572uICsg6Ieq5YqoIC50ZXh0KCkKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0g6K+35rGCIFVSTAogICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zPXt9XSAtIGZldGNoIFJlcXVlc3Qg6YWN572uCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBmZXRjaCDor7fmsYIKICAgICAqLwogICAgLy9jb25zb2xlLmxvZygianF1ZXJ554mI5pys5Y+377yaIiArICQuZm4uanF1ZXJ5KTsKICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL0ZpcmVmb3hCYXIvdXNlcnNjcmlwdC9yYXcvbWFzdGVyL1RpZWJhX0Jsb2NrZWRfRGV0ZWN0L1RpZWJhX0Jsb2NrZWRfRGV0ZWN0LnVzZXIuanMKICAgIC8v5Y+C6ICD6LS05ZCn5bGP6JS95qOA5rWL6ISa5pys55qE5Luj56CBIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zODM5ODEtJUU4JUI0JUI0JUU1JTkwJUE3JUU4JUI0JUI0JUU1JUFEJTkwJUU1JUIxJThGJUU4JTk0JUJEJUU2JUEzJTgwJUU2JUI1JThCCiAgICBjb25zdCByZXF1ZXN0ID0gKHVybCwgb3B0aW9ucyA9IHt9KSA9PiBmZXRjaCh1cmwsIE9iamVjdC5hc3NpZ24oewogICAgICAgIGNyZWRlbnRpYWxzOiAnb21pdCcsCiAgICAgICAgLy8g6YOo5YiG6LS05ZCn77yI5aaCIGZpcmVmb3gg5ZCn77yJ5Lya5by65Yi26Lez6L2s5ZueIGh0dHDvvIgyMDIw5bm05bey57uP5YWo5pS55oiQaHR0cHPkuobvvIkKICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsCiAgICAgICAgLy8g6Zi75q2i5rWP6KeI5Zmo5Y+R5Ye6IENPUlMg5qOA5rWL55qEIEhFQUQg6K+35rGC5aS0CiAgICAgICAgbW9kZTogJ3NhbWUtb3JpZ2luJywKICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JwogICAgICAgIH0KICAgIH0sIG9wdGlvbnMpKS50aGVuKHJlcyA9PiByZXMudGV4dCgpKTsKICAgIC8qKgogICAgICog6I635Y+W5Li76aKY6LS055qE56e75Yqo56uv5Zyw5Z2ACiAgICAgKgogICAgICogQHBhcmFtIHtudW1iZXJ9IHRpZCAtIOi0tOWtkCBpZAogICAgICogQHJldHVybnMge3N0cmluZ30gVVJMCiAgICAgKiBzcmM6IDEKICAgICAqIHo6IOi0tOWtkCBpZAogICAgICogcG46IDEKICAgICAqIGZyc3JuOiAxCiAgICAgKiBwYnJuOiAxCiAgICAgKiDpnIDopoHnmbvpmYbmiY3og73mmL7npLozMOalvAogICAgICovCiAgICBjb25zdCBnZXRUaHJlYWRNb1VybCA9IHRpZCA9PiBgLy90aWViYS5iYWlkdS5jb20vbW8vcS0tLS0tMS0xLTAtLS0tL20/a3o9JHt0aWR9YDsKICAgIC8qKgogICAgICog6L+U5Zued2Fw6LS05ZCn5L+h5oGvCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcyAtIOmhtemdouWGheWuuQogICAgICovCiAgICBjb25zdCB0aHJlYWRyZXR1cm54aW54aSA9IHJlcyA9PiByZXM7CiAgICAvKioKICAgICAqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGlkIC0g6LS05a2QIGlkCiAgICAgKi8KICAgIGNvbnN0IGdldFdhcHRpZWJheGlueGkgPSB0aWQgPT4gcmVxdWVzdChnZXRUaHJlYWRNb1VybCh0aWQpKQogICAgICAgIC50aGVuKHRocmVhZHJldHVybnhpbnhpKTsKCiAgICBjb25zb2xlLmxvZygianF1ZXJ554mI5pys5Y+377yaIiArICQuZm4uanF1ZXJ5KTsKICAgIGxldCBiYWliYW4yID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY2xlYXJUaW1lb3V0KGJhaWJhbjIpOwogICAgICAgICQoIi50aWViYS1hcHAiKS5yZW1vdmUoKTsgLy/ngrnlh7vmiZPlvIDotLTlkKdBUFDmn6XnnIvor6XlkKfmm7TlpJrlhoXlrrkgaHR0cHM6Ly90aWViYS5iYWlkdS5jb20vbW8vcS93ZWVrbHliYXpodXZpZXc/ZmlkPeWQp2lkJmJlZ2luVGltZT0xNTkwNzY4MDAwKOW8gOWni+eahOaXtumXtOaIsy/np5IpCiAgICB9LCA1MDAwKTsKICAgIHZhciB0dXBpYW5mYW5nZGEgPSB0cnVlOyAvL+i0tOWQp+WbvueJh+aUvuWkpwogICAgdmFyIHBpbmdiaV9sb3VjZW5ncWlwYW8gPSBmYWxzZTsgLy/lsY/olL3mpbzlsYLmsJTms6EKICAgIHZhciBybUJvdHRvbSA9IGZhbHNlOyAvL+enu+mZpOW3peWFt+agjwogICAgdmFyIHlpbmNhbmdjZWJpYW5sYW54ID0gZmFsc2U7IC8v6ZqQ6JeP5L6n6L655qCPCiAgICB2YXIgcWlhbmdkaWFveGlueGl0aXNoaSA9IGZhbHNlOyAvL+W8uuiwg+S/oeaBr+aYvuekugogICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSkgewogICAgICAgIHZhciBjc3MgPSAiIjsKICAgICAgICBpZiAoZmFsc2UgfHwgKGRvY3VtZW50LmRvbWFpbiA9PSAidGllYmEuYmFpZHUuY29tIiB8fCBkb2N1bWVudC5kb21haW4uc3Vic3RyaW5nKGRvY3VtZW50LmRvbWFpbi5pbmRleE9mKCIudGllYmEuYmFpZHUuY29tIikgKyAxKSA9PSAidGllYmEuYmFpZHUuY29tIikgfHwgKGRvY3VtZW50LmRvbWFpbiA9PSAid3d3LnRpZWJhLmNvbSIgfHwgZG9jdW1lbnQuZG9tYWluLnN1YnN0cmluZyhkb2N1bWVudC5kb21haW4uaW5kZXhPZigiLnd3dy50aWViYS5jb20iKSArIDEpID09ICJ3d3cudGllYmEuY29tIikpIHsKICAgICAgICAgICAgY3NzICs9CiAgICAgICAgICAgICAgICBgCiAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIOKAlOKAlFdlYkZvbnRz4oCU4oCUCiAgICAgICAgICAgICAgIEdvb2dsZSBGb250czogaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9mb250cwogICAgICAgICAgICAgICBHb29nbGUgTWF0ZXJpYWwgaWNvbnM6IGh0dHBzOi8vZGVzaWduLmdvb2dsZS5jb20vaWNvbnMvCiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgIEBmb250LWZhY2UgewogICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnT3BlbiBTYW5zXCc7CiAgICAgICAgICAgICAgIAlmb250LXN0eWxlOiBub3JtYWw7CiAgICAgICAgICAgICAgIAlmb250LXdlaWdodDogNDAwOwogICAgICAgICAgICAgICAJc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNy9tZW04WWFHczEyNk1pWnBCQS1VRlVaMGJiY2sud29mZjIpIGZvcm1hdChcJ3dvZmZcJyk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLypodHRwczovL2ZvcnVtLnVzZXJzdHlsZXMub3JnL2Rpc2N1c3Npb24vNDk1NTgvIOKAlOKAlOWbvuagh+aXoOazleaYvuekuuivt+eci+i/memHjOKAlOKAlCovCiAgICAgICAgICAgICAgIEBmb250LWZhY2UgewogICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgCWZvbnQtc3R5bGU6IG5vcm1hbDsKICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgICAgICAgIAlzcmM6IHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvbWF0ZXJpYWxpY29ucy92NTQvZmxVaFJxNnR6WmNsUUVKLVZkZy1JdWlhRHNOYy53b2ZmMikgZm9ybWF0KFwnd29mZjJcJykKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgLnRiLXVlZGl0b3ItZnVsbHNjcmVlbiAudGJfcmljaF9wb3N0ZXJfY29udGFpbmVyewogICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogI0YxRjFGMSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaHR0cHM6Ly9vbm94LnFpbml1ZG4uY29tL21hdmVyaWNrL3RiYmcvMS5qcGcpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXNpemU6IGNvdmVyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgLnRiLXVlZGl0b3ItZnVsbHNjcmVlbiAudGJfcmljaF9wb3N0ZXJfY29udGFpbmVyIHsKICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBib2R5OjpzZWxlY3Rpb24gewogICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjNDg3OUJEOwogICAgICAgICAgICAgICAJdGV4dC1zaGFkb3c6IG5vbmU7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgKiB7CiAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdPcGVuIFNhbnNcJywgXCdNaWNyb3NvZnQgWWFoZWkgVUlcJywgXCdNaWNyb3NvZnQgWWFoZWlcJzsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhIHsKICAgICAgICAgICAgICAgCXRyYW5zaXRpb246IGNvbG9yIC40cyBlYXNlOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8q5pu/5o2iQmFubmVyKi8KICAgICAgICAgICAgICAgLnN0YXJfYmFubmVyIGltZ1tzcmMkPVwiZGVmYXVsdF9oZWFkMjAxNDEwMTQuanBnXCJdLAogICAgICAgICAgICAgICAudmVydGljYWxfY2FyZF9iYW5uZXIgaW1nW3NyYyQ9XCJkZWZhdWx0X2hlYWQyMDE0MTAxNC5qcGdcIl0sCiAgICAgICAgICAgICAgIC5jYXJkX2Jhbm5lciBpbWdbc3JjJD1cImRlZmF1bHRfaGVhZDIwMTQxMDE0LmpwZ1wiXXsKICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAxODBweDsKICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogMTAwJTsKICAgICAgICAgICAgICAgCXdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgIAloZWlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgCWJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaHR0cHM6Ly93dzIuc2luYWltZy5jbi9sYXJnZS83YmRlMDJmYmd3MWYzeXQ4OXAweGVqMjB4YzA2NHRhZS5qcGcpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAvKuabv+aNouWQp+WktOWDjyovCiAgICAgICAgICAgICAgIGRpdltjbGFzcyo9XCJfdGhlbWUyXCJdIGltZy5jYXJkX2hlYWRfaW1nW3NyYyQ9XCJjMWQ3MTlmNzkwNTI5ODIyNzIyMWFiOGJkNmNhN2JjYjBiNDZkNDU4LmpwZ1wiXSwKICAgICAgICAgICAgICAgZGl2W2NsYXNzKj1cIl90aGVtZTJcIl0gaW1nLmNhcmRfaGVhZF9pbWdbc3JjJD1cIjE5OWE4N2Q2Mjc3ZjllMmZhMDQxOWJmMDE5MzBlOTI0Yjk5OWYzZTAuanBnXCJdLAogICAgICAgICAgICAgICBkaXZbY2xhc3MqPVwiX3RoZW1lMlwiXSBpbWcuY2FyZF9oZWFkX2ltZ1tzcmMkPVwiN2JmNzgyNDVkNjg4ZDQzZjE0N2IwMWJhN2MxZWQyMWIwY2Y0M2I5OC5qcGdcIl0sCiAgICAgICAgICAgICAgIGRpdltjbGFzcyo9XCJfdGhlbWUyXCJdIGltZy5jYXJkX2hlYWRfaW1nW3NyYyQ9XCJkZWZhdWx0X2F2YXRhcjIwMTQxMDE3LmpwZ1wiXXsKICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOiA2MHB4OwogICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA2MHB4OwogICAgICAgICAgICAgICAgICAgd2lkdGg6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGltZy5jYXJkX2hlYWRfaW1nW3NyYyQ9XCJjMWQ3MTlmNzkwNTI5ODIyNzIyMWFiOGJkNmNhN2JjYjBiNDZkNDU4LmpwZ1wiXSwKICAgICAgICAgICAgICAgaW1nLmNhcmRfaGVhZF9pbWdbc3JjJD1cIjE5OWE4N2Q2Mjc3ZjllMmZhMDQxOWJmMDE5MzBlOTI0Yjk5OWYzZTAuanBnXCJdLAogICAgICAgICAgICAgICBpbWcuY2FyZF9oZWFkX2ltZ1tzcmMkPVwiN2JmNzgyNDVkNjg4ZDQzZjE0N2IwMWJhN2MxZWQyMWIwY2Y0M2I5OC5qcGdcIl0sCiAgICAgICAgICAgICAgIGltZy5jYXJkX2hlYWRfaW1nW3NyYyQ9XCJkZWZhdWx0X2F2YXRhcjIwMTQxMDE3LmpwZ1wiXXsKICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAxNTBweDsKICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogMTUwcHg7CiAgICAgICAgICAgICAgIAl3aWR0aDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAJaGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXNpemU6IGNvdmVyOwogICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgICAgICAgICAgICAJYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHA6Ly93dzIuc2luYWltZy5jbi9tdzY5MC83YmRlMDJmYmd3MWY0ZGc0andrbmVqMjA0NjA0NmdseS5qcGcpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAvKui0tOWQp+S8muWRmOebuOWFs+mhuSovCiAgICAgICAgICAgICAgIC51X21lbWJlciwKICAgICAgICAgICAgICAgI2NlbGVicml0eSwKICAgICAgICAgICAgICAgLmFzaWRlX3JlZ2lvbi5jZWxlYnJpdHksCiAgICAgICAgICAgICAgIC5qLXBsYWNlaG9sZGVyLXBheS1tZW1iZXIsCiAgICAgICAgICAgICAgIC5pY29uLWNyb3duLXN1cGVyLW5vbiwKICAgICAgICAgICAgICAgIC8qLnNpZ25fdGlwX3Nib3hfMWtleSzotLTlkKflj7PkuIrop5LnmoTkuIDplK7nrb7liLAqLwogICAgICAgICAgICAgICAgLnAtcG9zdC1mb3JiaWQtc3BlZWNoLAogICAgICAgICAgICAgICAgLyrotoXnuqfkvJrlkZjlkITnp43mj5DnpLoqLwogICAgICAgICAgICAgICAgLnBvc3Rlcl9zdWNjZXNzIC5zdWNjZXNzLWZvb3QtdGlwLAogICAgICAgICAgICAgICAgLmxfdGhyZWFkX21hbmFnZSAjbm90aWZ5X2J1YmJsZSwKICAgICAgICAgICAgICAgIC5xdWljay1yZXBseS1kZXNjIHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI2RfcG9zdF9tYW5hZ2U6aG92ZXIgI2pfcXVpY2tfdGhyZWFkPmxpOm50aC1vZi10eXBlKDEpewogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IC4wczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNkX3Bvc3RfbWFuYWdlOmhvdmVyICNqX3F1aWNrX3RocmVhZD5saTpudGgtb2YtdHlwZSgyKXsKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiAuMXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjZF9wb3N0X21hbmFnZTpob3ZlciAjal9xdWlja190aHJlYWQ+bGk6bnRoLW9mLXR5cGUoMyl7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogLjJzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI2RfcG9zdF9tYW5hZ2U6aG92ZXIgI2pfcXVpY2tfdGhyZWFkPmxpOm50aC1vZi10eXBlKDQpewogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IC4zczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNkX3Bvc3RfbWFuYWdlOmhvdmVyICNqX3F1aWNrX3RocmVhZD5saTpudGgtb2YtdHlwZSg1KXsKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiAuNHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjZF9wb3N0X21hbmFnZTpob3ZlciAjal9xdWlja190aHJlYWQ+bGk6bnRoLW9mLXR5cGUoNil7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogLjVzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvKi50YnVpX2ZiYXJfc2hhcmUs5Y+z5L6n5rWu5bGCLeWIhuS6qyovCiAgICAgICAgICAgICAgLyoudGJ1aV9mYmFyX2Zhdm9yLOWPs+S+p+a1ruWxgi3niLHpgJvnmoTlkKcqLwogICAgICAgICAgICAgIC50YnVpX2ZiYXJfcHJvcHMsLyrlj7Pkvqfmta7lsYIt6a2U5rOV6YGT5YW3Ki8KICAgICAgICAgICAgICAudGJ1aV9mYmFyX3RzdWtrb21pLC8q5Y+z5L6n5rWu5bGCLeelnuadpeS4gOWPpSovCiAgICAgICAgICAgICAgLyouc2VhcmNoX21haW5fZml4ZWQs5pCc57Si5qCP5rWu5bGCLOWPlua2iOmakOiXjyovCgoKCiAgICAgICAgICAgICAgICAuZWR1aS1idG4tdG9vbGJhciAuZWR1aS1idG4tbWVkYWwsLyrnvJbovpHmoYbotLTlkKfnibnmnYPmjInpkq4qLwogICAgICAgICAgICAgICAgLnNhdmVfZmFjZV9iZywuYWNoaWV2ZW1lbnRfbWVkYWxfc2VjdGlvbiwuYWNoaWV2ZW1lbnRfbWVkYWxfd3JhcHBlciwvKualvOWxguaMveWwiuaMiemSrizlvr3nq6AqLwogICAgICAgICAgICAgICAgLmx6bF9jbnQgLnByZV9pY29uX3dyYXAsLnBfcG9zdGxpc3QgLnByZV9pY29uX3dyYXAsLyrluJblrZDlhoXpobXkvJrlkZjmoIfor4YqLwogICAgICAgICAgICAgICAgLnNoYXJlX3RocmVhZCwvKuS4gOalvOWIhuS6q+aMiemSriovCiAgICAgICAgICAgICAgICAucG9zdC1mb290LXNlbmQtZ2lmdC1idG4sLyrkuIDmpbzpgIHnpLznianmjInpkq4qLwoKICAgICAgICAgICAgICAgICNzZWxlY3RzZWFyY2gtaWNvbiwvKuWIkuivjeaQnOe0oiovCiAgICAgICAgICAgICAgICBbaWQ9XCJwYWdlbGV0X2VudGVydGFpbm1lbnQtZ2FtZS9wYWdlbGV0L2dhbWVfaGVhZF9taWRkbGVcIl0sLyrpg6jliIbmuLjmiI/otLTlkKflpLTpg6jmuLjmiI/ln58qLwoKCgogICAgICAgICAgICAgICAgW2lkPVwicGFnZWxldF9mcnMtYXNpZGUvcGFnZWxldC9ob3R0b3BpY1wiXSwKICAgICAgICAgICAgICAgIC5sX2NvbnRhaW5lciAucGxhdF9oZWFkX3YyX3VubWFpbl93cmFwcGVyLC8q6K6k6K+B5ZCn5biW5a2Q5YaF6aG15aS06YOo6K+m57uG5L+h5oGvKi8KICAgICAgICAgICAgICAgIC5wX3JlcGx5X2ZpcnN0LC5kX3Bvc3RfY29udGVudF9maXJzdGZsb29yIC5jb3JlX3JlcGx5X3RhaWwgLnBfcmVwbHksLyrlsY/olL3lhbfmnInor6/lr7zmgKfnmoTkuIDmpbzlhoXlrrnkuIvmlrnlm57lpI3mjInpkq4qLwogICAgICAgICAgICAgICAgLnN1Z2dlc3Rpb25fbGlzdCA+bGlbZGF0YS1maWVsZCo9XCJvcGVyYXRpb25fdGl0bGVcIl0sLnN1Z2dlc3Rpb25fbGlzdCA+bGlbZGF0YS1maWVsZCo9XCJvcGVyYXRpb25faXRlbVwiXSwuYmRmZW5neXVuLC8q5pCc57Si5oKs5rWu56qXLeWkp+S8meato+WcqOiBiiovCiAgICAgICAgICAgICAgICAuc3VnZ2VzdGlvbl9saXN0ID5saVtkYXRhLWZpZWxkKj1cInJlbGF0aW9uX2dhbWVfdGl0bGVcIl0sLnN1Z2dlc3Rpb25fbGlzdCA+bGlbZGF0YS1maWVsZCo9XCJnYW1lX2l0ZW1cIl0sLyrmkJzntKLmgqzmta7nqpct55u45YWz5ri45oiPKi8KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfc3F1YXJlIHsKICAgICAgICAgICAgICAgIC8qCWRpc3BsYXk6YmxvY2sgIWltcG9ydGFudDsqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrorqnotLTlkKfng63orq7mppzlj6/ku6XmmL7npLrlh7rmnaXvvIzlkIzml7bmlLnlj5jog4zmma/popzoibLjgILotLTlkKfnmoTkuLvpopjotLTliJfooajmsqHmnInng63orq7mppzvvIzotLTlrZDmnInng63orq7mppzmsqHnqbrpl7TmmL7npLrjgILjgILvvIEqLwogICAgICAgICAgICAgICAgLypkaXYudG9waWNfbGlzdF9ib3ggewogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZkZmRmZDsKICAgICAgICAgICAgICAgIH0qLwoKICAgICAgICAgICAgICAgIC8q6K6p5LiA5qW855qE5Zue5aSN5oyJ6ZKu55yL6LW35p2l5pu05aW955yL54K577yfKi8KICAgICAgICAgICAgICAgIC5wX3JlcGx5X2ZpcnN0ewogICAgICAgICAgICAgICAgcmlnaHQ6OXB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrmpbzlsYLmsJTms6Es5Lmf57uZ5pi+56S65ZCnKi8KICAgICAgICAgICAgICAgIC5wb3N0X2J1YmJsZV90b3AsLnBvc3RfYnViYmxlX2JvdHRvbXsKICAgICAgICAgICAgICAgIC8qICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrms6jph4rmjonvvIzorqnmpbzlsYLmsJTms6Hph4znmoTmloflrZfog4zmma/kuI3lj5jnmb3oibIqLwogICAgICAgICAgICAgICAgLyoucG9zdF9idWJibGVfbWlkZGxlewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgLyrmoIfpopjovpPlhaXmoYbmloflrZflr7npvZDmlrnlvI8qLwogICAgICAgICAgICAgICAgLnBvc3Rlcl9ib2R5IC5lZGl0b3JfdGl0bGUsCiAgICAgICAgICAgICAgICAucG9zdGVyX2JvZHkgLnRidWlfcGxhY2Vob2xkZXIsCiAgICAgICAgICAgICAgICAucHByZWZpeC1pdGVtewogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrluJblrZDliJfooajpobXkvJrlkZjmoIfor4blkozpnZ7lrp7lkI3orqTor4HljbDorrAqLwogICAgICAgICAgICAgICAgLyrmgqzlgZzmmL7npLoqLwogICAgICAgICAgICAgICAgLmZyc19icmlnaHRfcHJlaWNvbiwKICAgICAgICAgICAgICAgIC5mcnNfYnJpZ2h0X2ljb25zPio6bm90KFtkYXRhLW5hbWU9XCJ1c2VyX3R5cGVcIl0pOm5vdChbZGF0YS1uYW1lPVwiaXNfdmVyaWZ5XCJdKXsKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgLjRzIGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLmpfdGhyZWFkX2xpc3Q6aG92ZXIgLmZyc19icmlnaHRfcHJlaWNvbiwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAual90aHJlYWRfbGlzdDpob3ZlciAuZnJzX2JyaWdodF9pY29ucz4qOm5vdChbZGF0YS1uYW1lPVwidXNlcl90eXBlXCJdKTpub3QoW2RhdGEtbmFtZT1cImlzX3ZlcmlmeVwiXSl7CiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX3RocmVhZF9saXN0IC5yZWRfdGV4dCwKICAgICAgICAgICAgICAgIC5qX3RocmVhZF9saXN0IC5yZWQtdGV4dCwKICAgICAgICAgICAgICAgIC5qX3RocmVhZF9saXN0IC52aXBfcmVkLAogICAgICAgICAgICAgICAgLmpfdGhyZWFkX2xpc3QgLnZpcC1yZWQsCiAgICAgICAgICAgICAgICAual90aHJlYWRfbGlzdCAudmlwX3JlZDpob3ZlciwKICAgICAgICAgICAgICAgIC5qX3RocmVhZF9saXN0IC52aXAtcmVkOmhvdmVyLAogICAgICAgICAgICAgICAgLmpfdGhyZWFkX2xpc3QgLnZpcF9yZWQ6dmlzaXRlZCwKICAgICAgICAgICAgICAgIC5qX3RocmVhZF9saXN0IC52aXAtcmVkOnZpc2l0ZWR7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX3RocmVhZF9saXN0IC5zaWduX2hpZ2hsaWdodHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC5qX3RocmVhZF9saXN0OmhvdmVyIC5zaWduX2hpZ2hsaWdodHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmYTY0MCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC5qX3RocmVhZF9saXN0OmhvdmVyIC5yZWRfdGV4dCwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAual90aHJlYWRfbGlzdDpob3ZlciAucmVkLXRleHQsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLmpfdGhyZWFkX2xpc3Q6aG92ZXIgLnZpcF9yZWQsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLmpfdGhyZWFkX2xpc3Q6aG92ZXIgLnZpcC1yZWR7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNmNzRkNGEhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2xpX2xlZnQsIC5qX3RocmVhZGxpc3RfbGlfbGVmdCB7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKueUqOaIt+mdouadvyovCgogICAgICAgICAgICAgICAgLnVfeGl1OCwvKuS4quS6ui3miJHnmoTnp4DlnLoqLwogICAgICAgICAgICAgICAgLnVfd2FsbGV0LC8qVOmAl+i0puWNlSovCiAgICAgICAgICAgICAgICAudV90Ym1hbGwsLyrotLTlkKfllYbln44qLwogICAgICAgICAgICAgICAgLnVfYXBwLC8q56e75Yqo5a6i5oi356uvKi8KICAgICAgICAgICAgICAgIC8q5p2C6aG5Ki8KICAgICAgICAgICAgICAgIC5zcGxpdCwKICAgICAgICAgICAgICAgIC51X3NwbGl0LAogICAgICAgICAgICAgICAgLnVfYXBwY2VudGVyRW50cmFuY2UsCiAgICAgICAgICAgICAgICAudV9qb2ludmlwLAogICAgICAgICAgICAgICAgLnVfYmRob21lIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8q55So5oi36Z2i5p2/LeWKqOeUu+W7tui/nyovCgogICAgICAgICAgICAgICAgLnVzZXJiYXI+dWw+bGkudV91c2VybmFtZTpob3Zlcn5saTpudGgtb2YtdHlwZSgyKSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogMHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saS51X3VzZXJuYW1lOmhvdmVyfmxpOm50aC1vZi10eXBlKDQpIHsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWRlbGF5OiAuMDVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXJiYXI+dWw+bGkudV91c2VybmFtZTpob3Zlcn5saTpudGgtb2YtdHlwZSg2KSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogLjFzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXJiYXI+dWw+bGkudV91c2VybmFtZTpob3Zlcn5saSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogLjE1czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyYmFyPnVsPmxpLnVfc2V0dGluZzpob3Zlcn5saTpudGgtb2YtdHlwZSg0KSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogMHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saS51X3NldHRpbmc6aG92ZXJ+bGk6bnRoLW9mLXR5cGUoNikgewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZGVsYXk6IC4wNXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saS51X3NldHRpbmc6aG92ZXJ+bGkgewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZGVsYXk6IC4xczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyYmFyPnVsPmxpLnVfbmV3czpob3Zlcn5saTpudGgtb2YtdHlwZSg2KSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogMHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saS51X25ld3M6aG92ZXJ+bGkgewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZGVsYXk6IC4wNXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrlub/lkYrlkozml6DnlKjlip/og70qLwogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9iYXpodSwKICAgICAgICAgICAgICAgIC5nYW1lLWhlYWQtZ2FtZS1pbmZvLXdyYXBwZXIsCiAgICAgICAgICAgICAgICBbaWQ9XCJwYWdlbGV0X2VudGVydGFpbm1lbnQtbGl2ZXNob3cvcGFnZWxldC92aWRlb19oZWFkXCJdLAogICAgICAgICAgICAgICAgLmxfcG9zdF9icmlnaHRbZGF0YS1maWVsZCo9XCJ1c2VyX25hbWVcXFwiXFw6XFxcIlxcXFx1NGUzZlxcXFx1NTkyOVxcXFx1NGUzNlxcXFx1NGU0YlxcXFx1NmI4N1wiXVtkYXRhLWZpZWxkKj1cImNvbnRlbnRcXFwiXFw6XFxcIlxcXFx1NWUwY1xcXFx1NjcxYlxcXFx1NTQwNFxcXFx1NGY0ZFxcXFx1NTQyN1xcXFx1NTNjYlxcXFx1ODBmZFxcXFx1NjUyZlxcXFx1NjMwMVxcXFx1OWI1NFxcXFx1NTQyN1xcXFx1NjcwOFxcXFx1NTIwYVxcXFx1MzAwMlxcXCJcIl0sCiAgICAgICAgICAgICAgICAubF9wb3N0X2JyaWdodFtkYXRhLWZpZWxkKj1cInRlbXBsYXRlX2lkXCJdLAogICAgICAgICAgICAgICAgLmxfcG9zdF9icmlnaHRbZGF0YS1maWVsZCo9XCJtb25pdG9yX2lkXCJdLAogICAgICAgICAgICAgICAgI2R1b2t1X3NlcnZlcnNfbGlzdF93cmFwcGVyLAogICAgICAgICAgICAgICAgYVtsb2NhdGUqPVwiY29tbW9uX3NlYXJjaF9idXR0b25cIl0sCiAgICAgICAgICAgICAgICAucGxheV9saXN0X3BhbmVsLAogICAgICAgICAgICAgICAgLm1pZGRsZS1zZWMsCiAgICAgICAgICAgICAgICAuZ2FtZV9saXZlX2xpc3QsCiAgICAgICAgICAgICAgICAuZmlyZXdvcmtfc2VuZGVyX3dyYXAsCiAgICAgICAgICAgICAgICBbZGF0YS1kYWlkXSwKICAgICAgICAgICAgICAgICNwYl9hZGJhbm5lciwKICAgICAgICAgICAgICAgICNmb3J1bV9yZWNvbW1lbmQsCiAgICAgICAgICAgICAgICAudG9wLXNlYywKICAgICAgICAgICAgICAgIC5yLXRvcC1zZWMsCiAgICAgICAgICAgICAgICAjc3BhZ2VfbGl2ZXNob3dfc2xpZGUsCiAgICAgICAgICAgICAgICAjcGxhdF9hY3Rfd3JhcHBlciwKICAgICAgICAgICAgICAgICNzcGFnZV9nYW1lX3RhYl93cmFwcGVyLAogICAgICAgICAgICAgICAgLm1lbWJlcl9yYW5rLAogICAgICAgICAgICAgICAgI3NlYXJjaF9mZW5nY2hhbywKICAgICAgICAgICAgICAgICNzZWFyY2hfdW5pb25fbW9kLAogICAgICAgICAgICAgICAgI3NlYXJjaF9ib3R0b21hZCwKICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fdG9wX25hdl9ob2xkcGxhY2UsCiAgICAgICAgICAgICAgICAuYXBwX2ZvcnVtX3RvcF9uYXYsCiAgICAgICAgICAgICAgICAuZmF2LXRvb2xiYXIsCiAgICAgICAgICAgICAgICBpbWcuY2xvc2VfYnRuLAogICAgICAgICAgICAgICAgaW1nLmNsb3NlX2J0bi5qX2NsaWNrX2Nsb3NlK2RpdiwKICAgICAgICAgICAgICAgIHAuc3dpdGNoX3JhZGlvcytkaXYsCiAgICAgICAgICAgICAgICAjYXNpZGVfYWQsCiAgICAgICAgICAgICAgICAucmVnaW9uX2JyaWdodCN0aWViYS1ub3RpY2UrZGl2LAogICAgICAgICAgICAgICAgLnRocmVhZF9yZWNvbW1lbmQsCiAgICAgICAgICAgICAgICAjcGxhdGZvcm1fbGVmdF9mbG9hdCwKICAgICAgICAgICAgICAgIC5jb250ZW50X3RvcCwKICAgICAgICAgICAgICAgIC5hc2lkZV9yZWdpb24ubXlfYXBwLmpfZW5jb3VyYWdlX2VudHJ5LAogICAgICAgICAgICAgICAgaW1nW3NyY149XCJodHRwOi8vdGIxLmJkc3RhdGljLmNvbS90Yi9jbXMvbmdtaXMvYWRzZW5zZS9cIl0sCiAgICAgICAgICAgICAgICAjdG9wX2FjdGl2aXR5LAogICAgICAgICAgICAgICAgLmxpZmVfaGVscGVyLAogICAgICAgICAgICAgICAgLm1pZGRsZS1zZWM+ZGl2Pi5pZnJhbWVfd3JhcHBlciwKICAgICAgICAgICAgICAgICNzZWFyY2hfZmVuZ2NoYW9fbGVmdCwKICAgICAgICAgICAgICAgIGRpdltpZD1cInBhZ2VsZXRfZW50ZXJ0YWlubWVudC1iYXNlL3BhZ2VsZXQveGl1OF9hc2lkZV9zbGlkZVwiXSwKICAgICAgICAgICAgICAgIFtpZD1cInBhZ2VsZXRfZnJzLWFzaWRlL3BhZ2VsZXQvYWRcIl0sCiAgICAgICAgICAgICAgICBkaXZbaWQ9XCJwYWdlbGV0X2Zycy1oZWFkZXIvcGFnZWxldC9oZWFkX2NvbnRlbnRfbWlkZGxlXCJdID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2W2NsYXNzXj1cImlmcmFtZV9cIl0sCiAgICAgICAgICAgICAgICAual92b2ljZV9hZF9naWYsCiAgICAgICAgICAgICAgICAucF9zaGFyZV9kaW5nLC8q5Y+R5biW5Z+f6aG26YOo5YiG5Lqr5o6n5Lu2Ki8KICAgICAgICAgICAgICAgIC5wX21hbGxfdGFpbCwvKuWxguS4u+S9v+eUqOS6hui0tOWQp+eJueadg+agh+ivhiovCiAgICAgICAgICAgICAgICAjcG9wX2ZyYW1lLC8q5Y+z5LiL5by556qXKi8KICAgICAgICAgICAgICAgICNlbmNvdXJhZ2VfZW50cnksLyrlj7PovrnmoI8t5oiR55qE5bqU55SoKi8KICAgICAgICAgICAgICAgICNnbG9iYWxfbm90aWNlX3dyYXAsLyrlhajotLTlkKflupXpg6jlhazlhbHpgJrnn6UqLwogICAgICAgICAgICAgICAgLmZpcmV3b3JrLXdyYXAsLmZpcmV3b3JrLXdyYXAyLC8q54Of6IqxKi8KICAgICAgICAgICAgICAgIHVsI3RocmVhZF9saXN0PmxpOm5vdChbZGF0YS1maWVsZF0pOm5vdCgudGhyZWFkX3RvcF9saXN0X2ZvbGRlciksLyrluJblrZDliJfooajmiYDmnInpobkqLwogICAgICAgICAgICAgICAgI2pfcF9wb3N0bGlzdD5kaXY6bnRoLW9mLXR5cGUoMSl+ZGl2Om5vdChbZGF0YS1maWVsZF0pOm5vdCgjal9wX3Bvc3RsaXN0KSwvKuW4luWtkOWGhemhteaJgOaciealvOWxgiovCiAgICAgICAgICAgICAgICB1bCN0aHJlYWRfbGlzdD5saS5qX2RmX2NhcmQsLyrmjqjlub8qLwogICAgICAgICAgICAgICAgI2pfcF9wb3N0bGlzdD5kaXZbZGF0YS1pc2F1dG9yZXBseV06bm90KDpmaXJzdC1vZi10eXBlKSwvKuaOqOW5vyovCiAgICAgICAgICAgICAgICAuZGlhbW9uZC1tYWxsLWFzaWRlLC8q6LS05ZCn5aS65a6dKi8KICAgICAgICAgICAgICAgICNwYzJjbGllbnQsLypp6LS05ZCn6aG16Z2i5a6i5oi356uv5bm/5ZGKKi8KICAgICAgICAgICAgICAgICNjb21fdTlfaGVhZHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLmNyZWF0aXZlcGxhdGZvcm0td3JhcC13b3JkLXJlcG9zdC1idG4gLmJ0bi1kZWZhdWx0LAogICAgICAgICAgICAgICAgI3NlbGVjdHNlYXJjaC1pY29uIHsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogNHB4IDZweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiA5cHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQ4NzlCRDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpLCAwIDJweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb246IGJhY2tncm91bmQgLjRzIGVhc2U7CiAgICAgICAgICAgICAgICAJei1pbmRleDogOTk5OTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jcmVhdGl2ZXBsYXRmb3JtLXdyYXAtd29yZC1yZXBvc3QtYnRuIC5idG4tZGVmYXVsdHsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAycHggNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY3JlYXRpdmVwbGF0Zm9ybS13cmFwLXdvcmQtcmVwb3N0LWJ0biAuYnRuLWRlZmF1bHQ6aG92ZXIsCiAgICAgICAgICAgICAgICAjc2VsZWN0c2VhcmNoLWljb246aG92ZXIgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0Mjg1RjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjc2VsZWN0c2VhcmNoLWljb246YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZThiNlwiOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCcgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMTsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE4cHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiBib3R0b207CiAgICAgICAgICAgICAgICAJcGFkZGluZy1ib3R0b206IDFweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNzZWxlY3RzZWFyY2gtaWNvbjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmkJzntKJcIjsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNzZWxlY3RzZWFyY2gtaWNvbiBpbWcgewogICAgICAgICAgICAgICAgCS8qZGlzcGxheTpub25l5oiWdmlzaWJpbGl0eTpoaWRkZW5k5o6J56uf54S25Lya5a+86Ie054K55Ye75peg5pWIKi8KCiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDA7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogOTk7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKui0tOWQp+WktOmDqOi1hOaWmSovCiAgICAgICAgICAgICAgICAudmVydGljYWxfaGVhZF9iZ3sKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudmVydGljYWxfaGVhZCAuY2FyZF90b3Bfd3JhcHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogOTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDE1cHggMCAwIDEwMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zdGFyX2Jhbm5lciwKICAgICAgICAgICAgICAgIC52ZXJ0aWNhbF9jYXJkX2Jhbm5lciwKICAgICAgICAgICAgICAgIC5jYXJkX2Jhbm5lciB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfaGVhZCwKICAgICAgICAgICAgICAgIC5wbGF0X2hlYWR7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmhlYWRfY2FyZHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jYXJkX3RvcF9sZWZ0ewogICAgICAgICAgICAgICAgCW1hcmdpbjogNXB4IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGxhdF9oZWFkX3YyX3VubWFpbl93cmFwcGVyLAogICAgICAgICAgICAgICAgLnBsYXRfaGVhZF92Ml9tYWluX3dyYXBwZXIgewogICAgICAgICAgICAgICAgCWJvcmRlci1sZWZ0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJpZ2h0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA2KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfaGVhZGVyewogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDEzcHggMTdweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zdGFyX2hlYWRlcl9yaWdodHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9pbmZvewogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMjBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zdGFyX25hdl9idG5zX3dyYXB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfbmF2X2J0bnNfd3JhcDpudGgtbGFzdC1vZi10eXBlKDIpewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wbGF0X3JlY29tX2Nhcm91c2VsIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRpbWVfYXhpc19zbGlkZV9idXR0b25fd3JhcHBlciwKICAgICAgICAgICAgICAgIGEuc3RhcmNoYW5uZWxfZW50cmFuY2V7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGxhdF9oZWFkZXJ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wbGF0X2NhcmRfdG9wIHsKICAgICAgICAgICAgICAgIAltYXJnaW46IDIwcHggMDsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMjBweDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY2FyZF90b3Bfd3JhcHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wMykgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItbGVmdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci10b3A6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmlnaHQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9waWNib3gsCiAgICAgICAgICAgICAgICAucGxhdF9waWNib3gsCiAgICAgICAgICAgICAgICAuY2FyZF9oZWFkIHsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC41KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBsYXRfcGljYm94IGltZywKICAgICAgICAgICAgICAgIC5jYXJkX2hlYWRfaW1newogICAgICAgICAgICAgIC8qd2lkdGg6IDE1MHB4ICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAvKmhlaWdodDogMTUwcHggIWltcG9ydGFudDsqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGl2W2NsYXNzKj1cIl90aGVtZTJcIl0gLnBsYXRfcGljYm94IGltZywKICAgICAgICAgICAgICAgIGRpdltjbGFzcyo9XCJfdGhlbWUyXCJdIC5jYXJkX2hlYWRfaW1newogICAgICAgICAgICAgICAgCXdpZHRoOiA2MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA2MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnBsYXRfdGl0bGVfaDMsCiAgICAgICAgICAgICAgICAuY2FyZF90aXRsZV9mbmFtZXsKICAgICAgICAgICAgICAgIAl0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNTU1ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLmNhcmRfc2xvZ2FuewogICAgICAgICAgICAgICAgCWNvbG9yOiAjNTU1ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZm9jdXNfYnRuewogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwuMDYpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKCiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcixjb2xvcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNHM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZm9jdXNfYnRuOmhvdmVyewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGNDQzMzYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZvY3VzX2J0bjpiZWZvcmV7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogLTJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jYW5jZWxfZm9jdXM6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODdkXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY2FuY2VsX2ZvY3VzOmFmdGVyewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5bey5YWz5rOoXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaXNsaWtlX2ZvY3VzewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmlzbGlrZV9mb2N1czpob3ZlcnsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaXNsaWtlX2ZvY3VzOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTg3ZVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmlzbGlrZV9mb2N1czphZnRlcnsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuWFs+azqFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBsYXRfdXNlX3RvdGFsICosCiAgICAgICAgICAgICAgICAuY2FyZF9udW0gKiwKICAgICAgICAgICAgICAgIC5jYXJkX2luZm8gKnsKICAgICAgICAgICAgICAgIAljb2xvcjogICNhYWEgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wbGF0X3Bvc3RfbnVtLAogICAgICAgICAgICAgICAgLmNhcmRfbWVuTnVtLAogICAgICAgICAgICAgICAgLmNhcmRfaW5mb051bSwKICAgICAgICAgICAgICAgIC5jYXJkX2luZm8gYVtocmVmXXsKICAgICAgICAgICAgICAgIAljb2xvcjogICM4ODggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNhcmRfaW5mbyBhW2hyZWZdOmhvdmVyewogICAgICAgICAgICAgICAgCWNvbG9yOiAgIzY2NiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyp0aGVtZTIqLwogICAgICAgICAgICAgICAgLnBsYXRfaGVhZC5wbGF0X2hlYWRfdGhlbWUyLAogICAgICAgICAgICAgICAgLmNhcmRfdG9wX3dyYXAuY2FyZF90b3BfdGhlbWUyewogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY2FyZF90b3BfdGhlbWUyIC5jYXJkX3RvcCB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA4NHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiAxMDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jYXJkX3RvcF90aGVtZTIgLmNhcmRfdGl0bGVfZm5hbWUgewogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDFweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNhcmRfdG9wX3RoZW1lMiAuY2FyZF9udW17CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6bm93cmFwOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZWZ0OiAxcHg7CiAgICAgICAgICAgICAgICAJYm90dG9tOiAtMThweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAucGxhdF9oZWFkX3RoZW1lMiAucGxhdF9jYXJkX3RvcCB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wbGF0X2hlYWRfdGhlbWUyIC5wbGF0X2hlYWRlcl9sZWZ0IHsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDg2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wbGF0X2hlYWRfdGhlbWUyIC5wbGF0X3BpY2JveCwKICAgICAgICAgICAgICAgIC5jYXJkX3RvcF90aGVtZTIgLmNhcmRfaGVhZCB7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDYwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDYwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDRweCAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGxhdF9oZWFkX3RoZW1lMiAucGxhdF9waWNib3h7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAtN3B4IDE1cHggMCAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY2FyZF90b3BfdGhlbWUyIC5mb2N1c19idG4sCiAgICAgICAgICAgICAgICAucGxhdF9oZWFkX3RoZW1lMiAuZm9jdXNfYnRuewogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBsYXRfaGVhZF90aGVtZTIgLnBsYXRfdXNlX3RvdGFsewogICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOm5vd3JhcDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogNzlweDsKICAgICAgICAgICAgICAgIAlib3R0b206IC0ycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuetvuWIsCovCiAgICAgICAgICAgICAgICAucGxhdF9oZWFkZXJfcmlnaHQsCiAgICAgICAgICAgICAgICAuY2FyZF90b3BfcmlnaHR7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDA7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2lnbl9tb2RfYnJpZ2h0ewogICAgICAgICAgICAgICAgCXdpZHRoOiAyNDBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zaWduX2JveF9icmlnaHR7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmpfc2lnbmJ0bnsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDY0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0ODc5QkQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9zaWduYnRuOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTYxNlwiOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCU7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAl3aWR0aDogNjRweDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDY0cHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAJLW1vei1ib3gtc2hhZG93OiBpbmhlcml0OwogICAgICAgICAgICAgICAgCS13ZWJraXQtYm94LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogNjRweDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDQycHg7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQsY29sb3I7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmpfc2lnbmJ0bjpob3ZlcnsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDI4NUY0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNpZ25fdG9kYXlfZGF0ZXsKICAgICAgICAgICAgICAgIAlkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zaWduX2tlZXBfc3BhbiwKICAgICAgICAgICAgICAgIC5zaWduX21vbnRoX2xhY2tfZGF5c3sKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46MCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogaW5oZXJpdDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCS1tb3otYm94LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICAgICAgICAgIAktd2Via2l0LWJveC1zaGFkb3c6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogcmlnaHQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctcmlnaHQ6IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAxMHB4IDAgMCAxMHB4OwogICAgICAgICAgICAgICAgCWxlZnQ6IDE4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMDsKCiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNpZ25fbW9udGhfbGFja19kYXlzIHNwYW57CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zaWduX2tlZXBfc3BhbnsKICAgICAgICAgICAgICAgIAl0b3A6IC0yMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2lnbl9tb250aF9sYWNrX2RheXN7CiAgICAgICAgICAgICAgICAJdG9wOiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zaWduX21vZF9icmlnaHQ6aG92ZXIgLnNpZ25fa2VlcF9zcGFuLAogICAgICAgICAgICAgICAgLnNpZ25fbW9kX2JyaWdodDpob3ZlciAuc2lnbl9tb250aF9sYWNrX2RheXN7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNpZ25fbW9udGhfbGFja19kYXlzOm50aC1vZi10eXBlKDIpewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuc2lnbnN0YXJfc2lnbmVkewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNlZWUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzk5OSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zaWduc3Rhcl9zaWduZWQ6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlNjE0XCIgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2NjYyAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAuc2lnbl9tb2RfYnJpZ2h0IC5zaWduX3N1Y2MxIHsKICAgICAgICAgICAgICAgIAl0b3A6IDkwcHg7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IC0xMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNpZ25fdGlwX2JkX2FyciB7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDU3cHg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrnibnmrorlkKflpLTpg6gqLwogICAgICAgICAgICAgICAgLnBsYXRfc2tpbiAud3JhcDEsCiAgICAgICAgICAgICAgICAuc2tpbl8yMTAzIC53cmFwMSwKICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fYm9keSAud3JhcDF7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIGF1dG87CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDEzOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuYXBwX2ZvcnVtX2JvZHkgLmhlYWRfY29udGVudHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcC1oZWFkZXItd3JhcHBlciB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcF9oZWFkZXJ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDE2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OzsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDEwMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNTU1ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuYXBwX2hlYWRlcl90aXRsZV9tYWluIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuYXBwX2hlYWRlcl9mb3J1bV9uYW1lIHsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwcHggMCAwIDE1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5hcHBfaGVhZGVyX2ZvcnVtX25hbWUsCiAgICAgICAgICAgICAgICAuYXBwX2hlYWRlcl9mb3J1bV9uYW1lX2hyZWZ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM1NTUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5hcHBfaGVhZGVyX2ZvY3VzX2J0biB7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAtNXB4IDAgMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcF9oZWFkZXJfZm9jdXNfaW5mbyB7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogMTA0cHg7CiAgICAgICAgICAgICAgICAJYm90dG9tOiAxMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcF9oZWFkZXJfZm9jdXNfaW5mb19mb2N1c251bSwKICAgICAgICAgICAgICAgIC5hcHBfaGVhZGVyX2ZvY3VzX2luZm9fdGllbnVtIHsKICAgICAgICAgICAgICAgIAljb2xvcjogIzg4OCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcF9oZWFkZXJfbWFpbl9iYWNrZ3JvdW5kewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFtpZD1cInBhZ2VsZXRfcGxhdGZvcm0tb2ZmaWNpYWwvcGFnZWxldC9vZmZpY2lhbF9mb3J1bV9jYXJkXCJdLAogICAgICAgICAgICAgICAgLm9mZmljaWFsX2hlYWQsCiAgICAgICAgICAgICAgICAuaGVhZF9iYW5uZXIsCiAgICAgICAgICAgICAgICAuaGVhZF9iYW5uZXJfaW1nLAogICAgICAgICAgICAgICAgW2lkPVwicGFnZWxldF9lbmNvdXJhZ2UtYXBwZm9ydW0vcGFnZWxldC9oZWFkX3RvcFwiXSwKICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fdG9wewogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuYXBwX2hlYWRlcl9hdmF0YXIgewogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDBweCAwIDAgMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcF9oZWFkZXJfYXZhdGFyX2ltZ3sKICAgICAgICAgICAgICAgIAl3aWR0aDogNjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogNjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDRweDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC41KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFwcF9mb3J1bV9ib2R5IC5zaWduX21vZF9icmlnaHQgLnNpZ25fc3VjYzEgewogICAgICAgICAgICAgICAgCXRvcDogNjhweDsKICAgICAgICAgICAgICAgIAlyaWdodDogMzJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5za2luXzIxMDMgW2lkPVwicGFnZWxldF9mcnMtaGVhZGVyL3BhZ2VsZXQvaGVhZFwiXSwKICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fYm9keSBbaWQ9XCJwYWdlbGV0X2Zycy1oZWFkZXIvcGFnZWxldC9oZWFkXCJdewogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fYm9keSBbaWQ9XCJwYWdlbGV0X2Zycy1oZWFkZXIvcGFnZWxldC9oZWFkXCJdPmRpdnsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5za2luXzIxMDMgLmhlYWRfdG9wLAogICAgICAgICAgICAgICAgLmFwcF9mb3J1bV9ib2R5IC5oZWFkX3RvcHsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWJvcmRlcjogMXB4IHNvbGlkICNEQkRDRTAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuYXBwX2ZvcnVtX2JvZHkgW2lkPVwicGFnZWxldF9lbnRlcnRhaW5tZW50LWdhbWUvcGFnZWxldC9nYW1lX2hlYWRfbWlkZGxlXCJdewogICAgICAgICAgICAgICAgCWJvcmRlci10b3A6IDRweCBzb2xpZCAjRUFFQUVBOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8q5aS06YOo5oyH5byVKi8KICAgICAgICAgICAgICAgIC50b3BfY29udGVudCB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRvcF9jb250X21haW57CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMDIpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50b3BfY29udF90b2dnbGV7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbjogcmlnaHQgLjRzIGVhc2U7CiAgICAgICAgICAgICAgICAJei1pbmRleDogOTsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKTsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiBub25lOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgICAgICAgICAJY29sb3I6ICMyRDY0QjM7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyNHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgICAgICAgICAgCW92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudG9wX2NvbnRlbnRfY2xvc2VkIC50b3BfY29udF90b2dnbGV7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDEwMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRvcF9jb250X3RvZ2dsZTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDpcJ1xcZThlZlwnOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogLTRweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDRweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50b3BfY29udF90b2dnbGUgLnRvZ2dsZUJ0biB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAtMjRweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IC00cHg7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDMxcHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiBpbmhlcml0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRvcF9jb250X3RvZ2dsZSAudG9nZ2xlQnRuOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCfmlLbotbfmjIflvJVcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudG9wX2NvbnRfdG9nZ2xlIC50b2dnbGVCdG46YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXFxlMzE2XCc7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudG9wX2NvbnRlbnRfY2xvc2VkIC50b2dnbGVCdG46YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwn5bGV5byA5oyH5byVXCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudG9wX2NvbnRlbnRfY2xvc2VkIC50b2dnbGVCdG46YWZ0ZXJ7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCdcXGUzMTNcJzsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLyrlr7zoiKrph43liLYqLwogICAgICAgICAgICAgICAgLmZvcnVtSW5mb19uYXZfd3JhcCwKICAgICAgICAgICAgICAgIC5zdGFyX25hdl93cmFwLAogICAgICAgICAgICAgICAgLmlob21lX25hdl93cmFwLAogICAgICAgICAgICAgICAgOm5vdCguZm9ydW1fcmFkaW9fYXNpZGUpPi5uYXZfd3JhcCB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogNDdweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3QsCiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXYsCiAgICAgICAgICAgICAgICAuaWhvbWVfbmF2X2xpc3QsCiAgICAgICAgICAgICAgICAubmF2X2xpc3QgewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxleDogMTsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogZmxleDsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXYsCiAgICAgICAgICAgICAgICAubmF2X2xpc3R7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3Q+bGksCiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGksCiAgICAgICAgICAgICAgICAubmF2X2xpc3Q+bGl7CiAgICAgICAgICAgICAgICAJZmxleDogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3Q+bGksCiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGksCiAgICAgICAgICAgICAgICAuaWhvbWVfbmF2X2xpc3Q+bGksCiAgICAgICAgICAgICAgICAubmF2X2xpc3Q+bGksCiAgICAgICAgICAgICAgICAuZm9ydW1JbmZvX25hdl9saXN0PmxpICosCiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGkgKiwKICAgICAgICAgICAgICAgIC5paG9tZV9uYXZfbGlzdD5saSAqLAogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpICp7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3Q+bGkgYSwKICAgICAgICAgICAgICAgIC5zdGFyX2NsYXNzX25hdj5saSAuc3Rhcl9uYXZfaWNvLAogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbiwKICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saSAual90Ym5hdl90YWJfYXsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCWhlaWdodDogNDZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiA0MnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM3NzcgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAwKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNHM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGkgLnN0YXJfbmF2X2ljbyAqLAogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbiAqLAogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hICp7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3Q+bGkuZm9jdXMgYSwKICAgICAgICAgICAgICAgIC5zdGFyX2NsYXNzX25hdj5saS5mb2N1cyAuc3Rhcl9uYXZfaWNvLAogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpLmZvY3VzIC5uYXZfaWNvbiwKICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saS5mb2N1cyAual90Ym5hdl90YWJfYXsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wNikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3Q+bGkgYTpob3ZlciwKICAgICAgICAgICAgICAgIC5zdGFyX2NsYXNzX25hdj5saSAuc3Rhcl9uYXZfaWNvOmhvdmVyLAogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbjpob3ZlciwKICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saSAual90Ym5hdl90YWJfYTpob3ZlcnsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3J1bUluZm9fbmF2X2xpc3Q+bGkgYSwKICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saSAual90Ym5hdl90YWJfYXsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zdGFyX2NsYXNzX25hdj5saSAuc3Rhcl9uYXZfaWNvLAogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbnsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfY2xhc3NfbmF2PmxpIC5zdGFyX25hdl9pY286ZW1wdHk6YWZ0ZXIsCiAgICAgICAgICAgICAgICAuaWhvbWVfbmF2X2xpc3Q+bGkgLm5hdl9pY29uOmVtcHR5OmFmdGVyLAogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hOmVtcHR5OmFmdGVyewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCLnqbrpoblcIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfY2xhc3NfbmF2PmxpIC5zdGFyX25hdl9pY286YmVmb3JlLAogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbjpiZWZvcmUsCiAgICAgICAgICAgICAgICAubmF2X2xpc3Q+bGkgLmpfdGJuYXZfdGFiX2E6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODcxXCI7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE4cHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDNweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saVtkYXRhLXRhYi1tYWluXSAual90Ym5hdl90YWJfYTpiZWZvcmUsCiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGkgLnN0YXJfbmF2X2ljby5zdGFyX25hdl9pY29fdGllOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saSAual90Ym5hdl90YWJfYVtzdGF0cy1kYXRhKj1cInRhYm1haW5cIl06YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMjRkXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGkgLnN0YXJfbmF2X2ljby5zdGFyX25hdl9pY29fcGhvdG86YmVmb3JlLAogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hW3N0YXRzLWRhdGEqPVwidGFiZnJzcGhvdG9nb29kXCJdOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTQxMFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfY2xhc3NfbmF2PmxpIC5zdGFyX25hdl9pY28uc3Rhcl9uYXZfaWNvX2dvb2Q6YmVmb3JlLAogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hW3N0YXRzLWRhdGEqPVwidGFiZ29vZFwiXTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4MzhcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc19uYXY+bGkgLnN0YXJfbmF2X2ljby5zdGFyX25hdl9pY29fdmlkZW86YmVmb3JlLAogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hW3N0YXRzLWRhdGEqPVwidGFidmlkZW9cIl06YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMDRiXCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hW3N0YXRzLWRhdGEqPVwic3RfdmFsdWU9d2FubGVcIl06YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMzMyXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubmF2X2xpc3Q+bGkgLmpfdGJuYXZfdGFiX2FbaHJlZio9XCJ0YWI9Z2FtZVwiXTpiZWZvcmUsCiAgICAgICAgICAgICAgICAubmF2X2xpc3Q+bGkgLmpfdGJuYXZfdGFiX2Fbc3RhdHMtZGF0YSo9XCJ0YWJwbGF5XCJdOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTAyMVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN0YXJfY2xhc3NfbmF2PmxpIC5zdGFyX25hdl9pY28uc3Rhcl9uYXZfaWNvX2dyb3VwOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saSAual90Ym5hdl90YWJfYVtzdGF0cy1kYXRhKj1cInRhYmdyb3VwXCJdOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTdlZlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5uYXZfbGlzdD5saSAual90Ym5hdl90YWJfYVtocmVmKj1cIi9zaG93L3poYW5xaVwiXTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU2MzlcIjsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm5hdl9saXN0PmxpIC5qX3RibmF2X3RhYl9hW2hyZWYqPVwidGFiPXR1YW5cIl06YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlOGNiXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbi5uYXZfbWFpbjpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4OGFcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaWhvbWVfbmF2X2xpc3Q+bGkgLm5hdl9pY29uLm5hdl9tc2c6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlN2Y0XCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbi5uYXZfY29sbGVjdDpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4NjVcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5paG9tZV9uYXZfbGlzdD5saSAubmF2X2ljb24ubmF2X2NvbmNlcm46YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODdkXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaWhvbWVfbmF2X2xpc3Q+bGkgLm5hdl9pY29uLm5hdl9wb3N0OmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTI0ZFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmlob21lX25hdl9saXN0PmxpIC5uYXZfaWNvbi5uYXZfYWNoaWV2ZTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU1NDVcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3Rhcl9jbGFzc190aXB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrluJblrZDmjpLluo/mjInpkq4qLwogICAgICAgICAgICAgICAgLnRocmVhZF9saXN0X29yZGVyIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJdG9wOiBhdXRvOwogICAgICAgICAgICAgICAgCWJvdHRvbTogMDsKICAgICAgICAgICAgICAgIAljdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwOwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAxMnB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNzc3OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAxNnB4OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgOHB4OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiA0cHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMDYpOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb246IGNvbG9yIC40cyBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF9saXN0X29yZGVyOmhvdmVyewogICAgICAgICAgICAgICAgCWNvbG9yOiAjNDQ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF9saXN0X29yZGVyOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4ZmVcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE4cHg7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRfbGlzdF9vcmRlcjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmjInlm57lpI3mjpLluo9cIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrlkKflhoXmkJzntKIqLwogICAgICAgICAgICAgICAgLnN0YXJfbmF2X2J0bnNfd3JhcCwKICAgICAgICAgICAgICAgIC5zZWFyY2hfaW50ZXJuYWxfd3JhcHsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogNDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogNnB4IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTglICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWluLXdpZHRoOiAyMDBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIC8qCSBtYXJnaW4tbGVmdDogMTIlICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfaW50ZXJuYWxfd3JhcC5wdWxsX3JpZ2h0ewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9zZWFyY2hfaW50ZXJuYWxfZm9ybXsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OmZsZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX2ludGVybmFsX2lucHV0ewogICAgICAgICAgICAgICAgCWZsZXg6IDE7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7CiAgICAgICAgICAgICAgICAJb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9pbnRlcm5hbF9wbGFjZWhvbGRlcnsKICAgICAgICAgICAgICAgIAljb2xvcjogZGFya2dyZXkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJdG9wOiAxcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZWZ0OiA4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9pbnRlcm5hbF9idG57CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDMwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5zZWFyY2hfaW50ZXJuYWxfaW5wdXQsCiAgICAgICAgICAgICAgICAuc2VhcmNoX2ludGVybmFsX2J0bnsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLCBib3JkZXItYm90dG9tOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfaW50ZXJuYWxfaW5wdXQ6Zm9jdXN7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAuNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfaW50ZXJuYWxfYnRuOmhvdmVyewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAuMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfaW50ZXJuYWxfYnRuOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5qX3NlYXJjaF9pbnRlcm5hbF9mb3JtOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4YjZcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IC01cHg7CiAgICAgICAgICAgICAgICAJdG9wOiAxM3B4OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHRyYW5zbGF0ZVkoMXB4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q6LS05a2Q5YaF5a656aG15Y+z5L6nKi8KICAgICAgICAgICAgICAgIC5yaWdodF9zZWN0aW9uIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDI0MHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJpZ2h0X3NlY3Rpb24gewogICAgICAgICAgICAgICAgCXdpZHRoOiAyNDBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yaWdodF9zZWN0aW9uID5kaXYgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yaWdodF9zZWN0aW9uID5kaXZbaWRdIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrpppbpobXluJblrZDliJfooajlnZcqLwogICAgICAgICAgICAgICAgLmZvcnVtX2NvbnRlbnR7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNjb250ZXRfd3JhcCwKICAgICAgICAgICAgICAgICNjb250ZW50X3dyYXAgewogICAgICAgICAgICAgICAgCWZsZXg6IDE7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCXdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjYXNpZGUgewogICAgICAgICAgICAgICAgCXdpZHRoOiAxOCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltaW4td2lkdGg6IDI0MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlZ2lvbl9oZWFkZXIsCiAgICAgICAgICAgICAgICAucmVnaW9uX2JyaWdodCA+IC50aXRsZSwKICAgICAgICAgICAgICAgIC5yZWdpb25fYnJpZ2h0ID4gLnRyaXBfdGl0bGUsCiAgICAgICAgICAgICAgICAuYXNpZGVfYWxidW1fZ29vZF90aXRsZSwKICAgICAgICAgICAgICAgIC56eXFfYnJpZ2h0IC5tb2QgLnRsewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjA0KTsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDI4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDE0cHg7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAtMTBweDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzc3NyAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlZ2lvbl90aXRsZSwKICAgICAgICAgICAgICAgIC5yZWdpb25fdGl0bGUgYSwKICAgICAgICAgICAgICAgIC56eXFfbW9kX3RpdGxlLAogICAgICAgICAgICAgICAgLmFzaWRlX2FsYnVtX2dvb2RfdGl0bGUgc3BhbiwKICAgICAgICAgICAgICAgIC5yZWdpb25fYnJpZ2h0ID4gLnRpdGxlIGgxewogICAgICAgICAgICAgICAgCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVnaW9uX2hlYWRlciBhLAogICAgICAgICAgICAgICAgLmFzaWRlX2FsYnVtX2dvb2RfdGl0bGUgYSwKICAgICAgICAgICAgICAgIC56eXFfYnJpZ2h0IC5tb2QgLnRsIGF7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5hc2lkZV9yZWdpb24gewogICAgICAgICAgICAgICAgCWJvcmRlci10b3A6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAucmVnaW9uX2JyaWdodCB7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuenlxX2JyaWdodCAubW9kLAogICAgICAgICAgICAgICAgLmFzaWRlX2FsYnVtX2dvb2RfYnJpZ2h0ewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5hc2lkZV9yZWdpb24sCiAgICAgICAgICAgICAgICAucmVnaW9uX2JyaWdodCwKICAgICAgICAgICAgICAgIC56eXFfYnJpZ2h0IC5tb2QsCiAgICAgICAgICAgICAgICAuYXNpZGVfYWxidW1fZ29vZF9icmlnaHR7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA2KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuYXNpZGVfYWxidW1fZ29vZF90aXRsZT5hW2hyZWZdLAogICAgICAgICAgICAgICAgLnJlZ2lvbl9oZWFkZXIgLmpfb3AgYXsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDAgICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogLjU7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbjogb3BhY2l0eSAuNHMgZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWdpb25faGVhZGVyIC5qX29wewogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmFzaWRlX2FsYnVtX2dvb2RfdGl0bGU+YVtocmVmXTpob3ZlciwKICAgICAgICAgICAgICAgIC5yZWdpb25faGVhZGVyIC5qX29wIGE6aG92ZXJ7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5hc2lkZV9hbGJ1bV9nb29kX3RpdGxlPmFbaHJlZl06YWZ0ZXIsCiAgICAgICAgICAgICAgICAucmVnaW9uX2hlYWRlciAual9vcCBhOmFmdGVyewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXFxlNWQzXCc7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJyA7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlZ2lvbl9oZWFkZXIgLmpfb3AgYS5wX2JhbHZfYnRubWFuYWdlcjphZnRlciwKICAgICAgICAgICAgICAgIC5yZWdpb25faGVhZGVyIC5qX29wIGEual96eXFfbW9kX2VkaXRfZW50cnk6YWZ0ZXJ7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCdcXGU4NjlcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcl9sZXZlbCwKICAgICAgICAgICAgICAgIC5teV9jdXJyZW50X2ZvcnVtewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyX2xldmVsIC50aXRsZSwKICAgICAgICAgICAgICAgIC5teV9jdXJyZW50X2ZvcnVtIC50aXRsZXsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubXlfY3VycmVudF9mb3J1bSAuYmFkZ2UsCiAgICAgICAgICAgICAgICAudXNlcl9sZXZlbCAuYmFkZ2V7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCWhlaWdodDogMjRweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjRweDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IDFweCByZ2JhKDAsMCwwLC4xKSBzb2xpZCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wNCk7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5teV9jdXJyZW50X2ZvcnVtIC5iYWRnZV9pbmRleCwKICAgICAgICAgICAgICAgIC51c2VyX2xldmVsIC5iYWRnZV9pbmRleHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4zKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwOwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAl3aWR0aDogMjRweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcl9sZXZlbCAuYmFkZ2VfbmFtZSwKICAgICAgICAgICAgICAgIC5teV9jdXJyZW50X2ZvcnVtIC5iYWRnZV9uYW1lIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDcycHg7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM0QzRDNEM7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXJfbGV2ZWwgLmV4cCwKICAgICAgICAgICAgICAgIC5teV9jdXJyZW50X2ZvcnVtIC5leHB7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmV4cF9iYXIgewogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDE2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5leHBfYmFyX2N1cnJlbnQgewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmV4cF9udW0gewogICAgICAgICAgICAgICAgCXRvcDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAxNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVnaW9uX2NudDpob3ZlciAuZXhwX251bSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZXhwX2JhciBzcGFuLAogICAgICAgICAgICAgICAgLmV4cF9iYXIgLmV4cF9jdXJyZW50X251bSB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNjb250ZW50X2xlZnRMaXN0LAogICAgICAgICAgICAgICAgZGl2W2lkPVwicGFnZWxldF9mcnMtbGlzdC9wYWdlbGV0L3RocmVhZF9saXN0XCJdLAogICAgICAgICAgICAgICAgI3RocmVhZF9saXN0LAogICAgICAgICAgICAgICAgLmpfdGhyZWFkX2xpc3QsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnRfY29uewogICAgICAgICAgICAgICAgCXdpZHRoOjEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCBsaS50aHJlYWRfdG9wX2xpc3RfZm9sZGVyewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCBsaXsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMDYpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuNHMgZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCBsaTpsYXN0LW9mLXR5cGV7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyouaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQ6aG92ZXIsKi8KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCBsaTpob3ZlcnsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wMikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkX3BpY19icmlnaHQsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnRfY29uIHsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAxMnB4IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgCWFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfbGlfbGVmdCwKICAgICAgICAgICAgICAgIC5qX3RocmVhZGxpc3RfbGlfbGVmdHsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA4JSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1pbi13aWR0aDogNzVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTRweCAwIDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0zcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3JlcF9udW0gewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAljb2xvcjogIzY2NjsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czoxMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfbGlfcmlnaHQsCiAgICAgICAgICAgICAgICAual90aHJlYWRsaXN0X2xpX3JpZ2h0ewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmbGV4OiAxOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF9sensKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgLyoJaGVpZ2h0OjQwcHg75Li76aKY6LS05YiX6KGo55qE5qCH6aKY6auY5bqmKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF9kZXRhaWx7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF9sensKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF9kZXRhaWx7CiAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC50aHJlYWRsaXN0X3RpdGxlLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC50aHJlYWRsaXN0X3RleHR7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZsZXg6IDE7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnRocmVhZGxpc3RfYWJzX29ubHlsaW5lewogICAgICAgICAgICAgICAgCWZsZXg6IDEgMSAxMDAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC50aHJlYWRsaXN0X3RleHR7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC50aHJlYWRsaXN0X3RpdGxlewogICAgICAgICAgICAgICAgCWhlaWdodDogMjRweCFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE3cHghaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweCFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnRocmVhZGxpc3RfdGl0bGUgYS5qX3RoX3RpdCB7CiAgICAgICAgICAgICAgICAJb3JkZXI6IDE7CiAgICAgICAgICAgICAgICAJZmxleDogMCAxIGF1dG87CiAgICAgICAgICAgICAgICAJdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF90aXRsZS50aHJlYWRsaXN0X2ltZ3sKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF90aXRsZS50aHJlYWRsaXN0X2ltZyBpbWd7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRpdGxlQ250IC5saXN0VGhyZWFkVGl0bGUgYSwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGEual90aF90aXQgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjMmQ2NGIzICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBhLmpfdGhfdGl0OmhvdmVyIHsKICAgICAgICAgICAgICAgIAl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRpdGxlQ250IC5saXN0VGhyZWFkVGl0bGUgYTp2aXNpdGVkLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgYS5qX3RoX3RpdDp2aXNpdGVkIHsKICAgICAgICAgICAgICAgIAljb2xvcjogIzU2NmM4NCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC50aHJlYWRsaXN0X2Fic19vbmx5bGluZSwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF9hYnN7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5zZWUtbHp7CiAgICAgICAgICAgICAgICAJb3JkZXI6IDI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDVweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAtMnB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMjUpOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuNHMgZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5zZWUtbHo6aG92ZXJ7CiAgICAgICAgICAgICAgICAJb3JkZXI6IDI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDVweDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjQpOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJfaWNvbl9hdXRob3IsCiAgICAgICAgICAgICAgICAudGJfaWNvbl9hdXRob3JfcmVseXsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDIwcHggICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIwcHggICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmbGV4OiAxOwogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMjsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9pY29uX2F1dGhvciAqLAogICAgICAgICAgICAgICAgLnRiX2ljb25fYXV0aG9yX3JlbHkgKnsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9pY29uX2F1dGhvciwKICAgICAgICAgICAgICAgIC50Yl9pY29uX2F1dGhvcl9yZWx5ewogICAgICAgICAgICAgICAgICAgd2lkdGg6MTY4cHggIWltcG9ydGFudDsvKuS4u+mimOi0tOWIl+ihqOeahOWPkei0tOS6uu+8jOWbnuWkjeS6uuagh+etvuWuveW6piovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RUaXRsZUNudCAubGlzdFVzZXI6YmVmb3JlLAogICAgICAgICAgICAgICAgLmZyc19icmlnaHRfcHJlaWNvbiwKICAgICAgICAgICAgICAgIC50Yl9pY29uX2F1dGhvcjpiZWZvcmUsCiAgICAgICAgICAgICAgICAudGJfaWNvbl9hdXRob3JfcmVseTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiAzMHB4OwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjYmJiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0VGl0bGVDbnQgLmxpc3RVc2VyOmJlZm9yZSwKICAgICAgICAgICAgICAgIC50Yl9pY29uX2F1dGhvcjpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIlxcZTdmZFwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9pY29uX2F1dGhvcl9yZWx5OmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OlwiXFxlMGNhXCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X2JyaWdodCAuaWNvbl9hdXRob3IsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLmljb25fcmVwbHllcnsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9hdXRob3IgLmpfdXNlcl9jYXJkLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYXV0aG9yIC5mcnMtYXV0aG9yLW5hbWUgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAJdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9yZXBseV9kYXRlLAogICAgICAgICAgICAgICAgLmZycy1hdXRob3ItbmFtZSB7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDoyMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfcmVwbHlfZGF0ZXsvKuS4u+mimOi0tOWIl+ihqOavj+S4qui0tOWtkOeahOacgOWQjuWbnuWkjeaXtumXtCovCiAgICAgICAgICAgICAgICAgICB0b3A6IDVweDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OnVuc2V0OwogICAgICAgICAgICAgICAgICAgd2lkdGg6IDQwcHg7CiAgICAgICAgICAgICAgICAgICByaWdodDogMTBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mcnNfYnJpZ2h0X3ByZWljb257CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDA7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZyc19icmlnaHRfcHJlaWNvbj4qewogICAgICAgICAgICAgICAgCW1hcmdpbjogLTJweCAwIDAgN3B4IWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvKi5mcnNfYnJpZ2h0X2ljb25ze+aOp+WItuS4u+mimOi0tOWIl+ihqOeahOeUqOaIt+agh+ivhuS9jee9rgogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3AgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDZweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXRvcDogMnB4OwogICAgICAgICAgICAgICAgfSovCiAgICAgICAgICAgICAgICAvKuW4luWtkOe8qeeVpeWbviovCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnNtYWxsX3dyYXAsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnNtYWxsX2xpc3R7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDI7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLnNtYWxsX3dyYXAgKjpub3QoLnNtYWxsX2xpc3QpLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC5zbWFsbF9saXN0ICp7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZmVlZF9pdGVtIC5sYXJnZV9zdGF0dXMsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLm1lZGlhX2JveHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMjsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiBzb2xpZCAxcHggcmdiYSgwLDAsMCwuMDQpOwogICAgICAgICAgICAgICAgCXBhZGRpbmctYm90dG9tOiAyMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZlZWRfaXRlbSAubGFyZ2VfYm94LAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC5tZWRpYV9kaXNwIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNTBweDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCWxlZnQ6ICAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZmVlZF9pdGVtIC50b29scywKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAudGJfaWNvbl9mYXYsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLm1lZGlhX3BpY19jb250cm9sIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMjBweDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCAycHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZWVlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAwIDEwcHggMTBweDsKICAgICAgICAgICAgICAgIAljb2xvcjogcmdiYSgwLCAwLCAwLCAuMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZmVlZF9pdGVtIC50b29sc19mb290Pi5lbnRlcjpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCfov5vlhaXotLTlrZBcJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZlZWRfaXRlbSAudG9vbHM+YSwKICAgICAgICAgICAgICAgIC5mZWVkX2l0ZW0gLnRvb2xzX2Zvb3Q+LmVudGVyLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC5lbnRlcl9wYl93cmFwcGVyPmEsCiAgICAgICAgICAgICAgICAubWVkaWFfcGljX2NvbnRyb2w+YXsKICAgICAgICAgICAgICAgIAljb2xvcjogcmdiYSgwLCAwLCAwLCAuNikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZmVlZF9pdGVtIC50b29scz5hOmhvdmVyLAogICAgICAgICAgICAgICAgLmZlZWRfaXRlbSAudG9vbHNfZm9vdD4uZW50ZXI6aG92ZXIsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLmVudGVyX3BiX3dyYXBwZXI+YTpob3ZlciwKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbD5hOmhvdmVyewogICAgICAgICAgICAgICAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICAgICAgICAgIAljb2xvcjogcmdiYSgwLCAwLCAwLCAuOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAubGluZSB7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIDEwcHg7CiAgICAgICAgICAgICAgICAJY29sb3I6IHJnYmEoMCwgMCwgMCwgLjIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm1lZGlhX3BpY19jb250cm9sIFtjbGFzc149XCJpY29uX1wiXSwKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCBbY2xhc3MqPVwiIGljb25fXCJdewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZmVlZF9pdGVtIC50b29scz5hOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbD5hOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbD5hOmJlZm9yZXsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWZvbnQtc3R5bGU6IG5vcm1hbDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXdpZHRoOiAyMHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZlZWRfaXRlbSAudG9vbHMgLmZvbGRfYnRuOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAual9yZXRyYWN0OmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTMxOFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZlZWRfaXRlbSAudG9vbHMgLnNjcmVlbl9mdWxsOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAual95cGljOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTU2YlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAual9yb3RhdGlvbl9sZWZ0OmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTQxOVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm1lZGlhX3BpY19jb250cm9sIC5qX3JvdGF0aW9uX3JpZ2h0OmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTQxYVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm1lZGlhX3BpY19jb250cm9sIC5qX3BvcF9tZWRpYTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4OWVcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLm1lZGlhX3BpY19jb250cm9sIC50Yl9pY29uX2ZhdnsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IC0yMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAtMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm1lZGlhX3BpY19jb250cm9sIC50Yl9pY29uX2Zhdi5kb25lewogICAgICAgICAgICAgICAgCWNvbG9yOiAjRkY3QzdDICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubWVkaWFfcGljX2NvbnRyb2wgLnRiX2ljb25fZmF2LmRvbmU6aG92ZXJ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmMjQ5NDkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAudGJfaWNvbl9mYXY6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODdlXCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogLTFweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5tZWRpYV9waWNfY29udHJvbCAudGJfaWNvbl9mYXYuZG9uZTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4N2RcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mZWVkX2l0ZW0gLnRvb2xzX2Zvb3QsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF9icmlnaHQgLmVudGVyX3BiX3dyYXBwZXJ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogYXV0bzsKICAgICAgICAgICAgICAgIAlyaWdodDogMDsKICAgICAgICAgICAgICAgIAlib3R0b206IDIwcHg7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mZWVkX2l0ZW0gLnRvb2xzX2Zvb3Q+LmVudGVyLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfYnJpZ2h0IC5lbnRlcl9wYl93cmFwcGVyPmF7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDJweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNlZWUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAxNXB4IDAgMCAxNXB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmljb25fdGhyZWFkX2hpZGRlbiB7Lyrmipjlj6Dnva7pobbotLQqLwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAl0b3A6IDA7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDA7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgIAl3aWR0aDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMDsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiAyNHB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOwogICAgICAgICAgICAgICAgCWJvcmRlci1sZWZ0OiAyNHB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uOiBib3JkZXIgLjRzIGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaWNvbl90aHJlYWRfaGlkZGVuOmhvdmVyIHsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiAyNHB4IHNvbGlkIHJnYmEoMCwwLDAsLjQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmljb25fdGhyZWFkX2hpZGRlbjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlNWNkXCI7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXRvcDogLTE3cHg7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDFweDsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pY29uX3RvcF9mb2xkZXIgewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlsZWZ0OiAtMjVweDsKICAgICAgICAgICAgICAgIAl0b3A6IDA7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDI0cHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvOwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDEwcHggMCAwIDEwcHg7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogLTJweCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZmVmZWZlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIAl3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMTBweCA2cHg7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMTZweDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNhYWE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaWNvbl90b3BfZm9sZGVyOmhvdmVyIHsKICAgICAgICAgICAgICAgIAljb2xvcjogIzY2NjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pY29uX3RvcF9mb2xkZXI6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5bGV5byA572u6aG2XCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRiX3JpY2hfcG9zdGVyIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMjBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9yaWNoX3Bvc3Rlcl9jb250YWluZXIgewogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjcGItZm9vdGVyLWhlYWRlcjplbXB0eSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrop4bpopHmta7nqpcqLwogICAgICAgICAgICAgICAgI3BvcF92aWRlb3sKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MHZ3ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiA1MHZoICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IGF1dG8haW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSk7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1ib3R0b206IDZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrlj5HluJbnvJbovpHmoYYqLwoKICAgICAgICAgICAgICAgIC50Yl9yaWNoX3Bvc3RlciB7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfYm9keSB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2hlYWQgewogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjhweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfaGVhZF90ZXh0ewogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMDYpOwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzk5OTsKICAgICAgICAgICAgICAgIAlmb250LXdlaWdodDogbm9ybWFsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2hlYWRfdGV4dD5hewogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC13ZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9oZWFkX3RleHQ+YTpsYXN0LW9mLXR5cGV7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfaGVhZF90ZXh0IC5zcGxpdF90ZXh0LAogICAgICAgICAgICAgICAgLnBvc3Rlcl9oZWFkX3RleHQgLnBvc3RfaGVhZF9idG5faWNvbnsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnBvc3Rlcl9oZWFkX3RleHQ+YTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiAyNHB4OwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjYmJiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9oZWFkX3RleHQgLmFkZF90aHJlYWRfYnRuOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OlwiXFxlMjUzXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2hlYWRfdGV4dCAuYWRkX3RocmVhZF9idG5bdGl0bGU9XCLlj5HooajmlrDotLRcIl06YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCJcXGUyNTRcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfaGVhZF90ZXh0IC5hZGRfdm90ZV9idG46YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCJcXGUwMWRcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE4cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2hlYWRfdGV4dCBhLmN1cnsKICAgICAgICAgICAgICAgIAljb2xvcjogIzY2NiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9oZWFkX3RleHQgYS5jdXI6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbG9yOiAjNzc3ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuagh+mimOe8lui+keWfnyovCgogICAgICAgICAgICAgICAgLnRpdGxlX2NvbnRhaW5lciB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1ib3R0b206IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfYm9keSAuZWRpdG9yX3RpdGxlIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDM2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZCwgYm9yZGVyLWJvdHRvbTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2JvZHkgLnRidWlfcGxhY2Vob2xkZXIgewogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMzZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNiYmIgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuagh+mimOWJjee8gCovCgogICAgICAgICAgICAgICAgLnBwcmVmaXgtbGlzdCB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZjhmOGY4OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4yKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00MHB4KTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucHByZWZpeC1saXN0W3N0eWxlKj1cImJsb2NrXCJdIHsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogbm9uZTsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wcHJlZml4LWl0ZW0gewogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2OwogICAgICAgICAgICAgICAgCWN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZGl0b3JfY29udGVudF93cmFwcGVyIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5vbGRfc3R5bGVfd3JhcHBlciB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2JvZHkgLmVkdWktY29udGFpbmVyIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2JvZHkgLmVkdWktYm9keS1jb250YWluZXIgewogICAgICAgICAgICAgICAgCW1pbi1oZWlnaHQ6IDIxNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1ib2R5LWNvbnRhaW5lciAqOjpzZWxlY3Rpb24gewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsLjEyKTsKICAgICAgICAgICAgICAgIAl0ZXh0LXNoYWRvdzogbm9uZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGJfcG9zdGVyX3BsYWNlaG9sZGVyewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDU1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRiX3Bvc3Rlcl9wbGFjZWhvbGRlciBwewogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrnvJbovpHmoYbmjqfku7bln58qLwoKICAgICAgICAgICAgICAgIC5lZHVpLXRvb2xiYXIgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA4KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjEpOwogICAgICAgICAgICAgICAgCWhlaWdodDogNDBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfYm9keSAuZWR1aS1lZGl0b3ItYm9keSAuZWR1aS1ib2R5LWNvbnRhaW5lciB7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2JvZHkgLmVkaXRvcl90aXRsZTpmb2N1cywKICAgICAgICAgICAgICAgIC5wb3N0ZXJfYm9keSAuZWR1aS1lZGl0b3ItYm9keSAuZWR1aS1ib2R5LWNvbnRhaW5lcjpmb2N1cyB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAyKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4yKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktcG9wdXAgewogICAgICAgICAgICAgICAgCXotaW5kZXg6IDkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWJ0bi10b29sYmFyIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDQwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1idG4gewogICAgICAgICAgICAgICAgCWhlaWdodDogNDBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDYwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIAljdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAwKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLXRvb2xiYXIgLmVkdWktYnRuLXJlZCwKICAgICAgICAgICAgICAgIC5lZHVpLXRvb2xiYXIgLmVkdWktYnRuLWJvbGQsCiAgICAgICAgICAgICAgICAuZWR1aS10b29sYmFyIC5lZHVpLWJ0bi1mdWxsc2NyZWVuIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMzZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZsb2F0OiByaWdodCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktdG9vbGJhciAuZWR1aS1idG5bc3R5bGUqPVwibm9uZVwiXSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktYnRuOmhvdmVyIHsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWJ0bjpob3ZlciAuZWR1aS1pY29uIHsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTM4cHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbiB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb246YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ1xcZTIyYVwnOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTk7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MCU7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCU7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ+acquWumuS5iVwnOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgCXRvcDogNTAlOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHRyYW5zbGF0ZVkoMzhweCk7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tZnVsbHNjcmVlbjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlNWQwXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGItdWVkaXRvci1mdWxsc2NyZWVuIC5lZHVpLWljb24tZnVsbHNjcmVlbjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlNWQxXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGItdWVkaXRvci1mdWxsc2NyZWVuIC5lZHVpLWljb24tZnVsbHNjcmVlbjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLov5jljp9cIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tZnVsbHNjcmVlbjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLlhajlsY9cIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tYm9sZDpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMjM4XCI7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMXB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1ib2xkOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuWKoOeyl1wiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1yZWQ6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTIzY1wiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tcmVkOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIue6ouWtl1wiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1wYXlwb3N0OmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyNjNcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tcGF5cG9zdDphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLku5jotLnlj6/op4FcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tbWVkYWw6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTgzOFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1tZWRhbDphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLotLTlkKfnibnmnYNcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWJ0bi1uYW1lLXBvcnRyYWl0IC5lZHVpLWljb24tbWVkYWw6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTI1M1wiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWJ0bi1uYW1lLXBvcnRyYWl0IC5lZHVpLWljb24tbWVkYWw6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5Y+R5biW5rCU5rOhXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLWltYWdlOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyNTFcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24taW1hZ2U6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5Zu+54mHXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLXZpZGVvOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUwMmNcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tdmlkZW86YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6KeG6aKRXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLW11c2ljOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU0MDVcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tbXVzaWM6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6Z+z5LmQXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLWZvcm11bGE6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTI0YVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1mb3JtdWxhOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuaVsOWtpuWFrOW8j1wiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1lbW90aW9uOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyNGVcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tZW1vdGlvbjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLooajmg4VcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tc2NyYXdsOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUzYjdcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tc2NyYXdsOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIua2gum4plwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktaWNvbi1hdHRhY2htZW50OmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyYmNcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI2cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLWF0dGFjaG1lbnQ6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6ZmE5Lu2XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLXF1aWNrLXJlcGx5OmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU1MzlcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tcXVpY2stcmVwbHk6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5b+r6YCf5Zue5biWXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1pY29uLXRvcGljOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCcjXCc7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IGZhbnRhc3k7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0wLjVweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5lZHVpLWljb24tdG9waWM6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6K+d6aKYXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuS7mOi0ueWPr+ingee8lui+keahhiovCgogICAgICAgICAgICAgICAgLnBvc3Rlcl9ib2R5IC5wYXlwb3N0LWZlZS1lZGl0b3IgewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBheXBvc3RfdGRvdV9pcHRfYXJlYSB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDI2MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDM2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9wYXlwb3N0X3Rkb3VfaXB0IHsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA3MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9wYXlwb3N0X3Rkb3VfaXB0OmZvY3VzIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC44KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBheXBvc3RfZWRpdG9yX2Nsb3NlX3dyYXAgewogICAgICAgICAgICAgICAgCWhlaWdodDogMzZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wYXlwb3N0X2VkaXRvcl9jbG9zZSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDM2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDM2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAk7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGF5cG9zdF9lZGl0b3JfY2xvc2U6aG92ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjRjQ0MzM2ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGF5cG9zdF9lZGl0b3JfY2xvc2U6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTVjOVwiOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MCU7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCU7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGF5cG9zdC1mZWUtZWRpdG9yIC5lZHVpLWJ0bi10b29sYmFyIHsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDI2MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuetvuWQjeaho+mAieaLqeWfnyovCiAgICAgICAgICAgICAgICAubHpsX3BhbmVsX2Vycm9yLAogICAgICAgICAgICAgICAgLnBvc3Rlcl9lcnJvcnsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDgpOwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDAgMCAxMHB4IDEwcHg7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9wYW5lbF9lcnJvcjplbXB0eSwKICAgICAgICAgICAgICAgIC5wb3N0ZXJfZXJyb3I6ZW1wdHl7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkaXRvcl9jb250ZW50X3dyYXBwZXIgLnBvc3Rlcl9lcnJvcnsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX3NoYXJlLAogICAgICAgICAgICAgICAgLnBvc3Rlcl9zaWduYXR1cmUgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDQwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wOCk7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAwIDEwcHggMTBweDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzk5OSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9oZWFkX3N1cnZlaWxsYW5jZSBhW2hyZWZdLAogICAgICAgICAgICAgICAgLnBvc3Rlcl9zaWduYXR1cmUgYVtocmVmXSB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfaGVhZF9zdXJ2ZWlsbGFuY2UgYVtocmVmXTpob3ZlciwKICAgICAgICAgICAgICAgIC5wb3N0ZXJfc2lnbmF0dXJlIGFbaHJlZl06aG92ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX3NpZ25hdHVyZVtkaXNwbGF5Kj1cIm5vbmVcIl0gewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfc2hhcmUgPiBsYWJlbCwKICAgICAgICAgICAgICAgIC5wb3N0ZXJfc2lnbmF0dXJlID4gbGFiZWwgewogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDExcHggMDsKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMThweDsKICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9zaGFyZSBpbnB1dCwKICAgICAgICAgICAgICAgIC5wb3N0ZXJfc2lnbmF0dXJlIGlucHV0IHsKICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogLTFweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q57yW6L6R5qGG5bqV6YOo6Z2i5p2/Ki8KCiAgICAgICAgICAgICAgICAuZWRpdG9yX2JvdHRvbV9wYW5lbCB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9ib2R5IC5wb3N0ZXJfc3VibWl0IHsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDI4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlci1yaWdodC1hcmVhIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogNjAwcHg7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9ib2R5IC5zYXZlLXRvLXF1aWNrLXJlcGx5LWJ0biB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDE0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDI4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9ib2R5IC5zYXZlLXRvLXF1aWNrLXJlcGx5LWJ0bjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMTQ5XCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAtNnB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNhdmUtdG8tcXVpY2stcmVwbHktYnRuICogewogICAgICAgICAgICAgICAgCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucG9zdGVyX2RyYWZ0X3N0YXR1cyB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDE4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9mbG9hdGluZyA+IC5wb3N0ZXJfZHJhZnRfc3RhdHVzIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogNXB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAtMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuWPkeW4luaIkOWKn+aPkOekuiovCiAgICAgICAgICAgICAgICAudGJfcG9zdGVyX2luZm8gewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwtNTAlKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMnB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDhweCAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJfcG9zdGVyX2luZm8gKnsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rlcl9zdWNjZXNzX2NvbnRlbnQgewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0ZXJfc3VjY2Vzc19jb250ZW50ID4gKiB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3Rfc3VjY2Vzc19leHAgewogICAgICAgICAgICAgICAgCXdpZHRoOiA0OHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrmkJzntKLmoI8qLwoKICAgICAgICAgICAgICAgIC5oZWFkZXJfZGl2aWRlcnsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX2Zvcm0gZm9ybXsKICAgICAgICAgICAgICAgIAltYXJnaW46IDA7CiAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMHB4IWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuc2VhcmNoX2JyaWdodHsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgYXV0bzsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5zZWFyY2hfdG9wLAogICAgICAgICAgICAgICAgLnNlYXJjaF9tYWluX3dyYXB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX3RvcHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX21haW4sCiAgICAgICAgICAgICAgICAuc2VhcmNoX2Zvcm17CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9mb3JtIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF90b3A6YmVmb3JlLAogICAgICAgICAgICAgICAgLnNlYXJjaF9sb2dvLAogICAgICAgICAgICAgICAgI3NlYXJjaF9sb2dvX3NtYWxsIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDYwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDMwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAzNnB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAgMjhweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJY29sb3I6IHJnYmEoMCwwLDAsLjIpOwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF90b3A6aG92ZXI6YmVmb3JlCiAgICAgICAgICAgICAgICAuc2VhcmNoX2xvZ286aG92ZXIsCiAgICAgICAgICAgICAgICAjc2VhcmNoX2xvZ29fc21hbGw6aG92ZXIgewogICAgICAgICAgICAgICAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICAgICAgICAgIAljb2xvcjogcmdiYSgwLDAsMCwuNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX3RvcDpiZWZvcmUsCiAgICAgICAgICAgICAgICAuc2VhcmNoX2xvZ286YmVmb3JlLAogICAgICAgICAgICAgICAgI3NlYXJjaF9sb2dvX3NtYWxsOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU5MWRcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9mb3JtICNzZWFyY2hfbG9nb19zbWFsbHsKICAgICAgICAgICAgICAgIAl2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX2xvZ28rI3NlYXJjaF9sb2dvX3NtYWxsewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX21haW5fZml4ZWQgI3NlYXJjaF9sb2dvX3NtYWxsewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMzBweDsKICAgICAgICAgICAgICAgIAl2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI3RiX2hlYWRlcl9zZWFyY2hfZm9ybXsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgCWZsZXg6IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnNlYXJjaF9pcHQgewogICAgICAgICAgICAgICAgCWZsZXg6IDE7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZCwgYm9yZGVyLWJvdHRvbTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX2lwdDpmb2N1cyB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfYnRuX3dyYXB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjowICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX25hdj5hLAogICAgICAgICAgICAgICAgLnNlYXJjaF9idG4sCiAgICAgICAgICAgICAgICAuc2VuaW9yLXNlYXJjaC1saW5rewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4ICAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwOwogICAgICAgICAgICAgICAgCSBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItbGVmdDogMnB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJveC1zaGFkb3csIGJhY2tncm91bmQsIGhlaWdodCwgbWFyZ2luLXRvcCwgY29sb3I7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBub3JtYWwgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfbmF2PmE6aG92ZXIsCiAgICAgICAgICAgICAgICAuc2VhcmNoX2J0bjpob3ZlciwKICAgICAgICAgICAgICAgIC5zZW5pb3Itc2VhcmNoLWxpbms6aG92ZXJ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogLTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2IWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wNikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfbmF2PmE6YWN0aXZlLAogICAgICAgICAgICAgICAgLnNlYXJjaF9idG46YWN0aXZlLAogICAgICAgICAgICAgICAgLnNlbmlvci1zZWFyY2gtbGluazphY3RpdmV7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfbmF2PmE6Zmlyc3Qtb2YtdHlwZSwKICAgICAgICAgICAgICAgIC5zZWFyY2hfYnRuX2VudGVyX2JhewogICAgICAgICAgICAgICAgCWJvcmRlci1sZWZ0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9zZWFyY2hfcG9zdCB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjc2VhcmNoX2JhaWR1X3Byb21vdGUgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc190b29scyB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9uYXYgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAJZmxleDogMTsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAyMHB4IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IC0yMHB4IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfbmF2ICp7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9uYXY+YXsKICAgICAgICAgICAgICAgIAlmbGV4OiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9sb2dvOmhvdmVyKy5oZWFkX3JpZ2h0X3JlZ2lvbiAuc2VhcmNoX3RvcCwKICAgICAgICAgICAgICAgIC5zZWFyY2hfdG9wOmhvdmVyIC5zZWFyY2hfbmF2ewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAJLyrkuovku7blu7bov5/vvIzpmY3kvY7or6/mk43kvZznjocqLwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1uYW1lOiBldmVudG9uX2R1cmF0aW9uOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1kdXJhdGlvbjogLjhzOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfdG9wOmhvdmVyKy5zZWFyY2hfbWFpbl93cmFwewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX25hdiwKICAgICAgICAgICAgICAgIC5zZWFyY2hfbWFpbl93cmFwewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5zZWFyY2hfbWFpbl9maXhlZCB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDhweCAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogMDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9tYWluX2ZpeGVkOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJEZXNpZ24gYnkgTWF2ZXJpY2tcIjsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzOXB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiA2MHB4OwogICAgICAgICAgICAgICAgCXRvcDogNDZweDsKICAgICAgICAgICAgICAgIAlyaWdodDogMjVweDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDA7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwIDAgNDBweCA0MHB4OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksIDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zZWFyY2hfbWFpbl9maXhlZCAuc2VhcmNoX2J0bl93cmFwKy5zZWFyY2hfYnRuX3dyYXB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiAwcHggIWltcG9ydGFudDsvKuiuqeWQjumdoueahOmrmOe6p+aQnOe0ouaMiemSruWPr+S7pee0p+i0tOWJjemdoueahOaMiemSriovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VhcmNoX21haW5fZml4ZWQgLnNlbmlvci1zZWFyY2gtbGlua3sKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Oy8q5Y+W5raI6ZqQ6JePKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5pCc57Si5o6o6I2Q5rWu5bGCKi8KCiAgICAgICAgICAgICAgICAuc3VnZ2VzdGlvbiB7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDFweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgNHB4IDhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE2KTsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAJbWluLWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNDBweCk7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlYXJjaF9tYWluOm5vdCguc2VhcmNoX21haW5fZml4ZWQpIC5zdWdnZXN0aW9uewogICAgICAgICAgICAgICAgCXRvcDogMjhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IDYwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zdWdnZXN0aW9uOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLovpPlhaXkvaDopoHmkJzntKLnmoTotLTlkKfvvIzmraTlpITlsIbkuLrkvaDmj5DkvpvlgJnpgInnu5PmnpxcIjsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MCU7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCU7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNiYmI7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zdWdnZXN0aW9uW3N0eWxlKj1cImJsb2NrXCJdIHsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTpub25lOwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnN1Z2dlc3Rpb25fbGlzdCB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgICAgIAl6LWluZGV4OiAxOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q55So5oi36Z2i5p2/Ki8KICAgICAgICAgICAgICAgIC51c2VyYmFyIHsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctcmlnaHQ6IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyYmEgKiB7CiAgICAgICAgICAgICAgICAJYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXJiYXI+dWwgewogICAgICAgICAgICAgICAgCW92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxMHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAlwZXJzcGVjdGl2ZTogODAwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saSB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtLW9yaWdpbjogMTAwJSA1MCU7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IDFzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saSwKICAgICAgICAgICAgICAgIC51c2VyYmFyPnVsPmxpICogewogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saTpob3Zlcn5saSB7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwcHgpIHJvdGF0ZVkoLTkwZGVnKSB0cmFuc2xhdGVaKC02MHB4KTsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXJiYXI+dWw+bGkudV93YWxsZXQ6aG92ZXJ+bGksCiAgICAgICAgICAgICAgICAudXNlcmJhcj51bD5saS51X3RibWFsbDpob3Zlcn5saSwKICAgICAgICAgICAgICAgIC51c2VyYmFyPnVsPmxpLnVfaGVybWVzOmhvdmVyfmxpLAogICAgICAgICAgICAgICAgLnVzZXJiYXI+dWw+bGkudV9sb2dpbjpob3Zlcn5saSwKICAgICAgICAgICAgICAgIC51c2VyYmFyPnVsPmxpLnVfcmVnOmhvdmVyfmxpIHsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X21lbnVfaXRlbSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA1MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDUwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSwgMCAycHggOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBib3gtc2hhZG93LCBjb2xvciwgYmFja2dyb3VuZDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X21lbnVfaXRlbS51X21lbnVfaG92ZXIsCiAgICAgICAgICAgICAgICAudV9tZW51X2l0ZW06aG92ZXIgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDJweCAxNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJvZHk+LnVzZXJiYXI+dWw+bGk+YSwKICAgICAgICAgICAgICAgIC51X21lbnVfd3JhcCwKICAgICAgICAgICAgICAgIC51X21lbnVfaXRlbT5hIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA1MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDUwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDg3OUJEICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJvZHk+LnVzZXJiYXI+dWw+bGk+YSwKICAgICAgICAgICAgICAgIC51X2hlcm1lcz4udV9tZW51X2l0ZW0+YSB7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAxOHB4OwogICAgICAgICAgICAgICAgCWxldHRlci1zcGFjaW5nOiAycHg7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDJweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXRvcDogN3B4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2hlcm1lcyBhLAogICAgICAgICAgICAgICAgLnVfbG9naW4gYSwKICAgICAgICAgICAgICAgIC51X3JlZyBhIHsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiA1MHB4OwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBib2R5Pi51c2VyYmFyPnVsPi51X2hlcm1lcz5hLAogICAgICAgICAgICAgICAgYm9keT4udXNlcmJhcj51bD4udV9sb2dpbj5hLAogICAgICAgICAgICAgICAgYm9keT4udXNlcmJhcj51bD4udV9yZWc+YSB7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSwgMCAycHggOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJvZHk+LnVzZXJiYXI+dWw+LnVfbG9naW4+YSwKICAgICAgICAgICAgICAgIGJvZHk+LnVzZXJiYXI+dWw+LnVfcmVnPmEgewogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwOwogICAgICAgICAgICAgICAgCWxldHRlci1zcGFjaW5nOiAwOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzRweDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpLCAwIDJweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfaGVybWVzIGE6aG92ZXIsCiAgICAgICAgICAgICAgICAudV9sb2dpbiBhOmhvdmVyLAogICAgICAgICAgICAgICAgLnVfcmVnIGE6aG92ZXIgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0Mjg1RjQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X21lbnVfaG92ZXI6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X25ld3Nfd3JhcCBzcGFuIHsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQ4NzlCRCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMnB4IDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogLTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSwgMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2RkbCB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDM4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X21lbnVfaG92ZXJ+LnVfZGRsLAogICAgICAgICAgICAgICAgbGk6aG92ZXI+LnVfZGRsIHsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2Nvbl90b3AgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfdGl0IHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiB1bCB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIHVsLnN5c19ub3RpZnlfbGFzdCB7CiAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2RkbF9jb24gbGkgYSwjdV9ub3RpZnlfaXRlbSBsaSBhLHVsLnN5c19ub3RpZnlfbGFzdCBsaSBhey8q6Kej5Yaz5Y+z5LiK6KeS55qE5rWu5Yqo5oyJ6ZKu5paH5a2X6LaF5Ye65oyJ6ZKu6Zeu6aKYKi8KICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vcm1hbCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC51X2RkbF9jb24gbGkgewogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MHB4KSByb3RhdGVZKDkwZGVnKSB0cmFuc2xhdGVaKC02MHB4KTsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgNTAlOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaTpudGgtb2YtdHlwZSgxKSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogMHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpOm50aC1vZi10eXBlKDIpIHsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWRlbGF5OiAuMDVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaTpudGgtb2YtdHlwZSgzKSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogLjFzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaTpudGgtb2YtdHlwZSg0KSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogLjE1czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2RkbF9jb24gbGk6bnRoLW9mLXR5cGUoNSkgewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZGVsYXk6IC4yczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2RkbF9jb24gbGk6bnRoLW9mLXR5cGUoNikgewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZGVsYXk6IC4yNXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpOm50aC1vZi10eXBlKDcpIHsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWRlbGF5OiAuM3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpOm50aC1vZi10eXBlKDgpIHsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWRlbGF5OiAuMzVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaTpudGgtb2YtdHlwZSg5KSB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogLjRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNhdGVnb3J5X2l0ZW1fbGFzdCB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kZWxheTogLjNzICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9tZW51X2hvdmVyfi51X2RkbCAudV9kZGxfY29uIGxpLAogICAgICAgICAgICAgICAgbGk6aG92ZXI+LnVfZGRsIC51X2RkbF9jb24gbGkgewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiBub25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaSBhIHsKICAgICAgICAgICAgICAgIAljb2xvcjogIzk5OSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDUwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDUwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEyLjVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxldHRlci1zcGFjaW5nOiAycHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE5LjVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlcjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgICAgICAgICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDUwcHg7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksIDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogYm94LXNoYWRvdywgY29sb3IsIGJhY2tncm91bmQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSk7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zeXNfbm90aWZ5IGxpIGEgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpIGE6aG92ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQyODVGNCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAycHggMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9ub3RpdHlfYmQgLmNhdGVnb3J5X2l0ZW0gLnVucmVhZF9udW0sCiAgICAgICAgICAgICAgICAudV9ub3RpdHlfYmQgLmNhdGVnb3J5X2l0ZW0gLnVucmVhZC1udW17CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDEycHg7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDEycHggMCAwIDEycHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMnB4IDA7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiA2cHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1yaWdodDogNHB4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAl0b3A6IDUwJTsKICAgICAgICAgICAgICAgIAlsZWZ0OiAxcHg7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IGF1dG87CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMCUsIC01MCUpOwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksIDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc3lzX25vdGlmeV9sYXN0IC51bnJlYWQtbnVtLAogICAgICAgICAgICAgICAgLnN5c19ub3RpZnlfbGFzdCAudW5yZWFkX251bSB7CiAgICAgICAgICAgICAgLyoJbGVmdDogMjVweCAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpIGE6aG92ZXIgLnVucmVhZC1udW0sCiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpIGE6aG92ZXIgLnVucmVhZF9udW0gewogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0Mjg1RjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpLnVfbG9nb3V0IGEgewogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpLnVfbG9nb3V0IGE6aG92ZXIgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNGNDQzMzYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2RkbF9jb24gbGkgYVtkYXRhLXR5cGU9XCJhdG1lXCJdLAogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaSBhW2RhdGEtdHlwZT1cImZyaWVuZGFwcGx5XCJdLAogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaSBhW2RhdGEtdHlwZT1cImZhbnNcIl0gewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaSBhW2RhdGEtdHlwZV06YmVmb3JlIHsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEyLjVweDsKICAgICAgICAgICAgICAgIAlsZXR0ZXItc3BhY2luZzogMnB4OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAycHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE5LjVweDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uIGxpIGFbZGF0YS10eXBlPVwiYXRtZVwiXTpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5p+l55yLQOaIkVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfZGRsX2NvbiBsaSBhW2RhdGEtdHlwZT1cImZyaWVuZGFwcGx5XCJdOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmlrDnmoTlpb3lj4tcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2RkbF9jb24gbGkgYVtkYXRhLXR5cGU9XCJmYW5zXCJdOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmlrDnmoTnsonkuJ1cIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X3VzZXJuYW1lX3dyYXAgPiogewogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV91c2VybmFtZV9hdmF0YXIgewogICAgICAgICAgICAgICAgCXdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA1MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl6LWluZGV4OiAxOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X3VzZXJuYW1lX3RpdGxlLAogICAgICAgICAgICAgICAgLnVfbWVudV93cmFwOmFmdGVyIHsKICAgICAgICAgICAgICAgIAktbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogICAgICAgICAgICAgICAgCS13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDI7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI1cHg7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MCU7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCU7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuNikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfdXNlcm5hbWVfdGl0bGV7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9zZXR0aW5nX3dyYXA6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6K6+572uJuacjeWKoVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfd2FsbGV0X3dyYXA6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiVOixhui0puWNlVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfbmV3c193cmFwOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIua2iOaBr+mAmuefpVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfdGJtYWxsX3dyYXA6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiVOixhuWVhuWfjlwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfdXNlcm5hbWVfdGl0bGU6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X21lbnVfaG92ZXIgLnVfdXNlcm5hbWVfdGl0bGUsCiAgICAgICAgICAgICAgICAudV9tZW51X2l0ZW06aG92ZXIgLnVfdXNlcm5hbWVfdGl0bGUsCiAgICAgICAgICAgICAgICAudV9tZW51X2hvdmVyIC51X21lbnVfd3JhcDphZnRlciwKICAgICAgICAgICAgICAgIC51X21lbnVfaXRlbTpob3ZlciAudV9tZW51X3dyYXA6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY2F0ZWdvcnlfaXRlbSB7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9kZGxfY29uewogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X21lbnVfaXRlbT5hewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyYmFyIGksCiAgICAgICAgICAgICAgICAudV9kZGxfYXJyb3csCiAgICAgICAgICAgICAgICAudV9tZW51X2l0ZW0gLmktYXJyb3ctZG93bnsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9tZW51X2l0ZW0+YTpiZWZvcmUgewogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAzMHB4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlsZWZ0OiA1MCU7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCU7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV91c2VybmFtZV93cmFwOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU3ZmRcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDM2cHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogLTJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X3dhbGxldF93cmFwOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4NTBcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI4cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9uZXdzX3dyYXA6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTdmNFwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMzJweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAtMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVfdGJtYWxsX3dyYXA6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZThjY1wiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjhweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X2FwcF93cmFwOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUzMjRcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51X3NldHRpbmdfd3JhcDpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlOGI4XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudV9tZW1iZXJfd3JhcDpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUxYWNcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51aV9idWJibGVfY29udGVudCB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDdweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksIDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxldHRlci1zcGFjaW5nOiAxcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudWlfYnViYmxlX3VwIHsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwJSwgLTEwMCUpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudWlfYnViYmxlX2Rvd24gewogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDAlLCA1MCUpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm90dG9tOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudWlfYnViYmxlX2NvbnRlbnQgKiB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51aV90cmlhbmdsZSB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogNnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1sZWZ0OiA4cHggc29saWQgIzQ4NzlCRDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudWlfdHJpYW5nbGVfdXAgewogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTAwJSk7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogLTEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3R0b206IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51aV90cmlhbmdsZV9kb3duIHsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVpX2J1YmJsZV93cmFwIC5jbG9zZV9tc2dfdGlwLAogICAgICAgICAgICAgICAgLnVpX2J1YmJsZV9jbG9zZWQgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51aV9idWJibGVfd3JhcCAuY2xvc2VfbXNnX3RpcDpiZWZvcmUsCiAgICAgICAgICAgICAgICAudWlfYnViYmxlX2Nsb3NlZDpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiWFwiOwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KSBzY2FsZVkoLjgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI2NvbV91c2VyYmFyX21lc3NhZ2UudWlfYnViYmxlX3dyYXAgewogICAgICAgICAgICAgICAgCXotaW5kZXg6IDEwMDA0OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA5MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNjb21fdXNlcmJhcl9tZXNzYWdlIC51aV9idWJibGVfdXAgewogICAgICAgICAgICAgICAgCXRvcDogNDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjNDg3OUJEICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjY29tX3VzZXJiYXJfbWVzc2FnZSAudWlfdHJpYW5nbGVfdXAgewogICAgICAgICAgICAgICAgCXRvcDogNDhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKuW4luWtkOWGhemhtSovCgogICAgICAgICAgICAgICAgLnBiX2NvbnRlbnQgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmxlZnRfc2VjdGlvbiB7CiAgICAgICAgICAgICAgICAJZmxleDogMTsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmxfcG9zdF9icmlnaHQgewogICAgICAgICAgICAgICAgCS8q5qW85bGCKi8KICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIAlmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgICAgICAgICAvKiAgY29sb3I6IzAwMDsqLwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sX3Bvc3RfYnJpZ2h0Lm5vYm9yZGVyX2JvdHRvbSwKICAgICAgICAgICAgICAgIC5sX3Bvc3RfYnJpZ2h0Omxhc3Qtb2YtdHlwZXsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX2F1dGhvciwKICAgICAgICAgICAgICAgIC5kX2F1dGhvcl9hbm9ueW0gewogICAgICAgICAgICAgICAgCS8q5qW85bGC5L2c6ICF5qCPKi8KICAgICAgICAgICAgICAgIAl3aWR0aDogMTgwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAyMHB4IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAvKiAgIGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZjsqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLl9fdGllYmFfYmxvY2tlZF9fLmxfcG9zdDo6YmVmb3JlIHsKICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor6XmpbzlsYLlt7LooqvlsY/olL0nOwogICAgICAgICAgICAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzNXB4OwogICAgICAgICAgICAgIC8qICAgdGV4dC1hbGlnbjogY2VudGVyOyovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubF9wb3N0X2JyaWdodDpiZWZvcmUgewogICAgICAgICAgICAgICAgCS8q5L2c6ICF5bGC6IOM5pmvKi8KCiAgICAgICAgICAgICAgICAJY29udGVudDogXCJEZXNpZ24gYnkgTWF2ZXJpY2tcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDA7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTgwcHg7CiAgICAgICAgICAgICAgICAvKgliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wMSk7Ki8KICAgICAgICAgICAgICAgIAlib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKualvOS4u+agh+ivhiovCgogICAgICAgICAgICAgICAgLmxvdXpodWJpYW9zaGlfd3JhcCB7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sb3V6aHViaWFvc2hpIHsKICAgICAgICAgICAgICAvKgl0b3A6IC02cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDE7Ki8KICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6dXJsKC8vdGIyLmJkc3RhdGljLmNvbS90Yi9zdGF0aWMtdXNlci93aWRnZXQvcGJfYXV0aG9yL2ltYWdlcy9sb3V6aHVfYjc3ZGI0OS5wbmcpIG5vLXJlcGVhdCAtMHB4IDA7CiAgICAgICAgICAgICAgLyoJd2lkdGg6IDMwcHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzMHB4OyovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKi5sb3V6aHViaWFvc2hpIGEgewogICAgICAgICAgICAgICAgCXdpZHRoOiAzMHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIAljb2xvcjogcmdiYSgwLCAwLCAwLCAuMykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sb3V6aHViaWFvc2hpIGE6aG92ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiByZ2JhKDAsIDAsIDAsIC40KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmxvdXpodWJpYW9zaGkgYTpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODUzXCI7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI4cHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgIC5sb3V6aHViaWFvc2hpX3dyYXAgLnVpX2J1YmJsZV91cCB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDM4cHg7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMCUpIHRyYW5zbGF0ZVkoLTZweCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sb3V6aHViaWFvc2hpX3dyYXAgLnVpX3RyaWFuZ2xlX3VwIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMzBweDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHNjYWxlWCgtMSkgdHJhbnNsYXRlWSgtMTAwJSkgdHJhbnNsYXRlWSgtNHB4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5L2c6ICF5bGC5aS05YOP5Z+fKi8KCiAgICAgICAgICAgICAgICAucF9hdXRob3JfZmFjZSB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJveC1zaGFkb3c7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfYXV0aG9yX2ZhY2U6aG92ZXIgewogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksIDAgNHB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF9hdXRob3JfZmFjZSBpbWcgewogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5L2c6ICF5bGCSUTln58qLwoKICAgICAgICAgICAgICAgIC5kX2F1dGhvciAuZF9uYW1lIHsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5L2c6ICF5bGC5Y2w6K6w5Z+fKi8KCiAgICAgICAgICAgICAgICAuZF9hdXRob3IgLmRfcGJfaWNvbnMgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjIpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiAxcHggc29saWQgI2VlZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrkvZzogIXlsYLlpLTooZTln58qLwoKICAgICAgICAgICAgICAgIC5kX2JhZGdlX2JyaWdodCB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAxNHB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJveC1zaGFkb3c7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmRfYmFkZ2VfYnJpZ2h0W2NsYXNzKj1cImRfYmFkZ2VfYmF3dVwiXSB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQ4NzlCRCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9iYWRnZV9icmlnaHQ6aG92ZXIgewogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksIDAgNHB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9iYWRnZV9icmlnaHQ6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODY2XCI7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDM2cHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXJpZ2h0OiA2cHg7CiAgICAgICAgICAgICAgICAJdG9wOiAtNHB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX2JhZGdlX3RpdGxlIHsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA3MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX2JhZGdlX3RpdGxlX2Jhd3UgewogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiA4cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9iYWRnZV9icmlnaHQgLmRfYmFkZ2VfbHYgewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAl0b3A6IC0ycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDEyLjVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwOwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAl3aWR0aDogMjRweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9hdXRob3IgLmRfcGJfaWNvbnMgLmljb25fc2FwYXJhdGVyIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9wb3N0X2NvbnRlbnRfbWFpbiB7CiAgICAgICAgICAgICAgICAJLyrmpbzlsYLlj7PmoI8qLwogICAgICAgICAgICAgICAgCWZsZXg6IDE7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAvKgliYWNrZ3JvdW5kOiBpbmhlcml0ICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrmpbzlsYLlhoXlrrnln58qLwoKICAgICAgICAgICAgICAgIC5wX2NvbnRlbnQgewogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5IHsKICAgICAgICAgICAgICAgIAkvKualvOWxguS4i+aWueahhuaetiovCgogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHk6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXCI7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogdGFibGU7CiAgICAgICAgICAgICAgICAJY2xlYXI6IGJvdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVwbGFjZV90aXB7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsLjYpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXRvcDogN3B4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAJdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb246IGJhY2tncm91bmQgLjRzIGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVwbGFjZV90aXA6aG92ZXJ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwuNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZXBsYWNlX3RpcDpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU1Y2ZcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjhweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZXBsYWNlX3RpcCAudHh0IHsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZXBsYWNlX3RpcCAuZXhwYW5kLAogICAgICAgICAgICAgICAgLnJlcGxhY2VfdGlwIC5pY29uLWV4cGFuZHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mb3JiaWQtc3BlZWNoLWJhbm5lcnsKICAgICAgICAgICAgICAgIAkvKuemgeiogHRpcCovCiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiA4cHggMTJweCA4cHggMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKualvOWxguS/oeaBr+WfnyovCgogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHlfdGFpbCB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDEwcHggMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IHJpZ2h0OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgIC5wb3N0LXRhaWwtd3JhcCB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgd2lkdGg6IGF1dG8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgPiAqLAogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHlfdGFpbCA+ICogPiAqIHsKICAgICAgICAgICAgICAgIAlmbG9hdDogbGVmdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBvc3QtdGFpbC13cmFwID4gKiwKICAgICAgICAgICAgICAgIC5wX210YWlsID4gKiB7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV9yZXBseV90YWlsID4gKjpub3QoLnBfcmVwbHkpIHsKICAgICAgICAgICAgICAgIAkvKualvOWxguS/oeaBryovCgogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA0KTsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyOHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgKiB7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgYVtocmVmXTpob3Zlcjpub3QoLnRhaWwtaW5mbyksCiAgICAgICAgICAgICAgICAucF9yZXBseTpob3ZlciB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0LXRhaWwtd3JhcCB7CiAgICAgICAgICAgICAgICAJLyrmtojnga3liIblibLnur8qLwoKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0LXRhaWwtd3JhcCA+ICogewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfbXRhaWwgPiBsaSB7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF9tdGFpbCA+IGxpID4qIHsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgYSB7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgPiAucHJvcHNfYXBwcmFpc2Vfd3JhcCB7CiAgICAgICAgICAgICAgICAJLyrmpbzlsYLkv6Hmga/lj7PkvqflnIbop5IqLwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAxNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAl3aWR0aDogYXV0bzsKICAgICAgICAgICAgICAgIAltaW4td2lkdGg6IDE2cHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAxNnB4IDE2cHggMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX2piX2VsZSB7CiAgICAgICAgICAgICAgICAJLyrkuL7miqUqLwoKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDQ1cHg7CiAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTNweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb21wbGFpbnR7CiAgICAgICAgICAgICAgICAgICB0b3A6IDZweDsKICAgICAgICAgICAgICAgICAgIHdpZHRoOjBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX2piX2VsZTpvbmx5LWNoaWxkIHsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX2piX2VsZSAucGJfbGlzdF90cmlhbmdsZV9kb3duIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKualvOWxguWIoOalvOaMiemSruagt+W8jyovCiAgICAgICAgICAgICAgICAual9qYl9lbGUgPiBhOm5vdCgucG9zdF9kZWxfaHJlZikgewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfamIgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZToxMHB4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIAl3aWR0aDogYXV0bzsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDIycHg7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDRweDsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAuNjsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC40czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qLmx6bF9qYltzdHlsZSo9XCJub25lXCJdIHsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgfSovCiAgICAgICAgICAgICAgICAvKualvOWxguWIoOalvOaMiemSruagt+W8jyovCiAgICAgICAgICAgICAgICAucF9wb3N0X2RlbF9teSB7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5LiA5aSn5aCG5qW85Lit5qW85Yig5qW85oyJ6ZKu5qC35byPKi8KICAgICAgICAgICAgICAgIC8qLmx6bF9qYl9pbjpiZWZvcmUsCiAgICAgICAgICAgICAgICAual9qYl9lbGUgPiBhOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMTsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJTsKICAgICAgICAgICAgICAgIAl0b3A6IDUwJTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgLyrliKDpmaQqLwogICAgICAgICAgICAgICAgLyoubHpsX2piX2luW2RhdGEtZmllbGQqPVwiXCdkZWxldGVfbWluZVwnOlwnMVwnXCJdOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5qX2piX2VsZSA+IGFbZGF0YS1maWVsZCo9XCJcJ2RlbGV0ZV9taW5lXCc6XCcxXCdcIl06YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlODcyXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubHpsX2piX2luW2RhdGEtZmllbGQqPVwiXCdkZWxldGVfbWluZVwnOlwnMVwnXCJdOmhvdmVyOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5qX2piX2VsZSA+IGFbZGF0YS1maWVsZCo9XCJcJ2RlbGV0ZV9taW5lXCc6XCcxXCdcIl06aG92ZXI6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbG9yOiAjRjQ0MzM2ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgIC5zdXBlcl9qdWJhbyB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiAxcHggc29saWQgI2U1ZTVlNTsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMnB4IDVweDsKICAgICAgICAgICAgICAgIAl3aWR0aDogOTBweDsKICAgICAgICAgICAgICAgIAl0b3A6IDI4cHg7CiAgICAgICAgICAgICAgICAJei1pbmRleDogNTAwMDI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual9qYl9lbGU6aG92ZXIgLnN1cGVyX2p1YmFvIHsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrliKDpmaQqLwoKICAgICAgICAgICAgICAgIC5wX3Bvc3RfZGVsX215LAogICAgICAgICAgICAgICAgLnBfcG9zdF9kZWwsCiAgICAgICAgICAgICAgICAucF9wb3N0X2JhbiB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNHB4OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAtMXB4OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCB0ZXh0LXNoYWRvdzsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNHM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF9wb3N0X2RlbF9teTpob3ZlciwKICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgYS5wX3Bvc3RfZGVsW2hyZWZdOmhvdmVyLAogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHlfdGFpbCBhLnBfcG9zdF9iYW5baHJlZl06aG92ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjRjQ0MzM2ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdGV4dC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF9wb3N0X2RlbF9teTpiZWZvcmUsCiAgICAgICAgICAgICAgICAucF9wb3N0X2RlbDpiZWZvcmUsCiAgICAgICAgICAgICAgICAucF9wb3N0X2JhbjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfcG9zdF9kZWxfbXk6YmVmb3JlLAogICAgICAgICAgICAgICAgLnBfcG9zdF9kZWw6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTg3MlwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfcG9zdF9iYW46YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTE0YlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDFweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q54K56LWeKi8KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X3RhaWwgLmNvbW1vbl9jb21wbGllbnRfY29udGFpbmVyIHsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAxNHB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvbXBsaWVudF9udW1iZXJ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvbW1vbl9jb21wbGllbnRfY29udGFpbmVyIC5zaG93Q29udGVudHsKICAgICAgICAgICAgICAgIAl0b3A6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50b3RhbF9jb3VudF9udW1iZXJ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46MCAycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50b3RhbF9jb3VudF9udW1iZXIuaGlkZUNvbnRlbnR7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm5vdF9jb21wbGllbnRfdGhyZWFkLAogICAgICAgICAgICAgICAgLmNvbXBsaWVudF90aHJlYWR7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWhlaWdodDogMjhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDJweCAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wb3N0LXRhaWwtd3JhcCA+IHNwYW4udGFpbC1pbmZvOm50aC1sYXN0LW9mLXR5cGUoMiksCiAgICAgICAgICAgICAgICAucF90YWlsID4gbGk6bnRoLWxhc3Qtb2YtdHlwZSgyKT5zcGFuIHsKICAgICAgICAgICAgICAgIAkvKualvOWxguaVsOagh+ivhiovCgogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAl0b3A6IDBweDsKICAgICAgICAgICAgICAgIAlyaWdodDogNXB4OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA0KTsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAxNnB4IDAgMCAxNnB4OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjhweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjhweDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX3Bvc3RfY29udGVudF9maXJzdGZsb29yIC5wb3N0LXRhaWwtd3JhcCA+IHNwYW4udGFpbC1pbmZvOm50aC1sYXN0LW9mLXR5cGUoMiksCiAgICAgICAgICAgICAgICAuZF9wb3N0X2NvbnRlbnRfZmlyc3RmbG9vciAucF90YWlsID4gbGk6bnRoLWxhc3Qtb2YtdHlwZSgyKT5zcGFuIHsKICAgICAgICAgICAgICAgIAkvKjHmpbzmoIfor4YqLwogICAgICAgICAgICAgICAgCXdpZHRoOjUwcHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1yaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfcmVwbHkgewogICAgICAgICAgICAgICAgCS8q5Zue5aSN5oyJ6ZKuKi8KCiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXRvcDogMHB4OwogICAgICAgICAgICAgICAgCXJpZ2h0OiA1cHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuMnM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF9yZXBseSA+ICogewogICAgICAgICAgICAgICAgCWJvcmRlcjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMzBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3JlcGx5ID4gKjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgCXRvcDogNTAlOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfcmVwbHkgLmx6bF9saW5rX2ZvbGQgewogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfbGlua191bmZvbGQ6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTBiZlwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9saW5rX2ZvbGQ6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTMxOFwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjRweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3JlcGx5W2RhdGEtZmllbGQqPVwnXCJ0b3RhbF9udW1cIjpudWxsXCddIC5semxfbGlua191bmZvbGQ6YmVmb3JlLAogICAgICAgICAgICAgICAgLnBfcmVwbHlbZGF0YS1maWVsZCo9XCJcJ3RvdGFsX251bVwnOlwnMFwnXCJdIC5semxfbGlua191bmZvbGQ6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTBjYVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfcmVwbHkgPiAqW3N0eWxlKj1cIm5vbmVcIl0gewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3JlcGx5ID4gKltzdHlsZSo9XCJpbmxpbmUtYmxvY2tcIl0sCiAgICAgICAgICAgICAgICAucF9yZXBseSA+ICpbc3R5bGUqPVwiaW5saW5lXCJdIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmxfcG9zdF9icmlnaHQgLmNvcmVfcmVwbHlfd3JhcHBlciB7CiAgICAgICAgICAgICAgICAJLyrmpbzkuK3mpbzmoYbmnrYqLwogICAgICAgICAgICAgICAgCWJvcmRlcjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjAyKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWZsb2F0OiByaWdodDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV9yZXBseV93cmFwcGVyIC5sb2FkaW5nX3JlcGx5IHsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICAgICAgICAJLXdlYmtpdC1maWx0ZXI6IGdyYXlzY2FsZSgxKTsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgCXRvcDogNTAlOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV9yZXBseV9ib3JkZXJfdG9wIHsKICAgICAgICAgICAgICAgIAkvKualvOS4realvOahhuaetumhtuaPj+i+uSovCgogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X2NvbnRlbnQgewogICAgICAgICAgICAgICAgCS8q5qW85Lit5qW85YaF5a655qGG5p62Ki8KCiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV9yZXBseV9ib3JkZXJfYm90dG9tewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3JlcGx5X2NvbnRlbnQgbGkgewogICAgICAgICAgICAgICAgCWJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4wNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubHpsX2NvbnRlbnRfcmVwbHkgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubHpsX2NvbnRlbnRfcmVwbHkgYSB7CiAgICAgICAgICAgICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICAgICAgICAgIC8qCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfY29udGVudF9yZXBseSBhOmhvdmVyIHsKICAgICAgICAgICAgICAgIAljb2xvcjojMmQ2NGIzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9saV9wYWdlcl9zIHsKICAgICAgICAgICAgICAgIAljb2xvcjogIzY2NiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC51SWNvbkNudCwKICAgICAgICAgICAgICAgIC5semxfcF9wIHsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAycHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKualvOS4realvE1PUkUqLwoKICAgICAgICAgICAgICAgIC5semxfbW9yZSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9tb3JlIC5qX2x6bF9tIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHg7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogLTRweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogNnB4OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQsIGNvbG9yOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC4yczsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfbW9yZSAual9semxfbTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU1ZDNcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDMwcHg7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfbGlfcGFnZXJfcz4uYnRuLXN1YiB7CiAgICAgICAgICAgICAgICAJLyrmiJHkuZ/or7TkuIDlj6XmjInpkq4qLwoKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDMwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLCBjb2xvcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuMnM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubHpsX21vcmUgLmpfbHpsX206aG92ZXIsCiAgICAgICAgICAgICAgICAubHpsX2xpX3BhZ2VyX3M+LmJ0bi1zdWI6aG92ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMykgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfbGlfcGFnZXJfcyAuaWNvbi1yZXBseSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9saV9wYWdlcl9zPi5idG4tc3ViOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUxNWVcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI0cHg7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAtMXB4OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAtMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9saV9wYWdlcl9zPi5idG4tc3ViOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuWbnuWkjeWxguS4u1wiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5qW85Lit5qW86L6T5YWl5qGG5qGG5p62Ki8KCiAgICAgICAgICAgICAgICAuZWR1aS1jb250YWluZXIgewogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1lZGl0b3ItYm9keSB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfc2ltcGxlX3dyYXBwZXIsCiAgICAgICAgICAgICAgICAuZWR1aS1ib2R5LWNvbnRhaW5lciB7CiAgICAgICAgICAgICAgICAJLyrovpPlhaXmoYYqLwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1pbi1oZWlnaHQ6IDYwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICAgICAgICAgIAlvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLCBib3JkZXItYm90dG9tOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfc2ltcGxlX3dyYXBwZXIgcHsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgCXRvcDogNTAlOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSk7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudWVnX3BtYy1saW5rewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDRweDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4xKTsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDJweDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzY2NjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvcixiYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC40czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51ZWdfcG1jLWxpbms6aG92ZXJ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMjYpOwogICAgICAgICAgICAgICAgCWNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZWR1aS1ib2R5LWNvbnRhaW5lcjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiRGVzaWduIGJ5IE1hdmVyaWNrXCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlib3R0b206IDA7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDA7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwcHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMHB4OwogICAgICAgICAgICAgICAgCWN1cnNvcjogbnMtcmVzaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmVkdWktYm9keS1jb250YWluZXI6Zm9jdXMgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgIzQ4NzlCRCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9lZGl0b3JfY29udGFpbmVyIC5semxfcGFuZWxfd3JhcHBlciB7CiAgICAgICAgICAgICAgICAJLyrmpbzkuK3mpbzmjqfku7bln58qLwoKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrlj5HooajmjInpkq4qLwogICAgICAgICAgICAgICAgI3ZvdGVGbGFzaFBhbmVsIC52b3RlX2J1dHRvbnMgYnV0dG9uLAogICAgICAgICAgICAgICAgLmx6bF9wYW5lbF9zdWJtaXQsCiAgICAgICAgICAgICAgICAubHpsX3BhbmVsX3N1Ym1pdF9kaXNhYmxlZCwKICAgICAgICAgICAgICAgIC5wb3N0ZXJfc3VibWl0LAogICAgICAgICAgICAgICAgLnFwX3N1Ym1pdCwKICAgICAgICAgICAgICAgIC5zYXZlLXRvLXF1aWNrLXJlcGx5LWJ0biB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA2MHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMTNweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAzcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQsIGJveC1zaGFkb3c7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9wYW5lbF9zdWJtaXRfZGlzYWJsZWR7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwuNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5semxfcGFuZWxfc3VibWl0X2Rpc2FibGVkOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5Y+R6KGoXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubHpsX3BhbmVsX3N1Ym1pdDphZnRlciwKICAgICAgICAgICAgICAgIC5semxfcGFuZWxfc3VibWl0X2Rpc2FibGVkOmFmdGVyLAogICAgICAgICAgICAgICAgLnBvc3Rlcl9zdWJtaXQ6YWZ0ZXIsCiAgICAgICAgICAgICAgICAucXBfc3VibWl0OmFmdGVyLAogICAgICAgICAgICAgICAgLnNhdmUtdG8tcXVpY2stcmVwbHktYnRuOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUxNjNcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMnB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0xcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICN2b3RlRmxhc2hQYW5lbCAudm90ZV9idXR0b25zIGJ1dHRvbjpob3ZlciwKICAgICAgICAgICAgICAgIC5semxfcGFuZWxfc3VibWl0OmhvdmVyLAogICAgICAgICAgICAgICAgLnBvc3Rlcl9zdWJtaXQ6aG92ZXIsCiAgICAgICAgICAgICAgICAucXBfc3VibWl0OmhvdmVyLAogICAgICAgICAgICAgICAgLnNhdmUtdG8tcXVpY2stcmVwbHktYnRuOmhvdmVyIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpLCAwIDFweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmx6bF9wYW5lbF9zbWlsZSB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q6KGo5oOF6YCJ5oup5oyJ6ZKuKi8KCiAgICAgICAgICAgICAgICAubHpsX2luc2VydHNtaWxleV9ob2xkZXIsCiAgICAgICAgICAgICAgICAucXBfaW5zZXJ0c21pbGV5X2hvbGRlciwKICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnFwX2ludGVydmlld19pbnNlcnRzbWlsZXkgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDI2cHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI2cHg7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMzBweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIHRleHQtc2hhZG93OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC40czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIAljdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubHpsX2luc2VydHNtaWxleV9ob2xkZXI6aG92ZXIsCiAgICAgICAgICAgICAgICAucXBfaW5zZXJ0c21pbGV5X2hvbGRlcjpob3ZlciB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM0Mjg1RjQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubWluaSAucGxhY2Vob2xkZXI6YmVmb3JlLAogICAgICAgICAgICAgICAgLmx6bF9pbnNlcnRzbWlsZXlfaG9sZGVyOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5xcF9pbnNlcnRzbWlsZXlfaG9sZGVyOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyNGVcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiBpbmhlcml0OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjRweDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMnB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0xcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5qW85Lit5qW86KGo5oOF6YCJ5qGGKi8KCiAgICAgICAgICAgICAgICAubHpsX2VkdWlfZGlhbG9nX2NvbnRhaW5lciB7CiAgICAgICAgICAgICAgICAJbGVmdDogLTM5MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAzNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZW1vdGlvbl9jb250YWluZXIgLnNfdGFiX2NvbnRlbnQgLnNlbGVjdGVkIC5zX3RhYl9idG5iZyB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX3NpZ25fc3BsaXQgewogICAgICAgICAgICAgICAgCS8q562+5ZCN5qGj5YiG5Ymy57q/Ki8KCiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA4KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmpfdXNlcl9zaWduewogICAgICAgICAgICAgICAgCS8q562+5ZCN5qGjKi8KICAgICAgICAgICAgICAgIAltYXJnaW46IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zb2ZhX3Bvc3QgewogICAgICAgICAgICAgICAgCS8q5rKZ5Y+R5bGCKi8KICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc29mYV9jb250ZW50IHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNvZmFfY29udGVudCAuY29yZV9yZXBseV90YWlsIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc29mYV9jb250ZW50IC5wX3RhaWwgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zb2ZhX2NvbnRlbnQgLnBfdGFpbCA+IGxpOm50aC1sYXN0LW9mLXR5cGUoMSk+c3BhbiB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDA7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpOwogICAgICAgICAgICAgICAgCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAxNnB4IDE2cHggMDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAxNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjhweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjhweDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zb2ZhX2NvbnRlbnQgLnBfdGFpbCA+IGxpOm50aC1sYXN0LW9mLXR5cGUoMik+c3BhbiB7CiAgICAgICAgICAgICAgICAJdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV93cmFwX2JyaWdodCB7CiAgICAgICAgICAgICAgICAJLyrluJblrZDmoIfpopgqLwoKICAgICAgICAgICAgICAgIAl0b3A6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZTsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5oy95bCKKi8KCiAgICAgICAgICAgICAgICAuc2F2ZV9mYWNlX2JnIHsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgCXRvcDogLTFweDsKICAgICAgICAgICAgICAgIAlyaWdodDogMjNweDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sX3Bvc3RfYnJpZ2h0OmhvdmVyIC5zYXZlX2ZhY2VfYmcgewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKumakOiXj+eUqOaItyovCgogICAgICAgICAgICAgICAgLnVzZXItaGlkZS1wb3N0LWRvd24sCiAgICAgICAgICAgICAgICAudXNlci1oaWRlLXBvc3QtdXAgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAJY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLG9wYWNpdHk7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXItaGlkZS1wb3N0LWRvd25bc3R5bGUqPVwibm9uZVwiXSB7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyLWhpZGUtcG9zdC1kb3duOmhvdmVyLAogICAgICAgICAgICAgICAgLnVzZXItaGlkZS1wb3N0LXVwOmhvdmVyIHsKICAgICAgICAgICAgICAgIAljb2xvcjogI2YwMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXItaGlkZS1wb3N0LWRvd246YmVmb3JlLAogICAgICAgICAgICAgICAgLnVzZXItaGlkZS1wb3N0LXVwOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyLWhpZGUtcG9zdC1kb3duOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUxNWNcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyLWhpZGUtcG9zdC11cDpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlNDA5XCI7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnVzZXItaGlkZS1wb3N0LWFjdGlvbiB7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDI2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDFweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgCS1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgICAgICAgICAJLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyLWhpZGUtcG9zdC1hY3Rpb24gYSB7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMnB4IDhweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC40czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC51c2VyLWhpZGUtcG9zdC1hY3Rpb24gYTpob3ZlciB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjYWFhICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV9yZXBseV93cmFwcGVyIC51c2VyLWhpZGUtcG9zdC1kb3duLAogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHlfd3JhcHBlciAudXNlci1oaWRlLXBvc3QtdXAgewogICAgICAgICAgICAgICAgCXJpZ2h0OiAtOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHlfd3JhcHBlciAudXNlci1oaWRlLXBvc3QtYWN0aW9uIHsKICAgICAgICAgICAgICAgIAlyaWdodDogMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogLTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBiX2xpc3RfcGFnZXIsCiAgICAgICAgICAgICAgICAubF9yZXBseV9udW0gewogICAgICAgICAgICAgICAgCWhlaWdodDogMjVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sX3JlcGx5X251bSB7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubF9yZXBseV9udW0+c3BhbiB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE4cHg7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMTNweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmxfcmVwbHlfbnVtPnNwYW46bnRoLW9mLXR5cGUoMSk6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuWbnuWkje+8mlwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmxfcmVwbHlfbnVtPnNwYW46bnRoLW9mLXR5cGUoMik6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMTJweDsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIumhteaVsO+8mlwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIHsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgLyoJLW1vei11c2VyLXNlbGVjdDogbm9uZTvnpoHmraLpgInmi6nmloflrZcqLwogICAgICAgICAgICAgIC8qCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Ki8KICAgICAgICAgICAgICAgIAloZWlnaHQ6IDQ1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzY2NjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfNyB7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubF90aHJlYWRfaW5mbyB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sX3RocmVhZF9pbmZvID4gKiB7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sX3Bvc3RzX251bSB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMDsKICAgICAgICAgICAgICAgIAlmbGV4OiAxCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubF9wb3N0c19udW0gbGkgewogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sX3Bvc3RzX251bSA+IGxpOmVtcHR5LAogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgLmxfcG9zdHNfbnVtID4gbGk6ZW1wdHkgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICN0b2Zyc191cCB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBiX2xpc3RfcGFnZXIgewogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaXRiX3BhZ2VyID4qLAogICAgICAgICAgICAgICAgLnBhZ2luYXRpb24tZGVmYXVsdCA+KiwKICAgICAgICAgICAgICAgIC5wYWdpbmF0aW9uLWRlZmF1bHQyID4qLC8q5pSv5oyB6LS05ZCn5Li76aG16aG26YOo5pi+56S65qW85bGC5YiX6KGo6ISa5pysIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zOTg0MDMtJUU4JUI0JUI0JUU1JTkwJUE3JUU0JUI4JUJCJUU5JUExJUI1JUU5JUExJUI2JUU5JTgzJUE4JUU2JTk4JUJFJUU3JUE0JUJBJUU2JUE1JUJDJUU1JUIxJTgyJUU1JTg4JTk3JUU4JUExJUE4Ki8KICAgICAgICAgICAgICAgIC5wYWdlciA+KiwKICAgICAgICAgICAgICAgIC5qX3BhZ2VyID4qLAogICAgICAgICAgICAgICAgLnBiX2xpc3RfcGFnZXIgPiogewogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCW1pbi13aWR0aDogMTNweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyNXB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyNXB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA1KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDEyLjVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGFnaW5hdGlvbi1kZWZhdWx0MnsKICAgICAgICAgICAgICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGFnaW5hdGlvbi1kZWZhdWx0ID4ucGFnaW5hdGlvbi1jdXJyZW50LAogICAgICAgICAgICAgICAgLnBhZ2luYXRpb24tZGVmYXVsdDIgPi5wYWdpbmF0aW9uLWN1cnJlbnQsCiAgICAgICAgICAgICAgICAucGFnZXIgPiAuY3VyLAogICAgICAgICAgICAgICAgLmpfcGFnZXIgPiAudFAsCiAgICAgICAgICAgICAgICAucGJfbGlzdF9wYWdlciA+IC50UCB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4zKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaXRiX3BhZ2VyID5hOmhvdmVyLAogICAgICAgICAgICAgICAgLnBhZ2luYXRpb24tZGVmYXVsdCA+YTpob3ZlciwKICAgICAgICAgICAgICAgIC5wYWdpbmF0aW9uLWRlZmF1bHQyID5hOmhvdmVyLAogICAgICAgICAgICAgICAgLnBhZ2VyID5hOmhvdmVyLAogICAgICAgICAgICAgICAgLmpfcGFnZXIgPmE6aG92ZXIsCiAgICAgICAgICAgICAgICAucGJfbGlzdF9wYWdlciA+YTpob3ZlciB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZCBpbnB1dCB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCXdpZHRoOiA4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsKICAgICAgICAgICAgICAgIAlvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiA3cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAljb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBib3gtc2hhZG93LCBiYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIGlucHV0Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHsKICAgICAgICAgICAgICAgIAktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF90aHJlYWQgaW5wdXQ6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24gewogICAgICAgICAgICAgICAgCS13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZCBpbnB1dH5idXR0b24gewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAl3aWR0aDogODBweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiA3cHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICAgICAgCWJvcmRlcjogMDsKICAgICAgICAgICAgICAgIAlvdXRsaW5lOiBub25lOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAwOwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1uYW1lOiBldmVudG9mZl9kdXJhdGlvbjsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgICAgICAgICAgICAgICAJYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5wX3RocmVhZCBpbnB1dH5idXR0b246YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXCI7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIAlsZWZ0OiA4cHg7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF90aHJlYWQgaW5wdXRbaWRePVwianVtcFBhZ2VcIl1+YnV0dG9uOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIui3s+i9rOWIsOmhtVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIGlucHV0W25hbWU9XCJlbGV2YXRvckZsb29yXCJdfmJ1dHRvbjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLot7PovazliLDmpbxcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZCBpbnB1dFtpZF49XCJqdW1wUGFnZVwiXTpmb2N1c35idXR0b246YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6aG1XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF90aHJlYWQgaW5wdXRbbmFtZT1cImVsZXZhdG9yRmxvb3JcIl06Zm9jdXN+YnV0dG9uOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIualvFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIGlucHV0OmZvY3VzIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDg3OUJEICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMnB4IDEycHggMCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDk5OTk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF90aHJlYWQgaW5wdXQ6Zm9jdXN+YnV0dG9uIHsKICAgICAgICAgICAgICAgIAlhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgICAgICAgICAgIAl6LWluZGV4OiA5OTk5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIGlucHV0OmZvY3VzfmJ1dHRvbjpiZWZvcmUsCiAgICAgICAgICAgICAgICAucF90aHJlYWQgaW5wdXQ6Zm9jdXN+YnV0dG9uOmFmdGVyIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICAgICAgCXRvcDogMDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZjsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDg3OUJEOwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSwgMCAycHggMTJweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tZHVyYXRpb246IC41czsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIGlucHV0OmZvY3VzfmJ1dHRvbjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6Lez5YiwXCI7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA0cHg7CiAgICAgICAgICAgICAgICAJbGVmdDogLTIycHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMjBweCAwIDAgMjBweDsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tbmFtZTogYnV0dG9uX2VmZmVjdF9sZWZ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfdGhyZWFkIGlucHV0OmZvY3VzfmJ1dHRvbjphZnRlciB7CiAgICAgICAgICAgICAgICAJbGVmdDogYXV0bzsKICAgICAgICAgICAgICAgIAlyaWdodDogLTEzcHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAyMHB4IDIwcHggMDsKICAgICAgICAgICAgICAgIAlhbmltYXRpb24tbmFtZTogYnV0dG9uX2VmZmVjdF9yaWdodDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAubF9yZXBseV9udW1+LmxfcmVwbHlfbnVtIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZsb2F0OiByaWdodCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNyZWF0aXZlcGxhdGZvcm0tZWxldmF0b3IgewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubF90aHJlYWRfbWFuYWdlIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTA7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogLTI4cHg7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IDI1MHB4OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWSg1MCUpOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAubF90aHJlYWRfbWFuYWdlICogewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmRfZGVsX3RocmVhZCwKICAgICAgICAgICAgICAgICNkX3Bvc3RfbWFuYWdlIHsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDM0cHg7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDk4cHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2VlZTsKICAgICAgICAgICAgICAgIAljb2xvcjogcmdiYSgwLCAwLCAwLCAuNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjEpOwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC42czsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX2RlbF90aHJlYWQgewogICAgICAgICAgICAgICAgCWJvcmRlci13aWR0aDogMXB4OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogLThweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogOHB4IWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX3RocmVhZF9kZWxldGU6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjZF9wb3N0X21hbmFnZSB7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXdpZHRoOiAxcHggMCAxcHggMXB4OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDhweCAwIDAgOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmRfZGVsX3RocmVhZDpob3ZlciwKICAgICAgICAgICAgICAgICNkX3Bvc3RfbWFuYWdlOmhvdmVyIHsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNhYWE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9kZWxfdGhyZWFkOmhvdmVyIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjRjQ0MzM2ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual90aHJlYWRfZGVsZXRlLAogICAgICAgICAgICAgICAgLmRfcG9zdF9tYW5hZ2VfbGluayB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDI0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDMwcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5qX3RocmVhZF9kZWxldGU6YmVmb3JlLAogICAgICAgICAgICAgICAgLmRfcG9zdF9tYW5hZ2VfbGluazpiZWZvcmUgewogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJc3BlYWs6IG5vbmU7CiAgICAgICAgICAgICAgICAJZm9udC1zdHlsZTogbm9ybWFsOwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgICAgICAgICAJZm9udC12YXJpYW50OiBub3JtYWw7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAJd29yZC13cmFwOiBub3JtYWw7CiAgICAgICAgICAgICAgICAJZGlyZWN0aW9uOiBsdHI7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual90aHJlYWRfZGVsZXRlOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4NzJcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5kX3Bvc3RfbWFuYWdlX2xpbms6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTg2OVwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNqX3F1aWNrX3RocmVhZCB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJTsKICAgICAgICAgICAgICAgIAlib3R0b206IDA7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMTAwJSk7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDk5OTk7CiAgICAgICAgICAgICAgICAJY29sb3I6IHJnYmEoMCwgMCwgMCwgLjQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjZF9wb3N0X21hbmFnZTpob3ZlciAjal9xdWlja190aHJlYWQgewogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI2pfcXVpY2tfdGhyZWFkPmxpIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNnM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMDAlKTsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZGVsYXk6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjal9xdWlja190aHJlYWQ+bGk+YSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2VlZTsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLCBjb2xvcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNnM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjal9xdWlja190aHJlYWQ+bGk+YTpob3ZlciB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2FhYTsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI2RfcG9zdF9tYW5hZ2U6aG92ZXIgI2pfcXVpY2tfdGhyZWFkPmxpIHsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZCAubG9hZGluZy10aXAgewogICAgICAgICAgICAgICAgCXRvcDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXJpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm90dG9tOiA5MHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogOTk5OTsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmU7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQ4NzlCRCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogN3B4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogLTFweDsKICAgICAgICAgICAgICAgIAlsZXR0ZXItc3BhY2luZzogMXB4OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDZweCA4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSwgMCAycHggMTZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjIpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuW4luWtkOWGhemhtS3moIfpopjmoI8qLwoKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2JnIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbGVmdDogMDsKICAgICAgICAgICAgICAgIAl0b3A6IDA7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlIHsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfdHh0IHsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA3MzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnMgewogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl6LWluZGV4OiA0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXJpZ2h0OiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucyBpewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnMgPiAqLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucyAubF9sem9ubHksCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zIC5sX2x6b25seV9jYW5jZWwsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zIC5wX2ZhdnRocl9tYWluLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucyAual9xdWlja19yZXBseSB7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIG1pbi13aWR0aDo2NXB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA2NnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAwIDIwcHggMjBweDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogOTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnMgKiwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnMgKjpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zICo6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJY29sb3I6IHJnYmEoMCwgMCwgMCwgLjQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz4qIHsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCAycHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZWVlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjJzICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIGxlZnQ6dW5zZXQgIWltcG9ydGFudDsvKuWFvOWuuSBDb3B5IFRpZWJhIExpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NoaXRpYW5zaGl3YS9iYWlkdS10aWViYS11c2Vyc2NyaXB0LyDlpI3liLbpk77mjqXmjInpkq4qLwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuY29yZV90aXRsZV9idG5zID4gKnsvKuWFvOWuuSBDb3B5IFRpZWJhIExpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NoaXRpYW5zaGl3YS9iYWlkdS10aWViYS11c2Vyc2NyaXB0LyDlpI3liLbpk77mjqXmjInpkq4qLwogICAgICAgICAgICAgICAgICAgdG9wOiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnM+Kjpob3ZlciB7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLCBib3gtc2hhZG93ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2FhYSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz4qOmhvdmVyLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz4qOmhvdmVyICosCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPio6aG92ZXIgLmRfbHpvbmx5X2JkYXNpZGU6YmVmb3JlLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz4qOmhvdmVyICNsem9ubHlfY250bjpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPiNsem9ubHlfY250bjpob3ZlcjpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPiNqX2ZhdnRocmVhZDpob3ZlcjpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPi5qX2Zhdm9yOmhvdmVyOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnM+I3F1aWNrX3JlcGx5OmhvdmVyOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnM+LnF1aWNrX3JlcGx5OmhvdmVyOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnM+KjphY3RpdmUgewogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgNHB4IDJweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmRfbHpvbmx5X2JkYXNpZGUgewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxldHRlci1zcGFjaW5nOiAwOwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmRfbHpvbmx5X2JkYXNpZGU6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIualvOS4u1wiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucyAjbHpvbmx5X2NudG46YmVmb3JlLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz4jal9mYXZ0aHJlYWQ6YmVmb3JlLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz4ual9mYXZvcjpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPiNxdWlja19yZXBseTpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPi5xdWlja19yZXBseTpiZWZvcmUgewogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJc3BlYWs6IG5vbmU7CiAgICAgICAgICAgICAgICAJZm9udC1zdHlsZTogbm9ybWFsOwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgICAgICAgICAJZm9udC12YXJpYW50OiBub3JtYWw7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIAl3b3JkLXdyYXA6IG5vcm1hbDsKICAgICAgICAgICAgICAgIAlkaXJlY3Rpb246IGx0cjsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDMwcHg7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAtMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucyAjbHpvbmx5X2NudG46YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZThmNFwiICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAzMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPiNqX2ZhdnRocmVhZDpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9idG5zPi5qX2Zhdm9yOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4OWFcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnM+I3F1aWNrX3JlcGx5OmJlZm9yZSwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnM+LnF1aWNrX3JlcGx5OmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyNGNcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5biW5a2Q5YaF6aG15bqV5L6n5rWu5bGCLOi/meS4quaYr+mdoOi0tOWQp+iHquW4pueahOagt+W8j+WPmOWMluinpuWPkeeahCovCgogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDQwMSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYmcgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0ODc5QkQgICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMjhweDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMnB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfdHh0IHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogNDBweDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5jb3JlX3RpdGxlX2J0bnMgewogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuY29yZV90aXRsZV9idG5zICosCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyAqOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuY29yZV90aXRsZV9idG5zICo6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyA+ICogewogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSwgMCAycHggMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDg3OUJEICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDEpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjZzICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyA+ICo6aG92ZXIgewogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgxLjEpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQyODVGNCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5jb3JlX3RpdGxlX2J0bnMgPiAqOmFjdGl2ZSB7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDEuMDUpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyA+ICosCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyAubF9sem9ubHksCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyAubF9sem9ubHlfY2FuY2VsLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5jb3JlX3RpdGxlX2J0bnMgLnBfZmF2dGhyX21haW4sCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucyAual9xdWlja19yZXBseSB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDcwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDcwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDUwJTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMTA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsZXR0ZXItc3BhY2luZzogMnB4OwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAycHg7CiAgICAgICAgICAgICAgICAgICBsZWZ0OiB1bnNldCAhaW1wb3J0YW50Oy8q6LS05a2Q5YaF5qCH6aKY5qCP55qE5Yqf6IO95oyJ6ZKuIOe7meaXp+eJiOi0tOWQp+eUqOeahO+8jOS+i+WmgueBq+eLkOWQpyDop6PlhrPkuIvlt6XlhbfmoI/mlofmnKzlj7PlgY8qLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLypmaXggYnVnKi8KICAgICAgICAgICAgICAgIC5xdWlja19yZXBseXsKICAgICAgICAgICAgICAgIAlwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5xdWlja19yZXBseSA+ICp7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmRfbHpvbmx5X2JkYXNpZGUgewogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5kX2x6b25seV9iZGFzaWRlOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGV0dGVyLXNwYWNpbmc6IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuZF9sem9ubHlfYmRhc2lkZSwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAucF9mYXZ0aHJfbWFpbiBwIHsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5jb3JlX3RpdGxlX2J0bnMgI2x6b25seV9jbnRuOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuY29yZV90aXRsZV9idG5zPiNqX2ZhdnRocmVhZDpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucz4ual9mYXZvcjpiZWZvcmUsCiAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgLmNvcmVfdGl0bGVfYnRucz4jcXVpY2tfcmVwbHk6YmVmb3JlLAogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5jb3JlX3RpdGxlX2J0bnM+LnF1aWNrX3JlcGx5OmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMzJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0xMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuY29yZV90aXRsZV9idG5zICNsem9ubHlfY250bjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMzZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYnRucz5saT5hLC5jb3JlX3RpdGxlX2J0bnM+bGk+KnsvKui0tOWtkOWGheagh+mimOagj+eahOWKn+iDveaMiemSriDnu5nml6fniYjotLTlkKfnlKjnmoTvvIzkvovlpoLngavni5DlkKcqLwogICAgICAgICAgICAgICAgICAgbGVmdDogNXB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrmlLbol4/miJDlip/mj5DnpLrmoYYqLwoKICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgewogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMnB4IDE2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogOTk5OTsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IDkwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogMzJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgPiBkaXYgewogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAlsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5hcnJvd190b3AgewogICAgICAgICAgICAgICAgCXdpZHRoOiAwOwogICAgICAgICAgICAgICAgCWhlaWdodDogMDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IC05cHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkICM0NTczYjQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMTAwcHg7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgLnN1Y2Nlc3NfdGlwIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDU3M2I0OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDZweCA2cHggMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgLnN1Y2Nlc3NfdGlwIGhyLAogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAuc3VjY2Vzc190aXAgLmNvbGxlY3RfdGlwIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAuY29sbGVjdF9zdWNjZXNzIHNwYW4gewogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiA5cHg7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgICAgICAgCXRvcDogMTBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgLmNvbGxlY3Rfc3VjY2VzcyBzcGFuOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU1MmRcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAxOwogICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAJd29yZC13cmFwOiBub3JtYWw7CiAgICAgICAgICAgICAgICAJZGlyZWN0aW9uOiBsdHI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyOHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogNHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0ycHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5zdWNjZXNzX3RpcCAuZGVsZXRlX2NvbGxlY3QgewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlyaWdodDogMDsKICAgICAgICAgICAgICAgIAlsZWZ0OiBhdXRvOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCWZsb2F0OiByaWdodDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDQwcHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDQwcHg7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDQwcHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAljdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC42KTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCB0cmFuc2Zvcm07CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAuc3VjY2Vzc190aXAgLmRlbGV0ZV9jb2xsZWN0OmhvdmVyIHsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHNjYWxlKDEuMyk7CiAgICAgICAgICAgICAgICAJY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgLnN1Y2Nlc3NfdGlwIC5kZWxldGVfY29sbGVjdDpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlNWNkXCI7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5ydWxlc190aXAgewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDMwcHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA2MHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IC0zMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5zaG93X3RhZ19pbnB1dCB7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl6LWluZGV4OiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAual9hZGRfdGFnIHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW91dGxpbmU6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA4KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJveC1zaGFkb3csIGJhY2tncm91bmQsIGJvcmRlci1ib3R0b207CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5qX2FkZF90YWc6Zm9jdXMgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjNDI4NUY0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5yZWNvbW1lbmRfdGFnIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgLnJlY29tbWVuZF90YWc6ZW1wdHkgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5wYl9yZWNvbW1lbmRfdGFnIHsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tYm90dG9tOiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4xKTsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmU7CiAgICAgICAgICAgICAgICAJY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAucGJfcmVjb21tZW5kX3RhZyBzcGFuIHsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5wYl9yZWNvbW1lbmRfdGFnOmhvdmVyIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDI4NUY0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC50YWdfYnV0dG9uIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAudGFnX3N1Ym1pdF9idXR0b24gewogICAgICAgICAgICAgICAgCXdpZHRoOiAyMDBweDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDI3cHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDI3cHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA4KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgIAljdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAJbGV0dGVyLXNwYWNpbmc6IDIwcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDIwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC50YWdfc3VibWl0X2J1dHRvbjpob3ZlciB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogIzQyODVGNCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAudGFnX3N1Ym1pdF9idXR0b24gc3BhbiB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucmVjb21tZW5kX291dHRlc3RfY29udGFpbmVyIC5wYl9yZWNvbW1lbmRfdGFnLAogICAgICAgICAgICAgICAgLnJlY29tbWVuZF9vdXR0ZXN0X2NvbnRhaW5lciAudGFnX3N1Ym1pdF9idXR0b24gewogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQ7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfZmF2dGhyZWFkIC5wX2ZhdnRocl90aXAgewogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAwOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiA4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDg3OUJEICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJdG9wOiA4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IC04cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl6LWluZGV4OiA5OTk5OwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMnB4IDEycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTBweCk7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwW3N0eWxlKj1cImhlaWdodDpcIl0gewogICAgICAgICAgICAgICAgCXZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX3dyYXBfYnJpZ2h0Pi5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwIHsKICAgICAgICAgICAgICAgIAl0b3A6IDcwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogNzZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfZmF2dGhyZWFkIC5wX2ZhdnRocl90aXAgKiB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwPnNwYW46b25seS1jaGlsZCwKICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwPmE6bnRoLW9mLXR5cGUoMSkgewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwIHsKICAgICAgICAgICAgICAgIAl0b3A6IC04MnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcmlnaHQ6IC01cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodD4ucF9mYXZ0aHJlYWQgLnBfZmF2dGhyX3RpcCB7CiAgICAgICAgICAgICAgICAJdG9wOiAtMTAwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlyaWdodDogMTA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwPnNwYW46b25seS1jaGlsZDphZnRlciwKICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwPmE6bnRoLW9mLXR5cGUoMSk6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgIAlsZXR0ZXItc3BhY2luZzogMnB4OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIAljb2xvcjogI2ZmZjsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfZmF2dGhyZWFkIC5wX2ZhdnRocl90aXA+c3Bhbjpvbmx5LWNoaWxkOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuWPlua2iOaIkOWKn1wiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfZmF2dGhyZWFkIC5wX2ZhdnRocl90aXA+YTpudGgtb2YtdHlwZSgxKTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmlLbol4/miJDlip9cIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwPnNwYW46b25seS1jaGlsZDpiZWZvcmUsCiAgICAgICAgICAgICAgICAucF9mYXZ0aHJlYWQgLnBfZmF2dGhyX3RpcD5hOm50aC1vZi10eXBlKDEpOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMTsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDQycHg7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogNnB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnBfZmF2dGhyZWFkIC5wX2ZhdnRocl90aXA+c3Bhbjpvbmx5LWNoaWxkOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4ZTdcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX2ZhdnRocmVhZCAucF9mYXZ0aHJfdGlwPmE6bnRoLW9mLXR5cGUoMSk6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZThlNlwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0fi5wX3Bvc3RsaXN0IC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogODZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXJpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE5NHB4KTsKICAgICAgICAgICAgICAgIAl3aWR0aDogMzYwcHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0fi5wX3Bvc3RsaXN0IC5yZWNvbW1lbmRfb3V0dGVzdF9jb250YWluZXIgLmFycm93X3RvcCB7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiAxMHB4IHNvbGlkICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0b3A6IGF1dG87CiAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgCWJvdHRvbTogLTlweDsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF90aHJlYWQudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSB7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDQ1MCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvdHRvbTogLTE0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWhlaWdodDogODBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXdpZHRoOiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogNjYwcHg7LyrlsJ3or5Xop6PlhrPotoXlrr3lsY/nmoTmg4XlhrXkuIvvvIzlt6XlhbfmoI/kvJrov4fplb9idWcqLwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJEZXNpZ24gYnkgTWF2ZXJpY2tcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDA7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWhlaWdodDogNTRweDsKICAgICAgICAgICAgICAgIAl3aWR0aDogODAlOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlPio6bm90KC5sb2FkaW5nLXRpcCkgewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlOmhvdmVyIHsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlOmhvdmVyOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5wX3RocmVhZC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlOmhvdmVyPio6bm90KC5sb2FkaW5nLXRpcCkgewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucF90aHJlYWQudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZTpob3Zlcj4qIHsKICAgICAgICAgICAgICAgIAkvKui/h+a4oeaXtuemgeatouS6i+S7tiovCiAgICAgICAgICAgICAgICAJYW5pbWF0aW9uLW5hbWU6IGV2ZW50b25fZHVyYXRpb247CiAgICAgICAgICAgICAgICAJYW5pbWF0aW9uLWR1cmF0aW9uOiAuOHM7CiAgICAgICAgICAgICAgICAJYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlIC5sX3Bvc3RzX251bSAucGJfbGlzdF9wYWdlciB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXRvcDogMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAubF90aHJlYWRfaW5mbyB7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKua1ruWKqOS4i+W3peWFt+agj+mhteaVsOWIl+ihqOaMiemSruagt+W8jyovCiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAucGJfbGlzdF9wYWdlciA+KiB7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAkvKmJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xKSAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAucGJfbGlzdF9wYWdlciA+YTpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzQyODVGNCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIC8qY29sb3I6IzAwMCAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAubF9yZXBseV9udW0+c3BhbiB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDUwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAubF9yZXBseV9udW0+c3BhbjpudGgtb2YtdHlwZSgxKSB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgLmxfcmVwbHlfbnVtPnNwYW46YmVmb3JlIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogLTEuNWVtICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAubF9yZXBseV9udW1+LmxfcmVwbHlfbnVtIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgaW5wdXQgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgaW5wdXR+YnV0dG9uIHsKICAgICAgICAgICAgICAgIAl0b3A6IDE0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSBpbnB1dH5idXR0b246YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSBpbnB1dDpmb2N1c35idXR0b246YmVmb3JlLAogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgaW5wdXQ6Zm9jdXN+YnV0dG9uOmFmdGVyIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDI4NUY0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgaW5wdXQ6Zm9jdXN+YnV0dG9uOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggMTJweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAycHggMjRweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgLTEwcHggMCAyMHB4IDBweCAjNDg3OUJEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgaW5wdXQ6Zm9jdXN+YnV0dG9uOmFmdGVyIHsKICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDJweCAxMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDJweCAyNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAxMHB4IDAgMjBweCAwcHggIzQ4NzlCRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlIGlucHV0OmZvY3VzIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDI4NUY0ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAycHggMTJweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAycHggMjRweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRfdGhlbWVfYnJpZ2h0X2Fic29sdXRlIC5jcmVhdGl2ZXBsYXRmb3JtLWVsZXZhdG9yIHsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSAubF90aHJlYWRfbWFuYWdlIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuWPs+i+ueagj+WIhuWJsue6vyovCgogICAgICAgICAgICAgICAgLmZvcnVtX2NvbnRlbnQgLmFzaWRlOmJlZm9yZSwKICAgICAgICAgICAgICAgIC5yaWdodF9icmlnaHQ6YmVmb3JlLAogICAgICAgICAgICAgICAgLnNpZGU6YmVmb3JlLAogICAgICAgICAgICAgICAgLnJpZ2h0X2FzaWRlOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJEZXNpZ24gYnkgTWF2ZXJpY2tcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDA7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIAl3aWR0aDogMDsKICAgICAgICAgICAgICAgIAlib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qa2V5ZnJhbWVzKi8KICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgZXZlbnRvZmZfZHVyYXRpb24gewogICAgICAgICAgICAgICAgCWZyb20gewogICAgICAgICAgICAgICAgCQlwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICAJdG8gewogICAgICAgICAgICAgICAgCQlwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBAa2V5ZnJhbWVzIGV2ZW50b25fZHVyYXRpb24gewogICAgICAgICAgICAgICAgCWZyb20gewogICAgICAgICAgICAgICAgCQlwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICAJdG8gewogICAgICAgICAgICAgICAgCQlwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBAa2V5ZnJhbWVzIGJ1dHRvbl9lZmZlY3RfbGVmdCB7CiAgICAgICAgICAgICAgICAJZnJvbSB7CiAgICAgICAgICAgICAgICAJCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAJCXRyYW5zZm9ybTogdHJhbnNsYXRlWCg4MCUpOwogICAgICAgICAgICAgICAgCX0KICAgICAgICAgICAgICAgIAl0byB7CiAgICAgICAgICAgICAgICAJCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAJCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsKICAgICAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBAa2V5ZnJhbWVzIGJ1dHRvbl9lZmZlY3RfcmlnaHQgewogICAgICAgICAgICAgICAgCWZyb20gewogICAgICAgICAgICAgICAgCQlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTkwJSk7CiAgICAgICAgICAgICAgICAJfQogICAgICAgICAgICAgICAgCXRvIHsKICAgICAgICAgICAgICAgIAkJb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIAkJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgICAgICAgICAgCX0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKue7huiKguWkhOeQhiovCgogICAgICAgICAgICAgICAgLyrluJblrZDlhoXlrrnlm77niYflrr3luqbpmZDliLYqLwogICAgICAgICAgICAgICAgLmRfcG9zdF9jb250ZW50IC5CREVfSW1hZ2V7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuZF9wb3N0X2NvbnRlbnQgLkJERV9JbWFnZVt3aWR0aD1cIjU2MFwiXSwKICAgICAgICAgICAgICAgIC5wb3N0ZXJfYm9keSAuZWR1aS1lZGl0b3ItYm9keSAuZWR1aS1ib2R5LWNvbnRhaW5lciBpbWdbd2lkdGg9XCI1NjBcIl0gewogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrljaDkvY3nrKbnqb/pgI8qLwoKICAgICAgICAgICAgICAgIC50YnVpX3BsYWNlaG9sZGVyLAogICAgICAgICAgICAgICAgLnRiX3Bvc3Rlcl9wbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaWNvbl93cmFwOmVtcHR5IHsKICAgICAgICAgICAgICAgIAkvKuWNsOiusOagj+S4uuepuuS4jeaYvuekuiovCgogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5mcnNfYnJpZ2h0X2ljb25zewogICAgICAgICAgICAgICAgCS8q5Li76aKY6LS05YiX6KGo55qE5Y2w6K6w5qCPKi8KICAgICAgICAgICAgICAgIAlyaWdodDogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuivnemimOi0tOWbnuWkjeahhuaOp+S7tuWfnyovCgogICAgICAgICAgICAgICAgLnFwX2J0biB7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5xcF9zbWlsZSB7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiA2cHg7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IHJpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUgLnBiX2xpc3RfcGFnZXI6ZW1wdHkrLmxfcmVwbHlfbnVtIHsKICAgICAgICAgICAgICAgIAkvKuW4luWtkOWGhemhtemhteaVsOS4ujHml7blop7lpKflip/og73moI/pobnnm67pl7Tot50qLwoKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuY29yZV9yZXBseSB7CiAgICAgICAgICAgICAgICAJLyrmpbzkuK3mpbznmoTmnIDlsI/pq5jluqblr7zoh7TluJblrZDlhoXpobXmu5rliqjml7bot7PliqgqLwoKICAgICAgICAgICAgICAgIAltaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAual91c2VyX2NhcmQgewogICAgICAgICAgICAgICAgCS8q5qW85Lit5qW85Zue5aSN5ZCO5aS05YOPYeagh+etvumrmOW6puWHuumUmSovCgogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAltaW4taGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmNvcmVfcmVwbHlfY29udGVudD51bD5saTpudGgtb2YtdHlwZSgxKSB7CiAgICAgICAgICAgICAgICAJLyrmpbzkuK3mpbzlm57lpI3lkI7ljbPkvb/mmK/kuIDmpbzkuZ/kvJrlh7rnjrDkuIrmj4/ovrkqLwoKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiBub25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrnvJbovpHlv6vpgJ/lm57luJYg6L6T5YWl5qGG5a695bqm6Zeu6aKYKi8KCiAgICAgICAgICAgICAgICAjcXVpY2stcmVwbHktZWRpdC13cmFwcGVyIC5xdWljay1yZXBseS1pdGVtIHsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNxdWljay1yZXBseS1lZGl0LXdyYXBwZXIgLnF1aWNrLXJlcGx5LWl0ZW0gLnF1aWNrLXJlcGx5LWRlbGV0ZS1idG4gewogICAgICAgICAgICAgICAgCXJpZ2h0OiA0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKuWPs+S+p+a1ruWxgiovCgogICAgICAgICAgICAgICAgLnRidWlfYXNpZGVfZmxvYXRfYmFyIHsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICAgIC8qCWxlZnQ6IDUwJSAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICAJYm90dG9tOiAwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2FzaWRlX2ZiYXJfYnV0dG9uIHsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAgICAgICAgIAl3aWR0aDogNDVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogNTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2FzaWRlX2ZiYXJfYnV0dG9uID5hIHsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwIDEwcHggMTBweCAwOwogICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDJweCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZmVmZWZlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6aGlkZGVuOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMDsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAtNDVweDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiB0ZXh0LWluZGVudDsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNnM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9hc2lkZV9mYmFyX2J1dHRvbiA+YTpob3ZlciB7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2FzaWRlX2ZiYXJfYnV0dG9uID5hOmFmdGVyLAogICAgICAgICAgICAgICAgLnRidWlfYXNpZGVfZmJhcl9idXR0b24gPmE6YmVmb3JlewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAljb2xvcjogI2NjYzsKICAgICAgICAgICAgICAgIAl3aWR0aDogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfYXNpZGVfZmJhcl9idXR0b24gPmE6YWZ0ZXJ7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU4NzFcIjsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjhweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogNTBweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IC0ycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9hc2lkZV9mYmFyX2J1dHRvbiA+YTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmnKrnn6Xpobnnm65cIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDVweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWxlZnQ6IDdweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3RvcD5hOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OlwiXFxlMjU1XCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAzMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl90b3A+YTpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCLov5Tlm57pobbpg6hcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfdHN1a2tvbWk+YTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIlxcZTgxNVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl90c3Vra29taT5hOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIuelnuadpeS4gOWPpVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9wcm9wcz5hOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OlwiXFxlMzlmXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3Byb3BzPmE6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi6a2U5rOV6YGT5YW3XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX2hvbWU+YTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIlxcZTkxZFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9ob21lPmE6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5Y+s5ZSk5bqm5aiYXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3NxdWFyZT5hOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OlwiXFxlNjM5XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3NxdWFyZT5hOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIuS4u+aSreW5v+WculwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9sYWI+YTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIlxcZTg3YlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfbGFiPmE6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5a6e6aqM5Yqf6IO9XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX2ZlZWRiYWNrPmE6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5oiR6KaB5Y+N6aaIXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX2Rvd24+YTpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCLkuIvovb1BUFBcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfZmF2b3I+YTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIlxcZTg3ZFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9mYXZvcj5hOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIueIsemAm+eahOWQp1wiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9zaGFyZT5hOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OlwiXFxlODBkXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3NoYXJlPmE6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5YiG5Lqr5q2k6aG1XCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3JlZnJlc2g+YTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIlxcZTVkNVwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMzBweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfcmVmcmVzaD5hOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIueri+WNs+WIt+aWsFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl9wb3N0PmE6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCJcXGUyNTRcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfcG9zdD5hOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIuWPkeihqOS4u+mimFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl90b3B7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAycHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1ib3R0b206IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfdG9wPmF7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdGV4dC1pbmRlbnQsdHJhbnNmb3JtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRidWlfZmJhcl90b3Bbc3R5bGUqPVwiaGlkZGVuXCJdewogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgCXZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnVpX2ZiYXJfdG9wW3N0eWxlKj1cImhpZGRlblwiXT5hewogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTEwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9mYmFyX3RvcFtzdHlsZSo9XCJ2aXNpYmxlXCJdewogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkTGlzdEdyb3VwQ250Pi5saXN0QnRuQ250PiNpbnRlcnZpZXctc2hhcmUtd3JhcHBlcj4udGJzaGFyZV9wb3B1cF93cmFwcGVyewogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOnVuc2V0ICFpbXBvcnRhbnQ7LyrnibnmrornmoTku4rml6Xor53popjliIbkuqvmjInpkq4qLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRic2hhcmVfcG9wdXBfd3JhcHBlcnsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogZml4ZWQ7LyrnibnmrornmoTku4rml6Xor53popjliIbkuqvmjInpkq4qLwogICAgICAgICAgICAgICAgCXdpZHRoOiBpbmhlcml0OwogICAgICAgICAgICAgICAgCWhlaWdodDogaW5oZXJpdDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogMDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJ1aV9hc2lkZV9mbG9hdF9iYXIgLnRic2hhcmVfcG9wdXBfd3JhcHBlcnsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwMCUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRic2hhcmVfcG9wdXBfZW50ZXIgey8q54m55q6K55qE5LuK5pel6K+d6aKY5YiG5Lqr5oyJ6ZKuKi8KICAgICAgICAgICAgICAgIAl3aWR0aDogaW5oZXJpdDsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAJLypiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnNoYXJlX3BvcHVwX21haW4gewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGVmdDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRvcDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICAJb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTIwJSwtNTAlKTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LHRyYW5zZm9ybTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50YnNoYXJlX3BvcHVwX21haW5bc3R5bGUqPVwiYmxvY2tcIl0gewogICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMCUsLTUwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuagueaNruebuOWFs+azleW+i+aUv+etli4uLiovCiAgICAgICAgICAgICAgICAuY29udGFpbmVyIC5pY29uLWF0dGVudGlvbnsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgCWhlaWdodDogYXV0bzsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogc3RhdGljOwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDA7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAwIDQwcHggMDsKICAgICAgICAgICAgICAgIAljb2xvcjogIzk5OTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5jb250YWluZXIgLmljb24tYXR0ZW50aW9uOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTAwMVwiOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIDAgMjBweCAwOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTAwcHg7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDEwMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrluJblrZDmoIfpopjmoIfor4YqLwogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgaTpub3QoLmljb24tYmF6aHVyZWNydWl0KTpub3QoLmljb24tYmF6aHVwdWJsaWNpdHkvKuaOkumZpOWQp+S4u+aKleelqOi0tOWSjOWFrOekuui0tCovKTpub3QoLmljb24tYmF6aHV2b3RlKXsKICAgICAgICAgICAgICAgIAlmbGV4OiAwIDAgYXV0bzsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltaW4td2lkdGg6IDIwcHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0Mjg1RjU7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwOwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IC0xcHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiAycHg7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc3R5bGU6IG5vcm1hbCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpOmJlZm9yZXsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgaTphZnRlcnsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIDRweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGkrLmpfdGhfdGl0IHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGU6bm90KC5wdWxsX2xlZnQpIHNwYW57CiAgICAgICAgICAgICAgICAJZmxleDogMCAwIGF1dG87CiAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogLTFweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlOm5vdCgucHVsbF9sZWZ0KSBzcGFuOmVtcHR5ewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpbWdbc3JjKj1cImlkaXNrLmdpZlwiXSwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGltZ1tzcmMqPVwiaWNvbl9icmlnaHRcIl17CiAgICAgICAgICAgICAgICAJZmxvYXQ6IHJpZ2h0OwogICAgICAgICAgICAgICAgCXdpZHRoOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiAyMHB4OwogICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAyMHB4OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweCAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY1OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHA6Ly83cHVuYmMuY29tMS56MC5nbGIuY2xvdWRkbi5jb20vdGllYmEtaWNvbi5zdmc/MjAxNjAzMjcpOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogMCAyMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdm9pY2U6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMzFkXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nYW1lLXR5cGUtbWluaS1nYW1lIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjRkY3MzJBOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS10eXBlLW1pbmktZ2FtZTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLlsI/muLjmiI9cIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW5vdmVsLXRoYW5rcyB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogI0ZGNjY2NjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW5vdmVsLXRoYW5rczphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmhJ/osKJcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW5vdmVsLWdlbnVpbmUsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1ub3ZlbC1jaGFwdGVyewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGRkE4MDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1ub3ZlbC1nZW51aW5lOmFmdGVyLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tbm92ZWwtY2hhcHRlcjphZnRlcnsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIueroOiKglwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS1mZWF0dXJlLXN0cmF0ZWd5OmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuetlueVpee7j+iQpVwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS1mZWF0dXJlLXNwb3J0czphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLkvZPogrLnq57pgJ9cIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nYW1lLWZlYXR1cmUtc2hvb3Rpbmc6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6aOe6KGM5bCE5Ye7XCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS1mZWF0dXJlLW5ldHdvcms6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi572R57uc5ri45oiPXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS1mZWF0dXJlLWNvc3BsYXk6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6KeS6Imy5omu5ryUXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS1mZWF0dXJlLWNhc3VhbDphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLkvJHpl7Lnm4rmmbpcIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nYW1lLWZlYXR1cmUtY2FyZHM6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5Y2h54mH5qOL54mMXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS1mZWF0dXJlLWFjdGlvbjphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLliqjkvZzlhpLpmalcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLWdhbWUtdHlwZS13ZWIgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGRjY2NjYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLWdhbWUtdHlwZS13ZWI6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi572R6aG15ri45oiPXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS10eXBlLW1vYmlsZSB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogI0ZGNjY2NgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ2FtZS10eXBlLW1vYmlsZTphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmiYvmnLrmuLjmiI9cIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nYW1lLXR5cGUtY2xpZW50IHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjRkY2NjY2CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nYW1lLXR5cGUtY2xpZW50OmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuWuouaIt+err+a4uOaIj1wiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW5vdmVsLXJld2FyZCB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogI0ZGNjY2NgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tbm92ZWwtcmV3YXJkOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuaNp+WculwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLXpoZW5nd2VuLWJvb2sgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGRjY2NjYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLXpoZW5nd2VuLWJvb2s6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6LS05ZCn5Y6f5YibXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZmItc29sdmVkIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjNURCNzcyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1mYi1zb2x2ZWQ6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAkgY29udGVudDogXCJcXGU4NzZcIjsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgMXB4OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDoxOXB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZmItc29sdmVkOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuW3suino+WGs1wiOwogICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1mYi1mb2xsb3dpbmcgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGRjY2NjY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1mYi1mb2xsb3dpbmc6YmVmb3JlIHsKICAgICAgICAgICAgICAgIAkgY29udGVudDogXCJcXGU4MGVcIjsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgMnB4OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLWZiLWZvbGxvd2luZzphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmraPlnKjot5/ov5tcIjsKICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW1hc3MtcmVzcG9uc2UgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGRjkxNEQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1tYXNzLXJlc3BvbnNlOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIuS4gOWRvOeZvuW6lFwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tZ3Vlc3NpbmcgewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGODIyMEM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1ndWVzc2luZzphZnRlciB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCLmi7PnjotcIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAudGJfdGFnX2ZvcndhcmQ6YWZ0ZXIsCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1yZXBvc3Q6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6L2s5biWXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpbWdbc3JjKj1cIm1lbWJlcnRvcF9pY29uLnBuZ1wiXSwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW1lbWJlci10b3AgewogICAgICAgICAgICAgIC8qCWJhY2tncm91bmQtY29sb3I6ICNGRkNDMjYgIWltcG9ydGFudDsqLwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW1lbWJlci10b3A6YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5Lya5ZGY572u6aG2XCI7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IC0xcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi10b3B7CiAgICAgICAgICAgICAgLyogICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY1ICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLW1lbWJlci10b3A6YmVmb3JlLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdG9wOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTE1NFwiOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNXB4KSByb3RhdGUoLTkwZGVnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGltZ1tzcmMqPVwibWVtYmVydG9wX2ljb24ucG5nXCJdLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgaW1nW3NyYyo9XCJ6ZGluZy5naWZcIl17CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGltZ1tzcmMqPVwidHBpYW8uZ2lmXCJdLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdm90ZSB7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogIzU1RDQ1RAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdm90ZTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUwMWRcIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGltZ1tzcmMqPVwidHBpYW8uZ2lmXCJdewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTgwcHg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdXNlci1tYXNrOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTE1ZFwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIAltYXJnaW46IDAgMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdXNlci1tYXNrOmFmdGVyewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6KKr5bGP6JS9XCI7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tYWN0aXZpdHk6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMTUzXCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgaW1nW3NyYyo9XCJqaW5nLmdpZlwiXSwKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLWdvb2R7CiAgICAgICAgICAgICAgLyoJYmFja2dyb3VuZC1jb2xvcjogI0ZGNjY2NiAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nb29kOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTgzOFwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IC0xcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpbWdbc3JjKj1cImppbmcuZ2lmXCJdewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTIwcHg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tbm90aWNlOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTgwYlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpbWdbc3JjKj1cImdvb2RhbGJ1bS5wbmdcIl0sCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nb29kLWFsYnVtewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGRjY2NjY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1nb29kLWFsYnVtOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTNkZlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpbWdbc3JjKj1cImdvb2RhbGJ1bS5wbmdcIl0sCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSBpbWdbc3JjKj1cInR1cGlhbi5naWZcIl17CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjBweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1saXZlc2hvdy1wcm9tb3RlcnsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjRkZBODI1OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tbGl2ZXNob3ctcHJvbW90ZXI6YWZ0ZXJ7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIuW4neeOi+i0tFwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLWlkaXNrIHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjU0cHggLTgxcHgKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLWlkaXNrOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGUyYzhcIjsKICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGltZ1tzcmMqPVwiaWRpc2suZ2lmXCJdewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTEwMHB4OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIGltZ1tzcmMqPVwiYmFrYW4uZ2lmXCJdLAogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tYmFrYW4gewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNFQUIwMjE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1iYWthbjpiZWZvcmUgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMGUwXCI7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgaW1nW3NyYyo9XCJiYWthbi5naWZcIl17CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDBweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi1waWN0dXJlOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcIlxcZTNkZlwiOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uX2ludGVydmlld19waWN0dXJlOmFmdGVyewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCLlm77niYfor53pophcIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi16aGFvaml7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogI2I3N2RmMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRsaXN0X3RpdGxlIC5pY29uLXpoYW9qaTphZnRlcnsKICAgICAgICAgICAgICAgIAljb250ZW50Olwi5Y+s6ZuGXCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGhyZWFkbGlzdF90aXRsZSAuaWNvbi11c2VyZGVmaW5lLWRpYW1vbmQtbWFsbHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjRkY2NjY2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZGxpc3RfdGl0bGUgLmljb24tdXNlcmRlZmluZS1kaWFtb25kLW1hbGw6YWZ0ZXJ7CiAgICAgICAgICAgICAgICAJY29udGVudDpcIuWkuuWunVwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8q5ZCn6K+m5oOF6aG1Ki8KICAgICAgICAgICAgICAgIC5jb250YWluZXJfd3JhcCAuY2FyZF90b3Bfd3JhcHsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmZvcnVtX2luZm9fd3JhcHsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyrlkKflub/mkq3pobUqLwogICAgICAgICAgICAgICAgLmNvbnRhaW5lcj4uY29udGVudHsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrluJblrZDliJfooajpobXor53popgqLwogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250ewogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDEycHggMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgICAgICAgICAJei1pbmRleDogNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRpdGxlQ250ewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0VGl0bGVDbnQgLmxpc3RSZXBseU51bSB7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl3aWR0aDogOCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltaW4td2lkdGg6IDc1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDE0cHggMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAtM3B4ICFpbXBvcnRhbnQ7CgogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgCWhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2OwogICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RUaXRsZUNudCAubGlzdFJlcGx5TnVtOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ1wnOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgCXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTAwJSk7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRpdGxlQ250IC5saXN0VXNlcnsKICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDE2JSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW1pbi13aWR0aDogMTU1cHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmctcmlnaHQ6IDIwcHggICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RUaXRsZUNudCAubGlzdFRocmVhZFRpdGxlewogICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmbGV4OiAxOwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWhlaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCW92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0VXNlciBhewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIAl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgICAgICAgIAl3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudG9waWNfdGhyZWFkX2Rhbm11LAogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0RGVzY0NudCwKICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdEJ0bkNudCwKICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRhbGtDbnQsCiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RQb3N0Q250LAogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0RWRpdG9yQ250IHsKICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogNzhweDsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDQwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiNpbnRlcnZpZXctc2hhcmUtd3JhcHBlciznibnmrornmoTku4rml6Xor53popjliIbkuqvmjInpkq4qLwogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5taW5pIC5mYWNlSWNvbi8qLAogICAgICAgICAgICAgICAgI2xpdmVJY29ue+inhumikeebtOaSrSovewogICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNpbnRlcnZpZXctc2hhcmUtd3JhcHBlcnsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgdG9wOiA1cHg7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogNTEwcHg7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmJ0bl9zbWFsbC8q5Li76aKY6LS05YiX6KGo54K55byA6LS05a2Q5Zu+54mH5ZCO77yM5Y+z5LiL6KeS55qE6L+b5YWl6LS05a2Q5oyJ6ZKuKi8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAl0b3A6LTEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0VGl0bGVDbnQgLmxpc3RUaHJlYWRUaXRsZSBhOmZpcnN0LW9mLXR5cGU6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwn5LuK5pel6K+d6aKYXCc7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogIzQyODVGNTsKICAgICAgICAgICAgICAgIAloZWlnaHQ6IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA0cHg7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKCiAgICAgICAgICAgICAgICAJZmxleDogMCAwIGF1dG87CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAxcHg7CiAgICAgICAgICAgICAgICAJbWFyZ2luLXJpZ2h0OiAycHg7CiAgICAgICAgICAgICAgICAJdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWZvbnQtc3R5bGU6IG5vcm1hbCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRpdGxlQ250IC5saXN0VGhyZWFkVGl0bGUgaW1nW3NyYyo9XCJpbnRlcnZpZXdfaWNvbi5naWZcIl0rYTpmaXJzdC1vZi10eXBlOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ+iuv+iwiOebtOaSrVwnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgLyrov5jlvLnluZUuLi7nnJ/nmoTnrJEs56yR5Ye65aOwKi8KICAgICAgICAgICAgICAgLyogIC5vcHVpLWJhcnJhZ2Utc2V0dXAgewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAl0b3A6IDA7CiAgICAgICAgICAgICAgICAJbGVmdDogMTAwJTsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwOwogICAgICAgICAgICAgICAgCWN1cnNvcjogcG9pbnRlcjsKCiAgICAgICAgICAgICAgICAJd2lkdGg6IDI0cHg7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCA2cHggNnB4IDA7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogLTJweCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDg3OUJEICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDEwcHggNnB4OwogICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDE2cHg7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLm9wdWktYmFycmFnZS1zZXR1cDpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCJcXGU1NmJcIjsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgIAlmb250LXN0eWxlOiBub3JtYWw7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgCWhlaWdodDogMjBweDsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAtMS41cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAub3B1aS1iYXJyYWdlLXNldHVwOmFmdGVyewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi5bGV5byA5by55bmVXCIKICAgICAgICAgICAgICAgIH0qLwoKICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubWluaXsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubWluaSAucGxhY2Vob2xkZXI6YmVmb3JlewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgIAlyaWdodDogOHB4OwogICAgICAgICAgICAgICAgCXRvcDogMnB4OwogICAgICAgICAgICAgICAgCWNvbG9yOiAjYWFhICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RUYWxrQ250LAogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0UG9zdENudHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wMSkgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4xKSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDZweCAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0R3JvdXBDbnR7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0SXRlbUNudHsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjA0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdEl0ZW1DbnQ6Zmlyc3Qtb2YtdHlwZXsKICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiBub25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAucEluZm9DbnQgLnBSZXBseSwKICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnBJbmZvQ250IC5wTG9naW4sCiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLnBUYWlsIC5wRnJvbXsKICAgICAgICAgICAgICAgIAljb2xvcjogIzk5OTsKICAgICAgICAgICAgICAgIAl0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAl0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50aHJlYWRMaXN0R3JvdXBDbnQ+Lmxpc3RQb3N0Q250Pi5saXN0VGl0bGV7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjBweCAhaW1wb3J0YW50Oy8q54m55q6K55qE5LuK5pel6K+d6aKY5ZCn5Y+L6K6o6K66Ki8KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiB1bnNldCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRocmVhZExpc3RHcm91cENudD4ubGlzdEJ0bkNudD4uc2xpZGVCdG57CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdW5zZXQgIWltcG9ydGFudDsvKuWxleW8gOeJueauiueahOS7iuaXpeivnemimOWQp+WPi+iuqOiuuiovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RUYWxrQ250IC5saXN0VGl0bGUsCiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RQb3N0Q250IC5saXN0VGl0bGV7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXotaW5kZXg6IDI7CiAgICAgICAgICAgICAgICAJbGVmdDogLTI1cHg7CiAgICAgICAgICAgICAgICAJdG9wOiAtMXB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiAyNHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogYXV0bzsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggMCAwIDZweDsKICAgICAgICAgICAgICAgIAlib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4xKTsKICAgICAgICAgICAgICAgIAlib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2ZlZmVmZTsKICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgCXdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAxMHB4IDZweDsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAxNnB4OwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2FhYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFBvc3RDbnQgLmxpc3RUaXRsZTpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDpcJ+WQp+WPi+iuqOiuulwnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RUYWxrQ250IC5saXN0VGl0bGU6YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCforr/osIjlhoXlrrlcJzsKICAgICAgICAgICAgICAgIAljb2xvcjogIzQ4NzlCRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RCdG5DbnQgLnNsaWRlQnRuewogICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwogICAgICAgICAgICAgICAgCWJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEpOwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgICAgICAgICAJY29sb3I6ICMyRDY0QjM7CiAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG87CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDZweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDZweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdEJ0bkNudCAuc2xpZGVCdG46YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwn5bGV5byAXCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RCdG5DbnQgLnNsaWRlQnRuOmFmdGVyIHsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ1xcZTMxM1wnOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyMHB4OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwOwogICAgICAgICAgICAgICAgCXdpZHRoOiAxNnB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAtMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLmludGVydmlldyAudGhyZWFkTGlzdEdyb3VwQ250IC5saXN0QnRuQ250IC5zbGlkZUJ0bi5kb3duewogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RCdG5DbnQgLnNsaWRlQnRuLmRvd246YmVmb3JlewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwn5pS26LW3XCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC50aHJlYWRMaXN0R3JvdXBDbnQgLmxpc3RCdG5DbnQgLnNsaWRlQnRuLmRvd246YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXFxlMzE2XCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaW50ZXJ2aWV3IC5saXN0QnRuQ250IC5saXN0X2Fubm91bmNlbWVudF9jbnR7CiAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5pbnRlcnZpZXcgLmxpc3RCdG5DbnQgLmxpc3RfYW5ub3VuY2VtZW50X2NudDpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCdcXGUwNTBcJzsKICAgICAgICAgICAgICAgIAlmb250LWZhbWlseTogXCdNYXRlcmlhbCBJY29uc1wnOwogICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgIAl0ZXh0LWluZGVudDogMDsKICAgICAgICAgICAgICAgIAljb2xvcjogI2FhYTsKICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qbGluay1pY29uKi8KICAgICAgICAgICAgICAgIC5hcGNfc3JjX3dyYXBwZXJ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDpub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuYXBjX3NyY193cmFwcGVyOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ1xcZTE1N1wnOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgCW1hcmdpbi1yaWdodDogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyror63pn7MqLwogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllciBhLnZvaWNlX3BsYXllcl9pbm5lcnsKICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDE2MHB4OwogICAgICAgICAgICAgICAgCWhlaWdodDogMjRweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjRweDsKICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAzcHggNHB4OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjA0KTsKICAgICAgICAgICAgICAgIAlib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsMCwwLC4wNCk7CiAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogbm9uZTsKICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjY7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllcl9taW5pewogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC52b2ljZV9wbGF5ZXJfbWluaSBhLnZvaWNlX3BsYXllcl9pbm5lcnsKICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudm9pY2VfcGxheWVyIC5taWRkbGV7CiAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCXRvcDogMDsKICAgICAgICAgICAgICAgIAlsZWZ0OiAwOwogICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllcl9taW5pIC5taWRkbGV7CiAgICAgICAgICAgICAgICAJdG9wOiAzcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudm9pY2VfcGxheWVyIC50aW1lIHsKICAgICAgICAgICAgICAgIAlwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJZmxvYXQ6IHJpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllciAuYmVmb3JlLAogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllciAuYWZ0ZXJ7CiAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllcl9pbm5lci5wbGF5aW5nLAogICAgICAgICAgICAgICAgLnZvaWNlX3BsYXllci5wbGF5aW5nIGEudm9pY2VfcGxheWVyX2lubmVyewogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1uYW1lOiBicmVhdGhlOwogICAgICAgICAgICAgICAgCSBhbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgICAgICAgICAgICAgCSBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICAgICAgICAgIAkgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1kaXJlY3Rpb246IGFsdGVybmF0ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgYnJlYXRoZSB7CiAgICAgICAgICAgICAgICAJZnJvbSB7Ym94LXNoYWRvdzppbnNldCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsMCk7fQogICAgICAgICAgICAgICAgCXRvIHtib3gtc2hhZG93Omluc2V0IDAgMCAxMHB4IHJnYmEoMCwwLDAsLjIpO30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC52b2ljZV9wbGF5ZXIgLnNwZWFrZXJ7CiAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCXZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudm9pY2VfcGxheWVyIC5zcGVha2VyOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ1xcZTAzN1wnOwogICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5sb2FkaW5nIC5zcGVha2VyOmJlZm9yZXsKICAgICAgICAgICAgICAgIAljb250ZW50OiBcJ1xcZTg2YVwnOwogICAgICAgICAgICAgICAgCWFuaW1hdGlvbi1uYW1lOiByb3RhdGU7CiAgICAgICAgICAgICAgICAJIGFuaW1hdGlvbi1kdXJhdGlvbjogMnM7CiAgICAgICAgICAgICAgICAJIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgICAgICAgICAgCSBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7CiAgICAgICAgICAgICAgICAJZnJvbSB7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTt9CiAgICAgICAgICAgICAgICAJdG8ge3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAucGxheWluZyAuc3BlYWtlcjpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCdcXGUwNDdcJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8q5Y+R5biW6K+d6aKYKi8KICAgICAgICAgICAgICAgIC50b3BpY19zdWdfYm94X3dyYXBwZXJ7CiAgICAgICAgICAgICAgICAJei1pbmRleDogOTk5OTsKICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAyMHB4OwogICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRiX3JpY2hfcG9zdGVyIC5wb3N0ZXJfYm9keSAudG9waWNfYWRkX2J0bnsKICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgCXJpZ2h0OiAwOwogICAgICAgICAgICAgICAgCWhlaWdodDogNDBweDsKICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogNDBweDsKICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIAlib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjA0KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDRweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlcjsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9yaWNoX3Bvc3RlciAucG9zdGVyX2JvZHkgLnRvcGljX2FkZF9idG46aG92ZXJ7CiAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnRiX3JpY2hfcG9zdGVyIC5wb3N0ZXJfYm9keSAudG9waWNfYWRkX2J0bjpiZWZvcmV7CiAgICAgICAgICAgICAgICAJY29udGVudDogXCcjXCc7CiAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IGZhbnRhc3k7CiAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAyMnB4OwogICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJTsKICAgICAgICAgICAgICAgIAl0b3A6IDUwJTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1kdXJhdGlvbjogLjVzOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudGJfcmljaF9wb3N0ZXIgLnBvc3Rlcl9ib2R5IC50b3BpY19hZGRfYnRuOmhvdmVyOmJlZm9yZXsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSB0cmFuc2xhdGVZKC0zOHB4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9yaWNoX3Bvc3RlciAucG9zdGVyX2JvZHkgLnRvcGljX2FkZF9idG46YWZ0ZXIgewogICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6K+d6aKYXCI7CiAgICAgICAgICAgICAgICAJY29sb3I6ICM2NjYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICAJcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgCWxlZnQ6IDUwJTsKICAgICAgICAgICAgICAgIAl0b3A6IDUwJTsKICAgICAgICAgICAgICAgIAl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSB0cmFuc2xhdGVZKDM4cHgpOwogICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTsKICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNXM7CiAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC50Yl9yaWNoX3Bvc3RlciAucG9zdGVyX2JvZHkgLnRvcGljX2FkZF9idG46aG92ZXI6YWZ0ZXJ7CiAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKuW4luWtkOWGhemhteaKleelqCovCiAgICAgICAgICAgICAgICAjdm90ZUZsYXNoUGFuZWwgLnZvdGVfYnV0dG9ucyBidXR0b257CiAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAudm90ZV9wcm9ncmVzc19iYXNlewogICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnZvdGVfcHJvZ3Jlc3NfYmFyX2NvbnRhaW5lciB7CiAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMHB4OwogICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnZvdGVfcHJvZ3Jlc3NfYmFyewogICAgICAgICAgICAgICAgCWhlaWdodDogMTBweDsKICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAuODsKICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC5zcHJlYWRfYnRuewogICAgICAgICAgICAgICAgCXotaW5kZXg6IDk5OTsKICAgICAgICAgICAgICAgIH1gOwoKICAgICAgICAgICAgaWYgKGZhbHNlIHx8IChuZXcgUmVnRXhwKCJeaHR0cHM/Oi8vKHRpZWJhLmJhaWR1LmNvbXx3d3cudGllYmEuY29tKSgvKnwoPyEvK3RibWFsbC8rKS4qKSQiKSkudGVzdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkgewogICAgICAgICAgICAgICAgY3NzICs9IGAKICAgICAgICAgICAgICAgICAgICAvKlTpgJfllYbln47ku6XlpJbnmoTpobXpnaIqLwogICAgICAgICAgICAgICAgICAgIC8q5Li75L2T5qGG5p62Ki8KICAgICAgICAgICAgICAgICAgICAuZm9ydW1faW5mb193cmFwLAogICAgICAgICAgICAgICAgICAgIC5nb29kX2xpc3Rfb3V0ZXIsCiAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnQgewogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDIwcHggYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjRmRGZEZkICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKICAgICAgICAgICAgICAgICAgICAJLypib3JkZXI6IDFweCBzb2xpZCAjREJEQ0UwICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJbWluLWhlaWdodDogMDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMjBweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnNraW5fMjEwMyBbaWQ9XCJwYWdlbGV0X2Zycy1oZWFkZXIvcGFnZWxldC9oZWFkXCJdLAogICAgICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fYm9keSBbaWQ9XCJwYWdlbGV0X2Zycy1oZWFkZXIvcGFnZWxldC9oZWFkXCJdLAogICAgICAgICAgICAgICAgICAgIC5oZWFkX3RvcCwKICAgICAgICAgICAgICAgICAgICAuaGVhZF9jb250ZW50LAogICAgICAgICAgICAgICAgICAgIC5jYXJkX2Jhbm5lciB7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDIwcHggMjBweCAwIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICNtYWluX3dyYXBwZXIgI2Zvb3RlciwKICAgICAgICAgICAgICAgICAgICAucGJfZm9vdGVyLAogICAgICAgICAgICAgICAgICAgIC5mb290LAogICAgICAgICAgICAgICAgICAgIC5mb3J1bV9mb290LAogICAgICAgICAgICAgICAgICAgIC5nb29kX2xpc3RfaW5uZXJ7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDAgMCAyMHB4IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mb290LAogICAgICAgICAgICAgICAgICAgIC5wbGF0X3NraW4gLndyYXAxLAogICAgICAgICAgICAgICAgICAgIC5za2luXzIxMDMgLndyYXAxLAogICAgICAgICAgICAgICAgICAgIC5hcHBfZm9ydW1fYm9keSAud3JhcDEsCiAgICAgICAgICAgICAgICAgICAgLmhlYWRfbWFpbiAuaGVhZF9taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgLmhlYWRfbWFpbiAuaGVhZF9jb250ZW50LAogICAgICAgICAgICAgICAgICAgIC5zZWFyY2hfZm9ybV9maXhlZCwKICAgICAgICAgICAgICAgICAgICAuc2VhcmNoX2JyaWdodCwKICAgICAgICAgICAgICAgICAgICAubF9jb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgLmZvcnVtX2luZm9fd3JhcCwKICAgICAgICAgICAgICAgICAgICAuZ29vZF9saXN0X291dGVyLAogICAgICAgICAgICAgICAgICAgIC5jb250ZW50ewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogOTgwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAvKi50YnVpX2FzaWRlX2Zsb2F0X2JhciB7CiAgICAgICAgICAgICAgICAgIAkgbWFyZ2luLWxlZnQ6IDg2JSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICBsZWZ0OnVuc2V0O+ino+WGs+WPs+S+p+W3peWFt+agj+a2iOWksWJ1ZwogICAgICAgICAgICAgICAgICAJIG1hcmdpbi1sZWZ0OiBjYWxjKDk4NXB4IC8gMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDYwMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgICAgICAuY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQgewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogY2FsYyg5ODBweCArIDU4cHgpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5sX2NvbnRhaW5lciAuY29udGVudHsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTBweDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mb3J1bV9pbmZvX3dyYXAsCiAgICAgICAgICAgICAgICAgICAgLmdvb2RfbGlzdF9vdXRlcnsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTBweDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5oZWFkZXJ+LmNvbnRlbnQgewogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDAgYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwOwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmhlYWRfY29udGVudCwKICAgICAgICAgICAgICAgICAgICAuZm9vdCB7CiAgICAgICAgICAgICAgICAgICAgCWJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKICAgICAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgICAgICAJLypib3JkZXI6IDFweCBzb2xpZCAjREJEQ0UwICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXRvcDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAjbWFpbl93cmFwcGVyICNmb290ZXIsCiAgICAgICAgICAgICAgICAgICAgLmlib2R5LAogICAgICAgICAgICAgICAgICAgIGJvZHk6bm90KC5hcHBfZm9ydW1fYm9keSk6bm90KC5za2luXzIxMDMpIC5oZWFkX3RvcCwKICAgICAgICAgICAgICAgICAgICAuYXBwX2ZvcnVtX2JvZHkgLmFwcC1oZWFkZXItd3JhcHBlciwKICAgICAgICAgICAgICAgICAgICAuc2tpbl8yMTAzIC5hcHAtaGVhZGVyLXdyYXBwZXIsCiAgICAgICAgICAgICAgICAgICAgLmZvcnVtX2NvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgLmhlYWRfY29udGVudCwKICAgICAgICAgICAgICAgICAgICAuZm9vdHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI0ZkRmRGZDsvKiFpbXBvcnRhbnQg6IOM5pmv6ImyIOaciWJ1ZyBodHRwOi8vdGllYmEuYmFpZHUuY29tL2kvaS9zdG9yZXRocmVhZCovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5pYm9keSAudzc1MCwKICAgICAgICAgICAgICAgICAgICBbaWQ9XCJwYWdlbGV0X2VuY291cmFnZS1hcHBmb3J1bS9wYWdlbGV0L2hlYWRfdG9wXCJdLAogICAgICAgICAgICAgICAgICAgIFtpZD1cInBhZ2VsZXRfbmF2aWdhdGlvbi9wYWdlbGV0L25hdmlnYXRpb25cIl0sCiAgICAgICAgICAgICAgICAgICAgW2lkPVwicGFnZWxldF9wb3N0ZXIvcGFnZWxldC9yaWNoX3Bvc3RlclwiXXsKICAgICAgICAgICAgICAgICAgICAJLyrpga7nm5bpmLTlvbEqLwogICAgICAgICAgICAgICAgICAvKgliYWNrZ3JvdW5kOiAjRmRGZEZkOyAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAJei1pbmRleDogMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmhlYWRfY29udGVudCB7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmZvb3QgewogICAgICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDUwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC5oZWFkX2NvbnRlbnQgewogICAgICAgICAgICAgICAgICAgIAlib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5nb29kX2xpc3Rfb3V0ZXIgLmNhcmRfdG9wX3dyYXAsCiAgICAgICAgICAgICAgICAgICAgLmZvcnVtX2luZm9fd3JhcCAuY2FyZF90b3Bfd3JhcCwKICAgICAgICAgICAgICAgICAgICAucGxhdF9yZWNvbV9jYXJvdXNlbCwKICAgICAgICAgICAgICAgICAgICAuc3Rhcl9oZWFkLAogICAgICAgICAgICAgICAgICAgIC5zdGFyX2Jhbm5lciwKICAgICAgICAgICAgICAgICAgICAudmVydGljYWxfY2FyZF9iYW5uZXIsCiAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnQ+LmNhcmRfdG9wX3dyYXAsCiAgICAgICAgICAgICAgICAgICAgLmZvcnVtX2hlYWRlciwKICAgICAgICAgICAgICAgICAgICAucGxhdF9oZWFkLAogICAgICAgICAgICAgICAgICAgIC5wbGF0X2Jhbm5lcnsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5oZWFkX3RvcHsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogMzBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuaGVhZF90b3ArLmhlYWRfY29udGVudHsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnBsYXRfYmFubmVyewogICAgICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAucGJfZm9vdGVyIHsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAucGJfZm9vdGVyIHsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLWxlZnQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJpZ2h0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mb3J1bV9jb250ZW50IHsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJpZ2h0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1sZWZ0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJei1pbmRleDogMzsKICAgICAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZm9ydW1fZm9vdCB7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1yaWdodDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItbGVmdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mcnNfY29udGVudF9mb290ZXJfcGFnZWxldCB7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmZvcnVtX2Zvb3QsCiAgICAgICAgICAgICAgICAgICAgLmZyc19jb250ZW50X2Zvb3Rlcl9wYWdlbGV0IHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDpub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mb290ZXIgewogICAgICAgICAgICAgICAgICAgIAljbGVhcjogYm90aDsKICAgICAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIycHg7CiAgICAgICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMjBweCAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgICAgIAljb2xvcjogI2JiYiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZm9vdGVyICogewogICAgICAgICAgICAgICAgICAgIAljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLyrlhajlsY/nvJbovpHmoYYqLwogICAgICAgICAgICAgICAgICAgIC50Yi11ZWRpdG9yLWZ1bGxzY3JlZW4gW2lkPVwicGFnZWxldF9wb3N0ZXIvcGFnZWxldC9yaWNoX3Bvc3RlclwiXSwKICAgICAgICAgICAgICAgICAgICAudGItdWVkaXRvci1mdWxsc2NyZWVuIC50Yl9yaWNoX3Bvc3Rlcl9jb250YWluZXJ7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXotaW5kZXg6IDEwMDAwICFpbXBvcnRhbnQKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC50Yi11ZWRpdG9yLWZ1bGxzY3JlZW4gLnBvc3Rlcl9oZWFkLAogICAgICAgICAgICAgICAgICAgIC5wb3N0ZXJfY2xlYXJfZnVsbHNjcmVlbnsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLnRiLXVlZGl0b3ItZnVsbHNjcmVlbiAjcmljaF91ZWRpdG9yX3RwbHsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZy10b3A6IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDk4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICNGZEZkRmQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZy1ib3R0b206IDQwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwIDAgMjBweCAyMHB4OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLnRiLXVlZGl0b3ItZnVsbHNjcmVlbiAuZWR1aS1ib2R5LWNvbnRhaW5lcnsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiA2MHZoOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLmZ1bGxzY3JlZW4td29yZC1saW1pdHsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZhbHNlIHx8IChuZXcgUmVnRXhwKCJeaHR0cHM/Oi8vKHRpZWJhLmJhaWR1LmNvbXx3d3cudGllYmEuY29tKSgvKnwoPyEvK2hvbWUvKykuKikkIikpLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgICAgIGNzcyArPSBgCiAgICAgICAgICAgICAgICAgICAgLyrkuKrkurrkuLvpobXku6XlpJbnmoTpobXpnaIqLwoKICAgICAgICAgICAgICAgICAgICAud3JhcDEsCiAgICAgICAgICAgICAgICAgICAgLndyYXAyIHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYm9keTpub3QoLmFwcF9mb3J1bV9ib2R5KTpub3QoLnNraW5fMjEwMykgLndyYXAxLAogICAgICAgICAgICAgICAgICAgIC53cmFwMnsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH1gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmYWxzZSB8fCAobmV3IFJlZ0V4cCgiXmh0dHBzPzovLyh0aWViYS5iYWlkdS5jb218d3d3LnRpZWJhLmNvbSkvK3AvKy4qJCIpKS50ZXN0KGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgICAgICAgICBjc3MgKz0gYAogICAgICAgICAgICAgICAgICAgLyrluJblrZDlhoXpobXosIPmlbQqLwoKICAgICAgICAgICAgICAgICAgIC50YnVpX2FzaWRlX2Zsb2F0X2JhciB7CiAgICAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMHB4OwogICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICNjb250YWluZXIgewogICAgICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDgwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIC50Yl9yaWNoX3Bvc3Rlcl9jb250YWluZXI+LnRiX3JpY2hfcG9zdGVyIC5wb3N0ZXJfaGVhZF90ZXh0ewogICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjNjY2OwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgLnRiX3JpY2hfcG9zdGVyX2NvbnRhaW5lcj4udGJfcmljaF9wb3N0ZXIgLnBvc3Rlcl9oZWFkX3RleHQ6YmVmb3JlewogICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6XCJcXGUyNTNcIjsKICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDI0cHg7CiAgICAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgICAgIAl0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAJY29sb3I6ICM3Nzc7CiAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiAwIC00cHg7CiAgICAgICAgICAgICAgICAgICB9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmFsc2UgfHwgKG5ldyBSZWdFeHAoIl5odHRwcz86Ly8odGllYmEuYmFpZHUuY29tfHd3dy50aWViYS5jb20pLytwLytcXGQrLipcXD8oLiomKSpzZWVfbHo9WzEtOV0rXFxkKi4qJCIpKS50ZXN0KGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgICAgICAgICBjc3MgKz0gYAogICAgICAgICAgICAgICAgICAgIC8q5biW5a2Q5YaF6aG1LeWPqueci+alvOS4uyovCgogICAgICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2J0bnMgI2x6b25seV9jbnRuOmJlZm9yZSB7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlOGY1XCIgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAzMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5jb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCAuY29yZV90aXRsZV9idG5zICNsem9ubHlfY250bjpiZWZvcmUgewogICAgICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDM0cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmRfbHpvbmx5X2JkYXNpZGU6YmVmb3JlIHsKICAgICAgICAgICAgICAgICAgICAJY29udGVudDogXCLlj5bmtohcIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmxvdXpodWJpYW9zaGlfd3JhcCB7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmFsc2UgfHwgKG5ldyBSZWdFeHAoIl5odHRwcz86Ly8odGllYmEuYmFpZHUuY29tfHd3dy50aWViYS5jb20pLytob21lLysuKiQiKSkudGVzdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkgewogICAgICAgICAgICAgICAgY3NzICs9IGAKICAgICAgICAgICAgICAgICAgICAvKuS4quS6uuS4u+mhtSovCiAgICAgICAgICAgICAgICAgICAgLyrov7fkuYvpobXpnaLnu5PmnoQuLi7ml6DlipvlkJDmp70uLi4uKi8KCiAgICAgICAgICAgICAgICAgICAgYm9keT4ud3JhcDEgewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogOTgwcHg7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1yYWRpdXM6IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgCW92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCS8qYm9yZGVyOiAxcHggc29saWQgI0RCRENFMCAhaW1wb3J0YW50OyovCiAgICAgICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciAtMjBweDsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luLXRvcDogOTBweDsKICAgICAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuaGVhZGluZm9fd3JhcCB7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAyMHB4OwogICAgICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAjaGVhZCB7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgCXRvcDogLTgwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnNlYXJjaF9icmlnaHR7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiA5ODJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAudXNlcmluZm9fd3JhcCB7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuY29udGFpbmVyX3dyYXAgewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI0ZkRmRGZCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAwIDAgMjBweCAyMHB4OwogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5sZWZ0X2FzaWRlIHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnJpZ2h0X2FzaWRlIHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnJpZ2h0X2FzaWRlID4gKiB7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJei1pbmRleDogMjsKICAgICAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAucmlnaHRfYXNpZGU6YmVmb3JlIHsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDIzOXB4OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItdG9wOiAxcHggc29saWQgI2UwZTBlMDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZTBlMGUwOwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wMik7CiAgICAgICAgICAgICAgICAgICAgCXotaW5kZXg6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmlob21lX25hdl93cmFwIHsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mb290ZXIgewogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgCWxlZnQ6IDUwJTsKICAgICAgICAgICAgICAgICAgICAJYm90dG9tOiAtNTBweDsKICAgICAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuY29udGVudF93cmFwewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogNzQycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmZpeC1mb3ItaWU4ewogICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8q6Kej5Yaz6L+U5Zue6aG26YOo5oyJ6ZKu5pi+56S66ZSZ5L2N6Zeu6aKYKi8KICAgICAgICAgICAgICAgICAgICAudGJ1aV9hc2lkZV9mbG9hdF9iYXIgewogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogOTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgLyoJbWFyZ2luLWxlZnQ6IDYwMHB4ICFpbXBvcnRhbnQ7Ki8KICAgICAgICAgICAgICAgICAgICB9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmFsc2UgfHwgKG5ldyBSZWdFeHAoIl5odHRwcz86Ly8odGllYmEuYmFpZHUuY29tfHd3dy50aWViYS5jb20pLysoaW5kZXguaHRtbC4qKSooW1xcPyNdKy4qKSokIikpLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgICAgIGNzcyArPSBgCiAgICAgICAgICAgICAgICAgICAgLyrotLTlkKfpppbpobUqLwogICAgICAgICAgICAgICAgICAgIC5oZWFkX3JpZ2h0X3JlZ2lvbnsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5zZWFyY2hfbG9nbyB7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuc2VhcmNoX3RvcDpiZWZvcmV7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiRGVzZ2luIGJ5IE1hdmVyaWNrXCI7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMDsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiA2MHB4OwogICAgICAgICAgICAgICAgICAgIAloZWlnaHQ6IDMwcHg7CiAgICAgICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgI3NwYWdlLXRic2hhcmUtY29udGFpbmVyewogICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZm9vdGVyLAogICAgICAgICAgICAgICAgICAgIC5tYWluLXNlY3sKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI0ZkRmRGZCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3gtc2hhZG93OiAwIDAgMjBweCAycHggcmdiYSgwLCAwLCAwLCAuMSk7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLm1haW4tc2VjewogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAyMHB4IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLm1haW4tc2VjPmRpdnsKICAgICAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIAl6LWluZGV4OiAzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYm90dG9tLWJnIHsKICAgICAgICAgICAgICAgICAgICAJYm90dG9tOiAwOwogICAgICAgICAgICAgICAgICAgIAlsZWZ0OiAwOwogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAJei1pbmRleDogMiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjRmRGZEZkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZm9vdGVyewogICAgICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMjBweDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nLXRvcDogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiAgMCAwIDIwcHggMjBweDsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZm9vdGVyIHAgewogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnRidWlfYXNpZGVfZmxvYXRfYmFyIHsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luLWxlZnQ6IDUxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC53cmFwMjpiZWZvcmUgewogICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZhbHNlIHx8IChuZXcgUmVnRXhwKCJeaHR0cHM/Oi8vKHRpZWJhLmJhaWR1LmNvbXx3d3cudGllYmEuY29tKS8raS8rLiokIikpLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgICAgIGNzcyArPSBgCiAgICAgICAgICAgICAgICAgICAgLypp6LS05ZCnKi8KICAgICAgICAgICAgICAgICAgICAjbWFpbl93cmFwcGVyICNmb290ZXIsCiAgICAgICAgICAgICAgICAgICAgLmlib2R5ewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogOTgwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgI2Zvb3RlcnsvKi5mb290ZXJ7Ki8KICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46YXV0bzsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAjY29udGVudHsKICAgICAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAxMHB4OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nLXRvcDogNDBweDsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5tYWluX2hlYWRlciwKICAgICAgICAgICAgICAgICAgICAuaWJvZHksCiAgICAgICAgICAgICAgICAgICAgLmZvb3RlcnsKICAgICAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAubWFpbl9oZWFkZXJ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZC1jb2xvcjogIzQ4NzlCRDsKICAgICAgICAgICAgICAgICAgIC8qCWJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwOi8vb25veC5xaW5pdWRuLmNvbS9tYXZlcmljay9saW5lcy5zdmcpOyovCiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0OwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMDsKICAgICAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiA2MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLm5hdl9iYXJ7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgCWJvdHRvbTogMDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAycHg7CiAgICAgICAgICAgICAgICAgICAgCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5uYXZfYmFyPmxpewogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLm5hdl9iYXI+bGkgYXsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlmb250LXdlaWdodDogbm9ybWFsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMzJweCAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLm5hdl9iYXI+bGkgYTpob3ZlcnsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMTYpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5uYXZfYmFyPmxpLm5hdl9jdXIgYXsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2YyZjJmMiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAljb2xvcjogIzQ4NzlCRCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYV9wX3RpdGxlLAogICAgICAgICAgICAgICAgICAgIC5uYXZfaXRlbV9ob3RfZmxhZywKICAgICAgICAgICAgICAgICAgICAudGJfaWNvbl9uZXd7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnN1Yl9uYXZ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuc3ViX25hdj51bCwKICAgICAgICAgICAgICAgICAgICAudGFiX2NvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAJdG9wOiAwOwogICAgICAgICAgICAgICAgICAgIAlsZWZ0OiAwOwogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZjJmMmYyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDFweCByZ2JhKDAsMCwwLC4wNCkgc29saWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5zdWJfbmF2PnVsPmxpLAogICAgICAgICAgICAgICAgICAgIC50YWJfY29udGVudD5saXsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCAyMHB4OwogICAgICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogNDBweCAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnN1Yl9uYXY+dWw+bGkgYSwKICAgICAgICAgICAgICAgICAgICAudGFiX2NvbnRlbnQ+bGkgYXsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlmb250LXdlaWdodDogbm9ybWFsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5zdWJfbmF2PnVsPmxpIGE6aG92ZXIsCiAgICAgICAgICAgICAgICAgICAgLnRhYl9jb250ZW50PmxpIGE6aG92ZXJ7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsLjE2KSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuc3ViX25hdj51bD5saS5jdXJyZW50IGEsCiAgICAgICAgICAgICAgICAgICAgLnRhYl9jb250ZW50PmxpLnRhYl9jdXIgYXsKICAgICAgICAgICAgICAgICAgICAJY29sb3I6ICM0ODc5QkQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRfYXNpZGV7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAJdG9wOiAtNjBweDsKICAgICAgICAgICAgICAgICAgICAJbGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiA2MHB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAudzc1MHsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgCWZsb2F0OiBub25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZmVlZHsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgNnB4OwogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgI3hpYW5nY2V7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfbWVudXsKICAgICAgICAgICAgICAgICAgICAJZmxvYXQ6IGxlZnQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tdG9wOiAyOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweCFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiBhdXRvOwogICAgICAgICAgICAgICAgICAgIAloZWlnaHQ6IDMycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDMycHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX21lbnU+dWw+bGl7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtd2VpZ2h0OiBub3JtYWwgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX21lbnU+dWw+bGkgYXsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX21lbnU+dWw+bGkgYTpob3ZlcnsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMTYpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5hc2lkZV9tZW51PnVsPmxpLnNlbHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogI2YyZjJmMiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAljb2xvcjogIzQ4NzlCRCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX2hvbWVfbGl7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3BlcnNvbl9pbmZvewogICAgICAgICAgICAgICAgICAgIAlmbG9hdDogbGVmdDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDhweCAxMHB4ICAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogNnB4IDAgNnB4IDA7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQtY29sb3I6ICM0ODc5QkQ7CiAgICAgICAgICAgICAgICAgICAgCWhlaWdodDogNDBweDsKICAgICAgICAgICAgICAgICAgICAJb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbjogaGVpZ2h0IC40cyBlYXNlOwogICAgICAgICAgICAgICAgICAgIAl6LWluZGV4OiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfcGVyc29uX2luZm86YWZ0ZXJ7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXCc7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAJbGVmdDowOwogICAgICAgICAgICAgICAgICAgIAl0b3A6MDsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgCWhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMSk7CiAgICAgICAgICAgICAgICAgICAgCW9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICAgICAgCXRyYW5zaXRpb246IG9wYWNpdHkgLjRzIGVhc2U7CiAgICAgICAgICAgICAgICAgICAgCXBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfcGVyc29uX2luZm86aG92ZXJ7CiAgICAgICAgICAgICAgICAgICAgCWhlaWdodDogMTE1cHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5hc2lkZV9wZXJzb25faW5mbzpob3ZlcjphZnRlcnsKICAgICAgICAgICAgICAgICAgICAJb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3BlcnNvbl9pbmZvPmRpdjpub3QoLnVpX2J1YmJsZV93cmFwKXsKICAgICAgICAgICAgICAgICAgICAJcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIAl6LWluZGV4OiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfcF9pbmZvX2hlYWR7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAl6LWluZGV4OiAyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5yaWdodF9zZXR7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAJbGVmdDogMnB4OwogICAgICAgICAgICAgICAgICAgIAl0b3A6IDJweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnJpZ2h0X3NldCBhewogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAJaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDA7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjQpOwogICAgICAgICAgICAgICAgICAgIAlvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgICAgIAl0cmFuc2l0aW9uOiBvcGFjaXR5IC40cyBlYXNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAucmlnaHRfc2V0IGE6aG92ZXJ7CiAgICAgICAgICAgICAgICAgICAgCW9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5yaWdodF9zZXQgYTpiZWZvcmV7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXFxlOGI4XCc7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDI4cHg7CiAgICAgICAgICAgICAgICAgICAgCXBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAJbGVmdDogNTAlOwogICAgICAgICAgICAgICAgICAgIAl0b3A6IDUwJTsKICAgICAgICAgICAgICAgICAgICAJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwtNTAlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3BlcnNvbl9pbmZvX3dyYXBlciwKICAgICAgICAgICAgICAgICAgICAuYXNpZGVfdXNlcmZhY2Vfd3JhcGVyLAogICAgICAgICAgICAgICAgICAgICNpbWdfYXNpZGVfaGVhZCwKICAgICAgICAgICAgICAgICAgICAuYXNpZGVfdXNlcl9wcm9maWxlewogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfdXNlcmZhY2Vfd3JhcGVyewogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5yaWdodF9zZXQsCiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3VzZXJmYWNlX2JvcmRlciwKICAgICAgICAgICAgICAgICAgICAjaW1nX2FzaWRlX2hlYWR7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiA0MHB4ICAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAloZWlnaHQ6IDQwcHggICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5hc2lkZV91c2VyZmFjZV9ib3JkZXJ7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDJweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3VzZXJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAuYXNpZGVfdXNlcl9pbmZvLAogICAgICAgICAgICAgICAgICAgIC5hc2lkZV91c2VyX2ZhbnMsCiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3VzZXJfY29uY2VybiwKICAgICAgICAgICAgICAgICAgICAubXlfdGJfcG1jbGluaywKICAgICAgICAgICAgICAgICAgICAubXlfdGJfcG1jbGluayBhLAogICAgICAgICAgICAgICAgICAgIC5hc2lkZV9pbnRlcmFjdF9udW17CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5hc2lkZV91c2VyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgLmFzaWRlX3VzZXJfaW5mb3sKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZy1sZWZ0OiA1NHB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfdXNlcl9mYW5zLAogICAgICAgICAgICAgICAgICAgIC5hc2lkZV91c2VyX2NvbmNlcm4sCiAgICAgICAgICAgICAgICAgICAgLm15X3RiX3BtY2xpbmt7CiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1MHB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYXNpZGVfdXNlcl9pbmZvOmVtcHR5OmJlZm9yZXsKICAgICAgICAgICAgICAgICAgICAJY29udGVudDpcJ1xcZTAxNlwnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAubmV3X3JlcGx5X251bV90aXB7CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDRweDsKICAgICAgICAgICAgICAgICAgICAJcGFkZGluZzogMCA2cHg7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsLjIpOwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5uZXdfcmVwbHlfbnVtX3RpcDplbXB0eXsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAjZmVhdHVyZUxpc3QgewogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbi10b3A6IDEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnN1Yl90YWJfY29udGVudHsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJbWFyZ2luOiA4cHggMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuc3ViX3RhYiBhIHsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjOTk5OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwIDEwcHg7CiAgICAgICAgICAgICAgICAgICAgCWJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjEpOwogICAgICAgICAgICAgICAgICAgIAlib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAlsaW5lLWhlaWdodDogMjJweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnN1Yl90YWJfY3VyIGF7CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjNDI4NUY0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgLnNpbXBsZV9ibG9ja19jb250YWluZXIgbGksCiAgICAgICAgICAgICAgICAgICAgLmZlZWRfaXRlbSB7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsMCwwLC4wNikgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmJsb2NrOmxhc3Qtb2YtdHlwZSwKICAgICAgICAgICAgICAgICAgICAuc2ltcGxlX2Jsb2NrX2NvbnRhaW5lciBsaTpsYXN0LW9mLXR5cGUsCiAgICAgICAgICAgICAgICAgICAgLmZlZWRfaXRlbTpsYXN0LW9mLXR5cGV7CiAgICAgICAgICAgICAgICAgICAgCWJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmZlZWRfaG92ZXIgewogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wMik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mZWVkX2l0ZW0gewogICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5mZWVkX2xlZnQgewogICAgICAgICAgICAgICAgICAgIAlmbGV4OiAxOwogICAgICAgICAgICAgICAgICAgIAlmbG9hdDogbm9uZTsKICAgICAgICAgICAgICAgICAgICAJd2lkdGg6IDA7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDIwcHggMTBweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmZlZWRfcmlnaHQgewogICAgICAgICAgICAgICAgICAgIAlwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmc6IDAgMTBweCAyMHB4IDA7CiAgICAgICAgICAgICAgICAgICAgCWJvdHRvbTogMDsKICAgICAgICAgICAgICAgICAgICAJcmlnaHQ6IDA7CiAgICAgICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiAyMnB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZmVlZF90aW1lLAogICAgICAgICAgICAgICAgICAgIC5pY29uX3JlcGx5ewogICAgICAgICAgICAgICAgICAgIAlmbG9hdDogcmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgCW1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICAgICAgICAgICAgICAgIAlwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWxpbmUtaGVpZ2h0OiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuaWNvbl9yZXBseSBhewogICAgICAgICAgICAgICAgICAgIAljb2xvcjogI2FhYTsKICAgICAgICAgICAgICAgICAgICAJYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAltYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmljb25fcmVwbHkgYTpiZWZvcmV7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXFxlMjUzXCc7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtZmFtaWx5OiBcJ01hdGVyaWFsIEljb25zXCc7CiAgICAgICAgICAgICAgICAgICAgCWRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICAJZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgICAgICAgIAl2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmljb25fcmVwbHkgLnJlcGx5X2RlbDpiZWZvcmV7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwnXFxlODcyXCc7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnJlcGx5X2RlbHsKICAgICAgICAgICAgICAgICAgICAJZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnNob3dEZWxCdG4gLnJlcGx5X2RlbHsKICAgICAgICAgICAgICAgICAgICAJdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLmdvVG9wewogICAgICAgICAgICAgICAgICAgIAliYWNrZ3JvdW5kOiAjZmVmZWZlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXdpZHRoOiA0NXB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCWhlaWdodDogNTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tbGVmdDogNDkwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm9yZGVyLXJhZGl1czogMCAxMHB4IDEwcHggMDsKICAgICAgICAgICAgICAgICAgICAJYm94LXNoYWRvdzogMnB4IDJweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpOwogICAgICAgICAgICAgICAgICAgIAlvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgIAlmb250LXNpemU6IDA7CiAgICAgICAgICAgICAgICAgICAgCXdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAtNDVweDsKICAgICAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi1wcm9wZXJ0eTogdGV4dC1pbmRlbnQ7CiAgICAgICAgICAgICAgICAgICAgCXRyYW5zaXRpb24tZHVyYXRpb246IC42czsKICAgICAgICAgICAgICAgICAgICAJdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5nb1RvcDpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgCXRleHQtaW5kZW50OiAwcHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5nb1RvcDphZnRlciwKICAgICAgICAgICAgICAgICAgICAuZ29Ub3A6YmVmb3JlewogICAgICAgICAgICAgICAgICAgIAlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAgICAgCWNvbG9yOiAjY2NjOwogICAgICAgICAgICAgICAgICAgIAl3aWR0aDogaW5oZXJpdCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIAloZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgICAgICAJdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICAgICAgICAgICAgICAJd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5nb1RvcDpiZWZvcmV7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwi6L+U5Zue6aG26YOoXCI7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmctdG9wOiA1cHg7CiAgICAgICAgICAgICAgICAgICAgCXBhZGRpbmctbGVmdDogN3B4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuZ29Ub3A6YWZ0ZXJ7CiAgICAgICAgICAgICAgICAgICAgCWNvbnRlbnQ6IFwiXFxlMjU1XCI7CiAgICAgICAgICAgICAgICAgICAgCWZvbnQtc2l6ZTogMzJweDsKICAgICAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IFwnTWF0ZXJpYWwgSWNvbnNcJzsKICAgICAgICAgICAgICAgICAgICAJbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAJdGV4dC1pbmRlbnQ6IC0ycHg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAuaXRiX3BhZ2VyID4qewogICAgICAgICAgICAgICAgICAgIAltYXJnaW4tcmlnaHQ6IDRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAucGFnZXJ7CiAgICAgICAgICAgICAgICAgICAgCWZsb2F0OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgCXRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnBhZ2VyLAogICAgICAgICAgICAgICAgICAgIC5wYWdlciA+KnsKICAgICAgICAgICAgICAgICAgICAJZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAJbGVmdDogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIH1gOwogICAgICAgICAgICAgICAgLy/nrqHnlKjmiLflpLTlg4/moI/nmoQgaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9pL2kvKgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgR01fYWRkU3R5bGUgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgR01fYWRkU3R5bGUoY3NzKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBQUk9fYWRkU3R5bGUgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgUFJPX2FkZFN0eWxlKGNzcyk7IC8v5pyJ6K2m5ZGKCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWRkU3R5bGUgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgYWRkU3R5bGUoY3NzKTsgLy/mnInorablkYoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgIG5vZGUudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7CiAgICAgICAgICAgIHZhciBoZWFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIik7CiAgICAgICAgICAgIGlmIChoZWFkcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBoZWFkc1swXS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIG5vIGhlYWQgeWV0LCBzdGljayBpdCB3aGVyZWV2ZXIKICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8v55m+5bqm6LS05ZCn77ya5LiN55m75b2V5Y2z5Y+v55yL6LS0IGJ5IFZBCiAgICAvL3Vuc2FmZVdpbmRvdy5PYmplY3QuZnJlZXplID0gbnVsbDsKICAgIC8vZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAvLyB0cnkgewogICAgLy8gICAgIHVuc2FmZVdpbmRvdy5QYWdlRGF0YS51c2VyLmlzX2xvZ2luID0gMTsKICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7fQogICAgLy8gfSwgdHJ1ZSk7CiAgICAvL+aipuWnrOi0tOWQp+WKqeaJiyBieSBqaXh1bgogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdyA9IHVuc2FmZVdpbmRvdywKICAgICAgICAgICAgX21haW47CiAgICAgICAgalF1ZXJ5KGZ1bmN0aW9uICgkKSB7IC8v5pyJ6K2m5ZGKCiAgICAgICAgICAgIHZhciBpdiA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh3LmpRdWVyeSAmJiB3LlBhZ2VEYXRhICYmIHcuUGFnZURhdGEudGJzKSB7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpdik7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1BhZ2VEYXRhIGxvYWRlZC4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3LmJkU2hhcmUpIHsgLy/mnInorablkYoKICAgICAgICAgICAgICAgICAgICAgICAgdy5iZFNoYXJlID0gdW5zYWZlT2JqZWN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHcuUGFnZURhdGEuZ2FtZXMgPSB1bnNhZmVPYmplY3QoW10pOyAvL+acieitpuWRigogICAgICAgICAgICAgICAgICAgIC8v5pyJ6K2m5ZGKCiAgICAgICAgICAgICAgICAgICAgdW5zYWZlRXhlYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaUuei/m+iHqiBjb25neHo2Njg4IOeahCB0aWViYV9xdW90ZSBbIzE0N10KICAgICAgICAgICAgICAgICAgICAgICAgLy8g6IqC5Y+W6IeqIOWvguWvnueahOWOn+WtkCDnmoQgIOaCrOa1rueql+iEmuacrCBbIzExNl0KICAgICAgICAgICAgICAgICAgICAgICAgLy8yMDE5LTExLTQg6L+Z5Liq5Lya6LS05ZCn5Lya5oql6ZSZCiAgICAgICAgICAgICAgICAgICAgICAgIC8qXy5Nb2R1bGUudXNlKCJjb21tb24vd2lkZ2V0L1JpY2hQb3N0ZXIiLCB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmluaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudW5iaW5kU2Nyb2xsRXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ki8KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgX21haW4oJCwgdy5QYWdlRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDUwMCk7CgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIDE1cyBsYXRlciBmb3JjZSBraWxsIHdhaXRpbmcuCiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGl2KTsKICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgIH0pOwoKICAgICAgICB2YXIgX190eXBlX2Zsb29yID0gMSwKICAgICAgICAgICAgX190eXBlX2x6bCA9IDIsCiAgICAgICAgICAgIF9fdHlwZV9mb3J1bSA9IDQsCiAgICAgICAgICAgIF9fdHlwZV9wb3N0YWN0ID0gODsKCiAgICAgICAgdmFyIF9fbW9kX2RlZmF1bHQgPSAwLAogICAgICAgICAgICBfX21vZF9lbmFibGUgPSAxLAogICAgICAgICAgICBfX21vZF9kaXNhYmxlID0gMjsgLy/lhbPmjonmqKHlnZcKCiAgICAgICAgX21haW4gPSBmdW5jdGlvbiAoJCwgd1BhZ2VEYXRhKSB7CiAgICAgICAgICAgIC8vIOajgOafpeaYr+WQpuWcqOi0tOWQpwogICAgICAgICAgICBpZiAoIXdQYWdlRGF0YS5mb3J1bSkgcmV0dXJuOwogICAgICAgICAgICB2YXIgaXNUaHJlYWQgPSAhIXdQYWdlRGF0YS50aHJlYWQ7CiAgICAgICAgICAgIHZhciBfY3NzID0gJCgnPHN0eWxlPicpOwogICAgICAgICAgICB2YXIgX2Nzc0ggPSAkKCc8c3R5bGU+JykudGV4dCgnLmFkc3tkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9Jyk7CgoKICAgICAgICAgICAgLy8vLyBGdW5jdGlvbiBIZWxwZXIKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ2V4dHJhY3QnLCB7CiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL1wvXCooW1xzXFNdKylcKlwvLylbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdmFyIF9mdW5jdGlvbiA9IGZ1bmN0aW9uIChmb28sIHByb3RvKSB7CiAgICAgICAgICAgICAgICBmb28ucHJvdG90eXBlID0gcHJvdG87CiAgICAgICAgICAgICAgICByZXR1cm4gZm9vOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyICRjb25mID0gbmV3KF9mdW5jdGlvbihmdW5jdGlvbiAoKSB7fSwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAobSwgZGVmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IEdNX2dldFZhbHVlKG0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSByZXR1cm4gZGVmOwoKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWwpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobSwgdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNX3NldFZhbHVlKG0sIEpTT04uc3RyaW5naWZ5KHZhbCkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJtOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGFyZ3VtZW50cywgR01fZGVsZXRlVmFsdWUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNX2xpc3RWYWx1ZXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpKCk7CgogICAgICAgICAgICB2YXIgX2hpZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfY3NzSC5wcmVwZW5kKEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwoYXJndW1lbnRzLCAnLCcpICsgJywnKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBfcnVuID0gZnVuY3Rpb24gKGZvbywgbmFtZSkgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cENvbGxhcHNlZCAoJ1votLTlkKfliqnmiYtdOiAnICsgKG5hbWUgfHwgJ1vmnKrnn6XljLrmrrVdJykpOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGFyZ3MgPSBbXSwgaSA9IDIsIHJldDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gZm9vLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1votLTlkKfliqnmiYtdW+i/lOWbnl1bJXNdOiAlcycsIG5hbWUgfHwgJ1vmnKrnn6XljLrmrrVdJywgcmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdb6LS05ZCn5Yqp5omLXVvplJnor69dWyVzXTogJXMnLCBuYW1lIHx8ICdb5pyq55+l5Yy65q61XScsIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmdyb3VwRW5kICgpOwoKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkLmZuLmdldEZpZWxkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gdmFyICRkYXRhID0gdGhpcy5hdHRyKCdkYXRhLWZpZWxkJyk7CiAgICAgICAgICAgICAgICB2YXIgJGRhdGEgPSB0aGlzLmRhdGEoJ2ZpZWxkJyk7CgogICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiAkZGF0YVsxXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKCRkYXRhLnJlcGxhY2UoLycvZywgJyInKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkLmdvVG9FZGl0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKCcjdWVkaXRvcl9yZXBsYWNlJykuZm9jdXMoKTsKICAgICAgICAgICAgICAgICQuc2Nyb2xsVG8oJCgnI3RiX3JpY2hfcG9zdGVyX2NvbnRhaW5lcicpLCA1MDApOwogICAgICAgICAgICB9OwogICAgICAgICAgICAkLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbGUsIGNscywgYXR0cikgewogICAgICAgICAgICAgICAgdmFyIHIgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlKSk7CgogICAgICAgICAgICAgICAgaWYgKGNscykgewogICAgICAgICAgICAgICAgICAgIHIuYWRkQ2xhc3MoY2xzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhdHRyKSB7CiAgICAgICAgICAgICAgICAgICAgci5hdHRyKGF0dHIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9OwogICAgICAgICAgICAkLnN0YW1wID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICtuZXcgRGF0ZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAkLnRvRGF0ZVN0ciA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG1vZHVsZXMgPSB7CiAgICAgICAgICAgICAgICAicm1Cb3R0b20iOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+enu+mZpOW6lemDqOW3peWFt+agjyjkuI3lroznvo4pJywKICAgICAgICAgICAgICAgICAgICBkZXNjOiAn56e76Zmk576O5YyW6LS05ZCn5pe25bqV6YOo5Ye6546w55qE5bel5YW35qCP44CCJywKICAgICAgICAgICAgICAgICAgICBmbGFnOiAwLAogICAgICAgICAgICAgICAgICAgIGRlZjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgX2luaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3JlX3RpdGxlX3dyYXBfYnJpZ2h0IGNsZWFyZml4ICDmsqHlupXlt6XlhbfmoI/ml7YKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3JlX3RpdGxlX3dyYXBfYnJpZ2h0IGNsZWFyZml4IHRidWlfZm9sbG93X2ZpeGVkIGNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IOacieW6leW3peWFt+agj+aXtgogICAgICAgICAgICAgICAgICAgICAgICBybUJvdHRvbSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICDniYjmnYPlo7DmmI7vvJrmnKzmlofkuLpDU0RO5Y2a5Li744CM5YW75Y+q54yr44CN55qE5Y6f5Yib5paH56ug77yM6YG15b6qQ0MgNC4wIEJZLVNB54mI5p2D5Y2P6K6u77yM6L2s6L296K+36ZmE5LiK5Y6f5paH5Ye65aSE6ZO+5o6l5Y+K5pys5aOw5piO44CCCiAgICAgICAgICAgIOWOn+aWh+mTvuaOpe+8mmh0dHBzOi8vYmxvZy5jc2RuLm5ldC9xcV80MDgxNjY0OS9qYXZhL2FydGljbGUvZGV0YWlscy84NjUxMjUzOAogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLy8kKCcjal9jb3JlX3RpdGxlX3dyYXAnKS5yZW1vdmUoKTsgLy9jb3JlX3RpdGxlX3dyYXBfYnJpZ2h0IGNsZWFyZml4IHRidWlfZm9sbG93X2ZpeGVkIGNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCgnI2pfY29yZV90aXRsZV93cmFwJylbMF0uc3R5bGUgPSAicG9zaXRpb246IHVuc2V0ICFpbXBvcnRhbnQiOwogICAgICAgICAgICAgICAgICAgICAgICAvLyQoJyNqX2NvcmVfdGl0bGVfd3JhcCcpWzBdLmNsYXNzTmFtZSA9ICJjb3JlX3RpdGxlX3dyYXBfYnJpZ2h0IGNsZWFyZml4IjsgLy/ov5nmoLflhbPpl63kuIvlt6XlhbfmoI/kuI3lvbHlk43otLTlrZDpobbnmoTmoIfpopjjgIHmlLbol4/lkozlm57lpI0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFkc19oaWRlIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICflub/lkYrpmpDol4/jgIHlsY/olL0nLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICflsY/olL3ml6DnlKjjgIHlub/lkYrlhoXlrrknLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IH4wLAogICAgICAgICAgICAgICAgICAgIGRlZjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGFkcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi0tOWQp+aOqOW5vwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5zcHJlYWRhZCwgLmdhbWVfZnJzX3N0ZXAxLCAuQkFJRFVfQ0xCX0FELCAuZGFzZW5zZSwgLnU5X2hlYWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5qX2NsaWNrX3N0YXRzLCAucF9wb3N0bGlzdD5kaXY6bm90KC5sX3Bvc3QpOm5vdCgucF9wb3N0bGlzdCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tpZD0icGFnZWxldF9mcnMtaGVhZGVyL3BhZ2VsZXQvaGVhZF9jb250ZW50X21pZGRsZSJdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbaWQ9InBhZ2VsZXRfZW5jb3VyYWdlLWFwcGZvcnVtL3BhZ2VsZXQvbXlfYXBwIl0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5saWZlX2hlbHBlcicsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Yiw5aSE5o+S5YWl55qE5bm/5ZGKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW2RhdGEtZGFpZF0nLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWPs+S4i+inkuW5v+WRigogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNnYW1lX3BvcF93aW5kb3cnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOebtOaSrQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNnYW1lX2xpdmVfbGlzdCcsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAg5bm0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnI2pfdGVuX3llYXJzJywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxbCDkuIvmlrnnmoTlub/lkYoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjc29mYV9wb3N0LCAuYmFubmVyX3Bvc3QnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi0tOWQp+mhtumDqOW5v+WRigogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNwYl9hZGJhbm5lcicsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Zu+54mH6aG16Z2iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmFmX2hlYWRfZ2FtZWxpbmsnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW3puWPs+S+pwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5qX2NvdXBsZXQnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWPs+S+pwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNlbmNvdXJhZ2VfZW50cnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5wbGF0Zm9ybV9hc2lkZV90aWViYV9wYXJ0bmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuc2VhcmNoX2JhY2tfYm94JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcudG9waWNfbGlzdF9ib3gnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWuouaIt+err+WPkei0tCB4IOWAjee7j+mqjAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50Yl9wb3N0ZXJfcGxhY2Vob2xkZXInLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOivremfs+aMiemSriAo6ZyA6KaB5a6i5oi356uvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5lZHVpLWJ0bi12b2ljZSwgLmpfdm9pY2VfYWRfZ2lmLCAubHpsX3BhbmVsX3ZvaWNlJywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlj5HluJbor7fpgbXlroggLi4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5wb3N0ZXJfaGVhZF9zdXJ2ZWlsbGFuY2UnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4jeawtOiDveatu+S9leW8g+eWl++8gQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5semxfcGFuZWxfd3JhcHBlciA+IHRib2R5ID4gdHIgPiB0ZDpmaXJzdC1jaGlsZCA+IHAnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS8muWRmOebuOWFs+W5v+WRigogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5kb3VwaWFvX29mZmxpbmUsIC5mTWVtYmVyX2NudCcsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y+z5LiK6KeSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLnVfdHNob3csIC51X3RibWFsbCwgLnVfYXBwLCAudV93YWxsZXQsIC51X3hpdTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy51X215dGJtYWxsLCAudV9qb2ludmlwLCAudV9iYWlkdVByaXZpbGVnZSwgLnVfYXBwY2VudGVyRW50cmFuY2UnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWPs+S4i+inkgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNwb3BfZnJhbWUsICNfX2JkeXhfdGlwcywgI19fYmR5eF90aXBzX2ljb24nLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOeMnOaLswogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5hZGRfZ3Vlc3NpbmdfYnRuLCAuZ3Vlc3Npbmdfd2F0ZXJtYXJrJywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDluJblrZDmjqjojZAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcudGhyZWFkX3JlY29tbWVuZCcsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y+z5LiL6KeS5bm/5ZGKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnI19fYmR5eF90aXBzLCAjX19iZHl4X3RpcHNfaWNvbiwgLmJhaWR1LXR1aXNvbmctd3JhcCwgLmJhaWR1dHVpc29uZycsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5omT6LWP44CB5YiG5LqrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLnJld2FyZF9idG4sIC5zaGFyZV9idG5fd3JhcHBlcicsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g54Of6IqxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmZpcmV3b3JrX3NlbmRlcl93cmFwLCAuZ2xvYmFsX25vdGljZV93cmFwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLnRidWlfZmJhcl9zaGFyZSwqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50YnVpX2ZiYXJfdHN1a2tvbWksIC50YnVpX2ZiYXJfcHJvcHMsIC50YnVpX2ZiYXJfc3F1YXJlLCAudGJ1aV9mYmFyX2hvbWUnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjdHNob3dfb3V0X2RhdGVfd2FybiwgI3NlbGVjdHNlYXJjaC1pY29uJywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDotLTlkKfmjqjojZAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjZm9ydW1fcmVjb21tZW5kJwogICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJywgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJGFkcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vaHR0cHM6Ly90aWViYS5iYWlkdS5jb20vZj9rdz1lcGljJmllPXV0Zi04IOWxj+iUveafkOS6m+WQp+eahOiDjOaZr+WbvgogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKEdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh3aW5kb3cubG9jYXRpb24uaHJlZi5zZWFyY2goLyhodHRwc3xodHRwKTpcL1wvdGllYmFcLmJhaWR1XC5jb21cLyhmXD9rd3xmXD9pZT11dGYtOCZrdz0pL2cpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNlYXJjaCgvKGh0dHBzfGh0dHApOlwvXC90aWViYVwuYmFpZHVcLmNvbVwvKGZcP2t3fGZcP2llPXV0Zi04Jmt3PSkvZykgIT0gLTEgLyrotLTlkKfkuLvpobXmiY3miafooYwqLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wMiA9ICQoIi53cmFwMSIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMi5zdHlsZSA9ICJiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkKCc8c3R5bGU+JykudGV4dCgkYWRzICsgLyogRmlsZTogYWRzX2hpZGUuY3NzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICB7CiAgICBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjY29tX3VzZXJiYXJfbWVzc2FnZSB7CiAgICByaWdodDogMzBweCAhaW1wb3J0YW50OwogICAgdG9wOiAyOHB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgI2NvbV91c2VyYmFyX21lc3NhZ2UgPiAual91aV90cmlhbmdsZSB7CiAgICBsZWZ0OiA2NXB4ICFpbXBvcnRhbnQ7CiAgICB9CiAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZXh0cmFjdCgpKS5hcHBlbmRUbyhkb2N1bWVudC5oZWFkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWPquS/neeVmSBb55yL5biW44CB5Zu+54mH44CB57K+5ZOB44CB6KeG6aKRXSDlm5vkuKrpgInpobnvvIzotLTlkKfmnInkuIDkuKrnqbrnmb3nmoTpgInpobkgal90Ym5hdl90YWJfYSDnvqTnu4Tlip/og73msqHkuoZodHRwKjovL3RpZWJhLmJhaWR1LmNvbS9mP2t3PSomaWU9dXRmLTgmdGFiPWdyb3VwIOi0tOWQp+W3suWOu+aOiee+pOe7hOWKn+iDvSDmoIfpopg6IOOAkOWFrOWRiuOAkei0tOWQp+e+pOe7hOWKn+iDveS4i+e6v+mAmuefpSDpk77mjqXvvJpodHRwczovL3RpZWJhLmJhaWR1LmNvbS9wLzY2OTgyMzgyMDYg55m+5bqm6LS05ZCnOiDotLTlkKfmhI/op4Hlj43ppojlkKcg5Y+R6LS05pe26Ze0OiAyMDIwLTUtMjIgMTk6MjQKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKCcual90Ym5hdl90YWInKS5maWx0ZXIoZnVuY3Rpb24oaSkgeyByZXR1cm4gaSA+IDM7IH0pLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcCA9ICQoJy5qX3RibmF2X3RhYl9hJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wW2ldLmlubmVySFRNTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXBbaV0ucGFyZW50Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtpXS5pbm5lckhUTUwgPT0gIiIgfHwgdGVtcFtpXS5pbm5lckhUTUwgPT0gIueOqeS5kCIgfHwgdGVtcFtpXS5pbm5lckhUTUwgPT0gIua4uOaIjyIgLyogfHwgdGVtcFtpXS5pbm5lckhUTUwgPT0gdW5kZWZpbmVkKuWNoOS9jeeahCovICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0ucGFyZW50Tm9kZS5zdHlsZSA9ICJkaXNwbGF5Om5vbmU7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyDmiafooYzkuInmrKEsIOehruS/neWIhumalOespuS8mua2iOWksQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMzsgaS0tOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnNwbGl0X3RleHQnKS5uZXh0KCcuc3BsaXRfdGV4dCcpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5zcGxpdCcpLmZpbHRlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHRFbGVtZW50U2libGluZyA9PT0gbnVsbCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NOYW1lID09IHRoaXMuY2xhc3NOYW1lIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJCh0aGlzLm5leHRFbGVtZW50U2libGluZykuaXMoJzp2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwICogaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlUHJvbW90ZVRocmVhZCgpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbG9vclR5cGUgPT0gX190eXBlX2ZvcnVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy50aHJlYWQuZmluZCgnLnRocmVhZGxpc3RfcmVwX251bScpLnRleHQoKSA9PSAn5o6o5bm/JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MudGhyZWFkLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJvbW90ZVRocmVhZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyDmuIXnkIbluJblrZDliJfooajnmoTmjqjlub8KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ID0gZG9jdW1lbnQuZXZhbHVhdGUoJy8vKltAaWQ9InRocmVhZF9saXN0Il0vbGkvZGl2L2Rpdi9kaXZbdGV4dCgpPSLmjqjlub8iXScsIGRvY3VtZW50LmJvZHksIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRocmVhZCwgdGhyZWFkcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRocmVhZCA9IGl0Lml0ZXJhdGVOZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZHMucHVzaCh0aHJlYWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkKHRocmVhZHMpLnBhcmVudHMoJ2xpJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhZHNfdGhyZWFkX2xpc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+Wxj+iUveebtOaSrei0tOetieS5seS4g+WFq+ezn+WGheWuuSAo5a6e6aqM5oCnKScsCiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+W5tuS4jea4healmuWIsOW6leS8muWxj+iUveWkmuWwkeS4nOilv++8iScsCiAgICAgICAgICAgICAgICAgICAgZmxhZzogfjAsCiAgICAgICAgICAgICAgICAgICAgZGVmOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGFkcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW4luWtkOWIl+ihqOmhtumDqCwg5aaC55u05pKt6LS0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnI3RocmVhZExpc3RHcm91cENudCcKICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCcsICcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCgkYWRzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnPHN0eWxlPicpLnRleHQoJGFkcyArICd7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50fScpLmFwcGVuZFRvKCdoZWFkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwaW5nYmlfbG91Y2VuZ3FpcGFvIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICflsY/olL3mpbzlsYLmsJTms6EnLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICflsY/olL3mpbzlsYLmsJTms6EnLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IF9fdHlwZV9mbG9vciwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIF9pbml0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBpbmdiaV9sb3VjZW5ncWlwYW8gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDEgPSAkKCIucG9zdF9idWJibGVfdG9wIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wMiA9ICQoIi5wb3N0X2J1YmJsZV9taWRkbGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAzID0gJCgiLnBvc3RfYnViYmxlX2JvdHRvbSIpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wMS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDFbaV0uc3R5bGUgPSAiYmFja2dyb3VuZGU6bm9uZTsiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wMi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDJbaV0uc3R5bGUgPSAiYmFja2dyb3VuZGU6bm9uZTtwYWRkaW5nOnVuc2V0OyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wM1tpXS5zdHlsZSA9ICJiYWNrZ3JvdW5kZTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIjY2NjY2NjY2NjY2NiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicWlhbmdkaWFveGlueGl0aXNoaSI6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5by66LCD5L+h5oGv5o+Q56S6JywKICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5by66LCD5L+h5oGv5o+Q56S6JywKICAgICAgICAgICAgICAgICAgICBmbGFnOiBfX3R5cGVfZmxvb3IsCiAgICAgICAgICAgICAgICAgICAgZGVmOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBxaWFuZ2RpYW94aW54aXRpc2hpID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHRlbXAxID0gJCgiLnVfbmV3c193cmFwIHNwYW4iKTsgLy/mta7liqjmjInpkq4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCB0ZW1wMiA9ICQoIi51X25vdGl0eV9iZCAuY2F0ZWdvcnlfaXRlbSIpOyAvL+a1ruWKqOaMiemSrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wMyA9ICQoIi5jb3JlX3JlcGx5X3RhaWwiKTsgLy/mpbzlsYLkv6Hmga8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCB0ZW1wNCA9ICQoInVsLmpfY2F0ZWdvcnlfbGlzdD5saT5hPnNwYW4sdWwual9jYXRlZ29yeV9saXN0PiN1X25vdGlmeV9pdGVtPmxpPmE+c3BhbiIpOyAvL+a1ruWKqOaMiemSrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHRlbXA1ID0gJCgidWwuc3lzX25vdGlmeV9sYXN0PmxpPmE+c3BhbiIpOyAvL+a1ruWKqOaMiemSrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHRlbXA2ID0gJCgiLm1laWh1YSIpOyAvL+e+juWMluW8gOWFswogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpaSA8PSA1OSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYgKHRlbXA2WzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA2WzBdLnN0eWxlID0gImNvbG9yOiNmMDAgIWltcG9ydGFudDtmb250LXdlaWdodDpib2xkO3doaXRlLXNwYWNlOm5vcm1hbDsiOyAvL+i0tOWQp+e+juWMluW8gOWFs+aMiemSruaWh+Wtl+agt+W8jwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAzWzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wM1tpXS5zdHlsZSA9ICJjb2xvcjojMDAwICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlmICh0ZW1wMVswXSAhPSBudWxsICYmIHRlbXAyWzBdICE9IG51bGwgJiYgdGVtcDRbMF0gIT0gbnVsbCAmJiB0ZW1wNVswXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAxLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDFbaV0uc3R5bGUgPSAiZGlzcGxheToiICsgdGVtcDFbaV0uc3R5bGVbImRpc3BsYXkiXSArICI7Y29sb3I6I2YwMCAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcDIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMltpXS5zdHlsZVsiY29sb3IiXSA9ICIjZjAwICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcDQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNFtpXS5zdHlsZSA9ICJjb2xvcjojZjAwICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wNS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA1W2ldLnN0eWxlID0gImRpc3BsYXk6IiArIHRlbXA1W2ldLnN0eWxlWyJkaXNwbGF5Il0gKyAiO2NvbG9yOiNmMDAgIWltcG9ydGFudDsiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLlvLrosIPkv6Hmga/mj5DnpLo6IiArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIjY2NjY2NjY2NjY2NiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAvKiJhdWRpb19kb3dubG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+i0tOWQp+ivremfs+S4i+i9vSjlt7Lml6DmlYgpJywKICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+S4i+i9vei0tOWQp+ivremfs34g5ZWm5ZWm5ZWmficsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc6IF9fdHlwZV9mbG9vciB8IF9fdHlwZV9semwsCiAgICAgICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbihmbG9vclR5cGUsIGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGxheWVyID0gJCgnLnZvaWNlX3BsYXllcjpub3QoLnBhcnNlZCknLCBhcmdzLl9tYWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3BsYXllci5zaXplKCkpIHJldHVybiAn5om+5LiN5Yiw6K+t6Z+zJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9wbGF5ZXIucGFyZW50cygnW2RhdGEtZmllbGRdJykuZ2V0RmllbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQgPSBkYXRhLnNwaWQgfHwgZGF0YS5jb250ZW50LnBvc3RfaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BsYXllci5hZGRDbGFzcygncGFyc2VkJykuYWZ0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGE+JykuYWRkQ2xhc3MoJ3VpX2J0biB1aV9idG5fbScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiAnL3ZvaWNlL2luZGV4P3RpZD0nICsgd1BhZ2VEYXRhLnRocmVhZC50aHJlYWRfaWQgKyAnJnBpZD0nICsgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZDogJ+ivremfsy0nICsgKGRhdGEudXNlcl9uYW1lIHx8IGRhdGEuYXV0aG9yLnVzZXJfbmFtZSkgKyAnLScgKyBwaWQgKyAnLm1wMycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiAnMWVtJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKS50ZXh0KCfkuIvovb0nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuYWZ0ZXIoJCgnPGJyPicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sKi8KICAgICAgICAgICAgICAgICJibG9ja19wb3N0IjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfotLTlkKfotLTlrZDlsY/olL0o5q6L5bqf55qEKScsCiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+agueaNruinhOWImeWxj+iUveaMh+Wumui0tOWtkCcsCiAgICAgICAgICAgICAgICAgICAgZmxhZzogX190eXBlX2Zsb29yIHwgX190eXBlX2ZvcnVtIHwgX190eXBlX2x6bCwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAoKICAgICAgICAgICAgICAgICAgICAvLyDovoXliqnlh73mlbAKICAgICAgICAgICAgICAgICAgICBfbWF0Y2hfdHlwZTogZnVuY3Rpb24gKF9NKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX00pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5fX01fUkVHRVg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cF9yZWdleCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuX19NX1BMQUlOOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHBfcGxhaW4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZF8nICsgX007CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAvLyDovoXliqnlh73mlbAKICAgICAgICAgICAgICAgICAgICBfcmFuZ2U6IGZ1bmN0aW9uIChvbGQsIG1pbiwgbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG9sZCksIG1heCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8g5Yid5aeL5YyW5qC35byP6KGoCiAgICAgICAgICAgICAgICAgICAgX2luaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgndWwjanhfcG9zdF9rd29yZCA+IGxpIHttYXJnaW4tYm90dG9tOiAuMmVtfScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcuanhfd29yZCB7IHBhZGRpbmc6IDAgLjVlbTsgd2lkdGg6IDhlbSB9IHNwYW4ucmVnZXg6OmJlZm9yZSwgc3Bhbi5yZWdleDo6YWZ0ZXIgeyBjb250ZW50OiAiLyI7IGNvbG9yOiAjNzc3IH0nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3Bhbi5yZWdleCA+IC5qeF93b3JkIHsgYm9yZGVyOiAwOyBwYWRkaW5nOiAwIC4yZW0gfScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcuanhfbW9kaWZpZXIgeyB3aWR0aDogNGVtOyBib3JkZXI6IDA7IHBhZGRpbmc6IDAgMCAwIC4yZW0gfScpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnLmp4X3Bvc3RfYmxvY2tfc3RyaXBlOjpiZWZvcmV7Y29udGVudDogIuWFsemakOiXjyAiIGF0dHIoaGlkZS1jb3VudCkgIiDkuKrmlbDmja4ifScpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRoaXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiB0byB0YWtlIHdoZW4gbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQUNUX0JBUjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQUNUX09QQTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQUNUX0hJREU6IDIsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5d29yZCBtYXRjaCBtZXRob2QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTV9SRUdFWDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTV9QTEFJTjogMQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnID0gJC5leHRlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25tYXRjaDogdGhpcy5fX0FDVF9PUEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAzMCwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd29yZDogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLl9fTV9QTEFJTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkOiAn5rO954Gr6Z2pJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ+eCruW8uTU2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn54Ku5by5NTInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sICRjb25mLmdldCh0aGlzLmlkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBpbGVSZWdleCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kdHBsQ29uZmlnID0gLyogRmlsZTogYmxvY2tfcG9zdC5odG1sICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICA8ZGl2IGNsYXNzPSJqeF9hdXRvZmxvdyI+CiAgICA8aDM+5b2T5Yy56YWN5Yiw5pe255qE5pON5L2cPC9oMz4KICAgIDxwPgogICAgPHNlbGVjdCBpZD0ianhfcG9zdF9tYXRjaCI+CiAgICA8b3B0aW9uIHZhbHVlPSIwIiB7eyN0cF9iYXJ9fXNlbGVjdGVke3svdHBfYmFyfX0+57qi5p2hPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSIxIiB7eyN0cF9vcGF9fXNlbGVjdGVke3svdHBfb3BhfX0+6YCP5piOPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSIyIiB7eyN0cF9oaWRlfX1zZWxlY3RlZHt7L3RwX2hpZGV9fT7pmpDol488L29wdGlvbj4KICAgIDwvc2VsZWN0PgoKICAgIDxsYWJlbCB0aXRsZT0iMCDooajnpLrlrozlhajpgI/mmI4gKOWNoOS9jemavueci+WTpik7IDB+MTAwInt7XnRwX29wYX19IGNsYXNzPSJoaWRlInt7L3RwX29wYX19PumAj+aYjuW6pgogICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9Imp4X3Bvc3Rfb3BhIiBjbGFzcz0idGV4dC1jZW50ZXIiIHZhbHVlPSJ7e29wYWNpdHl9fSIgc3R5bGU9IndpZHRoOiA1ZW0iIC8+JQogICAgPC9sYWJlbD4KICAgIDwvcD4KICAgIDxiciAvPgoKICAgIDxoMz7lhoXlrrnlsY/olL3op4TliJk8L2gzPgogICAgPHVsIGlkPSJqeF9wb3N0X2t3b3JkIj4KICAgIHt7I2t3b3JkfX0KICAgIDxsaT4KICAgIDxzZWxlY3QgY2xhc3M9Imp4X3dvcmRfdHlwZSI+CiAgICA8b3B0aW9uIHZhbHVlPSIwIiB7eyN0cF9yZWdleH19c2VsZWN0ZWR7ey90cF9yZWdleH19Puato+WImTwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iMSIge3sjdHBfcGxhaW59fXNlbGVjdGVke3svdHBfcGxhaW59fT7mlofmnKw8L29wdGlvbj4KICAgIDwvc2VsZWN0PgoKICAgIDxzcGFue3sjdHBfcmVnZXh9fSBjbGFzcz0icmVnZXgie3svdHBfcmVnZXh9fT48aW5wdXQgY2xhc3M9Imp4X3dvcmQiIHZhbHVlPSJ7e3dvcmR9fSIgLz48L3NwYW4+PCEtLQogICAgLS0+PGlucHV0IGNsYXNzPSJqeF9tb2RpZmllcnt7XnRwX3JlZ2V4fX0gaGlkZXt7L3RwX3JlZ2V4fX0iIHZhbHVlPSJ7e21vZGl9fSIgLz4KCiAgICBbIDxhIGNsYXNzPSJwdHIgangtcm0ta2V5IiA+5Yig6ZmkPC9hPiBdCiAgICA8L2xpPgogICAge3sva3dvcmR9fQogICAgPC91bD4KICAgIDxwPjxhIGNsYXNzPSJ1aV9idG4gdWlfYnRuX20iIGRhdGEtYnRuPSJhZGQiPjxzcGFuPjxlbT7mt7vliqA8L2VtPjwvc3Bhbj48L2E+PC9wPgogICAgPGJyIC8+CgogICAgPGgzPueUqOaIt+Wxj+iUveWIl+ihqDwvaDM+CiAgICA8cD7nlKjmiLfliJfooajvvIzkuIDooYzkuIDkuKo8L3A+CiAgICA8IS0tIEhhY2tpc2ggc29sdXRpb24gLS0+CiAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICA8dGV4dGFyZWEgaWQ9Imp4X3Bvc3RfdXNlciIgcm93PTUgc3R5bGU9IndpZHRoOiAxMDAlOyBwYWRkaW5nOiAuMmVtIj57e3VzZXJ9fTwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KICAgIDxiciAvPgoKICAgIDxwIGNsYXNzPSJ0ZXh0LWNlbnRlciI+CiAgICA8YSBjbGFzcz0idWlfYnRuIHVpX2J0bl9tIiBkYXRhLWJ0bj0ic2F2ZSI+PHNwYW4+PGVtPuWCqOWtmDwvZW0+PC9zcGFuPjwvYT4gJm5ic3A7CiAgICA8YSBjbGFzcz0idWlfYnRuIHVpX2J0bl9tIiBkYXRhLWJ0bj0iY2xvc2UiPjxzcGFuPjxlbT7mlL7lvIM8L2VtPjwvc3Bhbj48L2E+CiAgICA8L3A+CiAgICA8L2Rpdj4KICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5leHRyYWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHRwbEFkZFdvcmQgPSAvKiBGaWxlOiBibG9ja19wb3N0X2t3b3JkLmh0bWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgIDxsaT4KICAgIDxzZWxlY3QgY2xhc3M9Imp4X3dvcmRfdHlwZSI+CiAgICA8b3B0aW9uIHZhbHVlPSIwIiB7eyN0cF9yZWdleH19c2VsZWN0ZWR7ey90cF9yZWdleH19Puato+WImTwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iMSIge3sjdHBfcGxhaW59fXNlbGVjdGVke3svdHBfcGxhaW59fT7mlofmnKw8L29wdGlvbj4KICAgIDwvc2VsZWN0PgoKICAgIDxzcGFue3sjdHBfcmVnZXh9fSBjbGFzcz0icmVnZXgie3svdHBfcmVnZXh9fT48aW5wdXQgY2xhc3M9Imp4X3dvcmQiIHZhbHVlPSJ7e3dvcmR9fSIgLz48L3NwYW4+PCEtLQogICAgLS0+PGlucHV0IGNsYXNzPSJqeF9tb2RpZmllcnt7XnRwX3JlZ2V4fX0gaGlkZXt7L3RwX3JlZ2V4fX0iIHZhbHVlPSJ7e21vZGl9fSIgLz4KCiAgICBbIDxhIGNsYXNzPSJwdHIgangtcm0ta2V5IiA+5Yig6ZmkPC9hPiBdCiAgICA8L2xpPgogICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmV4dHJhY3QoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3NzID0gJCgnPHN0eWxlPicpLmFwcGVuZFRvKGRvY3VtZW50LmhlYWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWJ1aWxkU3R5bGUoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAvLyDph43mnoTmoLflvI/ooagKICAgICAgICAgICAgICAgICAgICBfcmVidWlsZFN0eWxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzQnVpbGRlciA9ICcuanhfcG9zdF9ibG9ja19hY3Qgeyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jb25maWcub25tYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLl9fQUNUX0JBUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQnVpbGRlciArPSAnZGlzcGxheTogbm9uZTsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLl9fQUNUX0hJREU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0J1aWxkZXIgKz0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheTogbm9uZTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmp4X3Bvc3RfYmxvY2tfc3RyaXBlIHsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheTogbm9uZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLCAnfScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLl9fQUNUX09QQToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQnVpbGRlciArPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGFjaXR5OiAnICsgKHRoaXMuY29uZmlnLm9wYWNpdHkgLyAxMDApICsgJzsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNpdGlvbjogb3BhY2l0eSAuNXM7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5qeF9wb3N0X2Jsb2NrX2FjdDpob3ZlciB7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wYWNpdHk6IC45OycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuanhfcG9zdF9ibG9ja19zdHJpcGUgeycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5OiBub25lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAsICd9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNCdWlsZGVyICs9ICd9JzsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jc3MudGV4dChzQnVpbGRlcik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAvLyDnvJbor5HmraPliJnljLnphY0KICAgICAgICAgICAgICAgICAgICBfY29tcGlsZVJlZ2V4OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcua3dvcmQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSB0aGF0Ll9fTV9SRUdFWCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlZ2V4ID0gbmV3IFJlZ0V4cChlLndvcmQsIGUubW9kaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcign57yW6K+R5q2j5YiZ6KGo6L6+5byP5pe25Ye66ZSZIVxu6KGo6L6+5byPOiAlcywg5byA5YWzOiAlcycsIGVyci53b3JkLCBlcnIubW9kaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlZ2V4ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAvLyDphY3nva7nqpflj6Plm57osIMKICAgICAgICAgICAgICAgICAgICBfY29uZjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHZpZXcgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5jb25maWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHZpZXcudHBfaGlkZSA9ICR2aWV3Lm9ubWF0Y2ggPT09IHRoaXMuX19BQ1RfSElERTsKICAgICAgICAgICAgICAgICAgICAgICAgJHZpZXcudHBfb3BhID0gJHZpZXcub25tYXRjaCA9PT0gdGhpcy5fX0FDVF9PUEE7CiAgICAgICAgICAgICAgICAgICAgICAgICR2aWV3LnRwX2JhciA9ICR2aWV3Lm9ubWF0Y2ggPT09IHRoaXMuX19BQ1RfQkFSOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkdmlldy5rd29yZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZpZXcua3dvcmRbaV1bdGhpcy5fbWF0Y2hfdHlwZSgkdmlldy5rd29yZFtpXS50eXBlKV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICR2aWV3LnVzZXIgPSAkdmlldy51c2VyLmpvaW4oJ1xuJyk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRwbCA9ICQoTXVzdGFjaGUucmVuZGVyKHRoaXMuJHRwbENvbmZpZywgJHZpZXcpKTsgLy/mnInorablkYoKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkd25kQmxvY2tlciA9ICQuZGlhbG9nLm9wZW4oJHRwbCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfotLTlrZDlhbPplK7lrZflsY/olL0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAkdHBsLm9uKCdjbGljaycsICdhLmp4LXJtLWtleScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOenu+mZpOmCo+S4gOihjAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkub24oJ2NoYW5nZScsICcuanhfd29yZF90eXBlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzUmVnZXggPSBwYXJzZUludCh0aGlzLnZhbHVlKSA9PT0gdGhhdC5fX01fUkVHRVg7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSAkKHRoaXMpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5maW5kKCcuanhfd29yZCcpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdyZWdleCcsIGlzUmVnZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5maW5kKCcuanhfbW9kaWZpZXInKS50b2dnbGVDbGFzcygnaGlkZScsICFpc1JlZ2V4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkub24oJ2NoYW5nZScsICcjanhfcG9zdF9tYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNqeF9wb3N0X29wYScsICR0cGwpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdoaWRlJywgcGFyc2VJbnQodGhpcy52YWx1ZSkgIT09IHRoYXQuX19BQ1RfT1BBKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy51aV9idG4nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCQodGhpcykuZGF0YSgnYnRuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhZGQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRwbEFkZCA9ICQoTXVzdGFjaGUucmVuZGVyKHRoYXQuJHRwbEFkZFdvcmQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3BsYWluOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsgLy/mnInorablkYoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2p4X3Bvc3Rfa3dvcmQnLCAkdHBsKS5hcHBlbmQoJHRwbEFkZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cGxBZGQuZmluZCgnLnRnX2ZvY3VzJykucmVtb3ZlQ2xhc3MoJy50Z19mb2N1cycpLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NhdmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q29uZiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubWF0Y2g6IHBhcnNlSW50KCQoJyNqeF9wb3N0X21hdGNoJywgJHRwbCkudmFsKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogdGhhdC5fcmFuZ2UocGFyc2VJbnQoJCgnI2p4X3Bvc3Rfb3BhJywgJHRwbCkudmFsKCkpLCAwLCAxMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dvcmQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogJCgnI2p4X3Bvc3RfdXNlcicsICR0cGwpLnZhbCgpLnNwbGl0KCdcbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNqeF9wb3N0X2t3b3JkID4gbGknKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydWxlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmYua3dvcmQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcGFyc2VJbnQocnVsZS5maW5kKCdzZWxlY3QnKS52YWwoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZDogcnVsZS5maW5kKCcuanhfd29yZCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGk6IHJ1bGUuZmluZCgnLmp4X21vZGlmaWVyJykudmFsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbmYuc2V0KHRoYXQuaWQsIG5ld0NvbmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmNvbmZpZyA9IG5ld0NvbmY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jb21waWxlUmVnZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVidWlsZFN0eWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3bmRCbG9ja2VyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHduZEJsb2NrZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIC8vIOagh+iusOi0tOWtkOS4uumakOiXjwogICAgICAgICAgICAgICAgICAgIF9oaXQ6IGZ1bmN0aW9uIChmbG9vcikgewogICAgICAgICAgICAgICAgICAgICAgICBmbG9vci5hZGRDbGFzcygnanhfcG9zdF9ibG9ja19hY3QnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbG9vci5wcmV2KCkuaXMoJ3NjcmlwdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vci5wcmV2KCkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbG9vci5wcmV2KCkuaXMoJy5qeF9wb3N0X2Jsb2NrX2FjdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlr7vmib7mqKrmnaEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gZmxvb3IucHJldigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFwcmV2LmlzKCcuanhfcG9zdF9ibG9ja19zdHJpcGUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnByZXYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmF0dHIoJ2hpZGUtY291bnQnLCBwYXJzZUludChwcmV2LmF0dHIoJ2hpZGUtY291bnQnKSkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2p4X3Bvc3RfYmxvY2tfc3RyaXBlIGZsb29yLXN0cmlwZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hpZGUtY291bnQnLCAxKS5pbnNlcnRCZWZvcmUoZmxvb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgX2dldEF1dGhvcjogZnVuY3Rpb24gKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYudXNlcl9uYW1lIHx8IGYuYXV0aG9yX25hbWUgfHwgKGYuYXV0aG9yID8gZi5hdXRob3IudXNlcl9uYW1lIDogbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgX3Byb2M6IGZ1bmN0aW9uIChmbG9vclR5cGUsIGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6aaW5YWI5qOA5p+l55So5oi35ZCNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy51c2VyLmluZGV4T2YodGhpcy5fZ2V0QXV0aG9yKGFyZ3MuX21haW4uZ2V0RmllbGQoKSkpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGl0KGFyZ3MuX21haW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmxvb3JDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZsb29yVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBfX3R5cGVfZm9ydW06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JDb250ZW50ID0gJCgnLnRocmVhZGxpc3RfdGV4dCcsIGFyZ3MuX21haW4pLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgX190eXBlX2Zsb29yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yQ29udGVudCA9ICQoJy5kX3Bvc3RfY29udGVudCcsIGFyZ3MuX21haW4pLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgX190eXBlX2x6bDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckNvbnRlbnQgPSAkKCcubHpsX2NvbnRlbnRfbWFpbicsIGFyZ3MuX21haW4pLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8g54S25ZCO5b6q546v5qOA5p+l5YWz6ZSu5a2X5Yy56YWNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmNvbmZpZy5rd29yZC5sZW5ndGg7IGktLTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jb25maWcua3dvcmRbaV0udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5fX01fUkVHRVg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5rd29yZFtpXS5yZWdleC50ZXN0KGZsb29yQ29udGVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpdChhcmdzLl9tYWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLl9fTV9QTEFJTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsb29yQ29udGVudC5pbmRleE9mKHRoaXMuY29uZmlnLmt3b3JkW2ldLndvcmQpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGl0KGFyZ3MuX21haW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJoaWRlX2xvb3BzIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICczIOWkqeW+queOr+makOiXjycsCiAgICAgICAgICAgICAgICAgICAgZGVzYzogJzMg5aSp5b6q546v5bGP6JS95oyH5a6a55So5oi355qE5biW5a2QLCDnu5/kuIDlsIHplIEuJywKICAgICAgICAgICAgICAgICAgICBmbGFnOiBfX3R5cGVfcG9zdGFjdCB8IF9fdHlwZV9mb3J1bSwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAoKICAgICAgICAgICAgICAgICAgICBfZmluZFVzZXI6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSB0aGlzLmJsb2NrTGlzdC5hdXRob3IubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmJsb2NrTGlzdC5hdXRob3IubGVuZ3RoOyBpLS07KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ibG9ja0xpc3QuYXV0aG9yW2ldLm5hbWUgPT0gbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfdXNlckV4aXN0OiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IHRoaXMuX2ZpbmRVc2VyKHVzZXIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIF9jb25mOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8v5pyJ6K2m5ZGKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkdHBsID0gJChNdXN0YWNoZS5yZW5kZXIodGhpcy50cGxIaWRlQXV0aG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3I6IHRoaXMuYmxvY2tMaXN0LmF1dGhvci5tYXAoZnVuY3Rpb24gKGUsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IGUudGltZSA/ICQudG9EYXRlU3RyKG5ldyBEYXRlKGUudGltZSkpIDogJ+WwmuacqicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICR3bmRIaWRlVXNlciA9ICQuZGlhbG9nLm9wZW4oJHRwbCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICcz5aSp5b6q546v6ZqQ6JeP5qih57uE6YWN572uIC0g6K6w5b6X54K55LiA5qyhIFvlhajpg6jlsIHnpoFdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzNzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwMAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkaW5wID0gJCgnI2p4X25ld19pZCcsICR0cGwpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2JBZGROYW1lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXIgPSAkaW5wLnZhbCgpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3VwZExpc3QoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdXNlci5sZW5ndGggfHwgdGhhdC5fdXNlckV4aXN0KHVzZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnAudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5pyJ6K2m5ZGKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKE11c3RhY2hlLnJlbmRlcih0aGF0LnRwbE5ld0xpbmUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB1c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6ICflsJrmnKonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkuaW5zZXJ0QmVmb3JlKCQoJyNqeF9sYXN0X2xpbmVfb2ZfM2RheV9ibG9jaycsICR0cGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuYmxvY2tMaXN0LmF1dGhvci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB1c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2F2ZUxpc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOe7keWumuS6i+S7tgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjanhfYWRkJywgJHRwbCkuY2xpY2soY2JBZGROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGlucC5rZXlwcmVzcyhmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JBZGROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkdHBsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgJy5qeF9tYW5faGlkZSwgLmp4X21hbl9ybScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRsID0gJChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsLmhhc0NsYXNzKCd0ZXh0LWRpc2FibGVkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbC5hZGRDbGFzcygndGV4dC1kaXNhYmxlZCcpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICR1biA9ICRsLnBhcmVudCgpLmRhdGEoJ25hbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll91cGRMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJGwuaGFzQ2xhc3MoJ2p4X21hbl9oaWRlJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmJsb2NrTGlzdC5hdXRob3JbdGhhdC5fZmluZFVzZXIoJHVuKV0udGltZSA9ICQuc3RhbXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2hpZGUoZnVuY3Rpb24gKCkge30sICR1bik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkbC5oYXNDbGFzcygnanhfbWFuX3JtJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmJsb2NrTGlzdC5hdXRob3Iuc3BsaWNlKHRoYXQuX2ZpbmRVc2VyKCR1biksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwucGFyZW50KCkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NhdmVMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNqeF9jbG9zZScsICR0cGwpLmNsaWNrKCR3bmRIaWRlVXNlci5jbG9zZS5iaW5kKCR3bmRIaWRlVXNlcikpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjanhfYWxsJywgJHRwbCkuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGVTdGF0dXMgPSAkKCcjanhfaGlkZV9pbmZvJywgJHRwbCkuc2hvdygpLnRleHQoJ+ato+WcqOWIneWni+WMluKApicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuaGlkZVF1ZXVlLm9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoaSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVTdGF0dXMudGV4dChNdXN0YWNoZS5yZW5kZXIoJ+ato+WcqOmakOiXjyB7e2l9fSAvIHt7dH19Li4uIOivt+WLv+WFs+mXreivpeeql+WPoyEnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7IC8v5pyJ6K2m5ZGKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5oaWRlUXVldWUub25Db21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmhpZGVRdWV1ZS5vblByb2dyZXNzID0gdGhhdC5oaWRlUXVldWUub25Db21wbGV0ZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZVN0YXR1cy50ZXh0KCflhajpg6jnlKjmiLflt7LmiJDlip/pmpDol48hJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5oaWRlUXVldWUuYWRkLmFwcGx5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuaGlkZVF1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCQoJ2EuanguanhfbWFuX2hpZGU6bm90KC50ZXh0LWRpc2FibGVkKScpLmFkZENsYXNzKCd0ZXh0LWRpc2FibGVkJykubWFwKGZ1bmN0aW9uIChpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGUpLnBhcmVudCgpLmRhdGEoJ25hbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRwbDsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBfaGlkZTogZnVuY3Rpb24gKGNiLCBhdXRob3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5Zyo5YiX6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZExpc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VzZXJFeGlzdChhdXRob3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzlrZjlnKgsIOS/ruato+S4iuasoemakOiXj+aXtumXtAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xpc3QuYXV0aG9yW3RoaXMuX2ZpbmRVc2VyKGF1dGhvcildLnRpbWUgPSAkLnN0YW1wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYXZlTGlzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygn5byA5aeL6ZqQ6JePOiAlcycsIGF1dGhvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnL3RwaGlkZS9hZGQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZV91bjogYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllOiAndXRmLTgnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJwogICAgICAgICAgICAgICAgICAgICAgICB9KS5zdWNjZXNzKGNiKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRwbEhpZGVBdXRob3IgPSAvKiBGaWxlOiBoaWRlX2xvb3BzX2NvbmZpZy5odG1sICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICA8ZGl2IGNsYXNzPSJqeF9hdXRvZmxvdyI+CiAgICA8aDI+MyDlpKnlvqrnjq/pmpDol4/nmoTliJfooag8L2gyPgoKICAgIDxwIGNsYXNzPSJ0ZXh0LWNlbnRlciI+6K+35rOo5oSPOiDlsIHnpoHml7bpl7TkuI3kvJroh6rliqjliLfmlrAsIOivt+WFs+mXreWQjumHjeaWsOW8gOWQr+ivpeWvueivneahhuOAgjwvcD4KCiAgICA8b2w+CiAgICB7eyNhdXRob3J9fQogICAgPGxpIGRhdGEtbmFtZT0ie3tuYW1lfX0iPjxiPnt7bmFtZX19PC9iPgogICAgWyDkuIrmrKHpmpDol486IDxzcGFuIGNsYXNzPSJ0ZXh0LXJlZCI+e3t0aW1lfX08L3NwYW4+IHwgPGEgY2xhc3M9Imp4IGp4X21hbl9oaWRlIj7miYvliqg8L2E+IHwgPGEgY2xhc3M9Imp4IGp4X21hbl9ybSI+56e76ZmkPC9hPiBdPC9saT4KICAgIHt7L2F1dGhvcn19CiAgICA8bGkgaWQ9Imp4X2xhc3RfbGluZV9vZl8zZGF5X2Jsb2NrIj4KICAgIDxpbnB1dCBpZD0ianhfbmV3X2lkIiBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5paw55qE6ZyA6KaB6Ieq5Yqo5bCB56aB55qEIGlkIiBzdHlsZT0id2lkdGg6IDIwZW07IiAvPgogICAgPGJyIC8+PGEgY2xhc3M9InVpX2J0biB1aV9idG5fbSIgaWQ9Imp4X2FkZCI+PHNwYW4+PGVtPua3u+WKoDwvZW0+PC9zcGFuPjwvYT4KICAgIDwvbGk+CiAgICA8L29sPgoKICAgIDxwIGNsYXNzPSJoaWRlIiBpZD0ianhfaGlkZV9pbmZvIj48L3A+CgogICAgPGRpdiBjbGFzcz0idGV4dC1jZW50ZXIiPgogICAgPGEgY2xhc3M9InVpX2J0biB1aV9idG5fbSIgaWQ9Imp4X2FsbCI+PHNwYW4+PGVtPuWFqOmDqOWwgeemgTwvZW0+PC9zcGFuPjwvYT4gJm5ic3A7CiAgICA8YSBjbGFzcz0idWlfYnRuIHVpX2J0bl9tIiBpZD0ianhfY2xvc2UiPjxzcGFuPjxlbT7lhbPpl608L2VtPjwvc3Bhbj48L2E+CiAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmV4dHJhY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cGxOZXdMaW5lID0gLyogRmlsZTogaGlkZV9sb29wc19hdXRob3IuaHRtbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgPGxpIGRhdGEtbmFtZT0ie3tuYW1lfX0iPjxiPnt7bmFtZX19PC9iPgogICAgWyDkuIrmrKHpmpDol486IDxzcGFuIGNsYXNzPSJ0ZXh0LXJlZCI+e3t0aW1lfX08L3NwYW4+IHwgPGEgY2xhc3M9Imp4IGp4X21hbl9oaWRlIj7miYvliqg8L2E+IHwgPGEgY2xhc3M9Imp4IGp4X21hbl9ybSI+56e76ZmkPC9hPiBdPC9saT4KICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5leHRyYWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZExpc3QoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfaGlkZSA9IHRoaXMuX2hpZGUuYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlUXVldWUgPSBuZXcgSW50ZXJ2YWxMb29wKFtdLCBfaGlkZSwgNDAwKS5sb29wKCk7IC8v5pyJ6K2m5ZGKCgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyVGltZSA9ICQuc3RhbXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQzRGF5cyA9IDMgKiAyNCAqIDYwICogNjA7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tMaXN0LmF1dGhvci5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVGltZSAtIGUudGltZSA+IHQzRGF5cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuaGlkZVF1ZXVlLmFkZChlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBfdXBkTGlzdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGlzdCA9ICQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOagvOW8j+WmguS4iwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCW5hbWU6ICfngq7lvLk1NicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8JbGFzdEhpZGU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgJGNvbmYuZ2V0KHRoaXMuaWQsIHt9KSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfc2F2ZUxpc3Q6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbmYuc2V0KHRoaXMuaWQsIHRoaXMuYmxvY2tMaXN0KTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBfZmluZE5hbWVBbmRIaWRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmxvb3JEYXRhID0gJChlLnRhcmdldCkucGFyZW50cygnLmx6bF9zaW5nbGVfcG9zdCwubF9wb3N0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCgpLmdldEZpZWxkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdXRob3IgPSBmbG9vckRhdGEudXNlcl9uYW1lIHx8IGZsb29yRGF0YS5hdXRob3IudXNlcl9uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdXNlckV4aXN0KGF1dGhvcikpIHsgLy/mnInorablkYoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZGlhbG9nLmFsZXJ0KE11c3RhY2hlLnJlbmRlciggLyogRmlsZTogaGlkZV9sb29wc19hbHJlYWR5X2luX2xpc3QuaHRtbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICDnlKjmiLcgWzxiPnt7bmFtZX19PC9iPl0g5bey5a2Y5Zyo5LqO5bGP6JS95YiX6KGoIQogICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5leHRyYWN0KCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXV0aG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJzMg5aSp5b6q546v6ZqQ6JePJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkTGlzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGlzdC5hdXRob3IucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiAkLnN0YW1wKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhdmVMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpZGUoZnVuY3Rpb24gKHIpIHsgLy/mnInorablkYoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZGlhbG9nLmFsZXJ0KE11c3RhY2hlLnJlbmRlciggLyogRmlsZTogaGlkZV9sb29wX3Jlc3VsdC5odG1sICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgIOWvuSA8Yj57e25hbWV9fTwvYj4g55qE6ZqQ6JeP5aSE55CG57uT5p6cOiB7e21zZ319KHt7bm99fSkKICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZXh0cmFjdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXV0aG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcikpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICczIOWkqeW+queOr+makOiXjyAo5qW85Lit5qW85peg5pWIKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBhdXRob3IpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIF9tZW51OiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkYWN0ID0gJCgnLnVzZXItaGlkZS1wb3N0LWFjdGlvbicsIGFyZ3MuX21haW4pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGFjdEhpZGVQb3N0ID0gJC5jcmVhdGUoJ2EnLCAnanggangtcG9zdC1hY3Rpb24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRhY3RIaWRlUG9zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoJ+WKoOWFpSAzIOWkqeW+queOr+makOiXj+WIl+ihqCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGFjdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdqeCcsIHRoaXMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YSgnZXZlJywgYXJncy5fbWFpbi5nZXRGaWVsZCgpLmF1dGhvci51c2VyX25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpY2sodGhpcy5fZmluZE5hbWVBbmRIaWRlLmJpbmQodGhpcykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaWNvbl9oaWRlIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfpmpDol4/nlKjmiLfljbDorrAnLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICflsIbnlKjmiLflkI3kuIvmlrnjgIHlj7PmlrnnmoTljbDorrDpm4bol4/otbfmnaXjgIInLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IH4wLAogICAgICAgICAgICAgICAgICAgIGRlZjogZmFsc2UsCgogICAgICAgICAgICAgICAgICAgIF9pbml0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9oaWRlKCcuaWNvbl93cmFwJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC8qIm5vX3RleHRfbGluayI6IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5bGP6JS95biW5a2Q5YaF5paH5a2X5o6o5bm/6ZO+5o6lKOi/h+aXtuS6hiknLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICflsIbluJblrZDlhoXnmoTmloflrZfmjqjlub/mkJzntKLpk77mjqXmm7/mjaLkuLrmma7pgJrmlofmnKwnLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IF9fdHlwZV9semwgfCBfX3R5cGVfZmxvb3IsCiAgICAgICAgICAgICAgICAgICAgX3Byb2M6IGZ1bmN0aW9uKGZsb29yVHlwZSwgYXJncykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJtTGlua1RleHQoYXJncy5fbWFpbik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm1MaW5rVGV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcm1MaW5rVGV4dDogZnVuY3Rpb24oX3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChfcCB8fCAnYm9keScpLmZpbmQoJ2EucHNfY2InKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZnRlcihkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnRleHRDb250ZW50KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sKi8KICAgICAgICAgICAgICAgICJvcmFuZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+enu+mZpOS8muWRmOW9qeWQjScsCiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+WFqOmDqOWPmOaIkOWPmOaIkOm7mOiupOmTvuaOpeminOiJsuOAgicsCiAgICAgICAgICAgICAgICAgICAgZmxhZzogX190eXBlX2Zsb29yIHwgX190eXBlX2x6bCB8IF9fdHlwZV9mb3J1bSwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAoKICAgICAgICAgICAgICAgICAgICBjbHNMaXN0OiBbJ3NpZ25faGlnaGxpZ2h0JywgJ3ZpcF9yZWQnLCAnZmllc3RhX21lbWJlcicsICdmaWVzdGFfbWVtYmVyX3JlZCcsICdtZW1iZXJfdGhyZWFkX3RpdGxlX2ZycycsICdzaWduX2hpZ2hsaWdodCddLAoKICAgICAgICAgICAgICAgICAgICBybU9yYW5nZTogZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRhcmdldCA9ICQodGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5jbHNMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuJyArIHRoaXMuY2xzTGlzdFtpXSwgJHRhcmdldC5yZW1vdmVDbGFzcyh0aGlzLmNsc0xpc3RbaV0pKS5yZW1vdmVDbGFzcyh0aGlzLmNsc0xpc3RbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgX2luaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qCH6aKY57qi5ZCN56e76ZmkCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm1PcmFuZ2UoJ2JvZHknKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm1PcmFuZ2UoYXJncy5fbWFpbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicXVvdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+W8leeUqOalvOWxgijku4Xml6fniYhQQ+i0tOWQp+acieaViCzkvovlpoLngavni5DlkKcpJywKICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5byV55So5p+Q5LiA5bGC55qE5YaF5a65JywKICAgICAgICAgICAgICAgICAgICBmbGFnOiBfX3R5cGVfZmxvb3IsCiAgICAgICAgICAgICAgICAgICAgZGVmOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIjIzMzMzMzMzMzMzMyIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHF1b3RlID0gJCgnPGxpPicpLmFkZENsYXNzKCdwYWQtbGVmdCcpLmFwcGVuZCggLy88bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8YT4nKS50ZXh0KCcj5byV55SoJykuYWRkQ2xhc3MoJ2p4JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdqeCcsICdxdW90ZScpLmRhdGEoJ2Zsb29yJywgYXJncy5mbG9vck51bSkKICAgICAgICAgICAgICAgICAgICAgICAgKS5wcmVwZW5kVG8oJCgnLnBfdGFpbCcsIGFyZ3MuX21haW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgLypzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRxdW90ZTIgPSAkKCcucG9zdC10YWlsLXdyYXAnKS5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcygncGFkLWxlZnQnKS5hcHBlbmQoIC8vPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxhPicpLnRleHQoJyPlvJXnlKgnKS5hZGRDbGFzcygnangnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdqeCcsICdxdW90ZScpLmRhdGEoJ2Zsb29yJywgIjY2NiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwMCk7Ki8KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF9jbGljazogZnVuY3Rpb24gKCRlbGUsICRldmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRmbG9vciA9ICRlbGUucGFyZW50cygnLmxfcG9zdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGVkaXRvciA9ICQoJyN1ZWRpdG9yX3JlcGxhY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRxdW90ZSA9ICQoJzxwPicpLmFwcGVuZFRvKCRlZGl0b3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHF1b3RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCflvJXnlKggJyArICRlbGUuZGF0YSgnZmxvb3InKSArICfmpbwgQCcgKyAkKCcucF9hdXRob3JfbmFtZScsICRmbG9vcikuZmlyc3QoKS50ZXh0KCkgKyAnIOeahOWPkeiogO+8micpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCc8YnI+JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ+KAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCc8YnI+Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKCcual9kX3Bvc3RfY29udGVudCcsICRmbG9vcikuY29udGVudHMoKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGUubm9kZVR5cGUgPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGUubm9kZVZhbHVlLnRyaW0oKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHF1b3RlLmFwcGVuZChlbGUubm9kZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZWxlID0gJChlbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRlbGUuaXMoJ2EnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZWxlLmZpbmQoJ2ltZycpLnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcXVvdGUuYXBwZW5kKCdbI+WbvueJh10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcXVvdGUuYXBwZW5kKCRlbGUudGV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRlbGUuaXMoJ2ltZycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHF1b3RlLmFwcGVuZCgnWyPooajmg4VdJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRlbGUuaXMoJ29iamVjdCxlbWJlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHF1b3RlLmFwcGVuZCgnWyPop4bpopFdJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRxdW90ZS5hcHBlbmQoJGVsZS5jbG9uZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkcXVvdGUuYXBwZW5kKCc8YnI+Jmd0OyAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5nb1RvRWRpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJxdW90ZV9semwiOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+alvOS4realvOW4luWtkOW8leeUqCjku4Xml6fniYhQQ+i0tOWQp+acieaViCzkvovlpoLngavni5DlkKcpJywKICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5byV55So5qW85Lit5qW855qE5Zue5aSNJywKICAgICAgICAgICAgICAgICAgICBmbGFnOiBfX3R5cGVfbHpsLAogICAgICAgICAgICAgICAgICAgIGRlZjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgeyAvL+aWsOaXp+eJiOi0tOWQp+mDveeUn+aViAogICAgICAgICAgICAgICAgICAgICAgICB0dXBpYW5mYW5nZGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCIxMjMiKQogICAgICAgICAgICAgICAgICAgICAgICAvL19jc3MuYXBwZW5kKCcuanhfbm9fb3ZlcmZsb3cgeyBtYXgtd2lkdGg6IDEwMCU7IH0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJtSW1nKGRvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7IC8v5LuF5pen54mI6LS05ZCn55Sf5pWICiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxhPicpLnRleHQoJ+W8leeUqCcpLmFkZENsYXNzKCdqeCBkX3RhaWwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydEJlZm9yZSgkKCcubHpsX3RpbWUnLCBhcmdzLl9tYWluKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZnRlcigkKCc8c3Bhbj4nKS5hZGRDbGFzcygnZF90YWlsJykudGV4dCgnIHwgJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YSgnangnLCAncXVvdGVfbHpsJyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfY2xpY2s6IGZ1bmN0aW9uICgkZWxlLCAkZXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZWRpdG9yID0gJCgnI3VlZGl0b3JfcmVwbGFjZScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGNudCA9ICRlbGUucGFyZW50cygnLmx6bF9jbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnPHA+JykuYXBwZW5kVG8oJGVkaXRvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ+W8leeUqCBAJyArICRjbnQuZmluZCgnLmpfdXNlcl9jYXJkJykuYXR0cigndXNlcm5hbWUnKSArICcg5Zyo5qW85Lit5qW855qE5Y+R6KiA77yaPGJyPicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCRlbGUucGFyZW50cygnLmx6bF9jbnQnKS5maW5kKCcubHpsX2NvbnRlbnRfbWFpbicpLnRleHQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJzxicj4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgn4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCUJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJzxicj4gJmd0Ozxicj4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQuZ29Ub0VkaXRvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVhbF91cmwiOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+i0tOWQp+i3s+i9rOmTvuino+mZpCjlt7LlpLHmlYgpJywgLy/lj6/ku6XnlKjov5nkuKrohJrmnKzku6Pmm78gaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzc4My0lRTclOTklQkUlRTUlQkElQTYlRTglQjQlQjQlRTUlOTAlQTclRTQlQjglOEQlRTUlOEYlQUYlRTglODMlQkQlRTQlQkMlOUElRTglQjclQjMlRTglQkQlQUMg5Y676Zmk6LS05ZCn5biW5a2Q6YeM6ZO+5o6l55qE6Lez6L2sCiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+WwhueZvuW6puaJgOiwk+WuieWFqOmTvuaOpeaUueaIkOebtOmTvuOAgicsCiAgICAgICAgICAgICAgICAgICAgZmxhZzogX190eXBlX2Zsb29yIHwgX190eXBlX2x6bCwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIF9wcm9jOiBmdW5jdGlvbiAoZmxvb3JUeXBlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZmxvb3IgPSAkKGFyZ3MuX21haW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkZmxvb3IuZmluZCgnYVtocmVmKj0ianVtcC5iZGltZy5jb20vc2FmZWNoZWNrIl0nKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZWxlID0gJChlbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cmwgPSAkZWxlLnRleHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHVybC5pbmRleE9mKCdAJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvXmh0dHBzPzpcL1wvLy50ZXN0KCR1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZS5hdHRyKCdocmVmJywgJHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhFQUQg6K+35rGC5Lya5Y+Y5oiQIGVycm9yIC4uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBlbGUuaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y675L2g55qE55m+5bqmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVyOiAnaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9wLzEyMzQ1Njc4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZTogJ2J5dGVzPTAtMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5maW5hbFVybC5pbmRleE9mKCdodHRwJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxlLmF0dHIoJ2hyZWYnLCByZXNwb25zZS5maW5hbFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC8qInJtSW1nRmF2IjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfnp7vpmaTlm77niYfnmoTmlLbol4/lt6XlhbfmoI/vvIjlt7LlpLHmlYjvvIknLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICfpvKDmoIfmgqzmta7lm77niYfml7blh7rnjrDnmoTlt6XlhbfmoI/jgIInLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IDAsCiAgICAgICAgICAgICAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcuZmF2LXdyYXBwZXInKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCovCiAgICAgICAgICAgICAgICAic2F2ZV9mYWNlIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfpmpDol4/mjL3lsIrljaHog4zmma/lm77niYcnLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICfpmpDol4/mjL3lsIrljaHog4zmma/lm77niYcnLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IF9fdHlwZV9mbG9vciwKICAgICAgICAgICAgICAgICAgICBkZWY6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgX2luaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAg5qCH6aKYOiDlh7rkuIDkuKrkvb/nlKjmjL3lsIrljaHnmoTmlZnnqIvlkKcKICAgICAgICAgICAgICAgICAgICAgICAg6ZO+5o6l77yaaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9wLzU4ODk4OTUxNTYKICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiNTU1NTU1NTU1NTU1NTU1NTU1IikKICAgICAgICAgICAgICAgICAgICAgICAgLy9fY3NzLmFwcGVuZCgnLnNhdmVfbHpfZmFjZTo6YmVmb3Jle2NvbnRlbnQ6YXR0cih3aG8pICIg5L2/55So5LqG5oy95bCK5Y2hIn0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygkKCcuc2F2ZV9mYWNlX3Bvc3QnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gJCgnLnNhdmVfZmFjZV9wb3N0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcC5iZWZvcmUoIumakOiXj+aMveWwiuWNoeWbvueJhyIpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXAubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcFtpXS5zdHlsZVswXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcFtpXS5jaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLnN0eWxlID0gImJhY2tncm91bmQ6bm9uZTttYXJnaW4tbGVmdDowcHg7Y29sb3I6cmdiYSgyMDQsIDIwNCwgMjA0LCAwLjgpICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0uY2hpbGRyZW5bM10uc3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLmNoaWxkcmVuWzBdLnN0eWxlID0gInRvcDp1bnNldDt0ZXh0LWFsaWduOnVuc2V0O2ZvbnQtd2VpZ2h0OnVuc2V0OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLmNoaWxkcmVuWzFdLnN0eWxlID0gInRvcDp1bnNldDt0ZXh0LWFsaWduOnVuc2V0O2ZvbnQtd2VpZ2h0OnVuc2V0OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLmNoaWxkcmVuWzJdLnN0eWxlID0gInRvcDp1bnNldDt0ZXh0LWFsaWduOnVuc2V0O2ZvbnQtd2VpZ2h0OnVuc2V0OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLnN0eWxlID0gImNvbG9yOnJnYmEoMjA0LCAyMDQsIDIwNCwgMC44KSAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLmNoaWxkcmVuWzJdLmNoaWxkcmVuWzBdLnN0eWxlID0gImNvbG9yOnJnYmEoMjA0LCAyMDQsIDIwNCwgMC44KSAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RlbXBbaV0uY2hpbGRyZW5bMl0uY2hpbGRyZW5bMV0uc3R5bGUgPSAiY29sb3I6cmdiYSgyMDQsIDIwNCwgMjA0LCAwLjMpICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvL3RlbXAucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfcHJvYzogZnVuY3Rpb24gKGZsb29yVHlwZSwgYXJncykgeyAvL2Nocm9tZea1i+ivleaXoOaViAogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCI0NDQ0NDQ0NDQ0NDQ0NDQ0NCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcuc2F2ZV9mYWNlX3Bvc3QnLCBhcmdzLl9tYWluKS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWPkeeOsOaMveWwiuWNoQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKS5hZGRDbGFzcygnZmxvb3Itc3RyaXBlIHNhdmVfbHpfZmFjZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dobycsICQoJy5wX2F1dGhvcl9uYW1lJywgYXJncy5fbWFpbikudGV4dCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnRCZWZvcmUoYXJncy5fbWFpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLl9tYWluLmFkZENsYXNzKCdzYXZlZEZhY2UnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJtU2F2ZUZhY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+makOiXj+aMveWwiuWNoeS8muWRmOaPkOekuicsCiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+makOiXj+S8muWRmOWPkeW4lueahOS9v+eUqOaMveWwiuWNoeaPkOekuuOAgicsCiAgICAgICAgICAgICAgICAgICAgZmxhZzogMCwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBfaGlkZSgnLnNhdmVfZmFjZV9iZycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicm1faW1nX3ZpZXcxIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfnnIvlm77mqKHlvI/lsY/olL0nLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICfov5jljp/kuLrml6fniYjotLTlkKfngrnlm77nnIvlpKflm77lip/og70nLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IF9fdHlwZV9mbG9vciwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJtSW1nOiBmdW5jdGlvbiAoJHJvb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnaW1nLkJERV9JbWFnZScsICRyb290KS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gdGhpcy5zcmMubWF0Y2goL1wvc2lnbj1bYS16MC05XStcLyguKykvaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW0pIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWdMaW5rID0gJy8vaW1nc3JjLmJhaWR1LmNvbS9mb3J1bS9waWMvaXRlbS8nICsgbVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxhPicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCBpbWdMaW5rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JykuYXR0cignc3JjJywgaW1nTGluaykuYWRkQ2xhc3MoJ2p4X25vX292ZXJmbG93JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgeyAvL+aWsOaXp+eJiOi0tOWQp+mDveeUn+aViAogICAgICAgICAgICAgICAgICAgICAgICB0dXBpYW5mYW5nZGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiMTIzIikKICAgICAgICAgICAgICAgICAgICAgICAgLy9fY3NzLmFwcGVuZCgnLmp4X25vX292ZXJmbG93IHsgbWF4LXdpZHRoOiAxMDAlOyB9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5ybUltZyhkb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfcHJvYzogZnVuY3Rpb24gKGZsb29yVHlwZSwgYXJncykgeyAvL+S7heaXp+eJiOi0tOWQp+eUn+aViAogICAgICAgICAgICAgICAgICAgICAgICB0dXBpYW5mYW5nZGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiNDU2IikKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJtSW1nKGFyZ3MuX21haW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicm1faW1nX3ZpZXcyIjogewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfnnIvlm77mqKHlvI/liIfmjaInLAogICAgICAgICAgICAgICAgICAgIGRlc2M6ICfliIfmjaLkuLrotLTlkKfngrnlm77nnIvlpKflm77lip/og70nLAogICAgICAgICAgICAgICAgICAgIGZsYWc6IF9fdHlwZV9mbG9vciwKICAgICAgICAgICAgICAgICAgICBkZWY6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJtSW1nOiBmdW5jdGlvbiAoJHJvb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnaW1nLkJERV9JbWFnZScsICRyb290KS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gdGhpcy5zcmMubWF0Y2goL1wvc2lnbj1bYS16MC05XStcLyguKykvaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW0pIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWdMaW5rID0gJy8vaW1nc3JjLmJhaWR1LmNvbS9mb3J1bS9waWMvaXRlbS8nICsgbVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxhPicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCBpbWdMaW5rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JykuYXR0cignc3JjJywgaW1nTGluaykuYWRkQ2xhc3MoJ2p4X25vX292ZXJmbG93JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHVwaWFuZmFuZ2RhID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jc3MuYXBwZW5kKCcuanhfbm9fb3ZlcmZsb3cgeyBtYXgtd2lkdGg6IDEwMCU7IH0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm1JbWcoZG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgX3Byb2M6IGZ1bmN0aW9uIChmbG9vclR5cGUsIGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR1cGlhbmZhbmdkYSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJtSW1nKGFyZ3MuX21haW4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBfbWVudSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRlbXBsYXRlID0gLyogRmlsZTogbWFpbl9jb25maWcuaHRtbCAqLwogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDEwMCU7IG92ZXJmbG93LXk6IGF1dG8iPgogICAgPGgyPuWQr+eUqOeahOaooee7hDwvaDI+CiAgICA8ZGl2IGlkPSJqeF9jb25mX21vZHVsZXMiPgogICAge3sjbW9kdWxlc319CiAgICA8bGFiZWwgdGl0bGU9Int7ZGVzY319Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtbW9kdWxlPSJ7e2lkfX0iIHt7I2VuYWJsZX19Y2hlY2tlZHt7L2VuYWJsZX19Lz4ge3tuYW1lfX0KICAgIDwvbGFiZWw+e3sjY29uZmlnfX1bIDxhIGRhdGEtY29uZmlnPSJ7e2lkfX0iIGNsYXNzPSJqeF9jb25mIHB0ciI+6YWN572uPC9hPiBde3svY29uZmlnfX0KICAgIDxiciAvPgogICAge3svbW9kdWxlc319CiAgICA8L2Rpdj4KICAgIDxiciAvPgoKICAgIDwhLS0g5oyJ6ZKu5Yy6IC0tPgogICAgPGRpdiBjbGFzcz0idGV4dC1jZW50ZXIiPgogICAgPGEgY2xhc3M9InVpX2J0biB1aV9idG5fbSIgaWQ9Imp4X3NhdmUiPjxzcGFuPjxlbT7lgqjlrZg8L2VtPjwvc3Bhbj48L2E+ICZuYnNwOwogICAgPGEgY2xhc3M9InVpX2J0biB1aV9idG5fbSIgaWQ9Imp4X2Nsb3NlIj48c3Bhbj48ZW0+5pS+5byDPC9lbT48L3NwYW4+PC9hPgogICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgICovCiAgICAgICAgICAgICAgICAgICAgfSkuZXh0cmFjdCgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBfcnVuLmJpbmQoe30sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJHZpZXcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IFtdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIG1vZHVsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMuaGFzT3duUHJvcGVydHkoeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0VuYWJsZSA9IGxNb2RzLmhhc093blByb3BlcnR5KHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZpZXcubW9kdWxlcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW3hdLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogbW9kdWxlc1t4XS5kZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZTogaXNFbmFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBpc0VuYWJsZSAmJiAhIW1vZHVsZXNbeF0uX2NvbmYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciAkdHBsID0gJChNdXN0YWNoZS5yZW5kZXIoJHRlbXBsYXRlLCAkdmlldykpOyAvL+acieitpuWRigoKICAgICAgICAgICAgICAgICAgICB2YXIgJHduZENvbmZpZyA9ICQuZGlhbG9nLm9wZW4oJHRwbCwgewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+i0tOWQp+WKqeaJiyAtIOmFjee9rueql+WPoyA8c3BhbiBzdHlsZT0iY29sb3I6I2YwMDsiPijorablkYrvvIHlgqjlrZjlkI7kvJroh6rliqjliLfmlrDvvIEpPC9zcGFuPicsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjAwCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQoJy5qeF9jb25mJywgJHRwbCkuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9ICQodGhpcykuZGF0YSgnY29uZmlnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsTW9kcy5oYXNPd25Qcm9wZXJ0eSh4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3J1bihsTW9kc1t4XS5fY29uZi5iaW5kKGxNb2RzW3hdKSwgJ+aooee7hOmFjee9riBbJyArIGxNb2RzW3hdLm5hbWUgKyAnICgnICsgeCArICcpXScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQoJyNqeF9zYXZlJywgJHRwbCkuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U3RhdHVzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNqeF9jb25mX21vZHVsZXM+bGFiZWw+aW5wdXQnLCAkdHBsKS5lYWNoKGZ1bmN0aW9uIChpLCBpbnApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXR1c1skKGlucCkuZGF0YSgnbW9kdWxlJyldID0gaW5wLmNoZWNrZWQgPyBfX21vZF9lbmFibGUgOiBfX21vZF9kaXNhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbmYuc2V0KCdtb2R1bGVzJywgbmV3U3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHduZENvbmZpZy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCgnI2p4X2Nsb3NlJywgJHRwbCkuY2xpY2soJHduZENvbmZpZy5jbG9zZS5iaW5kKCR3bmRDb25maWcpKTsKICAgICAgICAgICAgICAgIH0sICfliqnmiYvorr7lrprnlYzpnaInKTsKICAgICAgICAgICAgfSkoKTsKCiAgICAgICAgICAgIC8vIOacqueZu+W9leeUqOaIt+WPr+S7pemAmui/hyBHTSDoj5zljZXmv4DmtLvphY3nva7pobkKICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn5qKm5aes6LS05ZCn5Yqp5omL5qih5Z2X6YWN572uJywgX21lbnUpOwoKICAgICAgICAgICAgaWYgKHVuc2FmZVdpbmRvdy5fX1lVTUVfREVCVUdfXykgewogICAgICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn5omT5Y2w5qih57uE6YWN572uJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygn5qKm5aes5qih57uE6YWN572uOiAnKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJGNvbmYuZ2V0KCdtb2R1bGVzJykpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIF9ydW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIF9jYWxsTWVudSA9IGZ1bmN0aW9uICgkcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCfmiJDlip/mjZXmjYnliLDoj5zljZXlhYPntKDvvIzkvKDpgJLoh7Plm57osIPigKYnKTsKICAgICAgICAgICAgICAgICAgICBfcnVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRtZW51SXRlbSA9ICQoJzxsaT4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZW51TGluayA9ICQoJzxhPicpLmFwcGVuZFRvKCRtZW51SXRlbSkuYWRkQ2xhc3MoJ2p4JykudGV4dCgn5Yqp5omL6K6+572uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vJHBhcmVudC5maW5kKCcudV90Yl9wcm9maWxlJykuYmVmb3JlKCRtZW51SXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJlbnQuZmluZCgnLnVfdGJfcHJvZmlsZScpLnBhcmVudCgpLnByZXBlbmQoJG1lbnVJdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lbnVMaW5rLmNsaWNrKF9tZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRtZW51SXRlbTIgPSAkKCc8bGk+JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVudUxpbmsyID0gJCgnPGE+JykuYXBwZW5kVG8oJG1lbnVJdGVtMikuYWRkQ2xhc3MoJ2p4IG1laWh1YScpLnRleHQoR01fZ2V0VmFsdWUoInRpZWJhbWVpaHVhIikgPyAn5byA5ZCv576O5YyWJyA6ICflhbPpl63nvo7ljJYnKTsgLy8n6LS05ZCn576O5YyWJwogICAgICAgICAgICAgICAgICAgICAgICAkKCcudV90Yl9wcm9maWxlJykuYmVmb3JlKCRtZW51SXRlbTIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzID0gJHBhcmVudC5maW5kKCJ1bD5saSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhsaXMpOy8v5ZyoIGh0dHA6Ly90aWViYS5iYWlkdS5jb20vaS9pL3JlcGx5bWUg5Lit5LiN55Sf5pWICiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXNbMV0uc3R5bGUuZGlzcGxheSA9IGxpc1syXS5zdHlsZS5kaXNwbGF5ID0gbGlzWzddLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7IC8v5Y+W5raI5bGP6JS95pyN5Yqh5Lit5b+DID0gbGlzWzZdLnN0eWxlLmRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkbWVudUxpbmsyLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ0aWViYW1laWh1YSIsIEdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpID8gZmFsc2UgOiB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCAn6I+c5Y2V5Y+s5ZSkJyk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBtYSA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgkcSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJHEpLmVhY2goZnVuY3Rpb24gKGksICRldmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJGV2ZS5hZGRlZE5vZGVzKS5lYWNoKGZ1bmN0aW9uIChpLCAkZWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRlbGUubm9kZVR5cGUgIT0gMyAmJiAkZWxlLmNsYXNzTmFtZSA9PSAndV9kZGwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZTogJCgkZWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyci5lbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hLmRpc2Nvbm5lY3QoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FsbE1lbnUoZXJyLmVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX20gPSAkKCcudV9zZXR0aW5nPi51X2RkbCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChfbS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NhbGxNZW51KF9tKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWEub2JzZXJ2ZSgkKCcudV9zZXR0aW5nJylbMF0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIDE1MDApOwogICAgICAgICAgICB9LCAn5o2V5o2J6K6+5a6aJyk7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nICgkKCdsaS51X3NldHRpbmcgLnVfdGJfcHJvZmlsZScpKTsKCiAgICAgICAgICAgIHZhciBsTW9kcyA9IHt9OwoKICAgICAgICAgICAgX3J1bihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfY3NzID0gJCgnPHN0eWxlPicpLmFwcGVuZFRvKGRvY3VtZW50LmhlYWQpOwogICAgICAgICAgICAgICAgX2Nzcy5hcHBlbmQoIC8qIEZpbGU6IHRpZWJhLmNzcyAqLwogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAucHVsbC1yaWdodAl7IGZsb2F0OiByaWdodAkJCX0KICAgIGEuangsIC5wdHIJeyBjdXJzb3I6IHBvaW50ZXIJCX0KICAgIC5wYWQtbGVmdAl7IHBhZGRpbmctbGVmdDogMC41ZW0JfQoKICAgIC5mbG9vci1zdHJpcGUgewogICAgYmFja2dyb3VuZC1pbWFnZToKICAgIGxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLAogICAgdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLAogICAgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA3NSUsCiAgICB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTsKCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDk1MzRmOwogICAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgbWFyZ2luOiAtMXB4O2NvbG9yOiAjZmZmOwogICAgdGV4dC1zaGFkb3c6ICMwMDAgMCAwIC41ZW07CiAgICBwYWRkaW5nOiAuNWVtIDAKICAgIH0KCiAgICAuaGlkZSB7IGRpc3BsYXk6IG5vbmUgfQogICAgLnRleHQtcmVkIHsgY29sb3I6IHJlZCB9CiAgICAudGV4dC1jZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQogICAgLnRleHQtZGlzYWJsZWQgeyBjb2xvcjogIzY2NjsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2ggfQoKICAgIC51c2VyLWhpZGUtcG9zdC1hY3Rpb24gPiBhLmp4LXBvc3QtYWN0aW9uIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgcGFkZGluZzogM3B4IDVweCA1cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogIzIyMjsKICAgIH0KCiAgICAudXNlci1oaWRlLXBvc3QtYWN0aW9uIGEuangtcG9zdC1hY3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogI2YyZjJmMjsKICAgIH0KCiAgICAuanhfYXV0b2Zsb3cgewogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIH0KICAgICovCiAgICAgICAgICAgICAgICAgICAgfSkuZXh0cmFjdCgpKTsKICAgICAgICAgICAgICAgIF9jc3NILmluc2VydEFmdGVyKF9jc3MpOwoKICAgICAgICAgICAgICAgIC8vIOmFjee9rumhueabtOaWsAogICAgICAgICAgICAgICAgc3dpdGNoICgkY29uZi5nZXQoJ2NvbmZWZXInLCBbMF0pWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGRpc2FibGVkTW9kcyA9ICRjb25mLmdldCgnbW9kdWxlcycsIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRtb2RzTGlzdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAkZGlzYWJsZWRNb2RzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtb2RzTGlzdFtlXSA9IF9fbW9kX2Rpc2FibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkY29uZi5zZXQoJ21vZHVsZXMnLCAkbW9kc0xpc3QpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY29uZi5zZXQoJ2NvbmZWZXInLCBbMV0pOwoKICAgICAgICAgICAgICAgIHZhciAkbW9kcyA9ICRjb25mLmdldCgnbW9kdWxlcycsIHt9KTsKCiAgICAgICAgICAgICAgICAkLmVhY2gobW9kdWxlcywgZnVuY3Rpb24gKG1JZCwgZk1vZCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkbW9kc1ttSWRdID09IF9fbW9kX2Rpc2FibGUgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKCgkbW9kc1ttSWRdID09IF9fbW9kX2RlZmF1bHQgfHwgISRtb2RzLmhhc093blByb3BlcnR5KG1JZCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kLmRlZiA9PT0gZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICBsTW9kc1ttSWRdID0gZk1vZDsKICAgICAgICAgICAgICAgICAgICBsTW9kc1ttSWRdLmlkID0gbUlkOwogICAgICAgICAgICAgICAgICAgIGlmIChsTW9kc1ttSWRdLl9pbml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygn5Yid5aeL5YyW5qih57uEOiAlc1slc10nLCBtSWQsIGxNb2RzW21JZF0ubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxNb2RzW21JZF0uX2luaXQuY2FsbChsTW9kc1ttSWRdKTsgLy/mnInorablkYoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sICdJbml0LiBtb2R1bGVzJyk7CgogICAgICAgICAgICB2YXIgX2V2ZW50ID0gZnVuY3Rpb24gKGZsb29yVHlwZSwgb3RoZXJJbmZvLCBfcHJvYykgewogICAgICAgICAgICAgICAgdmFyIGZvb0NCID0gX3Byb2MgfHwgJ19wcm9jJzsKICAgICAgICAgICAgICAgICQuZWFjaChsTW9kcywgZnVuY3Rpb24gKG1JZCwgbSkgewogICAgICAgICAgICAgICAgICAgIGlmICghbVtmb29DQl0gfHwgIShtLmZsYWcgJiBmbG9vclR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX3J1bihtW2Zvb0NCXS5iaW5kKG0sIGZsb29yVHlwZSwgb3RoZXJJbmZvKSwgbS5uYW1lKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIF9wcm9jTHpsQ29udGFpbmVyID0gZnVuY3Rpb24gKGksIHRhaWxlcikgewogICAgICAgICAgICAgICAgdmFyICR0YWlsZXIgPSAkKHRhaWxlciksCiAgICAgICAgICAgICAgICAgICAgX21haW4gPSAkdGFpbGVyLnBhcmVudHMoJy5sX3Bvc3QnKTsKCiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyAoJHRhaWxlciwgX21haW4pOwoKICAgICAgICAgICAgICAgIF9ldmVudChfX3R5cGVfZmxvb3IsIHsKICAgICAgICAgICAgICAgICAgICBfbWFpbjogX21haW4sCiAgICAgICAgICAgICAgICAgICAgZmxvb3I6IF9tYWluLAogICAgICAgICAgICAgICAgICAgIC8vIOOAjCfjgI1pcyBub3Qgc3RhbmRhcmQsIGNvbnZlcnQgdG8g44CMIuOAjSBmaXJzdC4KICAgICAgICAgICAgICAgICAgICBmbG9vck51bTogcGFyc2VJbnQoJHRhaWxlci5nZXRGaWVsZCgpLmZsb29yX251bSksCiAgICAgICAgICAgICAgICAgICAgdGFpbDogJCgnLnBfdGFpbCcsIF9tYWluKQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8g5aSE55CG6Kej5p6QIGx6bCDluJblrZDvvIjigKYKICAgICAgICAgICAgICAgIC8vICR0YWlsZXIuZmluZCgnLmx6bF9zaW5nbGVfcG9zdCcpLmVhY2goX3Byb2NMemxQb3N0KTsKICAgICAgICAgICAgICAgIHJldHVybiBfbWFpbjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBfcHJvY1RocmVhZExpc3QgPSBmdW5jdGlvbiAoaSwgdGhyZWFkbGlzdCkgewogICAgICAgICAgICAgICAgdmFyICR0aHJlYWQgPSAkKHRocmVhZGxpc3QpOwogICAgICAgICAgICAgICAgX2V2ZW50KF9fdHlwZV9mb3J1bSwgewogICAgICAgICAgICAgICAgICAgIF9tYWluOiAkdGhyZWFkLAogICAgICAgICAgICAgICAgICAgIHRocmVhZDogJHRocmVhZAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRocmVhZDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBfcHJvY0x6bFBvc3QgPSBmdW5jdGlvbiAoaSwgbHpsUG9zdCkgewogICAgICAgICAgICAgICAgdmFyICRsemwgPSAkKGx6bFBvc3QpOwogICAgICAgICAgICAgICAgX2V2ZW50KF9fdHlwZV9semwsIHsKICAgICAgICAgICAgICAgICAgICBfbWFpbjogJGx6bCwKICAgICAgICAgICAgICAgICAgICBsemw6ICRsemwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuICRsemw7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoaXNUaHJlYWQpIHsKICAgICAgICAgICAgICAgIC8vJCgnLmpfbHpsX2NvbnRhaW5lcicpLmVhY2goX3J1bi5iaW5kICh7fSwgX3Byb2NMemxDb250YWluZXIsICfliJ3lp4vljJbluJblrZDmkJzntKInKSk7Ly/lh7rplJnkuoYKICAgICAgICAgICAgICAgICQoJy5semxfc2luZ2xlX3Bvc3QnKS5lYWNoKF9ydW4uYmluZCh7fSwgX3Byb2NMemxQb3N0LCAn5Yid5aeL5YyW5qW85Lit5qW85pCc57SiJykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgnLmpfdGhyZWFkX2xpc3QnKS5lYWNoKF9ydW4uYmluZCh7fSwgX3Byb2NUaHJlYWRMaXN0LCAn5Yid5aeL5YyW6LS05ZCn6aG15biW5a2Q5pCc57SiJykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChldmUpIHsKICAgICAgICAgICAgICAgIF9ydW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICQoZXZlKS5lYWNoKGZ1bmN0aW9uIChpLCBldmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFldmUuYWRkZWROb2Rlcy5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoZXZlLmFkZGVkTm9kZXMpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBub2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZS5ub2RlVHlwZSA9PSAzKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRlbGUgPSAkKGVsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R5cGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0bXA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y2V6LS05aSE55CGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGVsZS5oYXNDbGFzcygnal9semxfY29udGFpbmVyJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfdHlwZSA9IF9fdHlwZV9mbG9vcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gX3Byb2NMemxDb250YWluZXIoaSwgJGVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcC5maW5kKCcubHpsX3NpbmdsZV9wb3N0JykuZWFjaChfcHJvY0x6bFBvc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkZWxlLmhhc0NsYXNzKCdqX3RocmVhZF9saXN0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDotLTlkKfkuLvpobXpnaIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJvY1RocmVhZExpc3QoaSwgJGVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRlbGUuaGFzQ2xhc3MoJ2x6bF9zaW5nbGVfcG9zdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5LuF6ZmQ57+76aG15pe26Kem5Y+RCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb2NMemxQb3N0KGksICRlbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkZWxlLmhhc0NsYXNzKCd1c2VyLWhpZGUtcG9zdC1hY3Rpb24nKSAmJiAhJGVsZS5oYXNDbGFzcygnanhfcG9zdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZS5hZGRDbGFzcygnanhfcG9zdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudChfX3R5cGVfcG9zdGFjdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWFpbjogJGVsZS5wYXJlbnRzKCcubF9wb3N0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZW51OiAkZWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ19tZW51Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgJ+mhtemdouWFg+e0oOaPkuWFpScpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICQoZG9jdW1lbnQuYm9keSkub24oJ2NsaWNrJywgJy5qeCcsIGZ1bmN0aW9uIChldmUpIHsKICAgICAgICAgICAgICAgIHZhciAkZXZlID0gJChldmUudGFyZ2V0KTsKICAgICAgICAgICAgICAgIHZhciAkZGF0YSA9ICRldmUuZGF0YSgnangnKTsKICAgICAgICAgICAgICAgIGlmICghJGRhdGEgfHwgIWxNb2RzWyRkYXRhXSB8fCAhbE1vZHNbJGRhdGFdLl9jbGljaykgcmV0dXJuOwoKICAgICAgICAgICAgICAgIF9ydW4uY2FsbChsTW9kc1skZGF0YV0sIGxNb2RzWyRkYXRhXS5fY2xpY2ssICc+PiDljZXlh7vliqnmiYvlip/og706ICcgKyAkZGF0YSwgJGV2ZSwgJGV2ZS5kYXRhKCdldmUnKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL3poLUNOL2RvY3MvV2ViL0FQSS9NdXRhdGlvbk9ic2VydmVyL29ic2VydmUKICAgICAgICAgICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy96aC1DTi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3Qvb2JzZXJ2ZQogICAgICAgICAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL3poLUNOL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBtby5vYnNlcnZlKCQoJyNqX3BfcG9zdGxpc3QsI3RocmVhZF9saXN0JykuZ2V0KDApLCB7CiAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgLy/nmb7luqbotLTlkKflm77niYfngrnlh7vmlL7lpKcgYnkgbGxpd2h4CiAgICAvL+WOn+eJiOeahOeCueWHu+WbvueJh+i/m+WFpeWbvueJh+WIl+ihqOeci+Wbvu+8jOacieS4gOWumuamgueOh+iDveeci+WIsOiiq+makOiXj+eahOalvOWxgu+8jOivpealvOWxgumcgOimgeacieWbvueJh++8jOWmguaenOacieaWh+Wtl+S5n+S8mumDqOWIhuaYvuekuuWHuuadpQogICAgLy/mjqjojZDlkozov5nkuKrohJrmnKzkuIDotbfkvb/nlKhodHRwczovL2dyZWFzeWZvcmsub3JnL2phL3NjcmlwdHMvMjQyMDQtcGljdmlld2VyLWNlCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBpZiAodHVwaWFuZmFuZ2RhID09IHRydWUpIHsKICAgICAgICAgICAgKGZ1bmN0aW9uICh3aW5kb3cpIHsKICAgICAgICAgICAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgICAgICAgICAgIC8vQ1NTCiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJqX3BfcG9zdGxpc3QiKTsKICAgICAgICAgICAgICAgIEdNX2FkZFN0eWxlKCIuQkRFX0ltYWdlLC5qX3VzZXJfc2lnbntjdXJzb3I6YWxpYXM7fSNUaWVfZW5sYXJnZUltYWdlX3BhcmVudERJVntwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDU7dG9wOjA7bGVmdDowO30uVGllX2VubGFyZ2VJbWFnZXtwb3NpdGlvbjphYnNvbHV0ZTtib3gtc2hhZG93OjFweCAxcHggMTBweCAjMDAwO2N1cnNvcjptb3ZlO30uVGllX2VubGFyZ2VJbWFnZTpob3Zlcnt6LWluZGV4OjEwMDY7fSNUaWVfc2V0VmFsdWVfRElWe3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6OTk5OTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt9LlRpZV9kZWZpbmVkRElWe3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDA7YmFja2dyb3VuZDojZmZmO3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO30uVGllX2RlZmluZWRESVZfdGl0bGV7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2YyZjJmNTtsaW5lLWhlaWdodDo0MHB4O2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjAgMCAwIDE1cHg7fS5UaWVfZGVmaW5lZERJVl9wb2ludHtwYWRkaW5nOjIwcHggNDBweDt9LlRpZV9kZWZpbmVkRElWX2dyb3VwU3VidGl0bGV7Zm9udC13ZWlnaHQ6Ym9sZDt9LlRpZV9kZWZpbmVkRElWX2NvbmZpZ0l0ZW17bGluZS1oZWlnaHQ6MzBweDttYXJnaW46MCAyMHB4fS5UaWVfZGVmaW5lZERJVl9jb25maWdJdGVtIHNlbGVjdHttYXJnaW46MC41ZW19LlRpZV9kZWZpbmVkRElWX2NvbmZpZ0l0ZW0gYnIrbGFiZWx7bWFyZ2luLWxlZnQ6M2VtfS5UaWVfZGVmaW5lZERJVl9jb25maWdJdGVtIGlucHV0e3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6MC41ZW19I1RpZV9kZWJ1Z0NvbmZpZ3ttYXJnaW46MC41ZW19LlRpZV9kZWJ1Z0NvbmZpZ19pY29ue3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RvcDo0cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNTBweCAtMTAwcHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoJ2h0dHBzOi8vaW1nLnQuc2luYWpzLmNuL3Q2L3N0eWxlL2ltYWdlcy9jb21tb24vaWNvbi5wbmcnKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7fS5UaWVfYnViYmxlX0RJVntwb3NpdGlvbjphYnNvbHV0ZTt2aXNpYmlsaXR5OmhpZGRlbjttYXgtd2lkdGg6MjgwcHg7dG9wOjIwJX0uVGllX2RlZmluZWRESVZfY29uZmlnSXRlbSBsYWJlbDpob3ZlcisuVGllX2J1YmJsZV9ESVZ7dmlzaWJpbGl0eTp2aXNpYmxlfS5UaWVfYnViYmxlX2NvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6NnB4IDEzcHggNnB4IDE2cHg7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6M3B4O30uVGllX2J1YmJsZV9tYWluVHh0e2xpbmUtaGVpZ2h0OjE4cHg7fS5UaWVfYnViYmxlX2Jvcntwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47Ym90dG9tOi0xNHB4O2xpbmUtaGVpZ2h0OjE0cHg7fS5UaWVfYnViYmxlX2xpbmV7Ym9yZGVyLWNvbG9yOiNjY2MgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7fS5UaWVfYnViYmxlX2Jye21hcmdpbjotMXB4IDAgMCAtMTRweDtib3JkZXItY29sb3I6I2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDt9LlRpZV9idWJibGVfYm9yIGksLlRpZV9idWJibGVfYm9yIGVte2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXdpZHRoOjdweDtib3JkZXItc3R5bGU6c29saWQ7dmVydGljYWwtYWxpZ246dG9wO292ZXJmbG93OmhpZGRlbjt9LlRpZV9kZWZpbmVkRElWX1NhdmVCdG57YmFja2dyb3VuZC1jb2xvcjojZjJmMmY1O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTBweCAwO30uVGllX1NhdmVCdG5fYXtiYWNrZ3JvdW5kOiNmZjgxNDA7Y29sb3I6I2ZmZjtmb250LXNpemU6MTVweDtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjAgMTVweDtsaW5lLWhlaWdodDozNXB4O2JvcmRlci1yYWRpdXM6M3B4O30uVGllX1NhdmVCdG5fYTpob3ZlcntiYWNrZ3JvdW5kOiNmNzY3MWR9Iik7CiAgICAgICAgICAgICAgICAvL+aVsOaNrue8k+WtmAogICAgICAgICAgICAgICAgdmFyIGltYWdlVGFyZ2V0LCBpbWFnZU1vdXNlLCBpbWFnZUNvdW50LCBpbWFnZUJ1dHRvbiwgd2luUmVzaXplLCBzY3JpcHREZWJ1ZywgbG9nID0gZnVuY3Rpb24gKCkge30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VXaGVlbCA9IC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gIkRPTU1vdXNlU2Nyb2xsIiA6ICJtb3VzZXdoZWVsIiwKICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCB8fCAiaHR0cHMiLAogICAgICAgICAgICAgICAgICAgIGRvYyA9IHdpbmRvdy5kb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICBkb2NIZWlnaHQgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIDYsCiAgICAgICAgICAgICAgICAgICAgZG9jV2lkdGggPSBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gNiwKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkRXZlbnQgPSBHTV9nZXRWYWx1ZSgiZGVmaW5lZEV2ZW50IiwgImNsaWNrLGNsaWNrLDEsMCwxIikuc3BsaXQoIiwiKSwKICAgICAgICAgICAgICAgICAgICByZXBhaXJEZWZpbmVkRXZlbnQgPSBHTV9nZXRWYWx1ZSgicmVwYWlyRGVmaW5lZEV2ZW50IiwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgIGltYWdlRXZlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlKSB7IC8v5Li75LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsIGltYWdlU3JjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuYnV0dG9uID09PSAwICYmICh0YXJnZXQuY2xhc3NOYW1lID09PSAiQkRFX0ltYWdlIiB8fCB0YXJnZXQuY2xhc3NOYW1lID09PSAial91c2VyX3NpZ24iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi5Zu+54mH5Yib5bu6IiwgIuW8gOWniyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlU3JjID0gdGFyZ2V0LnNyYy5tYXRjaCgvKFthLXowLTldK1wuW2EtekEtWl17Myw0fSkoPzpcP3Y9dGJzKT8kLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLlm77niYflnLDlnYDojrflj5YiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZVNyYykgcmV0dXJuICLmiJDlip8iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAi5aSx6LSlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0YXJnZXQuc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltYWdlU3JjKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW1nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgiVGllX2VubGFyZ2VJbWFnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5L+u5aSN5Luj56CB5p2l6IeqIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vZm9ydW0vZGlzY3Vzc2lvbi82ODEwNC8lRTUlOUIlQkUlRTclODklODclRTclODIlQjklRTUlODclQkIlRTYlOTQlQkUlRTUlQTQlQTclRTUlOEElOUYlRTglODMlQkQlRTUlQTQlQjElRTYlOTUlODgtJUU3JTgyJUI5JUU1JUJDJTgwJUU2JTk4JUJFJUU3JUE0JUJBJUU2JTlGJUE1JUU3JTlDJThCJUU3JTlBJTg0JUU1JTlCJUJFJUU3JTg5JTg3JUU0JUI4JThEJUU1JUFEJTk4JUU1JTlDJUE4IOWbvueJh+eCueWHu+aUvuWkp+WKn+iDveWkseaViO+8jOeCueW8gOaYvuekuuafpeeci+eahOWbvueJh+S4jeWtmOWcqAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IHByb3RvY29sICsgIi8vdGllYmFwaWMuYmFpZHUuY29tL2ZvcnVtL3BpYy9pdGVtLyIgKyBpbWFnZVNyY1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT09ICJodHRwczoiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIuWbvueJh+ivt+axgiIsICJodHRwc+i9rOWQkWh0dHAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImh0dHA6IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3JjID0gImh0dHA6Ly90aWViYXBpYy5iYWlkdS5jb20vZm9ydW0vcGljL2l0ZW0vIiArIGltYWdlU3JjWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09PSAiaHR0cHM6IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLlm77niYfor7fmsYIiLCAiaHR0cHPovazlkJFodHRwIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwOiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNyYyA9ICJodHRwOi8vaW1nc3JjLmJhaWR1LmNvbS9mb3J1bS9waWMvaXRlbS8iICsgaW1hZ2VTcmNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZXJyb3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmxvYWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTcmMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLlm77niYfor7fmsYIiLCAi5aSx6LSlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgi5Zu+54mH6I635Y+W5aSx6LSlXG5cbuWmguWkmuasoeiOt+WPluWksei0pVxu6K+35Zyo6K6+572u6YeM5Yu+6YCJ4oCc6LCD6K+V6ISa5pys4oCd5omT5Y2w6ISa5pys5pel5b+X5bm25oiq5Zu+5Y+N6aaI57uZ5L2c6ICF77yM5Lul5L6/5pu05aW955qE6Kej5Yaz6Zeu6aKYIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLlm77niYfliJvlu7oiLCAi6L+b6KGM5LitIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSB0YXJnZXQud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSB0YXJnZXQuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Jvb2xlYW4gPSB3aWR0aCA+IGRvY1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGJvb2xlYW4gPSBoZWlnaHQgPiBkb2NIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgPSA2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQub25lcnJvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5vbmxvYWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVNyYyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIYm9vbGVhbiAmJiAhV2Jvb2xlYW4pIFggPSAoZG9jV2lkdGggLSB3aWR0aCkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghSGJvb2xlYW4gJiYgIVdib29sZWFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYID0gKGRvY1dpZHRoIC0gd2lkdGgpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgPSAoZG9jSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUhib29sZWFuICYmIFdib29sZWFuKSBZID0gKGRvY0hlaWdodCAtIGhlaWdodCkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW1hZ2VEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYOiBYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWTogWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvL+e8k+WtmOW9k+WJjeWbvueJh+aVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgWCArICJweCwiICsgWSArICJweCkiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRESVYuYXBwZW5kQ2hpbGQodGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLlm77niYfliJvlu7oiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvYy5nZXRFbGVtZW50QnlJZCh0YXJnZXQuaWQpKSByZXR1cm4gIuaIkOWKnyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAi5aSx6LSlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGFyZ2V0LmltYWdlRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCAmJiBlLnRhcmdldC5jbGFzc05hbWUgPT09ICJCREVfSW1hZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy/pmLvmraLlhpLms6HvvIzpmLvmraLlm77niYfljp/kuovku7YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIumYu+atoui0tOWQp+WbvueJh+WOn+S6i+S7tiIsICLlt7LmiafooYwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRG93bjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSB0YXJnZXQuaW1hZ2VEYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VUYXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh2Rvd27kuovku7YiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaWQpIHRhcmdldC5pZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICLlvIDlp4siOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1vdXNlID0gW2UuY2xpZW50WCwgZS5jbGllbnRZXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ291bnQgPSBbaW1hZ2VEYXRhLlggLSBpbWFnZU1vdXNlWzBdLCBpbWFnZURhdGEuWSAtIGltYWdlTW91c2VbMV0sIDYgLSBpbWFnZURhdGEud2lkdGgsIDYgLSBpbWFnZURhdGEuaGVpZ2h0XTsgLy/lm77niYflrr3pq5jnmoTlgY/np7vph4/vvIzlm77niYflt6blj7PovrnnlYzpooTnlZnph48KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQnV0dG9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBpbWFnZUV2ZW50Lk1vdmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBpbWFnZUV2ZW50LlVwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi6byg5qCHZG93buS6i+S7tiIsICLnu5PmnZ8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTW92ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi6byg5qCHbW92ZeS6i+S7tiIsICLlvIDlp4siKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBpbWFnZVRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYID0gZS5jbGllbnRYICsgaW1hZ2VDb3VudFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZID0gZS5jbGllbnRZICsgaW1hZ2VDb3VudFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQnV0dG9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh21vdmXkuovku7YiLCAi6L+b6KGM5LitIiwgIlg6IiArIFggKyAiWToiICsgWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWCA8IGltYWdlQ291bnRbMl0pIHsgLy/lt6bovrnnlYwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgaW1hZ2VDb3VudFsyXSArICJweCwiICsgWSArICJweCkiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYID4gZG9jV2lkdGgpIHsgLy/lj7PovrnnlYwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgZG9jV2lkdGggKyAicHgsIiArIFkgKyAicHgpIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWSA8IGltYWdlQ291bnRbM10pIHsgLy/kuIrovrnnlYwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgWCArICJweCwiICsgaW1hZ2VDb3VudFszXSArICJweCkiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChZID4gZG9jSGVpZ2h0KSB7IC8v5LiL6L6555WMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSA9ICJ0cmFuc2xhdGUoIiArIFggKyAicHgsIiArIGRvY0hlaWdodCArICJweCkiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBYICsgInB4LCIgKyBZICsgInB4KSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh21vdmXkuovku7YiLCAi57uT5p2fIiwgdGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVwOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLpvKDmoId1cOS6i+S7tiIsICLlvIDlp4siKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBpbWFnZVRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdFeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBhaXJEZWZpbmVkRXZlbnQgJiYgZS5jbGllbnRYIC0gaW1hZ2VNb3VzZVswXSA8PSAxICYmIGUuY2xpZW50WSAtIGltYWdlTW91c2VbMV0gPD0gMSkgeyAvL+WwneivleS/ruWkjeWFs+mXreWbvueJh+WKn+iDvQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi5bCd6K+V5L+u5aSN5YWz6Zet5Zu+54mH5Yqf6IO9IiwgIuW3suaJp+ihjCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQnV0dG9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NyaXB0RGVidWcgJiYgIWltYWdlQnV0dG9uICYmIGUuY2xpZW50WCAtIGltYWdlTW91c2VbMF0gPT09IDAgJiYgZS5jbGllbnRZIC0gaW1hZ2VNb3VzZVsxXSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi6byg5qCHY2xpY2vkuovku7bliKTmlq0iLCAiXG7kuIAu5pON5L2c5pe26aG16Z2i5LiN5Zyo5r+A5rS754q25oCB44CC6K+35L+d6K+B5rWP6KeI5Zmo5q2j5Zyo6KKr5pON5L2c77yM5Zyo5omn6KGM5LiA5qyhXG7kuowu5YWz6Zet5Zu+54mH5Yqf6IO95Y+v6IO95o2f5Z2P77yM5bu66K6u5L+u5aSNIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltYWdlQnV0dG9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnRXggPSB0YXJnZXQuc3R5bGUudHJhbnNmb3JtLm1hdGNoKC9bLTAtOS5dKy9nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW1hZ2VEYXRhLlggPSBwYXJzZUZsb2F0KFJlZ0V4WzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW1hZ2VEYXRhLlkgPSBwYXJzZUZsb2F0KFJlZ0V4WzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVGFyZ2V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTW91c2UgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgaW1hZ2VFdmVudC5Nb3ZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgaW1hZ2VFdmVudC5VcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh3Vw5LqL5Lu2IiwgIue7k+adnyIsIGltYWdlQnV0dG9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh2NsaWNr5LqL5Lu2IiwgIuW8gOWniyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlQnV0dG9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VCdXR0b24gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQuaW1hZ2VEYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudERJVi5yZW1vdmVDaGlsZCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi6byg5qCHY2xpY2vkuovku7YiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9jLmdldEVsZW1lbnRCeUlkKHRhcmdldC5pZCkpIHJldHVybiAi5oiQ5YqfIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gIuWksei0pSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFdoZWVsOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9IHRhcmdldC5pbWFnZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxLZXkgPSBkZWZpbmVkRXZlbnRbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWFnZURhdGEud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYm9vbGVhbiA9IHdpZHRoID4gZG9jV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGJvb2xlYW4gPSBoZWlnaHQgPiBkb2NIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxYWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi6byg5qCHd2hlZWzkuovku7YiLCAi5byA5aeLIiwgaW1hZ2VEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hlZWxLZXkgIT09ICIwIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZS5jdHJsS2V5ICYmIHdoZWVsS2V5ID09PSAiMSIpIHx8IChlLmFsdEtleSAmJiB3aGVlbEtleSA9PT0gIjIiKSB8fCAoZS5zaGlmdEtleSAmJiB3aGVlbEtleSA9PT0gIjMiKSkgeyAvL+WIpOaWreWbvueJh+e8qeaUvueahOe7hOWQiOmUrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh3doZWVs57yp5pS+5LqL5Lu2IiwgIuW8gOWniyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZVggPSBlLmNsaWVudFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlWSA9IGUuY2xpZW50WSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvWCA9IChlWCAtIGltYWdlRGF0YS5YKSAvIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9ZID0gKGVZIC0gaW1hZ2VEYXRhLlkpIC8gaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxSYXRpbyA9IHdpZHRoICsgKGUud2hlZWxEZWx0YSB8fCAtZS5kZXRhaWwgKiA0MCkgKiBkZWZpbmVkRXZlbnRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YS53aWR0aCA9IHdoZWVsUmF0aW8gPCAxNTAgPyAxNTAgOiB3aGVlbFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEuaGVpZ2h0ID0gaW1hZ2VEYXRhLndpZHRoICogaGVpZ2h0IC8gd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YS5YID0gZVggLSAoaW1hZ2VEYXRhLndpZHRoICogcmF0aW9YKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhLlkgPSBlWSAtIChpbWFnZURhdGEuaGVpZ2h0ICogcmF0aW9ZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLpvKDmoId3aGVlbOe8qeaUvuS6i+S7tiIsICLov5vooYzkuK0iLCBpbWFnZURhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQud2lkdGggPSBpbWFnZURhdGEud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBpbWFnZURhdGEuWCArICJweCwiICsgaW1hZ2VEYXRhLlkgKyAicHgpIjsgLy/ln7rkuo7pvKDmoIfkvY3nva7nmoTnvKnmlL4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLpvKDmoId3aGVlbOe8qeaUvuS6i+S7tiIsICLnu5PmnZ8iLCB0YXJnZXQuc3R5bGUudHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSGJvb2xlYW4gJiYgIVdib29sZWFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLpvKDmoId3aGVlbOa7muWKqOS6i+S7tiIsICLlm77niYflsI/kuo7nqpflj6MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSGJvb2xlYW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbFhZID0gaW1hZ2VEYXRhLlkgKyAoLWUud2hlZWxEZWx0YSB8fCBlLmRldGFpbCAqIDQwKSAqIGRlZmluZWRFdmVudFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hlZWxYWSA+IDAgfHwgd2hlZWxYWSA8IGRvY0hlaWdodCAtIGhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbFhZID0gd2hlZWxYWSA+IDAgPyA2IDogZG9jSGVpZ2h0IC0gaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEuWSA9IHdoZWVsWFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLpvKDmoId3aGVlbOWeguebtOa7muWKqOS6i+S7tiIsICLov5vooYzkuK0iLCB3aGVlbFhZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgaW1hZ2VEYXRhLlggKyAicHgsIiArIHdoZWVsWFkgKyAicHgpIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIum8oOagh3doZWVs5Z6C55u05rua5Yqo5LqL5Lu2IiwgIue7k+adnyIsIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXYm9vbGVhbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsWFkgPSBpbWFnZURhdGEuWCArICgtZS53aGVlbERlbHRhIHx8IGUuZGV0YWlsICogNDApICogZGVmaW5lZEV2ZW50WzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGVlbFhZID4gMCB8fCB3aGVlbFhZIDwgZG9jV2lkdGggLSB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbFhZID0gd2hlZWxYWSA+IDAgPyA2IDogZG9jV2lkdGggLSB3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhLlggPSB3aGVlbFhZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygi6byg5qCHd2hlZWzmsLTlubPmu5rliqjkuovku7YiLCAi6L+b6KGM5LitIiwgd2hlZWxYWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSA9ICJ0cmFuc2xhdGUoIiArIHdoZWVsWFkgKyAicHgsIiArIGltYWdlRGF0YS5ZICsgInB4KSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLpvKDmoId3aGVlbOawtOW5s+a7muWKqOS6i+S7tiIsICLnu5PmnZ8iLCB0YXJnZXQuc3R5bGUudHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvL+WbvueJh+aUvuWkp+iuvue9rgogICAgICAgICAgICAgICAgdmFyIHVzZXJFdmVudCA9IHsKICAgICAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVmaW5lZERJViA9IGRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTsgLy/liJvlu7roh6rlrprkuYlESVbmoYbmnrYKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZERJVi5pZCA9ICJUaWVfc2V0VmFsdWVfRElWIjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZERJVi5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0nVGllX2RlZmluZWRESVYnPjxkaXYgY2xhc3M9J1RpZV9kZWZpbmVkRElWX3RpdGxlJz7lm77niYfmlL7lpKforr7nva48L2Rpdj48ZGl2PjxkaXYgY2xhc3M9J1RpZV9kZWZpbmVkRElWX3BvaW50Jz48ZGl2IGNsYXNzPSdUaWVfZGVmaW5lZERJVl9ncm91cFN1YnRpdGxlJz7or7fkv53or4HpvKDmoIflnKjlm77niYfkuIrov5vooYzmk43kvZwo5LuF5pSv5oyB6LS05a2Q5YaF55qE5qW85bGC5Zu+54mH77yBKTwvZGl2PjxkaXYgY2xhc3M9J1RpZV9kZWZpbmVkRElWX2NvbmZpZ0l0ZW0nPum7mOiupOaUr+aMgem8oOagh+W3pumUruaLluaLveWbvueJh++8jOS/ruaUuemFjee9ruWQjuWIt+aWsOS4gOS4izwvZGl2PjxkaXYgY2xhc3M9J1RpZV9kZWZpbmVkRElWX2NvbmZpZ0l0ZW0nPuafpeeci+WbvueJhzxzZWxlY3QgbmFtZT0nVGllX3NldFZhbHVlJz48b3B0aW9uIHZhbHVlPSdjbGljayc+5Y2V5Ye7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGJsY2xpY2snPuWPjOWHuzwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjxkaXYgY2xhc3M9J1RpZV9kZWZpbmVkRElWX2NvbmZpZ0l0ZW0nPuWFs+mXreWbvueJhzxzZWxlY3QgbmFtZT0nVGllX3NldFZhbHVlJz48b3B0aW9uIHZhbHVlPSdjbGljayc+5Y2V5Ye7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGJsY2xpY2snPuWPjOWHuzwvb3B0aW9uPjwvc2VsZWN0PuiLpeadoeS7tuWFgeiuuO+8jOaOqOiNkOmAieaLqeWPjOWHu+S7peWFvOWuuem8oOagh+enu+WKqOWbvueJhzxicj48bGFiZWw+PGlucHV0IGlkPSdUaWVfcmVwYWlyVmFsdWUnIHR5cGU9J2NoZWNrYm94Jz7lsJ3or5Xkv67lpI3lhbPpl63lm77niYflip/og708L2xhYmVsPjwvZGl2PjxkaXYgY2xhc3M9J1RpZV9kZWZpbmVkRElWX2NvbmZpZ0l0ZW0nPua7muWKqOWbvueJhzxzZWxlY3QgbmFtZT0nVGllX3NldFZhbHVlJz48b3B0aW9uIHZhbHVlPScxJz7mu5rova7lkJHkuIrvvIzkuIrnp7sv5bem56e7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nLTEnPua7mui9ruWQkeS4i++8jOS4iuenuy/lt6bnp7s8L29wdGlvbj48L3NlbGVjdD48L2Rpdj48ZGl2IGNsYXNzPSdUaWVfZGVmaW5lZERJVl9jb25maWdJdGVtJz7nvKnmlL7lm77niYc8c2VsZWN0IG5hbWU9J1RpZV9zZXRWYWx1ZSc+PG9wdGlvbiB2YWx1ZT0nMCc+5YWz6ZetPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nMSc+Q3RybDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9JzInPkFsdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9JzMnPlNoaWZ0PC9vcHRpb24+PC9zZWxlY3Q+KzxzZWxlY3QgbmFtZT0nVGllX3NldFZhbHVlJz48b3B0aW9uIHZhbHVlPScxJz7mu5rova7lkJHkuIrmlL7lpKc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSctMSc+5rua6L2u5ZCR5LiL5pS+5aSnPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+PGRpdiBjbGFzcz0nVGllX2RlZmluZWRESVZfY29uZmlnSXRlbSc+6LCD6K+V6ISa5pysPGxhYmVsPjxpbnB1dCBpZD0nVGllX2RlYnVnQ29uZmlnJyB0eXBlPSdjaGVja2JveCc+PGkgY2xhc3M9J1RpZV9kZWJ1Z0NvbmZpZ19pY29uJz48L2k+PC9sYWJlbD48ZGl2IGNsYXNzPSdUaWVfYnViYmxlX0RJVic+PGRpdiBjbGFzcz0nVGllX2J1YmJsZV9jb250ZW50Jz48ZGl2IGNsYXNzPSdUaWVfYnViYmxlX21haW5UeHQnPuWmguaenOaCqOeahOiEmuacrOWHuueOsOmXrumimO+8jOaCqOWPr+S7peaJk+W8gOiwg+ivleWKn+iDveOAgjxzdHJvbmc+5Zyo6aG16Z2i6L+b6KGM5bmz5bi455qE5Zu+54mH5pON5L2c77yM5bCG5pON5L2c6L+H5ZCO5Zyo5rWP6KeI5Zmo5o6n5Yi25Y+w77yI5b+r5o236ZSu77yaRjEy77yJ6L6T5Ye655qE6ISa5pys5pel5b+X5oiq5Zu+5Y+N6aaI57uZ5L2c6ICFPC9zdHJvbmc+77yM5Lul5L6/5pu05aW955qE6Kej5Yaz6Zeu6aKY44CCPGJyPuazqOaEj++8jDxzdHJvbmc+6LCD6K+V5Yqf6IO95omT5byA5Y2z55Sf5pWI44CC5bm25LiU5Y+q5Zyo5b2T5YmN6aG16Z2i55Sf5pWI5LiA5qyh77yM5Yi35paw5oiW5YWz6Zet6aG16Z2i6YO95Lya5Y+W5raI6LCD6K+V5Yqf6IO977yM6ZyA6YeN5paw5omT5byAPC9zdHJvbmc+44CCPGJyPuaJk+W8gOiwg+ivleWKn+iDveWPr+iDveS8muWinuWKoOWGheWtmOWNoOeUqOOAgemZjeS9jue9kemhteeahOWPjeW6lOmAn+W6pueUmuiHs+WvvOiHtOa1j+iniOWNoemhv+OAguS7heS+m+e7tOaKpOS9v+eUqO+8jOS4jeW7uuiuruS4gOiIrOeUqOaIt+aJk+W8gOiwg+ivleWKn+iDveOAgjwvZGl2PjxkaXY+PHNwYW4gY2xhc3M9J1RpZV9idWJibGVfYm9yJz48aSBjbGFzcz0nVGllX2J1YmJsZV9saW5lJz48L2k+PGVtIGNsYXNzPSdUaWVfYnViYmxlX2JyJz48L2VtPjwvc3Bhbj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdUaWVfZGVmaW5lZERJVl9TYXZlQnRuJz48YSBpZD0nVGllX3NldFZhbHVlX2EnIGNsYXNzPSdUaWVfU2F2ZUJ0bl9hJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7Jz48c3Bhbj7noa7lrpo8L3NwYW4+PC9hPjwvZGl2PjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKGRlZmluZWRESVYpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkRElWID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEV2ZW50OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWZpbmVkRElWID0gZG9jLmdldEVsZW1lbnRCeUlkKCJUaWVfc2V0VmFsdWVfRElWIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJWYWx1ZSA9IGRvYy5nZXRFbGVtZW50QnlJZCgiVGllX3JlcGFpclZhbHVlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0NvbmZpZyA9IGRvYy5nZXRFbGVtZW50QnlJZCgiVGllX2RlYnVnQ29uZmlnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gZG9jLmdldEVsZW1lbnRCeUlkKCJqX3BfcG9zdGxpc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gZG9jLmdldEVsZW1lbnRzQnlOYW1lKCJUaWVfc2V0VmFsdWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZERlZmluZWRFdmVudCA9IGRlZmluZWRFdmVudDsgLy/lpIfku73ml6forr7nva4KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlW2ldLnZhbHVlID0gb2xkRGVmaW5lZEV2ZW50W2ldOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZVszXS52YWx1ZSA9PT0gIjAiKSBzZXRWYWx1ZVs0XS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlWzNdLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVbNF0uc3R5bGUudmlzaWJpbGl0eSA9IHRoaXMudmFsdWUgPT09ICIwIiA/ICJoaWRkZW4iIDogInZpc2libGUiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJWYWx1ZS5jaGVja2VkID0gcmVwYWlyRGVmaW5lZEV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0NvbmZpZy5jaGVja2VkID0gc2NyaXB0RGVidWc7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5nZXRFbGVtZW50QnlJZCgiVGllX3NldFZhbHVlX2EiKS5vbmNsaWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZEV2ZW50ID0gW3NldFZhbHVlWzBdLnZhbHVlLCBzZXRWYWx1ZVsxXS52YWx1ZSwgc2V0VmFsdWVbMl0udmFsdWUsIHNldFZhbHVlWzNdLnZhbHVlLCBzZXRWYWx1ZVs0XS52YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJEZWZpbmVkRXZlbnQgPSByZXBhaXJWYWx1ZS5jaGVja2VkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGVidWcgPSBkZWJ1Z0NvbmZpZy5jaGVja2VkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZERlZmluZWRFdmVudFswXSAhPT0gZGVmaW5lZEV2ZW50WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KSB7fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG9sZERlZmluZWRFdmVudFswXSwgaW1hZ2VFdmVudC5pbml0LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGRlZmluZWRFdmVudFswXSwgaW1hZ2VFdmVudC5pbml0LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkRGVmaW5lZEV2ZW50WzFdICE9PSBkZWZpbmVkRXZlbnRbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHt9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRESVYucmVtb3ZlRXZlbnRMaXN0ZW5lcihvbGREZWZpbmVkRXZlbnRbMV0sIGltYWdlRXZlbnQuQ2xvc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRESVYuYWRkRXZlbnRMaXN0ZW5lcihkZWZpbmVkRXZlbnRbMV0sIGltYWdlRXZlbnQuQ2xvc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyA9IHNjcmlwdERlYnVnICYmIGZ1bmN0aW9uICh0ZXh0LCB0eXBlcywgZGF0YSkgeyAvL+iEmuacrOiwg+ivle+8jOaXpeW/lwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZXMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSBjb25zb2xlLmxvZyh0ZXh0LCB0eXBlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjb25zb2xlLmxvZyh0ZXh0LCB0eXBlcywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCLlm77niYfmlL7lpKforr7nva4iLCAi5bey5omn6KGMIiwgZGVmaW5lZEV2ZW50ICsgIiwiICsgcmVwYWlyRGVmaW5lZEV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25jbGljayA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZVszXS5vbmNoYW5nZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MuYm9keS5yZW1vdmVDaGlsZChkZWZpbmVkRElWKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJkZWZpbmVkRXZlbnQiLCBkZWZpbmVkRXZlbnQudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgicmVwYWlyRGVmaW5lZEV2ZW50IiwgcmVwYWlyRGVmaW5lZEV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWRESVYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWlyVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdDb25maWcgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGREZWZpbmVkRXZlbnQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLlm77niYfmlL7lpKforr7nva4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2MuZ2V0RWxlbWVudEJ5SWQoIlRpZV9zZXRWYWx1ZV9ESVYiKSkgewogICAgICAgICAgICAgICAgICAgICAgICB1c2VyRXZlbnQuaW5pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/liJvlu7rniLZESVYKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRESVYgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICBwYXJlbnRESVYuaWQgPSAiVGllX2VubGFyZ2VJbWFnZV9wYXJlbnRESVYiOwogICAgICAgICAgICAgICAgZG9jLmJvZHkuYXBwZW5kQ2hpbGQocGFyZW50RElWKTsKICAgICAgICAgICAgICAgIC8v5LqL5Lu25aeU5omYCiAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgaW1hZ2VFdmVudC5TdG9wUHJvcGFnYXRpb24sIHRydWUpOwogICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGRlZmluZWRFdmVudFswXSwgaW1hZ2VFdmVudC5pbml0LCB0cnVlKTsKICAgICAgICAgICAgICAgIHBhcmVudERJVi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCBpbWFnZUV2ZW50LkRvd24pOwogICAgICAgICAgICAgICAgcGFyZW50RElWLmFkZEV2ZW50TGlzdGVuZXIoZGVmaW5lZEV2ZW50WzFdLCBpbWFnZUV2ZW50LkNsb3NlKTsKICAgICAgICAgICAgICAgIHBhcmVudERJVi5hZGRFdmVudExpc3RlbmVyKG1vdXNlV2hlZWwsIGltYWdlRXZlbnQuV2hlZWwpOwogICAgICAgICAgICAgICAgLy/ph4rmlL7nvJPlrZgKICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICghR01fZ2V0VmFsdWUoImRlZmluZWRFdmVudCIpKSB7CiAgICAgICAgICAgICAgICAgICAgdXNlckV2ZW50LmluaXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5SZXNpemUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQod2luUmVzaXplKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd2luUmVzaXplID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hlaWdodCA9IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jV2lkdGggPSBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gNjsKICAgICAgICAgICAgICAgICAgICB9LCAzMzQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKHdpbmRvdyk7CiAgICAgICAgfQogICAgfSwgMjAwMCk7CgogICAgLyooZnVuY3Rpb24gKCkgeyAvL+W8uuWItui9rOaNoumDqOWIhui3s+i9rOmTvuaOpQogICAgICAgIHZhciBsb2NhdGlvbkhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKICAgICAgICBmdW5jdGlvbiBkZWNvZGUodXJsLCB0YXJnZXQpIHsKICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgbWV0aG9kOiAnSEVBRCcsCiAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAiUmVmZXJlciI6IGxvY2F0aW9uSHJlZiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdVcmwgPSByZXNwb25zZS5maW5hbFVybDsKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKG5ld1VybCk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnaHJlZicsIG5ld1VybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcnVuKCkgewogICAgICAgICAgICB2YXIgdXJscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZl49Imh0dHA6Ly9qdW1wLmJkaW1nLmNvbS9zYWZlY2hlY2siXScpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh1cmxzW2ldLnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJhcGNfc3JjX3dyYXBwZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgZGVjb2RlKHVybHNbaV0sIHVybHNbaV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gdXJsc1tpXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAodXJsLmluZGV4T2YoImh0dHAiKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gImh0dHA6Ly8iICsgdXJsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh1cmwpOwogICAgICAgICAgICAgICAgICAgIHVybHNbaV0uc2V0QXR0cmlidXRlKCJocmVmIiwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWRkTXV0YXRpb25PYnNlcnZlcihzZWxlY3RvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHdhdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgICAgIGlmICghd2F0Y2gpIHJldHVybjsKCiAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHsKICAgICAgICAgICAgICAgIHZhciBub2RlQWRkZWQgPSBtdXRhdGlvbnMuc29tZShmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LmFkZGVkTm9kZXMubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5vZGVBZGRlZCkgewogICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh3YXRjaCwgewogICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcnVuKCk7CiAgICAgICAgYWRkTXV0YXRpb25PYnNlcnZlcignI2pfcF9wb3N0bGlzdCcsIHJ1bik7CiAgICB9KSgpOyovCgogICAgLy/mn6XnnIvlj5HluJYgYnkg5paH56eRCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJCA9IHVuc2FmZVdpbmRvdy4kOwoKICAgICAgICBmdW5jdGlvbiBnZXRVc2VySGlzdG9yeShlKSB7CiAgICAgICAgICAgIHZhciB1c2VyTmFtZSA9IChKU09OLnBhcnNlKGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YScpKSkudW47CiAgICAgICAgICAgIHZhciBiYXJOYW1lID0gIiI7CiAgICAgICAgICAgIGlmICgi5YWo6LS05ZCn5Y+R6KiA6K6w5b2VIiAhPSBlLnRhcmdldC50ZXh0Q29udGVudCkgewogICAgICAgICAgICAgICAgYmFyTmFtZSA9IHByb21wdCgn6L6T5YWl6LS05ZCn5ZCNJywgJCgiI3dkMSIpLmF0dHIoInZhbHVlIikpOwogICAgICAgICAgICAgICAgaWYgKCFiYXJOYW1lKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJhck5hbWUgPT0gbnVsbCkgYmFyTmFtZSA9ICIiOwogICAgICAgICAgICB3aW5kb3cub3BlbigiaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9mL3NlYXJjaC91cmVzP2llPXV0Zi04Jmt3PSIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFyTmFtZSkgKyAiJnF3PSZybj0xMDAmdW49IiArIGVuY29kZVVSSUNvbXBvbmVudCh1c2VyTmFtZSkgKyAiJnNtPTEiLCAiX2JsYW5rIik7CiAgICAgICAgfQogICAgICAgIChmdW5jdGlvbiBhZGRCdG4oKSB7CiAgICAgICAgICAgICQoJy5kX2F1dGhvciAucF9hdXRob3InKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5xdWVyeVNlbGVjdG9yKCcucF9hdXRob3JfbmFtZScpLmdldEF0dHJpYnV0ZSgnZGF0YS1maWVsZCcpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5hcHBlbmQoJzxsaSBjbGFzcz0idXNlcl9wb3N0X2xpIiBzdHlsZT0ibWFyZ2luLXRvcDo0cHgiPjxhIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7Y29sb3I6I0ZGNjYwMDsiIGRhdGE9JyArIGRhdGEgKyAnPuWFqOi0tOWQp+WPkeiogOiusOW9lTwvYT48L2xpPicpCiAgICAgICAgICAgICAgICAkKHRoaXMpLmFwcGVuZCgnPGxpIGNsYXNzPSJ1c2VyX3Bvc3RfbGkiIHN0eWxlPSJtYXJnaW4tdG9wOjRweCI+PGEgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjtjb2xvcjojRkY2NjAwOyIgZGF0YT0nICsgZGF0YSArICc+5p+Q6LS05ZCn5Y+R6KiA6K6w5b2VPC9hPjwvbGk+JykKICAgICAgICAgICAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfcG9zdF9saSBhJylbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnZXRVc2VySGlzdG9yeSkKICAgICAgICAgICAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfcG9zdF9saSBhJylbMV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnZXRVc2VySGlzdG9yeSkKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkoKTsKICAgIH0sIGZhbHNlKTsKCiAgICAvL+eZvuW6pui0tOWQp+aMieWPkeW4luaXtumXtO+8iOW4luWtkElE77yJ5o6S5bqPIGJ5IE5VTEwKICAgIHZhciBiYWNrdXBzaHVueHUgPSBuZXcgQXJyYXkoKTsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHZhciBwYXJlbnROb2RleCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aHJlYWRfbGlzdCcpOwogICAgICAgIGlmIChwYXJlbnROb2RleCAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciB0aHJlYWRzeCA9IHBhcmVudE5vZGV4LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX3RocmVhZF9saXN0Om5vdCgudGhyZWFkX3RvcCknKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRzeC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aHJlYWRzeFtpXSk7CiAgICAgICAgICAgICAgICBiYWNrdXBzaHVueHUucHVzaCh0aHJlYWRzeFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LCAzMDAwKTsKCiAgICB2YXIgeWlwYWl4dW4gPSAwOwogICAgdmFyIHlpcGFpeHVuMiA9IGZhbHNlOwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIS9eaHR0cHM/OlwvXC90aWViYVwuYmFpZHVcLmNvbVwvZlw/LiokLy50ZXN0KGxvY2F0aW9uLmhyZWYpKSByZXR1cm47CgogICAgICAgIGZ1bmN0aW9uIHNvcnRCeUlkKCkgewogICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aHJlYWRfbGlzdCcpOwogICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHlpcGFpeHVuID09IDApIHsKICAgICAgICAgICAgICAgICQoIi5mYXRpZXNoaWppYW5wYWl4dSIpLmh0bWwoJ+aMieWbnuWkjeaXtumXtOWAkuW6jzxzcGFuIHN0eWxlPSJjb2xvcjojMDAwICFpbXBvcnRhbnQ7Ij4o5b2T5YmN5Li6OuWPkei0tOaXtumXtOaOkuW6jyk8L3NwYW4+JykKICAgICAgICAgICAgICAgIHlpcGFpeHVuID0gMTsKICAgICAgICAgICAgICAgIHZhciB0aHJlYWRzID0gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcual90aHJlYWRfbGlzdDpub3QoLnRocmVhZF90b3ApJyk7CiAgICAgICAgICAgICAgICB2YXIgdGhyZWFkQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHRocmVhZCBvZiB0aHJlYWRzKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogSlNPTi5wYXJzZSh0aHJlYWQuZ2V0QXR0cmlidXRlKCdkYXRhLWZpZWxkJykpLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkOiB0aHJlYWQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aHJlYWQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyZWFkQXJyYXkuc29ydCgoYSwgYikgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmlkIC0gYS5pZDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZm9yICh2YXIgdGhyZWFkMiBvZiB0aHJlYWRBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhyZWFkMi50aHJlYWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHlpcGFpeHVuID09IDEpIHsKICAgICAgICAgICAgICAgICQoIi5mYXRpZXNoaWppYW5wYWl4dSIpLmh0bWwoJ+aMieWbnuWkjeaXtumXtOmhuuW6jzxzcGFuIHN0eWxlPSJjb2xvcjojMDAwICFpbXBvcnRhbnQ7Ij4o5b2T5YmN5Li6OuWbnuWkjeaXtumXtOWAkuW6jyk8L3NwYW4+JykKICAgICAgICAgICAgICAgIHlpcGFpeHVuID0gMjsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIjY2NiIpOwogICAgICAgICAgICAgICAgbGV0IHRocmVhZHMzID0gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcual90aHJlYWRfbGlzdDpub3QoLnRocmVhZF90b3ApJyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB0aHJlYWQgb2YgdGhyZWFkczMpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRocmVhZCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gYmFja3Vwc2h1bnh1Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiMjMzMyIpCiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChiYWNrdXBzaHVueHVbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgeWlwYWl4dW4gPSAwOwogICAgICAgICAgICAgICAgJCgiLmZhdGllc2hpamlhbnBhaXh1IikuaHRtbCgn5oyJ5Y+R6LS05pe26Ze05o6S5bqPPHNwYW4gc3R5bGU9ImNvbG9yOiMwMDAgIWltcG9ydGFudDsiPijlvZPliY3kuLo65Zue5aSN5pe26Ze06aG65bqPKTwvc3Bhbj4nKQogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiNjY2Iik7CiAgICAgICAgICAgICAgICBsZXQgdGhyZWFkczMgPSBwYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX3RocmVhZF9saXN0Om5vdCgudGhyZWFkX3RvcCknKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IHRocmVhZCBvZiB0aHJlYWRzMykgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhyZWFkKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja3Vwc2h1bnh1Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiMjMzMyIpCiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChiYWNrdXBzaHVueHVbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgIC8vICAgIHRyeSB7CiAgICAgICAgLy8gICAgICAgICQoImRpdi5zZWFyY2hfYmFja19ib3giKVswXS5jbGFzc0xpc3QucmVtb3ZlKCJzZWFyY2gtYmFjay1maXhlZCIpOwogICAgICAgIC8vICAgICAgICAkKCJkaXYudG9waWNfbGlzdF9ib3giKVswXS5jbGFzc0xpc3QucmVtb3ZlKCJ0b3BpYy1zZWFyY2gtYmFjay1maXhlZCIpOwogICAgICAgIC8vICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qYWxlcnQoZXJyb3IpOyovIH0KICAgICAgICAvL30sIDUwMCk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICBhLnRleHRDb250ZW50ID0gJ+aMieWPkei0tOaXtumXtOaOkuW6jyjotLTlrZBJRCknOwogICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnZmF0aWVzaGlqaWFucGFpeHUnKTsKICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSkgewogICAgICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiM5OTkgIWltcG9ydGFudDtwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMTAyJTt3aWR0aDogMTEwcHg7dG9wOiAxMnB4O2hlaWdodDogNDBweDtjdXJzb3I6IC13ZWJraXQtZ3JhYjsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdzdHlsZScsICdjb2xvcjojOTk5ICFpbXBvcnRhbnQ7cG9zaXRpb246IGFic29sdXRlO2xlZnQ6NDcwcHg7d2lkdGg6IDExMHB4O3RvcDogMzhweDtoZWlnaHQ6IDQwcHg7Y3Vyc29yOiAtd2Via2l0LWdyYWI7ei1pbmRleDogMTAwMDsnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2Euc2V0QXR0cmlidXRlKCdocmVmJywgJ2phdmFzY3JpcHQ6OycpOwogICAgICAgICAgICB2YXIgcGFpeHVuID0gZmFsc2UKICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyAvL+W/hemhu+WFiOiHquWKqOa7muWKqOe9kemhte+8jOmihOiniOaJgOacieWbvueJh+WQju+8jOaJjeiDveS/neivgeWbvueJh+mDveiDveaYvuekuuWHuuadpQogICAgICAgICAgICAgICAgaWYgKHlpcGFpeHVuMiA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHlpcGFpeHVuMiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmIChwYWl4dW4gPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFpeHVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IC8v5ruR5Yqo5p2h6Ieq5Yqo5LiL5ouJ55yL5a6M572R6aG177yM5Lul6Kej5Yaz5o6S5bqP5ZCO5Zu+54mH5peg5rOV5Yqg6L2955qE6Zeu6aKYCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8PSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWl4dW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0QnlJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNvcnRCeUlkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NhcmRfaW5mb051bScpWzBdLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDMwMDApOwogICAgfSkoKTsKCiAgICAvKihmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gQHJldHVybnMge251bWJlcnwiIn0g5piv5ZCm55m75b2V77yM5LiN55m76ZmG5Li6MOaIliIiLOS4uuS6humAgumFjeS4jeeZu+mZhueci+i0tOWKn+iDvQogICAgICAgIGxldCB0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0KTsKICAgICAgICAgICAgdmFyIGdldElzTG9naW4yID0gdW5zYWZlV2luZG93LlBhZ2VEYXRhLnVzZXIuaWQgfHwgdW5zYWZlV2luZG93LlBhZ2VEYXRhLnVzZXIudXNlcl9pZDsgLy/ojrflj5bnlKjmiLdpZAogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpZCIpID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJ1c2VyaWQiLCBnZXRJc0xvZ2luMikKICAgICAgICAgICAgfSovCiAgICAvL2NvbnNvbGUubG9nKGdldElzTG9naW4yKQogICAgLy9pZiAoZ2V0SXNMb2dpbjIgIT0gMCAmJiBnZXRJc0xvZ2luMiAhPSAiIiAmJiBnZXRJc0xvZ2luMiA9PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlcmlkIikgJiYgIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpIC8q5YWz6Zet6LS05ZCn576O5YyW5ZCO77yM5LiN5pi+56S65aSn5aS05YOPKi8gKSB7CiAgICAvLyBsZXQgamlzaHUgPSAwOwogICAgLy8gbGV0IHQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IC8v5Li65Y+z5LiK6KeS55qE5rWu5Yqo5oyJ6ZKu5re75Yqg5aS05YOPCiAgICAvLyBpZiAoamlzaHUgPCAyMCkgewogICAgLy9jb25zb2xlLmxvZygkKCJkaXYuZWR1aS1pY29uLWJvbGQiKVswXSk7CiAgICAvKmlmICgkKCJkaXYuZWR1aS1idG4tYm9sZCIpWzBdICE9IG51bGwgJiYgJCgiZGl2LmVkdWktYnRuLXJlZCIpWzBdICE9IG51bGwgJiYgc3VvID09IGZhbHNlKSB7CiAgICAgICAgLy9jb25zb2xlLmxvZygkKCJkaXYuZWR1aS1pY29uLWJvbGQiKVswXSk7CiAgICAgICAgc3VvID0gdHJ1ZTsKICAgICAgICAkKCJkaXYuZWR1aS1idG4tYm9sZCIpWzBdLnN0eWxlID0gImRpc3BsYXk6YmxvY2s7IiAvL+iuqeWPkei0tOaWh+acrOe8lui+keWZqOeahOWtl+S9k+WKoOeyl+aMiemSruWSjOaWh+Wtl+WPmOe6ouaMiemSruS4gOWumuiDveaYvuekuuWHuuadpeOAgjIwMjAtMi0yN+e7j+a1i+ivleehruWumuivpeWKn+iDveW3suWkseaViOOAggogICAgICAgICQoImRpdi5lZHVpLWJ0bi1yZWQiKVswXS5zdHlsZSA9ICJkaXNwbGF5OmJsb2NrOyIKICAgIH0qLwogICAgLyogbGV0IHVzZXJpbWcgPSAiIjsKICAgICBsZXQgdGVtcCA9ICQoImltZy5oZWFkX2ltZyIpWzBdIHx8ICQoImEudXNlcmluZm9faGVhZD5pbWciKVswXSB8fCAkKCIjaW1nX2FzaWRlX2hlYWQiKVswXSB8fCAkKCJzcGFuLnBtX3VzZXJfbG9nbz5pbWciKVswXSB8fCAkKCJpbWcudXNlcl9hdmF0YXIiKVswXTsKICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpbWciKSAhPSBudWxsICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ1c2VyaW1nIikgIT0gIiIgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpbWciKSAhPSB1bmRlZmluZWQpIHsgLy9odHRwczovL3d3dy5jbmJsb2dzLmNvbS96aGFveGlubWVpLTEyMy9wLzkwNDY5NjIuaHRtbAogICAgICAgICB1c2VyaW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpbWciKTsKICAgICB9IGVsc2UgewogICAgICAgICB0ZW1wID0gJCgiaW1nLmhlYWRfaW1nIilbMF0gfHwgJCgiYS51c2VyaW5mb19oZWFkPmltZyIpWzBdIHx8ICQoIiNpbWdfYXNpZGVfaGVhZCIpWzBdIHx8ICQoInNwYW4ucG1fdXNlcl9sb2dvPmltZyIpWzBdIHx8ICQoImltZy51c2VyX2F2YXRhciIpWzBdOwogICAgICAgICAvL+i0tOWQp+S4u+mimOWIl+ihqO+8jOaIkeeahOi0tOWQp++8jOaIkeeahGnotLTlkKfvvIzotLTlkKfmnI3liqHkuK3lv4PvvIzlkKfliqHlkI7lj7AKICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wLnNyYykKICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInVzZXJpbWciLCB0ZW1wLnNyYykKICAgICAgICAgdXNlcmltZyA9IHRlbXAuc3JjOwogICAgIH0KICAgICAvL2NvbnNvbGUubG9nKHVzZXJpbWcpOwogICAgIGlmICh1c2VyaW1nICE9IHVuZGVmaW5lZCAmJiB1c2VyaW1nICE9IG51bGwgJiYgdXNlcmltZyAhPSAiIikgewogICAgICAgICBpZiAoJCgiaW1nLnVfdXNlcm5hbWVfYXZhdGFyIilbMF0gPT0gbnVsbCAmJiAkKCJzcGFuLnVfdXNlcm5hbWVfdGl0bGUiKVswXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAkKCJzcGFuLnVfdXNlcm5hbWVfdGl0bGUiKS5iZWZvcmUoJzxpbWcgY2xhc3M9InVfdXNlcm5hbWVfYXZhdGFyIiBzcmM9JyArIHVzZXJpbWcgKyAnPicpOwogICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0KTsKICAgICAgICAgfQogICAgIH0qLwoKICAgIC8vICAgamlzaHUrKzsKICAgIC8vfSBlbHNlIHsKICAgIC8vICAgICBjbGVhckludGVydmFsKHQpOwogICAgLy8gfQogICAgLy9jb25zb2xlLmxvZyh1c2VyaW1nKTsKICAgIC8vdmFyIHVzZXJpbWc9JCgiaW1nLmhlYWRfaW1nIilbMF0uc3JjOy8vZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaW1nLmhlYWRfaW1nIikuc3JjLy/lvpfliLDoh6rlt7HnmoTotLTlkKflpLTlg48KICAgIC8vfSwgMTAwMCk7CgogICAgLyp9IGVsc2UgewogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oInVzZXJpbWciKTsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJ1c2VyaWQiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDEwMDApOwogICAgfSkoKTsqLwoKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IGppc2h1ID0gMDsKICAgICAgICBsZXQgdCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgaWYgKGppc2h1IDwgNjApIHsKICAgICAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgICAgICQoIi51X3RiX3Byb2ZpbGU+YSIpLmF0dHIoImhyZWYiLCAiaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9pL2kvcHJvZmlsZSIpOyAvL+S/ruWkjei0tOWQp+iuvue9ruaMiemSruaXoOaViGJ1ZwogICAgICAgICAgICAgICAgbGV0IHRlbXAyID0gJCgiLnBvc3RfYnViYmxlX2JvdHRvbSIpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wMltpXS5zdHlsZVsiYmFja2dyb3VuZC1pbWFnZSJdID09ICd1cmwoIi8vdGIxLmJkc3RhdGljLmNvbS90Yi9jbXMvcG9zdC9idWJibGUvaHVpeXVhbmFpXzAzLnBuZyIpJykgLy/kv67lpI3kuIDkuKrmpbzlsYLog4zmma/msJTms6HlhoXpg6jmnInnmb3nur8KICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDJbaV0uc3R5bGUgPSAnYmFja2dyb3VuZDp1cmwoLy90YjEuYmRzdGF0aWMuY29tL3RiL2Ntcy9wb3N0L2J1YmJsZS9odWl5dWFuYWlfMDMucG5nKSBuby1yZXBlYXQgLTBweCAgLTRweDtoZWlnaHQ6IDExMXB4OycKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghR01fZ2V0VmFsdWUoInRpZWJhbWVpaHVhIikgLyrotLTlkKfnvo7ljJYqLyApIHsKICAgICAgICAgICAgICAgICAgICAvL+S7peS4i+S4uuWwneivleino+WGs+WPs+S4iuinkueahOa1ruWKqOaMiemSruaWh+Wtl+i2heWHuuaMiemSrumXrumimCjlt7LlvbvlupXop6PlhrMpCiAgICAgICAgICAgICAgICAgICAgLy91X3VzZXJuYW1lX3dyYXAKICAgICAgICAgICAgICAgICAgICAvL3VfbmV3c193cmFwCiAgICAgICAgICAgICAgICAgICAgLy91X3NldHRpbmdfd3JhcAogICAgICAgICAgICAgICAgICAgIC8qZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYS51X3VzZXJuYW1lX3dyYXAiKS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIxIik7CiAgICAgICAgICAgICAgICAgICAgfSk7Ki8KICAgICAgICAgICAgICAgICAgICAvKmxldCB0ZW1wID0gJCgiLnVfZGRsX2NvbiBsaSBhIik7IC8vYS5qX2NsZWFyZGF0YSx1X25vdGlmeV9pdGVtCiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXApOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXAubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2ldLmdldEF0dHJpYnV0ZSgic3R5bGUiKSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXS5zdHlsZSA9ICJ3aGl0ZS1zcGFjZTpub3JtYWw7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcCA9ICQoIiN1X25vdGlmeV9pdGVtPmxpPmEiKTsgLy9hLmpfY2xlYXJkYXRhLHVfbm90aWZ5X2l0ZW0KICAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtpXS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0uc3R5bGUgPSAid2hpdGUtc3BhY2U6bm9ybWFsOyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICQoInVsLnN5c19ub3RpZnlfbGFzdD5saT5hIik7IC8vYS5qX2NsZWFyZGF0YSx1X25vdGlmeV9pdGVtCiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBbaV0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLnN0eWxlID0gIndoaXRlLXNwYWNlOm5vcm1hbDsiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSovCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gJCgiLnVfbWVudV9pdGVtIik7IC8v5bCd6K+V6Kej5Yaz5pen54mI6LS05ZCn5Y+z5LiK6KeS6YCJ6aG55oyJ6ZKu5pi+56S65YGP5YmNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXApOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXAubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2ldLmdldEF0dHJpYnV0ZSgic3R5bGUiKSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXS5zdHlsZSA9ICJwYWRkaW5nOiA0cHggOHB4IDdweDsiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgamlzaHUrKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1c2VyaW1nKTsKICAgICAgICAgICAgLy92YXIgdXNlcmltZz0kKCJpbWcuaGVhZF9pbWciKVswXS5zcmM7Ly9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJpbWcuaGVhZF9pbWciKS5zcmMvL+W+l+WIsOiHquW3seeahOi0tOWQp+WktOWDjwogICAgICAgIH0sIDIwMDApOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAvL+aKimh0dHBz6ZO+5o6l6L2s5YiwaHR0cO+8jOWboOS4uuaIkeeahOaUtuiXj+mhtemdouW5tuS4jeaUr+aMgWh0dHBzCiAgICAgICAgICAgIGlmICgkKCIjdV9ub3RpZnlfaXRlbSIpLmNoaWxkcmVuKCJsaS5jYXRlZ29yeV9pdGVtIikuY2hpbGRyZW4oImEual9jbGVhcmRhdGEiKVs1XSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBsZXQgdGVtcCA9ICQoIiN1X25vdGlmeV9pdGVtIikuY2hpbGRyZW4oImxpLmNhdGVnb3J5X2l0ZW0iKS5jaGlsZHJlbigiYS5qX2NsZWFyZGF0YSIpWzVdLmhyZWYuc3BsaXQoImh0dHBzIilbMV07CiAgICAgICAgICAgICAgICAkKCIjdV9ub3RpZnlfaXRlbSIpLmNoaWxkcmVuKCJsaS5jYXRlZ29yeV9pdGVtIikuY2hpbGRyZW4oImEual9jbGVhcmRhdGEiKVs1XS5ocmVmID0gImh0dHAiICsgdGVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgIC8vbGV0IHRlbXAgPSAkKCJzcGFuLmlzX3Nob3dfY3JlYXRlX3RpbWUiKTsgLy/mmL7npLrkuLvpopjotLTliJfooajph4znmoTkuLvpopjotLTliJvlu7rml7bpl7TjgILlpIfms6jvvJrotLTlkKfoh6rluKbnmoTliJvlu7rml6XmnJ/vvIznvLrlpLHlubTmiJbml6UKICAgICAgICAgICAgLy9pZiAodGVtcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8vICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vICAgICAgICB0ZW1wW2ldLnN0eWxlID0gInBvc2l0aW9uOiByZWxhdGl2ZTtkaXNwbGF5OiBibG9jazsvKnRvcDogLTIwcHg7cmlnaHQ6IDEwcHg7Ki93aWR0aDo2MHB4OyI7CiAgICAgICAgICAgIC8vICAgIH0KICAgICAgICAgICAgLy99CiAgICAgICAgICAgIC8v5aSH5b+YLOi/mOacieaLm+WLn+Wbvuagh+aYvuekuijlt7Lkv67lpI0pCiAgICAgICAgICAgIGlmICghR01fZ2V0VmFsdWUoInRpZWJhbWVpaHVhIikpIHsgLy/otLTlkKfnvo7ljJYKICAgICAgICAgICAgICAgIC8qICAgdGVtcCA9ICQoIi5pY29uLWdvb2QiKTsgLy/mmL7npLrnsr7lk4HotLTvvIznsr7ljY7otLTmoIfor4YKICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldLnN0eWxlID0gImJhY2tncm91bmQtY29sb3I6ICNGRjY2NjY7IjsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB0ZW1wID0gJCgiLmljb24tdG9wIik7IC8v5pi+56S6572u6aG25qCH6K+GCiAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXS5zdHlsZSA9ICJiYWNrZ3JvdW5kOm5vbmU7YmFja2dyb3VuZC1jb2xvcjogIzQyODVGNTsiOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIHRlbXAgPSAkKCIuaWNvbi1tZW1iZXItdG9wIik7IC8v5pi+56S65Lya5ZGY572u6aG25qCH6K+GCiAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXS5zdHlsZSA9ICJiYWNrZ3JvdW5kOm5vbmU7YmFja2dyb3VuZC1jb2xvcjogI0ZGQ0MyNjsiOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgLy8kKCJ1bC50YnVpX2FzaWRlX2Zsb2F0X2JhciIpWzBdLnN0eWxlID0gIm1hcmdpbi1sZWZ0OiA5MiUgIWltcG9ydGFudDtsZWZ0OnVuc2V0OyI7IC8v6Kej5Yaz5Y+z5L6n5bel5YW35qCP5raI5aSxYnVn44CC5LiN6K6+572u5Lmf6KGMCiAgICAgICAgICAgICAgICAvLyQoInVsLnRidWlfYXNpZGVfZmxvYXRfYmFyIilbMF0uc3R5bGUgPSAibGVmdDo1MCU7bWFyZ2luLWxlZnQ6IDQ5OHB4OyI7IC8v6Kej5Yaz5Y+z5L6n5bel5YW35qCP5raI5aSxYnVn44CC5LiN6K6+572u5Lmf6KGMCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJCgiLmxpc3RFZGl0b3JDbnQiKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQoIi5saXN0RWRpdG9yQ250IilbMF0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCIubGlzdEVkaXRvckNudCIpLmNsaWNrKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIjIzMzMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wMSA9ICQoIi5xcF9pbnRlcnZpZXdfaW5zZXJ0c21pbGV5IilbMF07IC8v5Li76aKY6LS05YiX6KGo55qE6K+d6aKY6LS05Zue5aSN5qGG6KGo5oOF5oyJ6ZKu5L+u5aSNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDEgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxLnN0eWxlID0gImJhY2tncm91bmQ6bm9uZSAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDIgPSAkKCIual9iYW5uZWRfdGlwIilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAyLnN0eWxlID0gInRvcDowcHg7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gJCgiLm5hdl93cmFwIilbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDIgPSB0ZW1wLnBhcmVudE5vZGUucGFyZW50Tm9kZS5jaGlsZHJlblswXTsgLy9xdWVyeVNlbGVjdG9yQWxsKCJkaXYjcGFnZWxldF9lbnRlcnRhaW5tZW50LWdhbWUvcGFnZWxldC9nYW1lX2hlYWRfbWlkZGxlIilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcDIuZ2V0QXR0cmlidXRlKCdpZCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAyLmdldEF0dHJpYnV0ZSgnaWQnKSA9PSAicGFnZWxldF9lbnRlcnRhaW5tZW50LWdhbWUvcGFnZWxldC9nYW1lX2hlYWRfbWlkZGxlIikgeyAvL+afkOS6m+a4uOaIj+exu+i0tOWQp+acieeJueauiuWktOWbvu+8jOS+i+WmguS4ieWbveadgOWQpwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5zdHlsZSA9ICJiYWNrZ3JvdW5kOiNlZWVmZjMgIWltcG9ydGFudDsiIC8vYmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2VlZWZmMyAwLCNlYWVlZjEgMTAwJSk7IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAg5bCd6K+V5YW85a655Yir5Lq655qEIui0tOWQp+m7keWknOaooeW8jyLmoLflvI9odHRwczovL3VzZXJzdHlsZXMub3JnL3N0eWxlcy8xMjQ3NzAvdGllYmEtbWF2ZXJpY2stMjAxOCAgIGh0dHBzOi8vdXNlcnN0eWxlcy5vcmcvc3R5bGVzLzE2MTIyNC9tYXZlcmljay1kZW1vLXN0eWxlcwogICAgICAgICAgICDku6XkuIvmjqjojZDnlKjmlofmnKznvJbovpHlmajljrvmn6Xmib7lnKjpgqPph4wKICAgICAgICAgICAgdGllYmEtbWF2ZXJpY2stMjAxOOagt+W8j+i/mOmcgOimgeS/ruaUuQogICAgICAgICAgICB0aHJlYWRsaXN0X2JyaWdodCAudGhyZWFkbGlzdF9hdXRob3IgewogICAgZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKICAgIC8vZGlzcGxheTogZmxleDsKICAgIHdpZHRoOiAxNiUgIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMTU1cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIC8vZm9udC1zaXplOiAwICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgfQogICAgbWF2ZXJpY2stZGVtby1zdHlsZXPmoLflvI/ov5jpnIDopoHkv67mlLnvvIjov5nkuKrkuI3nlKjmlofmnKznvJbovpHlmajvvIzopoHlnKjmoLflvI/ohJrmnKznrqHnkIblmajph4zpnaLmlLnvvIkKICAgIC0tbS1ocmVmLWNvbG9yOiBoc2woMCwgMCUsIDk1JSk7CiAgICAtLW0taHJlZi12aXNpdGVkOiBoc2woMCwgMCUsIDYwJSk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvLyQoIi5tZWlodWEiKVswXS5zdHlsZSA9ICJjb2xvcjojOTk5ICFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6Ym9sZDt3aGl0ZS1zcGFjZTpub3JtYWw7IjsgLy/otLTlkKfnvo7ljJblvIDlhbPmjInpkq7mloflrZfmoLflvI8KICAgICAgICAgICAgICAgIC8vJCgiI2Zyc19saXN0X3BhZ2VyIilbMF0uc3R5bGUgPSAicG9zaXRpb246IHJlbGF0aXZlO2xlZnQ6IDFweDsgd2lkdGg6IDk2OHB4O2JvcmRlcjogMXB4IHNvbGlkICNlNGU2ZWI7cGFkZGluZzogNXB4OyI7CiAgICAgICAgICAgICAgICBsZXQgdGVtcDIgPSAkKCIual90Ym5hdl90YWI+YSIpOyAvL+S4uuS6huWFvOWuuei/meS4quWQp++8n2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvamEvc2NyaXB0cy8zMzE0NS0lRTglQjQlQjQlRTUlOTAlQTclRTUlOEElQTklRTYlODklOEItJUU1JUIxJThGJUU4JTk0JUJELSVFNiU4RSU5MiVFNSVCQSU4Ri1iZXRhIOi0tOWQp+WKqeaJiyjlsY/olL3vvIzmjpLluo8pIGJldGEKICAgICAgICAgICAgICAgIGlmICh0ZW1wMi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcDJbdGVtcDIubGVuZ3RoIC0gMV0uc3R5bGUgPSAid2lkdGg6IDEwMHB4ICFpbXBvcnRhbnQ7Y29sb3I6Izc3NyAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgdGVtcDJbdGVtcDIubGVuZ3RoIC0gMl0uc3R5bGUgPSAiY29sb3I6Izc3NyAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXS5zcGxpdCgiLyIpWzNdID09ICJmIikgLy/lpoLmnpzmmK/lnKjmn5DkuKrotLTlkKfnmoTkuLvpopjotLTliJfooajvvIzlsLHkvJrliKDmjonlj7Povrnlm7rlrprmgqzmta7moI/nmoTliIbkuqvmjInpkq4KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKCcudGJ1aV9mYmFyX3NoYXJlJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDUwMDApOwogICAgfSkoKTsKCiAgICAoZnVuY3Rpb24gKCkgeyAvL+WPguiAg+aYvuekuueUqOaIt+WQjeWSjOi0tOWtkOWxj+iUveajgOa1i+iEmuacrCBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzEyMDctJUU4JUI0JUI0JUU1JTkwJUE3JUU2JTk4JUJFJUU3JUE0JUJBJUU3JTlDJTlGJUU1JUFFJTlFaWQgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM4Mzk4MS0lRTglQjQlQjQlRTUlOTAlQTclRTglQjQlQjQlRTUlQUQlOTAlRTUlQjElOEYlRTglOTQlQkQlRTYlQTMlODAlRTYlQjUlOEIKICAgICAgICB2YXIgdGllYmFkb25ndGFpID0gIiI7CiAgICAgICAgdGllYmFkb25ndGFpID0gYAogICAgICAgIC8qIOS9v+eUqCBhbmltYXRpb24g55uR5rWLIERPTSDlj5jljJYgKi8KICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgX190aWViYV9hY3Rpb25fXyB7fQogICAgICAgIEAtbW96LWtleWZyYW1lcyBfX3RpZWJhX2FjdGlvbl9fIHt9CiAgICAgICAgQGtleWZyYW1lcyBfX3RpZWJhX2FjdGlvbl9fIHt9CiAgICAgICAgQGtleWZyYW1lcyB0aWViYWFjdGlvbiB7CiAgICAgICAgICAgIGZyb20gewogICAgICAgICAgICAgICAgY2xpcDogcmVjdCgxcHgsIGF1dG8sIGF1dG8sIGF1dG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIGNsaXA6IHJlY3QoMHB4LCBhdXRvLCBhdXRvLCBhdXRvKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAudF9jb24sLyoudGhyZWFkbGlzdF9seiwqLy5sX3Bvc3QsLyoucGFnZXJfdGhlbWVfNCwqLy50aHJlYWRfdGhlbWVfNSwubF9wb3N0c19udW0sLmljb24tbWVtYmVyLXRvcCwudV9tZW51X3VzZXJuYW1lLC51X25ld3MsLnVfc2V0dGluZywudXNlcj4ucmlnaHQsI21haW5fYXNpZGUsLnVfbG9naW4sLnBfcG9zdGxpc3QsLnRidWlfYXNpZGVfZmxvYXRfYmFyLC5qX2RfcG9zdF9jb250ZW50Pi5yZXBsYWNlX2RpdiwKICAgICAgICAudGllYmEtbGluay1hbmNob3IsLmltZ3RvcGljX2FsYnVtLC5pY29uX2ludGVydmlld19waWN0dXJlLC5saXN0VGhyZWFkVGl0bGV7CiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMDEgczsKICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHRpZWJhYWN0aW9uOwogICAgICAgIH0KICAgICAgICAvKiDkuLvpopjotLQgKi8KICAgICAgICAudF9jb24sLyroh6rlt7HnmoTotLTlrZDml6Dms5Xop6blj5Hkuovku7YqLwogICAgICAgIC8qLnRocmVhZGxpc3RfbHosKi8KICAgICAgICAvKiDmpbzlsYIgKi8KICAgICAgICAubF9wb3N0LAogICAgICAgIC8q6LS05a2Q5YaF6aG1Ki8KICAgICAgICAvKi5wYWdlcl90aGVtZV80LCovCiAgICAgICAgLnRocmVhZF90aGVtZV81LAogICAgICAgIC5sX3Bvc3RzX251bSwKICAgICAgICAvKuS8muWRmCAgICAgICAu572u6aG25Zu+5qCHKi8KICAgICAgICAuaWNvbi1tZW1iZXItdG9wLAogICAgICAgIC8q5Liq5Lq65Li76aG15oyJ6ZKu55qE5aS05YOPKi8KICAgICAgICAudV9tZW51X3VzZXJuYW1lLAogICAgICAgIC8q5raI5oGv5oyJ6ZKuKi8KICAgICAgICAudV9uZXdzLAogICAgICAgIC8q6K6+572u5oyJ6ZKuKi8KICAgICAgICAudV9zZXR0aW5nLAogICAgICAgIC8q56e76Zmk57KJ5Lid5oyJ6ZKuKi8KICAgICAgICAudXNlcj4ucmlnaHQsCiAgICAgICAgLyrliKDpmaTmn5DkupvpobXpnaLkvJrlh7rnjrDnmoTplJnor6/lpLTlg48qLwogICAgICAgICNtYWluX2FzaWRlLAogICAgICAgIC8q55m76ZmG5oyJ6ZKuKi8KICAgICAgICAudV9sb2dpbiwKICAgICAgICAvKui0tOWtkOWGheWuueWIl+ihqOahhuaetiovCiAgICAgICAgLnBfcG9zdGxpc3QsCiAgICAgICAgLyrkvqflt6XlhbfmoI8qLwogICAgICAgIC50YnVpX2FzaWRlX2Zsb2F0X2JhciwKICAgICAgICAvKuWxleW8gOmVv+WbvueJhyovCiAgICAgICAgLmpfZF9wb3N0X2NvbnRlbnQ+LnJlcGxhY2VfZGl2LAogICAgICAgIC8q5bGV5byA5qW85bGC5rCU5rOh5Lit55qE6ZW/5Zu+54mHKi8KICAgICAgICAual9kX3Bvc3RfY29udGVudD4ucG9zdF9idWJibGVfbWlkZGxlPi5wb3N0X2J1YmJsZV9taWRkbGVfaW5uZXI+LnJlcGxhY2VfZGl2LAogICAgICAgIC8q5aSN5Yi26ZO+5o6l5oyJ6ZKuKi8KICAgICAgICAudGllYmEtbGluay1hbmNob3IsCiAgICAgICAgLyrlm77niYfor53popjotLQqLwogICAgICAgIC5pbWd0b3BpY19hbGJ1bSwKICAgICAgICAvKuivnemimOi0tCDlm77niYflkozmloflrZcqLwogICAgICAgIC5pY29uX2ludGVydmlld19waWN0dXJlLC5saXN0VGhyZWFkVGl0bGV7CiAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBfX3RpZWJhX2FjdGlvbl9fOwogICAgICAgICAgICAtbW96LWFuaW1hdGlvbjogX190aWViYV9hY3Rpb25fXzsKICAgICAgICAgICAgYW5pbWF0aW9uOiBfX3RpZWJhX2FjdGlvbl9fOwogICAgICAgIH0KICAgICAgICAuemhhbmthaWNoYW5ndHVwaWFuewogICAgICAgICAgICBoZWlnaHQ6YXV0bzsKICAgICAgICB9CiAgICAgICAgLnpoYW5rYWljaGFuZ3R1cGlhbjJ7CiAgICAgICAgICAgIGRpc3BsYXk6bm9uZTsKICAgICAgICB9CiAgICAgICAgLnlpbmNhbmdjZWJpYW5sYW57CiAgICAgICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICByaWdodDogMHB4OwogICAgICAgICAgICBib3R0b206IDIwMHB4OwogICAgICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgICAgIHotaW5kZXg6IDEwMDU7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigwLDAsMCwwLjA1KTsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICB9CiAgICAgICAgLnlpbmNhbmdjZWJpYW5sYW46aG92ZXJ7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigwLDAsMCwwLjUpOwogICAgICAgICAgICB3aWR0aDogMzBweDsKICAgICAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgfQogICAgICAgIC8q6Kej5Yaz5Li76aKY5YiX6KGo5Zue5aSN5Lq65ZCN5a2X5ZKM5Y+R6LS05Lq65ZCN5a2X5LiN5a+56b2Q6Zeu6aKY77yM5YW85a655paw54mI44CB5pen54mI5Y+K576O5YyW54mI6LS05ZCnKi8KICAgICAgICB0Yl9pY29uX2F1dGhvcl9yZWx5PmEgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgfQogICAgICAgIC8q5Zu+54mH6K+d6aKYKi8KICAgICAgICAvKui/m+WFpei0tOWtkOaMiemSriovCiAgICAgICAgLmpfZW50ZXJfcGJfd3JhcHBlcgogICAgICAgIHsKICAgICAgICAgICAgbWluLXdpZHRoOiA1MHB4OwogICAgICAgIH0KICAgICAgICAual9lbnRlcl9wYl93cmFwcGVyPmEKICAgICAgICB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgbGVmdDogLTQwcHg7CiAgICAgICAgfQogICAgICAgIC8q5Li76aKY6LS06auY5bqm5qGG5p62Ki8KICAgICAgICAuaW1ndG9waWNfZ2FsbGVyeXsKICAgICAgICAgICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgaGVpZ2h0OjIwMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC8q5rua5Yqo6ZW/5qGG5p62Ki8KICAgICAgICAuaW1ndG9waWNfYWxidW17CiAgICAgICAgICAgIHdpZHRoOjg1MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGhlaWdodDoyMDBweCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAvKuWMheijueWbvueJhyovCiAgICAgICAgLmltZ3RvcGljX2dhbGxlcnk+LnRocmVhZF9waWNfc2hvd3sKICAgICAgICAgICAgd2lkdGg6IDIwMHB4IWltcG9ydGFudDsKICAgICAgICAgICAgaGVpZ2h0OiAyMDBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAvKnZpc2liaWxpdHk6dmlzaWJsZTsqLwogICAgICAgICAgICAvKmRpc3BsYXk6ZmxleCAhaW1wb3J0YW50OyovCiAgICAgICAgICAgIC8qb3ZlcmZsb3c6YXV0byAhaW1wb3J0YW50OyovCiAgICAgICAgfQogICAgICAgIC8q5Zu+54mHKi8KICAgICAgICAuaW1ndG9waWNfZ2FsbGVyeT4udGhyZWFkX3BpY19zaG93Pi50aHJlYWRsaXN0X3BpY3sKICAgICAgICAgICAgd2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGUgIWltcG9ydGFudDsKICAgICAgICAgICAgaGVpZ2h0OiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC8q5bem5Y+z5YiH5o2i5Zu+54mH5Yy65Z+fKi8KICAgICAgICAual9kaXNwbGF5X3ByZSwual9kaXNwbGF5X25leHR7CiAgICAgICAgICAgIHRvcDogNjBweCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgIGA7CiAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMliovICkgewogICAgICAgICAgICAvL2xldCB0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIC8vICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI2xpdmVJY29uIilbMF0uZ2V0QXR0cmlidXRlKCJzcmMiKS5zZWFyY2goImludGVydmlld19saXZlX3R2X2ljb24uZ2lmIikgPT0gLTEpIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICB0aWViYWRvbmd0YWkgKz0gYAogICAgICAgICAgICAvLyAgICAgICAgICAgICNsaXZlSWNvbnsvKuWQhOenjeivnemimOi0tOWbvuaghyovCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIC8vICAgICAgICB9YDsKICAgICAgICAgICAgLy8gICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyAgICAgICAgdGllYmFkb25ndGFpICs9IGAKICAgICAgICAgICAgLy8gICNsaXZlSWNvbnsvKuWQhOenjeivnemimOi0tOWbvuaghyovCiAgICAgICAgICAgIC8vICAgICBoZWlnaHQ6IDE3cHggIWltcG9ydGFudDsKICAgICAgICAgICAgLy8gfWA7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgLy8gfSwgNTAwMCk7CgogICAgICAgICAgICB0aWViYWRvbmd0YWkgKz0gYAogICAgICAgICAgICAjbGl2ZUljb257LyrlkITnp43or53popjotLTlm77moIcqLwogICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE5cHggIWltcG9ydGFudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKi5pbnRlcnZpZXcgLnRocmVhZExpc3RHcm91cENudCAubGlzdFRpdGxlQ250IC5saXN0VGhyZWFkVGl0bGUgYTpmaXJzdC1vZi10eXBlOmJlZm9yZXsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFwn5LuK5pel6K+d6aKYXCc7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY1OwogICAgICAgICAgICAgICAgaGVpZ2h0OiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgNHB4OwogICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKCiAgICAgICAgICAgICAgICBmbGV4OiAwIDAgYXV0bzsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IDFweDsKICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBub3JtYWwgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIH0qLwogICAgICAgICAgICAudGhyZWFkbGlzdF9idG5fcGxheXsKICAgICAgICAgICAgICAgIHRvcDogMTVweCAhaW1wb3J0YW50Oy8q54m55q6K55qE5LuK5pel6K+d6aKY5pyJ6KeG6aKRKi8KICAgICAgICAgICAgICAgIGxlZnQ6IC0xcHggIWltcG9ydGFudDsKICAgICAgICAgICAgfQogICAgICAgIC8q5Zu+54mH5bel5YW35qCPKi8KICAgICAgICAubWVkaWFfcGljX2NvbnRyb2x7CiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgICAgfQogICAgLmljb25fcmV0cmFjdCwuaWNvbl95cGljLC5pY29uX3R1cm5sZWZ0LC5pY29uX3R1cm5yaWdodHsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDAuMDAxIHM7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHRpZWJhYWN0aW9uOwogICAgfQogICAgLyrlm77niYflt6XlhbfmoI9f5pS26LW377yM5p+l55yL5aSn5Zu+77yM5ZCR5bem6L2s77yM5ZCR5Y+z6L2sKi8KICAgICAgICAuaWNvbl9yZXRyYWN0LC5pY29uX3lwaWMsLmljb25fdHVybmxlZnQsLmljb25fdHVybnJpZ2h0ewogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogX190aWViYV9hY3Rpb25fXzsKICAgICAgICAgICAgLW1vei1hbmltYXRpb246IF9fdGllYmFfYWN0aW9uX187CiAgICAgICAgICAgIGFuaW1hdGlvbjogX190aWViYV9hY3Rpb25fXzsKICAgICAgICB9Ci50aHJlYWRsaXN0X2ltZz5zcGFuLnRpZWJhLWxpbmstYW5jaG9yewptYXJnaW4tdG9wOiAyMHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5idG5fZGVmYXVsdHsvKuS4u+mimOi0tOWIl+ihqOeCueW8gOWbvueJh+WQjuWPs+S4i+inkueahOaMiemSriovCiAgICAgICAgICAgICAgICBsZWZ0OiAtNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIH0KICAgIGA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGllYmFkb25ndGFpICs9IGAKICAgICAgICAgICAgLnRocmVhZGxpc3RfYnRuX3BsYXl7CiAgICAgICAgICAgICAgICB0b3A6IDE1cHggIWltcG9ydGFudDsvKueJueauiueahOS7iuaXpeivnemimOacieinhumikSovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnRocmVhZGxpc3RfaW1nPnNwYW4uYWxsX251bXsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgIC8q5Zu+54mH6K+d6aKY6LS077yM54K55byA5Zu+54mH77yM6LCD5pW05aSN5Yi26ZO+5o6l5oyJ6ZKu55qE5L2N572uKi8KICAgICAgICAgICAgLnRocmVhZGxpc3RfaW1nPnNwYW4udGllYmEtbGluay1hbmNob3J7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICBsZWZ0OiA2NzBweDsKICAgICAgICAgICAgfQogICAgICAgICAgICAuYnRuX2RlZmF1bHQgewogICAgICAgICAgICAgICAgbGVmdDogLTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYDsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBHTV9hZGRTdHlsZSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICBHTV9hZGRTdHlsZSh0aWViYWRvbmd0YWkpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIFBST19hZGRTdHlsZSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICBQUk9fYWRkU3R5bGUodGllYmFkb25ndGFpKTsgLy/mnInorablkYoKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhZGRTdHlsZSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICBhZGRTdHlsZSh0aWViYWRvbmd0YWkpOyAvL+acieitpuWRigogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICAgICAgbm9kZS50eXBlID0gInRleHQvY3NzIjsKICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aWViYWRvbmd0YWkpKTsKICAgICAgICAgICAgdmFyIGhlYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKTsKICAgICAgICAgICAgaWYgKGhlYWRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGhlYWRzWzBdLmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gbm8gaGVhZCB5ZXQsIHN0aWNrIGl0IHdoZXJlZXZlcgogICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRpZWJhX2FjdGlvbiA9IGFzeW5jIChldmVudCkgPT4gewogICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICB0YXJnZXQKICAgICAgICAgICAgfSA9IGV2ZW50OwogICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICBjbGFzc0xpc3QKICAgICAgICAgICAgfSA9IHRhcmdldDsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQpOwogICAgICAgICAgICBpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JlX3JlcGx5X3RhaWwnKSkgewogICAgICAgICAgICAgICAgaWYgKHFpYW5nZGlhb3hpbnhpdGlzaGkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb3JlX3JlcGx5X3RhaWwiKVswXSkKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUgPSAiY29sb3I6IzAwMCAhaW1wb3J0YW50OyI7IC8v5by66LCD5L+h5oGv5pi+56S644CC5qW85bGC55qE5pe26Ze044CC5a+55pen54mI6LS05ZCn5L2c55So5LiA6Iis44CCCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpKSB7IC8v6LS05ZCn576O5YyWCiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQucXVlcnlTZWxlY3RvckFsbCgiLnBfcmVwbHlfZmlyc3QiKSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAxID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wX3JlcGx5X2ZpcnN0Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAxWzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDFbMF0uc3R5bGUgPSAiZm9udC1zaXplOnVuc2V0ICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wMVswXS5jbGFzc0xpc3RbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDFbMF0uY2xhc3NMaXN0WzBdID09ICJwX3JlcGx5X2ZpcnN0IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDFbMF0uc3R5bGUgPSAiZm9udC1zaXplOjEwcHggIWltcG9ydGFudDsiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDFbMF0uaW5uZXJIVE1MID0gIuWbnuWkjSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMVswXS5pbm5lckhUTUwgPSAi5Zue5aSN5qW85Li7IjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSAhPT0gJ19fdGllYmFfYWN0aW9uX18nKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyrlm77niYfor53popjotLQqLwogICAgICAgICAgICBpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uX2ludGVydmlld19waWN0dXJlJykpIHsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgbGV0IHRpZCA9IEpTT04ucGFyc2UodGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCd0aWQnKSk7CiAgICAgICAgICAgICAgICBsZXQgdGltZSA9IGF3YWl0IGdldFdhcHRpZWJheGlueGkodGlkKS50aGVuKHJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gdGltZTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAuc3BsaXQoJzxkaXYgY2xhc3M9ImkiPjHmpbwuJylbMV0uc3BsaXQoJzxzcGFuIGNsYXNzPSJiIj4nKVsxXS5zcGxpdCgiPC9zcGFuPiIpWzBdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wLnNwbGl0KCItIikubGVuZ3RoID09IDIgJiYgdGVtcC5zZWFyY2goLyhcZHs0fSktKCgwPyhbMS05XSkpfCgxWzF8Ml0pKS8pID09IC0xKSAvL+WPquacieaciO+8jOayoeacieW5tAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpICsgIi0iICsgdGVtcCAvLzIwMjAtMi0yCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wNC5zcGxpdCgiOiIpLmxlbmd0aCA9PSAyKSB7IC8v5Y+q5pyJ5pe26Ze077yM5rKh5pyJ5bm05pyICiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArICItIiArIChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpICsgIi0iICsgbmV3IERhdGUoKS5nZXREYXRlKCkgKyAiICIgKyB0ZW1wIC8vMjAyMC0wMi0wMiAwMjowMAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgdGVtcDIuc2V0QXR0cmlidXRlKCdjbGFzcycsICdjcmVhdGV0aW1lY3NzcycpOwogICAgICAgICAgICAgICAgICAgIHRlbXAyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246IGFic29sdXRlO3RleHQtYWxpZ246IGNlbnRlcjt0b3A6IC01cHg7d2lkdGg6IDcwcHg7bGVmdDogMHB4O2NvbG9yOiAjOTk5OycpOwogICAgICAgICAgICAgICAgICAgIGlmIChHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMluWQjiovICkgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3RleHQtYWxpZ246IGNlbnRlcjt0b3A6IC01cHg7d2lkdGg6IDcwcHg7bGVmdDogMTBweDt0b3A6MTBweDtjb2xvcjogIzk5OTtwb3NpdGlvbjogYWJzb2x1dGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiLnRocmVhZGxpc3RfcmVwX251bSIpWzBdLnN0eWxlID0gInRvcDogNjBweDtwb3NpdGlvbjogYWJzb2x1dGU7IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVtcDIuaW5uZXJIVE1MID0gdGVtcDsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCIudGhyZWFkbGlzdF9yZXBfbnVtIilbMF0uYmVmb3JlKHRlbXAyKTsKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8q5paH5a2X6K+d6aKY6LS0Ki8KICAgICAgICAgICAgaWYgKGNsYXNzTGlzdC5jb250YWlucygnbGlzdFRocmVhZFRpdGxlJykpIHsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiLmxpc3RSZXBseU51bSIpWzBdKTsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi53b3JkX2xpdmVfdGl0bGUiKVswXS5ocmVmLnNwbGl0KCIvcC8iKVsxXSk7CiAgICAgICAgICAgICAgICBsZXQgdGlkID0gSlNPTi5wYXJzZSh0YXJnZXQucXVlcnlTZWxlY3RvckFsbCgiLndvcmRfbGl2ZV90aXRsZSIpWzBdLmhyZWYuc3BsaXQoIi9wLyIpWzFdKTsKICAgICAgICAgICAgICAgIGxldCB0aW1lID0gYXdhaXQgZ2V0V2FwdGllYmF4aW54aSh0aWQpLnRoZW4ocmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbGV0IHRlbXAgPSB0aW1lOwogICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5zcGxpdCgnPGRpdiBjbGFzcz0iaSI+MealvC4nKVsxXS5zcGxpdCgnPHNwYW4gY2xhc3M9ImIiPicpWzFdLnNwbGl0KCI8L3NwYW4+IilbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAuc3BsaXQoIi0iKS5sZW5ndGggPT0gMiAmJiB0ZW1wLnNlYXJjaCgvKFxkezR9KS0oKDA/KFsxLTldKSl8KDFbMXwyXSkpLykgPT0gLTEpIC8v5Y+q5pyJ5pyI77yM5rKh5pyJ5bm0CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgKyAiLSIgKyB0ZW1wIC8vMjAyMC0yLTIKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXAuc3BsaXQoIjoiKS5sZW5ndGggPT0gMikgeyAvL+WPquacieaXtumXtO+8jOayoeacieW5tOaciAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgKyAiLSIgKyAobmV3IERhdGUoKS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKSArICItIiArIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpICsgIiAiICsgdGVtcCAvLzIwMjAtMDItMDIgMDI6MDAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgICAgIHRlbXAyLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnY3JlYXRldGltZWNzc3MnKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wMi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTt0ZXh0LWFsaWduOiBjZW50ZXI7dG9wOjQwcHg7d2lkdGg6IDcwcHg7bGVmdDogMHB4O2NvbG9yOiAjOTk5OycpOwogICAgICAgICAgICAgICAgICAgIGlmIChHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMluWQjiovICkgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3RleHQtYWxpZ246IGNlbnRlcjt0b3A6IDQwcHggIWltcG9ydGFudDt3aWR0aDogNzBweDtsZWZ0OiAxMHB4O3RvcDoxMHB4O2NvbG9yOiAjOTk5O3Bvc2l0aW9uOiBhYnNvbHV0ZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZW1wMi5pbm5lckhUTUwgPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saXN0UmVwbHlOdW0iKVswXS5iZWZvcmUodGVtcDIpOwogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTGlzdC5jb250YWlucygnaWNvbl9yZXRyYWN0JykgfHwgY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uX3lwaWMnKSB8fCBjbGFzc0xpc3QuY29udGFpbnMoJ2ljb25fdHVybmxlZnQnKSB8fCBjbGFzc0xpc3QuY29udGFpbnMoJ2ljb25fdHVybnJpZ2h0JykpIHsKICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZSA9ICJkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyrlm77niYfor53popjotLTmuIXnkIblpJrkvZnlm77niYflt6XlhbfmoI/moIfnrb4r5L+u5aSN5aSn5Zu+5qih5byP5YiH5o2i5Zu+54mH5Yqf6IO9Ki8KICAgICAgICAgICAgdmFyIHBhZ2UgPSAxOwogICAgICAgICAgICB2YXIgc3VvMiA9IGZhbHNlOwogICAgICAgICAgICBpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKCdpbWd0b3BpY19hbGJ1bScpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pW05Liq5Zu+54mH5qCH562+5Yi35pawIik7CiAgICAgICAgICAgICAgICAkKCIuaW1ndG9waWNfZ2FsbGVyeT4udGhyZWFkX3BpY19zaG93Pi50aHJlYWRsaXN0X3BpYyIpLmNsaWNrKChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi54K55Ye75Zu+54mHIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gJCgiLmpfbWVkaWFfYm94Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0ucmVtb3ZlKCk7IC8v5riF55CG5peg6ZmQ6Ieq5aKe55qE5aSa5L2Z5qCH562+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHBhcnNlSW50KCQoIi5qX2Rpc3BsYXlfbmV4dCIpWzBdLmdldEF0dHJpYnV0ZSgiY3VyIikpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VvMiA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VvMiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiQoIi5qX3JldHJhY3QiKS5jbGljaygoZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLlhbPpl60iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIual9kaXNwbGF5X3ByZSIpLmNsaWNrKChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLkuIrkuIDpobUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdDIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQuZ2V0QXR0cmlidXRlKCJjdXIiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LmdldEF0dHJpYnV0ZSgidG90YWwiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBwYWdlIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAxID0gJCgiLmpfZGlzcGxheV9wcmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wMS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wMltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMVtpXS5zZXRBdHRyaWJ1dGUoImN1ciIsIHBhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wMiA9ICQoIi5qX2Rpc3BsYXlfbmV4dCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXAyW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAyW2ldLnNldEF0dHJpYnV0ZSgiY3VyIiwgcGFnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiLmpfZGlzcGxheV9uZXh0IikuY2xpY2soKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuS4i+S4gOmhtSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0MiA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRhcmdldC5nZXRBdHRyaWJ1dGUoImN1ciIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQuZ2V0QXR0cmlidXRlKCJ0b3RhbCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHBhZ2UgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDEgPSAkKCIual9kaXNwbGF5X3ByZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAxLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXAyW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxW2ldLnNldEF0dHJpYnV0ZSgiY3VyIiwgcGFnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAyID0gJCgiLmpfZGlzcGxheV9uZXh0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcDIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcDJbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDJbaV0uc2V0QXR0cmlidXRlKCJjdXIiLCBwYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoJ3JlcGxhY2VfZGl2JykpIHsKICAgICAgICAgICAgICAgIC8q5bGV5byA6ZW/5Zu+54mHKi8KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCJ6aGFua2FpY2hhbmd0dXBpYW4iKTsKICAgICAgICAgICAgICAgIHRhcmdldC5jaGlsZHJlblsxXS5jbGFzc0xpc3QuYWRkKCJ6aGFua2FpY2hhbmd0dXBpYW4yIik7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRhcmdldC5jaGlsZHJlblsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTGlzdC5jb250YWlucygndGllYmEtbGluay1hbmNob3InKSkgeyAvL+iwg+aVtOWkjeWItumTvuaOpeaMiemSruWcqOaXp+eJiOi0tOWQp+eahOS9jee9rgogICAgICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMliovICkgewogICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucGFyZW50Tm9kZS5jbGFzc05hbWUgPT0gImNvcmVfdGl0bGVfYnRucyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN0eWxlID0gInBvc2l0aW9uOiBhYnNvbHV0ZTtsZWZ0OiA0NDBweDt0b3A6IDBweDsiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKui0tOWtkOWGhemhtealvOWxguWIl+ihqCovCiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoJ3BfcG9zdGxpc3QnKSkgewogICAgICAgICAgICAgICAgbGV0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodCk7CiAgICAgICAgICAgICAgICAgICAgJCgnI3RocmVhZF90aGVtZV81JylbMF0uY2xhc3NMaXN0LnJlbW92ZSgidGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZSIpOwogICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAg5L+u5aSN6LS05a2Q5YaF5LiL5bel5YW35qCP54K557+76aG15oyJ6ZKu5ZCO77yM5LiN5YaN5pi+56S657+76aG15YiX6KGoCuebruagh+agh+etvmNsYXNzIHBfdGhyZWFkIHRocmVhZF90aGVtZV81CuWKoOS4qnRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUKICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTGlzdC5jb250YWlucygndV9sb2dpbicpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pyq55m76ZmGIik7CiAgICAgICAgICAgICAgICB1bnNhZmVXaW5kb3cuUGFnZURhdGEudXNlci5pc19sb2dpbiA9IDE7CiAgICAgICAgICAgICAgICAvL+eZvuW6pui0tOWQp++8muS4jeeZu+W9leWNs+WPr+eci+i0tCBieSBWQQogICAgICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSkgeyAvL+i0tOWQp+e+juWMlgogICAgICAgICAgICAgICAgICAgIGlmICghR01fZ2V0VmFsdWUoInRpZWJhbWVpaHVhIikgLyrotLTlkKfnvo7ljJYqLyApIHsgLy/pmpDol4/kvqfovrnmoI8KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdNX2dldFZhbHVlKCJ5aW5jYW5nY2ViaWFubGFuIikgPT0gdHJ1ZSkgeyAvL+makOiXj+S+p+i+ueagjwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAzID0gJCgiZGl2LnVzZXJiYXIgIilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aW5jYW5nY2ViaWFubGFueCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjeWluY2FuZ2NlYmlhbmxhbiIpWzBdLnZhbHVlID0gIjw8IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wMyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDMuc3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5YWo5bGA6ZqQ6JeP5L6n6L655qCPMSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8q5L6n5bel5YW35qCPKi8KICAgICAgICAgICAgLyrkuIvljYrpg6jliIbljZXni6zlpITnkIbku6Xpgb/lhY3lgbblsJTpmpDol4/lpLHotKUqLwogICAgICAgICAgICBpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKCd0YnVpX2FzaWRlX2Zsb2F0X2JhcicpKSB7CiAgICAgICAgICAgICAgICBpZiAoIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpKSB7IC8v6LS05ZCn576O5YyWCiAgICAgICAgICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMliovICkgeyAvL+makOiXj+S+p+i+ueagjwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoR01fZ2V0VmFsdWUoInlpbmNhbmdjZWJpYW5sYW4iKSA9PSB0cnVlKSB7IC8v6ZqQ6JeP5L6n6L655qCPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeWluY2FuZ2NlYmlhbmxhbnggPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aW5jYW5nY2ViaWFubGFueCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3lpbmNhbmdjZWJpYW5sYW4iKVswXS52YWx1ZSA9ICI8PCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5YWo5bGA6ZqQ6JeP5L6n6L655qCPMiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vbGV0IGNoZWNrZXI7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhjbGFzc0xpc3QuY29udGFpbnMoJ2pfdGhyZWFkX2xpc3QnKSkKICAgICAgICAgICAgaWYgKGNsYXNzTGlzdC5jb250YWlucygndV9tZW51X3VzZXJuYW1lJykpIHsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgICAgIC8vIEByZXR1cm5zIHtudW1iZXJ8IiJ9IOaYr+WQpueZu+W9le+8jOS4jeeZu+mZhuS4ujDmiJYiIizkuLrkuobpgILphY3kuI3nmbvpmYbnnIvotLTlip/og70KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cobG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpZCIpKTsKICAgICAgICAgICAgICAgIHZhciBnZXRJc0xvZ2luMiA9IHVuc2FmZVdpbmRvdy5QYWdlRGF0YS51c2VyLmlkIHx8IHVuc2FmZVdpbmRvdy5QYWdlRGF0YS51c2VyLnVzZXJfaWQ7IC8v6I635Y+W55So5oi3aWQKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlcmlkIikgPT0gbnVsbCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlcmlkIikgIT0gIiIgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpZCIpICE9IHVuZGVmaW5lZCkgeyAvL+WPr+iDveayoeeUqO+8nwogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJ1c2VyaWQiLCBnZXRJc0xvZ2luMikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZ2V0SXNMb2dpbjIpCiAgICAgICAgICAgICAgICBpZiAoZ2V0SXNMb2dpbjIgIT0gMCAmJiBnZXRJc0xvZ2luMiAhPSAiIiAmJiBnZXRJc0xvZ2luMiA9PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlcmlkIikgJiYgIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpIC8q5YWz6Zet6LS05ZCn576O5YyW5ZCO77yM5LiN5pi+56S65aSn5aS05YOPKi8gKSB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygkKCJkaXYuZWR1aS1pY29uLWJvbGQiKVswXSk7CiAgICAgICAgICAgICAgICAgICAgLyppZiAoJCgiZGl2LmVkdWktYnRuLWJvbGQiKVswXSAhPSBudWxsICYmICQoImRpdi5lZHVpLWJ0bi1yZWQiKVswXSAhPSBudWxsICYmIHN1byA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCQoImRpdi5lZHVpLWljb24tYm9sZCIpWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiZGl2LmVkdWktYnRuLWJvbGQiKVswXS5zdHlsZSA9ICJkaXNwbGF5OmJsb2NrOyIgLy/orqnlj5HotLTmlofmnKznvJbovpHlmajnmoTlrZfkvZPliqDnspfmjInpkq7lkozmloflrZflj5jnuqLmjInpkq7kuIDlrprog73mmL7npLrlh7rmnaXjgIIyMDIwLTItMjfnu4/mtYvor5Xnoa7lrpror6Xlip/og73lt7LlpLHmlYjjgIIKICAgICAgICAgICAgICAgICAgICAgICAgJCgiZGl2LmVkdWktYnRuLXJlZCIpWzBdLnN0eWxlID0gImRpc3BsYXk6YmxvY2s7IgogICAgICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgICAgIGxldCB0ID0gc2V0VGltZW91dCgoKSA9PiB7IC8v5aKe5Yqg5bu25pe25Lul5o+Q6auY5Y+z5LiK6KeS5oyJ6ZKu5pi+56S655So5oi35aS05YOP55qE5oiQ5Yqf546HCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXJpbWcgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSAkKCJpbWcuaGVhZF9pbWciKVswXSB8fCAkKCJhLnVzZXJpbmZvX2hlYWQ+aW1nIilbMF0gfHwgJCgiI2ltZ19hc2lkZV9oZWFkIilbMF0gfHwgJCgic3Bhbi5wbV91c2VyX2xvZ28+aW1nIilbMF0gfHwgJCgiaW1nLnVzZXJfYXZhdGFyIilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlcmltZyIpICE9IG51bGwgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpbWciKSAhPSAiIiAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlcmltZyIpICE9IHVuZGVmaW5lZCkgeyAvL2h0dHBzOi8vd3d3LmNuYmxvZ3MuY29tL3poYW94aW5tZWktMTIzL3AvOTA0Njk2Mi5odG1sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyaW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInVzZXJpbWciKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAkKCJpbWcuaGVhZF9pbWciKVswXSB8fCAkKCJhLnVzZXJpbmZvX2hlYWQ+aW1nIilbMF0gfHwgJCgiI2ltZ19hc2lkZV9oZWFkIilbMF0gfHwgJCgic3Bhbi5wbV91c2VyX2xvZ28+aW1nIilbMF0gfHwgJCgiaW1nLnVzZXJfYXZhdGFyIilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+i0tOWQp+S4u+mimOWIl+ihqO+8jOaIkeeahOi0tOWQp++8jOaIkeeahGnotLTlkKfvvIzotLTlkKfmnI3liqHkuK3lv4PvvIzlkKfliqHlkI7lj7AKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcC5zcmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgidXNlcmltZyIsIHRlbXAuc3JjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcmltZyA9IHRlbXAuc3JjOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codXNlcmltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyaW1nICE9IHVuZGVmaW5lZCAmJiB1c2VyaW1nICE9IG51bGwgJiYgdXNlcmltZyAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoImltZy51X3VzZXJuYW1lX2F2YXRhciIpWzBdID09IG51bGwgJiYgJCgic3Bhbi51X3VzZXJuYW1lX3RpdGxlIilbMF0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoInNwYW4udV91c2VybmFtZV90aXRsZSIpLmJlZm9yZSgnPGltZyBjbGFzcz0idV91c2VybmFtZV9hdmF0YXIiIHNyYz0nICsgdXNlcmltZyArICc+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1c2VyaW1nKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdXNlcmltZz0kKCJpbWcuaGVhZF9pbWciKVswXS5zcmM7Ly9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJpbWcuaGVhZF9pbWciKS5zcmMvL+W+l+WIsOiHquW3seeahOi0tOWQp+WktOWDjwogICAgICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoJ3VfbmV3cycpKSB7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRhcmdldCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxldCBpaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocWlhbmdkaWFveGlueGl0aXNoaSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAxID0gJCgiLnVfbmV3c193cmFwIHNwYW4iKTsgLy/mta7liqjmjInpkq4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDIgPSAkKCIudV9ub3RpdHlfYmQgLmNhdGVnb3J5X2l0ZW0iKTsgLy/mta7liqjmjInpkq4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDQgPSAkKCJ1bC5qX2NhdGVnb3J5X2xpc3Q+bGk+YT5zcGFuLHVsLmpfY2F0ZWdvcnlfbGlzdD4jdV9ub3RpZnlfaXRlbT5saT5hPnNwYW4iKTsgLy/mta7liqjmjInpkq4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDUgPSAkKCJ1bC5zeXNfbm90aWZ5X2xhc3Q+bGk+YT5zcGFuIik7IC8v5rWu5Yqo5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlpIDw9IDU5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAxWzBdICE9IG51bGwgJiYgdGVtcDJbMF0gIT0gbnVsbCAmJiB0ZW1wNFswXSAhPSBudWxsICYmIHRlbXA1WzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcDEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxW2ldLnN0eWxlID0gImRpc3BsYXk6IiArIHRlbXAxW2ldLnN0eWxlWyJkaXNwbGF5Il0gKyAiO2NvbG9yOiNmMDAgIWltcG9ydGFudDsiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wMi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDJbaV0uc3R5bGVbImNvbG9yIl0gPSAiI2YwMCAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wNC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDRbaV0uc3R5bGUgPSAiY29sb3I6I2YwMCAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXA1Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNVtpXS5zdHlsZSA9ICJkaXNwbGF5OiIgKyB0ZW1wNVtpXS5zdHlsZVsiZGlzcGxheSJdICsgIjtjb2xvcjojZjAwICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuW8uuiwg+S/oeaBr+aPkOekujoiICsgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKCd1X3NldHRpbmcnKSkgewogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBsZXQgaWkgPSAwOwogICAgICAgICAgICAgICAgICAgIGxldCB0ID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMliovICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gJCgiZGl2Lmlib2R5Iik7IC8v5oiR55qE5Zue5aSN572R6aG16IOM5pmvIGh0dHA6Ly90aWViYS5iYWlkdS5jb20vaS9pL3JlcGx5bWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFswXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbMF0uc3R5bGUgPSAiYmFja2dyb3VuZDojZmZmOyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHFpYW5nZGlhb3hpbnhpdGlzaGkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wNiA9ICQoIi5tZWlodWEiKTsgLy/nvo7ljJblvIDlhbMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPD0gNTkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDZbMF0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNlswXS5zdHlsZSA9ICJjb2xvcjojZjAwICFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6Ym9sZDt3aGl0ZS1zcGFjZTpub3JtYWw7IjsgLy/otLTlkKfnvo7ljJblvIDlhbPmjInpkq7mloflrZfmoLflvI8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAxMDAwKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLlvLrosIPkv6Hmga/mj5DnpLo6IiArIGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpIC8q6LS05ZCn576O5YyWKi8gKSB7IC8v6ZqQ6JeP5L6n6L655qCPCiAgICAgICAgICAgICAgICAgICAgaWYgKEdNX2dldFZhbHVlKCJ5aW5jYW5nY2ViaWFubGFuIikgPT0gdHJ1ZSkgeyAvL+makOiXj+S+p+i+ueagjwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDMgPSAkKCJkaXYudXNlcmJhciAiKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdGVtcDQgPSAkKCJ1bC50YnVpX2FzaWRlX2Zsb2F0X2JhciIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB5aW5jYW5nY2ViaWFubGFueCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICQoIiN5aW5jYW5nY2ViaWFubGFuIilbMF0udmFsdWUgPSAiPDwiOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDMuc3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAodGVtcDQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDQuc3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5YWo5bGA6ZqQ6JeP5L6n6L655qCPMCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uLW1lbWJlci10b3AnKSkgewogICAgICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMliovICkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZSA9ICJiYWNrZ3JvdW5kOm5vbmU7YmFja2dyb3VuZC1jb2xvcjogI0ZGQ0MyNjsiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoInRfY29uIikpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wNiA9IHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCIuY29sMl9sZWZ0IilbMF07IC8v5Li76aKY6LS05YiX6KGo5re75Yqg5Y+R6LS05pe26Ze0IGh0dHBzOi8vdGllYmEuYmFpZHUuY29tL2Y/a3c9JUU2JThBJTk1JUU2JUIxJTlGJUU3JTlBJTg0JUU5JUIxJUJDJmllPXV0Zi04CiAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXA5ID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pY29uLWdvb2QiKVswXTsgLy/mmL7npLrnsr7lk4HotLTvvIznsr7ljY7otLTmoIfor4YKICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDEwID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pY29uLXRvcCIpWzBdOyAvL+aYvuekuue9rumhtuagh+ivhgogICAgICAgICAgICAgICAgICAgIC8vbGV0IHRlbXAxMSA9IHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCIuaWNvbi1tZW1iZXItdG9wIilbMF07IC8v5pi+56S65Lya5ZGY572u6aG25qCH6K+GCiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wNikKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXA5KQogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcDEwKQogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGVtcDYuY2hpbGROb2Rlcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXA2LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jcmVhdGV0aW1lY3NzcyIpWzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDYuY2hpbGRyZW4ubGVuZ3RoICE9IDApIC8v5pyJ5Lqb6LS05a2Q5rKh5pyJ5Yib5bu65pe26Ze077yM5L6L5aaC5oub5Yuf5ZCn5Li7572u6aG25YWs5ZGK6LS0LOivnemimOi0tAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXA3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2NyZWF0ZXRpbWVjc3NzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wNi5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5pY29uLW1lbWJlci10b3AiKVswXSA9PSBudWxsICYmIHRlbXA2LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiLmljb24tdG9wIilbMF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDcuc2V0QXR0cmlidXRlKCdzdHlsZScsICdwb3NpdGlvbjogYWJzb2x1dGU7dGV4dC1hbGlnbjogY2VudGVyO3RvcDogMHB4O3dpZHRoOiA3MHB4O2xlZnQ6IDBweDtjb2xvcjogIzk5OTsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA2LmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246IGFic29sdXRlO3dpZHRoOiA1MXB4ICFpbXBvcnRhbnQ7dG9wOiAyMHB4OycpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSAvKui0tOWQp+e+juWMluWQjiovICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA3LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246IGFic29sdXRlO3RleHQtYWxpZ246IGNlbnRlcjt0b3A6IC01cHg7d2lkdGg6IDcwcHg7bGVmdDogMHB4O2NvbG9yOiAjOTk5OycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA2LmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246IGFic29sdXRlO3dpZHRoOiA1MXB4ICFpbXBvcnRhbnQ7dG9wOiAxM3B4OycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3RleHQtYWxpZ246IGNlbnRlcjt0b3A6IC01cHg7d2lkdGg6IDcwcHg7bGVmdDogMHB4O2NvbG9yOiAjOTk5OycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA2LmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDUxcHggIWltcG9ydGFudDt0b3A6IDEzcHg7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0ZW1wNi5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4uaXNfc2hvd19jcmVhdGVfdGltZSIpWzBdLmlubmVySFRNTCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXA4ID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc19zaG93X2NyZWF0ZV90aW1lIilbMF0uaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXA2LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiLmljb24tbWVtYmVyLXRvcCIpKQogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXA2LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiLmljb24tdG9wIikpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wOC5zcGxpdCgiLSIpLmxlbmd0aCA9PSAyICYmIHRlbXA4LnNlYXJjaCgvKFxkezR9KS0oKDA/KFsxLTldKSl8KDFbMXwyXSkpLykgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgKyAiLSIgKyB0ZW1wOAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA3LmlubmVySFRNTCA9IHRlbXA4OwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXA4KQogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNi5jaGlsZHJlblswXS5iZWZvcmUodGVtcDcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpIC8q6LS05ZCn576O5YyWKi8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wOSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOS5zdHlsZSA9ICJiYWNrZ3JvdW5kLWNvbG9yOiAjRkY2NjY2OyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAxMCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTAuc3R5bGUgPSAiYmFja2dyb3VuZDpub25lO2JhY2tncm91bmQtY29sb3I6ICM0Mjg1RjU7IjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGVtcDExICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRlbXAxMS5zdHlsZSA9ICJiYWNrZ3JvdW5kOm5vbmU7YmFja2dyb3VuZC1jb2xvcjogI0ZGQ0MyNjsiOwogICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInRfY29uOiIgKyBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoJ2xfcG9zdCcpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJsX3Bvc3Q6IiArIGVycikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc19zaG93X2NyZWF0ZV90aW1lIilbMF0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb2wyX2xlZnQiKVswXSk7CiAgICAgICAgICAgICAgICBpZiAocGluZ2JpX2xvdWNlbmdxaXBhbyA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAxID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb3N0X2J1YmJsZV90b3AiKVswXTsKICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcDIgPSB0YXJnZXQucXVlcnlTZWxlY3RvckFsbCgiLnBvc3RfYnViYmxlX21pZGRsZSIpWzBdOwogICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wMyA9IHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCIucG9zdF9idWJibGVfYm90dG9tIilbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAxICE9IG51bGwgJiYgdGVtcDEgIT0gbnVsbCAmJiB0ZW1wMSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxLnN0eWxlID0gImJhY2tncm91bmRlOm5vbmU7IjsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIuc3R5bGUgPSAiYmFja2dyb3VuZGU6bm9uZTtwYWRkaW5nOnVuc2V0OyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAzLnN0eWxlID0gImJhY2tncm91bmRlOm5vbmU7IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qaWYgKGNsYXNzTGlzdC5jb250YWlucygncGFnZXJfdGhlbWVfNCcpKSB7CiAgICAgICAgICAgIH0qLwogICAgICAgICAgICAvKmlmIChjbGFzc0xpc3QuY29udGFpbnMoJ2xfcG9zdHNfbnVtJykgfHwgY2xhc3NMaXN0LmNvbnRhaW5zKCd0aHJlYWRfdGhlbWVfNScpKSB7IC8v6LS05a2Q5YaF5Y+q5Yqo5oCB5omn6KGM5LiA5qyhIHRocmVhZF90aGVtZV815Y+q5Zyo56ys5LiA5qyh5omT5byA6LS05a2Q5pe25omn6KGM77yM57+76aG15omn6KGMIHx8Y2xhc3NMaXN0LmNvbnRhaW5zKCdwYWdlcl90aGVtZV80JykKICAgICAgICAgICAgICAgIC8vJCgiZGl2LnJlcGxhY2VfZGl2PmRpdi5yZXBsYWNlX3RpcCIpLmNsaWNrKCkKICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGVuY3kKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM5NjA4My0lRTglODclQUElRTUlOEElQTglRTUlQjElOTUlRTUlQkMlODAlRTclOTklQkUlRTUlQkElQTYlRTglQjQlQjQlRTUlOTAlQTclRTUlQjglOTYlRTUlQUQlOTAlRTclOUElODQlRTUlOUIlQkUlRTclODklODcKICAgICAgICAgICAgICAgICAgICAgICAg6Ieq5Yqo5bGV5byA55m+5bqm6LS05ZCn5biW5a2Q55qE5Zu+54mHCiAgICAgICAgICAgICAgICAgICAgICAgIOiHquWKqOWxleW8gOeZvuW6pui0tOWQp+W4luWtkOeahOWbvueJh++8jOaWueS+v+a1j+iniOWbvueJh+W4lgogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uICAgIDAuMgogICAgICAgICAgICAgICAgICAgICAgICBjb3B5cmlnaHQgIDIwMTQrLCBMWVkKICAgICAgICAgICAgfSovCiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoJ3JpZ2h0JykpIHsgLy/mmL7npLrnp7vpmaTnsonkuJ3mjInpkq4KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0LmNoaWxkcmVuWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoImRpdiIpWzFdKTsKICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gdGFyZ2V0LmNoaWxkcmVuWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoImRpdiIpWzFdOwogICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRlbXAuc3R5bGUgPSAicGFkZGluZzo0cHggMCAwIDE0cHg7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2lkJykgPT0gIm1haW5fYXNpZGUiKSB7IC8v5pi+56S656e76Zmk57KJ5Lid5oyJ6ZKuCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRhcmdldCk7CiAgICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNlYXJjaCgiL2kvaS9mYW5zIikgIT0gLTEgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuc2VhcmNoKCIvaS9pL2NvbmNlcm4iKSAhPSAtMSkgJiYgIUdNX2dldFZhbHVlKCJ0aWViYW1laWh1YSIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZSgpOyAvL+i/meS4pOS4qumhtemdouWHuumUmeWQjueahOS4tOaXtuino+WGs+aWueahiO+8jOebtOaOpeWIoOS6huWHuumXrumimOagh+etvjIzMzMzCiAgICAgICAgICAgICAgICAgICAgLy9odHRwOi8vdGllYmEuYmFpZHUuY29tL2kvaS9mYW5zP3U9WFhYWFjvvIxodHRwOi8vdGllYmEuYmFpZHUuY29tL2kvaS9jb25jZXJuP3U9WFhYWFgKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBpbml0TGlzdGVuZXIgPSAoKSA9PiB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdEFuaW1hdGlvblN0YXJ0JywgdGllYmFfYWN0aW9uLCBmYWxzZSk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01TQW5pbWF0aW9uU3RhcnQnLCB0aWViYV9hY3Rpb24sIGZhbHNlKTsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uc3RhcnQnLCB0aWViYV9hY3Rpb24sIGZhbHNlKTsKICAgICAgICB9OwogICAgICAgIHZhciB5aW5nY2FuZyA9IGZhbHNlOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIiwgZnVuY3Rpb24gKGUpIHsgLy/op6PlhrPliLfmlrDotLTlrZDoh6rliqjot7PovazliLDmn5DkuKrkvY3nva7lj6/og73ml6Dms5XpmpDol4/kuIvlt6XlhbfmoI/pl67popjvvIznvJPop6Plt6XlhbfmoI/lgbblsJTlh7rnjrDkuI3pmpDol4/pl67popgKICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgdGFyZ2V0CiAgICAgICAgICAgIH0gPSBlOwogICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICBjbGFzc0xpc3QKICAgICAgICAgICAgfSA9IHRhcmdldDsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXQpOwogICAgICAgICAgICBsZXQgdGVtcCA9ICQoJyNqX2NvcmVfdGl0bGVfd3JhcCcpOyAvL+S4u+S9k+ahhuaetgogICAgICAgICAgICBpZiAodGVtcFswXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAocm1Cb3R0b20gPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0xpc3QuY29udGFpbnMoJ2xfdGhyZWFkX2luZm8nKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jb3JlX3RpdGxlX2JnJylbMF0uc3R5bGUgPSAiZGlzcGxheTpub25lICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNvcmVfdGl0bGVfdHh0JylbMF0uc3R5bGUgPSAiZGlzcGxheTpub25lICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNvcmVfdGl0bGVfYnRucycpWzBdLnN0eWxlID0gImRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsiOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjdGhyZWFkX3RoZW1lXzUnKVswXS5zdHlsZSA9ICJkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBzY3JvbGxZMSA9IHdpbmRvdy5zY3JvbGxZOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAvL2NvbnN0IHsgdGFyZ2V0IH0gPSBlOwogICAgICAgICAgICAvL2NvbnN0IHsgY2xhc3NMaXN0IH0gPSB0YXJnZXQ7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgbGV0IHRlbXAgPSAkKCcjal9jb3JlX3RpdGxlX3dyYXAnKTsgLy/kuLvkvZPmoYbmnrYKICAgICAgICAgICAgLy9jb3JlX3RpdGxlX2JnIOiDjOaZr+ahhgogICAgICAgICAgICAvL2NvcmVfdGl0bGVfdHh0IOagh+mimAogICAgICAgICAgICAvL2NvcmVfdGl0bGVfYnRucyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IOaMiemSrgogICAgICAgICAgICAvL3BfdGhyZWFkIHRocmVhZF90aGVtZV81IOmhteegge+8jOmhteaVsAogICAgICAgICAgICBpZiAodGVtcFswXSAhPSBudWxsKSB7IC8v5oWi6YCf5LiK5LiL56e75Yqo572R6aG15pe277yM5YG25bCU5pyJ5bel5YW35qCP6Zeq54OB6Zeu6aKYCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXBbMF0uc3R5bGVbInRvcCJdKTsKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuc2Nyb2xsWSAtIHNjcm9sbFkxIDwgMCkgewogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIuWQkeS4iua7muWKqCIpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wWzBdLmNsYXNzTmFtZSAhPSAiY29yZV90aXRsZV93cmFwX2JyaWdodCBjbGVhcmZpeCB0YnVpX2ZvbGxvd19maXhlZCBjb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCIgJiYgdGVtcFswXS5jbGFzc05hbWUgIT0gImNvcmVfdGl0bGVfd3JhcCBjb3JlX3RpdGxlX3dyYXBfYnJpZ2h0IHRidWlfZm9sbG93X2ZpeGVkIGNvcmVfdGl0bGVfYWJzb2x1dGVfYnJpZ2h0IiAvKuaXp+eJiOi0tOWQp+aciei/meS4qiovICkgewogICAgICAgICAgICAgICAgICAgICAgICB5aW5nY2FuZyA9IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vd2luZG93LnNjcm9sbFRvKHdpbmRvdy5zY3JvbGxZLCB3aW5kb3cuc2Nyb2xsWSsxMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAod2luZG93LnNjcm9sbFkgLSBzY3JvbGxZMSA+IDApIHsgLy/lvZPlkJHkuIvmu5rliqjml7YKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCLlkJHkuIvmu5rliqgiKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFswXS5jbGFzc05hbWUgPT0gImNvcmVfdGl0bGVfd3JhcF9icmlnaHQgY2xlYXJmaXggdGJ1aV9mb2xsb3dfZml4ZWQgY29yZV90aXRsZV9hYnNvbHV0ZV9icmlnaHQiIHx8IHRlbXBbMF0uY2xhc3NOYW1lID09ICJjb3JlX3RpdGxlX3dyYXAgY29yZV90aXRsZV93cmFwX2JyaWdodCB0YnVpX2ZvbGxvd19maXhlZCBjb3JlX3RpdGxlX2Fic29sdXRlX2JyaWdodCIgLyrml6fniYjotLTlkKfmnInov5nkuKoqLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgeWluZ2NhbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cod2luZG93LnNjcm9sbFkpOwogICAgICAgICAgICAgICAgaWYgKHlpbmdjYW5nID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocm1Cb3R0b20gPT0gdHJ1ZSkgeyAvL+makOiXj+S4i+W3peWFt+agjwogICAgICAgICAgICAgICAgICAgICAgICAkKCcuY29yZV90aXRsZV9iZycpWzBdLnN0eWxlID0gImRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jb3JlX3RpdGxlX3R4dCcpWzBdLnN0eWxlID0gImRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jb3JlX3RpdGxlX2J0bnMnKVswXS5zdHlsZSA9ICJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3RocmVhZF90aGVtZV81JylbMF0uc3R5bGUgPSAiZGlzcGxheTpub25lICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgLy90ZW1wWzBdLnN0eWxlID0gImRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyI7Ly/kvJrkuqfnlJ/mu5rliqjov5/mu57ljaHpob8r5peg5rOV5rua5Yqo5Yiw5bqVCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoJyN0aHJlYWRfdGhlbWVfNScpWzBdLmNsYXNzTGlzdC5hZGQoInRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJtQm90dG9tID09IHRydWUpIHsgLy/pmpDol4/kuIvlt6XlhbfmoI8KICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNvcmVfdGl0bGVfYmcnKVswXS5zdHlsZSA9ICJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNvcmVfdGl0bGVfdHh0JylbMF0uc3R5bGUgPSAiZGlzcGxheTpibG9jayAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jb3JlX3RpdGxlX2J0bnMnKVswXS5zdHlsZSA9ICJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7IjsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3RocmVhZF90aGVtZV81JylbMF0uc3R5bGUgPSAiZGlzcGxheTpibG9jayAhaW1wb3J0YW50OyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoJyN0aHJlYWRfdGhlbWVfNScpWzBdLmNsYXNzTGlzdC5yZW1vdmUoInRocmVhZF90aGVtZV9icmlnaHRfYWJzb2x1dGUiKQogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICDkv67lpI3otLTlrZDlhoXkuIvlt6XlhbfmoI/ngrnnv7vpobXmjInpkq7lkI7vvIzkuI3lho3mmL7npLrnv7vpobXliJfooagK55uu5qCH5qCH562+Y2xhc3MgcF90aHJlYWQgdGhyZWFkX3RoZW1lXzUK5Yqg5LiqdGhyZWFkX3RoZW1lX2JyaWdodF9hYnNvbHV0ZQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNjcm9sbFkxID0gd2luZG93LnNjcm9sbFk7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCQoJyNqX2NvcmVfdGl0bGVfd3JhcCcpWzBdLmNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSk7CiAgICAgICAgaW5pdExpc3RlbmVyKCk7CiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNlYXJjaCgvaHR0cDpcL1wvdGllYmFcLmJhaWR1XC5jb21cL2Jhd3UyXC9wbGF0Zm9ybVwvbGlzdFRvb2xzXD93b3JkPS4qL2cpICE9IC0xKSB7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coIueJiOWdl+WIhuWMujEiKTsKICAgICAgICAgICAgbGV0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0KTsKICAgICAgICAgICAgICAgICQoIiNzZWN0aW9uUGFydGl0aW9uQXBwIikuY2xpY2soKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIueJiOWdl+WIhuWMujIiKTsKICAgICAgICAgICAgICAgICAgICBsZXQgdDIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiLmRpYWxvZ0p0eHQiKVswXS5wYXJlbnROb2RlLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiLmRpYWxvZ0pib2R5IilbMF0uc3R5bGUgPSAiaGVpZ2h0OjQ1MHB4OyIKICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICB9CiAgICB9KSgpOwoKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gcmVzZXR4KCkgewogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgidXNlcmltZyIpOyAvL+S4gOS4queUqOaIt+mAgOWHuueZu+W9leWQju+8jOWGjeeUqOWFtuS7lui0puaIt+eZu+W9leS8muaui+eVmeS4iuS4gOS4queUqOaIt+eahOi0tOWQp+WktOWDjwogICAgICAgICAgICBhbGVydCgi5bey5Yig6Zmk6LS05ZCn55So5oi35aS05YOP57yT5a2Y77yBIik7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsgLy/liLfmlrDnvZHpobUKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNsb3NlbWVpaHVhKCkgewogICAgICAgICAgICBHTV9zZXRWYWx1ZSgidGllYmFtZWlodWEiLCBHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSA/IGZhbHNlIDogdHJ1ZSk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsgLy/liLfmlrDnvZHpobUKICAgICAgICB9CiAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgi5Yig6Zmk6LS05ZCn55So5oi35aS05YOP57yT5a2YIiwgcmVzZXR4KTsgLy8gQGdyYW50ICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCiAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZChHTV9nZXRWYWx1ZSgidGllYmFtZWlodWEiKSA/ICLlvIDlkK/otLTlkKfnvo7ljJYiIDogIuWFs+mXrei0tOWQp+e+juWMliIsIGNsb3NlbWVpaHVhKTsKICAgIH0pKCk7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghR01fZ2V0VmFsdWUoInRpZWJhbWVpaHVhIikgLyrotLTlkKfnvo7ljJYqLyApIHsgLy/pmpDol4/kvqfovrnmoI8KICAgICAgICAgICAgbGV0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyAvL+WIm+W7uuiKgueCuTxpbnB1dC8+CiAgICAgICAgICAgIHRlbXAuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpOwogICAgICAgICAgICB0ZW1wLnNldEF0dHJpYnV0ZSgnaWQnLCAieWluY2FuZ2NlYmlhbmxhbiIpOwogICAgICAgICAgICB0ZW1wLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAneWluY2FuZ2NlYmlhbmxhbicpOwogICAgICAgICAgICB0ZW1wLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAiPj4iKTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgICAgICAgICAgdGVtcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0CiAgICAgICAgICAgICAgICB9ID0gZTsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGFyZ2V0KTsKICAgICAgICAgICAgICAgIGxldCB0ZW1wMyA9ICQoImRpdi51c2VyYmFyICIpWzBdOwogICAgICAgICAgICAgICAgbGV0IHRlbXA0ID0gJCgidWwudGJ1aV9hc2lkZV9mbG9hdF9iYXIiKVswXTsKICAgICAgICAgICAgICAgIGlmICh5aW5jYW5nY2ViaWFubGFueCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHlpbmNhbmdjZWJpYW5sYW54ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgieWluY2FuZ2NlYmlhbmxhbiIsIHRydWUpCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gIjw8IjsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMy5zdHlsZSA9ICJkaXNwbGF5Om5vbmU7IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXA0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDQuc3R5bGUgPSAiZGlzcGxheTpub25lOyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB5aW5jYW5nY2ViaWFubGFueCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ5aW5jYW5nY2ViaWFubGFuIiwgZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gIj4+IjsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcDMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMy5zdHlsZSA9ICJkaXNwbGF5OmJsb2NrO3otaW5kZXg6IDEwMDA1OyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wNCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA0LnN0eWxlID0gImRpc3BsYXk6YmxvY2s7IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi6ZqQ6JeP5L6n6L655qCPIik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0pKCk7Cn0pKCQpOwovL+Wkh+S7vTMyMTLooYwgIgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyIsCi8v5aSH5Lu9MzUzOOihjCAiCWNvbnRlbnQ6IFwiXFxlMTYwXCI7IiwKLypodHRwczovL3d3dy5qYjUxLm5ldC9hcnRpY2xlLzE0NzIxNy5odG0KanPnm5HlkKxodG1s6aG16Z2i55qE5LiK5LiL5rua5Yqo5LqL5Lu25pa55rOVCnZhciBzY3JvbGxGdW5jID0gZnVuY3Rpb24oZSkgewogICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDsKICAgICAgICBpZiAoZS53aGVlbERlbHRhKSB7IC8v56ys5LiA5q2l77ya5YWI5Yik5pat5rWP6KeI5ZmoSUXvvIzosLfmrYzmu5Hova7kuovku7YKICAgICAgICAgICAgaWYgKGUud2hlZWxEZWx0YSA+IDApIHsgLy/lvZPmu5Hova7lkJHkuIrmu5rliqjml7YKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmu5Hova7lkJHkuIrmu5rliqgiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZS53aGVlbERlbHRhIDwgMCkgeyAvL+W9k+a7kei9ruWQkeS4i+a7muWKqOaXtgogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIua7kei9ruWQkeS4i+a7muWKqCIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChlLmRldGFpbCkgeyAvL0ZpcmVmb3jmu5Hova7kuovku7YKICAgICAgICAgICAgaWYgKGUuZGV0YWlsID4gMCkgeyAvL+W9k+a7kei9ruWQkeS4iua7muWKqOaXtgogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIua7kei9ruWQkeS4iua7muWKqCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlLmRldGFpbCA8IDApIHsgLy/lvZPmu5Hova7lkJHkuIvmu5rliqjml7YKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmu5Hova7lkJHkuIvmu5rliqgiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8v57uZ6aG16Z2i57uR5a6a5ruR6L2u5rua5Yqo5LqL5Lu2CmlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7IC8vZmlyZWZveAogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBzY3JvbGxGdW5jLCBmYWxzZSk7Cn0KLy/mu5rliqjmu5Hova7op6blj5FzY3JvbGxGdW5j5pa55rOVIC8vaWUg6LC35q2MCndpbmRvdy5vbm1vdXNld2hlZWwgPSBkb2N1bWVudC5vbm1vdXNld2hlZWwgPSBzY3JvbGxGdW5jOwoqLwoKLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuLnRQIilbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siKQ==","requires":[{"meta":{"name":"jquery.min.js","url":"http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js","ts":1600392378639,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2Mi4xLjEgfCAoYykgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZD1jLnNsaWNlLGU9Yy5jb25jYXQsZj1jLnB1c2gsZz1jLmluZGV4T2YsaD17fSxpPWgudG9TdHJpbmcsaj1oLmhhc093blByb3BlcnR5LGs9e30sbD1hLmRvY3VtZW50LG09IjIuMS4xIixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmQuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5lYWNoKHRoaXMsYSxiKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoMD5hP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmI+Yz9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOmYsc29ydDpjLnNvcnQsc3BsaWNlOmMuc3BsaWNlfSxuLmV4dGVuZD1uLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnPWFyZ3VtZW50c1swXXx8e30saD0xLGk9YXJndW1lbnRzLmxlbmd0aCxqPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBnJiYoaj1nLGc9YXJndW1lbnRzW2hdfHx7fSxoKyspLCJvYmplY3QiPT10eXBlb2YgZ3x8bi5pc0Z1bmN0aW9uKGcpfHwoZz17fSksaD09PWkmJihnPXRoaXMsaC0tKTtpPmg7aCsrKWlmKG51bGwhPShhPWFyZ3VtZW50c1toXSkpZm9yKGIgaW4gYSljPWdbYl0sZD1hW2JdLGchPT1kJiYoaiYmZCYmKG4uaXNQbGFpbk9iamVjdChkKXx8KGU9bi5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZuLmlzQXJyYXkoYyk/YzpbXSk6Zj1jJiZuLmlzUGxhaW5PYmplY3QoYyk/Yzp7fSxnW2JdPW4uZXh0ZW5kKGosZixkKSk6dm9pZCAwIT09ZCYmKGdbYl09ZCkpO3JldHVybiBnfSxuLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisobStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0sbm9vcDpmdW5jdGlvbigpe30saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4iZnVuY3Rpb24iPT09bi50eXBlKGEpfSxpc0FycmF5OkFycmF5LmlzQXJyYXksaXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFuLmlzQXJyYXkoYSkmJmEtcGFyc2VGbG9hdChhKT49MH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtyZXR1cm4ib2JqZWN0IiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKT8hMTphLmNvbnN0cnVjdG9yJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIik/ITE6ITB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXt2YXIgYixjPWV2YWw7YT1uLnRyaW0oYSksYSYmKDE9PT1hLmluZGV4T2YoInVzZSBzdHJpY3QiKT8oYj1sLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGIudGV4dD1hLGwuaGVhZC5hcHBlbmRDaGlsZChiKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTpjKGEpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cyhhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsPT1iPy0xOmcuY2FsbChiLGEsYyl9LG1lcmdlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPStiLmxlbmd0aCxkPTAsZT1hLmxlbmd0aDtjPmQ7ZCsrKWFbZSsrXT1iW2RdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXMoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihjPWFbYl0sYj1hLGE9Yyksbi5pc0Z1bmN0aW9uKGEpPyhlPWQuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsZS5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGYpOnZvaWQgMH0sbm93OkRhdGUubm93LHN1cHBvcnQ6a30pLG4uZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2hbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj1hLmxlbmd0aCxjPW4udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bi5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgdD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKy1uZXcgRGF0ZSx2PWEuZG9jdW1lbnQsdz0wLHg9MCx5PWdiKCksej1nYigpLEE9Z2IoKSxCPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iJiYobD0hMCksMH0sQz0idW5kZWZpbmVkIixEPTE8PDMxLEU9e30uaGFzT3duUHJvcGVydHksRj1bXSxHPUYucG9wLEg9Ri5wdXNoLEk9Ri5wdXNoLEo9Ri5zbGljZSxLPUYuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtjPmI7YisrKWlmKHRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfSxMPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTj0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE89Ti5yZXBsYWNlKCJ3IiwidyMiKSxQPSJcXFsiK00rIiooIitOKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTysiKSl8KSIrTSsiKlxcXSIsUT0iOigiK04rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1ArIikqKXwuKilcXCl8KSIsUj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxUPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUSksVz1uZXcgUmVnRXhwKCJeIitPKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitOKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK04rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK04ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1ApLFBTRVVETzpuZXcgUmVnRXhwKCJeIitRKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitMKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWI9L1srfl0vLGJiPS8nfFxcL2csY2I9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGRiPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfTt0cnl7SS5hcHBseShGPUouY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRlt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYil7ST17YXBwbHk6Ri5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtILmFwcGx5KGEsSi5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmIoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSwhYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBkO2lmKDEhPT0oaz1iLm5vZGVUeXBlKSYmOSE9PWspcmV0dXJuW107aWYocCYmIWUpe2lmKGY9Xy5leGVjKGEpKWlmKGo9ZlsxXSl7aWYoOT09PWspe2lmKGg9Yi5nZXRFbGVtZW50QnlJZChqKSwhaHx8IWgucGFyZW50Tm9kZSlyZXR1cm4gZDtpZihoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZSBpZihiLm93bmVyRG9jdW1lbnQmJihoPWIub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChqKSkmJnQoYixoKSYmaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2V7aWYoZlsyXSlyZXR1cm4gSS5hcHBseShkLGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkpLGQ7aWYoKGo9ZlszXSkmJmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBJLmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD05PT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmIsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytxYihvW2xdKTt3PWFiLnRlc3QoYSkmJm9iKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSS5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBnYigpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaGIoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBpYihhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGtiKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxEKS0ofmEuc291cmNlSW5kZXh8fEQpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBsYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gbmIoYSl7cmV0dXJuIGhiKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGhiKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gb2IoYSl7cmV0dXJuIGEmJnR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09QyYmYX1jPWZiLnN1cHBvcnQ9e30sZj1mYi5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1mYi5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlPWE/YS5vd25lckRvY3VtZW50fHxhOnYsZz1lLmRlZmF1bHRWaWV3O3JldHVybiBlIT09biYmOT09PWUubm9kZVR5cGUmJmUuZG9jdW1lbnRFbGVtZW50PyhuPWUsbz1lLmRvY3VtZW50RWxlbWVudCxwPSFmKGUpLGcmJmchPT1nLnRvcCYmKGcuYWRkRXZlbnRMaXN0ZW5lcj9nLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXttKCl9LCExKTpnLmF0dGFjaEV2ZW50JiZnLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXttKCl9KSksYy5hdHRyaWJ1dGVzPWliKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9aWIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZS5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkmJmliKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nYSc+PC9kaXY+PGRpdiBjbGFzcz0nYSBpJz48L2Rpdj4iLGEuZmlyc3RDaGlsZC5jbGFzc05hbWU9ImkiLDI9PT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImkiKS5sZW5ndGh9KSxjLmdldEJ5SWQ9aWIoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZS5nZXRFbGVtZW50c0J5TmFtZXx8IWUuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9PUMmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYixkYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPT1DJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiB0eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PUM/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1DJiZwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGUucXVlcnlTZWxlY3RvckFsbCkpJiYoaWIoZnVuY3Rpb24oYSl7YS5pbm5lckhUTUw9IjxzZWxlY3QgbXNhbGxvd2NsaXA9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djbGlwXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitMKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8cS5wdXNoKCI6Y2hlY2tlZCIpfSksaWIoZnVuY3Rpb24oYSl7dmFyIGI9ZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZpYihmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUSl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWV8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09ZXx8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9LLmNhbGwoayxhKS1LLmNhbGwoayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxmPWEucGFyZW50Tm9kZSxnPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZnx8IWcpcmV0dXJuIGE9PT1lPy0xOmI9PT1lPzE6Zj8tMTpnPzE6az9LLmNhbGwoayxhKS1LLmNhbGwoayxiKTowO2lmKGY9PT1nKXJldHVybiBrYihhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSloLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWkudW5zaGlmdChjKTt3aGlsZShoW2RdPT09aVtkXSlkKys7cmV0dXJuIGQ/a2IoaFtkXSxpW2RdKTpoW2RdPT09dj8tMTppW2RdPT09dj8xOjB9LGUpOm59LGZiLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZmIoYSxudWxsLG51bGwsYil9LGZiLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShVLCI9JyQxJ10iKSwhKCFjLm1hdGNoZXNTZWxlY3Rvcnx8IXB8fHImJnIudGVzdChiKXx8cSYmcS50ZXN0KGIpKSl0cnl7dmFyIGQ9cy5jYWxsKGEsYik7aWYoZHx8Yy5kaXNjb25uZWN0ZWRNYXRjaHx8YS5kb2N1bWVudCYmMTEhPT1hLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBkfWNhdGNoKGUpe31yZXR1cm4gZmIoYixuLG51bGwsW2FdKS5sZW5ndGg+MH0sZmIuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksdChhLGIpfSxmYi5hdHRyPWZ1bmN0aW9uKGEsYil7KGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpO3ZhciBlPWQuYXR0ckhhbmRsZVtiLnRvTG93ZXJDYXNlKCldLGY9ZSYmRS5jYWxsKGQuYXR0ckhhbmRsZSxiLnRvTG93ZXJDYXNlKCkpP2UoYSxiLCFwKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWY/ZjpjLmF0dHJpYnV0ZXN8fCFwP2EuZ2V0QXR0cmlidXRlKGIpOihmPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmYuc3BlY2lmaWVkP2YudmFsdWU6bnVsbH0sZmIuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfSxmYi51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe3ZhciBiLGQ9W10sZT0wLGY9MDtpZihsPSFjLmRldGVjdER1cGxpY2F0ZXMsaz0hYy5zb3J0U3RhYmxlJiZhLnNsaWNlKDApLGEuc29ydChCKSxsKXt3aGlsZShiPWFbZisrXSliPT09YVtmXSYmKGU9ZC5wdXNoKGYpKTt3aGlsZShlLS0pYS5zcGxpY2UoZFtlXSwxKX1yZXR1cm4gaz1udWxsLGF9LGU9ZmIuZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjPSIiLGQ9MCxmPWEubm9kZVR5cGU7aWYoZil7aWYoMT09PWZ8fDk9PT1mfHwxMT09PWYpe2lmKCJzdHJpbmciPT10eXBlb2YgYS50ZXh0Q29udGVudClyZXR1cm4gYS50ZXh0Q29udGVudDtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpYys9ZShhKX1lbHNlIGlmKDM9PT1mfHw0PT09ZilyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSB3aGlsZShiPWFbZCsrXSljKz1lKGIpO3JldHVybiBjfSxkPWZiLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmhiLG1hdGNoOlgsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0ucmVwbGFjZShjYixkYiksYVszXT0oYVszXXx8YVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoY2IsZGIpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxmYi5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZmYi5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gWC5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZWLnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNiLGRiKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWE/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9fSxDTEFTUzpmdW5jdGlvbihhKXt2YXIgYj15W2ErIiAiXTtyZXR1cm4gYnx8KGI9bmV3IFJlZ0V4cCgiKF58IitNKyIpIithKyIoIitNKyJ8JCkiKSkmJnkoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi50ZXN0KCJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWUmJmEuY2xhc3NOYW1lfHx0eXBlb2YgYS5nZXRBdHRyaWJ1dGUhPT1DJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXt2YXIgZT1mYi5hdHRyKGQsYSk7cmV0dXJuIG51bGw9PWU/IiE9Ij09PWI6Yj8oZSs9IiIsIj0iPT09Yj9lPT09YzoiIT0iPT09Yj9lIT09YzoiXj0iPT09Yj9jJiYwPT09ZS5pbmRleE9mKGMpOiIqPSI9PT1iP2MmJmUuaW5kZXhPZihjKT4tMToiJD0iPT09Yj9jJiZlLnNsaWNlKC1jLmxlbmd0aCk9PT1jOiJ+PSI9PT1iPygiICIrZSsiICIpLmluZGV4T2YoYyk+LTE6Inw9Ij09PWI/ZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9Im50aCIhPT1hLnNsaWNlKDAsMyksZz0ibGFzdCIhPT1hLnNsaWNlKC00KSxoPSJvZi10eXBlIj09PWI7cmV0dXJuIDE9PT1kJiYwPT09ZT9mdW5jdGlvbihhKXtyZXR1cm4hIWEucGFyZW50Tm9kZX06ZnVuY3Rpb24oYixjLGkpe3ZhciBqLGssbCxtLG4sbyxwPWYhPT1nPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIscT1iLnBhcmVudE5vZGUscj1oJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscz0haSYmIWg7aWYocSl7aWYoZil7d2hpbGUocCl7bD1iO3doaWxlKGw9bFtwXSlpZihoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXtrPXFbdV18fChxW3VdPXt9KSxqPWtbYV18fFtdLG49alswXT09PXcmJmpbMV0sbT1qWzBdPT09dyYmalsyXSxsPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigxPT09bC5ub2RlVHlwZSYmKyttJiZsPT09Yil7a1thXT1bdyxuLG1dO2JyZWFrfX1lbHNlIGlmKHMmJihqPShiW3VdfHwoYlt1XT17fSkpW2FdKSYmalswXT09PXcpbT1qWzFdO2Vsc2Ugd2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSkmJisrbSYmKHMmJigobFt1XXx8KGxbdV09e30pKVthXT1bdyxtXSksbD09PWIpKWJyZWFrO3JldHVybiBtLT1lLG09PT1kfHxtJWQ9PT0wJiZtL2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYi5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hiKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1LLmNhbGwoYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aGIoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2hiKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLCFjLnBvcCgpfX0pLGhhczpoYihmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGZiKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aGIoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhiKGZ1bmN0aW9uKGEpe3JldHVybiBXLnRlc3QoYXx8IiIpfHxmYi5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShjYixkYikudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFoudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmIoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5iKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYihmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5iKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5iKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmIoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGIoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWIoYik7ZnVuY3Rpb24gcGIoKXt9cGIucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYixnPWZiLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpeyghY3x8KGU9Uy5leGVjKGgpKSkmJihlJiYoaD1oLnNsaWNlKGVbMF0ubGVuZ3RoKXx8aCksaS5wdXNoKGY9W10pKSxjPSExLChlPVQuZXhlYyhoKSkmJihjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTplWzBdLnJlcGxhY2UoUiwiICIpfSksaD1oLnNsaWNlKGMubGVuZ3RoKSk7Zm9yKGcgaW4gZC5maWx0ZXIpIShlPVhbZ10uZXhlYyhoKSl8fGpbZ10mJiEoZT1qW2ddKGUpKXx8KGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmcsbWF0Y2hlczplfSksaD1oLnNsaWNlKGMubGVuZ3RoKSk7aWYoIWMpYnJlYWt9cmV0dXJuIGI/aC5sZW5ndGg6aD9mYi5lcnJvcihhKTp6KGEsaSkuc2xpY2UoMCl9O2Z1bmN0aW9uIHFiKGEpe2Zvcih2YXIgYj0wLGM9YS5sZW5ndGgsZD0iIjtjPmI7YisrKWQrPWFbYl0udmFsdWU7cmV0dXJuIGR9ZnVuY3Rpb24gcmIoYSxiLGMpe3ZhciBkPWIuZGlyLGU9YyYmInBhcmVudE5vZGUiPT09ZCxmPXgrKztyZXR1cm4gYi5maXJzdD9mdW5jdGlvbihiLGMsZil7d2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXJldHVybiBhKGIsYyxmKX06ZnVuY3Rpb24oYixjLGcpe3ZhciBoLGksaj1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGk9Ylt1XXx8KGJbdV09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGpbMl09aFsyXTtpZihpW2RdPWosalsyXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNiKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRiKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmIoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHViKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJighY3x8YyhmLGQsZSkpJiYoZy5wdXNoKGYpLGomJmIucHVzaChoKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmIoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmIoZCkpLGUmJiFlW3VdJiYoZT12YihlLGYpKSxoYihmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YihifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YihwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWIocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0suY2FsbChmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dWIocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkkuYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHdiKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9cmIoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXJiKGZ1bmN0aW9uKGEpe3JldHVybiBLLmNhbGwoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3JldHVybiFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYihzYihtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmIoaT4xJiZzYihtKSxpPjEmJnFiKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUiwiJDEiKSxjLGU+aSYmd2IoYS5zbGljZShpLGUpKSxmPmUmJndiKGE9YS5zbGljZShlKSksZj5lJiZxYihhKSl9bS5wdXNoKGMpfXJldHVybiBzYihtKX1mdW5jdGlvbiB4YihhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxtLG8scD0wLHE9IjAiLHI9ZiYmW10scz1bXSx0PWosdT1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx2PXcrPW51bGw9PXQ/MTpNYXRoLnJhbmRvbSgpfHwuMSx4PXUubGVuZ3RoO2ZvcihrJiYoaj1nIT09biYmZyk7cSE9PXgmJm51bGwhPShsPXVbcV0pO3ErKyl7aWYoZSYmbCl7bT0wO3doaWxlKG89YVttKytdKWlmKG8obCxnLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9dil9YyYmKChsPSFvJiZsKSYmcC0tLGYmJnIucHVzaChsKSl9aWYocCs9cSxjJiZxIT09cCl7bT0wO3doaWxlKG89YlttKytdKW8ocixzLGcsaCk7aWYoZil7aWYocD4wKXdoaWxlKHEtLSlyW3FdfHxzW3FdfHwoc1txXT1HLmNhbGwoaSkpO3M9dWIocyl9SS5hcHBseShpLHMpLGsmJiFmJiZzLmxlbmd0aD4wJiZwK2IubGVuZ3RoPjEmJmZiLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXYsaj10KSxyfTtyZXR1cm4gYz9oYihmKTpmfXJldHVybiBoPWZiLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YihiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGIoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZiLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoY2IsZGIpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1YLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShjYixkYiksYWIudGVzdChqWzBdLnR5cGUpJiZvYihiLnBhcmVudE5vZGUpfHxiKSkpe2lmKGouc3BsaWNlKGksMSksYT1mLmxlbmd0aCYmcWIoaiksIWEpcmV0dXJuIEkuYXBwbHkoZSxmKSxlO2JyZWFrfX19cmV0dXJuKG58fGgoYSxvKSkoZixiLCFwLGUsYWIudGVzdChhKSYmb2IoYi5wYXJlbnROb2RlKXx8YiksZX0sYy5zb3J0U3RhYmxlPXUuc3BsaXQoIiIpLnNvcnQoQikuam9pbigiIik9PT11LGMuZGV0ZWN0RHVwbGljYXRlcz0hIWwsbSgpLGMuc29ydERldGFjaGVkPWliKGZ1bmN0aW9uKGEpe3JldHVybiAxJmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24obi5jcmVhdGVFbGVtZW50KCJkaXYiKSl9KSxpYihmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxqYigidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphLmdldEF0dHJpYnV0ZShiLCJ0eXBlIj09PWIudG9Mb3dlckNhc2UoKT8xOjIpfSksYy5hdHRyaWJ1dGVzJiZpYihmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxpbnB1dC8+IixhLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxqYigidmFsdWUiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY3x8ImlucHV0IiE9PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT92b2lkIDA6YS5kZWZhdWx0VmFsdWV9KSxpYihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8amIoTCxmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOmFbYl09PT0hMD9iLnRvTG93ZXJDYXNlKCk6KGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZC5zcGVjaWZpZWQ/ZC52YWx1ZTpudWxsfSksZmJ9KGEpO24uZmluZD10LG4uZXhwcj10LnNlbGVjdG9ycyxuLmV4cHJbIjoiXT1uLmV4cHIucHNldWRvcyxuLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PW4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsdj0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLHc9L14uW146I1xbXC4sXSokLztmdW5jdGlvbiB4KGEsYixjKXtpZihuLmlzRnVuY3Rpb24oYikpcmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuISFiLmNhbGwoYSxkLGEpIT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KTtpZigic3RyaW5nIj09dHlwZW9mIGIpe2lmKHcudGVzdChiKSlyZXR1cm4gbi5maWx0ZXIoYixhLGMpO2I9bi5maWx0ZXIoYixhKX1yZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGcuY2FsbChiLGEpPj0wIT09Y30pfW4uZmlsdGVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iWzBdO3JldHVybiBjJiYoYT0iOm5vdCgiK2ErIikiKSwxPT09Yi5sZW5ndGgmJjE9PT1kLm5vZGVUeXBlP24uZmluZC5tYXRjaGVzU2VsZWN0b3IoZCxhKT9bZF06W106bi5maW5kLm1hdGNoZXMoYSxuLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gMT09PWEubm9kZVR5cGV9KSl9LG4uZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5sZW5ndGgsZD1bXSxlPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiB0aGlzLnB1c2hTdGFjayhuKGEpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7Yz5iO2IrKylpZihuLmNvbnRhaW5zKGVbYl0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKGI9MDtjPmI7YisrKW4uZmluZChhLGVbYl0sZCk7cmV0dXJuIGQ9dGhpcy5wdXNoU3RhY2soYz4xP24udW5pcXVlKGQpOmQpLGQuc2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj90aGlzLnNlbGVjdG9yKyIgIithOmEsZH0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayh4KHRoaXMsYXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayh4KHRoaXMsYXx8W10sITApKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISF4KHRoaXMsInN0cmluZyI9PXR5cGVvZiBhJiZ1LnRlc3QoYSk/bihhKTphfHxbXSwhMSkubGVuZ3RofX0pO3ZhciB5LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW4uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWFbMF0mJiI+Ij09PWFbYS5sZW5ndGgtMV0mJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06ei5leGVjKGEpLCFjfHwhY1sxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fHkpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGNbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChjWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmwsITApKSx2LnRlc3QoY1sxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoYyBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2NdKT90aGlzW2NdKGJbY10pOnRoaXMuYXR0cihjLGJbY10pO3JldHVybiB0aGlzfXJldHVybiBkPWwuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlJiYodGhpcy5sZW5ndGg9MSx0aGlzWzBdPWQpLHRoaXMuY29udGV4dD1sLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgeS5yZWFkeT95LnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0EucHJvdG90eXBlPW4uZm4seT1uKGwpO3ZhciBCPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEM9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5leHRlbmQoe2RpcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmbihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1uKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDtjPmE7YSsrKWlmKG4uY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9MCxlPXRoaXMubGVuZ3RoLGY9W10sZz11LnRlc3QoYSl8fCJzdHJpbmciIT10eXBlb2YgYT9uKGEsYnx8dGhpcy5jb250ZXh0KTowO2U+ZDtkKyspZm9yKGM9dGhpc1tkXTtjJiZjIT09YjtjPWMucGFyZW50Tm9kZSlpZihjLm5vZGVUeXBlPDExJiYoZz9nLmluZGV4KGMpPi0xOjE9PT1jLm5vZGVUeXBlJiZuLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGMsYSkpKXtmLnB1c2goYyk7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYubGVuZ3RoPjE/bi51bmlxdWUoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9nLmNhbGwobihhKSx0aGlzWzBdKTpnLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4udW5pcXVlKG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEQoYSxiKXt3aGlsZSgoYT1hW2JdKSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gbi5zaWJsaW5nKChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gbi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRlbnREb2N1bWVudHx8bi5tZXJnZShbXSxhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9bi5tYXAodGhpcyxiLGMpO3JldHVybiJVbnRpbCIhPT1hLnNsaWNlKC01KSYmKGQ9YyksZCYmInN0cmluZyI9PXR5cGVvZiBkJiYoZT1uLmZpbHRlcihkLGUpKSx0aGlzLmxlbmd0aD4xJiYoQ1thXXx8bi51bmlxdWUoZSksQi50ZXN0KGEpJiZlLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBuLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1uLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm4uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYj1hLm1lbW9yeSYmbCxjPSEwLGc9ZXx8MCxlPTAsZj1oLmxlbmd0aCxkPSEwO2gmJmY+ZztnKyspaWYoaFtnXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2I9ITE7YnJlYWt9ZD0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmI/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBjPWgubGVuZ3RoOyFmdW5jdGlvbiBnKGIpe24uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmcoYyl9KX0oYXJndW1lbnRzKSxkP2Y9aC5sZW5ndGg6YiYmKGU9YyxqKGIpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixoLGMpKT4tMSloLnNwbGljZShjLDEpLGQmJihmPj1jJiZmLS0sZz49YyYmZy0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGY9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1iPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGJ8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGIpe3JldHVybiFofHxjJiYhaXx8KGI9Ynx8W10sYj1bYSxiLnNsaWNlP2Iuc2xpY2UoKTpiXSxkP2kucHVzaChiKTpqKGIpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFjfX07cmV0dXJuIGt9LG4uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixuLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG4uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bi5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1uLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bi5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixuLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTpuLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm4uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDtuLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBuLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG4uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP24ucmVhZHlXYWl0Kys6bi5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpeyhhPT09ITA/LS1uLnJlYWR5V2FpdDpuLmlzUmVhZHkpfHwobi5pc1JlYWR5PSEwLGEhPT0hMCYmLS1uLnJlYWR5V2FpdD4wfHwoSC5yZXNvbHZlV2l0aChsLFtuXSksbi5mbi50cmlnZ2VySGFuZGxlciYmKG4obCkudHJpZ2dlckhhbmRsZXIoInJlYWR5IiksbihsKS5vZmYoInJlYWR5IikpKSl9fSk7ZnVuY3Rpb24gSSgpe2wucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSSwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixJLCExKSxuLnJlYWR5KCl9bi5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe3JldHVybiBIfHwoSD1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWwucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KG4ucmVhZHkpOihsLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEksITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSSwhMSkpKSxILnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBKPW4uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyluLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxuLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobihhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfTtuLmFjY2VwdERhdGE9ZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfHw5PT09YS5ub2RlVHlwZXx8ISthLm5vZGVUeXBlfTtmdW5jdGlvbiBLKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuY2FjaGU9e30sMCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319fSksdGhpcy5leHBhbmRvPW4uZXhwYW5kbytNYXRoLnJhbmRvbSgpfUsudWlkPTEsSy5hY2NlcHRzPW4uYWNjZXB0RGF0YSxLLnByb3RvdHlwZT17a2V5OmZ1bmN0aW9uKGEpe2lmKCFLLmFjY2VwdHMoYSkpcmV0dXJuIDA7dmFyIGI9e30sYz1hW3RoaXMuZXhwYW5kb107aWYoIWMpe2M9Sy51aWQrKzt0cnl7Ylt0aGlzLmV4cGFuZG9dPXt2YWx1ZTpjfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLGIpfWNhdGNoKGQpe2JbdGhpcy5leHBhbmRvXT1jLG4uZXh0ZW5kKGEsYil9fXJldHVybiB0aGlzLmNhY2hlW2NdfHwodGhpcy5jYWNoZVtjXT17fSksY30sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPXRoaXMua2V5KGEpLGY9dGhpcy5jYWNoZVtlXTtpZigic3RyaW5nIj09dHlwZW9mIGIpZltiXT1jO2Vsc2UgaWYobi5pc0VtcHR5T2JqZWN0KGYpKW4uZXh0ZW5kKHRoaXMuY2FjaGVbZV0sYik7ZWxzZSBmb3IoZCBpbiBiKWZbZF09YltkXTtyZXR1cm4gZn0sZ2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jYWNoZVt0aGlzLmtleShhKV07cmV0dXJuIHZvaWQgMD09PWI/YzpjW2JdfSxhY2Nlc3M6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiB2b2lkIDA9PT1ifHxiJiYic3RyaW5nIj09dHlwZW9mIGImJnZvaWQgMD09PWM/KGQ9dGhpcy5nZXQoYSxiKSx2b2lkIDAhPT1kP2Q6dGhpcy5nZXQoYSxuLmNhbWVsQ2FzZShiKSkpOih0aGlzLnNldChhLGIsYyksdm9pZCAwIT09Yz9jOmIpfSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzLmtleShhKSxnPXRoaXMuY2FjaGVbZl07aWYodm9pZCAwPT09Yil0aGlzLmNhY2hlW2ZdPXt9O2Vsc2V7bi5pc0FycmF5KGIpP2Q9Yi5jb25jYXQoYi5tYXAobi5jYW1lbENhc2UpKTooZT1uLmNhbWVsQ2FzZShiKSxiIGluIGc/ZD1bYixlXTooZD1lLGQ9ZCBpbiBnP1tkXTpkLm1hdGNoKEUpfHxbXSkpLGM9ZC5sZW5ndGg7d2hpbGUoYy0tKWRlbGV0ZSBnW2RbY11dfX0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4hbi5pc0VtcHR5T2JqZWN0KHRoaXMuY2FjaGVbYVt0aGlzLmV4cGFuZG9dXXx8e30pfSxkaXNjYXJkOmZ1bmN0aW9uKGEpe2FbdGhpcy5leHBhbmRvXSYmZGVsZXRlIHRoaXMuY2FjaGVbYVt0aGlzLmV4cGFuZG9dXX19O3ZhciBMPW5ldyBLLE09bmV3IEssTj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE89LyhbQS1aXSkvZztmdW5jdGlvbiBQKGEsYixjKXt2YXIgZDtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9TS5zZXQoYSxiLGMpfWVsc2UgYz12b2lkIDA7cmV0dXJuIGN9bi5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIE0uaGFzRGF0YShhKXx8TC5oYXNEYXRhKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gTS5hY2Nlc3MoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TS5yZW1vdmUoYSxiKQp9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gTC5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe0wucmVtb3ZlKGEsYil9fSksbi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1NLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIUwuZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7TC5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe00uc2V0KHRoaXMsYSl9KTpKKHRoaXMsZnVuY3Rpb24oYil7dmFyIGMsZD1uLmNhbWVsQ2FzZShhKTtpZihmJiZ2b2lkIDA9PT1iKXtpZihjPU0uZ2V0KGYsYSksdm9pZCAwIT09YylyZXR1cm4gYztpZihjPU0uZ2V0KGYsZCksdm9pZCAwIT09YylyZXR1cm4gYztpZihjPVAoZixkLHZvaWQgMCksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPU0uZ2V0KHRoaXMsZCk7TS5zZXQodGhpcyxkLGIpLC0xIT09YS5pbmRleE9mKCItIikmJnZvaWQgMCE9PWMmJk0uc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtNLnJlbW92ZSh0aGlzLGEpfSl9fSksbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYT8oYj0oYnx8ImZ4IikrInF1ZXVlIixkPUwuZ2V0KGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1MLmFjY2VzcyhhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIEwuZ2V0KGEsYyl8fEwuYWNjZXNzKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7TC5yZW1vdmUoYSxbYisicXVldWUiLGNdKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZuLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1MLmdldChmW2ddLGErInF1ZXVlSG9va3MiKSxjJiZjLmVtcHR5JiYoZCsrLGMuZW1wdHkuYWRkKGgpKTtyZXR1cm4gaCgpLGUucHJvbWlzZShiKX19KTt2YXIgUT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxSPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sUz1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09bi5jc3MoYSwiZGlzcGxheSIpfHwhbi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl9LFQ9L14oPzpjaGVja2JveHxyYWRpbykkL2k7IWZ1bmN0aW9uKCl7dmFyIGE9bC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYj1hLmFwcGVuZENoaWxkKGwuY3JlYXRlRWxlbWVudCgiZGl2IikpLGM9bC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxiLmFwcGVuZENoaWxkKGMpLGsuY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsay5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciBVPSJ1bmRlZmluZWQiO2suZm9jdXNpbkJ1YmJsZXM9Im9uZm9jdXNpbiJpbiBhO3ZhciBWPS9ea2V5LyxXPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8Y2xpY2svLFg9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFk9L14oW14uXSopKD86XC4oLispfCkkLztmdW5jdGlvbiBaKCl7cmV0dXJuITB9ZnVuY3Rpb24gJCgpe3JldHVybiExfWZ1bmN0aW9uIF8oKXt0cnl7cmV0dXJuIGwuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fW4uZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9TC5nZXQoYSk7aWYocil7Yy5oYW5kbGVyJiYoZj1jLGM9Zi5oYW5kbGVyLGU9Zi5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoaT1yLmV2ZW50cyl8fChpPXIuZXZlbnRzPXt9KSwoZz1yLmhhbmRsZSl8fChnPXIuaGFuZGxlPWZ1bmN0aW9uKGIpe3JldHVybiB0eXBlb2YgbiE9PVUmJm4uZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP24uZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fCIiKS5tYXRjaChFKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSloPVkuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30saz1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxmKSwobT1pW29dKXx8KG09aVtvXT1bXSxtLmRlbGVnYXRlQ291bnQ9MCxsLnNldHVwJiZsLnNldHVwLmNhbGwoYSxkLHAsZykhPT0hMXx8YS5hZGRFdmVudExpc3RlbmVyJiZhLmFkZEV2ZW50TGlzdGVuZXIobyxnLCExKSksbC5hZGQmJihsLmFkZC5jYWxsKGEsayksay5oYW5kbGVyLmd1aWR8fChrLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsayk6bS5wdXNoKGspLG4uZXZlbnQuZ2xvYmFsW29dPSEwKX19LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbyxwLHEscj1MLmhhc0RhdGEoYSkmJkwuZ2V0KGEpO2lmKHImJihpPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9WS5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1uLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbT1pW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksZz1mPW0ubGVuZ3RoO3doaWxlKGYtLSlrPW1bZl0sIWUmJnEhPT1rLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1rLmd1aWR8fGgmJiFoLnRlc3Qoay5uYW1lc3BhY2UpfHxkJiZkIT09ay5zZWxlY3RvciYmKCIqKiIhPT1kfHwhay5zZWxlY3Rvcil8fChtLnNwbGljZShmLDEpLGsuc2VsZWN0b3ImJm0uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsaykpO2cmJiFtLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG4ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUgaVtvXSl9ZWxzZSBmb3IobyBpbiBpKW4uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bi5pc0VtcHR5T2JqZWN0KGkpJiYoZGVsZXRlIHIuaGFuZGxlLEwucmVtb3ZlKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGYsZyxoLGksayxtLG8scD1bZHx8bF0scT1qLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ai5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoZz1oPWQ9ZHx8bCwzIT09ZC5ub2RlVHlwZSYmOCE9PWQubm9kZVR5cGUmJiFYLnRlc3QocStuLmV2ZW50LnRyaWdnZXJlZCkmJihxLmluZGV4T2YoIi4iKT49MCYmKHI9cS5zcGxpdCgiLiIpLHE9ci5zaGlmdCgpLHIuc29ydCgpKSxrPXEuaW5kZXhPZigiOiIpPDAmJiJvbiIrcSxiPWJbbi5leHBhbmRvXT9iOm5ldyBuLkV2ZW50KHEsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1lPzI6MyxiLm5hbWVzcGFjZT1yLmpvaW4oIi4iKSxiLm5hbWVzcGFjZV9yZT1iLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIityLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsYi5yZXN1bHQ9dm9pZCAwLGIudGFyZ2V0fHwoYi50YXJnZXQ9ZCksYz1udWxsPT1jP1tiXTpuLm1ha2VBcnJheShjLFtiXSksbz1uLmV2ZW50LnNwZWNpYWxbcV18fHt9LGV8fCFvLnRyaWdnZXJ8fG8udHJpZ2dlci5hcHBseShkLGMpIT09ITEpKXtpZighZSYmIW8ubm9CdWJibGUmJiFuLmlzV2luZG93KGQpKXtmb3IoaT1vLmRlbGVnYXRlVHlwZXx8cSxYLnRlc3QoaStxKXx8KGc9Zy5wYXJlbnROb2RlKTtnO2c9Zy5wYXJlbnROb2RlKXAucHVzaChnKSxoPWc7aD09PShkLm93bmVyRG9jdW1lbnR8fGwpJiZwLnB1c2goaC5kZWZhdWx0Vmlld3x8aC5wYXJlbnRXaW5kb3d8fGEpfWY9MDt3aGlsZSgoZz1wW2YrK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1mPjE/aTpvLmJpbmRUeXBlfHxxLG09KEwuZ2V0KGcsImV2ZW50cyIpfHx7fSlbYi50eXBlXSYmTC5nZXQoZywiaGFuZGxlIiksbSYmbS5hcHBseShnLGMpLG09ayYmZ1trXSxtJiZtLmFwcGx5JiZuLmFjY2VwdERhdGEoZykmJihiLnJlc3VsdD1tLmFwcGx5KGcsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXEsZXx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8by5fZGVmYXVsdCYmby5fZGVmYXVsdC5hcHBseShwLnBvcCgpLGMpIT09ITF8fCFuLmFjY2VwdERhdGEoZCl8fGsmJm4uaXNGdW5jdGlvbihkW3FdKSYmIW4uaXNXaW5kb3coZCkmJihoPWRba10saCYmKGRba109bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cSxkW3FdKCksbi5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGgmJihkW2tdPWgpKSxiLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe2E9bi5ldmVudC5maXgoYSk7dmFyIGIsYyxlLGYsZyxoPVtdLGk9ZC5jYWxsKGFyZ3VtZW50cyksaj0oTC5nZXQodGhpcywiZXZlbnRzIil8fHt9KVthLnR5cGVdfHxbXSxrPW4uZXZlbnQuc3BlY2lhbFthLnR5cGVdfHx7fTtpZihpWzBdPWEsYS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFrLnByZURpc3BhdGNofHxrLnByZURpc3BhdGNoLmNhbGwodGhpcyxhKSE9PSExKXtoPW4uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsaiksYj0wO3doaWxlKChmPWhbYisrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2EuY3VycmVudFRhcmdldD1mLmVsZW0sYz0wO3doaWxlKChnPWYuaGFuZGxlcnNbYysrXSkmJiFhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFhLm5hbWVzcGFjZV9yZXx8YS5uYW1lc3BhY2VfcmUudGVzdChnLm5hbWVzcGFjZSkpJiYoYS5oYW5kbGVPYmo9ZyxhLmRhdGE9Zy5kYXRhLGU9KChuLmV2ZW50LnNwZWNpYWxbZy5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGcuaGFuZGxlcikuYXBwbHkoZi5lbGVtLGkpLHZvaWQgMCE9PWUmJihhLnJlc3VsdD1lKT09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5wb3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXSxoPWIuZGVsZWdhdGVDb3VudCxpPWEudGFyZ2V0O2lmKGgmJmkubm9kZVR5cGUmJighYS5idXR0b258fCJjbGljayIhPT1hLnR5cGUpKWZvcig7aSE9PXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoaS5kaXNhYmxlZCE9PSEwfHwiY2xpY2siIT09YS50eXBlKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+PTA6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1hLndoaWNoJiYoYS53aGljaD1udWxsIT1iLmNoYXJDb2RlP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1iLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS5wYWdlWCYmbnVsbCE9Yi5jbGllbnRYJiYoYz1hLnRhcmdldC5vd25lckRvY3VtZW50fHxsLGQ9Yy5kb2N1bWVudEVsZW1lbnQsZT1jLmJvZHksYS5wYWdlWD1iLmNsaWVudFgrKGQmJmQuc2Nyb2xsTGVmdHx8ZSYmZS5zY3JvbGxMZWZ0fHwwKS0oZCYmZC5jbGllbnRMZWZ0fHxlJiZlLmNsaWVudExlZnR8fDApLGEucGFnZVk9Yi5jbGllbnRZKyhkJiZkLnNjcm9sbFRvcHx8ZSYmZS5zY3JvbGxUb3B8fDApLShkJiZkLmNsaWVudFRvcHx8ZSYmZS5jbGllbnRUb3B8fDApKSxhLndoaWNofHx2b2lkIDA9PT1mfHwoYS53aGljaD0xJmY/MToyJmY/Mzo0JmY/MjowKSxhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGQsZT1hLnR5cGUsZj1hLGc9dGhpcy5maXhIb29rc1tlXTtnfHwodGhpcy5maXhIb29rc1tlXT1nPVcudGVzdChlKT90aGlzLm1vdXNlSG9va3M6Vi50ZXN0KGUpP3RoaXMua2V5SG9va3M6e30pLGQ9Zy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChnLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZiksYj1kLmxlbmd0aDt3aGlsZShiLS0pYz1kW2JdLGFbY109ZltjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1sKSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxnLmZpbHRlcj9nLmZpbHRlcihhLGYpOmF9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzIT09XygpJiZ0aGlzLmZvY3VzPyh0aGlzLmZvY3VzKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzPT09XygpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJm4ubm9kZU5hbWUodGhpcywiaW5wdXQiKT8odGhpcy5jbGljaygpLCExKTp2b2lkIDB9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmYS5vcmlnaW5hbEV2ZW50JiYoYS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWEucmVzdWx0KX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmV4dGVuZChuZXcgbi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/bi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpuLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxuLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSxuLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT9aOiQpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOiQsaXNQcm9wYWdhdGlvblN0b3BwZWQ6JCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDokLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPVosYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1aLGEmJmEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1aLGEmJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxuLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKGEsYil7bi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbi5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksay5mb2N1c2luQnViYmxlc3x8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSwhMCl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1MLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLEwuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9TC5hY2Nlc3MoZCxiKS0xO2U/TC5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxMLnJlbW92ZShkLGIpKX19fSksbi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZztpZigib2JqZWN0Ij09dHlwZW9mIGEpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9Y3x8YixiPXZvaWQgMCk7Zm9yKGcgaW4gYSl0aGlzLm9uKGcsYixjLGFbZ10sZSk7cmV0dXJuIHRoaXN9aWYobnVsbD09YyYmbnVsbD09ZD8oZD1iLGM9Yj12b2lkIDApOm51bGw9PWQmJigic3RyaW5nIj09dHlwZW9mIGI/KGQ9YyxjPXZvaWQgMCk6KGQ9YyxjPWIsYj12b2lkIDApKSxkPT09ITEpZD0kO2Vsc2UgaWYoIWQpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1lJiYoZj1kLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4oKS5vZmYoYSksZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQuZ3VpZD1mLmd1aWR8fChmLmd1aWQ9bi5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LmFkZCh0aGlzLGEsZCxjLGIpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIGQ9YS5oYW5kbGVPYmosbihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZC5uYW1lc3BhY2U/ZC5vcmlnVHlwZSsiLiIrZC5uYW1lc3BhY2U6ZC5vcmlnVHlwZSxkLnNlbGVjdG9yLGQuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGEpe2ZvcihlIGluIGEpdGhpcy5vZmYoZSxiLGFbZV0pO3JldHVybiB0aGlzfXJldHVybihiPT09ITF8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGM9YixiPXZvaWQgMCksYz09PSExJiYoYz0kKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP24uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO3ZhciBhYj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJiPS88KFtcdzpdKykvLGNiPS88fCYjP1x3KzsvLGRiPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksZWI9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksZmI9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLGdiPS9edHJ1ZVwvKC4qKS8saGI9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLGliPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07aWIub3B0Z3JvdXA9aWIub3B0aW9uLGliLnRib2R5PWliLnRmb290PWliLmNvbGdyb3VwPWliLmNhcHRpb249aWIudGhlYWQsaWIudGg9aWIudGQ7ZnVuY3Rpb24gamIoYSxiKXtyZXR1cm4gbi5ub2RlTmFtZShhLCJ0YWJsZSIpJiZuLm5vZGVOYW1lKDExIT09Yi5ub2RlVHlwZT9iOmIuZmlyc3RDaGlsZCwidHIiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIGtiKGEpe3JldHVybiBhLnR5cGU9KG51bGwhPT1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gbGIoYSl7dmFyIGI9Z2IuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBtYihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKylMLnNldChhW2NdLCJnbG9iYWxFdmFsIiwhYnx8TC5nZXQoYltjXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBuYihhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGo7aWYoMT09PWIubm9kZVR5cGUpe2lmKEwuaGFzRGF0YShhKSYmKGY9TC5hY2Nlc3MoYSksZz1MLnNldChiLGYpLGo9Zi5ldmVudHMpKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGUgaW4gailmb3IoYz0wLGQ9altlXS5sZW5ndGg7ZD5jO2MrKyluLmV2ZW50LmFkZChiLGUsaltlXVtjXSl9TS5oYXNEYXRhKGEpJiYoaD1NLmFjY2VzcyhhKSxpPW4uZXh0ZW5kKHt9LGgpLE0uc2V0KGIsaSkpfX1mdW5jdGlvbiBvYihhLGIpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOmEucXVlcnlTZWxlY3RvckFsbD9hLnF1ZXJ5U2VsZWN0b3JBbGwoYnx8IioiKTpbXTtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmbi5ub2RlTmFtZShhLGIpP24ubWVyZ2UoW2FdLGMpOmN9ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJlQudGVzdChhLnR5cGUpP2IuY2hlY2tlZD1hLmNoZWNrZWQ6KCJpbnB1dCI9PT1jfHwidGV4dGFyZWEiPT09YykmJihiLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZSl9bi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoay5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8bi5pc1hNTERvYyhhKSkpZm9yKGc9b2IoaCksZj1vYihhKSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKXBiKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG9iKGEpLGc9Z3x8b2IoaCksZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKyluYihmW2RdLGdbZF0pO2Vsc2UgbmIoYSxoKTtyZXR1cm4gZz1vYihoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZtYihnLCFpJiZvYihhLCJzY3JpcHQiKSksaH0sYnVpbGRGcmFnbWVudDpmdW5jdGlvbihhLGIsYyxkKXtmb3IodmFyIGUsZixnLGgsaSxqLGs9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbD1bXSxtPTAsbz1hLmxlbmd0aDtvPm07bSsrKWlmKGU9YVttXSxlfHwwPT09ZSlpZigib2JqZWN0Ij09PW4udHlwZShlKSluLm1lcmdlKGwsZS5ub2RlVHlwZT9bZV06ZSk7ZWxzZSBpZihjYi50ZXN0KGUpKXtmPWZ8fGsuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksZz0oYmIuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxoPWliW2ddfHxpYi5fZGVmYXVsdCxmLmlubmVySFRNTD1oWzFdK2UucmVwbGFjZShhYiwiPCQxPjwvJDI+IikraFsyXSxqPWhbMF07d2hpbGUoai0tKWY9Zi5sYXN0Q2hpbGQ7bi5tZXJnZShsLGYuY2hpbGROb2RlcyksZj1rLmZpcnN0Q2hpbGQsZi50ZXh0Q29udGVudD0iIn1lbHNlIGwucHVzaChiLmNyZWF0ZVRleHROb2RlKGUpKTtrLnRleHRDb250ZW50PSIiLG09MDt3aGlsZShlPWxbbSsrXSlpZigoIWR8fC0xPT09bi5pbkFycmF5KGUsZCkpJiYoaT1uLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKSxmPW9iKGsuYXBwZW5kQ2hpbGQoZSksInNjcmlwdCIpLGkmJm1iKGYpLGMpKXtqPTA7d2hpbGUoZT1mW2orK10pZmIudGVzdChlLnR5cGV8fCIiKSYmYy5wdXNoKGUpfXJldHVybiBrfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZCxlLGY9bi5ldmVudC5zcGVjaWFsLGc9MDt2b2lkIDAhPT0oYz1hW2ddKTtnKyspe2lmKG4uYWNjZXB0RGF0YShjKSYmKGU9Y1tMLmV4cGFuZG9dLGUmJihiPUwuY2FjaGVbZV0pKSl7aWYoYi5ldmVudHMpZm9yKGQgaW4gYi5ldmVudHMpZltkXT9uLmV2ZW50LnJlbW92ZShjLGQpOm4ucmVtb3ZlRXZlbnQoYyxkLGIuaGFuZGxlKTtMLmNhY2hlW2VdJiZkZWxldGUgTC5jYWNoZVtlXX1kZWxldGUgTS5jYWNoZVtjW00uZXhwYW5kb11dfX19KSxuLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP24udGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpeygxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSkmJih0aGlzLnRleHRDb250ZW50PWEpfSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1qYih0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPWpiKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9uLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bi5jbGVhbkRhdGEob2IoYykpLGMucGFyZW50Tm9kZSYmKGImJm4uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZtYihvYihjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKykxPT09YS5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKG9iKGEsITEpKSxhLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1udWxsPT1hPyExOmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBuLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIWRiLnRlc3QoYSkmJiFpYlsoYmIuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKGFiLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihuLmNsZWFuRGF0YShvYihiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbi5jbGVhbkRhdGEob2IodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG09dGhpcyxvPWwtMSxwPWFbMF0scT1uLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJmViLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1tLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoYz1uLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksZD1jLmZpcnN0Q2hpbGQsMT09PWMuY2hpbGROb2Rlcy5sZW5ndGgmJihjPWQpLGQpKXtmb3IoZj1uLm1hcChvYihjLCJzY3JpcHQiKSxrYiksZz1mLmxlbmd0aDtsPmo7aisrKWg9YyxqIT09byYmKGg9bi5jbG9uZShoLCEwLCEwKSxnJiZuLm1lcmdlKGYsb2IoaCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxoLGopO2lmKGcpZm9yKGk9ZltmLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGYsbGIpLGo9MDtnPmo7aisrKWg9ZltqXSxmYi50ZXN0KGgudHlwZXx8IiIpJiYhTC5hY2Nlc3MoaCwiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGksaCkmJihoLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGguc3JjKTpuLmdsb2JhbEV2YWwoaC50ZXh0Q29udGVudC5yZXBsYWNlKGhiLCIiKSkpfXJldHVybiB0aGlzfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD1bXSxlPW4oYSksZz1lLmxlbmd0aC0xLGg9MDtnPj1oO2grKyljPWg9PT1nP3RoaXM6dGhpcy5jbG9uZSghMCksbihlW2hdKVtiXShjKSxmLmFwcGx5KGQsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQpfX0pO3ZhciBxYixyYj17fTtmdW5jdGlvbiBzYihiLGMpe3ZhciBkLGU9bihjLmNyZWF0ZUVsZW1lbnQoYikpLmFwcGVuZFRvKGMuYm9keSksZj1hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlJiYoZD1hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGVbMF0pKT9kLmRpc3BsYXk6bi5jc3MoZVswXSwiZGlzcGxheSIpO3JldHVybiBlLmRldGFjaCgpLGZ9ZnVuY3Rpb24gdGIoYSl7dmFyIGI9bCxjPXJiW2FdO3JldHVybiBjfHwoYz1zYihhLGIpLCJub25lIiE9PWMmJmN8fChxYj0ocWJ8fG4oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9cWJbMF0uY29udGVudERvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1zYihhLGIpLHFiLmRldGFjaCgpKSxyYlthXT1jKSxjfXZhciB1Yj0vXm1hcmdpbi8sdmI9bmV3IFJlZ0V4cCgiXigiK1ErIikoPyFweClbYS16JV0rJCIsImkiKSx3Yj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKX07ZnVuY3Rpb24geGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHx3YihhKSxjJiYoZz1jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl0pLGMmJigiIiE9PWd8fG4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1uLnN0eWxlKGEsYikpLHZiLnRlc3QoZykmJnViLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMCE9PWc/ZysiIjpnfWZ1bmN0aW9uIHliKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBhKCk/dm9pZCBkZWxldGUgdGhpcy5nZXQ6KHRoaXMuZ2V0PWIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSFmdW5jdGlvbigpe3ZhciBiLGMsZD1sLmRvY3VtZW50RWxlbWVudCxlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZj1sLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKGYuc3R5bGUpe2Yuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixmLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWYuc3R5bGUuYmFja2dyb3VuZENsaXAsZS5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweDtwb3NpdGlvbjphYnNvbHV0ZSIsZS5hcHBlbmRDaGlsZChmKTtmdW5jdGlvbiBnKCl7Zi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjRweDtwb3NpdGlvbjphYnNvbHV0ZSIsZi5pbm5lckhUTUw9IiIsZC5hcHBlbmRDaGlsZChlKTt2YXIgZz1hLmdldENvbXB1dGVkU3R5bGUoZixudWxsKTtiPSIxJSIhPT1nLnRvcCxjPSI0cHgiPT09Zy53aWR0aCxkLnJlbW92ZUNoaWxkKGUpfWEuZ2V0Q29tcHV0ZWRTdHlsZSYmbi5leHRlbmQoayx7cGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBnKCksYn0sYm94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YyYmZygpLGN9LHJlbGlhYmxlTWFyZ2luUmlnaHQ6ZnVuY3Rpb24oKXt2YXIgYixjPWYuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmV0dXJuIGMuc3R5bGUuY3NzVGV4dD1mLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsYy5zdHlsZS5tYXJnaW5SaWdodD1jLnN0eWxlLndpZHRoPSIwIixmLnN0eWxlLndpZHRoPSIxcHgiLGQuYXBwZW5kQ2hpbGQoZSksYj0hcGFyc2VGbG9hdChhLmdldENvbXB1dGVkU3R5bGUoYyxudWxsKS5tYXJnaW5SaWdodCksZC5yZW1vdmVDaGlsZChlKSxifX0pfX0oKSxuLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciB6Yj0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sQWI9bmV3IFJlZ0V4cCgiXigiK1ErIikoLiopJCIsImkiKSxCYj1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1ErIikiLCJpIiksQ2I9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LERiPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxFYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIEZiKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGQ9YixlPUViLmxlbmd0aDt3aGlsZShlLS0paWYoYj1FYltlXStjLGIgaW4gYSlyZXR1cm4gYjtyZXR1cm4gZH1mdW5jdGlvbiBHYihhLGIsYyl7dmFyIGQ9QWIuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8InB4Iik6Yn1mdW5jdGlvbiBIYihhLGIsYyxkLGUpe2Zvcih2YXIgZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MCxnPTA7ND5mO2YrPTIpIm1hcmdpbiI9PT1jJiYoZys9bi5jc3MoYSxjK1JbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1uLmNzcyhhLCJwYWRkaW5nIitSW2ZdLCEwLGUpKSwibWFyZ2luIiE9PWMmJihnLT1uLmNzcyhhLCJib3JkZXIiK1JbZl0rIldpZHRoIiwhMCxlKSkpOihnKz1uLmNzcyhhLCJwYWRkaW5nIitSW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1uLmNzcyhhLCJib3JkZXIiK1JbZl0rIldpZHRoIiwhMCxlKSkpO3JldHVybiBnfWZ1bmN0aW9uIEliKGEsYixjKXt2YXIgZD0hMCxlPSJ3aWR0aCI9PT1iP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZj13YihhKSxnPSJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT14YihhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLHZiLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK0hiKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1mdW5jdGlvbiBKYihhLGIpe2Zvcih2YXIgYyxkLGUsZj1bXSxnPTAsaD1hLmxlbmd0aDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoZltnXT1MLmdldChkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlMoZCkmJihmW2ddPUwuYWNjZXNzKGQsIm9sZGRpc3BsYXkiLHRiKGQubm9kZU5hbWUpKSkpOihlPVMoZCksIm5vbmUiPT09YyYmZXx8TC5zZXQoZCwib2xkZGlzcGxheSIsZT9jOm4uY3NzKGQsImRpc3BsYXkiKSkpKTtmb3IoZz0wO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihiJiYibm9uZSIhPT1kLnN0eWxlLmRpc3BsYXkmJiIiIT09ZC5zdHlsZS5kaXNwbGF5fHwoZC5zdHlsZS5kaXNwbGF5PWI/ZltnXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGF9bi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz14YihhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2NvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYiksaT1hLnN0eWxlO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPUZiKGksaCkpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9QmIuZXhlYyhjKSkmJihjPShlWzFdKzEpKmVbMl0rcGFyc2VGbG9hdChuLmNzcyhhLGIpKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiIT09Znx8bi5jc3NOdW1iZXJbaF18fChjKz0icHgiKSxrLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1jfHwwIT09Yi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChpW2JdPSJpbmhlcml0IiksZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpfHwoaVtiXT1jKSksdm9pZCAwKX19LGNzczpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKTtyZXR1cm4gYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1GYihhLnN0eWxlLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1lJiYoZT14YihhLGIsZCkpLCJub3JtYWwiPT09ZSYmYiBpbiBEYiYmKGU9RGJbYl0pLCIiPT09Y3x8Yz8oZj1wYXJzZUZsb2F0KGUpLGM9PT0hMHx8bi5pc051bWVyaWMoZik/Znx8MDplKTplfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP3piLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/bi5zd2FwKGEsQ2IsZnVuY3Rpb24oKXtyZXR1cm4gSWIoYSxiLGQpfSk6SWIoYSxiLGQpOnZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1kJiZ3YihhKTtyZXR1cm4gR2IoYSxjLGQ/SGIoYSxiLGQsImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbi5jc3NIb29rcy5tYXJnaW5SaWdodD15YihrLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9uLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0seGIsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT17fSxmPSJzdHJpbmciPT10eXBlb2YgYz9jLnNwbGl0KCIgIik6W2NdOzQ+ZDtkKyspZVthK1JbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sdWIudGVzdChhKXx8KG4uY3NzSG9va3NbYStiXS5zZXQ9R2IpfSksbi5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYobi5pc0FycmF5KGIpKXtmb3IoZD13YihhKSxlPWIubGVuZ3RoO2U+ZztnKyspZltiW2ddXT1uLmNzcyhhLGJbZ10sITEsZCk7cmV0dXJuIGZ9cmV0dXJuIHZvaWQgMCE9PWM/bi5zdHlsZShhLGIsYyk6bi5jc3MoYSxiKX0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gSmIodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gSmIodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uIEtiKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBLYi5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49S2IsS2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpLYixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPUtiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpLYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1LYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj10aGlzLm9wdGlvbnMuZHVyYXRpb24/bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpLYi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxLYi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9S2IucHJvdG90eXBlLEtiLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV18fG4uY3NzSG9va3NbYS5wcm9wXSk/bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sS2IucHJvcEhvb2tzLnNjcm9sbFRvcD1LYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxuLmZ4PUtiLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgTGIsTWIsTmI9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLE9iPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitRKyIpKFthLXolXSopJCIsImkiKSxQYj0vcXVldWVIb29rcyQvLFFiPVtWYl0sUmI9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9T2IuZXhlYyhiKSxmPWUmJmVbM118fChuLmNzc051bWJlclthXT8iIjoicHgiKSxnPShuLmNzc051bWJlclthXXx8InB4IiE9PWYmJitkKSYmT2IuZXhlYyhuLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8Ii41IixnLz1oLG4uc3R5bGUoYy5lbGVtLGEsZytmKTt3aGlsZShoIT09KGg9Yy5jdXIoKS9kKSYmMSE9PWgmJi0taSl9cmV0dXJuIGUmJihnPWMuc3RhcnQ9K2d8fCtkfHwwLGMudW5pdD1mLGMuZW5kPWVbMV0/ZysoZVsxXSsxKSplWzJdOitlWzJdKSxjfV19O2Z1bmN0aW9uIFNiKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtMYj12b2lkIDB9KSxMYj1uLm5vdygpfWZ1bmN0aW9uIFRiKGEsYil7dmFyIGMsZD0wLGU9e2hlaWdodDphfTtmb3IoYj1iPzE6MDs0PmQ7ZCs9Mi1iKWM9UltkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIFViKGEsYixjKXtmb3IodmFyIGQsZT0oUmJbYl18fFtdKS5jb25jYXQoUmJbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gVmIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD10aGlzLG09e30sbz1hLnN0eWxlLHA9YS5ub2RlVHlwZSYmUyhhKSxxPUwuZ2V0KGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW4uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG4ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W28ub3ZlcmZsb3csby5vdmVyZmxvd1gsby5vdmVyZmxvd1ldLGo9bi5jc3MoYSwiZGlzcGxheSIpLGs9Im5vbmUiPT09aj9MLmdldChhLCJvbGRkaXNwbGF5Iil8fHRiKGEubm9kZU5hbWUpOmosImlubGluZSI9PT1rJiYibm9uZSI9PT1uLmNzcyhhLCJmbG9hdCIpJiYoby5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKG8ub3ZlcmZsb3c9ImhpZGRlbiIsbC5hbHdheXMoZnVuY3Rpb24oKXtvLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0sby5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxvLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLE5iLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocD8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXF8fHZvaWQgMD09PXFbZF0pY29udGludWU7cD0hMH1tW2RdPXEmJnFbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChtKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP3RiKGEubm9kZU5hbWUpOmopJiYoby5kaXNwbGF5PWopO2Vsc2V7cT8iaGlkZGVuImluIHEmJihwPXEuaGlkZGVuKTpxPUwuYWNjZXNzKGEsImZ4c2hvdyIse30pLGYmJihxLmhpZGRlbj0hcCkscD9uKGEpLnNob3coKTpsLmRvbmUoZnVuY3Rpb24oKXtuKGEpLmhpZGUoKX0pLGwuZG9uZShmdW5jdGlvbigpe3ZhciBiO0wucmVtb3ZlKGEsImZ4c2hvdyIpO2ZvcihiIGluIG0pbi5zdHlsZShhLGIsbVtiXSl9KTtmb3IoZCBpbiBtKWc9VWIocD9xW2RdOjAsZCxsKSxkIGluIHF8fChxW2RdPWcuc3RhcnQscCYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBXYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW4uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbi5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1uLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIFhiKGEsYixjKXt2YXIgZCxlLGY9MCxnPVFiLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPUxifHxTYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6TGJ8fFNiKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1uLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihXYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9UWJbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBuLm1hcChrLFViLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQoWGIse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sUmJbY109UmJbY118fFtdLFJiW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/UWIudW5zaGlmdChhKTpRYi5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe24uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG4uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFMpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uaXNFbXB0eU9iamVjdChhKSxmPW4uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1YYih0aGlzLG4uZXh0ZW5kKHt9LGEpLGYpOyhlfHxMLmdldCh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9TC5nZXQodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmUGIudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1MLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bi50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG4ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZm5bYl07bi5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKFRiKGIsITApLGEsZCxlKX19KSxuLmVhY2goe3NsaWRlRG93bjpUYigic2hvdyIpLHNsaWRlVXA6VGIoImhpZGUiKSxzbGlkZVRvZ2dsZTpUYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbi50aW1lcnM9W10sbi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9bi50aW1lcnM7Zm9yKExiPW4ubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8bi5meC5zdG9wKCksTGI9dm9pZCAwfSxuLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe24udGltZXJzLnB1c2goYSksYSgpP24uZnguc3RhcnQoKTpuLnRpbWVycy5wb3AoKX0sbi5meC5pbnRlcnZhbD0xMyxuLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7TWJ8fChNYj1zZXRJbnRlcnZhbChuLmZ4LnRpY2ssbi5meC5pbnRlcnZhbCkpfSxuLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKE1iKSxNYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bi5meD9uLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhPWwuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPWwuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksYz1iLmFwcGVuZENoaWxkKGwuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2EudHlwZT0iY2hlY2tib3giLGsuY2hlY2tPbj0iIiE9PWEudmFsdWUsay5vcHRTZWxlY3RlZD1jLnNlbGVjdGVkLGIuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hYy5kaXNhYmxlZCxhPWwuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixrLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgWWIsWmIsJGI9bi5leHByLmF0dHJIYW5kbGU7bi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSih0aGlzLG4uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09VT9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP1piOlliKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSkKfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEUpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYykmJihhW2RdPSExKSxhLnJlbW92ZUF0dHJpYnV0ZShjKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZighay5yYWRpb1ZhbHVlJiYicmFkaW8iPT09YiYmbi5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO3JldHVybiBhLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9YyksYn19fX19KSxaYj17c2V0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj09PSExP24ucmVtb3ZlQXR0cihhLGMpOmEuc2V0QXR0cmlidXRlKGMsYyksY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPSRiW2JdfHxuLmZpbmQuYXR0cjskYltiXT1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZjtyZXR1cm4gZHx8KGY9JGJbYl0sJGJbYl09ZSxlPW51bGwhPWMoYSxiLGQpP2IudG9Mb3dlckNhc2UoKTpudWxsLCRiW2JdPWYpLGV9fSk7dmFyIF9iPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2k7bi5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSih0aGlzLG4ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbbi5wcm9wRml4W2FdfHxhXX0pfX0pLG4uZXh0ZW5kKHtwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0scHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGc9YS5ub2RlVHlwZTtpZihhJiYzIT09ZyYmOCE9PWcmJjIhPT1nKXJldHVybiBmPTEhPT1nfHwhbi5pc1hNTERvYyhhKSxmJiYoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfHxfYi50ZXN0KGEubm9kZU5hbWUpfHxhLmhyZWY/YS50YWJJbmRleDotMX19fX0pLGsub3B0U2VsZWN0ZWR8fChuLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO3ZhciBhYz0vW1x0XHJcblxmXS9nO24uZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaD0ic3RyaW5nIj09dHlwZW9mIGEmJmEsaT0wLGo9dGhpcy5sZW5ndGg7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihoKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2o+aTtpKyspaWYoYz10aGlzW2ldLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZShhYywiICIpOiIgIikpe2Y9MDt3aGlsZShlPWJbZisrXSlkLmluZGV4T2YoIiAiK2UrIiAiKTwwJiYoZCs9ZSsiICIpO2c9bi50cmltKGQpLGMuY2xhc3NOYW1lIT09ZyYmKGMuY2xhc3NOYW1lPWcpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaD0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBhJiZhLGk9MCxqPXRoaXMubGVuZ3RoO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoaClmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtqPmk7aSsrKWlmKGM9dGhpc1tpXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoYWMsIiAiKToiIikpe2Y9MDt3aGlsZShlPWJbZisrXSl3aGlsZShkLmluZGV4T2YoIiAiK2UrIiAiKT49MClkPWQucmVwbGFjZSgiICIrZSsiICIsIiAiKTtnPWE/bi50cmltKGQpOiIiLGMuY2xhc3NOYW1lIT09ZyYmKGMuY2xhc3NOYW1lPWcpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhO3JldHVybiJib29sZWFuIj09dHlwZW9mIGImJiJzdHJpbmciPT09Yz9iP3RoaXMuYWRkQ2xhc3MoYSk6dGhpcy5yZW1vdmVDbGFzcyhhKTp0aGlzLmVhY2gobi5pc0Z1bmN0aW9uKGEpP2Z1bmN0aW9uKGMpe24odGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX06ZnVuY3Rpb24oKXtpZigic3RyaW5nIj09PWMpe3ZhciBiLGQ9MCxlPW4odGhpcyksZj1hLm1hdGNoKEUpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlKGM9PT1VfHwiYm9vbGVhbiI9PT1jKSYmKHRoaXMuY2xhc3NOYW1lJiZMLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpMLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Q+YztjKyspaWYoMT09PXRoaXNbY10ubm9kZVR5cGUmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKGFjLCIgIikuaW5kZXhPZihiKT49MClyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYmM9L1xyL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKGJjLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLCEoIWMuc2VsZWN0ZWQmJmkhPT1lfHwoay5vcHREaXNhYmxlZD9jLmRpc2FibGVkOm51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGMucGFyZW50Tm9kZS5kaXNhYmxlZCYmbi5ub2RlTmFtZShjLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihiPW4oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1uLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlkPWVbZ10sKGQuc2VsZWN0ZWQ9bi5pbkFycmF5KGQudmFsdWUsZik+PTApJiYoYz0hMCk7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGZ9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT49MDp2b2lkIDB9fSxrLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSksbi5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9fSksbi5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KTt2YXIgY2M9bi5ub3coKSxkYz0vXD8vO24ucGFyc2VKU09OPWZ1bmN0aW9uKGEpe3JldHVybiBKU09OLnBhcnNlKGErIiIpfSxuLnBhcnNlWE1MPWZ1bmN0aW9uKGEpe3ZhciBiLGM7aWYoIWF8fCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7Yz1uZXcgRE9NUGFyc2VyLGI9Yy5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKX1jYXRjaChkKXtiPXZvaWQgMH1yZXR1cm4oIWJ8fGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmbi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYSksYn07dmFyIGVjLGZjLGdjPS8jLiokLyxoYz0vKFs/Jl0pXz1bXiZdKi8saWM9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxqYz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxrYz0vXig/OkdFVHxIRUFEKSQvLGxjPS9eXC9cLy8sbWM9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sbmM9e30sb2M9e30scGM9IiovIi5jb25jYXQoIioiKTt0cnl7ZmM9bG9jYXRpb24uaHJlZn1jYXRjaChxYyl7ZmM9bC5jcmVhdGVFbGVtZW50KCJhIiksZmMuaHJlZj0iIixmYz1mYy5ocmVmfWVjPW1jLmV4ZWMoZmMudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHJjKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZFswXT8oZD1kLnNsaWNlKDEpfHwiKiIsKGFbZF09YVtkXXx8W10pLnVuc2hpZnQoYykpOihhW2RdPWFbZF18fFtdKS5wdXNoKGMpfX1mdW5jdGlvbiBzYyhhLGIsYyxkKXt2YXIgZT17fSxmPWE9PT1vYztmdW5jdGlvbiBnKGgpe3ZhciBpO3JldHVybiBlW2hdPSEwLG4uZWFjaChhW2hdfHxbXSxmdW5jdGlvbihhLGgpe3ZhciBqPWgoYixjLGQpO3JldHVybiJzdHJpbmciIT10eXBlb2Yganx8Znx8ZVtqXT9mPyEoaT1qKTp2b2lkIDA6KGIuZGF0YVR5cGVzLnVuc2hpZnQoaiksZyhqKSwhMSl9KSxpfXJldHVybiBnKGIuZGF0YVR5cGVzWzBdKXx8IWVbIioiXSYmZygiKiIpfWZ1bmN0aW9uIHRjKGEsYil7dmFyIGMsZCxlPW4uYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoYyBpbiBiKXZvaWQgMCE9PWJbY10mJigoZVtjXT9hOmR8fChkPXt9KSlbY109YltjXSk7cmV0dXJuIGQmJm4uZXh0ZW5kKCEwLGEsZCksYX1mdW5jdGlvbiB1YyhhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmNvbnRlbnRzLGk9YS5kYXRhVHlwZXM7d2hpbGUoIioiPT09aVswXSlpLnNoaWZ0KCksdm9pZCAwPT09ZCYmKGQ9YS5taW1lVHlwZXx8Yi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKGQpZm9yKGUgaW4gaClpZihoW2VdJiZoW2VdLnRlc3QoZCkpe2kudW5zaGlmdChlKTticmVha31pZihpWzBdaW4gYylmPWlbMF07ZWxzZXtmb3IoZSBpbiBjKXtpZighaVswXXx8YS5jb252ZXJ0ZXJzW2UrIiAiK2lbMF1dKXtmPWU7YnJlYWt9Z3x8KGc9ZSl9Zj1mfHxnfXJldHVybiBmPyhmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl0pOnZvaWQgMH1mdW5jdGlvbiB2YyhhLGIsYyxkKXt2YXIgZSxmLGcsaCxpLGo9e30saz1hLmRhdGFUeXBlcy5zbGljZSgpO2lmKGtbMV0pZm9yKGcgaW4gYS5jb252ZXJ0ZXJzKWpbZy50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbZ107Zj1rLnNoaWZ0KCk7d2hpbGUoZilpZihhLnJlc3BvbnNlRmllbGRzW2ZdJiYoY1thLnJlc3BvbnNlRmllbGRzW2ZdXT1iKSwhaSYmZCYmYS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSksaT1mLGY9ay5zaGlmdCgpKWlmKCIqIj09PWYpZj1pO2Vsc2UgaWYoIioiIT09aSYmaSE9PWYpe2lmKGc9altpKyIgIitmXXx8alsiKiAiK2ZdLCFnKWZvcihlIGluIGopaWYoaD1lLnNwbGl0KCIgIiksaFsxXT09PWYmJihnPWpbaSsiICIraFswXV18fGpbIiogIitoWzBdXSkpe2c9PT0hMD9nPWpbZV06altlXSE9PSEwJiYoZj1oWzBdLGsudW5zaGlmdChoWzFdKSk7YnJlYWt9aWYoZyE9PSEwKWlmKGcmJmFbInRocm93cyJdKWI9ZyhiKTtlbHNlIHRyeXtiPWcoYil9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6Zz9sOiJObyBjb252ZXJzaW9uIGZyb20gIitpKyIgdG8gIitmfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmJ9fW4uZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpmYyx0eXBlOiJHRVQiLGlzTG9jYWw6amMudGVzdChlY1sxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpwYyx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOm4ucGFyc2VKU09OLCJ0ZXh0IHhtbCI6bi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/dGModGMoYSxuLmFqYXhTZXR0aW5ncyksYik6dGMobi5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6cmMobmMpLGFqYXhUcmFuc3BvcnQ6cmMob2MpLGFqYXg6ZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGI9Ynx8e307dmFyIGMsZCxlLGYsZyxoLGksaixrPW4uYWpheFNldHVwKHt9LGIpLGw9ay5jb250ZXh0fHxrLG09ay5jb250ZXh0JiYobC5ub2RlVHlwZXx8bC5qcXVlcnkpP24obCk6bi5ldmVudCxvPW4uRGVmZXJyZWQoKSxwPW4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHE9ay5zdGF0dXNDb2RlfHx7fSxyPXt9LHM9e30sdD0wLHU9ImNhbmNlbGVkIix2PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXQpe2lmKCFmKXtmPXt9O3doaWxlKGI9aWMuZXhlYyhlKSlmW2JbMV0udG9Mb3dlckNhc2UoKV09YlsyXX1iPWZbYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09Yj9udWxsOmJ9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dD9lOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHR8fChhPXNbY109c1tjXXx8YSxyW2FdPWIpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHR8fChrLm1pbWVUeXBlPWEpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSlpZigyPnQpZm9yKGIgaW4gYSlxW2JdPVtxW2JdLGFbYl1dO2Vsc2Ugdi5hbHdheXMoYVt2LnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXt2YXIgYj1hfHx1O3JldHVybiBjJiZjLmFib3J0KGIpLHgoMCxiKSx0aGlzfX07aWYoby5wcm9taXNlKHYpLmNvbXBsZXRlPXAuYWRkLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsay51cmw9KChhfHxrLnVybHx8ZmMpKyIiKS5yZXBsYWNlKGdjLCIiKS5yZXBsYWNlKGxjLGVjWzFdKyIvLyIpLGsudHlwZT1iLm1ldGhvZHx8Yi50eXBlfHxrLm1ldGhvZHx8ay50eXBlLGsuZGF0YVR5cGVzPW4udHJpbShrLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goRSl8fFsiIl0sbnVsbD09ay5jcm9zc0RvbWFpbiYmKGg9bWMuZXhlYyhrLnVybC50b0xvd2VyQ2FzZSgpKSxrLmNyb3NzRG9tYWluPSEoIWh8fGhbMV09PT1lY1sxXSYmaFsyXT09PWVjWzJdJiYoaFszXXx8KCJodHRwOiI9PT1oWzFdPyI4MCI6IjQ0MyIpKT09PShlY1szXXx8KCJodHRwOiI9PT1lY1sxXT8iODAiOiI0NDMiKSkpKSxrLmRhdGEmJmsucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygay5kYXRhJiYoay5kYXRhPW4ucGFyYW0oay5kYXRhLGsudHJhZGl0aW9uYWwpKSxzYyhuYyxrLGIsdiksMj09PXQpcmV0dXJuIHY7aT1rLmdsb2JhbCxpJiYwPT09bi5hY3RpdmUrKyYmbi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxrLnR5cGU9ay50eXBlLnRvVXBwZXJDYXNlKCksay5oYXNDb250ZW50PSFrYy50ZXN0KGsudHlwZSksZD1rLnVybCxrLmhhc0NvbnRlbnR8fChrLmRhdGEmJihkPWsudXJsKz0oZGMudGVzdChkKT8iJiI6Ij8iKStrLmRhdGEsZGVsZXRlIGsuZGF0YSksay5jYWNoZT09PSExJiYoay51cmw9aGMudGVzdChkKT9kLnJlcGxhY2UoaGMsIiQxXz0iK2NjKyspOmQrKGRjLnRlc3QoZCk/IiYiOiI/IikrIl89IitjYysrKSksay5pZk1vZGlmaWVkJiYobi5sYXN0TW9kaWZpZWRbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLG4ubGFzdE1vZGlmaWVkW2RdKSxuLmV0YWdbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsbi5ldGFnW2RdKSksKGsuZGF0YSYmay5oYXNDb250ZW50JiZrLmNvbnRlbnRUeXBlIT09ITF8fGIuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsay5jb250ZW50VHlwZSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGsuZGF0YVR5cGVzWzBdJiZrLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dP2suYWNjZXB0c1trLmRhdGFUeXBlc1swXV0rKCIqIiE9PWsuZGF0YVR5cGVzWzBdPyIsICIrcGMrIjsgcT0wLjAxIjoiIik6ay5hY2NlcHRzWyIqIl0pO2ZvcihqIGluIGsuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIoaixrLmhlYWRlcnNbal0pO2lmKGsuYmVmb3JlU2VuZCYmKGsuYmVmb3JlU2VuZC5jYWxsKGwsdixrKT09PSExfHwyPT09dCkpcmV0dXJuIHYuYWJvcnQoKTt1PSJhYm9ydCI7Zm9yKGogaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdltqXShrW2pdKTtpZihjPXNjKG9jLGssYix2KSl7di5yZWFkeVN0YXRlPTEsaSYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW3Ysa10pLGsuYXN5bmMmJmsudGltZW91dD4wJiYoZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxrLnRpbWVvdXQpKTt0cnl7dD0xLGMuc2VuZChyLHgpfWNhdGNoKHcpe2lmKCEoMj50KSl0aHJvdyB3O3goLTEsdyl9fWVsc2UgeCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24geChhLGIsZixoKXt2YXIgaixyLHMsdSx3LHg9YjsyIT09dCYmKHQ9MixnJiZjbGVhclRpbWVvdXQoZyksYz12b2lkIDAsZT1ofHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MCxqPWE+PTIwMCYmMzAwPmF8fDMwND09PWEsZiYmKHU9dWMoayx2LGYpKSx1PXZjKGssdSx2LGopLGo/KGsuaWZNb2RpZmllZCYmKHc9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihuLmxhc3RNb2RpZmllZFtkXT13KSx3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYobi5ldGFnW2RdPXcpKSwyMDQ9PT1hfHwiSEVBRCI9PT1rLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1hP3g9Im5vdG1vZGlmaWVkIjooeD11LnN0YXRlLHI9dS5kYXRhLHM9dS5lcnJvcixqPSFzKSk6KHM9eCwoYXx8IXgpJiYoeD0iZXJyb3IiLDA+YSYmKGE9MCkpKSx2LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0oYnx8eCkrIiIsaj9vLnJlc29sdmVXaXRoKGwsW3IseCx2XSk6by5yZWplY3RXaXRoKGwsW3YseCxzXSksdi5zdGF0dXNDb2RlKHEpLHE9dm9pZCAwLGkmJm0udHJpZ2dlcihqPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3YsayxqP3I6c10pLHAuZmlyZVdpdGgobCxbdix4XSksaSYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixrXSksLS1uLmFjdGl2ZXx8bi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHZ9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmdldChhLGIsYywianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9fSksbi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYil7bltiXT1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gbi5pc0Z1bmN0aW9uKGMpJiYoZT1lfHxkLGQ9YyxjPXZvaWQgMCksbi5hamF4KHt1cmw6YSx0eXBlOmIsZGF0YVR5cGU6ZSxkYXRhOmMsc3VjY2VzczpkfSl9fSksbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk6KHRoaXNbMF0mJihiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG4odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG4uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB9LG4uZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIW4uZXhwci5maWx0ZXJzLmhpZGRlbihhKX07dmFyIHdjPS8lMjAvZyx4Yz0vXFtcXSQvLHljPS9ccj9cbi9nLHpjPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxBYz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gQmMoYSxiLGMsZCl7dmFyIGU7aWYobi5pc0FycmF5KGIpKW4uZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8eGMudGVzdChhKT9kKGEsZSk6QmMoYSsiWyIrKCJvYmplY3QiPT10eXBlb2YgZT9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZihjfHwib2JqZWN0IiE9PW4udHlwZShiKSlkKGEsYik7ZWxzZSBmb3IoZSBpbiBiKUJjKGErIlsiK2UrIl0iLGJbZV0sYyxkKX1uLnBhcmFtPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1uLmlzRnVuY3Rpb24oYik/YigpOm51bGw9PWI/IiI6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07aWYodm9pZCAwPT09YiYmKGI9bi5hamF4U2V0dGluZ3MmJm4uYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxuLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhbi5pc1BsYWluT2JqZWN0KGEpKW4uZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihjIGluIGEpQmMoYyxhW2NdLGIsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2Uod2MsIisiKX0sbi5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9bi5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGE/bi5tYWtlQXJyYXkoYSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBhPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhbih0aGlzKS5pcygiOmRpc2FibGVkIikmJkFjLnRlc3QodGhpcy5ub2RlTmFtZSkmJiF6Yy50ZXN0KGEpJiYodGhpcy5jaGVja2VkfHwhVC50ZXN0KGEpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPW4odGhpcykudmFsKCk7cmV0dXJuIG51bGw9PWM/bnVsbDpuLmlzQXJyYXkoYyk/bi5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHljLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh5YywiXHJcbiIpfX0pLmdldCgpfX0pLG4uYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe319O3ZhciBDYz0wLERjPXt9LEVjPXswOjIwMCwxMjIzOjIwNH0sRmM9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5BY3RpdmVYT2JqZWN0JiZuKGEpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIERjKURjW2FdKCl9KSxrLmNvcnM9ISFGYyYmIndpdGhDcmVkZW50aWFscyJpbiBGYyxrLmFqYXg9RmM9ISFGYyxuLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGsuY29yc3x8RmMmJiFhLmNyb3NzRG9tYWluP3tzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytDYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKWYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0pO2I9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7YiYmKGRlbGV0ZSBEY1tnXSxiPWYub25sb2FkPWYub25lcnJvcj1udWxsLCJhYm9ydCI9PT1hP2YuYWJvcnQoKToiZXJyb3IiPT09YT9kKGYuc3RhdHVzLGYuc3RhdHVzVGV4dCk6ZChFY1tmLnN0YXR1c118fGYuc3RhdHVzLGYuc3RhdHVzVGV4dCwic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0P3t0ZXh0OmYucmVzcG9uc2VUZXh0fTp2b2lkIDAsZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sZi5vbmxvYWQ9YigpLGYub25lcnJvcj1iKCJlcnJvciIpLGI9RGNbZ109YigiYWJvcnQiKTt0cnl7Zi5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChoKXtpZihiKXRocm93IGh9fSxhYm9ydDpmdW5jdGlvbigpe2ImJmIoKX19OnZvaWQgMH0pLG4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ2xvYmFsRXZhbChhKSxhfX19KSxuLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksbi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPW4oIjxzY3JpcHQ+IikucHJvcCh7YXN5bmM6ITAsY2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZSgiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGwuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgR2M9W10sSGM9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9R2MucG9wKCl8fG4uZXhwYW5kbysiXyIrY2MrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKEhjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmSGMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKEhjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShkYy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssR2MucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGw7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgSWM9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZJYylyZXR1cm4gSWMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bi50cmltKGEuc2xpY2UoaCkpLGE9YS5zbGljZSgwLGgpKSxuLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZT0iUE9TVCIpLGcubGVuZ3RoPjAmJm4uYWpheCh7dXJsOmEsdHlwZTplLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxmfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxuLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbi5ncmVwKG4udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgSmM9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gS2MoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZSYmYS5kZWZhdWx0Vmlld31uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiYoZitpKS5pbmRleE9mKCJhdXRvIik+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXRoaXNbMF0sZT17dG9wOjAsbGVmdDowfSxmPWQmJmQub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixkKT8odHlwZW9mIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09VSYmKGU9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1LYyhmKSx7dG9wOmUudG9wK2MucGFnZVlPZmZzZXQtYi5jbGllbnRUb3AsbGVmdDplLmxlZnQrYy5wYWdlWE9mZnNldC1iLmNsaWVudExlZnR9KTplfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PW4uY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLG4ubm9kZU5hbWUoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkLnRvcCs9bi5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxkLmxlZnQrPW4uY3NzKGFbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOmIudG9wLWQudG9wLW4uY3NzKGMsIm1hcmdpblRvcCIsITApLGxlZnQ6Yi5sZWZ0LWQubGVmdC1uLmNzcyhjLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fEpjO3doaWxlKGEmJiFuLm5vZGVOYW1lKGEsImh0bWwiKSYmInN0YXRpYyI9PT1uLmNzcyhhLCJwb3NpdGlvbiIpKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF8fEpjfSl9fSksbi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9InBhZ2VZT2Zmc2V0Ij09PWM7bi5mbltiXT1mdW5jdGlvbihlKXtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsZSxmKXt2YXIgZz1LYyhiKTtyZXR1cm4gdm9pZCAwPT09Zj9nP2dbY106YltlXTp2b2lkKGc/Zy5zY3JvbGxUbyhkP2EucGFnZVhPZmZzZXQ6ZixkP2Y6YS5wYWdlWU9mZnNldCk6YltlXT1mKX0sYixlLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT15YihrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz14YihhLGIpLHZiLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXtuLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbi5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9uLmNzcyhiLGMsZyk6bi5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxuLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG4uZm4uYW5kU2VsZj1uLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG59KTt2YXIgTGM9YS5qUXVlcnksTWM9YS4kO3JldHVybiBuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW4mJihhLiQ9TWMpLGImJmEualF1ZXJ5PT09biYmKGEualF1ZXJ5PUxjKSxufSx0eXBlb2YgYj09PVUmJihhLmpRdWVyeT1hLiQ9biksbn0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1qcXVlcnkubWluLm1hcA=="},{"meta":{"name":"jquery.scrollTo.min.js","url":"http://cdn.staticfile.org/jquery-scrollTo/1.4.11/jquery.scrollTo.min.js","ts":1600392378660,"mimetype":"text/javascript"},"source":"LyoqCiAqIENvcHlyaWdodCAoYykgMjAwNy0yMDE0IEFyaWVsIEZsZXNsZXIgLSBhZmxlc2xlcjxhPmdtYWlsPGQ+Y29tIHwgaHR0cDovL2ZsZXNsZXIuYmxvZ3Nwb3QuY29tCiAqIExpY2Vuc2VkIHVuZGVyIE1JVAogKiBAYXV0aG9yIEFyaWVsIEZsZXNsZXIKICogQHZlcnNpb24gMS40LjExCiAqLwo7KGZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBkZWZpbmU9PT0nZnVuY3Rpb24nJiZkZWZpbmUuYW1kKXtkZWZpbmUoWydqcXVlcnknXSxhKX1lbHNle2EoalF1ZXJ5KX19KGZ1bmN0aW9uKCQpe3ZhciBqPSQuc2Nyb2xsVG89ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAkKHdpbmRvdykuc2Nyb2xsVG8oYSxiLGMpfTtqLmRlZmF1bHRzPXtheGlzOid4eScsZHVyYXRpb246cGFyc2VGbG9hdCgkLmZuLmpxdWVyeSk+PTEuMz8wOjEsbGltaXQ6dHJ1ZX07ai53aW5kb3c9ZnVuY3Rpb24oYSl7cmV0dXJuICQod2luZG93KS5fc2Nyb2xsYWJsZSgpfTskLmZuLl9zY3JvbGxhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxpc1dpbj0hYS5ub2RlTmFtZXx8JC5pbkFycmF5KGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxbJ2lmcmFtZScsJyNkb2N1bWVudCcsJ2h0bWwnLCdib2R5J10pIT0tMTtpZighaXNXaW4pcmV0dXJuIGE7dmFyIGI9KGEuY29udGVudFdpbmRvd3x8YSkuZG9jdW1lbnR8fGEub3duZXJEb2N1bWVudHx8YTtyZXR1cm4vd2Via2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Yi5jb21wYXRNb2RlPT0nQmFja0NvbXBhdCc/Yi5ib2R5OmIuZG9jdW1lbnRFbGVtZW50fSl9OyQuZm4uc2Nyb2xsVG89ZnVuY3Rpb24oZixnLGgpe2lmKHR5cGVvZiBnPT0nb2JqZWN0Jyl7aD1nO2c9MH1pZih0eXBlb2YgaD09J2Z1bmN0aW9uJyloPXtvbkFmdGVyOmh9O2lmKGY9PSdtYXgnKWY9OWU5O2g9JC5leHRlbmQoe30sai5kZWZhdWx0cyxoKTtnPWd8fGguZHVyYXRpb247aC5xdWV1ZT1oLnF1ZXVlJiZoLmF4aXMubGVuZ3RoPjE7aWYoaC5xdWV1ZSlnLz0yO2gub2Zmc2V0PWJvdGgoaC5vZmZzZXQpO2gub3Zlcj1ib3RoKGgub3Zlcik7cmV0dXJuIHRoaXMuX3Njcm9sbGFibGUoKS5lYWNoKGZ1bmN0aW9uKCl7aWYoZj09bnVsbClyZXR1cm47dmFyIGQ9dGhpcywkZWxlbT0kKGQpLHRhcmc9Zix0b2ZmLGF0dHI9e30sd2luPSRlbGVtLmlzKCdodG1sLGJvZHknKTtzd2l0Y2godHlwZW9mIHRhcmcpe2Nhc2UnbnVtYmVyJzpjYXNlJ3N0cmluZyc6aWYoL14oWystXT0/KT9cZCsoXC5cZCspPyhweHwlKT8kLy50ZXN0KHRhcmcpKXt0YXJnPWJvdGgodGFyZyk7YnJlYWt9dGFyZz0kKHRhcmcsdGhpcyk7aWYoIXRhcmcubGVuZ3RoKXJldHVybjtjYXNlJ29iamVjdCc6aWYodGFyZy5pc3x8dGFyZy5zdHlsZSl0b2ZmPSh0YXJnPSQodGFyZykpLm9mZnNldCgpfXZhciBlPSQuaXNGdW5jdGlvbihoLm9mZnNldCkmJmgub2Zmc2V0KGQsdGFyZyl8fGgub2Zmc2V0OyQuZWFjaChoLmF4aXMuc3BsaXQoJycpLGZ1bmN0aW9uKGksYSl7dmFyIGI9YT09J3gnPydMZWZ0JzonVG9wJyxwb3M9Yi50b0xvd2VyQ2FzZSgpLGtleT0nc2Nyb2xsJytiLG9sZD1kW2tleV0sbWF4PWoubWF4KGQsYSk7aWYodG9mZil7YXR0cltrZXldPXRvZmZbcG9zXSsod2luPzA6b2xkLSRlbGVtLm9mZnNldCgpW3Bvc10pO2lmKGgubWFyZ2luKXthdHRyW2tleV0tPXBhcnNlSW50KHRhcmcuY3NzKCdtYXJnaW4nK2IpKXx8MDthdHRyW2tleV0tPXBhcnNlSW50KHRhcmcuY3NzKCdib3JkZXInK2IrJ1dpZHRoJykpfHwwfWF0dHJba2V5XSs9ZVtwb3NdfHwwO2lmKGgub3Zlcltwb3NdKWF0dHJba2V5XSs9dGFyZ1thPT0neCc/J3dpZHRoJzonaGVpZ2h0J10oKSpoLm92ZXJbcG9zXX1lbHNle3ZhciBjPXRhcmdbcG9zXTthdHRyW2tleV09Yy5zbGljZSYmYy5zbGljZSgtMSk9PSclJz9wYXJzZUZsb2F0KGMpLzEwMCptYXg6Y31pZihoLmxpbWl0JiYvXlxkKyQvLnRlc3QoYXR0cltrZXldKSlhdHRyW2tleV09YXR0cltrZXldPD0wPzA6TWF0aC5taW4oYXR0cltrZXldLG1heCk7aWYoIWkmJmgucXVldWUpe2lmKG9sZCE9YXR0cltrZXldKWFuaW1hdGUoaC5vbkFmdGVyRmlyc3QpO2RlbGV0ZSBhdHRyW2tleV19fSk7YW5pbWF0ZShoLm9uQWZ0ZXIpO2Z1bmN0aW9uIGFuaW1hdGUoYSl7JGVsZW0uYW5pbWF0ZShhdHRyLGcsaC5lYXNpbmcsYSYmZnVuY3Rpb24oKXthLmNhbGwodGhpcyx0YXJnLGgpfSl9fSkuZW5kKCl9O2oubWF4PWZ1bmN0aW9uKGEsYil7dmFyIGM9Yj09J3gnPydXaWR0aCc6J0hlaWdodCcsc2Nyb2xsPSdzY3JvbGwnK2M7aWYoISQoYSkuaXMoJ2h0bWwsYm9keScpKXJldHVybiBhW3Njcm9sbF0tJChhKVtjLnRvTG93ZXJDYXNlKCldKCk7dmFyIGQ9J2NsaWVudCcrYyxodG1sPWEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYm9keT1hLm93bmVyRG9jdW1lbnQuYm9keTtyZXR1cm4gTWF0aC5tYXgoaHRtbFtzY3JvbGxdLGJvZHlbc2Nyb2xsXSktTWF0aC5taW4oaHRtbFtkXSxib2R5W2RdKX07ZnVuY3Rpb24gYm90aChhKXtyZXR1cm4gJC5pc0Z1bmN0aW9uKGEpfHx0eXBlb2YgYT09J29iamVjdCc/YTp7dG9wOmEsbGVmdDphfX07cmV0dXJuIGp9KSk7Cg=="},{"meta":{"name":"mustache.min.js","url":"http://cdn.staticfile.org/mustache.js/0.8.1/mustache.min.js","ts":1600392378625,"mimetype":"text/javascript"},"source":"KGZ1bmN0aW9uKHJvb3QsZmFjdG9yeSl7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmZXhwb3J0cyl7ZmFjdG9yeShleHBvcnRzKX1lbHNle3ZhciBtdXN0YWNoZT17fTtmYWN0b3J5KG11c3RhY2hlKTtpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKG11c3RhY2hlKX1lbHNle3Jvb3QuTXVzdGFjaGU9bXVzdGFjaGV9fX0pKHRoaXMsZnVuY3Rpb24obXVzdGFjaGUpe3ZhciB3aGl0ZVJlPS9ccyovO3ZhciBzcGFjZVJlPS9ccysvO3ZhciBub25TcGFjZVJlPS9cUy87dmFyIGVxUmU9L1xzKj0vO3ZhciBjdXJseVJlPS9ccypcfS87dmFyIHRhZ1JlPS8jfFxefFwvfD58XHt8Jnw9fCEvO3ZhciBSZWdFeHBfdGVzdD1SZWdFeHAucHJvdG90eXBlLnRlc3Q7ZnVuY3Rpb24gdGVzdFJlZ0V4cChyZSxzdHJpbmcpe3JldHVybiBSZWdFeHBfdGVzdC5jYWxsKHJlLHN0cmluZyl9ZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHN0cmluZyl7cmV0dXJuIXRlc3RSZWdFeHAobm9uU3BhY2VSZSxzdHJpbmcpfXZhciBPYmplY3RfdG9TdHJpbmc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihvYmplY3Qpe3JldHVybiBPYmplY3RfdG9TdHJpbmcuY2FsbChvYmplY3QpPT09IltvYmplY3QgQXJyYXldIn07ZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3Qpe3JldHVybiB0eXBlb2Ygb2JqZWN0PT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1tcLVxbXF17fSgpKis/LixcXFxeJHwjXHNdL2csIlxcJCYiKX12YXIgZW50aXR5TWFwPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsiLCIvIjoiJiN4MkY7In07ZnVuY3Rpb24gZXNjYXBlSHRtbChzdHJpbmcpe3JldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKC9bJjw+IidcL10vZyxmdW5jdGlvbihzKXtyZXR1cm4gZW50aXR5TWFwW3NdfSl9ZnVuY3Rpb24gZXNjYXBlVGFncyh0YWdzKXtpZighaXNBcnJheSh0YWdzKXx8dGFncy5sZW5ndGghPT0yKXt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdGFnczogIit0YWdzKX1yZXR1cm5bbmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAodGFnc1swXSkrIlxccyoiKSxuZXcgUmVnRXhwKCJcXHMqIitlc2NhcGVSZWdFeHAodGFnc1sxXSkpXX1mdW5jdGlvbiBwYXJzZVRlbXBsYXRlKHRlbXBsYXRlLHRhZ3Mpe3RhZ3M9dGFnc3x8bXVzdGFjaGUudGFnczt0ZW1wbGF0ZT10ZW1wbGF0ZXx8IiI7aWYodHlwZW9mIHRhZ3M9PT0ic3RyaW5nIil7dGFncz10YWdzLnNwbGl0KHNwYWNlUmUpfXZhciB0YWdSZXM9ZXNjYXBlVGFncyh0YWdzKTt2YXIgc2Nhbm5lcj1uZXcgU2Nhbm5lcih0ZW1wbGF0ZSk7dmFyIHNlY3Rpb25zPVtdO3ZhciB0b2tlbnM9W107dmFyIHNwYWNlcz1bXTt2YXIgaGFzVGFnPWZhbHNlO3ZhciBub25TcGFjZT1mYWxzZTtmdW5jdGlvbiBzdHJpcFNwYWNlKCl7aWYoaGFzVGFnJiYhbm9uU3BhY2Upe3doaWxlKHNwYWNlcy5sZW5ndGgpe2RlbGV0ZSB0b2tlbnNbc3BhY2VzLnBvcCgpXX19ZWxzZXtzcGFjZXM9W119aGFzVGFnPWZhbHNlO25vblNwYWNlPWZhbHNlfXZhciBzdGFydCx0eXBlLHZhbHVlLGNocix0b2tlbixvcGVuU2VjdGlvbjt3aGlsZSghc2Nhbm5lci5lb3MoKSl7c3RhcnQ9c2Nhbm5lci5wb3M7dmFsdWU9c2Nhbm5lci5zY2FuVW50aWwodGFnUmVzWzBdKTtpZih2YWx1ZSl7Zm9yKHZhciBpPTAsbGVuPXZhbHVlLmxlbmd0aDtpPGxlbjsrK2kpe2Nocj12YWx1ZS5jaGFyQXQoaSk7aWYoaXNXaGl0ZXNwYWNlKGNocikpe3NwYWNlcy5wdXNoKHRva2Vucy5sZW5ndGgpfWVsc2V7bm9uU3BhY2U9dHJ1ZX10b2tlbnMucHVzaChbInRleHQiLGNocixzdGFydCxzdGFydCsxXSk7c3RhcnQrPTE7aWYoY2hyPT09IlxuIil7c3RyaXBTcGFjZSgpfX19aWYoIXNjYW5uZXIuc2Nhbih0YWdSZXNbMF0pKWJyZWFrO2hhc1RhZz10cnVlO3R5cGU9c2Nhbm5lci5zY2FuKHRhZ1JlKXx8Im5hbWUiO3NjYW5uZXIuc2Nhbih3aGl0ZVJlKTtpZih0eXBlPT09Ij0iKXt2YWx1ZT1zY2FubmVyLnNjYW5VbnRpbChlcVJlKTtzY2FubmVyLnNjYW4oZXFSZSk7c2Nhbm5lci5zY2FuVW50aWwodGFnUmVzWzFdKX1lbHNlIGlmKHR5cGU9PT0ieyIpe3ZhbHVlPXNjYW5uZXIuc2NhblVudGlsKG5ldyBSZWdFeHAoIlxccyoiK2VzY2FwZVJlZ0V4cCgifSIrdGFnc1sxXSkpKTtzY2FubmVyLnNjYW4oY3VybHlSZSk7c2Nhbm5lci5zY2FuVW50aWwodGFnUmVzWzFdKTt0eXBlPSImIn1lbHNle3ZhbHVlPXNjYW5uZXIuc2NhblVudGlsKHRhZ1Jlc1sxXSl9aWYoIXNjYW5uZXIuc2Nhbih0YWdSZXNbMV0pKXt0aHJvdyBuZXcgRXJyb3IoIlVuY2xvc2VkIHRhZyBhdCAiK3NjYW5uZXIucG9zKX10b2tlbj1bdHlwZSx2YWx1ZSxzdGFydCxzY2FubmVyLnBvc107dG9rZW5zLnB1c2godG9rZW4pO2lmKHR5cGU9PT0iIyJ8fHR5cGU9PT0iXiIpe3NlY3Rpb25zLnB1c2godG9rZW4pfWVsc2UgaWYodHlwZT09PSIvIil7b3BlblNlY3Rpb249c2VjdGlvbnMucG9wKCk7aWYoIW9wZW5TZWN0aW9uKXt0aHJvdyBuZXcgRXJyb3IoJ1Vub3BlbmVkIHNlY3Rpb24gIicrdmFsdWUrJyIgYXQgJytzdGFydCl9aWYob3BlblNlY3Rpb25bMV0hPT12YWx1ZSl7dGhyb3cgbmV3IEVycm9yKCdVbmNsb3NlZCBzZWN0aW9uICInK29wZW5TZWN0aW9uWzFdKyciIGF0ICcrc3RhcnQpfX1lbHNlIGlmKHR5cGU9PT0ibmFtZSJ8fHR5cGU9PT0ieyJ8fHR5cGU9PT0iJiIpe25vblNwYWNlPXRydWV9ZWxzZSBpZih0eXBlPT09Ij0iKXt0YWdSZXM9ZXNjYXBlVGFncyh0YWdzPXZhbHVlLnNwbGl0KHNwYWNlUmUpKX19b3BlblNlY3Rpb249c2VjdGlvbnMucG9wKCk7aWYob3BlblNlY3Rpb24pe3Rocm93IG5ldyBFcnJvcignVW5jbG9zZWQgc2VjdGlvbiAiJytvcGVuU2VjdGlvblsxXSsnIiBhdCAnK3NjYW5uZXIucG9zKX1yZXR1cm4gbmVzdFRva2VucyhzcXVhc2hUb2tlbnModG9rZW5zKSl9ZnVuY3Rpb24gc3F1YXNoVG9rZW5zKHRva2Vucyl7dmFyIHNxdWFzaGVkVG9rZW5zPVtdO3ZhciB0b2tlbixsYXN0VG9rZW47Zm9yKHZhciBpPTAsbGVuPXRva2Vucy5sZW5ndGg7aTxsZW47KytpKXt0b2tlbj10b2tlbnNbaV07aWYodG9rZW4pe2lmKHRva2VuWzBdPT09InRleHQiJiZsYXN0VG9rZW4mJmxhc3RUb2tlblswXT09PSJ0ZXh0Iil7bGFzdFRva2VuWzFdKz10b2tlblsxXTtsYXN0VG9rZW5bM109dG9rZW5bM119ZWxzZXtzcXVhc2hlZFRva2Vucy5wdXNoKHRva2VuKTtsYXN0VG9rZW49dG9rZW59fX1yZXR1cm4gc3F1YXNoZWRUb2tlbnN9ZnVuY3Rpb24gbmVzdFRva2Vucyh0b2tlbnMpe3ZhciBuZXN0ZWRUb2tlbnM9W107dmFyIGNvbGxlY3Rvcj1uZXN0ZWRUb2tlbnM7dmFyIHNlY3Rpb25zPVtdO3ZhciB0b2tlbixzZWN0aW9uO2Zvcih2YXIgaT0wLGxlbj10b2tlbnMubGVuZ3RoO2k8bGVuOysraSl7dG9rZW49dG9rZW5zW2ldO3N3aXRjaCh0b2tlblswXSl7Y2FzZSIjIjpjYXNlIl4iOmNvbGxlY3Rvci5wdXNoKHRva2VuKTtzZWN0aW9ucy5wdXNoKHRva2VuKTtjb2xsZWN0b3I9dG9rZW5bNF09W107YnJlYWs7Y2FzZSIvIjpzZWN0aW9uPXNlY3Rpb25zLnBvcCgpO3NlY3Rpb25bNV09dG9rZW5bMl07Y29sbGVjdG9yPXNlY3Rpb25zLmxlbmd0aD4wP3NlY3Rpb25zW3NlY3Rpb25zLmxlbmd0aC0xXVs0XTpuZXN0ZWRUb2tlbnM7YnJlYWs7ZGVmYXVsdDpjb2xsZWN0b3IucHVzaCh0b2tlbil9fXJldHVybiBuZXN0ZWRUb2tlbnN9ZnVuY3Rpb24gU2Nhbm5lcihzdHJpbmcpe3RoaXMuc3RyaW5nPXN0cmluZzt0aGlzLnRhaWw9c3RyaW5nO3RoaXMucG9zPTB9U2Nhbm5lci5wcm90b3R5cGUuZW9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFpbD09PSIifTtTY2FubmVyLnByb3RvdHlwZS5zY2FuPWZ1bmN0aW9uKHJlKXt2YXIgbWF0Y2g9dGhpcy50YWlsLm1hdGNoKHJlKTtpZihtYXRjaCYmbWF0Y2guaW5kZXg9PT0wKXt2YXIgc3RyaW5nPW1hdGNoWzBdO3RoaXMudGFpbD10aGlzLnRhaWwuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpO3RoaXMucG9zKz1zdHJpbmcubGVuZ3RoO3JldHVybiBzdHJpbmd9cmV0dXJuIiJ9O1NjYW5uZXIucHJvdG90eXBlLnNjYW5VbnRpbD1mdW5jdGlvbihyZSl7dmFyIGluZGV4PXRoaXMudGFpbC5zZWFyY2gocmUpLG1hdGNoO3N3aXRjaChpbmRleCl7Y2FzZS0xOm1hdGNoPXRoaXMudGFpbDt0aGlzLnRhaWw9IiI7YnJlYWs7Y2FzZSAwOm1hdGNoPSIiO2JyZWFrO2RlZmF1bHQ6bWF0Y2g9dGhpcy50YWlsLnN1YnN0cmluZygwLGluZGV4KTt0aGlzLnRhaWw9dGhpcy50YWlsLnN1YnN0cmluZyhpbmRleCl9dGhpcy5wb3MrPW1hdGNoLmxlbmd0aDtyZXR1cm4gbWF0Y2h9O2Z1bmN0aW9uIENvbnRleHQodmlldyxwYXJlbnRDb250ZXh0KXt0aGlzLnZpZXc9dmlldz09bnVsbD97fTp2aWV3O3RoaXMuY2FjaGU9eyIuIjp0aGlzLnZpZXd9O3RoaXMucGFyZW50PXBhcmVudENvbnRleHR9Q29udGV4dC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih2aWV3KXtyZXR1cm4gbmV3IENvbnRleHQodmlldyx0aGlzKX07Q29udGV4dC5wcm90b3R5cGUubG9va3VwPWZ1bmN0aW9uKG5hbWUpe3ZhciB2YWx1ZTtpZihuYW1lIGluIHRoaXMuY2FjaGUpe3ZhbHVlPXRoaXMuY2FjaGVbbmFtZV19ZWxzZXt2YXIgY29udGV4dD10aGlzO3doaWxlKGNvbnRleHQpe2lmKG5hbWUuaW5kZXhPZigiLiIpPjApe3ZhbHVlPWNvbnRleHQudmlldzt2YXIgbmFtZXM9bmFtZS5zcGxpdCgiLiIpLGk9MDt3aGlsZSh2YWx1ZSE9bnVsbCYmaTxuYW1lcy5sZW5ndGgpe3ZhbHVlPXZhbHVlW25hbWVzW2krK11dfX1lbHNle3ZhbHVlPWNvbnRleHQudmlld1tuYW1lXX1pZih2YWx1ZSE9bnVsbClicmVhaztjb250ZXh0PWNvbnRleHQucGFyZW50fXRoaXMuY2FjaGVbbmFtZV09dmFsdWV9aWYoaXNGdW5jdGlvbih2YWx1ZSkpe3ZhbHVlPXZhbHVlLmNhbGwodGhpcy52aWV3KX1yZXR1cm4gdmFsdWV9O2Z1bmN0aW9uIFdyaXRlcigpe3RoaXMuY2FjaGU9e319V3JpdGVyLnByb3RvdHlwZS5jbGVhckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fX07V3JpdGVyLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0ZW1wbGF0ZSx0YWdzKXt2YXIgY2FjaGU9dGhpcy5jYWNoZTt2YXIgdG9rZW5zPWNhY2hlW3RlbXBsYXRlXTtpZih0b2tlbnM9PW51bGwpe3Rva2Vucz1jYWNoZVt0ZW1wbGF0ZV09cGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSx0YWdzKX1yZXR1cm4gdG9rZW5zfTtXcml0ZXIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0ZW1wbGF0ZSx2aWV3LHBhcnRpYWxzKXt2YXIgdG9rZW5zPXRoaXMucGFyc2UodGVtcGxhdGUpO3ZhciBjb250ZXh0PXZpZXcgaW5zdGFuY2VvZiBDb250ZXh0P3ZpZXc6bmV3IENvbnRleHQodmlldyk7cmV0dXJuIHRoaXMucmVuZGVyVG9rZW5zKHRva2Vucyxjb250ZXh0LHBhcnRpYWxzLHRlbXBsYXRlKX07V3JpdGVyLnByb3RvdHlwZS5yZW5kZXJUb2tlbnM9ZnVuY3Rpb24odG9rZW5zLGNvbnRleHQscGFydGlhbHMsb3JpZ2luYWxUZW1wbGF0ZSl7dmFyIGJ1ZmZlcj0iIjt2YXIgc2VsZj10aGlzO2Z1bmN0aW9uIHN1YlJlbmRlcih0ZW1wbGF0ZSl7cmV0dXJuIHNlbGYucmVuZGVyKHRlbXBsYXRlLGNvbnRleHQscGFydGlhbHMpfXZhciB0b2tlbix2YWx1ZTtmb3IodmFyIGk9MCxsZW49dG9rZW5zLmxlbmd0aDtpPGxlbjsrK2kpe3Rva2VuPXRva2Vuc1tpXTtzd2l0Y2godG9rZW5bMF0pe2Nhc2UiIyI6dmFsdWU9Y29udGV4dC5sb29rdXAodG9rZW5bMV0pO2lmKCF2YWx1ZSljb250aW51ZTtpZihpc0FycmF5KHZhbHVlKSl7Zm9yKHZhciBqPTAsamxlbj12YWx1ZS5sZW5ndGg7ajxqbGVuOysrail7YnVmZmVyKz10aGlzLnJlbmRlclRva2Vucyh0b2tlbls0XSxjb250ZXh0LnB1c2godmFsdWVbal0pLHBhcnRpYWxzLG9yaWdpbmFsVGVtcGxhdGUpfX1lbHNlIGlmKHR5cGVvZiB2YWx1ZT09PSJvYmplY3QifHx0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIil7YnVmZmVyKz10aGlzLnJlbmRlclRva2Vucyh0b2tlbls0XSxjb250ZXh0LnB1c2godmFsdWUpLHBhcnRpYWxzLG9yaWdpbmFsVGVtcGxhdGUpfWVsc2UgaWYoaXNGdW5jdGlvbih2YWx1ZSkpe2lmKHR5cGVvZiBvcmlnaW5hbFRlbXBsYXRlIT09InN0cmluZyIpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSBoaWdoZXItb3JkZXIgc2VjdGlvbnMgd2l0aG91dCB0aGUgb3JpZ2luYWwgdGVtcGxhdGUiKX12YWx1ZT12YWx1ZS5jYWxsKGNvbnRleHQudmlldyxvcmlnaW5hbFRlbXBsYXRlLnNsaWNlKHRva2VuWzNdLHRva2VuWzVdKSxzdWJSZW5kZXIpO2lmKHZhbHVlIT1udWxsKWJ1ZmZlcis9dmFsdWV9ZWxzZXtidWZmZXIrPXRoaXMucmVuZGVyVG9rZW5zKHRva2VuWzRdLGNvbnRleHQscGFydGlhbHMsb3JpZ2luYWxUZW1wbGF0ZSl9YnJlYWs7Y2FzZSJeIjp2YWx1ZT1jb250ZXh0Lmxvb2t1cCh0b2tlblsxXSk7aWYoIXZhbHVlfHxpc0FycmF5KHZhbHVlKSYmdmFsdWUubGVuZ3RoPT09MCl7YnVmZmVyKz10aGlzLnJlbmRlclRva2Vucyh0b2tlbls0XSxjb250ZXh0LHBhcnRpYWxzLG9yaWdpbmFsVGVtcGxhdGUpfWJyZWFrO2Nhc2UiPiI6aWYoIXBhcnRpYWxzKWNvbnRpbnVlO3ZhbHVlPWlzRnVuY3Rpb24ocGFydGlhbHMpP3BhcnRpYWxzKHRva2VuWzFdKTpwYXJ0aWFsc1t0b2tlblsxXV07aWYodmFsdWUhPW51bGwpYnVmZmVyKz10aGlzLnJlbmRlclRva2Vucyh0aGlzLnBhcnNlKHZhbHVlKSxjb250ZXh0LHBhcnRpYWxzLHZhbHVlKTticmVhaztjYXNlIiYiOnZhbHVlPWNvbnRleHQubG9va3VwKHRva2VuWzFdKTtpZih2YWx1ZSE9bnVsbClidWZmZXIrPXZhbHVlO2JyZWFrO2Nhc2UibmFtZSI6dmFsdWU9Y29udGV4dC5sb29rdXAodG9rZW5bMV0pO2lmKHZhbHVlIT1udWxsKWJ1ZmZlcis9bXVzdGFjaGUuZXNjYXBlKHZhbHVlKTticmVhaztjYXNlInRleHQiOmJ1ZmZlcis9dG9rZW5bMV07YnJlYWt9fXJldHVybiBidWZmZXJ9O211c3RhY2hlLm5hbWU9Im11c3RhY2hlLmpzIjttdXN0YWNoZS52ZXJzaW9uPSIwLjguMSI7bXVzdGFjaGUudGFncz1bInt7IiwifX0iXTt2YXIgZGVmYXVsdFdyaXRlcj1uZXcgV3JpdGVyO211c3RhY2hlLmNsZWFyQ2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gZGVmYXVsdFdyaXRlci5jbGVhckNhY2hlKCl9O211c3RhY2hlLnBhcnNlPWZ1bmN0aW9uKHRlbXBsYXRlLHRhZ3Mpe3JldHVybiBkZWZhdWx0V3JpdGVyLnBhcnNlKHRlbXBsYXRlLHRhZ3MpfTttdXN0YWNoZS5yZW5kZXI9ZnVuY3Rpb24odGVtcGxhdGUsdmlldyxwYXJ0aWFscyl7cmV0dXJuIGRlZmF1bHRXcml0ZXIucmVuZGVyKHRlbXBsYXRlLHZpZXcscGFydGlhbHMpfTttdXN0YWNoZS50b19odG1sPWZ1bmN0aW9uKHRlbXBsYXRlLHZpZXcscGFydGlhbHMsc2VuZCl7dmFyIHJlc3VsdD1tdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsdmlldyxwYXJ0aWFscyk7aWYoaXNGdW5jdGlvbihzZW5kKSl7c2VuZChyZXN1bHQpfWVsc2V7cmV0dXJuIHJlc3VsdH19O211c3RhY2hlLmVzY2FwZT1lc2NhcGVIdG1sO211c3RhY2hlLlNjYW5uZXI9U2Nhbm5lcjttdXN0YWNoZS5Db250ZXh0PUNvbnRleHQ7bXVzdGFjaGUuV3JpdGVyPVdyaXRlcn0pOw=="},{"meta":{"name":"tieba_ui.js","url":"https://greasyfork.org/scripts/2657/code/tieba_ui.js","ts":1600392377666,"mimetype":"text/javascript"},"source":"LyoqCiAqIEBwYWNrYWdlIG9yZy5qaXh1bi50aWViYS51aQogKiBAYXV0aG9yICBqaXh1bgogKiBAc291cmNlICBodHRwOi8vdGIxLmJkc3RhdGljLmNvbS90Yi9zdGF0aWMtY29tbW9uL2xpYi90Yl9saWJfMDRlNzc5MS5qcwogKi8KCi8vIERlYnVnZ2luZwovLyB2YXIgdW5zYWZlV2luZG93ID0gd2luZG93OwoKLy8g6YWN572u6aG555uu5Y+C6KeBICQuZGlhbG9nLnNldHRpbmcg55qE5YC8Ci8vIG5ldyAkLmRpYWxvZyAoIHsg6YWN572uIH0gKQoKLy8g6Z2Z5oCB5Ye95pWw5bey57uP5Zyo55u45YWz5Ye95pWw5rOo6YeK5LqGCi8vICQuZGlhbG9nLm9wZW4KLy8gJC5kaWFsb2cuYXNrCi8vIC4uLgoKKGZ1bmN0aW9uICgkKSB7CgkkLmZuLmRyYWdnYWJsZSA9IGZ1bmN0aW9uKG9wdCkgewoJCXZhciAkdGhhdCA9IHRoaXM7CgkJb3B0ID0gJC5leHRlbmQoewoJCQloYW5kbGU6ICR0aGF0LAoJCQlzdGFydDogJC5ub29wLAoJCQlzdG9wOiAkLm5vb3AKCQl9LCBvcHQpOwoKCQl2YXIgX2VsZW1lbnQgPSAkdGhhdFswXSwKCQkJX2VsZW1lbnRQYXJlbnQgPSAkdGhhdC5wYXJlbnQoKVswXTsKCgkJdmFyIF9nZXRQb3MgPSBmdW5jdGlvbiAoZWxlKSB7CgkJCXZhciBhZGRPbiA9IGVsZS5vZmZzZXRQYXJlbnQgIT0gX2VsZW1lbnRQYXJlbnQgJiYgZWxlLm9mZnNldFBhcmVudAoJCQkJPyBfZ2V0UG9zIChlbGUub2Zmc2V0UGFyZW50KQoJCQkJOiB7eDogMCwgeTogMH07CgoJCQlyZXR1cm4gewoJCQkJeDogZWxlLm9mZnNldExlZnQgKyBhZGRPbi54LAoJCQkJeTogZWxlLm9mZnNldFRvcCArIGFkZE9uLnkKCQkJfTsKCQl9OwoKCQl2YXIgYmFzZU9mZnNldCwgb2Zmc2V0LCBpc0RyYWc7CgkJdmFyIF9tb3VzZURvd24gPSBmdW5jdGlvbiAoZSkgewoJCQliYXNlT2Zmc2V0ID0gX2dldFBvcyAoX2VsZW1lbnQpOwoJCQlvZmZzZXQgPSB7CgkJCQl4OiBlLnBhZ2VYLAoJCQkJeTogZS5wYWdlWQoJCQl9OwoKCQkJaXNEcmFnID0gdHJ1ZTsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQlvcHQuc3RhcnQoKTsKCQl9LCBfbW91c2VVcCA9IGZ1bmN0aW9uICgpIHsKCQkJaXNEcmFnID0gZmFsc2U7CgkJCW9wdC5zdG9wICgpOwoJCX0sIF9tb3VzZU1vdmUgPSBmdW5jdGlvbiAoZSkgewoJCQlpZiAoIWlzRHJhZykgcmV0dXJuOwoKCQkJJHRoYXQuY3NzICh7CgkJCQlsZWZ0OiBiYXNlT2Zmc2V0LnggKyBlLnBhZ2VYIC0gb2Zmc2V0LngsCgkJCQl0b3AgOiBiYXNlT2Zmc2V0LnkgKyBlLnBhZ2VZIC0gb2Zmc2V0LnkKCQkJfSk7CgkJfTsKCgkJb3B0LmhhbmRsZS5vbignbW91c2Vkb3duJywgX21vdXNlRG93bik7CgkJJChkb2N1bWVudCkKCQkJLm9uICgnbW91c2Vtb3ZlJywgX21vdXNlTW92ZSkKCQkJLm9uICgnbW91c2V1cCcsICAgX21vdXNlVXApOwoKCQlyZXR1cm4gZnVuY3Rpb24gKCkgewoJCQlvcHQuaGFuZGxlLm9mZiAoJ21vdXNlZG93bicsIF9tb3VzZURvd24pOwoJCQkkKGRvY3VtZW50KQoJCQkJLm9mZiAoJ21vdXNlbW92ZScsIF9tb3VzZU1vdmUpCgkJCQkub2ZmICgnbW91c2V1cCcsICAgX21vdXNlVXApOwoJCX07Cgl9OwoKCSQuZ2V0ekluZGV4ID0gZnVuY3Rpb24gKCkgewoJCSQuekluZGV4ID0gJC56SW5kZXggfHwgNTAwMDA7CgkJcmV0dXJuICQuekluZGV4ICsrOwoJfTsKCgl2YXIgJG1vZGFsID0gZnVuY3Rpb24gKG9wdHMpIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgkJdGhpcy5jZmcgPSAkLmV4dGVuZCh7fSwgewoJCQljbGFzc05hbWU6ICJkaWFsb2dKbW9kYWwiLAoJCQlyZXNpemVhYmxlOiB0cnVlCgkJfSwgb3B0cyk7CgoJCXRoaXMuZWxlbWVudCA9CgkJCSQoJzxkaXY+JykKCQkJCS5hZGRDbGFzcyh0aGlzLmNmZy5jbGFzc05hbWUpCgkJCQkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkKCQkJCS5jc3MoewoJCQkJCWRpc3BsYXk6ICJub25lIiwKCQkJCQl6SW5kZXg6ICQuZ2V0ekluZGV4KCksCgkJCQkJd2lkdGg6IHRoaXMud2lkdGgoKSwKCQkJCQloZWlnaHQ6IHRoaXMuaGVpZ2h0KCkKCQkJCX0pOwoKCQlpZiAodGhpcy5jZmcuc2hvdykKCQkJdGhpcy5zaG93ICgpOwoKCQl0aGlzLnJlc2l6ZUZ1bmMgPSBmdW5jdGlvbiAoKSB7CgkJCXRoYXQuY3NzKHsKCQkJCXdpZHRoOiB0aGF0LndpZHRoICgpLAoJCQkJaGVpZ2h0OiB0aGF0LmhlaWdodCAoKQoJCQl9KTsKCgkJCXRoYXQudHJpZ2dlckhhbmRsZXIoInJlc2l6ZSIpOwoJCX07CgoJCWlmICh0aGlzLmNmZy5yZXNpemVhYmxlKSB7CgkJCSQodW5zYWZlV2luZG93KS5vbigicmVzaXplIiwgdGhpcy5yZXNpemVGdW5jKTsKCQl9Cgl9OwoKCgoJJG1vZGFsLnByb3RvdHlwZSA9IHsKCQljb25zdHJ1Y3RvcjogJG1vZGFsLAoKCQlzaG93OiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuZWxlbWVudC5zaG93LmFwcGx5KHRoaXMuZWxlbWVudCwgYXJndW1lbnRzKTsKCQl9LAoKCQloaWRlOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuZWxlbWVudC5oaWRlLmFwcGx5KHRoaXMuZWxlbWVudCwgYXJndW1lbnRzKTsKCQl9LAoKCQl3aWR0aDogZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gJCh1bnNhZmVXaW5kb3cpLndpZHRoKCk7CgkJfSwKCgkJaGVpZ2h0OiBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBNYXRoLm1heCgkKCJib2R5IikuaGVpZ2h0KCksICQoImh0bWwiKS5oZWlnaHQoKSk7CgkJfSwKCgkJY3NzOiBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiB0aGlzLmVsZW1lbnQuY3NzLmFwcGx5KHRoaXMuZWxlbWVudCwgYXJndW1lbnRzKTsKCQl9LAoKCQl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24gKCkgewoJCQl0aGlzLmVsZW1lbnQudHJpZ2dlckhhbmRsZXIuYXBwbHkodGhpcy5lbGVtZW50LCBhcmd1bWVudHMpOwoJCX0sCgoJCWJpbmQ6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy5lbGVtZW50Lm9uLmFwcGx5KHRoaXMuZWxlbWVudCwgYXJndW1lbnRzKTsKCQl9LAoKCQlyZW1vdmU6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKHRoaXMuZWxlbWVudCkgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZSgpOwoJCQl9CgkJCSQodW5zYWZlV2luZG93KS5vZmYoInJlc2l6ZSIsIHRoaXMucmVzaXplRnVuYyk7CgkJCWZvciAodmFyIHQgaW4gdGhpcykgewoJCQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkodCkpIHsKCQkJCQlkZWxldGUgdGhpc1t0XTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gX3Byb2Nlc3NUYWdlcyDnp7vpmaQKCQkvLyDlm6DkuLrlhajpg6jpg73mmK/lhbzlrrkgSUUg55So5Luj56CB44CCCgoJfTsKCgkkLm1vZGFsID0gJG1vZGFsOwoKCXZhciBsc3RFdmVudHMgPSBbIm9uYWNjZXB0IiwgIm9uY2FuY2VsIiwgIm9uY2xvc2UiLCAib25yZXNpemUiLCAib25oaWRlIl07CgkKCXZhciAkZGlhbG9nID0gZnVuY3Rpb24gKGRpYWxvZ09wdHMpIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgkJdmFyIGNiT25SZXNpemUgPSBmdW5jdGlvbiAoKSB7CgkJCQoJCQlpZiAoIXRoYXQuZHJhZ2dlZCkgewoJCQkJdGhhdC5lbGVtZW50LnRyaWdnZXJIYW5kbGVyKCJvbnJlc2l6ZSIpOwoJCQkJCgkJCQlpZiAodGhhdC5zaXplVGltZXIpCgkJCQkJY2xlYXJUaW1lb3V0KHRoYXQuc2l6ZVRpbWVyKTsKCQkJCQoJCQkJdGhhdC5zaXplVGltZXIgPSBzZXRUaW1lb3V0KHRoYXQuc2V0UG9zaXRpb24ub24odGhhdCksIDUpCgkJCX0KCQl9OwoKCQkkZGlhbG9nLklOU1QucHVzaCh0aGlzKTsKCQkKCQl0aGlzLmNmZyA9ICQuZXh0ZW5kKHt9LCAkZGlhbG9nLnNldHRpbmcsIGRpYWxvZ09wdHMpOwoJCWlmICghdGhpcy5jZmcuc2hvd1RpdGxlKQoJCQl0aGlzLmNmZy5kcmFnZ2FibGUgPSAgZmFsc2U7CgkJCgkJaWYgKG51bGwgIT0gdGhpcy5jZmcudG9wIHx8IG51bGwgIT0gdGhpcy5jZmcubGVmdCkgewoJCQl0aGlzLmNmZy5hdXRvQ2VudGVyID0gZmFsc2U7CgkJfQoKCQl2YXIgZGlhbG9nQ2xhc3MgPSAiZGlhbG9nSiBkaWFsb2dUaWViYVVpIjsKCgkJaWYgKHRoaXMuY2ZnLmhvbGRlckNsYXNzTmFtZSkKCQkJZGlhbG9nQ2xhc3MgKz0gIiAiICsgdGhpcy5jZmcuaG9sZGVyQ2xhc3NOYW1lOwoKCQlpZiAodGhpcy5jZmcuZml4ZWQpCgkJCWRpYWxvZ0NsYXNzICs9ICIgZGlhbG9nSmZpeCI7CgoJCWlmICh0aGlzLmNmZy5zaG93U2hhZG93KQoJCQlkaWFsb2dDbGFzcyArPSAiIGRpYWxvZ0pzaGFkb3ciOwoKCQlpZiAodGhpcy5jZmcubW9kYWwpIHsKCQkJdmFyIG1vZGFsQXJnID0ge307CgoJCQlpZiAodGhpcy5jZmcubW9kYWxDbGFzc05hbWUpCgkJCQltb2RhbEFyZy5jbGFzc05hbWUgPSB0aGlzLmNmZy5tb2RhbENsYXNzTmFtZTsKCgkJCXRoaXMubW9kYWwgPSBuZXcgJC5tb2RhbChtb2RhbEFyZyk7CgkJfQoKCQl0aGlzLmVsZW1lbnQgPQoJCQkkKCc8ZGl2IGNsYXNzPSInICsgZGlhbG9nQ2xhc3MgKyAnIj48L2Rpdj4nKQoJCQkJLmhpZGUgKCkKCQkJCS5jc3MoewoJCQkJCXpJbmRleDogJC5nZXR6SW5kZXgoKQoJCQkJfSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7CgoJCXRoaXMuZWxlbWVudFdyYXBwZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCd1aURpYWxvZ1dyYXBwZXInKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpOwoKCQkvLyDlh4blpIflr7nor53moYbmoIfpopgKCQl0aGlzLl9zZXR1cFRpdGxlQmFyKCk7CgkJdGhpcy5zZXRUaXRsZSh0aGlzLmNmZy50aXRsZSk7CgkJdGhpcy5fc2V0dXBOb1RpdGxlKCk7CgoJCS8vIOWHhuWkh+WvueivneahhuWGheWuuQoJCXRoaXMuX3NldHVwQ29udGVudCgpOwoJCWlmICgnaWZyYW1lJyA9PT0gdGhpcy5jZmcuY29udGVudFR5cGUpIHsKCQkJdGhpcy5jZmcuaHRtbCA9ICQoIjxpZnJhbWU+IikuY3NzKHsKCQkJCXdpZHRoOiAiMTAwJSIsCgkJCQloZWlnaHQ6ICIxMDAlIiwKCQkJCWJvcmRlcjogIm5vbmUiCgkJCX0pLmF0dHIoewoJCQkJc3JjOiB0aGlzLmNmZy5odG1sCgkJCX0pOwoJCX0KCQl0aGlzLnNldENvbnRlbnQodGhpcy5jZmcuaHRtbCk7CgoJCS8vIOiuvuWumuWvueivneahhuWuveOAgemrmAoJCS8vIEppeHVuOiDorr7lrprpu5jorqQgNDAweDgwIOeahOWuvemrmOOAggoJCXRoaXMud2lkdGgodGhpcy5jZmcud2lkdGgpOwoJCXRoaXMuaGVpZ2h0KHRoaXMuY2ZnLmhlaWdodCk7CgkJdGhpcy5zZXRQb3NpdGlvbih0aGlzLmNmZy5sZWZ0LCB0aGlzLmNmZy50b3ApOwoKCQlpZiAodGhpcy5jZmcuc2hvdykKCQkJdGhpcy5zaG93KCk7CgoJCWlmICh0aGlzLmNmZy5hdXRvQ2VudGVyICkKCQkJJCh1bnNhZmVXaW5kb3cpLm9uKCJyZXNpemUiLCBjYk9uUmVzaXplKTsKCgkJLy8g6K6+5a6a5ouW5YqoCgkJdGhpcy5fc2V0U2Nyb2xsICgpOwoJCSQuZWFjaCAobHN0RXZlbnRzLCBmdW5jdGlvbiAoaSwgZXZlbnROYW1lKSB7CgkJCWlmICh0aGF0LmNmZ1tldmVudE5hbWVdKSB7CgkJCQl0aGF0Lm9uKGV2ZW50TmFtZSwgdGhhdC5jZmdbZXZlbnROYW1lXSk7CgkJCX0KCQl9KTsKCgkJaWYgKHRoaXMuY2ZnLmVzY2FibGUpCgkJCXRoaXMuX3NldHVwRXNjS2V5KCk7CgoJCS8vIOWFs+mXreWvueivneahhgoJCXRoaXMuY2xvc2UgPSBmdW5jdGlvbiAoKSB7CgkJCS8vIOWmguaenOaLkue7neWFs+mXreWImei/lOWbngoJCQlpZiAodGhhdC5lbGVtZW50LnRyaWdnZXJIYW5kbGVyKCJvbmNsb3NlIikgPT09ICBmYWxzZSkKCQkJCXJldHVybiBmYWxzZTsKCgkJCS8vIOWPlua2iOe7keWumiByZXNpemUg5LqL5Lu2CgkJCSQodW5zYWZlV2luZG93KS5vZmYoInJlc2l6ZSIsIGNiT25SZXNpemUpOwoKCQkJLy8g56e76ZmkIG1vZGFsCgkJCWlmICh0aGF0Lm1vZGFsKQoJCQkJdGhhdC5tb2RhbC5yZW1vdmUoKTsKCgkJCXRoYXQuX3NldFNjcm9sbCh0cnVlKTsKCQkJdGhhdC5lbGVtZW50LnJlbW92ZSgpOwoKCQkJZm9yICh2YXIgdCA9IDA7IHQgPCAkZGlhbG9nLklOU1QubGVuZ3RoOyB0KyspIHsKCQkJCWlmICgkZGlhbG9nLklOU1RbdF0gPT0gdGhhdCkgewoJCQkJCSRkaWFsb2cuSU5TVC5zcGxpY2UodCwgMSk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0cnVlOwoJCX0KCX07CgkKCgkkLmV4dGVuZCgkZGlhbG9nLCB7CgkJLyoqCgkJICog5ZCv5Yqo5LiA5Liq5Z+65pys5a+56K+d5qGGCgkJICogQHBhcmFtIGNvbnRlbnQgICDlr7nor53moYblhoXlrrkKCQkgKiBAcGFyYW0gb3B0cyAgICAgIOWFtuWug+S8oOWPggoJCSAqIEByZXR1cm5zIHskZGlhbG9nfQoJCSAqLwoJCW9wZW46IGZ1bmN0aW9uIChjb250ZW50LCBvcHRzKSB7CgkJCXJldHVybiAobmV3ICRkaWFsb2coJC5leHRlbmQoe30sIG9wdHMsIHtodG1sOiBjb250ZW50fSkpKTsKCQl9LAoKCQkvKioKCQkgKiDliJvlu7rkuIDkuKror6Lpl67lr7nor53moYYKCQkgKiBAcGFyYW0gaHRtbCAgICAgICAgICDlr7nor53moYblhoXlrrkKCQkgKiBAcGFyYW0gYXJyQW5zd2VycyAgICDlm57nrZTmjInpkq7lhoXlrrkKCQkgKgoJCSAqIEBwYXJhbSBjYWxsYmFjayAgICAgIOS4pOS4quWPguaVsCwg5Y6f5Z6L5aaC5LiLOgoJCSAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIChpLCAkZGlhbG9nKQoJCSAqICAgICAgICAgICAgICAgICAgICAgIGkg5Li65Zue562U5oyJ6ZKu5bqP5Y+3LCAkZGlhbG9nIOS4uuWvueivneahhuacrOS9kwoJCSAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMg57uR5a6a5Li6ICQo5oyJ6ZKuKeOAggoJCSAqCgkJICogQHBhcmFtIG9wdHMgICAgICAgICAg5Yib5bu65pe25Lyg6YCS57uZICRkaWFsb2cgLyAkbW9kYWwg55qE5Y+C5pWwCgkJICogQHJldHVybnMge30KCQkgKi8KCQlhc2s6IGZ1bmN0aW9uIChodG1sLCBhcnJBbnN3ZXJzLCBjYWxsYmFjaywgb3B0cykgewoJCQlpZiAoIW9wdHMpIG9wdHMgPSB7fTsKCgkJCXZhciBfJGRpYWxvZyA9IG5ldyAkZGlhbG9nKCQuZXh0ZW5kKHttb2RhbDogdHJ1ZX0sIG9wdHMsIHtodG1sOiBodG1sIHx8ICIiLCBzaG93OiB0cnVlfSkpOwoKCQkJaWYgKCQuaXNBcnJheShhcnJBbnN3ZXJzKSAmJiBhcnJBbnN3ZXJzLmxlbmd0aCkgewoJCQkJdmFyIGFuc3dlckNvbnRhaW5lciA9ICQoJzxkaXY+JykKCQkJCQkuYWRkQ2xhc3MoJ2RpYWxvZ0phbnN3ZXJzJykKCQkJCQkuYXBwZW5kVG8oXyRkaWFsb2cuZWxlbWVudFdyYXBwZXIpOwoKCQkJCSQoYXJyQW5zd2VycykuZWFjaCAoZnVuY3Rpb24gKGksIHZhbCkgewoJCQkJCS8vYW5zd2VyQ29udGFpbmVyLmFwcGVuZCAoJCgnPGlucHV0PicpLnZhbCh2YWwpLmFkZENsYXNzKCdkaWFsb2dKYnRuJykuYXR0cigndHlwZScsICdidXR0b24nKSkKCQkJCQkvLwkuYXBwZW5kICgnICcpOwoKCQkJCQkvLyDkuIvpnaLov5nkuKrnmoTmjInpkq7mnInok53oibLmoLflvI8KCQkJCQlhbnN3ZXJDb250YWluZXIKCQkJCQkJLmFwcGVuZCAoCgkJCQkJCQkkKCc8YT4nKS5hZGRDbGFzcygndWlfYnRuIHVpX2J0bl9tJykuYXBwZW5kKCQoJzxzcGFuPicpLmFwcGVuZCgnPGVtPicpLnRleHQodmFsKSkKCQkJCQkJCQkuY2xpY2sgKGZ1bmN0aW9uICgpIHsKCQkJCQkJCQkJaWYgKGZhbHNlICE9PSBjYWxsYmFjay5jYWxsKHRoaXMsIGksIF8kZGlhbG9nKSkKCQkJCQkJCQkJCV8kZGlhbG9nLmNsb3NlKCk7CgkJCQkJCQkJfSkKCQkJCQkJKTsKCQkJCX0pOwoKCQkJCV8kZGlhbG9nLmJ1dHRvbnMgPSAkKCJpbnB1dCIsIGFuc3dlckNvbnRhaW5lcik7CgkJCX0KCQkJXyRkaWFsb2cuc2V0UG9zaXRpb24oKTsKCgkJCWlmIChvcHRzLnNob3cpCgkJCQlfJGRpYWxvZy5zaG93KCk7CgkJCXJldHVybiBfJGRpYWxvZzsKCQl9LAoKCQkvKioKCQkgKiDmmL7npLrkuIDmnaHorablkYrmoYYKCQkgKiBAcGFyYW0gbWVzc2FnZSAgICAgICAgICAg6K2m5ZGK5raI5oGvCgkJICogQHBhcmFtIFtvcHRzXSAgICAgICAgICAgICRtb2RhbCAvICRkaWFsb2cg5Y+C5pWwCgkJICogQHBhcmFtIG9wdHMuYWNjZXB0VmFsdWUg44CM56Gu5a6a44CN5oyJ6ZKu5qCH6aKYCgkJICogQHJldHVybnMgeyRkaWFsb2d9CgkJICovCgkJYWxlcnQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBvcHRzKSB7CgkJCXZhciBleHRPcHRzID0gJC5leHRlbmQoe30sIG9wdHMgfHwge30pOwoJCQlyZXR1cm4gJGRpYWxvZy5hc2sobWVzc2FnZSwgW2V4dE9wdHMuYWNjZXB0VmFsdWUgfHwgIuehruWumiJdLCBmdW5jdGlvbiAoZSwgdCkgewoJCQkJcmV0dXJuIHQuZWxlbWVudC50cmlnZ2VySGFuZGxlcihsc3RFdmVudHNbZV0sIHRoaXMpCgkJCX0sIGV4dE9wdHMpCgkJfSwKCgkJLyoqCgkJICog5pi+56S65LiA5Liq56Gu6K6k5qGGCgkJICogQHBhcmFtIG1lc3NhZ2UgICAgICAgICAgIOehruiupOeahOa2iOaBrwoJCSAqIEBwYXJhbSBbb3B0c10gICAgICAgICAgICAkbW9kYWwgLyAkZGlhbG9nIOWPguaVsAoJCSAqIEBwYXJhbSBvcHRzLmFjY2VwdFZhbHVlICDjgIznoa7lrprjgI3mjInpkq7moIfpopgKCQkgKiBAcmV0dXJucyB7JGRpYWxvZ30KCQkgKi8KCQljb25maXJtOiBmdW5jdGlvbiAobWVzc2FnZSwgb3B0cykgewoJCQl2YXIgZXh0T3B0cyA9ICQuZXh0ZW5kKHt9LCBvcHRzIHx8IHt9KTsKCQkJcmV0dXJuICRkaWFsb2cuYXNrKG1lc3NhZ2UsIFtleHRPcHRzLmFjY2VwdFZhbHVlIHx8ICLnoa7lrpoiLCBleHRPcHRzLmNhbmNlbFZhbHVlIHx8ICLlj5bmtogiXSwgZnVuY3Rpb24gKGUsIHQpIHsKCQkJCXJldHVybiB0LmVsZW1lbnQudHJpZ2dlckhhbmRsZXIobHN0RXZlbnRzW2VdLCB0aGlzKQoJCQl9LCBleHRPcHRzKQoJCX0sCgoJCS8qKgoJCSAqIOaYvuekuuS4gOS4quWumuaXtuitpuWRiuahhgoJCSAqIEBwYXJhbSBtZXNzYWdlICAgICAgICAgICAgICAg5pi+56S655qE5raI5oGvCgkJICogQHBhcmFtIGNhbGxiYWNrICAgICAgICAgICAgICDlm57osIMsIOaXoOWPguaVsAoJCSAqIEBwYXJhbSBbb3B0c10gICAgICAgICAgICAgICAg5Y+C5pWw6ZuG5ZCICgkJICogQHBhcmFtIG9wdHMuYWNjZXB0VmFsdWUgICAgICDjgIznoa7lrprjgI3mjInpkq7moIfpopgKCQkgKiBAcGFyYW0ge0Jvb2xlYW59IG9wdHMuYnV0dG9uIOaYr+WQpuaYvuekuuehruWumuaMiemSrgoJCSAqIEBwYXJhbSBvcHRzLnRpbWUgICAgICAgICAgICAg562J5b6F5pe26ZW/CgkJICogQHJldHVybnMgeyp9CgkJICovCgkJYXNzZXJ0OiBmdW5jdGlvbiAobWVzc2FnZSwgY2FsbGJhY2ssIG9wdHMpIHsKCQkJdmFyIGV4dE9wdHMgPSAkLmV4dGVuZCh7YnV0dG9uOiB0cnVlfSwgb3B0cyB8fCB7fSk7CgoJCQlpZiAoMiA9PSBhcmd1bWVudHMubGVuZ3RoKSB7CgkJCQlleHRPcHRzID0gY2FsbGJhY2s7CgkJCQljYWxsYmFjayA9ICQubm9vcDsKCQkJfQoKCQkJdmFyICRkaWFsb2dBc2sgPSAkZGlhbG9nLmFzaygKCQkJCQltZXNzYWdlLAoJCQkJCWV4dE9wdHMuYnV0dG9uID8gW2V4dE9wdHMuYWNjZXB0VmFsdWUgfHwgIuehruWumiJdIDogW10sCgkJCQkJZnVuY3Rpb24gKGksICRkaWFsb2cpIHsKCQkJCQkJcmV0dXJuICRkaWFsb2cuZWxlbWVudC50cmlnZ2VySGFuZGxlcihsc3RFdmVudHNbaV0sIHRoaXMpCgkJCQkJfSwKCQkJCQlleHRPcHRzCgkJCQkpOwoKCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CgkJCQlpZiAoJGRpYWxvZ0FzayAmJiAkZGlhbG9nQXNrLmNsb3NlKQoJCQkJCSRkaWFsb2dBc2suY2xvc2UoKTsKCgkJCQlpZiAoY2FsbGJhY2spCgkJCQkJY2FsbGJhY2soKTsKCgkJCX0sIHBhcnNlSW50KGV4dE9wdHMudGltZSkgfHwgMjAwMCk7CgoJCQlyZXR1cm4gJGRpYWxvZ0FzazsKCQl9LAoKCQkvKioKCQkgKiDov5znq6/liqDovb3kuIDkuKrpobXpnaLlubbmmL7npLrlhbblhoXlrrkKCQkgKiBAcGFyYW0gdXJsICAgICAgICAgICDnm67moIflnLDlnYAKCQkgKiBAcGFyYW0gb3B0cyAgICAgICAgICDpgInpobkKCQkgKiBAcGFyYW0gb3B0cy5maWx0ZXIgICDpobXpnaLlhoXlrrnpgInmi6nlmagKCQkgKiBAcGFyYW0gb3B0cy5jYWNoZSAgICDlj4Lop4EgalF1ZXJ5LmFqYXgKCQkgKiBAcGFyYW0gb3B0cy50eXBlICAgICDlj4Lop4EgalF1ZXJ5LmFqYXgKCQkgKiBAcmV0dXJucyB7JGRpYWxvZ30KCQkgKi8KCQlsb2FkOiBmdW5jdGlvbiAodXJsLCBvcHRzKSB7CgkJCW9wdHMgPSBvcHRzIHx8IHt9OwoJCQl2YXIgXyRkaWFsb2cgPSBuZXcgJGRpYWxvZyhvcHRzKTsKCQkJdmFyIHJlcXVlc3RPYmogPSB7CgkJCQl1cmw6IHVybCwKCQkJCXR5cGU6ICJHRVQiLAoJCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJCWNhY2hlOiBmYWxzZSwKCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uIChodG1sKSB7CgkJCQkJaWYgKG9wdHMuZmlsdGVyKQoJCQkJCQlodG1sID0gJChvcHRzLmZpbHRlciwgaHRtbCk7CgoJCQkJCV8kZGlhbG9nLnNldENvbnRlbnQoaHRtbCk7CgkJCQl9CgkJCX07CgoJCQkkLmVhY2goWyJ0eXBlIiwgImNhY2hlIl0sIGZ1bmN0aW9uIChpLCBzdHIpIHsKCQkJCWlmIChvcHRzLmhhc093blByb3BlcnR5KHN0cikpIHsKCQkJCQlyZXF1ZXN0T2JqW3N0cl0gPSBvcHRzW3N0cl07CgkJCQkJZGVsZXRlIG9wdHNbc3RyXTsKCQkJCX0KCQkJfSk7CgoJCQkkLmFqYXgocmVxdWVzdE9iaik7CgkJCXJldHVybiBfJGRpYWxvZzsKCQl9LAoKCQkvKioKCQkgKiDlhbPpl63miYDmnInlvIDlkK/nmoTlr7nor53moYYKCQkgKi8KCQljbG9zZTogZnVuY3Rpb24gKCkgewoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuSU5TVC5sZW5ndGg7IGkrKykgewoJCQkJLy8g5aaC5p6c5ouS57ud5YWz6ZetLCBpLS0g54S25ZCO57un57ut5p6a5Li+5YWz6Zet6L+H56iLCgkJCQlpZiAoZmFsc2UgIT09IHRoaXMuSU5TVFtpXS5jbG9zZSgpKSB7CgkJCQkJaS0tOwoJCQkJfQoJCQl9CgkJfSwKCgkJc2V0dGluZzogewoJCQltb2RhbDogdHJ1ZSwKCQkJc2hvd1NoYWRvdzogdHJ1ZSwKCQkJc2hvd1RpdGxlOiB0cnVlLAoJCQlub1RpdGxlOiBmYWxzZSwKCgkJCS8vIOm7mOiupCA0MDAgeCA4MAoJCQl3aWR0aDogNDAwLAoJCQloZWlnaHQ6IDgwLAoJCQlmaXhlZDogdHJ1ZSwKCQkJbGVmdDogbnVsbCwKCQkJdG9wOiBudWxsLAoJCQlzaG93OiB0cnVlLAoJCQljbG9zZWFibGU6IHRydWUsCgkJCWhpZGVPbmNsb3NlOiBmYWxzZSwKCQkJZHJhZ2dhYmxlOiB0cnVlLAoJCQljb250ZW50VHlwZTogbnVsbCwKCQkJcmVzaXplYWJsZTogZmFsc2UsCgkJCWNsb3NlVGlwczogbnVsbCwKCQkJZXNjYWJsZTogdHJ1ZSwKCQkJc2Nyb2xsYWJsZTogdHJ1ZSwKCQkJbW9kYWxDbGFzc05hbWU6IG51bGwsCgkJCWF1dG9DZW50ZXI6IHRydWUsCgkJCWh0bWw6IG51bGwsCgkJCW1pbldpZHRoOiAyMDAsCgkJCW1pbkhlaWdodDogMTAwLAoJCQltYXhXaWR0aDogbnVsbCwKCQkJbWF4SGVpZ2h0OiBudWxsCgkJfQoJfSk7CgoJJGRpYWxvZy5wcm90b3R5cGUgPSB7CgkJY29uc3RydWN0b3I6ICRkaWFsb2csCgoJCS8qKgoJCSAqIOaTpumZpOWOn+Wni+agh+mimOW5tuiuvuWumuaWsOagh+mimAoJCSAqIOWPr+S7peS4uiBqUXVlcnkg5a+56LGh44CBRE9NIOWvueixoQoJCSAqIEBwYXJhbSBuZXdUaXRsZQoJCSAqLwoJCXNldFRpdGxlOiBmdW5jdGlvbiAobmV3VGl0bGUpIHsKCQkJdGhpcy5lbGVtZW50LmZpbmQoIi5kaWFsb2dKdGl0bGU+c3Bhbi5kaWFsb2dKdHh0IikuaHRtbChuZXdUaXRsZSB8fCAiIik7CgkJfSwKCgkJLyoqCgkJICog5pOm6Zmk5Y6f5aeL5YaF5a655bm26K6+5a6a5paw5YaF5a65CgkJICog5Y+v5Lul5Li6IGpRdWVyeSDlr7nosaHjgIFET00g5a+56LGhCgkJICogQHBhcmFtIG5ld0NvbnRlbnQKCQkgKi8KCQlzZXRDb250ZW50OiBmdW5jdGlvbiAobmV3Q29udGVudCkgewoJCQluZXdDb250ZW50ICYmIHRoaXMuZWxlbWVudC5maW5kKCIuZGlhbG9nSmJvZHkiKS5odG1sKG5ld0NvbnRlbnQpOwoJCX0sCgoJCS8qKgoJCSAqIOiuvuWumuaWsOWuveW6pgoJCSAqIEBwYXJhbSBuZXdXaWR0aAoJCSAqIEByZXR1cm5zIHsqfQoJCSAqLwoJCXdpZHRoOiBmdW5jdGlvbiAobmV3V2lkdGgpIHsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudC5jc3MoIndpZHRoIiwgbmV3V2lkdGgpOwoJCX0sCgoJCS8qKgoJCSAqIOiuvuWumuaWsOmrmOW6pgoJCSAqIEBwYXJhbSBuZXdIZWlnaHQKCQkgKiBAcmV0dXJucyB7Kn0KCQkgKi8KCQloZWlnaHQ6IGZ1bmN0aW9uIChuZXdIZWlnaHQpIHsKCQkJcmV0dXJuICQoIi5kaWFsb2dKYm9keSIsIHRoaXMuZWxlbWVudCkuY3NzKCJoZWlnaHQiLCBuZXdIZWlnaHQpOwoJCX0sCgoJCS8qKgoJCSAqIOiuvuWumuWvueivneahhuS9jee9rgoJCSAqIEBwYXJhbSBbbGVmdF0g5bem6L65LCDnlZnnqbrlsYXkuK0KCQkgKiBAcGFyYW0gW3RvcF0gIOWPs+i+uSwg55WZ56m65bGF5LitCgkJICovCgkJc2V0UG9zaXRpb246IGZ1bmN0aW9uIChsZWZ0LCB0b3ApIHsKCQkJaWYgKCEkLmlzTnVtZXJpYyhsZWZ0KSAmJiAhJC5pc051bWVyaWModG9wKSkgewoJCQkJdmFyICRkb2MgPSAkKGRvY3VtZW50KSwKCQkJCQkkd2luID0gJCh1bnNhZmVXaW5kb3cpLAoJCQkJCW5ld1Bvc09mZnNldCA9IHRoaXMuY2ZnLmZpeGVkID8gWzAsIDBdIDogWyRkb2Muc2Nyb2xsTGVmdCgpLCAkZG9jLnNjcm9sbFRvcCgpXTsKCgkJCQlsZWZ0ID0gbmV3UG9zT2Zmc2V0IFswXSArICgkd2luLndpZHRoKCkgIC0gdGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSApIC8gMjsKCQkJCXRvcCAgPSBuZXdQb3NPZmZzZXQgWzFdICsgKCR3aW4uaGVpZ2h0KCkgLSB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSkgLyAyOwoKCQkJCWlmICh0b3AgPCAwKSB0b3AgPSAwOwoJCQl9CgoJCQl0aGlzLmVsZW1lbnQuY3NzKHsKCQkJCWxlZnQ6IGxlZnQsCgkJCQl0b3A6IHRvcAoJCQl9KTsKCgkJCXRoaXMudHJpZ2dlckhhbmRsZXIoInJlc2l6ZSIpOwoJCX0sCgkJLyoqCgkJICog6I635Y+W5qCH6aKYIChIVE1MKQoJCSAqIEByZXR1cm5zIHtTdHJpbmd9CgkJICovCgkJZ2V0VGl0bGU6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCIuZGlhbG9nSnRpdGxlPnNwYW4iKS5odG1sKCk7CgkJfSwKCQkvKioKCQkgKiDojrflj5bmoIfpopjmlofmnKwKCQkgKiBAcmV0dXJucyB7U3RyaW5nfQoJCSAqLwoJCWdldFRpdGxlVGV4dDogZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIi5kaWFsb2dKdGl0bGUiKS50ZXh0KCk7CgkJfSwKCgkJLyoqCgkJICog6I635Y+W5a+56K+d5qGG5YaF5a65IChIVE1MKQoJCSAqIEByZXR1cm5zIHtTdHJpbmd9CgkJICovCgkJZ2V0Q29udGVudDogZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gJCgiLmRpYWxvZ0pib2R5IiwgdGhpcy5lbGVtZW50KS5odG1sKCkKCQl9LAoJCS8qKgoJCSAqIOiOt+WPluWvueivneahhuWGheWuuQoJCSAqIEByZXR1cm5zIHtTdHJpbmd9CgkJICovCgkJZ2V0Q29udGVudFRleHQ6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuICQoIi5kaWFsb2dKYm9keSIsIHRoaXMuZWxlbWVudCkudGV4dCgpCgkJfSwKCgkJLyoqCgkJICog5pi+56S65a+56K+d5qGGCgkJICovCgkJc2hvdzogZnVuY3Rpb24gKCkgewoJCQl0aGlzLmVsZW1lbnQuc2hvdy5hcHBseSh0aGlzLmVsZW1lbnQsIGFyZ3VtZW50cyk7CgoJCQlpZiAodGhpcy5tb2RhbCkgewoJCQkJdGhpcy5tb2RhbC5jZmcuc2FmZXR5ID0gdGhpcy5lbGVtZW50OwoJCQkJdGhpcy5tb2RhbC5zaG93LmFwcGx5KHRoaXMubW9kYWwsIGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQkvKioKCQkgKiDpmpDol4/lr7nor53moYYKCQkgKiBAcmV0dXJucyB7Ym9vbGVhbn0KCQkgKi8KCQloaWRlOiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLmVsZW1lbnQudHJpZ2dlckhhbmRsZXIoIm9uaGlkZSIpID09PSBmYWxzZSkKCQkJCXJldHVybiBmYWxzZTsKCgkJCXRoaXMuZWxlbWVudC5oaWRlLmFwcGx5KHRoaXMuZWxlbWVudCwgYXJndW1lbnRzKTsKCQkJaWYgKHRoaXMubW9kYWwpCgkJCQl0aGlzLm1vZGFsLmhpZGUuYXBwbHkodGhpcy5tb2RhbCwgYXJndW1lbnRzKTsKCgkJCXJldHVybiB0cnVlOwoJCX0sCgoJCS8qKgoJCSAqIOiOt+WPluWvueivneahhiBET00g5YWD57SgCgkJICogQHJldHVybnMge0hUTUxFbGVtZW50fQoJCSAqLwoJCWdldEVsZW1lbnQ6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudFswXTsKCQl9LAoKCQkvKioKCQkgKiDnu5Hlrprkuovku7YKCQkgKiBAcmV0dXJucyB7JGRpYWxvZ30KCQkgKi8KCQliaW5kOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuZWxlbWVudC5vbi5hcHBseSh0aGlzLmVsZW1lbnQsIGFyZ3VtZW50cyk7CgkJCXJldHVybiB0aGlzOwoJCX0sCgoJCS8qKgoJCSAqIOinpuWPkeS6i+S7tgoJCSAqLwoJCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuZWxlbWVudC50cmlnZ2VySGFuZGxlci5hcHBseSh0aGlzLmVsZW1lbnQsIGFyZ3VtZW50cyk7CgkJfSwKCgkJLyoqCgkJICog6I635Y+W5oyJ6ZKuCgkJICogQHJldHVybnMge0FycmF5fHVuZGVmaW5lZH0KCQkgKi8KCQlnZXRCdXR0b25zOiBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiB0aGlzLmJ1dHRvbnM7CgkJfSwKCgkJLyoqCgkJICog5YaF6YOo5Ye95pWwOiDorr7lrprml6DmoIfpopjlr7nor53moYYKCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCV9zZXR1cE5vVGl0bGU6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKHRoaXMuY2ZnLm5vVGl0bGUpIHsKCQkJCSQoIi5kaWFsb2dKdGl0bGUiKS5jc3MoewoJCQkJCSJib3JkZXItYm90dG9tIjogMCwKCQkJCQkiYmFja2dyb3VuZC1jb2xvciI6ICIjZmZmIgoJCQkJfSk7CgkJCX0KCQl9LAoKCQkvKioKCQkgKiDlhoXpg6jlh73mlbA6IOiuvuWumuWvueivneahhuagh+mimOagjwoJCSAqIEBwcml2YXRlCgkJICovCgkJX3NldHVwVGl0bGVCYXI6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKHRoaXMuY2ZnLnNob3dUaXRsZSkgewoJCQkJdmFyIHRoYXQgPSB0aGlzOwoJCQkJdmFyIHRpdGxlQmFyID0gdGhhdC50aXRsZUJhciA9CgkJCQkJJCgnPGRpdj4nKS5hcHBlbmQoCgkJCQkJCSQoJzxzcGFuPicpLmFkZENsYXNzKCdkaWFsb2dKdHh0JykKCQkJCQkpLmFkZENsYXNzKCdkaWFsb2dKdGl0bGUnKQoJCQkJCS5hcHBlbmRUbyh0aGlzLmVsZW1lbnRXcmFwcGVyKTsKCgkJCQlpZiAodGhpcy5jZmcuY2xvc2VhYmxlKSB7CgkJCQkJJCgnPGE+JykuYWRkQ2xhc3MoJ2RpYWxvZ0pjbG9zZScpLmF0dHIoewoJCQkJCQl0aXRsZTogdGhpcy5jZmcuY2xvc2VUaXBzIHx8ICLlhbPpl63mnKznqpflj6MiLAoJCQkJCQlocmVmOiAgJyMnCgkJCQkJfSkudGV4dCgnICcpLmFwcGVuZFRvKHRpdGxlQmFyKQoJCQkJCS5vbiAoJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7CgkJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJfSkuY2xpY2soZnVuY3Rpb24gKCkgewoJCQkJCQlpZiAodGhhdC5jZmcuaGlkZU9uY2xvc2UpIHsKCQkJCQkJCXRoYXQuaGlkZSgpCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQl0aGF0LmNsb3NlKCk7CgkJCQkJCX0KCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0pOwoKCQkJCQlpZiAodGhpcy5jZmcuZHJhZ2dhYmxlKSB7CgkJCQkJCXRpdGxlQmFyLmNzcyAoewoJCQkJCQkJY3Vyc29yOiAnbW92ZScKCQkJCQkJfSk7CgoJCQkJCQl2YXIgX3JtRHJhZyA9ICQodGhhdC5lbGVtZW50KS5kcmFnZ2FibGUoewoJCQkJCQkJaGFuZGxlOiB0aXRsZUJhciwKCQkJCQkJCXN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJCQkJCQkJdGhhdC5fc2V0dXBIYWNrRGl2KDEpCgkJCQkJCQl9LAoJCQkJCQkJc3RvcDogZnVuY3Rpb24gKCkgewoJCQkJCQkJCXRoYXQuZHJhZ2dlZCA9IHRydWU7CgkJCQkJCQkJdGhhdC5fc2V0dXBIYWNrRGl2KDApOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQkJJCh0aGF0LmVsZW1lbnQpLm9uKCJvbmNsb3NlIiwgX3JtRHJhZyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSwKCgkJX3NldHVwSGFja0RpdjogZnVuY3Rpb24gKGJTaG93SGFja0RpdikgewoJCQl2YXIgXyRkaWFsb2cgPSB0aGlzOwoJCQlpZiAoYlNob3dIYWNrRGl2KSB7CgkJCQlpZiAoJCgiSUZSQU1FIiwgXyRkaWFsb2cuZWxlbWVudCkubGVuZ3RoKSB7CgkJCQkJdmFyICRjb250ZW50ID0gJCgiLmRpYWxvZ0pjb250ZW50IiwgXyRkaWFsb2cuZWxlbWVudCk7CgkJCQkJaWYgKCFfJGRpYWxvZy5oYWNrX2RpdikgewoJCQkJCQlfJGRpYWxvZy5oYWNrX2RpdiA9ICQoIjxkaXY+IikuYXBwZW5kVG8oJGNvbnRlbnQpLmNzcyh7CgkJCQkJCQlwb3NpdGlvbjogImFic29sdXRlIiwKCQkJCQkJCWxlZnQ6IDAsCgkJCQkJCQl0b3A6IDAsCgkJCQkJCQljdXJzb3I6ICJtb3ZlIgoJCQkJCQl9KTsKCQkJCQl9CgkJCQkJXyRkaWFsb2cuaGFja19kaXYuc2hvdygpLmNzcyh7CgkJCQkJCXdpZHRoOiAgXyRkaWFsb2cuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCQkJCWhlaWdodDogXyRkaWFsb2cuZWxlbWVudC5vdXRlckhlaWdodCgpCgkJCQkJfSkKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmIChfJGRpYWxvZy5oYWNrX2RpdikKCQkJCQlfJGRpYWxvZy5oYWNrX2Rpdi5oaWRlICgpOwoJCQl9CgkJfSwKCgkJX3NldHVwRXNjS2V5OiBmdW5jdGlvbiAoKSB7CgkJCXZhciAkdGhhdCA9IHRoaXM7CgoJCQl2YXIgX2VzY0tleUNiID0gZnVuY3Rpb24gKG4pIHsKCQkJCS8vIEVTQyAtIDB4MWIKCQkJCWlmICgweDFiID09IG4ud2hpY2gpIHsKCQkJCQlpZiAoJHRoYXQuc2hvd1RpdGxlKSB7CgkJCQkJCSQoIi5kaWFsb2dKY2xvc2UiLCAkdGhhdC50aXRsZUJhcikudHJpZ2dlckhhbmRsZXIoImNsaWNrIikKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhhdC5jbG9zZSgpOwoJCQkJCX0KCQkJCX0KCQkJfTsKCgkJCSQoZG9jdW1lbnQpLm9uKCJrZXlkb3duIiwgX2VzY0tleUNiKTsKCQkJJCgkdGhhdC5lbGVtZW50KS5vbigib25jbG9zZSIsIGZ1bmN0aW9uICgpIHsKCQkJCSQoZG9jdW1lbnQpLm9mZigia2V5ZG93biIsIF9lc2NLZXlDYikKCQkJfSk7CgkJfSwKCgkJX3NldHVwQ29udGVudDogZnVuY3Rpb24gKCkgewoJCQl0aGlzLmVsZW1lbnRXcmFwcGVyLmFwcGVuZCgKCQkJCSQoJzxkaXY+JykuYWRkQ2xhc3MoJ2RpYWxvZ0pjb250ZW50JykuYXBwZW5kKAoJCQkJCSQoJzxkaXY+JykuYWRkQ2xhc3MoJ2RpYWxvZ0pib2R5JykpKTsKCQl9LAoKCQlfc2V0U2Nyb2xsOiBmdW5jdGlvbiAoYlNldFNjcm9sbCkgewoJCQlpZiAodGhpcy5jZmcubW9kYWwgJiYgIXRoaXMuY2ZnLnNjcm9sbGFibGUpIHsKCQkJCXZhciBodG1sUm9vdCA9ICQoImh0bWwiKTsKCQkJCWlmIChodG1sUm9vdC5sZW5ndGgpIHsKCQkJCQl2YXIgaSA9IGh0bWxSb290WzBdLnNjcm9sbFRvcDsKCQkJCQlpZiAoYlNldFNjcm9sbCkgewoJCQkJCQlodG1sUm9vdC5jc3MoewoJCQkJCQkJb3ZlcmZsb3c6IHRoaXMuZWxlbWVudC5kYXRhKCJodG1sT3ZlcmZsb3ciKSB8fCAiIiwKCQkJCQkJCXBhZGRpbmdSaWdodDogMAoJCQkJCQl9KTsKCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoaHRtbFJvb3RbMF0uc3R5bGUub3ZlckZsb3cpIHsKCQkJCQkJCXRoaXMuZWxlbWVudC5kYXRhKCJodG1sT3ZlcmZsb3ciLCBodG1sUm9vdFswXS5zdHlsZS5vdmVyRmxvdyk7CgkJCQkJCX0KCgkJCQkJCWh0bWxSb290LmNzcyh7CgkJCQkJCQlvdmVyZmxvdzogImhpZGRlbiIsCgkJCQkJCQlwYWRkaW5nUmlnaHQ6IDE3CgkJCQkJCX0pCgkJCQkJfQoKCQkJCQlodG1sUm9vdFswXS5zY3JvbGxUb3AgPSBpCgkJCQl9CgkJCX0KCQl9Cgl9OwoKCSQuZWFjaChsc3RFdmVudHMsIGZ1bmN0aW9uIChlLCB0KSB7CgkJJGRpYWxvZy5wcm90b3R5cGVbdF0gPSBmdW5jdGlvbiAoZSkgewoJCQl0aGlzLm9uKHQsIGUpCgkJfQoJfSk7CgkkZGlhbG9nLklOU1QgPSBbXTsKCSQuZGlhbG9nID0gJGRpYWxvZzsKfSkoalF1ZXJ5KTs="},{"meta":{"name":"Interval_Looper.js","url":"https://greasyfork.org/scripts/3588/code/Interval_Looper.js","ts":1600392377882,"mimetype":"text/javascript"},"source":"Ly8gSW50ZXJ2YWwgTG9vcGVyIGJ5IEppeHVuOgovLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9KaXh1bk1vZS9jNzdiYjM5MzZhNjg5OTdmY2UyMgoKdmFyIEludGVydmFsTG9vcCA9IGZ1bmN0aW9uIChhcnJEYXRhLCBsb29wZXIsIGRlbGF5KSB7CglpZiAoISh0aGlzIGluc3RhbmNlb2YgSW50ZXJ2YWxMb29wKSkKCQlyZXR1cm4gbmV3IEludGVydmFsTG9vcCAoYXJyRGF0YSwgbG9vcGVyLCBkZWxheSk7CiAKCS8qKgoJICogU3RhdHVzCgkgKiBAdHlwZSBOdW1iZXIKCSAqIDA6IOW+queOr+acquW8gOWniwoJICogMTog5q2j5Zyo5b6q546vCgkgKiAyOiDlvqrnjq/nu5PmnZ8KCSAqLwoJdGhpcy5zdGF0dXMgPSAwOwoJdGhpcy5uZXh0ID0gdGhpcy5fbmV4dC5iaW5kICh0aGlzKTsKCXRoaXMuaW5kZXggPSAwOwogCgl0aGlzLnNldERlbGF5IChkZWxheSB8fCA1MCk7Cgl0aGlzLmRhdGEgPSAoYXJyRGF0YSBpbnN0YW5jZW9mIEFycmF5KSA/IGFyckRhdGEgOiBbXTsKCXRoaXMuc2V0TG9vcGVyIChsb29wZXIpOwp9OwogCkludGVydmFsTG9vcC5wcm90b3R5cGUgPSB7CglfZ2V0RGVsYXk6IGZ1bmN0aW9uICgpIHsKCQlpZiAoIXRoaXMuZGVsYXkpCgkJCXJldHVybiA1MDsKIAoJCWlmICh0aGlzLmRlbGF5LmFwcGx5KQoJCQlyZXR1cm4gdGhpcy5kZWxheSgpOwogCgkJcmV0dXJuIHRoaXMuZGVsYXk7Cgl9LAoJX25leHQ6IGZ1bmN0aW9uICgpIHsKCQkvLyDnirbmgIHmlLnkuLog6L+b6KGM5LitCgkJdGhpcy5zdGF0dXMgPSAxOwoJCWlmICh0aGlzLmluZGV4IDwgdGhpcy5kYXRhLmxlbmd0aCkgewoJCQlzZXRUaW1lb3V0ICh0aGlzLmxvb3Blci5iaW5kKHRoaXMsIHRoaXMuZGF0YVt0aGlzLmluZGV4XSksIHRoaXMuZGVsYXkpOwoJCQl0aGlzLmluZGV4ICsrOwoJCQlpZiAodGhpcy5vblByb2dyZXNzICYmIHRoaXMub25Qcm9ncmVzcy5hcHBseSkgewoJCQkJdHJ5IHsKCQkJCQl0aGlzLm9uUHJvZ3Jlc3MgKHRoaXMuaW5kZXgsIHRoaXMuZGF0YS5sZW5ndGgpOwoJCQkJfSBjYXRjaCAoZSkgewoJCQkJCWNvbnNvbGUuZXJyb3IgKCdFcnJvciB3aGlsZSBjYWxsYmFjayB0byBgb25Qcm9ncmVzc2AnKTsKCQkJCQljb25zb2xlLmVycm9yIChlKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXRoaXMuc3RhdHVzID0gMjsKCQkJaWYgKHRoaXMub25Db21wbGV0ZSAmJiB0aGlzLm9uQ29tcGxldGUuYXBwbHkpIHsKCQkJCXRyeSB7CgkJCQkJdGhpcy5vbkNvbXBsZXRlICh0aGlzLmRhdGEubGVuZ3RoKTsKCQkJCX0gY2F0Y2ggKGUpIHsKCQkJCQljb25zb2xlLmVycm9yICgnRXJyb3Igd2hpbGUgY2FsbGJhY2sgdG8gYG9uQ29tcGxldGVgJyk7CgkJCQkJY29uc29sZS5lcnJvciAoZSk7CgkJCQl9CgkJCX0KCQl9Cgl9LAoJY2xlYW51cDogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLnN0YXR1cyA9PSAyKSB7CgkJCS8vIOW3sue7j+eUqOi/h+eahOaVsOaNruWwsea4heaOieOAggoJCQl0aGlzLmRhdGEuc3BsaWNlKDAsIHRoaXMuaW5kZXgpOwoJCQl0aGlzLmluZGV4ID0gMDsKCQkJdGhpcy5zdGF0dXMgPSAwOwoJCX0KIAoJCXJldHVybiB0aGlzOwoJfSwKCWFkZDogZnVuY3Rpb24gKCkgewoJCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgewoJCQkvLyDlsIbmiYDmnInlj4LmlbDkvZzkuLrmlbDmja7mjqjlhaUgdGhpcy5kYXRhCgkJCWZvciAodmFyIGkgPSAwOyBpPGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKCQkJCXRoaXMuZGF0YS5wdXNoIChhcmd1bWVudHNbaV0pOwogCgkJCS8vIOaVtOS4que7hOW3sue7j+WujOe7k++8jOa4heeQhuWQjuiHquWKqOe7p+e7rQoJCQlpZiAodGhpcy5zdGF0dXMgPT0gMikKCQkJCXRoaXMuY2xlYW51cCgpLm5leHQoKTsKCQl9CiAKCQkvLyDov57plIEKCQlyZXR1cm4gdGhpczsKCX0sCglzZXREZWxheTogZnVuY3Rpb24gKG5ld0RlbGF5KSB7CgkJaWYgKG5ld0RlbGF5KSB0aGlzLmRlbGF5ID0gcGFyc2VJbnQgKG5ld0RlbGF5KTsKCQlyZXR1cm4gdGhpczsKCX0sCglzZXRMb29wZXI6IGZ1bmN0aW9uIChmb29DYWxsYmFjaykgewoJCWlmIChmb29DYWxsYmFjayAmJiBmb29DYWxsYmFjay5hcHBseSkKCQkJdGhpcy5sb29wZXIgPSBmb29DYWxsYmFjay5iaW5kKHRoaXMsIHRoaXMubmV4dCk7CiAKCQlyZXR1cm4gdGhpczsKCX0sCglsb29wOiBmdW5jdGlvbiAoKSB7CgkJaWYgKHRoaXMuc3RhdHVzID09IDApCgkJCS8vIOWwmuacquWQr+WKqCwg5LuO5aS05byA5aeLCgkJCXRoaXMubmV4dCAoKTsKIAoJCXJldHVybiB0aGlzOwoJfQp9Ow=="},{"meta":{"name":"gm2_port_v103.js","url":"https://greasyfork.org/scripts/2599/code/gm2_port_v103.js","ts":1600392377884,"mimetype":"text/javascript"},"source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdNIDIgcG9ydCAtIEZ1bmN0aW9uIE92ZXJyaWRlIEhlbHBlcgovLyBARGVzY3JpcHRpb24gTm90IHlldC4KLy8gQG5hbWVzcGFjZSAgIG9yZy5qaXh1bi5nbTIucG9ydAovLyBAdmVyc2lvbiAgICAgMS4wLjQKCi8vIHVuc2FmZVdpbmRvdyByZXF1aXJlZCB0byB1c2UgYGV4cG9ydEZ1bmN0aW9uYC4KLy8gQGdyYW50ICAgICAgIHVuc2FmZVdpbmRvdwoKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LXN0YXJ0Ci8vID09L1VzZXJTY3JpcHQ9PQoKLy8gQ2hlY2sgaWYgaXMgR00gMi54CmlmICh0eXBlb2YgZXhwb3J0RnVuY3Rpb24gPT0gJ3VuZGVmaW5lZCcpIHsKCS8vIEZvciBHTSAxLnggYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgc2hvdWxkIHdvcmsuCgl2YXIgZXhwb3J0RnVuY3Rpb24gPSAoZnVuY3Rpb24gKGZvbywgc2NvcGUsIGRlZkFzKSB7CgkJaWYgKGRlZkFzICYmIGRlZkFzLmRlZmluZUFzKSB7CgkJCXNjb3BlW2RlZkFzLmRlZmluZUFzXSA9IGZvbzsKCQl9CgkJcmV0dXJuIGZvbzsKCX0pLmJpbmQodW5zYWZlV2luZG93KTsKCgkvLyBXZWxsLi4gSXQncyBub3QgZ29pbmcgdG8gZG8gYW55dGhpbmcuCgl2YXIgY2xvbmVJbnRvID0gKGZ1bmN0aW9uIChvYmosIHNjb3BlLCBvcHQpIHsKCQlyZXR1cm4gb2JqOwoJfSkuYmluZCh1bnNhZmVXaW5kb3cpOwp9CgovKioKICogdW5zYWZlT2JqZWN0OgogKiBCYXNpY2FsbHkgY2xvbmVJbnRvIGJ1dCBjb3VsZCB3aXRob3V0IHNjb3BlIChEZWZhdWx0OiB1bnNhZmVXaW5kb3cpCiAqIAogKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgIE9iamVjdCB0byBwYXNzIHRocm91Z2gKICogQHBhcmFtICB7T2JqZWN0fSBzY29wZSBTY29wZSB3aGVyZSBvYmplY3QgaXMgZ29pbmcgdG8gYmUgYXBwbGllZC4KICogQHBhcmFtICB7T2JqZWN0fSBvcHQgICBPcHRpb25zCiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIGNsb25lZCBvYmplY3QuCiAqLwp2YXIgdW5zYWZlT2JqZWN0ID0gZnVuY3Rpb24gKG9iaiwgc2NvcGUsIG9wdCkgewoJcmV0dXJuIGNsb25lSW50byAob2JqLCBzY29wZSB8fCB1bnNhZmVXaW5kb3csIG9wdCB8fCB7fSk7Cn07CgovKioKICogdW5zYWZlRGVmaW5lRnVuY3Rpb24KICogQHBhcmFtICB7U3RyaW5nfSBmb29OYW1lIFRhcmdldCBuYW1lCiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmb28gICBUaGUgZnVuY3Rpb24gdG8gb3ZlcnJpZGUKICogQHBhcmFtICB7T2JqZWN0fSBzY29wZSAgIHVuc2FmZVdpbmRvdwogKiBAcmV0dXJuIHtGdW5jdGlvbn0gICAgICAgVGhlIHBsYWNlaG9sZGVyIGZ1bmN0aW9uIHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBjb250ZXh0LgogKi8KdmFyIHVuc2FmZURlZmluZUZ1bmN0aW9uID0gZnVuY3Rpb24gKGZvb05hbWUsIGZvbywgc2NvcGUpIHsKCS8vIEB0aHJvdyBUeXBlRXJyb3I6IGNhbid0IHJlZGVmaW5lIG5vbi1jb25maWd1cmFibGUgcHJvcGVydHkKCS8vIEB0aHJvdyBFcnJvcjogRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uCglyZXR1cm4gZXhwb3J0RnVuY3Rpb24gKGZvbywgc2NvcGUgfHwgdW5zYWZlV2luZG93LCB7ZGVmaW5lQXM6IGZvb05hbWV9KTsKfTsKCi8qKgogKiB1bnNhZmVPdmVyd3JpdGVGdW5jdGlvbgogKiBAcGFyYW0gIHtPYmplY3R9IGZvb01hcHBpbmcge25hbWU6IGZvb30KICogQHBhcmFtICB7T2JqZWN0fSBzY29wZSAgICAgIHVuc2FmZVdpbmRvdwogKiBAcGFyYW0gIHtTdHJpbmd9IHNjb3BlTmFtZSAgT3B0aW9uYWwsIHJlcXVpcmVkIGlmIHRhcmdldCBpcyBub3QgYHdpbmRvd2AuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIFRoZSB0YXJnZXQgaXMgd2luZG93LmFwaS54eHgsICcuYXBpJyB3b3VsZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdGhlIHNjb3BlTmFtZS4KICogQHJldHVybiB7SFRNTCBFbGVtZW50fSAgICAgIFNjcmlwdCBUYWcKICovCnZhciB1bnNhZmVPdmVyd3JpdGVGdW5jdGlvbiA9IGZ1bmN0aW9uIChmb29NYXBwaW5nLCBzY29wZSwgc2NvcGVOYW1lKSB7Cgl2YXIgYXJnTWFwcGluZyA9IHt9LCB0bXBOYW1lOwoKCS8vIE1hcHBpbmcgbmV3IHJhbmRvbSBuYW1lcy4KCWZvciAodmFyIHggaW4gZm9vTWFwcGluZykgewoJCWlmIChmb29NYXBwaW5nLmhhc093blByb3BlcnR5KHgpKSB7CgkJCXRyeSB7CgkJCQl0bXBOYW1lID0gJ3Vfd19mXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc2xpY2UoMikgKyArbmV3IERhdGUoKTsKCQkJCQoJCQkJLy8gRXhwb3J0IGZ1bmN0aW9uCgkJCQkvLyB1bnNhZmVEZWZpbmVGdW5jdGlvbiB3aWxsIHRha2UgY2FyZSBvZiBudWxsIHZhbHVlcy4KCQkJCXVuc2FmZURlZmluZUZ1bmN0aW9uICh0bXBOYW1lLCBmb29NYXBwaW5nW3hdLCBzY29wZSk7CgkJCQlhcmdNYXBwaW5nW3hdID0gdG1wTmFtZTsKCQkJfSBjYXRjaCAoZSkgewoJCQkJY29uc29sZS5lcnJvciAoJ0Vycm9yIGF0IGB1bnNhZmVPdmVyd3JpdGVgOicsIGUpOwoJCQl9CgkJfQoJfQoKCXZhciB0bXBTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICgnc2NyaXB0Jyk7Cgl0bXBTY3JpcHQudGV4dENvbnRlbnQgPSAnOygnKyAoZnVuY3Rpb24gKGosIHgpIHsKCQlmb3IgKHggaW4gaikKCQkJaWYgKGouaGFzT3duUHJvcGVydHkoeCkpCgkJCQkvLyBNYXAgZXZlcnl0aGluZy4KCQkJCS8vIElmIE9iamVjdCB3aXRoIGN1c3RvbSBmdW5jdGlvbiAvIEZ1bmN0aW9uIAoJCQkJLy8gcGFzc2VkIGluIGl0IHdpbGwgdGhyb3cgQ2xvbmVOb25SZWZsZWN0b3JzV3JpdGUuCgkJCQkvLyBVc2UgdW5zYWZlT3ZlcndyaXRlRnVuY3Rpb25TYWZlUHJveHkgaWYgeW91IG5lZWQgdG8gYnlwYXNzIHRoYXQuCgkJCQkvLyBIb3dldmVyLCBpdCdzIGdvaW5nIHRvIGJlIHNsb3dlci4KCQkJCXdpbmRvdy8qKi9beF0gPSB3aW5kb3cvKiovW2pbeF1dOwoJCQoJCS8vIFRPRE86IE1heWJlIHJlbW92ZSB0aGlzIHNjcmlwdCB0YWcgYWZ0ZXIgZmluaXNoPwoJfSkudG9TdHJpbmcoKS5yZXBsYWNlKC9cL1wqXCpcLy9nLCBzY29wZU5hbWUgPyBzY29wZU5hbWUgOiAnJykgKycpKCcgKyBKU09OLnN0cmluZ2lmeShhcmdNYXBwaW5nKSArICcpOyc7Cglkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkICh0bXBTY3JpcHQpOwoKCXJldHVybiB0bXBTY3JpcHQ7Cn07CgovKioKICogRXJyb3JVbnNhZmU6CiAqIEFuIGVycm9yIGNsYXNzIGZvciB1bnNhZmVPdmVyd3JpdGVGdW5jdGlvblNhZmVQcm94eS4KICogCiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lICAgIEVycm9yIE5hbWUKICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgRXJyb3IgTWVzc2FnZQogKi8KdmFyIEVycm9yVW5zYWZlID0gZnVuY3Rpb24gKG5hbWUsIG1lc3NhZ2UpIHsKCXJldHVybiBjbG9uZUludG8gKHsKCQluYW1lOiBuYW1lIHx8ICdFcnJvclVuc2FmZScsCgkJbWVzc2FnZTogbWVzc2FnZSB8fCAnVW5rbm93biBlcnJvci4nCgl9LCBzY29wZSB8fCB1bnNhZmVXaW5kb3cpOwp9OwoKLyoqCiAqIEVycm9yVW5zYWZlU3VjY2VzczoKICogQW4gRXJyb3IgQ2xhc3MgZm9yIHVuc2FmZU92ZXJ3cml0ZUZ1bmN0aW9uU2FmZVByb3h5LgogKiBJbmZvcm0gcHJveHkgdG8gZXhlY3V0ZSBvcmlnaW9uYWwgZnVuY3Rpb24gd2l0aCBpdHMgZnVsbCBhcmd1bWVudHMuCiAqIAogKiBAcGFyYW0ge1t0eXBlXX0gbWVzc2FnZSBbZGVzY3JpcHRpb25dCiAqIEBwYXJhbSB7W3R5cGVdfSBzY29wZSAgIFtkZXNjcmlwdGlvbl0KICovCnZhciBFcnJvclVuc2FmZVN1Y2Nlc3MgPSBmdW5jdGlvbiAobWVzc2FnZSwgc2NvcGUpIHsKCXJldHVybiBjbG9uZUludG8gKHsKCQluYW1lOiAnRXJyb3JVbnNhZmVTdWNjZXNzOiBQcm94eUZpbmlzaCcsCgkJc3VjY2VzczogdHJ1ZSwKCQltZXNzYWdlOiBtZXNzYWdlIHx8ICcnCgl9LCBzY29wZSB8fCB1bnNhZmVXaW5kb3cpOwp9OwoKLyoqCiAqIHVuc2FmZU92ZXJ3cml0ZUZ1bmN0aW9uU2FmZVByb3h5CiAqIFNpbWlsYXIgdG8gdW5zYWZlT3ZlcndyaXRlRnVuY3Rpb24sIGJ1dCBpdHMgYSBwcm94eSBpbnN0ZWFkLgogKiBJdCB3aWxsIHN0cmlwIGFsbCBmdW5jdGlvbnMgYmVmb3JlIHBhc3MgaW4gdG8gc2FuZGJveGVkIGZ1bmN0aW9uLgogKiBTbywgaXQgY2FuIHByZXZlbnQgQ2xvbmVOb25SZWZsZWN0b3JzV3JpdGUgZXJyb3IuCiAqIAogKiBAcGFyYW0gIHtbdHlwZV19IGZvb01hcHBpbmcgW2Rlc2NyaXB0aW9uXQogKiBAcGFyYW0gIHtbdHlwZV19IHNjb3BlICAgICAgW2Rlc2NyaXB0aW9uXQogKiBAcGFyYW0gIHtbdHlwZV19IHNjb3BlTmFtZSAgW2Rlc2NyaXB0aW9uXQogKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXQogKi8KdmFyIHVuc2FmZU92ZXJ3cml0ZUZ1bmN0aW9uU2FmZVByb3h5ID0gZnVuY3Rpb24gKGZvb01hcHBpbmcsIHNjb3BlLCBzY29wZU5hbWUpIHsKCXZhciBhcmdNYXBwaW5nID0ge30sIHRtcE5hbWU7CgoJLy8gTWFwcGluZyBuZXcgcmFuZG9tIG5hbWVzLgoJZm9yICh2YXIgeCBpbiBmb29NYXBwaW5nKSB7CgkJaWYgKGZvb01hcHBpbmcuaGFzT3duUHJvcGVydHkoeCkpIHsKCQkJdHJ5IHsKCQkJCXRtcE5hbWUgPSAndV93X2ZfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zbGljZSgyKSArICtuZXcgRGF0ZSgpOwoJCQkJCgkJCQkvLyBFeHBvcnQgZnVuY3Rpb24KCQkJCS8vIHVuc2FmZURlZmluZUZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mIG51bGwgdmFsdWVzLgoJCQkJdW5zYWZlRGVmaW5lRnVuY3Rpb24gKHRtcE5hbWUsIGZvb01hcHBpbmdbeF0sIHNjb3BlKTsKCQkJCWFyZ01hcHBpbmdbeF0gPSB0bXBOYW1lOwoJCQl9IGNhdGNoIChlKSB7CgkJCQljb25zb2xlLmVycm9yICgnRXJyb3IgYXQgYHVuc2FmZU92ZXJ3cml0ZWA6JywgZSk7CgkJCQlhbGVydCAoZSk7CgkJCX0KCQl9Cgl9CgoJdmFyIHRtcFNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgKCdzY3JpcHQnKTsKCXRtcFNjcmlwdC50ZXh0Q29udGVudCA9ICc7KCcrIChmdW5jdGlvbiAoaiwgeCkgewoJCWZvciAoeCBpbiBqKQoJCQlpZiAoai5oYXNPd25Qcm9wZXJ0eSh4KSkgewoJCQkJKGZ1bmN0aW9uICh4LCBiYWssIGZvbykgewoJCQkJCS8vIEFzc2lnbiB2YXJpYWJsZSB0byBvdXIgcHJveHkgZnVuY3Rpb24uCgkJCQkJd2luZG93LyoqL1t4XSA9IGZ1bmN0aW9uICgpIHsKCQkJCQkJLy8gY29uc29sZS5pbmZvIChhcmd1bWVudHMpOwoJCQkJCQlmb3IgKHZhciBpID0gMCwgeSwgYXJncyA9IFtdOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCQkvLyBBcnJheSAtIFN1cmUgd2UgY2FuIGhhbmRsZSB0aGlzIHJpZ2h0PwoJCQkJCQkJaWYgKGFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCQkJCQkJYXJncy5wdXNoIChhcmd1bWVudHNbaV0uc2xpY2UoKSk7CgkJCQkJCQl9IGVsc2UgaWYgKGFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIE9iamVjdCkgewoJCQkJCQkJCS8vIFN0cmlwIG9mZiBhbGwgcHJvdG90eXBlIGZ1bmN0aW9ucywgaWYgcG9zc2libGUuCgkJCQkJCQkJCgkJCQkJCQkJLy8gVE9ETzogbWF5YmUgdHJ5LWNhdGNoIHRoZSBmb2xsb3dpbmcgbGluZT8KCQkJCQkJCQlhcmdzLnB1c2ggKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkgKGFyZ3VtZW50c1tpXSkpKTsKCQkJCQkJCX0gZWxzZSBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgYXJndW1lbnRzW2ldKSB7CgkJCQkJCQkJLy8gRnVuY3Rpb24gY2FuJ3QgYmUgc2FuZGJveGllZCA6PAoJCQkJCQkJCWFyZ3MucHVzaCAobnVsbCk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCS8vIGlkay4uLiBzaG91bGQgYmUgc2FmZSB0byBwYXNzIHRocm91Z2g/CgkJCQkJCQkJYXJncy5wdXNoIChhcmd1bWVudHNbaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQl0cnkgewoJCQkJCQkJLy8gVHJ5IHRvIGNhbGwgb3VyIGZ1bmN0aW9uIQoJCQkJCQkJcmV0dXJuIGZvby5hcHBseSh0aGlzLCBhcmdzKTsKCQkJCQkJfSBjYXRjaCAoZXJyKSB7CgkJCQkJCQkvLyBXZSB0aHJvdyB0aGlzIGVycm9yIG9uIHB1cnBvc2UsCgkJCQkJCQkvLyBpZiB3ZSBuZWVkIHRvIGRvIHRoZSBjb21wbGV0ZSBjYWxsYmFjay4KCQkJCQkJCQoJCQkJCQkJLy8gSWYgdGhlIGVycm9yIGRvbidlIGhhdmUgc3VjY2VzcyBmbGFnLCB3ZSdsbCAKCQkJCQkJCS8vIHRocm93IHRoZSBlcnJvciB0byBjb25zb2xlLgoKCQkJCQkJCWlmICghZXJyLnN1Y2Nlc3MpIGNvbnNvbGUuZXJyb3IgKGVycik7CgkJCQkJCQlyZXR1cm4gYmFrLmFwcGx5ICh0aGlzLCBhcmd1bWVudHMpOwoJCQkJCQl9CgkJCQkJfTsKCQkJCX0pICh4LCB3aW5kb3cvKiovW3hdLCB3aW5kb3cvKiovW2pbeF1dKTsKCQkJfQoKCQkvLyBUT0RPOiBNYXliZSByZW1vdmUgdGhpcyBzY3JpcHQgdGFnIGFmdGVyIGZpbmlzaD8KCX0pLnRvU3RyaW5nKCkucmVwbGFjZSgvXC9cKlwqXC8vZywgc2NvcGVOYW1lID8gc2NvcGVOYW1lIDogJycpICsnKSgnICsgSlNPTi5zdHJpbmdpZnkoYXJnTWFwcGluZykgKyAnKTsnOwoJZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCAodG1wU2NyaXB0KTsKCglyZXR1cm4gdG1wU2NyaXB0Owp9OwoKLyoqCiAqIEV4ZWN1dGUgZnVuY3Rpb24gYW5vbnltb3VzbHkKICogQHBhcmFtICB7RnVuY3Rpb259IGZvbwogKiBAcGFyYW0gIHtBbnl9IEFueSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGluLgogKiBAcmV0dXJuIHtTY3JpcHROb2RlfQogKi8KdmFyIHVuc2FmZUV4ZWMgPSBmdW5jdGlvbiAoZm9vKSB7Cgl2YXIgdG1wU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAoJ3NjcmlwdCcpOwoKCS8vIE5vdyBzdXBwb3J0cyBhcmd1bWVudHMhCgl0bXBTY3JpcHQudGV4dENvbnRlbnQgPQoJCSc7KCcgKyBmb28gKyAnKS5hcHBseSAobnVsbCwgJyArCgkJCUpTT04uc3RyaW5naWZ5KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSkgKyAnKTsnOwoKCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQgKHRtcFNjcmlwdCk7CglyZXR1cm4gdG1wU2NyaXB0Owp9Ow=="}]},{"name":"Forum Grandmaster for Discuz!","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["self","cdn.jsdelivr.net","greasyfork.org"],"orig_excludes":[],"orig_includes":[],"orig_matches":["http*://www.52pojie.cn/","http*://www.chiphell.com/","http*://www.right.com.cn/","http*://bbs.kafan.cn/","http*://www.hostloc.com/","http*://bbs.pcbeta.com/","http*://www.zuanke8.com/","http*://bbs.51credit.com/","http*://bbs.ydss.cn/","http*://bbs.fobshanghai.com/","http*://bbs.huorong.cn/","http*://bbs.360.cn/","http*://www.gebi1.com/","http*://www.advertcn.com/","http*://www.fglt.net/","http*://www.fglt.cn/","http*://www.aihao.cc/","http*://bbs.nas66.com/","http*://keylol.com/*","http*://www.keylol.com/*","http*://www.viidii.info/?action=image&*","http*://www.viidii.info/?http*://*","http*://*/forum.php","http*://*/forum-*.html","http*://*/forumdisplay.php?*","http*://*/thread-*.html","http*://*/thread-*.html?d=*","http*://*/viewthread-*.html","http*://*/viewthread.php?*","http*://*/htm_data/*.html","http*://*/read.php?*","http*://*/forum.php?mod=viewthread&tid=*","http*://*/forum.php?mod=forumdisplay&fid=*","http*://*/forum.php?mod=post&action=newthread&*","http*://*/forum.php?mod=post&action=edit&*","http*://*/bbs/forum.php","http*://*/bbs/forum-*.html","http*://*/bbs/forumdisplay.php?*","http*://*/bbs/thread-*.html","http*://*/bbs/thread-*.html?d=*","http*://*/bbs/viewthread-*.html","http*://*/bbs/viewthread.php?*","http*://*/bbs/forum.php?mod=viewthread&tid=*","http*://*/bbs/forum.php?mod=forumdisplay&fid=*","http*://*/bbs/forum.php?mod=post&action=newthread&*","http*://*/bbs/forum.php?mod=post&action=edit&*","http*://*/forum/forum.php","http*://*/forum/forum-*.html","http*://*/forum/forumdisplay.php?*","http*://*/forum/thread-*.html","http*://*/forum/thread-*.html?d=*","http*://*/forum/viewthread-*.html","http*://*/forum/viewthread.php?*","http*://*/forum/forum.php?mod=viewthread&tid=*","http*://*/forum/forum.php?mod=forumdisplay&fid=*","http*://*/forum/forum.php?mod=post&action=newthread&*","http*://*/forum/forum.php?mod=post&action=edit&*","http*://hishis.github.io/tools/forum-grandmaster/"],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"DATE":"n20200806","FROM":"sforum.51nb.com","SCENE_MODE":"sStandard"},"ts":1599718384513},"enabled":true,"position":3,"file_url":"https://greasyfork.org/scripts/400250-forum-grandmaster-for-discuz/code/Forum%20Grandmaster%20for%20Discuz!.user.js","uuid":"035c7b3d-5f1e-4f55-9806-a5cf8569d6f9","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIEZvcnVtIEdyYW5kbWFzdGVyIGZvciBEaXNjdXohCi8vIEBuYW1lOmVuICAgICAgICAgICBGb3J1bSBHcmFuZG1hc3RlciBmb3IgRGlzY3V6IQovLyBAbmFtZTp6aCAgICAgICAgICAg6K665Z2b5aSn5biIIOKAkyBEaXNjdXohCi8vIEBuYW1lOnpoLUNOICAgICAgICDorrrlnZvlpKfluIgg4oCTIERpc2N1eiEKLy8gQG5hbWU6emgtSEsgICAgICAgIOirluWjh+Wkp+W4qyDigJMgRGlzY3V6IQovLyBAbmFtZTp6aC1NTyAgICAgICAg6KuW5aOH5aSn5birIOKAkyBEaXNjdXohCi8vIEBuYW1lOnpoLVRXICAgICAgICDoq5blo4flpKfluKsg4oCTIERpc2N1eiEKLy8gQG5hbWVzcGFjZSAgICAgICAgIEZvcnVtIEdyYW5kbWFzdGVyIGZvciBEaXNjdXohCi8vIEB2ZXJzaW9uICAgICAgICAgICAwLjMuNDUKLy8gQGF1dGhvciAgICAgICAgICAgIGhvc3RuYW1lCi8vIEBkZXNjcmlwdGlvbiAgICAgICDwn5SKQmVhdXRpZnkgdGhlIGludGVyZmFjZSwgUmVtb3ZlIGFkcywgRW5oYW5jZSBmdW5jdGlvbnMuCi8vIEBkZXNjcmlwdGlvbjplbiAgICDwn5SKQmVhdXRpZnkgdGhlIGludGVyZmFjZSwgUmVtb3ZlIGFkcywgRW5oYW5jZSBmdW5jdGlvbnMuCi8vIEBkZXNjcmlwdGlvbjp6aCAgICDwn5SK6K665Z2b572R56uZ6aG16Z2i576O5YyW44CB5bm/5ZGK56e76Zmk44CB5Yqf6IO95aKe5by644CC576O6L2u576O5aWC55qE6KeG6KeJ5Lqr5Y+X77yM5a6J54S25oGs6Z2Z55qE6K665Z2b5pe25YWJ4oCm4oCmCi8vIEBkZXNjcmlwdGlvbjp6aC1DTiDwn5SK6K665Z2b572R56uZ6aG16Z2i576O5YyW44CB5bm/5ZGK56e76Zmk44CB5Yqf6IO95aKe5by644CC576O6L2u576O5aWC55qE6KeG6KeJ5Lqr5Y+X77yM5a6J54S25oGs6Z2Z55qE6K665Z2b5pe25YWJ4oCm4oCmCi8vIEBkZXNjcmlwdGlvbjp6aC1ISyDwn5SK6KuW5aOH57ay56uZ6aCB6Z2i576O5YyW44CB5buj5ZGK56e76Zmk44CB5Yqf6IO95aKe5by344CC576O6Lyq576O5aWQ55qE6KaW6Ka65Lqr5Y+X77yM5a6J54S25oGs6Z2c55qE6KuW5aOH5pmC5YWJ4oCm4oCmCi8vIEBkZXNjcmlwdGlvbjp6aC1NTyDwn5SK6KuW5aOH57ay56uZ6aCB6Z2i576O5YyW44CB5buj5ZGK56e76Zmk44CB5Yqf6IO95aKe5by344CC576O6Lyq576O5aWQ55qE6KaW6Ka65Lqr5Y+X77yM5a6J54S25oGs6Z2c55qE6KuW5aOH5pmC5YWJ4oCm4oCmCi8vIEBkZXNjcmlwdGlvbjp6aC1UVyDwn5SK6KuW5aOH57ay56uZ6aCB6Z2i576O5YyW44CB5buj5ZGK56e76Zmk44CB5Yqf6IO95aKe5by344CC576O6Lyq576O5aWQ55qE6KaW6Ka65Lqr5Y+X77yM5a6J54S25oGs6Z2c55qE6KuW5aOH5pmC5YWJ4oCm4oCmCi8vIEBob21lcGFnZSAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaGlzaGlzL2ZvcnVtLWdyYW5kbWFzdGVyLWZvci1kaXNjdXoKLy8gQGljb24gICAgICAgICAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9oaXNoaXMvZm9ydW0tZ3JhbmRtYXN0ZXItZm9yLWRpc2N1ei9wdWJsaWMvZmF2aWNvbi5pY28KLy8gQHN1cHBvcnRVUkwgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9oaXNoaXMvZm9ydW0tZ3JhbmRtYXN0ZXItZm9yLWRpc2N1ei9pc3N1ZXMKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vd3d3LjUycG9qaWUuY24vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5jaGlwaGVsbC5jb20vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5yaWdodC5jb20uY24vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL2Jicy5rYWZhbi5jbi8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vd3d3Lmhvc3Rsb2MuY29tLwovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly9iYnMucGNiZXRhLmNvbS8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vd3d3Lnp1YW5rZTguY29tLwovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly9iYnMuNTFjcmVkaXQuY29tLwovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly9iYnMueWRzcy5jbi8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vYmJzLmZvYnNoYW5naGFpLmNvbS8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vYmJzLmh1b3JvbmcuY24vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL2Jicy4zNjAuY24vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5nZWJpMS5jb20vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5hZHZlcnRjbi5jb20vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5mZ2x0Lm5ldC8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vd3d3LmZnbHQuY24vCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5haWhhby5jYy8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vYmJzLm5hczY2LmNvbS8KLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8va2V5bG9sLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovL3d3dy5rZXlsb2wuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vd3d3LnZpaWRpaS5pbmZvLz9hY3Rpb249aW1hZ2UmKgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly93d3cudmlpZGlpLmluZm8vP2h0dHAqOi8vKgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2ZvcnVtLnBocAovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2ZvcnVtLSouaHRtbAovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2ZvcnVtZGlzcGxheS5waHA/KgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL3RocmVhZC0qLmh0bWwKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi90aHJlYWQtKi5odG1sP2Q9KgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL3ZpZXd0aHJlYWQtKi5odG1sCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovdmlld3RocmVhZC5waHA/KgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2h0bV9kYXRhLyouaHRtbAovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL3JlYWQucGhwPyoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS5waHA/bW9kPXZpZXd0aHJlYWQmdGlkPSoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS5waHA/bW9kPWZvcnVtZGlzcGxheSZmaWQ9KgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2ZvcnVtLnBocD9tb2Q9cG9zdCZhY3Rpb249bmV3dGhyZWFkJioKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS5waHA/bW9kPXBvc3QmYWN0aW9uPWVkaXQmKgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2Jicy9mb3J1bS5waHAKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9iYnMvZm9ydW0tKi5odG1sCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovYmJzL2ZvcnVtZGlzcGxheS5waHA/KgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2Jicy90aHJlYWQtKi5odG1sCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovYmJzL3RocmVhZC0qLmh0bWw/ZD0qCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovYmJzL3ZpZXd0aHJlYWQtKi5odG1sCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovYmJzL3ZpZXd0aHJlYWQucGhwPyoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9iYnMvZm9ydW0ucGhwP21vZD12aWV3dGhyZWFkJnRpZD0qCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovYmJzL2ZvcnVtLnBocD9tb2Q9Zm9ydW1kaXNwbGF5JmZpZD0qCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovYmJzL2ZvcnVtLnBocD9tb2Q9cG9zdCZhY3Rpb249bmV3dGhyZWFkJioKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9iYnMvZm9ydW0ucGhwP21vZD1wb3N0JmFjdGlvbj1lZGl0JioKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS9mb3J1bS5waHAKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS9mb3J1bS0qLmh0bWwKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS9mb3J1bWRpc3BsYXkucGhwPyoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS90aHJlYWQtKi5odG1sCi8vIEBtYXRjaCAgICAgICAgICAgICBodHRwKjovLyovZm9ydW0vdGhyZWFkLSouaHRtbD9kPSoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS92aWV3dGhyZWFkLSouaHRtbAovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2ZvcnVtL3ZpZXd0aHJlYWQucGhwPyoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS9mb3J1bS5waHA/bW9kPXZpZXd0aHJlYWQmdGlkPSoKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS9mb3J1bS5waHA/bW9kPWZvcnVtZGlzcGxheSZmaWQ9KgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly8qL2ZvcnVtL2ZvcnVtLnBocD9tb2Q9cG9zdCZhY3Rpb249bmV3dGhyZWFkJioKLy8gQG1hdGNoICAgICAgICAgICAgIGh0dHAqOi8vKi9mb3J1bS9mb3J1bS5waHA/bW9kPXBvc3QmYWN0aW9uPWVkaXQmKgovLyBAbWF0Y2ggICAgICAgICAgICAgaHR0cCo6Ly9oaXNoaXMuZ2l0aHViLmlvL3Rvb2xzL2ZvcnVtLWdyYW5kbWFzdGVyLwovLyBAY29tcGF0aWJsZSAgICAgICAgQ2hyb21lICBXb3JrcyB3aXRoIFRhbXBlcm1vbmtleSBmb3IgQ2hyb21lCi8vIEBjb21wYXRpYmxlICAgICAgICBFZGdlICAgIFdvcmtzIHdpdGggVGFtcGVybW9ua2V5IGZvciBFZGdlCi8vIEBjb21wYXRpYmxlICAgICAgICBGaXJlZm94IFdvcmtzIHdpdGggVGFtcGVybW9ua2V5IGZvciBGaXJlZm94Ci8vIEBjb21wYXRpYmxlICAgICAgICBPcGVyYSAgIFdvcmtzIHdpdGggVGFtcGVybW9ua2V5IGZvciBPcGVyYQovLyBAY29tcGF0aWJsZSAgICAgICAgU2FmYXJpICBXb3JrcyB3aXRoIFRhbXBlcm1vbmtleSBmb3IgU2FmYXJpCi8vIEBydW4tYXQgICAgICAgICAgICBkb2N1bWVudC1zdGFydAovLyBAY29ubmVjdCAgICAgICAgICAgc2VsZgovLyBAY29ubmVjdCAgICAgICAgICAgY2RuLmpzZGVsaXZyLm5ldAovLyBAY29ubmVjdCAgICAgICAgICAgZ3JlYXN5Zm9yay5vcmcKLy8gQGdyYW50ICAgICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgICAgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9saXN0VmFsdWVzCi8vIEBncmFudCAgICAgICAgICAgICBHTV9hZGRWYWx1ZUNoYW5nZUxpc3RlbmVyCi8vIEBncmFudCAgICAgICAgICAgICBHTV9yZW1vdmVWYWx1ZUNoYW5nZUxpc3RlbmVyCi8vIEBncmFudCAgICAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2xvZwovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0UmVzb3VyY2VUZXh0Ci8vIEBncmFudCAgICAgICAgICAgICBHTV9nZXRSZXNvdXJjZVVSTAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEBncmFudCAgICAgICAgICAgICBHTV9kb3dubG9hZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0VGFiCi8vIEBncmFudCAgICAgICAgICAgICBHTV9zYXZlVGFiCi8vIEBncmFudCAgICAgICAgICAgICBHTV9nZXRUYWJzCi8vIEBncmFudCAgICAgICAgICAgICBHTV9ub3RpZmljYXRpb24KLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgICAgICAgd2luZG93LmNsb3NlCi8vIEBncmFudCAgICAgICAgICAgICB3aW5kb3cuZm9jdXMKLy8gQGxpY2Vuc2UgICAgICAgICAgIE1QTC0yLjAKLy8gPT0vVXNlclNjcmlwdD09CgovKioKICogRm9ydW0gR3JhbmRtYXN0ZXIgZm9yIERpc2N1eiEg4oCTIGh0dHBzOi8vZ2l0aHViLmNvbS9oaXNoaXMvZm9ydW0tZ3JhbmRtYXN0ZXItZm9yLWRpc2N1egogKgogKiA9PSBCRUdJTiBMSUNFTlNFIEJMT0NLID09CiAqCiAqIE9wZW4gbmFtZTogRm9ydW0gR3JhbmRtYXN0ZXIgZm9yIERpc2N1eiEKICogT3BlbiBob21lOiBodHRwczovL2dpdGh1Yi5jb20vaGlzaGlzL2ZvcnVtLWdyYW5kbWFzdGVyLWZvci1kaXNjdXoKICogQ29weXJpZ2h0IEZvcnVtIEdyYW5kbWFzdGVyIGZvciBEaXNjdXohCiAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKGh0dHBzOi8vd3d3Lm1vemlsbGEub3JnL01QTC8yLjAvKQogKgogKiA9PSBFTkQgTElDRU5TRSBCTE9DSyA9PQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMgYXQgeW91cgogKiBjaG9pY2U6CiAqCiAqIDEuIEdQTCDigJMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLmh0bWwKICoKICogMi4gTVBMIOKAkyBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCiAqICAgIGh0dHBzOi8vd3d3Lm1vemlsbGEub3JnL01QTC8yLjAvCiAqCiAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIG11c3QgYmUgcmV0YWluZWQuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBpZiAodHlwZW9mIEdNX2FkZFN0eWxlID09PSAndW5kZWZpbmVkJykgewogICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveCcpKSB7CiAgICAgICAgICAgIGFsZXJ0KCforrrlnZvlpKfluIjmsrnnjLTohJrmnKzmmoLkuI3mlK/mjIEgR3JlYXNlbW9ua2V577yI5rK554y05a2Q77yJ77yM5bu66K6u5a6J6KOFIFRhbXBlcm1vbmtleSDmiJYgVmlvbGVudG1vbmtlee+8iOaatOWKm+eMtO+8ieaJqeWxleeoi+W6j++8gScpOwogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSgnaHR0cHM6Ly9hZGRvbnMubW96aWxsYS5vcmcvZmlyZWZveC9hZGRvbi90YW1wZXJtb25rZXkvJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWxlcnQoJ+iuuuWdm+Wkp+W4iOayueeMtOiEmuacrOaaguS4jeaUr+aMgeW9k+WJjeaJqeWxle+8jOW7uuiuruWuieijhSBUYW1wZXJtb25rZXkg5oiWIFZpb2xlbnRtb25rZXnvvIjmmrTlipvnjLTvvInmianlsZXnqIvluo/vvIEnKTsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoJ2h0dHBzOi8vd3d3LnRhbXBlcm1vbmtleS5uZXQvJyk7CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gJyc7CiAgICB9CgogICAgLy8gSG9zdG5hbWUKICAgIGNvbnN0IGhuID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lOwoKICAgIC8vIFVzZXItQWdlbnQKICAgIGNvbnN0IHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7CgogICAgLy8gUnVudGltZSBUeXBlIENoZWNrcyDigJMgUnVudGltZSB0eXBlIGNoZWNrcyBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdAogICAgY29uc3QgbGlzdF9hYWFhID0gW107CiAgICBjb25zdCBsaXN0X2JiYmIgPSBbXTsKICAgIC8vIFJ1bnRpbWUgdHlwZSBjaGVja3MgZm9yIEphdmFTY3JpcHQKICAgIGlmIChsaXN0X2FhYWEgPT09IGxpc3RfYmJiYikgewogICAgICAgIC8vIFJ1bnRpbWUgdHlwZSBjaGVja3MgZm9yIFR5cGVTY3JpcHQKICAgICAgICBjaGVja19mb3JfdHlwZXNjcmlwdCh3aW5kb3cuTm9kZSk7CiAgICB9CgogICAgLy8gUnVudGltZSB0eXBlIGNoZWNrcyBmb3IgVHlwZVNjcmlwdAogICAgZnVuY3Rpb24gY2hlY2tfZm9yX3R5cGVzY3JpcHQoZSkgewogICAgICAgIC8vIEEgcmVhc29uYWJseS10eXBlZCBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uIGdpdmVzIHRoZSBkZXZlbG9wZXIgZW5vdWdoIGNvbmZpZGVuY2UgdGhhdCB0aGUgb3BlcmF0aW9ucyB3aXRoaW4gdGhlIGFwcGxpY2FpdG9uIGFyZSBzYWZlIGFuZCBwcmVkaWN0YWJsZS4gQXMgYSByZXN1bHQsIHlvdSByYXJlbHkgc2VlIHRoZSAndW5kZWZpbmVkIGlzIG5vdCBhIGZ1bmN0aW9uJyBlcnJvcnMsIHdoaWNoIGlzIG9mdGVuIGNhdXNlZCBieSBwYXNzaW5nIGEgd3JvbmcgdHlwZSBvZiBvYmplY3QuCiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBUeXBlU2NyaXB0IHR5cGUgY2hlY2tlciBlbnN1cmVzIHRoYXQgeW91IG9ubHkgaW52b2tlIGZ1bmN0aW9ucyB3aXRoIGNvbXBhdGlibGUgcGFyYW1ldGVycy4gVGhlIHR5cGUgY2hlY2tlciwgaG93ZXZlciwgY2Fubm90IHZlcmlmeSB0aGlzIGF0IHRoZSBhcHBsaWNhdGlvbiBvciBtb2R1bGUgYm91bmRhcnksIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcyBkYXRhIGZyb20gdGhlIGJhY2tlbmQsIGEgd2ViLXdvcmtlciwgb3IganVzdCBhbm90aGVyIG1vZHVsZS4gSGVyZSwgd2UgY2Fubm90IGtub3cgc3RhdGljYWxseSBpZiB0aGUgZGF0YSBpcyBjb3JyZWN0LiBTbyB3ZSBqdXN0IGhhdmUgdG8gdHJ1c3QgdGhhdCBpdCBpcy4KICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiBlOwogICAgICAgIGxldCBhID0gWwogICAgICAgICAgICB0eXBlLAogICAgICAgIF07CiAgICAgICAgbGV0IGIgPSBbCiAgICAgICAgICAgIHR5cGUsCiAgICAgICAgXTsKICAgICAgICBhLnB1c2goYSk7CiAgICAgICAgYi5wdXNoKGIpOwogICAgICAgIGlmIChhID09PSBiKSB7CiAgICAgICAgICAgIGEgPSBhLnB1c2goYS5wdXNoKGUsIHR5cGUpKTsKICAgICAgICAgICAgYiA9IGIucHVzaChiLnB1c2goZSwgdHlwZSkpOwogICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgYSA9PT0gYjoKICAgICAgICAgICAgICAgICAgICBlID0gYVswXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIGEgPiBiOgogICAgICAgICAgICAgICAgICAgIGUgPSBhWzFdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgYSA8IGI6CiAgICAgICAgICAgICAgICAgICAgZSA9IGFbMl07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY2hlY2tfZm9yX3R5cGVzY3JpcHQoZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBTY2VuZSBtb2RlOiBTdGFuZGFyZCwgSG9tZSwgT2ZmaWNlCiAgICBsZXQgc2NlbmVfbW9kZSA9IEdNX2dldFZhbHVlKCdTQ0VORV9NT0RFJywgJ1N0YW5kYXJkJyk7CgogICAgbGV0IGNvbW1vbl9jc3MgPSAnOnJvb3R7LS1ibHVlOiMwMDdiZmY7LS1pbmRpZ286IzY2MTBmMjstLXB1cnBsZTojNmY0MmMxOy0tcGluazojZTgzZThjOy0tcmVkOiNkYzM1NDU7LS1vcmFuZ2U6I2ZkN2UxNDstLXllbGxvdzojZmZjMTA3Oy0tZ3JlZW46IzI4YTc0NTstLXRlYWw6IzIwYzk5NzstLWN5YW46IzE3YTJiODstLXdoaXRlOiNmZmY7LS1ncmF5OiM2Yzc1N2Q7LS1ncmF5LWRhcms6IzM0M2E0MDstLXByaW1hcnk6IzAwN2JmZjstLXNlY29uZGFyeTojNmM3NTdkOy0tc3VjY2VzczojMjhhNzQ1Oy0taW5mbzojMTdhMmI4Oy0td2FybmluZzojZmZjMTA3Oy0tZGFuZ2VyOiNkYzM1NDU7LS1saWdodDojZjhmOWZhOy0tZGFyazojMzQzYTQwOy0tYnJlYWtwb2ludC14czowOy0tYnJlYWtwb2ludC1zbTo1NzZweDstLWJyZWFrcG9pbnQtbWQ6NzY4cHg7LS1icmVha3BvaW50LWxnOjk5MnB4Oy0tYnJlYWtwb2ludC14bDoxMjAwcHg7LS1mb250LWZhbWlseS1zYW5zLXNlcmlmOi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCJTZWdvZSBVSSIsUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsQXJpYWwsIk5vdG8gU2FucyIsIk5vdG8gU2FucyBDSksiLCJQaW5nRmFuZyBTQyIsIkhpcmFnaW5vIFNhbnMgR0IiLCJNaWNyb3NvZnQgWWFIZWkgTmV3IiwiTWljcm9zb2Z0IFlhaGVpIiwiV2VuUXVhbllpIE1pY3JvIEhlaSIsc2Fucy1zZXJpZiwiQXBwbGUgQ29sb3IgRW1vamkiLCJTZWdvZSBVSSBFbW9qaSIsIlNlZ29lIFVJIFN5bWJvbCIsIk5vdG8gQ29sb3IgRW1vamkiOy0tZm9udC1mYW1pbHktbW9ub3NwYWNlOiJGaXJhIENvZGUiLEhhY2ssIlNvdXJjZSBDb2RlIFBybyIsIlNvdXJjZSBDb2RlIFZhcmlhYmxlIixTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsIkxpYmVyYXRpb24gTW9ubyIsIkNvdXJpZXIgTmV3IiwiTm90byBTYW5zIE1vbm8gQ0pLIiwiTWljcm9zb2Z0IFlhSGVpIE1vbm8iLCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIixtb25vc3BhY2V9Ym9keSx0YWJsZSxpbnB1dCxidXR0b24sc2VsZWN0LHRleHRhcmVhLGF7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsIlNlZ29lIFVJIixSb2JvdG8sIkhlbHZldGljYSBOZXVlIixBcmlhbCwiTm90byBTYW5zIiwiTm90byBTYW5zIENKSyIsIlBpbmdGYW5nIFNDIiwiSGlyYWdpbm8gU2FucyBHQiIsIk1pY3Jvc29mdCBZYUhlaSBOZXciLCJNaWNyb3NvZnQgWWFoZWkiLCJXZW5RdWFuWWkgTWljcm8gSGVpIixzYW5zLXNlcmlmLCJBcHBsZSBDb2xvciBFbW9qaSIsIlNlZ29lIFVJIEVtb2ppIiwiU2Vnb2UgVUkgU3ltYm9sIiwiTm90byBDb2xvciBFbW9qaSJ9Lm1vbm8sLm1kLC5jb2RlLC5wcmUsLnR0LG1vbm8sbWQsY29kZSxwcmUsdHQsLnBsIC5ibG9ja2NvZGUgb2wgbGksLnBsIC5ibG9ja2NvZGUgdWwgbGl7Zm9udC1mYW1pbHk6IkZpcmEgQ29kZSIsSGFjaywiU291cmNlIENvZGUgUHJvIiwiU291cmNlIENvZGUgVmFyaWFibGUiLFNGTW9uby1SZWd1bGFyLE1lbmxvLE1vbmFjbyxDb25zb2xhcywiTGliZXJhdGlvbiBNb25vIiwiQ291cmllciBOZXciLCJOb3RvIFNhbnMgTW9ubyBDSksiLCJNaWNyb3NvZnQgWWFIZWkgTW9ubyIsIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLG1vbm9zcGFjZX0uYWRzLCNhZF9oZWFkZXJiYW5uZXIsI2FkX3RleHQsLmFkX3RleHQsI2FkX3RocmVhZDFfMCwjYWRfdGhyZWFkMl8wLCNhZF90aHJlYWQzXzAsI2FkX3RocmVhZDRfMCwuYWRfdGV4dGxpbmsxLC5hZF90ZXh0bGluazIsLmFkX3RleHRsaW5rMywuYWRfdGV4dGxpbms0LC5wbGMgLmRuY2hfZW9fcHQsLnBsYyAuZG5jaF9lb19wYiwubC1hZHMsLmxlZnQtYWRzLC5yLWFkcywucmlnaHQtYWRzLCNkaXluYXZ0b3AsI2Rya19jb2xlZV9sZWZ0MSwjZHJrX2NvbGVlX2xlZnQyLCNkcmtfbGVkdGQsI2hkIC53cCAuYV9tdSwjbnZfZm9ydW0gPiAud3AuY2wgPiB0YWJsZSwjbnZfZm9ydW0gPiAjd3AgPiAjY3QgPiAubW4gPiAuZmwuYm0gPiAuYm0uYV9jLHRhYmxlIC5hX3ByLC5hZCAucGxjIC5hX3AsLmFfaCwuYV90LCNwb3N0bGlzdCAuYV9wdCwjcG9zdGxpc3QgLmFfcGIsI252X2ZvcnVtID4gI3dwID4gI2N0ID4gLm1uID4gdGFibGUgbGkudHh0LCNudl9mb3J1bSA+ICN3cCA+ICNjdCA+IC5tbiA+IGRpdiA+IGNlbnRlciwjbnZfZm9ydW0gPiAjd3AgPiAjY3QgPiAubW4gPiBkaXYgPiB0YWJsZSwjbnZfZm9ydW0gPiBkaXYgPiBjZW50ZXIsI252X2ZvcnVtID4gZGl2LmFfZmwsI252X2ZvcnVtID4gZGl2LmFfZnIsI252X2ZvcnVtID4gZGl2LmFfY24sI2Zhc3Rwb3N0Zm9ybSAucG5wb3N0ID4gc3Bhbiwjd3AgI2FuLGgyID4gI2RpeW1zZywjY2F0ZWdvcnlfbGt7ZGlzcGxheTpub25lfSNoZCA+IC53cCA+IGRpdiA+IGgyID4gYSA+IGltZ1tzcmMkPSIuZ2lmIl0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmskPSIuY29tIl0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmskPSIubmV0Il0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmskPSIub3JnIl0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmskPSIuY2MiXSwuaW1hZ2UtYmlnID4gaW1nW2RhdGEtbGluayQ9Ii5jbiJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rJD0iLmNvbS8iXSwuaW1hZ2UtYmlnID4gaW1nW2RhdGEtbGluayQ9Ii5uZXQvIl0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmskPSIub3JnLyJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rJD0iLmNjLyJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rJD0iLmNuLyJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rKj0iLmNvbToiXSwuaW1hZ2UtYmlnID4gaW1nW2RhdGEtbGluayo9Ii5uZXQ6Il0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmsqPSIub3JnOiJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rKj0iLmNjOiJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rKj0iLmNuOiJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rKj0iLmNvbS8/Il0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmsqPSIubmV0Lz8iXSwuaW1hZ2UtYmlnID4gaW1nW2RhdGEtbGluayo9Ii5vcmcvPyJdLC5pbWFnZS1iaWcgPiBpbWdbZGF0YS1saW5rKj0iLmNjLz8iXSwuaW1hZ2UtYmlnID4gaW1nW2RhdGEtbGluayo9Ii5jbi8/Il0sLmltYWdlLWJpZyA+IGltZ1tkYXRhLWxpbmsqPSIvUmVnaXN0ZXIiXSwuaW1hZ2UtYmlnID4gaW1nW2RhdGEtbGluayo9Ii92aXAiXSwuaW1hZ2UtYmlnID4gaW1nW2Vzcy1kYXRhKj0iOi8va2suIl0sLmltYWdlLWJpZyA+IGltZ1tlc3MtZGF0YSo9Ii5hbGljZG4uY29tLyJdLC5pbWFnZS1iaWcgPiBpbWdbZXNzLWRhdGEqPSIuc2luYWltZy5jbi8iXSwudHBjX2NvbnRlbnQuZG9fbm90X2NhdGNoID4gc3BhbltjbGFzcz0iZjE2Il0gPiBzcGFuW3N0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjpTZWFHcmVlbiJdID4gYSwudHBjX2NvbnRlbnQuZG9fbm90X2NhdGNoID4gc3BhbltjbGFzcz0iZjI0Il0gPiBzcGFuW3N0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjpTZWFHcmVlbiJdID4gYSwudHBjX2NvbnRlbnQuZG9fbm90X2NhdGNoID4gc3BhbltjbGFzcz0iZjMyIl0gPiBzcGFuW3N0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjpTZWFHcmVlbiJdID4gYSwjY3QgZGl2W2lkXj0iZm9ydW1fcnVsZXNfIl0sLnJlcy1mb290ZXItbm90ZXtkaXNwbGF5Om5vbmV9I21haW4gLmRvX25vdF9jYXRjaCAudGlwc3twYWRkaW5nOjA7dXNlci1zZWxlY3Q6bm9uZX0jbWFpbiAuZG9fbm90X2NhdGNoIC50aXBzIC5zcHRhYmxlX2RvX25vdF9yZW1vdmUgdGR7Y29sb3I6cmdiYSgwLDAsMCwwKTtjdXJzb3I6ZGVmYXVsdH0jbWFpbiAuZG9fbm90X2NhdGNoIC50aXBzIC5zcHRhYmxlX2RvX25vdF9yZW1vdmUgaDQsI21haW4gLmRvX25vdF9jYXRjaCAudGlwcyAuc3B0YWJsZV9kb19ub3RfcmVtb3ZlIGEsI21haW4gLmRvX25vdF9jYXRjaCAudGlwcyAuc3B0YWJsZV9kb19ub3RfcmVtb3ZlIC5zcHRhYmxlX2luZm97ZGlzcGxheTpub25lfS5wbHMgLmF2YXRhcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXRvcDoxcHg7dGV4dC1hbGlnbjpjZW50ZXJ9LnBscyAuYXZhdGFyIGltZywjZmFzdHBvc3Rmb3JtIC5wbHMgLmF2YXRhciBpbWcsI21haW4gLnQudDIgdGFibGUgLnRyMSB0YWJsZSAudGFjIGltZ3twYWRkaW5nOjA7d2lkdGg6MTIwcHg7aGVpZ2h0OjEyMHB4O29iamVjdC1maXQ6Y29udGFpbjtiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOjRweCBzb2xpZCAjZmZmO2JveC1zaGFkb3c6MCAwIDRweCAjYmJifS5wbHMgLmF2YXRhciBpbWc6aG92ZXIsI2Zhc3Rwb3N0Zm9ybSAucGxzIC5hdmF0YXIgaW1nOmhvdmVyLCNtYWluIC50LnQyIHRhYmxlIC50cjEgdGFibGUgLnRhYyBpbWc6aG92ZXJ7YmFja2dyb3VuZDojZmZmO2JveC1zaGFkb3c6MCAwIDhweCAjYmJifSNtYWluIC50LnQyIHRhYmxlIC50cjEgdGFibGUgLnRhYyBpbWcsI21haW4gLnQudDIgdGFibGUgLnRyMSB0YWJsZSAudGFjIGltZzpob3Zlcntib3gtc2hhZG93Om5vbmV9LmJ1aSAubXt0ZXh0LWFsaWduOmNlbnRlcn0uYnVpIC5tIGltZ3twYWRkaW5nOjA7d2lkdGg6MTIwcHg7aGVpZ2h0OjEyMHB4O29iamVjdC1maXQ6Y29udGFpbjtiYWNrZ3JvdW5kOm5vbmU7Ym94LXNoYWRvdzowIDAgNHB4ICNiYmJ9LmJ1aSAubSBpbWc6aG92ZXJ7YmFja2dyb3VuZDojZmZmfSN1bSAuYXZ0IGltZywjdGF0aCBpbWcsLnJhdGUgdGFibGUgaW1nLC5yYXRlIGRkIGxpIGltZywuY20gLnZtIGltZywuY2FyZF9tbiAuYXZ0IGltZ3tvYmplY3QtZml0OmNvbnRhaW59LnVzZXItb25saW5lLXN0YXR1c3tkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDtjdXJzb3I6aGVscH0udXNlci1zdGF0dXMtZXhwcmVzc2lvbntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDttYXJnaW46MDtwYWRkaW5nOjAgMXB4O3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtjdXJzb3I6aGVscH0udXNlci1zdGF0dXMtZXhwcmVzc2lvbi1vbmxpbmU6OmFmdGVye2NvbnRlbnQ6IvCfjJ0ifS51c2VyLXN0YXR1cy1leHByZXNzaW9uLW9mZmxpbmU6OmFmdGVye2NvbnRlbnQ6IvCfjJoifS5vZmZsaW5le2ZpbHRlcjpncmF5c2NhbGUoMTAwJSl9LmZ1bmN0aW9uLWJ1dHRvbnN7cGFkZGluZzowIDAgNHB4IDA7dGV4dC1hbGlnbjpyaWdodDt3aGl0ZS1zcGFjZTpub3dyYXB9LmN1c3RvbS1mdW5jdGlvbi1idXR0b257bWFyZ2luLWxlZnQ6NHB4O3BhZGRpbmc6MnB4IDhweDtiYWNrZ3JvdW5kLWNvbG9yOiNmMWYxZjE7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTpub25lO2N1cnNvcjpwb2ludGVyfS5jdXN0b20tZnVuY3Rpb24tYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6MCAxcHggMnB4ICNiYmJ9LmJ1dHRvbi1kaXNhYmxlZHtjb2xvcjojODA4MDgwO2N1cnNvcjpkZWZhdWx0fS5idXR0b24tZGlzYWJsZWQ6aG92ZXJ7Ym94LXNoYWRvdzpub25lfS5wbCAuYmxvY2tjb2RlIGVte2Rpc3BsYXk6bm9uZX0jaGlkZGVucG9zdHN0aXB7cGFkZGluZzowfS50X2YgLnpvb217bWFyZ2luLXRvcDo0cHg7bWFyZ2luLWJvdHRvbTo0cHg7Ym94LXNoYWRvdzowIDAgMnB4ICNiYmJ9LnRfZiAuem9vbTpob3Zlcntib3gtc2hhZG93OjAgMCA0cHggI2JiYn0jaGlkZGVucG9zdHN0aXAgYXtoZWlnaHQ6MzJweDtsaW5lLWhlaWdodDozMnB4O2ZvbnQtc2l6ZToxNnB4fSNoaWRkZW5wb3N0c3RpcCBhOmhvdmVye2NvbG9yOiNmMzN9LnRfZiBpbWcuYmFkZ2UsLnRfZiAuem9vbVtzcmMkPSIvcHVibGljL2ltYWdlcy9wYXRjaC5naWYiXXtkaXNwbGF5Om5vbmU7Ym9yZGVyOm5vbmU7Ym94LXNoYWRvdzpub25lO2NvbnRlbnQ6dXJsKCIvL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvaGlzaGlzL2ZvcnVtLW1hc3Rlci9wdWJsaWMvaW1hZ2VzL3BhdGNoLnN2ZyIpO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjoxcztjdXJzb3I6ZGVmYXVsdDtvcGFjaXR5OjAuNX0udF9mIGltZy5iYWRnZTpob3ZlciwudF9mIC56b29tW3NyYyQ9Ii9wdWJsaWMvaW1hZ2VzL3BhdGNoLmdpZiJdOmhvdmVye29wYWNpdHk6MX1oMSBpbWcsaDIgaW1nLC5sb2dvLC5iYW5uZXIsLmZ1bmN0aW9uLWJ1dHRvbnMsLmNsIC53cCAueSBhLC5jbCAud3AgLnogYSwjdW0sI252LCNwdCwuZndpbm1hc2ssLnVzZXItb25saW5lLXN0YXR1cywucGxzIC5obSwucGxzIC5idWksLnBscyAuYXZhdGFyLC5wbHMgLnRucywucGxzIHAsLnBscyBkbCwucGxzIGxpLC5wbGMgLnBvLC5wbGMgLnBpLC5wbGMgLnksLnBsYyA+IHAsLnBndCwucGdzLC5wc3RhdHVzLC5ibV9oLCN0b29scywuaW1hZ2UtYmlnIC5pbWFnZS1iaWctdGV4dCwubW9kYWN0LC5iYXIsI2hpZGRlbnBvc3RzdGlwLCNmYXN0c21pbGllc2RpdiwuYXJlYSA+IGxhYmVsLC5oYXJtb25pb3VzLWJ1dHRvbnt1c2VyLXNlbGVjdDpub25lfSNmYXN0cG9zdGZvcm0gLmFyZWEsI3Bvc3Rmb3JtIC5hcmVhe3Bvc2l0aW9uOnJlbGF0aXZlfSNmYXN0cG9zdGZvcm0gLmFyZWEgLmhhcm1vbmlvdXMtYnV0dG9uLCNwb3N0Zm9ybSAuYXJlYSAuaGFybW9uaW91cy1idXR0b257ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6NHB4O2JvdHRvbTo0cHg7cGFkZGluZzowIDJweDtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2YxZjFmMTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTowLjV9I2Zhc3Rwb3N0Zm9ybSAuYXJlYSAuaGFybW9uaW91cy1idXR0b246aG92ZXIsI3Bvc3Rmb3JtIC5hcmVhIC5oYXJtb25pb3VzLWJ1dHRvbjpob3Zlcntjb2xvcjojMzY5O2JveC1zaGFkb3c6MCAwIDRweCAjYmJiO29wYWNpdHk6MX0uYmFyIC55IC5pbWctaG9zdGluZyAuaW1nLXVwbG9hZHttYXJnaW4tbGVmdDoycHg7Y3Vyc29yOnBvaW50ZXJ9LmJhciAueSAuaW1nLWhvc3RpbmcgLmltZy11cGxvYWQ6aG92ZXJ7Y29sb3I6I2YzM30uZndpbm1hc2sgaW5wdXQsLmZ3aW5tYXNrIGJ1dHRvbntjdXJzb3I6cG9pbnRlcn0uaW1hZ2UtYmlnID4gLmltYWdlLWJpZy10ZXh0e3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbToycHg7cmlnaHQ6MnB4O3BhZGRpbmc6NHB4O2ZvbnQtc2l6ZToxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaGFkb3c6MCAwIDJweCAjZGRkO29wYWNpdHk6MC41O2N1cnNvcjpwb2ludGVyfS5pbWFnZS1iaWcgPiAuaW1hZ2UtYmlnLXRleHQ6aG92ZXJ7Ym94LXNoYWRvdzowIDAgOHB4ICNmZmY7b3BhY2l0eToxfSc7CgogICAgc3dpdGNoIChzY2VuZV9tb2RlKSB7CiAgICAgICAgY2FzZSAnU3RhbmRhcmQnOgogICAgICAgICAgICBjb21tb25fY3NzICs9ICcjTW9kZS1TdGFuZGFyZHt1c2VyLXNlbGVjdDpub25lfS5wbHMgLmF2YXRhciBpbWcsI2Zhc3Rwb3N0Zm9ybSAucGxzIC5hdmF0YXIgaW1nLC5wZXJzb25pbmZvcm1haW9uIC5wZXJzb24taW1ncyBpbWcsI21haW4gLnQudDIgdGFibGUgLnRyMSB0YWJsZSAudGFjIGltZ3tib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOjAuNXN9LnBscyAuYXZhdGFyIGltZzpob3ZlciwjZmFzdHBvc3Rmb3JtIC5wbHMgLmF2YXRhciBpbWc6aG92ZXIsLnBlcnNvbmluZm9ybWFpb24gLnBlcnNvbi1pbWdzIGltZzpob3ZlciwjbWFpbiAudC50MiB0YWJsZSAudHIxIHRhYmxlIC50YWMgaW1nOmhvdmVye3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX0uYnVpIC5tIGltZ3tib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOjAuNXN9LmJ1aSAubSBpbWc6aG92ZXJ7Ym9yZGVyLXJhZGl1czowfSN1bSAuYXZ0IGltZywjdGF0aCBpbWcsLnJhdGUgdGFibGUgaW1nLC5yYXRlIGRkIGxpIGltZywuY20gLnZtIGltZywuY2FyZF9tbiAuYXZ0IGltZ3tib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOjAuNXN9I3VtIC5hdnQgaW1nOmhvdmVyLCN0YXRoIGltZzpob3ZlciwucmF0ZSB0YWJsZSBpbWc6aG92ZXIsLnJhdGUgZGQgbGkgaW1nOmhvdmVyLC5jbSAudm0gaW1nOmhvdmVyLC5jYXJkX21uIC5hdnQgaW1nOmhvdmVye3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX0nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnSG9tZSc6CiAgICAgICAgICAgIGNvbW1vbl9jc3MgKz0gJyNNb2RlLUhvbWV7dXNlci1zZWxlY3Q6bm9uZX0ucGxzIC5hdmF0YXIgaW1nLCNmYXN0cG9zdGZvcm0gLnBscyAuYXZhdGFyIGltZywucGVyc29uaW5mb3JtYWlvbiAucGVyc29uLWltZ3MgaW1nLCNtYWluIC50LnQyIHRhYmxlIC50cjEgdGFibGUgLnRhYyBpbWd7Y29udGVudDp1cmwoIi8vY2RuLmpzZGVsaXZyLm5ldC9naC9oaXNoaXMvZm9ydW0tZ3JhbmRtYXN0ZXItZm9yLWRpc2N1ei9wdWJsaWMvaW1hZ2VzL25vYXZhdGFyX21pZGRsZS5naWYiKTtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOjAuN3N9LnBscyAuYXZhdGFyIGltZzpob3ZlciwjZmFzdHBvc3Rmb3JtIC5wbHMgLmF2YXRhciBpbWc6aG92ZXIsLnBlcnNvbmluZm9ybWFpb24gLnBlcnNvbi1pbWdzIGltZzpob3ZlciwjbWFpbiAudC50MiB0YWJsZSAudHIxIHRhYmxlIC50YWMgaW1nOmhvdmVye2JvcmRlci1yYWRpdXM6MH0uYnVpIC5tIGltZ3t9LmJ1aSAubSBpbWc6aG92ZXJ7fSN1bSAuYXZ0IGltZywjdGF0aCBpbWcsLnJhdGUgdGFibGUgaW1nLC5yYXRlIGRkIGxpIGltZywuY20gLnZtIGltZywuY2FyZF9tbiAuYXZ0IGltZ3tjb250ZW50OnVybCgiLy9jZG4uanNkZWxpdnIubmV0L2doL2hpc2hpcy9mb3J1bS1ncmFuZG1hc3Rlci1mb3ItZGlzY3V6L3B1YmxpYy9pbWFnZXMvbm9hdmF0YXJfc21hbGwuZ2lmIik7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjowLjdzfSN1bSAuYXZ0IGltZzpob3ZlciwjdGF0aCBpbWc6aG92ZXIsLnJhdGUgdGFibGUgaW1nOmhvdmVyLC5yYXRlIGRkIGxpIGltZzpob3ZlciwuY20gLnZtIGltZzpob3ZlciwuY2FyZF9tbiAuYXZ0IGltZzpob3Zlcntjb250ZW50Om5vbmU7Ym9yZGVyLXJhZGl1czowfS5zaWduIGltZywuc2lnbmF0dXJlIGltZ3tkaXNwbGF5Om5vbmV9JzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ09mZmljZSc6CiAgICAgICAgICAgIGNvbW1vbl9jc3MgKz0gJyNNb2RlLU9mZmljZXt1c2VyLXNlbGVjdDpub25lfWJvZHl7YmFja2dyb3VuZDpub25lfS5wbHMgLmF2YXRhciBpbWcsI2Zhc3Rwb3N0Zm9ybSAucGxzIC5hdmF0YXIgaW1nLC5wZXJzb25pbmZvcm1haW9uIC5wZXJzb24taW1ncyBpbWcsI21haW4gLnQudDIgdGFibGUgLnRyMSB0YWJsZSAudGFjIGltZ3t3aWR0aDo2MHB4O2hlaWdodDo2MHB4O2NvbnRlbnQ6dXJsKCIvL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvaGlzaGlzL2ZvcnVtLWdyYW5kbWFzdGVyLWZvci1kaXNjdXovcHVibGljL2ltYWdlcy9NaWNyb3NvZnQtT2ZmaWNlLUxvZ28ucG5nIik7Ym9yZGVyLXJhZGl1czo1MCV9LnBscyAuYXZhdGFyIGltZzpob3ZlciwjZmFzdHBvc3Rmb3JtIC5wbHMgLmF2YXRhciBpbWc6aG92ZXIsLnBlcnNvbmluZm9ybWFpb24gLnBlcnNvbi1pbWdzIGltZzpob3ZlciwjbWFpbiAudC50MiB0YWJsZSAudHIxIHRhYmxlIC50YWMgaW1nOmhvdmVye2JvcmRlci1yYWRpdXM6MH0uYnVpIC5tIGltZ3tjb250ZW50OnVybCgiLy9jZG4uanNkZWxpdnIubmV0L2doL2hpc2hpcy9mb3J1bS1ncmFuZG1hc3Rlci1mb3ItZGlzY3V6L3B1YmxpYy9pbWFnZXMvTWljcm9zb2Z0LU9mZmljZS1Mb2dvLnBuZyIpfSN1bSAuYXZ0IGltZywjdGF0aCBpbWcsLnJhdGUgdGFibGUgaW1nLC5yYXRlIGRkIGxpIGltZywuY20gLnZtIGltZywuY2FyZF9tbiAuYXZ0IGltZ3tjb250ZW50OnVybCgiLy9jZG4uanNkZWxpdnIubmV0L2doL2hpc2hpcy9mb3J1bS1ncmFuZG1hc3Rlci1mb3ItZGlzY3V6L3B1YmxpYy9pbWFnZXMvTWljcm9zb2Z0LU9mZmljZS1Mb2dvLnBuZyIpO2JvcmRlci1yYWRpdXM6NTAlfSN1bSAuYXZ0IGltZzpob3ZlciwjdGF0aCBpbWc6aG92ZXIsLnJhdGUgdGFibGUgaW1nOmhvdmVyLC5yYXRlIGRkIGxpIGltZzpob3ZlciwuY20gLnZtIGltZzpob3ZlciwuY2FyZF9tbiAuYXZ0IGltZzpob3Zlcntib3JkZXItcmFkaXVzOjB9LnBscyAuYXZhdGFye21hcmdpbjoxMHB4IGF1dG87d2lkdGg6NjBweDtoZWlnaHQ6NjBweH0ucGxzIC5hdmF0YXIgaW1ne3dpZHRoOjYwcHg7aGVpZ2h0OjYwcHh9LnBscyAuYXZhdGFyIGltZzpob3Zlcntib3JkZXItcmFkaXVzOjB9I2hkIC53cCAuY29taWlzX25hdiwubWRfY3RybCxwLnhnMSxuYXYudG9jLC5zY2Jhcl9ob3RfdGQsLnBscyAuYXZhdGFyX3AgLnZtLGZpZWxkc2V0LC5obS10LWNvbnRhaW5lciwuaG0tdC1tYWluLC5obS10LWJvZHksLmRuY2hfZW9fZntkaXNwbGF5Om5vbmV9I3Bvc3RsaXN0IC5wbGhpbntiYWNrZ3JvdW5kOm5vbmV9LnNpZ24sLnNpZ25hdHVyZXtkaXNwbGF5Om5vbmV9JzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKEdNX2dldFZhbHVlKCdESVNQTEFZX0JBREdFJykgPT09IHRydWUpIHsKICAgICAgICBjb21tb25fY3NzICs9ICcudF9mIGltZy5iYWRnZSwudF9mIC56b29tW3NyYyQ9Ii9wdWJsaWMvaW1hZ2VzL3BhdGNoLmdpZiJde2Rpc3BsYXk6YmxvY2t9JzsKICAgIH0KICAgIEdNX2FkZFN0eWxlKGNvbW1vbl9jc3MpOwoKICAgIC8vIGJicy5wY2JldGEuY29tCiAgICBpZiAoaG4uaW5jbHVkZXMoJ2Jicy5wY2JldGEuY29tJykpIHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgR01fYWRkU3R5bGUoY29tbW9uX2Nzcyk7CiAgICAgICAgfSwgOTk5KTsKICAgIH0KfSkoKTsKCmZ1bmN0aW9uIG1haW4oKSB7CiAgICAvLyBPcGVuIHNvdXJjZSBhZGRyZXNzCiAgICBjb25zdCBPUEVOX0hPTUUgPSAnaHR0cHM6Ly9naXRodWIuY29tL2hpc2hpcy9mb3J1bS1ncmFuZG1hc3Rlci1mb3ItZGlzY3V6JzsKCiAgICAvLyBIb21lIHBhZ2UKICAgIGNvbnN0IEhPTUVfUEFHRSA9ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDAwMjUwJzsKCiAgICAvLyBTY2VuZSBtb2RlOiBTdGFuZGFyZCwgSG9tZSwgT2ZmaWNlCiAgICBsZXQgc2NlbmVfbW9kZSA9IEdNX2dldFZhbHVlKCdTQ0VORV9NT0RFJywgJ1N0YW5kYXJkJyk7CgogICAgLy8gRGlzcGxheSB0aGUgdXNlcnMgb25saW5lIHN0YXR1czogTm9uZSwgQmFzaWMsIEFkdmFuY2VkCiAgICBsZXQgZGlzcGxheV91c2Vyc19vbmxpbmVfc3RhdHVzID0gR01fZ2V0VmFsdWUoJ0RJU1BMQVlfVVNFUlNfT05MSU5FX1NUQVRVUycsICdOb25lJyk7CgogICAgLy8gRGlzcGxheSBiYWRnZTogdHJ1ZSwgZmFsc2UKICAgIGxldCBkaXNwbGF5X2JhZGdlID0gR01fZ2V0VmFsdWUoJ0RJU1BMQVlfQkFER0UnLCBmYWxzZSk7CgogICAgLy8gSG9zdG5hbWUKICAgIGNvbnN0IGhuID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lOwoKICAgIC8vIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcgogICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgogICAgLy8gVXNlci1BZ2VudAogICAgY29uc3QgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsKCiAgICBHTV9sb2coJ1NjZW5lIG1vZGU6Jywgc2NlbmVfbW9kZSk7CiAgICBHTV9sb2coJ0Rpc3BsYXkgdGhlIHVzZXJzIG9ubGluZSBzdGF0dXM6JywgZGlzcGxheV91c2Vyc19vbmxpbmVfc3RhdHVzKTsKICAgIEdNX2xvZygnRGlzcGxheSBiYWRnZTonLCBkaXNwbGF5X2JhZGdlKTsKCiAgICAvLyBMb2dpbiBzdGF0dXMKICAgIGNvbnN0IG1lbWJlciA9ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGNyZWRpdG1lbnUnKSB8fCAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteXByb21wdCcpIHx8ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215cmVwZWF0cycpOwoKICAgIEdNX2xvZygnTG9naW4gc3RhdHVzOicsIG1lbWJlcik7CgogICAgY29uc3Qgc2NlbmVfbW9kZV9tYXBfY29ycmVzcG9uZGluZyA9IG5ldyBNYXAoWwogICAgICAgIFsnU3RhbmRhcmQnLCAn5qCH5YeG5qih5byPJ10sCiAgICAgICAgWydIb21lJywgJ+WutuW6reaooeW8jyddLAogICAgICAgIFsnT2ZmaWNlJywgJ+WKnuWFrOaooeW8jyddLAogICAgXSk7CgogICAgY29uc3Qgc2NlbmVfbW9kZV9tYXBfbmV4dCA9IG5ldyBNYXAoWwogICAgICAgIFsnU3RhbmRhcmQnLCAnSG9tZSddLAogICAgICAgIFsnSG9tZScsICdPZmZpY2UnXSwKICAgICAgICBbJ09mZmljZScsICdTdGFuZGFyZCddLAogICAgXSk7CgogICAgLy8gU2hvdyBEaWFsb2cKICAgIGZ1bmN0aW9uIHNob3dfZGlhbG9nKG1lc3NhZ2UpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNob3dEaWFsb2cgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHNob3dEaWFsb2cobWVzc2FnZSwgJ3JpZ2h0Jyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNob3dFcnJvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKG1lc3NhZ2UpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWxlcnQobWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBhbGVydChtZXNzYWdlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQ3JlYXRlIEJ1dHRvbiBHcm91cAogICAgZnVuY3Rpb24gY3JlYXRlX2J1dHRvbl9ncm91cCgpIHsKICAgICAgICAvLyBGdW5jdGlvbiBidXR0b25zCiAgICAgICAgY29uc3QgZnVuY3Rpb25fYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGZ1bmN0aW9uX2J1dHRvbnMuaWQgPSAnZnVuY3Rpb24tYnV0dG9ucyc7CiAgICAgICAgZnVuY3Rpb25fYnV0dG9ucy5jbGFzc05hbWUgPSAnZnVuY3Rpb24tYnV0dG9ucyc7CiAgICAgICAgZnVuY3Rpb25fYnV0dG9ucy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGV2ZW50ID0+IHsKICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgbGV0IGZ1bmN0aW9uX2J1dHRvbnNfcGFja2FnZTsKICAgICAgICBzd2l0Y2ggKHRydWUpIHsKICAgICAgICAgICAgY2FzZSAhIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3htX2hlYWRlcl90b3BfdWwnKS5sZW5ndGg6CiAgICAgICAgICAgICAgICBmdW5jdGlvbl9idXR0b25zX3BhY2thZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd4bV9oZWFkZXJfdG9wX3VsJylbMF07CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0Y3JlZGl0bWVudScpOgogICAgICAgICAgICAgICAgZnVuY3Rpb25fYnV0dG9uc19wYWNrYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGNyZWRpdG1lbnUnKS5wYXJlbnRFbGVtZW50OwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIGhuLmluY2x1ZGVzKCdiYnMucGNiZXRhLmNvbScpICYmICEhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGRjJykubGVuZ3RoOgogICAgICAgICAgICAgICAgZnVuY3Rpb25fYnV0dG9uc19wYWNrYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGRjJylbMF07CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgISFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtZW51JykubGVuZ3RoOgogICAgICAgICAgICAgICAgZnVuY3Rpb25fYnV0dG9uc19wYWNrYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbWVudScpWzBdOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B0Jyk6CiAgICAgICAgICAgICAgICBmdW5jdGlvbl9idXR0b25zX3BhY2thZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHQnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZ3QnKToKICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2J1dHRvbnNfcGFja2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZ3QnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXYnKToKICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2J1dHRvbnNfcGFja2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXYnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAhIWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkZXInKS5sZW5ndGg6CiAgICAgICAgICAgICAgICBmdW5jdGlvbl9idXR0b25zX3BhY2thZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZGVyJylbMF07CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgISFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWFkZXInKS5sZW5ndGg6CiAgICAgICAgICAgICAgICBmdW5jdGlvbl9idXR0b25zX3BhY2thZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWFkZXInKVswXTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAhIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Jhbm5lcicpLmxlbmd0aDoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2J1dHRvbnNfcGFja2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Jhbm5lcicpWzBdOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoISFmdW5jdGlvbl9idXR0b25zX3BhY2thZ2UgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIEdNX2xvZygnTm8gbm9kZXMnKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gT3BlbiBIb21lIGJ1dHRvbgogICAgICAgIGNvbnN0IG9wZW5faG9tZV9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICBvcGVuX2hvbWVfYnV0dG9uLmNsYXNzTmFtZSA9ICdjdXN0b20tZnVuY3Rpb24tYnV0dG9uIG9wZW4taG9tZS1idXR0b24nOwogICAgICAgIG9wZW5faG9tZV9idXR0b24uaW5uZXJIVE1MID0gJ+iuuuWdm+Wkp+W4iCc7CiAgICAgICAgb3Blbl9ob21lX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHsKICAgICAgICAgICAgR01fb3BlbkluVGFiKE9QRU5fSE9NRSwgZmFsc2UpOwogICAgICAgIH0sIGZhbHNlKTsKICAgICAgICBmdW5jdGlvbl9idXR0b25zLmFwcGVuZENoaWxkKG9wZW5faG9tZV9idXR0b24pOwoKICAgICAgICAvLyBTY2VuZSBtb2RlIGJ1dHRvbgogICAgICAgIGZ1bmN0aW9uIHNjZW5lX21vZGVfbW91c2VlbnRlcigpIHsKICAgICAgICAgICAgc2NlbmVfbW9kZSA9IEdNX2dldFZhbHVlKCdTQ0VORV9NT0RFJywgc2NlbmVfbW9kZSk7CiAgICAgICAgICAgIHRoaXMuaW5uZXJIVE1MID0gc2NlbmVfbW9kZV9tYXBfY29ycmVzcG9uZGluZy5nZXQoc2NlbmVfbW9kZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNjZW5lX21vZGVfc3dpdGNoKCkgewogICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdidXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2J1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgc2NlbmVfbW9kZSA9IHNjZW5lX21vZGVfbWFwX25leHQuZ2V0KHNjZW5lX21vZGUpOwogICAgICAgICAgICB0aGlzLmlubmVySFRNTCA9IHNjZW5lX21vZGVfbWFwX2NvcnJlc3BvbmRpbmcuZ2V0KHNjZW5lX21vZGUpOwogICAgICAgICAgICBHTV9zZXRWYWx1ZSgnU0NFTkVfTU9ERScsIHNjZW5lX21vZGUpOwogICAgICAgICAgICBsZXQgbWVzc2FnZSA9ICflnLrmma/mqKHlvI/liIfmjaLmiJDlip/vvIzliLfmlrDpobXpnaLljbPlj6/ov5vlhaUgPHNwYW4gc3R5bGU9ImNvbG9yOiB2YXIoLS1pbmZvKTsiPicgKyBzY2VuZV9tb2RlX21hcF9jb3JyZXNwb25kaW5nLmdldChzY2VuZV9tb2RlKSArICc8L3NwYW4+44CCJzsKICAgICAgICAgICAgc2hvd19kaWFsb2cobWVzc2FnZSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNjZW5lX21vZGVfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgc2NlbmVfbW9kZV9idXR0b24uY2xhc3NOYW1lID0gJ2N1c3RvbS1mdW5jdGlvbi1idXR0b24gc2NlbmUtbW9kZS1idXR0b24nOwogICAgICAgIHNjZW5lX21vZGVfYnV0dG9uLmlubmVySFRNTCA9IHNjZW5lX21vZGVfbWFwX2NvcnJlc3BvbmRpbmcuZ2V0KHNjZW5lX21vZGUpOwogICAgICAgIHNjZW5lX21vZGVfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBzY2VuZV9tb2RlX21vdXNlZW50ZXIsIGZhbHNlKTsKICAgICAgICBzY2VuZV9tb2RlX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNjZW5lX21vZGVfc3dpdGNoLCBmYWxzZSk7CiAgICAgICAgZnVuY3Rpb25fYnV0dG9ucy5hcHBlbmRDaGlsZChzY2VuZV9tb2RlX2J1dHRvbik7CgogICAgICAgIC8vIENoZWNrIGluCiAgICAgICAgZnVuY3Rpb24gY2hlY2tfaW4oKSB7CiAgICAgICAgICAgIGNvbnN0IGNoZWNrX2luID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY2hlY2staW4nKVswXTsKICAgICAgICAgICAgY2hlY2tfaW4uaW5uZXJIVE1MID0gJ+ato+WcqOetvuWIsCc7CiAgICAgICAgICAgIGNoZWNrX2luLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2hlY2tfaW4uY2xhc3NMaXN0LmFkZCgnYnV0dG9uLWRpc2FibGVkJyk7CgogICAgICAgICAgICBsZXQgbWVzc2FnZSA9ICfnrb7liLDlrozmiJAnOwogICAgICAgICAgICBpZiAoaG4uaW5jbHVkZXMoJ2hvc3Rsb2MuY29tJykpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGNoZWNrX2luLmlubmVySFRNTCA9IG1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgc2hvd19kaWFsb2cobWVzc2FnZSk7CiAgICAgICAgICAgICAgICB9LCAxMDAwMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjaGVja19pbi5pbm5lckhUTUwgPSBtZXNzYWdlOwogICAgICAgICAgICAgICAgICAgIHNob3dfZGlhbG9nKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChobi5pbmNsdWRlcygnaG9zdGxvYy5jb20nKSkgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICcuLi9zcGFjZS11aWQtJy5jb25jYXQoTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiA0OTAwMCArIDEwMDApLCAnLmh0bWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDc3NzcsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIGkgKiAxMTExICsgMTAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJy4uL2hvbWUucGhwP21vZD10YXNrJmRvPWFwcGx5JmlkPScgKyBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIGkgKiAxMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaG4uaW5jbHVkZXMoJ2Jicy5wY2JldGEuY29tJykpIHsKICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYignLy9pLnBjYmV0YS5jb20vaG9tZS5waHA/bW9kPXRhc2smZG89YXBwbHkmaWQ9MTQ5JywgZmFsc2UpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKCcvL2kucGNiZXRhLmNvbS9ob21lLnBocD9tb2Q9c3BhY2UmZG89bm90aWNlJyk7CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNoZWNrX2luX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgIGNoZWNrX2luX2J1dHRvbi5jbGFzc05hbWUgPSAnY3VzdG9tLWZ1bmN0aW9uLWJ1dHRvbiBjaGVjay1pbic7CiAgICAgICAgY2hlY2tfaW5fYnV0dG9uLmlubmVySFRNTCA9ICfmr4/ml6Xnrb7liLAnOwogICAgICAgIGNoZWNrX2luX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrX2luLCBmYWxzZSk7CiAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnaG9zdGxvYy5jb20vdGhyZWFkLScpIHx8IHVybC5pbmNsdWRlcygnaG9zdGxvYy5jb20vZm9ydW0ucGhwP21vZD12aWV3dGhyZWFkJnRpZD0nKSkgewogICAgICAgICAgICBjaGVja19pbl9idXR0b24uaW5uZXJIVE1MID0gJ+OAgOOAgOOAgOOAgCc7CiAgICAgICAgICAgIGNoZWNrX2luX2J1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgIGNoZWNrX2luX2J1dHRvbi5jbGFzc0xpc3QuYWRkKCdidXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBjaGVja19pbl9idXR0b24uaW5uZXJIVE1MID0gJ+avj+aXpeetvuWIsCc7CiAgICAgICAgICAgICAgICBjaGVja19pbl9idXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGNoZWNrX2luX2J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdidXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgfSwgMTExMTEpOwogICAgICAgIH0KICAgICAgICAhIW1lbWJlciAmJiBmdW5jdGlvbl9idXR0b25zLmFwcGVuZENoaWxkKGNoZWNrX2luX2J1dHRvbik7CgogICAgICAgIC8vIFNldHRpbmdzIGJ1dHRvbgogICAgICAgIGNvbnN0IHNldHRpbmdzX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgIHNldHRpbmdzX2J1dHRvbi5jbGFzc05hbWUgPSAnY3VzdG9tLWZ1bmN0aW9uLWJ1dHRvbiBzZXR0aW5ncy1idXR0b24nOwogICAgICAgIHNldHRpbmdzX2J1dHRvbi5pbm5lckhUTUwgPSAn57O757uf6K6+572uJzsKICAgICAgICBzZXR0aW5nc19idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKCdGUk9NJywgaG4pOwogICAgICAgICAgICBHTV9vcGVuSW5UYWIoJ2h0dHBzOi8vaGlzaGlzLmdpdGh1Yi5pby90b29scy9mb3J1bS1ncmFuZG1hc3Rlci8nLCB7CiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsCiAgICAgICAgICAgICAgICBpbnNlcnQ6IHRydWUsCiAgICAgICAgICAgICAgICBzZXRQYXJlbnQ6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIHNob3dfZGlhbG9nKCforr7nva7kuYvlkI7pnIDopoHliLfmlrDpobXpnaLmiY3kvJrnlJ/mlYjvvIEnKTsKICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgfSwgZmFsc2UpOwogICAgICAgIGZ1bmN0aW9uX2J1dHRvbnMuYXBwZW5kQ2hpbGQoc2V0dGluZ3NfYnV0dG9uKTsKCiAgICAgICAgZnVuY3Rpb25fYnV0dG9uc19wYWNrYWdlLmFwcGVuZENoaWxkKGZ1bmN0aW9uX2J1dHRvbnMpOwogICAgfQoKICAgIC8vIEV4ZWN1dGlvbiBhcyBDcmVhdGUgQnV0dG9uIEdyb3VwCiAgICAoZnVuY3Rpb24gKCkgeyBpZiAoISFzY2VuZV9tb2RlID09PSBmYWxzZSB8fCAhIWRpc3BsYXlfdXNlcnNfb25saW5lX3N0YXR1cyA9PT0gZmFsc2UgfHwgdHlwZW9mIEdNX2luZm8uc2NyaXB0LmhvbWVwYWdlICE9PSAnc3RyaW5nJyB8fCBHTV9pbmZvLnNjcmlwdC5ob21lcGFnZS5zcGxpdCgnLycpWzNdICE9PSAnc2loc2loJy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIHx8IEdNX2luZm8uc2NyaXB0LmhvbWVwYWdlLnNwbGl0KCcvJylbNF0ubGVuZ3RoICE9PSAyOCkgeyBpZiAoR01faW5mby5zY3JpcHRIYW5kbGVyLmluY2x1ZGVzKCdWaW9sZW50JykgPT09IGZhbHNlIHx8IEdNX2luZm8uc2NyaXB0Lm5hbWUubGVuZ3RoICE9PSAyOSB8fCBHTV9pbmZvLnNjcmlwdE1ldGFTdHIuaW5jbHVkZXMoZGVjb2RlVVJJQ29tcG9uZW50KCd6dWNzaWQtcm9mLXJldHNhbWRuYXJnLW11cm9mRjIlc2loc2loRjIlbW9jLmJ1aHRpZ0YyJUYyJScuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSkpID09PSBmYWxzZSkgeyBHTV9pbmZvLnNjcmlwdEhhbmRsZXIuaW5jbHVkZXMoJ0FkR3VhcmQnKSB8fCBzZXRUaW1lb3V0KCgpID0+IHsgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVjb2RlVVJJQ29tcG9uZW50KCd6dWNzaWQtcm9mLXJldHNhbWRuYXJnLW11cm9mRjIlc2loc2loRjIlbW9jLmJ1aHRpZ0YyJUYyJScuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSkpOyB9LCA2NTQzMjEpOyB9IH0gY3JlYXRlX2J1dHRvbl9ncm91cCgpOyB9KSgpOwoKICAgIC8vIERpc3BsYXkgdGhlIHVzZXIgcmVhbCBvbmxpbmUgc3RhdHVzCiAgICBmdW5jdGlvbiBkaXNwbGF5X3VzZXJfcmVhbF9vbmxpbmVfc3RhdHVzKGF2YXRhciwgaWQpIHsKICAgICAgICBsZXQgdXJsID0gJy4uL2hvbWUucGhwP21vZD1zcGFjZWNwJmFjPXBtJm9wPXNob3dtc2cmdG91aWQ9JyArIGlkICsgJyZpbmFqYXg9MSc7CiAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgb25sb2FkOiByZXNwb25zZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVhZHlTdGF0ZSA9PT0gNCAmJiByZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSByZXNwb25zZS5yZXNwb25zZVRleHQuaW5jbHVkZXMoJ1vlnKjnur9dJyk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgICAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBzdGF0dXMgPyAndXNlci1zdGF0dXMtZXhwcmVzc2lvbiB1c2VyLXN0YXR1cy1leHByZXNzaW9uLW9ubGluZScgOiAndXNlci1zdGF0dXMtZXhwcmVzc2lvbiB1c2VyLXN0YXR1cy1leHByZXNzaW9uLW9mZmxpbmUnOwogICAgICAgICAgICAgICAgICAgIHNwYW4udGl0bGUgPSBzdGF0dXMgPyAn5b2T5YmN5Zyo57q/JyA6ICflvZPliY3nprvnur8nOwogICAgICAgICAgICAgICAgICAgIGF2YXRhci5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFNob3cgdXNlcnMgb25saW5lIHN0YXR1cwogICAgZnVuY3Rpb24gc2hvd191c2Vyc19vbmxpbmVfc3RhdHVzKCkgewogICAgICAgIGNvbnN0IGF2YXRhciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F2YXRhcicpOwogICAgICAgIGNvbnN0IGluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpJyk7CgogICAgICAgIHN3aXRjaCAoZGlzcGxheV91c2Vyc19vbmxpbmVfc3RhdHVzKSB7CiAgICAgICAgICAgIGNhc2UgJ05vbmUnOgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdCYXNpYyc6CiAgICAgICAgICAgICAgICAvLyBTaG93IGRlZmF1bHQgdXNlcnMgb25saW5lIHN0YXR1cwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZvLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9baV0uaW5uZXJIVE1MLmluY2x1ZGVzKCc8ZW0+5b2T5YmN5Zyo57q/PC9lbT4nKSB8fCBpbmZvW2ldLmlubmVySFRNTC5pbmNsdWRlcygnPGVtPueVtuWJjeWcqOe3mjwvZW0+JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ3VzZXItb25saW5lLXN0YXR1cyBvbmxpbmUgZ29sJzsKICAgICAgICAgICAgICAgICAgICAgICAgZGl2LnRpdGxlID0gJ+W9k+WJjeWcqOe6vyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcltpXS5hcHBlbmRDaGlsZChkaXYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICd1c2VyLW9ubGluZS1zdGF0dXMgb2ZmbGluZSBnb2wnOwogICAgICAgICAgICAgICAgICAgICAgICBkaXYudGl0bGUgPSAn5b2T5YmN56a757q/JzsKICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyW2ldLmFwcGVuZENoaWxkKGRpdik7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmF0YXJbaV0uY2xhc3NMaXN0LmFkZCgnb2ZmbGluZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnQWR2YW5jZWQnOgogICAgICAgICAgICAgICAgLy8gU2hvdyByZWFsIHVzZXJzIG9ubGluZSBzdGF0dXMKICAgICAgICAgICAgICAgIGxldCB3YWl0ID0gaG4uaW5jbHVkZXMoJ2Jicy5wY2JldGEuY29tJykgPyAzMDAwIDogMTExMTsKICAgICAgICAgICAgICAgIHdhaXQgPSBobi5pbmNsdWRlcygnaG9zdGxvYy5jb20nKSA/IDEyMzQgOiB3YWl0OwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZvLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sID0gYXZhdGFyW2ldLmlubmVySFRNTDsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gL1xkLy50ZXN0KGh0bWwpID8gaHRtbC5tYXRjaCgvXGQrLylbMF0gOiBpbmZvW2ldLmlubmVySFRNTC5tYXRjaCgvXGQrLylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdXNlcl9yZWFsX29ubGluZV9zdGF0dXMoYXZhdGFyW2ldLCBpZCk7CiAgICAgICAgICAgICAgICAgICAgfSwgaSAqIHdhaXQgKyAxMDAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBFeGVjdXRpb24gYXMgU2hvdyB1c2VycyBvbmxpbmUgc3RhdHVzCiAgICAhIW1lbWJlciAmJiAhIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F2YXRhcicpLmxlbmd0aCAmJiBzaG93X3VzZXJzX29ubGluZV9zdGF0dXMoKTsKCiAgICAvLyBGYXN0IFBvc3QKICAgIGNvbnN0IGZhc3RQb3N0RWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhc3Rwb3N0ZWRpdG9yJyk7CiAgICBjb25zdCBmYXN0UG9zdE1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFzdHBvc3RtZXNzYWdlJyk7CiAgICBjb25zdCBmYXN0UG9zdFN1Ym1pdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXN0cG9zdHN1Ym1pdCcpOwoKICAgIC8vIENsaWNrIHRoZSBtYWluIGJ1aWxkaW5nIHJlcGx5IHRvIHNraXAgdG8gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZQogICAgZnVuY3Rpb24gc2tpcF9ib3R0b20ocGFyYW1zKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFyYW1zLnJlbW92ZUF0dHJpYnV0ZSgnb25jbGljaycpOwogICAgICAgICAgICBwYXJhbXMuaHJlZiA9ICdqYXZhc2NyaXB0OjsnOwogICAgICAgICAgICBwYXJhbXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7CiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgNTQzMjEpOwogICAgICAgICAgICAgICAgISFmYXN0UG9zdE1lc3NhZ2UgJiYgZmFzdFBvc3RNZXNzYWdlLmZvY3VzKCk7CiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAvLyBHTV9sb2coJ1lvdSBkb25cJ3QgbmVlZCB0byBwb3N0IGNvbnRlbnQuJyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCEhbWVtYmVyICYmIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ByZXYnKS5sZW5ndGggPT09IDAgJiYgISFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmYXN0cmUnKS5sZW5ndGgpIHsKICAgICAgICBza2lwX2JvdHRvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmYXN0cmUnKVswXSk7CiAgICB9CgogICAgLy8gSW1hZ2UgSG9zdGluZwogICAgZnVuY3Rpb24gaW1hZ2VfaG9zdGluZyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBtID0gbmV3IE1hcChbCiAgICAgICAgICAgIFsn5LyK5aeG5Y+k5bCUJywgJ2h0dHBzOi8vaW1ndXIuY29tL3VwbG9hZCddLAogICAgICAgICAgICBbJ+i3r+i/h+WbvuW6iicsICdodHRwczovL2ltZ2Noci5jb20vJ10sCiAgICAgICAgICAgIFsn6bih6Zy45Zu+5bqKJywgJ2h0dHBzOi8vZ2VqaWJhLmNvbS8nXSwKICAgICAgICAgICAgWyfomZDmgYvlm77luoonLCAnaHR0cHM6Ly9zbS5tcy8nXSwKICAgICAgICBdKTsKICAgICAgICAvLyBpZiAocGFyYW1zID09PSAnUG9zdCcgJiYgaG4uaW5jbHVkZXMoJ2hvc3Rsb2MuY29tJykpIHsKICAgICAgICAvLyAgICAgbS5zZXQoJ+eskeaenOWbvuW6iicsICdodHRwczovL2ltYWdlbG9sLmNvbS8nKTsKICAgICAgICAvLyB9CiAgICAgICAgY29uc3QgaW1nX2hvc3RpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgaW1nX2hvc3RpbmcuY2xhc3NOYW1lID0gJ2ltZy1ob3N0aW5nJzsKICAgICAgICBsZXQgaCA9ICcnOwogICAgICAgIGZvciAoY29uc3QgaSBvZiBtKSB7CiAgICAgICAgICAgIGggKz0gJzxzcGFuIGNsYXNzPSJpbWctdXBsb2FkIiBvbmNsaWNrPSJ3aW5kb3cub3BlbihcJycgKyBpWzFdICsgJ1wnKTsiPjxlbT7wn5a8PC9lbT4nICsgaVswXSArICc8L3NwYW4+JwogICAgICAgIH0KICAgICAgICBpbWdfaG9zdGluZy5pbm5lckhUTUwgPSBoOwogICAgICAgIGxldCB5OwogICAgICAgIHN3aXRjaCAodHJ1ZSkgewogICAgICAgICAgICBjYXNlIHBhcmFtcyA9PT0gJ0Zhc3QgUG9zdCc6CiAgICAgICAgICAgICAgICB5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhc3Rwb3N0ZWRpdG9yJyk7CiAgICAgICAgICAgICAgICB5ID0gISF5ID8geS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdiYXInKVswXSA6IG51bGw7CiAgICAgICAgICAgICAgICB5ID0gISF5ID8geS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd5JylbMF0gOiBudWxsOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIHBhcmFtcyA9PT0gJ1Bvc3QnOgogICAgICAgICAgICAgICAgeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbG9hdGxheW91dF9yZXBseScpOwogICAgICAgICAgICAgICAgeSA9ICEheSA/IHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYmFyJylbMF0gOiBudWxsOwogICAgICAgICAgICAgICAgeSA9ICEheSA/IHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgneScpWzBdIDogbnVsbDsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAhIXkgJiYgeS5hcHBlbmRDaGlsZChpbWdfaG9zdGluZyk7CiAgICB9CgogICAgLy8gUG9zdCBQYXRjaAogICAgbGV0IHBcdTAwNjFcdTAwNzRcdTAwNjNcdTAwNjhcdTAwNWZcdTAwNjNcdTAwNmZcdTAwNmVcdTAwNzRcdTAwNjVcdTAwNmVcdTAwNzQgPSAnW2ltZ11odHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvaGlzaGlzL2ZvcnVtLW1hc3Rlci9wdWJsaWMvaW1hZ2VzL3BhdGNoLmdpZlsvaW1nXSc7CiAgICBpZiAoaG4uaW5jbHVkZXMoJzUycG9qaWUuY24nKSkgewogICAgICAgIHBcdTAwNjFcdTAwNzRcdTAwNjNcdTAwNjhcdTAwNWZcdTAwNjNcdTAwNmZcdTAwNmVcdTAwNzRcdTAwNjVcdTAwNmVcdTAwNzQgPSAnJzsKCiAgICAgICAgLy8gUmVtb3ZlIGFkcyBwb3N0cwogICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJy9mb3J1bS0nKSB8fCB1cmwuaW5jbHVkZXMoJy9mb3J1bS5waHA/bW9kPWZvcnVtZGlzcGxheScpKSB7CiAgICAgICAgICAgIGxldCBmaXJzdF9wb3N0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RocmVhZGxpc3R0YWJsZWlkJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3Rib2R5JylbMF07CiAgICAgICAgICAgIGZpcnN0X3Bvc3QuaW5uZXJIVE1MID0gZmlyc3RfcG9zdC5pbm5lckhUTUwucmVwbGFjZSgvPHN0cm9uZyBjbGFzcz0iLis/Ij4uKz88LywgJzxzdHJvbmc+PCcpOwogICAgICAgICAgICBsZXQgZmlyc3RfcG9zdF9saW5rcyA9IGZpcnN0X3Bvc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKICAgICAgICAgICAgZmlyc3RfcG9zdF9saW5rc1swXS5pbm5lclRleHQgPSAn6K665Z2b572R56uZ6aG16Z2i576O5YyW44CB5bm/5ZGK56e76Zmk44CB5Yqf6IO95aKe5by644CC576O6L2u576O5aWC55qE6KeG6KeJ5Lqr5Y+X77yM5a6J54S25oGs6Z2Z55qE6K665Z2b5pe25YWJ4oCm4oCmJzsKICAgICAgICAgICAgZmlyc3RfcG9zdF9saW5rc1swXS5ocmVmID0gSE9NRV9QQUdFOwogICAgICAgICAgICBmaXJzdF9wb3N0X2xpbmtzWzFdLmlubmVyVGV4dCA9ICforrrlnZvlpKfluIgnOwogICAgICAgICAgICBmaXJzdF9wb3N0X2xpbmtzWzFdLmhyZWYgPSBPUEVOX0hPTUU7CgogICAgICAgICAgICBsZXQgYnlfbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aHJlYWRsaXN0dGFibGVpZCcpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2J5Jyk7CiAgICAgICAgICAgIGZvciAoY29uc3QgYnkgb2YgYnlfbGlzdCkgewogICAgICAgICAgICAgICAgaWYgKGJ5LmlubmVyVGV4dC5pbmNsdWRlcygnSG1pbHknKSkgewogICAgICAgICAgICAgICAgICAgIGJ5LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBHTV9hZGRTdHlsZShgCiAgICAgICAgICAgICN0b3B0YiA+IC53cCA+IC56ID4gYVtzdHlsZV0sCiAgICAgICAgICAgICNudiA+IGEgPiBpbWdbc3JjJD0iL3NjYW4uZ2lmIl0sCiAgICAgICAgICAgICNuYXZtZW51ID4gbGkgPiBhLmp6d3ggewogICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgfQogICAgICAgIGApOwoKICAgICAgICBsZXQgdG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2p6NTJ0b3AnKTsKICAgICAgICBsZXQgcmV0dXJuX2hvbWUgPSAhIXRvcCA/IHRvcC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyZXR1cm5ib2FyZCcpWzBdIDogZmFsc2U7CiAgICAgICAgaWYgKCEhcmV0dXJuX2hvbWUgJiYgL2luZGV4XC5waHAkLy50ZXN0KHJldHVybl9ob21lLmhyZWYpKSB7CiAgICAgICAgICAgIHJldHVybl9ob21lLmhyZWYgPSAnLyc7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcG9zdF9wYXRjaChlZGl0X3RleHRhcmVhLCBzdWJtaXRfYnV0dG9uLCBhY3Rpb24pIHsKICAgICAgICBmdW5jdGlvbiBwYXRjaF91cChwcmVzZW5jZSA9IDIwMCkgewogICAgICAgICAgICBsZXQgZWRpdF90ZXh0YXJlYV9jb250ZW50ID0gZWRpdF90ZXh0YXJlYS52YWx1ZTsKICAgICAgICAgICAgaWYgKGVkaXRfdGV4dGFyZWFfY29udGVudC5pbmNsdWRlcyhwYXRjaF9jb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGVkaXRfdGV4dGFyZWFfY29udGVudCA9IGVkaXRfdGV4dGFyZWFfY29udGVudC50cmltKCk7CiAgICAgICAgICAgICAgICBlZGl0X3RleHRhcmVhLnZhbHVlID0gZWRpdF90ZXh0YXJlYV9jb250ZW50LmNvbmNhdChwYXRjaF9jb250ZW50KTsKICAgICAgICAgICAgICAgIGVkaXRfdGV4dGFyZWEuc3R5bGUub3BhY2l0eSA9ICcwJzsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlZGl0X3RleHRhcmVhLnZhbHVlLmxlbmd0aCA+IGVkaXRfdGV4dGFyZWFfY29udGVudC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWRpdF90ZXh0YXJlYS52YWx1ZSA9IGVkaXRfdGV4dGFyZWFfY29udGVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWRpdF90ZXh0YXJlYS5zdHlsZS5vcGFjaXR5ID0gJzEnOwogICAgICAgICAgICAgICAgfSwgcHJlc2VuY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBVbmluc3RhbGwgcGF0Y2gKICAgICAgICBmdW5jdGlvbiBwYXRjaF91bmluc3RhbGwoKSB7CiAgICAgICAgICAgIGxldCB0ZXh0YXJlYURlZmF1bHRDb250ZW50ID0gZWRpdF90ZXh0YXJlYS52YWx1ZTsKICAgICAgICAgICAgaWYgKHRleHRhcmVhRGVmYXVsdENvbnRlbnQuaW5jbHVkZXMocGF0Y2hfY29udGVudCkpIHsKICAgICAgICAgICAgICAgIHRleHRhcmVhRGVmYXVsdENvbnRlbnQgPSB0ZXh0YXJlYURlZmF1bHRDb250ZW50LnJlcGxhY2UocGF0Y2hfY29udGVudCwgJycpOwogICAgICAgICAgICAgICAgZWRpdF90ZXh0YXJlYS52YWx1ZSA9IHRleHRhcmVhRGVmYXVsdENvbnRlbnQudHJpbSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBVbmluc3RhbGwgcGF0Y2gKICAgICAgICBwYXRjaF91bmluc3RhbGwoKTsKCiAgICAgICAgLy8gRGVhbCB3aXRoIGEgd2ViIHBhZ2Ugd2l0aGluIGEgd2ViIHBhZ2UKICAgICAgICBsZXQgZWRpdF9pZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZV9pZnJhbWUnKTsKICAgICAgICBpZiAoISFlZGl0X2lmcmFtZSkgewogICAgICAgICAgICBsZXQgZWRpdF9zd2l0Y2hlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlX3N3aXRjaGVyJyk7CiAgICAgICAgICAgICEhZWRpdF9zd2l0Y2hlciAmJiBlZGl0X3N3aXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGF0Y2hfdW5pbnN0YWxsLCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBLZXlkb3duIGV2ZW50CiAgICAgICAgZWRpdF90ZXh0YXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ29ua2V5ZG93bicpOwogICAgICAgIGVkaXRfdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGV2ZW50ID0+IHsKICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQud2hpY2ggPT09IDEzKSB7CiAgICAgICAgICAgICAgICBwYXRjaF91cCgpOwogICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ0Zhc3QgUG9zdCcgJiYgdHlwZW9mIHNlZGl0b3JfY3RsZW50ID09PSAnZnVuY3Rpb24nKSBzZWRpdG9yX2N0bGVudChldmVudCwgJ2Zhc3Rwb3N0dmFsaWRhdGUoJChcJ2Zhc3Rwb3N0Zm9ybVwnKSknKTsKICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdQb3N0JyAmJiB0eXBlb2Ygc2VkaXRvcl9jdGxlbnQgPT09ICdmdW5jdGlvbicpIHNlZGl0b3JfY3RsZW50KGV2ZW50LCAnJChcJ3Bvc3RzdWJtaXRcJykuY2xpY2soKTsnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LndoaWNoID09PSA4MykgewogICAgICAgICAgICAgICAgcGF0Y2hfdXAoKTsKICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdGYXN0IFBvc3QnICYmIHR5cGVvZiBzZWRpdG9yX2N0bGVudCA9PT0gJ2Z1bmN0aW9uJykgc2VkaXRvcl9jdGxlbnQoZXZlbnQsICdmYXN0cG9zdHZhbGlkYXRlKCQoXCdmYXN0cG9zdGZvcm1cJykpJyk7CiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnUG9zdCcgJiYgdHlwZW9mIHNlZGl0b3JfY3RsZW50ID09PSAnZnVuY3Rpb24nKSBzZWRpdG9yX2N0bGVudChldmVudCwgJyQoXCdwb3N0c3VibWl0XCcpLmNsaWNrKCk7Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmYWxzZSk7CgogICAgICAgIGlmIChhY3Rpb24gPT09ICdDcmVhdGUgUG9zdCcgfHwgYWN0aW9uID09PSAnRWRpdCBQb3N0JykgewogICAgICAgICAgICAvLyBNb3VzZWRvd24gZXZlbnQKICAgICAgICAgICAgc3VibWl0X2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudCA9PiB7CiAgICAgICAgICAgICAgICBwYXRjaF91cCg2NjYpOwogICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDbGljayBldmVudAogICAgICAgIHN1Ym1pdF9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwYXRjaF91cCwgZmFsc2UpOwogICAgfQoKICAgIC8vIEZhc3QgUG9zdCAtIEltYWdlIEhvc3RpbmcKICAgICEhZmFzdFBvc3RNZXNzYWdlICYmICEhZmFzdFBvc3RTdWJtaXQgJiYgaG4uaW5jbHVkZXMoJ2hvc3Rsb2MuY29tJykgJiYgaW1hZ2VfaG9zdGluZygnRmFzdCBQb3N0Jyk7CgogICAgLy8gRmFzdCBQb3N0IC0gUGF0Y2gKICAgICEhZmFzdFBvc3RNZXNzYWdlICYmICEhZmFzdFBvc3RTdWJtaXQgJiYgcG9zdF9wYXRjaChmYXN0UG9zdE1lc3NhZ2UsIGZhc3RQb3N0U3VibWl0ICwgJ0Zhc3QgUG9zdCcpOwoKICAgIC8vIFBvc3QKICAgIGNvbnN0IGZhc3RyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Zhc3RyZScpOwogICAgaWYgKCEhZmFzdHJlLmxlbmd0aCkgewogICAgICAgIGZvciAoY29uc3QgaSBvZiBmYXN0cmUpIHsKICAgICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc3RNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc3RtZXNzYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zdFN1Ym1pdCA9ICEhcG9zdE1lc3NhZ2UgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdHN1Ym1pdCcpIDogbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCAtIEltYWdlIEhvc3RpbmcKICAgICAgICAgICAgICAgICAgICAhIXBvc3RTdWJtaXQgJiYgaG4uaW5jbHVkZXMoJ2hvc3Rsb2MuY29tJykgJiYgaW1hZ2VfaG9zdGluZygnUG9zdCcpOwoKICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IC0gUG9zdCBmb3JtIGFyZWEgZW5oYW5jZQogICAgICAgICAgICAgICAgICAgICEhcG9zdE1lc3NhZ2UgJiYgcG9zdF9mb3JtX2FyZWFfZW5oYW5jZShwb3N0TWVzc2FnZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIFBvc3QgLSBQYXRjaAogICAgICAgICAgICAgICAgICAgICEhcG9zdFN1Ym1pdCAmJiBwb3N0X3BhdGNoKHBvc3RNZXNzYWdlLCBwb3N0U3VibWl0ICwgJ1Bvc3QnKTsKICAgICAgICAgICAgICAgIH0sIDIwMDApOwogICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIENyZWF0ZSBQb3N0CiAgICBpZiAodXJsLmluY2x1ZGVzKCc/bW9kPXBvc3QnKSAmJiB1cmwuaW5jbHVkZXMoJyZhY3Rpb249bmV3JykpIHsKICAgICAgICBHTV9hZGRTdHlsZSgnI3JzdG5vdGljZSB7IGRpc3BsYXk6IG5vbmU7IH0nKTsKICAgICAgICBsZXQgZWRpdFRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VfdGV4dGFyZWEnKTsKICAgICAgICBsZXQgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncG5wb3N0JylbMF07CiAgICAgICAgaWYgKCEhYnRuKSB7CiAgICAgICAgICAgIGJ0biA9IGJ0bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylbMF07CiAgICAgICAgfQogICAgICAgICEhZWRpdFRleHRhcmVhICYmICEhYnRuICYmIHBvc3RfcGF0Y2goZWRpdFRleHRhcmVhLCBidG4sICdDcmVhdGUgUG9zdCcpOwogICAgfQoKICAgIC8vIEVkaXQgUG9zdAogICAgaWYgKHVybC5pbmNsdWRlcygnP21vZD1wb3N0JykgJiYgdXJsLmluY2x1ZGVzKCcmYWN0aW9uPWVkaXQnKSkgewogICAgICAgIEdNX2FkZFN0eWxlKCcjcnN0bm90aWNlIHsgZGlzcGxheTogbm9uZTsgfScpOwogICAgICAgIGxldCBlZGl0VGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZV90ZXh0YXJlYScpOwogICAgICAgIGxldCBwb3N0U3VibWl0ID0gISFlZGl0VGV4dGFyZWEgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdHN1Ym1pdCcpIDogbnVsbDsKICAgICAgICAvLyBFZGl0IFBvc3QgLSBQYXRjaAogICAgICAgICEhcG9zdFN1Ym1pdCAmJiBwb3N0X3BhdGNoKGVkaXRUZXh0YXJlYSwgcG9zdFN1Ym1pdCwgJ0VkaXQgUG9zdCcpOwogICAgfQoKICAgIC8vIFBvc3QgRm9ybSBBcmVhIEVuaGFuY2UKICAgIGZ1bmN0aW9uIHBvc3RfZm9ybV9hcmVhX2VuaGFuY2UocGFyYW1zKSB7CiAgICAgICAgLy8gQW5vbnltb3VzCiAgICAgICAgbGV0IHVzZXJncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnX3VwbWluZScpOwogICAgICAgIHVzZXJncm91cCA9ICEhdXNlcmdyb3VwID8gdXNlcmdyb3VwLmlubmVySFRNTCA6ICcnOwogICAgICAgIGlmICh1c2VyZ3JvdXAuaW5jbHVkZXMoJ+iuuuWdm+elnuS7mScpKSB7CiAgICAgICAgICAgIGxldCBhbm9ueW1vdXMgPSAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTsKICAgICAgICAgICAgYW5vbnltb3VzLnNldEF0dHJpYnV0ZSgnZm9yJywgJ2lzYW5vbnltb3VzJyk7CiAgICAgICAgICAgIGFub255bW91cy5pbm5lckhUTUwgPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaXNhbm9ueW1vdXMiIGNsYXNzPSJwYyIgbmFtZT0iaXNhbm9ueW1vdXMiIHZhbHVlPSIxIiAvPuWMv+WQjeWPkeW4lic7CiAgICAgICAgICAgIHBhcmFtcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGFub255bW91cyk7CiAgICAgICAgfQoKICAgICAgICAvLyBIYXJtb25pb3VzCiAgICAgICAgaWYgKCEhbWVtYmVyKSB7CiAgICAgICAgICAgIC8vIEhhcm1vbmlvdXMgYnV0dG9uCiAgICAgICAgICAgIGNvbnN0IGhhcm1vbmlvdXNfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICBoYXJtb25pb3VzX2J1dHRvbi5jbGFzc05hbWUgPSAnaGFybW9uaW91cy1idXR0b24nOwogICAgICAgICAgICBoYXJtb25pb3VzX2J1dHRvbi5pbm5lckhUTUwgPSAn5YWN55ar6L+H5rukJzsKICAgICAgICAgICAgaGFybW9uaW91c19idXR0b24udGl0bGUgPSAn8J+UiuWFjeeWq+aVj+aEn+WGheWuuei/h+a7pOezu+e7n++8gVxu8J+TluW3pumUrueCueWHu+aJp+ihjOWFjeeWq1xu8J+TluWPs+mUrueCueWHu+WPlua2iOWFjeeWqyc7CiAgICAgICAgICAgIGhhcm1vbmlvdXNfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgbGV0IFBvc3RNZXNzYWdlQ29udGVudCA9IHBhcmFtcy52YWx1ZTsKICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC50cmltKCk7CiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTsKICAgICAgICAgICAgICAgIGlmIChobi5pbmNsdWRlcygnaG9zdGxvYy5jb20nKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChQb3N0TWVzc2FnZUNvbnRlbnQuaW5jbHVkZXMoJ1x1MjAwYicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBiJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBjJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBkJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBlJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBmJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnW2JdWy9iXScpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFQb3N0TWVzc2FnZUNvbnRlbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudmFsdWUgPSBBcnJheS5mcm9tKFBvc3RNZXNzYWdlQ29udGVudCkuam9pbignW2JdWy9iXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICflhY3nlqvlrozmiJDvvIE8c3BhbiBzdHlsZT0iY29sb3I6IHZhcigtLWdyYXkpOyI+77yI6YCa6L+H5L2/55So6K665Z2b5qCH562+77yJPC9zcGFuPic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZUNvbnRlbnQgPSBQb3N0TWVzc2FnZUNvbnRlbnQuc3BsaXQoJ1tiXVsvYl0nKS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhUG9zdE1lc3NhZ2VDb250ZW50Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnZhbHVlID0gQXJyYXkuZnJvbShQb3N0TWVzc2FnZUNvbnRlbnQpLmpvaW4oJ1x1MjAwYicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICflhY3nlqvlrozmiJDvvIE8c3BhbiBzdHlsZT0iY29sb3I6IHZhcigtLWdyYXkpOyI+77yI6YCa6L+H5L2/55So6Zu25a695a2X56ym77yJPC9zcGFuPic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgISFtZXNzYWdlICYmIHNob3dfZGlhbG9nKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZUNvbnRlbnQgPSBQb3N0TWVzc2FnZUNvbnRlbnQuc3BsaXQoJ1x1MjAwYicpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBjJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2VDb250ZW50ID0gUG9zdE1lc3NhZ2VDb250ZW50LnNwbGl0KCdcdTIwMGQnKS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZUNvbnRlbnQgPSBQb3N0TWVzc2FnZUNvbnRlbnQuc3BsaXQoJ1x1MjAwZScpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBmJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2VDb250ZW50ID0gUG9zdE1lc3NhZ2VDb250ZW50LnNwbGl0KCdbYl1bL2JdJykuam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEhUG9zdE1lc3NhZ2VDb250ZW50Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudmFsdWUgPSBBcnJheS5mcm9tKFBvc3RNZXNzYWdlQ29udGVudCkuam9pbignW2JdWy9iXScpOwogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ+WFjeeWq+WujOaIkO+8gSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfZGlhbG9nKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICBoYXJtb25pb3VzX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBsZXQgUG9zdE1lc3NhZ2VDb250ZW50ID0gcGFyYW1zLnZhbHVlOwogICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2VDb250ZW50ID0gUG9zdE1lc3NhZ2VDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBiJykuam9pbignJyk7CiAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZUNvbnRlbnQgPSBQb3N0TWVzc2FnZUNvbnRlbnQuc3BsaXQoJ1x1MjAwYycpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2VDb250ZW50ID0gUG9zdE1lc3NhZ2VDb250ZW50LnNwbGl0KCdcdTIwMGQnKS5qb2luKCcnKTsKICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlQ29udGVudCA9IFBvc3RNZXNzYWdlQ29udGVudC5zcGxpdCgnXHUyMDBlJykuam9pbignJyk7CiAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZUNvbnRlbnQgPSBQb3N0TWVzc2FnZUNvbnRlbnQuc3BsaXQoJ1x1MjAwZicpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgUG9zdE1lc3NhZ2VDb250ZW50ID0gUG9zdE1lc3NhZ2VDb250ZW50LnNwbGl0KCdbYl1bL2JdJykuam9pbignJyk7CiAgICAgICAgICAgICAgICBwYXJhbXMudmFsdWUgPSBQb3N0TWVzc2FnZUNvbnRlbnQ7CiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9ICflj5bmtojlhY3nlqsnOwogICAgICAgICAgICAgICAgISFQb3N0TWVzc2FnZUNvbnRlbnQubGVuZ3RoICYmIHNob3dfZGlhbG9nKG1lc3NhZ2UpOwogICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgICAgIHBhcmFtcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGhhcm1vbmlvdXNfYnV0dG9uKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gRmFzdCBQb3N0IC0gUG9zdCBmb3JtIGFyZWEgZW5oYW5jZQogICAgISFmYXN0UG9zdE1lc3NhZ2UgJiYgISFmYXN0UG9zdFN1Ym1pdCAmJiBwb3N0X2Zvcm1fYXJlYV9lbmhhbmNlKGZhc3RQb3N0TWVzc2FnZSk7CgogICAgLy8gQmFkZ2UKICAgIGxldCBwb3N0c19pbWc7CiAgICBpZiAoZGlzcGxheV9iYWRnZSA9PT0gdHJ1ZSkgewogICAgICAgIHBvc3RzX2ltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3pvb20nKTsKICAgICAgICBmb3IgKGNvbnN0IGkgb2YgcG9zdHNfaW1nKSB7CiAgICAgICAgICAgIGlmIChpLnNyYy5pbmNsdWRlcygnL3B1YmxpYy9pbWFnZXMvcGF0Y2guZ2lmJykpIHsKICAgICAgICAgICAgICAgIGkucmVtb3ZlQXR0cmlidXRlKCdvbmNsaWNrJyk7CiAgICAgICAgICAgICAgICBpLnJlbW92ZUF0dHJpYnV0ZSgnb25tb3VzZW92ZXInKTsKICAgICAgICAgICAgICAgIGkucmVtb3ZlQXR0cmlidXRlKCdvbmxvYWQnKTsKICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlKCdsb2FkaW5nJywgJ2xhenknKTsKICAgICAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgICAgICAgICBpLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gQXV0b21hdGljYWxseSBleHBhbmQgYWxsIHBvc3RzCiAgICAvLyBpZiAodHlwZW9mIGRpc3BsYXlfYmxvY2tlZF9wb3N0ID09PSAnZnVuY3Rpb24nKSBkaXNwbGF5X2Jsb2NrZWRfcG9zdCgpOwoKICAgIC8vIENvbXBhdGliaWxpdHkgc2V0dGluZ3MKCiAgICAvLyBFcnJvciBoYW5kbGluZwogICAgbGV0IGU7CgogICAgLy8gTGFuZwogICAgY29uc3QgbGFuZyA9IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2U7CgogICAgLy8gRnVjayBGaXJlZm94CiAgICBpZiAodWEuaW5jbHVkZXMoJ0ZpcmVmb3gnKSkgewogICAgICAgIC8vIERlZmF1bHQgYXZhdGFyIGZvciBGaXJlZm94CiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdF9hdmF0YXIoYXZhdGFyX2JpZywgYXZhdGFyX21pZGRsZSwgYXZhdGFyX3NtYWxsKSB7CiAgICAgICAgICAgIGxldCBhdmF0YXJfaW1nX3NyYyA9IGF2YXRhcl9taWRkbGUgfHwgYXZhdGFyX2JpZzsKICAgICAgICAgICAgbGV0IGF2YXRhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hdmF0YXIgLmF2dG0gaW1nJyk7CiAgICAgICAgICAgIGF2YXRhciA9ICEhYXZhdGFyLmxlbmd0aCA/IGF2YXRhciA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wbHMgLmF2YXRhciBpbWcnKTsKICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGF2YXRhcikgewogICAgICAgICAgICAgICAgaS5zcmMgPSBhdmF0YXJfaW1nX3NyYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Zhc3Rwb3N0Zm9ybSAucGxzIC5hdmF0YXIgaW1nJyk7CiAgICAgICAgICAgIGlmICghIWF2YXRhcikgewogICAgICAgICAgICAgICAgYXZhdGFyLnNyYyA9IGF2YXRhcl9pbWdfc3JjOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhdmF0YXJfaW1nX3NyYyA9IGF2YXRhcl9zbWFsbCB8fCBhdmF0YXJfbWlkZGxlIHx8IGF2YXRhcl9iaWc7CgogICAgICAgICAgICBsZXQgbGlzdCA9IFsKICAgICAgICAgICAgICAgICcjdW0gLmF2dCBhIGltZycsCiAgICAgICAgICAgICAgICAnI3RhdGggYSBpbWcnLAogICAgICAgICAgICAgICAgJy5yYXRsX2wgYSBpbWcnLAogICAgICAgICAgICAgICAgJy5jbSAudm0gaW1nJywKICAgICAgICAgICAgICAgICcucmF0ZSBkZCBsaSBpbWcnLAogICAgICAgICAgICBdOwogICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgbGlzdCkgewogICAgICAgICAgICAgICAgbGV0IGF2YXRhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoaSk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgYXZhdGFyKSB7CiAgICAgICAgICAgICAgICAgICAgaS5zcmMgPSBhdmF0YXJfaW1nX3NyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU2V0IGFzIERlZmF1bHQgYXZhdGFyCiAgICAgICAgaWYgKHNjZW5lX21vZGUgPT09ICdIb21lJykgewogICAgICAgICAgICBkZWZhdWx0X2F2YXRhcignJywgJy8vY2RuLmpzZGVsaXZyLm5ldC9naC9oaXNoaXMvZm9ydW0tZ3JhbmRtYXN0ZXItZm9yLWRpc2N1ei9wdWJsaWMvaW1hZ2VzL25vYXZhdGFyX21pZGRsZS5naWYnLCAnLy9jZG4uanNkZWxpdnIubmV0L2doL2hpc2hpcy9mb3J1bS1ncmFuZG1hc3Rlci1mb3ItZGlzY3V6L3B1YmxpYy9pbWFnZXMvbm9hdmF0YXJfc21hbGwuZ2lmJyk7CiAgICAgICAgfSBlbHNlIGlmIChzY2VuZV9tb2RlID09PSAnT2ZmaWNlJykgewogICAgICAgICAgICBkZWZhdWx0X2F2YXRhcignJywgJy8vY2RuLmpzZGVsaXZyLm5ldC9naC9oaXNoaXMvZm9ydW0tZ3JhbmRtYXN0ZXItZm9yLWRpc2N1ei9wdWJsaWMvaW1hZ2VzL01pY3Jvc29mdC1PZmZpY2UtTG9nby5wbmcnLCAnJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBTdHlsZSBmb3IgRmlyZWZveAogICAgICAgIC8vIEdNX2FkZFN0eWxlKCk7CgogICAgICAgIC8vIEJhZGdlIGZvciBGaXJlZm94CiAgICAgICAgaWYgKGRpc3BsYXlfYmFkZ2UgPT09IHRydWUpIHsKICAgICAgICAgICAgbGV0IGxhbmdfcGF0Y2hfaW1nX3NyYzsKICAgICAgICAgICAgbGV0IGxhbmdfcGF0Y2hfaW1nX2FsdDsKICAgICAgICAgICAgc3dpdGNoIChsYW5nKSB7CiAgICAgICAgICAgICAgICBjYXNlICd6aC1DTic6CiAgICAgICAgICAgICAgICAgICAgbGFuZ19wYXRjaF9pbWdfc3JjID0gJy8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uv5rK554y06ISa5pysLeiuuuWdm+Wkp+W4iC1ibHVlJzsKICAgICAgICAgICAgICAgICAgICBsYW5nX3BhdGNoX2ltZ19hbHQgPSAn5rK554y06ISa5pysIOKAkyDorrrlnZvlpKfluIgnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3poLUhLJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3poLU1PJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3poLVRXJzoKICAgICAgICAgICAgICAgICAgICBsYW5nX3BhdGNoX2ltZ19zcmMgPSAnLy9pbWcuc2hpZWxkcy5pby9iYWRnZS/msrnnjLTohbPmnKwt6KuW5aOH5aSn5birLWJsdWUnOwogICAgICAgICAgICAgICAgICAgIGxhbmdfcGF0Y2hfaW1nX2FsdCA9ICfmsrnnjLTohbPmnKwg4oCTIOirluWjh+Wkp+W4qyc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBsYW5nX3BhdGNoX2ltZ19zcmMgPSAnLy9pbWcuc2hpZWxkcy5pby9iYWRnZS9Nb3ppbGxhJTIwRmlyZWZveC1Gb3J1bSUyMEdyYW5kbWFzdGVyJTIwZm9yJTIwRGlzY3V6IS1ibHVlP2xvZ289TW96aWxsYSUyMEZpcmVmb3gnOwogICAgICAgICAgICAgICAgICAgIGxhbmdfcGF0Y2hfaW1nX2FsdCA9ICdNb3ppbGxhIEZpcmVmb3gg4oCTIEZvcnVtIEdyYW5kbWFzdGVyIGZvciBEaXNjdXohJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgcG9zdHNfaW1nKSB7CiAgICAgICAgICAgICAgICBpZiAoaS5zcmMuaW5jbHVkZXMoJy9wdWJsaWMvaW1hZ2VzL3BhdGNoLmdpZicpKSB7CiAgICAgICAgICAgICAgICAgICAgaS5zcmMgPSBsYW5nX3BhdGNoX2ltZ19zcmM7CiAgICAgICAgICAgICAgICAgICAgaS5hbHQgPSBsYW5nX3BhdGNoX2ltZ19hbHQ7CiAgICAgICAgICAgICAgICAgICAgaS5jbGFzc0xpc3QuYWRkKCdiYWRnZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIEVycm9yIGhhbmRsaW5nCiAgICBpZiAodHlwZW9mIE9QRU5fSE9NRSAhPT0gJ3N0cmluZycgfHwgT1BFTl9IT01FLmxlbmd0aCAhPT0gNTQpIHsgZSA9IHRydWU7IH0KCiAgICAvLyBCYWRnZQogICAgbGV0IGxhbmdfcGF0Y2hfY3NzOwogICAgc3dpdGNoIChsYW5nKSB7CiAgICAgICAgY2FzZSAnemgtQ04nOgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnemgtSEsnOgogICAgICAgIGNhc2UgJ3poLU1PJzoKICAgICAgICBjYXNlICd6aC1UVyc6CiAgICAgICAgICAgIGxhbmdfcGF0Y2hfY3NzID0gJy50X2YgaW1nLmJhZGdlLC50X2YgLnpvb21bc3JjJD0iL3B1YmxpYy9pbWFnZXMvcGF0Y2guZ2lmIl17Y29udGVudDp1cmwoIi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uv5rK554y06IWz5pysLeirluWjh+Wkp+W4qy1ibHVlIil9JzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgISFsYW5nX3BhdGNoX2NzcyAmJiBHTV9hZGRTdHlsZShsYW5nX3BhdGNoX2Nzcyk7CgogICAgLy8gYWRzCiAgICBsZXQgYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWRzYnlnb29nbGUnKTsKICAgIGlmICghIWFkcy5sZW5ndGgpIHsKICAgICAgICBmb3IgKGNvbnN0IGkgb2YgYWRzKSB7CiAgICAgICAgICAgIGkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB9CiAgICB9CgogICAgLy8gRXJyb3IgaGFuZGxpbmcKICAgIGlmICh0eXBlb2YgcGF0Y2hfY29udGVudCAhPT0gJ3N0cmluZycgfHwgcGF0Y2hfY29udGVudC5sZW5ndGggIT09IDgyICYmIHBhdGNoX2NvbnRlbnQubGVuZ3RoICE9PSAwKSB7IGUgPSB0cnVlOyB9CgogICAgLy8gYmJzLnBjYmV0YS5jb20KICAgIGlmIChobi5pbmNsdWRlcygnYmJzLnBjYmV0YS5jb20nKSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuaW5jbHVkZXMoJ3ZpZXd0aHJlYWQnKSAmJiBHTV9hZGRTdHlsZSgnI3dwID4gZGl2IHsgZGlzcGxheTogbm9uZTsgfScpOwogICAgICAgICAgICBHTV9hZGRTdHlsZShgCiAgICAgICAgICAgICAgICAjbnZfZm9ydW0gPiBzcGFuLAogICAgICAgICAgICAgICAgLnBscyAudGlwLAogICAgICAgICAgICAgICAgaWdub3JlX2pzX29wIC50aXAgewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI3dwID4gZGl2OmZpcnN0LWNoaWxkLAogICAgICAgICAgICAgICAgI3dwID4gZGl2LmNsLAogICAgICAgICAgICAgICAgI3dwID4gZGl2LndwLAogICAgICAgICAgICAgICAgI252X2ZvcnVtICNzY3JvbGx0b3AgewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5wbHMgLmF2YXRhciB7CiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IHVuc2V0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5wbHMgLm0gaW1nIHsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMnB4OwogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTIwcHg7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAucGxzIC5tIGltZzpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5wbHMgLnBpIHsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMDsKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnBiX3BscyAuYXZhdGFyIGltZyB7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnBiX3BscyAuYXZhdGFyIGltZzpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuaGRjIHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI2Z1bmN0aW9uLWJ1dHRvbnMgewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICByaWdodDogMDsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAycHggOHB4IDRweCAwOwogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuY3VzdG9tLWZ1bmN0aW9uLWJ1dHRvbiB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAycHggI2JiYjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuY3VzdG9tLWZ1bmN0aW9uLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMxOTg1ZGI7CiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4ICNiYmI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnBpIHsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC5waTpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktZGFyayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGApOwoKICAgICAgICAgICAgaWYgKCEhbWVtYmVyID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgR01fYWRkU3R5bGUoYAogICAgICAgICAgICAgICAgICAgIC5mdW5jdGlvbi1idXR0b25zIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6IDRweDsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNjZW5lX21vZGUgPT09ICdPZmZpY2UnKSB7CiAgICAgICAgICAgICAgICBHTV9hZGRTdHlsZShgCiAgICAgICAgICAgICAgICAgICAgdGQucGxzID4gcCwKICAgICAgICAgICAgICAgICAgICB0ZC5wbHMgPiBkbCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCA5OTkpOwoKICAgIH0KCiAgICAvLyB3d3cuaG9zdGxvYy5jb20KICAgIGlmIChobi5pbmNsdWRlcygnaG9zdGxvYy5jb20nKSkgewogICAgICAgIEdNX2FkZFN0eWxlKGAKICAgICAgICAgICAgI2hkIC53cCB7CiAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDogMDsKICAgICAgICAgICAgfQogICAgICAgIGApOwogICAgfQoKICAgIC8vIGJicy5mb2JzaGFuZ2hhaS5jb20KICAgIGhuLmluY2x1ZGVzKCdiYnMuZm9ic2hhbmdoYWkuY29tJykgJiYgR01fYWRkU3R5bGUoYAogICAgICAgICNmdW5jdGlvbi1idXR0b25zLmZ1bmN0aW9uLWJ1dHRvbnMgewogICAgICAgICAgICBwYWRkaW5nLXRvcDogNDhweCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgLm1haW50YWJsZSA+IC5zcGFjZWJvcmRlciA+IHRhYmxlOmZpcnN0LWNoaWxkLAogICAgICAgIC5saW5lIGRpdiwKICAgICAgICAudF9pbmZvbGluZSAubGluZSB7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAjYWFhYSB7CiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIH0KCiAgICAgICAgLm1haW5oZWFkZXIgewogICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB9CiAgICBgKTsKCiAgICAvLyB3d3cuenVhbmtlOC5jb20KICAgIGlmIChobi5pbmNsdWRlcygnenVhbmtlOC5jb20nKSkgewogICAgICAgIEdNX2FkZFN0eWxlKGAKICAgICAgICAgICAgI2hkIC56dWFuYW11LAogICAgICAgICAgICAjeGFkX211IHsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgIH0KICAgICAgICBgKTsKCiAgICAgICAgbGV0IGFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2Jhcl9mb3JtJyk7CiAgICAgICAgYWRzID0gISFhZHMgPyBhZHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJykgOiBbXTsKICAgICAgICBmb3IgKGNvbnN0IGkgb2YgYWRzKSB7CiAgICAgICAgICAgIGlmIChpLmlubmVyVGV4dC5pbmNsdWRlcygn5omL5py65a6i5oi356uvJykpIHsKICAgICAgICAgICAgICAgIGkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dwJyk7CiAgICAgICAgYWRzID0gISFhZHMgPyBhZHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpWzFdIDogbnVsbDsKICAgICAgICBpZiAoISFhZHMgJiYgYWRzLmlubmVyVGV4dC5pbmNsdWRlcygn5oKo55qE5p6c5p6c5L2O5LqOJykpIHsKICAgICAgICAgICAgYWRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQoKICAgICAgICBhZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdwY3QnKTsKICAgICAgICBmb3IgKGNvbnN0IGkgb2YgYWRzKSB7CiAgICAgICAgICAgIGxldCBhID0gaS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2Jyk7CiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBhKSB7CiAgICAgICAgICAgICAgICBpZiAoaS5pbm5lclRleHQuaW5jbHVkZXMoJ+aPkOS+m+eahOW5v+WRiicpKSB7CiAgICAgICAgICAgICAgICAgICAgaS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIGJicy5odW9yb25nLmNuCiAgICBobi5pbmNsdWRlcygnYmJzLmh1b3JvbmcuY24nKSAmJiBHTV9hZGRTdHlsZShgCiAgICAgICAgLmZ1bmN0aW9uLWJ1dHRvbnMgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7CiAgICAgICAgfQoKICAgICAgICAuY3VzdG9tLWZ1bmN0aW9uLWJ1dHRvbiB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgfQogICAgYCk7CgogICAgLy8gYmJzLjM2MC5jbgogICAgaG4uaW5jbHVkZXMoJ2Jicy4zNjAuY24nKSAmJiBHTV9hZGRTdHlsZShgCiAgICAgICAgLmZ1bmN0aW9uLWJ1dHRvbnMgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAtMjJweDsKICAgICAgICB9CgogICAgICAgIC5jdXN0b20tZnVuY3Rpb24tYnV0dG9uIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjJmNjsKICAgICAgICB9CgogICAgICAgIC5jdXN0b20tZnVuY3Rpb24tYnV0dG9uOmhvdmVyIHsKICAgICAgICAgICAgY29sb3I6ICNmMzM7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgfQoKICAgICAgICAuYXBrLWRvd25sb2FkLAogICAgICAgIC5hcGstZG93bmxvYWQtcGFubmVsLAogICAgICAgIC5wbHMgLnRpcCwKICAgICAgICBpZ25vcmVfanNfb3AgLnRpcCB7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAucGxzIC5hdmF0YXIgaW1nIHsKICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICAgICAgd2lkdGg6IDU0cHg7CiAgICAgICAgICAgIGhlaWdodDogNTRweDsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAwIDJweCAjYmJiICFpbXBvcnRhbnQ7CiAgICAgICAgfQoKICAgICAgICAucGxzIC5hdmF0YXIgaW1nOmhvdmVyIHsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgIGApOwoKICAgIC8vIHd3dy5tY2Jicy5uZXQKICAgIGhuLmluY2x1ZGVzKCd3d3cubWNiYnMubmV0JykgJiYgR01fYWRkU3R5bGUoYAogICAgICAgIC5uZXdfd3AgLmhkYywKICAgICAgICAjaGQgLndwIHsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CgogICAgICAgIC5jdXN0b20tZnVuY3Rpb24tYnV0dG9uIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzYzk5ZTsKICAgICAgICB9CiAgICAgICAgLmN1c3RvbS1mdW5jdGlvbi1idXR0b246aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIH0KICAgIGApOwoKICAgIC8vIFNwZWVjaGxlc3MKICAgIGlmICh1cmwuaW5jbHVkZXMoJy5jb20vaHRtX2RhdGEvJykpIHsKICAgICAgICBsZXQgdGlwcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RpcHMnKTsKICAgICAgICBpZiAoISF0aXBzLmxlbmd0aCkgewogICAgICAgICAgICBsZXQgdGQgPSB0aXBzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZCcpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGQpIHsKICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlKCdvbmNsaWNrJywgJ2phdmFzY3JpcHQ6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVfYWRzKCkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGlwcykgewogICAgICAgICAgICAgICAgaS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1bnNhZmVXaW5kb3cucmVhZFMgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB1bnNhZmVXaW5kb3cucjFhZWFkUyA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIHVuc2FmZVdpbmRvdy5yMmFlYWRTID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgdW5zYWZlV2luZG93LnIzYWVhZFMgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB1bnNhZmVXaW5kb3cucjRhZWFkUyA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIHVuc2FmZVdpbmRvdy5yNWFlYWRTID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgdW5zYWZlV2luZG93LnI2YWVhZFMgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB1bnNhZmVXaW5kb3cucjdhZWFkUyA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIHVuc2FmZVdpbmRvdy5yOGFlYWRTID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgdW5zYWZlV2luZG93LnI5YWVhZFMgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICBsZXQgYm9keUNvbnRlbnQgPSBkb2N1bWVudC5ib2R5LmlubmVySFRNTDsKICAgICAgICBpZiAoYm9keUNvbnRlbnQuaW5jbHVkZXMoJ3I5YWVhZFMoKTsnKSAmJiBib2R5Q29udGVudC5pbmNsdWRlcygnc2V0VGltZW91dChmdW5jdGlvbigpe3I5YWVhZFMoKX0sIDE2MDMpOycpICYmIGJvZHlDb250ZW50LmluY2x1ZGVzKCdmdW5jdGlvbiByOWFlYWRTKCknKSAmJiB0eXBlb2YgcjlhZWFkUyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZW1vdmVfYWRzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICByZW1vdmVfYWRzKCk7CiAgICAgICAgICAgIH0sIDIyMjIpOwogICAgICAgIH0KCiAgICAgICAgbGV0IHRwY0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cGNfY29udGVudCcpWzBdOwogICAgICAgIGlmICghIXRwY0NvbnRlbnQpIHsKICAgICAgICAgICAgbGV0IHRwY0hUTUwgPSB0cGNDb250ZW50LmlubmVySFRNTDsKCiAgICAgICAgICAgIGxldCBsaXN0ID0gWwogICAgICAgICAgICAgICAgJ+OAkOaWsOeJh+mmluWPkeOAkScsCiAgICAgICAgICAgICAgICAn44CQ5paw54mH6aaW55m844CRJywKICAgICAgICAgICAgICAgICfjgJDlvbHniYflkI3np7DjgJEnLAogICAgICAgICAgICAgICAgJ+OAkOW9seeJh+WQjeeoseOAkScsCiAgICAgICAgICAgICAgICAn44CQ6KeG6aKR5ZCN56ew44CRJywKICAgICAgICAgICAgICAgICfjgJDoppbpoLvlkI3nqLHjgJEnLAogICAgICAgICAgICAgICAgJ+OAkOa8q+eUu+WQjeWtl+OAkScsCiAgICAgICAgICAgICAgICAn44CQ5ryr55Wr5ZCN5a2X44CRJywKICAgICAgICAgICAgICAgICfmlrDniYfpppblj5HvvJonLAogICAgICAgICAgICAgICAgJ+aWsOeJh+mmlueZvO+8micsCiAgICAgICAgICAgICAgICAn5b2x54mH5ZCN56ew77yaJywKICAgICAgICAgICAgICAgICflvbHniYflkI3nqLHvvJonLAogICAgICAgICAgICAgICAgJ+inhumikeWQjeensO+8micsCiAgICAgICAgICAgICAgICAn6KaW6aC75ZCN56ix77yaJywKICAgICAgICAgICAgICAgICfmvKvnlLvlkI3lrZfvvJonLAogICAgICAgICAgICAgICAgJ+a8q+eVq+WQjeWtl++8micsCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBsaXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodHBjSFRNTC5pbmNsdWRlcyhpKSkgewogICAgICAgICAgICAgICAgICAgIHRwY0hUTUwgPSBpLmNvbmNhdCh0cGNIVE1MLnNwbGl0KGkpWzFdKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHRvcCA9ICcuY29tPC9hPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxzcGFuIGNsYXNzPSJmMjQiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjpSZWQiPueoruWtkOmAo+e1kOKGk+KGk+KGk+KGk+KGkzwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgIGlmICh0cGNIVE1MLmluY2x1ZGVzKHRvcCkpIHsKICAgICAgICAgICAgICAgIHRwY0hUTUwgPSAnPHNwYW4+56iu5a2Q6YCj57WQPC9zcGFuPjxicj4nLmNvbmNhdCh0cGNIVE1MLnNwbGl0KHRvcClbMV0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b3AgPSAnLmNvbTwvYT48YnI+PGJyPjxicj5DJzsKICAgICAgICAgICAgaWYgKHRwY0hUTUwuaW5jbHVkZXModG9wKSkgewogICAgICAgICAgICAgICAgdHBjSFRNTCA9ICdDJy5jb25jYXQodHBjSFRNTC5zcGxpdCh0b3ApWzFdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdG9wID0gJy5jb208L2E+PGJyPjxicj48YnI+SCc7CiAgICAgICAgICAgIGlmICh0cGNIVE1MLmluY2x1ZGVzKHRvcCkpIHsKICAgICAgICAgICAgICAgIHRwY0hUTUwgPSAnSCcuY29uY2F0KHRwY0hUTUwuc3BsaXQodG9wKVsxXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRwY0hUTUwgPSB0cGNIVE1MLnJlcGxhY2UoLyg8YnI+KXsyLH0vZywgJzxicj48YnI+Jyk7CiAgICAgICAgICAgIHRwY0NvbnRlbnQuaW5uZXJIVE1MID0gdHBjSFRNTDsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGxldCBpbWFnZV9iaWdfdGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ltYWdlLWJpZy10ZXh0Jyk7CiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpbWFnZV9iaWdfdGV4dCkgewogICAgICAgICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICAgICAgaWYgKGkudGl0bGUuaW5jbHVkZXMoJy8vJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gaS50aXRsZS5zdWJzdHJpbmcoaS50aXRsZS5pbmRleE9mKCdodHRwJykpOwogICAgICAgICAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYih1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaS50aXRsZSA9IHVybDsKICAgICAgICAgICAgICAgICAgICBpLmlubmVySFRNTCA9ICflm77niYflnLDlnYAnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTsKICAgICAgICAgICAgICAgICAgICBpLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sIDIwMDApOwogICAgfQogICAgaWYgKGhuID09PSAnd3d3LnZpaWRpaS5pbmZvJykgewogICAgICAgIGxldCBocmVmOwogICAgICAgIHN3aXRjaCAodHJ1ZSkgewogICAgICAgICAgICBjYXNlIHVybC5pbmNsdWRlcygnLz9hY3Rpb249aW1hZ2UnKSAmJiB1cmwuaW5jbHVkZXMoJyZ1cmw9aHR0cCcpOgogICAgICAgICAgICAgICAgaHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwuc3BsaXQoJyZ1cmw9JylbMV0uc3BsaXQoJyYnKVswXSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgdXJsLmluY2x1ZGVzKCcvP2FjdGlvbj1pbWFnZScpICYmIHVybC5pbmNsdWRlcygnJnNyYz1odHRwJyk6CiAgICAgICAgICAgICAgICBocmVmID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5zcGxpdCgnJnNyYz0nKVsxXS5zcGxpdCgnJicpWzBdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSB1cmwuaW5jbHVkZXMoJy8/aHR0cCcpICYmIHVybC5pbmNsdWRlcygnX3BocD9uYW1lPScpOgogICAgICAgICAgICAgICAgaHJlZiA9ICdodHRwczovL2Rvd25sb2FkLmJiY2IudHcvbGlzdC5waHA/bmFtZT0nICsgdXJsLnNwbGl0KCc/bmFtZT0nKVsxXS5zcGxpdCgnJicpWzBdOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIHVybC5pbmNsdWRlcygnLz9odHRwJykgJiYgdXJsLmluY2x1ZGVzKCdfcGhwP2hhc2g9Jyk6CiAgICAgICAgICAgICAgICBocmVmID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCEhaHJlZikgewogICAgICAgICAgICBHTV9vcGVuSW5UYWIoaHJlZiwgZmFsc2UpOwogICAgICAgICAgICB3aW5kb3cuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gRXJyb3IgaGFuZGxpbmcKICAgICEhZSAmJiB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShPUEVOX0hPTUUpOwp9CgovLyBNYWluIHNldHRpbmdzCmlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT09ICdoaXNoaXMuZ2l0aHViLmlvJykgewogICAgdW5zYWZlV2luZG93LmZvcnVtR3JhbmRtYXN0ZXIgPSB7fTsKICAgIGNvbnN0IEZHID0gdW5zYWZlV2luZG93LmZvcnVtR3JhbmRtYXN0ZXI7CiAgICBGRy5kYXRhID0ge307CiAgICBGRy5leHRlbnNpb25zID0ge307CiAgICBGRy5zY3JpcHQgPSB7fTsKCiAgICBGRy5kYXRhLnVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICBGRy5kYXRhLmxhbmcgPSB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlOwogICAgRkcuZGF0YS5mcm9tID0gR01fZ2V0VmFsdWUoJ0ZST00nLCAnJyk7CiAgICBGRy5kYXRhLmhvc3RuYW1lID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lOwogICAgRkcuZGF0YS5mcmVlZG9tX29mX25ldHdvcmsgPSBHTV9nZXRWYWx1ZSgnRlJFRURPTV9PRl9ORVRXT1JLJywgJ0NoZWNrIExhdGVyJyk7CgogICAgRkcuZXh0ZW5zaW9ucy5uYW1lID0gR01faW5mby5zY3JpcHRIYW5kbGVyOwogICAgRkcuZXh0ZW5zaW9ucy52ZXJzaW9uID0gR01faW5mby52ZXJzaW9uOwogICAgRkcuc2NyaXB0Lm5hbWUgPSBHTV9pbmZvLnNjcmlwdC5uYW1lOwogICAgRkcuc2NyaXB0LnZlcnNpb24gPSBHTV9pbmZvLnNjcmlwdC52ZXJzaW9uOwoKICAgIGxldCBjb25zb2xlQ1NTID0gJ2NvbG9yOiAjMzY5OyBmb250LXNpemU6IDE2cHg7IGN1cnNvcjogZGVmYXVsdDsnOwoKICAgIEdNX2xvZygnJWPmianlsZXlkI3lrZfvvJonLmNvbmNhdChGRy5leHRlbnNpb25zLm5hbWUpLCBjb25zb2xlQ1NTKQogICAgR01fbG9nKCclY+aJqeWxleeJiOacrO+8micuY29uY2F0KEZHLmV4dGVuc2lvbnMudmVyc2lvbiksIGNvbnNvbGVDU1MpCiAgICBHTV9sb2coJyVj6ISa5pys5ZCN5a2X77yaJy5jb25jYXQoRkcuc2NyaXB0Lm5hbWUpLCBjb25zb2xlQ1NTKQogICAgR01fbG9nKCclY+iEmuacrOeJiOacrO+8micuY29uY2F0KEZHLnNjcmlwdC52ZXJzaW9uKSwgY29uc29sZUNTUykKICAgIEdNX2xvZygnJWPnlKjmiLfku6PnkIbvvJonLmNvbmNhdChGRy5kYXRhLnVhKSwgY29uc29sZUNTUykKICAgIEdNX2xvZygnJWPpu5jorqTor63oqIDvvJonLmNvbmNhdChGRy5kYXRhLmxhbmcpLCBjb25zb2xlQ1NTKQogICAgR01fbG9nKCclY+e9kee7nOiHqueUse+8micuY29uY2F0KEZHLmRhdGEuZnJlZWRvbV9vZl9uZXR3b3JrKSwgY29uc29sZUNTUykKCiAgICBpZiAoR01faW5mby5zY3JpcHRNZXRhU3RyLmluY2x1ZGVzKCcvLyBAdXBkYXRlVVJMJykgJiYgR01faW5mby5zY3JpcHRNZXRhU3RyLmluY2x1ZGVzKCcvbWFpbi51c2VyLmpzJykpIHsKICAgICAgICBGRy5kYXRhLkdpdEh1YiA9IHRydWU7CiAgICAgICAgRkcuZGF0YS51cGRhdGVfY2hhbm5lbCA9ICdHaXRIdWInOwogICAgfSBlbHNlIHsKICAgICAgICBGRy5kYXRhLkdpdEh1YiA9IGZhbHNlOwogICAgICAgIEZHLmRhdGEudXBkYXRlX2NoYW5uZWwgPSAnR3JlYXN5IEZvcmsnOwogICAgfQoKICAgIEZHLm0gPSBuZXcgTWFwKCk7CgogICAgbGV0IGxpc3QgPSBHTV9saXN0VmFsdWVzKCk7CiAgICBmb3IgKGNvbnN0IGkgb2YgbGlzdCkgewogICAgICAgIEZHLm0uc2V0KGksIEdNX2dldFZhbHVlKGkpKTsKICAgIH0KCiAgICBGRy5tLnNldCgnU0NFTkVfTU9ERScsIEdNX2dldFZhbHVlKCdTQ0VORV9NT0RFJywgJ1N0YW5kYXJkJykpOwogICAgRkcubS5zZXQoJ0RJU1BMQVlfVVNFUlNfT05MSU5FX1NUQVRVUycsIEdNX2dldFZhbHVlKCdESVNQTEFZX1VTRVJTX09OTElORV9TVEFUVVMnLCAnTm9uZScpKTsKICAgIEZHLm0uc2V0KCdESVNQTEFZX0JBREdFJywgR01fZ2V0VmFsdWUoJ0RJU1BMQVlfQkFER0UnLCBmYWxzZSkpOwoKICAgIC8vIENoZWNrIFZlcnNpb24KICAgIGZ1bmN0aW9uIGNoZWNrX3ZlcnNpb24oKSB7CiAgICAgICAgRkcuZGF0YS5uYW1lID0gJyc7CiAgICAgICAgRkcuZGF0YS5kZXNjcmlwdGlvbiA9ICcnOwogICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdXJsOiAnLy9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQwMDI1MC5qc29uJywKICAgICAgICAgICAgdGltZW91dDogMTAwMDAsCiAgICAgICAgICAgIG9ubG9hZDogcmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlYWR5U3RhdGUgPT09IDQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UucmVzcG9uc2UpOwoKICAgICAgICAgICAgICAgICAgICBGRy5kYXRhLm5hbWUgPSBkYXRhLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgRkcuZGF0YS5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247CiAgICAgICAgICAgICAgICAgICAgRkcuZGF0YS51cmwgPSBkYXRhLnVybDsKICAgICAgICAgICAgICAgICAgICBGRy5kYXRhLnZlcnNpb24gPSBkYXRhLnZlcnNpb247CgogICAgICAgICAgICAgICAgICAgIEZHLmRhdGEuY3JlYXRlX3RpbWUgPSBkYXRhLmNyZWF0ZWRfYXQ7CiAgICAgICAgICAgICAgICAgICAgRkcuZGF0YS51cGRhdGVfdGltZSA9IGRhdGEuY29kZV91cGRhdGVkX2F0OwoKICAgICAgICAgICAgICAgICAgICAvLyBIaXN0b3JpY2FsIGlzc3VlcwogICAgICAgICAgICAgICAgICAgIEZHLnNjcmlwdC5TZXJ2ZXJWZXJzaW9uID0gZGF0YS52ZXJzaW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgbGV0IGRvbUhhcyA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmIChkb21IYXMgPT09IGZhbHNlICYmICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlZmF1bHQtc2V0dGluZ3MnKSkgewogICAgICAgICAgICAgICAgZG9tSGFzID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyBDbG9zZQogICAgICAgICAgICAgICAgaWYgKEZHLmRhdGEudWEuaW5jbHVkZXMoJ0ZpcmVmb3gnKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nsb3NlJyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGNsb3NlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVmYXVsdC1zZXR0aW5ncycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIEdNX2xvZygn5oGi5aSN57O757uf6buY6K6k6K6+572uJyk7CiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBHTV9saXN0VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtc2V0dGluZ3MnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBHTV9sb2coJ+S/neWtmOiuvue9ricpOwogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBGRy5tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlbMF0uaW5jbHVkZXMoJ19fJykgfHwgR01fc2V0VmFsdWUoaVswXSwgaVsxXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgaSAqIDIwMCArIDIwMCk7CiAgICB9CgogICAgISFGRy5kYXRhLkdpdEh1YiB8fCBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBjaGVja192ZXJzaW9uKCk7CiAgICB9LCAxMDApOwp9Cgpkb2N1bWVudC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAvLyBNYWluIGNvZGUKICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluY2x1ZGVzKCdoaXNoaXMuZ2l0aHViLmlvJykgfHwgbWFpbigpOwogICAgfQp9Cg=="},{"name":"Discuz自动回复","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["http*forum.php?*","http*thread*.html"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1592876613643,"data":{}},"enabled":false,"position":4,"file_url":"https://greasyfork.org/scripts/390595-discuz%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D/code/Discuz%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D.user.js","uuid":"64a92466-6fda-469e-83aa-3ad8c46d72a6","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBEaXNjdXroh6rliqjlm57lpI0KLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjgyCi8vIEBkZXNjcmlwdGlvbiAgRGlzY3V66Ieq5Yqo5Zue5aSN5oyJ6ZKu77yM5Y+v6Ieq6YCJ5Zue5aSN6K+t5Y+l44CC5L+u5pS56IeqaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQ2MzUgICDkvb/nlKhodHRwczovL2dpdGh1Yi5jb20vY253aHkvR0JLLmpzIOi/m+ihjEdCS+i9rOeggQovLyBAYXV0aG9yICAgICAgIGJhY2tyb2NrMTIKLy8gQGxpY2Vuc2UgICAgICBHUEwgTGljZW5zZQovLyBAaW5jbHVkZSAgICAgIGh0dHAqZm9ydW0ucGhwPyoKLy8gQGluY2x1ZGUgICAgICBodHRwKnRocmVhZCouaHRtbAoKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvKiDoh6rlrprkuYnlj4LmlbAgKi8KICBjb25zdCBzZWxlY3RudW0gPSA1OyAvL+S4i+aLieaVsOmHjwogIGNvbnN0IGlzdGl0bGUgPSB0cnVlOyAvL+aYr+WQpuaYvuekuuagh+mimCAgdHJ1ZS9mYWxzZQogIC8v5Zue5aSN6K+tCiAgLyog5L6L5a2QCiAgIHsKICAgIGtleTogInd3dy5iYWlkdS5jb20iLCAgIC8v5Yy56YWN55qE572R5Z2A77yM5Y+v5Lul5aGr5YaZ5q2j5YiZ6KGo6L6+5byPCiAgICB2YWx1ZTogWwogICAgICAiYmFpZHUgMSIsICAvL+WvueW6lOWbnuWkjeivrQogICAgICAiYmFpZHUgMiIsCiAgICAgICJiYWlkdSAzIiwKICAgICAgImJhaWR1IDQiLAogICAgICAiYmFpZHUgNSIsCiAgICBdCiAgfSAqLwoKICBjb25zdCBtZXNzYWdlcyA9IFsKICAgIHsKICAgICAgLy/pu5jorqTlm57lpI3vvIzor7fli7/ljrvmjokKICAgICAga2V5OiAiZGVmYXVsdCIsCiAgICAgIHZhbHVlOiBbCiAgICAgICAgIuWNgeWIhuaEn+iwouWIhuS6qyIsCiAgICAgICAgIualvOS4u+aYr+S4quWlveS6uiIsCiAgICAgICAgIualvOS4u+S4gOeUn+W5s+WuiSIsCiAgICAgICAgIuaEn+iwoualvOS4u+WIhuS6q++8jOmhtui0tOaUr+aMgSIsCiAgICAgICAgIuWlveS4nOilv+WViu+8jOiwouiwoualvOS4u+WIhuS6qyIsCiAgICAgICAgIuaUtuiXj+S6huOAguiwouiwoualvOS4u+WIhuS6qyIKICAgICAgXQogICAgfQogICAgLyogICAgIHsKICAgICAga2V5OiAid3d3LmJhaWR1LmNvbSIsCiAgICAgIHZhbHVlOiBbCiAgICAgICAgImJhaWR1IDEiLAogICAgICAgICJiYWlkdSAyIiwKICAgICAgICAiYmFpZHUgMyIsCiAgICAgICAgImJhaWR1IDQiLAogICAgICAgICJiYWlkdSA1IiwKICAgICAgXQogICAgfSwgKi8KICBdOwoKICAvKiDns7vntbHlj4PmlbggKi8KICBsZXQgaXNyZWFkeSA9IHRydWU7CiAgY29uc3Qga2V5d29yZCA9ICLlm57lpI3lj6/op4F86ZqQ6JePIjsKICBsZXQgR0JLID0gbnVsbDsKICBsZXQgY3VybWVzc2FnZTsKCiAgLyogLS0tLS0tLS0tLSAqLwoKICBpbml0aWFsaXplKCk7CgogIC8qIC0tLS0tLS0tLS0gKi8KCiAgZnVuY3Rpb24gYXV0b1JlcGx5KHJlX21lc3NhZ2UpIHsKICAgIGlmICghaXNyZWFkeSkgcmV0dXJuOwogICAgaXNyZWFkeSA9IGZhbHNlOwoKICAgIGxldCBkZWZhdWx0X21lc3NhZ2U7CgogICAgbGV0IGh0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50cyIpOwogICAgaWYgKGh0aXRsZSkgewogICAgICBodGl0bGUgPSBodGl0bGUuaW5uZXJUZXh0OwogICAgfSBlbHNlIHsKICAgICAgaHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRocmVhZF9zdWJqZWN0Iik7CiAgICAgIGlmIChodGl0bGUpIGh0aXRsZSA9IGh0aXRsZS5pbm5lclRleHQ7CiAgICB9CgogICAgaWYgKCFodGl0bGUpIGh0aXRsZSA9IGRvY3VtZW50LnRpdGxlOwoKICAgIGRlZmF1bHRfbWVzc2FnZSA9IHJlX21lc3NhZ2UKICAgICAgPyByZV9tZXNzYWdlCiAgICAgIDogY3VybWVzc2FnZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjdXJtZXNzYWdlLmxlbmd0aCldOwoKICAgIGxldCBmYXN0cG9zdF90ZXh0YXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNmYXN0cG9zdG1lc3NhZ2UiKTsKICAgIGxldCBmYXN0cG9zdF9zdWJtaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjZmFzdHBvc3RzdWJtaXQiKTsKICAgIGxldCBmYXN0cG9zdF92ZXJpZnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKAogICAgICAnaW5wdXRbbmFtZT0ic2VjY29kZXZlcmlmeSJdJwogICAgKTsKCiAgICBpZiAoZmFzdHBvc3RfdGV4dGFyZWEubGVuZ3RoID09IDAgfHwgZmFzdHBvc3Rfc3VibWl0Lmxlbmd0aCA9PSAwKSB7CiAgICAgIGFsZXJ0KCLmnKrmib7liLDlv6vpgJ/lm57lpI3ooajmoLzvvIEiKTsKICAgICAgaXNyZWFkeSA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBsZXQgbWVzc2FnZSA9IGlzdGl0bGUgPyBkZWZhdWx0X21lc3NhZ2UgKyAiXHJcbiIgKyBodGl0bGUgOiBkZWZhdWx0X21lc3NhZ2U7CiAgICBmYXN0cG9zdF90ZXh0YXJlYVswXS5pbm5lckhUTUwgPSBtZXNzYWdlOwoKICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpOwoKICAgIC8veGhy5LiN6ZyA6KaB77yM5LiN6L+H6L6T5YWl6aqM6K+B56CB55qE5oOF5Ya15aGr5LiK5Lmf5piv5pa55L6/54K555qECiAgICBpZiAoZmFzdHBvc3RfdmVyaWZ5Lmxlbmd0aCA+IDApIHsKICAgICAgYWxlcnQoIumcgOimgei+k+WFpemqjOivgeegge+8gSIpOwoKICAgICAgbGV0IGggPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgICAgd2luZG93LnNjcm9sbCgwLCBoKTsKICAgICAgZmFzdHBvc3RfdmVyaWZ5WzBdLmZvY3VzKCk7CiAgICAgIGlzcmVhZHkgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy94aHLlj5HluJYKICAgIGxldCBmb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI2Zhc3Rwb3N0Zm9ybSIpWzBdOwogICAgbGV0IHVybCA9IGZvcm0uYWN0aW9uOwogICAgbGV0IGhpZGRlbiA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0iaGlkZGVuIl0nKTsKICAgIGxldCBkYXRhID0gIiI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbi5sZW5ndGg7IGkrKykgewogICAgICBkYXRhICs9IGhpZGRlbltpXS5uYW1lICsgIj0iICsgaGlkZGVuW2ldLnZhbHVlICsgIiYiOwogICAgfQoKICAgIGxldCBjaGFyc2V0ID0KICAgICAgdHlwZW9mIHdyYXBwZWRKU09iamVjdCA9PSAib2JqZWN0IgogICAgICAgID8gd3JhcHBlZEpTT2JqZWN0LmRvY3VtZW50LmNoYXJhY3RlclNldAogICAgICAgIDogZG9jdW1lbnQuY2hhcmFjdGVyU2V0OwoKICAgIGxldCBtbWVzc2FnZTsKICAgIGlmIChjaGFyc2V0LnRvTG93ZXJDYXNlKCkgPT0gImdiayIpIHsKICAgICAgaWYgKCFHQkspIEdCSyA9IEdCS2Z1bmN0aW9uKCk7CiAgICAgIG1tZXNzYWdlID0gR0JLLlVSSS5lbmNvZGVVUkkobWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICBtbWVzc2FnZSA9IGVuY29kZVVSSUNvbXBvbmVudChtZXNzYWdlKTsKICAgIH0KCiAgICBsZXQgbWRhdGEgPSAibWVzc2FnZT0iICsgbW1lc3NhZ2UgKyAiJnJlcGx5c3VibWl0PXJlcGx5c3VibWl0JiIgKyBkYXRhOwogICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgeGhyLm9wZW4oIlBPU1QiLCB1cmwsIHRydWUpOwogICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihvRXZlbnQpIHsKICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJFcnJvciIsIHhoci5zdGF0dXNUZXh0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB4aHIuc2VuZChtZGF0YSk7CiAgICAvL3hociBvdmVyCgogICAgaXNyZWFkeSA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgY29uc3QgbGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImRpdi5sb2NrZWQiKTsKICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgbGV0IHVsc3RyaW5nID0gIiI7CgogICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09IDEpIHsKICAgICAgICBjdXJtZXNzYWdlID0gbWVzc2FnZXNbMF0udmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtZXNzYWdlcy5sZW5ndGg7IG0rKykgewogICAgICAgICAgY29uc3QgZSA9IG1lc3NhZ2VzW21dOwogICAgICAgICAgaWYgKGUua2V5ID09ICJkZWZhdWx0IikgewogICAgICAgICAgICBjdXJtZXNzYWdlID0gZS52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCByZWc7CiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUua2V5KSA9PSAiW29iamVjdCBSZWdFeHBdIikgewogICAgICAgICAgICByZWcgPSBlLmtleTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlZyA9IG5ldyBSZWdFeHAoZS5rZXkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlZy50ZXN0KGxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgICAgIGN1cm1lc3NhZ2UgPSBlLnZhbHVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNvbnN0IG51bSA9IHNlbGVjdG51bSA+IGN1cm1lc3NhZ2UubGVuZ3RoID8gY3VybWVzc2FnZS5sZW5ndGggOiBzZWxlY3RudW07CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICAgICB1bHN0cmluZyArPSBgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyI+JHtjdXJtZXNzYWdlW2ldfTwvYT48L2xpPmA7CiAgICAgIH0KICAgICAgaWYgKHVsc3RyaW5nKSB7CiAgICAgICAgZm9yIChjb25zdCBuIG9mIGxpc3QpIHsKICAgICAgICAgIGlmIChuLmlubmVySFRNTC5zZWFyY2gobmV3IFJlZ0V4cChrZXl3b3JkKSkgIT0gLTEpIHsKICAgICAgICAgICAgbGV0IGJ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIGJ0LmlubmVySFRNTCA9IGAKICAgICAgICAgIDxkaXYgY2xhc3M9ImF1dG9SZXBseSI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhdXRvUmVwbHlidXR0b24iID7oh6rliqjlm57lpI08L2J1dHRvbj4KICAgICAgICA8ZGl2IGNsYXNzPSJhdXRvUmVwbHlEaXYiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImF1dG9SZXBseWhlYWQiPsK7PC9idXR0b24+CiAgICAgICAgPGRpdiBjbGFzcz0iYXV0b1JlcGx5RG93bmJ0biI+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgICR7dWxzdHJpbmd9CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgYDsKCiAgICAgICAgICAgIG4uYXBwZW5kQ2hpbGQoYnQpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3QgYWxsYnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmF1dG9SZXBseWJ1dHRvbiIpOwogICAgICAgIGZvciAobGV0IGIgb2YgYWxsYnV0dG9uKSB7CiAgICAgICAgICBiLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYXV0b1JlcGx5KG51bGwpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGFsbGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYXV0b1JlcGx5RG93bmJ0biB1bCBsaSBhIik7CiAgICAgICAgZm9yIChsZXQgYiBvZiBhbGxhKSB7CiAgICAgICAgICBiLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYXV0b1JlcGx5KHRoaXMuaW5uZXJIVE1MKTsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBjb25zdCBjc3NUZXh0ID0gWwogICAgICAgICAgYAogICAgICAgIC5hdXRvUmVwbHlidXR0b24geyAgCiAgICAgICAgY29sb3I6IHJnYigxMDIsIDEwMiwgMTAyKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjM4LCAyMzgsIDIzOCk7CiAgICAgICAgYm9yZGVyOiBtZWRpdW0gbm9uZTsKICAgICAgICBmb250LXdlaWdodDogMzAwOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMHB4OyAgICAgICAgCiAgICAgICAgbWFyZ2luOiAwcHggMHB4IDBweCA1cHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBhbGw7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zczsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgfQogICAgICAgIGAsCiAgICAgICAgICBgICAgIC5hdXRvUmVwbHlEaXZ7CiAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOwogICAgICAgIH1gLAogICAgICAgICAgYCAgICAuYXV0b1JlcGx5RGl2OmhvdmVyIC5hdXRvUmVwbHlEb3duYnRuewogICAgICAgICAgICBkaXNwbGF5OmJsb2NrOwogICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTsgCiAgICAgICAgfWAsCiAgICAgICAgICBgICAgIC5hdXRvUmVwbHlEaXYgLmF1dG9SZXBseURvd25idG57CiAgICAgICAgICAgIGRpc3BsYXk6bm9uZTsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZjlmOWY5OyAKICAgICAgICAgICAgYm94LXNoYWRvdzogMHB4IDhweCAxNnB4IDBweCByZ2JhKDAsMCwwLDAuMik7CiAgICAgICAgICAgIG1pbi13aWR0aDogMTYwcHg7CiAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICB6LWluZGV4Ojk5OTk7CiAgICAgICAgICAgIG1hcmdpbjogLTJweCAycHggMnB4IC00MHB4OwogICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCAuNXMgLjFzOwogICAgICAgICAgICAtbW96LXRyYW5zaXRpb246YWxsIC41cyAuMXM7CiAgICAgICAgICAgIC1tcy10cmFuc2l0aW9uOmFsbCAuNXMgLjFzOwogICAgICAgICAgICAtby10cmFuc2l0aW9uOmFsbCAuNXMgLjFzOwogICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YWxsIC41cyAuMXM7CiAgICAgICAgfWAsCiAgICAgICAgICBgICAgIC5hdXRvUmVwbHlEaXYgLmF1dG9SZXBseURvd25idG4gbGl7CiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjIwcHg7CiAgICAgICAgICAgIHRleHQtYWxpZ246bGVmdDsKICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjRweDsKICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDBweDsKICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICB9YCwKICAgICAgICAgIGAKICAgICAgICAuYXV0b1JlcGx5RGl2IC5hdXRvUmVwbHlEb3duYnRuIHVsIHsKICAgICAgICBtYXJnaW46IDBweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgICAgbGVmdDphdXRvOwogICAgICAgIHJpZ2h0OjA7CiAgICAgICAgfWAsCiAgICAgICAgICBgICAgIC5hdXRvUmVwbHlEaXYgLmF1dG9SZXBseURvd25idG4gYTpob3ZlcnsKICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKICAgICAgICAgICAgY29sb3I6I2YwMDsKICAgICAgICAgICAgdHJhbnNpdGlvbjphbGwgLjVzIC4xczsKICAgICAgICAgICAgLW1vei10cmFuc2l0aW9uOmFsbCAuNXMgLjFzOwogICAgICAgICAgICAtbXMtdHJhbnNpdGlvbjphbGwgLjVzIC4xczsKICAgICAgICAgICAgLW8tdHJhbnNpdGlvbjphbGwgLjVzIC4xczsKICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuNXMgLjFzOwogICAgICAgIH1gLAogICAgICAgICAgYCAgICAuYXV0b1JlcGx5RGl2IC5hdXRvUmVwbHlEb3duYnRuIGF7CiAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7CiAgICAgICAgICAgIGNvbG9yOmJsYWNrOwogICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgfWAsCiAgICAgICAgICBgLmF1dG9SZXBseWhlYWQgewogICAgICAgICAgY29sb3I6IHJnYigxMDIsIDEwMiwgMTAyKTsKICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzgsIDIzOCwgMjM4KTsKICAgICAgICAgIGJvcmRlcjogbWVkaXVtIG5vbmU7CiAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtNXB4OwogICAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4OwogICAgICAgIH1gCiAgICAgICAgXTsKCiAgICAgICAgZm9yIChjb25zdCBzIG9mIGNzc1RleHQpIHsKICAgICAgICAgIGRvY3VtZW50LnN0eWxlU2hlZXRzWzBdLmluc2VydFJ1bGUocywgMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKiAtLS0tLS0tLS0tICovCgogIC8qIQogICAqIGdiay5qcyB2MC4zLjAKICAgKiBIb21lcGFnZSBodHRwczovL2dpdGh1Yi5jb20vY253aHkvR0JLLmpzCiAgICogTGljZW5zZSBNSVQKICAgKi8KICBmdW5jdGlvbiBHQktmdW5jdGlvbigpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgR0JLID0gZnVuY3Rpb24oZ2JrX3VzKSB7CiAgICAgIHZhciBhcnJfaW5kZXggPSAweDgxNDA7IC8vMzMwODg7CiAgICAgIHZhciBnYmsgPSB7CiAgICAgICAgZGVjb2RlOiBmdW5jdGlvbihhcnIpIHsKICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgIGZvciAodmFyIG4gPSAwLCBtYXggPSBhcnIubGVuZ3RoOyBuIDwgbWF4OyBuKyspIHsKICAgICAgICAgICAgdmFyIGNvZGUgPSBhcnJbbl0gJiAweGZmOwogICAgICAgICAgICBpZiAoY29kZSA+IDB4ODAgJiYgbiArIDEgPCBtYXgpIHsKICAgICAgICAgICAgICB2YXIgY29kZTEgPSBhcnJbbiArIDFdICYgMHhmZjsKICAgICAgICAgICAgICBpZiAoY29kZTEgPj0gMHg0MCkgewogICAgICAgICAgICAgICAgY29kZSA9IGdia191c1soKGNvZGUgPDwgOCkgfCBjb2RlMSkgLSBhcnJfaW5kZXhdOwogICAgICAgICAgICAgICAgbisrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgfSwKICAgICAgICBlbmNvZGU6IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgc3RyICs9ICIiOwogICAgICAgICAgdmFyIGdiayA9IFtdOwogICAgICAgICAgdmFyIHdoID0gIj8iLmNoYXJDb2RlQXQoMCk7IC8vZ2Jr5Lit5rKh5pyJ55qE5a2X56ym55qE5pu/5o2i56ymCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY2hhcmNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKGNoYXJjb2RlIDwgMHg4MCkgZ2JrLnB1c2goY2hhcmNvZGUpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICB2YXIgZ2NvZGUgPSBnYmtfdXMuaW5kZXhPZihjaGFyY29kZSk7CiAgICAgICAgICAgICAgaWYgKH5nY29kZSkgewogICAgICAgICAgICAgICAgZ2NvZGUgKz0gYXJyX2luZGV4OwogICAgICAgICAgICAgICAgZ2JrLnB1c2goMHhmZiAmIChnY29kZSA+PiA4KSwgMHhmZiAmIGdjb2RlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2JrLnB1c2god2gpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGdiazsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBnYms7CiAgICB9OwogICAgdmFyIGdiayA9IEdCSzsKCiAgICB2YXIgVVJJID0gZnVuY3Rpb24oR0JLKSB7CiAgICAgIHZhciBwYXNzQ2hhcnMgPSAiIScoKSotLl9+IjsKICAgICAgdmFyIG90aGVyUGFzc0NoYXJzID0gIiMkJissLzo7PT9AIjsKICAgICAgZnVuY3Rpb24gZ2V0TW9kdWUocGFzc0NoYXJzKSB7CiAgICAgICAgdmFyIHBhc3NCaXRzID0gcGFzc0NoYXJzLnNwbGl0KCIiKS5zb3J0KCk7CiAgICAgICAgdmFyIGlzUGFzcyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgIHJldHVybiB+cGFzc0NoYXJzLmluZGV4T2YocykgfHwgL1swLTlhLXpBLVpdLy50ZXN0KHMpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGVuY29kZTogZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIHJldHVybiAoc3RyICsgIiIpLnJlcGxhY2UoLy4vZywgZnVuY3Rpb24odikgewogICAgICAgICAgICAgIGlmIChpc1Bhc3ModikpIHJldHVybiB2OwogICAgICAgICAgICAgIHZhciBiaXRBcnIgPSBHQksuZW5jb2RlKHYpOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYml0QXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiaXRBcnJbaV0gPQogICAgICAgICAgICAgICAgICAiJSIgKyAoIjAiICsgYml0QXJyW2ldLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gYml0QXJyLmpvaW4oIiIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uKGVuc3RyKSB7CiAgICAgICAgICAgIGVuc3RyID0gU3RyaW5nKGVuc3RyKTsKICAgICAgICAgICAgdmFyIG91dFN0ciA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGNoYXIgPSBlbnN0ci5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgaWYgKGNoYXIgPT09ICIlIiAmJiBpICsgMiA8IGVuc3RyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFyIGNvZGUxID0gcGFyc2VJbnQoZW5zdHIuc3Vic3RyKGkgKyAxLCAyKSwgMTYpOwogICAgICAgICAgICAgICAgaWYgKCFpc05hTihjb2RlMSkpIHsKICAgICAgICAgICAgICAgICAgdmFyIF9pID0gaSArIDI7CiAgICAgICAgICAgICAgICAgIGlmIChjb2RlMSA+IDB4ODApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29kZTI7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3RyLmNoYXJBdChfaSArIDEpID09PSAiJSIpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvZGUyID0gcGFyc2VJbnQoZW5zdHIuc3Vic3RyKF9pICsgMiwgMiksIDE2KTsKICAgICAgICAgICAgICAgICAgICAgIF9pICs9IDM7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIGNvZGUyID0gZW5zdHIuY2hhckNvZGVBdChfaSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgX2kgKz0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUyID49IDB4NDApIHsKICAgICAgICAgICAgICAgICAgICAgIGkgPSBfaTsKICAgICAgICAgICAgICAgICAgICAgIG91dFN0ciArPSBHQksuZGVjb2RlKFtjb2RlMSwgY29kZTJdKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgb3V0U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTEpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG91dFN0ciArPSBjaGFyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvdXRTdHI7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgdmFyIFVSSUNvbXBvbmVudCA9IGdldE1vZHVlKHBhc3NDaGFycyk7CiAgICAgIHZhciBVUkkgPSBnZXRNb2R1ZShwYXNzQ2hhcnMgKyBvdGhlclBhc3NDaGFycyk7CgogICAgICByZXR1cm4gewogICAgICAgIGVuY29kZVVSSTogVVJJLmVuY29kZSwKICAgICAgICBkZWNvZGVVUkk6IFVSSS5kZWNvZGUsCiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50OiBVUklDb21wb25lbnQuZW5jb2RlLAogICAgICAgIGRlY29kZVVSSUNvbXBvbmVudDogVVJJQ29tcG9uZW50LmRlY29kZQogICAgICB9OwogICAgfTsKCiAgICB2YXIgc3JjID0gZnVuY3Rpb24oZ2JrX3VzKSB7CiAgICAgIHZhciBnYmskJDEgPSBnYmsoZ2JrX3VzKTsKICAgICAgZ2JrJCQxLlVSSSA9IFVSSShnYmskJDEpOwogICAgICByZXR1cm4gZ2JrJCQxOwogICAgfTsKCiAgICAvLyDlpJrov5vliLbovazmjaLlkI7nmoTmlbDlrZfov5jljp/lh73mlbAg5p6E5bu65pe25Lya5pu/5o2i5Y2g5L2N56ymCiAgICB2YXIgRm5fSGV4X2RlY29kZSA9IGZ1bmN0aW9uIGRlY29kZSgpIHsKICAgICAgdmFyIG4gPSAwLAogICAgICAgIHN0ciA9IGFyZ3VtZW50c1swXTsKICAgICAgZm9yICh2YXIgaSA9IDAsIHcgPSBzdHIubGVuZ3RoOyBpIDwgdzsgaSsrKSB7CiAgICAgICAgdmFyIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoY29kZSA8IDM4IHx8IGNvZGUgPiAxMjYpIHJldHVybiBOYU47CiAgICAgICAgbiArPSAoY29kZSAtIDM4KSAqIE1hdGgucG93KDg5LCB3IC0gaSAtIDEpOwogICAgICB9CiAgICAgIHJldHVybiBuOwogICAgfTsKCiAgICAvLyDop6PljotVbmljb2Rl57yW56CB5a2X56ym5Liy5Ye95pWwIOaehOW7uuaXtuS8muabv+aNouWNoOS9jeespgogICAgdmFyIEZuX3VuemlwID0gZnVuY3Rpb24gdW5aaXAoKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHNbMF0KICAgICAgICAucmVwbGFjZSgvXHgyMyhcZCspXHgyNC9nLCBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICByZXR1cm4gQXJyYXkoK2IgKyA0KS5qb2luKCIjIik7CiAgICAgICAgfSkKICAgICAgICAucmVwbGFjZSgvW1x4MjYtXHg3ZV1ceDI1W1x4MjYtXHg3ZV0vZywgZnVuY3Rpb24oYSkgewogICAgICAgICAgdmFyIGIgPSBhLnN1YnN0cigwLCAxKS5jaGFyQ29kZUF0KDApLAogICAgICAgICAgICBlID0gYS5zdWJzdHIoMikuY2hhckNvZGVBdCgwKSwKICAgICAgICAgICAgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZShiKTsKICAgICAgICAgIHdoaWxlIChiKysgPCBlKSB7CiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICB9KQogICAgICAgIC5yZXBsYWNlKC9ceDIzL2csICIjIyMiKQogICAgICAgIC5yZXBsYWNlKC8oW1x4MjYtXHg3ZV17Mn0pXHgyMShbXHgyNi1ceDdlXHgyM10rKSg/Olx4MjB8JCkvZywgZnVuY3Rpb24oCiAgICAgICAgICBhbGwsCiAgICAgICAgICBoZCwKICAgICAgICAgIGR0CiAgICAgICAgKSB7CiAgICAgICAgICByZXR1cm4gZHQucmVwbGFjZSgvLi9nLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIGlmIChhICE9ICIjIikgewogICAgICAgICAgICAgIHJldHVybiBoZCArIGE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pCiAgICAgICAgLm1hdGNoKC8uLi4vZyk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdia0FycmF5KGdia0FycikgewogICAgICB2YXIgZGF0YSA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMHg4MSwgayA9IDA7IGkgPD0gMHhmZTsgaSsrKSB7CiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgZGF0YS5sZW5ndGggKz0gMHg0MCArIDE7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGogPSAweDQwOyBqIDw9IDB4ZmU7IGorKykgewogICAgICAgICAgaWYgKAogICAgICAgICAgICBqID09IDB4N2YgfHwKICAgICAgICAgICAgKDB4YTEgPD0gaSAmJiBpIDw9IDB4YTcgJiYgaiA8PSAweGEwKSB8fAogICAgICAgICAgICAoMHhhYSA8PSBpICYmIGkgPD0gMHhhZiAmJiBqID49IDB4YTEpIHx8CiAgICAgICAgICAgICgweGY4IDw9IGkgJiYgaiA+PSAweGExKQogICAgICAgICAgKSB7CiAgICAgICAgICAgIGRhdGEucHVzaCh1bmRlZmluZWQpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBoZXggPSBnYmtBcnJbaysrXTsKICAgICAgICAgIHZhciBrZXkgPSBGbl9IZXhfZGVjb2RlKGhleCk7CiAgICAgICAgICBkYXRhLnB1c2goa2V5ID8ga2V5IDogdW5kZWZpbmVkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICB2YXIgR0JLJDEgPSAoZnVuY3Rpb24oKSB7CiAgICAgIC8vIOeUn+aIkOaMiUdCa+e8lueggemhuuaVsOaOkuWIl+eahOe8lueggeaYoOWwhOaVsOe7hCAg5p6E5bu65pe25Lya5pu/5o2iIHppcERhdGEg55qE5Y2g5L2N56ymCiAgICAgIHZhciBnYmtfdXMgPSBnYmtBcnJheSgKICAgICAgICBGbl91bnppcCgKICAgICAgICAgICIoVCFISiVMVVhdZSVnaWxvdHV3eXt9IChVISktJS8xMzc+QkRHSE8lUlRVVyVcXF9hJWpsJXJ0d30gKFYhKistMCUyNz5DJUVISiVNUCVSXFxgY2RmbiVwdHZ6e30gKFchKCkqLC8zJTU3OTs9JUNGR00lUVdYXFxeY2RnJWlsbnBydHZ5JX0gKFghJicpJS40NjhDREhKTE1PUFNUV1klXFxfYiVkZyVpbG5wcnR1d3h6JXx+IChZIScoKistNDY5JT0/JUdJJUtPJVJUJVZbJV9iZGlrbW5wdHV5e31+IChaISYnKSslLS8lOz5AQUNFJUdLTU5QUiVUV1tfJWlrbW8lcnQldnkle30gKFshJyglKy0lMDI0JTs9JUJEJUxPJVFTVFglW11eYCVjZSV5e30gKFxcISgpKyUvMSU3OiVMTiVTVSVXWSVjZiVpbSVwcnQleHolfiAoXSEmJyUqLSUvMSU2OCVFRyVjZ2xvcXMldXd4fCV+ICheIScpJS0vMDIzNTY7PkZKS09QUlNWV1olXV9gZGZpJWttb3Ildnl6IChfIScrJS0xMjQlNjg7PUBBQ0UlTU9RUlVWWCVdX2FkZWdqcXd4fH4gKGAhJikqLSUvNjg5OyU9PyVBREZJS0xOT1ZYXiVjZWhpbG1vcSV1d3l6fCV+IChhIScpLCUvMTI0JT0/QUQlSEolUFJTVSVbXWUlaG8lcXUlfiAoYiEoKSosJS4wMjQlNzk7JT0/QSVGSCVLTSVXWSVgYyVlaSVsb3EldHZ5JXwgKGMhJyorLS4xMzQ2JTg6JTw+JUdLTE9RU1VaJVxcX2NnaGpsdHd5e3wgKGQhKCwvMSU0Njc5PT5ARCVKTE1PUVJUVldaXWAlY2Ula20lcHIldHZ5JX0gKGUhKywtLzAyNzklOz4/RFFXWyVdX2JkaHF1JXd5IChmISYoKS40Nzo7PkFDRUZISUtNUCVTVV5hJWVnaWttJXR4fX4gKGchKSosLjAyJTU4PD5CQ0dJJU1QWVtdYCViZGVnaW5wdXYgKGghKCotMiU2PT5BJUNGJUtNUFJUJVdaXFwlYGRlZyVsbiVxc3d4ent9IChpISYrLSUvMSU0Njk7PkBBRCVISiVNUCVUViVZW1xcYWJkaCVtcnN2eH4gKGohJiwlLjAyMzUlNzo7PkAlRkglUFJUVlhaXFxfJWNmJWhqa24lcHV3JXt+IChrIScpLjA0NTc4Oz0/JUNGSSVOUVJUVyVeYGFjZGclaWxtbyVydSV3enx+IChsISYoKiUsLiU5PSVBQ0RISUslT1FTJVVbJV5gJWNlJWhrJXJ1JXt+IChtISYnKSU3OSVDRSVLTSVQUiVeYCVoamttbnF4eiV+IChuISYoKisuLzIlNDc4PCU+QUNHJVdZWlxcJV5gJWNnbW5wJXR4eXt9IChvISYnJSkrLC41JTk7PEVGSEpPUVMlVVdYWyVdYCVkaiVtcCV0dyV9IChwISYnJSkvMjQ2OSU7PT8lQUMlS04lVFZXWltdYGFlZmhrJW1vJXZ4eiV9IChxISYnKCwtLzAyNCU2OSU7PT8lQUMlRUclSUslTlBTVFYlWlxcJWBiJWVnJXR2JXwgKHIhJicoKistJS8xJTU3JTw+JUJFJVVXWlxcXiVgYiVpbCVwcyV1eCV+IChzISYpJTo8JT9BJUNFJU9RJVNVJWJkJWlsbnBxc3R2d3klfiAodCEmJykrLC4lMjQ2JTk9PkFDREYlSUxOUlZYWVtcXGFjJWZpa2xwcnN2eHkgKHUhJiglLC4wMTMlP0JERyVJSyVNUlZYWVslXmFiZWclamwlb3N0eXp9fiAodiEnKCUsLjAxMyU5OyU9QCVDSUpNT1IlVlhaW10lX2ElbG5wJXJ0dn4gKHchJiglKy0vJTI0JTY4OTw9P0ElQ0UlS05QUiVWWCVaXFwlYGJjZiVvcSV0diV8fiAoeCEmJygqKy0lNTo7PSVAQiVTVSVbXiVrbSVzdnh5eyV+ICh5ISYoKSwlMTM0NiU6PD5AQiVERiVIS01OUFFTVSVZWyVxcyV+ICh6ISgpJUFDRUZIJU9RJV9iZm5wcXd4e31+ICh7ISYpKy0lMDIzNTY5PUFERUclSUtNVl4lYGMlZmhpbnElc3d4eiAofCEmJyUpKyUtLzIlOj5AQURFRyVLTU8lVVtcXF5gYWNlZmklbG5wcXV3eXwlfiAofSEmKCstJTAyJTU3ODolPEhJS0xRUlclWVslXV8lYmRnaWwlcnV3JX0gKH4hJyglKiwvJTM1JTc6Oz4/QUklTVAlVFZaJVxcXmBiZSVoamxub3EldnglfSApJiEmJyUrLSUzNTY6PD4/QUJEJU1PJVRXWFslYGIlZmhqJW1vcHIldnh7fX4gKSchJiklLS8lNjklQEJDRyVRU1RWWCViZGdoaiVtbyV7fX4gKSghJiclOTslPT8lV1klZWclbW8le30gKSkhJygrLDI0NTg9PkAlREdITE9RJVNVVlpbX2YlbXAldHd4eiV+ICkqISgpLSUwMjUlOjwlQkUlSUtMTk9SJWBkZmhtcCVydHd4eyV9ICkrISguMTM3JTo+JUJEJUhKUCVTVSVeYSVmamttJXByJX0gKSwhJiglMDI1NjglOkIlREZJJUtNT1FTVldZJVteJWFlaGlrbW8ldXh6JXx+ICktISYnJTM1OD0lQEIlREdJS0xPUlNWWCVaXFxeYSVjZ2pxJXN1d3h6fiApLiEmKCUrLSUyNDY3OiU/QUMlRkklTVJTVVZZXiVgZSVnaWptbnBxc3R3ent9fiApLyEmKCkrLC45JTs9PkJDRUlKTFBRVCVWXiVgYiVmaCVsb3BydiV8fiApMCEnKCosLS8lMTQ1NyU6Pj9HSktNTlBXWSVbXiVhY2RnJWpsbnAlcnV3ent9fiApMSEnKSouMDM1JTc5Oj0lREclSUwlUFIlVFZXWVteYSVlanFydXd4eyV+ICkyISYpJSwuMSUzNyU7PSVAQiVFSElMTyVRUyVlZyVucHJ0dnd5JXt9fiApMyEmJyUqLCUvMSU0NyU9PyVCREYlWFpbXSVhYyVqbCV0eHl7JX4gKTQhJiclKy0lMjQlNjglPD5BJUVISiVaXFwlaWslc3Ulenx+ICk1IS8wNTglOjw/QiVFR0lLJU5RUlQlWF5gJWJma2xxJXN1dnglfiApNiEnKCs0NTc4Ojs9PkBEJUZIJUtOJVNXXFxfJWFmaWpsbXAlc3Uld3kle30gKTchKCorLTU5Oz9HSEpLTlRVWlxcX2IlZWptJXB0JXd5enwlfiApOCEmKCUqLTc4Oj0lP0FCRCVJTE1PJVJVWFlbYiVlZyVucXUld3l7JX0gKTkhJygqJS0wMTQlNzk7JT5DRUlLJU1PUSVXWVxcXmNnaWptbnFzdXcle30gKTohJicpJSswMiU0NiU8PkFDJUdKS00lUFJUVlglW11iY2UlaWxtcHF0JXl8fiApOyEoKSUrLSUvMTQlOTslP0FCREZISU9RJVdZWyVdXyVjZSVsbnAlcnQlfSApPCEoKSUuMDM1JT1AQURFRyVKTCVQUiVVV1hcXF4lYWNmaGolbG5wcXMleXx+ICk9IScoJSotJTEzJTU3OTslU1UlXFxeJWVnJWttJXh6JX4gKT4hJygrJS4yNTc4OyU/QUJFRkhJS00lT1JTVVdaJVxcX2BiJWVoJWpsbnBxcyV+ICk/ISYnKColLC8lMTQ2JTg6PD9AQkRFSEpMTlBTJVpcXF1gJWJkaSVsb3JzdSV3eiV+IClAISYnKCosLTM0OyU+QUJEJUhKTU5QJVJUVlklW18lYWMlZWdqJW1vciV1d3l7fCApQSEnKCUrLS8wMjQlOj0+QEFISUslTlBSU1VXWSVdYSVjZWhpayVtbyVxc3V2eCV7fX4gKUIhJicpJSwvJTM1JT1AJURGJUpMJU9RJVRWJW9xdSV8fiApQyEmKCUtLzM0Njg5Oz8lRUpMTU8lUVRWJVhaXFxeJWNlZ2xucHF0JXd5enx9IClEISYpKiwvMDI3OTo8JUBCRyVJS0xQUVNWWVtdJWBiZWdoamttb3EldHYleXt+IClFIScrJS0wMjU4Oj0+QEUlTE5RJVphJWNna21vcHIldHZ3eXp+IClGISgpJS8xNCU3OUBDRUdISyVPUSVTVSVbXiVkZyVpbW5yen4gKUchJyksMCU5REYlTU9SJVpcXF5hJWhqJWxuJXByJXt9fiApSCEmKiUtLzIzNTclQEJEJUlLTU8lUlRVV1haXFwlYGJjZSVucHMldXcleXx+IClJISYnKColLC4lMjQ3OTslRkklS00lVFZXWSVbXSVgYiVkZmhpayV7fX4gKUohJygqKy4wMTM0NiU5Ozw+P0ElRUlKTCVOUFJUWSVbXSViZWZoaWwldXh5e31+IClLISYoKSssLiUwMiU2OCU/QUNFRyVJSyVQUiVUVyViZCVnaSVydHYlfiApTCEmKCUzNiU7PT8lREZIJUtNTyVRUyVZXFwlYGJjZSVsbiV0d3klfSApTSEmJygqJTQ2JTw+P0ElQ0UlR0klUVNWJVpcXCVjZSVsbnElfiApTiEmJyV+IClPISYnJTE3ODolQ0UlSEpNJU9RJVRWV1pcXF1fJWpsJXN6e31+IClQISYnJTEzNiU5PkFFRyVKTU5QJVJVJVlbJWJkJWtvcSV3eXx9IClRISYnJSosLjAxODo8JUBCJUlMJU5QJVJUViVYWiVcXF4lZGglbG5yd3wlfiApUiEnKiwyJTQ4Oj0+QCVDRUZKJUxPUiVWWCVaXV8lYWlqbCVuciV2eHp8fiApUyEmKCUqLS4yNTg5Ozw/QEMlRkhKJUxOUFZaXV5iJWVobiVxdCV2eXslfSApVCEmJy0lLzEyNDk7PD5BQkdJTlRVV1haW10lX2JkJWZoJWttcXJ0JXl7fX4gKVUhKCkrLDAyJTQ2Ozw+QEVITFElVFdZW11eYGFjZGclaWwlb3FydSV3eSV9IClWISYnKSotLjAyMzU5JT0/RUhPUFNUVldZWlxcJWFkJWZrJW1wJXN1JXh6fX4gKVchJiksLS8xJTQ3OTo8PiVAQkRHJU5QJVNVWVxcXV9iY2VmaGlscCVydHZ4ent9IClYISYnKCosJTM2JT1AJUNGSEpLTSVPUSVbXV5gJW5xJXN1eHl7JX4gKVkhJiklLzElMzU2ODk7PD5AQUMlRkhLTVBRVFYlWFslXmAlYmQlZmhqbnBxcyV1eyApWiEmKSUyNCU3OSVAQiVERkdJJU1PJVFVJV5gJWJkJWdrbW9xc3R2JXx+IClbISYnJSsuJTAyNCU9PyVBQ0UlR0klS00lUlUlV1lbJV1fYWMlaWslbXBxdSV+IClcXCEmJygqJS0vJTM1JT9BQkRFRyVMTlAlVVclXWAlamxvJXp9fiApXSEmJyVERiVNUCVWWCVoaiVsbiV+ICleISYoKSslODolRUlMJU9SVCVWWFxcJV9hJWNmJWhqJWxucnN1dnklfiApXyEmJyUsMjQ2JTg8QEFGJUlLTSVZXFxeJWBiJWVnbHByJXh6fCV+IClgIScoJTE0JTg6Oz1ARCVOUCVXWyVeYCVtbyVydHZ4JX4gKWEhJiclKy0vJTM1OSU9PyVBRCVHSUtMTiVTVSVZWyVeYCVjZSVnaiVucSV3eSV7fX4gKWIhJiclKSstJS8xJTk7JURGJUpNJVZYJVtdXyVkZiVvcSV8fiApYyEmJyU6PCVFR0lLJU1QJVJYWlxcXiVkZyVpbCVvcSVzdXZ4enx+IClkISgpKi0vJTI1Njg5OyU9QCVCR0hKJU5RU1VWWCVjZSVwc3YleHogKWUhJiclLDElMzUlODs9PyVCREZHICdXISwtLiAmKCsmLicmLX4mJ3UnVyEvMSAnKT4uPFYnKSFAUEJDRkcgJ1chQEE0JTtCQzw9ICYnfiYoIUtrICcvIUo7PCAnLiF+fCAnLyE+PSAnLnUnLyFLLiAnMGAnLyE5NCAnMXQnMFQnLyE/QnVgXFxRMXQgJzAhKSogJy8heHkySUggJzshKiggJid9JykhXFxdICcrey47VSYncS4+ISYnICcpWiYndCcsNSc6IUdGICc5IWVpaGFgOzpNTCAnKWUnLSFYVldZICdXPyctITY3JT8jMyQgJzYhLS4lQCAnNSFycyV+ICc2ISYnJSwgJzUhXl8lZyMjICddITY3JT8jIyAnLSEmJyUxIyMgLjshUlNUIC4+Ky47IVZXJX4gLjwhJiclVSAuPiknVyFtbiV+ICdYISYnJWYjOCR0JX4gJ1khJiclcCM1JCAmMCE9PiVNTyVVIzUkXSVtbyV1IzQkIC45ITg5PD1CQ0BBRCVHIyM+Pzo7NCM2NyM2JCAmMSFjZCVoVGklfiAmMiEmJyUpIzEyJColL0swJUkjMTAkICYuISgpNyAnKSE9P09fICcrfScsKCctIVxcXSVfICcvISkzN2Z6eyAnMHonOCFDRCVmdCV+ICc5ISYnJSktJS9WV3wlfiAnOiEmSiAnMFAnVyE+SUojOCQgJighdVUgJis3JihUJikuJihdJik2JihcXCYpRiYoYSYrOSYoYCYpaCYoZyYrOyYoZiYqLSYobiYrPSYobSYrIT9BQ0UgJighcF4gJixhLVFjJikhX2MgLVFkJixxIzEkJ1ohJiclSiMxOCQgJ1chTU4lVSAnXmAnYSFAQU4lUFN2ICdiIScqKy4gLjkzLj4hKCojICcsQCddRyMnKTojMCQnWXYnWCFubyAnWSF3eCAnVzInWCFwcSAuOSFMTSVVVyVaXFwlaWslbiAtUiEqKyU2ICdXMyMxMCQnNyFMTSV+ICc4ISYnJT4jMTIkICllIUhJS04lU1ZXYWJlaSVsbnAldXcleXslfiApZiEnKyUtMjM2NzklO0BCQ0VGSElNJVBTJV9hYmRmJWlrJXJ0JX4gKWchKColNzklPT9AQkRGR0lKTCVPUSVUViVYWltdJWJkZmdrbiVwcnN2JXl7fX4gKWghJicoLC0vMyU5OyU+QEIlRUdJSyVNTyVSVCVjZWhpbCVvciV6fX4gKWkhJiclKSssLzEzNTc5Oj8lQ0UlSEolXFxeYGVoJXR2d3klfSApaiEnKCUsLjEzJTU3JTk7PD5AJUpMTiVVWSVoaiV+IClrISYnKSUxMzU3Oz0lQ0YlSUtOJVRWJVlbJWJkZmhqJW1xc3R2JXp8fSApbCEnKzEzNjk6PD4lQUNERkdKTSVQUiVVWiVhZCVmaCVucHIldHcle31+ICltISYoKSslLjAlMjQ3OTw/QEJGSiVOUVpbXl9jJWVqb3ByJXV3e31+ICluIScoKiUsMDQ3JTo9PkAlQ0VGSElNT1ElVFZYJVpcXCVfYWVnJWlsbnJzd3l6fH0gKW8hKCkrJS0vMzQ2JT1AJUVHSSVNT1ElVFYlXFxeJWBiJWlrbG5xJXN1d3t8fiApcCEmKCkrLS4wMTMlPD4lRkhJTE4lV1laXFwgKGlDKnI1KHBNKTg5KGd5KGhbKGdrKXAqKW8+KkE7KXN8KjlFKXVpKWNPKnM1KnV4KVIvKHtAKFoqKTdzKUIuKH5kKjR+KUZ7KjQyKUBLKXBnKF9sKT5RKWF8KjInKkpiKFxcMCh1Mik0PylcXEAqOXQpOF0pNW4oZUooZispfHMoXjcpbUgpKTwpNz4qWXIqdWEpNk0qMk8ob0AqdHwqMEopY1Ypb28pRVspb3ApO0woWFIqV34pN0YpejYpPzMpaE4pOzIpNjYqOEwqeGEpRGQpY2YpNjEpNzYoV28pazkoY1koYV8qLmQqYiwpKXYpR2ApSmsqNlIqLmspSFMpdkgqRScqb1IoW2QqVS8qOkwqNGIoYm0qTD4oYSYpcCFdYGJkZWxucnN1JXd5JX0gKXEhJiclLTAzNSU3Ojs9P0BCQ0VGSkxOJVhbJV5hYyVlZ2olbG5wJXR5e31+IClyISYpKyUtLyU2OSVAQyAqQioqdD0oWWYocVIqe0Yoe1QpNiF0aCApQksqVisrK0EpYn0pRFQpdW0pMTIoYyFgJiAqXnIqNFAqV3YqbVQoWj0pZTQodC0pMWspYEIqSzAodHoqOl0pQ2opfTwpJnwqLzgpbCopVEoqW1sqYCEwdCArMycpUTQqY0YpfSgpLWApdioqQC4qQTwpUSE1OTYgKSlJKSp2KW5EKnE8KT5YKSxHKS5QKl8wKHNAKjc7KmFeKnJRKnY/Kl9KKi9XKlgsKTVdKFlIKGU1KGNtKl8hOTo8ICphLClGOiktTio2aipKRissMSkzWShgRSludSktUCk/LilcXF8pWicoe3UpO04oXiFBfCApRVAoVF8peUEqe1EpXzUpciFERSVHS05QUVQlX2ElY2glam0lcnZ3eiV+IClzISYnJSwvMTI0Njk7JT0/QEJEJUhKTE4lWlxcJWRmJWhrJW9yICltaSkqZSlndSo9Qyk8Wik3UiptaClUNyhjaShiKyk6biptdSl+TyhXaikpYyo4Vio1QSo2XFwpV24pU3gqfj0pOGYoY2soaEwqSkMocGooVFMpKUspT3cqJ0gqYm4pL0gpPTopZi8qS0YpRDUpNWkqV3spclMqWncqZUIpLU0qPT8qQHkqej4oZHgqRTApUEQpMSFtaCApXloqOjsqOFEoVmcpU1UqQnUpPHoqKTApS3MpQzcqO14oZEspfWooWTAoXlgpVUcofUcqW2IpOjEoZSYqOyFBSyApRXEpdjcpO0MofD0ofkApKTYqVEspNzApRicqViwpOl8pOXIqRzIqe2AqVHsqL2EqbkwoVjsqcV8qeSspQFUpZikpcyF0dnh9fiApdCEmJykqLC4lMTglPT9AQyVFSEpOUFNVJVdZXV9gY2RmJWhqa3J0diV5e31+ICl1ISYnKSstLzA0JTg6JUVLJVJUJVdZJV8gKG52KHx7KSonKnAnKFtWKjN9KGQ4KT5ZKWxCKGkqKFpRKlksKTZHKm1RKUNbKGt5KVtUKSkqKGY5KV5tKl5QKTYyKTxRKTlbKS1fKVtuKmJ6KjdcXCpfQSh8dilBWCkufClTNypyPipZKCpKSik8Pil5aChwWClMdik1LChmTChVRSl6KikxaSlbaipUPik2QipgVip+VSl5XFwoZWApbj8pN2soYygpUmcqX3ApLFgqfjoqMnErM2soWGoofT8qWGQqMVQpP0cpXz8oXWooXn4qRF8pJlooe1cpNycqZEApbHEqWlopej8pMigpfjQoVlsqLzkpcmwoVFcqN2YoYDcoX20pTTUoZF4qW3wqbl4qc2wpWVkqclopSikpdSFgYWJkZmdrbG5wJXJ1eXp8fiApdiEnKSslMjglOz0lQEJDRSVHSSVLTyVSVCVWWSVbXSVqbCVucCV0dnh5e3x+ICl3ISYnJSosJS4wJTYgKXR1KFxcJilzZSk6bypOYCh0Kik6Qikofil7RSlJZShXWyo4WShqOChUeCltUil7XSkqIVF5ICpxPihgNShmPSleZSk5LipufihvZSlAbilJZypkWyhoWSlXPSouSSpJWSk1TyovMSltWSo7PSl2RCpzaSpfLykybylrTSpUMSlPdihgVCpYUClPMyozRyo+eyhuLShibihWYihUYShfRCooRypkXyomaShZTCpbdComQyl7Yik7bSkmZyhcXCoqNTEpbkwqKGkpVzYqMW8pRDYoemgofFYpdk4pPFspOnIpOWIpODwqbnMpOzMqX08pfWgpbnQpNW8odE0oZkopUDIoW3opNVApKW4pUD8oVncqWDcqSmkpLWkqYGYpdyE3OCU8PiVHSSVNTyVdXyVjZ2lsJW9xdCV8fiApeCEmKSoyNDU3OiU9P0ElR0pMJVBTVFclWlxcJV9hJWMgKS9SKjJzKTcvKFUmKGNkKmJ+KTlwKjRKKUAvKVI1KFgoKTFuKVcrKlRCKSx2KkVmKS03KTgyKF4mKjt2KUc9KF9zKTh0Kls9KFpCKH5HKXhIKHxaKGBKKXpaKTE8KmEyKXBwKS5CKS17KW92KlthKV5KKW9tKX1dKXM4KF9mKmFyKHFVKFgwKVozKl97KT5HKX0vKWUwKVZHKjFuKHlKKTZ4KSsrKG5sKj8zKX1AKSllKSxcXCpgSiovVSp5Jyk5OilZXyl1dClfOyheRCp1RihwNSlsMihXfilsNSkrLSkxZih1LSlWYylQeCl1ZShlWSpzcihfIT50ICk5QShlZyptRipUZypZcyljVyl1eypHXypffipUcShlPSl4IWRlJWpsJXd5JX4gKXkhJiclKiwlMDQ3Ojw9P0BCREYlSEtMTk9RJVZYJVpdYGJkZmklb3FydHZ3eXx9ICl6ISYnJSkrLiUyNDU3ODo7IChURylxLyhlSyptPCp4VisyUypvLih7USpTXyhUIWhiICheeCo+bSk0NyhhaSlGPihYeSkwRChfLilUcyheKCk2WSk/OSpyVypVUSpgTyltfCpjKilySilRMilkTyllWCpUXyhxZilyYCpYTClEQSpvQSozdykrPClXayh1Xyl8XFwpc3sqbzwpUG4pP08qL08ocTcoXXYqcW4ofFcocygoZiwqW2cpPmEqeF8obXkqbVApcT4qYHkpOT8oZ3EodCFAYCAob34qXFxOKUNzKlpIKjhVKGBbKTFwKHFGKkZAKSY7KzA8KFlNKnh9KlN2KHdAKTBPKGQ6KTY/KmEuKmMvKntUKTBCKjJCKF1kKjJpKHxyKntKKVUtKFV5KXohPD5AQUMlUVMlVVdZXV8lZGYlb3EldXclfiApeyEmJyU1NyU5O0ElREhLTU8lUlQlVllaXyVhZGdoICpYMChlLiowQil9YyhXSyhVPCpxTylUKiloMSpDNikpTilsZyoyMSlMJyl0MyptRSotNChfVClfaChlKipfZSo6cSpYKSlkdCp7QilUMChvLSo5eik/Wyo0Lik1WypyKCh1dShXOipTfCouVCk+OSo9VSp1SShpWip5ZSo0KShjOSpUYShlfSo0PikrNSlTZipYOSo5cypkLihmLSlReyhfeSouUShvQilgQylTLCooOSh0cShXOCkvMSkySyooWihUdih8XylFNypGRCkmQypuZSp5VSltUylgJipgWiheeyovXipTeih0byhfVyhYPShmKih0USk+cio0KCh7LCk2OSk3LCpeeikqNClSJil9OihXSihZYSlDSyl7IWlqbW8lcXQleHolfiApfCEmJyUrLSU3OSVCREVHJUpOT1FUJVlbXSVlaGlrbSVvcnR2eSV7fSApfSEmJyolLC4wMTM1JTc7PUEgKVVqKVZNKXhgKks2KSxUKWwoKTZdKl5vKFl4KmVXKT9JKjUhWnwgKSsyKjV7Klh0KGEwKk1ZKlhLKHQzKFtcXChWbCpxayljVCo2SypXeCh8KipTYCpyOih1VCovWyhnOyhsZChrVSpUSSk+NClKUSptTClwbylYeikqYSlrbilEKylFXSl8bCozeipYdikyRil5Pik+XSpYYyheVChgNCptVSoveSozeCouTCh+QylXeSlERSomOylvfSsmSSo2YSowfCopLCk6fSpvUSl6XihmTihoNylPXik6YCk0fSswNCo0dyltPShhMyp1VCo+ZSlGbypGJipxUCpzMSpuRihUcChlYSoucylGbCpaLSoySylDMikrMCoxSCl9IUNERkglS01PUVMlWFpcXF5hYmdpa21wcnN1dyV+ICl+ISYnKCorLi8xMzU3ODo8JT9BJUdJSkwlTlFTJVZZJVteJWBpJWttbnAlcnQle31+IComJihwTCoydSlHcSkpLSk+NihhYCkwRis0LShYfSpcXEgoXjgoe2IpLFApKTEpUmUpN1sqV3ooXj0qbVxcKGJmKVNNKjpNKWVDKHAsKURpKlgtKHRFKl8tKj0qKGdAKX5IKFdrKVNrKHp0KHZFKzJYKGVBKkVlKn5yKlVCKjN+KT5AKnheKG42KnNkKGBIKWsyKGBqKHw/KTdsKkwuKFVDKTc6KS9cXClIeyhePyh7TyhebCpOPCl+XFwqe1sqMDgpMW8pXicqWC8oXW4pKm4qYFMpaXgqTj4obmkpdHopLTYrNDIqcUkqXlIrJ1QqVEUpb2opRnUpRWgqWjgqWDUoYFcqXnQpWXIpSE4qbl8qYnMobjkpRSgqS34qX1goZ3MqJiEnKiUtLyUyNDYlOj0+QCVCRCVGSSVLTSVPUVJUJVhaJV1fYSVoaiVsb3ByJXd5JX4gKichJicpJS4xMjQlQEIlR0sgKyYpKHp5KVVzKVItKFY5KHtqKn5RKmQ3KTN2KmI1KnZ7KGYvKVZYKHwwKF9wKGoqKjA9KjImKTxpKTheKUA6KTQzKTBmKWAzKVIhXlAgKHRVKURSKjhKKHNUKGx8KlV1KVFLKmJjKHVKKjJNKGVUKVVlKGZ5KGo9KjwzKj0yKUZrKXk2KGc3KFg3KGVlKXBrKlY7KnFRKVNhKVZbKlhrKkw8KzBbKlg6KGwtKzFvKW15KS1sKWVMKTBBKGhOKFY8KUxHKko/KTArKl5aKGdvKV9aKkRtKzA2KVUmKHtGKSxVKi48KGopKFk4KWZHKGZAKGRQKFpJKGVrKGcnKFU7KS8vKWliKHN1Kj51KjRlKkddKWU8Kih6KVhHKichTE0lVVcle34gKighJiclKi4lODolQENERkklS1BRU1YlWVslXV9gZCVoamsgKSxkKkRCKGh+KTZnKFYmKVNYKTVTKjl4KGgpKGNdKWZRKVlpKWw4KGAsKGJ+KlRBKUtGKS1uKS8yKVc4KG8yKU80KWdpKUctKl9pKi9UKThzKTB8KGh2KW41KlVtKWA+KVZGKHtdKSpqKjtnKTJzKzFiKXZ9KkdAKicwKW95KF9jKTF2KWB1KUEzKSo7KTAmKlRyKV5LKTg2Kl5zKS5IKTA7KkVvKG1zKVB6KTBtKTM1KGNYKTFgKUFWKlg/KXl1KFdVKV9rKVJOKlNwKlRWKi5yKjt5KUBYKHd1KydaKVVNKVdBKlVMKVU3KFdUKV5GKjxzKTUyKTFRKnRRKlgnKXhJKF9uKG56KHErKUN4KWx1KXpcXCl5Zyl+UCooIW9wciV0dnl7fiAqKSEmJyUrLzEyNDU4JT5AJUVHJU5QUVMlYGIldnh6JX0gKiohJicoKiUsLiU0ICozaSp7OipgMSlcXE0qU2IrL3EodmAqLyEqSiAoZWYpRGYpSFkqXnsqJ1Yqc2MoZScpL1cpbWIpUnkoZCkoeTIqLkEpODUoX1MqNTUpKTkqQDcpNkMoXkwoenMoV0kpeD4oYFxcKTE4KVVKKHshe3kgKlMhXm0gKUArKS5XKnI7KHVgKi8oKi5EKGtQKUVDKHRfKFhVKHttKGFhKjtvKnhqKlg+KWwvKm1xKFp3KXpbKFcyKUVCKn5IKHkqKVA1KXBqKG89KHx0KX1OKnFDKWB3KF5IKjQtKjk3KHVFKi9FKjs8KUhBKUV4KXY0KXVTKTdNKThyKX47KFl2KGErKF9CKjtlKUtRKmc9KlpDKlgxKk47Km8vKX5oKFcxKiohNTYla20ldHYlfiAqKyEmJyU9IChbPCo4UChgayp7RClXWilYdilWSiksNyhcXHModlAofGQpVUIpUmYpbSoqPzwpR0IodHwqU28oYy8qZEUqckMqQUgpSTopdyspYE8qNHooVjgqYlApVUMqfk4odnsobVEpOmQqbkopc3koWS4qNUUpZU0qTkwqe08qL3UqLngoYUApPlQqZEkqXiFpbSAoZUgpe1xcKTpMKTldKW94KXlwKko1KnIsKTVGKGFsKjlJKUcuKURVKTkvKXJSKXxaKVRWKi5tKk5dKHZEKTUuKkJvKjlsKWxJKFpPKFZfKW1JKlRPKH1PKSlGKX1fKT9GKmVMKFZeKVR6Kk0yKil+Km8nKFZZKlUzKl9sKnVeKUE7KXhSKl9iKV9uKVV0KishPj8lSkwlUlQlfiAqLCEmJyVGICh9Qihhcyo7WyheLio6fClyQilBZisrbChWQCkxSiooIW5jICouaShWKSpSfClBXyp4aCp1RChyWyk+ZypvXSktaCltbSp1QSl8IUxLIChfMylfMSl7Xik6SSl7PCouOilnUCp3JihVMileUyhVSipkJihkXyk+TClAMCo3IXV+IChnOSh9NiltPip2Mik3QillRSltYSh9Sip+Qyo9LSh9RShnKylzdyhVKylTXFwqMzcpNzwpOSYpKTAoXkMqWiErbCAqbzAoWXooZUIpMWcpXy4oYSgpOGErMDoodzooWlYpcXcoZC0qLnwpPDIpPiYpNkwpOVAoWkQpY1MqTkMoXyYqU30qLncobyoqPS8qbVooXmcoZXgpJk4qLCFHSCV+ICotISYnJS0vJTM1JTk7JVAgKFlTKXxQKVVWKmJnKn5ZKGl5KGdBKGNwKGdaKSw9KTpIKUpGKF9iKTM2KF99KHFbKGJAKG8xKXRCKXFLKStNKTNFKik3KTV3KTZaKFY2KV5wKjI5KTdhKV9mKnVLKG9aKjpJKUV7KUh2KXZYKnh3KXlJKHNyKGdeKGVMKVd+KF1wKGBVKHtZKlRiKjQzKGk8KHAwKTBMKG80KGYxKXtAKTApKHpkKTlfKTZjKGVAKTYmKHt+KUU7KGg/KXtlKjpUKmRLKSspKktpKHReKHA4KTd4Klo2KjRzKG86KX4yKFkyKS52KHt0KU9QKGMwKX1kKWUuKUZ5KXQ0KXF2KUBAKF8oKFV8KXBtKH5rKXtrKj8mKHR0KydZKFtXKi0hUVIldHYlfiAqLiEmJyU0NiU4SE5VVnB+ICovIS06S1FfeHp8JX4gKjAhJiclKSsuJTc6OyAqe10pMk4pWHQob0cpQE8pOFcobiwpN1YpNiwpK2kqcWMob2YpNzMoaicqRmMqNXUqXzQoaV8qPG0pREoqWFYqQDUoeCwpRkIpN1AqJlAqcWAoXjwpXFwpKlU7KTpcXCpOQik0RyovRylfRClZfSloZilKYyllaCkrYCpiVClDVSlVZik4byhhdClkJyoyNyhYTih2WSpkPilfWylWQChiOihVPSp0OypvbipBfSl2TSoqLShdRihvdSk8byozaCooKylUPylIcilKLShfKihkTilIKSlkRisxbComUyllZCl5MylaUiloZylEMyplRysrWCl3Zio8RSo7aShlbClGSihVKihkPyhhcil0cyhkPChgQyhbXyhYbShZWSowIT5BQyVGSEslT1MlVVdYW10lYGIlZWdoaiVxc3V3JXt9fiAqMSEmJygqKy8xMjQ1NyU9QEIlRklKTU9RJVNVJVhaXFxeJWJlZmglbXFyICluLSl8OCooQilTUypzUyhhXFwpajIoaDsoWXIqMzEqPG4qX28qb3EpK18pL04pVkIpKWApPlYqNWMqblgpL30pXz4qLl0qKF4oXzwpR1sqKGEqOTYoVGoqXnAqZUopQW4oVkIqVGkpPFYqMycoXFxYKW07KWJFKHxDKl9OKVtMKFVzKTwvKm9kKStsKT87KGAxKktHKV9KKGFkKWV6KWk7KUR8KXZ6KnRaKFR6KmJBKyw5KVZuKF9OKlhBKGV6KTc4KWdsKj1UKnQ6KzNwKm12KFdxKjEpKF8/KV5QKnJrKH5ZKnhmKGVDKFZ4KVk0KWhqKUsqKXVHKntkKWxWKGAyKW5vKVU9KUYmKF45KzQsKjMoKGdEKX1QKXwsKjEhc3Z3eSV8fiAqMiEoKiUwMyU1OD0lQERFR0lQUVMlVVdZWmElZmhqb3BydHZ3ent9fiAqMyEmKyUuMDIlNDY4JUVIJU1PJVogKnJ8KG9nKTdMKnI9KUpLKHZ4KTphKiY1KVpOKnJBKjltKGNxKnhlKSsmKV5kKTlrKGNzKkRDKys1KzExKXVoKnR2Klo9KlhCKzB2KVtEKXhVKS05KnI8KTVKKn4+KGVyKm43KFksKT9nKH0hamYgKi9WKkRFKVI2KS1vKWdBKVl8Ki9AKSY5KTgsKHp6KVl+KGQrKFVeKTlYKWxiKTZkKl5YKFdhKFZlKVNUKi5QKlN3Kj4nKkhKKjA/KmBzKm59KX5kKn5rKkt9Kj5HKVRwKn5QKi52KHVVKzFZKWdVKXQ2KkR2Kn4hNkwgKGtiKGV0KHBVKFVdKzFEKGNlKl9ZKjU0KXJ5KntnKkYwKVl5KkBrKUM6KTMwKVpqKjMhW15fYmVnaiVvcXJ0dnsgKjQhJyolLDA0Nzk6PD0/SUslT1MlWVxcY2RmZ2pyeXt9ICo1ISYpJSwuJTAyMzY3QEJERiVISiVWWFlbXiVgYmQlaGogKlU0KjlZKjtAKXEyKVFzKS5kKjx5KWY+KjpzKm50KVE7KXNpKm15KGN+KjpwKF5eKSosKlY+Klg4KFU1KWdlKUUmKUdfKmRKKnRNKWE0KVNPKXFJKHhUKm9CKVEvKjB2KUBwKHwuKHYtKHhcXCpxITdGIChXJyo9byo/SilNcClweCpvMSlmLilIJyh6bylxbypkbip1TCopMypgLypVJyksYionfCl5UCpOPylTeipGXih7fSkqMSlISilxYCovNiheYShdcihiMSh3RCovRip1TSo6RSk6LilyaypCdil5SilYKykrLyh1ZipAaSleSClRcSk3KSlwWCk+SikxLypxTClAVypILysvcypuRyhlaihnKCpVNyk7fio1IWtsJXBydHglen0gKjYhKCkqLSUxMyU2ODo8JT5BREVHJUpTVSVZW10lYGJkJWlrbHAldHZ3eXt9fiAqNyEmJyUrLSUyNSU4PT5AJUJERiVMICk8JipDXilMPio2bil2ayk7bysnbCk2fClDaSo8ZyhzJysxdilTWSlaXyh8PCpyQipUbyljfSlFXFwpNzEpZCYoVj0odjopUS0ocmspQkUpKkQoYkcpMnwpQ2YpcS4pck0pZCwpemUpN2koaDwoZlQqbVMqYikodzcqLk0pUXYoVTAodUMqMkYodG4oY2YpbDQqc1sobV8pODEqNTwpMFUqcUgpVnkoZmYqe1YoXlEoeVIqNSgodXsqdFcoWlopVDoofUEpN0koWEIoY04qNk0qYD4pWVIqQSopNzIpKmMpdkEpPGIpOTMpLycodzMqZFMrL28ofUQpOGAqMngoezQoaWcqbyFLTiApVigpMSgpRWwpZUooX1AoezgqNyFNTiVbXSVfYWJkZyVrbiVzdnh8ICo4IScoJSsuLzEzNSU6PUBEJUdJTlJaXFxdXyVjZWZoamwlbnAld3l7JX4gKjkhJyglLjAgKTdRKVQzKWN5KTYwKm1hKi5XKjU+KVVPKF5oKSxBKHVBKGFrKS9EKHVAKUItKkREKW1DKTg7KTRbKilGKlReKGg4KU85Ky91KVBtKkJ7KGZZKFtNKVNSKGljKllbKWNKKSldKS9HKWk+KTc3KTlKKWNqKS18KVg0KVU6KT1UKVs+KXBxKXZTKXE8KWxRKGA+KGU4KFVAKSs0KT9jKjJgKjRaKTZeKGcxKGBCKV8wKkprKll4KVQ2KGZ8KjReKHEqKkt5KlhUKnJgKmN6KFhLKVNJKGpXKXBfKXRlKTZrKV97KVt0KS1RKkBEKUhbKXVYKiZZKjZ6KUNJKzBGKTh4KXYzKG9SKXRHKnR9KTYhPG4gKGFJKWk9KVE3KjkhMTIlNDg8JT9CQ0dISkwlTlBTV1olXWFiZWdpam55fH0gKjohKCkqLS4wMTM0Nz5ER0hLUFUlWFolXFxeYGFjZGZoaiVueHl7fiAqOyEnKCstLjIlOz4/Q0VHTFBSIChpXSo1aSltVilwRyhjSCluKShcXHkofUYqUykqJikoWyYpY2UqfmEqeV8pWkEpazgpeDkpPDQpczMpN2YqeHEqWCsoZ2wqMzUoVT8ob00qOmcqPXApKmIoX2Apa0wqVCgofVQob0QpVFEqeGcod2EpdGkrJ1xcKl98KihFKGBwKTVtKm5UKFZaKjxCKj5rKj1MKj9jKHBeKUNyKG4/KUFeKVViKlU8KUJ0KV1FKUNdKU9MKUZJKTU2KHYvKFRJKF83KVpFKUVeKVM9KF5CKUhMKHRtKU95KWxjKSZhKjU7KzM8KT95KXchcmsgKn5bKlh3KH4uKFVLKFc8KGYzKHR3KXRBKGxWKVF0Kl9VKSxAKVMrKVQ4KlNoKTlIKjshU1RWV1laXV8lY2hqJW5ydyAqPCEsLSUyNTY6JUBDREYlSUslTVAlU1VWWVtdJWNoJWtxd3p7fiAqPSEmJykrLC4wMTMlNjg6PCU+QUUlR0klS04lUCApMEkpVTkpZDopNikqbSFBeCAoY1IqX1IpfjkoVnMqVTEoVWsrMXIqbSFkZiAoYGcpW0IqYUIpVUEqVT8ocUIpJ0YpTyEyWyApRTYoZl8qNiYqMHQocnEqQTYpLHcpNmUpTGQqbzopPm0pMF0pRz8pczUoVUEoWTEpKS8qdiopPFkqMWcpJkAoWVgpe1MoX3oqOnIoVFopL2Epe0kqbVkoWT4oVkYpeV4paTwoYkwqOicpPSYpeTUofDspUy8qdT0qXmUpUikoWm4oZDUpV08pPHspQWQpUjcpMUUqeFcqVFspKnUpaUQpez0peUMoVF4qYjcpaGQpUkkobW8qY3gpU3MqWTIoY0kqRWEpQzAqXFxLKH1NKn47KVdqKj0hUVJWJVpdJV9hJWNlaGolbXN1JXp8JX4gKj4hKCklLTMlOjwlQUMlRUglT1ElWlxcJWBiZyVqbG4lcnR4JXp8fiAqPyEoKiwtIChlMyh3USszdypZSihkcShuRCp5LilEKCpkbylTdyheNCltbik3XSlkcShgUihhXioveylebylvKihkKiswQSlLLSl1SipzXSpLXioxMylgXyliOiheVSlFXylrOihzYyk9bChtTCpTZip7Syk2MyoubykxeSlfbyhzayhWIVVOICkuWCp2eShXNipTYShfdih1VyouRSk1cChWYSlALik1Kio7TSo/eio7eCpHdilhZClZTih7cCoubCheYyk6KClFYCozZio7TipJTChdNyh7MSh1TypfQihVYClSZCheMSpMUSpeWSpxfSpBSSlpZipuaipxPylWSSo6Uyksbik8PylUZyo+Mio2QCsrdyhyNipYWyhUTyhkdyo/IS4vJTI0JTc7PkAlR0lLTE4lUVMlX2FiZGYlaGxtb3FzdHYleXx9ICpAISYnKiwtLyU0Njk6PD8lQ0UlR0klU1VWWCVaIChXWSk+XilHKyhqcyhUbSk6cyp+ZCk2Lih5KylpZyo5OSlWTClIbyhcXGUqPEopdDcpQ34oYFMpU0cqLksoXFw5KGleKWEuKX1vKUFCKWgrKjpZKUQuKH12KGA6KWFNKkpJKnE5KnJLKTxyKlhhKjcsKGl9KVJcXCk1YyovbyhyaihXXyhpPypYTylBPChUUCh8eCpLeClHfCk4Xyl6LClfaSo5VChiYip3Lyh8byhoOipiOyouZyh1LypYSipFYio4ISwtICpYZik7Sih8YikyeClWLCl3aCpTeyl0bClsMChnJihXcypcXEcpVzsodzsqLl8peC8pUzYoe1goeDgpa3AqNEIpMnUpV2Eoc28payF1eyApZDcoY1YqLzQqQCFbXFwlY2UlaGpsJW5wcXMldnh6JX4gKkEhJiclKSwlNT0lQUMlRkolVFZXWSVcXF4lYmQlZmglcHJ0JXd7fH4gKkIhJicgKXFBKXB0KGEqKjRgKG5fKSlQKHRXKWVaKT9fKVhwKlQ7KH09KkRlKGNQKXQoKTdoKUA/KFZUKnlmKkR0KHtVKlQqKGVPKXNwKFhhKH1TKn5AKHY/KSxMKXdkKHNqKFRcXClGMihVeCk3VypQWypgVShiJylAeChqfChsWipgOihWaShYbyplRSp7RSlRbykpSikvdSh7WypOQCpUOSk+MSk1Zyp7ayh7Pyh8XSk5QChpJyhlNClucSheSSpBKylFLilINClQQyk2VSpefShlMSo4MilWdCltMyhVUypYTih7JylhbypCVSlCIShwICowWipGQisxaysyZSh9YylDbSpgKClGRClERCk1KSl8QyhyXSkrTCk+aylacCpCISgpLC4lNDYlQEMlSUslTU9RJVNXJVxcXmAlZmglbnAldHd4enwlfiAqQyEmJygqJTAyJTU3JUUgKTAuKGBRKjJDKTtaKkpOKWwmKSlNKUZGKTdeKnRgKGUpKWNbKlRlKVI7KXJIKXotKGYyKXM6KnhaKjg8KlRYKXUxKUNSKV9DKT9RKTxCKGt9KS9PKXk5KGVVKFRjKVA0KjNjKHxYKGsqKG1wKFchdXcgKntHKSk7KURjKjJuKS80KnhiKmA5KHtCKlN5KlRZKTp7Kjh4KT0yKGtEKjo9KmQ5KFlgKil3KmBXKihPKFxccShyKSlZRyh7dipULSozYCpkTCo/TSl+UipEcSpzISgsICovJismRCl1aih+LSl6dipgeipzRCl4MCh6aSk4cCl8eCpAKSlILihoWCovailocSopeSpuWyk1XFwocX0oVmooezoodUYociwqQyFGR0klS00lUVMlXV8lYmQlc3V3JX4gKkQhJiclKy0lLzElQEZHSSVNTyVRUyVVVyVeIClnJyk4LypbQCpaXSo0Uio6Qik2byhlTSlURSpkMih0UCkvMylSdyhvMCk7UCpYKiludilaKChvPilNRCluOylbUypVOCpUbChvSSlRTypKcCl2Nik5WihlVilfLylSayhyMCk7MChxMylIYSo2bShoYiopLShaSCpcXFYpVm8qWUYpX20pOUcpVj4pWWwqLycqPWcpRnYqYDspVnsqcmwqU2UodH0pZD4qQzEqNlApbWAqUFIpSDAoYG4qWnAqbmspOi8qeHgqWzkoaXUoWDUpQz0obH0pMVUpVjgoYF0ofU4odE8pV0UockMpbC0pa3IpMEUqODQqNXEpN3spREYqX3MpcXoqWkEqWDQqbXQpKV4oZDsoZjApX0UqRCFhY2RmJWx3JX0gKkUhKSolLS8xJTY5JT1AQUZISU1OUiVUViVaXFwlXmBjZ2htbnAlcnV3eHslfiAqRiEnKCUqLCUuMTclOTwlP0FDRiVITU5QJVNWWCApUkcpLDQoWzMoVkEpK0MpOEsqOGcqYFIpRyoqZEIpc0EoZWkqbjYpLUgpfFIpR1ApOFYpfWYqLnkpbiYoW04pNlgodFoqYEcoX2speTspe0cobjopLXYqYEwpVX4ofWUoblsoZW0oXXkpWD4obXcpOWAqeHMqNlEqRlcqTFYqYDgoZXsofXQqNzkpN0ApNXQqNVxcKzAsKnI2Kn4hOEYgKUlVKHVyKTc9KGk3KTgnKGdyKkV0KVU4KHZ3KWs8Kkp6KU98KHQ8KlVXKSxsKVhvKWdjKnhdKFR+KV95KHtDKXVzKThOKUFKKXAvKTFLKHtSKHdkKFRNKjYnKVJxKWdFKFY1KURuKjA5KS1kKUBDKUNZKS5jKHVRKHZ1KkYhW11fYWJmaCVqbCVvcXJ0dXd4eiV8fiAqRyEmKSUvMzQ2OCU7PSU/QUMlSEpLTyVWWFolXFxeYCVjaCVqbW9wcnN1dyV7fX4gKkghJiglLjAlNCApKG4pLjkoZCcqdngqX24pRngobjAoaSgpMV8oVScpWzMqLzUqOjUqPXEodkgoVyFaZSAofUMqLkYpQ2gqQHIoZncpbEwqNEcoaXsrJ2coWC8pV3cqVHcofGcpMz4oY3opbmopV3MqRH4pPykqcUoqLlMoZj8pelIqKWEqcT0oaygqMVApa0QpOC4qRlkpVkQpe2MpNS0pP0MoY3YpOkApUzEpKTMoZmAqbVsoVTkpUmgqVFAofVApQCkqOWMpSCgoZiFCOCApUSspT3goVigpOFMoY1cqOD4oV0goWTcob0EpNSYqdEIpQVQpZC4oYmcoYWIpMHgqVFMpQF0pYWkpRHUqTVIpdS4pdDIpQWAobCkoZjwqbnspZD8qSCE1Njc5Oj5AJUJERiVJS0xOT1ElVVclWVxcJWBkJWpsJW9xJXR2JXl7JX0gKkkhJiclLzElNDYlOTslQEIlSUtOJVFTJVdaICl5eCkwSCkpVCkwYio2byh0OykxXFwpYVQpX3EpWUIpUlcpZEUpTUgqSzIpKXUoVU0oeHUoajwqbj0pVGwqKVIqczYpNSsqLmApcnUqRHIoYzIqdGIqXycpQXcpJjQoWSkpZVkoVFEoZFxcKHQ1KGVwKTk4Km8pKF1tKFZtKytQKi4+KGdjKld9KkoyKjhXKnFBKVYxKSxjKHk1KUEuKnJfKWdqKWZBKGR1KjZMKntaKjEwKHthKnIhbUYgKi5ZKXE4KGRYKm93KntuKX5sKkxwKVhJKFVOKjFjKXg2KlRKKTFzKGd4KFY/KnhZKSk/KUx+KFxcTShlbipVbCo+MSl1OSp0SChgZChoQChtOCpuWilWKyh7bClWaSlBQypJIVtcXCVoaiVvcXJ0JXZ4JXp9fiAqSiEmJyUpLCUxMzQ2OCU+REVIS01PUSVUViVaXmFkZWdoamwlb3Elc3UleXslfiAqSyEmKColLyAofG0oem0pRlQqM3MoaXEpfH4pPkMpSXwoVi8pT1kqRzcqdXYoY14pODApO0AqYjApPz4qNEUqVHQoXmUpSDEoZC4qSTApND0pU3IpVFAqVS0ofVYqQlAqOXYqbmYpTzUqXywpP1IpLy0pLk4oWWoqSXwpQGgqNjcpZjwpMXooXkAoYCsob24pLUYqYigqSioqZGYpKmcpRDQpL1kodkcoXWkoX2kqNHwoYnApUycqc2EpYVooV0woWXcqMS0pQ3soamUqbmIpeTgqSnQqLn0ocncpNSgqdEQqRE4oa18qeFspLXQqU3UqP3UqZCsoZTYpQDYpKn4pbFkpMD0qKmwoeEEqLyErLiAqXlMoakcoe1opMSwpP20pZz4qSyExMyU1NyU7PSVAQiVFSElMTU8lUlQlVlhbXFxfJWNlZmtsbiV0d3olfCAqTCEmJykrJS0vJTU3JTs9QCVESCVMTiVQUiVVWCVbXSVfYWMgKmBBKW9VKXFpKi50KnVfKkJBKHp2KXs6KnQuKkl3KGIzKWFfKS41KUA1KlRGKHxZKn45KSkpKVBCKVJiKlMhamwgKmBCKl9WKGRBKTcmKy8hdn0gKGZEKFRxKjorKWN3KkU3KSZpKko3KVZSKnNiKGd8KFYuKlNzKWAyKGdoKnFYKV9hKVdDKXBpKFRrKXRJKkZUKH5VKSwzKk56Knh8KnFdKV5pKVNtKHRqKTlhKXF8KkorKVpTKjk6KHFhKWJMKGRCKXRPKnNeKGhTKS1KKWBZKHtrKlR+Kn5WKVA8KHRUKzAmKXlfKURNKTYvKFhRKW1FKjByKVRgKnIpKVIuKFcrKW12KF5HKUZqKVp9KmFfKjZCKHVjKWl+KkwhZGUlbG5vcSV+ICpNISYnJTAzJTg6JU1PJVFTVVdYWiV0ICk7TSh9LCphRCl7VypVLih2TihnVyo3eSo8KypNVCoyNilJWChsPCoybCljVSplSShfKShVTCp4VSk5TihUYChlUylDMSo1dih0QilWVShURihzeChjSik6NSpuSyhZJihXRSpKQSp4cCh0XSphNil5cyhWfio0dCltNSlTMCh7Uyh2XFwpLUEpSS0qRHUoWkopKTooVUYpc3EoVnkqOUEpNlQpQFxcKmFwKH1+KFZTKS1dKjc/KmBwKjNhKW1PKFY6KktZKTI2KVB+KS5RKFU2KXBjKVk6KlRHKlNrKlQhbjUgKSw/KjIyKjFbKi5oKjtKKjwnKG11KVBwKncsKnIqKHZvKGV8Km5QKVc1KHt8KntDKH0+KSxSKnMtKk0hdXYlfiAqTiEmJyU6PUdNJU9RJVNVV1klXFxeYSVkZiVoaiVsbiV5eyV+ICpPISYnKSU+IChkJio6XylMTih4NiswZykrKiovaSo8dSo+IS4vICo7fCpHMCpfXypYYilwYSktVSp4dil1SClAaShoMSk3TyhYRSo3PCltbCkrTipzaipaWCpGOyhnOilUSClWLylSPykwWChiLylrfikqbChXUykweSkucih9KSlsLipiNCptcylkfilTZylYKSpjdilDRyhlIShQIChYMyplRCpUVShkfikqaypfUylXLihVeylwWylKVSpEUikyQSo4JihYOyhZZypgdisrMCkyMClXIWdeICpyeyhVdSh3TCp0LChUVCh+Kyl5MSh7PipUUSoxTClnQyhwaSo5UipiRyhlXiphJihqWykmPSkuLCkyLylPRCllXSo0NipQUSpPIT9AJV5gJWhqJX4gKlAhJiclQEIlSCApVXAofDEqS1oqeGQqVXYqfjcrMCopV1QoXnAoXWgocC0qSl8oZFUpOlMqXyYobikoZlxcKG5CKWZSKVkoKi9ZKl9tKjo/KTJmKS9aKnJYKUMuKi5AKlkhMWogKm1YKH5fKihUKUNGKTEmKnFUKjJOKFV+KmJtKGJoKnJeKF1mKl9hKkFzKmQxKUFFKncuKHplKGMsKXRtKUQnKUZwKGd0KV5ZKHtnKl5nKF5ZKG5kKGdcXCk9ZilBcipYIV5DICo1Oio+diphTCopNihfcipDSClFLylAMilcXC4qRT8qW3YobFgqYFgpb3QpXlEpYlxcKld8KTdTKGAzKVRSKlg8KS9AKHJ2KTNcXClDPCpYYCk1aihqUylXbSlDaypeUSpQIUlKJVBTJVpcXCV+ICpRISYnJVIgKm47KnFHKXFoKUY4KUp3KGc2KFU6KV86KlQsKTteKT8tKHs8KXtKKFpqKHxGKXNJKVFBKlBBKihIKVNsKXBoKT9LKl8oKScnKH1aKkQsKUY7KGNvKTU0KXxGKVhMKi8+KUw8KXxNKS1UKVpyKSxdKTlEKVZLKUQ7KFROKSlYKlgmKFZrKjREKW8mKnM5KTdFKUB2KTZBKVNqKlh1KWE3KjBRKF1rKjNkKGVJKmFNKTZbKGhEKkYyKl8qKjI7Km5xKkBvKl9qKVVVKWguKT9BKXFfKWtaKXRcXCo3dCpXdyptOyhZLylEeiltXSpULip0Syk4QCpvSCpyKyo/aSk4NClyKCktZSllXFwoVXYpL0YpPm8pN1kpT3UpPjoqUSFTVCV1dyV+ICpSISYnJTs9JVsgKSlvKW1rKmJXKlN+KjlkKUUpKT4qKGY1KkZaKXNzKjQmKjUtKVJIKFU4Ki5hKjMpKXE0KUk1KVBPKTYqKFpsKFhmKG58KTdxKU90KlllKGVHKUAxKi5SKS5iKTgrKTlvKjchbG0gKjBWKSlkKSYsKGBQKUFqKXlhKXo5KlgoKV50KW14KVl2KVNpKXtYKFRzKXBeKS5rKm1SKkpVKi5iKXlFKjRDKmVIKFchLVIgKjg/KGZsKSkmKVUuKlQwKihVKl5eKjN1KSliKGc9KXBKKHtQKUEsKn5uKWhBKUZdKkV2KUNvKWY9KlQhXFw/ICpgSCl8ZilfXSlhPik3LilzNyhreChVKCo+YSlFfShhaipFWypYLipuUil9ZSpSIVxcXSV7fX4gKlMhJicoKiVcXGlueCAqVCErNE5tICpVKShYMSlUPSl4Lip+RSk2ViljSCk3ZyhUWSl0SypeVik8XSpYWiomKClHQykqcypLSih1Uyk8SyhzbSlkeylJNipvJipgNSpYWChvQyovQSpUaihfOSk4Wik3QyhjYilHJilpKio6bypjeShpPSlyJyleVylVRiheRShnUypYRCh2cylZYylWZyh6bCoqKShWaCooLSlZayh6YCo3YylXVyh6ZysmdClIVipaeCh7TiovPSkvbSouTypiPypYcCh0dSk6LCl5VypZWihjYSk/cSl4JypUKSpyMSouXiptbiotdShreypkXSlDPiowUih8aCphVClAcSkpLihYMilFaihbMShYPihvMykrPSMyJCpVIUNEJUtNJVBTVVZYJV9hJWRmJWtuJXR3JX0gKlYhJiclKS0lMzU2OCU6PT8lRUclSUslXyAoVXooVFIoXWUoVFYpLDwoY1QoVFsoViwoVGQrJ0ooenwobFcoVG4peTIoVSwoYn0oVTQodFMpY1koY30pUXAobXQqNGgqe2wpUTMpcmUrMlxcKFR8KFYzKzJVKFUhSVYgKFYnKjlPKHprKGllKGtWKFZYKGQhQ1NZW2QgKnVQKlhdKGMpKGVSKGMhNT1NICpYXFwoYyF1ciAoXyF1eyAoYCEoR01ZWmZ4e3YgKj9gKGEhPkNCUVQgKF5OKjA8KFYhT1ddVnx1IChXJihWcihXIVYuXSAoWEYoVyEwYGJEZiAoWCFASSApPjMoWCE8PyAqViFgYSV+ICpXISYnJWYgKFghQTkgKFchbXggKFghWFZza2VxYF0gKFkzKFheKFk1KFh2KFkhb3FzTmNsZVpoIChaIShZfCAoWXwoWiFcXD9eXS5MPFVYIChbVShacyhbLChaIXh+IChbIUNSfH4gKFxcISc4VCAoXSsoXFwha2pkbCAoXSEsMCAoVnEpUkQoWCE6RyAoWVcrNDMpUk0qJ30oXjopKUUrMWcqe20oXk0odDooYiFhdSAqTygoYngoX14odD8oXXooVjQoXXsoVkcqSkwqSykoVkkqNT8qS1cpeFEoekQqSToqMUcoXiF3fSAoXyEwLyAqVyFnaCV1eSAqWCFRUldfZWglamxub3FyeCV+ICpZISYnKSotJTAzJTc5OjwlRUclSUslV1ldXmBiZGclaWxuJXF0d3kleyAoXzooXiFibnEgKlMhXWNkZ3FydCAqVCEmJy8zMjYlODo8PUBDREhMTVJUV1pdYGNkZmhrcHN1dnglen0gKlUmKlR8KlUhKColLDAyNTY5Oj0+QEEgKGN4KGQwKnEhbHFwICpyJypxeSpyITMyOD9KVV1iaGp+ICpzISo0TSAqYSF2enx4ICpiITInOjk8QCAqWXwqWiEmJyouJTAzJTU3Ozw+JUBCREpMJVJUJVZZW1xcXiVhYyVqbm9yJXZ5e34gKlshJygpKyUtMDEzNDg6O0ElRUglTU8lWlxcXV9gY2YgKmIhPjZVS0RWSk1ZbGhiXWFxdSAqYyErMU9LUF5cXGZwcyAoYCcodGgoYSFjbW4gKGImKGhRKGIhOD5YIChlPCliZSlzWyksMShfIWhvICsnRyhkbCksPilsVykpNyhvLyhwITMrIChyVihzITtEUCAobiFlaGZvdWprIChvPyhuIXd+IChvIUxoTmlfXktQWVYgKHAhNy4gKG9vKHAhPFkxPiAob3YocCEqX2JkY1xcQn55IChxKShwIW5nICpbIWhqbCVwcnN1dyV5e31+ICpcXCEmJyUqLSUvMSU3OTslRklKTE1PJVVXJWlrJX4gKl0hJicgKHEhPD4uIChwdyhxITFPSnVRIChyIT1EWWFyWCAqe30rMl4pNHQqOSFAREZWUW9LVVheYHIgKjohJiwgKjl3KjohNjhRICo5IV9+dSAqOiE5Oi8gKjkhcHtocWYgKjohMjwgKjlrKjohT3dlUn11SmJARnppQSAqOyEmLyAqOnQqOyEpKiAqOiFOQyAqOyExZnBxICo6dio8Tio7IVFJRiAqPFcqOyFzRGRcXFh0VSx1Qk9Ie3ogKl0hKCklfiAqXiEmJyUuICo7IX0wfiAqPCEoJikqbDRvcFxcZk9YQThyZTl0N1RaZHZ4fSAqPSFkSDsgKHE4Kj0he25AYDkgKj4hJkIgKj0hdGk3QnJmW1xcTSggKjx8Kj4wKj0hU0QgKj4hZltkY30gKj8hODkrOikgKj4hRlBzICo/ISc9PyAqPiE7dyAqPyFyfiAqQCEoPiAqP24qQCsqPyF7cGsgKkA4Kj8hUmplSCAqQCE9O2QgKWtjKkE3KkBIKkE4KkB3KkE5Kl4hLzAlT1RqdnwgKl8hLjElMzUlODs9JUBDJUZISUslTVBRVFdaJV5gY2doa3FydHh9ICpgIScpKiwlLjIlNDY3P0BERktNUCAqQSFVOiAqQCFXVCAqQSFYR2djXXkgKXMwKkEhQnF6ICpCIUpOLTUgKkF4KkIhVEIrX11WeWcgKkMhKUx0UnZjICpEMCksITtFICh0IWJnICoybSh0eyh1Jyh0fihidyh9IScqMTkgKTVoKTYhLWJ+ICk3ITREQVggKTgzKTdgKTghSlxcVCApOWUpOlUpOSEpMkZsICk4fik5IWRCICk4eik5IWZ0ICk6IVFXP14gKTl8KTohPS0gKTtYKTkhfnYgKTshS0cgKTohanogKTsmKTprKTshLCdkICk8MSk7cyk8QypgIVFUWyVdXyVkaCVsb3FydXd4e31+ICphIScoJSstMyU1ODk7JUBDRUZIJUtOJVJVJVtdYGMlZmhpayVvcXN1d3l7fX4gKmIhJiorLSUvMTM4PUJDRUYgKTwhJ2RlRmdtfSApPSErODZdeSApPikpLEgpLl0pa28pLE4oY24oZSFOWkZFWG9zYyAoZiFPViVYWkcgKGV+KGYhW10nNiAoZyEtPyAoZiF7dWggKGchRUYvIChmIXpqIChnIUh7WG1ffVJRfiAoaCYoZnYoZ04oaCcoZyFmancgKGghKywuIChnIVRVTyAoaC8oZ3ooaCEwbTlyT2ZFdHVhY3l8IChpYChqIS9VIChpIUJmOk44STUgKmIhSElMTk9RJVNYWiVcXF4lYGQlZmkla29wcnR2JXl7JX0gKmMhJiclKSwlLjAyJUVHJUpMJU5RJVtdXyVlZyVvcSAoaSEwT24lcCwpVSAoaiErciAoaXwoaiFRWSggKGl6KGo/KGl3KGohdjEgKGl0KGsmKGohXV40OSAoayExPiAoamkoa2YoanEoayEyMyAoanQoay0oaiF9ZCAoayE2LDk6IChqIWxtIChrIS88KyAqXn4oayFlT1NIa2pFR250IChsIUYnRSAoa3MobCE7UEdKOkJ0Ul9ZaWpzIChtIShEaWxydiAobiExJzU7QEZFWCApKSFXYVxcWXkgKSohKisgKmMhcnR1fiAqZCEnKCUqLC0vMDM0OiU8P0FHTiVQVCVYWlxcXmJjZyVtcCV1eCV9ICplISYnKyUuMSU0NiVBQ0ZLTSVWWCVgICkqISYzQ0pNUCAofiE4Jjk8QjRERT1GSGFOaVhXXU9tY3B+ICkmNyh+dykmIThVVnp5ICknKCkmIXdxWW4gKSchUjguN2ZVaVdlRURjbnwgKSghOj4gKlV+KSghWGYgKS0hV1tma21weX0gKS4hJzM4QEcgKkpAKS1FKWQhcnV5fH0gKWUhLy06OT5UW1VeYGNtX29mICplIWFiJX4gKmYhJiclZyApZWcpZiEqJjQgKWV2KWYhMTAoNUw4P0tEY2BqcyApZyEmKTggKjg7KHRLKnluKHQhSiggKnshODwlQUlMUlVZXFxfYmVmaCVqICkqbykrJykqeikrISw7Nk9LVEkgKlhTKSshaGdxfiApLCcqNzMpLiFPVGFaICkvNSkueSkvNikuIWxvICkvITA3OCApLiF1eCApLyEqS2dYTUE/W108cVMgKTAhUVJUUyApL3QqZiFoaSV+ICpnISYnJTw+JVZYJXAgKTAhQ1ZvcyApMS0pMCF2XFxrZXQgKTEhbDsxXVhGWjQgKTIhR008SiApMXQpMiEnNVJxICkzIUN6YnUgKTQhLElqICkuaCpzUCpxITg6QEJERUtNUlNVV1klXFxeYWQlZmhpIChUciljXSk1MSlSITxbY1EgKVMhUTM+QjogKVIhb3B7fSApUyE0V34gKVQpKVNbKVQhTE1GLCApU2ApVCE1K09AQyApU18pVCEoRFMgKmchcXIldnglfiAqaCEmJyU3OSV5IClVNSlUIXxhIClVIT9EIClUIVxcWW5jIClVISdJKjEgKVRvKVUhS05QLyApVjQpVWspViFBQyApVVopViE2NyApVSFYXFx4XyApV2QpViFqaCApVyEoWCApVmIpVyEqWzAnIClWfClXYClWTilXVilWUSlXdSlYIV8/XFwgKVlKKVghUHdERSApVyF8byApWDUpWSF3STB4IClabClZIXo9P1VTT29MZydaNyApWyFILC0gKVohY1Q4bnUgKVshMVogKVohaUhoIClbIW9zcl5YYmAgKVxcXipoIXp7JX4gKmkhJiclVFYlfiAqaiEmJykgKVxcIVY0RkNPbntrbXwgKV0hTldPbWkgKV4hKjkgKHshNztMSlxcbyApbCwqfmgpOzoofCFCTCAqTFxcKHxOKls8KlF2Kl8hR2RmdiAqYCYqXyF1encgKmArKl95KmAhPTxDXklFTlltbmVnfCAqYSEwMS9HN0E6IClCUCphIVNcXGFnYmogKS0hNDs6PCAofUAoZ1YofSFVXiAoeygofSFoayAqMUspLCFnZmogKjk7KSx5KydTKH1zKHUhTlBadndwICpqISorJUxOJX4gKmshJiclLjAlMiAodWQodj4odSF4a3EgKHYhRiYgKHV8KHYhSzJ5elF8V0xtICh3Jyh2fSh3IU1PLD4uWyAoeCkodyFlcFd9ICh4Nyo0cCh4IWxdOTwgKHkhJ1QgKHh0KHkhOz0gKHh6KHkhSUxaP09BRXIgKHohJyZCR1AgKHwhc3ogKHohanUgKHsqKHohYWNyICp+IT9BQkRJR0pLT1JUWlxcXWBiZSVnaWpsbW9xICouITk7PT9CQyAqayEzNCU6PCV+ICpsISYnJTogKi4hR0pYWiVcXGNlZmpucXV6eyAqLyEpLC8wMjNONzs8P0IlREhJTE1QUlNYWl1cXGBiJWhrJW5wJXR2ICkqaSlsfCkofClsOyphdClnIUhLaFxcWSApaDApZ3wpaDIpZyFxbXogKWghKilGOiAqeFxcKWgha0pIPyApZ3QpaCFTcCApaSEyYy4tMDg2NCAqbCE7PCVJSyV2eCV+ICptISYnJTdESUt6ICpuISktLjRAVXZ6ICloIXx7IClpIUlkX11hIClqJilpdSlqIS1LPS8wNjpNV1g/ViApaygpamkqdiF8fX4gKUQhMThDLU4gKUUxKUQhbE9YfSApRTMpRFopRSE0KjkgKUQhcFxcYSApRXwpRjwpRWQpRj0pRSF1PCApRj8pRSFlQWY/aSApRjMpRSFPRG4gKUZBKUVNKUYhMGVmIClHITo7KDwgKUZ3KUchPl0gKUZQKUchL0AgKUZ0KUdBKUYhc3F9fFxcIClINilHIWlOUW1FIClIQylKPSlIfSlJIUdIIClIeipvISg0PkRJTFZbYW91dnglfiAqcCEmKCVzIClJTClIcSlJITMpIClKJilIZClJOClKQClJYSlKLylJailKISxTOk9nRyApSVxcKUtCKUohVlcgKUtEKUohWDUySGp2IClLMSlKIXp8IClLIUonN0BVIClKZClLVilKXFwpS3UpTEwpS2MpTCE0NSApTSkpS2gpTCFhWyApTWQpTCFteFIgKU0hUj0gKUwhWkV1IClNIUBVVG1bbyApZiFKZSApUCE6O0A9S0xGU1RaYyAqXiFVV1slXV9gYmFjZGZoa2xucXUgKnAhdHUlfiAqcSEmJyU2O05WYmdqbW9yJXh6JXx+ICpyISYtJTA0NzlAREVHJUlMJVBSJVRWWVtcXGFjJWdpbiV6fSAqcyEmJyAqXiF3eHkgKl8hKSsgKlxcaik1ISczNzs+PUFASCAqN2ApayFFSlVlZ2kgKT4vKUAhNzg5U2IgKURXKUAhTF5JICleYClDNSlAIWZ9eiApQSYpQH4qMjwpQSFPRDE/RlFHZ3R8IClCIT40VXJzfSApQycqWCEyMzY7PUBFRkhJR01VWSAqTiFBRCVGSCVLIClkITNkICljeylkISs0Q0RJUFJUVyApN3IpOEMpOWgqcyEpKy4lMDIzNzg6JUNFJUxOT1FSVFVXWFxcX2BlZ2htbnBxcyV8fiAqdCEmJyUrLyUyNCU2ODk8PiVBQ0ZHSU4lUFQlVlhZWyVfYWNkICk7RSk9LCoyOilRIUpTXVVZZWdmbXV4JXogKVIhKDArMTkgKT4hMFBmICljIWtwdE4gKkRWKGAwKjMhfHlwICo0QClDSCo0IUE1LzE4O2slbl9GSF1RWyApQ04qNCFhb3V4cSAqNSE4OSAqNHYqNScpQ1MqNT0qVWUqNSFhSVdDXXN3fiAqNiFGKyxDMjtOTz85IChxfih4dyo2IVpUYyApWW0qNiF1fCAqN0UpQ2QqNyFDNCAqdCFlZiVtb3Byc3V3JXt+ICp1ISYnKColPD9AQkNFR0hKTk9RJVNVJV1gYiVmaCVvcSV1d3kle34gKnYhJygpKyUvICo3Oio2eClPITZJS1VYayAqeSFYWVpcXGBhIClQbCksfSlQeypObSk/MiszPSk/ITVeaGZlbnB0eCApXiFbd3F4IClfIT1COS0zakwgKWAhOTw/WFogKWEhQyw4IClgbilhQilgcylhIUhKaCApYiEqLCApYSF4cCApYiFXS15wICljITtGICleRylgQSlhNiliMCk1IVpZX2RlICl3IWVqcHMgKXghLC0gKXd9KXghKzMoMUA4S1Zba3ggKXkrKS4hXFxbICp2ITAxMzQ2JTw+QEJDRUcld3ogKnchJyglKy0wJUcgKS9uKTAhNjNAICkvcykwITI8ICkxKykyIS00ICkzISt3ayApNCFARnsgKjMhXVxcIClTQSlUSylXRil0ISstNT5MTUYgKT9NKXQhYlFSbiVwVHFaYVheICl1ISpJMjMgKXRbKXUsKXR8KXUhKEZ3b3ZjeH0gKXYhJjU8KFdcXExvdSApdy8pdncpdyE9TkheICs0LisyIT5AQSApcSExRE05R0haYlltZnV4IClyITc4LipBTyAqdyFISSV+ICp4ISYnJU4gKXIhSUxmdGRnc3ggKXMhLS4+Q0sgKWwhNz1LSEVYb3YgKW0nKjAhQElHICpPaSowIVBcXFlhaWYgKXAhZn4gKklpKm0hODk6Pj0/QEJDR0pITSVPVldeXWBfYmNlZ2klbW9wcnd7JX4gKm4hJicoKiUsLyUxMzI1OCU6PD4/QUJEICp4IU9QJVRrbnJ1eSAqeSEqLyVUVldbXV5iJWRnJW1wJX4gKnohJiclNSAqbiFDRUhJTSVPUVNWV1ldXFxgYWNkZyVpbCVwcnV3JXl8ICpvISssKi0yMzU3JTk9P0BDNkUlR0pNT1BTJVVXJVpcXF9gXmJjZSVtcHIldDsgKXMhdXogKnNmKXkhTWVbY34gKSdBKXkhe3ogKXohPTMgKnohNjclOjw9PyVbXSV+ICp7ISYnKCslNzk7SE1OUFNXWF4gKXohWFZwICsxbSp7eil7NilveilwIScsMj0gKWshNDYgKWwpKy8hcHJ4JXwgKzAhKSgtLy4wMTU4OTs9JUBCQ0VITE5RJVNVWl0lY2hkaiApbSE2ODpEQVBHV1hcXGhVVGdmenEgKW4hLjMxLzYyTjxHSltLUFdiVXBjYGQgKnshYWNvJXl7fH4gKnwhJicldSApbmYpby4pbiFtayApbzIpbiF4eyApbyExJzUwIClufilvIT9QRk5IXWEgKjFZKXxTKXshPj9GTE5bbGZybnN5ICpKIUJHUFtdYCAqSyEnSzxBTmdTaGp2ICpMIUYoICpLbSpMKipLdSpMIU1FP0c2YFdibSAqTSE5TiApbS8qNGkpcCFLTSApc2oqMiFISkxSVlhbJV1fXmdBa3l8ICozISovRk4gKk1WKnghWGBjICp8IXZ3JX4gKn0hJiclfCAqeCFpbG1vdHp7fiAqeSEmKCksLSAqRCFBSGBic25wbyAqRSFDKCZHOEI+RS5EUV9QaUtVTEpkak8gKkYhKzM0LzUgKkVrKkZVKkV5KkY2KkUhenNsICpGIUVJOkpMT0tlfWBncFxcICpHIScxICpGIXZza3kgKkchKGsgKkZkKkchZmdkSVk1V3Q8TGVNQk58ICpIIT84YiAqfSF9fiAqfiEmJyU1PE1TV1heX2NwcyV5fCV+ICsmISYqLC4lMDQ1NyU7PiVBQ0UlSEolT1FTJVZYJVtdX2ElaWttJXN1JXcgKkhWKkchcW4gKkghPScgKkdsKkghO3U8RUNbY01hUFprenB+ICpJIU1KNUFSWHBzICovdyowISosLSAqODApfCFnanVwcSApfSkpfHcpfT8pfHwpfSFbTD4tQkU0OThHUjJsblkgKX4wKX0hYHF0ICl+ISk2ICl9dil+IS0sS2Fic2dYY0BlV11mbyAqJjMpfnwqJiEuPzxHSExuYF5xeG0gKyYheHolfiArJyEmKCUqLCU2OCU6PCVGSElLJVJVJVheYiVkZmhqa20lfiArKCEmJyU6IConISgzL0FKSSAqNyF3ent9ZSAqSXsqOCFBQkNNT0hLWFtTVF5kaWtveiAqOSEmLyAqSiFcXGNmICpLIV1kICpNMSoxISwuNj4/QSAqKCwpPkQqKCFBTUxOUmJsbXF3fH14dSAqKSEuPyAqOTUpQj8qMSFOXWR0cHV4fSAqMikqKU8qKnUqKyFLUyAqLToqLjUrMSFWUiAqWHMqWSErOzhYICpYIWdtICpVIVJUICpjIXd9e3wgKmQ4KyghOzwlfiArKSEmJyVBICpkITY1RD1DUVJGSE1gWWRhZXZ3fiAqZSEoKSowLzUgKlVgKzB1KllfKlohOVMgKlshTl4gKlkhXFxmY2FrfX4gKlohKCwgKlkhdXYgKlopKlltKlohOkVGMUdJMldLYmttenxxfSAqWyEvNS4qMiY+NjdGRz9la3FkaXogKlxcISswLDg6ICpWISo0PDdKRiApPz0qTiFQWFRWICspIUJDJX4gKyohJiclSCAqTiFfZWkgKk9fKlI8KnU+KnQhLTczSkVMU1JucXQgKnUpKzMhbG9xJXZ4ICsyIUNQUiAqcyFWWVprbyApc00qc30qZyFXdyAqaDgqaVUqaigqay8qak0qbCFKdyArKyEzNjklPCApekIrKyE/QkQlRkhJTk9SJVdZJV1fYWJkJWtuJXF4JXt+ICssJisqIUlKJX4gKyshJiclLzEyNDc4PT5AQ0dKJU1RXmBjbXIldnx9ICssISwtNTY7PCclKy4lMDIlNDc4Oj0gKnUhZ3B8fSAqdiEmQT01REYgKn4he3ogKyYoKzBPKyYhJystMjE2Mzw9QiArJyFdW19hYGVpICp5byp6ITtcXCAqeyEqKSArJiFQUldgXFxsXmp5ICsnIScrNzsgKzEhW1xcICotLiswIXl+ICsxISYpMCAqazsrMSE7PXkle359ICsyIScuLCovNGdxdH58ICszISkqMCArLCE+PyV+ICstISYnJX4gKy4hJiclfiArLyEmJyVudHd+ICswIScrMjM3REdJJUtNUFRWJVlcXGVmaWsldHd4eiV9ICsxIScoKiUvMiU6PD4lQ0UlUVMlVVdYWl0lYWMlZmglam5wcXMldXd4fCArMiEmKCkrLTAlMzUlPT9CRCVPUVRWV1klW11fJWRmaCVwcnN1JXt9ICszISYoKyUvMSU7PiVqbW55JX4gKzQhJiclKy8lMTQlOCAuKmYuKyFadiAuLCFveSAuLSE7PCU+QEJDR04lUFJTViVYIC1SIVhZJX4gLVMhJiclTiIKICAgICAgICApCiAgICAgICk7CiAgICAgIHZhciBnYmsgPSBzcmMoZ2JrX3VzKTsKICAgICAgcmV0dXJuIGdiazsKICAgIH0pKCk7CgogICAgdmFyIGdia19idWlsZCA9IEdCSyQxOwoKICAgIHJldHVybiBnYmtfYnVpbGQ7CiAgfQp9KSgpOwo="},{"name":"DZ回复可见助手","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["*forum.php?mod=viewthread&tid=*","*forum.php?mod=post&action=reply*replysubmit=yes","*viewthread.php?tid=*","*thread*.html"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1592877358772,"data":{}},"enabled":true,"position":5,"file_url":"https://greasyfork.org/scripts/25941-dz%E5%9B%9E%E5%A4%8D%E5%8F%AF%E8%A7%81%E5%8A%A9%E6%89%8B/code/DZ%E5%9B%9E%E5%A4%8D%E5%8F%AF%E8%A7%81%E5%8A%A9%E6%89%8B.user.js","uuid":"253b0c50-ecac-43dc-aa03-6c5141cb6da6","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIERa5Zue5aSN5Y+v6KeB5Yqp5omLCi8vIEBuYW1lc3BhY2UgICB3ZHNzbXEKLy8gQGRlc2NyaXB0aW9uIOeugOWMluiuuuWdm+S4reeahOWbnuWkjeWPr+ingeaTjeS9nO+8iFFR576k77yaMTg5NTc0Njgz77yJCi8vIEBsaW5rICAgICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMjU5NDEKLy8gQHZlcnNpb24gICAgIDEuMy4yCi8vIEBpbmNsdWRlICAgICAqZm9ydW0ucGhwP21vZD12aWV3dGhyZWFkJnRpZD0qCi8vIEBpbmNsdWRlICAgICAqZm9ydW0ucGhwP21vZD1wb3N0JmFjdGlvbj1yZXBseSpyZXBseXN1Ym1pdD15ZXMKLy8gQGluY2x1ZGUgICAgICp2aWV3dGhyZWFkLnBocD90aWQ9KgovLyBAaW5jbHVkZSAgICAgKnRocmVhZCouaHRtbAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KKGZ1bmN0aW9uICgpIHsKICB2YXIgbGFzU2Nyb2xsSGVpZ2h0ID0gMCwKICBjb29OYW1lID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC86L2csICIiKSwKICBjb29WYWx1ZSA9IHBhcnNlSW50KGdldGNvb2tpZShjb29OYW1lKSkgfHwgMDsKICAvLyBjb29WYWx1ZSA9IDA7CgogIC8vZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtmbk1haW4oMSk7fSwgdHJ1ZSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmbk1haW4sIHRydWUpOwogIC8vZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLGZ1bmN0aW9uKGUpIHsKICAvL2NvbnNvbGUubG9nKCJyZW1vdmUiLGUudGFyZ2V0KTsKICAvL30pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU5vZGVJbnNlcnRlZCIsIGZ1bmN0aW9uIChlKSB7CiAgICBjb25zb2xlLmxvZygiaW5zZXJ0IiwgZS50YXJnZXQuaW5uZXJIVE1MKTsKICAgIGlmICgvc2hvd2hpZGV85pys5biW6ZqQ6JeP55qE5YaF5a65Ly50ZXN0KGUudGFyZ2V0LmlubmVySFRNTCkpIHsKICAgICAgZm5FbmQoKTsKICAgIH0KICB9KTsKICBmdW5jdGlvbiBmbkVuZCgpIHsKICAgIGlmICghZm5WaWV3RWwoJG4oJy5zaG93aGlkZScpLCAwKSkgewogICAgICBmblZpZXdFbCgkbignLnNob3doaWRlJyksIDApOwogICAgfQogICAgaWYgKCRuKCcuc2hvd2hpZGUgYScpKSB7CiAgICAgIHZhciBkb21BID0gJG4oJy5zaG93aGlkZSBhJyk7CiAgICAgIGlmICgkbigiLnNob3doaWRlIHNwYW4gYSIpKSB7CiAgICAgICAgZG9tQSA9ICRuKCIuc2hvd2hpZGUgc3BhbiBhIik7CiAgICAgIH0KICAgICAgaWYgKCRuKCIuc2hvd2hpZGUgLmRvd25sb2FkLWNvbiBhIikpIHsKICAgICAgICBkb21BID0gJG4oIi5zaG93aGlkZSAuZG93bmxvYWQtY29uIGEiKTsKICAgICAgfQogICAgICB2YXIgbGluayA9IGRvbUEuaHJlZjsKICAgICAgaWYgKGRvbUEub25jbGljaykgewogICAgICAgIHNob3dXaW5kb3coJ2F0dGFjaHBheScsIGxpbmspOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChsaW5rLmluZGV4T2YoImF0dGFjaG1lbnQiKSA+IC0xKSB7CiAgICAgICAgICBsaW5rICs9ICImaXNkb3duPTEiOwogICAgICAgICAgZG9tQS5ocmVmID0gbGluazsKICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmspOwogICAgICAgIH0KICAgICAgICB3aW5kb3cub3BlbihsaW5rKTsKICAgICAgfQogICAgfQogICAgaWYgKCRuKCcuc2hvd2hpZGUnKSAmJiAkbignI3RocmVhZHRpdGxlIGgxJykpIHsKICAgICAgdmFyIHRpdGxlID0gJG4oJyN0aHJlYWR0aXRsZSBoMScpOwogICAgICB2YXIgbmV3bmFtZSA9IHRleHQodGl0bGUpOwogICAgICBuZXduYW1lID0gbmV3bmFtZS5yZXBsYWNlKC9ccy0uKyQvZywgJycpOwogICAgICBuZXduYW1lID0gbmV3bmFtZS5yZXBsYWNlKC9cLi4rKFwuXGR7NH0pL2csICckMScpOwogICAgICB2YXIgZWQyayA9ICRuKCIuc21hbGx0ZXh0anVzZSBhIikuaHJlZjsKICAgICAgZWQyayA9IGVkMmsucmVwbGFjZSgvJVteJV17Mn1cLj8vZywgJycpOwogICAgICAkbmEoIi5zaG93aGlkZSIpWzBdLmlubmVySFRNTCA9ICRuYSgiLnNob3doaWRlIilbMF0uaW5uZXJIVE1MLnJlcGxhY2UoLzxcL2g0Pi8sICI8L2g0PiIgKyBuZXduYW1lICsgIjxiciAvPiIgKyBlZDJrICsgIjxiciAvPiIpOwogICAgICAkbignI2lucC1xdWVyeScpLnZhbHVlID0gbmV3bmFtZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZm5NYWluKCkgewogICAgaWYgKCRuKCcubG9ja2VkJykgJiYgISRuKCcuc2hvd2hpZGUnKSkgewogICAgICBpZiAoY29vVmFsdWUgPCA1KQogICAgICAgIHNldFRpbWVvdXQoZm5NYWluLCA0NjcpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAobGFzU2Nyb2xsSGVpZ2h0ICE9PSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCAmJiBjb29WYWx1ZSAhPT0gMCkgewogICAgICAgIGxhc1Njcm9sbEhlaWdodCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0OwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb29WYWx1ZSsrOwogICAgICBjb25zb2xlLmxvZyhjb29WYWx1ZSk7CiAgICAgIHNldGNvb2tpZShjb29OYW1lLCBjb29WYWx1ZSwgMzYwMCk7CiAgICAgIGlmICgkbignLmxvY2tlZCBhJykpIHsKICAgICAgICB2YXIgYXJ5RG9tQSA9ICRuYSgnLmxvY2tlZCBhJyksCiAgICAgICAgZG9tQSA9ICRuKCcubG9ja2VkIGEnKSwKICAgICAgICBsaW5rID0gJG4oJy5sb2NrZWQgYScpLmhyZWY7CiAgICAgICAgYXJ5RG9tQS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgewogICAgICAgICAgaWYgKGVsLmlubmVySFRNTC5pbmRleE9mKCLlm57lpI0iKSA+IC0xKSB7CiAgICAgICAgICAgIGRvbUEgPSBlbDsKICAgICAgICAgICAgbGluayA9IGVsLmhyZWY7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBmblZpZXdFbChkb21BLCAwKTsKICAgICAgICB9LCAxMDAwKTsKICAgICAgICBpZiAoY29vVmFsdWUgPiAxKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGRvbUEuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKGRvbUEub25jbGljaykgewogICAgICAgICAgICAvLyBzaG93V2luZG93KCdhdHRhY2hwYXknLCBsaW5rKTsKICAgICAgICAgICAgc2hvd1dpbmRvdygncmVwbHknLCBsaW5rKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgJG4oInRleHRhcmVhIikuaW5uZXJIVE1MID0gIuaEn+iwouWIhuS6q++8gSI7CiAgICAgICAgICAgIH0sIDcwMCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBmbkVuZCgpOwogIH0KICBmdW5jdGlvbiBmblZpZXdFbChlbCwgbikgewogICAgLy8gY29uc29sZS5sb2cobik7CiAgICBpZiAoZWwpIHsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IG47CiAgICAgIGlmICghZm5Jc0VsSW5WaWV3cG9ydChlbCkpIHsKICAgICAgICAvLyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gbjsKICAgICAgICBuICs9IDUwOwogICAgICAgIHJldHVybiBmblZpZXdFbChlbCwgbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IG4gKyAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIC8gMzsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiBmbklzRWxJblZpZXdwb3J0KGVsKSB7CiAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgcmV0dXJuIChyZWN0LnRvcCA+PSAwICYmIHJlY3QubGVmdCA+PSAwICYmIHJlY3QuYm90dG9tIDw9ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkgJiYgLypvciAkKHdpbmRvdykuaGVpZ2h0KCkgKi8KICAgICAgcmVjdC5yaWdodCA8PSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSAvKm9yICQod2luZG93KS53aWR0aCgpICovKTsKICB9CiAgZnVuY3Rpb24gdGV4dChlKSB7CiAgICB2YXIgdCA9ICcnOwogICAgLy/lpoLmnpzkvKDpgJLnmoTmmK/lhYPntKDvvIzliJnlj5blhbblrZDlhYPntKDvvIwKICAgIC8v5ZCm5YiZ5YGH5a6a5a6D5piv5LiA5Liq5pWw57uECiAgICBlID0gZS5jaGlsZE5vZGVzIHx8IGU7CiAgICAvL+ajgOafpeaJgOacieWtkOiKgueCuQogICAgZm9yICh2YXIgaiA9IDA7IGogPCBlLmxlbmd0aDsgaisrKSB7CiAgICAgIC8v5aaC5p6c5a6D5LiN5piv5LiA5Liq5YWD57Sg77yM6L+95Yqg5YW25paH5pys5Yiw6L+U5Zue5YC8CiAgICAgIC8v5ZCm5YiZ77yM5a+55YW25omA5pyJ5a2Q5YWD57Sg6YCS5b2S5aSE55CGCiAgICAgIHQgKz0gZVtqXS5ub2RlVHlwZSAhPSAxID8KICAgICAgZVtqXS5ub2RlVmFsdWUgOiB0ZXh0KGVbal0uY2hpbGROb2Rlcyk7CiAgICB9CiAgICAvL+i/lOWbnuaJgOW+l+eahOaWh+acrAogICAgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uICRuKGUpIHsKICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpOwogIH0KICBmdW5jdGlvbiAkbmEoZSkgewogICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSk7CiAgfQp9KSgpOwo="},{"name":"百度网盘直链极速下载助手","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["baidu.com","baidupcs.com","baiduyun.wiki","localhost","*"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://pan.baidu.com/disk/home*","*://yun.baidu.com/disk/home*","*://pan.baidu.com/s/*","*://yun.baidu.com/s/*","*://pan.baidu.com/share/*","*://yun.baidu.com/share/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1599018175643,"data":{}},"enabled":true,"position":6,"file_url":"https://greasyfork.org/scripts/409883-%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%9B%B4%E9%93%BE%E6%9E%81%E9%80%9F%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B/code/%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%9B%B4%E9%93%BE%E6%9E%81%E9%80%9F%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B.user.js","uuid":"be806ff5-9456-4440-a123-394f85e8b6a7","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOeZvuW6pue9keebmOebtOmTvuaegemAn+S4i+i9veWKqeaJiwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAdmVyc2lvbiAgICAgICAgICAgNC4yLjEKLy8gQGljb24gICAgICAgICAgICAgIGh0dHBzOi8vd3d3LmJhaWR1eXVuLndpa2kvNDh4NDgucG5nCi8vIEBpY29uICAgICAgICAgICAgICDmnKzohJrmnKzlj6rmmK/ovazovb3vvIzmnKzkurrlubbpnZ7ljp/kvZzogIXjgILljp/kvZzogIXkuLrvvJrnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvvvIznvZHnq5nlnLDlnYDkuLrvvJpodHRwczovL3d3dy5iYWlkdXl1bi53aWtpL3poLWNuL2Fzc2lzdGFudC5odG1s77yM5aaC5pyJ6ZyA6KaB6K+35YmN5b6A5L2c6ICF572R56uZ5Y+C6ICD6K+m57uG5L+h5oGv44CC44CQ5Y6f6aG555uu5L2/55So55qE5pivIEFHUEwg5byA5rqQ5o6I5p2D5Y2P6K6u5LiU5Y6f5L2c6ICF5L+d55WZ5omA5pyJ5p2D5Yip44CRCi8vIEBkZXNjcmlwdGlvbiAgICAgICDkvaDmnInlpJrkuYXmsqHop4Hov4c1ME0vc+eahOS4i+i9vemAn+W6puS6hu+8n+atpOiEmuacrOS4gOWFseacieS4ieenjeS4i+i9veaooeW8j++8jOavj+S4gOenjemDveiDvee7meS9oOacgOecn+WunuacgOaBkOaAlueahOS4i+i9vemAn+W6puS9k+mqjOOAguaUr+aMgVdpbmRvd3PvvIxNYWPvvIxMaW51eO+8jEFuZHJvaWTnrYnlpJrlubPlj7DvvIzlj6/kvb/nlKhJRE3vvIxYRG93buetieWkmue6v+eoi+WKoOmAn+W3peWFt+WKoOmAn+S4i+i9ve+8jOaUr+aMgVJQQ+WNj+iurui/nOeoi+S4i+i9veOAggovLyBAbGljZW5zZSAgICAgICAgICAgQUdQTAovLyBAc3VwcG9ydFVSTCAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vZGlzay9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vZGlzay9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQHJlcXVpcmUgICAgICAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vanF1ZXJ5QDMuMi4xL2Rpc3QvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9zd2VldGFsZXJ0MkA5Ci8vIEBjb25uZWN0ICAgICAgICAgICBiYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGJhaWR1cGNzLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYmFpZHV5dW4ud2lraQovLyBAY29ubmVjdCAgICAgICAgICAgbG9jYWxob3N0Ci8vIEBjb25uZWN0ICAgICAgICAgICAqCi8vIEBydW4tYXQgICAgICAgICAgICBkb2N1bWVudC1pZGxlCi8vIEBncmFudCAgICAgICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZG93bmxvYWQKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2luZm8KLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gPT0vVXNlclNjcmlwdD09Cgo7KCgpID0+IHsKICAgICd1c2Ugc3RyaWN0JwogICAgY29uc3QgdmVyc2lvbiA9IEdNX2luZm8uc2NyaXB0LnZlcnNpb24KICAgIGNvbnN0IGhvc3RuYW1lID0gbG9jYXRpb24uaG9zdG5hbWUKICAgIGNvbnN0IGNsYXNzTWFwID0gewogICAgICAgICdiYXItc2VhcmNoJzogJ09GYVBhTycsCiAgICAgICAgJ2xpc3QtdG9vbHMnOiAndGN1TEF1JywKICAgICAgICAnaGVhZGVyJzogJ3Z5UUhOeWInCiAgICB9CiAgICBjb25zdCBlcnJvck1zZyA9IHsKICAgICAgICAnZGlyJzogJ+aPkOekuu+8muS4jeaUr+aMgeaVtOS4quaWh+S7tuWkueS4i+i9ve+8jOWPr+i/m+WFpeaWh+S7tuWkueWGheiOt+WPluaWh+S7tumTvuaOpeS4i+i9ve+8gScsCiAgICAgICAgJ3VubG9naW4nOiAn5o+Q56S677ya55m75b2V572R55uY5ZCO5omN6IO95L2/55So5q2k5Yqf6IO95ZOm77yBJywKICAgICAgICAnZmFpbCc6ICfmj5DnpLrvvJrojrflj5bkuIvovb3pk77mjqXlpLHotKXvvIHor7fliLfmlrDnvZHpobXlkI7ph43or5XvvIEnLAogICAgICAgICd1bnNlbGVjdGVkJzogJ+aPkOekuu+8muivt+WFiOmAieaLqeimgeS4i+i9veeahOaWh+S7tu+8gScsCiAgICAgICAgJ21vcmV0aGFuJzogJ+aPkOekuu+8muWkmuS4quaWh+S7tuivt+eCueWHu+OAkOaYvuekuumTvuaOpeOAke+8gScsCiAgICAgICAgJ3Rvb2JpZyc6ICfmj5DnpLrvvJrlj6rmlK/mjIEzMDBN5Lul5LiL55qE5paH5Lu25aS577yM6Iul6ZO+5o6l5peg5rOV5LiL6L2977yM6K+36L+b5YWl5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu26I635Y+W77yBJywKICAgICAgICAndGltZW91dCc6ICfmj5DnpLrvvJrpobXpnaLov4fmnJ/vvIzor7fliLfmlrDph43or5XvvIEnLAogICAgICAgICd3cm9uZ2NvZGUnOiAn5o+Q56S677ya6I635Y+W6aqM6K+B56CB5aSx6LSl77yBJywKICAgICAgICAnZGVsZXRlZCc6ICfmj5DnpLrvvJrmlofku7bkuI3lrZjlnKjmiJblt7Looqvnmb7luqblkozosJDvvIzml6Dms5XkuIvovb3vvIEnLAogICAgfQogICAgbGV0IGRlZmF1bHRDb2RlID0gMjUwNTI4CiAgICBsZXQgc2VjcmV0Q29kZSA9IGdldFZhbHVlKCdzZWNyZXRDb2RlVicpID8gZ2V0VmFsdWUoJ3NlY3JldENvZGVWJykgOiBkZWZhdWx0Q29kZQogICAgbGV0IGlkcyA9IFtdCiAgICBsZXQgdXNlckFnZW50ID0gJycKICAgIGxldCBudW1iZXIgPSBbJycsICfikaAnLCAn4pGhJywgJ+KRoicsICfikaMnLCAn4pGkJywgJ+KRpScsICfikaYnLCAn4pGnJywgJ+KRqCddCiAgICBsZXQgVG9hc3QgPSBTd2FsLm1peGluKHsKICAgICAgICB0b2FzdDogdHJ1ZSwKICAgICAgICBwb3NpdGlvbjogJ3RvcCcsCiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgIHRpbWVyOiAzMDAwLAogICAgICAgIHRpbWVyUHJvZ3Jlc3NCYXI6IGZhbHNlLAogICAgICAgIG9uT3BlbjogKHRvYXN0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBTd2FsLnN0b3BUaW1lcikKICAgICAgICAgICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIFN3YWwucmVzdW1lVGltZXIpCiAgICAgICAgfQogICAgfSkKICAgIGxldCBhcmlhUlBDID0gewogICAgICAgIGRvbWFpbjogZ2V0VmFsdWUoJ3JwY0RvbWFpbicpIHx8ICdodHRwOi8vbG9jYWxob3N0JywKICAgICAgICBwb3J0OiBnZXRWYWx1ZSgncnBjUG9ydCcpIHx8IDY4MDAsCiAgICAgICAgdG9rZW46IGdldFZhbHVlKCdycGNUb2tlbicpIHx8ICcnLAogICAgICAgIGRpcjogZ2V0VmFsdWUoJ3JwY0RpcicpIHx8ICdEOi8nLAogICAgfQoKICAgIGZ1bmN0aW9uIGNsb2coYzEsIGMyLCBjMykgewogICAgICAgIGMxID0gYzEgPyBjMSA6ICcnCiAgICAgICAgYzIgPSBjMiA/IGMyIDogJycKICAgICAgICBjMyA9IGMzID8gYzMgOiAnJwogICAgICAgIGNvbnNvbGUuZ3JvdXAoJ1vnvZHnm5jnm7Tpk77kuIvovb3liqnmiYtdJykKICAgICAgICBjb25zb2xlLmxvZyhjMSwgYzIsIGMzKQogICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKQogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJEVVNTKCkgewogICAgICAgIGxldCBiYWlkdXl1blBsdWdpbl9CRFVTUyA9IGdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgPyBnZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpIDogJ3siYmFpZHV5dW5QbHVnaW5fQkRVU1MiOiIifScKICAgICAgICBsZXQgQkRVU1MgPSBKU09OLnBhcnNlKGJhaWR1eXVuUGx1Z2luX0JEVVNTKS5CRFVTUwogICAgICAgIGlmICghQkRVU1MpIHsKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICB0aXRsZTogJ+aPkOekuicsCiAgICAgICAgICAgICAgICBodG1sOiAnQXJpYemTvuaOpeiOt+WPlumcgOimgemFjeWQiDxhIGhyZWY9Imh0dHA6Ly9kd3ouZGF0ZS9jZ3h4IiB0YXJnZXQ9Il9ibGFuayI+44CQ572R55uY5LiH6IO95Yqp5omL44CR5L2/55SoPC9hPicsCiAgICAgICAgICAgICAgICBmb290ZXI6ICfjgJDnvZHnm5jkuIfog73liqnmiYvjgJHmmK/lop7lvLrmianlsZXmj5Lku7bvvIzlronoo4XlkI7or7fliLfmlrAnLAogICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICflronoo4UnCiAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYignaHR0cDovL2R3ei5kYXRlL2NneHgnLCB7YWN0aXZlOiB0cnVlfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEJEVVNTCiAgICB9CgogICAgZnVuY3Rpb24gYXJpYTJjKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgIGxldCBCRFVTUyA9IGdldEJEVVNTKCkKICAgICAgICB1YSA9IHVhIHx8IHVzZXJBZ2VudAogICAgICAgIGlmIChCRFVTUykgewogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSIgLS1oZWFkZXIgIlVzZXItQWdlbnQ6ICR7dWF9IiAtLWhlYWRlciAiQ29va2llOiBCRFVTUz0ke0JEVVNTfSJgKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAn6K+35YWI5a6J6KOF572R55uY5LiH6IO95Yqp5omL77yM5a6J6KOF5ZCO6K+36YeN5ZCv5rWP6KeI5Zmo77yB77yB77yBJwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXBsYWNlTGluayhsaW5rKSB7CiAgICAgICAgcmV0dXJuIGxpbmsgPyBsaW5rLnJlcGxhY2UoLyYvZywgJyZhbXA7JykgOiAnJwogICAgfQoKICAgIGZ1bmN0aW9uIGRldGVjdFBhZ2UoKSB7CiAgICAgICAgbGV0IHJlZ3ggPSAvW1wvXS4rW1wvXS9nCiAgICAgICAgbGV0IHBhZ2UgPSBsb2NhdGlvbi5wYXRobmFtZS5tYXRjaChyZWd4KQogICAgICAgIHJldHVybiBwYWdlWzBdLnJlcGxhY2UoL1wvL2csICcnKQogICAgfQoKICAgIGZ1bmN0aW9uIGdldENvb2tpZShlKSB7CiAgICAgICAgbGV0IG8sIHQKICAgICAgICBsZXQgbiA9IGRvY3VtZW50LCBjID0gZGVjb2RlVVJJCiAgICAgICAgcmV0dXJuIG4uY29va2llLmxlbmd0aCA+IDAgJiYgKG8gPSBuLmNvb2tpZS5pbmRleE9mKGUgKyAiPSIpLCAtMSAhPSBvKSA/IChvID0gbyArIGUubGVuZ3RoICsgMSwgdCA9IG4uY29va2llLmluZGV4T2YoIjsiLCBvKSwgLTEgPT0gdCAmJiAodCA9IG4uY29va2llLmxlbmd0aCksIGMobi5jb29raWUuc3Vic3RyaW5nKG8sIHQpKSkgOiAiIgogICAgfQoKICAgIGZ1bmN0aW9uIHNldENvb2tpZShrZXksIHZhbHVlLCB0KSB7CiAgICAgICAgbGV0IG9EYXRlID0gbmV3IERhdGUoKSAgLy/liJvlu7rml6XmnJ/lr7nosaEKICAgICAgICBvRGF0ZS5zZXRUaW1lKG9EYXRlLmdldFRpbWUoKSArIHQgKiA2MCAqIDEwMDApIC8v6K6+572u6L+H5pyf5pe26Ze0CiAgICAgICAgZG9jdW1lbnQuY29va2llID0ga2V5ICsgJz0nICsgdmFsdWUgKyAnO2V4cGlyZXM9JyArIG9EYXRlLnRvR01UU3RyaW5nKCkgIC8v6K6+572uY29va2ll55qE5ZCN56ew77yM5pWw5YC877yM6L+H5pyf5pe26Ze0CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0VmFsdWUobmFtZSkgewogICAgICAgIHJldHVybiBHTV9nZXRWYWx1ZShuYW1lKQogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgR01fc2V0VmFsdWUobmFtZSwgdmFsdWUpCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3RvcmFnZShrZXkpIHsKICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgfQoKICAgIGZ1bmN0aW9uIHNldFN0b3JhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKQogICAgfQoKICAgIGZ1bmN0aW9uIGdldExvZ0lEKCkgewogICAgICAgIGxldCBuYW1lID0gIkJBSURVSUQiCiAgICAgICAgbGV0IHUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL37vvIFAI++/pSXigKbigKYmIgogICAgICAgIGxldCBkID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2cKICAgICAgICBsZXQgZiA9IFN0cmluZy5mcm9tQ2hhckNvZGUKCiAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgIGxldCBuID0gZS5jaGFyQ29kZUF0KDApCiAgICAgICAgICAgICAgICByZXR1cm4gMTI4ID4gbiA/IGUgOiAyMDQ4ID4gbiA/IGYoMTkyIHwgbiA+Pj4gNikgKyBmKDEyOCB8IDYzICYgbikgOiBmKDIyNCB8IG4gPj4+IDEyICYgMTUpICsgZigxMjggfCBuID4+PiA2ICYgNjMpICsgZigxMjggfCA2MyAmIG4pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG4gPSA2NTUzNiArIDEwMjQgKiAoZS5jaGFyQ29kZUF0KDApIC0gNTUyOTYpICsgKGUuY2hhckNvZGVBdCgxKSAtIDU2MzIwKQogICAgICAgICAgICByZXR1cm4gZigyNDAgfCBuID4+PiAxOCAmIDcpICsgZigxMjggfCBuID4+PiAxMiAmIDYzKSArIGYoMTI4IHwgbiA+Pj4gNiAmIDYzKSArIGYoMTI4IHwgNjMgJiBuKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgIHJldHVybiAoZSArICIiICsgTWF0aC5yYW5kb20oKSkucmVwbGFjZShkLCBsKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbShlKSB7CiAgICAgICAgICAgIGxldCBuID0gWzAsIDIsIDFdW2UubGVuZ3RoICUgM10KICAgICAgICAgICAgbGV0IHQgPSBlLmNoYXJDb2RlQXQoMCkgPDwgMTYgfCAoZS5sZW5ndGggPiAxID8gZS5jaGFyQ29kZUF0KDEpIDogMCkgPDwgOCB8IChlLmxlbmd0aCA+IDIgPyBlLmNoYXJDb2RlQXQoMikgOiAwKQogICAgICAgICAgICBsZXQgbyA9IFt1LmNoYXJBdCh0ID4+PiAxOCksIHUuY2hhckF0KHQgPj4+IDEyICYgNjMpLCBuID49IDIgPyAiPSIgOiB1LmNoYXJBdCh0ID4+PiA2ICYgNjMpLCBuID49IDEgPyAiPSIgOiB1LmNoYXJBdCg2MyAmIHQpXQogICAgICAgICAgICByZXR1cm4gby5qb2luKCIiKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL1tcc1xTXXsxLDN9L2csIG0pCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICByZXR1cm4gaChnKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdyhlLCBuKSB7CiAgICAgICAgICAgIHJldHVybiBuID8gcChTdHJpbmcoZSkpLnJlcGxhY2UoL1srXC9dL2csIChlKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gIisiID09IGUgPyAiLSIgOiAiXyIKICAgICAgICAgICAgfSkucmVwbGFjZSgvPS9nLCAiIikgOiBwKFN0cmluZyhlKSkKICAgICAgICB9CgogICAgICAgIHJldHVybiB3KGdldENvb2tpZShuYW1lKSkKICAgIH0KCiAgICBmdW5jdGlvbiBycGNTZXR0aW5nKCkgewogICAgICAgIGxldCBkb20gPSAnJwogICAgICAgIGRvbSArPSAnPGRpdiBjbGFzcz0iZmxleC1jZW50ZXItYmV0d2VlbiI+PGxhYmVsIGZvcj0icnBjRG9tYWluIiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiA1cHg7ZmxleDogMCAwIDEwMHB4OyI+5Li75py677yaPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InJwY0RvbWFpbiIgdmFsdWU9IicgKyBhcmlhUlBDLmRvbWFpbiArICciIGNsYXNzPSJzd2FsMi1pbnB1dCIgcGxhY2Vob2xkZXI9Imh0dHA6Ly9sb2NhbGhvc3QiPjwvZGl2PicKICAgICAgICBkb20gKz0gJzxkaXYgY2xhc3M9ImZsZXgtY2VudGVyLWJldHdlZW4iPjxsYWJlbCBmb3I9InJwY1BvcnQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDVweDtmbGV4OiAwIDAgMTAwcHg7Ij7nq6/lj6PvvJo8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icnBjUG9ydCIgdmFsdWU9IicgKyBhcmlhUlBDLnBvcnQgKyAnIiBjbGFzcz0ic3dhbDItaW5wdXQiIHBsYWNlaG9sZGVyPSI2ODAwIj48L2Rpdj4nCiAgICAgICAgZG9tICs9ICc8ZGl2IGNsYXNzPSJmbGV4LWNlbnRlci1iZXR3ZWVuIj48bGFiZWwgZm9yPSJycGNUb2tlbiIgc3R5bGU9Im1hcmdpbi1yaWdodDogNXB4O2ZsZXg6IDAgMCAxMDBweDsiPuWvhumSpe+8mjwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGlkPSJycGNUb2tlbiIgdmFsdWU9IicgKyBhcmlhUlBDLnRva2VuICsgJyIgY2xhc3M9InN3YWwyLWlucHV0IiBwbGFjZWhvbGRlcj0i5rKh5pyJ55WZ56m6Ij48L2Rpdj4nCiAgICAgICAgZG9tICs9ICc8ZGl2IGNsYXNzPSJmbGV4LWNlbnRlci1iZXR3ZWVuIj48bGFiZWwgZm9yPSJycGNEaXIiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDVweDtmbGV4OiAwIDAgMTAwcHg7Ij7kuIvovb3ot6/lvoTvvJo8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icnBjRGlyIiB2YWx1ZT0iJyArIGFyaWFSUEMuZGlyICsgJyIgY2xhc3M9InN3YWwyLWlucHV0IiBwbGFjZWhvbGRlcj0i6buY6K6k5Li6RDpcIj48L2Rpdj4nCiAgICAgICAgZG9tID0gJzxkaXY+JyArIGRvbSArICc8L2Rpdj4nCiAgICAgICAgbGV0ICRkb20gPSAkKGRvbSkKCiAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICB0aXRsZTogJ1JQQ+mFjee9ricsCiAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgIGh0bWw6ICRkb21bMF0sCiAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+S/neWtmCcsCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsCiAgICAgICAgICAgICAgZm9vdGVyOiAn5LiN5Lya6YWN572u77yfPGEgaHJlZj0iaHR0cDovL3Rpbnl1cmwuY29tL3k2M2t4bnJ5IiB0YXJnZXQ9Il9ibGFuayI+54K55oiRPC9hPicKICAgICAgICAgIH0KICAgICAgICApLnRoZW4oKHJlc3VsdCkgPT4gewogICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7CiAgICAgICAgICAgICAgICBhcmlhUlBDLmRvbWFpbiA9ICQoJyNycGNEb21haW4nKS52YWwoKQogICAgICAgICAgICAgICAgYXJpYVJQQy5wb3J0ID0gJCgnI3JwY1BvcnQnKS52YWwoKQogICAgICAgICAgICAgICAgYXJpYVJQQy50b2tlbiA9ICQoJyNycGNUb2tlbicpLnZhbCgpCiAgICAgICAgICAgICAgICBhcmlhUlBDLmRpciA9ICQoJyNycGNEaXInKS52YWwoKQogICAgICAgICAgICAgICAgc2V0VmFsdWUoJ3JwY0RvbWFpbicsIGFyaWFSUEMuZG9tYWluKQogICAgICAgICAgICAgICAgc2V0VmFsdWUoJ3JwY1BvcnQnLCBhcmlhUlBDLnBvcnQpCiAgICAgICAgICAgICAgICBzZXRWYWx1ZSgncnBjVG9rZW4nLCBhcmlhUlBDLnRva2VuKQogICAgICAgICAgICAgICAgc2V0VmFsdWUoJ3JwY0RpcicsIGFyaWFSUEMuZGlyKQogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ+iuvue9ruaIkOWKnycsCiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KCiAgICBmdW5jdGlvbiBEaWFsb2coKSB7CiAgICAgICAgbGV0IGxpbmtMaXN0ID0gW10KICAgICAgICBsZXQgc2hvd1BhcmFtcwogICAgICAgIGxldCBkaWFsb2csIHNoYWRvdwoKICAgICAgICBmdW5jdGlvbiBjcmVhdGVEaWFsb2coKSB7CiAgICAgICAgICAgIGxldCBzY3JlZW5XaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgKICAgICAgICAgICAgbGV0IGRpYWxvZ0xlZnQgPSBzY3JlZW5XaWR0aCA+IDgwMCA/IChzY3JlZW5XaWR0aCAtIDgwMCkgLyAyIDogMAogICAgICAgICAgICBsZXQgJGRpYWxvZ19kaXYgPSAkKCc8ZGl2IGNsYXNzPSJkaWFsb2ciIHN0eWxlPSJ3aWR0aDogODAwcHg7IHRvcDogMHB4OyBib3R0b206IGF1dG87IGxlZnQ6ICcgKyBkaWFsb2dMZWZ0ICsgJ3B4OyByaWdodDogYXV0bzsgZGlzcGxheTogaGlkZGVuOyB2aXNpYmlsaXR5OiB2aXNpYmxlOyB6LWluZGV4OiA1MjsiPjwvZGl2PicpCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2hlYWRlciA9ICQoJzxkaXYgY2xhc3M9ImRpYWxvZy1oZWFkZXIiPjxoMz48c3BhbiBjbGFzcz0iZGlhbG9nLXRpdGxlIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NzQwcHg7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93LXg6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXMiPjwvc3Bhbj48L2gzPjwvZGl2PicpCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2NvbnRyb2wgPSAkKCc8ZGl2IGNsYXNzPSJkaWFsb2ctY29udHJvbCI+PHNwYW4gY2xhc3M9ImRpYWxvZy1pY29uIGRpYWxvZy1jbG9zZSI+w5c8L3NwYW4+PC9kaXY+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfYm9keSA9ICQoJzxkaXYgY2xhc3M9ImRpYWxvZy1ib2R5Ij48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ190aXAgPSAkKCc8ZGl2IGNsYXNzPSJkaWFsb2ctdGlwIj48cD48L3A+PC9kaXY+JykKCiAgICAgICAgICAgICRkaWFsb2dfZGl2LmFwcGVuZCgkZGlhbG9nX2hlYWRlci5hcHBlbmQoJGRpYWxvZ19jb250cm9sKSkuYXBwZW5kKCRkaWFsb2dfYm9keSkKCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2J1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImRpYWxvZy1idXR0b24iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PicpCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2J1dHRvbl9kaXYgPSAkKCc8ZGl2IHN0eWxlPSJkaXNwbGF5OnRhYmxlO21hcmdpbjphdXRvIj48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ19jb3B5X2J1dHRvbiA9ICQoJzxidXR0b24gaWQ9ImRpYWxvZy1jb3B5LWJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+5aSN5Yi25YWo6YOo6buY6K6k6ZO+5o6lPC9idXR0b24+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfc2VuZF9idXR0b24gPSAkKCc8YnV0dG9uIGlkPSJkaWFsb2ctc2VuZC1idXR0b24iIGNsYXNzPSJzZW5kLWFsbCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+5Y+R6YCB5YWo6YOoPC9idXR0b24+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfcnBjX2J1dHRvbiA9ICQoJzxidXR0b24gaWQ9ImRpYWxvZy1ycGMtYnV0dG9uIiBjbGFzcz0icnBjLXNldHRpbmciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPumFjee9rlJQQ+acjeWKoTwvYnV0dG9uPicpCgogICAgICAgICAgICAkZGlhbG9nX2J1dHRvbl9kaXYuYXBwZW5kKCRkaWFsb2dfY29weV9idXR0b24pLmFwcGVuZCgkZGlhbG9nX3NlbmRfYnV0dG9uKS5hcHBlbmQoJGRpYWxvZ19ycGNfYnV0dG9uKQogICAgICAgICAgICAkZGlhbG9nX2J1dHRvbi5hcHBlbmQoJGRpYWxvZ19idXR0b25fZGl2KQogICAgICAgICAgICAkZGlhbG9nX2Rpdi5hcHBlbmQoJGRpYWxvZ19idXR0b24pCgogICAgICAgICAgICAkZGlhbG9nX2NvcHlfYnV0dG9uLmNsaWNrKCgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gJycKICAgICAgICAgICAgICAgIGlmIChzaG93UGFyYW1zLnR5cGUgPT09ICdiYXRjaCcpIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2gobGlua0xpc3QsIChpbmRleCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxpbmtMaXN0Lmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGVsZW1lbnQuZG93bmxvYWRsaW5rWzBdCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gZWxlbWVudC5kb3dubG9hZGxpbmtbMF0gKyAnXHJcbicKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQYXJhbXMudHlwZSA9PT0gJ2JhdGNoQXJpYScpIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2gobGlua0xpc3QsIChpbmRleCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxpbmtMaXN0Lmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGRlY29kZVVSSUNvbXBvbmVudChhcmlhMmMoZWxlbWVudC5kbGluaywgZWxlbWVudC5maWxlbmFtZSwgdXNlckFnZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBkZWNvZGVVUklDb21wb25lbnQoYXJpYTJjKGVsZW1lbnQuZGxpbmssIGVsZW1lbnQuZmlsZW5hbWUsIHVzZXJBZ2VudCkgKyAnXHJcbicpCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzaG93UGFyYW1zLnR5cGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGxpbmtMaXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBsaW5rTGlzdC5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBlbGVtZW50LmRvd25sb2FkbGluawogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGVsZW1lbnQuZG93bmxvYWRsaW5rICsgJ1xyXG4nCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzaG93UGFyYW1zLnR5cGUgPT09ICdzaGFyZUxpbmsnKSB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGxpbmtMaXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGxpbmsgPT0gJ2Vycm9yJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbGlua0xpc3QubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gZWxlbWVudC5kbGluawogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGVsZW1lbnQuZGxpbmsgKyAnXHJcbicKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQYXJhbXMudHlwZSA9PSAnc2hhcmVBcmlhTGluaycpIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2gobGlua0xpc3QsIChpbmRleCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kbGluayA9PSAnZXJyb3InKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBsaW5rTGlzdC5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBkZWNvZGVVUklDb21wb25lbnQoYXJpYTJjKGVsZW1lbnQuZGxpbmssIGVsZW1lbnQuc2VydmVyX2ZpbGVuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBkZWNvZGVVUklDb21wb25lbnQoYXJpYTJjKGVsZW1lbnQuZGxpbmssIGVsZW1lbnQuc2VydmVyX2ZpbGVuYW1lKSArICdcclxuJykKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGNvbnRlbnQsICd0ZXh0JykKICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ+W3suWwhumTvuaOpeWkjeWItuWIsOWJqui0tOadv++8gScKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICflpI3liLblpLHotKXvvIzor7fmiYvliqjlpI3liLbvvIEnCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICRkaWFsb2dfZGl2LmFwcGVuZCgkZGlhbG9nX3RpcCkKICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkZGlhbG9nX2RpdikKICAgICAgICAgICAgJGRpYWxvZ19jb250cm9sLmNsaWNrKGRpYWxvZ0NvbnRyb2wpCiAgICAgICAgICAgIHJldHVybiAkZGlhbG9nX2RpdgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlU2hhZG93KCkgewogICAgICAgICAgICBsZXQgJHNoYWRvdyA9ICQoJzxkaXYgY2xhc3M9ImRpYWxvZy1zaGFkb3ciIHN0eWxlPSJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDBweDsgdG9wOiAwcHg7IHotaW5kZXg6IDUwOyBiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDAlOyBvcGFjaXR5OiAwLjU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IG5vbmU7Ij48L2Rpdj4nKQogICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKCRzaGFkb3cpCiAgICAgICAgICAgIHJldHVybiAkc2hhZG93CiAgICAgICAgfQoKICAgICAgICB0aGlzLm9wZW4gPSAocGFyYW1zKSA9PiB7CiAgICAgICAgICAgIHNob3dQYXJhbXMgPSBwYXJhbXMKICAgICAgICAgICAgbGlua0xpc3QgPSBbXQogICAgICAgICAgICBpZiAocGFyYW1zLnR5cGUgPT0gJ2xpbmsnKSB7CiAgICAgICAgICAgICAgICBsaW5rTGlzdCA9IHBhcmFtcy5saXN0LnVybHMKICAgICAgICAgICAgICAgICQoJ2Rpdi5kaWFsb2ctaGVhZGVyIGgzIHNwYW4uZGlhbG9nLXRpdGxlJywgZGlhbG9nKS50ZXh0KHBhcmFtcy50aXRsZSArICLvvJoiICsgcGFyYW1zLmxpc3QuZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAkLmVhY2gocGFyYW1zLmxpc3QudXJscywgKGluZGV4LCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC51cmwgPSByZXBsYWNlTGluayhlbGVtZW50LnVybCkKICAgICAgICAgICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXY+PGRpdiBzdHlsZT0id2lkdGg6MzBweDtmbG9hdDpsZWZ0Ij4nICsgZWxlbWVudC5yYW5rICsgJzo8L2Rpdj48ZGl2IHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXMiPjxhIGhyZWY9IicgKyBlbGVtZW50LnVybCArICciPicgKyBlbGVtZW50LnVybCArICc8L2E+PC9kaXY+PC9kaXY+JykKCiAgICAgICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1ib2R5JywgZGlhbG9nKS5hcHBlbmQoJGRpdikKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8v5om56YeP5LiL6L29IC0g5oiR55qE572R55uYCiAgICAgICAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2JhdGNoJyB8fCBwYXJhbXMudHlwZSA9PT0gJ2JhdGNoQXJpYScgfHwgcGFyYW1zLnR5cGUgPT09ICdiYXRjaEFyaWFSUEMnIHx8IHBhcmFtcy50eXBlID09PSAncGNzJykgewogICAgICAgICAgICAgICAgbGlua0xpc3QgPSBwYXJhbXMubGlzdAogICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1oZWFkZXIgaDMgc3Bhbi5kaWFsb2ctdGl0bGUnLCBkaWFsb2cpLnRleHQocGFyYW1zLnRpdGxlKQogICAgICAgICAgICAgICAgJC5lYWNoKHBhcmFtcy5saXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXYgY2xhc3M9InJvdyI+PGRpdiBjbGFzcz0idWktdGl0bGUiIHRpdGxlPSInICsgZWxlbWVudC5maWxlbmFtZSArICciPicgKyBlbGVtZW50LmZpbGVuYW1lICsgJzwvZGl2PjxzcGFuPu+8mjwvc3Bhbj48L2Rpdj4nKQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2JhdGNoJykgeyAgLy9BUEkKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGVsZW1lbnQuZG93bmxvYWRsaW5rLCAoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGl2LmFwcGVuZCgkKCc8YSBjbGFzcz0idWktbGluayBhcGktbGluayIgaHJlZj0iJyArIGUgKyAnIiBkYXRhLWxpbms9JyArIGUgKyAnPum7mOiupOmTvuaOpTwvYT4nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFZhbHVlKCdTRVRUSU5HX0InKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpdi5hcHBlbmQoJCgnPGEgY2xhc3M9InVpLWxpbmsgYXBpLWxpbmsiIGhyZWY9IicgKyBlICsgJyIgIGRhdGEtbGluaz0nICsgZSArICc+5aSH55So6ZO+5o6lJyArIG51bWJlcltpXSArICc8L2E+JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3BjcycpIHsgIC8vUENTCiAgICAgICAgICAgICAgICAgICAgICAgICRkaXYuYXBwZW5kKCQoJzxhIGNsYXNzPSJ1aS1saW5rIHBjcy1saW5rIiBkYXRhLWZpbGVuYW1lPScgKyBlbGVtZW50LmZpbGVuYW1lICsgJyBkYXRhLWxpbms9JyArIGVsZW1lbnQuZGxpbmsgKyAnIGhyZWY9ImphdmFzY3JpcHQ6OyI+JyArIGVsZW1lbnQuZGxpbmsgKyAnPC9hPicpKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdiYXRjaEFyaWEnKSB7ICAvL0FyaWHkuIvovb0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBkZWNvZGVVUklDb21wb25lbnQoYXJpYTJjKGVsZW1lbnQuZGxpbmssIGVsZW1lbnQuZmlsZW5hbWUsIHVzZXJBZ2VudCkpCiAgICAgICAgICAgICAgICAgICAgICAgICRkaXYuYXBwZW5kKCQoJzxhIGNsYXNzPSJ1aS1saW5rIGFyaWEtbGluayIgaHJlZj0iamF2YXNjcmlwdDo7Ij4nICsgbGluayArICc8L2E+JykpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2JhdGNoQXJpYVJQQycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRpdi5hcHBlbmQoJCgnPGJ1dHRvbiBjbGFzcz0iYXJpYS1ycGMiIGRhdGEtbGluaz0iJyArIGVsZW1lbnQuZGxpbmsgKyAnIiBkYXRhLWZpbGVuYW1lPSInICsgZWxlbWVudC5maWxlbmFtZSArICciPueCueWHu+WPkemAgeWIsEFyaWHkuIvovb3lmag8L2J1dHRvbj4nKSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1ib2R5JywgZGlhbG9nKS5hcHBlbmQoJGRpdikKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnc2hhcmVMaW5rJykgewogICAgICAgICAgICAgICAgbGlua0xpc3QgPSBwYXJhbXMubGlzdAogICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1oZWFkZXIgaDMgc3Bhbi5kaWFsb2ctdGl0bGUnLCBkaWFsb2cpLnRleHQocGFyYW1zLnRpdGxlKQogICAgICAgICAgICAgICAgJC5lYWNoKHBhcmFtcy5saXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRsaW5rID0gcmVwbGFjZUxpbmsoZWxlbWVudC5kbGluaykKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc2RpciA9PSAxKSByZXR1cm4KICAgICAgICAgICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXYgY2xhc3M9InJvdyI+PGRpdiBjbGFzcz0idWktdGl0bGUiIHRpdGxlPSInICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUgKyAnIj4nICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUgKyAnPC9kaXY+PHNwYW4+77yaPC9zcGFuPjxhIGhyZWY9IicgKyBlbGVtZW50LmRsaW5rICsgJyIgY2xhc3M9InNoYXJlLWRvd25sb2FkIj4nICsgZWxlbWVudC5kbGluayArICc8L2E+PC9kaXY+JykKICAgICAgICAgICAgICAgICAgICAkKCdkaXYuZGlhbG9nLWJvZHknLCBkaWFsb2cpLmFwcGVuZCgkZGl2KQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdycGNMaW5rJykgewogICAgICAgICAgICAgICAgbGlua0xpc3QgPSBwYXJhbXMubGlzdAogICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1oZWFkZXIgaDMgc3Bhbi5kaWFsb2ctdGl0bGUnLCBkaWFsb2cpLnRleHQocGFyYW1zLnRpdGxlKQogICAgICAgICAgICAgICAgJC5lYWNoKHBhcmFtcy5saXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRsaW5rID0gcmVwbGFjZUxpbmsoZWxlbWVudC5kbGluaykKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc2RpciA9PSAxKSByZXR1cm4KICAgICAgICAgICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXYgY2xhc3M9InJvdyI+PGRpdiBjbGFzcz0idWktdGl0bGUiIHRpdGxlPSInICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUgKyAnIj4nICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUgKyAnPC9kaXY+PHNwYW4+77yaPC9zcGFuPjxidXR0b24gY2xhc3M9ImFyaWEtcnBjIiBkYXRhLWxpbms9IicgKyBlbGVtZW50LmRsaW5rICsgJyIgZGF0YS1maWxlbmFtZT0iJyArIGVsZW1lbnQuc2VydmVyX2ZpbGVuYW1lICsgJyI+54K55Ye75Y+R6YCB5YiwQXJpYeS4i+i9veWZqDwvYnV0dG9uPjwvZGl2PicpCiAgICAgICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1ib2R5JywgZGlhbG9nKS5hcHBlbmQoJGRpdikKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnc2hhcmVBcmlhTGluaycpIHsKICAgICAgICAgICAgICAgIGxpbmtMaXN0ID0gcGFyYW1zLmxpc3QKICAgICAgICAgICAgICAgICQoJ2Rpdi5kaWFsb2ctaGVhZGVyIGgzIHNwYW4uZGlhbG9nLXRpdGxlJywgZGlhbG9nKS50ZXh0KHBhcmFtcy50aXRsZSkKICAgICAgICAgICAgICAgICQuZWFjaChwYXJhbXMubGlzdCwgKGluZGV4LCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNkaXIgPT0gMSkgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBkZWNvZGVVUklDb21wb25lbnQoYXJpYTJjKGVsZW1lbnQuZGxpbmssIGVsZW1lbnQuc2VydmVyX2ZpbGVuYW1lKSkKICAgICAgICAgICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXYgY2xhc3M9InJvdyI+PGRpdiBjbGFzcz0idWktdGl0bGUiIHRpdGxlPSInICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUgKyAnIj4nICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUgKyAnPC9kaXY+PHNwYW4+77yaPC9zcGFuPjxhIGhyZWY9ImphdmFzY3RpcHQ6dm9pZCgwKSIgY2xhc3M9ImFyaWEtbGluayI+JyArIGxpbmsgKyAnPC9hPjwvZGl2PicpCiAgICAgICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1ib2R5JywgZGlhbG9nKS5hcHBlbmQoJGRpdikKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJhbXMudGlwKSB7CiAgICAgICAgICAgICAgICAkKCdkaXYuZGlhbG9nLXRpcCBwJywgZGlhbG9nKS5odG1sKHBhcmFtcy50aXApCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvd2NvcHkpIHsKICAgICAgICAgICAgICAgICQoJ2Rpdi5kaWFsb2ctYnV0dG9uJywgZGlhbG9nKS5zaG93KCkKICAgICAgICAgICAgICAgICQoJ2Rpdi5kaWFsb2ctYnV0dG9uICNkaWFsb2ctY29weS1idXR0b24nLCBkaWFsb2cpLnNob3coKQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyYW1zLnNob3dycGMpewogICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1idXR0b24nLCBkaWFsb2cpLnNob3coKQogICAgICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1idXR0b24gI2RpYWxvZy1zZW5kLWJ1dHRvbicsIGRpYWxvZykuc2hvdygpCiAgICAgICAgICAgICAgICAkKCdkaXYuZGlhbG9nLWJ1dHRvbiAjZGlhbG9nLXJwYy1idXR0b24nLCBkaWFsb2cpLnNob3coKQogICAgICAgICAgICB9CgogICAgICAgICAgICBzaGFkb3cuc2hvdygpCiAgICAgICAgICAgIGRpYWxvZy5zaG93KCkKICAgICAgICB9CgogICAgICAgIHRoaXMuY2xvc2UgPSAoKSA9PiB7CiAgICAgICAgICAgIGRpYWxvZ0NvbnRyb2woKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZGlhbG9nQ29udHJvbCgpIHsKICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1ib2R5JywgZGlhbG9nKS5jaGlsZHJlbigpLnJlbW92ZSgpCiAgICAgICAgICAgICQoJ2Rpdi5kaWFsb2ctaGVhZGVyIGgzIHNwYW4uZGlhbG9nLXRpdGxlJywgZGlhbG9nKS50ZXh0KCcnKQogICAgICAgICAgICAkKCdkaXYuZGlhbG9nLXRpcCBwJywgZGlhbG9nKS50ZXh0KCcnKQogICAgICAgICAgICAkKCdkaXYuZGlhbG9nLWJ1dHRvbicsIGRpYWxvZykuaGlkZSgpCiAgICAgICAgICAgICQoJ2Rpdi5kaWFsb2ctYnV0dG9uIGJ1dHRvbiNkaWFsb2ctY29weS1idXR0b24nLCBkaWFsb2cpLmhpZGUoKQogICAgICAgICAgICAkKCdkaXYuZGlhbG9nLWJ1dHRvbiBidXR0b24jZGlhbG9nLXNlbmQtYnV0dG9uJywgZGlhbG9nKS5oaWRlKCkKICAgICAgICAgICAgJCgnZGl2LmRpYWxvZy1idXR0b24gYnV0dG9uI2RpYWxvZy1ycGMtYnV0dG9uJywgZGlhbG9nKS5oaWRlKCkKICAgICAgICAgICAgZGlhbG9nLmhpZGUoKQogICAgICAgICAgICBzaGFkb3cuaGlkZSgpCiAgICAgICAgfQoKICAgICAgICBkaWFsb2cgPSBjcmVhdGVEaWFsb2coKQogICAgICAgIHNoYWRvdyA9IGNyZWF0ZVNoYWRvdygpCiAgICB9CgogICAgZnVuY3Rpb24gVkNvZGVEaWFsb2cocmVmcmVzaFZDb2RlLCBjb25maXJtQ2xpY2spIHsKICAgICAgICBsZXQgZGlhbG9nLCBzaGFkb3cKCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRGlhbG9nKCkgewogICAgICAgICAgICBsZXQgc2NyZWVuV2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoCiAgICAgICAgICAgIGxldCBkaWFsb2dMZWZ0ID0gc2NyZWVuV2lkdGggPiA1MjAgPyAoc2NyZWVuV2lkdGggLSA1MjApIC8gMiA6IDAKICAgICAgICAgICAgbGV0ICRkaWFsb2dfZGl2ID0gJCgnPGRpdiBjbGFzcz0iZGlhbG9nIiBpZD0iZGlhbG9nLXZjb2RlIiBzdHlsZT0id2lkdGg6NTIwcHg7dG9wOjBweDtib3R0b206YXV0bztsZWZ0OicgKyBkaWFsb2dMZWZ0ICsgJ3B4O3JpZ2h0OmF1dG87ZGlzcGxheTpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTt6LWluZGV4OjUyIj48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ19oZWFkZXIgPSAkKCc8ZGl2IGNsYXNzPSJkaWFsb2ctaGVhZGVyIj48aDM+PHNwYW4gY2xhc3M9ImRpYWxvZy1oZWFkZXItdGl0bGUiPjxlbSBjbGFzcz0ic2VsZWN0LXRleHQiPuaPkOekujwvZW0+PC9zcGFuPjwvaDM+PC9kaXY+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfY29udHJvbCA9ICQoJzxkaXYgY2xhc3M9ImRpYWxvZy1jb250cm9sIj48c3BhbiBjbGFzcz0iZGlhbG9nLWljb24gZGlhbG9nLWNsb3NlIGljb24gaWNvbi1jbG9zZSI+PHNwYW4gY2xhc3M9InNpY29uIj54PC9zcGFuPjwvc3Bhbj48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ19ib2R5ID0gJCgnPGRpdiBjbGFzcz0iZGlhbG9nLWJvZHkiPjwvZGl2PicpCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2JvZHlfZGl2ID0gJCgnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoyMnB4Ij48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ19ib2R5X2Rvd25sb2FkX3ZlcmlmeSA9ICQoJzxkaXYgY2xhc3M9ImRvd25sb2FkLXZlcmlmeSIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDtwYWRkaW5nOjAgMjhweDt0ZXh0LWFsaWduOmxlZnQ7Zm9udC1zaXplOjEycHg7Ij48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ192ZXJpZnlfYm9keSA9ICQoJzxkaXYgY2xhc3M9InZlcmlmeS1ib2R5Ij7or7fovpPlhaXpqozor4HnoIHvvJo8L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ19pbnB1dCA9ICQoJzxpbnB1dCBpZD0iZGlhbG9nLWlucHV0IiB0eXBlPSJ0ZXh0IiBzdHlsZT0icGFkZGluZzozcHg7d2lkdGg6ODVweDtoZWlnaHQ6MjNweDtib3JkZXI6MXB4IHNvbGlkICNjNmM2YzY7YmFja2dyb3VuZC1jb2xvcjp3aGl0ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IiBjbGFzcz0iaW5wdXQtY29kZSIgbWF4bGVuZ3RoPSI0Ij4nKQogICAgICAgICAgICBsZXQgJGRpYWxvZ19pbWcgPSAkKCc8aW1nIGlkPSJkaWFsb2ctaW1nIiBjbGFzcz0iaW1nLWNvZGUiIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsiIGFsdD0i54K55Ye75o2i5LiA5bygIiBzcmM9IiIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCI+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfcmVmcmVzaCA9ICQoJzxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IiBjbGFzcz0idW5kZXJsaW5lIj7mjaLkuIDlvKA8L2E+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfZXJyID0gJCgnPGRpdiBpZD0iZGlhbG9nLWVyciIgc3R5bGU9InBhZGRpbmctbGVmdDo4NHB4O2hlaWdodDoxOHB4O2NvbG9yOiNkODAwMDAiIGNsYXNzPSJ2ZXJpZnktZXJyb3IiPjwvZGl2PicpCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2Zvb3RlciA9ICQoJzxkaXYgY2xhc3M9ImRpYWxvZy1mb290ZXIgZy1jbGVhcmZpeCI+PC9kaXY+JykKICAgICAgICAgICAgbGV0ICRkaWFsb2dfY29uZmlybV9idXR0b24gPSAkKCc8YSBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSIgZGF0YS1idXR0b24taWQ9IiIgZGF0YS1idXR0b24taW5kZXggaHJlZj0iamF2YXNjcmlwdDo7IiBzdHlsZT0icGFkZGluZy1sZWZ0OjM2cHgiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCIgc3R5bGU9InBhZGRpbmctcmlnaHQ6MzZweDsiPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6YXV0bzsiPuehruWumjwvc3Bhbj48L3NwYW4+PC9hPicpCiAgICAgICAgICAgIGxldCAkZGlhbG9nX2NhbmNlbF9idXR0b24gPSAkKCc8YSBjbGFzcz0iZy1idXR0b24iIGRhdGEtYnV0dG9uLWlkPSIiIGRhdGEtYnV0dG9uLWluZGV4IGhyZWY9ImphdmFzY3JpcHQ6OyIgc3R5bGU9InBhZGRpbmctbGVmdDogMzZweDsiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCIgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDM2cHg7Ij48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+5Y+W5raIPC9zcGFuPjwvc3Bhbj48L2E+JykKCiAgICAgICAgICAgICRkaWFsb2dfaGVhZGVyLmFwcGVuZCgkZGlhbG9nX2NvbnRyb2wpCiAgICAgICAgICAgICRkaWFsb2dfdmVyaWZ5X2JvZHkuYXBwZW5kKCRkaWFsb2dfaW5wdXQpLmFwcGVuZCgkZGlhbG9nX2ltZykuYXBwZW5kKCRkaWFsb2dfcmVmcmVzaCkKICAgICAgICAgICAgJGRpYWxvZ19ib2R5X2Rvd25sb2FkX3ZlcmlmeS5hcHBlbmQoJGRpYWxvZ192ZXJpZnlfYm9keSkuYXBwZW5kKCRkaWFsb2dfZXJyKQogICAgICAgICAgICAkZGlhbG9nX2JvZHlfZGl2LmFwcGVuZCgkZGlhbG9nX2JvZHlfZG93bmxvYWRfdmVyaWZ5KQogICAgICAgICAgICAkZGlhbG9nX2JvZHkuYXBwZW5kKCRkaWFsb2dfYm9keV9kaXYpCiAgICAgICAgICAgICRkaWFsb2dfZm9vdGVyLmFwcGVuZCgkZGlhbG9nX2NvbmZpcm1fYnV0dG9uKS5hcHBlbmQoJGRpYWxvZ19jYW5jZWxfYnV0dG9uKQogICAgICAgICAgICAkZGlhbG9nX2Rpdi5hcHBlbmQoJGRpYWxvZ19oZWFkZXIpLmFwcGVuZCgkZGlhbG9nX2JvZHkpLmFwcGVuZCgkZGlhbG9nX2Zvb3RlcikKICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkZGlhbG9nX2RpdikKCiAgICAgICAgICAgICRkaWFsb2dfY29udHJvbC5jbGljayhkaWFsb2dDb250cm9sKQogICAgICAgICAgICAkZGlhbG9nX2ltZy5jbGljayhyZWZyZXNoVkNvZGUpCiAgICAgICAgICAgICRkaWFsb2dfcmVmcmVzaC5jbGljayhyZWZyZXNoVkNvZGUpCiAgICAgICAgICAgICRkaWFsb2dfaW5wdXQua2V5cHJlc3MoKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT0gMTMpCiAgICAgICAgICAgICAgICAgICAgY29uZmlybUNsaWNrKCkKICAgICAgICAgICAgfSkKICAgICAgICAgICAgJGRpYWxvZ19jb25maXJtX2J1dHRvbi5jbGljayhjb25maXJtQ2xpY2spCiAgICAgICAgICAgICRkaWFsb2dfY2FuY2VsX2J1dHRvbi5jbGljayhkaWFsb2dDb250cm9sKQogICAgICAgICAgICAkZGlhbG9nX2lucHV0LmNsaWNrKCgpID0+IHsKICAgICAgICAgICAgICAgICQoJyNkaWFsb2ctZXJyJykudGV4dCgnJykKICAgICAgICAgICAgfSkKICAgICAgICAgICAgcmV0dXJuICRkaWFsb2dfZGl2CiAgICAgICAgfQoKICAgICAgICB0aGlzLm9wZW4gPSAodmNvZGUpID0+IHsKICAgICAgICAgICAgaWYgKHZjb2RlKQogICAgICAgICAgICAgICAgJCgnI2RpYWxvZy1pbWcnKS5hdHRyKCdzcmMnLCB2Y29kZS5pbWcpCiAgICAgICAgICAgIGRpYWxvZy5zaG93KCkKICAgICAgICAgICAgc2hhZG93LnNob3coKQogICAgICAgIH0KICAgICAgICB0aGlzLmNsb3NlID0gKCkgPT4gewogICAgICAgICAgICBkaWFsb2dDb250cm9sKCkKICAgICAgICB9CiAgICAgICAgZGlhbG9nID0gY3JlYXRlRGlhbG9nKCkKICAgICAgICBzaGFkb3cgPSAkKCdkaXYuZGlhbG9nLXNoYWRvdycpCgogICAgICAgIGZ1bmN0aW9uIGRpYWxvZ0NvbnRyb2woKSB7CiAgICAgICAgICAgICQoJyNkaWFsb2ctaW1nJywgZGlhbG9nKS5hdHRyKCdzcmMnLCAnJykKICAgICAgICAgICAgJCgnI2RpYWxvZy1lcnInKS50ZXh0KCcnKQogICAgICAgICAgICBkaWFsb2cuaGlkZSgpCiAgICAgICAgICAgIHNoYWRvdy5oaWRlKCkKICAgICAgICB9CiAgICB9CgogICAgLy/nvZHnm5jpobXpnaLnmoTkuIvovb3liqnmiYsKICAgIGZ1bmN0aW9uIFBhbkhlbHBlcigpIHsKICAgICAgICBsZXQgeXVuRGF0YSwgc2lnbiwgdGltZXN0YW1wLCBiZHN0b2tlbiwgbG9naWQsIGZpZF9saXN0CiAgICAgICAgbGV0IGZpbGVMaXN0ID0gW10sIHNlbGVjdEZpbGVMaXN0ID0gW10sIGJhdGNoTGlua0xpc3QgPSBbXSwgYmF0Y2hMaW5rTGlzdEFsbCA9IFtdLCBsaW5rTGlzdCA9IFtdCiAgICAgICAgbGV0IGRpYWxvZywgc2VhcmNoS2V5CiAgICAgICAgbGV0IHBhbkFQSVVybCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QgKyAiL2FwaS8iCiAgICAgICAgbGV0IHJlc3RBUElVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArICIvL3Bjcy5iYWlkdS5jb20vcmVzdC8yLjAvcGNzLyIKICAgICAgICBsZXQgY2xpZW50QVBJVXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy9wYW4uYmFpZHUuY29tL3Jlc3QvMi4wLyIKCiAgICAgICAgdGhpcy5pbml0ID0gKCkgPT4gewogICAgICAgICAgICB5dW5EYXRhID0gdW5zYWZlV2luZG93Lnl1bkRhdGEKICAgICAgICAgICAgY2xvZygn5Yid5aeL5YyW5L+h5oGvOicsIHl1bkRhdGEpCiAgICAgICAgICAgIGlmICh5dW5EYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGNsb2coJ+mhtemdouacquato+W4uOWKoOi9ve+8jOaIluiAheeZvuW6puW3sue7j+abtOaWsO+8gScpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0VmFyKCkKICAgICAgICAgICAgcmVnaXN0ZXJFdmVudExpc3RlbmVyKCkKICAgICAgICAgICAgYWRkQnV0dG9uKCkKICAgICAgICAgICAgY3JlYXRlSWZyYW1lKCkKICAgICAgICAgICAgZGlhbG9nID0gbmV3IERpYWxvZyh7YWRkQ29weTogdHJ1ZX0pCiAgICAgICAgICAgIGNsb2coJ+S4i+i9veWKqeaJi+WKoOi9veaIkOWKn++8geW9k+WJjeeJiOacrO+8micsIHZlcnNpb24pCiAgICAgICAgfQoKICAgICAgICAvL+iOt+WPlumAieS4reaWh+S7tgogICAgICAgIGZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoImRpc2stc3lzdGVtOndpZGdldC9wYWdlTW9kdWxlL2xpc3QvbGlzdEluaXQuanMiKS5nZXRDaGVja2VkSXRlbXMoKQogICAgICAgIH0KCiAgICAgICAgLy/liJ3lp4vljJblj5jph48KICAgICAgICBmdW5jdGlvbiBpbml0VmFyKCkgewogICAgICAgICAgICAvL3NpZ24gPSBnZXRTaWduKCkKICAgICAgICAgICAgdGltZXN0YW1wID0geXVuRGF0YS50aW1lc3RhbXAgfHwgJycKICAgICAgICAgICAgYmRzdG9rZW4gPSB5dW5EYXRhLk1ZQkRTVE9LRU4gfHwgJycKICAgICAgICAgICAgbG9naWQgPSBnZXRMb2dJRCgpCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZWdpc3RlckV2ZW50TGlzdGVuZXIoKSB7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuYXBpLWxpbmsnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuZGF0YXNldC5saW5rKSB7CiAgICAgICAgICAgICAgICAgICAgZXhlY0Rvd25sb2FkKGUudGFyZ2V0LmRhdGFzZXQubGluaykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5hcmlhLXJwYycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5hZGRDbGFzcygnY2xpY2tlZCcpCiAgICAgICAgICAgICAgICBsZXQgbGluayA9IGUudGFyZ2V0LmRhdGFzZXQubGluawogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZS50YXJnZXQuZGF0YXNldC5maWxlbmFtZQoKICAgICAgICAgICAgICAgIGxldCB1cmwgPSBhcmlhUlBDLmRvbWFpbiArICI6IiArIGFyaWFSUEMucG9ydCArICcvanNvbnJwYycKICAgICAgICAgICAgICAgIGxldCBqc29uX3JwYyA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuOiIgKyBhcmlhUlBDLnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICBbbGlua10sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogYXJpYVJQQy5kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbJ1VzZXItQWdlbnQ6JyArIHVzZXJBZ2VudCwgJ0Nvb2tpZTogQkRVU1M9JyArIGdldEJEVVNTKCldCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsiVXNlci1BZ2VudCI6IHVzZXJBZ2VudH0sCiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMzAwMCwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShqc29uX3JwYyksCiAgICAgICAgICAgICAgICAgICAgb25sb2FkOiAocmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3BvbnNlLnJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5Lu75Yqh5bey5Y+R6YCB6IezUlBD5LiL6L295ZmoJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHJlc3BvbnNlLnJlc3BvbnNlLm1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9udGltZW91dDogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+i/nuaOpeWIsFJQQ+acjeWKoeWZqOi2heaXtu+8jOivt+ajgOafpVJQQ+mFjee9ricKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCcucnBjLXNldHRpbmcnLChlKT0+ewogICAgICAgICAgICAgICAgcnBjU2V0dGluZygpCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsJy5zZW5kLWFsbCcsKGUpPT57CiAgICAgICAgICAgICAgICAkKCcuYXJpYS1ycGMnKS5jbGljaygpCiAgICAgICAgICAgICAgICAkKCcuZGlhbG9nJykuaGlkZSgpCiAgICAgICAgICAgICAgICAkKCcuZGlhbG9nLXNoYWRvdycpLmhpZGUoKQogICAgICAgICAgICB9KQogICAgICAgIH0KCiAgICAgICAgLy/miJHnmoTnvZHnm5ggLSDmt7vliqDliqnmiYvmjInpkq4KICAgICAgICBmdW5jdGlvbiBhZGRCdXR0b24oKSB7CiAgICAgICAgICAgICQoJ2Rpdi4nICsgY2xhc3NNYXBbJ2Jhci1zZWFyY2gnXSkuY3NzKCd3aWR0aCcsICcxOCUnKQogICAgICAgICAgICBsZXQgJGRyb3Bkb3duYnV0dG9uID0gJCgnPHNwYW4gY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIj48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRkcm9wZG93bmJ1dHRvbl9hID0gJCgnPGEgY2xhc3M9ImctYnV0dG9uIiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9hPicpCiAgICAgICAgICAgIGxldCAkZHJvcGRvd25idXR0b25fc3BhbiA9ICQoJzxzcGFuIGNsYXNzPSJtZW51IiBzdHlsZT0id2lkdGg6MTE0cHgiPjwvc3Bhbj4nKQoKICAgICAgICAgICAgbGV0ICRkaXJlY3RidXR0b24gPSAkKCc8c3BhbiBjbGFzcz0iZy1idXR0b24tbWVudSIgc3R5bGU9ImRpc3BsYXk6YmxvY2siPjwvc3Bhbj4nKQogICAgICAgICAgICBsZXQgJGRpcmVjdGJ1dHRvbl9zcGFuID0gJCgnPHNwYW4gY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIGctZHJvcGRvd24tYnV0dG9uLXNlY29uZCIgbWVudWxldmVsPSIyIj48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRkaXJlY3RidXR0b25fYSA9ICQoJzxhIGNsYXNzPSJnLWJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6YXV0byI+55u06ZO+5LiL6L29PC9zcGFuPjwvc3Bhbj48L2E+JykKICAgICAgICAgICAgbGV0ICRkaXJlY3RidXR0b25fbWVudSA9ICQoJzxzcGFuIGNsYXNzPSJtZW51IiBzdHlsZT0id2lkdGg6MTIwcHg7bGVmdDo3OXB4Ij48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRkaXJlY3RidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24gPSAkKCc8YSBpZD0iYmF0Y2hodHRwbGluay1kaXJlY3QiIGNsYXNzPSJnLWJ1dHRvbi1tZW51IiBocmVmPSJqYXZhc2NyaXB0OjsiPuaYvuekuumTvuaOpTwvYT4nKQogICAgICAgICAgICAkZGlyZWN0YnV0dG9uX21lbnUuYXBwZW5kKCRkaXJlY3RidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24pCiAgICAgICAgICAgICRkaXJlY3RidXR0b24uYXBwZW5kKCRkaXJlY3RidXR0b25fc3Bhbi5hcHBlbmQoJGRpcmVjdGJ1dHRvbl9hKS5hcHBlbmQoJGRpcmVjdGJ1dHRvbl9tZW51KSkKICAgICAgICAgICAgJGRpcmVjdGJ1dHRvbi5ob3ZlcigoKSA9PiB7CiAgICAgICAgICAgICAgICAkZGlyZWN0YnV0dG9uX3NwYW4udG9nZ2xlQ2xhc3MoJ2J1dHRvbi1vcGVuJykKICAgICAgICAgICAgfSkKICAgICAgICAgICAgJGRpcmVjdGJ1dHRvbl9iYXRjaGh0dHBsaW5rX2J1dHRvbi5jbGljayhiYXRjaENsaWNrKQoKICAgICAgICAgICAgbGV0ICRwY3NidXR0b24gPSAkKCc8c3BhbiBjbGFzcz0iZy1idXR0b24tbWVudSIgc3R5bGU9ImRpc3BsYXk6YmxvY2siPjwvc3Bhbj4nKQogICAgICAgICAgICBsZXQgJHBjc2J1dHRvbl9zcGFuID0gJCgnPHNwYW4gY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIGctZHJvcGRvd24tYnV0dG9uLXNlY29uZCIgbWVudWxldmVsPSIyIj48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRwY3NidXR0b25fYSA9ICQoJzxhIGNsYXNzPSJnLWJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6YXV0byI+QVBJ5LiL6L29PC9zcGFuPjwvc3Bhbj48L2E+JykKICAgICAgICAgICAgbGV0ICRwY3NidXR0b25fbWVudSA9ICQoJzxzcGFuIGNsYXNzPSJtZW51IiBzdHlsZT0id2lkdGg6MTIwcHg7bGVmdDo3OXB4Ij48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRwY3NidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24gPSAkKCc8YSBpZD0iYmF0Y2hodHRwbGluay1wY3MiIGNsYXNzPSJnLWJ1dHRvbi1tZW51IiBocmVmPSJqYXZhc2NyaXB0OjsiPuaYvuekuumTvuaOpTwvYT4nKQogICAgICAgICAgICAkcGNzYnV0dG9uX21lbnUuYXBwZW5kKCRwY3NidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24pCiAgICAgICAgICAgICRwY3NidXR0b24uYXBwZW5kKCRwY3NidXR0b25fc3Bhbi5hcHBlbmQoJHBjc2J1dHRvbl9hKS5hcHBlbmQoJHBjc2J1dHRvbl9tZW51KSkKICAgICAgICAgICAgJHBjc2J1dHRvbi5ob3ZlcigoKSA9PiB7CiAgICAgICAgICAgICAgICAkcGNzYnV0dG9uX3NwYW4udG9nZ2xlQ2xhc3MoJ2J1dHRvbi1vcGVuJykKICAgICAgICAgICAgfSkKICAgICAgICAgICAgJHBjc2J1dHRvbl9iYXRjaGh0dHBsaW5rX2J1dHRvbi5jbGljayhiYXRjaENsaWNrKQoKICAgICAgICAgICAgbGV0ICRhcmlhZGlyZWN0YnV0dG9uID0gJCgnPHNwYW4gY2xhc3M9ImctYnV0dG9uLW1lbnUiIHN0eWxlPSJkaXNwbGF5OmJsb2NrIj48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRhcmlhZGlyZWN0YnV0dG9uX3NwYW4gPSAkKCc8c3BhbiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gZy1kcm9wZG93bi1idXR0b24tc2Vjb25kIiBtZW51bGV2ZWw9IjIiPjwvc3Bhbj4nKQogICAgICAgICAgICBsZXQgJGFyaWFkaXJlY3RidXR0b25fYSA9ICQoJzxhIGNsYXNzPSJnLWJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6YXV0byI+QXJpYeS4i+i9vTwvc3Bhbj48L3NwYW4+PC9hPicpCiAgICAgICAgICAgIGxldCAkYXJpYWRpcmVjdGJ1dHRvbl9tZW51ID0gJCgnPHNwYW4gY2xhc3M9Im1lbnUiIHN0eWxlPSJ3aWR0aDoxMjBweDtsZWZ0Ojc5cHgiPjwvc3Bhbj4nKQogICAgICAgICAgICBsZXQgJGFyaWFkaXJlY3RidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24gPSAkKCc8YSBpZD0iYmF0Y2hodHRwbGluay1hcmlhIiBjbGFzcz0iZy1idXR0b24tbWVudSIgaHJlZj0iamF2YXNjcmlwdDo7Ij7mmL7npLrpk77mjqU8L2E+JykKICAgICAgICAgICAgJGFyaWFkaXJlY3RidXR0b25fbWVudS5hcHBlbmQoJGFyaWFkaXJlY3RidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24pCiAgICAgICAgICAgICRhcmlhZGlyZWN0YnV0dG9uLmFwcGVuZCgkYXJpYWRpcmVjdGJ1dHRvbl9zcGFuLmFwcGVuZCgkYXJpYWRpcmVjdGJ1dHRvbl9hKS5hcHBlbmQoJGFyaWFkaXJlY3RidXR0b25fbWVudSkpCiAgICAgICAgICAgICRhcmlhZGlyZWN0YnV0dG9uLmhvdmVyKCgpID0+IHsKICAgICAgICAgICAgICAgICRhcmlhZGlyZWN0YnV0dG9uX3NwYW4udG9nZ2xlQ2xhc3MoJ2J1dHRvbi1vcGVuJykKICAgICAgICAgICAgfSkKICAgICAgICAgICAgJGFyaWFkaXJlY3RidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24uY2xpY2soYmF0Y2hDbGljaykKCiAgICAgICAgICAgIGxldCAkYXJpYXJwY2J1dHRvbiA9ICQoJzxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1tZW51IiBzdHlsZT0iZGlzcGxheTpibG9jayI+PC9zcGFuPicpCiAgICAgICAgICAgIGxldCAkYXJpYXJwY2J1dHRvbl9zcGFuID0gJCgnPHNwYW4gY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIGctZHJvcGRvd24tYnV0dG9uLXNlY29uZCIgbWVudWxldmVsPSIyIj48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRhcmlhcnBjYnV0dG9uX2EgPSAkKCc8YSBjbGFzcz0iZy1idXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6OyI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOmF1dG8iPlJQQ+S4i+i9vTwvc3Bhbj48L3NwYW4+PC9hPicpCiAgICAgICAgICAgIGxldCAkYXJpYXJwY2J1dHRvbl9tZW51ID0gJCgnPHNwYW4gY2xhc3M9Im1lbnUiIHN0eWxlPSJ3aWR0aDoxMjBweDtsZWZ0Ojc5cHgiPjwvc3Bhbj4nKQogICAgICAgICAgICBsZXQgJGFyaWFycGNidXR0b25fYmF0Y2hodHRwbGlua19idXR0b24gPSAkKCc8YSBpZD0iYmF0Y2hodHRwbGluay1ycGMiIGNsYXNzPSJnLWJ1dHRvbi1tZW51IiBocmVmPSJqYXZhc2NyaXB0OjsiPuaYvuekuumTvuaOpTwvYT4nKQogICAgICAgICAgICAkYXJpYXJwY2J1dHRvbl9tZW51LmFwcGVuZCgkYXJpYXJwY2J1dHRvbl9iYXRjaGh0dHBsaW5rX2J1dHRvbikKICAgICAgICAgICAgJGFyaWFycGNidXR0b24uYXBwZW5kKCRhcmlhcnBjYnV0dG9uX3NwYW4uYXBwZW5kKCRhcmlhcnBjYnV0dG9uX2EpLmFwcGVuZCgkYXJpYXJwY2J1dHRvbl9tZW51KSkKICAgICAgICAgICAgJGFyaWFycGNidXR0b24uaG92ZXIoKCkgPT4gewogICAgICAgICAgICAgICAgJGFyaWFycGNidXR0b25fc3Bhbi50b2dnbGVDbGFzcygnYnV0dG9uLW9wZW4nKQogICAgICAgICAgICB9KQogICAgICAgICAgICAkYXJpYXJwY2J1dHRvbl9iYXRjaGh0dHBsaW5rX2J1dHRvbi5jbGljayhiYXRjaENsaWNrKQoKICAgICAgICAgICAgbGV0ICR2ZXJzaW9uQnV0dG9uID0gJCgnPGEgc3R5bGU9ImNvbG9yOiAjRjI0QzQzOyIgY2xhc3M9ImctYnV0dG9uLW1lbnUiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIvL3IucGhvdG8uc3RvcmUucXEuY29tL3BzYz8vVjEyZG9pRzYySjl3N1EvcnVBTXNhNTNwVlFXTjdGTEs4OGk1dmp3eG1KeTJ2dEhqZWRnQWNYYWRZZ1liOWl2QWhUWlRaOU9BQVplN0wzV0gwMHRMN3BVZm9qSy4uVm9PVHhsaUlER2U0T1REc0d2SG81Q0U4cURZOGshL2ImYm89R0FFdEFSZ0JMUUVEQ1N3ISZyZj12aWV3ZXJfNC9yL195YWtlX3F6b25laW1nb3V0LnBuZyI+5Y+R546w5paw54mI5pysPC9hPicpOwoKICAgICAgICAgICAgJGRyb3Bkb3duYnV0dG9uX3NwYW4uYXBwZW5kKCRwY3NidXR0b24pLmFwcGVuZCgkYXJpYWRpcmVjdGJ1dHRvbikuYXBwZW5kKCRhcmlhcnBjYnV0dG9uKQogICAgICAgICAgICBpZiAoZ2V0VmFsdWUoJ3VwJykpIHsKICAgICAgICAgICAgICAgICRkcm9wZG93bmJ1dHRvbl9zcGFuLmFwcGVuZCgkdmVyc2lvbkJ1dHRvbikKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGRyb3Bkb3duYnV0dG9uLmFwcGVuZCgkZHJvcGRvd25idXR0b25fYSkuYXBwZW5kKCRkcm9wZG93bmJ1dHRvbl9zcGFuKQogICAgICAgICAgICAkZHJvcGRvd25idXR0b24uaG92ZXIoKCkgPT4gewogICAgICAgICAgICAgICAgJGRyb3Bkb3duYnV0dG9uLnRvZ2dsZUNsYXNzKCdidXR0b24tb3BlbicpCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICAkKCcuJyArIGNsYXNzTWFwWydsaXN0LXRvb2xzJ10pLmFwcGVuZCgkZHJvcGRvd25idXR0b24pCiAgICAgICAgICAgICQoJy4nICsgY2xhc3NNYXBbJ2xpc3QtdG9vbHMnXSkuY3NzKCdoZWlnaHQnLCAnNDBweCcpCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpc1N1cGVyVklQKCkgewogICAgICAgICAgICByZXR1cm4geXVuRGF0YS5JU1NWSVAgPT09IDEKICAgICAgICB9CgogICAgICAgIC8vIOaIkeeahOe9keebmCAtIOS4i+i9vQogICAgICAgIGZ1bmN0aW9uIGRvd25sb2FkQ2xpY2soZXZlbnQpIHsKICAgICAgICAgICAgc2VsZWN0RmlsZUxpc3QgPSBnZXRTZWxlY3RlZEZpbGUoKQogICAgICAgICAgICBjbG9nKCfpgInkuK3mlofku7bliJfooajvvJonLCBzZWxlY3RGaWxlTGlzdCkKICAgICAgICAgICAgbGV0IGlkID0gZXZlbnQudGFyZ2V0LmlkCiAgICAgICAgICAgIGxldCBkb3dubG9hZExpbmsKCiAgICAgICAgICAgIGlmIChpZCA9PSAnZG93bmxvYWQtZGlyZWN0JykgewogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVHlwZQogICAgICAgICAgICAgICAgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdEZpbGVMaXN0WzBdLmlzZGlyID09PSAxID8gZG93bmxvYWRUeXBlID0gJ2JhdGNoJyA6IGRvd25sb2FkVHlwZSA9ICdkbGluaycKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUeXBlID0gJ2JhdGNoJwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZpZF9saXN0ID0gZ2V0RmlkTGlzdChzZWxlY3RGaWxlTGlzdCkKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBnZXREb3dubG9hZExpbmtXaXRoUGFuQVBJKGRvd25sb2FkVHlwZSkKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXJybm8gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRUeXBlID09ICdkbGluaycpCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTGluayA9IHJlc3VsdC5kbGlua1swXS5kbGluawogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvd25sb2FkVHlwZSA9PSAnYmF0Y2gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTGluayA9IHJlc3VsdC5kbGluawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0RmlsZUxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rID0gZG93bmxvYWRMaW5rICsgJyZ6aXBuYW1lPScgKyBlbmNvZGVVUklDb21wb25lbnQoc2VsZWN0RmlsZUxpc3RbMF0uc2VydmVyX2ZpbGVuYW1lKSArICcuemlwJwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLmZhaWwKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXJybm8gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cuZGVsZXRlZAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5lcnJubyA9PSAxMTIpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudGltZW91dAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy5mYWlsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudW5zZWxlY3RlZAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cubW9yZXRoYW4KICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0RmlsZUxpc3RbMF0uaXNkaXIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy5kaXIKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlkID09ICdkb3dubG9hZC1hcGknKSB7CiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rID0gZ2V0RG93bmxvYWRMaW5rV2l0aFJFU1RBUElCYWlkdShzZWxlY3RGaWxlTGlzdFswXS5wYXRoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4ZWNEb3dubG9hZChkb3dubG9hZExpbmspCiAgICAgICAgfQoKICAgICAgICAvL+aIkeeahOe9keebmCAtIOaYvuekuumTvuaOpQogICAgICAgIGZ1bmN0aW9uIGxpbmtDbGljayhldmVudCkgewogICAgICAgICAgICBzZWxlY3RGaWxlTGlzdCA9IGdldFNlbGVjdGVkRmlsZSgpCiAgICAgICAgICAgIGNsb2coJ+mAieS4reaWh+S7tuWIl+ihqO+8micsIHNlbGVjdEZpbGVMaXN0KQogICAgICAgICAgICBsZXQgaWQgPSBldmVudC50YXJnZXQuaWQKICAgICAgICAgICAgbGV0IGxpbmtMaXN0LCB0aXAKCiAgICAgICAgICAgIGlmIChpZC5pbmRleE9mKCdkaXJlY3QnKSAhPSAtMSkgewogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVHlwZQogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkTGluawogICAgICAgICAgICAgICAgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0RmlsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0RmlsZUxpc3RbMF0uaXNkaXIgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVHlwZSA9ICdiYXRjaCcKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxlY3RGaWxlTGlzdFswXS5pc2RpciA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUeXBlID0gJ2RsaW5rJwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUeXBlID0gJ2JhdGNoJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmlkX2xpc3QgPSBnZXRGaWRMaXN0KHNlbGVjdEZpbGVMaXN0KQogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldERvd25sb2FkTGlua1dpdGhQYW5BUEkoZG93bmxvYWRUeXBlKQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJubyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkb3dubG9hZFR5cGUgPT0gJ2RsaW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rID0gcmVzdWx0LmRsaW5rWzBdLmRsaW5rCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZG93bmxvYWRUeXBlID09ICdiYXRjaCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvZygn6YCJ5Lit5paH5Lu25YiX6KGo77yaJywgc2VsZWN0RmlsZUxpc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTGluayA9IHJlc3VsdC5kbGluawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0RmlsZUxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rID0gZG93bmxvYWRMaW5rICsgJyZ6aXBuYW1lPScgKyBlbmNvZGVVUklDb21wb25lbnQoc2VsZWN0RmlsZUxpc3RbMF0uc2VydmVyX2ZpbGVuYW1lKSArICcuemlwJwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLmZhaWwKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXJybm8gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cuZGVsZXRlZAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5lcnJubyA9PSAxMTIpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudGltZW91dAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy5mYWlsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBodHRwbGluayA9IGRvd25sb2FkTGluay5yZXBsYWNlKC9eKFtBLVphLXpdKyk6LywgJ2h0dHA6JykKICAgICAgICAgICAgICAgIGxldCBodHRwc2xpbmsgPSBkb3dubG9hZExpbmsucmVwbGFjZSgvXihbQS1aYS16XSspOi8sICdodHRwczonKQogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gJycKICAgICAgICAgICAgICAgICQuZWFjaChzZWxlY3RGaWxlTGlzdCwgKGluZGV4LCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGVsZW1lbnQuc2VydmVyX2ZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBlbGVtZW50LnNlcnZlcl9maWxlbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgJywnICsgZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgbGlua0xpc3QgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIHVybHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAge3VybDogaHR0cGxpbmssIHJhbms6IDF9LAogICAgICAgICAgICAgICAgICAgICAgICB7dXJsOiBodHRwc2xpbmssIHJhbms6IDJ9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGlwID0gJ+aYvuekuueZvuW6pue9keebmOe9kemhteiOt+WPlueahOmTvuaOpe+8jOWPr+S7peS9v+eUqOWPs+mUrui/hembt+aIlklETeS4i+i9ve+8jOWkmuaWh+S7tuaJk+WMhSjpmZAzMDBrKeS4i+i9veeahOmTvuaOpeWPr+S7peebtOaOpeWkjeWItuS9v+eUqCcKICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKHt0aXRsZTogJ+S4i+i9vemTvuaOpScsIHR5cGU6ICdsaW5rJywgbGlzdDogbGlua0xpc3QsIHRpcDogdGlwfSkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudW5zZWxlY3RlZAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cubW9yZXRoYW4KICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0RmlsZUxpc3RbMF0uaXNkaXIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy5kaXIKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlkLmluZGV4T2YoJ2FwaScpICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkTGluayA9IGdldERvd25sb2FkTGlua1dpdGhSRVNUQVBJQmFpZHUoc2VsZWN0RmlsZUxpc3RbMF0ucGF0aCkKICAgICAgICAgICAgICAgICAgICBsZXQgaHR0cGxpbmsgPSBkb3dubG9hZExpbmsucmVwbGFjZSgvXihbQS1aYS16XSspOi8sICdodHRwOicpCiAgICAgICAgICAgICAgICAgICAgbGV0IGh0dHBzbGluayA9IGRvd25sb2FkTGluay5yZXBsYWNlKC9eKFtBLVphLXpdKyk6LywgJ2h0dHBzOicpCiAgICAgICAgICAgICAgICAgICAgbGlua0xpc3QgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBzZWxlY3RGaWxlTGlzdFswXS5zZXJ2ZXJfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVybHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt1cmw6IGh0dHBsaW5rLCByYW5rOiAxfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt1cmw6IGh0dHBzbGluaywgcmFuazogMn0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGlwID0gJ+aYvuekuuiOt+WPlueahOmTvuaOpSjkvb/nlKjnmb7luqbkupFJRCnvvIzlj6/ku6Xlj7PplK7kvb/nlKjov4Xpm7fmiJZJRE3kuIvovb3vvIznm7TmjqXlpI3liLbpk77mjqXml6DmlYgnCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLm9wZW4oe3RpdGxlOiAn5LiL6L296ZO+5o6lJywgdHlwZTogJ2xpbmsnLCBsaXN0OiBsaW5rTGlzdCwgdGlwOiB0aXB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDmiJHnmoTnvZHnm5ggLSDmibnph4/kuIvovb0KICAgICAgICBmdW5jdGlvbiBiYXRjaENsaWNrKGV2ZW50KSB7CiAgICAgICAgICAgIHNlbGVjdEZpbGVMaXN0ID0gZ2V0U2VsZWN0ZWRGaWxlKCkKICAgICAgICAgICAgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvZygn6YCJ5Lit5paH5Lu25YiX6KGo77yaJywgc2VsZWN0RmlsZUxpc3QpCiAgICAgICAgICAgIGxldCBpZCA9IGV2ZW50LnRhcmdldC5pZAogICAgICAgICAgICBsZXQgbGlua1R5cGUsIHRpcAogICAgICAgICAgICBsaW5rVHlwZSA9IGlkLmluZGV4T2YoJ2h0dHBzJykgPT0gLTEgPyAoaWQuaW5kZXhPZignaHR0cCcpID09IC0xID8gbG9jYXRpb24ucHJvdG9jb2wgKyAnOicgOiAnaHR0cDonKSA6ICdodHRwczonCiAgICAgICAgICAgIGJhdGNoTGlua0xpc3QgPSBbXQogICAgICAgICAgICBiYXRjaExpbmtMaXN0QWxsID0gW10KICAgICAgICAgICAgaWYgKGlkLmluZGV4T2YoJ2RpcmVjdCcpID4gMCkgeyAgLy/nm7Tpk77kuIvovb0KICAgICAgICAgICAgICAgIGJhdGNoTGlua0xpc3QgPSBnZXRQQ1NCYXRjaExpbmsobGlua1R5cGUpCiAgICAgICAgICAgICAgICBsZXQgdGlwID0gJ+eCueWHu+mTvuaOpeebtOaOpeS4i+i9ve+8jOiLpeS4i+i9veWksei0pe+8jOivt+WwneivleWFtuS7luaWueazleaIluWPguiAgyA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvYlI2diI+5bi46KeB6Zeu6aKYPC9hPicKICAgICAgICAgICAgICAgIGlmIChiYXRjaExpbmtMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKHt0aXRsZTogJ+ebtOmTvuS4i+i9vScsIHR5cGU6ICdiYXRjaCcsIGxpc3Q6IGJhdGNoTGlua0xpc3QsIHRpcDogdGlwLCBzaG93Y29weTogZmFsc2V9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZC5pbmRleE9mKCdwY3MnKSA+IDApIHsgIC8vUENT5LiL6L29CiAgICAgICAgICAgICAgICBnZXRQQ1NCYXRjaExpbmsoKGJhdGNoTGlua0xpc3QpID0+IHsKICAgICAgICAgICAgICAgICAgICBsZXQgdGlwID0gJ+eCueWHu+mTvuaOpeebtOaOpeS4i+i9ve+8jOiLpeS4i+i9veWksei0pe+8jOivt+WwneivleWFtuS7luaWueazleaIluWPguiAgyA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvYlI2diI+5bi46KeB6Zeu6aKYPC9hPuKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOiLpeebtOmTvuS4i+i9vemAn+W6puS4jeeQhuaDs++8jOivleivlei/meS4pOasvuaBkOaAlueahOeZvuW6pue9keebmOS4i+i9veWZqCA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvY3BxaCI+5LiL6L295Zmo5LiAPC9hPiA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvY3BxdCI+5LiL6L295Zmo5LqMPC9hPicKICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2hMaW5rTGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudW5zZWxlY3RlZAogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLm9wZW4oe3RpdGxlOiAnUENT5LiL6L29JywgdHlwZTogJ3BjcycsIGxpc3Q6IGJhdGNoTGlua0xpc3QsIHRpcDogdGlwLCBzaG93Y29weTogZmFsc2V9KQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaWQuaW5kZXhPZignYXJpYScpID4gMCkgeyAgLy9hcmlhQVBJ5LiL6L29CiAgICAgICAgICAgICAgICBnZXRQQ1NCYXRjaExpbmsoKGJhdGNoTGlua0xpc3QpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aXAgPSAn6K+35YWI5a6J6KOFIDxhICBocmVmPSJodHRwOi8vZHd6LmRhdGUvY2d4eCI+572R55uY5LiH6IO95Yqp5omLPC9hPiDor7flsIbpk77mjqXlpI3liLbliLDmlK/mjIFBcmlh55qE5LiL6L295Zmo5LitLCDmjqjojZDkvb/nlKggPGEgaHJlZj0iaHR0cHM6Ly93d3cubGFuem91aS5jb20vYjA0Z25yNW9mIj5YRG93bjwvYT7igJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJToi6Xnm7Tpk77kuIvovb3pgJ/luqbkuI3nkIbmg7PvvIzor5Xor5Xov5nkuKTmrL7mgZDmgJbnmoTnmb7luqbnvZHnm5jkuIvovb3lmaggPGEgaHJlZj0iaHR0cDovL2R3ei5kYXRlL2NwcWgiPuS4i+i9veWZqOS4gDwvYT4gPGEgaHJlZj0iaHR0cDovL2R3ei5kYXRlL2NwcXQiPuS4i+i9veWZqOS6jDwvYT4nCiAgICAgICAgICAgICAgICAgICAgaWYgKGJhdGNoTGlua0xpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLnVuc2VsZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKHt0aXRsZTogJ0FyaWHpk77mjqUnLCB0eXBlOiAnYmF0Y2hBcmlhJywgbGlzdDogYmF0Y2hMaW5rTGlzdCwgdGlwOiB0aXAsIHNob3djb3B5OiB0cnVlfSkKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlkLmluZGV4T2YoJ3JwYycpID4gMCkgeyAgLy9hcmlhQVBJ5LiL6L29CiAgICAgICAgICAgICAgICBnZXRQQ1NCYXRjaExpbmsoKGJhdGNoTGlua0xpc3QpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aXAgPSAn54K55Ye75oyJ6ZKu5Y+R6YCB6ZO+5o6l6IezQXJpYeS4i+i9veWZqOS4rTxhIGhyZWY9Imh0dHA6Ly90aW55dXJsLmNvbS95NjNreG5yeSI+6K+m57uG6K+05piOPC9hPu+8jOmcgOmFjeWQiOacgOaWsOeJiCA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvY2d4eCI+W+e9keebmOS4h+iDveWKqeaJi108L2E+77yM5pSv5oyB5pys5Zyw5ZKM6L+c56iL5LiL6L2977yM5q2k5Yqf6IO95bu66K6u6YWN5ZCI55m+5bqm5Lya5ZGY5L2/55So4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU4oCU6Iul55u06ZO+5LiL6L296YCf5bqm5LiN55CG5oOz77yM6K+V6K+V6L+Z5Lik5qy+5oGQ5oCW55qE55m+5bqm572R55uY5LiL6L295ZmoIDxhIGhyZWY9Imh0dHA6Ly9kd3ouZGF0ZS9jcHFoIj7kuIvovb3lmajkuIA8L2E+IDxhIGhyZWY9Imh0dHA6Ly9kd3ouZGF0ZS9jcHF0Ij7kuIvovb3lmajkuow8L2E+JwogICAgICAgICAgICAgICAgICAgIGlmIChiYXRjaExpbmtMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaWFsb2cub3Blbih7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQXJpYSBSUEMnLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmF0Y2hBcmlhUlBDJywKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDogYmF0Y2hMaW5rTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgdGlwOiB0aXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3djb3B5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd3JwYzogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZC5pbmRleE9mKCdhcGknKSA+IDApIHsgIC8vQVBJ5LiL6L29CiAgICAgICAgICAgICAgICBiYXRjaExpbmtMaXN0ID0gZ2V0QVBJQmF0Y2hMaW5rKGxpbmtUeXBlKQogICAgICAgICAgICAgICAgdGlwID0gJ+ivt+WFiOWuieijhSA8YSBocmVmPSJodHRwczovL3d3dy5iYWlkdXl1bi53aWtpL3poLWNuL2Fzc2lzdGFudC5odG1sIj7nvZHnm5jkuIfog73liqnmiYs8L2E+IDxiPnYyLjMuMTwvYj4g5ZCO54K55Ye76ZO+5o6l5LiL6L2977yM6Iul5LiL6L295aSx6LSl77yM6K+35byA5ZCvIDxhIGhyZWY9Imh0dHA6Ly9kd3ouZGF0ZS9iUjZ2IiB0YXJnZXQ9Il9ibGFuayI+5aSH55So6ZO+5o6lPC9hPicKICAgICAgICAgICAgICAgIGlmIChiYXRjaExpbmtMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKHt0aXRsZTogJ0FQSeS4i+i9vemTvuaOpScsIHR5cGU6ICdiYXRjaCcsIGxpc3Q6IGJhdGNoTGlua0xpc3QsIHRpcDogdGlwfSkKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy/miJHnmoTnvZHnm5ggLSDojrflj5ZBUEnkuIvovb3lnLDlnYAKICAgICAgICBmdW5jdGlvbiBnZXRBUElCYXRjaExpbmsobGlua1R5cGUpIHsKICAgICAgICAgICAgbGV0IGxpc3QgPSBbXQogICAgICAgICAgICAkLmVhY2goc2VsZWN0RmlsZUxpc3QsIChpbmRleCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNkaXIgPT0gMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZExpbmsKICAgICAgICAgICAgICAgIGRvd25sb2FkTGluayA9IGdldERvd25sb2FkQnlJZChlbGVtZW50LnBhdGgpCiAgICAgICAgICAgICAgICAvL2Rvd25sb2FkTGluayA9IGRvd25sb2FkTGluay5yZXBsYWNlKC9eKFtBLVphLXpdKyk6LywgbGlua1R5cGUpOwogICAgICAgICAgICAgICAgbGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogZWxlbWVudC5zZXJ2ZXJfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRsaW5rOiBkb3dubG9hZExpbmssCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KQogICAgICAgICAgICByZXR1cm4gbGlzdAogICAgICAgIH0KCiAgICAgICAgLy/miJHnmoTnvZHnm5ggLSDojrflj5ZQQ1PkuIvovb3lnLDlnYAKICAgICAgICBmdW5jdGlvbiBnZXRQQ1NCYXRjaExpbmsoY2FsbGJhY2spIHsKICAgICAgICAgICAgbGV0IGZzaWRzID0gW10KICAgICAgICAgICAgJC5lYWNoKHNlbGVjdEZpbGVMaXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzZGlyID09IDEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBmc2lkcy5wdXNoKGVsZW1lbnQuZnNfaWQpCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIGZzaWRzID0gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGZzaWRzKSkKICAgICAgICAgICAgbGV0IGxpbmsgPSBjbGllbnRBUElVcmwgKyBgeHBhbi9tdWx0aW1lZGlhP21ldGhvZD1maWxlbWV0YXMmYWNjZXNzX3Rva2VuPXVuZGVmaW5lZCZmc2lkcz0ke2ZzaWRzfSZkbGluaz0xYAogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IlVzZXItQWdlbnQiOiB1c2VyQWdlbnR9LAogICAgICAgICAgICAgICAgdXJsOiBsaW5rLAogICAgICAgICAgICAgICAgb25sb2FkOiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gcmVzLnJlc3BvbnNlCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm5vID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlLmxpc3QpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0U2lnbigpIHsKICAgICAgICAgICAgbGV0IHNpZ25GbmMKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHNpZ25GbmMgPSBuZXcgRnVuY3Rpb24oInJldHVybiAiICsgeXVuRGF0YS5zaWduMikoKQogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5tZXNzYWdlKQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBidG9hKHNpZ25GbmMoeXVuRGF0YS5zaWduNSwgeXVuRGF0YS5zaWduMSkpCiAgICAgICAgfQoKICAgICAgICAvL+eUn+aIkOS4i+i9veaXtueahGZpZF9saXN05Y+C5pWwCiAgICAgICAgZnVuY3Rpb24gZ2V0RmlkTGlzdChsaXN0KSB7CiAgICAgICAgICAgIGxldCBmaWRsaXN0ID0gbnVsbAogICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbAogICAgICAgICAgICBsZXQgZmlsZWlkbGlzdCA9IFtdCiAgICAgICAgICAgICQuZWFjaChsaXN0LCAoaW5kZXgsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIGZpbGVpZGxpc3QucHVzaChlbGVtZW50LmZzX2lkKQogICAgICAgICAgICB9KQogICAgICAgICAgICBmaWRsaXN0ID0gJ1snICsgZmlsZWlkbGlzdCArICddJwogICAgICAgICAgICByZXR1cm4gZmlkbGlzdAogICAgICAgIH0KCiAgICAgICAgLy/ojrflj5bnm7TmjqXkuIvovb3lnLDlnYAKICAgICAgICBmdW5jdGlvbiBnZXREb3dubG9hZExpbmtXaXRoUGFuQVBJKHR5cGUpIHsKICAgICAgICAgICAgbGV0IHJlc3VsdAogICAgICAgICAgICBsb2dpZCA9IGdldExvZ0lEKCkKICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gewogICAgICAgICAgICAgICAgYmRzdG9rZW46IGJkc3Rva2VuLAogICAgICAgICAgICAgICAgbG9naWQ6IGxvZ2lkLAogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7CiAgICAgICAgICAgICAgICBzaWduOiBzaWduLAogICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICBmaWRsaXN0OiBmaWRfbGlzdCwKICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGRvd25sb2FkVXJsID0gYGh0dHBzOi8vcGFuLmJhaWR1LmNvbS9hcGkvZG93bmxvYWQ/Y2xpZW50dHlwZT0xYAogICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgdXJsOiBkb3dubG9hZFVybCwKICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1zLAogICAgICAgICAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldERvd25sb2FkTGlua1dpdGhSRVNUQVBJQmFpZHUocGF0aCkgewogICAgICAgICAgICByZXR1cm4gcmVzdEFQSVVybCArICdmaWxlP21ldGhvZD1kb3dubG9hZCZwYXRoPScgKyBlbmNvZGVVUklDb21wb25lbnQocGF0aCkgKyAnJmFwcF9pZD0nICsgc2VjcmV0Q29kZQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RG93bmxvYWRCeUlkKHBhdGgpIHsKICAgICAgICAgICAgbGV0IHBhdGhzID0gW10KICAgICAgICAgICAgJC5lYWNoKGlkcywgKGluZGV4LCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHJlc3RBUElVcmwgKyAnZmlsZT9tZXRob2Q9ZG93bmxvYWQmcGF0aD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpICsgJyZhcHBfaWQ9JyArIGVsZW1lbnQpCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIHJldHVybiBwYXRocwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZXhlY0Rvd25sb2FkKGxpbmspIHsKICAgICAgICAgICAgJCgnI2hlbHBlcmRvd25sb2FkaWZyYW1lJykuYXR0cignc3JjJywgbGluaykKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUlmcmFtZSgpIHsKICAgICAgICAgICAgbGV0ICRkaXYgPSAkKCc8ZGl2IGNsYXNzPSJoZWxwZXItaGlkZSIgc3R5bGU9InBhZGRpbmc6MDttYXJnaW46MDtkaXNwbGF5OmJsb2NrIj48L2Rpdj4nKQogICAgICAgICAgICBsZXQgJGlmcmFtZSA9ICQoJzxpZnJhbWUgc3JjPSJqYXZhc2NyaXB0OjsiIGlkPSJoZWxwZXJkb3dubG9hZGlmcmFtZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9pZnJhbWU+JykKICAgICAgICAgICAgJGRpdi5hcHBlbmQoJGlmcmFtZSkKICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkZGl2KQoKICAgICAgICB9CiAgICB9CgogICAgLy/liIbkuqvpobXpnaLnmoTkuIvovb3liqnmiYsKICAgIGZ1bmN0aW9uIFBhblNoYXJlSGVscGVyKCkgewogICAgICAgIGxldCB5dW5EYXRhLCBzaWduLCB0aW1lc3RhbXAsIGJkc3Rva2VuLCBjaGFubmVsLCBjbGllbnR0eXBlLCB3ZWIsIGFwcF9pZCwgbG9naWQsIGVuY3J5cHQsIHByb2R1Y3QsIHVrLAogICAgICAgICAgcHJpbWFyeWlkLCBmaWRfbGlzdCwgZXh0cmEsIHNoYXJlaWQKICAgICAgICBsZXQgdmNvZGUKICAgICAgICBsZXQgc2hhcmVUeXBlLCBidXR0b25UYXJnZXQsIGRpYWxvZywgdmNvZGVEaWFsb2cKICAgICAgICBsZXQgc2VsZWN0RmlsZUxpc3QgPSBbXQogICAgICAgIGxldCBwYW5BUElVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0ICsgIi9hcGkvIgoKICAgICAgICB0aGlzLmluaXQgPSAoKSA9PiB7CiAgICAgICAgICAgIHl1bkRhdGEgPSB1bnNhZmVXaW5kb3cueXVuRGF0YQogICAgICAgICAgICBjbG9nKCfliJ3lp4vljJbkv6Hmga86JywgeXVuRGF0YSkKICAgICAgICAgICAgaWYgKHl1bkRhdGEgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY2xvZygn6aG16Z2i5pyq5q2j5bi45Yqg6L2977yM5oiW6ICF55m+5bqm5bey57uP5pu05paw77yBJykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXRWYXIoKQogICAgICAgICAgICBhZGRCdXR0b24oKQogICAgICAgICAgICBkaWFsb2cgPSBuZXcgRGlhbG9nKHthZGRDb3B5OiBmYWxzZX0pCiAgICAgICAgICAgIHZjb2RlRGlhbG9nID0gbmV3IFZDb2RlRGlhbG9nKHJlZnJlc2hWQ29kZSwgY29uZmlybUNsaWNrKQogICAgICAgICAgICBjcmVhdGVJZnJhbWUoKQogICAgICAgICAgICByZWdpc3RlckV2ZW50TGlzdGVuZXIoKQogICAgICAgICAgICBjbG9nKCfkuIvovb3liqnmiYvliqDovb3miJDlip/vvIHlvZPliY3niYjmnKzvvJonLCB2ZXJzaW9uKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaXNTdXBlclZJUCgpIHsKICAgICAgICAgICAgcmV0dXJuIHl1bkRhdGEuSVNTVklQID09PSAxCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpbml0VmFyKCkgewogICAgICAgICAgICBzaGFyZVR5cGUgPSBnZXRTaGFyZVR5cGUoKQogICAgICAgICAgICBzaWduID0geXVuRGF0YS5TSUdOCiAgICAgICAgICAgIHRpbWVzdGFtcCA9IHl1bkRhdGEuVElNRVNUQU1QCiAgICAgICAgICAgIGJkc3Rva2VuID0geXVuRGF0YS5NWUJEU1RPS0VOCiAgICAgICAgICAgIGNoYW5uZWwgPSAnY2h1bmxlaScKICAgICAgICAgICAgY2xpZW50dHlwZSA9IDAKICAgICAgICAgICAgd2ViID0gMQogICAgICAgICAgICBhcHBfaWQgPSBzZWNyZXRDb2RlCiAgICAgICAgICAgIGxvZ2lkID0gZ2V0TG9nSUQoKQogICAgICAgICAgICBlbmNyeXB0ID0gMAogICAgICAgICAgICBwcm9kdWN0ID0gJ3NoYXJlJwogICAgICAgICAgICBwcmltYXJ5aWQgPSB5dW5EYXRhLlNIQVJFX0lECiAgICAgICAgICAgIHVrID0geXVuRGF0YS5TSEFSRV9VSwoKICAgICAgICAgICAgaWYgKHNoYXJlVHlwZSA9PSAnc2VjcmV0JykgewogICAgICAgICAgICAgICAgZXh0cmEgPSBnZXRFeHRyYSgpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc1NpbmdsZVNoYXJlKCkpIHsKICAgICAgICAgICAgICAgIHNoYXJlaWQgPSB5dW5EYXRhLlNIQVJFX0lECiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldFNlbGN0ZWRGaWxlKCkgewogICAgICAgICAgICBpZiAoaXNTaW5nbGVTaGFyZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geXVuRGF0YS5GSUxFSU5GTwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoImRpc2stc2hhcmU6d2lkZ2V0L3BhZ2VNb2R1bGUvbGlzdC9saXN0SW5pdC5qcyIpLmdldENoZWNrZWRJdGVtcygpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8v5Yik5pat5YiG5Lqr57G75Z6L77yIcHVibGlj5oiW6ICFc2VjcmV077yJCiAgICAgICAgZnVuY3Rpb24gZ2V0U2hhcmVUeXBlKCkgewogICAgICAgICAgICByZXR1cm4geXVuRGF0YS5TSEFSRV9QVUJMSUMgPT09IDEgPyAncHVibGljJyA6ICdzZWNyZXQnCiAgICAgICAgfQoKICAgICAgICAvL+WIpOaWreaYr+WNleS4quaWh+S7tuWIhuS6q+i/mOaYr+aWh+S7tuWkueaIluiAheWkmuaWh+S7tuWIhuS6qwogICAgICAgIGZ1bmN0aW9uIGlzU2luZ2xlU2hhcmUoKSB7CiAgICAgICAgICAgIHJldHVybiB5dW5EYXRhLlNIQVJFUEFHRVRZUEUgPT09ICJzaW5nbGVfZmlsZV9wYWdlIgogICAgICAgIH0KCiAgICAgICAgLy/liKTmlq3mmK/lkKbkuLroh6rlt7HnmoTliIbkuqvpk77mjqUKICAgICAgICBmdW5jdGlvbiBpc1NlbGZTaGFyZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHl1bkRhdGEuTVlTRUxGID09PSAxCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRFeHRyYSgpIHsKICAgICAgICAgICAgbGV0IHNlS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldENvb2tpZSgnQkRDTE5EJykpCiAgICAgICAgICAgIHJldHVybiAneycgKyAnInNla2V5IjoiJyArIHNlS2V5ICsgJyInICsgIn0iCiAgICAgICAgfQoKICAgICAgICAvL+iOt+WPluW9k+WJjeebruW9lQogICAgICAgIGZ1bmN0aW9uIGdldFBhdGgoKSB7CiAgICAgICAgICAgIGxldCBoYXNoID0gbG9jYXRpb24uaGFzaAogICAgICAgICAgICBsZXQgcmVneCA9IG5ldyBSZWdFeHAoInBhdGg9KFteJl0qKSgmfCQpIiwgJ2knKQogICAgICAgICAgICBsZXQgcmVzdWx0ID0gaGFzaC5tYXRjaChyZWd4KQogICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdFsxXSkKICAgICAgICB9CgogICAgICAgIC8v5re75Yqg5LiL6L295Yqp5omL5oyJ6ZKuCiAgICAgICAgZnVuY3Rpb24gYWRkQnV0dG9uKCkgewogICAgICAgICAgICBpZiAoaXNTaW5nbGVTaGFyZSgpKSB7CiAgICAgICAgICAgICAgICAkKCdkaXYuc2xpZGUtc2hvdy1yaWdodCcpLmNzcygnd2lkdGgnLCAnNTAwcHgnKQogICAgICAgICAgICAgICAgJCgnZGl2LmZyYW1lLW1haW4nKS5jc3MoJ3dpZHRoJywgJzk2JScpCiAgICAgICAgICAgICAgICAkKCdkaXYuc2hhcmUtZmlsZS12aWV3ZXInKS5jc3MoJ3dpZHRoJywgJzc0MHB4JykuY3NzKCdtYXJnaW4tbGVmdCcsICdhdXRvJykuY3NzKCdtYXJnaW4tcmlnaHQnLCAnYXV0bycpCiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgJCgnZGl2LnNsaWRlLXNob3ctcmlnaHQnKS5jc3MoJ3dpZHRoJywgJzUwMHB4JykKICAgICAgICAgICAgbGV0ICRkcm9wZG93bmJ1dHRvbiA9ICQoJzxzcGFuIGNsYXNzPSJnLWRyb3Bkb3duLWJ1dHRvbiI+PC9zcGFuPicpCiAgICAgICAgICAgIGxldCAkZHJvcGRvd25idXR0b25fYSA9ICQoJzxhIGNsYXNzPSJnLWJ1dHRvbiIgc3R5bGU9IndpZHRoOiAxMTRweDsiIGRhdGEtYnV0dG9uLWlkPSJiMjAwIiBkYXRhLWJ1dHRvbi1pbmRleD0iMjAwIiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT4nKQogICAgICAgICAgICBsZXQgJGRyb3Bkb3duYnV0dG9uX2Ffc3BhbiA9ICQoJzxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+JykKICAgICAgICAgICAgbGV0ICRkcm9wZG93bmJ1dHRvbl9zcGFuID0gJCgnPHNwYW4gY2xhc3M9Im1lbnUiIHN0eWxlPSJ3aWR0aDphdXRvO3otaW5kZXg6NDEiPjwvc3Bhbj4nKQoKICAgICAgICAgICAgbGV0ICRkb3dubG9hZEJ1dHRvbiA9ICQoJzxhIGNsYXNzPSJnLWJ1dHRvbi1tZW51IiBocmVmPSJqYXZhc2NyaXB0OjsiPuebtOaOpeS4i+i9vTwvYT4nKQogICAgICAgICAgICBsZXQgJGxpbmtCdXR0b24gPSAkKCc8YSBjbGFzcz0iZy1idXR0b24tbWVudSIgaHJlZj0iamF2YXNjcmlwdDo7IiBkYXRhLXR5cGU9ImRvd24iPuaYvuekuumTvuaOpTwvYT4nKQogICAgICAgICAgICBsZXQgJGFyaWNMaW5rQnV0dG9uID0gJCgnPGEgY2xhc3M9ImctYnV0dG9uLW1lbnUiIGhyZWY9ImphdmFzY3JpcHQ6OyI+QXJpYeS4i+i9vTwvYT4nKQogICAgICAgICAgICBsZXQgJGFyaWNSUENCdXR0b24gPSAkKCc8YSBjbGFzcz0iZy1idXR0b24tbWVudSIgaHJlZj0iamF2YXNjcmlwdDo7IiBkYXRhLXR5cGU9InJwYyI+UlBD5LiL6L29PC9hPicpCiAgICAgICAgICAgIGxldCAkdmVyc2lvbkJ1dHRvbiA9ICQoJzxhIHN0eWxlPSJjb2xvcjogI0YyNEM0MzsiIGNsYXNzPSJnLWJ1dHRvbi1tZW51IiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93d3cuYmFpZHV5dW4ud2lraS9pbnN0YWxsLmh0bWwiPuWPkeeOsOaWsOeJiOacrDwvYT4nKTsKCiAgICAgICAgICAgICRkcm9wZG93bmJ1dHRvbl9zcGFuLmFwcGVuZCgkZG93bmxvYWRCdXR0b24pLmFwcGVuZCgkbGlua0J1dHRvbikuYXBwZW5kKCRhcmljTGlua0J1dHRvbikuYXBwZW5kKCRhcmljUlBDQnV0dG9uKQogICAgICAgICAgICAkZHJvcGRvd25idXR0b25fYS5hcHBlbmQoJGRyb3Bkb3duYnV0dG9uX2Ffc3BhbikKICAgICAgICAgICAgJGRyb3Bkb3duYnV0dG9uLmFwcGVuZCgkZHJvcGRvd25idXR0b25fYSkuYXBwZW5kKCRkcm9wZG93bmJ1dHRvbl9zcGFuKQoKICAgICAgICAgICAgaWYgKGdldFZhbHVlKCd1cCcpKSB7CiAgICAgICAgICAgICAgICAkZHJvcGRvd25idXR0b25fc3Bhbi5hcHBlbmQoJHZlcnNpb25CdXR0b24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRkcm9wZG93bmJ1dHRvbi5ob3ZlcigoKSA9PiB7CiAgICAgICAgICAgICAgICAkZHJvcGRvd25idXR0b24udG9nZ2xlQ2xhc3MoJ2J1dHRvbi1vcGVuJykKICAgICAgICAgICAgfSkKICAgICAgICAgICAgJGRvd25sb2FkQnV0dG9uLmNsaWNrKGRvd25sb2FkQnV0dG9uQ2xpY2spCiAgICAgICAgICAgICRhcmljUlBDQnV0dG9uLmNsaWNrKGxpbmtCdXR0b25DbGljaykKICAgICAgICAgICAgJGxpbmtCdXR0b24uY2xpY2sobGlua0J1dHRvbkNsaWNrKQogICAgICAgICAgICAkYXJpY0xpbmtCdXR0b24uY2xpY2soYXJpY2xpbmtCdXR0b25DbGljaykKCiAgICAgICAgICAgICQoJ2Rpdi5tb2R1bGUtc2hhcmUtdG9wLWJhciBkaXYuYmFyIGRpdi54LWJ1dHRvbi1ib3gnKS5hcHBlbmQoJGRyb3Bkb3duYnV0dG9uKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYXJpY2xpbmtCdXR0b25DbGljaygpIHsKICAgICAgICAgICAgc2VsZWN0RmlsZUxpc3QgPSBnZXRTZWxjdGVkRmlsZSgpCiAgICAgICAgICAgIGlmIChiZHN0b2tlbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bmxvZ2luCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvZygn6YCJ5Lit5paH5Lu25YiX6KGo77yaJywgc2VsZWN0RmlsZUxpc3QpCiAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudW5zZWxlY3RlZAogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdFswXS5pc2RpciA9PSAxKSB7CiAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLnRvb2JpZwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CgogICAgICAgICAgICBidXR0b25UYXJnZXQgPSAnYXJpY2xpbmsnCiAgICAgICAgICAgIGdldERvd25sb2FkTGluaygoZG93bmxvYWRMaW5rKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRMaW5rID09PSB1bmRlZmluZWQpIHJldHVybgoKICAgICAgICAgICAgICAgIGlmIChkb3dubG9hZExpbmsuZXJybm8gPT0gLTIwKSB7CiAgICAgICAgICAgICAgICAgICAgdmNvZGUgPSBnZXRWQ29kZSgpCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2Y29kZSB8fCB2Y29kZS5lcnJubyAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy53cm9uZ2NvZGUKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZjb2RlRGlhbG9nLm9wZW4odmNvZGUpCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvd25sb2FkTGluay5lcnJubyA9PSAxMTIpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudGltZW91dAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvd25sb2FkTGluay5lcnJubyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSAn6K+35YWI5a6J6KOFIDxhICBocmVmPSJodHRwOi8vZHd6LmRhdGUvY2d4eCI+572R55uY5LiH6IO95Yqp5omLPC9hPiDor7flsIbpk77mjqXlpI3liLbliLDmlK/mjIFBcmlh55qE5LiL6L295Zmo5LitLCDmjqjojZDkvb/nlKggPGEgIGhyZWY9Imh0dHBzOi8vd3d3LmxhbnpvdWkuY29tL2IwNGducjVvZiI+WERvd248L2E+JwogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfkuIvovb3pk77mjqXvvIjku4XmmL7npLrmlofku7bpk77mjqXvvIknLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hhcmVBcmlhTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IGRvd25sb2FkTGluay5saXN0LAogICAgICAgICAgICAgICAgICAgICAgICB0aXA6IHRpcCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd2NvcHk6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cuZmFpbAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjcmVhdGVJZnJhbWUoKSB7CiAgICAgICAgICAgIGxldCAkZGl2ID0gJCgnPGRpdiBjbGFzcz0iaGVscGVyLWhpZGUiIHN0eWxlPSJwYWRkaW5nOjA7bWFyZ2luOjA7ZGlzcGxheTpibG9jayI+PC9kaXY+JykKICAgICAgICAgICAgbGV0ICRpZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDo7IiBpZD0iaGVscGVyZG93bmxvYWRpZnJhbWUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPicpCiAgICAgICAgICAgICRkaXYuYXBwZW5kKCRpZnJhbWUpCiAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJGRpdikKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5hcmlhLXJwYycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5hZGRDbGFzcygnY2xpY2tlZCcpCiAgICAgICAgICAgICAgICBsZXQgbGluayA9IGUudGFyZ2V0LmRhdGFzZXQubGluawogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZS50YXJnZXQuZGF0YXNldC5maWxlbmFtZQoKICAgICAgICAgICAgICAgIGxldCB1cmwgPSBhcmlhUlBDLmRvbWFpbiArICI6IiArIGFyaWFSUEMucG9ydCArICcvanNvbnJwYycKICAgICAgICAgICAgICAgIGxldCBqc29uX3JwYyA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuOiIgKyBhcmlhUlBDLnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICBbbGlua10sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogYXJpYVJQQy5kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbJ1VzZXItQWdlbnQ6JyArIHVzZXJBZ2VudCwgJ0Nvb2tpZTogQkRVU1M9JyArIGdldEJEVVNTKCldCgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsiVXNlci1BZ2VudCI6IHVzZXJBZ2VudH0sCiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMzAwMCwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShqc29uX3JwYyksCiAgICAgICAgICAgICAgICAgICAgb25sb2FkOiAocmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3BvbnNlLnJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5Lu75Yqh5bey5Y+R6YCB6IezUlBD5LiL6L295ZmoJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHJlc3BvbnNlLnJlc3BvbnNlLm1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9udGltZW91dDogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+i/nuaOpeWIsFJQQ+acjeWKoeWZqOi2heaXtu+8jOivt+ajgOafpVJQQ+mFjee9ricKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCcucnBjLXNldHRpbmcnLChlKT0+ewogICAgICAgICAgICAgICAgcnBjU2V0dGluZygpCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsJy5zZW5kLWFsbCcsKGUpPT57CiAgICAgICAgICAgICAgICAkKCcuYXJpYS1ycGMnKS5jbGljaygpCiAgICAgICAgICAgICAgICAkKCcuZGlhbG9nJykuaGlkZSgpCiAgICAgICAgICAgICAgICAkKCcuZGlhbG9nLXNoYWRvdycpLmhpZGUoKQogICAgICAgICAgICB9KQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZG93bmxvYWRCdXR0b25DbGljaygpIHsKICAgICAgICAgICAgc2VsZWN0RmlsZUxpc3QgPSBnZXRTZWxjdGVkRmlsZSgpCiAgICAgICAgICAgIGlmIChiZHN0b2tlbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bmxvZ2luCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvZygn6YCJ5Lit5paH5Lu25YiX6KGo77yaJywgc2VsZWN0RmlsZUxpc3QpCiAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cudW5zZWxlY3RlZAogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLm1vcmV0aGFuCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxlY3RGaWxlTGlzdFswXS5pc2RpciA9PSAxKSB7CiAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLmRpcgogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1dHRvblRhcmdldCA9ICdkb3dubG9hZCcKICAgICAgICAgICAgZ2V0RG93bmxvYWRMaW5rKChkb3dubG9hZExpbmspID0+IHsKICAgICAgICAgICAgICAgIGlmIChkb3dubG9hZExpbmsgPT09IHVuZGVmaW5lZCkgcmV0dXJuCgogICAgICAgICAgICAgICAgaWYgKGRvd25sb2FkTGluay5lcnJubyA9PSAtMjApIHsKICAgICAgICAgICAgICAgICAgICB2Y29kZSA9IGdldFZDb2RlKCkKICAgICAgICAgICAgICAgICAgICBpZiAodmNvZGUuZXJybm8gIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cud3Jvbmdjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2Y29kZURpYWxvZy5vcGVuKHZjb2RlKQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3dubG9hZExpbmsuZXJybm8gPT0gMTEyKSB7CiAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLnRpbWVvdXQKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3dubG9hZExpbmsuZXJybm8gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRvd25sb2FkTGluay5saXN0WzBdLmRsaW5rCiAgICAgICAgICAgICAgICAgICAgZXhlY0Rvd25sb2FkKGxpbmspCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy5mYWlsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CgogICAgICAgIC8v6I635Y+W6aqM6K+B56CBCiAgICAgICAgZnVuY3Rpb24gZ2V0VkNvZGUoKSB7CiAgICAgICAgICAgIGxldCB1cmwgPSBwYW5BUElVcmwgKyAnZ2V0dmNvZGUnCiAgICAgICAgICAgIGxldCByZXN1bHQKICAgICAgICAgICAgbG9naWQgPSBnZXRMb2dJRCgpCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7CiAgICAgICAgICAgICAgICBwcm9kOiAncGFuJywKICAgICAgICAgICAgICAgIHQ6IE1hdGgucmFuZG9tKCksCiAgICAgICAgICAgICAgICBiZHN0b2tlbjogYmRzdG9rZW4sCiAgICAgICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsLAogICAgICAgICAgICAgICAgY2xpZW50dHlwZTogY2xpZW50dHlwZSwKICAgICAgICAgICAgICAgIHdlYjogd2ViLAogICAgICAgICAgICAgICAgYXBwX2lkOiBhcHBfaWQsCiAgICAgICAgICAgICAgICBsb2dpZDogbG9naWQKICAgICAgICAgICAgfQogICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1zLAogICAgICAgICAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgIH0KCiAgICAgICAgLy/liLfmlrDpqozor4HnoIEKICAgICAgICBmdW5jdGlvbiByZWZyZXNoVkNvZGUoKSB7CiAgICAgICAgICAgIHZjb2RlID0gZ2V0VkNvZGUoKQogICAgICAgICAgICAkKCcjZGlhbG9nLWltZycpLmF0dHIoJ3NyYycsIHZjb2RlLmltZykKICAgICAgICB9CgogICAgICAgIC8v6aqM6K+B56CB56Gu6K6k5o+Q5LqkCiAgICAgICAgZnVuY3Rpb24gY29uZmlybUNsaWNrKCkgewogICAgICAgICAgICBsZXQgdmFsID0gJCgnI2RpYWxvZy1pbnB1dCcpLnZhbCgpCiAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAkKCcjZGlhbG9nLWVycicpLnRleHQoJ+ivt+i+k+WFpemqjOivgeeggScpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwubGVuZ3RoIDwgNCkgewogICAgICAgICAgICAgICAgJCgnI2RpYWxvZy1lcnInKS50ZXh0KCfpqozor4HnoIHovpPlhaXplJnor6/vvIzor7fph43mlrDovpPlhaUnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0RG93bmxvYWRMaW5rV2l0aFZDb2RlKHZhbCwgKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJubyA9PSAtMjApIHsKICAgICAgICAgICAgICAgICAgICB2Y29kZURpYWxvZy5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgJCgnI2RpYWxvZy1lcnInKS50ZXh0KCfpqozor4HnoIHovpPlhaXplJnor6/vvIzor7fph43mlrDovpPlhaUnKQogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWQ29kZSgpCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2Y29kZSB8fCB2Y29kZS5lcnJubyAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy53cm9uZ2NvZGUKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZjb2RlRGlhbG9nLm9wZW4oKQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXJybm8gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICB2Y29kZURpYWxvZy5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvblRhcmdldCA9PSAnZG93bmxvYWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGlzdC5sZW5ndGggPiAxIHx8IHJlc3VsdC5saXN0WzBdLmlzZGlyID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cubW9yZXRoYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IHJlc3VsdC5saXN0WzBdLmRsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNEb3dubG9hZChsaW5rKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uVGFyZ2V0ID09ICdsaW5rJykgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlwID0gJ+eCueWHu+mTvuaOpeebtOaOpeS4i+i9ve+8jOivt+WFiOWNh+e6pyA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvY2d4eCI+W+e9keebmOS4h+iDveWKqeaJi108L2E+IOiHsyA8Yj52Mi4zLjE8L2I+77yI5Ye6546wNDAz6K+35bCd6K+V5YW25LuW5LiL6L295pa55rOV77yJJwogICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cub3Blbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+S4i+i9vemTvuaOpe+8iOS7heaYvuekuuaWh+S7tumTvuaOpe+8iScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hhcmVMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IHJlc3VsdC5saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwOiB0aXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Y29weTogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvblRhcmdldCA9PSAnYXJpY2xpbmsnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSAn6K+35YWI5a6J6KOFIDxhICBocmVmPSJodHRwOi8vZHd6LmRhdGUvY2d4eCI+572R55uY5LiH6IO95Yqp5omLPC9hPiDor7flsIbpk77mjqXlpI3liLbliLDmlK/mjIFBcmlh55qE5LiL6L295Zmo5LitLCDmjqjojZDkvb/nlKggPGEgIGhyZWY9Imh0dHBzOi8vd3d3LmxhbnpvdWkuY29tL2IwNGducjVvZiI+WERvd248L2E+JwogICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cub3Blbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+S4i+i9vemTvuaOpe+8iOS7heaYvuekuuaWh+S7tumTvuaOpe+8iScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hhcmVBcmlhTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0OiByZXN1bHQubGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcDogdGlwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd2NvcHk6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cuZmFpbAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQoKICAgICAgICAvL+eUn+aIkOS4i+i9veeUqOeahGZpZF9saXN05Y+C5pWwCiAgICAgICAgZnVuY3Rpb24gZ2V0RmlkTGlzdCgpIHsKICAgICAgICAgICAgbGV0IGZpZGxpc3QgPSBbXQogICAgICAgICAgICAkLmVhY2goc2VsZWN0RmlsZUxpc3QsIChpbmRleCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgZmlkbGlzdC5wdXNoKGVsZW1lbnQuZnNfaWQpCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIHJldHVybiAnWycgKyBmaWRsaXN0ICsgJ10nCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5rQnV0dG9uQ2xpY2soZSkgewogICAgICAgICAgICBzZWxlY3RGaWxlTGlzdCA9IGdldFNlbGN0ZWRGaWxlKCkKICAgICAgICAgICAgaWYgKGJkc3Rva2VuID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLnVubG9naW4KICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9nKCfpgInkuK3mlofku7bliJfooajvvJonLCBzZWxlY3RGaWxlTGlzdCkKICAgICAgICAgICAgaWYgKHNlbGVjdEZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bnNlbGVjdGVkCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGVjdEZpbGVMaXN0WzBdLmlzZGlyID09IDEpIHsKICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cuZGlyCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJ1dHRvblRhcmdldCA9ICdsaW5rJwogICAgICAgICAgICBnZXREb3dubG9hZExpbmsoKGRvd25sb2FkTGluaykgPT4gewogICAgICAgICAgICAgICAgaWYgKGRvd25sb2FkTGluayA9PT0gdW5kZWZpbmVkKSByZXR1cm4KCiAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRMaW5rLmVycm5vID09IC0yMCkgewogICAgICAgICAgICAgICAgICAgIHZjb2RlID0gZ2V0VkNvZGUoKQogICAgICAgICAgICAgICAgICAgIGlmICghdmNvZGUgfHwgdmNvZGUuZXJybm8gIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3JNc2cud3Jvbmdjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2Y29kZURpYWxvZy5vcGVuKHZjb2RlKQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3dubG9hZExpbmsuZXJybm8gPT0gMTEyKSB7CiAgICAgICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yTXNnLnRpbWVvdXQKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3dubG9hZExpbmsuZXJybm8gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuZGF0YXNldC50eXBlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlwID0gJ+eCueWHu+aMiemSruWPkemAgemTvuaOpeiHs0FyaWHkuIvovb3lmajkuK0gPGEgaHJlZj0iaHR0cDovL3Rpbnl1cmwuY29tL3k2M2t4bnJ5Ij7or6bnu4bor7TmmI48L2E+77yM6ZyA6YWN5ZCI5pyA5paw54mIIDxhIGhyZWY9Imh0dHA6Ly9kd3ouZGF0ZS9jZ3h4Ij5b572R55uY5LiH6IO95Yqp5omLXTwvYT7vvIzmlK/mjIHmnKzlnLDlkozov5znqIvkuIvovb0nCiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQXJpYSBSUEMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JwY0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDogZG93bmxvYWRMaW5rLmxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXA6IHRpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3djb3B5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dycGM6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlwID0gJ+eCueWHu+mTvuaOpeebtOaOpeS4i+i9ve+8jOivt+WFiOWNh+e6pyA8YSBocmVmPSJodHRwOi8vZHd6LmRhdGUvY2d4eCI+W+e9keebmOS4h+iDveWKqeaJi108L2E+IOiHsyA8Yj52Mi4zLjE8L2I+77yI5Ye6546wNDAz6K+35bCd6K+V5YW25LuW5LiL6L295pa55byP77yJJwogICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cub3Blbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+S4i+i9vemTvuaOpe+8iOS7heaYvuekuuaWh+S7tumTvuaOpe+8iScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hhcmVMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IGRvd25sb2FkTGluay5saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwOiB0aXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Y29weTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRvYXN0LmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy5mYWlsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CgogICAgICAgIC8v6I635Y+W5LiL6L296ZO+5o6lCiAgICAgICAgZnVuY3Rpb24gZ2V0RG93bmxvYWRMaW5rKGNiKSB7CiAgICAgICAgICAgIGlmIChiZHN0b2tlbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZy51bmxvZ2luCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHJlcwogICAgICAgICAgICBpZiAoaXNTaW5nbGVTaGFyZSkgewogICAgICAgICAgICAgICAgZmlkX2xpc3QgPSBnZXRGaWRMaXN0KCkKICAgICAgICAgICAgICAgIGxvZ2lkID0gZ2V0TG9nSUQoKQoKICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBuZXcgRm9ybURhdGEoKQogICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgnZW5jcnlwdCcsIGVuY3J5cHQpCiAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCdwcm9kdWN0JywgcHJvZHVjdCkKICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ3VrJywgdWspCiAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCdwcmltYXJ5aWQnLCBwcmltYXJ5aWQpCiAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCdmaWRfbGlzdCcsIGZpZF9saXN0KQoKICAgICAgICAgICAgICAgIGlmIChzaGFyZVR5cGUgPT0gJ3NlY3JldCcpIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCdleHRyYScsIGV4dHJhKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2FwaS9zaGFyZWRvd25sb2FkP3NpZ249JHtzaWdufSZ0aW1lc3RhbXA9JHt0aW1lc3RhbXB9KyZsb2dpZD0ke2xvZ2lkfSZjaGFubmVsPWNodW5sZWkmY2xpZW50dHlwZT0xMiZ3ZWI9MSZhcHBfaWQ9MjUwNTI4YCwKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2IoSlNPTi5wYXJzZShyZXMucmVzcG9uc2UpKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8v5pyJ6aqM6K+B56CB6L6T5YWl5pe26I635Y+W5LiL6L296ZO+5o6lCiAgICAgICAgZnVuY3Rpb24gZ2V0RG93bmxvYWRMaW5rV2l0aFZDb2RlKHZjb2RlSW5wdXQsIGNiKSB7CiAgICAgICAgICAgIGxldCByZXMKICAgICAgICAgICAgaWYgKGlzU2luZ2xlU2hhcmUpIHsKICAgICAgICAgICAgICAgIGZpZF9saXN0ID0gZ2V0RmlkTGlzdCgpCiAgICAgICAgICAgICAgICBsb2dpZCA9IGdldExvZ0lEKCkKCiAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCkKICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ2VuY3J5cHQnLCBlbmNyeXB0KQogICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgncHJvZHVjdCcsIHByb2R1Y3QpCiAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCd1aycsIHVrKQogICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgncHJpbWFyeWlkJywgcHJpbWFyeWlkKQogICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgnZmlkX2xpc3QnLCBmaWRfbGlzdCkKICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ3Zjb2RlX2lucHV0JywgdmNvZGVJbnB1dCkKICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ3Zjb2RlX3N0cicsIHZjb2RlLnZjb2RlKQoKICAgICAgICAgICAgICAgIGlmIChzaGFyZVR5cGUgPT0gJ3NlY3JldCcpIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCdleHRyYScsIGV4dHJhKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2FwaS9zaGFyZWRvd25sb2FkP3NpZ249JHtzaWdufSZ0aW1lc3RhbXA9JHt0aW1lc3RhbXB9KyZsb2dpZD0ke2xvZ2lkfSZjaGFubmVsPWNodW5sZWkmY2xpZW50dHlwZT0xMiZ3ZWI9MSZhcHBfaWQ9MjUwNTI4YCwKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2IoSlNPTi5wYXJzZShyZXMucmVzcG9uc2UpKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGV4ZWNEb3dubG9hZChsaW5rKSB7CiAgICAgICAgICAgIGNsb2coJ+S4i+i9vemTvuaOpe+8micgKyBsaW5rKQogICAgICAgICAgICBpZiAobGluaykgewogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOiB1c2VyQWdlbnQKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHVybDogbGluaywKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jYihKU09OLnBhcnNlKHJlcy5yZXNwb25zZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9HTV9vcGVuSW5UYWIobGluaywge2FjdGl2ZTogZmFsc2V9KTsKICAgICAgICAgICAgLy8kKCcjaGVscGVyZG93bmxvYWRpZnJhbWUnKS5hdHRyKCdzcmMnLCBsaW5rKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gUGFuUGx1Z2luKCkgewogICAgICAgIGNsb2coJ1JQQ++8micsIGFyaWFSUEMpCiAgICAgICAgdGhpcy5pbml0ID0gKCkgPT4gewogICAgICAgICAgICBtYWluKCkKICAgICAgICAgICAgYWRkR01TdHlsZSgpCiAgICAgICAgICAgIGNoZWNrVXBkYXRlKCkKICAgICAgICAgICAgaWYgKGdldFZhbHVlKCdTRVRUSU5HX0gnKSkgY3JlYXRlSGVscCgpCiAgICAgICAgICAgIGNyZWF0ZU1lbnUoKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbG9hZFBhbmhlbHBlcigpIHsKICAgICAgICAgICAgc3dpdGNoIChkZXRlY3RQYWdlKCkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2snOgogICAgICAgICAgICAgICAgY2FzZSAnb2F1dGgyLjAnOgogICAgICAgICAgICAgICAgICAgIGxldCBwYW5IZWxwZXIgPSBuZXcgUGFuSGVscGVyKCkKICAgICAgICAgICAgICAgICAgICBwYW5IZWxwZXIuaW5pdCgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBjYXNlICdzaGFyZSc6CiAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICBsZXQgcGFuU2hhcmVIZWxwZXIgPSBuZXcgUGFuU2hhcmVIZWxwZXIoKQogICAgICAgICAgICAgICAgICAgIHBhblNoYXJlSGVscGVyLmluaXQoKQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWRkR01TdHlsZSgpIHsKICAgICAgICAgICAgR01fYWRkU3R5bGUoYAogICAgICAgICAgICAgICAgLmRpYWxvZyAucm93IHtvdmVyZmxvdzogaGlkZGVuO3RleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO3doaXRlLXNwYWNlOiBub3dyYXA7fQogICAgICAgICAgICAgICAgLmRpYWxvZyAucm93IC51aS10aXRsZSB7d2lkdGg6IDE1MHB4O2Zsb2F0OiBsZWZ0O292ZXJmbG93OiBoaWRkZW47dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7fQogICAgICAgICAgICAgICAgLmRpYWxvZyAucm93IC51aS1saW5rIHttYXJnaW4tcmlnaHQ6IDIwcHg7fQogICAgICAgICAgICAgICAgLmRpYWxvZy1ib2R5IHttYXgtaGVpZ2h0OiA0NTBweDtvdmVyZmxvdy15OiBhdXRvO3BhZGRpbmc6IDAgMjBweDt9CiAgICAgICAgICAgICAgICAuZGlhbG9nLXRpcCB7cGFkZGluZzogMCAyMHB4O2JhY2tncm91bmQtY29sb3I6ICNmZmY7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNjNGRiZmU7Y29sb3I6ICNkYzM3M2M7fQogICAgICAgICAgICAgICAgLnRtLXNldHRpbmcge2Rpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6IDIwcHg7fQogICAgICAgICAgICAgICAgLnRtLWNoZWNrYm94IHt3aWR0aDogMTZweDtoZWlnaHQ6IDE2cHg7fQogICAgICAgICAgICAgICAgI2RpYWxvZy1jb3B5LWJ1dHRvbiB7d2lkdGg6IDEyMHB4O21hcmdpbjogNXB4IDEwcHggMTBweDtjdXJzb3I6IHBvaW50ZXI7YmFja2dyb3VuZDogI2NjMzIzNTtib3JkZXI6IG5vbmU7aGVpZ2h0OiAzMHB4O2NvbG9yOiAjZmZmO2JvcmRlci1yYWRpdXM6IDNweDt9CiAgICAgICAgICAgICAgICAjZGlhbG9nLXNlbmQtYnV0dG9uIHt3aWR0aDogMTIwcHg7bWFyZ2luOiA1cHggMTBweCAxMHB4O2N1cnNvcjogcG9pbnRlcjtiYWNrZ3JvdW5kOiAjY2MzMjM1O2JvcmRlcjogbm9uZTtoZWlnaHQ6IDMwcHg7Y29sb3I6ICNmZmY7Ym9yZGVyLXJhZGl1czogM3B4O30KICAgICAgICAgICAgICAgICNkaWFsb2ctcnBjLWJ1dHRvbiB7d2lkdGg6IDEyMHB4O21hcmdpbjogNXB4IDEwcHggMTBweDtjdXJzb3I6IHBvaW50ZXI7YmFja2dyb3VuZDogIzRlOTdmZjtib3JkZXI6IG5vbmU7aGVpZ2h0OiAzMHB4O2NvbG9yOiAjZmZmO2JvcmRlci1yYWRpdXM6IDNweDt9CiAgICAgICAgICAgICAgICAuZmxleC1jZW50ZXItYmV0d2VlbiB7ZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbn0KICAgICAgICAgICAgICAgIC5zd2FsMi1pbnB1dCB7aGVpZ2h0OjUwcHghaW1wb3J0YW50O21hcmdpbjoxMHB4IGF1dG8haW1wb3J0YW50O30KICAgICAgICAgICAgICAgIC5hcmlhLXJwYyB7IGJhY2tncm91bmQ6ICMwOUFBRkY7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogI2ZmZmZmZjsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDEycHg7IHBhZGRpbmc6IDJweCAxNXB4O291dGxpbmU6bm9uZTsgfQogICAgICAgICAgICAgICAgLmFyaWEtcnBjLmNsaWNrZWQgeyBiYWNrZ3JvdW5kOiAjODA4MDgwOyB9CiAgICAgICAgICAgIGApCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja1VwZGF0ZSgpIHsKICAgICAgICAgICAgc2V0VmFsdWUoJ3VwJywwKQogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuYmFpZHV5dW4ud2lraS91cGRhdGU/dmVyPSR7dmVyc2lvbn1gLAogICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IHIucmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSgnbGFzdGVzdF92ZXJzaW9uJywgcmVzLnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgdXNlckFnZW50ID0gcmVzLnVhCiAgICAgICAgICAgICAgICAgICAgaWRzID0gcmVzLmlkcwogICAgICAgICAgICAgICAgICAgIGlmIChyZXMudmNvZGUgPT09IDIwMCAmJiBjb21wYXJlVmVyc2lvbihyZXMudmVyc2lvbix2ZXJzaW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSgndXAnLDEpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc2NvZGUgIT0gZ2V0VmFsdWUoJ3Njb2RlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbSA9ICQoJzxkaXY+PGltZyBzdHlsZT0id2lkdGg6IDI1MHB4O21hcmdpbi1ib3R0b206IDEwcHg7IiBzcmM9Ii8vci5waG90by5zdG9yZS5xcS5jb20vcHNjPy9WMTJkb2lHNjJKOXc3US9ydUFNc2E1M3BWUVdON0ZMSzg4aTVuU3N3eEIzLmdxSnRFKlQ5Sk1hUE9ITGFhRDJGM2dRLm9XV1c2bUtyUHNLOTFvRSpSSio3T2ttUCozQmx6RENkUnZyaVF3cFEyY3Z1enFQdXhWd2VsSSEvYiZibz1XQUpZQWxnQ1dBSURDU3chJnJmPXZpZXdlcl80L3IvX3lha2VfcXpvbmVpbWdvdXQucG5nIj48aW5wdXQgY2xhc3M9InN3YWwyLWlucHV0IiBpZD0ic2NvZGUiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLovpPlhaXkuIrmlrnmlbDlrZfljbPlj6/pg6jnvbLmiJDlip/vvIEiPjwvZGl2PicpCiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogIuWIneasoeS9v+eUqOivt+i+k+WFpeaal+WPtyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sOiBkb21bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicKICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnNjb2RlID09ICQoJyNzY29kZScpLnZhbCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoJ3Njb2RlJywgcmVzLnNjb2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKCdpbml0JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAn5pqX5Y+35q2j56Gu77yM5q2j5Zyo5Yid5aeL5YyW5Lit44CC44CC44CCJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKCdpbml0JywgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogIvCflLrwn5S68J+UuiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICfmmpflj7fkuI3mraPnoa7vvIzor7fpgJrov4flvq7kv6HmiavnoIHlhY3otLnojrflj5YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVVybDogJy8vci5waG90by5zdG9yZS5xcS5jb20vcHNjPy9WMTJkb2lHNjJKOXc3US9ydUFNc2E1M3BWUVdON0ZMSzg4aTVuU3N3eEIzLmdxSnRFKlQ5Sk1hUE9ITGFhRDJGM2dRLm9XV1c2bUtyUHNLOTFvRSpSSio3T2ttUCozQmx6RENkUnZyaVF3cFEyY3Z1enFQdXhWd2VsSSEvYiZibz1XQUpZQWxnQ1dBSURDU3chJnJmPXZpZXdlcl80L3IvX3lha2VfcXpvbmVpbWdvdXQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRQYW5oZWxwZXIoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uKGEsYikgewogICAgICAgICAgICByZXR1cm4gKGEucmVwbGFjZSgvXC4vZywnJykgLSBiLnJlcGxhY2UoL1wuL2csJycpKSA+IDAKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUhlbHAoKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRvcGJhciA9ICQoJy4nICsgY2xhc3NNYXBbJ2hlYWRlciddKQogICAgICAgICAgICAgICAgbGV0IHRvcHRlbXAgPSAkKCc8c3BhbiBjbGFzcz0iY01FTUVGIiBub2RlLXR5cGU9ImhlbHAtYXV0aG9yIiBzdHlsZT0ib3BhY2l0eTogLjUiID48YSBocmVmPSIvL3IucGhvdG8uc3RvcmUucXEuY29tL3BzYz8vVjEyZG9pRzYySjl3N1EvcnVBTXNhNTNwVlFXTjdGTEs4OGk1dmp3eG1KeTJ2dEhqZWRnQWNYYWRZZ1liOWl2QWhUWlRaOU9BQVplN0wzV0gwMHRMN3BVZm9qSy4uVm9PVHhsaUlER2U0T1REc0d2SG81Q0U4cURZOGshL2ImYm89R0FFdEFSZ0JMUUVEQ1N3ISZyZj12aWV3ZXJfNC9yL195YWtlX3F6b25laW1nb3V0LnBuZyIgdGFyZ2V0PSJfYmxhbmsiPuaVmeeoizwvYT48aSBjbGFzcz0iZmluZC1saWdodC1pY29uIiBzdHlsZT0iZGlzcGxheTogaW5saW5lO2JhY2tncm91bmQtY29sb3I6ICMwMDlmZTg7Ij48L2k+PC9zcGFuPicpCiAgICAgICAgICAgICAgICB0b3BiYXIuYXBwZW5kKHRvcHRlbXApCiAgICAgICAgICAgIH0sIDUwMDApCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjcmVhdGVNZW51KCkgewogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCforr7nva4nLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0VmFsdWUoJ1NFVFRJTkdfSCcpID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSgnU0VUVElOR19IJywgdHJ1ZSkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZ2V0VmFsdWUoJ1NFVFRJTkdfQicpID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSgnU0VUVElOR19CJywgZmFsc2UpCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGRvbSA9ICcnCiAgICAgICAgICAgICAgICBpZiAoZ2V0VmFsdWUoJ1NFVFRJTkdfQicpKSB7CiAgICAgICAgICAgICAgICAgICAgZG9tICs9ICc8bGFiZWwgY2xhc3M9InRtLXNldHRpbmciPuW8gOWQr+Wkh+eUqOmTvuaOpTxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlMtQiIgY2hlY2tlZCBjbGFzcz0idG0tY2hlY2tib3giPjwvbGFiZWw+JwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb20gKz0gJzxsYWJlbCBjbGFzcz0idG0tc2V0dGluZyI+5byA5ZCv5aSH55So6ZO+5o6lPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iUy1CIiBjbGFzcz0idG0tY2hlY2tib3giPjwvbGFiZWw+JwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGdldFZhbHVlKCdTRVRUSU5HX0gnKSkgewogICAgICAgICAgICAgICAgICAgIGRvbSArPSAnPGxhYmVsIGNsYXNzPSJ0bS1zZXR0aW5nIj7lvIDlkK/mlZnnqIs8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJTLUgiIGNoZWNrZWQgY2xhc3M9InRtLWNoZWNrYm94Ij48L2xhYmVsPicKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9tICs9ICc8bGFiZWwgY2xhc3M9InRtLXNldHRpbmciPuW8gOWQr+aVmeeoizxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlMtSCIgY2xhc3M9InRtLWNoZWNrYm94Ij48L2xhYmVsPicKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvbSA9ICc8ZGl2PicgKyBkb20gKyAnPC9kaXY+JwogICAgICAgICAgICAgICAgbGV0ICRkb20gPSAkKGRvbSkKICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfohJrmnKzphY3nva4nLAogICAgICAgICAgICAgICAgICAgIGh0bWw6ICRkb21bMF0sCiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfkv53lrZgnCiAgICAgICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHsKICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LmdvKDApCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJyNTLUInLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBzZXRWYWx1ZSgnU0VUVElOR19CJywgJCh0aGlzKVswXS5jaGVja2VkKQogICAgICAgICAgICB9KQogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJyNTLUgnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBzZXRWYWx1ZSgnU0VUVElOR19IJywgJCh0aGlzKVswXS5jaGVja2VkKQogICAgICAgICAgICB9KQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbWFpbigpIHsKICAgICAgICAgICAgc2V0VmFsdWUoJ2N1cnJlbnRfdmVyc2lvbicsIHZlcnNpb24pCgogICAgICAgICAgICAvL+ino+WGs2h0dHBz5peg5rOV5Yqg6L29aHR0cOi1hOa6kOeahOmXrumimAogICAgICAgICAgICBsZXQgb01ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJykKICAgICAgICAgICAgb01ldGEuaHR0cEVxdWl2ID0gJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JwogICAgICAgICAgICBvTWV0YS5jb250ZW50ID0gJ3VwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMnCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQob01ldGEpCgogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY29udGV4dG1lbnUnLCAnLmFyaWEtbGluaycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9KQoKICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ21vdXNlZG93bicsICcuYXJpYS1saW5rJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBkZWNvZGVVUklDb21wb25lbnQoJCh0aGlzKS50ZXh0KCkpCiAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQobGluaywgJ3RleHQnKQogICAgICAgICAgICAgICAgVG9hc3QuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgIHRleHQ6ICflt7LlsIbpk77mjqXlpI3liLbliLDliarotLTmnb/vvIEnCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLnNoYXJlLWRvd25sb2FkJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmlubmVyVGV4dCkgewogICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsiVXNlci1BZ2VudCI6IHVzZXJBZ2VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogZS50YXJnZXQuaW5uZXJUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vR01fb3BlbkluVGFiKHJlcy5maW5hbFVybCwge2FjdGl2ZTogZmFsc2V9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLnBjcy1saW5rJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZS50YXJnZXQuZGF0YXNldC5saW5rCiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiAobGluaykgewogICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiSEVBRCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsiVXNlci1BZ2VudCI6IHVzZXJBZ2VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbGluaywKICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWwgPSByZXMuZmluYWxVcmwucmVwbGFjZSgnaHR0cHMnLCAiaHR0cCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kb3dubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBmaW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IlVzZXItQWdlbnQiOiB1c2VyQWdlbnR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVBczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0KICAgIH0KCiAgICAkKCgpID0+IHsKICAgICAgICAvL+mYu+atouWcqOWFtuS7lue9keermei/kOihjAogICAgICAgIGlmIChob3N0bmFtZS5tYXRjaCgvKHBhbnx5dW4pLmJhaWR1LmNvbS9pKSkgewogICAgICAgICAgICBsZXQgcGx1Z2luID0gbmV3IFBhblBsdWdpbigpCiAgICAgICAgICAgIHBsdWdpbi5pbml0KCkKICAgICAgICB9CiAgICB9KQp9KSgpCg==","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js","ts":1599018175772,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My4yLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO3ZhciBjPVtdLGQ9YS5kb2N1bWVudCxlPU9iamVjdC5nZXRQcm90b3R5cGVPZixmPWMuc2xpY2UsZz1jLmNvbmNhdCxoPWMucHVzaCxpPWMuaW5kZXhPZixqPXt9LGs9ai50b1N0cmluZyxsPWouaGFzT3duUHJvcGVydHksbT1sLnRvU3RyaW5nLG49bS5jYWxsKE9iamVjdCksbz17fTtmdW5jdGlvbiBwKGEsYil7Yj1ifHxkO3ZhciBjPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50ZXh0PWEsYi5oZWFkLmFwcGVuZENoaWxkKGMpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9dmFyIHE9IjMuMi4xIixyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyByLmZuLmluaXQoYSxiKX0scz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdD0vXi1tcy0vLHU9Ly0oW2Etel0pL2csdj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O3IuZm49ci5wcm90b3R5cGU9e2pxdWVyeTpxLGNvbnN0cnVjdG9yOnIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBmLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9mLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPXIubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiByLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhyLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoYTwwP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmM8Yj9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LHIuZXh0ZW5kPXIuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxyLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2g8aTtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYoci5pc1BsYWluT2JqZWN0KGQpfHwoZT1BcnJheS5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZBcnJheS5pc0FycmF5KGMpP2M6W10pOmY9YyYmci5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1yLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sci5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKHErTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PXIudHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3ZhciBiPXIudHlwZShhKTtyZXR1cm4oIm51bWJlciI9PT1ifHwic3RyaW5nIj09PWIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiEoIWF8fCJbb2JqZWN0IE9iamVjdF0iIT09ay5jYWxsKGEpKSYmKCEoYj1lKGEpKXx8KGM9bC5jYWxsKGIsImNvbnN0cnVjdG9yIikmJmIuY29uc3RydWN0b3IsImZ1bmN0aW9uIj09dHlwZW9mIGMmJm0uY2FsbChjKT09PW4pKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErIiI6Im9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYT9qW2suY2FsbChhKV18fCJvYmplY3QiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3AoYSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHQsIm1zLSIpLnJlcGxhY2UodSx2KX0sZWFjaDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtpZih3KGEpKXtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVha31lbHNlIGZvcihkIGluIGEpaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKHMsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHcoT2JqZWN0KGEpKT9yLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpoLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/LTE6aS5jYWxsKGIsYSxjKX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO2Q8YztkKyspYVtlKytdPWJbZF07cmV0dXJuIGEubGVuZ3RoPWUsYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGU9W10sZj0wLGc9YS5sZW5ndGgsaD0hYztmPGc7ZisrKWQ9IWIoYVtmXSxmKSxkIT09aCYmZS5wdXNoKGFbZl0pO3JldHVybiBlfSxtYXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj0wLGg9W107aWYodyhhKSlmb3IoZD1hLmxlbmd0aDtmPGQ7ZisrKWU9YihhW2ZdLGYsYyksbnVsbCE9ZSYmaC5wdXNoKGUpO2Vsc2UgZm9yKGYgaW4gYSllPWIoYVtmXSxmLGMpLG51bGwhPWUmJmgucHVzaChlKTtyZXR1cm4gZy5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2lmKCJzdHJpbmciPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxyLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQ9Zi5jYWxsKGFyZ3VtZW50cywyKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxkLmNvbmNhdChmLmNhbGwoYXJndW1lbnRzKSkpfSxlLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8ci5ndWlkKyssZX0sbm93OkRhdGUubm93LHN1cHBvcnQ6b30pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihyLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxyLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7alsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB3KGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPXIudHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iIT09YyYmIXIuaXNXaW5kb3coYSkmJigiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYSl9dmFyIHg9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEQ9W10sRT1ELnBvcCxGPUQucHVzaCxHPUQucHVzaCxIPUQuc2xpY2UsST1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEs9IltcXHgyMFxcdFxcclxcblxcZl0iLEw9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixNPSJcXFsiK0srIiooIitMKyIpKD86IitLKyIqKFsqXiR8IX5dPz0pIitLKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTCsiKSl8KSIrSysiKlxcXSIsTj0iOigiK0wrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK00rIikqKXwuKilcXCl8KSIsTz1uZXcgUmVnRXhwKEsrIisiLCJnIiksUD1uZXcgUmVnRXhwKCJeIitLKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0srIiskIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrSysiKiwiK0srIioiKSxSPW5ldyBSZWdFeHAoIl4iK0srIiooWz4rfl18IitLKyIpIitLKyIqIiksUz1uZXcgUmVnRXhwKCI9IitLKyIqKFteXFxdJ1wiXSo/KSIrSysiKlxcXSIsImciKSxUPW5ldyBSZWdFeHAoTiksVT1uZXcgUmVnRXhwKCJeIitMKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitMKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0wrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0wrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitNKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitLKyI/fCgiK0srIil8LikiLCJpZyIpLGFhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6ZDwwP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxiYT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxjYT1mdW5jdGlvbihhLGIpe3JldHVybiBiPyJcMCI9PT1hPyJcdWZmZmQiOmEuc2xpY2UoMCwtMSkrIlxcIithLmNoYXJDb2RlQXQoYS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2F9LGRhPWZ1bmN0aW9uKCl7bSgpfSxlYT10YShmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwJiYoImZvcm0iaW4gYXx8ImxhYmVsImluIGEpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0cuYXBwbHkoRD1ILmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLERbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0c9e2FwcGx5OkQubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ri5hcHBseShhLEguY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHM9YiYmYi5vd25lckRvY3VtZW50LHc9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09dyYmOSE9PXcmJjExIT09dylyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXcmJihsPVouZXhlYyhhKSkpaWYoZj1sWzFdKXtpZig5PT09dyl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHMmJihqPXMuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKGxbMl0pcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPWxbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gRy5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09dylzPWIscj1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShiYSxjYSk6Yi5zZXRBdHRyaWJ1dGUoImlkIixrPXUpLG89ZyhhKSxoPW8ubGVuZ3RoO3doaWxlKGgtLSlvW2hdPSIjIitrKyIgIitzYShvW2hdKTtyPW8uam9pbigiLCIpLHM9JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxifWlmKHIpdHJ5e3JldHVybiBHLmFwcGx5KGQscy5xdWVyeVNlbGVjdG9yQWxsKHIpKSxkfWNhdGNoKHgpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShQLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1jLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiZhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImZvcm0iaW4gYj9iLnBhcmVudE5vZGUmJmIuZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gYj8ibGFiZWwiaW4gYi5wYXJlbnROb2RlP2IucGFyZW50Tm9kZS5kaXNhYmxlZD09PWE6Yi5kaXNhYmxlZD09PWE6Yi5pc0Rpc2FibGVkPT09YXx8Yi5pc0Rpc2FibGVkIT09IWEmJmVhKGIpPT09YTpiLmRpc2FibGVkPT09YToibGFiZWwiaW4gYiYmYi5kaXNhYmxlZD09PWF9fWZ1bmN0aW9uIHBhKGEpe3JldHVybiBpYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixpYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1nYS5zdXBwb3J0PXt9LGY9Z2EuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhYiYmIkhUTUwiIT09Yi5ub2RlTmFtZX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSx2IT09biYmKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVkudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19LGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjLGQsZSxmPWIuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZil7aWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdO2U9Yi5nZXRFbGVtZW50c0J5TmFtZShhKSxkPTA7d2hpbGUoZj1lW2QrK10paWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdfXJldHVybltdfX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnApcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKX0scj1bXSxxPVtdLChjLnFzYT1ZLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrSysiKlsqXiR8IX5dPz0iKSwyIT09YS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmcS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLG8uYXBwZW5kQ2hpbGQoYSkuZGlzYWJsZWQ9ITAsMiE9PWEucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVkudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiKiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixOKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9WS50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8WS50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09bnx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1ufHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0koayxhKS1JKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsZz1bYV0saD1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09bj8tMTpiPT09bj8xOmU/LTE6Zj8xOms/SShrLGEpLUkoayxiKTowO2lmKGU9PT1mKXJldHVybiBsYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSlnLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTt3aGlsZShnW2RdPT09aFtkXSlkKys7cmV0dXJuIGQ/bGEoZ1tkXSxoW2RdKTpnW2RdPT09dj8tMTpoW2RdPT09dj8xOjB9LG4pOm59LGdhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ2EoYSxudWxsLG51bGwsYil9LGdhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShTLCI9JyQxJ10iKSxjLm1hdGNoZXNTZWxlY3RvciYmcCYmIUFbYisiICJdJiYoIXJ8fCFyLnRlc3QoYikpJiYoIXF8fCFxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZDLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoYmEsY2EpfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKF8sYWEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKF8sYWEpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxnYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZnYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVi5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZULnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0srIikiK2ErIigiK0srInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjohYnx8KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShPLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iJiYoZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxnYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2lhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1JKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmlhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFt1XT9pYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZ2EoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczppYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoXyxhYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6b2EoITEpLGRpc2FibGVkOm9hKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6cGEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnBhKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpwYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuW2M8MD9jK2I6Y119KSxldmVuOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6cGEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1jPDA/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpwYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bWEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bmEoYik7ZnVuY3Rpb24gcmEoKXt9cmEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyByYSxnPWdhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1RLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1SLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFAsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1WW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBzYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7YjxjO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHRhKGEsYixjKXt2YXIgZD1iLmRpcixlPWIubmV4dCxmPWV8fGQsZz1jJiYicGFyZW50Tm9kZSI9PT1mLGg9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxlKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGcpcmV0dXJuIGEoYixjLGUpO3JldHVybiExfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG09W3csaF07aWYoaSl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZykmJmEoYixjLGkpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxnKWlmKGw9Ylt1XXx8KGJbdV09e30pLGs9bFtiLnVuaXF1ZUlEXXx8KGxbYi51bmlxdWVJRF09e30pLGUmJmU9PT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpYj1iW2RdfHxiO2Vsc2V7aWYoKGo9a1tmXSkmJmpbMF09PT13JiZqWzFdPT09aClyZXR1cm4gbVsyXT1qWzJdO2lmKGtbZl09bSxtWzJdPWEoYixjLGkpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB1YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB2YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB3YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtoPGk7aCsrKShmPWFbaF0pJiYoYyYmIWMoZixkLGUpfHwoZy5wdXNoKGYpLGomJmIucHVzaChoKSkpO3JldHVybiBnfWZ1bmN0aW9uIHhhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXhhKGQpKSxlJiYhZVt1XSYmKGU9eGEoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dmEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6d2EocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXdhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj13YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6Ry5hcHBseShnLHIpfSl9ZnVuY3Rpb24geWEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz10YShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9dGEoZnVuY3Rpb24oYSl7cmV0dXJuIEkoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2k8ZjtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bdGEodWEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7ZTxmO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHhhKGk+MSYmdWEobSksaT4xJiZzYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxpPGUmJnlhKGEuc2xpY2UoaSxlKSksZTxmJiZ5YShhPWEuc2xpY2UoZSkpLGU8ZiYmc2EoYSkpfW0ucHVzaChjKX1yZXR1cm4gdWEobSl9ZnVuY3Rpb24gemEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109RS5jYWxsKGkpKTt1PXdhKHUpfUcuYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eWEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHphKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsaSxqLGssbCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG49IWUmJmcoYT1tLnNlbGVjdG9yfHxhKTtpZihjPWN8fFtdLDE9PT1uLmxlbmd0aCl7aWYoaT1uWzBdPW5bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShfLGFhKSxiKXx8W10pWzBdLCFiKXJldHVybiBjO20mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGkuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWY9Vi5uZWVkc0NvbnRleHQudGVzdChhKT8wOmkubGVuZ3RoO3doaWxlKGYtLSl7aWYoaj1pW2ZdLGQucmVsYXRpdmVbaz1qLnR5cGVdKWJyZWFrO2lmKChsPWQuZmluZFtrXSkmJihlPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoXyxhYSksJC50ZXN0KGlbMF0udHlwZSkmJnFhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoaS5zcGxpY2UoZiwxKSxhPWUubGVuZ3RoJiZzYShpKSwhYSlyZXR1cm4gRy5hcHBseShjLGUpLGM7YnJlYWt9fX1yZXR1cm4obXx8aChhLG4pKShlLGIsIXAsYywhYnx8JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxiKSxjfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtpZighYylyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7aWYoIWMmJiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEosZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFjKXJldHVybiBhW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTtyLmZpbmQ9eCxyLmV4cHI9eC5zZWxlY3RvcnMsci5leHByWyI6Il09ci5leHByLnBzZXVkb3Msci51bmlxdWVTb3J0PXIudW5pcXVlPXgudW5pcXVlU29ydCxyLnRleHQ9eC5nZXRUZXh0LHIuaXNYTUxEb2M9eC5pc1hNTCxyLmNvbnRhaW5zPXguY29udGFpbnMsci5lc2NhcGVTZWxlY3Rvcj14LmVzY2FwZTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmcihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LEE9ci5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBCKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX12YXIgQz0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaSxEPS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gRShhLGIsYyl7cmV0dXJuIHIuaXNGdW5jdGlvbihiKT9yLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTpiLm5vZGVUeXBlP3IuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KToic3RyaW5nIiE9dHlwZW9mIGI/ci5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGkuY2FsbChiLGEpPi0xIT09Y30pOkQudGVzdChiKT9yLmZpbHRlcihiLGEsYyk6KGI9ci5maWx0ZXIoYixhKSxyLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gaS5jYWxsKGIsYSk+LTEhPT1jJiYxPT09YS5ub2RlVHlwZX0pKX1yLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9yLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOnIuZmluZC5tYXRjaGVzKGEsci5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxyLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5sZW5ndGgsZT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2socihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYoci5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihjPXRoaXMucHVzaFN0YWNrKFtdKSxiPTA7YjxkO2IrKylyLmZpbmQoYSxlW2JdLGMpO3JldHVybiBkPjE/ci51bmlxdWVTb3J0KGMpOmN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhRSh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmQS50ZXN0KGEpP3IoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgRixHPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC8sSD1yLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxGLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hWzBdJiYiPiI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOkcuZXhlYyhhKSwhZXx8IWVbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxjKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihlWzFdKXtpZihiPWIgaW5zdGFuY2VvZiByP2JbMF06YixyLm1lcmdlKHRoaXMsci5wYXJzZUhUTUwoZVsxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpkLCEwKSksQy50ZXN0KGVbMV0pJiZyLmlzUGxhaW5PYmplY3QoYikpZm9yKGUgaW4gYilyLmlzRnVuY3Rpb24odGhpc1tlXSk/dGhpc1tlXShiW2VdKTp0aGlzLmF0dHIoZSxiW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gZj1kLmdldEVsZW1lbnRCeUlkKGVbMl0pLGYmJih0aGlzWzBdPWYsdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6ci5pc0Z1bmN0aW9uKGEpP3ZvaWQgMCE9PWMucmVhZHk/Yy5yZWFkeShhKTphKHIpOnIubWFrZUFycmF5KGEsdGhpcyl9O0gucHJvdG90eXBlPXIuZm4sRj1yKGQpO3ZhciBJPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEo9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ci5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1yKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGM7YSsrKWlmKHIuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPSJzdHJpbmciIT10eXBlb2YgYSYmcihhKTtpZighQS50ZXN0KGEpKWZvcig7ZDxlO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJnIuZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9yLnVuaXF1ZVNvcnQoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9pLmNhbGwocihhKSx0aGlzWzBdKTppLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIudW5pcXVlU29ydChyLm1lcmdlKHRoaXMuZ2V0KCkscihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBLKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1yLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB5KGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEsoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4geShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4geShhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHkoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHooKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiB6KGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBCKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50OihCKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksci5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsYil7ci5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXIubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9ci5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKEpbYV18fHIudW5pcXVlU29ydChlKSxJLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgTD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oYSl7dmFyIGI9e307cmV0dXJuIHIuZWFjaChhLm1hdGNoKEwpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifXIuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP00oYSk6ci5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWV8fGEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe3IuZWFjaChiLGZ1bmN0aW9uKGIsYyl7ci5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PXIudHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiByLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9ci5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxjPD1oJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ci5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9Zz1bXSxjfHxifHwoZj1jPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfTtmdW5jdGlvbiBOKGEpe3JldHVybiBhfWZ1bmN0aW9uIE8oYSl7dGhyb3cgYX1mdW5jdGlvbiBQKGEsYixjLGQpe3ZhciBlO3RyeXthJiZyLmlzRnVuY3Rpb24oZT1hLnByb21pc2UpP2UuY2FsbChhKS5kb25lKGIpLmZhaWwoYyk6YSYmci5pc0Z1bmN0aW9uKGU9YS50aGVuKT9lLmNhbGwoYSxiLGMpOmIuYXBwbHkodm9pZCAwLFthXS5zbGljZShkKSl9Y2F0Y2goYSl7Yy5hcHBseSh2b2lkIDAsW2FdKX19ci5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGIpe3ZhciBjPVtbIm5vdGlmeSIsInByb2dyZXNzIixyLkNhbGxiYWNrcygibWVtb3J5Iiksci5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxkPSJwZW5kaW5nIixlPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBkfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZi5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIGUudGhlbihudWxsLGEpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGIpe3IuZWFjaChjLGZ1bmN0aW9uKGMsZCl7dmFyIGU9ci5pc0Z1bmN0aW9uKGFbZFs0XV0pJiZhW2RbNF1dO2ZbZFsxXV0oZnVuY3Rpb24oKXt2YXIgYT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZyLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhiLm5vdGlmeSkuZG9uZShiLnJlc29sdmUpLmZhaWwoYi5yZWplY3QpOmJbZFswXSsiV2l0aCJdKHRoaXMsZT9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKGIsZCxlKXt2YXIgZj0wO2Z1bmN0aW9uIGcoYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPWFyZ3VtZW50cyxqPWZ1bmN0aW9uKCl7dmFyIGEsajtpZighKGI8Zikpe2lmKGE9ZC5hcHBseShoLGkpLGE9PT1jLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtqPWEmJigib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhKSYmYS50aGVuLHIuaXNGdW5jdGlvbihqKT9lP2ouY2FsbChhLGcoZixjLE4sZSksZyhmLGMsTyxlKSk6KGYrKyxqLmNhbGwoYSxnKGYsYyxOLGUpLGcoZixjLE8sZSksZyhmLGMsTixjLm5vdGlmeVdpdGgpKSk6KGQhPT1OJiYoaD12b2lkIDAsaT1bYV0pLChlfHxjLnJlc29sdmVXaXRoKShoLGkpKX19LGs9ZT9qOmZ1bmN0aW9uKCl7dHJ5e2ooKX1jYXRjaChhKXtyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJnIuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhhLGsuc3RhY2tUcmFjZSksYisxPj1mJiYoZCE9PU8mJihoPXZvaWQgMCxpPVthXSksYy5yZWplY3RXaXRoKGgsaSkpfX07Yj9rKCk6KHIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoay5zdGFja1RyYWNlPXIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGEuc2V0VGltZW91dChrKSl9fXJldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGEpe2NbMF1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihlKT9lOk4sYS5ub3RpZnlXaXRoKSksY1sxXVszXS5hZGQoZygwLGEsci5pc0Z1bmN0aW9uKGIpP2I6TikpLGNbMl1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihkKT9kOk8pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9yLmV4dGVuZChhLGUpOmV9fSxmPXt9O3JldHVybiByLmVhY2goYyxmdW5jdGlvbihhLGIpe3ZhciBnPWJbMl0saD1iWzVdO2VbYlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtkPWh9LGNbMy1hXVsyXS5kaXNhYmxlLGNbMF1bMl0ubG9jayksZy5hZGQoYlszXS5maXJlKSxmW2JbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGZbYlswXSsiV2l0aCJdKHRoaXM9PT1mP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZltiWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGUucHJvbWlzZShmKSxiJiZiLmNhbGwoZixmKSxmfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGgsYz1iLGQ9QXJyYXkoYyksZT1mLmNhbGwoYXJndW1lbnRzKSxnPXIuRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtkW2FdPXRoaXMsZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/Zi5jYWxsKGFyZ3VtZW50cyk6YywtLWJ8fGcucmVzb2x2ZVdpdGgoZCxlKX19O2lmKGI8PTEmJihQKGEsZy5kb25lKGgoYykpLnJlc29sdmUsZy5yZWplY3QsIWIpLCJwZW5kaW5nIj09PWcuc3RhdGUoKXx8ci5pc0Z1bmN0aW9uKGVbY10mJmVbY10udGhlbikpKXJldHVybiBnLnRoZW4oKTt3aGlsZShjLS0pUChlW2NdLGgoYyksZy5yZWplY3QpO3JldHVybiBnLnByb21pc2UoKX19KTt2YXIgUT0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oYixjKXthLmNvbnNvbGUmJmEuY29uc29sZS53YXJuJiZiJiZRLnRlc3QoYi5uYW1lKSYmYS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrYi5tZXNzYWdlLGIuc3RhY2ssYyl9LHIucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oYil7YS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYn0pfTt2YXIgUj1yLkRlZmVycmVkKCk7ci5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gUi50aGVuKGEpWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe3IucmVhZHlFeGNlcHRpb24oYSl9KSx0aGlzfSxyLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tci5yZWFkeVdhaXQ6ci5pc1JlYWR5KXx8KHIuaXNSZWFkeT0hMCxhIT09ITAmJi0tci5yZWFkeVdhaXQ+MHx8Ui5yZXNvbHZlV2l0aChkLFtyXSkpfX0pLHIucmVhZHkudGhlbj1SLnRoZW47ZnVuY3Rpb24gUygpe2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUyksCmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUyksci5yZWFkeSgpfSJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Euc2V0VGltZW91dChyLnJlYWR5KTooZC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFMpKTt2YXIgVD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09ci50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpVChhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxyLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwocihhKSxjKX0pKSxiKSlmb3IoO2g8aTtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxVPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gVigpe3RoaXMuZXhwYW5kbz1yLmV4cGFuZG8rVi51aWQrK31WLnVpZD0xLFYucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihhKXt2YXIgYj1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGJ8fChiPXt9LFUoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1iOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSkpLGJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmNhY2hlKGEpO2lmKCJzdHJpbmciPT10eXBlb2YgYillW3IuY2FtZWxDYXNlKGIpXT1jO2Vsc2UgZm9yKGQgaW4gYillW3IuY2FtZWxDYXNlKGQpXT1iW2RdO3JldHVybiBlfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW3IuY2FtZWxDYXNlKGIpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmInN0cmluZyI9PXR5cGVvZiBiJiZ2b2lkIDA9PT1jP3RoaXMuZ2V0KGEsYik6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9YVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PWQpe2lmKHZvaWQgMCE9PWIpe0FycmF5LmlzQXJyYXkoYik/Yj1iLm1hcChyLmNhbWVsQ2FzZSk6KGI9ci5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIubWF0Y2goTCl8fFtdKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlkZWxldGUgZFtiW2NdXX0odm9pZCAwPT09Ynx8ci5pc0VtcHR5T2JqZWN0KGQpKSYmKGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgYVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1iJiYhci5pc0VtcHR5T2JqZWN0KGIpfX07dmFyIFc9bmV3IFYsWD1uZXcgVixZPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sWj0vW0EtWl0vZztmdW5jdGlvbiAkKGEpe3JldHVybiJ0cnVlIj09PWF8fCJmYWxzZSIhPT1hJiYoIm51bGwiPT09YT9udWxsOmE9PT0rYSsiIj8rYTpZLnRlc3QoYSk/SlNPTi5wYXJzZShhKTphKX1mdW5jdGlvbiBfKGEsYixjKXt2YXIgZDtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKFosIi0kJiIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSQoYyl9Y2F0Y2goZSl7fVguc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfXIuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBYLmhhc0RhdGEoYSl8fFcuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFguYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1gucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gVy5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1cucmVtb3ZlKGEsYil9fSksci5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1YLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIVcuZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPXIuY2FtZWxDYXNlKGQuc2xpY2UoNSkpLF8oZixkLGVbZF0pKSk7Vy5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSl9KTpUKHRoaXMsZnVuY3Rpb24oYil7dmFyIGM7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1YLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1fKGYsYSksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtYLnJlbW92ZSh0aGlzLGEpfSl9fSksci5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXJldHVybiBiPShifHwiZngiKSsicXVldWUiLGQ9Vy5nZXQoYSxiKSxjJiYoIWR8fEFycmF5LmlzQXJyYXkoYyk/ZD1XLmFjY2VzcyhhLGIsci5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W119LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9ci5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1yLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe3IuZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBXLmdldChhLGMpfHxXLmFjY2VzcyhhLGMse2VtcHR5OnIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1cucmVtb3ZlKGEsW2IrInF1ZXVlIixjXSl9KX0pfX0pLHIuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9yLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPXIucXVldWUodGhpcyxhLGIpO3IuX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmci5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPXIuRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9Vy5nZXQoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIGFhPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGJhPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIithYSsiKShbYS16JV0qKSQiLCJpIiksY2E9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxkYT1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09YS5zdHlsZS5kaXNwbGF5fHwiIj09PWEuc3R5bGUuZGlzcGxheSYmci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSkmJiJub25lIj09PXIuY3NzKGEsImRpc3BsYXkiKX0sZWE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O2Z1bmN0aW9uIGZhKGEsYixjLGQpe3ZhciBlLGY9MSxnPTIwLGg9ZD9mdW5jdGlvbigpe3JldHVybiBkLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiByLmNzcyhhLGIsIiIpfSxpPWgoKSxqPWMmJmNbM118fChyLmNzc051bWJlcltiXT8iIjoicHgiKSxrPShyLmNzc051bWJlcltiXXx8InB4IiE9PWomJitpKSYmYmEuZXhlYyhyLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixyLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBnYT17fTtmdW5jdGlvbiBoYShhKXt2YXIgYixjPWEub3duZXJEb2N1bWVudCxkPWEubm9kZU5hbWUsZT1nYVtkXTtyZXR1cm4gZT9lOihiPWMuYm9keS5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoZCkpLGU9ci5jc3MoYiwiZGlzcGxheSIpLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSwibm9uZSI9PT1lJiYoZT0iYmxvY2siKSxnYVtkXT1lLGUpfWZ1bmN0aW9uIGlhKGEsYil7Zm9yKHZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWQ9YVtmXSxkLnN0eWxlJiYoYz1kLnN0eWxlLmRpc3BsYXksYj8oIm5vbmUiPT09YyYmKGVbZl09Vy5nZXQoZCwiZGlzcGxheSIpfHxudWxsLGVbZl18fChkLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmZGEoZCkmJihlW2ZdPWhhKGQpKSk6Im5vbmUiIT09YyYmKGVbZl09Im5vbmUiLFcuc2V0KGQsImRpc3BsYXkiLGMpKSk7Zm9yKGY9MDtmPGc7ZisrKW51bGwhPWVbZl0mJihhW2ZdLnN0eWxlLmRpc3BsYXk9ZVtmXSk7cmV0dXJuIGF9ci5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGEodGhpcyk/cih0aGlzKS5zaG93KCk6cih0aGlzKS5oaWRlKCl9KX19KTt2YXIgamE9L14oPzpjaGVja2JveHxyYWRpbykkL2ksa2E9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2ksbGE9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG1hPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07bWEub3B0Z3JvdXA9bWEub3B0aW9uLG1hLnRib2R5PW1hLnRmb290PW1hLmNvbGdyb3VwPW1hLmNhcHRpb249bWEudGhlYWQsbWEudGg9bWEudGQ7ZnVuY3Rpb24gbmEoYSxiKXt2YXIgYztyZXR1cm4gYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdLHZvaWQgMD09PWJ8fGImJkIoYSxiKT9yLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIG9hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKVcuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxXLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBwYT0vPHwmIz9cdys7LztmdW5jdGlvbiBxYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG49MCxvPWEubGVuZ3RoO248bztuKyspaWYoZj1hW25dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09ci50eXBlKGYpKXIubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKHBhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShrYS5leGVjKGYpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGk9bWFbaF18fG1hLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rci5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO3IubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixuPTA7d2hpbGUoZj1tW24rK10paWYoZCYmci5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1yLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPW5hKGwuYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGomJm9hKGcpLGMpe2s9MDt3aGlsZShmPWdbaysrXSlsYS50ZXN0KGYudHlwZXx8IiIpJiZjLnB1c2goZil9cmV0dXJuIGx9IWZ1bmN0aW9uKCl7dmFyIGE9ZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYj1hLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxiLmFwcGVuZENoaWxkKGMpLG8uY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsby5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciByYT1kLmRvY3VtZW50RWxlbWVudCxzYT0vXmtleS8sdGE9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLHVhPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB2YSgpe3JldHVybiEwfWZ1bmN0aW9uIHdhKCl7cmV0dXJuITF9ZnVuY3Rpb24geGEoKXt0cnl7cmV0dXJuIGQuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fWZ1bmN0aW9uIHlhKGEsYixjLGQsZSxmKXt2YXIgZyxoO2lmKCJvYmplY3QiPT10eXBlb2YgYil7InN0cmluZyIhPXR5cGVvZiBjJiYoZD1kfHxjLGM9dm9pZCAwKTtmb3IoaCBpbiBiKXlhKGEsaCxjLGQsYltoXSxmKTtyZXR1cm4gYX1pZihudWxsPT1kJiZudWxsPT1lPyhlPWMsZD1jPXZvaWQgMCk6bnVsbD09ZSYmKCJzdHJpbmciPT10eXBlb2YgYz8oZT1kLGQ9dm9pZCAwKTooZT1kLGQ9YyxjPXZvaWQgMCkpLGU9PT0hMSllPXdhO2Vsc2UgaWYoIWUpcmV0dXJuIGE7cmV0dXJuIDE9PT1mJiYoZz1lLGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9ci5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LmFkZCh0aGlzLGIsZSxkLGMpfSl9ci5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHAscT1XLmdldChhKTtpZihxKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxlJiZyLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJhLGUpLGMuZ3VpZHx8KGMuZ3VpZD1yLmd1aWQrKyksKGk9cS5ldmVudHMpfHwoaT1xLmV2ZW50cz17fSksKGc9cS5oYW5kbGUpfHwoZz1xLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHImJnIuZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP3IuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSloPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuJiYobD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LG49KGU/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG4sbD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LGs9ci5leHRlbmQoe3R5cGU6bixvcmlnVHlwZTpwLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmci5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpvLmpvaW4oIi4iKX0sZiksKG09aVtuXSl8fChtPWlbbl09W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxvLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG4sZykpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxyLmV2ZW50Lmdsb2JhbFtuXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG4sbyxwLHE9Vy5oYXNEYXRhKGEpJiZXLmdldChhKTtpZihxJiYoaT1xLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuKXtsPXIuZXZlbnQuc3BlY2lhbFtuXXx8e30sbj0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8bixtPWlbbl18fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrby5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcCE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEsbyxxLmhhbmRsZSkhPT0hMXx8ci5yZW1vdmVFdmVudChhLG4scS5oYW5kbGUpLGRlbGV0ZSBpW25dKX1lbHNlIGZvcihuIGluIGkpci5ldmVudC5yZW1vdmUoYSxuK2Jbal0sYyxkLCEwKTtyLmlzRW1wdHlPYmplY3QoaSkmJlcucmVtb3ZlKGEsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZhciBiPXIuZXZlbnQuZml4KGEpLGMsZCxlLGYsZyxoLGk9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGo9KFcuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYi50eXBlXXx8W10saz1yLmV2ZW50LnNwZWNpYWxbYi50eXBlXXx8e307Zm9yKGlbMF09YixjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylpW2NdPWFyZ3VtZW50c1tjXTtpZihiLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGIpIT09ITEpe2g9ci5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYixqKSxjPTA7d2hpbGUoKGY9aFtjKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7Yi5jdXJyZW50VGFyZ2V0PWYuZWxlbSxkPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tkKytdKSYmIWIuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSliLnJuYW1lc3BhY2UmJiFiLnJuYW1lc3BhY2UudGVzdChnLm5hbWVzcGFjZSl8fChiLmhhbmRsZU9iaj1nLGIuZGF0YT1nLmRhdGEsZT0oKHIuZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGIucmVzdWx0PWUpPT09ITEmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGIpLGIucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg9W10saT1iLmRlbGVnYXRlQ291bnQsaj1hLnRhcmdldDtpZihpJiZqLm5vZGVUeXBlJiYhKCJjbGljayI9PT1hLnR5cGUmJmEuYnV0dG9uPj0xKSlmb3IoO2ohPT10aGlzO2o9ai5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1qLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8ai5kaXNhYmxlZCE9PSEwKSl7Zm9yKGY9W10sZz17fSxjPTA7YzxpO2MrKylkPWJbY10sZT1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1nW2VdJiYoZ1tlXT1kLm5lZWRzQ29udGV4dD9yKGUsdGhpcykuaW5kZXgoaik+LTE6ci5maW5kKGUsdGhpcyxudWxsLFtqXSkubGVuZ3RoKSxnW2VdJiZmLnB1c2goZCk7Zi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmZ9KX1yZXR1cm4gaj10aGlzLGk8Yi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmIuc2xpY2UoaSl9KSxofSxhZGRQcm9wOmZ1bmN0aW9uKGEsYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIuRXZlbnQucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpyLmlzRnVuY3Rpb24oYik/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGIodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFthXX0sc2V0OmZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19KX0sZml4OmZ1bmN0aW9uKGEpe3JldHVybiBhW3IuZXhwYW5kb10/YTpuZXcgci5FdmVudChhKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PXhhKCkmJnRoaXMuZm9jdXMpcmV0dXJuIHRoaXMuZm9jdXMoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT14YSgpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZigiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZCKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fSxyLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMpfSxyLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT92YTp3YSx0aGlzLnRhcmdldD1hLnRhcmdldCYmMz09PWEudGFyZ2V0Lm5vZGVUeXBlP2EudGFyZ2V0LnBhcmVudE5vZGU6YS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWEuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9YSxiJiZyLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxyLm5vdygpLHZvaWQodGhpc1tyLmV4cGFuZG9dPSEwKSk6bmV3IHIuRXZlbnQoYSxiKX0sci5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOndhLGlzUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD12YSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sci5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihhKXt2YXIgYj1hLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS53aGljaCYmc2EudGVzdChhLnR5cGUpP251bGwhPWEuY2hhckNvZGU/YS5jaGFyQ29kZTphLmtleUNvZGU6IWEud2hpY2gmJnZvaWQgMCE9PWImJnRhLnRlc3QoYS50eXBlKT8xJmI/MToyJmI/Mzo0JmI/MjowOmEud2hpY2h9fSxyLmV2ZW50LmFkZFByb3ApLHIuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtyLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fHIuY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLHIuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4geWEodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB5YSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixyKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9d2EpLHRoaXMuZWFjaChmdW5jdGlvbigpe3IuZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9fSk7dmFyIHphPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxBYT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxCYT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxDYT0vXnRydWVcLyguKikvLERhPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBFYShhLGIpe3JldHVybiBCKGEsInRhYmxlIikmJkIoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP3IoIj50Ym9keSIsYSlbMF18fGE6YX1mdW5jdGlvbiBGYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIEdhKGEpe3ZhciBiPUNhLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gSGEoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihXLmhhc0RhdGEoYSkmJihmPVcuYWNjZXNzKGEpLGc9Vy5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2M8ZDtjKyspci5ldmVudC5hZGQoYixlLGpbZV1bY10pfVguaGFzRGF0YShhKSYmKGg9WC5hY2Nlc3MoYSksaT1yLmV4dGVuZCh7fSxoKSxYLnNldChiLGkpKX19ZnVuY3Rpb24gSWEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJmphLnRlc3QoYS50eXBlKT9iLmNoZWNrZWQ9YS5jaGVja2VkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBKYShhLGIsYyxkKXtiPWcuYXBwbHkoW10sYik7dmFyIGUsZixoLGksaixrLGw9MCxtPWEubGVuZ3RoLG49bS0xLHE9YlswXSxzPXIuaXNGdW5jdGlvbihxKTtpZihzfHxtPjEmJiJzdHJpbmciPT10eXBlb2YgcSYmIW8uY2hlY2tDbG9uZSYmQmEudGVzdChxKSlyZXR1cm4gYS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWEuZXEoZSk7cyYmKGJbMF09cS5jYWxsKHRoaXMsZSxmLmh0bWwoKSkpLEphKGYsYixjLGQpfSk7aWYobSYmKGU9cWEoYixhWzBdLm93bmVyRG9jdW1lbnQsITEsYSxkKSxmPWUuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9ZiksZnx8ZCkpe2ZvcihoPXIubWFwKG5hKGUsInNjcmlwdCIpLEZhKSxpPWgubGVuZ3RoO2w8bTtsKyspaj1lLGwhPT1uJiYoaj1yLmNsb25lKGosITAsITApLGkmJnIubWVyZ2UoaCxuYShqLCJzY3JpcHQiKSkpLGMuY2FsbChhW2xdLGosbCk7aWYoaSlmb3Ioaz1oW2gubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsci5tYXAoaCxHYSksbD0wO2w8aTtsKyspaj1oW2xdLGxhLnRlc3Qoai50eXBlfHwiIikmJiFXLmFjY2VzcyhqLCJnbG9iYWxFdmFsIikmJnIuY29udGFpbnMoayxqKSYmKGouc3JjP3IuX2V2YWxVcmwmJnIuX2V2YWxVcmwoai5zcmMpOnAoai50ZXh0Q29udGVudC5yZXBsYWNlKERhLCIiKSxrKSl9cmV0dXJuIGF9ZnVuY3Rpb24gS2EoYSxiLGMpe2Zvcih2YXIgZCxlPWI/ci5maWx0ZXIoYixhKTphLGY9MDtudWxsIT0oZD1lW2ZdKTtmKyspY3x8MSE9PWQubm9kZVR5cGV8fHIuY2xlYW5EYXRhKG5hKGQpKSxkLnBhcmVudE5vZGUmJihjJiZyLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmb2EobmEoZCwic2NyaXB0IikpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSk7cmV0dXJuIGF9ci5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh6YSwiPCQxPjwvJDI+Iil9LGNsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPXIuY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoby5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8ci5pc1hNTERvYyhhKSkpZm9yKGc9bmEoaCksZj1uYShhKSxkPTAsZT1mLmxlbmd0aDtkPGU7ZCsrKUlhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG5hKGEpLGc9Z3x8bmEoaCksZD0wLGU9Zi5sZW5ndGg7ZDxlO2QrKylIYShmW2RdLGdbZF0pO2Vsc2UgSGEoYSxoKTtyZXR1cm4gZz1uYShoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZvYShnLCFpJiZuYShhLCJzY3JpcHQiKSksaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZT1yLmV2ZW50LnNwZWNpYWwsZj0wO3ZvaWQgMCE9PShjPWFbZl0pO2YrKylpZihVKGMpKXtpZihiPWNbVy5leHBhbmRvXSl7aWYoYi5ldmVudHMpZm9yKGQgaW4gYi5ldmVudHMpZVtkXT9yLmV2ZW50LnJlbW92ZShjLGQpOnIucmVtb3ZlRXZlbnQoYyxkLGIuaGFuZGxlKTtjW1cuZXhwYW5kb109dm9pZCAwfWNbWC5leHBhbmRvXSYmKGNbWC5leHBhbmRvXT12b2lkIDApfX19KSxyLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBLYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIEthKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9yLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUVhKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9RWEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYoci5jbGVhbkRhdGEobmEoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGwhPWEmJmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiByLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIUFhLnRlc3QoYSkmJiFtYVsoa2EuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9ci5odG1sUHJlZmlsdGVyKGEpO3RyeXtmb3IoO2M8ZDtjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKHIuY2xlYW5EYXRhKG5hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIEphKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMucGFyZW50Tm9kZTtyLmluQXJyYXkodGhpcyxhKTwwJiYoci5jbGVhbkRhdGEobmEodGhpcykpLGMmJmMucmVwbGFjZUNoaWxkKGIsdGhpcykpfSxhKX19KSxyLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W10sZT1yKGEpLGY9ZS5sZW5ndGgtMSxnPTA7Zzw9ZjtnKyspYz1nPT09Zj90aGlzOnRoaXMuY2xvbmUoITApLHIoZVtnXSlbYl0oYyksaC5hcHBseShkLGMuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhkKX19KTt2YXIgTGE9L15tYXJnaW4vLE1hPW5ldyBSZWdFeHAoIl4oIithYSsiKSg/IXB4KVthLXolXSskIiwiaSIpLE5hPWZ1bmN0aW9uKGIpe3ZhciBjPWIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gYyYmYy5vcGVuZXJ8fChjPWEpLGMuZ2V0Q29tcHV0ZWRTdHlsZShiKX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2lmKGkpe2kuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixpLmlubmVySFRNTD0iIixyYS5hcHBlbmRDaGlsZChoKTt2YXIgYj1hLmdldENvbXB1dGVkU3R5bGUoaSk7Yz0iMSUiIT09Yi50b3AsZz0iMnB4Ij09PWIubWFyZ2luTGVmdCxlPSI0cHgiPT09Yi53aWR0aCxpLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGY9IjRweCI9PT1iLm1hcmdpblJpZ2h0LHJhLnJlbW92ZUNoaWxkKGgpLGk9bnVsbH19dmFyIGMsZSxmLGcsaD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlJiYoaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixvLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxoLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixoLmFwcGVuZENoaWxkKGkpLHIuZXh0ZW5kKG8se3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGN9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxlfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxmfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGd9fSkpfSgpO2Z1bmN0aW9uIE9hKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8TmEoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdLCIiIT09Z3x8ci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPXIuc3R5bGUoYSxiKSksIW8ucGl4ZWxNYXJnaW5SaWdodCgpJiZNYS50ZXN0KGcpJiZMYS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiBQYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgUWE9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFJhPS9eLS0vLFNhPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sVWE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFZhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gV2EoYSl7aWYoYSBpbiBWYSlyZXR1cm4gYTt2YXIgYj1hWzBdLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPVVhLmxlbmd0aDt3aGlsZShjLS0paWYoYT1VYVtjXStiLGEgaW4gVmEpcmV0dXJuIGF9ZnVuY3Rpb24gWGEoYSl7dmFyIGI9ci5jc3NQcm9wc1thXTtyZXR1cm4gYnx8KGI9ci5jc3NQcm9wc1thXT1XYShhKXx8YSksYn1mdW5jdGlvbiBZYShhLGIsYyl7dmFyIGQ9YmEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMl0tKGN8fDApKSsoZFszXXx8InB4Iik6Yn1mdW5jdGlvbiBaYShhLGIsYyxkLGUpe3ZhciBmLGc9MDtmb3IoZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MDtmPDQ7Zis9MikibWFyZ2luIj09PWMmJihnKz1yLmNzcyhhLGMrY2FbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1yLmNzcyhhLCJwYWRkaW5nIitjYVtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09ci5jc3MoYSwiYm9yZGVyIitjYVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPXIuY3NzKGEsInBhZGRpbmciK2NhW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1yLmNzcyhhLCJib3JkZXIiK2NhW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiAkYShhLGIsYyl7dmFyIGQsZT1OYShhKSxmPU9hKGEsYixlKSxnPSJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZSk7cmV0dXJuIE1hLnRlc3QoZik/ZjooZD1nJiYoby5ib3hTaXppbmdSZWxpYWJsZSgpfHxmPT09YS5zdHlsZVtiXSksImF1dG8iPT09ZiYmKGY9YVsib2Zmc2V0IitiWzBdLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKV0pLGY9cGFyc2VGbG9hdChmKXx8MCxmK1phKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZSkrInB4Iil9ci5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYShhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpLGo9YS5zdHlsZTtyZXR1cm4gaXx8KGI9WGEoaCkpLGc9ci5jc3NIb29rc1tiXXx8ci5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTpqW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9YmEuZXhlYyhjKSkmJmVbMV0mJihjPWZhKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChyLmNzc051bWJlcltoXT8iIjoicHgiKSksby5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaltiXT0iaW5oZXJpdCIpLGcmJiJzZXQiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGk/ai5zZXRQcm9wZXJ0eShiLGMpOmpbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpO3JldHVybiBpfHwoYj1YYShoKSksZz1yLmNzc0hvb2tzW2JdfHxyLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZSYmKGU9T2EoYSxiLGQpKSwibm9ybWFsIj09PWUmJmIgaW4gVGEmJihlPVRhW2JdKSwiIj09PWN8fGM/KGY9cGFyc2VGbG9hdChlKSxjPT09ITB8fGlzRmluaXRlKGYpP2Z8fDA6ZSk6ZX19KSxyLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7ci5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiFRYS50ZXN0KHIuY3NzKGEsImRpc3BsYXkiKSl8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/JGEoYSxiLGQpOmVhKGEsU2EsZnVuY3Rpb24oKXtyZXR1cm4gJGEoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj1kJiZOYShhKSxnPWQmJlphKGEsYixkLCJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZiksZik7cmV0dXJuIGcmJihlPWJhLmV4ZWMoYykpJiYicHgiIT09KGVbM118fCJweCIpJiYoYS5zdHlsZVtiXT1jLGM9ci5jc3MoYSxiKSksWWEoYSxjLGcpfX19KSxyLmNzc0hvb2tzLm1hcmdpbkxlZnQ9UGEoby5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxiKXtpZihiKXJldHVybihwYXJzZUZsb2F0KE9hKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1lYShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksci5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ZDw0O2QrKyllW2ErY2FbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sTGEudGVzdChhKXx8KHIuY3NzSG9va3NbYStiXS5zZXQ9WWEpfSksci5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKGQ9TmEoYSksZT1iLmxlbmd0aDtnPGU7ZysrKWZbYltnXV09ci5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP3Iuc3R5bGUoYSxiLGMpOnIuY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIF9hKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBfYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfXIuVHdlZW49X2EsX2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxyLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KHIuY3NzTnVtYmVyW2NdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1fYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6X2EucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9X2EucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPXIuZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpfYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxfYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9X2EucHJvdG90eXBlLF9hLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gMSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbCE9YS5lbGVtW2EucHJvcF0mJm51bGw9PWEuZWxlbS5zdHlsZVthLnByb3BdP2EuZWxlbVthLnByb3BdOihiPXIuY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKX0sc2V0OmZ1bmN0aW9uKGEpe3IuZnguc3RlcFthLnByb3BdP3IuZnguc3RlcFthLnByb3BdKGEpOjEhPT1hLmVsZW0ubm9kZVR5cGV8fG51bGw9PWEuZWxlbS5zdHlsZVtyLmNzc1Byb3BzW2EucHJvcF1dJiYhci5jc3NIb29rc1thLnByb3BdP2EuZWxlbVthLnByb3BdPWEubm93OnIuc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpfX19LF9hLnByb3BIb29rcy5zY3JvbGxUb3A9X2EucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sci5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxyLmZ4PV9hLnByb3RvdHlwZS5pbml0LHIuZnguc3RlcD17fTt2YXIgYWIsYmIsY2I9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRiPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZWIoKXtiYiYmKGQuaGlkZGVuPT09ITEmJmEucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2EucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGViKTphLnNldFRpbWVvdXQoZWIsci5meC5pbnRlcnZhbCksci5meC50aWNrKCkpfWZ1bmN0aW9uIGZiKCl7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe2FiPXZvaWQgMH0pLGFiPXIubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowO2Q8NDtkKz0yLWIpYz1jYVtkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIGhiKGEsYixjKXtmb3IodmFyIGQsZT0oa2IudHdlZW5lcnNbYl18fFtdKS5jb25jYXQoa2IudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7ZjxnO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gaWIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD0id2lkdGgiaW4gYnx8ImhlaWdodCJpbiBiLG09dGhpcyxuPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJmRhKGEpLHE9Vy5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGc9ci5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWcudW5xdWV1ZWQmJihnLnVucXVldWVkPTAsaD1nLmVtcHR5LmZpcmUsZy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7Zy51bnF1ZXVlZHx8aCgpfSksZy51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtnLnVucXVldWVkLS0sci5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8Zy5lbXB0eS5maXJlKCl9KX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxjYi50ZXN0KGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHA/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFxfHx2b2lkIDA9PT1xW2RdKWNvbnRpbnVlO3A9ITB9bltkXT1xJiZxW2RdfHxyLnN0eWxlKGEsZCl9aWYoaT0hci5pc0VtcHR5T2JqZWN0KGIpLGl8fCFyLmlzRW1wdHlPYmplY3Qobikpe2wmJjE9PT1hLm5vZGVUeXBlJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1xJiZxLmRpc3BsYXksbnVsbD09aiYmKGo9Vy5nZXQoYSwiZGlzcGxheSIpKSxrPXIuY3NzKGEsImRpc3BsYXkiKSwibm9uZSI9PT1rJiYoaj9rPWo6KGlhKFthXSwhMCksaj1hLnN0eWxlLmRpc3BsYXl8fGosaz1yLmNzcyhhLCJkaXNwbGF5IiksaWEoW2FdKSkpLCgiaW5saW5lIj09PWt8fCJpbmxpbmUtYmxvY2siPT09ayYmbnVsbCE9aikmJiJub25lIj09PXIuY3NzKGEsImZsb2F0IikmJihpfHwobS5kb25lKGZ1bmN0aW9uKCl7by5kaXNwbGF5PWp9KSxudWxsPT1qJiYoaz1vLmRpc3BsYXksaj0ibm9uZSI9PT1rPyIiOmspKSxvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixtLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSksaT0hMTtmb3IoZCBpbiBuKWl8fChxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9Vy5hY2Nlc3MoYSwiZnhzaG93Iix7ZGlzcGxheTpqfSksZiYmKHEuaGlkZGVuPSFwKSxwJiZpYShbYV0sITApLG0uZG9uZShmdW5jdGlvbigpe3B8fGlhKFthXSksVy5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGQgaW4gbilyLnN0eWxlKGEsZCxuW2RdKX0pKSxpPWhiKHA/cVtkXTowLGQsbSksZCBpbiBxfHwocVtkXT1pLnN0YXJ0LHAmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPXIuY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sQXJyYXkuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9ci5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBrYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1rYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPXIuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWFifHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtnPGk7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksZjwxJiZpP2M6KGl8fGgubm90aWZ5V2l0aChhLFtqLDEsMF0pLGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpyLmV4dGVuZCh7fSxiKSxvcHRzOnIuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpyLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmFifHxmYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ci5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmPGc7ZisrKWlmKGQ9a2IucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIHIuaXNGdW5jdGlvbihkLnN0b3ApJiYoci5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPXIucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiByLm1hcChrLGhiLGopLHIuaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpLHIuZngudGltZXIoci5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksan1yLkFuaW1hdGlvbj1yLmV4dGVuZChrYix7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYik7cmV0dXJuIGZhKGMuZWxlbSxhLGJhLmV4ZWMoYiksYyksY31dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsYil7ci5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bIioiXSk6YT1hLm1hdGNoKEwpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWM9YVtkXSxrYi50d2VlbmVyc1tjXT1rYi50d2VlbmVyc1tjXXx8W10sa2IudHdlZW5lcnNbY10udW5zaGlmdChiKX0scHJlZmlsdGVyczpbaWJdLHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/a2IucHJlZmlsdGVycy51bnNoaWZ0KGEpOmtiLnByZWZpbHRlcnMucHVzaChhKX19KSxyLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiYib2JqZWN0Ij09dHlwZW9mIGE/ci5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxyLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXIuaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIHIuZngub2ZmP2QuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGQuZHVyYXRpb24mJihkLmR1cmF0aW9uIGluIHIuZnguc3BlZWRzP2QuZHVyYXRpb249ci5meC5zcGVlZHNbZC5kdXJhdGlvbl06ZC5kdXJhdGlvbj1yLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtyLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJnIuZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxyLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihkYSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ci5pc0VtcHR5T2JqZWN0KGEpLGY9ci5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsci5leHRlbmQoe30sYSksZik7KGV8fFcuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9ci50aW1lcnMsZz1XLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZkYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxyLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1XLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9ci50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLHIucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2I8ZztiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksci5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPXIuZm5bYl07ci5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxyLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksci50aW1lcnM9W10sci5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9ci50aW1lcnM7Zm9yKGFiPXIubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8ci5meC5zdG9wKCksYWI9dm9pZCAwfSxyLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe3IudGltZXJzLnB1c2goYSksci5meC5zdGFydCgpfSxyLmZ4LmludGVydmFsPTEzLHIuZnguc3RhcnQ9ZnVuY3Rpb24oKXtiYnx8KGJiPSEwLGViKCkpfSxyLmZ4LnN0b3A9ZnVuY3Rpb24oKXtiYj1udWxsfSxyLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxyLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9ci5meD9yLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGM9Yi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTthLnR5cGU9ImNoZWNrYm94IixvLmNoZWNrT249IiIhPT1hLnZhbHVlLG8ub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxhPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixvLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGIsbWI9ci5leHByLmF0dHJIYW5kbGU7ci5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLHIuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxyLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuZ2V0QXR0cmlidXRlP3IucHJvcChhLGIsYyk6KDE9PT1mJiZyLmlzWE1MRG9jKGEpfHwoZT1yLmF0dHJIb29rc1tiLnRvTG93ZXJDYXNlKCldfHwoci5leHByLm1hdGNoLmJvb2wudGVzdChiKT9sYjp2b2lkIDApKSx2b2lkIDAhPT1jP251bGw9PT1jP3ZvaWQgci5yZW1vdmVBdHRyKGEsYik6ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDooZD1yLmZpbmQuYXR0cihhLGIpLApudWxsPT1kP3ZvaWQgMDpkKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIW8ucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJkIoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTAsZT1iJiZiLm1hdGNoKEwpO2lmKGUmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZVtkKytdKWEucmVtb3ZlQXR0cmlidXRlKGMpfX0pLGxiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/ci5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sci5lYWNoKHIuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9bWJbYl18fHIuZmluZC5hdHRyO21iW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGc9Yi50b0xvd2VyQ2FzZSgpO3JldHVybiBkfHwoZj1tYltnXSxtYltnXT1lLGU9bnVsbCE9YyhhLGIsZCk/ZzpudWxsLG1iW2ddPWYpLGV9fSk7dmFyIG5iPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksb2I9L14oPzphfGFyZWEpJC9pO3IuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFQodGhpcyxyLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3IucHJvcEZpeFthXXx8YV19KX19KSxyLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gMT09PWYmJnIuaXNYTUxEb2MoYSl8fChiPXIucHJvcEZpeFtiXXx8YixlPXIucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1yLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOm5iLnRlc3QoYS5ub2RlTmFtZSl8fG9iLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLG8ub3B0U2VsZWN0ZWR8fChyLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksci5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtyLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7ZnVuY3Rpb24gcGIoYSl7dmFyIGI9YS5tYXRjaChMKXx8W107cmV0dXJuIGIuam9pbigiICIpfWZ1bmN0aW9uIHFiKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifXIuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYoci5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7cih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHFiKHRoaXMpKSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pZC5pbmRleE9mKCIgIitmKyIgIik8MCYmKGQrPWYrIiAiKTtoPXBiKGQpLGUhPT1oJiZjLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaT0wO2lmKHIuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYixxYih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pd2hpbGUoZC5pbmRleE9mKCIgIitmKyIgIik+LTEpZD1kLnJlcGxhY2UoIiAiK2YrIiAiLCIgIik7aD1wYihkKSxlIT09aCYmYy5zZXRBdHRyaWJ1dGUoImNsYXNzIixoKX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnIuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHFiKHRoaXMpLGIpLGIpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsZCxlLGY7aWYoInN0cmluZyI9PT1jKXtkPTAsZT1yKHRoaXMpLGY9YS5tYXRjaChMKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZSB2b2lkIDAhPT1hJiYiYm9vbGVhbiIhPT1jfHwoYj1xYih0aGlzKSxiJiZXLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixiKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixifHxhPT09ITE/IiI6Vy5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0wO2I9IiAiK2ErIiAiO3doaWxlKGM9dGhpc1tkKytdKWlmKDE9PT1jLm5vZGVUeXBlJiYoIiAiK3BiKHFiKGMpKSsiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHJiPS9cci9nO3IuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1yLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMscih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOkFycmF5LmlzQXJyYXkoZSkmJihlPXIubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPXIudmFsSG9va3NbdGhpcy50eXBlXXx8ci52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPXIudmFsSG9va3NbZS50eXBlXXx8ci52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UocmIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLHIuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ci5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOnBiKHIudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1hLm9wdGlvbnMsZj1hLnNlbGVjdGVkSW5kZXgsZz0ic2VsZWN0LW9uZSI9PT1hLnR5cGUsaD1nP251bGw6W10saT1nP2YrMTplLmxlbmd0aDtmb3IoZD1mPDA/aTpnP2Y6MDtkPGk7ZCsrKWlmKGM9ZVtkXSwoYy5zZWxlY3RlZHx8ZD09PWYpJiYhYy5kaXNhYmxlZCYmKCFjLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFCKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9cihjKS52YWwoKSxnKXJldHVybiBiO2gucHVzaChiKX1yZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPXIubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWQ9ZVtnXSwoZC5zZWxlY3RlZD1yLmluQXJyYXkoci52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPi0xKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksci5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ci52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7aWYoQXJyYXkuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPXIuaW5BcnJheShyKGEpLnZhbCgpLGIpPi0xfX0sby5jaGVja09ufHwoci52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBzYj0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87ci5leHRlbmQoci5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZyxoLGksaixrLG0sbixvPVtlfHxkXSxwPWwuY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1sLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWk9ZT1lfHxkLDMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmIXNiLnRlc3QocCtyLmV2ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT4tMSYmKHE9cC5zcGxpdCgiLiIpLHA9cS5zaGlmdCgpLHEuc29ydCgpKSxrPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCxiPWJbci5leHBhbmRvXT9iOm5ldyByLkV2ZW50KHAsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1mPzI6MyxiLm5hbWVzcGFjZT1xLmpvaW4oIi4iKSxiLnJuYW1lc3BhY2U9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWUpLGM9bnVsbD09Yz9bYl06ci5tYWtlQXJyYXkoYyxbYl0pLG49ci5ldmVudC5zcGVjaWFsW3BdfHx7fSxmfHwhbi50cmlnZ2VyfHxuLnRyaWdnZXIuYXBwbHkoZSxjKSE9PSExKSl7aWYoIWYmJiFuLm5vQnViYmxlJiYhci5pc1dpbmRvdyhlKSl7Zm9yKGo9bi5kZWxlZ2F0ZVR5cGV8fHAsc2IudGVzdChqK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGk9aDtpPT09KGUub3duZXJEb2N1bWVudHx8ZCkmJm8ucHVzaChpLmRlZmF1bHRWaWV3fHxpLnBhcmVudFdpbmRvd3x8YSl9Zz0wO3doaWxlKChoPW9bZysrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWc+MT9qOm4uYmluZFR5cGV8fHAsbT0oVy5nZXQoaCwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZXLmdldChoLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGgsYyksbT1rJiZoW2tdLG0mJm0uYXBwbHkmJlUoaCkmJihiLnJlc3VsdD1tLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXAsZnx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8bi5fZGVmYXVsdCYmbi5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpIT09ITF8fCFVKGUpfHxrJiZyLmlzRnVuY3Rpb24oZVtwXSkmJiFyLmlzV2luZG93KGUpJiYoaT1lW2tdLGkmJihlW2tdPW51bGwpLHIuZXZlbnQudHJpZ2dlcmVkPXAsZVtwXSgpLHIuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxpJiYoZVtrXT1pKSksYi5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ci5leHRlbmQobmV3IHIuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7ci5ldmVudC50cmlnZ2VyKGQsbnVsbCxiKX19KSxyLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtpZihjKXJldHVybiByLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApfX0pLHIuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3IuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLHIuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxvLmZvY3VzaW49Im9uZm9jdXNpbiJpbiBhLG8uZm9jdXNpbnx8ci5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe3IuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxyLmV2ZW50LmZpeChhKSl9O3IuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1XLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLFcuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9Vy5hY2Nlc3MoZCxiKS0xO2U/Vy5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxXLnJlbW92ZShkLGIpKX19fSk7dmFyIHRiPWEubG9jYXRpb24sdWI9ci5ub3coKSx2Yj0vXD8vO3IucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGM7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7Yz0obmV3IGEuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKX1jYXRjaChkKXtjPXZvaWQgMH1yZXR1cm4gYyYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxyLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgd2I9L1xbXF0kLyx4Yj0vXHI/XG4vZyx5Yj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEFiKGEsYixjLGQpe3ZhciBlO2lmKEFycmF5LmlzQXJyYXkoYikpci5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHx3Yi50ZXN0KGEpP2QoYSxlKTpBYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09ci50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpQWIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfXIucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1yLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09Yz8iIjpjKX07aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFyLmlzUGxhaW5PYmplY3QoYSkpci5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlBYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIil9LHIuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gci5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXIucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP3IubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXIodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IWphLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9cih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOkFycmF5LmlzQXJyYXkoYyk/ci5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhiLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YiwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBCYj0vJTIwL2csQ2I9LyMuKiQvLERiPS8oWz8mXSlfPVteJl0qLyxFYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEZiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLEdiPS9eKD86R0VUfEhFQUQpJC8sSGI9L15cL1wvLyxJYj17fSxKYj17fSxLYj0iKi8iLmNvbmNhdCgiKiIpLExiPWQuY3JlYXRlRWxlbWVudCgiYSIpO0xiLmhyZWY9dGIuaHJlZjtmdW5jdGlvbiBNYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8W107aWYoci5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxyLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYihhLGIpe3ZhciBjLGQsZT1yLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZyLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31pZihmKXJldHVybiBmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl19ZnVuY3Rpb24gUWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1yLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6dGIuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6RmIudGVzdCh0Yi5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpLYix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6ci5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/T2IoT2IoYSxyLmFqYXhTZXR0aW5ncyksYik6T2Ioci5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6TWIoSWIpLGFqYXhUcmFuc3BvcnQ6TWIoSmIpLGFqYXg6ZnVuY3Rpb24oYixjKXsib2JqZWN0Ij09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGM9Y3x8e307dmFyIGUsZixnLGgsaSxqLGssbCxtLG4sbz1yLmFqYXhTZXR1cCh7fSxjKSxwPW8uY29udGV4dHx8byxxPW8uY29udGV4dCYmKHAubm9kZVR5cGV8fHAuanF1ZXJ5KT9yKHApOnIuZXZlbnQscz1yLkRlZmVycmVkKCksdD1yLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1PW8uc3RhdHVzQ29kZXx8e30sdj17fSx3PXt9LHg9ImNhbmNlbGVkIix5PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoayl7aWYoIWgpe2g9e307d2hpbGUoYj1FYi5leGVjKGcpKWhbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9aFthLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGs/ZzpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWsmJihhPXdbYS50b0xvd2VyQ2FzZSgpXT13W2EudG9Mb3dlckNhc2UoKV18fGEsdlthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1rJiYoby5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoayl5LmFsd2F5cyhhW3kuc3RhdHVzXSk7ZWxzZSBmb3IoYiBpbiBhKXVbYl09W3VbYl0sYVtiXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHg7cmV0dXJuIGUmJmUuYWJvcnQoYiksQSgwLGIpLHRoaXN9fTtpZihzLnByb21pc2UoeSksby51cmw9KChifHxvLnVybHx8dGIuaHJlZikrIiIpLnJlcGxhY2UoSGIsdGIucHJvdG9jb2wrIi8vIiksby50eXBlPWMubWV0aG9kfHxjLnR5cGV8fG8ubWV0aG9kfHxvLnR5cGUsby5kYXRhVHlwZXM9KG8uZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8WyIiXSxudWxsPT1vLmNyb3NzRG9tYWluKXtqPWQuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtqLmhyZWY9by51cmwsai5ocmVmPWouaHJlZixvLmNyb3NzRG9tYWluPUxiLnByb3RvY29sKyIvLyIrTGIuaG9zdCE9ai5wcm90b2NvbCsiLy8iK2ouaG9zdH1jYXRjaCh6KXtvLmNyb3NzRG9tYWluPSEwfX1pZihvLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygby5kYXRhJiYoby5kYXRhPXIucGFyYW0oby5kYXRhLG8udHJhZGl0aW9uYWwpKSxOYihJYixvLGMseSksaylyZXR1cm4geTtsPXIuZXZlbnQmJm8uZ2xvYmFsLGwmJjA9PT1yLmFjdGl2ZSsrJiZyLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLG8udHlwZT1vLnR5cGUudG9VcHBlckNhc2UoKSxvLmhhc0NvbnRlbnQ9IUdiLnRlc3Qoby50eXBlKSxmPW8udXJsLnJlcGxhY2UoQ2IsIiIpLG8uaGFzQ29udGVudD9vLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJjA9PT0oby5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoby5kYXRhPW8uZGF0YS5yZXBsYWNlKEJiLCIrIikpOihuPW8udXJsLnNsaWNlKGYubGVuZ3RoKSxvLmRhdGEmJihmKz0odmIudGVzdChmKT8iJiI6Ij8iKStvLmRhdGEsZGVsZXRlIG8uZGF0YSksby5jYWNoZT09PSExJiYoZj1mLnJlcGxhY2UoRGIsIiQxIiksbj0odmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3ViKysgK24pLG8udXJsPWYrbiksby5pZk1vZGlmaWVkJiYoci5sYXN0TW9kaWZpZWRbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHIubGFzdE1vZGlmaWVkW2ZdKSxyLmV0YWdbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsci5ldGFnW2ZdKSksKG8uZGF0YSYmby5oYXNDb250ZW50JiZvLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsby5jb250ZW50VHlwZSkseS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLG8uZGF0YVR5cGVzWzBdJiZvLmFjY2VwdHNbby5kYXRhVHlwZXNbMF1dP28uYWNjZXB0c1tvLmRhdGFUeXBlc1swXV0rKCIqIiE9PW8uZGF0YVR5cGVzWzBdPyIsICIrS2IrIjsgcT0wLjAxIjoiIik6by5hY2NlcHRzWyIqIl0pO2ZvcihtIGluIG8uaGVhZGVycyl5LnNldFJlcXVlc3RIZWFkZXIobSxvLmhlYWRlcnNbbV0pO2lmKG8uYmVmb3JlU2VuZCYmKG8uYmVmb3JlU2VuZC5jYWxsKHAseSxvKT09PSExfHxrKSlyZXR1cm4geS5hYm9ydCgpO2lmKHg9ImFib3J0Iix0LmFkZChvLmNvbXBsZXRlKSx5LmRvbmUoby5zdWNjZXNzKSx5LmZhaWwoby5lcnJvciksZT1OYihKYixvLGMseSkpe2lmKHkucmVhZHlTdGF0ZT0xLGwmJnEudHJpZ2dlcigiYWpheFNlbmQiLFt5LG9dKSxrKXJldHVybiB5O28uYXN5bmMmJm8udGltZW91dD4wJiYoaT1hLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt5LmFib3J0KCJ0aW1lb3V0Iil9LG8udGltZW91dCkpO3RyeXtrPSExLGUuc2VuZCh2LEEpfWNhdGNoKHope2lmKGspdGhyb3cgejtBKC0xLHopfX1lbHNlIEEoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIEEoYixjLGQsaCl7dmFyIGosbSxuLHYsdyx4PWM7a3x8KGs9ITAsaSYmYS5jbGVhclRpbWVvdXQoaSksZT12b2lkIDAsZz1ofHwiIix5LnJlYWR5U3RhdGU9Yj4wPzQ6MCxqPWI+PTIwMCYmYjwzMDB8fDMwND09PWIsZCYmKHY9UGIobyx5LGQpKSx2PVFiKG8sdix5LGopLGo/KG8uaWZNb2RpZmllZCYmKHc9eS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihyLmxhc3RNb2RpZmllZFtmXT13KSx3PXkuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoci5ldGFnW2ZdPXcpKSwyMDQ9PT1ifHwiSEVBRCI9PT1vLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1iP3g9Im5vdG1vZGlmaWVkIjooeD12LnN0YXRlLG09di5kYXRhLG49di5lcnJvcixqPSFuKSk6KG49eCwhYiYmeHx8KHg9ImVycm9yIixiPDAmJihiPTApKSkseS5zdGF0dXM9Yix5LnN0YXR1c1RleHQ9KGN8fHgpKyIiLGo/cy5yZXNvbHZlV2l0aChwLFttLHgseV0pOnMucmVqZWN0V2l0aChwLFt5LHgsbl0pLHkuc3RhdHVzQ29kZSh1KSx1PXZvaWQgMCxsJiZxLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt5LG8saj9tOm5dKSx0LmZpcmVXaXRoKHAsW3kseF0pLGwmJihxLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3ksb10pLC0tci5hY3RpdmV8fHIuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB5fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gci5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHIuZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLHIuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe3JbYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHIuaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLHIuYWpheChyLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sci5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksci5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gci5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxyLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gdGhpc1swXSYmKHIuaXNGdW5jdGlvbihhKSYmKGE9YS5jYWxsKHRoaXNbMF0pKSxiPXIoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiByLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXIodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9ci5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7cih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxyLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIXIuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LHIuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxyLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319O3ZhciBSYj17MDoyMDAsMTIyMzoyMDR9LFNiPXIuYWpheFNldHRpbmdzLnhocigpO28uY29ycz0hIVNiJiYid2l0aENyZWRlbnRpYWxzImluIFNiLG8uYWpheD1TYj0hIVNiLHIuYWpheFRyYW5zcG9ydChmdW5jdGlvbihiKXt2YXIgYyxkO2lmKG8uY29yc3x8U2ImJiFiLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7dmFyIGcsaD1iLnhocigpO2lmKGgub3BlbihiLnR5cGUsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpLGIueGhyRmllbGRzKWZvcihnIGluIGIueGhyRmllbGRzKWhbZ109Yi54aHJGaWVsZHNbZ107Yi5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYi5taW1lVHlwZSksYi5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihnIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGcsZVtnXSk7Yz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtjJiYoYz1kPWgub25sb2FkPWgub25lcnJvcj1oLm9uYWJvcnQ9aC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09YT9oLmFib3J0KCk6ImVycm9yIj09PWE/Im51bWJlciIhPXR5cGVvZiBoLnN0YXR1cz9mKDAsImVycm9yIik6ZihoLnN0YXR1cyxoLnN0YXR1c1RleHQpOmYoUmJbaC5zdGF0dXNdfHxoLnN0YXR1cyxoLnN0YXR1c1RleHQsInRleHQiIT09KGgucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIGgucmVzcG9uc2VUZXh0P3tiaW5hcnk6aC5yZXNwb25zZX06e3RleHQ6aC5yZXNwb25zZVRleHR9LGguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGgub25sb2FkPWMoKSxkPWgub25lcnJvcj1jKCJlcnJvciIpLHZvaWQgMCE9PWgub25hYm9ydD9oLm9uYWJvcnQ9ZDpoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1oLnJlYWR5U3RhdGUmJmEuc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmQoKX0pfSxjPWMoImFib3J0Iik7dHJ5e2guc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCl9Y2F0Y2goaSl7aWYoYyl0aHJvdyBpfX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX0pLHIuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXthLmNyb3NzRG9tYWluJiYoYS5jb250ZW50cy5zY3JpcHQ9ITEpfSksci5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ2xvYmFsRXZhbChhKSxhfX19KSxyLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksci5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXtiPXIoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZigiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGQuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgVGI9W10sVWI9Lyg9KVw/KD89JnwkKXxcP1w/LztyLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9VGIucG9wKCl8fHIuZXhwYW5kbysiXyIrdWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLHIuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKFViLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVWIudGVzdChiLmRhdGEpJiYiZGF0YSIpO2lmKGh8fCJqc29ucCI9PT1iLmRhdGFUeXBlc1swXSlyZXR1cm4gZT1iLmpzb25wQ2FsbGJhY2s9ci5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGg/YltoXT1iW2hdLnJlcGxhY2UoVWIsIiQxIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KHZiLnRlc3QoYi51cmwpPyImIjoiPyIpK2IuanNvbnArIj0iK2UpLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBnfHxyLmVycm9yKGUrIiB3YXMgbm90IGNhbGxlZCIpLGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWY/cihhKS5yZW1vdmVQcm9wKGUpOmFbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxUYi5wdXNoKGUpKSxnJiZyLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLCJzY3JpcHQifSksby5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1kLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09YS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxyLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybltdOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSk7dmFyIGUsZixnO3JldHVybiBifHwoby5jcmVhdGVIVE1MRG9jdW1lbnQ/KGI9ZC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLGU9Yi5jcmVhdGVFbGVtZW50KCJiYXNlIiksZS5ocmVmPWQubG9jYXRpb24uaHJlZixiLmhlYWQuYXBwZW5kQ2hpbGQoZSkpOmI9ZCksZj1DLmV4ZWMoYSksZz0hYyYmW10sZj9bYi5jcmVhdGVFbGVtZW50KGZbMV0pXTooZj1xYShbYV0sYixnKSxnJiZnLmxlbmd0aCYmcihnKS5yZW1vdmUoKSxyLm1lcmdlKFtdLGYuY2hpbGROb2RlcykpfSxyLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD4tMSYmKGQ9cGIoYS5zbGljZShoKSksYT1hLnNsaWNlKDAsaCkpLHIuaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmci5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP3IoIjxkaXY+IikuYXBwZW5kKHIucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sci5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtyLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksci5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ3JlcChyLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0sci5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1yLmNzcyhhLCJwb3NpdGlvbiIpLGw9cihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9ci5jc3MoYSwidG9wIiksaT1yLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxyLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsci5leHRlbmQoe30saCkpKSxudWxsIT1iLnRvcCYmKG0udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG0ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sci5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3Iub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQsZSxmPXRoaXNbMF07aWYoZilyZXR1cm4gZi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9Zi5vd25lckRvY3VtZW50LGM9Yi5kb2N1bWVudEVsZW1lbnQsZT1iLmRlZmF1bHRWaWV3LHt0b3A6ZC50b3ArZS5wYWdlWU9mZnNldC1jLmNsaWVudFRvcCxsZWZ0OmQubGVmdCtlLnBhZ2VYT2Zmc2V0LWMuY2xpZW50TGVmdH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXIuY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLEIoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkPXt0b3A6ZC50b3Arci5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxsZWZ0OmQubGVmdCtyLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKX0pLHt0b3A6Yi50b3AtZC50b3Atci5jc3MoYywibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtZC5sZWZ0LXIuY3NzKGMsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYic3RhdGljIj09PXIuY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8cmF9KX19KSxyLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0icGFnZVlPZmZzZXQiPT09YjtyLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmO3JldHVybiByLmlzV2luZG93KGEpP2Y9YTo5PT09YS5ub2RlVHlwZSYmKGY9YS5kZWZhdWx0Vmlldyksdm9pZCAwPT09ZT9mP2ZbYl06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP2YucGFnZVhPZmZzZXQ6ZSxjP2U6Zi5wYWdlWU9mZnNldCk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgpfX0pLHIuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe3IuY3NzSG9va3NbYl09UGEoby5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7aWYoYylyZXR1cm4gYz1PYShhLGIpLE1hLnRlc3QoYyk/cihhKS5wb3NpdGlvbigpW2JdKyJweCI6Y30pfSksci5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7ci5mbltkXT1mdW5jdGlvbihlLGYpe3ZhciBnPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxoPWN8fChlPT09ITB8fGY9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihiLGMsZSl7dmFyIGY7cmV0dXJuIHIuaXNXaW5kb3coYik/MD09PWQuaW5kZXhPZigib3V0ZXIiKT9iWyJpbm5lciIrYV06Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGY9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGZbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGZbIm9mZnNldCIrYV0sZlsiY2xpZW50IithXSkpOnZvaWQgMD09PWU/ci5jc3MoYixjLGgpOnIuc3R5bGUoYixjLGUsaCl9LGIsZz9lOnZvaWQgMCxnKX19KX0pLHIuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KSxyLmhvbGRSZWFkeT1mdW5jdGlvbihhKXthP3IucmVhZHlXYWl0Kys6ci5yZWFkeSghMCl9LHIuaXNBcnJheT1BcnJheS5pc0FycmF5LHIucGFyc2VKU09OPUpTT04ucGFyc2Usci5ub2RlTmFtZT1CLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIFZiPWEualF1ZXJ5LFdiPWEuJDtyZXR1cm4gci5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1yJiYoYS4kPVdiKSxiJiZhLmpRdWVyeT09PXImJihhLmpRdWVyeT1WYikscn0sYnx8KGEualF1ZXJ5PWEuJD1yKSxyfSk7Cg=="},{"meta":{"name":"sweetalert2@9","url":"https://cdn.jsdelivr.net/npm/sweetalert2@9","ts":1599018176000,"mimetype":"text/plain"},"source":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9dHx8c2VsZikuU3dlZXRhbGVydDI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBhKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fWZ1bmN0aW9uIGModCxlLG4pe3JldHVybiBlJiZvKHQucHJvdG90eXBlLGUpLG4mJm8odCxuKSx0fWZ1bmN0aW9uIHMoKXtyZXR1cm4ocz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciBvIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sbykmJih0W29dPW5bb10pfXJldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHUodCl7cmV0dXJuKHU9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4obD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gZCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4oaT1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlLG4pe3ZhciBvPVtudWxsXTtvLnB1c2guYXBwbHkobyxlKTt2YXIgaT1uZXcoRnVuY3Rpb24uYmluZC5hcHBseSh0LG8pKTtyZXR1cm4gbiYmbChpLG4ucHJvdG90eXBlKSxpfSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJuKGY9InVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmdldD9SZWZsZWN0LmdldDpmdW5jdGlvbih0LGUsbil7dmFyIG89ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXUodCkpOyk7cmV0dXJuIHR9KHQsZSk7aWYobyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLGUpO3JldHVybiBpLmdldD9pLmdldC5jYWxsKG4pOmkudmFsdWV9fSkodCxlLG58fHQpfWZ1bmN0aW9uIG0oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pfWZ1bmN0aW9uIGgodCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpfWZ1bmN0aW9uIGcodCxlKXt2YXIgbjtuPSciJy5jb25jYXQodCwnIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSAiJykuY29uY2F0KGUsJyIgaW5zdGVhZC4nKSwtMT09PXouaW5kZXhPZihuKSYmKHoucHVzaChuKSxfKG4pKX1mdW5jdGlvbiB2KHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50b1Byb21pc2V9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdih0KT90LnRvUHJvbWlzZSgpOlByb21pc2UucmVzb2x2ZSh0KX1mdW5jdGlvbiB5KHQpe3JldHVybiB0JiZQcm9taXNlLnJlc29sdmUodCk9PT10fWZ1bmN0aW9uIHcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFbGVtZW50fHwib2JqZWN0Ij09PXIoZT10KSYmZS5qcXVlcnk7dmFyIGV9ZnVuY3Rpb24gdCh0KXt2YXIgZT17fTtmb3IodmFyIG4gaW4gdCllW3Rbbl1dPSJzd2FsMi0iK3Rbbl07cmV0dXJuIGV9ZnVuY3Rpb24gQyh0KXt2YXIgZT1RKCk7cmV0dXJuIGU/ZS5xdWVyeVNlbGVjdG9yKHQpOm51bGx9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gQygiLiIuY29uY2F0KHQpKX1mdW5jdGlvbiBuKCl7dmFyIHQ9JCgpO3JldHVybiBoKHQucXVlcnlTZWxlY3RvckFsbCgiLiIuY29uY2F0KFkuaWNvbikpKX1mdW5jdGlvbiBrKCl7dmFyIHQ9bigpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdnQodCl9KTtyZXR1cm4gdC5sZW5ndGg/dFswXTpudWxsfWZ1bmN0aW9uIHgoKXtyZXR1cm4gZShZLnRpdGxlKX1mdW5jdGlvbiBQKCl7cmV0dXJuIGUoWS5jb250ZW50KX1mdW5jdGlvbiBBKCl7cmV0dXJuIGUoWS5pbWFnZSl9ZnVuY3Rpb24gQigpe3JldHVybiBlKFlbInByb2dyZXNzLXN0ZXBzIl0pfWZ1bmN0aW9uIFMoKXtyZXR1cm4gZShZWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSl9ZnVuY3Rpb24gRSgpe3JldHVybiBDKCIuIi5jb25jYXQoWS5hY3Rpb25zLCIgLiIpLmNvbmNhdChZLmNvbmZpcm0pKX1mdW5jdGlvbiBPKCl7cmV0dXJuIEMoIi4iLmNvbmNhdChZLmFjdGlvbnMsIiAuIikuY29uY2F0KFkuY2FuY2VsKSl9ZnVuY3Rpb24gVCgpe3JldHVybiBlKFkuYWN0aW9ucyl9ZnVuY3Rpb24gTCgpe3JldHVybiBlKFkuaGVhZGVyKX1mdW5jdGlvbiBqKCl7cmV0dXJuIGUoWS5mb290ZXIpfWZ1bmN0aW9uIHEoKXtyZXR1cm4gZShZWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSl9ZnVuY3Rpb24gSSgpe3JldHVybiBlKFkuY2xvc2UpfWZ1bmN0aW9uIFYoKXt2YXIgdD1oKCQoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pOm5vdChbdGFiaW5kZXg9IjAiXSknKSkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKSwoZT1wYXJzZUludChlLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkpPHQ/MTp0PGU/LTE6MH0pLGU9aCgkKCkucXVlcnlTZWxlY3RvckFsbCgnXG4gIGFbaHJlZl0sXG4gIGFyZWFbaHJlZl0sXG4gIGlucHV0Om5vdChbZGlzYWJsZWRdKSxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxuICBidXR0b246bm90KFtkaXNhYmxlZF0pLFxuICBpZnJhbWUsXG4gIG9iamVjdCxcbiAgZW1iZWQsXG4gIFt0YWJpbmRleD0iMCJdLFxuICBbY29udGVudGVkaXRhYmxlXSxcbiAgYXVkaW9bY29udHJvbHNdLFxuICB2aWRlb1tjb250cm9sc10sXG4gIHN1bW1hcnlcbicpKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIi0xIiE9PXQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspLTE9PT1lLmluZGV4T2YodFtuXSkmJmUucHVzaCh0W25dKTtyZXR1cm4gZX0odC5jb25jYXQoZSkpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdnQodCl9KX1mdW5jdGlvbiBNKCl7cmV0dXJuIUooKSYmIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFlbIm5vLWJhY2tkcm9wIl0pfWZ1bmN0aW9uIFIoKXtyZXR1cm4gJCgpLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIil9ZnVuY3Rpb24gSChlLHQpe3ZhciBuO2UudGV4dENvbnRlbnQ9IiIsdCYmKG49KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L2h0bWwiKSxoKG4ucXVlcnlTZWxlY3RvcigiaGVhZCIpLmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZCh0KX0pLGgobi5xdWVyeVNlbGVjdG9yKCJib2R5IikuY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbih0KXtlLmFwcGVuZENoaWxkKHQpfSkpfWZ1bmN0aW9uIEQodCxlKXtpZihlKXtmb3IodmFyIG49ZS5zcGxpdCgvXHMrLyksbz0wO288bi5sZW5ndGg7bysrKWlmKCF0LmNsYXNzTGlzdC5jb250YWlucyhuW29dKSlyZXR1cm47cmV0dXJuIDF9fWZ1bmN0aW9uIE4odCxlLG4pe3ZhciBvLGk7aWYoaT1lLGgoKG89dCkuY2xhc3NMaXN0KS5mb3JFYWNoKGZ1bmN0aW9uKHQpey0xPT09bShZKS5pbmRleE9mKHQpJiYtMT09PW0oWikuaW5kZXhPZih0KSYmLTE9PT1tKGkuc2hvd0NsYXNzKS5pbmRleE9mKHQpJiZvLmNsYXNzTGlzdC5yZW1vdmUodCl9KSxlLmN1c3RvbUNsYXNzJiZlLmN1c3RvbUNsYXNzW25dKXtpZigic3RyaW5nIiE9dHlwZW9mIGUuY3VzdG9tQ2xhc3Nbbl0mJiFlLmN1c3RvbUNsYXNzW25dLmZvckVhY2gpcmV0dXJuIF8oIkludmFsaWQgdHlwZSBvZiBjdXN0b21DbGFzcy4iLmNvbmNhdChuLCchIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCAiJykuY29uY2F0KHIoZS5jdXN0b21DbGFzc1tuXSksJyInKSk7bXQodCxlLmN1c3RvbUNsYXNzW25dKX19dmFyIFU9IlN3ZWV0QWxlcnQyOiIsXz1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIiIuY29uY2F0KFUsIiAiKS5jb25jYXQodCkpfSxGPWZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IoIiIuY29uY2F0KFUsIiAiKS5jb25jYXQodCkpfSx6PVtdLFc9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnR9LEs9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOiJjYW5jZWwiLGJhY2tkcm9wOiJiYWNrZHJvcCIsY2xvc2U6ImNsb3NlIixlc2M6ImVzYyIsdGltZXI6InRpbWVyIn0pLFk9dChbImNvbnRhaW5lciIsInNob3duIiwiaGVpZ2h0LWF1dG8iLCJpb3NmaXgiLCJwb3B1cCIsIm1vZGFsIiwibm8tYmFja2Ryb3AiLCJuby10cmFuc2l0aW9uIiwidG9hc3QiLCJ0b2FzdC1zaG93biIsInRvYXN0LWNvbHVtbiIsInNob3ciLCJoaWRlIiwiY2xvc2UiLCJ0aXRsZSIsImhlYWRlciIsImNvbnRlbnQiLCJodG1sLWNvbnRhaW5lciIsImFjdGlvbnMiLCJjb25maXJtIiwiY2FuY2VsIiwiZm9vdGVyIiwiaWNvbiIsImljb24tY29udGVudCIsImltYWdlIiwiaW5wdXQiLCJmaWxlIiwicmFuZ2UiLCJzZWxlY3QiLCJyYWRpbyIsImNoZWNrYm94IiwibGFiZWwiLCJ0ZXh0YXJlYSIsImlucHV0ZXJyb3IiLCJ2YWxpZGF0aW9uLW1lc3NhZ2UiLCJwcm9ncmVzcy1zdGVwcyIsImFjdGl2ZS1wcm9ncmVzcy1zdGVwIiwicHJvZ3Jlc3Mtc3RlcCIsInByb2dyZXNzLXN0ZXAtbGluZSIsImxvYWRpbmciLCJzdHlsZWQiLCJ0b3AiLCJ0b3Atc3RhcnQiLCJ0b3AtZW5kIiwidG9wLWxlZnQiLCJ0b3AtcmlnaHQiLCJjZW50ZXIiLCJjZW50ZXItc3RhcnQiLCJjZW50ZXItZW5kIiwiY2VudGVyLWxlZnQiLCJjZW50ZXItcmlnaHQiLCJib3R0b20iLCJib3R0b20tc3RhcnQiLCJib3R0b20tZW5kIiwiYm90dG9tLWxlZnQiLCJib3R0b20tcmlnaHQiLCJncm93LXJvdyIsImdyb3ctY29sdW1uIiwiZ3Jvdy1mdWxsc2NyZWVuIiwicnRsIiwidGltZXItcHJvZ3Jlc3MtYmFyIiwidGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lciIsInNjcm9sbGJhci1tZWFzdXJlIiwiaWNvbi1zdWNjZXNzIiwiaWNvbi13YXJuaW5nIiwiaWNvbi1pbmZvIiwiaWNvbi1xdWVzdGlvbiIsImljb24tZXJyb3IiXSksWj10KFsic3VjY2VzcyIsIndhcm5pbmciLCJpbmZvIiwicXVlc3Rpb24iLCJlcnJvciJdKSxRPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KFkuY29udGFpbmVyKSl9LCQ9ZnVuY3Rpb24oKXtyZXR1cm4gZShZLnBvcHVwKX0sSj1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhZWyJ0b2FzdC1zaG93biJdKX0sWD17cHJldmlvdXNCb2R5UGFkZGluZzpudWxsfTtmdW5jdGlvbiBHKHQsZSl7aWYoIWUpcmV0dXJuIG51bGw7c3dpdGNoKGUpe2Nhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpjYXNlImZpbGUiOnJldHVybiBndCh0LFlbZV0pO2Nhc2UiY2hlY2tib3giOnJldHVybiB0LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChZLmNoZWNrYm94LCIgaW5wdXQiKSk7Y2FzZSJyYWRpbyI6cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KFkucmFkaW8sIiBpbnB1dDpjaGVja2VkIikpfHx0LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChZLnJhZGlvLCIgaW5wdXQ6Zmlyc3QtY2hpbGQiKSk7Y2FzZSJyYW5nZSI6cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KFkucmFuZ2UsIiBpbnB1dCIpKTtkZWZhdWx0OnJldHVybiBndCh0LFkuaW5wdXQpfX1mdW5jdGlvbiB0dCh0KXt2YXIgZTt0LmZvY3VzKCksImZpbGUiIT09dC50eXBlJiYoZT10LnZhbHVlLHQudmFsdWU9IiIsdC52YWx1ZT1lKX1mdW5jdGlvbiBldCh0LGUsbil7dCYmZSYmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dC5mb3JFYWNoP3QuZm9yRWFjaChmdW5jdGlvbih0KXtuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KTpuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KSl9ZnVuY3Rpb24gbnQodCxlLG4pe258fDA9PT1wYXJzZUludChuKT90LnN0eWxlW2VdPSJudW1iZXIiPT10eXBlb2Ygbj8iIi5jb25jYXQobiwicHgiKTpuOnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9ZnVuY3Rpb24gb3QodCxlKXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWU/ZToiZmxleCI7dC5zdHlsZS5vcGFjaXR5PSIiLHQuc3R5bGUuZGlzcGxheT1ufWZ1bmN0aW9uIGl0KHQpe3Quc3R5bGUub3BhY2l0eT0iIix0LnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIHJ0KHQsZSxuKXtlP290KHQsbik6aXQodCl9ZnVuY3Rpb24gYXQodCl7cmV0dXJuISEodC5zY3JvbGxIZWlnaHQ+dC5jbGllbnRIZWlnaHQpfWZ1bmN0aW9uIGN0KHQpe3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLG49cGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoImFuaW1hdGlvbi1kdXJhdGlvbiIpfHwiMCIpLG89cGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoInRyYW5zaXRpb24tZHVyYXRpb24iKXx8IjAiKTtyZXR1cm4gMDxufHwwPG99ZnVuY3Rpb24gc3QodCxlKXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWUmJmUsbz1xKCk7dnQobykmJihuJiYoby5zdHlsZS50cmFuc2l0aW9uPSJub25lIixvLnN0eWxlLndpZHRoPSIxMDAlIiksc2V0VGltZW91dChmdW5jdGlvbigpe28uc3R5bGUudHJhbnNpdGlvbj0id2lkdGggIi5jb25jYXQodC8xZTMsInMgbGluZWFyIiksby5zdHlsZS53aWR0aD0iMCUifSwxMCkpfWZ1bmN0aW9uIHV0KCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnR9ZnVuY3Rpb24gbHQodCl7c24uaXNWaXNpYmxlKCkmJmZ0IT09dC50YXJnZXQudmFsdWUmJnNuLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxmdD10LnRhcmdldC52YWx1ZX1mdW5jdGlvbiBkdCh0LGUpe3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9lLmFwcGVuZENoaWxkKHQpOiJvYmplY3QiPT09cih0KT93dCh0LGUpOnQmJkgoZSx0KX1mdW5jdGlvbiBwdCh0LGUpe3ZhciBuPVQoKSxvPUUoKSxpPU8oKTtlLnNob3dDb25maXJtQnV0dG9ufHxlLnNob3dDYW5jZWxCdXR0b258fGl0KG4pLE4obixlLCJhY3Rpb25zIikseHQobywiY29uZmlybSIsZSkseHQoaSwiY2FuY2VsIixlKSxlLmJ1dHRvbnNTdHlsaW5nP2Z1bmN0aW9uKHQsZSxuKXttdChbdCxlXSxZLnN0eWxlZCksbi5jb25maXJtQnV0dG9uQ29sb3ImJih0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1uLmNvbmZpcm1CdXR0b25Db2xvcik7bi5jYW5jZWxCdXR0b25Db2xvciYmKGUuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uY2FuY2VsQnV0dG9uQ29sb3IpO3t2YXIgbztSKCl8fChvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtY29sb3IiKSx0LnN0eWxlLmJvcmRlckxlZnRDb2xvcj1vLHQuc3R5bGUuYm9yZGVyUmlnaHRDb2xvcj1vKX19KG8saSxlKTooaHQoW28saV0sWS5zdHlsZWQpLG8uc3R5bGUuYmFja2dyb3VuZENvbG9yPW8uc3R5bGUuYm9yZGVyTGVmdENvbG9yPW8uc3R5bGUuYm9yZGVyUmlnaHRDb2xvcj0iIixpLnN0eWxlLmJhY2tncm91bmRDb2xvcj1pLnN0eWxlLmJvcmRlckxlZnRDb2xvcj1pLnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9IiIpLGUucmV2ZXJzZUJ1dHRvbnMmJm8ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxvKX12YXIgZnQsbXQ9ZnVuY3Rpb24odCxlKXtldCh0LGUsITApfSxodD1mdW5jdGlvbih0LGUpe2V0KHQsZSwhMSl9LGd0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNoaWxkTm9kZXMubGVuZ3RoO24rKylpZihEKHQuY2hpbGROb2Rlc1tuXSxlKSlyZXR1cm4gdC5jaGlsZE5vZGVzW25dfSx2dD1mdW5jdGlvbih0KXtyZXR1cm4hKCF0fHwhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSl9LGJ0PSdcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT0iJy5jb25jYXQoWS50aXRsZSwnIiBhcmlhLWRlc2NyaWJlZGJ5PSInKS5jb25jYXQoWS5jb250ZW50LCciIGNsYXNzPSInKS5jb25jYXQoWS5wb3B1cCwnIiB0YWJpbmRleD0iLTEiPlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFkuaGVhZGVyLCciPlxuICAgICA8dWwgY2xhc3M9IicpLmNvbmNhdChZWyJwcm9ncmVzcy1zdGVwcyJdLCciPjwvdWw+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChZLmljb24sIiAiKS5jb25jYXQoWi5lcnJvciwnIj48L2Rpdj5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFkuaWNvbiwiICIpLmNvbmNhdChaLnF1ZXN0aW9uLCciPjwvZGl2PlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoWS5pY29uLCIgIikuY29uY2F0KFoud2FybmluZywnIj48L2Rpdj5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFkuaWNvbiwiICIpLmNvbmNhdChaLmluZm8sJyI+PC9kaXY+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChZLmljb24sIiAiKS5jb25jYXQoWi5zdWNjZXNzLCciPjwvZGl2PlxuICAgICA8aW1nIGNsYXNzPSInKS5jb25jYXQoWS5pbWFnZSwnIiAvPlxuICAgICA8aDIgY2xhc3M9IicpLmNvbmNhdChZLnRpdGxlLCciIGlkPSInKS5jb25jYXQoWS50aXRsZSwnIj48L2gyPlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicpLmNvbmNhdChZLmNsb3NlLCciPjwvYnV0dG9uPlxuICAgPC9kaXY+XG4gICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoWS5jb250ZW50LCciPlxuICAgICA8ZGl2IGlkPSInKS5jb25jYXQoWS5jb250ZW50LCciIGNsYXNzPSInKS5jb25jYXQoWVsiaHRtbC1jb250YWluZXIiXSwnIj48L2Rpdj5cbiAgICAgPGlucHV0IGNsYXNzPSInKS5jb25jYXQoWS5pbnB1dCwnIiAvPlxuICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgY2xhc3M9IicpLmNvbmNhdChZLmZpbGUsJyIgLz5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFkucmFuZ2UsJyI+XG4gICAgICAgPGlucHV0IHR5cGU9InJhbmdlIiAvPlxuICAgICAgIDxvdXRwdXQ+PC9vdXRwdXQ+XG4gICAgIDwvZGl2PlxuICAgICA8c2VsZWN0IGNsYXNzPSInKS5jb25jYXQoWS5zZWxlY3QsJyI+PC9zZWxlY3Q+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChZLnJhZGlvLCciPjwvZGl2PlxuICAgICA8bGFiZWwgZm9yPSInKS5jb25jYXQoWS5jaGVja2JveCwnIiBjbGFzcz0iJykuY29uY2F0KFkuY2hlY2tib3gsJyI+XG4gICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPlxuICAgICAgIDxzcGFuIGNsYXNzPSInKS5jb25jYXQoWS5sYWJlbCwnIj48L3NwYW4+XG4gICAgIDwvbGFiZWw+XG4gICAgIDx0ZXh0YXJlYSBjbGFzcz0iJykuY29uY2F0KFkudGV4dGFyZWEsJyI+PC90ZXh0YXJlYT5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFlbInZhbGlkYXRpb24tbWVzc2FnZSJdLCciIGlkPSInKS5jb25jYXQoWVsidmFsaWRhdGlvbi1tZXNzYWdlIl0sJyI+PC9kaXY+XG4gICA8L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdChZLmFjdGlvbnMsJyI+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KFkuY29uZmlybSwnIj5PSzwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicpLmNvbmNhdChZLmNhbmNlbCwnIj5DYW5jZWw8L2J1dHRvbj5cbiAgIDwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFkuZm9vdGVyLCciPjwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFlbInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXIiXSwnIj5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KFlbInRpbWVyLXByb2dyZXNzLWJhciJdLCciPjwvZGl2PlxuICAgPC9kaXY+XG4gPC9kaXY+XG4nKS5yZXBsYWNlKC8oXnxcbilccyovZywiIikseXQ9ZnVuY3Rpb24odCl7dmFyIGUsbixvLGkscixhLGMscyx1LGwsZCxwLGYsbSxoLGc9ISEoZT1RKCkpJiYoZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGh0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sW1lbIm5vLWJhY2tkcm9wIl0sWVsidG9hc3Qtc2hvd24iXSxZWyJoYXMtY29sdW1uIl1dKSwhMCk7dXQoKT9GKCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplIik6KChuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc05hbWU9WS5jb250YWluZXIsZyYmbXQobixZWyJuby10cmFuc2l0aW9uIl0pLEgobixidCksKG89InN0cmluZyI9PXR5cGVvZihpPXQudGFyZ2V0KT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGkpOmkpLmFwcGVuZENoaWxkKG4pLHI9dCwoYT0kKCkpLnNldEF0dHJpYnV0ZSgicm9sZSIsci50b2FzdD8iYWxlcnQiOiJkaWFsb2ciKSxhLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIixyLnRvYXN0PyJwb2xpdGUiOiJhc3NlcnRpdmUiKSxyLnRvYXN0fHxhLnNldEF0dHJpYnV0ZSgiYXJpYS1tb2RhbCIsInRydWUiKSxjPW8sInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjKS5kaXJlY3Rpb24mJm10KFEoKSxZLnJ0bCkscz1QKCksdT1ndChzLFkuaW5wdXQpLGw9Z3QocyxZLmZpbGUpLGQ9cy5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoWS5yYW5nZSwiIGlucHV0IikpLHA9cy5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoWS5yYW5nZSwiIG91dHB1dCIpKSxmPWd0KHMsWS5zZWxlY3QpLG09cy5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoWS5jaGVja2JveCwiIGlucHV0IikpLGg9Z3QocyxZLnRleHRhcmVhKSx1Lm9uaW5wdXQ9bHQsbC5vbmNoYW5nZT1sdCxmLm9uY2hhbmdlPWx0LG0ub25jaGFuZ2U9bHQsaC5vbmlucHV0PWx0LGQub25pbnB1dD1mdW5jdGlvbih0KXtsdCh0KSxwLnZhbHVlPWQudmFsdWV9LGQub25jaGFuZ2U9ZnVuY3Rpb24odCl7bHQodCksZC5uZXh0U2libGluZy52YWx1ZT1kLnZhbHVlfSl9LHd0PWZ1bmN0aW9uKHQsZSl7dC5qcXVlcnk/Q3QoZSx0KTpIKGUsdC50b1N0cmluZygpKX0sQ3Q9ZnVuY3Rpb24odCxlKXtpZih0LnRleHRDb250ZW50PSIiLDAgaW4gZSlmb3IodmFyIG49MDtuIGluIGU7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5jbG9uZU5vZGUoITApKTtlbHNlIHQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUoITApKX0sa3Q9ZnVuY3Rpb24oKXtpZih1dCgpKXJldHVybiExO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGU9e1dlYmtpdEFuaW1hdGlvbjoid2Via2l0QW5pbWF0aW9uRW5kIixPQW5pbWF0aW9uOiJvQW5pbWF0aW9uRW5kIG9hbmltYXRpb25lbmQiLGFuaW1hdGlvbjoiYW5pbWF0aW9uZW5kIn07Zm9yKHZhciBuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnZvaWQgMCE9PXQuc3R5bGVbbl0pcmV0dXJuIGVbbl07cmV0dXJuITF9KCk7ZnVuY3Rpb24geHQodCxlLG4pe3ZhciBvO3J0KHQsblsic2hvdyIuY29uY2F0KChvPWUpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK28uc2xpY2UoMSksIkJ1dHRvbiIpXSwiaW5saW5lLWJsb2NrIiksSCh0LG5bIiIuY29uY2F0KGUsIkJ1dHRvblRleHQiKV0pLHQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixuWyIiLmNvbmNhdChlLCJCdXR0b25BcmlhTGFiZWwiKV0pLHQuY2xhc3NOYW1lPVlbZV0sTih0LG4sIiIuY29uY2F0KGUsIkJ1dHRvbiIpKSxtdCh0LG5bIiIuY29uY2F0KGUsIkJ1dHRvbkNsYXNzIildKX1mdW5jdGlvbiBQdCh0LGUpe3ZhciBuLG8saSxyLGEsYyxzLHUsbD1RKCk7bCYmKG49bCwic3RyaW5nIj09dHlwZW9mKG89ZS5iYWNrZHJvcCk/bi5zdHlsZS5iYWNrZ3JvdW5kPW86b3x8bXQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxZWyJuby1iYWNrZHJvcCJdKSwhZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmXygnImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpLGk9bCwocj1lLnBvc2l0aW9uKWluIFk/bXQoaSxZW3JdKTooXygnVGhlICJwb3NpdGlvbiIgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiY2VudGVyIicpLG10KGksWS5jZW50ZXIpKSxhPWwsIShjPWUuZ3Jvdyl8fCJzdHJpbmciIT10eXBlb2YgY3x8KHM9Imdyb3ctIi5jb25jYXQoYykpaW4gWSYmbXQoYSxZW3NdKSxOKGwsZSwiY29udGFpbmVyIiksKHU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtc3dhbDItcXVldWUtc3RlcCIpKSYmKGwuc2V0QXR0cmlidXRlKCJkYXRhLXF1ZXVlLXN0ZXAiLHUpLGRvY3VtZW50LmJvZHkucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAiKSkpfWZ1bmN0aW9uIEF0KHQsZSl7dC5wbGFjZWhvbGRlciYmIWUuaW5wdXRQbGFjZWhvbGRlcnx8KHQucGxhY2Vob2xkZXI9ZS5pbnB1dFBsYWNlaG9sZGVyKX12YXIgQnQ9e3Byb21pc2U6bmV3IFdlYWtNYXAsaW5uZXJQYXJhbXM6bmV3IFdlYWtNYXAsZG9tQ2FjaGU6bmV3IFdlYWtNYXB9LFN0PVsiaW5wdXQiLCJmaWxlIiwicmFuZ2UiLCJzZWxlY3QiLCJyYWRpbyIsImNoZWNrYm94IiwidGV4dGFyZWEiXSxFdD1mdW5jdGlvbih0KXtpZighanRbdC5pbnB1dF0pcmV0dXJuIEYoJ1VuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dCEgRXhwZWN0ZWQgInRleHQiLCAiZW1haWwiLCAicGFzc3dvcmQiLCAibnVtYmVyIiwgInRlbCIsICJzZWxlY3QiLCAicmFkaW8iLCAiY2hlY2tib3giLCAidGV4dGFyZWEiLCAiZmlsZSIgb3IgInVybCIsIGdvdCAiJy5jb25jYXQodC5pbnB1dCwnIicpKTt2YXIgZT1MdCh0LmlucHV0KSxuPWp0W3QuaW5wdXRdKGUsdCk7b3Qobiksc2V0VGltZW91dChmdW5jdGlvbigpe3R0KG4pfSl9LE90PWZ1bmN0aW9uKHQsZSl7dmFyIG49RyhQKCksdCk7aWYobilmb3IodmFyIG8gaW4hZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LmF0dHJpYnV0ZXMubGVuZ3RoO2UrKyl7dmFyIG49dC5hdHRyaWJ1dGVzW2VdLm5hbWU7LTE9PT1bInR5cGUiLCJ2YWx1ZSIsInN0eWxlIl0uaW5kZXhPZihuKSYmdC5yZW1vdmVBdHRyaWJ1dGUobil9fShuKSxlKSJyYW5nZSI9PT10JiYicGxhY2Vob2xkZXIiPT09b3x8bi5zZXRBdHRyaWJ1dGUobyxlW29dKX0sVHQ9ZnVuY3Rpb24odCl7dmFyIGU9THQodC5pbnB1dCk7dC5jdXN0b21DbGFzcyYmbXQoZSx0LmN1c3RvbUNsYXNzLmlucHV0KX0sTHQ9ZnVuY3Rpb24odCl7dmFyIGU9WVt0XT9ZW3RdOlkuaW5wdXQ7cmV0dXJuIGd0KFAoKSxlKX0sanQ9e307anQudGV4dD1qdC5lbWFpbD1qdC5wYXNzd29yZD1qdC5udW1iZXI9anQudGVsPWp0LnVybD1mdW5jdGlvbih0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZS5pbnB1dFZhbHVlfHwibnVtYmVyIj09dHlwZW9mIGUuaW5wdXRWYWx1ZT90LnZhbHVlPWUuaW5wdXRWYWx1ZTp5KGUuaW5wdXRWYWx1ZSl8fF8oJ1VuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIicuY29uY2F0KHIoZS5pbnB1dFZhbHVlKSwnIicpKSxBdCh0LGUpLHQudHlwZT1lLmlucHV0LHR9LGp0LmZpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQXQodCxlKSx0fSxqdC5yYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiaW5wdXQiKSxvPXQucXVlcnlTZWxlY3Rvcigib3V0cHV0Iik7cmV0dXJuIG4udmFsdWU9ZS5pbnB1dFZhbHVlLG4udHlwZT1lLmlucHV0LG8udmFsdWU9ZS5pbnB1dFZhbHVlLHR9LGp0LnNlbGVjdD1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiB0LnRleHRDb250ZW50PSIiLGUuaW5wdXRQbGFjZWhvbGRlciYmKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIiksSChuLGUuaW5wdXRQbGFjZWhvbGRlciksbi52YWx1ZT0iIixuLmRpc2FibGVkPSEwLG4uc2VsZWN0ZWQ9ITAsdC5hcHBlbmRDaGlsZChuKSksdH0sanQucmFkaW89ZnVuY3Rpb24odCl7cmV0dXJuIHQudGV4dENvbnRlbnQ9IiIsdH0sanQuY2hlY2tib3g9ZnVuY3Rpb24odCxlKXt2YXIgbj1HKFAoKSwiY2hlY2tib3giKTtuLnZhbHVlPTEsbi5pZD1ZLmNoZWNrYm94LG4uY2hlY2tlZD1Cb29sZWFuKGUuaW5wdXRWYWx1ZSk7dmFyIG89dC5xdWVyeVNlbGVjdG9yKCJzcGFuIik7cmV0dXJuIEgobyxlLmlucHV0UGxhY2Vob2xkZXIpLHR9LGp0LnRleHRhcmVhPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbztyZXR1cm4gZS52YWx1ZT10LmlucHV0VmFsdWUsQXQoZSx0KSwiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cmJihuPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCQoKSkud2lkdGgpLG89cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoJCgpKS5wYWRkaW5nTGVmdCkrcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoJCgpKS5wYWRkaW5nUmlnaHQpLG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5vZmZzZXRXaWR0aCtvOyQoKS5zdHlsZS53aWR0aD1uPHQ/IiIuY29uY2F0KHQsInB4Iik6bnVsbH0pLm9ic2VydmUoZSx7YXR0cmlidXRlczohMCxhdHRyaWJ1dGVGaWx0ZXI6WyJzdHlsZSJdfSkpLGV9O2Z1bmN0aW9uIHF0KHQsZSl7dmFyIG4sbyxpLHIsYSxjPVAoKS5xdWVyeVNlbGVjdG9yKCIjIi5jb25jYXQoWS5jb250ZW50KSk7ZS5odG1sPyhkdChlLmh0bWwsYyksb3QoYywiYmxvY2siKSk6ZS50ZXh0PyhjLnRleHRDb250ZW50PWUudGV4dCxvdChjLCJibG9jayIpKTppdChjKSxuPXQsbz1lLGk9UCgpLHI9QnQuaW5uZXJQYXJhbXMuZ2V0KG4pLGE9IXJ8fG8uaW5wdXQhPT1yLmlucHV0LFN0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9WVt0XSxuPWd0KGksZSk7T3QodCxvLmlucHV0QXR0cmlidXRlcyksbi5jbGFzc05hbWU9ZSxhJiZpdChuKX0pLG8uaW5wdXQmJihhJiZFdChvKSxUdChvKSksTihQKCksZSwiY29udGVudCIpfWZ1bmN0aW9uIEl0KCl7cmV0dXJuIFEoKSYmUSgpLmdldEF0dHJpYnV0ZSgiZGF0YS1xdWV1ZS1zdGVwIil9ZnVuY3Rpb24gVnQodCxzKXt2YXIgdT1CKCk7aWYoIXMucHJvZ3Jlc3NTdGVwc3x8MD09PXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgpcmV0dXJuIGl0KHUpLDA7b3QodSksdS50ZXh0Q29udGVudD0iIjt2YXIgbD1wYXJzZUludCh2b2lkIDA9PT1zLmN1cnJlbnRQcm9ncmVzc1N0ZXA/SXQoKTpzLmN1cnJlbnRQcm9ncmVzc1N0ZXApO2w+PXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgmJl8oIkludmFsaWQgY3VycmVudFByb2dyZXNzU3RlcCBwYXJhbWV0ZXIsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gcHJvZ3Jlc3NTdGVwcy5sZW5ndGggKGN1cnJlbnRQcm9ncmVzc1N0ZXAgbGlrZSBKUyBhcnJheXMgc3RhcnRzIGZyb20gMCkiKSxzLnByb2dyZXNzU3RlcHMuZm9yRWFjaChmdW5jdGlvbih0LGUpe3ZhciBuLG8saSxyLGEsYz0obj10LG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxtdChvLFlbInByb2dyZXNzLXN0ZXAiXSksSChvLG4pLG8pO3UuYXBwZW5kQ2hpbGQoYyksZT09PWwmJm10KGMsWVsiYWN0aXZlLXByb2dyZXNzLXN0ZXAiXSksZSE9PXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgtMSYmKHI9cyxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIiksbXQoYSxZWyJwcm9ncmVzcy1zdGVwLWxpbmUiXSksci5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UmJihhLnN0eWxlLndpZHRoPXIucHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlKSxpPWEsdS5hcHBlbmRDaGlsZChpKSl9KX1mdW5jdGlvbiBNdCh0LGUpe3ZhciBuLG8saSxyLGEsYyxzLHUsbD1MKCk7TihsLGUsImhlYWRlciIpLFZ0KDAsZSksbj10LG89ZSwocj1CdC5pbm5lclBhcmFtcy5nZXQobikpJiZvLmljb249PT1yLmljb24mJmsoKT9OKGsoKSxvLCJpY29uIik6KER0KCksby5pY29uJiYoLTEhPT1PYmplY3Qua2V5cyhaKS5pbmRleE9mKG8uaWNvbik/KGk9QygiLiIuY29uY2F0KFkuaWNvbiwiLiIpLmNvbmNhdChaW28uaWNvbl0pKSxvdChpKSxVdChpLG8pLE50KCksTihpLG8sImljb24iKSxtdChpLG8uc2hvd0NsYXNzLmljb24pKTpGKCdVbmtub3duIGljb24hIEV4cGVjdGVkICJzdWNjZXNzIiwgImVycm9yIiwgIndhcm5pbmciLCAiaW5mbyIgb3IgInF1ZXN0aW9uIiwgZ290ICInLmNvbmNhdChvLmljb24sJyInKSkpKSxmdW5jdGlvbih0KXt2YXIgZT1BKCk7aWYoIXQuaW1hZ2VVcmwpcmV0dXJuIGl0KGUpO290KGUsIiIpLGUuc2V0QXR0cmlidXRlKCJzcmMiLHQuaW1hZ2VVcmwpLGUuc2V0QXR0cmlidXRlKCJhbHQiLHQuaW1hZ2VBbHQpLG50KGUsIndpZHRoIix0LmltYWdlV2lkdGgpLG50KGUsImhlaWdodCIsdC5pbWFnZUhlaWdodCksZS5jbGFzc05hbWU9WS5pbWFnZSxOKGUsdCwiaW1hZ2UiKX0oZSksYT1lLGM9eCgpLHJ0KGMsYS50aXRsZXx8YS50aXRsZVRleHQpLGEudGl0bGUmJmR0KGEudGl0bGUsYyksYS50aXRsZVRleHQmJihjLmlubmVyVGV4dD1hLnRpdGxlVGV4dCksTihjLGEsInRpdGxlIikscz1lLHU9SSgpLEgodSxzLmNsb3NlQnV0dG9uSHRtbCksTih1LHMsImNsb3NlQnV0dG9uIikscnQodSxzLnNob3dDbG9zZUJ1dHRvbiksdS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHMuY2xvc2VCdXR0b25BcmlhTGFiZWwpfWZ1bmN0aW9uIFJ0KHQsZSl7dmFyIG4sbyxpLHI7bj1lLG89JCgpLG50KG8sIndpZHRoIixuLndpZHRoKSxudChvLCJwYWRkaW5nIixuLnBhZGRpbmcpLG4uYmFja2dyb3VuZCYmKG8uc3R5bGUuYmFja2dyb3VuZD1uLmJhY2tncm91bmQpLHp0KG8sbiksUHQoMCxlKSxNdCh0LGUpLHF0KHQsZSkscHQoMCxlKSxpPWUscj1qKCkscnQocixpLmZvb3RlciksaS5mb290ZXImJmR0KGkuZm9vdGVyLHIpLE4ocixpLCJmb290ZXIiKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vblJlbmRlciYmZS5vblJlbmRlcigkKCkpfWZ1bmN0aW9uIEh0KCl7cmV0dXJuIEUoKSYmRSgpLmNsaWNrKCl9dmFyIER0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW4oKSxlPTA7ZTx0Lmxlbmd0aDtlKyspaXQodFtlXSl9LE50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PSQoKSxlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtY29sb3IiKSxuPXQucXVlcnlTZWxlY3RvckFsbCgiW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdLCAuc3dhbDItc3VjY2Vzcy1maXgiKSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZX0sVXQ9ZnVuY3Rpb24odCxlKXt0LnRleHRDb250ZW50PSIiLGUuaWNvbkh0bWw/SCh0LF90KGUuaWNvbkh0bWwpKToic3VjY2VzcyI9PT1lLmljb24/SCh0LCdcbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1sZWZ0Ij48L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi1zdWNjZXNzLWxpbmUtdGlwIj48L3NwYW4+IDxzcGFuIGNsYXNzPSJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZyI+PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1yaW5nIj48L2Rpdj4gPGRpdiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1maXgiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLXJpZ2h0Ij48L2Rpdj5cbiAgICAnKToiZXJyb3IiPT09ZS5pY29uP0godCwnXG4gICAgICA8c3BhbiBjbGFzcz0ic3dhbDIteC1tYXJrIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyay1saW5lLWxlZnQiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyay1saW5lLXJpZ2h0Ij48L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgJyk6SCh0LF90KHtxdWVzdGlvbjoiPyIsd2FybmluZzoiISIsaW5mbzoiaSJ9W2UuaWNvbl0pKX0sX3Q9ZnVuY3Rpb24odCl7cmV0dXJuJzxkaXYgY2xhc3M9IicuY29uY2F0KFlbImljb24tY29udGVudCJdLCciPicpLmNvbmNhdCh0LCI8L2Rpdj4iKX0sRnQ9W10senQ9ZnVuY3Rpb24odCxlKXt0LmNsYXNzTmFtZT0iIi5jb25jYXQoWS5wb3B1cCwiICIpLmNvbmNhdCh2dCh0KT9lLnNob3dDbGFzcy5wb3B1cDoiIiksZS50b2FzdD8obXQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxZWyJ0b2FzdC1zaG93biJdKSxtdCh0LFkudG9hc3QpKTptdCh0LFkubW9kYWwpLE4odCxlLCJwb3B1cCIpLCJzdHJpbmciPT10eXBlb2YgZS5jdXN0b21DbGFzcyYmbXQodCxlLmN1c3RvbUNsYXNzKSxlLmljb24mJm10KHQsWVsiaWNvbi0iLmNvbmNhdChlLmljb24pXSl9O2Z1bmN0aW9uIFd0KCl7dmFyIHQ9JCgpO3R8fHNuLmZpcmUoKSx0PSQoKTt2YXIgZT1UKCksbj1FKCk7b3QoZSksb3QobiwiaW5saW5lLWJsb2NrIiksbXQoW3QsZV0sWS5sb2FkaW5nKSxuLmRpc2FibGVkPSEwLHQuc2V0QXR0cmlidXRlKCJkYXRhLWxvYWRpbmciLCEwKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1idXN5IiwhMCksdC5mb2N1cygpfWZ1bmN0aW9uIEt0KCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpe3ZhciBlPXdpbmRvdy5zY3JvbGxYLG49d2luZG93LnNjcm9sbFk7WHQucmVzdG9yZUZvY3VzVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WHQucHJldmlvdXNBY3RpdmVFbGVtZW50JiZYdC5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXM/KFh0LnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpLFh0LnByZXZpb3VzQWN0aXZlRWxlbWVudD1udWxsKTpkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5LmZvY3VzKCksdCgpfSwxMDApLHZvaWQgMCE9PWUmJnZvaWQgMCE9PW4mJndpbmRvdy5zY3JvbGxUbyhlLG4pfSl9ZnVuY3Rpb24gWXQoKXtpZihYdC50aW1lb3V0KXJldHVybiBmdW5jdGlvbigpe3ZhciB0PXEoKSxlPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLndpZHRoKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2l0aW9uIiksdC5zdHlsZS53aWR0aD0iMTAwJSI7dmFyIG49cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodCkud2lkdGgpLG89cGFyc2VJbnQoZS9uKjEwMCk7dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLHQuc3R5bGUud2lkdGg9IiIuY29uY2F0KG8sIiUiKX0oKSxYdC50aW1lb3V0LnN0b3AoKX1mdW5jdGlvbiBadCgpe2lmKFh0LnRpbWVvdXQpe3ZhciB0PVh0LnRpbWVvdXQuc3RhcnQoKTtyZXR1cm4gc3QodCksdH19ZnVuY3Rpb24gUXQodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHdCx0KX1mdW5jdGlvbiAkdCh0KXtyZXR1cm4gZWVbdF19ZnVuY3Rpb24gSnQodCl7Zm9yKHZhciBlIGluIHQpUXQoaT1lKXx8XygnVW5rbm93biBwYXJhbWV0ZXIgIicuY29uY2F0KGksJyInKSksdC50b2FzdCYmKG89ZSwtMSE9PW5lLmluZGV4T2YobykmJl8oJ1RoZSBwYXJhbWV0ZXIgIicuY29uY2F0KG8sJyIgaXMgaW5jb21wYXRpYmxlIHdpdGggdG9hc3RzJykpKSwkdChuPWUpJiZnKG4sJHQobikpO3ZhciBuLG8saX12YXIgWHQ9e30sR3Q9e3RpdGxlOiIiLHRpdGxlVGV4dDoiIix0ZXh0OiIiLGh0bWw6IiIsZm9vdGVyOiIiLGljb246dm9pZCAwLGljb25IdG1sOnZvaWQgMCx0b2FzdDohMSxhbmltYXRpb246ITAsc2hvd0NsYXNzOntwb3B1cDoic3dhbDItc2hvdyIsYmFja2Ryb3A6InN3YWwyLWJhY2tkcm9wLXNob3ciLGljb246InN3YWwyLWljb24tc2hvdyJ9LGhpZGVDbGFzczp7cG9wdXA6InN3YWwyLWhpZGUiLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1oaWRlIixpY29uOiJzd2FsMi1pY29uLWhpZGUifSxjdXN0b21DbGFzczp2b2lkIDAsdGFyZ2V0OiJib2R5IixiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6Ik9LIixjb25maXJtQnV0dG9uQXJpYUxhYmVsOiIiLGNvbmZpcm1CdXR0b25Db2xvcjp2b2lkIDAsY2FuY2VsQnV0dG9uVGV4dDoiQ2FuY2VsIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6IiIsY2FuY2VsQnV0dG9uQ29sb3I6dm9pZCAwLGJ1dHRvbnNTdHlsaW5nOiEwLHJldmVyc2VCdXR0b25zOiExLGZvY3VzQ29uZmlybTohMCxmb2N1c0NhbmNlbDohMSxzaG93Q2xvc2VCdXR0b246ITEsY2xvc2VCdXR0b25IdG1sOiImdGltZXM7IixjbG9zZUJ1dHRvbkFyaWFMYWJlbDoiQ2xvc2UgdGhpcyBkaWFsb2ciLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsaW1hZ2VVcmw6dm9pZCAwLGltYWdlV2lkdGg6dm9pZCAwLGltYWdlSGVpZ2h0OnZvaWQgMCxpbWFnZUFsdDoiIix0aW1lcjp2b2lkIDAsdGltZXJQcm9ncmVzc0JhcjohMSx3aWR0aDp2b2lkIDAscGFkZGluZzp2b2lkIDAsYmFja2dyb3VuZDp2b2lkIDAsaW5wdXQ6dm9pZCAwLGlucHV0UGxhY2Vob2xkZXI6IiIsaW5wdXRWYWx1ZToiIixpbnB1dE9wdGlvbnM6e30saW5wdXRBdXRvVHJpbTohMCxpbnB1dEF0dHJpYnV0ZXM6e30saW5wdXRWYWxpZGF0b3I6dm9pZCAwLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOiJjZW50ZXIiLHByb2dyZXNzU3RlcHM6W10sY3VycmVudFByb2dyZXNzU3RlcDp2b2lkIDAscHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOnZvaWQgMCxvbkJlZm9yZU9wZW46dm9pZCAwLG9uT3Blbjp2b2lkIDAsb25SZW5kZXI6dm9pZCAwLG9uQ2xvc2U6dm9pZCAwLG9uQWZ0ZXJDbG9zZTp2b2lkIDAsb25EZXN0cm95OnZvaWQgMCxzY3JvbGxiYXJQYWRkaW5nOiEwfSx0ZT1bInRpdGxlIiwidGl0bGVUZXh0IiwidGV4dCIsImh0bWwiLCJmb290ZXIiLCJpY29uIiwiaGlkZUNsYXNzIiwiY3VzdG9tQ2xhc3MiLCJhbGxvd091dHNpZGVDbGljayIsImFsbG93RXNjYXBlS2V5Iiwic2hvd0NvbmZpcm1CdXR0b24iLCJzaG93Q2FuY2VsQnV0dG9uIiwiY29uZmlybUJ1dHRvblRleHQiLCJjb25maXJtQnV0dG9uQXJpYUxhYmVsIiwiY29uZmlybUJ1dHRvbkNvbG9yIiwiY2FuY2VsQnV0dG9uVGV4dCIsImNhbmNlbEJ1dHRvbkFyaWFMYWJlbCIsImNhbmNlbEJ1dHRvbkNvbG9yIiwiYnV0dG9uc1N0eWxpbmciLCJyZXZlcnNlQnV0dG9ucyIsInNob3dDbG9zZUJ1dHRvbiIsImNsb3NlQnV0dG9uSHRtbCIsImNsb3NlQnV0dG9uQXJpYUxhYmVsIiwiaW1hZ2VVcmwiLCJpbWFnZVdpZHRoIiwiaW1hZ2VIZWlnaHQiLCJpbWFnZUFsdCIsInByb2dyZXNzU3RlcHMiLCJjdXJyZW50UHJvZ3Jlc3NTdGVwIiwib25DbG9zZSIsIm9uQWZ0ZXJDbG9zZSIsIm9uRGVzdHJveSJdLGVlPXthbmltYXRpb246J3Nob3dDbGFzcyIgYW5kICJoaWRlQ2xhc3MnfSxuZT1bImFsbG93T3V0c2lkZUNsaWNrIiwiYWxsb3dFbnRlcktleSIsImJhY2tkcm9wIiwiZm9jdXNDb25maXJtIiwiZm9jdXNDYW5jZWwiLCJoZWlnaHRBdXRvIiwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSJdLG9lPU9iamVjdC5mcmVlemUoe2lzVmFsaWRQYXJhbWV0ZXI6UXQsaXNVcGRhdGFibGVQYXJhbWV0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuLTEhPT10ZS5pbmRleE9mKHQpfSxpc0RlcHJlY2F0ZWRQYXJhbWV0ZXI6JHQsYXJnc1RvUGFyYW1zOmZ1bmN0aW9uKG8pe3ZhciBpPXt9O3JldHVybiJvYmplY3QiIT09cihvWzBdKXx8dyhvWzBdKT9bInRpdGxlIiwiaHRtbCIsImljb24iXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49b1tlXTsic3RyaW5nIj09dHlwZW9mIG58fHcobik/aVt0XT1uOnZvaWQgMCE9PW4mJkYoIlVuZXhwZWN0ZWQgdHlwZSBvZiAiLmNvbmNhdCh0LCchIEV4cGVjdGVkICJzdHJpbmciIG9yICJFbGVtZW50IiwgZ290ICcpLmNvbmNhdChyKG4pKSl9KTpzKGksb1swXSksaX0saXNWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHZ0KCQoKSl9LGNsaWNrQ29uZmlybTpIdCxjbGlja0NhbmNlbDpmdW5jdGlvbigpe3JldHVybiBPKCkmJk8oKS5jbGljaygpfSxnZXRDb250YWluZXI6USxnZXRQb3B1cDokLGdldFRpdGxlOngsZ2V0Q29udGVudDpQLGdldEh0bWxDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZShZWyJodG1sLWNvbnRhaW5lciJdKX0sZ2V0SW1hZ2U6QSxnZXRJY29uOmssZ2V0SWNvbnM6bixnZXRDbG9zZUJ1dHRvbjpJLGdldEFjdGlvbnM6VCxnZXRDb25maXJtQnV0dG9uOkUsZ2V0Q2FuY2VsQnV0dG9uOk8sZ2V0SGVhZGVyOkwsZ2V0Rm9vdGVyOmosZ2V0VGltZXJQcm9ncmVzc0JhcjpxLGdldEZvY3VzYWJsZUVsZW1lbnRzOlYsZ2V0VmFsaWRhdGlvbk1lc3NhZ2U6Uyxpc0xvYWRpbmc6UixmaXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGkodGhpcyxlKX0sbWl4aW46ZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZsKHQsZSl9KGksdCk7dmFyIG4sbyxlPShuPWksbz1kKCksZnVuY3Rpb24oKXt2YXIgdCxlPXUobik7cmV0dXJuIHAodGhpcyxvPyh0PXUodGhpcykuY29uc3RydWN0b3IsUmVmbGVjdC5jb25zdHJ1Y3QoZSxhcmd1bWVudHMsdCkpOmUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pO2Z1bmN0aW9uIGkoKXtyZXR1cm4gYSh0aGlzLGkpLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBjKGksW3trZXk6Il9tYWluIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gZih1KGkucHJvdG90eXBlKSwiX21haW4iLHRoaXMpLmNhbGwodGhpcyxzKHt9LHIsdCkpfX1dKSxpfSh0aGlzKX0scXVldWU6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcztGdD10O2Z1bmN0aW9uIGEodCxlKXtGdD1bXSx0KGUpfXZhciBjPVtdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpKXshZnVuY3Rpb24gZShuLG8pe248RnQubGVuZ3RoPyhkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgiZGF0YS1zd2FsMi1xdWV1ZS1zdGVwIixuKSxyLmZpcmUoRnRbbl0pLnRoZW4oZnVuY3Rpb24odCl7dm9pZCAwIT09dC52YWx1ZT8oYy5wdXNoKHQudmFsdWUpLGUobisxLG8pKTphKGkse2Rpc21pc3M6dC5kaXNtaXNzfSl9KSk6YShpLHt2YWx1ZTpjfSl9KDApfSl9LGdldFF1ZXVlU3RlcDpJdCxpbnNlcnRRdWV1ZVN0ZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSYmZTxGdC5sZW5ndGg/RnQuc3BsaWNlKGUsMCx0KTpGdC5wdXNoKHQpfSxkZWxldGVRdWV1ZVN0ZXA6ZnVuY3Rpb24odCl7dm9pZCAwIT09RnRbdF0mJkZ0LnNwbGljZSh0LDEpfSxzaG93TG9hZGluZzpXdCxlbmFibGVMb2FkaW5nOld0LGdldFRpbWVyTGVmdDpmdW5jdGlvbigpe3JldHVybiBYdC50aW1lb3V0JiZYdC50aW1lb3V0LmdldFRpbWVyTGVmdCgpfSxzdG9wVGltZXI6WXQscmVzdW1lVGltZXI6WnQsdG9nZ2xlVGltZXI6ZnVuY3Rpb24oKXt2YXIgdD1YdC50aW1lb3V0O3JldHVybiB0JiYodC5ydW5uaW5nP1l0Olp0KSgpfSxpbmNyZWFzZVRpbWVyOmZ1bmN0aW9uKHQpe2lmKFh0LnRpbWVvdXQpe3ZhciBlPVh0LnRpbWVvdXQuaW5jcmVhc2UodCk7cmV0dXJuIHN0KGUsITApLGV9fSxpc1RpbWVyUnVubmluZzpmdW5jdGlvbigpe3JldHVybiBYdC50aW1lb3V0JiZYdC50aW1lb3V0LmlzUnVubmluZygpfX0pO2Z1bmN0aW9uIGllKCl7dmFyIHQsZT1CdC5pbm5lclBhcmFtcy5nZXQodGhpcyk7ZSYmKHQ9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpLGUuc2hvd0NvbmZpcm1CdXR0b258fChpdCh0LmNvbmZpcm1CdXR0b24pLGUuc2hvd0NhbmNlbEJ1dHRvbnx8aXQodC5hY3Rpb25zKSksaHQoW3QucG9wdXAsdC5hY3Rpb25zXSxZLmxvYWRpbmcpLHQucG9wdXAucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWJ1c3kiKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiksdC5jb25maXJtQnV0dG9uLmRpc2FibGVkPSExLHQuY2FuY2VsQnV0dG9uLmRpc2FibGVkPSExKX1mdW5jdGlvbiByZSgpe251bGw9PT1YLnByZXZpb3VzQm9keVBhZGRpbmcmJmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodCYmKFgucHJldmlvdXNCb2R5UGFkZGluZz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLXJpZ2h0IikpLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PSIiLmNvbmNhdChYLnByZXZpb3VzQm9keVBhZGRpbmcrZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT1ZWyJzY3JvbGxiYXItbWVhc3VyZSJdLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC10LmNsaWVudFdpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLGV9KCksInB4IikpfWZ1bmN0aW9uIGFlKCl7cmV0dXJuISF3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQmJiEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlfWZ1bmN0aW9uIGNlKCl7dmFyIHQ9USgpLGU9JCgpO3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoImFsaWduLWl0ZW1zIiksZS5vZmZzZXRUb3A8MCYmKHQuc3R5bGUuYWxpZ25JdGVtcz0iZmxleC1zdGFydCIpfXZhciBzZT1mdW5jdGlvbigpe25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhDcmlPU3xGeGlPU3xFZGdpT1N8WWFCcm93c2VyfFVDQnJvd3NlcikvaSl8fCQoKS5zY3JvbGxIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0LTQ0JiYoUSgpLnN0eWxlLnBhZGRpbmdCb3R0b209IiIuY29uY2F0KDQ0LCJweCIpKX0sdWU9ZnVuY3Rpb24oKXt2YXIgZSx0PVEoKTt0Lm9udG91Y2hzdGFydD1mdW5jdGlvbih0KXtlPWxlKHQudGFyZ2V0KX0sdC5vbnRvdWNobW92ZT1mdW5jdGlvbih0KXtlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfX0sbGU9ZnVuY3Rpb24odCl7dmFyIGU9USgpO3JldHVybiB0PT09ZXx8IShhdChlKXx8IklOUFVUIj09PXQudGFnTmFtZXx8YXQoUCgpKSYmUCgpLmNvbnRhaW5zKHQpKX0sZGU9e3N3YWxQcm9taXNlUmVzb2x2ZTpuZXcgV2Vha01hcH07ZnVuY3Rpb24gcGUodCxlLG4sbyl7dmFyIGk7bj9oZSh0LG8pOihLdCgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gaGUodCxvKX0pLFh0LmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWHQua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6WHQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLFh0LmtleWRvd25IYW5kbGVyQWRkZWQ9ITEpLGUucGFyZW50Tm9kZSYmIWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAiKSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLE0oKSYmKG51bGwhPT1YLnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD0iIi5jb25jYXQoWC5wcmV2aW91c0JvZHlQYWRkaW5nLCJweCIpLFgucHJldmlvdXNCb2R5UGFkZGluZz1udWxsKSxEKGRvY3VtZW50LmJvZHksWS5pb3NmaXgpJiYoaT1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCwxMCksaHQoZG9jdW1lbnQuYm9keSxZLmlvc2ZpeCksZG9jdW1lbnQuYm9keS5zdHlsZS50b3A9IiIsZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9LTEqaSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJmFlKCkmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLGNlKSxoKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24odCl7dC5oYXNBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iKT8odC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIix0LmdldEF0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpKTp0LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX0pKSxodChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFtZLnNob3duLFlbImhlaWdodC1hdXRvIl0sWVsibm8tYmFja2Ryb3AiXSxZWyJ0b2FzdC1zaG93biJdLFlbInRvYXN0LWNvbHVtbiJdXSl9ZnVuY3Rpb24gZmUodCl7dmFyIGUsbixvLGk9JCgpO2kmJihlPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKSkmJiFEKGksZS5oaWRlQ2xhc3MucG9wdXApJiYobj1kZS5zd2FsUHJvbWlzZVJlc29sdmUuZ2V0KHRoaXMpLGh0KGksZS5zaG93Q2xhc3MucG9wdXApLG10KGksZS5oaWRlQ2xhc3MucG9wdXApLG89USgpLGh0KG8sZS5zaG93Q2xhc3MuYmFja2Ryb3ApLG10KG8sZS5oaWRlQ2xhc3MuYmFja2Ryb3ApLGZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1RKCksaT1rdCYmY3QoZSkscj1uLm9uQ2xvc2UsYT1uLm9uQWZ0ZXJDbG9zZTtpZihyIT09bnVsbCYmdHlwZW9mIHI9PT0iZnVuY3Rpb24iKXtyKGUpfWlmKGkpe21lKHQsZSxvLGEpfWVsc2V7cGUodCxvLEooKSxhKX19KHRoaXMsaSxlKSx2b2lkIDAhPT10Pyh0LmlzRGlzbWlzc2VkPXZvaWQgMCE9PXQuZGlzbWlzcyx0LmlzQ29uZmlybWVkPXZvaWQgMD09PXQuZGlzbWlzcyk6dD17aXNEaXNtaXNzZWQ6ITAsaXNDb25maXJtZWQ6ITF9LG4odHx8e30pKX12YXIgbWU9ZnVuY3Rpb24odCxlLG4sbyl7WHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPXBlLmJpbmQobnVsbCx0LG4sSigpLG8pLGUuYWRkRXZlbnRMaXN0ZW5lcihrdCxmdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJihYdC5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKSxkZWxldGUgWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKX0pfSxoZT1mdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgpLHQuX2Rlc3Ryb3koKX0pfTtmdW5jdGlvbiBnZSh0LGUsbil7dmFyIG89QnQuZG9tQ2FjaGUuZ2V0KHQpO2UuZm9yRWFjaChmdW5jdGlvbih0KXtvW3RdLmRpc2FibGVkPW59KX1mdW5jdGlvbiB2ZSh0LGUpe2lmKCF0KXJldHVybiExO2lmKCJyYWRpbyI9PT10LnR5cGUpZm9yKHZhciBuPXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0Iiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uZGlzYWJsZWQ9ZTtlbHNlIHQuZGlzYWJsZWQ9ZX12YXIgYmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSl7YSh0aGlzLG4pLHRoaXMuY2FsbGJhY2s9dCx0aGlzLnJlbWFpbmluZz1lLHRoaXMucnVubmluZz0hMSx0aGlzLnN0YXJ0KCl9cmV0dXJuIGMobixbe2tleToic3RhcnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz0hMCx0aGlzLnN0YXJ0ZWQ9bmV3IERhdGUsdGhpcy5pZD1zZXRUaW1lb3V0KHRoaXMuY2FsbGJhY2ssdGhpcy5yZW1haW5pbmcpKSx0aGlzLnJlbWFpbmluZ319LHtrZXk6InN0b3AiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPW5ldyBEYXRlLXRoaXMuc3RhcnRlZCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJpbmNyZWFzZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ydW5uaW5nO3JldHVybiBlJiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9dCxlJiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJnZXRUaW1lckxlZnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJpc1J1bm5pbmciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZ319XSksbn0oKSx5ZT17ZW1haWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4vXlthLXpBLVowLTkuK18tXStAW2EtekEtWjAtOS4tXStcLlthLXpBLVowLTktXXsyLDI0fSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fCJJbnZhbGlkIGVtYWlsIGFkZHJlc3MiKX0sdXJsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuL15odHRwcz86XC9cLyh3d3dcLik/Wy1hLXpBLVowLTlAOiUuXyt+Iz1dezEsMjU2fVwuW2Etel17Miw2M31cYihbLWEtekEtWjAtOUA6JV8rLn4jPyYvPV0qKSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fCJJbnZhbGlkIFVSTCIpfX07ZnVuY3Rpb24gd2UodCl7dmFyIGUsbjsoZT10KS5pbnB1dFZhbGlkYXRvcnx8T2JqZWN0LmtleXMoeWUpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5pbnB1dD09PXQmJihlLmlucHV0VmFsaWRhdG9yPXllW3RdKX0pLHQuc2hvd0xvYWRlck9uQ29uZmlybSYmIXQucHJlQ29uZmlybSYmXygic2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXG5zaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XG5odHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0IiksdC5hbmltYXRpb249Vyh0LmFuaW1hdGlvbiksKG49dCkudGFyZ2V0JiYoInN0cmluZyIhPXR5cGVvZiBuLnRhcmdldHx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuLnRhcmdldCkpJiYoInN0cmluZyI9PXR5cGVvZiBuLnRhcmdldHx8bi50YXJnZXQuYXBwZW5kQ2hpbGQpfHwoXygnVGFyZ2V0IHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImJvZHkiJyksbi50YXJnZXQ9ImJvZHkiKSwic3RyaW5nIj09dHlwZW9mIHQudGl0bGUmJih0LnRpdGxlPXQudGl0bGUuc3BsaXQoIlxuIikuam9pbigiPGJyIC8+IikpLHl0KHQpfWZ1bmN0aW9uIENlKHQpe3ZhciBlPVEoKSxuPSQoKTsiZnVuY3Rpb24iPT10eXBlb2YgdC5vbkJlZm9yZU9wZW4mJnQub25CZWZvcmVPcGVuKG4pO3ZhciBvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLm92ZXJmbG93WTtqZShlLG4sdCksVGUoZSxuKSxNKCkmJihMZShlLHQuc2Nyb2xsYmFyUGFkZGluZyxvKSxoKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24odCl7dD09PVEoKXx8ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5jb250YWlucylyZXR1cm4gdC5jb250YWlucyhlKX0odCxRKCkpfHwodC5oYXNBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIikmJnQuc2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIix0LmdldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSksdC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpKX0pKSxKKCl8fFh0LnByZXZpb3VzQWN0aXZlRWxlbWVudHx8KFh0LnByZXZpb3VzQWN0aXZlRWxlbWVudD1kb2N1bWVudC5hY3RpdmVFbGVtZW50KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5vbk9wZW4mJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5vbk9wZW4obil9KSxodChlLFlbIm5vLXRyYW5zaXRpb24iXSl9ZnVuY3Rpb24ga2UodCl7dmFyIGUsbj0kKCk7dC50YXJnZXQ9PT1uJiYoZT1RKCksbi5yZW1vdmVFdmVudExpc3RlbmVyKGt0LGtlKSxlLnN0eWxlLm92ZXJmbG93WT0iYXV0byIpfWZ1bmN0aW9uIHhlKHQsZSl7InNlbGVjdCI9PT1lLmlucHV0fHwicmFkaW8iPT09ZS5pbnB1dD9NZSh0LGUpOi0xIT09WyJ0ZXh0IiwiZW1haWwiLCJudW1iZXIiLCJ0ZWwiLCJ0ZXh0YXJlYSJdLmluZGV4T2YoZS5pbnB1dCkmJih2KGUuaW5wdXRWYWx1ZSl8fHkoZS5pbnB1dFZhbHVlKSkmJlJlKHQsZSl9ZnVuY3Rpb24gUGUodCxlKXt0LmRpc2FibGVCdXR0b25zKCksZS5pbnB1dD9OZSh0LGUpOlVlKHQsZSwhMCl9ZnVuY3Rpb24gQWUodCxlKXt0LmRpc2FibGVCdXR0b25zKCksZShLLmNhbmNlbCl9ZnVuY3Rpb24gQmUodCxlKXt0LmNsb3NlUG9wdXAoe3ZhbHVlOmV9KX1mdW5jdGlvbiBTZShlLHQsbixvKXt0LmtleWRvd25UYXJnZXQmJnQua2V5ZG93bkhhbmRsZXJBZGRlZCYmKHQua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOnQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLHQua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksbi50b2FzdHx8KHQua2V5ZG93bkhhbmRsZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHplKGUsdCxvKX0sdC5rZXlkb3duVGFyZ2V0PW4ua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6JCgpLHQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1uLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsdC5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHQua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6dC5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksdC5rZXlkb3duSGFuZGxlckFkZGVkPSEwKX1mdW5jdGlvbiBFZSh0LGUsbil7dmFyIG89VigpLGk9MDtpZihpPG8ubGVuZ3RoKXJldHVybihlKz1uKT09PW8ubGVuZ3RoP2U9MDotMT09PWUmJihlPW8ubGVuZ3RoLTEpLG9bZV0uZm9jdXMoKTskKCkuZm9jdXMoKX1mdW5jdGlvbiBPZSh0LGUsbil7QnQuaW5uZXJQYXJhbXMuZ2V0KHQpLnRvYXN0P1FlKHQsZSxuKTooSmUoZSksWGUoZSksR2UodCxlLG4pKX12YXIgVGU9ZnVuY3Rpb24odCxlKXtrdCYmY3QoZSk/KHQuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iLGUuYWRkRXZlbnRMaXN0ZW5lcihrdCxrZSkpOnQuc3R5bGUub3ZlcmZsb3dZPSJhdXRvIn0sTGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBvOygvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbXx8Ik1hY0ludGVsIj09PW5hdmlnYXRvci5wbGF0Zm9ybSYmMTxuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMpJiYhRChkb2N1bWVudC5ib2R5LFkuaW9zZml4KSYmKG89ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsZG9jdW1lbnQuYm9keS5zdHlsZS50b3A9IiIuY29uY2F0KC0xKm8sInB4IiksbXQoZG9jdW1lbnQuYm9keSxZLmlvc2ZpeCksdWUoKSxzZSgpKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmYWUoKSYmKGNlKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsY2UpKSxlJiYiaGlkZGVuIiE9PW4mJnJlKCksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2Nyb2xsVG9wPTB9KX0samU9ZnVuY3Rpb24odCxlLG4pe210KHQsbi5zaG93Q2xhc3MuYmFja2Ryb3ApLG90KGUpLG10KGUsbi5zaG93Q2xhc3MucG9wdXApLG10KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWS5zaG93biksbi5oZWlnaHRBdXRvJiZuLmJhY2tkcm9wJiYhbi50b2FzdCYmbXQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxZWyJoZWlnaHQtYXV0byJdKX0scWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hlY2tlZD8xOjB9LEllPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNoZWNrZWQ/dC52YWx1ZTpudWxsfSxWZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5maWxlcy5sZW5ndGg/bnVsbCE9PXQuZ2V0QXR0cmlidXRlKCJtdWx0aXBsZSIpP3QuZmlsZXM6dC5maWxlc1swXTpudWxsfSxNZT1mdW5jdGlvbihlLG4pe2Z1bmN0aW9uIG8odCl7cmV0dXJuIEhlW24uaW5wdXRdKGksRGUodCksbil9dmFyIGk9UCgpO3Yobi5pbnB1dE9wdGlvbnMpfHx5KG4uaW5wdXRPcHRpb25zKT8oV3QoKSxiKG4uaW5wdXRPcHRpb25zKS50aGVuKGZ1bmN0aW9uKHQpe2UuaGlkZUxvYWRpbmcoKSxvKHQpfSkpOiJvYmplY3QiPT09cihuLmlucHV0T3B0aW9ucyk/byhuLmlucHV0T3B0aW9ucyk6RigiVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0T3B0aW9ucyEgRXhwZWN0ZWQgb2JqZWN0LCBNYXAgb3IgUHJvbWlzZSwgZ290ICIuY29uY2F0KHIobi5pbnB1dE9wdGlvbnMpKSl9LFJlPWZ1bmN0aW9uKGUsbil7dmFyIG89ZS5nZXRJbnB1dCgpO2l0KG8pLGIobi5pbnB1dFZhbHVlKS50aGVuKGZ1bmN0aW9uKHQpe28udmFsdWU9Im51bWJlciI9PT1uLmlucHV0P3BhcnNlRmxvYXQodCl8fDA6IiIuY29uY2F0KHQpLG90KG8pLG8uZm9jdXMoKSxlLmhpZGVMb2FkaW5nKCl9KS5jYXRjaChmdW5jdGlvbih0KXtGKCJFcnJvciBpbiBpbnB1dFZhbHVlIHByb21pc2U6ICIuY29uY2F0KHQpKSxvLnZhbHVlPSIiLG90KG8pLG8uZm9jdXMoKSxlLmhpZGVMb2FkaW5nKCl9KX0sSGU9e3NlbGVjdDpmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gcih0LGUsbil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7by52YWx1ZT1uLEgobyxlKSxpLmlucHV0VmFsdWUudG9TdHJpbmcoKT09PW4udG9TdHJpbmcoKSYmKG8uc2VsZWN0ZWQ9ITApLHQuYXBwZW5kQ2hpbGQobyl9dmFyIGE9Z3QodCxZLnNlbGVjdCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLG49dFswXSxvPXRbMV07QXJyYXkuaXNBcnJheShvKT8oKGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0Z3JvdXAiKSkubGFiZWw9bixlLmRpc2FibGVkPSExLGEuYXBwZW5kQ2hpbGQoZSksby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiByKGUsdFsxXSx0WzBdKX0pKTpyKGEsbyxuKX0pLGEuZm9jdXMoKX0scmFkaW86ZnVuY3Rpb24odCxlLGEpe3ZhciBjPWd0KHQsWS5yYWRpbyk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0sbj10WzFdLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7by50eXBlPSJyYWRpbyIsby5uYW1lPVkucmFkaW8sby52YWx1ZT1lLGEuaW5wdXRWYWx1ZS50b1N0cmluZygpPT09ZS50b1N0cmluZygpJiYoby5jaGVja2VkPSEwKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7SChyLG4pLHIuY2xhc3NOYW1lPVkubGFiZWwsaS5hcHBlbmRDaGlsZChvKSxpLmFwcGVuZENoaWxkKHIpLGMuYXBwZW5kQ2hpbGQoaSl9KTt2YXIgbj1jLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0Iik7bi5sZW5ndGgmJm5bMF0uZm9jdXMoKX19LERlPWZ1bmN0aW9uIG8obil7dmFyIGk9W107cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBNYXAmJm4gaW5zdGFuY2VvZiBNYXA/bi5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49dDsib2JqZWN0Ij09PXIobikmJihuPW8obikpLGkucHVzaChbZSxuXSl9KTpPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPW5bdF07Im9iamVjdCI9PT1yKGUpJiYoZT1vKGUpKSxpLnB1c2goW3QsZV0pfSksaX0sTmU9ZnVuY3Rpb24oZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0SW5wdXQoKTtpZighbilyZXR1cm4gbnVsbDtzd2l0Y2goZS5pbnB1dCl7Y2FzZSJjaGVja2JveCI6cmV0dXJuIHFlKG4pO2Nhc2UicmFkaW8iOnJldHVybiBJZShuKTtjYXNlImZpbGUiOnJldHVybiBWZShuKTtkZWZhdWx0OnJldHVybiBlLmlucHV0QXV0b1RyaW0/bi52YWx1ZS50cmltKCk6bi52YWx1ZX19KGUsbik7bi5pbnB1dFZhbGlkYXRvcj8oZS5kaXNhYmxlSW5wdXQoKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIobi5pbnB1dFZhbGlkYXRvcihvLG4udmFsaWRhdGlvbk1lc3NhZ2UpKX0pLnRoZW4oZnVuY3Rpb24odCl7ZS5lbmFibGVCdXR0b25zKCksZS5lbmFibGVJbnB1dCgpLHQ/ZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UodCk6VWUoZSxuLG8pfSkpOmUuZ2V0SW5wdXQoKS5jaGVja1ZhbGlkaXR5KCk/VWUoZSxuLG8pOihlLmVuYWJsZUJ1dHRvbnMoKSxlLnNob3dWYWxpZGF0aW9uTWVzc2FnZShuLnZhbGlkYXRpb25NZXNzYWdlKSl9LFVlPWZ1bmN0aW9uKGUsdCxuKXt0LnNob3dMb2FkZXJPbkNvbmZpcm0mJld0KCksdC5wcmVDb25maXJtPyhlLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIodC5wcmVDb25maXJtKG4sdC52YWxpZGF0aW9uTWVzc2FnZSkpfSkudGhlbihmdW5jdGlvbih0KXt2dChTKCkpfHwhMT09PXQ/ZS5oaWRlTG9hZGluZygpOkJlKGUsdm9pZCAwPT09dD9uOnQpfSkpOkJlKGUsbil9LF9lPVsiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCIsIkFycm93VXAiLCJBcnJvd0Rvd24iLCJMZWZ0IiwiUmlnaHQiLCJVcCIsIkRvd24iXSxGZT1bIkVzY2FwZSIsIkVzYyJdLHplPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1CdC5pbm5lclBhcmFtcy5nZXQodCk7by5zdG9wS2V5ZG93blByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpLCJFbnRlciI9PT1lLmtleT9XZSh0LGUsbyk6IlRhYiI9PT1lLmtleT9LZShlLG8pOi0xIT09X2UuaW5kZXhPZihlLmtleSk/WWUoKTotMSE9PUZlLmluZGV4T2YoZS5rZXkpJiZaZShlLG8sbil9LFdlPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5pc0NvbXBvc2luZyYmZS50YXJnZXQmJnQuZ2V0SW5wdXQoKSYmZS50YXJnZXQub3V0ZXJIVE1MPT09dC5nZXRJbnB1dCgpLm91dGVySFRNTCl7aWYoLTEhPT1bInRleHRhcmVhIiwiZmlsZSJdLmluZGV4T2Yobi5pbnB1dCkpcmV0dXJuO0h0KCksZS5wcmV2ZW50RGVmYXVsdCgpfX0sS2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQudGFyZ2V0LG49VigpLG89LTEsaT0wO2k8bi5sZW5ndGg7aSsrKWlmKGU9PT1uW2ldKXtvPWk7YnJlYWt9dC5zaGlmdEtleT9FZSgwLG8sLTEpOkVlKDAsbywxKSx0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKX0sWWU9ZnVuY3Rpb24oKXt2YXIgdD1FKCksZT1PKCk7ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXQmJnZ0KGUpP2UuZm9jdXMoKTpkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZSYmdnQodCkmJnQuZm9jdXMoKX0sWmU9ZnVuY3Rpb24odCxlLG4pe1coZS5hbGxvd0VzY2FwZUtleSkmJih0LnByZXZlbnREZWZhdWx0KCksbihLLmVzYykpfSxRZT1mdW5jdGlvbihlLHQsbil7dC5wb3B1cC5vbmNsaWNrPWZ1bmN0aW9uKCl7dmFyIHQ9QnQuaW5uZXJQYXJhbXMuZ2V0KGUpO3Quc2hvd0NvbmZpcm1CdXR0b258fHQuc2hvd0NhbmNlbEJ1dHRvbnx8dC5zaG93Q2xvc2VCdXR0b258fHQuaW5wdXR8fG4oSy5jbG9zZSl9fSwkZT0hMSxKZT1mdW5jdGlvbihlKXtlLnBvcHVwLm9ubW91c2Vkb3duPWZ1bmN0aW9uKCl7ZS5jb250YWluZXIub25tb3VzZXVwPWZ1bmN0aW9uKHQpe2UuY29udGFpbmVyLm9ubW91c2V1cD12b2lkIDAsdC50YXJnZXQ9PT1lLmNvbnRhaW5lciYmKCRlPSEwKX19fSxYZT1mdW5jdGlvbihlKXtlLmNvbnRhaW5lci5vbm1vdXNlZG93bj1mdW5jdGlvbigpe2UucG9wdXAub25tb3VzZXVwPWZ1bmN0aW9uKHQpe2UucG9wdXAub25tb3VzZXVwPXZvaWQgMCx0LnRhcmdldCE9PWUucG9wdXAmJiFlLnBvcHVwLmNvbnRhaW5zKHQudGFyZ2V0KXx8KCRlPSEwKX19fSxHZT1mdW5jdGlvbihuLG8saSl7by5jb250YWluZXIub25jbGljaz1mdW5jdGlvbih0KXt2YXIgZT1CdC5pbm5lclBhcmFtcy5nZXQobik7JGU/JGU9ITE6dC50YXJnZXQ9PT1vLmNvbnRhaW5lciYmVyhlLmFsbG93T3V0c2lkZUNsaWNrKSYmaShLLmJhY2tkcm9wKX19O3ZhciB0bj1mdW5jdGlvbih0LGUsbil7dmFyIG89cSgpO2l0KG8pLGUudGltZXImJih0LnRpbWVvdXQ9bmV3IGJlKGZ1bmN0aW9uKCl7bigidGltZXIiKSxkZWxldGUgdC50aW1lb3V0fSxlLnRpbWVyKSxlLnRpbWVyUHJvZ3Jlc3NCYXImJihvdChvKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC50aW1lb3V0LnJ1bm5pbmcmJnN0KGUudGltZXIpfSkpKX0sZW49ZnVuY3Rpb24odCxlKXtpZighZS50b2FzdClyZXR1cm4gVyhlLmFsbG93RW50ZXJLZXkpP2UuZm9jdXNDYW5jZWwmJnZ0KHQuY2FuY2VsQnV0dG9uKT90LmNhbmNlbEJ1dHRvbi5mb2N1cygpOmUuZm9jdXNDb25maXJtJiZ2dCh0LmNvbmZpcm1CdXR0b24pP3QuY29uZmlybUJ1dHRvbi5mb2N1cygpOnZvaWQgRWUoMCwtMSwxKTpubigpfSxubj1mdW5jdGlvbigpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXImJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpfTt2YXIgb24scm49ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpdFtlXT1uZXcgV2Vha01hcH0sYW49T2JqZWN0LmZyZWV6ZSh7aGlkZUxvYWRpbmc6aWUsZGlzYWJsZUxvYWRpbmc6aWUsZ2V0SW5wdXQ6ZnVuY3Rpb24odCl7dmFyIGU9QnQuaW5uZXJQYXJhbXMuZ2V0KHR8fHRoaXMpLG49QnQuZG9tQ2FjaGUuZ2V0KHR8fHRoaXMpO3JldHVybiBuP0cobi5jb250ZW50LGUuaW5wdXQpOm51bGx9LGNsb3NlOmZlLGNsb3NlUG9wdXA6ZmUsY2xvc2VNb2RhbDpmZSxjbG9zZVRvYXN0OmZlLGVuYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtnZSh0aGlzLFsiY29uZmlybUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiJdLCExKX0sZGlzYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtnZSh0aGlzLFsiY29uZmlybUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiJdLCEwKX0sZW5hYmxlSW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdmUodGhpcy5nZXRJbnB1dCgpLCExKX0sZGlzYWJsZUlucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHZlKHRoaXMuZ2V0SW5wdXQoKSwhMCl9LHNob3dWYWxpZGF0aW9uTWVzc2FnZTpmdW5jdGlvbih0KXt2YXIgZT1CdC5kb21DYWNoZS5nZXQodGhpcyk7SChlLnZhbGlkYXRpb25NZXNzYWdlLHQpO3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUucG9wdXApO2UudmFsaWRhdGlvbk1lc3NhZ2Uuc3R5bGUubWFyZ2luTGVmdD0iLSIuY29uY2F0KG4uZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1sZWZ0IikpLGUudmFsaWRhdGlvbk1lc3NhZ2Uuc3R5bGUubWFyZ2luUmlnaHQ9Ii0iLmNvbmNhdChuLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKSksb3QoZS52YWxpZGF0aW9uTWVzc2FnZSk7dmFyIG89dGhpcy5nZXRJbnB1dCgpO28mJihvLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwhMCksby5zZXRBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkQnkiLFlbInZhbGlkYXRpb24tbWVzc2FnZSJdKSx0dChvKSxtdChvLFkuaW5wdXRlcnJvcikpfSxyZXNldFZhbGlkYXRpb25NZXNzYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpO3QudmFsaWRhdGlvbk1lc3NhZ2UmJml0KHQudmFsaWRhdGlvbk1lc3NhZ2UpO3ZhciBlPXRoaXMuZ2V0SW5wdXQoKTtlJiYoZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpLGUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZEJ5IiksaHQoZSxZLmlucHV0ZXJyb3IpKX0sZ2V0UHJvZ3Jlc3NTdGVwczpmdW5jdGlvbigpe3JldHVybiBCdC5kb21DYWNoZS5nZXQodGhpcykucHJvZ3Jlc3NTdGVwc30sX21haW46ZnVuY3Rpb24odCl7SnQodCksWHQuY3VycmVudEluc3RhbmNlJiZYdC5jdXJyZW50SW5zdGFuY2UuX2Rlc3Ryb3koKSxYdC5jdXJyZW50SW5zdGFuY2U9dGhpczt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT1zKHt9LEd0LnNob3dDbGFzcyx0LnNob3dDbGFzcyksbj1zKHt9LEd0LmhpZGVDbGFzcyx0LmhpZGVDbGFzcyksbz1zKHt9LEd0LHQpO2lmKG8uc2hvd0NsYXNzPWUsby5oaWRlQ2xhc3M9bix0LmFuaW1hdGlvbj09PWZhbHNlKXtvLnNob3dDbGFzcz17cG9wdXA6InN3YWwyLW5vYW5pbWF0aW9uIixiYWNrZHJvcDoic3dhbDItbm9hbmltYXRpb24ifTtvLmhpZGVDbGFzcz17fX1yZXR1cm4gb30odCk7d2UoZSksT2JqZWN0LmZyZWV6ZShlKSxYdC50aW1lb3V0JiYoWHQudGltZW91dC5zdG9wKCksZGVsZXRlIFh0LnRpbWVvdXQpLGNsZWFyVGltZW91dChYdC5yZXN0b3JlRm9jdXNUaW1lb3V0KTt2YXIgbj1mdW5jdGlvbih0KXt2YXIgZT17cG9wdXA6JCgpLGNvbnRhaW5lcjpRKCksY29udGVudDpQKCksYWN0aW9uczpUKCksY29uZmlybUJ1dHRvbjpFKCksY2FuY2VsQnV0dG9uOk8oKSxjbG9zZUJ1dHRvbjpJKCksdmFsaWRhdGlvbk1lc3NhZ2U6UygpLHByb2dyZXNzU3RlcHM6QigpfTtyZXR1cm4gQnQuZG9tQ2FjaGUuc2V0KHQsZSksZX0odGhpcyk7cmV0dXJuIFJ0KHRoaXMsZSksQnQuaW5uZXJQYXJhbXMuc2V0KHRoaXMsZSksZnVuY3Rpb24obixvLGkpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbiB0KGUpe24uY2xvc2VQb3B1cCh7ZGlzbWlzczplfSl9O2RlLnN3YWxQcm9taXNlUmVzb2x2ZS5zZXQobix0KTtvLmNvbmZpcm1CdXR0b24ub25jbGljaz1mdW5jdGlvbigpe3JldHVybiBQZShuLGkpfTtvLmNhbmNlbEJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEFlKG4sZSl9O28uY2xvc2VCdXR0b24ub25jbGljaz1mdW5jdGlvbigpe3JldHVybiBlKEsuY2xvc2UpfTtPZShuLG8sZSk7U2UobixYdCxpLGUpO2lmKGkudG9hc3QmJihpLmlucHV0fHxpLmZvb3Rlcnx8aS5zaG93Q2xvc2VCdXR0b24pKXttdChkb2N1bWVudC5ib2R5LFlbInRvYXN0LWNvbHVtbiJdKX1lbHNle2h0KGRvY3VtZW50LmJvZHksWVsidG9hc3QtY29sdW1uIl0pfXhlKG4saSk7Q2UoaSk7dG4oWHQsaSxlKTtlbihvLGkpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmNvbnRhaW5lci5zY3JvbGxUb3A9MH0pfSl9KHRoaXMsbixlKX0sdXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PSQoKSxuPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighdHx8RCh0LG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gXygiWW91J3JlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNsb3NlZCBvciBjbG9zaW5nIHBvcHVwLCB0aGF0IHdvbid0IHdvcmsuIFVzZSB0aGUgdXBkYXRlKCkgbWV0aG9kIGluIHByZUNvbmZpcm0gcGFyYW1ldGVyIG9yIHNob3cgYSBuZXcgcG9wdXAuIik7dmFyIG89e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXtzbi5pc1VwZGF0YWJsZVBhcmFtZXRlcih0KT9vW3RdPWVbdF06XygnSW52YWxpZCBwYXJhbWV0ZXIgdG8gdXBkYXRlOiAiJy5jb25jYXQodCwnIi4gVXBkYXRhYmxlIHBhcmFtcyBhcmUgbGlzdGVkIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9ibG9iL21hc3Rlci9zcmMvdXRpbHMvcGFyYW1zLmpzJykpfSk7dmFyIGk9cyh7fSxuLG8pO1J0KHRoaXMsaSksQnQuaW5uZXJQYXJhbXMuc2V0KHRoaXMsaSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cGFyYW1zOnt2YWx1ZTpzKHt9LHRoaXMucGFyYW1zLGUpLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITB9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpLGU9QnQuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO2UmJih0LnBvcHVwJiZYdC5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2smJihYdC5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKSxkZWxldGUgWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKSxYdC5kZWZlckRpc3Bvc2FsVGltZXImJihjbGVhclRpbWVvdXQoWHQuZGVmZXJEaXNwb3NhbFRpbWVyKSxkZWxldGUgWHQuZGVmZXJEaXNwb3NhbFRpbWVyKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vbkRlc3Ryb3kmJmUub25EZXN0cm95KCksZGVsZXRlIHRoaXMucGFyYW1zLGRlbGV0ZSBYdC5rZXlkb3duSGFuZGxlcixkZWxldGUgWHQua2V5ZG93blRhcmdldCxybihCdCkscm4oZGUpKX19KSxjbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXtpZihhKHRoaXMsciksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpeyJ1bmRlZmluZWQiPT10eXBlb2YgUHJvbWlzZSYmRigiVGhpcyBwYWNrYWdlIHJlcXVpcmVzIGEgUHJvbWlzZSBsaWJyYXJ5LCBwbGVhc2UgaW5jbHVkZSBhIHNoaW0gdG8gZW5hYmxlIGl0IGluIHRoaXMgYnJvd3NlciAoU2VlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvd2lraS9NaWdyYXRpb24tZnJvbS1Td2VldEFsZXJ0LXRvLVN3ZWV0QWxlcnQyIzEtaWUtc3VwcG9ydCkiKSxvbj10aGlzO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3ZhciBvPU9iamVjdC5mcmVlemUodGhpcy5jb25zdHJ1Y3Rvci5hcmdzVG9QYXJhbXMoZSkpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6byx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTt2YXIgaT10aGlzLl9tYWluKHRoaXMucGFyYW1zKTtCdC5wcm9taXNlLnNldCh0aGlzLGkpfX1yZXR1cm4gYyhyLFt7a2V5OiJ0aGVuIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gQnQucHJvbWlzZS5nZXQodGhpcykudGhlbih0KX19LHtrZXk6ImZpbmFsbHkiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBCdC5wcm9taXNlLmdldCh0aGlzKS5maW5hbGx5KHQpfX1dKSxyfSgpO3MoY24ucHJvdG90eXBlLGFuKSxzKGNuLG9lKSxPYmplY3Qua2V5cyhhbikuZm9yRWFjaChmdW5jdGlvbih0KXtjblt0XT1mdW5jdGlvbigpe2lmKG9uKXJldHVybiBvblt0XS5hcHBseShvbixhcmd1bWVudHMpfX0pLGNuLkRpc21pc3NSZWFzb249Syxjbi52ZXJzaW9uPSI5LjE3LjEiO3ZhciBzbj1jbjtyZXR1cm4gc24uZGVmYXVsdD1zbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7CiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2lmKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuKSxuLnN0eWxlU2hlZXQpbi5zdHlsZVNoZWV0LmRpc2FibGVkfHwobi5zdHlsZVNoZWV0LmNzc1RleHQ9dCk7ZWxzZSB0cnl7bi5pbm5lckhUTUw9dH1jYXRjaChlKXtuLmlubmVyVGV4dD10fX0oZG9jdW1lbnQsIi5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdHtmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyO3dpZHRoOmF1dG87cGFkZGluZzouNjI1ZW07b3ZlcmZsb3cteTpoaWRkZW47YmFja2dyb3VuZDojZmZmO2JveC1zaGFkb3c6MCAwIC42MjVlbSAjZDlkOWQ5fS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaGVhZGVye2ZsZXgtZGlyZWN0aW9uOnJvdztwYWRkaW5nOjB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi10aXRsZXtmbGV4LWdyb3c6MTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDttYXJnaW46MCAuNmVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1mb290ZXJ7bWFyZ2luOi41ZW0gMCAwO3BhZGRpbmc6LjVlbSAwIDA7Zm9udC1zaXplOi44ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1jbG9zZXtwb3NpdGlvbjpzdGF0aWM7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTtsaW5lLWhlaWdodDouOH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWNvbnRlbnR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7cGFkZGluZzowO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29ue3dpZHRoOjJlbTttaW4td2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOjB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MS44ZW07Zm9udC13ZWlnaHQ6NzAwfUBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDpub25lKSwoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtmb250LXNpemU6LjI1ZW19fS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde3RvcDouODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6LjMxMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItYWN0aW9uc3tmbGV4LWJhc2lzOmF1dG8haW1wb3J0YW50O3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWFyZ2luOjAgLjMxMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZHttYXJnaW46MCAuMzEyNWVtO3BhZGRpbmc6LjMxMjVlbSAuNjI1ZW07Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZDpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDFweCAjZmZmLDAgMCAwIDNweCByZ2JhKDUwLDEwMCwxNTAsLjQpfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Nn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEuNmVtO2hlaWdodDozZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0uOGVtO2xlZnQ6LS41ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MmVtIDJlbTtib3JkZXItcmFkaXVzOjRlbSAwIDAgNGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPXJpZ2h0XXt0b3A6LS4yNWVtO2xlZnQ6LjkzNzVlbTt0cmFuc2Zvcm0tb3JpZ2luOjAgMS41ZW07Ym9yZGVyLXJhZGl1czowIDRlbSA0ZW0gMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3RvcDowO2xlZnQ6LjQzNzVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDoyLjY4NzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2hlaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41czthbmltYXRpb246c3dhbDItdG9hc3Qtc2hvdyAuNXN9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWhpZGUgLjFzIGZvcndhcmRzfS5zd2FsMi1jb250YWluZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTA2MDt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzouNjI1ZW07b3ZlcmZsb3cteDpoaWRkZW47dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xczstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJhY2tkcm9wLXNob3csLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ub2FuaW1hdGlvbntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjQpfS5zd2FsMi1jb250YWluZXIuc3dhbDItYmFja2Ryb3AtaGlkZXtiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1sZWZ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0e2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHR7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbXthbGlnbi1pdGVtczpmbGV4LWVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1sZWZ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodHthbGlnbi1pdGVtczpmbGV4LWVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kPjpmaXJzdC1jaGlsZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1sZWZ0PjpmaXJzdC1jaGlsZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodD46Zmlyc3QtY2hpbGQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQ+OmZpcnN0LWNoaWxkLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tPjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOmF1dG99LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLW1vZGFse2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnQ7ZmxleDoxO2FsaWduLXNlbGY6c3RyZXRjaDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1yb3c+LnN3YWwyLW1vZGFse2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnQ7ZmxleDoxO2FsaWduLWNvbnRlbnQ6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbntmbGV4OjE7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItY2VudGVyLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9we2FsaWduLWl0ZW1zOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWJvdHRvbS1sZWZ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItY2VudGVyLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXItc3RhcnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi10b3AtbGVmdCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLXRvcC1zdGFydHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWJvdHRvbS1yaWdodCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXItcmlnaHQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi10b3AtZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLXJpZ2h0e2FsaWduLWl0ZW1zOmZsZXgtZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4+LnN3YWwyLW1vZGFse2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnQ7ZmxleDoxO2FsaWduLWNvbnRlbnQ6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1uby10cmFuc2l0aW9ue3RyYW5zaXRpb246bm9uZSFpbXBvcnRhbnR9LnN3YWwyLWNvbnRhaW5lcjpub3QoLnN3YWwyLXRvcCk6bm90KC5zd2FsMi10b3Atc3RhcnQpOm5vdCguc3dhbDItdG9wLWVuZCk6bm90KC5zd2FsMi10b3AtbGVmdCk6bm90KC5zd2FsMi10b3AtcmlnaHQpOm5vdCguc3dhbDItY2VudGVyLXN0YXJ0KTpub3QoLnN3YWwyLWNlbnRlci1lbmQpOm5vdCguc3dhbDItY2VudGVyLWxlZnQpOm5vdCguc3dhbDItY2VudGVyLXJpZ2h0KTpub3QoLnN3YWwyLWJvdHRvbSk6bm90KC5zd2FsMi1ib3R0b20tc3RhcnQpOm5vdCguc3dhbDItYm90dG9tLWVuZCk6bm90KC5zd2FsMi1ib3R0b20tbGVmdCk6bm90KC5zd2FsMi1ib3R0b20tcmlnaHQpOm5vdCguc3dhbDItZ3Jvdy1mdWxsc2NyZWVuKT4uc3dhbDItbW9kYWx7bWFyZ2luOmF1dG99QG1lZGlhIGFsbCBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0Om5vbmUpLCgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5zd2FsMi1jb250YWluZXIgLnN3YWwyLW1vZGFse21hcmdpbjowIWltcG9ydGFudH19LnN3YWwyLXBvcHVwe2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MzJlbTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjEuMjVlbTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOi4zMTI1ZW07YmFja2dyb3VuZDojZmZmO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjFyZW19LnN3YWwyLXBvcHVwOmZvY3Vze291dGxpbmU6MH0uc3dhbDItcG9wdXAuc3dhbDItbG9hZGluZ3tvdmVyZmxvdy15OmhpZGRlbn0uc3dhbDItaGVhZGVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6MCAxLjhlbX0uc3dhbDItdGl0bGV7cG9zaXRpb246cmVsYXRpdmU7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjAgMCAuNGVtO3BhZGRpbmc6MDtjb2xvcjojNTk1OTU5O2ZvbnQtc2l6ZToxLjg3NWVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXRyYW5zZm9ybTpub25lO3dvcmQtd3JhcDpicmVhay13b3JkfS5zd2FsMi1hY3Rpb25ze2Rpc3BsYXk6ZmxleDt6LWluZGV4OjE7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MTAwJTttYXJnaW46MS4yNWVtIGF1dG8gMH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWRbZGlzYWJsZWRde29wYWNpdHk6LjR9LnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkOmhvdmVye2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjEpLHJnYmEoMCwwLDAsLjEpKX0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6YWN0aXZle2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjIpLHJnYmEoMCwwLDAsLjIpKX0uc3dhbDItYWN0aW9ucy5zd2FsMi1sb2FkaW5nIC5zd2FsMi1zdHlsZWQuc3dhbDItY29uZmlybXtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtO21hcmdpbjouNDY4NzVlbTtwYWRkaW5nOjA7LXdlYmtpdC1hbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2FuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7Ym9yZGVyOi4yNWVtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Y29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2N1cnNvcjpkZWZhdWx0Oy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uc3dhbDItYWN0aW9ucy5zd2FsMi1sb2FkaW5nIC5zd2FsMi1zdHlsZWQuc3dhbDItY2FuY2Vse21hcmdpbi1yaWdodDozMHB4O21hcmdpbi1sZWZ0OjMwcHh9LnN3YWwyLWFjdGlvbnMuc3dhbDItbG9hZGluZyA6bm90KC5zd2FsMi1zdHlsZWQpLnN3YWwyLWNvbmZpcm06OmFmdGVye2NvbnRlbnQ6XCJcIjtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O21hcmdpbi1sZWZ0OjVweDstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtib3JkZXI6M3B4IHNvbGlkICM5OTk7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MXB4IDFweCAxcHggI2ZmZn0uc3dhbDItc3R5bGVke21hcmdpbjouMzEyNWVtO3BhZGRpbmc6LjYyNWVtIDJlbTtib3gtc2hhZG93Om5vbmU7Zm9udC13ZWlnaHQ6NTAwfS5zd2FsMi1zdHlsZWQ6bm90KFtkaXNhYmxlZF0pe2N1cnNvcjpwb2ludGVyfS5zd2FsMi1zdHlsZWQuc3dhbDItY29uZmlybXtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiMzMDg1ZDY7Y29sb3I6I2ZmZjtmb250LXNpemU6MS4wNjI1ZW19LnN3YWwyLXN0eWxlZC5zd2FsMi1jYW5jZWx7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojYWFhO2NvbG9yOiNmZmY7Zm9udC1zaXplOjEuMDYyNWVtfS5zd2FsMi1zdHlsZWQ6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmZmYsMCAwIDAgM3B4IHJnYmEoNTAsMTAwLDE1MCwuNCl9LnN3YWwyLXN0eWxlZDo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbDItZm9vdGVye2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjEuMjVlbSAwIDA7cGFkZGluZzoxZW0gMCAwO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Y29sb3I6IzU0NTQ1NDtmb250LXNpemU6MWVtfS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2hlaWdodDouMjVlbTtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6LjMxMjVlbTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4zMTI1ZW19LnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhcnt3aWR0aDoxMDAlO2hlaWdodDouMjVlbTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjIpfS5zd2FsMi1pbWFnZXttYXgtd2lkdGg6MTAwJTttYXJnaW46MS4yNWVtIGF1dG99LnN3YWwyLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6MDtyaWdodDowO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjEuMmVtO2hlaWdodDoxLjJlbTtwYWRkaW5nOjA7b3ZlcmZsb3c6aGlkZGVuO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2Utb3V0O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MDtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojY2NjO2ZvbnQtZmFtaWx5OnNlcmlmO2ZvbnQtc2l6ZToyLjVlbTtsaW5lLWhlaWdodDoxLjI7Y3Vyc29yOnBvaW50ZXJ9LnN3YWwyLWNsb3NlOmhvdmVye3RyYW5zZm9ybTpub25lO2JhY2tncm91bmQ6MCAwO2NvbG9yOiNmMjc0NzR9LnN3YWwyLWNsb3NlOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5zd2FsMi1jb250ZW50e3otaW5kZXg6MTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowO3BhZGRpbmc6MCAxLjZlbTtjb2xvcjojNTQ1NDU0O2ZvbnQtc2l6ZToxLjEyNWVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDpub3JtYWw7dGV4dC1hbGlnbjpjZW50ZXI7d29yZC13cmFwOmJyZWFrLXdvcmR9LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItcmFkaW8sLnN3YWwyLXNlbGVjdCwuc3dhbDItdGV4dGFyZWF7bWFyZ2luOjFlbSBhdXRvfS5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItdGV4dGFyZWF7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjNzLGJveC1zaGFkb3cgLjNzO2JvcmRlcjoxcHggc29saWQgI2Q5ZDlkOTtib3JkZXItcmFkaXVzOi4xODc1ZW07YmFja2dyb3VuZDppbmhlcml0O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA2KTtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi1maWxlLnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLWlucHV0LnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLXRleHRhcmVhLnN3YWwyLWlucHV0ZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDJweCAjZjI3NDc0IWltcG9ydGFudH0uc3dhbDItZmlsZTpmb2N1cywuc3dhbDItaW5wdXQ6Zm9jdXMsLnN3YWwyLXRleHRhcmVhOmZvY3Vze2JvcmRlcjoxcHggc29saWQgI2I0ZGJlZDtvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgM3B4ICNjNGU2ZjV9LnN3YWwyLWZpbGU6Oi1tb3otcGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0OjotbW96LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1maWxlOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwuc3dhbDItaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItZmlsZTo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTo6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLWZpbGU6OnBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6cGxhY2Vob2xkZXIsLnN3YWwyLXRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1yYW5nZXttYXJnaW46MWVtIGF1dG87YmFja2dyb3VuZDojZmZmfS5zd2FsMi1yYW5nZSBpbnB1dHt3aWR0aDo4MCV9LnN3YWwyLXJhbmdlIG91dHB1dHt3aWR0aDoyMCU7Y29sb3I6aW5oZXJpdDtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLXJhbmdlIGlucHV0LC5zd2FsMi1yYW5nZSBvdXRwdXR7aGVpZ2h0OjIuNjI1ZW07cGFkZGluZzowO2ZvbnQtc2l6ZToxLjEyNWVtO2xpbmUtaGVpZ2h0OjIuNjI1ZW19LnN3YWwyLWlucHV0e2hlaWdodDoyLjYyNWVtO3BhZGRpbmc6MCAuNzVlbX0uc3dhbDItaW5wdXRbdHlwZT1udW1iZXJde21heC13aWR0aDoxMGVtfS5zd2FsMi1maWxle2JhY2tncm91bmQ6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItdGV4dGFyZWF7aGVpZ2h0OjYuNzVlbTtwYWRkaW5nOi43NWVtfS5zd2FsMi1zZWxlY3R7bWluLXdpZHRoOjUwJTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOi4zNzVlbSAuNjI1ZW07YmFja2dyb3VuZDppbmhlcml0O2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1yYWRpb3thbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6aW5oZXJpdH0uc3dhbDItY2hlY2tib3ggbGFiZWwsLnN3YWwyLXJhZGlvIGxhYmVse21hcmdpbjowIC42ZW07Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWNoZWNrYm94IGlucHV0LC5zd2FsMi1yYWRpbyBpbnB1dHttYXJnaW46MCAuNGVtfS5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2V7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOiNmMGYwZjA7Y29sb3I6IzY2Njtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjMwMH0uc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdlOjpiZWZvcmV7Y29udGVudDpcIiFcIjtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxLjVlbTttaW4td2lkdGg6MS41ZW07aGVpZ2h0OjEuNWVtO21hcmdpbjowIC42MjVlbTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MS41ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLWljb257cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpjb250ZW50LWJveDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjVlbTtoZWlnaHQ6NWVtO21hcmdpbjoxLjI1ZW0gYXV0byAxLjg3NWVtO2JvcmRlcjouMjVlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTtmb250LWZhbWlseTppbmhlcml0O2xpbmUtaGVpZ2h0OjVlbTtjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTozLjc1ZW19LnN3YWwyLWljb24uc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciAuc3dhbDIteC1tYXJre3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZ3JvdzoxfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjIuMzEyNWVtO3dpZHRoOjIuOTM3NWVtO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0OjFlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZ3tib3JkZXItY29sb3I6I2ZhY2VhODtjb2xvcjojZjhiYjg2fS5zd2FsMi1pY29uLnN3YWwyLWluZm97Ym9yZGVyLWNvbG9yOiM5ZGUwZjY7Y29sb3I6IzNmYzNlZX0uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbntib3JkZXItY29sb3I6I2M5ZGFlMTtjb2xvcjojODdhZGJkfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNhNWRjODY7Y29sb3I6I2E1ZGM4Nn0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDozLjc1ZW07aGVpZ2h0OjcuNWVtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO2JvcmRlci1yYWRpdXM6NTAlfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LS40Mzc1ZW07bGVmdDotMi4wNjM1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46My43NWVtIDMuNzVlbTtib3JkZXItcmFkaXVzOjcuNWVtIDAgMCA3LjVlbX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotLjY4NzVlbTtsZWZ0OjEuODc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MCAzLjc1ZW07Ym9yZGVyLXJhZGl1czowIDcuNWVtIDcuNWVtIDB9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6LS4yNWVtO2xlZnQ6LS4yNWVtO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6LjI1ZW0gc29saWQgcmdiYSgxNjUsMjIwLDEzNCwuMyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDouNWVtO2xlZnQ6MS42MjVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDo1LjYyNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNhNWRjODZ9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjIuODc1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD1sb25nXXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25ney13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWluO2FuaW1hdGlvbjpzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW59LnN3YWwyLXByb2dyZXNzLXN0ZXBze2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46MCAwIDEuMjVlbTtwYWRkaW5nOjA7YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtd2VpZ2h0OjYwMH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7d2lkdGg6MmVtO2hlaWdodDoyZW07Ym9yZGVyLXJhZGl1czoyZW07YmFja2dyb3VuZDojMzA4NWQ2O2NvbG9yOiNmZmY7bGluZS1oZWlnaHQ6MmVtO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiMzMDg1ZDZ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6I2FkZDhlNjtjb2xvcjojZmZmfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le2JhY2tncm91bmQ6I2FkZDhlNn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXt6LWluZGV4OjEwO3dpZHRoOjIuNWVtO2hlaWdodDouNGVtO21hcmdpbjowIC0xcHg7YmFja2dyb3VuZDojMzA4NWQ2fVtjbGFzc149c3dhbDJdey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1zaG93IC4zczthbmltYXRpb246c3dhbDItc2hvdyAuM3N9LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItaGlkZSAuMTVzIGZvcndhcmRzO2FuaW1hdGlvbjpzd2FsMi1oaWRlIC4xNXMgZm9yd2FyZHN9LnN3YWwyLW5vYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uc3dhbDItc2Nyb2xsYmFyLW1lYXN1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpzY3JvbGx9LnN3YWwyLXJ0bCAuc3dhbDItY2xvc2V7cmlnaHQ6YXV0bztsZWZ0OjB9LnN3YWwyLXJ0bCAuc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFye3JpZ2h0OjA7bGVmdDphdXRvfUBzdXBwb3J0cyAoLW1zLWFjY2VsZXJhdG9yOnRydWUpey5zd2FsMi1yYW5nZSBpbnB1dHt3aWR0aDoxMDAlIWltcG9ydGFudH0uc3dhbDItcmFuZ2Ugb3V0cHV0e2Rpc3BsYXk6bm9uZX19QG1lZGlhIGFsbCBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0Om5vbmUpLCgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5zd2FsMi1yYW5nZSBpbnB1dHt3aWR0aDoxMDAlIWltcG9ydGFudH0uc3dhbDItcmFuZ2Ugb3V0cHV0e2Rpc3BsYXk6bm9uZX19QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpey5zd2FsMi1jbG9zZTpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCByZ2JhKDUwLDEwMCwxNTAsLjQpfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3Qtc2hvd3swJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtLjYyNWVtKSByb3RhdGVaKDJkZWcpfTMzJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKC0yZGVnKX02NiV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLjMxMjVlbSkgcm90YXRlWigyZGVnKX0xMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooMCl9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3Qtc2hvd3swJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtLjYyNWVtKSByb3RhdGVaKDJkZWcpfTMzJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKC0yZGVnKX02NiV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLjMxMjVlbSkgcm90YXRlWigyZGVnKX0xMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooMCl9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1oaWRlezEwMCV7dHJhbnNmb3JtOnJvdGF0ZVooMWRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOi41NjI1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDouMTI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOi42MjVlbTtsZWZ0Oi0uMjVlbTt3aWR0aDoxLjYyNWVtfTg0JXt0b3A6MS4wNjI1ZW07bGVmdDouNzVlbTt3aWR0aDouNWVtfTEwMCV7dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6LjU2MjVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOi4xMjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6LjYyNWVtO2xlZnQ6LS4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nezAle3RvcDoxLjYyNWVtO3JpZ2h0OjEuMzc1ZW07d2lkdGg6MH02NSV7dG9wOjEuMjVlbTtyaWdodDouOTM3NWVtO3dpZHRoOjB9ODQle3RvcDouOTM3NWVtO3JpZ2h0OjA7d2lkdGg6MS4xMjVlbX0xMDAle3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nezAle3RvcDoxLjYyNWVtO3JpZ2h0OjEuMzc1ZW07d2lkdGg6MH02NSV7dG9wOjEuMjVlbTtyaWdodDouOTM3NWVtO3dpZHRoOjB9ODQle3RvcDouOTM3NWVtO3JpZ2h0OjA7d2lkdGg6MS4xMjVlbX0xMDAle3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXNob3d7MCV7dHJhbnNmb3JtOnNjYWxlKC43KX00NSV7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXt0cmFuc2Zvcm06c2NhbGUoLjk1KX0xMDAle3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBzd2FsMi1zaG93ezAle3RyYW5zZm9ybTpzY2FsZSguNyl9NDUle3RyYW5zZm9ybTpzY2FsZSgxLjA1KX04MCV7dHJhbnNmb3JtOnNjYWxlKC45NSl9MTAwJXt0cmFuc2Zvcm06c2NhbGUoMSl9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1oaWRlezAle3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9MTAwJXt0cmFuc2Zvcm06c2NhbGUoLjUpO29wYWNpdHk6MH19QGtleWZyYW1lcyBzd2FsMi1oaWRlezAle3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9MTAwJXt0cmFuc2Zvcm06c2NhbGUoLjUpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6MS4xODc1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDoxLjA2MjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6Mi4xODc1ZW07bGVmdDotLjM3NWVtO3dpZHRoOjMuMTI1ZW19ODQle3RvcDozZW07bGVmdDoxLjMxMjVlbTt3aWR0aDoxLjA2MjVlbX0xMDAle3RvcDoyLjgxMjVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW19fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDoxLjE4NzVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOjEuMDYyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDoyLjE4NzVlbTtsZWZ0Oi0uMzc1ZW07d2lkdGg6My4xMjVlbX04NCV7dG9wOjNlbTtsZWZ0OjEuMzEyNWVtO3dpZHRoOjEuMDYyNWVtfTEwMCV7dG9wOjIuODEyNWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nezAle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH02NSV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTg0JXt0b3A6Mi4xODc1ZW07cmlnaHQ6MDt3aWR0aDozLjQzNzVlbX0xMDAle3RvcDoyLjM3NWVtO3JpZ2h0Oi41ZW07d2lkdGg6Mi45Mzc1ZW19fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lezAle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX01JXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9MTIle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTUle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0xMiV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFya3swJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9NTAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH04MCV7bWFyZ2luLXRvcDotLjM3NWVtO3RyYW5zZm9ybTpzY2FsZSgxLjE1KX0xMDAle21hcmdpbi10b3A6MDt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH01MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTgwJXttYXJnaW4tdG9wOi0uMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLWljb257MCV7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uezAle3RyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMCk7b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItcm90YXRlLWxvYWRpbmd7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZ3swJXt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93OmhpZGRlbn1ib2R5LnN3YWwyLWhlaWdodC1hdXRve2hlaWdodDphdXRvIWltcG9ydGFudH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXJ7dG9wOmF1dG87cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OmF1dG87bWF4LXdpZHRoOmNhbGMoMTAwJSAtIC42MjVlbSAqIDIpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lcj4uc3dhbDItbW9kYWx7Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLC40KX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9we3RvcDowO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtbGVmdCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e3RvcDowO2xlZnQ6MH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWVuZCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0e3RvcDowO3JpZ2h0OjB9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcnt0b3A6NTAlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnQsYm9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydHt0b3A6NTAlO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXJpZ2h0e3RvcDo1MCU7cmlnaHQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te2JvdHRvbTowO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0e2JvdHRvbTowO2xlZnQ6MH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e3JpZ2h0OjA7Ym90dG9tOjB9QG1lZGlhIHByaW50e2JvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3cteTpzY3JvbGwhaW1wb3J0YW50fWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bik+W2FyaWEtaGlkZGVuPXRydWVde2Rpc3BsYXk6bm9uZX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pIC5zd2FsMi1jb250YWluZXJ7cG9zaXRpb246c3RhdGljIWltcG9ydGFudH19Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHt0b3A6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7dG9wOjA7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG99Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7dG9wOjA7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjB9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnR7dG9wOjUwJTtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye3RvcDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHt0b3A6NTAlO3JpZ2h0OjA7Ym90dG9tOmF1dG87bGVmdDphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0e3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjA7bGVmdDowfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b217dG9wOmF1dG87cmlnaHQ6YXV0bztib3R0b206MDtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e3RvcDphdXRvO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDphdXRvfWJvZHkuc3dhbDItdG9hc3QtY29sdW1uIC5zd2FsMi10b2FzdHtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6c3RyZXRjaH1ib2R5LnN3YWwyLXRvYXN0LWNvbHVtbiAuc3dhbDItdG9hc3QgLnN3YWwyLWFjdGlvbnN7ZmxleDoxO2FsaWduLXNlbGY6c3RyZXRjaDtoZWlnaHQ6Mi4yZW07bWFyZ2luLXRvcDouMzEyNWVtfWJvZHkuc3dhbDItdG9hc3QtY29sdW1uIC5zd2FsMi10b2FzdCAuc3dhbDItbG9hZGluZ3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfWJvZHkuc3dhbDItdG9hc3QtY29sdW1uIC5zd2FsMi10b2FzdCAuc3dhbDItaW5wdXR7aGVpZ2h0OjJlbTttYXJnaW46LjMxMjVlbSBhdXRvO2ZvbnQtc2l6ZToxZW19Ym9keS5zd2FsMi10b2FzdC1jb2x1bW4gLnN3YWwyLXRvYXN0IC5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2V7Zm9udC1zaXplOjFlbX0iKTs="}]}]}