diff --git a/137.bundle.js b/137.bundle.js new file mode 100644 index 0000000..333093d --- /dev/null +++ b/137.bundle.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[137],{137:function(n,t,o){o.r(t),o.d(t,{default:function(){return c}});var l=o(762);const i={class:"component-bem"};var s,e={components:{"component-bem-0":(s={},"function"==typeof s&&(s=s()),"object"!=typeof s&&(s={}),Object.assign(s,{name:"component-bem-0",template:'
\n\t\t\n\t\t\t\n\t
\n\n
'})),"component-bem-1":function(){var n={};return"function"==typeof n&&(n=n()),"object"!=typeof n&&(n={}),Object.assign(n,{name:"component-bem-1",template:'
\n\t\t\n\t\t\t\n\t
\n\n
'})}()}},c=(0,o(314).A)(e,[["render",function(n,t,o,s,e,c){const u=(0,l.g2)("component-bem-0"),m=(0,l.g2)("component-bem-1");return(0,l.uX)(),(0,l.CE)("div",i,[t[0]||(t[0]=(0,l.Lk)("p",null,"作为一个前端,写页面结构,写CSS怎么命名? 就算不用,但你的了解, 让自己的代码更规范。",-1)),t[1]||(t[1]=(0,l.Lk)("h5",null,"BEM是什么",-1)),t[2]||(t[2]=(0,l.Lk)("p",null,"它是css命名的一种规范。试想,你写了一个页面,有input, button, div, 这些元素是什么样的关系,给他们添加样式的时候,怎么知道他们是一个页面的? 怎么知道input 是否放在div里面的? 不要急,这就说到了下面的命名之作用",-1)),t[3]||(t[3]=(0,l.Lk)("h4",null,"BEM是怎么命名的",-1)),(0,l.bF)(u),t[4]||(t[4]=(0,l.Lk)("pre",null,[(0,l.Lk)("code",{class:"language-html"},'\n\t
\n\t\t\n\t\t\t\n\t
\n\n')],-1)),t[5]||(t[5]=(0,l.Lk)("p",null,"通过上面命名可以很直接看出,input 和button 在div 里面。 这里讲 后面的 __input/__confim 这里后面接两个下划线,表示的是div里面的子元素。",-1)),(0,l.bF)(m),t[6]||(t[6]=(0,l.Lk)("pre",null,[(0,l.Lk)("code",{class:"language-html"},'\n\t
\n\t\t\n\t\t\t\n\t
\n\n')],-1)),t[7]||(t[7]=(0,l.Lk)("p",null,"这里说, --big表示添加的描述, 很明显是大的注册表单的样式嘛。",-1)),t[8]||(t[8]=(0,l.Lk)("h4",null,"BEM总结",-1)),t[9]||(t[9]=(0,l.Lk)("p",null,"好了, 这里loggin-from 相当于一块整体(block), 里面包含了元素input/button(element), 还有这个块或者一些元素的修饰big(modifier) => BEM 它一般和sass一起使用,在用@C代表块、 @d代表元素、 @m代码修饰符的时候, css可以这样写了",-1)),t[10]||(t[10]=(0,l.Lk)("pre",null,[(0,l.Lk)("code",null,"@C loggin-from {\n\twidth: 100px;\n\theight: 100px;\n\t@m big {\n\t\twidth: 200px;\n\t\theight: 200px;\n\t}\n\t@d input {\n\t\tcolor: red;\n\t}\n\t@d button {\n\t\tcolor: blue;\n\t}\n}\n")],-1)),t[11]||(t[11]=(0,l.Lk)("p",null,[(0,l.eW)("怎么样,这样是不是就不用写那么长了, 而且一看样式文件,就能知道页面布局是什么样的。 "),(0,l.Lk)("strong",null,"以上写法, 要通过sass 插件配置的"),(0,l.eW)(" 这里有一个包 ,可以使用"),(0,l.Lk)("a",{href:"https://www.npmjs.com/package/sass-bem-constructor"},"sass-bem-constructor")],-1))])}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM3LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0saUJBNENuQixJQUdNQyxFQUhOLEdBRUVDLFdBQVksQ0FBQyxtQkFDVEQsRUFDSyxDQUFDLEVBR2UsbUJBQWRBLElBQ1RBLEVBQVlBLEtBR1csaUJBQWRBLElBQ1RBLEVBQVksQ0FBQyxHQUdSRSxPQUFPQyxPQUFPSCxFQUFXLENBQUNJLEtBQU0sa0JBQWtCQyxTQUFVLCtLQUNoRSxrQkFBb0IsV0FDdkIsSUFBSUwsRUFDSyxDQUFDLEVBV1YsTUFSeUIsbUJBQWRBLElBQ1RBLEVBQVlBLEtBR1csaUJBQWRBLElBQ1RBLEVBQVksQ0FBQyxHQUdSRSxPQUFPQyxPQUFPSCxFQUFXLENBQUNJLEtBQU0sa0JBQWtCQyxTQUFVLGtMQUNyRSxDQWR5QixLQ3JEM0IsR0FGaUMsRSxPQUFBLEdBQWdCLEVBQVEsQ0FBQyxDQUFDLFMsMEdETGpEQyxFQUFBQSxFQUFBQSxJQTJDSixNQTNDSUMsRUEyQ0osY0EzQytCQyxFQUFBQSxFQUFBQSxJQUNYLFNBRGMsaURBQ2xCLGlCQUN0QkEsRUFBQUEsRUFBQUEsSUFBZSxVQUFYLFVBQU0saUJBQ1ZBLEVBQUFBLEVBQUFBLElBQWdJLFNBQTdILDZIQUF5SCxpQkFDNUhBLEVBQUFBLEVBQUFBLElBQWtCLFVBQWQsYUFBUyxLQUNiQyxFQUFBQSxFQUFBQSxJQUFtQ0MsR0FBQSxhQUFBRixFQUFBQSxFQUFBQSxJQU10QixhQU5vQ0EsRUFBQUEsRUFBQUEsSUFNMUMsUUFOZ0RULE1BQU0saUJBQWdCLDhKQU03RSxpQkFDQVMsRUFBQUEsRUFBQUEsSUFDc0QsU0FEbkQsMkZBQytDLEtBQ2xEQyxFQUFBQSxFQUFBQSxJQUFtQ0UsR0FBQSxhQUFBSCxFQUFBQSxFQUFBQSxJQU10QixhQU5vQ0EsRUFBQUEsRUFBQUEsSUFNMUMsUUFOZ0RULE1BQU0saUJBQWdCLG1LQU03RSxpQkFDQVMsRUFBQUEsRUFBQUEsSUFBeUMsU0FBdEMsc0NBQWtDLGlCQUNyQ0EsRUFBQUEsRUFBQUEsSUFBYyxVQUFWLFNBQUssaUJBQ1RBLEVBQUFBLEVBQUFBLElBQ3VELFNBRHBELDBKQUNnRCxtQkFDbkRBLEVBQUFBLEVBQUFBLElBY2EsYUFkQ0EsRUFBQUEsRUFBQUEsSUFjUCxZQWRhLGdNQWNwQixtQkFDQUEsRUFBQUEsRUFBQUEsSUFFcUcsV0ExQ3JHSSxFQUFBQSxFQUFBQSxJQXdDRyxnREFDSEosRUFBQUEsRUFBQUEsSUFBb0MsY0FBNUIsd0JBekNSSSxFQUFBQSxFQUFBQSxJQXlDb0Msa0JBQ3hCSixFQUFBQSxFQUFBQSxJQUFxRixLQUFsRkssS0FBSyxzREFBcUQsMEJBQW9CLEsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vYmVtLm1kIiwid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi9iZW0ubWQ/M2M5NiJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+PGRpdiBjbGFzcz1cImNvbXBvbmVudC1iZW1cIj48cD7kvZzkuLrkuIDkuKrliY3nq6/vvIzlhpnpobXpnaLnu5PmnoTvvIzlhplDU1PmgI7kuYjlkb3lkI0/XG7lsLHnrpfkuI3nlKjvvIzkvYbkvaDnmoTkuobop6PvvIwg6K6p6Ieq5bex55qE5Luj56CB5pu06KeE6IyD44CCPC9wPlxuPGg1PkJFTeaYr+S7gOS5iDwvaDU+XG48cD7lroPmmK9jc3Plkb3lkI3nmoTkuIDnp43op4TojIPjgILor5Xmg7PvvIzkvaDlhpnkuobkuIDkuKrpobXpnaLvvIzmnIlpbnB1dCwgYnV0dG9uLCBkaXYsIOi/meS6m+WFg+e0oOaYr+S7gOS5iOagt+eahOWFs+ezu++8jOe7meS7luS7rOa3u+WKoOagt+W8j+eahOaXtuWAme+8jOaAjuS5iOefpemBk+S7luS7rOaYr+S4gOS4qumhtemdoueahO+8nyDmgI7kuYjnn6XpgZNpbnB1dCDmmK/lkKbmlL7lnKhkaXbph4zpnaLnmoTvvJ8g5LiN6KaB5oCl77yM6L+Z5bCx6K+05Yiw5LqG5LiL6Z2i55qE5ZG95ZCN5LmL5L2c55SoPC9wPlxuPGg0PkJFTeaYr+aAjuS5iOWRveWQjeeahDwvaDQ+XG48Y29tcG9uZW50LWJlbS0wPjwvY29tcG9uZW50LWJlbS0wPjxwcmUgdi1wcmU9XCJcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLWh0bWxcIj4mbHQ7aHRtbCZndDtcblx0Jmx0O2RpdiBjbGFzcz1cImxvZ2dpbi1mcm9tXCImZ3Q7XG5cdFx0Jmx0O2lucHV0IGNsYXNzPVwibG9nZ2luLWZyb21fX2lucHV0XCIvJmd0O1xuXHRcdCZsdDtidXR0b24gY2xhc3M9XCJsb2dnaW4tZnJvbV9fY29uZmltXCImZ3Q756Gu5a6aJmx0Oy9idXR0b24mZ3Q7XHRcblx0Jmx0Oy9kaXYmZ3Q7XG4mbHQ7L2h0bWwmZ3Q7XG48L2NvZGU+PC9wcmU+XG48cD7pgJrov4fkuIrpnaLlkb3lkI3lj6/ku6Xlvojnm7TmjqXnnIvlh7rvvIxpbnB1dCDlkoxidXR0b24g5ZyoZGl2IOmHjOmdouOAglxu6L+Z6YeM6K6yIOWQjumdoueahCBfX2lucHV0L19fY29uZmltIOi/memHjOWQjumdouaOpeS4pOS4quS4i+WIkue6v++8jOihqOekuueahOaYr2RpdumHjOmdoueahOWtkOWFg+e0oOOAgjwvcD5cbjxjb21wb25lbnQtYmVtLTE+PC9jb21wb25lbnQtYmVtLTE+PHByZSB2LXByZT1cIlwiPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtaHRtbFwiPiZsdDtodG1sJmd0O1xuXHQmbHQ7ZGl2IGNsYXNzPVwibG9nZ2luLWZyb20tLWJpZ1wiJmd0O1xuXHRcdCZsdDtpbnB1dCBjbGFzcz1cImxvZ2dpbi1mcm9tX19pbnB1dFwiLyZndDtcblx0XHQmbHQ7YnV0dG9uIGNsYXNzPVwibG9nZ2luLWZyb21fX2NvbmZpbVwiJmd0O+ehruWumiZsdDsvYnV0dG9uJmd0O1x0XG5cdCZsdDsvZGl2Jmd0O1xuJmx0Oy9odG1sJmd0O1xuPC9jb2RlPjwvcHJlPlxuPHA+6L+Z6YeM6K+077yMIC0tYmln6KGo56S65re75Yqg55qE5o+P6L+w77yMIOW+iOaYjuaYvuaYr+Wkp+eahOazqOWGjOihqOWNleeahOagt+W8j+WYm+OAgjwvcD5cbjxoND5CRU3mgLvnu5M8L2g0PlxuPHA+5aW95LqG77yMIOi/memHjGxvZ2dpbi1mcm9tIOebuOW9k+S6juS4gOWdl+aVtOS9kyhibG9jaynvvIwg6YeM6Z2i5YyF5ZCr5LqG5YWD57SgaW5wdXQvYnV0dG9uKGVsZW1lbnQpLCDov5jmnInov5nkuKrlnZfmiJbogIXkuIDkupvlhYPntKDnmoTkv67ppbBiaWcobW9kaWZpZXIpID0mZ3Q7IEJFTVxu5a6D5LiA6Iis5ZKMc2Fzc+S4gOi1t+S9v+eUqO+8jOWcqOeUqEBD5Luj6KGo5Z2X44CBIEBk5Luj6KGo5YWD57Sg44CBIEBt5Luj56CB5L+u6aWw56ym55qE5pe25YCZ77yMIGNzc+WPr+S7pei/meagt+WGmeS6hjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5AQyBsb2dnaW4tZnJvbSB7XG5cdHdpZHRoOiAxMDBweDtcblx0aGVpZ2h0OiAxMDBweDtcblx0QG0gYmlnIHtcblx0XHR3aWR0aDogMjAwcHg7XG5cdFx0aGVpZ2h0OiAyMDBweDtcblx0fVxuXHRAZCBpbnB1dCB7XG5cdFx0Y29sb3I6IHJlZDtcblx0fVxuXHRAZCBidXR0b24ge1xuXHRcdGNvbG9yOiBibHVlO1xuXHR9XG59XG48L2NvZGU+PC9wcmU+XG48cD7mgI7kuYjmoLfvvIzov5nmoLfmmK/kuI3mmK/lsLHkuI3nlKjlhpnpgqPkuYjplb/kuobvvIwg6ICM5LiU5LiA55yL5qC35byP5paH5Lu277yM5bCx6IO955+l6YGT6aG16Z2i5biD5bGA5piv5LuA5LmI5qC355qE44CCXG48c3Ryb25nPuS7peS4iuWGmeazle+8jCDopoHpgJrov4dzYXNzIOaPkuS7tumFjee9rueahDwvc3Ryb25nPlxu6L+Z6YeM5pyJ5LiA5Liq5YyFIO+8jOWPr+S7peS9v+eUqDxhIGhyZWY9XCJodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zYXNzLWJlbS1jb25zdHJ1Y3RvclwiPnNhc3MtYmVtLWNvbnN0cnVjdG9yPC9hPjwvcD5cbjwvZGl2PjwvdGVtcGxhdGU+PHNjcmlwdD5cbiAgZXhwb3J0IGRlZmF1bHQge1xuICAgIFxuICAgIGNvbXBvbmVudHM6IHtcImNvbXBvbmVudC1iZW0tMFwiOiAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb21wb25lbnQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0oKSk7XG5cbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICBjb21wb25lbnQgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb21wb25lbnQsIHtuYW1lOiBcImNvbXBvbmVudC1iZW0tMFwiLHRlbXBsYXRlOiBcIjxkaXYgY2xhc3M9XFxcImNvbXBvbmVudC1iZW0tMFxcXCI+PGRpdiBjbGFzcz1cXFwibG9nZ2luLWZyb21cXFwiPlxcblxcdFxcdDxpbnB1dCBjbGFzcz1cXFwibG9nZ2luLWZyb21fX2lucHV0XFxcIj5cXG5cXHRcXHQ8YnV0dG9uIGNsYXNzPVxcXCJsb2dnaW4tZnJvbV9fY29uZmltXFxcIj7noa7lrpo8L2J1dHRvbj5cXHRcXG5cXHQ8L2Rpdj5cXG5cXG48L2Rpdj5cIn0pO1xuICB9KCkpLFwiY29tcG9uZW50LWJlbS0xXCI6IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfSgpKTtcblxuICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnQgPSBjb21wb25lbnQoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbXBvbmVudCA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNvbXBvbmVudCwge25hbWU6IFwiY29tcG9uZW50LWJlbS0xXCIsdGVtcGxhdGU6IFwiPGRpdiBjbGFzcz1cXFwiY29tcG9uZW50LWJlbS0xXFxcIj48ZGl2IGNsYXNzPVxcXCJsb2dnaW4tZnJvbS0tYmlnXFxcIj5cXG5cXHRcXHQ8aW5wdXQgY2xhc3M9XFxcImxvZ2dpbi1mcm9tX19pbnB1dFxcXCI+XFxuXFx0XFx0PGJ1dHRvbiBjbGFzcz1cXFwibG9nZ2luLWZyb21fX2NvbmZpbVxcXCI+56Gu5a6aPC9idXR0b24+XFx0XFxuXFx0PC9kaXY+XFxuXFxuPC9kaXY+XCJ9KTtcbiAgfSgpKX1cbiAgfTtcbjwvc2NyaXB0PiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL2JlbS5tZD92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDk4NmFmNVwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL2JlbS5tZD92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9iZW0ubWQ/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdnVlLWxvYWRlckAxNy40LjJfQHZ1ZStjb21waWxlci1zZmNAMy41LjEyX3Z1ZUAzLjUuMTJfdHlwZXNjcmlwdEA1LjYuM19fd2VicGFja0A1Ljk1LjBfd2VicGFjay1jbGlANS4xLjRfL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ3JlbmRlcicscmVuZGVyXV0pXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbImNsYXNzIiwiY29tcG9uZW50IiwiY29tcG9uZW50cyIsIk9iamVjdCIsImFzc2lnbiIsIm5hbWUiLCJ0ZW1wbGF0ZSIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9jcmVhdGVWTm9kZSIsIl9jb21wb25lbnRfY29tcG9uZW50X2JlbV8wIiwiX2NvbXBvbmVudF9jb21wb25lbnRfYmVtXzEiLCJfY3JlYXRlVGV4dFZOb2RlIiwiaHJlZiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/969.bundle.js b/172.bundle.js similarity index 97% rename from 969.bundle.js rename to 172.bundle.js index 814d8e8..4a6f4ec 100644 --- a/969.bundle.js +++ b/172.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[969],{969:function(e,n,t){t.r(n),t.d(n,{default:function(){return p}});var o=t(358);const i={class:"component-vue"},r={};var p=(0,t(389).A)(r,[["render",function(e,n){return(0,o.uX)(),(0,o.CE)("div",i,n[0]||(n[0]=[(0,o.Fv)('

vue 是一个 js 框架,它实现了自己的模板,通过 .vue 文件可以经过编译成一个数据改变驱动视图改变的 js代码。 那么这其中又是经历了什么样的步骤呢?


一个 vue 对象是通过 new Vue({options}) 来得到的,也就是构造函数了。我们来看这个函数

function Vue (options) {\n  if (process.env.NODE_ENV !== 'production' &&\n    !(this instanceof Vue)\n  ) {\n    warn('Vue is a constructor and should be called with the `new` keyword')\n  }\n  this._init(options)\n}\n\n// 这里是一系列对这个函数进行的继承\ninitMixin(Vue)\nstateMixin(Vue)\neventsMixin(Vue)\nlifecycleMixin(Vue)\nrenderMixin(Vue)\n\nexport default Vue\n

可以看到这个 Vue 构造函数,它经历了 5 个系列的mixin,并在新创建时会运行 _init(options) 方法。 那么我们来看看, 这五个 mixin 分别做了啥。

第一个 initMixin

它只做了一件事, 定义了 _init 方法,那么你就知道创造一个Vue 实例,它执行的 _init 方法就是上面这个方法了。

Vue.prototype._init = function (options?: Object) {\n....\n}\n
第二个 stateMixin
  Object.defineProperty(Vue.prototype, '$data', dataDef)  // 能够返回 data\n  Object.defineProperty(Vue.prototype, '$props', propsDef) // 能够返回 props\n  Vue.prototype.$set = set // 就是我们用的 this.$set(this.people, 'name', ‘clever')方法, 下同。\n  Vue.prototype.$delete = del\n  Vue.prototype.$watch = function (\n   ....\n  }\n
第三个 eventsMixin
Vue.prototype.$on = function (eventname, fn) {\n....\n}\nVue.prototype._$once = function (eventname, fn) {\n // 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。\n}\nVue.prototype._off = function (event, fn) {\n// 移除自定义事件监听器。\n}\nVue.prototype.$emit = function (event) {\n// 触发一个事件\n}\n
第四个 lifecycleMixin在这里插入图片描述
第五个 renderMixin在这里插入图片描述

好, 这个 Vue 继承了这些方法,它已经是一个完整的 Vue 了,而新创建的时候要执行 _init 方法了, 现在我们来看看这个方法里面做了写啥

关于 initLifecycle\n  vm.$parent = parent\n  vm.$root = parent ? parent.$root : vm\n  vm.$children = []\n  vm.$refs = {}\n  vm._watcher = null\n  vm._inactive = null\n  vm._directInactive = false\n  vm._isMounted = false\n  vm._isDestroyed = false\n  vm._isBeingDestroyed = false\n
  vm._events = Object.create(null)\n  vm._hasHookEvent = false\n  // init parent attached events\n  const listeners = vm.$options._parentListeners\n  if (listeners) {\n    updateComponentListeners(vm, listeners)\n  }\n  就是判断父级是否有事件监听,然后给父级进行监听事件\n
   vm._vnode = null  // the root of the child tree\n  vm._staticTrees = null  // v-once cached trees\n  const options = vm.$options\n  const parentVnode = vm.$vnode = options._parentVnode // the placeholder node in parent tree\n  const renderContext = parentVnode && parentVnode.context\n  vm.$slots = resolveSlots(options._renderChildren, renderContext)\n  vm.$scopedSlots = emptyObject\n  // 实例绑定 createElement 方法,以便可以正常在内部渲染\n // 参数顺序   tag, data, children, normalizationType, alwaysNormalize\n  // 内部使用从模板编译而来的渲染函数\n  \n  vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)\n  // 公共版本必须是 normalization 的渲染函数\n  vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)\n\n  // $attrs & $listeners 应该被监听热更新\n  const parentData = parentVnode && parentVnode.data\n\n  if (process.env.NODE_ENV !== 'production') {\n    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, () => {\n      !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm)\n    }, true)\n    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, () => {\n      !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm)\n    }, true)\n  } else {\n    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true)\n    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true)\n  }\n
  const result = resolveInject(vm.$options.inject, vm)\n  if (result) {\n    toggleObserving(false)\n    Object.keys(result).forEach(key => {\n      if (process.env.NODE_ENV !== 'production') {\n        defineReactive(vm, key, result[key], () => {\n          warn(\n          \t`避免直接改变注入的值,因为将会重新渲染所提供这个值的组件, \n          \t改变的值是: "${key}",\n            vm\n          )\n        })\n      } else {\n        defineReactive(vm, key, result[key])\n      }\n    })\n    toggleObserving(true)\n
  vm._watchers = []\n  const opts = vm.$options\n  if (opts.props) initProps(vm, opts.props) // 赋值 props 数据并收集依赖\n  if (opts.methods) initMethods(vm, opts.methods) // 赋值 vue 的各个 method\n  if (opts.data) {\n    initData(vm) // 收集依赖\n  } else {\n    observe(vm._data = {}, true /* asRootData */)\n  }\n  if (opts.computed) initComputed(vm, opts.computed) // 收集依赖\n  if (opts.watch && opts.watch !== nativeWatch) {\n    initWatch(vm, opts.watch) // 初始化你写的监听对象\n  }\n \n
  const provide = vm.$options.provide\n  if (provide) {\n    vm._provided = typeof provide === 'function'\n      ? provide.call(vm)\n      : provide\n  }\n

这就是 _init 中各个函数所做的了。 我们可以看到总结过来就是 1.初始化了生命状态 2.进行事件上的监听 3.渲染视图的初始化;收集所用到的父组件的数据或事件 4.调用你写的 beforeCreate 方法 5.initState, 处理了 vue 中的各种数据(props/data/methods…), 也在这一步针对这些数据进行了依赖收集,数据更新绑定 6.初始化了 provide 的值, 也可以看出它没有被收集依赖, 是不会影响视图改变的 7.调用了你写的 created 方法了。

以上,就是你 let app = new Vue() 这一步所发生的所有事情了。

那通过平时的使用我们知道,我们是通过调用 $mounted 能把它挂载上页面。所以接下来我们就可以来看看 vue 自己的 $mount 都做了些什么?

答: 就是把 template 或直接写的 render 函数,进行指令、事件等vue 中的语法解析编译成一个 AST 树。通过这个树,通过之前 initRender 中的 $createElement 方法可以生成虚拟DOM, 然后添加到页面中出,不就渲染出来了么。 如果大家使用过 Vue 的 $createElement 方法,相信就知道这个 ast 是怎么一个结构了,拿示例的来说

createElement(\n  'div',\n  [\n    '先写一些文字',\n    createElement('h1', '一则头条'),\n    createElement(MyComponent, {\n      props: {\n        someProp: 'foobar'\n      }\n    })\n  ]\n)\n

说完了整个过程,现在还比较疑惑的就是它的收集依赖,然后数据改变引起的视图改变到底怎么做呢?

也就是说我们要实现一个模式,vm 可能 data 对象中的一个值,比如 name 改变了,然后就调用重新渲染的函数,这里为了性能,是生成了一个虚拟 Dom, 然后比较哪里改变了进行相应的替换。 把这个模式抽象出来,就是我们需要一个

先说具体实现: 我们视图更新依赖到的值收集起来,这里把每一个依赖到的值称作 dep。每个依赖订阅与它有关的 vue 的 watcher 中心, 这里把 dep 所订阅的 watcher 叫做 sub。 那么 dep 被改变的时候,获取它订阅了那些 watcher, 通知他们进行 update 视图啦。

可以看我画的简图 在这里插入图片描述在这里插入图片描述

这就是依赖对象 和 一个 watcher 对象所涉及到的处理了。 Vue 中又是怎么把一个个的属性,进行操作变成依赖的呢? 对应它的源码就是 defineReactive 方法。源码如图:

export function defineReactive (obj, key, val, customSetter, shallow) {\n  const dep = new Dep()\n  \n  // 迎合预定义的getter / setter\n  const getter = property && property.get\n  const setter = property && property.set\n  if ((!getter || setter) && arguments.length === 2) {\n    val = obj[key]\n  }\n  \n  let childOb = !shallow && observe(val)\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter () {\n      const value = getter ? getter.call(obj) : val\n      if (Dep.target) {\n        dep.depend()\n        if (childOb) {\n          childOb.dep.depend()\n          if (Array.isArray(value)) {\n            dependArray(value)\n          }\n        }\n      }\n      return value\n    },\n    set: function reactiveSetter (newVal) {\n      const value = getter ? getter.call(obj) : val\n      if (newVal === value || (newVal !== newVal && value !== value)) {\n        return\n      }\n      if (setter) {\n        setter.call(obj, newVal)\n      } else {\n        val = newVal\n      }\n      childOb = !shallow && observe(newVal)\n      dep.notify()\n    }\n  })\n}\n

这里就是用的 Object.defineProperty 方法,它可以重写对象的属性的 get 和 set 方法。 当这个属性在 Vue 中被获取的时候,就开始收集依赖,把它收集在这个 vm 的 watcher 中心,并且让它订阅这个 watcher 。当这个属性被重新设置时, 就通知它所订阅的对象去更新。

大致要知道的就是这些了。关于具体是怎么实现把 template 编译成 ast 树, 具体是怎么把事件绑定上去的,你可以尽情的去猜想和推测,或者去看看具体的实现方式。但是 VUE 框架总体来说所做的就是这些事情了, 如果有觉得本文写的不清楚的地方可以提哈 = =

',43)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTY5LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0saUJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXlRSixNQXpRSUMsRUF5UUpDLEVBQUEsS0FBQUEsRUFBQSxLQXpRTkMsRUFBQUEsRUFBQUEsSUFBQSxpbFIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vdnVlLm1kIiwid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi92dWUubWQ/MjlmMiJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+PGRpdiBjbGFzcz1cImNvbXBvbmVudC12dWVcIj48cD52dWUg5piv5LiA5LiqIGpzIOahhuaetu+8jOWug+WunueOsOS6huiHquW3seeahOaooeadv++8jOmAmui/hyAudnVlIOaWh+S7tuWPr+S7pee7j+i/h+e8luivkeaIkOS4gOS4quaVsOaNruaUueWPmOmpseWKqOinhuWbvuaUueWPmOeahCBqc+S7o+eggeOAglxu6YKj5LmI6L+Z5YW25Lit5Y+I5piv57uP5Y6G5LqG5LuA5LmI5qC355qE5q2l6aqk5ZGi77yfPC9wPlxuPGhyPlxuPHA+5LiA5LiqIHZ1ZSDlr7nosaHmmK/pgJrov4cgbmV3IFZ1ZSh7b3B0aW9uc30pIOadpeW+l+WIsOeahO+8jOS5n+WwseaYr+aehOmAoOWHveaVsOS6huOAguaIkeS7rOadpeeci+i/meS4quWHveaVsDwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5mdW5jdGlvbiBWdWUgKG9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJmFtcDsmYW1wO1xuICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSlcbiAgKSB7XG4gICAgd2FybignVnVlIGlzIGEgY29uc3RydWN0b3IgYW5kIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZCcpXG4gIH1cbiAgdGhpcy5faW5pdChvcHRpb25zKVxufVxuXG4vLyDov5nph4zmmK/kuIDns7vliJflr7nov5nkuKrlh73mlbDov5vooYznmoTnu6fmib9cbmluaXRNaXhpbihWdWUpXG5zdGF0ZU1peGluKFZ1ZSlcbmV2ZW50c01peGluKFZ1ZSlcbmxpZmVjeWNsZU1peGluKFZ1ZSlcbnJlbmRlck1peGluKFZ1ZSlcblxuZXhwb3J0IGRlZmF1bHQgVnVlXG48L2NvZGU+PC9wcmU+XG48cD7lj6/ku6XnnIvliLDov5nkuKogVnVlIOaehOmAoOWHveaVsO+8jOWug+e7j+WOhuS6hiA1IOS4quezu+WIl+eahG1peGlu77yM5bm25Zyo5paw5Yib5bu65pe25Lya6L+Q6KGMIF9pbml0KG9wdGlvbnMpIOaWueazleOAglxu6YKj5LmI5oiR5Lus5p2l55yL55yLLCDov5nkupTkuKogbWl4aW4g5YiG5Yir5YGa5LqG5ZWl44CCPC9wPlxuPGg1PuesrOS4gOS4qiAgaW5pdE1peGluPC9oNT5cbjxwPuWug+WPquWBmuS6huS4gOS7tuS6i++8jCDlrprkuYnkuoYgX2luaXQg5pa55rOV77yM6YKj5LmI5L2g5bCx55+l6YGT5Yib6YCg5LiA5LiqVnVlIOWunuS+i++8jOWug+aJp+ihjOeahCBfaW5pdCDmlrnms5XlsLHmmK/kuIrpnaLov5nkuKrmlrnms5XkuobjgII8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+VnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zPzogT2JqZWN0KSB7XG4uLi4uXG59XG48L2NvZGU+PC9wcmU+XG48aDU+56ys5LqM5LiqIHN0YXRlTWl4aW48L2g1PlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpICAvLyDog73lpJ/ov5Tlm54gZGF0YVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKSAvLyDog73lpJ/ov5Tlm54gcHJvcHNcbiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0IC8vIOWwseaYr+aIkeS7rOeUqOeahCB0aGlzLiRzZXQodGhpcy5wZW9wbGUsICduYW1lJywg4oCYY2xldmVyJynmlrnms5UsIOS4i+WQjOOAglxuICBWdWUucHJvdG90eXBlLiRkZWxldGUgPSBkZWxcbiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoXG4gICAuLi4uXG4gIH1cbjwvY29kZT48L3ByZT5cbjxoNT7nrKzkuInkuKogZXZlbnRzTWl4aW48L2g1PlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPlZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcbi4uLi5cbn1cblZ1ZS5wcm90b3R5cGUuXyRvbmNlID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcbiAvLyDnm5HlkKzkuIDkuKroh6rlrprkuYnkuovku7bvvIzkvYbmmK/lj6rop6blj5HkuIDmrKHvvIzlnKjnrKzkuIDmrKHop6blj5HkuYvlkI7np7vpmaTnm5HlkKzlmajjgIJcbn1cblZ1ZS5wcm90b3R5cGUuX29mZiA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcbi8vIOenu+mZpOiHquWumuS5ieS6i+S7tuebkeWQrOWZqOOAglxufVxuVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xuLy8g6Kem5Y+R5LiA5Liq5LqL5Lu2XG59XG48L2NvZGU+PC9wcmU+XG48aDU+56ys5Zub5LiqIGxpZmVjeWNsZU1peGluPGltZyBzcmM9XCJodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS8wMjI3YzhjMTUyODVmYmQxNzk1NzNlN2NkOGNiNDcxOC5wbmdcIiBhbHQ9XCLlnKjov5nph4zmj5LlhaXlm77niYfmj4/ov7BcIj48L2g1PlxuPGg1PuesrOS6lOS4qiByZW5kZXJNaXhpbjxpbWcgc3JjPVwiaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNzE1Mzk5YTlhYzM1Y2VmN2MzYWNhMmQzMjQyY2E1YTMucG5nXCIgYWx0PVwi5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXCI+PC9oNT5cbjxocj5cbjxwPuWlve+8jCDov5nkuKogVnVlIOe7p+aJv+S6hui/meS6m+aWueazle+8jOWug+W3sue7j+aYr+S4gOS4quWujOaVtOeahCBWdWUg5LqG77yM6ICM5paw5Yib5bu655qE5pe25YCZ6KaB5omn6KGMIF9pbml0IOaWueazleS6hiwg546w5Zyo5oiR5Lus5p2l55yL55yL6L+Z5Liq5pa55rOV6YeM6Z2i5YGa5LqG5YaZ5ZWlPC9wPlxuPHVsPlxuPGxpPnZtLl91aWQgPSB1aWQrKyDliJvlu7ogdWlkPC9saT5cbjxsaT7lkIjlubYgb3B0aW9uczwvbGk+XG48bGk+aW5pdExpZmVjeWNsZVxuaW5pdEV2ZW50cyh2bSlcbmluaXRSZW5kZXIodm0pXG5jYWxsSG9vayh2bSwg4oCYYmVmb3JlQ3JlYXRl4oCZKVxuaW5pdEluamVjdGlvbnModm0pIC8vIHJlc29sdmUgaW5qZWN0aW9ucyBiZWZvcmUgZGF0YS9wcm9wc1xuaW5pdFN0YXRlKHZtKVxuaW5pdFByb3ZpZGUodm0pIC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzXG5jYWxsSG9vayh2bSwg4oCYY3JlYXRlZOKAmSk8L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT7lhbPkuo4gaW5pdExpZmVjeWNsZVxuICB2bS4kcGFyZW50ID0gcGFyZW50XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm1cbiAgdm0uJGNoaWxkcmVuID0gW11cbiAgdm0uJHJlZnMgPSB7fVxuICB2bS5fd2F0Y2hlciA9IG51bGxcbiAgdm0uX2luYWN0aXZlID0gbnVsbFxuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZVxuICB2bS5faXNNb3VudGVkID0gZmFsc2VcbiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2VcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZVxuPC9jb2RlPjwvcHJlPlxuPHVsPlxuPGxpPmluaXRFdmVudHM8L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZVxuICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHNcbiAgY29uc3QgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyc1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpXG4gIH1cbiAg5bCx5piv5Yik5pat54i257qn5piv5ZCm5pyJ5LqL5Lu255uR5ZCs77yM54S25ZCO57uZ54i257qn6L+b6KGM55uR5ZCs5LqL5Lu2XG48L2NvZGU+PC9wcmU+XG48dWw+XG48bGk+aW5pdFJlbmRlcjwvbGk+XG48L3VsPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPiAgIHZtLl92bm9kZSA9IG51bGwgIC8vIHRoZSByb290IG9mIHRoZSBjaGlsZCB0cmVlXG4gIHZtLl9zdGF0aWNUcmVlcyA9IG51bGwgIC8vIHYtb25jZSBjYWNoZWQgdHJlZXNcbiAgY29uc3Qgb3B0aW9ucyA9IHZtLiRvcHRpb25zXG4gIGNvbnN0IHBhcmVudFZub2RlID0gdm0uJHZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGUgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgY29uc3QgcmVuZGVyQ29udGV4dCA9IHBhcmVudFZub2RlICZhbXA7JmFtcDsgcGFyZW50Vm5vZGUuY29udGV4dFxuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpXG4gIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0XG4gIC8vIOWunuS+i+e7keWumiBjcmVhdGVFbGVtZW50IOaWueazle+8jOS7peS+v+WPr+S7peato+W4uOWcqOWGhemDqOa4suafk1xuIC8vIOWPguaVsOmhuuW6jyAgIHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8g5YaF6YOo5L2/55So5LuO5qih5p2/57yW6K+R6ICM5p2l55qE5riy5p+T5Ye95pWwXG4gIFxuICB2bS5fYyA9IChhLCBiLCBjLCBkKSA9Jmd0OyBjcmVhdGVFbGVtZW50KHZtLCBhLCBiLCBjLCBkLCBmYWxzZSlcbiAgLy8g5YWs5YWx54mI5pys5b+F6aG75pivIG5vcm1hbGl6YXRpb24g55qE5riy5p+T5Ye95pWwXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gKGEsIGIsIGMsIGQpID0mZ3Q7IGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpXG5cbiAgLy8gJGF0dHJzICZhbXA7ICRsaXN0ZW5lcnMg5bqU6K+l6KKr55uR5ZCs54Ot5pu05pawXG4gIGNvbnN0IHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmYW1wOyZhbXA7IHBhcmVudFZub2RlLmRhdGFcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmYW1wOyZhbXA7IHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsICgpID0mZ3Q7IHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJmFtcDsmYW1wOyB3YXJuKGAkYXR0cnMgaXMgcmVhZG9ubHkuYCwgdm0pXG4gICAgfSwgdHJ1ZSlcbiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsICgpID0mZ3Q7IHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJmFtcDsmYW1wOyB3YXJuKGAkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LmAsIHZtKVxuICAgIH0sIHRydWUpXG4gIH0gZWxzZSB7XG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICZhbXA7JmFtcDsgcGFyZW50RGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdCwgbnVsbCwgdHJ1ZSlcbiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpXG4gIH1cbjwvY29kZT48L3ByZT5cbjx1bD5cbjxsaT5cbjxwPmNhbGxIb29rKHZtLCDigJhiZWZvcmVDcmVhdGXigJkpIOaJp+ihjCBiZWZvcmVDcmVhdGUg5Ye95pWwPC9wPlxuPC9saT5cbjxsaT5cbjxwPmluaXRJbmplY3Rpb25zKHZtKSDmlLbpm4bms6jlhaXnmoTkvp3otZY8L3A+XG48L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT4gIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmplY3Qodm0uJG9wdGlvbnMuaW5qZWN0LCB2bSlcbiAgaWYgKHJlc3VsdCkge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSlcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goa2V5ID0mZ3Q7IHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCAoKSA9Jmd0OyB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICBcdGDpgb/lhY3nm7TmjqXmlLnlj5jms6jlhaXnmoTlgLzvvIzlm6DkuLrlsIbkvJrph43mlrDmuLLmn5PmiYDmj5Dkvpvov5nkuKrlgLznmoTnu4Tku7YsIFxuICAgICAgICAgIFx05pS55Y+Y55qE5YC85pivOiBcIiR7a2V5fVwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZpbmVSZWFjdGl2ZSh2bSwga2V5LCByZXN1bHRba2V5XSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKVxuPC9jb2RlPjwvcHJlPlxuPHVsPlxuPGxpPmluaXRTdGF0ZSDnm5HlkKzlgLzmlLbpm4bkvp3otZY8L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT4gIHZtLl93YXRjaGVycyA9IFtdXG4gIGNvbnN0IG9wdHMgPSB2bS4kb3B0aW9uc1xuICBpZiAob3B0cy5wcm9wcykgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKSAvLyDotYvlgLwgcHJvcHMg5pWw5o2u5bm25pS26ZuG5L6d6LWWXG4gIGlmIChvcHRzLm1ldGhvZHMpIGluaXRNZXRob2RzKHZtLCBvcHRzLm1ldGhvZHMpIC8vIOi1i+WAvCB2dWUg55qE5ZCE5LiqIG1ldGhvZFxuICBpZiAob3B0cy5kYXRhKSB7XG4gICAgaW5pdERhdGEodm0pIC8vIOaUtumbhuS+nei1llxuICB9IGVsc2Uge1xuICAgIG9ic2VydmUodm0uX2RhdGEgPSB7fSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKVxuICB9XG4gIGlmIChvcHRzLmNvbXB1dGVkKSBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpIC8vIOaUtumbhuS+nei1llxuICBpZiAob3B0cy53YXRjaCAmYW1wOyZhbXA7IG9wdHMud2F0Y2ggIT09IG5hdGl2ZVdhdGNoKSB7XG4gICAgaW5pdFdhdGNoKHZtLCBvcHRzLndhdGNoKSAvLyDliJ3lp4vljJbkvaDlhpnnmoTnm5HlkKzlr7nosaFcbiAgfVxuIFxuPC9jb2RlPjwvcHJlPlxuPHVsPlxuPGxpPmluaXRQcm92aWRlPC9saT5cbjwvdWw+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+ICBjb25zdCBwcm92aWRlID0gdm0uJG9wdGlvbnMucHJvdmlkZVxuICBpZiAocHJvdmlkZSkge1xuICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHByb3ZpZGUuY2FsbCh2bSlcbiAgICAgIDogcHJvdmlkZVxuICB9XG48L2NvZGU+PC9wcmU+XG48dWw+XG48bGk+Y2FsbEhvb2sodm0sIOKAmGNyZWF0ZWTigJkpIOaJp+ihjCBjcmVhdGVkIOWHveaVsDwvbGk+XG48L3VsPlxuPGJsb2NrcXVvdGU+XG48cD7ov5nlsLHmmK8gX2luaXQg5Lit5ZCE5Liq5Ye95pWw5omA5YGa55qE5LqG44CCIOaIkeS7rOWPr+S7peeci+WIsOaAu+e7k+i/h+adpeWwseaYr1xuMS7liJ3lp4vljJbkuobnlJ/lkb3nirbmgIFcbjIu6L+b6KGM5LqL5Lu25LiK55qE55uR5ZCsXG4zLua4suafk+inhuWbvueahOWIneWni+WMlu+8m+aUtumbhuaJgOeUqOWIsOeahOeItue7hOS7tueahOaVsOaNruaIluS6i+S7tlxuNC7osIPnlKjkvaDlhpnnmoQgYmVmb3JlQ3JlYXRlIOaWueazlVxuNS5pbml0U3RhdGUsIOWkhOeQhuS6hiB2dWUg5Lit55qE5ZCE56eN5pWw5o2uKHByb3BzL2RhdGEvbWV0aG9kc+KApiksIOS5n+WcqOi/meS4gOatpemSiOWvuei/meS6m+aVsOaNrui/m+ihjOS6huS+nei1luaUtumbhu+8jOaVsOaNruabtOaWsOe7keWumlxuNi7liJ3lp4vljJbkuoYgcHJvdmlkZSDnmoTlgLzvvIwg5Lmf5Y+v5Lul55yL5Ye65a6D5rKh5pyJ6KKr5pS26ZuG5L6d6LWW77yMIOaYr+S4jeS8muW9seWTjeinhuWbvuaUueWPmOeahFxuNy7osIPnlKjkuobkvaDlhpnnmoQgY3JlYXRlZCDmlrnms5XkuobjgII8L3A+XG48L2Jsb2NrcXVvdGU+XG48cD7ku6XkuIrvvIzlsLHmmK/kvaAgbGV0IGFwcCA9IG5ldyBWdWUoKSDov5nkuIDmraXmiYDlj5HnlJ/nmoTmiYDmnInkuovmg4XkuobjgII8L3A+XG48cD7pgqPpgJrov4flubPml7bnmoTkvb/nlKjmiJHku6znn6XpgZPvvIzmiJHku6zmmK/pgJrov4fosIPnlKggJG1vdW50ZWQg6IO95oqK5a6D5oyC6L295LiK6aG16Z2i44CC5omA5Lul5o6l5LiL5p2l5oiR5Lus5bCx5Y+v5Lul5p2l55yL55yLIHZ1ZSDoh6rlt7HnmoQgJG1vdW50IOmDveWBmuS6huS6m+S7gOS5iD88L3A+XG48cD7nrZQ6IOWwseaYr+aKiiB0ZW1wbGF0ZSDmiJbnm7TmjqXlhpnnmoQgcmVuZGVyIOWHveaVsO+8jOi/m+ihjOaMh+S7pOOAgeS6i+S7tuetiXZ1ZSDkuK3nmoTor63ms5Xop6PmnpDnvJbor5HmiJDkuIDkuKogQVNUIOagkeOAgumAmui/h+i/meS4quagke+8jOmAmui/h+S5i+WJjSBpbml0UmVuZGVyIOS4reeahCAkY3JlYXRlRWxlbWVudCDmlrnms5Xlj6/ku6XnlJ/miJDomZrmi59ET00sIOeEtuWQjua3u+WKoOWIsOmhtemdouS4reWHuu+8jOS4jeWwsea4suafk+WHuuadpeS6huS5iOOAgiDlpoLmnpzlpKflrrbkvb/nlKjov4cgVnVlIOeahCAkY3JlYXRlRWxlbWVudCDmlrnms5XvvIznm7jkv6HlsLHnn6XpgZPov5nkuKogYXN0IOaYr+aAjuS5iOS4gOS4que7k+aehOS6hu+8jOaLv+ekuuS+i+eahOadpeivtDwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5jcmVhdGVFbGVtZW50KFxuICAnZGl2JyxcbiAgW1xuICAgICflhYjlhpnkuIDkupvmloflrZcnLFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2gxJywgJ+S4gOWImeWktOadoScpLFxuICAgIGNyZWF0ZUVsZW1lbnQoTXlDb21wb25lbnQsIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHNvbWVQcm9wOiAnZm9vYmFyJ1xuICAgICAgfVxuICAgIH0pXG4gIF1cbilcbjwvY29kZT48L3ByZT5cbjxocj5cbjxwPuivtOWujOS6huaVtOS4qui/h+eoi++8jOeOsOWcqOi/mOavlOi+g+eWkeaDkeeahOWwseaYr+Wug+eahOaUtumbhuS+nei1lu+8jOeEtuWQjuaVsOaNruaUueWPmOW8lei1t+eahOinhuWbvuaUueWPmOWIsOW6leaAjuS5iOWBmuWRou+8nzwvcD5cbjxwPuS5n+WwseaYr+ivtOaIkeS7rOimgeWunueOsOS4gOS4quaooeW8j++8jHZtIOWPr+iDvSBkYXRhIOWvueixoeS4reeahOS4gOS4quWAvO+8jOavlOWmgiBuYW1lIOaUueWPmOS6hu+8jOeEtuWQjuWwseiwg+eUqOmHjeaWsOa4suafk+eahOWHveaVsO+8jOi/memHjOS4uuS6huaAp+iDve+8jOaYr+eUn+aIkOS6huS4gOS4quiZmuaLnyBEb20sIOeEtuWQjuavlOi+g+WTqumHjOaUueWPmOS6hui/m+ihjOebuOW6lOeahOabv+aNouOAglxu5oqK6L+Z5Liq5qih5byP5oq96LGh5Ye65p2l77yM5bCx5piv5oiR5Lus6ZyA6KaB5LiA5LiqPC9wPlxuPHA+5YWI6K+05YW35L2T5a6e546w77yaIOaIkeS7rOinhuWbvuabtOaWsOS+nei1luWIsOeahOWAvOaUtumbhui1t+adpe+8jOi/memHjOaKiuavj+S4gOS4quS+nei1luWIsOeahOWAvOensOS9nCBkZXDjgILmr4/kuKrkvp3otZborqLpmIXkuI7lroPmnInlhbPnmoQgdnVlIOeahCB3YXRjaGVyIOS4reW/g++8jCDov5nph4zmioogZGVwIOaJgOiuoumYheeahCB3YXRjaGVyIOWPq+WBmiBzdWLjgIIg6YKj5LmIIGRlcCDooqvmlLnlj5jnmoTml7blgJnvvIzojrflj5blroPorqLpmIXkuobpgqPkupsgd2F0Y2hlcu+8jCDpgJrnn6Xku5bku6zov5vooYwgdXBkYXRlIOinhuWbvuWVpuOAgjwvcD5cbjxwPuWPr+S7peeci+aIkeeUu+eahOeugOWbvlxuPGltZyBzcmM9XCJodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS80MTdjMjMwODhjYjAyMjRjNmE0NDY0NjUxNDUyYzYwNC5wbmdcIiBhbHQ9XCLlnKjov5nph4zmj5LlhaXlm77niYfmj4/ov7BcIj5cbjxpbWcgc3JjPVwiaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNTljMGU3NmY2ODQwNTJkZjUyNDc2MWVlOGY0ZjY5NDIucG5nXCIgYWx0PVwi5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXCI+PC9wPlxuPHA+6L+Z5bCx5piv5L6d6LWW5a+56LGhIOWSjCDkuIDkuKogd2F0Y2hlciDlr7nosaHmiYDmtonlj4rliLDnmoTlpITnkIbkuobjgIJcblZ1ZSDkuK3lj4jmmK/mgI7kuYjmiorkuIDkuKrkuKrnmoTlsZ7mgKfvvIzov5vooYzmk43kvZzlj5jmiJDkvp3otZbnmoTlkaLvvJ9cbuWvueW6lOWug+eahOa6kOeggeWwseaYryBkZWZpbmVSZWFjdGl2ZSDmlrnms5XjgILmupDnoIHlpoLlm77vvJo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+ZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlIChvYmosIGtleSwgdmFsLCBjdXN0b21TZXR0ZXIsIHNoYWxsb3cpIHtcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXG4gIFxuICAvLyDov47lkIjpooTlrprkuYnnmoRnZXR0ZXIgLyBzZXR0ZXJcbiAgY29uc3QgZ2V0dGVyID0gcHJvcGVydHkgJmFtcDsmYW1wOyBwcm9wZXJ0eS5nZXRcbiAgY29uc3Qgc2V0dGVyID0gcHJvcGVydHkgJmFtcDsmYW1wOyBwcm9wZXJ0eS5zZXRcbiAgaWYgKCghZ2V0dGVyIHx8IHNldHRlcikgJmFtcDsmYW1wOyBhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgdmFsID0gb2JqW2tleV1cbiAgfVxuICBcbiAgbGV0IGNoaWxkT2IgPSAhc2hhbGxvdyAmYW1wOyZhbXA7IG9ic2VydmUodmFsKVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKERlcC50YXJnZXQpIHtcbiAgICAgICAgZGVwLmRlcGVuZCgpXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKClcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICZhbXA7JmFtcDsgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBuZXdWYWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWxcbiAgICAgIH1cbiAgICAgIGNoaWxkT2IgPSAhc2hhbGxvdyAmYW1wOyZhbXA7IG9ic2VydmUobmV3VmFsKVxuICAgICAgZGVwLm5vdGlmeSgpXG4gICAgfVxuICB9KVxufVxuPC9jb2RlPjwvcHJlPlxuPHA+6L+Z6YeM5bCx5piv55So55qEIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSDmlrnms5XvvIzlroPlj6/ku6Xph43lhpnlr7nosaHnmoTlsZ7mgKfnmoQgZ2V0IOWSjCBzZXQg5pa55rOV44CCIOW9k+i/meS4quWxnuaAp+WcqCBWdWUg5Lit6KKr6I635Y+W55qE5pe25YCZ77yM5bCx5byA5aeL5pS26ZuG5L6d6LWW77yM5oqK5a6D5pS26ZuG5Zyo6L+Z5LiqIHZtIOeahCB3YXRjaGVyIOS4reW/g++8jOW5tuS4lOiuqeWug+iuoumYhei/meS4qiB3YXRjaGVyIOOAguW9k+i/meS4quWxnuaAp+iiq+mHjeaWsOiuvue9ruaXtu+8jCDlsLHpgJrnn6XlroPmiYDorqLpmIXnmoTlr7nosaHljrvmm7TmlrDjgII8L3A+XG48cD7lpKfoh7TopoHnn6XpgZPnmoTlsLHmmK/ov5nkupvkuobjgILlhbPkuo7lhbfkvZPmmK/mgI7kuYjlrp7njrDmioogdGVtcGxhdGUgIOe8luivkeaIkCBhc3Qg5qCR77yMIOWFt+S9k+aYr+aAjuS5iOaKiuS6i+S7tue7keWumuS4iuWOu+eahO+8jOS9oOWPr+S7peWwveaDheeahOWOu+eMnOaDs+WSjOaOqOa1i++8jOaIluiAheWOu+eci+eci+WFt+S9k+eahOWunueOsOaWueW8j+OAguS9huaYryBWVUUg5qGG5p625oC75L2T5p2l6K+05omA5YGa55qE5bCx5piv6L+Z5Lqb5LqL5oOF5LqGLCDlpoLmnpzmnInop4nlvpfmnKzmloflhpnnmoTkuI3muIXmpZrnmoTlnLDmlrnlj6/ku6Xmj5Dlk4ggPSA9PC9wPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi92dWUubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9Mzg0YzEyOGZcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4zX3Z1ZUAzLjUuM190eXBlc2NyaXB0QDUuNS40X193ZWJwYWNrQDUuOTQuMF93ZWJwYWNrLV9mdXFrd2dncGxoZXkzb2l2dHdlMnN0ZG82ZS9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[172],{172:function(e,n,t){t.r(n),t.d(n,{default:function(){return p}});var o=t(762);const i={class:"component-vue"},r={};var p=(0,t(314).A)(r,[["render",function(e,n){return(0,o.uX)(),(0,o.CE)("div",i,n[0]||(n[0]=[(0,o.Fv)('

vue 是一个 js 框架,它实现了自己的模板,通过 .vue 文件可以经过编译成一个数据改变驱动视图改变的 js代码。 那么这其中又是经历了什么样的步骤呢?


一个 vue 对象是通过 new Vue({options}) 来得到的,也就是构造函数了。我们来看这个函数

function Vue (options) {\n  if (process.env.NODE_ENV !== 'production' &&\n    !(this instanceof Vue)\n  ) {\n    warn('Vue is a constructor and should be called with the `new` keyword')\n  }\n  this._init(options)\n}\n\n// 这里是一系列对这个函数进行的继承\ninitMixin(Vue)\nstateMixin(Vue)\neventsMixin(Vue)\nlifecycleMixin(Vue)\nrenderMixin(Vue)\n\nexport default Vue\n

可以看到这个 Vue 构造函数,它经历了 5 个系列的mixin,并在新创建时会运行 _init(options) 方法。 那么我们来看看, 这五个 mixin 分别做了啥。

第一个 initMixin

它只做了一件事, 定义了 _init 方法,那么你就知道创造一个Vue 实例,它执行的 _init 方法就是上面这个方法了。

Vue.prototype._init = function (options?: Object) {\n....\n}\n
第二个 stateMixin
  Object.defineProperty(Vue.prototype, '$data', dataDef)  // 能够返回 data\n  Object.defineProperty(Vue.prototype, '$props', propsDef) // 能够返回 props\n  Vue.prototype.$set = set // 就是我们用的 this.$set(this.people, 'name', ‘clever')方法, 下同。\n  Vue.prototype.$delete = del\n  Vue.prototype.$watch = function (\n   ....\n  }\n
第三个 eventsMixin
Vue.prototype.$on = function (eventname, fn) {\n....\n}\nVue.prototype._$once = function (eventname, fn) {\n // 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。\n}\nVue.prototype._off = function (event, fn) {\n// 移除自定义事件监听器。\n}\nVue.prototype.$emit = function (event) {\n// 触发一个事件\n}\n
第四个 lifecycleMixin在这里插入图片描述
第五个 renderMixin在这里插入图片描述

好, 这个 Vue 继承了这些方法,它已经是一个完整的 Vue 了,而新创建的时候要执行 _init 方法了, 现在我们来看看这个方法里面做了写啥

关于 initLifecycle\n  vm.$parent = parent\n  vm.$root = parent ? parent.$root : vm\n  vm.$children = []\n  vm.$refs = {}\n  vm._watcher = null\n  vm._inactive = null\n  vm._directInactive = false\n  vm._isMounted = false\n  vm._isDestroyed = false\n  vm._isBeingDestroyed = false\n
  vm._events = Object.create(null)\n  vm._hasHookEvent = false\n  // init parent attached events\n  const listeners = vm.$options._parentListeners\n  if (listeners) {\n    updateComponentListeners(vm, listeners)\n  }\n  就是判断父级是否有事件监听,然后给父级进行监听事件\n
   vm._vnode = null  // the root of the child tree\n  vm._staticTrees = null  // v-once cached trees\n  const options = vm.$options\n  const parentVnode = vm.$vnode = options._parentVnode // the placeholder node in parent tree\n  const renderContext = parentVnode && parentVnode.context\n  vm.$slots = resolveSlots(options._renderChildren, renderContext)\n  vm.$scopedSlots = emptyObject\n  // 实例绑定 createElement 方法,以便可以正常在内部渲染\n // 参数顺序   tag, data, children, normalizationType, alwaysNormalize\n  // 内部使用从模板编译而来的渲染函数\n  \n  vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)\n  // 公共版本必须是 normalization 的渲染函数\n  vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)\n\n  // $attrs & $listeners 应该被监听热更新\n  const parentData = parentVnode && parentVnode.data\n\n  if (process.env.NODE_ENV !== 'production') {\n    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, () => {\n      !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm)\n    }, true)\n    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, () => {\n      !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm)\n    }, true)\n  } else {\n    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true)\n    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true)\n  }\n
  const result = resolveInject(vm.$options.inject, vm)\n  if (result) {\n    toggleObserving(false)\n    Object.keys(result).forEach(key => {\n      if (process.env.NODE_ENV !== 'production') {\n        defineReactive(vm, key, result[key], () => {\n          warn(\n          \t`避免直接改变注入的值,因为将会重新渲染所提供这个值的组件, \n          \t改变的值是: "${key}",\n            vm\n          )\n        })\n      } else {\n        defineReactive(vm, key, result[key])\n      }\n    })\n    toggleObserving(true)\n
  vm._watchers = []\n  const opts = vm.$options\n  if (opts.props) initProps(vm, opts.props) // 赋值 props 数据并收集依赖\n  if (opts.methods) initMethods(vm, opts.methods) // 赋值 vue 的各个 method\n  if (opts.data) {\n    initData(vm) // 收集依赖\n  } else {\n    observe(vm._data = {}, true /* asRootData */)\n  }\n  if (opts.computed) initComputed(vm, opts.computed) // 收集依赖\n  if (opts.watch && opts.watch !== nativeWatch) {\n    initWatch(vm, opts.watch) // 初始化你写的监听对象\n  }\n \n
  const provide = vm.$options.provide\n  if (provide) {\n    vm._provided = typeof provide === 'function'\n      ? provide.call(vm)\n      : provide\n  }\n

这就是 _init 中各个函数所做的了。 我们可以看到总结过来就是 1.初始化了生命状态 2.进行事件上的监听 3.渲染视图的初始化;收集所用到的父组件的数据或事件 4.调用你写的 beforeCreate 方法 5.initState, 处理了 vue 中的各种数据(props/data/methods…), 也在这一步针对这些数据进行了依赖收集,数据更新绑定 6.初始化了 provide 的值, 也可以看出它没有被收集依赖, 是不会影响视图改变的 7.调用了你写的 created 方法了。

以上,就是你 let app = new Vue() 这一步所发生的所有事情了。

那通过平时的使用我们知道,我们是通过调用 $mounted 能把它挂载上页面。所以接下来我们就可以来看看 vue 自己的 $mount 都做了些什么?

答: 就是把 template 或直接写的 render 函数,进行指令、事件等vue 中的语法解析编译成一个 AST 树。通过这个树,通过之前 initRender 中的 $createElement 方法可以生成虚拟DOM, 然后添加到页面中出,不就渲染出来了么。 如果大家使用过 Vue 的 $createElement 方法,相信就知道这个 ast 是怎么一个结构了,拿示例的来说

createElement(\n  'div',\n  [\n    '先写一些文字',\n    createElement('h1', '一则头条'),\n    createElement(MyComponent, {\n      props: {\n        someProp: 'foobar'\n      }\n    })\n  ]\n)\n

说完了整个过程,现在还比较疑惑的就是它的收集依赖,然后数据改变引起的视图改变到底怎么做呢?

也就是说我们要实现一个模式,vm 可能 data 对象中的一个值,比如 name 改变了,然后就调用重新渲染的函数,这里为了性能,是生成了一个虚拟 Dom, 然后比较哪里改变了进行相应的替换。 把这个模式抽象出来,就是我们需要一个

先说具体实现: 我们视图更新依赖到的值收集起来,这里把每一个依赖到的值称作 dep。每个依赖订阅与它有关的 vue 的 watcher 中心, 这里把 dep 所订阅的 watcher 叫做 sub。 那么 dep 被改变的时候,获取它订阅了那些 watcher, 通知他们进行 update 视图啦。

可以看我画的简图 在这里插入图片描述在这里插入图片描述

这就是依赖对象 和 一个 watcher 对象所涉及到的处理了。 Vue 中又是怎么把一个个的属性,进行操作变成依赖的呢? 对应它的源码就是 defineReactive 方法。源码如图:

export function defineReactive (obj, key, val, customSetter, shallow) {\n  const dep = new Dep()\n  \n  // 迎合预定义的getter / setter\n  const getter = property && property.get\n  const setter = property && property.set\n  if ((!getter || setter) && arguments.length === 2) {\n    val = obj[key]\n  }\n  \n  let childOb = !shallow && observe(val)\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter () {\n      const value = getter ? getter.call(obj) : val\n      if (Dep.target) {\n        dep.depend()\n        if (childOb) {\n          childOb.dep.depend()\n          if (Array.isArray(value)) {\n            dependArray(value)\n          }\n        }\n      }\n      return value\n    },\n    set: function reactiveSetter (newVal) {\n      const value = getter ? getter.call(obj) : val\n      if (newVal === value || (newVal !== newVal && value !== value)) {\n        return\n      }\n      if (setter) {\n        setter.call(obj, newVal)\n      } else {\n        val = newVal\n      }\n      childOb = !shallow && observe(newVal)\n      dep.notify()\n    }\n  })\n}\n

这里就是用的 Object.defineProperty 方法,它可以重写对象的属性的 get 和 set 方法。 当这个属性在 Vue 中被获取的时候,就开始收集依赖,把它收集在这个 vm 的 watcher 中心,并且让它订阅这个 watcher 。当这个属性被重新设置时, 就通知它所订阅的对象去更新。

大致要知道的就是这些了。关于具体是怎么实现把 template 编译成 ast 树, 具体是怎么把事件绑定上去的,你可以尽情的去猜想和推测,或者去看看具体的实现方式。但是 VUE 框架总体来说所做的就是这些事情了, 如果有觉得本文写的不清楚的地方可以提哈 = =

',43)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0saUJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXlRSixNQXpRSUMsRUF5UUpDLEVBQUEsS0FBQUEsRUFBQSxLQXpRTkMsRUFBQUEsRUFBQUEsSUFBQSxpbFIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vdnVlLm1kIiwid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi92dWUubWQ/NWIzOCJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+PGRpdiBjbGFzcz1cImNvbXBvbmVudC12dWVcIj48cD52dWUg5piv5LiA5LiqIGpzIOahhuaetu+8jOWug+WunueOsOS6huiHquW3seeahOaooeadv++8jOmAmui/hyAudnVlIOaWh+S7tuWPr+S7pee7j+i/h+e8luivkeaIkOS4gOS4quaVsOaNruaUueWPmOmpseWKqOinhuWbvuaUueWPmOeahCBqc+S7o+eggeOAglxu6YKj5LmI6L+Z5YW25Lit5Y+I5piv57uP5Y6G5LqG5LuA5LmI5qC355qE5q2l6aqk5ZGi77yfPC9wPlxuPGhyPlxuPHA+5LiA5LiqIHZ1ZSDlr7nosaHmmK/pgJrov4cgbmV3IFZ1ZSh7b3B0aW9uc30pIOadpeW+l+WIsOeahO+8jOS5n+WwseaYr+aehOmAoOWHveaVsOS6huOAguaIkeS7rOadpeeci+i/meS4quWHveaVsDwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5mdW5jdGlvbiBWdWUgKG9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJmFtcDsmYW1wO1xuICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSlcbiAgKSB7XG4gICAgd2FybignVnVlIGlzIGEgY29uc3RydWN0b3IgYW5kIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZCcpXG4gIH1cbiAgdGhpcy5faW5pdChvcHRpb25zKVxufVxuXG4vLyDov5nph4zmmK/kuIDns7vliJflr7nov5nkuKrlh73mlbDov5vooYznmoTnu6fmib9cbmluaXRNaXhpbihWdWUpXG5zdGF0ZU1peGluKFZ1ZSlcbmV2ZW50c01peGluKFZ1ZSlcbmxpZmVjeWNsZU1peGluKFZ1ZSlcbnJlbmRlck1peGluKFZ1ZSlcblxuZXhwb3J0IGRlZmF1bHQgVnVlXG48L2NvZGU+PC9wcmU+XG48cD7lj6/ku6XnnIvliLDov5nkuKogVnVlIOaehOmAoOWHveaVsO+8jOWug+e7j+WOhuS6hiA1IOS4quezu+WIl+eahG1peGlu77yM5bm25Zyo5paw5Yib5bu65pe25Lya6L+Q6KGMIF9pbml0KG9wdGlvbnMpIOaWueazleOAglxu6YKj5LmI5oiR5Lus5p2l55yL55yLLCDov5nkupTkuKogbWl4aW4g5YiG5Yir5YGa5LqG5ZWl44CCPC9wPlxuPGg1PuesrOS4gOS4qiAgaW5pdE1peGluPC9oNT5cbjxwPuWug+WPquWBmuS6huS4gOS7tuS6i++8jCDlrprkuYnkuoYgX2luaXQg5pa55rOV77yM6YKj5LmI5L2g5bCx55+l6YGT5Yib6YCg5LiA5LiqVnVlIOWunuS+i++8jOWug+aJp+ihjOeahCBfaW5pdCDmlrnms5XlsLHmmK/kuIrpnaLov5nkuKrmlrnms5XkuobjgII8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+VnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zPzogT2JqZWN0KSB7XG4uLi4uXG59XG48L2NvZGU+PC9wcmU+XG48aDU+56ys5LqM5LiqIHN0YXRlTWl4aW48L2g1PlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpICAvLyDog73lpJ/ov5Tlm54gZGF0YVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKSAvLyDog73lpJ/ov5Tlm54gcHJvcHNcbiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0IC8vIOWwseaYr+aIkeS7rOeUqOeahCB0aGlzLiRzZXQodGhpcy5wZW9wbGUsICduYW1lJywg4oCYY2xldmVyJynmlrnms5UsIOS4i+WQjOOAglxuICBWdWUucHJvdG90eXBlLiRkZWxldGUgPSBkZWxcbiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoXG4gICAuLi4uXG4gIH1cbjwvY29kZT48L3ByZT5cbjxoNT7nrKzkuInkuKogZXZlbnRzTWl4aW48L2g1PlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPlZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcbi4uLi5cbn1cblZ1ZS5wcm90b3R5cGUuXyRvbmNlID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcbiAvLyDnm5HlkKzkuIDkuKroh6rlrprkuYnkuovku7bvvIzkvYbmmK/lj6rop6blj5HkuIDmrKHvvIzlnKjnrKzkuIDmrKHop6blj5HkuYvlkI7np7vpmaTnm5HlkKzlmajjgIJcbn1cblZ1ZS5wcm90b3R5cGUuX29mZiA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcbi8vIOenu+mZpOiHquWumuS5ieS6i+S7tuebkeWQrOWZqOOAglxufVxuVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xuLy8g6Kem5Y+R5LiA5Liq5LqL5Lu2XG59XG48L2NvZGU+PC9wcmU+XG48aDU+56ys5Zub5LiqIGxpZmVjeWNsZU1peGluPGltZyBzcmM9XCJodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS8wMjI3YzhjMTUyODVmYmQxNzk1NzNlN2NkOGNiNDcxOC5wbmdcIiBhbHQ9XCLlnKjov5nph4zmj5LlhaXlm77niYfmj4/ov7BcIj48L2g1PlxuPGg1PuesrOS6lOS4qiByZW5kZXJNaXhpbjxpbWcgc3JjPVwiaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNzE1Mzk5YTlhYzM1Y2VmN2MzYWNhMmQzMjQyY2E1YTMucG5nXCIgYWx0PVwi5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXCI+PC9oNT5cbjxocj5cbjxwPuWlve+8jCDov5nkuKogVnVlIOe7p+aJv+S6hui/meS6m+aWueazle+8jOWug+W3sue7j+aYr+S4gOS4quWujOaVtOeahCBWdWUg5LqG77yM6ICM5paw5Yib5bu655qE5pe25YCZ6KaB5omn6KGMIF9pbml0IOaWueazleS6hiwg546w5Zyo5oiR5Lus5p2l55yL55yL6L+Z5Liq5pa55rOV6YeM6Z2i5YGa5LqG5YaZ5ZWlPC9wPlxuPHVsPlxuPGxpPnZtLl91aWQgPSB1aWQrKyDliJvlu7ogdWlkPC9saT5cbjxsaT7lkIjlubYgb3B0aW9uczwvbGk+XG48bGk+aW5pdExpZmVjeWNsZVxuaW5pdEV2ZW50cyh2bSlcbmluaXRSZW5kZXIodm0pXG5jYWxsSG9vayh2bSwg4oCYYmVmb3JlQ3JlYXRl4oCZKVxuaW5pdEluamVjdGlvbnModm0pIC8vIHJlc29sdmUgaW5qZWN0aW9ucyBiZWZvcmUgZGF0YS9wcm9wc1xuaW5pdFN0YXRlKHZtKVxuaW5pdFByb3ZpZGUodm0pIC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzXG5jYWxsSG9vayh2bSwg4oCYY3JlYXRlZOKAmSk8L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT7lhbPkuo4gaW5pdExpZmVjeWNsZVxuICB2bS4kcGFyZW50ID0gcGFyZW50XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm1cbiAgdm0uJGNoaWxkcmVuID0gW11cbiAgdm0uJHJlZnMgPSB7fVxuICB2bS5fd2F0Y2hlciA9IG51bGxcbiAgdm0uX2luYWN0aXZlID0gbnVsbFxuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZVxuICB2bS5faXNNb3VudGVkID0gZmFsc2VcbiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2VcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZVxuPC9jb2RlPjwvcHJlPlxuPHVsPlxuPGxpPmluaXRFdmVudHM8L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZVxuICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHNcbiAgY29uc3QgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyc1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpXG4gIH1cbiAg5bCx5piv5Yik5pat54i257qn5piv5ZCm5pyJ5LqL5Lu255uR5ZCs77yM54S25ZCO57uZ54i257qn6L+b6KGM55uR5ZCs5LqL5Lu2XG48L2NvZGU+PC9wcmU+XG48dWw+XG48bGk+aW5pdFJlbmRlcjwvbGk+XG48L3VsPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPiAgIHZtLl92bm9kZSA9IG51bGwgIC8vIHRoZSByb290IG9mIHRoZSBjaGlsZCB0cmVlXG4gIHZtLl9zdGF0aWNUcmVlcyA9IG51bGwgIC8vIHYtb25jZSBjYWNoZWQgdHJlZXNcbiAgY29uc3Qgb3B0aW9ucyA9IHZtLiRvcHRpb25zXG4gIGNvbnN0IHBhcmVudFZub2RlID0gdm0uJHZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGUgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgY29uc3QgcmVuZGVyQ29udGV4dCA9IHBhcmVudFZub2RlICZhbXA7JmFtcDsgcGFyZW50Vm5vZGUuY29udGV4dFxuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpXG4gIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0XG4gIC8vIOWunuS+i+e7keWumiBjcmVhdGVFbGVtZW50IOaWueazle+8jOS7peS+v+WPr+S7peato+W4uOWcqOWGhemDqOa4suafk1xuIC8vIOWPguaVsOmhuuW6jyAgIHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8g5YaF6YOo5L2/55So5LuO5qih5p2/57yW6K+R6ICM5p2l55qE5riy5p+T5Ye95pWwXG4gIFxuICB2bS5fYyA9IChhLCBiLCBjLCBkKSA9Jmd0OyBjcmVhdGVFbGVtZW50KHZtLCBhLCBiLCBjLCBkLCBmYWxzZSlcbiAgLy8g5YWs5YWx54mI5pys5b+F6aG75pivIG5vcm1hbGl6YXRpb24g55qE5riy5p+T5Ye95pWwXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gKGEsIGIsIGMsIGQpID0mZ3Q7IGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpXG5cbiAgLy8gJGF0dHJzICZhbXA7ICRsaXN0ZW5lcnMg5bqU6K+l6KKr55uR5ZCs54Ot5pu05pawXG4gIGNvbnN0IHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmYW1wOyZhbXA7IHBhcmVudFZub2RlLmRhdGFcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmYW1wOyZhbXA7IHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsICgpID0mZ3Q7IHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJmFtcDsmYW1wOyB3YXJuKGAkYXR0cnMgaXMgcmVhZG9ubHkuYCwgdm0pXG4gICAgfSwgdHJ1ZSlcbiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsICgpID0mZ3Q7IHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJmFtcDsmYW1wOyB3YXJuKGAkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LmAsIHZtKVxuICAgIH0sIHRydWUpXG4gIH0gZWxzZSB7XG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICZhbXA7JmFtcDsgcGFyZW50RGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdCwgbnVsbCwgdHJ1ZSlcbiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpXG4gIH1cbjwvY29kZT48L3ByZT5cbjx1bD5cbjxsaT5cbjxwPmNhbGxIb29rKHZtLCDigJhiZWZvcmVDcmVhdGXigJkpIOaJp+ihjCBiZWZvcmVDcmVhdGUg5Ye95pWwPC9wPlxuPC9saT5cbjxsaT5cbjxwPmluaXRJbmplY3Rpb25zKHZtKSDmlLbpm4bms6jlhaXnmoTkvp3otZY8L3A+XG48L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT4gIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmplY3Qodm0uJG9wdGlvbnMuaW5qZWN0LCB2bSlcbiAgaWYgKHJlc3VsdCkge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSlcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goa2V5ID0mZ3Q7IHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCAoKSA9Jmd0OyB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICBcdGDpgb/lhY3nm7TmjqXmlLnlj5jms6jlhaXnmoTlgLzvvIzlm6DkuLrlsIbkvJrph43mlrDmuLLmn5PmiYDmj5Dkvpvov5nkuKrlgLznmoTnu4Tku7YsIFxuICAgICAgICAgIFx05pS55Y+Y55qE5YC85pivOiBcIiR7a2V5fVwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZpbmVSZWFjdGl2ZSh2bSwga2V5LCByZXN1bHRba2V5XSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKVxuPC9jb2RlPjwvcHJlPlxuPHVsPlxuPGxpPmluaXRTdGF0ZSDnm5HlkKzlgLzmlLbpm4bkvp3otZY8L2xpPlxuPC91bD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT4gIHZtLl93YXRjaGVycyA9IFtdXG4gIGNvbnN0IG9wdHMgPSB2bS4kb3B0aW9uc1xuICBpZiAob3B0cy5wcm9wcykgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKSAvLyDotYvlgLwgcHJvcHMg5pWw5o2u5bm25pS26ZuG5L6d6LWWXG4gIGlmIChvcHRzLm1ldGhvZHMpIGluaXRNZXRob2RzKHZtLCBvcHRzLm1ldGhvZHMpIC8vIOi1i+WAvCB2dWUg55qE5ZCE5LiqIG1ldGhvZFxuICBpZiAob3B0cy5kYXRhKSB7XG4gICAgaW5pdERhdGEodm0pIC8vIOaUtumbhuS+nei1llxuICB9IGVsc2Uge1xuICAgIG9ic2VydmUodm0uX2RhdGEgPSB7fSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKVxuICB9XG4gIGlmIChvcHRzLmNvbXB1dGVkKSBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpIC8vIOaUtumbhuS+nei1llxuICBpZiAob3B0cy53YXRjaCAmYW1wOyZhbXA7IG9wdHMud2F0Y2ggIT09IG5hdGl2ZVdhdGNoKSB7XG4gICAgaW5pdFdhdGNoKHZtLCBvcHRzLndhdGNoKSAvLyDliJ3lp4vljJbkvaDlhpnnmoTnm5HlkKzlr7nosaFcbiAgfVxuIFxuPC9jb2RlPjwvcHJlPlxuPHVsPlxuPGxpPmluaXRQcm92aWRlPC9saT5cbjwvdWw+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+ICBjb25zdCBwcm92aWRlID0gdm0uJG9wdGlvbnMucHJvdmlkZVxuICBpZiAocHJvdmlkZSkge1xuICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHByb3ZpZGUuY2FsbCh2bSlcbiAgICAgIDogcHJvdmlkZVxuICB9XG48L2NvZGU+PC9wcmU+XG48dWw+XG48bGk+Y2FsbEhvb2sodm0sIOKAmGNyZWF0ZWTigJkpIOaJp+ihjCBjcmVhdGVkIOWHveaVsDwvbGk+XG48L3VsPlxuPGJsb2NrcXVvdGU+XG48cD7ov5nlsLHmmK8gX2luaXQg5Lit5ZCE5Liq5Ye95pWw5omA5YGa55qE5LqG44CCIOaIkeS7rOWPr+S7peeci+WIsOaAu+e7k+i/h+adpeWwseaYr1xuMS7liJ3lp4vljJbkuobnlJ/lkb3nirbmgIFcbjIu6L+b6KGM5LqL5Lu25LiK55qE55uR5ZCsXG4zLua4suafk+inhuWbvueahOWIneWni+WMlu+8m+aUtumbhuaJgOeUqOWIsOeahOeItue7hOS7tueahOaVsOaNruaIluS6i+S7tlxuNC7osIPnlKjkvaDlhpnnmoQgYmVmb3JlQ3JlYXRlIOaWueazlVxuNS5pbml0U3RhdGUsIOWkhOeQhuS6hiB2dWUg5Lit55qE5ZCE56eN5pWw5o2uKHByb3BzL2RhdGEvbWV0aG9kc+KApiksIOS5n+WcqOi/meS4gOatpemSiOWvuei/meS6m+aVsOaNrui/m+ihjOS6huS+nei1luaUtumbhu+8jOaVsOaNruabtOaWsOe7keWumlxuNi7liJ3lp4vljJbkuoYgcHJvdmlkZSDnmoTlgLzvvIwg5Lmf5Y+v5Lul55yL5Ye65a6D5rKh5pyJ6KKr5pS26ZuG5L6d6LWW77yMIOaYr+S4jeS8muW9seWTjeinhuWbvuaUueWPmOeahFxuNy7osIPnlKjkuobkvaDlhpnnmoQgY3JlYXRlZCDmlrnms5XkuobjgII8L3A+XG48L2Jsb2NrcXVvdGU+XG48cD7ku6XkuIrvvIzlsLHmmK/kvaAgbGV0IGFwcCA9IG5ldyBWdWUoKSDov5nkuIDmraXmiYDlj5HnlJ/nmoTmiYDmnInkuovmg4XkuobjgII8L3A+XG48cD7pgqPpgJrov4flubPml7bnmoTkvb/nlKjmiJHku6znn6XpgZPvvIzmiJHku6zmmK/pgJrov4fosIPnlKggJG1vdW50ZWQg6IO95oqK5a6D5oyC6L295LiK6aG16Z2i44CC5omA5Lul5o6l5LiL5p2l5oiR5Lus5bCx5Y+v5Lul5p2l55yL55yLIHZ1ZSDoh6rlt7HnmoQgJG1vdW50IOmDveWBmuS6huS6m+S7gOS5iD88L3A+XG48cD7nrZQ6IOWwseaYr+aKiiB0ZW1wbGF0ZSDmiJbnm7TmjqXlhpnnmoQgcmVuZGVyIOWHveaVsO+8jOi/m+ihjOaMh+S7pOOAgeS6i+S7tuetiXZ1ZSDkuK3nmoTor63ms5Xop6PmnpDnvJbor5HmiJDkuIDkuKogQVNUIOagkeOAgumAmui/h+i/meS4quagke+8jOmAmui/h+S5i+WJjSBpbml0UmVuZGVyIOS4reeahCAkY3JlYXRlRWxlbWVudCDmlrnms5Xlj6/ku6XnlJ/miJDomZrmi59ET00sIOeEtuWQjua3u+WKoOWIsOmhtemdouS4reWHuu+8jOS4jeWwsea4suafk+WHuuadpeS6huS5iOOAgiDlpoLmnpzlpKflrrbkvb/nlKjov4cgVnVlIOeahCAkY3JlYXRlRWxlbWVudCDmlrnms5XvvIznm7jkv6HlsLHnn6XpgZPov5nkuKogYXN0IOaYr+aAjuS5iOS4gOS4que7k+aehOS6hu+8jOaLv+ekuuS+i+eahOadpeivtDwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5jcmVhdGVFbGVtZW50KFxuICAnZGl2JyxcbiAgW1xuICAgICflhYjlhpnkuIDkupvmloflrZcnLFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2gxJywgJ+S4gOWImeWktOadoScpLFxuICAgIGNyZWF0ZUVsZW1lbnQoTXlDb21wb25lbnQsIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHNvbWVQcm9wOiAnZm9vYmFyJ1xuICAgICAgfVxuICAgIH0pXG4gIF1cbilcbjwvY29kZT48L3ByZT5cbjxocj5cbjxwPuivtOWujOS6huaVtOS4qui/h+eoi++8jOeOsOWcqOi/mOavlOi+g+eWkeaDkeeahOWwseaYr+Wug+eahOaUtumbhuS+nei1lu+8jOeEtuWQjuaVsOaNruaUueWPmOW8lei1t+eahOinhuWbvuaUueWPmOWIsOW6leaAjuS5iOWBmuWRou+8nzwvcD5cbjxwPuS5n+WwseaYr+ivtOaIkeS7rOimgeWunueOsOS4gOS4quaooeW8j++8jHZtIOWPr+iDvSBkYXRhIOWvueixoeS4reeahOS4gOS4quWAvO+8jOavlOWmgiBuYW1lIOaUueWPmOS6hu+8jOeEtuWQjuWwseiwg+eUqOmHjeaWsOa4suafk+eahOWHveaVsO+8jOi/memHjOS4uuS6huaAp+iDve+8jOaYr+eUn+aIkOS6huS4gOS4quiZmuaLnyBEb20sIOeEtuWQjuavlOi+g+WTqumHjOaUueWPmOS6hui/m+ihjOebuOW6lOeahOabv+aNouOAglxu5oqK6L+Z5Liq5qih5byP5oq96LGh5Ye65p2l77yM5bCx5piv5oiR5Lus6ZyA6KaB5LiA5LiqPC9wPlxuPHA+5YWI6K+05YW35L2T5a6e546w77yaIOaIkeS7rOinhuWbvuabtOaWsOS+nei1luWIsOeahOWAvOaUtumbhui1t+adpe+8jOi/memHjOaKiuavj+S4gOS4quS+nei1luWIsOeahOWAvOensOS9nCBkZXDjgILmr4/kuKrkvp3otZborqLpmIXkuI7lroPmnInlhbPnmoQgdnVlIOeahCB3YXRjaGVyIOS4reW/g++8jCDov5nph4zmioogZGVwIOaJgOiuoumYheeahCB3YXRjaGVyIOWPq+WBmiBzdWLjgIIg6YKj5LmIIGRlcCDooqvmlLnlj5jnmoTml7blgJnvvIzojrflj5blroPorqLpmIXkuobpgqPkupsgd2F0Y2hlcu+8jCDpgJrnn6Xku5bku6zov5vooYwgdXBkYXRlIOinhuWbvuWVpuOAgjwvcD5cbjxwPuWPr+S7peeci+aIkeeUu+eahOeugOWbvlxuPGltZyBzcmM9XCJodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS80MTdjMjMwODhjYjAyMjRjNmE0NDY0NjUxNDUyYzYwNC5wbmdcIiBhbHQ9XCLlnKjov5nph4zmj5LlhaXlm77niYfmj4/ov7BcIj5cbjxpbWcgc3JjPVwiaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNTljMGU3NmY2ODQwNTJkZjUyNDc2MWVlOGY0ZjY5NDIucG5nXCIgYWx0PVwi5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXCI+PC9wPlxuPHA+6L+Z5bCx5piv5L6d6LWW5a+56LGhIOWSjCDkuIDkuKogd2F0Y2hlciDlr7nosaHmiYDmtonlj4rliLDnmoTlpITnkIbkuobjgIJcblZ1ZSDkuK3lj4jmmK/mgI7kuYjmiorkuIDkuKrkuKrnmoTlsZ7mgKfvvIzov5vooYzmk43kvZzlj5jmiJDkvp3otZbnmoTlkaLvvJ9cbuWvueW6lOWug+eahOa6kOeggeWwseaYryBkZWZpbmVSZWFjdGl2ZSDmlrnms5XjgILmupDnoIHlpoLlm77vvJo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+ZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlIChvYmosIGtleSwgdmFsLCBjdXN0b21TZXR0ZXIsIHNoYWxsb3cpIHtcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXG4gIFxuICAvLyDov47lkIjpooTlrprkuYnnmoRnZXR0ZXIgLyBzZXR0ZXJcbiAgY29uc3QgZ2V0dGVyID0gcHJvcGVydHkgJmFtcDsmYW1wOyBwcm9wZXJ0eS5nZXRcbiAgY29uc3Qgc2V0dGVyID0gcHJvcGVydHkgJmFtcDsmYW1wOyBwcm9wZXJ0eS5zZXRcbiAgaWYgKCghZ2V0dGVyIHx8IHNldHRlcikgJmFtcDsmYW1wOyBhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgdmFsID0gb2JqW2tleV1cbiAgfVxuICBcbiAgbGV0IGNoaWxkT2IgPSAhc2hhbGxvdyAmYW1wOyZhbXA7IG9ic2VydmUodmFsKVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKERlcC50YXJnZXQpIHtcbiAgICAgICAgZGVwLmRlcGVuZCgpXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKClcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICZhbXA7JmFtcDsgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBuZXdWYWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWxcbiAgICAgIH1cbiAgICAgIGNoaWxkT2IgPSAhc2hhbGxvdyAmYW1wOyZhbXA7IG9ic2VydmUobmV3VmFsKVxuICAgICAgZGVwLm5vdGlmeSgpXG4gICAgfVxuICB9KVxufVxuPC9jb2RlPjwvcHJlPlxuPHA+6L+Z6YeM5bCx5piv55So55qEIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSDmlrnms5XvvIzlroPlj6/ku6Xph43lhpnlr7nosaHnmoTlsZ7mgKfnmoQgZ2V0IOWSjCBzZXQg5pa55rOV44CCIOW9k+i/meS4quWxnuaAp+WcqCBWdWUg5Lit6KKr6I635Y+W55qE5pe25YCZ77yM5bCx5byA5aeL5pS26ZuG5L6d6LWW77yM5oqK5a6D5pS26ZuG5Zyo6L+Z5LiqIHZtIOeahCB3YXRjaGVyIOS4reW/g++8jOW5tuS4lOiuqeWug+iuoumYhei/meS4qiB3YXRjaGVyIOOAguW9k+i/meS4quWxnuaAp+iiq+mHjeaWsOiuvue9ruaXtu+8jCDlsLHpgJrnn6XlroPmiYDorqLpmIXnmoTlr7nosaHljrvmm7TmlrDjgII8L3A+XG48cD7lpKfoh7TopoHnn6XpgZPnmoTlsLHmmK/ov5nkupvkuobjgILlhbPkuo7lhbfkvZPmmK/mgI7kuYjlrp7njrDmioogdGVtcGxhdGUgIOe8luivkeaIkCBhc3Qg5qCR77yMIOWFt+S9k+aYr+aAjuS5iOaKiuS6i+S7tue7keWumuS4iuWOu+eahO+8jOS9oOWPr+S7peWwveaDheeahOWOu+eMnOaDs+WSjOaOqOa1i++8jOaIluiAheWOu+eci+eci+WFt+S9k+eahOWunueOsOaWueW8j+OAguS9huaYryBWVUUg5qGG5p625oC75L2T5p2l6K+05omA5YGa55qE5bCx5piv6L+Z5Lqb5LqL5oOF5LqGLCDlpoLmnpzmnInop4nlvpfmnKzmloflhpnnmoTkuI3muIXmpZrnmoTlnLDmlrnlj6/ku6Xmj5Dlk4ggPSA9PC9wPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi92dWUubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9Mzg0YzEyOGZcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4xMl92dWVAMy41LjEyX3R5cGVzY3JpcHRANS42LjNfX3dlYnBhY2tANS45NS4wX3dlYnBhY2stY2xpQDUuMS40Xy9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/167.bundle.js b/212.bundle.js similarity index 57% rename from 167.bundle.js rename to 212.bundle.js index 4a559b0..f759393 100644 --- a/167.bundle.js +++ b/212.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[167],{167:(n,e,t)=>{t.r(e),t.d(e,{default:()=>o});const o="vue 是一个 js 框架,它实现了自己的模板,通过 .vue 文件可以经过编译成一个数据改变驱动视图改变的 js代码。\n那么这其中又是经历了什么样的步骤呢?\n\n----- \n一个 vue 对象是通过 new Vue({options}) 来得到的,也就是构造函数了。我们来看这个函数\n```\nfunction Vue (options) {\n if (process.env.NODE_ENV !== 'production' &&\n !(this instanceof Vue)\n ) {\n warn('Vue is a constructor and should be called with the `new` keyword')\n }\n this._init(options)\n}\n\n// 这里是一系列对这个函数进行的继承\ninitMixin(Vue)\nstateMixin(Vue)\neventsMixin(Vue)\nlifecycleMixin(Vue)\nrenderMixin(Vue)\n\nexport default Vue\n```\n可以看到这个 Vue 构造函数,它经历了 5 个系列的mixin,并在新创建时会运行 _init(options) 方法。\n那么我们来看看, 这五个 mixin 分别做了啥。\n\n ##### 第一个 initMixin\n 它只做了一件事, 定义了 _init 方法,那么你就知道创造一个Vue 实例,它执行的 _init 方法就是上面这个方法了。\n```\nVue.prototype._init = function (options?: Object) {\n....\n}\n```\n\n\n\n##### 第二个 stateMixin \n```\n Object.defineProperty(Vue.prototype, '$data', dataDef) // 能够返回 data\n Object.defineProperty(Vue.prototype, '$props', propsDef) // 能够返回 props\n Vue.prototype.$set = set // 就是我们用的 this.$set(this.people, 'name', ‘clever')方法, 下同。\n Vue.prototype.$delete = del\n Vue.prototype.$watch = function (\n ....\n }\n ```\n\n##### 第三个 eventsMixin\n```\nVue.prototype.$on = function (eventname, fn) {\n....\n}\nVue.prototype._$once = function (eventname, fn) {\n // 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。\n}\nVue.prototype._off = function (event, fn) {\n// 移除自定义事件监听器。\n}\nVue.prototype.$emit = function (event) {\n// 触发一个事件\n}\n```\n##### 第四个 lifecycleMixin![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0227c8c15285fbd179573e7cd8cb4718.png)\n##### 第五个 renderMixin![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/715399a9ac35cef7c3aca2d3242ca5a3.png)\n---\n\n好, 这个 Vue 继承了这些方法,它已经是一个完整的 Vue 了,而新创建的时候要执行 _init 方法了, 现在我们来看看这个方法里面做了写啥\n- vm._uid = uid++ 创建 uid\n- 合并 options\n- initLifecycle\n initEvents(vm)\n initRender(vm)\n callHook(vm, 'beforeCreate')\n initInjections(vm) // resolve injections before data/props\n initState(vm)\n initProvide(vm) // resolve provide after data/props\n callHook(vm, 'created')\n```\n关于 initLifecycle\n vm.$parent = parent\n vm.$root = parent ? parent.$root : vm\n vm.$children = []\n vm.$refs = {}\n vm._watcher = null\n vm._inactive = null\n vm._directInactive = false\n vm._isMounted = false\n vm._isDestroyed = false\n vm._isBeingDestroyed = false\n ```\n\n- initEvents\n```\n vm._events = Object.create(null)\n vm._hasHookEvent = false\n // init parent attached events\n const listeners = vm.$options._parentListeners\n if (listeners) {\n updateComponentListeners(vm, listeners)\n }\n 就是判断父级是否有事件监听,然后给父级进行监听事件\n ```\n- initRender\n```\n vm._vnode = null // the root of the child tree\n vm._staticTrees = null // v-once cached trees\n const options = vm.$options\n const parentVnode = vm.$vnode = options._parentVnode // the placeholder node in parent tree\n const renderContext = parentVnode && parentVnode.context\n vm.$slots = resolveSlots(options._renderChildren, renderContext)\n vm.$scopedSlots = emptyObject\n // 实例绑定 createElement 方法,以便可以正常在内部渲染\n // 参数顺序 tag, data, children, normalizationType, alwaysNormalize\n // 内部使用从模板编译而来的渲染函数\n \n vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)\n // 公共版本必须是 normalization 的渲染函数\n vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)\n\n // $attrs & $listeners 应该被监听热更新\n const parentData = parentVnode && parentVnode.data\n\n if (process.env.NODE_ENV !== 'production') {\n defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, () => {\n !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm)\n }, true)\n defineReactive(vm, '$listeners', options._parentListeners || emptyObject, () => {\n !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm)\n }, true)\n } else {\n defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true)\n defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true)\n }\n ```\n- callHook(vm, 'beforeCreate') 执行 beforeCreate 函数\n\n- initInjections(vm) 收集注入的依赖\n```\n const result = resolveInject(vm.$options.inject, vm)\n if (result) {\n toggleObserving(false)\n Object.keys(result).forEach(key => {\n if (process.env.NODE_ENV !== 'production') {\n defineReactive(vm, key, result[key], () => {\n warn(\n \t`避免直接改变注入的值,因为将会重新渲染所提供这个值的组件, \n \t改变的值是: \"${key}\",\n vm\n )\n })\n } else {\n defineReactive(vm, key, result[key])\n }\n })\n toggleObserving(true)\n```\n- initState 监听值收集依赖\n```\n vm._watchers = []\n const opts = vm.$options\n if (opts.props) initProps(vm, opts.props) // 赋值 props 数据并收集依赖\n if (opts.methods) initMethods(vm, opts.methods) // 赋值 vue 的各个 method\n if (opts.data) {\n initData(vm) // 收集依赖\n } else {\n observe(vm._data = {}, true /* asRootData */)\n }\n if (opts.computed) initComputed(vm, opts.computed) // 收集依赖\n if (opts.watch && opts.watch !== nativeWatch) {\n initWatch(vm, opts.watch) // 初始化你写的监听对象\n }\n \n```\n- initProvide\n```\n const provide = vm.$options.provide\n if (provide) {\n vm._provided = typeof provide === 'function'\n ? provide.call(vm)\n : provide\n }\n```\n- callHook(vm, 'created') 执行 created 函数\n\n>这就是 _init 中各个函数所做的了。 我们可以看到总结过来就是\n1.初始化了生命状态\n2.进行事件上的监听\n3.渲染视图的初始化;收集所用到的父组件的数据或事件\n4.调用你写的 beforeCreate 方法\n5.initState, 处理了 vue 中的各种数据(props/data/methods.....), 也在这一步针对这些数据进行了依赖收集,数据更新绑定\n6.初始化了 provide 的值, 也可以看出它没有被收集依赖, 是不会影响视图改变的\n7.调用了你写的 created 方法了。\n\n以上,就是你 let app = new Vue() 这一步所发生的所有事情了。\n\n\n那通过平时的使用我们知道,我们是通过调用 $mounted 能把它挂载上页面。所以接下来我们就可以来看看 vue 自己的 $mount 都做了些什么?\n\n答: 就是把 template 或直接写的 render 函数,进行指令、事件等vue 中的语法解析编译成一个 AST 树。通过这个树,通过之前 initRender 中的 $createElement 方法可以生成虚拟DOM, 然后添加到页面中出,不就渲染出来了么。 如果大家使用过 Vue 的 $createElement 方法,相信就知道这个 ast 是怎么一个结构了,拿示例的来说\n```\ncreateElement(\n 'div',\n [\n '先写一些文字',\n createElement('h1', '一则头条'),\n createElement(MyComponent, {\n props: {\n someProp: 'foobar'\n }\n })\n ]\n)\n```\n\n---\n说完了整个过程,现在还比较疑惑的就是它的收集依赖,然后数据改变引起的视图改变到底怎么做呢?\n\n也就是说我们要实现一个模式,vm 可能 data 对象中的一个值,比如 name 改变了,然后就调用重新渲染的函数,这里为了性能,是生成了一个虚拟 Dom, 然后比较哪里改变了进行相应的替换。 \n把这个模式抽象出来,就是我们需要一个 \n\n先说具体实现: 我们视图更新依赖到的值收集起来,这里把每一个依赖到的值称作 dep。每个依赖订阅与它有关的 vue 的 watcher 中心, 这里把 dep 所订阅的 watcher 叫做 sub。 那么 dep 被改变的时候,获取它订阅了那些 watcher, 通知他们进行 update 视图啦。\n\n可以看我画的简图\n![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/417c23088cb0224c6a4464651452c604.png)\n![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/59c0e76f684052df524761ee8f4f6942.png)\n\n这就是依赖对象 和 一个 watcher 对象所涉及到的处理了。\nVue 中又是怎么把一个个的属性,进行操作变成依赖的呢?\n对应它的源码就是 defineReactive 方法。源码如图:\n```\nexport function defineReactive (obj, key, val, customSetter, shallow) {\n const dep = new Dep()\n \n // 迎合预定义的getter / setter\n const getter = property && property.get\n const setter = property && property.set\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key]\n }\n \n let childOb = !shallow && observe(val)\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n const value = getter ? getter.call(obj) : val\n if (Dep.target) {\n dep.depend()\n if (childOb) {\n childOb.dep.depend()\n if (Array.isArray(value)) {\n dependArray(value)\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n const value = getter ? getter.call(obj) : val\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n if (setter) {\n setter.call(obj, newVal)\n } else {\n val = newVal\n }\n childOb = !shallow && observe(newVal)\n dep.notify()\n }\n })\n}\n```\n这里就是用的 Object.defineProperty 方法,它可以重写对象的属性的 get 和 set 方法。 当这个属性在 Vue 中被获取的时候,就开始收集依赖,把它收集在这个 vm 的 watcher 中心,并且让它订阅这个 watcher 。当这个属性被重新设置时, 就通知它所订阅的对象去更新。\n\n大致要知道的就是这些了。关于具体是怎么实现把 template 编译成 ast 树, 具体是怎么把事件绑定上去的,你可以尽情的去猜想和推测,或者去看看具体的实现方式。但是 VUE 框架总体来说所做的就是这些事情了, 如果有觉得本文写的不清楚的地方可以提哈 = =\n"}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsdStQIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3Z1ZS5tZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcInZ1ZSDmmK/kuIDkuKoganMg5qGG5p6277yM5a6D5a6e546w5LqG6Ieq5bex55qE5qih5p2/77yM6YCa6L+HIC52dWUg5paH5Lu25Y+v5Lul57uP6L+H57yW6K+R5oiQ5LiA5Liq5pWw5o2u5pS55Y+Y6amx5Yqo6KeG5Zu+5pS55Y+Y55qEIGpz5Luj56CB44CCXFxu6YKj5LmI6L+Z5YW25Lit5Y+I5piv57uP5Y6G5LqG5LuA5LmI5qC355qE5q2l6aqk5ZGi77yfXFxuXFxuLS0tLS0gXFxu5LiA5LiqIHZ1ZSDlr7nosaHmmK/pgJrov4cgbmV3IFZ1ZSh7b3B0aW9uc30pIOadpeW+l+WIsOeahO+8jOS5n+WwseaYr+aehOmAoOWHveaVsOS6huOAguaIkeS7rOadpeeci+i/meS4quWHveaVsFxcbmBgYFxcbmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykge1xcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlKVxcbiAgKSB7XFxuICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKVxcbiAgfVxcbiAgdGhpcy5faW5pdChvcHRpb25zKVxcbn1cXG5cXG4vLyDov5nph4zmmK/kuIDns7vliJflr7nov5nkuKrlh73mlbDov5vooYznmoTnu6fmib9cXG5pbml0TWl4aW4oVnVlKVxcbnN0YXRlTWl4aW4oVnVlKVxcbmV2ZW50c01peGluKFZ1ZSlcXG5saWZlY3ljbGVNaXhpbihWdWUpXFxucmVuZGVyTWl4aW4oVnVlKVxcblxcbmV4cG9ydCBkZWZhdWx0IFZ1ZVxcbmBgYFxcbuWPr+S7peeci+WIsOi/meS4qiBWdWUg5p6E6YCg5Ye95pWw77yM5a6D57uP5Y6G5LqGIDUg5Liq57O75YiX55qEbWl4aW7vvIzlubblnKjmlrDliJvlu7rml7bkvJrov5DooYwgX2luaXQob3B0aW9ucykg5pa55rOV44CCXFxu6YKj5LmI5oiR5Lus5p2l55yL55yLLCDov5nkupTkuKogbWl4aW4g5YiG5Yir5YGa5LqG5ZWl44CCXFxuXFxuICMjIyMjIOesrOS4gOS4qiAgaW5pdE1peGluXFxuIOWug+WPquWBmuS6huS4gOS7tuS6i++8jCDlrprkuYnkuoYgX2luaXQg5pa55rOV77yM6YKj5LmI5L2g5bCx55+l6YGT5Yib6YCg5LiA5LiqVnVlIOWunuS+i++8jOWug+aJp+ihjOeahCBfaW5pdCDmlrnms5XlsLHmmK/kuIrpnaLov5nkuKrmlrnms5XkuobjgIJcXG5gYGBcXG5WdWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnM/OiBPYmplY3QpIHtcXG4uLi4uXFxufVxcbmBgYFxcblxcblxcblxcbiMjIyMjIOesrOS6jOS4qiBzdGF0ZU1peGluIFxcbmBgYFxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpICAvLyDog73lpJ/ov5Tlm54gZGF0YVxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckcHJvcHMnLCBwcm9wc0RlZikgLy8g6IO95aSf6L+U5ZueIHByb3BzXFxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQgLy8g5bCx5piv5oiR5Lus55So55qEIHRoaXMuJHNldCh0aGlzLnBlb3BsZSwgJ25hbWUnLCDigJhjbGV2ZXInKeaWueazlSwg5LiL5ZCM44CCXFxuICBWdWUucHJvdG90eXBlLiRkZWxldGUgPSBkZWxcXG4gIFZ1ZS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKFxcbiAgIC4uLi5cXG4gIH1cXG4gIGBgYFxcblxcbiMjIyMjIOesrOS4ieS4qiBldmVudHNNaXhpblxcbmBgYFxcblZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcXG4uLi4uXFxufVxcblZ1ZS5wcm90b3R5cGUuXyRvbmNlID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcXG4gLy8g55uR5ZCs5LiA5Liq6Ieq5a6a5LmJ5LqL5Lu277yM5L2G5piv5Y+q6Kem5Y+R5LiA5qyh77yM5Zyo56ys5LiA5qyh6Kem5Y+R5LmL5ZCO56e76Zmk55uR5ZCs5Zmo44CCXFxufVxcblZ1ZS5wcm90b3R5cGUuX29mZiA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcXG4vLyDnp7vpmaToh6rlrprkuYnkuovku7bnm5HlkKzlmajjgIJcXG59XFxuVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xcbi8vIOinpuWPkeS4gOS4quS6i+S7tlxcbn1cXG5gYGBcXG4jIyMjIyDnrKzlm5vkuKogbGlmZWN5Y2xlTWl4aW4hW+WcqOi/memHjOaPkuWFpeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvMDIyN2M4YzE1Mjg1ZmJkMTc5NTczZTdjZDhjYjQ3MTgucG5nKVxcbiMjIyMjIOesrOS6lOS4qiByZW5kZXJNaXhpbiFb5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXShodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS83MTUzOTlhOWFjMzVjZWY3YzNhY2EyZDMyNDJjYTVhMy5wbmcpXFxuLS0tXFxuXFxu5aW977yMIOi/meS4qiBWdWUg57un5om/5LqG6L+Z5Lqb5pa55rOV77yM5a6D5bey57uP5piv5LiA5Liq5a6M5pW055qEIFZ1ZSDkuobvvIzogIzmlrDliJvlu7rnmoTml7blgJnopoHmiafooYwgX2luaXQg5pa55rOV5LqGLCDnjrDlnKjmiJHku6zmnaXnnIvnnIvov5nkuKrmlrnms5Xph4zpnaLlgZrkuoblhpnllaVcXG4tICB2bS5fdWlkID0gdWlkKysg5Yib5bu6IHVpZFxcbi0gIOWQiOW5tiBvcHRpb25zXFxuLSAgIGluaXRMaWZlY3ljbGVcXG4gICAgaW5pdEV2ZW50cyh2bSlcXG4gICAgaW5pdFJlbmRlcih2bSlcXG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVDcmVhdGUnKVxcbiAgICBpbml0SW5qZWN0aW9ucyh2bSkgLy8gcmVzb2x2ZSBpbmplY3Rpb25zIGJlZm9yZSBkYXRhL3Byb3BzXFxuICAgIGluaXRTdGF0ZSh2bSlcXG4gICAgaW5pdFByb3ZpZGUodm0pIC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzXFxuICAgIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpXFxuYGBgXFxu5YWz5LqOIGluaXRMaWZlY3ljbGVcXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnRcXG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm1cXG4gIHZtLiRjaGlsZHJlbiA9IFtdXFxuICB2bS4kcmVmcyA9IHt9XFxuICB2bS5fd2F0Y2hlciA9IG51bGxcXG4gIHZtLl9pbmFjdGl2ZSA9IG51bGxcXG4gIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlXFxuICB2bS5faXNNb3VudGVkID0gZmFsc2VcXG4gIHZtLl9pc0Rlc3Ryb3llZCA9IGZhbHNlXFxuICB2bS5faXNCZWluZ0Rlc3Ryb3llZCA9IGZhbHNlXFxuICBgYGBcXG5cXG4tICBpbml0RXZlbnRzXFxuYGBgXFxuICB2bS5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxcbiAgdm0uX2hhc0hvb2tFdmVudCA9IGZhbHNlXFxuICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHNcXG4gIGNvbnN0IGxpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnNcXG4gIGlmIChsaXN0ZW5lcnMpIHtcXG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpXFxuICB9XFxuICDlsLHmmK/liKTmlq3niLbnuqfmmK/lkKbmnInkuovku7bnm5HlkKzvvIznhLblkI7nu5nniLbnuqfov5vooYznm5HlkKzkuovku7ZcXG4gIGBgYFxcbi0gaW5pdFJlbmRlclxcbmBgYFxcbiAgIHZtLl92bm9kZSA9IG51bGwgIC8vIHRoZSByb290IG9mIHRoZSBjaGlsZCB0cmVlXFxuICB2bS5fc3RhdGljVHJlZXMgPSBudWxsICAvLyB2LW9uY2UgY2FjaGVkIHRyZWVzXFxuICBjb25zdCBvcHRpb25zID0gdm0uJG9wdGlvbnNcXG4gIGNvbnN0IHBhcmVudFZub2RlID0gdm0uJHZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGUgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcXG4gIGNvbnN0IHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0XFxuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpXFxuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdFxcbiAgLy8g5a6e5L6L57uR5a6aIGNyZWF0ZUVsZW1lbnQg5pa55rOV77yM5Lul5L6/5Y+v5Lul5q2j5bi45Zyo5YaF6YOo5riy5p+TXFxuIC8vIOWPguaVsOmhuuW6jyAgIHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcXG4gIC8vIOWGhemDqOS9v+eUqOS7juaooeadv+e8luivkeiAjOadpeeahOa4suafk+WHveaVsFxcbiAgXFxuICB2bS5fYyA9IChhLCBiLCBjLCBkKSA9PiBjcmVhdGVFbGVtZW50KHZtLCBhLCBiLCBjLCBkLCBmYWxzZSlcXG4gIC8vIOWFrOWFseeJiOacrOW/hemhu+aYryBub3JtYWxpemF0aW9uIOeahOa4suafk+WHveaVsFxcbiAgdm0uJGNyZWF0ZUVsZW1lbnQgPSAoYSwgYiwgYywgZCkgPT4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgdHJ1ZSlcXG5cXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMg5bqU6K+l6KKr55uR5ZCs54Ot5pu05pawXFxuICBjb25zdCBwYXJlbnREYXRhID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuZGF0YVxcblxcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcXG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsICgpID0+IHtcXG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oYCRhdHRycyBpcyByZWFkb25seS5gLCB2bSlcXG4gICAgfSwgdHJ1ZSlcXG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckbGlzdGVuZXJzJywgb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0LCAoKSA9PiB7XFxuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKGAkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LmAsIHZtKVxcbiAgICB9LCB0cnVlKVxcbiAgfSBlbHNlIHtcXG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpXFxuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgbnVsbCwgdHJ1ZSlcXG4gIH1cXG4gIGBgYFxcbi0gIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJykg5omn6KGMIGJlZm9yZUNyZWF0ZSDlh73mlbBcXG5cXG4tICBpbml0SW5qZWN0aW9ucyh2bSkg5pS26ZuG5rOo5YWl55qE5L6d6LWWXFxuYGBgXFxuICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5qZWN0KHZtLiRvcHRpb25zLmluamVjdCwgdm0pXFxuICBpZiAocmVzdWx0KSB7XFxuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSlcXG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGtleSA9PiB7XFxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcXG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCAoKSA9PiB7XFxuICAgICAgICAgIHdhcm4oXFxuICAgICAgICAgIFxcdGDpgb/lhY3nm7TmjqXmlLnlj5jms6jlhaXnmoTlgLzvvIzlm6DkuLrlsIbkvJrph43mlrDmuLLmn5PmiYDmj5Dkvpvov5nkuKrlgLznmoTnu4Tku7YsIFxcbiAgICAgICAgICBcXHTmlLnlj5jnmoTlgLzmmK86IFxcXCIke2tleX1cXFwiLFxcbiAgICAgICAgICAgIHZtXFxuICAgICAgICAgIClcXG4gICAgICAgIH0pXFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldKVxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpXFxuYGBgXFxuLSBpbml0U3RhdGUg55uR5ZCs5YC85pS26ZuG5L6d6LWWXFxuYGBgXFxuICB2bS5fd2F0Y2hlcnMgPSBbXVxcbiAgY29uc3Qgb3B0cyA9IHZtLiRvcHRpb25zXFxuICBpZiAob3B0cy5wcm9wcykgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKSAvLyDotYvlgLwgcHJvcHMg5pWw5o2u5bm25pS26ZuG5L6d6LWWXFxuICBpZiAob3B0cy5tZXRob2RzKSBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKSAvLyDotYvlgLwgdnVlIOeahOWQhOS4qiBtZXRob2RcXG4gIGlmIChvcHRzLmRhdGEpIHtcXG4gICAgaW5pdERhdGEodm0pIC8vIOaUtumbhuS+nei1llxcbiAgfSBlbHNlIHtcXG4gICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pXFxuICB9XFxuICBpZiAob3B0cy5jb21wdXRlZCkgaW5pdENvbXB1dGVkKHZtLCBvcHRzLmNvbXB1dGVkKSAvLyDmlLbpm4bkvp3otZZcXG4gIGlmIChvcHRzLndhdGNoICYmIG9wdHMud2F0Y2ggIT09IG5hdGl2ZVdhdGNoKSB7XFxuICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCkgLy8g5Yid5aeL5YyW5L2g5YaZ55qE55uR5ZCs5a+56LGhXFxuICB9XFxuIFxcbmBgYFxcbi0gaW5pdFByb3ZpZGVcXG5gYGBcXG4gIGNvbnN0IHByb3ZpZGUgPSB2bS4kb3B0aW9ucy5wcm92aWRlXFxuICBpZiAocHJvdmlkZSkge1xcbiAgICB2bS5fcHJvdmlkZWQgPSB0eXBlb2YgcHJvdmlkZSA9PT0gJ2Z1bmN0aW9uJ1xcbiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKVxcbiAgICAgIDogcHJvdmlkZVxcbiAgfVxcbmBgYFxcbi0gIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpIOaJp+ihjCBjcmVhdGVkIOWHveaVsFxcblxcbj7ov5nlsLHmmK8gX2luaXQg5Lit5ZCE5Liq5Ye95pWw5omA5YGa55qE5LqG44CCIOaIkeS7rOWPr+S7peeci+WIsOaAu+e7k+i/h+adpeWwseaYr1xcbjEu5Yid5aeL5YyW5LqG55Sf5ZG954q25oCBXFxuMi7ov5vooYzkuovku7bkuIrnmoTnm5HlkKxcXG4zLua4suafk+inhuWbvueahOWIneWni+WMlu+8m+aUtumbhuaJgOeUqOWIsOeahOeItue7hOS7tueahOaVsOaNruaIluS6i+S7tlxcbjQu6LCD55So5L2g5YaZ55qEIGJlZm9yZUNyZWF0ZSDmlrnms5VcXG41LmluaXRTdGF0ZSwg5aSE55CG5LqGIHZ1ZSDkuK3nmoTlkITnp43mlbDmja4ocHJvcHMvZGF0YS9tZXRob2RzLi4uLi4pLCDkuZ/lnKjov5nkuIDmraXpkojlr7nov5nkupvmlbDmja7ov5vooYzkuobkvp3otZbmlLbpm4bvvIzmlbDmja7mm7TmlrDnu5HlrppcXG42LuWIneWni+WMluS6hiBwcm92aWRlIOeahOWAvO+8jCDkuZ/lj6/ku6XnnIvlh7rlroPmsqHmnInooqvmlLbpm4bkvp3otZbvvIwg5piv5LiN5Lya5b2x5ZON6KeG5Zu+5pS55Y+Y55qEXFxuNy7osIPnlKjkuobkvaDlhpnnmoQgY3JlYXRlZCDmlrnms5XkuobjgIJcXG5cXG7ku6XkuIrvvIzlsLHmmK/kvaAgbGV0IGFwcCA9IG5ldyBWdWUoKSDov5nkuIDmraXmiYDlj5HnlJ/nmoTmiYDmnInkuovmg4XkuobjgIJcXG5cXG5cXG7pgqPpgJrov4flubPml7bnmoTkvb/nlKjmiJHku6znn6XpgZPvvIzmiJHku6zmmK/pgJrov4fosIPnlKggJG1vdW50ZWQg6IO95oqK5a6D5oyC6L295LiK6aG16Z2i44CC5omA5Lul5o6l5LiL5p2l5oiR5Lus5bCx5Y+v5Lul5p2l55yL55yLIHZ1ZSDoh6rlt7HnmoQgJG1vdW50IOmDveWBmuS6huS6m+S7gOS5iD9cXG5cXG7nrZQ6IOWwseaYr+aKiiB0ZW1wbGF0ZSDmiJbnm7TmjqXlhpnnmoQgcmVuZGVyIOWHveaVsO+8jOi/m+ihjOaMh+S7pOOAgeS6i+S7tuetiXZ1ZSDkuK3nmoTor63ms5Xop6PmnpDnvJbor5HmiJDkuIDkuKogQVNUIOagkeOAgumAmui/h+i/meS4quagke+8jOmAmui/h+S5i+WJjSBpbml0UmVuZGVyIOS4reeahCAkY3JlYXRlRWxlbWVudCDmlrnms5Xlj6/ku6XnlJ/miJDomZrmi59ET00sIOeEtuWQjua3u+WKoOWIsOmhtemdouS4reWHuu+8jOS4jeWwsea4suafk+WHuuadpeS6huS5iOOAgiDlpoLmnpzlpKflrrbkvb/nlKjov4cgVnVlIOeahCAkY3JlYXRlRWxlbWVudCDmlrnms5XvvIznm7jkv6HlsLHnn6XpgZPov5nkuKogYXN0IOaYr+aAjuS5iOS4gOS4que7k+aehOS6hu+8jOaLv+ekuuS+i+eahOadpeivtFxcbmBgYFxcbmNyZWF0ZUVsZW1lbnQoXFxuICAnZGl2JyxcXG4gIFtcXG4gICAgJ+WFiOWGmeS4gOS6m+aWh+WtlycsXFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2gxJywgJ+S4gOWImeWktOadoScpLFxcbiAgICBjcmVhdGVFbGVtZW50KE15Q29tcG9uZW50LCB7XFxuICAgICAgcHJvcHM6IHtcXG4gICAgICAgIHNvbWVQcm9wOiAnZm9vYmFyJ1xcbiAgICAgIH1cXG4gICAgfSlcXG4gIF1cXG4pXFxuYGBgXFxuXFxuLS0tXFxu6K+05a6M5LqG5pW05Liq6L+H56iL77yM546w5Zyo6L+Y5q+U6L6D55aR5oOR55qE5bCx5piv5a6D55qE5pS26ZuG5L6d6LWW77yM54S25ZCO5pWw5o2u5pS55Y+Y5byV6LW355qE6KeG5Zu+5pS55Y+Y5Yiw5bqV5oCO5LmI5YGa5ZGi77yfXFxuXFxu5Lmf5bCx5piv6K+05oiR5Lus6KaB5a6e546w5LiA5Liq5qih5byP77yMdm0g5Y+v6IO9IGRhdGEg5a+56LGh5Lit55qE5LiA5Liq5YC877yM5q+U5aaCIG5hbWUg5pS55Y+Y5LqG77yM54S25ZCO5bCx6LCD55So6YeN5paw5riy5p+T55qE5Ye95pWw77yM6L+Z6YeM5Li65LqG5oCn6IO977yM5piv55Sf5oiQ5LqG5LiA5Liq6Jma5oufIERvbSwg54S25ZCO5q+U6L6D5ZOq6YeM5pS55Y+Y5LqG6L+b6KGM55u45bqU55qE5pu/5o2i44CCIFxcbuaKiui/meS4quaooeW8j+aKveixoeWHuuadpe+8jOWwseaYr+aIkeS7rOmcgOimgeS4gOS4qiBcXG5cXG7lhYjor7TlhbfkvZPlrp7njrDvvJog5oiR5Lus6KeG5Zu+5pu05paw5L6d6LWW5Yiw55qE5YC85pS26ZuG6LW35p2l77yM6L+Z6YeM5oqK5q+P5LiA5Liq5L6d6LWW5Yiw55qE5YC856ew5L2cIGRlcOOAguavj+S4quS+nei1luiuoumYheS4juWug+acieWFs+eahCB2dWUg55qEIHdhdGNoZXIg5Lit5b+D77yMIOi/memHjOaKiiBkZXAg5omA6K6i6ZiF55qEIHdhdGNoZXIg5Y+r5YGaIHN1YuOAgiDpgqPkuYggZGVwIOiiq+aUueWPmOeahOaXtuWAme+8jOiOt+WPluWug+iuoumYheS6humCo+S6myB3YXRjaGVy77yMIOmAmuefpeS7luS7rOi/m+ihjCB1cGRhdGUg6KeG5Zu+5ZWm44CCXFxuXFxu5Y+v5Lul55yL5oiR55S755qE566A5Zu+XFxuIVvlnKjov5nph4zmj5LlhaXlm77niYfmj4/ov7BdKGh0dHBzOi8vaS1ibG9nLmNzZG5pbWcuY24vYmxvZ19taWdyYXRlLzQxN2MyMzA4OGNiMDIyNGM2YTQ0NjQ2NTE0NTJjNjA0LnBuZylcXG4hW+WcqOi/memHjOaPkuWFpeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNTljMGU3NmY2ODQwNTJkZjUyNDc2MWVlOGY0ZjY5NDIucG5nKVxcblxcbui/meWwseaYr+S+nei1luWvueixoSDlkowg5LiA5LiqIHdhdGNoZXIg5a+56LGh5omA5raJ5Y+K5Yiw55qE5aSE55CG5LqG44CCXFxuVnVlIOS4reWPiOaYr+aAjuS5iOaKiuS4gOS4quS4queahOWxnuaAp++8jOi/m+ihjOaTjeS9nOWPmOaIkOS+nei1lueahOWRou+8n1xcbuWvueW6lOWug+eahOa6kOeggeWwseaYryBkZWZpbmVSZWFjdGl2ZSDmlrnms5XjgILmupDnoIHlpoLlm77vvJpcXG5gYGBcXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUgKG9iaiwga2V5LCB2YWwsIGN1c3RvbVNldHRlciwgc2hhbGxvdykge1xcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXFxuICBcXG4gIC8vIOi/juWQiOmihOWumuS5ieeahGdldHRlciAvIHNldHRlclxcbiAgY29uc3QgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0XFxuICBjb25zdCBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXRcXG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcXG4gICAgdmFsID0gb2JqW2tleV1cXG4gIH1cXG4gIFxcbiAgbGV0IGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKHZhbClcXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXFxuICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIgKCkge1xcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxcbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XFxuICAgICAgICBkZXAuZGVwZW5kKClcXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XFxuICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpXFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICAgIHJldHVybiB2YWx1ZVxcbiAgICB9LFxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcXG4gICAgICBjb25zdCB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWxcXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xcbiAgICAgICAgcmV0dXJuXFxuICAgICAgfVxcbiAgICAgIGlmIChzZXR0ZXIpIHtcXG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKVxcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB2YWwgPSBuZXdWYWxcXG4gICAgICB9XFxuICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKVxcbiAgICAgIGRlcC5ub3RpZnkoKVxcbiAgICB9XFxuICB9KVxcbn1cXG5gYGBcXG7ov5nph4zlsLHmmK/nlKjnmoQgT2JqZWN0LmRlZmluZVByb3BlcnR5IOaWueazle+8jOWug+WPr+S7pemHjeWGmeWvueixoeeahOWxnuaAp+eahCBnZXQg5ZKMIHNldCDmlrnms5XjgIIg5b2T6L+Z5Liq5bGe5oCn5ZyoIFZ1ZSDkuK3ooqvojrflj5bnmoTml7blgJnvvIzlsLHlvIDlp4vmlLbpm4bkvp3otZbvvIzmiorlroPmlLbpm4blnKjov5nkuKogdm0g55qEIHdhdGNoZXIg5Lit5b+D77yM5bm25LiU6K6p5a6D6K6i6ZiF6L+Z5LiqIHdhdGNoZXIg44CC5b2T6L+Z5Liq5bGe5oCn6KKr6YeN5paw6K6+572u5pe277yMIOWwsemAmuefpeWug+aJgOiuoumYheeahOWvueixoeWOu+abtOaWsOOAglxcblxcbuWkp+iHtOimgeefpemBk+eahOWwseaYr+i/meS6m+S6huOAguWFs+S6juWFt+S9k+aYr+aAjuS5iOWunueOsOaKiiB0ZW1wbGF0ZSAg57yW6K+R5oiQIGFzdCDmoJHvvIwg5YW35L2T5piv5oCO5LmI5oqK5LqL5Lu257uR5a6a5LiK5Y6755qE77yM5L2g5Y+v5Lul5bC95oOF55qE5Y6754yc5oOz5ZKM5o6o5rWL77yM5oiW6ICF5Y6755yL55yL5YW35L2T55qE5a6e546w5pa55byP44CC5L2G5pivIFZVRSDmoYbmnrbmgLvkvZPmnaXor7TmiYDlgZrnmoTlsLHmmK/ov5nkupvkuovmg4XkuoYsIOWmguaenOacieinieW+l+acrOaWh+WGmeeahOS4jea4healmueahOWcsOaWueWPr+S7peaPkOWTiCA9ID1cXG5cIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[212],{5212:(n,e,t)=>{t.r(e),t.d(e,{default:()=>o});const o="vue 是一个 js 框架,它实现了自己的模板,通过 .vue 文件可以经过编译成一个数据改变驱动视图改变的 js代码。\n那么这其中又是经历了什么样的步骤呢?\n\n----- \n一个 vue 对象是通过 new Vue({options}) 来得到的,也就是构造函数了。我们来看这个函数\n```\nfunction Vue (options) {\n if (process.env.NODE_ENV !== 'production' &&\n !(this instanceof Vue)\n ) {\n warn('Vue is a constructor and should be called with the `new` keyword')\n }\n this._init(options)\n}\n\n// 这里是一系列对这个函数进行的继承\ninitMixin(Vue)\nstateMixin(Vue)\neventsMixin(Vue)\nlifecycleMixin(Vue)\nrenderMixin(Vue)\n\nexport default Vue\n```\n可以看到这个 Vue 构造函数,它经历了 5 个系列的mixin,并在新创建时会运行 _init(options) 方法。\n那么我们来看看, 这五个 mixin 分别做了啥。\n\n ##### 第一个 initMixin\n 它只做了一件事, 定义了 _init 方法,那么你就知道创造一个Vue 实例,它执行的 _init 方法就是上面这个方法了。\n```\nVue.prototype._init = function (options?: Object) {\n....\n}\n```\n\n\n\n##### 第二个 stateMixin \n```\n Object.defineProperty(Vue.prototype, '$data', dataDef) // 能够返回 data\n Object.defineProperty(Vue.prototype, '$props', propsDef) // 能够返回 props\n Vue.prototype.$set = set // 就是我们用的 this.$set(this.people, 'name', ‘clever')方法, 下同。\n Vue.prototype.$delete = del\n Vue.prototype.$watch = function (\n ....\n }\n ```\n\n##### 第三个 eventsMixin\n```\nVue.prototype.$on = function (eventname, fn) {\n....\n}\nVue.prototype._$once = function (eventname, fn) {\n // 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。\n}\nVue.prototype._off = function (event, fn) {\n// 移除自定义事件监听器。\n}\nVue.prototype.$emit = function (event) {\n// 触发一个事件\n}\n```\n##### 第四个 lifecycleMixin![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0227c8c15285fbd179573e7cd8cb4718.png)\n##### 第五个 renderMixin![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/715399a9ac35cef7c3aca2d3242ca5a3.png)\n---\n\n好, 这个 Vue 继承了这些方法,它已经是一个完整的 Vue 了,而新创建的时候要执行 _init 方法了, 现在我们来看看这个方法里面做了写啥\n- vm._uid = uid++ 创建 uid\n- 合并 options\n- initLifecycle\n initEvents(vm)\n initRender(vm)\n callHook(vm, 'beforeCreate')\n initInjections(vm) // resolve injections before data/props\n initState(vm)\n initProvide(vm) // resolve provide after data/props\n callHook(vm, 'created')\n```\n关于 initLifecycle\n vm.$parent = parent\n vm.$root = parent ? parent.$root : vm\n vm.$children = []\n vm.$refs = {}\n vm._watcher = null\n vm._inactive = null\n vm._directInactive = false\n vm._isMounted = false\n vm._isDestroyed = false\n vm._isBeingDestroyed = false\n ```\n\n- initEvents\n```\n vm._events = Object.create(null)\n vm._hasHookEvent = false\n // init parent attached events\n const listeners = vm.$options._parentListeners\n if (listeners) {\n updateComponentListeners(vm, listeners)\n }\n 就是判断父级是否有事件监听,然后给父级进行监听事件\n ```\n- initRender\n```\n vm._vnode = null // the root of the child tree\n vm._staticTrees = null // v-once cached trees\n const options = vm.$options\n const parentVnode = vm.$vnode = options._parentVnode // the placeholder node in parent tree\n const renderContext = parentVnode && parentVnode.context\n vm.$slots = resolveSlots(options._renderChildren, renderContext)\n vm.$scopedSlots = emptyObject\n // 实例绑定 createElement 方法,以便可以正常在内部渲染\n // 参数顺序 tag, data, children, normalizationType, alwaysNormalize\n // 内部使用从模板编译而来的渲染函数\n \n vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)\n // 公共版本必须是 normalization 的渲染函数\n vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)\n\n // $attrs & $listeners 应该被监听热更新\n const parentData = parentVnode && parentVnode.data\n\n if (process.env.NODE_ENV !== 'production') {\n defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, () => {\n !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm)\n }, true)\n defineReactive(vm, '$listeners', options._parentListeners || emptyObject, () => {\n !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm)\n }, true)\n } else {\n defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true)\n defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true)\n }\n ```\n- callHook(vm, 'beforeCreate') 执行 beforeCreate 函数\n\n- initInjections(vm) 收集注入的依赖\n```\n const result = resolveInject(vm.$options.inject, vm)\n if (result) {\n toggleObserving(false)\n Object.keys(result).forEach(key => {\n if (process.env.NODE_ENV !== 'production') {\n defineReactive(vm, key, result[key], () => {\n warn(\n \t`避免直接改变注入的值,因为将会重新渲染所提供这个值的组件, \n \t改变的值是: \"${key}\",\n vm\n )\n })\n } else {\n defineReactive(vm, key, result[key])\n }\n })\n toggleObserving(true)\n```\n- initState 监听值收集依赖\n```\n vm._watchers = []\n const opts = vm.$options\n if (opts.props) initProps(vm, opts.props) // 赋值 props 数据并收集依赖\n if (opts.methods) initMethods(vm, opts.methods) // 赋值 vue 的各个 method\n if (opts.data) {\n initData(vm) // 收集依赖\n } else {\n observe(vm._data = {}, true /* asRootData */)\n }\n if (opts.computed) initComputed(vm, opts.computed) // 收集依赖\n if (opts.watch && opts.watch !== nativeWatch) {\n initWatch(vm, opts.watch) // 初始化你写的监听对象\n }\n \n```\n- initProvide\n```\n const provide = vm.$options.provide\n if (provide) {\n vm._provided = typeof provide === 'function'\n ? provide.call(vm)\n : provide\n }\n```\n- callHook(vm, 'created') 执行 created 函数\n\n>这就是 _init 中各个函数所做的了。 我们可以看到总结过来就是\n1.初始化了生命状态\n2.进行事件上的监听\n3.渲染视图的初始化;收集所用到的父组件的数据或事件\n4.调用你写的 beforeCreate 方法\n5.initState, 处理了 vue 中的各种数据(props/data/methods.....), 也在这一步针对这些数据进行了依赖收集,数据更新绑定\n6.初始化了 provide 的值, 也可以看出它没有被收集依赖, 是不会影响视图改变的\n7.调用了你写的 created 方法了。\n\n以上,就是你 let app = new Vue() 这一步所发生的所有事情了。\n\n\n那通过平时的使用我们知道,我们是通过调用 $mounted 能把它挂载上页面。所以接下来我们就可以来看看 vue 自己的 $mount 都做了些什么?\n\n答: 就是把 template 或直接写的 render 函数,进行指令、事件等vue 中的语法解析编译成一个 AST 树。通过这个树,通过之前 initRender 中的 $createElement 方法可以生成虚拟DOM, 然后添加到页面中出,不就渲染出来了么。 如果大家使用过 Vue 的 $createElement 方法,相信就知道这个 ast 是怎么一个结构了,拿示例的来说\n```\ncreateElement(\n 'div',\n [\n '先写一些文字',\n createElement('h1', '一则头条'),\n createElement(MyComponent, {\n props: {\n someProp: 'foobar'\n }\n })\n ]\n)\n```\n\n---\n说完了整个过程,现在还比较疑惑的就是它的收集依赖,然后数据改变引起的视图改变到底怎么做呢?\n\n也就是说我们要实现一个模式,vm 可能 data 对象中的一个值,比如 name 改变了,然后就调用重新渲染的函数,这里为了性能,是生成了一个虚拟 Dom, 然后比较哪里改变了进行相应的替换。 \n把这个模式抽象出来,就是我们需要一个 \n\n先说具体实现: 我们视图更新依赖到的值收集起来,这里把每一个依赖到的值称作 dep。每个依赖订阅与它有关的 vue 的 watcher 中心, 这里把 dep 所订阅的 watcher 叫做 sub。 那么 dep 被改变的时候,获取它订阅了那些 watcher, 通知他们进行 update 视图啦。\n\n可以看我画的简图\n![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/417c23088cb0224c6a4464651452c604.png)\n![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/59c0e76f684052df524761ee8f4f6942.png)\n\n这就是依赖对象 和 一个 watcher 对象所涉及到的处理了。\nVue 中又是怎么把一个个的属性,进行操作变成依赖的呢?\n对应它的源码就是 defineReactive 方法。源码如图:\n```\nexport function defineReactive (obj, key, val, customSetter, shallow) {\n const dep = new Dep()\n \n // 迎合预定义的getter / setter\n const getter = property && property.get\n const setter = property && property.set\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key]\n }\n \n let childOb = !shallow && observe(val)\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n const value = getter ? getter.call(obj) : val\n if (Dep.target) {\n dep.depend()\n if (childOb) {\n childOb.dep.depend()\n if (Array.isArray(value)) {\n dependArray(value)\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n const value = getter ? getter.call(obj) : val\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n if (setter) {\n setter.call(obj, newVal)\n } else {\n val = newVal\n }\n childOb = !shallow && observe(newVal)\n dep.notify()\n }\n })\n}\n```\n这里就是用的 Object.defineProperty 方法,它可以重写对象的属性的 get 和 set 方法。 当这个属性在 Vue 中被获取的时候,就开始收集依赖,把它收集在这个 vm 的 watcher 中心,并且让它订阅这个 watcher 。当这个属性被重新设置时, 就通知它所订阅的对象去更新。\n\n大致要知道的就是这些了。关于具体是怎么实现把 template 编译成 ast 树, 具体是怎么把事件绑定上去的,你可以尽情的去猜想和推测,或者去看看具体的实现方式。但是 VUE 框架总体来说所做的就是这些事情了, 如果有觉得本文写的不清楚的地方可以提哈 = =\n"}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEyLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsdStQIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3Z1ZS5tZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcInZ1ZSDmmK/kuIDkuKoganMg5qGG5p6277yM5a6D5a6e546w5LqG6Ieq5bex55qE5qih5p2/77yM6YCa6L+HIC52dWUg5paH5Lu25Y+v5Lul57uP6L+H57yW6K+R5oiQ5LiA5Liq5pWw5o2u5pS55Y+Y6amx5Yqo6KeG5Zu+5pS55Y+Y55qEIGpz5Luj56CB44CCXFxu6YKj5LmI6L+Z5YW25Lit5Y+I5piv57uP5Y6G5LqG5LuA5LmI5qC355qE5q2l6aqk5ZGi77yfXFxuXFxuLS0tLS0gXFxu5LiA5LiqIHZ1ZSDlr7nosaHmmK/pgJrov4cgbmV3IFZ1ZSh7b3B0aW9uc30pIOadpeW+l+WIsOeahO+8jOS5n+WwseaYr+aehOmAoOWHveaVsOS6huOAguaIkeS7rOadpeeci+i/meS4quWHveaVsFxcbmBgYFxcbmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykge1xcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlKVxcbiAgKSB7XFxuICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKVxcbiAgfVxcbiAgdGhpcy5faW5pdChvcHRpb25zKVxcbn1cXG5cXG4vLyDov5nph4zmmK/kuIDns7vliJflr7nov5nkuKrlh73mlbDov5vooYznmoTnu6fmib9cXG5pbml0TWl4aW4oVnVlKVxcbnN0YXRlTWl4aW4oVnVlKVxcbmV2ZW50c01peGluKFZ1ZSlcXG5saWZlY3ljbGVNaXhpbihWdWUpXFxucmVuZGVyTWl4aW4oVnVlKVxcblxcbmV4cG9ydCBkZWZhdWx0IFZ1ZVxcbmBgYFxcbuWPr+S7peeci+WIsOi/meS4qiBWdWUg5p6E6YCg5Ye95pWw77yM5a6D57uP5Y6G5LqGIDUg5Liq57O75YiX55qEbWl4aW7vvIzlubblnKjmlrDliJvlu7rml7bkvJrov5DooYwgX2luaXQob3B0aW9ucykg5pa55rOV44CCXFxu6YKj5LmI5oiR5Lus5p2l55yL55yLLCDov5nkupTkuKogbWl4aW4g5YiG5Yir5YGa5LqG5ZWl44CCXFxuXFxuICMjIyMjIOesrOS4gOS4qiAgaW5pdE1peGluXFxuIOWug+WPquWBmuS6huS4gOS7tuS6i++8jCDlrprkuYnkuoYgX2luaXQg5pa55rOV77yM6YKj5LmI5L2g5bCx55+l6YGT5Yib6YCg5LiA5LiqVnVlIOWunuS+i++8jOWug+aJp+ihjOeahCBfaW5pdCDmlrnms5XlsLHmmK/kuIrpnaLov5nkuKrmlrnms5XkuobjgIJcXG5gYGBcXG5WdWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnM/OiBPYmplY3QpIHtcXG4uLi4uXFxufVxcbmBgYFxcblxcblxcblxcbiMjIyMjIOesrOS6jOS4qiBzdGF0ZU1peGluIFxcbmBgYFxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpICAvLyDog73lpJ/ov5Tlm54gZGF0YVxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckcHJvcHMnLCBwcm9wc0RlZikgLy8g6IO95aSf6L+U5ZueIHByb3BzXFxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQgLy8g5bCx5piv5oiR5Lus55So55qEIHRoaXMuJHNldCh0aGlzLnBlb3BsZSwgJ25hbWUnLCDigJhjbGV2ZXInKeaWueazlSwg5LiL5ZCM44CCXFxuICBWdWUucHJvdG90eXBlLiRkZWxldGUgPSBkZWxcXG4gIFZ1ZS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKFxcbiAgIC4uLi5cXG4gIH1cXG4gIGBgYFxcblxcbiMjIyMjIOesrOS4ieS4qiBldmVudHNNaXhpblxcbmBgYFxcblZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcXG4uLi4uXFxufVxcblZ1ZS5wcm90b3R5cGUuXyRvbmNlID0gZnVuY3Rpb24gKGV2ZW50bmFtZSwgZm4pIHtcXG4gLy8g55uR5ZCs5LiA5Liq6Ieq5a6a5LmJ5LqL5Lu277yM5L2G5piv5Y+q6Kem5Y+R5LiA5qyh77yM5Zyo56ys5LiA5qyh6Kem5Y+R5LmL5ZCO56e76Zmk55uR5ZCs5Zmo44CCXFxufVxcblZ1ZS5wcm90b3R5cGUuX29mZiA9IGZ1bmN0aW9uIChldmVudCwgZm4pIHtcXG4vLyDnp7vpmaToh6rlrprkuYnkuovku7bnm5HlkKzlmajjgIJcXG59XFxuVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xcbi8vIOinpuWPkeS4gOS4quS6i+S7tlxcbn1cXG5gYGBcXG4jIyMjIyDnrKzlm5vkuKogbGlmZWN5Y2xlTWl4aW4hW+WcqOi/memHjOaPkuWFpeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvMDIyN2M4YzE1Mjg1ZmJkMTc5NTczZTdjZDhjYjQ3MTgucG5nKVxcbiMjIyMjIOesrOS6lOS4qiByZW5kZXJNaXhpbiFb5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXShodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS83MTUzOTlhOWFjMzVjZWY3YzNhY2EyZDMyNDJjYTVhMy5wbmcpXFxuLS0tXFxuXFxu5aW977yMIOi/meS4qiBWdWUg57un5om/5LqG6L+Z5Lqb5pa55rOV77yM5a6D5bey57uP5piv5LiA5Liq5a6M5pW055qEIFZ1ZSDkuobvvIzogIzmlrDliJvlu7rnmoTml7blgJnopoHmiafooYwgX2luaXQg5pa55rOV5LqGLCDnjrDlnKjmiJHku6zmnaXnnIvnnIvov5nkuKrmlrnms5Xph4zpnaLlgZrkuoblhpnllaVcXG4tICB2bS5fdWlkID0gdWlkKysg5Yib5bu6IHVpZFxcbi0gIOWQiOW5tiBvcHRpb25zXFxuLSAgIGluaXRMaWZlY3ljbGVcXG4gICAgaW5pdEV2ZW50cyh2bSlcXG4gICAgaW5pdFJlbmRlcih2bSlcXG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVDcmVhdGUnKVxcbiAgICBpbml0SW5qZWN0aW9ucyh2bSkgLy8gcmVzb2x2ZSBpbmplY3Rpb25zIGJlZm9yZSBkYXRhL3Byb3BzXFxuICAgIGluaXRTdGF0ZSh2bSlcXG4gICAgaW5pdFByb3ZpZGUodm0pIC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzXFxuICAgIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpXFxuYGBgXFxu5YWz5LqOIGluaXRMaWZlY3ljbGVcXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnRcXG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm1cXG4gIHZtLiRjaGlsZHJlbiA9IFtdXFxuICB2bS4kcmVmcyA9IHt9XFxuICB2bS5fd2F0Y2hlciA9IG51bGxcXG4gIHZtLl9pbmFjdGl2ZSA9IG51bGxcXG4gIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlXFxuICB2bS5faXNNb3VudGVkID0gZmFsc2VcXG4gIHZtLl9pc0Rlc3Ryb3llZCA9IGZhbHNlXFxuICB2bS5faXNCZWluZ0Rlc3Ryb3llZCA9IGZhbHNlXFxuICBgYGBcXG5cXG4tICBpbml0RXZlbnRzXFxuYGBgXFxuICB2bS5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxcbiAgdm0uX2hhc0hvb2tFdmVudCA9IGZhbHNlXFxuICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHNcXG4gIGNvbnN0IGxpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnNcXG4gIGlmIChsaXN0ZW5lcnMpIHtcXG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpXFxuICB9XFxuICDlsLHmmK/liKTmlq3niLbnuqfmmK/lkKbmnInkuovku7bnm5HlkKzvvIznhLblkI7nu5nniLbnuqfov5vooYznm5HlkKzkuovku7ZcXG4gIGBgYFxcbi0gaW5pdFJlbmRlclxcbmBgYFxcbiAgIHZtLl92bm9kZSA9IG51bGwgIC8vIHRoZSByb290IG9mIHRoZSBjaGlsZCB0cmVlXFxuICB2bS5fc3RhdGljVHJlZXMgPSBudWxsICAvLyB2LW9uY2UgY2FjaGVkIHRyZWVzXFxuICBjb25zdCBvcHRpb25zID0gdm0uJG9wdGlvbnNcXG4gIGNvbnN0IHBhcmVudFZub2RlID0gdm0uJHZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGUgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcXG4gIGNvbnN0IHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0XFxuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpXFxuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdFxcbiAgLy8g5a6e5L6L57uR5a6aIGNyZWF0ZUVsZW1lbnQg5pa55rOV77yM5Lul5L6/5Y+v5Lul5q2j5bi45Zyo5YaF6YOo5riy5p+TXFxuIC8vIOWPguaVsOmhuuW6jyAgIHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcXG4gIC8vIOWGhemDqOS9v+eUqOS7juaooeadv+e8luivkeiAjOadpeeahOa4suafk+WHveaVsFxcbiAgXFxuICB2bS5fYyA9IChhLCBiLCBjLCBkKSA9PiBjcmVhdGVFbGVtZW50KHZtLCBhLCBiLCBjLCBkLCBmYWxzZSlcXG4gIC8vIOWFrOWFseeJiOacrOW/hemhu+aYryBub3JtYWxpemF0aW9uIOeahOa4suafk+WHveaVsFxcbiAgdm0uJGNyZWF0ZUVsZW1lbnQgPSAoYSwgYiwgYywgZCkgPT4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgdHJ1ZSlcXG5cXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMg5bqU6K+l6KKr55uR5ZCs54Ot5pu05pawXFxuICBjb25zdCBwYXJlbnREYXRhID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuZGF0YVxcblxcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcXG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsICgpID0+IHtcXG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oYCRhdHRycyBpcyByZWFkb25seS5gLCB2bSlcXG4gICAgfSwgdHJ1ZSlcXG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckbGlzdGVuZXJzJywgb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0LCAoKSA9PiB7XFxuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKGAkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LmAsIHZtKVxcbiAgICB9LCB0cnVlKVxcbiAgfSBlbHNlIHtcXG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpXFxuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgbnVsbCwgdHJ1ZSlcXG4gIH1cXG4gIGBgYFxcbi0gIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJykg5omn6KGMIGJlZm9yZUNyZWF0ZSDlh73mlbBcXG5cXG4tICBpbml0SW5qZWN0aW9ucyh2bSkg5pS26ZuG5rOo5YWl55qE5L6d6LWWXFxuYGBgXFxuICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5qZWN0KHZtLiRvcHRpb25zLmluamVjdCwgdm0pXFxuICBpZiAocmVzdWx0KSB7XFxuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSlcXG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGtleSA9PiB7XFxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcXG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCAoKSA9PiB7XFxuICAgICAgICAgIHdhcm4oXFxuICAgICAgICAgIFxcdGDpgb/lhY3nm7TmjqXmlLnlj5jms6jlhaXnmoTlgLzvvIzlm6DkuLrlsIbkvJrph43mlrDmuLLmn5PmiYDmj5Dkvpvov5nkuKrlgLznmoTnu4Tku7YsIFxcbiAgICAgICAgICBcXHTmlLnlj5jnmoTlgLzmmK86IFxcXCIke2tleX1cXFwiLFxcbiAgICAgICAgICAgIHZtXFxuICAgICAgICAgIClcXG4gICAgICAgIH0pXFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldKVxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpXFxuYGBgXFxuLSBpbml0U3RhdGUg55uR5ZCs5YC85pS26ZuG5L6d6LWWXFxuYGBgXFxuICB2bS5fd2F0Y2hlcnMgPSBbXVxcbiAgY29uc3Qgb3B0cyA9IHZtLiRvcHRpb25zXFxuICBpZiAob3B0cy5wcm9wcykgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKSAvLyDotYvlgLwgcHJvcHMg5pWw5o2u5bm25pS26ZuG5L6d6LWWXFxuICBpZiAob3B0cy5tZXRob2RzKSBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKSAvLyDotYvlgLwgdnVlIOeahOWQhOS4qiBtZXRob2RcXG4gIGlmIChvcHRzLmRhdGEpIHtcXG4gICAgaW5pdERhdGEodm0pIC8vIOaUtumbhuS+nei1llxcbiAgfSBlbHNlIHtcXG4gICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pXFxuICB9XFxuICBpZiAob3B0cy5jb21wdXRlZCkgaW5pdENvbXB1dGVkKHZtLCBvcHRzLmNvbXB1dGVkKSAvLyDmlLbpm4bkvp3otZZcXG4gIGlmIChvcHRzLndhdGNoICYmIG9wdHMud2F0Y2ggIT09IG5hdGl2ZVdhdGNoKSB7XFxuICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCkgLy8g5Yid5aeL5YyW5L2g5YaZ55qE55uR5ZCs5a+56LGhXFxuICB9XFxuIFxcbmBgYFxcbi0gaW5pdFByb3ZpZGVcXG5gYGBcXG4gIGNvbnN0IHByb3ZpZGUgPSB2bS4kb3B0aW9ucy5wcm92aWRlXFxuICBpZiAocHJvdmlkZSkge1xcbiAgICB2bS5fcHJvdmlkZWQgPSB0eXBlb2YgcHJvdmlkZSA9PT0gJ2Z1bmN0aW9uJ1xcbiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKVxcbiAgICAgIDogcHJvdmlkZVxcbiAgfVxcbmBgYFxcbi0gIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpIOaJp+ihjCBjcmVhdGVkIOWHveaVsFxcblxcbj7ov5nlsLHmmK8gX2luaXQg5Lit5ZCE5Liq5Ye95pWw5omA5YGa55qE5LqG44CCIOaIkeS7rOWPr+S7peeci+WIsOaAu+e7k+i/h+adpeWwseaYr1xcbjEu5Yid5aeL5YyW5LqG55Sf5ZG954q25oCBXFxuMi7ov5vooYzkuovku7bkuIrnmoTnm5HlkKxcXG4zLua4suafk+inhuWbvueahOWIneWni+WMlu+8m+aUtumbhuaJgOeUqOWIsOeahOeItue7hOS7tueahOaVsOaNruaIluS6i+S7tlxcbjQu6LCD55So5L2g5YaZ55qEIGJlZm9yZUNyZWF0ZSDmlrnms5VcXG41LmluaXRTdGF0ZSwg5aSE55CG5LqGIHZ1ZSDkuK3nmoTlkITnp43mlbDmja4ocHJvcHMvZGF0YS9tZXRob2RzLi4uLi4pLCDkuZ/lnKjov5nkuIDmraXpkojlr7nov5nkupvmlbDmja7ov5vooYzkuobkvp3otZbmlLbpm4bvvIzmlbDmja7mm7TmlrDnu5HlrppcXG42LuWIneWni+WMluS6hiBwcm92aWRlIOeahOWAvO+8jCDkuZ/lj6/ku6XnnIvlh7rlroPmsqHmnInooqvmlLbpm4bkvp3otZbvvIwg5piv5LiN5Lya5b2x5ZON6KeG5Zu+5pS55Y+Y55qEXFxuNy7osIPnlKjkuobkvaDlhpnnmoQgY3JlYXRlZCDmlrnms5XkuobjgIJcXG5cXG7ku6XkuIrvvIzlsLHmmK/kvaAgbGV0IGFwcCA9IG5ldyBWdWUoKSDov5nkuIDmraXmiYDlj5HnlJ/nmoTmiYDmnInkuovmg4XkuobjgIJcXG5cXG5cXG7pgqPpgJrov4flubPml7bnmoTkvb/nlKjmiJHku6znn6XpgZPvvIzmiJHku6zmmK/pgJrov4fosIPnlKggJG1vdW50ZWQg6IO95oqK5a6D5oyC6L295LiK6aG16Z2i44CC5omA5Lul5o6l5LiL5p2l5oiR5Lus5bCx5Y+v5Lul5p2l55yL55yLIHZ1ZSDoh6rlt7HnmoQgJG1vdW50IOmDveWBmuS6huS6m+S7gOS5iD9cXG5cXG7nrZQ6IOWwseaYr+aKiiB0ZW1wbGF0ZSDmiJbnm7TmjqXlhpnnmoQgcmVuZGVyIOWHveaVsO+8jOi/m+ihjOaMh+S7pOOAgeS6i+S7tuetiXZ1ZSDkuK3nmoTor63ms5Xop6PmnpDnvJbor5HmiJDkuIDkuKogQVNUIOagkeOAgumAmui/h+i/meS4quagke+8jOmAmui/h+S5i+WJjSBpbml0UmVuZGVyIOS4reeahCAkY3JlYXRlRWxlbWVudCDmlrnms5Xlj6/ku6XnlJ/miJDomZrmi59ET00sIOeEtuWQjua3u+WKoOWIsOmhtemdouS4reWHuu+8jOS4jeWwsea4suafk+WHuuadpeS6huS5iOOAgiDlpoLmnpzlpKflrrbkvb/nlKjov4cgVnVlIOeahCAkY3JlYXRlRWxlbWVudCDmlrnms5XvvIznm7jkv6HlsLHnn6XpgZPov5nkuKogYXN0IOaYr+aAjuS5iOS4gOS4que7k+aehOS6hu+8jOaLv+ekuuS+i+eahOadpeivtFxcbmBgYFxcbmNyZWF0ZUVsZW1lbnQoXFxuICAnZGl2JyxcXG4gIFtcXG4gICAgJ+WFiOWGmeS4gOS6m+aWh+WtlycsXFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2gxJywgJ+S4gOWImeWktOadoScpLFxcbiAgICBjcmVhdGVFbGVtZW50KE15Q29tcG9uZW50LCB7XFxuICAgICAgcHJvcHM6IHtcXG4gICAgICAgIHNvbWVQcm9wOiAnZm9vYmFyJ1xcbiAgICAgIH1cXG4gICAgfSlcXG4gIF1cXG4pXFxuYGBgXFxuXFxuLS0tXFxu6K+05a6M5LqG5pW05Liq6L+H56iL77yM546w5Zyo6L+Y5q+U6L6D55aR5oOR55qE5bCx5piv5a6D55qE5pS26ZuG5L6d6LWW77yM54S25ZCO5pWw5o2u5pS55Y+Y5byV6LW355qE6KeG5Zu+5pS55Y+Y5Yiw5bqV5oCO5LmI5YGa5ZGi77yfXFxuXFxu5Lmf5bCx5piv6K+05oiR5Lus6KaB5a6e546w5LiA5Liq5qih5byP77yMdm0g5Y+v6IO9IGRhdGEg5a+56LGh5Lit55qE5LiA5Liq5YC877yM5q+U5aaCIG5hbWUg5pS55Y+Y5LqG77yM54S25ZCO5bCx6LCD55So6YeN5paw5riy5p+T55qE5Ye95pWw77yM6L+Z6YeM5Li65LqG5oCn6IO977yM5piv55Sf5oiQ5LqG5LiA5Liq6Jma5oufIERvbSwg54S25ZCO5q+U6L6D5ZOq6YeM5pS55Y+Y5LqG6L+b6KGM55u45bqU55qE5pu/5o2i44CCIFxcbuaKiui/meS4quaooeW8j+aKveixoeWHuuadpe+8jOWwseaYr+aIkeS7rOmcgOimgeS4gOS4qiBcXG5cXG7lhYjor7TlhbfkvZPlrp7njrDvvJog5oiR5Lus6KeG5Zu+5pu05paw5L6d6LWW5Yiw55qE5YC85pS26ZuG6LW35p2l77yM6L+Z6YeM5oqK5q+P5LiA5Liq5L6d6LWW5Yiw55qE5YC856ew5L2cIGRlcOOAguavj+S4quS+nei1luiuoumYheS4juWug+acieWFs+eahCB2dWUg55qEIHdhdGNoZXIg5Lit5b+D77yMIOi/memHjOaKiiBkZXAg5omA6K6i6ZiF55qEIHdhdGNoZXIg5Y+r5YGaIHN1YuOAgiDpgqPkuYggZGVwIOiiq+aUueWPmOeahOaXtuWAme+8jOiOt+WPluWug+iuoumYheS6humCo+S6myB3YXRjaGVy77yMIOmAmuefpeS7luS7rOi/m+ihjCB1cGRhdGUg6KeG5Zu+5ZWm44CCXFxuXFxu5Y+v5Lul55yL5oiR55S755qE566A5Zu+XFxuIVvlnKjov5nph4zmj5LlhaXlm77niYfmj4/ov7BdKGh0dHBzOi8vaS1ibG9nLmNzZG5pbWcuY24vYmxvZ19taWdyYXRlLzQxN2MyMzA4OGNiMDIyNGM2YTQ0NjQ2NTE0NTJjNjA0LnBuZylcXG4hW+WcqOi/memHjOaPkuWFpeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNTljMGU3NmY2ODQwNTJkZjUyNDc2MWVlOGY0ZjY5NDIucG5nKVxcblxcbui/meWwseaYr+S+nei1luWvueixoSDlkowg5LiA5LiqIHdhdGNoZXIg5a+56LGh5omA5raJ5Y+K5Yiw55qE5aSE55CG5LqG44CCXFxuVnVlIOS4reWPiOaYr+aAjuS5iOaKiuS4gOS4quS4queahOWxnuaAp++8jOi/m+ihjOaTjeS9nOWPmOaIkOS+nei1lueahOWRou+8n1xcbuWvueW6lOWug+eahOa6kOeggeWwseaYryBkZWZpbmVSZWFjdGl2ZSDmlrnms5XjgILmupDnoIHlpoLlm77vvJpcXG5gYGBcXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUgKG9iaiwga2V5LCB2YWwsIGN1c3RvbVNldHRlciwgc2hhbGxvdykge1xcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXFxuICBcXG4gIC8vIOi/juWQiOmihOWumuS5ieeahGdldHRlciAvIHNldHRlclxcbiAgY29uc3QgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0XFxuICBjb25zdCBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXRcXG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcXG4gICAgdmFsID0gb2JqW2tleV1cXG4gIH1cXG4gIFxcbiAgbGV0IGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKHZhbClcXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXFxuICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIgKCkge1xcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxcbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XFxuICAgICAgICBkZXAuZGVwZW5kKClcXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XFxuICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpXFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICAgIHJldHVybiB2YWx1ZVxcbiAgICB9LFxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcXG4gICAgICBjb25zdCB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWxcXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xcbiAgICAgICAgcmV0dXJuXFxuICAgICAgfVxcbiAgICAgIGlmIChzZXR0ZXIpIHtcXG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKVxcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB2YWwgPSBuZXdWYWxcXG4gICAgICB9XFxuICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKVxcbiAgICAgIGRlcC5ub3RpZnkoKVxcbiAgICB9XFxuICB9KVxcbn1cXG5gYGBcXG7ov5nph4zlsLHmmK/nlKjnmoQgT2JqZWN0LmRlZmluZVByb3BlcnR5IOaWueazle+8jOWug+WPr+S7pemHjeWGmeWvueixoeeahOWxnuaAp+eahCBnZXQg5ZKMIHNldCDmlrnms5XjgIIg5b2T6L+Z5Liq5bGe5oCn5ZyoIFZ1ZSDkuK3ooqvojrflj5bnmoTml7blgJnvvIzlsLHlvIDlp4vmlLbpm4bkvp3otZbvvIzmiorlroPmlLbpm4blnKjov5nkuKogdm0g55qEIHdhdGNoZXIg5Lit5b+D77yM5bm25LiU6K6p5a6D6K6i6ZiF6L+Z5LiqIHdhdGNoZXIg44CC5b2T6L+Z5Liq5bGe5oCn6KKr6YeN5paw6K6+572u5pe277yMIOWwsemAmuefpeWug+aJgOiuoumYheeahOWvueixoeWOu+abtOaWsOOAglxcblxcbuWkp+iHtOimgeefpemBk+eahOWwseaYr+i/meS6m+S6huOAguWFs+S6juWFt+S9k+aYr+aAjuS5iOWunueOsOaKiiB0ZW1wbGF0ZSAg57yW6K+R5oiQIGFzdCDmoJHvvIwg5YW35L2T5piv5oCO5LmI5oqK5LqL5Lu257uR5a6a5LiK5Y6755qE77yM5L2g5Y+v5Lul5bC95oOF55qE5Y6754yc5oOz5ZKM5o6o5rWL77yM5oiW6ICF5Y6755yL55yL5YW35L2T55qE5a6e546w5pa55byP44CC5L2G5pivIFZVRSDmoYbmnrbmgLvkvZPmnaXor7TmiYDlgZrnmoTlsLHmmK/ov5nkupvkuovmg4XkuoYsIOWmguaenOacieinieW+l+acrOaWh+WGmeeahOS4jea4healmueahOWcsOaWueWPr+S7peaPkOWTiCA9ID1cXG5cIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/27.bundle.js b/27.bundle.js deleted file mode 100644 index 32add2f..0000000 --- a/27.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[27],{27:function(e,o,p){p.r(o),p.d(o,{default:function(){return a}});var c=p(358);const t={class:"component-webpack"},s={};var a=(0,p(389).A)(s,[["render",function(e,o){return(0,c.uX)(),(0,c.CE)("div",t,o[0]||(o[0]=[(0,c.Fv)('

一 webpack 是什么?

它是一个打包工具。 噗,完啦?

来,我们看官方概念: webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),此依赖图会映射项目所需的每个模块,并生成一个或多个 bundle。

内部如何构建一个依赖图,我们知道 webpack 会配置一个入口,这就是从这入口文件开始, 找到所有被依赖到的文件,比如其他 js / image / json 文件等,然后通过 loader 对这些文件进行处理、编译、打包、优化,生成一个 bundle 或者多个 bundle。

它的原理

通过以上,主要就是找依赖, 通过配置处理相应环境,根据你的需要配置插件进行优化(如 profill、babel、 miniSize etc) 打包出文件,可以放到服务器上运行。

关于找依赖,可以想到关于模块化的语法: import 、require、@import etc, 通过解析对应的语法寻找相应的依赖。然后通过读取依赖到的文件,根据对应的 loader 进行处理文件,最后根据你的插件配置,分割,压缩或注入等,根据 output config输出到对应的文件夹。

这里推荐一篇 webpack原理 文章, 下面就提一提我最近遇到的一个很神奇的问题吧

关于 tree shaking

想象抖一抖树,枯萎的叶子就会脱落。 这里指的是把没有用到的代码删除掉,从而减小文件的大小。通过这一优化,在引用多个第三方库时,能够大大的减少你的文件大小,但请确定这个包是没有副作用的。

什么是副作用? 就是在导入时会自行运行一段函数,从而改变了 window 变量啊或者其他的变量以供导入的包能正常运行, 而不是只单单 export 了变量。

它是依赖于 es2015 的 静态导入导出( import / export)。在打包时就会通过 import 确定引用包的 export 导出的某一个变量之一, 在告知没有副作用的情况下,删除掉没有用到的其他的导出代码。

静态导入是指一开始就默认加载这个文件,而不是一步一步执行代码判断逻辑,去导入对应文件

webpack 在生成环境下,默认打开树抖动配置, 如下配置。

optimization: {\n\tprovidedExports: true,\n\tusedExports: true,\n\tsideEffects: true,\n\tconcatenateModules: true,\n }\n

providedExports 开启 export 导出收集; usedExportts 告诉webpack确定每个模块的已使用导出; concatenateModules 告诉webpack查找模块图的各个部分,这些部分可以安全地连接成一个模块; sideEffects 告诉webpack识别 sideEffects 标志的 package.json 或规则以跳过模块,这些模块在未使用导出时被标记为不包含副作用, 则可以把无副作用的未使用的导出进行删除。

所以如果你的包无副作用,推荐在 package.json 设置 sideEffects: false 开启树抖动。 注意, 它会删掉样式文件,因为样式文件是没有 export 的。所以我们需要声明样式文件是有副作用的。 在 package.json 中设置:

sideEffects: [\n\t'*.css'\n]\n

总结,为了利用树木摇晃,你必须: 1 使用ES2015模块语法 (配置 babel 禁止转义 es6 模块语义) 2 将"sideEffects"属性添加到项目的 package.json文件中。 3 配合压缩工具一起使用

demo 通过配置 webpack.prod.js sideEffects 值, 你可以看到 build 时 main.js 文件的大小发生改变。

',20)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiIyS0FBZUEsTUFBTSxxQkNDZkMsRUFBUyxDQUFDLEVBS2hCLE9BRmlDLEUsT0FBQSxHQUFnQkEsRUFBUSxDQUFDLENBQUMsUyxnQ0RKakRDLEVBQUFBLEVBQUFBLElBNkNKLE1BN0NJQyxFQTZDSkMsRUFBQSxLQUFBQSxFQUFBLEtBN0NOQyxFQUFBQSxFQUFBQSxJQUFBLGlxRSIsInNvdXJjZXMiOlsid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi93ZWJwYWNrLm1kIiwid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi93ZWJwYWNrLm1kPzZiN2YiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPjxkaXYgY2xhc3M9XCJjb21wb25lbnQtd2VicGFja1wiPjxoND7kuIAgIHdlYnBhY2sg5piv5LuA5LmI77yfPC9oND5cbjxwPuWug+aYr+S4gOS4quaJk+WMheW3peWFt+OAgiDlmZfvvIzlrozllabvvJ88L3A+XG48cD7mnaXvvIzmiJHku6znnIvlrpjmlrnmpoLlv7U6ICB3ZWJwYWNrIOaYr+S4gOS4queOsOS7oyBKYXZhU2NyaXB0IOW6lOeUqOeoi+W6j+eahOmdmeaAgeaooeWdl+aJk+WMheW3peWFt+OAguW9kyB3ZWJwYWNrIOWkhOeQhuW6lOeUqOeoi+W6j+aXtu+8jOWug+S8muWcqOWGhemDqOaehOW7uuS4gOS4qiDkvp3otZblm74oZGVwZW5kZW5jeSBncmFwaCnvvIzmraTkvp3otZblm77kvJrmmKDlsITpobnnm67miYDpnIDnmoTmr4/kuKrmqKHlnZfvvIzlubbnlJ/miJDkuIDkuKrmiJblpJrkuKogYnVuZGxl44CCPC9wPlxuPHA+5YaF6YOo5aaC5L2V5p6E5bu65LiA5Liq5L6d6LWW5Zu+77yM5oiR5Lus55+l6YGTIHdlYnBhY2sg5Lya6YWN572u5LiA5Liq5YWl5Y+j77yM6L+Z5bCx5piv5LuO6L+Z5YWl5Y+j5paH5Lu25byA5aeL77yMIOaJvuWIsOaJgOacieiiq+S+nei1luWIsOeahOaWh+S7tu+8jOavlOWmguWFtuS7liBqcyAvIGltYWdlIC8ganNvbiDmlofku7bnrYnvvIznhLblkI7pgJrov4cgbG9hZGVyIOWvuei/meS6m+aWh+S7tui/m+ihjOWkhOeQhuOAgee8luivkeOAgeaJk+WMheOAgeS8mOWMlu+8jOeUn+aIkOS4gOS4qiBidW5kbGUg5oiW6ICF5aSa5LiqIGJ1bmRsZeOAgjwvcD5cbjxoND7lroPnmoTljp/nkIY8L2g0PlxuPHA+6YCa6L+H5Lul5LiK77yM5Li76KaB5bCx5piv5om+5L6d6LWWLCDpgJrov4fphY3nva7lpITnkIbnm7jlupTnjq/looPvvIzmoLnmja7kvaDnmoTpnIDopoHphY3nva7mj5Lku7bov5vooYzkvJjljJbvvIjlpoIgcHJvZmlsbOOAgWJhYmVs44CBIG1pbmlTaXplIGV0Yykg5omT5YyF5Ye65paH5Lu277yM5Y+v5Lul5pS+5Yiw5pyN5Yqh5Zmo5LiK6L+Q6KGM44CCPC9wPlxuPHA+5YWz5LqO5om+5L6d6LWW77yM5Y+v5Lul5oOz5Yiw5YWz5LqO5qih5Z2X5YyW55qE6K+t5rOVOiBpbXBvcnQg44CBcmVxdWlyZeOAgUBpbXBvcnQgZXRj77yMIOmAmui/h+ino+aekOWvueW6lOeahOivreazleWvu+aJvuebuOW6lOeahOS+nei1luOAgueEtuWQjumAmui/h+ivu+WPluS+nei1luWIsOeahOaWh+S7tu+8jOagueaNruWvueW6lOeahCBsb2FkZXIg6L+b6KGM5aSE55CG5paH5Lu277yM5pyA5ZCO5qC55o2u5L2g55qE5o+S5Lu26YWN572u77yM5YiG5Ymy77yM5Y6L57yp5oiW5rOo5YWl562J77yM5qC55o2uIG91dHB1dCBjb25maWfovpPlh7rliLDlr7nlupTnmoTmlofku7blpLnjgII8L3A+XG48cD7ov5nph4zmjqjojZDkuIDnr4cgPGEgaHJlZj1cImh0dHBzOi8vanVlamluLmltL2VudHJ5LzViMGUzZWJhNTE4ODI1MTUzNDM3OTYxNVwiPndlYnBhY2vljp/nkIY8L2E+IOaWh+eroCwg5LiL6Z2i5bCx5o+Q5LiA5o+Q5oiR5pyA6L+R6YGH5Yiw55qE5LiA5Liq5b6I56We5aWH55qE6Zeu6aKY5ZCnPC9wPlxuPGg0PuWFs+S6jiA8YSBocmVmPVwiaHR0cHM6Ly93ZWJwYWNrLmRvY3NjaGluYS5vcmcvZ3VpZGVzL3RyZWUtc2hha2luZy9cIj50cmVlIHNoYWtpbmc8L2E+PC9oND5cbjxwPuaDs+ixoeaKluS4gOaKluagke+8jOaer+iQjueahOWPtuWtkOWwseS8muiEseiQveOAgiDov5nph4zmjIfnmoTmmK/miormsqHmnInnlKjliLDnmoTku6PnoIHliKDpmaTmjonvvIzku47ogIzlh4/lsI/mlofku7bnmoTlpKflsI/jgILpgJrov4fov5nkuIDkvJjljJbvvIzlnKjlvJXnlKjlpJrkuKrnrKzkuInmlrnlupPml7bvvIzog73lpJ/lpKflpKfnmoTlh4/lsJHkvaDnmoTmlofku7blpKflsI/vvIzkvYbor7fnoa7lrprov5nkuKrljIXmmK/msqHmnInlia/kvZznlKjnmoTjgII8L3A+XG48YmxvY2txdW90ZT5cbjxwPuS7gOS5iOaYr+WJr+S9nOeUqD9cbuWwseaYr+WcqOWvvOWFpeaXtuS8muiHquihjOi/kOihjOS4gOauteWHveaVsO+8jOS7juiAjOaUueWPmOS6hiB3aW5kb3cg5Y+Y6YeP5ZWK5oiW6ICF5YW25LuW55qE5Y+Y6YeP5Lul5L6b5a+85YWl55qE5YyF6IO95q2j5bi46L+Q6KGM77yMIOiAjOS4jeaYr+WPquWNleWNlSBleHBvcnQg5LqG5Y+Y6YeP44CCPC9wPlxuPC9ibG9ja3F1b3RlPlxuPHA+5a6D5piv5L6d6LWW5LqOIGVzMjAxNSDnmoQgPGNvZGU+6Z2Z5oCB5a+85YWl5a+85Ye6KCBpbXBvcnQgLyBleHBvcnQpPC9jb2RlPuOAguWcqOaJk+WMheaXtuWwseS8mumAmui/hyBpbXBvcnQg56Gu5a6a5byV55So5YyF55qEIGV4cG9ydCDlr7zlh7rnmoTmn5DkuIDkuKrlj5jph4/kuYvkuIDvvIwg5Zyo5ZGK55+l5rKh5pyJ5Ymv5L2c55So55qE5oOF5Ya15LiL77yM5Yig6Zmk5o6J5rKh5pyJ55So5Yiw55qE5YW25LuW55qE5a+85Ye65Luj56CB44CCPC9wPlxuPGJsb2NrcXVvdGU+XG48cD7pnZnmgIHlr7zlhaXmmK/mjIfkuIDlvIDlp4vlsLHpu5jorqTliqDovb3ov5nkuKrmlofku7bvvIzogIzkuI3mmK/kuIDmraXkuIDmraXmiafooYzku6PnoIHliKTmlq3pgLvovpHvvIzljrvlr7zlhaXlr7nlupTmlofku7Y8L3A+XG48L2Jsb2NrcXVvdGU+XG48cD53ZWJwYWNrIOWcqOeUn+aIkOeOr+Wig+S4i++8jOm7mOiupOaJk+W8gOagkeaKluWKqOmFjee9riwg5aaC5LiL6YWN572u44CCPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPm9wdGltaXphdGlvbu+8miB7XG5cdHByb3ZpZGVkRXhwb3J0czogdHJ1ZSxcblx0dXNlZEV4cG9ydHM6IHRydWUsXG5cdHNpZGVFZmZlY3RzOiB0cnVlLFxuXHRjb25jYXRlbmF0ZU1vZHVsZXM6IHRydWUsXG4gfVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+cHJvdmlkZWRFeHBvcnRzPC9jb2RlPiDlvIDlkK8gZXhwb3J0IOWvvOWHuuaUtumbhu+8m1xuPGNvZGU+IHVzZWRFeHBvcnR0czwvY29kZT4g5ZGK6K+Jd2VicGFja+ehruWumuavj+S4quaooeWdl+eahOW3suS9v+eUqOWvvOWHuu+8m1xuPGNvZGU+IGNvbmNhdGVuYXRlTW9kdWxlczwvY29kZT4gIOWRiuiviXdlYnBhY2vmn6Xmib7mqKHlnZflm77nmoTlkITkuKrpg6jliIbvvIzov5nkupvpg6jliIblj6/ku6XlronlhajlnLDov57mjqXmiJDkuIDkuKrmqKHlnZfvvJtcbjxjb2RlPnNpZGVFZmZlY3RzPC9jb2RlPiDlkYror4l3ZWJwYWNr6K+G5YirIHNpZGVFZmZlY3RzIOagh+W/l+eahCBwYWNrYWdlLmpzb24g5oiW6KeE5YiZ5Lul6Lez6L+H5qih5Z2X77yM6L+Z5Lqb5qih5Z2X5Zyo5pyq5L2/55So5a+85Ye65pe26KKr5qCH6K6w5Li65LiN5YyF5ZCr5Ymv5L2c55So77yMIOWImeWPr+S7peaKiuaXoOWJr+S9nOeUqOeahOacquS9v+eUqOeahOWvvOWHuui/m+ihjOWIoOmZpOOAgjwvcD5cbjxwPuaJgOS7peWmguaenOS9oOeahOWMheaXoOWJr+S9nOeUqO+8jOaOqOiNkOWcqCBwYWNrYWdlLmpzb24g6K6+572uIDxjb2RlPnNpZGVFZmZlY3RzOiBmYWxzZTwvY29kZT4g5byA5ZCv5qCR5oqW5Yqo44CCXG7ms6jmhI8sIOWug+S8muWIoOaOieagt+W8j+aWh+S7tu+8jOWboOS4uuagt+W8j+aWh+S7tuaYr+ayoeaciSBleHBvcnQg55qE44CC5omA5Lul5oiR5Lus6ZyA6KaB5aOw5piO5qC35byP5paH5Lu25piv5pyJ5Ymv5L2c55So55qE44CCXG7lnKggcGFja2FnZS5qc29uIOS4reiuvue9ru+8mjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5zaWRlRWZmZWN0czogW1xuXHQnKi5jc3MnXG5dXG48L2NvZGU+PC9wcmU+XG48YmxvY2txdW90ZT5cbjxwPuaAu+e7k++8jOS4uuS6huWIqeeUqOagkeacqOaRh+aZg++8jOS9oOW/hemhu++8mlxuMSDkvb/nlKhFUzIwMTXmqKHlnZfor63ms5UgKOmFjee9riBiYWJlbCDnpoHmraLovazkuYkgZXM2IOaooeWdl+ivreS5ie+8iVxuMiDlsIZcInNpZGVFZmZlY3RzXCLlsZ7mgKfmt7vliqDliLDpobnnm67nmoQgcGFja2FnZS5qc29u5paH5Lu25Lit44CCXG4zIOmFjeWQiOWOi+e8qeW3peWFt+S4gOi1t+S9v+eUqDwvcD5cbjwvYmxvY2txdW90ZT5cbjxwPjxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvdHJlZS1zaGFraW5nLWNzc1wiPmRlbW88L2E+XG7pgJrov4fphY3nva4gIDxjb2RlPndlYnBhY2sucHJvZC5qczwvY29kZT4gc2lkZUVmZmVjdHMg5YC877yMIOS9oOWPr+S7peeci+WIsCBidWlsZCDml7YgbWFpbi5qcyDmlofku7bnmoTlpKflsI/lj5HnlJ/mlLnlj5jjgII8L3A+XG48L2Rpdj48L3RlbXBsYXRlPiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL3dlYnBhY2subWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzE4NWVhYzBcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4zX3Z1ZUAzLjUuM190eXBlc2NyaXB0QDUuNS40X193ZWJwYWNrQDUuOTQuMF93ZWJwYWNrLV9mdXFrd2dncGxoZXkzb2l2dHdlMnN0ZG82ZS9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/160.bundle.js b/330.bundle.js similarity index 77% rename from 160.bundle.js rename to 330.bundle.js index 21505f4..d3e3f07 100644 --- a/160.bundle.js +++ b/330.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[160],{160:function(s,t,e){e.r(t),e.d(t,{default:function(){return u}});var h=e(358);const c={class:"component-postcss-plugin"},o={};var u=(0,e(389).A)(o,[["render",function(s,t){return(0,h.uX)(),(0,h.CE)("div",c,t[0]||(t[0]=[(0,h.Fv)('

写 css 遇到了问题怎么办?

如何让 css 写的更轻松?

postcss-ui-theme,让你实现类 sass 语法,一个插件就能做到!

如何改变 css 主题 ?

postcss-ui-theme , 可打包 css4 变量被保留,不仅可在引用时直接使用新的变量文件覆盖改变主题,还可以通过 js 进行更改!!!

css 在别的项目被编译,文件路径找不到?

postcss-ui-theme, 集成 postcss-assets 插件,通过配置 文件查找路径,解决引用文件找不到问题!!

postcss-ui-theme 插件,就是你的 css 管理方案的最佳选择! 点 star 收藏!!! 茫茫前端路,你真的会用到它的!

',8)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYwLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sNEJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQVFKLE1BUklDLEVBUUpDLEVBQUEsS0FBQUEsRUFBQSxLQVJOQyxFQUFBQSxFQUFBQSxJQUFBLDZuQiIsInNvdXJjZXMiOlsid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi9wb3N0Y3NzLXBsdWdpbi5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vcG9zdGNzcy1wbHVnaW4ubWQ/ZDZjZCJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+PGRpdiBjbGFzcz1cImNvbXBvbmVudC1wb3N0Y3NzLXBsdWdpblwiPjxoMj7lhpkgY3NzIOmBh+WIsOS6humXrumimOaAjuS5iOWKnu+8nzwvaDI+XG48aDM+5aaC5L2V6K6pIGNzcyDlhpnnmoTmm7Tovbvmnb7vvJ88L2gzPlxuPGg0PjxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZVwiPnBvc3Rjc3MtdWktdGhlbWU8L2E+77yM6K6p5L2g5a6e546w57G7IHNhc3Mg6K+t5rOV77yM5LiA5Liq5o+S5Lu25bCx6IO95YGa5Yiw77yBPC9oND5cbjxoMz7lpoLkvZXmlLnlj5ggY3NzIOS4u+mimCDvvJ88L2gzPlxuPGg0PjxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZVwiPnBvc3Rjc3MtdWktdGhlbWUgPC9hPu+8jCDlj6/miZPljIUgY3NzNCDlj5jph4/ooqvkv53nlZnvvIzkuI3ku4Xlj6/lnKjlvJXnlKjml7bnm7TmjqXkvb/nlKjmlrDnmoTlj5jph4/mlofku7bopobnm5bmlLnlj5jkuLvpopjvvIzov5jlj6/ku6XpgJrov4cganMg6L+b6KGM5pu05pS577yB77yB77yBPC9oND5cbjxoMz5jc3Mg5Zyo5Yir55qE6aG555uu6KKr57yW6K+R77yM5paH5Lu26Lev5b6E5om+5LiN5Yiw77yfPC9oMz5cbjxoND48YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3Bvc3Rjc3MtdWktdGhlbWVcIj5wb3N0Y3NzLXVpLXRoZW1lPC9hPu+8jCDpm4bmiJAgcG9zdGNzcy1hc3NldHMg5o+S5Lu277yM6YCa6L+H6YWN572uIOaWh+S7tuafpeaJvui3r+W+hO+8jOino+WGs+W8leeUqOaWh+S7tuaJvuS4jeWIsOmXrumimO+8ge+8gTwvaDQ+XG48aDM+PGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9jbGV2ZXJib3kzMi9wb3N0Y3NzLXVpLXRoZW1lXCI+cG9zdGNzcy11aS10aGVtZTwvYT4g5o+S5Lu277yM5bCx5piv5L2g55qEIGNzcyDnrqHnkIbmlrnmoYjnmoTmnIDkvbPpgInmi6khIOeCuSBzdGFyIOaUtuiXj++8ge+8ge+8gSDojKvojKvliY3nq6/ot6/vvIzkvaDnnJ/nmoTkvJrnlKjliLDlroPnmoTvvIE8L2gzPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi9wb3N0Y3NzLXBsdWdpbi5tZD92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xNTcwNmIzNVwiXG5jb25zdCBzY3JpcHQgPSB7fVxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdnVlLWxvYWRlckAxNy40LjJfQHZ1ZStjb21waWxlci1zZmNAMy41LjNfdnVlQDMuNS4zX3R5cGVzY3JpcHRANS41LjRfX3dlYnBhY2tANS45NC4wX3dlYnBhY2stX2Z1cWt3Z2dwbGhleTNvaXZ0d2Uyc3RkbzZlL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ3JlbmRlcicscmVuZGVyXV0pXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbImNsYXNzIiwic2NyaXB0IiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfY2FjaGUiLCJfY3JlYXRlU3RhdGljVk5vZGUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[330],{330:function(s,t,e){e.r(t),e.d(t,{default:function(){return u}});var h=e(762);const c={class:"component-postcss-plugin"},o={};var u=(0,e(314).A)(o,[["render",function(s,t){return(0,h.uX)(),(0,h.CE)("div",c,t[0]||(t[0]=[(0,h.Fv)('

写 css 遇到了问题怎么办?

如何让 css 写的更轻松?

postcss-ui-theme,让你实现类 sass 语法,一个插件就能做到!

如何改变 css 主题 ?

postcss-ui-theme , 可打包 css4 变量被保留,不仅可在引用时直接使用新的变量文件覆盖改变主题,还可以通过 js 进行更改!!!

css 在别的项目被编译,文件路径找不到?

postcss-ui-theme, 集成 postcss-assets 插件,通过配置 文件查找路径,解决引用文件找不到问题!!

postcss-ui-theme 插件,就是你的 css 管理方案的最佳选择! 点 star 收藏!!! 茫茫前端路,你真的会用到它的!

',8)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMwLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sNEJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQVFKLE1BUklDLEVBUUpDLEVBQUEsS0FBQUEsRUFBQSxLQVJOQyxFQUFBQSxFQUFBQSxJQUFBLDZuQiIsInNvdXJjZXMiOlsid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi9wb3N0Y3NzLXBsdWdpbi5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vcG9zdGNzcy1wbHVnaW4ubWQ/NDU4NCJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+PGRpdiBjbGFzcz1cImNvbXBvbmVudC1wb3N0Y3NzLXBsdWdpblwiPjxoMj7lhpkgY3NzIOmBh+WIsOS6humXrumimOaAjuS5iOWKnu+8nzwvaDI+XG48aDM+5aaC5L2V6K6pIGNzcyDlhpnnmoTmm7Tovbvmnb7vvJ88L2gzPlxuPGg0PjxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZVwiPnBvc3Rjc3MtdWktdGhlbWU8L2E+77yM6K6p5L2g5a6e546w57G7IHNhc3Mg6K+t5rOV77yM5LiA5Liq5o+S5Lu25bCx6IO95YGa5Yiw77yBPC9oND5cbjxoMz7lpoLkvZXmlLnlj5ggY3NzIOS4u+mimCDvvJ88L2gzPlxuPGg0PjxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZVwiPnBvc3Rjc3MtdWktdGhlbWUgPC9hPu+8jCDlj6/miZPljIUgY3NzNCDlj5jph4/ooqvkv53nlZnvvIzkuI3ku4Xlj6/lnKjlvJXnlKjml7bnm7TmjqXkvb/nlKjmlrDnmoTlj5jph4/mlofku7bopobnm5bmlLnlj5jkuLvpopjvvIzov5jlj6/ku6XpgJrov4cganMg6L+b6KGM5pu05pS577yB77yB77yBPC9oND5cbjxoMz5jc3Mg5Zyo5Yir55qE6aG555uu6KKr57yW6K+R77yM5paH5Lu26Lev5b6E5om+5LiN5Yiw77yfPC9oMz5cbjxoND48YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3Bvc3Rjc3MtdWktdGhlbWVcIj5wb3N0Y3NzLXVpLXRoZW1lPC9hPu+8jCDpm4bmiJAgcG9zdGNzcy1hc3NldHMg5o+S5Lu277yM6YCa6L+H6YWN572uIOaWh+S7tuafpeaJvui3r+W+hO+8jOino+WGs+W8leeUqOaWh+S7tuaJvuS4jeWIsOmXrumimO+8ge+8gTwvaDQ+XG48aDM+PGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9jbGV2ZXJib3kzMi9wb3N0Y3NzLXVpLXRoZW1lXCI+cG9zdGNzcy11aS10aGVtZTwvYT4g5o+S5Lu277yM5bCx5piv5L2g55qEIGNzcyDnrqHnkIbmlrnmoYjnmoTmnIDkvbPpgInmi6khIOeCuSBzdGFyIOaUtuiXj++8ge+8ge+8gSDojKvojKvliY3nq6/ot6/vvIzkvaDnnJ/nmoTkvJrnlKjliLDlroPnmoTvvIE8L2gzPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi9wb3N0Y3NzLXBsdWdpbi5tZD92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xNTcwNmIzNVwiXG5jb25zdCBzY3JpcHQgPSB7fVxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdnVlLWxvYWRlckAxNy40LjJfQHZ1ZStjb21waWxlci1zZmNAMy41LjEyX3Z1ZUAzLjUuMTJfdHlwZXNjcmlwdEA1LjYuM19fd2VicGFja0A1Ljk1LjBfd2VicGFjay1jbGlANS4xLjRfL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ3JlbmRlcicscmVuZGVyXV0pXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbImNsYXNzIiwic2NyaXB0IiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfY2FjaGUiLCJfY3JlYXRlU3RhdGljVk5vZGUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/351.bundle.js b/351.bundle.js new file mode 100644 index 0000000..8c76edb --- /dev/null +++ b/351.bundle.js @@ -0,0 +1,2 @@ +(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[351],{1528:function(t){(function(){var e,r,i,n,s,a;"undefined"!=typeof performance&&null!==performance&&performance.now?t.exports=function(){return performance.now()}:"undefined"!=typeof process&&null!==process&&process.hrtime?(t.exports=function(){return(e()-s)/1e6},r=process.hrtime,n=(e=function(){var t;return 1e9*(t=r())[0]+t[1]})(),a=1e9*process.uptime(),s=n-a):Date.now?(t.exports=function(){return Date.now()-i},i=Date.now()):(t.exports=function(){return(new Date).getTime()-i},i=(new Date).getTime())}).call(this)},542:(t,e,r)=>{for(var i=r(1528),n="undefined"==typeof window?r.g:window,s=["moz","webkit"],a="AnimationFrame",o=n["request"+a],u=n["cancel"+a]||n["cancelRequest"+a],h=0;!o&&h{t.exports=function(t){this.ok=!1,this.alpha=1,"#"==t.charAt(0)&&(t=t.substr(1,6)),t=(t=t.replace(/ /g,"")).toLowerCase();var e={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};t=e[t]||t;for(var r=[{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,example:["rgba(123, 234, 45, 0.8)","rgba(255,234,245,1.0)"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3]),parseFloat(t[4])]}},{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,example:["#00ff00","336699"],process:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,example:["#fb0","f0f"],process:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}],i=0;i3&&(this.alpha=o[3]),this.ok=!0}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"},this.toHex=function(){var t=this.r.toString(16),e=this.g.toString(16),r=this.b.toString(16);return 1==t.length&&(t="0"+t),1==e.length&&(e="0"+e),1==r.length&&(r="0"+r),"#"+t+e+r},this.getHelpXML=function(){for(var t=new Array,i=0;i "+h.toRGB()+" -> "+h.toHex());u.appendChild(c),u.appendChild(l),o.appendChild(u)}catch(t){}return o}}},2121:(t,e,r)=>{"use strict";var i=r(3220),n=r(8542),s=TypeError;t.exports=function(t){if(i(t))return t;throw new s(n(t)+" is not a function")}},8009:(t,e,r)=>{"use strict";var i=r(1962),n=r(8542),s=TypeError;t.exports=function(t){if(i(t))return t;throw new s(n(t)+" is not a constructor")}},4833:(t,e,r)=>{"use strict";var i=r(8528),n=String,s=TypeError;t.exports=function(t){if(i(t))return t;throw new s("Can't set "+n(t)+" as a prototype")}},9754:(t,e,r)=>{"use strict";var i=r(7234),n=r(689),s=r(6634).f,a=i("unscopables"),o=Array.prototype;void 0===o[a]&&s(o,a,{configurable:!0,value:n(null)}),t.exports=function(t){o[a][t]=!0}},4322:(t,e,r)=>{"use strict";var i=r(4332).charAt;t.exports=function(t,e,r){return e+(r?i(t,e).length:1)}},5766:(t,e,r)=>{"use strict";var i=r(2346),n=TypeError;t.exports=function(t,e){if(i(e,t))return t;throw new n("Incorrect invocation")}},2338:(t,e,r)=>{"use strict";var i=r(1367),n=String,s=TypeError;t.exports=function(t){if(i(t))return t;throw new s(n(t)+" is not an object")}},4746:(t,e,r)=>{"use strict";var i=r(9671),n=r(4043),s=r(2645),a=function(t){return function(e,r,a){var o=i(e),u=s(o);if(0===u)return!t&&-1;var h,c=n(a,u);if(t&&r!=r){for(;u>c;)if((h=o[c++])!=h)return!0}else for(;u>c;c++)if((t||c in o)&&o[c]===r)return t||c||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},1613:(t,e,r)=>{"use strict";var i=r(922);t.exports=function(t,e){var r=[][t];return!!r&&i((function(){r.call(null,e||function(){return 1},1)}))}},8605:(t,e,r)=>{"use strict";var i=r(2121),n=r(1076),s=r(9688),a=r(2645),o=TypeError,u="Reduce of empty array with no initial value",h=function(t){return function(e,r,h,c){var l=n(e),f=s(l),g=a(l);if(i(r),0===g&&h<2)throw new o(u);var p=t?g-1:0,d=t?-1:1;if(h<2)for(;;){if(p in f){c=f[p],p+=d;break}if(p+=d,t?p<0:g<=p)throw new o(u)}for(;t?p>=0:g>p;p+=d)p in f&&(c=r(c,f[p],p,l));return c}};t.exports={left:h(!1),right:h(!0)}},3801:(t,e,r)=>{"use strict";var i=r(2505);t.exports=i([].slice)},9819:(t,e,r)=>{"use strict";var i=r(7234)("iterator"),n=!1;try{var s=0,a={next:function(){return{done:!!s++}},return:function(){n=!0}};a[i]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,e){try{if(!e&&!n)return!1}catch(t){return!1}var r=!1;try{var s={};s[i]=function(){return{next:function(){return{done:r=!0}}}},t(s)}catch(t){}return r}},9913:(t,e,r)=>{"use strict";var i=r(2505),n=i({}.toString),s=i("".slice);t.exports=function(t){return s(n(t),8,-1)}},5526:(t,e,r)=>{"use strict";var i=r(9785),n=r(3220),s=r(9913),a=r(7234)("toStringTag"),o=Object,u="Arguments"===s(function(){return arguments}());t.exports=i?s:function(t){var e,r,i;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=o(t),a))?r:u?s(e):"Object"===(i=s(e))&&n(e.callee)?"Arguments":i}},393:(t,e,r)=>{"use strict";var i=r(1354),n=r(2568),s=r(9056),a=r(6634);t.exports=function(t,e,r){for(var o=n(e),u=a.f,h=s.f,c=0;c{"use strict";var i=r(7234)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(r){try{return e[i]=!1,"/./"[t](e)}catch(t){}}return!1}},976:(t,e,r)=>{"use strict";var i=r(922);t.exports=!i((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},6187:t=>{"use strict";t.exports=function(t,e){return{value:t,done:e}}},320:(t,e,r)=>{"use strict";var i=r(6101),n=r(6634),s=r(2475);t.exports=i?function(t,e,r){return n.f(t,e,s(1,r))}:function(t,e,r){return t[e]=r,t}},2475:t=>{"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},7085:(t,e,r)=>{"use strict";var i=r(3434),n=r(6634);t.exports=function(t,e,r){return r.get&&i(r.get,e,{getter:!0}),r.set&&i(r.set,e,{setter:!0}),n.f(t,e,r)}},9405:(t,e,r)=>{"use strict";var i=r(3220),n=r(6634),s=r(3434),a=r(2454);t.exports=function(t,e,r,o){o||(o={});var u=o.enumerable,h=void 0!==o.name?o.name:e;if(i(r)&&s(r,h,o),o.global)u?t[e]=r:a(e,r);else{try{o.unsafe?t[e]&&(u=!0):delete t[e]}catch(t){}u?t[e]=r:n.f(t,e,{value:r,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return t}},2454:(t,e,r)=>{"use strict";var i=r(2917),n=Object.defineProperty;t.exports=function(t,e){try{n(i,t,{value:e,configurable:!0,writable:!0})}catch(r){i[t]=e}return e}},6101:(t,e,r)=>{"use strict";var i=r(922);t.exports=!i((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},1038:(t,e,r)=>{"use strict";var i=r(2917),n=r(1367),s=i.document,a=n(s)&&n(s.createElement);t.exports=function(t){return a?s.createElement(t):{}}},5450:t=>{"use strict";t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},3295:(t,e,r)=>{"use strict";var i=r(1038)("span").classList,n=i&&i.constructor&&i.constructor.prototype;t.exports=n===Object.prototype?void 0:n},9858:t=>{"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},9776:(t,e,r)=>{"use strict";var i=r(4388);t.exports=/ipad|iphone|ipod/i.test(i)&&"undefined"!=typeof Pebble},9891:(t,e,r)=>{"use strict";var i=r(4388);t.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(i)},5196:(t,e,r)=>{"use strict";var i=r(8174);t.exports="NODE"===i},3649:(t,e,r)=>{"use strict";var i=r(4388);t.exports=/web0s(?!.*chrome)/i.test(i)},4388:(t,e,r)=>{"use strict";var i=r(2917).navigator,n=i&&i.userAgent;t.exports=n?String(n):""},5048:(t,e,r)=>{"use strict";var i,n,s=r(2917),a=r(4388),o=s.process,u=s.Deno,h=o&&o.versions||u&&u.version,c=h&&h.v8;c&&(n=(i=c.split("."))[0]>0&&i[0]<4?1:+(i[0]+i[1])),!n&&a&&(!(i=a.match(/Edge\/(\d+)/))||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/))&&(n=+i[1]),t.exports=n},8174:(t,e,r)=>{"use strict";var i=r(2917),n=r(4388),s=r(9913),a=function(t){return n.slice(0,t.length)===t};t.exports=a("Bun/")?"BUN":a("Cloudflare-Workers")?"CLOUDFLARE":a("Deno/")?"DENO":a("Node.js/")?"NODE":i.Bun&&"string"==typeof Bun.version?"BUN":i.Deno&&"object"==typeof Deno.version?"DENO":"process"===s(i.process)?"NODE":i.window&&i.document?"BROWSER":"REST"},7637:(t,e,r)=>{"use strict";var i=r(2917),n=r(9056).f,s=r(320),a=r(9405),o=r(2454),u=r(393),h=r(7425);t.exports=function(t,e){var r,c,l,f,g,p=t.target,d=t.global,v=t.stat;if(r=d?i:v?i[p]||o(p,{}):i[p]&&i[p].prototype)for(c in e){if(f=e[c],l=t.dontCallGetSet?(g=n(r,c))&&g.value:r[c],!h(d?c:p+(v?".":"#")+c,t.forced)&&void 0!==l){if(typeof f==typeof l)continue;u(f,l)}(t.sham||l&&l.sham)&&s(f,"sham",!0),a(r,c,f,t)}}},922:t=>{"use strict";t.exports=function(t){try{return!!t()}catch(t){return!0}}},699:(t,e,r)=>{"use strict";r(5856);var i=r(3840),n=r(9405),s=r(9078),a=r(922),o=r(7234),u=r(320),h=o("species"),c=RegExp.prototype;t.exports=function(t,e,r,l){var f=o(t),g=!a((function(){var e={};return e[f]=function(){return 7},7!==""[t](e)})),p=g&&!a((function(){var e=!1,r=/a/;return"split"===t&&((r={}).constructor={},r.constructor[h]=function(){return r},r.flags="",r[f]=/./[f]),r.exec=function(){return e=!0,null},r[f](""),!e}));if(!g||!p||r){var d=/./[f],v=e(f,""[t],(function(t,e,r,n,a){var o=e.exec;return o===s||o===c.exec?g&&!a?{done:!0,value:i(d,e,r,n)}:{done:!0,value:i(t,r,e,n)}:{done:!1}}));n(String.prototype,t,v[0]),n(c,f,v[1])}l&&u(c[f],"sham",!0)}},9422:(t,e,r)=>{"use strict";var i=r(8615),n=Function.prototype,s=n.apply,a=n.call;t.exports="object"==typeof Reflect&&Reflect.apply||(i?a.bind(s):function(){return a.apply(s,arguments)})},6869:(t,e,r)=>{"use strict";var i=r(6771),n=r(2121),s=r(8615),a=i(i.bind);t.exports=function(t,e){return n(t),void 0===e?t:s?a(t,e):function(){return t.apply(e,arguments)}}},8615:(t,e,r)=>{"use strict";var i=r(922);t.exports=!i((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},3840:(t,e,r)=>{"use strict";var i=r(8615),n=Function.prototype.call;t.exports=i?n.bind(n):function(){return n.apply(n,arguments)}},7415:(t,e,r)=>{"use strict";var i=r(6101),n=r(1354),s=Function.prototype,a=i&&Object.getOwnPropertyDescriptor,o=n(s,"name"),u=o&&"something"===function(){}.name,h=o&&(!i||i&&a(s,"name").configurable);t.exports={EXISTS:o,PROPER:u,CONFIGURABLE:h}},9513:(t,e,r)=>{"use strict";var i=r(2505),n=r(2121);t.exports=function(t,e,r){try{return i(n(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(t){}}},6771:(t,e,r)=>{"use strict";var i=r(9913),n=r(2505);t.exports=function(t){if("Function"===i(t))return n(t)}},2505:(t,e,r)=>{"use strict";var i=r(8615),n=Function.prototype,s=n.call,a=i&&n.bind.bind(s,s);t.exports=i?a:function(t){return function(){return s.apply(t,arguments)}}},5084:(t,e,r)=>{"use strict";var i=r(2917),n=r(3220);t.exports=function(t,e){return arguments.length<2?(r=i[t],n(r)?r:void 0):i[t]&&i[t][e];var r}},554:(t,e,r)=>{"use strict";var i=r(5526),n=r(7977),s=r(9606),a=r(6404),o=r(7234)("iterator");t.exports=function(t){if(!s(t))return n(t,o)||n(t,"@@iterator")||a[i(t)]}},3206:(t,e,r)=>{"use strict";var i=r(3840),n=r(2121),s=r(2338),a=r(8542),o=r(554),u=TypeError;t.exports=function(t,e){var r=arguments.length<2?o(t):e;if(n(r))return s(i(r,t));throw new u(a(t)+" is not iterable")}},7977:(t,e,r)=>{"use strict";var i=r(2121),n=r(9606);t.exports=function(t,e){var r=t[e];return n(r)?void 0:i(r)}},3329:(t,e,r)=>{"use strict";var i=r(2505),n=r(1076),s=Math.floor,a=i("".charAt),o=i("".replace),u=i("".slice),h=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,c=/\$([$&'`]|\d{1,2})/g;t.exports=function(t,e,r,i,l,f){var g=r+t.length,p=i.length,d=c;return void 0!==l&&(l=n(l),d=h),o(f,d,(function(n,o){var h;switch(a(o,0)){case"$":return"$";case"&":return t;case"`":return u(e,0,r);case"'":return u(e,g);case"<":h=l[u(o,1,-1)];break;default:var c=+o;if(0===c)return n;if(c>p){var f=s(c/10);return 0===f?n:f<=p?void 0===i[f-1]?a(o,1):i[f-1]+a(o,1):n}h=i[c-1]}return void 0===h?"":h}))}},2917:function(t,e,r){"use strict";var i=function(t){return t&&t.Math===Math&&t};t.exports=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof r.g&&r.g)||i("object"==typeof this&&this)||function(){return this}()||Function("return this")()},1354:(t,e,r)=>{"use strict";var i=r(2505),n=r(1076),s=i({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return s(n(t),e)}},3788:t=>{"use strict";t.exports={}},6050:t=>{"use strict";t.exports=function(t,e){try{1===arguments.length?console.error(t):console.error(t,e)}catch(t){}}},9098:(t,e,r)=>{"use strict";var i=r(5084);t.exports=i("document","documentElement")},2046:(t,e,r)=>{"use strict";var i=r(6101),n=r(922),s=r(1038);t.exports=!i&&!n((function(){return 7!==Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},9688:(t,e,r)=>{"use strict";var i=r(2505),n=r(922),s=r(9913),a=Object,o=i("".split);t.exports=n((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===s(t)?o(t,""):a(t)}:a},733:(t,e,r)=>{"use strict";var i=r(2505),n=r(3220),s=r(5982),a=i(Function.toString);n(s.inspectSource)||(s.inspectSource=function(t){return a(t)}),t.exports=s.inspectSource},2038:(t,e,r)=>{"use strict";var i,n,s,a=r(9825),o=r(2917),u=r(1367),h=r(320),c=r(1354),l=r(5982),f=r(5408),g=r(3788),p="Object already initialized",d=o.TypeError,v=o.WeakMap;if(a||l.state){var y=l.state||(l.state=new v);y.get=y.get,y.has=y.has,y.set=y.set,i=function(t,e){if(y.has(t))throw new d(p);return e.facade=t,y.set(t,e),e},n=function(t){return y.get(t)||{}},s=function(t){return y.has(t)}}else{var m=f("state");g[m]=!0,i=function(t,e){if(c(t,m))throw new d(p);return e.facade=t,h(t,m,e),e},n=function(t){return c(t,m)?t[m]:{}},s=function(t){return c(t,m)}}t.exports={set:i,get:n,has:s,enforce:function(t){return s(t)?n(t):i(t,{})},getterFor:function(t){return function(e){var r;if(!u(e)||(r=n(e)).type!==t)throw new d("Incompatible receiver, "+t+" required");return r}}}},5546:(t,e,r)=>{"use strict";var i=r(7234),n=r(6404),s=i("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||a[s]===t)}},3959:(t,e,r)=>{"use strict";var i=r(9913);t.exports=Array.isArray||function(t){return"Array"===i(t)}},3220:t=>{"use strict";var e="object"==typeof document&&document.all;t.exports=void 0===e&&void 0!==e?function(t){return"function"==typeof t||t===e}:function(t){return"function"==typeof t}},1962:(t,e,r)=>{"use strict";var i=r(2505),n=r(922),s=r(3220),a=r(5526),o=r(5084),u=r(733),h=function(){},c=o("Reflect","construct"),l=/^\s*(?:class|function)\b/,f=i(l.exec),g=!l.test(h),p=function(t){if(!s(t))return!1;try{return c(h,[],t),!0}catch(t){return!1}},d=function(t){if(!s(t))return!1;switch(a(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return g||!!f(l,u(t))}catch(t){return!0}};d.sham=!0,t.exports=!c||n((function(){var t;return p(p.call)||!p(Object)||!p((function(){t=!0}))||t}))?d:p},7425:(t,e,r)=>{"use strict";var i=r(922),n=r(3220),s=/#|\.prototype\./,a=function(t,e){var r=u[o(t)];return r===c||r!==h&&(n(e)?i(e):!!e)},o=a.normalize=function(t){return String(t).replace(s,".").toLowerCase()},u=a.data={},h=a.NATIVE="N",c=a.POLYFILL="P";t.exports=a},9606:t=>{"use strict";t.exports=function(t){return null==t}},1367:(t,e,r)=>{"use strict";var i=r(3220);t.exports=function(t){return"object"==typeof t?null!==t:i(t)}},8528:(t,e,r)=>{"use strict";var i=r(1367);t.exports=function(t){return i(t)||null===t}},8366:t=>{"use strict";t.exports=!1},4113:(t,e,r)=>{"use strict";var i=r(1367),n=r(9913),s=r(7234)("match");t.exports=function(t){var e;return i(t)&&(void 0!==(e=t[s])?!!e:"RegExp"===n(t))}},9051:(t,e,r)=>{"use strict";var i=r(5084),n=r(3220),s=r(2346),a=r(8617),o=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=i("Symbol");return n(e)&&s(e.prototype,o(t))}},1617:(t,e,r)=>{"use strict";var i=r(6869),n=r(3840),s=r(2338),a=r(8542),o=r(5546),u=r(2645),h=r(2346),c=r(3206),l=r(554),f=r(7535),g=TypeError,p=function(t,e){this.stopped=t,this.result=e},d=p.prototype;t.exports=function(t,e,r){var v,y,m,x,b,w,S,T=r&&r.that,O=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_RECORD),C=!(!r||!r.IS_ITERATOR),E=!(!r||!r.INTERRUPTED),P=i(e,T),N=function(t){return v&&f(v,"normal",t),new p(!0,t)},M=function(t){return O?(s(t),E?P(t[0],t[1],N):P(t[0],t[1])):E?P(t,N):P(t)};if(A)v=t.iterator;else if(C)v=t;else{if(!(y=l(t)))throw new g(a(t)+" is not iterable");if(o(y)){for(m=0,x=u(t);x>m;m++)if((b=M(t[m]))&&h(d,b))return b;return new p(!1)}v=c(t,y)}for(w=A?t.next:v.next;!(S=n(w,v)).done;){try{b=M(S.value)}catch(t){f(v,"throw",t)}if("object"==typeof b&&b&&h(d,b))return b}return new p(!1)}},7535:(t,e,r)=>{"use strict";var i=r(3840),n=r(2338),s=r(7977);t.exports=function(t,e,r){var a,o;n(t);try{if(!(a=s(t,"return"))){if("throw"===e)throw r;return r}a=i(a,t)}catch(t){o=!0,a=t}if("throw"===e)throw r;if(o)throw a;return n(a),r}},8655:(t,e,r)=>{"use strict";var i=r(7466).IteratorPrototype,n=r(689),s=r(2475),a=r(7938),o=r(6404),u=function(){return this};t.exports=function(t,e,r,h){var c=e+" Iterator";return t.prototype=n(i,{next:s(+!h,r)}),a(t,c,!1,!0),o[c]=u,t}},4537:(t,e,r)=>{"use strict";var i=r(7637),n=r(3840),s=r(8366),a=r(7415),o=r(3220),u=r(8655),h=r(18),c=r(5798),l=r(7938),f=r(320),g=r(9405),p=r(7234),d=r(6404),v=r(7466),y=a.PROPER,m=a.CONFIGURABLE,x=v.IteratorPrototype,b=v.BUGGY_SAFARI_ITERATORS,w=p("iterator"),S="keys",T="values",O="entries",A=function(){return this};t.exports=function(t,e,r,a,p,v,C){u(r,e,a);var E,P,N,M=function(t){if(t===p&&I)return I;if(!b&&t&&t in V)return V[t];switch(t){case S:case T:case O:return function(){return new r(this,t)}}return function(){return new r(this)}},R=e+" Iterator",_=!1,V=t.prototype,k=V[w]||V["@@iterator"]||p&&V[p],I=!b&&k||M(p),L="Array"===e&&V.entries||k;if(L&&(E=h(L.call(new t)))!==Object.prototype&&E.next&&(s||h(E)===x||(c?c(E,x):o(E[w])||g(E,w,A)),l(E,R,!0,!0),s&&(d[R]=A)),y&&p===T&&k&&k.name!==T&&(!s&&m?f(V,"name",T):(_=!0,I=function(){return n(k,this)})),p)if(P={values:M(T),keys:v?I:M(S),entries:M(O)},C)for(N in P)(b||_||!(N in V))&&g(V,N,P[N]);else i({target:e,proto:!0,forced:b||_},P);return s&&!C||V[w]===I||g(V,w,I,{name:p}),d[e]=I,P}},7466:(t,e,r)=>{"use strict";var i,n,s,a=r(922),o=r(3220),u=r(1367),h=r(689),c=r(18),l=r(9405),f=r(7234),g=r(8366),p=f("iterator"),d=!1;[].keys&&("next"in(s=[].keys())?(n=c(c(s)))!==Object.prototype&&(i=n):d=!0),!u(i)||a((function(){var t={};return i[p].call(t)!==t}))?i={}:g&&(i=h(i)),o(i[p])||l(i,p,(function(){return this})),t.exports={IteratorPrototype:i,BUGGY_SAFARI_ITERATORS:d}},6404:t=>{"use strict";t.exports={}},2645:(t,e,r)=>{"use strict";var i=r(5139);t.exports=function(t){return i(t.length)}},3434:(t,e,r)=>{"use strict";var i=r(2505),n=r(922),s=r(3220),a=r(1354),o=r(6101),u=r(7415).CONFIGURABLE,h=r(733),c=r(2038),l=c.enforce,f=c.get,g=String,p=Object.defineProperty,d=i("".slice),v=i("".replace),y=i([].join),m=o&&!n((function(){return 8!==p((function(){}),"length",{value:8}).length})),x=String(String).split("String"),b=t.exports=function(t,e,r){"Symbol("===d(g(e),0,7)&&(e="["+v(g(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),r&&r.getter&&(e="get "+e),r&&r.setter&&(e="set "+e),(!a(t,"name")||u&&t.name!==e)&&(o?p(t,"name",{value:e,configurable:!0}):t.name=e),m&&r&&a(r,"arity")&&t.length!==r.arity&&p(t,"length",{value:r.arity});try{r&&a(r,"constructor")&&r.constructor?o&&p(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var i=l(t);return a(i,"source")||(i.source=y(x,"string"==typeof e?e:"")),t};Function.prototype.toString=b((function(){return s(this)&&f(this).source||h(this)}),"toString")},9862:t=>{"use strict";var e=Math.ceil,r=Math.floor;t.exports=Math.trunc||function(t){var i=+t;return(i>0?r:e)(i)}},4486:(t,e,r)=>{"use strict";var i,n,s,a,o,u=r(2917),h=r(8316),c=r(6869),l=r(3450).set,f=r(6448),g=r(9891),p=r(9776),d=r(3649),v=r(5196),y=u.MutationObserver||u.WebKitMutationObserver,m=u.document,x=u.process,b=u.Promise,w=h("queueMicrotask");if(!w){var S=new f,T=function(){var t,e;for(v&&(t=x.domain)&&t.exit();e=S.get();)try{e()}catch(t){throw S.head&&i(),t}t&&t.enter()};g||v||d||!y||!m?!p&&b&&b.resolve?((a=b.resolve(void 0)).constructor=b,o=c(a.then,a),i=function(){o(T)}):v?i=function(){x.nextTick(T)}:(l=c(l,u),i=function(){l(T)}):(n=!0,s=m.createTextNode(""),new y(T).observe(s,{characterData:!0}),i=function(){s.data=n=!n}),w=function(t){S.head||i(),S.add(t)}}t.exports=w},1452:(t,e,r)=>{"use strict";var i=r(2121),n=TypeError,s=function(t){var e,r;this.promise=new t((function(t,i){if(void 0!==e||void 0!==r)throw new n("Bad Promise constructor");e=t,r=i})),this.resolve=i(e),this.reject=i(r)};t.exports.f=function(t){return new s(t)}},2108:(t,e,r)=>{"use strict";var i=r(4113),n=TypeError;t.exports=function(t){if(i(t))throw new n("The method doesn't accept regular expressions");return t}},689:(t,e,r)=>{"use strict";var i,n=r(2338),s=r(4854),a=r(9858),o=r(3788),u=r(9098),h=r(1038),c=r(5408),l="prototype",f="script",g=c("IE_PROTO"),p=function(){},d=function(t){return"<"+f+">"+t+""},v=function(t){t.write(d("")),t.close();var e=t.parentWindow.Object;return t=null,e},y=function(){try{i=new ActiveXObject("htmlfile")}catch(t){}var t,e,r;y="undefined"!=typeof document?document.domain&&i?v(i):(e=h("iframe"),r="java"+f+":",e.style.display="none",u.appendChild(e),e.src=String(r),(t=e.contentWindow.document).open(),t.write(d("document.F=Object")),t.close(),t.F):v(i);for(var n=a.length;n--;)delete y[l][a[n]];return y()};o[g]=!0,t.exports=Object.create||function(t,e){var r;return null!==t?(p[l]=n(t),r=new p,p[l]=null,r[g]=t):r=y(),void 0===e?r:s.f(r,e)}},4854:(t,e,r)=>{"use strict";var i=r(6101),n=r(891),s=r(6634),a=r(2338),o=r(9671),u=r(1321);e.f=i&&!n?Object.defineProperties:function(t,e){a(t);for(var r,i=o(e),n=u(e),h=n.length,c=0;h>c;)s.f(t,r=n[c++],i[r]);return t}},6634:(t,e,r)=>{"use strict";var i=r(6101),n=r(2046),s=r(891),a=r(2338),o=r(1216),u=TypeError,h=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l="enumerable",f="configurable",g="writable";e.f=i?s?function(t,e,r){if(a(t),e=o(e),a(r),"function"==typeof t&&"prototype"===e&&"value"in r&&g in r&&!r[g]){var i=c(t,e);i&&i[g]&&(t[e]=r.value,r={configurable:f in r?r[f]:i[f],enumerable:l in r?r[l]:i[l],writable:!1})}return h(t,e,r)}:h:function(t,e,r){if(a(t),e=o(e),a(r),n)try{return h(t,e,r)}catch(t){}if("get"in r||"set"in r)throw new u("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},9056:(t,e,r)=>{"use strict";var i=r(6101),n=r(3840),s=r(2216),a=r(2475),o=r(9671),u=r(1216),h=r(1354),c=r(2046),l=Object.getOwnPropertyDescriptor;e.f=i?l:function(t,e){if(t=o(t),e=u(e),c)try{return l(t,e)}catch(t){}if(h(t,e))return a(!n(s.f,t,e),t[e])}},6149:(t,e,r)=>{"use strict";var i=r(1883),n=r(9858).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return i(t,n)}},6708:(t,e)=>{"use strict";e.f=Object.getOwnPropertySymbols},18:(t,e,r)=>{"use strict";var i=r(1354),n=r(3220),s=r(1076),a=r(5408),o=r(976),u=a("IE_PROTO"),h=Object,c=h.prototype;t.exports=o?h.getPrototypeOf:function(t){var e=s(t);if(i(e,u))return e[u];var r=e.constructor;return n(r)&&e instanceof r?r.prototype:e instanceof h?c:null}},2346:(t,e,r)=>{"use strict";var i=r(2505);t.exports=i({}.isPrototypeOf)},1883:(t,e,r)=>{"use strict";var i=r(2505),n=r(1354),s=r(9671),a=r(4746).indexOf,o=r(3788),u=i([].push);t.exports=function(t,e){var r,i=s(t),h=0,c=[];for(r in i)!n(o,r)&&n(i,r)&&u(c,r);for(;e.length>h;)n(i,r=e[h++])&&(~a(c,r)||u(c,r));return c}},1321:(t,e,r)=>{"use strict";var i=r(1883),n=r(9858);t.exports=Object.keys||function(t){return i(t,n)}},2216:(t,e)=>{"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,n=i&&!r.call({1:2},1);e.f=n?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},5798:(t,e,r)=>{"use strict";var i=r(9513),n=r(1367),s=r(2861),a=r(4833);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,r={};try{(t=i(Object.prototype,"__proto__","set"))(r,[]),e=r instanceof Array}catch(t){}return function(r,i){return s(r),a(i),n(r)?(e?t(r,i):r.__proto__=i,r):r}}():void 0)},3671:(t,e,r)=>{"use strict";var i=r(3840),n=r(3220),s=r(1367),a=TypeError;t.exports=function(t,e){var r,o;if("string"===e&&n(r=t.toString)&&!s(o=i(r,t)))return o;if(n(r=t.valueOf)&&!s(o=i(r,t)))return o;if("string"!==e&&n(r=t.toString)&&!s(o=i(r,t)))return o;throw new a("Can't convert object to primitive value")}},2568:(t,e,r)=>{"use strict";var i=r(5084),n=r(2505),s=r(6149),a=r(6708),o=r(2338),u=n([].concat);t.exports=i("Reflect","ownKeys")||function(t){var e=s.f(o(t)),r=a.f;return r?u(e,r(t)):e}},8994:t=>{"use strict";t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},2653:(t,e,r)=>{"use strict";var i=r(2917),n=r(7005),s=r(3220),a=r(7425),o=r(733),u=r(7234),h=r(8174),c=r(8366),l=r(5048),f=n&&n.prototype,g=u("species"),p=!1,d=s(i.PromiseRejectionEvent),v=a("Promise",(function(){var t=o(n),e=t!==String(n);if(!e&&66===l)return!0;if(c&&(!f.catch||!f.finally))return!0;if(!l||l<51||!/native code/.test(t)){var r=new n((function(t){t(1)})),i=function(t){t((function(){}),(function(){}))};if((r.constructor={})[g]=i,!(p=r.then((function(){}))instanceof i))return!0}return!(e||"BROWSER"!==h&&"DENO"!==h||d)}));t.exports={CONSTRUCTOR:v,REJECTION_EVENT:d,SUBCLASSING:p}},7005:(t,e,r)=>{"use strict";var i=r(2917);t.exports=i.Promise},4539:(t,e,r)=>{"use strict";var i=r(2338),n=r(1367),s=r(1452);t.exports=function(t,e){if(i(t),n(e)&&e.constructor===t)return e;var r=s.f(t);return(0,r.resolve)(e),r.promise}},1356:(t,e,r)=>{"use strict";var i=r(7005),n=r(9819),s=r(2653).CONSTRUCTOR;t.exports=s||!n((function(t){i.all(t).then(void 0,(function(){}))}))},6448:t=>{"use strict";var e=function(){this.head=null,this.tail=null};e.prototype={add:function(t){var e={item:t,next:null},r=this.tail;r?r.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}},t.exports=e},8153:(t,e,r)=>{"use strict";var i=r(3840),n=r(2338),s=r(3220),a=r(9913),o=r(9078),u=TypeError;t.exports=function(t,e){var r=t.exec;if(s(r)){var h=i(r,t,e);return null!==h&&n(h),h}if("RegExp"===a(t))return i(o,t,e);throw new u("RegExp#exec called on incompatible receiver")}},9078:(t,e,r)=>{"use strict";var i,n,s=r(3840),a=r(2505),o=r(4530),u=r(1772),h=r(1104),c=r(1394),l=r(689),f=r(2038).get,g=r(956),p=r(1849),d=c("native-string-replace",String.prototype.replace),v=RegExp.prototype.exec,y=v,m=a("".charAt),x=a("".indexOf),b=a("".replace),w=a("".slice),S=(n=/b*/g,s(v,i=/a/,"a"),s(v,n,"a"),0!==i.lastIndex||0!==n.lastIndex),T=h.BROKEN_CARET,O=void 0!==/()??/.exec("")[1];(S||O||T||g||p)&&(y=function(t){var e,r,i,n,a,h,c,g=this,p=f(g),A=o(t),C=p.raw;if(C)return C.lastIndex=g.lastIndex,e=s(y,C,A),g.lastIndex=C.lastIndex,e;var E=p.groups,P=T&&g.sticky,N=s(u,g),M=g.source,R=0,_=A;if(P&&(N=b(N,"y",""),-1===x(N,"g")&&(N+="g"),_=w(A,g.lastIndex),g.lastIndex>0&&(!g.multiline||g.multiline&&"\n"!==m(A,g.lastIndex-1))&&(M="(?: "+M+")",_=" "+_,R++),r=new RegExp("^(?:"+M+")",N)),O&&(r=new RegExp("^"+M+"$(?!\\s)",N)),S&&(i=g.lastIndex),n=s(v,P?r:g,_),P?n?(n.input=w(n.input,R),n[0]=w(n[0],R),n.index=g.lastIndex,g.lastIndex+=n[0].length):g.lastIndex=0:S&&n&&(g.lastIndex=g.global?n.index+n[0].length:i),O&&n&&n.length>1&&s(d,n[0],r,(function(){for(a=1;a{"use strict";var i=r(2338);t.exports=function(){var t=i(this),e="";return t.hasIndices&&(e+="d"),t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.unicodeSets&&(e+="v"),t.sticky&&(e+="y"),e}},4337:(t,e,r)=>{"use strict";var i=r(3840),n=r(1354),s=r(2346),a=r(1772),o=RegExp.prototype;t.exports=function(t){var e=t.flags;return void 0!==e||"flags"in o||n(t,"flags")||!s(o,t)?e:i(a,t)}},1104:(t,e,r)=>{"use strict";var i=r(922),n=r(2917).RegExp,s=i((function(){var t=n("a","y");return t.lastIndex=2,null!==t.exec("abcd")})),a=s||i((function(){return!n("a","y").sticky})),o=s||i((function(){var t=n("^r","gy");return t.lastIndex=2,null!==t.exec("str")}));t.exports={BROKEN_CARET:o,MISSED_STICKY:a,UNSUPPORTED_Y:s}},956:(t,e,r)=>{"use strict";var i=r(922),n=r(2917).RegExp;t.exports=i((function(){var t=n(".","s");return!(t.dotAll&&t.test("\n")&&"s"===t.flags)}))},1849:(t,e,r)=>{"use strict";var i=r(922),n=r(2917).RegExp;t.exports=i((function(){var t=n("(?b)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")}))},2861:(t,e,r)=>{"use strict";var i=r(9606),n=TypeError;t.exports=function(t){if(i(t))throw new n("Can't call method on "+t);return t}},8316:(t,e,r)=>{"use strict";var i=r(2917),n=r(6101),s=Object.getOwnPropertyDescriptor;t.exports=function(t){if(!n)return i[t];var e=s(i,t);return e&&e.value}},6212:(t,e,r)=>{"use strict";var i=r(5084),n=r(7085),s=r(7234),a=r(6101),o=s("species");t.exports=function(t){var e=i(t);a&&e&&!e[o]&&n(e,o,{configurable:!0,get:function(){return this}})}},7938:(t,e,r)=>{"use strict";var i=r(6634).f,n=r(1354),s=r(7234)("toStringTag");t.exports=function(t,e,r){t&&!r&&(t=t.prototype),t&&!n(t,s)&&i(t,s,{configurable:!0,value:e})}},5408:(t,e,r)=>{"use strict";var i=r(1394),n=r(5433),s=i("keys");t.exports=function(t){return s[t]||(s[t]=n(t))}},5982:(t,e,r)=>{"use strict";var i=r(8366),n=r(2917),s=r(2454),a="__core-js_shared__",o=t.exports=n[a]||s(a,{});(o.versions||(o.versions=[])).push({version:"3.38.1",mode:i?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE",source:"https://github.com/zloirock/core-js"})},1394:(t,e,r)=>{"use strict";var i=r(5982);t.exports=function(t,e){return i[t]||(i[t]=e||{})}},9207:(t,e,r)=>{"use strict";var i=r(2338),n=r(8009),s=r(9606),a=r(7234)("species");t.exports=function(t,e){var r,o=i(t).constructor;return void 0===o||s(r=i(o)[a])?e:n(r)}},4332:(t,e,r)=>{"use strict";var i=r(2505),n=r(304),s=r(4530),a=r(2861),o=i("".charAt),u=i("".charCodeAt),h=i("".slice),c=function(t){return function(e,r){var i,c,l=s(a(e)),f=n(r),g=l.length;return f<0||f>=g?t?"":void 0:(i=u(l,f))<55296||i>56319||f+1===g||(c=u(l,f+1))<56320||c>57343?t?o(l,f):i:t?h(l,f,f+2):c-56320+(i-55296<<10)+65536}};t.exports={codeAt:c(!1),charAt:c(!0)}},2401:(t,e,r)=>{"use strict";var i=r(7415).PROPER,n=r(922),s=r(4081);t.exports=function(t){return n((function(){return!!s[t]()||"​…᠎"!=="​…᠎"[t]()||i&&s[t].name!==t}))}},6920:(t,e,r)=>{"use strict";var i=r(2505),n=r(2861),s=r(4530),a=r(4081),o=i("".replace),u=RegExp("^["+a+"]+"),h=RegExp("(^|[^"+a+"])["+a+"]+$"),c=function(t){return function(e){var r=s(n(e));return 1&t&&(r=o(r,u,"")),2&t&&(r=o(r,h,"$1")),r}};t.exports={start:c(1),end:c(2),trim:c(3)}},1896:(t,e,r)=>{"use strict";var i=r(5048),n=r(922),s=r(2917).String;t.exports=!!Object.getOwnPropertySymbols&&!n((function(){var t=Symbol("symbol detection");return!s(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&i&&i<41}))},3450:(t,e,r)=>{"use strict";var i,n,s,a,o=r(2917),u=r(9422),h=r(6869),c=r(3220),l=r(1354),f=r(922),g=r(9098),p=r(3801),d=r(1038),v=r(3069),y=r(9891),m=r(5196),x=o.setImmediate,b=o.clearImmediate,w=o.process,S=o.Dispatch,T=o.Function,O=o.MessageChannel,A=o.String,C=0,E={},P="onreadystatechange";f((function(){i=o.location}));var N=function(t){if(l(E,t)){var e=E[t];delete E[t],e()}},M=function(t){return function(){N(t)}},R=function(t){N(t.data)},_=function(t){o.postMessage(A(t),i.protocol+"//"+i.host)};x&&b||(x=function(t){v(arguments.length,1);var e=c(t)?t:T(t),r=p(arguments,1);return E[++C]=function(){u(e,void 0,r)},n(C),C},b=function(t){delete E[t]},m?n=function(t){w.nextTick(M(t))}:S&&S.now?n=function(t){S.now(M(t))}:O&&!y?(a=(s=new O).port2,s.port1.onmessage=R,n=h(a.postMessage,a)):o.addEventListener&&c(o.postMessage)&&!o.importScripts&&i&&"file:"!==i.protocol&&!f(_)?(n=_,o.addEventListener("message",R,!1)):n=P in d("script")?function(t){g.appendChild(d("script"))[P]=function(){g.removeChild(this),N(t)}}:function(t){setTimeout(M(t),0)}),t.exports={set:x,clear:b}},4043:(t,e,r)=>{"use strict";var i=r(304),n=Math.max,s=Math.min;t.exports=function(t,e){var r=i(t);return r<0?n(r+e,0):s(r,e)}},9671:(t,e,r)=>{"use strict";var i=r(9688),n=r(2861);t.exports=function(t){return i(n(t))}},304:(t,e,r)=>{"use strict";var i=r(9862);t.exports=function(t){var e=+t;return e!=e||0===e?0:i(e)}},5139:(t,e,r)=>{"use strict";var i=r(304),n=Math.min;t.exports=function(t){var e=i(t);return e>0?n(e,9007199254740991):0}},1076:(t,e,r)=>{"use strict";var i=r(2861),n=Object;t.exports=function(t){return n(i(t))}},7565:(t,e,r)=>{"use strict";var i=r(3840),n=r(1367),s=r(9051),a=r(7977),o=r(3671),u=r(7234),h=TypeError,c=u("toPrimitive");t.exports=function(t,e){if(!n(t)||s(t))return t;var r,u=a(t,c);if(u){if(void 0===e&&(e="default"),r=i(u,t,e),!n(r)||s(r))return r;throw new h("Can't convert object to primitive value")}return void 0===e&&(e="number"),o(t,e)}},1216:(t,e,r)=>{"use strict";var i=r(7565),n=r(9051);t.exports=function(t){var e=i(t,"string");return n(e)?e:e+""}},9785:(t,e,r)=>{"use strict";var i={};i[r(7234)("toStringTag")]="z",t.exports="[object z]"===String(i)},4530:(t,e,r)=>{"use strict";var i=r(5526),n=String;t.exports=function(t){if("Symbol"===i(t))throw new TypeError("Cannot convert a Symbol value to a string");return n(t)}},8542:t=>{"use strict";var e=String;t.exports=function(t){try{return e(t)}catch(t){return"Object"}}},5433:(t,e,r)=>{"use strict";var i=r(2505),n=0,s=Math.random(),a=i(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++n+s,36)}},8617:(t,e,r)=>{"use strict";var i=r(1896);t.exports=i&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},891:(t,e,r)=>{"use strict";var i=r(6101),n=r(922);t.exports=i&&n((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},3069:t=>{"use strict";var e=TypeError;t.exports=function(t,r){if(t{"use strict";var i=r(2917),n=r(3220),s=i.WeakMap;t.exports=n(s)&&/native code/.test(String(s))},7234:(t,e,r)=>{"use strict";var i=r(2917),n=r(1394),s=r(1354),a=r(5433),o=r(1896),u=r(8617),h=i.Symbol,c=n("wks"),l=u?h.for||h:h&&h.withoutSetter||a;t.exports=function(t){return s(c,t)||(c[t]=o&&s(h,t)?h[t]:l("Symbol."+t)),c[t]}},4081:t=>{"use strict";t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},765:(t,e,r)=>{"use strict";var i=r(7637),n=r(6771),s=r(4746).indexOf,a=r(1613),o=n([].indexOf),u=!!o&&1/o([1],1,-0)<0;i({target:"Array",proto:!0,forced:u||!a("indexOf")},{indexOf:function(t){var e=arguments.length>1?arguments[1]:void 0;return u?o(this,t,e)||0:s(this,t,e)}})},4681:(t,e,r)=>{"use strict";var i=r(9671),n=r(9754),s=r(6404),a=r(2038),o=r(6634).f,u=r(4537),h=r(6187),c=r(8366),l=r(6101),f="Array Iterator",g=a.set,p=a.getterFor(f);t.exports=u(Array,"Array",(function(t,e){g(this,{type:f,target:i(t),index:0,kind:e})}),(function(){var t=p(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,h(void 0,!0);switch(t.kind){case"keys":return h(r,!1);case"values":return h(e[r],!1)}return h([r,e[r]],!1)}),"values");var d=s.Arguments=s.Array;if(n("keys"),n("values"),n("entries"),!c&&l&&"values"!==d.name)try{o(d,"name",{value:"values"})}catch(t){}},5077:(t,e,r)=>{"use strict";var i=r(7637),n=r(8605).left,s=r(1613),a=r(5048);i({target:"Array",proto:!0,forced:!r(5196)&&a>79&&a<83||!s("reduce")},{reduce:function(t){var e=arguments.length;return n(this,t,e,e>1?arguments[1]:void 0)}})},6765:(t,e,r)=>{"use strict";var i=r(7637),n=r(2505),s=r(3959),a=n([].reverse),o=[1,2];i({target:"Array",proto:!0,forced:String(o)===String(o.reverse())},{reverse:function(){return s(this)&&(this.length=this.length),a(this)}})},656:(t,e,r)=>{"use strict";var i=r(7637),n=r(3840),s=r(2121),a=r(1452),o=r(8994),u=r(1617);i({target:"Promise",stat:!0,forced:r(1356)},{all:function(t){var e=this,r=a.f(e),i=r.resolve,h=r.reject,c=o((function(){var r=s(e.resolve),a=[],o=0,c=1;u(t,(function(t){var s=o++,u=!1;c++,n(r,e,t).then((function(t){u||(u=!0,a[s]=t,--c||i(a))}),h)})),--c||i(a)}));return c.error&&h(c.value),r.promise}})},8644:(t,e,r)=>{"use strict";var i=r(7637),n=r(8366),s=r(2653).CONSTRUCTOR,a=r(7005),o=r(5084),u=r(3220),h=r(9405),c=a&&a.prototype;if(i({target:"Promise",proto:!0,forced:s,real:!0},{catch:function(t){return this.then(void 0,t)}}),!n&&u(a)){var l=o("Promise").prototype.catch;c.catch!==l&&h(c,"catch",l,{unsafe:!0})}},3363:(t,e,r)=>{"use strict";var i,n,s,a=r(7637),o=r(8366),u=r(5196),h=r(2917),c=r(3840),l=r(9405),f=r(5798),g=r(7938),p=r(6212),d=r(2121),v=r(3220),y=r(1367),m=r(5766),x=r(9207),b=r(3450).set,w=r(4486),S=r(6050),T=r(8994),O=r(6448),A=r(2038),C=r(7005),E=r(2653),P=r(1452),N="Promise",M=E.CONSTRUCTOR,R=E.REJECTION_EVENT,_=E.SUBCLASSING,V=A.getterFor(N),k=A.set,I=C&&C.prototype,L=C,D=I,B=h.TypeError,j=h.document,F=h.process,z=P.f,U=z,H=!!(j&&j.createEvent&&h.dispatchEvent),X="unhandledrejection",Y=function(t){var e;return!(!y(t)||!v(e=t.then))&&e},W=function(t,e){var r,i,n,s=e.value,a=1===e.state,o=a?t.ok:t.fail,u=t.resolve,h=t.reject,l=t.domain;try{o?(a||(2===e.rejection&&Z(e),e.rejection=1),!0===o?r=s:(l&&l.enter(),r=o(s),l&&(l.exit(),n=!0)),r===t.promise?h(new B("Promise-chain cycle")):(i=Y(r))?c(i,r,u,h):u(r)):h(s)}catch(t){l&&!n&&l.exit(),h(t)}},q=function(t,e){t.notified||(t.notified=!0,w((function(){for(var r,i=t.reactions;r=i.get();)W(r,t);t.notified=!1,e&&!t.rejection&&Q(t)})))},G=function(t,e,r){var i,n;H?((i=j.createEvent("Event")).promise=e,i.reason=r,i.initEvent(t,!1,!0),h.dispatchEvent(i)):i={promise:e,reason:r},!R&&(n=h["on"+t])?n(i):t===X&&S("Unhandled promise rejection",r)},Q=function(t){c(b,h,(function(){var e,r=t.facade,i=t.value;if($(t)&&(e=T((function(){u?F.emit("unhandledRejection",i,r):G(X,r,i)})),t.rejection=u||$(t)?2:1,e.error))throw e.value}))},$=function(t){return 1!==t.rejection&&!t.parent},Z=function(t){c(b,h,(function(){var e=t.facade;u?F.emit("rejectionHandled",e):G("rejectionhandled",e,t.value)}))},K=function(t,e,r){return function(i){t(e,i,r)}},J=function(t,e,r){t.done||(t.done=!0,r&&(t=r),t.value=e,t.state=2,q(t,!0))},tt=function(t,e,r){if(!t.done){t.done=!0,r&&(t=r);try{if(t.facade===e)throw new B("Promise can't be resolved itself");var i=Y(e);i?w((function(){var r={done:!1};try{c(i,e,K(tt,r,t),K(J,r,t))}catch(e){J(r,e,t)}})):(t.value=e,t.state=1,q(t,!1))}catch(e){J({done:!1},e,t)}}};if(M&&(D=(L=function(t){m(this,D),d(t),c(i,this);var e=V(this);try{t(K(tt,e),K(J,e))}catch(t){J(e,t)}}).prototype,(i=function(t){k(this,{type:N,done:!1,notified:!1,parent:!1,reactions:new O,rejection:!1,state:0,value:null})}).prototype=l(D,"then",(function(t,e){var r=V(this),i=z(x(this,L));return r.parent=!0,i.ok=!v(t)||t,i.fail=v(e)&&e,i.domain=u?F.domain:void 0,0===r.state?r.reactions.add(i):w((function(){W(i,r)})),i.promise})),n=function(){var t=new i,e=V(t);this.promise=t,this.resolve=K(tt,e),this.reject=K(J,e)},P.f=z=function(t){return t===L||void 0===t?new n(t):U(t)},!o&&v(C)&&I!==Object.prototype)){s=I.then,_||l(I,"then",(function(t,e){var r=this;return new L((function(t,e){c(s,r,t,e)})).then(t,e)}),{unsafe:!0});try{delete I.constructor}catch(t){}f&&f(I,D)}a({global:!0,constructor:!0,wrap:!0,forced:M},{Promise:L}),g(L,N,!1,!0),p(N)},953:(t,e,r)=>{"use strict";r(3363),r(656),r(8644),r(894),r(7488),r(1731)},894:(t,e,r)=>{"use strict";var i=r(7637),n=r(3840),s=r(2121),a=r(1452),o=r(8994),u=r(1617);i({target:"Promise",stat:!0,forced:r(1356)},{race:function(t){var e=this,r=a.f(e),i=r.reject,h=o((function(){var a=s(e.resolve);u(t,(function(t){n(a,e,t).then(r.resolve,i)}))}));return h.error&&i(h.value),r.promise}})},7488:(t,e,r)=>{"use strict";var i=r(7637),n=r(1452);i({target:"Promise",stat:!0,forced:r(2653).CONSTRUCTOR},{reject:function(t){var e=n.f(this);return(0,e.reject)(t),e.promise}})},1731:(t,e,r)=>{"use strict";var i=r(7637),n=r(5084),s=r(8366),a=r(7005),o=r(2653).CONSTRUCTOR,u=r(4539),h=n("Promise"),c=s&&!o;i({target:"Promise",stat:!0,forced:s||o},{resolve:function(t){return u(c&&this===h?a:this,t)}})},5856:(t,e,r)=>{"use strict";var i=r(7637),n=r(9078);i({target:"RegExp",proto:!0,forced:/./.exec!==n},{exec:n})},7440:(t,e,r)=>{"use strict";var i=r(7415).PROPER,n=r(9405),s=r(2338),a=r(4530),o=r(922),u=r(4337),h="toString",c=RegExp.prototype,l=c[h],f=o((function(){return"/a/b"!==l.call({source:"a",flags:"b"})})),g=i&&l.name!==h;(f||g)&&n(c,h,(function(){var t=s(this);return"/"+a(t.source)+"/"+a(u(t))}),{unsafe:!0})},8092:(t,e,r)=>{"use strict";var i,n=r(7637),s=r(6771),a=r(9056).f,o=r(5139),u=r(4530),h=r(2108),c=r(2861),l=r(2449),f=r(8366),g=s("".slice),p=Math.min,d=l("endsWith");n({target:"String",proto:!0,forced:!(!f&&!d&&(i=a(String.prototype,"endsWith"),i&&!i.writable)||d)},{endsWith:function(t){var e=u(c(this));h(t);var r=arguments.length>1?arguments[1]:void 0,i=e.length,n=void 0===r?i:p(o(r),i),s=u(t);return g(e,n-s.length,n)===s}})},8620:(t,e,r)=>{"use strict";var i=r(7637),n=r(2505),s=r(2108),a=r(2861),o=r(4530),u=r(2449),h=n("".indexOf);i({target:"String",proto:!0,forced:!u("includes")},{includes:function(t){return!!~h(o(a(this)),o(s(t)),arguments.length>1?arguments[1]:void 0)}})},8524:(t,e,r)=>{"use strict";var i=r(3840),n=r(699),s=r(2338),a=r(9606),o=r(5139),u=r(4530),h=r(2861),c=r(7977),l=r(4322),f=r(8153);n("match",(function(t,e,r){return[function(e){var r=h(this),n=a(e)?void 0:c(e,t);return n?i(n,e,r):new RegExp(e)[t](u(r))},function(t){var i=s(this),n=u(t),a=r(e,i,n);if(a.done)return a.value;if(!i.global)return f(i,n);var h=i.unicode;i.lastIndex=0;for(var c,g=[],p=0;null!==(c=f(i,n));){var d=u(c[0]);g[p]=d,""===d&&(i.lastIndex=l(n,o(i.lastIndex),h)),p++}return 0===p?null:g}]}))},1405:(t,e,r)=>{"use strict";var i=r(9422),n=r(3840),s=r(2505),a=r(699),o=r(922),u=r(2338),h=r(3220),c=r(9606),l=r(304),f=r(5139),g=r(4530),p=r(2861),d=r(4322),v=r(7977),y=r(3329),m=r(8153),x=r(7234)("replace"),b=Math.max,w=Math.min,S=s([].concat),T=s([].push),O=s("".indexOf),A=s("".slice),C="$0"==="a".replace(/./,"$0"),E=!!/./[x]&&""===/./[x]("a","$0");a("replace",(function(t,e,r){var s=E?"$":"$0";return[function(t,r){var i=p(this),s=c(t)?void 0:v(t,x);return s?n(s,t,i,r):n(e,g(i),t,r)},function(t,n){var a=u(this),o=g(t);if("string"==typeof n&&-1===O(n,s)&&-1===O(n,"$<")){var c=r(e,a,o,n);if(c.done)return c.value}var p=h(n);p||(n=g(n));var v,x=a.global;x&&(v=a.unicode,a.lastIndex=0);for(var C,E=[];null!==(C=m(a,o))&&(T(E,C),x);)""===g(C[0])&&(a.lastIndex=d(o,f(a.lastIndex),v));for(var P,N="",M=0,R=0;R=M&&(N+=A(o,M,k)+_,M=k+V.length)}return N+A(o,M)}]}),!!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}))||!C||E)},841:(t,e,r)=>{"use strict";var i=r(3840),n=r(2505),s=r(699),a=r(2338),o=r(9606),u=r(2861),h=r(9207),c=r(4322),l=r(5139),f=r(4530),g=r(7977),p=r(8153),d=r(1104),v=r(922),y=d.UNSUPPORTED_Y,m=Math.min,x=n([].push),b=n("".slice),w=!v((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2!==r.length||"a"!==r[0]||"b"!==r[1]})),S="c"==="abbc".split(/(b)*/)[1]||4!=="test".split(/(?:)/,-1).length||2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length;s("split",(function(t,e,r){var n="0".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:i(e,this,t,r)}:e;return[function(e,r){var s=u(this),a=o(e)?void 0:g(e,t);return a?i(a,e,s,r):i(n,f(s),e,r)},function(t,i){var s=a(this),o=f(t);if(!S){var u=r(n,s,o,i,n!==e);if(u.done)return u.value}var g=h(s,RegExp),d=s.unicode,v=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(y?"g":"y"),w=new g(y?"^(?:"+s.source+")":s,v),T=void 0===i?4294967295:i>>>0;if(0===T)return[];if(0===o.length)return null===p(w,o)?[o]:[];for(var O=0,A=0,C=[];A{"use strict";var i,n=r(7637),s=r(6771),a=r(9056).f,o=r(5139),u=r(4530),h=r(2108),c=r(2861),l=r(2449),f=r(8366),g=s("".slice),p=Math.min,d=l("startsWith");n({target:"String",proto:!0,forced:!(!f&&!d&&(i=a(String.prototype,"startsWith"),i&&!i.writable)||d)},{startsWith:function(t){var e=u(c(this));h(t);var r=o(p(arguments.length>1?arguments[1]:void 0,e.length)),i=u(t);return g(e,r,r+i.length)===i}})},6105:(t,e,r)=>{"use strict";var i=r(7637),n=r(6920).trim;i({target:"String",proto:!0,forced:r(2401)("trim")},{trim:function(){return n(this)}})},2026:(t,e,r)=>{"use strict";var i=r(2917),n=r(5450),s=r(3295),a=r(4681),o=r(320),u=r(7938),h=r(7234)("iterator"),c=a.values,l=function(t,e){if(t){if(t[h]!==c)try{o(t,h,c)}catch(e){t[h]=c}if(u(t,e,!0),n[e])for(var r in a)if(t[r]!==a[r])try{o(t,r,a[r])}catch(e){t[r]=a[r]}}};for(var f in n)l(i[f]&&i[f].prototype,f);l(s,"DOMTokenList")},9351:(t,e,r)=>{"use strict";function i(t,e,r,i,n,s,a){try{var o=t[s](a),u=o.value}catch(t){return void r(t)}o.done?e(u):Promise.resolve(u).then(i,n)}function n(t){return function(){var e=this,r=arguments;return new Promise((function(n,s){var a=t.apply(e,r);function o(t){i(a,n,s,o,u,"next",t)}function u(t){i(a,n,s,o,u,"throw",t)}o(void 0)}))}}r.r(e),r.d(e,{AElement:()=>he,AnimateColorElement:()=>ie,AnimateElement:()=>re,AnimateTransformElement:()=>ne,BoundingBox:()=>Vt,CB1:()=>rt,CB2:()=>it,CB3:()=>nt,CB4:()=>st,Canvg:()=>Fe,CircleElement:()=>Ht,ClipPathElement:()=>Ce,DefsElement:()=>$t,DescElement:()=>Ve,Document:()=>De,Element:()=>Et,EllipseElement:()=>Xt,FeColorMatrixElement:()=>Te,FeCompositeElement:()=>Me,FeDropShadowElement:()=>Pe,FeGaussianBlurElement:()=>Re,FeMorphologyElement:()=>Ne,FilterElement:()=>Ee,Font:()=>_t,FontElement:()=>se,FontFaceElement:()=>ae,GElement:()=>Zt,GlyphElement:()=>Dt,GradientElement:()=>Kt,ImageElement:()=>pe,LineElement:()=>Yt,LinearGradientElement:()=>Jt,MarkerElement:()=>Qt,MaskElement:()=>Oe,Matrix:()=>St,MissingGlyphElement:()=>oe,Mouse:()=>ft,PSEUDO_ZERO:()=>K,Parser:()=>mt,PathElement:()=>Lt,PathParser:()=>kt,PatternElement:()=>Gt,Point:()=>lt,PolygonElement:()=>qt,PolylineElement:()=>Wt,Property:()=>ht,QB1:()=>at,QB2:()=>ot,QB3:()=>ut,RadialGradientElement:()=>te,RectElement:()=>Ut,RenderedElement:()=>It,Rotate:()=>bt,SVGElement:()=>zt,SVGFontLoader:()=>ve,Scale:()=>wt,Screen:()=>dt,Skew:()=>Tt,SkewX:()=>Ot,SkewY:()=>At,StopElement:()=>ee,StyleElement:()=>ye,SymbolElement:()=>de,TRefElement:()=>ue,TSpanElement:()=>jt,TextElement:()=>Bt,TextPathElement:()=>fe,TitleElement:()=>_e,Transform:()=>Ct,Translate:()=>xt,UnknownElement:()=>Pt,UseElement:()=>me,ViewPort:()=>ct,compressSpaces:()=>I,default:()=>Fe,getSelectorSpecificity:()=>Z,normalizeAttributeName:()=>F,normalizeColor:()=>U,parseExternalUrl:()=>z,presets:()=>k,toNumbers:()=>B,trimLeft:()=>L,trimRight:()=>D,vectorMagnitude:()=>J,vectorsAngle:()=>et,vectorsRatio:()=>tt}),r(953),r(8524),r(1405),r(9293),r(4681),r(2026);var s=r(6305);function a(t,e,r){return(e=function(t){var e=function(t){if("object"!=(0,s.A)(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=(0,s.A)(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==(0,s.A)(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}r(5077),r(8092),r(841);var o=r(542),u=(r(6105),r(1210)),h=(r(765),r(8620),r(6765),function(t,e){return(h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])})(t,e)});function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}h(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}function l(t,e){var r=t[0],i=t[1];return[r*Math.cos(e)-i*Math.sin(e),r*Math.sin(e)+i*Math.cos(e)]}function f(){for(var t=[],e=0;et.phi1&&(t.phi2-=2*g),1===t.sweepFlag&&t.phi2i)return[];if(0===i)return[[t*r/(t*t+e*e),e*r/(t*t+e*e)]];var n=Math.sqrt(i);return[[(t*r+e*n)/(t*t+e*e),(e*r-t*n)/(t*t+e*e)],[(t*r-e*n)/(t*t+e*e),(e*r+t*n)/(t*t+e*e)]]}var v,y=Math.PI/180;function m(t,e,r){return(1-r)*t+r*e}function x(t,e,r,i){return t+Math.cos(i/180*g)*e+Math.sin(i/180*g)*r}function b(t,e,r,i){var n=1e-6,s=e-t,a=r-e,o=3*s+3*(i-r)-6*a,u=6*(a-s),h=3*s;return Math.abs(o)v&&(n.sweepFlag=+!n.sweepFlag),n}))}t.ROUND=function(t){function e(e){return Math.round(e*t)/t}return void 0===t&&(t=1e13),f(t),function(t){return void 0!==t.x1&&(t.x1=e(t.x1)),void 0!==t.y1&&(t.y1=e(t.y1)),void 0!==t.x2&&(t.x2=e(t.x2)),void 0!==t.y2&&(t.y2=e(t.y2)),void 0!==t.x&&(t.x=e(t.x)),void 0!==t.y&&(t.y=e(t.y)),void 0!==t.rX&&(t.rX=e(t.rX)),void 0!==t.rY&&(t.rY=e(t.rY)),t}},t.TO_ABS=e,t.TO_REL=function(){return n((function(t,e,r){return t.relative||(void 0!==t.x1&&(t.x1-=e),void 0!==t.y1&&(t.y1-=r),void 0!==t.x2&&(t.x2-=e),void 0!==t.y2&&(t.y2-=r),void 0!==t.x&&(t.x-=e),void 0!==t.y&&(t.y-=r),t.relative=!0),t}))},t.NORMALIZE_HVZ=function(t,e,r){return void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===r&&(r=!0),n((function(i,n,s,a,o){if(isNaN(a)&&!(i.type&E.MOVE_TO))throw new Error("path must start with moveto");return e&&i.type&E.HORIZ_LINE_TO&&(i.type=E.LINE_TO,i.y=i.relative?0:s),r&&i.type&E.VERT_LINE_TO&&(i.type=E.LINE_TO,i.x=i.relative?0:n),t&&i.type&E.CLOSE_PATH&&(i.type=E.LINE_TO,i.x=i.relative?a-n:a,i.y=i.relative?o-s:o),i.type&E.ARC&&(0===i.rX||0===i.rY)&&(i.type=E.LINE_TO,delete i.rX,delete i.rY,delete i.xRot,delete i.lArcFlag,delete i.sweepFlag),i}))},t.NORMALIZE_ST=r,t.QT_TO_C=i,t.INFO=n,t.SANITIZE=function(t){void 0===t&&(t=0),f(t);var e=NaN,r=NaN,i=NaN,s=NaN;return n((function(n,a,o,u,h){var c=Math.abs,l=!1,f=0,g=0;if(n.type&E.SMOOTH_CURVE_TO&&(f=isNaN(e)?0:a-e,g=isNaN(r)?0:o-r),n.type&(E.CURVE_TO|E.SMOOTH_CURVE_TO)?(e=n.relative?a+n.x2:n.x2,r=n.relative?o+n.y2:n.y2):(e=NaN,r=NaN),n.type&E.SMOOTH_QUAD_TO?(i=isNaN(i)?a:2*a-i,s=isNaN(s)?o:2*o-s):n.type&E.QUAD_TO?(i=n.relative?a+n.x1:n.x1,s=n.relative?o+n.y1:n.y2):(i=NaN,s=NaN),n.type&E.LINE_COMMANDS||n.type&E.ARC&&(0===n.rX||0===n.rY||!n.lArcFlag)||n.type&E.CURVE_TO||n.type&E.SMOOTH_CURVE_TO||n.type&E.QUAD_TO||n.type&E.SMOOTH_QUAD_TO){var p=void 0===n.x?0:n.relative?n.x:n.x-a,d=void 0===n.y?0:n.relative?n.y:n.y-o;f=isNaN(i)?void 0===n.x1?f:n.relative?n.x:n.x1-a:i-a,g=isNaN(s)?void 0===n.y1?g:n.relative?n.y:n.y1-o:s-o;var v=void 0===n.x2?0:n.relative?n.x:n.x2-a,y=void 0===n.y2?0:n.relative?n.y:n.y2-o;c(p)<=t&&c(d)<=t&&c(f)<=t&&c(g)<=t&&c(v)<=t&&c(y)<=t&&(l=!0)}return n.type&E.CLOSE_PATH&&c(a-u)<=t&&c(o-h)<=t&&(l=!0),l?[]:n}))},t.MATRIX=s,t.ROTATE=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0),f(t,e,r);var i=Math.sin(t),n=Math.cos(t);return s(n,i,-i,n,e-e*n+r*i,r-e*i-r*n)},t.TRANSLATE=function(t,e){return void 0===e&&(e=0),f(t,e),s(1,0,0,1,t,e)},t.SCALE=function(t,e){return void 0===e&&(e=t),f(t,e),s(t,0,0,e,0,0)},t.SKEW_X=function(t){return f(t),s(1,0,Math.atan(t),1,0,0)},t.SKEW_Y=function(t){return f(t),s(1,Math.atan(t),0,1,0,0)},t.X_AXIS_SYMMETRY=function(t){return void 0===t&&(t=0),f(t),s(-1,0,0,1,t,0)},t.Y_AXIS_SYMMETRY=function(t){return void 0===t&&(t=0),f(t),s(1,0,0,-1,0,t)},t.A_TO_C=function(){return n((function(t,e,r){return E.ARC===t.type?function(t,e,r){var i,n,s,a;t.cX||p(t,e,r);for(var o=Math.min(t.phi1,t.phi2),u=Math.max(t.phi1,t.phi2)-o,h=Math.ceil(u/90),c=new Array(h),f=e,g=r,d=0;do.maxX&&(o.maxX=t),to.maxY&&(o.maxY=t),tV&&u(w(r,n.x1,n.x2,n.x,V));for(var f=0,g=b(i,n.y1,n.y2,n.y);fV&&h(w(i,n.y1,n.y2,n.y,V))}if(n.type&E.ARC){u(n.x),h(n.y),p(n,r,i);for(var v=n.xRot/180*Math.PI,y=Math.cos(v)*n.rX,m=Math.sin(v)*n.rX,S=-Math.sin(v)*n.rY,T=Math.cos(v)*n.rY,O=n.phi1n.phi2?[n.phi2+360,n.phi1+360]:[n.phi2,n.phi1],A=O[0],C=O[1],P=function(t){var e=t[0],r=t[1],i=180*Math.atan2(r,e)/Math.PI;return iA&&VA&&Vu)throw new SyntaxError('Expected positive number, got "'+u+'" at index "'+n+'"')}else if((3===this.curArgs.length||4===this.curArgs.length)&&"0"!==this.curNumber&&"1"!==this.curNumber)throw new SyntaxError('Expected a flag, got "'+this.curNumber+'" at index "'+n+'"');this.curArgs.push(u),this.curArgs.length===P[this.curCommandType]&&(E.HORIZ_LINE_TO===this.curCommandType?i({type:E.HORIZ_LINE_TO,relative:this.curCommandRelative,x:u}):E.VERT_LINE_TO===this.curCommandType?i({type:E.VERT_LINE_TO,relative:this.curCommandRelative,y:u}):this.curCommandType===E.MOVE_TO||this.curCommandType===E.LINE_TO||this.curCommandType===E.SMOOTH_QUAD_TO?(i({type:this.curCommandType,relative:this.curCommandRelative,x:this.curArgs[0],y:this.curArgs[1]}),E.MOVE_TO===this.curCommandType&&(this.curCommandType=E.LINE_TO)):this.curCommandType===E.CURVE_TO?i({type:E.CURVE_TO,relative:this.curCommandRelative,x1:this.curArgs[0],y1:this.curArgs[1],x2:this.curArgs[2],y2:this.curArgs[3],x:this.curArgs[4],y:this.curArgs[5]}):this.curCommandType===E.SMOOTH_CURVE_TO?i({type:E.SMOOTH_CURVE_TO,relative:this.curCommandRelative,x2:this.curArgs[0],y2:this.curArgs[1],x:this.curArgs[2],y:this.curArgs[3]}):this.curCommandType===E.QUAD_TO?i({type:E.QUAD_TO,relative:this.curCommandRelative,x1:this.curArgs[0],y1:this.curArgs[1],x:this.curArgs[2],y:this.curArgs[3]}):this.curCommandType===E.ARC&&i({type:E.ARC,relative:this.curCommandRelative,rX:this.curArgs[0],rY:this.curArgs[1],xRot:this.curArgs[2],lArcFlag:this.curArgs[3],sweepFlag:this.curArgs[4],x:this.curArgs[5],y:this.curArgs[6]})),this.curNumber="",this.curNumberHasExpDigits=!1,this.curNumberHasExp=!1,this.curNumberHasDecimal=!1,this.canParseCommandOrComma=!0}if(!O(s))if(","===s&&this.canParseCommandOrComma)this.canParseCommandOrComma=!1;else if("+"!==s&&"-"!==s&&"."!==s)if(o)this.curNumber=s,this.curNumberHasDecimal=!1;else{if(0!==this.curArgs.length)throw new SyntaxError("Unterminated command at index "+n+".");if(!this.canParseCommandOrComma)throw new SyntaxError('Unexpected character "'+s+'" at index '+n+". Command cannot follow comma");if(this.canParseCommandOrComma=!1,"z"!==s&&"Z"!==s)if("h"===s||"H"===s)this.curCommandType=E.HORIZ_LINE_TO,this.curCommandRelative="h"===s;else if("v"===s||"V"===s)this.curCommandType=E.VERT_LINE_TO,this.curCommandRelative="v"===s;else if("m"===s||"M"===s)this.curCommandType=E.MOVE_TO,this.curCommandRelative="m"===s;else if("l"===s||"L"===s)this.curCommandType=E.LINE_TO,this.curCommandRelative="l"===s;else if("c"===s||"C"===s)this.curCommandType=E.CURVE_TO,this.curCommandRelative="c"===s;else if("s"===s||"S"===s)this.curCommandType=E.SMOOTH_CURVE_TO,this.curCommandRelative="s"===s;else if("q"===s||"Q"===s)this.curCommandType=E.QUAD_TO,this.curCommandRelative="q"===s;else if("t"===s||"T"===s)this.curCommandType=E.SMOOTH_QUAD_TO,this.curCommandRelative="t"===s;else{if("a"!==s&&"A"!==s)throw new SyntaxError('Unexpected character "'+s+'" at index '+n+".");this.curCommandType=E.ARC,this.curCommandRelative="a"===s}else e.push({type:E.CLOSE_PATH}),this.canParseCommandOrComma=!0,this.curCommandType=-1}else this.curNumber=s,this.curNumberHasDecimal="."===s}else this.curNumber+=s,this.curNumberHasDecimal=!0;else this.curNumber+=s;else this.curNumber+=s,this.curNumberHasExp=!0;else this.curNumber+=s,this.curNumberHasExpDigits=this.curNumberHasExp}return e},e.prototype.transform=function(t){return Object.create(this,{parse:{value:function(e,r){void 0===r&&(r=[]);for(var i=0,n=Object.getPrototypeOf(this).parse.call(this,e);i>>w;if(o[x+3]=Z,0!==Z){var K=255/Z;o[x]=(j*b>>>w)*K,o[x+1]=(F*b>>>w)*K,o[x+2]=(z*b>>>w)*K}else o[x]=o[x+1]=o[x+2]=0;j-=I,F-=L,z-=D,U-=B,I-=v.r,L-=v.g,D-=v.b,B-=v.a;var J=$+s+1;J=m+(J>>w,ht>0?(ht=255/ht,o[Et]=(pt*b>>>w)*ht,o[Et+1]=(dt*b>>>w)*ht,o[Et+2]=(vt*b>>>w)*ht):o[Et]=o[Et+1]=o[Et+2]=0,pt-=ct,dt-=lt,vt-=ft,yt-=gt,ct-=v.r,lt-=v.g,ft-=v.b,gt-=v.a,Et=st+((Et=Ct+l)0&&void 0!==arguments[0]?arguments[0]:{},e={window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:t,createCanvas:(t,e)=>new OffscreenCanvas(t,e),createImage:t=>n((function*(){var e=yield fetch(t),r=yield e.blob();return yield createImageBitmap(r)}))()};return"undefined"==typeof DOMParser&&void 0!==t||Reflect.deleteProperty(e,"DOMParser"),e},node:function(t){var{DOMParser:e,canvas:r,fetch:i}=t;return{window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:e,fetch:i,createCanvas:r.createCanvas,createImage:r.loadImage}}});function I(t){return t.replace(/(?!\u3000)\s+/gm," ")}function L(t){return t.replace(/^[\n \t]+/,"")}function D(t){return t.replace(/[\n \t]+$/,"")}function B(t){return((t||"").match(/-?(\d+(?:\.\d*(?:[eE][+-]?\d+)?)?|\.\d+)(?=\D|$)/gm)||[]).map(parseFloat)}var j=/^[A-Z-]+$/;function F(t){return j.test(t)?t.toLowerCase():t}function z(t){var e=/url\(('([^']+)'|"([^"]+)"|([^'")]+))\)/.exec(t)||[];return e[2]||e[3]||e[4]}function U(t){if(!t.startsWith("rgb"))return t;var e=3;return t.replace(/\d+(\.\d+)?/g,((t,r)=>e--&&r?String(Math.round(parseFloat(t))):t))}var H=/(\[[^\]]+\])/g,X=/(#[^\s+>~.[:]+)/g,Y=/(\.[^\s+>~.[:]+)/g,W=/(::[^\s+>~.[:]+|:first-line|:first-letter|:before|:after)/gi,q=/(:[\w-]+\([^)]*\))/gi,G=/(:[^\s+>~.[:]+)/g,Q=/([^\s+>~.[:]+)/g;function $(t,e){var r=e.exec(t);return r?[t.replace(e," "),r.length]:[t,0]}function Z(t){var e=[0,0,0],r=t.replace(/:not\(([^)]*)\)/g," $1 ").replace(/{[\s\S]*/gm," "),i=0;return[r,i]=$(r,H),e[1]+=i,[r,i]=$(r,X),e[0]+=i,[r,i]=$(r,Y),e[1]+=i,[r,i]=$(r,W),e[2]+=i,[r,i]=$(r,q),e[1]+=i,[r,i]=$(r,G),e[1]+=i,r=r.replace(/[*\s+>~]/g," ").replace(/[#.]/g," "),[r,i]=$(r,Q),e[2]+=i,e.join("")}var K=1e-8;function J(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2))}function tt(t,e){return(t[0]*e[0]+t[1]*e[1])/(J(t)*J(e))}function et(t,e){return(t[0]*e[1]0&&void 0!==arguments[0]?arguments[0]:" ",{document:e,name:r}=this;return I(this.getString()).trim().split(t).map((t=>new ht(e,r,t)))}hasValue(t){var{value:e}=this;return null!==e&&""!==e&&(t||0!==e)&&void 0!==e}isString(t){var{value:e}=this,r="string"==typeof e;return r&&t?t.test(e):r}isUrlDefinition(){return this.isString(/^url\(/)}isPixels(){if(!this.hasValue())return!1;var t=this.getString();switch(!0){case t.endsWith("px"):case/^[0-9]+$/.test(t):return!0;default:return!1}}setValue(t){return this.value=t,this}getValue(t){return void 0===t||this.hasValue()?this.value:t}getNumber(t){if(!this.hasValue())return void 0===t?0:parseFloat(t);var{value:e}=this,r=parseFloat(e);return this.isString(/%$/)&&(r/=100),r}getString(t){return void 0===t||this.hasValue()?void 0===this.value?"":String(this.value):String(t)}getColor(t){var e=this.getString(t);return this.isNormalizedColor||(this.isNormalizedColor=!0,e=U(e),this.value=e),e}getDpi(){return 96}getRem(){return this.document.rootEmSize}getEm(){return this.document.emSize}getUnits(){return this.getString().replace(/[0-9.-]/g,"")}getPixels(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.hasValue())return 0;var[r,i]="boolean"==typeof t?[void 0,t]:[t],{viewPort:n}=this.document.screen;switch(!0){case this.isString(/vmin$/):return this.getNumber()/100*Math.min(n.computeSize("x"),n.computeSize("y"));case this.isString(/vmax$/):return this.getNumber()/100*Math.max(n.computeSize("x"),n.computeSize("y"));case this.isString(/vw$/):return this.getNumber()/100*n.computeSize("x");case this.isString(/vh$/):return this.getNumber()/100*n.computeSize("y");case this.isString(/rem$/):return this.getNumber()*this.getRem();case this.isString(/em$/):return this.getNumber()*this.getEm();case this.isString(/ex$/):return this.getNumber()*this.getEm()/2;case this.isString(/px$/):return this.getNumber();case this.isString(/pt$/):return this.getNumber()*this.getDpi()*(1/72);case this.isString(/pc$/):return 15*this.getNumber();case this.isString(/cm$/):return this.getNumber()*this.getDpi()/2.54;case this.isString(/mm$/):return this.getNumber()*this.getDpi()/25.4;case this.isString(/in$/):return this.getNumber()*this.getDpi();case this.isString(/%$/)&&i:return this.getNumber()*this.getEm();case this.isString(/%$/):return this.getNumber()*n.computeSize(r);default:var s=this.getNumber();return e&&s<1?s*n.computeSize(r):s}}getMilliseconds(){return this.hasValue()?this.isString(/ms$/)?this.getNumber():1e3*this.getNumber():0}getRadians(){if(!this.hasValue())return 0;switch(!0){case this.isString(/deg$/):return this.getNumber()*(Math.PI/180);case this.isString(/grad$/):return this.getNumber()*(Math.PI/200);case this.isString(/rad$/):return this.getNumber();default:return this.getNumber()*(Math.PI/180)}}getDefinition(){var t=this.getString(),e=/#([^)'"]+)/.exec(t);return e&&(e=e[1]),e||(e=t),this.document.definitions[e]}getFillStyleDefinition(t,e){var r=this.getDefinition();if(!r)return null;if("function"==typeof r.createGradient)return r.createGradient(this.document.ctx,t,e);if("function"==typeof r.createPattern){if(r.getHrefAttribute().hasValue()){var i=r.getAttribute("patternTransform");r=r.getHrefAttribute().getDefinition(),i.hasValue()&&r.getAttribute("patternTransform",!0).setValue(i.value)}return r.createPattern(this.document.ctx,t,e)}return null}getTextBaseline(){return this.hasValue()?ht.textBaselineMapping[this.getString()]:null}addOpacity(t){for(var e=this.getColor(),r=e.length,i=0,n=0;n1&&void 0!==arguments[1]?arguments[1]:0,[r=e,i=e]=B(t);return new lt(r,i)}static parseScale(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,[r=e,i=r]=B(t);return new lt(r,i)}static parsePath(t){for(var e=B(t),r=e.length,i=[],n=0;n0}runEvents(){if(this.working){var{screen:t,events:e,eventElements:r}=this,{style:i}=t.ctx.canvas;i&&(i.cursor=""),e.forEach(((t,e)=>{for(var{run:i}=t,n=r[e];n;)i(n),n=n.parent})),this.events=[],this.eventElements=[]}}checkPath(t,e){if(this.working&&e){var{events:r,eventElements:i}=this;r.forEach(((r,n)=>{var{x:s,y:a}=r;!i[n]&&e.isPointInPath&&e.isPointInPath(s,a)&&(i[n]=t)}))}}checkBoundingBox(t,e){if(this.working&&e){var{events:r,eventElements:i}=this;r.forEach(((r,n)=>{var{x:s,y:a}=r;!i[n]&&e.isPointInBox(s,a)&&(i[n]=t)}))}}mapXY(t,e){for(var{window:r,ctx:i}=this.screen,n=new lt(t,e),s=i.canvas;s;)n.x-=s.offsetLeft,n.y-=s.offsetTop,s=s.offsetParent;return r.scrollX&&(n.x+=r.scrollX),r.scrollY&&(n.y+=r.scrollY),n}onClick(t){var{x:e,y:r}=this.mapXY(t.clientX,t.clientY);this.events.push({type:"onclick",x:e,y:r,run(t){t.onClick&&t.onClick()}})}onMouseMove(t){var{x:e,y:r}=this.mapXY(t.clientX,t.clientY);this.events.push({type:"onmousemove",x:e,y:r,run(t){t.onMouseMove&&t.onMouseMove()}})}}var gt="undefined"!=typeof window?window:null,pt="undefined"!=typeof fetch?fetch.bind(void 0):null;class dt{constructor(t){var{fetch:e=pt,window:r=gt}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.ctx=t,this.FRAMERATE=30,this.MAX_VIRTUAL_PIXELS=3e4,this.CLIENT_WIDTH=800,this.CLIENT_HEIGHT=600,this.viewPort=new ct,this.mouse=new ft(this),this.animations=[],this.waits=[],this.frameDuration=0,this.isReadyLock=!1,this.isFirstRender=!0,this.intervalId=null,this.window=r,this.fetch=e}wait(t){this.waits.push(t)}ready(){return this.readyPromise?this.readyPromise:Promise.resolve()}isReady(){if(this.isReadyLock)return!0;var t=this.waits.every((t=>t()));return t&&(this.waits=[],this.resolveReady&&this.resolveReady()),this.isReadyLock=t,t}setDefaults(t){t.strokeStyle="rgba(0,0,0,0)",t.lineCap="butt",t.lineJoin="miter",t.miterLimit=4}setViewBox(t){var{document:e,ctx:r,aspectRatio:i,width:n,desiredWidth:s,height:a,desiredHeight:o,minX:u=0,minY:h=0,refX:c,refY:l,clip:f=!1,clipX:g=0,clipY:p=0}=t,d=I(i).replace(/^defer\s/,""),[v,y]=d.split(" "),m=v||"xMidYMid",x=y||"meet",b=n/s,w=a/o,S=Math.min(b,w),T=Math.max(b,w),O=s,A=o;"meet"===x&&(O*=S,A*=S),"slice"===x&&(O*=T,A*=T);var C=new ht(e,"refX",c),E=new ht(e,"refY",l),P=C.hasValue()&&E.hasValue();if(P&&r.translate(-S*C.getPixels("x"),-S*E.getPixels("y")),f){var N=S*g,M=S*p;r.beginPath(),r.moveTo(N,M),r.lineTo(n,M),r.lineTo(n,a),r.lineTo(N,a),r.closePath(),r.clip()}if(!P){var R="meet"===x&&S===w,_="slice"===x&&T===w,V="meet"===x&&S===b,k="slice"===x&&T===b;m.startsWith("xMid")&&(R||_)&&r.translate(n/2-O/2,0),m.endsWith("YMid")&&(V||k)&&r.translate(0,a/2-A/2),m.startsWith("xMax")&&(R||_)&&r.translate(n-O,0),m.endsWith("YMax")&&(V||k)&&r.translate(0,a-A)}switch(!0){case"none"===m:r.scale(b,w);break;case"meet"===x:r.scale(S,S);break;case"slice"===x:r.scale(T,T)}r.translate(-u,-h)}start(t){var{enableRedraw:e=!1,ignoreMouse:r=!1,ignoreAnimation:i=!1,ignoreDimensions:n=!1,ignoreClear:s=!1,forceRedraw:a,scaleWidth:u,scaleHeight:h,offsetX:c,offsetY:l}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{FRAMERATE:f,mouse:g}=this,p=1e3/f;if(this.frameDuration=p,this.readyPromise=new Promise((t=>{this.resolveReady=t})),this.isReady()&&this.render(t,n,s,u,h,c,l),e){var d=Date.now(),v=d,y=0,m=()=>{d=Date.now(),(y=d-v)>=p&&(v=d-y%p,this.shouldUpdate(i,a)&&(this.render(t,n,s,u,h,c,l),g.runEvents())),this.intervalId=o(m)};r||g.start(),this.intervalId=o(m)}}stop(){this.intervalId&&(o.cancel(this.intervalId),this.intervalId=null),this.mouse.stop()}shouldUpdate(t,e){if(!t){var{frameDuration:r}=this;if(this.animations.reduce(((t,e)=>e.update(r)||t),!1))return!0}return!("function"!=typeof e||!e())||!(this.isReadyLock||!this.isReady())||!!this.mouse.hasEvents()}render(t,e,r,i,n,s,a){var{CLIENT_WIDTH:o,CLIENT_HEIGHT:u,viewPort:h,ctx:c,isFirstRender:l}=this,f=c.canvas;h.clear(),f.width&&f.height?h.setCurrent(f.width,f.height):h.setCurrent(o,u);var g=t.getStyle("width"),p=t.getStyle("height");!e&&(l||"number"!=typeof i&&"number"!=typeof n)&&(g.hasValue()&&(f.width=g.getPixels("x"),f.style&&(f.style.width="".concat(f.width,"px"))),p.hasValue()&&(f.height=p.getPixels("y"),f.style&&(f.style.height="".concat(f.height,"px"))));var d=f.clientWidth||f.width,v=f.clientHeight||f.height;if(e&&g.hasValue()&&p.hasValue()&&(d=g.getPixels("x"),v=p.getPixels("y")),h.setCurrent(d,v),"number"==typeof s&&t.getAttribute("x",!0).setValue(s),"number"==typeof a&&t.getAttribute("y",!0).setValue(a),"number"==typeof i||"number"==typeof n){var y=B(t.getAttribute("viewBox").getString()),m=0,x=0;if("number"==typeof i){var b=t.getStyle("width");b.hasValue()?m=b.getPixels("x")/i:isNaN(y[2])||(m=y[2]/i)}if("number"==typeof n){var w=t.getStyle("height");w.hasValue()?x=w.getPixels("y")/n:isNaN(y[3])||(x=y[3]/n)}m||(m=x),x||(x=m),t.getAttribute("width",!0).setValue(i),t.getAttribute("height",!0).setValue(n);var S=t.getStyle("transform",!0,!0);S.setValue("".concat(S.getString()," scale(").concat(1/m,", ").concat(1/x,")"))}r||c.clearRect(0,0,d,v),t.render(c),l&&(this.isFirstRender=!1)}}dt.defaultWindow=gt,dt.defaultFetch=pt;var{defaultFetch:vt}=dt,yt="undefined"!=typeof DOMParser?DOMParser:null;class mt{constructor(){var{fetch:t=vt,DOMParser:e=yt}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.fetch=t,this.DOMParser=e}parse(t){var e=this;return n((function*(){return t.startsWith("<")?e.parseFromString(t):e.load(t)}))()}parseFromString(t){var e=new this.DOMParser;try{return this.checkDocument(e.parseFromString(t,"image/svg+xml"))}catch(r){return this.checkDocument(e.parseFromString(t,"text/xml"))}}checkDocument(t){var e=t.getElementsByTagName("parsererror")[0];if(e)throw new Error(e.textContent);return t}load(t){var e=this;return n((function*(){var r=yield e.fetch(t),i=yield r.text();return e.parseFromString(i)}))()}}class xt{constructor(t,e){this.type="translate",this.point=null,this.point=lt.parse(e)}apply(t){var{x:e,y:r}=this.point;t.translate(e||0,r||0)}unapply(t){var{x:e,y:r}=this.point;t.translate(-1*e||0,-1*r||0)}applyToPoint(t){var{x:e,y:r}=this.point;t.applyTransform([1,0,0,1,e||0,r||0])}}class bt{constructor(t,e,r){this.type="rotate",this.angle=null,this.originX=null,this.originY=null,this.cx=0,this.cy=0;var i=B(e);this.angle=new ht(t,"angle",i[0]),this.originX=r[0],this.originY=r[1],this.cx=i[1]||0,this.cy=i[2]||0}apply(t){var{cx:e,cy:r,originX:i,originY:n,angle:s}=this,a=e+i.getPixels("x"),o=r+n.getPixels("y");t.translate(a,o),t.rotate(s.getRadians()),t.translate(-a,-o)}unapply(t){var{cx:e,cy:r,originX:i,originY:n,angle:s}=this,a=e+i.getPixels("x"),o=r+n.getPixels("y");t.translate(a,o),t.rotate(-1*s.getRadians()),t.translate(-a,-o)}applyToPoint(t){var{cx:e,cy:r,angle:i}=this,n=i.getRadians();t.applyTransform([1,0,0,1,e||0,r||0]),t.applyTransform([Math.cos(n),Math.sin(n),-Math.sin(n),Math.cos(n),0,0]),t.applyTransform([1,0,0,1,-e||0,-r||0])}}class wt{constructor(t,e,r){this.type="scale",this.scale=null,this.originX=null,this.originY=null;var i=lt.parseScale(e);0!==i.x&&0!==i.y||(i.x=K,i.y=K),this.scale=i,this.originX=r[0],this.originY=r[1]}apply(t){var{scale:{x:e,y:r},originX:i,originY:n}=this,s=i.getPixels("x"),a=n.getPixels("y");t.translate(s,a),t.scale(e,r||e),t.translate(-s,-a)}unapply(t){var{scale:{x:e,y:r},originX:i,originY:n}=this,s=i.getPixels("x"),a=n.getPixels("y");t.translate(s,a),t.scale(1/e,1/r||e),t.translate(-s,-a)}applyToPoint(t){var{x:e,y:r}=this.scale;t.applyTransform([e||0,0,0,r||0,0,0])}}class St{constructor(t,e,r){this.type="matrix",this.matrix=[],this.originX=null,this.originY=null,this.matrix=B(e),this.originX=r[0],this.originY=r[1]}apply(t){var{originX:e,originY:r,matrix:i}=this,n=e.getPixels("x"),s=r.getPixels("y");t.translate(n,s),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),t.translate(-n,-s)}unapply(t){var{originX:e,originY:r,matrix:i}=this,n=i[0],s=i[2],a=i[4],o=i[1],u=i[3],h=i[5],c=1/(n*(1*u-0*h)-s*(1*o-0*h)+a*(0*o-0*u)),l=e.getPixels("x"),f=r.getPixels("y");t.translate(l,f),t.transform(c*(1*u-0*h),c*(0*h-1*o),c*(0*a-1*s),c*(1*n-0*a),c*(s*h-a*u),c*(a*o-n*h)),t.translate(-l,-f)}applyToPoint(t){t.applyTransform(this.matrix)}}class Tt extends St{constructor(t,e,r){super(t,e,r),this.type="skew",this.angle=null,this.angle=new ht(t,"angle",e)}}class Ot extends Tt{constructor(t,e,r){super(t,e,r),this.type="skewX",this.matrix=[1,0,Math.tan(this.angle.getRadians()),1,0,0]}}class At extends Tt{constructor(t,e,r){super(t,e,r),this.type="skewY",this.matrix=[1,Math.tan(this.angle.getRadians()),0,1,0,0]}}class Ct{constructor(t,e,r){this.document=t,this.transforms=[];var i=function(t){return I(t).trim().replace(/\)([a-zA-Z])/g,") $1").replace(/\)(\s?,\s?)/g,") ").split(/\s(?=[a-z])/)}(e);i.forEach((t=>{if("none"!==t){var[e,i]=function(t){var[e,r]=t.split("(");return[e.trim(),r.trim().replace(")","")]}(t),n=Ct.transformTypes[e];void 0!==n&&this.transforms.push(new n(this.document,i,r))}}))}static fromElement(t,e){var r=e.getStyle("transform",!1,!0),[i,n=i]=e.getStyle("transform-origin",!1,!0).split(),s=[i,n];return r.hasValue()?new Ct(t,r.getString(),s):null}apply(t){for(var{transforms:e}=this,r=e.length,i=0;i=0;r--)e[r].unapply(t)}applyToPoint(t){for(var{transforms:e}=this,r=e.length,i=0;i2&&void 0!==arguments[2]&&arguments[2];if(this.document=t,this.node=e,this.captureTextNodes=r,this.attributes={},this.styles={},this.stylesSpecificity={},this.animationFrozen=!1,this.animationFrozenValue="",this.parent=null,this.children=[],e&&1===e.nodeType){if(Array.from(e.attributes).forEach((e=>{var r=F(e.nodeName);this.attributes[r]=new ht(t,r,e.value)})),this.addStylesFromStyleDefinition(),this.getAttribute("style").hasValue()){var i=this.getAttribute("style").getString().split(";").map((t=>t.trim()));i.forEach((e=>{if(e){var[r,i]=e.split(":").map((t=>t.trim()));this.styles[r]=new ht(t,r,i)}}))}var{definitions:n}=t,s=this.getAttribute("id");s.hasValue()&&(n[s.getString()]||(n[s.getString()]=this)),Array.from(e.childNodes).forEach((e=>{if(1===e.nodeType)this.addChild(e);else if(r&&(3===e.nodeType||4===e.nodeType)){var i=t.createTextNode(e);i.getText().length>0&&this.addChild(i)}}))}}getAttribute(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.attributes[t];if(!r&&e){var i=new ht(this.document,t,"");return this.attributes[t]=i,i}return r||ht.empty(this.document)}getHrefAttribute(){for(var t in this.attributes)if("href"===t||t.endsWith(":href"))return this.attributes[t];return ht.empty(this.document)}getStyle(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=this.styles[t];if(i)return i;var n=this.getAttribute(t);if(null!=n&&n.hasValue())return this.styles[t]=n,n;if(!r){var{parent:s}=this;if(s){var a=s.getStyle(t);if(null!=a&&a.hasValue())return a}}if(e){var o=new ht(this.document,t,"");return this.styles[t]=o,o}return i||ht.empty(this.document)}render(t){if("none"!==this.getStyle("display").getString()&&"hidden"!==this.getStyle("visibility").getString()){if(t.save(),this.getStyle("mask").hasValue()){var e=this.getStyle("mask").getDefinition();e&&(this.applyEffects(t),e.apply(t,this))}else if("none"!==this.getStyle("filter").getValue("none")){var r=this.getStyle("filter").getDefinition();r&&(this.applyEffects(t),r.apply(t,this))}else this.setContext(t),this.renderChildren(t),this.clearContext(t);t.restore()}}setContext(t){}applyEffects(t){var e=Ct.fromElement(this.document,this);e&&e.apply(t);var r=this.getStyle("clip-path",!1,!0);if(r.hasValue()){var i=r.getDefinition();i&&i.apply(t)}}clearContext(t){}renderChildren(t){this.children.forEach((e=>{e.render(t)}))}addChild(t){var e=t instanceof Et?t:this.document.createElement(t);e.parent=this,Et.ignoreChildTypes.includes(e.type)||this.children.push(e)}matchesSelector(t){var e,{node:r}=this;if("function"==typeof r.matches)return r.matches(t);var i=null===(e=r.getAttribute)||void 0===e?void 0:e.call(r,"class");return!(!i||""===i)&&i.split(" ").some((e=>".".concat(e)===t))}addStylesFromStyleDefinition(){var{styles:t,stylesSpecificity:e}=this.document;for(var r in t)if(!r.startsWith("@")&&this.matchesSelector(r)){var i=t[r],n=e[r];if(i)for(var s in i){var a=this.stylesSpecificity[s];void 0===a&&(a="000"),n>=a&&(this.styles[s]=i[s],this.stylesSpecificity[s]=n)}}}removeStyles(t,e){return e.reduce(((e,r)=>{var i=t.getStyle(r);if(!i.hasValue())return e;var n=i.getString();return i.setValue(""),[...e,[r,n]]}),[])}restoreStyles(t,e){e.forEach((e=>{var[r,i]=e;t.getStyle(r,!0).setValue(i)}))}isFirstChild(){var t;return 0===(null===(t=this.parent)||void 0===t?void 0:t.children.indexOf(this))}}Et.ignoreChildTypes=["title"];class Pt extends Et{constructor(t,e,r){super(t,e,r)}}function Nt(t){var e=t.trim();return/^('|")/.test(e)?e:'"'.concat(e,'"')}function Mt(t){if(!t)return"";var e=t.trim().toLowerCase();switch(e){case"normal":case"italic":case"oblique":case"inherit":case"initial":case"unset":return e;default:return/^oblique\s+(-|)\d+deg$/.test(e)?e:""}}function Rt(t){if(!t)return"";var e=t.trim().toLowerCase();switch(e){case"normal":case"bold":case"lighter":case"bolder":case"inherit":case"initial":case"unset":return e;default:return/^[\d.]+$/.test(e)?e:""}}class _t{constructor(t,e,r,i,n,s){var a=s?"string"==typeof s?_t.parse(s):s:{};this.fontFamily=n||a.fontFamily,this.fontSize=i||a.fontSize,this.fontStyle=t||a.fontStyle,this.fontWeight=r||a.fontWeight,this.fontVariant=e||a.fontVariant}static parse(){var t=arguments.length>1?arguments[1]:void 0,e="",r="",i="",n="",s="",a=I(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").trim().split(" "),o={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1};return a.forEach((t=>{switch(!0){case!o.fontStyle&&_t.styles.includes(t):"inherit"!==t&&(e=t),o.fontStyle=!0;break;case!o.fontVariant&&_t.variants.includes(t):"inherit"!==t&&(r=t),o.fontStyle=!0,o.fontVariant=!0;break;case!o.fontWeight&&_t.weights.includes(t):"inherit"!==t&&(i=t),o.fontStyle=!0,o.fontVariant=!0,o.fontWeight=!0;break;case!o.fontSize:"inherit"!==t&&([n]=t.split("/")),o.fontStyle=!0,o.fontVariant=!0,o.fontWeight=!0,o.fontSize=!0;break;default:"inherit"!==t&&(s+=t)}})),new _t(e,r,i,n,s,t)}toString(){return[Mt(this.fontStyle),this.fontVariant,Rt(this.fontWeight),this.fontSize,(t=this.fontFamily,"undefined"==typeof process?t:t.trim().split(",").map(Nt).join(","))].join(" ").trim();var t}}_t.styles="normal|italic|oblique|inherit",_t.variants="normal|small-caps|inherit",_t.weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";class Vt{constructor(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.NaN,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.NaN,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.NaN,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Number.NaN;this.x1=t,this.y1=e,this.x2=r,this.y2=i,this.addPoint(t,e),this.addPoint(r,i)}get x(){return this.x1}get y(){return this.y1}get width(){return this.x2-this.x1}get height(){return this.y2-this.y1}addPoint(t,e){void 0!==t&&((isNaN(this.x1)||isNaN(this.x2))&&(this.x1=t,this.x2=t),tthis.x2&&(this.x2=t)),void 0!==e&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=e,this.y2=e),ethis.y2&&(this.y2=e))}addX(t){this.addPoint(t,null)}addY(t){this.addPoint(null,t)}addBoundingBox(t){if(t){var{x1:e,y1:r,x2:i,y2:n}=t;this.addPoint(e,r),this.addPoint(i,n)}}sumCubic(t,e,r,i,n){return Math.pow(1-t,3)*e+3*Math.pow(1-t,2)*t*r+3*(1-t)*Math.pow(t,2)*i+Math.pow(t,3)*n}bezierCurveAdd(t,e,r,i,n){var s=6*e-12*r+6*i,a=-3*e+9*r-9*i+3*n,o=3*r-3*e;if(0!==a){var u=Math.pow(s,2)-4*o*a;if(!(u<0)){var h=(-s+Math.sqrt(u))/(2*a);0=e.length-1}next(){var t=this.commands[++this.i];return this.previousCommand=this.command,this.command=t,t}getPoint(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"x",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"y",r=new lt(this.command[t],this.command[e]);return this.makeAbsolute(r)}getAsControlPoint(t,e){var r=this.getPoint(t,e);return this.control=r,r}getAsCurrentPoint(t,e){var r=this.getPoint(t,e);return this.current=r,r}getReflectedControlPoint(){var t=this.previousCommand.type;if(t!==E.CURVE_TO&&t!==E.SMOOTH_CURVE_TO&&t!==E.QUAD_TO&&t!==E.SMOOTH_QUAD_TO)return this.current;var{current:{x:e,y:r},control:{x:i,y:n}}=this;return new lt(2*e-i,2*r-n)}makeAbsolute(t){if(this.command.relative){var{x:e,y:r}=this.current;t.x+=e,t.y+=r}return t}addMarker(t,e,r){var{points:i,angles:n}=this;r&&n.length>0&&!n[n.length-1]&&(n[n.length-1]=i[i.length-1].angleTo(r)),this.addMarkerAngle(t,e?e.angleTo(t):null)}addMarkerAngle(t,e){this.points.push(t),this.angles.push(e)}getMarkerPoints(){return this.points}getMarkerAngles(){for(var{angles:t}=this,e=t.length,r=0;r1&&void 0!==arguments[1]&&arguments[1];if(!e){var r=this.getStyle("fill"),i=this.getStyle("fill-opacity"),n=this.getStyle("stroke"),s=this.getStyle("stroke-opacity");if(r.isUrlDefinition()){var a=r.getFillStyleDefinition(this,i);a&&(t.fillStyle=a)}else if(r.hasValue()){"currentColor"===r.getString()&&r.setValue(this.getStyle("color").getColor());var o=r.getColor();"inherit"!==o&&(t.fillStyle="none"===o?"rgba(0,0,0,0)":o)}if(i.hasValue()){var u=new ht(this.document,"fill",t.fillStyle).addOpacity(i).getColor();t.fillStyle=u}if(n.isUrlDefinition()){var h=n.getFillStyleDefinition(this,s);h&&(t.strokeStyle=h)}else if(n.hasValue()){"currentColor"===n.getString()&&n.setValue(this.getStyle("color").getColor());var c=n.getString();"inherit"!==c&&(t.strokeStyle="none"===c?"rgba(0,0,0,0)":c)}if(s.hasValue()){var l=new ht(this.document,"stroke",t.strokeStyle).addOpacity(s).getString();t.strokeStyle=l}var f=this.getStyle("stroke-width");if(f.hasValue()){var g=f.getPixels();t.lineWidth=g||K}var p=this.getStyle("stroke-linecap"),d=this.getStyle("stroke-linejoin"),v=this.getStyle("stroke-miterlimit"),y=this.getStyle("stroke-dasharray"),m=this.getStyle("stroke-dashoffset");if(p.hasValue()&&(t.lineCap=p.getString()),d.hasValue()&&(t.lineJoin=d.getString()),v.hasValue()&&(t.miterLimit=v.getNumber()),y.hasValue()&&"none"!==y.getString()){var x=B(y.getString());void 0!==t.setLineDash?t.setLineDash(x):void 0!==t.webkitLineDash?t.webkitLineDash=x:void 0===t.mozDash||1===x.length&&0===x[0]||(t.mozDash=x);var b=m.getPixels();void 0!==t.lineDashOffset?t.lineDashOffset=b:void 0!==t.webkitLineDashOffset?t.webkitLineDashOffset=b:void 0!==t.mozDashOffset&&(t.mozDashOffset=b)}}if(this.modifiedEmSizeStack=!1,void 0!==t.font){var w=this.getStyle("font"),S=this.getStyle("font-style"),T=this.getStyle("font-variant"),O=this.getStyle("font-weight"),A=this.getStyle("font-size"),C=this.getStyle("font-family"),E=new _t(S.getString(),T.getString(),O.getString(),A.hasValue()?"".concat(A.getPixels(!0),"px"):"",C.getString(),_t.parse(w.getString(),t.font));S.setValue(E.fontStyle),T.setValue(E.fontVariant),O.setValue(E.fontWeight),A.setValue(E.fontSize),C.setValue(E.fontFamily),t.font=E.toString(),A.isPixels()&&(this.document.emSize=A.getPixels(),this.modifiedEmSizeStack=!0)}e||(this.applyEffects(t),t.globalAlpha=this.calculateOpacity())}clearContext(t){super.clearContext(t),this.modifiedEmSizeStack&&this.document.popEmSize()}}class Lt extends It{constructor(t,e,r){super(t,e,r),this.type="path",this.pathParser=null,this.pathParser=new kt(this.getAttribute("d").getString())}path(t){var{pathParser:e}=this,r=new Vt;for(e.reset(),t&&t.beginPath();!e.isEnd();)switch(e.next().type){case kt.MOVE_TO:this.pathM(t,r);break;case kt.LINE_TO:this.pathL(t,r);break;case kt.HORIZ_LINE_TO:this.pathH(t,r);break;case kt.VERT_LINE_TO:this.pathV(t,r);break;case kt.CURVE_TO:this.pathC(t,r);break;case kt.SMOOTH_CURVE_TO:this.pathS(t,r);break;case kt.QUAD_TO:this.pathQ(t,r);break;case kt.SMOOTH_QUAD_TO:this.pathT(t,r);break;case kt.ARC:this.pathA(t,r);break;case kt.CLOSE_PATH:this.pathZ(t,r)}return r}getBoundingBox(t){return this.path()}getMarkers(){var{pathParser:t}=this,e=t.getMarkerPoints(),r=t.getMarkerAngles(),i=e.map(((t,e)=>[t,r[e]]));return i}renderChildren(t){this.path(t),this.document.screen.mouse.checkPath(this,t);var e=this.getStyle("fill-rule");""!==t.fillStyle&&("inherit"!==e.getString("inherit")?t.fill(e.getString()):t.fill()),""!==t.strokeStyle&&("non-scaling-stroke"===this.getAttribute("vector-effect").getString()?(t.save(),t.setTransform(1,0,0,1,0,0),t.stroke(),t.restore()):t.stroke());var r=this.getMarkers();if(r){var i=r.length-1,n=this.getStyle("marker-start"),s=this.getStyle("marker-mid"),a=this.getStyle("marker-end");if(n.isUrlDefinition()){var o=n.getDefinition(),[u,h]=r[0];o.render(t,u,h)}if(s.isUrlDefinition())for(var c=s.getDefinition(),l=1;l1&&(i*=Math.sqrt(l),n*=Math.sqrt(l));var f=(a===o?-1:1)*Math.sqrt((Math.pow(i,2)*Math.pow(n,2)-Math.pow(i,2)*Math.pow(c.y,2)-Math.pow(n,2)*Math.pow(c.x,2))/(Math.pow(i,2)*Math.pow(c.y,2)+Math.pow(n,2)*Math.pow(c.x,2)));isNaN(f)&&(f=0);var g=new lt(f*i*c.y/n,f*-n*c.x/i),p=new lt((e.x+h.x)/2+Math.cos(u)*g.x-Math.sin(u)*g.y,(e.y+h.y)/2+Math.sin(u)*g.x+Math.cos(u)*g.y),d=et([1,0],[(c.x-g.x)/i,(c.y-g.y)/n]),v=[(c.x-g.x)/i,(c.y-g.y)/n],y=[(-c.x-g.x)/i,(-c.y-g.y)/n],m=et(v,y);return tt(v,y)<=-1&&(m=Math.PI),tt(v,y)>=1&&(m=0),{currentPoint:h,rX:i,rY:n,sweepFlag:o,xAxisRotation:u,centp:p,a1:d,ad:m}}pathA(t,e){var{pathParser:r}=this,{currentPoint:i,rX:n,rY:s,sweepFlag:a,xAxisRotation:o,centp:u,a1:h,ad:c}=Lt.pathA(r),l=1-a?1:-1,f=h+l*(c/2),g=new lt(u.x+n*Math.cos(f),u.y+s*Math.sin(f));if(r.addMarkerAngle(g,f-l*Math.PI/2),r.addMarkerAngle(i,f-l*Math.PI),e.addPoint(i.x,i.y),t&&!isNaN(h)&&!isNaN(c)){var p=n>s?n:s,d=n>s?1:n/s,v=n>s?s/n:1;t.translate(u.x,u.y),t.rotate(o),t.scale(d,v),t.arc(0,0,p,h,h+c,Boolean(1-a)),t.scale(1/d,1/v),t.rotate(-o),t.translate(-u.x,-u.y)}}static pathZ(t){t.current=t.start}pathZ(t,e){Lt.pathZ(this.pathParser),t&&e.x1!==e.x2&&e.y1!==e.y2&&t.closePath()}}class Dt extends Lt{constructor(t,e,r){super(t,e,r),this.type="glyph",this.horizAdvX=this.getAttribute("horiz-adv-x").getNumber(),this.unicode=this.getAttribute("unicode").getString(),this.arabicForm=this.getAttribute("arabic-form").getString()}}class Bt extends It{constructor(t,e,r){super(t,e,new.target===Bt||r),this.type="text",this.x=0,this.y=0,this.measureCache=-1}setContext(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];super.setContext(t,e);var r=this.getStyle("dominant-baseline").getTextBaseline()||this.getStyle("alignment-baseline").getTextBaseline();r&&(t.textBaseline=r)}initializeCoordinates(){this.x=0,this.y=0,this.leafTexts=[],this.textChunkStart=0,this.minX=Number.POSITIVE_INFINITY,this.maxX=Number.NEGATIVE_INFINITY}getBoundingBox(t){if("text"!==this.type)return this.getTElementBoundingBox(t);this.initializeCoordinates(),this.adjustChildCoordinatesRecursive(t);var e=null;return this.children.forEach(((r,i)=>{var n=this.getChildBoundingBox(t,this,this,i);e?e.addBoundingBox(n):e=n})),e}getFontSize(){var{document:t,parent:e}=this,r=_t.parse(t.ctx.font).fontSize;return e.getStyle("font-size").getNumber(r)}getTElementBoundingBox(t){var e=this.getFontSize();return new Vt(this.x,this.y-e,this.x+this.measureText(t),this.y)}getGlyph(t,e,r){var i=e[r],n=null;if(t.isArabic){var s=e.length,a=e[r-1],o=e[r+1],u="isolated";if((0===r||" "===a)&&r0&&" "!==a&&r0&&" "!==a&&(r===s-1||" "===o)&&(u="initial"),void 0!==t.glyphs[i]){var h=t.glyphs[i];n=h instanceof Dt?h:h[u]}}else n=t.glyphs[i];return n||(n=t.missingGlyph),n}getText(){return""}getTextFromNode(t){var e=t||this.node,r=Array.from(e.parentNode.childNodes),i=r.indexOf(e),n=r.length-1,s=I(e.textContent||"");return 0===i&&(s=L(s)),i===n&&(s=D(s)),s}renderChildren(t){if("text"===this.type){this.initializeCoordinates(),this.adjustChildCoordinatesRecursive(t),this.children.forEach(((e,r)=>{this.renderChild(t,this,this,r)}));var{mouse:e}=this.document.screen;e.isWorking()&&e.checkBoundingBox(this,this.getBoundingBox(t))}else this.renderTElementChildren(t)}renderTElementChildren(t){var{document:e,parent:r}=this,i=this.getText(),n=r.getStyle("font-family").getDefinition();if(n)for(var{unitsPerEm:s}=n.fontFace,a=_t.parse(e.ctx.font),o=r.getStyle("font-size").getNumber(a.fontSize),u=r.getStyle("font-style").getString(a.fontStyle),h=o/s,c=n.isRTL?i.split("").reverse().join(""):i,l=B(r.getAttribute("dx").getString()),f=c.length,g=0;g=this.leafTexts.length)){var t,e=this.leafTexts[this.textChunkStart],r=e.getStyle("text-anchor").getString("start");t="start"===r?e.x-this.minX:"end"===r?e.x-this.maxX:e.x-(this.minX+this.maxX)/2;for(var i=this.textChunkStart;i{this.adjustChildCoordinatesRecursiveCore(t,this,this,r)})),this.applyAnchoring()}adjustChildCoordinatesRecursiveCore(t,e,r,i){var n=r.children[i];n.children.length>0?n.children.forEach(((r,i)=>{e.adjustChildCoordinatesRecursiveCore(t,e,n,i)})):this.adjustChildCoordinates(t,e,r,i)}adjustChildCoordinates(t,e,r,i){var n=r.children[i];if("function"!=typeof n.measureText)return n;t.save(),n.setContext(t,!0);var s=n.getAttribute("x"),a=n.getAttribute("y"),o=n.getAttribute("dx"),u=n.getAttribute("dy"),h=n.getStyle("font-family").getDefinition(),c=Boolean(h)&&h.isRTL;0===i&&(s.hasValue()||s.setValue(n.getInheritedAttribute("x")),a.hasValue()||a.setValue(n.getInheritedAttribute("y")),o.hasValue()||o.setValue(n.getInheritedAttribute("dx")),u.hasValue()||u.setValue(n.getInheritedAttribute("dy")));var l=n.measureText(t);return c&&(e.x-=l),s.hasValue()?(e.applyAnchoring(),n.x=s.getPixels("x"),o.hasValue()&&(n.x+=o.getPixels("x"))):(o.hasValue()&&(e.x+=o.getPixels("x")),n.x=e.x),e.x=n.x,c||(e.x+=l),a.hasValue()?(n.y=a.getPixels("y"),u.hasValue()&&(n.y+=u.getPixels("y"))):(u.hasValue()&&(e.y+=u.getPixels("y")),n.y=e.y),e.y=n.y,e.leafTexts.push(n),e.minX=Math.min(e.minX,n.x,n.x+l),e.maxX=Math.max(e.maxX,n.x,n.x+l),n.clearContext(t),t.restore(),n}getChildBoundingBox(t,e,r,i){var n=r.children[i];if("function"!=typeof n.getBoundingBox)return null;var s=n.getBoundingBox(t);return s?(n.children.forEach(((r,i)=>{var a=e.getChildBoundingBox(t,e,n,i);s.addBoundingBox(a)})),s):null}renderChild(t,e,r,i){var n=r.children[i];n.render(t),n.children.forEach(((r,i)=>{e.renderChild(t,e,n,i)}))}measureText(t){var{measureCache:e}=this;if(~e)return e;var r=this.getText(),i=this.measureTargetText(t,r);return this.measureCache=i,i}measureTargetText(t,e){if(!e.length)return 0;var{parent:r}=this,i=r.getStyle("font-family").getDefinition();if(i){for(var n=this.getFontSize(),s=i.isRTL?e.split("").reverse().join(""):e,a=B(r.getAttribute("dx").getString()),o=s.length,u=0,h=0;h0?"":this.getTextFromNode()}getText(){return this.text}}class Ft extends jt{constructor(){super(...arguments),this.type="textNode"}}class zt extends It{constructor(){super(...arguments),this.type="svg",this.root=!1}setContext(t){var e,{document:r}=this,{screen:i,window:n}=r,s=t.canvas;if(i.setDefaults(t),s.style&&void 0!==t.font&&n&&void 0!==n.getComputedStyle){t.font=n.getComputedStyle(s).getPropertyValue("font");var a=new ht(r,"fontSize",_t.parse(t.font).fontSize);a.hasValue()&&(r.rootEmSize=a.getPixels("y"),r.emSize=r.rootEmSize)}this.getAttribute("x").hasValue()||this.getAttribute("x",!0).setValue(0),this.getAttribute("y").hasValue()||this.getAttribute("y",!0).setValue(0);var{width:o,height:u}=i.viewPort;this.getStyle("width").hasValue()||this.getStyle("width",!0).setValue("100%"),this.getStyle("height").hasValue()||this.getStyle("height",!0).setValue("100%"),this.getStyle("color").hasValue()||this.getStyle("color",!0).setValue("black");var h=this.getAttribute("refX"),c=this.getAttribute("refY"),l=this.getAttribute("viewBox"),f=l.hasValue()?B(l.getString()):null,g=!this.root&&"visible"!==this.getStyle("overflow").getValue("hidden"),p=0,d=0,v=0,y=0;f&&(p=f[0],d=f[1]),this.root||(o=this.getStyle("width").getPixels("x"),u=this.getStyle("height").getPixels("y"),"marker"===this.type&&(v=p,y=d,p=0,d=0)),i.viewPort.setCurrent(o,u),!this.node||this.parent&&"foreignObject"!==(null===(e=this.node.parentNode)||void 0===e?void 0:e.nodeName)||!this.getStyle("transform",!1,!0).hasValue()||this.getStyle("transform-origin",!1,!0).hasValue()||this.getStyle("transform-origin",!0,!0).setValue("50% 50%"),super.setContext(t),t.translate(this.getAttribute("x").getPixels("x"),this.getAttribute("y").getPixels("y")),f&&(o=f[2],u=f[3]),r.setViewBox({ctx:t,aspectRatio:this.getAttribute("preserveAspectRatio").getString(),width:i.viewPort.width,desiredWidth:o,height:i.viewPort.height,desiredHeight:u,minX:p,minY:d,refX:h.getValue(),refY:c.getValue(),clip:g,clipX:v,clipY:y}),f&&(i.viewPort.removeCurrent(),i.viewPort.setCurrent(o,u))}clearContext(t){super.clearContext(t),this.document.screen.viewPort.removeCurrent()}resize(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=this.getAttribute("width",!0),n=this.getAttribute("height",!0),s=this.getAttribute("viewBox"),a=this.getAttribute("style"),o=i.getNumber(0),u=n.getNumber(0);if(r)if("string"==typeof r)this.getAttribute("preserveAspectRatio",!0).setValue(r);else{var h=this.getAttribute("preserveAspectRatio");h.hasValue()&&h.setValue(h.getString().replace(/^\s*(\S.*\S)\s*$/,"$1"))}if(i.setValue(t),n.setValue(e),s.hasValue()||s.setValue("0 0 ".concat(o||t," ").concat(u||e)),a.hasValue()){var c=this.getStyle("width"),l=this.getStyle("height");c.hasValue()&&c.setValue("".concat(t,"px")),l.hasValue()&&l.setValue("".concat(e,"px"))}}}class Ut extends Lt{constructor(){super(...arguments),this.type="rect"}path(t){var e=this.getAttribute("x").getPixels("x"),r=this.getAttribute("y").getPixels("y"),i=this.getStyle("width",!1,!0).getPixels("x"),n=this.getStyle("height",!1,!0).getPixels("y"),s=this.getAttribute("rx"),a=this.getAttribute("ry"),o=s.getPixels("x"),u=a.getPixels("y");if(s.hasValue()&&!a.hasValue()&&(u=o),a.hasValue()&&!s.hasValue()&&(o=u),o=Math.min(o,i/2),u=Math.min(u,n/2),t){var h=(Math.sqrt(2)-1)/3*4;t.beginPath(),n>0&&i>0&&(t.moveTo(e+o,r),t.lineTo(e+i-o,r),t.bezierCurveTo(e+i-o+h*o,r,e+i,r+u-h*u,e+i,r+u),t.lineTo(e+i,r+n-u),t.bezierCurveTo(e+i,r+n-u+h*u,e+i-o+h*o,r+n,e+i-o,r+n),t.lineTo(e+o,r+n),t.bezierCurveTo(e+o-h*o,r+n,e,r+n-u+h*u,e,r+n-u),t.lineTo(e,r+u),t.bezierCurveTo(e,r+u-h*u,e+o-h*o,r,e+o,r),t.closePath())}return new Vt(e,r,e+i,r+n)}getMarkers(){return null}}class Ht extends Lt{constructor(){super(...arguments),this.type="circle"}path(t){var e=this.getAttribute("cx").getPixels("x"),r=this.getAttribute("cy").getPixels("y"),i=this.getAttribute("r").getPixels();return t&&i>0&&(t.beginPath(),t.arc(e,r,i,0,2*Math.PI,!1),t.closePath()),new Vt(e-i,r-i,e+i,r+i)}getMarkers(){return null}}class Xt extends Lt{constructor(){super(...arguments),this.type="ellipse"}path(t){var e=(Math.sqrt(2)-1)/3*4,r=this.getAttribute("rx").getPixels("x"),i=this.getAttribute("ry").getPixels("y"),n=this.getAttribute("cx").getPixels("x"),s=this.getAttribute("cy").getPixels("y");return t&&r>0&&i>0&&(t.beginPath(),t.moveTo(n+r,s),t.bezierCurveTo(n+r,s+e*i,n+e*r,s+i,n,s+i),t.bezierCurveTo(n-e*r,s+i,n-r,s+e*i,n-r,s),t.bezierCurveTo(n-r,s-e*i,n-e*r,s-i,n,s-i),t.bezierCurveTo(n+e*r,s-i,n+r,s-e*i,n+r,s),t.closePath()),new Vt(n-r,s-i,n+r,s+i)}getMarkers(){return null}}class Yt extends Lt{constructor(){super(...arguments),this.type="line"}getPoints(){return[new lt(this.getAttribute("x1").getPixels("x"),this.getAttribute("y1").getPixels("y")),new lt(this.getAttribute("x2").getPixels("x"),this.getAttribute("y2").getPixels("y"))]}path(t){var[{x:e,y:r},{x:i,y:n}]=this.getPoints();return t&&(t.beginPath(),t.moveTo(e,r),t.lineTo(i,n)),new Vt(e,r,i,n)}getMarkers(){var[t,e]=this.getPoints(),r=t.angleTo(e);return[[t,r],[e,r]]}}class Wt extends Lt{constructor(t,e,r){super(t,e,r),this.type="polyline",this.points=[],this.points=lt.parsePath(this.getAttribute("points").getString())}path(t){var{points:e}=this,[{x:r,y:i}]=e,n=new Vt(r,i);return t&&(t.beginPath(),t.moveTo(r,i)),e.forEach((e=>{var{x:r,y:i}=e;n.addPoint(r,i),t&&t.lineTo(r,i)})),n}getMarkers(){var{points:t}=this,e=t.length-1,r=[];return t.forEach(((i,n)=>{n!==e&&r.push([i,i.angleTo(t[n+1])])})),r.length>0&&r.push([t[t.length-1],r[r.length-1][1]]),r}}class qt extends Wt{constructor(){super(...arguments),this.type="polygon"}path(t){var e=super.path(t),[{x:r,y:i}]=this.points;return t&&(t.lineTo(r,i),t.closePath()),e}}class Gt extends Et{constructor(){super(...arguments),this.type="pattern"}createPattern(t,e,r){var i=this.getStyle("width").getPixels("x",!0),n=this.getStyle("height").getPixels("y",!0),s=new zt(this.document,null);s.attributes.viewBox=new ht(this.document,"viewBox",this.getAttribute("viewBox").getValue()),s.attributes.width=new ht(this.document,"width","".concat(i,"px")),s.attributes.height=new ht(this.document,"height","".concat(n,"px")),s.attributes.transform=new ht(this.document,"transform",this.getAttribute("patternTransform").getValue()),s.children=this.children;var a=this.document.createCanvas(i,n),o=a.getContext("2d"),u=this.getAttribute("x"),h=this.getAttribute("y");u.hasValue()&&h.hasValue()&&o.translate(u.getPixels("x",!0),h.getPixels("y",!0)),r.hasValue()?this.styles["fill-opacity"]=r:Reflect.deleteProperty(this.styles,"fill-opacity");for(var c=-1;c<=1;c++)for(var l=-1;l<=1;l++)o.save(),s.attributes.x=new ht(this.document,"x",c*a.width),s.attributes.y=new ht(this.document,"y",l*a.height),s.render(o),o.restore();return t.createPattern(a,"repeat")}}class Qt extends Et{constructor(){super(...arguments),this.type="marker"}render(t,e,r){if(e){var{x:i,y:n}=e,s=this.getAttribute("orient").getString("auto"),a=this.getAttribute("markerUnits").getString("strokeWidth");t.translate(i,n),"auto"===s&&t.rotate(r),"strokeWidth"===a&&t.scale(t.lineWidth,t.lineWidth),t.save();var o=new zt(this.document,null);o.type=this.type,o.attributes.viewBox=new ht(this.document,"viewBox",this.getAttribute("viewBox").getValue()),o.attributes.refX=new ht(this.document,"refX",this.getAttribute("refX").getValue()),o.attributes.refY=new ht(this.document,"refY",this.getAttribute("refY").getValue()),o.attributes.width=new ht(this.document,"width",this.getAttribute("markerWidth").getValue()),o.attributes.height=new ht(this.document,"height",this.getAttribute("markerHeight").getValue()),o.attributes.overflow=new ht(this.document,"overflow",this.getAttribute("overflow").getValue()),o.attributes.fill=new ht(this.document,"fill",this.getAttribute("fill").getColor("black")),o.attributes.stroke=new ht(this.document,"stroke",this.getAttribute("stroke").getValue("none")),o.children=this.children,o.render(t),t.restore(),"strokeWidth"===a&&t.scale(1/t.lineWidth,1/t.lineWidth),"auto"===s&&t.rotate(-r),t.translate(-i,-n)}}}class $t extends Et{constructor(){super(...arguments),this.type="defs"}render(){}}class Zt extends It{constructor(){super(...arguments),this.type="g"}getBoundingBox(t){var e=new Vt;return this.children.forEach((r=>{e.addBoundingBox(r.getBoundingBox(t))})),e}}class Kt extends Et{constructor(t,e,r){super(t,e,r),this.attributesToInherit=["gradientUnits"],this.stops=[];var{stops:i,children:n}=this;n.forEach((t=>{"stop"===t.type&&i.push(t)}))}getGradientUnits(){return this.getAttribute("gradientUnits").getString("objectBoundingBox")}createGradient(t,e,r){var i=this;this.getHrefAttribute().hasValue()&&(i=this.getHrefAttribute().getDefinition(),this.inheritStopContainer(i));var{stops:n}=i,s=this.getGradient(t,e);if(!s)return this.addParentOpacity(r,n[n.length-1].color);if(n.forEach((t=>{s.addColorStop(t.offset,this.addParentOpacity(r,t.color))})),this.getAttribute("gradientTransform").hasValue()){var{document:a}=this,{MAX_VIRTUAL_PIXELS:o,viewPort:u}=a.screen,[h]=u.viewPorts,c=new Ut(a,null);c.attributes.x=new ht(a,"x",-o/3),c.attributes.y=new ht(a,"y",-o/3),c.attributes.width=new ht(a,"width",o),c.attributes.height=new ht(a,"height",o);var l=new Zt(a,null);l.attributes.transform=new ht(a,"transform",this.getAttribute("gradientTransform").getValue()),l.children=[c];var f=new zt(a,null);f.attributes.x=new ht(a,"x",0),f.attributes.y=new ht(a,"y",0),f.attributes.width=new ht(a,"width",h.width),f.attributes.height=new ht(a,"height",h.height),f.children=[l];var g=a.createCanvas(h.width,h.height),p=g.getContext("2d");return p.fillStyle=s,f.render(p),p.createPattern(g,"no-repeat")}return s}inheritStopContainer(t){this.attributesToInherit.forEach((e=>{!this.getAttribute(e).hasValue()&&t.getAttribute(e).hasValue()&&this.getAttribute(e,!0).setValue(t.getAttribute(e).getValue())}))}addParentOpacity(t,e){return t.hasValue()?new ht(this.document,"color",e).addOpacity(t).getColor():e}}class Jt extends Kt{constructor(t,e,r){super(t,e,r),this.type="linearGradient",this.attributesToInherit.push("x1","y1","x2","y2")}getGradient(t,e){var r="objectBoundingBox"===this.getGradientUnits(),i=r?e.getBoundingBox(t):null;if(r&&!i)return null;this.getAttribute("x1").hasValue()||this.getAttribute("y1").hasValue()||this.getAttribute("x2").hasValue()||this.getAttribute("y2").hasValue()||(this.getAttribute("x1",!0).setValue(0),this.getAttribute("y1",!0).setValue(0),this.getAttribute("x2",!0).setValue(1),this.getAttribute("y2",!0).setValue(0));var n=r?i.x+i.width*this.getAttribute("x1").getNumber():this.getAttribute("x1").getPixels("x"),s=r?i.y+i.height*this.getAttribute("y1").getNumber():this.getAttribute("y1").getPixels("y"),a=r?i.x+i.width*this.getAttribute("x2").getNumber():this.getAttribute("x2").getPixels("x"),o=r?i.y+i.height*this.getAttribute("y2").getNumber():this.getAttribute("y2").getPixels("y");return n===a&&s===o?null:t.createLinearGradient(n,s,a,o)}}class te extends Kt{constructor(t,e,r){super(t,e,r),this.type="radialGradient",this.attributesToInherit.push("cx","cy","r","fx","fy","fr")}getGradient(t,e){var r="objectBoundingBox"===this.getGradientUnits(),i=e.getBoundingBox(t);if(r&&!i)return null;this.getAttribute("cx").hasValue()||this.getAttribute("cx",!0).setValue("50%"),this.getAttribute("cy").hasValue()||this.getAttribute("cy",!0).setValue("50%"),this.getAttribute("r").hasValue()||this.getAttribute("r",!0).setValue("50%");var n=r?i.x+i.width*this.getAttribute("cx").getNumber():this.getAttribute("cx").getPixels("x"),s=r?i.y+i.height*this.getAttribute("cy").getNumber():this.getAttribute("cy").getPixels("y"),a=n,o=s;this.getAttribute("fx").hasValue()&&(a=r?i.x+i.width*this.getAttribute("fx").getNumber():this.getAttribute("fx").getPixels("x")),this.getAttribute("fy").hasValue()&&(o=r?i.y+i.height*this.getAttribute("fy").getNumber():this.getAttribute("fy").getPixels("y"));var u=r?(i.width+i.height)/2*this.getAttribute("r").getNumber():this.getAttribute("r").getPixels(),h=this.getAttribute("fr").getPixels();return t.createRadialGradient(a,o,h,n,s,u)}}class ee extends Et{constructor(t,e,r){super(t,e,r),this.type="stop";var i=Math.max(0,Math.min(1,this.getAttribute("offset").getNumber())),n=this.getStyle("stop-opacity"),s=this.getStyle("stop-color",!0);""===s.getString()&&s.setValue("#000"),n.hasValue()&&(s=s.addOpacity(n)),this.offset=i,this.color=s.getColor()}}class re extends Et{constructor(t,e,r){super(t,e,r),this.type="animate",this.duration=0,this.initialValue=null,this.initialUnits="",this.removed=!1,this.frozen=!1,t.screen.animations.push(this),this.begin=this.getAttribute("begin").getMilliseconds(),this.maxDuration=this.begin+this.getAttribute("dur").getMilliseconds(),this.from=this.getAttribute("from"),this.to=this.getAttribute("to"),this.values=new ht(t,"values",null);var i=this.getAttribute("values");i.hasValue()&&this.values.setValue(i.getString().split(";"))}getProperty(){var t=this.getAttribute("attributeType").getString(),e=this.getAttribute("attributeName").getString();return"CSS"===t?this.parent.getStyle(e,!0):this.parent.getAttribute(e,!0)}calcValue(){var{initialUnits:t}=this,{progress:e,from:r,to:i}=this.getProgress(),n=r.getNumber()+(i.getNumber()-r.getNumber())*e;return"%"===t&&(n*=100),"".concat(n).concat(t)}update(t){var{parent:e}=this,r=this.getProperty();if(this.initialValue||(this.initialValue=r.getString(),this.initialUnits=r.getUnits()),this.duration>this.maxDuration){var i=this.getAttribute("fill").getString("remove");if("indefinite"===this.getAttribute("repeatCount").getString()||"indefinite"===this.getAttribute("repeatDur").getString())this.duration=0;else if("freeze"!==i||this.frozen){if("remove"===i&&!this.removed)return this.removed=!0,r.setValue(e.animationFrozen?e.animationFrozenValue:this.initialValue),!0}else this.frozen=!0,e.animationFrozen=!0,e.animationFrozenValue=r.getString();return!1}this.duration+=t;var n=!1;if(this.begine+(n[r]-e)*t)).join(" ");return s}}class se extends Et{constructor(t,e,r){super(t,e,r),this.type="font",this.glyphs={},this.horizAdvX=this.getAttribute("horiz-adv-x").getNumber();var{definitions:i}=t,{children:n}=this;for(var s of n)switch(s.type){case"font-face":this.fontFace=s;var a=s.getStyle("font-family");a.hasValue()&&(i[a.getString()]=this);break;case"missing-glyph":this.missingGlyph=s;break;case"glyph":var o=s;o.arabicForm?(this.isRTL=!0,this.isArabic=!0,void 0===this.glyphs[o.unicode]&&(this.glyphs[o.unicode]={}),this.glyphs[o.unicode][o.arabicForm]=o):this.glyphs[o.unicode]=o}}render(){}}class ae extends Et{constructor(t,e,r){super(t,e,r),this.type="font-face",this.ascent=this.getAttribute("ascent").getNumber(),this.descent=this.getAttribute("descent").getNumber(),this.unitsPerEm=this.getAttribute("units-per-em").getNumber()}}class oe extends Lt{constructor(){super(...arguments),this.type="missing-glyph",this.horizAdvX=0}}class ue extends Bt{constructor(){super(...arguments),this.type="tref"}getText(){var t=this.getHrefAttribute().getDefinition();if(t){var e=t.children[0];if(e)return e.getText()}return""}}class he extends Bt{constructor(t,e,r){super(t,e,r),this.type="a";var{childNodes:i}=e,n=i[0],s=i.length>0&&Array.from(i).every((t=>3===t.nodeType));this.hasText=s,this.text=s?this.getTextFromNode(n):""}getText(){return this.text}renderChildren(t){if(this.hasText){super.renderChildren(t);var{document:e,x:r,y:i}=this,{mouse:n}=e.screen,s=new ht(e,"fontSize",_t.parse(e.ctx.font).fontSize);n.isWorking()&&n.checkBoundingBox(this,new Vt(r,i-s.getPixels("y"),r+this.measureText(t),i))}else if(this.children.length>0){var a=new Zt(this.document,null);a.children=this.children,a.parent=this,a.render(t)}}onClick(){var{window:t}=this.document;t&&t.open(this.getHrefAttribute().getString())}onMouseMove(){this.document.ctx.canvas.style.cursor="pointer"}}function ce(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,i)}return r}function le(t){for(var e=1;e{var{type:r,points:i}=e;switch(r){case kt.LINE_TO:t&&t.lineTo(i[0],i[1]);break;case kt.MOVE_TO:t&&t.moveTo(i[0],i[1]);break;case kt.CURVE_TO:t&&t.bezierCurveTo(i[0],i[1],i[2],i[3],i[4],i[5]);break;case kt.QUAD_TO:t&&t.quadraticCurveTo(i[0],i[1],i[2],i[3]);break;case kt.ARC:var[n,s,a,o,u,h,c,l]=i,f=a>o?a:o,g=a>o?1:a/o,p=a>o?o/a:1;t&&(t.translate(n,s),t.rotate(c),t.scale(g,p),t.arc(0,0,f,u,u+h,Boolean(1-l)),t.scale(1/g,1/p),t.rotate(-c),t.translate(-n,-s));break;case kt.CLOSE_PATH:t&&t.closePath()}}))}renderChildren(t){this.setTextData(t),t.save();var e=this.parent.getStyle("text-decoration").getString(),r=this.getFontSize(),{glyphInfo:i}=this,n=t.fillStyle;"underline"===e&&t.beginPath(),i.forEach(((i,n)=>{var{p0:s,p1:a,rotation:o,text:u}=i;t.save(),t.translate(s.x,s.y),t.rotate(o),t.fillStyle&&t.fillText(u,0,0),t.strokeStyle&&t.strokeText(u,0,0),t.restore(),"underline"===e&&(0===n&&t.moveTo(s.x,s.y+r/8),t.lineTo(a.x,a.y+r/5))})),"underline"===e&&(t.lineWidth=r/20,t.strokeStyle=n,t.stroke(),t.closePath()),t.restore()}getLetterSpacingAt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return this.letterSpacingCache[t]||0}findSegmentToFitChar(t,e,r,i,n,s,a,o,u){var h=s,c=this.measureText(t,o);" "===o&&"justify"===e&&r-1&&(h+=this.getLetterSpacingAt(u));var l=this.textHeight/20,f=this.getEquidistantPointOnPath(h,l,0),g=this.getEquidistantPointOnPath(h+c,l,0),p={p0:f,p1:g},d=f&&g?Math.atan2(g.y-f.y,g.x-f.x):0;if(a){var v=Math.cos(Math.PI/2+d)*a,y=Math.cos(-d)*a;p.p0=le(le({},f),{},{x:f.x+v,y:f.y+y}),p.p1=le(le({},g),{},{x:g.x+v,y:g.y+y})}return{offset:h+=c,segment:p,rotation:d}}measureText(t,e){var{measuresCache:r}=this,i=e||this.getText();if(r.has(i))return r.get(i);var n=this.measureTargetText(t,i);return r.set(i,n),n}setTextData(t){if(!this.glyphInfo){var e=this.getText(),r=e.split(""),i=e.split(" ").length-1,n=this.parent.getAttribute("dx").split().map((t=>t.getPixels("x"))),s=this.parent.getAttribute("dy").getPixels("y"),a=this.parent.getStyle("text-anchor").getString("start"),o=this.getStyle("letter-spacing"),u=this.parent.getStyle("letter-spacing"),h=0;o.hasValue()&&"inherit"!==o.getValue()?o.hasValue()&&"initial"!==o.getValue()&&"unset"!==o.getValue()&&(h=o.getPixels()):h=u.getPixels();var c=[],l=e.length;this.letterSpacingCache=c;for(var f=0;f0===r?0:t+e||0),0),p=this.measureText(t),d=Math.max(p+g,0);this.textWidth=p,this.textHeight=this.getFontSize(),this.glyphInfo=[];var v=this.getPathLength(),y=this.getStyle("startOffset").getNumber(0)*v,m=0;"middle"!==a&&"center"!==a||(m=-d/2),"end"!==a&&"right"!==a||(m=-d),m+=y,r.forEach(((e,n)=>{var{offset:o,segment:u,rotation:h}=this.findSegmentToFitChar(t,a,d,v,i,m,s,e,n);m=o,u.p0&&u.p1&&this.glyphInfo.push({text:r[n],p0:u.p0,p1:u.p1,rotation:h})}))}}parsePathData(t){if(this.pathLength=-1,!t)return[];var e=[],{pathParser:r}=t;for(r.reset();!r.isEnd();){var{current:i}=r,n=i?i.x:0,s=i?i.y:0,a=r.next(),o=a.type,u=[];switch(a.type){case kt.MOVE_TO:this.pathM(r,u);break;case kt.LINE_TO:o=this.pathL(r,u);break;case kt.HORIZ_LINE_TO:o=this.pathH(r,u);break;case kt.VERT_LINE_TO:o=this.pathV(r,u);break;case kt.CURVE_TO:this.pathC(r,u);break;case kt.SMOOTH_CURVE_TO:o=this.pathS(r,u);break;case kt.QUAD_TO:this.pathQ(r,u);break;case kt.SMOOTH_QUAD_TO:o=this.pathT(r,u);break;case kt.ARC:u=this.pathA(r);break;case kt.CLOSE_PATH:Lt.pathZ(r)}a.type!==kt.CLOSE_PATH?e.push({type:o,points:u,start:{x:n,y:s},pathLength:this.calcLength(n,s,o,u)}):e.push({type:kt.CLOSE_PATH,points:[],pathLength:0})}return e}pathM(t,e){var{x:r,y:i}=Lt.pathM(t).point;e.push(r,i)}pathL(t,e){var{x:r,y:i}=Lt.pathL(t).point;return e.push(r,i),kt.LINE_TO}pathH(t,e){var{x:r,y:i}=Lt.pathH(t).point;return e.push(r,i),kt.LINE_TO}pathV(t,e){var{x:r,y:i}=Lt.pathV(t).point;return e.push(r,i),kt.LINE_TO}pathC(t,e){var{point:r,controlPoint:i,currentPoint:n}=Lt.pathC(t);e.push(r.x,r.y,i.x,i.y,n.x,n.y)}pathS(t,e){var{point:r,controlPoint:i,currentPoint:n}=Lt.pathS(t);return e.push(r.x,r.y,i.x,i.y,n.x,n.y),kt.CURVE_TO}pathQ(t,e){var{controlPoint:r,currentPoint:i}=Lt.pathQ(t);e.push(r.x,r.y,i.x,i.y)}pathT(t,e){var{controlPoint:r,currentPoint:i}=Lt.pathT(t);return e.push(r.x,r.y,i.x,i.y),kt.QUAD_TO}pathA(t){var{rX:e,rY:r,sweepFlag:i,xAxisRotation:n,centp:s,a1:a,ad:o}=Lt.pathA(t);return 0===i&&o>0&&(o-=2*Math.PI),1===i&&o<0&&(o+=2*Math.PI),[s.x,s.y,e,r,a,o,n,i]}calcLength(t,e,r,i){var n=0,s=null,a=null,o=0;switch(r){case kt.LINE_TO:return this.getLineLength(t,e,i[0],i[1]);case kt.CURVE_TO:for(n=0,s=this.getPointOnCubicBezier(0,t,e,i[0],i[1],i[2],i[3],i[4],i[5]),o=.01;o<=1;o+=.01)a=this.getPointOnCubicBezier(o,t,e,i[0],i[1],i[2],i[3],i[4],i[5]),n+=this.getLineLength(s.x,s.y,a.x,a.y),s=a;return n;case kt.QUAD_TO:for(n=0,s=this.getPointOnQuadraticBezier(0,t,e,i[0],i[1],i[2],i[3]),o=.01;o<=1;o+=.01)a=this.getPointOnQuadraticBezier(o,t,e,i[0],i[1],i[2],i[3]),n+=this.getLineLength(s.x,s.y,a.x,a.y),s=a;return n;case kt.ARC:n=0;var u=i[4],h=i[5],c=i[4]+h,l=Math.PI/180;if(Math.abs(u-c)c;o-=l)a=this.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],o,0),n+=this.getLineLength(s.x,s.y,a.x,a.y),s=a;else for(o=u+l;o5&&void 0!==arguments[5]?arguments[5]:e,a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:r,o=(n-r)/(i-e+K),u=Math.sqrt(t*t/(1+o*o));ie)return null;var{dataArray:n}=this;for(var s of n){if(!s||!(s.pathLength<5e-5||r+s.pathLength+5e-5=0&&o>c)break;i=this.getPointOnEllipticalArc(s.points[0],s.points[1],s.points[2],s.points[3],o,s.points[6]);break;case kt.CURVE_TO:(o=a/s.pathLength)>1&&(o=1),i=this.getPointOnCubicBezier(o,s.start.x,s.start.y,s.points[0],s.points[1],s.points[2],s.points[3],s.points[4],s.points[5]);break;case kt.QUAD_TO:(o=a/s.pathLength)>1&&(o=1),i=this.getPointOnQuadraticBezier(o,s.start.x,s.start.y,s.points[0],s.points[1],s.points[2],s.points[3])}if(i)return i;break}r+=s.pathLength}return null}getLineLength(t,e,r,i){return Math.sqrt((r-t)*(r-t)+(i-e)*(i-e))}getPathLength(){return-1===this.pathLength&&(this.pathLength=this.dataArray.reduce(((t,e)=>e.pathLength>0?t+e.pathLength:t),0)),this.pathLength}getPointOnCubicBezier(t,e,r,i,n,s,a,o,u){return{x:o*rt(t)+s*it(t)+i*nt(t)+e*st(t),y:u*rt(t)+a*it(t)+n*nt(t)+r*st(t)}}getPointOnQuadraticBezier(t,e,r,i,n,s,a){return{x:s*at(t)+i*ot(t)+e*ut(t),y:a*at(t)+n*ot(t)+r*ut(t)}}getPointOnEllipticalArc(t,e,r,i,n,s){var a=Math.cos(s),o=Math.sin(s),u=r*Math.cos(n),h=i*Math.sin(n);return{x:t+(u*a-h*o),y:e+(u*o+h*a)}}buildEquidistantCache(t,e){var r=this.getPathLength(),i=e||.25,n=t||r/100;if(!this.equidistantCache||this.equidistantCache.step!==n||this.equidistantCache.precision!==i){this.equidistantCache={step:n,precision:i,points:[]};for(var s=0,a=0;a<=r;a+=i){var o=this.getPointOnPath(a),u=this.getPointOnPath(a+i);o&&u&&(s+=this.getLineLength(o.x,o.y,u.x,u.y))>=n&&(this.equidistantCache.points.push({x:o.x,y:o.y,distance:a}),s-=n)}}}getEquidistantPointOnPath(t,e,r){if(this.buildEquidistantCache(e,r),t<0||t-this.getPathLength()>5e-5)return null;var i=Math.round(t/this.getPathLength()*(this.equidistantCache.points.length-1));return this.equidistantCache.points[i]||null}}var ge=/^\s*data:(([^/,;]+\/[^/,;]+)(?:;([^,;=]+=[^,;=]+))?)?(?:;(base64))?,(.*)$/i;class pe extends It{constructor(t,e,r){super(t,e,r),this.type="image",this.loaded=!1;var i=this.getHrefAttribute().getString();if(i){var n=i.endsWith(".svg")||/^\s*data:image\/svg\+xml/i.test(i);t.images.push(this),n?this.loadSvg(i):this.loadImage(i),this.isSvg=n}}loadImage(t){var e=this;return n((function*(){try{var r=yield e.document.createImage(t);e.image=r}catch(e){console.error('Error while loading image "'.concat(t,'":'),e)}e.loaded=!0}))()}loadSvg(t){var e=this;return n((function*(){var r=ge.exec(t);if(r){var i=r[5];"base64"===r[4]?e.image=atob(i):e.image=decodeURIComponent(i)}else try{var n=yield e.document.fetch(t),s=yield n.text();e.image=s}catch(e){console.error('Error while loading image "'.concat(t,'":'),e)}e.loaded=!0}))()}renderChildren(t){var{document:e,image:r,loaded:i}=this,n=this.getAttribute("x").getPixels("x"),s=this.getAttribute("y").getPixels("y"),a=this.getStyle("width").getPixels("x"),o=this.getStyle("height").getPixels("y");if(i&&r&&a&&o){if(t.save(),t.translate(n,s),this.isSvg){var u=e.canvg.forkString(t,this.image,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:0,offsetY:0,scaleWidth:a,scaleHeight:o});u.document.documentElement.parent=this,u.render()}else{var h=this.image;e.setViewBox({ctx:t,aspectRatio:this.getAttribute("preserveAspectRatio").getString(),width:a,desiredWidth:h.width,height:o,desiredHeight:h.height}),this.loaded&&(void 0===h.complete||h.complete)&&t.drawImage(h,0,0)}t.restore()}}getBoundingBox(){var t=this.getAttribute("x").getPixels("x"),e=this.getAttribute("y").getPixels("y"),r=this.getStyle("width").getPixels("x"),i=this.getStyle("height").getPixels("y");return new Vt(t,e,t+r,e+i)}}class de extends It{constructor(){super(...arguments),this.type="symbol"}render(t){}}class ve{constructor(t){this.document=t,this.loaded=!1,t.fonts.push(this)}load(t,e){var r=this;return n((function*(){try{var{document:i}=r,n=(yield i.canvg.parser.load(e)).getElementsByTagName("font");Array.from(n).forEach((e=>{var r=i.createElement(e);i.definitions[t]=r}))}catch(t){console.error('Error while loading font "'.concat(e,'":'),t)}r.loaded=!0}))()}}class ye extends Et{constructor(t,e,r){super(t,e,r),this.type="style";var i=I(Array.from(e.childNodes).map((t=>t.textContent)).join("").replace(/(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,"").replace(/@import.*;/g,""));i.split("}").forEach((e=>{var r=e.trim();if(r){var i=r.split("{"),n=i[0].split(","),s=i[1].split(";");n.forEach((e=>{var r=e.trim();if(r){var i=t.styles[r]||{};if(s.forEach((e=>{var r=e.indexOf(":"),n=e.substr(0,r).trim(),s=e.substr(r+1,e.length-r).trim();n&&s&&(i[n]=new ht(t,n,s))})),t.styles[r]=i,t.stylesSpecificity[r]=Z(r),"@font-face"===r){var n=i["font-family"].getString().replace(/"|'/g,"");i.src.getString().split(",").forEach((e=>{if(e.indexOf('format("svg")')>0){var r=z(e);r&&new ve(t).load(n,r)}}))}}}))}}))}}ye.parseExternalUrl=z;class me extends It{constructor(){super(...arguments),this.type="use"}setContext(t){super.setContext(t);var e=this.getAttribute("x"),r=this.getAttribute("y");e.hasValue()&&t.translate(e.getPixels("x"),0),r.hasValue()&&t.translate(0,r.getPixels("y"))}path(t){var{element:e}=this;e&&e.path(t)}renderChildren(t){var{document:e,element:r}=this;if(r){var i=r;if("symbol"===r.type&&((i=new zt(e,null)).attributes.viewBox=new ht(e,"viewBox",r.getAttribute("viewBox").getString()),i.attributes.preserveAspectRatio=new ht(e,"preserveAspectRatio",r.getAttribute("preserveAspectRatio").getString()),i.attributes.overflow=new ht(e,"overflow",r.getAttribute("overflow").getString()),i.children=r.children,r.styles.opacity=new ht(e,"opacity",this.calculateOpacity())),"svg"===i.type){var n=this.getStyle("width",!1,!0),s=this.getStyle("height",!1,!0);n.hasValue()&&(i.attributes.width=new ht(e,"width",n.getString())),s.hasValue()&&(i.attributes.height=new ht(e,"height",s.getString()))}var a=i.parent;i.parent=this,i.render(t),i.parent=a}}getBoundingBox(t){var{element:e}=this;return e?e.getBoundingBox(t):null}elementTransform(){var{document:t,element:e}=this;return Ct.fromElement(t,e)}get element(){return this.cachedElement||(this.cachedElement=this.getHrefAttribute().getDefinition()),this.cachedElement}}function xe(t,e,r,i,n,s){return t[r*i*4+4*e+s]}function be(t,e,r,i,n,s,a){t[r*i*4+4*e+s]=a}function we(t,e,r){return t[e]*r}function Se(t,e,r,i){return e+Math.cos(t)*r+Math.sin(t)*i}class Te extends Et{constructor(t,e,r){super(t,e,r),this.type="feColorMatrix";var i=B(this.getAttribute("values").getString());switch(this.getAttribute("type").getString("matrix")){case"saturate":var n=i[0];i=[.213+.787*n,.715-.715*n,.072-.072*n,0,0,.213-.213*n,.715+.285*n,.072-.072*n,0,0,.213-.213*n,.715-.715*n,.072+.928*n,0,0,0,0,0,1,0,0,0,0,0,1];break;case"hueRotate":var s=i[0]*Math.PI/180;i=[Se(s,.213,.787,-.213),Se(s,.715,-.715,-.715),Se(s,.072,-.072,.928),0,0,Se(s,.213,-.213,.143),Se(s,.715,.285,.14),Se(s,.072,-.072,-.283),0,0,Se(s,.213,-.213,-.787),Se(s,.715,-.715,.715),Se(s,.072,.928,.072),0,0,0,0,0,1,0,0,0,0,0,1];break;case"luminanceToAlpha":i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.2125,.7154,.0721,0,0,0,0,0,0,1]}this.matrix=i,this.includeOpacity=this.getAttribute("includeOpacity").hasValue()}apply(t,e,r,i,n){for(var{includeOpacity:s,matrix:a}=this,o=t.getImageData(0,0,i,n),u=0;u{o.addBoundingBox(e.getBoundingBox(t))})),i=Math.floor(o.x1),n=Math.floor(o.y1),s=Math.floor(o.width),a=Math.floor(o.height)}var u=this.removeStyles(e,Oe.ignoreStyles),h=r.createCanvas(i+s,n+a),c=h.getContext("2d");r.screen.setDefaults(c),this.renderChildren(c),new Te(r,{nodeType:1,childNodes:[],attributes:[{nodeName:"type",value:"luminanceToAlpha"},{nodeName:"includeOpacity",value:"true"}]}).apply(c,0,0,i+s,n+a);var l=r.createCanvas(i+s,n+a),f=l.getContext("2d");r.screen.setDefaults(f),e.render(f),f.globalCompositeOperation="destination-in",f.fillStyle=c.createPattern(h,"no-repeat"),f.fillRect(0,0,i+s,n+a),t.fillStyle=f.createPattern(l,"no-repeat"),t.fillRect(0,0,i+s,n+a),this.restoreStyles(e,u)}render(t){}}Oe.ignoreStyles=["mask","transform","clip-path"];var Ae=()=>{};class Ce extends Et{constructor(){super(...arguments),this.type="clipPath"}apply(t){var{document:e}=this,r=Reflect.getPrototypeOf(t),{beginPath:i,closePath:n}=t;r&&(r.beginPath=Ae,r.closePath=Ae),Reflect.apply(i,t,[]),this.children.forEach((i=>{if(void 0!==i.path){var s=void 0!==i.elementTransform?i.elementTransform():null;s||(s=Ct.fromElement(e,i)),s&&s.apply(t),i.path(t),r&&(r.closePath=n),s&&s.unapply(t)}})),Reflect.apply(n,t,[]),t.clip(),r&&(r.beginPath=i,r.closePath=n)}render(t){}}class Ee extends Et{constructor(){super(...arguments),this.type="filter"}apply(t,e){var{document:r,children:i}=this,n=e.getBoundingBox(t);if(n){var s=0,a=0;i.forEach((t=>{var e=t.extraFilterDistance||0;s=Math.max(s,e),a=Math.max(a,e)}));var o=Math.floor(n.width),u=Math.floor(n.height),h=o+2*s,c=u+2*a;if(!(h<1||c<1)){var l=Math.floor(n.x),f=Math.floor(n.y),g=this.removeStyles(e,Ee.ignoreStyles),p=r.createCanvas(h,c),d=p.getContext("2d");r.screen.setDefaults(d),d.translate(-l+s,-f+a),e.render(d),i.forEach((t=>{"function"==typeof t.apply&&t.apply(d,0,0,h,c)})),t.drawImage(p,0,0,h,c,l-s,f-a,h,c),this.restoreStyles(e,g)}}}render(t){}}Ee.ignoreStyles=["filter","transform","clip-path"];class Pe extends Et{constructor(t,e,r){super(t,e,r),this.type="feDropShadow",this.addStylesFromStyleDefinition()}apply(t,e,r,i,n){}}class Ne extends Et{constructor(){super(...arguments),this.type="feMorphology"}apply(t,e,r,i,n){}}class Me extends Et{constructor(){super(...arguments),this.type="feComposite"}apply(t,e,r,i,n){}}class Re extends Et{constructor(t,e,r){super(t,e,r),this.type="feGaussianBlur",this.blurRadius=Math.floor(this.getAttribute("stdDeviation").getNumber()),this.extraFilterDistance=this.blurRadius}apply(t,e,r,i,n){var{document:s,blurRadius:a}=this,o=s.window?s.window.document.body:null,u=t.canvas;u.id=s.getUniqueId(),o&&(u.style.display="none",o.appendChild(u)),_(u,e,r,i,n,a),o&&o.removeChild(u)}}class _e extends Et{constructor(){super(...arguments),this.type="title"}}class Ve extends Et{constructor(){super(...arguments),this.type="desc"}}var ke={svg:zt,rect:Ut,circle:Ht,ellipse:Xt,line:Yt,polyline:Wt,polygon:qt,path:Lt,pattern:Gt,marker:Qt,defs:$t,linearGradient:Jt,radialGradient:te,stop:ee,animate:re,animateColor:ie,animateTransform:ne,font:se,"font-face":ae,"missing-glyph":oe,glyph:Dt,text:Bt,tspan:jt,tref:ue,a:he,textPath:fe,image:pe,g:Zt,symbol:de,style:ye,use:me,mask:Oe,clipPath:Ce,filter:Ee,feDropShadow:Pe,feMorphology:Ne,feComposite:Me,feColorMatrix:Te,feGaussianBlur:Re,title:_e,desc:Ve};function Ie(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,i)}return r}function Le(){return Le=n((function*(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=document.createElement("img");return e&&(r.crossOrigin="Anonymous"),new Promise(((e,i)=>{r.onload=()=>{e(r)},r.onerror=(t,e,r,n,s)=>{i(s)},r.src=t}))})),Le.apply(this,arguments)}class De{constructor(t){var{rootEmSize:e=12,emSize:r=12,createCanvas:i=De.createCanvas,createImage:n=De.createImage,anonymousCrossOrigin:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.canvg=t,this.definitions={},this.styles={},this.stylesSpecificity={},this.images=[],this.fonts=[],this.emSizeStack=[],this.uniqueId=0,this.screen=t.screen,this.rootEmSize=e,this.emSize=r,this.createCanvas=i,this.createImage=this.bindCreateImage(n,s),this.screen.wait(this.isImagesLoaded.bind(this)),this.screen.wait(this.isFontsLoaded.bind(this))}bindCreateImage(t,e){return"boolean"==typeof e?(r,i)=>t(r,"boolean"==typeof i?i:e):t}get window(){return this.screen.window}get fetch(){return this.screen.fetch}get ctx(){return this.screen.ctx}get emSize(){var{emSizeStack:t}=this;return t[t.length-1]}set emSize(t){var{emSizeStack:e}=this;e.push(t)}popEmSize(){var{emSizeStack:t}=this;t.pop()}getUniqueId(){return"canvg".concat(++this.uniqueId)}isImagesLoaded(){return this.images.every((t=>t.loaded))}isFontsLoaded(){return this.fonts.every((t=>t.loaded))}createDocumentElement(t){var e=this.createElement(t.documentElement);return e.root=!0,e.addStylesFromStyleDefinition(),this.documentElement=e,e}createElement(t){var e=t.nodeName.replace(/^[^:]+:/,""),r=De.elementTypes[e];return void 0!==r?new r(this,t):new Pt(this,t)}createTextNode(t){return new Ft(this,t)}setViewBox(t){this.screen.setViewBox(function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:{};this.parser=new mt(r),this.screen=new dt(t,r),this.options=r;var i=new De(this,r),n=i.createDocumentElement(e);this.document=i,this.documentElement=n}static from(t,e){var r=arguments;return n((function*(){var i=r.length>2&&void 0!==r[2]?r[2]:{},n=new mt(i),s=yield n.parse(e);return new Fe(t,s,i)}))()}static fromString(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=new mt(r).parseFromString(e);return new Fe(t,i,r)}fork(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Fe.from(t,e,je(je({},this.options),r))}forkString(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Fe.fromString(t,e,je(je({},this.options),r))}ready(){return this.screen.ready()}isReady(){return this.screen.isReady()}render(){var t=arguments,e=this;return n((function*(){var r=t.length>0&&void 0!==t[0]?t[0]:{};e.start(je({enableRedraw:!0,ignoreAnimation:!0,ignoreMouse:!0},r)),yield e.ready(),e.stop()}))()}start(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{documentElement:e,screen:r,options:i}=this;r.start(e,je(je({enableRedraw:!0},i),t))}stop(){this.screen.stop()}resize(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.documentElement.resize(t,e,r)}}}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssS0FDbHdDQyxFQUFXLENBQUMsRUFBRyxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLElB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eGxELEdBQ25CLENBTUEsSUFBQW9MLEdBQ0V4ZixLQUFLd3FDLE9BQU9ockIsTUFDZCxDQVNBLE1BQUFtb0MsQ0FBT3ZuQixHQUNMLElBQUlDLEVBQVN2K0IsVUFBVXJCLE9BQVMsUUFBc0JtTyxJQUFqQjlNLFVBQVUsR0FBbUJBLFVBQVUsR0FBS3MrQixFQUM3RXduQixFQUFzQjlsRCxVQUFVckIsT0FBUyxRQUFzQm1PLElBQWpCOU0sVUFBVSxJQUFtQkEsVUFBVSxHQUN6RjlCLEtBQUtnMEQsZ0JBQWdCck0sT0FBT3ZuQixFQUFPQyxFQUFRdW5CLEVBQzdDLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3BlcmZvcm1hbmNlLW5vd0AyLjEuMC9ub2RlX21vZHVsZXMvcGVyZm9ybWFuY2Utbm93L2xpYi9wZXJmb3JtYW5jZS1ub3cuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9yYWZAMy40LjEvbm9kZV9tb2R1bGVzL3JhZi9pbmRleC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JnYmNvbG9yQDEuMC4xL25vZGVfbW9kdWxlcy9yZ2Jjb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcy1wZWJibGUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtd2Vib3Mtd2Via2l0LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1hcHBseS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC10aGlzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3QtYS1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhZmUtZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2guanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmFjZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zOC4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzguMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM4LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGJhYmVsK3J1bnRpbWVANy4yNS43L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGJhYmVsK3J1bnRpbWVANy4yNS43L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BiYWJlbCtydW50aW1lQDcuMjUuNy9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BiYWJlbCtydW50aW1lQDcuMjUuNy9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9zdmctcGF0aGRhdGFANi4wLjMvbm9kZV9tb2R1bGVzL3N2Zy1wYXRoZGF0YS9saWIvU1ZHUGF0aERhdGEubW9kdWxlLmpzIiwid2VicGFjazovL3JlYWN0X3d5ei8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vc3RhY2tibHVyLWNhbnZhc0AyLjcuMC9ub2RlX21vZHVsZXMvc3RhY2tibHVyLWNhbnZhcy9kaXN0L3N0YWNrYmx1ci1lcy5qcyIsIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NhbnZnQDMuMC4xMC9ub2RlX21vZHVsZXMvY2FudmcvbGliL2luZGV4LmVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi4yXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBnZXROYW5vU2Vjb25kcywgaHJ0aW1lLCBsb2FkVGltZSwgbW9kdWxlTG9hZFRpbWUsIG5vZGVMb2FkVGltZSwgdXBUaW1lO1xuXG4gIGlmICgodHlwZW9mIHBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmIHBlcmZvcm1hbmNlICE9PSBudWxsKSAmJiBwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MgIT09IG51bGwpICYmIHByb2Nlc3MuaHJ0aW1lKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAoZ2V0TmFub1NlY29uZHMoKSAtIG5vZGVMb2FkVGltZSkgLyAxZTY7XG4gICAgfTtcbiAgICBocnRpbWUgPSBwcm9jZXNzLmhydGltZTtcbiAgICBnZXROYW5vU2Vjb25kcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhyO1xuICAgICAgaHIgPSBocnRpbWUoKTtcbiAgICAgIHJldHVybiBoclswXSAqIDFlOSArIGhyWzFdO1xuICAgIH07XG4gICAgbW9kdWxlTG9hZFRpbWUgPSBnZXROYW5vU2Vjb25kcygpO1xuICAgIHVwVGltZSA9IHByb2Nlc3MudXB0aW1lKCkgKiAxZTk7XG4gICAgbm9kZUxvYWRUaW1lID0gbW9kdWxlTG9hZFRpbWUgLSB1cFRpbWU7XG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbG9hZFRpbWU7XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbn0pLmNhbGwodGhpcyk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcmZvcm1hbmNlLW5vdy5qcy5tYXBcbiIsInZhciBub3cgPSByZXF1aXJlKCdwZXJmb3JtYW5jZS1ub3cnKVxuICAsIHJvb3QgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xuICAsIHZlbmRvcnMgPSBbJ21veicsICd3ZWJraXQnXVxuICAsIHN1ZmZpeCA9ICdBbmltYXRpb25GcmFtZSdcbiAgLCByYWYgPSByb290WydyZXF1ZXN0JyArIHN1ZmZpeF1cbiAgLCBjYWYgPSByb290WydjYW5jZWwnICsgc3VmZml4XSB8fCByb290WydjYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cblxuZm9yKHZhciBpID0gMDsgIXJhZiAmJiBpIDwgdmVuZG9ycy5sZW5ndGg7IGkrKykge1xuICByYWYgPSByb290W3ZlbmRvcnNbaV0gKyAnUmVxdWVzdCcgKyBzdWZmaXhdXG4gIGNhZiA9IHJvb3RbdmVuZG9yc1tpXSArICdDYW5jZWwnICsgc3VmZml4XVxuICAgICAgfHwgcm9vdFt2ZW5kb3JzW2ldICsgJ0NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxufVxuXG4vLyBTb21lIHZlcnNpb25zIG9mIEZGIGhhdmUgckFGIGJ1dCBub3QgY0FGXG5pZighcmFmIHx8ICFjYWYpIHtcbiAgdmFyIGxhc3QgPSAwXG4gICAgLCBpZCA9IDBcbiAgICAsIHF1ZXVlID0gW11cbiAgICAsIGZyYW1lRHVyYXRpb24gPSAxMDAwIC8gNjBcblxuICByYWYgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFyIF9ub3cgPSBub3coKVxuICAgICAgICAsIG5leHQgPSBNYXRoLm1heCgwLCBmcmFtZUR1cmF0aW9uIC0gKF9ub3cgLSBsYXN0KSlcbiAgICAgIGxhc3QgPSBuZXh0ICsgX25vd1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNwID0gcXVldWUuc2xpY2UoMClcbiAgICAgICAgLy8gQ2xlYXIgcXVldWUgaGVyZSB0byBwcmV2ZW50XG4gICAgICAgIC8vIGNhbGxiYWNrcyBmcm9tIGFwcGVuZGluZyBsaXN0ZW5lcnNcbiAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgZnJhbWUncyBxdWV1ZVxuICAgICAgICBxdWV1ZS5sZW5ndGggPSAwXG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmKCFjcFtpXS5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgY3BbaV0uY2FsbGJhY2sobGFzdClcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aHJvdyBlIH0sIDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBNYXRoLnJvdW5kKG5leHQpKVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKHtcbiAgICAgIGhhbmRsZTogKytpZCxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIGNhbmNlbGxlZDogZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpZFxuICB9XG5cbiAgY2FmID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZihxdWV1ZVtpXS5oYW5kbGUgPT09IGhhbmRsZSkge1xuICAgICAgICBxdWV1ZVtpXS5jYW5jZWxsZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4pIHtcbiAgLy8gV3JhcCBpbiBhIG5ldyBmdW5jdGlvbiB0byBwcmV2ZW50XG4gIC8vIGBjYW5jZWxgIHBvdGVudGlhbGx5IGJlaW5nIGFzc2lnbmVkXG4gIC8vIHRvIHRoZSBuYXRpdmUgckFGIGZ1bmN0aW9uXG4gIHJldHVybiByYWYuY2FsbChyb290LCBmbilcbn1cbm1vZHVsZS5leHBvcnRzLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICBjYWYuYXBwbHkocm9vdCwgYXJndW1lbnRzKVxufVxubW9kdWxlLmV4cG9ydHMucG9seWZpbGwgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICBvYmplY3QgPSByb290O1xuICB9XG4gIG9iamVjdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByYWZcbiAgb2JqZWN0LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2FmXG59XG4iLCIvKlxuXHRCYXNlZCBvbiByZ2Jjb2xvci5qcyBieSBTdG95YW4gU3RlZmFub3YgPHNzdG9vQGdtYWlsLmNvbT5cblx0aHR0cDovL3d3dy5waHBpZWQuY29tL3JnYi1jb2xvci1wYXJzZXItaW4tamF2YXNjcmlwdC9cbiovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29sb3Jfc3RyaW5nKSB7XG4gICAgdGhpcy5vayA9IGZhbHNlO1xuICAgIHRoaXMuYWxwaGEgPSAxLjA7XG5cbiAgICAvLyBzdHJpcCBhbnkgbGVhZGluZyAjXG4gICAgaWYgKGNvbG9yX3N0cmluZy5jaGFyQXQoMCkgPT0gJyMnKSB7IC8vIHJlbW92ZSAjIGlmIGFueVxuICAgICAgICBjb2xvcl9zdHJpbmcgPSBjb2xvcl9zdHJpbmcuc3Vic3RyKDEsNik7XG4gICAgfVxuXG4gICAgY29sb3Jfc3RyaW5nID0gY29sb3Jfc3RyaW5nLnJlcGxhY2UoLyAvZywnJyk7XG4gICAgY29sb3Jfc3RyaW5nID0gY29sb3Jfc3RyaW5nLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBiZWZvcmUgZ2V0dGluZyBpbnRvIHJlZ2V4cHMsIHRyeSBzaW1wbGUgbWF0Y2hlc1xuICAgIC8vIGFuZCBvdmVyd3JpdGUgdGhlIGlucHV0XG4gICAgdmFyIHNpbXBsZV9jb2xvcnMgPSB7XG4gICAgICAgIGFsaWNlYmx1ZTogJ2YwZjhmZicsXG4gICAgICAgIGFudGlxdWV3aGl0ZTogJ2ZhZWJkNycsXG4gICAgICAgIGFxdWE6ICcwMGZmZmYnLFxuICAgICAgICBhcXVhbWFyaW5lOiAnN2ZmZmQ0JyxcbiAgICAgICAgYXp1cmU6ICdmMGZmZmYnLFxuICAgICAgICBiZWlnZTogJ2Y1ZjVkYycsXG4gICAgICAgIGJpc3F1ZTogJ2ZmZTRjNCcsXG4gICAgICAgIGJsYWNrOiAnMDAwMDAwJyxcbiAgICAgICAgYmxhbmNoZWRhbG1vbmQ6ICdmZmViY2QnLFxuICAgICAgICBibHVlOiAnMDAwMGZmJyxcbiAgICAgICAgYmx1ZXZpb2xldDogJzhhMmJlMicsXG4gICAgICAgIGJyb3duOiAnYTUyYTJhJyxcbiAgICAgICAgYnVybHl3b29kOiAnZGViODg3JyxcbiAgICAgICAgY2FkZXRibHVlOiAnNWY5ZWEwJyxcbiAgICAgICAgY2hhcnRyZXVzZTogJzdmZmYwMCcsXG4gICAgICAgIGNob2NvbGF0ZTogJ2QyNjkxZScsXG4gICAgICAgIGNvcmFsOiAnZmY3ZjUwJyxcbiAgICAgICAgY29ybmZsb3dlcmJsdWU6ICc2NDk1ZWQnLFxuICAgICAgICBjb3Juc2lsazogJ2ZmZjhkYycsXG4gICAgICAgIGNyaW1zb246ICdkYzE0M2MnLFxuICAgICAgICBjeWFuOiAnMDBmZmZmJyxcbiAgICAgICAgZGFya2JsdWU6ICcwMDAwOGInLFxuICAgICAgICBkYXJrY3lhbjogJzAwOGI4YicsXG4gICAgICAgIGRhcmtnb2xkZW5yb2Q6ICdiODg2MGInLFxuICAgICAgICBkYXJrZ3JheTogJ2E5YTlhOScsXG4gICAgICAgIGRhcmtncmVlbjogJzAwNjQwMCcsXG4gICAgICAgIGRhcmtraGFraTogJ2JkYjc2YicsXG4gICAgICAgIGRhcmttYWdlbnRhOiAnOGIwMDhiJyxcbiAgICAgICAgZGFya29saXZlZ3JlZW46ICc1NTZiMmYnLFxuICAgICAgICBkYXJrb3JhbmdlOiAnZmY4YzAwJyxcbiAgICAgICAgZGFya29yY2hpZDogJzk5MzJjYycsXG4gICAgICAgIGRhcmtyZWQ6ICc4YjAwMDAnLFxuICAgICAgICBkYXJrc2FsbW9uOiAnZTk5NjdhJyxcbiAgICAgICAgZGFya3NlYWdyZWVuOiAnOGZiYzhmJyxcbiAgICAgICAgZGFya3NsYXRlYmx1ZTogJzQ4M2Q4YicsXG4gICAgICAgIGRhcmtzbGF0ZWdyYXk6ICcyZjRmNGYnLFxuICAgICAgICBkYXJrdHVycXVvaXNlOiAnMDBjZWQxJyxcbiAgICAgICAgZGFya3Zpb2xldDogJzk0MDBkMycsXG4gICAgICAgIGRlZXBwaW5rOiAnZmYxNDkzJyxcbiAgICAgICAgZGVlcHNreWJsdWU6ICcwMGJmZmYnLFxuICAgICAgICBkaW1ncmF5OiAnNjk2OTY5JyxcbiAgICAgICAgZG9kZ2VyYmx1ZTogJzFlOTBmZicsXG4gICAgICAgIGZlbGRzcGFyOiAnZDE5Mjc1JyxcbiAgICAgICAgZmlyZWJyaWNrOiAnYjIyMjIyJyxcbiAgICAgICAgZmxvcmFsd2hpdGU6ICdmZmZhZjAnLFxuICAgICAgICBmb3Jlc3RncmVlbjogJzIyOGIyMicsXG4gICAgICAgIGZ1Y2hzaWE6ICdmZjAwZmYnLFxuICAgICAgICBnYWluc2Jvcm86ICdkY2RjZGMnLFxuICAgICAgICBnaG9zdHdoaXRlOiAnZjhmOGZmJyxcbiAgICAgICAgZ29sZDogJ2ZmZDcwMCcsXG4gICAgICAgIGdvbGRlbnJvZDogJ2RhYTUyMCcsXG4gICAgICAgIGdyYXk6ICc4MDgwODAnLFxuICAgICAgICBncmVlbjogJzAwODAwMCcsXG4gICAgICAgIGdyZWVueWVsbG93OiAnYWRmZjJmJyxcbiAgICAgICAgaG9uZXlkZXc6ICdmMGZmZjAnLFxuICAgICAgICBob3RwaW5rOiAnZmY2OWI0JyxcbiAgICAgICAgaW5kaWFucmVkIDogJ2NkNWM1YycsXG4gICAgICAgIGluZGlnbyA6ICc0YjAwODInLFxuICAgICAgICBpdm9yeTogJ2ZmZmZmMCcsXG4gICAgICAgIGtoYWtpOiAnZjBlNjhjJyxcbiAgICAgICAgbGF2ZW5kZXI6ICdlNmU2ZmEnLFxuICAgICAgICBsYXZlbmRlcmJsdXNoOiAnZmZmMGY1JyxcbiAgICAgICAgbGF3bmdyZWVuOiAnN2NmYzAwJyxcbiAgICAgICAgbGVtb25jaGlmZm9uOiAnZmZmYWNkJyxcbiAgICAgICAgbGlnaHRibHVlOiAnYWRkOGU2JyxcbiAgICAgICAgbGlnaHRjb3JhbDogJ2YwODA4MCcsXG4gICAgICAgIGxpZ2h0Y3lhbjogJ2UwZmZmZicsXG4gICAgICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAnZmFmYWQyJyxcbiAgICAgICAgbGlnaHRncmV5OiAnZDNkM2QzJyxcbiAgICAgICAgbGlnaHRncmVlbjogJzkwZWU5MCcsXG4gICAgICAgIGxpZ2h0cGluazogJ2ZmYjZjMScsXG4gICAgICAgIGxpZ2h0c2FsbW9uOiAnZmZhMDdhJyxcbiAgICAgICAgbGlnaHRzZWFncmVlbjogJzIwYjJhYScsXG4gICAgICAgIGxpZ2h0c2t5Ymx1ZTogJzg3Y2VmYScsXG4gICAgICAgIGxpZ2h0c2xhdGVibHVlOiAnODQ3MGZmJyxcbiAgICAgICAgbGlnaHRzbGF0ZWdyYXk6ICc3Nzg4OTknLFxuICAgICAgICBsaWdodHN0ZWVsYmx1ZTogJ2IwYzRkZScsXG4gICAgICAgIGxpZ2h0eWVsbG93OiAnZmZmZmUwJyxcbiAgICAgICAgbGltZTogJzAwZmYwMCcsXG4gICAgICAgIGxpbWVncmVlbjogJzMyY2QzMicsXG4gICAgICAgIGxpbmVuOiAnZmFmMGU2JyxcbiAgICAgICAgbWFnZW50YTogJ2ZmMDBmZicsXG4gICAgICAgIG1hcm9vbjogJzgwMDAwMCcsXG4gICAgICAgIG1lZGl1bWFxdWFtYXJpbmU6ICc2NmNkYWEnLFxuICAgICAgICBtZWRpdW1ibHVlOiAnMDAwMGNkJyxcbiAgICAgICAgbWVkaXVtb3JjaGlkOiAnYmE1NWQzJyxcbiAgICAgICAgbWVkaXVtcHVycGxlOiAnOTM3MGQ4JyxcbiAgICAgICAgbWVkaXVtc2VhZ3JlZW46ICczY2IzNzEnLFxuICAgICAgICBtZWRpdW1zbGF0ZWJsdWU6ICc3YjY4ZWUnLFxuICAgICAgICBtZWRpdW1zcHJpbmdncmVlbjogJzAwZmE5YScsXG4gICAgICAgIG1lZGl1bXR1cnF1b2lzZTogJzQ4ZDFjYycsXG4gICAgICAgIG1lZGl1bXZpb2xldHJlZDogJ2M3MTU4NScsXG4gICAgICAgIG1pZG5pZ2h0Ymx1ZTogJzE5MTk3MCcsXG4gICAgICAgIG1pbnRjcmVhbTogJ2Y1ZmZmYScsXG4gICAgICAgIG1pc3R5cm9zZTogJ2ZmZTRlMScsXG4gICAgICAgIG1vY2Nhc2luOiAnZmZlNGI1JyxcbiAgICAgICAgbmF2YWpvd2hpdGU6ICdmZmRlYWQnLFxuICAgICAgICBuYXZ5OiAnMDAwMDgwJyxcbiAgICAgICAgb2xkbGFjZTogJ2ZkZjVlNicsXG4gICAgICAgIG9saXZlOiAnODA4MDAwJyxcbiAgICAgICAgb2xpdmVkcmFiOiAnNmI4ZTIzJyxcbiAgICAgICAgb3JhbmdlOiAnZmZhNTAwJyxcbiAgICAgICAgb3JhbmdlcmVkOiAnZmY0NTAwJyxcbiAgICAgICAgb3JjaGlkOiAnZGE3MGQ2JyxcbiAgICAgICAgcGFsZWdvbGRlbnJvZDogJ2VlZThhYScsXG4gICAgICAgIHBhbGVncmVlbjogJzk4ZmI5OCcsXG4gICAgICAgIHBhbGV0dXJxdW9pc2U6ICdhZmVlZWUnLFxuICAgICAgICBwYWxldmlvbGV0cmVkOiAnZDg3MDkzJyxcbiAgICAgICAgcGFwYXlhd2hpcDogJ2ZmZWZkNScsXG4gICAgICAgIHBlYWNocHVmZjogJ2ZmZGFiOScsXG4gICAgICAgIHBlcnU6ICdjZDg1M2YnLFxuICAgICAgICBwaW5rOiAnZmZjMGNiJyxcbiAgICAgICAgcGx1bTogJ2RkYTBkZCcsXG4gICAgICAgIHBvd2RlcmJsdWU6ICdiMGUwZTYnLFxuICAgICAgICBwdXJwbGU6ICc4MDAwODAnLFxuICAgICAgICByZWJlY2NhcHVycGxlOiAnNjYzMzk5JyxcbiAgICAgICAgcmVkOiAnZmYwMDAwJyxcbiAgICAgICAgcm9zeWJyb3duOiAnYmM4ZjhmJyxcbiAgICAgICAgcm95YWxibHVlOiAnNDE2OWUxJyxcbiAgICAgICAgc2FkZGxlYnJvd246ICc4YjQ1MTMnLFxuICAgICAgICBzYWxtb246ICdmYTgwNzInLFxuICAgICAgICBzYW5keWJyb3duOiAnZjRhNDYwJyxcbiAgICAgICAgc2VhZ3JlZW46ICcyZThiNTcnLFxuICAgICAgICBzZWFzaGVsbDogJ2ZmZjVlZScsXG4gICAgICAgIHNpZW5uYTogJ2EwNTIyZCcsXG4gICAgICAgIHNpbHZlcjogJ2MwYzBjMCcsXG4gICAgICAgIHNreWJsdWU6ICc4N2NlZWInLFxuICAgICAgICBzbGF0ZWJsdWU6ICc2YTVhY2QnLFxuICAgICAgICBzbGF0ZWdyYXk6ICc3MDgwOTAnLFxuICAgICAgICBzbm93OiAnZmZmYWZhJyxcbiAgICAgICAgc3ByaW5nZ3JlZW46ICcwMGZmN2YnLFxuICAgICAgICBzdGVlbGJsdWU6ICc0NjgyYjQnLFxuICAgICAgICB0YW46ICdkMmI0OGMnLFxuICAgICAgICB0ZWFsOiAnMDA4MDgwJyxcbiAgICAgICAgdGhpc3RsZTogJ2Q4YmZkOCcsXG4gICAgICAgIHRvbWF0bzogJ2ZmNjM0NycsXG4gICAgICAgIHR1cnF1b2lzZTogJzQwZTBkMCcsXG4gICAgICAgIHZpb2xldDogJ2VlODJlZScsXG4gICAgICAgIHZpb2xldHJlZDogJ2QwMjA5MCcsXG4gICAgICAgIHdoZWF0OiAnZjVkZWIzJyxcbiAgICAgICAgd2hpdGU6ICdmZmZmZmYnLFxuICAgICAgICB3aGl0ZXNtb2tlOiAnZjVmNWY1JyxcbiAgICAgICAgeWVsbG93OiAnZmZmZjAwJyxcbiAgICAgICAgeWVsbG93Z3JlZW46ICc5YWNkMzInXG4gICAgfTtcbiAgICBjb2xvcl9zdHJpbmcgPSBzaW1wbGVfY29sb3JzW2NvbG9yX3N0cmluZ10gfHwgY29sb3Jfc3RyaW5nO1xuICAgIC8vIGVtZCBvZiBzaW1wbGUgdHlwZS1pbiBjb2xvcnNcblxuICAgIC8vIGFycmF5IG9mIGNvbG9yIGRlZmluaXRpb24gb2JqZWN0c1xuICAgIHZhciBjb2xvcl9kZWZzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICByZTogL15yZ2JhXFwoKFxcZHsxLDN9KSxcXHMqKFxcZHsxLDN9KSxcXHMqKFxcZHsxLDN9KSxcXHMqKCg/OlxcZD9cXC4pP1xcZClcXCkkLyxcbiAgICAgICAgICAgIGV4YW1wbGU6IFsncmdiYSgxMjMsIDIzNCwgNDUsIDAuOCknLCAncmdiYSgyNTUsMjM0LDI0NSwxLjApJ10sXG4gICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoYml0cyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1sxXSksXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGJpdHNbMl0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzNdKSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VGbG9hdChiaXRzWzRdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlOiAvXnJnYlxcKChcXGR7MSwzfSksXFxzKihcXGR7MSwzfSksXFxzKihcXGR7MSwzfSlcXCkkLyxcbiAgICAgICAgICAgIGV4YW1wbGU6IFsncmdiKDEyMywgMjM0LCA0NSknLCAncmdiKDI1NSwyMzQsMjQ1KSddLFxuICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGJpdHMpe1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGJpdHNbMV0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzJdKSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1szXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICByZTogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLyxcbiAgICAgICAgICAgIGV4YW1wbGU6IFsnIzAwZmYwMCcsICczMzY2OTknXSxcbiAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChiaXRzKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzFdLCAxNiksXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGJpdHNbMl0sIDE2KSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1szXSwgMTYpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcmU6IC9eKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgICAgICAgICBleGFtcGxlOiBbJyNmYjAnLCAnZjBmJ10sXG4gICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoYml0cyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1sxXSArIGJpdHNbMV0sIDE2KSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1syXSArIGJpdHNbMl0sIDE2KSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1szXSArIGJpdHNbM10sIDE2KVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBdO1xuXG4gICAgLy8gc2VhcmNoIHRocm91Z2ggdGhlIGRlZmluaXRpb25zIHRvIGZpbmQgYSBtYXRjaFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JfZGVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmUgPSBjb2xvcl9kZWZzW2ldLnJlO1xuICAgICAgICB2YXIgcHJvY2Vzc29yID0gY29sb3JfZGVmc1tpXS5wcm9jZXNzO1xuICAgICAgICB2YXIgYml0cyA9IHJlLmV4ZWMoY29sb3Jfc3RyaW5nKTtcbiAgICAgICAgaWYgKGJpdHMpIHtcbiAgICAgICAgICAgIHZhciBjaGFubmVscyA9IHByb2Nlc3NvcihiaXRzKTtcbiAgICAgICAgICAgIHRoaXMuciA9IGNoYW5uZWxzWzBdO1xuICAgICAgICAgICAgdGhpcy5nID0gY2hhbm5lbHNbMV07XG4gICAgICAgICAgICB0aGlzLmIgPSBjaGFubmVsc1syXTtcbiAgICAgICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbHBoYSA9IGNoYW5uZWxzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlL2NsZWFudXAgdmFsdWVzXG4gICAgdGhpcy5yID0gKHRoaXMuciA8IDAgfHwgaXNOYU4odGhpcy5yKSkgPyAwIDogKCh0aGlzLnIgPiAyNTUpID8gMjU1IDogdGhpcy5yKTtcbiAgICB0aGlzLmcgPSAodGhpcy5nIDwgMCB8fCBpc05hTih0aGlzLmcpKSA/IDAgOiAoKHRoaXMuZyA+IDI1NSkgPyAyNTUgOiB0aGlzLmcpO1xuICAgIHRoaXMuYiA9ICh0aGlzLmIgPCAwIHx8IGlzTmFOKHRoaXMuYikpID8gMCA6ICgodGhpcy5iID4gMjU1KSA/IDI1NSA6IHRoaXMuYik7XG4gICAgdGhpcy5hbHBoYSA9ICh0aGlzLmFscGhhIDwgMCkgPyAwIDogKCh0aGlzLmFscGhhID4gMS4wIHx8IGlzTmFOKHRoaXMuYWxwaGEpKSA/IDEuMCA6IHRoaXMuYWxwaGEpO1xuXG4gICAgLy8gc29tZSBnZXR0ZXJzXG4gICAgdGhpcy50b1JHQiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdyZ2IoJyArIHRoaXMuciArICcsICcgKyB0aGlzLmcgKyAnLCAnICsgdGhpcy5iICsgJyknO1xuICAgIH1cbiAgICB0aGlzLnRvUkdCQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdyZ2JhKCcgKyB0aGlzLnIgKyAnLCAnICsgdGhpcy5nICsgJywgJyArIHRoaXMuYiArICcsICcgKyB0aGlzLmFscGhhICsgJyknO1xuICAgIH1cbiAgICB0aGlzLnRvSGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciA9IHRoaXMuci50b1N0cmluZygxNik7XG4gICAgICAgIHZhciBnID0gdGhpcy5nLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIGIgPSB0aGlzLmIudG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAoci5sZW5ndGggPT0gMSkgciA9ICcwJyArIHI7XG4gICAgICAgIGlmIChnLmxlbmd0aCA9PSAxKSBnID0gJzAnICsgZztcbiAgICAgICAgaWYgKGIubGVuZ3RoID09IDEpIGIgPSAnMCcgKyBiO1xuICAgICAgICByZXR1cm4gJyMnICsgciArIGcgKyBiO1xuICAgIH1cblxuICAgIC8vIGhlbHBcbiAgICB0aGlzLmdldEhlbHBYTUwgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGV4YW1wbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIC8vIGFkZCByZWdleHBzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JfZGVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGV4YW1wbGUgPSBjb2xvcl9kZWZzW2ldLmV4YW1wbGU7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGV4YW1wbGUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBleGFtcGxlc1tleGFtcGxlcy5sZW5ndGhdID0gZXhhbXBsZVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdHlwZS1pbiBjb2xvcnNcbiAgICAgICAgZm9yICh2YXIgc2MgaW4gc2ltcGxlX2NvbG9ycykge1xuICAgICAgICAgICAgZXhhbXBsZXNbZXhhbXBsZXMubGVuZ3RoXSA9IHNjO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHhtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgIHhtbC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3JnYmNvbG9yLWV4YW1wbGVzJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhhbXBsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RfaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RfY29sb3IgPSBuZXcgUkdCQ29sb3IoZXhhbXBsZXNbaV0pO1xuICAgICAgICAgICAgICAgIHZhciBleGFtcGxlX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGV4YW1wbGVfZGl2LnN0eWxlLmNzc1RleHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmdpbjogM3B4OyAnXG4gICAgICAgICAgICAgICAgICAgICAgICArICdib3JkZXI6IDFweCBzb2xpZCBibGFjazsgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKyAnYmFja2dyb3VuZDonICsgbGlzdF9jb2xvci50b0hleCgpICsgJzsgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKyAnY29sb3I6JyArIGxpc3RfY29sb3IudG9IZXgoKVxuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBleGFtcGxlX2Rpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgndGVzdCcpKTtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdF9pdGVtX3ZhbHVlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXG4gICAgICAgICAgICAgICAgICAgICcgJyArIGV4YW1wbGVzW2ldICsgJyAtPiAnICsgbGlzdF9jb2xvci50b1JHQigpICsgJyAtPiAnICsgbGlzdF9jb2xvci50b0hleCgpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsaXN0X2l0ZW0uYXBwZW5kQ2hpbGQoZXhhbXBsZV9kaXYpO1xuICAgICAgICAgICAgICAgIGxpc3RfaXRlbS5hcHBlbmRDaGlsZChsaXN0X2l0ZW1fdmFsdWUpO1xuICAgICAgICAgICAgICAgIHhtbC5hcHBlbmRDaGlsZChsaXN0X2l0ZW0pO1xuXG4gICAgICAgICAgICB9IGNhdGNoKGUpe31cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geG1sO1xuXG4gICAgfVxuXG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc1Bvc3NpYmxlUHJvdG90eXBlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PT0gdW5kZWZpbmVkKSB7XG4gIGRlZmluZVByb3BlcnR5KEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcblxuLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFkdmFuY2VzdHJpbmdpbmRleFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUywgaW5kZXgsIHVuaWNvZGUpIHtcbiAgcmV0dXJuIGluZGV4ICsgKHVuaWNvZGUgPyBjaGFyQXQoUywgaW5kZXgpLmxlbmd0aCA6IDEpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBQcm90b3R5cGUpIHtcbiAgaWYgKGlzUHJvdG90eXBlT2YoUHJvdG90eXBlLCBpdCkpIHJldHVybiBpdDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCRTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9PSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuICBpbmRleE9mOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FLCBhcmd1bWVudCkge1xuICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdO1xuICByZXR1cm4gISFtZXRob2QgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhbGwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICBtZXRob2QuY2FsbChudWxsLCBhcmd1bWVudCB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9LCAxKTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG52YXIgUkVEVUNFX0VNUFRZID0gJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgcmVkdWNlLCByZWR1Y2VSaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX1JJR0hUKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYXJndW1lbnRzTGVuZ3RoLCBtZW1vKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGF0KTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICBpZiAobGVuZ3RoID09PSAwICYmIGFyZ3VtZW50c0xlbmd0aCA8IDIpIHRocm93IG5ldyAkVHlwZUVycm9yKFJFRFVDRV9FTVBUWSk7XG4gICAgdmFyIGluZGV4ID0gSVNfUklHSFQgPyBsZW5ndGggLSAxIDogMDtcbiAgICB2YXIgaSA9IElTX1JJR0hUID8gLTEgOiAxO1xuICAgIGlmIChhcmd1bWVudHNMZW5ndGggPCAyKSB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgICBpbmRleCArPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBpZiAoSVNfUklHSFQgPyBpbmRleCA8IDAgOiBsZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoUkVEVUNFX0VNUFRZKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7SVNfUklHSFQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxuICBsZWZ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlcmlnaHRcbiAgcmlnaHQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyhbXS5zbGljZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSwgbm8tdGhyb3ctbGl0ZXJhbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikgeyByZXR1cm4gZmFsc2U7IH0gLy8gd29ya2Fyb3VuZCBvZiBvbGQgV2ViS2l0ICsgYGV2YWxgIGJ1Z1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyh7fS50b1N0cmluZyk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdHJpbmdTbGljZSh0b1N0cmluZyhpdCksIDgsIC0xKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gJE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09PSAnT2JqZWN0JyAmJiBpc0NhbGxhYmxlKE8uY2FsbGVlKSA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIGV4Y2VwdGlvbnMpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpICYmICEoZXhjZXB0aW9ucyAmJiBoYXNPd24oZXhjZXB0aW9ucywga2V5KSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgdmFyIHJlZ2V4cCA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYENyZWF0ZUl0ZXJSZXN1bHRPYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVpdGVycmVzdWx0b2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6IGRvbmUgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBtYWtlQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYWtlLWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgaWYgKGRlc2NyaXB0b3IuZ2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLmdldCwgbmFtZSwgeyBnZXR0ZXI6IHRydWUgfSk7XG4gIGlmIChkZXNjcmlwdG9yLnNldCkgbWFrZUJ1aWx0SW4oZGVzY3JpcHRvci5zZXQsIG5hbWUsIHsgc2V0dGVyOiB0cnVlIH0pO1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkuZih0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIG1ha2VCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zLmVudW1lcmFibGU7XG4gIHZhciBuYW1lID0gb3B0aW9ucy5uYW1lICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5hbWUgOiBrZXk7XG4gIGlmIChpc0NhbGxhYmxlKHZhbHVlKSkgbWFrZUJ1aWx0SW4odmFsdWUsIG5hbWUsIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIGRlZmluZUdsb2JhbFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdGlvbnMudW5zYWZlKSBkZWxldGUgT1trZXldO1xuICAgICAgZWxzZSBpZiAoT1trZXldKSBzaW1wbGUgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogIW9wdGlvbnMubm9uQ29uZmlndXJhYmxlLFxuICAgICAgd3JpdGFibGU6ICFvcHRpb25zLm5vbldyaXRhYmxlXG4gICAgfSk7XG4gIH0gcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFRoaXNba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPT0gNztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBpbiBvbGQgV2ViS2l0IHZlcnNpb25zLCBgZWxlbWVudC5jbGFzc0xpc3RgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBnbG9iYWwgYERPTVRva2VuTGlzdGBcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxudmFyIGNsYXNzTGlzdCA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnc3BhbicpLmNsYXNzTGlzdDtcbnZhciBET01Ub2tlbkxpc3RQcm90b3R5cGUgPSBjbGFzc0xpc3QgJiYgY2xhc3NMaXN0LmNvbnN0cnVjdG9yICYmIGNsYXNzTGlzdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NVG9rZW5MaXN0UHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlID8gdW5kZWZpbmVkIDogRE9NVG9rZW5MaXN0UHJvdG90eXBlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvaXBhZHxpcGhvbmV8aXBvZC9pLnRlc3QodXNlckFnZW50KSAmJiB0eXBlb2YgUGViYmxlICE9ICd1bmRlZmluZWQnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWRvcy9uby12dWxuZXJhYmxlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gLyg/OmlwYWR8aXBob25lfGlwb2QpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBFTlZJUk9OTUVOVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVOVklST05NRU5UID09PSAnTk9ERSc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsVGhpcy5uYXZpZ2F0b3I7XG52YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gdXNlckFnZW50ID8gU3RyaW5nKHVzZXJBZ2VudCkgOiAnJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG52YXIgRGVubyA9IGdsb2JhbFRoaXMuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGdsb2JhbCBCdW4sIERlbm8gLS0gZGV0ZWN0aW9uICovXG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgdXNlckFnZW50U3RhcnRzV2l0aCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5zbGljZSgwLCBzdHJpbmcubGVuZ3RoKSA9PT0gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuICBpZiAodXNlckFnZW50U3RhcnRzV2l0aCgnQnVuLycpKSByZXR1cm4gJ0JVTic7XG4gIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdDbG91ZGZsYXJlLVdvcmtlcnMnKSkgcmV0dXJuICdDTE9VREZMQVJFJztcbiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ0Rlbm8vJykpIHJldHVybiAnREVOTyc7XG4gIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdOb2RlLmpzLycpKSByZXR1cm4gJ05PREUnO1xuICBpZiAoZ2xvYmFsVGhpcy5CdW4gJiYgdHlwZW9mIEJ1bi52ZXJzaW9uID09ICdzdHJpbmcnKSByZXR1cm4gJ0JVTic7XG4gIGlmIChnbG9iYWxUaGlzLkRlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JykgcmV0dXJuICdERU5PJztcbiAgaWYgKGNsYXNzb2YoZ2xvYmFsVGhpcy5wcm9jZXNzKSA9PT0gJ3Byb2Nlc3MnKSByZXR1cm4gJ05PREUnO1xuICBpZiAoZ2xvYmFsVGhpcy53aW5kb3cgJiYgZ2xvYmFsVGhpcy5kb2N1bWVudCkgcmV0dXJuICdCUk9XU0VSJztcbiAgcmV0dXJuICdSRVNUJztcbn0pKCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbFRoaXM7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsVGhpc1tUQVJHRVRdIHx8IGRlZmluZUdsb2JhbFByb3BlcnR5KFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IGdsb2JhbFRoaXNbVEFSR0VUXSAmJiBnbG9iYWxUaGlzW1RBUkdFVF0ucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMuZG9udENhbGxHZXRTZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgZGVmaW5lQnVpbHRJbih0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgbW92ZWQgdG8gZW50cnkgcG9pbnRzXG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjLCBGT1JDRUQsIFNIQU0pIHtcbiAgdmFyIFNZTUJPTCA9IHdlbGxLbm93blN5bWJvbChLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFeHAgbWV0aG9kc1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN5bWJvbC1uYW1lZCBSZWdFeHAgbWV0aG9kcyBjYWxsIC5leGVjXG4gICAgdmFyIGV4ZWNDYWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgcmUgPSAvYS87XG5cbiAgICBpZiAoS0VZID09PSAnc3BsaXQnKSB7XG4gICAgICAvLyBXZSBjYW4ndCB1c2UgcmVhbCByZWdleCBoZXJlIHNpbmNlIGl0IGNhdXNlcyBkZW9wdGltaXphdGlvblxuICAgICAgLy8gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gaW4gVjhcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMDZcbiAgICAgIHJlID0ge307XG4gICAgICAvLyBSZWdFeHBbQEBzcGxpdF0gZG9lc24ndCBjYWxsIHRoZSByZWdleCdzIGV4ZWMgbWV0aG9kLCBidXQgZmlyc3QgY3JlYXRlc1xuICAgICAgLy8gYSBuZXcgb25lLiBXZSBuZWVkIHRvIHJldHVybiB0aGUgcGF0Y2hlZCByZWdleCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgb25lLlxuICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTtcbiAgICAgIHJlLmNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmU7IH07XG4gICAgICByZS5mbGFncyA9ICcnO1xuICAgICAgcmVbU1lNQk9MXSA9IC8uL1tTWU1CT0xdO1xuICAgIH1cblxuICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBleGVjQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIEZPUkNFRFxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIG1ldGhvZHMgPSBleGVjKFNZTUJPTCwgJydbS0VZXSwgZnVuY3Rpb24gKG5hdGl2ZU1ldGhvZCwgcmVnZXhwLCBzdHIsIGFyZzIsIGZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICB2YXIgJGV4ZWMgPSByZWdleHAuZXhlYztcbiAgICAgIGlmICgkZXhlYyA9PT0gcmVnZXhwRXhlYyB8fCAkZXhlYyA9PT0gUmVnRXhwUHJvdG90eXBlLmV4ZWMpIHtcbiAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IGNhbGwobmF0aXZlUmVnRXhwTWV0aG9kLCByZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogY2FsbChuYXRpdmVNZXRob2QsIHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW4oU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBtZXRob2RzWzBdKTtcbiAgICBkZWZpbmVCdWlsdEluKFJlZ0V4cFByb3RvdHlwZSwgU1lNQk9MLCBtZXRob2RzWzFdKTtcbiAgfVxuXG4gIGlmIChTSEFNKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUmVnRXhwUHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBhcHBseSA9IEZ1bmN0aW9uUHJvdG90eXBlLmFwcGx5O1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tcmVmbGVjdCAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ID09ICdvYmplY3QnICYmIFJlZmxlY3QuYXBwbHkgfHwgKE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGFwcGx5KSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoYXBwbHksIGFyZ3VtZW50cyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgYmluZCA9IHVuY3VycnlUaGlzKHVuY3VycnlUaGlzLmJpbmQpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0KSB7XG4gIGFDYWxsYWJsZShmbik7XG4gIHJldHVybiB0aGF0ID09PSB1bmRlZmluZWQgPyBmbiA6IE5BVElWRV9CSU5EID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXREZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIEVYSVNUUyA9IGhhc093bihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKTtcbi8vIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmcm9tIG1pbmlmaWVkIC8gbWFuZ2xlZCAvIGRyb3BwZWQgZnVuY3Rpb24gbmFtZXNcbnZhciBQUk9QRVIgPSBFWElTVFMgJiYgKGZ1bmN0aW9uIHNvbWV0aGluZygpIHsgLyogZW1wdHkgKi8gfSkubmFtZSA9PT0gJ3NvbWV0aGluZyc7XG52YXIgQ09ORklHVVJBQkxFID0gRVhJU1RTICYmICghREVTQ1JJUFRPUlMgfHwgKERFU0NSSVBUT1JTICYmIGdldERlc2NyaXB0b3IoRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJykuY29uZmlndXJhYmxlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBFWElTVFM6IEVYSVNUUyxcbiAgUFJPUEVSOiBQUk9QRVIsXG4gIENPTkZJR1VSQUJMRTogQ09ORklHVVJBQkxFXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCBtZXRob2QpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG4gICAgcmV0dXJuIHVuY3VycnlUaGlzKGFDYWxsYWJsZShPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwga2V5KVttZXRob2RdKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbikge1xuICAvLyBOYXNob3JuIGJ1ZzpcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEyOFxuICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xMTMwXG4gIGlmIChjbGFzc29mUmF3KGZuKSA9PT0gJ0Z1bmN0aW9uJykgcmV0dXJuIHVuY3VycnlUaGlzKGZuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIHVuY3VycnlUaGlzV2l0aEJpbmQgPSBOQVRJVkVfQklORCAmJiBGdW5jdGlvblByb3RvdHlwZS5iaW5kLmJpbmQoY2FsbCwgY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyB1bmN1cnJ5VGhpc1dpdGhCaW5kIDogZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGwuYXBwbHkoZm4sIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24oZ2xvYmFsVGhpc1tuYW1lc3BhY2VdKSA6IGdsb2JhbFRoaXNbbmFtZXNwYWNlXSAmJiBnbG9iYWxUaGlzW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgcmV0dXJuIGdldE1ldGhvZChpdCwgSVRFUkFUT1IpXG4gICAgfHwgZ2V0TWV0aG9kKGl0LCAnQEBpdGVyYXRvcicpXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsIHVzaW5nSXRlcmF0b3IpIHtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBnZXRJdGVyYXRvck1ldGhvZChhcmd1bWVudCkgOiB1c2luZ0l0ZXJhdG9yO1xuICBpZiAoYUNhbGxhYmxlKGl0ZXJhdG9yTWV0aG9kKSkgcmV0dXJuIGFuT2JqZWN0KGNhbGwoaXRlcmF0b3JNZXRob2QsIGFyZ3VtZW50KSk7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxuLy8gYEdldE1ldGhvZGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldG1ldGhvZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoViwgUCkge1xuICB2YXIgZnVuYyA9IFZbUF07XG4gIHJldHVybiBpc051bGxPclVuZGVmaW5lZChmdW5jKSA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJidgXXxcXGR7MSwyfXw8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCYnYF18XFxkezEsMn0pL2c7XG5cbi8vIGBHZXRTdWJzdGl0dXRpb25gIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgfVxuICByZXR1cm4gcmVwbGFjZShyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgIHZhciBjYXB0dXJlO1xuICAgIHN3aXRjaCAoY2hhckF0KGNoLCAwKSkge1xuICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICBjYXNlICcmJzogcmV0dXJuIG1hdGNoZWQ7XG4gICAgICBjYXNlICdgJzogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgMCwgcG9zaXRpb24pO1xuICAgICAgY2FzZSBcIidcIjogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgdGFpbFBvcyk7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FwdHVyZSA9IG5hbWVkQ2FwdHVyZXNbc3RyaW5nU2xpY2UoY2gsIDEsIC0xKV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gXFxkXFxkP1xuICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgaWYgKG4gPiBtKSB7XG4gICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2hhckF0KGNoLCAxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoYXJBdChjaCwgMSk7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIGNoZWNrKHR5cGVvZiB0aGlzID09ICdvYmplY3QnICYmIHRoaXMpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSB1bmN1cnJ5VGhpcyh7fS5oYXNPd25Qcm9wZXJ0eSk7XG5cbi8vIGBIYXNPd25Qcm9wZXJ0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWhhc293bnByb3BlcnR5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWhhc293biAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5KHRvT2JqZWN0KGl0KSwga2V5KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIHNhZmVcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFua3MgdG8gSUU4IGZvciBpdHMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT09IDc7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgc3BsaXQgPSB1bmN1cnJ5VGhpcygnJy5zcGxpdCk7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICEkT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKCFpc0NhbGxhYmxlKHN0b3JlLmluc3BlY3RTb3VyY2UpKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWxUaGlzLlR5cGVFcnJvcjtcbnZhciBXZWFrTWFwID0gZ2xvYmFsVGhpcy5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc3RvcmUuZ2V0ID0gc3RvcmUuZ2V0O1xuICBzdG9yZS5oYXMgPSBzdG9yZS5oYXM7XG4gIHN0b3JlLnNldCA9IHN0b3JlLnNldDtcbiAgLyogZXNsaW50LWVuYWJsZSBuby1zZWxmLWFzc2lnbiAtLSBwcm90b3R5cGUgbWV0aG9kcyBwcm90ZWN0aW9uICovXG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoc3RvcmUuaGFzKGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgc3RvcmUuc2V0KGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gc3RvcmUuZ2V0KGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmhhcyhpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5Jztcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90XG52YXIgZG9jdW1lbnRBbGwgPSB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgZG9jdW1lbnQuYWxsO1xuXG4vLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50ID09PSBkb2N1bWVudEFsbDtcbn0gOiBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAudGVzdChub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdHJ1Y3Qobm9vcCwgW10sIGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBpc0NvbnN0cnVjdG9yTGVnYWN5ID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIC8vIHdlIGNhbid0IGNoZWNrIC5wcm90b3R5cGUgc2luY2UgY29uc3RydWN0b3JzIHByb2R1Y2VkIGJ5IC5iaW5kIGhhdmVuJ3QgaXRcbiAgICAvLyBgRnVuY3Rpb24jdG9TdHJpbmdgIHRocm93cyBvbiBzb21lIGJ1aWx0LWl0IGZ1bmN0aW9uIGluIHNvbWUgbGVnYWN5IGVuZ2luZXNcbiAgICAvLyAoZm9yIGV4YW1wbGUsIGBET01RdWFkYCBhbmQgc2ltaWxhciBpbiBGRjQxLSlcbiAgICByZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklORyB8fCAhIWV4ZWMoY29uc3RydWN0b3JSZWdFeHAsIGluc3BlY3RTb3VyY2UoYXJndW1lbnQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuaXNDb25zdHJ1Y3RvckxlZ2FjeS5zaGFtID0gdHJ1ZTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09PSBQT0xZRklMTCA/IHRydWVcbiAgICA6IHZhbHVlID09PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCIndXNlIHN0cmljdCc7XG4vLyB3ZSBjYW4ndCB1c2UganVzdCBgaXQgPT0gbnVsbGAgc2luY2Ugb2YgYGRvY3VtZW50LmFsbGAgc3BlY2lhbCBjYXNlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90LWFlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNPYmplY3QoYXJndW1lbnQpIHx8IGFyZ3VtZW50ID09PSBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PT0gJ1JlZ0V4cCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbnZhciBSZXN1bHRQcm90b3R5cGUgPSBSZXN1bHQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfUkVDT1JEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX1JFQ09SRCk7XG4gIHZhciBJU19JVEVSQVRPUiA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19JVEVSQVRPUik7XG4gIHZhciBJTlRFUlJVUFRFRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JTlRFUlJVUFRFRCk7XG4gIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0KTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDtcblxuICB2YXIgc3RvcCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICBpZiAoaXRlcmF0b3IpIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICdub3JtYWwnLCBjb25kaXRpb24pO1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIGNvbmRpdGlvbik7XG4gIH07XG5cbiAgdmFyIGNhbGxGbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChBU19FTlRSSUVTKSB7XG4gICAgICBhbk9iamVjdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZVswXSwgdmFsdWVbMV0sIHN0b3ApIDogZm4odmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICB9IHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTtcbiAgfTtcblxuICBpZiAoSVNfUkVDT1JEKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcjtcbiAgfSBlbHNlIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICghaXRlckZuKSB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IElTX1JFQ09SRCA/IGl0ZXJhYmxlLm5leHQgOiBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBraW5kLCB2YWx1ZSkge1xuICB2YXIgaW5uZXJSZXN1bHQsIGlubmVyRXJyb3I7XG4gIGFuT2JqZWN0KGl0ZXJhdG9yKTtcbiAgdHJ5IHtcbiAgICBpbm5lclJlc3VsdCA9IGdldE1ldGhvZChpdGVyYXRvciwgJ3JldHVybicpO1xuICAgIGlmICghaW5uZXJSZXN1bHQpIHtcbiAgICAgIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaW5uZXJSZXN1bHQgPSBjYWxsKGlubmVyUmVzdWx0LCBpdGVyYXRvcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW5uZXJFcnJvciA9IHRydWU7XG4gICAgaW5uZXJSZXN1bHQgPSBlcnJvcjtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rocm93JykgdGhyb3cgdmFsdWU7XG4gIGlmIChpbm5lckVycm9yKSB0aHJvdyBpbm5lclJlc3VsdDtcbiAgYW5PYmplY3QoaW5uZXJSZXN1bHQpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0LCBFTlVNRVJBQkxFX05FWFQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigrIUVOVU1FUkFCTEVfTkVYVCwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRnVuY3Rpb25OYW1lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuUFJPUEVSO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcblxuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYWxsYWJsZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICAgICAgICAgIGRlZmluZUJ1aWx0SW4oQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkucHJvdG90eXBlLnsgdmFsdWVzLCBAQGl0ZXJhdG9yIH0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChQUk9QRVJfRlVOQ1RJT05fTkFNRSAmJiBERUZBVUxUID09PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgaWYgKCFJU19QVVJFICYmIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsICduYW1lJywgVkFMVUVTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIGNhbGwobmF0aXZlSXRlcmF0b3IsIHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICBkZWZpbmVCdWlsdEluKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGRlZmluZUJ1aWx0SW4oSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IsIHsgbmFtZTogREVGQVVMVCB9KTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9ICFpc09iamVjdChJdGVyYXRvclByb3RvdHlwZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuZWxzZSBpZiAoSVNfUFVSRSkgSXRlcmF0b3JQcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1AQGl0ZXJhdG9yXG5pZiAoIWlzQ2FsbGFibGUoSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICBkZWZpbmVCdWlsdEluKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0ge307XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWxlbmd0aG9mYXJyYXlsaWtlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpLkNPTkZJR1VSQUJMRTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xuXG52YXIgQ09ORklHVVJBQkxFX0xFTkdUSCA9IERFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdsZW5ndGgnLCB7IHZhbHVlOiA4IH0pLmxlbmd0aCAhPT0gODtcbn0pO1xuXG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbnZhciBtYWtlQnVpbHRJbiA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlLCBuYW1lLCBvcHRpb25zKSB7XG4gIGlmIChzdHJpbmdTbGljZSgkU3RyaW5nKG5hbWUpLCAwLCA3KSA9PT0gJ1N5bWJvbCgnKSB7XG4gICAgbmFtZSA9ICdbJyArIHJlcGxhY2UoJFN0cmluZyhuYW1lKSwgL15TeW1ib2xcXCgoW14pXSopXFwpLiokLywgJyQxJykgKyAnXSc7XG4gIH1cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5nZXR0ZXIpIG5hbWUgPSAnZ2V0ICcgKyBuYW1lO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNldHRlcikgbmFtZSA9ICdzZXQgJyArIG5hbWU7XG4gIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkge1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICduYW1lJywgeyB2YWx1ZTogbmFtZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIGVsc2UgdmFsdWUubmFtZSA9IG5hbWU7XG4gIH1cbiAgaWYgKENPTkZJR1VSQUJMRV9MRU5HVEggJiYgb3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2FyaXR5JykgJiYgdmFsdWUubGVuZ3RoICE9PSBvcHRpb25zLmFyaXR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkodmFsdWUsICdsZW5ndGgnLCB7IHZhbHVlOiBvcHRpb25zLmFyaXR5IH0pO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdjb25zdHJ1Y3RvcicpICYmIG9wdGlvbnMuY29uc3RydWN0b3IpIHtcbiAgICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICdwcm90b3R5cGUnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAvLyBpbiBWOCB+IENocm9tZSA1MywgcHJvdG90eXBlcyBvZiBzb21lIG1ldGhvZHMsIGxpa2UgYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgLCBhcmUgbm9uLXdyaXRhYmxlXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5wcm90b3R5cGUpIHZhbHVlLnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7XG4gIGlmICghaGFzT3duKHN0YXRlLCAnc291cmNlJykpIHtcbiAgICBzdGF0ZS5zb3VyY2UgPSBqb2luKFRFTVBMQVRFLCB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcblxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0ZW5kLW5hdGl2ZSAtLSByZXF1aXJlZFxuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbWFrZUJ1aWx0SW4oZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59LCAndG9TdHJpbmcnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE1hdGgudHJ1bmNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLnRydW5jXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC10cnVuYyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgudHJ1bmMgfHwgZnVuY3Rpb24gdHJ1bmMoeCkge1xuICB2YXIgbiA9ICt4O1xuICByZXR1cm4gKG4gPiAwID8gZmxvb3IgOiBjZWlsKShuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNhZmVHZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NhZmUtZ2V0LWJ1aWx0LWluJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBRdWV1ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9xdWV1ZScpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pb3MnKTtcbnZhciBJU19JT1NfUEVCQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcy1wZWJibGUnKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtd2Vib3Mtd2Via2l0Jyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsVGhpcy5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbFRoaXMuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsVGhpcy5Qcm9taXNlO1xudmFyIG1pY3JvdGFzayA9IHNhZmVHZXRCdWlsdEluKCdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlLCB0aGVuO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFtaWNyb3Rhc2spIHtcbiAgdmFyIHF1ZXVlID0gbmV3IFF1ZXVlKCk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGZuID0gcXVldWUuZ2V0KCkpIHRyeSB7XG4gICAgICBmbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocXVldWUuaGVhZCkgbm90aWZ5KCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICAvLyBhbHNvIGV4Y2VwdCBXZWJPUyBXZWJraXQgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg5OFxuICBpZiAoIUlTX0lPUyAmJiAhSVNfTk9ERSAmJiAhSVNfV0VCT1NfV0VCS0lUICYmIE11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmICghSVNfSU9TX1BFQkJMRSAmJiBQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIC8vIHdvcmthcm91bmQgb2YgV2ViS2l0IH4gaU9TIFNhZmFyaSAxMC4xIGJ1Z1xuICAgIHByb21pc2UuY29uc3RydWN0b3IgPSBQcm9taXNlO1xuICAgIHRoZW4gPSBiaW5kKHByb21pc2UudGhlbiwgcHJvbWlzZSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gTm9kZS5qcyB3aXRob3V0IHByb21pc2VzXG4gIH0gZWxzZSBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ2VcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgLy8gYHdlYnBhY2tgIGRldiBzZXJ2ZXIgYnVnIG9uIElFIGdsb2JhbCBtZXRob2RzIC0gdXNlIGJpbmQoZm4sIGdsb2JhbClcbiAgICBtYWNyb3Rhc2sgPSBiaW5kKG1hY3JvdGFzaywgZ2xvYmFsVGhpcyk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWFjcm90YXNrKGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgbWljcm90YXNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKCFxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICBxdWV1ZS5hZGQoZm4pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvdGFzaztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUNhbGxhYmxlKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFDYWxsYWJsZShyZWplY3QpO1xufTtcblxuLy8gYE5ld1Byb21pc2VDYXBhYmlsaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHlcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1JlZ0V4cChpdCkpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgLS0gb2xkIElFLCBXU0ggKi9cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWFzc2lnbm1lbnQgLS0gYXZvaWQgbWVtb3J5IGxlYWtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCdcbiAgICA/IGRvY3VtZW50LmRvbWFpbiAmJiBhY3RpdmVYRG9jdW1lbnRcbiAgICAgID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIC8vIG9sZCBJRVxuICAgICAgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKVxuICAgIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpOyAvLyBXU0hcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWNyZWF0ZSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlLmYocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgJiYgIVY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIEVOVU1FUkFCTEUgPSAnZW51bWVyYWJsZSc7XG52YXIgQ09ORklHVVJBQkxFID0gJ2NvbmZpZ3VyYWJsZSc7XG52YXIgV1JJVEFCTEUgPSAnd3JpdGFibGUnO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAodHlwZW9mIE8gPT09ICdmdW5jdGlvbicgJiYgUCA9PT0gJ3Byb3RvdHlwZScgJiYgJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzICYmIFdSSVRBQkxFIGluIEF0dHJpYnV0ZXMgJiYgIUF0dHJpYnV0ZXNbV1JJVEFCTEVdKSB7XG4gICAgdmFyIGN1cnJlbnQgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbV1JJVEFCTEVdKSB7XG4gICAgICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sXG4gICAgICAgIGVudW1lcmFibGU6IEVOVU1FUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbRU5VTUVSQUJMRV0gOiBjdXJyZW50W0VOVU1FUkFCTEVdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICB9IHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG59IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gJE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyAkT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzT3duKG9iamVjdCwgSUVfUFJPVE8pKSByZXR1cm4gb2JqZWN0W0lFX1BST1RPXTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoaXNDYWxsYWJsZShjb25zdHJ1Y3RvcikgJiYgb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiAkT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pICFoYXNPd24oaGlkZGVuS2V5cywga2V5KSAmJiBoYXNPd24oTywga2V5KSAmJiBwdXNoKHJlc3VsdCwga2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhc093bihPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCBwdXNoKHJlc3VsdCwga2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovXG52YXIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3InKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qtc2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgQ09SUkVDVF9TRVRURVIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nLCAnc2V0Jyk7XG4gICAgc2V0dGVyKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIE87XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYE9yZGluYXJ5VG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKHByZWYgPT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChpc0NhbGxhYmxlKGZuID0gaW5wdXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChwcmVmICE9PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQoa2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgRU5WSVJPTk1FTlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcblxudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgU1VCQ0xBU1NJTkcgPSBmYWxzZTtcbnZhciBOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgPSBpc0NhbGxhYmxlKGdsb2JhbFRoaXMuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcblxudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gaXNGb3JjZWQoJ1Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSA9IGluc3BlY3RTb3VyY2UoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSAhPT0gU3RyaW5nKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSN7IGNhdGNoLCBmaW5hbGx5IH0gaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICEoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKCFWOF9WRVJTSU9OIHx8IFY4X1ZFUlNJT04gPCA1MSB8fCAhL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkge1xuICAgIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSBuZXcgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgICB9O1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICAgIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICB9IHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiAoRU5WSVJPTk1FTlQgPT09ICdCUk9XU0VSJyB8fCBFTlZJUk9OTUVOVCA9PT0gJ0RFTk8nKSAmJiAhTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDT05TVFJVQ1RPUjogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsXG4gIFJFSkVDVElPTl9FVkVOVDogTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5ULFxuICBTVUJDTEFTU0lORzogU1VCQ0xBU1NJTkdcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXMuUHJvbWlzZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJykuQ09OU1RSVUNUT1I7XG5cbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oZWFkID0gbnVsbDtcbiAgdGhpcy50YWlsID0gbnVsbDtcbn07XG5cblF1ZXVlLnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBlbnRyeSA9IHsgaXRlbTogaXRlbSwgbmV4dDogbnVsbCB9O1xuICAgIHZhciB0YWlsID0gdGhpcy50YWlsO1xuICAgIGlmICh0YWlsKSB0YWlsLm5leHQgPSBlbnRyeTtcbiAgICBlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICB9LFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmhlYWQ7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICB2YXIgbmV4dCA9IHRoaXMuaGVhZCA9IGVudHJ5Lm5leHQ7XG4gICAgICBpZiAobmV4dCA9PT0gbnVsbCkgdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHJldHVybiBlbnRyeS5pdGVtO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBRdWV1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZWdFeHBFeGVjYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwZXhlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgaWYgKGlzQ2FsbGFibGUoZXhlYykpIHtcbiAgICB2YXIgcmVzdWx0ID0gY2FsbChleGVjLCBSLCBTKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSBhbk9iamVjdChyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGNsYXNzb2YoUikgPT09ICdSZWdFeHAnKSByZXR1cm4gY2FsbChyZWdleHBFeGVjLCBSLCBTKTtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1JlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXInKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSByZWdleHAvbm8tZW1wdHktY2FwdHVyaW5nLWdyb3VwLCByZWdleHAvbm8tZW1wdHktZ3JvdXAsIHJlZ2V4cC9uby1sYXp5LWVuZHMgLS0gdGVzdGluZyAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVnZXhwL25vLXVzZWxlc3MtcXVhbnRpZmllciAtLSB0ZXN0aW5nICovXG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVnZXhwRmxhZ3MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzJyk7XG52YXIgc3RpY2t5SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJykuZ2V0O1xudmFyIFVOU1VQUE9SVEVEX0RPVF9BTEwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwnKTtcbnZhciBVTlNVUFBPUlRFRF9OQ0cgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLW5jZycpO1xuXG52YXIgbmF0aXZlUmVwbGFjZSA9IHNoYXJlZCgnbmF0aXZlLXN0cmluZy1yZXBsYWNlJywgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvO1xuICB2YXIgcmUyID0gL2IqL2c7XG4gIGNhbGwobmF0aXZlRXhlYywgcmUxLCAnYScpO1xuICBjYWxsKG5hdGl2ZUV4ZWMsIHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDtcbn0pKCk7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5CUk9LRU5fQ0FSRVQ7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEIHx8IFVOU1VQUE9SVEVEX1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0c7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyaW5nKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHJlKTtcbiAgICB2YXIgc3RyID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICB2YXIgcmF3ID0gc3RhdGUucmF3O1xuICAgIHZhciByZXN1bHQsIHJlQ29weSwgbGFzdEluZGV4LCBtYXRjaCwgaSwgb2JqZWN0LCBncm91cDtcblxuICAgIGlmIChyYXcpIHtcbiAgICAgIHJhdy5sYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG4gICAgICByZXN1bHQgPSBjYWxsKHBhdGNoZWRFeGVjLCByYXcsIHN0cik7XG4gICAgICByZS5sYXN0SW5kZXggPSByYXcubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXBzID0gc3RhdGUuZ3JvdXBzO1xuICAgIHZhciBzdGlja3kgPSBVTlNVUFBPUlRFRF9ZICYmIHJlLnN0aWNreTtcbiAgICB2YXIgZmxhZ3MgPSBjYWxsKHJlZ2V4cEZsYWdzLCByZSk7XG4gICAgdmFyIHNvdXJjZSA9IHJlLnNvdXJjZTtcbiAgICB2YXIgY2hhcnNBZGRlZCA9IDA7XG4gICAgdmFyIHN0ckNvcHkgPSBzdHI7XG5cbiAgICBpZiAoc3RpY2t5KSB7XG4gICAgICBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsICd5JywgJycpO1xuICAgICAgaWYgKGluZGV4T2YoZmxhZ3MsICdnJykgPT09IC0xKSB7XG4gICAgICAgIGZsYWdzICs9ICdnJztcbiAgICAgIH1cblxuICAgICAgc3RyQ29weSA9IHN0cmluZ1NsaWNlKHN0ciwgcmUubGFzdEluZGV4KTtcbiAgICAgIC8vIFN1cHBvcnQgYW5jaG9yZWQgc3RpY2t5IGJlaGF2aW9yLlxuICAgICAgaWYgKHJlLmxhc3RJbmRleCA+IDAgJiYgKCFyZS5tdWx0aWxpbmUgfHwgcmUubXVsdGlsaW5lICYmIGNoYXJBdChzdHIsIHJlLmxhc3RJbmRleCAtIDEpICE9PSAnXFxuJykpIHtcbiAgICAgICAgc291cmNlID0gJyg/OiAnICsgc291cmNlICsgJyknO1xuICAgICAgICBzdHJDb3B5ID0gJyAnICsgc3RyQ29weTtcbiAgICAgICAgY2hhcnNBZGRlZCsrO1xuICAgICAgfVxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIHN0ciBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXig/OicgKyBzb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICB9XG5cbiAgICBpZiAoTlBDR19JTkNMVURFRCkge1xuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyBzb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICB9XG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORykgbGFzdEluZGV4ID0gcmUubGFzdEluZGV4O1xuXG4gICAgbWF0Y2ggPSBjYWxsKG5hdGl2ZUV4ZWMsIHN0aWNreSA/IHJlQ29weSA6IHJlLCBzdHJDb3B5KTtcblxuICAgIGlmIChzdGlja3kpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBtYXRjaC5pbnB1dCA9IHN0cmluZ1NsaWNlKG1hdGNoLmlucHV0LCBjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2hbMF0gPSBzdHJpbmdTbGljZShtYXRjaFswXSwgY2hhcnNBZGRlZCk7XG4gICAgICAgIG1hdGNoLmluZGV4ID0gcmUubGFzdEluZGV4O1xuICAgICAgICByZS5sYXN0SW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfSBlbHNlIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlLmxhc3RJbmRleCA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgLyguPyk/L1xuICAgICAgY2FsbChuYXRpdmVSZXBsYWNlLCBtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoICYmIGdyb3Vwcykge1xuICAgICAgbWF0Y2guZ3JvdXBzID0gb2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgb2JqZWN0W2dyb3VwWzBdXSA9IG1hdGNoW2dyb3VwWzFdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Ncbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgcmVnRXhwRmxhZ3MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzJyk7XG5cbnZhciBSZWdFeHBQcm90b3R5cGUgPSBSZWdFeHAucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSKSB7XG4gIHZhciBmbGFncyA9IFIuZmxhZ3M7XG4gIHJldHVybiBmbGFncyA9PT0gdW5kZWZpbmVkICYmICEoJ2ZsYWdzJyBpbiBSZWdFeHBQcm90b3R5cGUpICYmICFoYXNPd24oUiwgJ2ZsYWdzJykgJiYgaXNQcm90b3R5cGVPZihSZWdFeHBQcm90b3R5cGUsIFIpXG4gICAgPyBjYWxsKHJlZ0V4cEZsYWdzLCBSKSA6IGZsYWdzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCdhJywgJ3knKSAtPiAvYS95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciAkUmVnRXhwID0gZ2xvYmFsVGhpcy5SZWdFeHA7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUgPSAkUmVnRXhwKCdhJywgJ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ2FiY2QnKSAhPT0gbnVsbDtcbn0pO1xuXG4vLyBVQyBCcm93c2VyIGJ1Z1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzEwMDhcbnZhciBNSVNTRURfU1RJQ0tZID0gVU5TVVBQT1JURURfWSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhJFJlZ0V4cCgnYScsICd5Jykuc3RpY2t5O1xufSk7XG5cbnZhciBCUk9LRU5fQ0FSRVQgPSBVTlNVUFBPUlRFRF9ZIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNjg3XG4gIHZhciByZSA9ICRSZWdFeHAoJ15yJywgJ2d5Jyk7XG4gIHJlLmxhc3RJbmRleCA9IDI7XG4gIHJldHVybiByZS5leGVjKCdzdHInKSAhPT0gbnVsbDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQlJPS0VOX0NBUkVUOiBCUk9LRU5fQ0FSRVQsXG4gIE1JU1NFRF9TVElDS1k6IE1JU1NFRF9TVElDS1ksXG4gIFVOU1VQUE9SVEVEX1k6IFVOU1VQUE9SVEVEX1lcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG5cbi8vIGJhYmVsLW1pbmlmeSBhbmQgQ2xvc3VyZSBDb21waWxlciB0cmFuc3BpbGVzIFJlZ0V4cCgnLicsICdzJykgLT4gLy4vcyBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yXG52YXIgJFJlZ0V4cCA9IGdsb2JhbFRoaXMuUmVnRXhwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gJFJlZ0V4cCgnLicsICdzJyk7XG4gIHJldHVybiAhKHJlLmRvdEFsbCAmJiByZS50ZXN0KCdcXG4nKSAmJiByZS5mbGFncyA9PT0gJ3MnKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG4vLyBiYWJlbC1taW5pZnkgYW5kIENsb3N1cmUgQ29tcGlsZXIgdHJhbnNwaWxlcyBSZWdFeHAoJyg/PGE+YiknLCAnZycpIC0+IC8oPzxhPmIpL2cgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyICRSZWdFeHAgPSBnbG9iYWxUaGlzLlJlZ0V4cDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciByZSA9ICRSZWdFeHAoJyg/PGE+YiknLCAnZycpO1xuICByZXR1cm4gcmUuZXhlYygnYicpLmdyb3Vwcy5hICE9PSAnYicgfHxcbiAgICAnYicucmVwbGFjZShyZSwgJyQ8YT5jJykgIT09ICdiYyc7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoaXQpKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gQXZvaWQgTm9kZUpTIGV4cGVyaW1lbnRhbCB3YXJuaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybiBnbG9iYWxUaGlzW25hbWVdO1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWxUaGlzLCBuYW1lKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkge1xuICB2YXIgQ29uc3RydWN0b3IgPSBnZXRCdWlsdEluKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiBDb25zdHJ1Y3RvciAmJiAhQ29uc3RydWN0b3JbU1BFQ0lFU10pIHtcbiAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIFRBRywgU1RBVElDKSB7XG4gIGlmICh0YXJnZXQgJiYgIVNUQVRJQykgdGFyZ2V0ID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgaWYgKHRhcmdldCAmJiAhaGFzT3duKHRhcmdldCwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsVGhpc1tTSEFSRURdIHx8IGRlZmluZUdsb2JhbFByb3BlcnR5KFNIQVJFRCwge30pO1xuXG4oc3RvcmUudmVyc2lvbnMgfHwgKHN0b3JlLnZlcnNpb25zID0gW10pKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuMzguMScsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxNC0yMDI0IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJyxcbiAgbGljZW5zZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzguMS9MSUNFTlNFJyxcbiAgc291cmNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlIHx8IHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3InKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgU3BlY2llc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgaXNOdWxsT3JVbmRlZmluZWQoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFDb25zdHJ1Y3RvcihTKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpLlBST1BFUjtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciBub24gPSAnXFx1MjAwQlxcdTAwODVcXHUxODBFJztcblxuLy8gY2hlY2sgdGhhdCBhIG1ldGhvZCB3b3JrcyB3aXRoIHRoZSBjb3JyZWN0IGxpc3Rcbi8vIG9mIHdoaXRlc3BhY2VzIGFuZCBoYXMgYSBjb3JyZWN0IG5hbWVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHJldHVybiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdKClcbiAgICAgIHx8IG5vbltNRVRIT0RfTkFNRV0oKSAhPT0gbm9uXG4gICAgICB8fCAoUFJPUEVSX0ZVTkNUSU9OX05BTUUgJiYgd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdLm5hbWUgIT09IE1FVEhPRF9OQU1FKTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZXMgKyAnXSsnKTtcbnZhciBydHJpbSA9IFJlZ0V4cCgnKF58W14nICsgd2hpdGVzcGFjZXMgKyAnXSlbJyArIHdoaXRlc3BhY2VzICsgJ10rJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJyQxJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxudmFyICRTdHJpbmcgPSBnbG9iYWxUaGlzLlN0cmluZztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woJ3N5bWJvbCBkZXRlY3Rpb24nKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICAvLyBuYjogRG8gbm90IGNhbGwgYFN0cmluZ2AgZGlyZWN0bHkgdG8gYXZvaWQgdGhpcyBiZWluZyBvcHRpbWl6ZWQgb3V0IHRvIGBzeW1ib2wrJydgIHdoaWNoIHdpbGwsXG4gIC8vIG9mIGNvdXJzZSwgZmFpbC5cbiAgcmV0dXJuICEkU3RyaW5nKHN5bWJvbCkgfHwgIShPYmplY3Qoc3ltYm9sKSBpbnN0YW5jZW9mIFN5bWJvbCkgfHxcbiAgICAvLyBDaHJvbWUgMzgtNDAgc3ltYm9scyBhcmUgbm90IGluaGVyaXRlZCBmcm9tIERPTSBjb2xsZWN0aW9ucyBwcm90b3R5cGVzIHRvIGluc3RhbmNlc1xuICAgICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGgnKTtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG5cbnZhciBzZXQgPSBnbG9iYWxUaGlzLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbFRoaXMuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbnZhciBEaXNwYXRjaCA9IGdsb2JhbFRoaXMuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWxUaGlzLkZ1bmN0aW9uO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsVGhpcy5NZXNzYWdlQ2hhbm5lbDtcbnZhciBTdHJpbmcgPSBnbG9iYWxUaGlzLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyICRsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbmZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gICRsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb247XG59KTtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAoaGFzT3duKHF1ZXVlLCBpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBldmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBnbG9iYWxQb3N0TWVzc2FnZURlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKFN0cmluZyhpZCksICRsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyAkbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGhhbmRsZXIpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgZm4gPSBpc0NhbGxhYmxlKGhhbmRsZXIpID8gaGFuZGxlciA6IEZ1bmN0aW9uKGhhbmRsZXIpO1xuICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBhcHBseShmbiwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChJU19OT0RFKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIC8vIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjI0XG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGV2ZW50TGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICBpc0NhbGxhYmxlKGdsb2JhbFRoaXMucG9zdE1lc3NhZ2UpICYmXG4gICAgIWdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cyAmJlxuICAgICRsb2NhdGlvbiAmJiAkbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiZcbiAgICAhZmFpbHMoZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlcilcbiAgKSB7XG4gICAgZGVmZXIgPSBnbG9iYWxQb3N0TWVzc2FnZURlZmVyO1xuICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRydW5jID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtdHJ1bmMnKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbGVuID0gdG9JbnRlZ2VyT3JJbmZpbml0eShhcmd1bWVudCk7XG4gIHJldHVybiBsZW4gPiAwID8gbWluKGxlbiwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcblxuLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIGlmICghaXNPYmplY3QoaW5wdXQpIHx8IGlzU3ltYm9sKGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZXhvdGljVG9QcmltID0gZ2V0TWV0aG9kKGlucHV0LCBUT19QUklNSVRJVkUpO1xuICB2YXIgcmVzdWx0O1xuICBpZiAoZXhvdGljVG9QcmltKSB7XG4gICAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdkZWZhdWx0JztcbiAgICByZXN1bHQgPSBjYWxsKGV4b3RpY1RvUHJpbSwgaW5wdXQsIHByZWYpO1xuICAgIGlmICghaXNPYmplY3QocmVzdWx0KSB8fCBpc1N5bWJvbChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcblxuLy8gYFRvUHJvcGVydHlLZXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsICdzdHJpbmcnKTtcbiAgcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ1N5bWJvbCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJFN0cmluZyA9IFN0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJFN0cmluZyhhcmd1bWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gVjggfiBDaHJvbWUgMzYtXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMzM0XG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgJ3Byb3RvdHlwZScsIHtcbiAgICB2YWx1ZTogNDIsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pLnByb3RvdHlwZSAhPT0gNDI7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ05vdCBlbm91Z2ggYXJndW1lbnRzJyk7XG4gIHJldHVybiBwYXNzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsVGhpcy5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsVGhpcy5TeW1ib2w7XG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbFsnZm9yJ10gfHwgU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhc093bihXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7XG4gICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gTkFUSVZFX1NZTUJPTCAmJiBoYXNPd24oU3ltYm9sLCBuYW1lKVxuICAgICAgPyBTeW1ib2xbbmFtZV1cbiAgICAgIDogY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpO1xuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5kZXhvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIG5hdGl2ZUluZGV4T2YgPSB1bmN1cnJ5VGhpcyhbXS5pbmRleE9mKTtcblxudmFyIE5FR0FUSVZFX1pFUk8gPSAhIW5hdGl2ZUluZGV4T2YgJiYgMSAvIG5hdGl2ZUluZGV4T2YoWzFdLCAxLCAtMCkgPCAwO1xudmFyIEZPUkNFRCA9IE5FR0FUSVZFX1pFUk8gfHwgIWFycmF5TWV0aG9kSXNTdHJpY3QoJ2luZGV4T2YnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICB2YXIgZnJvbUluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gbmF0aXZlSW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZScpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5c1xuLy8gYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudmFsdWVzXG4vLyBgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVJdGVyYXRvcihBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLFxuICAgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwgLy8gdGFyZ2V0XG4gICAgaW5kZXg6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gIH0pO1xuLy8gYCVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IG51bGw7XG4gICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuICBzd2l0Y2ggKHN0YXRlLmtpbmQpIHtcbiAgICBjYXNlICdrZXlzJzogcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoaW5kZXgsIGZhbHNlKTtcbiAgICBjYXNlICd2YWx1ZXMnOiByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh0YXJnZXRbaW5kZXhdLCBmYWxzZSk7XG4gIH0gcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZmFsc2UpO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG52YXIgdmFsdWVzID0gSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDQ1LSBidWdcbmlmICghSVNfUFVSRSAmJiBERVNDUklQVE9SUyAmJiB2YWx1ZXMubmFtZSAhPT0gJ3ZhbHVlcycpIHRyeSB7XG4gIGRlZmluZVByb3BlcnR5KHZhbHVlcywgJ25hbWUnLCB7IHZhbHVlOiAndmFsdWVzJyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktcmVkdWNlJykubGVmdDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcbnZhciBDSFJPTUVfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG5cbi8vIENocm9tZSA4MC04MiBoYXMgYSBjcml0aWNhbCBidWdcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNDk5ODJcbnZhciBDSFJPTUVfQlVHID0gIUlTX05PREUgJiYgQ0hST01FX1ZFUlNJT04gPiA3OSAmJiBDSFJPTUVfVkVSU0lPTiA8IDgzO1xudmFyIEZPUkNFRCA9IENIUk9NRV9CVUcgfHwgIWFycmF5TWV0aG9kSXNTdHJpY3QoJ3JlZHVjZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBsZW5ndGgsIGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxudmFyIG5hdGl2ZVJldmVyc2UgPSB1bmN1cnJ5VGhpcyhbXS5yZXZlcnNlKTtcbnZhciB0ZXN0ID0gWzEsIDJdO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmV2ZXJzZVxuLy8gZml4IGZvciBTYWZhcmkgMTIuMCBidWdcbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODg3OTRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFN0cmluZyh0ZXN0KSA9PT0gU3RyaW5nKHRlc3QucmV2ZXJzZSgpKSB9LCB7XG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduIC0tIGRpcnR5IGhhY2tcbiAgICBpZiAoaXNBcnJheSh0aGlzKSkgdGhpcy5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gbmF0aXZlUmV2ZXJzZSh0aGlzKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG4vLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiwgcmVhbDogdHJ1ZSB9LCB7XG4gICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjY2F0Y2hgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnY2F0Y2gnXTtcbiAgaWYgKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2NhdGNoJywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21pY3JvdGFzaycpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgUXVldWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcXVldWUnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5DT05TVFJVQ1RPUjtcbnZhciBOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uUkVKRUNUSU9OX0VWRU5UO1xudmFyIE5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLlNVQkNMQVNTSU5HO1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3I7XG52YXIgUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGU7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsVGhpcy5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xuXG52YXIgRElTUEFUQ0hfRVZFTlQgPSAhIShkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiBnbG9iYWxUaGlzLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xuXG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgaXNDYWxsYWJsZSh0aGVuID0gaXQudGhlbikgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgY2FsbFJlYWN0aW9uID0gZnVuY3Rpb24gKHJlYWN0aW9uLCBzdGF0ZSkge1xuICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT09IEZVTEZJTExFRDtcbiAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gIHRyeSB7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBjYW4gdGhyb3dcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICBjYWxsKHRoZW4sIHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgIHJlamVjdChlcnJvcik7XG4gIH1cbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAoc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlYWN0aW9ucyA9IHN0YXRlLnJlYWN0aW9ucztcbiAgICB2YXIgcmVhY3Rpb247XG4gICAgd2hpbGUgKHJlYWN0aW9uID0gcmVhY3Rpb25zLmdldCgpKSB7XG4gICAgICBjYWxsUmVhY3Rpb24ocmVhY3Rpb24sIHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsVGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9O1xuICBpZiAoIU5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFRoaXNbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWxUaGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWxUaGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdGUuZmFjYWRlID09PSB2YWx1ZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUikge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IG5ldyBRdWV1ZSgpLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IG51bGxcbiAgICB9KTtcbiAgfTtcblxuICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICBJbnRlcm5hbC5wcm90b3R5cGUgPSBkZWZpbmVCdWlsdEluKFByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgIHJlYWN0aW9uLm9rID0gaXNDYWxsYWJsZShvbkZ1bGZpbGxlZCkgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgcmVhY3Rpb24uZmFpbCA9IGlzQ2FsbGFibGUob25SZWplY3RlZCkgJiYgb25SZWplY3RlZDtcbiAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRlLnN0YXRlID09PSBQRU5ESU5HKSBzdGF0ZS5yZWFjdGlvbnMuYWRkKHJlYWN0aW9uKTtcbiAgICBlbHNlIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsUmVhY3Rpb24ocmVhY3Rpb24sIHN0YXRlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgfSk7XG5cbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7XG4gIH07XG5cbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGNhbGwobmF0aXZlVGhlbiwgdGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGAuY29uc3RydWN0b3IgPT09IFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICB0cnkge1xuICAgICAgZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gICAgLy8gbWFrZSBgaW5zdGFuY2VvZiBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHNwbGl0IHRvIG1vZHVsZXMgbGlzdGVkIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5jYXRjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG4vLyBgUHJvbWlzZS5yYWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgY2FsbCgkcHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcblxuLy8gYFByb21pc2UucmVqZWN0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB9LCB7XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7XG4gICAgdmFyIGNhcGFiaWxpdHlSZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICBjYXBhYmlsaXR5UmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpLkNPTlNUUlVDVE9SO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xuXG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKTtcbnZhciBDSEVDS19XUkFQUEVSID0gSVNfUFVSRSAmJiAhRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKENIRUNLX1dSQVBQRVIgJiYgdGhpcyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA/IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUuZXhlY2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUuZXhlY1xuJCh7IHRhcmdldDogJ1JlZ0V4cCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IC8uLy5leGVjICE9PSBleGVjIH0sIHtcbiAgZXhlYzogZXhlY1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpLlBST1BFUjtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyICR0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldFJlZ0V4cEZsYWdzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MnKTtcblxudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcbnZhciBuYXRpdmVUb1N0cmluZyA9IFJlZ0V4cFByb3RvdHlwZVtUT19TVFJJTkddO1xuXG52YXIgTk9UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVUb1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT09ICcvYS9iJzsgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxudmFyIElOQ09SUkVDVF9OQU1FID0gUFJPUEVSX0ZVTkNUSU9OX05BTUUgJiYgbmF0aXZlVG9TdHJpbmcubmFtZSAhPT0gVE9fU1RSSU5HO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbmlmIChOT1RfR0VORVJJQyB8fCBJTkNPUlJFQ1RfTkFNRSkge1xuICBkZWZpbmVCdWlsdEluKFJlZ0V4cFByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwYXR0ZXJuID0gJHRvU3RyaW5nKFIuc291cmNlKTtcbiAgICB2YXIgZmxhZ3MgPSAkdG9TdHJpbmcoZ2V0UmVnRXhwRmxhZ3MoUikpO1xuICAgIHJldHVybiAnLycgKyBwYXR0ZXJuICsgJy8nICsgZmxhZ3M7XG4gIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIHNsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnZW5kc1dpdGgnKTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3B1bGwvNzAyXG52YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ2VuZHNXaXRoJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlO1xufSgpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZW5kc3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRoYXQubGVuZ3RoO1xuICAgIHZhciBlbmQgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogbWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTtcbiAgICB2YXIgc2VhcmNoID0gdG9TdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gc2xpY2UodGhhdCwgZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xuXG52YXIgc3RyaW5nSW5kZXhPZiA9IHVuY3VycnlUaGlzKCcnLmluZGV4T2YpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfnN0cmluZ0luZGV4T2YoXG4gICAgICB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKSxcbiAgICAgIHRvU3RyaW5nKG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKSksXG4gICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdtYXRjaCcsIGZ1bmN0aW9uIChNQVRDSCwgbmF0aXZlTWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBtYXRjaGVyID0gaXNOdWxsT3JVbmRlZmluZWQocmVnZXhwKSA/IHVuZGVmaW5lZCA6IGdldE1ldGhvZChyZWdleHAsIE1BVENIKTtcbiAgICAgIHJldHVybiBtYXRjaGVyID8gY2FsbChtYXRjaGVyLCByZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXSh0b1N0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdCh0aGlzKTtcbiAgICAgIHZhciBTID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWF0Y2gsIHJ4LCBTKTtcblxuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuXG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gdG9TdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIGdldFN1YnN0aXR1dGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uJyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgUkVQTEFDRSA9IHdlbGxLbm93blN5bWJvbCgncmVwbGFjZScpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xudmFyIHN0cmluZ0luZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxudmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xuXG4vLyBJRSA8PSAxMSByZXBsYWNlcyAkMCB3aXRoIHRoZSB3aG9sZSBtYXRjaCwgYXMgaWYgaXQgd2FzICQmXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MDI0NjY2L2dldHRpbmctaWUtdG8tcmVwbGFjZS1hLXJlZ2V4LXdpdGgtdGhlLWxpdGVyYWwtc3RyaW5nLTBcbnZhciBSRVBMQUNFX0tFRVBTXyQwID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9wcmVmZXItZXNjYXBlLXJlcGxhY2VtZW50LWRvbGxhci1jaGFyIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiAnYScucmVwbGFjZSgvLi8sICckMCcpID09PSAnJDAnO1xufSkoKTtcblxuLy8gU2FmYXJpIDw9IDEzLjAuMyg/KSBzdWJzdGl0dXRlcyBudGggY2FwdHVyZSB3aGVyZSBuPm0gd2l0aCBhbiBlbXB0eSBzdHJpbmdcbnZhciBSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRSA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICgvLi9bUkVQTEFDRV0pIHtcbiAgICByZXR1cm4gLy4vW1JFUExBQ0VdKCdhJywgJyQwJykgPT09ICcnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pKCk7XG5cbnZhciBSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciByZSA9IC8uLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgcmVzdWx0Lmdyb3VwcyA9IHsgYTogJzcnIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby11c2VsZXNzLWRvbGxhci1yZXBsYWNlbWVudHMgLS0gZmFsc2UgcG9zaXRpdmVcbiAgcmV0dXJuICcnLnJlcGxhY2UocmUsICckPGE+JykgIT09ICc3Jztcbn0pO1xuXG4vLyBAQHJlcGxhY2UgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdyZXBsYWNlJywgZnVuY3Rpb24gKF8sIG5hdGl2ZVJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgVU5TQUZFX1NVQlNUSVRVVEUgPSBSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRSA/ICckJyA6ICckMCc7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIHJlcGxhY2VyID0gaXNOdWxsT3JVbmRlZmluZWQoc2VhcmNoVmFsdWUpID8gdW5kZWZpbmVkIDogZ2V0TWV0aG9kKHNlYXJjaFZhbHVlLCBSRVBMQUNFKTtcbiAgICAgIHJldHVybiByZXBsYWNlclxuICAgICAgICA/IGNhbGwocmVwbGFjZXIsIHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICAgIDogY2FsbChuYXRpdmVSZXBsYWNlLCB0b1N0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEByZXBsYWNlXG4gICAgZnVuY3Rpb24gKHN0cmluZywgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdCh0aGlzKTtcbiAgICAgIHZhciBTID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmVwbGFjZVZhbHVlID09ICdzdHJpbmcnICYmXG4gICAgICAgIHN0cmluZ0luZGV4T2YocmVwbGFjZVZhbHVlLCBVTlNBRkVfU1VCU1RJVFVURSkgPT09IC0xICYmXG4gICAgICAgIHN0cmluZ0luZGV4T2YocmVwbGFjZVZhbHVlLCAnJDwnKSA9PT0gLTFcbiAgICAgICkge1xuICAgICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVJlcGxhY2UsIHJ4LCBTLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmdW5jdGlvbmFsUmVwbGFjZSA9IGlzQ2FsbGFibGUocmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IHRvU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgIHZhciBnbG9iYWwgPSByeC5nbG9iYWw7XG4gICAgICB2YXIgZnVsbFVuaWNvZGU7XG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgYnJlYWs7XG5cbiAgICAgICAgcHVzaChyZXN1bHRzLCByZXN1bHQpO1xuICAgICAgICBpZiAoIWdsb2JhbCkgYnJlYWs7XG5cbiAgICAgICAgdmFyIG1hdGNoU3RyID0gdG9TdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjY3VtdWxhdGVkUmVzdWx0ID0gJyc7XG4gICAgICB2YXIgbmV4dFNvdXJjZVBvc2l0aW9uID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgPSByZXN1bHRzW2ldO1xuXG4gICAgICAgIHZhciBtYXRjaGVkID0gdG9TdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXJPckluZmluaXR5KHJlc3VsdC5pbmRleCksIFMubGVuZ3RoKSwgMCk7XG4gICAgICAgIHZhciBjYXB0dXJlcyA9IFtdO1xuICAgICAgICB2YXIgcmVwbGFjZW1lbnQ7XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgcHVzaChjYXB0dXJlcywgbWF5YmVUb1N0cmluZyhyZXN1bHRbal0pKTtcbiAgICAgICAgdmFyIG5hbWVkQ2FwdHVyZXMgPSByZXN1bHQuZ3JvdXBzO1xuICAgICAgICBpZiAoZnVuY3Rpb25hbFJlcGxhY2UpIHtcbiAgICAgICAgICB2YXIgcmVwbGFjZXJBcmdzID0gY29uY2F0KFttYXRjaGVkXSwgY2FwdHVyZXMsIHBvc2l0aW9uLCBTKTtcbiAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSBwdXNoKHJlcGxhY2VyQXJncywgbmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSB0b1N0cmluZyhhcHBseShyZXBsYWNlVmFsdWUsIHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBzdHJpbmdTbGljZShTLCBuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkUmVzdWx0ICsgc3RyaW5nU2xpY2UoUywgbmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG59LCAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMgfHwgIVJFUExBQ0VfS0VFUFNfJDAgfHwgUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciBzdGlja3lIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5VTlNVUFBPUlRFRF9ZO1xudmFyIE1BWF9VSU5UMzIgPSAweEZGRkZGRkZGO1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCByZXN1bHRbMF0gIT09ICdhJyB8fCByZXN1bHRbMV0gIT09ICdiJztcbn0pO1xuXG52YXIgQlVHR1kgPSAnYWJiYycuc3BsaXQoLyhiKSovKVsxXSA9PT0gJ2MnIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tZW1wdHktZ3JvdXAgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgJ3Rlc3QnLnNwbGl0KC8oPzopLywgLTEpLmxlbmd0aCAhPT0gNCB8fFxuICAnYWInLnNwbGl0KC8oPzphYikqLykubGVuZ3RoICE9PSAyIHx8XG4gICcuJy5zcGxpdCgvKC4/KSguPykvKS5sZW5ndGggIT09IDQgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAnLicuc3BsaXQoLygpKCkvKS5sZW5ndGggPiAxIHx8XG4gICcnLnNwbGl0KC8uPy8pLmxlbmd0aDtcblxuLy8gQEBzcGxpdCBsb2dpY1xuZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ3NwbGl0JywgZnVuY3Rpb24gKFNQTElULCBuYXRpdmVTcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBpbnRlcm5hbFNwbGl0ID0gJzAnLnNwbGl0KHVuZGVmaW5lZCwgMCkubGVuZ3RoID8gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6IGNhbGwobmF0aXZlU3BsaXQsIHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICB9IDogbmF0aXZlU3BsaXQ7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gaXNOdWxsT3JVbmRlZmluZWQoc2VwYXJhdG9yKSA/IHVuZGVmaW5lZCA6IGdldE1ldGhvZChzZXBhcmF0b3IsIFNQTElUKTtcbiAgICAgIHJldHVybiBzcGxpdHRlclxuICAgICAgICA/IGNhbGwoc3BsaXR0ZXIsIHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICAgIDogY2FsbChpbnRlcm5hbFNwbGl0LCB0b1N0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXRcbiAgICAvL1xuICAgIC8vIE5PVEU6IFRoaXMgY2Fubm90IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQgaW4gZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnRcbiAgICAvLyB0aGUgJ3knIGZsYWcuXG4gICAgZnVuY3Rpb24gKHN0cmluZywgbGltaXQpIHtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIFMgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICBpZiAoIUJVR0dZKSB7XG4gICAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoaW50ZXJuYWxTcGxpdCwgcngsIFMsIGxpbWl0LCBpbnRlcm5hbFNwbGl0ICE9PSBuYXRpdmVTcGxpdCk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFVOU1VQUE9SVEVEX1kgPyAnZycgOiAneScpO1xuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIFMgc2xpY2luZywgdG9cbiAgICAgIC8vIHNpbXVsYXRlIHRoZSAneScgZmxhZy5cbiAgICAgIHZhciBzcGxpdHRlciA9IG5ldyBDKFVOU1VQUE9SVEVEX1kgPyAnXig/OicgKyByeC5zb3VyY2UgKyAnKScgOiByeCwgZmxhZ3MpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoUy5sZW5ndGggPT09IDApIHJldHVybiByZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gVU5TVVBQT1JURURfWSA/IDAgOiBxO1xuICAgICAgICB2YXIgeiA9IHJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFVOU1VQUE9SVEVEX1kgPyBzdHJpbmdTbGljZShTLCBxKSA6IFMpO1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPT09IG51bGwgfHxcbiAgICAgICAgICAoZSA9IG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoVU5TVVBQT1JURURfWSA/IHEgOiAwKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2goQSwgc3RyaW5nU2xpY2UoUywgcCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgcHVzaChBLCB6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwdXNoKEEsIHN0cmluZ1NsaWNlKFMsIHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0sIEJVR0dZIHx8ICFTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMsIFVOU1VQUE9SVEVEX1kpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgobWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBzdHJpbmdTbGljZSh0aGF0LCBpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbScpIH0sIHtcbiAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIERPTVRva2VuTGlzdFByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvck1ldGhvZHMudmFsdWVzO1xuXG52YXIgaGFuZGxlUHJvdG90eXBlID0gZnVuY3Rpb24gKENvbGxlY3Rpb25Qcm90b3R5cGUsIENPTExFQ1RJT05fTkFNRSkge1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgc2V0VG9TdHJpbmdUYWcoQ29sbGVjdGlvblByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FLCB0cnVlKTtcbiAgICBpZiAoRE9NSXRlcmFibGVzW0NPTExFQ1RJT05fTkFNRV0pIGZvciAodmFyIE1FVEhPRF9OQU1FIGluIEFycmF5SXRlcmF0b3JNZXRob2RzKSB7XG4gICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSAhPT0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKSB0cnkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgaGFuZGxlUHJvdG90eXBlKGdsb2JhbFRoaXNbQ09MTEVDVElPTl9OQU1FXSAmJiBnbG9iYWxUaGlzW0NPTExFQ1RJT05fTkFNRV0ucHJvdG90eXBlLCBDT0xMRUNUSU9OX05BTUUpO1xufVxuXG5oYW5kbGVQcm90b3R5cGUoRE9NVG9rZW5MaXN0UHJvdG90eXBlLCAnRE9NVG9rZW5MaXN0Jyk7XG4iLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAobiwgdCwgZSwgciwgbywgYSwgYykge1xuICB0cnkge1xuICAgIHZhciBpID0gblthXShjKSxcbiAgICAgIHUgPSBpLnZhbHVlO1xuICB9IGNhdGNoIChuKSB7XG4gICAgcmV0dXJuIHZvaWQgZShuKTtcbiAgfVxuICBpLmRvbmUgPyB0KHUpIDogUHJvbWlzZS5yZXNvbHZlKHUpLnRoZW4ociwgbyk7XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHQgPSB0aGlzLFxuICAgICAgZSA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIG8pIHtcbiAgICAgIHZhciBhID0gbi5hcHBseSh0LCBlKTtcbiAgICAgIGZ1bmN0aW9uIF9uZXh0KG4pIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGEsIHIsIG8sIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCBuKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhuKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChhLCByLCBvLCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIG4pO1xuICAgICAgfVxuICAgICAgX25leHQodm9pZCAwKTtcbiAgICB9KTtcbiAgfTtcbn1cbmV4cG9ydCB7IF9hc3luY1RvR2VuZXJhdG9yIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZXhwb3J0IHsgX2RlZmluZVByb3BlcnR5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5leHBvcnQgeyB0b1ByaW1pdGl2ZSBhcyBkZWZhdWx0IH07IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgdD1mdW5jdGlvbihyLGUpe3JldHVybih0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LHIpe3QuX19wcm90b19fPXJ9fHxmdW5jdGlvbih0LHIpe2Zvcih2YXIgZSBpbiByKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGUpJiYodFtlXT1yW2VdKX0pKHIsZSl9O2Z1bmN0aW9uIHIocixlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIitTdHJpbmcoZSkrXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfXQocixlKSxyLnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihpLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgaSl9ZnVuY3Rpb24gZSh0KXt2YXIgcj1cIlwiO0FycmF5LmlzQXJyYXkodCl8fCh0PVt0XSk7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBpPXRbZV07aWYoaS50eXBlPT09Xy5DTE9TRV9QQVRIKXIrPVwielwiO2Vsc2UgaWYoaS50eXBlPT09Xy5IT1JJWl9MSU5FX1RPKXIrPShpLnJlbGF0aXZlP1wiaFwiOlwiSFwiKStpLng7ZWxzZSBpZihpLnR5cGU9PT1fLlZFUlRfTElORV9UTylyKz0oaS5yZWxhdGl2ZT9cInZcIjpcIlZcIikraS55O2Vsc2UgaWYoaS50eXBlPT09Xy5NT1ZFX1RPKXIrPShpLnJlbGF0aXZlP1wibVwiOlwiTVwiKStpLngrXCIgXCIraS55O2Vsc2UgaWYoaS50eXBlPT09Xy5MSU5FX1RPKXIrPShpLnJlbGF0aXZlP1wibFwiOlwiTFwiKStpLngrXCIgXCIraS55O2Vsc2UgaWYoaS50eXBlPT09Xy5DVVJWRV9UTylyKz0oaS5yZWxhdGl2ZT9cImNcIjpcIkNcIikraS54MStcIiBcIitpLnkxK1wiIFwiK2kueDIrXCIgXCIraS55MitcIiBcIitpLngrXCIgXCIraS55O2Vsc2UgaWYoaS50eXBlPT09Xy5TTU9PVEhfQ1VSVkVfVE8pcis9KGkucmVsYXRpdmU/XCJzXCI6XCJTXCIpK2kueDIrXCIgXCIraS55MitcIiBcIitpLngrXCIgXCIraS55O2Vsc2UgaWYoaS50eXBlPT09Xy5RVUFEX1RPKXIrPShpLnJlbGF0aXZlP1wicVwiOlwiUVwiKStpLngxK1wiIFwiK2kueTErXCIgXCIraS54K1wiIFwiK2kueTtlbHNlIGlmKGkudHlwZT09PV8uU01PT1RIX1FVQURfVE8pcis9KGkucmVsYXRpdmU/XCJ0XCI6XCJUXCIpK2kueCtcIiBcIitpLnk7ZWxzZXtpZihpLnR5cGUhPT1fLkFSQyl0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29tbWFuZCB0eXBlIFwiJytpLnR5cGUrJ1wiIGF0IGluZGV4ICcrZStcIi5cIik7cis9KGkucmVsYXRpdmU/XCJhXCI6XCJBXCIpK2kuclgrXCIgXCIraS5yWStcIiBcIitpLnhSb3QrXCIgXCIrICtpLmxBcmNGbGFnK1wiIFwiKyAraS5zd2VlcEZsYWcrXCIgXCIraS54K1wiIFwiK2kueX19cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0LHIpe3ZhciBlPXRbMF0saT10WzFdO3JldHVybltlKk1hdGguY29zKHIpLWkqTWF0aC5zaW4ociksZSpNYXRoLnNpbihyKStpKk1hdGguY29zKHIpXX1mdW5jdGlvbiBhKCl7Zm9yKHZhciB0PVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXRbcl09YXJndW1lbnRzW3JdO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKFwibnVtYmVyXCIhPXR5cGVvZiB0W2VdKXRocm93IG5ldyBFcnJvcihcImFzc2VydE51bWJlcnMgYXJndW1lbnRzW1wiK2UrXCJdIGlzIG5vdCBhIG51bWJlci4gXCIrdHlwZW9mIHRbZV0rXCIgPT0gdHlwZW9mIFwiK3RbZV0pO3JldHVybiEwfXZhciBuPU1hdGguUEk7ZnVuY3Rpb24gbyh0LHIsZSl7dC5sQXJjRmxhZz0wPT09dC5sQXJjRmxhZz8wOjEsdC5zd2VlcEZsYWc9MD09PXQuc3dlZXBGbGFnPzA6MTt2YXIgYT10LnJYLG89dC5yWSxzPXQueCx1PXQueTthPU1hdGguYWJzKHQuclgpLG89TWF0aC5hYnModC5yWSk7dmFyIGg9aShbKHItcykvMiwoZS11KS8yXSwtdC54Um90LzE4MCpuKSxjPWhbMF0seT1oWzFdLHA9TWF0aC5wb3coYywyKS9NYXRoLnBvdyhhLDIpK01hdGgucG93KHksMikvTWF0aC5wb3cobywyKTsxPHAmJihhKj1NYXRoLnNxcnQocCksbyo9TWF0aC5zcXJ0KHApKSx0LnJYPWEsdC5yWT1vO3ZhciBtPU1hdGgucG93KGEsMikqTWF0aC5wb3coeSwyKStNYXRoLnBvdyhvLDIpKk1hdGgucG93KGMsMiksTz0odC5sQXJjRmxhZyE9PXQuc3dlZXBGbGFnPzE6LTEpKk1hdGguc3FydChNYXRoLm1heCgwLChNYXRoLnBvdyhhLDIpKk1hdGgucG93KG8sMiktbSkvbSkpLGw9YSp5L28qTyxUPS1vKmMvYSpPLHY9aShbbCxUXSx0LnhSb3QvMTgwKm4pO3QuY1g9dlswXSsocitzKS8yLHQuY1k9dlsxXSsoZSt1KS8yLHQucGhpMT1NYXRoLmF0YW4yKCh5LVQpL28sKGMtbCkvYSksdC5waGkyPU1hdGguYXRhbjIoKC15LVQpL28sKC1jLWwpL2EpLDA9PT10LnN3ZWVwRmxhZyYmdC5waGkyPnQucGhpMSYmKHQucGhpMi09MipuKSwxPT09dC5zd2VlcEZsYWcmJnQucGhpMjx0LnBoaTEmJih0LnBoaTIrPTIqbiksdC5waGkxKj0xODAvbix0LnBoaTIqPTE4MC9ufWZ1bmN0aW9uIHModCxyLGUpe2EodCxyLGUpO3ZhciBpPXQqdCtyKnItZSplO2lmKDA+aSlyZXR1cm5bXTtpZigwPT09aSlyZXR1cm5bW3QqZS8odCp0K3IqciksciplLyh0KnQrcipyKV1dO3ZhciBuPU1hdGguc3FydChpKTtyZXR1cm5bWyh0KmUrcipuKS8odCp0K3IqciksKHIqZS10Km4pLyh0KnQrcipyKV0sWyh0KmUtcipuKS8odCp0K3IqciksKHIqZSt0Km4pLyh0KnQrcipyKV1dfXZhciB1LGg9TWF0aC5QSS8xODA7ZnVuY3Rpb24gYyh0LHIsZSl7cmV0dXJuKDEtZSkqdCtlKnJ9ZnVuY3Rpb24geSh0LHIsZSxpKXtyZXR1cm4gdCtNYXRoLmNvcyhpLzE4MCpuKSpyK01hdGguc2luKGkvMTgwKm4pKmV9ZnVuY3Rpb24gcCh0LHIsZSxpKXt2YXIgYT0xZS02LG49ci10LG89ZS1yLHM9MypuKzMqKGktZSktNipvLHU9Niooby1uKSxoPTMqbjtyZXR1cm4gTWF0aC5hYnMocyk8YT9bLWgvdV06ZnVuY3Rpb24odCxyLGUpe3ZvaWQgMD09PWUmJihlPTFlLTYpO3ZhciBpPXQqdC80LXI7aWYoaTwtZSlyZXR1cm5bXTtpZihpPD1lKXJldHVyblstdC8yXTt2YXIgYT1NYXRoLnNxcnQoaSk7cmV0dXJuWy10LzItYSwtdC8yK2FdfSh1L3MsaC9zLGEpfWZ1bmN0aW9uIG0odCxyLGUsaSxhKXt2YXIgbj0xLWE7cmV0dXJuIHQqKG4qbipuKStyKigzKm4qbiphKStlKigzKm4qYSphKStpKihhKmEqYSl9IWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gdSgoZnVuY3Rpb24odCxyLGUpe3JldHVybiB0LnJlbGF0aXZlJiYodm9pZCAwIT09dC54MSYmKHQueDErPXIpLHZvaWQgMCE9PXQueTEmJih0LnkxKz1lKSx2b2lkIDAhPT10LngyJiYodC54Mis9ciksdm9pZCAwIT09dC55MiYmKHQueTIrPWUpLHZvaWQgMCE9PXQueCYmKHQueCs9ciksdm9pZCAwIT09dC55JiYodC55Kz1lKSx0LnJlbGF0aXZlPSExKSx0fSkpfWZ1bmN0aW9uIGUoKXt2YXIgdD1OYU4scj1OYU4sZT1OYU4saT1OYU47cmV0dXJuIHUoKGZ1bmN0aW9uKGEsbixvKXtyZXR1cm4gYS50eXBlJl8uU01PT1RIX0NVUlZFX1RPJiYoYS50eXBlPV8uQ1VSVkVfVE8sdD1pc05hTih0KT9uOnQscj1pc05hTihyKT9vOnIsYS54MT1hLnJlbGF0aXZlP24tdDoyKm4tdCxhLnkxPWEucmVsYXRpdmU/by1yOjIqby1yKSxhLnR5cGUmXy5DVVJWRV9UTz8odD1hLnJlbGF0aXZlP24rYS54MjphLngyLHI9YS5yZWxhdGl2ZT9vK2EueTI6YS55Mik6KHQ9TmFOLHI9TmFOKSxhLnR5cGUmXy5TTU9PVEhfUVVBRF9UTyYmKGEudHlwZT1fLlFVQURfVE8sZT1pc05hTihlKT9uOmUsaT1pc05hTihpKT9vOmksYS54MT1hLnJlbGF0aXZlP24tZToyKm4tZSxhLnkxPWEucmVsYXRpdmU/by1pOjIqby1pKSxhLnR5cGUmXy5RVUFEX1RPPyhlPWEucmVsYXRpdmU/bithLngxOmEueDEsaT1hLnJlbGF0aXZlP28rYS55MTphLnkxKTooZT1OYU4saT1OYU4pLGF9KSl9ZnVuY3Rpb24gbigpe3ZhciB0PU5hTixyPU5hTjtyZXR1cm4gdSgoZnVuY3Rpb24oZSxpLGEpe2lmKGUudHlwZSZfLlNNT09USF9RVUFEX1RPJiYoZS50eXBlPV8uUVVBRF9UTyx0PWlzTmFOKHQpP2k6dCxyPWlzTmFOKHIpP2E6cixlLngxPWUucmVsYXRpdmU/aS10OjIqaS10LGUueTE9ZS5yZWxhdGl2ZT9hLXI6MiphLXIpLGUudHlwZSZfLlFVQURfVE8pe3Q9ZS5yZWxhdGl2ZT9pK2UueDE6ZS54MSxyPWUucmVsYXRpdmU/YStlLnkxOmUueTE7dmFyIG49ZS54MSxvPWUueTE7ZS50eXBlPV8uQ1VSVkVfVE8sZS54MT0oKGUucmVsYXRpdmU/MDppKSsyKm4pLzMsZS55MT0oKGUucmVsYXRpdmU/MDphKSsyKm8pLzMsZS54Mj0oZS54KzIqbikvMyxlLnkyPShlLnkrMipvKS8zfWVsc2UgdD1OYU4scj1OYU47cmV0dXJuIGV9KSl9ZnVuY3Rpb24gdSh0KXt2YXIgcj0wLGU9MCxpPU5hTixhPU5hTjtyZXR1cm4gZnVuY3Rpb24obil7aWYoaXNOYU4oaSkmJiEobi50eXBlJl8uTU9WRV9UTykpdGhyb3cgbmV3IEVycm9yKFwicGF0aCBtdXN0IHN0YXJ0IHdpdGggbW92ZXRvXCIpO3ZhciBvPXQobixyLGUsaSxhKTtyZXR1cm4gbi50eXBlJl8uQ0xPU0VfUEFUSCYmKHI9aSxlPWEpLHZvaWQgMCE9PW4ueCYmKHI9bi5yZWxhdGl2ZT9yK24ueDpuLngpLHZvaWQgMCE9PW4ueSYmKGU9bi5yZWxhdGl2ZT9lK24ueTpuLnkpLG4udHlwZSZfLk1PVkVfVE8mJihpPXIsYT1lKSxvfX1mdW5jdGlvbiBPKHQscixlLGksbixvKXtyZXR1cm4gYSh0LHIsZSxpLG4sbyksdSgoZnVuY3Rpb24oYSxzLHUsaCl7dmFyIGM9YS54MSx5PWEueDIscD1hLnJlbGF0aXZlJiYhaXNOYU4oaCksbT12b2lkIDAhPT1hLng/YS54OnA/MDpzLE89dm9pZCAwIT09YS55P2EueTpwPzA6dTtmdW5jdGlvbiBsKHQpe3JldHVybiB0KnR9YS50eXBlJl8uSE9SSVpfTElORV9UTyYmMCE9PXImJihhLnR5cGU9Xy5MSU5FX1RPLGEueT1hLnJlbGF0aXZlPzA6dSksYS50eXBlJl8uVkVSVF9MSU5FX1RPJiYwIT09ZSYmKGEudHlwZT1fLkxJTkVfVE8sYS54PWEucmVsYXRpdmU/MDpzKSx2b2lkIDAhPT1hLngmJihhLng9YS54KnQrTyplKyhwPzA6bikpLHZvaWQgMCE9PWEueSYmKGEueT1tKnIrYS55KmkrKHA/MDpvKSksdm9pZCAwIT09YS54MSYmKGEueDE9YS54MSp0K2EueTEqZSsocD8wOm4pKSx2b2lkIDAhPT1hLnkxJiYoYS55MT1jKnIrYS55MSppKyhwPzA6bykpLHZvaWQgMCE9PWEueDImJihhLngyPWEueDIqdCthLnkyKmUrKHA/MDpuKSksdm9pZCAwIT09YS55MiYmKGEueTI9eSpyK2EueTIqaSsocD8wOm8pKTt2YXIgVD10KmktciplO2lmKHZvaWQgMCE9PWEueFJvdCYmKDEhPT10fHwwIT09cnx8MCE9PWV8fDEhPT1pKSlpZigwPT09VClkZWxldGUgYS5yWCxkZWxldGUgYS5yWSxkZWxldGUgYS54Um90LGRlbGV0ZSBhLmxBcmNGbGFnLGRlbGV0ZSBhLnN3ZWVwRmxhZyxhLnR5cGU9Xy5MSU5FX1RPO2Vsc2V7dmFyIHY9YS54Um90Kk1hdGguUEkvMTgwLGY9TWF0aC5zaW4odiksTj1NYXRoLmNvcyh2KSx4PTEvbChhLnJYKSxkPTEvbChhLnJZKSxFPWwoTikqeCtsKGYpKmQsQT0yKmYqTiooeC1kKSxDPWwoZikqeCtsKE4pKmQsTT1FKmkqaS1BKnIqaStDKnIqcixSPUEqKHQqaStyKmUpLTIqKEUqZSppK0MqdCpyKSxnPUUqZSplLUEqdCplK0MqdCp0LEk9KE1hdGguYXRhbjIoUixNLWcpK01hdGguUEkpJU1hdGguUEkvMixTPU1hdGguc2luKEkpLEw9TWF0aC5jb3MoSSk7YS5yWD1NYXRoLmFicyhUKS9NYXRoLnNxcnQoTSpsKEwpK1IqUypMK2cqbChTKSksYS5yWT1NYXRoLmFicyhUKS9NYXRoLnNxcnQoTSpsKFMpLVIqUypMK2cqbChMKSksYS54Um90PTE4MCpJL01hdGguUEl9cmV0dXJuIHZvaWQgMCE9PWEuc3dlZXBGbGFnJiYwPlQmJihhLnN3ZWVwRmxhZz0rIWEuc3dlZXBGbGFnKSxhfSkpfWZ1bmN0aW9uIGwoKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9e307Zm9yKHZhciBlIGluIHQpcltlXT10W2VdO3JldHVybiByfX10LlJPVU5EPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIocil7cmV0dXJuIE1hdGgucm91bmQocip0KS90fXJldHVybiB2b2lkIDA9PT10JiYodD0xZTEzKSxhKHQpLGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LngxJiYodC54MT1yKHQueDEpKSx2b2lkIDAhPT10LnkxJiYodC55MT1yKHQueTEpKSx2b2lkIDAhPT10LngyJiYodC54Mj1yKHQueDIpKSx2b2lkIDAhPT10LnkyJiYodC55Mj1yKHQueTIpKSx2b2lkIDAhPT10LngmJih0Lng9cih0LngpKSx2b2lkIDAhPT10LnkmJih0Lnk9cih0LnkpKSx2b2lkIDAhPT10LnJYJiYodC5yWD1yKHQuclgpKSx2b2lkIDAhPT10LnJZJiYodC5yWT1yKHQuclkpKSx0fX0sdC5UT19BQlM9cix0LlRPX1JFTD1mdW5jdGlvbigpe3JldHVybiB1KChmdW5jdGlvbih0LHIsZSl7cmV0dXJuIHQucmVsYXRpdmV8fCh2b2lkIDAhPT10LngxJiYodC54MS09ciksdm9pZCAwIT09dC55MSYmKHQueTEtPWUpLHZvaWQgMCE9PXQueDImJih0LngyLT1yKSx2b2lkIDAhPT10LnkyJiYodC55Mi09ZSksdm9pZCAwIT09dC54JiYodC54LT1yKSx2b2lkIDAhPT10LnkmJih0LnktPWUpLHQucmVsYXRpdmU9ITApLHR9KSl9LHQuTk9STUFMSVpFX0hWWj1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSEwKSx2b2lkIDA9PT1yJiYocj0hMCksdm9pZCAwPT09ZSYmKGU9ITApLHUoKGZ1bmN0aW9uKGksYSxuLG8scyl7aWYoaXNOYU4obykmJiEoaS50eXBlJl8uTU9WRV9UTykpdGhyb3cgbmV3IEVycm9yKFwicGF0aCBtdXN0IHN0YXJ0IHdpdGggbW92ZXRvXCIpO3JldHVybiByJiZpLnR5cGUmXy5IT1JJWl9MSU5FX1RPJiYoaS50eXBlPV8uTElORV9UTyxpLnk9aS5yZWxhdGl2ZT8wOm4pLGUmJmkudHlwZSZfLlZFUlRfTElORV9UTyYmKGkudHlwZT1fLkxJTkVfVE8saS54PWkucmVsYXRpdmU/MDphKSx0JiZpLnR5cGUmXy5DTE9TRV9QQVRIJiYoaS50eXBlPV8uTElORV9UTyxpLng9aS5yZWxhdGl2ZT9vLWE6byxpLnk9aS5yZWxhdGl2ZT9zLW46cyksaS50eXBlJl8uQVJDJiYoMD09PWkuclh8fDA9PT1pLnJZKSYmKGkudHlwZT1fLkxJTkVfVE8sZGVsZXRlIGkuclgsZGVsZXRlIGkuclksZGVsZXRlIGkueFJvdCxkZWxldGUgaS5sQXJjRmxhZyxkZWxldGUgaS5zd2VlcEZsYWcpLGl9KSl9LHQuTk9STUFMSVpFX1NUPWUsdC5RVF9UT19DPW4sdC5JTkZPPXUsdC5TQU5JVElaRT1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0wKSxhKHQpO3ZhciByPU5hTixlPU5hTixpPU5hTixuPU5hTjtyZXR1cm4gdSgoZnVuY3Rpb24oYSxvLHMsdSxoKXt2YXIgYz1NYXRoLmFicyx5PSExLHA9MCxtPTA7aWYoYS50eXBlJl8uU01PT1RIX0NVUlZFX1RPJiYocD1pc05hTihyKT8wOm8tcixtPWlzTmFOKGUpPzA6cy1lKSxhLnR5cGUmKF8uQ1VSVkVfVE98Xy5TTU9PVEhfQ1VSVkVfVE8pPyhyPWEucmVsYXRpdmU/bythLngyOmEueDIsZT1hLnJlbGF0aXZlP3MrYS55MjphLnkyKToocj1OYU4sZT1OYU4pLGEudHlwZSZfLlNNT09USF9RVUFEX1RPPyhpPWlzTmFOKGkpP286MipvLWksbj1pc05hTihuKT9zOjIqcy1uKTphLnR5cGUmXy5RVUFEX1RPPyhpPWEucmVsYXRpdmU/bythLngxOmEueDEsbj1hLnJlbGF0aXZlP3MrYS55MTphLnkyKTooaT1OYU4sbj1OYU4pLGEudHlwZSZfLkxJTkVfQ09NTUFORFN8fGEudHlwZSZfLkFSQyYmKDA9PT1hLnJYfHwwPT09YS5yWXx8IWEubEFyY0ZsYWcpfHxhLnR5cGUmXy5DVVJWRV9UT3x8YS50eXBlJl8uU01PT1RIX0NVUlZFX1RPfHxhLnR5cGUmXy5RVUFEX1RPfHxhLnR5cGUmXy5TTU9PVEhfUVVBRF9UTyl7dmFyIE89dm9pZCAwPT09YS54PzA6YS5yZWxhdGl2ZT9hLng6YS54LW8sbD12b2lkIDA9PT1hLnk/MDphLnJlbGF0aXZlP2EueTphLnktcztwPWlzTmFOKGkpP3ZvaWQgMD09PWEueDE/cDphLnJlbGF0aXZlP2EueDphLngxLW86aS1vLG09aXNOYU4obik/dm9pZCAwPT09YS55MT9tOmEucmVsYXRpdmU/YS55OmEueTEtczpuLXM7dmFyIFQ9dm9pZCAwPT09YS54Mj8wOmEucmVsYXRpdmU/YS54OmEueDItbyx2PXZvaWQgMD09PWEueTI/MDphLnJlbGF0aXZlP2EueTphLnkyLXM7YyhPKTw9dCYmYyhsKTw9dCYmYyhwKTw9dCYmYyhtKTw9dCYmYyhUKTw9dCYmYyh2KTw9dCYmKHk9ITApfXJldHVybiBhLnR5cGUmXy5DTE9TRV9QQVRIJiZjKG8tdSk8PXQmJmMocy1oKTw9dCYmKHk9ITApLHk/W106YX0pKX0sdC5NQVRSSVg9Tyx0LlJPVEFURT1mdW5jdGlvbih0LHIsZSl7dm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09ZSYmKGU9MCksYSh0LHIsZSk7dmFyIGk9TWF0aC5zaW4odCksbj1NYXRoLmNvcyh0KTtyZXR1cm4gTyhuLGksLWksbixyLXIqbitlKmksZS1yKmktZSpuKX0sdC5UUkFOU0xBVEU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9MCksYSh0LHIpLE8oMSwwLDAsMSx0LHIpfSx0LlNDQUxFPWZ1bmN0aW9uKHQscil7cmV0dXJuIHZvaWQgMD09PXImJihyPXQpLGEodCxyKSxPKHQsMCwwLHIsMCwwKX0sdC5TS0VXX1g9ZnVuY3Rpb24odCl7cmV0dXJuIGEodCksTygxLDAsTWF0aC5hdGFuKHQpLDEsMCwwKX0sdC5TS0VXX1k9ZnVuY3Rpb24odCl7cmV0dXJuIGEodCksTygxLE1hdGguYXRhbih0KSwwLDEsMCwwKX0sdC5YX0FYSVNfU1lNTUVUUlk9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PTApLGEodCksTygtMSwwLDAsMSx0LDApfSx0LllfQVhJU19TWU1NRVRSWT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MCksYSh0KSxPKDEsMCwwLC0xLDAsdCl9LHQuQV9UT19DPWZ1bmN0aW9uKCl7cmV0dXJuIHUoKGZ1bmN0aW9uKHQscixlKXtyZXR1cm4gXy5BUkM9PT10LnR5cGU/ZnVuY3Rpb24odCxyLGUpe3ZhciBhLG4scyx1O3QuY1h8fG8odCxyLGUpO2Zvcih2YXIgeT1NYXRoLm1pbih0LnBoaTEsdC5waGkyKSxwPU1hdGgubWF4KHQucGhpMSx0LnBoaTIpLXksbT1NYXRoLmNlaWwocC85MCksTz1uZXcgQXJyYXkobSksbD1yLFQ9ZSx2PTA7djxtO3YrKyl7dmFyIGY9Yyh0LnBoaTEsdC5waGkyLHYvbSksTj1jKHQucGhpMSx0LnBoaTIsKHYrMSkvbSkseD1OLWYsZD00LzMqTWF0aC50YW4oeCpoLzQpLEU9W01hdGguY29zKGYqaCktZCpNYXRoLnNpbihmKmgpLE1hdGguc2luKGYqaCkrZCpNYXRoLmNvcyhmKmgpXSxBPUVbMF0sQz1FWzFdLE09W01hdGguY29zKE4qaCksTWF0aC5zaW4oTipoKV0sUj1NWzBdLGc9TVsxXSxJPVtSK2QqTWF0aC5zaW4oTipoKSxnLWQqTWF0aC5jb3MoTipoKV0sUz1JWzBdLEw9SVsxXTtPW3ZdPXtyZWxhdGl2ZTp0LnJlbGF0aXZlLHR5cGU6Xy5DVVJWRV9UT307dmFyIEg9ZnVuY3Rpb24ocixlKXt2YXIgYT1pKFtyKnQuclgsZSp0LnJZXSx0LnhSb3QpLG49YVswXSxvPWFbMV07cmV0dXJuW3QuY1grbix0LmNZK29dfTthPUgoQSxDKSxPW3ZdLngxPWFbMF0sT1t2XS55MT1hWzFdLG49SChTLEwpLE9bdl0ueDI9blswXSxPW3ZdLnkyPW5bMV0scz1IKFIsZyksT1t2XS54PXNbMF0sT1t2XS55PXNbMV0sdC5yZWxhdGl2ZSYmKE9bdl0ueDEtPWwsT1t2XS55MS09VCxPW3ZdLngyLT1sLE9bdl0ueTItPVQsT1t2XS54LT1sLE9bdl0ueS09VCksbD0odT1bT1t2XS54LE9bdl0ueV0pWzBdLFQ9dVsxXX1yZXR1cm4gT30odCx0LnJlbGF0aXZlPzA6cix0LnJlbGF0aXZlPzA6ZSk6dH0pKX0sdC5BTk5PVEFURV9BUkNTPWZ1bmN0aW9uKCl7cmV0dXJuIHUoKGZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdC5yZWxhdGl2ZSYmKHI9MCxlPTApLF8uQVJDPT09dC50eXBlJiZvKHQscixlKSx0fSkpfSx0LkNMT05FPWwsdC5DQUxDVUxBVEVfQk9VTkRTPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24odCl7dmFyIHI9e307Zm9yKHZhciBlIGluIHQpcltlXT10W2VdO3JldHVybiByfSxpPXIoKSxhPW4oKSxoPWUoKSxjPXUoKGZ1bmN0aW9uKHIsZSxuKXt2YXIgdT1oKGEoaSh0KHIpKSkpO2Z1bmN0aW9uIE8odCl7dD5jLm1heFgmJihjLm1heFg9dCksdDxjLm1pblgmJihjLm1pblg9dCl9ZnVuY3Rpb24gbCh0KXt0PmMubWF4WSYmKGMubWF4WT10KSx0PGMubWluWSYmKGMubWluWT10KX1pZih1LnR5cGUmXy5EUkFXSU5HX0NPTU1BTkRTJiYoTyhlKSxsKG4pKSx1LnR5cGUmXy5IT1JJWl9MSU5FX1RPJiZPKHUueCksdS50eXBlJl8uVkVSVF9MSU5FX1RPJiZsKHUueSksdS50eXBlJl8uTElORV9UTyYmKE8odS54KSxsKHUueSkpLHUudHlwZSZfLkNVUlZFX1RPKXtPKHUueCksbCh1LnkpO2Zvcih2YXIgVD0wLHY9cChlLHUueDEsdS54Mix1LngpO1Q8di5sZW5ndGg7VCsrKXswPCh3PXZbVF0pJiYxPncmJk8obShlLHUueDEsdS54Mix1LngsdykpfWZvcih2YXIgZj0wLE49cChuLHUueTEsdS55Mix1LnkpO2Y8Ti5sZW5ndGg7ZisrKXswPCh3PU5bZl0pJiYxPncmJmwobShuLHUueTEsdS55Mix1LnksdykpfX1pZih1LnR5cGUmXy5BUkMpe08odS54KSxsKHUueSksbyh1LGUsbik7Zm9yKHZhciB4PXUueFJvdC8xODAqTWF0aC5QSSxkPU1hdGguY29zKHgpKnUuclgsRT1NYXRoLnNpbih4KSp1LnJYLEE9LU1hdGguc2luKHgpKnUuclksQz1NYXRoLmNvcyh4KSp1LnJZLE09dS5waGkxPHUucGhpMj9bdS5waGkxLHUucGhpMl06LTE4MD51LnBoaTI/W3UucGhpMiszNjAsdS5waGkxKzM2MF06W3UucGhpMix1LnBoaTFdLFI9TVswXSxnPU1bMV0sST1mdW5jdGlvbih0KXt2YXIgcj10WzBdLGU9dFsxXSxpPTE4MCpNYXRoLmF0YW4yKGUscikvTWF0aC5QSTtyZXR1cm4gaTxSP2krMzYwOml9LFM9MCxMPXMoQSwtZCwwKS5tYXAoSSk7UzxMLmxlbmd0aDtTKyspeyh3PUxbU10pPlImJnc8ZyYmTyh5KHUuY1gsZCxBLHcpKX1mb3IodmFyIEg9MCxVPXMoQywtRSwwKS5tYXAoSSk7SDxVLmxlbmd0aDtIKyspe3ZhciB3Oyh3PVVbSF0pPlImJnc8ZyYmbCh5KHUuY1ksRSxDLHcpKX19cmV0dXJuIHJ9KSk7cmV0dXJuIGMubWluWD0xLzAsYy5tYXhYPS0xLzAsYy5taW5ZPTEvMCxjLm1heFk9LTEvMCxjfX0odXx8KHU9e30pKTt2YXIgTyxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHUuUk9VTkQodCkpfSx0LnByb3RvdHlwZS50b0Ficz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybSh1LlRPX0FCUygpKX0sdC5wcm90b3R5cGUudG9SZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5UT19SRUwoKSl9LHQucHJvdG90eXBlLm5vcm1hbGl6ZUhWWj1mdW5jdGlvbih0LHIsZSl7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHUuTk9STUFMSVpFX0hWWih0LHIsZSkpfSx0LnByb3RvdHlwZS5ub3JtYWxpemVTVD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybSh1Lk5PUk1BTElaRV9TVCgpKX0sdC5wcm90b3R5cGUucXRUb0M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5RVF9UT19DKCkpfSx0LnByb3RvdHlwZS5hVG9DPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHUuQV9UT19DKCkpfSx0LnByb3RvdHlwZS5zYW5pdGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5TQU5JVElaRSh0KSl9LHQucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLnRyYW5zZm9ybSh1LlRSQU5TTEFURSh0LHIpKX0sdC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5TQ0FMRSh0LHIpKX0sdC5wcm90b3R5cGUucm90YXRlPWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5ST1RBVEUodCxyLGUpKX0sdC5wcm90b3R5cGUubWF0cml4PWZ1bmN0aW9uKHQscixlLGksYSxuKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5NQVRSSVgodCxyLGUsaSxhLG4pKX0sdC5wcm90b3R5cGUuc2tld1g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHUuU0tFV19YKHQpKX0sdC5wcm90b3R5cGUuc2tld1k9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHUuU0tFV19ZKHQpKX0sdC5wcm90b3R5cGUueFN5bW1ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRyYW5zZm9ybSh1LlhfQVhJU19TWU1NRVRSWSh0KSl9LHQucHJvdG90eXBlLnlTeW1tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5ZX0FYSVNfU1lNTUVUUlkodCkpfSx0LnByb3RvdHlwZS5hbm5vdGF0ZUFyY3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odS5BTk5PVEFURV9BUkNTKCkpfSx0fSgpLFQ9ZnVuY3Rpb24odCl7cmV0dXJuXCIgXCI9PT10fHxcIlxcdFwiPT09dHx8XCJcXHJcIj09PXR8fFwiXFxuXCI9PT10fSx2PWZ1bmN0aW9uKHQpe3JldHVyblwiMFwiLmNoYXJDb2RlQXQoMCk8PXQuY2hhckNvZGVBdCgwKSYmdC5jaGFyQ29kZUF0KDApPD1cIjlcIi5jaGFyQ29kZUF0KDApfSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIuY3VyTnVtYmVyPVwiXCIsci5jdXJDb21tYW5kVHlwZT0tMSxyLmN1ckNvbW1hbmRSZWxhdGl2ZT0hMSxyLmNhblBhcnNlQ29tbWFuZE9yQ29tbWE9ITAsci5jdXJOdW1iZXJIYXNFeHA9ITEsci5jdXJOdW1iZXJIYXNFeHBEaWdpdHM9ITEsci5jdXJOdW1iZXJIYXNEZWNpbWFsPSExLHIuY3VyQXJncz1bXSxyfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PVtdKSx0aGlzLnBhcnNlKFwiIFwiLHQpLDAhPT10aGlzLmN1ckFyZ3MubGVuZ3RofHwhdGhpcy5jYW5QYXJzZUNvbW1hbmRPckNvbW1hKXRocm93IG5ldyBTeW50YXhFcnJvcihcIlVudGVybWluYXRlZCBjb21tYW5kIGF0IHRoZSBwYXRoIGVuZC5cIik7cmV0dXJuIHR9LGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQscil7dmFyIGU9dGhpczt2b2lkIDA9PT1yJiYocj1bXSk7Zm9yKHZhciBpPWZ1bmN0aW9uKHQpe3IucHVzaCh0KSxlLmN1ckFyZ3MubGVuZ3RoPTAsZS5jYW5QYXJzZUNvbW1hbmRPckNvbW1hPSEwfSxhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBuPXRbYV0sbz0hKHRoaXMuY3VyQ29tbWFuZFR5cGUhPT1fLkFSQ3x8MyE9PXRoaXMuY3VyQXJncy5sZW5ndGgmJjQhPT10aGlzLmN1ckFyZ3MubGVuZ3RofHwxIT09dGhpcy5jdXJOdW1iZXIubGVuZ3RofHxcIjBcIiE9PXRoaXMuY3VyTnVtYmVyJiZcIjFcIiE9PXRoaXMuY3VyTnVtYmVyKSxzPXYobikmJihcIjBcIj09PXRoaXMuY3VyTnVtYmVyJiZcIjBcIj09PW58fG8pO2lmKCF2KG4pfHxzKWlmKFwiZVwiIT09biYmXCJFXCIhPT1uKWlmKFwiLVwiIT09biYmXCIrXCIhPT1ufHwhdGhpcy5jdXJOdW1iZXJIYXNFeHB8fHRoaXMuY3VyTnVtYmVySGFzRXhwRGlnaXRzKWlmKFwiLlwiIT09bnx8dGhpcy5jdXJOdW1iZXJIYXNFeHB8fHRoaXMuY3VyTnVtYmVySGFzRGVjaW1hbHx8byl7aWYodGhpcy5jdXJOdW1iZXImJi0xIT09dGhpcy5jdXJDb21tYW5kVHlwZSl7dmFyIHU9TnVtYmVyKHRoaXMuY3VyTnVtYmVyKTtpZihpc05hTih1KSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJJbnZhbGlkIG51bWJlciBlbmRpbmcgYXQgXCIrYSk7aWYodGhpcy5jdXJDb21tYW5kVHlwZT09PV8uQVJDKWlmKDA9PT10aGlzLmN1ckFyZ3MubGVuZ3RofHwxPT09dGhpcy5jdXJBcmdzLmxlbmd0aCl7aWYoMD51KXRocm93IG5ldyBTeW50YXhFcnJvcignRXhwZWN0ZWQgcG9zaXRpdmUgbnVtYmVyLCBnb3QgXCInK3UrJ1wiIGF0IGluZGV4IFwiJythKydcIicpfWVsc2UgaWYoKDM9PT10aGlzLmN1ckFyZ3MubGVuZ3RofHw0PT09dGhpcy5jdXJBcmdzLmxlbmd0aCkmJlwiMFwiIT09dGhpcy5jdXJOdW1iZXImJlwiMVwiIT09dGhpcy5jdXJOdW1iZXIpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdFeHBlY3RlZCBhIGZsYWcsIGdvdCBcIicrdGhpcy5jdXJOdW1iZXIrJ1wiIGF0IGluZGV4IFwiJythKydcIicpO3RoaXMuY3VyQXJncy5wdXNoKHUpLHRoaXMuY3VyQXJncy5sZW5ndGg9PT1OW3RoaXMuY3VyQ29tbWFuZFR5cGVdJiYoXy5IT1JJWl9MSU5FX1RPPT09dGhpcy5jdXJDb21tYW5kVHlwZT9pKHt0eXBlOl8uSE9SSVpfTElORV9UTyxyZWxhdGl2ZTp0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZSx4OnV9KTpfLlZFUlRfTElORV9UTz09PXRoaXMuY3VyQ29tbWFuZFR5cGU/aSh7dHlwZTpfLlZFUlRfTElORV9UTyxyZWxhdGl2ZTp0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZSx5OnV9KTp0aGlzLmN1ckNvbW1hbmRUeXBlPT09Xy5NT1ZFX1RPfHx0aGlzLmN1ckNvbW1hbmRUeXBlPT09Xy5MSU5FX1RPfHx0aGlzLmN1ckNvbW1hbmRUeXBlPT09Xy5TTU9PVEhfUVVBRF9UTz8oaSh7dHlwZTp0aGlzLmN1ckNvbW1hbmRUeXBlLHJlbGF0aXZlOnRoaXMuY3VyQ29tbWFuZFJlbGF0aXZlLHg6dGhpcy5jdXJBcmdzWzBdLHk6dGhpcy5jdXJBcmdzWzFdfSksXy5NT1ZFX1RPPT09dGhpcy5jdXJDb21tYW5kVHlwZSYmKHRoaXMuY3VyQ29tbWFuZFR5cGU9Xy5MSU5FX1RPKSk6dGhpcy5jdXJDb21tYW5kVHlwZT09PV8uQ1VSVkVfVE8/aSh7dHlwZTpfLkNVUlZFX1RPLHJlbGF0aXZlOnRoaXMuY3VyQ29tbWFuZFJlbGF0aXZlLHgxOnRoaXMuY3VyQXJnc1swXSx5MTp0aGlzLmN1ckFyZ3NbMV0seDI6dGhpcy5jdXJBcmdzWzJdLHkyOnRoaXMuY3VyQXJnc1szXSx4OnRoaXMuY3VyQXJnc1s0XSx5OnRoaXMuY3VyQXJnc1s1XX0pOnRoaXMuY3VyQ29tbWFuZFR5cGU9PT1fLlNNT09USF9DVVJWRV9UTz9pKHt0eXBlOl8uU01PT1RIX0NVUlZFX1RPLHJlbGF0aXZlOnRoaXMuY3VyQ29tbWFuZFJlbGF0aXZlLHgyOnRoaXMuY3VyQXJnc1swXSx5Mjp0aGlzLmN1ckFyZ3NbMV0seDp0aGlzLmN1ckFyZ3NbMl0seTp0aGlzLmN1ckFyZ3NbM119KTp0aGlzLmN1ckNvbW1hbmRUeXBlPT09Xy5RVUFEX1RPP2koe3R5cGU6Xy5RVUFEX1RPLHJlbGF0aXZlOnRoaXMuY3VyQ29tbWFuZFJlbGF0aXZlLHgxOnRoaXMuY3VyQXJnc1swXSx5MTp0aGlzLmN1ckFyZ3NbMV0seDp0aGlzLmN1ckFyZ3NbMl0seTp0aGlzLmN1ckFyZ3NbM119KTp0aGlzLmN1ckNvbW1hbmRUeXBlPT09Xy5BUkMmJmkoe3R5cGU6Xy5BUkMscmVsYXRpdmU6dGhpcy5jdXJDb21tYW5kUmVsYXRpdmUsclg6dGhpcy5jdXJBcmdzWzBdLHJZOnRoaXMuY3VyQXJnc1sxXSx4Um90OnRoaXMuY3VyQXJnc1syXSxsQXJjRmxhZzp0aGlzLmN1ckFyZ3NbM10sc3dlZXBGbGFnOnRoaXMuY3VyQXJnc1s0XSx4OnRoaXMuY3VyQXJnc1s1XSx5OnRoaXMuY3VyQXJnc1s2XX0pKSx0aGlzLmN1ck51bWJlcj1cIlwiLHRoaXMuY3VyTnVtYmVySGFzRXhwRGlnaXRzPSExLHRoaXMuY3VyTnVtYmVySGFzRXhwPSExLHRoaXMuY3VyTnVtYmVySGFzRGVjaW1hbD0hMSx0aGlzLmNhblBhcnNlQ29tbWFuZE9yQ29tbWE9ITB9aWYoIVQobikpaWYoXCIsXCI9PT1uJiZ0aGlzLmNhblBhcnNlQ29tbWFuZE9yQ29tbWEpdGhpcy5jYW5QYXJzZUNvbW1hbmRPckNvbW1hPSExO2Vsc2UgaWYoXCIrXCIhPT1uJiZcIi1cIiE9PW4mJlwiLlwiIT09bilpZihzKXRoaXMuY3VyTnVtYmVyPW4sdGhpcy5jdXJOdW1iZXJIYXNEZWNpbWFsPSExO2Vsc2V7aWYoMCE9PXRoaXMuY3VyQXJncy5sZW5ndGgpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiVW50ZXJtaW5hdGVkIGNvbW1hbmQgYXQgaW5kZXggXCIrYStcIi5cIik7aWYoIXRoaXMuY2FuUGFyc2VDb21tYW5kT3JDb21tYSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyIFwiJytuKydcIiBhdCBpbmRleCAnK2ErXCIuIENvbW1hbmQgY2Fubm90IGZvbGxvdyBjb21tYVwiKTtpZih0aGlzLmNhblBhcnNlQ29tbWFuZE9yQ29tbWE9ITEsXCJ6XCIhPT1uJiZcIlpcIiE9PW4paWYoXCJoXCI9PT1ufHxcIkhcIj09PW4pdGhpcy5jdXJDb21tYW5kVHlwZT1fLkhPUklaX0xJTkVfVE8sdGhpcy5jdXJDb21tYW5kUmVsYXRpdmU9XCJoXCI9PT1uO2Vsc2UgaWYoXCJ2XCI9PT1ufHxcIlZcIj09PW4pdGhpcy5jdXJDb21tYW5kVHlwZT1fLlZFUlRfTElORV9UTyx0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZT1cInZcIj09PW47ZWxzZSBpZihcIm1cIj09PW58fFwiTVwiPT09bil0aGlzLmN1ckNvbW1hbmRUeXBlPV8uTU9WRV9UTyx0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZT1cIm1cIj09PW47ZWxzZSBpZihcImxcIj09PW58fFwiTFwiPT09bil0aGlzLmN1ckNvbW1hbmRUeXBlPV8uTElORV9UTyx0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZT1cImxcIj09PW47ZWxzZSBpZihcImNcIj09PW58fFwiQ1wiPT09bil0aGlzLmN1ckNvbW1hbmRUeXBlPV8uQ1VSVkVfVE8sdGhpcy5jdXJDb21tYW5kUmVsYXRpdmU9XCJjXCI9PT1uO2Vsc2UgaWYoXCJzXCI9PT1ufHxcIlNcIj09PW4pdGhpcy5jdXJDb21tYW5kVHlwZT1fLlNNT09USF9DVVJWRV9UTyx0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZT1cInNcIj09PW47ZWxzZSBpZihcInFcIj09PW58fFwiUVwiPT09bil0aGlzLmN1ckNvbW1hbmRUeXBlPV8uUVVBRF9UTyx0aGlzLmN1ckNvbW1hbmRSZWxhdGl2ZT1cInFcIj09PW47ZWxzZSBpZihcInRcIj09PW58fFwiVFwiPT09bil0aGlzLmN1ckNvbW1hbmRUeXBlPV8uU01PT1RIX1FVQURfVE8sdGhpcy5jdXJDb21tYW5kUmVsYXRpdmU9XCJ0XCI9PT1uO2Vsc2V7aWYoXCJhXCIhPT1uJiZcIkFcIiE9PW4pdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlciBcIicrbisnXCIgYXQgaW5kZXggJythK1wiLlwiKTt0aGlzLmN1ckNvbW1hbmRUeXBlPV8uQVJDLHRoaXMuY3VyQ29tbWFuZFJlbGF0aXZlPVwiYVwiPT09bn1lbHNlIHIucHVzaCh7dHlwZTpfLkNMT1NFX1BBVEh9KSx0aGlzLmNhblBhcnNlQ29tbWFuZE9yQ29tbWE9ITAsdGhpcy5jdXJDb21tYW5kVHlwZT0tMX1lbHNlIHRoaXMuY3VyTnVtYmVyPW4sdGhpcy5jdXJOdW1iZXJIYXNEZWNpbWFsPVwiLlwiPT09bn1lbHNlIHRoaXMuY3VyTnVtYmVyKz1uLHRoaXMuY3VyTnVtYmVySGFzRGVjaW1hbD0hMDtlbHNlIHRoaXMuY3VyTnVtYmVyKz1uO2Vsc2UgdGhpcy5jdXJOdW1iZXIrPW4sdGhpcy5jdXJOdW1iZXJIYXNFeHA9ITA7ZWxzZSB0aGlzLmN1ck51bWJlcis9bix0aGlzLmN1ck51bWJlckhhc0V4cERpZ2l0cz10aGlzLmN1ck51bWJlckhhc0V4cH1yZXR1cm4gcn0sZS5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMse3BhcnNlOnt2YWx1ZTpmdW5jdGlvbihyLGUpe3ZvaWQgMD09PWUmJihlPVtdKTtmb3IodmFyIGk9MCxhPU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5wYXJzZS5jYWxsKHRoaXMscik7aTxhLmxlbmd0aDtpKyspe3ZhciBuPWFbaV0sbz10KG4pO0FycmF5LmlzQXJyYXkobyk/ZS5wdXNoLmFwcGx5KGUsbyk6ZS5wdXNoKG8pfXJldHVybiBlfX19KX0sZX0obCksXz1mdW5jdGlvbih0KXtmdW5jdGlvbiBpKHIpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5jb21tYW5kcz1cInN0cmluZ1wiPT10eXBlb2Ygcj9pLnBhcnNlKHIpOnIsZX1yZXR1cm4gcihpLHQpLGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe3JldHVybiBpLmVuY29kZSh0aGlzLmNvbW1hbmRzKX0saS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7dmFyIHQ9dS5DQUxDVUxBVEVfQk9VTkRTKCk7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHQpLHR9LGkucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtmb3IodmFyIHI9W10sZT0wLGk9dGhpcy5jb21tYW5kcztlPGkubGVuZ3RoO2UrKyl7dmFyIGE9dChpW2VdKTtBcnJheS5pc0FycmF5KGEpP3IucHVzaC5hcHBseShyLGEpOnIucHVzaChhKX1yZXR1cm4gdGhpcy5jb21tYW5kcz1yLHRoaXN9LGkuZW5jb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSxpLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciByPW5ldyBmLGU9W107cmV0dXJuIHIucGFyc2UodCxlKSxyLmZpbmlzaChlKSxlfSxpLkNMT1NFX1BBVEg9MSxpLk1PVkVfVE89MixpLkhPUklaX0xJTkVfVE89NCxpLlZFUlRfTElORV9UTz04LGkuTElORV9UTz0xNixpLkNVUlZFX1RPPTMyLGkuU01PT1RIX0NVUlZFX1RPPTY0LGkuUVVBRF9UTz0xMjgsaS5TTU9PVEhfUVVBRF9UTz0yNTYsaS5BUkM9NTEyLGkuTElORV9DT01NQU5EUz1pLkxJTkVfVE98aS5IT1JJWl9MSU5FX1RPfGkuVkVSVF9MSU5FX1RPLGkuRFJBV0lOR19DT01NQU5EUz1pLkhPUklaX0xJTkVfVE98aS5WRVJUX0xJTkVfVE98aS5MSU5FX1RPfGkuQ1VSVkVfVE98aS5TTU9PVEhfQ1VSVkVfVE98aS5RVUFEX1RPfGkuU01PT1RIX1FVQURfVE98aS5BUkMsaX0obCksTj0oKE89e30pW18uTU9WRV9UT109MixPW18uTElORV9UT109MixPW18uSE9SSVpfTElORV9UT109MSxPW18uVkVSVF9MSU5FX1RPXT0xLE9bXy5DTE9TRV9QQVRIXT0wLE9bXy5RVUFEX1RPXT00LE9bXy5TTU9PVEhfUVVBRF9UT109MixPW18uQ1VSVkVfVE9dPTYsT1tfLlNNT09USF9DVVJWRV9UT109NCxPW18uQVJDXT03LE8pO2V4cG9ydHtOIGFzIENPTU1BTkRfQVJHX0NPVU5UUyxfIGFzIFNWR1BhdGhEYXRhLGYgYXMgU1ZHUGF0aERhdGFQYXJzZXIsdSBhcyBTVkdQYXRoRGF0YVRyYW5zZm9ybWVyLGUgYXMgZW5jb2RlU1ZHUGF0aH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TVkdQYXRoRGF0YS5tb2R1bGUuanMubWFwXG4iLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlIC0tIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1xdWVyeS1zZWxlY3RvciAtLSBhaW1pbmcgYXRcbiAgYmFja3dhcmQtY29tcGF0aWJpbGl0eSAqL1xuXG4vKipcbiogU3RhY2tCbHVyIC0gYSBmYXN0IGFsbW9zdCBHYXVzc2lhbiBCbHVyIEZvciBDYW52YXNcbipcbiogSW4gY2FzZSB5b3UgZmluZCB0aGlzIGNsYXNzIHVzZWZ1bCAtIGVzcGVjaWFsbHkgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyAtXG4qIEkgYW0gbm90IHRvdGFsbHkgdW5oYXBweSBmb3IgYSBzbWFsbCBkb25hdGlvbiB0byBteSBQYXlQYWwgYWNjb3VudFxuKiBtYXJpb0BxdWFzaW1vbmRvLmRlXG4qXG4qIE9yIHN1cHBvcnQgbWUgb24gZmxhdHRyOlxuKiB7QGxpbmsgaHR0cHM6Ly9mbGF0dHIuY29tL3RoaW5nLzcyNzkxL1N0YWNrQmx1ci1hLWZhc3QtYWxtb3N0LUdhdXNzaWFuLUJsdXItRWZmZWN0LWZvci1DYW52YXNKYXZhc2NyaXB0fS5cbipcbiogQG1vZHVsZSBTdGFja0JsdXJcbiogQGF1dGhvciBNYXJpbyBLbGluZ2VtYW5uXG4qIENvbnRhY3Q6IG1hcmlvQHF1YXNpbW9uZG8uY29tXG4qIFdlYnNpdGU6IHtAbGluayBodHRwOi8vd3d3LnF1YXNpbW9uZG8uY29tL1N0YWNrQmx1ckZvckNhbnZhcy9TdGFja0JsdXJEZW1vLmh0bWx9XG4qIFR3aXR0ZXI6IEBxdWFzaW1vbmRvXG4qXG4qIEBjb3B5cmlnaHQgKGMpIDIwMTAgTWFyaW8gS2xpbmdlbWFublxuKlxuKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvblxuKiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXRcbiogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsXG4qIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4qIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZVxuKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZ1xuKiBjb25kaXRpb25zOlxuKlxuKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbipcbiogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTXG4qIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4qIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUXG4qIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLFxuKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4qL1xudmFyIG11bFRhYmxlID0gWzUxMiwgNTEyLCA0NTYsIDUxMiwgMzI4LCA0NTYsIDMzNSwgNTEyLCA0MDUsIDMyOCwgMjcxLCA0NTYsIDM4OCwgMzM1LCAyOTIsIDUxMiwgNDU0LCA0MDUsIDM2NCwgMzI4LCAyOTgsIDI3MSwgNDk2LCA0NTYsIDQyMCwgMzg4LCAzNjAsIDMzNSwgMzEyLCAyOTIsIDI3MywgNTEyLCA0ODIsIDQ1NCwgNDI4LCA0MDUsIDM4MywgMzY0LCAzNDUsIDMyOCwgMzEyLCAyOTgsIDI4NCwgMjcxLCAyNTksIDQ5NiwgNDc1LCA0NTYsIDQzNywgNDIwLCA0MDQsIDM4OCwgMzc0LCAzNjAsIDM0NywgMzM1LCAzMjMsIDMxMiwgMzAyLCAyOTIsIDI4MiwgMjczLCAyNjUsIDUxMiwgNDk3LCA0ODIsIDQ2OCwgNDU0LCA0NDEsIDQyOCwgNDE3LCA0MDUsIDM5NCwgMzgzLCAzNzMsIDM2NCwgMzU0LCAzNDUsIDMzNywgMzI4LCAzMjAsIDMxMiwgMzA1LCAyOTgsIDI5MSwgMjg0LCAyNzgsIDI3MSwgMjY1LCAyNTksIDUwNywgNDk2LCA0ODUsIDQ3NSwgNDY1LCA0NTYsIDQ0NiwgNDM3LCA0MjgsIDQyMCwgNDEyLCA0MDQsIDM5NiwgMzg4LCAzODEsIDM3NCwgMzY3LCAzNjAsIDM1NCwgMzQ3LCAzNDEsIDMzNSwgMzI5LCAzMjMsIDMxOCwgMzEyLCAzMDcsIDMwMiwgMjk3LCAyOTIsIDI4NywgMjgyLCAyNzgsIDI3MywgMjY5LCAyNjUsIDI2MSwgNTEyLCA1MDUsIDQ5NywgNDg5LCA0ODIsIDQ3NSwgNDY4LCA0NjEsIDQ1NCwgNDQ3LCA0NDEsIDQzNSwgNDI4LCA0MjIsIDQxNywgNDExLCA0MDUsIDM5OSwgMzk0LCAzODksIDM4MywgMzc4LCAzNzMsIDM2OCwgMzY0LCAzNTksIDM1NCwgMzUwLCAzNDUsIDM0MSwgMzM3LCAzMzIsIDMyOCwgMzI0LCAzMjAsIDMxNiwgMzEyLCAzMDksIDMwNSwgMzAxLCAyOTgsIDI5NCwgMjkxLCAyODcsIDI4NCwgMjgxLCAyNzgsIDI3NCwgMjcxLCAyNjgsIDI2NSwgMjYyLCAyNTksIDI1NywgNTA3LCA1MDEsIDQ5NiwgNDkxLCA0ODUsIDQ4MCwgNDc1LCA0NzAsIDQ2NSwgNDYwLCA0NTYsIDQ1MSwgNDQ2LCA0NDIsIDQzNywgNDMzLCA0MjgsIDQyNCwgNDIwLCA0MTYsIDQxMiwgNDA4LCA0MDQsIDQwMCwgMzk2LCAzOTIsIDM4OCwgMzg1LCAzODEsIDM3NywgMzc0LCAzNzAsIDM2NywgMzYzLCAzNjAsIDM1NywgMzU0LCAzNTAsIDM0NywgMzQ0LCAzNDEsIDMzOCwgMzM1LCAzMzIsIDMyOSwgMzI2LCAzMjMsIDMyMCwgMzE4LCAzMTUsIDMxMiwgMzEwLCAzMDcsIDMwNCwgMzAyLCAyOTksIDI5NywgMjk0LCAyOTIsIDI4OSwgMjg3LCAyODUsIDI4MiwgMjgwLCAyNzgsIDI3NSwgMjczLCAyNzEsIDI2OSwgMjY3LCAyNjUsIDI2MywgMjYxLCAyNTldO1xudmFyIHNoZ1RhYmxlID0gWzksIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNF07XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfEhUTUxJbWFnZUVsZW1lbnR9IGltZ1xuICogQHBhcmFtIHtzdHJpbmd8SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuICogQHBhcmFtIHtGbG9hdH0gcmFkaXVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJsdXJBbHBoYUNoYW5uZWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlT2Zmc2V0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBTdHlsZXNcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cblxuZnVuY3Rpb24gcHJvY2Vzc0ltYWdlKGltZywgY2FudmFzLCByYWRpdXMsIGJsdXJBbHBoYUNoYW5uZWwsIHVzZU9mZnNldCwgc2tpcFN0eWxlcykge1xuICBpZiAodHlwZW9mIGltZyA9PT0gJ3N0cmluZycpIHtcbiAgICBpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbWcpO1xuICB9XG5cbiAgaWYgKCFpbWcgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGltZykuc2xpY2UoOCwgLTEpID09PSAnSFRNTEltYWdlRWxlbWVudCcgJiYgISgnbmF0dXJhbFdpZHRoJyBpbiBpbWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRpbWVuc2lvblR5cGUgPSB1c2VPZmZzZXQgPyAnb2Zmc2V0JyA6ICduYXR1cmFsJztcbiAgdmFyIHcgPSBpbWdbZGltZW5zaW9uVHlwZSArICdXaWR0aCddO1xuICB2YXIgaCA9IGltZ1tkaW1lbnNpb25UeXBlICsgJ0hlaWdodCddOyAvLyBhZGQgSW1hZ2VCaXRtYXAgc3VwcG9ydCxjYW4gYmx1ciB0ZXh0dXJlIHNvdXJjZVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW1nKS5zbGljZSg4LCAtMSkgPT09ICdJbWFnZUJpdG1hcCcpIHtcbiAgICB3ID0gaW1nLndpZHRoO1xuICAgIGggPSBpbWcuaGVpZ2h0O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjYW52YXMgPT09ICdzdHJpbmcnKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzKTtcbiAgfVxuXG4gIGlmICghY2FudmFzIHx8ICEoJ2dldENvbnRleHQnIGluIGNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXNraXBTdHlsZXMpIHtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3ICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gIH1cblxuICBjYW52YXMud2lkdGggPSB3O1xuICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLm5hdHVyYWxXaWR0aCwgaW1nLm5hdHVyYWxIZWlnaHQsIDAsIDAsIHcsIGgpO1xuXG4gIGlmIChpc05hTihyYWRpdXMpIHx8IHJhZGl1cyA8IDEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYmx1ckFscGhhQ2hhbm5lbCkge1xuICAgIHByb2Nlc3NDYW52YXNSR0JBKGNhbnZhcywgMCwgMCwgdywgaCwgcmFkaXVzKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzQ2FudmFzUkdCKGNhbnZhcywgMCwgMCwgdywgaCwgcmFkaXVzKTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRvcFhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWVxuICogQHBhcmFtIHtJbnRlZ2VyfSB3aWR0aFxuICogQHBhcmFtIHtJbnRlZ2VyfSBoZWlnaHRcbiAqIEB0aHJvd3Mge0Vycm9yfFR5cGVFcnJvcn1cbiAqIEByZXR1cm5zIHtJbWFnZURhdGF9IFNlZSB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjaW1hZ2VkYXRhfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyhjYW52YXMsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQpIHtcbiAgaWYgKHR5cGVvZiBjYW52YXMgPT09ICdzdHJpbmcnKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzKTtcbiAgfVxuXG4gIGlmICghY2FudmFzIHx8IF90eXBlb2YoY2FudmFzKSAhPT0gJ29iamVjdCcgfHwgISgnZ2V0Q29udGV4dCcgaW4gY2FudmFzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGluZyBjYW52YXMgd2l0aCBgZ2V0Q29udGV4dGAgbWV0aG9kICcgKyAnaW4gcHJvY2Vzc0NhbnZhc1JHQihBKSBjYWxscyEnKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEodG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBhY2Nlc3MgaW1hZ2UgZGF0YTogJyArIGUpO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BYXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRvcFlcbiAqIEBwYXJhbSB7SW50ZWdlcn0gd2lkdGhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaGVpZ2h0XG4gKiBAcGFyYW0ge0Zsb2F0fSByYWRpdXNcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cblxuXG5mdW5jdGlvbiBwcm9jZXNzQ2FudmFzUkdCQShjYW52YXMsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICBpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPCAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmFkaXVzIHw9IDA7XG4gIHZhciBpbWFnZURhdGEgPSBnZXRJbWFnZURhdGFGcm9tQ2FudmFzKGNhbnZhcywgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCk7XG4gIGltYWdlRGF0YSA9IHByb2Nlc3NJbWFnZURhdGFSR0JBKGltYWdlRGF0YSwgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKTtcbiAgY2FudmFzLmdldENvbnRleHQoJzJkJykucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgdG9wWCwgdG9wWSk7XG59XG4vKipcbiAqIEBwYXJhbSB7SW1hZ2VEYXRhfSBpbWFnZURhdGFcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BZXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGhlaWdodFxuICogQHBhcmFtIHtGbG9hdH0gcmFkaXVzXG4gKiBAcmV0dXJucyB7SW1hZ2VEYXRhfVxuICovXG5cblxuZnVuY3Rpb24gcHJvY2Vzc0ltYWdlRGF0YVJHQkEoaW1hZ2VEYXRhLCB0b3BYLCB0b3BZLCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgdmFyIHBpeGVscyA9IGltYWdlRGF0YS5kYXRhO1xuICB2YXIgZGl2ID0gMiAqIHJhZGl1cyArIDE7IC8vIGNvbnN0IHc0ID0gd2lkdGggPDwgMjtcblxuICB2YXIgd2lkdGhNaW51czEgPSB3aWR0aCAtIDE7XG4gIHZhciBoZWlnaHRNaW51czEgPSBoZWlnaHQgLSAxO1xuICB2YXIgcmFkaXVzUGx1czEgPSByYWRpdXMgKyAxO1xuICB2YXIgc3VtRmFjdG9yID0gcmFkaXVzUGx1czEgKiAocmFkaXVzUGx1czEgKyAxKSAvIDI7XG4gIHZhciBzdGFja1N0YXJ0ID0gbmV3IEJsdXJTdGFjaygpO1xuICB2YXIgc3RhY2sgPSBzdGFja1N0YXJ0O1xuICB2YXIgc3RhY2tFbmQ7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBkaXY7IGkrKykge1xuICAgIHN0YWNrID0gc3RhY2submV4dCA9IG5ldyBCbHVyU3RhY2soKTtcblxuICAgIGlmIChpID09PSByYWRpdXNQbHVzMSkge1xuICAgICAgc3RhY2tFbmQgPSBzdGFjaztcbiAgICB9XG4gIH1cblxuICBzdGFjay5uZXh0ID0gc3RhY2tTdGFydDtcbiAgdmFyIHN0YWNrSW4gPSBudWxsLFxuICAgICAgc3RhY2tPdXQgPSBudWxsLFxuICAgICAgeXcgPSAwLFxuICAgICAgeWkgPSAwO1xuICB2YXIgbXVsU3VtID0gbXVsVGFibGVbcmFkaXVzXTtcbiAgdmFyIHNoZ1N1bSA9IHNoZ1RhYmxlW3JhZGl1c107XG5cbiAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIHN0YWNrID0gc3RhY2tTdGFydDtcbiAgICB2YXIgcHIgPSBwaXhlbHNbeWldLFxuICAgICAgICBwZyA9IHBpeGVsc1t5aSArIDFdLFxuICAgICAgICBwYiA9IHBpeGVsc1t5aSArIDJdLFxuICAgICAgICBwYSA9IHBpeGVsc1t5aSArIDNdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHJhZGl1c1BsdXMxOyBfaSsrKSB7XG4gICAgICBzdGFjay5yID0gcHI7XG4gICAgICBzdGFjay5nID0gcGc7XG4gICAgICBzdGFjay5iID0gcGI7XG4gICAgICBzdGFjay5hID0gcGE7XG4gICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG4gICAgfVxuXG4gICAgdmFyIHJJblN1bSA9IDAsXG4gICAgICAgIGdJblN1bSA9IDAsXG4gICAgICAgIGJJblN1bSA9IDAsXG4gICAgICAgIGFJblN1bSA9IDAsXG4gICAgICAgIHJPdXRTdW0gPSByYWRpdXNQbHVzMSAqIHByLFxuICAgICAgICBnT3V0U3VtID0gcmFkaXVzUGx1czEgKiBwZyxcbiAgICAgICAgYk91dFN1bSA9IHJhZGl1c1BsdXMxICogcGIsXG4gICAgICAgIGFPdXRTdW0gPSByYWRpdXNQbHVzMSAqIHBhLFxuICAgICAgICByU3VtID0gc3VtRmFjdG9yICogcHIsXG4gICAgICAgIGdTdW0gPSBzdW1GYWN0b3IgKiBwZyxcbiAgICAgICAgYlN1bSA9IHN1bUZhY3RvciAqIHBiLFxuICAgICAgICBhU3VtID0gc3VtRmFjdG9yICogcGE7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAxOyBfaTIgPCByYWRpdXNQbHVzMTsgX2kyKyspIHtcbiAgICAgIHZhciBwID0geWkgKyAoKHdpZHRoTWludXMxIDwgX2kyID8gd2lkdGhNaW51czEgOiBfaTIpIDw8IDIpO1xuICAgICAgdmFyIHIgPSBwaXhlbHNbcF0sXG4gICAgICAgICAgZyA9IHBpeGVsc1twICsgMV0sXG4gICAgICAgICAgYiA9IHBpeGVsc1twICsgMl0sXG4gICAgICAgICAgYSA9IHBpeGVsc1twICsgM107XG4gICAgICB2YXIgcmJzID0gcmFkaXVzUGx1czEgLSBfaTI7XG4gICAgICByU3VtICs9IChzdGFjay5yID0gcikgKiByYnM7XG4gICAgICBnU3VtICs9IChzdGFjay5nID0gZykgKiByYnM7XG4gICAgICBiU3VtICs9IChzdGFjay5iID0gYikgKiByYnM7XG4gICAgICBhU3VtICs9IChzdGFjay5hID0gYSkgKiByYnM7XG4gICAgICBySW5TdW0gKz0gcjtcbiAgICAgIGdJblN1bSArPSBnO1xuICAgICAgYkluU3VtICs9IGI7XG4gICAgICBhSW5TdW0gKz0gYTtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICBzdGFja0luID0gc3RhY2tTdGFydDtcbiAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICB2YXIgcGFJbml0aWFsID0gYVN1bSAqIG11bFN1bSA+Pj4gc2hnU3VtO1xuICAgICAgcGl4ZWxzW3lpICsgM10gPSBwYUluaXRpYWw7XG5cbiAgICAgIGlmIChwYUluaXRpYWwgIT09IDApIHtcbiAgICAgICAgdmFyIF9hMiA9IDI1NSAvIHBhSW5pdGlhbDtcblxuICAgICAgICBwaXhlbHNbeWldID0gKHJTdW0gKiBtdWxTdW0gPj4+IHNoZ1N1bSkgKiBfYTI7XG4gICAgICAgIHBpeGVsc1t5aSArIDFdID0gKGdTdW0gKiBtdWxTdW0gPj4+IHNoZ1N1bSkgKiBfYTI7XG4gICAgICAgIHBpeGVsc1t5aSArIDJdID0gKGJTdW0gKiBtdWxTdW0gPj4+IHNoZ1N1bSkgKiBfYTI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaXhlbHNbeWldID0gcGl4ZWxzW3lpICsgMV0gPSBwaXhlbHNbeWkgKyAyXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJTdW0gLT0gck91dFN1bTtcbiAgICAgIGdTdW0gLT0gZ091dFN1bTtcbiAgICAgIGJTdW0gLT0gYk91dFN1bTtcbiAgICAgIGFTdW0gLT0gYU91dFN1bTtcbiAgICAgIHJPdXRTdW0gLT0gc3RhY2tJbi5yO1xuICAgICAgZ091dFN1bSAtPSBzdGFja0luLmc7XG4gICAgICBiT3V0U3VtIC09IHN0YWNrSW4uYjtcbiAgICAgIGFPdXRTdW0gLT0gc3RhY2tJbi5hO1xuXG4gICAgICB2YXIgX3AgPSB4ICsgcmFkaXVzICsgMTtcblxuICAgICAgX3AgPSB5dyArIChfcCA8IHdpZHRoTWludXMxID8gX3AgOiB3aWR0aE1pbnVzMSkgPDwgMjtcbiAgICAgIHJJblN1bSArPSBzdGFja0luLnIgPSBwaXhlbHNbX3BdO1xuICAgICAgZ0luU3VtICs9IHN0YWNrSW4uZyA9IHBpeGVsc1tfcCArIDFdO1xuICAgICAgYkluU3VtICs9IHN0YWNrSW4uYiA9IHBpeGVsc1tfcCArIDJdO1xuICAgICAgYUluU3VtICs9IHN0YWNrSW4uYSA9IHBpeGVsc1tfcCArIDNdO1xuICAgICAgclN1bSArPSBySW5TdW07XG4gICAgICBnU3VtICs9IGdJblN1bTtcbiAgICAgIGJTdW0gKz0gYkluU3VtO1xuICAgICAgYVN1bSArPSBhSW5TdW07XG4gICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuICAgICAgdmFyIF9zdGFja091dCA9IHN0YWNrT3V0LFxuICAgICAgICAgIF9yID0gX3N0YWNrT3V0LnIsXG4gICAgICAgICAgX2cgPSBfc3RhY2tPdXQuZyxcbiAgICAgICAgICBfYiA9IF9zdGFja091dC5iLFxuICAgICAgICAgIF9hID0gX3N0YWNrT3V0LmE7XG4gICAgICByT3V0U3VtICs9IF9yO1xuICAgICAgZ091dFN1bSArPSBfZztcbiAgICAgIGJPdXRTdW0gKz0gX2I7XG4gICAgICBhT3V0U3VtICs9IF9hO1xuICAgICAgckluU3VtIC09IF9yO1xuICAgICAgZ0luU3VtIC09IF9nO1xuICAgICAgYkluU3VtIC09IF9iO1xuICAgICAgYUluU3VtIC09IF9hO1xuICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xuICAgICAgeWkgKz0gNDtcbiAgICB9XG5cbiAgICB5dyArPSB3aWR0aDtcbiAgfVxuXG4gIGZvciAodmFyIF94ID0gMDsgX3ggPCB3aWR0aDsgX3grKykge1xuICAgIHlpID0gX3ggPDwgMjtcblxuICAgIHZhciBfcHIgPSBwaXhlbHNbeWldLFxuICAgICAgICBfcGcgPSBwaXhlbHNbeWkgKyAxXSxcbiAgICAgICAgX3BiID0gcGl4ZWxzW3lpICsgMl0sXG4gICAgICAgIF9wYSA9IHBpeGVsc1t5aSArIDNdLFxuICAgICAgICBfck91dFN1bSA9IHJhZGl1c1BsdXMxICogX3ByLFxuICAgICAgICBfZ091dFN1bSA9IHJhZGl1c1BsdXMxICogX3BnLFxuICAgICAgICBfYk91dFN1bSA9IHJhZGl1c1BsdXMxICogX3BiLFxuICAgICAgICBfYU91dFN1bSA9IHJhZGl1c1BsdXMxICogX3BhLFxuICAgICAgICBfclN1bSA9IHN1bUZhY3RvciAqIF9wcixcbiAgICAgICAgX2dTdW0gPSBzdW1GYWN0b3IgKiBfcGcsXG4gICAgICAgIF9iU3VtID0gc3VtRmFjdG9yICogX3BiLFxuICAgICAgICBfYVN1bSA9IHN1bUZhY3RvciAqIF9wYTtcblxuICAgIHN0YWNrID0gc3RhY2tTdGFydDtcblxuICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IHJhZGl1c1BsdXMxOyBfaTMrKykge1xuICAgICAgc3RhY2suciA9IF9wcjtcbiAgICAgIHN0YWNrLmcgPSBfcGc7XG4gICAgICBzdGFjay5iID0gX3BiO1xuICAgICAgc3RhY2suYSA9IF9wYTtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICB2YXIgeXAgPSB3aWR0aDtcbiAgICB2YXIgX2dJblN1bSA9IDAsXG4gICAgICAgIF9iSW5TdW0gPSAwLFxuICAgICAgICBfYUluU3VtID0gMCxcbiAgICAgICAgX3JJblN1bSA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTQgPSAxOyBfaTQgPD0gcmFkaXVzOyBfaTQrKykge1xuICAgICAgeWkgPSB5cCArIF94IDw8IDI7XG5cbiAgICAgIHZhciBfcmJzID0gcmFkaXVzUGx1czEgLSBfaTQ7XG5cbiAgICAgIF9yU3VtICs9IChzdGFjay5yID0gX3ByID0gcGl4ZWxzW3lpXSkgKiBfcmJzO1xuICAgICAgX2dTdW0gKz0gKHN0YWNrLmcgPSBfcGcgPSBwaXhlbHNbeWkgKyAxXSkgKiBfcmJzO1xuICAgICAgX2JTdW0gKz0gKHN0YWNrLmIgPSBfcGIgPSBwaXhlbHNbeWkgKyAyXSkgKiBfcmJzO1xuICAgICAgX2FTdW0gKz0gKHN0YWNrLmEgPSBfcGEgPSBwaXhlbHNbeWkgKyAzXSkgKiBfcmJzO1xuICAgICAgX3JJblN1bSArPSBfcHI7XG4gICAgICBfZ0luU3VtICs9IF9wZztcbiAgICAgIF9iSW5TdW0gKz0gX3BiO1xuICAgICAgX2FJblN1bSArPSBfcGE7XG4gICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cbiAgICAgIGlmIChfaTQgPCBoZWlnaHRNaW51czEpIHtcbiAgICAgICAgeXAgKz0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgeWkgPSBfeDtcbiAgICBzdGFja0luID0gc3RhY2tTdGFydDtcbiAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXG4gICAgZm9yICh2YXIgX3kgPSAwOyBfeSA8IGhlaWdodDsgX3krKykge1xuICAgICAgdmFyIF9wMiA9IHlpIDw8IDI7XG5cbiAgICAgIHBpeGVsc1tfcDIgKyAzXSA9IF9wYSA9IF9hU3VtICogbXVsU3VtID4+PiBzaGdTdW07XG5cbiAgICAgIGlmIChfcGEgPiAwKSB7XG4gICAgICAgIF9wYSA9IDI1NSAvIF9wYTtcbiAgICAgICAgcGl4ZWxzW19wMl0gPSAoX3JTdW0gKiBtdWxTdW0gPj4+IHNoZ1N1bSkgKiBfcGE7XG4gICAgICAgIHBpeGVsc1tfcDIgKyAxXSA9IChfZ1N1bSAqIG11bFN1bSA+Pj4gc2hnU3VtKSAqIF9wYTtcbiAgICAgICAgcGl4ZWxzW19wMiArIDJdID0gKF9iU3VtICogbXVsU3VtID4+PiBzaGdTdW0pICogX3BhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGl4ZWxzW19wMl0gPSBwaXhlbHNbX3AyICsgMV0gPSBwaXhlbHNbX3AyICsgMl0gPSAwO1xuICAgICAgfVxuXG4gICAgICBfclN1bSAtPSBfck91dFN1bTtcbiAgICAgIF9nU3VtIC09IF9nT3V0U3VtO1xuICAgICAgX2JTdW0gLT0gX2JPdXRTdW07XG4gICAgICBfYVN1bSAtPSBfYU91dFN1bTtcbiAgICAgIF9yT3V0U3VtIC09IHN0YWNrSW4ucjtcbiAgICAgIF9nT3V0U3VtIC09IHN0YWNrSW4uZztcbiAgICAgIF9iT3V0U3VtIC09IHN0YWNrSW4uYjtcbiAgICAgIF9hT3V0U3VtIC09IHN0YWNrSW4uYTtcbiAgICAgIF9wMiA9IF94ICsgKChfcDIgPSBfeSArIHJhZGl1c1BsdXMxKSA8IGhlaWdodE1pbnVzMSA/IF9wMiA6IGhlaWdodE1pbnVzMSkgKiB3aWR0aCA8PCAyO1xuICAgICAgX3JTdW0gKz0gX3JJblN1bSArPSBzdGFja0luLnIgPSBwaXhlbHNbX3AyXTtcbiAgICAgIF9nU3VtICs9IF9nSW5TdW0gKz0gc3RhY2tJbi5nID0gcGl4ZWxzW19wMiArIDFdO1xuICAgICAgX2JTdW0gKz0gX2JJblN1bSArPSBzdGFja0luLmIgPSBwaXhlbHNbX3AyICsgMl07XG4gICAgICBfYVN1bSArPSBfYUluU3VtICs9IHN0YWNrSW4uYSA9IHBpeGVsc1tfcDIgKyAzXTtcbiAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XG4gICAgICBfck91dFN1bSArPSBfcHIgPSBzdGFja091dC5yO1xuICAgICAgX2dPdXRTdW0gKz0gX3BnID0gc3RhY2tPdXQuZztcbiAgICAgIF9iT3V0U3VtICs9IF9wYiA9IHN0YWNrT3V0LmI7XG4gICAgICBfYU91dFN1bSArPSBfcGEgPSBzdGFja091dC5hO1xuICAgICAgX3JJblN1bSAtPSBfcHI7XG4gICAgICBfZ0luU3VtIC09IF9wZztcbiAgICAgIF9iSW5TdW0gLT0gX3BiO1xuICAgICAgX2FJblN1bSAtPSBfcGE7XG4gICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XG4gICAgICB5aSArPSB3aWR0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW1hZ2VEYXRhO1xufVxuLyoqXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BZXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGhlaWdodFxuICogQHBhcmFtIHtGbG9hdH0gcmFkaXVzXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5cblxuZnVuY3Rpb24gcHJvY2Vzc0NhbnZhc1JHQihjYW52YXMsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICBpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPCAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmFkaXVzIHw9IDA7XG4gIHZhciBpbWFnZURhdGEgPSBnZXRJbWFnZURhdGFGcm9tQ2FudmFzKGNhbnZhcywgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCk7XG4gIGltYWdlRGF0YSA9IHByb2Nlc3NJbWFnZURhdGFSR0IoaW1hZ2VEYXRhLCB0b3BYLCB0b3BZLCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpO1xuICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCB0b3BYLCB0b3BZKTtcbn1cbi8qKlxuICogQHBhcmFtIHtJbWFnZURhdGF9IGltYWdlRGF0YVxuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BYXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRvcFlcbiAqIEBwYXJhbSB7SW50ZWdlcn0gd2lkdGhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaGVpZ2h0XG4gKiBAcGFyYW0ge0Zsb2F0fSByYWRpdXNcbiAqIEByZXR1cm5zIHtJbWFnZURhdGF9XG4gKi9cblxuXG5mdW5jdGlvbiBwcm9jZXNzSW1hZ2VEYXRhUkdCKGltYWdlRGF0YSwgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gIHZhciBwaXhlbHMgPSBpbWFnZURhdGEuZGF0YTtcbiAgdmFyIGRpdiA9IDIgKiByYWRpdXMgKyAxOyAvLyBjb25zdCB3NCA9IHdpZHRoIDw8IDI7XG5cbiAgdmFyIHdpZHRoTWludXMxID0gd2lkdGggLSAxO1xuICB2YXIgaGVpZ2h0TWludXMxID0gaGVpZ2h0IC0gMTtcbiAgdmFyIHJhZGl1c1BsdXMxID0gcmFkaXVzICsgMTtcbiAgdmFyIHN1bUZhY3RvciA9IHJhZGl1c1BsdXMxICogKHJhZGl1c1BsdXMxICsgMSkgLyAyO1xuICB2YXIgc3RhY2tTdGFydCA9IG5ldyBCbHVyU3RhY2soKTtcbiAgdmFyIHN0YWNrID0gc3RhY2tTdGFydDtcbiAgdmFyIHN0YWNrRW5kO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgZGl2OyBpKyspIHtcbiAgICBzdGFjayA9IHN0YWNrLm5leHQgPSBuZXcgQmx1clN0YWNrKCk7XG5cbiAgICBpZiAoaSA9PT0gcmFkaXVzUGx1czEpIHtcbiAgICAgIHN0YWNrRW5kID0gc3RhY2s7XG4gICAgfVxuICB9XG5cbiAgc3RhY2submV4dCA9IHN0YWNrU3RhcnQ7XG4gIHZhciBzdGFja0luID0gbnVsbDtcbiAgdmFyIHN0YWNrT3V0ID0gbnVsbDtcbiAgdmFyIG11bFN1bSA9IG11bFRhYmxlW3JhZGl1c107XG4gIHZhciBzaGdTdW0gPSBzaGdUYWJsZVtyYWRpdXNdO1xuICB2YXIgcCwgcmJzO1xuICB2YXIgeXcgPSAwLFxuICAgICAgeWkgPSAwO1xuXG4gIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICB2YXIgcHIgPSBwaXhlbHNbeWldLFxuICAgICAgICBwZyA9IHBpeGVsc1t5aSArIDFdLFxuICAgICAgICBwYiA9IHBpeGVsc1t5aSArIDJdLFxuICAgICAgICByT3V0U3VtID0gcmFkaXVzUGx1czEgKiBwcixcbiAgICAgICAgZ091dFN1bSA9IHJhZGl1c1BsdXMxICogcGcsXG4gICAgICAgIGJPdXRTdW0gPSByYWRpdXNQbHVzMSAqIHBiLFxuICAgICAgICByU3VtID0gc3VtRmFjdG9yICogcHIsXG4gICAgICAgIGdTdW0gPSBzdW1GYWN0b3IgKiBwZyxcbiAgICAgICAgYlN1bSA9IHN1bUZhY3RvciAqIHBiO1xuICAgIHN0YWNrID0gc3RhY2tTdGFydDtcblxuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHJhZGl1c1BsdXMxOyBfaTUrKykge1xuICAgICAgc3RhY2suciA9IHByO1xuICAgICAgc3RhY2suZyA9IHBnO1xuICAgICAgc3RhY2suYiA9IHBiO1xuICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuICAgIH1cblxuICAgIHZhciBySW5TdW0gPSAwLFxuICAgICAgICBnSW5TdW0gPSAwLFxuICAgICAgICBiSW5TdW0gPSAwO1xuXG4gICAgZm9yICh2YXIgX2k2ID0gMTsgX2k2IDwgcmFkaXVzUGx1czE7IF9pNisrKSB7XG4gICAgICBwID0geWkgKyAoKHdpZHRoTWludXMxIDwgX2k2ID8gd2lkdGhNaW51czEgOiBfaTYpIDw8IDIpO1xuICAgICAgclN1bSArPSAoc3RhY2suciA9IHByID0gcGl4ZWxzW3BdKSAqIChyYnMgPSByYWRpdXNQbHVzMSAtIF9pNik7XG4gICAgICBnU3VtICs9IChzdGFjay5nID0gcGcgPSBwaXhlbHNbcCArIDFdKSAqIHJicztcbiAgICAgIGJTdW0gKz0gKHN0YWNrLmIgPSBwYiA9IHBpeGVsc1twICsgMl0pICogcmJzO1xuICAgICAgckluU3VtICs9IHByO1xuICAgICAgZ0luU3VtICs9IHBnO1xuICAgICAgYkluU3VtICs9IHBiO1xuICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuICAgIH1cblxuICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xuICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgIHBpeGVsc1t5aV0gPSByU3VtICogbXVsU3VtID4+PiBzaGdTdW07XG4gICAgICBwaXhlbHNbeWkgKyAxXSA9IGdTdW0gKiBtdWxTdW0gPj4+IHNoZ1N1bTtcbiAgICAgIHBpeGVsc1t5aSArIDJdID0gYlN1bSAqIG11bFN1bSA+Pj4gc2hnU3VtO1xuICAgICAgclN1bSAtPSByT3V0U3VtO1xuICAgICAgZ1N1bSAtPSBnT3V0U3VtO1xuICAgICAgYlN1bSAtPSBiT3V0U3VtO1xuICAgICAgck91dFN1bSAtPSBzdGFja0luLnI7XG4gICAgICBnT3V0U3VtIC09IHN0YWNrSW4uZztcbiAgICAgIGJPdXRTdW0gLT0gc3RhY2tJbi5iO1xuICAgICAgcCA9IHl3ICsgKChwID0geCArIHJhZGl1cyArIDEpIDwgd2lkdGhNaW51czEgPyBwIDogd2lkdGhNaW51czEpIDw8IDI7XG4gICAgICBySW5TdW0gKz0gc3RhY2tJbi5yID0gcGl4ZWxzW3BdO1xuICAgICAgZ0luU3VtICs9IHN0YWNrSW4uZyA9IHBpeGVsc1twICsgMV07XG4gICAgICBiSW5TdW0gKz0gc3RhY2tJbi5iID0gcGl4ZWxzW3AgKyAyXTtcbiAgICAgIHJTdW0gKz0gckluU3VtO1xuICAgICAgZ1N1bSArPSBnSW5TdW07XG4gICAgICBiU3VtICs9IGJJblN1bTtcbiAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XG4gICAgICByT3V0U3VtICs9IHByID0gc3RhY2tPdXQucjtcbiAgICAgIGdPdXRTdW0gKz0gcGcgPSBzdGFja091dC5nO1xuICAgICAgYk91dFN1bSArPSBwYiA9IHN0YWNrT3V0LmI7XG4gICAgICBySW5TdW0gLT0gcHI7XG4gICAgICBnSW5TdW0gLT0gcGc7XG4gICAgICBiSW5TdW0gLT0gcGI7XG4gICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XG4gICAgICB5aSArPSA0O1xuICAgIH1cblxuICAgIHl3ICs9IHdpZHRoO1xuICB9XG5cbiAgZm9yICh2YXIgX3gyID0gMDsgX3gyIDwgd2lkdGg7IF94MisrKSB7XG4gICAgeWkgPSBfeDIgPDwgMjtcblxuICAgIHZhciBfcHIyID0gcGl4ZWxzW3lpXSxcbiAgICAgICAgX3BnMiA9IHBpeGVsc1t5aSArIDFdLFxuICAgICAgICBfcGIyID0gcGl4ZWxzW3lpICsgMl0sXG4gICAgICAgIF9yT3V0U3VtMiA9IHJhZGl1c1BsdXMxICogX3ByMixcbiAgICAgICAgX2dPdXRTdW0yID0gcmFkaXVzUGx1czEgKiBfcGcyLFxuICAgICAgICBfYk91dFN1bTIgPSByYWRpdXNQbHVzMSAqIF9wYjIsXG4gICAgICAgIF9yU3VtMiA9IHN1bUZhY3RvciAqIF9wcjIsXG4gICAgICAgIF9nU3VtMiA9IHN1bUZhY3RvciAqIF9wZzIsXG4gICAgICAgIF9iU3VtMiA9IHN1bUZhY3RvciAqIF9wYjI7XG5cbiAgICBzdGFjayA9IHN0YWNrU3RhcnQ7XG5cbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCByYWRpdXNQbHVzMTsgX2k3KyspIHtcbiAgICAgIHN0YWNrLnIgPSBfcHIyO1xuICAgICAgc3RhY2suZyA9IF9wZzI7XG4gICAgICBzdGFjay5iID0gX3BiMjtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICB2YXIgX3JJblN1bTIgPSAwLFxuICAgICAgICBfZ0luU3VtMiA9IDAsXG4gICAgICAgIF9iSW5TdW0yID0gMDtcblxuICAgIGZvciAodmFyIF9pOCA9IDEsIHlwID0gd2lkdGg7IF9pOCA8PSByYWRpdXM7IF9pOCsrKSB7XG4gICAgICB5aSA9IHlwICsgX3gyIDw8IDI7XG4gICAgICBfclN1bTIgKz0gKHN0YWNrLnIgPSBfcHIyID0gcGl4ZWxzW3lpXSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBfaTgpO1xuICAgICAgX2dTdW0yICs9IChzdGFjay5nID0gX3BnMiA9IHBpeGVsc1t5aSArIDFdKSAqIHJicztcbiAgICAgIF9iU3VtMiArPSAoc3RhY2suYiA9IF9wYjIgPSBwaXhlbHNbeWkgKyAyXSkgKiByYnM7XG4gICAgICBfckluU3VtMiArPSBfcHIyO1xuICAgICAgX2dJblN1bTIgKz0gX3BnMjtcbiAgICAgIF9iSW5TdW0yICs9IF9wYjI7XG4gICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cbiAgICAgIGlmIChfaTggPCBoZWlnaHRNaW51czEpIHtcbiAgICAgICAgeXAgKz0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgeWkgPSBfeDI7XG4gICAgc3RhY2tJbiA9IHN0YWNrU3RhcnQ7XG4gICAgc3RhY2tPdXQgPSBzdGFja0VuZDtcblxuICAgIGZvciAodmFyIF95MiA9IDA7IF95MiA8IGhlaWdodDsgX3kyKyspIHtcbiAgICAgIHAgPSB5aSA8PCAyO1xuICAgICAgcGl4ZWxzW3BdID0gX3JTdW0yICogbXVsU3VtID4+PiBzaGdTdW07XG4gICAgICBwaXhlbHNbcCArIDFdID0gX2dTdW0yICogbXVsU3VtID4+PiBzaGdTdW07XG4gICAgICBwaXhlbHNbcCArIDJdID0gX2JTdW0yICogbXVsU3VtID4+PiBzaGdTdW07XG4gICAgICBfclN1bTIgLT0gX3JPdXRTdW0yO1xuICAgICAgX2dTdW0yIC09IF9nT3V0U3VtMjtcbiAgICAgIF9iU3VtMiAtPSBfYk91dFN1bTI7XG4gICAgICBfck91dFN1bTIgLT0gc3RhY2tJbi5yO1xuICAgICAgX2dPdXRTdW0yIC09IHN0YWNrSW4uZztcbiAgICAgIF9iT3V0U3VtMiAtPSBzdGFja0luLmI7XG4gICAgICBwID0gX3gyICsgKChwID0gX3kyICsgcmFkaXVzUGx1czEpIDwgaGVpZ2h0TWludXMxID8gcCA6IGhlaWdodE1pbnVzMSkgKiB3aWR0aCA8PCAyO1xuICAgICAgX3JTdW0yICs9IF9ySW5TdW0yICs9IHN0YWNrSW4uciA9IHBpeGVsc1twXTtcbiAgICAgIF9nU3VtMiArPSBfZ0luU3VtMiArPSBzdGFja0luLmcgPSBwaXhlbHNbcCArIDFdO1xuICAgICAgX2JTdW0yICs9IF9iSW5TdW0yICs9IHN0YWNrSW4uYiA9IHBpeGVsc1twICsgMl07XG4gICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuICAgICAgX3JPdXRTdW0yICs9IF9wcjIgPSBzdGFja091dC5yO1xuICAgICAgX2dPdXRTdW0yICs9IF9wZzIgPSBzdGFja091dC5nO1xuICAgICAgX2JPdXRTdW0yICs9IF9wYjIgPSBzdGFja091dC5iO1xuICAgICAgX3JJblN1bTIgLT0gX3ByMjtcbiAgICAgIF9nSW5TdW0yIC09IF9wZzI7XG4gICAgICBfYkluU3VtMiAtPSBfcGIyO1xuICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xuICAgICAgeWkgKz0gd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGltYWdlRGF0YTtcbn1cbi8qKlxuICpcbiAqL1xuXG5cbnZhciBCbHVyU3RhY2sgPVxuLyoqXG4gKiBTZXQgcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gQmx1clN0YWNrKCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmx1clN0YWNrKTtcblxuICB0aGlzLnIgPSAwO1xuICB0aGlzLmcgPSAwO1xuICB0aGlzLmIgPSAwO1xuICB0aGlzLmEgPSAwO1xuICB0aGlzLm5leHQgPSBudWxsO1xufTtcblxuZXhwb3J0IHsgQmx1clN0YWNrLCBwcm9jZXNzQ2FudmFzUkdCIGFzIGNhbnZhc1JHQiwgcHJvY2Vzc0NhbnZhc1JHQkEgYXMgY2FudmFzUkdCQSwgcHJvY2Vzc0ltYWdlIGFzIGltYWdlLCBwcm9jZXNzSW1hZ2VEYXRhUkdCIGFzIGltYWdlRGF0YVJHQiwgcHJvY2Vzc0ltYWdlRGF0YVJHQkEgYXMgaW1hZ2VEYXRhUkdCQSB9O1xuIiwiaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyc7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyc7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHknO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanMnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzJztcbmltcG9ydCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZnJvbSAncmFmJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzJztcbmltcG9ydCBSR0JDb2xvciBmcm9tICdyZ2Jjb2xvcic7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZi5qcyc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZS5qcyc7XG5pbXBvcnQgeyBTVkdQYXRoRGF0YSB9IGZyb20gJ3N2Zy1wYXRoZGF0YSc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzJztcbmltcG9ydCB7IGNhbnZhc1JHQkEgfSBmcm9tICdzdGFja2JsdXItY2FudmFzJztcblxuLyoqXHJcbiAqIE9wdGlvbnMgcHJlc2V0IGZvciBgT2Zmc2NyZWVuQ2FudmFzYC5cclxuICogQHBhcmFtIGNvbmZpZyAtIFByZXNldCByZXF1aXJlbWVudHMuXHJcbiAqIEBwYXJhbSBjb25maWcuRE9NUGFyc2VyIC0gWE1ML0hUTUwgcGFyc2VyIGZyb20gc3RyaW5nIGludG8gRE9NIERvY3VtZW50LlxyXG4gKiBAcmV0dXJucyBQcmVzZXQgb2JqZWN0LlxyXG4gKi9cbmZ1bmN0aW9uIG9mZnNjcmVlbigpIHtcbiAgdmFyIHtcbiAgICBET01QYXJzZXI6IERPTVBhcnNlckZhbGxiYWNrXG4gIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICB2YXIgcHJlc2V0ID0ge1xuICAgIHdpbmRvdzogbnVsbCxcbiAgICBpZ25vcmVBbmltYXRpb246IHRydWUsXG4gICAgaWdub3JlTW91c2U6IHRydWUsXG4gICAgRE9NUGFyc2VyOiBET01QYXJzZXJGYWxsYmFjayxcblxuICAgIGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICByZXR1cm4gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgY3JlYXRlSW1hZ2UodXJsKSB7XG4gICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsKTtcbiAgICAgICAgdmFyIGJsb2IgPSB5aWVsZCByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgIHZhciBpbWcgPSB5aWVsZCBjcmVhdGVJbWFnZUJpdG1hcChibG9iKTtcbiAgICAgICAgcmV0dXJuIGltZztcbiAgICAgIH0pKCk7XG4gICAgfVxuXG4gIH07XG5cbiAgaWYgKHR5cGVvZiBET01QYXJzZXIgIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBET01QYXJzZXJGYWxsYmFjayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHByZXNldCwgJ0RPTVBhcnNlcicpO1xuICB9XG5cbiAgcmV0dXJuIHByZXNldDtcbn1cblxuLyoqXHJcbiAqIE9wdGlvbnMgcHJlc2V0IGZvciBgbm9kZS1jYW52YXNgLlxyXG4gKiBAcGFyYW0gY29uZmlnIC0gUHJlc2V0IHJlcXVpcmVtZW50cy5cclxuICogQHBhcmFtIGNvbmZpZy5ET01QYXJzZXIgLSBYTUwvSFRNTCBwYXJzZXIgZnJvbSBzdHJpbmcgaW50byBET00gRG9jdW1lbnQuXHJcbiAqIEBwYXJhbSBjb25maWcuY2FudmFzIC0gYG5vZGUtY2FudmFzYCBleHBvcnRzLlxyXG4gKiBAcGFyYW0gY29uZmlnLmZldGNoIC0gV0hBVFdHLWNvbXBhdGlibGUgYGZldGNoYCBmdW5jdGlvbi5cclxuICogQHJldHVybnMgUHJlc2V0IG9iamVjdC5cclxuICovXG5mdW5jdGlvbiBub2RlKF9yZWYpIHtcbiAgdmFyIHtcbiAgICBET01QYXJzZXIsXG4gICAgY2FudmFzLFxuICAgIGZldGNoXG4gIH0gPSBfcmVmO1xuICByZXR1cm4ge1xuICAgIHdpbmRvdzogbnVsbCxcbiAgICBpZ25vcmVBbmltYXRpb246IHRydWUsXG4gICAgaWdub3JlTW91c2U6IHRydWUsXG4gICAgRE9NUGFyc2VyLFxuICAgIGZldGNoLFxuICAgIGNyZWF0ZUNhbnZhczogY2FudmFzLmNyZWF0ZUNhbnZhcyxcbiAgICBjcmVhdGVJbWFnZTogY2FudmFzLmxvYWRJbWFnZVxuICB9O1xufVxuXG52YXIgaW5kZXggPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0b2Zmc2NyZWVuOiBvZmZzY3JlZW4sXG5cdG5vZGU6IG5vZGVcbn0pO1xuXG4vKipcclxuICogSFRNTC1zYWZlIGNvbXByZXNzIHdoaXRlLXNwYWNlcy5cclxuICogQHBhcmFtIHN0ciAtIFN0cmluZyB0byBjb21wcmVzcy5cclxuICogQHJldHVybnMgU3RyaW5nLlxyXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzU3BhY2VzKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyg/IVxcdTMwMDApXFxzKy9nbSwgJyAnKTtcbn1cbi8qKlxyXG4gKiBIVE1MLXNhZmUgbGVmdCB0cmltLlxyXG4gKiBAcGFyYW0gc3RyIC0gU3RyaW5nIHRvIHRyaW0uXHJcbiAqIEByZXR1cm5zIFN0cmluZy5cclxuICovXG5cbmZ1bmN0aW9uIHRyaW1MZWZ0KHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bXFxuIFxcdF0rLywgJycpO1xufVxuLyoqXHJcbiAqIEhUTUwtc2FmZSByaWdodCB0cmltLlxyXG4gKiBAcGFyYW0gc3RyIC0gU3RyaW5nIHRvIHRyaW0uXHJcbiAqIEByZXR1cm5zIFN0cmluZy5cclxuICovXG5cbmZ1bmN0aW9uIHRyaW1SaWdodChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXFxuIFxcdF0rJC8sICcnKTtcbn1cbi8qKlxyXG4gKiBTdHJpbmcgdG8gbnVtYmVycyBhcnJheS5cclxuICogQHBhcmFtIHN0ciAtIE51bWJlcnMgc3RyaW5nLlxyXG4gKiBAcmV0dXJucyBOdW1iZXJzIGFycmF5LlxyXG4gKi9cblxuZnVuY3Rpb24gdG9OdW1iZXJzKHN0cikge1xuICB2YXIgbWF0Y2hlcyA9IChzdHIgfHwgJycpLm1hdGNoKC8tPyhcXGQrKD86XFwuXFxkKig/OltlRV1bKy1dP1xcZCspPyk/fFxcLlxcZCspKD89XFxEfCQpL2dtKSB8fCBbXTtcbiAgcmV0dXJuIG1hdGNoZXMubWFwKHBhcnNlRmxvYXQpO1xufSAvLyBNaWNyb3NvZnQgRWRnZSBmaXhcblxudmFyIGFsbFVwcGVyY2FzZSA9IC9eW0EtWi1dKyQvO1xuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhdHRyaWJ1dGUgbmFtZS5cclxuICogQHBhcmFtIG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cclxuICogQHJldHVybnMgTm9ybWFsaXplZCBhdHRyaWJ1dGUgbmFtZS5cclxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUobmFtZSkge1xuICBpZiAoYWxsVXBwZXJjYXNlLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWU7XG59XG4vKipcclxuICogUGFyc2UgZXh0ZXJuYWwgVVJMLlxyXG4gKiBAcGFyYW0gdXJsIC0gQ1NTIHVybCBzdHJpbmcuXHJcbiAqIEByZXR1cm5zIFBhcnNlZCBVUkwuXHJcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUV4dGVybmFsVXJsKHVybCkge1xuICAvLyAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgcXVvdGVzIFsyXVxuICAvLyAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgZG91YmxlIHF1b3RlcyBbM11cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgdiAgICAgICAgIHYgICAgICAgICBubyBxdW90ZXMgWzRdXG4gIC8vICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICB2ICAgICAgICAgdlxuICB2YXIgdXJsTWF0Y2ggPSAvdXJsXFwoKCcoW14nXSspJ3xcIihbXlwiXSspXCJ8KFteJ1wiKV0rKSlcXCkvLmV4ZWModXJsKSB8fCBbXTtcbiAgcmV0dXJuIHVybE1hdGNoWzJdIHx8IHVybE1hdGNoWzNdIHx8IHVybE1hdGNoWzRdO1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybSBmbG9hdHMgdG8gaW50ZWdlcnMgaW4gcmdiIGNvbG9ycy5cclxuICogQHBhcmFtIGNvbG9yIC0gQ29sb3IgdG8gbm9ybWFsaXplLlxyXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIGNvbG9yLlxyXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29sb3IoY29sb3IpIHtcbiAgaWYgKCFjb2xvci5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHZhciByZ2JQYXJ0cyA9IDM7XG4gIHZhciBub3JtYWxpemVkQ29sb3IgPSBjb2xvci5yZXBsYWNlKC9cXGQrKFxcLlxcZCspPy9nLCAobnVtLCBpc0Zsb2F0KSA9PiByZ2JQYXJ0cy0tICYmIGlzRmxvYXQgPyBTdHJpbmcoTWF0aC5yb3VuZChwYXJzZUZsb2F0KG51bSkpKSA6IG51bSk7XG4gIHJldHVybiBub3JtYWxpemVkQ29sb3I7XG59XG5cbi8vIHNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tlZWdhbnN0cmVldC9zcGVjaWZpY2l0eS9ibG9iL21hc3Rlci9zcGVjaWZpY2l0eS5qc1xudmFyIGF0dHJpYnV0ZVJlZ2V4ID0gLyhcXFtbXlxcXV0rXFxdKS9nO1xudmFyIGlkUmVnZXggPSAvKCNbXlxccys+fi5bOl0rKS9nO1xudmFyIGNsYXNzUmVnZXggPSAvKFxcLlteXFxzKz5+Lls6XSspL2c7XG52YXIgcHNldWRvRWxlbWVudFJlZ2V4ID0gLyg6OlteXFxzKz5+Lls6XSt8OmZpcnN0LWxpbmV8OmZpcnN0LWxldHRlcnw6YmVmb3JlfDphZnRlcikvZ2k7XG52YXIgcHNldWRvQ2xhc3NXaXRoQnJhY2tldHNSZWdleCA9IC8oOltcXHctXStcXChbXildKlxcKSkvZ2k7XG52YXIgcHNldWRvQ2xhc3NSZWdleCA9IC8oOlteXFxzKz5+Lls6XSspL2c7XG52YXIgZWxlbWVudFJlZ2V4ID0gLyhbXlxccys+fi5bOl0rKS9nO1xuXG5mdW5jdGlvbiBmaW5kU2VsZWN0b3JNYXRjaChzZWxlY3RvciwgcmVnZXgpIHtcbiAgdmFyIG1hdGNoZXMgPSByZWdleC5leGVjKHNlbGVjdG9yKTtcblxuICBpZiAoIW1hdGNoZXMpIHtcbiAgICByZXR1cm4gW3NlbGVjdG9yLCAwXTtcbiAgfVxuXG4gIHJldHVybiBbc2VsZWN0b3IucmVwbGFjZShyZWdleCwgJyAnKSwgbWF0Y2hlcy5sZW5ndGhdO1xufVxuLyoqXHJcbiAqIE1lYXN1cmUgc2VsZWN0b3Igc3BlY2lmaWNpdHkuXHJcbiAqIEBwYXJhbSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1lYXN1cmUuXHJcbiAqIEByZXR1cm5zIFNwZWNpZmljaXR5LlxyXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTZWxlY3RvclNwZWNpZmljaXR5KHNlbGVjdG9yKSB7XG4gIHZhciBzcGVjaWZpY2l0eSA9IFswLCAwLCAwXTtcbiAgdmFyIGN1cnJlbnRTZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLzpub3RcXCgoW14pXSopXFwpL2csICcgICAgICQxICcpLnJlcGxhY2UoL3tbXFxzXFxTXSovZ20sICcgJyk7XG4gIHZhciBkZWx0YSA9IDA7XG4gIFtjdXJyZW50U2VsZWN0b3IsIGRlbHRhXSA9IGZpbmRTZWxlY3Rvck1hdGNoKGN1cnJlbnRTZWxlY3RvciwgYXR0cmlidXRlUmVnZXgpO1xuICBzcGVjaWZpY2l0eVsxXSArPSBkZWx0YTtcbiAgW2N1cnJlbnRTZWxlY3RvciwgZGVsdGFdID0gZmluZFNlbGVjdG9yTWF0Y2goY3VycmVudFNlbGVjdG9yLCBpZFJlZ2V4KTtcbiAgc3BlY2lmaWNpdHlbMF0gKz0gZGVsdGE7XG4gIFtjdXJyZW50U2VsZWN0b3IsIGRlbHRhXSA9IGZpbmRTZWxlY3Rvck1hdGNoKGN1cnJlbnRTZWxlY3RvciwgY2xhc3NSZWdleCk7XG4gIHNwZWNpZmljaXR5WzFdICs9IGRlbHRhO1xuICBbY3VycmVudFNlbGVjdG9yLCBkZWx0YV0gPSBmaW5kU2VsZWN0b3JNYXRjaChjdXJyZW50U2VsZWN0b3IsIHBzZXVkb0VsZW1lbnRSZWdleCk7XG4gIHNwZWNpZmljaXR5WzJdICs9IGRlbHRhO1xuICBbY3VycmVudFNlbGVjdG9yLCBkZWx0YV0gPSBmaW5kU2VsZWN0b3JNYXRjaChjdXJyZW50U2VsZWN0b3IsIHBzZXVkb0NsYXNzV2l0aEJyYWNrZXRzUmVnZXgpO1xuICBzcGVjaWZpY2l0eVsxXSArPSBkZWx0YTtcbiAgW2N1cnJlbnRTZWxlY3RvciwgZGVsdGFdID0gZmluZFNlbGVjdG9yTWF0Y2goY3VycmVudFNlbGVjdG9yLCBwc2V1ZG9DbGFzc1JlZ2V4KTtcbiAgc3BlY2lmaWNpdHlbMV0gKz0gZGVsdGE7XG4gIGN1cnJlbnRTZWxlY3RvciA9IGN1cnJlbnRTZWxlY3Rvci5yZXBsYWNlKC9bKlxccys+fl0vZywgJyAnKS5yZXBsYWNlKC9bIy5dL2csICcgJyk7XG4gIFtjdXJyZW50U2VsZWN0b3IsIGRlbHRhXSA9IGZpbmRTZWxlY3Rvck1hdGNoKGN1cnJlbnRTZWxlY3RvciwgZWxlbWVudFJlZ2V4KTsgLy8gbGd0bSBbanMvdXNlbGVzcy1hc3NpZ25tZW50LXRvLWxvY2FsXVxuXG4gIHNwZWNpZmljaXR5WzJdICs9IGRlbHRhO1xuICByZXR1cm4gc3BlY2lmaWNpdHkuam9pbignJyk7XG59XG5cbnZhciBQU0VVRE9fWkVSTyA9IC4wMDAwMDAwMTtcbi8qKlxyXG4gKiBWZWN0b3IgbWFnbml0dWRlLlxyXG4gKiBAcGFyYW0gdlxyXG4gKiBAcmV0dXJucyBOdW1iZXIgcmVzdWx0LlxyXG4gKi9cblxuZnVuY3Rpb24gdmVjdG9yTWFnbml0dWRlKHYpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh2WzBdLCAyKSArIE1hdGgucG93KHZbMV0sIDIpKTtcbn1cbi8qKlxyXG4gKiBSYXRpbyBiZXR3ZWVuIHR3byB2ZWN0b3JzLlxyXG4gKiBAcGFyYW0gdVxyXG4gKiBAcGFyYW0gdlxyXG4gKiBAcmV0dXJucyBOdW1iZXIgcmVzdWx0LlxyXG4gKi9cblxuZnVuY3Rpb24gdmVjdG9yc1JhdGlvKHUsIHYpIHtcbiAgcmV0dXJuICh1WzBdICogdlswXSArIHVbMV0gKiB2WzFdKSAvICh2ZWN0b3JNYWduaXR1ZGUodSkgKiB2ZWN0b3JNYWduaXR1ZGUodikpO1xufVxuLyoqXHJcbiAqIEFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnMuXHJcbiAqIEBwYXJhbSB1XHJcbiAqIEBwYXJhbSB2XHJcbiAqIEByZXR1cm5zIE51bWJlciByZXN1bHQuXHJcbiAqL1xuXG5mdW5jdGlvbiB2ZWN0b3JzQW5nbGUodSwgdikge1xuICByZXR1cm4gKHVbMF0gKiB2WzFdIDwgdVsxXSAqIHZbMF0gPyAtMSA6IDEpICogTWF0aC5hY29zKHZlY3RvcnNSYXRpbyh1LCB2KSk7XG59XG5mdW5jdGlvbiBDQjEodCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuZnVuY3Rpb24gQ0IyKHQpIHtcbiAgcmV0dXJuIDMgKiB0ICogdCAqICgxIC0gdCk7XG59XG5mdW5jdGlvbiBDQjModCkge1xuICByZXR1cm4gMyAqIHQgKiAoMSAtIHQpICogKDEgLSB0KTtcbn1cbmZ1bmN0aW9uIENCNCh0KSB7XG4gIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqICgxIC0gdCk7XG59XG5mdW5jdGlvbiBRQjEodCkge1xuICByZXR1cm4gdCAqIHQ7XG59XG5mdW5jdGlvbiBRQjIodCkge1xuICByZXR1cm4gMiAqIHQgKiAoMSAtIHQpO1xufVxuZnVuY3Rpb24gUUIzKHQpIHtcbiAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpO1xufVxuXG5jbGFzcyBQcm9wZXJ0eSB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmlzTm9ybWFsaXplZENvbG9yID0gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZW1wdHkoZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnRU1QVFknLCAnJyk7XG4gIH1cblxuICBzcGxpdCgpIHtcbiAgICB2YXIgc2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnICc7XG4gICAgdmFyIHtcbiAgICAgIGRvY3VtZW50LFxuICAgICAgbmFtZVxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBjb21wcmVzc1NwYWNlcyh0aGlzLmdldFN0cmluZygpKS50cmltKCkuc3BsaXQoc2VwYXJhdG9yKS5tYXAodmFsdWUgPT4gbmV3IFByb3BlcnR5KGRvY3VtZW50LCBuYW1lLCB2YWx1ZSkpO1xuICB9XG5cbiAgaGFzVmFsdWUoemVyb0lzVmFsdWUpIHtcbiAgICB2YXIge1xuICAgICAgdmFsdWVcbiAgICB9ID0gdGhpcztcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnICYmICh6ZXJvSXNWYWx1ZSB8fCB2YWx1ZSAhPT0gMCkgJiYgdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIGlzU3RyaW5nKHJlZ2V4cCkge1xuICAgIHZhciB7XG4gICAgICB2YWx1ZVxuICAgIH0gPSB0aGlzO1xuICAgIHZhciByZXN1bHQgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuXG4gICAgaWYgKCFyZXN1bHQgfHwgIXJlZ2V4cCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnZXhwLnRlc3QodmFsdWUpO1xuICB9XG5cbiAgaXNVcmxEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmlzU3RyaW5nKC9edXJsXFwoLyk7XG4gIH1cblxuICBpc1BpeGVscygpIHtcbiAgICBpZiAoIXRoaXMuaGFzVmFsdWUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBhc1N0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgYXNTdHJpbmcuZW5kc1dpdGgoJ3B4Jyk6XG4gICAgICBjYXNlIC9eWzAtOV0rJC8udGVzdChhc1N0cmluZyk6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2V0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXRWYWx1ZShkZWYpIHtcbiAgICBpZiAodHlwZW9mIGRlZiA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmO1xuICB9XG5cbiAgZ2V0TnVtYmVyKGRlZikge1xuICAgIGlmICghdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KGRlZik7XG4gICAgfVxuXG4gICAgdmFyIHtcbiAgICAgIHZhbHVlXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIGlmICh0aGlzLmlzU3RyaW5nKC8lJC8pKSB7XG4gICAgICBuIC89IDEwMC4wO1xuICAgIH1cblxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgZ2V0U3RyaW5nKGRlZikge1xuICAgIGlmICh0eXBlb2YgZGVmID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmhhc1ZhbHVlKCkpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKGRlZik7XG4gIH1cblxuICBnZXRDb2xvcihkZWYpIHtcbiAgICB2YXIgY29sb3IgPSB0aGlzLmdldFN0cmluZyhkZWYpO1xuXG4gICAgaWYgKHRoaXMuaXNOb3JtYWxpemVkQ29sb3IpIHtcbiAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTm9ybWFsaXplZENvbG9yID0gdHJ1ZTtcbiAgICBjb2xvciA9IG5vcm1hbGl6ZUNvbG9yKGNvbG9yKTtcbiAgICB0aGlzLnZhbHVlID0gY29sb3I7XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG5cbiAgZ2V0RHBpKCkge1xuICAgIHJldHVybiA5Ni4wOyAvLyBUT0RPOiBjb21wdXRlP1xuICB9XG5cbiAgZ2V0UmVtKCkge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50LnJvb3RFbVNpemU7XG4gIH1cblxuICBnZXRFbSgpIHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5lbVNpemU7XG4gIH1cblxuICBnZXRVbml0cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoKS5yZXBsYWNlKC9bMC05Li1dL2csICcnKTtcbiAgfVxuXG4gIGdldFBpeGVscyhheGlzT3JJc0ZvbnRTaXplKSB7XG4gICAgdmFyIHByb2Nlc3NQZXJjZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgIGlmICghdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgW2F4aXMsIGlzRm9udFNpemVdID0gdHlwZW9mIGF4aXNPcklzRm9udFNpemUgPT09ICdib29sZWFuJyA/IFt1bmRlZmluZWQsIGF4aXNPcklzRm9udFNpemVdIDogW2F4aXNPcklzRm9udFNpemVdO1xuICAgIHZhciB7XG4gICAgICB2aWV3UG9ydFxuICAgIH0gPSB0aGlzLmRvY3VtZW50LnNjcmVlbjtcblxuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC92bWluJC8pOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAvIDEwMC4wICogTWF0aC5taW4odmlld1BvcnQuY29tcHV0ZVNpemUoJ3gnKSwgdmlld1BvcnQuY29tcHV0ZVNpemUoJ3knKSk7XG5cbiAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvdm1heCQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgLyAxMDAuMCAqIE1hdGgubWF4KHZpZXdQb3J0LmNvbXB1dGVTaXplKCd4JyksIHZpZXdQb3J0LmNvbXB1dGVTaXplKCd5JykpO1xuXG4gICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL3Z3JC8pOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAvIDEwMC4wICogdmlld1BvcnQuY29tcHV0ZVNpemUoJ3gnKTtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC92aCQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgLyAxMDAuMCAqIHZpZXdQb3J0LmNvbXB1dGVTaXplKCd5Jyk7XG5cbiAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvcmVtJC8pOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIHRoaXMuZ2V0UmVtKCk7XG5cbiAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvZW0kLyk6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogdGhpcy5nZXRFbSgpO1xuXG4gICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL2V4JC8pOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIHRoaXMuZ2V0RW0oKSAvIDIuMDtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9weCQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCk7XG5cbiAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvcHQkLyk6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogdGhpcy5nZXREcGkoKSAqICgxLjAgLyA3Mi4wKTtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9wYyQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiAxNTtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9jbSQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB0aGlzLmdldERwaSgpIC8gMi41NDtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9tbSQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB0aGlzLmdldERwaSgpIC8gMjUuNDtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9pbiQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB0aGlzLmdldERwaSgpO1xuXG4gICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoLyUkLykgJiYgaXNGb250U2l6ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB0aGlzLmdldEVtKCk7XG5cbiAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvJSQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB2aWV3UG9ydC5jb21wdXRlU2l6ZShheGlzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBuID0gdGhpcy5nZXROdW1iZXIoKTtcblxuICAgICAgICAgIGlmIChwcm9jZXNzUGVyY2VudCAmJiBuIDwgMS4wKSB7XG4gICAgICAgICAgICByZXR1cm4gbiAqIHZpZXdQb3J0LmNvbXB1dGVTaXplKGF4aXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TWlsbGlzZWNvbmRzKCkge1xuICAgIGlmICghdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1N0cmluZygvbXMkLykpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogMTAwMDtcbiAgfVxuXG4gIGdldFJhZGlhbnMoKSB7XG4gICAgaWYgKCF0aGlzLmhhc1ZhbHVlKCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9kZWckLyk6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogKE1hdGguUEkgLyAxODAuMCk7XG5cbiAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvZ3JhZCQvKTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiAoTWF0aC5QSSAvIDIwMC4wKTtcblxuICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9yYWQkLyk6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIChNYXRoLlBJIC8gMTgwLjApO1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmluaXRpb24oKSB7XG4gICAgdmFyIGFzU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcbiAgICB2YXIgbmFtZSA9IC8jKFteKSdcIl0rKS8uZXhlYyhhc1N0cmluZyk7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgbmFtZSA9IG5hbWVbMV07XG4gICAgfVxuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gYXNTdHJpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZGVmaW5pdGlvbnNbbmFtZV07XG4gIH1cblxuICBnZXRGaWxsU3R5bGVEZWZpbml0aW9uKGVsZW1lbnQsIG9wYWNpdHkpIHtcbiAgICB2YXIgZGVmID0gdGhpcy5nZXREZWZpbml0aW9uKCk7XG5cbiAgICBpZiAoIWRlZikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBncmFkaWVudFxuXG5cbiAgICBpZiAodHlwZW9mIGRlZi5jcmVhdGVHcmFkaWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRlZi5jcmVhdGVHcmFkaWVudCh0aGlzLmRvY3VtZW50LmN0eCwgZWxlbWVudCwgb3BhY2l0eSk7XG4gICAgfSAvLyBwYXR0ZXJuXG5cblxuICAgIGlmICh0eXBlb2YgZGVmLmNyZWF0ZVBhdHRlcm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkZWYuZ2V0SHJlZkF0dHJpYnV0ZSgpLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdmFyIHBhdHRlcm5UcmFuc2Zvcm0gPSBkZWYuZ2V0QXR0cmlidXRlKCdwYXR0ZXJuVHJhbnNmb3JtJyk7XG4gICAgICAgIGRlZiA9IGRlZi5nZXRIcmVmQXR0cmlidXRlKCkuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICAgIGlmIChwYXR0ZXJuVHJhbnNmb3JtLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICBkZWYuZ2V0QXR0cmlidXRlKCdwYXR0ZXJuVHJhbnNmb3JtJywgdHJ1ZSkuc2V0VmFsdWUocGF0dGVyblRyYW5zZm9ybS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZi5jcmVhdGVQYXR0ZXJuKHRoaXMuZG9jdW1lbnQuY3R4LCBlbGVtZW50LCBvcGFjaXR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldFRleHRCYXNlbGluZSgpIHtcbiAgICBpZiAoIXRoaXMuaGFzVmFsdWUoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb3BlcnR5LnRleHRCYXNlbGluZU1hcHBpbmdbdGhpcy5nZXRTdHJpbmcoKV07XG4gIH1cblxuICBhZGRPcGFjaXR5KG9wYWNpdHkpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldENvbG9yKCk7XG4gICAgdmFyIGxlbiA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgY29tbWFzID0gMDsgLy8gU2ltdWxhdGUgb2xkIFJHQkNvbG9yIHZlcnNpb24sIHdoaWNoIGNhbid0IHBhcnNlIHJnYmEuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAodmFsdWVbaV0gPT09ICcsJykge1xuICAgICAgICBjb21tYXMrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1hcyA9PT0gMykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3BhY2l0eS5oYXNWYWx1ZSgpICYmIHRoaXMuaXNTdHJpbmcoKSAmJiBjb21tYXMgIT09IDMpIHtcbiAgICAgIHZhciBjb2xvciA9IG5ldyBSR0JDb2xvcih2YWx1ZSk7XG5cbiAgICAgIGlmIChjb2xvci5vaykge1xuICAgICAgICBjb2xvci5hbHBoYSA9IG9wYWNpdHkuZ2V0TnVtYmVyKCk7XG4gICAgICAgIHZhbHVlID0gY29sb3IudG9SR0JBKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCB0aGlzLm5hbWUsIHZhbHVlKTtcbiAgfVxuXG59XG5Qcm9wZXJ0eS50ZXh0QmFzZWxpbmVNYXBwaW5nID0ge1xuICAnYmFzZWxpbmUnOiAnYWxwaGFiZXRpYycsXG4gICdiZWZvcmUtZWRnZSc6ICd0b3AnLFxuICAndGV4dC1iZWZvcmUtZWRnZSc6ICd0b3AnLFxuICAnbWlkZGxlJzogJ21pZGRsZScsXG4gICdjZW50cmFsJzogJ21pZGRsZScsXG4gICdhZnRlci1lZGdlJzogJ2JvdHRvbScsXG4gICd0ZXh0LWFmdGVyLWVkZ2UnOiAnYm90dG9tJyxcbiAgJ2lkZW9ncmFwaGljJzogJ2lkZW9ncmFwaGljJyxcbiAgJ2FscGhhYmV0aWMnOiAnYWxwaGFiZXRpYycsXG4gICdoYW5naW5nJzogJ2hhbmdpbmcnLFxuICAnbWF0aGVtYXRpY2FsJzogJ2FscGhhYmV0aWMnXG59O1xuXG5jbGFzcyBWaWV3UG9ydCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmlld1BvcnRzID0gW107XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnZpZXdQb3J0cyA9IFtdO1xuICB9XG5cbiAgc2V0Q3VycmVudCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy52aWV3UG9ydHMucHVzaCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQ3VycmVudCgpIHtcbiAgICB0aGlzLnZpZXdQb3J0cy5wb3AoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnQoKSB7XG4gICAgdmFyIHtcbiAgICAgIHZpZXdQb3J0c1xuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiB2aWV3UG9ydHNbdmlld1BvcnRzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnQoKS53aWR0aDtcbiAgfVxuXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudCgpLmhlaWdodDtcbiAgfVxuXG4gIGNvbXB1dGVTaXplKGQpIHtcbiAgICBpZiAodHlwZW9mIGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZDtcbiAgICB9XG5cbiAgICBpZiAoZCA9PT0gJ3gnKSB7XG4gICAgICByZXR1cm4gdGhpcy53aWR0aDtcbiAgICB9XG5cbiAgICBpZiAoZCA9PT0gJ3knKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0aGlzLndpZHRoLCAyKSArIE1hdGgucG93KHRoaXMuaGVpZ2h0LCAyKSkgLyBNYXRoLnNxcnQoMik7XG4gIH1cblxufVxuXG5jbGFzcyBQb2ludCB7XG4gIGNvbnN0cnVjdG9yKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBzdGF0aWMgcGFyc2UocG9pbnQpIHtcbiAgICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAgIHZhciBbeCA9IGRlZmF1bHRWYWx1ZSwgeSA9IGRlZmF1bHRWYWx1ZV0gPSB0b051bWJlcnMocG9pbnQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VTY2FsZShzY2FsZSkge1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gICAgdmFyIFt4ID0gZGVmYXVsdFZhbHVlLCB5ID0geF0gPSB0b051bWJlcnMoc2NhbGUpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VQYXRoKHBhdGgpIHtcbiAgICB2YXIgcG9pbnRzID0gdG9OdW1iZXJzKHBhdGgpO1xuICAgIHZhciBsZW4gPSBwb2ludHMubGVuZ3RoO1xuICAgIHZhciBwYXRoUG9pbnRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgICBwYXRoUG9pbnRzLnB1c2gobmV3IFBvaW50KHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoUG9pbnRzO1xuICB9XG5cbiAgYW5nbGVUbyhwb2ludCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHBvaW50LnkgLSB0aGlzLnksIHBvaW50LnggLSB0aGlzLngpO1xuICB9XG5cbiAgYXBwbHlUcmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgdmFyIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHhwID0geCAqIHRyYW5zZm9ybVswXSArIHkgKiB0cmFuc2Zvcm1bMl0gKyB0cmFuc2Zvcm1bNF07XG4gICAgdmFyIHlwID0geCAqIHRyYW5zZm9ybVsxXSArIHkgKiB0cmFuc2Zvcm1bM10gKyB0cmFuc2Zvcm1bNV07XG4gICAgdGhpcy54ID0geHA7XG4gICAgdGhpcy55ID0geXA7XG4gIH1cblxufVxuXG5jbGFzcyBNb3VzZSB7XG4gIGNvbnN0cnVjdG9yKHNjcmVlbikge1xuICAgIHRoaXMuc2NyZWVuID0gc2NyZWVuO1xuICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgdGhpcy5ldmVudEVsZW1lbnRzID0gW107IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblxuICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cbiAgICB0aGlzLm9uTW91c2VNb3ZlID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgaXNXb3JraW5nKCkge1xuICAgIHJldHVybiB0aGlzLndvcmtpbmc7XG4gIH1cblxuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy53b3JraW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHtcbiAgICAgIHNjcmVlbixcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvbk1vdXNlTW92ZVxuICAgIH0gPSB0aGlzO1xuICAgIHZhciBjYW52YXMgPSBzY3JlZW4uY3R4LmNhbnZhcztcbiAgICBjYW52YXMub25jbGljayA9IG9uQ2xpY2s7XG4gICAgY2FudmFzLm9ubW91c2Vtb3ZlID0gb25Nb3VzZU1vdmU7XG4gICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2FudmFzID0gdGhpcy5zY3JlZW4uY3R4LmNhbnZhcztcbiAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICBjYW52YXMub25jbGljayA9IG51bGw7XG4gICAgY2FudmFzLm9ubW91c2Vtb3ZlID0gbnVsbDtcbiAgfVxuXG4gIGhhc0V2ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy53b3JraW5nICYmIHRoaXMuZXZlbnRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBydW5FdmVudHMoKSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIge1xuICAgICAgc2NyZWVuOiBkb2N1bWVudCxcbiAgICAgIGV2ZW50cyxcbiAgICAgIGV2ZW50RWxlbWVudHNcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgc3R5bGVcbiAgICB9ID0gZG9jdW1lbnQuY3R4LmNhbnZhcztcblxuICAgIGlmIChzdHlsZSkge1xuICAgICAgc3R5bGUuY3Vyc29yID0gJyc7XG4gICAgfVxuXG4gICAgZXZlbnRzLmZvckVhY2goKF9yZWYsIGkpID0+IHtcbiAgICAgIHZhciB7XG4gICAgICAgIHJ1blxuICAgICAgfSA9IF9yZWY7XG4gICAgICB2YXIgZWxlbWVudCA9IGV2ZW50RWxlbWVudHNbaV07XG5cbiAgICAgIHdoaWxlIChlbGVtZW50KSB7XG4gICAgICAgIHJ1bihlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50O1xuICAgICAgfVxuICAgIH0pOyAvLyBkb25lIHJ1bm5pbmcsIGNsZWFyXG5cbiAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIHRoaXMuZXZlbnRFbGVtZW50cyA9IFtdO1xuICB9XG5cbiAgY2hlY2tQYXRoKGVsZW1lbnQsIGN0eCkge1xuICAgIGlmICghdGhpcy53b3JraW5nIHx8ICFjdHgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIge1xuICAgICAgZXZlbnRzLFxuICAgICAgZXZlbnRFbGVtZW50c1xuICAgIH0gPSB0aGlzO1xuICAgIGV2ZW50cy5mb3JFYWNoKChfcmVmMiwgaSkgPT4ge1xuICAgICAgdmFyIHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IF9yZWYyO1xuXG4gICAgICBpZiAoIWV2ZW50RWxlbWVudHNbaV0gJiYgY3R4LmlzUG9pbnRJblBhdGggJiYgY3R4LmlzUG9pbnRJblBhdGgoeCwgeSkpIHtcbiAgICAgICAgZXZlbnRFbGVtZW50c1tpXSA9IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGVja0JvdW5kaW5nQm94KGVsZW1lbnQsIGJvdW5kaW5nQm94KSB7XG4gICAgaWYgKCF0aGlzLndvcmtpbmcgfHwgIWJvdW5kaW5nQm94KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHtcbiAgICAgIGV2ZW50cyxcbiAgICAgIGV2ZW50RWxlbWVudHNcbiAgICB9ID0gdGhpcztcbiAgICBldmVudHMuZm9yRWFjaCgoX3JlZjMsIGkpID0+IHtcbiAgICAgIHZhciB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBfcmVmMztcblxuICAgICAgaWYgKCFldmVudEVsZW1lbnRzW2ldICYmIGJvdW5kaW5nQm94LmlzUG9pbnRJbkJveCh4LCB5KSkge1xuICAgICAgICBldmVudEVsZW1lbnRzW2ldID0gZWxlbWVudDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1hcFhZKHgsIHkpIHtcbiAgICB2YXIge1xuICAgICAgd2luZG93LFxuICAgICAgY3R4XG4gICAgfSA9IHRoaXMuc2NyZWVuO1xuICAgIHZhciBwb2ludCA9IG5ldyBQb2ludCh4LCB5KTtcbiAgICB2YXIgZWxlbWVudCA9IGN0eC5jYW52YXM7XG5cbiAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgcG9pbnQueCAtPSBlbGVtZW50Lm9mZnNldExlZnQ7XG4gICAgICBwb2ludC55IC09IGVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuc2Nyb2xsWCkge1xuICAgICAgcG9pbnQueCArPSB3aW5kb3cuc2Nyb2xsWDtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnNjcm9sbFkpIHtcbiAgICAgIHBvaW50LnkgKz0gd2luZG93LnNjcm9sbFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50O1xuICB9XG5cbiAgb25DbGljayhldmVudCkge1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB0aGlzLm1hcFhZKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgdHlwZTogJ29uY2xpY2snLFxuICAgICAgeCxcbiAgICAgIHksXG5cbiAgICAgIHJ1bihldmVudFRhcmdldCkge1xuICAgICAgICBpZiAoZXZlbnRUYXJnZXQub25DbGljaykge1xuICAgICAgICAgIGV2ZW50VGFyZ2V0Lm9uQ2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gIH1cblxuICBvbk1vdXNlTW92ZShldmVudCkge1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB0aGlzLm1hcFhZKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgdHlwZTogJ29ubW91c2Vtb3ZlJyxcbiAgICAgIHgsXG4gICAgICB5LFxuXG4gICAgICBydW4oZXZlbnRUYXJnZXQpIHtcbiAgICAgICAgaWYgKGV2ZW50VGFyZ2V0Lm9uTW91c2VNb3ZlKSB7XG4gICAgICAgICAgZXZlbnRUYXJnZXQub25Nb3VzZU1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gIH1cblxufVxuXG52YXIgZGVmYXVsdFdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogbnVsbDtcbnZhciBkZWZhdWx0RmV0Y2gkMSA9IHR5cGVvZiBmZXRjaCAhPT0gJ3VuZGVmaW5lZCcgPyBmZXRjaC5iaW5kKHVuZGVmaW5lZCkgLy8gYGZldGNoYCBkZXBlbmRzIG9uIGNvbnRleHQ6IGBzb21lT2JqZWN0LmZldGNoKC4uLilgIHdpbGwgdGhyb3cgZXJyb3IuXG46IG51bGw7XG5jbGFzcyBTY3JlZW4ge1xuICBjb25zdHJ1Y3RvcihjdHgpIHtcbiAgICB2YXIge1xuICAgICAgZmV0Y2ggPSBkZWZhdWx0RmV0Y2gkMSxcbiAgICAgIHdpbmRvdyA9IGRlZmF1bHRXaW5kb3dcbiAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICB0aGlzLkZSQU1FUkFURSA9IDMwO1xuICAgIHRoaXMuTUFYX1ZJUlRVQUxfUElYRUxTID0gMzAwMDA7XG4gICAgdGhpcy5DTElFTlRfV0lEVEggPSA4MDA7XG4gICAgdGhpcy5DTElFTlRfSEVJR0hUID0gNjAwO1xuICAgIHRoaXMudmlld1BvcnQgPSBuZXcgVmlld1BvcnQoKTtcbiAgICB0aGlzLm1vdXNlID0gbmV3IE1vdXNlKHRoaXMpO1xuICAgIHRoaXMuYW5pbWF0aW9ucyA9IFtdO1xuICAgIHRoaXMud2FpdHMgPSBbXTtcbiAgICB0aGlzLmZyYW1lRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuaXNSZWFkeUxvY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzRmlyc3RSZW5kZXIgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IG51bGw7XG4gICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7XG4gICAgdGhpcy5mZXRjaCA9IGZldGNoO1xuICB9XG5cbiAgd2FpdChjaGVja2VyKSB7XG4gICAgdGhpcy53YWl0cy5wdXNoKGNoZWNrZXIpO1xuICB9XG5cbiAgcmVhZHkoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzXG4gICAgaWYgKCF0aGlzLnJlYWR5UHJvbWlzZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlYWR5UHJvbWlzZTtcbiAgfVxuXG4gIGlzUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuaXNSZWFkeUxvY2spIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpc1JlYWR5TG9jayA9IHRoaXMud2FpdHMuZXZlcnkoXyA9PiBfKCkpO1xuXG4gICAgaWYgKGlzUmVhZHlMb2NrKSB7XG4gICAgICB0aGlzLndhaXRzID0gW107XG5cbiAgICAgIGlmICh0aGlzLnJlc29sdmVSZWFkeSkge1xuICAgICAgICB0aGlzLnJlc29sdmVSZWFkeSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNSZWFkeUxvY2sgPSBpc1JlYWR5TG9jaztcbiAgICByZXR1cm4gaXNSZWFkeUxvY2s7XG4gIH1cblxuICBzZXREZWZhdWx0cyhjdHgpIHtcbiAgICAvLyBpbml0aWFsIHZhbHVlcyBhbmQgZGVmYXVsdHNcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmdiYSgwLDAsMCwwKSc7XG4gICAgY3R4LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgY3R4LmxpbmVKb2luID0gJ21pdGVyJztcbiAgICBjdHgubWl0ZXJMaW1pdCA9IDQ7XG4gIH1cblxuICBzZXRWaWV3Qm94KF9yZWYpIHtcbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBjdHgsXG4gICAgICBhc3BlY3RSYXRpbyxcbiAgICAgIHdpZHRoLFxuICAgICAgZGVzaXJlZFdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZGVzaXJlZEhlaWdodCxcbiAgICAgIG1pblggPSAwLFxuICAgICAgbWluWSA9IDAsXG4gICAgICByZWZYLFxuICAgICAgcmVmWSxcbiAgICAgIGNsaXAgPSBmYWxzZSxcbiAgICAgIGNsaXBYID0gMCxcbiAgICAgIGNsaXBZID0gMFxuICAgIH0gPSBfcmVmO1xuICAgIC8vIGFzcGVjdCByYXRpbyAtIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9jb29yZHMuaHRtbCNQcmVzZXJ2ZUFzcGVjdFJhdGlvQXR0cmlidXRlXG4gICAgdmFyIGNsZWFuQXNwZWN0UmF0aW8gPSBjb21wcmVzc1NwYWNlcyhhc3BlY3RSYXRpbykucmVwbGFjZSgvXmRlZmVyXFxzLywgJycpOyAvLyBpZ25vcmUgZGVmZXJcblxuICAgIHZhciBbYXNwZWN0UmF0aW9BbGlnbiwgYXNwZWN0UmF0aW9NZWV0T3JTbGljZV0gPSBjbGVhbkFzcGVjdFJhdGlvLnNwbGl0KCcgJyk7XG4gICAgdmFyIGFsaWduID0gYXNwZWN0UmF0aW9BbGlnbiB8fCAneE1pZFlNaWQnO1xuICAgIHZhciBtZWV0T3JTbGljZSA9IGFzcGVjdFJhdGlvTWVldE9yU2xpY2UgfHwgJ21lZXQnOyAvLyBjYWxjdWxhdGUgc2NhbGVcblxuICAgIHZhciBzY2FsZVggPSB3aWR0aCAvIGRlc2lyZWRXaWR0aDtcbiAgICB2YXIgc2NhbGVZID0gaGVpZ2h0IC8gZGVzaXJlZEhlaWdodDtcbiAgICB2YXIgc2NhbGVNaW4gPSBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSk7XG4gICAgdmFyIHNjYWxlTWF4ID0gTWF0aC5tYXgoc2NhbGVYLCBzY2FsZVkpO1xuICAgIHZhciBmaW5hbERlc2lyZWRXaWR0aCA9IGRlc2lyZWRXaWR0aDtcbiAgICB2YXIgZmluYWxEZXNpcmVkSGVpZ2h0ID0gZGVzaXJlZEhlaWdodDtcblxuICAgIGlmIChtZWV0T3JTbGljZSA9PT0gJ21lZXQnKSB7XG4gICAgICBmaW5hbERlc2lyZWRXaWR0aCAqPSBzY2FsZU1pbjtcbiAgICAgIGZpbmFsRGVzaXJlZEhlaWdodCAqPSBzY2FsZU1pbjtcbiAgICB9XG5cbiAgICBpZiAobWVldE9yU2xpY2UgPT09ICdzbGljZScpIHtcbiAgICAgIGZpbmFsRGVzaXJlZFdpZHRoICo9IHNjYWxlTWF4O1xuICAgICAgZmluYWxEZXNpcmVkSGVpZ2h0ICo9IHNjYWxlTWF4O1xuICAgIH1cblxuICAgIHZhciByZWZYUHJvcCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3JlZlgnLCByZWZYKTtcbiAgICB2YXIgcmVmWVByb3AgPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICdyZWZZJywgcmVmWSk7XG4gICAgdmFyIGhhc1JlZnMgPSByZWZYUHJvcC5oYXNWYWx1ZSgpICYmIHJlZllQcm9wLmhhc1ZhbHVlKCk7XG5cbiAgICBpZiAoaGFzUmVmcykge1xuICAgICAgY3R4LnRyYW5zbGF0ZSgtc2NhbGVNaW4gKiByZWZYUHJvcC5nZXRQaXhlbHMoJ3gnKSwgLXNjYWxlTWluICogcmVmWVByb3AuZ2V0UGl4ZWxzKCd5JykpO1xuICAgIH1cblxuICAgIGlmIChjbGlwKSB7XG4gICAgICB2YXIgc2NhbGVkQ2xpcFggPSBzY2FsZU1pbiAqIGNsaXBYO1xuICAgICAgdmFyIHNjYWxlZENsaXBZID0gc2NhbGVNaW4gKiBjbGlwWTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oc2NhbGVkQ2xpcFgsIHNjYWxlZENsaXBZKTtcbiAgICAgIGN0eC5saW5lVG8od2lkdGgsIHNjYWxlZENsaXBZKTtcbiAgICAgIGN0eC5saW5lVG8od2lkdGgsIGhlaWdodCk7XG4gICAgICBjdHgubGluZVRvKHNjYWxlZENsaXBYLCBoZWlnaHQpO1xuICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgY3R4LmNsaXAoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1JlZnMpIHtcbiAgICAgIHZhciBpc01lZXRNaW5ZID0gbWVldE9yU2xpY2UgPT09ICdtZWV0JyAmJiBzY2FsZU1pbiA9PT0gc2NhbGVZO1xuICAgICAgdmFyIGlzU2xpY2VNYXhZID0gbWVldE9yU2xpY2UgPT09ICdzbGljZScgJiYgc2NhbGVNYXggPT09IHNjYWxlWTtcbiAgICAgIHZhciBpc01lZXRNaW5YID0gbWVldE9yU2xpY2UgPT09ICdtZWV0JyAmJiBzY2FsZU1pbiA9PT0gc2NhbGVYO1xuICAgICAgdmFyIGlzU2xpY2VNYXhYID0gbWVldE9yU2xpY2UgPT09ICdzbGljZScgJiYgc2NhbGVNYXggPT09IHNjYWxlWDtcblxuICAgICAgaWYgKGFsaWduLnN0YXJ0c1dpdGgoJ3hNaWQnKSAmJiAoaXNNZWV0TWluWSB8fCBpc1NsaWNlTWF4WSkpIHtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aCAvIDIuMCAtIGZpbmFsRGVzaXJlZFdpZHRoIC8gMi4wLCAwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFsaWduLmVuZHNXaXRoKCdZTWlkJykgJiYgKGlzTWVldE1pblggfHwgaXNTbGljZU1heFgpKSB7XG4gICAgICAgIGN0eC50cmFuc2xhdGUoMCwgaGVpZ2h0IC8gMi4wIC0gZmluYWxEZXNpcmVkSGVpZ2h0IC8gMi4wKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFsaWduLnN0YXJ0c1dpdGgoJ3hNYXgnKSAmJiAoaXNNZWV0TWluWSB8fCBpc1NsaWNlTWF4WSkpIHtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aCAtIGZpbmFsRGVzaXJlZFdpZHRoLCAwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFsaWduLmVuZHNXaXRoKCdZTWF4JykgJiYgKGlzTWVldE1pblggfHwgaXNTbGljZU1heFgpKSB7XG4gICAgICAgIGN0eC50cmFuc2xhdGUoMCwgaGVpZ2h0IC0gZmluYWxEZXNpcmVkSGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9IC8vIHNjYWxlXG5cblxuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSBhbGlnbiA9PT0gJ25vbmUnOlxuICAgICAgICBjdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBtZWV0T3JTbGljZSA9PT0gJ21lZXQnOlxuICAgICAgICBjdHguc2NhbGUoc2NhbGVNaW4sIHNjYWxlTWluKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgbWVldE9yU2xpY2UgPT09ICdzbGljZSc6XG4gICAgICAgIGN0eC5zY2FsZShzY2FsZU1heCwgc2NhbGVNYXgpO1xuICAgICAgICBicmVhaztcbiAgICB9IC8vIHRyYW5zbGF0ZVxuXG5cbiAgICBjdHgudHJhbnNsYXRlKC1taW5YLCAtbWluWSk7XG4gIH1cblxuICBzdGFydChlbGVtZW50KSB7XG4gICAgdmFyIHtcbiAgICAgIGVuYWJsZVJlZHJhdyA9IGZhbHNlLFxuICAgICAgaWdub3JlTW91c2UgPSBmYWxzZSxcbiAgICAgIGlnbm9yZUFuaW1hdGlvbiA9IGZhbHNlLFxuICAgICAgaWdub3JlRGltZW5zaW9ucyA9IGZhbHNlLFxuICAgICAgaWdub3JlQ2xlYXIgPSBmYWxzZSxcbiAgICAgIGZvcmNlUmVkcmF3LFxuICAgICAgc2NhbGVXaWR0aCxcbiAgICAgIHNjYWxlSGVpZ2h0LFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFlcbiAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIge1xuICAgICAgRlJBTUVSQVRFLFxuICAgICAgbW91c2VcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgZnJhbWVEdXJhdGlvbiA9IDEwMDAgLyBGUkFNRVJBVEU7XG4gICAgdGhpcy5mcmFtZUR1cmF0aW9uID0gZnJhbWVEdXJhdGlvbjtcbiAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlUmVhZHkgPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICB0aGlzLnJlbmRlcihlbGVtZW50LCBpZ25vcmVEaW1lbnNpb25zLCBpZ25vcmVDbGVhciwgc2NhbGVXaWR0aCwgc2NhbGVIZWlnaHQsIG9mZnNldFgsIG9mZnNldFkpO1xuICAgIH1cblxuICAgIGlmICghZW5hYmxlUmVkcmF3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgdmFyIHRoZW4gPSBub3c7XG4gICAgdmFyIGRlbHRhID0gMDtcblxuICAgIHZhciB0aWNrID0gKCkgPT4ge1xuICAgICAgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGRlbHRhID0gbm93IC0gdGhlbjtcblxuICAgICAgaWYgKGRlbHRhID49IGZyYW1lRHVyYXRpb24pIHtcbiAgICAgICAgdGhlbiA9IG5vdyAtIGRlbHRhICUgZnJhbWVEdXJhdGlvbjtcblxuICAgICAgICBpZiAodGhpcy5zaG91bGRVcGRhdGUoaWdub3JlQW5pbWF0aW9uLCBmb3JjZVJlZHJhdykpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcihlbGVtZW50LCBpZ25vcmVEaW1lbnNpb25zLCBpZ25vcmVDbGVhciwgc2NhbGVXaWR0aCwgc2NhbGVIZWlnaHQsIG9mZnNldFgsIG9mZnNldFkpO1xuICAgICAgICAgIG1vdXNlLnJ1bkV2ZW50cygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuXG4gICAgaWYgKCFpZ25vcmVNb3VzZSkge1xuICAgICAgbW91c2Uuc3RhcnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVydmFsSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gIH1cblxuICBzdG9wKCkge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZS5jYW5jZWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICAgIHRoaXMuaW50ZXJ2YWxJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5tb3VzZS5zdG9wKCk7XG4gIH1cblxuICBzaG91bGRVcGRhdGUoaWdub3JlQW5pbWF0aW9uLCBmb3JjZVJlZHJhdykge1xuICAgIC8vIG5lZWQgdXBkYXRlIGZyb20gYW5pbWF0aW9ucz9cbiAgICBpZiAoIWlnbm9yZUFuaW1hdGlvbikge1xuICAgICAgdmFyIHtcbiAgICAgICAgZnJhbWVEdXJhdGlvblxuICAgICAgfSA9IHRoaXM7XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlID0gdGhpcy5hbmltYXRpb25zLnJlZHVjZSgoc2hvdWxkVXBkYXRlLCBhbmltYXRpb24pID0+IGFuaW1hdGlvbi51cGRhdGUoZnJhbWVEdXJhdGlvbikgfHwgc2hvdWxkVXBkYXRlLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBuZWVkIHVwZGF0ZSBmcm9tIHJlZHJhdz9cblxuXG4gICAgaWYgKHR5cGVvZiBmb3JjZVJlZHJhdyA9PT0gJ2Z1bmN0aW9uJyAmJiBmb3JjZVJlZHJhdygpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNSZWFkeUxvY2sgJiYgdGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gbmVlZCB1cGRhdGUgZnJvbSBtb3VzZSBldmVudHM/XG5cblxuICAgIGlmICh0aGlzLm1vdXNlLmhhc0V2ZW50cygpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZW5kZXIoZWxlbWVudCwgaWdub3JlRGltZW5zaW9ucywgaWdub3JlQ2xlYXIsIHNjYWxlV2lkdGgsIHNjYWxlSGVpZ2h0LCBvZmZzZXRYLCBvZmZzZXRZKSB7XG4gICAgdmFyIHtcbiAgICAgIENMSUVOVF9XSURUSCxcbiAgICAgIENMSUVOVF9IRUlHSFQsXG4gICAgICB2aWV3UG9ydCxcbiAgICAgIGN0eCxcbiAgICAgIGlzRmlyc3RSZW5kZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgY2FudmFzID0gY3R4LmNhbnZhcztcbiAgICB2aWV3UG9ydC5jbGVhcigpO1xuXG4gICAgaWYgKGNhbnZhcy53aWR0aCAmJiBjYW52YXMuaGVpZ2h0KSB7XG4gICAgICB2aWV3UG9ydC5zZXRDdXJyZW50KGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpZXdQb3J0LnNldEN1cnJlbnQoQ0xJRU5UX1dJRFRILCBDTElFTlRfSEVJR0hUKTtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGhTdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3dpZHRoJyk7XG4gICAgdmFyIGhlaWdodFN0eWxlID0gZWxlbWVudC5nZXRTdHlsZSgnaGVpZ2h0Jyk7XG5cbiAgICBpZiAoIWlnbm9yZURpbWVuc2lvbnMgJiYgKGlzRmlyc3RSZW5kZXIgfHwgdHlwZW9mIHNjYWxlV2lkdGggIT09ICdudW1iZXInICYmIHR5cGVvZiBzY2FsZUhlaWdodCAhPT0gJ251bWJlcicpKSB7XG4gICAgICAvLyBzZXQgY2FudmFzIHNpemVcbiAgICAgIGlmICh3aWR0aFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGhTdHlsZS5nZXRQaXhlbHMoJ3gnKTtcblxuICAgICAgICBpZiAoY2FudmFzLnN0eWxlKSB7XG4gICAgICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoY2FudmFzLndpZHRoLCBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWlnaHRTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHRTdHlsZS5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgICBpZiAoY2FudmFzLnN0eWxlKSB7XG4gICAgICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KGNhbnZhcy5oZWlnaHQsIFwicHhcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY1dpZHRoID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IGNhbnZhcy53aWR0aDtcbiAgICB2YXIgY0hlaWdodCA9IGNhbnZhcy5jbGllbnRIZWlnaHQgfHwgY2FudmFzLmhlaWdodDtcblxuICAgIGlmIChpZ25vcmVEaW1lbnNpb25zICYmIHdpZHRoU3R5bGUuaGFzVmFsdWUoKSAmJiBoZWlnaHRTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICBjV2lkdGggPSB3aWR0aFN0eWxlLmdldFBpeGVscygneCcpO1xuICAgICAgY0hlaWdodCA9IGhlaWdodFN0eWxlLmdldFBpeGVscygneScpO1xuICAgIH1cblxuICAgIHZpZXdQb3J0LnNldEN1cnJlbnQoY1dpZHRoLCBjSGVpZ2h0KTtcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0WCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4JywgdHJ1ZSkuc2V0VmFsdWUob2Zmc2V0WCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXRZID09PSAnbnVtYmVyJykge1xuICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3knLCB0cnVlKS5zZXRWYWx1ZShvZmZzZXRZKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNjYWxlV2lkdGggPT09ICdudW1iZXInIHx8IHR5cGVvZiBzY2FsZUhlaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciB2aWV3Qm94ID0gdG9OdW1iZXJzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykuZ2V0U3RyaW5nKCkpO1xuICAgICAgdmFyIHhSYXRpbyA9IDA7XG4gICAgICB2YXIgeVJhdGlvID0gMDtcblxuICAgICAgaWYgKHR5cGVvZiBzY2FsZVdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgX3dpZHRoU3R5bGUgPSBlbGVtZW50LmdldFN0eWxlKCd3aWR0aCcpO1xuXG4gICAgICAgIGlmIChfd2lkdGhTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgeFJhdGlvID0gX3dpZHRoU3R5bGUuZ2V0UGl4ZWxzKCd4JykgLyBzY2FsZVdpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc05hTih2aWV3Qm94WzJdKSkge1xuICAgICAgICAgIHhSYXRpbyA9IHZpZXdCb3hbMl0gLyBzY2FsZVdpZHRoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NhbGVIZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBfaGVpZ2h0U3R5bGUgPSBlbGVtZW50LmdldFN0eWxlKCdoZWlnaHQnKTtcblxuICAgICAgICBpZiAoX2hlaWdodFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICB5UmF0aW8gPSBfaGVpZ2h0U3R5bGUuZ2V0UGl4ZWxzKCd5JykgLyBzY2FsZUhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOYU4odmlld0JveFszXSkpIHtcbiAgICAgICAgICB5UmF0aW8gPSB2aWV3Qm94WzNdIC8gc2NhbGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF4UmF0aW8pIHtcbiAgICAgICAgeFJhdGlvID0geVJhdGlvO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXlSYXRpbykge1xuICAgICAgICB5UmF0aW8gPSB4UmF0aW87XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3aWR0aCcsIHRydWUpLnNldFZhbHVlKHNjYWxlV2lkdGgpO1xuICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRydWUpLnNldFZhbHVlKHNjYWxlSGVpZ2h0KTtcbiAgICAgIHZhciB0cmFuc2Zvcm1TdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3RyYW5zZm9ybScsIHRydWUsIHRydWUpO1xuICAgICAgdHJhbnNmb3JtU3R5bGUuc2V0VmFsdWUoXCJcIi5jb25jYXQodHJhbnNmb3JtU3R5bGUuZ2V0U3RyaW5nKCksIFwiIHNjYWxlKFwiKS5jb25jYXQoMS4wIC8geFJhdGlvLCBcIiwgXCIpLmNvbmNhdCgxLjAgLyB5UmF0aW8sIFwiKVwiKSk7XG4gICAgfSAvLyBjbGVhciBhbmQgcmVuZGVyXG5cblxuICAgIGlmICghaWdub3JlQ2xlYXIpIHtcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY1dpZHRoLCBjSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBlbGVtZW50LnJlbmRlcihjdHgpO1xuXG4gICAgaWYgKGlzRmlyc3RSZW5kZXIpIHtcbiAgICAgIHRoaXMuaXNGaXJzdFJlbmRlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG59XG5TY3JlZW4uZGVmYXVsdFdpbmRvdyA9IGRlZmF1bHRXaW5kb3c7XG5TY3JlZW4uZGVmYXVsdEZldGNoID0gZGVmYXVsdEZldGNoJDE7XG5cbnZhciB7XG4gIGRlZmF1bHRGZXRjaFxufSA9IFNjcmVlbjtcbnZhciBEZWZhdWx0RE9NUGFyc2VyID0gdHlwZW9mIERPTVBhcnNlciAhPT0gJ3VuZGVmaW5lZCcgPyBET01QYXJzZXIgOiBudWxsO1xuY2xhc3MgUGFyc2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIHtcbiAgICAgIGZldGNoID0gZGVmYXVsdEZldGNoLFxuICAgICAgRE9NUGFyc2VyID0gRGVmYXVsdERPTVBhcnNlclxuICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHRoaXMuZmV0Y2ggPSBmZXRjaDtcbiAgICB0aGlzLkRPTVBhcnNlciA9IERPTVBhcnNlcjtcbiAgfVxuXG4gIHBhcnNlKHJlc291cmNlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKHJlc291cmNlLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgICByZXR1cm4gX3RoaXMucGFyc2VGcm9tU3RyaW5nKHJlc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLmxvYWQocmVzb3VyY2UpO1xuICAgIH0pKCk7XG4gIH1cblxuICBwYXJzZUZyb21TdHJpbmcoeG1sKSB7XG4gICAgdmFyIHBhcnNlciA9IG5ldyB0aGlzLkRPTVBhcnNlcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrRG9jdW1lbnQocGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWwsICdpbWFnZS9zdmcreG1sJykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tEb2N1bWVudChwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbCwgJ3RleHQveG1sJykpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRG9jdW1lbnQoZG9jdW1lbnQpIHtcbiAgICB2YXIgcGFyc2VyRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgncGFyc2VyZXJyb3InKVswXTtcblxuICAgIGlmIChwYXJzZXJFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHBhcnNlckVycm9yLnRleHRDb250ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnQ7XG4gIH1cblxuICBsb2FkKHVybCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgICB2YXIgcmVzcG9uc2UgPSB5aWVsZCBfdGhpczIuZmV0Y2godXJsKTtcbiAgICAgIHZhciB4bWwgPSB5aWVsZCByZXNwb25zZS50ZXh0KCk7XG4gICAgICByZXR1cm4gX3RoaXMyLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIH0pKCk7XG4gIH1cblxufVxuXG5jbGFzcyBUcmFuc2xhdGUge1xuICBjb25zdHJ1Y3RvcihfLCBwb2ludCkge1xuICAgIHRoaXMudHlwZSA9ICd0cmFuc2xhdGUnO1xuICAgIHRoaXMucG9pbnQgPSBudWxsO1xuICAgIHRoaXMucG9pbnQgPSBQb2ludC5wYXJzZShwb2ludCk7XG4gIH1cblxuICBhcHBseShjdHgpIHtcbiAgICB2YXIge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gdGhpcy5wb2ludDtcbiAgICBjdHgudHJhbnNsYXRlKHggfHwgMC4wLCB5IHx8IDAuMCk7XG4gIH1cblxuICB1bmFwcGx5KGN0eCkge1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB0aGlzLnBvaW50O1xuICAgIGN0eC50cmFuc2xhdGUoLTEuMCAqIHggfHwgMC4wLCAtMS4wICogeSB8fCAwLjApO1xuICB9XG5cbiAgYXBwbHlUb1BvaW50KHBvaW50KSB7XG4gICAgdmFyIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXMucG9pbnQ7XG4gICAgcG9pbnQuYXBwbHlUcmFuc2Zvcm0oWzEsIDAsIDAsIDEsIHggfHwgMC4wLCB5IHx8IDAuMF0pO1xuICB9XG5cbn1cblxuY2xhc3MgUm90YXRlIHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIHJvdGF0ZSwgdHJhbnNmb3JtT3JpZ2luKSB7XG4gICAgdGhpcy50eXBlID0gJ3JvdGF0ZSc7XG4gICAgdGhpcy5hbmdsZSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW5YID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpblkgPSBudWxsO1xuICAgIHRoaXMuY3ggPSAwO1xuICAgIHRoaXMuY3kgPSAwO1xuICAgIHZhciBudW1iZXJzID0gdG9OdW1iZXJzKHJvdGF0ZSk7XG4gICAgdGhpcy5hbmdsZSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2FuZ2xlJywgbnVtYmVyc1swXSk7XG4gICAgdGhpcy5vcmlnaW5YID0gdHJhbnNmb3JtT3JpZ2luWzBdO1xuICAgIHRoaXMub3JpZ2luWSA9IHRyYW5zZm9ybU9yaWdpblsxXTtcbiAgICB0aGlzLmN4ID0gbnVtYmVyc1sxXSB8fCAwO1xuICAgIHRoaXMuY3kgPSBudW1iZXJzWzJdIHx8IDA7XG4gIH1cblxuICBhcHBseShjdHgpIHtcbiAgICB2YXIge1xuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIG9yaWdpblgsXG4gICAgICBvcmlnaW5ZLFxuICAgICAgYW5nbGVcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgdHggPSBjeCArIG9yaWdpblguZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIHR5ID0gY3kgKyBvcmlnaW5ZLmdldFBpeGVscygneScpO1xuICAgIGN0eC50cmFuc2xhdGUodHgsIHR5KTtcbiAgICBjdHgucm90YXRlKGFuZ2xlLmdldFJhZGlhbnMoKSk7XG4gICAgY3R4LnRyYW5zbGF0ZSgtdHgsIC10eSk7XG4gIH1cblxuICB1bmFwcGx5KGN0eCkge1xuICAgIHZhciB7XG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgb3JpZ2luWCxcbiAgICAgIG9yaWdpblksXG4gICAgICBhbmdsZVxuICAgIH0gPSB0aGlzO1xuICAgIHZhciB0eCA9IGN4ICsgb3JpZ2luWC5nZXRQaXhlbHMoJ3gnKTtcbiAgICB2YXIgdHkgPSBjeSArIG9yaWdpblkuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgY3R4LnRyYW5zbGF0ZSh0eCwgdHkpO1xuICAgIGN0eC5yb3RhdGUoLTEuMCAqIGFuZ2xlLmdldFJhZGlhbnMoKSk7XG4gICAgY3R4LnRyYW5zbGF0ZSgtdHgsIC10eSk7XG4gIH1cblxuICBhcHBseVRvUG9pbnQocG9pbnQpIHtcbiAgICB2YXIge1xuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIGFuZ2xlXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHJhZCA9IGFuZ2xlLmdldFJhZGlhbnMoKTtcbiAgICBwb2ludC5hcHBseVRyYW5zZm9ybShbMSwgMCwgMCwgMSwgY3ggfHwgMC4wLCBjeSB8fCAwLjAgLy8gdGhpcy5wLnlcbiAgICBdKTtcbiAgICBwb2ludC5hcHBseVRyYW5zZm9ybShbTWF0aC5jb3MocmFkKSwgTWF0aC5zaW4ocmFkKSwgLU1hdGguc2luKHJhZCksIE1hdGguY29zKHJhZCksIDAsIDBdKTtcbiAgICBwb2ludC5hcHBseVRyYW5zZm9ybShbMSwgMCwgMCwgMSwgLWN4IHx8IDAuMCwgLWN5IHx8IDAuMCAvLyAtdGhpcy5wLnlcbiAgICBdKTtcbiAgfVxuXG59XG5cbmNsYXNzIFNjYWxlIHtcbiAgY29uc3RydWN0b3IoXywgc2NhbGUsIHRyYW5zZm9ybU9yaWdpbikge1xuICAgIHRoaXMudHlwZSA9ICdzY2FsZSc7XG4gICAgdGhpcy5zY2FsZSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW5YID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpblkgPSBudWxsO1xuICAgIHZhciBzY2FsZVNpemUgPSBQb2ludC5wYXJzZVNjYWxlKHNjYWxlKTsgLy8gV29ya2Fyb3VuZCBmb3Igbm9kZS1jYW52YXNcblxuICAgIGlmIChzY2FsZVNpemUueCA9PT0gMCB8fCBzY2FsZVNpemUueSA9PT0gMCkge1xuICAgICAgc2NhbGVTaXplLnggPSBQU0VVRE9fWkVSTztcbiAgICAgIHNjYWxlU2l6ZS55ID0gUFNFVURPX1pFUk87XG4gICAgfVxuXG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlU2l6ZTtcbiAgICB0aGlzLm9yaWdpblggPSB0cmFuc2Zvcm1PcmlnaW5bMF07XG4gICAgdGhpcy5vcmlnaW5ZID0gdHJhbnNmb3JtT3JpZ2luWzFdO1xuICB9XG5cbiAgYXBwbHkoY3R4KSB7XG4gICAgdmFyIHtcbiAgICAgIHNjYWxlOiB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0sXG4gICAgICBvcmlnaW5YLFxuICAgICAgb3JpZ2luWVxuICAgIH0gPSB0aGlzO1xuICAgIHZhciB0eCA9IG9yaWdpblguZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIHR5ID0gb3JpZ2luWS5nZXRQaXhlbHMoJ3knKTtcbiAgICBjdHgudHJhbnNsYXRlKHR4LCB0eSk7XG4gICAgY3R4LnNjYWxlKHgsIHkgfHwgeCk7XG4gICAgY3R4LnRyYW5zbGF0ZSgtdHgsIC10eSk7XG4gIH1cblxuICB1bmFwcGx5KGN0eCkge1xuICAgIHZhciB7XG4gICAgICBzY2FsZToge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9LFxuICAgICAgb3JpZ2luWCxcbiAgICAgIG9yaWdpbllcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgdHggPSBvcmlnaW5YLmdldFBpeGVscygneCcpO1xuICAgIHZhciB0eSA9IG9yaWdpblkuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgY3R4LnRyYW5zbGF0ZSh0eCwgdHkpO1xuICAgIGN0eC5zY2FsZSgxLjAgLyB4LCAxLjAgLyB5IHx8IHgpO1xuICAgIGN0eC50cmFuc2xhdGUoLXR4LCAtdHkpO1xuICB9XG5cbiAgYXBwbHlUb1BvaW50KHBvaW50KSB7XG4gICAgdmFyIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXMuc2NhbGU7XG4gICAgcG9pbnQuYXBwbHlUcmFuc2Zvcm0oW3ggfHwgMC4wLCAwLCAwLCB5IHx8IDAuMCwgMCwgMF0pO1xuICB9XG5cbn1cblxuY2xhc3MgTWF0cml4IHtcbiAgY29uc3RydWN0b3IoXywgbWF0cml4LCB0cmFuc2Zvcm1PcmlnaW4pIHtcbiAgICB0aGlzLnR5cGUgPSAnbWF0cml4JztcbiAgICB0aGlzLm1hdHJpeCA9IFtdO1xuICAgIHRoaXMub3JpZ2luWCA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW5ZID0gbnVsbDtcbiAgICB0aGlzLm1hdHJpeCA9IHRvTnVtYmVycyhtYXRyaXgpO1xuICAgIHRoaXMub3JpZ2luWCA9IHRyYW5zZm9ybU9yaWdpblswXTtcbiAgICB0aGlzLm9yaWdpblkgPSB0cmFuc2Zvcm1PcmlnaW5bMV07XG4gIH1cblxuICBhcHBseShjdHgpIHtcbiAgICB2YXIge1xuICAgICAgb3JpZ2luWCxcbiAgICAgIG9yaWdpblksXG4gICAgICBtYXRyaXhcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgdHggPSBvcmlnaW5YLmdldFBpeGVscygneCcpO1xuICAgIHZhciB0eSA9IG9yaWdpblkuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgY3R4LnRyYW5zbGF0ZSh0eCwgdHkpO1xuICAgIGN0eC50cmFuc2Zvcm0obWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7XG4gICAgY3R4LnRyYW5zbGF0ZSgtdHgsIC10eSk7XG4gIH1cblxuICB1bmFwcGx5KGN0eCkge1xuICAgIHZhciB7XG4gICAgICBvcmlnaW5YLFxuICAgICAgb3JpZ2luWSxcbiAgICAgIG1hdHJpeFxuICAgIH0gPSB0aGlzO1xuICAgIHZhciBhID0gbWF0cml4WzBdO1xuICAgIHZhciBiID0gbWF0cml4WzJdO1xuICAgIHZhciBjID0gbWF0cml4WzRdO1xuICAgIHZhciBkID0gbWF0cml4WzFdO1xuICAgIHZhciBlID0gbWF0cml4WzNdO1xuICAgIHZhciBmID0gbWF0cml4WzVdO1xuICAgIHZhciBnID0gMC4wO1xuICAgIHZhciBoID0gMC4wO1xuICAgIHZhciBpID0gMS4wO1xuICAgIHZhciBkZXQgPSAxIC8gKGEgKiAoZSAqIGkgLSBmICogaCkgLSBiICogKGQgKiBpIC0gZiAqIGcpICsgYyAqIChkICogaCAtIGUgKiBnKSk7XG4gICAgdmFyIHR4ID0gb3JpZ2luWC5nZXRQaXhlbHMoJ3gnKTtcbiAgICB2YXIgdHkgPSBvcmlnaW5ZLmdldFBpeGVscygneScpO1xuICAgIGN0eC50cmFuc2xhdGUodHgsIHR5KTtcbiAgICBjdHgudHJhbnNmb3JtKGRldCAqIChlICogaSAtIGYgKiBoKSwgZGV0ICogKGYgKiBnIC0gZCAqIGkpLCBkZXQgKiAoYyAqIGggLSBiICogaSksIGRldCAqIChhICogaSAtIGMgKiBnKSwgZGV0ICogKGIgKiBmIC0gYyAqIGUpLCBkZXQgKiAoYyAqIGQgLSBhICogZikpO1xuICAgIGN0eC50cmFuc2xhdGUoLXR4LCAtdHkpO1xuICB9XG5cbiAgYXBwbHlUb1BvaW50KHBvaW50KSB7XG4gICAgcG9pbnQuYXBwbHlUcmFuc2Zvcm0odGhpcy5tYXRyaXgpO1xuICB9XG5cbn1cblxuY2xhc3MgU2tldyBleHRlbmRzIE1hdHJpeCB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBza2V3LCB0cmFuc2Zvcm1PcmlnaW4pIHtcbiAgICBzdXBlcihkb2N1bWVudCwgc2tldywgdHJhbnNmb3JtT3JpZ2luKTtcbiAgICB0aGlzLnR5cGUgPSAnc2tldyc7XG4gICAgdGhpcy5hbmdsZSA9IG51bGw7XG4gICAgdGhpcy5hbmdsZSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2FuZ2xlJywgc2tldyk7XG4gIH1cblxufVxuXG5jbGFzcyBTa2V3WCBleHRlbmRzIFNrZXcge1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgc2tldywgdHJhbnNmb3JtT3JpZ2luKSB7XG4gICAgc3VwZXIoZG9jdW1lbnQsIHNrZXcsIHRyYW5zZm9ybU9yaWdpbik7XG4gICAgdGhpcy50eXBlID0gJ3NrZXdYJztcbiAgICB0aGlzLm1hdHJpeCA9IFsxLCAwLCBNYXRoLnRhbih0aGlzLmFuZ2xlLmdldFJhZGlhbnMoKSksIDEsIDAsIDBdO1xuICB9XG5cbn1cblxuY2xhc3MgU2tld1kgZXh0ZW5kcyBTa2V3IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIHNrZXcsIHRyYW5zZm9ybU9yaWdpbikge1xuICAgIHN1cGVyKGRvY3VtZW50LCBza2V3LCB0cmFuc2Zvcm1PcmlnaW4pO1xuICAgIHRoaXMudHlwZSA9ICdza2V3WSc7XG4gICAgdGhpcy5tYXRyaXggPSBbMSwgTWF0aC50YW4odGhpcy5hbmdsZS5nZXRSYWRpYW5zKCkpLCAwLCAxLCAwLCAwXTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3Jtcyh0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGNvbXByZXNzU3BhY2VzKHRyYW5zZm9ybSkudHJpbSgpLnJlcGxhY2UoL1xcKShbYS16QS1aXSkvZywgJykgJDEnKS5yZXBsYWNlKC9cXCkoXFxzPyxcXHM/KS9nLCAnKSAnKS5zcGxpdCgvXFxzKD89W2Etel0pLyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICB2YXIgW3R5cGUsIHZhbHVlXSA9IHRyYW5zZm9ybS5zcGxpdCgnKCcpO1xuICByZXR1cm4gW3R5cGUudHJpbSgpLCB2YWx1ZS50cmltKCkucmVwbGFjZSgnKScsICcnKV07XG59XG5cbmNsYXNzIFRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCB0cmFuc2Zvcm0sIHRyYW5zZm9ybU9yaWdpbikge1xuICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICB0aGlzLnRyYW5zZm9ybXMgPSBbXTtcbiAgICB2YXIgZGF0YSA9IHBhcnNlVHJhbnNmb3Jtcyh0cmFuc2Zvcm0pO1xuICAgIGRhdGEuZm9yRWFjaCh0cmFuc2Zvcm0gPT4ge1xuICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIFt0eXBlLCB2YWx1ZV0gPSBwYXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgdmFyIFRyYW5zZm9ybVR5cGUgPSBUcmFuc2Zvcm0udHJhbnNmb3JtVHlwZXNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgVHJhbnNmb3JtVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1zLnB1c2gobmV3IFRyYW5zZm9ybVR5cGUodGhpcy5kb2N1bWVudCwgdmFsdWUsIHRyYW5zZm9ybU9yaWdpbikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGZyb21FbGVtZW50KGRvY3VtZW50LCBlbGVtZW50KSB7XG4gICAgdmFyIHRyYW5zZm9ybVN0eWxlID0gZWxlbWVudC5nZXRTdHlsZSgndHJhbnNmb3JtJywgZmFsc2UsIHRydWUpO1xuICAgIHZhciBbdHJhbnNmb3JtT3JpZ2luWFByb3BlcnR5LCB0cmFuc2Zvcm1PcmlnaW5ZUHJvcGVydHkgPSB0cmFuc2Zvcm1PcmlnaW5YUHJvcGVydHldID0gZWxlbWVudC5nZXRTdHlsZSgndHJhbnNmb3JtLW9yaWdpbicsIGZhbHNlLCB0cnVlKS5zcGxpdCgpO1xuICAgIHZhciB0cmFuc2Zvcm1PcmlnaW4gPSBbdHJhbnNmb3JtT3JpZ2luWFByb3BlcnR5LCB0cmFuc2Zvcm1PcmlnaW5ZUHJvcGVydHldO1xuXG4gICAgaWYgKHRyYW5zZm9ybVN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKGRvY3VtZW50LCB0cmFuc2Zvcm1TdHlsZS5nZXRTdHJpbmcoKSwgdHJhbnNmb3JtT3JpZ2luKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFwcGx5KGN0eCkge1xuICAgIHZhciB7XG4gICAgICB0cmFuc2Zvcm1zXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIGxlbiA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgdHJhbnNmb3Jtc1tpXS5hcHBseShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIHVuYXBwbHkoY3R4KSB7XG4gICAgdmFyIHtcbiAgICAgIHRyYW5zZm9ybXNcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgbGVuID0gdHJhbnNmb3Jtcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRyYW5zZm9ybXNbaV0udW5hcHBseShjdHgpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBhcHBseVRvUG9pbnQgdW51c2VkIC4uLiByZW1vdmU/XG5cblxuICBhcHBseVRvUG9pbnQocG9pbnQpIHtcbiAgICB2YXIge1xuICAgICAgdHJhbnNmb3Jtc1xuICAgIH0gPSB0aGlzO1xuICAgIHZhciBsZW4gPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRyYW5zZm9ybXNbaV0uYXBwbHlUb1BvaW50KHBvaW50KTtcbiAgICB9XG4gIH1cblxufVxuVHJhbnNmb3JtLnRyYW5zZm9ybVR5cGVzID0ge1xuICB0cmFuc2xhdGU6IFRyYW5zbGF0ZSxcbiAgcm90YXRlOiBSb3RhdGUsXG4gIHNjYWxlOiBTY2FsZSxcbiAgbWF0cml4OiBNYXRyaXgsXG4gIHNrZXdYOiBTa2V3WCxcbiAgc2tld1k6IFNrZXdZXG59O1xuXG5jbGFzcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUpIHtcbiAgICB2YXIgY2FwdHVyZVRleHROb2RlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgdGhpcy5jYXB0dXJlVGV4dE5vZGVzID0gY2FwdHVyZVRleHROb2RlcztcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICB0aGlzLnN0eWxlcyA9IHt9O1xuICAgIHRoaXMuc3R5bGVzU3BlY2lmaWNpdHkgPSB7fTtcbiAgICB0aGlzLmFuaW1hdGlvbkZyb3plbiA9IGZhbHNlO1xuICAgIHRoaXMuYW5pbWF0aW9uRnJvemVuVmFsdWUgPSAnJztcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuXG4gICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgIC8vIEVMRU1FTlRfTk9ERVxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gYWRkIGF0dHJpYnV0ZXNcblxuXG4gICAgQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpLmZvckVhY2goYXR0cmlidXRlID0+IHtcbiAgICAgIHZhciBub2RlTmFtZSA9IG5vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlLm5vZGVOYW1lKTtcbiAgICAgIHRoaXMuYXR0cmlidXRlc1tub2RlTmFtZV0gPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkU3R5bGVzRnJvbVN0eWxlRGVmaW5pdGlvbigpOyAvLyBhZGQgaW5saW5lIHN0eWxlc1xuXG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpLmhhc1ZhbHVlKCkpIHtcbiAgICAgIHZhciBzdHlsZXMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnc3R5bGUnKS5nZXRTdHJpbmcoKS5zcGxpdCgnOycpLm1hcChfID0+IF8udHJpbSgpKTtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKHN0eWxlID0+IHtcbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBbbmFtZSwgdmFsdWVdID0gc3R5bGUuc3BsaXQoJzonKS5tYXAoXyA9PiBfLnRyaW0oKSk7XG4gICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIge1xuICAgICAgZGVmaW5pdGlvbnNcbiAgICB9ID0gZG9jdW1lbnQ7XG4gICAgdmFyIGlkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkJyk7IC8vIGFkZCBpZFxuXG4gICAgaWYgKGlkLmhhc1ZhbHVlKCkpIHtcbiAgICAgIGlmICghZGVmaW5pdGlvbnNbaWQuZ2V0U3RyaW5nKCldKSB7XG4gICAgICAgIGRlZmluaXRpb25zW2lkLmdldFN0cmluZygpXSA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLmZvckVhY2goY2hpbGROb2RlID0+IHtcbiAgICAgIGlmIChjaGlsZE5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgdGhpcy5hZGRDaGlsZChjaGlsZE5vZGUpOyAvLyBFTEVNRU5UX05PREVcbiAgICAgIH0gZWxzZSBpZiAoY2FwdHVyZVRleHROb2RlcyAmJiAoY2hpbGROb2RlLm5vZGVUeXBlID09PSAzIHx8IGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gNCkpIHtcbiAgICAgICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGROb2RlKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUuZ2V0VGV4dCgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmFkZENoaWxkKHRleHROb2RlKTsgLy8gVEVYVF9OT0RFXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgdmFyIGNyZWF0ZUlmTm90RXhpc3RzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICB2YXIgYXR0ciA9IHRoaXMuYXR0cmlidXRlc1tuYW1lXTtcblxuICAgIGlmICghYXR0ciAmJiBjcmVhdGVJZk5vdEV4aXN0cykge1xuICAgICAgdmFyIF9hdHRyID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsIG5hbWUsICcnKTtcblxuICAgICAgdGhpcy5hdHRyaWJ1dGVzW25hbWVdID0gX2F0dHI7XG4gICAgICByZXR1cm4gX2F0dHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHIgfHwgUHJvcGVydHkuZW1wdHkodGhpcy5kb2N1bWVudCk7XG4gIH1cblxuICBnZXRIcmVmQXR0cmlidXRlKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdocmVmJyB8fCBrZXkuZW5kc1dpdGgoJzpocmVmJykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9wZXJ0eS5lbXB0eSh0aGlzLmRvY3VtZW50KTtcbiAgfVxuXG4gIGdldFN0eWxlKG5hbWUpIHtcbiAgICB2YXIgY3JlYXRlSWZOb3RFeGlzdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBza2lwQW5jZXN0b3JzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLnN0eWxlc1tuYW1lXTtcblxuICAgIGlmIChzdHlsZSkge1xuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIHZhciBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICBpZiAoYXR0ciAhPT0gbnVsbCAmJiBhdHRyICE9PSB2b2lkIDAgJiYgYXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICB0aGlzLnN0eWxlc1tuYW1lXSA9IGF0dHI7IC8vIG1vdmUgdXAgdG8gbWUgdG8gY2FjaGVcblxuICAgICAgcmV0dXJuIGF0dHI7XG4gICAgfVxuXG4gICAgaWYgKCFza2lwQW5jZXN0b3JzKSB7XG4gICAgICB2YXIge1xuICAgICAgICBwYXJlbnRcbiAgICAgIH0gPSB0aGlzO1xuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHZhciBwYXJlbnRTdHlsZSA9IHBhcmVudC5nZXRTdHlsZShuYW1lKTtcblxuICAgICAgICBpZiAocGFyZW50U3R5bGUgIT09IG51bGwgJiYgcGFyZW50U3R5bGUgIT09IHZvaWQgMCAmJiBwYXJlbnRTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcmVudFN0eWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUlmTm90RXhpc3RzKSB7XG4gICAgICB2YXIgX3N0eWxlID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsIG5hbWUsICcnKTtcblxuICAgICAgdGhpcy5zdHlsZXNbbmFtZV0gPSBfc3R5bGU7XG4gICAgICByZXR1cm4gX3N0eWxlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZSB8fCBQcm9wZXJ0eS5lbXB0eSh0aGlzLmRvY3VtZW50KTtcbiAgfVxuXG4gIHJlbmRlcihjdHgpIHtcbiAgICAvLyBkb24ndCByZW5kZXIgZGlzcGxheT1ub25lXG4gICAgLy8gZG9uJ3QgcmVuZGVyIHZpc2liaWxpdHk9aGlkZGVuXG4gICAgaWYgKHRoaXMuZ2V0U3R5bGUoJ2Rpc3BsYXknKS5nZXRTdHJpbmcoKSA9PT0gJ25vbmUnIHx8IHRoaXMuZ2V0U3R5bGUoJ3Zpc2liaWxpdHknKS5nZXRTdHJpbmcoKSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdHguc2F2ZSgpO1xuXG4gICAgaWYgKHRoaXMuZ2V0U3R5bGUoJ21hc2snKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAvLyBtYXNrXG4gICAgICB2YXIgbWFzayA9IHRoaXMuZ2V0U3R5bGUoJ21hc2snKS5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgIHRoaXMuYXBwbHlFZmZlY3RzKGN0eCk7XG4gICAgICAgIG1hc2suYXBwbHkoY3R4LCB0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0U3R5bGUoJ2ZpbHRlcicpLmdldFZhbHVlKCdub25lJykgIT09ICdub25lJykge1xuICAgICAgLy8gZmlsdGVyXG4gICAgICB2YXIgZmlsdGVyID0gdGhpcy5nZXRTdHlsZSgnZmlsdGVyJykuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuYXBwbHlFZmZlY3RzKGN0eCk7XG4gICAgICAgIGZpbHRlci5hcHBseShjdHgsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldENvbnRleHQoY3R4KTtcbiAgICAgIHRoaXMucmVuZGVyQ2hpbGRyZW4oY3R4KTtcbiAgICAgIHRoaXMuY2xlYXJDb250ZXh0KGN0eCk7XG4gICAgfVxuXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIHNldENvbnRleHQoXykgey8vIE5PIFJFTkRFUlxuICB9XG5cbiAgYXBwbHlFZmZlY3RzKGN0eCkge1xuICAgIC8vIHRyYW5zZm9ybVxuICAgIHZhciB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZnJvbUVsZW1lbnQodGhpcy5kb2N1bWVudCwgdGhpcyk7XG5cbiAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICB0cmFuc2Zvcm0uYXBwbHkoY3R4KTtcbiAgICB9IC8vIGNsaXBcblxuXG4gICAgdmFyIGNsaXBQYXRoU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnY2xpcC1wYXRoJywgZmFsc2UsIHRydWUpO1xuXG4gICAgaWYgKGNsaXBQYXRoU3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgIHZhciBjbGlwID0gY2xpcFBhdGhTdHlsZVByb3AuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICBpZiAoY2xpcCkge1xuICAgICAgICBjbGlwLmFwcGx5KGN0eCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJDb250ZXh0KF8pIHsvLyBOTyBSRU5ERVJcbiAgfVxuXG4gIHJlbmRlckNoaWxkcmVuKGN0eCkge1xuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBjaGlsZC5yZW5kZXIoY3R4KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZENoaWxkKGNoaWxkTm9kZSkge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgPyBjaGlsZE5vZGUgOiB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY2hpbGROb2RlKTtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuXG4gICAgaWYgKCFFbGVtZW50Lmlnbm9yZUNoaWxkVHlwZXMuaW5jbHVkZXMoY2hpbGQudHlwZSkpIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgbWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgdmFyIF9ub2RlJGdldEF0dHJpYnV0ZTtcblxuICAgIHZhciB7XG4gICAgICBub2RlXG4gICAgfSA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIG5vZGUubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlQ2xhc3NlcyA9IChfbm9kZSRnZXRBdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZSkgPT09IG51bGwgfHwgX25vZGUkZ2V0QXR0cmlidXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZSRnZXRBdHRyaWJ1dGUuY2FsbChub2RlLCAnY2xhc3MnKTtcblxuICAgIGlmICghc3R5bGVDbGFzc2VzIHx8IHN0eWxlQ2xhc3NlcyA9PT0gJycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVDbGFzc2VzLnNwbGl0KCcgJykuc29tZShzdHlsZUNsYXNzID0+IFwiLlwiLmNvbmNhdChzdHlsZUNsYXNzKSA9PT0gc2VsZWN0b3IpO1xuICB9XG5cbiAgYWRkU3R5bGVzRnJvbVN0eWxlRGVmaW5pdGlvbigpIHtcbiAgICB2YXIge1xuICAgICAgc3R5bGVzLFxuICAgICAgc3R5bGVzU3BlY2lmaWNpdHlcbiAgICB9ID0gdGhpcy5kb2N1bWVudDtcblxuICAgIGZvciAodmFyIHNlbGVjdG9yIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzZWxlY3Rvci5zdGFydHNXaXRoKCdAJykgJiYgdGhpcy5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHN0eWxlc1tzZWxlY3Rvcl07XG4gICAgICAgIHZhciBzcGVjaWZpY2l0eSA9IHN0eWxlc1NwZWNpZmljaXR5W3NlbGVjdG9yXTtcblxuICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdTcGVjaWZpY2l0eSA9IHRoaXMuc3R5bGVzU3BlY2lmaWNpdHlbbmFtZV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdTcGVjaWZpY2l0eSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmdTcGVjaWZpY2l0eSA9ICcwMDAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3BlY2lmaWNpdHkgPj0gZXhpc3RpbmdTcGVjaWZpY2l0eSkge1xuICAgICAgICAgICAgICB0aGlzLnN0eWxlc1tuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgICAgICAgICAgICB0aGlzLnN0eWxlc1NwZWNpZmljaXR5W25hbWVdID0gc3BlY2lmaWNpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlU3R5bGVzKGVsZW1lbnQsIGlnbm9yZVN0eWxlcykge1xuICAgIHZhciB0b1Jlc3RvcmUgPSBpZ25vcmVTdHlsZXMucmVkdWNlKCh0b1Jlc3RvcmUsIG5hbWUpID0+IHtcbiAgICAgIHZhciBzdHlsZVByb3AgPSBlbGVtZW50LmdldFN0eWxlKG5hbWUpO1xuXG4gICAgICBpZiAoIXN0eWxlUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJldHVybiB0b1Jlc3RvcmU7XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IHN0eWxlUHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgIHN0eWxlUHJvcC5zZXRWYWx1ZSgnJyk7XG4gICAgICByZXR1cm4gWy4uLnRvUmVzdG9yZSwgW25hbWUsIHZhbHVlXV07XG4gICAgfSwgW10pO1xuICAgIHJldHVybiB0b1Jlc3RvcmU7XG4gIH1cblxuICByZXN0b3JlU3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIHN0eWxlcy5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgdmFyIFtuYW1lLCB2YWx1ZV0gPSBfcmVmO1xuICAgICAgZWxlbWVudC5nZXRTdHlsZShuYW1lLCB0cnVlKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpc0ZpcnN0Q2hpbGQoKSB7XG4gICAgdmFyIF90aGlzJHBhcmVudDtcblxuICAgIHJldHVybiAoKF90aGlzJHBhcmVudCA9IHRoaXMucGFyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpKSA9PT0gMDtcbiAgfVxuXG59XG5FbGVtZW50Lmlnbm9yZUNoaWxkVHlwZXMgPSBbJ3RpdGxlJ107XG5cbmNsYXNzIFVua25vd25FbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgc3VwZXIoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gd3JhcEZvbnRGYW1pbHkoZm9udEZhbWlseSkge1xuICB2YXIgdHJpbW1lZCA9IGZvbnRGYW1pbHkudHJpbSgpO1xuICByZXR1cm4gL14oJ3xcIikvLnRlc3QodHJpbW1lZCkgPyB0cmltbWVkIDogXCJcXFwiXCIuY29uY2F0KHRyaW1tZWQsIFwiXFxcIlwiKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUZvbnRGYW1pbHkoZm9udEZhbWlseSkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnID8gZm9udEZhbWlseSA6IGZvbnRGYW1pbHkudHJpbSgpLnNwbGl0KCcsJykubWFwKHdyYXBGb250RmFtaWx5KS5qb2luKCcsJyk7XG59XG4vKipcclxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnQtc3R5bGVcclxuICogQHBhcmFtIGZvbnRTdHlsZVxyXG4gKiBAcmV0dXJucyBDU1MgZm9udCBzdHlsZS5cclxuICovXG5cblxuZnVuY3Rpb24gcHJlcGFyZUZvbnRTdHlsZShmb250U3R5bGUpIHtcbiAgaWYgKCFmb250U3R5bGUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgdGFyZ2V0Rm9udFN0eWxlID0gZm9udFN0eWxlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHN3aXRjaCAodGFyZ2V0Rm9udFN0eWxlKSB7XG4gICAgY2FzZSAnbm9ybWFsJzpcbiAgICBjYXNlICdpdGFsaWMnOlxuICAgIGNhc2UgJ29ibGlxdWUnOlxuICAgIGNhc2UgJ2luaGVyaXQnOlxuICAgIGNhc2UgJ2luaXRpYWwnOlxuICAgIGNhc2UgJ3Vuc2V0JzpcbiAgICAgIHJldHVybiB0YXJnZXRGb250U3R5bGU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKC9eb2JsaXF1ZVxccysoLXwpXFxkK2RlZyQvLnRlc3QodGFyZ2V0Rm9udFN0eWxlKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0Rm9udFN0eWxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cbi8qKlxyXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udC13ZWlnaHRcclxuICogQHBhcmFtIGZvbnRXZWlnaHRcclxuICogQHJldHVybnMgQ1NTIGZvbnQgd2VpZ2h0LlxyXG4gKi9cblxuXG5mdW5jdGlvbiBwcmVwYXJlRm9udFdlaWdodChmb250V2VpZ2h0KSB7XG4gIGlmICghZm9udFdlaWdodCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciB0YXJnZXRGb250V2VpZ2h0ID0gZm9udFdlaWdodC50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICBzd2l0Y2ggKHRhcmdldEZvbnRXZWlnaHQpIHtcbiAgICBjYXNlICdub3JtYWwnOlxuICAgIGNhc2UgJ2JvbGQnOlxuICAgIGNhc2UgJ2xpZ2h0ZXInOlxuICAgIGNhc2UgJ2JvbGRlcic6XG4gICAgY2FzZSAnaW5oZXJpdCc6XG4gICAgY2FzZSAnaW5pdGlhbCc6XG4gICAgY2FzZSAndW5zZXQnOlxuICAgICAgcmV0dXJuIHRhcmdldEZvbnRXZWlnaHQ7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKC9eW1xcZC5dKyQvLnRlc3QodGFyZ2V0Rm9udFdlaWdodCkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldEZvbnRXZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5jbGFzcyBGb250IHtcbiAgY29uc3RydWN0b3IoZm9udFN0eWxlLCBmb250VmFyaWFudCwgZm9udFdlaWdodCwgZm9udFNpemUsIGZvbnRGYW1pbHksIGluaGVyaXQpIHtcbiAgICB2YXIgaW5oZXJpdEZvbnQgPSBpbmhlcml0ID8gdHlwZW9mIGluaGVyaXQgPT09ICdzdHJpbmcnID8gRm9udC5wYXJzZShpbmhlcml0KSA6IGluaGVyaXQgOiB7fTtcbiAgICB0aGlzLmZvbnRGYW1pbHkgPSBmb250RmFtaWx5IHx8IGluaGVyaXRGb250LmZvbnRGYW1pbHk7XG4gICAgdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplIHx8IGluaGVyaXRGb250LmZvbnRTaXplO1xuICAgIHRoaXMuZm9udFN0eWxlID0gZm9udFN0eWxlIHx8IGluaGVyaXRGb250LmZvbnRTdHlsZTtcbiAgICB0aGlzLmZvbnRXZWlnaHQgPSBmb250V2VpZ2h0IHx8IGluaGVyaXRGb250LmZvbnRXZWlnaHQ7XG4gICAgdGhpcy5mb250VmFyaWFudCA9IGZvbnRWYXJpYW50IHx8IGluaGVyaXRGb250LmZvbnRWYXJpYW50O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlKCkge1xuICAgIHZhciBmb250ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICB2YXIgaW5oZXJpdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBmb250U3R5bGUgPSAnJztcbiAgICB2YXIgZm9udFZhcmlhbnQgPSAnJztcbiAgICB2YXIgZm9udFdlaWdodCA9ICcnO1xuICAgIHZhciBmb250U2l6ZSA9ICcnO1xuICAgIHZhciBmb250RmFtaWx5ID0gJyc7XG4gICAgdmFyIHBhcnRzID0gY29tcHJlc3NTcGFjZXMoZm9udCkudHJpbSgpLnNwbGl0KCcgJyk7XG4gICAgdmFyIHNldCA9IHtcbiAgICAgIGZvbnRTaXplOiBmYWxzZSxcbiAgICAgIGZvbnRTdHlsZTogZmFsc2UsXG4gICAgICBmb250V2VpZ2h0OiBmYWxzZSxcbiAgICAgIGZvbnRWYXJpYW50OiBmYWxzZVxuICAgIH07XG4gICAgcGFydHMuZm9yRWFjaChwYXJ0ID0+IHtcbiAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlICFzZXQuZm9udFN0eWxlICYmIEZvbnQuc3R5bGVzLmluY2x1ZGVzKHBhcnQpOlxuICAgICAgICAgIGlmIChwYXJ0ICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGZvbnRTdHlsZSA9IHBhcnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0LmZvbnRTdHlsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAhc2V0LmZvbnRWYXJpYW50ICYmIEZvbnQudmFyaWFudHMuaW5jbHVkZXMocGFydCk6XG4gICAgICAgICAgaWYgKHBhcnQgIT09ICdpbmhlcml0Jykge1xuICAgICAgICAgICAgZm9udFZhcmlhbnQgPSBwYXJ0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldC5mb250U3R5bGUgPSB0cnVlO1xuICAgICAgICAgIHNldC5mb250VmFyaWFudCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAhc2V0LmZvbnRXZWlnaHQgJiYgRm9udC53ZWlnaHRzLmluY2x1ZGVzKHBhcnQpOlxuICAgICAgICAgIGlmIChwYXJ0ICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBwYXJ0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldC5mb250U3R5bGUgPSB0cnVlO1xuICAgICAgICAgIHNldC5mb250VmFyaWFudCA9IHRydWU7XG4gICAgICAgICAgc2V0LmZvbnRXZWlnaHQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgIXNldC5mb250U2l6ZTpcbiAgICAgICAgICBpZiAocGFydCAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICBbZm9udFNpemVdID0gcGFydC5zcGxpdCgnLycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldC5mb250U3R5bGUgPSB0cnVlO1xuICAgICAgICAgIHNldC5mb250VmFyaWFudCA9IHRydWU7XG4gICAgICAgICAgc2V0LmZvbnRXZWlnaHQgPSB0cnVlO1xuICAgICAgICAgIHNldC5mb250U2l6ZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAocGFydCAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICBmb250RmFtaWx5ICs9IHBhcnQ7XG4gICAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBGb250KGZvbnRTdHlsZSwgZm9udFZhcmlhbnQsIGZvbnRXZWlnaHQsIGZvbnRTaXplLCBmb250RmFtaWx5LCBpbmhlcml0KTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBbcHJlcGFyZUZvbnRTdHlsZSh0aGlzLmZvbnRTdHlsZSksIHRoaXMuZm9udFZhcmlhbnQsIHByZXBhcmVGb250V2VpZ2h0KHRoaXMuZm9udFdlaWdodCksIHRoaXMuZm9udFNpemUsIC8vIFdyYXAgZm9udEZhbWlseSBvbmx5IG9uIG5vZGVqcyBhbmQgb25seSBmb3IgY2FudmFzLmN0eFxuICAgIHByZXBhcmVGb250RmFtaWx5KHRoaXMuZm9udEZhbWlseSldLmpvaW4oJyAnKS50cmltKCk7XG4gIH1cblxufVxuRm9udC5zdHlsZXMgPSAnbm9ybWFsfGl0YWxpY3xvYmxpcXVlfGluaGVyaXQnO1xuRm9udC52YXJpYW50cyA9ICdub3JtYWx8c21hbGwtY2Fwc3xpbmhlcml0JztcbkZvbnQud2VpZ2h0cyA9ICdub3JtYWx8Ym9sZHxib2xkZXJ8bGlnaHRlcnwxMDB8MjAwfDMwMHw0MDB8NTAwfDYwMHw3MDB8ODAwfDkwMHxpbmhlcml0JztcblxuY2xhc3MgQm91bmRpbmdCb3gge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IE51bWJlci5OYU47XG4gICAgdmFyIHkxID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBOdW1iZXIuTmFOO1xuICAgIHZhciB4MiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogTnVtYmVyLk5hTjtcbiAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IE51bWJlci5OYU47XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICAgIHRoaXMuYWRkUG9pbnQoeDEsIHkxKTtcbiAgICB0aGlzLmFkZFBvaW50KHgyLCB5Mik7XG4gIH1cblxuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy54MTtcbiAgfVxuXG4gIGdldCB5KCkge1xuICAgIHJldHVybiB0aGlzLnkxO1xuICB9XG5cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLngyIC0gdGhpcy54MTtcbiAgfVxuXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMueTIgLSB0aGlzLnkxO1xuICB9XG5cbiAgYWRkUG9pbnQoeCwgeSkge1xuICAgIGlmICh0eXBlb2YgeCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChpc05hTih0aGlzLngxKSB8fCBpc05hTih0aGlzLngyKSkge1xuICAgICAgICB0aGlzLngxID0geDtcbiAgICAgICAgdGhpcy54MiA9IHg7XG4gICAgICB9XG5cbiAgICAgIGlmICh4IDwgdGhpcy54MSkge1xuICAgICAgICB0aGlzLngxID0geDtcbiAgICAgIH1cblxuICAgICAgaWYgKHggPiB0aGlzLngyKSB7XG4gICAgICAgIHRoaXMueDIgPSB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChpc05hTih0aGlzLnkxKSB8fCBpc05hTih0aGlzLnkyKSkge1xuICAgICAgICB0aGlzLnkxID0geTtcbiAgICAgICAgdGhpcy55MiA9IHk7XG4gICAgICB9XG5cbiAgICAgIGlmICh5IDwgdGhpcy55MSkge1xuICAgICAgICB0aGlzLnkxID0geTtcbiAgICAgIH1cblxuICAgICAgaWYgKHkgPiB0aGlzLnkyKSB7XG4gICAgICAgIHRoaXMueTIgPSB5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFgoeCkge1xuICAgIHRoaXMuYWRkUG9pbnQoeCwgbnVsbCk7XG4gIH1cblxuICBhZGRZKHkpIHtcbiAgICB0aGlzLmFkZFBvaW50KG51bGwsIHkpO1xuICB9XG5cbiAgYWRkQm91bmRpbmdCb3goYm91bmRpbmdCb3gpIHtcbiAgICBpZiAoIWJvdW5kaW5nQm94KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHtcbiAgICAgIHgxLFxuICAgICAgeTEsXG4gICAgICB4MixcbiAgICAgIHkyXG4gICAgfSA9IGJvdW5kaW5nQm94O1xuICAgIHRoaXMuYWRkUG9pbnQoeDEsIHkxKTtcbiAgICB0aGlzLmFkZFBvaW50KHgyLCB5Mik7XG4gIH1cblxuICBzdW1DdWJpYyh0LCBwMCwgcDEsIHAyLCBwMykge1xuICAgIHJldHVybiBNYXRoLnBvdygxIC0gdCwgMykgKiBwMCArIDMgKiBNYXRoLnBvdygxIC0gdCwgMikgKiB0ICogcDEgKyAzICogKDEgLSB0KSAqIE1hdGgucG93KHQsIDIpICogcDIgKyBNYXRoLnBvdyh0LCAzKSAqIHAzO1xuICB9XG5cbiAgYmV6aWVyQ3VydmVBZGQoZm9yWCwgcDAsIHAxLCBwMiwgcDMpIHtcbiAgICB2YXIgYiA9IDYgKiBwMCAtIDEyICogcDEgKyA2ICogcDI7XG4gICAgdmFyIGEgPSAtMyAqIHAwICsgOSAqIHAxIC0gOSAqIHAyICsgMyAqIHAzO1xuICAgIHZhciBjID0gMyAqIHAxIC0gMyAqIHAwO1xuXG4gICAgaWYgKGEgPT09IDApIHtcbiAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHQgPSAtYyAvIGI7XG5cbiAgICAgIGlmICgwIDwgdCAmJiB0IDwgMSkge1xuICAgICAgICBpZiAoZm9yWCkge1xuICAgICAgICAgIHRoaXMuYWRkWCh0aGlzLnN1bUN1YmljKHQsIHAwLCBwMSwgcDIsIHAzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hZGRZKHRoaXMuc3VtQ3ViaWModCwgcDAsIHAxLCBwMiwgcDMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGIyYWMgPSBNYXRoLnBvdyhiLCAyKSAtIDQgKiBjICogYTtcblxuICAgIGlmIChiMmFjIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChiMmFjKSkgLyAoMiAqIGEpO1xuXG4gICAgaWYgKDAgPCB0MSAmJiB0MSA8IDEpIHtcbiAgICAgIGlmIChmb3JYKSB7XG4gICAgICAgIHRoaXMuYWRkWCh0aGlzLnN1bUN1YmljKHQxLCBwMCwgcDEsIHAyLCBwMykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRZKHRoaXMuc3VtQ3ViaWModDEsIHAwLCBwMSwgcDIsIHAzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIyYWMpKSAvICgyICogYSk7XG5cbiAgICBpZiAoMCA8IHQyICYmIHQyIDwgMSkge1xuICAgICAgaWYgKGZvclgpIHtcbiAgICAgICAgdGhpcy5hZGRYKHRoaXMuc3VtQ3ViaWModDIsIHAwLCBwMSwgcDIsIHAzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFkodGhpcy5zdW1DdWJpYyh0MiwgcDAsIHAxLCBwMiwgcDMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gZnJvbSBodHRwOi8vYmxvZy5oYWNrZXJzLWNhZmUubmV0LzIwMDkvMDYvaG93LXRvLWNhbGN1bGF0ZS1iZXppZXItY3VydmVzLWJvdW5kaW5nLmh0bWxcblxuXG4gIGFkZEJlemllckN1cnZlKHAweCwgcDB5LCBwMXgsIHAxeSwgcDJ4LCBwMnksIHAzeCwgcDN5KSB7XG4gICAgdGhpcy5hZGRQb2ludChwMHgsIHAweSk7XG4gICAgdGhpcy5hZGRQb2ludChwM3gsIHAzeSk7XG4gICAgdGhpcy5iZXppZXJDdXJ2ZUFkZCh0cnVlLCBwMHgsIHAxeCwgcDJ4LCBwM3gpO1xuICAgIHRoaXMuYmV6aWVyQ3VydmVBZGQoZmFsc2UsIHAweSwgcDF5LCBwMnksIHAzeSk7XG4gIH1cblxuICBhZGRRdWFkcmF0aWNDdXJ2ZShwMHgsIHAweSwgcDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgdmFyIGNwMXggPSBwMHggKyAyIC8gMyAqIChwMXggLSBwMHgpOyAvLyBDUDEgPSBRUDAgKyAyLzMgKihRUDEtUVAwKVxuXG4gICAgdmFyIGNwMXkgPSBwMHkgKyAyIC8gMyAqIChwMXkgLSBwMHkpOyAvLyBDUDEgPSBRUDAgKyAyLzMgKihRUDEtUVAwKVxuXG4gICAgdmFyIGNwMnggPSBjcDF4ICsgMSAvIDMgKiAocDJ4IC0gcDB4KTsgLy8gQ1AyID0gQ1AxICsgMS8zICooUVAyLVFQMClcblxuICAgIHZhciBjcDJ5ID0gY3AxeSArIDEgLyAzICogKHAyeSAtIHAweSk7IC8vIENQMiA9IENQMSArIDEvMyAqKFFQMi1RUDApXG5cbiAgICB0aGlzLmFkZEJlemllckN1cnZlKHAweCwgcDB5LCBjcDF4LCBjcDJ4LCBjcDF5LCBjcDJ5LCBwMngsIHAyeSk7XG4gIH1cblxuICBpc1BvaW50SW5Cb3goeCwgeSkge1xuICAgIHZhciB7XG4gICAgICB4MSxcbiAgICAgIHkxLFxuICAgICAgeDIsXG4gICAgICB5MlxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiB4MSA8PSB4ICYmIHggPD0geDIgJiYgeTEgPD0geSAmJiB5IDw9IHkyO1xuICB9XG5cbn1cblxuY2xhc3MgUGF0aFBhcnNlciBleHRlbmRzIFNWR1BhdGhEYXRhIHtcbiAgY29uc3RydWN0b3IocGF0aCkge1xuICAgIHN1cGVyKHBhdGggLy8gRml4IHNwYWNlcyBhZnRlciBzaWducy5cbiAgICAucmVwbGFjZSgvKFsrXFwtLl0pXFxzKy9nbSwgJyQxJykgLy8gUmVtb3ZlIGludmFsaWQgcGFydC5cbiAgICAucmVwbGFjZSgvW15NbVp6TGxIaFZ2Q2NTc1FxVHRBYWVcXGRcXHMuLCstXS4qL2csICcnKSk7XG4gICAgdGhpcy5jb250cm9sID0gbnVsbDtcbiAgICB0aGlzLnN0YXJ0ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuY29tbWFuZCA9IG51bGw7XG4gICAgdGhpcy5jb21tYW5kcyA9IHRoaXMuY29tbWFuZHM7XG4gICAgdGhpcy5pID0gLTE7XG4gICAgdGhpcy5wcmV2aW91c0NvbW1hbmQgPSBudWxsO1xuICAgIHRoaXMucG9pbnRzID0gW107XG4gICAgdGhpcy5hbmdsZXMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuaSA9IC0xO1xuICAgIHRoaXMuY29tbWFuZCA9IG51bGw7XG4gICAgdGhpcy5wcmV2aW91c0NvbW1hbmQgPSBudWxsO1xuICAgIHRoaXMuc3RhcnQgPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgdGhpcy5jb250cm9sID0gbmV3IFBvaW50KDAsIDApO1xuICAgIHRoaXMuY3VycmVudCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICB0aGlzLnBvaW50cyA9IFtdO1xuICAgIHRoaXMuYW5nbGVzID0gW107XG4gIH1cblxuICBpc0VuZCgpIHtcbiAgICB2YXIge1xuICAgICAgaSxcbiAgICAgIGNvbW1hbmRzXG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuIGkgPj0gY29tbWFuZHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIG5leHQoKSB7XG4gICAgdmFyIGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRzWysrdGhpcy5pXTtcbiAgICB0aGlzLnByZXZpb3VzQ29tbWFuZCA9IHRoaXMuY29tbWFuZDtcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgIHJldHVybiBjb21tYW5kO1xuICB9XG5cbiAgZ2V0UG9pbnQoKSB7XG4gICAgdmFyIHhQcm9wID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAneCc7XG4gICAgdmFyIHlQcm9wID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAneSc7XG4gICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHRoaXMuY29tbWFuZFt4UHJvcF0sIHRoaXMuY29tbWFuZFt5UHJvcF0pO1xuICAgIHJldHVybiB0aGlzLm1ha2VBYnNvbHV0ZShwb2ludCk7XG4gIH1cblxuICBnZXRBc0NvbnRyb2xQb2ludCh4UHJvcCwgeVByb3ApIHtcbiAgICB2YXIgcG9pbnQgPSB0aGlzLmdldFBvaW50KHhQcm9wLCB5UHJvcCk7XG4gICAgdGhpcy5jb250cm9sID0gcG9pbnQ7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9XG5cbiAgZ2V0QXNDdXJyZW50UG9pbnQoeFByb3AsIHlQcm9wKSB7XG4gICAgdmFyIHBvaW50ID0gdGhpcy5nZXRQb2ludCh4UHJvcCwgeVByb3ApO1xuICAgIHRoaXMuY3VycmVudCA9IHBvaW50O1xuICAgIHJldHVybiBwb2ludDtcbiAgfVxuXG4gIGdldFJlZmxlY3RlZENvbnRyb2xQb2ludCgpIHtcbiAgICB2YXIgcHJldmlvdXNDb21tYW5kID0gdGhpcy5wcmV2aW91c0NvbW1hbmQudHlwZTtcblxuICAgIGlmIChwcmV2aW91c0NvbW1hbmQgIT09IFNWR1BhdGhEYXRhLkNVUlZFX1RPICYmIHByZXZpb3VzQ29tbWFuZCAhPT0gU1ZHUGF0aERhdGEuU01PT1RIX0NVUlZFX1RPICYmIHByZXZpb3VzQ29tbWFuZCAhPT0gU1ZHUGF0aERhdGEuUVVBRF9UTyAmJiBwcmV2aW91c0NvbW1hbmQgIT09IFNWR1BhdGhEYXRhLlNNT09USF9RVUFEX1RPKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuICAgIH0gLy8gcmVmbGVjdCBwb2ludFxuXG5cbiAgICB2YXIge1xuICAgICAgY3VycmVudDoge1xuICAgICAgICB4OiBjeCxcbiAgICAgICAgeTogY3lcbiAgICAgIH0sXG4gICAgICBjb250cm9sOiB7XG4gICAgICAgIHg6IG94LFxuICAgICAgICB5OiBveVxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIHZhciBwb2ludCA9IG5ldyBQb2ludCgyICogY3ggLSBveCwgMiAqIGN5IC0gb3kpO1xuICAgIHJldHVybiBwb2ludDtcbiAgfVxuXG4gIG1ha2VBYnNvbHV0ZShwb2ludCkge1xuICAgIGlmICh0aGlzLmNvbW1hbmQucmVsYXRpdmUpIHtcbiAgICAgIHZhciB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBwb2ludC54ICs9IHg7XG4gICAgICBwb2ludC55ICs9IHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50O1xuICB9XG5cbiAgYWRkTWFya2VyKHBvaW50LCBmcm9tLCBwcmlvclRvKSB7XG4gICAgdmFyIHtcbiAgICAgIHBvaW50cyxcbiAgICAgIGFuZ2xlc1xuICAgIH0gPSB0aGlzOyAvLyBpZiB0aGUgbGFzdCBhbmdsZSBpc24ndCBmaWxsZWQgaW4gYmVjYXVzZSB3ZSBkaWRuJ3QgaGF2ZSB0aGlzIHBvaW50IHlldCAuLi5cblxuICAgIGlmIChwcmlvclRvICYmIGFuZ2xlcy5sZW5ndGggPiAwICYmICFhbmdsZXNbYW5nbGVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBhbmdsZXNbYW5nbGVzLmxlbmd0aCAtIDFdID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXS5hbmdsZVRvKHByaW9yVG8pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkTWFya2VyQW5nbGUocG9pbnQsIGZyb20gPyBmcm9tLmFuZ2xlVG8ocG9pbnQpIDogbnVsbCk7XG4gIH1cblxuICBhZGRNYXJrZXJBbmdsZShwb2ludCwgYW5nbGUpIHtcbiAgICB0aGlzLnBvaW50cy5wdXNoKHBvaW50KTtcbiAgICB0aGlzLmFuZ2xlcy5wdXNoKGFuZ2xlKTtcbiAgfVxuXG4gIGdldE1hcmtlclBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludHM7XG4gIH1cblxuICBnZXRNYXJrZXJBbmdsZXMoKSB7XG4gICAgdmFyIHtcbiAgICAgIGFuZ2xlc1xuICAgIH0gPSB0aGlzO1xuICAgIHZhciBsZW4gPSBhbmdsZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKCFhbmdsZXNbaV0pIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBpZiAoYW5nbGVzW2pdKSB7XG4gICAgICAgICAgICBhbmdsZXNbaV0gPSBhbmdsZXNbal07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYW5nbGVzO1xuICB9XG5cbn1cblxuY2xhc3MgUmVuZGVyZWRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5tb2RpZmllZEVtU2l6ZVN0YWNrID0gZmFsc2U7XG4gIH1cblxuICBjYWxjdWxhdGVPcGFjaXR5KCkge1xuICAgIHZhciBvcGFjaXR5ID0gMS4wOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXMsIGNvbnNpc3RlbnQtdGhpc1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzO1xuXG4gICAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvcGFjaXR5U3R5bGUgPSBlbGVtZW50LmdldFN0eWxlKCdvcGFjaXR5JywgZmFsc2UsIHRydWUpOyAvLyBubyBhbmNlc3RvcnMgb24gc3R5bGUgY2FsbFxuXG4gICAgICBpZiAob3BhY2l0eVN0eWxlLmhhc1ZhbHVlKHRydWUpKSB7XG4gICAgICAgIG9wYWNpdHkgKj0gb3BhY2l0eVN0eWxlLmdldE51bWJlcigpO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wYWNpdHk7XG4gIH1cblxuICBzZXRDb250ZXh0KGN0eCkge1xuICAgIHZhciBmcm9tTWVhc3VyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgICBpZiAoIWZyb21NZWFzdXJlKSB7XG4gICAgICAvLyBjYXVzZXMgc3RhY2sgb3ZlcmZsb3cgd2hlbiBtZWFzdXJpbmcgdGV4dCB3aXRoIGdyYWRpZW50c1xuICAgICAgLy8gZmlsbFxuICAgICAgdmFyIGZpbGxTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmaWxsJyk7XG4gICAgICB2YXIgZmlsbE9wYWNpdHlTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmaWxsLW9wYWNpdHknKTtcbiAgICAgIHZhciBzdHJva2VTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdzdHJva2UnKTtcbiAgICAgIHZhciBzdHJva2VPcGFjaXR5UHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS1vcGFjaXR5Jyk7XG5cbiAgICAgIGlmIChmaWxsU3R5bGVQcm9wLmlzVXJsRGVmaW5pdGlvbigpKSB7XG4gICAgICAgIHZhciBmaWxsU3R5bGUgPSBmaWxsU3R5bGVQcm9wLmdldEZpbGxTdHlsZURlZmluaXRpb24odGhpcywgZmlsbE9wYWNpdHlTdHlsZVByb3ApO1xuXG4gICAgICAgIGlmIChmaWxsU3R5bGUpIHtcbiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpbGxTdHlsZVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgICBpZiAoZmlsbFN0eWxlUHJvcC5nZXRTdHJpbmcoKSA9PT0gJ2N1cnJlbnRDb2xvcicpIHtcbiAgICAgICAgICBmaWxsU3R5bGVQcm9wLnNldFZhbHVlKHRoaXMuZ2V0U3R5bGUoJ2NvbG9yJykuZ2V0Q29sb3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZpbGxTdHlsZSA9IGZpbGxTdHlsZVByb3AuZ2V0Q29sb3IoKTtcblxuICAgICAgICBpZiAoX2ZpbGxTdHlsZSAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IF9maWxsU3R5bGUgPT09ICdub25lJyA/ICdyZ2JhKDAsMCwwLDApJyA6IF9maWxsU3R5bGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGxPcGFjaXR5U3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdmFyIF9maWxsU3R5bGUyID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdmaWxsJywgY3R4LmZpbGxTdHlsZSkuYWRkT3BhY2l0eShmaWxsT3BhY2l0eVN0eWxlUHJvcCkuZ2V0Q29sb3IoKTtcblxuICAgICAgICBjdHguZmlsbFN0eWxlID0gX2ZpbGxTdHlsZTI7XG4gICAgICB9IC8vIHN0cm9rZVxuXG5cbiAgICAgIGlmIChzdHJva2VTdHlsZVByb3AuaXNVcmxEZWZpbml0aW9uKCkpIHtcbiAgICAgICAgdmFyIHN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGVQcm9wLmdldEZpbGxTdHlsZURlZmluaXRpb24odGhpcywgc3Ryb2tlT3BhY2l0eVByb3ApO1xuXG4gICAgICAgIGlmIChzdHJva2VTdHlsZSkge1xuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cm9rZVN0eWxlUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGlmIChzdHJva2VTdHlsZVByb3AuZ2V0U3RyaW5nKCkgPT09ICdjdXJyZW50Q29sb3InKSB7XG4gICAgICAgICAgc3Ryb2tlU3R5bGVQcm9wLnNldFZhbHVlKHRoaXMuZ2V0U3R5bGUoJ2NvbG9yJykuZ2V0Q29sb3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGVQcm9wLmdldFN0cmluZygpO1xuXG4gICAgICAgIGlmIChfc3Ryb2tlU3R5bGUgIT09ICdpbmhlcml0Jykge1xuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IF9zdHJva2VTdHlsZSA9PT0gJ25vbmUnID8gJ3JnYmEoMCwwLDAsMCknIDogX3N0cm9rZVN0eWxlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJva2VPcGFjaXR5UHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHZhciBfc3Ryb2tlU3R5bGUyID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdzdHJva2UnLCBjdHguc3Ryb2tlU3R5bGUpLmFkZE9wYWNpdHkoc3Ryb2tlT3BhY2l0eVByb3ApLmdldFN0cmluZygpO1xuXG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IF9zdHJva2VTdHlsZTI7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHJva2VXaWR0aFN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS13aWR0aCcpO1xuXG4gICAgICBpZiAoc3Ryb2tlV2lkdGhTdHlsZVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgICB2YXIgbmV3TGluZVdpZHRoID0gc3Ryb2tlV2lkdGhTdHlsZVByb3AuZ2V0UGl4ZWxzKCk7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSAhbmV3TGluZVdpZHRoID8gUFNFVURPX1pFUk8gLy8gYnJvd3NlcnMgZG9uJ3QgcmVzcGVjdCAwIChvciBub2RlLWNhbnZhcz8gOi0pXG4gICAgICAgIDogbmV3TGluZVdpZHRoO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3Ryb2tlTGluZWNhcFN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS1saW5lY2FwJyk7XG4gICAgICB2YXIgc3Ryb2tlTGluZWpvaW5TdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdzdHJva2UtbGluZWpvaW4nKTtcbiAgICAgIHZhciBzdHJva2VNaXRlcmxpbWl0UHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS1taXRlcmxpbWl0Jyk7IC8vIE5FRUQgVEVTVFxuICAgICAgLy8gY29uc3QgcG9pbnRPcmRlclN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3BhaW50LW9yZGVyJyk7XG5cbiAgICAgIHZhciBzdHJva2VEYXNoYXJyYXlTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdzdHJva2UtZGFzaGFycmF5Jyk7XG4gICAgICB2YXIgc3Ryb2tlRGFzaG9mZnNldFByb3AgPSB0aGlzLmdldFN0eWxlKCdzdHJva2UtZGFzaG9mZnNldCcpO1xuXG4gICAgICBpZiAoc3Ryb2tlTGluZWNhcFN0eWxlUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGN0eC5saW5lQ2FwID0gc3Ryb2tlTGluZWNhcFN0eWxlUHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cm9rZUxpbmVqb2luU3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgY3R4LmxpbmVKb2luID0gc3Ryb2tlTGluZWpvaW5TdHlsZVByb3AuZ2V0U3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJva2VNaXRlcmxpbWl0UHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gc3Ryb2tlTWl0ZXJsaW1pdFByb3AuZ2V0TnVtYmVyKCk7XG4gICAgICB9IC8vIE5FRUQgVEVTVFxuICAgICAgLy8gaWYgKHBvaW50T3JkZXJTdHlsZVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgLy8gXHQvLyA/XG4gICAgICAvLyBcdGN0eC5wYWludE9yZGVyID0gcG9pbnRPcmRlclN0eWxlUHJvcC5nZXRWYWx1ZSgpO1xuICAgICAgLy8gfVxuXG5cbiAgICAgIGlmIChzdHJva2VEYXNoYXJyYXlTdHlsZVByb3AuaGFzVmFsdWUoKSAmJiBzdHJva2VEYXNoYXJyYXlTdHlsZVByb3AuZ2V0U3RyaW5nKCkgIT09ICdub25lJykge1xuICAgICAgICB2YXIgZ2FwcyA9IHRvTnVtYmVycyhzdHJva2VEYXNoYXJyYXlTdHlsZVByb3AuZ2V0U3RyaW5nKCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNldExpbmVEYXNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGN0eC5zZXRMaW5lRGFzaChnYXBzKTtcbiAgICAgICAgfSBlbHNlIC8vIEB0cy1leHBlY3QtZXJyb3IgSGFuZGxlIGJyb3dzZXIgcHJlZml4LlxuICAgICAgICAgIGlmICh0eXBlb2YgY3R4LndlYmtpdExpbmVEYXNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBIYW5kbGUgYnJvd3NlciBwcmVmaXguXG4gICAgICAgICAgICBjdHgud2Via2l0TGluZURhc2ggPSBnYXBzO1xuICAgICAgICAgIH0gZWxzZSAvLyBAdHMtZXhwZWN0LWVycm9yIEhhbmRsZSBicm93c2VyIHByZWZpeC5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3R4Lm1vekRhc2ggIT09ICd1bmRlZmluZWQnICYmICEoZ2Fwcy5sZW5ndGggPT09IDEgJiYgZ2Fwc1swXSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBIYW5kbGUgYnJvd3NlciBwcmVmaXguXG4gICAgICAgICAgICAgIGN0eC5tb3pEYXNoID0gZ2FwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB2YXIgb2Zmc2V0ID0gc3Ryb2tlRGFzaG9mZnNldFByb3AuZ2V0UGl4ZWxzKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdHgubGluZURhc2hPZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB9IGVsc2UgLy8gQHRzLWV4cGVjdC1lcnJvciBIYW5kbGUgYnJvd3NlciBwcmVmaXguXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdHgud2Via2l0TGluZURhc2hPZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEhhbmRsZSBicm93c2VyIHByZWZpeC5cbiAgICAgICAgICAgIGN0eC53ZWJraXRMaW5lRGFzaE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICB9IGVsc2UgLy8gQHRzLWV4cGVjdC1lcnJvciBIYW5kbGUgYnJvd3NlciBwcmVmaXguXG4gICAgICAgICAgICBpZiAodHlwZW9mIGN0eC5tb3pEYXNoT2Zmc2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEhhbmRsZSBicm93c2VyIHByZWZpeC5cbiAgICAgICAgICAgICAgY3R4Lm1vekRhc2hPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBmb250XG5cblxuICAgIHRoaXMubW9kaWZpZWRFbVNpemVTdGFjayA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBjdHguZm9udCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBmb250U3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnZm9udCcpO1xuICAgICAgdmFyIGZvbnRTdHlsZVN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ2ZvbnQtc3R5bGUnKTtcbiAgICAgIHZhciBmb250VmFyaWFudFN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ2ZvbnQtdmFyaWFudCcpO1xuICAgICAgdmFyIGZvbnRXZWlnaHRTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmb250LXdlaWdodCcpO1xuICAgICAgdmFyIGZvbnRTaXplU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnZm9udC1zaXplJyk7XG4gICAgICB2YXIgZm9udEZhbWlseVN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ2ZvbnQtZmFtaWx5Jyk7XG4gICAgICB2YXIgZm9udCA9IG5ldyBGb250KGZvbnRTdHlsZVN0eWxlUHJvcC5nZXRTdHJpbmcoKSwgZm9udFZhcmlhbnRTdHlsZVByb3AuZ2V0U3RyaW5nKCksIGZvbnRXZWlnaHRTdHlsZVByb3AuZ2V0U3RyaW5nKCksIGZvbnRTaXplU3R5bGVQcm9wLmhhc1ZhbHVlKCkgPyBcIlwiLmNvbmNhdChmb250U2l6ZVN0eWxlUHJvcC5nZXRQaXhlbHModHJ1ZSksIFwicHhcIikgOiAnJywgZm9udEZhbWlseVN0eWxlUHJvcC5nZXRTdHJpbmcoKSwgRm9udC5wYXJzZShmb250U3R5bGVQcm9wLmdldFN0cmluZygpLCBjdHguZm9udCkpO1xuICAgICAgZm9udFN0eWxlU3R5bGVQcm9wLnNldFZhbHVlKGZvbnQuZm9udFN0eWxlKTtcbiAgICAgIGZvbnRWYXJpYW50U3R5bGVQcm9wLnNldFZhbHVlKGZvbnQuZm9udFZhcmlhbnQpO1xuICAgICAgZm9udFdlaWdodFN0eWxlUHJvcC5zZXRWYWx1ZShmb250LmZvbnRXZWlnaHQpO1xuICAgICAgZm9udFNpemVTdHlsZVByb3Auc2V0VmFsdWUoZm9udC5mb250U2l6ZSk7XG4gICAgICBmb250RmFtaWx5U3R5bGVQcm9wLnNldFZhbHVlKGZvbnQuZm9udEZhbWlseSk7XG4gICAgICBjdHguZm9udCA9IGZvbnQudG9TdHJpbmcoKTtcblxuICAgICAgaWYgKGZvbnRTaXplU3R5bGVQcm9wLmlzUGl4ZWxzKCkpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5lbVNpemUgPSBmb250U2l6ZVN0eWxlUHJvcC5nZXRQaXhlbHMoKTtcbiAgICAgICAgdGhpcy5tb2RpZmllZEVtU2l6ZVN0YWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZyb21NZWFzdXJlKSB7XG4gICAgICAvLyBlZmZlY3RzXG4gICAgICB0aGlzLmFwcGx5RWZmZWN0cyhjdHgpOyAvLyBvcGFjaXR5XG5cbiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY2FsY3VsYXRlT3BhY2l0eSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQ29udGV4dChjdHgpIHtcbiAgICBzdXBlci5jbGVhckNvbnRleHQoY3R4KTtcblxuICAgIGlmICh0aGlzLm1vZGlmaWVkRW1TaXplU3RhY2spIHtcbiAgICAgIHRoaXMuZG9jdW1lbnQucG9wRW1TaXplKCk7XG4gICAgfVxuICB9XG5cbn1cblxuY2xhc3MgUGF0aEVsZW1lbnQgZXh0ZW5kcyBSZW5kZXJlZEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHN1cGVyKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICB0aGlzLnR5cGUgPSAncGF0aCc7XG4gICAgdGhpcy5wYXRoUGFyc2VyID0gbnVsbDtcbiAgICB0aGlzLnBhdGhQYXJzZXIgPSBuZXcgUGF0aFBhcnNlcih0aGlzLmdldEF0dHJpYnV0ZSgnZCcpLmdldFN0cmluZygpKTtcbiAgfVxuXG4gIHBhdGgoY3R4KSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICBwYXRoUGFyc2VyLnJlc2V0KCk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzRW5kKCkpIHtcbiAgICAgIHN3aXRjaCAocGF0aFBhcnNlci5uZXh0KCkudHlwZSkge1xuICAgICAgICBjYXNlIFBhdGhQYXJzZXIuTU9WRV9UTzpcbiAgICAgICAgICB0aGlzLnBhdGhNKGN0eCwgYm91bmRpbmdCb3gpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5MSU5FX1RPOlxuICAgICAgICAgIHRoaXMucGF0aEwoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkhPUklaX0xJTkVfVE86XG4gICAgICAgICAgdGhpcy5wYXRoSChjdHgsIGJvdW5kaW5nQm94KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFBhdGhQYXJzZXIuVkVSVF9MSU5FX1RPOlxuICAgICAgICAgIHRoaXMucGF0aFYoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkNVUlZFX1RPOlxuICAgICAgICAgIHRoaXMucGF0aEMoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLlNNT09USF9DVVJWRV9UTzpcbiAgICAgICAgICB0aGlzLnBhdGhTKGN0eCwgYm91bmRpbmdCb3gpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5RVUFEX1RPOlxuICAgICAgICAgIHRoaXMucGF0aFEoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLlNNT09USF9RVUFEX1RPOlxuICAgICAgICAgIHRoaXMucGF0aFQoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkFSQzpcbiAgICAgICAgICB0aGlzLnBhdGhBKGN0eCwgYm91bmRpbmdCb3gpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5DTE9TRV9QQVRIOlxuICAgICAgICAgIHRoaXMucGF0aFooY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kaW5nQm94O1xuICB9XG5cbiAgZ2V0Qm91bmRpbmdCb3goXykge1xuICAgIHJldHVybiB0aGlzLnBhdGgoKTtcbiAgfVxuXG4gIGdldE1hcmtlcnMoKSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgcG9pbnRzID0gcGF0aFBhcnNlci5nZXRNYXJrZXJQb2ludHMoKTtcbiAgICB2YXIgYW5nbGVzID0gcGF0aFBhcnNlci5nZXRNYXJrZXJBbmdsZXMoKTtcbiAgICB2YXIgbWFya2VycyA9IHBvaW50cy5tYXAoKHBvaW50LCBpKSA9PiBbcG9pbnQsIGFuZ2xlc1tpXV0pO1xuICAgIHJldHVybiBtYXJrZXJzO1xuICB9XG5cbiAgcmVuZGVyQ2hpbGRyZW4oY3R4KSB7XG4gICAgdGhpcy5wYXRoKGN0eCk7XG4gICAgdGhpcy5kb2N1bWVudC5zY3JlZW4ubW91c2UuY2hlY2tQYXRoKHRoaXMsIGN0eCk7XG4gICAgdmFyIGZpbGxSdWxlU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnZmlsbC1ydWxlJyk7XG5cbiAgICBpZiAoY3R4LmZpbGxTdHlsZSAhPT0gJycpIHtcbiAgICAgIGlmIChmaWxsUnVsZVN0eWxlUHJvcC5nZXRTdHJpbmcoJ2luaGVyaXQnKSAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICAgIGN0eC5maWxsKGZpbGxSdWxlU3R5bGVQcm9wLmdldFN0cmluZygpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN0eC5zdHJva2VTdHlsZSAhPT0gJycpIHtcbiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndmVjdG9yLWVmZmVjdCcpLmdldFN0cmluZygpID09PSAnbm9uLXNjYWxpbmctc3Ryb2tlJykge1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1hcmtlcnMgPSB0aGlzLmdldE1hcmtlcnMoKTtcblxuICAgIGlmIChtYXJrZXJzKSB7XG4gICAgICB2YXIgbWFya2Vyc0xhc3RJbmRleCA9IG1hcmtlcnMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBtYXJrZXJTdGFydFN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ21hcmtlci1zdGFydCcpO1xuICAgICAgdmFyIG1hcmtlck1pZFN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ21hcmtlci1taWQnKTtcbiAgICAgIHZhciBtYXJrZXJFbmRTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdtYXJrZXItZW5kJyk7XG5cbiAgICAgIGlmIChtYXJrZXJTdGFydFN0eWxlUHJvcC5pc1VybERlZmluaXRpb24oKSkge1xuICAgICAgICB2YXIgbWFya2VyID0gbWFya2VyU3RhcnRTdHlsZVByb3AuZ2V0RGVmaW5pdGlvbigpO1xuICAgICAgICB2YXIgW3BvaW50LCBhbmdsZV0gPSBtYXJrZXJzWzBdO1xuICAgICAgICBtYXJrZXIucmVuZGVyKGN0eCwgcG9pbnQsIGFuZ2xlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hcmtlck1pZFN0eWxlUHJvcC5pc1VybERlZmluaXRpb24oKSkge1xuICAgICAgICB2YXIgX21hcmtlciA9IG1hcmtlck1pZFN0eWxlUHJvcC5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXJrZXJzTGFzdEluZGV4OyBpKyspIHtcbiAgICAgICAgICB2YXIgW19wb2ludCwgX2FuZ2xlXSA9IG1hcmtlcnNbaV07XG5cbiAgICAgICAgICBfbWFya2VyLnJlbmRlcihjdHgsIF9wb2ludCwgX2FuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWFya2VyRW5kU3R5bGVQcm9wLmlzVXJsRGVmaW5pdGlvbigpKSB7XG4gICAgICAgIHZhciBfbWFya2VyMiA9IG1hcmtlckVuZFN0eWxlUHJvcC5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgICAgdmFyIFtfcG9pbnQyLCBfYW5nbGUyXSA9IG1hcmtlcnNbbWFya2Vyc0xhc3RJbmRleF07XG5cbiAgICAgICAgX21hcmtlcjIucmVuZGVyKGN0eCwgX3BvaW50MiwgX2FuZ2xlMik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHBhdGhNKHBhdGhQYXJzZXIpIHtcbiAgICB2YXIgcG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgcGF0aFBhcnNlci5zdGFydCA9IHBhdGhQYXJzZXIuY3VycmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgcG9pbnRcbiAgICB9O1xuICB9XG5cbiAgcGF0aE0oY3R4LCBib3VuZGluZ0JveCkge1xuICAgIHZhciB7XG4gICAgICBwYXRoUGFyc2VyXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHtcbiAgICAgIHBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhNKHBhdGhQYXJzZXIpO1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSBwb2ludDtcbiAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihwb2ludCk7XG4gICAgYm91bmRpbmdCb3guYWRkUG9pbnQoeCwgeSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBwYXRoTChwYXRoUGFyc2VyKSB7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnRcbiAgICB9ID0gcGF0aFBhcnNlcjtcbiAgICB2YXIgcG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwb2ludFxuICAgIH07XG4gIH1cblxuICBwYXRoTChjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgY3VycmVudCxcbiAgICAgIHBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhMKHBhdGhQYXJzZXIpO1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSBwb2ludDtcbiAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihwb2ludCwgY3VycmVudCk7XG4gICAgYm91bmRpbmdCb3guYWRkUG9pbnQoeCwgeSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBwYXRoSChwYXRoUGFyc2VyKSB7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb21tYW5kXG4gICAgfSA9IHBhdGhQYXJzZXI7XG4gICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KChjb21tYW5kLnJlbGF0aXZlID8gY3VycmVudC54IDogMCkgKyBjb21tYW5kLngsIGN1cnJlbnQueSk7XG4gICAgcGF0aFBhcnNlci5jdXJyZW50ID0gcG9pbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwb2ludFxuICAgIH07XG4gIH1cblxuICBwYXRoSChjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgY3VycmVudCxcbiAgICAgIHBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhIKHBhdGhQYXJzZXIpO1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSBwb2ludDtcbiAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihwb2ludCwgY3VycmVudCk7XG4gICAgYm91bmRpbmdCb3guYWRkUG9pbnQoeCwgeSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBwYXRoVihwYXRoUGFyc2VyKSB7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb21tYW5kXG4gICAgfSA9IHBhdGhQYXJzZXI7XG4gICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KGN1cnJlbnQueCwgKGNvbW1hbmQucmVsYXRpdmUgPyBjdXJyZW50LnkgOiAwKSArIGNvbW1hbmQueSk7XG4gICAgcGF0aFBhcnNlci5jdXJyZW50ID0gcG9pbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwb2ludFxuICAgIH07XG4gIH1cblxuICBwYXRoVihjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgY3VycmVudCxcbiAgICAgIHBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhWKHBhdGhQYXJzZXIpO1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSBwb2ludDtcbiAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihwb2ludCwgY3VycmVudCk7XG4gICAgYm91bmRpbmdCb3guYWRkUG9pbnQoeCwgeSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBwYXRoQyhwYXRoUGFyc2VyKSB7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnRcbiAgICB9ID0gcGF0aFBhcnNlcjtcbiAgICB2YXIgcG9pbnQgPSBwYXRoUGFyc2VyLmdldFBvaW50KCd4MScsICd5MScpO1xuICAgIHZhciBjb250cm9sUG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ29udHJvbFBvaW50KCd4MicsICd5MicpO1xuICAgIHZhciBjdXJyZW50UG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwb2ludCxcbiAgICAgIGNvbnRyb2xQb2ludCxcbiAgICAgIGN1cnJlbnRQb2ludFxuICAgIH07XG4gIH1cblxuICBwYXRoQyhjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgY3VycmVudCxcbiAgICAgIHBvaW50LFxuICAgICAgY29udHJvbFBvaW50LFxuICAgICAgY3VycmVudFBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhDKHBhdGhQYXJzZXIpO1xuICAgIHBhdGhQYXJzZXIuYWRkTWFya2VyKGN1cnJlbnRQb2ludCwgY29udHJvbFBvaW50LCBwb2ludCk7XG4gICAgYm91bmRpbmdCb3guYWRkQmV6aWVyQ3VydmUoY3VycmVudC54LCBjdXJyZW50LnksIHBvaW50LngsIHBvaW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHBvaW50LngsIHBvaW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcGF0aFMocGF0aFBhcnNlcikge1xuICAgIHZhciB7XG4gICAgICBjdXJyZW50XG4gICAgfSA9IHBhdGhQYXJzZXI7XG4gICAgdmFyIHBvaW50ID0gcGF0aFBhcnNlci5nZXRSZWZsZWN0ZWRDb250cm9sUG9pbnQoKTtcbiAgICB2YXIgY29udHJvbFBvaW50ID0gcGF0aFBhcnNlci5nZXRBc0NvbnRyb2xQb2ludCgneDInLCAneTInKTtcbiAgICB2YXIgY3VycmVudFBvaW50ID0gcGF0aFBhcnNlci5nZXRBc0N1cnJlbnRQb2ludCgpO1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50LFxuICAgICAgcG9pbnQsXG4gICAgICBjb250cm9sUG9pbnQsXG4gICAgICBjdXJyZW50UG9pbnRcbiAgICB9O1xuICB9XG5cbiAgcGF0aFMoY3R4LCBib3VuZGluZ0JveCkge1xuICAgIHZhciB7XG4gICAgICBwYXRoUGFyc2VyXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwb2ludCxcbiAgICAgIGNvbnRyb2xQb2ludCxcbiAgICAgIGN1cnJlbnRQb2ludFxuICAgIH0gPSBQYXRoRWxlbWVudC5wYXRoUyhwYXRoUGFyc2VyKTtcbiAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihjdXJyZW50UG9pbnQsIGNvbnRyb2xQb2ludCwgcG9pbnQpO1xuICAgIGJvdW5kaW5nQm94LmFkZEJlemllckN1cnZlKGN1cnJlbnQueCwgY3VycmVudC55LCBwb2ludC54LCBwb2ludC55LCBjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguYmV6aWVyQ3VydmVUbyhwb2ludC54LCBwb2ludC55LCBjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHBhdGhRKHBhdGhQYXJzZXIpIHtcbiAgICB2YXIge1xuICAgICAgY3VycmVudFxuICAgIH0gPSBwYXRoUGFyc2VyO1xuICAgIHZhciBjb250cm9sUG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ29udHJvbFBvaW50KCd4MScsICd5MScpO1xuICAgIHZhciBjdXJyZW50UG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb250cm9sUG9pbnQsXG4gICAgICBjdXJyZW50UG9pbnRcbiAgICB9O1xuICB9XG5cbiAgcGF0aFEoY3R4LCBib3VuZGluZ0JveCkge1xuICAgIHZhciB7XG4gICAgICBwYXRoUGFyc2VyXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb250cm9sUG9pbnQsXG4gICAgICBjdXJyZW50UG9pbnRcbiAgICB9ID0gUGF0aEVsZW1lbnQucGF0aFEocGF0aFBhcnNlcik7XG4gICAgcGF0aFBhcnNlci5hZGRNYXJrZXIoY3VycmVudFBvaW50LCBjb250cm9sUG9pbnQsIGNvbnRyb2xQb2ludCk7XG4gICAgYm91bmRpbmdCb3guYWRkUXVhZHJhdGljQ3VydmUoY3VycmVudC54LCBjdXJyZW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcGF0aFQocGF0aFBhcnNlcikge1xuICAgIHZhciB7XG4gICAgICBjdXJyZW50XG4gICAgfSA9IHBhdGhQYXJzZXI7XG4gICAgdmFyIGNvbnRyb2xQb2ludCA9IHBhdGhQYXJzZXIuZ2V0UmVmbGVjdGVkQ29udHJvbFBvaW50KCk7XG4gICAgcGF0aFBhcnNlci5jb250cm9sID0gY29udHJvbFBvaW50O1xuICAgIHZhciBjdXJyZW50UG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb250cm9sUG9pbnQsXG4gICAgICBjdXJyZW50UG9pbnRcbiAgICB9O1xuICB9XG5cbiAgcGF0aFQoY3R4LCBib3VuZGluZ0JveCkge1xuICAgIHZhciB7XG4gICAgICBwYXRoUGFyc2VyXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb250cm9sUG9pbnQsXG4gICAgICBjdXJyZW50UG9pbnRcbiAgICB9ID0gUGF0aEVsZW1lbnQucGF0aFQocGF0aFBhcnNlcik7XG4gICAgcGF0aFBhcnNlci5hZGRNYXJrZXIoY3VycmVudFBvaW50LCBjb250cm9sUG9pbnQsIGNvbnRyb2xQb2ludCk7XG4gICAgYm91bmRpbmdCb3guYWRkUXVhZHJhdGljQ3VydmUoY3VycmVudC54LCBjdXJyZW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcGF0aEEocGF0aFBhcnNlcikge1xuICAgIHZhciB7XG4gICAgICBjdXJyZW50LFxuICAgICAgY29tbWFuZFxuICAgIH0gPSBwYXRoUGFyc2VyO1xuICAgIHZhciB7XG4gICAgICByWCxcbiAgICAgIHJZLFxuICAgICAgeFJvdCxcbiAgICAgIGxBcmNGbGFnLFxuICAgICAgc3dlZXBGbGFnXG4gICAgfSA9IGNvbW1hbmQ7XG4gICAgdmFyIHhBeGlzUm90YXRpb24gPSB4Um90ICogKE1hdGguUEkgLyAxODAuMCk7XG4gICAgdmFyIGN1cnJlbnRQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTsgLy8gQ29udmVyc2lvbiBmcm9tIGVuZHBvaW50IHRvIGNlbnRlciBwYXJhbWV0ZXJpemF0aW9uXG4gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvaW1wbG5vdGUuaHRtbCNBcmNJbXBsZW1lbnRhdGlvbk5vdGVzXG4gICAgLy8geDEnLCB5MSdcblxuICAgIHZhciBjdXJycCA9IG5ldyBQb2ludChNYXRoLmNvcyh4QXhpc1JvdGF0aW9uKSAqIChjdXJyZW50LnggLSBjdXJyZW50UG9pbnQueCkgLyAyLjAgKyBNYXRoLnNpbih4QXhpc1JvdGF0aW9uKSAqIChjdXJyZW50LnkgLSBjdXJyZW50UG9pbnQueSkgLyAyLjAsIC1NYXRoLnNpbih4QXhpc1JvdGF0aW9uKSAqIChjdXJyZW50LnggLSBjdXJyZW50UG9pbnQueCkgLyAyLjAgKyBNYXRoLmNvcyh4QXhpc1JvdGF0aW9uKSAqIChjdXJyZW50LnkgLSBjdXJyZW50UG9pbnQueSkgLyAyLjApOyAvLyBhZGp1c3QgcmFkaWlcblxuICAgIHZhciBsID0gTWF0aC5wb3coY3VycnAueCwgMikgLyBNYXRoLnBvdyhyWCwgMikgKyBNYXRoLnBvdyhjdXJycC55LCAyKSAvIE1hdGgucG93KHJZLCAyKTtcblxuICAgIGlmIChsID4gMSkge1xuICAgICAgclggKj0gTWF0aC5zcXJ0KGwpO1xuICAgICAgclkgKj0gTWF0aC5zcXJ0KGwpO1xuICAgIH0gLy8gY3gnLCBjeSdcblxuXG4gICAgdmFyIHMgPSAobEFyY0ZsYWcgPT09IHN3ZWVwRmxhZyA/IC0xIDogMSkgKiBNYXRoLnNxcnQoKE1hdGgucG93KHJYLCAyKSAqIE1hdGgucG93KHJZLCAyKSAtIE1hdGgucG93KHJYLCAyKSAqIE1hdGgucG93KGN1cnJwLnksIDIpIC0gTWF0aC5wb3coclksIDIpICogTWF0aC5wb3coY3VycnAueCwgMikpIC8gKE1hdGgucG93KHJYLCAyKSAqIE1hdGgucG93KGN1cnJwLnksIDIpICsgTWF0aC5wb3coclksIDIpICogTWF0aC5wb3coY3VycnAueCwgMikpKTtcblxuICAgIGlmIChpc05hTihzKSkge1xuICAgICAgcyA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGNwcCA9IG5ldyBQb2ludChzICogclggKiBjdXJycC55IC8gclksIHMgKiAtclkgKiBjdXJycC54IC8gclgpOyAvLyBjeCwgY3lcblxuICAgIHZhciBjZW50cCA9IG5ldyBQb2ludCgoY3VycmVudC54ICsgY3VycmVudFBvaW50LngpIC8gMi4wICsgTWF0aC5jb3MoeEF4aXNSb3RhdGlvbikgKiBjcHAueCAtIE1hdGguc2luKHhBeGlzUm90YXRpb24pICogY3BwLnksIChjdXJyZW50LnkgKyBjdXJyZW50UG9pbnQueSkgLyAyLjAgKyBNYXRoLnNpbih4QXhpc1JvdGF0aW9uKSAqIGNwcC54ICsgTWF0aC5jb3MoeEF4aXNSb3RhdGlvbikgKiBjcHAueSk7IC8vIGluaXRpYWwgYW5nbGVcblxuICAgIHZhciBhMSA9IHZlY3RvcnNBbmdsZShbMSwgMF0sIFsoY3VycnAueCAtIGNwcC54KSAvIHJYLCAoY3VycnAueSAtIGNwcC55KSAvIHJZXSk7IC8vIM64MVxuICAgIC8vIGFuZ2xlIGRlbHRhXG5cbiAgICB2YXIgdSA9IFsoY3VycnAueCAtIGNwcC54KSAvIHJYLCAoY3VycnAueSAtIGNwcC55KSAvIHJZXTtcbiAgICB2YXIgdiA9IFsoLWN1cnJwLnggLSBjcHAueCkgLyByWCwgKC1jdXJycC55IC0gY3BwLnkpIC8gclldO1xuICAgIHZhciBhZCA9IHZlY3RvcnNBbmdsZSh1LCB2KTsgLy8gzpTOuFxuXG4gICAgaWYgKHZlY3RvcnNSYXRpbyh1LCB2KSA8PSAtMSkge1xuICAgICAgYWQgPSBNYXRoLlBJO1xuICAgIH1cblxuICAgIGlmICh2ZWN0b3JzUmF0aW8odSwgdikgPj0gMSkge1xuICAgICAgYWQgPSAwO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50UG9pbnQsXG4gICAgICByWCxcbiAgICAgIHJZLFxuICAgICAgc3dlZXBGbGFnLFxuICAgICAgeEF4aXNSb3RhdGlvbixcbiAgICAgIGNlbnRwLFxuICAgICAgYTEsXG4gICAgICBhZFxuICAgIH07XG4gIH1cblxuICBwYXRoQShjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgY3VycmVudFBvaW50LFxuICAgICAgclgsXG4gICAgICByWSxcbiAgICAgIHN3ZWVwRmxhZyxcbiAgICAgIHhBeGlzUm90YXRpb24sXG4gICAgICBjZW50cCxcbiAgICAgIGExLFxuICAgICAgYWRcbiAgICB9ID0gUGF0aEVsZW1lbnQucGF0aEEocGF0aFBhcnNlcik7IC8vIGZvciBtYXJrZXJzXG5cbiAgICB2YXIgZGlyID0gMSAtIHN3ZWVwRmxhZyA/IDEuMCA6IC0xLjA7XG4gICAgdmFyIGFoID0gYTEgKyBkaXIgKiAoYWQgLyAyLjApO1xuICAgIHZhciBoYWxmV2F5ID0gbmV3IFBvaW50KGNlbnRwLnggKyByWCAqIE1hdGguY29zKGFoKSwgY2VudHAueSArIHJZICogTWF0aC5zaW4oYWgpKTtcbiAgICBwYXRoUGFyc2VyLmFkZE1hcmtlckFuZ2xlKGhhbGZXYXksIGFoIC0gZGlyICogTWF0aC5QSSAvIDIpO1xuICAgIHBhdGhQYXJzZXIuYWRkTWFya2VyQW5nbGUoY3VycmVudFBvaW50LCBhaCAtIGRpciAqIE1hdGguUEkpO1xuICAgIGJvdW5kaW5nQm94LmFkZFBvaW50KGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7IC8vIFRPRE86IHRoaXMgaXMgdG9vIG5haXZlLCBtYWtlIGl0IGJldHRlclxuXG4gICAgaWYgKGN0eCAmJiAhaXNOYU4oYTEpICYmICFpc05hTihhZCkpIHtcbiAgICAgIHZhciByID0gclggPiByWSA/IHJYIDogclk7XG4gICAgICB2YXIgc3ggPSByWCA+IHJZID8gMSA6IHJYIC8gclk7XG4gICAgICB2YXIgc3kgPSByWCA+IHJZID8gclkgLyByWCA6IDE7XG4gICAgICBjdHgudHJhbnNsYXRlKGNlbnRwLngsIGNlbnRwLnkpO1xuICAgICAgY3R4LnJvdGF0ZSh4QXhpc1JvdGF0aW9uKTtcbiAgICAgIGN0eC5zY2FsZShzeCwgc3kpO1xuICAgICAgY3R4LmFyYygwLCAwLCByLCBhMSwgYTEgKyBhZCwgQm9vbGVhbigxIC0gc3dlZXBGbGFnKSk7XG4gICAgICBjdHguc2NhbGUoMSAvIHN4LCAxIC8gc3kpO1xuICAgICAgY3R4LnJvdGF0ZSgteEF4aXNSb3RhdGlvbik7XG4gICAgICBjdHgudHJhbnNsYXRlKC1jZW50cC54LCAtY2VudHAueSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHBhdGhaKHBhdGhQYXJzZXIpIHtcbiAgICBwYXRoUGFyc2VyLmN1cnJlbnQgPSBwYXRoUGFyc2VyLnN0YXJ0O1xuICB9XG5cbiAgcGF0aFooY3R4LCBib3VuZGluZ0JveCkge1xuICAgIFBhdGhFbGVtZW50LnBhdGhaKHRoaXMucGF0aFBhcnNlcik7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICAvLyBvbmx5IGNsb3NlIHBhdGggaWYgaXQgaXMgbm90IGEgc3RyYWlnaHQgbGluZVxuICAgICAgaWYgKGJvdW5kaW5nQm94LngxICE9PSBib3VuZGluZ0JveC54MiAmJiBib3VuZGluZ0JveC55MSAhPT0gYm91bmRpbmdCb3gueTIpIHtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbmNsYXNzIEdseXBoRWxlbWVudCBleHRlbmRzIFBhdGhFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ2dseXBoJztcbiAgICB0aGlzLmhvcml6QWR2WCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdob3Jpei1hZHYteCcpLmdldE51bWJlcigpO1xuICAgIHRoaXMudW5pY29kZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd1bmljb2RlJykuZ2V0U3RyaW5nKCk7XG4gICAgdGhpcy5hcmFiaWNGb3JtID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyYWJpYy1mb3JtJykuZ2V0U3RyaW5nKCk7XG4gIH1cblxufVxuXG5jbGFzcyBUZXh0RWxlbWVudCBleHRlbmRzIFJlbmRlcmVkRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgc3VwZXIoZG9jdW1lbnQsIG5vZGUsIG5ldy50YXJnZXQgPT09IFRleHRFbGVtZW50ID8gdHJ1ZSA6IGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIHRoaXMudHlwZSA9ICd0ZXh0JztcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgdGhpcy5tZWFzdXJlQ2FjaGUgPSAtMTtcbiAgfVxuXG4gIHNldENvbnRleHQoY3R4KSB7XG4gICAgdmFyIGZyb21NZWFzdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBzdXBlci5zZXRDb250ZXh0KGN0eCwgZnJvbU1lYXN1cmUpO1xuICAgIHZhciB0ZXh0QmFzZWxpbmUgPSB0aGlzLmdldFN0eWxlKCdkb21pbmFudC1iYXNlbGluZScpLmdldFRleHRCYXNlbGluZSgpIHx8IHRoaXMuZ2V0U3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScpLmdldFRleHRCYXNlbGluZSgpO1xuXG4gICAgaWYgKHRleHRCYXNlbGluZSkge1xuICAgICAgY3R4LnRleHRCYXNlbGluZSA9IHRleHRCYXNlbGluZTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplQ29vcmRpbmF0ZXMoKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMubGVhZlRleHRzID0gW107XG4gICAgdGhpcy50ZXh0Q2h1bmtTdGFydCA9IDA7XG4gICAgdGhpcy5taW5YID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHRoaXMubWF4WCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgfVxuXG4gIGdldEJvdW5kaW5nQm94KGN0eCkge1xuICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VEVsZW1lbnRCb3VuZGluZ0JveChjdHgpO1xuICAgIH0gLy8gZmlyc3QsIGNhbGN1bGF0ZSBjaGlsZCBwb3NpdGlvbnNcblxuXG4gICAgdGhpcy5pbml0aWFsaXplQ29vcmRpbmF0ZXMoKTtcbiAgICB0aGlzLmFkanVzdENoaWxkQ29vcmRpbmF0ZXNSZWN1cnNpdmUoY3R4KTtcbiAgICB2YXIgYm91bmRpbmdCb3ggPSBudWxsOyAvLyB0aGVuIGNhbGN1bGF0ZSBib3VuZGluZyBib3hcblxuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgdmFyIGNoaWxkQm91bmRpbmdCb3ggPSB0aGlzLmdldENoaWxkQm91bmRpbmdCb3goY3R4LCB0aGlzLCB0aGlzLCBpKTtcblxuICAgICAgaWYgKCFib3VuZGluZ0JveCkge1xuICAgICAgICBib3VuZGluZ0JveCA9IGNoaWxkQm91bmRpbmdCb3g7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib3VuZGluZ0JveC5hZGRCb3VuZGluZ0JveChjaGlsZEJvdW5kaW5nQm94KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYm91bmRpbmdCb3g7XG4gIH1cblxuICBnZXRGb250U2l6ZSgpIHtcbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBwYXJlbnRcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgaW5oZXJpdEZvbnRTaXplID0gRm9udC5wYXJzZShkb2N1bWVudC5jdHguZm9udCkuZm9udFNpemU7XG4gICAgdmFyIGZvbnRTaXplID0gcGFyZW50LmdldFN0eWxlKCdmb250LXNpemUnKS5nZXROdW1iZXIoaW5oZXJpdEZvbnRTaXplKTtcbiAgICByZXR1cm4gZm9udFNpemU7XG4gIH1cblxuICBnZXRURWxlbWVudEJvdW5kaW5nQm94KGN0eCkge1xuICAgIHZhciBmb250U2l6ZSA9IHRoaXMuZ2V0Rm9udFNpemUoKTtcbiAgICByZXR1cm4gbmV3IEJvdW5kaW5nQm94KHRoaXMueCwgdGhpcy55IC0gZm9udFNpemUsIHRoaXMueCArIHRoaXMubWVhc3VyZVRleHQoY3R4KSwgdGhpcy55KTtcbiAgfVxuXG4gIGdldEdseXBoKGZvbnQsIHRleHQsIGkpIHtcbiAgICB2YXIgY2hhciA9IHRleHRbaV07XG4gICAgdmFyIGdseXBoID0gbnVsbDtcblxuICAgIGlmIChmb250LmlzQXJhYmljKSB7XG4gICAgICB2YXIgbGVuID0gdGV4dC5sZW5ndGg7XG4gICAgICB2YXIgcHJldkNoYXIgPSB0ZXh0W2kgLSAxXTtcbiAgICAgIHZhciBuZXh0Q2hhciA9IHRleHRbaSArIDFdO1xuICAgICAgdmFyIGFyYWJpY0Zvcm0gPSAnaXNvbGF0ZWQnO1xuXG4gICAgICBpZiAoKGkgPT09IDAgfHwgcHJldkNoYXIgPT09ICcgJykgJiYgaSA8IGxlbiAtIDEgJiYgbmV4dENoYXIgIT09ICcgJykge1xuICAgICAgICBhcmFiaWNGb3JtID0gJ3Rlcm1pbmFsJztcbiAgICAgIH1cblxuICAgICAgaWYgKGkgPiAwICYmIHByZXZDaGFyICE9PSAnICcgJiYgaSA8IGxlbiAtIDEgJiYgbmV4dENoYXIgIT09ICcgJykge1xuICAgICAgICBhcmFiaWNGb3JtID0gJ21lZGlhbCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpID4gMCAmJiBwcmV2Q2hhciAhPT0gJyAnICYmIChpID09PSBsZW4gLSAxIHx8IG5leHRDaGFyID09PSAnICcpKSB7XG4gICAgICAgIGFyYWJpY0Zvcm0gPSAnaW5pdGlhbCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZm9udC5nbHlwaHNbY2hhcl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIE5FRUQgVEVTVFxuICAgICAgICB2YXIgbWF5YmVHbHlwaCA9IGZvbnQuZ2x5cGhzW2NoYXJdO1xuICAgICAgICBnbHlwaCA9IG1heWJlR2x5cGggaW5zdGFuY2VvZiBHbHlwaEVsZW1lbnQgPyBtYXliZUdseXBoIDogbWF5YmVHbHlwaFthcmFiaWNGb3JtXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZ2x5cGggPSBmb250LmdseXBoc1tjaGFyXTtcbiAgICB9XG5cbiAgICBpZiAoIWdseXBoKSB7XG4gICAgICBnbHlwaCA9IGZvbnQubWlzc2luZ0dseXBoO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaDtcbiAgfVxuXG4gIGdldFRleHQoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0VGV4dEZyb21Ob2RlKG5vZGUpIHtcbiAgICB2YXIgdGV4dE5vZGUgPSBub2RlIHx8IHRoaXMubm9kZTtcbiAgICB2YXIgY2hpbGROb2RlcyA9IEFycmF5LmZyb20odGV4dE5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzKTtcbiAgICB2YXIgaW5kZXggPSBjaGlsZE5vZGVzLmluZGV4T2YodGV4dE5vZGUpO1xuICAgIHZhciBsYXN0SW5kZXggPSBjaGlsZE5vZGVzLmxlbmd0aCAtIDE7XG4gICAgdmFyIHRleHQgPSBjb21wcmVzc1NwYWNlcyggLy8gdGV4dE5vZGUudmFsdWVcbiAgICAvLyB8fCB0ZXh0Tm9kZS50ZXh0XG4gICAgdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgJycpO1xuXG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0ZXh0ID0gdHJpbUxlZnQodGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSBsYXN0SW5kZXgpIHtcbiAgICAgIHRleHQgPSB0cmltUmlnaHQodGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICByZW5kZXJDaGlsZHJlbihjdHgpIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSAndGV4dCcpIHtcbiAgICAgIHRoaXMucmVuZGVyVEVsZW1lbnRDaGlsZHJlbihjdHgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZmlyc3QsIGNhbGN1bGF0ZSBjaGlsZCBwb3NpdGlvbnNcblxuXG4gICAgdGhpcy5pbml0aWFsaXplQ29vcmRpbmF0ZXMoKTtcbiAgICB0aGlzLmFkanVzdENoaWxkQ29vcmRpbmF0ZXNSZWN1cnNpdmUoY3R4KTsgLy8gdGhlbiByZW5kZXJcblxuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJDaGlsZChjdHgsIHRoaXMsIHRoaXMsIGkpO1xuICAgIH0pO1xuICAgIHZhciB7XG4gICAgICBtb3VzZVxuICAgIH0gPSB0aGlzLmRvY3VtZW50LnNjcmVlbjsgLy8gRG8gbm90IGNhbGMgYm91bmRpbmcgYm94IGlmIG1vdXNlIGlzIG5vdCB3b3JraW5nLlxuXG4gICAgaWYgKG1vdXNlLmlzV29ya2luZygpKSB7XG4gICAgICBtb3VzZS5jaGVja0JvdW5kaW5nQm94KHRoaXMsIHRoaXMuZ2V0Qm91bmRpbmdCb3goY3R4KSk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyVEVsZW1lbnRDaGlsZHJlbihjdHgpIHtcbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBwYXJlbnRcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgcmVuZGVyVGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIHZhciBjdXN0b21Gb250ID0gcGFyZW50LmdldFN0eWxlKCdmb250LWZhbWlseScpLmdldERlZmluaXRpb24oKTtcblxuICAgIGlmIChjdXN0b21Gb250KSB7XG4gICAgICB2YXIge1xuICAgICAgICB1bml0c1BlckVtXG4gICAgICB9ID0gY3VzdG9tRm9udC5mb250RmFjZTtcbiAgICAgIHZhciBjdHhGb250ID0gRm9udC5wYXJzZShkb2N1bWVudC5jdHguZm9udCk7XG4gICAgICB2YXIgZm9udFNpemUgPSBwYXJlbnQuZ2V0U3R5bGUoJ2ZvbnQtc2l6ZScpLmdldE51bWJlcihjdHhGb250LmZvbnRTaXplKTtcbiAgICAgIHZhciBmb250U3R5bGUgPSBwYXJlbnQuZ2V0U3R5bGUoJ2ZvbnQtc3R5bGUnKS5nZXRTdHJpbmcoY3R4Rm9udC5mb250U3R5bGUpO1xuICAgICAgdmFyIHNjYWxlID0gZm9udFNpemUgLyB1bml0c1BlckVtO1xuICAgICAgdmFyIHRleHQgPSBjdXN0b21Gb250LmlzUlRMID8gcmVuZGVyVGV4dC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIDogcmVuZGVyVGV4dDtcbiAgICAgIHZhciBkeCA9IHRvTnVtYmVycyhwYXJlbnQuZ2V0QXR0cmlidXRlKCdkeCcpLmdldFN0cmluZygpKTtcbiAgICAgIHZhciBsZW4gPSB0ZXh0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdldEdseXBoKGN1c3RvbUZvbnQsIHRleHQsIGkpO1xuICAgICAgICBjdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgY3R4LnNjYWxlKHNjYWxlLCAtc2NhbGUpO1xuICAgICAgICB2YXIgbHcgPSBjdHgubGluZVdpZHRoO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gY3R4LmxpbmVXaWR0aCAqIHVuaXRzUGVyRW0gLyBmb250U2l6ZTtcblxuICAgICAgICBpZiAoZm9udFN0eWxlID09PSAnaXRhbGljJykge1xuICAgICAgICAgIGN0eC50cmFuc2Zvcm0oMSwgMCwgLjQsIDEsIDAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2x5cGgucmVuZGVyKGN0eCk7XG5cbiAgICAgICAgaWYgKGZvbnRTdHlsZSA9PT0gJ2l0YWxpYycpIHtcbiAgICAgICAgICBjdHgudHJhbnNmb3JtKDEsIDAsIC0uNCwgMSwgMCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjdHgubGluZVdpZHRoID0gbHc7XG4gICAgICAgIGN0eC5zY2FsZSgxIC8gc2NhbGUsIC0xIC8gc2NhbGUpO1xuICAgICAgICBjdHgudHJhbnNsYXRlKC10aGlzLngsIC10aGlzLnkpO1xuICAgICAgICB0aGlzLnggKz0gZm9udFNpemUgKiAoZ2x5cGguaG9yaXpBZHZYIHx8IGN1c3RvbUZvbnQuaG9yaXpBZHZYKSAvIHVuaXRzUGVyRW07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkeFtpXSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzTmFOKGR4W2ldKSkge1xuICAgICAgICAgIHRoaXMueCArPSBkeFtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXM7IC8vIE5FRUQgVEVTVFxuICAgIC8vIGlmIChjdHgucGFpbnRPcmRlciA9PT0gJ3N0cm9rZScpIHtcbiAgICAvLyBcdGlmIChjdHguc3Ryb2tlU3R5bGUpIHtcbiAgICAvLyBcdFx0Y3R4LnN0cm9rZVRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgLy8gXHR9XG4gICAgLy8gXHRpZiAoY3R4LmZpbGxTdHlsZSkge1xuICAgIC8vIFx0XHRjdHguZmlsbFRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgLy8gXHR9XG4gICAgLy8gfSBlbHNlIHtcblxuICAgIGlmIChjdHguZmlsbFN0eWxlKSB7XG4gICAgICBjdHguZmlsbFRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgfVxuXG4gICAgaWYgKGN0eC5zdHJva2VTdHlsZSkge1xuICAgICAgY3R4LnN0cm9rZVRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgfSAvLyB9XG5cbiAgfVxuXG4gIGFwcGx5QW5jaG9yaW5nKCkge1xuICAgIGlmICh0aGlzLnRleHRDaHVua1N0YXJ0ID49IHRoaXMubGVhZlRleHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVGhpcyBpcyBiYXNpY2FsbHkgdGhlIFwiQXBwbHkgYW5jaG9yaW5nXCIgcGFydCBvZiBodHRwczovL3d3dy53My5vcmcvVFIvU1ZHMi90ZXh0Lmh0bWwjVGV4dExheW91dEFsZ29yaXRobS5cbiAgICAvLyBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHdlIGFwcGx5IHRoZSBhbmNob3JpbmcgYXMgc29vbiBhcyBhIGNodW5rIGlzIGZpbmlzaGVkLiBUaGlzIHNhdmVzIHNvbWUgZXh0cmEgbG9vcGluZy5cbiAgICAvLyBWZXJ0aWNhbCB0ZXh0IGlzIG5vdCBzdXBwb3J0ZWQuXG5cblxuICAgIHZhciBmaXJzdEVsZW1lbnQgPSB0aGlzLmxlYWZUZXh0c1t0aGlzLnRleHRDaHVua1N0YXJ0XTtcbiAgICB2YXIgdGV4dEFuY2hvciA9IGZpcnN0RWxlbWVudC5nZXRTdHlsZSgndGV4dC1hbmNob3InKS5nZXRTdHJpbmcoJ3N0YXJ0Jyk7XG4gICAgdmFyIGlzUlRMID0gZmFsc2U7IC8vIHdlIHRyZWF0IFJUTCBsaWtlIExUUlxuXG4gICAgdmFyIHNoaWZ0ID0gMDtcblxuICAgIGlmICh0ZXh0QW5jaG9yID09PSAnc3RhcnQnICYmICFpc1JUTCB8fCB0ZXh0QW5jaG9yID09PSAnZW5kJyAmJiBpc1JUTCkge1xuICAgICAgc2hpZnQgPSBmaXJzdEVsZW1lbnQueCAtIHRoaXMubWluWDtcbiAgICB9IGVsc2UgaWYgKHRleHRBbmNob3IgPT09ICdlbmQnICYmICFpc1JUTCB8fCB0ZXh0QW5jaG9yID09PSAnc3RhcnQnICYmIGlzUlRMKSB7XG4gICAgICBzaGlmdCA9IGZpcnN0RWxlbWVudC54IC0gdGhpcy5tYXhYO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGlmdCA9IGZpcnN0RWxlbWVudC54IC0gKHRoaXMubWluWCArIHRoaXMubWF4WCkgLyAyO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSB0aGlzLnRleHRDaHVua1N0YXJ0OyBpIDwgdGhpcy5sZWFmVGV4dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubGVhZlRleHRzW2ldLnggKz0gc2hpZnQ7XG4gICAgfSAvLyBzdGFydCBuZXcgY2h1bmtcblxuXG4gICAgdGhpcy5taW5YID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHRoaXMubWF4WCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICB0aGlzLnRleHRDaHVua1N0YXJ0ID0gdGhpcy5sZWFmVGV4dHMubGVuZ3RoO1xuICB9XG5cbiAgYWRqdXN0Q2hpbGRDb29yZGluYXRlc1JlY3Vyc2l2ZShjdHgpIHtcbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgIHRoaXMuYWRqdXN0Q2hpbGRDb29yZGluYXRlc1JlY3Vyc2l2ZUNvcmUoY3R4LCB0aGlzLCB0aGlzLCBpKTtcbiAgICB9KTtcbiAgICB0aGlzLmFwcGx5QW5jaG9yaW5nKCk7XG4gIH1cblxuICBhZGp1c3RDaGlsZENvb3JkaW5hdGVzUmVjdXJzaXZlQ29yZShjdHgsIHRleHRQYXJlbnQsIHBhcmVudCwgaSkge1xuICAgIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZHJlbltpXTtcblxuICAgIGlmIChjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjaGlsZC5jaGlsZHJlbi5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICAgIHRleHRQYXJlbnQuYWRqdXN0Q2hpbGRDb29yZGluYXRlc1JlY3Vyc2l2ZUNvcmUoY3R4LCB0ZXh0UGFyZW50LCBjaGlsZCwgaSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSBsZWFmcyBhcmUgcmVsZXZhbnRcbiAgICAgIHRoaXMuYWRqdXN0Q2hpbGRDb29yZGluYXRlcyhjdHgsIHRleHRQYXJlbnQsIHBhcmVudCwgaSk7XG4gICAgfVxuICB9XG5cbiAgYWRqdXN0Q2hpbGRDb29yZGluYXRlcyhjdHgsIHRleHRQYXJlbnQsIHBhcmVudCwgaSkge1xuICAgIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZHJlbltpXTtcblxuICAgIGlmICh0eXBlb2YgY2hpbGQubWVhc3VyZVRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG5cbiAgICBjdHguc2F2ZSgpO1xuICAgIGNoaWxkLnNldENvbnRleHQoY3R4LCB0cnVlKTtcbiAgICB2YXIgeEF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ3gnKTtcbiAgICB2YXIgeUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ3knKTtcbiAgICB2YXIgZHhBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlKCdkeCcpO1xuICAgIHZhciBkeUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ2R5Jyk7XG4gICAgdmFyIGN1c3RvbUZvbnQgPSBjaGlsZC5nZXRTdHlsZSgnZm9udC1mYW1pbHknKS5nZXREZWZpbml0aW9uKCk7XG4gICAgdmFyIGlzUlRMID0gQm9vbGVhbihjdXN0b21Gb250KSAmJiBjdXN0b21Gb250LmlzUlRMO1xuXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIC8vIEZpcnN0IGNoaWxkcmVuIGluaGVyaXQgYXR0cmlidXRlcyBmcm9tIHBhcmVudChzKS4gUG9zaXRpb25hbCBhdHRyaWJ1dGVzXG4gICAgICAvLyBhcmUgb25seSBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCB0byBpdCdzIGZpcnN0IGNoaWxkLlxuICAgICAgaWYgKCF4QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHhBdHRyLnNldFZhbHVlKGNoaWxkLmdldEluaGVyaXRlZEF0dHJpYnV0ZSgneCcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF5QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHlBdHRyLnNldFZhbHVlKGNoaWxkLmdldEluaGVyaXRlZEF0dHJpYnV0ZSgneScpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkeEF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICBkeEF0dHIuc2V0VmFsdWUoY2hpbGQuZ2V0SW5oZXJpdGVkQXR0cmlidXRlKCdkeCcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICBkeUF0dHIuc2V0VmFsdWUoY2hpbGQuZ2V0SW5oZXJpdGVkQXR0cmlidXRlKCdkeScpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSBjaGlsZC5tZWFzdXJlVGV4dChjdHgpO1xuXG4gICAgaWYgKGlzUlRMKSB7XG4gICAgICB0ZXh0UGFyZW50LnggLT0gd2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKHhBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgIC8vIGFuIFwieFwiIGF0dHJpYnV0ZSBtYXJrcyB0aGUgc3RhcnQgb2YgYSBuZXcgY2h1bmtcbiAgICAgIHRleHRQYXJlbnQuYXBwbHlBbmNob3JpbmcoKTtcbiAgICAgIGNoaWxkLnggPSB4QXR0ci5nZXRQaXhlbHMoJ3gnKTtcblxuICAgICAgaWYgKGR4QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGNoaWxkLnggKz0gZHhBdHRyLmdldFBpeGVscygneCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZHhBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdGV4dFBhcmVudC54ICs9IGR4QXR0ci5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQueCA9IHRleHRQYXJlbnQueDtcbiAgICB9XG5cbiAgICB0ZXh0UGFyZW50LnggPSBjaGlsZC54O1xuXG4gICAgaWYgKCFpc1JUTCkge1xuICAgICAgdGV4dFBhcmVudC54ICs9IHdpZHRoO1xuICAgIH1cblxuICAgIGlmICh5QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICBjaGlsZC55ID0geUF0dHIuZ2V0UGl4ZWxzKCd5Jyk7XG5cbiAgICAgIGlmIChkeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICBjaGlsZC55ICs9IGR5QXR0ci5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGR5QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHRleHRQYXJlbnQueSArPSBkeUF0dHIuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkLnkgPSB0ZXh0UGFyZW50Lnk7XG4gICAgfVxuXG4gICAgdGV4dFBhcmVudC55ID0gY2hpbGQueTsgLy8gdXBkYXRlIHRoZSBjdXJyZW50IGNodW5rIGFuZCBpdCdzIGJvdW5kc1xuXG4gICAgdGV4dFBhcmVudC5sZWFmVGV4dHMucHVzaChjaGlsZCk7XG4gICAgdGV4dFBhcmVudC5taW5YID0gTWF0aC5taW4odGV4dFBhcmVudC5taW5YLCBjaGlsZC54LCBjaGlsZC54ICsgd2lkdGgpO1xuICAgIHRleHRQYXJlbnQubWF4WCA9IE1hdGgubWF4KHRleHRQYXJlbnQubWF4WCwgY2hpbGQueCwgY2hpbGQueCArIHdpZHRoKTtcbiAgICBjaGlsZC5jbGVhckNvbnRleHQoY3R4KTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGdldENoaWxkQm91bmRpbmdCb3goY3R4LCB0ZXh0UGFyZW50LCBwYXJlbnQsIGkpIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5baV07IC8vIG5vdCBhIHRleHQgbm9kZT9cblxuICAgIGlmICh0eXBlb2YgY2hpbGQuZ2V0Qm91bmRpbmdCb3ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBib3VuZGluZ0JveCA9IGNoaWxkLmdldEJvdW5kaW5nQm94KGN0eCk7XG5cbiAgICBpZiAoIWJvdW5kaW5nQm94KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjaGlsZC5jaGlsZHJlbi5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICB2YXIgY2hpbGRCb3VuZGluZ0JveCA9IHRleHRQYXJlbnQuZ2V0Q2hpbGRCb3VuZGluZ0JveChjdHgsIHRleHRQYXJlbnQsIGNoaWxkLCBpKTtcbiAgICAgIGJvdW5kaW5nQm94LmFkZEJvdW5kaW5nQm94KGNoaWxkQm91bmRpbmdCb3gpO1xuICAgIH0pO1xuICAgIHJldHVybiBib3VuZGluZ0JveDtcbiAgfVxuXG4gIHJlbmRlckNoaWxkKGN0eCwgdGV4dFBhcmVudCwgcGFyZW50LCBpKSB7XG4gICAgdmFyIGNoaWxkID0gcGFyZW50LmNoaWxkcmVuW2ldO1xuICAgIGNoaWxkLnJlbmRlcihjdHgpO1xuICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgIHRleHRQYXJlbnQucmVuZGVyQ2hpbGQoY3R4LCB0ZXh0UGFyZW50LCBjaGlsZCwgaSk7XG4gICAgfSk7XG4gIH1cblxuICBtZWFzdXJlVGV4dChjdHgpIHtcbiAgICB2YXIge1xuICAgICAgbWVhc3VyZUNhY2hlXG4gICAgfSA9IHRoaXM7XG5cbiAgICBpZiAofm1lYXN1cmVDYWNoZSkge1xuICAgICAgcmV0dXJuIG1lYXN1cmVDYWNoZTtcbiAgICB9XG5cbiAgICB2YXIgcmVuZGVyVGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIHZhciBtZWFzdXJlID0gdGhpcy5tZWFzdXJlVGFyZ2V0VGV4dChjdHgsIHJlbmRlclRleHQpO1xuICAgIHRoaXMubWVhc3VyZUNhY2hlID0gbWVhc3VyZTtcbiAgICByZXR1cm4gbWVhc3VyZTtcbiAgfVxuXG4gIG1lYXN1cmVUYXJnZXRUZXh0KGN0eCwgdGFyZ2V0VGV4dCkge1xuICAgIGlmICghdGFyZ2V0VGV4dC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciB7XG4gICAgICBwYXJlbnRcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgY3VzdG9tRm9udCA9IHBhcmVudC5nZXRTdHlsZSgnZm9udC1mYW1pbHknKS5nZXREZWZpbml0aW9uKCk7XG5cbiAgICBpZiAoY3VzdG9tRm9udCkge1xuICAgICAgdmFyIGZvbnRTaXplID0gdGhpcy5nZXRGb250U2l6ZSgpO1xuICAgICAgdmFyIHRleHQgPSBjdXN0b21Gb250LmlzUlRMID8gdGFyZ2V0VGV4dC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIDogdGFyZ2V0VGV4dDtcbiAgICAgIHZhciBkeCA9IHRvTnVtYmVycyhwYXJlbnQuZ2V0QXR0cmlidXRlKCdkeCcpLmdldFN0cmluZygpKTtcbiAgICAgIHZhciBsZW4gPSB0ZXh0Lmxlbmd0aDtcbiAgICAgIHZhciBfbWVhc3VyZSA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nZXRHbHlwaChjdXN0b21Gb250LCB0ZXh0LCBpKTtcbiAgICAgICAgX21lYXN1cmUgKz0gKGdseXBoLmhvcml6QWR2WCB8fCBjdXN0b21Gb250Lmhvcml6QWR2WCkgKiBmb250U2l6ZSAvIGN1c3RvbUZvbnQuZm9udEZhY2UudW5pdHNQZXJFbTtcblxuICAgICAgICBpZiAodHlwZW9mIGR4W2ldICE9PSAndW5kZWZpbmVkJyAmJiAhaXNOYU4oZHhbaV0pKSB7XG4gICAgICAgICAgX21lYXN1cmUgKz0gZHhbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9tZWFzdXJlO1xuICAgIH1cblxuICAgIGlmICghY3R4Lm1lYXN1cmVUZXh0KSB7XG4gICAgICByZXR1cm4gdGFyZ2V0VGV4dC5sZW5ndGggKiAxMDtcbiAgICB9XG5cbiAgICBjdHguc2F2ZSgpO1xuICAgIHRoaXMuc2V0Q29udGV4dChjdHgsIHRydWUpO1xuICAgIHZhciB7XG4gICAgICB3aWR0aDogbWVhc3VyZVxuICAgIH0gPSBjdHgubWVhc3VyZVRleHQodGFyZ2V0VGV4dCk7XG4gICAgdGhpcy5jbGVhckNvbnRleHQoY3R4KTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHJldHVybiBtZWFzdXJlO1xuICB9XG4gIC8qKlxyXG4gICAqIEluaGVyaXRzIHBvc2l0aW9uYWwgYXR0cmlidXRlcyBmcm9tIHtAbGluayBUZXh0RWxlbWVudH0gcGFyZW50KHMpLiBBdHRyaWJ1dGVzXHJcbiAgICogYXJlIG9ubHkgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgdG8gaXRzIGZpcnN0IGNoaWxkLlxyXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lLlxyXG4gICAqIEByZXR1cm5zIFRoZSBhdHRyaWJ1dGUgdmFsdWUgb3IgbnVsbC5cclxuICAgKi9cblxuXG4gIGdldEluaGVyaXRlZEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzLGNvbnNpc3RlbnQtdGhpc1xuICAgIHZhciBjdXJyZW50ID0gdGhpcztcblxuICAgIHdoaWxlIChjdXJyZW50IGluc3RhbmNlb2YgVGV4dEVsZW1lbnQgJiYgY3VycmVudC5pc0ZpcnN0Q2hpbGQoKSkge1xuICAgICAgdmFyIHBhcmVudEF0dHIgPSBjdXJyZW50LnBhcmVudC5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICAgIGlmIChwYXJlbnRBdHRyLmhhc1ZhbHVlKHRydWUpKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnRBdHRyLmdldFZhbHVlKCcwJyk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG59XG5cbmNsYXNzIFRTcGFuRWxlbWVudCBleHRlbmRzIFRleHRFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgbmV3LnRhcmdldCA9PT0gVFNwYW5FbGVtZW50ID8gdHJ1ZSA6IGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIHRoaXMudHlwZSA9ICd0c3Bhbic7IC8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIHRoZW4gdGhleSBvd24gdGhlIHRleHRcblxuICAgIHRoaXMudGV4dCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCA/ICcnIDogdGhpcy5nZXRUZXh0RnJvbU5vZGUoKTtcbiAgfVxuXG4gIGdldFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgfVxuXG59XG5cbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgVFNwYW5FbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAndGV4dE5vZGUnO1xuICB9XG5cbn1cblxuY2xhc3MgU1ZHRWxlbWVudCBleHRlbmRzIFJlbmRlcmVkRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ3N2Zyc7XG4gICAgdGhpcy5yb290ID0gZmFsc2U7XG4gIH1cblxuICBzZXRDb250ZXh0KGN0eCkge1xuICAgIHZhciBfdGhpcyRub2RlJHBhcmVudE5vZGU7XG5cbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnRcbiAgICB9ID0gdGhpcztcbiAgICB2YXIge1xuICAgICAgc2NyZWVuLFxuICAgICAgd2luZG93XG4gICAgfSA9IGRvY3VtZW50O1xuICAgIHZhciBjYW52YXMgPSBjdHguY2FudmFzO1xuICAgIHNjcmVlbi5zZXREZWZhdWx0cyhjdHgpO1xuXG4gICAgaWYgKGNhbnZhcy5zdHlsZSAmJiB0eXBlb2YgY3R4LmZvbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyAmJiB0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjdHguZm9udCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNhbnZhcykuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udCcpO1xuICAgICAgdmFyIGZvbnRTaXplUHJvcCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRTaXplJywgRm9udC5wYXJzZShjdHguZm9udCkuZm9udFNpemUpO1xuXG4gICAgICBpZiAoZm9udFNpemVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgZG9jdW1lbnQucm9vdEVtU2l6ZSA9IGZvbnRTaXplUHJvcC5nZXRQaXhlbHMoJ3knKTtcbiAgICAgICAgZG9jdW1lbnQuZW1TaXplID0gZG9jdW1lbnQucm9vdEVtU2l6ZTtcbiAgICAgIH1cbiAgICB9IC8vIGNyZWF0ZSBuZXcgdmlldyBwb3J0XG5cblxuICAgIGlmICghdGhpcy5nZXRBdHRyaWJ1dGUoJ3gnKS5oYXNWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneCcsIHRydWUpLnNldFZhbHVlKDApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRBdHRyaWJ1dGUoJ3knKS5oYXNWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneScsIHRydWUpLnNldFZhbHVlKDApO1xuICAgIH1cblxuICAgIHZhciB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBzY3JlZW4udmlld1BvcnQ7XG5cbiAgICBpZiAoIXRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy5nZXRTdHlsZSgnd2lkdGgnLCB0cnVlKS5zZXRWYWx1ZSgnMTAwJScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JykuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JywgdHJ1ZSkuc2V0VmFsdWUoJzEwMCUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2V0U3R5bGUoJ2NvbG9yJykuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy5nZXRTdHlsZSgnY29sb3InLCB0cnVlKS5zZXRWYWx1ZSgnYmxhY2snKTtcbiAgICB9XG5cbiAgICB2YXIgcmVmWEF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncmVmWCcpO1xuICAgIHZhciByZWZZQXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdyZWZZJyk7XG4gICAgdmFyIHZpZXdCb3hBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnKTtcbiAgICB2YXIgdmlld0JveCA9IHZpZXdCb3hBdHRyLmhhc1ZhbHVlKCkgPyB0b051bWJlcnModmlld0JveEF0dHIuZ2V0U3RyaW5nKCkpIDogbnVsbDtcbiAgICB2YXIgY2xpcCA9ICF0aGlzLnJvb3QgJiYgdGhpcy5nZXRTdHlsZSgnb3ZlcmZsb3cnKS5nZXRWYWx1ZSgnaGlkZGVuJykgIT09ICd2aXNpYmxlJztcbiAgICB2YXIgbWluWCA9IDA7XG4gICAgdmFyIG1pblkgPSAwO1xuICAgIHZhciBjbGlwWCA9IDA7XG4gICAgdmFyIGNsaXBZID0gMDtcblxuICAgIGlmICh2aWV3Qm94KSB7XG4gICAgICBtaW5YID0gdmlld0JveFswXTtcbiAgICAgIG1pblkgPSB2aWV3Qm94WzFdO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICB3aWR0aCA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICBoZWlnaHQgPSB0aGlzLmdldFN0eWxlKCdoZWlnaHQnKS5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ21hcmtlcicpIHtcbiAgICAgICAgY2xpcFggPSBtaW5YO1xuICAgICAgICBjbGlwWSA9IG1pblk7XG4gICAgICAgIG1pblggPSAwO1xuICAgICAgICBtaW5ZID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY3JlZW4udmlld1BvcnQuc2V0Q3VycmVudCh3aWR0aCwgaGVpZ2h0KTsgLy8gRGVmYXVsdCB2YWx1ZSBvZiB0cmFuc2Zvcm0tb3JpZ2luIGlzIGNlbnRlciBvbmx5IGZvciByb290IFNWRyBlbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NWRy9BdHRyaWJ1dGUvdHJhbnNmb3JtLW9yaWdpblxuXG4gICAgaWYgKHRoaXMubm9kZSAvLyBpcyBub3QgdGVtcG9yYXJ5IFNWR0VsZW1lbnRcbiAgICAmJiAoIXRoaXMucGFyZW50IHx8ICgoX3RoaXMkbm9kZSRwYXJlbnROb2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGUpID09PSBudWxsIHx8IF90aGlzJG5vZGUkcGFyZW50Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbm9kZSRwYXJlbnROb2RlLm5vZGVOYW1lKSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSAmJiB0aGlzLmdldFN0eWxlKCd0cmFuc2Zvcm0nLCBmYWxzZSwgdHJ1ZSkuaGFzVmFsdWUoKSAmJiAhdGhpcy5nZXRTdHlsZSgndHJhbnNmb3JtLW9yaWdpbicsIGZhbHNlLCB0cnVlKS5oYXNWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmdldFN0eWxlKCd0cmFuc2Zvcm0tb3JpZ2luJywgdHJ1ZSwgdHJ1ZSkuc2V0VmFsdWUoJzUwJSA1MCUnKTtcbiAgICB9XG5cbiAgICBzdXBlci5zZXRDb250ZXh0KGN0eCk7XG4gICAgY3R4LnRyYW5zbGF0ZSh0aGlzLmdldEF0dHJpYnV0ZSgneCcpLmdldFBpeGVscygneCcpLCB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpKTtcblxuICAgIGlmICh2aWV3Qm94KSB7XG4gICAgICB3aWR0aCA9IHZpZXdCb3hbMl07XG4gICAgICBoZWlnaHQgPSB2aWV3Qm94WzNdO1xuICAgIH1cblxuICAgIGRvY3VtZW50LnNldFZpZXdCb3goe1xuICAgICAgY3R4LFxuICAgICAgYXNwZWN0UmF0aW86IHRoaXMuZ2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJykuZ2V0U3RyaW5nKCksXG4gICAgICB3aWR0aDogc2NyZWVuLnZpZXdQb3J0LndpZHRoLFxuICAgICAgZGVzaXJlZFdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogc2NyZWVuLnZpZXdQb3J0LmhlaWdodCxcbiAgICAgIGRlc2lyZWRIZWlnaHQ6IGhlaWdodCxcbiAgICAgIG1pblgsXG4gICAgICBtaW5ZLFxuICAgICAgcmVmWDogcmVmWEF0dHIuZ2V0VmFsdWUoKSxcbiAgICAgIHJlZlk6IHJlZllBdHRyLmdldFZhbHVlKCksXG4gICAgICBjbGlwLFxuICAgICAgY2xpcFgsXG4gICAgICBjbGlwWVxuICAgIH0pO1xuXG4gICAgaWYgKHZpZXdCb3gpIHtcbiAgICAgIHNjcmVlbi52aWV3UG9ydC5yZW1vdmVDdXJyZW50KCk7XG4gICAgICBzY3JlZW4udmlld1BvcnQuc2V0Q3VycmVudCh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBjbGVhckNvbnRleHQoY3R4KSB7XG4gICAgc3VwZXIuY2xlYXJDb250ZXh0KGN0eCk7XG4gICAgdGhpcy5kb2N1bWVudC5zY3JlZW4udmlld1BvcnQucmVtb3ZlQ3VycmVudCgpO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlc2l6ZSBTVkcgdG8gZml0IGluIGdpdmVuIHNpemUuXHJcbiAgICogQHBhcmFtIHdpZHRoXHJcbiAgICogQHBhcmFtIGhlaWdodFxyXG4gICAqIEBwYXJhbSBwcmVzZXJ2ZUFzcGVjdFJhdGlvXHJcbiAgICovXG5cblxuICByZXNpemUod2lkdGgpIHtcbiAgICB2YXIgaGVpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB3aWR0aDtcbiAgICB2YXIgcHJlc2VydmVBc3BlY3RSYXRpbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgdmFyIHdpZHRoQXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcsIHRydWUpO1xuICAgIHZhciBoZWlnaHRBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRydWUpO1xuICAgIHZhciB2aWV3Qm94QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCd2aWV3Qm94Jyk7XG4gICAgdmFyIHN0eWxlQXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgIHZhciBvcmlnaW5XaWR0aCA9IHdpZHRoQXR0ci5nZXROdW1iZXIoMCk7XG4gICAgdmFyIG9yaWdpbkhlaWdodCA9IGhlaWdodEF0dHIuZ2V0TnVtYmVyKDApO1xuXG4gICAgaWYgKHByZXNlcnZlQXNwZWN0UmF0aW8pIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlc2VydmVBc3BlY3RSYXRpbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCB0cnVlKS5zZXRWYWx1ZShwcmVzZXJ2ZUFzcGVjdFJhdGlvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcmVzZXJ2ZUFzcGVjdFJhdGlvQXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyk7XG5cbiAgICAgICAgaWYgKHByZXNlcnZlQXNwZWN0UmF0aW9BdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvQXR0ci5zZXRWYWx1ZShwcmVzZXJ2ZUFzcGVjdFJhdGlvQXR0ci5nZXRTdHJpbmcoKS5yZXBsYWNlKC9eXFxzKihcXFMuKlxcUylcXHMqJC8sICckMScpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHdpZHRoQXR0ci5zZXRWYWx1ZSh3aWR0aCk7XG4gICAgaGVpZ2h0QXR0ci5zZXRWYWx1ZShoZWlnaHQpO1xuXG4gICAgaWYgKCF2aWV3Qm94QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICB2aWV3Qm94QXR0ci5zZXRWYWx1ZShcIjAgMCBcIi5jb25jYXQob3JpZ2luV2lkdGggfHwgd2lkdGgsIFwiIFwiKS5jb25jYXQob3JpZ2luSGVpZ2h0IHx8IGhlaWdodCkpO1xuICAgIH1cblxuICAgIGlmIChzdHlsZUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgdmFyIHdpZHRoU3R5bGUgPSB0aGlzLmdldFN0eWxlKCd3aWR0aCcpO1xuICAgICAgdmFyIGhlaWdodFN0eWxlID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0Jyk7XG5cbiAgICAgIGlmICh3aWR0aFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgd2lkdGhTdHlsZS5zZXRWYWx1ZShcIlwiLmNvbmNhdCh3aWR0aCwgXCJweFwiKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWlnaHRTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGhlaWdodFN0eWxlLnNldFZhbHVlKFwiXCIuY29uY2F0KGhlaWdodCwgXCJweFwiKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuY2xhc3MgUmVjdEVsZW1lbnQgZXh0ZW5kcyBQYXRoRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ3JlY3QnO1xuICB9XG5cbiAgcGF0aChjdHgpIHtcbiAgICB2YXIgeCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd4JykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIHkgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpO1xuICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJywgZmFsc2UsIHRydWUpLmdldFBpeGVscygneCcpO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldFN0eWxlKCdoZWlnaHQnLCBmYWxzZSwgdHJ1ZSkuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgdmFyIHJ4QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdyeCcpO1xuICAgIHZhciByeUF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncnknKTtcbiAgICB2YXIgcnggPSByeEF0dHIuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIHJ5ID0gcnlBdHRyLmdldFBpeGVscygneScpO1xuXG4gICAgaWYgKHJ4QXR0ci5oYXNWYWx1ZSgpICYmICFyeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgcnkgPSByeDtcbiAgICB9XG5cbiAgICBpZiAocnlBdHRyLmhhc1ZhbHVlKCkgJiYgIXJ4QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICByeCA9IHJ5O1xuICAgIH1cblxuICAgIHJ4ID0gTWF0aC5taW4ocngsIHdpZHRoIC8gMi4wKTtcbiAgICByeSA9IE1hdGgubWluKHJ5LCBoZWlnaHQgLyAyLjApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgdmFyIEtBUFBBID0gNCAqICgoTWF0aC5zcXJ0KDIpIC0gMSkgLyAzKTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTsgLy8gYWx3YXlzIHN0YXJ0IHRoZSBwYXRoIHNvIHdlIGRvbid0IGZpbGwgcHJpb3IgcGF0aHNcblxuICAgICAgaWYgKGhlaWdodCA+IDAgJiYgd2lkdGggPiAwKSB7XG4gICAgICAgIGN0eC5tb3ZlVG8oeCArIHJ4LCB5KTtcbiAgICAgICAgY3R4LmxpbmVUbyh4ICsgd2lkdGggLSByeCwgeSk7XG4gICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHggKyB3aWR0aCAtIHJ4ICsgS0FQUEEgKiByeCwgeSwgeCArIHdpZHRoLCB5ICsgcnkgLSBLQVBQQSAqIHJ5LCB4ICsgd2lkdGgsIHkgKyByeSk7XG4gICAgICAgIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gcnkpO1xuICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSByeSArIEtBUFBBICogcnksIHggKyB3aWR0aCAtIHJ4ICsgS0FQUEEgKiByeCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcngsIHkgKyBoZWlnaHQpO1xuICAgICAgICBjdHgubGluZVRvKHggKyByeCwgeSArIGhlaWdodCk7XG4gICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHggKyByeCAtIEtBUFBBICogcngsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByeSArIEtBUFBBICogcnksIHgsIHkgKyBoZWlnaHQgLSByeSk7XG4gICAgICAgIGN0eC5saW5lVG8oeCwgeSArIHJ5KTtcbiAgICAgICAgY3R4LmJlemllckN1cnZlVG8oeCwgeSArIHJ5IC0gS0FQUEEgKiByeSwgeCArIHJ4IC0gS0FQUEEgKiByeCwgeSwgeCArIHJ4LCB5KTtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQm91bmRpbmdCb3goeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgfVxuXG4gIGdldE1hcmtlcnMoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxufVxuXG5jbGFzcyBDaXJjbGVFbGVtZW50IGV4dGVuZHMgUGF0aEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdjaXJjbGUnO1xuICB9XG5cbiAgcGF0aChjdHgpIHtcbiAgICB2YXIgY3ggPSB0aGlzLmdldEF0dHJpYnV0ZSgnY3gnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICB2YXIgY3kgPSB0aGlzLmdldEF0dHJpYnV0ZSgnY3knKS5nZXRQaXhlbHMoJ3knKTtcbiAgICB2YXIgciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdyJykuZ2V0UGl4ZWxzKCk7XG5cbiAgICBpZiAoY3R4ICYmIHIgPiAwKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHguYXJjKGN4LCBjeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJvdW5kaW5nQm94KGN4IC0gciwgY3kgLSByLCBjeCArIHIsIGN5ICsgcik7XG4gIH1cblxuICBnZXRNYXJrZXJzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbn1cblxuY2xhc3MgRWxsaXBzZUVsZW1lbnQgZXh0ZW5kcyBQYXRoRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ2VsbGlwc2UnO1xuICB9XG5cbiAgcGF0aChjdHgpIHtcbiAgICB2YXIgS0FQUEEgPSA0ICogKChNYXRoLnNxcnQoMikgLSAxKSAvIDMpO1xuICAgIHZhciByeCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdyeCcpLmdldFBpeGVscygneCcpO1xuICAgIHZhciByeSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdyeScpLmdldFBpeGVscygneScpO1xuICAgIHZhciBjeCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjeCcpLmdldFBpeGVscygneCcpO1xuICAgIHZhciBjeSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjeScpLmdldFBpeGVscygneScpO1xuXG4gICAgaWYgKGN0eCAmJiByeCA+IDAgJiYgcnkgPiAwKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHgubW92ZVRvKGN4ICsgcngsIGN5KTtcbiAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGN4ICsgcngsIGN5ICsgS0FQUEEgKiByeSwgY3ggKyBLQVBQQSAqIHJ4LCBjeSArIHJ5LCBjeCwgY3kgKyByeSk7XG4gICAgICBjdHguYmV6aWVyQ3VydmVUbyhjeCAtIEtBUFBBICogcngsIGN5ICsgcnksIGN4IC0gcngsIGN5ICsgS0FQUEEgKiByeSwgY3ggLSByeCwgY3kpO1xuICAgICAgY3R4LmJlemllckN1cnZlVG8oY3ggLSByeCwgY3kgLSBLQVBQQSAqIHJ5LCBjeCAtIEtBUFBBICogcngsIGN5IC0gcnksIGN4LCBjeSAtIHJ5KTtcbiAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGN4ICsgS0FQUEEgKiByeCwgY3kgLSByeSwgY3ggKyByeCwgY3kgLSBLQVBQQSAqIHJ5LCBjeCArIHJ4LCBjeSk7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCb3VuZGluZ0JveChjeCAtIHJ4LCBjeSAtIHJ5LCBjeCArIHJ4LCBjeSArIHJ5KTtcbiAgfVxuXG4gIGdldE1hcmtlcnMoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxufVxuXG5jbGFzcyBMaW5lRWxlbWVudCBleHRlbmRzIFBhdGhFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAnbGluZSc7XG4gIH1cblxuICBnZXRQb2ludHMoKSB7XG4gICAgcmV0dXJuIFtuZXcgUG9pbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3gxJykuZ2V0UGl4ZWxzKCd4JyksIHRoaXMuZ2V0QXR0cmlidXRlKCd5MScpLmdldFBpeGVscygneScpKSwgbmV3IFBvaW50KHRoaXMuZ2V0QXR0cmlidXRlKCd4MicpLmdldFBpeGVscygneCcpLCB0aGlzLmdldEF0dHJpYnV0ZSgneTInKS5nZXRQaXhlbHMoJ3knKSldO1xuICB9XG5cbiAgcGF0aChjdHgpIHtcbiAgICB2YXIgW3tcbiAgICAgIHg6IHgwLFxuICAgICAgeTogeTBcbiAgICB9LCB7XG4gICAgICB4OiB4MSxcbiAgICAgIHk6IHkxXG4gICAgfV0gPSB0aGlzLmdldFBvaW50cygpO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4Lm1vdmVUbyh4MCwgeTApO1xuICAgICAgY3R4LmxpbmVUbyh4MSwgeTEpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQm91bmRpbmdCb3goeDAsIHkwLCB4MSwgeTEpO1xuICB9XG5cbiAgZ2V0TWFya2VycygpIHtcbiAgICB2YXIgW3AwLCBwMV0gPSB0aGlzLmdldFBvaW50cygpO1xuICAgIHZhciBhID0gcDAuYW5nbGVUbyhwMSk7XG4gICAgcmV0dXJuIFtbcDAsIGFdLCBbcDEsIGFdXTtcbiAgfVxuXG59XG5cbmNsYXNzIFBvbHlsaW5lRWxlbWVudCBleHRlbmRzIFBhdGhFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ3BvbHlsaW5lJztcbiAgICB0aGlzLnBvaW50cyA9IFtdO1xuICAgIHRoaXMucG9pbnRzID0gUG9pbnQucGFyc2VQYXRoKHRoaXMuZ2V0QXR0cmlidXRlKCdwb2ludHMnKS5nZXRTdHJpbmcoKSk7XG4gIH1cblxuICBwYXRoKGN0eCkge1xuICAgIHZhciB7XG4gICAgICBwb2ludHNcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgW3tcbiAgICAgIHg6IHgwLFxuICAgICAgeTogeTBcbiAgICB9XSA9IHBvaW50cztcbiAgICB2YXIgYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goeDAsIHkwKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oeDAsIHkwKTtcbiAgICB9XG5cbiAgICBwb2ludHMuZm9yRWFjaChfcmVmID0+IHtcbiAgICAgIHZhciB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgYm91bmRpbmdCb3guYWRkUG9pbnQoeCwgeSk7XG5cbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYm91bmRpbmdCb3g7XG4gIH1cblxuICBnZXRNYXJrZXJzKCkge1xuICAgIHZhciB7XG4gICAgICBwb2ludHNcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4ID0gcG9pbnRzLmxlbmd0aCAtIDE7XG4gICAgdmFyIG1hcmtlcnMgPSBbXTtcbiAgICBwb2ludHMuZm9yRWFjaCgocG9pbnQsIGkpID0+IHtcbiAgICAgIGlmIChpID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtYXJrZXJzLnB1c2goW3BvaW50LCBwb2ludC5hbmdsZVRvKHBvaW50c1tpICsgMV0pXSk7XG4gICAgfSk7XG5cbiAgICBpZiAobWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICBtYXJrZXJzLnB1c2goW3BvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sIG1hcmtlcnNbbWFya2Vycy5sZW5ndGggLSAxXVsxXV0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXJrZXJzO1xuICB9XG5cbn1cblxuY2xhc3MgUG9seWdvbkVsZW1lbnQgZXh0ZW5kcyBQb2x5bGluZUVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdwb2x5Z29uJztcbiAgfVxuXG4gIHBhdGgoY3R4KSB7XG4gICAgdmFyIGJvdW5kaW5nQm94ID0gc3VwZXIucGF0aChjdHgpO1xuICAgIHZhciBbe1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9XSA9IHRoaXMucG9pbnRzO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmRpbmdCb3g7XG4gIH1cblxufVxuXG5jbGFzcyBQYXR0ZXJuRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdwYXR0ZXJuJztcbiAgfVxuXG4gIGNyZWF0ZVBhdHRlcm4oY3R4LCBfLCBwYXJlbnRPcGFjaXR5UHJvcCkge1xuICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuZ2V0UGl4ZWxzKCd4JywgdHJ1ZSk7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMuZ2V0U3R5bGUoJ2hlaWdodCcpLmdldFBpeGVscygneScsIHRydWUpOyAvLyByZW5kZXIgbWUgdXNpbmcgYSB0ZW1wb3Jhcnkgc3ZnIGVsZW1lbnRcblxuICAgIHZhciBwYXR0ZXJuU3ZnID0gbmV3IFNWR0VsZW1lbnQodGhpcy5kb2N1bWVudCwgbnVsbCk7XG4gICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLnZpZXdCb3ggPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ3ZpZXdCb3gnLCB0aGlzLmdldEF0dHJpYnV0ZSgndmlld0JveCcpLmdldFZhbHVlKCkpO1xuICAgIHBhdHRlcm5TdmcuYXR0cmlidXRlcy53aWR0aCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAnd2lkdGgnLCBcIlwiLmNvbmNhdCh3aWR0aCwgXCJweFwiKSk7XG4gICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLmhlaWdodCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAnaGVpZ2h0JywgXCJcIi5jb25jYXQoaGVpZ2h0LCBcInB4XCIpKTtcbiAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMudHJhbnNmb3JtID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICd0cmFuc2Zvcm0nLCB0aGlzLmdldEF0dHJpYnV0ZSgncGF0dGVyblRyYW5zZm9ybScpLmdldFZhbHVlKCkpO1xuICAgIHBhdHRlcm5TdmcuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgIHZhciBwYXR0ZXJuQ2FudmFzID0gdGhpcy5kb2N1bWVudC5jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgdmFyIHBhdHRlcm5DdHggPSBwYXR0ZXJuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgdmFyIHhBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3gnKTtcbiAgICB2YXIgeUF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpO1xuXG4gICAgaWYgKHhBdHRyLmhhc1ZhbHVlKCkgJiYgeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgcGF0dGVybkN0eC50cmFuc2xhdGUoeEF0dHIuZ2V0UGl4ZWxzKCd4JywgdHJ1ZSksIHlBdHRyLmdldFBpeGVscygneScsIHRydWUpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50T3BhY2l0eVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy5zdHlsZXNbJ2ZpbGwtb3BhY2l0eSddID0gcGFyZW50T3BhY2l0eVByb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5zdHlsZXMsICdmaWxsLW9wYWNpdHknKTtcbiAgICB9IC8vIHJlbmRlciAzeDMgZ3JpZCBzbyB3aGVuIHdlIHRyYW5zZm9ybSB0aGVyZSdzIG5vIHdoaXRlIHNwYWNlIG9uIGVkZ2VzXG5cblxuICAgIGZvciAodmFyIHggPSAtMTsgeCA8PSAxOyB4KyspIHtcbiAgICAgIGZvciAodmFyIHkgPSAtMTsgeSA8PSAxOyB5KyspIHtcbiAgICAgICAgcGF0dGVybkN0eC5zYXZlKCk7XG4gICAgICAgIHBhdHRlcm5TdmcuYXR0cmlidXRlcy54ID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICd4JywgeCAqIHBhdHRlcm5DYW52YXMud2lkdGgpO1xuICAgICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMueSA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAneScsIHkgKiBwYXR0ZXJuQ2FudmFzLmhlaWdodCk7XG4gICAgICAgIHBhdHRlcm5TdmcucmVuZGVyKHBhdHRlcm5DdHgpO1xuICAgICAgICBwYXR0ZXJuQ3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcGF0dGVybiA9IGN0eC5jcmVhdGVQYXR0ZXJuKHBhdHRlcm5DYW52YXMsICdyZXBlYXQnKTtcbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxuXG59XG5cbmNsYXNzIE1hcmtlckVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAnbWFya2VyJztcbiAgfVxuXG4gIHJlbmRlcihjdHgsIHBvaW50LCBhbmdsZSkge1xuICAgIGlmICghcG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gcG9pbnQ7XG4gICAgdmFyIG9yaWVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdvcmllbnQnKS5nZXRTdHJpbmcoJ2F1dG8nKTtcbiAgICB2YXIgbWFya2VyVW5pdHMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFya2VyVW5pdHMnKS5nZXRTdHJpbmcoJ3N0cm9rZVdpZHRoJyk7XG4gICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTtcblxuICAgIGlmIChvcmllbnQgPT09ICdhdXRvJykge1xuICAgICAgY3R4LnJvdGF0ZShhbmdsZSk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlclVuaXRzID09PSAnc3Ryb2tlV2lkdGgnKSB7XG4gICAgICBjdHguc2NhbGUoY3R4LmxpbmVXaWR0aCwgY3R4LmxpbmVXaWR0aCk7XG4gICAgfVxuXG4gICAgY3R4LnNhdmUoKTsgLy8gcmVuZGVyIG1lIHVzaW5nIGEgdGVtcG9yYXJ5IHN2ZyBlbGVtZW50XG5cbiAgICB2YXIgbWFya2VyU3ZnID0gbmV3IFNWR0VsZW1lbnQodGhpcy5kb2N1bWVudCwgbnVsbCk7XG4gICAgbWFya2VyU3ZnLnR5cGUgPSB0aGlzLnR5cGU7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMudmlld0JveCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAndmlld0JveCcsIHRoaXMuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykuZ2V0VmFsdWUoKSk7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMucmVmWCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAncmVmWCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdyZWZYJykuZ2V0VmFsdWUoKSk7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMucmVmWSA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAncmVmWScsIHRoaXMuZ2V0QXR0cmlidXRlKCdyZWZZJykuZ2V0VmFsdWUoKSk7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMud2lkdGggPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ3dpZHRoJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ21hcmtlcldpZHRoJykuZ2V0VmFsdWUoKSk7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMuaGVpZ2h0ID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdoZWlnaHQnLCB0aGlzLmdldEF0dHJpYnV0ZSgnbWFya2VySGVpZ2h0JykuZ2V0VmFsdWUoKSk7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMub3ZlcmZsb3cgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ292ZXJmbG93JywgdGhpcy5nZXRBdHRyaWJ1dGUoJ292ZXJmbG93JykuZ2V0VmFsdWUoKSk7XG4gICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMuZmlsbCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAnZmlsbCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdmaWxsJykuZ2V0Q29sb3IoJ2JsYWNrJykpO1xuICAgIG1hcmtlclN2Zy5hdHRyaWJ1dGVzLnN0cm9rZSA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAnc3Ryb2tlJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0cm9rZScpLmdldFZhbHVlKCdub25lJykpO1xuICAgIG1hcmtlclN2Zy5jaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgbWFya2VyU3ZnLnJlbmRlcihjdHgpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG5cbiAgICBpZiAobWFya2VyVW5pdHMgPT09ICdzdHJva2VXaWR0aCcpIHtcbiAgICAgIGN0eC5zY2FsZSgxIC8gY3R4LmxpbmVXaWR0aCwgMSAvIGN0eC5saW5lV2lkdGgpO1xuICAgIH1cblxuICAgIGlmIChvcmllbnQgPT09ICdhdXRvJykge1xuICAgICAgY3R4LnJvdGF0ZSgtYW5nbGUpO1xuICAgIH1cblxuICAgIGN0eC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxuXG59XG5cbmNsYXNzIERlZnNFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ2RlZnMnO1xuICB9XG5cbiAgcmVuZGVyKCkgey8vIE5PT1BcbiAgfVxuXG59XG5cbmNsYXNzIEdFbGVtZW50IGV4dGVuZHMgUmVuZGVyZWRFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAnZyc7XG4gIH1cblxuICBnZXRCb3VuZGluZ0JveChjdHgpIHtcbiAgICB2YXIgYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgYm91bmRpbmdCb3guYWRkQm91bmRpbmdCb3goY2hpbGQuZ2V0Qm91bmRpbmdCb3goY3R4KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kaW5nQm94O1xuICB9XG5cbn1cblxuY2xhc3MgR3JhZGllbnRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgc3VwZXIoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIHRoaXMuYXR0cmlidXRlc1RvSW5oZXJpdCA9IFsnZ3JhZGllbnRVbml0cyddO1xuICAgIHRoaXMuc3RvcHMgPSBbXTtcbiAgICB2YXIge1xuICAgICAgc3RvcHMsXG4gICAgICBjaGlsZHJlblxuICAgIH0gPSB0aGlzO1xuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdzdG9wJykge1xuICAgICAgICBzdG9wcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldEdyYWRpZW50VW5pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdncmFkaWVudFVuaXRzJykuZ2V0U3RyaW5nKCdvYmplY3RCb3VuZGluZ0JveCcpO1xuICB9XG5cbiAgY3JlYXRlR3JhZGllbnQoY3R4LCBlbGVtZW50LCBwYXJlbnRPcGFjaXR5UHJvcCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgY29uc2lzdGVudC10aGlzXG4gICAgdmFyIHN0b3BzQ29udGFpbmVyID0gdGhpcztcblxuICAgIGlmICh0aGlzLmdldEhyZWZBdHRyaWJ1dGUoKS5oYXNWYWx1ZSgpKSB7XG4gICAgICBzdG9wc0NvbnRhaW5lciA9IHRoaXMuZ2V0SHJlZkF0dHJpYnV0ZSgpLmdldERlZmluaXRpb24oKTtcbiAgICAgIHRoaXMuaW5oZXJpdFN0b3BDb250YWluZXIoc3RvcHNDb250YWluZXIpO1xuICAgIH1cblxuICAgIHZhciB7XG4gICAgICBzdG9wc1xuICAgIH0gPSBzdG9wc0NvbnRhaW5lcjtcbiAgICB2YXIgZ3JhZGllbnQgPSB0aGlzLmdldEdyYWRpZW50KGN0eCwgZWxlbWVudCk7XG5cbiAgICBpZiAoIWdyYWRpZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRQYXJlbnRPcGFjaXR5KHBhcmVudE9wYWNpdHlQcm9wLCBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXS5jb2xvcik7XG4gICAgfVxuXG4gICAgc3RvcHMuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgIGdyYWRpZW50LmFkZENvbG9yU3RvcChzdG9wLm9mZnNldCwgdGhpcy5hZGRQYXJlbnRPcGFjaXR5KHBhcmVudE9wYWNpdHlQcm9wLCBzdG9wLmNvbG9yKSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ2dyYWRpZW50VHJhbnNmb3JtJykuaGFzVmFsdWUoKSkge1xuICAgICAgLy8gcmVuZGVyIGFzIHRyYW5zZm9ybWVkIHBhdHRlcm4gb24gdGVtcG9yYXJ5IGNhbnZhc1xuICAgICAgdmFyIHtcbiAgICAgICAgZG9jdW1lbnRcbiAgICAgIH0gPSB0aGlzO1xuICAgICAgdmFyIHtcbiAgICAgICAgTUFYX1ZJUlRVQUxfUElYRUxTLFxuICAgICAgICB2aWV3UG9ydFxuICAgICAgfSA9IGRvY3VtZW50LnNjcmVlbjtcbiAgICAgIHZhciBbcm9vdFZpZXddID0gdmlld1BvcnQudmlld1BvcnRzO1xuICAgICAgdmFyIHJlY3QgPSBuZXcgUmVjdEVsZW1lbnQoZG9jdW1lbnQsIG51bGwpO1xuICAgICAgcmVjdC5hdHRyaWJ1dGVzLnggPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICd4JywgLU1BWF9WSVJUVUFMX1BJWEVMUyAvIDMuMCk7XG4gICAgICByZWN0LmF0dHJpYnV0ZXMueSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3knLCAtTUFYX1ZJUlRVQUxfUElYRUxTIC8gMy4wKTtcbiAgICAgIHJlY3QuYXR0cmlidXRlcy53aWR0aCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3dpZHRoJywgTUFYX1ZJUlRVQUxfUElYRUxTKTtcbiAgICAgIHJlY3QuYXR0cmlidXRlcy5oZWlnaHQgPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICdoZWlnaHQnLCBNQVhfVklSVFVBTF9QSVhFTFMpO1xuICAgICAgdmFyIGdyb3VwID0gbmV3IEdFbGVtZW50KGRvY3VtZW50LCBudWxsKTtcbiAgICAgIGdyb3VwLmF0dHJpYnV0ZXMudHJhbnNmb3JtID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAndHJhbnNmb3JtJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2dyYWRpZW50VHJhbnNmb3JtJykuZ2V0VmFsdWUoKSk7XG4gICAgICBncm91cC5jaGlsZHJlbiA9IFtyZWN0XTtcbiAgICAgIHZhciBwYXR0ZXJuU3ZnID0gbmV3IFNWR0VsZW1lbnQoZG9jdW1lbnQsIG51bGwpO1xuICAgICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLnggPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICd4JywgMCk7XG4gICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMueSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3knLCAwKTtcbiAgICAgIHBhdHRlcm5TdmcuYXR0cmlidXRlcy53aWR0aCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3dpZHRoJywgcm9vdFZpZXcud2lkdGgpO1xuICAgICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLmhlaWdodCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2hlaWdodCcsIHJvb3RWaWV3LmhlaWdodCk7XG4gICAgICBwYXR0ZXJuU3ZnLmNoaWxkcmVuID0gW2dyb3VwXTtcbiAgICAgIHZhciBwYXR0ZXJuQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlQ2FudmFzKHJvb3RWaWV3LndpZHRoLCByb290Vmlldy5oZWlnaHQpO1xuICAgICAgdmFyIHBhdHRlcm5DdHggPSBwYXR0ZXJuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICBwYXR0ZXJuQ3R4LmZpbGxTdHlsZSA9IGdyYWRpZW50O1xuICAgICAgcGF0dGVyblN2Zy5yZW5kZXIocGF0dGVybkN0eCk7XG4gICAgICByZXR1cm4gcGF0dGVybkN0eC5jcmVhdGVQYXR0ZXJuKHBhdHRlcm5DYW52YXMsICduby1yZXBlYXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhZGllbnQ7XG4gIH1cblxuICBpbmhlcml0U3RvcENvbnRhaW5lcihzdG9wc0NvbnRhaW5lcikge1xuICAgIHRoaXMuYXR0cmlidXRlc1RvSW5oZXJpdC5mb3JFYWNoKGF0dHJpYnV0ZVRvSW5oZXJpdCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvSW5oZXJpdCkuaGFzVmFsdWUoKSAmJiBzdG9wc0NvbnRhaW5lci5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlVG9Jbmhlcml0KS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvSW5oZXJpdCwgdHJ1ZSkuc2V0VmFsdWUoc3RvcHNDb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvSW5oZXJpdCkuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRQYXJlbnRPcGFjaXR5KHBhcmVudE9wYWNpdHlQcm9wLCBjb2xvcikge1xuICAgIGlmIChwYXJlbnRPcGFjaXR5UHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICB2YXIgY29sb3JQcm9wID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdjb2xvcicsIGNvbG9yKTtcbiAgICAgIHJldHVybiBjb2xvclByb3AuYWRkT3BhY2l0eShwYXJlbnRPcGFjaXR5UHJvcCkuZ2V0Q29sb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxufVxuXG5jbGFzcyBMaW5lYXJHcmFkaWVudEVsZW1lbnQgZXh0ZW5kcyBHcmFkaWVudEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHN1cGVyKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICB0aGlzLnR5cGUgPSAnbGluZWFyR3JhZGllbnQnO1xuICAgIHRoaXMuYXR0cmlidXRlc1RvSW5oZXJpdC5wdXNoKCd4MScsICd5MScsICd4MicsICd5MicpO1xuICB9XG5cbiAgZ2V0R3JhZGllbnQoY3R4LCBlbGVtZW50KSB7XG4gICAgdmFyIGlzQm91bmRpbmdCb3hVbml0cyA9IHRoaXMuZ2V0R3JhZGllbnRVbml0cygpID09PSAnb2JqZWN0Qm91bmRpbmdCb3gnO1xuICAgIHZhciBib3VuZGluZ0JveCA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdCb3goY3R4KSA6IG51bGw7XG5cbiAgICBpZiAoaXNCb3VuZGluZ0JveFVuaXRzICYmICFib3VuZGluZ0JveCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdldEF0dHJpYnV0ZSgneDEnKS5oYXNWYWx1ZSgpICYmICF0aGlzLmdldEF0dHJpYnV0ZSgneTEnKS5oYXNWYWx1ZSgpICYmICF0aGlzLmdldEF0dHJpYnV0ZSgneDInKS5oYXNWYWx1ZSgpICYmICF0aGlzLmdldEF0dHJpYnV0ZSgneTInKS5oYXNWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneDEnLCB0cnVlKS5zZXRWYWx1ZSgwKTtcbiAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCd5MScsIHRydWUpLnNldFZhbHVlKDApO1xuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ3gyJywgdHJ1ZSkuc2V0VmFsdWUoMSk7XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneTInLCB0cnVlKS5zZXRWYWx1ZSgwKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC54ICsgYm91bmRpbmdCb3gud2lkdGggKiB0aGlzLmdldEF0dHJpYnV0ZSgneDEnKS5nZXROdW1iZXIoKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCd4MScpLmdldFBpeGVscygneCcpO1xuICAgIHZhciB5MSA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGJvdW5kaW5nQm94LnkgKyBib3VuZGluZ0JveC5oZWlnaHQgKiB0aGlzLmdldEF0dHJpYnV0ZSgneTEnKS5nZXROdW1iZXIoKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCd5MScpLmdldFBpeGVscygneScpO1xuICAgIHZhciB4MiA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGJvdW5kaW5nQm94LnggKyBib3VuZGluZ0JveC53aWR0aCAqIHRoaXMuZ2V0QXR0cmlidXRlKCd4MicpLmdldE51bWJlcigpIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ3gyJykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIHkyID0gaXNCb3VuZGluZ0JveFVuaXRzID8gYm91bmRpbmdCb3gueSArIGJvdW5kaW5nQm94LmhlaWdodCAqIHRoaXMuZ2V0QXR0cmlidXRlKCd5MicpLmdldE51bWJlcigpIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ3kyJykuZ2V0UGl4ZWxzKCd5Jyk7XG5cbiAgICBpZiAoeDEgPT09IHgyICYmIHkxID09PSB5Mikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCh4MSwgeTEsIHgyLCB5Mik7XG4gIH1cblxufVxuXG5jbGFzcyBSYWRpYWxHcmFkaWVudEVsZW1lbnQgZXh0ZW5kcyBHcmFkaWVudEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHN1cGVyKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICB0aGlzLnR5cGUgPSAncmFkaWFsR3JhZGllbnQnO1xuICAgIHRoaXMuYXR0cmlidXRlc1RvSW5oZXJpdC5wdXNoKCdjeCcsICdjeScsICdyJywgJ2Z4JywgJ2Z5JywgJ2ZyJyk7XG4gIH1cblxuICBnZXRHcmFkaWVudChjdHgsIGVsZW1lbnQpIHtcbiAgICB2YXIgaXNCb3VuZGluZ0JveFVuaXRzID0gdGhpcy5nZXRHcmFkaWVudFVuaXRzKCkgPT09ICdvYmplY3RCb3VuZGluZ0JveCc7XG4gICAgdmFyIGJvdW5kaW5nQm94ID0gZWxlbWVudC5nZXRCb3VuZGluZ0JveChjdHgpO1xuXG4gICAgaWYgKGlzQm91bmRpbmdCb3hVbml0cyAmJiAhYm91bmRpbmdCb3gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRBdHRyaWJ1dGUoJ2N4JykuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2N4JywgdHJ1ZSkuc2V0VmFsdWUoJzUwJScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRBdHRyaWJ1dGUoJ2N5JykuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2N5JywgdHJ1ZSkuc2V0VmFsdWUoJzUwJScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRBdHRyaWJ1dGUoJ3InKS5oYXNWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgncicsIHRydWUpLnNldFZhbHVlKCc1MCUnKTtcbiAgICB9XG5cbiAgICB2YXIgY3ggPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC54ICsgYm91bmRpbmdCb3gud2lkdGggKiB0aGlzLmdldEF0dHJpYnV0ZSgnY3gnKS5nZXROdW1iZXIoKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCdjeCcpLmdldFBpeGVscygneCcpO1xuICAgIHZhciBjeSA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGJvdW5kaW5nQm94LnkgKyBib3VuZGluZ0JveC5oZWlnaHQgKiB0aGlzLmdldEF0dHJpYnV0ZSgnY3knKS5nZXROdW1iZXIoKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCdjeScpLmdldFBpeGVscygneScpO1xuICAgIHZhciBmeCA9IGN4O1xuICAgIHZhciBmeSA9IGN5O1xuXG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdmeCcpLmhhc1ZhbHVlKCkpIHtcbiAgICAgIGZ4ID0gaXNCb3VuZGluZ0JveFVuaXRzID8gYm91bmRpbmdCb3gueCArIGJvdW5kaW5nQm94LndpZHRoICogdGhpcy5nZXRBdHRyaWJ1dGUoJ2Z4JykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgnZngnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ2Z5JykuaGFzVmFsdWUoKSkge1xuICAgICAgZnkgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC55ICsgYm91bmRpbmdCb3guaGVpZ2h0ICogdGhpcy5nZXRBdHRyaWJ1dGUoJ2Z5JykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgnZnknKS5nZXRQaXhlbHMoJ3knKTtcbiAgICB9XG5cbiAgICB2YXIgciA9IGlzQm91bmRpbmdCb3hVbml0cyA/IChib3VuZGluZ0JveC53aWR0aCArIGJvdW5kaW5nQm94LmhlaWdodCkgLyAyLjAgKiB0aGlzLmdldEF0dHJpYnV0ZSgncicpLmdldE51bWJlcigpIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ3InKS5nZXRQaXhlbHMoKTtcbiAgICB2YXIgZnIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZnInKS5nZXRQaXhlbHMoKTtcbiAgICByZXR1cm4gY3R4LmNyZWF0ZVJhZGlhbEdyYWRpZW50KGZ4LCBmeSwgZnIsIGN4LCBjeSwgcik7XG4gIH1cblxufVxuXG5jbGFzcyBTdG9wRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHN1cGVyKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICB0aGlzLnR5cGUgPSAnc3RvcCc7XG4gICAgdmFyIG9mZnNldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHRoaXMuZ2V0QXR0cmlidXRlKCdvZmZzZXQnKS5nZXROdW1iZXIoKSkpO1xuICAgIHZhciBzdG9wT3BhY2l0eSA9IHRoaXMuZ2V0U3R5bGUoJ3N0b3Atb3BhY2l0eScpO1xuICAgIHZhciBzdG9wQ29sb3IgPSB0aGlzLmdldFN0eWxlKCdzdG9wLWNvbG9yJywgdHJ1ZSk7XG5cbiAgICBpZiAoc3RvcENvbG9yLmdldFN0cmluZygpID09PSAnJykge1xuICAgICAgc3RvcENvbG9yLnNldFZhbHVlKCcjMDAwJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3BPcGFjaXR5Lmhhc1ZhbHVlKCkpIHtcbiAgICAgIHN0b3BDb2xvciA9IHN0b3BDb2xvci5hZGRPcGFjaXR5KHN0b3BPcGFjaXR5KTtcbiAgICB9XG5cbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICB0aGlzLmNvbG9yID0gc3RvcENvbG9yLmdldENvbG9yKCk7XG4gIH1cblxufVxuXG5jbGFzcyBBbmltYXRlRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHN1cGVyKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICB0aGlzLnR5cGUgPSAnYW5pbWF0ZSc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5pbml0aWFsVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuaW5pdGlhbFVuaXRzID0gJyc7XG4gICAgdGhpcy5yZW1vdmVkID0gZmFsc2U7XG4gICAgdGhpcy5mcm96ZW4gPSBmYWxzZTtcbiAgICBkb2N1bWVudC5zY3JlZW4uYW5pbWF0aW9ucy5wdXNoKHRoaXMpO1xuICAgIHRoaXMuYmVnaW4gPSB0aGlzLmdldEF0dHJpYnV0ZSgnYmVnaW4nKS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICB0aGlzLm1heER1cmF0aW9uID0gdGhpcy5iZWdpbiArIHRoaXMuZ2V0QXR0cmlidXRlKCdkdXInKS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICB0aGlzLmZyb20gPSB0aGlzLmdldEF0dHJpYnV0ZSgnZnJvbScpO1xuICAgIHRoaXMudG8gPSB0aGlzLmdldEF0dHJpYnV0ZSgndG8nKTtcbiAgICB0aGlzLnZhbHVlcyA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3ZhbHVlcycsIG51bGwpO1xuICAgIHZhciB2YWx1ZXNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlcycpO1xuXG4gICAgaWYgKHZhbHVlc0F0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgdGhpcy52YWx1ZXMuc2V0VmFsdWUodmFsdWVzQXR0ci5nZXRTdHJpbmcoKS5zcGxpdCgnOycpKTtcbiAgICB9XG4gIH1cblxuICBnZXRQcm9wZXJ0eSgpIHtcbiAgICB2YXIgYXR0cmlidXRlVHlwZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdhdHRyaWJ1dGVUeXBlJykuZ2V0U3RyaW5nKCk7XG4gICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXR0cmlidXRlTmFtZScpLmdldFN0cmluZygpO1xuXG4gICAgaWYgKGF0dHJpYnV0ZVR5cGUgPT09ICdDU1MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0U3R5bGUoYXR0cmlidXRlTmFtZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB0cnVlKTtcbiAgfVxuXG4gIGNhbGNWYWx1ZSgpIHtcbiAgICB2YXIge1xuICAgICAgaW5pdGlhbFVuaXRzXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHtcbiAgICAgIHByb2dyZXNzLFxuICAgICAgZnJvbSxcbiAgICAgIHRvXG4gICAgfSA9IHRoaXMuZ2V0UHJvZ3Jlc3MoKTsgLy8gdHdlZW4gdmFsdWUgbGluZWFybHlcblxuICAgIHZhciBuZXdWYWx1ZSA9IGZyb20uZ2V0TnVtYmVyKCkgKyAodG8uZ2V0TnVtYmVyKCkgLSBmcm9tLmdldE51bWJlcigpKSAqIHByb2dyZXNzO1xuXG4gICAgaWYgKGluaXRpYWxVbml0cyA9PT0gJyUnKSB7XG4gICAgICBuZXdWYWx1ZSAqPSAxMDAuMDsgLy8gbnVtVmFsdWUoKSByZXR1cm5zIDAtMSB3aGVyZWFzIHByb3BlcnRpZXMgYXJlIDAtMTAwXG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG5ld1ZhbHVlKS5jb25jYXQoaW5pdGlhbFVuaXRzKTtcbiAgfVxuXG4gIHVwZGF0ZShkZWx0YSkge1xuICAgIHZhciB7XG4gICAgICBwYXJlbnRcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgcHJvcCA9IHRoaXMuZ2V0UHJvcGVydHkoKTsgLy8gc2V0IGluaXRpYWwgdmFsdWVcblxuICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMuaW5pdGlhbFZhbHVlID0gcHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgIHRoaXMuaW5pdGlhbFVuaXRzID0gcHJvcC5nZXRVbml0cygpO1xuICAgIH0gLy8gaWYgd2UncmUgcGFzdCB0aGUgZW5kIHRpbWVcblxuXG4gICAgaWYgKHRoaXMuZHVyYXRpb24gPiB0aGlzLm1heER1cmF0aW9uKSB7XG4gICAgICB2YXIgZmlsbCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWxsJykuZ2V0U3RyaW5nKCdyZW1vdmUnKTsgLy8gbG9vcCBmb3IgaW5kZWZpbml0ZWx5IHJlcGVhdGluZyBhbmltYXRpb25zXG5cbiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgncmVwZWF0Q291bnQnKS5nZXRTdHJpbmcoKSA9PT0gJ2luZGVmaW5pdGUnIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdyZXBlYXREdXInKS5nZXRTdHJpbmcoKSA9PT0gJ2luZGVmaW5pdGUnKSB7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xuICAgICAgfSBlbHNlIGlmIChmaWxsID09PSAnZnJlZXplJyAmJiAhdGhpcy5mcm96ZW4pIHtcbiAgICAgICAgdGhpcy5mcm96ZW4gPSB0cnVlO1xuICAgICAgICBwYXJlbnQuYW5pbWF0aW9uRnJvemVuID0gdHJ1ZTtcbiAgICAgICAgcGFyZW50LmFuaW1hdGlvbkZyb3plblZhbHVlID0gcHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsbCA9PT0gJ3JlbW92ZScgJiYgIXRoaXMucmVtb3ZlZCkge1xuICAgICAgICB0aGlzLnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICBwcm9wLnNldFZhbHVlKHBhcmVudC5hbmltYXRpb25Gcm96ZW4gPyBwYXJlbnQuYW5pbWF0aW9uRnJvemVuVmFsdWUgOiB0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5kdXJhdGlvbiArPSBkZWx0YTsgLy8gaWYgd2UncmUgcGFzdCB0aGUgYmVnaW4gdGltZVxuXG4gICAgdmFyIHVwZGF0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmJlZ2luIDwgdGhpcy5kdXJhdGlvbikge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jYWxjVmFsdWUoKTsgLy8gdHdlZW5cblxuICAgICAgdmFyIHR5cGVBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuICAgICAgaWYgKHR5cGVBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgLy8gZm9yIHRyYW5zZm9ybSwgZXRjLlxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVBdHRyLmdldFN0cmluZygpO1xuICAgICAgICBuZXdWYWx1ZSA9IFwiXCIuY29uY2F0KHR5cGUsIFwiKFwiKS5jb25jYXQobmV3VmFsdWUsIFwiKVwiKTtcbiAgICAgIH1cblxuICAgICAgcHJvcC5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIGdldFByb2dyZXNzKCkge1xuICAgIHZhciB7XG4gICAgICBkb2N1bWVudCxcbiAgICAgIHZhbHVlc1xuICAgIH0gPSB0aGlzO1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBwcm9ncmVzczogKHRoaXMuZHVyYXRpb24gLSB0aGlzLmJlZ2luKSAvICh0aGlzLm1heER1cmF0aW9uIC0gdGhpcy5iZWdpbilcbiAgICB9O1xuXG4gICAgaWYgKHZhbHVlcy5oYXNWYWx1ZSgpKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wcm9ncmVzcyAqICh2YWx1ZXMuZ2V0VmFsdWUoKS5sZW5ndGggLSAxKTtcbiAgICAgIHZhciBsYiA9IE1hdGguZmxvb3IocCk7XG4gICAgICB2YXIgdWIgPSBNYXRoLmNlaWwocCk7XG4gICAgICByZXN1bHQuZnJvbSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2Zyb20nLCBwYXJzZUZsb2F0KHZhbHVlcy5nZXRWYWx1ZSgpW2xiXSkpO1xuICAgICAgcmVzdWx0LnRvID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAndG8nLCBwYXJzZUZsb2F0KHZhbHVlcy5nZXRWYWx1ZSgpW3ViXSkpO1xuICAgICAgcmVzdWx0LnByb2dyZXNzID0gKHAgLSBsYikgLyAodWIgLSBsYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5mcm9tID0gdGhpcy5mcm9tO1xuICAgICAgcmVzdWx0LnRvID0gdGhpcy50bztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbn1cblxuY2xhc3MgQW5pbWF0ZUNvbG9yRWxlbWVudCBleHRlbmRzIEFuaW1hdGVFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAnYW5pbWF0ZUNvbG9yJztcbiAgfVxuXG4gIGNhbGNWYWx1ZSgpIHtcbiAgICB2YXIge1xuICAgICAgcHJvZ3Jlc3MsXG4gICAgICBmcm9tLFxuICAgICAgdG9cbiAgICB9ID0gdGhpcy5nZXRQcm9ncmVzcygpO1xuICAgIHZhciBjb2xvckZyb20gPSBuZXcgUkdCQ29sb3IoZnJvbS5nZXRDb2xvcigpKTtcbiAgICB2YXIgY29sb3JUbyA9IG5ldyBSR0JDb2xvcih0by5nZXRDb2xvcigpKTtcblxuICAgIGlmIChjb2xvckZyb20ub2sgJiYgY29sb3JUby5vaykge1xuICAgICAgLy8gdHdlZW4gY29sb3IgbGluZWFybHlcbiAgICAgIHZhciByID0gY29sb3JGcm9tLnIgKyAoY29sb3JUby5yIC0gY29sb3JGcm9tLnIpICogcHJvZ3Jlc3M7XG4gICAgICB2YXIgZyA9IGNvbG9yRnJvbS5nICsgKGNvbG9yVG8uZyAtIGNvbG9yRnJvbS5nKSAqIHByb2dyZXNzO1xuICAgICAgdmFyIGIgPSBjb2xvckZyb20uYiArIChjb2xvclRvLmIgLSBjb2xvckZyb20uYikgKiBwcm9ncmVzczsgLy8gPyBhbHBoYVxuXG4gICAgICByZXR1cm4gXCJyZ2IoXCIuY29uY2F0KE1hdGguZmxvb3IociksIFwiLCBcIikuY29uY2F0KE1hdGguZmxvb3IoZyksIFwiLCBcIikuY29uY2F0KE1hdGguZmxvb3IoYiksIFwiKVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2Zyb20nKS5nZXRDb2xvcigpO1xuICB9XG5cbn1cblxuY2xhc3MgQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQgZXh0ZW5kcyBBbmltYXRlRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ2FuaW1hdGVUcmFuc2Zvcm0nO1xuICB9XG5cbiAgY2FsY1ZhbHVlKCkge1xuICAgIHZhciB7XG4gICAgICBwcm9ncmVzcyxcbiAgICAgIGZyb20sXG4gICAgICB0b1xuICAgIH0gPSB0aGlzLmdldFByb2dyZXNzKCk7IC8vIHR3ZWVuIHZhbHVlIGxpbmVhcmx5XG5cbiAgICB2YXIgdHJhbnNmb3JtRnJvbSA9IHRvTnVtYmVycyhmcm9tLmdldFN0cmluZygpKTtcbiAgICB2YXIgdHJhbnNmb3JtVG8gPSB0b051bWJlcnModG8uZ2V0U3RyaW5nKCkpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRyYW5zZm9ybUZyb20ubWFwKChmcm9tLCBpKSA9PiB7XG4gICAgICB2YXIgdG8gPSB0cmFuc2Zvcm1Ub1tpXTtcbiAgICAgIHJldHVybiBmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9ncmVzcztcbiAgICB9KS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG5cbn1cblxuY2xhc3MgRm9udEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ2ZvbnQnO1xuICAgIHRoaXMuZ2x5cGhzID0ge307XG4gICAgdGhpcy5ob3JpekFkdlggPSB0aGlzLmdldEF0dHJpYnV0ZSgnaG9yaXotYWR2LXgnKS5nZXROdW1iZXIoKTtcbiAgICB2YXIge1xuICAgICAgZGVmaW5pdGlvbnNcbiAgICB9ID0gZG9jdW1lbnQ7XG4gICAgdmFyIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5mb250RmFjZSA9IGNoaWxkO1xuICAgICAgICAgICAgdmFyIGZvbnRGYW1pbHlTdHlsZSA9IGNoaWxkLmdldFN0eWxlKCdmb250LWZhbWlseScpO1xuXG4gICAgICAgICAgICBpZiAoZm9udEZhbWlseVN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgZGVmaW5pdGlvbnNbZm9udEZhbWlseVN0eWxlLmdldFN0cmluZygpXSA9IHRoaXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgICAgICB0aGlzLm1pc3NpbmdHbHlwaCA9IGNoaWxkO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2dseXBoJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZ2x5cGggPSBjaGlsZDtcblxuICAgICAgICAgICAgaWYgKGdseXBoLmFyYWJpY0Zvcm0pIHtcbiAgICAgICAgICAgICAgdGhpcy5pc1JUTCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuaXNBcmFiaWMgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5nbHlwaHNbZ2x5cGgudW5pY29kZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbHlwaHNbZ2x5cGgudW5pY29kZV0gPSB7fTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZ2x5cGhzW2dseXBoLnVuaWNvZGVdW2dseXBoLmFyYWJpY0Zvcm1dID0gZ2x5cGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmdseXBoc1tnbHlwaC51bmljb2RlXSA9IGdseXBoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkgey8vIE5PIFJFTkRFUlxuICB9XG5cbn1cblxuY2xhc3MgRm9udEZhY2VFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgc3VwZXIoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIHRoaXMudHlwZSA9ICdmb250LWZhY2UnO1xuICAgIHRoaXMuYXNjZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FzY2VudCcpLmdldE51bWJlcigpO1xuICAgIHRoaXMuZGVzY2VudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkZXNjZW50JykuZ2V0TnVtYmVyKCk7XG4gICAgdGhpcy51bml0c1BlckVtID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3VuaXRzLXBlci1lbScpLmdldE51bWJlcigpO1xuICB9XG5cbn1cblxuY2xhc3MgTWlzc2luZ0dseXBoRWxlbWVudCBleHRlbmRzIFBhdGhFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAnbWlzc2luZy1nbHlwaCc7XG4gICAgdGhpcy5ob3JpekFkdlggPSAwO1xuICB9XG5cbn1cblxuY2xhc3MgVFJlZkVsZW1lbnQgZXh0ZW5kcyBUZXh0RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ3RyZWYnO1xuICB9XG5cbiAgZ2V0VGV4dCgpIHtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuZ2V0SHJlZkF0dHJpYnV0ZSgpLmdldERlZmluaXRpb24oKTtcblxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5bMF07XG5cbiAgICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICAgIHJldHVybiBmaXJzdENoaWxkLmdldFRleHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxufVxuXG5jbGFzcyBBRWxlbWVudCBleHRlbmRzIFRleHRFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ2EnO1xuICAgIHZhciB7XG4gICAgICBjaGlsZE5vZGVzXG4gICAgfSA9IG5vZGU7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBjaGlsZE5vZGVzWzBdO1xuICAgIHZhciBoYXNUZXh0ID0gY2hpbGROb2Rlcy5sZW5ndGggPiAwICYmIEFycmF5LmZyb20oY2hpbGROb2RlcykuZXZlcnkobm9kZSA9PiBub2RlLm5vZGVUeXBlID09PSAzKTtcbiAgICB0aGlzLmhhc1RleHQgPSBoYXNUZXh0O1xuICAgIHRoaXMudGV4dCA9IGhhc1RleHQgPyB0aGlzLmdldFRleHRGcm9tTm9kZShmaXJzdENoaWxkKSA6ICcnO1xuICB9XG5cbiAgZ2V0VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0O1xuICB9XG5cbiAgcmVuZGVyQ2hpbGRyZW4oY3R4KSB7XG4gICAgaWYgKHRoaXMuaGFzVGV4dCkge1xuICAgICAgLy8gcmVuZGVyIGFzIHRleHQgZWxlbWVudFxuICAgICAgc3VwZXIucmVuZGVyQ2hpbGRyZW4oY3R4KTtcbiAgICAgIHZhciB7XG4gICAgICAgIGRvY3VtZW50LFxuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gdGhpcztcbiAgICAgIHZhciB7XG4gICAgICAgIG1vdXNlXG4gICAgICB9ID0gZG9jdW1lbnQuc2NyZWVuO1xuICAgICAgdmFyIGZvbnRTaXplID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnZm9udFNpemUnLCBGb250LnBhcnNlKGRvY3VtZW50LmN0eC5mb250KS5mb250U2l6ZSk7IC8vIERvIG5vdCBjYWxjIGJvdW5kaW5nIGJveCBpZiBtb3VzZSBpcyBub3Qgd29ya2luZy5cblxuICAgICAgaWYgKG1vdXNlLmlzV29ya2luZygpKSB7XG4gICAgICAgIG1vdXNlLmNoZWNrQm91bmRpbmdCb3godGhpcywgbmV3IEJvdW5kaW5nQm94KHgsIHkgLSBmb250U2l6ZS5nZXRQaXhlbHMoJ3knKSwgeCArIHRoaXMubWVhc3VyZVRleHQoY3R4KSwgeSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAvLyByZW5kZXIgYXMgdGVtcG9yYXJ5IGdyb3VwXG4gICAgICB2YXIgZyA9IG5ldyBHRWxlbWVudCh0aGlzLmRvY3VtZW50LCBudWxsKTtcbiAgICAgIGcuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgICAgZy5wYXJlbnQgPSB0aGlzO1xuICAgICAgZy5yZW5kZXIoY3R4KTtcbiAgICB9XG4gIH1cblxuICBvbkNsaWNrKCkge1xuICAgIHZhciB7XG4gICAgICB3aW5kb3dcbiAgICB9ID0gdGhpcy5kb2N1bWVudDtcblxuICAgIGlmICh3aW5kb3cpIHtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuZ2V0SHJlZkF0dHJpYnV0ZSgpLmdldFN0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICBvbk1vdXNlTW92ZSgpIHtcbiAgICB2YXIgY3R4ID0gdGhpcy5kb2N1bWVudC5jdHg7XG4gICAgY3R4LmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gIH1cblxufVxuXG5mdW5jdGlvbiBvd25LZXlzJDIob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDIodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyQyKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMkMihPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmNsYXNzIFRleHRQYXRoRWxlbWVudCBleHRlbmRzIFRleHRFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ3RleHRQYXRoJztcbiAgICB0aGlzLnRleHRXaWR0aCA9IDA7XG4gICAgdGhpcy50ZXh0SGVpZ2h0ID0gMDtcbiAgICB0aGlzLnBhdGhMZW5ndGggPSAtMTtcbiAgICB0aGlzLmdseXBoSW5mbyA9IG51bGw7XG4gICAgdGhpcy5sZXR0ZXJTcGFjaW5nQ2FjaGUgPSBbXTtcbiAgICB0aGlzLm1lYXN1cmVzQ2FjaGUgPSBuZXcgTWFwKFtbJycsIDBdXSk7XG4gICAgdmFyIHBhdGhFbGVtZW50ID0gdGhpcy5nZXRIcmVmQXR0cmlidXRlKCkuZ2V0RGVmaW5pdGlvbigpO1xuICAgIHRoaXMudGV4dCA9IHRoaXMuZ2V0VGV4dEZyb21Ob2RlKCk7XG4gICAgdGhpcy5kYXRhQXJyYXkgPSB0aGlzLnBhcnNlUGF0aERhdGEocGF0aEVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0O1xuICB9XG5cbiAgcGF0aChjdHgpIHtcbiAgICB2YXIge1xuICAgICAgZGF0YUFycmF5XG4gICAgfSA9IHRoaXM7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgfVxuXG4gICAgZGF0YUFycmF5LmZvckVhY2goX3JlZiA9PiB7XG4gICAgICB2YXIge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwb2ludHNcbiAgICAgIH0gPSBfcmVmO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkxJTkVfVE86XG4gICAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhwb2ludHNbMF0sIHBvaW50c1sxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLk1PVkVfVE86XG4gICAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyhwb2ludHNbMF0sIHBvaW50c1sxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkNVUlZFX1RPOlxuICAgICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdLCBwb2ludHNbNV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5RVUFEX1RPOlxuICAgICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkFSQzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgW2N4LCBjeSwgcngsIHJ5LCB0aGV0YSwgZFRoZXRhLCBwc2ksIGZzXSA9IHBvaW50cztcbiAgICAgICAgICAgIHZhciByID0gcnggPiByeSA/IHJ4IDogcnk7XG4gICAgICAgICAgICB2YXIgc2NhbGVYID0gcnggPiByeSA/IDEgOiByeCAvIHJ5O1xuICAgICAgICAgICAgdmFyIHNjYWxlWSA9IHJ4ID4gcnkgPyByeSAvIHJ4IDogMTtcblxuICAgICAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKGN4LCBjeSk7XG4gICAgICAgICAgICAgIGN0eC5yb3RhdGUocHNpKTtcbiAgICAgICAgICAgICAgY3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgICAgICAgICAgY3R4LmFyYygwLCAwLCByLCB0aGV0YSwgdGhldGEgKyBkVGhldGEsIEJvb2xlYW4oMSAtIGZzKSk7XG4gICAgICAgICAgICAgIGN0eC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTtcbiAgICAgICAgICAgICAgY3R4LnJvdGF0ZSgtcHNpKTtcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSgtY3gsIC1jeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFBhdGhQYXJzZXIuQ0xPU0VfUEFUSDpcbiAgICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZW5kZXJDaGlsZHJlbihjdHgpIHtcbiAgICB0aGlzLnNldFRleHREYXRhKGN0eCk7XG4gICAgY3R4LnNhdmUoKTtcbiAgICB2YXIgdGV4dERlY29yYXRpb24gPSB0aGlzLnBhcmVudC5nZXRTdHlsZSgndGV4dC1kZWNvcmF0aW9uJykuZ2V0U3RyaW5nKCk7XG4gICAgdmFyIGZvbnRTaXplID0gdGhpcy5nZXRGb250U2l6ZSgpO1xuICAgIHZhciB7XG4gICAgICBnbHlwaEluZm9cbiAgICB9ID0gdGhpcztcbiAgICB2YXIgZmlsbCA9IGN0eC5maWxsU3R5bGU7XG5cbiAgICBpZiAodGV4dERlY29yYXRpb24gPT09ICd1bmRlcmxpbmUnKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgfVxuXG4gICAgZ2x5cGhJbmZvLmZvckVhY2goKGdseXBoLCBpKSA9PiB7XG4gICAgICB2YXIge1xuICAgICAgICBwMCxcbiAgICAgICAgcDEsXG4gICAgICAgIHJvdGF0aW9uLFxuICAgICAgICB0ZXh0OiBwYXJ0aWFsVGV4dFxuICAgICAgfSA9IGdseXBoO1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2xhdGUocDAueCwgcDAueSk7XG4gICAgICBjdHgucm90YXRlKHJvdGF0aW9uKTtcblxuICAgICAgaWYgKGN0eC5maWxsU3R5bGUpIHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KHBhcnRpYWxUZXh0LCAwLCAwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0eC5zdHJva2VTdHlsZSkge1xuICAgICAgICBjdHguc3Ryb2tlVGV4dChwYXJ0aWFsVGV4dCwgMCwgMCk7XG4gICAgICB9XG5cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG5cbiAgICAgIGlmICh0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZScpIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBjdHgubW92ZVRvKHAwLngsIHAwLnkgKyBmb250U2l6ZSAvIDgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4LmxpbmVUbyhwMS54LCBwMS55ICsgZm9udFNpemUgLyA1KTtcbiAgICAgIH0gLy8gLy8gVG8gYXNzaXN0IHdpdGggZGVidWdnaW5nIHZpc3VhbGx5LCB1bmNvbW1lbnQgZm9sbG93aW5nXG4gICAgICAvL1xuICAgICAgLy8gY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgLy8gaWYgKGkgJSAyKVxuICAgICAgLy8gXHRjdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgIC8vIGVsc2VcbiAgICAgIC8vIFx0Y3R4LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgIC8vIGN0eC5tb3ZlVG8ocDAueCwgcDAueSk7XG4gICAgICAvLyBjdHgubGluZVRvKHAxLngsIHAxLnkpO1xuICAgICAgLy8gY3R4LnN0cm9rZSgpO1xuICAgICAgLy8gY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgfSk7XG5cbiAgICBpZiAodGV4dERlY29yYXRpb24gPT09ICd1bmRlcmxpbmUnKSB7XG4gICAgICBjdHgubGluZVdpZHRoID0gZm9udFNpemUgLyAyMDtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGZpbGw7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgfVxuXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIGdldExldHRlclNwYWNpbmdBdCgpIHtcbiAgICB2YXIgaWR4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICAgIHJldHVybiB0aGlzLmxldHRlclNwYWNpbmdDYWNoZVtpZHhdIHx8IDA7XG4gIH1cblxuICBmaW5kU2VnbWVudFRvRml0Q2hhcihjdHgsIGFuY2hvciwgdGV4dEZ1bGxXaWR0aCwgZnVsbFBhdGhXaWR0aCwgc3BhY2VzTnVtYmVyLCBpbnB1dE9mZnNldCwgZHksIGMsIGNoYXJJKSB7XG4gICAgdmFyIG9mZnNldCA9IGlucHV0T2Zmc2V0O1xuICAgIHZhciBnbHlwaFdpZHRoID0gdGhpcy5tZWFzdXJlVGV4dChjdHgsIGMpO1xuXG4gICAgaWYgKGMgPT09ICcgJyAmJiBhbmNob3IgPT09ICdqdXN0aWZ5JyAmJiB0ZXh0RnVsbFdpZHRoIDwgZnVsbFBhdGhXaWR0aCkge1xuICAgICAgZ2x5cGhXaWR0aCArPSAoZnVsbFBhdGhXaWR0aCAtIHRleHRGdWxsV2lkdGgpIC8gc3BhY2VzTnVtYmVyO1xuICAgIH1cblxuICAgIGlmIChjaGFySSA+IC0xKSB7XG4gICAgICBvZmZzZXQgKz0gdGhpcy5nZXRMZXR0ZXJTcGFjaW5nQXQoY2hhckkpO1xuICAgIH1cblxuICAgIHZhciBzcGxpbmVTdGVwID0gdGhpcy50ZXh0SGVpZ2h0IC8gMjA7XG4gICAgdmFyIHAwID0gdGhpcy5nZXRFcXVpZGlzdGFudFBvaW50T25QYXRoKG9mZnNldCwgc3BsaW5lU3RlcCwgMCk7XG4gICAgdmFyIHAxID0gdGhpcy5nZXRFcXVpZGlzdGFudFBvaW50T25QYXRoKG9mZnNldCArIGdseXBoV2lkdGgsIHNwbGluZVN0ZXAsIDApO1xuICAgIHZhciBzZWdtZW50ID0ge1xuICAgICAgcDAsXG4gICAgICBwMVxuICAgIH07XG4gICAgdmFyIHJvdGF0aW9uID0gcDAgJiYgcDEgPyBNYXRoLmF0YW4yKHAxLnkgLSBwMC55LCBwMS54IC0gcDAueCkgOiAwO1xuXG4gICAgaWYgKGR5KSB7XG4gICAgICB2YXIgZHlYID0gTWF0aC5jb3MoTWF0aC5QSSAvIDIgKyByb3RhdGlvbikgKiBkeTtcbiAgICAgIHZhciBkeVkgPSBNYXRoLmNvcygtcm90YXRpb24pICogZHk7XG4gICAgICBzZWdtZW50LnAwID0gX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgcDApLCB7fSwge1xuICAgICAgICB4OiBwMC54ICsgZHlYLFxuICAgICAgICB5OiBwMC55ICsgZHlZXG4gICAgICB9KTtcbiAgICAgIHNlZ21lbnQucDEgPSBfb2JqZWN0U3ByZWFkJDIoX29iamVjdFNwcmVhZCQyKHt9LCBwMSksIHt9LCB7XG4gICAgICAgIHg6IHAxLnggKyBkeVgsXG4gICAgICAgIHk6IHAxLnkgKyBkeVlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCArPSBnbHlwaFdpZHRoO1xuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXQsXG4gICAgICBzZWdtZW50LFxuICAgICAgcm90YXRpb25cbiAgICB9O1xuICB9XG5cbiAgbWVhc3VyZVRleHQoY3R4LCB0ZXh0KSB7XG4gICAgdmFyIHtcbiAgICAgIG1lYXN1cmVzQ2FjaGVcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgdGFyZ2V0VGV4dCA9IHRleHQgfHwgdGhpcy5nZXRUZXh0KCk7XG5cbiAgICBpZiAobWVhc3VyZXNDYWNoZS5oYXModGFyZ2V0VGV4dCkpIHtcbiAgICAgIHJldHVybiBtZWFzdXJlc0NhY2hlLmdldCh0YXJnZXRUZXh0KTtcbiAgICB9XG5cbiAgICB2YXIgbWVhc3VyZSA9IHRoaXMubWVhc3VyZVRhcmdldFRleHQoY3R4LCB0YXJnZXRUZXh0KTtcbiAgICBtZWFzdXJlc0NhY2hlLnNldCh0YXJnZXRUZXh0LCBtZWFzdXJlKTtcbiAgICByZXR1cm4gbWVhc3VyZTtcbiAgfSAvLyBUaGlzIG1ldGhvZCBzdXBwb3NlcyB3aGF0IGFsbCBjdXN0b20gZm9udHMgYWxyZWFkeSBsb2FkZWQuXG4gIC8vIElmIHNvbWUgZm9udCB3aWxsIGJlIGxvYWRlZCBhZnRlciB0aGlzIG1ldGhvZCBjYWxsLCA8dGV4dFBhdGg+IHdpbGwgbm90IGJlIHJlbmRlcmVkIGNvcnJlY3RseS5cbiAgLy8gWW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBtYW51YWxseSB0byB1cGRhdGUgZ2x5cGhzIGNhY2hlLlxuXG5cbiAgc2V0VGV4dERhdGEoY3R4KSB7XG4gICAgaWYgKHRoaXMuZ2x5cGhJbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJlbmRlclRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgICB2YXIgY2hhcnMgPSByZW5kZXJUZXh0LnNwbGl0KCcnKTtcbiAgICB2YXIgc3BhY2VzTnVtYmVyID0gcmVuZGVyVGV4dC5zcGxpdCgnICcpLmxlbmd0aCAtIDE7XG4gICAgdmFyIGR4ID0gdGhpcy5wYXJlbnQuZ2V0QXR0cmlidXRlKCdkeCcpLnNwbGl0KCkubWFwKF8gPT4gXy5nZXRQaXhlbHMoJ3gnKSk7XG4gICAgdmFyIGR5ID0gdGhpcy5wYXJlbnQuZ2V0QXR0cmlidXRlKCdkeScpLmdldFBpeGVscygneScpO1xuICAgIHZhciBhbmNob3IgPSB0aGlzLnBhcmVudC5nZXRTdHlsZSgndGV4dC1hbmNob3InKS5nZXRTdHJpbmcoJ3N0YXJ0Jyk7XG4gICAgdmFyIHRoaXNTcGFjaW5nID0gdGhpcy5nZXRTdHlsZSgnbGV0dGVyLXNwYWNpbmcnKTtcbiAgICB2YXIgcGFyZW50U3BhY2luZyA9IHRoaXMucGFyZW50LmdldFN0eWxlKCdsZXR0ZXItc3BhY2luZycpO1xuICAgIHZhciBsZXR0ZXJTcGFjaW5nID0gMDtcblxuICAgIGlmICghdGhpc1NwYWNpbmcuaGFzVmFsdWUoKSB8fCB0aGlzU3BhY2luZy5nZXRWYWx1ZSgpID09PSAnaW5oZXJpdCcpIHtcbiAgICAgIGxldHRlclNwYWNpbmcgPSBwYXJlbnRTcGFjaW5nLmdldFBpeGVscygpO1xuICAgIH0gZWxzZSBpZiAodGhpc1NwYWNpbmcuaGFzVmFsdWUoKSkge1xuICAgICAgaWYgKHRoaXNTcGFjaW5nLmdldFZhbHVlKCkgIT09ICdpbml0aWFsJyAmJiB0aGlzU3BhY2luZy5nZXRWYWx1ZSgpICE9PSAndW5zZXQnKSB7XG4gICAgICAgIGxldHRlclNwYWNpbmcgPSB0aGlzU3BhY2luZy5nZXRQaXhlbHMoKTtcbiAgICAgIH1cbiAgICB9IC8vIGZpbGwgbGV0dGVyLXNwYWNpbmcgY2FjaGVcblxuXG4gICAgdmFyIGxldHRlclNwYWNpbmdDYWNoZSA9IFtdO1xuICAgIHZhciB0ZXh0TGVuID0gcmVuZGVyVGV4dC5sZW5ndGg7XG4gICAgdGhpcy5sZXR0ZXJTcGFjaW5nQ2FjaGUgPSBsZXR0ZXJTcGFjaW5nQ2FjaGU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRMZW47IGkrKykge1xuICAgICAgbGV0dGVyU3BhY2luZ0NhY2hlLnB1c2godHlwZW9mIGR4W2ldICE9PSAndW5kZWZpbmVkJyA/IGR4W2ldIDogbGV0dGVyU3BhY2luZyk7XG4gICAgfVxuXG4gICAgdmFyIGR4U3VtID0gbGV0dGVyU3BhY2luZ0NhY2hlLnJlZHVjZSgoYWNjLCBjdXIsIGkpID0+IGkgPT09IDAgPyAwIDogYWNjICsgY3VyIHx8IDAsIDApO1xuICAgIHZhciB0ZXh0V2lkdGggPSB0aGlzLm1lYXN1cmVUZXh0KGN0eCk7XG4gICAgdmFyIHRleHRGdWxsV2lkdGggPSBNYXRoLm1heCh0ZXh0V2lkdGggKyBkeFN1bSwgMCk7XG4gICAgdGhpcy50ZXh0V2lkdGggPSB0ZXh0V2lkdGg7XG4gICAgdGhpcy50ZXh0SGVpZ2h0ID0gdGhpcy5nZXRGb250U2l6ZSgpO1xuICAgIHRoaXMuZ2x5cGhJbmZvID0gW107XG4gICAgdmFyIGZ1bGxQYXRoV2lkdGggPSB0aGlzLmdldFBhdGhMZW5ndGgoKTtcbiAgICB2YXIgc3RhcnRPZmZzZXQgPSB0aGlzLmdldFN0eWxlKCdzdGFydE9mZnNldCcpLmdldE51bWJlcigwKSAqIGZ1bGxQYXRoV2lkdGg7XG4gICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICBpZiAoYW5jaG9yID09PSAnbWlkZGxlJyB8fCBhbmNob3IgPT09ICdjZW50ZXInKSB7XG4gICAgICBvZmZzZXQgPSAtdGV4dEZ1bGxXaWR0aCAvIDI7XG4gICAgfVxuXG4gICAgaWYgKGFuY2hvciA9PT0gJ2VuZCcgfHwgYW5jaG9yID09PSAncmlnaHQnKSB7XG4gICAgICBvZmZzZXQgPSAtdGV4dEZ1bGxXaWR0aDtcbiAgICB9XG5cbiAgICBvZmZzZXQgKz0gc3RhcnRPZmZzZXQ7XG4gICAgY2hhcnMuZm9yRWFjaCgoY2hhciwgaSkgPT4ge1xuICAgICAgLy8gRmluZCBzdWNoIHNlZ21lbnQgd2hhdCBkaXN0YW5jZSBiZXR3ZWVuIHAwIGFuZCBwMSBpcyBhcHByb3guIHdpZHRoIG9mIGdseXBoXG4gICAgICB2YXIge1xuICAgICAgICBvZmZzZXQ6IG5leHRPZmZzZXQsXG4gICAgICAgIHNlZ21lbnQsXG4gICAgICAgIHJvdGF0aW9uXG4gICAgICB9ID0gdGhpcy5maW5kU2VnbWVudFRvRml0Q2hhcihjdHgsIGFuY2hvciwgdGV4dEZ1bGxXaWR0aCwgZnVsbFBhdGhXaWR0aCwgc3BhY2VzTnVtYmVyLCBvZmZzZXQsIGR5LCBjaGFyLCBpKTtcbiAgICAgIG9mZnNldCA9IG5leHRPZmZzZXQ7XG5cbiAgICAgIGlmICghc2VnbWVudC5wMCB8fCAhc2VnbWVudC5wMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRMaW5lTGVuZ3RoKFxuICAgICAgLy8gXHRzZWdtZW50LnAwLngsXG4gICAgICAvLyBcdHNlZ21lbnQucDAueSxcbiAgICAgIC8vIFx0c2VnbWVudC5wMS54LFxuICAgICAgLy8gXHRzZWdtZW50LnAxLnlcbiAgICAgIC8vICk7XG4gICAgICAvLyBOb3RlOiBTaW5jZSBnbHlwaHMgYXJlIHJlbmRlcmVkIG9uZSBhdCBhIHRpbWUsIGFueSBrZXJuaW5nIHBhaXIgZGF0YSBidWlsdCBpbnRvIHRoZSBmb250IHdpbGwgbm90IGJlIHVzZWQuXG4gICAgICAvLyBDYW4gZm9yZXNlZSBoYXZpbmcgYSByb3VnaCBwYWlyIHRhYmxlIGJ1aWx0IGluIHRoYXQgdGhlIGRldmVsb3BlciBjYW4gb3ZlcnJpZGUgYXMgbmVlZGVkLlxuICAgICAgLy8gT3IgdXNlIFwiZHhcIiBhdHRyaWJ1dGUgb2YgdGhlIDx0ZXh0PiBub2RlIGFzIGEgbmFpdmUgcmVwbGFjZW1lbnRcbiAgICAgIC8vIGNvbnN0IGtlcm4gPSAwO1xuICAgICAgLy8gcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gY29uc3QgbWlkcG9pbnQgPSB0aGlzLmdldFBvaW50T25MaW5lKFxuICAgICAgLy8gXHRrZXJuICsgd2lkdGggLyAyLjAsXG4gICAgICAvLyBcdHNlZ21lbnQucDAueCwgc2VnbWVudC5wMC55LCBzZWdtZW50LnAxLngsIHNlZ21lbnQucDEueVxuICAgICAgLy8gKTtcblxuXG4gICAgICB0aGlzLmdseXBoSW5mby5wdXNoKHtcbiAgICAgICAgLy8gdHJhbnNwb3NlWDogbWlkcG9pbnQueCxcbiAgICAgICAgLy8gdHJhbnNwb3NlWTogbWlkcG9pbnQueSxcbiAgICAgICAgdGV4dDogY2hhcnNbaV0sXG4gICAgICAgIHAwOiBzZWdtZW50LnAwLFxuICAgICAgICBwMTogc2VnbWVudC5wMSxcbiAgICAgICAgcm90YXRpb25cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcGFyc2VQYXRoRGF0YShwYXRoKSB7XG4gICAgdGhpcy5wYXRoTGVuZ3RoID0gLTE7IC8vIHJlc2V0IHBhdGggbGVuZ3RoXG5cbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgcGF0aENvbW1hbmRzID0gW107XG4gICAgdmFyIHtcbiAgICAgIHBhdGhQYXJzZXJcbiAgICB9ID0gcGF0aDtcbiAgICBwYXRoUGFyc2VyLnJlc2V0KCk7IC8vIGNvbnZlcnQgbCwgSCwgaCwgViwgYW5kIHYgdG8gTFxuXG4gICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzRW5kKCkpIHtcbiAgICAgIHZhciB7XG4gICAgICAgIGN1cnJlbnRcbiAgICAgIH0gPSBwYXRoUGFyc2VyO1xuICAgICAgdmFyIHN0YXJ0WCA9IGN1cnJlbnQgPyBjdXJyZW50LnggOiAwO1xuICAgICAgdmFyIHN0YXJ0WSA9IGN1cnJlbnQgPyBjdXJyZW50LnkgOiAwO1xuICAgICAgdmFyIGNvbW1hbmQgPSBwYXRoUGFyc2VyLm5leHQoKTtcbiAgICAgIHZhciBuZXh0Q29tbWFuZFR5cGUgPSBjb21tYW5kLnR5cGU7XG4gICAgICB2YXIgcG9pbnRzID0gW107XG5cbiAgICAgIHN3aXRjaCAoY29tbWFuZC50eXBlKSB7XG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5NT1ZFX1RPOlxuICAgICAgICAgIHRoaXMucGF0aE0ocGF0aFBhcnNlciwgcG9pbnRzKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFBhdGhQYXJzZXIuTElORV9UTzpcbiAgICAgICAgICBuZXh0Q29tbWFuZFR5cGUgPSB0aGlzLnBhdGhMKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkhPUklaX0xJTkVfVE86XG4gICAgICAgICAgbmV4dENvbW1hbmRUeXBlID0gdGhpcy5wYXRoSChwYXRoUGFyc2VyLCBwb2ludHMpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5WRVJUX0xJTkVfVE86XG4gICAgICAgICAgbmV4dENvbW1hbmRUeXBlID0gdGhpcy5wYXRoVihwYXRoUGFyc2VyLCBwb2ludHMpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5DVVJWRV9UTzpcbiAgICAgICAgICB0aGlzLnBhdGhDKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLlNNT09USF9DVVJWRV9UTzpcbiAgICAgICAgICBuZXh0Q29tbWFuZFR5cGUgPSB0aGlzLnBhdGhTKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLlFVQURfVE86XG4gICAgICAgICAgdGhpcy5wYXRoUShwYXRoUGFyc2VyLCBwb2ludHMpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5TTU9PVEhfUVVBRF9UTzpcbiAgICAgICAgICBuZXh0Q29tbWFuZFR5cGUgPSB0aGlzLnBhdGhUKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkFSQzpcbiAgICAgICAgICBwb2ludHMgPSB0aGlzLnBhdGhBKHBhdGhQYXJzZXIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5DTE9TRV9QQVRIOlxuICAgICAgICAgIFBhdGhFbGVtZW50LnBhdGhaKHBhdGhQYXJzZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWFuZC50eXBlICE9PSBQYXRoUGFyc2VyLkNMT1NFX1BBVEgpIHtcbiAgICAgICAgcGF0aENvbW1hbmRzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IG5leHRDb21tYW5kVHlwZSxcbiAgICAgICAgICBwb2ludHMsXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIHg6IHN0YXJ0WCxcbiAgICAgICAgICAgIHk6IHN0YXJ0WVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF0aExlbmd0aDogdGhpcy5jYWxjTGVuZ3RoKHN0YXJ0WCwgc3RhcnRZLCBuZXh0Q29tbWFuZFR5cGUsIHBvaW50cylcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXRoQ29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogUGF0aFBhcnNlci5DTE9TRV9QQVRILFxuICAgICAgICAgIHBvaW50czogW10sXG4gICAgICAgICAgcGF0aExlbmd0aDogMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aENvbW1hbmRzO1xuICB9XG5cbiAgcGF0aE0ocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgdmFyIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhNKHBhdGhQYXJzZXIpLnBvaW50O1xuICAgIHBvaW50cy5wdXNoKHgsIHkpO1xuICB9XG5cbiAgcGF0aEwocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgdmFyIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhMKHBhdGhQYXJzZXIpLnBvaW50O1xuICAgIHBvaW50cy5wdXNoKHgsIHkpO1xuICAgIHJldHVybiBQYXRoUGFyc2VyLkxJTkVfVE87XG4gIH1cblxuICBwYXRoSChwYXRoUGFyc2VyLCBwb2ludHMpIHtcbiAgICB2YXIge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gUGF0aEVsZW1lbnQucGF0aEgocGF0aFBhcnNlcikucG9pbnQ7XG4gICAgcG9pbnRzLnB1c2goeCwgeSk7XG4gICAgcmV0dXJuIFBhdGhQYXJzZXIuTElORV9UTztcbiAgfVxuXG4gIHBhdGhWKHBhdGhQYXJzZXIsIHBvaW50cykge1xuICAgIHZhciB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSBQYXRoRWxlbWVudC5wYXRoVihwYXRoUGFyc2VyKS5wb2ludDtcbiAgICBwb2ludHMucHVzaCh4LCB5KTtcbiAgICByZXR1cm4gUGF0aFBhcnNlci5MSU5FX1RPO1xuICB9XG5cbiAgcGF0aEMocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgdmFyIHtcbiAgICAgIHBvaW50LFxuICAgICAgY29udHJvbFBvaW50LFxuICAgICAgY3VycmVudFBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhDKHBhdGhQYXJzZXIpO1xuICAgIHBvaW50cy5wdXNoKHBvaW50LngsIHBvaW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgfVxuXG4gIHBhdGhTKHBhdGhQYXJzZXIsIHBvaW50cykge1xuICAgIHZhciB7XG4gICAgICBwb2ludCxcbiAgICAgIGNvbnRyb2xQb2ludCxcbiAgICAgIGN1cnJlbnRQb2ludFxuICAgIH0gPSBQYXRoRWxlbWVudC5wYXRoUyhwYXRoUGFyc2VyKTtcbiAgICBwb2ludHMucHVzaChwb2ludC54LCBwb2ludC55LCBjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7XG4gICAgcmV0dXJuIFBhdGhQYXJzZXIuQ1VSVkVfVE87XG4gIH1cblxuICBwYXRoUShwYXRoUGFyc2VyLCBwb2ludHMpIHtcbiAgICB2YXIge1xuICAgICAgY29udHJvbFBvaW50LFxuICAgICAgY3VycmVudFBvaW50XG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhRKHBhdGhQYXJzZXIpO1xuICAgIHBvaW50cy5wdXNoKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgfVxuXG4gIHBhdGhUKHBhdGhQYXJzZXIsIHBvaW50cykge1xuICAgIHZhciB7XG4gICAgICBjb250cm9sUG9pbnQsXG4gICAgICBjdXJyZW50UG9pbnRcbiAgICB9ID0gUGF0aEVsZW1lbnQucGF0aFQocGF0aFBhcnNlcik7XG4gICAgcG9pbnRzLnB1c2goY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBjdXJyZW50UG9pbnQueCwgY3VycmVudFBvaW50LnkpO1xuICAgIHJldHVybiBQYXRoUGFyc2VyLlFVQURfVE87XG4gIH1cblxuICBwYXRoQShwYXRoUGFyc2VyKSB7XG4gICAgdmFyIHtcbiAgICAgIHJYLFxuICAgICAgclksXG4gICAgICBzd2VlcEZsYWcsXG4gICAgICB4QXhpc1JvdGF0aW9uLFxuICAgICAgY2VudHAsXG4gICAgICBhMSxcbiAgICAgIGFkXG4gICAgfSA9IFBhdGhFbGVtZW50LnBhdGhBKHBhdGhQYXJzZXIpO1xuXG4gICAgaWYgKHN3ZWVwRmxhZyA9PT0gMCAmJiBhZCA+IDApIHtcbiAgICAgIGFkIC09IDIgKiBNYXRoLlBJO1xuICAgIH1cblxuICAgIGlmIChzd2VlcEZsYWcgPT09IDEgJiYgYWQgPCAwKSB7XG4gICAgICBhZCArPSAyICogTWF0aC5QSTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2NlbnRwLngsIGNlbnRwLnksIHJYLCByWSwgYTEsIGFkLCB4QXhpc1JvdGF0aW9uLCBzd2VlcEZsYWddO1xuICB9XG5cbiAgY2FsY0xlbmd0aCh4LCB5LCBjb21tYW5kVHlwZSwgcG9pbnRzKSB7XG4gICAgdmFyIGxlbiA9IDA7XG4gICAgdmFyIHAxID0gbnVsbDtcbiAgICB2YXIgcDIgPSBudWxsO1xuICAgIHZhciB0ID0gMDtcblxuICAgIHN3aXRjaCAoY29tbWFuZFR5cGUpIHtcbiAgICAgIGNhc2UgUGF0aFBhcnNlci5MSU5FX1RPOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lTGVuZ3RoKHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdKTtcblxuICAgICAgY2FzZSBQYXRoUGFyc2VyLkNVUlZFX1RPOlxuICAgICAgICAvLyBBcHByb3hpbWF0ZXMgYnkgYnJlYWtpbmcgY3VydmUgaW50byAxMDAgbGluZSBzZWdtZW50c1xuICAgICAgICBsZW4gPSAwLjA7XG4gICAgICAgIHAxID0gdGhpcy5nZXRQb2ludE9uQ3ViaWNCZXppZXIoMCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1s1XSk7XG5cbiAgICAgICAgZm9yICh0ID0gMC4wMTsgdCA8PSAxOyB0ICs9IDAuMDEpIHtcbiAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkN1YmljQmV6aWVyKHQsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdLCBwb2ludHNbNV0pO1xuICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsZW47XG5cbiAgICAgIGNhc2UgUGF0aFBhcnNlci5RVUFEX1RPOlxuICAgICAgICAvLyBBcHByb3hpbWF0ZXMgYnkgYnJlYWtpbmcgY3VydmUgaW50byAxMDAgbGluZSBzZWdtZW50c1xuICAgICAgICBsZW4gPSAwLjA7XG4gICAgICAgIHAxID0gdGhpcy5nZXRQb2ludE9uUXVhZHJhdGljQmV6aWVyKDAsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG5cbiAgICAgICAgZm9yICh0ID0gMC4wMTsgdCA8PSAxOyB0ICs9IDAuMDEpIHtcbiAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPblF1YWRyYXRpY0Jlemllcih0LCB4LCB5LCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10pO1xuICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsZW47XG5cbiAgICAgIGNhc2UgUGF0aFBhcnNlci5BUkM6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBcHByb3hpbWF0ZXMgYnkgYnJlYWtpbmcgY3VydmUgaW50byBsaW5lIHNlZ21lbnRzXG4gICAgICAgICAgbGVuID0gMC4wO1xuICAgICAgICAgIHZhciBzdGFydCA9IHBvaW50c1s0XTsgLy8gNCA9IHRoZXRhXG5cbiAgICAgICAgICB2YXIgZFRoZXRhID0gcG9pbnRzWzVdOyAvLyA1ID0gZFRoZXRhXG5cbiAgICAgICAgICB2YXIgZW5kID0gcG9pbnRzWzRdICsgZFRoZXRhO1xuICAgICAgICAgIHZhciBpbmMgPSBNYXRoLlBJIC8gMTgwLjA7IC8vIDEgZGVncmVlIHJlc29sdXRpb25cblxuICAgICAgICAgIGlmIChNYXRoLmFicyhzdGFydCAtIGVuZCkgPCBpbmMpIHtcbiAgICAgICAgICAgIGluYyA9IE1hdGguYWJzKHN0YXJ0IC0gZW5kKTtcbiAgICAgICAgICB9IC8vIE5vdGU6IGZvciBwdXJwb3NlIG9mIGNhbGN1bGF0aW5nIGFyYyBsZW5ndGgsIG5vdCBnb2luZyB0byB3b3JyeSBhYm91dCByb3RhdGluZyBYLWF4aXMgYnkgYW5nbGUgcHNpXG5cblxuICAgICAgICAgIHAxID0gdGhpcy5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10sIHN0YXJ0LCAwKTtcblxuICAgICAgICAgIGlmIChkVGhldGEgPCAwKSB7XG4gICAgICAgICAgICAvLyBjbG9ja3dpc2VcbiAgICAgICAgICAgIGZvciAodCA9IHN0YXJ0IC0gaW5jOyB0ID4gZW5kOyB0IC09IGluYykge1xuICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCB0LCAwKTtcbiAgICAgICAgICAgICAgbGVuICs9IHRoaXMuZ2V0TGluZUxlbmd0aChwMS54LCBwMS55LCBwMi54LCBwMi55KTtcbiAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY291bnRlci1jbG9ja3dpc2VcbiAgICAgICAgICAgIGZvciAodCA9IHN0YXJ0ICsgaW5jOyB0IDwgZW5kOyB0ICs9IGluYykge1xuICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCB0LCAwKTtcbiAgICAgICAgICAgICAgbGVuICs9IHRoaXMuZ2V0TGluZUxlbmd0aChwMS54LCBwMS55LCBwMi54LCBwMi55KTtcbiAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBlbmQsIDApO1xuICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgcmV0dXJuIGxlbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZ2V0UG9pbnRPbkxpbmUoZGlzdCwgcDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgdmFyIGZyb21YID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBwMXg7XG4gICAgdmFyIGZyb21ZID0gYXJndW1lbnRzLmxlbmd0aCA+IDYgJiYgYXJndW1lbnRzWzZdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNl0gOiBwMXk7XG4gICAgdmFyIG0gPSAocDJ5IC0gcDF5KSAvIChwMnggLSBwMXggKyBQU0VVRE9fWkVSTyk7XG4gICAgdmFyIHJ1biA9IE1hdGguc3FydChkaXN0ICogZGlzdCAvICgxICsgbSAqIG0pKTtcblxuICAgIGlmIChwMnggPCBwMXgpIHtcbiAgICAgIHJ1biAqPSAtMTtcbiAgICB9XG5cbiAgICB2YXIgcmlzZSA9IG0gKiBydW47XG4gICAgdmFyIHB0ID0gbnVsbDtcblxuICAgIGlmIChwMnggPT09IHAxeCkge1xuICAgICAgLy8gdmVydGljYWwgbGluZVxuICAgICAgcHQgPSB7XG4gICAgICAgIHg6IGZyb21YLFxuICAgICAgICB5OiBmcm9tWSArIHJpc2VcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICgoZnJvbVkgLSBwMXkpIC8gKGZyb21YIC0gcDF4ICsgUFNFVURPX1pFUk8pID09PSBtKSB7XG4gICAgICBwdCA9IHtcbiAgICAgICAgeDogZnJvbVggKyBydW4sXG4gICAgICAgIHk6IGZyb21ZICsgcmlzZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGl4ID0gMDtcbiAgICAgIHZhciBpeSA9IDA7XG4gICAgICB2YXIgbGVuID0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxeCwgcDF5LCBwMngsIHAyeSk7XG5cbiAgICAgIGlmIChsZW4gPCBQU0VVRE9fWkVSTykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHUgPSAoZnJvbVggLSBwMXgpICogKHAyeCAtIHAxeCkgKyAoZnJvbVkgLSBwMXkpICogKHAyeSAtIHAxeSk7XG4gICAgICB1IC89IGxlbiAqIGxlbjtcbiAgICAgIGl4ID0gcDF4ICsgdSAqIChwMnggLSBwMXgpO1xuICAgICAgaXkgPSBwMXkgKyB1ICogKHAyeSAtIHAxeSk7XG4gICAgICB2YXIgcFJpc2UgPSB0aGlzLmdldExpbmVMZW5ndGgoZnJvbVgsIGZyb21ZLCBpeCwgaXkpO1xuICAgICAgdmFyIHBSdW4gPSBNYXRoLnNxcnQoZGlzdCAqIGRpc3QgLSBwUmlzZSAqIHBSaXNlKTtcbiAgICAgIHJ1biA9IE1hdGguc3FydChwUnVuICogcFJ1biAvICgxICsgbSAqIG0pKTtcblxuICAgICAgaWYgKHAyeCA8IHAxeCkge1xuICAgICAgICBydW4gKj0gLTE7XG4gICAgICB9XG5cbiAgICAgIHJpc2UgPSBtICogcnVuO1xuICAgICAgcHQgPSB7XG4gICAgICAgIHg6IGl4ICsgcnVuLFxuICAgICAgICB5OiBpeSArIHJpc2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHB0O1xuICB9XG5cbiAgZ2V0UG9pbnRPblBhdGgoZGlzdGFuY2UpIHtcbiAgICB2YXIgZnVsbExlbiA9IHRoaXMuZ2V0UGF0aExlbmd0aCgpO1xuICAgIHZhciBjdW11bGF0aXZlUGF0aExlbmd0aCA9IDA7XG4gICAgdmFyIHAgPSBudWxsO1xuXG4gICAgaWYgKGRpc3RhbmNlIDwgLTAuMDAwMDUgfHwgZGlzdGFuY2UgLSAwLjAwMDA1ID4gZnVsbExlbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHtcbiAgICAgIGRhdGFBcnJheVxuICAgIH0gPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgY29tbWFuZCBvZiBkYXRhQXJyYXkpIHtcbiAgICAgIGlmIChjb21tYW5kICYmIChjb21tYW5kLnBhdGhMZW5ndGggPCAwLjAwMDA1IHx8IGN1bXVsYXRpdmVQYXRoTGVuZ3RoICsgY29tbWFuZC5wYXRoTGVuZ3RoICsgMC4wMDAwNSA8IGRpc3RhbmNlKSkge1xuICAgICAgICBjdW11bGF0aXZlUGF0aExlbmd0aCArPSBjb21tYW5kLnBhdGhMZW5ndGg7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVsdGEgPSBkaXN0YW5jZSAtIGN1bXVsYXRpdmVQYXRoTGVuZ3RoO1xuICAgICAgdmFyIGN1cnJlbnRUID0gMDtcblxuICAgICAgc3dpdGNoIChjb21tYW5kLnR5cGUpIHtcbiAgICAgICAgY2FzZSBQYXRoUGFyc2VyLkxJTkVfVE86XG4gICAgICAgICAgcCA9IHRoaXMuZ2V0UG9pbnRPbkxpbmUoZGVsdGEsIGNvbW1hbmQuc3RhcnQueCwgY29tbWFuZC5zdGFydC55LCBjb21tYW5kLnBvaW50c1swXSwgY29tbWFuZC5wb2ludHNbMV0sIGNvbW1hbmQuc3RhcnQueCwgY29tbWFuZC5zdGFydC55KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFBhdGhQYXJzZXIuQVJDOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGNvbW1hbmQucG9pbnRzWzRdOyAvLyA0ID0gdGhldGFcblxuICAgICAgICAgICAgdmFyIGRUaGV0YSA9IGNvbW1hbmQucG9pbnRzWzVdOyAvLyA1ID0gZFRoZXRhXG5cbiAgICAgICAgICAgIHZhciBlbmQgPSBjb21tYW5kLnBvaW50c1s0XSArIGRUaGV0YTtcbiAgICAgICAgICAgIGN1cnJlbnRUID0gc3RhcnQgKyBkZWx0YSAvIGNvbW1hbmQucGF0aExlbmd0aCAqIGRUaGV0YTtcblxuICAgICAgICAgICAgaWYgKGRUaGV0YSA8IDAgJiYgY3VycmVudFQgPCBlbmQgfHwgZFRoZXRhID49IDAgJiYgY3VycmVudFQgPiBlbmQpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKGNvbW1hbmQucG9pbnRzWzBdLCBjb21tYW5kLnBvaW50c1sxXSwgY29tbWFuZC5wb2ludHNbMl0sIGNvbW1hbmQucG9pbnRzWzNdLCBjdXJyZW50VCwgY29tbWFuZC5wb2ludHNbNl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5DVVJWRV9UTzpcbiAgICAgICAgICBjdXJyZW50VCA9IGRlbHRhIC8gY29tbWFuZC5wYXRoTGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRUID4gMSkge1xuICAgICAgICAgICAgY3VycmVudFQgPSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHAgPSB0aGlzLmdldFBvaW50T25DdWJpY0JlemllcihjdXJyZW50VCwgY29tbWFuZC5zdGFydC54LCBjb21tYW5kLnN0YXJ0LnksIGNvbW1hbmQucG9pbnRzWzBdLCBjb21tYW5kLnBvaW50c1sxXSwgY29tbWFuZC5wb2ludHNbMl0sIGNvbW1hbmQucG9pbnRzWzNdLCBjb21tYW5kLnBvaW50c1s0XSwgY29tbWFuZC5wb2ludHNbNV0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGF0aFBhcnNlci5RVUFEX1RPOlxuICAgICAgICAgIGN1cnJlbnRUID0gZGVsdGEgLyBjb21tYW5kLnBhdGhMZW5ndGg7XG5cbiAgICAgICAgICBpZiAoY3VycmVudFQgPiAxKSB7XG4gICAgICAgICAgICBjdXJyZW50VCA9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcCA9IHRoaXMuZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllcihjdXJyZW50VCwgY29tbWFuZC5zdGFydC54LCBjb21tYW5kLnN0YXJ0LnksIGNvbW1hbmQucG9pbnRzWzBdLCBjb21tYW5kLnBvaW50c1sxXSwgY29tbWFuZC5wb2ludHNbMl0sIGNvbW1hbmQucG9pbnRzWzNdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHApIHtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0TGluZUxlbmd0aCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiBNYXRoLnNxcnQoKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpKTtcbiAgfVxuXG4gIGdldFBhdGhMZW5ndGgoKSB7XG4gICAgaWYgKHRoaXMucGF0aExlbmd0aCA9PT0gLTEpIHtcbiAgICAgIHRoaXMucGF0aExlbmd0aCA9IHRoaXMuZGF0YUFycmF5LnJlZHVjZSgobGVuZ3RoLCBjb21tYW5kKSA9PiBjb21tYW5kLnBhdGhMZW5ndGggPiAwID8gbGVuZ3RoICsgY29tbWFuZC5wYXRoTGVuZ3RoIDogbGVuZ3RoLCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXRoTGVuZ3RoO1xuICB9XG5cbiAgZ2V0UG9pbnRPbkN1YmljQmV6aWVyKHBjdCwgcDF4LCBwMXksIHAyeCwgcDJ5LCBwM3gsIHAzeSwgcDR4LCBwNHkpIHtcbiAgICB2YXIgeCA9IHA0eCAqIENCMShwY3QpICsgcDN4ICogQ0IyKHBjdCkgKyBwMnggKiBDQjMocGN0KSArIHAxeCAqIENCNChwY3QpO1xuICAgIHZhciB5ID0gcDR5ICogQ0IxKHBjdCkgKyBwM3kgKiBDQjIocGN0KSArIHAyeSAqIENCMyhwY3QpICsgcDF5ICogQ0I0KHBjdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgfVxuXG4gIGdldFBvaW50T25RdWFkcmF0aWNCZXppZXIocGN0LCBwMXgsIHAxeSwgcDJ4LCBwMnksIHAzeCwgcDN5KSB7XG4gICAgdmFyIHggPSBwM3ggKiBRQjEocGN0KSArIHAyeCAqIFFCMihwY3QpICsgcDF4ICogUUIzKHBjdCk7XG4gICAgdmFyIHkgPSBwM3kgKiBRQjEocGN0KSArIHAyeSAqIFFCMihwY3QpICsgcDF5ICogUUIzKHBjdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgfVxuXG4gIGdldFBvaW50T25FbGxpcHRpY2FsQXJjKGN4LCBjeSwgcngsIHJ5LCB0aGV0YSwgcHNpKSB7XG4gICAgdmFyIGNvc1BzaSA9IE1hdGguY29zKHBzaSk7XG4gICAgdmFyIHNpblBzaSA9IE1hdGguc2luKHBzaSk7XG4gICAgdmFyIHB0ID0ge1xuICAgICAgeDogcnggKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICB5OiByeSAqIE1hdGguc2luKHRoZXRhKVxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGN4ICsgKHB0LnggKiBjb3NQc2kgLSBwdC55ICogc2luUHNpKSxcbiAgICAgIHk6IGN5ICsgKHB0LnggKiBzaW5Qc2kgKyBwdC55ICogY29zUHNpKVxuICAgIH07XG4gIH0gLy8gVE9ETyBuZWVkIHNvbWUgb3B0aW1pc2F0aW9ucy4gcG9zc2libHkgYnVpbGQgY2FjaGUgb25seSBmb3IgY3VydmVkIHNlZ21lbnRzP1xuXG5cbiAgYnVpbGRFcXVpZGlzdGFudENhY2hlKGlucHV0U3RlcCwgaW5wdXRQcmVjaXNpb24pIHtcbiAgICB2YXIgZnVsbExlbiA9IHRoaXMuZ2V0UGF0aExlbmd0aCgpO1xuICAgIHZhciBwcmVjaXNpb24gPSBpbnB1dFByZWNpc2lvbiB8fCAwLjI1OyAvLyBhY2N1cmFjeSB2cyBwZXJmb3JtYW5jZVxuXG4gICAgdmFyIHN0ZXAgPSBpbnB1dFN0ZXAgfHwgZnVsbExlbiAvIDEwMDtcblxuICAgIGlmICghdGhpcy5lcXVpZGlzdGFudENhY2hlIHx8IHRoaXMuZXF1aWRpc3RhbnRDYWNoZS5zdGVwICE9PSBzdGVwIHx8IHRoaXMuZXF1aWRpc3RhbnRDYWNoZS5wcmVjaXNpb24gIT09IHByZWNpc2lvbikge1xuICAgICAgLy8gUHJlcGFyZSBjYWNoZVxuICAgICAgdGhpcy5lcXVpZGlzdGFudENhY2hlID0ge1xuICAgICAgICBzdGVwLFxuICAgICAgICBwcmVjaXNpb24sXG4gICAgICAgIHBvaW50czogW11cbiAgICAgIH07IC8vIENhbGN1bGF0ZSBwb2ludHNcblxuICAgICAgdmFyIHMgPSAwO1xuXG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8PSBmdWxsTGVuOyBsICs9IHByZWNpc2lvbikge1xuICAgICAgICB2YXIgcDAgPSB0aGlzLmdldFBvaW50T25QYXRoKGwpO1xuICAgICAgICB2YXIgcDEgPSB0aGlzLmdldFBvaW50T25QYXRoKGwgKyBwcmVjaXNpb24pO1xuXG4gICAgICAgIGlmICghcDAgfHwgIXAxKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBzICs9IHRoaXMuZ2V0TGluZUxlbmd0aChwMC54LCBwMC55LCBwMS54LCBwMS55KTtcblxuICAgICAgICBpZiAocyA+PSBzdGVwKSB7XG4gICAgICAgICAgdGhpcy5lcXVpZGlzdGFudENhY2hlLnBvaW50cy5wdXNoKHtcbiAgICAgICAgICAgIHg6IHAwLngsXG4gICAgICAgICAgICB5OiBwMC55LFxuICAgICAgICAgICAgZGlzdGFuY2U6IGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzIC09IHN0ZXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRFcXVpZGlzdGFudFBvaW50T25QYXRoKHRhcmdldERpc3RhbmNlLCBzdGVwLCBwcmVjaXNpb24pIHtcbiAgICB0aGlzLmJ1aWxkRXF1aWRpc3RhbnRDYWNoZShzdGVwLCBwcmVjaXNpb24pO1xuXG4gICAgaWYgKHRhcmdldERpc3RhbmNlIDwgMCB8fCB0YXJnZXREaXN0YW5jZSAtIHRoaXMuZ2V0UGF0aExlbmd0aCgpID4gMC4wMDAwNSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGlkeCA9IE1hdGgucm91bmQodGFyZ2V0RGlzdGFuY2UgLyB0aGlzLmdldFBhdGhMZW5ndGgoKSAqICh0aGlzLmVxdWlkaXN0YW50Q2FjaGUucG9pbnRzLmxlbmd0aCAtIDEpKTtcbiAgICByZXR1cm4gdGhpcy5lcXVpZGlzdGFudENhY2hlLnBvaW50c1tpZHhdIHx8IG51bGw7XG4gIH1cblxufVxuXG52YXIgZGF0YVVyaVJlZ2V4ID0gL15cXHMqZGF0YTooKFteLyw7XStcXC9bXi8sO10rKSg/OjsoW14sOz1dKz1bXiw7PV0rKSk/KT8oPzo7KGJhc2U2NCkpPywoLiopJC9pO1xuY2xhc3MgSW1hZ2VFbGVtZW50IGV4dGVuZHMgUmVuZGVyZWRFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ2ltYWdlJztcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHZhciBocmVmID0gdGhpcy5nZXRIcmVmQXR0cmlidXRlKCkuZ2V0U3RyaW5nKCk7XG5cbiAgICBpZiAoIWhyZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXNTdmcgPSBocmVmLmVuZHNXaXRoKCcuc3ZnJykgfHwgL15cXHMqZGF0YTppbWFnZVxcL3N2Z1xcK3htbC9pLnRlc3QoaHJlZik7XG4gICAgZG9jdW1lbnQuaW1hZ2VzLnB1c2godGhpcyk7XG5cbiAgICBpZiAoIWlzU3ZnKSB7XG4gICAgICB2b2lkIHRoaXMubG9hZEltYWdlKGhyZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIHRoaXMubG9hZFN2ZyhocmVmKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzU3ZnID0gaXNTdmc7XG4gIH1cblxuICBsb2FkSW1hZ2UoaHJlZikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBpbWFnZSA9IHlpZWxkIF90aGlzLmRvY3VtZW50LmNyZWF0ZUltYWdlKGhyZWYpO1xuICAgICAgICBfdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB3aGlsZSBsb2FkaW5nIGltYWdlIFxcXCJcIi5jb25jYXQoaHJlZiwgXCJcXFwiOlwiKSwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICB9KSgpO1xuICB9XG5cbiAgbG9hZFN2ZyhocmVmKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIHZhciBtYXRjaCA9IGRhdGFVcmlSZWdleC5leGVjKGhyZWYpO1xuXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaFs1XTtcblxuICAgICAgICBpZiAobWF0Y2hbNF0gPT09ICdiYXNlNjQnKSB7XG4gICAgICAgICAgX3RoaXMyLmltYWdlID0gYXRvYihkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczIuaW1hZ2UgPSBkZWNvZGVVUklDb21wb25lbnQoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHJlc3BvbnNlID0geWllbGQgX3RoaXMyLmRvY3VtZW50LmZldGNoKGhyZWYpO1xuICAgICAgICAgIHZhciBzdmcgPSB5aWVsZCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgX3RoaXMyLmltYWdlID0gc3ZnO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgbG9hZGluZyBpbWFnZSBcXFwiXCIuY29uY2F0KGhyZWYsIFwiXFxcIjpcIiksIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMyLmxvYWRlZCA9IHRydWU7XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJlbmRlckNoaWxkcmVuKGN0eCkge1xuICAgIHZhciB7XG4gICAgICBkb2N1bWVudCxcbiAgICAgIGltYWdlLFxuICAgICAgbG9hZGVkXG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHggPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpLmdldFBpeGVscygneCcpO1xuICAgIHZhciB5ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3knKS5nZXRQaXhlbHMoJ3knKTtcbiAgICB2YXIgd2lkdGggPSB0aGlzLmdldFN0eWxlKCd3aWR0aCcpLmdldFBpeGVscygneCcpO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldFN0eWxlKCdoZWlnaHQnKS5nZXRQaXhlbHMoJ3knKTtcblxuICAgIGlmICghbG9hZGVkIHx8ICFpbWFnZSB8fCAhd2lkdGggfHwgIWhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTtcblxuICAgIGlmICh0aGlzLmlzU3ZnKSB7XG4gICAgICB2YXIgc3ViRG9jdW1lbnQgPSBkb2N1bWVudC5jYW52Zy5mb3JrU3RyaW5nKGN0eCwgdGhpcy5pbWFnZSwge1xuICAgICAgICBpZ25vcmVNb3VzZTogdHJ1ZSxcbiAgICAgICAgaWdub3JlQW5pbWF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVEaW1lbnNpb25zOiB0cnVlLFxuICAgICAgICBpZ25vcmVDbGVhcjogdHJ1ZSxcbiAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgb2Zmc2V0WTogMCxcbiAgICAgICAgc2NhbGVXaWR0aDogd2lkdGgsXG4gICAgICAgIHNjYWxlSGVpZ2h0OiBoZWlnaHRcbiAgICAgIH0pO1xuICAgICAgc3ViRG9jdW1lbnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnBhcmVudCA9IHRoaXM7XG4gICAgICB2b2lkIHN1YkRvY3VtZW50LnJlbmRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2ltYWdlID0gdGhpcy5pbWFnZTtcbiAgICAgIGRvY3VtZW50LnNldFZpZXdCb3goe1xuICAgICAgICBjdHgsXG4gICAgICAgIGFzcGVjdFJhdGlvOiB0aGlzLmdldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycpLmdldFN0cmluZygpLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgZGVzaXJlZFdpZHRoOiBfaW1hZ2Uud2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgZGVzaXJlZEhlaWdodDogX2ltYWdlLmhlaWdodFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRlZCkge1xuICAgICAgICBpZiAodHlwZW9mIF9pbWFnZS5jb21wbGV0ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgX2ltYWdlLmNvbXBsZXRlKSB7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShfaW1hZ2UsIDAsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIGdldEJvdW5kaW5nQm94KCkge1xuICAgIHZhciB4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3gnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICB2YXIgeSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd5JykuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgdmFyIHdpZHRoID0gdGhpcy5nZXRTdHlsZSgnd2lkdGgnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JykuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgcmV0dXJuIG5ldyBCb3VuZGluZ0JveCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQpO1xuICB9XG5cbn1cblxuY2xhc3MgU3ltYm9sRWxlbWVudCBleHRlbmRzIFJlbmRlcmVkRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ3N5bWJvbCc7XG4gIH1cblxuICByZW5kZXIoXykgey8vIE5PIFJFTkRFUlxuICB9XG5cbn1cblxuY2xhc3MgU1ZHRm9udExvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50KSB7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZm9udHMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIGxvYWQoZm9udEZhbWlseSwgdXJsKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHtcbiAgICAgICAgICBkb2N1bWVudFxuICAgICAgICB9ID0gX3RoaXM7XG4gICAgICAgIHZhciBzdmdEb2N1bWVudCA9IHlpZWxkIGRvY3VtZW50LmNhbnZnLnBhcnNlci5sb2FkKHVybCk7XG4gICAgICAgIHZhciBmb250cyA9IHN2Z0RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdmb250Jyk7XG4gICAgICAgIEFycmF5LmZyb20oZm9udHMpLmZvckVhY2goZm9udE5vZGUgPT4ge1xuICAgICAgICAgIHZhciBmb250ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmb250Tm9kZSk7XG4gICAgICAgICAgZG9jdW1lbnQuZGVmaW5pdGlvbnNbZm9udEZhbWlseV0gPSBmb250O1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgbG9hZGluZyBmb250IFxcXCJcIi5jb25jYXQodXJsLCBcIlxcXCI6XCIpLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgIH0pKCk7XG4gIH1cblxufVxuXG5jbGFzcyBTdHlsZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ3N0eWxlJztcbiAgICB2YXIgY3NzID0gY29tcHJlc3NTcGFjZXMoQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpIC8vIE5FRUQgVEVTVFxuICAgIC5tYXAoXyA9PiBfLnRleHRDb250ZW50KS5qb2luKCcnKS5yZXBsYWNlKC8oXFwvXFwqKFteKl18W1xcclxcbl18KFxcKisoW14qL118W1xcclxcbl0pKSkqXFwqK1xcLyl8KF5bXFxzXSpcXC9cXC8uKikvZ20sICcnKSAvLyByZW1vdmUgY29tbWVudHNcbiAgICAucmVwbGFjZSgvQGltcG9ydC4qOy9nLCAnJykgLy8gcmVtb3ZlIGltcG9ydHNcbiAgICApO1xuICAgIHZhciBjc3NEZWZzID0gY3NzLnNwbGl0KCd9Jyk7XG4gICAgY3NzRGVmcy5mb3JFYWNoKF8gPT4ge1xuICAgICAgdmFyIGRlZiA9IF8udHJpbSgpO1xuXG4gICAgICBpZiAoIWRlZikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjc3NQYXJ0cyA9IGRlZi5zcGxpdCgneycpO1xuICAgICAgdmFyIGNzc0NsYXNzZXMgPSBjc3NQYXJ0c1swXS5zcGxpdCgnLCcpO1xuICAgICAgdmFyIGNzc1Byb3BzID0gY3NzUGFydHNbMV0uc3BsaXQoJzsnKTtcbiAgICAgIGNzc0NsYXNzZXMuZm9yRWFjaChfID0+IHtcbiAgICAgICAgdmFyIGNzc0NsYXNzID0gXy50cmltKCk7XG5cbiAgICAgICAgaWYgKCFjc3NDbGFzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcm9wcyA9IGRvY3VtZW50LnN0eWxlc1tjc3NDbGFzc10gfHwge307XG4gICAgICAgIGNzc1Byb3BzLmZvckVhY2goY3NzUHJvcCA9PiB7XG4gICAgICAgICAgdmFyIHByb3AgPSBjc3NQcm9wLmluZGV4T2YoJzonKTtcbiAgICAgICAgICB2YXIgbmFtZSA9IGNzc1Byb3Auc3Vic3RyKDAsIHByb3ApLnRyaW0oKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjc3NQcm9wLnN1YnN0cihwcm9wICsgMSwgY3NzUHJvcC5sZW5ndGggLSBwcm9wKS50cmltKCk7XG5cbiAgICAgICAgICBpZiAobmFtZSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgcHJvcHNbbmFtZV0gPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkb2N1bWVudC5zdHlsZXNbY3NzQ2xhc3NdID0gcHJvcHM7XG4gICAgICAgIGRvY3VtZW50LnN0eWxlc1NwZWNpZmljaXR5W2Nzc0NsYXNzXSA9IGdldFNlbGVjdG9yU3BlY2lmaWNpdHkoY3NzQ2xhc3MpO1xuXG4gICAgICAgIGlmIChjc3NDbGFzcyA9PT0gJ0Bmb250LWZhY2UnKSB7XG4gICAgICAgICAgLy8gICYmICFub2RlRW52XG4gICAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBwcm9wc1snZm9udC1mYW1pbHknXS5nZXRTdHJpbmcoKS5yZXBsYWNlKC9cInwnL2csICcnKTtcbiAgICAgICAgICB2YXIgc3JjcyA9IHByb3BzLnNyYy5nZXRTdHJpbmcoKS5zcGxpdCgnLCcpO1xuICAgICAgICAgIHNyY3MuZm9yRWFjaChzcmMgPT4ge1xuICAgICAgICAgICAgaWYgKHNyYy5pbmRleE9mKCdmb3JtYXQoXCJzdmdcIiknKSA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IHBhcnNlRXh0ZXJuYWxVcmwoc3JjKTtcblxuICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgdm9pZCBuZXcgU1ZHRm9udExvYWRlcihkb2N1bWVudCkubG9hZChmb250RmFtaWx5LCB1cmwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn1cblN0eWxlRWxlbWVudC5wYXJzZUV4dGVybmFsVXJsID0gcGFyc2VFeHRlcm5hbFVybDtcblxuY2xhc3MgVXNlRWxlbWVudCBleHRlbmRzIFJlbmRlcmVkRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gJ3VzZSc7XG4gIH1cblxuICBzZXRDb250ZXh0KGN0eCkge1xuICAgIHN1cGVyLnNldENvbnRleHQoY3R4KTtcbiAgICB2YXIgeEF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpO1xuICAgIHZhciB5QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCd5Jyk7XG5cbiAgICBpZiAoeEF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgY3R4LnRyYW5zbGF0ZSh4QXR0ci5nZXRQaXhlbHMoJ3gnKSwgMCk7XG4gICAgfVxuXG4gICAgaWYgKHlBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgIGN0eC50cmFuc2xhdGUoMCwgeUF0dHIuZ2V0UGl4ZWxzKCd5JykpO1xuICAgIH1cbiAgfVxuXG4gIHBhdGgoY3R4KSB7XG4gICAgdmFyIHtcbiAgICAgIGVsZW1lbnRcbiAgICB9ID0gdGhpcztcblxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnBhdGgoY3R4KTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJDaGlsZHJlbihjdHgpIHtcbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBlbGVtZW50XG4gICAgfSA9IHRoaXM7XG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIHRlbXBTdmcgPSBlbGVtZW50O1xuXG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAvLyByZW5kZXIgbWUgdXNpbmcgYSB0ZW1wb3Jhcnkgc3ZnIGVsZW1lbnQgaW4gc3ltYm9sIGNhc2VzIChodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc3RydWN0Lmh0bWwjVXNlRWxlbWVudClcbiAgICAgICAgdGVtcFN2ZyA9IG5ldyBTVkdFbGVtZW50KGRvY3VtZW50LCBudWxsKTtcbiAgICAgICAgdGVtcFN2Zy5hdHRyaWJ1dGVzLnZpZXdCb3ggPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICd2aWV3Qm94JywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnKS5nZXRTdHJpbmcoKSk7XG4gICAgICAgIHRlbXBTdmcuYXR0cmlidXRlcy5wcmVzZXJ2ZUFzcGVjdFJhdGlvID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAncHJlc2VydmVBc3BlY3RSYXRpbycsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJykuZ2V0U3RyaW5nKCkpO1xuICAgICAgICB0ZW1wU3ZnLmF0dHJpYnV0ZXMub3ZlcmZsb3cgPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICdvdmVyZmxvdycsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdvdmVyZmxvdycpLmdldFN0cmluZygpKTtcbiAgICAgICAgdGVtcFN2Zy5jaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47IC8vIGVsZW1lbnQgaXMgc3RpbGwgdGhlIHBhcmVudCBvZiB0aGUgY2hpbGRyZW5cblxuICAgICAgICBlbGVtZW50LnN0eWxlcy5vcGFjaXR5ID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnb3BhY2l0eScsIHRoaXMuY2FsY3VsYXRlT3BhY2l0eSgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRlbXBTdmcudHlwZSA9PT0gJ3N2ZycpIHtcbiAgICAgICAgdmFyIHdpZHRoU3R5bGUgPSB0aGlzLmdldFN0eWxlKCd3aWR0aCcsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdmFyIGhlaWdodFN0eWxlID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JywgZmFsc2UsIHRydWUpOyAvLyBpZiBzeW1ib2wgb3Igc3ZnLCBpbmhlcml0IHdpZHRoL2hlaWdodCBmcm9tIG1lXG5cbiAgICAgICAgaWYgKHdpZHRoU3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIHRlbXBTdmcuYXR0cmlidXRlcy53aWR0aCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3dpZHRoJywgd2lkdGhTdHlsZS5nZXRTdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVpZ2h0U3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIHRlbXBTdmcuYXR0cmlidXRlcy5oZWlnaHQgPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICdoZWlnaHQnLCBoZWlnaHRTdHlsZS5nZXRTdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG9sZFBhcmVudCA9IHRlbXBTdmcucGFyZW50O1xuICAgICAgdGVtcFN2Zy5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGVtcFN2Zy5yZW5kZXIoY3R4KTtcbiAgICAgIHRlbXBTdmcucGFyZW50ID0gb2xkUGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIGdldEJvdW5kaW5nQm94KGN0eCkge1xuICAgIHZhciB7XG4gICAgICBlbGVtZW50XG4gICAgfSA9IHRoaXM7XG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdCb3goY3R4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGVsZW1lbnRUcmFuc2Zvcm0oKSB7XG4gICAgdmFyIHtcbiAgICAgIGRvY3VtZW50LFxuICAgICAgZWxlbWVudFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBUcmFuc2Zvcm0uZnJvbUVsZW1lbnQoZG9jdW1lbnQsIGVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY2FjaGVkRWxlbWVudCA9IHRoaXMuZ2V0SHJlZkF0dHJpYnV0ZSgpLmdldERlZmluaXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRFbGVtZW50O1xuICB9XG5cbn1cblxuZnVuY3Rpb24gaW1HZXQoaW1nLCB4LCB5LCB3aWR0aCwgX2hlaWdodCwgcmdiYSkge1xuICByZXR1cm4gaW1nW3kgKiB3aWR0aCAqIDQgKyB4ICogNCArIHJnYmFdO1xufVxuXG5mdW5jdGlvbiBpbVNldChpbWcsIHgsIHksIHdpZHRoLCBfaGVpZ2h0LCByZ2JhLCB2YWwpIHtcbiAgaW1nW3kgKiB3aWR0aCAqIDQgKyB4ICogNCArIHJnYmFdID0gdmFsO1xufVxuXG5mdW5jdGlvbiBtKG1hdHJpeCwgaSwgdikge1xuICB2YXIgbWkgPSBtYXRyaXhbaV07XG4gIHJldHVybiBtaSAqIHY7XG59XG5cbmZ1bmN0aW9uIGMoYSwgbTEsIG0yLCBtMykge1xuICByZXR1cm4gbTEgKyBNYXRoLmNvcyhhKSAqIG0yICsgTWF0aC5zaW4oYSkgKiBtMztcbn1cblxuY2xhc3MgRmVDb2xvck1hdHJpeEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ2ZlQ29sb3JNYXRyaXgnO1xuICAgIHZhciBtYXRyaXggPSB0b051bWJlcnModGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlcycpLmdldFN0cmluZygpKTtcblxuICAgIHN3aXRjaCAodGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKS5nZXRTdHJpbmcoJ21hdHJpeCcpKSB7XG4gICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvZmlsdGVycy5odG1sI2ZlQ29sb3JNYXRyaXhFbGVtZW50XG4gICAgICBjYXNlICdzYXR1cmF0ZSc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcyA9IG1hdHJpeFswXTtcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBhcnJheS1lbGVtZW50LW5ld2xpbmUgKi9cblxuICAgICAgICAgIG1hdHJpeCA9IFswLjIxMyArIDAuNzg3ICogcywgMC43MTUgLSAwLjcxNSAqIHMsIDAuMDcyIC0gMC4wNzIgKiBzLCAwLCAwLCAwLjIxMyAtIDAuMjEzICogcywgMC43MTUgKyAwLjI4NSAqIHMsIDAuMDcyIC0gMC4wNzIgKiBzLCAwLCAwLCAwLjIxMyAtIDAuMjEzICogcywgMC43MTUgLSAwLjcxNSAqIHMsIDAuMDcyICsgMC45MjggKiBzLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxXTtcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIGFycmF5LWVsZW1lbnQtbmV3bGluZSAqL1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnaHVlUm90YXRlJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBhID0gbWF0cml4WzBdICogTWF0aC5QSSAvIDE4MC4wO1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIGFycmF5LWVsZW1lbnQtbmV3bGluZSAqL1xuXG4gICAgICAgICAgbWF0cml4ID0gW2MoYSwgMC4yMTMsIDAuNzg3LCAtMC4yMTMpLCBjKGEsIDAuNzE1LCAtMC43MTUsIC0wLjcxNSksIGMoYSwgMC4wNzIsIC0wLjA3MiwgMC45MjgpLCAwLCAwLCBjKGEsIDAuMjEzLCAtMC4yMTMsIDAuMTQzKSwgYyhhLCAwLjcxNSwgMC4yODUsIDAuMTQwKSwgYyhhLCAwLjA3MiwgLTAuMDcyLCAtMC4yODMpLCAwLCAwLCBjKGEsIDAuMjEzLCAtMC4yMTMsIC0wLjc4NyksIGMoYSwgMC43MTUsIC0wLjcxNSwgMC43MTUpLCBjKGEsIDAuMDcyLCAwLjkyOCwgMC4wNzIpLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxXTtcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIGFycmF5LWVsZW1lbnQtbmV3bGluZSAqL1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnbHVtaW5hbmNlVG9BbHBoYSc6XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIGFycmF5LWVsZW1lbnQtbmV3bGluZSAqL1xuICAgICAgICBtYXRyaXggPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSwgMCwgMCwgMCwgMCwgMCwgMCwgMV07XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgYXJyYXktZWxlbWVudC1uZXdsaW5lICovXG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5tYXRyaXggPSBtYXRyaXg7XG4gICAgdGhpcy5pbmNsdWRlT3BhY2l0eSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpbmNsdWRlT3BhY2l0eScpLmhhc1ZhbHVlKCk7XG4gIH1cblxuICBhcHBseShjdHgsIF94LCBfeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIC8vIGFzc3VtaW5nIHg9PTAgJiYgeT09MCBmb3Igbm93XG4gICAgdmFyIHtcbiAgICAgIGluY2x1ZGVPcGFjaXR5LFxuICAgICAgbWF0cml4XG4gICAgfSA9IHRoaXM7XG4gICAgdmFyIHNyY0RhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIHZhciByID0gaW1HZXQoc3JjRGF0YS5kYXRhLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAwKTtcbiAgICAgICAgdmFyIGcgPSBpbUdldChzcmNEYXRhLmRhdGEsIHgsIHksIHdpZHRoLCBoZWlnaHQsIDEpO1xuICAgICAgICB2YXIgYiA9IGltR2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMik7XG4gICAgICAgIHZhciBhID0gaW1HZXQoc3JjRGF0YS5kYXRhLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAzKTtcbiAgICAgICAgdmFyIG5yID0gbShtYXRyaXgsIDAsIHIpICsgbShtYXRyaXgsIDEsIGcpICsgbShtYXRyaXgsIDIsIGIpICsgbShtYXRyaXgsIDMsIGEpICsgbShtYXRyaXgsIDQsIDEpO1xuICAgICAgICB2YXIgbmcgPSBtKG1hdHJpeCwgNSwgcikgKyBtKG1hdHJpeCwgNiwgZykgKyBtKG1hdHJpeCwgNywgYikgKyBtKG1hdHJpeCwgOCwgYSkgKyBtKG1hdHJpeCwgOSwgMSk7XG4gICAgICAgIHZhciBuYiA9IG0obWF0cml4LCAxMCwgcikgKyBtKG1hdHJpeCwgMTEsIGcpICsgbShtYXRyaXgsIDEyLCBiKSArIG0obWF0cml4LCAxMywgYSkgKyBtKG1hdHJpeCwgMTQsIDEpO1xuICAgICAgICB2YXIgbmEgPSBtKG1hdHJpeCwgMTUsIHIpICsgbShtYXRyaXgsIDE2LCBnKSArIG0obWF0cml4LCAxNywgYikgKyBtKG1hdHJpeCwgMTgsIGEpICsgbShtYXRyaXgsIDE5LCAxKTtcblxuICAgICAgICBpZiAoaW5jbHVkZU9wYWNpdHkpIHtcbiAgICAgICAgICBuciA9IDA7XG4gICAgICAgICAgbmcgPSAwO1xuICAgICAgICAgIG5iID0gMDtcbiAgICAgICAgICBuYSAqPSBhIC8gMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgaW1TZXQoc3JjRGF0YS5kYXRhLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAwLCBucik7XG4gICAgICAgIGltU2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMSwgbmcpO1xuICAgICAgICBpbVNldChzcmNEYXRhLmRhdGEsIHgsIHksIHdpZHRoLCBoZWlnaHQsIDIsIG5iKTtcbiAgICAgICAgaW1TZXQoc3JjRGF0YS5kYXRhLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAzLCBuYSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKHNyY0RhdGEsIDAsIDApO1xuICB9XG5cbn1cblxuY2xhc3MgTWFza0VsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnR5cGUgPSAnbWFzayc7XG4gIH1cblxuICBhcHBseShjdHgsIGVsZW1lbnQpIHtcbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnRcbiAgICB9ID0gdGhpczsgLy8gcmVuZGVyIGFzIHRlbXAgc3ZnXG5cbiAgICB2YXIgeCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd4JykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIHkgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpO1xuICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMuZ2V0U3R5bGUoJ2hlaWdodCcpLmdldFBpeGVscygneScpO1xuXG4gICAgaWYgKCF3aWR0aCAmJiAhaGVpZ2h0KSB7XG4gICAgICB2YXIgYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGJvdW5kaW5nQm94LmFkZEJvdW5kaW5nQm94KGNoaWxkLmdldEJvdW5kaW5nQm94KGN0eCkpO1xuICAgICAgfSk7XG4gICAgICB4ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC54MSk7XG4gICAgICB5ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC55MSk7XG4gICAgICB3aWR0aCA9IE1hdGguZmxvb3IoYm91bmRpbmdCb3gud2lkdGgpO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC5oZWlnaHQpO1xuICAgIH1cblxuICAgIHZhciBpZ25vcmVkU3R5bGVzID0gdGhpcy5yZW1vdmVTdHlsZXMoZWxlbWVudCwgTWFza0VsZW1lbnQuaWdub3JlU3R5bGVzKTtcbiAgICB2YXIgbWFza0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUNhbnZhcyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQpO1xuICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGRvY3VtZW50LnNjcmVlbi5zZXREZWZhdWx0cyhtYXNrQ3R4KTtcbiAgICB0aGlzLnJlbmRlckNoaWxkcmVuKG1hc2tDdHgpOyAvLyBjb252ZXJ0IG1hc2sgdG8gYWxwaGEgd2l0aCBhIGZha2Ugbm9kZVxuICAgIC8vIFRPRE86IHJlZmFjdG9yIG91dCBhcHBseSBmcm9tIGZlQ29sb3JNYXRyaXhcblxuICAgIG5ldyBGZUNvbG9yTWF0cml4RWxlbWVudChkb2N1bWVudCwge1xuICAgICAgbm9kZVR5cGU6IDEsXG4gICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgIG5vZGVOYW1lOiAndHlwZScsXG4gICAgICAgIHZhbHVlOiAnbHVtaW5hbmNlVG9BbHBoYSdcbiAgICAgIH0sIHtcbiAgICAgICAgbm9kZU5hbWU6ICdpbmNsdWRlT3BhY2l0eScsXG4gICAgICAgIHZhbHVlOiAndHJ1ZSdcbiAgICAgIH1dXG4gICAgfSkuYXBwbHkobWFza0N0eCwgMCwgMCwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgICB2YXIgdG1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlQ2FudmFzKHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgdmFyIHRtcEN0eCA9IHRtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGRvY3VtZW50LnNjcmVlbi5zZXREZWZhdWx0cyh0bXBDdHgpO1xuICAgIGVsZW1lbnQucmVuZGVyKHRtcEN0eCk7XG4gICAgdG1wQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1pbic7XG4gICAgdG1wQ3R4LmZpbGxTdHlsZSA9IG1hc2tDdHguY3JlYXRlUGF0dGVybihtYXNrQ2FudmFzLCAnbm8tcmVwZWF0Jyk7XG4gICAgdG1wQ3R4LmZpbGxSZWN0KDAsIDAsIHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgY3R4LmZpbGxTdHlsZSA9IHRtcEN0eC5jcmVhdGVQYXR0ZXJuKHRtcENhbnZhcywgJ25vLXJlcGVhdCcpO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQpOyAvLyByZWFzc2lnbiBtYXNrXG5cbiAgICB0aGlzLnJlc3RvcmVTdHlsZXMoZWxlbWVudCwgaWdub3JlZFN0eWxlcyk7XG4gIH1cblxuICByZW5kZXIoXykgey8vIE5PIFJFTkRFUlxuICB9XG5cbn1cbk1hc2tFbGVtZW50Lmlnbm9yZVN0eWxlcyA9IFsnbWFzaycsICd0cmFuc2Zvcm0nLCAnY2xpcC1wYXRoJ107XG5cbnZhciBub29wID0gKCkgPT4gey8vIE5PT1Bcbn07XG5cbmNsYXNzIENsaXBQYXRoRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdjbGlwUGF0aCc7XG4gIH1cblxuICBhcHBseShjdHgpIHtcbiAgICB2YXIge1xuICAgICAgZG9jdW1lbnRcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgY29udGV4dFByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihjdHgpO1xuICAgIHZhciB7XG4gICAgICBiZWdpblBhdGgsXG4gICAgICBjbG9zZVBhdGhcbiAgICB9ID0gY3R4O1xuXG4gICAgaWYgKGNvbnRleHRQcm90bykge1xuICAgICAgY29udGV4dFByb3RvLmJlZ2luUGF0aCA9IG5vb3A7XG4gICAgICBjb250ZXh0UHJvdG8uY2xvc2VQYXRoID0gbm9vcDtcbiAgICB9XG5cbiAgICBSZWZsZWN0LmFwcGx5KGJlZ2luUGF0aCwgY3R4LCBbXSk7XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQucGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhbnNmb3JtID0gdHlwZW9mIGNoaWxkLmVsZW1lbnRUcmFuc2Zvcm0gIT09ICd1bmRlZmluZWQnID8gY2hpbGQuZWxlbWVudFRyYW5zZm9ybSgpIDogbnVsbDsgLy8gaGFuZGxlIDx1c2UgLz5cblxuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHtcbiAgICAgICAgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmZyb21FbGVtZW50KGRvY3VtZW50LCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgdHJhbnNmb3JtLmFwcGx5KGN0eCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkLnBhdGgoY3R4KTtcblxuICAgICAgaWYgKGNvbnRleHRQcm90bykge1xuICAgICAgICBjb250ZXh0UHJvdG8uY2xvc2VQYXRoID0gY2xvc2VQYXRoO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgIHRyYW5zZm9ybS51bmFwcGx5KGN0eCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUmVmbGVjdC5hcHBseShjbG9zZVBhdGgsIGN0eCwgW10pO1xuICAgIGN0eC5jbGlwKCk7XG5cbiAgICBpZiAoY29udGV4dFByb3RvKSB7XG4gICAgICBjb250ZXh0UHJvdG8uYmVnaW5QYXRoID0gYmVnaW5QYXRoO1xuICAgICAgY29udGV4dFByb3RvLmNsb3NlUGF0aCA9IGNsb3NlUGF0aDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoXykgey8vIE5PIFJFTkRFUlxuICB9XG5cbn1cblxuY2xhc3MgRmlsdGVyRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdmaWx0ZXInO1xuICB9XG5cbiAgYXBwbHkoY3R4LCBlbGVtZW50KSB7XG4gICAgLy8gcmVuZGVyIGFzIHRlbXAgc3ZnXG4gICAgdmFyIHtcbiAgICAgIGRvY3VtZW50LFxuICAgICAgY2hpbGRyZW5cbiAgICB9ID0gdGhpcztcbiAgICB2YXIgYm91bmRpbmdCb3ggPSBlbGVtZW50LmdldEJvdW5kaW5nQm94KGN0eCk7XG5cbiAgICBpZiAoIWJvdW5kaW5nQm94KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHB4ID0gMDtcbiAgICB2YXIgcHkgPSAwO1xuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgdmFyIGVmZCA9IGNoaWxkLmV4dHJhRmlsdGVyRGlzdGFuY2UgfHwgMDtcbiAgICAgIHB4ID0gTWF0aC5tYXgocHgsIGVmZCk7XG4gICAgICBweSA9IE1hdGgubWF4KHB5LCBlZmQpO1xuICAgIH0pO1xuICAgIHZhciB3aWR0aCA9IE1hdGguZmxvb3IoYm91bmRpbmdCb3gud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLmZsb29yKGJvdW5kaW5nQm94LmhlaWdodCk7XG4gICAgdmFyIHRtcENhbnZhc1dpZHRoID0gd2lkdGggKyAyICogcHg7XG4gICAgdmFyIHRtcENhbnZhc0hlaWdodCA9IGhlaWdodCArIDIgKiBweTtcblxuICAgIGlmICh0bXBDYW52YXNXaWR0aCA8IDEgfHwgdG1wQ2FudmFzSGVpZ2h0IDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB4ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC54KTtcbiAgICB2YXIgeSA9IE1hdGguZmxvb3IoYm91bmRpbmdCb3gueSk7XG4gICAgdmFyIGlnbm9yZWRTdHlsZXMgPSB0aGlzLnJlbW92ZVN0eWxlcyhlbGVtZW50LCBGaWx0ZXJFbGVtZW50Lmlnbm9yZVN0eWxlcyk7XG4gICAgdmFyIHRtcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUNhbnZhcyh0bXBDYW52YXNXaWR0aCwgdG1wQ2FudmFzSGVpZ2h0KTtcbiAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgZG9jdW1lbnQuc2NyZWVuLnNldERlZmF1bHRzKHRtcEN0eCk7XG4gICAgdG1wQ3R4LnRyYW5zbGF0ZSgteCArIHB4LCAteSArIHB5KTtcbiAgICBlbGVtZW50LnJlbmRlcih0bXBDdHgpOyAvLyBhcHBseSBmaWx0ZXJzXG5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQuYXBwbHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2hpbGQuYXBwbHkodG1wQ3R4LCAwLCAwLCB0bXBDYW52YXNXaWR0aCwgdG1wQ2FudmFzSGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9KTsgLy8gcmVuZGVyIG9uIG1lXG5cbiAgICBjdHguZHJhd0ltYWdlKHRtcENhbnZhcywgMCwgMCwgdG1wQ2FudmFzV2lkdGgsIHRtcENhbnZhc0hlaWdodCwgeCAtIHB4LCB5IC0gcHksIHRtcENhbnZhc1dpZHRoLCB0bXBDYW52YXNIZWlnaHQpO1xuICAgIHRoaXMucmVzdG9yZVN0eWxlcyhlbGVtZW50LCBpZ25vcmVkU3R5bGVzKTtcbiAgfVxuXG4gIHJlbmRlcihfKSB7Ly8gTk8gUkVOREVSXG4gIH1cblxufVxuRmlsdGVyRWxlbWVudC5pZ25vcmVTdHlsZXMgPSBbJ2ZpbHRlcicsICd0cmFuc2Zvcm0nLCAnY2xpcC1wYXRoJ107XG5cbmNsYXNzIEZlRHJvcFNoYWRvd0VsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICBzdXBlcihkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgdGhpcy50eXBlID0gJ2ZlRHJvcFNoYWRvdyc7XG4gICAgdGhpcy5hZGRTdHlsZXNGcm9tU3R5bGVEZWZpbml0aW9uKCk7XG4gIH1cblxuICBhcHBseShfLCBfeCwgX3ksIF93aWR0aCwgX2hlaWdodCkgey8vIFRPRE86IGltcGxlbWVudFxuICB9XG5cbn1cblxuY2xhc3MgRmVNb3JwaG9sb2d5RWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdmZU1vcnBob2xvZ3knO1xuICB9XG5cbiAgYXBwbHkoXywgX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQpIHsvLyBUT0RPOiBpbXBsZW1lbnRcbiAgfVxuXG59XG5cbmNsYXNzIEZlQ29tcG9zaXRlRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdmZUNvbXBvc2l0ZSc7XG4gIH1cblxuICBhcHBseShfLCBfeCwgX3ksIF93aWR0aCwgX2hlaWdodCkgey8vIFRPRE86IGltcGxlbWVudFxuICB9XG5cbn1cblxuY2xhc3MgRmVHYXVzc2lhbkJsdXJFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgc3VwZXIoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIHRoaXMudHlwZSA9ICdmZUdhdXNzaWFuQmx1cic7XG4gICAgdGhpcy5ibHVyUmFkaXVzID0gTWF0aC5mbG9vcih0aGlzLmdldEF0dHJpYnV0ZSgnc3RkRGV2aWF0aW9uJykuZ2V0TnVtYmVyKCkpO1xuICAgIHRoaXMuZXh0cmFGaWx0ZXJEaXN0YW5jZSA9IHRoaXMuYmx1clJhZGl1cztcbiAgfVxuXG4gIGFwcGx5KGN0eCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIHZhciB7XG4gICAgICBkb2N1bWVudCxcbiAgICAgIGJsdXJSYWRpdXNcbiAgICB9ID0gdGhpcztcbiAgICB2YXIgYm9keSA9IGRvY3VtZW50LndpbmRvdyA/IGRvY3VtZW50LndpbmRvdy5kb2N1bWVudC5ib2R5IDogbnVsbDtcbiAgICB2YXIgY2FudmFzID0gY3R4LmNhbnZhczsgLy8gU3RhY2tCbHVyIHJlcXVpcmVzIGNhbnZhcyBiZSBvbiBkb2N1bWVudFxuXG4gICAgY2FudmFzLmlkID0gZG9jdW1lbnQuZ2V0VW5pcXVlSWQoKTtcblxuICAgIGlmIChib2R5KSB7XG4gICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICB9XG5cbiAgICBjYW52YXNSR0JBKGNhbnZhcywgeCwgeSwgd2lkdGgsIGhlaWdodCwgYmx1clJhZGl1cyk7XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgYm9keS5yZW1vdmVDaGlsZChjYW52YXMpO1xuICAgIH1cbiAgfVxuXG59XG5cbmNsYXNzIFRpdGxlRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICd0aXRsZSc7XG4gIH1cblxufVxuXG5jbGFzcyBEZXNjRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9ICdkZXNjJztcbiAgfVxuXG59XG5cbnZhciBlbGVtZW50cyA9IHtcbiAgJ3N2Zyc6IFNWR0VsZW1lbnQsXG4gICdyZWN0JzogUmVjdEVsZW1lbnQsXG4gICdjaXJjbGUnOiBDaXJjbGVFbGVtZW50LFxuICAnZWxsaXBzZSc6IEVsbGlwc2VFbGVtZW50LFxuICAnbGluZSc6IExpbmVFbGVtZW50LFxuICAncG9seWxpbmUnOiBQb2x5bGluZUVsZW1lbnQsXG4gICdwb2x5Z29uJzogUG9seWdvbkVsZW1lbnQsXG4gICdwYXRoJzogUGF0aEVsZW1lbnQsXG4gICdwYXR0ZXJuJzogUGF0dGVybkVsZW1lbnQsXG4gICdtYXJrZXInOiBNYXJrZXJFbGVtZW50LFxuICAnZGVmcyc6IERlZnNFbGVtZW50LFxuICAnbGluZWFyR3JhZGllbnQnOiBMaW5lYXJHcmFkaWVudEVsZW1lbnQsXG4gICdyYWRpYWxHcmFkaWVudCc6IFJhZGlhbEdyYWRpZW50RWxlbWVudCxcbiAgJ3N0b3AnOiBTdG9wRWxlbWVudCxcbiAgJ2FuaW1hdGUnOiBBbmltYXRlRWxlbWVudCxcbiAgJ2FuaW1hdGVDb2xvcic6IEFuaW1hdGVDb2xvckVsZW1lbnQsXG4gICdhbmltYXRlVHJhbnNmb3JtJzogQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQsXG4gICdmb250JzogRm9udEVsZW1lbnQsXG4gICdmb250LWZhY2UnOiBGb250RmFjZUVsZW1lbnQsXG4gICdtaXNzaW5nLWdseXBoJzogTWlzc2luZ0dseXBoRWxlbWVudCxcbiAgJ2dseXBoJzogR2x5cGhFbGVtZW50LFxuICAndGV4dCc6IFRleHRFbGVtZW50LFxuICAndHNwYW4nOiBUU3BhbkVsZW1lbnQsXG4gICd0cmVmJzogVFJlZkVsZW1lbnQsXG4gICdhJzogQUVsZW1lbnQsXG4gICd0ZXh0UGF0aCc6IFRleHRQYXRoRWxlbWVudCxcbiAgJ2ltYWdlJzogSW1hZ2VFbGVtZW50LFxuICAnZyc6IEdFbGVtZW50LFxuICAnc3ltYm9sJzogU3ltYm9sRWxlbWVudCxcbiAgJ3N0eWxlJzogU3R5bGVFbGVtZW50LFxuICAndXNlJzogVXNlRWxlbWVudCxcbiAgJ21hc2snOiBNYXNrRWxlbWVudCxcbiAgJ2NsaXBQYXRoJzogQ2xpcFBhdGhFbGVtZW50LFxuICAnZmlsdGVyJzogRmlsdGVyRWxlbWVudCxcbiAgJ2ZlRHJvcFNoYWRvdyc6IEZlRHJvcFNoYWRvd0VsZW1lbnQsXG4gICdmZU1vcnBob2xvZ3knOiBGZU1vcnBob2xvZ3lFbGVtZW50LFxuICAnZmVDb21wb3NpdGUnOiBGZUNvbXBvc2l0ZUVsZW1lbnQsXG4gICdmZUNvbG9yTWF0cml4JzogRmVDb2xvck1hdHJpeEVsZW1lbnQsXG4gICdmZUdhdXNzaWFuQmx1cic6IEZlR2F1c3NpYW5CbHVyRWxlbWVudCxcbiAgJ3RpdGxlJzogVGl0bGVFbGVtZW50LFxuICAnZGVzYyc6IERlc2NFbGVtZW50XG59O1xuXG5mdW5jdGlvbiBvd25LZXlzJDEob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDEodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgcmV0dXJuIGNhbnZhcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW1hZ2UoX3gpIHtcbiAgcmV0dXJuIF9jcmVhdGVJbWFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlSW1hZ2UoKSB7XG4gIF9jcmVhdGVJbWFnZSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoc3JjKSB7XG4gICAgdmFyIGFub255bW91c0Nyb3NzT3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICB2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcblxuICAgIGlmIChhbm9ueW1vdXNDcm9zc09yaWdpbikge1xuICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKGltYWdlKTtcbiAgICAgIH07XG5cbiAgICAgIGltYWdlLm9uZXJyb3IgPSAoX2V2ZW50LCBfc291cmNlLCBfbGluZW5vLCBfY29sbm8sIGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBpbWFnZS5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gX2NyZWF0ZUltYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmNsYXNzIERvY3VtZW50IHtcbiAgY29uc3RydWN0b3IoY2FudmcpIHtcbiAgICB2YXIge1xuICAgICAgcm9vdEVtU2l6ZSA9IDEyLFxuICAgICAgZW1TaXplID0gMTIsXG4gICAgICBjcmVhdGVDYW52YXMgPSBEb2N1bWVudC5jcmVhdGVDYW52YXMsXG4gICAgICBjcmVhdGVJbWFnZSA9IERvY3VtZW50LmNyZWF0ZUltYWdlLFxuICAgICAgYW5vbnltb3VzQ3Jvc3NPcmlnaW5cbiAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLmNhbnZnID0gY2Fudmc7XG4gICAgdGhpcy5kZWZpbml0aW9ucyA9IHt9O1xuICAgIHRoaXMuc3R5bGVzID0ge307XG4gICAgdGhpcy5zdHlsZXNTcGVjaWZpY2l0eSA9IHt9O1xuICAgIHRoaXMuaW1hZ2VzID0gW107XG4gICAgdGhpcy5mb250cyA9IFtdO1xuICAgIHRoaXMuZW1TaXplU3RhY2sgPSBbXTtcbiAgICB0aGlzLnVuaXF1ZUlkID0gMDtcbiAgICB0aGlzLnNjcmVlbiA9IGNhbnZnLnNjcmVlbjtcbiAgICB0aGlzLnJvb3RFbVNpemUgPSByb290RW1TaXplO1xuICAgIHRoaXMuZW1TaXplID0gZW1TaXplO1xuICAgIHRoaXMuY3JlYXRlQ2FudmFzID0gY3JlYXRlQ2FudmFzO1xuICAgIHRoaXMuY3JlYXRlSW1hZ2UgPSB0aGlzLmJpbmRDcmVhdGVJbWFnZShjcmVhdGVJbWFnZSwgYW5vbnltb3VzQ3Jvc3NPcmlnaW4pO1xuICAgIHRoaXMuc2NyZWVuLndhaXQodGhpcy5pc0ltYWdlc0xvYWRlZC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnNjcmVlbi53YWl0KHRoaXMuaXNGb250c0xvYWRlZC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGJpbmRDcmVhdGVJbWFnZShjcmVhdGVJbWFnZSwgYW5vbnltb3VzQ3Jvc3NPcmlnaW4pIHtcbiAgICBpZiAodHlwZW9mIGFub255bW91c0Nyb3NzT3JpZ2luID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAoc291cmNlLCBmb3JjZUFub255bW91c0Nyb3NzT3JpZ2luKSA9PiBjcmVhdGVJbWFnZShzb3VyY2UsIHR5cGVvZiBmb3JjZUFub255bW91c0Nyb3NzT3JpZ2luID09PSAnYm9vbGVhbicgPyBmb3JjZUFub255bW91c0Nyb3NzT3JpZ2luIDogYW5vbnltb3VzQ3Jvc3NPcmlnaW4pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVJbWFnZTtcbiAgfVxuXG4gIGdldCB3aW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuLndpbmRvdztcbiAgfVxuXG4gIGdldCBmZXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5zY3JlZW4uZmV0Y2g7XG4gIH1cblxuICBnZXQgY3R4KCkge1xuICAgIHJldHVybiB0aGlzLnNjcmVlbi5jdHg7XG4gIH1cblxuICBnZXQgZW1TaXplKCkge1xuICAgIHZhciB7XG4gICAgICBlbVNpemVTdGFja1xuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBlbVNpemVTdGFja1tlbVNpemVTdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHNldCBlbVNpemUodmFsdWUpIHtcbiAgICB2YXIge1xuICAgICAgZW1TaXplU3RhY2tcbiAgICB9ID0gdGhpcztcbiAgICBlbVNpemVTdGFjay5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHBvcEVtU2l6ZSgpIHtcbiAgICB2YXIge1xuICAgICAgZW1TaXplU3RhY2tcbiAgICB9ID0gdGhpcztcbiAgICBlbVNpemVTdGFjay5wb3AoKTtcbiAgfVxuXG4gIGdldFVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBcImNhbnZnXCIuY29uY2F0KCsrdGhpcy51bmlxdWVJZCk7XG4gIH1cblxuICBpc0ltYWdlc0xvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZXMuZXZlcnkoXyA9PiBfLmxvYWRlZCk7XG4gIH1cblxuICBpc0ZvbnRzTG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmZvbnRzLmV2ZXJ5KF8gPT4gXy5sb2FkZWQpO1xuICB9XG5cbiAgY3JlYXRlRG9jdW1lbnRFbGVtZW50KGRvY3VtZW50KSB7XG4gICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgIGRvY3VtZW50RWxlbWVudC5yb290ID0gdHJ1ZTtcbiAgICBkb2N1bWVudEVsZW1lbnQuYWRkU3R5bGVzRnJvbVN0eWxlRGVmaW5pdGlvbigpO1xuICAgIHRoaXMuZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnRFbGVtZW50O1xuICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICBjcmVhdGVFbGVtZW50KG5vZGUpIHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBub2RlLm5vZGVOYW1lLnJlcGxhY2UoL15bXjpdKzovLCAnJyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gRG9jdW1lbnQuZWxlbWVudFR5cGVzW2VsZW1lbnRUeXBlXTtcblxuICAgIGlmICh0eXBlb2YgRWxlbWVudFR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbmV3IEVsZW1lbnRUeXBlKHRoaXMsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVW5rbm93bkVsZW1lbnQodGhpcywgbm9kZSk7XG4gIH1cblxuICBjcmVhdGVUZXh0Tm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0aGlzLCBub2RlKTtcbiAgfVxuXG4gIHNldFZpZXdCb3goY29uZmlnKSB7XG4gICAgdGhpcy5zY3JlZW4uc2V0Vmlld0JveChfb2JqZWN0U3ByZWFkJDEoe1xuICAgICAgZG9jdW1lbnQ6IHRoaXNcbiAgICB9LCBjb25maWcpKTtcbiAgfVxuXG59XG5Eb2N1bWVudC5jcmVhdGVDYW52YXMgPSBjcmVhdGVDYW52YXM7XG5Eb2N1bWVudC5jcmVhdGVJbWFnZSA9IGNyZWF0ZUltYWdlO1xuRG9jdW1lbnQuZWxlbWVudFR5cGVzID0gZWxlbWVudHM7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbi8qKlxyXG4gKiBTVkcgcmVuZGVyZXIgb24gY2FudmFzLlxyXG4gKi9cblxuY2xhc3MgQ2Fudmcge1xuICAvKipcclxuICAgKiBNYWluIGNvbnN0cnVjdG9yLlxyXG4gICAqIEBwYXJhbSBjdHggLSBSZW5kZXJpbmcgY29udGV4dC5cclxuICAgKiBAcGFyYW0gc3ZnIC0gU1ZHIERvY3VtZW50LlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMuXHJcbiAgICovXG4gIGNvbnN0cnVjdG9yKGN0eCwgc3ZnKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcihvcHRpb25zKTtcbiAgICB0aGlzLnNjcmVlbiA9IG5ldyBTY3JlZW4oY3R4LCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCh0aGlzLCBvcHRpb25zKTtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRFbGVtZW50KHN2Zyk7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMuZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBDYW52ZyBpbnN0YW5jZSBmcm9tIFNWRyBzb3VyY2Ugc3RyaW5nIG9yIFVSTC5cclxuICAgKiBAcGFyYW0gY3R4IC0gUmVuZGVyaW5nIGNvbnRleHQuXHJcbiAgICogQHBhcmFtIHN2ZyAtIFNWRyBzb3VyY2Ugc3RyaW5nIG9yIFVSTC5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLlxyXG4gICAqIEByZXR1cm5zIENhbnZnIGluc3RhbmNlLlxyXG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb20oY3R4LCBzdmcpIHtcbiAgICB2YXIgX2FyZ3VtZW50cyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIHZhciBvcHRpb25zID0gX2FyZ3VtZW50cy5sZW5ndGggPiAyICYmIF9hcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmd1bWVudHNbMl0gOiB7fTtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuICAgICAgdmFyIHN2Z0RvY3VtZW50ID0geWllbGQgcGFyc2VyLnBhcnNlKHN2Zyk7XG4gICAgICByZXR1cm4gbmV3IENhbnZnKGN0eCwgc3ZnRG9jdW1lbnQsIG9wdGlvbnMpO1xuICAgIH0pKCk7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIENhbnZnIGluc3RhbmNlIGZyb20gU1ZHIHNvdXJjZSBzdHJpbmcuXHJcbiAgICogQHBhcmFtIGN0eCAtIFJlbmRlcmluZyBjb250ZXh0LlxyXG4gICAqIEBwYXJhbSBzdmcgLSBTVkcgc291cmNlIHN0cmluZy5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLlxyXG4gICAqIEByZXR1cm5zIENhbnZnIGluc3RhbmNlLlxyXG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21TdHJpbmcoY3R4LCBzdmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIHBhcnNlciA9IG5ldyBQYXJzZXIob3B0aW9ucyk7XG4gICAgdmFyIHN2Z0RvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzdmcpO1xuICAgIHJldHVybiBuZXcgQ2FudmcoY3R4LCBzdmdEb2N1bWVudCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIG5ldyBDYW52ZyBpbnN0YW5jZSB3aXRoIGluaGVyaXRlZCBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSBjdHggLSBSZW5kZXJpbmcgY29udGV4dC5cclxuICAgKiBAcGFyYW0gc3ZnIC0gU1ZHIHNvdXJjZSBzdHJpbmcgb3IgVVJMLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMuXHJcbiAgICogQHJldHVybnMgQ2FudmcgaW5zdGFuY2UuXHJcbiAgICovXG5cblxuICBmb3JrKGN0eCwgc3ZnKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHJldHVybiBDYW52Zy5mcm9tKGN0eCwgc3ZnLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMub3B0aW9ucyksIG9wdGlvbnMpKTtcbiAgfVxuICAvKipcclxuICAgKiBDcmVhdGUgbmV3IENhbnZnIGluc3RhbmNlIHdpdGggaW5oZXJpdGVkIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIGN0eCAtIFJlbmRlcmluZyBjb250ZXh0LlxyXG4gICAqIEBwYXJhbSBzdmcgLSBTVkcgc291cmNlIHN0cmluZy5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLlxyXG4gICAqIEByZXR1cm5zIENhbnZnIGluc3RhbmNlLlxyXG4gICAqL1xuXG5cbiAgZm9ya1N0cmluZyhjdHgsIHN2Zykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICByZXR1cm4gQ2FudmcuZnJvbVN0cmluZyhjdHgsIHN2ZywgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLm9wdGlvbnMpLCBvcHRpb25zKSk7XG4gIH1cbiAgLyoqXHJcbiAgICogRG9jdW1lbnQgaXMgcmVhZHkgcHJvbWlzZS5cclxuICAgKiBAcmV0dXJucyBSZWFkeSBwcm9taXNlLlxyXG4gICAqL1xuXG5cbiAgcmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuLnJlYWR5KCk7XG4gIH1cbiAgLyoqXHJcbiAgICogRG9jdW1lbnQgaXMgcmVhZHkgdmFsdWUuXHJcbiAgICogQHJldHVybnMgSXMgcmVhZHkgb3Igbm90LlxyXG4gICAqL1xuXG5cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY3JlZW4uaXNSZWFkeSgpO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlciBvbmx5IGZpcnN0IGZyYW1lLCBpZ25vcmluZyBhbmltYXRpb25zIGFuZCBtb3VzZS5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLlxyXG4gICAqL1xuXG5cbiAgcmVuZGVyKCkge1xuICAgIHZhciBfYXJndW1lbnRzMiA9IGFyZ3VtZW50cyxcbiAgICAgICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IF9hcmd1bWVudHMyLmxlbmd0aCA+IDAgJiYgX2FyZ3VtZW50czJbMF0gIT09IHVuZGVmaW5lZCA/IF9hcmd1bWVudHMyWzBdIDoge307XG5cbiAgICAgIF90aGlzLnN0YXJ0KF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBlbmFibGVSZWRyYXc6IHRydWUsXG4gICAgICAgIGlnbm9yZUFuaW1hdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlTW91c2U6IHRydWVcbiAgICAgIH0sIG9wdGlvbnMpKTtcblxuICAgICAgeWllbGQgX3RoaXMucmVhZHkoKTtcblxuICAgICAgX3RoaXMuc3RvcCgpO1xuICAgIH0pKCk7XG4gIH1cbiAgLyoqXHJcbiAgICogU3RhcnQgcmVuZGVyaW5nLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVuZGVyIG9wdGlvbnMuXHJcbiAgICovXG5cblxuICBzdGFydCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIHtcbiAgICAgIGRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNjcmVlbixcbiAgICAgIG9wdGlvbnM6IGJhc2VPcHRpb25zXG4gICAgfSA9IHRoaXM7XG4gICAgc2NyZWVuLnN0YXJ0KGRvY3VtZW50RWxlbWVudCwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGVuYWJsZVJlZHJhdzogdHJ1ZVxuICAgIH0sIGJhc2VPcHRpb25zKSwgb3B0aW9ucykpO1xuICB9XG4gIC8qKlxyXG4gICAqIFN0b3AgcmVuZGVyaW5nLlxyXG4gICAqL1xuXG5cbiAgc3RvcCgpIHtcbiAgICB0aGlzLnNjcmVlbi5zdG9wKCk7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVzaXplIFNWRyB0byBmaXQgaW4gZ2l2ZW4gc2l6ZS5cclxuICAgKiBAcGFyYW0gd2lkdGhcclxuICAgKiBAcGFyYW0gaGVpZ2h0XHJcbiAgICogQHBhcmFtIHByZXNlcnZlQXNwZWN0UmF0aW9cclxuICAgKi9cblxuXG4gIHJlc2l6ZSh3aWR0aCkge1xuICAgIHZhciBoZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHdpZHRoO1xuICAgIHZhciBwcmVzZXJ2ZUFzcGVjdFJhdGlvID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICB0aGlzLmRvY3VtZW50RWxlbWVudC5yZXNpemUod2lkdGgsIGhlaWdodCwgcHJlc2VydmVBc3BlY3RSYXRpbyk7XG4gIH1cblxufVxuXG5leHBvcnQgeyBBRWxlbWVudCwgQW5pbWF0ZUNvbG9yRWxlbWVudCwgQW5pbWF0ZUVsZW1lbnQsIEFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50LCBCb3VuZGluZ0JveCwgQ0IxLCBDQjIsIENCMywgQ0I0LCBDYW52ZywgQ2lyY2xlRWxlbWVudCwgQ2xpcFBhdGhFbGVtZW50LCBEZWZzRWxlbWVudCwgRGVzY0VsZW1lbnQsIERvY3VtZW50LCBFbGVtZW50LCBFbGxpcHNlRWxlbWVudCwgRmVDb2xvck1hdHJpeEVsZW1lbnQsIEZlQ29tcG9zaXRlRWxlbWVudCwgRmVEcm9wU2hhZG93RWxlbWVudCwgRmVHYXVzc2lhbkJsdXJFbGVtZW50LCBGZU1vcnBob2xvZ3lFbGVtZW50LCBGaWx0ZXJFbGVtZW50LCBGb250LCBGb250RWxlbWVudCwgRm9udEZhY2VFbGVtZW50LCBHRWxlbWVudCwgR2x5cGhFbGVtZW50LCBHcmFkaWVudEVsZW1lbnQsIEltYWdlRWxlbWVudCwgTGluZUVsZW1lbnQsIExpbmVhckdyYWRpZW50RWxlbWVudCwgTWFya2VyRWxlbWVudCwgTWFza0VsZW1lbnQsIE1hdHJpeCwgTWlzc2luZ0dseXBoRWxlbWVudCwgTW91c2UsIFBTRVVET19aRVJPLCBQYXJzZXIsIFBhdGhFbGVtZW50LCBQYXRoUGFyc2VyLCBQYXR0ZXJuRWxlbWVudCwgUG9pbnQsIFBvbHlnb25FbGVtZW50LCBQb2x5bGluZUVsZW1lbnQsIFByb3BlcnR5LCBRQjEsIFFCMiwgUUIzLCBSYWRpYWxHcmFkaWVudEVsZW1lbnQsIFJlY3RFbGVtZW50LCBSZW5kZXJlZEVsZW1lbnQsIFJvdGF0ZSwgU1ZHRWxlbWVudCwgU1ZHRm9udExvYWRlciwgU2NhbGUsIFNjcmVlbiwgU2tldywgU2tld1gsIFNrZXdZLCBTdG9wRWxlbWVudCwgU3R5bGVFbGVtZW50LCBTeW1ib2xFbGVtZW50LCBUUmVmRWxlbWVudCwgVFNwYW5FbGVtZW50LCBUZXh0RWxlbWVudCwgVGV4dFBhdGhFbGVtZW50LCBUaXRsZUVsZW1lbnQsIFRyYW5zZm9ybSwgVHJhbnNsYXRlLCBVbmtub3duRWxlbWVudCwgVXNlRWxlbWVudCwgVmlld1BvcnQsIGNvbXByZXNzU3BhY2VzLCBDYW52ZyBhcyBkZWZhdWx0LCBnZXRTZWxlY3RvclNwZWNpZmljaXR5LCBub3JtYWxpemVBdHRyaWJ1dGVOYW1lLCBub3JtYWxpemVDb2xvciwgcGFyc2VFeHRlcm5hbFVybCwgaW5kZXggYXMgcHJlc2V0cywgdG9OdW1iZXJzLCB0cmltTGVmdCwgdHJpbVJpZ2h0LCB2ZWN0b3JNYWduaXR1ZGUsIHZlY3RvcnNBbmdsZSwgdmVjdG9yc1JhdGlvIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWFXNWtaWGd1WlhNdWFuTWlMQ0p6YjNWeVkyVnpJanBiWFN3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2x0ZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenNpZlE9PVxuIl0sIm5hbWVzIjpbImdldE5hbm9TZWNvbmRzIiwiaHJ0aW1lIiwibG9hZFRpbWUiLCJtb2R1bGVMb2FkVGltZSIsIm5vZGVMb2FkVGltZSIsInVwVGltZSIsInBlcmZvcm1hbmNlIiwibm93IiwibW9kdWxlIiwiZXhwb3J0cyIsInByb2Nlc3MiLCJociIsInVwdGltZSIsIkRhdGUiLCJnZXRUaW1lIiwiY2FsbCIsInRoaXMiLCJyb290Iiwid2luZG93IiwiZyIsInZlbmRvcnMiLCJzdWZmaXgiLCJyYWYiLCJjYWYiLCJpIiwibGVuZ3RoIiwibGFzdCIsImlkIiwicXVldWUiLCJmcmFtZUR1cmF0aW9uIiwiY2FsbGJhY2siLCJfbm93IiwibmV4dCIsIk1hdGgiLCJtYXgiLCJzZXRUaW1lb3V0IiwiY3AiLCJzbGljZSIsImNhbmNlbGxlZCIsImUiLCJyb3VuZCIsInB1c2giLCJoYW5kbGUiLCJmbiIsImNhbmNlbCIsImFwcGx5IiwiYXJndW1lbnRzIiwicG9seWZpbGwiLCJvYmplY3QiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsImNvbG9yX3N0cmluZyIsIm9rIiwiYWxwaGEiLCJjaGFyQXQiLCJzdWJzdHIiLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJzaW1wbGVfY29sb3JzIiwiYWxpY2VibHVlIiwiYW50aXF1ZXdoaXRlIiwiYXF1YSIsImFxdWFtYXJpbmUiLCJhenVyZSIsImJlaWdlIiwiYmlzcXVlIiwiYmxhY2siLCJibGFuY2hlZGFsbW9uZCIsImJsdWUiLCJibHVldmlvbGV0IiwiYnJvd24iLCJidXJseXdvb2QiLCJjYWRldGJsdWUiLCJjaGFydHJldXNlIiwiY2hvY29sYXRlIiwiY29yYWwiLCJjb3JuZmxvd2VyYmx1ZSIsImNvcm5zaWxrIiwiY3JpbXNvbiIsImN5YW4iLCJkYXJrYmx1ZSIsImRhcmtjeWFuIiwiZGFya2dvbGRlbnJvZCIsImRhcmtncmF5IiwiZGFya2dyZWVuIiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmt0dXJxdW9pc2UiLCJkYXJrdmlvbGV0IiwiZGVlcHBpbmsiLCJkZWVwc2t5Ymx1ZSIsImRpbWdyYXkiLCJkb2RnZXJibHVlIiwiZmVsZHNwYXIiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJob25leWRldyIsImhvdHBpbmsiLCJpbmRpYW5yZWQiLCJpbmRpZ28iLCJpdm9yeSIsImtoYWtpIiwibGF2ZW5kZXIiLCJsYXZlbmRlcmJsdXNoIiwibGF3bmdyZWVuIiwibGVtb25jaGlmZm9uIiwibGlnaHRibHVlIiwibGlnaHRjb3JhbCIsImxpZ2h0Y3lhbiIsImxpZ2h0Z29sZGVucm9keWVsbG93IiwibGlnaHRncmV5IiwibGlnaHRncmVlbiIsImxpZ2h0cGluayIsImxpZ2h0c2FsbW9uIiwibGlnaHRzZWFncmVlbiIsImxpZ2h0c2t5Ymx1ZSIsImxpZ2h0c2xhdGVibHVlIiwibGlnaHRzbGF0ZWdyYXkiLCJsaWdodHN0ZWVsYmx1ZSIsImxpZ2h0eWVsbG93IiwibGltZSIsImxpbWVncmVlbiIsImxpbmVuIiwibWFnZW50YSIsIm1hcm9vbiIsIm1lZGl1bWFxdWFtYXJpbmUiLCJtZWRpdW1ibHVlIiwibWVkaXVtb3JjaGlkIiwibWVkaXVtcHVycGxlIiwibWVkaXVtc2VhZ3JlZW4iLCJtZWRpdW1zbGF0ZWJsdWUiLCJtZWRpdW1zcHJpbmdncmVlbiIsIm1lZGl1bXR1cnF1b2lzZSIsIm1lZGl1bXZpb2xldHJlZCIsIm1pZG5pZ2h0Ymx1ZSIsIm1pbnRjcmVhbSIsIm1pc3R5cm9zZSIsIm1vY2Nhc2luIiwibmF2YWpvd2hpdGUiLCJuYXZ5Iiwib2xkbGFjZSIsIm9saXZlIiwib2xpdmVkcmFiIiwib3JhbmdlIiwib3JhbmdlcmVkIiwib3JjaGlkIiwicGFsZWdvbGRlbnJvZCIsInBhbGVncmVlbiIsInBhbGV0dXJxdW9pc2UiLCJwYWxldmlvbGV0cmVkIiwicGFwYXlhd2hpcCIsInBlYWNocHVmZiIsInBlcnUiLCJwaW5rIiwicGx1bSIsInBvd2RlcmJsdWUiLCJwdXJwbGUiLCJyZWJlY2NhcHVycGxlIiwicmVkIiwicm9zeWJyb3duIiwicm95YWxibHVlIiwic2FkZGxlYnJvd24iLCJzYWxtb24iLCJzYW5keWJyb3duIiwic2VhZ3JlZW4iLCJzZWFzaGVsbCIsInNpZW5uYSIsInNpbHZlciIsInNreWJsdWUiLCJzbGF0ZWJsdWUiLCJzbGF0ZWdyYXkiLCJzbm93Iiwic3ByaW5nZ3JlZW4iLCJzdGVlbGJsdWUiLCJ0YW4iLCJ0ZWFsIiwidGhpc3RsZSIsInRvbWF0byIsInR1cnF1b2lzZSIsInZpb2xldCIsInZpb2xldHJlZCIsIndoZWF0Iiwid2hpdGUiLCJ3aGl0ZXNtb2tlIiwieWVsbG93IiwieWVsbG93Z3JlZW4iLCJjb2xvcl9kZWZzIiwicmUiLCJleGFtcGxlIiwiYml0cyIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsInByb2Nlc3NvciIsImV4ZWMiLCJjaGFubmVscyIsInIiLCJiIiwiaXNOYU4iLCJ0b1JHQiIsInRvUkdCQSIsInRvSGV4IiwidG9TdHJpbmciLCJnZXRIZWxwWE1MIiwiZXhhbXBsZXMiLCJBcnJheSIsImoiLCJzYyIsInhtbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImxpc3RfaXRlbSIsImxpc3RfY29sb3IiLCJSR0JDb2xvciIsImV4YW1wbGVfZGl2Iiwic3R5bGUiLCJjc3NUZXh0IiwiYXBwZW5kQ2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsImxpc3RfaXRlbV92YWx1ZSIsImlzQ2FsbGFibGUiLCJ0cnlUb1N0cmluZyIsIiRUeXBlRXJyb3IiLCJUeXBlRXJyb3IiLCJhcmd1bWVudCIsImlzQ29uc3RydWN0b3IiLCJpc1Bvc3NpYmxlUHJvdG90eXBlIiwiJFN0cmluZyIsIlN0cmluZyIsIndlbGxLbm93blN5bWJvbCIsImNyZWF0ZSIsImRlZmluZVByb3BlcnR5IiwiVU5TQ09QQUJMRVMiLCJBcnJheVByb3RvdHlwZSIsInByb3RvdHlwZSIsInVuZGVmaW5lZCIsImNvbmZpZ3VyYWJsZSIsInZhbHVlIiwia2V5IiwiUyIsImluZGV4IiwidW5pY29kZSIsImlzUHJvdG90eXBlT2YiLCJpdCIsIlByb3RvdHlwZSIsImlzT2JqZWN0IiwidG9JbmRleGVkT2JqZWN0IiwidG9BYnNvbHV0ZUluZGV4IiwibGVuZ3RoT2ZBcnJheUxpa2UiLCJjcmVhdGVNZXRob2QiLCJJU19JTkNMVURFUyIsIiR0aGlzIiwiZWwiLCJmcm9tSW5kZXgiLCJPIiwiaW5jbHVkZXMiLCJpbmRleE9mIiwiZmFpbHMiLCJNRVRIT0RfTkFNRSIsIm1ldGhvZCIsImFDYWxsYWJsZSIsInRvT2JqZWN0IiwiSW5kZXhlZE9iamVjdCIsIlJFRFVDRV9FTVBUWSIsIklTX1JJR0hUIiwidGhhdCIsImNhbGxiYWNrZm4iLCJhcmd1bWVudHNMZW5ndGgiLCJtZW1vIiwic2VsZiIsImxlZnQiLCJyaWdodCIsInVuY3VycnlUaGlzIiwiSVRFUkFUT1IiLCJTQUZFX0NMT1NJTkciLCJjYWxsZWQiLCJpdGVyYXRvcldpdGhSZXR1cm4iLCJkb25lIiwiZnJvbSIsImVycm9yIiwiU0tJUF9DTE9TSU5HIiwiSVRFUkFUSU9OX1NVUFBPUlQiLCJzdHJpbmdTbGljZSIsIlRPX1NUUklOR19UQUdfU1VQUE9SVCIsImNsYXNzb2ZSYXciLCJUT19TVFJJTkdfVEFHIiwiJE9iamVjdCIsIk9iamVjdCIsIkNPUlJFQ1RfQVJHVU1FTlRTIiwidGFnIiwicmVzdWx0IiwidHJ5R2V0IiwiY2FsbGVlIiwiaGFzT3duIiwib3duS2V5cyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSIsImRlZmluZVByb3BlcnR5TW9kdWxlIiwidGFyZ2V0Iiwic291cmNlIiwiZXhjZXB0aW9ucyIsImtleXMiLCJmIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiTUFUQ0giLCJyZWdleHAiLCJlcnJvcjEiLCJlcnJvcjIiLCJGIiwiY29uc3RydWN0b3IiLCJnZXRQcm90b3R5cGVPZiIsIkRFU0NSSVBUT1JTIiwiY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yIiwiYml0bWFwIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwibWFrZUJ1aWx0SW4iLCJuYW1lIiwiZGVzY3JpcHRvciIsImdldCIsImdldHRlciIsInNldCIsInNldHRlciIsImRlZmluZUdsb2JhbFByb3BlcnR5Iiwib3B0aW9ucyIsInNpbXBsZSIsImdsb2JhbCIsInVuc2FmZSIsIm5vbkNvbmZpZ3VyYWJsZSIsIm5vbldyaXRhYmxlIiwiZ2xvYmFsVGhpcyIsIkVYSVNUUyIsIkNTU1J1bGVMaXN0IiwiQ1NTU3R5bGVEZWNsYXJhdGlvbiIsIkNTU1ZhbHVlTGlzdCIsIkNsaWVudFJlY3RMaXN0IiwiRE9NUmVjdExpc3QiLCJET01TdHJpbmdMaXN0IiwiRE9NVG9rZW5MaXN0IiwiRGF0YVRyYW5zZmVySXRlbUxpc3QiLCJGaWxlTGlzdCIsIkhUTUxBbGxDb2xsZWN0aW9uIiwiSFRNTENvbGxlY3Rpb24iLCJIVE1MRm9ybUVsZW1lbnQiLCJIVE1MU2VsZWN0RWxlbWVudCIsIk1lZGlhTGlzdCIsIk1pbWVUeXBlQXJyYXkiLCJOYW1lZE5vZGVNYXAiLCJOb2RlTGlzdCIsIlBhaW50UmVxdWVzdExpc3QiLCJQbHVnaW4iLCJQbHVnaW5BcnJheSIsIlNWR0xlbmd0aExpc3QiLCJTVkdOdW1iZXJMaXN0IiwiU1ZHUGF0aFNlZ0xpc3QiLCJTVkdQb2ludExpc3QiLCJTVkdTdHJpbmdMaXN0IiwiU1ZHVHJhbnNmb3JtTGlzdCIsIlNvdXJjZUJ1ZmZlckxpc3QiLCJTdHlsZVNoZWV0TGlzdCIsIlRleHRUcmFja0N1ZUxpc3QiLCJUZXh0VHJhY2tMaXN0IiwiVG91Y2hMaXN0IiwiY2xhc3NMaXN0IiwiZG9jdW1lbnRDcmVhdGVFbGVtZW50IiwiRE9NVG9rZW5MaXN0UHJvdG90eXBlIiwidXNlckFnZW50IiwidGVzdCIsIlBlYmJsZSIsIkVOVklST05NRU5UIiwibmF2aWdhdG9yIiwibWF0Y2giLCJ2ZXJzaW9uIiwiRGVubyIsInZlcnNpb25zIiwidjgiLCJzcGxpdCIsImNsYXNzb2YiLCJ1c2VyQWdlbnRTdGFydHNXaXRoIiwic3RyaW5nIiwiQnVuIiwiY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5IiwiZGVmaW5lQnVpbHRJbiIsImNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMiLCJpc0ZvcmNlZCIsInRhcmdldFByb3BlcnR5Iiwic291cmNlUHJvcGVydHkiLCJUQVJHRVQiLCJHTE9CQUwiLCJTVEFUSUMiLCJzdGF0IiwiZG9udENhbGxHZXRTZXQiLCJmb3JjZWQiLCJzaGFtIiwicmVnZXhwRXhlYyIsIlNQRUNJRVMiLCJSZWdFeHBQcm90b3R5cGUiLCJSZWdFeHAiLCJLRVkiLCJGT1JDRUQiLCJTSEFNIiwiU1lNQk9MIiwiREVMRUdBVEVTX1RPX1NZTUJPTCIsIkRFTEVHQVRFU19UT19FWEVDIiwiZXhlY0NhbGxlZCIsImZsYWdzIiwibmF0aXZlUmVnRXhwTWV0aG9kIiwibWV0aG9kcyIsIm5hdGl2ZU1ldGhvZCIsInN0ciIsImFyZzIiLCJmb3JjZVN0cmluZ01ldGhvZCIsIiRleGVjIiwiTkFUSVZFX0JJTkQiLCJGdW5jdGlvblByb3RvdHlwZSIsIkZ1bmN0aW9uIiwiUmVmbGVjdCIsImJpbmQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERlc2NyaXB0b3IiLCJQUk9QRVIiLCJDT05GSUdVUkFCTEUiLCJ1bmN1cnJ5VGhpc1dpdGhCaW5kIiwibmFtZXNwYWNlIiwiZ2V0TWV0aG9kIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJJdGVyYXRvcnMiLCJhbk9iamVjdCIsImdldEl0ZXJhdG9yTWV0aG9kIiwidXNpbmdJdGVyYXRvciIsIml0ZXJhdG9yTWV0aG9kIiwiViIsIlAiLCJmdW5jIiwiZmxvb3IiLCJTVUJTVElUVVRJT05fU1lNQk9MUyIsIlNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEIiwibWF0Y2hlZCIsInBvc2l0aW9uIiwiY2FwdHVyZXMiLCJuYW1lZENhcHR1cmVzIiwicmVwbGFjZW1lbnQiLCJ0YWlsUG9zIiwibSIsInN5bWJvbHMiLCJjaCIsImNhcHR1cmUiLCJuIiwiY2hlY2siLCJhIiwiY29uc29sZSIsImdldEJ1aWx0SW4iLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInN0b3JlIiwiZnVuY3Rpb25Ub1N0cmluZyIsImluc3BlY3RTb3VyY2UiLCJoYXMiLCJOQVRJVkVfV0VBS19NQVAiLCJzaGFyZWQiLCJzaGFyZWRLZXkiLCJoaWRkZW5LZXlzIiwiT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQiLCJXZWFrTWFwIiwic3RhdGUiLCJtZXRhZGF0YSIsImZhY2FkZSIsIlNUQVRFIiwiZW5mb3JjZSIsImdldHRlckZvciIsIlRZUEUiLCJ0eXBlIiwiaXNBcnJheSIsImRvY3VtZW50QWxsIiwiYWxsIiwibm9vcCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yUmVnRXhwIiwiSU5DT1JSRUNUX1RPX1NUUklORyIsImlzQ29uc3RydWN0b3JNb2Rlcm4iLCJpc0NvbnN0cnVjdG9yTGVnYWN5IiwiZmVhdHVyZSIsImRldGVjdGlvbiIsImRhdGEiLCJub3JtYWxpemUiLCJQT0xZRklMTCIsIk5BVElWRSIsImlzUmVnRXhwIiwiVVNFX1NZTUJPTF9BU19VSUQiLCIkU3ltYm9sIiwiaXNBcnJheUl0ZXJhdG9yTWV0aG9kIiwiZ2V0SXRlcmF0b3IiLCJpdGVyYXRvckNsb3NlIiwiUmVzdWx0Iiwic3RvcHBlZCIsIlJlc3VsdFByb3RvdHlwZSIsIml0ZXJhYmxlIiwidW5ib3VuZEZ1bmN0aW9uIiwiaXRlcmF0b3IiLCJpdGVyRm4iLCJzdGVwIiwiQVNfRU5UUklFUyIsIklTX1JFQ09SRCIsIklTX0lURVJBVE9SIiwiSU5URVJSVVBURUQiLCJzdG9wIiwiY29uZGl0aW9uIiwiY2FsbEZuIiwia2luZCIsImlubmVyUmVzdWx0IiwiaW5uZXJFcnJvciIsIkl0ZXJhdG9yUHJvdG90eXBlIiwic2V0VG9TdHJpbmdUYWciLCJyZXR1cm5UaGlzIiwiSXRlcmF0b3JDb25zdHJ1Y3RvciIsIk5BTUUiLCJFTlVNRVJBQkxFX05FWFQiLCIkIiwiSVNfUFVSRSIsIkZ1bmN0aW9uTmFtZSIsImNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IiLCJzZXRQcm90b3R5cGVPZiIsIkl0ZXJhdG9yc0NvcmUiLCJQUk9QRVJfRlVOQ1RJT05fTkFNRSIsIkNPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FIiwiQlVHR1lfU0FGQVJJX0lURVJBVE9SUyIsIktFWVMiLCJWQUxVRVMiLCJFTlRSSUVTIiwiSXRlcmFibGUiLCJERUZBVUxUIiwiSVNfU0VUIiwiQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0SXRlcmF0aW9uTWV0aG9kIiwiS0lORCIsImRlZmF1bHRJdGVyYXRvciIsIkl0ZXJhYmxlUHJvdG90eXBlIiwiSU5DT1JSRUNUX1ZBTFVFU19OQU1FIiwibmF0aXZlSXRlcmF0b3IiLCJhbnlOYXRpdmVJdGVyYXRvciIsImVudHJpZXMiLCJ2YWx1ZXMiLCJwcm90byIsIlByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSIsImFycmF5SXRlcmF0b3IiLCJ0b0xlbmd0aCIsIm9iaiIsIkludGVybmFsU3RhdGVNb2R1bGUiLCJlbmZvcmNlSW50ZXJuYWxTdGF0ZSIsImdldEludGVybmFsU3RhdGUiLCJqb2luIiwiQ09ORklHVVJBQkxFX0xFTkdUSCIsIlRFTVBMQVRFIiwiYXJpdHkiLCJjZWlsIiwidHJ1bmMiLCJ4Iiwibm90aWZ5IiwidG9nZ2xlIiwibm9kZSIsInByb21pc2UiLCJ0aGVuIiwic2FmZUdldEJ1aWx0SW4iLCJtYWNyb3Rhc2siLCJRdWV1ZSIsIklTX0lPUyIsIklTX0lPU19QRUJCTEUiLCJJU19XRUJPU19XRUJLSVQiLCJJU19OT0RFIiwiTXV0YXRpb25PYnNlcnZlciIsIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiLCJQcm9taXNlIiwibWljcm90YXNrIiwiZmx1c2giLCJwYXJlbnQiLCJkb21haW4iLCJleGl0IiwiaGVhZCIsImVudGVyIiwicmVzb2x2ZSIsIm5leHRUaWNrIiwib2JzZXJ2ZSIsImNoYXJhY3RlckRhdGEiLCJhZGQiLCJQcm9taXNlQ2FwYWJpbGl0eSIsIkMiLCJyZWplY3QiLCIkJHJlc29sdmUiLCIkJHJlamVjdCIsImFjdGl2ZVhEb2N1bWVudCIsImRlZmluZVByb3BlcnRpZXNNb2R1bGUiLCJlbnVtQnVnS2V5cyIsImh0bWwiLCJQUk9UT1RZUEUiLCJTQ1JJUFQiLCJJRV9QUk9UTyIsIkVtcHR5Q29uc3RydWN0b3IiLCJzY3JpcHRUYWciLCJjb250ZW50IiwiTFQiLCJOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYIiwid3JpdGUiLCJjbG9zZSIsInRlbXAiLCJwYXJlbnRXaW5kb3ciLCJOdWxsUHJvdG9PYmplY3QiLCJBY3RpdmVYT2JqZWN0IiwiaWZyYW1lRG9jdW1lbnQiLCJpZnJhbWUiLCJKUyIsImRpc3BsYXkiLCJzcmMiLCJjb250ZW50V2luZG93Iiwib3BlbiIsIlByb3BlcnRpZXMiLCJWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyIsIm9iamVjdEtleXMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJJRThfRE9NX0RFRklORSIsInRvUHJvcGVydHlLZXkiLCIkZGVmaW5lUHJvcGVydHkiLCIkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiRU5VTUVSQUJMRSIsIldSSVRBQkxFIiwiQXR0cmlidXRlcyIsImN1cnJlbnQiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSIsImludGVybmFsT2JqZWN0S2V5cyIsImNvbmNhdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIiLCJPYmplY3RQcm90b3R5cGUiLCJuYW1lcyIsIiRwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIk5BU0hPUk5fQlVHIiwidW5jdXJyeVRoaXNBY2Nlc3NvciIsInJlcXVpcmVPYmplY3RDb2VyY2libGUiLCJhUG9zc2libGVQcm90b3R5cGUiLCJDT1JSRUNUX1NFVFRFUiIsIl9fcHJvdG9fXyIsImlucHV0IiwicHJlZiIsInZhbCIsInZhbHVlT2YiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlIiwiTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yIiwiVjhfVkVSU0lPTiIsIk5hdGl2ZVByb21pc2VQcm90b3R5cGUiLCJTVUJDTEFTU0lORyIsIk5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCIsIlByb21pc2VSZWplY3Rpb25FdmVudCIsIkZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIiwiUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UiLCJHTE9CQUxfQ09SRV9KU19QUk9NSVNFIiwiRmFrZVByb21pc2UiLCJDT05TVFJVQ1RPUiIsIlJFSkVDVElPTl9FVkVOVCIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwicHJvbWlzZUNhcGFiaWxpdHkiLCJjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24iLCJ0YWlsIiwiaXRlbSIsImVudHJ5IiwiUiIsInJlMSIsInJlMiIsInJlZ2V4cEZsYWdzIiwic3RpY2t5SGVscGVycyIsIlVOU1VQUE9SVEVEX0RPVF9BTEwiLCJVTlNVUFBPUlRFRF9OQ0ciLCJuYXRpdmVSZXBsYWNlIiwibmF0aXZlRXhlYyIsInBhdGNoZWRFeGVjIiwiVVBEQVRFU19MQVNUX0lOREVYX1dST05HIiwibGFzdEluZGV4IiwiVU5TVVBQT1JURURfWSIsIkJST0tFTl9DQVJFVCIsIk5QQ0dfSU5DTFVERUQiLCJyZUNvcHkiLCJncm91cCIsInJhdyIsImdyb3VwcyIsInN0aWNreSIsImNoYXJzQWRkZWQiLCJzdHJDb3B5IiwibXVsdGlsaW5lIiwiaGFzSW5kaWNlcyIsImlnbm9yZUNhc2UiLCJkb3RBbGwiLCJ1bmljb2RlU2V0cyIsInJlZ0V4cEZsYWdzIiwiJFJlZ0V4cCIsIk1JU1NFRF9TVElDS1kiLCJkZWZpbmVCdWlsdEluQWNjZXNzb3IiLCJDT05TVFJVQ1RPUl9OQU1FIiwiQ29uc3RydWN0b3IiLCJUQUciLCJ1aWQiLCJTSEFSRUQiLCJtb2RlIiwiY29weXJpZ2h0IiwibGljZW5zZSIsImFDb25zdHJ1Y3RvciIsImRlZmF1bHRDb25zdHJ1Y3RvciIsInRvSW50ZWdlck9ySW5maW5pdHkiLCJjaGFyQ29kZUF0IiwiQ09OVkVSVF9UT19TVFJJTkciLCJwb3MiLCJmaXJzdCIsInNlY29uZCIsInNpemUiLCJjb2RlQXQiLCJ3aGl0ZXNwYWNlcyIsImx0cmltIiwicnRyaW0iLCJzdGFydCIsImVuZCIsInRyaW0iLCJzeW1ib2wiLCJTeW1ib2wiLCIkbG9jYXRpb24iLCJkZWZlciIsImNoYW5uZWwiLCJwb3J0IiwiYXJyYXlTbGljZSIsInZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoIiwic2V0SW1tZWRpYXRlIiwiY2xlYXIiLCJjbGVhckltbWVkaWF0ZSIsIkRpc3BhdGNoIiwiTWVzc2FnZUNoYW5uZWwiLCJjb3VudGVyIiwiT05SRUFEWVNUQVRFQ0hBTkdFIiwibG9jYXRpb24iLCJydW4iLCJydW5uZXIiLCJldmVudExpc3RlbmVyIiwiZXZlbnQiLCJnbG9iYWxQb3N0TWVzc2FnZURlZmVyIiwicG9zdE1lc3NhZ2UiLCJwcm90b2NvbCIsImhvc3QiLCJoYW5kbGVyIiwiYXJncyIsInBvcnQyIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJhZGRFdmVudExpc3RlbmVyIiwiaW1wb3J0U2NyaXB0cyIsInJlbW92ZUNoaWxkIiwibWluIiwiaW50ZWdlciIsIm51bWJlciIsImxlbiIsImlzU3ltYm9sIiwib3JkaW5hcnlUb1ByaW1pdGl2ZSIsIlRPX1BSSU1JVElWRSIsImV4b3RpY1RvUHJpbSIsInRvUHJpbWl0aXZlIiwicG9zdGZpeCIsInJhbmRvbSIsIk5BVElWRV9TWU1CT0wiLCJwYXNzZWQiLCJyZXF1aXJlZCIsIldlbGxLbm93blN5bWJvbHNTdG9yZSIsImNyZWF0ZVdlbGxLbm93blN5bWJvbCIsIndpdGhvdXRTZXR0ZXIiLCIkaW5kZXhPZiIsImFycmF5TWV0aG9kSXNTdHJpY3QiLCJuYXRpdmVJbmRleE9mIiwiTkVHQVRJVkVfWkVSTyIsInNlYXJjaEVsZW1lbnQiLCJhZGRUb1Vuc2NvcGFibGVzIiwiZGVmaW5lSXRlcmF0b3IiLCJjcmVhdGVJdGVyUmVzdWx0T2JqZWN0IiwiQVJSQVlfSVRFUkFUT1IiLCJzZXRJbnRlcm5hbFN0YXRlIiwiaXRlcmF0ZWQiLCJBcmd1bWVudHMiLCIkcmVkdWNlIiwiQ0hST01FX1ZFUlNJT04iLCJyZWR1Y2UiLCJuYXRpdmVSZXZlcnNlIiwicmV2ZXJzZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlIiwicGVyZm9ybSIsIml0ZXJhdGUiLCJjYXBhYmlsaXR5IiwiJHByb21pc2VSZXNvbHZlIiwicmVtYWluaW5nIiwiYWxyZWFkeUNhbGxlZCIsInJlYWwiLCJvblJlamVjdGVkIiwiSW50ZXJuYWwiLCJPd25Qcm9taXNlQ2FwYWJpbGl0eSIsIm5hdGl2ZVRoZW4iLCJzZXRTcGVjaWVzIiwiYW5JbnN0YW5jZSIsInNwZWNpZXNDb25zdHJ1Y3RvciIsInRhc2siLCJob3N0UmVwb3J0RXJyb3JzIiwiUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uIiwiUFJPTUlTRSIsIk5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HIiwiZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUiLCJQcm9taXNlQ29uc3RydWN0b3IiLCJQcm9taXNlUHJvdG90eXBlIiwibmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5IiwiRElTUEFUQ0hfRVZFTlQiLCJjcmVhdGVFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJVTkhBTkRMRURfUkVKRUNUSU9OIiwiaXNUaGVuYWJsZSIsImNhbGxSZWFjdGlvbiIsInJlYWN0aW9uIiwiZXhpdGVkIiwiZmFpbCIsInJlamVjdGlvbiIsIm9uSGFuZGxlVW5oYW5kbGVkIiwiaXNSZWplY3QiLCJub3RpZmllZCIsInJlYWN0aW9ucyIsIm9uVW5oYW5kbGVkIiwicmVhc29uIiwiaW5pdEV2ZW50IiwiaXNVbmhhbmRsZWQiLCJlbWl0IiwidW53cmFwIiwiaW50ZXJuYWxSZWplY3QiLCJpbnRlcm5hbFJlc29sdmUiLCJ3cmFwcGVyIiwiZXhlY3V0b3IiLCJvbkZ1bGZpbGxlZCIsIlByb21pc2VXcmFwcGVyIiwid3JhcCIsInJhY2UiLCJjYXBhYmlsaXR5UmVqZWN0IiwicHJvbWlzZVJlc29sdmUiLCJQcm9taXNlQ29uc3RydWN0b3JXcmFwcGVyIiwiQ0hFQ0tfV1JBUFBFUiIsIiR0b1N0cmluZyIsImdldFJlZ0V4cEZsYWdzIiwiVE9fU1RSSU5HIiwibmF0aXZlVG9TdHJpbmciLCJOT1RfR0VORVJJQyIsIklOQ09SUkVDVF9OQU1FIiwibm90QVJlZ0V4cCIsImNvcnJlY3RJc1JlZ0V4cExvZ2ljIiwiQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMiLCJlbmRzV2l0aCIsInNlYXJjaFN0cmluZyIsImVuZFBvc2l0aW9uIiwic2VhcmNoIiwic3RyaW5nSW5kZXhPZiIsImZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljIiwiYWR2YW5jZVN0cmluZ0luZGV4IiwicmVnRXhwRXhlYyIsIm5hdGl2ZU1hdGNoIiwibWF5YmVDYWxsTmF0aXZlIiwibWF0Y2hlciIsInJ4IiwicmVzIiwiZnVsbFVuaWNvZGUiLCJBIiwibWF0Y2hTdHIiLCJnZXRTdWJzdGl0dXRpb24iLCJSRVBMQUNFIiwiUkVQTEFDRV9LRUVQU18kMCIsIlJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFIiwiXyIsIlVOU0FGRV9TVUJTVElUVVRFIiwic2VhcmNoVmFsdWUiLCJyZXBsYWNlVmFsdWUiLCJyZXBsYWNlciIsImZ1bmN0aW9uYWxSZXBsYWNlIiwicmVzdWx0cyIsImFjY3VtdWxhdGVkUmVzdWx0IiwibmV4dFNvdXJjZVBvc2l0aW9uIiwicmVwbGFjZXJBcmdzIiwiU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDIiwib3JpZ2luYWxFeGVjIiwiQlVHR1kiLCJTUExJVCIsIm5hdGl2ZVNwbGl0IiwiaW50ZXJuYWxTcGxpdCIsInNlcGFyYXRvciIsImxpbWl0Iiwic3BsaXR0ZXIiLCJ1bmljb2RlTWF0Y2hpbmciLCJsaW0iLCJwIiwicSIsInoiLCJzdGFydHNXaXRoIiwiJHRyaW0iLCJmb3JjZWRTdHJpbmdUcmltTWV0aG9kIiwiRE9NSXRlcmFibGVzIiwiQXJyYXlJdGVyYXRvck1ldGhvZHMiLCJBcnJheVZhbHVlcyIsImhhbmRsZVByb3RvdHlwZSIsIkNvbGxlY3Rpb25Qcm90b3R5cGUiLCJDT0xMRUNUSU9OX05BTUUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJ0IiwibyIsImMiLCJ1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfbmV4dCIsIl90aHJvdyIsIl9kZWZpbmVQcm9wZXJ0eSIsImNvcyIsInNpbiIsIkVycm9yIiwiUEkiLCJsQXJjRmxhZyIsInN3ZWVwRmxhZyIsInJYIiwiclkiLCJzIiwieSIsImFicyIsImgiLCJ4Um90IiwicG93Iiwic3FydCIsImwiLCJUIiwidiIsImNYIiwiY1kiLCJwaGkxIiwiYXRhbjIiLCJwaGkyIiwicmVsYXRpdmUiLCJ4MSIsInkxIiwieDIiLCJ5MiIsIk5hTiIsIlNNT09USF9DVVJWRV9UTyIsIkNVUlZFX1RPIiwiU01PT1RIX1FVQURfVE8iLCJRVUFEX1RPIiwiTU9WRV9UTyIsIkNMT1NFX1BBVEgiLCJIT1JJWl9MSU5FX1RPIiwiTElORV9UTyIsIlZFUlRfTElORV9UTyIsIk4iLCJkIiwiRSIsIk0iLCJJIiwiTCIsIlJPVU5EIiwiVE9fQUJTIiwiVE9fUkVMIiwiTk9STUFMSVpFX0hWWiIsIkFSQyIsIk5PUk1BTElaRV9TVCIsIlFUX1RPX0MiLCJJTkZPIiwiU0FOSVRJWkUiLCJMSU5FX0NPTU1BTkRTIiwiTUFUUklYIiwiUk9UQVRFIiwiVFJBTlNMQVRFIiwiU0NBTEUiLCJTS0VXX1giLCJhdGFuIiwiU0tFV19ZIiwiWF9BWElTX1NZTU1FVFJZIiwiWV9BWElTX1NZTU1FVFJZIiwiQV9UT19DIiwiSCIsIkFOTk9UQVRFX0FSQ1MiLCJDTE9ORSIsIkNBTENVTEFURV9CT1VORFMiLCJtYXhYIiwibWluWCIsIm1heFkiLCJtaW5ZIiwiRFJBV0lOR19DT01NQU5EUyIsInciLCJtYXAiLCJVIiwidHJhbnNmb3JtIiwidG9BYnMiLCJ0b1JlbCIsIm5vcm1hbGl6ZUhWWiIsIm5vcm1hbGl6ZVNUIiwicXRUb0MiLCJhVG9DIiwic2FuaXRpemUiLCJ0cmFuc2xhdGUiLCJzY2FsZSIsInJvdGF0ZSIsIm1hdHJpeCIsInNrZXdYIiwic2tld1kiLCJ4U3ltbWV0cnkiLCJ5U3ltbWV0cnkiLCJhbm5vdGF0ZUFyY3MiLCJjdXJOdW1iZXIiLCJjdXJDb21tYW5kVHlwZSIsImN1ckNvbW1hbmRSZWxhdGl2ZSIsImNhblBhcnNlQ29tbWFuZE9yQ29tbWEiLCJjdXJOdW1iZXJIYXNFeHAiLCJjdXJOdW1iZXJIYXNFeHBEaWdpdHMiLCJjdXJOdW1iZXJIYXNEZWNpbWFsIiwiY3VyQXJncyIsImZpbmlzaCIsInBhcnNlIiwiU3ludGF4RXJyb3IiLCJOdW1iZXIiLCJjb21tYW5kcyIsImVuY29kZSIsImdldEJvdW5kcyIsIl90eXBlb2YiLCJtdWxUYWJsZSIsInNoZ1RhYmxlIiwicHJvY2Vzc0NhbnZhc1JHQkEiLCJjYW52YXMiLCJ0b3BYIiwidG9wWSIsIndpZHRoIiwiaGVpZ2h0IiwicmFkaXVzIiwiaW1hZ2VEYXRhIiwiZ2V0RWxlbWVudEJ5SWQiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEltYWdlRGF0YSIsImdldEltYWdlRGF0YUZyb21DYW52YXMiLCJzdGFja0VuZCIsInBpeGVscyIsImRpdiIsIndpZHRoTWludXMxIiwiaGVpZ2h0TWludXMxIiwicmFkaXVzUGx1czEiLCJzdW1GYWN0b3IiLCJzdGFja1N0YXJ0IiwiQmx1clN0YWNrIiwic3RhY2siLCJzdGFja0luIiwic3RhY2tPdXQiLCJ5dyIsInlpIiwibXVsU3VtIiwic2hnU3VtIiwicHIiLCJwZyIsInBiIiwicGEiLCJfaSIsInJJblN1bSIsImdJblN1bSIsImJJblN1bSIsImFJblN1bSIsInJPdXRTdW0iLCJnT3V0U3VtIiwiYk91dFN1bSIsImFPdXRTdW0iLCJyU3VtIiwiZ1N1bSIsImJTdW0iLCJhU3VtIiwiX2kyIiwicmJzIiwicGFJbml0aWFsIiwiX2EyIiwiX3AiLCJfc3RhY2tPdXQiLCJfciIsIl9nIiwiX2IiLCJfYSIsIl94IiwiX3ByIiwiX3BnIiwiX3BiIiwiX3BhIiwiX3JPdXRTdW0iLCJfZ091dFN1bSIsIl9iT3V0U3VtIiwiX2FPdXRTdW0iLCJfclN1bSIsIl9nU3VtIiwiX2JTdW0iLCJfYVN1bSIsIl9pMyIsInlwIiwiX2dJblN1bSIsIl9iSW5TdW0iLCJfYUluU3VtIiwiX3JJblN1bSIsIl9pNCIsIl9yYnMiLCJfeSIsIl9wMiIsInByb2Nlc3NJbWFnZURhdGFSR0JBIiwicHV0SW1hZ2VEYXRhIiwiaW5zdGFuY2UiLCJfY2xhc3NDYWxsQ2hlY2siLCJmcmVlemUiLCJvZmZzY3JlZW4iLCJET01QYXJzZXIiLCJET01QYXJzZXJGYWxsYmFjayIsInByZXNldCIsImlnbm9yZUFuaW1hdGlvbiIsImlnbm9yZU1vdXNlIiwiY3JlYXRlQ2FudmFzIiwiT2Zmc2NyZWVuQ2FudmFzIiwiY3JlYXRlSW1hZ2UiLCJ1cmwiLCJyZXNwb25zZSIsImZldGNoIiwiYmxvYiIsImNyZWF0ZUltYWdlQml0bWFwIiwiZGVsZXRlUHJvcGVydHkiLCJfcmVmIiwibG9hZEltYWdlIiwiY29tcHJlc3NTcGFjZXMiLCJ0cmltTGVmdCIsInRyaW1SaWdodCIsInRvTnVtYmVycyIsImFsbFVwcGVyY2FzZSIsIm5vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUiLCJwYXJzZUV4dGVybmFsVXJsIiwidXJsTWF0Y2giLCJub3JtYWxpemVDb2xvciIsImNvbG9yIiwicmdiUGFydHMiLCJudW0iLCJpc0Zsb2F0IiwiYXR0cmlidXRlUmVnZXgiLCJpZFJlZ2V4IiwiY2xhc3NSZWdleCIsInBzZXVkb0VsZW1lbnRSZWdleCIsInBzZXVkb0NsYXNzV2l0aEJyYWNrZXRzUmVnZXgiLCJwc2V1ZG9DbGFzc1JlZ2V4IiwiZWxlbWVudFJlZ2V4IiwiZmluZFNlbGVjdG9yTWF0Y2giLCJzZWxlY3RvciIsInJlZ2V4IiwibWF0Y2hlcyIsImdldFNlbGVjdG9yU3BlY2lmaWNpdHkiLCJzcGVjaWZpY2l0eSIsImN1cnJlbnRTZWxlY3RvciIsImRlbHRhIiwiUFNFVURPX1pFUk8iLCJ2ZWN0b3JNYWduaXR1ZGUiLCJ2ZWN0b3JzUmF0aW8iLCJ2ZWN0b3JzQW5nbGUiLCJhY29zIiwiQ0IxIiwiQ0IyIiwiQ0IzIiwiQ0I0IiwiUUIxIiwiUUIyIiwiUUIzIiwiUHJvcGVydHkiLCJpc05vcm1hbGl6ZWRDb2xvciIsImVtcHR5IiwiZ2V0U3RyaW5nIiwiaGFzVmFsdWUiLCJ6ZXJvSXNWYWx1ZSIsImlzU3RyaW5nIiwiaXNVcmxEZWZpbml0aW9uIiwiaXNQaXhlbHMiLCJhc1N0cmluZyIsInNldFZhbHVlIiwiZ2V0VmFsdWUiLCJkZWYiLCJnZXROdW1iZXIiLCJnZXRDb2xvciIsImdldERwaSIsImdldFJlbSIsInJvb3RFbVNpemUiLCJnZXRFbSIsImVtU2l6ZSIsImdldFVuaXRzIiwiZ2V0UGl4ZWxzIiwiYXhpc09ySXNGb250U2l6ZSIsInByb2Nlc3NQZXJjZW50IiwiYXhpcyIsImlzRm9udFNpemUiLCJ2aWV3UG9ydCIsInNjcmVlbiIsImNvbXB1dGVTaXplIiwiZ2V0TWlsbGlzZWNvbmRzIiwiZ2V0UmFkaWFucyIsImdldERlZmluaXRpb24iLCJkZWZpbml0aW9ucyIsImdldEZpbGxTdHlsZURlZmluaXRpb24iLCJlbGVtZW50Iiwib3BhY2l0eSIsImNyZWF0ZUdyYWRpZW50IiwiY3R4IiwiY3JlYXRlUGF0dGVybiIsImdldEhyZWZBdHRyaWJ1dGUiLCJwYXR0ZXJuVHJhbnNmb3JtIiwiZ2V0QXR0cmlidXRlIiwiZ2V0VGV4dEJhc2VsaW5lIiwidGV4dEJhc2VsaW5lTWFwcGluZyIsImFkZE9wYWNpdHkiLCJjb21tYXMiLCJWaWV3UG9ydCIsInZpZXdQb3J0cyIsInNldEN1cnJlbnQiLCJyZW1vdmVDdXJyZW50IiwicG9wIiwiZ2V0Q3VycmVudCIsIlBvaW50IiwicG9pbnQiLCJkZWZhdWx0VmFsdWUiLCJwYXJzZVNjYWxlIiwicGFyc2VQYXRoIiwicGF0aCIsInBvaW50cyIsInBhdGhQb2ludHMiLCJhbmdsZVRvIiwiYXBwbHlUcmFuc2Zvcm0iLCJ4cCIsIk1vdXNlIiwid29ya2luZyIsImV2ZW50cyIsImV2ZW50RWxlbWVudHMiLCJvbkNsaWNrIiwib25Nb3VzZU1vdmUiLCJpc1dvcmtpbmciLCJvbmNsaWNrIiwib25tb3VzZW1vdmUiLCJoYXNFdmVudHMiLCJydW5FdmVudHMiLCJjdXJzb3IiLCJmb3JFYWNoIiwiY2hlY2tQYXRoIiwiX3JlZjIiLCJpc1BvaW50SW5QYXRoIiwiY2hlY2tCb3VuZGluZ0JveCIsImJvdW5kaW5nQm94IiwiX3JlZjMiLCJpc1BvaW50SW5Cb3giLCJtYXBYWSIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJvZmZzZXRQYXJlbnQiLCJzY3JvbGxYIiwic2Nyb2xsWSIsImNsaWVudFgiLCJjbGllbnRZIiwiZXZlbnRUYXJnZXQiLCJkZWZhdWx0V2luZG93IiwiZGVmYXVsdEZldGNoJDEiLCJTY3JlZW4iLCJGUkFNRVJBVEUiLCJNQVhfVklSVFVBTF9QSVhFTFMiLCJDTElFTlRfV0lEVEgiLCJDTElFTlRfSEVJR0hUIiwibW91c2UiLCJhbmltYXRpb25zIiwid2FpdHMiLCJpc1JlYWR5TG9jayIsImlzRmlyc3RSZW5kZXIiLCJpbnRlcnZhbElkIiwid2FpdCIsImNoZWNrZXIiLCJyZWFkeSIsInJlYWR5UHJvbWlzZSIsImlzUmVhZHkiLCJldmVyeSIsInJlc29sdmVSZWFkeSIsInNldERlZmF1bHRzIiwic3Ryb2tlU3R5bGUiLCJsaW5lQ2FwIiwibGluZUpvaW4iLCJtaXRlckxpbWl0Iiwic2V0Vmlld0JveCIsImFzcGVjdFJhdGlvIiwiZGVzaXJlZFdpZHRoIiwiZGVzaXJlZEhlaWdodCIsInJlZlgiLCJyZWZZIiwiY2xpcCIsImNsaXBYIiwiY2xpcFkiLCJjbGVhbkFzcGVjdFJhdGlvIiwiYXNwZWN0UmF0aW9BbGlnbiIsImFzcGVjdFJhdGlvTWVldE9yU2xpY2UiLCJhbGlnbiIsIm1lZXRPclNsaWNlIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVNaW4iLCJzY2FsZU1heCIsImZpbmFsRGVzaXJlZFdpZHRoIiwiZmluYWxEZXNpcmVkSGVpZ2h0IiwicmVmWFByb3AiLCJyZWZZUHJvcCIsImhhc1JlZnMiLCJzY2FsZWRDbGlwWCIsInNjYWxlZENsaXBZIiwiYmVnaW5QYXRoIiwibW92ZVRvIiwibGluZVRvIiwiY2xvc2VQYXRoIiwiaXNNZWV0TWluWSIsImlzU2xpY2VNYXhZIiwiaXNNZWV0TWluWCIsImlzU2xpY2VNYXhYIiwiZW5hYmxlUmVkcmF3IiwiaWdub3JlRGltZW5zaW9ucyIsImlnbm9yZUNsZWFyIiwiZm9yY2VSZWRyYXciLCJzY2FsZVdpZHRoIiwic2NhbGVIZWlnaHQiLCJvZmZzZXRYIiwib2Zmc2V0WSIsInJlbmRlciIsInRpY2siLCJzaG91bGRVcGRhdGUiLCJhbmltYXRpb24iLCJ1cGRhdGUiLCJ3aWR0aFN0eWxlIiwiZ2V0U3R5bGUiLCJoZWlnaHRTdHlsZSIsImNXaWR0aCIsImNsaWVudFdpZHRoIiwiY0hlaWdodCIsImNsaWVudEhlaWdodCIsInZpZXdCb3giLCJ4UmF0aW8iLCJ5UmF0aW8iLCJfd2lkdGhTdHlsZSIsIl9oZWlnaHRTdHlsZSIsInRyYW5zZm9ybVN0eWxlIiwiY2xlYXJSZWN0IiwiZGVmYXVsdEZldGNoIiwiRGVmYXVsdERPTVBhcnNlciIsIlBhcnNlciIsInJlc291cmNlIiwiX3RoaXMiLCJwYXJzZUZyb21TdHJpbmciLCJsb2FkIiwicGFyc2VyIiwiY2hlY2tEb2N1bWVudCIsImVyciIsInBhcnNlckVycm9yIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ0ZXh0Q29udGVudCIsIl90aGlzMiIsInRleHQiLCJUcmFuc2xhdGUiLCJ1bmFwcGx5IiwiYXBwbHlUb1BvaW50IiwiUm90YXRlIiwidHJhbnNmb3JtT3JpZ2luIiwiYW5nbGUiLCJvcmlnaW5YIiwib3JpZ2luWSIsImN4IiwiY3kiLCJudW1iZXJzIiwidHgiLCJ0eSIsInJhZCIsIlNjYWxlIiwic2NhbGVTaXplIiwiTWF0cml4IiwiZGV0IiwiU2tldyIsInNrZXciLCJzdXBlciIsIlNrZXdYIiwiU2tld1kiLCJUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zIiwicGFyc2VUcmFuc2Zvcm1zIiwicGFyc2VUcmFuc2Zvcm0iLCJUcmFuc2Zvcm1UeXBlIiwidHJhbnNmb3JtVHlwZXMiLCJmcm9tRWxlbWVudCIsInRyYW5zZm9ybU9yaWdpblhQcm9wZXJ0eSIsInRyYW5zZm9ybU9yaWdpbllQcm9wZXJ0eSIsIkVsZW1lbnQiLCJjYXB0dXJlVGV4dE5vZGVzIiwiYXR0cmlidXRlcyIsInN0eWxlcyIsInN0eWxlc1NwZWNpZmljaXR5IiwiYW5pbWF0aW9uRnJvemVuIiwiYW5pbWF0aW9uRnJvemVuVmFsdWUiLCJjaGlsZHJlbiIsIm5vZGVUeXBlIiwiYXR0cmlidXRlIiwibm9kZU5hbWUiLCJhZGRTdHlsZXNGcm9tU3R5bGVEZWZpbml0aW9uIiwiY2hpbGROb2RlcyIsImNoaWxkTm9kZSIsImFkZENoaWxkIiwidGV4dE5vZGUiLCJnZXRUZXh0IiwiY3JlYXRlSWZOb3RFeGlzdHMiLCJhdHRyIiwiX2F0dHIiLCJza2lwQW5jZXN0b3JzIiwicGFyZW50U3R5bGUiLCJfc3R5bGUiLCJzYXZlIiwibWFzayIsImFwcGx5RWZmZWN0cyIsImZpbHRlciIsInNldENvbnRleHQiLCJyZW5kZXJDaGlsZHJlbiIsImNsZWFyQ29udGV4dCIsInJlc3RvcmUiLCJjbGlwUGF0aFN0eWxlUHJvcCIsImNoaWxkIiwiaWdub3JlQ2hpbGRUeXBlcyIsIm1hdGNoZXNTZWxlY3RvciIsIl9ub2RlJGdldEF0dHJpYnV0ZSIsInN0eWxlQ2xhc3NlcyIsInNvbWUiLCJzdHlsZUNsYXNzIiwiZXhpc3RpbmdTcGVjaWZpY2l0eSIsInJlbW92ZVN0eWxlcyIsImlnbm9yZVN0eWxlcyIsInRvUmVzdG9yZSIsInN0eWxlUHJvcCIsInJlc3RvcmVTdHlsZXMiLCJpc0ZpcnN0Q2hpbGQiLCJfdGhpcyRwYXJlbnQiLCJVbmtub3duRWxlbWVudCIsIndyYXBGb250RmFtaWx5IiwiZm9udEZhbWlseSIsInRyaW1tZWQiLCJwcmVwYXJlRm9udFN0eWxlIiwiZm9udFN0eWxlIiwidGFyZ2V0Rm9udFN0eWxlIiwicHJlcGFyZUZvbnRXZWlnaHQiLCJmb250V2VpZ2h0IiwidGFyZ2V0Rm9udFdlaWdodCIsIkZvbnQiLCJmb250VmFyaWFudCIsImZvbnRTaXplIiwiaW5oZXJpdCIsImluaGVyaXRGb250IiwicGFydHMiLCJwYXJ0IiwidmFyaWFudHMiLCJ3ZWlnaHRzIiwiQm91bmRpbmdCb3giLCJhZGRQb2ludCIsImFkZFgiLCJhZGRZIiwiYWRkQm91bmRpbmdCb3giLCJzdW1DdWJpYyIsInAwIiwicDEiLCJwMiIsInAzIiwiYmV6aWVyQ3VydmVBZGQiLCJmb3JYIiwiYjJhYyIsInQxIiwidDIiLCJhZGRCZXppZXJDdXJ2ZSIsInAweCIsInAweSIsInAxeCIsInAxeSIsInAyeCIsInAyeSIsInAzeCIsInAzeSIsImFkZFF1YWRyYXRpY0N1cnZlIiwiY3AxeCIsImNwMXkiLCJjcDJ4IiwiY3AyeSIsIlBhdGhQYXJzZXIiLCJjb250cm9sIiwiY29tbWFuZCIsInByZXZpb3VzQ29tbWFuZCIsImFuZ2xlcyIsInJlc2V0IiwiaXNFbmQiLCJnZXRQb2ludCIsInhQcm9wIiwieVByb3AiLCJtYWtlQWJzb2x1dGUiLCJnZXRBc0NvbnRyb2xQb2ludCIsImdldEFzQ3VycmVudFBvaW50IiwiZ2V0UmVmbGVjdGVkQ29udHJvbFBvaW50Iiwib3giLCJveSIsImFkZE1hcmtlciIsInByaW9yVG8iLCJhZGRNYXJrZXJBbmdsZSIsImdldE1hcmtlclBvaW50cyIsImdldE1hcmtlckFuZ2xlcyIsIlJlbmRlcmVkRWxlbWVudCIsIm1vZGlmaWVkRW1TaXplU3RhY2siLCJjYWxjdWxhdGVPcGFjaXR5Iiwib3BhY2l0eVN0eWxlIiwiZnJvbU1lYXN1cmUiLCJmaWxsU3R5bGVQcm9wIiwiZmlsbE9wYWNpdHlTdHlsZVByb3AiLCJzdHJva2VTdHlsZVByb3AiLCJzdHJva2VPcGFjaXR5UHJvcCIsImZpbGxTdHlsZSIsIl9maWxsU3R5bGUiLCJfZmlsbFN0eWxlMiIsIl9zdHJva2VTdHlsZSIsIl9zdHJva2VTdHlsZTIiLCJzdHJva2VXaWR0aFN0eWxlUHJvcCIsIm5ld0xpbmVXaWR0aCIsImxpbmVXaWR0aCIsInN0cm9rZUxpbmVjYXBTdHlsZVByb3AiLCJzdHJva2VMaW5lam9pblN0eWxlUHJvcCIsInN0cm9rZU1pdGVybGltaXRQcm9wIiwic3Ryb2tlRGFzaGFycmF5U3R5bGVQcm9wIiwic3Ryb2tlRGFzaG9mZnNldFByb3AiLCJnYXBzIiwic2V0TGluZURhc2giLCJ3ZWJraXRMaW5lRGFzaCIsIm1vekRhc2giLCJvZmZzZXQiLCJsaW5lRGFzaE9mZnNldCIsIndlYmtpdExpbmVEYXNoT2Zmc2V0IiwibW96RGFzaE9mZnNldCIsImZvbnQiLCJmb250U3R5bGVQcm9wIiwiZm9udFN0eWxlU3R5bGVQcm9wIiwiZm9udFZhcmlhbnRTdHlsZVByb3AiLCJmb250V2VpZ2h0U3R5bGVQcm9wIiwiZm9udFNpemVTdHlsZVByb3AiLCJmb250RmFtaWx5U3R5bGVQcm9wIiwiZ2xvYmFsQWxwaGEiLCJwb3BFbVNpemUiLCJQYXRoRWxlbWVudCIsInBhdGhQYXJzZXIiLCJwYXRoTSIsInBhdGhMIiwicGF0aEgiLCJwYXRoViIsInBhdGhDIiwicGF0aFMiLCJwYXRoUSIsInBhdGhUIiwicGF0aEEiLCJwYXRoWiIsImdldEJvdW5kaW5nQm94IiwiZ2V0TWFya2VycyIsIm1hcmtlcnMiLCJmaWxsUnVsZVN0eWxlUHJvcCIsImZpbGwiLCJzZXRUcmFuc2Zvcm0iLCJzdHJva2UiLCJtYXJrZXJzTGFzdEluZGV4IiwibWFya2VyU3RhcnRTdHlsZVByb3AiLCJtYXJrZXJNaWRTdHlsZVByb3AiLCJtYXJrZXJFbmRTdHlsZVByb3AiLCJtYXJrZXIiLCJfbWFya2VyIiwiX3BvaW50IiwiX2FuZ2xlIiwiX21hcmtlcjIiLCJfcG9pbnQyIiwiX2FuZ2xlMiIsImNvbnRyb2xQb2ludCIsImN1cnJlbnRQb2ludCIsImJlemllckN1cnZlVG8iLCJxdWFkcmF0aWNDdXJ2ZVRvIiwieEF4aXNSb3RhdGlvbiIsImN1cnJwIiwiY3BwIiwiY2VudHAiLCJhMSIsImFkIiwiZGlyIiwiYWgiLCJoYWxmV2F5Iiwic3giLCJzeSIsImFyYyIsIkJvb2xlYW4iLCJHbHlwaEVsZW1lbnQiLCJob3JpekFkdlgiLCJhcmFiaWNGb3JtIiwiVGV4dEVsZW1lbnQiLCJtZWFzdXJlQ2FjaGUiLCJ0ZXh0QmFzZWxpbmUiLCJpbml0aWFsaXplQ29vcmRpbmF0ZXMiLCJsZWFmVGV4dHMiLCJ0ZXh0Q2h1bmtTdGFydCIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJnZXRURWxlbWVudEJvdW5kaW5nQm94IiwiYWRqdXN0Q2hpbGRDb29yZGluYXRlc1JlY3Vyc2l2ZSIsImNoaWxkQm91bmRpbmdCb3giLCJnZXRDaGlsZEJvdW5kaW5nQm94IiwiZ2V0Rm9udFNpemUiLCJpbmhlcml0Rm9udFNpemUiLCJtZWFzdXJlVGV4dCIsImdldEdseXBoIiwiY2hhciIsImdseXBoIiwiaXNBcmFiaWMiLCJwcmV2Q2hhciIsIm5leHRDaGFyIiwiZ2x5cGhzIiwibWF5YmVHbHlwaCIsIm1pc3NpbmdHbHlwaCIsImdldFRleHRGcm9tTm9kZSIsInBhcmVudE5vZGUiLCJyZW5kZXJDaGlsZCIsInJlbmRlclRFbGVtZW50Q2hpbGRyZW4iLCJyZW5kZXJUZXh0IiwiY3VzdG9tRm9udCIsInVuaXRzUGVyRW0iLCJmb250RmFjZSIsImN0eEZvbnQiLCJpc1JUTCIsImR4IiwibHciLCJmaWxsVGV4dCIsInN0cm9rZVRleHQiLCJhcHBseUFuY2hvcmluZyIsInNoaWZ0IiwiZmlyc3RFbGVtZW50IiwidGV4dEFuY2hvciIsImFkanVzdENoaWxkQ29vcmRpbmF0ZXNSZWN1cnNpdmVDb3JlIiwidGV4dFBhcmVudCIsImFkanVzdENoaWxkQ29vcmRpbmF0ZXMiLCJ4QXR0ciIsInlBdHRyIiwiZHhBdHRyIiwiZHlBdHRyIiwiZ2V0SW5oZXJpdGVkQXR0cmlidXRlIiwibWVhc3VyZSIsIm1lYXN1cmVUYXJnZXRUZXh0IiwidGFyZ2V0VGV4dCIsIl9tZWFzdXJlIiwicGFyZW50QXR0ciIsIlRTcGFuRWxlbWVudCIsIlRleHROb2RlIiwiU1ZHRWxlbWVudCIsIl90aGlzJG5vZGUkcGFyZW50Tm9kZSIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQcm9wZXJ0eVZhbHVlIiwiZm9udFNpemVQcm9wIiwicmVmWEF0dHIiLCJyZWZZQXR0ciIsInZpZXdCb3hBdHRyIiwicmVzaXplIiwicHJlc2VydmVBc3BlY3RSYXRpbyIsIndpZHRoQXR0ciIsImhlaWdodEF0dHIiLCJzdHlsZUF0dHIiLCJvcmlnaW5XaWR0aCIsIm9yaWdpbkhlaWdodCIsInByZXNlcnZlQXNwZWN0UmF0aW9BdHRyIiwiUmVjdEVsZW1lbnQiLCJyeEF0dHIiLCJyeUF0dHIiLCJyeSIsIktBUFBBIiwiQ2lyY2xlRWxlbWVudCIsIkVsbGlwc2VFbGVtZW50IiwiTGluZUVsZW1lbnQiLCJnZXRQb2ludHMiLCJ4MCIsInkwIiwiUG9seWxpbmVFbGVtZW50IiwiUG9seWdvbkVsZW1lbnQiLCJQYXR0ZXJuRWxlbWVudCIsInBhcmVudE9wYWNpdHlQcm9wIiwicGF0dGVyblN2ZyIsInBhdHRlcm5DYW52YXMiLCJwYXR0ZXJuQ3R4IiwiTWFya2VyRWxlbWVudCIsIm9yaWVudCIsIm1hcmtlclVuaXRzIiwibWFya2VyU3ZnIiwib3ZlcmZsb3ciLCJEZWZzRWxlbWVudCIsIkdFbGVtZW50IiwiR3JhZGllbnRFbGVtZW50IiwiYXR0cmlidXRlc1RvSW5oZXJpdCIsInN0b3BzIiwiZ2V0R3JhZGllbnRVbml0cyIsInN0b3BzQ29udGFpbmVyIiwiaW5oZXJpdFN0b3BDb250YWluZXIiLCJncmFkaWVudCIsImdldEdyYWRpZW50IiwiYWRkUGFyZW50T3BhY2l0eSIsImFkZENvbG9yU3RvcCIsInJvb3RWaWV3IiwicmVjdCIsImF0dHJpYnV0ZVRvSW5oZXJpdCIsIkxpbmVhckdyYWRpZW50RWxlbWVudCIsImlzQm91bmRpbmdCb3hVbml0cyIsImNyZWF0ZUxpbmVhckdyYWRpZW50IiwiUmFkaWFsR3JhZGllbnRFbGVtZW50IiwiZngiLCJmeSIsImZyIiwiY3JlYXRlUmFkaWFsR3JhZGllbnQiLCJTdG9wRWxlbWVudCIsInN0b3BPcGFjaXR5Iiwic3RvcENvbG9yIiwiQW5pbWF0ZUVsZW1lbnQiLCJkdXJhdGlvbiIsImluaXRpYWxWYWx1ZSIsImluaXRpYWxVbml0cyIsInJlbW92ZWQiLCJmcm96ZW4iLCJiZWdpbiIsIm1heER1cmF0aW9uIiwidG8iLCJ2YWx1ZXNBdHRyIiwiZ2V0UHJvcGVydHkiLCJhdHRyaWJ1dGVUeXBlIiwiYXR0cmlidXRlTmFtZSIsImNhbGNWYWx1ZSIsInByb2dyZXNzIiwiZ2V0UHJvZ3Jlc3MiLCJuZXdWYWx1ZSIsInByb3AiLCJ1cGRhdGVkIiwidHlwZUF0dHIiLCJsYiIsInViIiwiQW5pbWF0ZUNvbG9yRWxlbWVudCIsImNvbG9yRnJvbSIsImNvbG9yVG8iLCJBbmltYXRlVHJhbnNmb3JtRWxlbWVudCIsInRyYW5zZm9ybUZyb20iLCJ0cmFuc2Zvcm1UbyIsIkZvbnRFbGVtZW50IiwiZm9udEZhbWlseVN0eWxlIiwiRm9udEZhY2VFbGVtZW50IiwiYXNjZW50IiwiZGVzY2VudCIsIk1pc3NpbmdHbHlwaEVsZW1lbnQiLCJUUmVmRWxlbWVudCIsImZpcnN0Q2hpbGQiLCJBRWxlbWVudCIsImhhc1RleHQiLCJvd25LZXlzJDIiLCJlbnVtZXJhYmxlT25seSIsInN5bSIsIl9vYmplY3RTcHJlYWQkMiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJUZXh0UGF0aEVsZW1lbnQiLCJ0ZXh0V2lkdGgiLCJ0ZXh0SGVpZ2h0IiwicGF0aExlbmd0aCIsImdseXBoSW5mbyIsImxldHRlclNwYWNpbmdDYWNoZSIsIm1lYXN1cmVzQ2FjaGUiLCJNYXAiLCJwYXRoRWxlbWVudCIsImRhdGFBcnJheSIsInBhcnNlUGF0aERhdGEiLCJ0aGV0YSIsImRUaGV0YSIsInBzaSIsImZzIiwic2V0VGV4dERhdGEiLCJ0ZXh0RGVjb3JhdGlvbiIsInJvdGF0aW9uIiwicGFydGlhbFRleHQiLCJnZXRMZXR0ZXJTcGFjaW5nQXQiLCJpZHgiLCJmaW5kU2VnbWVudFRvRml0Q2hhciIsImFuY2hvciIsInRleHRGdWxsV2lkdGgiLCJmdWxsUGF0aFdpZHRoIiwic3BhY2VzTnVtYmVyIiwiaW5wdXRPZmZzZXQiLCJkeSIsImNoYXJJIiwiZ2x5cGhXaWR0aCIsInNwbGluZVN0ZXAiLCJnZXRFcXVpZGlzdGFudFBvaW50T25QYXRoIiwic2VnbWVudCIsImR5WCIsImR5WSIsImNoYXJzIiwidGhpc1NwYWNpbmciLCJwYXJlbnRTcGFjaW5nIiwibGV0dGVyU3BhY2luZyIsInRleHRMZW4iLCJkeFN1bSIsImFjYyIsImN1ciIsImdldFBhdGhMZW5ndGgiLCJzdGFydE9mZnNldCIsIm5leHRPZmZzZXQiLCJwYXRoQ29tbWFuZHMiLCJzdGFydFgiLCJzdGFydFkiLCJuZXh0Q29tbWFuZFR5cGUiLCJjYWxjTGVuZ3RoIiwiY29tbWFuZFR5cGUiLCJnZXRMaW5lTGVuZ3RoIiwiZ2V0UG9pbnRPbkN1YmljQmV6aWVyIiwiZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllciIsImluYyIsImdldFBvaW50T25FbGxpcHRpY2FsQXJjIiwiZ2V0UG9pbnRPbkxpbmUiLCJkaXN0IiwiZnJvbVgiLCJmcm9tWSIsInJpc2UiLCJwdCIsIml4IiwiaXkiLCJwUmlzZSIsInBSdW4iLCJnZXRQb2ludE9uUGF0aCIsImRpc3RhbmNlIiwiZnVsbExlbiIsImN1bXVsYXRpdmVQYXRoTGVuZ3RoIiwiY3VycmVudFQiLCJwY3QiLCJwNHgiLCJwNHkiLCJjb3NQc2kiLCJzaW5Qc2kiLCJidWlsZEVxdWlkaXN0YW50Q2FjaGUiLCJpbnB1dFN0ZXAiLCJpbnB1dFByZWNpc2lvbiIsInByZWNpc2lvbiIsImVxdWlkaXN0YW50Q2FjaGUiLCJ0YXJnZXREaXN0YW5jZSIsImRhdGFVcmlSZWdleCIsIkltYWdlRWxlbWVudCIsImxvYWRlZCIsImhyZWYiLCJpc1N2ZyIsImltYWdlcyIsImxvYWRTdmciLCJpbWFnZSIsImF0b2IiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdmciLCJzdWJEb2N1bWVudCIsImNhbnZnIiwiZm9ya1N0cmluZyIsImRvY3VtZW50RWxlbWVudCIsIl9pbWFnZSIsImNvbXBsZXRlIiwiZHJhd0ltYWdlIiwiU3ltYm9sRWxlbWVudCIsIlNWR0ZvbnRMb2FkZXIiLCJmb250cyIsImZvbnROb2RlIiwiU3R5bGVFbGVtZW50IiwiY3NzIiwiY3NzUGFydHMiLCJjc3NDbGFzc2VzIiwiY3NzUHJvcHMiLCJjc3NDbGFzcyIsImNzc1Byb3AiLCJVc2VFbGVtZW50IiwidGVtcFN2ZyIsIm9sZFBhcmVudCIsImVsZW1lbnRUcmFuc2Zvcm0iLCJjYWNoZWRFbGVtZW50IiwiaW1HZXQiLCJpbWciLCJfaGVpZ2h0IiwicmdiYSIsImltU2V0IiwibTEiLCJtMiIsIm0zIiwiRmVDb2xvck1hdHJpeEVsZW1lbnQiLCJpbmNsdWRlT3BhY2l0eSIsInNyY0RhdGEiLCJuciIsIm5nIiwibmIiLCJuYSIsIk1hc2tFbGVtZW50IiwiaWdub3JlZFN0eWxlcyIsIm1hc2tDYW52YXMiLCJtYXNrQ3R4IiwidG1wQ2FudmFzIiwidG1wQ3R4IiwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwiZmlsbFJlY3QiLCJDbGlwUGF0aEVsZW1lbnQiLCJjb250ZXh0UHJvdG8iLCJGaWx0ZXJFbGVtZW50IiwicHgiLCJweSIsImVmZCIsImV4dHJhRmlsdGVyRGlzdGFuY2UiLCJ0bXBDYW52YXNXaWR0aCIsInRtcENhbnZhc0hlaWdodCIsIkZlRHJvcFNoYWRvd0VsZW1lbnQiLCJfd2lkdGgiLCJGZU1vcnBob2xvZ3lFbGVtZW50IiwiRmVDb21wb3NpdGVFbGVtZW50IiwiRmVHYXVzc2lhbkJsdXJFbGVtZW50IiwiYmx1clJhZGl1cyIsImJvZHkiLCJnZXRVbmlxdWVJZCIsIlRpdGxlRWxlbWVudCIsIkRlc2NFbGVtZW50Iiwib3duS2V5cyQxIiwiX2NyZWF0ZUltYWdlIiwiYW5vbnltb3VzQ3Jvc3NPcmlnaW4iLCJjcm9zc09yaWdpbiIsIm9ubG9hZCIsIm9uZXJyb3IiLCJfZXZlbnQiLCJfc291cmNlIiwiX2xpbmVubyIsIl9jb2xubyIsIkRvY3VtZW50IiwiZW1TaXplU3RhY2siLCJ1bmlxdWVJZCIsImJpbmRDcmVhdGVJbWFnZSIsImlzSW1hZ2VzTG9hZGVkIiwiaXNGb250c0xvYWRlZCIsImZvcmNlQW5vbnltb3VzQ3Jvc3NPcmlnaW4iLCJjcmVhdGVEb2N1bWVudEVsZW1lbnQiLCJlbGVtZW50VHlwZSIsIkVsZW1lbnRUeXBlIiwiZWxlbWVudFR5cGVzIiwiY29uZmlnIiwiX29iamVjdFNwcmVhZCQxIiwiX29iamVjdFNwcmVhZCIsIkNhbnZnIiwiX2FyZ3VtZW50cyIsInN2Z0RvY3VtZW50IiwiZnJvbVN0cmluZyIsImZvcmsiLCJfYXJndW1lbnRzMiIsImJhc2VPcHRpb25zIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/360.bundle.js b/465.bundle.js similarity index 53% rename from 360.bundle.js rename to 465.bundle.js index 5eb8839..88ffbcc 100644 --- a/360.bundle.js +++ b/465.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[360],{360:function(e,n,c){c.r(n),c.d(n,{default:function(){return t}});var r=c(358);const u={class:"component-readme"},o={};var t=(0,c(389).A)(o,[["render",function(e,n){return(0,r.uX)(),(0,r.CE)("div",u,n[0]||(n[0]=[(0,r.Lk)("h1",null,"cleverboy 的学习笔记",-1)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYwLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sb0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQUNKLE1BRElDLEVBQ0pDLEVBQUEsS0FBQUEsRUFBQSxLQURrQ0MsRUFBQUEsRUFBQUEsSUFBd0IsVUFBcEIsbUJBQWUsSyIsInNvdXJjZXMiOlsid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi9yZWFkbWUubWQiLCJ3ZWJwYWNrOi8vY2JveS1ibG9nLy4uLy4uL2Jsb2dzL21hcmtkb3duL3JlYWRtZS5tZD8xZTYzIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXJlYWRtZVwiPjxoMT5jbGV2ZXJib3kg55qE5a2m5Lmg56yU6K6wPC9oMT5cbjwvZGl2PjwvdGVtcGxhdGU+IiwiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vcmVhZG1lLm1kP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQ4ZTllMWQ0XCJcbmNvbnN0IHNjcmlwdCA9IHt9XG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS92dWUtbG9hZGVyQDE3LjQuMl9AdnVlK2NvbXBpbGVyLXNmY0AzLjUuM192dWVAMy41LjNfdHlwZXNjcmlwdEA1LjUuNF9fd2VicGFja0A1Ljk0LjBfd2VicGFjay1fZnVxa3dnZ3BsaGV5M29pdnR3ZTJzdGRvNmUvbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdXSlcblxuZXhwb3J0IGRlZmF1bHQgX19leHBvcnRzX18iXSwibmFtZXMiOlsiY2xhc3MiLCJzY3JpcHQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2hvaXN0ZWRfMSIsIl9jYWNoZSIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[465],{465:function(e,n,c){c.r(n),c.d(n,{default:function(){return t}});var r=c(762);const u={class:"component-readme"},o={};var t=(0,c(314).A)(o,[["render",function(e,n){return(0,r.uX)(),(0,r.CE)("div",u,n[0]||(n[0]=[(0,r.Lk)("h1",null,"cleverboy 的学习笔记",-1)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY1LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sb0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQUNKLE1BRElDLEVBQ0pDLEVBQUEsS0FBQUEsRUFBQSxLQURrQ0MsRUFBQUEsRUFBQUEsSUFBd0IsVUFBcEIsbUJBQWUsSyIsInNvdXJjZXMiOlsid2VicGFjazovL2Nib3ktYmxvZy8uLi8uLi9ibG9ncy9tYXJrZG93bi9yZWFkbWUubWQiLCJ3ZWJwYWNrOi8vY2JveS1ibG9nLy4uLy4uL2Jsb2dzL21hcmtkb3duL3JlYWRtZS5tZD9lNTJmIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXJlYWRtZVwiPjxoMT5jbGV2ZXJib3kg55qE5a2m5Lmg56yU6K6wPC9oMT5cbjwvZGl2PjwvdGVtcGxhdGU+IiwiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vcmVhZG1lLm1kP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQ4ZTllMWQ0XCJcbmNvbnN0IHNjcmlwdCA9IHt9XG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS92dWUtbG9hZGVyQDE3LjQuMl9AdnVlK2NvbXBpbGVyLXNmY0AzLjUuMTJfdnVlQDMuNS4xMl90eXBlc2NyaXB0QDUuNi4zX193ZWJwYWNrQDUuOTUuMF93ZWJwYWNrLWNsaUA1LjEuNF8vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdXSlcblxuZXhwb3J0IGRlZmF1bHQgX19leHBvcnRzX18iXSwibmFtZXMiOlsiY2xhc3MiLCJzY3JpcHQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2hvaXN0ZWRfMSIsIl9jYWNoZSIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/403.bundle.js b/499.bundle.js similarity index 94% rename from 403.bundle.js rename to 499.bundle.js index 207760b..ac22d6b 100644 --- a/403.bundle.js +++ b/499.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[403],{403:function(t,e,o){o.r(e),o.d(e,{default:function(){return i}});var s=o(358);const a={class:"component-aliyun-server"},c={};var i=(0,o(389).A)(c,[["render",function(t,e){return(0,s.uX)(),(0,s.CE)("div",a,e[0]||(e[0]=[(0,s.Fv)('

购买服务器

学生购买可以使用阿里云优惠专享, 每个月只要9.9 就好了。这里我用的是学生优惠,机型内存什么都限定好了的。所以- - 没什么可以说的。关于国内外服务器的区别就是,如果你购买了国外的服务器,就可以在云服务器上搭梯子访问国外的网站,也就是翻墙了。

安装环境

因为服务器默认 linux 系统,所以这里讲怎么配置 linux 云服务环境。 我第一次使用的时候,还以为是要去安装一个界面化桌面,以便我这个命令小白可以操作。但是,对于只有2G 的内存来说安装了之后将会很卡很卡。后来我问学长,他说不要安装界面化,使用命令就好了。

首先关于远程服务器的登录, 默认系统的用户名是 root, 然后登录密码可以在控制台进行修改。如下图点击重置密码。 重置密码处

重置之后,然后点击远程连接,就可以连接登录到你的服务器上了。这里要将一点,如果你是 mac 电脑的话,可以在你的电脑上通过 ssh 登录到你的服务器。 命令如下: ssh root@你的公网IP,比如 ssh root@120.78.32.12 然后输入密码即可连接成功。

登录成功图

接下来在终端中输入命令。配置环境。如果你是配置 java 环境,那么可以去谷歌一下如何在 linux 中配置 java 环境,这里我是配置的 node 环境,就讲一下如何配置 node 环境以及 npm。

这里我用的是源码安装。首先安装 node 编译依赖的第三方模块 yum -y install gcc make gcc-c++ openssl-devel

然后下载 node 的源码包 这里写图片描述

node 官网的源码 包。 wget https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz

你下载的时候可以手动改成当前最新版本。下载后,进行解压 tar -zxvf node-v8.9.4.tar.gz, 然后进入解压后的文件夹 cd node-v8.9.4, 依次 ./configure makesudo make install 这里编译时间会有点久,请耐心等待- - 查看安装成功 这里写图片描述

安装 npm 同样下载 npm 包 wget http://nodejs.org/dist/npm/npm-1.4.9.zip 解压 tar -zxvf npm-1.4.9.tgz 查看是否安装成功 npm -v

这就是 node 环境配置了, 然后就是 mysql 数据库。 http://blog.csdn.net/win7system/article/details/53579500

关于项目的上传,如果你本地编写了代码,想上传至服务器,第一个方式,可以是使用 ftp 上传文件。 第二个方式,就是在你的服务器上搭建一个 git 服务器,通过从服务器推送和克隆项目来获取文件。这里我使用的是第二种方法,参见教程: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000 这里注意一下, 关于 设置 ssh 登录,一定要把创建的 .ssh 文件放到你创建的用户下,如我这里是 git 用户,路径就是 这里写图片描述

放置在正确位置之后,还要注意项目的归属者也要是 git 用户,这样才会在 git 用户里匹配到对应的 ssh key。也就是下面这一个步骤 这里写图片描述

还有一点要注意的就是,你再本地推送了代码上 git 服务器之后,想要在云服务器上获取到代码, 需要在服务器上再次克隆 git clone git@server:/srv/sample.git 项目,git pull 获取到代码。 这里也可以通过自己配置 git 服务器的钩子函数,使其自动更新代码,我还没配置,就先不说了 - -。

好了,现在现在基本环境配置好了就可以开始开发你的项目啦。

另外附: 项目在服务器上启动了,发现在本地电脑无法通过 ip 访问,那么可能是你的端口号没有开放,需要去服务器上设置安全组。 具体添加方法 ,以及其他一些关于服务器的配置,都可以随时点击右侧的 点我提问,像云博士提问。 = = 这里写图片描述

',19)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAzLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sMkJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQTRDSixNQTVDSUMsRUE0Q0pDLEVBQUEsS0FBQUEsRUFBQSxLQTVDTkMsRUFBQUEsRUFBQUEsSUFBQSxrcUgiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vYWxpeXVuLXNlcnZlci5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vYWxpeXVuLXNlcnZlci5tZD85M2VlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LWFsaXl1bi1zZXJ2ZXJcIj48aDM+6LSt5Lmw5pyN5Yqh5ZmoPC9oMz5cbjxwPuWtpueUn+i0reS5sOWPr+S7peS9v+eUqOmYv+mHjOS6keS8mOaDoOS4k+S6q++8jCDmr4/kuKrmnIjlj6ropoE5Ljkg5bCx5aW95LqG44CC6L+Z6YeM5oiR55So55qE5piv5a2m55Sf5LyY5oOg77yM5py65Z6L5YaF5a2Y5LuA5LmI6YO96ZmQ5a6a5aW95LqG55qE44CC5omA5LulLSAtIOayoeS7gOS5iOWPr+S7peivtOeahOOAguWFs+S6juWbveWGheWkluacjeWKoeWZqOeahOWMuuWIq+WwseaYr++8jOWmguaenOS9oOi0reS5sOS6huWbveWklueahOacjeWKoeWZqO+8jOWwseWPr+S7peWcqOS6keacjeWKoeWZqOS4iuaQreair+WtkOiuv+mXruWbveWklueahOe9keerme+8jOS5n+WwseaYr+e/u+WimeS6huOAgjwvcD5cbjxoMz7lronoo4Xnjq/looM8L2gzPlxuPHA+5Zug5Li65pyN5Yqh5Zmo6buY6K6kIGxpbnV4IOezu+e7n++8jOaJgOS7pei/memHjOiusuaAjuS5iOmFjee9riBsaW51eCDkupHmnI3liqHnjq/looPjgIJcbuaIkeesrOS4gOasoeS9v+eUqOeahOaXtuWAme+8jOi/mOS7peS4uuaYr+imgeWOu+WuieijheS4gOS4queVjOmdouWMluahjOmdou+8jOS7peS+v+aIkei/meS4quWRveS7pOWwj+eZveWPr+S7peaTjeS9nOOAguS9huaYr++8jOWvueS6juWPquaciTJHIOeahOWGheWtmOadpeivtOWuieijheS6huS5i+WQjuWwhuS8muW+iOWNoeW+iOWNoeOAguWQjuadpeaIkemXruWtpumVv++8jOS7luivtOS4jeimgeWuieijheeVjOmdouWMlu+8jOS9v+eUqOWRveS7pOWwseWlveS6huOAgjwvcD5cbjxwPummluWFiOWFs+S6jui/nOeoi+acjeWKoeWZqOeahOeZu+W9le+8jCDpu5jorqTns7vnu5/nmoTnlKjmiLflkI3mmK8gcm9vdCwg54S25ZCO55m75b2V5a+G56CB5Y+v5Lul5Zyo5o6n5Yi25Y+w6L+b6KGM5L+u5pS544CC5aaC5LiL5Zu+54K55Ye76YeN572u5a+G56CB44CCXG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzAwNTQ5MTg/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIumHjee9ruWvhueggeWkhFwiPjwvcD5cbjxwPumHjee9ruS5i+WQju+8jOeEtuWQjueCueWHu+i/nOeoi+i/nuaOpe+8jOWwseWPr+S7pei/nuaOpeeZu+W9leWIsOS9oOeahOacjeWKoeWZqOS4iuS6huOAgui/memHjOimgeWwhuS4gOeCue+8jOWmguaenOS9oOaYryBtYWMg55S16ISR55qE6K+d77yM5Y+v5Lul5Zyo5L2g55qE55S16ISR5LiK6YCa6L+HIHNzaCDnmbvlvZXliLDkvaDnmoTmnI3liqHlmajjgIIg5ZG95Luk5aaC5LiL77yaXG48Y29kZT5zc2ggcm9vdEDkvaDnmoTlhaznvZFJUDwvY29kZT7vvIzmr5TlpoIgPGNvZGU+c3NoIHJvb3RAMTIwLjc4LjMyLjEyPC9jb2RlPlxu54S25ZCO6L6T5YWl5a+G56CB5Y2z5Y+v6L+e5o6l5oiQ5Yqf44CCPC9wPlxuPHA+PGltZyBzcmM9XCJodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTgwMTA3MTcwNTAzMzMzP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3RcIiBhbHQ9XCLnmbvlvZXmiJDlip/lm75cIj48L3A+XG48cD7mjqXkuIvmnaXlnKjnu4jnq6/kuK3ovpPlhaXlkb3ku6TjgILphY3nva7njq/looPjgILlpoLmnpzkvaDmmK/phY3nva4gamF2YSDnjq/looPvvIzpgqPkuYjlj6/ku6XljrvosLfmrYzkuIDkuIvlpoLkvZXlnKggbGludXgg5Lit6YWN572uIGphdmEg546v5aKD77yM6L+Z6YeM5oiR5piv6YWN572u55qEIG5vZGUg546v5aKD77yM5bCx6K6y5LiA5LiL5aaC5L2V6YWN572uIG5vZGUg546v5aKD5Lul5Y+KIG5wbeOAgjwvcD5cbjxwPui/memHjOaIkeeUqOeahOaYr+a6kOeggeWuieijheOAgummluWFiOWuieijhSBub2RlIOe8luivkeS+nei1lueahOesrOS4ieaWueaooeWdl1xuPGNvZGU+eXVtIC15IGluc3RhbGwgZ2NjIG1ha2UgZ2NjLWMrKyBvcGVuc3NsLWRldmVsPC9jb2RlPjwvcD5cbjxwPueEtuWQjuS4i+i9vSBub2RlIOeahOa6kOeggeWMhVxuPGltZyBzcmM9XCJodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTgwMTA3MTcxMzAwMDM2P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3RcIiBhbHQ9XCLov5nph4zlhpnlm77niYfmj4/ov7BcIj48L3A+XG48cD5ub2RlIOWumOe9keeahOa6kOeggSDljIXjgIJcbjxjb2RlPndnZXQgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvdjguOS40L25vZGUtdjguOS40LnRhci5nejwvY29kZT48L3A+XG48cD7kvaDkuIvovb3nmoTml7blgJnlj6/ku6XmiYvliqjmlLnmiJDlvZPliY3mnIDmlrDniYjmnKzjgILkuIvovb3lkI7vvIzov5vooYzop6PljosgPGNvZGU+dGFyIC16eHZmIG5vZGUtdjguOS40LnRhci5nejwvY29kZT4sIOeEtuWQjui/m+WFpeino+WOi+WQjueahOaWh+S7tuWkuSA8Y29kZT4gY2Qgbm9kZS12OC45LjQ8L2NvZGU+LCDkvp3mrKFcbjxjb2RlPiAgLi9jb25maWd1cmU8L2NvZGU+XG48Y29kZT4gIG1ha2U8L2NvZGU+XG48Y29kZT5zdWRvIG1ha2UgaW5zdGFsbDwvY29kZT5cbui/memHjOe8luivkeaXtumXtOS8muacieeCueS5he+8jOivt+iAkOW/g+etieW+hS0gLVxu5p+l55yL5a6J6KOF5oiQ5YqfXG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzIzMTE2ODQ/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIui/memHjOWGmeWbvueJh+aPj+i/sFwiPjwvcD5cbjxwPuWuieijhSBucG1cbuWQjOagt+S4i+i9vSBucG0g5YyFXG48Y29kZT53Z2V0IGh0dHA6Ly9ub2RlanMub3JnL2Rpc3QvbnBtL25wbS0xLjQuOS56aXA8L2NvZGU+XG7op6PljosgPGNvZGU+dGFyIC16eHZmIG5wbS0xLjQuOS50Z3o8L2NvZGU+XG7mn6XnnIvmmK/lkKblronoo4XmiJDlip8gPGNvZGU+bnBtIC12PC9jb2RlPjwvcD5cbjxwPui/meWwseaYryBub2RlIOeOr+Wig+mFjee9ruS6hu+8jCDnhLblkI7lsLHmmK8gbXlzcWwg5pWw5o2u5bqT44CCXG48YSBocmVmPVwiaHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2luN3N5c3RlbS9hcnRpY2xlL2RldGFpbHMvNTM1Nzk1MDBcIj5odHRwOi8vYmxvZy5jc2RuLm5ldC93aW43c3lzdGVtL2FydGljbGUvZGV0YWlscy81MzU3OTUwMDwvYT48L3A+XG48cD7lhbPkuo7pobnnm67nmoTkuIrkvKDvvIzlpoLmnpzkvaDmnKzlnLDnvJblhpnkuobku6PnoIHvvIzmg7PkuIrkvKDoh7PmnI3liqHlmajvvIznrKzkuIDkuKrmlrnlvI/vvIzlj6/ku6XmmK/kvb/nlKggZnRwIOS4iuS8oOaWh+S7tuOAgiDnrKzkuozkuKrmlrnlvI/vvIzlsLHmmK/lnKjkvaDnmoTmnI3liqHlmajkuIrmkK3lu7rkuIDkuKogZ2l0IOacjeWKoeWZqO+8jOmAmui/h+S7juacjeWKoeWZqOaOqOmAgeWSjOWFi+mahumhueebruadpeiOt+WPluaWh+S7tuOAgui/memHjOaIkeS9v+eUqOeahOaYr+esrOS6jOenjeaWueazle+8jOWPguingeaVmeeoi++8mlxuPGEgaHJlZj1cImh0dHBzOi8vd3d3LmxpYW94dWVmZW5nLmNvbS93aWtpLzAwMTM3Mzk1MTYzMDU5Mjk2MDZkZDE4MzYxMjQ4NTc4YzY3YjgwNjdjOGMwMTdiMDAwLzAwMTM3NTgzNzcwMzYwNTc5YmM0YjQ1OGYwNDRjZTdhZmVkM2RmNTc5MTIzZWNhMDAwXCI+aHR0cHM6Ly93d3cubGlhb3h1ZWZlbmcuY29tL3dpa2kvMDAxMzczOTUxNjMwNTkyOTYwNmRkMTgzNjEyNDg1NzhjNjdiODA2N2M4YzAxN2IwMDAvMDAxMzc1ODM3NzAzNjA1NzliYzRiNDU4ZjA0NGNlN2FmZWQzZGY1NzkxMjNlY2EwMDA8L2E+XG7ov5nph4zms6jmhI/kuIDkuIvvvIwg5YWz5LqOIOiuvue9riBzc2gg55m75b2V77yM5LiA5a6a6KaB5oqK5Yib5bu655qEIC5zc2gg5paH5Lu25pS+5Yiw5L2g5Yib5bu655qE55So5oi35LiL77yM5aaC5oiR6L+Z6YeM5pivIGdpdCDnlKjmiLfvvIzot6/lvoTlsLHmmK9cbjxpbWcgc3JjPVwiaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDEwNzE3NDUyOTk2OT93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0XCIgYWx0PVwi6L+Z6YeM5YaZ5Zu+54mH5o+P6L+wXCI+PC9wPlxuPHA+5pS+572u5Zyo5q2j56Gu5L2N572u5LmL5ZCO77yM6L+Y6KaB5rOo5oSP6aG555uu55qE5b2S5bGe6ICF5Lmf6KaB5pivIGdpdCDnlKjmiLfvvIzov5nmoLfmiY3kvJrlnKggZ2l0IOeUqOaIt+mHjOWMuemFjeWIsOWvueW6lOeahCBzc2gga2V544CC5Lmf5bCx5piv5LiL6Z2i6L+Z5LiA5Liq5q2l6aqkXG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzQ3NDkxNjg/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIui/memHjOWGmeWbvueJh+aPj+i/sFwiPjwvcD5cbjxwPui/mOacieS4gOeCueimgeazqOaEj+eahOWwseaYr++8jOS9oOWGjeacrOWcsOaOqOmAgeS6huS7o+eggeS4iiBnaXQg5pyN5Yqh5Zmo5LmL5ZCO77yM5oOz6KaB5Zyo5LqR5pyN5Yqh5Zmo5LiK6I635Y+W5Yiw5Luj56CB77yMIOmcgOimgeWcqOacjeWKoeWZqOS4iuWGjeasoeWFi+mahiA8Y29kZT5naXQgY2xvbmUgZ2l0QHNlcnZlcjovc3J2L3NhbXBsZS5naXQ8L2NvZGU+IOmhueebru+8jGdpdCBwdWxsIOiOt+WPluWIsOS7o+eggeOAgiDov5nph4zkuZ/lj6/ku6XpgJrov4foh6rlt7HphY3nva4gZ2l0IOacjeWKoeWZqOeahOmSqeWtkOWHveaVsO+8jOS9v+WFtuiHquWKqOabtOaWsOS7o+egge+8jOaIkei/mOayoemFjee9ru+8jOWwseWFiOS4jeivtOS6hiAtIC3jgII8L3A+XG48cD7lpb3kuobvvIznjrDlnKjnjrDlnKjln7rmnKznjq/looPphY3nva7lpb3kuoblsLHlj6/ku6XlvIDlp4vlvIDlj5HkvaDnmoTpobnnm67llabjgII8L3A+XG48cD7lj6blpJbpmYTvvJpcbumhueebruWcqOacjeWKoeWZqOS4iuWQr+WKqOS6hu+8jOWPkeeOsOWcqOacrOWcsOeUteiEkeaXoOazlemAmui/hyBpcCDorr/pl67vvIzpgqPkuYjlj6/og73mmK/kvaDnmoTnq6/lj6Plj7fmsqHmnInlvIDmlL7vvIzpnIDopoHljrvmnI3liqHlmajkuIrorr7nva7lronlhajnu4TjgIJcbuWFt+S9k+a3u+WKoOaWueazlSDvvIzku6Xlj4rlhbbku5bkuIDkupvlhbPkuo7mnI3liqHlmajnmoTphY3nva7vvIzpg73lj6/ku6Xpmo/ml7bngrnlh7vlj7PkvqfnmoQgPHN0cm9uZz7ngrnmiJHmj5Dpl648L3N0cm9uZz7vvIzlg4/kupHljZrlo6vmj5Dpl67jgIIgPSA9XG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzU1NDg3MDM/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIui/memHjOWGmeWbvueJh+aPj+i/sFwiPjwvcD5cbjwvZGl2PjwvdGVtcGxhdGU+IiwiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vYWxpeXVuLXNlcnZlci5tZD92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jNDRlNzg5MlwiXG5jb25zdCBzY3JpcHQgPSB7fVxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdnVlLWxvYWRlckAxNy40LjJfQHZ1ZStjb21waWxlci1zZmNAMy41LjNfdnVlQDMuNS4zX3R5cGVzY3JpcHRANS41LjRfX3dlYnBhY2tANS45NC4wX3dlYnBhY2stX2Z1cWt3Z2dwbGhleTNvaXZ0d2Uyc3RkbzZlL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ3JlbmRlcicscmVuZGVyXV0pXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbImNsYXNzIiwic2NyaXB0IiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfY2FjaGUiLCJfY3JlYXRlU3RhdGljVk5vZGUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[499],{499:function(t,e,o){o.r(e),o.d(e,{default:function(){return i}});var s=o(762);const a={class:"component-aliyun-server"},c={};var i=(0,o(314).A)(c,[["render",function(t,e){return(0,s.uX)(),(0,s.CE)("div",a,e[0]||(e[0]=[(0,s.Fv)('

购买服务器

学生购买可以使用阿里云优惠专享, 每个月只要9.9 就好了。这里我用的是学生优惠,机型内存什么都限定好了的。所以- - 没什么可以说的。关于国内外服务器的区别就是,如果你购买了国外的服务器,就可以在云服务器上搭梯子访问国外的网站,也就是翻墙了。

安装环境

因为服务器默认 linux 系统,所以这里讲怎么配置 linux 云服务环境。 我第一次使用的时候,还以为是要去安装一个界面化桌面,以便我这个命令小白可以操作。但是,对于只有2G 的内存来说安装了之后将会很卡很卡。后来我问学长,他说不要安装界面化,使用命令就好了。

首先关于远程服务器的登录, 默认系统的用户名是 root, 然后登录密码可以在控制台进行修改。如下图点击重置密码。 重置密码处

重置之后,然后点击远程连接,就可以连接登录到你的服务器上了。这里要将一点,如果你是 mac 电脑的话,可以在你的电脑上通过 ssh 登录到你的服务器。 命令如下: ssh root@你的公网IP,比如 ssh root@120.78.32.12 然后输入密码即可连接成功。

登录成功图

接下来在终端中输入命令。配置环境。如果你是配置 java 环境,那么可以去谷歌一下如何在 linux 中配置 java 环境,这里我是配置的 node 环境,就讲一下如何配置 node 环境以及 npm。

这里我用的是源码安装。首先安装 node 编译依赖的第三方模块 yum -y install gcc make gcc-c++ openssl-devel

然后下载 node 的源码包 这里写图片描述

node 官网的源码 包。 wget https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz

你下载的时候可以手动改成当前最新版本。下载后,进行解压 tar -zxvf node-v8.9.4.tar.gz, 然后进入解压后的文件夹 cd node-v8.9.4, 依次 ./configure makesudo make install 这里编译时间会有点久,请耐心等待- - 查看安装成功 这里写图片描述

安装 npm 同样下载 npm 包 wget http://nodejs.org/dist/npm/npm-1.4.9.zip 解压 tar -zxvf npm-1.4.9.tgz 查看是否安装成功 npm -v

这就是 node 环境配置了, 然后就是 mysql 数据库。 http://blog.csdn.net/win7system/article/details/53579500

关于项目的上传,如果你本地编写了代码,想上传至服务器,第一个方式,可以是使用 ftp 上传文件。 第二个方式,就是在你的服务器上搭建一个 git 服务器,通过从服务器推送和克隆项目来获取文件。这里我使用的是第二种方法,参见教程: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000 这里注意一下, 关于 设置 ssh 登录,一定要把创建的 .ssh 文件放到你创建的用户下,如我这里是 git 用户,路径就是 这里写图片描述

放置在正确位置之后,还要注意项目的归属者也要是 git 用户,这样才会在 git 用户里匹配到对应的 ssh key。也就是下面这一个步骤 这里写图片描述

还有一点要注意的就是,你再本地推送了代码上 git 服务器之后,想要在云服务器上获取到代码, 需要在服务器上再次克隆 git clone git@server:/srv/sample.git 项目,git pull 获取到代码。 这里也可以通过自己配置 git 服务器的钩子函数,使其自动更新代码,我还没配置,就先不说了 - -。

好了,现在现在基本环境配置好了就可以开始开发你的项目啦。

另外附: 项目在服务器上启动了,发现在本地电脑无法通过 ip 访问,那么可能是你的端口号没有开放,需要去服务器上设置安全组。 具体添加方法 ,以及其他一些关于服务器的配置,都可以随时点击右侧的 点我提问,像云博士提问。 = = 这里写图片描述

',19)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk5LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sMkJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQTRDSixNQTVDSUMsRUE0Q0pDLEVBQUEsS0FBQUEsRUFBQSxLQTVDTkMsRUFBQUEsRUFBQUEsSUFBQSxrcUgiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vYWxpeXVuLXNlcnZlci5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vYWxpeXVuLXNlcnZlci5tZD81OTBkIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LWFsaXl1bi1zZXJ2ZXJcIj48aDM+6LSt5Lmw5pyN5Yqh5ZmoPC9oMz5cbjxwPuWtpueUn+i0reS5sOWPr+S7peS9v+eUqOmYv+mHjOS6keS8mOaDoOS4k+S6q++8jCDmr4/kuKrmnIjlj6ropoE5Ljkg5bCx5aW95LqG44CC6L+Z6YeM5oiR55So55qE5piv5a2m55Sf5LyY5oOg77yM5py65Z6L5YaF5a2Y5LuA5LmI6YO96ZmQ5a6a5aW95LqG55qE44CC5omA5LulLSAtIOayoeS7gOS5iOWPr+S7peivtOeahOOAguWFs+S6juWbveWGheWkluacjeWKoeWZqOeahOWMuuWIq+WwseaYr++8jOWmguaenOS9oOi0reS5sOS6huWbveWklueahOacjeWKoeWZqO+8jOWwseWPr+S7peWcqOS6keacjeWKoeWZqOS4iuaQreair+WtkOiuv+mXruWbveWklueahOe9keerme+8jOS5n+WwseaYr+e/u+WimeS6huOAgjwvcD5cbjxoMz7lronoo4Xnjq/looM8L2gzPlxuPHA+5Zug5Li65pyN5Yqh5Zmo6buY6K6kIGxpbnV4IOezu+e7n++8jOaJgOS7pei/memHjOiusuaAjuS5iOmFjee9riBsaW51eCDkupHmnI3liqHnjq/looPjgIJcbuaIkeesrOS4gOasoeS9v+eUqOeahOaXtuWAme+8jOi/mOS7peS4uuaYr+imgeWOu+WuieijheS4gOS4queVjOmdouWMluahjOmdou+8jOS7peS+v+aIkei/meS4quWRveS7pOWwj+eZveWPr+S7peaTjeS9nOOAguS9huaYr++8jOWvueS6juWPquaciTJHIOeahOWGheWtmOadpeivtOWuieijheS6huS5i+WQjuWwhuS8muW+iOWNoeW+iOWNoeOAguWQjuadpeaIkemXruWtpumVv++8jOS7luivtOS4jeimgeWuieijheeVjOmdouWMlu+8jOS9v+eUqOWRveS7pOWwseWlveS6huOAgjwvcD5cbjxwPummluWFiOWFs+S6jui/nOeoi+acjeWKoeWZqOeahOeZu+W9le+8jCDpu5jorqTns7vnu5/nmoTnlKjmiLflkI3mmK8gcm9vdCwg54S25ZCO55m75b2V5a+G56CB5Y+v5Lul5Zyo5o6n5Yi25Y+w6L+b6KGM5L+u5pS544CC5aaC5LiL5Zu+54K55Ye76YeN572u5a+G56CB44CCXG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzAwNTQ5MTg/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIumHjee9ruWvhueggeWkhFwiPjwvcD5cbjxwPumHjee9ruS5i+WQju+8jOeEtuWQjueCueWHu+i/nOeoi+i/nuaOpe+8jOWwseWPr+S7pei/nuaOpeeZu+W9leWIsOS9oOeahOacjeWKoeWZqOS4iuS6huOAgui/memHjOimgeWwhuS4gOeCue+8jOWmguaenOS9oOaYryBtYWMg55S16ISR55qE6K+d77yM5Y+v5Lul5Zyo5L2g55qE55S16ISR5LiK6YCa6L+HIHNzaCDnmbvlvZXliLDkvaDnmoTmnI3liqHlmajjgIIg5ZG95Luk5aaC5LiL77yaXG48Y29kZT5zc2ggcm9vdEDkvaDnmoTlhaznvZFJUDwvY29kZT7vvIzmr5TlpoIgPGNvZGU+c3NoIHJvb3RAMTIwLjc4LjMyLjEyPC9jb2RlPlxu54S25ZCO6L6T5YWl5a+G56CB5Y2z5Y+v6L+e5o6l5oiQ5Yqf44CCPC9wPlxuPHA+PGltZyBzcmM9XCJodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTgwMTA3MTcwNTAzMzMzP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3RcIiBhbHQ9XCLnmbvlvZXmiJDlip/lm75cIj48L3A+XG48cD7mjqXkuIvmnaXlnKjnu4jnq6/kuK3ovpPlhaXlkb3ku6TjgILphY3nva7njq/looPjgILlpoLmnpzkvaDmmK/phY3nva4gamF2YSDnjq/looPvvIzpgqPkuYjlj6/ku6XljrvosLfmrYzkuIDkuIvlpoLkvZXlnKggbGludXgg5Lit6YWN572uIGphdmEg546v5aKD77yM6L+Z6YeM5oiR5piv6YWN572u55qEIG5vZGUg546v5aKD77yM5bCx6K6y5LiA5LiL5aaC5L2V6YWN572uIG5vZGUg546v5aKD5Lul5Y+KIG5wbeOAgjwvcD5cbjxwPui/memHjOaIkeeUqOeahOaYr+a6kOeggeWuieijheOAgummluWFiOWuieijhSBub2RlIOe8luivkeS+nei1lueahOesrOS4ieaWueaooeWdl1xuPGNvZGU+eXVtIC15IGluc3RhbGwgZ2NjIG1ha2UgZ2NjLWMrKyBvcGVuc3NsLWRldmVsPC9jb2RlPjwvcD5cbjxwPueEtuWQjuS4i+i9vSBub2RlIOeahOa6kOeggeWMhVxuPGltZyBzcmM9XCJodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTgwMTA3MTcxMzAwMDM2P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3RcIiBhbHQ9XCLov5nph4zlhpnlm77niYfmj4/ov7BcIj48L3A+XG48cD5ub2RlIOWumOe9keeahOa6kOeggSDljIXjgIJcbjxjb2RlPndnZXQgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvdjguOS40L25vZGUtdjguOS40LnRhci5nejwvY29kZT48L3A+XG48cD7kvaDkuIvovb3nmoTml7blgJnlj6/ku6XmiYvliqjmlLnmiJDlvZPliY3mnIDmlrDniYjmnKzjgILkuIvovb3lkI7vvIzov5vooYzop6PljosgPGNvZGU+dGFyIC16eHZmIG5vZGUtdjguOS40LnRhci5nejwvY29kZT4sIOeEtuWQjui/m+WFpeino+WOi+WQjueahOaWh+S7tuWkuSA8Y29kZT4gY2Qgbm9kZS12OC45LjQ8L2NvZGU+LCDkvp3mrKFcbjxjb2RlPiAgLi9jb25maWd1cmU8L2NvZGU+XG48Y29kZT4gIG1ha2U8L2NvZGU+XG48Y29kZT5zdWRvIG1ha2UgaW5zdGFsbDwvY29kZT5cbui/memHjOe8luivkeaXtumXtOS8muacieeCueS5he+8jOivt+iAkOW/g+etieW+hS0gLVxu5p+l55yL5a6J6KOF5oiQ5YqfXG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzIzMTE2ODQ/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIui/memHjOWGmeWbvueJh+aPj+i/sFwiPjwvcD5cbjxwPuWuieijhSBucG1cbuWQjOagt+S4i+i9vSBucG0g5YyFXG48Y29kZT53Z2V0IGh0dHA6Ly9ub2RlanMub3JnL2Rpc3QvbnBtL25wbS0xLjQuOS56aXA8L2NvZGU+XG7op6PljosgPGNvZGU+dGFyIC16eHZmIG5wbS0xLjQuOS50Z3o8L2NvZGU+XG7mn6XnnIvmmK/lkKblronoo4XmiJDlip8gPGNvZGU+bnBtIC12PC9jb2RlPjwvcD5cbjxwPui/meWwseaYryBub2RlIOeOr+Wig+mFjee9ruS6hu+8jCDnhLblkI7lsLHmmK8gbXlzcWwg5pWw5o2u5bqT44CCXG48YSBocmVmPVwiaHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2luN3N5c3RlbS9hcnRpY2xlL2RldGFpbHMvNTM1Nzk1MDBcIj5odHRwOi8vYmxvZy5jc2RuLm5ldC93aW43c3lzdGVtL2FydGljbGUvZGV0YWlscy81MzU3OTUwMDwvYT48L3A+XG48cD7lhbPkuo7pobnnm67nmoTkuIrkvKDvvIzlpoLmnpzkvaDmnKzlnLDnvJblhpnkuobku6PnoIHvvIzmg7PkuIrkvKDoh7PmnI3liqHlmajvvIznrKzkuIDkuKrmlrnlvI/vvIzlj6/ku6XmmK/kvb/nlKggZnRwIOS4iuS8oOaWh+S7tuOAgiDnrKzkuozkuKrmlrnlvI/vvIzlsLHmmK/lnKjkvaDnmoTmnI3liqHlmajkuIrmkK3lu7rkuIDkuKogZ2l0IOacjeWKoeWZqO+8jOmAmui/h+S7juacjeWKoeWZqOaOqOmAgeWSjOWFi+mahumhueebruadpeiOt+WPluaWh+S7tuOAgui/memHjOaIkeS9v+eUqOeahOaYr+esrOS6jOenjeaWueazle+8jOWPguingeaVmeeoi++8mlxuPGEgaHJlZj1cImh0dHBzOi8vd3d3LmxpYW94dWVmZW5nLmNvbS93aWtpLzAwMTM3Mzk1MTYzMDU5Mjk2MDZkZDE4MzYxMjQ4NTc4YzY3YjgwNjdjOGMwMTdiMDAwLzAwMTM3NTgzNzcwMzYwNTc5YmM0YjQ1OGYwNDRjZTdhZmVkM2RmNTc5MTIzZWNhMDAwXCI+aHR0cHM6Ly93d3cubGlhb3h1ZWZlbmcuY29tL3dpa2kvMDAxMzczOTUxNjMwNTkyOTYwNmRkMTgzNjEyNDg1NzhjNjdiODA2N2M4YzAxN2IwMDAvMDAxMzc1ODM3NzAzNjA1NzliYzRiNDU4ZjA0NGNlN2FmZWQzZGY1NzkxMjNlY2EwMDA8L2E+XG7ov5nph4zms6jmhI/kuIDkuIvvvIwg5YWz5LqOIOiuvue9riBzc2gg55m75b2V77yM5LiA5a6a6KaB5oqK5Yib5bu655qEIC5zc2gg5paH5Lu25pS+5Yiw5L2g5Yib5bu655qE55So5oi35LiL77yM5aaC5oiR6L+Z6YeM5pivIGdpdCDnlKjmiLfvvIzot6/lvoTlsLHmmK9cbjxpbWcgc3JjPVwiaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDEwNzE3NDUyOTk2OT93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0XCIgYWx0PVwi6L+Z6YeM5YaZ5Zu+54mH5o+P6L+wXCI+PC9wPlxuPHA+5pS+572u5Zyo5q2j56Gu5L2N572u5LmL5ZCO77yM6L+Y6KaB5rOo5oSP6aG555uu55qE5b2S5bGe6ICF5Lmf6KaB5pivIGdpdCDnlKjmiLfvvIzov5nmoLfmiY3kvJrlnKggZ2l0IOeUqOaIt+mHjOWMuemFjeWIsOWvueW6lOeahCBzc2gga2V544CC5Lmf5bCx5piv5LiL6Z2i6L+Z5LiA5Liq5q2l6aqkXG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzQ3NDkxNjg/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIui/memHjOWGmeWbvueJh+aPj+i/sFwiPjwvcD5cbjxwPui/mOacieS4gOeCueimgeazqOaEj+eahOWwseaYr++8jOS9oOWGjeacrOWcsOaOqOmAgeS6huS7o+eggeS4iiBnaXQg5pyN5Yqh5Zmo5LmL5ZCO77yM5oOz6KaB5Zyo5LqR5pyN5Yqh5Zmo5LiK6I635Y+W5Yiw5Luj56CB77yMIOmcgOimgeWcqOacjeWKoeWZqOS4iuWGjeasoeWFi+mahiA8Y29kZT5naXQgY2xvbmUgZ2l0QHNlcnZlcjovc3J2L3NhbXBsZS5naXQ8L2NvZGU+IOmhueebru+8jGdpdCBwdWxsIOiOt+WPluWIsOS7o+eggeOAgiDov5nph4zkuZ/lj6/ku6XpgJrov4foh6rlt7HphY3nva4gZ2l0IOacjeWKoeWZqOeahOmSqeWtkOWHveaVsO+8jOS9v+WFtuiHquWKqOabtOaWsOS7o+egge+8jOaIkei/mOayoemFjee9ru+8jOWwseWFiOS4jeivtOS6hiAtIC3jgII8L3A+XG48cD7lpb3kuobvvIznjrDlnKjnjrDlnKjln7rmnKznjq/looPphY3nva7lpb3kuoblsLHlj6/ku6XlvIDlp4vlvIDlj5HkvaDnmoTpobnnm67llabjgII8L3A+XG48cD7lj6blpJbpmYTvvJpcbumhueebruWcqOacjeWKoeWZqOS4iuWQr+WKqOS6hu+8jOWPkeeOsOWcqOacrOWcsOeUteiEkeaXoOazlemAmui/hyBpcCDorr/pl67vvIzpgqPkuYjlj6/og73mmK/kvaDnmoTnq6/lj6Plj7fmsqHmnInlvIDmlL7vvIzpnIDopoHljrvmnI3liqHlmajkuIrorr7nva7lronlhajnu4TjgIJcbuWFt+S9k+a3u+WKoOaWueazlSDvvIzku6Xlj4rlhbbku5bkuIDkupvlhbPkuo7mnI3liqHlmajnmoTphY3nva7vvIzpg73lj6/ku6Xpmo/ml7bngrnlh7vlj7PkvqfnmoQgPHN0cm9uZz7ngrnmiJHmj5Dpl648L3N0cm9uZz7vvIzlg4/kupHljZrlo6vmj5Dpl67jgIIgPSA9XG48aW1nIHNyYz1cImh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzU1NDg3MDM/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdFwiIGFsdD1cIui/memHjOWGmeWbvueJh+aPj+i/sFwiPjwvcD5cbjwvZGl2PjwvdGVtcGxhdGU+IiwiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vYWxpeXVuLXNlcnZlci5tZD92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jNDRlNzg5MlwiXG5jb25zdCBzY3JpcHQgPSB7fVxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdnVlLWxvYWRlckAxNy40LjJfQHZ1ZStjb21waWxlci1zZmNAMy41LjEyX3Z1ZUAzLjUuMTJfdHlwZXNjcmlwdEA1LjYuM19fd2VicGFja0A1Ljk1LjBfd2VicGFjay1jbGlANS4xLjRfL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ3JlbmRlcicscmVuZGVyXV0pXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbImNsYXNzIiwic2NyaXB0IiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfY2FjaGUiLCJfY3JlYXRlU3RhdGljVk5vZGUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/525.bundle.js b/525.bundle.js new file mode 100644 index 0000000..e2f57dd --- /dev/null +++ b/525.bundle.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[525],{7525:(s,t,e)=>{e.r(t),e.d(t,{default:()=>c});const c="## 写 css 遇到了问题怎么办?\n\n### 如何让 css 写的更轻松?\n#### [postcss-ui-theme](https://github.com/cleverboy32/postcss-ui-theme),让你实现类 sass 语法,一个插件就能做到!\n\n### 如何改变 css 主题 ?\n\n#### [postcss-ui-theme ](https://github.com/cleverboy32/postcss-ui-theme), 可打包 css4 变量被保留,不仅可在引用时直接使用新的变量文件覆盖改变主题,还可以通过 js 进行更改!!!\n### css 在别的项目被编译,文件路径找不到?\n\n#### [postcss-ui-theme](https://github.com/cleverboy32/postcss-ui-theme), 集成 postcss-assets 插件,通过配置 文件查找路径,解决引用文件找不到问题!!\n\n\n### [postcss-ui-theme](https://github.com/cleverboy32/postcss-ui-theme) 插件,就是你的 css 管理方案的最佳选择! 点 star 收藏!!! 茫茫前端路,你真的会用到它的!\n\n\n"}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI1LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsOGtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3Bvc3Rjc3MtcGx1Z2luLm1kIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiIyMg5YaZIGNzcyDpgYfliLDkuobpl67popjmgI7kuYjlip7vvJ9cXG5cXG4jIyMg5aaC5L2V6K6pIGNzcyDlhpnnmoTmm7Tovbvmnb7vvJ9cXG4jIyMjIFtwb3N0Y3NzLXVpLXRoZW1lXShodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZSnvvIzorqnkvaDlrp7njrDnsbsgc2FzcyDor63ms5XvvIzkuIDkuKrmj5Lku7blsLHog73lgZrliLDvvIFcXG5cXG4jIyMg5aaC5L2V5pS55Y+YIGNzcyDkuLvpopgg77yfXFxuXFxuIyMjIyBbcG9zdGNzcy11aS10aGVtZSBdKGh0dHBzOi8vZ2l0aHViLmNvbS9jbGV2ZXJib3kzMi9wb3N0Y3NzLXVpLXRoZW1lKe+8jCDlj6/miZPljIUgY3NzNCDlj5jph4/ooqvkv53nlZnvvIzkuI3ku4Xlj6/lnKjlvJXnlKjml7bnm7TmjqXkvb/nlKjmlrDnmoTlj5jph4/mlofku7bopobnm5bmlLnlj5jkuLvpopjvvIzov5jlj6/ku6XpgJrov4cganMg6L+b6KGM5pu05pS577yB77yB77yBXFxuIyMjICBjc3Mg5Zyo5Yir55qE6aG555uu6KKr57yW6K+R77yM5paH5Lu26Lev5b6E5om+5LiN5Yiw77yfXFxuXFxuIyMjIyBbcG9zdGNzcy11aS10aGVtZV0oaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3Bvc3Rjc3MtdWktdGhlbWUp77yMIOmbhuaIkCBwb3N0Y3NzLWFzc2V0cyDmj5Lku7bvvIzpgJrov4fphY3nva4g5paH5Lu25p+l5om+6Lev5b6E77yM6Kej5Yaz5byV55So5paH5Lu25om+5LiN5Yiw6Zeu6aKY77yB77yBXFxuXFxuXFxuIyMjIFtwb3N0Y3NzLXVpLXRoZW1lXShodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZSkg5o+S5Lu277yM5bCx5piv5L2g55qEIGNzcyDnrqHnkIbmlrnmoYjnmoTmnIDkvbPpgInmi6khIOeCuSBzdGFyIOaUtuiXj++8ge+8ge+8gSDojKvojKvliY3nq6/ot6/vvIzkvaDnnJ/nmoTkvJrnlKjliLDlroPnmoTvvIFcXG5cXG5cXG5cIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/528.bundle.js b/528.bundle.js new file mode 100644 index 0000000..18c5760 --- /dev/null +++ b/528.bundle.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[528],{6147:(n,t,i)=>{i.r(t),i.d(t,{default:()=>o});const o='作为一个前端,写页面结构,写CSS怎么命名? \n就算不用,但你的了解, 让自己的代码更规范。\n\n##### BEM是什么\n它是css命名的一种规范。试想,你写了一个页面,有input, button, div, 这些元素是什么样的关系,给他们添加样式的时候,怎么知道他们是一个页面的? 怎么知道input 是否放在div里面的? 不要急,这就说到了下面的命名之作用\n\n#### BEM是怎么命名的\n```html\n\n\t
\n\t\t\n\t\t\t\n\t
\n\n```\n通过上面命名可以很直接看出,input 和button 在div 里面。\n这里讲 后面的 __input/__confim 这里后面接两个下划线,表示的是div里面的子元素。\n```html\n\n\t
\n\t\t\n\t\t\t\n\t
\n\n```\n这里说, --big表示添加的描述, 很明显是大的注册表单的样式嘛。\n\n#### BEM总结\n好了, 这里loggin-from 相当于一块整体(block), 里面包含了元素input/button(element), 还有这个块或者一些元素的修饰big(modifier) => BEM\n它一般和sass一起使用,在用@C代表块、 @d代表元素、 @m代码修饰符的时候, css可以这样写了\n```\n@C loggin-from {\n\twidth: 100px;\n\theight: 100px;\n\t@m big {\n\t\twidth: 200px;\n\t\theight: 200px;\n\t}\n\t@d input {\n\t\tcolor: red;\n\t}\n\t@d button {\n\t\tcolor: blue;\n\t}\n}\n```\n怎么样,这样是不是就不用写那么长了, 而且一看样式文件,就能知道页面布局是什么样的。\n**以上写法, 要通过sass 插件配置的**\n这里有一个包 ,可以使用[sass-bem-constructor](https://www.npmjs.com/package/sass-bem-constructor)'}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI4LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsNnFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2JlbS5tZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcIuS9nOS4uuS4gOS4quWJjeerr++8jOWGmemhtemdoue7k+aehO+8jOWGmUNTU+aAjuS5iOWRveWQjT8gXFxu5bCx566X5LiN55So77yM5L2G5L2g55qE5LqG6Kej77yMIOiuqeiHquW3seeahOS7o+eggeabtOinhOiMg+OAglxcblxcbiMjIyMjIEJFTeaYr+S7gOS5iFxcbuWug+aYr2Nzc+WRveWQjeeahOS4gOenjeinhOiMg+OAguivleaDs++8jOS9oOWGmeS6huS4gOS4qumhtemdou+8jOaciWlucHV0LCBidXR0b24sIGRpdiwg6L+Z5Lqb5YWD57Sg5piv5LuA5LmI5qC355qE5YWz57O777yM57uZ5LuW5Lus5re75Yqg5qC35byP55qE5pe25YCZ77yM5oCO5LmI55+l6YGT5LuW5Lus5piv5LiA5Liq6aG16Z2i55qE77yfIOaAjuS5iOefpemBk2lucHV0IOaYr+WQpuaUvuWcqGRpdumHjOmdoueahO+8nyDkuI3opoHmgKXvvIzov5nlsLHor7TliLDkuobkuIvpnaLnmoTlkb3lkI3kuYvkvZznlKhcXG5cXG4jIyMjIEJFTeaYr+aAjuS5iOWRveWQjeeahFxcbmBgYGh0bWxcXG48aHRtbD5cXG5cXHQ8ZGl2IGNsYXNzPVxcXCJsb2dnaW4tZnJvbVxcXCI+XFxuXFx0XFx0PGlucHV0IGNsYXNzPVxcXCJsb2dnaW4tZnJvbV9faW5wdXRcXFwiLz5cXG5cXHRcXHQ8YnV0dG9uIGNsYXNzPVxcXCJsb2dnaW4tZnJvbV9fY29uZmltXFxcIj7noa7lrpo8L2J1dHRvbj5cXHRcXG5cXHQ8L2Rpdj5cXG48L2h0bWw+XFxuYGBgXFxu6YCa6L+H5LiK6Z2i5ZG95ZCN5Y+v5Lul5b6I55u05o6l55yL5Ye677yMaW5wdXQg5ZKMYnV0dG9uIOWcqGRpdiDph4zpnaLjgIJcXG7ov5nph4zorrIg5ZCO6Z2i55qEIF9faW5wdXQvX19jb25maW0g6L+Z6YeM5ZCO6Z2i5o6l5Lik5Liq5LiL5YiS57q/77yM6KGo56S655qE5pivZGl26YeM6Z2i55qE5a2Q5YWD57Sg44CCXFxuYGBgaHRtbFxcbjxodG1sPlxcblxcdDxkaXYgY2xhc3M9XFxcImxvZ2dpbi1mcm9tLS1iaWdcXFwiPlxcblxcdFxcdDxpbnB1dCBjbGFzcz1cXFwibG9nZ2luLWZyb21fX2lucHV0XFxcIi8+XFxuXFx0XFx0PGJ1dHRvbiBjbGFzcz1cXFwibG9nZ2luLWZyb21fX2NvbmZpbVxcXCI+56Gu5a6aPC9idXR0b24+XFx0XFxuXFx0PC9kaXY+XFxuPC9odG1sPlxcbmBgYFxcbui/memHjOivtO+8jCAtLWJpZ+ihqOekuua3u+WKoOeahOaPj+i/sO+8jCDlvojmmI7mmL7mmK/lpKfnmoTms6jlhozooajljZXnmoTmoLflvI/lmJvjgIJcXG5cXG4jIyMjIEJFTeaAu+e7k1xcbuWlveS6hu+8jCDov5nph4xsb2dnaW4tZnJvbSDnm7jlvZPkuo7kuIDlnZfmlbTkvZMoYmxvY2sp77yMIOmHjOmdouWMheWQq+S6huWFg+e0oGlucHV0L2J1dHRvbihlbGVtZW50KSwg6L+Y5pyJ6L+Z5Liq5Z2X5oiW6ICF5LiA5Lqb5YWD57Sg55qE5L+u6aWwYmlnKG1vZGlmaWVyKSA9PiBCRU1cXG7lroPkuIDoiKzlkoxzYXNz5LiA6LW35L2/55So77yM5Zyo55SoQEPku6PooajlnZfjgIEgQGTku6PooajlhYPntKDjgIEgQG3ku6PnoIHkv67ppbDnrKbnmoTml7blgJnvvIwgY3Nz5Y+v5Lul6L+Z5qC35YaZ5LqGXFxuYGBgXFxuQEMgbG9nZ2luLWZyb20ge1xcblxcdHdpZHRoOiAxMDBweDtcXG5cXHRoZWlnaHQ6IDEwMHB4O1xcblxcdEBtIGJpZyB7XFxuXFx0XFx0d2lkdGg6IDIwMHB4O1xcblxcdFxcdGhlaWdodDogMjAwcHg7XFxuXFx0fVxcblxcdEBkIGlucHV0IHtcXG5cXHRcXHRjb2xvcjogcmVkO1xcblxcdH1cXG5cXHRAZCBidXR0b24ge1xcblxcdFxcdGNvbG9yOiBibHVlO1xcblxcdH1cXG59XFxuYGBgXFxu5oCO5LmI5qC377yM6L+Z5qC35piv5LiN5piv5bCx5LiN55So5YaZ6YKj5LmI6ZW/5LqG77yMIOiAjOS4lOS4gOeci+agt+W8j+aWh+S7tu+8jOWwseiDveefpemBk+mhtemdouW4g+WxgOaYr+S7gOS5iOagt+eahOOAglxcbioq5Lul5LiK5YaZ5rOV77yMIOimgemAmui/h3Nhc3Mg5o+S5Lu26YWN572u55qEKipcXG7ov5nph4zmnInkuIDkuKrljIUg77yM5Y+v5Lul5L2/55SoW3Nhc3MtYmVtLWNvbnN0cnVjdG9yXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zYXNzLWJlbS1jb25zdHJ1Y3RvcilcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/658.bundle.js b/538.bundle.js similarity index 92% rename from 658.bundle.js rename to 538.bundle.js index 6073d76..c933647 100644 --- a/658.bundle.js +++ b/538.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[658],{658:function(e,p,o){o.r(p),o.d(p,{default:function(){return d}});var c=o(358);const h={class:"component-safe"},s={};var d=(0,o(389).A)(s,[["render",function(e,p){return(0,c.uX)(),(0,c.CE)("div",h,p[0]||(p[0]=[(0,c.Fv)('

安全意识

你要离开家了, 所有的父母都会说,路上注意安全,可见安全是多么的重要!那么作为软件开发,有哪些危险使我们要知道并避免的呢? 下面我说一些基本的需要知道的安全攻击, 以及应对方案。

ps 作为一个安全小白,了解各种各样的防范方案真的太难了,我是真的水🤭。欢迎补充,以增长见识

XSS: 跨站脚本攻击

在用户可以输入的地方,并且将作为代码编译时,攻击者可以通过输入一个脚本地址的方式进行对页面注入脚本攻击。解决方式: 任何用户输入的地方都不要相信,对用户输入内容进行转义,如 < 使用转义字符串 &lt; 代替。

CSRF: 跨站伪装请求攻击

在用户已登录的情况下,伪装用户的身份发起请求,进行相关攻击。解决方式,确认用户的身份。比较好理解的解决方式是: 二次确认,通过用户的二次确认确认请求方为真实用户。然后就是 X-Requested-With 请求标志,通过该请求头设置标志位 ajax 请求,可以一定程度阻止跨域的伪装。Anti-CSRF TOKEN 方案:通过服务端与客户端唯一的 token 值进行校验,可以看做一个暗号,让别人无法伪装!

网络劫持

Jsonp 劫持

我们都知道 jsonp 就是为了解决跨域的,如果传输信息设计到比较敏感的数据,那么别人可以很方便调用你的接口,获取你的数据,存储在自己的数据库中。解决方法,添加脚本可运行白名单,不要传输敏感信息。

HTTP 劫持。

HTTP 是明文传输,所以运营商可以知道你的代码是什么,然后在里面加一点小广告什么的,改变你的内容。解决方法就是使用 https 协议,可耻的运营商

DNS 劫持

通过域名解析我们才能找到对域名的服务器 ip 地址,劫持了 DNS 就可以给你返回一个错误的 ip 地址。在 dns 解析中,会先在本机搜索域名解析记录,无相关记录像 dns 服务商发起请求。所以要么你本地信息被篡改,要么服务商欺骗你。 转一篇 DNS 劫持详解链接

接口安全

数据库

数据库,插入数据库的参数,在执行 sql 的时候小心它把你整个数据库表给删了。这里的攻击类似 xss 攻击,通过传输、拼接一些字符串改变原本的 sql 语义

推送消息

比如短信发送消息,非常的有代表性。通过接口的参数传递,以及最后的发送内容,可以推测出你的推送内容的组合相关方式,就可以通过不良参数,很方便的发送的一些不合法的信息,或有毒链接给用户。解决方式就是不要相信用户传入的任何参数,对参数进行校验,发送内容尽量可选择匹配模式,如 code 值映射,对不合法的参数才有默认内容发送。

DDOS:分布式拒绝服务

就是很多请求大量涌入你的服务器,导致它们都没有空闲可以响应真正的用户请求。通过 TCP 连接,我们知道建立连接需要三次确认,一般攻击者可以伪造 ip, 发起大量连接请求,却又不确认 = = 导致服务器白白等待直到超时。其次可以借用别的用户,在一个大流量用户网站地方的某一个页面上了,通过 xss 默认发起对攻击网站的请求,并发送很大的数据,但每次发送很少的字节,这些用户就被当成了肉鸡,然后使其瘫痪。解决防范:增加机器, 对同一个ip 的过多请求进行防范。

',21)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU4LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sa0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXlCSixNQXpCSUMsRUF5QkpDLEVBQUEsS0FBQUEsRUFBQSxLQXpCTkMsRUFBQUEsRUFBQUEsSUFBQSx3bkQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vc2FmZS5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vc2FmZS5tZD85NDMxIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXNhZmVcIj48aDE+5a6J5YWo5oSP6K+GPC9oMT5cbjxwPuS9oOimgeemu+W8gOWutuS6hiwg5omA5pyJ55qE54i25q+N6YO95Lya6K+077yM6Lev5LiK5rOo5oSP5a6J5YWo77yM5Y+v6KeB5a6J5YWo5piv5aSa5LmI55qE6YeN6KaB77yB6YKj5LmI5L2c5Li66L2v5Lu25byA5Y+R77yM5pyJ5ZOq5Lqb5Y2x6Zmp5L2/5oiR5Lus6KaB55+l6YGT5bm26YG/5YWN55qE5ZGi77yfXG7kuIvpnaLmiJHor7TkuIDkupvln7rmnKznmoTpnIDopoHnn6XpgZPnmoTlronlhajmlLvlh7ssIOS7peWPiuW6lOWvueaWueahiOOAgjwvcD5cbjxibG9ja3F1b3RlPlxuPHA+cHMg5L2c5Li65LiA5Liq5a6J5YWo5bCP55m977yM5LqG6Kej5ZCE56eN5ZCE5qC355qE6Ziy6IyD5pa55qGI55yf55qE5aSq6Zq+5LqG77yM5oiR5piv55yf55qE5rC08J+kreOAguasoui/juihpeWFhe+8jOS7peWinumVv+ingeivhjwvcD5cbjwvYmxvY2txdW90ZT5cbjxoMj5YU1M6IOi3qOermeiEmuacrOaUu+WHuzwvaDI+XG48cD7lnKjnlKjmiLflj6/ku6XovpPlhaXnmoTlnLDmlrnvvIzlubbkuJTlsIbkvZzkuLrku6PnoIHnvJbor5Hml7bvvIzmlLvlh7vogIXlj6/ku6XpgJrov4fovpPlhaXkuIDkuKrohJrmnKzlnLDlnYDnmoTmlrnlvI/ov5vooYzlr7npobXpnaLms6jlhaXohJrmnKzmlLvlh7vjgILop6PlhrPmlrnlvI86IOS7u+S9leeUqOaIt+i+k+WFpeeahOWcsOaWuemDveS4jeimgeebuOS/oe+8jOWvueeUqOaIt+i+k+WFpeWGheWuuei/m+ihjOi9rOS5ie+8jOWmgiA8Y29kZT4mbHQ7PC9jb2RlPiDkvb/nlKjovazkuYnlrZfnrKbkuLIgPGNvZGU+JmFtcDtsdDs8L2NvZGU+IOS7o+abv+OAgjwvcD5cbjxoMj5DU1JGOiDot6jnq5nkvKroo4Xor7fmsYLmlLvlh7s8L2gyPlxuPHA+5Zyo55So5oi35bey55m75b2V55qE5oOF5Ya15LiL77yM5Lyq6KOF55So5oi355qE6Lqr5Lu95Y+R6LW36K+35rGC77yM6L+b6KGM55u45YWz5pS75Ye744CC6Kej5Yaz5pa55byP77yM56Gu6K6k55So5oi355qE6Lqr5Lu944CC5q+U6L6D5aW955CG6Kej55qE6Kej5Yaz5pa55byP5pivOiDkuozmrKHnoa7orqTvvIzpgJrov4fnlKjmiLfnmoTkuozmrKHnoa7orqTnoa7orqTor7fmsYLmlrnkuLrnnJ/lrp7nlKjmiLfjgILnhLblkI7lsLHmmK8gWC1SZXF1ZXN0ZWQtV2l0aCAg6K+35rGC5qCH5b+X77yM6YCa6L+H6K+l6K+35rGC5aS06K6+572u5qCH5b+X5L2NIDxjb2RlPmFqYXg8L2NvZGU+IOivt+axgu+8jOWPr+S7peS4gOWumueoi+W6pumYu+atoui3qOWfn+eahOS8quijheOAgjxjb2RlPkFudGktQ1NSRiBUT0tFTjwvY29kZT4g5pa55qGI77ya6YCa6L+H5pyN5Yqh56uv5LiO5a6i5oi356uv5ZSv5LiA55qEIHRva2VuIOWAvOi/m+ihjOagoemqjO+8jOWPr+S7peeci+WBmuS4gOS4quaal+WPt++8jOiuqeWIq+S6uuaXoOazleS8quijhe+8gTwvcD5cbjxoMj7nvZHnu5zliqvmjIE8L2gyPlxuPGgzPkpzb25wIOWKq+aMgTwvaDM+XG48cD7miJHku6zpg73nn6XpgZMgPGNvZGU+anNvbnA8L2NvZGU+IOWwseaYr+S4uuS6huino+WGs+i3qOWfn+eahO+8jOWmguaenOS8oOi+k+S/oeaBr+iuvuiuoeWIsOavlOi+g+aVj+aEn+eahOaVsOaNru+8jOmCo+S5iOWIq+S6uuWPr+S7peW+iOaWueS+v+iwg+eUqOS9oOeahOaOpeWPo++8jOiOt+WPluS9oOeahOaVsOaNru+8jOWtmOWCqOWcqOiHquW3seeahOaVsOaNruW6k+S4reOAguino+WGs+aWueazle+8jOa3u+WKoOiEmuacrOWPr+i/kOihjOeZveWQjeWNle+8jOS4jeimgeS8oOi+k+aVj+aEn+S/oeaBr+OAgjwvcD5cbjxoMz5IVFRQIOWKq+aMgeOAgjwvaDM+XG48cD5IVFRQIOaYr+aYjuaWh+S8oOi+k++8jOaJgOS7pei/kOiQpeWVhuWPr+S7peefpemBk+S9oOeahOS7o+eggeaYr+S7gOS5iO+8jOeEtuWQjuWcqOmHjOmdouWKoOS4gOeCueWwj+W5v+WRiuS7gOS5iOeahO+8jOaUueWPmOS9oOeahOWGheWuueOAguino+WGs+aWueazleWwseaYr+S9v+eUqCBodHRwcyDljY/orq7vvIzlj6/ogLvnmoTov5DokKXllYY8L3A+XG48aDM+RE5TIOWKq+aMgTwvaDM+XG48cD7pgJrov4fln5/lkI3op6PmnpDmiJHku6zmiY3og73mib7liLDlr7nln5/lkI3nmoTmnI3liqHlmaggaXAg5Zyw5Z2A77yM5Yqr5oyB5LqGIEROUyDlsLHlj6/ku6Xnu5nkvaDov5Tlm57kuIDkuKrplJnor6/nmoQgaXAg5Zyw5Z2A44CC5ZyoIGRucyDop6PmnpDkuK3vvIzkvJrlhYjlnKjmnKzmnLrmkJzntKLln5/lkI3op6PmnpDorrDlvZXvvIzml6Dnm7jlhbPorrDlvZXlg48gZG5zIOacjeWKoeWVhuWPkei1t+ivt+axguOAguaJgOS7peimgeS5iOS9oOacrOWcsOS/oeaBr+iiq+evoeaUue+8jOimgeS5iOacjeWKoeWVhuasuumql+S9oOOAglxuPGEgaHJlZj1cImh0dHBzOi8vanVlamluLmltL3Bvc3QvNWNmZjg1OGE2ZmI5YTA3ZWQ4NDIzOGVjXCI+6L2s5LiA56+HIEROUyDliqvmjIHor6bop6Ppk77mjqU8L2E+PC9wPlxuPGgyPuaOpeWPo+WuieWFqDwvaDI+XG48aDM+5pWw5o2u5bqTPC9oMz5cbjxwPuaVsOaNruW6k++8jOaPkuWFpeaVsOaNruW6k+eahOWPguaVsO+8jOWcqOaJp+ihjCBzcWwg55qE5pe25YCZ5bCP5b+D5a6D5oqK5L2g5pW05Liq5pWw5o2u5bqT6KGo57uZ5Yig5LqG44CC6L+Z6YeM55qE5pS75Ye757G75Ly8IDxjb2RlPnhzczwvY29kZT4g5pS75Ye777yM6YCa6L+H5Lyg6L6T44CB5ou85o6l5LiA5Lqb5a2X56ym5Liy5pS55Y+Y5Y6f5pys55qEIHNxbCDor63kuYk8L3A+XG48aDM+5o6o6YCB5raI5oGvPC9oMz5cbjxwPuavlOWmguefreS/oeWPkemAgea2iOaBr++8jOmdnuW4uOeahOacieS7o+ihqOaAp+OAgumAmui/h+aOpeWPo+eahOWPguaVsOS8oOmAku+8jOS7peWPiuacgOWQjueahOWPkemAgeWGheWuue+8jOWPr+S7peaOqOa1i+WHuuS9oOeahOaOqOmAgeWGheWuueeahOe7hOWQiOebuOWFs+aWueW8j++8jOWwseWPr+S7pemAmui/h+S4jeiJr+WPguaVsO+8jOW+iOaWueS+v+eahOWPkemAgeeahOS4gOS6m+S4jeWQiOazleeahOS/oeaBr++8jOaIluacieavkumTvuaOpee7meeUqOaIt+OAguino+WGs+aWueW8j+WwseaYr+S4jeimgeebuOS/oeeUqOaIt+S8oOWFpeeahOS7u+S9leWPguaVsO+8jOWvueWPguaVsOi/m+ihjOagoemqjO+8jOWPkemAgeWGheWuueWwvemHj+WPr+mAieaLqeWMuemFjeaooeW8j++8jOWmgiBjb2RlIOWAvOaYoOWwhO+8jOWvueS4jeWQiOazleeahOWPguaVsOaJjeaciem7mOiupOWGheWuueWPkemAgeOAgjwvcD5cbjxoMj5ERE9T77ya5YiG5biD5byP5ouS57ud5pyN5YqhPC9oMj5cbjxwPuWwseaYr+W+iOWkmuivt+axguWkp+mHj+a2jOWFpeS9oOeahOacjeWKoeWZqO+8jOWvvOiHtOWug+S7rOmDveayoeacieepuumXsuWPr+S7peWTjeW6lOecn+ato+eahOeUqOaIt+ivt+axguOAgumAmui/hyBUQ1Ag6L+e5o6l77yM5oiR5Lus55+l6YGT5bu656uL6L+e5o6l6ZyA6KaB5LiJ5qyh56Gu6K6k77yM5LiA6Iis5pS75Ye76ICF5Y+v5Lul5Lyq6YCgIGlwLCDlj5HotbflpKfph4/ov57mjqXor7fmsYLvvIzljbTlj4jkuI3noa7orqQgPSA9IOWvvOiHtOacjeWKoeWZqOeZveeZveetieW+heebtOWIsOi2heaXtuOAguWFtuasoeWPr+S7peWAn+eUqOWIq+eahOeUqOaIt++8jOWcqOS4gOS4quWkp+a1gemHj+eUqOaIt+e9keermeWcsOaWueeahOafkOS4gOS4qumhtemdouS4iuS6hu+8jOmAmui/hyA8Y29kZT54c3M8L2NvZGU+IOm7mOiupOWPkei1t+WvueaUu+WHu+e9keermeeahOivt+axgu+8jOW5tuWPkemAgeW+iOWkp+eahOaVsOaNru+8jOS9huavj+asoeWPkemAgeW+iOWwkeeahOWtl+iKgu+8jOi/meS6m+eUqOaIt+Wwseiiq+W9k+aIkOS6huiCiem4oe+8jOeEtuWQjuS9v+WFtueYq+eXquOAguino+WGs+mYsuiMg++8muWinuWKoOacuuWZqO+8jCDlr7nlkIzkuIDkuKppcCDnmoTov4flpJror7fmsYLov5vooYzpmLLojIPjgII8L3A+XG48L2Rpdj48L3RlbXBsYXRlPiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL3NhZmUubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmIwODcyN2NcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4zX3Z1ZUAzLjUuM190eXBlc2NyaXB0QDUuNS40X193ZWJwYWNrQDUuOTQuMF93ZWJwYWNrLV9mdXFrd2dncGxoZXkzb2l2dHdlMnN0ZG82ZS9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[538],{157:function(e,p,o){o.r(p),o.d(p,{default:function(){return d}});var c=o(762);const h={class:"component-safe"},s={};var d=(0,o(314).A)(s,[["render",function(e,p){return(0,c.uX)(),(0,c.CE)("div",h,p[0]||(p[0]=[(0,c.Fv)('

安全意识

你要离开家了, 所有的父母都会说,路上注意安全,可见安全是多么的重要!那么作为软件开发,有哪些危险使我们要知道并避免的呢? 下面我说一些基本的需要知道的安全攻击, 以及应对方案。

ps 作为一个安全小白,了解各种各样的防范方案真的太难了,我是真的水🤭。欢迎补充,以增长见识

XSS: 跨站脚本攻击

在用户可以输入的地方,并且将作为代码编译时,攻击者可以通过输入一个脚本地址的方式进行对页面注入脚本攻击。解决方式: 任何用户输入的地方都不要相信,对用户输入内容进行转义,如 < 使用转义字符串 &lt; 代替。

CSRF: 跨站伪装请求攻击

在用户已登录的情况下,伪装用户的身份发起请求,进行相关攻击。解决方式,确认用户的身份。比较好理解的解决方式是: 二次确认,通过用户的二次确认确认请求方为真实用户。然后就是 X-Requested-With 请求标志,通过该请求头设置标志位 ajax 请求,可以一定程度阻止跨域的伪装。Anti-CSRF TOKEN 方案:通过服务端与客户端唯一的 token 值进行校验,可以看做一个暗号,让别人无法伪装!

网络劫持

Jsonp 劫持

我们都知道 jsonp 就是为了解决跨域的,如果传输信息设计到比较敏感的数据,那么别人可以很方便调用你的接口,获取你的数据,存储在自己的数据库中。解决方法,添加脚本可运行白名单,不要传输敏感信息。

HTTP 劫持。

HTTP 是明文传输,所以运营商可以知道你的代码是什么,然后在里面加一点小广告什么的,改变你的内容。解决方法就是使用 https 协议,可耻的运营商

DNS 劫持

通过域名解析我们才能找到对域名的服务器 ip 地址,劫持了 DNS 就可以给你返回一个错误的 ip 地址。在 dns 解析中,会先在本机搜索域名解析记录,无相关记录像 dns 服务商发起请求。所以要么你本地信息被篡改,要么服务商欺骗你。 转一篇 DNS 劫持详解链接

接口安全

数据库

数据库,插入数据库的参数,在执行 sql 的时候小心它把你整个数据库表给删了。这里的攻击类似 xss 攻击,通过传输、拼接一些字符串改变原本的 sql 语义

推送消息

比如短信发送消息,非常的有代表性。通过接口的参数传递,以及最后的发送内容,可以推测出你的推送内容的组合相关方式,就可以通过不良参数,很方便的发送的一些不合法的信息,或有毒链接给用户。解决方式就是不要相信用户传入的任何参数,对参数进行校验,发送内容尽量可选择匹配模式,如 code 值映射,对不合法的参数才有默认内容发送。

DDOS:分布式拒绝服务

就是很多请求大量涌入你的服务器,导致它们都没有空闲可以响应真正的用户请求。通过 TCP 连接,我们知道建立连接需要三次确认,一般攻击者可以伪造 ip, 发起大量连接请求,却又不确认 = = 导致服务器白白等待直到超时。其次可以借用别的用户,在一个大流量用户网站地方的某一个页面上了,通过 xss 默认发起对攻击网站的请求,并发送很大的数据,但每次发送很少的字节,这些用户就被当成了肉鸡,然后使其瘫痪。解决防范:增加机器, 对同一个ip 的过多请求进行防范。

',21)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM4LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sa0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXlCSixNQXpCSUMsRUF5QkpDLEVBQUEsS0FBQUEsRUFBQSxLQXpCTkMsRUFBQUEsRUFBQUEsSUFBQSx3bkQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vc2FmZS5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vc2FmZS5tZD9jZTYzIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXNhZmVcIj48aDE+5a6J5YWo5oSP6K+GPC9oMT5cbjxwPuS9oOimgeemu+W8gOWutuS6hiwg5omA5pyJ55qE54i25q+N6YO95Lya6K+077yM6Lev5LiK5rOo5oSP5a6J5YWo77yM5Y+v6KeB5a6J5YWo5piv5aSa5LmI55qE6YeN6KaB77yB6YKj5LmI5L2c5Li66L2v5Lu25byA5Y+R77yM5pyJ5ZOq5Lqb5Y2x6Zmp5L2/5oiR5Lus6KaB55+l6YGT5bm26YG/5YWN55qE5ZGi77yfXG7kuIvpnaLmiJHor7TkuIDkupvln7rmnKznmoTpnIDopoHnn6XpgZPnmoTlronlhajmlLvlh7ssIOS7peWPiuW6lOWvueaWueahiOOAgjwvcD5cbjxibG9ja3F1b3RlPlxuPHA+cHMg5L2c5Li65LiA5Liq5a6J5YWo5bCP55m977yM5LqG6Kej5ZCE56eN5ZCE5qC355qE6Ziy6IyD5pa55qGI55yf55qE5aSq6Zq+5LqG77yM5oiR5piv55yf55qE5rC08J+kreOAguasoui/juihpeWFhe+8jOS7peWinumVv+ingeivhjwvcD5cbjwvYmxvY2txdW90ZT5cbjxoMj5YU1M6IOi3qOermeiEmuacrOaUu+WHuzwvaDI+XG48cD7lnKjnlKjmiLflj6/ku6XovpPlhaXnmoTlnLDmlrnvvIzlubbkuJTlsIbkvZzkuLrku6PnoIHnvJbor5Hml7bvvIzmlLvlh7vogIXlj6/ku6XpgJrov4fovpPlhaXkuIDkuKrohJrmnKzlnLDlnYDnmoTmlrnlvI/ov5vooYzlr7npobXpnaLms6jlhaXohJrmnKzmlLvlh7vjgILop6PlhrPmlrnlvI86IOS7u+S9leeUqOaIt+i+k+WFpeeahOWcsOaWuemDveS4jeimgeebuOS/oe+8jOWvueeUqOaIt+i+k+WFpeWGheWuuei/m+ihjOi9rOS5ie+8jOWmgiA8Y29kZT4mbHQ7PC9jb2RlPiDkvb/nlKjovazkuYnlrZfnrKbkuLIgPGNvZGU+JmFtcDtsdDs8L2NvZGU+IOS7o+abv+OAgjwvcD5cbjxoMj5DU1JGOiDot6jnq5nkvKroo4Xor7fmsYLmlLvlh7s8L2gyPlxuPHA+5Zyo55So5oi35bey55m75b2V55qE5oOF5Ya15LiL77yM5Lyq6KOF55So5oi355qE6Lqr5Lu95Y+R6LW36K+35rGC77yM6L+b6KGM55u45YWz5pS75Ye744CC6Kej5Yaz5pa55byP77yM56Gu6K6k55So5oi355qE6Lqr5Lu944CC5q+U6L6D5aW955CG6Kej55qE6Kej5Yaz5pa55byP5pivOiDkuozmrKHnoa7orqTvvIzpgJrov4fnlKjmiLfnmoTkuozmrKHnoa7orqTnoa7orqTor7fmsYLmlrnkuLrnnJ/lrp7nlKjmiLfjgILnhLblkI7lsLHmmK8gWC1SZXF1ZXN0ZWQtV2l0aCAg6K+35rGC5qCH5b+X77yM6YCa6L+H6K+l6K+35rGC5aS06K6+572u5qCH5b+X5L2NIDxjb2RlPmFqYXg8L2NvZGU+IOivt+axgu+8jOWPr+S7peS4gOWumueoi+W6pumYu+atoui3qOWfn+eahOS8quijheOAgjxjb2RlPkFudGktQ1NSRiBUT0tFTjwvY29kZT4g5pa55qGI77ya6YCa6L+H5pyN5Yqh56uv5LiO5a6i5oi356uv5ZSv5LiA55qEIHRva2VuIOWAvOi/m+ihjOagoemqjO+8jOWPr+S7peeci+WBmuS4gOS4quaal+WPt++8jOiuqeWIq+S6uuaXoOazleS8quijhe+8gTwvcD5cbjxoMj7nvZHnu5zliqvmjIE8L2gyPlxuPGgzPkpzb25wIOWKq+aMgTwvaDM+XG48cD7miJHku6zpg73nn6XpgZMgPGNvZGU+anNvbnA8L2NvZGU+IOWwseaYr+S4uuS6huino+WGs+i3qOWfn+eahO+8jOWmguaenOS8oOi+k+S/oeaBr+iuvuiuoeWIsOavlOi+g+aVj+aEn+eahOaVsOaNru+8jOmCo+S5iOWIq+S6uuWPr+S7peW+iOaWueS+v+iwg+eUqOS9oOeahOaOpeWPo++8jOiOt+WPluS9oOeahOaVsOaNru+8jOWtmOWCqOWcqOiHquW3seeahOaVsOaNruW6k+S4reOAguino+WGs+aWueazle+8jOa3u+WKoOiEmuacrOWPr+i/kOihjOeZveWQjeWNle+8jOS4jeimgeS8oOi+k+aVj+aEn+S/oeaBr+OAgjwvcD5cbjxoMz5IVFRQIOWKq+aMgeOAgjwvaDM+XG48cD5IVFRQIOaYr+aYjuaWh+S8oOi+k++8jOaJgOS7pei/kOiQpeWVhuWPr+S7peefpemBk+S9oOeahOS7o+eggeaYr+S7gOS5iO+8jOeEtuWQjuWcqOmHjOmdouWKoOS4gOeCueWwj+W5v+WRiuS7gOS5iOeahO+8jOaUueWPmOS9oOeahOWGheWuueOAguino+WGs+aWueazleWwseaYr+S9v+eUqCBodHRwcyDljY/orq7vvIzlj6/ogLvnmoTov5DokKXllYY8L3A+XG48aDM+RE5TIOWKq+aMgTwvaDM+XG48cD7pgJrov4fln5/lkI3op6PmnpDmiJHku6zmiY3og73mib7liLDlr7nln5/lkI3nmoTmnI3liqHlmaggaXAg5Zyw5Z2A77yM5Yqr5oyB5LqGIEROUyDlsLHlj6/ku6Xnu5nkvaDov5Tlm57kuIDkuKrplJnor6/nmoQgaXAg5Zyw5Z2A44CC5ZyoIGRucyDop6PmnpDkuK3vvIzkvJrlhYjlnKjmnKzmnLrmkJzntKLln5/lkI3op6PmnpDorrDlvZXvvIzml6Dnm7jlhbPorrDlvZXlg48gZG5zIOacjeWKoeWVhuWPkei1t+ivt+axguOAguaJgOS7peimgeS5iOS9oOacrOWcsOS/oeaBr+iiq+evoeaUue+8jOimgeS5iOacjeWKoeWVhuasuumql+S9oOOAglxuPGEgaHJlZj1cImh0dHBzOi8vanVlamluLmltL3Bvc3QvNWNmZjg1OGE2ZmI5YTA3ZWQ4NDIzOGVjXCI+6L2s5LiA56+HIEROUyDliqvmjIHor6bop6Ppk77mjqU8L2E+PC9wPlxuPGgyPuaOpeWPo+WuieWFqDwvaDI+XG48aDM+5pWw5o2u5bqTPC9oMz5cbjxwPuaVsOaNruW6k++8jOaPkuWFpeaVsOaNruW6k+eahOWPguaVsO+8jOWcqOaJp+ihjCBzcWwg55qE5pe25YCZ5bCP5b+D5a6D5oqK5L2g5pW05Liq5pWw5o2u5bqT6KGo57uZ5Yig5LqG44CC6L+Z6YeM55qE5pS75Ye757G75Ly8IDxjb2RlPnhzczwvY29kZT4g5pS75Ye777yM6YCa6L+H5Lyg6L6T44CB5ou85o6l5LiA5Lqb5a2X56ym5Liy5pS55Y+Y5Y6f5pys55qEIHNxbCDor63kuYk8L3A+XG48aDM+5o6o6YCB5raI5oGvPC9oMz5cbjxwPuavlOWmguefreS/oeWPkemAgea2iOaBr++8jOmdnuW4uOeahOacieS7o+ihqOaAp+OAgumAmui/h+aOpeWPo+eahOWPguaVsOS8oOmAku+8jOS7peWPiuacgOWQjueahOWPkemAgeWGheWuue+8jOWPr+S7peaOqOa1i+WHuuS9oOeahOaOqOmAgeWGheWuueeahOe7hOWQiOebuOWFs+aWueW8j++8jOWwseWPr+S7pemAmui/h+S4jeiJr+WPguaVsO+8jOW+iOaWueS+v+eahOWPkemAgeeahOS4gOS6m+S4jeWQiOazleeahOS/oeaBr++8jOaIluacieavkumTvuaOpee7meeUqOaIt+OAguino+WGs+aWueW8j+WwseaYr+S4jeimgeebuOS/oeeUqOaIt+S8oOWFpeeahOS7u+S9leWPguaVsO+8jOWvueWPguaVsOi/m+ihjOagoemqjO+8jOWPkemAgeWGheWuueWwvemHj+WPr+mAieaLqeWMuemFjeaooeW8j++8jOWmgiBjb2RlIOWAvOaYoOWwhO+8jOWvueS4jeWQiOazleeahOWPguaVsOaJjeaciem7mOiupOWGheWuueWPkemAgeOAgjwvcD5cbjxoMj5ERE9T77ya5YiG5biD5byP5ouS57ud5pyN5YqhPC9oMj5cbjxwPuWwseaYr+W+iOWkmuivt+axguWkp+mHj+a2jOWFpeS9oOeahOacjeWKoeWZqO+8jOWvvOiHtOWug+S7rOmDveayoeacieepuumXsuWPr+S7peWTjeW6lOecn+ato+eahOeUqOaIt+ivt+axguOAgumAmui/hyBUQ1Ag6L+e5o6l77yM5oiR5Lus55+l6YGT5bu656uL6L+e5o6l6ZyA6KaB5LiJ5qyh56Gu6K6k77yM5LiA6Iis5pS75Ye76ICF5Y+v5Lul5Lyq6YCgIGlwLCDlj5HotbflpKfph4/ov57mjqXor7fmsYLvvIzljbTlj4jkuI3noa7orqQgPSA9IOWvvOiHtOacjeWKoeWZqOeZveeZveetieW+heebtOWIsOi2heaXtuOAguWFtuasoeWPr+S7peWAn+eUqOWIq+eahOeUqOaIt++8jOWcqOS4gOS4quWkp+a1gemHj+eUqOaIt+e9keermeWcsOaWueeahOafkOS4gOS4qumhtemdouS4iuS6hu+8jOmAmui/hyA8Y29kZT54c3M8L2NvZGU+IOm7mOiupOWPkei1t+WvueaUu+WHu+e9keermeeahOivt+axgu+8jOW5tuWPkemAgeW+iOWkp+eahOaVsOaNru+8jOS9huavj+asoeWPkemAgeW+iOWwkeeahOWtl+iKgu+8jOi/meS6m+eUqOaIt+Wwseiiq+W9k+aIkOS6huiCiem4oe+8jOeEtuWQjuS9v+WFtueYq+eXquOAguino+WGs+mYsuiMg++8muWinuWKoOacuuWZqO+8jCDlr7nlkIzkuIDkuKppcCDnmoTov4flpJror7fmsYLov5vooYzpmLLojIPjgII8L3A+XG48L2Rpdj48L3RlbXBsYXRlPiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL3NhZmUubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmIwODcyN2NcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4xMl92dWVAMy41LjEyX3R5cGVzY3JpcHRANS42LjNfX3dlYnBhY2tANS45NS4wX3dlYnBhY2stY2xpQDUuMS40Xy9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/272.bundle.js b/541.bundle.js similarity index 98% rename from 272.bundle.js rename to 541.bundle.js index e59406c..805650f 100644 --- a/272.bundle.js +++ b/541.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[272],{272:(n,e,s)=>{s.r(e),s.d(e,{default:()=>t});const t='### canvas\n\ncanvas 是 HTML 5 新出的图片元素,它是 2d 绘图 API, 使用 JavaScript 调用API 可以画 lines, shapes, images, text 甚至其他你想话的, 并且不需要什么插件。\n\n它是作为一个画布存在在网页中, 画布上有你绘制的图案,利用 js 你可以实时的改变画布上的图案,以实现动画。\n\n它的支持性也挺好,IE 9 开始支持,Chrome和Opera 9+ 也支持。\n\n### svg\n\nSVG 可缩放矢量图形, 是 XML 用来描述二维图形和绘图程序的语言。目前SVG在Firefox、Opera、Webkit浏览器、IE等浏览器中已经部分实现。\n\n> 什么是 XML \n> 它是一种类似于 HTML 的标记语言,设计宗旨在于传输数据而不是显示数据。\n> XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。通过读取你可以获取存储于其中的数据\n\n\nSVG可以通过定义必要的线和形状来创建一个图形,也可以修改已有的位图,或者将这两种方式结合起来创建图形。图形和其组成部分可以变形,可以合成,还可以通过滤镜完全改变外观。\n\nSVG提供了一些元素,用于定义圆形、矩形、简单或复杂的曲线,以及其他形状。\n一个简单的SVG文档由 `` 根元素和基本的形状元素构成。另外还有一个g元素,它用来把若干个基本形状编成一个组。\n\neg:\n```\n\n\n \n\n \n\n SVG\n\n\n\n```\n\n可以看到 svg 是在内部组合各种元素绘制形成相应的图案。 并且矢量顾名思义是可以自由缩放的,根据屏幕像素点进行缩放,保留了图案的高清晰度。\n\n### 总结\n通过以上,我们可以知道 svg 和 canvas 的相同点,它们都是可以绘图的元素,并有自身的用法。\ncanvas 是一块画布,纯用 js 去画画的。根据你的 js 编写,动态去渲染画布上的图案,适用一些大量数据交互修改的,比较复杂的动画。由于它仅仅是根据你设定的大小,它是依赖于分辨率的。\n 而 svg 是一个个元素组成在一起的, 包含 animate 元素,可做一些小小的动画, 它的矢量优点也更适合做一些高保真的静态图片。'}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcyLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEscXdDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2NhbnZhcy1zdmcubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyMgIGNhbnZhc1xcblxcbmNhbnZhcyDmmK8gSFRNTCA1IOaWsOWHuueahOWbvueJh+WFg+e0oO+8jOWug+aYryAyZCDnu5jlm74gQVBJ77yMIOS9v+eUqCBKYXZhU2NyaXB0ICDosIPnlKhBUEkg5Y+v5Lul55S7ICBsaW5lcywgc2hhcGVzLCBpbWFnZXMsIHRleHQg55Sa6Iez5YW25LuW5L2g5oOz6K+d55qE77yMIOW5tuS4lOS4jemcgOimgeS7gOS5iOaPkuS7tuOAglxcblxcbuWug+aYr+S9nOS4uuS4gOS4queUu+W4g+WtmOWcqOWcqOe9kemhteS4re+8jCDnlLvluIPkuIrmnInkvaDnu5jliLbnmoTlm77moYjvvIzliKnnlKgganMg5L2g5Y+v5Lul5a6e5pe255qE5pS55Y+Y55S75biD5LiK55qE5Zu+5qGI77yM5Lul5a6e546w5Yqo55S744CCXFxuXFxu5a6D55qE5pSv5oyB5oCn5Lmf5oy65aW977yMSUUgOSDlvIDlp4vmlK/mjIHvvIxDaHJvbWXlkoxPcGVyYSA5KyDkuZ/mlK/mjIHjgIJcXG5cXG4jIyMgc3ZnXFxuXFxuU1ZHIOWPr+e8qeaUvuefoumHj+WbvuW9ou+8jCDmmK8gWE1MIOeUqOadpeaPj+i/sOS6jOe7tOWbvuW9ouWSjOe7mOWbvueoi+W6j+eahOivreiogOOAguebruWJjVNWR+WcqEZpcmVmb3jjgIFPcGVyYeOAgVdlYmtpdOa1j+iniOWZqOOAgUlF562J5rWP6KeI5Zmo5Lit5bey57uP6YOo5YiG5a6e546w44CCXFxuXFxuPiDku4DkuYjmmK8gWE1MIFxcbj4g5a6D5piv5LiA56eN57G75Ly85LqOIEhUTUwg55qE5qCH6K6w6K+t6KiA77yM6K6+6K6h5a6X5peo5Zyo5LqO5Lyg6L6T5pWw5o2u6ICM5LiN5piv5pi+56S65pWw5o2u44CCXFxuPiBYTUwg5pWw5o2u5Lul57qv5paH5pys5qC85byP6L+b6KGM5a2Y5YKo77yM5Zug5q2k5o+Q5L6b5LqG5LiA56eN54us56uL5LqO6L2v5Lu25ZKM56Gs5Lu255qE5pWw5o2u5a2Y5YKo5pa55rOV44CC6YCa6L+H6K+75Y+W5L2g5Y+v5Lul6I635Y+W5a2Y5YKo5LqO5YW25Lit55qE5pWw5o2uXFxuXFxuXFxuU1ZH5Y+v5Lul6YCa6L+H5a6a5LmJ5b+F6KaB55qE57q/5ZKM5b2i54q25p2l5Yib5bu65LiA5Liq5Zu+5b2i77yM5Lmf5Y+v5Lul5L+u5pS55bey5pyJ55qE5L2N5Zu+77yM5oiW6ICF5bCG6L+Z5Lik56eN5pa55byP57uT5ZCI6LW35p2l5Yib5bu65Zu+5b2i44CC5Zu+5b2i5ZKM5YW257uE5oiQ6YOo5YiG5Y+v5Lul5Y+Y5b2i77yM5Y+v5Lul5ZCI5oiQ77yM6L+Y5Y+v5Lul6YCa6L+H5ruk6ZWc5a6M5YWo5pS55Y+Y5aSW6KeC44CCXFxuXFxuU1ZH5o+Q5L6b5LqG5LiA5Lqb5YWD57Sg77yM55So5LqO5a6a5LmJ5ZyG5b2i44CB55+p5b2i44CB566A5Y2V5oiW5aSN5p2C55qE5puy57q/77yM5Lul5Y+K5YW25LuW5b2i54q244CCXFxu5LiA5Liq566A5Y2V55qEU1ZH5paH5qGj55SxIGA8c3ZnPmAg5qC55YWD57Sg5ZKM5Z+65pys55qE5b2i54q25YWD57Sg5p6E5oiQ44CC5Y+m5aSW6L+Y5pyJ5LiA5LiqZ+WFg+e0oO+8jOWug+eUqOadpeaKiuiLpeW5suS4quWfuuacrOW9oueKtue8luaIkOS4gOS4que7hOOAglxcblxcbmVnOlxcbmBgYFxcbjxzdmcgdmVyc2lvbj1cXFwiMS4xXFxcIlxcbiAgICAgYmFzZVByb2ZpbGU9XFxcImZ1bGxcXFwiXFxuICAgICB3aWR0aD1cXFwiMzAwXFxcIiBoZWlnaHQ9XFxcIjIwMFxcXCJcXG4gICAgIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+XFxuXFxuICA8cmVjdCB3aWR0aD1cXFwiMTAwJVxcXCIgaGVpZ2h0PVxcXCIxMDAlXFxcIiBmaWxsPVxcXCJyZWRcXFwiIC8+XFxuXFxuICA8Y2lyY2xlIGN4PVxcXCIxNTBcXFwiIGN5PVxcXCIxMDBcXFwiIHI9XFxcIjgwXFxcIiBmaWxsPVxcXCJncmVlblxcXCIgLz5cXG5cXG4gIDx0ZXh0IHg9XFxcIjE1MFxcXCIgeT1cXFwiMTI1XFxcIiBmb250LXNpemU9XFxcIjYwXFxcIiB0ZXh0LWFuY2hvcj1cXFwibWlkZGxlXFxcIiBmaWxsPVxcXCJ3aGl0ZVxcXCI+U1ZHPC90ZXh0Plxcblxcbjwvc3ZnPlxcblxcbmBgYFxcblxcbuWPr+S7peeci+WIsCBzdmcg5piv5Zyo5YaF6YOo57uE5ZCI5ZCE56eN5YWD57Sg57uY5Yi25b2i5oiQ55u45bqU55qE5Zu+5qGI44CCIOW5tuS4lOefoumHj+mhvuWQjeaAneS5ieaYr+WPr+S7peiHqueUsee8qeaUvueahO+8jOagueaNruWxj+W5leWDj+e0oOeCuei/m+ihjOe8qeaUvu+8jOS/neeVmeS6huWbvuahiOeahOmrmOa4heaZsOW6puOAglxcblxcbiMjIyDmgLvnu5NcXG7pgJrov4fku6XkuIrvvIzmiJHku6zlj6/ku6Xnn6XpgZMgc3ZnIOWSjCBjYW52YXMg55qE55u45ZCM54K577yM5a6D5Lus6YO95piv5Y+v5Lul57uY5Zu+55qE5YWD57Sg77yM5bm25pyJ6Ieq6Lqr55qE55So5rOV44CCXFxuY2FudmFzIOaYr+S4gOWdl+eUu+W4g++8jOe6r+eUqCBqcyDljrvnlLvnlLvnmoTjgILmoLnmja7kvaDnmoQganMg57yW5YaZ77yM5Yqo5oCB5Y675riy5p+T55S75biD5LiK55qE5Zu+5qGI77yM6YCC55So5LiA5Lqb5aSn6YeP5pWw5o2u5Lqk5LqS5L+u5pS555qE77yM5q+U6L6D5aSN5p2C55qE5Yqo55S744CC55Sx5LqO5a6D5LuF5LuF5piv5qC55o2u5L2g6K6+5a6a55qE5aSn5bCP77yM5a6D5piv5L6d6LWW5LqO5YiG6L6o546H55qE44CCXFxuIOiAjCBzdmcg5piv5LiA5Liq5Liq5YWD57Sg57uE5oiQ5Zyo5LiA6LW355qE77yMIOWMheWQqyBhbmltYXRlIOWFg+e0oO+8jOWPr+WBmuS4gOS6m+Wwj+Wwj+eahOWKqOeUu++8jCDlroPnmoTnn6Lph4/kvJjngrnkuZ/mm7TpgILlkIjlgZrkuIDkupvpq5jkv53nnJ/nmoTpnZnmgIHlm77niYfjgIJcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[541],{541:(n,e,s)=>{s.r(e),s.d(e,{default:()=>t});const t='### canvas\n\ncanvas 是 HTML 5 新出的图片元素,它是 2d 绘图 API, 使用 JavaScript 调用API 可以画 lines, shapes, images, text 甚至其他你想话的, 并且不需要什么插件。\n\n它是作为一个画布存在在网页中, 画布上有你绘制的图案,利用 js 你可以实时的改变画布上的图案,以实现动画。\n\n它的支持性也挺好,IE 9 开始支持,Chrome和Opera 9+ 也支持。\n\n### svg\n\nSVG 可缩放矢量图形, 是 XML 用来描述二维图形和绘图程序的语言。目前SVG在Firefox、Opera、Webkit浏览器、IE等浏览器中已经部分实现。\n\n> 什么是 XML \n> 它是一种类似于 HTML 的标记语言,设计宗旨在于传输数据而不是显示数据。\n> XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。通过读取你可以获取存储于其中的数据\n\n\nSVG可以通过定义必要的线和形状来创建一个图形,也可以修改已有的位图,或者将这两种方式结合起来创建图形。图形和其组成部分可以变形,可以合成,还可以通过滤镜完全改变外观。\n\nSVG提供了一些元素,用于定义圆形、矩形、简单或复杂的曲线,以及其他形状。\n一个简单的SVG文档由 `` 根元素和基本的形状元素构成。另外还有一个g元素,它用来把若干个基本形状编成一个组。\n\neg:\n```\n\n\n \n\n \n\n SVG\n\n\n\n```\n\n可以看到 svg 是在内部组合各种元素绘制形成相应的图案。 并且矢量顾名思义是可以自由缩放的,根据屏幕像素点进行缩放,保留了图案的高清晰度。\n\n### 总结\n通过以上,我们可以知道 svg 和 canvas 的相同点,它们都是可以绘图的元素,并有自身的用法。\ncanvas 是一块画布,纯用 js 去画画的。根据你的 js 编写,动态去渲染画布上的图案,适用一些大量数据交互修改的,比较复杂的动画。由于它仅仅是根据你设定的大小,它是依赖于分辨率的。\n 而 svg 是一个个元素组成在一起的, 包含 animate 元素,可做一些小小的动画, 它的矢量优点也更适合做一些高保真的静态图片。'}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQxLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEscXdDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2NhbnZhcy1zdmcubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyMgIGNhbnZhc1xcblxcbmNhbnZhcyDmmK8gSFRNTCA1IOaWsOWHuueahOWbvueJh+WFg+e0oO+8jOWug+aYryAyZCDnu5jlm74gQVBJ77yMIOS9v+eUqCBKYXZhU2NyaXB0ICDosIPnlKhBUEkg5Y+v5Lul55S7ICBsaW5lcywgc2hhcGVzLCBpbWFnZXMsIHRleHQg55Sa6Iez5YW25LuW5L2g5oOz6K+d55qE77yMIOW5tuS4lOS4jemcgOimgeS7gOS5iOaPkuS7tuOAglxcblxcbuWug+aYr+S9nOS4uuS4gOS4queUu+W4g+WtmOWcqOWcqOe9kemhteS4re+8jCDnlLvluIPkuIrmnInkvaDnu5jliLbnmoTlm77moYjvvIzliKnnlKgganMg5L2g5Y+v5Lul5a6e5pe255qE5pS55Y+Y55S75biD5LiK55qE5Zu+5qGI77yM5Lul5a6e546w5Yqo55S744CCXFxuXFxu5a6D55qE5pSv5oyB5oCn5Lmf5oy65aW977yMSUUgOSDlvIDlp4vmlK/mjIHvvIxDaHJvbWXlkoxPcGVyYSA5KyDkuZ/mlK/mjIHjgIJcXG5cXG4jIyMgc3ZnXFxuXFxuU1ZHIOWPr+e8qeaUvuefoumHj+WbvuW9ou+8jCDmmK8gWE1MIOeUqOadpeaPj+i/sOS6jOe7tOWbvuW9ouWSjOe7mOWbvueoi+W6j+eahOivreiogOOAguebruWJjVNWR+WcqEZpcmVmb3jjgIFPcGVyYeOAgVdlYmtpdOa1j+iniOWZqOOAgUlF562J5rWP6KeI5Zmo5Lit5bey57uP6YOo5YiG5a6e546w44CCXFxuXFxuPiDku4DkuYjmmK8gWE1MIFxcbj4g5a6D5piv5LiA56eN57G75Ly85LqOIEhUTUwg55qE5qCH6K6w6K+t6KiA77yM6K6+6K6h5a6X5peo5Zyo5LqO5Lyg6L6T5pWw5o2u6ICM5LiN5piv5pi+56S65pWw5o2u44CCXFxuPiBYTUwg5pWw5o2u5Lul57qv5paH5pys5qC85byP6L+b6KGM5a2Y5YKo77yM5Zug5q2k5o+Q5L6b5LqG5LiA56eN54us56uL5LqO6L2v5Lu25ZKM56Gs5Lu255qE5pWw5o2u5a2Y5YKo5pa55rOV44CC6YCa6L+H6K+75Y+W5L2g5Y+v5Lul6I635Y+W5a2Y5YKo5LqO5YW25Lit55qE5pWw5o2uXFxuXFxuXFxuU1ZH5Y+v5Lul6YCa6L+H5a6a5LmJ5b+F6KaB55qE57q/5ZKM5b2i54q25p2l5Yib5bu65LiA5Liq5Zu+5b2i77yM5Lmf5Y+v5Lul5L+u5pS55bey5pyJ55qE5L2N5Zu+77yM5oiW6ICF5bCG6L+Z5Lik56eN5pa55byP57uT5ZCI6LW35p2l5Yib5bu65Zu+5b2i44CC5Zu+5b2i5ZKM5YW257uE5oiQ6YOo5YiG5Y+v5Lul5Y+Y5b2i77yM5Y+v5Lul5ZCI5oiQ77yM6L+Y5Y+v5Lul6YCa6L+H5ruk6ZWc5a6M5YWo5pS55Y+Y5aSW6KeC44CCXFxuXFxuU1ZH5o+Q5L6b5LqG5LiA5Lqb5YWD57Sg77yM55So5LqO5a6a5LmJ5ZyG5b2i44CB55+p5b2i44CB566A5Y2V5oiW5aSN5p2C55qE5puy57q/77yM5Lul5Y+K5YW25LuW5b2i54q244CCXFxu5LiA5Liq566A5Y2V55qEU1ZH5paH5qGj55SxIGA8c3ZnPmAg5qC55YWD57Sg5ZKM5Z+65pys55qE5b2i54q25YWD57Sg5p6E5oiQ44CC5Y+m5aSW6L+Y5pyJ5LiA5LiqZ+WFg+e0oO+8jOWug+eUqOadpeaKiuiLpeW5suS4quWfuuacrOW9oueKtue8luaIkOS4gOS4que7hOOAglxcblxcbmVnOlxcbmBgYFxcbjxzdmcgdmVyc2lvbj1cXFwiMS4xXFxcIlxcbiAgICAgYmFzZVByb2ZpbGU9XFxcImZ1bGxcXFwiXFxuICAgICB3aWR0aD1cXFwiMzAwXFxcIiBoZWlnaHQ9XFxcIjIwMFxcXCJcXG4gICAgIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+XFxuXFxuICA8cmVjdCB3aWR0aD1cXFwiMTAwJVxcXCIgaGVpZ2h0PVxcXCIxMDAlXFxcIiBmaWxsPVxcXCJyZWRcXFwiIC8+XFxuXFxuICA8Y2lyY2xlIGN4PVxcXCIxNTBcXFwiIGN5PVxcXCIxMDBcXFwiIHI9XFxcIjgwXFxcIiBmaWxsPVxcXCJncmVlblxcXCIgLz5cXG5cXG4gIDx0ZXh0IHg9XFxcIjE1MFxcXCIgeT1cXFwiMTI1XFxcIiBmb250LXNpemU9XFxcIjYwXFxcIiB0ZXh0LWFuY2hvcj1cXFwibWlkZGxlXFxcIiBmaWxsPVxcXCJ3aGl0ZVxcXCI+U1ZHPC90ZXh0Plxcblxcbjwvc3ZnPlxcblxcbmBgYFxcblxcbuWPr+S7peeci+WIsCBzdmcg5piv5Zyo5YaF6YOo57uE5ZCI5ZCE56eN5YWD57Sg57uY5Yi25b2i5oiQ55u45bqU55qE5Zu+5qGI44CCIOW5tuS4lOefoumHj+mhvuWQjeaAneS5ieaYr+WPr+S7peiHqueUsee8qeaUvueahO+8jOagueaNruWxj+W5leWDj+e0oOeCuei/m+ihjOe8qeaUvu+8jOS/neeVmeS6huWbvuahiOeahOmrmOa4heaZsOW6puOAglxcblxcbiMjIyDmgLvnu5NcXG7pgJrov4fku6XkuIrvvIzmiJHku6zlj6/ku6Xnn6XpgZMgc3ZnIOWSjCBjYW52YXMg55qE55u45ZCM54K577yM5a6D5Lus6YO95piv5Y+v5Lul57uY5Zu+55qE5YWD57Sg77yM5bm25pyJ6Ieq6Lqr55qE55So5rOV44CCXFxuY2FudmFzIOaYr+S4gOWdl+eUu+W4g++8jOe6r+eUqCBqcyDljrvnlLvnlLvnmoTjgILmoLnmja7kvaDnmoQganMg57yW5YaZ77yM5Yqo5oCB5Y675riy5p+T55S75biD5LiK55qE5Zu+5qGI77yM6YCC55So5LiA5Lqb5aSn6YeP5pWw5o2u5Lqk5LqS5L+u5pS555qE77yM5q+U6L6D5aSN5p2C55qE5Yqo55S744CC55Sx5LqO5a6D5LuF5LuF5piv5qC55o2u5L2g6K6+5a6a55qE5aSn5bCP77yM5a6D5piv5L6d6LWW5LqO5YiG6L6o546H55qE44CCXFxuIOiAjCBzdmcg5piv5LiA5Liq5Liq5YWD57Sg57uE5oiQ5Zyo5LiA6LW355qE77yMIOWMheWQqyBhbmltYXRlIOWFg+e0oO+8jOWPr+WBmuS4gOS6m+Wwj+Wwj+eahOWKqOeUu++8jCDlroPnmoTnn6Lph4/kvJjngrnkuZ/mm7TpgILlkIjlgZrkuIDkupvpq5jkv53nnJ/nmoTpnZnmgIHlm77niYfjgIJcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/874.bundle.js b/550.bundle.js similarity index 92% rename from 874.bundle.js rename to 550.bundle.js index 1adf14a..42f404c 100644 --- a/874.bundle.js +++ b/550.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[874],{874:function(i,l,o){o.r(l),o.d(l,{default:function(){return a}});var t=o(358);const e={class:"component-code-format"},s={};var a=(0,o(389).A)(s,[["render",function(i,l){return(0,t.uX)(),(0,t.CE)("div",e,l[0]||(l[0]=[(0,t.Fv)('

作为一个程序员,工作到现在,也将近半年了。公司对员工的代码提交也会有 review 流程。代码的 review 来讲,一般就是看格式、命名、逻辑是否有错,代码是否还有可以抽象的地方,这里总结一下自己遇到的代码规范方面的问题,大家一起写规范的代码,做一个看上去专业码农吧。


js规范

  • 代码的缩进了,一般是两格或四格,我司采用的是四格,这里可以根据自己喜好和公司要求了。

  • 中英文之间有空格间隔,像这样: 我专业引用 English 单词

  • 命名规范,命名的驼峰式不用再说了。这里具体情况具体分析一下

    • 变量的命名:小驼峰式
    • 函数的命名:小驼峰式
    • 常量:全部大写
    • 构造函数: 大驼峰式
    • 类的成员: 公共属性和方法就是小驼峰式, 私有属性和方法加上-前缀,然后是小驼峰式,如 `_nameFrist

css规范

  • css 的基本命名, 自己刚写的时候以为也是写小驼峰式,后来就呵呵了。css 当中就是用 - 连接了, 如 search-button,在定义 id 的时候是用小驼峰了。

  • css 名字意思定义。这里有一个 BEM 的命名法则参考,可以看看我之前写的一篇博客了解BEM

  • css 命名的统一前缀, 在一个项目中,约定好同一个前缀,可避免样式的覆盖。

  • css 样式书写顺序:

    • 显示属性:display/list-style/position/float/clear …
    • 自身属性(盒模型):width/height/margin/padding/border
    • 背景:background
    • 行高:line-height
    • 文本属性:color/font/text-decoration/text-align/…
    • 其他:cursor/z-index/zoom/overflow
    • CSS3属性:transform/transition/animation/box-shadow/border-radius
    • 如果使用CSS3的属性,如果有必要加入浏览器前缀,则按照 -webkit- / -moz- / -ms- / -o- / std的顺序进行添加,标准属性写在最后。
    • 链接的样式请严格按照如下顺序添加: a:link -> a:visited -> a:hover -> a:active
  • 代码优化,能合并的属性就合并写,没用的属性也删掉,避免重复样式,避免使用 !important


git commit log 规则

  • 首先就是commit 内容的分类了,如图片所示: 这里写图片描述定好分类,分类后面可以加你本次修改具体文件,然后组织本次修改的内容,就写好了 commit log啦。比如:feat(login): 新增登录验证功能,这表达出了你再login文件上新增了一个验证的功能。编写正确的 log 信息,能够清楚的表述你写的代码目的。

  • commit 次数,这里我们每完成一个小点的时候,都可以 commit 一下,因为commit 是记录你完成一个项目的具体过程。


= = 之前没好好总结,今天写总结的时候,也去搜了搜别的文章,发现这样的文章其实挺多,自己以前都没怎么好好看看 = = 。 欢迎补充啊~

参考

前端人员必看的CSS规范Commit message 和 Change log 编写指南

',13)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODc0LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0seUJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXVFSixNQXZFSUMsRUF1RUpDLEVBQUEsS0FBQUEsRUFBQSxLQXZFTkMsRUFBQUEsRUFBQUEsSUFBQSwwd0UiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vY29kZS1mb3JtYXQubWQiLCJ3ZWJwYWNrOi8vY2JveS1ibG9nLy4uLy4uL2Jsb2dzL21hcmtkb3duL2NvZGUtZm9ybWF0Lm1kPzlkM2EiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPjxkaXYgY2xhc3M9XCJjb21wb25lbnQtY29kZS1mb3JtYXRcIj48cD7kvZzkuLrkuIDkuKrnqIvluo/lkZjvvIzlt6XkvZzliLDnjrDlnKjvvIzkuZ/lsIbov5HljYrlubTkuobjgILlhazlj7jlr7nlkZjlt6XnmoTku6PnoIHmj5DkuqTkuZ/kvJrmnIkgcmV2aWV3IOa1geeoi+OAguS7o+eggeeahCByZXZpZXcg5p2l6K6y77yM5LiA6Iis5bCx5piv55yL5qC85byP44CB5ZG95ZCN44CB6YC76L6R5piv5ZCm5pyJ6ZSZ77yM5Luj56CB5piv5ZCm6L+Y5pyJ5Y+v5Lul5oq96LGh55qE5Zyw5pa577yM6L+Z6YeM5oC757uT5LiA5LiL6Ieq5bex6YGH5Yiw55qE5Luj56CB6KeE6IyD5pa56Z2i55qE6Zeu6aKY77yM5aSn5a625LiA6LW35YaZ6KeE6IyD55qE5Luj56CB77yM5YGa5LiA5Liq55yL5LiK5Y675LiT5Lia56CB5Yac5ZCn44CCPC9wPlxuPGhyPlxuPGg0PjxzdHJvbmc+anPop4TojIM8L3N0cm9uZz48L2g0PlxuPHVsPlxuPGxpPlxuPHA+5Luj56CB55qE57yp6L+b5LqG77yM5LiA6Iis5piv5Lik5qC85oiW5Zub5qC877yM5oiR5Y+46YeH55So55qE5piv5Zub5qC877yM6L+Z6YeM5Y+v5Lul5qC55o2u6Ieq5bex5Zac5aW95ZKM5YWs5Y+46KaB5rGC5LqG44CCPC9wPlxuPC9saT5cbjxsaT5cbjxwPuS4reiLseaWh+S5i+mXtOacieepuuagvOmXtOmalO+8jOWDj+i/meagtzogPGNvZGU+5oiR5LiT5Lia5byV55SoIEVuZ2xpc2gg5Y2V6K+NPC9jb2RlPjwvcD5cbjwvbGk+XG48bGk+XG48cD7lkb3lkI3op4TojIPvvIzlkb3lkI3nmoTpqbzls7DlvI/kuI3nlKjlho3or7TkuobjgILov5nph4zlhbfkvZPmg4XlhrXlhbfkvZPliIbmnpDkuIDkuIs8L3A+XG48dWw+XG48bGk+5Y+Y6YeP55qE5ZG95ZCN77ya5bCP6am85bOw5byPPC9saT5cbjxsaT7lh73mlbDnmoTlkb3lkI3vvJrlsI/pqbzls7DlvI88L2xpPlxuPGxpPuW4uOmHj++8muWFqOmDqOWkp+WGmTwvbGk+XG48bGk+5p6E6YCg5Ye95pWw77yaIOWkp+mpvOWzsOW8jzwvbGk+XG48bGk+57G755qE5oiQ5ZGY77yaIOWFrOWFseWxnuaAp+WSjOaWueazleWwseaYr+Wwj+mpvOWzsOW8j++8jCDnp4HmnInlsZ7mgKflkozmlrnms5XliqDkuIo8Y29kZT4tPC9jb2RlPuWJjee8gCznhLblkI7mmK/lsI/pqbzls7DlvI/vvIzlpoIgYF9uYW1lRnJpc3Q8L2xpPlxuPC91bD5cbjxocj5cbjwvbGk+XG48L3VsPlxuPGg0PjxzdHJvbmc+Y3Nz6KeE6IyDPC9zdHJvbmc+PC9oND5cbjx1bD5cbjxsaT5cbjxwPmNzcyDnmoTln7rmnKzlkb3lkI0sICDoh6rlt7HliJrlhpnnmoTml7blgJnku6XkuLrkuZ/mmK/lhpnlsI/pqbzls7DlvI/vvIzlkI7mnaXlsLHlkbXlkbXkuobjgIJjc3Mg5b2T5Lit5bCx5piv55SoIDxjb2RlPi08L2NvZGU+IOi/nuaOpeS6hu+8jCDlpoIgPGNvZGU+c2VhcmNoLWJ1dHRvbjwvY29kZT7vvIzlnKjlrprkuYkgaWQg55qE5pe25YCZ5piv55So5bCP6am85bOw5LqG44CCPC9wPlxuPC9saT5cbjxsaT5cbjxwPmNzcyDlkI3lrZfmhI/mgJ3lrprkuYnjgILov5nph4zmnInkuIDkuKogQkVNIOeahOWRveWQjeazleWImeWPguiAg++8jOWPr+S7peeci+eci+aIkeS5i+WJjeWGmeeahOS4gOevh+WNmuWuojxhIGhyZWY9XCJodHRwOi8vYmxvZy5jc2RuLm5ldC9kYWRhZGVnYW5odW8vYXJ0aWNsZS9kZXRhaWxzLzc2NjAwMjY0XCI+5LqG6KejQkVNPC9hPjwvcD5cbjwvbGk+XG48bGk+XG48cD5jc3Mg5ZG95ZCN55qE57uf5LiA5YmN57yA77yMIOWcqOS4gOS4qumhueebruS4re+8jOe6puWumuWlveWQjOS4gOS4quWJjee8gO+8jOWPr+mBv+WFjeagt+W8j+eahOimhuebluOAgjwvcD5cbjwvbGk+XG48bGk+XG48cD5jc3Mg5qC35byP5Lmm5YaZ6aG65bqP77yaPC9wPlxuPHVsPlxuPGxpPuaYvuekuuWxnuaAp++8mmRpc3BsYXkvbGlzdC1zdHlsZS9wb3NpdGlvbi9mbG9hdC9jbGVhciDigKY8L2xpPlxuPGxpPuiHqui6q+WxnuaAp++8iOebkuaooeWei++8ie+8mndpZHRoL2hlaWdodC9tYXJnaW4vcGFkZGluZy9ib3JkZXI8L2xpPlxuPGxpPuiDjOaZr++8mmJhY2tncm91bmQ8L2xpPlxuPGxpPuihjOmrmO+8mmxpbmUtaGVpZ2h0PC9saT5cbjxsaT7mlofmnKzlsZ7mgKfvvJpjb2xvci9mb250L3RleHQtZGVjb3JhdGlvbi90ZXh0LWFsaWduL+KApjwvbGk+XG48bGk+5YW25LuW77yaY3Vyc29yL3otaW5kZXgvem9vbS9vdmVyZmxvdzwvbGk+XG48bGk+Q1NTM+WxnuaAp++8mnRyYW5zZm9ybS90cmFuc2l0aW9uL2FuaW1hdGlvbi9ib3gtc2hhZG93L2JvcmRlci1yYWRpdXM8L2xpPlxuPGxpPuWmguaenOS9v+eUqENTUzPnmoTlsZ7mgKfvvIzlpoLmnpzmnInlv4XopoHliqDlhaXmtY/op4jlmajliY3nvIDvvIzliJnmjInnhacgLXdlYmtpdC0gLyAtbW96LSAvIC1tcy0gLyAtby0gL1xuc3Rk55qE6aG65bqP6L+b6KGM5re75Yqg77yM5qCH5YeG5bGe5oCn5YaZ5Zyo5pyA5ZCO44CCPC9saT5cbjxsaT7pk77mjqXnmoTmoLflvI/or7fkuKXmoLzmjInnhaflpoLkuIvpobrluo/mt7vliqDvvJogYTpsaW5rIC0mZ3Q7IGE6dmlzaXRlZCAtJmd0OyBhOmhvdmVyIC0mZ3Q7IGE6YWN0aXZlPC9saT5cbjwvdWw+XG48L2xpPlxuPGxpPlxuPHA+5Luj56CB5LyY5YyW77yM6IO95ZCI5bm255qE5bGe5oCn5bCx5ZCI5bm25YaZ77yM5rKh55So55qE5bGe5oCn5Lmf5Yig5o6J77yM6YG/5YWN6YeN5aSN5qC35byP77yM6YG/5YWN5L2/55SoIDxjb2RlPiFpbXBvcnRhbnQ8L2NvZGU+PC9wPlxuPC9saT5cbjwvdWw+XG48aHI+XG48aDQ+PHN0cm9uZz5naXQgY29tbWl0IGxvZyDop4TliJk8L3N0cm9uZz48L2g0PlxuPHVsPlxuPGxpPlxuPHA+6aaW5YWI5bCx5pivY29tbWl0IOWGheWuueeahOWIhuexu+S6hu+8jOWmguWbvueJh+aJgOekuu+8mlxuPGltZyBzcmM9XCJodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcwODMwMTQ0MTM5NDAzP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3RcIiBhbHQ9XCLov5nph4zlhpnlm77niYfmj4/ov7BcIj7lrprlpb3liIbnsbvvvIzliIbnsbvlkI7pnaLlj6/ku6XliqDkvaDmnKzmrKHkv67mlLnlhbfkvZPmlofku7bvvIznhLblkI7nu4Tnu4fmnKzmrKHkv67mlLnnmoTlhoXlrrnvvIzlsLHlhpnlpb3kuoYgY29tbWl0IGxvZ+WVpuOAguavlOWmgu+8mjxjb2RlPmZlYXQobG9naW4pOiDmlrDlop7nmbvlvZXpqozor4Hlip/og708L2NvZGU+LOi/meihqOi+vuWHuuS6huS9oOWGjWxvZ2lu5paH5Lu25LiK5paw5aKe5LqG5LiA5Liq6aqM6K+B55qE5Yqf6IO944CC57yW5YaZ5q2j56Gu55qEIGxvZyDkv6Hmga/vvIzog73lpJ/muIXmpZrnmoTooajov7DkvaDlhpnnmoTku6PnoIHnm67nmoTjgII8L3A+XG48L2xpPlxuPGxpPlxuPHA+Y29tbWl0IOasoeaVsO+8jOi/memHjOaIkeS7rOavj+WujOaIkOS4gOS4quWwj+eCueeahOaXtuWAme+8jOmDveWPr+S7pSBjb21taXQg5LiA5LiL77yM5Zug5Li6Y29tbWl0IOaYr+iusOW9leS9oOWujOaIkOS4gOS4qumhueebrueahOWFt+S9k+i/h+eoi+OAgjwvcD5cbjwvbGk+XG48L3VsPlxuPGhyPlxuPHA+PSA9IOS5i+WJjeayoeWlveWlveaAu+e7k++8jOS7iuWkqeWGmeaAu+e7k+eahOaXtuWAme+8jOS5n+WOu+aQnOS6huaQnOWIq+eahOaWh+eroO+8jOWPkeeOsOi/meagt+eahOaWh+eroOWFtuWunuaMuuWkmu+8jOiHquW3seS7peWJjemDveayoeaAjuS5iOWlveWlveeci+eciyA9ID0g44CCXG7mrKLov47ooaXlhYXllYp+PC9wPlxuPGg0PuWPguiAgzwvaDQ+XG48YmxvY2txdW90ZT5cbjxwPjxhIGhyZWY9XCJodHRwczovL3d3dy5kb3ViYW4uY29tL25vdGUvNDk5OTc2NDA1Lz90eXBlPWxpa2VcIj7liY3nq6/kurrlkZjlv4XnnIvnmoRDU1Pop4TojIM8L2E+XG48YSBocmVmPVwiaHR0cDovL3d3dy5ydWFueWlmZW5nLmNvbS9ibG9nLzIwMTYvMDEvY29tbWl0X21lc3NhZ2VfY2hhbmdlX2xvZy5odG1sXCI+Q29tbWl0IG1lc3NhZ2Ug5ZKMIENoYW5nZSBsb2cg57yW5YaZ5oyH5Y2XPC9hPjwvcD5cbjwvYmxvY2txdW90ZT5cbjwvZGl2PjwvdGVtcGxhdGU+IiwiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vY29kZS1mb3JtYXQubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZGUxNjU3NWNcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4zX3Z1ZUAzLjUuM190eXBlc2NyaXB0QDUuNS40X193ZWJwYWNrQDUuOTQuMF93ZWJwYWNrLV9mdXFrd2dncGxoZXkzb2l2dHdlMnN0ZG82ZS9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[550],{550:function(i,l,o){o.r(l),o.d(l,{default:function(){return a}});var t=o(762);const e={class:"component-code-format"},s={};var a=(0,o(314).A)(s,[["render",function(i,l){return(0,t.uX)(),(0,t.CE)("div",e,l[0]||(l[0]=[(0,t.Fv)('

作为一个程序员,工作到现在,也将近半年了。公司对员工的代码提交也会有 review 流程。代码的 review 来讲,一般就是看格式、命名、逻辑是否有错,代码是否还有可以抽象的地方,这里总结一下自己遇到的代码规范方面的问题,大家一起写规范的代码,做一个看上去专业码农吧。


js规范

  • 代码的缩进了,一般是两格或四格,我司采用的是四格,这里可以根据自己喜好和公司要求了。

  • 中英文之间有空格间隔,像这样: 我专业引用 English 单词

  • 命名规范,命名的驼峰式不用再说了。这里具体情况具体分析一下

    • 变量的命名:小驼峰式
    • 函数的命名:小驼峰式
    • 常量:全部大写
    • 构造函数: 大驼峰式
    • 类的成员: 公共属性和方法就是小驼峰式, 私有属性和方法加上-前缀,然后是小驼峰式,如 `_nameFrist

css规范

  • css 的基本命名, 自己刚写的时候以为也是写小驼峰式,后来就呵呵了。css 当中就是用 - 连接了, 如 search-button,在定义 id 的时候是用小驼峰了。

  • css 名字意思定义。这里有一个 BEM 的命名法则参考,可以看看我之前写的一篇博客了解BEM

  • css 命名的统一前缀, 在一个项目中,约定好同一个前缀,可避免样式的覆盖。

  • css 样式书写顺序:

    • 显示属性:display/list-style/position/float/clear …
    • 自身属性(盒模型):width/height/margin/padding/border
    • 背景:background
    • 行高:line-height
    • 文本属性:color/font/text-decoration/text-align/…
    • 其他:cursor/z-index/zoom/overflow
    • CSS3属性:transform/transition/animation/box-shadow/border-radius
    • 如果使用CSS3的属性,如果有必要加入浏览器前缀,则按照 -webkit- / -moz- / -ms- / -o- / std的顺序进行添加,标准属性写在最后。
    • 链接的样式请严格按照如下顺序添加: a:link -> a:visited -> a:hover -> a:active
  • 代码优化,能合并的属性就合并写,没用的属性也删掉,避免重复样式,避免使用 !important


git commit log 规则

  • 首先就是commit 内容的分类了,如图片所示: 这里写图片描述定好分类,分类后面可以加你本次修改具体文件,然后组织本次修改的内容,就写好了 commit log啦。比如:feat(login): 新增登录验证功能,这表达出了你再login文件上新增了一个验证的功能。编写正确的 log 信息,能够清楚的表述你写的代码目的。

  • commit 次数,这里我们每完成一个小点的时候,都可以 commit 一下,因为commit 是记录你完成一个项目的具体过程。


= = 之前没好好总结,今天写总结的时候,也去搜了搜别的文章,发现这样的文章其实挺多,自己以前都没怎么好好看看 = = 。 欢迎补充啊~

参考

前端人员必看的CSS规范Commit message 和 Change log 编写指南

',13)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUwLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0seUJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXVFSixNQXZFSUMsRUF1RUpDLEVBQUEsS0FBQUEsRUFBQSxLQXZFTkMsRUFBQUEsRUFBQUEsSUFBQSwwd0UiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vY29kZS1mb3JtYXQubWQiLCJ3ZWJwYWNrOi8vY2JveS1ibG9nLy4uLy4uL2Jsb2dzL21hcmtkb3duL2NvZGUtZm9ybWF0Lm1kPzZjMDYiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPjxkaXYgY2xhc3M9XCJjb21wb25lbnQtY29kZS1mb3JtYXRcIj48cD7kvZzkuLrkuIDkuKrnqIvluo/lkZjvvIzlt6XkvZzliLDnjrDlnKjvvIzkuZ/lsIbov5HljYrlubTkuobjgILlhazlj7jlr7nlkZjlt6XnmoTku6PnoIHmj5DkuqTkuZ/kvJrmnIkgcmV2aWV3IOa1geeoi+OAguS7o+eggeeahCByZXZpZXcg5p2l6K6y77yM5LiA6Iis5bCx5piv55yL5qC85byP44CB5ZG95ZCN44CB6YC76L6R5piv5ZCm5pyJ6ZSZ77yM5Luj56CB5piv5ZCm6L+Y5pyJ5Y+v5Lul5oq96LGh55qE5Zyw5pa577yM6L+Z6YeM5oC757uT5LiA5LiL6Ieq5bex6YGH5Yiw55qE5Luj56CB6KeE6IyD5pa56Z2i55qE6Zeu6aKY77yM5aSn5a625LiA6LW35YaZ6KeE6IyD55qE5Luj56CB77yM5YGa5LiA5Liq55yL5LiK5Y675LiT5Lia56CB5Yac5ZCn44CCPC9wPlxuPGhyPlxuPGg0PjxzdHJvbmc+anPop4TojIM8L3N0cm9uZz48L2g0PlxuPHVsPlxuPGxpPlxuPHA+5Luj56CB55qE57yp6L+b5LqG77yM5LiA6Iis5piv5Lik5qC85oiW5Zub5qC877yM5oiR5Y+46YeH55So55qE5piv5Zub5qC877yM6L+Z6YeM5Y+v5Lul5qC55o2u6Ieq5bex5Zac5aW95ZKM5YWs5Y+46KaB5rGC5LqG44CCPC9wPlxuPC9saT5cbjxsaT5cbjxwPuS4reiLseaWh+S5i+mXtOacieepuuagvOmXtOmalO+8jOWDj+i/meagtzogPGNvZGU+5oiR5LiT5Lia5byV55SoIEVuZ2xpc2gg5Y2V6K+NPC9jb2RlPjwvcD5cbjwvbGk+XG48bGk+XG48cD7lkb3lkI3op4TojIPvvIzlkb3lkI3nmoTpqbzls7DlvI/kuI3nlKjlho3or7TkuobjgILov5nph4zlhbfkvZPmg4XlhrXlhbfkvZPliIbmnpDkuIDkuIs8L3A+XG48dWw+XG48bGk+5Y+Y6YeP55qE5ZG95ZCN77ya5bCP6am85bOw5byPPC9saT5cbjxsaT7lh73mlbDnmoTlkb3lkI3vvJrlsI/pqbzls7DlvI88L2xpPlxuPGxpPuW4uOmHj++8muWFqOmDqOWkp+WGmTwvbGk+XG48bGk+5p6E6YCg5Ye95pWw77yaIOWkp+mpvOWzsOW8jzwvbGk+XG48bGk+57G755qE5oiQ5ZGY77yaIOWFrOWFseWxnuaAp+WSjOaWueazleWwseaYr+Wwj+mpvOWzsOW8j++8jCDnp4HmnInlsZ7mgKflkozmlrnms5XliqDkuIo8Y29kZT4tPC9jb2RlPuWJjee8gCznhLblkI7mmK/lsI/pqbzls7DlvI/vvIzlpoIgYF9uYW1lRnJpc3Q8L2xpPlxuPC91bD5cbjxocj5cbjwvbGk+XG48L3VsPlxuPGg0PjxzdHJvbmc+Y3Nz6KeE6IyDPC9zdHJvbmc+PC9oND5cbjx1bD5cbjxsaT5cbjxwPmNzcyDnmoTln7rmnKzlkb3lkI0sICDoh6rlt7HliJrlhpnnmoTml7blgJnku6XkuLrkuZ/mmK/lhpnlsI/pqbzls7DlvI/vvIzlkI7mnaXlsLHlkbXlkbXkuobjgIJjc3Mg5b2T5Lit5bCx5piv55SoIDxjb2RlPi08L2NvZGU+IOi/nuaOpeS6hu+8jCDlpoIgPGNvZGU+c2VhcmNoLWJ1dHRvbjwvY29kZT7vvIzlnKjlrprkuYkgaWQg55qE5pe25YCZ5piv55So5bCP6am85bOw5LqG44CCPC9wPlxuPC9saT5cbjxsaT5cbjxwPmNzcyDlkI3lrZfmhI/mgJ3lrprkuYnjgILov5nph4zmnInkuIDkuKogQkVNIOeahOWRveWQjeazleWImeWPguiAg++8jOWPr+S7peeci+eci+aIkeS5i+WJjeWGmeeahOS4gOevh+WNmuWuojxhIGhyZWY9XCJodHRwOi8vYmxvZy5jc2RuLm5ldC9kYWRhZGVnYW5odW8vYXJ0aWNsZS9kZXRhaWxzLzc2NjAwMjY0XCI+5LqG6KejQkVNPC9hPjwvcD5cbjwvbGk+XG48bGk+XG48cD5jc3Mg5ZG95ZCN55qE57uf5LiA5YmN57yA77yMIOWcqOS4gOS4qumhueebruS4re+8jOe6puWumuWlveWQjOS4gOS4quWJjee8gO+8jOWPr+mBv+WFjeagt+W8j+eahOimhuebluOAgjwvcD5cbjwvbGk+XG48bGk+XG48cD5jc3Mg5qC35byP5Lmm5YaZ6aG65bqP77yaPC9wPlxuPHVsPlxuPGxpPuaYvuekuuWxnuaAp++8mmRpc3BsYXkvbGlzdC1zdHlsZS9wb3NpdGlvbi9mbG9hdC9jbGVhciDigKY8L2xpPlxuPGxpPuiHqui6q+WxnuaAp++8iOebkuaooeWei++8ie+8mndpZHRoL2hlaWdodC9tYXJnaW4vcGFkZGluZy9ib3JkZXI8L2xpPlxuPGxpPuiDjOaZr++8mmJhY2tncm91bmQ8L2xpPlxuPGxpPuihjOmrmO+8mmxpbmUtaGVpZ2h0PC9saT5cbjxsaT7mlofmnKzlsZ7mgKfvvJpjb2xvci9mb250L3RleHQtZGVjb3JhdGlvbi90ZXh0LWFsaWduL+KApjwvbGk+XG48bGk+5YW25LuW77yaY3Vyc29yL3otaW5kZXgvem9vbS9vdmVyZmxvdzwvbGk+XG48bGk+Q1NTM+WxnuaAp++8mnRyYW5zZm9ybS90cmFuc2l0aW9uL2FuaW1hdGlvbi9ib3gtc2hhZG93L2JvcmRlci1yYWRpdXM8L2xpPlxuPGxpPuWmguaenOS9v+eUqENTUzPnmoTlsZ7mgKfvvIzlpoLmnpzmnInlv4XopoHliqDlhaXmtY/op4jlmajliY3nvIDvvIzliJnmjInnhacgLXdlYmtpdC0gLyAtbW96LSAvIC1tcy0gLyAtby0gL1xuc3Rk55qE6aG65bqP6L+b6KGM5re75Yqg77yM5qCH5YeG5bGe5oCn5YaZ5Zyo5pyA5ZCO44CCPC9saT5cbjxsaT7pk77mjqXnmoTmoLflvI/or7fkuKXmoLzmjInnhaflpoLkuIvpobrluo/mt7vliqDvvJogYTpsaW5rIC0mZ3Q7IGE6dmlzaXRlZCAtJmd0OyBhOmhvdmVyIC0mZ3Q7IGE6YWN0aXZlPC9saT5cbjwvdWw+XG48L2xpPlxuPGxpPlxuPHA+5Luj56CB5LyY5YyW77yM6IO95ZCI5bm255qE5bGe5oCn5bCx5ZCI5bm25YaZ77yM5rKh55So55qE5bGe5oCn5Lmf5Yig5o6J77yM6YG/5YWN6YeN5aSN5qC35byP77yM6YG/5YWN5L2/55SoIDxjb2RlPiFpbXBvcnRhbnQ8L2NvZGU+PC9wPlxuPC9saT5cbjwvdWw+XG48aHI+XG48aDQ+PHN0cm9uZz5naXQgY29tbWl0IGxvZyDop4TliJk8L3N0cm9uZz48L2g0PlxuPHVsPlxuPGxpPlxuPHA+6aaW5YWI5bCx5pivY29tbWl0IOWGheWuueeahOWIhuexu+S6hu+8jOWmguWbvueJh+aJgOekuu+8mlxuPGltZyBzcmM9XCJodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcwODMwMTQ0MTM5NDAzP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3RcIiBhbHQ9XCLov5nph4zlhpnlm77niYfmj4/ov7BcIj7lrprlpb3liIbnsbvvvIzliIbnsbvlkI7pnaLlj6/ku6XliqDkvaDmnKzmrKHkv67mlLnlhbfkvZPmlofku7bvvIznhLblkI7nu4Tnu4fmnKzmrKHkv67mlLnnmoTlhoXlrrnvvIzlsLHlhpnlpb3kuoYgY29tbWl0IGxvZ+WVpuOAguavlOWmgu+8mjxjb2RlPmZlYXQobG9naW4pOiDmlrDlop7nmbvlvZXpqozor4Hlip/og708L2NvZGU+LOi/meihqOi+vuWHuuS6huS9oOWGjWxvZ2lu5paH5Lu25LiK5paw5aKe5LqG5LiA5Liq6aqM6K+B55qE5Yqf6IO944CC57yW5YaZ5q2j56Gu55qEIGxvZyDkv6Hmga/vvIzog73lpJ/muIXmpZrnmoTooajov7DkvaDlhpnnmoTku6PnoIHnm67nmoTjgII8L3A+XG48L2xpPlxuPGxpPlxuPHA+Y29tbWl0IOasoeaVsO+8jOi/memHjOaIkeS7rOavj+WujOaIkOS4gOS4quWwj+eCueeahOaXtuWAme+8jOmDveWPr+S7pSBjb21taXQg5LiA5LiL77yM5Zug5Li6Y29tbWl0IOaYr+iusOW9leS9oOWujOaIkOS4gOS4qumhueebrueahOWFt+S9k+i/h+eoi+OAgjwvcD5cbjwvbGk+XG48L3VsPlxuPGhyPlxuPHA+PSA9IOS5i+WJjeayoeWlveWlveaAu+e7k++8jOS7iuWkqeWGmeaAu+e7k+eahOaXtuWAme+8jOS5n+WOu+aQnOS6huaQnOWIq+eahOaWh+eroO+8jOWPkeeOsOi/meagt+eahOaWh+eroOWFtuWunuaMuuWkmu+8jOiHquW3seS7peWJjemDveayoeaAjuS5iOWlveWlveeci+eciyA9ID0g44CCXG7mrKLov47ooaXlhYXllYp+PC9wPlxuPGg0PuWPguiAgzwvaDQ+XG48YmxvY2txdW90ZT5cbjxwPjxhIGhyZWY9XCJodHRwczovL3d3dy5kb3ViYW4uY29tL25vdGUvNDk5OTc2NDA1Lz90eXBlPWxpa2VcIj7liY3nq6/kurrlkZjlv4XnnIvnmoRDU1Pop4TojIM8L2E+XG48YSBocmVmPVwiaHR0cDovL3d3dy5ydWFueWlmZW5nLmNvbS9ibG9nLzIwMTYvMDEvY29tbWl0X21lc3NhZ2VfY2hhbmdlX2xvZy5odG1sXCI+Q29tbWl0IG1lc3NhZ2Ug5ZKMIENoYW5nZSBsb2cg57yW5YaZ5oyH5Y2XPC9hPjwvcD5cbjwvYmxvY2txdW90ZT5cbjwvZGl2PjwvdGVtcGxhdGU+IiwiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vY29kZS1mb3JtYXQubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZGUxNjU3NWNcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4xMl92dWVAMy41LjEyX3R5cGVzY3JpcHRANS42LjNfX3dlYnBhY2tANS45NS4wX3dlYnBhY2stY2xpQDUuMS40Xy9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/551.bundle.js b/551.bundle.js deleted file mode 100644 index a926b3d..0000000 --- a/551.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[551],{551:function(e,n,t){t.r(n),t.d(n,{default:function(){return s}});var r=t(358);const o={class:"component-typescript"},p={};var s=(0,t(389).A)(p,[["render",function(e,n){return(0,r.uX)(),(0,r.CE)("div",o,n[0]||(n[0]=[(0,r.Fv)('

learn typescript

类型

基本类型:

string number bool \n

数组 []:

string[]  number[]\n

元祖:

[string, number]. 数组中有不同的数据类型\n

对象:

{ name: string; age: number }\n

函数:

(arg1: string, arg?: bool) => void\n

Symbol:

let symbol = Symbol("key"); \n

空:

undefined   null\n

任何类型:

any\n

不存在的值:

never\n

如何定义类型

type 定义类型变量

type Person = { name: string; age: number}\nts 使用 const person1:Person = { name: '22', age: 1};\n

Interfaces 声明 对象 类型的一种方法

Interface Person { name: string; age: number}\n

extends 类型继承于声明的类型

interface a { name: string}\ninterface b extends a {\n\tage: number\n}\nb 的类型等于 { name: string; age: number }\n

in 判断属性是哪个类型中的

type PersonListQuery = { user_ids: string[] }\ntype DogListQuery = { dog_ids: string[] }\n\nfunction getList(query: PersonListQuery | DogListQuery ) {\n\tif ('user_ids' in PersonListQuery) {\n\t \t// 这里可以推导出 query 类型是 PersonListQuery\n\t}\n}\n\n

类型组合

Required<T> 将 T 中所有属性变成必选

Required<{ a?: bool} > = { a: bool }\n

Partial<T> 将 T 中所有属性变成可选

Partial<{ a: bool }> = { a?: bool }\n

Readonly<T> 将 T 中所有属性变成只读,后续 ts 会检测该类型不允许修改

const person2: Readonly<{name: string}> = {name: '22'}\nperson2.name = '33' //error\n

Omit<T, keys> 删除某些属性

interface Person {\n  name: string;\n  age: number;\n}\n \ntype Name = Omit<Person, 'age'>;\nName 的类型定义为 { name: string }\n

Pick<T, keys> 选择类型中的某些属性

interface Person {\n  name: string;\n  age: number;\n}\ntype Name = Pick<Person, 'name'>;\nName 的类型定义为 { name: string }\n

Exclude<T, deleteT> 删除类型 T 中 deleteT 的类型, 相当于 Omit, 第二个值可以是 keys ,也可以是一个类型变量

interface Person {\n  name: string;\n  age: number;\n}\ntype Age = { age: number }\ntype Name = Exclude<Person, Age>\nName 的类型定义为 { name: string }\n

Extract<T, U> 提取 T 继承于的 U 类型

type Person = {  name: string ; age: number } \ntype PersonDetail = { pet: any; phone: number } \ntype Name = { name: string }\ntype Name = Extract<Person | PersonDetail , Name>\n 将提取出含有 name 的类型 Person\n

Parameters<function T> 获取函数类型的函数类型

type getName = (perpson: Person) => string;\ntype queryType = Parameters<getName>;\nqueryType  的类型定义为 Person\n

ReturnType<function T> 获取函数类型的返回值类型

type getName = (perpson: Person) => string;\ntype resType = ReturnType<getName>;\nvalueType 类型为 string\n

Awaited<Promise Type> 获取异步返回的值类型

type getPerson = (id: string) => Promise<Person>\ntype resType = ReturnType<getPerson> // Promise<Person>\ntype valueType = Awaited<resType> // Person\n

Record<K extends keyof any, T> 定义对象的 key 键类型

type Keys = 'name' | 'age' \ntype person = Record<Keys, any>\n// person 的属性只能为 name 和 age\n

NonNullable<T> 去除类型中定义的 null 和 undefined

type PersonHobby = hobby: string | undefined;\ntype Hobby = NonNullable<hobby>\nHobby 类型为  string\n

类型操作

typeof Object 获得对象的类型

const person1 = { name: '22', age: 1}\ntype Person = typeof person1\nPerson 类型为 { name: string; age: number }\n

keyof T 获得类型中的属性

type Person = { name: string; age: number }\ntype Key = keyof Person \nkey 的类型为 'name' | 'age'\n

通常我们可以通过 keyof 约束对象的传参, 如

type Person = { name: string; age: number }\ntype Key = keyof Person;\ntype getPersonAtrribute = (person: Person, key: Key) => Person[Key];\n

或者某些情况下我们想知道一个对象的属性值

const workPerson = { \n\t'1': { name: '1', age: 1},\n\t'2': { name: '2', age: 2},\n}\ntype WorkPerson  = typeof workPerson;  // { '1': {name: string; age: number }, '2': {name: string; age: number }\ntype Key = keyof WorkPerson  // '1' | '2'\ntype Person = WorkPerson[Key]   // {name: string; age: number }\n

| 类型兼容

type width = 'string' | 'number';\n\n则 width 可以是 '32px' 也可以是 '32' 在 渲染时兼容两种类型\n

函数重载

定义不同类型的输入,推到出不同类型的输出

type PersonListQuery = { user_ids: string[] };\ntype DongListQuery = { dog_ids: string[] };\nfunction getList(request: PersonListQuery): Person[];\nfunction getList(request: DogListQuery): Dog[];\n\nfunction getList(query: PersonListQuery | DogListQuery) {\n  if ('user_ids' in query) {  \n    return [] as Person[];\n  } else {\n    return [] as Dog[];\n  }\n}\n\nconst a = getList({ personIds: [], region: 'us'})\n此时 a 的类型将能推到出是 Person[]\n

泛型

类型的传参。 用 T 标识,在实际运用时你传入什么类型,该类型就作为后续推导。

async function request<T>(url: string): Promise<T> {\n  const res = await fetch(url)\n  return res.json();\n}\n\nconst res = await request<Person>('getPersonInfo?id=1'); \n此时 ts 可以推导出 res 的类型是 Person\n

Infer 类型参数使用

通过 Infer 一个类型为变量,定义出获取类型的方法

type addResultType<T> = T extends { a: infer U, b: infer U } ?  U : never;\ntype numberAdd =  addResultType<{ a: 1, b: 2 }>     // 推到出结果类型为 number\ntype textAdd = addResultType<{ a: 'hello', b: 'world' }>     // 推到出结果类型为 string\n

枚举 enum

变量的值是约定的几个取值

const enum PageType {\n  HOME = 'home',\n  VIDEO = 'video',\n}\n\nfunction getPageUrl(page: PageType) {\n  return {\n    [PageType.VIDEO]: "/video",\n    [PageType.HOME]: "/home",\n  }[page];\n}\n

tsconfig

了解了 ts 对于类型的定义和各种规则后,我们则可以在编写 js 代码时利用并进行类型约束。于此同时,我们需要引入 typescript 库去获得这些 ts 能力。

如何引入

npm install  typescript  \n// 不必再多说\n

命令

typescript 包是有命令文件的,通常 ts 的运行则是通过 tsc 配合相关命令去执行的. 具体命令大家可以安装包之后通过 tsc -h 查看 在这里插入图片描述

配置 官网

如果你看了 tsc 命令,你会发现它是有很多命令的,并且有的命令还伴随这相关参数。在工作文件夹中,我们则通过配置文件 tsconfig.js 去配置,保证在项目中的运用。 配置参数这里就不细讲了,还是看官方文档靠谱点。

',85)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUxLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sd0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXFOSixNQXJOSUMsRUFxTkpDLEVBQUEsS0FBQUEsRUFBQSxLQXJOTkMsRUFBQUEsRUFBQUEsSUFBQSwrNk4iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vdHlwZXNjcmlwdC5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vdHlwZXNjcmlwdC5tZD9mNjZmIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXR5cGVzY3JpcHRcIj48aDI+bGVhcm4gdHlwZXNjcmlwdDwvaDI+XG48aDM+57G75Z6LPC9oMz5cbjxwPuWfuuacrOexu+Weizo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+c3RyaW5nIG51bWJlciBib29sIFxuPC9jb2RlPjwvcHJlPlxuPHA+5pWw57uEIDxjb2RlPltdPC9jb2RlPjo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+c3RyaW5nW10gIG51bWJlcltdXG48L2NvZGU+PC9wcmU+XG48cD7lhYPnpZY6PC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPltzdHJpbmcsIG51bWJlcl0uIOaVsOe7hOS4reacieS4jeWQjOeahOaVsOaNruexu+Wei1xuPC9jb2RlPjwvcHJlPlxuPHA+5a+56LGhOjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT57IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfVxuPC9jb2RlPjwvcHJlPlxuPHA+5Ye95pWw77yaPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPihhcmcxOiBzdHJpbmcsIGFyZz86IGJvb2wpID0mZ3Q7IHZvaWRcbjwvY29kZT48L3ByZT5cbjxwPlN5bWJvbDo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+bGV0IHN5bWJvbCA9IFN5bWJvbChcImtleVwiKTsgXG48L2NvZGU+PC9wcmU+XG48cD7nqbrvvJo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dW5kZWZpbmVkICAgbnVsbFxuPC9jb2RlPjwvcHJlPlxuPHA+5Lu75L2V57G75Z6L77yaPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmFueVxuPC9jb2RlPjwvcHJlPlxuPHA+5LiN5a2Y5Zyo55qE5YC877yaPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPm5ldmVyXG48L2NvZGU+PC9wcmU+XG48aDM+5aaC5L2V5a6a5LmJ57G75Z6LPC9oMz5cbjxwPjxjb2RlPnR5cGU8L2NvZGU+ICDlrprkuYnnsbvlnovlj5jph488L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBQZXJzb24gPSB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXJ9XG50cyDkvb/nlKggY29uc3QgcGVyc29uMe+8mlBlcnNvbiA9IHsgbmFtZTogJzIyJywgYWdlOiAxfTtcbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPkludGVyZmFjZXM8L2NvZGU+IOWjsOaYjiA8Y29kZT7lr7nosaE8L2NvZGU+IOexu+Wei+eahOS4gOenjeaWueazlTwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5JbnRlcmZhY2UgUGVyc29uIHsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlcn1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPmV4dGVuZHM8L2NvZGU+IOexu+Wei+e7p+aJv+S6juWjsOaYjueahOexu+WeizwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5pbnRlcmZhY2UgYSB7IG5hbWU6IHN0cmluZ31cbmludGVyZmFjZSBiIGV4dGVuZHMgYSB7XG5cdGFnZTogbnVtYmVyXG59XG5iIOeahOexu+Wei+etieS6jiB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfVxuPC9jb2RlPjwvcHJlPlxuPHA+aW4g5Yik5pat5bGe5oCn5piv5ZOq5Liq57G75Z6L5Lit55qEPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgUGVyc29uTGlzdFF1ZXJ5ID0geyB1c2VyX2lkczogc3RyaW5nW10gfVxudHlwZSBEb2dMaXN0UXVlcnkgPSB7IGRvZ19pZHM6IHN0cmluZ1tdIH1cblxuZnVuY3Rpb24gZ2V0TGlzdChxdWVyeTogUGVyc29uTGlzdFF1ZXJ5IHwgRG9nTGlzdFF1ZXJ5ICkge1xuXHRpZiAoJ3VzZXJfaWRzJyBpbiBQZXJzb25MaXN0UXVlcnkpIHtcblx0IFx0Ly8g6L+Z6YeM5Y+v5Lul5o6o5a+85Ye6IHF1ZXJ5IOexu+Wei+aYryBQZXJzb25MaXN0UXVlcnlcblx0fVxufVxuXG48L2NvZGU+PC9wcmU+XG48aDM+57G75Z6L57uE5ZCIPC9oMz5cbjxwPjxjb2RlPlJlcXVpcmVkJmx0O1QmZ3Q7PC9jb2RlPiDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlv4XpgIk8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+UmVxdWlyZWQmbHQ7eyBhPzogYm9vbH0gJmd0OyA9IHsgYTogYm9vbCB9XG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT5QYXJ0aWFsJmx0O1QmZ3Q7PC9jb2RlPiDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlj6/pgIk8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+UGFydGlhbCZsdDt7IGE6IGJvb2wgfSZndDsgPSB7IGE/OiBib29sIH1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPlJlYWRvbmx5Jmx0O1QmZ3Q7PC9jb2RlPiDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlj6ror7vvvIzlkI7nu60gdHMg5Lya5qOA5rWL6K+l57G75Z6L5LiN5YWB6K645L+u5pS5PC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmNvbnN0IHBlcnNvbjI6IFJlYWRvbmx5Jmx0O3tuYW1lOiBzdHJpbmd9Jmd0OyA9IHtuYW1lOiAnMjInfVxucGVyc29uMi5uYW1lID0gJzMzJyAvL2Vycm9yXG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT5PbWl0Jmx0O1QsIGtleXMmZ3Q7PC9jb2RlPiDliKDpmaTmn5DkupvlsZ7mgKc8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+aW50ZXJmYWNlIFBlcnNvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWdlOiBudW1iZXI7XG59XG4gXG50eXBlIE5hbWUgPSBPbWl0Jmx0O1BlcnNvbiwgJ2FnZScmZ3Q7O1xuTmFtZSDnmoTnsbvlnovlrprkuYnkuLogeyBuYW1lOiBzdHJpbmcgfVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+UGljayZsdDtULCBrZXlzJmd0OzwvY29kZT4g6YCJ5oup57G75Z6L5Lit55qE5p+Q5Lqb5bGe5oCnPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmludGVyZmFjZSBQZXJzb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFnZTogbnVtYmVyO1xufVxudHlwZSBOYW1lID0gUGljayZsdDtQZXJzb24sICduYW1lJyZndDs7XG5OYW1lIOeahOexu+Wei+WumuS5ieS4uiB7IG5hbWU6IHN0cmluZyB9XG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT5FeGNsdWRlJmx0O1QsIGRlbGV0ZVQmZ3Q7PC9jb2RlPiDliKDpmaTnsbvlnosgVCDkuK0gZGVsZXRlVCDnmoTnsbvlnovvvIwg55u45b2T5LqOIE9taXQsIOesrOS6jOS4quWAvOWPr+S7peaYryBrZXlzIO+8jOS5n+WPr+S7peaYr+S4gOS4quexu+Wei+WPmOmHjzwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5pbnRlcmZhY2UgUGVyc29uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhZ2U6IG51bWJlcjtcbn1cbnR5cGUgQWdlID0geyBhZ2U6IG51bWJlciB9XG50eXBlIE5hbWUgPSBFeGNsdWRlJmx0O1BlcnNvbiwgQWdlJmd0O1xuTmFtZSDnmoTnsbvlnovlrprkuYnkuLogeyBuYW1lOiBzdHJpbmcgfVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+RXh0cmFjdCZsdDtULCBVJmd0OzwvY29kZT4g5o+Q5Y+WIFQg57un5om/5LqO55qEIFUg57G75Z6LPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgUGVyc29uID0geyAgbmFtZTogc3RyaW5nIDsgYWdlOiBudW1iZXIgfSBcbnR5cGUgUGVyc29uRGV0YWlsID0geyBwZXQ6IGFueTsgcGhvbmU6IG51bWJlciB9IFxudHlwZSBOYW1lID0geyBuYW1lOiBzdHJpbmcgfVxudHlwZSBOYW1lID0gRXh0cmFjdCZsdDtQZXJzb24gfCBQZXJzb25EZXRhaWwgLCBOYW1lJmd0O1xuIOWwhuaPkOWPluWHuuWQq+aciSBuYW1lIOeahOexu+WeiyBQZXJzb25cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPlBhcmFtZXRlcnMmbHQ7ZnVuY3Rpb24gVCZndDs8L2NvZGU+IOiOt+WPluWHveaVsOexu+Wei+eahOWHveaVsOexu+WeizwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9Jmd0OyBzdHJpbmc7XG50eXBlIHF1ZXJ5VHlwZSA9IFBhcmFtZXRlcnMmbHQ7Z2V0TmFtZSZndDs7XG5xdWVyeVR5cGUgIOeahOexu+Wei+WumuS5ieS4uiBQZXJzb25cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPlJldHVyblR5cGUmbHQ7ZnVuY3Rpb24gVCZndDs8L2NvZGU+IOiOt+WPluWHveaVsOexu+Wei+eahOi/lOWbnuWAvOexu+WeizwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9Jmd0OyBzdHJpbmc7XG50eXBlIHJlc1R5cGUgPSBSZXR1cm5UeXBlJmx0O2dldE5hbWUmZ3Q7O1xudmFsdWVUeXBlIOexu+Wei+S4uiBzdHJpbmdcbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPkF3YWl0ZWQmbHQ7UHJvbWlzZSBUeXBlJmd0OzwvY29kZT4g6I635Y+W5byC5q2l6L+U5Zue55qE5YC857G75Z6LPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgZ2V0UGVyc29uID0gKGlkOiBzdHJpbmcpID0mZ3Q7IFByb21pc2UmbHQ7UGVyc29uJmd0O1xudHlwZSByZXNUeXBlID0gUmV0dXJuVHlwZSZsdDtnZXRQZXJzb24mZ3Q7IC8vIFByb21pc2UmbHQ7UGVyc29uJmd0O1xudHlwZSB2YWx1ZVR5cGUgPSBBd2FpdGVkJmx0O3Jlc1R5cGUmZ3Q7IC8vIFBlcnNvblxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+UmVjb3JkJmx0O0sgZXh0ZW5kcyBrZXlvZiBhbnksIFQmZ3Q7PC9jb2RlPiAg5a6a5LmJ5a+56LGh55qEIGtleSDplK7nsbvlnos8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBLZXlzID0gJ25hbWUnIHwgJ2FnZScgXG50eXBlIHBlcnNvbiA9IFJlY29yZCZsdDtLZXlzLCBhbnkmZ3Q7XG4vLyBwZXJzb24g55qE5bGe5oCn5Y+q6IO95Li6IG5hbWUg5ZKMIGFnZVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+Tm9uTnVsbGFibGUmbHQ7VCZndDs8L2NvZGU+IOWOu+mZpOexu+Wei+S4reWumuS5ieeahCBudWxsIOWSjCB1bmRlZmluZWQ8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBQZXJzb25Ib2JieSA9IGhvYmJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG50eXBlIEhvYmJ5ID0gTm9uTnVsbGFibGUmbHQ7aG9iYnkmZ3Q7XG5Ib2JieSDnsbvlnovkuLogIHN0cmluZ1xuPC9jb2RlPjwvcHJlPlxuPGgzPuexu+Wei+aTjeS9nDwvaDM+XG48cD48Y29kZT50eXBlb2YgT2JqZWN0PC9jb2RlPiDojrflvpc8Y29kZT7lr7nosaE8L2NvZGU+55qE57G75Z6LPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmNvbnN0IHBlcnNvbjEgPSB7IG5hbWU6ICcyMicsIGFnZTogMX1cbnR5cGUgUGVyc29uID0gdHlwZW9mIHBlcnNvbjFcblBlcnNvbiDnsbvlnovkuLogeyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPmtleW9mIFQ8L2NvZGU+ICDojrflvpfnsbvlnovkuK3nmoTlsZ7mgKc8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBQZXJzb24gPSB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfVxudHlwZSBLZXkgPSBrZXlvZiBQZXJzb24gXG5rZXkg55qE57G75Z6L5Li6ICduYW1lJyB8ICdhZ2UnXG48L2NvZGU+PC9wcmU+XG48cD7pgJrluLjmiJHku6zlj6/ku6XpgJrov4cga2V5b2Yg57qm5p2f5a+56LGh55qE5Lyg5Y+C77yMIOWmgjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT50eXBlIFBlcnNvbiA9IHsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XG50eXBlIEtleSA9IGtleW9mIFBlcnNvbjtcbnR5cGUgZ2V0UGVyc29uQXRycmlidXRlID0gKHBlcnNvbjogUGVyc29uLCBrZXk6IEtleSkgPSZndDsgUGVyc29uW0tleV07XG48L2NvZGU+PC9wcmU+XG48cD7miJbogIXmn5Dkupvmg4XlhrXkuIvmiJHku6zmg7Pnn6XpgZPkuIDkuKrlr7nosaHnmoTlsZ7mgKflgLw8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+Y29uc3Qgd29ya1BlcnNvbiA9IHsgXG5cdCcxJzogeyBuYW1lOiAnMScsIGFnZTogMX0sXG5cdCcyJzogeyBuYW1lOiAnMicsIGFnZTogMn0sXG59XG50eXBlIFdvcmtQZXJzb24gID0gdHlwZW9mIHdvcmtQZXJzb247ICAvLyB7ICcxJzoge25hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfSwgJzInOiB7bmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XG50eXBlIEtleSA9IGtleW9mIFdvcmtQZXJzb24gIC8vICcxJyB8ICcyJ1xudHlwZSBQZXJzb24gPSBXb3JrUGVyc29uW0tleV0gICAvLyB7bmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT58PC9jb2RlPiDnsbvlnovlhbzlrrk8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSB3aWR0aCA9ICdzdHJpbmcnIHwgJ251bWJlcic7XG5cbuWImSB3aWR0aCDlj6/ku6XmmK8gJzMycHgnIOS5n+WPr+S7peaYryAnMzInIOWcqCDmuLLmn5Pml7blhbzlrrnkuKTnp43nsbvlnotcbjwvY29kZT48L3ByZT5cbjxoMz7lh73mlbDph43ovb08L2gzPlxuPHA+5a6a5LmJ5LiN5ZCM57G75Z6L55qE6L6T5YWl77yM5o6o5Yiw5Ye65LiN5ZCM57G75Z6L55qE6L6T5Ye6PC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgUGVyc29uTGlzdFF1ZXJ5ID0geyB1c2VyX2lkczogc3RyaW5nW10gfTtcbnR5cGUgRG9uZ0xpc3RRdWVyeSA9IHsgZG9nX2lkczogc3RyaW5nW10gfTtcbmZ1bmN0aW9uIGdldExpc3QocmVxdWVzdDogUGVyc29uTGlzdFF1ZXJ5KTogUGVyc29uW107XG5mdW5jdGlvbiBnZXRMaXN0KHJlcXVlc3Q6IERvZ0xpc3RRdWVyeSk6IERvZ1tdO1xuXG5mdW5jdGlvbiBnZXRMaXN0KHF1ZXJ5OiBQZXJzb25MaXN0UXVlcnkgfCBEb2dMaXN0UXVlcnkpIHtcbiAgaWYgKCd1c2VyX2lkcycgaW4gcXVlcnkpIHsgIFxuICAgIHJldHVybiBbXSBhcyBQZXJzb25bXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW10gYXMgRG9nW107XG4gIH1cbn1cblxuY29uc3QgYSA9IGdldExpc3QoeyBwZXJzb25JZHM6IFtdLCByZWdpb246ICd1cyd9KVxu5q2k5pe2IGEg55qE57G75Z6L5bCG6IO95o6o5Yiw5Ye65pivIFBlcnNvbltdXG48L2NvZGU+PC9wcmU+XG48aDM+5rOb5Z6LPC9oMz5cbjxwPuexu+Wei+eahOS8oOWPguOAgiDnlKggVCDmoIfor4bvvIzlnKjlrp7pmYXov5DnlKjml7bkvaDkvKDlhaXku4DkuYjnsbvlnovvvIzor6XnsbvlnovlsLHkvZzkuLrlkI7nu63mjqjlr7zjgII8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+YXN5bmMgZnVuY3Rpb24gcmVxdWVzdCZsdDtUJmd0Oyh1cmw6IHN0cmluZyk6IFByb21pc2UmbHQ7VCZndDsge1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpXG4gIHJldHVybiByZXMuanNvbigpO1xufVxuXG5jb25zdCByZXMgPSBhd2FpdCByZXF1ZXN0Jmx0O1BlcnNvbiZndDsoJ2dldFBlcnNvbkluZm8/aWQ9MScpOyBcbuatpOaXtiB0cyDlj6/ku6Xmjqjlr7zlh7ogcmVzIOeahOexu+Wei+aYryBQZXJzb25cbjwvY29kZT48L3ByZT5cbjxoMz5JbmZlciAg57G75Z6L5Y+C5pWw5L2/55SoPC9oMz5cbjxwPumAmui/hyBJbmZlciDkuIDkuKrnsbvlnovkuLrlj5jph4/vvIzlrprkuYnlh7rojrflj5bnsbvlnovnmoTmlrnms5U8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBhZGRSZXN1bHRUeXBlJmx0O1QmZ3Q7ID0gVCBleHRlbmRzIHsgYTogaW5mZXIgVSwgYjogaW5mZXIgVSB9ID8gIFUgOiBuZXZlcjtcbnR5cGUgbnVtYmVyQWRkID0gIGFkZFJlc3VsdFR5cGUmbHQ7eyBhOiAxLCBiOiAyIH0mZ3Q7ICAgICAvLyDmjqjliLDlh7rnu5PmnpznsbvlnovkuLogbnVtYmVyXG50eXBlIHRleHRBZGQgPSBhZGRSZXN1bHRUeXBlJmx0O3sgYTogJ2hlbGxvJywgYjogJ3dvcmxkJyB9Jmd0OyAgICAgLy8g5o6o5Yiw5Ye657uT5p6c57G75Z6L5Li6IHN0cmluZ1xuPC9jb2RlPjwvcHJlPlxuPGgzPuaemuS4viBlbnVtPC9oMz5cbjxwPuWPmOmHj+eahOWAvOaYr+e6puWumueahOWHoOS4quWPluWAvDwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5jb25zdCBlbnVtIFBhZ2VUeXBlIHtcbiAgSE9NRSA9ICdob21lJyxcbiAgVklERU8gPSAndmlkZW8nLFxufVxuXG5mdW5jdGlvbiBnZXRQYWdlVXJsKHBhZ2U6IFBhZ2VUeXBlKSB7XG4gIHJldHVybiB7XG4gICAgW1BhZ2VUeXBlLlZJREVPXTogXCIvdmlkZW9cIixcbiAgICBbUGFnZVR5cGUuSE9NRV06IFwiL2hvbWVcIixcbiAgfVtwYWdlXTtcbn1cbjwvY29kZT48L3ByZT5cbjxoMj50c2NvbmZpZzwvaDI+XG48cD7kuobop6PkuoYgdHMg5a+55LqO57G75Z6L55qE5a6a5LmJ5ZKM5ZCE56eN6KeE5YiZ5ZCO77yM5oiR5Lus5YiZ5Y+v5Lul5Zyo57yW5YaZIGpzIOS7o+eggeaXtuWIqeeUqOW5tui/m+ihjOexu+Wei+e6puadn+OAguS6juatpOWQjOaXtu+8jOaIkeS7rOmcgOimgeW8leWFpSB0eXBlc2NyaXB0IOW6k+WOu+iOt+W+l+i/meS6myB0cyDog73lipvjgII8L3A+XG48aDM+5aaC5L2V5byV5YWlPC9oMz5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5ucG0gaW5zdGFsbCAgdHlwZXNjcmlwdCAgXG4vLyDkuI3lv4Xlho3lpJror7RcbjwvY29kZT48L3ByZT5cbjxoMz7lkb3ku6Q8L2gzPlxuPHA+dHlwZXNjcmlwdCDljIXmmK/mnInlkb3ku6Tmlofku7bnmoTvvIzpgJrluLggdHMg55qE6L+Q6KGM5YiZ5piv6YCa6L+HIHRzYyDphY3lkIjnm7jlhbPlkb3ku6TljrvmiafooYznmoQuIOWFt+S9k+WRveS7pOWkp+WutuWPr+S7peWuieijheWMheS5i+WQjumAmui/hyB0c2MgLWgg5p+l55yLXG48aW1nIHNyYz1cImh0dHBzOi8vaS1ibG9nLmNzZG5pbWcuY24vYmxvZ19taWdyYXRlLzM0OWZmYzM2MmYwZDgzMWE3ODBkMmQ3Zjc1NDg5M2ExLnBuZ1wiIGFsdD1cIuWcqOi/memHjOaPkuWFpeWbvueJh+aPj+i/sFwiPjwvcD5cbjxoMz7phY3nva4gPGEgaHJlZj1cImh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3RzY29uZmlnLWpzb24uaHRtbFwiPuWumOe9kTwvYT48L2gzPlxuPHA+5aaC5p6c5L2g55yL5LqGIHRzYyDlkb3ku6TvvIzkvaDkvJrlj5HnjrDlroPmmK/mnInlvojlpJrlkb3ku6TnmoTvvIzlubbkuJTmnInnmoTlkb3ku6Tov5jkvLTpmo/ov5nnm7jlhbPlj4LmlbDjgILlnKjlt6XkvZzmlofku7blpLnkuK3vvIzmiJHku6zliJnpgJrov4fphY3nva7mlofku7YgPGNvZGU+dHNjb25maWcuanMgPC9jb2RlPiDljrvphY3nva7vvIzkv53or4HlnKjpobnnm67kuK3nmoTov5DnlKjjgIIg6YWN572u5Y+C5pWw6L+Z6YeM5bCx5LiN57uG6K6y5LqG77yM6L+Y5piv55yL5a6Y5pa55paH5qGj6Z2g6LCx54K544CCPC9wPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi90eXBlc2NyaXB0Lm1kP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNkZGU3MDgyXCJcbmNvbnN0IHNjcmlwdCA9IHt9XG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS92dWUtbG9hZGVyQDE3LjQuMl9AdnVlK2NvbXBpbGVyLXNmY0AzLjUuM192dWVAMy41LjNfdHlwZXNjcmlwdEA1LjUuNF9fd2VicGFja0A1Ljk0LjBfd2VicGFjay1fZnVxa3dnZ3BsaGV5M29pdnR3ZTJzdGRvNmUvbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdXSlcblxuZXhwb3J0IGRlZmF1bHQgX19leHBvcnRzX18iXSwibmFtZXMiOlsiY2xhc3MiLCJzY3JpcHQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2hvaXN0ZWRfMSIsIl9jYWNoZSIsIl9jcmVhdGVTdGF0aWNWTm9kZSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/188.bundle.js b/581.bundle.js similarity index 58% rename from 188.bundle.js rename to 581.bundle.js index 2a5cf7c..33561e8 100644 --- a/188.bundle.js +++ b/581.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[188],{188:(n,e,r)=>{r.r(e),r.d(e,{default:()=>t});const t="## learn typescript\n### 类型\n基本类型: \n```\nstring number bool \n```\n\n数组 `[]`: \n```\nstring[] number[]\n```\n\n元祖: \n```\n[string, number]. 数组中有不同的数据类型\n```\n\n对象:\n```\n{ name: string; age: number }\n```\n\n函数:\n```\n(arg1: string, arg?: bool) => void\n```\n\nSymbol: \n```\nlet symbol = Symbol(\"key\"); \n```\n\n空:\n```\nundefined null\n```\n\n任何类型: \n```\nany\n```\n\n不存在的值: \n```\nnever\n```\n\n### 如何定义类型\n`type` 定义类型变量\n```\ntype Person = { name: string; age: number}\nts 使用 const person1:Person = { name: '22', age: 1};\n```\n\n`Interfaces` 声明 `对象` 类型的一种方法\n```\nInterface Person { name: string; age: number}\n```\n\n`extends` 类型继承于声明的类型\n```\ninterface a { name: string}\ninterface b extends a {\n\tage: number\n}\nb 的类型等于 { name: string; age: number }\n```\n\nin 判断属性是哪个类型中的\n```\ntype PersonListQuery = { user_ids: string[] }\ntype DogListQuery = { dog_ids: string[] }\n\nfunction getList(query: PersonListQuery | DogListQuery ) {\n\tif ('user_ids' in PersonListQuery) {\n\t \t// 这里可以推导出 query 类型是 PersonListQuery\n\t}\n}\n\n```\n\n\n### 类型组合\n\n`Required` 将 T 中所有属性变成必选\n```\nRequired<{ a?: bool} > = { a: bool }\n```\n\n`Partial` 将 T 中所有属性变成可选\n```\nPartial<{ a: bool }> = { a?: bool }\n```\n\n`Readonly` 将 T 中所有属性变成只读,后续 ts 会检测该类型不允许修改\n```\nconst person2: Readonly<{name: string}> = {name: '22'}\nperson2.name = '33' //error\n```\n`Omit` 删除某些属性\n```\ninterface Person {\n name: string;\n age: number;\n}\n \ntype Name = Omit;\nName 的类型定义为 { name: string }\n```\n\n`Pick` 选择类型中的某些属性\n```\ninterface Person {\n name: string;\n age: number;\n}\ntype Name = Pick;\nName 的类型定义为 { name: string }\n```\n\n\n`Exclude` 删除类型 T 中 deleteT 的类型, 相当于 Omit, 第二个值可以是 keys ,也可以是一个类型变量\n```\ninterface Person {\n name: string;\n age: number;\n}\ntype Age = { age: number }\ntype Name = Exclude\nName 的类型定义为 { name: string }\n```\n\n\n`Extract` 提取 T 继承于的 U 类型\n```\ntype Person = { name: string ; age: number } \ntype PersonDetail = { pet: any; phone: number } \ntype Name = { name: string }\ntype Name = Extract\n 将提取出含有 name 的类型 Person\n```\n\n\n`Parameters` 获取函数类型的函数类型\n```\ntype getName = (perpson: Person) => string;\ntype queryType = Parameters;\nqueryType 的类型定义为 Person\n```\n\n`ReturnType` 获取函数类型的返回值类型\n```\ntype getName = (perpson: Person) => string;\ntype resType = ReturnType;\nvalueType 类型为 string\n```\n\n`Awaited` 获取异步返回的值类型\n```\ntype getPerson = (id: string) => Promise\ntype resType = ReturnType // Promise\ntype valueType = Awaited // Person\n```\n\n`Record` 定义对象的 key 键类型\n```\ntype Keys = 'name' | 'age' \ntype person = Record\n// person 的属性只能为 name 和 age\n```\n\n`NonNullable` 去除类型中定义的 null 和 undefined \n```\ntype PersonHobby = hobby: string | undefined;\ntype Hobby = NonNullable\nHobby 类型为 string\n```\n\n### 类型操作\n\n`typeof Object` 获得`对象`的类型\n```\nconst person1 = { name: '22', age: 1}\ntype Person = typeof person1\nPerson 类型为 { name: string; age: number }\n```\n\n`keyof T` 获得类型中的属性\n```\ntype Person = { name: string; age: number }\ntype Key = keyof Person \nkey 的类型为 'name' | 'age'\n```\n通常我们可以通过 keyof 约束对象的传参, 如\n```\ntype Person = { name: string; age: number }\ntype Key = keyof Person;\ntype getPersonAtrribute = (person: Person, key: Key) => Person[Key];\n```\n或者某些情况下我们想知道一个对象的属性值 \n```\nconst workPerson = { \n\t'1': { name: '1', age: 1},\n\t'2': { name: '2', age: 2},\n}\ntype WorkPerson = typeof workPerson; // { '1': {name: string; age: number }, '2': {name: string; age: number }\ntype Key = keyof WorkPerson // '1' | '2'\ntype Person = WorkPerson[Key] // {name: string; age: number }\n```\n `|` 类型兼容\n```\ntype width = 'string' | 'number';\n\n则 width 可以是 '32px' 也可以是 '32' 在 渲染时兼容两种类型\n```\n\n\n### 函数重载\n\n定义不同类型的输入,推到出不同类型的输出\n\n```\ntype PersonListQuery = { user_ids: string[] };\ntype DongListQuery = { dog_ids: string[] };\nfunction getList(request: PersonListQuery): Person[];\nfunction getList(request: DogListQuery): Dog[];\n\nfunction getList(query: PersonListQuery | DogListQuery) {\n if ('user_ids' in query) { \n return [] as Person[];\n } else {\n return [] as Dog[];\n }\n}\n\nconst a = getList({ personIds: [], region: 'us'})\n此时 a 的类型将能推到出是 Person[]\n```\n\n### 泛型\n类型的传参。 用 T 标识,在实际运用时你传入什么类型,该类型就作为后续推导。\n```\nasync function request(url: string): Promise {\n const res = await fetch(url)\n return res.json();\n}\n\nconst res = await request('getPersonInfo?id=1'); \n此时 ts 可以推导出 res 的类型是 Person\n```\n\n### Infer 类型参数使用\n通过 Infer 一个类型为变量,定义出获取类型的方法\n```\ntype addResultType = T extends { a: infer U, b: infer U } ? U : never;\ntype numberAdd = addResultType<{ a: 1, b: 2 }> // 推到出结果类型为 number\ntype textAdd = addResultType<{ a: 'hello', b: 'world' }> // 推到出结果类型为 string\n```\n\n\n### 枚举 enum\n变量的值是约定的几个取值\n\n```\nconst enum PageType {\n HOME = 'home',\n VIDEO = 'video',\n}\n\nfunction getPageUrl(page: PageType) {\n return {\n [PageType.VIDEO]: \"/video\",\n [PageType.HOME]: \"/home\",\n }[page];\n}\n```\n\n\n## tsconfig\n了解了 ts 对于类型的定义和各种规则后,我们则可以在编写 js 代码时利用并进行类型约束。于此同时,我们需要引入 typescript 库去获得这些 ts 能力。\n\n### 如何引入\n```\nnpm install typescript \n// 不必再多说\n```\n\n### 命令\ntypescript 包是有命令文件的,通常 ts 的运行则是通过 tsc 配合相关命令去执行的. 具体命令大家可以安装包之后通过 tsc -h 查看\n![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/349ffc362f0d831a780d2d7f754893a1.png)\n\n### 配置 [官网](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html)\n如果你看了 tsc 命令,你会发现它是有很多命令的,并且有的命令还伴随这相关参数。在工作文件夹中,我们则通过配置文件 `tsconfig.js ` 去配置,保证在项目中的运用。 配置参数这里就不细讲了,还是看官方文档靠谱点。\n"}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsdW1MIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3R5cGVzY3JpcHQubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyBsZWFybiB0eXBlc2NyaXB0XFxuIyMjIOexu+Wei1xcbuWfuuacrOexu+WeizogXFxuYGBgXFxuc3RyaW5nIG51bWJlciBib29sIFxcbmBgYFxcblxcbuaVsOe7hCBgW11gOiAgXFxuYGBgXFxuc3RyaW5nW10gIG51bWJlcltdXFxuYGBgXFxuXFxu5YWD56WWOiAgXFxuYGBgXFxuW3N0cmluZywgbnVtYmVyXS4g5pWw57uE5Lit5pyJ5LiN5ZCM55qE5pWw5o2u57G75Z6LXFxuYGBgXFxuXFxu5a+56LGhOlxcbmBgYFxcbnsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XFxuYGBgXFxuXFxu5Ye95pWw77yaXFxuYGBgXFxuKGFyZzE6IHN0cmluZywgYXJnPzogYm9vbCkgPT4gdm9pZFxcbmBgYFxcblxcblN5bWJvbDogIFxcbmBgYFxcbmxldCBzeW1ib2wgPSBTeW1ib2woXFxcImtleVxcXCIpOyBcXG5gYGBcXG5cXG7nqbrvvJpcXG5gYGBcXG51bmRlZmluZWQgICBudWxsXFxuYGBgXFxuXFxu5Lu75L2V57G75Z6L77yaIFxcbmBgYFxcbmFueVxcbmBgYFxcblxcbuS4jeWtmOWcqOeahOWAvO+8miBcXG5gYGBcXG5uZXZlclxcbmBgYFxcblxcbiMjIyDlpoLkvZXlrprkuYnnsbvlnotcXG5gdHlwZWAgIOWumuS5ieexu+Wei+WPmOmHj1xcbmBgYFxcbnR5cGUgUGVyc29uID0geyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyfVxcbnRzIOS9v+eUqCBjb25zdCBwZXJzb24x77yaUGVyc29uID0geyBuYW1lOiAnMjInLCBhZ2U6IDF9O1xcbmBgYFxcblxcbmBJbnRlcmZhY2VzYCDlo7DmmI4gYOWvueixoWAg57G75Z6L55qE5LiA56eN5pa55rOVXFxuYGBgXFxuSW50ZXJmYWNlIFBlcnNvbiB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXJ9XFxuYGBgXFxuXFxuYGV4dGVuZHNgIOexu+Wei+e7p+aJv+S6juWjsOaYjueahOexu+Wei1xcbmBgYFxcbmludGVyZmFjZSBhIHsgbmFtZTogc3RyaW5nfVxcbmludGVyZmFjZSBiIGV4dGVuZHMgYSB7XFxuXFx0YWdlOiBudW1iZXJcXG59XFxuYiDnmoTnsbvlnovnrYnkuo4geyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG5gYGBcXG5cXG5pbiDliKTmlq3lsZ7mgKfmmK/lk6rkuKrnsbvlnovkuK3nmoRcXG5gYGBcXG50eXBlIFBlcnNvbkxpc3RRdWVyeSA9IHsgdXNlcl9pZHM6IHN0cmluZ1tdIH1cXG50eXBlIERvZ0xpc3RRdWVyeSA9IHsgZG9nX2lkczogc3RyaW5nW10gfVxcblxcbmZ1bmN0aW9uIGdldExpc3QocXVlcnk6IFBlcnNvbkxpc3RRdWVyeSB8IERvZ0xpc3RRdWVyeSApIHtcXG5cXHRpZiAoJ3VzZXJfaWRzJyBpbiBQZXJzb25MaXN0UXVlcnkpIHtcXG5cXHQgXFx0Ly8g6L+Z6YeM5Y+v5Lul5o6o5a+85Ye6IHF1ZXJ5IOexu+Wei+aYryBQZXJzb25MaXN0UXVlcnlcXG5cXHR9XFxufVxcblxcbmBgYFxcblxcblxcbiMjIyDnsbvlnovnu4TlkIhcXG5cXG5gUmVxdWlyZWQ8VD5gIOWwhiBUIOS4reaJgOacieWxnuaAp+WPmOaIkOW/hemAiVxcbmBgYFxcblJlcXVpcmVkPHsgYT86IGJvb2x9ID4gPSB7IGE6IGJvb2wgfVxcbmBgYFxcblxcbmBQYXJ0aWFsPFQ+YCDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlj6/pgIlcXG5gYGBcXG5QYXJ0aWFsPHsgYTogYm9vbCB9PiA9IHsgYT86IGJvb2wgfVxcbmBgYFxcblxcbmBSZWFkb25seTxUPmAg5bCGIFQg5Lit5omA5pyJ5bGe5oCn5Y+Y5oiQ5Y+q6K+777yM5ZCO57utIHRzIOS8muajgOa1i+ivpeexu+Wei+S4jeWFgeiuuOS/ruaUuVxcbmBgYFxcbmNvbnN0IHBlcnNvbjI6IFJlYWRvbmx5PHtuYW1lOiBzdHJpbmd9PiA9IHtuYW1lOiAnMjInfVxcbnBlcnNvbjIubmFtZSA9ICczMycgLy9lcnJvclxcbmBgYFxcbmBPbWl0PFQsIGtleXM+YCDliKDpmaTmn5DkupvlsZ7mgKdcXG5gYGBcXG5pbnRlcmZhY2UgUGVyc29uIHtcXG4gIG5hbWU6IHN0cmluZztcXG4gIGFnZTogbnVtYmVyO1xcbn1cXG4gXFxudHlwZSBOYW1lID0gT21pdDxQZXJzb24sICdhZ2UnPjtcXG5OYW1lIOeahOexu+Wei+WumuS5ieS4uiB7IG5hbWU6IHN0cmluZyB9XFxuYGBgXFxuXFxuYFBpY2s8VCwga2V5cz5gIOmAieaLqeexu+Wei+S4reeahOafkOS6m+WxnuaAp1xcbmBgYFxcbmludGVyZmFjZSBQZXJzb24ge1xcbiAgbmFtZTogc3RyaW5nO1xcbiAgYWdlOiBudW1iZXI7XFxufVxcbnR5cGUgTmFtZSA9IFBpY2s8UGVyc29uLCAnbmFtZSc+O1xcbk5hbWUg55qE57G75Z6L5a6a5LmJ5Li6IHsgbmFtZTogc3RyaW5nIH1cXG5gYGBcXG5cXG5cXG5gRXhjbHVkZTxULCBkZWxldGVUPmAg5Yig6Zmk57G75Z6LIFQg5LitIGRlbGV0ZVQg55qE57G75Z6L77yMIOebuOW9k+S6jiBPbWl0LCDnrKzkuozkuKrlgLzlj6/ku6XmmK8ga2V5cyDvvIzkuZ/lj6/ku6XmmK/kuIDkuKrnsbvlnovlj5jph49cXG5gYGBcXG5pbnRlcmZhY2UgUGVyc29uIHtcXG4gIG5hbWU6IHN0cmluZztcXG4gIGFnZTogbnVtYmVyO1xcbn1cXG50eXBlIEFnZSA9IHsgYWdlOiBudW1iZXIgfVxcbnR5cGUgTmFtZSA9IEV4Y2x1ZGU8UGVyc29uLCBBZ2U+XFxuTmFtZSDnmoTnsbvlnovlrprkuYnkuLogeyBuYW1lOiBzdHJpbmcgfVxcbmBgYFxcblxcblxcbmBFeHRyYWN0PFQsIFU+YCDmj5Dlj5YgVCDnu6fmib/kuo7nmoQgVSDnsbvlnotcXG5gYGBcXG50eXBlIFBlcnNvbiA9IHsgIG5hbWU6IHN0cmluZyA7IGFnZTogbnVtYmVyIH0gXFxudHlwZSBQZXJzb25EZXRhaWwgPSB7IHBldDogYW55OyBwaG9uZTogbnVtYmVyIH0gXFxudHlwZSBOYW1lID0geyBuYW1lOiBzdHJpbmcgfVxcbnR5cGUgTmFtZSA9IEV4dHJhY3Q8UGVyc29uIHwgUGVyc29uRGV0YWlsICwgTmFtZT5cXG4g5bCG5o+Q5Y+W5Ye65ZCr5pyJIG5hbWUg55qE57G75Z6LIFBlcnNvblxcbmBgYFxcblxcblxcbmBQYXJhbWV0ZXJzPGZ1bmN0aW9uIFQ+YCDojrflj5blh73mlbDnsbvlnovnmoTlh73mlbDnsbvlnotcXG5gYGBcXG50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9PiBzdHJpbmc7XFxudHlwZSBxdWVyeVR5cGUgPSBQYXJhbWV0ZXJzPGdldE5hbWU+O1xcbnF1ZXJ5VHlwZSAg55qE57G75Z6L5a6a5LmJ5Li6IFBlcnNvblxcbmBgYFxcblxcbmBSZXR1cm5UeXBlPGZ1bmN0aW9uIFQ+YCDojrflj5blh73mlbDnsbvlnovnmoTov5Tlm57lgLznsbvlnotcXG5gYGBcXG50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9PiBzdHJpbmc7XFxudHlwZSByZXNUeXBlID0gUmV0dXJuVHlwZTxnZXROYW1lPjtcXG52YWx1ZVR5cGUg57G75Z6L5Li6IHN0cmluZ1xcbmBgYFxcblxcbmBBd2FpdGVkPFByb21pc2UgVHlwZT5gIOiOt+WPluW8guatpei/lOWbnueahOWAvOexu+Wei1xcbmBgYFxcbnR5cGUgZ2V0UGVyc29uID0gKGlkOiBzdHJpbmcpID0+IFByb21pc2U8UGVyc29uPlxcbnR5cGUgcmVzVHlwZSA9IFJldHVyblR5cGU8Z2V0UGVyc29uPiAvLyBQcm9taXNlPFBlcnNvbj5cXG50eXBlIHZhbHVlVHlwZSA9IEF3YWl0ZWQ8cmVzVHlwZT4gLy8gUGVyc29uXFxuYGBgXFxuXFxuYFJlY29yZDxLIGV4dGVuZHMga2V5b2YgYW55LCBUPmAgIOWumuS5ieWvueixoeeahCBrZXkg6ZSu57G75Z6LXFxuYGBgXFxudHlwZSBLZXlzID0gJ25hbWUnIHwgJ2FnZScgXFxudHlwZSBwZXJzb24gPSBSZWNvcmQ8S2V5cywgYW55Plxcbi8vIHBlcnNvbiDnmoTlsZ7mgKflj6rog73kuLogbmFtZSDlkowgYWdlXFxuYGBgXFxuXFxuYE5vbk51bGxhYmxlPFQ+YCDljrvpmaTnsbvlnovkuK3lrprkuYnnmoQgbnVsbCDlkowgdW5kZWZpbmVkIFxcbmBgYFxcbnR5cGUgUGVyc29uSG9iYnkgPSBob2JieTogc3RyaW5nIHwgdW5kZWZpbmVkO1xcbnR5cGUgSG9iYnkgPSBOb25OdWxsYWJsZTxob2JieT5cXG5Ib2JieSDnsbvlnovkuLogIHN0cmluZ1xcbmBgYFxcblxcbiMjIyDnsbvlnovmk43kvZxcXG5cXG5gdHlwZW9mIE9iamVjdGAg6I635b6XYOWvueixoWDnmoTnsbvlnotcXG5gYGBcXG5jb25zdCBwZXJzb24xID0geyBuYW1lOiAnMjInLCBhZ2U6IDF9XFxudHlwZSBQZXJzb24gPSB0eXBlb2YgcGVyc29uMVxcblBlcnNvbiDnsbvlnovkuLogeyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG5gYGBcXG5cXG5ga2V5b2YgVGAgIOiOt+W+l+exu+Wei+S4reeahOWxnuaAp1xcbmBgYFxcbnR5cGUgUGVyc29uID0geyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG50eXBlIEtleSA9IGtleW9mIFBlcnNvbiBcXG5rZXkg55qE57G75Z6L5Li6ICduYW1lJyB8ICdhZ2UnXFxuYGBgXFxu6YCa5bi45oiR5Lus5Y+v5Lul6YCa6L+HIGtleW9mIOe6puadn+WvueixoeeahOS8oOWPgu+8jCDlpoJcXG5gYGBcXG50eXBlIFBlcnNvbiA9IHsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XFxudHlwZSBLZXkgPSBrZXlvZiBQZXJzb247XFxudHlwZSBnZXRQZXJzb25BdHJyaWJ1dGUgPSAocGVyc29uOiBQZXJzb24sIGtleTogS2V5KSA9PiBQZXJzb25bS2V5XTtcXG5gYGBcXG7miJbogIXmn5Dkupvmg4XlhrXkuIvmiJHku6zmg7Pnn6XpgZPkuIDkuKrlr7nosaHnmoTlsZ7mgKflgLwgXFxuYGBgXFxuY29uc3Qgd29ya1BlcnNvbiA9IHsgXFxuXFx0JzEnOiB7IG5hbWU6ICcxJywgYWdlOiAxfSxcXG5cXHQnMic6IHsgbmFtZTogJzInLCBhZ2U6IDJ9LFxcbn1cXG50eXBlIFdvcmtQZXJzb24gID0gdHlwZW9mIHdvcmtQZXJzb247ICAvLyB7ICcxJzoge25hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfSwgJzInOiB7bmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XFxudHlwZSBLZXkgPSBrZXlvZiBXb3JrUGVyc29uICAvLyAnMScgfCAnMidcXG50eXBlIFBlcnNvbiA9IFdvcmtQZXJzb25bS2V5XSAgIC8vIHtuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG5gYGBcXG4gYHxgIOexu+Wei+WFvOWuuVxcbmBgYFxcbnR5cGUgd2lkdGggPSAnc3RyaW5nJyB8ICdudW1iZXInO1xcblxcbuWImSB3aWR0aCDlj6/ku6XmmK8gJzMycHgnIOS5n+WPr+S7peaYryAnMzInIOWcqCDmuLLmn5Pml7blhbzlrrnkuKTnp43nsbvlnotcXG5gYGBcXG5cXG5cXG4jIyMg5Ye95pWw6YeN6L29XFxuXFxu5a6a5LmJ5LiN5ZCM57G75Z6L55qE6L6T5YWl77yM5o6o5Yiw5Ye65LiN5ZCM57G75Z6L55qE6L6T5Ye6XFxuXFxuYGBgXFxudHlwZSBQZXJzb25MaXN0UXVlcnkgPSB7IHVzZXJfaWRzOiBzdHJpbmdbXSB9O1xcbnR5cGUgRG9uZ0xpc3RRdWVyeSA9IHsgZG9nX2lkczogc3RyaW5nW10gfTtcXG5mdW5jdGlvbiBnZXRMaXN0KHJlcXVlc3Q6IFBlcnNvbkxpc3RRdWVyeSk6IFBlcnNvbltdO1xcbmZ1bmN0aW9uIGdldExpc3QocmVxdWVzdDogRG9nTGlzdFF1ZXJ5KTogRG9nW107XFxuXFxuZnVuY3Rpb24gZ2V0TGlzdChxdWVyeTogUGVyc29uTGlzdFF1ZXJ5IHwgRG9nTGlzdFF1ZXJ5KSB7XFxuICBpZiAoJ3VzZXJfaWRzJyBpbiBxdWVyeSkgeyAgXFxuICAgIHJldHVybiBbXSBhcyBQZXJzb25bXTtcXG4gIH0gZWxzZSB7XFxuICAgIHJldHVybiBbXSBhcyBEb2dbXTtcXG4gIH1cXG59XFxuXFxuY29uc3QgYSA9IGdldExpc3QoeyBwZXJzb25JZHM6IFtdLCByZWdpb246ICd1cyd9KVxcbuatpOaXtiBhIOeahOexu+Wei+WwhuiDveaOqOWIsOWHuuaYryBQZXJzb25bXVxcbmBgYFxcblxcbiMjIyDms5vlnotcXG7nsbvlnovnmoTkvKDlj4LjgIIg55SoIFQg5qCH6K+G77yM5Zyo5a6e6ZmF6L+Q55So5pe25L2g5Lyg5YWl5LuA5LmI57G75Z6L77yM6K+l57G75Z6L5bCx5L2c5Li65ZCO57ut5o6o5a+844CCXFxuYGBgXFxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdDxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKVxcbiAgcmV0dXJuIHJlcy5qc29uKCk7XFxufVxcblxcbmNvbnN0IHJlcyA9IGF3YWl0IHJlcXVlc3Q8UGVyc29uPignZ2V0UGVyc29uSW5mbz9pZD0xJyk7IFxcbuatpOaXtiB0cyDlj6/ku6Xmjqjlr7zlh7ogcmVzIOeahOexu+Wei+aYryBQZXJzb25cXG5gYGBcXG5cXG4jIyMgSW5mZXIgIOexu+Wei+WPguaVsOS9v+eUqFxcbumAmui/hyBJbmZlciDkuIDkuKrnsbvlnovkuLrlj5jph4/vvIzlrprkuYnlh7rojrflj5bnsbvlnovnmoTmlrnms5VcXG5gYGBcXG50eXBlIGFkZFJlc3VsdFR5cGU8VD4gPSBUIGV4dGVuZHMgeyBhOiBpbmZlciBVLCBiOiBpbmZlciBVIH0gPyAgVSA6IG5ldmVyO1xcbnR5cGUgbnVtYmVyQWRkID0gIGFkZFJlc3VsdFR5cGU8eyBhOiAxLCBiOiAyIH0+ICAgICAvLyDmjqjliLDlh7rnu5PmnpznsbvlnovkuLogbnVtYmVyXFxudHlwZSB0ZXh0QWRkID0gYWRkUmVzdWx0VHlwZTx7IGE6ICdoZWxsbycsIGI6ICd3b3JsZCcgfT4gICAgIC8vIOaOqOWIsOWHuue7k+aenOexu+Wei+S4uiBzdHJpbmdcXG5gYGBcXG5cXG5cXG4jIyMg5p6a5Li+IGVudW1cXG7lj5jph4/nmoTlgLzmmK/nuqblrprnmoTlh6DkuKrlj5blgLxcXG5cXG5gYGBcXG5jb25zdCBlbnVtIFBhZ2VUeXBlIHtcXG4gIEhPTUUgPSAnaG9tZScsXFxuICBWSURFTyA9ICd2aWRlbycsXFxufVxcblxcbmZ1bmN0aW9uIGdldFBhZ2VVcmwocGFnZTogUGFnZVR5cGUpIHtcXG4gIHJldHVybiB7XFxuICAgIFtQYWdlVHlwZS5WSURFT106IFxcXCIvdmlkZW9cXFwiLFxcbiAgICBbUGFnZVR5cGUuSE9NRV06IFxcXCIvaG9tZVxcXCIsXFxuICB9W3BhZ2VdO1xcbn1cXG5gYGBcXG5cXG5cXG4jIyB0c2NvbmZpZ1xcbuS6huino+S6hiB0cyDlr7nkuo7nsbvlnovnmoTlrprkuYnlkozlkITnp43op4TliJnlkI7vvIzmiJHku6zliJnlj6/ku6XlnKjnvJblhpkganMg5Luj56CB5pe25Yip55So5bm26L+b6KGM57G75Z6L57qm5p2f44CC5LqO5q2k5ZCM5pe277yM5oiR5Lus6ZyA6KaB5byV5YWlIHR5cGVzY3JpcHQg5bqT5Y676I635b6X6L+Z5LqbIHRzIOiDveWKm+OAglxcblxcbiMjIyDlpoLkvZXlvJXlhaVcXG5gYGBcXG5ucG0gaW5zdGFsbCAgdHlwZXNjcmlwdCAgXFxuLy8g5LiN5b+F5YaN5aSa6K+0XFxuYGBgXFxuXFxuIyMjIOWRveS7pFxcbnR5cGVzY3JpcHQg5YyF5piv5pyJ5ZG95Luk5paH5Lu255qE77yM6YCa5bi4IHRzIOeahOi/kOihjOWImeaYr+mAmui/hyB0c2Mg6YWN5ZCI55u45YWz5ZG95Luk5Y675omn6KGM55qELiDlhbfkvZPlkb3ku6TlpKflrrblj6/ku6Xlronoo4XljIXkuYvlkI7pgJrov4cgdHNjIC1oIOafpeeci1xcbiFb5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXShodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS8zNDlmZmMzNjJmMGQ4MzFhNzgwZDJkN2Y3NTQ4OTNhMS5wbmcpXFxuXFxuIyMjIOmFjee9riBb5a6Y572RXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay90c2NvbmZpZy1qc29uLmh0bWwpXFxu5aaC5p6c5L2g55yL5LqGIHRzYyDlkb3ku6TvvIzkvaDkvJrlj5HnjrDlroPmmK/mnInlvojlpJrlkb3ku6TnmoTvvIzlubbkuJTmnInnmoTlkb3ku6Tov5jkvLTpmo/ov5nnm7jlhbPlj4LmlbDjgILlnKjlt6XkvZzmlofku7blpLnkuK3vvIzmiJHku6zliJnpgJrov4fphY3nva7mlofku7YgYHRzY29uZmlnLmpzIGAg5Y676YWN572u77yM5L+d6K+B5Zyo6aG555uu5Lit55qE6L+Q55So44CCIOmFjee9ruWPguaVsOi/memHjOWwseS4jee7huiusuS6hu+8jOi/mOaYr+eci+WumOaWueaWh+aho+mdoOiwseeCueOAglxcblwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[581],{2581:(n,e,r)=>{r.r(e),r.d(e,{default:()=>t});const t="## learn typescript\n### 类型\n基本类型: \n```\nstring number bool \n```\n\n数组 `[]`: \n```\nstring[] number[]\n```\n\n元祖: \n```\n[string, number]. 数组中有不同的数据类型\n```\n\n对象:\n```\n{ name: string; age: number }\n```\n\n函数:\n```\n(arg1: string, arg?: bool) => void\n```\n\nSymbol: \n```\nlet symbol = Symbol(\"key\"); \n```\n\n空:\n```\nundefined null\n```\n\n任何类型: \n```\nany\n```\n\n不存在的值: \n```\nnever\n```\n\n### 如何定义类型\n`type` 定义类型变量\n```\ntype Person = { name: string; age: number}\nts 使用 const person1:Person = { name: '22', age: 1};\n```\n\n`Interfaces` 声明 `对象` 类型的一种方法\n```\nInterface Person { name: string; age: number}\n```\n\n`extends` 类型继承于声明的类型\n```\ninterface a { name: string}\ninterface b extends a {\n\tage: number\n}\nb 的类型等于 { name: string; age: number }\n```\n\nin 判断属性是哪个类型中的\n```\ntype PersonListQuery = { user_ids: string[] }\ntype DogListQuery = { dog_ids: string[] }\n\nfunction getList(query: PersonListQuery | DogListQuery ) {\n\tif ('user_ids' in PersonListQuery) {\n\t \t// 这里可以推导出 query 类型是 PersonListQuery\n\t}\n}\n\n```\n\n\n### 类型组合\n\n`Required` 将 T 中所有属性变成必选\n```\nRequired<{ a?: bool} > = { a: bool }\n```\n\n`Partial` 将 T 中所有属性变成可选\n```\nPartial<{ a: bool }> = { a?: bool }\n```\n\n`Readonly` 将 T 中所有属性变成只读,后续 ts 会检测该类型不允许修改\n```\nconst person2: Readonly<{name: string}> = {name: '22'}\nperson2.name = '33' //error\n```\n`Omit` 删除某些属性\n```\ninterface Person {\n name: string;\n age: number;\n}\n \ntype Name = Omit;\nName 的类型定义为 { name: string }\n```\n\n`Pick` 选择类型中的某些属性\n```\ninterface Person {\n name: string;\n age: number;\n}\ntype Name = Pick;\nName 的类型定义为 { name: string }\n```\n\n\n`Exclude` 删除类型 T 中 deleteT 的类型, 相当于 Omit, 第二个值可以是 keys ,也可以是一个类型变量\n```\ninterface Person {\n name: string;\n age: number;\n}\ntype Age = { age: number }\ntype Name = Exclude\nName 的类型定义为 { name: string }\n```\n\n\n`Extract` 提取 T 继承于的 U 类型\n```\ntype Person = { name: string ; age: number } \ntype PersonDetail = { pet: any; phone: number } \ntype Name = { name: string }\ntype Name = Extract\n 将提取出含有 name 的类型 Person\n```\n\n\n`Parameters` 获取函数类型的函数类型\n```\ntype getName = (perpson: Person) => string;\ntype queryType = Parameters;\nqueryType 的类型定义为 Person\n```\n\n`ReturnType` 获取函数类型的返回值类型\n```\ntype getName = (perpson: Person) => string;\ntype resType = ReturnType;\nvalueType 类型为 string\n```\n\n`Awaited` 获取异步返回的值类型\n```\ntype getPerson = (id: string) => Promise\ntype resType = ReturnType // Promise\ntype valueType = Awaited // Person\n```\n\n`Record` 定义对象的 key 键类型\n```\ntype Keys = 'name' | 'age' \ntype person = Record\n// person 的属性只能为 name 和 age\n```\n\n`NonNullable` 去除类型中定义的 null 和 undefined \n```\ntype PersonHobby = hobby: string | undefined;\ntype Hobby = NonNullable\nHobby 类型为 string\n```\n\n### 类型操作\n\n`typeof Object` 获得`对象`的类型\n```\nconst person1 = { name: '22', age: 1}\ntype Person = typeof person1\nPerson 类型为 { name: string; age: number }\n```\n\n`keyof T` 获得类型中的属性\n```\ntype Person = { name: string; age: number }\ntype Key = keyof Person \nkey 的类型为 'name' | 'age'\n```\n通常我们可以通过 keyof 约束对象的传参, 如\n```\ntype Person = { name: string; age: number }\ntype Key = keyof Person;\ntype getPersonAtrribute = (person: Person, key: Key) => Person[Key];\n```\n或者某些情况下我们想知道一个对象的属性值 \n```\nconst workPerson = { \n\t'1': { name: '1', age: 1},\n\t'2': { name: '2', age: 2},\n}\ntype WorkPerson = typeof workPerson; // { '1': {name: string; age: number }, '2': {name: string; age: number }\ntype Key = keyof WorkPerson // '1' | '2'\ntype Person = WorkPerson[Key] // {name: string; age: number }\n```\n `|` 类型兼容\n```\ntype width = 'string' | 'number';\n\n则 width 可以是 '32px' 也可以是 '32' 在 渲染时兼容两种类型\n```\n\n\n### 函数重载\n\n定义不同类型的输入,推到出不同类型的输出\n\n```\ntype PersonListQuery = { user_ids: string[] };\ntype DongListQuery = { dog_ids: string[] };\nfunction getList(request: PersonListQuery): Person[];\nfunction getList(request: DogListQuery): Dog[];\n\nfunction getList(query: PersonListQuery | DogListQuery) {\n if ('user_ids' in query) { \n return [] as Person[];\n } else {\n return [] as Dog[];\n }\n}\n\nconst a = getList({ personIds: [], region: 'us'})\n此时 a 的类型将能推到出是 Person[]\n```\n\n### 泛型\n类型的传参。 用 T 标识,在实际运用时你传入什么类型,该类型就作为后续推导。\n```\nasync function request(url: string): Promise {\n const res = await fetch(url)\n return res.json();\n}\n\nconst res = await request('getPersonInfo?id=1'); \n此时 ts 可以推导出 res 的类型是 Person\n```\n\n### Infer 类型参数使用\n通过 Infer 一个类型为变量,定义出获取类型的方法\n```\ntype addResultType = T extends { a: infer U, b: infer U } ? U : never;\ntype numberAdd = addResultType<{ a: 1, b: 2 }> // 推到出结果类型为 number\ntype textAdd = addResultType<{ a: 'hello', b: 'world' }> // 推到出结果类型为 string\n```\n\n\n### 枚举 enum\n变量的值是约定的几个取值\n\n```\nconst enum PageType {\n HOME = 'home',\n VIDEO = 'video',\n}\n\nfunction getPageUrl(page: PageType) {\n return {\n [PageType.VIDEO]: \"/video\",\n [PageType.HOME]: \"/home\",\n }[page];\n}\n```\n\n\n## tsconfig\n了解了 ts 对于类型的定义和各种规则后,我们则可以在编写 js 代码时利用并进行类型约束。于此同时,我们需要引入 typescript 库去获得这些 ts 能力。\n\n### 如何引入\n```\nnpm install typescript \n// 不必再多说\n```\n\n### 命令\ntypescript 包是有命令文件的,通常 ts 的运行则是通过 tsc 配合相关命令去执行的. 具体命令大家可以安装包之后通过 tsc -h 查看\n![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/349ffc362f0d831a780d2d7f754893a1.png)\n\n### 配置 [官网](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html)\n如果你看了 tsc 命令,你会发现它是有很多命令的,并且有的命令还伴随这相关参数。在工作文件夹中,我们则通过配置文件 `tsconfig.js ` 去配置,保证在项目中的运用。 配置参数这里就不细讲了,还是看官方文档靠谱点。\n"}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgxLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsdW1MIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3R5cGVzY3JpcHQubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyBsZWFybiB0eXBlc2NyaXB0XFxuIyMjIOexu+Wei1xcbuWfuuacrOexu+WeizogXFxuYGBgXFxuc3RyaW5nIG51bWJlciBib29sIFxcbmBgYFxcblxcbuaVsOe7hCBgW11gOiAgXFxuYGBgXFxuc3RyaW5nW10gIG51bWJlcltdXFxuYGBgXFxuXFxu5YWD56WWOiAgXFxuYGBgXFxuW3N0cmluZywgbnVtYmVyXS4g5pWw57uE5Lit5pyJ5LiN5ZCM55qE5pWw5o2u57G75Z6LXFxuYGBgXFxuXFxu5a+56LGhOlxcbmBgYFxcbnsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XFxuYGBgXFxuXFxu5Ye95pWw77yaXFxuYGBgXFxuKGFyZzE6IHN0cmluZywgYXJnPzogYm9vbCkgPT4gdm9pZFxcbmBgYFxcblxcblN5bWJvbDogIFxcbmBgYFxcbmxldCBzeW1ib2wgPSBTeW1ib2woXFxcImtleVxcXCIpOyBcXG5gYGBcXG5cXG7nqbrvvJpcXG5gYGBcXG51bmRlZmluZWQgICBudWxsXFxuYGBgXFxuXFxu5Lu75L2V57G75Z6L77yaIFxcbmBgYFxcbmFueVxcbmBgYFxcblxcbuS4jeWtmOWcqOeahOWAvO+8miBcXG5gYGBcXG5uZXZlclxcbmBgYFxcblxcbiMjIyDlpoLkvZXlrprkuYnnsbvlnotcXG5gdHlwZWAgIOWumuS5ieexu+Wei+WPmOmHj1xcbmBgYFxcbnR5cGUgUGVyc29uID0geyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyfVxcbnRzIOS9v+eUqCBjb25zdCBwZXJzb24x77yaUGVyc29uID0geyBuYW1lOiAnMjInLCBhZ2U6IDF9O1xcbmBgYFxcblxcbmBJbnRlcmZhY2VzYCDlo7DmmI4gYOWvueixoWAg57G75Z6L55qE5LiA56eN5pa55rOVXFxuYGBgXFxuSW50ZXJmYWNlIFBlcnNvbiB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXJ9XFxuYGBgXFxuXFxuYGV4dGVuZHNgIOexu+Wei+e7p+aJv+S6juWjsOaYjueahOexu+Wei1xcbmBgYFxcbmludGVyZmFjZSBhIHsgbmFtZTogc3RyaW5nfVxcbmludGVyZmFjZSBiIGV4dGVuZHMgYSB7XFxuXFx0YWdlOiBudW1iZXJcXG59XFxuYiDnmoTnsbvlnovnrYnkuo4geyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG5gYGBcXG5cXG5pbiDliKTmlq3lsZ7mgKfmmK/lk6rkuKrnsbvlnovkuK3nmoRcXG5gYGBcXG50eXBlIFBlcnNvbkxpc3RRdWVyeSA9IHsgdXNlcl9pZHM6IHN0cmluZ1tdIH1cXG50eXBlIERvZ0xpc3RRdWVyeSA9IHsgZG9nX2lkczogc3RyaW5nW10gfVxcblxcbmZ1bmN0aW9uIGdldExpc3QocXVlcnk6IFBlcnNvbkxpc3RRdWVyeSB8IERvZ0xpc3RRdWVyeSApIHtcXG5cXHRpZiAoJ3VzZXJfaWRzJyBpbiBQZXJzb25MaXN0UXVlcnkpIHtcXG5cXHQgXFx0Ly8g6L+Z6YeM5Y+v5Lul5o6o5a+85Ye6IHF1ZXJ5IOexu+Wei+aYryBQZXJzb25MaXN0UXVlcnlcXG5cXHR9XFxufVxcblxcbmBgYFxcblxcblxcbiMjIyDnsbvlnovnu4TlkIhcXG5cXG5gUmVxdWlyZWQ8VD5gIOWwhiBUIOS4reaJgOacieWxnuaAp+WPmOaIkOW/hemAiVxcbmBgYFxcblJlcXVpcmVkPHsgYT86IGJvb2x9ID4gPSB7IGE6IGJvb2wgfVxcbmBgYFxcblxcbmBQYXJ0aWFsPFQ+YCDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlj6/pgIlcXG5gYGBcXG5QYXJ0aWFsPHsgYTogYm9vbCB9PiA9IHsgYT86IGJvb2wgfVxcbmBgYFxcblxcbmBSZWFkb25seTxUPmAg5bCGIFQg5Lit5omA5pyJ5bGe5oCn5Y+Y5oiQ5Y+q6K+777yM5ZCO57utIHRzIOS8muajgOa1i+ivpeexu+Wei+S4jeWFgeiuuOS/ruaUuVxcbmBgYFxcbmNvbnN0IHBlcnNvbjI6IFJlYWRvbmx5PHtuYW1lOiBzdHJpbmd9PiA9IHtuYW1lOiAnMjInfVxcbnBlcnNvbjIubmFtZSA9ICczMycgLy9lcnJvclxcbmBgYFxcbmBPbWl0PFQsIGtleXM+YCDliKDpmaTmn5DkupvlsZ7mgKdcXG5gYGBcXG5pbnRlcmZhY2UgUGVyc29uIHtcXG4gIG5hbWU6IHN0cmluZztcXG4gIGFnZTogbnVtYmVyO1xcbn1cXG4gXFxudHlwZSBOYW1lID0gT21pdDxQZXJzb24sICdhZ2UnPjtcXG5OYW1lIOeahOexu+Wei+WumuS5ieS4uiB7IG5hbWU6IHN0cmluZyB9XFxuYGBgXFxuXFxuYFBpY2s8VCwga2V5cz5gIOmAieaLqeexu+Wei+S4reeahOafkOS6m+WxnuaAp1xcbmBgYFxcbmludGVyZmFjZSBQZXJzb24ge1xcbiAgbmFtZTogc3RyaW5nO1xcbiAgYWdlOiBudW1iZXI7XFxufVxcbnR5cGUgTmFtZSA9IFBpY2s8UGVyc29uLCAnbmFtZSc+O1xcbk5hbWUg55qE57G75Z6L5a6a5LmJ5Li6IHsgbmFtZTogc3RyaW5nIH1cXG5gYGBcXG5cXG5cXG5gRXhjbHVkZTxULCBkZWxldGVUPmAg5Yig6Zmk57G75Z6LIFQg5LitIGRlbGV0ZVQg55qE57G75Z6L77yMIOebuOW9k+S6jiBPbWl0LCDnrKzkuozkuKrlgLzlj6/ku6XmmK8ga2V5cyDvvIzkuZ/lj6/ku6XmmK/kuIDkuKrnsbvlnovlj5jph49cXG5gYGBcXG5pbnRlcmZhY2UgUGVyc29uIHtcXG4gIG5hbWU6IHN0cmluZztcXG4gIGFnZTogbnVtYmVyO1xcbn1cXG50eXBlIEFnZSA9IHsgYWdlOiBudW1iZXIgfVxcbnR5cGUgTmFtZSA9IEV4Y2x1ZGU8UGVyc29uLCBBZ2U+XFxuTmFtZSDnmoTnsbvlnovlrprkuYnkuLogeyBuYW1lOiBzdHJpbmcgfVxcbmBgYFxcblxcblxcbmBFeHRyYWN0PFQsIFU+YCDmj5Dlj5YgVCDnu6fmib/kuo7nmoQgVSDnsbvlnotcXG5gYGBcXG50eXBlIFBlcnNvbiA9IHsgIG5hbWU6IHN0cmluZyA7IGFnZTogbnVtYmVyIH0gXFxudHlwZSBQZXJzb25EZXRhaWwgPSB7IHBldDogYW55OyBwaG9uZTogbnVtYmVyIH0gXFxudHlwZSBOYW1lID0geyBuYW1lOiBzdHJpbmcgfVxcbnR5cGUgTmFtZSA9IEV4dHJhY3Q8UGVyc29uIHwgUGVyc29uRGV0YWlsICwgTmFtZT5cXG4g5bCG5o+Q5Y+W5Ye65ZCr5pyJIG5hbWUg55qE57G75Z6LIFBlcnNvblxcbmBgYFxcblxcblxcbmBQYXJhbWV0ZXJzPGZ1bmN0aW9uIFQ+YCDojrflj5blh73mlbDnsbvlnovnmoTlh73mlbDnsbvlnotcXG5gYGBcXG50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9PiBzdHJpbmc7XFxudHlwZSBxdWVyeVR5cGUgPSBQYXJhbWV0ZXJzPGdldE5hbWU+O1xcbnF1ZXJ5VHlwZSAg55qE57G75Z6L5a6a5LmJ5Li6IFBlcnNvblxcbmBgYFxcblxcbmBSZXR1cm5UeXBlPGZ1bmN0aW9uIFQ+YCDojrflj5blh73mlbDnsbvlnovnmoTov5Tlm57lgLznsbvlnotcXG5gYGBcXG50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9PiBzdHJpbmc7XFxudHlwZSByZXNUeXBlID0gUmV0dXJuVHlwZTxnZXROYW1lPjtcXG52YWx1ZVR5cGUg57G75Z6L5Li6IHN0cmluZ1xcbmBgYFxcblxcbmBBd2FpdGVkPFByb21pc2UgVHlwZT5gIOiOt+WPluW8guatpei/lOWbnueahOWAvOexu+Wei1xcbmBgYFxcbnR5cGUgZ2V0UGVyc29uID0gKGlkOiBzdHJpbmcpID0+IFByb21pc2U8UGVyc29uPlxcbnR5cGUgcmVzVHlwZSA9IFJldHVyblR5cGU8Z2V0UGVyc29uPiAvLyBQcm9taXNlPFBlcnNvbj5cXG50eXBlIHZhbHVlVHlwZSA9IEF3YWl0ZWQ8cmVzVHlwZT4gLy8gUGVyc29uXFxuYGBgXFxuXFxuYFJlY29yZDxLIGV4dGVuZHMga2V5b2YgYW55LCBUPmAgIOWumuS5ieWvueixoeeahCBrZXkg6ZSu57G75Z6LXFxuYGBgXFxudHlwZSBLZXlzID0gJ25hbWUnIHwgJ2FnZScgXFxudHlwZSBwZXJzb24gPSBSZWNvcmQ8S2V5cywgYW55Plxcbi8vIHBlcnNvbiDnmoTlsZ7mgKflj6rog73kuLogbmFtZSDlkowgYWdlXFxuYGBgXFxuXFxuYE5vbk51bGxhYmxlPFQ+YCDljrvpmaTnsbvlnovkuK3lrprkuYnnmoQgbnVsbCDlkowgdW5kZWZpbmVkIFxcbmBgYFxcbnR5cGUgUGVyc29uSG9iYnkgPSBob2JieTogc3RyaW5nIHwgdW5kZWZpbmVkO1xcbnR5cGUgSG9iYnkgPSBOb25OdWxsYWJsZTxob2JieT5cXG5Ib2JieSDnsbvlnovkuLogIHN0cmluZ1xcbmBgYFxcblxcbiMjIyDnsbvlnovmk43kvZxcXG5cXG5gdHlwZW9mIE9iamVjdGAg6I635b6XYOWvueixoWDnmoTnsbvlnotcXG5gYGBcXG5jb25zdCBwZXJzb24xID0geyBuYW1lOiAnMjInLCBhZ2U6IDF9XFxudHlwZSBQZXJzb24gPSB0eXBlb2YgcGVyc29uMVxcblBlcnNvbiDnsbvlnovkuLogeyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG5gYGBcXG5cXG5ga2V5b2YgVGAgIOiOt+W+l+exu+Wei+S4reeahOWxnuaAp1xcbmBgYFxcbnR5cGUgUGVyc29uID0geyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG50eXBlIEtleSA9IGtleW9mIFBlcnNvbiBcXG5rZXkg55qE57G75Z6L5Li6ICduYW1lJyB8ICdhZ2UnXFxuYGBgXFxu6YCa5bi45oiR5Lus5Y+v5Lul6YCa6L+HIGtleW9mIOe6puadn+WvueixoeeahOS8oOWPgu+8jCDlpoJcXG5gYGBcXG50eXBlIFBlcnNvbiA9IHsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XFxudHlwZSBLZXkgPSBrZXlvZiBQZXJzb247XFxudHlwZSBnZXRQZXJzb25BdHJyaWJ1dGUgPSAocGVyc29uOiBQZXJzb24sIGtleTogS2V5KSA9PiBQZXJzb25bS2V5XTtcXG5gYGBcXG7miJbogIXmn5Dkupvmg4XlhrXkuIvmiJHku6zmg7Pnn6XpgZPkuIDkuKrlr7nosaHnmoTlsZ7mgKflgLwgXFxuYGBgXFxuY29uc3Qgd29ya1BlcnNvbiA9IHsgXFxuXFx0JzEnOiB7IG5hbWU6ICcxJywgYWdlOiAxfSxcXG5cXHQnMic6IHsgbmFtZTogJzInLCBhZ2U6IDJ9LFxcbn1cXG50eXBlIFdvcmtQZXJzb24gID0gdHlwZW9mIHdvcmtQZXJzb247ICAvLyB7ICcxJzoge25hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfSwgJzInOiB7bmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XFxudHlwZSBLZXkgPSBrZXlvZiBXb3JrUGVyc29uICAvLyAnMScgfCAnMidcXG50eXBlIFBlcnNvbiA9IFdvcmtQZXJzb25bS2V5XSAgIC8vIHtuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cXG5gYGBcXG4gYHxgIOexu+Wei+WFvOWuuVxcbmBgYFxcbnR5cGUgd2lkdGggPSAnc3RyaW5nJyB8ICdudW1iZXInO1xcblxcbuWImSB3aWR0aCDlj6/ku6XmmK8gJzMycHgnIOS5n+WPr+S7peaYryAnMzInIOWcqCDmuLLmn5Pml7blhbzlrrnkuKTnp43nsbvlnotcXG5gYGBcXG5cXG5cXG4jIyMg5Ye95pWw6YeN6L29XFxuXFxu5a6a5LmJ5LiN5ZCM57G75Z6L55qE6L6T5YWl77yM5o6o5Yiw5Ye65LiN5ZCM57G75Z6L55qE6L6T5Ye6XFxuXFxuYGBgXFxudHlwZSBQZXJzb25MaXN0UXVlcnkgPSB7IHVzZXJfaWRzOiBzdHJpbmdbXSB9O1xcbnR5cGUgRG9uZ0xpc3RRdWVyeSA9IHsgZG9nX2lkczogc3RyaW5nW10gfTtcXG5mdW5jdGlvbiBnZXRMaXN0KHJlcXVlc3Q6IFBlcnNvbkxpc3RRdWVyeSk6IFBlcnNvbltdO1xcbmZ1bmN0aW9uIGdldExpc3QocmVxdWVzdDogRG9nTGlzdFF1ZXJ5KTogRG9nW107XFxuXFxuZnVuY3Rpb24gZ2V0TGlzdChxdWVyeTogUGVyc29uTGlzdFF1ZXJ5IHwgRG9nTGlzdFF1ZXJ5KSB7XFxuICBpZiAoJ3VzZXJfaWRzJyBpbiBxdWVyeSkgeyAgXFxuICAgIHJldHVybiBbXSBhcyBQZXJzb25bXTtcXG4gIH0gZWxzZSB7XFxuICAgIHJldHVybiBbXSBhcyBEb2dbXTtcXG4gIH1cXG59XFxuXFxuY29uc3QgYSA9IGdldExpc3QoeyBwZXJzb25JZHM6IFtdLCByZWdpb246ICd1cyd9KVxcbuatpOaXtiBhIOeahOexu+Wei+WwhuiDveaOqOWIsOWHuuaYryBQZXJzb25bXVxcbmBgYFxcblxcbiMjIyDms5vlnotcXG7nsbvlnovnmoTkvKDlj4LjgIIg55SoIFQg5qCH6K+G77yM5Zyo5a6e6ZmF6L+Q55So5pe25L2g5Lyg5YWl5LuA5LmI57G75Z6L77yM6K+l57G75Z6L5bCx5L2c5Li65ZCO57ut5o6o5a+844CCXFxuYGBgXFxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdDxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKVxcbiAgcmV0dXJuIHJlcy5qc29uKCk7XFxufVxcblxcbmNvbnN0IHJlcyA9IGF3YWl0IHJlcXVlc3Q8UGVyc29uPignZ2V0UGVyc29uSW5mbz9pZD0xJyk7IFxcbuatpOaXtiB0cyDlj6/ku6Xmjqjlr7zlh7ogcmVzIOeahOexu+Wei+aYryBQZXJzb25cXG5gYGBcXG5cXG4jIyMgSW5mZXIgIOexu+Wei+WPguaVsOS9v+eUqFxcbumAmui/hyBJbmZlciDkuIDkuKrnsbvlnovkuLrlj5jph4/vvIzlrprkuYnlh7rojrflj5bnsbvlnovnmoTmlrnms5VcXG5gYGBcXG50eXBlIGFkZFJlc3VsdFR5cGU8VD4gPSBUIGV4dGVuZHMgeyBhOiBpbmZlciBVLCBiOiBpbmZlciBVIH0gPyAgVSA6IG5ldmVyO1xcbnR5cGUgbnVtYmVyQWRkID0gIGFkZFJlc3VsdFR5cGU8eyBhOiAxLCBiOiAyIH0+ICAgICAvLyDmjqjliLDlh7rnu5PmnpznsbvlnovkuLogbnVtYmVyXFxudHlwZSB0ZXh0QWRkID0gYWRkUmVzdWx0VHlwZTx7IGE6ICdoZWxsbycsIGI6ICd3b3JsZCcgfT4gICAgIC8vIOaOqOWIsOWHuue7k+aenOexu+Wei+S4uiBzdHJpbmdcXG5gYGBcXG5cXG5cXG4jIyMg5p6a5Li+IGVudW1cXG7lj5jph4/nmoTlgLzmmK/nuqblrprnmoTlh6DkuKrlj5blgLxcXG5cXG5gYGBcXG5jb25zdCBlbnVtIFBhZ2VUeXBlIHtcXG4gIEhPTUUgPSAnaG9tZScsXFxuICBWSURFTyA9ICd2aWRlbycsXFxufVxcblxcbmZ1bmN0aW9uIGdldFBhZ2VVcmwocGFnZTogUGFnZVR5cGUpIHtcXG4gIHJldHVybiB7XFxuICAgIFtQYWdlVHlwZS5WSURFT106IFxcXCIvdmlkZW9cXFwiLFxcbiAgICBbUGFnZVR5cGUuSE9NRV06IFxcXCIvaG9tZVxcXCIsXFxuICB9W3BhZ2VdO1xcbn1cXG5gYGBcXG5cXG5cXG4jIyB0c2NvbmZpZ1xcbuS6huino+S6hiB0cyDlr7nkuo7nsbvlnovnmoTlrprkuYnlkozlkITnp43op4TliJnlkI7vvIzmiJHku6zliJnlj6/ku6XlnKjnvJblhpkganMg5Luj56CB5pe25Yip55So5bm26L+b6KGM57G75Z6L57qm5p2f44CC5LqO5q2k5ZCM5pe277yM5oiR5Lus6ZyA6KaB5byV5YWlIHR5cGVzY3JpcHQg5bqT5Y676I635b6X6L+Z5LqbIHRzIOiDveWKm+OAglxcblxcbiMjIyDlpoLkvZXlvJXlhaVcXG5gYGBcXG5ucG0gaW5zdGFsbCAgdHlwZXNjcmlwdCAgXFxuLy8g5LiN5b+F5YaN5aSa6K+0XFxuYGBgXFxuXFxuIyMjIOWRveS7pFxcbnR5cGVzY3JpcHQg5YyF5piv5pyJ5ZG95Luk5paH5Lu255qE77yM6YCa5bi4IHRzIOeahOi/kOihjOWImeaYr+mAmui/hyB0c2Mg6YWN5ZCI55u45YWz5ZG95Luk5Y675omn6KGM55qELiDlhbfkvZPlkb3ku6TlpKflrrblj6/ku6Xlronoo4XljIXkuYvlkI7pgJrov4cgdHNjIC1oIOafpeeci1xcbiFb5Zyo6L+Z6YeM5o+S5YWl5Zu+54mH5o+P6L+wXShodHRwczovL2ktYmxvZy5jc2RuaW1nLmNuL2Jsb2dfbWlncmF0ZS8zNDlmZmMzNjJmMGQ4MzFhNzgwZDJkN2Y3NTQ4OTNhMS5wbmcpXFxuXFxuIyMjIOmFjee9riBb5a6Y572RXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay90c2NvbmZpZy1qc29uLmh0bWwpXFxu5aaC5p6c5L2g55yL5LqGIHRzYyDlkb3ku6TvvIzkvaDkvJrlj5HnjrDlroPmmK/mnInlvojlpJrlkb3ku6TnmoTvvIzlubbkuJTmnInnmoTlkb3ku6Tov5jkvLTpmo/ov5nnm7jlhbPlj4LmlbDjgILlnKjlt6XkvZzmlofku7blpLnkuK3vvIzmiJHku6zliJnpgJrov4fphY3nva7mlofku7YgYHRzY29uZmlnLmpzIGAg5Y676YWN572u77yM5L+d6K+B5Zyo6aG555uu5Lit55qE6L+Q55So44CCIOmFjee9ruWPguaVsOi/memHjOWwseS4jee7huiusuS6hu+8jOi/mOaYr+eci+WumOaWueaWh+aho+mdoOiwseeCueOAglxcblwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/280.bundle.js b/607.bundle.js similarity index 57% rename from 280.bundle.js rename to 607.bundle.js index 3a0f4fc..fe89dbb 100644 --- a/280.bundle.js +++ b/607.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[280],{280:(n,t,o)=>{o.r(t),o.d(t,{default:()=>i});const i="作为一个程序员,工作到现在,也将近半年了。公司对员工的代码提交也会有 review 流程。代码的 review 来讲,一般就是看格式、命名、逻辑是否有错,代码是否还有可以抽象的地方,这里总结一下自己遇到的代码规范方面的问题,大家一起写规范的代码,做一个看上去专业码农吧。\n***\n#### **js规范**\n- 代码的缩进了,一般是两格或四格,我司采用的是四格,这里可以根据自己喜好和公司要求了。\n\n- 中英文之间有空格间隔,像这样: `我专业引用 English 单词`\n\n- 命名规范,命名的驼峰式不用再说了。这里具体情况具体分析一下\n - 变量的命名:小驼峰式\n - 函数的命名:小驼峰式\n - 常量:全部大写\n - 构造函数: 大驼峰式\n - 类的成员: 公共属性和方法就是小驼峰式, 私有属性和方法加上`-`前缀,然后是小驼峰式,如 `_nameFrist\n \n ---\n \n#### **css规范**\n- css 的基本命名, 自己刚写的时候以为也是写小驼峰式,后来就呵呵了。css 当中就是用 `-` 连接了, 如 `search-button`,在定义 id 的时候是用小驼峰了。\n\n- css 名字意思定义。这里有一个 BEM 的命名法则参考,可以看看我之前写的一篇博客[了解BEM](http://blog.csdn.net/dadadeganhuo/article/details/76600264)\n- css 命名的统一前缀, 在一个项目中,约定好同一个前缀,可避免样式的覆盖。\n\n- css 样式书写顺序:\n\t- 显示属性:display/list-style/position/float/clear …\n\t- 自身属性(盒模型):width/height/margin/padding/border\n\t- 背景:background\n\t- 行高:line-height\n\t- 文本属性:color/font/text-decoration/text-align/...\n\t- 其他:cursor/z-index/zoom/overflow\n\t- CSS3属性:transform/transition/animation/box-shadow/border-radius\n\t- 如果使用CSS3的属性,如果有必要加入浏览器前缀,则按照 -webkit- / -moz- / -ms- / -o- /\nstd的顺序进行添加,标准属性写在最后。\n\t- 链接的样式请严格按照如下顺序添加: a:link -> a:visited -> a:hover -> a:active\n\n- 代码优化,能合并的属性就合并写,没用的属性也删掉,避免重复样式,避免使用 `!important`\n\n---\n\n#### **git commit log 规则**\n\n- 首先就是commit 内容的分类了,如图片所示:\n![这里写图片描述](https://img-blog.csdn.net/20170830144139403?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)定好分类,分类后面可以加你本次修改具体文件,然后组织本次修改的内容,就写好了 commit log啦。比如:`feat(login): 新增登录验证功能`,这表达出了你再login文件上新增了一个验证的功能。编写正确的 log 信息,能够清楚的表述你写的代码目的。\n\n- commit 次数,这里我们每完成一个小点的时候,都可以 commit 一下,因为commit 是记录你完成一个项目的具体过程。\n\n---\n= = 之前没好好总结,今天写总结的时候,也去搜了搜别的文章,发现这样的文章其实挺多,自己以前都没怎么好好看看 = = 。\n欢迎补充啊~\n\n#### 参考 \n> [前端人员必看的CSS规范](https://www.douban.com/note/499976405/?type=like)\n> [Commit message 和 Change log 编写指南](http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html)\n"}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgwLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsazZEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2NvZGUtZm9ybWF0Lm1kIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwi5L2c5Li65LiA5Liq56iL5bqP5ZGY77yM5bel5L2c5Yiw546w5Zyo77yM5Lmf5bCG6L+R5Y2K5bm05LqG44CC5YWs5Y+45a+55ZGY5bel55qE5Luj56CB5o+Q5Lqk5Lmf5Lya5pyJIHJldmlldyDmtYHnqIvjgILku6PnoIHnmoQgcmV2aWV3IOadpeiusu+8jOS4gOiIrOWwseaYr+eci+agvOW8j+OAgeWRveWQjeOAgemAu+i+keaYr+WQpuaciemUme+8jOS7o+eggeaYr+WQpui/mOacieWPr+S7peaKveixoeeahOWcsOaWue+8jOi/memHjOaAu+e7k+S4gOS4i+iHquW3semBh+WIsOeahOS7o+eggeinhOiMg+aWuemdoueahOmXrumimO+8jOWkp+WutuS4gOi1t+WGmeinhOiMg+eahOS7o+egge+8jOWBmuS4gOS4queci+S4iuWOu+S4k+S4mueggeWGnOWQp+OAglxcbioqKlxcbiMjIyMgKipqc+inhOiMgyoqXFxuLSDku6PnoIHnmoTnvKnov5vkuobvvIzkuIDoiKzmmK/kuKTmoLzmiJblm5vmoLzvvIzmiJHlj7jph4fnlKjnmoTmmK/lm5vmoLzvvIzov5nph4zlj6/ku6XmoLnmja7oh6rlt7Hllpzlpb3lkozlhazlj7jopoHmsYLkuobjgIJcXG5cXG4tIOS4reiLseaWh+S5i+mXtOacieepuuagvOmXtOmalO+8jOWDj+i/meagtzogYOaIkeS4k+S4muW8leeUqCBFbmdsaXNoIOWNleivjWBcXG5cXG4tIOWRveWQjeinhOiMg++8jOWRveWQjeeahOmpvOWzsOW8j+S4jeeUqOWGjeivtOS6huOAgui/memHjOWFt+S9k+aDheWGteWFt+S9k+WIhuaekOS4gOS4i1xcbiAgIC0g5Y+Y6YeP55qE5ZG95ZCN77ya5bCP6am85bOw5byPXFxuICAgLSDlh73mlbDnmoTlkb3lkI3vvJrlsI/pqbzls7DlvI9cXG4gICAtIOW4uOmHj++8muWFqOmDqOWkp+WGmVxcbiAgIC0g5p6E6YCg5Ye95pWw77yaIOWkp+mpvOWzsOW8j1xcbiAgIC0g57G755qE5oiQ5ZGY77yaIOWFrOWFseWxnuaAp+WSjOaWueazleWwseaYr+Wwj+mpvOWzsOW8j++8jCDnp4HmnInlsZ7mgKflkozmlrnms5XliqDkuIpgLWDliY3nvIAs54S25ZCO5piv5bCP6am85bOw5byP77yM5aaCIGBfbmFtZUZyaXN0XFxuICBcXG4gIC0tLVxcbiAgIFxcbiMjIyMgKipjc3Pop4TojIMqKlxcbi0gY3NzIOeahOWfuuacrOWRveWQjSwgIOiHquW3seWImuWGmeeahOaXtuWAmeS7peS4uuS5n+aYr+WGmeWwj+mpvOWzsOW8j++8jOWQjuadpeWwseWRteWRteS6huOAgmNzcyDlvZPkuK3lsLHmmK/nlKggYC1gIOi/nuaOpeS6hu+8jCDlpoIgYHNlYXJjaC1idXR0b25g77yM5Zyo5a6a5LmJIGlkIOeahOaXtuWAmeaYr+eUqOWwj+mpvOWzsOS6huOAglxcblxcbi0gY3NzIOWQjeWtl+aEj+aAneWumuS5ieOAgui/memHjOacieS4gOS4qiBCRU0g55qE5ZG95ZCN5rOV5YiZ5Y+C6ICD77yM5Y+v5Lul55yL55yL5oiR5LmL5YmN5YaZ55qE5LiA56+H5Y2a5a6iW+S6huino0JFTV0oaHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVvL2FydGljbGUvZGV0YWlscy83NjYwMDI2NClcXG4tIGNzcyDlkb3lkI3nmoTnu5/kuIDliY3nvIDvvIwg5Zyo5LiA5Liq6aG555uu5Lit77yM57qm5a6a5aW95ZCM5LiA5Liq5YmN57yA77yM5Y+v6YG/5YWN5qC35byP55qE6KaG55uW44CCXFxuXFxuLSBjc3Mg5qC35byP5Lmm5YaZ6aG65bqP77yaXFxuXFx0LSDmmL7npLrlsZ7mgKfvvJpkaXNwbGF5L2xpc3Qtc3R5bGUvcG9zaXRpb24vZmxvYXQvY2xlYXIg4oCmXFxuXFx0LSDoh6rouqvlsZ7mgKfvvIjnm5LmqKHlnovvvInvvJp3aWR0aC9oZWlnaHQvbWFyZ2luL3BhZGRpbmcvYm9yZGVyXFxuXFx0LSDog4zmma/vvJpiYWNrZ3JvdW5kXFxuXFx0LSDooYzpq5jvvJpsaW5lLWhlaWdodFxcblxcdC0g5paH5pys5bGe5oCn77yaY29sb3IvZm9udC90ZXh0LWRlY29yYXRpb24vdGV4dC1hbGlnbi8uLi5cXG5cXHQtIOWFtuS7lu+8mmN1cnNvci96LWluZGV4L3pvb20vb3ZlcmZsb3dcXG5cXHQtIENTUzPlsZ7mgKfvvJp0cmFuc2Zvcm0vdHJhbnNpdGlvbi9hbmltYXRpb24vYm94LXNoYWRvdy9ib3JkZXItcmFkaXVzXFxuXFx0LSDlpoLmnpzkvb/nlKhDU1Mz55qE5bGe5oCn77yM5aaC5p6c5pyJ5b+F6KaB5Yqg5YWl5rWP6KeI5Zmo5YmN57yA77yM5YiZ5oyJ54WnIC13ZWJraXQtIC8gLW1vei0gLyAtbXMtIC8gLW8tIC9cXG5zdGTnmoTpobrluo/ov5vooYzmt7vliqDvvIzmoIflh4blsZ7mgKflhpnlnKjmnIDlkI7jgIJcXG5cXHQtIOmTvuaOpeeahOagt+W8j+ivt+S4peagvOaMieeFp+WmguS4i+mhuuW6j+a3u+WKoO+8miBhOmxpbmsgLT4gYTp2aXNpdGVkIC0+IGE6aG92ZXIgLT4gYTphY3RpdmVcXG5cXG4tIOS7o+eggeS8mOWMlu+8jOiDveWQiOW5tueahOWxnuaAp+WwseWQiOW5tuWGme+8jOayoeeUqOeahOWxnuaAp+S5n+WIoOaOie+8jOmBv+WFjemHjeWkjeagt+W8j++8jOmBv+WFjeS9v+eUqCBgIWltcG9ydGFudGBcXG5cXG4tLS1cXG5cXG4jIyMjICoqZ2l0IGNvbW1pdCBsb2cg6KeE5YiZKipcXG5cXG4tIOmmluWFiOWwseaYr2NvbW1pdCDlhoXlrrnnmoTliIbnsbvkuobvvIzlpoLlm77niYfmiYDnpLrvvJpcXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE3MDgzMDE0NDEzOTQwMz93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KeWumuWlveWIhuexu++8jOWIhuexu+WQjumdouWPr+S7peWKoOS9oOacrOasoeS/ruaUueWFt+S9k+aWh+S7tu+8jOeEtuWQjue7hOe7h+acrOasoeS/ruaUueeahOWGheWuue+8jOWwseWGmeWlveS6hiBjb21taXQgbG9n5ZWm44CC5q+U5aaC77yaYGZlYXQobG9naW4pOiDmlrDlop7nmbvlvZXpqozor4Hlip/og71gLOi/meihqOi+vuWHuuS6huS9oOWGjWxvZ2lu5paH5Lu25LiK5paw5aKe5LqG5LiA5Liq6aqM6K+B55qE5Yqf6IO944CC57yW5YaZ5q2j56Gu55qEIGxvZyDkv6Hmga/vvIzog73lpJ/muIXmpZrnmoTooajov7DkvaDlhpnnmoTku6PnoIHnm67nmoTjgIJcXG5cXG4tIGNvbW1pdCDmrKHmlbDvvIzov5nph4zmiJHku6zmr4/lrozmiJDkuIDkuKrlsI/ngrnnmoTml7blgJnvvIzpg73lj6/ku6UgY29tbWl0IOS4gOS4i++8jOWboOS4umNvbW1pdCDmmK/orrDlvZXkvaDlrozmiJDkuIDkuKrpobnnm67nmoTlhbfkvZPov4fnqIvjgIJcXG5cXG4tLS1cXG49ID0g5LmL5YmN5rKh5aW95aW95oC757uT77yM5LuK5aSp5YaZ5oC757uT55qE5pe25YCZ77yM5Lmf5Y675pCc5LqG5pCc5Yir55qE5paH56ug77yM5Y+R546w6L+Z5qC355qE5paH56ug5YW25a6e5oy65aSa77yM6Ieq5bex5Lul5YmN6YO95rKh5oCO5LmI5aW95aW955yL55yLID0gPSDjgIJcXG7mrKLov47ooaXlhYXllYp+XFxuXFxuIyMjIyDlj4LogIMgXFxuPiBb5YmN56uv5Lq65ZGY5b+F55yL55qEQ1NT6KeE6IyDXShodHRwczovL3d3dy5kb3ViYW4uY29tL25vdGUvNDk5OTc2NDA1Lz90eXBlPWxpa2UpXFxuPiBbQ29tbWl0IG1lc3NhZ2Ug5ZKMIENoYW5nZSBsb2cg57yW5YaZ5oyH5Y2XXShodHRwOi8vd3d3LnJ1YW55aWZlbmcuY29tL2Jsb2cvMjAxNi8wMS9jb21taXRfbWVzc2FnZV9jaGFuZ2VfbG9nLmh0bWwpXFxuXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[607],{4607:(n,t,o)=>{o.r(t),o.d(t,{default:()=>i});const i="作为一个程序员,工作到现在,也将近半年了。公司对员工的代码提交也会有 review 流程。代码的 review 来讲,一般就是看格式、命名、逻辑是否有错,代码是否还有可以抽象的地方,这里总结一下自己遇到的代码规范方面的问题,大家一起写规范的代码,做一个看上去专业码农吧。\n***\n#### **js规范**\n- 代码的缩进了,一般是两格或四格,我司采用的是四格,这里可以根据自己喜好和公司要求了。\n\n- 中英文之间有空格间隔,像这样: `我专业引用 English 单词`\n\n- 命名规范,命名的驼峰式不用再说了。这里具体情况具体分析一下\n - 变量的命名:小驼峰式\n - 函数的命名:小驼峰式\n - 常量:全部大写\n - 构造函数: 大驼峰式\n - 类的成员: 公共属性和方法就是小驼峰式, 私有属性和方法加上`-`前缀,然后是小驼峰式,如 `_nameFrist\n \n ---\n \n#### **css规范**\n- css 的基本命名, 自己刚写的时候以为也是写小驼峰式,后来就呵呵了。css 当中就是用 `-` 连接了, 如 `search-button`,在定义 id 的时候是用小驼峰了。\n\n- css 名字意思定义。这里有一个 BEM 的命名法则参考,可以看看我之前写的一篇博客[了解BEM](http://blog.csdn.net/dadadeganhuo/article/details/76600264)\n- css 命名的统一前缀, 在一个项目中,约定好同一个前缀,可避免样式的覆盖。\n\n- css 样式书写顺序:\n\t- 显示属性:display/list-style/position/float/clear …\n\t- 自身属性(盒模型):width/height/margin/padding/border\n\t- 背景:background\n\t- 行高:line-height\n\t- 文本属性:color/font/text-decoration/text-align/...\n\t- 其他:cursor/z-index/zoom/overflow\n\t- CSS3属性:transform/transition/animation/box-shadow/border-radius\n\t- 如果使用CSS3的属性,如果有必要加入浏览器前缀,则按照 -webkit- / -moz- / -ms- / -o- /\nstd的顺序进行添加,标准属性写在最后。\n\t- 链接的样式请严格按照如下顺序添加: a:link -> a:visited -> a:hover -> a:active\n\n- 代码优化,能合并的属性就合并写,没用的属性也删掉,避免重复样式,避免使用 `!important`\n\n---\n\n#### **git commit log 规则**\n\n- 首先就是commit 内容的分类了,如图片所示:\n![这里写图片描述](https://img-blog.csdn.net/20170830144139403?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)定好分类,分类后面可以加你本次修改具体文件,然后组织本次修改的内容,就写好了 commit log啦。比如:`feat(login): 新增登录验证功能`,这表达出了你再login文件上新增了一个验证的功能。编写正确的 log 信息,能够清楚的表述你写的代码目的。\n\n- commit 次数,这里我们每完成一个小点的时候,都可以 commit 一下,因为commit 是记录你完成一个项目的具体过程。\n\n---\n= = 之前没好好总结,今天写总结的时候,也去搜了搜别的文章,发现这样的文章其实挺多,自己以前都没怎么好好看看 = = 。\n欢迎补充啊~\n\n#### 参考 \n> [前端人员必看的CSS规范](https://www.douban.com/note/499976405/?type=like)\n> [Commit message 和 Change log 编写指南](http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html)\n"}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA3LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsazZEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2NvZGUtZm9ybWF0Lm1kIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwi5L2c5Li65LiA5Liq56iL5bqP5ZGY77yM5bel5L2c5Yiw546w5Zyo77yM5Lmf5bCG6L+R5Y2K5bm05LqG44CC5YWs5Y+45a+55ZGY5bel55qE5Luj56CB5o+Q5Lqk5Lmf5Lya5pyJIHJldmlldyDmtYHnqIvjgILku6PnoIHnmoQgcmV2aWV3IOadpeiusu+8jOS4gOiIrOWwseaYr+eci+agvOW8j+OAgeWRveWQjeOAgemAu+i+keaYr+WQpuaciemUme+8jOS7o+eggeaYr+WQpui/mOacieWPr+S7peaKveixoeeahOWcsOaWue+8jOi/memHjOaAu+e7k+S4gOS4i+iHquW3semBh+WIsOeahOS7o+eggeinhOiMg+aWuemdoueahOmXrumimO+8jOWkp+WutuS4gOi1t+WGmeinhOiMg+eahOS7o+egge+8jOWBmuS4gOS4queci+S4iuWOu+S4k+S4mueggeWGnOWQp+OAglxcbioqKlxcbiMjIyMgKipqc+inhOiMgyoqXFxuLSDku6PnoIHnmoTnvKnov5vkuobvvIzkuIDoiKzmmK/kuKTmoLzmiJblm5vmoLzvvIzmiJHlj7jph4fnlKjnmoTmmK/lm5vmoLzvvIzov5nph4zlj6/ku6XmoLnmja7oh6rlt7Hllpzlpb3lkozlhazlj7jopoHmsYLkuobjgIJcXG5cXG4tIOS4reiLseaWh+S5i+mXtOacieepuuagvOmXtOmalO+8jOWDj+i/meagtzogYOaIkeS4k+S4muW8leeUqCBFbmdsaXNoIOWNleivjWBcXG5cXG4tIOWRveWQjeinhOiMg++8jOWRveWQjeeahOmpvOWzsOW8j+S4jeeUqOWGjeivtOS6huOAgui/memHjOWFt+S9k+aDheWGteWFt+S9k+WIhuaekOS4gOS4i1xcbiAgIC0g5Y+Y6YeP55qE5ZG95ZCN77ya5bCP6am85bOw5byPXFxuICAgLSDlh73mlbDnmoTlkb3lkI3vvJrlsI/pqbzls7DlvI9cXG4gICAtIOW4uOmHj++8muWFqOmDqOWkp+WGmVxcbiAgIC0g5p6E6YCg5Ye95pWw77yaIOWkp+mpvOWzsOW8j1xcbiAgIC0g57G755qE5oiQ5ZGY77yaIOWFrOWFseWxnuaAp+WSjOaWueazleWwseaYr+Wwj+mpvOWzsOW8j++8jCDnp4HmnInlsZ7mgKflkozmlrnms5XliqDkuIpgLWDliY3nvIAs54S25ZCO5piv5bCP6am85bOw5byP77yM5aaCIGBfbmFtZUZyaXN0XFxuICBcXG4gIC0tLVxcbiAgIFxcbiMjIyMgKipjc3Pop4TojIMqKlxcbi0gY3NzIOeahOWfuuacrOWRveWQjSwgIOiHquW3seWImuWGmeeahOaXtuWAmeS7peS4uuS5n+aYr+WGmeWwj+mpvOWzsOW8j++8jOWQjuadpeWwseWRteWRteS6huOAgmNzcyDlvZPkuK3lsLHmmK/nlKggYC1gIOi/nuaOpeS6hu+8jCDlpoIgYHNlYXJjaC1idXR0b25g77yM5Zyo5a6a5LmJIGlkIOeahOaXtuWAmeaYr+eUqOWwj+mpvOWzsOS6huOAglxcblxcbi0gY3NzIOWQjeWtl+aEj+aAneWumuS5ieOAgui/memHjOacieS4gOS4qiBCRU0g55qE5ZG95ZCN5rOV5YiZ5Y+C6ICD77yM5Y+v5Lul55yL55yL5oiR5LmL5YmN5YaZ55qE5LiA56+H5Y2a5a6iW+S6huino0JFTV0oaHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVvL2FydGljbGUvZGV0YWlscy83NjYwMDI2NClcXG4tIGNzcyDlkb3lkI3nmoTnu5/kuIDliY3nvIDvvIwg5Zyo5LiA5Liq6aG555uu5Lit77yM57qm5a6a5aW95ZCM5LiA5Liq5YmN57yA77yM5Y+v6YG/5YWN5qC35byP55qE6KaG55uW44CCXFxuXFxuLSBjc3Mg5qC35byP5Lmm5YaZ6aG65bqP77yaXFxuXFx0LSDmmL7npLrlsZ7mgKfvvJpkaXNwbGF5L2xpc3Qtc3R5bGUvcG9zaXRpb24vZmxvYXQvY2xlYXIg4oCmXFxuXFx0LSDoh6rouqvlsZ7mgKfvvIjnm5LmqKHlnovvvInvvJp3aWR0aC9oZWlnaHQvbWFyZ2luL3BhZGRpbmcvYm9yZGVyXFxuXFx0LSDog4zmma/vvJpiYWNrZ3JvdW5kXFxuXFx0LSDooYzpq5jvvJpsaW5lLWhlaWdodFxcblxcdC0g5paH5pys5bGe5oCn77yaY29sb3IvZm9udC90ZXh0LWRlY29yYXRpb24vdGV4dC1hbGlnbi8uLi5cXG5cXHQtIOWFtuS7lu+8mmN1cnNvci96LWluZGV4L3pvb20vb3ZlcmZsb3dcXG5cXHQtIENTUzPlsZ7mgKfvvJp0cmFuc2Zvcm0vdHJhbnNpdGlvbi9hbmltYXRpb24vYm94LXNoYWRvdy9ib3JkZXItcmFkaXVzXFxuXFx0LSDlpoLmnpzkvb/nlKhDU1Mz55qE5bGe5oCn77yM5aaC5p6c5pyJ5b+F6KaB5Yqg5YWl5rWP6KeI5Zmo5YmN57yA77yM5YiZ5oyJ54WnIC13ZWJraXQtIC8gLW1vei0gLyAtbXMtIC8gLW8tIC9cXG5zdGTnmoTpobrluo/ov5vooYzmt7vliqDvvIzmoIflh4blsZ7mgKflhpnlnKjmnIDlkI7jgIJcXG5cXHQtIOmTvuaOpeeahOagt+W8j+ivt+S4peagvOaMieeFp+WmguS4i+mhuuW6j+a3u+WKoO+8miBhOmxpbmsgLT4gYTp2aXNpdGVkIC0+IGE6aG92ZXIgLT4gYTphY3RpdmVcXG5cXG4tIOS7o+eggeS8mOWMlu+8jOiDveWQiOW5tueahOWxnuaAp+WwseWQiOW5tuWGme+8jOayoeeUqOeahOWxnuaAp+S5n+WIoOaOie+8jOmBv+WFjemHjeWkjeagt+W8j++8jOmBv+WFjeS9v+eUqCBgIWltcG9ydGFudGBcXG5cXG4tLS1cXG5cXG4jIyMjICoqZ2l0IGNvbW1pdCBsb2cg6KeE5YiZKipcXG5cXG4tIOmmluWFiOWwseaYr2NvbW1pdCDlhoXlrrnnmoTliIbnsbvkuobvvIzlpoLlm77niYfmiYDnpLrvvJpcXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE3MDgzMDE0NDEzOTQwMz93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KeWumuWlveWIhuexu++8jOWIhuexu+WQjumdouWPr+S7peWKoOS9oOacrOasoeS/ruaUueWFt+S9k+aWh+S7tu+8jOeEtuWQjue7hOe7h+acrOasoeS/ruaUueeahOWGheWuue+8jOWwseWGmeWlveS6hiBjb21taXQgbG9n5ZWm44CC5q+U5aaC77yaYGZlYXQobG9naW4pOiDmlrDlop7nmbvlvZXpqozor4Hlip/og71gLOi/meihqOi+vuWHuuS6huS9oOWGjWxvZ2lu5paH5Lu25LiK5paw5aKe5LqG5LiA5Liq6aqM6K+B55qE5Yqf6IO944CC57yW5YaZ5q2j56Gu55qEIGxvZyDkv6Hmga/vvIzog73lpJ/muIXmpZrnmoTooajov7DkvaDlhpnnmoTku6PnoIHnm67nmoTjgIJcXG5cXG4tIGNvbW1pdCDmrKHmlbDvvIzov5nph4zmiJHku6zmr4/lrozmiJDkuIDkuKrlsI/ngrnnmoTml7blgJnvvIzpg73lj6/ku6UgY29tbWl0IOS4gOS4i++8jOWboOS4umNvbW1pdCDmmK/orrDlvZXkvaDlrozmiJDkuIDkuKrpobnnm67nmoTlhbfkvZPov4fnqIvjgIJcXG5cXG4tLS1cXG49ID0g5LmL5YmN5rKh5aW95aW95oC757uT77yM5LuK5aSp5YaZ5oC757uT55qE5pe25YCZ77yM5Lmf5Y675pCc5LqG5pCc5Yir55qE5paH56ug77yM5Y+R546w6L+Z5qC355qE5paH56ug5YW25a6e5oy65aSa77yM6Ieq5bex5Lul5YmN6YO95rKh5oCO5LmI5aW95aW955yL55yLID0gPSDjgIJcXG7mrKLov47ooaXlhYXllYp+XFxuXFxuIyMjIyDlj4LogIMgXFxuPiBb5YmN56uv5Lq65ZGY5b+F55yL55qEQ1NT6KeE6IyDXShodHRwczovL3d3dy5kb3ViYW4uY29tL25vdGUvNDk5OTc2NDA1Lz90eXBlPWxpa2UpXFxuPiBbQ29tbWl0IG1lc3NhZ2Ug5ZKMIENoYW5nZSBsb2cg57yW5YaZ5oyH5Y2XXShodHRwOi8vd3d3LnJ1YW55aWZlbmcuY29tL2Jsb2cvMjAxNi8wMS9jb21taXRfbWVzc2FnZV9jaGFuZ2VfbG9nLmh0bWwpXFxuXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/743.bundle.js b/634.bundle.js similarity index 89% rename from 743.bundle.js rename to 634.bundle.js index 4e244a9..655dfcf 100644 --- a/743.bundle.js +++ b/634.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[743],{743:function(t,o,u){u.r(o),u.d(o,{default:function(){return s}});var e=u(358);const n={class:"component-canvas-svg"},q={};var s=(0,u(389).A)(q,[["render",function(t,o){return(0,e.uX)(),(0,e.CE)("div",n,o[0]||(o[0]=[(0,e.Fv)("

canvas

canvas 是 HTML 5 新出的图片元素,它是 2d 绘图 API, 使用 JavaScript 调用API 可以画 lines, shapes, images, text 甚至其他你想话的, 并且不需要什么插件。

它是作为一个画布存在在网页中, 画布上有你绘制的图案,利用 js 你可以实时的改变画布上的图案,以实现动画。

它的支持性也挺好,IE 9 开始支持,Chrome和Opera 9+ 也支持。

svg

SVG 可缩放矢量图形, 是 XML 用来描述二维图形和绘图程序的语言。目前SVG在Firefox、Opera、Webkit浏览器、IE等浏览器中已经部分实现。

什么是 XML 它是一种类似于 HTML 的标记语言,设计宗旨在于传输数据而不是显示数据。 XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。通过读取你可以获取存储于其中的数据

SVG可以通过定义必要的线和形状来创建一个图形,也可以修改已有的位图,或者将这两种方式结合起来创建图形。图形和其组成部分可以变形,可以合成,还可以通过滤镜完全改变外观。

SVG提供了一些元素,用于定义圆形、矩形、简单或复杂的曲线,以及其他形状。 一个简单的SVG文档由 <svg> 根元素和基本的形状元素构成。另外还有一个g元素,它用来把若干个基本形状编成一个组。

eg:

<svg version="1.1"\n     baseProfile="full"\n     width="300" height="200"\n     xmlns="http://www.w3.org/2000/svg">\n\n  <rect width="100%" height="100%" fill="red" />\n\n  <circle cx="150" cy="100" r="80" fill="green" />\n\n  <text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>\n\n</svg>\n\n

可以看到 svg 是在内部组合各种元素绘制形成相应的图案。 并且矢量顾名思义是可以自由缩放的,根据屏幕像素点进行缩放,保留了图案的高清晰度。

总结

通过以上,我们可以知道 svg 和 canvas 的相同点,它们都是可以绘图的元素,并有自身的用法。 canvas 是一块画布,纯用 js 去画画的。根据你的 js 编写,动态去渲染画布上的图案,适用一些大量数据交互修改的,比较复杂的动画。由于它仅仅是根据你设定的大小,它是依赖于分辨率的。 而 svg 是一个个元素组成在一起的, 包含 animate 元素,可做一些小小的动画, 它的矢量优点也更适合做一些高保真的静态图片。

",14)]))}]])}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQzLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sd0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQWtDSixNQWxDSUMsRUFrQ0pDLEVBQUEsS0FBQUEsRUFBQSxLQWxDTkMsRUFBQUEsRUFBQUEsSUFBQSwraEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vY2FudmFzLXN2Zy5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vY2FudmFzLXN2Zy5tZD9kYmMzIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LWNhbnZhcy1zdmdcIj48aDM+Y2FudmFzPC9oMz5cbjxwPmNhbnZhcyDmmK8gSFRNTCA1IOaWsOWHuueahOWbvueJh+WFg+e0oO+8jOWug+aYryAyZCDnu5jlm74gQVBJ77yMIOS9v+eUqCBKYXZhU2NyaXB0ICDosIPnlKhBUEkg5Y+v5Lul55S7ICBsaW5lcywgc2hhcGVzLCBpbWFnZXMsIHRleHQg55Sa6Iez5YW25LuW5L2g5oOz6K+d55qE77yMIOW5tuS4lOS4jemcgOimgeS7gOS5iOaPkuS7tuOAgjwvcD5cbjxwPuWug+aYr+S9nOS4uuS4gOS4queUu+W4g+WtmOWcqOWcqOe9kemhteS4re+8jCDnlLvluIPkuIrmnInkvaDnu5jliLbnmoTlm77moYjvvIzliKnnlKgganMg5L2g5Y+v5Lul5a6e5pe255qE5pS55Y+Y55S75biD5LiK55qE5Zu+5qGI77yM5Lul5a6e546w5Yqo55S744CCPC9wPlxuPHA+5a6D55qE5pSv5oyB5oCn5Lmf5oy65aW977yMSUUgOSDlvIDlp4vmlK/mjIHvvIxDaHJvbWXlkoxPcGVyYSA5KyDkuZ/mlK/mjIHjgII8L3A+XG48aDM+c3ZnPC9oMz5cbjxwPlNWRyDlj6/nvKnmlL7nn6Lph4/lm77lvaLvvIwg5pivIFhNTCDnlKjmnaXmj4/ov7Dkuoznu7Tlm77lvaLlkoznu5jlm77nqIvluo/nmoTor63oqIDjgILnm67liY1TVkflnKhGaXJlZm9444CBT3BlcmHjgIFXZWJraXTmtY/op4jlmajjgIFJReetiea1j+iniOWZqOS4reW3sue7j+mDqOWIhuWunueOsOOAgjwvcD5cbjxibG9ja3F1b3RlPlxuPHA+5LuA5LmI5pivIFhNTFxu5a6D5piv5LiA56eN57G75Ly85LqOIEhUTUwg55qE5qCH6K6w6K+t6KiA77yM6K6+6K6h5a6X5peo5Zyo5LqO5Lyg6L6T5pWw5o2u6ICM5LiN5piv5pi+56S65pWw5o2u44CCXG5YTUwg5pWw5o2u5Lul57qv5paH5pys5qC85byP6L+b6KGM5a2Y5YKo77yM5Zug5q2k5o+Q5L6b5LqG5LiA56eN54us56uL5LqO6L2v5Lu25ZKM56Gs5Lu255qE5pWw5o2u5a2Y5YKo5pa55rOV44CC6YCa6L+H6K+75Y+W5L2g5Y+v5Lul6I635Y+W5a2Y5YKo5LqO5YW25Lit55qE5pWw5o2uPC9wPlxuPC9ibG9ja3F1b3RlPlxuPHA+U1ZH5Y+v5Lul6YCa6L+H5a6a5LmJ5b+F6KaB55qE57q/5ZKM5b2i54q25p2l5Yib5bu65LiA5Liq5Zu+5b2i77yM5Lmf5Y+v5Lul5L+u5pS55bey5pyJ55qE5L2N5Zu+77yM5oiW6ICF5bCG6L+Z5Lik56eN5pa55byP57uT5ZCI6LW35p2l5Yib5bu65Zu+5b2i44CC5Zu+5b2i5ZKM5YW257uE5oiQ6YOo5YiG5Y+v5Lul5Y+Y5b2i77yM5Y+v5Lul5ZCI5oiQ77yM6L+Y5Y+v5Lul6YCa6L+H5ruk6ZWc5a6M5YWo5pS55Y+Y5aSW6KeC44CCPC9wPlxuPHA+U1ZH5o+Q5L6b5LqG5LiA5Lqb5YWD57Sg77yM55So5LqO5a6a5LmJ5ZyG5b2i44CB55+p5b2i44CB566A5Y2V5oiW5aSN5p2C55qE5puy57q/77yM5Lul5Y+K5YW25LuW5b2i54q244CCXG7kuIDkuKrnroDljZXnmoRTVkfmlofmoaPnlLEgPGNvZGU+Jmx0O3N2ZyZndDs8L2NvZGU+IOagueWFg+e0oOWSjOWfuuacrOeahOW9oueKtuWFg+e0oOaehOaIkOOAguWPpuWklui/mOacieS4gOS4qmflhYPntKDvvIzlroPnlKjmnaXmioroi6XlubLkuKrln7rmnKzlvaLnirbnvJbmiJDkuIDkuKrnu4TjgII8L3A+XG48cD5lZzo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+Jmx0O3N2ZyB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgYmFzZVByb2ZpbGU9XCJmdWxsXCJcbiAgICAgd2lkdGg9XCIzMDBcIiBoZWlnaHQ9XCIyMDBcIlxuICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCImZ3Q7XG5cbiAgJmx0O3JlY3Qgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZpbGw9XCJyZWRcIiAvJmd0O1xuXG4gICZsdDtjaXJjbGUgY3g9XCIxNTBcIiBjeT1cIjEwMFwiIHI9XCI4MFwiIGZpbGw9XCJncmVlblwiIC8mZ3Q7XG5cbiAgJmx0O3RleHQgeD1cIjE1MFwiIHk9XCIxMjVcIiBmb250LXNpemU9XCI2MFwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZmlsbD1cIndoaXRlXCImZ3Q7U1ZHJmx0Oy90ZXh0Jmd0O1xuXG4mbHQ7L3N2ZyZndDtcblxuPC9jb2RlPjwvcHJlPlxuPHA+5Y+v5Lul55yL5YiwIHN2ZyDmmK/lnKjlhoXpg6jnu4TlkIjlkITnp43lhYPntKDnu5jliLblvaLmiJDnm7jlupTnmoTlm77moYjjgIIg5bm25LiU55+i6YeP6aG+5ZCN5oCd5LmJ5piv5Y+v5Lul6Ieq55Sx57yp5pS+55qE77yM5qC55o2u5bGP5bmV5YOP57Sg54K56L+b6KGM57yp5pS+77yM5L+d55WZ5LqG5Zu+5qGI55qE6auY5riF5pmw5bqm44CCPC9wPlxuPGgzPuaAu+e7kzwvaDM+XG48cD7pgJrov4fku6XkuIrvvIzmiJHku6zlj6/ku6Xnn6XpgZMgc3ZnIOWSjCBjYW52YXMg55qE55u45ZCM54K577yM5a6D5Lus6YO95piv5Y+v5Lul57uY5Zu+55qE5YWD57Sg77yM5bm25pyJ6Ieq6Lqr55qE55So5rOV44CCXG5jYW52YXMg5piv5LiA5Z2X55S75biD77yM57qv55SoIGpzIOWOu+eUu+eUu+eahOOAguagueaNruS9oOeahCBqcyDnvJblhpnvvIzliqjmgIHljrvmuLLmn5PnlLvluIPkuIrnmoTlm77moYjvvIzpgILnlKjkuIDkupvlpKfph4/mlbDmja7kuqTkupLkv67mlLnnmoTvvIzmr5TovoPlpI3mnYLnmoTliqjnlLvjgILnlLHkuo7lroPku4Xku4XmmK/moLnmja7kvaDorr7lrprnmoTlpKflsI/vvIzlroPmmK/kvp3otZbkuo7liIbovqjnjofnmoTjgIJcbuiAjCBzdmcg5piv5LiA5Liq5Liq5YWD57Sg57uE5oiQ5Zyo5LiA6LW355qE77yMIOWMheWQqyBhbmltYXRlIOWFg+e0oO+8jOWPr+WBmuS4gOS6m+Wwj+Wwj+eahOWKqOeUu++8jCDlroPnmoTnn6Lph4/kvJjngrnkuZ/mm7TpgILlkIjlgZrkuIDkupvpq5jkv53nnJ/nmoTpnZnmgIHlm77niYfjgII8L3A+XG48L2Rpdj48L3RlbXBsYXRlPiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL2NhbnZhcy1zdmcubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTYwMjAwNzRcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4zX3Z1ZUAzLjUuM190eXBlc2NyaXB0QDUuNS40X193ZWJwYWNrQDUuOTQuMF93ZWJwYWNrLV9mdXFrd2dncGxoZXkzb2l2dHdlMnN0ZG82ZS9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[634],{634:function(t,o,u){u.r(o),u.d(o,{default:function(){return s}});var e=u(762);const n={class:"component-canvas-svg"},q={};var s=(0,u(314).A)(q,[["render",function(t,o){return(0,e.uX)(),(0,e.CE)("div",n,o[0]||(o[0]=[(0,e.Fv)("

canvas

canvas 是 HTML 5 新出的图片元素,它是 2d 绘图 API, 使用 JavaScript 调用API 可以画 lines, shapes, images, text 甚至其他你想话的, 并且不需要什么插件。

它是作为一个画布存在在网页中, 画布上有你绘制的图案,利用 js 你可以实时的改变画布上的图案,以实现动画。

它的支持性也挺好,IE 9 开始支持,Chrome和Opera 9+ 也支持。

svg

SVG 可缩放矢量图形, 是 XML 用来描述二维图形和绘图程序的语言。目前SVG在Firefox、Opera、Webkit浏览器、IE等浏览器中已经部分实现。

什么是 XML 它是一种类似于 HTML 的标记语言,设计宗旨在于传输数据而不是显示数据。 XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。通过读取你可以获取存储于其中的数据

SVG可以通过定义必要的线和形状来创建一个图形,也可以修改已有的位图,或者将这两种方式结合起来创建图形。图形和其组成部分可以变形,可以合成,还可以通过滤镜完全改变外观。

SVG提供了一些元素,用于定义圆形、矩形、简单或复杂的曲线,以及其他形状。 一个简单的SVG文档由 <svg> 根元素和基本的形状元素构成。另外还有一个g元素,它用来把若干个基本形状编成一个组。

eg:

<svg version="1.1"\n     baseProfile="full"\n     width="300" height="200"\n     xmlns="http://www.w3.org/2000/svg">\n\n  <rect width="100%" height="100%" fill="red" />\n\n  <circle cx="150" cy="100" r="80" fill="green" />\n\n  <text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>\n\n</svg>\n\n

可以看到 svg 是在内部组合各种元素绘制形成相应的图案。 并且矢量顾名思义是可以自由缩放的,根据屏幕像素点进行缩放,保留了图案的高清晰度。

总结

通过以上,我们可以知道 svg 和 canvas 的相同点,它们都是可以绘图的元素,并有自身的用法。 canvas 是一块画布,纯用 js 去画画的。根据你的 js 编写,动态去渲染画布上的图案,适用一些大量数据交互修改的,比较复杂的动画。由于它仅仅是根据你设定的大小,它是依赖于分辨率的。 而 svg 是一个个元素组成在一起的, 包含 animate 元素,可做一些小小的动画, 它的矢量优点也更适合做一些高保真的静态图片。

",14)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM0LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sd0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQWtDSixNQWxDSUMsRUFrQ0pDLEVBQUEsS0FBQUEsRUFBQSxLQWxDTkMsRUFBQUEsRUFBQUEsSUFBQSwraEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vY2FudmFzLXN2Zy5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vY2FudmFzLXN2Zy5tZD85MjdmIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LWNhbnZhcy1zdmdcIj48aDM+Y2FudmFzPC9oMz5cbjxwPmNhbnZhcyDmmK8gSFRNTCA1IOaWsOWHuueahOWbvueJh+WFg+e0oO+8jOWug+aYryAyZCDnu5jlm74gQVBJ77yMIOS9v+eUqCBKYXZhU2NyaXB0ICDosIPnlKhBUEkg5Y+v5Lul55S7ICBsaW5lcywgc2hhcGVzLCBpbWFnZXMsIHRleHQg55Sa6Iez5YW25LuW5L2g5oOz6K+d55qE77yMIOW5tuS4lOS4jemcgOimgeS7gOS5iOaPkuS7tuOAgjwvcD5cbjxwPuWug+aYr+S9nOS4uuS4gOS4queUu+W4g+WtmOWcqOWcqOe9kemhteS4re+8jCDnlLvluIPkuIrmnInkvaDnu5jliLbnmoTlm77moYjvvIzliKnnlKgganMg5L2g5Y+v5Lul5a6e5pe255qE5pS55Y+Y55S75biD5LiK55qE5Zu+5qGI77yM5Lul5a6e546w5Yqo55S744CCPC9wPlxuPHA+5a6D55qE5pSv5oyB5oCn5Lmf5oy65aW977yMSUUgOSDlvIDlp4vmlK/mjIHvvIxDaHJvbWXlkoxPcGVyYSA5KyDkuZ/mlK/mjIHjgII8L3A+XG48aDM+c3ZnPC9oMz5cbjxwPlNWRyDlj6/nvKnmlL7nn6Lph4/lm77lvaLvvIwg5pivIFhNTCDnlKjmnaXmj4/ov7Dkuoznu7Tlm77lvaLlkoznu5jlm77nqIvluo/nmoTor63oqIDjgILnm67liY1TVkflnKhGaXJlZm9444CBT3BlcmHjgIFXZWJraXTmtY/op4jlmajjgIFJReetiea1j+iniOWZqOS4reW3sue7j+mDqOWIhuWunueOsOOAgjwvcD5cbjxibG9ja3F1b3RlPlxuPHA+5LuA5LmI5pivIFhNTFxu5a6D5piv5LiA56eN57G75Ly85LqOIEhUTUwg55qE5qCH6K6w6K+t6KiA77yM6K6+6K6h5a6X5peo5Zyo5LqO5Lyg6L6T5pWw5o2u6ICM5LiN5piv5pi+56S65pWw5o2u44CCXG5YTUwg5pWw5o2u5Lul57qv5paH5pys5qC85byP6L+b6KGM5a2Y5YKo77yM5Zug5q2k5o+Q5L6b5LqG5LiA56eN54us56uL5LqO6L2v5Lu25ZKM56Gs5Lu255qE5pWw5o2u5a2Y5YKo5pa55rOV44CC6YCa6L+H6K+75Y+W5L2g5Y+v5Lul6I635Y+W5a2Y5YKo5LqO5YW25Lit55qE5pWw5o2uPC9wPlxuPC9ibG9ja3F1b3RlPlxuPHA+U1ZH5Y+v5Lul6YCa6L+H5a6a5LmJ5b+F6KaB55qE57q/5ZKM5b2i54q25p2l5Yib5bu65LiA5Liq5Zu+5b2i77yM5Lmf5Y+v5Lul5L+u5pS55bey5pyJ55qE5L2N5Zu+77yM5oiW6ICF5bCG6L+Z5Lik56eN5pa55byP57uT5ZCI6LW35p2l5Yib5bu65Zu+5b2i44CC5Zu+5b2i5ZKM5YW257uE5oiQ6YOo5YiG5Y+v5Lul5Y+Y5b2i77yM5Y+v5Lul5ZCI5oiQ77yM6L+Y5Y+v5Lul6YCa6L+H5ruk6ZWc5a6M5YWo5pS55Y+Y5aSW6KeC44CCPC9wPlxuPHA+U1ZH5o+Q5L6b5LqG5LiA5Lqb5YWD57Sg77yM55So5LqO5a6a5LmJ5ZyG5b2i44CB55+p5b2i44CB566A5Y2V5oiW5aSN5p2C55qE5puy57q/77yM5Lul5Y+K5YW25LuW5b2i54q244CCXG7kuIDkuKrnroDljZXnmoRTVkfmlofmoaPnlLEgPGNvZGU+Jmx0O3N2ZyZndDs8L2NvZGU+IOagueWFg+e0oOWSjOWfuuacrOeahOW9oueKtuWFg+e0oOaehOaIkOOAguWPpuWklui/mOacieS4gOS4qmflhYPntKDvvIzlroPnlKjmnaXmioroi6XlubLkuKrln7rmnKzlvaLnirbnvJbmiJDkuIDkuKrnu4TjgII8L3A+XG48cD5lZzo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+Jmx0O3N2ZyB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgYmFzZVByb2ZpbGU9XCJmdWxsXCJcbiAgICAgd2lkdGg9XCIzMDBcIiBoZWlnaHQ9XCIyMDBcIlxuICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCImZ3Q7XG5cbiAgJmx0O3JlY3Qgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZpbGw9XCJyZWRcIiAvJmd0O1xuXG4gICZsdDtjaXJjbGUgY3g9XCIxNTBcIiBjeT1cIjEwMFwiIHI9XCI4MFwiIGZpbGw9XCJncmVlblwiIC8mZ3Q7XG5cbiAgJmx0O3RleHQgeD1cIjE1MFwiIHk9XCIxMjVcIiBmb250LXNpemU9XCI2MFwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZmlsbD1cIndoaXRlXCImZ3Q7U1ZHJmx0Oy90ZXh0Jmd0O1xuXG4mbHQ7L3N2ZyZndDtcblxuPC9jb2RlPjwvcHJlPlxuPHA+5Y+v5Lul55yL5YiwIHN2ZyDmmK/lnKjlhoXpg6jnu4TlkIjlkITnp43lhYPntKDnu5jliLblvaLmiJDnm7jlupTnmoTlm77moYjjgIIg5bm25LiU55+i6YeP6aG+5ZCN5oCd5LmJ5piv5Y+v5Lul6Ieq55Sx57yp5pS+55qE77yM5qC55o2u5bGP5bmV5YOP57Sg54K56L+b6KGM57yp5pS+77yM5L+d55WZ5LqG5Zu+5qGI55qE6auY5riF5pmw5bqm44CCPC9wPlxuPGgzPuaAu+e7kzwvaDM+XG48cD7pgJrov4fku6XkuIrvvIzmiJHku6zlj6/ku6Xnn6XpgZMgc3ZnIOWSjCBjYW52YXMg55qE55u45ZCM54K577yM5a6D5Lus6YO95piv5Y+v5Lul57uY5Zu+55qE5YWD57Sg77yM5bm25pyJ6Ieq6Lqr55qE55So5rOV44CCXG5jYW52YXMg5piv5LiA5Z2X55S75biD77yM57qv55SoIGpzIOWOu+eUu+eUu+eahOOAguagueaNruS9oOeahCBqcyDnvJblhpnvvIzliqjmgIHljrvmuLLmn5PnlLvluIPkuIrnmoTlm77moYjvvIzpgILnlKjkuIDkupvlpKfph4/mlbDmja7kuqTkupLkv67mlLnnmoTvvIzmr5TovoPlpI3mnYLnmoTliqjnlLvjgILnlLHkuo7lroPku4Xku4XmmK/moLnmja7kvaDorr7lrprnmoTlpKflsI/vvIzlroPmmK/kvp3otZbkuo7liIbovqjnjofnmoTjgIJcbuiAjCBzdmcg5piv5LiA5Liq5Liq5YWD57Sg57uE5oiQ5Zyo5LiA6LW355qE77yMIOWMheWQqyBhbmltYXRlIOWFg+e0oO+8jOWPr+WBmuS4gOS6m+Wwj+Wwj+eahOWKqOeUu++8jCDlroPnmoTnn6Lph4/kvJjngrnkuZ/mm7TpgILlkIjlgZrkuIDkupvpq5jkv53nnJ/nmoTpnZnmgIHlm77niYfjgII8L3A+XG48L2Rpdj48L3RlbXBsYXRlPiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL2NhbnZhcy1zdmcubWQ/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTYwMjAwNzRcIlxuY29uc3Qgc2NyaXB0ID0ge31cblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZS1sb2FkZXJAMTcuNC4yX0B2dWUrY29tcGlsZXItc2ZjQDMuNS4xMl92dWVAMy41LjEyX3R5cGVzY3JpcHRANS42LjNfX3dlYnBhY2tANS45NS4wX3dlYnBhY2stY2xpQDUuMS40Xy9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl1dKVxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6WyJjbGFzcyIsInNjcmlwdCIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2NhY2hlIiwiX2NyZWF0ZVN0YXRpY1ZOb2RlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/843.bundle.js b/636.bundle.js similarity index 58% rename from 843.bundle.js rename to 636.bundle.js index 9e4a344..a4803bb 100644 --- a/843.bundle.js +++ b/636.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[843],{843:(n,e,s)=>{s.r(e),s.d(e,{default:()=>t});const t='### **什么是PWA** \n先说一下全名,progressive web app: 渐进式网页应用。这是谷歌推出的,我是这样理解的:\n\n- 我们一般写web应用,在 pc 上是没有缓存的,打开页面的时去请求数据。\n\n- 第二个也没有像 app 一样的小图标放在桌面,一点开就进入了应用,而是通过打开浏览器输入网址, \n\n- 第三个就是,不能像 app 一样给用户推送消息,像微博会跟你推送说有谁评论了你的微博之类的功能。 \n\n而谷歌推出的 pwa,就是具有这些了这些特点, 使我们的 web 应用,能够像一款 app 一样使用。并且对比与 app, 它不用复杂的安装,也不用下载更新包,刷新页面就可以了(注意到缓存的处理)。\n\n#### **那么这些功能分别是怎么实现的呢?** \n**关于缓存**\n\n其实这个就是 我们平时做的 Session 啊、localStorage、CacheStorage 之类的。\n\n这里用的就是 [cacheStorage](https://developer.mozilla.org/zh-CN/docs/Web/API/CacheStorage) 缓存,它提供了一个ServiceWorker类型的工作者或window范围可以访问的所有命名缓存的主目录, 并维护字符串的映射名称到相应的 Cache 对象。\n主要方法包括: \n![这里写图片描述](https://img-blog.csdn.net/20171112212302073?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n有了这些方法你可以对你的缓存进行操作。目前还在草案状态,仅火狐和谷歌浏览器支持此特性。\n\nPWA是通过 ServiceWorker 访问 cache ,所以需要注册 ServiceWorker 工作者。在之前别忘记判断浏览器是否支持。\n\n```\nif (\'serviceWorker\' in navigator) {\n\tnavigator.serviceWorker.register(sw.js) // 注册sw.js 文件中变成的服务对象,返回注册成功的对象\n\t.then(function(swReg){\n swRegistration = swReg;\n }).catch(function(error) {\n console.error(\'Service Worker Error\', error);\n });\n}\n```\n这个 [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) 服务工作者就厉害了,它相当于浏览器和网络之间的代理服务器,可以拦截网络请求,做一些你可能需要的处理(请求资源从缓存中获取等)。\n\n- 它能够创建有效的离线体验,拦截网络请求,并根据网络是否可用判断是否使用缓存数据或者更新缓存数据。\n\n- 它们还允许访问推送的通知和后台的API。\n\n关于 sw.js 中具体的缓存的代码:\n\n创建需要缓存的文件\n\n```\n\'use strict\'\nlet cacheName = \'pwa-demo-assets\'; // 缓存名字\nlet imgCacheName = \'pwa-img\';\nlet filesToCache;\nfilesToCache = [ // 所需缓存的文件\n \'/\',\n \'/index.html\',\n \'/scripts/app.js\',\n \'/assets/imgs/48.png\',\n \'/assets/imgs/96.png\',\n \'/assets/imgs/192.png\',\n \'/dist/js/app.js\',\n \'/manifest.json\'\n];\n\nself.addEventListener(\'install\', function(e) {\n e.waitUntil(\n\t // 安装服务者时,对需要缓存的文件进行缓存\n caches.open(cacheName).then(function(cache) {\n return cache.addAll(filesToCache);\n })\n );\n});\n\n\nself.addEventListener(\'fetch\', (e) => {\n // 判断地址是不是需要实时去请求,是就继续发送请求\n if (e.request.url.indexOf(\'/api/400/200\') > -1) {\n e.respondWith(\n caches.open(imgCacheName).then(function(cache){\n return fetch(e.request).then(function (response){\n cache.put(e.request.url, response.clone()); // 每请求一次缓存更新一次新加载的图片\n return response;\n });\n })\n );\n } else {\n e.respondWith(\n\t // 匹配到缓存资源,就从缓存中返回数据\n caches.match(e.request).then(function (response) {\n return response || fetch(e.request);\n })\n );\n }\n\n});\n```\n\n**这里进而就引入到 pwa 的推送通知功能。这都是通过 ServiceWorker 去实现的。**\n\n基本原理是,你的客户端要和推送服务进行绑定,会生成一个绑定后的推送服务API接口,服务端调用此接口,发送消息。同时,浏览器也要支持推送功能,在注册 sw 时, 加上推送功能的判断。\n\n```\nif (\'serviceWorker\' in navigator && \'PushManager\' in window) {\n\tnavigator.serviceWorker.register(sw.js)\n\t.then(function(swReg) {\n swRegistration = swReg;\n }).catch(function(error) {\n console.error(\'Service Worker Error\', error);\n });\n } else {\n console.warn(\'Push messaging is not supported\');\n }\n```\nPushManager 注册好之后, 那么要做的就是浏览器和服务器的绑定了。\n\n![这里写图片描述](https://img-blog.csdn.net/20171112203347222?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n此图是用户订阅某个应用程序的推送服务。\n客户端传入应用程序服务器公钥,向将生成端点的 `webpush 服务器`( 这是谷歌自己实现的一个推送功能的服务器)发出网络请求,将生成的端点(一个推送服务)与应用程序公钥关联,并将端点返回给应用程序。浏览器会将此端点添加到 PushSubscription,通过 promise异步成功时,可以将它的信息保存到你的数据库。\n\n![这里写图片描述](https://img-blog.csdn.net/20171112203753820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n服务器发送推送的时候,请求相关接口,验证成功后推送服务会发消息给客户端。\n\n**最后关于桌面小图标**\n\n这个可以说是非常简单了,就是一个manifest.json配置文件,然后在页面引入此文件就好了\n\n```\n\x3c!-- 加载清单 --\x3e\n\n```\n关于[清单内容](https://developers.google.com/web/fundamentals/web-app-manifest/)这里简单介绍一下:\n\n```\n{\n "short_name": "pwa",\n "name": "pwa - demo", // 应用名称\n "icons": [ // 应用显示图标,根据容器大小适配\n {\n "src": "assets/imgs/48.png",\n "type": "image/png",\n "sizes": "48x48"\n },\n {\n "src": "assets/imgs/96.png",\n "type": "image/png",\n "sizes": "96x96"\n },\n {\n "src": "assets/imgs/192.png",\n "type": "image/png",\n "sizes": "192x192"\n }\n ],\n "background_color": "#2196F3", // 刚打开页面时的背景\n "theme_color": "#2196F3", // 主题颜色\n "display": "standalone", //独立显示\n "start_url": "index.html?launcher=true" // 启动的页面\n}\n```\n好了, 如果感兴趣赶快上手吧。\n可以查看[谷歌官方教程](https://developers.google.com/web/progressive-web-apps/)。\n\n这里说一下坑的点,\tPWA应用需要在本地localhost:8080 上运行或者 https 协议下, 要保证你的页面是安全页面。\n\n添加桌面时,确保你的谷歌浏览器可以显示弹出通知。\n\n如果你要自己实现推送,自己服务器要有公钥和私钥的获取, 这里可以通过 https://web-push-codelab.glitch.me 获取, 用 chrome 的 [webpush](https://github.com/zaru/webpush) 推送。\n\n这里也可以看一下我的[ GitHub 项项目 ](https://github.com/cleverboy32/chorme-PwaDemo),官方也有很多例子。'}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQzLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsMG9LIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3B3YS5tZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcIiMjIyAqKuS7gOS5iOaYr1BXQSoqIFxcbuWFiOivtOS4gOS4i+WFqOWQje+8jHByb2dyZXNzaXZlIHdlYiBhcHDvvJog5riQ6L+b5byP572R6aG15bqU55So44CC6L+Z5piv6LC35q2M5o6o5Ye655qE77yM5oiR5piv6L+Z5qC355CG6Kej55qE77yaXFxuXFxuLSDmiJHku6zkuIDoiKzlhpl3ZWLlupTnlKjvvIzlnKggcGMg5LiK5piv5rKh5pyJ57yT5a2Y55qE77yM5omT5byA6aG16Z2i55qE5pe25Y676K+35rGC5pWw5o2u44CCXFxuXFxuLSAg56ys5LqM5Liq5Lmf5rKh5pyJ5YOPIGFwcCDkuIDmoLfnmoTlsI/lm77moIfmlL7lnKjmoYzpnaLvvIzkuIDngrnlvIDlsLHov5vlhaXkuoblupTnlKjvvIzogIzmmK/pgJrov4fmiZPlvIDmtY/op4jlmajovpPlhaXnvZHlnYDvvIwgXFxuXFxuLSDnrKzkuInkuKrlsLHmmK/vvIzkuI3og73lg48gYXBwIOS4gOagt+e7meeUqOaIt+aOqOmAgea2iOaBr++8jOWDj+W+ruWNmuS8mui3n+S9oOaOqOmAgeivtOacieiwgeivhOiuuuS6huS9oOeahOW+ruWNmuS5i+exu+eahOWKn+iDveOAgiBcXG5cXG7ogIzosLfmrYzmjqjlh7rnmoQgcHdh77yM5bCx5piv5YW35pyJ6L+Z5Lqb5LqG6L+Z5Lqb54m554K577yMIOS9v+aIkeS7rOeahCB3ZWIg5bqU55So77yM6IO95aSf5YOP5LiA5qy+IGFwcCDkuIDmoLfkvb/nlKjjgILlubbkuJTlr7nmr5TkuI4gYXBwLCDlroPkuI3nlKjlpI3mnYLnmoTlronoo4XvvIzkuZ/kuI3nlKjkuIvovb3mm7TmlrDljIXvvIzliLfmlrDpobXpnaLlsLHlj6/ku6XkuoYo5rOo5oSP5Yiw57yT5a2Y55qE5aSE55CGKeOAglxcblxcbiMjIyMgKirpgqPkuYjov5nkupvlip/og73liIbliKvmmK/mgI7kuYjlrp7njrDnmoTlkaLvvJ8qKiBcXG4qKuWFs+S6jue8k+WtmCoqXFxuXFxu5YW25a6e6L+Z5Liq5bCx5pivIOaIkeS7rOW5s+aXtuWBmueahCBTZXNzaW9uIOWViuOAgWxvY2FsU3RvcmFnZeOAgUNhY2hlU3RvcmFnZSDkuYvnsbvnmoTjgIJcXG5cXG7ov5nph4znlKjnmoTlsLHmmK8gW2NhY2hlU3RvcmFnZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvemgtQ04vZG9jcy9XZWIvQVBJL0NhY2hlU3RvcmFnZSkg57yT5a2Y77yM5a6D5o+Q5L6b5LqG5LiA5LiqU2VydmljZVdvcmtlcuexu+Wei+eahOW3peS9nOiAheaIlndpbmRvd+iMg+WbtOWPr+S7peiuv+mXrueahOaJgOacieWRveWQjee8k+WtmOeahOS4u+ebruW9lSwg5bm257u05oqk5a2X56ym5Liy55qE5pig5bCE5ZCN56ew5Yiw55u45bqU55qEIENhY2hlIOWvueixoeOAglxcbuS4u+imgeaWueazleWMheaLrO+8miBcXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE3MTExMjIxMjMwMjA3Mz93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KVxcbuacieS6hui/meS6m+aWueazleS9oOWPr+S7peWvueS9oOeahOe8k+WtmOi/m+ihjOaTjeS9nOOAguebruWJjei/mOWcqOiNieahiOeKtuaAge+8jOS7heeBq+eLkOWSjOiwt+atjOa1j+iniOWZqOaUr+aMgeatpOeJueaAp+OAglxcblxcblBXQeaYr+mAmui/hyBTZXJ2aWNlV29ya2VyIOiuv+mXriBjYWNoZSAs5omA5Lul6ZyA6KaB5rOo5YaMIFNlcnZpY2VXb3JrZXIg5bel5L2c6ICF44CC5Zyo5LmL5YmN5Yir5b+Y6K6w5Yik5pat5rWP6KeI5Zmo5piv5ZCm5pSv5oyB44CCXFxuXFxuYGBgXFxuaWYgKCdzZXJ2aWNlV29ya2VyJyBpbiBuYXZpZ2F0b3IpIHtcXG5cXHRuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3Rlcihzdy5qcykgLy8g5rOo5YaMc3cuanMg5paH5Lu25Lit5Y+Y5oiQ55qE5pyN5Yqh5a+56LGh77yM6L+U5Zue5rOo5YaM5oiQ5Yqf55qE5a+56LGhXFxuXFx0LnRoZW4oZnVuY3Rpb24oc3dSZWcpe1xcbiAgICAgICAgICBzd1JlZ2lzdHJhdGlvbiA9IHN3UmVnO1xcbiAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcXG4gICAgICAgICAgY29uc29sZS5lcnJvcignU2VydmljZSBXb3JrZXIgRXJyb3InLCBlcnJvcik7XFxuICAgICB9KTtcXG59XFxuYGBgXFxu6L+Z5LiqIFtTZXJ2aWNlIFdvcmtlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZpY2VfV29ya2VyX0FQSSkg5pyN5Yqh5bel5L2c6ICF5bCx5Y6J5a6z5LqG77yM5a6D55u45b2T5LqO5rWP6KeI5Zmo5ZKM572R57uc5LmL6Ze055qE5Luj55CG5pyN5Yqh5Zmo77yM5Y+v5Lul5oum5oiq572R57uc6K+35rGC77yM5YGa5LiA5Lqb5L2g5Y+v6IO96ZyA6KaB55qE5aSE55CGKOivt+axgui1hOa6kOS7jue8k+WtmOS4reiOt+WPluetiSnjgIJcXG5cXG4tICDlroPog73lpJ/liJvlu7rmnInmlYjnmoTnprvnur/kvZPpqozvvIzmi6bmiKrnvZHnu5zor7fmsYLvvIzlubbmoLnmja7nvZHnu5zmmK/lkKblj6/nlKjliKTmlq3mmK/lkKbkvb/nlKjnvJPlrZjmlbDmja7miJbogIXmm7TmlrDnvJPlrZjmlbDmja7jgIJcXG5cXG4tICDlroPku6zov5jlhYHorrjorr/pl67mjqjpgIHnmoTpgJrnn6XlkozlkI7lj7DnmoRBUEnjgIJcXG5cXG7lhbPkuo4gc3cuanMg5Lit5YW35L2T55qE57yT5a2Y55qE5Luj56CB77yaXFxuXFxu5Yib5bu66ZyA6KaB57yT5a2Y55qE5paH5Lu2XFxuXFxuYGBgXFxuJ3VzZSBzdHJpY3QnXFxubGV0IGNhY2hlTmFtZSA9ICdwd2EtZGVtby1hc3NldHMnOyAvLyDnvJPlrZjlkI3lrZdcXG5sZXQgaW1nQ2FjaGVOYW1lID0gJ3B3YS1pbWcnO1xcbmxldCBmaWxlc1RvQ2FjaGU7XFxuZmlsZXNUb0NhY2hlID0gWyAvLyDmiYDpnIDnvJPlrZjnmoTmlofku7ZcXG4gICAgJy8nLFxcbiAgICAnL2luZGV4Lmh0bWwnLFxcbiAgICAnL3NjcmlwdHMvYXBwLmpzJyxcXG4gICAgJy9hc3NldHMvaW1ncy80OC5wbmcnLFxcbiAgICAnL2Fzc2V0cy9pbWdzLzk2LnBuZycsXFxuICAgICcvYXNzZXRzL2ltZ3MvMTkyLnBuZycsXFxuICAgICcvZGlzdC9qcy9hcHAuanMnLFxcbiAgICAnL21hbmlmZXN0Lmpzb24nXFxuXTtcXG5cXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ2luc3RhbGwnLCBmdW5jdGlvbihlKSB7XFxuICAgIGUud2FpdFVudGlsKFxcblxcdCAgICAvLyDlronoo4XmnI3liqHogIXml7bvvIzlr7npnIDopoHnvJPlrZjnmoTmlofku7bov5vooYznvJPlrZhcXG4gICAgICAgIGNhY2hlcy5vcGVuKGNhY2hlTmFtZSkudGhlbihmdW5jdGlvbihjYWNoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBjYWNoZS5hZGRBbGwoZmlsZXNUb0NhY2hlKTtcXG4gICAgICAgIH0pXFxuICAgICk7XFxufSk7XFxuXFxuXFxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdmZXRjaCcsIChlKSA9PiB7XFxuICAgIC8vIOWIpOaWreWcsOWdgOaYr+S4jeaYr+mcgOimgeWunuaXtuWOu+ivt+axgu+8jOaYr+Wwsee7p+e7reWPkemAgeivt+axglxcbiAgICBpZiAoZS5yZXF1ZXN0LnVybC5pbmRleE9mKCcvYXBpLzQwMC8yMDAnKSA+IC0xKSB7XFxuICAgICAgICBlLnJlc3BvbmRXaXRoKFxcbiAgICAgICAgICAgIGNhY2hlcy5vcGVuKGltZ0NhY2hlTmFtZSkudGhlbihmdW5jdGlvbihjYWNoZSl7XFxuICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goZS5yZXF1ZXN0KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSl7XFxuICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQoZS5yZXF1ZXN0LnVybCwgcmVzcG9uc2UuY2xvbmUoKSk7IC8vIOavj+ivt+axguS4gOasoee8k+WtmOabtOaWsOS4gOasoeaWsOWKoOi9veeahOWbvueJh1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGUucmVzcG9uZFdpdGgoXFxuXFx0ICAgICAgICAvLyDljLnphY3liLDnvJPlrZjotYTmupDvvIzlsLHku47nvJPlrZjkuK3ov5Tlm57mlbDmja5cXG4gICAgICAgICAgICBjYWNoZXMubWF0Y2goZS5yZXF1ZXN0KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UgfHwgZmV0Y2goZS5yZXF1ZXN0KTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgKTtcXG4gICAgfVxcblxcbn0pO1xcbmBgYFxcblxcbioq6L+Z6YeM6L+b6ICM5bCx5byV5YWl5YiwIHB3YSDnmoTmjqjpgIHpgJrnn6Xlip/og73jgILov5npg73mmK/pgJrov4cgU2VydmljZVdvcmtlciDljrvlrp7njrDnmoTjgIIqKlxcblxcbuWfuuacrOWOn+eQhuaYr++8jOS9oOeahOWuouaIt+err+imgeWSjOaOqOmAgeacjeWKoei/m+ihjOe7keWumu+8jOS8mueUn+aIkOS4gOS4que7keWumuWQjueahOaOqOmAgeacjeWKoUFQSeaOpeWPo++8jOacjeWKoeerr+iwg+eUqOatpOaOpeWPo++8jOWPkemAgea2iOaBr+OAguWQjOaXtu+8jOa1j+iniOWZqOS5n+imgeaUr+aMgeaOqOmAgeWKn+iDve+8jOWcqOazqOWGjCBzdyDml7YsIOWKoOS4iuaOqOmAgeWKn+iDveeahOWIpOaWreOAglxcblxcbmBgYFxcbmlmICgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yICYmICdQdXNoTWFuYWdlcicgaW4gd2luZG93KSB7XFxuXFx0bmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoc3cuanMpXFxuXFx0LnRoZW4oZnVuY3Rpb24oc3dSZWcpIHtcXG4gICAgICAgIHN3UmVnaXN0cmF0aW9uID0gc3dSZWc7XFxuICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XFxuICAgICAgICBjb25zb2xlLmVycm9yKCdTZXJ2aWNlIFdvcmtlciBFcnJvcicsIGVycm9yKTtcXG4gICAgICAgIH0pO1xcbiB9IGVsc2Uge1xcbiAgICAgY29uc29sZS53YXJuKCdQdXNoIG1lc3NhZ2luZyBpcyBub3Qgc3VwcG9ydGVkJyk7XFxuIH1cXG5gYGBcXG5QdXNoTWFuYWdlciDms6jlhozlpb3kuYvlkI7vvIwg6YKj5LmI6KaB5YGa55qE5bCx5piv5rWP6KeI5Zmo5ZKM5pyN5Yqh5Zmo55qE57uR5a6a5LqG44CCXFxuXFxuIVvov5nph4zlhpnlm77niYfmj4/ov7BdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxNzExMTIyMDMzNDcyMjI/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG7mraTlm77mmK/nlKjmiLforqLpmIXmn5DkuKrlupTnlKjnqIvluo/nmoTmjqjpgIHmnI3liqHjgIJcXG7lrqLmiLfnq6/kvKDlhaXlupTnlKjnqIvluo/mnI3liqHlmajlhazpkqXvvIzlkJHlsIbnlJ/miJDnq6/ngrnnmoQgYHdlYnB1c2gg5pyN5Yqh5ZmoYCgg6L+Z5piv6LC35q2M6Ieq5bex5a6e546w55qE5LiA5Liq5o6o6YCB5Yqf6IO955qE5pyN5Yqh5ZmoKeWPkeWHuue9kee7nOivt+axgu+8jOWwhueUn+aIkOeahOerr+eCuSjkuIDkuKrmjqjpgIHmnI3liqEp5LiO5bqU55So56iL5bqP5YWs6ZKl5YWz6IGU77yM5bm25bCG56uv54K56L+U5Zue57uZ5bqU55So56iL5bqP44CC5rWP6KeI5Zmo5Lya5bCG5q2k56uv54K55re75Yqg5YiwIFB1c2hTdWJzY3JpcHRpb27vvIzpgJrov4cgcHJvbWlzZeW8guatpeaIkOWKn+aXtu+8jOWPr+S7peWwhuWug+eahOS/oeaBr+S/neWtmOWIsOS9oOeahOaVsOaNruW6k+OAglxcblxcbiFb6L+Z6YeM5YaZ5Zu+54mH5o+P6L+wXShodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMTEyMjAzNzUzODIwP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3QpXFxu5pyN5Yqh5Zmo5Y+R6YCB5o6o6YCB55qE5pe25YCZLOivt+axguebuOWFs+aOpeWPo++8jOmqjOivgeaIkOWKn+WQjuaOqOmAgeacjeWKoeS8muWPkea2iOaBr+e7meWuouaIt+err+OAglxcblxcbioq5pyA5ZCO5YWz5LqO5qGM6Z2i5bCP5Zu+5qCHKipcXG5cXG7ov5nkuKrlj6/ku6Xor7TmmK/pnZ7luLjnroDljZXkuobvvIzlsLHmmK/kuIDkuKptYW5pZmVzdC5qc29u6YWN572u5paH5Lu277yM54S25ZCO5Zyo6aG16Z2i5byV5YWl5q2k5paH5Lu25bCx5aW95LqGXFxuXFxuYGBgXFxuPCEtLSDliqDovb3muIXljZUgLS0+XFxuPGxpbmsgcmVsPVxcXCJtYW5pZmVzdFxcXCIgaHJlZj1cXFwiLi9tYW5pZmVzdC5qc29uXFxcIj5cXG5gYGBcXG7lhbPkuo5b5riF5Y2V5YaF5a65XShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL3dlYi1hcHAtbWFuaWZlc3QvKei/memHjOeugOWNleS7i+e7jeS4gOS4i++8mlxcblxcbmBgYFxcbntcXG4gICAgXFxcInNob3J0X25hbWVcXFwiOiBcXFwicHdhXFxcIixcXG4gICAgXFxcIm5hbWVcXFwiOiBcXFwicHdhIC0gZGVtb1xcXCIsIC8vIOW6lOeUqOWQjeensFxcbiAgICBcXFwiaWNvbnNcXFwiOiBbIC8vIOW6lOeUqOaYvuekuuWbvuagh++8jOagueaNruWuueWZqOWkp+Wwj+mAgumFjVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIFxcXCJzcmNcXFwiOiBcXFwiYXNzZXRzL2ltZ3MvNDgucG5nXFxcIixcXG4gICAgICAgICAgICBcXFwidHlwZVxcXCI6IFxcXCJpbWFnZS9wbmdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJzaXplc1xcXCI6IFxcXCI0OHg0OFxcXCJcXG4gICAgICAgIH0sXFxuICAgICAgICB7XFxuICAgICAgICAgICAgXFxcInNyY1xcXCI6IFxcXCJhc3NldHMvaW1ncy85Ni5wbmdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcImltYWdlL3BuZ1xcXCIsXFxuICAgICAgICAgICAgXFxcInNpemVzXFxcIjogXFxcIjk2eDk2XFxcIlxcbiAgICAgICAgfSxcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBcXFwic3JjXFxcIjogXFxcImFzc2V0cy9pbWdzLzE5Mi5wbmdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcImltYWdlL3BuZ1xcXCIsXFxuICAgICAgICAgICAgXFxcInNpemVzXFxcIjogXFxcIjE5MngxOTJcXFwiXFxuICAgICAgICB9XFxuICAgIF0sXFxuICAgIFxcXCJiYWNrZ3JvdW5kX2NvbG9yXFxcIjogXFxcIiMyMTk2RjNcXFwiLCAvLyDliJrmiZPlvIDpobXpnaLml7bnmoTog4zmma9cXG4gICAgXFxcInRoZW1lX2NvbG9yXFxcIjogXFxcIiMyMTk2RjNcXFwiLCAvLyDkuLvpopjpopzoibJcXG4gICAgXFxcImRpc3BsYXlcXFwiOiBcXFwic3RhbmRhbG9uZVxcXCIsIC8v54us56uL5pi+56S6XFxuICAgIFxcXCJzdGFydF91cmxcXFwiOiBcXFwiaW5kZXguaHRtbD9sYXVuY2hlcj10cnVlXFxcIiAvLyDlkK/liqjnmoTpobXpnaJcXG59XFxuYGBgXFxu5aW95LqG77yMIOWmguaenOaEn+WFtOi2o+i1tuW/q+S4iuaJi+WQp+OAglxcbuWPr+S7peafpeeci1vosLfmrYzlrpjmlrnmlZnnqItdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9wcm9ncmVzc2l2ZS13ZWItYXBwcy8p44CCXFxuXFxu6L+Z6YeM6K+05LiA5LiL5Z2R55qE54K577yMXFx0UFdB5bqU55So6ZyA6KaB5Zyo5pys5ZywbG9jYWxob3N0OjgwODAg5LiK6L+Q6KGM5oiW6ICFIGh0dHBzIOWNj+iuruS4i++8jCDopoHkv53or4HkvaDnmoTpobXpnaLmmK/lronlhajpobXpnaLjgIJcXG5cXG7mt7vliqDmoYzpnaLml7bvvIznoa7kv53kvaDnmoTosLfmrYzmtY/op4jlmajlj6/ku6XmmL7npLrlvLnlh7rpgJrnn6XjgIJcXG5cXG7lpoLmnpzkvaDopoHoh6rlt7Hlrp7njrDmjqjpgIHvvIzoh6rlt7HmnI3liqHlmajopoHmnInlhazpkqXlkoznp4HpkqXnmoTojrflj5bvvIwg6L+Z6YeM5Y+v5Lul6YCa6L+HIGh0dHBzOi8vd2ViLXB1c2gtY29kZWxhYi5nbGl0Y2gubWUg6I635Y+W77yMIOeUqCBjaHJvbWUg55qEIFt3ZWJwdXNoXShodHRwczovL2dpdGh1Yi5jb20vemFydS93ZWJwdXNoKSDmjqjpgIHjgIJcXG5cXG7ov5nph4zkuZ/lj6/ku6XnnIvkuIDkuIvmiJHnmoRbIEdpdEh1YiDpobnpobnnm64gXShodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvY2hvcm1lLVB3YURlbW8p77yM5a6Y5pa55Lmf5pyJ5b6I5aSa5L6L5a2Q44CCXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[636],{4636:(n,e,s)=>{s.r(e),s.d(e,{default:()=>t});const t='### **什么是PWA** \n先说一下全名,progressive web app: 渐进式网页应用。这是谷歌推出的,我是这样理解的:\n\n- 我们一般写web应用,在 pc 上是没有缓存的,打开页面的时去请求数据。\n\n- 第二个也没有像 app 一样的小图标放在桌面,一点开就进入了应用,而是通过打开浏览器输入网址, \n\n- 第三个就是,不能像 app 一样给用户推送消息,像微博会跟你推送说有谁评论了你的微博之类的功能。 \n\n而谷歌推出的 pwa,就是具有这些了这些特点, 使我们的 web 应用,能够像一款 app 一样使用。并且对比与 app, 它不用复杂的安装,也不用下载更新包,刷新页面就可以了(注意到缓存的处理)。\n\n#### **那么这些功能分别是怎么实现的呢?** \n**关于缓存**\n\n其实这个就是 我们平时做的 Session 啊、localStorage、CacheStorage 之类的。\n\n这里用的就是 [cacheStorage](https://developer.mozilla.org/zh-CN/docs/Web/API/CacheStorage) 缓存,它提供了一个ServiceWorker类型的工作者或window范围可以访问的所有命名缓存的主目录, 并维护字符串的映射名称到相应的 Cache 对象。\n主要方法包括: \n![这里写图片描述](https://img-blog.csdn.net/20171112212302073?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n有了这些方法你可以对你的缓存进行操作。目前还在草案状态,仅火狐和谷歌浏览器支持此特性。\n\nPWA是通过 ServiceWorker 访问 cache ,所以需要注册 ServiceWorker 工作者。在之前别忘记判断浏览器是否支持。\n\n```\nif (\'serviceWorker\' in navigator) {\n\tnavigator.serviceWorker.register(sw.js) // 注册sw.js 文件中变成的服务对象,返回注册成功的对象\n\t.then(function(swReg){\n swRegistration = swReg;\n }).catch(function(error) {\n console.error(\'Service Worker Error\', error);\n });\n}\n```\n这个 [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) 服务工作者就厉害了,它相当于浏览器和网络之间的代理服务器,可以拦截网络请求,做一些你可能需要的处理(请求资源从缓存中获取等)。\n\n- 它能够创建有效的离线体验,拦截网络请求,并根据网络是否可用判断是否使用缓存数据或者更新缓存数据。\n\n- 它们还允许访问推送的通知和后台的API。\n\n关于 sw.js 中具体的缓存的代码:\n\n创建需要缓存的文件\n\n```\n\'use strict\'\nlet cacheName = \'pwa-demo-assets\'; // 缓存名字\nlet imgCacheName = \'pwa-img\';\nlet filesToCache;\nfilesToCache = [ // 所需缓存的文件\n \'/\',\n \'/index.html\',\n \'/scripts/app.js\',\n \'/assets/imgs/48.png\',\n \'/assets/imgs/96.png\',\n \'/assets/imgs/192.png\',\n \'/dist/js/app.js\',\n \'/manifest.json\'\n];\n\nself.addEventListener(\'install\', function(e) {\n e.waitUntil(\n\t // 安装服务者时,对需要缓存的文件进行缓存\n caches.open(cacheName).then(function(cache) {\n return cache.addAll(filesToCache);\n })\n );\n});\n\n\nself.addEventListener(\'fetch\', (e) => {\n // 判断地址是不是需要实时去请求,是就继续发送请求\n if (e.request.url.indexOf(\'/api/400/200\') > -1) {\n e.respondWith(\n caches.open(imgCacheName).then(function(cache){\n return fetch(e.request).then(function (response){\n cache.put(e.request.url, response.clone()); // 每请求一次缓存更新一次新加载的图片\n return response;\n });\n })\n );\n } else {\n e.respondWith(\n\t // 匹配到缓存资源,就从缓存中返回数据\n caches.match(e.request).then(function (response) {\n return response || fetch(e.request);\n })\n );\n }\n\n});\n```\n\n**这里进而就引入到 pwa 的推送通知功能。这都是通过 ServiceWorker 去实现的。**\n\n基本原理是,你的客户端要和推送服务进行绑定,会生成一个绑定后的推送服务API接口,服务端调用此接口,发送消息。同时,浏览器也要支持推送功能,在注册 sw 时, 加上推送功能的判断。\n\n```\nif (\'serviceWorker\' in navigator && \'PushManager\' in window) {\n\tnavigator.serviceWorker.register(sw.js)\n\t.then(function(swReg) {\n swRegistration = swReg;\n }).catch(function(error) {\n console.error(\'Service Worker Error\', error);\n });\n } else {\n console.warn(\'Push messaging is not supported\');\n }\n```\nPushManager 注册好之后, 那么要做的就是浏览器和服务器的绑定了。\n\n![这里写图片描述](https://img-blog.csdn.net/20171112203347222?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n此图是用户订阅某个应用程序的推送服务。\n客户端传入应用程序服务器公钥,向将生成端点的 `webpush 服务器`( 这是谷歌自己实现的一个推送功能的服务器)发出网络请求,将生成的端点(一个推送服务)与应用程序公钥关联,并将端点返回给应用程序。浏览器会将此端点添加到 PushSubscription,通过 promise异步成功时,可以将它的信息保存到你的数据库。\n\n![这里写图片描述](https://img-blog.csdn.net/20171112203753820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n服务器发送推送的时候,请求相关接口,验证成功后推送服务会发消息给客户端。\n\n**最后关于桌面小图标**\n\n这个可以说是非常简单了,就是一个manifest.json配置文件,然后在页面引入此文件就好了\n\n```\n\x3c!-- 加载清单 --\x3e\n\n```\n关于[清单内容](https://developers.google.com/web/fundamentals/web-app-manifest/)这里简单介绍一下:\n\n```\n{\n "short_name": "pwa",\n "name": "pwa - demo", // 应用名称\n "icons": [ // 应用显示图标,根据容器大小适配\n {\n "src": "assets/imgs/48.png",\n "type": "image/png",\n "sizes": "48x48"\n },\n {\n "src": "assets/imgs/96.png",\n "type": "image/png",\n "sizes": "96x96"\n },\n {\n "src": "assets/imgs/192.png",\n "type": "image/png",\n "sizes": "192x192"\n }\n ],\n "background_color": "#2196F3", // 刚打开页面时的背景\n "theme_color": "#2196F3", // 主题颜色\n "display": "standalone", //独立显示\n "start_url": "index.html?launcher=true" // 启动的页面\n}\n```\n好了, 如果感兴趣赶快上手吧。\n可以查看[谷歌官方教程](https://developers.google.com/web/progressive-web-apps/)。\n\n这里说一下坑的点,\tPWA应用需要在本地localhost:8080 上运行或者 https 协议下, 要保证你的页面是安全页面。\n\n添加桌面时,确保你的谷歌浏览器可以显示弹出通知。\n\n如果你要自己实现推送,自己服务器要有公钥和私钥的获取, 这里可以通过 https://web-push-codelab.glitch.me 获取, 用 chrome 的 [webpush](https://github.com/zaru/webpush) 推送。\n\n这里也可以看一下我的[ GitHub 项项目 ](https://github.com/cleverboy32/chorme-PwaDemo),官方也有很多例子。'}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM2LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsMG9LIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3B3YS5tZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcIiMjIyAqKuS7gOS5iOaYr1BXQSoqIFxcbuWFiOivtOS4gOS4i+WFqOWQje+8jHByb2dyZXNzaXZlIHdlYiBhcHDvvJog5riQ6L+b5byP572R6aG15bqU55So44CC6L+Z5piv6LC35q2M5o6o5Ye655qE77yM5oiR5piv6L+Z5qC355CG6Kej55qE77yaXFxuXFxuLSDmiJHku6zkuIDoiKzlhpl3ZWLlupTnlKjvvIzlnKggcGMg5LiK5piv5rKh5pyJ57yT5a2Y55qE77yM5omT5byA6aG16Z2i55qE5pe25Y676K+35rGC5pWw5o2u44CCXFxuXFxuLSAg56ys5LqM5Liq5Lmf5rKh5pyJ5YOPIGFwcCDkuIDmoLfnmoTlsI/lm77moIfmlL7lnKjmoYzpnaLvvIzkuIDngrnlvIDlsLHov5vlhaXkuoblupTnlKjvvIzogIzmmK/pgJrov4fmiZPlvIDmtY/op4jlmajovpPlhaXnvZHlnYDvvIwgXFxuXFxuLSDnrKzkuInkuKrlsLHmmK/vvIzkuI3og73lg48gYXBwIOS4gOagt+e7meeUqOaIt+aOqOmAgea2iOaBr++8jOWDj+W+ruWNmuS8mui3n+S9oOaOqOmAgeivtOacieiwgeivhOiuuuS6huS9oOeahOW+ruWNmuS5i+exu+eahOWKn+iDveOAgiBcXG5cXG7ogIzosLfmrYzmjqjlh7rnmoQgcHdh77yM5bCx5piv5YW35pyJ6L+Z5Lqb5LqG6L+Z5Lqb54m554K577yMIOS9v+aIkeS7rOeahCB3ZWIg5bqU55So77yM6IO95aSf5YOP5LiA5qy+IGFwcCDkuIDmoLfkvb/nlKjjgILlubbkuJTlr7nmr5TkuI4gYXBwLCDlroPkuI3nlKjlpI3mnYLnmoTlronoo4XvvIzkuZ/kuI3nlKjkuIvovb3mm7TmlrDljIXvvIzliLfmlrDpobXpnaLlsLHlj6/ku6XkuoYo5rOo5oSP5Yiw57yT5a2Y55qE5aSE55CGKeOAglxcblxcbiMjIyMgKirpgqPkuYjov5nkupvlip/og73liIbliKvmmK/mgI7kuYjlrp7njrDnmoTlkaLvvJ8qKiBcXG4qKuWFs+S6jue8k+WtmCoqXFxuXFxu5YW25a6e6L+Z5Liq5bCx5pivIOaIkeS7rOW5s+aXtuWBmueahCBTZXNzaW9uIOWViuOAgWxvY2FsU3RvcmFnZeOAgUNhY2hlU3RvcmFnZSDkuYvnsbvnmoTjgIJcXG5cXG7ov5nph4znlKjnmoTlsLHmmK8gW2NhY2hlU3RvcmFnZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvemgtQ04vZG9jcy9XZWIvQVBJL0NhY2hlU3RvcmFnZSkg57yT5a2Y77yM5a6D5o+Q5L6b5LqG5LiA5LiqU2VydmljZVdvcmtlcuexu+Wei+eahOW3peS9nOiAheaIlndpbmRvd+iMg+WbtOWPr+S7peiuv+mXrueahOaJgOacieWRveWQjee8k+WtmOeahOS4u+ebruW9lSwg5bm257u05oqk5a2X56ym5Liy55qE5pig5bCE5ZCN56ew5Yiw55u45bqU55qEIENhY2hlIOWvueixoeOAglxcbuS4u+imgeaWueazleWMheaLrO+8miBcXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE3MTExMjIxMjMwMjA3Mz93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KVxcbuacieS6hui/meS6m+aWueazleS9oOWPr+S7peWvueS9oOeahOe8k+WtmOi/m+ihjOaTjeS9nOOAguebruWJjei/mOWcqOiNieahiOeKtuaAge+8jOS7heeBq+eLkOWSjOiwt+atjOa1j+iniOWZqOaUr+aMgeatpOeJueaAp+OAglxcblxcblBXQeaYr+mAmui/hyBTZXJ2aWNlV29ya2VyIOiuv+mXriBjYWNoZSAs5omA5Lul6ZyA6KaB5rOo5YaMIFNlcnZpY2VXb3JrZXIg5bel5L2c6ICF44CC5Zyo5LmL5YmN5Yir5b+Y6K6w5Yik5pat5rWP6KeI5Zmo5piv5ZCm5pSv5oyB44CCXFxuXFxuYGBgXFxuaWYgKCdzZXJ2aWNlV29ya2VyJyBpbiBuYXZpZ2F0b3IpIHtcXG5cXHRuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3Rlcihzdy5qcykgLy8g5rOo5YaMc3cuanMg5paH5Lu25Lit5Y+Y5oiQ55qE5pyN5Yqh5a+56LGh77yM6L+U5Zue5rOo5YaM5oiQ5Yqf55qE5a+56LGhXFxuXFx0LnRoZW4oZnVuY3Rpb24oc3dSZWcpe1xcbiAgICAgICAgICBzd1JlZ2lzdHJhdGlvbiA9IHN3UmVnO1xcbiAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcXG4gICAgICAgICAgY29uc29sZS5lcnJvcignU2VydmljZSBXb3JrZXIgRXJyb3InLCBlcnJvcik7XFxuICAgICB9KTtcXG59XFxuYGBgXFxu6L+Z5LiqIFtTZXJ2aWNlIFdvcmtlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZpY2VfV29ya2VyX0FQSSkg5pyN5Yqh5bel5L2c6ICF5bCx5Y6J5a6z5LqG77yM5a6D55u45b2T5LqO5rWP6KeI5Zmo5ZKM572R57uc5LmL6Ze055qE5Luj55CG5pyN5Yqh5Zmo77yM5Y+v5Lul5oum5oiq572R57uc6K+35rGC77yM5YGa5LiA5Lqb5L2g5Y+v6IO96ZyA6KaB55qE5aSE55CGKOivt+axgui1hOa6kOS7jue8k+WtmOS4reiOt+WPluetiSnjgIJcXG5cXG4tICDlroPog73lpJ/liJvlu7rmnInmlYjnmoTnprvnur/kvZPpqozvvIzmi6bmiKrnvZHnu5zor7fmsYLvvIzlubbmoLnmja7nvZHnu5zmmK/lkKblj6/nlKjliKTmlq3mmK/lkKbkvb/nlKjnvJPlrZjmlbDmja7miJbogIXmm7TmlrDnvJPlrZjmlbDmja7jgIJcXG5cXG4tICDlroPku6zov5jlhYHorrjorr/pl67mjqjpgIHnmoTpgJrnn6XlkozlkI7lj7DnmoRBUEnjgIJcXG5cXG7lhbPkuo4gc3cuanMg5Lit5YW35L2T55qE57yT5a2Y55qE5Luj56CB77yaXFxuXFxu5Yib5bu66ZyA6KaB57yT5a2Y55qE5paH5Lu2XFxuXFxuYGBgXFxuJ3VzZSBzdHJpY3QnXFxubGV0IGNhY2hlTmFtZSA9ICdwd2EtZGVtby1hc3NldHMnOyAvLyDnvJPlrZjlkI3lrZdcXG5sZXQgaW1nQ2FjaGVOYW1lID0gJ3B3YS1pbWcnO1xcbmxldCBmaWxlc1RvQ2FjaGU7XFxuZmlsZXNUb0NhY2hlID0gWyAvLyDmiYDpnIDnvJPlrZjnmoTmlofku7ZcXG4gICAgJy8nLFxcbiAgICAnL2luZGV4Lmh0bWwnLFxcbiAgICAnL3NjcmlwdHMvYXBwLmpzJyxcXG4gICAgJy9hc3NldHMvaW1ncy80OC5wbmcnLFxcbiAgICAnL2Fzc2V0cy9pbWdzLzk2LnBuZycsXFxuICAgICcvYXNzZXRzL2ltZ3MvMTkyLnBuZycsXFxuICAgICcvZGlzdC9qcy9hcHAuanMnLFxcbiAgICAnL21hbmlmZXN0Lmpzb24nXFxuXTtcXG5cXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ2luc3RhbGwnLCBmdW5jdGlvbihlKSB7XFxuICAgIGUud2FpdFVudGlsKFxcblxcdCAgICAvLyDlronoo4XmnI3liqHogIXml7bvvIzlr7npnIDopoHnvJPlrZjnmoTmlofku7bov5vooYznvJPlrZhcXG4gICAgICAgIGNhY2hlcy5vcGVuKGNhY2hlTmFtZSkudGhlbihmdW5jdGlvbihjYWNoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBjYWNoZS5hZGRBbGwoZmlsZXNUb0NhY2hlKTtcXG4gICAgICAgIH0pXFxuICAgICk7XFxufSk7XFxuXFxuXFxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdmZXRjaCcsIChlKSA9PiB7XFxuICAgIC8vIOWIpOaWreWcsOWdgOaYr+S4jeaYr+mcgOimgeWunuaXtuWOu+ivt+axgu+8jOaYr+Wwsee7p+e7reWPkemAgeivt+axglxcbiAgICBpZiAoZS5yZXF1ZXN0LnVybC5pbmRleE9mKCcvYXBpLzQwMC8yMDAnKSA+IC0xKSB7XFxuICAgICAgICBlLnJlc3BvbmRXaXRoKFxcbiAgICAgICAgICAgIGNhY2hlcy5vcGVuKGltZ0NhY2hlTmFtZSkudGhlbihmdW5jdGlvbihjYWNoZSl7XFxuICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goZS5yZXF1ZXN0KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSl7XFxuICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQoZS5yZXF1ZXN0LnVybCwgcmVzcG9uc2UuY2xvbmUoKSk7IC8vIOavj+ivt+axguS4gOasoee8k+WtmOabtOaWsOS4gOasoeaWsOWKoOi9veeahOWbvueJh1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGUucmVzcG9uZFdpdGgoXFxuXFx0ICAgICAgICAvLyDljLnphY3liLDnvJPlrZjotYTmupDvvIzlsLHku47nvJPlrZjkuK3ov5Tlm57mlbDmja5cXG4gICAgICAgICAgICBjYWNoZXMubWF0Y2goZS5yZXF1ZXN0KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UgfHwgZmV0Y2goZS5yZXF1ZXN0KTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgKTtcXG4gICAgfVxcblxcbn0pO1xcbmBgYFxcblxcbioq6L+Z6YeM6L+b6ICM5bCx5byV5YWl5YiwIHB3YSDnmoTmjqjpgIHpgJrnn6Xlip/og73jgILov5npg73mmK/pgJrov4cgU2VydmljZVdvcmtlciDljrvlrp7njrDnmoTjgIIqKlxcblxcbuWfuuacrOWOn+eQhuaYr++8jOS9oOeahOWuouaIt+err+imgeWSjOaOqOmAgeacjeWKoei/m+ihjOe7keWumu+8jOS8mueUn+aIkOS4gOS4que7keWumuWQjueahOaOqOmAgeacjeWKoUFQSeaOpeWPo++8jOacjeWKoeerr+iwg+eUqOatpOaOpeWPo++8jOWPkemAgea2iOaBr+OAguWQjOaXtu+8jOa1j+iniOWZqOS5n+imgeaUr+aMgeaOqOmAgeWKn+iDve+8jOWcqOazqOWGjCBzdyDml7YsIOWKoOS4iuaOqOmAgeWKn+iDveeahOWIpOaWreOAglxcblxcbmBgYFxcbmlmICgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yICYmICdQdXNoTWFuYWdlcicgaW4gd2luZG93KSB7XFxuXFx0bmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoc3cuanMpXFxuXFx0LnRoZW4oZnVuY3Rpb24oc3dSZWcpIHtcXG4gICAgICAgIHN3UmVnaXN0cmF0aW9uID0gc3dSZWc7XFxuICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XFxuICAgICAgICBjb25zb2xlLmVycm9yKCdTZXJ2aWNlIFdvcmtlciBFcnJvcicsIGVycm9yKTtcXG4gICAgICAgIH0pO1xcbiB9IGVsc2Uge1xcbiAgICAgY29uc29sZS53YXJuKCdQdXNoIG1lc3NhZ2luZyBpcyBub3Qgc3VwcG9ydGVkJyk7XFxuIH1cXG5gYGBcXG5QdXNoTWFuYWdlciDms6jlhozlpb3kuYvlkI7vvIwg6YKj5LmI6KaB5YGa55qE5bCx5piv5rWP6KeI5Zmo5ZKM5pyN5Yqh5Zmo55qE57uR5a6a5LqG44CCXFxuXFxuIVvov5nph4zlhpnlm77niYfmj4/ov7BdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxNzExMTIyMDMzNDcyMjI/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG7mraTlm77mmK/nlKjmiLforqLpmIXmn5DkuKrlupTnlKjnqIvluo/nmoTmjqjpgIHmnI3liqHjgIJcXG7lrqLmiLfnq6/kvKDlhaXlupTnlKjnqIvluo/mnI3liqHlmajlhazpkqXvvIzlkJHlsIbnlJ/miJDnq6/ngrnnmoQgYHdlYnB1c2gg5pyN5Yqh5ZmoYCgg6L+Z5piv6LC35q2M6Ieq5bex5a6e546w55qE5LiA5Liq5o6o6YCB5Yqf6IO955qE5pyN5Yqh5ZmoKeWPkeWHuue9kee7nOivt+axgu+8jOWwhueUn+aIkOeahOerr+eCuSjkuIDkuKrmjqjpgIHmnI3liqEp5LiO5bqU55So56iL5bqP5YWs6ZKl5YWz6IGU77yM5bm25bCG56uv54K56L+U5Zue57uZ5bqU55So56iL5bqP44CC5rWP6KeI5Zmo5Lya5bCG5q2k56uv54K55re75Yqg5YiwIFB1c2hTdWJzY3JpcHRpb27vvIzpgJrov4cgcHJvbWlzZeW8guatpeaIkOWKn+aXtu+8jOWPr+S7peWwhuWug+eahOS/oeaBr+S/neWtmOWIsOS9oOeahOaVsOaNruW6k+OAglxcblxcbiFb6L+Z6YeM5YaZ5Zu+54mH5o+P6L+wXShodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMTEyMjAzNzUzODIwP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3QpXFxu5pyN5Yqh5Zmo5Y+R6YCB5o6o6YCB55qE5pe25YCZLOivt+axguebuOWFs+aOpeWPo++8jOmqjOivgeaIkOWKn+WQjuaOqOmAgeacjeWKoeS8muWPkea2iOaBr+e7meWuouaIt+err+OAglxcblxcbioq5pyA5ZCO5YWz5LqO5qGM6Z2i5bCP5Zu+5qCHKipcXG5cXG7ov5nkuKrlj6/ku6Xor7TmmK/pnZ7luLjnroDljZXkuobvvIzlsLHmmK/kuIDkuKptYW5pZmVzdC5qc29u6YWN572u5paH5Lu277yM54S25ZCO5Zyo6aG16Z2i5byV5YWl5q2k5paH5Lu25bCx5aW95LqGXFxuXFxuYGBgXFxuPCEtLSDliqDovb3muIXljZUgLS0+XFxuPGxpbmsgcmVsPVxcXCJtYW5pZmVzdFxcXCIgaHJlZj1cXFwiLi9tYW5pZmVzdC5qc29uXFxcIj5cXG5gYGBcXG7lhbPkuo5b5riF5Y2V5YaF5a65XShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL3dlYi1hcHAtbWFuaWZlc3QvKei/memHjOeugOWNleS7i+e7jeS4gOS4i++8mlxcblxcbmBgYFxcbntcXG4gICAgXFxcInNob3J0X25hbWVcXFwiOiBcXFwicHdhXFxcIixcXG4gICAgXFxcIm5hbWVcXFwiOiBcXFwicHdhIC0gZGVtb1xcXCIsIC8vIOW6lOeUqOWQjeensFxcbiAgICBcXFwiaWNvbnNcXFwiOiBbIC8vIOW6lOeUqOaYvuekuuWbvuagh++8jOagueaNruWuueWZqOWkp+Wwj+mAgumFjVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIFxcXCJzcmNcXFwiOiBcXFwiYXNzZXRzL2ltZ3MvNDgucG5nXFxcIixcXG4gICAgICAgICAgICBcXFwidHlwZVxcXCI6IFxcXCJpbWFnZS9wbmdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJzaXplc1xcXCI6IFxcXCI0OHg0OFxcXCJcXG4gICAgICAgIH0sXFxuICAgICAgICB7XFxuICAgICAgICAgICAgXFxcInNyY1xcXCI6IFxcXCJhc3NldHMvaW1ncy85Ni5wbmdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcImltYWdlL3BuZ1xcXCIsXFxuICAgICAgICAgICAgXFxcInNpemVzXFxcIjogXFxcIjk2eDk2XFxcIlxcbiAgICAgICAgfSxcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBcXFwic3JjXFxcIjogXFxcImFzc2V0cy9pbWdzLzE5Mi5wbmdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcImltYWdlL3BuZ1xcXCIsXFxuICAgICAgICAgICAgXFxcInNpemVzXFxcIjogXFxcIjE5MngxOTJcXFwiXFxuICAgICAgICB9XFxuICAgIF0sXFxuICAgIFxcXCJiYWNrZ3JvdW5kX2NvbG9yXFxcIjogXFxcIiMyMTk2RjNcXFwiLCAvLyDliJrmiZPlvIDpobXpnaLml7bnmoTog4zmma9cXG4gICAgXFxcInRoZW1lX2NvbG9yXFxcIjogXFxcIiMyMTk2RjNcXFwiLCAvLyDkuLvpopjpopzoibJcXG4gICAgXFxcImRpc3BsYXlcXFwiOiBcXFwic3RhbmRhbG9uZVxcXCIsIC8v54us56uL5pi+56S6XFxuICAgIFxcXCJzdGFydF91cmxcXFwiOiBcXFwiaW5kZXguaHRtbD9sYXVuY2hlcj10cnVlXFxcIiAvLyDlkK/liqjnmoTpobXpnaJcXG59XFxuYGBgXFxu5aW95LqG77yMIOWmguaenOaEn+WFtOi2o+i1tuW/q+S4iuaJi+WQp+OAglxcbuWPr+S7peafpeeci1vosLfmrYzlrpjmlrnmlZnnqItdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9wcm9ncmVzc2l2ZS13ZWItYXBwcy8p44CCXFxuXFxu6L+Z6YeM6K+05LiA5LiL5Z2R55qE54K577yMXFx0UFdB5bqU55So6ZyA6KaB5Zyo5pys5ZywbG9jYWxob3N0OjgwODAg5LiK6L+Q6KGM5oiW6ICFIGh0dHBzIOWNj+iuruS4i++8jCDopoHkv53or4HkvaDnmoTpobXpnaLmmK/lronlhajpobXpnaLjgIJcXG5cXG7mt7vliqDmoYzpnaLml7bvvIznoa7kv53kvaDnmoTosLfmrYzmtY/op4jlmajlj6/ku6XmmL7npLrlvLnlh7rpgJrnn6XjgIJcXG5cXG7lpoLmnpzkvaDopoHoh6rlt7Hlrp7njrDmjqjpgIHvvIzoh6rlt7HmnI3liqHlmajopoHmnInlhazpkqXlkoznp4HpkqXnmoTojrflj5bvvIwg6L+Z6YeM5Y+v5Lul6YCa6L+HIGh0dHBzOi8vd2ViLXB1c2gtY29kZWxhYi5nbGl0Y2gubWUg6I635Y+W77yMIOeUqCBjaHJvbWUg55qEIFt3ZWJwdXNoXShodHRwczovL2dpdGh1Yi5jb20vemFydS93ZWJwdXNoKSDmjqjpgIHjgIJcXG5cXG7ov5nph4zkuZ/lj6/ku6XnnIvkuIDkuIvmiJHnmoRbIEdpdEh1YiDpobnpobnnm64gXShodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvY2hvcm1lLVB3YURlbW8p77yM5a6Y5pa55Lmf5pyJ5b6I5aSa5L6L5a2Q44CCXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/643.bundle.js b/643.bundle.js index 90100ac..71e29b8 100644 --- a/643.bundle.js +++ b/643.bundle.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[643],{643:(n,t,i)=>{i.r(t),i.d(t,{default:()=>o});const o='作为一个前端,写页面结构,写CSS怎么命名? \n就算不用,但你的了解, 让自己的代码更规范。\n\n##### BEM是什么\n它是css命名的一种规范。试想,你写了一个页面,有input, button, div, 这些元素是什么样的关系,给他们添加样式的时候,怎么知道他们是一个页面的? 怎么知道input 是否放在div里面的? 不要急,这就说到了下面的命名之作用\n\n#### BEM是怎么命名的\n```html\n\n\t
\n\t\t\n\t\t\t\n\t
\n\n```\n通过上面命名可以很直接看出,input 和button 在div 里面。\n这里讲 后面的 __input/__confim 这里后面接两个下划线,表示的是div里面的子元素。\n```html\n\n\t
\n\t\t\n\t\t\t\n\t
\n\n```\n这里说, --big表示添加的描述, 很明显是大的注册表单的样式嘛。\n\n#### BEM总结\n好了, 这里loggin-from 相当于一块整体(block), 里面包含了元素input/button(element), 还有这个块或者一些元素的修饰big(modifier) => BEM\n它一般和sass一起使用,在用@C代表块、 @d代表元素、 @m代码修饰符的时候, css可以这样写了\n```\n@C loggin-from {\n\twidth: 100px;\n\theight: 100px;\n\t@m big {\n\t\twidth: 200px;\n\t\theight: 200px;\n\t}\n\t@d input {\n\t\tcolor: red;\n\t}\n\t@d button {\n\t\tcolor: blue;\n\t}\n}\n```\n怎么样,这样是不是就不用写那么长了, 而且一看样式文件,就能知道页面布局是什么样的。\n**以上写法, 要通过sass 插件配置的**\n这里有一个包 ,可以使用[sass-bem-constructor](https://www.npmjs.com/package/sass-bem-constructor)'}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQzLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsNnFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2JlbS5tZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcIuS9nOS4uuS4gOS4quWJjeerr++8jOWGmemhtemdoue7k+aehO+8jOWGmUNTU+aAjuS5iOWRveWQjT8gXFxu5bCx566X5LiN55So77yM5L2G5L2g55qE5LqG6Kej77yMIOiuqeiHquW3seeahOS7o+eggeabtOinhOiMg+OAglxcblxcbiMjIyMjIEJFTeaYr+S7gOS5iFxcbuWug+aYr2Nzc+WRveWQjeeahOS4gOenjeinhOiMg+OAguivleaDs++8jOS9oOWGmeS6huS4gOS4qumhtemdou+8jOaciWlucHV0LCBidXR0b24sIGRpdiwg6L+Z5Lqb5YWD57Sg5piv5LuA5LmI5qC355qE5YWz57O777yM57uZ5LuW5Lus5re75Yqg5qC35byP55qE5pe25YCZ77yM5oCO5LmI55+l6YGT5LuW5Lus5piv5LiA5Liq6aG16Z2i55qE77yfIOaAjuS5iOefpemBk2lucHV0IOaYr+WQpuaUvuWcqGRpdumHjOmdoueahO+8nyDkuI3opoHmgKXvvIzov5nlsLHor7TliLDkuobkuIvpnaLnmoTlkb3lkI3kuYvkvZznlKhcXG5cXG4jIyMjIEJFTeaYr+aAjuS5iOWRveWQjeeahFxcbmBgYGh0bWxcXG48aHRtbD5cXG5cXHQ8ZGl2IGNsYXNzPVxcXCJsb2dnaW4tZnJvbVxcXCI+XFxuXFx0XFx0PGlucHV0IGNsYXNzPVxcXCJsb2dnaW4tZnJvbV9faW5wdXRcXFwiLz5cXG5cXHRcXHQ8YnV0dG9uIGNsYXNzPVxcXCJsb2dnaW4tZnJvbV9fY29uZmltXFxcIj7noa7lrpo8L2J1dHRvbj5cXHRcXG5cXHQ8L2Rpdj5cXG48L2h0bWw+XFxuYGBgXFxu6YCa6L+H5LiK6Z2i5ZG95ZCN5Y+v5Lul5b6I55u05o6l55yL5Ye677yMaW5wdXQg5ZKMYnV0dG9uIOWcqGRpdiDph4zpnaLjgIJcXG7ov5nph4zorrIg5ZCO6Z2i55qEIF9faW5wdXQvX19jb25maW0g6L+Z6YeM5ZCO6Z2i5o6l5Lik5Liq5LiL5YiS57q/77yM6KGo56S655qE5pivZGl26YeM6Z2i55qE5a2Q5YWD57Sg44CCXFxuYGBgaHRtbFxcbjxodG1sPlxcblxcdDxkaXYgY2xhc3M9XFxcImxvZ2dpbi1mcm9tLS1iaWdcXFwiPlxcblxcdFxcdDxpbnB1dCBjbGFzcz1cXFwibG9nZ2luLWZyb21fX2lucHV0XFxcIi8+XFxuXFx0XFx0PGJ1dHRvbiBjbGFzcz1cXFwibG9nZ2luLWZyb21fX2NvbmZpbVxcXCI+56Gu5a6aPC9idXR0b24+XFx0XFxuXFx0PC9kaXY+XFxuPC9odG1sPlxcbmBgYFxcbui/memHjOivtO+8jCAtLWJpZ+ihqOekuua3u+WKoOeahOaPj+i/sO+8jCDlvojmmI7mmL7mmK/lpKfnmoTms6jlhozooajljZXnmoTmoLflvI/lmJvjgIJcXG5cXG4jIyMjIEJFTeaAu+e7k1xcbuWlveS6hu+8jCDov5nph4xsb2dnaW4tZnJvbSDnm7jlvZPkuo7kuIDlnZfmlbTkvZMoYmxvY2sp77yMIOmHjOmdouWMheWQq+S6huWFg+e0oGlucHV0L2J1dHRvbihlbGVtZW50KSwg6L+Y5pyJ6L+Z5Liq5Z2X5oiW6ICF5LiA5Lqb5YWD57Sg55qE5L+u6aWwYmlnKG1vZGlmaWVyKSA9PiBCRU1cXG7lroPkuIDoiKzlkoxzYXNz5LiA6LW35L2/55So77yM5Zyo55SoQEPku6PooajlnZfjgIEgQGTku6PooajlhYPntKDjgIEgQG3ku6PnoIHkv67ppbDnrKbnmoTml7blgJnvvIwgY3Nz5Y+v5Lul6L+Z5qC35YaZ5LqGXFxuYGBgXFxuQEMgbG9nZ2luLWZyb20ge1xcblxcdHdpZHRoOiAxMDBweDtcXG5cXHRoZWlnaHQ6IDEwMHB4O1xcblxcdEBtIGJpZyB7XFxuXFx0XFx0d2lkdGg6IDIwMHB4O1xcblxcdFxcdGhlaWdodDogMjAwcHg7XFxuXFx0fVxcblxcdEBkIGlucHV0IHtcXG5cXHRcXHRjb2xvcjogcmVkO1xcblxcdH1cXG5cXHRAZCBidXR0b24ge1xcblxcdFxcdGNvbG9yOiBibHVlO1xcblxcdH1cXG59XFxuYGBgXFxu5oCO5LmI5qC377yM6L+Z5qC35piv5LiN5piv5bCx5LiN55So5YaZ6YKj5LmI6ZW/5LqG77yMIOiAjOS4lOS4gOeci+agt+W8j+aWh+S7tu+8jOWwseiDveefpemBk+mhtemdouW4g+WxgOaYr+S7gOS5iOagt+eahOOAglxcbioq5Lul5LiK5YaZ5rOV77yMIOimgemAmui/h3Nhc3Mg5o+S5Lu26YWN572u55qEKipcXG7ov5nph4zmnInkuIDkuKrljIUg77yM5Y+v5Lul5L2/55SoW3Nhc3MtYmVtLWNvbnN0cnVjdG9yXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zYXNzLWJlbS1jb25zdHJ1Y3RvcilcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[643],{643:function(e,n,t){t.r(n),t.d(n,{default:function(){return s}});var r=t(762);const o={class:"component-typescript"},p={};var s=(0,t(314).A)(p,[["render",function(e,n){return(0,r.uX)(),(0,r.CE)("div",o,n[0]||(n[0]=[(0,r.Fv)('

learn typescript

类型

基本类型:

string number bool \n

数组 []:

string[]  number[]\n

元祖:

[string, number]. 数组中有不同的数据类型\n

对象:

{ name: string; age: number }\n

函数:

(arg1: string, arg?: bool) => void\n

Symbol:

let symbol = Symbol("key"); \n

空:

undefined   null\n

任何类型:

any\n

不存在的值:

never\n

如何定义类型

type 定义类型变量

type Person = { name: string; age: number}\nts 使用 const person1:Person = { name: '22', age: 1};\n

Interfaces 声明 对象 类型的一种方法

Interface Person { name: string; age: number}\n

extends 类型继承于声明的类型

interface a { name: string}\ninterface b extends a {\n\tage: number\n}\nb 的类型等于 { name: string; age: number }\n

in 判断属性是哪个类型中的

type PersonListQuery = { user_ids: string[] }\ntype DogListQuery = { dog_ids: string[] }\n\nfunction getList(query: PersonListQuery | DogListQuery ) {\n\tif ('user_ids' in PersonListQuery) {\n\t \t// 这里可以推导出 query 类型是 PersonListQuery\n\t}\n}\n\n

类型组合

Required<T> 将 T 中所有属性变成必选

Required<{ a?: bool} > = { a: bool }\n

Partial<T> 将 T 中所有属性变成可选

Partial<{ a: bool }> = { a?: bool }\n

Readonly<T> 将 T 中所有属性变成只读,后续 ts 会检测该类型不允许修改

const person2: Readonly<{name: string}> = {name: '22'}\nperson2.name = '33' //error\n

Omit<T, keys> 删除某些属性

interface Person {\n  name: string;\n  age: number;\n}\n \ntype Name = Omit<Person, 'age'>;\nName 的类型定义为 { name: string }\n

Pick<T, keys> 选择类型中的某些属性

interface Person {\n  name: string;\n  age: number;\n}\ntype Name = Pick<Person, 'name'>;\nName 的类型定义为 { name: string }\n

Exclude<T, deleteT> 删除类型 T 中 deleteT 的类型, 相当于 Omit, 第二个值可以是 keys ,也可以是一个类型变量

interface Person {\n  name: string;\n  age: number;\n}\ntype Age = { age: number }\ntype Name = Exclude<Person, Age>\nName 的类型定义为 { name: string }\n

Extract<T, U> 提取 T 继承于的 U 类型

type Person = {  name: string ; age: number } \ntype PersonDetail = { pet: any; phone: number } \ntype Name = { name: string }\ntype Name = Extract<Person | PersonDetail , Name>\n 将提取出含有 name 的类型 Person\n

Parameters<function T> 获取函数类型的函数类型

type getName = (perpson: Person) => string;\ntype queryType = Parameters<getName>;\nqueryType  的类型定义为 Person\n

ReturnType<function T> 获取函数类型的返回值类型

type getName = (perpson: Person) => string;\ntype resType = ReturnType<getName>;\nvalueType 类型为 string\n

Awaited<Promise Type> 获取异步返回的值类型

type getPerson = (id: string) => Promise<Person>\ntype resType = ReturnType<getPerson> // Promise<Person>\ntype valueType = Awaited<resType> // Person\n

Record<K extends keyof any, T> 定义对象的 key 键类型

type Keys = 'name' | 'age' \ntype person = Record<Keys, any>\n// person 的属性只能为 name 和 age\n

NonNullable<T> 去除类型中定义的 null 和 undefined

type PersonHobby = hobby: string | undefined;\ntype Hobby = NonNullable<hobby>\nHobby 类型为  string\n

类型操作

typeof Object 获得对象的类型

const person1 = { name: '22', age: 1}\ntype Person = typeof person1\nPerson 类型为 { name: string; age: number }\n

keyof T 获得类型中的属性

type Person = { name: string; age: number }\ntype Key = keyof Person \nkey 的类型为 'name' | 'age'\n

通常我们可以通过 keyof 约束对象的传参, 如

type Person = { name: string; age: number }\ntype Key = keyof Person;\ntype getPersonAtrribute = (person: Person, key: Key) => Person[Key];\n

或者某些情况下我们想知道一个对象的属性值

const workPerson = { \n\t'1': { name: '1', age: 1},\n\t'2': { name: '2', age: 2},\n}\ntype WorkPerson  = typeof workPerson;  // { '1': {name: string; age: number }, '2': {name: string; age: number }\ntype Key = keyof WorkPerson  // '1' | '2'\ntype Person = WorkPerson[Key]   // {name: string; age: number }\n

| 类型兼容

type width = 'string' | 'number';\n\n则 width 可以是 '32px' 也可以是 '32' 在 渲染时兼容两种类型\n

函数重载

定义不同类型的输入,推到出不同类型的输出

type PersonListQuery = { user_ids: string[] };\ntype DongListQuery = { dog_ids: string[] };\nfunction getList(request: PersonListQuery): Person[];\nfunction getList(request: DogListQuery): Dog[];\n\nfunction getList(query: PersonListQuery | DogListQuery) {\n  if ('user_ids' in query) {  \n    return [] as Person[];\n  } else {\n    return [] as Dog[];\n  }\n}\n\nconst a = getList({ personIds: [], region: 'us'})\n此时 a 的类型将能推到出是 Person[]\n

泛型

类型的传参。 用 T 标识,在实际运用时你传入什么类型,该类型就作为后续推导。

async function request<T>(url: string): Promise<T> {\n  const res = await fetch(url)\n  return res.json();\n}\n\nconst res = await request<Person>('getPersonInfo?id=1'); \n此时 ts 可以推导出 res 的类型是 Person\n

Infer 类型参数使用

通过 Infer 一个类型为变量,定义出获取类型的方法

type addResultType<T> = T extends { a: infer U, b: infer U } ?  U : never;\ntype numberAdd =  addResultType<{ a: 1, b: 2 }>     // 推到出结果类型为 number\ntype textAdd = addResultType<{ a: 'hello', b: 'world' }>     // 推到出结果类型为 string\n

枚举 enum

变量的值是约定的几个取值

const enum PageType {\n  HOME = 'home',\n  VIDEO = 'video',\n}\n\nfunction getPageUrl(page: PageType) {\n  return {\n    [PageType.VIDEO]: "/video",\n    [PageType.HOME]: "/home",\n  }[page];\n}\n

tsconfig

了解了 ts 对于类型的定义和各种规则后,我们则可以在编写 js 代码时利用并进行类型约束。于此同时,我们需要引入 typescript 库去获得这些 ts 能力。

如何引入

npm install  typescript  \n// 不必再多说\n

命令

typescript 包是有命令文件的,通常 ts 的运行则是通过 tsc 配合相关命令去执行的. 具体命令大家可以安装包之后通过 tsc -h 查看 在这里插入图片描述

配置 官网

如果你看了 tsc 命令,你会发现它是有很多命令的,并且有的命令还伴随这相关参数。在工作文件夹中,我们则通过配置文件 tsconfig.js 去配置,保证在项目中的运用。 配置参数这里就不细讲了,还是看官方文档靠谱点。

',85)]))}]])}}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQzLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0sd0JDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQXFOSixNQXJOSUMsRUFxTkpDLEVBQUEsS0FBQUEsRUFBQSxLQXJOTkMsRUFBQUEsRUFBQUEsSUFBQSwrNk4iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vdHlwZXNjcmlwdC5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vdHlwZXNjcmlwdC5tZD9lMmQ2Il0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXR5cGVzY3JpcHRcIj48aDI+bGVhcm4gdHlwZXNjcmlwdDwvaDI+XG48aDM+57G75Z6LPC9oMz5cbjxwPuWfuuacrOexu+Weizo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+c3RyaW5nIG51bWJlciBib29sIFxuPC9jb2RlPjwvcHJlPlxuPHA+5pWw57uEIDxjb2RlPltdPC9jb2RlPjo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+c3RyaW5nW10gIG51bWJlcltdXG48L2NvZGU+PC9wcmU+XG48cD7lhYPnpZY6PC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPltzdHJpbmcsIG51bWJlcl0uIOaVsOe7hOS4reacieS4jeWQjOeahOaVsOaNruexu+Wei1xuPC9jb2RlPjwvcHJlPlxuPHA+5a+56LGhOjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT57IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfVxuPC9jb2RlPjwvcHJlPlxuPHA+5Ye95pWw77yaPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPihhcmcxOiBzdHJpbmcsIGFyZz86IGJvb2wpID0mZ3Q7IHZvaWRcbjwvY29kZT48L3ByZT5cbjxwPlN5bWJvbDo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+bGV0IHN5bWJvbCA9IFN5bWJvbChcImtleVwiKTsgXG48L2NvZGU+PC9wcmU+XG48cD7nqbrvvJo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dW5kZWZpbmVkICAgbnVsbFxuPC9jb2RlPjwvcHJlPlxuPHA+5Lu75L2V57G75Z6L77yaPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmFueVxuPC9jb2RlPjwvcHJlPlxuPHA+5LiN5a2Y5Zyo55qE5YC877yaPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPm5ldmVyXG48L2NvZGU+PC9wcmU+XG48aDM+5aaC5L2V5a6a5LmJ57G75Z6LPC9oMz5cbjxwPjxjb2RlPnR5cGU8L2NvZGU+ICDlrprkuYnnsbvlnovlj5jph488L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBQZXJzb24gPSB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXJ9XG50cyDkvb/nlKggY29uc3QgcGVyc29uMe+8mlBlcnNvbiA9IHsgbmFtZTogJzIyJywgYWdlOiAxfTtcbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPkludGVyZmFjZXM8L2NvZGU+IOWjsOaYjiA8Y29kZT7lr7nosaE8L2NvZGU+IOexu+Wei+eahOS4gOenjeaWueazlTwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5JbnRlcmZhY2UgUGVyc29uIHsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlcn1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPmV4dGVuZHM8L2NvZGU+IOexu+Wei+e7p+aJv+S6juWjsOaYjueahOexu+WeizwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5pbnRlcmZhY2UgYSB7IG5hbWU6IHN0cmluZ31cbmludGVyZmFjZSBiIGV4dGVuZHMgYSB7XG5cdGFnZTogbnVtYmVyXG59XG5iIOeahOexu+Wei+etieS6jiB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfVxuPC9jb2RlPjwvcHJlPlxuPHA+aW4g5Yik5pat5bGe5oCn5piv5ZOq5Liq57G75Z6L5Lit55qEPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgUGVyc29uTGlzdFF1ZXJ5ID0geyB1c2VyX2lkczogc3RyaW5nW10gfVxudHlwZSBEb2dMaXN0UXVlcnkgPSB7IGRvZ19pZHM6IHN0cmluZ1tdIH1cblxuZnVuY3Rpb24gZ2V0TGlzdChxdWVyeTogUGVyc29uTGlzdFF1ZXJ5IHwgRG9nTGlzdFF1ZXJ5ICkge1xuXHRpZiAoJ3VzZXJfaWRzJyBpbiBQZXJzb25MaXN0UXVlcnkpIHtcblx0IFx0Ly8g6L+Z6YeM5Y+v5Lul5o6o5a+85Ye6IHF1ZXJ5IOexu+Wei+aYryBQZXJzb25MaXN0UXVlcnlcblx0fVxufVxuXG48L2NvZGU+PC9wcmU+XG48aDM+57G75Z6L57uE5ZCIPC9oMz5cbjxwPjxjb2RlPlJlcXVpcmVkJmx0O1QmZ3Q7PC9jb2RlPiDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlv4XpgIk8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+UmVxdWlyZWQmbHQ7eyBhPzogYm9vbH0gJmd0OyA9IHsgYTogYm9vbCB9XG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT5QYXJ0aWFsJmx0O1QmZ3Q7PC9jb2RlPiDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlj6/pgIk8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+UGFydGlhbCZsdDt7IGE6IGJvb2wgfSZndDsgPSB7IGE/OiBib29sIH1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPlJlYWRvbmx5Jmx0O1QmZ3Q7PC9jb2RlPiDlsIYgVCDkuK3miYDmnInlsZ7mgKflj5jmiJDlj6ror7vvvIzlkI7nu60gdHMg5Lya5qOA5rWL6K+l57G75Z6L5LiN5YWB6K645L+u5pS5PC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmNvbnN0IHBlcnNvbjI6IFJlYWRvbmx5Jmx0O3tuYW1lOiBzdHJpbmd9Jmd0OyA9IHtuYW1lOiAnMjInfVxucGVyc29uMi5uYW1lID0gJzMzJyAvL2Vycm9yXG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT5PbWl0Jmx0O1QsIGtleXMmZ3Q7PC9jb2RlPiDliKDpmaTmn5DkupvlsZ7mgKc8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+aW50ZXJmYWNlIFBlcnNvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWdlOiBudW1iZXI7XG59XG4gXG50eXBlIE5hbWUgPSBPbWl0Jmx0O1BlcnNvbiwgJ2FnZScmZ3Q7O1xuTmFtZSDnmoTnsbvlnovlrprkuYnkuLogeyBuYW1lOiBzdHJpbmcgfVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+UGljayZsdDtULCBrZXlzJmd0OzwvY29kZT4g6YCJ5oup57G75Z6L5Lit55qE5p+Q5Lqb5bGe5oCnPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmludGVyZmFjZSBQZXJzb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFnZTogbnVtYmVyO1xufVxudHlwZSBOYW1lID0gUGljayZsdDtQZXJzb24sICduYW1lJyZndDs7XG5OYW1lIOeahOexu+Wei+WumuS5ieS4uiB7IG5hbWU6IHN0cmluZyB9XG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT5FeGNsdWRlJmx0O1QsIGRlbGV0ZVQmZ3Q7PC9jb2RlPiDliKDpmaTnsbvlnosgVCDkuK0gZGVsZXRlVCDnmoTnsbvlnovvvIwg55u45b2T5LqOIE9taXQsIOesrOS6jOS4quWAvOWPr+S7peaYryBrZXlzIO+8jOS5n+WPr+S7peaYr+S4gOS4quexu+Wei+WPmOmHjzwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5pbnRlcmZhY2UgUGVyc29uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhZ2U6IG51bWJlcjtcbn1cbnR5cGUgQWdlID0geyBhZ2U6IG51bWJlciB9XG50eXBlIE5hbWUgPSBFeGNsdWRlJmx0O1BlcnNvbiwgQWdlJmd0O1xuTmFtZSDnmoTnsbvlnovlrprkuYnkuLogeyBuYW1lOiBzdHJpbmcgfVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+RXh0cmFjdCZsdDtULCBVJmd0OzwvY29kZT4g5o+Q5Y+WIFQg57un5om/5LqO55qEIFUg57G75Z6LPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgUGVyc29uID0geyAgbmFtZTogc3RyaW5nIDsgYWdlOiBudW1iZXIgfSBcbnR5cGUgUGVyc29uRGV0YWlsID0geyBwZXQ6IGFueTsgcGhvbmU6IG51bWJlciB9IFxudHlwZSBOYW1lID0geyBuYW1lOiBzdHJpbmcgfVxudHlwZSBOYW1lID0gRXh0cmFjdCZsdDtQZXJzb24gfCBQZXJzb25EZXRhaWwgLCBOYW1lJmd0O1xuIOWwhuaPkOWPluWHuuWQq+aciSBuYW1lIOeahOexu+WeiyBQZXJzb25cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPlBhcmFtZXRlcnMmbHQ7ZnVuY3Rpb24gVCZndDs8L2NvZGU+IOiOt+WPluWHveaVsOexu+Wei+eahOWHveaVsOexu+WeizwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9Jmd0OyBzdHJpbmc7XG50eXBlIHF1ZXJ5VHlwZSA9IFBhcmFtZXRlcnMmbHQ7Z2V0TmFtZSZndDs7XG5xdWVyeVR5cGUgIOeahOexu+Wei+WumuS5ieS4uiBQZXJzb25cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPlJldHVyblR5cGUmbHQ7ZnVuY3Rpb24gVCZndDs8L2NvZGU+IOiOt+WPluWHveaVsOexu+Wei+eahOi/lOWbnuWAvOexu+WeizwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT50eXBlIGdldE5hbWUgPSAocGVycHNvbjogUGVyc29uKSA9Jmd0OyBzdHJpbmc7XG50eXBlIHJlc1R5cGUgPSBSZXR1cm5UeXBlJmx0O2dldE5hbWUmZ3Q7O1xudmFsdWVUeXBlIOexu+Wei+S4uiBzdHJpbmdcbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPkF3YWl0ZWQmbHQ7UHJvbWlzZSBUeXBlJmd0OzwvY29kZT4g6I635Y+W5byC5q2l6L+U5Zue55qE5YC857G75Z6LPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgZ2V0UGVyc29uID0gKGlkOiBzdHJpbmcpID0mZ3Q7IFByb21pc2UmbHQ7UGVyc29uJmd0O1xudHlwZSByZXNUeXBlID0gUmV0dXJuVHlwZSZsdDtnZXRQZXJzb24mZ3Q7IC8vIFByb21pc2UmbHQ7UGVyc29uJmd0O1xudHlwZSB2YWx1ZVR5cGUgPSBBd2FpdGVkJmx0O3Jlc1R5cGUmZ3Q7IC8vIFBlcnNvblxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+UmVjb3JkJmx0O0sgZXh0ZW5kcyBrZXlvZiBhbnksIFQmZ3Q7PC9jb2RlPiAg5a6a5LmJ5a+56LGh55qEIGtleSDplK7nsbvlnos8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBLZXlzID0gJ25hbWUnIHwgJ2FnZScgXG50eXBlIHBlcnNvbiA9IFJlY29yZCZsdDtLZXlzLCBhbnkmZ3Q7XG4vLyBwZXJzb24g55qE5bGe5oCn5Y+q6IO95Li6IG5hbWUg5ZKMIGFnZVxuPC9jb2RlPjwvcHJlPlxuPHA+PGNvZGU+Tm9uTnVsbGFibGUmbHQ7VCZndDs8L2NvZGU+IOWOu+mZpOexu+Wei+S4reWumuS5ieeahCBudWxsIOWSjCB1bmRlZmluZWQ8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBQZXJzb25Ib2JieSA9IGhvYmJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG50eXBlIEhvYmJ5ID0gTm9uTnVsbGFibGUmbHQ7aG9iYnkmZ3Q7XG5Ib2JieSDnsbvlnovkuLogIHN0cmluZ1xuPC9jb2RlPjwvcHJlPlxuPGgzPuexu+Wei+aTjeS9nDwvaDM+XG48cD48Y29kZT50eXBlb2YgT2JqZWN0PC9jb2RlPiDojrflvpc8Y29kZT7lr7nosaE8L2NvZGU+55qE57G75Z6LPC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPmNvbnN0IHBlcnNvbjEgPSB7IG5hbWU6ICcyMicsIGFnZTogMX1cbnR5cGUgUGVyc29uID0gdHlwZW9mIHBlcnNvbjFcblBlcnNvbiDnsbvlnovkuLogeyBuYW1lOiBzdHJpbmc7IGFnZTogbnVtYmVyIH1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPmtleW9mIFQ8L2NvZGU+ICDojrflvpfnsbvlnovkuK3nmoTlsZ7mgKc8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBQZXJzb24gPSB7IG5hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfVxudHlwZSBLZXkgPSBrZXlvZiBQZXJzb24gXG5rZXkg55qE57G75Z6L5Li6ICduYW1lJyB8ICdhZ2UnXG48L2NvZGU+PC9wcmU+XG48cD7pgJrluLjmiJHku6zlj6/ku6XpgJrov4cga2V5b2Yg57qm5p2f5a+56LGh55qE5Lyg5Y+C77yMIOWmgjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT50eXBlIFBlcnNvbiA9IHsgbmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XG50eXBlIEtleSA9IGtleW9mIFBlcnNvbjtcbnR5cGUgZ2V0UGVyc29uQXRycmlidXRlID0gKHBlcnNvbjogUGVyc29uLCBrZXk6IEtleSkgPSZndDsgUGVyc29uW0tleV07XG48L2NvZGU+PC9wcmU+XG48cD7miJbogIXmn5Dkupvmg4XlhrXkuIvmiJHku6zmg7Pnn6XpgZPkuIDkuKrlr7nosaHnmoTlsZ7mgKflgLw8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+Y29uc3Qgd29ya1BlcnNvbiA9IHsgXG5cdCcxJzogeyBuYW1lOiAnMScsIGFnZTogMX0sXG5cdCcyJzogeyBuYW1lOiAnMicsIGFnZTogMn0sXG59XG50eXBlIFdvcmtQZXJzb24gID0gdHlwZW9mIHdvcmtQZXJzb247ICAvLyB7ICcxJzoge25hbWU6IHN0cmluZzsgYWdlOiBudW1iZXIgfSwgJzInOiB7bmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XG50eXBlIEtleSA9IGtleW9mIFdvcmtQZXJzb24gIC8vICcxJyB8ICcyJ1xudHlwZSBQZXJzb24gPSBXb3JrUGVyc29uW0tleV0gICAvLyB7bmFtZTogc3RyaW5nOyBhZ2U6IG51bWJlciB9XG48L2NvZGU+PC9wcmU+XG48cD48Y29kZT58PC9jb2RlPiDnsbvlnovlhbzlrrk8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSB3aWR0aCA9ICdzdHJpbmcnIHwgJ251bWJlcic7XG5cbuWImSB3aWR0aCDlj6/ku6XmmK8gJzMycHgnIOS5n+WPr+S7peaYryAnMzInIOWcqCDmuLLmn5Pml7blhbzlrrnkuKTnp43nsbvlnotcbjwvY29kZT48L3ByZT5cbjxoMz7lh73mlbDph43ovb08L2gzPlxuPHA+5a6a5LmJ5LiN5ZCM57G75Z6L55qE6L6T5YWl77yM5o6o5Yiw5Ye65LiN5ZCM57G75Z6L55qE6L6T5Ye6PC9wPlxuPHByZSB2LXByZT1cIlwiPjxjb2RlPnR5cGUgUGVyc29uTGlzdFF1ZXJ5ID0geyB1c2VyX2lkczogc3RyaW5nW10gfTtcbnR5cGUgRG9uZ0xpc3RRdWVyeSA9IHsgZG9nX2lkczogc3RyaW5nW10gfTtcbmZ1bmN0aW9uIGdldExpc3QocmVxdWVzdDogUGVyc29uTGlzdFF1ZXJ5KTogUGVyc29uW107XG5mdW5jdGlvbiBnZXRMaXN0KHJlcXVlc3Q6IERvZ0xpc3RRdWVyeSk6IERvZ1tdO1xuXG5mdW5jdGlvbiBnZXRMaXN0KHF1ZXJ5OiBQZXJzb25MaXN0UXVlcnkgfCBEb2dMaXN0UXVlcnkpIHtcbiAgaWYgKCd1c2VyX2lkcycgaW4gcXVlcnkpIHsgIFxuICAgIHJldHVybiBbXSBhcyBQZXJzb25bXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW10gYXMgRG9nW107XG4gIH1cbn1cblxuY29uc3QgYSA9IGdldExpc3QoeyBwZXJzb25JZHM6IFtdLCByZWdpb246ICd1cyd9KVxu5q2k5pe2IGEg55qE57G75Z6L5bCG6IO95o6o5Yiw5Ye65pivIFBlcnNvbltdXG48L2NvZGU+PC9wcmU+XG48aDM+5rOb5Z6LPC9oMz5cbjxwPuexu+Wei+eahOS8oOWPguOAgiDnlKggVCDmoIfor4bvvIzlnKjlrp7pmYXov5DnlKjml7bkvaDkvKDlhaXku4DkuYjnsbvlnovvvIzor6XnsbvlnovlsLHkvZzkuLrlkI7nu63mjqjlr7zjgII8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+YXN5bmMgZnVuY3Rpb24gcmVxdWVzdCZsdDtUJmd0Oyh1cmw6IHN0cmluZyk6IFByb21pc2UmbHQ7VCZndDsge1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpXG4gIHJldHVybiByZXMuanNvbigpO1xufVxuXG5jb25zdCByZXMgPSBhd2FpdCByZXF1ZXN0Jmx0O1BlcnNvbiZndDsoJ2dldFBlcnNvbkluZm8/aWQ9MScpOyBcbuatpOaXtiB0cyDlj6/ku6Xmjqjlr7zlh7ogcmVzIOeahOexu+Wei+aYryBQZXJzb25cbjwvY29kZT48L3ByZT5cbjxoMz5JbmZlciAg57G75Z6L5Y+C5pWw5L2/55SoPC9oMz5cbjxwPumAmui/hyBJbmZlciDkuIDkuKrnsbvlnovkuLrlj5jph4/vvIzlrprkuYnlh7rojrflj5bnsbvlnovnmoTmlrnms5U8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+dHlwZSBhZGRSZXN1bHRUeXBlJmx0O1QmZ3Q7ID0gVCBleHRlbmRzIHsgYTogaW5mZXIgVSwgYjogaW5mZXIgVSB9ID8gIFUgOiBuZXZlcjtcbnR5cGUgbnVtYmVyQWRkID0gIGFkZFJlc3VsdFR5cGUmbHQ7eyBhOiAxLCBiOiAyIH0mZ3Q7ICAgICAvLyDmjqjliLDlh7rnu5PmnpznsbvlnovkuLogbnVtYmVyXG50eXBlIHRleHRBZGQgPSBhZGRSZXN1bHRUeXBlJmx0O3sgYTogJ2hlbGxvJywgYjogJ3dvcmxkJyB9Jmd0OyAgICAgLy8g5o6o5Yiw5Ye657uT5p6c57G75Z6L5Li6IHN0cmluZ1xuPC9jb2RlPjwvcHJlPlxuPGgzPuaemuS4viBlbnVtPC9oMz5cbjxwPuWPmOmHj+eahOWAvOaYr+e6puWumueahOWHoOS4quWPluWAvDwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5jb25zdCBlbnVtIFBhZ2VUeXBlIHtcbiAgSE9NRSA9ICdob21lJyxcbiAgVklERU8gPSAndmlkZW8nLFxufVxuXG5mdW5jdGlvbiBnZXRQYWdlVXJsKHBhZ2U6IFBhZ2VUeXBlKSB7XG4gIHJldHVybiB7XG4gICAgW1BhZ2VUeXBlLlZJREVPXTogXCIvdmlkZW9cIixcbiAgICBbUGFnZVR5cGUuSE9NRV06IFwiL2hvbWVcIixcbiAgfVtwYWdlXTtcbn1cbjwvY29kZT48L3ByZT5cbjxoMj50c2NvbmZpZzwvaDI+XG48cD7kuobop6PkuoYgdHMg5a+55LqO57G75Z6L55qE5a6a5LmJ5ZKM5ZCE56eN6KeE5YiZ5ZCO77yM5oiR5Lus5YiZ5Y+v5Lul5Zyo57yW5YaZIGpzIOS7o+eggeaXtuWIqeeUqOW5tui/m+ihjOexu+Wei+e6puadn+OAguS6juatpOWQjOaXtu+8jOaIkeS7rOmcgOimgeW8leWFpSB0eXBlc2NyaXB0IOW6k+WOu+iOt+W+l+i/meS6myB0cyDog73lipvjgII8L3A+XG48aDM+5aaC5L2V5byV5YWlPC9oMz5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5ucG0gaW5zdGFsbCAgdHlwZXNjcmlwdCAgXG4vLyDkuI3lv4Xlho3lpJror7RcbjwvY29kZT48L3ByZT5cbjxoMz7lkb3ku6Q8L2gzPlxuPHA+dHlwZXNjcmlwdCDljIXmmK/mnInlkb3ku6Tmlofku7bnmoTvvIzpgJrluLggdHMg55qE6L+Q6KGM5YiZ5piv6YCa6L+HIHRzYyDphY3lkIjnm7jlhbPlkb3ku6TljrvmiafooYznmoQuIOWFt+S9k+WRveS7pOWkp+WutuWPr+S7peWuieijheWMheS5i+WQjumAmui/hyB0c2MgLWgg5p+l55yLXG48aW1nIHNyYz1cImh0dHBzOi8vaS1ibG9nLmNzZG5pbWcuY24vYmxvZ19taWdyYXRlLzM0OWZmYzM2MmYwZDgzMWE3ODBkMmQ3Zjc1NDg5M2ExLnBuZ1wiIGFsdD1cIuWcqOi/memHjOaPkuWFpeWbvueJh+aPj+i/sFwiPjwvcD5cbjxoMz7phY3nva4gPGEgaHJlZj1cImh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3RzY29uZmlnLWpzb24uaHRtbFwiPuWumOe9kTwvYT48L2gzPlxuPHA+5aaC5p6c5L2g55yL5LqGIHRzYyDlkb3ku6TvvIzkvaDkvJrlj5HnjrDlroPmmK/mnInlvojlpJrlkb3ku6TnmoTvvIzlubbkuJTmnInnmoTlkb3ku6Tov5jkvLTpmo/ov5nnm7jlhbPlj4LmlbDjgILlnKjlt6XkvZzmlofku7blpLnkuK3vvIzmiJHku6zliJnpgJrov4fphY3nva7mlofku7YgPGNvZGU+dHNjb25maWcuanMgPC9jb2RlPiDljrvphY3nva7vvIzkv53or4HlnKjpobnnm67kuK3nmoTov5DnlKjjgIIg6YWN572u5Y+C5pWw6L+Z6YeM5bCx5LiN57uG6K6y5LqG77yM6L+Y5piv55yL5a6Y5pa55paH5qGj6Z2g6LCx54K544CCPC9wPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi90eXBlc2NyaXB0Lm1kP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNkZGU3MDgyXCJcbmNvbnN0IHNjcmlwdCA9IHt9XG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS92dWUtbG9hZGVyQDE3LjQuMl9AdnVlK2NvbXBpbGVyLXNmY0AzLjUuMTJfdnVlQDMuNS4xMl90eXBlc2NyaXB0QDUuNi4zX193ZWJwYWNrQDUuOTUuMF93ZWJwYWNrLWNsaUA1LjEuNF8vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdXSlcblxuZXhwb3J0IGRlZmF1bHQgX19leHBvcnRzX18iXSwibmFtZXMiOlsiY2xhc3MiLCJzY3JpcHQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2hvaXN0ZWRfMSIsIl9jYWNoZSIsIl9jcmVhdGVTdGF0aWNWTm9kZSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/674.bundle.js b/674.bundle.js new file mode 100644 index 0000000..34015f1 --- /dev/null +++ b/674.bundle.js @@ -0,0 +1,3 @@ +/*! For license information please see 674.bundle.js.LICENSE.txt */ +(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[674],{7674:function(e){e.exports=function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,n){return t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,o){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}()?Reflect.construct:function(e,n,r){var o=[null];o.push.apply(o,n);var a=new(Function.bind.apply(e,o));return r&&t(a,r.prototype),a},n.apply(null,arguments)}function r(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?n-1:0),o=1;o/gm),q=m(/\${[\w\W]*}/gm),Y=m(/^data-[\-\w.\u00B7-\uFFFF]/),$=m(/^aria-[\-\w]+$/),K=m(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),V=m(/^(?:\w+script|data):/i),X=m(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Z=m(/^html$/i),J=m(/^[a-z][.\w]*(-[.\w]+)+$/i),Q=function(){return"undefined"==typeof window?null:window};return function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Q(),o=function(e){return t(e)};if(o.version="2.5.7",o.removed=[],!n||!n.document||9!==n.document.nodeType)return o.isSupported=!1,o;var a=n.document,i=n.document,l=n.DocumentFragment,c=n.HTMLTemplateElement,u=n.Node,m=n.Element,f=n.NodeFilter,p=n.NamedNodeMap,d=void 0===p?n.NamedNodeMap||n.MozNamedAttrMap:p,h=n.HTMLFormElement,g=n.DOMParser,x=n.trustedTypes,ee=m.prototype,te=L(ee,"cloneNode"),ne=L(ee,"nextSibling"),re=L(ee,"childNodes"),oe=L(ee,"parentNode");if("function"==typeof c){var ae=i.createElement("template");ae.content&&ae.content.ownerDocument&&(i=ae.content.ownerDocument)}var ie=function(t,n){if("object"!==e(t)||"function"!=typeof t.createPolicy)return null;var r=null,o="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(o)&&(r=n.currentScript.getAttribute(o));var a="dompurify"+(r?"#"+r:"");try{return t.createPolicy(a,{createHTML:function(e){return e},createScriptURL:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+a+" could not be created."),null}}(x,a),le=ie?ie.createHTML(""):"",ce=i,ue=ce.implementation,se=ce.createNodeIterator,me=ce.createDocumentFragment,fe=ce.getElementsByTagName,pe=a.importNode,de={};try{de=C(i).documentMode?i.documentMode:{}}catch(e){}var he={};o.isSupported="function"==typeof oe&&ue&&void 0!==ue.createHTMLDocument&&9!==de;var ge,ye,be=G,Te=W,ve=q,Ne=Y,Ee=$,Ae=V,we=X,_e=J,Se=K,ke=null,xe=O({},[].concat(r(R),r(D),r(M),r(F),r(H))),Oe=null,Ce=O({},[].concat(r(z),r(P),r(B),r(j))),Le=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Re=null,De=null,Me=!0,Ie=!0,Fe=!1,Ue=!0,He=!1,ze=!0,Pe=!1,Be=!1,je=!1,Ge=!1,We=!1,qe=!1,Ye=!0,$e=!1,Ke=!0,Ve=!1,Xe={},Ze=null,Je=O({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qe=null,et=O({},["audio","video","img","source","image","track"]),tt=null,nt=O({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),rt="http://www.w3.org/1998/Math/MathML",ot="http://www.w3.org/2000/svg",at="http://www.w3.org/1999/xhtml",it=at,lt=!1,ct=null,ut=O({},[rt,ot,at],N),st=["application/xhtml+xml","text/html"],mt=null,ft=i.createElement("form"),pt=function(e){return e instanceof RegExp||e instanceof Function},dt=function(t){mt&&mt===t||(t&&"object"===e(t)||(t={}),t=C(t),ge=ge=-1===st.indexOf(t.PARSER_MEDIA_TYPE)?"text/html":t.PARSER_MEDIA_TYPE,ye="application/xhtml+xml"===ge?N:v,ke="ALLOWED_TAGS"in t?O({},t.ALLOWED_TAGS,ye):xe,Oe="ALLOWED_ATTR"in t?O({},t.ALLOWED_ATTR,ye):Ce,ct="ALLOWED_NAMESPACES"in t?O({},t.ALLOWED_NAMESPACES,N):ut,tt="ADD_URI_SAFE_ATTR"in t?O(C(nt),t.ADD_URI_SAFE_ATTR,ye):nt,Qe="ADD_DATA_URI_TAGS"in t?O(C(et),t.ADD_DATA_URI_TAGS,ye):et,Ze="FORBID_CONTENTS"in t?O({},t.FORBID_CONTENTS,ye):Je,Re="FORBID_TAGS"in t?O({},t.FORBID_TAGS,ye):{},De="FORBID_ATTR"in t?O({},t.FORBID_ATTR,ye):{},Xe="USE_PROFILES"in t&&t.USE_PROFILES,Me=!1!==t.ALLOW_ARIA_ATTR,Ie=!1!==t.ALLOW_DATA_ATTR,Fe=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Ue=!1!==t.ALLOW_SELF_CLOSE_IN_ATTR,He=t.SAFE_FOR_TEMPLATES||!1,ze=!1!==t.SAFE_FOR_XML,Pe=t.WHOLE_DOCUMENT||!1,Ge=t.RETURN_DOM||!1,We=t.RETURN_DOM_FRAGMENT||!1,qe=t.RETURN_TRUSTED_TYPE||!1,je=t.FORCE_BODY||!1,Ye=!1!==t.SANITIZE_DOM,$e=t.SANITIZE_NAMED_PROPS||!1,Ke=!1!==t.KEEP_CONTENT,Ve=t.IN_PLACE||!1,Se=t.ALLOWED_URI_REGEXP||Se,it=t.NAMESPACE||at,Le=t.CUSTOM_ELEMENT_HANDLING||{},t.CUSTOM_ELEMENT_HANDLING&&pt(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Le.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&&pt(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Le.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Le.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),He&&(Ie=!1),We&&(Ge=!0),Xe&&(ke=O({},r(H)),Oe=[],!0===Xe.html&&(O(ke,R),O(Oe,z)),!0===Xe.svg&&(O(ke,D),O(Oe,P),O(Oe,j)),!0===Xe.svgFilters&&(O(ke,M),O(Oe,P),O(Oe,j)),!0===Xe.mathMl&&(O(ke,F),O(Oe,B),O(Oe,j))),t.ADD_TAGS&&(ke===xe&&(ke=C(ke)),O(ke,t.ADD_TAGS,ye)),t.ADD_ATTR&&(Oe===Ce&&(Oe=C(Oe)),O(Oe,t.ADD_ATTR,ye)),t.ADD_URI_SAFE_ATTR&&O(tt,t.ADD_URI_SAFE_ATTR,ye),t.FORBID_CONTENTS&&(Ze===Je&&(Ze=C(Ze)),O(Ze,t.FORBID_CONTENTS,ye)),Ke&&(ke["#text"]=!0),Pe&&O(ke,["html","head","body"]),ke.table&&(O(ke,["tbody"]),delete Re.tbody),s&&s(t),mt=t)},ht=O({},["mi","mo","mn","ms","mtext"]),gt=O({},["annotation-xml"]),yt=O({},["title","style","font","a","script"]),bt=O({},D);O(bt,M),O(bt,I);var Tt=O({},F);O(Tt,U);var vt=function(e){T(o.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=le}catch(t){e.remove()}}},Nt=function(e,t){try{T(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){T(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Oe[e])if(Ge||We)try{vt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Et=function(e){var t,n;if(je)e=""+e;else{var r=E(e,/^[\r\n\t ]+/);n=r&&r[0]}"application/xhtml+xml"===ge&&it===at&&(e=''+e+"");var o=ie?ie.createHTML(e):e;if(it===at)try{t=(new g).parseFromString(o,ge)}catch(e){}if(!t||!t.documentElement){t=ue.createDocument(it,"template",null);try{t.documentElement.innerHTML=lt?le:o}catch(e){}}var a=t.body||t.documentElement;return e&&n&&a.insertBefore(i.createTextNode(n),a.childNodes[0]||null),it===at?fe.call(t,Pe?"html":"body")[0]:Pe?t.documentElement:a},At=function(e){return se.call(e.ownerDocument||e,e,f.SHOW_ELEMENT|f.SHOW_COMMENT|f.SHOW_TEXT|f.SHOW_PROCESSING_INSTRUCTION|f.SHOW_CDATA_SECTION,null,!1)},wt=function(e){return e instanceof h&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof d)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},_t=function(t){return"object"===e(u)?t instanceof u:t&&"object"===e(t)&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName},St=function(e,t,n){he[e]&&y(he[e],(function(e){e.call(o,t,n,mt)}))},kt=function(e){var t;if(St("beforeSanitizeElements",e,null),wt(e))return vt(e),!0;if(S(/[\u0080-\uFFFF]/,e.nodeName))return vt(e),!0;var n=ye(e.nodeName);if(St("uponSanitizeElement",e,{tagName:n,allowedTags:ke}),e.hasChildNodes()&&!_t(e.firstElementChild)&&(!_t(e.content)||!_t(e.content.firstElementChild))&&S(/<[/\w]/g,e.innerHTML)&&S(/<[/\w]/g,e.textContent))return vt(e),!0;if("select"===n&&S(/