= 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(/=0;--i){var l=te(a[i],!0);l.__removalCount=(e.__removalCount||0)+1,r.insertBefore(l,ne(e))}}return vt(e),!0}return e instanceof m&&!function(e){var t=oe(e);t&&t.tagName||(t={namespaceURI:it,tagName:"template"});var n=v(e.tagName),r=v(t.tagName);return!!ct[e.namespaceURI]&&(e.namespaceURI===ot?t.namespaceURI===at?"svg"===n:t.namespaceURI===rt?"svg"===n&&("annotation-xml"===r||ht[r]):Boolean(bt[n]):e.namespaceURI===rt?t.namespaceURI===at?"math"===n:t.namespaceURI===ot?"math"===n&>[r]:Boolean(Tt[n]):e.namespaceURI===at?!(t.namespaceURI===ot&&!gt[r])&&!(t.namespaceURI===rt&&!ht[r])&&!Tt[n]&&(yt[n]||!bt[n]):!("application/xhtml+xml"!==ge||!ct[e.namespaceURI]))}(e)?(vt(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!S(/<\/no(script|embed|frames)/i,e.innerHTML)?(He&&3===e.nodeType&&(t=e.textContent,t=A(t,be," "),t=A(t,Te," "),t=A(t,ve," "),e.textContent!==t&&(T(o.removed,{element:e.cloneNode()}),e.textContent=t)),St("afterSanitizeElements",e,null),!1):(vt(e),!0)},xt=function(e,t,n){if(Ye&&("id"===t||"name"===t)&&(n in i||n in ft))return!1;if(Ie&&!De[t]&&S(Ne,t));else if(Me&&S(Ee,t));else if(!Oe[t]||De[t]){if(!(Ot(e)&&(Le.tagNameCheck instanceof RegExp&&S(Le.tagNameCheck,e)||Le.tagNameCheck instanceof Function&&Le.tagNameCheck(e))&&(Le.attributeNameCheck instanceof RegExp&&S(Le.attributeNameCheck,t)||Le.attributeNameCheck instanceof Function&&Le.attributeNameCheck(t))||"is"===t&&Le.allowCustomizedBuiltInElements&&(Le.tagNameCheck instanceof RegExp&&S(Le.tagNameCheck,n)||Le.tagNameCheck instanceof Function&&Le.tagNameCheck(n))))return!1}else if(tt[t]);else if(S(Se,A(n,we,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==w(n,"data:")||!Qe[e])if(Fe&&!S(Ae,A(n,we,"")));else if(n)return!1;return!0},Ot=function(e){return"annotation-xml"!==e&&E(e,_e)},Ct=function(t){var n,r,a,i;St("beforeSanitizeAttributes",t,null);var l=t.attributes;if(l){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Oe};for(i=l.length;i--;){var u=n=l[i],s=u.name,m=u.namespaceURI;if(r="value"===s?n.value:_(n.value),a=ye(s),c.attrName=a,c.attrValue=r,c.keepAttr=!0,c.forceKeepAttr=void 0,St("uponSanitizeAttribute",t,c),r=c.attrValue,!c.forceKeepAttr&&(Nt(s,t),c.keepAttr))if(Ue||!S(/\/>/i,r)){He&&(r=A(r,be," "),r=A(r,Te," "),r=A(r,ve," "));var f=ye(t.nodeName);if(xt(f,a,r))if(!$e||"id"!==a&&"name"!==a||(Nt(s,t),r="user-content-"+r),ze&&S(/((--!?|])>)|<\/(style|title)/i,r))Nt(s,t);else{if(ie&&"object"===e(x)&&"function"==typeof x.getAttributeType)if(m);else switch(x.getAttributeType(f,a)){case"TrustedHTML":r=ie.createHTML(r);break;case"TrustedScriptURL":r=ie.createScriptURL(r)}try{m?t.setAttributeNS(m,s,r):t.setAttribute(s,r),wt(t)?vt(t):b(o.removed)}catch(e){}}}else Nt(s,t)}St("afterSanitizeAttributes",t,null)}},Lt=function e(t){var n,r=At(t);for(St("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)St("uponSanitizeShadowNode",n,null),kt(n)||(n.content instanceof l&&e(n.content),Ct(n));St("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(t){var r,i,c,s,m,f=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((lt=!t)&&(t="\x3c!--\x3e"),"string"!=typeof t&&!_t(t)){if("function"!=typeof t.toString)throw k("toString is not a function");if("string"!=typeof(t=t.toString()))throw k("dirty is not a string, aborting")}if(!o.isSupported){if("object"===e(n.toStaticHTML)||"function"==typeof n.toStaticHTML){if("string"==typeof t)return n.toStaticHTML(t);if(_t(t))return n.toStaticHTML(t.outerHTML)}return t}if(Be||dt(f),o.removed=[],"string"==typeof t&&(Ve=!1),Ve){if(t.nodeName){var p=ye(t.nodeName);if(!ke[p]||Re[p])throw k("root node is forbidden and cannot be sanitized in-place")}}else if(t instanceof u)1===(i=(r=Et("\x3c!----\x3e")).ownerDocument.importNode(t,!0)).nodeType&&"BODY"===i.nodeName||"HTML"===i.nodeName?r=i:r.appendChild(i);else{if(!Ge&&!He&&!Pe&&-1===t.indexOf("<"))return ie&&qe?ie.createHTML(t):t;if(!(r=Et(t)))return Ge?null:qe?le:""}r&&je&&vt(r.firstChild);for(var d=At(Ve?t:r);c=d.nextNode();)3===c.nodeType&&c===s||kt(c)||(c.content instanceof l&&Lt(c.content),Ct(c),s=c);if(s=null,Ve)return t;if(Ge){if(We)for(m=me.call(r.ownerDocument);r.firstChild;)m.appendChild(r.firstChild);else m=r;return(Oe.shadowroot||Oe.shadowrootmod)&&(m=pe.call(a,m,!0)),m}var h=Pe?r.outerHTML:r.innerHTML;return Pe&&ke["!doctype"]&&r.ownerDocument&&r.ownerDocument.doctype&&r.ownerDocument.doctype.name&&S(Z,r.ownerDocument.doctype.name)&&(h="\n"+h),He&&(h=A(h,be," "),h=A(h,Te," "),h=A(h,ve," ")),ie&&qe?ie.createHTML(h):h},o.setConfig=function(e){dt(e),Be=!0},o.clearConfig=function(){mt=null,Be=!1},o.isValidAttribute=function(e,t,n){mt||dt({});var r=ye(e),o=ye(t);return xt(r,o,n)},o.addHook=function(e,t){"function"==typeof t&&(he[e]=he[e]||[],T(he[e],t))},o.removeHook=function(e){if(he[e])return b(he[e])},o.removeHooks=function(e){he[e]&&(he[e]=[])},o.removeAllHooks=function(){he={}},o}()}()}}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3JHLEVBUUEvTSxFQUFVaU4sVUFBWSxTQUFVbEcsR0FDOUJELEdBQWFDLEdBQ2I3QixJQUFhLENBQ2YsRUFPQWxGLEVBQVVrTixZQUFjLFdBQ3RCeEcsR0FBUyxLQUNUeEIsSUFBYSxDQUNmLEVBWUFsRixFQUFVbU4saUJBQW1CLFNBQVVDLEVBQUs5QixFQUFNbE4sR0FFM0NzSSxJQUNISSxHQUFhLENBQUMsR0FFaEIsSUFBSXFFLEVBQVE1TixHQUFrQjZQLEdBQzFCaEMsRUFBUzdOLEdBQWtCK04sR0FDL0IsT0FBT0osR0FBa0JDLEVBQU9DLEVBQVFoTixFQUMxQyxFQVNBNEIsRUFBVXFOLFFBQVUsU0FBVWpELEVBQVlrRCxHQUNaLG1CQUFqQkEsSUFHWHJLLEdBQU1tSCxHQUFjbkgsR0FBTW1ILElBQWUsR0FDekNyTyxFQUFVa0gsR0FBTW1ILEdBQWFrRCxHQUMvQixFQVVBdE4sRUFBVXVOLFdBQWEsU0FBVW5ELEdBQy9CLEdBQUluSCxHQUFNbUgsR0FDUixPQUFPdk8sRUFBU29ILEdBQU1tSCxHQUUxQixFQVFBcEssRUFBVXdOLFlBQWMsU0FBVXBELEdBQzVCbkgsR0FBTW1ILEtBQ1JuSCxHQUFNbUgsR0FBYyxHQUV4QixFQU9BcEssRUFBVXlOLGVBQWlCLFdBQ3pCeEssR0FBUSxDQUFDLENBQ1gsRUFDT2pELENBQ1QsQ0FDYUYsRUFJZCxDQW5nRGlGNE4iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RvbXB1cmlmeUAyLjUuNy9ub2RlX21vZHVsZXMvZG9tcHVyaWZ5L2Rpc3QvcHVyaWZ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBAbGljZW5zZSBET01QdXJpZnkgMi41LjcgfCAoYykgQ3VyZTUzIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBSZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIGxpY2Vuc2UgMi4wIGFuZCBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDIuMCB8IGdpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9ibG9iLzIuNS43L0xJQ0VOU0UgKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuRE9NUHVyaWZ5ID0gZmFjdG9yeSgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICAgIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfSwgX3R5cGVvZihvYmopO1xuICB9XG4gIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgICByZXR1cm4gbztcbiAgICB9O1xuICAgIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG4gIH1cbiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgIGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbiAgfVxuICBmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7XG4gIH1cbiAgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG4gIH1cbiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICAgIGlmICghbykgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICAgIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gICAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB9XG4gIGZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuICAgIHJldHVybiBhcnIyO1xuICB9XG4gIGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eSxcbiAgICBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZixcbiAgICBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbixcbiAgICBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICB2YXIgZnJlZXplID0gT2JqZWN0LmZyZWV6ZSxcbiAgICBzZWFsID0gT2JqZWN0LnNlYWwsXG4gICAgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG4gIHZhciBfcmVmID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QsXG4gICAgYXBwbHkgPSBfcmVmLmFwcGx5LFxuICAgIGNvbnN0cnVjdCA9IF9yZWYuY29uc3RydWN0O1xuICBpZiAoIWFwcGx5KSB7XG4gICAgYXBwbHkgPSBmdW5jdGlvbiBhcHBseShmdW4sIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgIH07XG4gIH1cbiAgaWYgKCFmcmVlemUpIHtcbiAgICBmcmVlemUgPSBmdW5jdGlvbiBmcmVlemUoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuICBpZiAoIXNlYWwpIHtcbiAgICBzZWFsID0gZnVuY3Rpb24gc2VhbCh4KSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9O1xuICB9XG4gIGlmICghY29uc3RydWN0KSB7XG4gICAgY29uc3RydWN0ID0gZnVuY3Rpb24gY29uc3RydWN0KEZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KEZ1bmMsIF90b0NvbnN1bWFibGVBcnJheShhcmdzKSk7XG4gICAgfTtcbiAgfVxuICB2YXIgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG4gIHZhciBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG4gIHZhciBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAgdmFyIHN0cmluZ1RvTG93ZXJDYXNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlKTtcbiAgdmFyIHN0cmluZ1RvU3RyaW5nID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nKTtcbiAgdmFyIHN0cmluZ01hdGNoID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLm1hdGNoKTtcbiAgdmFyIHN0cmluZ1JlcGxhY2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG4gIHZhciBzdHJpbmdJbmRleE9mID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpO1xuICB2YXIgc3RyaW5nVHJpbSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcbiAgdmFyIHJlZ0V4cFRlc3QgPSB1bmFwcGx5KFJlZ0V4cC5wcm90b3R5cGUudGVzdCk7XG4gIHZhciB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuICBmdW5jdGlvbiB1bmFwcGx5KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRoaXNBcmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncyk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB1bmNvbnN0cnVjdChmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uc3RydWN0KGZ1bmMsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICAvKiBBZGQgcHJvcGVydGllcyB0byBhIGxvb2t1cCB0YWJsZSAqL1xuICBmdW5jdGlvbiBhZGRUb1NldChzZXQsIGFycmF5LCB0cmFuc2Zvcm1DYXNlRnVuYykge1xuICAgIHZhciBfdHJhbnNmb3JtQ2FzZUZ1bmM7XG4gICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPSAoX3RyYW5zZm9ybUNhc2VGdW5jID0gdHJhbnNmb3JtQ2FzZUZ1bmMpICE9PSBudWxsICYmIF90cmFuc2Zvcm1DYXNlRnVuYyAhPT0gdm9pZCAwID8gX3RyYW5zZm9ybUNhc2VGdW5jIDogc3RyaW5nVG9Mb3dlckNhc2U7XG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAgIC8vIGluZGVwZW5kZW50IG9mIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAgIC8vIFByZXZlbnQgcHJvdG90eXBlIHNldHRlcnMgZnJvbSBpbnRlcmNlcHRpbmcgc2V0IGFzIGEgdGhpcyB2YWx1ZS5cbiAgICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gICAgfVxuICAgIHZhciBsID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgIHZhciBlbGVtZW50ID0gYXJyYXlbbF07XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBsY0VsZW1lbnQgPSB0cmFuc2Zvcm1DYXNlRnVuYyhlbGVtZW50KTtcbiAgICAgICAgaWYgKGxjRWxlbWVudCAhPT0gZWxlbWVudCkge1xuICAgICAgICAgIC8vIENvbmZpZyBwcmVzZXRzIChlLmcuIHRhZ3MuanMsIGF0dHJzLmpzKSBhcmUgaW1tdXRhYmxlLlxuICAgICAgICAgIGlmICghaXNGcm96ZW4oYXJyYXkpKSB7XG4gICAgICAgICAgICBhcnJheVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudCA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0W2VsZW1lbnRdID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIC8qIFNoYWxsb3cgY2xvbmUgYW4gb2JqZWN0ICovXG4gIGZ1bmN0aW9uIGNsb25lKG9iamVjdCkge1xuICAgIHZhciBuZXdPYmplY3QgPSBjcmVhdGUobnVsbCk7XG4gICAgdmFyIHByb3BlcnR5O1xuICAgIGZvciAocHJvcGVydHkgaW4gb2JqZWN0KSB7XG4gICAgICBpZiAoYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW3Byb3BlcnR5XSkgPT09IHRydWUpIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvKiBJRTEwIGRvZXNuJ3Qgc3VwcG9ydCBfX2xvb2t1cEdldHRlcl9fIHNvIGxldHMnXG4gICAqIHNpbXVsYXRlIGl0LiBJdCBhbHNvIGF1dG9tYXRpY2FsbHkgY2hlY2tzXG4gICAqIGlmIHRoZSBwcm9wIGlzIGZ1bmN0aW9uIG9yIGdldHRlciBhbmQgYmVoYXZlc1xuICAgKiBhY2NvcmRpbmdseS4gKi9cbiAgZnVuY3Rpb24gbG9va3VwR2V0dGVyKG9iamVjdCwgcHJvcCkge1xuICAgIHdoaWxlIChvYmplY3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcCk7XG4gICAgICBpZiAoZGVzYykge1xuICAgICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKCdmYWxsYmFjayB2YWx1ZSBmb3InLCBlbGVtZW50KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxuXG4gIHZhciBodG1sJDEgPSBmcmVlemUoWydhJywgJ2FiYnInLCAnYWNyb255bScsICdhZGRyZXNzJywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdhdWRpbycsICdiJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2JsaW5rJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NpdGUnLCAnY29kZScsICdjb2wnLCAnY29sZ3JvdXAnLCAnY29udGVudCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlY29yYXRvcicsICdkZWwnLCAnZGV0YWlscycsICdkZm4nLCAnZGlhbG9nJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZWxlbWVudCcsICdlbScsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb250JywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaW1nJywgJ2lucHV0JywgJ2lucycsICdrYmQnLCAnbGFiZWwnLCAnbGVnZW5kJywgJ2xpJywgJ21haW4nLCAnbWFwJywgJ21hcmsnLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGVyJywgJ25hdicsICdub2JyJywgJ29sJywgJ29wdGdyb3VwJywgJ29wdGlvbicsICdvdXRwdXQnLCAncCcsICdwaWN0dXJlJywgJ3ByZScsICdwcm9ncmVzcycsICdxJywgJ3JwJywgJ3J0JywgJ3J1YnknLCAncycsICdzYW1wJywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NoYWRvdycsICdzbWFsbCcsICdzb3VyY2UnLCAnc3BhY2VyJywgJ3NwYW4nLCAnc3RyaWtlJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0cicsICd0cmFjaycsICd0dCcsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInXSk7XG5cbiAgLy8gU1ZHXG4gIHZhciBzdmckMSA9IGZyZWV6ZShbJ3N2ZycsICdhJywgJ2FsdGdseXBoJywgJ2FsdGdseXBoZGVmJywgJ2FsdGdseXBoaXRlbScsICdhbmltYXRlY29sb3InLCAnYW5pbWF0ZW1vdGlvbicsICdhbmltYXRldHJhbnNmb3JtJywgJ2NpcmNsZScsICdjbGlwcGF0aCcsICdkZWZzJywgJ2Rlc2MnLCAnZWxsaXBzZScsICdmaWx0ZXInLCAnZm9udCcsICdnJywgJ2dseXBoJywgJ2dseXBocmVmJywgJ2hrZXJuJywgJ2ltYWdlJywgJ2xpbmUnLCAnbGluZWFyZ3JhZGllbnQnLCAnbWFya2VyJywgJ21hc2snLCAnbWV0YWRhdGEnLCAnbXBhdGgnLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsZ3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3N0eWxlJywgJ3N3aXRjaCcsICdzeW1ib2wnLCAndGV4dCcsICd0ZXh0cGF0aCcsICd0aXRsZScsICd0cmVmJywgJ3RzcGFuJywgJ3ZpZXcnLCAndmtlcm4nXSk7XG4gIHZhciBzdmdGaWx0ZXJzID0gZnJlZXplKFsnZmVCbGVuZCcsICdmZUNvbG9yTWF0cml4JywgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLCAnZmVDb21wb3NpdGUnLCAnZmVDb252b2x2ZU1hdHJpeCcsICdmZURpZmZ1c2VMaWdodGluZycsICdmZURpc3BsYWNlbWVudE1hcCcsICdmZURpc3RhbnRMaWdodCcsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVJbWFnZScsICdmZU1lcmdlJywgJ2ZlTWVyZ2VOb2RlJywgJ2ZlTW9ycGhvbG9neScsICdmZU9mZnNldCcsICdmZVBvaW50TGlnaHQnLCAnZmVTcGVjdWxhckxpZ2h0aW5nJywgJ2ZlU3BvdExpZ2h0JywgJ2ZlVGlsZScsICdmZVR1cmJ1bGVuY2UnXSk7XG5cbiAgLy8gTGlzdCBvZiBTVkcgZWxlbWVudHMgdGhhdCBhcmUgZGlzYWxsb3dlZCBieSBkZWZhdWx0LlxuICAvLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2VcbiAgLy8gY2hlY2tzIHByb3Blcmx5IGluIGNhc2Ugb25lIHdhbnRzIHRvIGFkZCB0aGVtIHRvXG4gIC8vIGFsbG93LWxpc3QuXG4gIHZhciBzdmdEaXNhbGxvd2VkID0gZnJlZXplKFsnYW5pbWF0ZScsICdjb2xvci1wcm9maWxlJywgJ2N1cnNvcicsICdkaXNjYXJkJywgJ2ZlZHJvcHNoYWRvdycsICdmb250LWZhY2UnLCAnZm9udC1mYWNlLWZvcm1hdCcsICdmb250LWZhY2UtbmFtZScsICdmb250LWZhY2Utc3JjJywgJ2ZvbnQtZmFjZS11cmknLCAnZm9yZWlnbm9iamVjdCcsICdoYXRjaCcsICdoYXRjaHBhdGgnLCAnbWVzaCcsICdtZXNoZ3JhZGllbnQnLCAnbWVzaHBhdGNoJywgJ21lc2hyb3cnLCAnbWlzc2luZy1nbHlwaCcsICdzY3JpcHQnLCAnc2V0JywgJ3NvbGlkY29sb3InLCAndW5rbm93bicsICd1c2UnXSk7XG4gIHZhciBtYXRoTWwkMSA9IGZyZWV6ZShbJ21hdGgnLCAnbWVuY2xvc2UnLCAnbWVycm9yJywgJ21mZW5jZWQnLCAnbWZyYWMnLCAnbWdseXBoJywgJ21pJywgJ21sYWJlbGVkdHInLCAnbW11bHRpc2NyaXB0cycsICdtbicsICdtbycsICdtb3ZlcicsICdtcGFkZGVkJywgJ21waGFudG9tJywgJ21yb290JywgJ21yb3cnLCAnbXMnLCAnbXNwYWNlJywgJ21zcXJ0JywgJ21zdHlsZScsICdtc3ViJywgJ21zdXAnLCAnbXN1YnN1cCcsICdtdGFibGUnLCAnbXRkJywgJ210ZXh0JywgJ210cicsICdtdW5kZXInLCAnbXVuZGVyb3ZlciddKTtcblxuICAvLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbiAgLy8gZXZlbiB0aG9zZSB0aGF0IHdlIGRpc2FsbG93IGJ5IGRlZmF1bHQuXG4gIHZhciBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFsnbWFjdGlvbicsICdtYWxpZ25ncm91cCcsICdtYWxpZ25tYXJrJywgJ21sb25nZGl2JywgJ21zY2FycmllcycsICdtc2NhcnJ5JywgJ21zZ3JvdXAnLCAnbXN0YWNrJywgJ21zbGluZScsICdtc3JvdycsICdzZW1hbnRpY3MnLCAnYW5ub3RhdGlvbicsICdhbm5vdGF0aW9uLXhtbCcsICdtcHJlc2NyaXB0cycsICdub25lJ10pO1xuICB2YXIgdGV4dCA9IGZyZWV6ZShbJyN0ZXh0J10pO1xuXG4gIHZhciBodG1sID0gZnJlZXplKFsnYWNjZXB0JywgJ2FjdGlvbicsICdhbGlnbicsICdhbHQnLCAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9waWN0dXJlaW5waWN0dXJlJywgJ2F1dG9wbGF5JywgJ2JhY2tncm91bmQnLCAnYmdjb2xvcicsICdib3JkZXInLCAnY2FwdHVyZScsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjaGVja2VkJywgJ2NpdGUnLCAnY2xhc3MnLCAnY2xlYXInLCAnY29sb3InLCAnY29scycsICdjb2xzcGFuJywgJ2NvbnRyb2xzJywgJ2NvbnRyb2xzbGlzdCcsICdjb29yZHMnLCAnY3Jvc3NvcmlnaW4nLCAnZGF0ZXRpbWUnLCAnZGVjb2RpbmcnLCAnZGVmYXVsdCcsICdkaXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLCAnZGlzYWJsZXJlbW90ZXBsYXliYWNrJywgJ2Rvd25sb2FkJywgJ2RyYWdnYWJsZScsICdlbmN0eXBlJywgJ2VudGVya2V5aGludCcsICdmYWNlJywgJ2ZvcicsICdoZWFkZXJzJywgJ2hlaWdodCcsICdoaWRkZW4nLCAnaGlnaCcsICdocmVmJywgJ2hyZWZsYW5nJywgJ2lkJywgJ2lucHV0bW9kZScsICdpbnRlZ3JpdHknLCAnaXNtYXAnLCAna2luZCcsICdsYWJlbCcsICdsYW5nJywgJ2xpc3QnLCAnbG9hZGluZycsICdsb29wJywgJ2xvdycsICdtYXgnLCAnbWF4bGVuZ3RoJywgJ21lZGlhJywgJ21ldGhvZCcsICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ211dGVkJywgJ25hbWUnLCAnbm9uY2UnLCAnbm9zaGFkZScsICdub3ZhbGlkYXRlJywgJ25vd3JhcCcsICdvcGVuJywgJ29wdGltdW0nLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdwbGF5c2lubGluZScsICdwb3N0ZXInLCAncHJlbG9hZCcsICdwdWJkYXRlJywgJ3JhZGlvZ3JvdXAnLCAncmVhZG9ubHknLCAncmVsJywgJ3JlcXVpcmVkJywgJ3JldicsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzcGVsbGNoZWNrJywgJ3Njb3BlJywgJ3NlbGVjdGVkJywgJ3NoYXBlJywgJ3NpemUnLCAnc2l6ZXMnLCAnc3BhbicsICdzcmNsYW5nJywgJ3N0YXJ0JywgJ3NyYycsICdzcmNzZXQnLCAnc3RlcCcsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmluZGV4JywgJ3RpdGxlJywgJ3RyYW5zbGF0ZScsICd0eXBlJywgJ3VzZW1hcCcsICd2YWxpZ24nLCAndmFsdWUnLCAnd2lkdGgnLCAneG1sbnMnLCAnc2xvdCddKTtcbiAgdmFyIHN2ZyA9IGZyZWV6ZShbJ2FjY2VudC1oZWlnaHQnLCAnYWNjdW11bGF0ZScsICdhZGRpdGl2ZScsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXNjZW50JywgJ2F0dHJpYnV0ZW5hbWUnLCAnYXR0cmlidXRldHlwZScsICdhemltdXRoJywgJ2Jhc2VmcmVxdWVuY3knLCAnYmFzZWxpbmUtc2hpZnQnLCAnYmVnaW4nLCAnYmlhcycsICdieScsICdjbGFzcycsICdjbGlwJywgJ2NsaXBwYXRodW5pdHMnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvcicsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdjeCcsICdjeScsICdkJywgJ2R4JywgJ2R5JywgJ2RpZmZ1c2Vjb25zdGFudCcsICdkaXJlY3Rpb24nLCAnZGlzcGxheScsICdkaXZpc29yJywgJ2R1cicsICdlZGdlbW9kZScsICdlbGV2YXRpb24nLCAnZW5kJywgJ2ZpbGwnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmaWx0ZXInLCAnZmlsdGVydW5pdHMnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZngnLCAnZnknLCAnZzEnLCAnZzInLCAnZ2x5cGgtbmFtZScsICdnbHlwaHJlZicsICdncmFkaWVudHVuaXRzJywgJ2dyYWRpZW50dHJhbnNmb3JtJywgJ2hlaWdodCcsICdocmVmJywgJ2lkJywgJ2ltYWdlLXJlbmRlcmluZycsICdpbicsICdpbjInLCAnaycsICdrMScsICdrMicsICdrMycsICdrNCcsICdrZXJuaW5nJywgJ2tleXBvaW50cycsICdrZXlzcGxpbmVzJywgJ2tleXRpbWVzJywgJ2xhbmcnLCAnbGVuZ3RoYWRqdXN0JywgJ2xldHRlci1zcGFjaW5nJywgJ2tlcm5lbG1hdHJpeCcsICdrZXJuZWx1bml0bGVuZ3RoJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ2xvY2FsJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnbWFya2VyaGVpZ2h0JywgJ21hcmtlcnVuaXRzJywgJ21hcmtlcndpZHRoJywgJ21hc2tjb250ZW50dW5pdHMnLCAnbWFza3VuaXRzJywgJ21heCcsICdtYXNrJywgJ21lZGlhJywgJ21ldGhvZCcsICdtb2RlJywgJ21pbicsICduYW1lJywgJ251bW9jdGF2ZXMnLCAnb2Zmc2V0JywgJ29wZXJhdG9yJywgJ29wYWNpdHknLCAnb3JkZXInLCAnb3JpZW50JywgJ29yaWVudGF0aW9uJywgJ29yaWdpbicsICdvdmVyZmxvdycsICdwYWludC1vcmRlcicsICdwYXRoJywgJ3BhdGhsZW5ndGgnLCAncGF0dGVybmNvbnRlbnR1bml0cycsICdwYXR0ZXJudHJhbnNmb3JtJywgJ3BhdHRlcm51bml0cycsICdwb2ludHMnLCAncHJlc2VydmVhbHBoYScsICdwcmVzZXJ2ZWFzcGVjdHJhdGlvJywgJ3ByaW1pdGl2ZXVuaXRzJywgJ3InLCAncngnLCAncnknLCAncmFkaXVzJywgJ3JlZngnLCAncmVmeScsICdyZXBlYXRjb3VudCcsICdyZXBlYXRkdXInLCAncmVzdGFydCcsICdyZXN1bHQnLCAncm90YXRlJywgJ3NjYWxlJywgJ3NlZWQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3NwZWN1bGFyY29uc3RhbnQnLCAnc3BlY3VsYXJleHBvbmVudCcsICdzcHJlYWRtZXRob2QnLCAnc3RhcnRvZmZzZXQnLCAnc3RkZGV2aWF0aW9uJywgJ3N0aXRjaHRpbGVzJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZScsICdzdHJva2Utd2lkdGgnLCAnc3R5bGUnLCAnc3VyZmFjZXNjYWxlJywgJ3N5c3RlbWxhbmd1YWdlJywgJ3RhYmluZGV4JywgJ3RhcmdldHgnLCAndGFyZ2V0eScsICd0cmFuc2Zvcm0nLCAndHJhbnNmb3JtLW9yaWdpbicsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dGxlbmd0aCcsICd0eXBlJywgJ3UxJywgJ3UyJywgJ3VuaWNvZGUnLCAndmFsdWVzJywgJ3ZpZXdib3gnLCAndmlzaWJpbGl0eScsICd2ZXJzaW9uJywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dpZHRoJywgJ3dvcmQtc3BhY2luZycsICd3cmFwJywgJ3dyaXRpbmctbW9kZScsICd4Y2hhbm5lbHNlbGVjdG9yJywgJ3ljaGFubmVsc2VsZWN0b3InLCAneCcsICd4MScsICd4MicsICd4bWxucycsICd5JywgJ3kxJywgJ3kyJywgJ3onLCAnem9vbWFuZHBhbiddKTtcbiAgdmFyIG1hdGhNbCA9IGZyZWV6ZShbJ2FjY2VudCcsICdhY2NlbnR1bmRlcicsICdhbGlnbicsICdiZXZlbGxlZCcsICdjbG9zZScsICdjb2x1bW5zYWxpZ24nLCAnY29sdW1ubGluZXMnLCAnY29sdW1uc3BhbicsICdkZW5vbWFsaWduJywgJ2RlcHRoJywgJ2RpcicsICdkaXNwbGF5JywgJ2Rpc3BsYXlzdHlsZScsICdlbmNvZGluZycsICdmZW5jZScsICdmcmFtZScsICdoZWlnaHQnLCAnaHJlZicsICdpZCcsICdsYXJnZW9wJywgJ2xlbmd0aCcsICdsaW5ldGhpY2tuZXNzJywgJ2xzcGFjZScsICdscXVvdGUnLCAnbWF0aGJhY2tncm91bmQnLCAnbWF0aGNvbG9yJywgJ21hdGhzaXplJywgJ21hdGh2YXJpYW50JywgJ21heHNpemUnLCAnbWluc2l6ZScsICdtb3ZhYmxlbGltaXRzJywgJ25vdGF0aW9uJywgJ251bWFsaWduJywgJ29wZW4nLCAncm93YWxpZ24nLCAncm93bGluZXMnLCAncm93c3BhY2luZycsICdyb3dzcGFuJywgJ3JzcGFjZScsICdycXVvdGUnLCAnc2NyaXB0bGV2ZWwnLCAnc2NyaXB0bWluc2l6ZScsICdzY3JpcHRzaXplbXVsdGlwbGllcicsICdzZWxlY3Rpb24nLCAnc2VwYXJhdG9yJywgJ3NlcGFyYXRvcnMnLCAnc3RyZXRjaHknLCAnc3Vic2NyaXB0c2hpZnQnLCAnc3Vwc2NyaXB0c2hpZnQnLCAnc3ltbWV0cmljJywgJ3ZvZmZzZXQnLCAnd2lkdGgnLCAneG1sbnMnXSk7XG4gIHZhciB4bWwgPSBmcmVlemUoWyd4bGluazpocmVmJywgJ3htbDppZCcsICd4bGluazp0aXRsZScsICd4bWw6c3BhY2UnLCAneG1sbnM6eGxpbmsnXSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG4gIHZhciBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcd1xcV10qfFtcXHdcXFddKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuICB2YXIgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHdcXFddKnxbXFx3XFxXXSolPi9nbSk7XG4gIHZhciBUTVBMSVRfRVhQUiA9IHNlYWwoL1xcJHtbXFx3XFxXXSp9L2dtKTtcbiAgdmFyIERBVEFfQVRUUiA9IHNlYWwoL15kYXRhLVtcXC1cXHcuXFx1MDBCNy1cXHVGRkZGXS8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHZhciBBUklBX0FUVFIgPSBzZWFsKC9eYXJpYS1bXFwtXFx3XSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgdmFyIElTX0FMTE9XRURfVVJJID0gc2VhbCgvXig/Oig/Oig/OmZ8aHQpdHBzP3xtYWlsdG98dGVsfGNhbGx0b3xjaWR8eG1wcCk6fFteYS16XXxbYS16Ky5cXC1dKyg/OlteYS16Ky5cXC06XXwkKSkvaSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICk7XG4gIHZhciBJU19TQ1JJUFRfT1JfREFUQSA9IHNlYWwoL14oPzpcXHcrc2NyaXB0fGRhdGEpOi9pKTtcbiAgdmFyIEFUVFJfV0hJVEVTUEFDRSA9IHNlYWwoL1tcXHUwMDAwLVxcdTAwMjBcXHUwMEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwLVxcdTIwMjlcXHUyMDVGXFx1MzAwMF0vZyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgKTtcbiAgdmFyIERPQ1RZUEVfTkFNRSA9IHNlYWwoL15odG1sJC9pKTtcbiAgdmFyIENVU1RPTV9FTEVNRU5UID0gc2VhbCgvXlthLXpdWy5cXHddKigtWy5cXHddKykrJC9pKTtcblxuICB2YXIgZ2V0R2xvYmFsID0gZnVuY3Rpb24gZ2V0R2xvYmFsKCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuby1vcCBwb2xpY3kgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgKiBEb24ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIVxuICAgKiBAcGFyYW0gez9UcnVzdGVkVHlwZVBvbGljeUZhY3Rvcnl9IHRydXN0ZWRUeXBlcyBUaGUgcG9saWN5IGZhY3RvcnkuXG4gICAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvY3VtZW50IFRoZSBkb2N1bWVudCBvYmplY3QgKHRvIGRldGVybWluZSBwb2xpY3kgbmFtZSBzdWZmaXgpXG4gICAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0gVGhlIHBvbGljeSBjcmVhdGVkIChvciBudWxsLCBpZiBUcnVzdGVkIFR5cGVzXG4gICAqIGFyZSBub3Qgc3VwcG9ydGVkKS5cbiAgICovXG4gIHZhciBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSh0cnVzdGVkVHlwZXMsIGRvY3VtZW50KSB7XG4gICAgaWYgKF90eXBlb2YodHJ1c3RlZFR5cGVzKSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHRoZSBjYWxsZXJzIHRvIGNvbnRyb2wgdGhlIHVuaXF1ZSBwb2xpY3kgbmFtZVxuICAgIC8vIGJ5IGFkZGluZyBhIGRhdGEtdHQtcG9saWN5LXN1ZmZpeCB0byB0aGUgc2NyaXB0IGVsZW1lbnQgd2l0aCB0aGUgRE9NUHVyaWZ5LlxuICAgIC8vIFBvbGljeSBjcmVhdGlvbiB3aXRoIGR1cGxpY2F0ZSBuYW1lcyB0aHJvd3MgaW4gVHJ1c3RlZCBUeXBlcy5cbiAgICB2YXIgc3VmZml4ID0gbnVsbDtcbiAgICB2YXIgQVRUUl9OQU1FID0gJ2RhdGEtdHQtcG9saWN5LXN1ZmZpeCc7XG4gICAgaWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSkge1xuICAgICAgc3VmZml4ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTtcbiAgICB9XG4gICAgdmFyIHBvbGljeU5hbWUgPSAnZG9tcHVyaWZ5JyArIChzdWZmaXggPyAnIycgKyBzdWZmaXggOiAnJyk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgICAgY3JlYXRlSFRNTDogZnVuY3Rpb24gY3JlYXRlSFRNTChodG1sKSB7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVNjcmlwdFVSTDogZnVuY3Rpb24gY3JlYXRlU2NyaXB0VVJMKHNjcmlwdFVybCkge1xuICAgICAgICAgIHJldHVybiBzY3JpcHRVcmw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8vIFBvbGljeSBjcmVhdGlvbiBmYWlsZWQgKG1vc3QgbGlrZWx5IGFub3RoZXIgRE9NUHVyaWZ5IHNjcmlwdCBoYXNcbiAgICAgIC8vIGFscmVhZHkgcnVuKS4gU2tpcCBjcmVhdGluZyB0aGUgcG9saWN5LCBhcyB0aGlzIHdpbGwgb25seSBjYXVzZSBlcnJvcnNcbiAgICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICAgIGNvbnNvbGUud2FybignVHJ1c3RlZFR5cGVzIHBvbGljeSAnICsgcG9saWN5TmFtZSArICcgY291bGQgbm90IGJlIGNyZWF0ZWQuJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGNyZWF0ZURPTVB1cmlmeSgpIHtcbiAgICB2YXIgd2luZG93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBnZXRHbG9iYWwoKTtcbiAgICB2YXIgRE9NUHVyaWZ5ID0gZnVuY3Rpb24gRE9NUHVyaWZ5KHJvb3QpIHtcbiAgICAgIHJldHVybiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICAgKi9cbiAgICBET01QdXJpZnkudmVyc2lvbiA9ICcyLjUuNyc7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbGVtZW50cyB0aGF0IERPTVB1cmlmeSByZW1vdmVkIGR1cmluZyBzYW5pdGF0aW9uLlxuICAgICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5ub2RlVHlwZSAhPT0gOSkge1xuICAgICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgICAgLy8gc28gdGhhdCB5b3UgY2FuIHBhc3MgeW91ciBvd24gV2luZG93XG4gICAgICBET01QdXJpZnkuaXNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiBET01QdXJpZnk7XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbERvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICB2YXIgRG9jdW1lbnRGcmFnbWVudCA9IHdpbmRvdy5Eb2N1bWVudEZyYWdtZW50LFxuICAgICAgSFRNTFRlbXBsYXRlRWxlbWVudCA9IHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50LFxuICAgICAgTm9kZSA9IHdpbmRvdy5Ob2RlLFxuICAgICAgRWxlbWVudCA9IHdpbmRvdy5FbGVtZW50LFxuICAgICAgTm9kZUZpbHRlciA9IHdpbmRvdy5Ob2RlRmlsdGVyLFxuICAgICAgX3dpbmRvdyROYW1lZE5vZGVNYXAgPSB3aW5kb3cuTmFtZWROb2RlTWFwLFxuICAgICAgTmFtZWROb2RlTWFwID0gX3dpbmRvdyROYW1lZE5vZGVNYXAgPT09IHZvaWQgMCA/IHdpbmRvdy5OYW1lZE5vZGVNYXAgfHwgd2luZG93Lk1vek5hbWVkQXR0ck1hcCA6IF93aW5kb3ckTmFtZWROb2RlTWFwLFxuICAgICAgSFRNTEZvcm1FbGVtZW50ID0gd2luZG93LkhUTUxGb3JtRWxlbWVudCxcbiAgICAgIERPTVBhcnNlciA9IHdpbmRvdy5ET01QYXJzZXIsXG4gICAgICB0cnVzdGVkVHlwZXMgPSB3aW5kb3cudHJ1c3RlZFR5cGVzO1xuICAgIHZhciBFbGVtZW50UHJvdG90eXBlID0gRWxlbWVudC5wcm90b3R5cGU7XG4gICAgdmFyIGNsb25lTm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2xvbmVOb2RlJyk7XG4gICAgdmFyIGdldE5leHRTaWJsaW5nID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICduZXh0U2libGluZycpO1xuICAgIHZhciBnZXRDaGlsZE5vZGVzID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjaGlsZE5vZGVzJyk7XG4gICAgdmFyIGdldFBhcmVudE5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3BhcmVudE5vZGUnKTtcblxuICAgIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAgIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAgIC8vIChodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjcmVhdGluZy1hbmQtcGFzc2luZy1yZWdpc3RyaWVzKVxuICAgIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gICAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgICAvLyBpcyBpbmhlcml0ZWQuXG4gICAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50ID0gdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50O1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdHJ1c3RlZFR5cGVzUG9saWN5ID0gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSh0cnVzdGVkVHlwZXMsIG9yaWdpbmFsRG9jdW1lbnQpO1xuICAgIHZhciBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCgnJykgOiAnJztcbiAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICBpbXBsZW1lbnRhdGlvbiA9IF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbixcbiAgICAgIGNyZWF0ZU5vZGVJdGVyYXRvciA9IF9kb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IsXG4gICAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQsXG4gICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZSA9IF9kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZTtcbiAgICB2YXIgaW1wb3J0Tm9kZSA9IG9yaWdpbmFsRG9jdW1lbnQuaW1wb3J0Tm9kZTtcbiAgICB2YXIgZG9jdW1lbnRNb2RlID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50TW9kZSA9IGNsb25lKGRvY3VtZW50KS5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuICAgIHZhciBob29rcyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogRXhwb3NlIHdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHJ1bm5pbmcgdGhlIGZ1bGwgRE9NUHVyaWZ5LlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmIGltcGxlbWVudGF0aW9uICYmIGltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCAhPT0gdW5kZWZpbmVkICYmIGRvY3VtZW50TW9kZSAhPT0gOTtcbiAgICB2YXIgTVVTVEFDSEVfRVhQUiQxID0gTVVTVEFDSEVfRVhQUixcbiAgICAgIEVSQl9FWFBSJDEgPSBFUkJfRVhQUixcbiAgICAgIFRNUExJVF9FWFBSJDEgPSBUTVBMSVRfRVhQUixcbiAgICAgIERBVEFfQVRUUiQxID0gREFUQV9BVFRSLFxuICAgICAgQVJJQV9BVFRSJDEgPSBBUklBX0FUVFIsXG4gICAgICBJU19TQ1JJUFRfT1JfREFUQSQxID0gSVNfU0NSSVBUX09SX0RBVEEsXG4gICAgICBBVFRSX1dISVRFU1BBQ0UkMSA9IEFUVFJfV0hJVEVTUEFDRSxcbiAgICAgIENVU1RPTV9FTEVNRU5UJDEgPSBDVVNUT01fRUxFTUVOVDtcbiAgICB2YXIgSVNfQUxMT1dFRF9VUkkkMSA9IElTX0FMTE9XRURfVVJJO1xuXG4gICAgLyoqXG4gICAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICAgKiBkb24ndCBhZGQgYW55IG5ldyBvbmVzIGJ1dCBmZWVsIGZyZWUgdG8gcmVtb3ZlIHVud2FudGVkIG9uZXMuXG4gICAgICovXG5cbiAgICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cbiAgICB2YXIgQUxMT1dFRF9UQUdTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX1RBR1MgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShodG1sJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkoc3ZnJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkoc3ZnRmlsdGVycyksIF90b0NvbnN1bWFibGVBcnJheShtYXRoTWwkMSksIF90b0NvbnN1bWFibGVBcnJheSh0ZXh0KSkpO1xuXG4gICAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgICB2YXIgQUxMT1dFRF9BVFRSID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX0FUVFIgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShodG1sKSwgX3RvQ29uc3VtYWJsZUFycmF5KHN2ZyksIF90b0NvbnN1bWFibGVBcnJheShtYXRoTWwpLCBfdG9Db25zdW1hYmxlQXJyYXkoeG1sKSkpO1xuXG4gICAgLypcbiAgICAgKiBDb25maWd1cmUgaG93IERPTVBVcmlmeSBzaG91bGQgaGFuZGxlIGN1c3RvbSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGN1c3RvbWl6ZWQgYnVpbHQtaW4gZWxlbWVudHMuXG4gICAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gdGFnTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBjdXN0b20gZWxlbWVudHMpXG4gICAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gYXR0cmlidXRlTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBhdHRyaWJ1dGVzIG5vdCBvbiB0aGUgYWxsb3cgbGlzdClcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyBhbGxvdyBjdXN0b20gZWxlbWVudHMgZGVyaXZlZCBmcm9tIGJ1aWx0LWlucyBpZiB0aGV5IHBhc3MgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgICAqL1xuICAgIHZhciBDVVNUT01fRUxFTUVOVF9IQU5ETElORyA9IE9iamVjdC5zZWFsKE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgdGFnTmFtZUNoZWNrOiB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVDaGVjazoge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgIH0sXG4gICAgICBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgfVxuICAgIH0pKTtcblxuICAgIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIHRhZ3MgKG92ZXJyaWRlcyBBTExPV0VEX1RBR1MvQUREX1RBR1MpICovXG4gICAgdmFyIEZPUkJJRF9UQUdTID0gbnVsbDtcblxuICAgIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIGF0dHJpYnV0ZXMgKG92ZXJyaWRlcyBBTExPV0VEX0FUVFIvQUREX0FUVFIpICovXG4gICAgdmFyIEZPUkJJRF9BVFRSID0gbnVsbDtcblxuICAgIC8qIERlY2lkZSBpZiBBUklBIGF0dHJpYnV0ZXMgYXJlIG9rYXkgKi9cbiAgICB2YXIgQUxMT1dfQVJJQV9BVFRSID0gdHJ1ZTtcblxuICAgIC8qIERlY2lkZSBpZiBjdXN0b20gZGF0YSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX0RBVEFfQVRUUiA9IHRydWU7XG5cbiAgICAvKiBEZWNpZGUgaWYgdW5rbm93biBwcm90b2NvbHMgYXJlIG9rYXkgKi9cbiAgICB2YXIgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBzZWxmLWNsb3NpbmcgdGFncyBpbiBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkLlxuICAgICAqIFVzdWFsbHkgcmVtb3ZlZCBkdWUgdG8gYSBtWFNTIGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICB2YXIgQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSID0gdHJ1ZTtcblxuICAgIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBmb3IgY29tbW9uIHRlbXBsYXRlIGVuZ2luZXMuXG4gICAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgZGF0YSBhdHRyaWJ1dGVzLCBtdXN0YWNoZXMgYW5kIEVSQlxuICAgICAqL1xuICAgIHZhciBTQUZFX0ZPUl9URU1QTEFURVMgPSBmYWxzZTtcblxuICAgIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBldmVuIGZvciBYTUwgdXNlZCB3aXRoaW4gSFRNTCBhbmQgYWxpa2UuXG4gICAgICogVGhpcyBtZWFucywgRE9NUHVyaWZ5IHJlbW92ZXMgY29tbWVudHMgd2hlbiBjb250YWluaW5nIHJpc2t5IGNvbnRlbnQuXG4gICAgICovXG4gICAgdmFyIFNBRkVfRk9SX1hNTCA9IHRydWU7XG5cbiAgICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgdmFyIFdIT0xFX0RPQ1VNRU5UID0gZmFsc2U7XG5cbiAgICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgICB2YXIgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGFsbCBlbGVtZW50cyAoZS5nLiBzdHlsZSwgc2NyaXB0KSBtdXN0IGJlIGNoaWxkcmVuIG9mXG4gICAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgICB2YXIgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGEgRE9NIGBIVE1MQm9keUVsZW1lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAgICovXG4gICAgdmFyIFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgICAqIHN0cmluZyAgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gICAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAgICogY2FzZSBUcnVzdGVkIFR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICAqL1xuICAgIHZhciBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzP1xuICAgICAqIFRoaXMgc2FuaXRpemVzIG1hcmt1cHMgbmFtZWQgd2l0aCBjb2xsaWRpbmcsIGNsb2JiZXJhYmxlIGJ1aWx0LWluIERPTSBBUElzLlxuICAgICAqL1xuICAgIHZhciBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gICAgLyogQWNoaWV2ZSBmdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gYnkgaXNvbGF0aW5nIHRoZSBuYW1lc3BhY2Ugb2YgbmFtZWRcbiAgICAgKiBwcm9wZXJ0aWVzIGFuZCBKUyB2YXJpYWJsZXMsIG1pdGlnYXRpbmcgYXR0YWNrcyB0aGF0IGFidXNlIHRoZSBIVE1ML0RPTSBzcGVjIHJ1bGVzLlxuICAgICAqXG4gICAgICogSFRNTC9ET00gc3BlYyBydWxlcyB0aGF0IGVuYWJsZSBET00gQ2xvYmJlcmluZzpcbiAgICAgKiAgIC0gTmFtZWQgQWNjZXNzIG9uIFdpbmRvdyAowqc3LjMuMylcbiAgICAgKiAgIC0gRE9NIFRyZWUgQWNjZXNzb3JzICjCpzMuMS41KVxuICAgICAqICAgLSBGb3JtIEVsZW1lbnQgUGFyZW50LUNoaWxkIFJlbGF0aW9ucyAowqc0LjEwLjMpXG4gICAgICogICAtIElmcmFtZSBzcmNkb2MgLyBOZXN0ZWQgV2luZG93UHJveGllcyAowqc0LjguNSlcbiAgICAgKiAgIC0gSFRNTENvbGxlY3Rpb24gKMKnNC4yLjEwLjIpXG4gICAgICpcbiAgICAgKiBOYW1lc3BhY2UgaXNvbGF0aW9uIGlzIGltcGxlbWVudGVkIGJ5IHByZWZpeGluZyBgaWRgIGFuZCBgbmFtZWAgYXR0cmlidXRlc1xuICAgICAqIHdpdGggYSBjb25zdGFudCBzdHJpbmcsIGkuZS4sIGB1c2VyLWNvbnRlbnQtYFxuICAgICAqL1xuICAgIHZhciBTQU5JVElaRV9OQU1FRF9QUk9QUyA9IGZhbHNlO1xuICAgIHZhciBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggPSAndXNlci1jb250ZW50LSc7XG5cbiAgICAvKiBLZWVwIGVsZW1lbnQgY29udGVudCB3aGVuIHJlbW92aW5nIGVsZW1lbnQ/ICovXG4gICAgdmFyIEtFRVBfQ09OVEVOVCA9IHRydWU7XG5cbiAgICAvKiBJZiBhIGBOb2RlYCBpcyBwYXNzZWQgdG8gc2FuaXRpemUoKSwgdGhlbiBwZXJmb3JtcyBzYW5pdGl6YXRpb24gaW4tcGxhY2UgaW5zdGVhZFxuICAgICAqIG9mIGltcG9ydGluZyBpdCBpbnRvIGEgbmV3IERvY3VtZW50IGFuZCByZXR1cm5pbmcgYSBzYW5pdGl6ZWQgY29weSAqL1xuICAgIHZhciBJTl9QTEFDRSA9IGZhbHNlO1xuXG4gICAgLyogQWxsb3cgdXNhZ2Ugb2YgcHJvZmlsZXMgbGlrZSBodG1sLCBzdmcgYW5kIG1hdGhNbCAqL1xuICAgIHZhciBVU0VfUFJPRklMRVMgPSB7fTtcblxuICAgIC8qIFRhZ3MgdG8gaWdub3JlIGNvbnRlbnQgb2Ygd2hlbiBLRUVQX0NPTlRFTlQgaXMgdHJ1ZSAqL1xuICAgIHZhciBGT1JCSURfQ09OVEVOVFMgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0ZPUkJJRF9DT05URU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2Fubm90YXRpb24teG1sJywgJ2F1ZGlvJywgJ2NvbGdyb3VwJywgJ2Rlc2MnLCAnZm9yZWlnbm9iamVjdCcsICdoZWFkJywgJ2lmcmFtZScsICdtYXRoJywgJ21pJywgJ21uJywgJ21vJywgJ21zJywgJ210ZXh0JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAncGxhaW50ZXh0JywgJ3NjcmlwdCcsICdzdHlsZScsICdzdmcnLCAndGVtcGxhdGUnLCAndGhlYWQnLCAndGl0bGUnLCAndmlkZW8nLCAneG1wJ10pO1xuXG4gICAgLyogVGFncyB0aGF0IGFyZSBzYWZlIGZvciBkYXRhOiBVUklzICovXG4gICAgdmFyIERBVEFfVVJJX1RBR1MgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0RBVEFfVVJJX1RBR1MgPSBhZGRUb1NldCh7fSwgWydhdWRpbycsICd2aWRlbycsICdpbWcnLCAnc291cmNlJywgJ2ltYWdlJywgJ3RyYWNrJ10pO1xuXG4gICAgLyogQXR0cmlidXRlcyBzYWZlIGZvciB2YWx1ZXMgbGlrZSBcImphdmFzY3JpcHQ6XCIgKi9cbiAgICB2YXIgVVJJX1NBRkVfQVRUUklCVVRFUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyA9IGFkZFRvU2V0KHt9LCBbJ2FsdCcsICdjbGFzcycsICdmb3InLCAnaWQnLCAnbGFiZWwnLCAnbmFtZScsICdwYXR0ZXJuJywgJ3BsYWNlaG9sZGVyJywgJ3JvbGUnLCAnc3VtbWFyeScsICd0aXRsZScsICd2YWx1ZScsICdzdHlsZScsICd4bWxucyddKTtcbiAgICB2YXIgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgICB2YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgdmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAgIC8qIERvY3VtZW50IG5hbWVzcGFjZSAqL1xuICAgIHZhciBOQU1FU1BBQ0UgPSBIVE1MX05BTUVTUEFDRTtcbiAgICB2YXIgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcblxuICAgIC8qIEFsbG93ZWQgWEhUTUwrWE1MIG5hbWVzcGFjZXMgKi9cbiAgICB2YXIgQUxMT1dFRF9OQU1FU1BBQ0VTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMgPSBhZGRUb1NldCh7fSwgW01BVEhNTF9OQU1FU1BBQ0UsIFNWR19OQU1FU1BBQ0UsIEhUTUxfTkFNRVNQQUNFXSwgc3RyaW5nVG9TdHJpbmcpO1xuXG4gICAgLyogUGFyc2luZyBvZiBzdHJpY3QgWEhUTUwgZG9jdW1lbnRzICovXG4gICAgdmFyIFBBUlNFUl9NRURJQV9UWVBFO1xuICAgIHZhciBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTID0gWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAndGV4dC9odG1sJ107XG4gICAgdmFyIERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgPSAndGV4dC9odG1sJztcbiAgICB2YXIgdHJhbnNmb3JtQ2FzZUZ1bmM7XG5cbiAgICAvKiBLZWVwIGEgcmVmZXJlbmNlIHRvIGNvbmZpZyB0byBwYXNzIHRvIGhvb2tzICovXG4gICAgdmFyIENPTkZJRyA9IG51bGw7XG5cbiAgICAvKiBJZGVhbGx5LCBkbyBub3QgdG91Y2ggYW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lICovXG4gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqL1xuXG4gICAgdmFyIGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuICAgIHZhciBpc1JlZ2V4T3JGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzUmVnZXhPckZ1bmN0aW9uKHRlc3RWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRlc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX3BhcnNlQ29uZmlnXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyBvcHRpb25hbCBjb25maWcgbGl0ZXJhbFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgdmFyIF9wYXJzZUNvbmZpZyA9IGZ1bmN0aW9uIF9wYXJzZUNvbmZpZyhjZmcpIHtcbiAgICAgIGlmIChDT05GSUcgJiYgQ09ORklHID09PSBjZmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0YW1wZXJpbmcgKi9cbiAgICAgIGlmICghY2ZnIHx8IF90eXBlb2YoY2ZnKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY2ZnID0ge307XG4gICAgICB9XG5cbiAgICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHByb3RvdHlwZSBwb2xsdXRpb24gKi9cbiAgICAgIGNmZyA9IGNsb25lKGNmZyk7XG4gICAgICBQQVJTRVJfTUVESUFfVFlQRSA9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaW5jbHVkZXNcbiAgICAgIFNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMuaW5kZXhPZihjZmcuUEFSU0VSX01FRElBX1RZUEUpID09PSAtMSA/IFBBUlNFUl9NRURJQV9UWVBFID0gREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRSA6IFBBUlNFUl9NRURJQV9UWVBFID0gY2ZnLlBBUlNFUl9NRURJQV9UWVBFO1xuXG4gICAgICAvLyBIVE1MIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgYXJlIG5vdCBjYXNlLXNlbnNpdGl2ZSwgY29udmVydGluZyB0byBsb3dlcmNhc2UuIEtlZXBpbmcgWEhUTUwgYXMgaXMuXG4gICAgICB0cmFuc2Zvcm1DYXNlRnVuYyA9IFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyA/IHN0cmluZ1RvU3RyaW5nIDogc3RyaW5nVG9Mb3dlckNhc2U7XG5cbiAgICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICAgIEFMTE9XRURfVEFHUyA9ICdBTExPV0VEX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0FMTE9XRURfVEFHUztcbiAgICAgIEFMTE9XRURfQVRUUiA9ICdBTExPV0VEX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICAgIEFMTE9XRURfTkFNRVNQQUNFUyA9ICdBTExPV0VEX05BTUVTUEFDRVMnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9OQU1FU1BBQ0VTLCBzdHJpbmdUb1N0cmluZykgOiBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUztcbiAgICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSAnQUREX1VSSV9TQUZFX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgY2ZnLkFERF9VUklfU0FGRV9BVFRSLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgIHRyYW5zZm9ybUNhc2VGdW5jIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICA6IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUztcbiAgICAgIERBVEFfVVJJX1RBR1MgPSAnQUREX0RBVEFfVVJJX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfREFUQV9VUklfVEFHUyksXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGluZGVudFxuICAgICAgY2ZnLkFERF9EQVRBX1VSSV9UQUdTLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbmRlbnRcbiAgICAgIHRyYW5zZm9ybUNhc2VGdW5jIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW5kZW50XG4gICAgICA6IERFRkFVTFRfREFUQV9VUklfVEFHUztcbiAgICAgIEZPUkJJRF9DT05URU5UUyA9ICdGT1JCSURfQ09OVEVOVFMnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0NPTlRFTlRTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0ZPUkJJRF9DT05URU5UUztcbiAgICAgIEZPUkJJRF9UQUdTID0gJ0ZPUkJJRF9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiB7fTtcbiAgICAgIEZPUkJJRF9BVFRSID0gJ0ZPUkJJRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiB7fTtcbiAgICAgIFVTRV9QUk9GSUxFUyA9ICdVU0VfUFJPRklMRVMnIGluIGNmZyA/IGNmZy5VU0VfUFJPRklMRVMgOiBmYWxzZTtcbiAgICAgIEFMTE9XX0FSSUFfQVRUUiA9IGNmZy5BTExPV19BUklBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgPSBjZmcuQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBTQUZFX0ZPUl9YTUwgPSBjZmcuU0FGRV9GT1JfWE1MICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBXSE9MRV9ET0NVTUVOVCA9IGNmZy5XSE9MRV9ET0NVTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gY2ZnLlJFVFVSTl9ET01fRlJBR01FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBjZmcuUkVUVVJOX1RSVVNURURfVFlQRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBTQU5JVElaRV9ET00gPSBjZmcuU0FOSVRJWkVfRE9NICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBTQU5JVElaRV9OQU1FRF9QUk9QUyA9IGNmZy5TQU5JVElaRV9OQU1FRF9QUk9QUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgSU5fUExBQ0UgPSBjZmcuSU5fUExBQ0UgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIElTX0FMTE9XRURfVVJJJDEgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IElTX0FMTE9XRURfVVJJJDE7XG4gICAgICBOQU1FU1BBQ0UgPSBjZmcuTkFNRVNQQUNFIHx8IEhUTUxfTkFNRVNQQUNFO1xuICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgfHwge307XG4gICAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2spKSB7XG4gICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayA9IGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2s7XG4gICAgICB9XG4gICAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2spKSB7XG4gICAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayA9IGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2s7XG4gICAgICB9XG4gICAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIHR5cGVvZiBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID0gY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cztcbiAgICAgIH1cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICBSRVRVUk5fRE9NID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogUGFyc2UgcHJvZmlsZSBpbmZvICovXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTKSB7XG4gICAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBfdG9Db25zdW1hYmxlQXJyYXkodGV4dCkpO1xuICAgICAgICBBTExPV0VEX0FUVFIgPSBbXTtcbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBodG1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgaHRtbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5zdmcgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2ZyQxKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2Zyk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCB4bWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnRmlsdGVycyk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBzdmcpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLm1hdGhNbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgbWF0aE1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgbWF0aE1sKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG4gICAgICBpZiAoY2ZnLkFERF9UQUdTKSB7XG4gICAgICAgIGlmIChBTExPV0VEX1RBR1MgPT09IERFRkFVTFRfQUxMT1dFRF9UQUdTKSB7XG4gICAgICAgICAgQUxMT1dFRF9UQUdTID0gY2xvbmUoQUxMT1dFRF9UQUdTKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIGNmZy5BRERfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgICAgfVxuICAgICAgaWYgKGNmZy5BRERfQVRUUikge1xuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSID09PSBERUZBVUxUX0FMTE9XRURfQVRUUikge1xuICAgICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBjZmcuQUREX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICAgIH1cbiAgICAgIGlmIChjZmcuQUREX1VSSV9TQUZFX0FUVFIpIHtcbiAgICAgICAgYWRkVG9TZXQoVVJJX1NBRkVfQVRUUklCVVRFUywgY2ZnLkFERF9VUklfU0FGRV9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG4gICAgICBpZiAoY2ZnLkZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkVG9TZXQoRk9SQklEX0NPTlRFTlRTLCBjZmcuRk9SQklEX0NPTlRFTlRTLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgICB9XG5cbiAgICAgIC8qIEFkZCAjdGV4dCBpbiBjYXNlIEtFRVBfQ09OVEVOVCBpcyBzZXQgdG8gdHJ1ZSAqL1xuICAgICAgaWYgKEtFRVBfQ09OVEVOVCkge1xuICAgICAgICBBTExPV0VEX1RBR1NbJyN0ZXh0J10gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBBZGQgaHRtbCwgaGVhZCBhbmQgYm9keSB0byBBTExPV0VEX1RBR1MgaW4gY2FzZSBXSE9MRV9ET0NVTUVOVCBpcyB0cnVlICovXG4gICAgICBpZiAoV0hPTEVfRE9DVU1FTlQpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ2h0bWwnLCAnaGVhZCcsICdib2R5J10pO1xuICAgICAgfVxuXG4gICAgICAvKiBBZGQgdGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgdGFibGVzIGFyZSBwZXJtaXR0ZWQsIHNlZSAjMjg2LCAjMzY1ICovXG4gICAgICBpZiAoQUxMT1dFRF9UQUdTLnRhYmxlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWyd0Ym9keSddKTtcbiAgICAgICAgZGVsZXRlIEZPUkJJRF9UQUdTLnRib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IGZ1cnRoZXIgbWFuaXB1bGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24uXG4gICAgICAvLyBOb3QgYXZhaWxhYmxlIGluIElFOCwgU2FmYXJpIDUsIGV0Yy5cbiAgICAgIGlmIChmcmVlemUpIHtcbiAgICAgICAgZnJlZXplKGNmZyk7XG4gICAgICB9XG4gICAgICBDT05GSUcgPSBjZmc7XG4gICAgfTtcbiAgICB2YXIgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnbWknLCAnbW8nLCAnbW4nLCAnbXMnLCAnbXRleHQnXSk7XG4gICAgdmFyIEhUTUxfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnXSk7XG5cbiAgICAvLyBDZXJ0YWluIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGJvdGggU1ZHIGFuZCBIVE1MXG4gICAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGdldCBlcnJvbmVvdXNseSBkZWxldGVkIGZyb21cbiAgICAvLyBIVE1MIG5hbWVzcGFjZS5cbiAgICB2YXIgQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UUyA9IGFkZFRvU2V0KHt9LCBbJ3RpdGxlJywgJ3N0eWxlJywgJ2ZvbnQnLCAnYScsICdzY3JpcHQnXSk7XG5cbiAgICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBTVkcgYW5kIE1hdGhNTCB0YWdzXG4gICAgICogc28gdGhhdCB3ZSBjYW4gcGVyZm9ybSB0aGUgbmFtZXNwYWNlIGNoZWNrc1xuICAgICAqIGNvcnJlY3RseS4gKi9cbiAgICB2YXIgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIHN2ZyQxKTtcbiAgICBhZGRUb1NldChBTExfU1ZHX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgIGFkZFRvU2V0KEFMTF9TVkdfVEFHUywgc3ZnRGlzYWxsb3dlZCk7XG4gICAgdmFyIEFMTF9NQVRITUxfVEFHUyA9IGFkZFRvU2V0KHt9LCBtYXRoTWwkMSk7XG4gICAgYWRkVG9TZXQoQUxMX01BVEhNTF9UQUdTLCBtYXRoTWxEaXNhbGxvd2VkKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtFbGVtZW50fSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAgICogIG5hbWVzcGFjZSB0aGF0IGEgc3BlYy1jb21wbGlhbnQgcGFyc2VyIHdvdWxkIG5ldmVyXG4gICAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHZhciBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIF9jaGVja1ZhbGlkTmFtZXNwYWNlKGVsZW1lbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gICAgICAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgICAgLy8gY2FuIGJlIG51bGwuIFdlIGp1c3Qgc2ltdWxhdGUgcGFyZW50IGluIHRoaXMgY2FzZS5cbiAgICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgICBwYXJlbnQgPSB7XG4gICAgICAgICAgbmFtZXNwYWNlVVJJOiBOQU1FU1BBQ0UsXG4gICAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHRhZ05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShlbGVtZW50LnRhZ05hbWUpO1xuICAgICAgdmFyIHBhcmVudFRhZ05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShwYXJlbnQudGFnTmFtZSk7XG4gICAgICBpZiAoIUFMTE9XRURfTkFNRVNQQUNFU1tlbGVtZW50Lm5hbWVzcGFjZVVSSV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBTVkdcbiAgICAgICAgLy8gaXMgdmlhIDxzdmc+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBNYXRoTUwgdG8gU1ZHIGlzIHZpYWBcbiAgICAgICAgLy8gc3ZnIGlmIHBhcmVudCBpcyBlaXRoZXIgPGFubm90YXRpb24teG1sPiBvciBNYXRoTUxcbiAgICAgICAgLy8gdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHMuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnICYmIChwYXJlbnRUYWdOYW1lID09PSAnYW5ub3RhdGlvbi14bWwnIHx8IE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gU1ZHXG4gICAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gU1ZHIG5hbWVzcGFjZS5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gTWF0aE1MXG4gICAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGtpbGxlZC5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBNYXRoTUxcbiAgICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBNYXRoTUwgbmFtZXNwYWNlLlxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIEhUTUwgaXMgdmlhXG4gICAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgICAvLyBpcyB2aWEgTWF0aE1MIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFICYmICFIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSAmJiAhTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZGlzYWxsb3cgdGFncyB0aGF0IGFyZSBzcGVjaWZpYyBmb3IgTWF0aE1MXG4gICAgICAgIC8vIG9yIFNWRyBhbmQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBIVE1MIG5hbWVzcGFjZVxuICAgICAgICByZXR1cm4gIUFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSAmJiAoQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UU1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFhIVE1MIGFuZCBYTUwgZG9jdW1lbnRzIHRoYXQgc3VwcG9ydCBjdXN0b20gbmFtZXNwYWNlc1xuICAgICAgaWYgKFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJiBBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29kZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwbGFjZSAodGhpcyBtZWFuc1xuICAgICAgLy8gdGhhdCB0aGUgZWxlbWVudCBzb21laG93IGdvdCBuYW1lc3BhY2UgdGhhdCBpcyBub3RcbiAgICAgIC8vIEhUTUwsIFNWRywgTWF0aE1MIG9yIGFsbG93ZWQgdmlhIEFMTE9XRURfTkFNRVNQQUNFUykuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UganVzdCBpbiBjYXNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfZm9yY2VSZW1vdmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfZm9yY2VSZW1vdmUgPSBmdW5jdGlvbiBfZm9yY2VSZW1vdmUobm9kZSkge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGVsZW1lbnQ6IG5vZGVcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbm9kZS5vdXRlckhUTUwgPSBlbXB0eUhUTUw7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbmFtZSBhbiBBdHRyaWJ1dGUgbmFtZVxuICAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfcmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBub2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IG5vZGUuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgICBmcm9tOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IG51bGwsXG4gICAgICAgICAgZnJvbTogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXG4gICAgICAvLyBXZSB2b2lkIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIHVucmVtb3ZhYmxlIFwiaXNcIlwiIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChuYW1lID09PSAnaXMnICYmICFBTExPV0VEX0FUVFJbbmFtZV0pIHtcbiAgICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfZm9yY2VSZW1vdmUobm9kZSk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2luaXREb2N1bWVudFxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBkaXJ0eSBhIHN0cmluZyBvZiBkaXJ0eSBtYXJrdXBcbiAgICAgKiBAcmV0dXJuIHtEb2N1bWVudH0gYSBET00sIGZpbGxlZCB3aXRoIHRoZSBkaXJ0eSBtYXJrdXBcbiAgICAgKi9cbiAgICB2YXIgX2luaXREb2N1bWVudCA9IGZ1bmN0aW9uIF9pbml0RG9jdW1lbnQoZGlydHkpIHtcbiAgICAgIC8qIENyZWF0ZSBhIEhUTUwgZG9jdW1lbnQgKi9cbiAgICAgIHZhciBkb2M7XG4gICAgICB2YXIgbGVhZGluZ1doaXRlc3BhY2U7XG4gICAgICBpZiAoRk9SQ0VfQk9EWSkge1xuICAgICAgICBkaXJ0eSA9ICc8cmVtb3ZlPjwvcmVtb3ZlPicgKyBkaXJ0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIElmIEZPUkNFX0JPRFkgaXNuJ3QgdXNlZCwgbGVhZGluZyB3aGl0ZXNwYWNlIG5lZWRzIHRvIGJlIHByZXNlcnZlZCBtYW51YWxseSAqL1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IHN0cmluZ01hdGNoKGRpcnR5LCAvXltcXHJcXG5cXHQgXSsvKTtcbiAgICAgICAgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaGVzICYmIG1hdGNoZXNbMF07XG4gICAgICB9XG4gICAgICBpZiAoUEFSU0VSX01FRElBX1RZUEUgPT09ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnICYmIE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gUm9vdCBvZiBYSFRNTCBkb2MgbXVzdCBjb250YWluIHhtbG5zIGRlY2xhcmF0aW9uIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3hodG1sMS9ub3JtYXRpdmUuaHRtbCNzdHJpY3QpXG4gICAgICAgIGRpcnR5ID0gJzxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPjxoZWFkPjwvaGVhZD48Ym9keT4nICsgZGlydHkgKyAnPC9ib2R5PjwvaHRtbD4nO1xuICAgICAgfVxuICAgICAgdmFyIGRpcnR5UGF5bG9hZCA9IHRydXN0ZWRUeXBlc1BvbGljeSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKGRpcnR5KSA6IGRpcnR5O1xuICAgICAgLypcbiAgICAgICAqIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZVxuICAgICAgICogRE9NUGFyc2VyIG5vdCB3b3JrIGZvciBzdmcgd2hlbiBoYXMgbXVsdGlwbGUgcm9vdCBlbGVtZW50LlxuICAgICAgICovXG4gICAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoZGlydHlQYXlsb2FkLCBQQVJTRVJfTUVESUFfVFlQRSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG5cbiAgICAgIC8qIFVzZSBjcmVhdGVIVE1MRG9jdW1lbnQgaW4gY2FzZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSAqL1xuICAgICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFLCAndGVtcGxhdGUnLCBudWxsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IElTX0VNUFRZX0lOUFVUID8gZW1wdHlIVE1MIDogZGlydHlQYXlsb2FkO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgLy8gU3ludGF4IGVycm9yIGlmIGRpcnR5UGF5bG9hZCBpcyBpbnZhbGlkIHhtbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgICAgYm9keS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVhZGluZ1doaXRlc3BhY2UpLCBib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuICAgICAgaWYgKE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoZG9jLCBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5JylbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gV0hPTEVfRE9DVU1FTlQgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogYm9keTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2NyZWF0ZUl0ZXJhdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtEb2N1bWVudH0gcm9vdCBkb2N1bWVudC9mcmFnbWVudCB0byBjcmVhdGUgaXRlcmF0b3IgZm9yXG4gICAgICogQHJldHVybiB7SXRlcmF0b3J9IGl0ZXJhdG9yIGluc3RhbmNlXG4gICAgICovXG4gICAgdmFyIF9jcmVhdGVJdGVyYXRvciA9IGZ1bmN0aW9uIF9jcmVhdGVJdGVyYXRvcihyb290KSB7XG4gICAgICByZXR1cm4gY3JlYXRlTm9kZUl0ZXJhdG9yLmNhbGwocm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsIHJvb3QsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQgfCBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19URVhUIHwgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gfCBOb2RlRmlsdGVyLlNIT1dfQ0RBVEFfU0VDVElPTiwgbnVsbCwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaXNDbG9iYmVyZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge05vZGV9IGVsbSBlbGVtZW50IHRvIGNoZWNrIGZvciBjbG9iYmVyaW5nIGF0dGFja3NcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGNsb2JiZXJlZCwgZmFsc2UgaWYgc2FmZVxuICAgICAqL1xuICAgIHZhciBfaXNDbG9iYmVyZWQgPSBmdW5jdGlvbiBfaXNDbG9iYmVyZWQoZWxtKSB7XG4gICAgICByZXR1cm4gZWxtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmICh0eXBlb2YgZWxtLm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnJlbW92ZUNoaWxkICE9PSAnZnVuY3Rpb24nIHx8ICEoZWxtLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8IHR5cGVvZiBlbG0ucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0uc2V0QXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0ubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZWxtLmhhc0NoaWxkTm9kZXMgIT09ICdmdW5jdGlvbicpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaXNOb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBvYmogb2JqZWN0IHRvIGNoZWNrIHdoZXRoZXIgaXQncyBhIERPTSBub2RlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpcyBvYmplY3QgaXMgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfaXNOb2RlID0gZnVuY3Rpb24gX2lzTm9kZShvYmplY3QpIHtcbiAgICAgIHJldHVybiBfdHlwZW9mKE5vZGUpID09PSAnb2JqZWN0JyA/IG9iamVjdCBpbnN0YW5jZW9mIE5vZGUgOiBvYmplY3QgJiYgX3R5cGVvZihvYmplY3QpID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2Ygb2JqZWN0Lm5vZGVOYW1lID09PSAnc3RyaW5nJztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2V4ZWN1dGVIb29rXG4gICAgICogRXhlY3V0ZSB1c2VyIGNvbmZpZ3VyYWJsZSBob29rc1xuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBlbnRyeVBvaW50ICBOYW1lIG9mIHRoZSBob29rJ3MgZW50cnkgcG9pbnRcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBjdXJyZW50Tm9kZSBub2RlIHRvIHdvcmsgb24gd2l0aCB0aGUgaG9va1xuICAgICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBhZGRpdGlvbmFsIGhvb2sgcGFyYW1ldGVyc1xuICAgICAqL1xuICAgIHZhciBfZXhlY3V0ZUhvb2sgPSBmdW5jdGlvbiBfZXhlY3V0ZUhvb2soZW50cnlQb2ludCwgY3VycmVudE5vZGUsIGRhdGEpIHtcbiAgICAgIGlmICghaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXJyYXlGb3JFYWNoKGhvb2tzW2VudHJ5UG9pbnRdLCBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBob29rLmNhbGwoRE9NUHVyaWZ5LCBjdXJyZW50Tm9kZSwgZGF0YSwgQ09ORklHKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVFbGVtZW50c1xuICAgICAqXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCB0ZXh0Q29udGVudFxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gZXhpc3RcbiAgICAgKiBAcmV0dXJuICB7Qm9vbGVhbn0gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICAgKi9cbiAgICB2YXIgX3Nhbml0aXplRWxlbWVudHMgPSBmdW5jdGlvbiBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSkge1xuICAgICAgdmFyIGNvbnRlbnQ7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayBpZiB0YWduYW1lIGNvbnRhaW5zIFVuaWNvZGUgKi9cbiAgICAgIGlmIChyZWdFeHBUZXN0KC9bXFx1MDA4MC1cXHVGRkZGXS8sIGN1cnJlbnROb2RlLm5vZGVOYW1lKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogTm93IGxldCdzIGNoZWNrIHRoZSBlbGVtZW50J3MgdHlwZSBhbmQgbmFtZSAqL1xuICAgICAgdmFyIHRhZ05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygndXBvblNhbml0aXplRWxlbWVudCcsIGN1cnJlbnROb2RlLCB7XG4gICAgICAgIHRhZ05hbWU6IHRhZ05hbWUsXG4gICAgICAgIGFsbG93ZWRUYWdzOiBBTExPV0VEX1RBR1NcbiAgICAgIH0pO1xuXG4gICAgICAvKiBEZXRlY3QgbVhTUyBhdHRlbXB0cyBhYnVzaW5nIG5hbWVzcGFjZSBjb25mdXNpb24gKi9cbiAgICAgIGlmIChjdXJyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmICghX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50KSB8fCAhX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKSkgJiYgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNaXRpZ2F0ZSBhIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgaW5zaWRlIHNlbGVjdCAqL1xuICAgICAgaWYgKHRhZ05hbWUgPT09ICdzZWxlY3QnICYmIHJlZ0V4cFRlc3QoLzx0ZW1wbGF0ZS9pLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgYW55IG9jdXJyZW5jZSBvZiBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAqL1xuICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSA3KSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgYW55IGtpbmQgb2YgcG9zc2libHkgaGFybWZ1bCBjb21tZW50cyAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1hNTCAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gOCAmJiByZWdFeHBUZXN0KC88Wy9cXHddL2csIGN1cnJlbnROb2RlLmRhdGEpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGN1c3RvbSBlbGVtZW50IHRvIGhhbmRsZSAqL1xuICAgICAgICBpZiAoIUZPUkJJRF9UQUdTW3RhZ05hbWVdICYmIF9iYXNpY0N1c3RvbUVsZW1lbnRUZXN0KHRhZ05hbWUpKSB7XG4gICAgICAgICAgaWYgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJiByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgdGFnTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBpZiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBLZWVwIGNvbnRlbnQgZXhjZXB0IGZvciBiYWQtbGlzdGVkIGVsZW1lbnRzICovXG4gICAgICAgIGlmIChLRUVQX0NPTlRFTlQgJiYgIUZPUkJJRF9DT05URU5UU1t0YWdOYW1lXSkge1xuICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IGdldENoaWxkTm9kZXMoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgaWYgKGNoaWxkTm9kZXMgJiYgcGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBjaGlsZE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgdmFyIGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIGNoaWxkQ2xvbmUuX19yZW1vdmFsQ291bnQgPSAoY3VycmVudE5vZGUuX19yZW1vdmFsQ291bnQgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZENsb25lLCBnZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogQ2hlY2sgd2hldGhlciBlbGVtZW50IGhhcyBhIHZhbGlkIG5hbWVzcGFjZSAqL1xuICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiAhX2NoZWNrVmFsaWROYW1lc3BhY2UoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNYWtlIHN1cmUgdGhhdCBvbGRlciBicm93c2VycyBkb24ndCBnZXQgZmFsbGJhY2stdGFnIG1YU1MgKi9cbiAgICAgIGlmICgodGFnTmFtZSA9PT0gJ25vc2NyaXB0JyB8fCB0YWdOYW1lID09PSAnbm9lbWJlZCcgfHwgdGFnTmFtZSA9PT0gJ25vZnJhbWVzJykgJiYgcmVnRXhwVGVzdCgvPFxcL25vKHNjcmlwdHxlbWJlZHxmcmFtZXMpL2ksIGN1cnJlbnROb2RlLmlubmVySFRNTCkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIFNhbml0aXplIGVsZW1lbnQgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTICYmIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIC8qIEdldCB0aGUgZWxlbWVudCdzIHRleHQgY29udGVudCAqL1xuICAgICAgICBjb250ZW50ID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIE1VU1RBQ0hFX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgRVJCX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgVE1QTElUX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLnRleHRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgICAgICBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnROb2RlLnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzVmFsaWRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIHZhciBfaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIF9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKSB7XG4gICAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgICBpZiAoU0FOSVRJWkVfRE9NICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpICYmICh2YWx1ZSBpbiBkb2N1bWVudCB8fCB2YWx1ZSBpbiBmb3JtRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvKiBBbGxvdyB2YWxpZCBkYXRhLSogYXR0cmlidXRlczogQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhZnRlciBcIi1cIlxuICAgICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICAgIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlOyBpdCdzIGFsd2F5cyBVUkkgc2FmZS4gKi9cbiAgICAgIGlmIChBTExPV19EQVRBX0FUVFIgJiYgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiYgcmVnRXhwVGVzdChEQVRBX0FUVFIkMSwgbGNOYW1lKSkgOyBlbHNlIGlmIChBTExPV19BUklBX0FUVFIgJiYgcmVnRXhwVGVzdChBUklBX0FUVFIkMSwgbGNOYW1lKSkgOyBlbHNlIGlmICghQUxMT1dFRF9BVFRSW2xjTmFtZV0gfHwgRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIEZpcnN0IGNvbmRpdGlvbiBkb2VzIGEgdmVyeSBiYXNpYyBjaGVjayBpZiBhKSBpdCdzIGJhc2ljYWxseSBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IHRhZ25hbWUgQU5EXG4gICAgICAgIC8vIGIpIGlmIHRoZSB0YWdOYW1lIHBhc3NlcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBmb3IgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrXG4gICAgICAgIC8vIGFuZCBjKSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2tcbiAgICAgICAgX2Jhc2ljQ3VzdG9tRWxlbWVudFRlc3QobGNUYWcpICYmIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiYgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIGxjVGFnKSB8fCBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sobGNUYWcpKSAmJiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgUmVnRXhwICYmIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrLCBsY05hbWUpIHx8IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjayhsY05hbWUpKSB8fFxuICAgICAgICAvLyBBbHRlcm5hdGl2ZSwgc2Vjb25kIGNvbmRpdGlvbiBjaGVja3MgaWYgaXQncyBhbiBgaXNgLWF0dHJpYnV0ZSwgQU5EXG4gICAgICAgIC8vIHRoZSB2YWx1ZSBwYXNzZXMgd2hhdGV2ZXIgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgZm9yIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVja1xuICAgICAgICBsY05hbWUgPT09ICdpcycgJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzICYmIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiYgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2ssIHZhbHVlKSB8fCBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sodmFsdWUpKSkgOyBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ2hlY2sgdmFsdWUgaXMgc2FmZS4gRmlyc3QsIGlzIGF0dHIgaW5lcnQ/IElmIHNvLCBpcyBzYWZlICovXG4gICAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkgOyBlbHNlIGlmIChyZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJJDEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSQxLCAnJykpKSA7IGVsc2UgaWYgKChsY05hbWUgPT09ICdzcmMnIHx8IGxjTmFtZSA9PT0gJ3hsaW5rOmhyZWYnIHx8IGxjTmFtZSA9PT0gJ2hyZWYnKSAmJiBsY1RhZyAhPT0gJ3NjcmlwdCcgJiYgc3RyaW5nSW5kZXhPZih2YWx1ZSwgJ2RhdGE6JykgPT09IDAgJiYgREFUQV9VUklfVEFHU1tsY1RhZ10pIDsgZWxzZSBpZiAoQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgJiYgIXJlZ0V4cFRlc3QoSVNfU0NSSVBUX09SX0RBVEEkMSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFJDEsICcnKSkpIDsgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfYmFzaWNDdXN0b21FbGVtZW50Q2hlY2tcbiAgICAgKiBjaGVja3MgaWYgYXQgbGVhc3Qgb25lIGRhc2ggaXMgaW5jbHVkZWQgaW4gdGFnTmFtZSwgYW5kIGl0J3Mgbm90IHRoZSBmaXJzdCBjaGFyXG4gICAgICogZm9yIG1vcmUgc29waGlzdGljYXRlZCBjaGVja2luZyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy92YWxpZGF0ZS1lbGVtZW50LW5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSBuYW1lIG9mIHRoZSB0YWcgb2YgdGhlIG5vZGUgdG8gc2FuaXRpemVcbiAgICAgKi9cbiAgICB2YXIgX2Jhc2ljQ3VzdG9tRWxlbWVudFRlc3QgPSBmdW5jdGlvbiBfYmFzaWNDdXN0b21FbGVtZW50VGVzdCh0YWdOYW1lKSB7XG4gICAgICByZXR1cm4gdGFnTmFtZSAhPT0gJ2Fubm90YXRpb24teG1sJyAmJiBzdHJpbmdNYXRjaCh0YWdOYW1lLCBDVVNUT01fRUxFTUVOVCQxKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplQXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAgICogQHByb3RlY3QgcmVtb3ZlQXR0cmlidXRlXG4gICAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgICAqL1xuICAgIHZhciBfc2FuaXRpemVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gX3Nhbml0aXplQXR0cmlidXRlcyhjdXJyZW50Tm9kZSkge1xuICAgICAgdmFyIGF0dHI7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB2YXIgbGNOYW1lO1xuICAgICAgdmFyIGw7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplQXR0cmlidXRlcycsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gY3VycmVudE5vZGUuYXR0cmlidXRlcztcblxuICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhdHRyaWJ1dGVzOyBpZiBub3Qgd2UgbWlnaHQgaGF2ZSBhIHRleHQgbm9kZSAqL1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBob29rRXZlbnQgPSB7XG4gICAgICAgIGF0dHJOYW1lOiAnJyxcbiAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAga2VlcEF0dHI6IHRydWUsXG4gICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzOiBBTExPV0VEX0FUVFJcbiAgICAgIH07XG4gICAgICBsID0gYXR0cmlidXRlcy5sZW5ndGg7XG5cbiAgICAgIC8qIEdvIGJhY2t3YXJkcyBvdmVyIGFsbCBhdHRyaWJ1dGVzOyBzYWZlbHkgcmVtb3ZlIGJhZCBvbmVzICovXG4gICAgICB3aGlsZSAobC0tKSB7XG4gICAgICAgIGF0dHIgPSBhdHRyaWJ1dGVzW2xdO1xuICAgICAgICB2YXIgX2F0dHIgPSBhdHRyLFxuICAgICAgICAgIG5hbWUgPSBfYXR0ci5uYW1lLFxuICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IF9hdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgdmFsdWUgPSBuYW1lID09PSAndmFsdWUnID8gYXR0ci52YWx1ZSA6IHN0cmluZ1RyaW0oYXR0ci52YWx1ZSk7XG4gICAgICAgIGxjTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKG5hbWUpO1xuXG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgICBob29rRXZlbnQuYXR0clZhbHVlID0gdmFsdWU7XG4gICAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuICAgICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZScsIGN1cnJlbnROb2RlLCBob29rRXZlbnQpO1xuICAgICAgICB2YWx1ZSA9IGhvb2tFdmVudC5hdHRyVmFsdWU7XG5cbiAgICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICAgIGlmIChob29rRXZlbnQuZm9yY2VLZWVwQXR0cikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogUmVtb3ZlIGF0dHJpYnV0ZSAqL1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cbiAgICAgICAgaWYgKCFob29rRXZlbnQua2VlcEF0dHIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFdvcmsgYXJvdW5kIGEgc2VjdXJpdHkgaXNzdWUgaW4galF1ZXJ5IDMuMCAqL1xuICAgICAgICBpZiAoIUFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiAmJiByZWdFeHBUZXN0KC9cXC8+L2ksIHZhbHVlKSkge1xuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2FuaXRpemUgYXR0cmlidXRlIGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBNVVNUQUNIRV9FWFBSJDEsICcgJyk7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBFUkJfRVhQUiQxLCAnICcpO1xuICAgICAgICAgIHZhbHVlID0gc3RyaW5nUmVwbGFjZSh2YWx1ZSwgVE1QTElUX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIElzIGB2YWx1ZWAgdmFsaWQgZm9yIHRoaXMgYXR0cmlidXRlPyAqL1xuICAgICAgICB2YXIgbGNUYWcgPSB0cmFuc2Zvcm1DYXNlRnVuYyhjdXJyZW50Tm9kZS5ub2RlTmFtZSk7XG4gICAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBGdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gdmlhIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gICAgICAgICAqIFByZWZpeCBpZCBhbmQgbmFtZSBhdHRyaWJ1dGVzIHdpdGggYHVzZXItY29udGVudC1gXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoU0FOSVRJWkVfTkFNRURfUFJPUFMgJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoaXMgdmFsdWVcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAgIC8vIFByZWZpeCB0aGUgdmFsdWUgYW5kIGxhdGVyIHJlLWNyZWF0ZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNhbml0aXplZCB2YWx1ZVxuICAgICAgICAgIHZhbHVlID0gU0FOSVRJWkVfTkFNRURfUFJPUFNfUFJFRklYICsgdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIHdpdGggY29tbWVudHMgaW5zaWRlIGF0dHJpYnV0ZXMgKi9cbiAgICAgICAgaWYgKFNBRkVfRk9SX1hNTCAmJiByZWdFeHBUZXN0KC8oKC0tIT98XSk+KXw8XFwvKHN0eWxlfHRpdGxlKS9pLCB2YWx1ZSkpIHtcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEhhbmRsZSBhdHRyaWJ1dGVzIHRoYXQgcmVxdWlyZSBUcnVzdGVkIFR5cGVzICovXG4gICAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgJiYgX3R5cGVvZih0cnVzdGVkVHlwZXMpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdHJ1c3RlZFR5cGVzLmdldEF0dHJpYnV0ZVR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJKSA7IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0cnVzdGVkVHlwZXMuZ2V0QXR0cmlidXRlVHlwZShsY1RhZywgbGNOYW1lKSkge1xuICAgICAgICAgICAgICBjYXNlICdUcnVzdGVkSFRNTCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRTY3JpcHRVUkwnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZVNjcmlwdFVSTCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF9pc0Nsb2JiZXJlZChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UG9wKERPTVB1cmlmeS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAgICovXG4gICAgdmFyIF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIF9zYW5pdGl6ZVNoYWRvd0RPTShmcmFnbWVudCkge1xuICAgICAgdmFyIHNoYWRvd05vZGU7XG4gICAgICB2YXIgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoZnJhZ21lbnQpO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplU2hhZG93RE9NJywgZnJhZ21lbnQsIG51bGwpO1xuICAgICAgd2hpbGUgKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVTaGFkb3dOb2RlJywgc2hhZG93Tm9kZSwgbnVsbCk7XG5cbiAgICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBEZWVwIHNoYWRvdyBET00gZGV0ZWN0ZWQgKi9cbiAgICAgICAgaWYgKHNoYWRvd05vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oc2hhZG93Tm9kZS5jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMsIHNhbml0aXplIGlmIG5lY2Vzc2FyeSAqL1xuICAgICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKHNoYWRvd05vZGUpO1xuICAgICAgfVxuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVTaGFkb3dET00nLCBmcmFnbWVudCwgbnVsbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNhbml0aXplXG4gICAgICogUHVibGljIG1ldGhvZCBwcm92aWRpbmcgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE5vZGV9IGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgRE9NUHVyaWZ5LnNhbml0aXplID0gZnVuY3Rpb24gKGRpcnR5KSB7XG4gICAgICB2YXIgY2ZnID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBib2R5O1xuICAgICAgdmFyIGltcG9ydGVkTm9kZTtcbiAgICAgIHZhciBjdXJyZW50Tm9kZTtcbiAgICAgIHZhciBvbGROb2RlO1xuICAgICAgdmFyIHJldHVybk5vZGU7XG4gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmluZyB0byBzYW5pdGl6ZS5cbiAgICAgICAgRE8gTk9UIHJldHVybiBlYXJseSwgYXMgdGhpcyB3aWxsIHJldHVybiB0aGUgd3JvbmcgdHlwZSBpZlxuICAgICAgICB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgRE9NIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAqL1xuICAgICAgSVNfRU1QVFlfSU5QVVQgPSAhZGlydHk7XG4gICAgICBpZiAoSVNfRU1QVFlfSU5QVVQpIHtcbiAgICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgICAgfVxuXG4gICAgICAvKiBTdHJpbmdpZnksIGluIGNhc2UgZGlydHkgaXMgYW4gb2JqZWN0ICovXG4gICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJyAmJiAhX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGRpcnR5ID0gZGlydHkudG9TdHJpbmcoKTtcbiAgICAgICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdkaXJ0eSBpcyBub3QgYSBzdHJpbmcsIGFib3J0aW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayB3ZSBjYW4gcnVuLiBPdGhlcndpc2UgZmFsbCBiYWNrIG9yIGlnbm9yZSAqL1xuICAgICAgaWYgKCFET01QdXJpZnkuaXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgaWYgKF90eXBlb2Yod2luZG93LnRvU3RhdGljSFRNTCkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB3aW5kb3cudG9TdGF0aWNIVE1MID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF9pc05vZGUoZGlydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnRvU3RhdGljSFRNTChkaXJ0eS5vdXRlckhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlydHk7XG4gICAgICB9XG5cbiAgICAgIC8qIEFzc2lnbiBjb25maWcgdmFycyAqL1xuICAgICAgaWYgKCFTRVRfQ09ORklHKSB7XG4gICAgICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgICAgfVxuXG4gICAgICAvKiBDbGVhbiB1cCByZW1vdmVkIGVsZW1lbnRzICovXG4gICAgICBET01QdXJpZnkucmVtb3ZlZCA9IFtdO1xuXG4gICAgICAvKiBDaGVjayBpZiBkaXJ0eSBpcyBjb3JyZWN0bHkgdHlwZWQgZm9yIElOX1BMQUNFICovXG4gICAgICBpZiAodHlwZW9mIGRpcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBJTl9QTEFDRSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAgIC8qIERvIHNvbWUgZWFybHkgcHJlLXNhbml0aXphdGlvbiB0byBhdm9pZCB1bnNhZmUgcm9vdCBub2RlcyAqL1xuICAgICAgICBpZiAoZGlydHkubm9kZU5hbWUpIHtcbiAgICAgICAgICB2YXIgdGFnTmFtZSA9IHRyYW5zZm9ybUNhc2VGdW5jKGRpcnR5Lm5vZGVOYW1lKTtcbiAgICAgICAgICBpZiAoIUFMTE9XRURfVEFHU1t0YWdOYW1lXSB8fCBGT1JCSURfVEFHU1t0YWdOYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCdyb290IG5vZGUgaXMgZm9yYmlkZGVuIGFuZCBjYW5ub3QgYmUgc2FuaXRpemVkIGluLXBsYWNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcnR5IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgICBib2R5ID0gX2luaXREb2N1bWVudCgnPCEtLS0tPicpO1xuICAgICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG4gICAgICAgIGlmIChpbXBvcnRlZE5vZGUubm9kZVR5cGUgPT09IDEgJiYgaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICAgICAgICAvKiBOb2RlIGlzIGFscmVhZHkgYSBib2R5LCB1c2UgYXMgaXMgKi9cbiAgICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtYXBwZW5kXG4gICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgICBpZiAoIVJFVFVSTl9ET00gJiYgIVNBRkVfRk9SX1RFTVBMQVRFUyAmJiAhV0hPTEVfRE9DVU1FTlQgJiZcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWluY2x1ZGVzXG4gICAgICAgIGRpcnR5LmluZGV4T2YoJzwnKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24gKi9cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICAgIGlmICghYm9keSkge1xuICAgICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IFJFVFVSTl9UUlVTVEVEX1RZUEUgPyBlbXB0eUhUTUwgOiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoYm9keS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICAgIHZhciBub2RlSXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoSU5fUExBQ0UgPyBkaXJ0eSA6IGJvZHkpO1xuXG4gICAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEZpeCBJRSdzIHN0cmFuZ2UgYmVoYXZpb3Igd2l0aCBtYW5pcHVsYXRlZCB0ZXh0Tm9kZXMgIzg5ICovXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBjdXJyZW50Tm9kZSA9PT0gb2xkTm9kZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2hhZG93IERPTSBkZXRlY3RlZCwgc2FuaXRpemUgaXQgKi9cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuICAgICAgICBvbGROb2RlID0gY3VycmVudE5vZGU7XG4gICAgICB9XG4gICAgICBvbGROb2RlID0gbnVsbDtcblxuICAgICAgLyogSWYgd2Ugc2FuaXRpemVkIGBkaXJ0eWAgaW4tcGxhY2UsIHJldHVybiBpdC4gKi9cbiAgICAgIGlmIChJTl9QTEFDRSkge1xuICAgICAgICByZXR1cm4gZGlydHk7XG4gICAgICB9XG5cbiAgICAgIC8qIFJldHVybiBzYW5pdGl6ZWQgc3RyaW5nIG9yIERPTSAqL1xuICAgICAgaWYgKFJFVFVSTl9ET00pIHtcbiAgICAgICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgICAgICByZXR1cm5Ob2RlID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudC5jYWxsKGJvZHkub3duZXJEb2N1bWVudCk7XG4gICAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgICAgcmV0dXJuTm9kZS5hcHBlbmRDaGlsZChib2R5LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5Ob2RlID0gYm9keTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3QgfHwgQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3Rtb2QpIHtcbiAgICAgICAgICAvKlxuICAgICAgICAgICAgQWRvcHROb2RlKCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpbnRlcm5hbCBzdGF0ZSBpcyBub3QgcmVzZXRcbiAgICAgICAgICAgIChlLmcuIHRoZSBwYXN0IG5hbWVzIG1hcCBvZiBhIEhUTUxGb3JtRWxlbWVudCksIHRoaXMgaXMgc2FmZVxuICAgICAgICAgICAgaW4gdGhlb3J5IGJ1dCB3ZSB3b3VsZCByYXRoZXIgbm90IHJpc2sgYW5vdGhlciBhdHRhY2sgdmVjdG9yLlxuICAgICAgICAgICAgVGhlIHN0YXRlIHRoYXQgaXMgY2xvbmVkIGJ5IGltcG9ydE5vZGUoKSBpcyBleHBsaWNpdGx5IGRlZmluZWRcbiAgICAgICAgICAgIGJ5IHRoZSBzcGVjcy5cbiAgICAgICAgICAqL1xuICAgICAgICAgIHJldHVybk5vZGUgPSBpbXBvcnROb2RlLmNhbGwob3JpZ2luYWxEb2N1bWVudCwgcmV0dXJuTm9kZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybk5vZGU7XG4gICAgICB9XG4gICAgICB2YXIgc2VyaWFsaXplZEhUTUwgPSBXSE9MRV9ET0NVTUVOVCA/IGJvZHkub3V0ZXJIVE1MIDogYm9keS5pbm5lckhUTUw7XG5cbiAgICAgIC8qIFNlcmlhbGl6ZSBkb2N0eXBlIGlmIGFsbG93ZWQgKi9cbiAgICAgIGlmIChXSE9MRV9ET0NVTUVOVCAmJiBBTExPV0VEX1RBR1NbJyFkb2N0eXBlJ10gJiYgYm9keS5vd25lckRvY3VtZW50ICYmIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlICYmIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUgJiYgcmVnRXhwVGVzdChET0NUWVBFX05BTUUsIGJvZHkub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUpKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gJzwhRE9DVFlQRSAnICsgYm9keS5vd25lckRvY3VtZW50LmRvY3R5cGUubmFtZSArICc+XFxuJyArIHNlcmlhbGl6ZWRIVE1MO1xuICAgICAgfVxuXG4gICAgICAvKiBTYW5pdGl6ZSBmaW5hbCBzdHJpbmcgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICBzZXJpYWxpemVkSFRNTCA9IHN0cmluZ1JlcGxhY2Uoc2VyaWFsaXplZEhUTUwsIE1VU1RBQ0hFX0VYUFIkMSwgJyAnKTtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBFUkJfRVhQUiQxLCAnICcpO1xuICAgICAgICBzZXJpYWxpemVkSFRNTCA9IHN0cmluZ1JlcGxhY2Uoc2VyaWFsaXplZEhUTUwsIFRNUExJVF9FWFBSJDEsICcgJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChzZXJpYWxpemVkSFRNTCkgOiBzZXJpYWxpemVkSFRNTDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gb25jZVxuICAgICAqIHNldENvbmZpZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIERPTVB1cmlmeS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICAgIFNFVF9DT05GSUcgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgY29uZmlndXJhdGlvblxuICAgICAqIGNsZWFyQ29uZmlnXG4gICAgICpcbiAgICAgKi9cbiAgICBET01QdXJpZnkuY2xlYXJDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBDT05GSUcgPSBudWxsO1xuICAgICAgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyB2YWxpZC5cbiAgICAgKiBVc2VzIGxhc3Qgc2V0IGNvbmZpZywgaWYgYW55LiBPdGhlcndpc2UsIHVzZXMgY29uZmlnIGRlZmF1bHRzLlxuICAgICAqIGlzVmFsaWRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdGFnIFRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGF0dHIgQXR0cmlidXRlIG5hbWUuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQuIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAgICAgKi9cbiAgICBET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHIsIHZhbHVlKSB7XG4gICAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgICBpZiAoIUNPTkZJRykge1xuICAgICAgICBfcGFyc2VDb25maWcoe30pO1xuICAgICAgfVxuICAgICAgdmFyIGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmModGFnKTtcbiAgICAgIHZhciBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhhdHRyKTtcbiAgICAgIHJldHVybiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZEhvb2tcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIGFkZCBET01QdXJpZnkgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQsIGhvb2tGdW5jdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaG9va3NbZW50cnlQb2ludF0gPSBob29rc1tlbnRyeVBvaW50XSB8fCBbXTtcbiAgICAgIGFycmF5UHVzaChob29rc1tlbnRyeVBvaW50XSwgaG9va0Z1bmN0aW9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlSG9va1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgbW9yZSBhcmUgcHJlc2VudClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmVtb3ZlZChwb3BwZWQpIGhvb2tcbiAgICAgKi9cbiAgICBET01QdXJpZnkucmVtb3ZlSG9vayA9IGZ1bmN0aW9uIChlbnRyeVBvaW50KSB7XG4gICAgICBpZiAoaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5UG9wKGhvb2tzW2VudHJ5UG9pbnRdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlSG9va3NcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhbGwgRE9NUHVyaWZ5IGhvb2tzIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9va3MgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUhvb2tzID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICAgIGlmIChob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICBob29rc1tlbnRyeVBvaW50XSA9IFtdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVBbGxIb29rc1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGFsbCBET01QdXJpZnkgaG9va3NcbiAgICAgKlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVBbGxIb29rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhvb2tzID0ge307XG4gICAgfTtcbiAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICB9XG4gIHZhciBwdXJpZnkgPSBjcmVhdGVET01QdXJpZnkoKTtcblxuICByZXR1cm4gcHVyaWZ5O1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdXJpZnkuanMubWFwXG4iXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIl90eXBlb2YiLCJvYmoiLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiX3NldFByb3RvdHlwZU9mIiwibyIsInAiLCJPYmplY3QiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9jb25zdHJ1Y3QiLCJQYXJlbnQiLCJhcmdzIiwiQ2xhc3MiLCJSZWZsZWN0IiwiY29uc3RydWN0Iiwic2hhbSIsIlByb3h5IiwiQm9vbGVhbiIsInZhbHVlT2YiLCJjYWxsIiwiZSIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJhIiwicHVzaCIsImFwcGx5IiwiaW5zdGFuY2UiLCJGdW5jdGlvbiIsImJpbmQiLCJhcmd1bWVudHMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJhcnIiLCJBcnJheSIsImlzQXJyYXkiLCJfYXJyYXlMaWtlVG9BcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIml0ZXIiLCJmcm9tIiwiX2l0ZXJhYmxlVG9BcnJheSIsIm1pbkxlbiIsIm4iLCJ0b1N0cmluZyIsInNsaWNlIiwibmFtZSIsInRlc3QiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJUeXBlRXJyb3IiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJsZW4iLCJsZW5ndGgiLCJpIiwiYXJyMiIsImhhc093blByb3BlcnR5IiwiaXNGcm96ZW4iLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImZyZWV6ZSIsInNlYWwiLCJjcmVhdGUiLCJfcmVmIiwiZnVuIiwidGhpc1ZhbHVlIiwieCIsIkZ1bmMiLCJmdW5jIiwiYXJyYXlGb3JFYWNoIiwidW5hcHBseSIsImZvckVhY2giLCJhcnJheVBvcCIsInBvcCIsImFycmF5UHVzaCIsInN0cmluZ1RvTG93ZXJDYXNlIiwiU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJzdHJpbmdUb1N0cmluZyIsInN0cmluZ01hdGNoIiwibWF0Y2giLCJzdHJpbmdSZXBsYWNlIiwicmVwbGFjZSIsInN0cmluZ0luZGV4T2YiLCJpbmRleE9mIiwic3RyaW5nVHJpbSIsInRyaW0iLCJyZWdFeHBUZXN0IiwiUmVnRXhwIiwidHlwZUVycm9yQ3JlYXRlIiwiX2xlbjIiLCJfa2V5MiIsInRoaXNBcmciLCJfbGVuIiwiX2tleSIsImFkZFRvU2V0Iiwic2V0IiwiYXJyYXkiLCJ0cmFuc2Zvcm1DYXNlRnVuYyIsIl90cmFuc2Zvcm1DYXNlRnVuYyIsImwiLCJlbGVtZW50IiwibGNFbGVtZW50IiwiY2xvbmUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsIm5ld09iamVjdCIsImxvb2t1cEdldHRlciIsInByb3AiLCJkZXNjIiwiZ2V0IiwidmFsdWUiLCJjb25zb2xlIiwid2FybiIsImh0bWwkMSIsInN2ZyQxIiwic3ZnRmlsdGVycyIsInN2Z0Rpc2FsbG93ZWQiLCJtYXRoTWwkMSIsIm1hdGhNbERpc2FsbG93ZWQiLCJ0ZXh0IiwiaHRtbCIsInN2ZyIsIm1hdGhNbCIsInhtbCIsIk1VU1RBQ0hFX0VYUFIiLCJFUkJfRVhQUiIsIlRNUExJVF9FWFBSIiwiREFUQV9BVFRSIiwiQVJJQV9BVFRSIiwiSVNfQUxMT1dFRF9VUkkiLCJJU19TQ1JJUFRfT1JfREFUQSIsIkFUVFJfV0hJVEVTUEFDRSIsIkRPQ1RZUEVfTkFNRSIsIkNVU1RPTV9FTEVNRU5UIiwiZ2V0R2xvYmFsIiwid2luZG93IiwiY3JlYXRlRE9NUHVyaWZ5IiwidW5kZWZpbmVkIiwiRE9NUHVyaWZ5Iiwicm9vdCIsInZlcnNpb24iLCJyZW1vdmVkIiwiZG9jdW1lbnQiLCJub2RlVHlwZSIsImlzU3VwcG9ydGVkIiwib3JpZ2luYWxEb2N1bWVudCIsIkRvY3VtZW50RnJhZ21lbnQiLCJIVE1MVGVtcGxhdGVFbGVtZW50IiwiTm9kZSIsIkVsZW1lbnQiLCJOb2RlRmlsdGVyIiwiX3dpbmRvdyROYW1lZE5vZGVNYXAiLCJOYW1lZE5vZGVNYXAiLCJNb3pOYW1lZEF0dHJNYXAiLCJIVE1MRm9ybUVsZW1lbnQiLCJET01QYXJzZXIiLCJ0cnVzdGVkVHlwZXMiLCJFbGVtZW50UHJvdG90eXBlIiwiY2xvbmVOb2RlIiwiZ2V0TmV4dFNpYmxpbmciLCJnZXRDaGlsZE5vZGVzIiwiZ2V0UGFyZW50Tm9kZSIsInRlbXBsYXRlIiwiY3JlYXRlRWxlbWVudCIsImNvbnRlbnQiLCJvd25lckRvY3VtZW50IiwidHJ1c3RlZFR5cGVzUG9saWN5IiwiY3JlYXRlUG9saWN5Iiwic3VmZml4IiwiQVRUUl9OQU1FIiwiY3VycmVudFNjcmlwdCIsImhhc0F0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInBvbGljeU5hbWUiLCJjcmVhdGVIVE1MIiwiY3JlYXRlU2NyaXB0VVJMIiwic2NyaXB0VXJsIiwiXyIsIl9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kiLCJlbXB0eUhUTUwiLCJfZG9jdW1lbnQiLCJpbXBsZW1lbnRhdGlvbiIsImNyZWF0ZU5vZGVJdGVyYXRvciIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImltcG9ydE5vZGUiLCJkb2N1bWVudE1vZGUiLCJob29rcyIsImNyZWF0ZUhUTUxEb2N1bWVudCIsIlBBUlNFUl9NRURJQV9UWVBFIiwiTVVTVEFDSEVfRVhQUiQxIiwiRVJCX0VYUFIkMSIsIlRNUExJVF9FWFBSJDEiLCJEQVRBX0FUVFIkMSIsIkFSSUFfQVRUUiQxIiwiSVNfU0NSSVBUX09SX0RBVEEkMSIsIkFUVFJfV0hJVEVTUEFDRSQxIiwiQ1VTVE9NX0VMRU1FTlQkMSIsIklTX0FMTE9XRURfVVJJJDEiLCJBTExPV0VEX1RBR1MiLCJERUZBVUxUX0FMTE9XRURfVEFHUyIsImNvbmNhdCIsIkFMTE9XRURfQVRUUiIsIkRFRkFVTFRfQUxMT1dFRF9BVFRSIiwiQ1VTVE9NX0VMRU1FTlRfSEFORExJTkciLCJ0YWdOYW1lQ2hlY2siLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJhdHRyaWJ1dGVOYW1lQ2hlY2siLCJhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMiLCJGT1JCSURfVEFHUyIsIkZPUkJJRF9BVFRSIiwiQUxMT1dfQVJJQV9BVFRSIiwiQUxMT1dfREFUQV9BVFRSIiwiQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMiLCJBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIiLCJTQUZFX0ZPUl9URU1QTEFURVMiLCJTQUZFX0ZPUl9YTUwiLCJXSE9MRV9ET0NVTUVOVCIsIlNFVF9DT05GSUciLCJGT1JDRV9CT0RZIiwiUkVUVVJOX0RPTSIsIlJFVFVSTl9ET01fRlJBR01FTlQiLCJSRVRVUk5fVFJVU1RFRF9UWVBFIiwiU0FOSVRJWkVfRE9NIiwiU0FOSVRJWkVfTkFNRURfUFJPUFMiLCJLRUVQX0NPTlRFTlQiLCJJTl9QTEFDRSIsIlVTRV9QUk9GSUxFUyIsIkZPUkJJRF9DT05URU5UUyIsIkRFRkFVTFRfRk9SQklEX0NPTlRFTlRTIiwiREFUQV9VUklfVEFHUyIsIkRFRkFVTFRfREFUQV9VUklfVEFHUyIsIlVSSV9TQUZFX0FUVFJJQlVURVMiLCJERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMiLCJNQVRITUxfTkFNRVNQQUNFIiwiU1ZHX05BTUVTUEFDRSIsIkhUTUxfTkFNRVNQQUNFIiwiTkFNRVNQQUNFIiwiSVNfRU1QVFlfSU5QVVQiLCJBTExPV0VEX05BTUVTUEFDRVMiLCJERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUyIsIlNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMiLCJDT05GSUciLCJmb3JtRWxlbWVudCIsImlzUmVnZXhPckZ1bmN0aW9uIiwidGVzdFZhbHVlIiwiX3BhcnNlQ29uZmlnIiwiY2ZnIiwiQUREX1VSSV9TQUZFX0FUVFIiLCJBRERfREFUQV9VUklfVEFHUyIsIkFMTE9XRURfVVJJX1JFR0VYUCIsIkFERF9UQUdTIiwiQUREX0FUVFIiLCJ0YWJsZSIsInRib2R5IiwiTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIiwiSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMiLCJDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTIiwiQUxMX1NWR19UQUdTIiwiQUxMX01BVEhNTF9UQUdTIiwiX2ZvcmNlUmVtb3ZlIiwibm9kZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIm91dGVySFRNTCIsInJlbW92ZSIsIl9yZW1vdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGVOb2RlIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiX2luaXREb2N1bWVudCIsImRpcnR5IiwiZG9jIiwibGVhZGluZ1doaXRlc3BhY2UiLCJtYXRjaGVzIiwiZGlydHlQYXlsb2FkIiwicGFyc2VGcm9tU3RyaW5nIiwiZG9jdW1lbnRFbGVtZW50IiwiY3JlYXRlRG9jdW1lbnQiLCJpbm5lckhUTUwiLCJib2R5IiwiaW5zZXJ0QmVmb3JlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwiX2NyZWF0ZUl0ZXJhdG9yIiwiU0hPV19FTEVNRU5UIiwiU0hPV19DT01NRU5UIiwiU0hPV19URVhUIiwiU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIiwiU0hPV19DREFUQV9TRUNUSU9OIiwiX2lzQ2xvYmJlcmVkIiwiZWxtIiwibm9kZU5hbWUiLCJ0ZXh0Q29udGVudCIsImF0dHJpYnV0ZXMiLCJuYW1lc3BhY2VVUkkiLCJoYXNDaGlsZE5vZGVzIiwiX2lzTm9kZSIsIl9leGVjdXRlSG9vayIsImVudHJ5UG9pbnQiLCJjdXJyZW50Tm9kZSIsImRhdGEiLCJob29rIiwiX3Nhbml0aXplRWxlbWVudHMiLCJ0YWdOYW1lIiwiYWxsb3dlZFRhZ3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIl9iYXNpY0N1c3RvbUVsZW1lbnRUZXN0IiwiY2hpbGRDbG9uZSIsIl9fcmVtb3ZhbENvdW50IiwicGFyZW50IiwicGFyZW50VGFnTmFtZSIsIl9jaGVja1ZhbGlkTmFtZXNwYWNlIiwiX2lzVmFsaWRBdHRyaWJ1dGUiLCJsY1RhZyIsImxjTmFtZSIsIl9zYW5pdGl6ZUF0dHJpYnV0ZXMiLCJhdHRyIiwiaG9va0V2ZW50IiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJrZWVwQXR0ciIsImFsbG93ZWRBdHRyaWJ1dGVzIiwiX2F0dHIiLCJmb3JjZUtlZXBBdHRyIiwiZ2V0QXR0cmlidXRlVHlwZSIsInNldEF0dHJpYnV0ZU5TIiwiX3Nhbml0aXplU2hhZG93RE9NIiwiZnJhZ21lbnQiLCJzaGFkb3dOb2RlIiwic2hhZG93SXRlcmF0b3IiLCJuZXh0Tm9kZSIsInNhbml0aXplIiwiaW1wb3J0ZWROb2RlIiwib2xkTm9kZSIsInJldHVybk5vZGUiLCJ0b1N0YXRpY0hUTUwiLCJhcHBlbmRDaGlsZCIsImZpcnN0Q2hpbGQiLCJub2RlSXRlcmF0b3IiLCJzaGFkb3dyb290Iiwic2hhZG93cm9vdG1vZCIsInNlcmlhbGl6ZWRIVE1MIiwiZG9jdHlwZSIsInNldENvbmZpZyIsImNsZWFyQ29uZmlnIiwiaXNWYWxpZEF0dHJpYnV0ZSIsInRhZyIsImFkZEhvb2siLCJob29rRnVuY3Rpb24iLCJyZW1vdmVIb29rIiwicmVtb3ZlSG9va3MiLCJyZW1vdmVBbGxIb29rcyIsImZhY3RvcnkiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/674.bundle.js.LICENSE.txt b/674.bundle.js.LICENSE.txt
new file mode 100644
index 0000000..de117d8
--- /dev/null
+++ b/674.bundle.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! @license DOMPurify 2.5.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.5.7/LICENSE */
diff --git a/685.bundle.js b/685.bundle.js
new file mode 100644
index 0000000..db0d55b
--- /dev/null
+++ b/685.bundle.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunkcboy_blog=self.webpackChunkcboy_blog||[]).push([[685],{685:function(e,o,p){p.r(o),p.d(o,{default:function(){return a}});var c=p(762);const t={class:"component-webpack"},s={};var a=(0,p(314).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原理 文章, 下面就提一提我最近遇到的一个很神奇的问题吧
想象抖一抖树,枯萎的叶子就会脱落。 这里指的是把没有用到的代码删除掉,从而减小文件的大小。通过这一优化,在引用多个第三方库时,能够大大的减少你的文件大小,但请确定这个包是没有副作用的。
什么是副作用? 就是在导入时会自行运行一段函数,从而改变了 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjg1LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiNktBQWVBLE1BQU0scUJDQ2ZDLEVBQVMsQ0FBQyxFQUtoQixPQUZpQyxFLE9BQUEsR0FBZ0JBLEVBQVEsQ0FBQyxDQUFDLFMsZ0NESmpEQyxFQUFBQSxFQUFBQSxJQTZDSixNQTdDSUMsRUE2Q0pDLEVBQUEsS0FBQUEsRUFBQSxLQTdDTkMsRUFBQUEsRUFBQUEsSUFBQSxpcUUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vd2VicGFjay5tZCIsIndlYnBhY2s6Ly9jYm95LWJsb2cvLi4vLi4vYmxvZ3MvbWFya2Rvd24vd2VicGFjay5tZD9iNGZjIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT48ZGl2IGNsYXNzPVwiY29tcG9uZW50LXdlYnBhY2tcIj48aDQ+5LiAICB3ZWJwYWNrIOaYr+S7gOS5iO+8nzwvaDQ+XG48cD7lroPmmK/kuIDkuKrmiZPljIXlt6XlhbfjgIIg5ZmX77yM5a6M5ZWm77yfPC9wPlxuPHA+5p2l77yM5oiR5Lus55yL5a6Y5pa55qaC5b+1OiAgd2VicGFjayDmmK/kuIDkuKrnjrDku6MgSmF2YVNjcmlwdCDlupTnlKjnqIvluo/nmoTpnZnmgIHmqKHlnZfmiZPljIXlt6XlhbfjgILlvZMgd2VicGFjayDlpITnkIblupTnlKjnqIvluo/ml7bvvIzlroPkvJrlnKjlhoXpg6jmnoTlu7rkuIDkuKog5L6d6LWW5Zu+KGRlcGVuZGVuY3kgZ3JhcGgp77yM5q2k5L6d6LWW5Zu+5Lya5pig5bCE6aG555uu5omA6ZyA55qE5q+P5Liq5qih5Z2X77yM5bm255Sf5oiQ5LiA5Liq5oiW5aSa5LiqIGJ1bmRsZeOAgjwvcD5cbjxwPuWGhemDqOWmguS9leaehOW7uuS4gOS4quS+nei1luWbvu+8jOaIkeS7rOefpemBkyB3ZWJwYWNrIOS8mumFjee9ruS4gOS4quWFpeWPo++8jOi/meWwseaYr+S7jui/meWFpeWPo+aWh+S7tuW8gOWni++8jCDmib7liLDmiYDmnInooqvkvp3otZbliLDnmoTmlofku7bvvIzmr5TlpoLlhbbku5YganMgLyBpbWFnZSAvIGpzb24g5paH5Lu2562J77yM54S25ZCO6YCa6L+HIGxvYWRlciDlr7nov5nkupvmlofku7bov5vooYzlpITnkIbjgIHnvJbor5HjgIHmiZPljIXjgIHkvJjljJbvvIznlJ/miJDkuIDkuKogYnVuZGxlIOaIluiAheWkmuS4qiBidW5kbGXjgII8L3A+XG48aDQ+5a6D55qE5Y6f55CGPC9oND5cbjxwPumAmui/h+S7peS4iu+8jOS4u+imgeWwseaYr+aJvuS+nei1liwg6YCa6L+H6YWN572u5aSE55CG55u45bqU546v5aKD77yM5qC55o2u5L2g55qE6ZyA6KaB6YWN572u5o+S5Lu26L+b6KGM5LyY5YyW77yI5aaCIHByb2ZpbGzjgIFiYWJlbOOAgSBtaW5pU2l6ZSBldGMpIOaJk+WMheWHuuaWh+S7tu+8jOWPr+S7peaUvuWIsOacjeWKoeWZqOS4iui/kOihjOOAgjwvcD5cbjxwPuWFs+S6juaJvuS+nei1lu+8jOWPr+S7peaDs+WIsOWFs+S6juaooeWdl+WMlueahOivreazlTogaW1wb3J0IOOAgXJlcXVpcmXjgIFAaW1wb3J0IGV0Y++8jCDpgJrov4fop6PmnpDlr7nlupTnmoTor63ms5Xlr7vmib7nm7jlupTnmoTkvp3otZbjgILnhLblkI7pgJrov4for7vlj5bkvp3otZbliLDnmoTmlofku7bvvIzmoLnmja7lr7nlupTnmoQgbG9hZGVyIOi/m+ihjOWkhOeQhuaWh+S7tu+8jOacgOWQjuagueaNruS9oOeahOaPkuS7tumFjee9ru+8jOWIhuWJsu+8jOWOi+e8qeaIluazqOWFpeetie+8jOagueaNriBvdXRwdXQgY29uZmln6L6T5Ye65Yiw5a+55bqU55qE5paH5Lu25aS544CCPC9wPlxuPHA+6L+Z6YeM5o6o6I2Q5LiA56+HIDxhIGhyZWY9XCJodHRwczovL2p1ZWppbi5pbS9lbnRyeS81YjBlM2ViYTUxODgyNTE1MzQzNzk2MTVcIj53ZWJwYWNr5Y6f55CGPC9hPiDmlofnq6AsIOS4i+mdouWwseaPkOS4gOaPkOaIkeacgOi/kemBh+WIsOeahOS4gOS4quW+iOelnuWlh+eahOmXrumimOWQpzwvcD5cbjxoND7lhbPkuo4gPGEgaHJlZj1cImh0dHBzOi8vd2VicGFjay5kb2NzY2hpbmEub3JnL2d1aWRlcy90cmVlLXNoYWtpbmcvXCI+dHJlZSBzaGFraW5nPC9hPjwvaDQ+XG48cD7mg7PosaHmipbkuIDmipbmoJHvvIzmnq/okI7nmoTlj7blrZDlsLHkvJrohLHokL3jgIIg6L+Z6YeM5oyH55qE5piv5oqK5rKh5pyJ55So5Yiw55qE5Luj56CB5Yig6Zmk5o6J77yM5LuO6ICM5YeP5bCP5paH5Lu255qE5aSn5bCP44CC6YCa6L+H6L+Z5LiA5LyY5YyW77yM5Zyo5byV55So5aSa5Liq56ys5LiJ5pa55bqT5pe277yM6IO95aSf5aSn5aSn55qE5YeP5bCR5L2g55qE5paH5Lu25aSn5bCP77yM5L2G6K+356Gu5a6a6L+Z5Liq5YyF5piv5rKh5pyJ5Ymv5L2c55So55qE44CCPC9wPlxuPGJsb2NrcXVvdGU+XG48cD7ku4DkuYjmmK/lia/kvZznlKg/XG7lsLHmmK/lnKjlr7zlhaXml7bkvJroh6rooYzov5DooYzkuIDmrrXlh73mlbDvvIzku47ogIzmlLnlj5jkuoYgd2luZG93IOWPmOmHj+WViuaIluiAheWFtuS7lueahOWPmOmHj+S7peS+m+WvvOWFpeeahOWMheiDveato+W4uOi/kOihjO+8jCDogIzkuI3mmK/lj6rljZXljZUgZXhwb3J0IOS6huWPmOmHj+OAgjwvcD5cbjwvYmxvY2txdW90ZT5cbjxwPuWug+aYr+S+nei1luS6jiBlczIwMTUg55qEIDxjb2RlPumdmeaAgeWvvOWFpeWvvOWHuiggaW1wb3J0IC8gZXhwb3J0KTwvY29kZT7jgILlnKjmiZPljIXml7blsLHkvJrpgJrov4cgaW1wb3J0IOehruWumuW8leeUqOWMheeahCBleHBvcnQg5a+85Ye655qE5p+Q5LiA5Liq5Y+Y6YeP5LmL5LiA77yMIOWcqOWRiuefpeayoeacieWJr+S9nOeUqOeahOaDheWGteS4i++8jOWIoOmZpOaOieayoeacieeUqOWIsOeahOWFtuS7lueahOWvvOWHuuS7o+eggeOAgjwvcD5cbjxibG9ja3F1b3RlPlxuPHA+6Z2Z5oCB5a+85YWl5piv5oyH5LiA5byA5aeL5bCx6buY6K6k5Yqg6L296L+Z5Liq5paH5Lu277yM6ICM5LiN5piv5LiA5q2l5LiA5q2l5omn6KGM5Luj56CB5Yik5pat6YC76L6R77yM5Y675a+85YWl5a+55bqU5paH5Lu2PC9wPlxuPC9ibG9ja3F1b3RlPlxuPHA+d2VicGFjayDlnKjnlJ/miJDnjq/looPkuIvvvIzpu5jorqTmiZPlvIDmoJHmipbliqjphY3nva4sIOWmguS4i+mFjee9ruOAgjwvcD5cbjxwcmUgdi1wcmU9XCJcIj48Y29kZT5vcHRpbWl6YXRpb27vvJoge1xuXHRwcm92aWRlZEV4cG9ydHM6IHRydWUsXG5cdHVzZWRFeHBvcnRzOiB0cnVlLFxuXHRzaWRlRWZmZWN0czogdHJ1ZSxcblx0Y29uY2F0ZW5hdGVNb2R1bGVzOiB0cnVlLFxuIH1cbjwvY29kZT48L3ByZT5cbjxwPjxjb2RlPnByb3ZpZGVkRXhwb3J0czwvY29kZT4g5byA5ZCvIGV4cG9ydCDlr7zlh7rmlLbpm4bvvJtcbjxjb2RlPiB1c2VkRXhwb3J0dHM8L2NvZGU+IOWRiuiviXdlYnBhY2vnoa7lrprmr4/kuKrmqKHlnZfnmoTlt7Lkvb/nlKjlr7zlh7rvvJtcbjxjb2RlPiBjb25jYXRlbmF0ZU1vZHVsZXM8L2NvZGU+ICDlkYror4l3ZWJwYWNr5p+l5om+5qih5Z2X5Zu+55qE5ZCE5Liq6YOo5YiG77yM6L+Z5Lqb6YOo5YiG5Y+v5Lul5a6J5YWo5Zyw6L+e5o6l5oiQ5LiA5Liq5qih5Z2X77ybXG48Y29kZT5zaWRlRWZmZWN0czwvY29kZT4g5ZGK6K+Jd2VicGFja+ivhuWIqyBzaWRlRWZmZWN0cyDmoIflv5fnmoQgcGFja2FnZS5qc29uIOaIluinhOWImeS7pei3s+i/h+aooeWdl++8jOi/meS6m+aooeWdl+WcqOacquS9v+eUqOWvvOWHuuaXtuiiq+agh+iusOS4uuS4jeWMheWQq+WJr+S9nOeUqO+8jCDliJnlj6/ku6Xmiorml6Dlia/kvZznlKjnmoTmnKrkvb/nlKjnmoTlr7zlh7rov5vooYzliKDpmaTjgII8L3A+XG48cD7miYDku6XlpoLmnpzkvaDnmoTljIXml6Dlia/kvZznlKjvvIzmjqjojZDlnKggcGFja2FnZS5qc29uIOiuvue9riA8Y29kZT5zaWRlRWZmZWN0czogZmFsc2U8L2NvZGU+IOW8gOWQr+agkeaKluWKqOOAglxu5rOo5oSPLCDlroPkvJrliKDmjonmoLflvI/mlofku7bvvIzlm6DkuLrmoLflvI/mlofku7bmmK/msqHmnIkgZXhwb3J0IOeahOOAguaJgOS7peaIkeS7rOmcgOimgeWjsOaYjuagt+W8j+aWh+S7tuaYr+acieWJr+S9nOeUqOeahOOAglxu5ZyoIHBhY2thZ2UuanNvbiDkuK3orr7nva7vvJo8L3A+XG48cHJlIHYtcHJlPVwiXCI+PGNvZGU+c2lkZUVmZmVjdHM6IFtcblx0JyouY3NzJ1xuXVxuPC9jb2RlPjwvcHJlPlxuPGJsb2NrcXVvdGU+XG48cD7mgLvnu5PvvIzkuLrkuobliKnnlKjmoJHmnKjmkYfmmYPvvIzkvaDlv4XpobvvvJpcbjEg5L2/55SoRVMyMDE15qih5Z2X6K+t5rOVICjphY3nva4gYmFiZWwg56aB5q2i6L2s5LmJIGVzNiDmqKHlnZfor63kuYnvvIlcbjIg5bCGXCJzaWRlRWZmZWN0c1wi5bGe5oCn5re75Yqg5Yiw6aG555uu55qEIHBhY2thZ2UuanNvbuaWh+S7tuS4reOAglxuMyDphY3lkIjljovnvKnlt6XlhbfkuIDotbfkvb/nlKg8L3A+XG48L2Jsb2NrcXVvdGU+XG48cD48YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3RyZWUtc2hha2luZy1jc3NcIj5kZW1vPC9hPlxu6YCa6L+H6YWN572uICA8Y29kZT53ZWJwYWNrLnByb2QuanM8L2NvZGU+IHNpZGVFZmZlY3RzIOWAvO+8jCDkvaDlj6/ku6XnnIvliLAgYnVpbGQg5pe2IG1haW4uanMg5paH5Lu255qE5aSn5bCP5Y+R55Sf5pS55Y+Y44CCPC9wPlxuPC9kaXY+PC90ZW1wbGF0ZT4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi93ZWJwYWNrLm1kP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTcxODVlYWMwXCJcbmNvbnN0IHNjcmlwdCA9IHt9XG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS92dWUtbG9hZGVyQDE3LjQuMl9AdnVlK2NvbXBpbGVyLXNmY0AzLjUuMTJfdnVlQDMuNS4xMl90eXBlc2NyaXB0QDUuNi4zX193ZWJwYWNrQDUuOTUuMF93ZWJwYWNrLWNsaUA1LjEuNF8vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdXSlcblxuZXhwb3J0IGRlZmF1bHQgX19leHBvcnRzX18iXSwibmFtZXMiOlsiY2xhc3MiLCJzY3JpcHQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2hvaXN0ZWRfMSIsIl9jYWNoZSIsIl9jcmVhdGVTdGF0aWNWTm9kZSJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/731.bundle.js b/692.bundle.js
similarity index 57%
rename from 731.bundle.js
rename to 692.bundle.js
index de29a2f..d6243f8 100644
--- a/731.bundle.js
+++ b/692.bundle.js
@@ -1,2 +1,2 @@
-"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[731],{731:(t,n,s)=>{s.r(n),s.d(n,{default:()=>e});const e="### 购买服务器\n\n学生购买可以使用阿里云优惠专享, 每个月只要9.9 就好了。这里我用的是学生优惠,机型内存什么都限定好了的。所以- - 没什么可以说的。关于国内外服务器的区别就是,如果你购买了国外的服务器,就可以在云服务器上搭梯子访问国外的网站,也就是翻墙了。\n\n### 安装环境\n\n因为服务器默认 linux 系统,所以这里讲怎么配置 linux 云服务环境。 \n我第一次使用的时候,还以为是要去安装一个界面化桌面,以便我这个命令小白可以操作。但是,对于只有2G 的内存来说安装了之后将会很卡很卡。后来我问学长,他说不要安装界面化,使用命令就好了。\n\n首先关于远程服务器的登录, 默认系统的用户名是 root, 然后登录密码可以在控制台进行修改。如下图点击重置密码。\n![重置密码处](https://img-blog.csdn.net/20180107170054918?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) \n\n重置之后,然后点击远程连接,就可以连接登录到你的服务器上了。这里要将一点,如果你是 mac 电脑的话,可以在你的电脑上通过 ssh 登录到你的服务器。 命令如下:\n`ssh root@你的公网IP`,比如 `ssh root@120.78.32.12`\n然后输入密码即可连接成功。\n\n![登录成功图](https://img-blog.csdn.net/20180107170503333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n接下来在终端中输入命令。配置环境。如果你是配置 java 环境,那么可以去谷歌一下如何在 linux 中配置 java 环境,这里我是配置的 node 环境,就讲一下如何配置 node 环境以及 npm。\n\n这里我用的是源码安装。首先安装 node 编译依赖的第三方模块\n`yum -y install gcc make gcc-c++ openssl-devel`\n\n然后下载 node 的源码包\n![这里写图片描述](https://img-blog.csdn.net/20180107171300036?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\nnode 官网的源码 包。\n`wget https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz`\n\n你下载的时候可以手动改成当前最新版本。下载后,进行解压 `tar -zxvf node-v8.9.4.tar.gz`, 然后进入解压后的文件夹 ` cd node-v8.9.4`, 依次\n` ./configure`\n` make`\n`sudo make install`\n这里编译时间会有点久,请耐心等待- -\n查看安装成功\n![这里写图片描述](https://img-blog.csdn.net/20180107172311684?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n安装 npm\n同样下载 npm 包\n`wget http://nodejs.org/dist/npm/npm-1.4.9.zip`\n解压 `tar -zxvf npm-1.4.9.tgz`\n查看是否安装成功 `npm -v`\n\n这就是 node 环境配置了, 然后就是 mysql 数据库。\n[http://blog.csdn.net/win7system/article/details/53579500](http://blog.csdn.net/win7system/article/details/53579500)\n\n关于项目的上传,如果你本地编写了代码,想上传至服务器,第一个方式,可以是使用 ftp 上传文件。 第二个方式,就是在你的服务器上搭建一个 git 服务器,通过从服务器推送和克隆项目来获取文件。这里我使用的是第二种方法,参见教程:\n[https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000)\n这里注意一下, 关于 设置 ssh 登录,一定要把创建的 .ssh 文件放到你创建的用户下,如我这里是 git 用户,路径就是\n![这里写图片描述](https://img-blog.csdn.net/20180107174529969?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n放置在正确位置之后,还要注意项目的归属者也要是 git 用户,这样才会在 git 用户里匹配到对应的 ssh key。也就是下面这一个步骤\n![这里写图片描述](https://img-blog.csdn.net/20180107174749168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n还有一点要注意的就是,你再本地推送了代码上 git 服务器之后,想要在云服务器上获取到代码, 需要在服务器上再次克隆 `git clone git@server:/srv/sample.git` 项目,git pull 获取到代码。 这里也可以通过自己配置 git 服务器的钩子函数,使其自动更新代码,我还没配置,就先不说了 - -。\n\n好了,现在现在基本环境配置好了就可以开始开发你的项目啦。\n\n另外附: \n项目在服务器上启动了,发现在本地电脑无法通过 ip 访问,那么可能是你的端口号没有开放,需要去服务器上设置安全组。\n具体添加方法 ,以及其他一些关于服务器的配置,都可以随时点击右侧的 **点我提问**,像云博士提问。 = =\n![这里写图片描述](https://img-blog.csdn.net/20180107175548703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)"}}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMxLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsczNHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2FsaXl1bi1zZXJ2ZXIubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyMg6LSt5Lmw5pyN5Yqh5ZmoXFxuXFxu5a2m55Sf6LSt5Lmw5Y+v5Lul5L2/55So6Zi/6YeM5LqR5LyY5oOg5LiT5Lqr77yMIOavj+S4quaciOWPquimgTkuOSDlsLHlpb3kuobjgILov5nph4zmiJHnlKjnmoTmmK/lrabnlJ/kvJjmg6DvvIzmnLrlnovlhoXlrZjku4DkuYjpg73pmZDlrprlpb3kuobnmoTjgILmiYDku6UtIC0g5rKh5LuA5LmI5Y+v5Lul6K+055qE44CC5YWz5LqO5Zu95YaF5aSW5pyN5Yqh5Zmo55qE5Yy65Yir5bCx5piv77yM5aaC5p6c5L2g6LSt5Lmw5LqG5Zu95aSW55qE5pyN5Yqh5Zmo77yM5bCx5Y+v5Lul5Zyo5LqR5pyN5Yqh5Zmo5LiK5pCt5qKv5a2Q6K6/6Zeu5Zu95aSW55qE572R56uZ77yM5Lmf5bCx5piv57+75aKZ5LqG44CCXFxuXFxuIyMjIOWuieijheeOr+Wig1xcblxcbuWboOS4uuacjeWKoeWZqOm7mOiupCBsaW51eCDns7vnu5/vvIzmiYDku6Xov5nph4zorrLmgI7kuYjphY3nva4gbGludXgg5LqR5pyN5Yqh546v5aKD44CCIFxcbuaIkeesrOS4gOasoeS9v+eUqOeahOaXtuWAme+8jOi/mOS7peS4uuaYr+imgeWOu+WuieijheS4gOS4queVjOmdouWMluahjOmdou+8jOS7peS+v+aIkei/meS4quWRveS7pOWwj+eZveWPr+S7peaTjeS9nOOAguS9huaYr++8jOWvueS6juWPquaciTJHIOeahOWGheWtmOadpeivtOWuieijheS6huS5i+WQjuWwhuS8muW+iOWNoeW+iOWNoeOAguWQjuadpeaIkemXruWtpumVv++8jOS7luivtOS4jeimgeWuieijheeVjOmdouWMlu+8jOS9v+eUqOWRveS7pOWwseWlveS6huOAglxcblxcbummluWFiOWFs+S6jui/nOeoi+acjeWKoeWZqOeahOeZu+W9le+8jCDpu5jorqTns7vnu5/nmoTnlKjmiLflkI3mmK8gcm9vdCwg54S25ZCO55m75b2V5a+G56CB5Y+v5Lul5Zyo5o6n5Yi25Y+w6L+b6KGM5L+u5pS544CC5aaC5LiL5Zu+54K55Ye76YeN572u5a+G56CB44CCXFxuIVvph43nva7lr4bnoIHlpIRdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzAwNTQ5MTg/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdCkgXFxuXFxu6YeN572u5LmL5ZCO77yM54S25ZCO54K55Ye76L+c56iL6L+e5o6l77yM5bCx5Y+v5Lul6L+e5o6l55m75b2V5Yiw5L2g55qE5pyN5Yqh5Zmo5LiK5LqG44CC6L+Z6YeM6KaB5bCG5LiA54K577yM5aaC5p6c5L2g5pivIG1hYyDnlLXohJHnmoTor53vvIzlj6/ku6XlnKjkvaDnmoTnlLXohJHkuIrpgJrov4cgc3NoIOeZu+W9leWIsOS9oOeahOacjeWKoeWZqOOAgiDlkb3ku6TlpoLkuIvvvJpcXG5gc3NoIHJvb3RA5L2g55qE5YWs572RSVBg77yM5q+U5aaCIGBzc2ggcm9vdEAxMjAuNzguMzIuMTJgXFxu54S25ZCO6L6T5YWl5a+G56CB5Y2z5Y+v6L+e5o6l5oiQ5Yqf44CCXFxuXFxuIVvnmbvlvZXmiJDlip/lm75dKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzA1MDMzMzM/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG5cXG7mjqXkuIvmnaXlnKjnu4jnq6/kuK3ovpPlhaXlkb3ku6TjgILphY3nva7njq/looPjgILlpoLmnpzkvaDmmK/phY3nva4gamF2YSDnjq/looPvvIzpgqPkuYjlj6/ku6XljrvosLfmrYzkuIDkuIvlpoLkvZXlnKggbGludXgg5Lit6YWN572uIGphdmEg546v5aKD77yM6L+Z6YeM5oiR5piv6YWN572u55qEIG5vZGUg546v5aKD77yM5bCx6K6y5LiA5LiL5aaC5L2V6YWN572uIG5vZGUg546v5aKD5Lul5Y+KIG5wbeOAglxcblxcbui/memHjOaIkeeUqOeahOaYr+a6kOeggeWuieijheOAgummluWFiOWuieijhSBub2RlIOe8luivkeS+nei1lueahOesrOS4ieaWueaooeWdl1xcbmB5dW0gLXkgaW5zdGFsbCBnY2MgbWFrZSBnY2MtYysrIG9wZW5zc2wtZGV2ZWxgXFxuXFxu54S25ZCO5LiL6L29IG5vZGUg55qE5rqQ56CB5YyFXFxuIVvov5nph4zlhpnlm77niYfmj4/ov7BdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzEzMDAwMzY/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG5cXG5ub2RlIOWumOe9keeahOa6kOeggSDljIXjgIJcXG5gd2dldCBodHRwczovL25vZGVqcy5vcmcvZGlzdC92OC45LjQvbm9kZS12OC45LjQudGFyLmd6YFxcblxcbuS9oOS4i+i9veeahOaXtuWAmeWPr+S7peaJi+WKqOaUueaIkOW9k+WJjeacgOaWsOeJiOacrOOAguS4i+i9veWQju+8jOi/m+ihjOino+WOiyBgdGFyIC16eHZmIG5vZGUtdjguOS40LnRhci5nemAsIOeEtuWQjui/m+WFpeino+WOi+WQjueahOaWh+S7tuWkuSBgIGNkIG5vZGUtdjguOS40YCwg5L6d5qyhXFxuYCAgLi9jb25maWd1cmVgXFxuYCAgbWFrZWBcXG5gc3VkbyBtYWtlIGluc3RhbGxgXFxu6L+Z6YeM57yW6K+R5pe26Ze05Lya5pyJ54K55LmF77yM6K+36ICQ5b+D562J5b6FLSAtXFxu5p+l55yL5a6J6KOF5oiQ5YqfXFxuIVvov5nph4zlhpnlm77niYfmj4/ov7BdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzIzMTE2ODQ/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG5cXG7lronoo4UgbnBtXFxu5ZCM5qC35LiL6L29IG5wbSDljIVcXG5gd2dldCBodHRwOi8vbm9kZWpzLm9yZy9kaXN0L25wbS9ucG0tMS40LjkuemlwYFxcbuino+WOiyBgdGFyIC16eHZmIG5wbS0xLjQuOS50Z3pgXFxu5p+l55yL5piv5ZCm5a6J6KOF5oiQ5YqfIGBucG0gLXZgXFxuXFxu6L+Z5bCx5pivIG5vZGUg546v5aKD6YWN572u5LqG77yMIOeEtuWQjuWwseaYryBteXNxbCDmlbDmja7lupPjgIJcXG5baHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2luN3N5c3RlbS9hcnRpY2xlL2RldGFpbHMvNTM1Nzk1MDBdKGh0dHA6Ly9ibG9nLmNzZG4ubmV0L3dpbjdzeXN0ZW0vYXJ0aWNsZS9kZXRhaWxzLzUzNTc5NTAwKVxcblxcbuWFs+S6jumhueebrueahOS4iuS8oO+8jOWmguaenOS9oOacrOWcsOe8luWGmeS6huS7o+egge+8jOaDs+S4iuS8oOiHs+acjeWKoeWZqO+8jOesrOS4gOS4quaWueW8j++8jOWPr+S7peaYr+S9v+eUqCBmdHAg5LiK5Lyg5paH5Lu244CCIOesrOS6jOS4quaWueW8j++8jOWwseaYr+WcqOS9oOeahOacjeWKoeWZqOS4iuaQreW7uuS4gOS4qiBnaXQg5pyN5Yqh5Zmo77yM6YCa6L+H5LuO5pyN5Yqh5Zmo5o6o6YCB5ZKM5YWL6ZqG6aG555uu5p2l6I635Y+W5paH5Lu244CC6L+Z6YeM5oiR5L2/55So55qE5piv56ys5LqM56eN5pa55rOV77yM5Y+C6KeB5pWZ56iL77yaXFxuW2h0dHBzOi8vd3d3LmxpYW94dWVmZW5nLmNvbS93aWtpLzAwMTM3Mzk1MTYzMDU5Mjk2MDZkZDE4MzYxMjQ4NTc4YzY3YjgwNjdjOGMwMTdiMDAwLzAwMTM3NTgzNzcwMzYwNTc5YmM0YjQ1OGYwNDRjZTdhZmVkM2RmNTc5MTIzZWNhMDAwXShodHRwczovL3d3dy5saWFveHVlZmVuZy5jb20vd2lraS8wMDEzNzM5NTE2MzA1OTI5NjA2ZGQxODM2MTI0ODU3OGM2N2I4MDY3YzhjMDE3YjAwMC8wMDEzNzU4Mzc3MDM2MDU3OWJjNGI0NThmMDQ0Y2U3YWZlZDNkZjU3OTEyM2VjYTAwMClcXG7ov5nph4zms6jmhI/kuIDkuIvvvIwg5YWz5LqOIOiuvue9riBzc2gg55m75b2V77yM5LiA5a6a6KaB5oqK5Yib5bu655qEIC5zc2gg5paH5Lu25pS+5Yiw5L2g5Yib5bu655qE55So5oi35LiL77yM5aaC5oiR6L+Z6YeM5pivIGdpdCDnlKjmiLfvvIzot6/lvoTlsLHmmK9cXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDEwNzE3NDUyOTk2OT93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KVxcblxcbuaUvue9ruWcqOato+ehruS9jee9ruS5i+WQju+8jOi/mOimgeazqOaEj+mhueebrueahOW9kuWxnuiAheS5n+imgeaYryBnaXQg55So5oi377yM6L+Z5qC35omN5Lya5ZyoIGdpdCDnlKjmiLfph4zljLnphY3liLDlr7nlupTnmoQgc3NoIGtleeOAguS5n+WwseaYr+S4i+mdoui/meS4gOS4quatpemqpFxcbiFb6L+Z6YeM5YaZ5Zu+54mH5o+P6L+wXShodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTgwMTA3MTc0NzQ5MTY4P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3QpXFxuXFxu6L+Y5pyJ5LiA54K56KaB5rOo5oSP55qE5bCx5piv77yM5L2g5YaN5pys5Zyw5o6o6YCB5LqG5Luj56CB5LiKIGdpdCDmnI3liqHlmajkuYvlkI7vvIzmg7PopoHlnKjkupHmnI3liqHlmajkuIrojrflj5bliLDku6PnoIHvvIwg6ZyA6KaB5Zyo5pyN5Yqh5Zmo5LiK5YaN5qyh5YWL6ZqGIGBnaXQgY2xvbmUgZ2l0QHNlcnZlcjovc3J2L3NhbXBsZS5naXRgIOmhueebru+8jGdpdCBwdWxsIOiOt+WPluWIsOS7o+eggeOAgiDov5nph4zkuZ/lj6/ku6XpgJrov4foh6rlt7HphY3nva4gZ2l0IOacjeWKoeWZqOeahOmSqeWtkOWHveaVsO+8jOS9v+WFtuiHquWKqOabtOaWsOS7o+egge+8jOaIkei/mOayoemFjee9ru+8jOWwseWFiOS4jeivtOS6hiAtIC3jgIJcXG5cXG7lpb3kuobvvIznjrDlnKjnjrDlnKjln7rmnKznjq/looPphY3nva7lpb3kuoblsLHlj6/ku6XlvIDlp4vlvIDlj5HkvaDnmoTpobnnm67llabjgIJcXG5cXG7lj6blpJbpmYTvvJogXFxu6aG555uu5Zyo5pyN5Yqh5Zmo5LiK5ZCv5Yqo5LqG77yM5Y+R546w5Zyo5pys5Zyw55S16ISR5peg5rOV6YCa6L+HIGlwIOiuv+mXru+8jOmCo+S5iOWPr+iDveaYr+S9oOeahOerr+WPo+WPt+ayoeacieW8gOaUvu+8jOmcgOimgeWOu+acjeWKoeWZqOS4iuiuvue9ruWuieWFqOe7hOOAglxcbuWFt+S9k+a3u+WKoOaWueazlSDvvIzku6Xlj4rlhbbku5bkuIDkupvlhbPkuo7mnI3liqHlmajnmoTphY3nva7vvIzpg73lj6/ku6Xpmo/ml7bngrnlh7vlj7PkvqfnmoQgKirngrnmiJHmj5Dpl64qKu+8jOWDj+S6keWNmuWjq+aPkOmXruOAgiA9ID1cXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDEwNzE3NTU0ODcwMz93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KVwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[692],{2692:(t,n,s)=>{s.r(n),s.d(n,{default:()=>e});const e="### 购买服务器\n\n学生购买可以使用阿里云优惠专享, 每个月只要9.9 就好了。这里我用的是学生优惠,机型内存什么都限定好了的。所以- - 没什么可以说的。关于国内外服务器的区别就是,如果你购买了国外的服务器,就可以在云服务器上搭梯子访问国外的网站,也就是翻墙了。\n\n### 安装环境\n\n因为服务器默认 linux 系统,所以这里讲怎么配置 linux 云服务环境。 \n我第一次使用的时候,还以为是要去安装一个界面化桌面,以便我这个命令小白可以操作。但是,对于只有2G 的内存来说安装了之后将会很卡很卡。后来我问学长,他说不要安装界面化,使用命令就好了。\n\n首先关于远程服务器的登录, 默认系统的用户名是 root, 然后登录密码可以在控制台进行修改。如下图点击重置密码。\n![重置密码处](https://img-blog.csdn.net/20180107170054918?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) \n\n重置之后,然后点击远程连接,就可以连接登录到你的服务器上了。这里要将一点,如果你是 mac 电脑的话,可以在你的电脑上通过 ssh 登录到你的服务器。 命令如下:\n`ssh root@你的公网IP`,比如 `ssh root@120.78.32.12`\n然后输入密码即可连接成功。\n\n![登录成功图](https://img-blog.csdn.net/20180107170503333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n接下来在终端中输入命令。配置环境。如果你是配置 java 环境,那么可以去谷歌一下如何在 linux 中配置 java 环境,这里我是配置的 node 环境,就讲一下如何配置 node 环境以及 npm。\n\n这里我用的是源码安装。首先安装 node 编译依赖的第三方模块\n`yum -y install gcc make gcc-c++ openssl-devel`\n\n然后下载 node 的源码包\n![这里写图片描述](https://img-blog.csdn.net/20180107171300036?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\nnode 官网的源码 包。\n`wget https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz`\n\n你下载的时候可以手动改成当前最新版本。下载后,进行解压 `tar -zxvf node-v8.9.4.tar.gz`, 然后进入解压后的文件夹 ` cd node-v8.9.4`, 依次\n` ./configure`\n` make`\n`sudo make install`\n这里编译时间会有点久,请耐心等待- -\n查看安装成功\n![这里写图片描述](https://img-blog.csdn.net/20180107172311684?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n安装 npm\n同样下载 npm 包\n`wget http://nodejs.org/dist/npm/npm-1.4.9.zip`\n解压 `tar -zxvf npm-1.4.9.tgz`\n查看是否安装成功 `npm -v`\n\n这就是 node 环境配置了, 然后就是 mysql 数据库。\n[http://blog.csdn.net/win7system/article/details/53579500](http://blog.csdn.net/win7system/article/details/53579500)\n\n关于项目的上传,如果你本地编写了代码,想上传至服务器,第一个方式,可以是使用 ftp 上传文件。 第二个方式,就是在你的服务器上搭建一个 git 服务器,通过从服务器推送和克隆项目来获取文件。这里我使用的是第二种方法,参见教程:\n[https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000)\n这里注意一下, 关于 设置 ssh 登录,一定要把创建的 .ssh 文件放到你创建的用户下,如我这里是 git 用户,路径就是\n![这里写图片描述](https://img-blog.csdn.net/20180107174529969?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n放置在正确位置之后,还要注意项目的归属者也要是 git 用户,这样才会在 git 用户里匹配到对应的 ssh key。也就是下面这一个步骤\n![这里写图片描述](https://img-blog.csdn.net/20180107174749168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n还有一点要注意的就是,你再本地推送了代码上 git 服务器之后,想要在云服务器上获取到代码, 需要在服务器上再次克隆 `git clone git@server:/srv/sample.git` 项目,git pull 获取到代码。 这里也可以通过自己配置 git 服务器的钩子函数,使其自动更新代码,我还没配置,就先不说了 - -。\n\n好了,现在现在基本环境配置好了就可以开始开发你的项目啦。\n\n另外附: \n项目在服务器上启动了,发现在本地电脑无法通过 ip 访问,那么可能是你的端口号没有开放,需要去服务器上设置安全组。\n具体添加方法 ,以及其他一些关于服务器的配置,都可以随时点击右侧的 **点我提问**,像云博士提问。 = =\n![这里写图片描述](https://img-blog.csdn.net/20180107175548703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFkYWRlZ2FuaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)"}}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkyLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsczNHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL2FsaXl1bi1zZXJ2ZXIubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyMg6LSt5Lmw5pyN5Yqh5ZmoXFxuXFxu5a2m55Sf6LSt5Lmw5Y+v5Lul5L2/55So6Zi/6YeM5LqR5LyY5oOg5LiT5Lqr77yMIOavj+S4quaciOWPquimgTkuOSDlsLHlpb3kuobjgILov5nph4zmiJHnlKjnmoTmmK/lrabnlJ/kvJjmg6DvvIzmnLrlnovlhoXlrZjku4DkuYjpg73pmZDlrprlpb3kuobnmoTjgILmiYDku6UtIC0g5rKh5LuA5LmI5Y+v5Lul6K+055qE44CC5YWz5LqO5Zu95YaF5aSW5pyN5Yqh5Zmo55qE5Yy65Yir5bCx5piv77yM5aaC5p6c5L2g6LSt5Lmw5LqG5Zu95aSW55qE5pyN5Yqh5Zmo77yM5bCx5Y+v5Lul5Zyo5LqR5pyN5Yqh5Zmo5LiK5pCt5qKv5a2Q6K6/6Zeu5Zu95aSW55qE572R56uZ77yM5Lmf5bCx5piv57+75aKZ5LqG44CCXFxuXFxuIyMjIOWuieijheeOr+Wig1xcblxcbuWboOS4uuacjeWKoeWZqOm7mOiupCBsaW51eCDns7vnu5/vvIzmiYDku6Xov5nph4zorrLmgI7kuYjphY3nva4gbGludXgg5LqR5pyN5Yqh546v5aKD44CCIFxcbuaIkeesrOS4gOasoeS9v+eUqOeahOaXtuWAme+8jOi/mOS7peS4uuaYr+imgeWOu+WuieijheS4gOS4queVjOmdouWMluahjOmdou+8jOS7peS+v+aIkei/meS4quWRveS7pOWwj+eZveWPr+S7peaTjeS9nOOAguS9huaYr++8jOWvueS6juWPquaciTJHIOeahOWGheWtmOadpeivtOWuieijheS6huS5i+WQjuWwhuS8muW+iOWNoeW+iOWNoeOAguWQjuadpeaIkemXruWtpumVv++8jOS7luivtOS4jeimgeWuieijheeVjOmdouWMlu+8jOS9v+eUqOWRveS7pOWwseWlveS6huOAglxcblxcbummluWFiOWFs+S6jui/nOeoi+acjeWKoeWZqOeahOeZu+W9le+8jCDpu5jorqTns7vnu5/nmoTnlKjmiLflkI3mmK8gcm9vdCwg54S25ZCO55m75b2V5a+G56CB5Y+v5Lul5Zyo5o6n5Yi25Y+w6L+b6KGM5L+u5pS544CC5aaC5LiL5Zu+54K55Ye76YeN572u5a+G56CB44CCXFxuIVvph43nva7lr4bnoIHlpIRdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzAwNTQ5MTg/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdCkgXFxuXFxu6YeN572u5LmL5ZCO77yM54S25ZCO54K55Ye76L+c56iL6L+e5o6l77yM5bCx5Y+v5Lul6L+e5o6l55m75b2V5Yiw5L2g55qE5pyN5Yqh5Zmo5LiK5LqG44CC6L+Z6YeM6KaB5bCG5LiA54K577yM5aaC5p6c5L2g5pivIG1hYyDnlLXohJHnmoTor53vvIzlj6/ku6XlnKjkvaDnmoTnlLXohJHkuIrpgJrov4cgc3NoIOeZu+W9leWIsOS9oOeahOacjeWKoeWZqOOAgiDlkb3ku6TlpoLkuIvvvJpcXG5gc3NoIHJvb3RA5L2g55qE5YWs572RSVBg77yM5q+U5aaCIGBzc2ggcm9vdEAxMjAuNzguMzIuMTJgXFxu54S25ZCO6L6T5YWl5a+G56CB5Y2z5Y+v6L+e5o6l5oiQ5Yqf44CCXFxuXFxuIVvnmbvlvZXmiJDlip/lm75dKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzA1MDMzMzM/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG5cXG7mjqXkuIvmnaXlnKjnu4jnq6/kuK3ovpPlhaXlkb3ku6TjgILphY3nva7njq/looPjgILlpoLmnpzkvaDmmK/phY3nva4gamF2YSDnjq/looPvvIzpgqPkuYjlj6/ku6XljrvosLfmrYzkuIDkuIvlpoLkvZXlnKggbGludXgg5Lit6YWN572uIGphdmEg546v5aKD77yM6L+Z6YeM5oiR5piv6YWN572u55qEIG5vZGUg546v5aKD77yM5bCx6K6y5LiA5LiL5aaC5L2V6YWN572uIG5vZGUg546v5aKD5Lul5Y+KIG5wbeOAglxcblxcbui/memHjOaIkeeUqOeahOaYr+a6kOeggeWuieijheOAgummluWFiOWuieijhSBub2RlIOe8luivkeS+nei1lueahOesrOS4ieaWueaooeWdl1xcbmB5dW0gLXkgaW5zdGFsbCBnY2MgbWFrZSBnY2MtYysrIG9wZW5zc2wtZGV2ZWxgXFxuXFxu54S25ZCO5LiL6L29IG5vZGUg55qE5rqQ56CB5YyFXFxuIVvov5nph4zlhpnlm77niYfmj4/ov7BdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzEzMDAwMzY/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG5cXG5ub2RlIOWumOe9keeahOa6kOeggSDljIXjgIJcXG5gd2dldCBodHRwczovL25vZGVqcy5vcmcvZGlzdC92OC45LjQvbm9kZS12OC45LjQudGFyLmd6YFxcblxcbuS9oOS4i+i9veeahOaXtuWAmeWPr+S7peaJi+WKqOaUueaIkOW9k+WJjeacgOaWsOeJiOacrOOAguS4i+i9veWQju+8jOi/m+ihjOino+WOiyBgdGFyIC16eHZmIG5vZGUtdjguOS40LnRhci5nemAsIOeEtuWQjui/m+WFpeino+WOi+WQjueahOaWh+S7tuWkuSBgIGNkIG5vZGUtdjguOS40YCwg5L6d5qyhXFxuYCAgLi9jb25maWd1cmVgXFxuYCAgbWFrZWBcXG5gc3VkbyBtYWtlIGluc3RhbGxgXFxu6L+Z6YeM57yW6K+R5pe26Ze05Lya5pyJ54K55LmF77yM6K+36ICQ5b+D562J5b6FLSAtXFxu5p+l55yL5a6J6KOF5oiQ5YqfXFxuIVvov5nph4zlhpnlm77niYfmj4/ov7BdKGh0dHBzOi8vaW1nLWJsb2cuY3Nkbi5uZXQvMjAxODAxMDcxNzIzMTE2ODQ/d2F0ZXJtYXJrLzIvdGV4dC9hSFIwY0RvdkwySnNiMmN1WTNOa2JpNXVaWFF2WkdGa1lXUmxaMkZ1YUhWdi9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MC9ncmF2aXR5L1NvdXRoRWFzdClcXG5cXG7lronoo4UgbnBtXFxu5ZCM5qC35LiL6L29IG5wbSDljIVcXG5gd2dldCBodHRwOi8vbm9kZWpzLm9yZy9kaXN0L25wbS9ucG0tMS40LjkuemlwYFxcbuino+WOiyBgdGFyIC16eHZmIG5wbS0xLjQuOS50Z3pgXFxu5p+l55yL5piv5ZCm5a6J6KOF5oiQ5YqfIGBucG0gLXZgXFxuXFxu6L+Z5bCx5pivIG5vZGUg546v5aKD6YWN572u5LqG77yMIOeEtuWQjuWwseaYryBteXNxbCDmlbDmja7lupPjgIJcXG5baHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2luN3N5c3RlbS9hcnRpY2xlL2RldGFpbHMvNTM1Nzk1MDBdKGh0dHA6Ly9ibG9nLmNzZG4ubmV0L3dpbjdzeXN0ZW0vYXJ0aWNsZS9kZXRhaWxzLzUzNTc5NTAwKVxcblxcbuWFs+S6jumhueebrueahOS4iuS8oO+8jOWmguaenOS9oOacrOWcsOe8luWGmeS6huS7o+egge+8jOaDs+S4iuS8oOiHs+acjeWKoeWZqO+8jOesrOS4gOS4quaWueW8j++8jOWPr+S7peaYr+S9v+eUqCBmdHAg5LiK5Lyg5paH5Lu244CCIOesrOS6jOS4quaWueW8j++8jOWwseaYr+WcqOS9oOeahOacjeWKoeWZqOS4iuaQreW7uuS4gOS4qiBnaXQg5pyN5Yqh5Zmo77yM6YCa6L+H5LuO5pyN5Yqh5Zmo5o6o6YCB5ZKM5YWL6ZqG6aG555uu5p2l6I635Y+W5paH5Lu244CC6L+Z6YeM5oiR5L2/55So55qE5piv56ys5LqM56eN5pa55rOV77yM5Y+C6KeB5pWZ56iL77yaXFxuW2h0dHBzOi8vd3d3LmxpYW94dWVmZW5nLmNvbS93aWtpLzAwMTM3Mzk1MTYzMDU5Mjk2MDZkZDE4MzYxMjQ4NTc4YzY3YjgwNjdjOGMwMTdiMDAwLzAwMTM3NTgzNzcwMzYwNTc5YmM0YjQ1OGYwNDRjZTdhZmVkM2RmNTc5MTIzZWNhMDAwXShodHRwczovL3d3dy5saWFveHVlZmVuZy5jb20vd2lraS8wMDEzNzM5NTE2MzA1OTI5NjA2ZGQxODM2MTI0ODU3OGM2N2I4MDY3YzhjMDE3YjAwMC8wMDEzNzU4Mzc3MDM2MDU3OWJjNGI0NThmMDQ0Y2U3YWZlZDNkZjU3OTEyM2VjYTAwMClcXG7ov5nph4zms6jmhI/kuIDkuIvvvIwg5YWz5LqOIOiuvue9riBzc2gg55m75b2V77yM5LiA5a6a6KaB5oqK5Yib5bu655qEIC5zc2gg5paH5Lu25pS+5Yiw5L2g5Yib5bu655qE55So5oi35LiL77yM5aaC5oiR6L+Z6YeM5pivIGdpdCDnlKjmiLfvvIzot6/lvoTlsLHmmK9cXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDEwNzE3NDUyOTk2OT93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KVxcblxcbuaUvue9ruWcqOato+ehruS9jee9ruS5i+WQju+8jOi/mOimgeazqOaEj+mhueebrueahOW9kuWxnuiAheS5n+imgeaYryBnaXQg55So5oi377yM6L+Z5qC35omN5Lya5ZyoIGdpdCDnlKjmiLfph4zljLnphY3liLDlr7nlupTnmoQgc3NoIGtleeOAguS5n+WwseaYr+S4i+mdoui/meS4gOS4quatpemqpFxcbiFb6L+Z6YeM5YaZ5Zu+54mH5o+P6L+wXShodHRwczovL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTgwMTA3MTc0NzQ5MTY4P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlpHRmtZV1JsWjJGdWFIVnYvZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3QpXFxuXFxu6L+Y5pyJ5LiA54K56KaB5rOo5oSP55qE5bCx5piv77yM5L2g5YaN5pys5Zyw5o6o6YCB5LqG5Luj56CB5LiKIGdpdCDmnI3liqHlmajkuYvlkI7vvIzmg7PopoHlnKjkupHmnI3liqHlmajkuIrojrflj5bliLDku6PnoIHvvIwg6ZyA6KaB5Zyo5pyN5Yqh5Zmo5LiK5YaN5qyh5YWL6ZqGIGBnaXQgY2xvbmUgZ2l0QHNlcnZlcjovc3J2L3NhbXBsZS5naXRgIOmhueebru+8jGdpdCBwdWxsIOiOt+WPluWIsOS7o+eggeOAgiDov5nph4zkuZ/lj6/ku6XpgJrov4foh6rlt7HphY3nva4gZ2l0IOacjeWKoeWZqOeahOmSqeWtkOWHveaVsO+8jOS9v+WFtuiHquWKqOabtOaWsOS7o+egge+8jOaIkei/mOayoemFjee9ru+8jOWwseWFiOS4jeivtOS6hiAtIC3jgIJcXG5cXG7lpb3kuobvvIznjrDlnKjnjrDlnKjln7rmnKznjq/looPphY3nva7lpb3kuoblsLHlj6/ku6XlvIDlp4vlvIDlj5HkvaDnmoTpobnnm67llabjgIJcXG5cXG7lj6blpJbpmYTvvJogXFxu6aG555uu5Zyo5pyN5Yqh5Zmo5LiK5ZCv5Yqo5LqG77yM5Y+R546w5Zyo5pys5Zyw55S16ISR5peg5rOV6YCa6L+HIGlwIOiuv+mXru+8jOmCo+S5iOWPr+iDveaYr+S9oOeahOerr+WPo+WPt+ayoeacieW8gOaUvu+8jOmcgOimgeWOu+acjeWKoeWZqOS4iuiuvue9ruWuieWFqOe7hOOAglxcbuWFt+S9k+a3u+WKoOaWueazlSDvvIzku6Xlj4rlhbbku5bkuIDkupvlhbPkuo7mnI3liqHlmajnmoTphY3nva7vvIzpg73lj6/ku6Xpmo/ml7bngrnlh7vlj7PkvqfnmoQgKirngrnmiJHmj5Dpl64qKu+8jOWDj+S6keWNmuWjq+aPkOmXruOAgiA9ID1cXG4hW+i/memHjOWGmeWbvueJh+aPj+i/sF0oaHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDEwNzE3NTU0ODcwMz93YXRlcm1hcmsvMi90ZXh0L2FIUjBjRG92TDJKc2IyY3VZM05rYmk1dVpYUXZaR0ZrWVdSbFoyRnVhSFZ2L2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0KVwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/72.bundle.js b/72.bundle.js
deleted file mode 100644
index 43b71e9..0000000
--- a/72.bundle.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[72],{72:(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiJnSUFBQSw4a0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vYmxvZ3MvbWFya2Rvd24vcG9zdGNzcy1wbHVnaW4ubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyDlhpkgY3NzIOmBh+WIsOS6humXrumimOaAjuS5iOWKnu+8n1xcblxcbiMjIyDlpoLkvZXorqkgY3NzIOWGmeeahOabtOi9u+advu+8n1xcbiMjIyMgW3Bvc3Rjc3MtdWktdGhlbWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jbGV2ZXJib3kzMi9wb3N0Y3NzLXVpLXRoZW1lKe+8jOiuqeS9oOWunueOsOexuyBzYXNzIOivreazle+8jOS4gOS4quaPkuS7tuWwseiDveWBmuWIsO+8gVxcblxcbiMjIyDlpoLkvZXmlLnlj5ggY3NzIOS4u+mimCDvvJ9cXG5cXG4jIyMjIFtwb3N0Y3NzLXVpLXRoZW1lIF0oaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3Bvc3Rjc3MtdWktdGhlbWUp77yMIOWPr+aJk+WMhSBjc3M0IOWPmOmHj+iiq+S/neeVme+8jOS4jeS7heWPr+WcqOW8leeUqOaXtuebtOaOpeS9v+eUqOaWsOeahOWPmOmHj+aWh+S7tuimhuebluaUueWPmOS4u+mimO+8jOi/mOWPr+S7pemAmui/hyBqcyDov5vooYzmm7TmlLnvvIHvvIHvvIFcXG4jIyMgIGNzcyDlnKjliKvnmoTpobnnm67ooqvnvJbor5HvvIzmlofku7bot6/lvoTmib7kuI3liLDvvJ9cXG5cXG4jIyMjIFtwb3N0Y3NzLXVpLXRoZW1lXShodHRwczovL2dpdGh1Yi5jb20vY2xldmVyYm95MzIvcG9zdGNzcy11aS10aGVtZSnvvIwg6ZuG5oiQIHBvc3Rjc3MtYXNzZXRzIOaPkuS7tu+8jOmAmui/h+mFjee9riDmlofku7bmn6Xmib7ot6/lvoTvvIzop6PlhrPlvJXnlKjmlofku7bmib7kuI3liLDpl67popjvvIHvvIFcXG5cXG5cXG4jIyMgW3Bvc3Rjc3MtdWktdGhlbWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jbGV2ZXJib3kzMi9wb3N0Y3NzLXVpLXRoZW1lKSDmj5Lku7bvvIzlsLHmmK/kvaDnmoQgY3NzIOeuoeeQhuaWueahiOeahOacgOS9s+mAieaLqSEg54K5IHN0YXIg5pS26JeP77yB77yB77yBIOiMq+iMq+WJjeerr+i3r++8jOS9oOecn+eahOS8mueUqOWIsOWug+eahO+8gVxcblxcblxcblwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/966.bundle.js b/739.bundle.js
similarity index 57%
rename from 966.bundle.js
rename to 739.bundle.js
index b64d0bf..712f271 100644
--- a/966.bundle.js
+++ b/739.bundle.js
@@ -1,2 +1,2 @@
-"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[966],{966:(n,s,e)=>{e.r(s),e.d(s,{default:()=>t});const t="# 安全意识\n\n你要离开家了, 所有的父母都会说,路上注意安全,可见安全是多么的重要!那么作为软件开发,有哪些危险使我们要知道并避免的呢?\n下面我说一些基本的需要知道的安全攻击, 以及应对方案。\n\n> ps 作为一个安全小白,了解各种各样的防范方案真的太难了,我是真的水🤭。欢迎补充,以增长见识\n\n## XSS: 跨站脚本攻击\n\n在用户可以输入的地方,并且将作为代码编译时,攻击者可以通过输入一个脚本地址的方式进行对页面注入脚本攻击。解决方式: 任何用户输入的地方都不要相信,对用户输入内容进行转义,如 `<` 使用转义字符串 `<` 代替。\n\n## CSRF: 跨站伪装请求攻击\n\n在用户已登录的情况下,伪装用户的身份发起请求,进行相关攻击。解决方式,确认用户的身份。比较好理解的解决方式是: 二次确认,通过用户的二次确认确认请求方为真实用户。然后就是 X-Requested-With 请求标志,通过该请求头设置标志位 `ajax` 请求,可以一定程度阻止跨域的伪装。`Anti-CSRF TOKEN` 方案:通过服务端与客户端唯一的 token 值进行校验,可以看做一个暗号,让别人无法伪装!\n\n## 网络劫持\n\n### Jsonp 劫持\n\n我们都知道 `jsonp` 就是为了解决跨域的,如果传输信息设计到比较敏感的数据,那么别人可以很方便调用你的接口,获取你的数据,存储在自己的数据库中。解决方法,添加脚本可运行白名单,不要传输敏感信息。\n\n\n### HTTP 劫持。\n\nHTTP 是明文传输,所以运营商可以知道你的代码是什么,然后在里面加一点小广告什么的,改变你的内容。解决方法就是使用 https 协议,可耻的运营商\n\n### DNS 劫持 \n通过域名解析我们才能找到对域名的服务器 ip 地址,劫持了 DNS 就可以给你返回一个错误的 ip 地址。在 dns 解析中,会先在本机搜索域名解析记录,无相关记录像 dns 服务商发起请求。所以要么你本地信息被篡改,要么服务商欺骗你。\n[转一篇 DNS 劫持详解链接](https://juejin.im/post/5cff858a6fb9a07ed84238ec)\n\n## 接口安全\n\n### 数据库\n\n数据库,插入数据库的参数,在执行 sql 的时候小心它把你整个数据库表给删了。这里的攻击类似 `xss` 攻击,通过传输、拼接一些字符串改变原本的 sql 语义\n\n### 推送消息\n\n比如短信发送消息,非常的有代表性。通过接口的参数传递,以及最后的发送内容,可以推测出你的推送内容的组合相关方式,就可以通过不良参数,很方便的发送的一些不合法的信息,或有毒链接给用户。解决方式就是不要相信用户传入的任何参数,对参数进行校验,发送内容尽量可选择匹配模式,如 code 值映射,对不合法的参数才有默认内容发送。\n\n## DDOS:分布式拒绝服务\n\n就是很多请求大量涌入你的服务器,导致它们都没有空闲可以响应真正的用户请求。通过 TCP 连接,我们知道建立连接需要三次确认,一般攻击者可以伪造 ip, 发起大量连接请求,却又不确认 = = 导致服务器白白等待直到超时。其次可以借用别的用户,在一个大流量用户网站地方的某一个页面上了,通过 `xss` 默认发起对攻击网站的请求,并发送很大的数据,但每次发送很少的字节,这些用户就被当成了肉鸡,然后使其瘫痪。解决防范:增加机器, 对同一个ip 的过多请求进行防范。 \n"}}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTY2LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsczlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3NhZmUubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIOWuieWFqOaEj+ivhlxcblxcbuS9oOimgeemu+W8gOWutuS6hiwg5omA5pyJ55qE54i25q+N6YO95Lya6K+077yM6Lev5LiK5rOo5oSP5a6J5YWo77yM5Y+v6KeB5a6J5YWo5piv5aSa5LmI55qE6YeN6KaB77yB6YKj5LmI5L2c5Li66L2v5Lu25byA5Y+R77yM5pyJ5ZOq5Lqb5Y2x6Zmp5L2/5oiR5Lus6KaB55+l6YGT5bm26YG/5YWN55qE5ZGi77yfXFxu5LiL6Z2i5oiR6K+05LiA5Lqb5Z+65pys55qE6ZyA6KaB55+l6YGT55qE5a6J5YWo5pS75Ye7LCDku6Xlj4rlupTlr7nmlrnmoYjjgIJcXG5cXG4+IHBzIOS9nOS4uuS4gOS4quWuieWFqOWwj+eZve+8jOS6huino+WQhOenjeWQhOagt+eahOmYsuiMg+aWueahiOecn+eahOWkqumavuS6hu+8jOaIkeaYr+ecn+eahOawtPCfpK3jgILmrKLov47ooaXlhYXvvIzku6Xlop7plb/op4Hor4ZcXG5cXG4jIyBYU1M6IOi3qOermeiEmuacrOaUu+WHu1xcblxcbuWcqOeUqOaIt+WPr+S7pei+k+WFpeeahOWcsOaWue+8jOW5tuS4lOWwhuS9nOS4uuS7o+eggee8luivkeaXtu+8jOaUu+WHu+iAheWPr+S7pemAmui/h+i+k+WFpeS4gOS4quiEmuacrOWcsOWdgOeahOaWueW8j+i/m+ihjOWvuemhtemdouazqOWFpeiEmuacrOaUu+WHu+OAguino+WGs+aWueW8jzog5Lu75L2V55So5oi36L6T5YWl55qE5Zyw5pa56YO95LiN6KaB55u45L+h77yM5a+555So5oi36L6T5YWl5YaF5a656L+b6KGM6L2s5LmJ77yM5aaCIGA8YCDkvb/nlKjovazkuYnlrZfnrKbkuLIgYCZsdDtgIOS7o+abv+OAglxcblxcbiMjIENTUkY6IOi3qOermeS8quijheivt+axguaUu+WHu1xcblxcbuWcqOeUqOaIt+W3sueZu+W9leeahOaDheWGteS4i++8jOS8quijheeUqOaIt+eahOi6q+S7veWPkei1t+ivt+axgu+8jOi/m+ihjOebuOWFs+aUu+WHu+OAguino+WGs+aWueW8j++8jOehruiupOeUqOaIt+eahOi6q+S7veOAguavlOi+g+WlveeQhuino+eahOino+WGs+aWueW8j+aYrzog5LqM5qyh56Gu6K6k77yM6YCa6L+H55So5oi355qE5LqM5qyh56Gu6K6k56Gu6K6k6K+35rGC5pa55Li655yf5a6e55So5oi344CC54S25ZCO5bCx5pivIFgtUmVxdWVzdGVkLVdpdGggIOivt+axguagh+W/l++8jOmAmui/h+ivpeivt+axguWktOiuvue9ruagh+W/l+S9jSBgYWpheGAg6K+35rGC77yM5Y+v5Lul5LiA5a6a56iL5bqm6Zi75q2i6Leo5Z+f55qE5Lyq6KOF44CCYEFudGktQ1NSRiBUT0tFTmAg5pa55qGI77ya6YCa6L+H5pyN5Yqh56uv5LiO5a6i5oi356uv5ZSv5LiA55qEIHRva2VuIOWAvOi/m+ihjOagoemqjO+8jOWPr+S7peeci+WBmuS4gOS4quaal+WPt++8jOiuqeWIq+S6uuaXoOazleS8quijhe+8gVxcblxcbiMjIOe9kee7nOWKq+aMgVxcblxcbiMjIyBKc29ucCDliqvmjIFcXG5cXG7miJHku6zpg73nn6XpgZMgYGpzb25wYCDlsLHmmK/kuLrkuobop6PlhrPot6jln5/nmoTvvIzlpoLmnpzkvKDovpPkv6Hmga/orr7orqHliLDmr5TovoPmlY/mhJ/nmoTmlbDmja7vvIzpgqPkuYjliKvkurrlj6/ku6Xlvojmlrnkvr/osIPnlKjkvaDnmoTmjqXlj6PvvIzojrflj5bkvaDnmoTmlbDmja7vvIzlrZjlgqjlnKjoh6rlt7HnmoTmlbDmja7lupPkuK3jgILop6PlhrPmlrnms5XvvIzmt7vliqDohJrmnKzlj6/ov5DooYznmb3lkI3ljZXvvIzkuI3opoHkvKDovpPmlY/mhJ/kv6Hmga/jgIJcXG5cXG5cXG4jIyMgSFRUUCDliqvmjIHjgIJcXG5cXG5IVFRQIOaYr+aYjuaWh+S8oOi+k++8jOaJgOS7pei/kOiQpeWVhuWPr+S7peefpemBk+S9oOeahOS7o+eggeaYr+S7gOS5iO+8jOeEtuWQjuWcqOmHjOmdouWKoOS4gOeCueWwj+W5v+WRiuS7gOS5iOeahO+8jOaUueWPmOS9oOeahOWGheWuueOAguino+WGs+aWueazleWwseaYr+S9v+eUqCBodHRwcyDljY/orq7vvIzlj6/ogLvnmoTov5DokKXllYZcXG5cXG4jIyMgRE5TIOWKq+aMgSBcXG7pgJrov4fln5/lkI3op6PmnpDmiJHku6zmiY3og73mib7liLDlr7nln5/lkI3nmoTmnI3liqHlmaggaXAg5Zyw5Z2A77yM5Yqr5oyB5LqGIEROUyDlsLHlj6/ku6Xnu5nkvaDov5Tlm57kuIDkuKrplJnor6/nmoQgaXAg5Zyw5Z2A44CC5ZyoIGRucyDop6PmnpDkuK3vvIzkvJrlhYjlnKjmnKzmnLrmkJzntKLln5/lkI3op6PmnpDorrDlvZXvvIzml6Dnm7jlhbPorrDlvZXlg48gZG5zIOacjeWKoeWVhuWPkei1t+ivt+axguOAguaJgOS7peimgeS5iOS9oOacrOWcsOS/oeaBr+iiq+evoeaUue+8jOimgeS5iOacjeWKoeWVhuasuumql+S9oOOAglxcblvovazkuIDnr4cgRE5TIOWKq+aMgeivpuino+mTvuaOpV0oaHR0cHM6Ly9qdWVqaW4uaW0vcG9zdC81Y2ZmODU4YTZmYjlhMDdlZDg0MjM4ZWMpXFxuXFxuIyMg5o6l5Y+j5a6J5YWoXFxuXFxuIyMjIOaVsOaNruW6k1xcblxcbuaVsOaNruW6k++8jOaPkuWFpeaVsOaNruW6k+eahOWPguaVsO+8jOWcqOaJp+ihjCBzcWwg55qE5pe25YCZ5bCP5b+D5a6D5oqK5L2g5pW05Liq5pWw5o2u5bqT6KGo57uZ5Yig5LqG44CC6L+Z6YeM55qE5pS75Ye757G75Ly8IGB4c3NgIOaUu+WHu++8jOmAmui/h+S8oOi+k+OAgeaLvOaOpeS4gOS6m+Wtl+espuS4suaUueWPmOWOn+acrOeahCBzcWwg6K+t5LmJXFxuXFxuIyMjIOaOqOmAgea2iOaBr1xcblxcbuavlOWmguefreS/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+8jOWvueS4jeWQiOazleeahOWPguaVsOaJjeaciem7mOiupOWGheWuueWPkemAgeOAglxcblxcbiMjIERET1PvvJrliIbluIPlvI/mi5Lnu53mnI3liqFcXG5cXG7lsLHmmK/lvojlpJror7fmsYLlpKfph4/mtozlhaXkvaDnmoTmnI3liqHlmajvvIzlr7zoh7TlroPku6zpg73msqHmnInnqbrpl7Llj6/ku6Xlk43lupTnnJ/mraPnmoTnlKjmiLfor7fmsYLjgILpgJrov4cgVENQIOi/nuaOpe+8jOaIkeS7rOefpemBk+W7uueri+i/nuaOpemcgOimgeS4ieasoeehruiupO+8jOS4gOiIrOaUu+WHu+iAheWPr+S7peS8qumAoCBpcCwg5Y+R6LW35aSn6YeP6L+e5o6l6K+35rGC77yM5Y205Y+I5LiN56Gu6K6kID0gPSDlr7zoh7TmnI3liqHlmajnmb3nmb3nrYnlvoXnm7TliLDotoXml7bjgILlhbbmrKHlj6/ku6XlgJ/nlKjliKvnmoTnlKjmiLfvvIzlnKjkuIDkuKrlpKfmtYHph4/nlKjmiLfnvZHnq5nlnLDmlrnnmoTmn5DkuIDkuKrpobXpnaLkuIrkuobvvIzpgJrov4cgYHhzc2Ag6buY6K6k5Y+R6LW35a+55pS75Ye7572R56uZ55qE6K+35rGC77yM5bm25Y+R6YCB5b6I5aSn55qE5pWw5o2u77yM5L2G5q+P5qyh5Y+R6YCB5b6I5bCR55qE5a2X6IqC77yM6L+Z5Lqb55So5oi35bCx6KKr5b2T5oiQ5LqG6IKJ6bih77yM54S25ZCO5L2/5YW255ir55eq44CC6Kej5Yaz6Ziy6IyD77ya5aKe5Yqg5py65Zmo77yMIOWvueWQjOS4gOS4qmlwIOeahOi/h+Wkmuivt+axgui/m+ihjOmYsuiMg+OAgiBcXG5cIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[739],{6739:(n,s,e)=>{e.r(s),e.d(s,{default:()=>t});const t="# 安全意识\n\n你要离开家了, 所有的父母都会说,路上注意安全,可见安全是多么的重要!那么作为软件开发,有哪些危险使我们要知道并避免的呢?\n下面我说一些基本的需要知道的安全攻击, 以及应对方案。\n\n> ps 作为一个安全小白,了解各种各样的防范方案真的太难了,我是真的水🤭。欢迎补充,以增长见识\n\n## XSS: 跨站脚本攻击\n\n在用户可以输入的地方,并且将作为代码编译时,攻击者可以通过输入一个脚本地址的方式进行对页面注入脚本攻击。解决方式: 任何用户输入的地方都不要相信,对用户输入内容进行转义,如 `<` 使用转义字符串 `<` 代替。\n\n## CSRF: 跨站伪装请求攻击\n\n在用户已登录的情况下,伪装用户的身份发起请求,进行相关攻击。解决方式,确认用户的身份。比较好理解的解决方式是: 二次确认,通过用户的二次确认确认请求方为真实用户。然后就是 X-Requested-With 请求标志,通过该请求头设置标志位 `ajax` 请求,可以一定程度阻止跨域的伪装。`Anti-CSRF TOKEN` 方案:通过服务端与客户端唯一的 token 值进行校验,可以看做一个暗号,让别人无法伪装!\n\n## 网络劫持\n\n### Jsonp 劫持\n\n我们都知道 `jsonp` 就是为了解决跨域的,如果传输信息设计到比较敏感的数据,那么别人可以很方便调用你的接口,获取你的数据,存储在自己的数据库中。解决方法,添加脚本可运行白名单,不要传输敏感信息。\n\n\n### HTTP 劫持。\n\nHTTP 是明文传输,所以运营商可以知道你的代码是什么,然后在里面加一点小广告什么的,改变你的内容。解决方法就是使用 https 协议,可耻的运营商\n\n### DNS 劫持 \n通过域名解析我们才能找到对域名的服务器 ip 地址,劫持了 DNS 就可以给你返回一个错误的 ip 地址。在 dns 解析中,会先在本机搜索域名解析记录,无相关记录像 dns 服务商发起请求。所以要么你本地信息被篡改,要么服务商欺骗你。\n[转一篇 DNS 劫持详解链接](https://juejin.im/post/5cff858a6fb9a07ed84238ec)\n\n## 接口安全\n\n### 数据库\n\n数据库,插入数据库的参数,在执行 sql 的时候小心它把你整个数据库表给删了。这里的攻击类似 `xss` 攻击,通过传输、拼接一些字符串改变原本的 sql 语义\n\n### 推送消息\n\n比如短信发送消息,非常的有代表性。通过接口的参数传递,以及最后的发送内容,可以推测出你的推送内容的组合相关方式,就可以通过不良参数,很方便的发送的一些不合法的信息,或有毒链接给用户。解决方式就是不要相信用户传入的任何参数,对参数进行校验,发送内容尽量可选择匹配模式,如 code 值映射,对不合法的参数才有默认内容发送。\n\n## DDOS:分布式拒绝服务\n\n就是很多请求大量涌入你的服务器,导致它们都没有空闲可以响应真正的用户请求。通过 TCP 连接,我们知道建立连接需要三次确认,一般攻击者可以伪造 ip, 发起大量连接请求,却又不确认 = = 导致服务器白白等待直到超时。其次可以借用别的用户,在一个大流量用户网站地方的某一个页面上了,通过 `xss` 默认发起对攻击网站的请求,并发送很大的数据,但每次发送很少的字节,这些用户就被当成了肉鸡,然后使其瘫痪。解决防范:增加机器, 对同一个ip 的过多请求进行防范。 \n"}}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzM5LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsczlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3NhZmUubWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIOWuieWFqOaEj+ivhlxcblxcbuS9oOimgeemu+W8gOWutuS6hiwg5omA5pyJ55qE54i25q+N6YO95Lya6K+077yM6Lev5LiK5rOo5oSP5a6J5YWo77yM5Y+v6KeB5a6J5YWo5piv5aSa5LmI55qE6YeN6KaB77yB6YKj5LmI5L2c5Li66L2v5Lu25byA5Y+R77yM5pyJ5ZOq5Lqb5Y2x6Zmp5L2/5oiR5Lus6KaB55+l6YGT5bm26YG/5YWN55qE5ZGi77yfXFxu5LiL6Z2i5oiR6K+05LiA5Lqb5Z+65pys55qE6ZyA6KaB55+l6YGT55qE5a6J5YWo5pS75Ye7LCDku6Xlj4rlupTlr7nmlrnmoYjjgIJcXG5cXG4+IHBzIOS9nOS4uuS4gOS4quWuieWFqOWwj+eZve+8jOS6huino+WQhOenjeWQhOagt+eahOmYsuiMg+aWueahiOecn+eahOWkqumavuS6hu+8jOaIkeaYr+ecn+eahOawtPCfpK3jgILmrKLov47ooaXlhYXvvIzku6Xlop7plb/op4Hor4ZcXG5cXG4jIyBYU1M6IOi3qOermeiEmuacrOaUu+WHu1xcblxcbuWcqOeUqOaIt+WPr+S7pei+k+WFpeeahOWcsOaWue+8jOW5tuS4lOWwhuS9nOS4uuS7o+eggee8luivkeaXtu+8jOaUu+WHu+iAheWPr+S7pemAmui/h+i+k+WFpeS4gOS4quiEmuacrOWcsOWdgOeahOaWueW8j+i/m+ihjOWvuemhtemdouazqOWFpeiEmuacrOaUu+WHu+OAguino+WGs+aWueW8jzog5Lu75L2V55So5oi36L6T5YWl55qE5Zyw5pa56YO95LiN6KaB55u45L+h77yM5a+555So5oi36L6T5YWl5YaF5a656L+b6KGM6L2s5LmJ77yM5aaCIGA8YCDkvb/nlKjovazkuYnlrZfnrKbkuLIgYCZsdDtgIOS7o+abv+OAglxcblxcbiMjIENTUkY6IOi3qOermeS8quijheivt+axguaUu+WHu1xcblxcbuWcqOeUqOaIt+W3sueZu+W9leeahOaDheWGteS4i++8jOS8quijheeUqOaIt+eahOi6q+S7veWPkei1t+ivt+axgu+8jOi/m+ihjOebuOWFs+aUu+WHu+OAguino+WGs+aWueW8j++8jOehruiupOeUqOaIt+eahOi6q+S7veOAguavlOi+g+WlveeQhuino+eahOino+WGs+aWueW8j+aYrzog5LqM5qyh56Gu6K6k77yM6YCa6L+H55So5oi355qE5LqM5qyh56Gu6K6k56Gu6K6k6K+35rGC5pa55Li655yf5a6e55So5oi344CC54S25ZCO5bCx5pivIFgtUmVxdWVzdGVkLVdpdGggIOivt+axguagh+W/l++8jOmAmui/h+ivpeivt+axguWktOiuvue9ruagh+W/l+S9jSBgYWpheGAg6K+35rGC77yM5Y+v5Lul5LiA5a6a56iL5bqm6Zi75q2i6Leo5Z+f55qE5Lyq6KOF44CCYEFudGktQ1NSRiBUT0tFTmAg5pa55qGI77ya6YCa6L+H5pyN5Yqh56uv5LiO5a6i5oi356uv5ZSv5LiA55qEIHRva2VuIOWAvOi/m+ihjOagoemqjO+8jOWPr+S7peeci+WBmuS4gOS4quaal+WPt++8jOiuqeWIq+S6uuaXoOazleS8quijhe+8gVxcblxcbiMjIOe9kee7nOWKq+aMgVxcblxcbiMjIyBKc29ucCDliqvmjIFcXG5cXG7miJHku6zpg73nn6XpgZMgYGpzb25wYCDlsLHmmK/kuLrkuobop6PlhrPot6jln5/nmoTvvIzlpoLmnpzkvKDovpPkv6Hmga/orr7orqHliLDmr5TovoPmlY/mhJ/nmoTmlbDmja7vvIzpgqPkuYjliKvkurrlj6/ku6Xlvojmlrnkvr/osIPnlKjkvaDnmoTmjqXlj6PvvIzojrflj5bkvaDnmoTmlbDmja7vvIzlrZjlgqjlnKjoh6rlt7HnmoTmlbDmja7lupPkuK3jgILop6PlhrPmlrnms5XvvIzmt7vliqDohJrmnKzlj6/ov5DooYznmb3lkI3ljZXvvIzkuI3opoHkvKDovpPmlY/mhJ/kv6Hmga/jgIJcXG5cXG5cXG4jIyMgSFRUUCDliqvmjIHjgIJcXG5cXG5IVFRQIOaYr+aYjuaWh+S8oOi+k++8jOaJgOS7pei/kOiQpeWVhuWPr+S7peefpemBk+S9oOeahOS7o+eggeaYr+S7gOS5iO+8jOeEtuWQjuWcqOmHjOmdouWKoOS4gOeCueWwj+W5v+WRiuS7gOS5iOeahO+8jOaUueWPmOS9oOeahOWGheWuueOAguino+WGs+aWueazleWwseaYr+S9v+eUqCBodHRwcyDljY/orq7vvIzlj6/ogLvnmoTov5DokKXllYZcXG5cXG4jIyMgRE5TIOWKq+aMgSBcXG7pgJrov4fln5/lkI3op6PmnpDmiJHku6zmiY3og73mib7liLDlr7nln5/lkI3nmoTmnI3liqHlmaggaXAg5Zyw5Z2A77yM5Yqr5oyB5LqGIEROUyDlsLHlj6/ku6Xnu5nkvaDov5Tlm57kuIDkuKrplJnor6/nmoQgaXAg5Zyw5Z2A44CC5ZyoIGRucyDop6PmnpDkuK3vvIzkvJrlhYjlnKjmnKzmnLrmkJzntKLln5/lkI3op6PmnpDorrDlvZXvvIzml6Dnm7jlhbPorrDlvZXlg48gZG5zIOacjeWKoeWVhuWPkei1t+ivt+axguOAguaJgOS7peimgeS5iOS9oOacrOWcsOS/oeaBr+iiq+evoeaUue+8jOimgeS5iOacjeWKoeWVhuasuumql+S9oOOAglxcblvovazkuIDnr4cgRE5TIOWKq+aMgeivpuino+mTvuaOpV0oaHR0cHM6Ly9qdWVqaW4uaW0vcG9zdC81Y2ZmODU4YTZmYjlhMDdlZDg0MjM4ZWMpXFxuXFxuIyMg5o6l5Y+j5a6J5YWoXFxuXFxuIyMjIOaVsOaNruW6k1xcblxcbuaVsOaNruW6k++8jOaPkuWFpeaVsOaNruW6k+eahOWPguaVsO+8jOWcqOaJp+ihjCBzcWwg55qE5pe25YCZ5bCP5b+D5a6D5oqK5L2g5pW05Liq5pWw5o2u5bqT6KGo57uZ5Yig5LqG44CC6L+Z6YeM55qE5pS75Ye757G75Ly8IGB4c3NgIOaUu+WHu++8jOmAmui/h+S8oOi+k+OAgeaLvOaOpeS4gOS6m+Wtl+espuS4suaUueWPmOWOn+acrOeahCBzcWwg6K+t5LmJXFxuXFxuIyMjIOaOqOmAgea2iOaBr1xcblxcbuavlOWmguefreS/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+8jOWvueS4jeWQiOazleeahOWPguaVsOaJjeaciem7mOiupOWGheWuueWPkemAgeOAglxcblxcbiMjIERET1PvvJrliIbluIPlvI/mi5Lnu53mnI3liqFcXG5cXG7lsLHmmK/lvojlpJror7fmsYLlpKfph4/mtozlhaXkvaDnmoTmnI3liqHlmajvvIzlr7zoh7TlroPku6zpg73msqHmnInnqbrpl7Llj6/ku6Xlk43lupTnnJ/mraPnmoTnlKjmiLfor7fmsYLjgILpgJrov4cgVENQIOi/nuaOpe+8jOaIkeS7rOefpemBk+W7uueri+i/nuaOpemcgOimgeS4ieasoeehruiupO+8jOS4gOiIrOaUu+WHu+iAheWPr+S7peS8qumAoCBpcCwg5Y+R6LW35aSn6YeP6L+e5o6l6K+35rGC77yM5Y205Y+I5LiN56Gu6K6kID0gPSDlr7zoh7TmnI3liqHlmajnmb3nmb3nrYnlvoXnm7TliLDotoXml7bjgILlhbbmrKHlj6/ku6XlgJ/nlKjliKvnmoTnlKjmiLfvvIzlnKjkuIDkuKrlpKfmtYHph4/nlKjmiLfnvZHnq5nlnLDmlrnnmoTmn5DkuIDkuKrpobXpnaLkuIrkuobvvIzpgJrov4cgYHhzc2Ag6buY6K6k5Y+R6LW35a+55pS75Ye7572R56uZ55qE6K+35rGC77yM5bm25Y+R6YCB5b6I5aSn55qE5pWw5o2u77yM5L2G5q+P5qyh5Y+R6YCB5b6I5bCR55qE5a2X6IqC77yM6L+Z5Lqb55So5oi35bCx6KKr5b2T5oiQ5LqG6IKJ6bih77yM54S25ZCO5L2/5YW255ir55eq44CC6Kej5Yaz6Ziy6IyD77ya5aKe5Yqg5py65Zmo77yMIOWvueWQjOS4gOS4qmlwIOeahOi/h+Wkmuivt+axgui/m+ihjOmYsuiMg+OAgiBcXG5cIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/721.bundle.js b/772.bundle.js
similarity index 55%
rename from 721.bundle.js
rename to 772.bundle.js
index c5b5309..a76ffc5 100644
--- a/721.bundle.js
+++ b/772.bundle.js
@@ -1,2 +1,2 @@
-"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[721],{721:(e,c,s)=>{s.r(c),s.d(c,{default:()=>t});const t="# cleverboy 的学习笔记"}}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIxLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsMkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vYmxvZ3MvbWFya2Rvd24vcmVhZG1lLm1kIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiIyBjbGV2ZXJib3kg55qE5a2m5Lmg56yU6K6wXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[772],{5772:(e,c,s)=>{s.r(c),s.d(c,{default:()=>t});const t="# cleverboy 的学习笔记"}}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcyLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsMkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdF93eXovLi4vLi4vYmxvZ3MvbWFya2Rvd24vcmVhZG1lLm1kIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiIyBjbGV2ZXJib3kg55qE5a2m5Lmg56yU6K6wXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/344.bundle.js b/867.bundle.js
similarity index 57%
rename from 344.bundle.js
rename to 867.bundle.js
index 782c780..7aba7ba 100644
--- a/344.bundle.js
+++ b/867.bundle.js
@@ -1,2 +1,2 @@
-"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[344],{344:(e,n,t)=>{t.r(n),t.d(n,{default:()=>s});const s="#### 一 webpack 是什么?\n它是一个打包工具。 噗,完啦?\n\n来,我们看官方概念: webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),此依赖图会映射项目所需的每个模块,并生成一个或多个 bundle。\n\n内部如何构建一个依赖图,我们知道 webpack 会配置一个入口,这就是从这入口文件开始, 找到所有被依赖到的文件,比如其他 js / image / json 文件等,然后通过 loader 对这些文件进行处理、编译、打包、优化,生成一个 bundle 或者多个 bundle。\n\n#### 它的原理\n通过以上,主要就是找依赖, 通过配置处理相应环境,根据你的需要配置插件进行优化(如 profill、babel、 miniSize etc) 打包出文件,可以放到服务器上运行。 \n\n关于找依赖,可以想到关于模块化的语法: import 、require、@import etc, 通过解析对应的语法寻找相应的依赖。然后通过读取依赖到的文件,根据对应的 loader 进行处理文件,最后根据你的插件配置,分割,压缩或注入等,根据 output config输出到对应的文件夹。\n\n这里推荐一篇 [webpack原理](https://juejin.im/entry/5b0e3eba5188251534379615) 文章, 下面就提一提我最近遇到的一个很神奇的问题吧\n\n#### 关于 [tree shaking](https://webpack.docschina.org/guides/tree-shaking/)\n想象抖一抖树,枯萎的叶子就会脱落。 这里指的是把没有用到的代码删除掉,从而减小文件的大小。通过这一优化,在引用多个第三方库时,能够大大的减少你的文件大小,但请确定这个包是没有副作用的。\n>什么是副作用?\n就是在导入时会自行运行一段函数,从而改变了 window 变量啊或者其他的变量以供导入的包能正常运行, 而不是只单单 export 了变量。\n\n它是依赖于 es2015 的 `静态导入导出( import / export)`。在打包时就会通过 import 确定引用包的 export 导出的某一个变量之一, 在告知没有副作用的情况下,删除掉没有用到的其他的导出代码。 \n> 静态导入是指一开始就默认加载这个文件,而不是一步一步执行代码判断逻辑,去导入对应文件\n\nwebpack 在生成环境下,默认打开树抖动配置, 如下配置。\n```\noptimization: {\n\tprovidedExports: true,\n\tusedExports: true,\n\tsideEffects: true,\n\tconcatenateModules: true,\n }\n ```\n \n `providedExports` 开启 export 导出收集;\n` usedExportts` 告诉webpack确定每个模块的已使用导出;\n` concatenateModules` 告诉webpack查找模块图的各个部分,这些部分可以安全地连接成一个模块;\n`sideEffects` 告诉webpack识别 sideEffects 标志的 package.json 或规则以跳过模块,这些模块在未使用导出时被标记为不包含副作用, 则可以把无副作用的未使用的导出进行删除。\n\n所以如果你的包无副作用,推荐在 package.json 设置 `sideEffects: false` 开启树抖动。\n注意, 它会删掉样式文件,因为样式文件是没有 export 的。所以我们需要声明样式文件是有副作用的。\n在 package.json 中设置:\n```\nsideEffects: [\n\t'*.css'\n]\n```\n>总结,为了利用树木摇晃,你必须:\n> 1 使用ES2015模块语法 (配置 babel 禁止转义 es6 模块语义)\n> 2 将\"sideEffects\"属性添加到项目的 package.json文件中。\n> 3 配合压缩工具一起使用\n\n\n[demo](https://github.com/cleverboy32/tree-shaking-css)\n通过配置 `webpack.prod.js` sideEffects 值, 你可以看到 build 时 main.js 文件的大小发生改变。"}}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ0LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoia0lBQUEsZzZEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3dlYnBhY2subWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyMjIOS4gCAgd2VicGFjayDmmK/ku4DkuYjvvJ9cXG7lroPmmK/kuIDkuKrmiZPljIXlt6XlhbfjgIIg5ZmX77yM5a6M5ZWm77yfXFxuXFxu5p2l77yM5oiR5Lus55yL5a6Y5pa55qaC5b+1OiAgd2VicGFjayDmmK/kuIDkuKrnjrDku6MgSmF2YVNjcmlwdCDlupTnlKjnqIvluo/nmoTpnZnmgIHmqKHlnZfmiZPljIXlt6XlhbfjgILlvZMgd2VicGFjayDlpITnkIblupTnlKjnqIvluo/ml7bvvIzlroPkvJrlnKjlhoXpg6jmnoTlu7rkuIDkuKog5L6d6LWW5Zu+KGRlcGVuZGVuY3kgZ3JhcGgp77yM5q2k5L6d6LWW5Zu+5Lya5pig5bCE6aG555uu5omA6ZyA55qE5q+P5Liq5qih5Z2X77yM5bm255Sf5oiQ5LiA5Liq5oiW5aSa5LiqIGJ1bmRsZeOAglxcblxcbuWGhemDqOWmguS9leaehOW7uuS4gOS4quS+nei1luWbvu+8jOaIkeS7rOefpemBkyB3ZWJwYWNrIOS8mumFjee9ruS4gOS4quWFpeWPo++8jOi/meWwseaYr+S7jui/meWFpeWPo+aWh+S7tuW8gOWni++8jCDmib7liLDmiYDmnInooqvkvp3otZbliLDnmoTmlofku7bvvIzmr5TlpoLlhbbku5YganMgLyBpbWFnZSAvIGpzb24g5paH5Lu2562J77yM54S25ZCO6YCa6L+HIGxvYWRlciDlr7nov5nkupvmlofku7bov5vooYzlpITnkIbjgIHnvJbor5HjgIHmiZPljIXjgIHkvJjljJbvvIznlJ/miJDkuIDkuKogYnVuZGxlIOaIluiAheWkmuS4qiBidW5kbGXjgIJcXG5cXG4jIyMjIOWug+eahOWOn+eQhlxcbumAmui/h+S7peS4iu+8jOS4u+imgeWwseaYr+aJvuS+nei1liwg6YCa6L+H6YWN572u5aSE55CG55u45bqU546v5aKD77yM5qC55o2u5L2g55qE6ZyA6KaB6YWN572u5o+S5Lu26L+b6KGM5LyY5YyW77yI5aaCIHByb2ZpbGzjgIFiYWJlbOOAgSBtaW5pU2l6ZSBldGMpIOaJk+WMheWHuuaWh+S7tu+8jOWPr+S7peaUvuWIsOacjeWKoeWZqOS4iui/kOihjOOAgiBcXG5cXG7lhbPkuo7mib7kvp3otZbvvIzlj6/ku6Xmg7PliLDlhbPkuo7mqKHlnZfljJbnmoTor63ms5U6IGltcG9ydCDjgIFyZXF1aXJl44CBQGltcG9ydCBldGPvvIwg6YCa6L+H6Kej5p6Q5a+55bqU55qE6K+t5rOV5a+75om+55u45bqU55qE5L6d6LWW44CC54S25ZCO6YCa6L+H6K+75Y+W5L6d6LWW5Yiw55qE5paH5Lu277yM5qC55o2u5a+55bqU55qEIGxvYWRlciDov5vooYzlpITnkIbmlofku7bvvIzmnIDlkI7moLnmja7kvaDnmoTmj5Lku7bphY3nva7vvIzliIblibLvvIzljovnvKnmiJbms6jlhaXnrYnvvIzmoLnmja4gb3V0cHV0IGNvbmZpZ+i+k+WHuuWIsOWvueW6lOeahOaWh+S7tuWkueOAglxcblxcbui/memHjOaOqOiNkOS4gOevhyBbd2VicGFja+WOn+eQhl0oaHR0cHM6Ly9qdWVqaW4uaW0vZW50cnkvNWIwZTNlYmE1MTg4MjUxNTM0Mzc5NjE1KSDmlofnq6AsIOS4i+mdouWwseaPkOS4gOaPkOaIkeacgOi/kemBh+WIsOeahOS4gOS4quW+iOelnuWlh+eahOmXrumimOWQp1xcblxcbiMjIyMg5YWz5LqOIFt0cmVlIHNoYWtpbmddKGh0dHBzOi8vd2VicGFjay5kb2NzY2hpbmEub3JnL2d1aWRlcy90cmVlLXNoYWtpbmcvKVxcbuaDs+ixoeaKluS4gOaKluagke+8jOaer+iQjueahOWPtuWtkOWwseS8muiEseiQveOAgiDov5nph4zmjIfnmoTmmK/miormsqHmnInnlKjliLDnmoTku6PnoIHliKDpmaTmjonvvIzku47ogIzlh4/lsI/mlofku7bnmoTlpKflsI/jgILpgJrov4fov5nkuIDkvJjljJbvvIzlnKjlvJXnlKjlpJrkuKrnrKzkuInmlrnlupPml7bvvIzog73lpJ/lpKflpKfnmoTlh4/lsJHkvaDnmoTmlofku7blpKflsI/vvIzkvYbor7fnoa7lrprov5nkuKrljIXmmK/msqHmnInlia/kvZznlKjnmoTjgIJcXG4+5LuA5LmI5piv5Ymv5L2c55SoP1xcbuWwseaYr+WcqOWvvOWFpeaXtuS8muiHquihjOi/kOihjOS4gOauteWHveaVsO+8jOS7juiAjOaUueWPmOS6hiB3aW5kb3cg5Y+Y6YeP5ZWK5oiW6ICF5YW25LuW55qE5Y+Y6YeP5Lul5L6b5a+85YWl55qE5YyF6IO95q2j5bi46L+Q6KGM77yMIOiAjOS4jeaYr+WPquWNleWNlSBleHBvcnQg5LqG5Y+Y6YeP44CCXFxuXFxu5a6D5piv5L6d6LWW5LqOIGVzMjAxNSDnmoQgYOmdmeaAgeWvvOWFpeWvvOWHuiggaW1wb3J0IC8gZXhwb3J0KWDjgILlnKjmiZPljIXml7blsLHkvJrpgJrov4cgaW1wb3J0IOehruWumuW8leeUqOWMheeahCBleHBvcnQg5a+85Ye655qE5p+Q5LiA5Liq5Y+Y6YeP5LmL5LiA77yMIOWcqOWRiuefpeayoeacieWJr+S9nOeUqOeahOaDheWGteS4i++8jOWIoOmZpOaOieayoeacieeUqOWIsOeahOWFtuS7lueahOWvvOWHuuS7o+eggeOAgiBcXG4+IOmdmeaAgeWvvOWFpeaYr+aMh+S4gOW8gOWni+Wwsem7mOiupOWKoOi9vei/meS4quaWh+S7tu+8jOiAjOS4jeaYr+S4gOatpeS4gOatpeaJp+ihjOS7o+eggeWIpOaWremAu+i+ke+8jOWOu+WvvOWFpeWvueW6lOaWh+S7tlxcblxcbndlYnBhY2sg5Zyo55Sf5oiQ546v5aKD5LiL77yM6buY6K6k5omT5byA5qCR5oqW5Yqo6YWN572uLCDlpoLkuIvphY3nva7jgIJcXG5gYGBcXG5vcHRpbWl6YXRpb27vvJoge1xcblxcdHByb3ZpZGVkRXhwb3J0czogdHJ1ZSxcXG5cXHR1c2VkRXhwb3J0czogdHJ1ZSxcXG5cXHRzaWRlRWZmZWN0czogdHJ1ZSxcXG5cXHRjb25jYXRlbmF0ZU1vZHVsZXM6IHRydWUsXFxuIH1cXG4gYGBgXFxuIFxcbiBgcHJvdmlkZWRFeHBvcnRzYCDlvIDlkK8gZXhwb3J0IOWvvOWHuuaUtumbhu+8m1xcbmAgdXNlZEV4cG9ydHRzYCDlkYror4l3ZWJwYWNr56Gu5a6a5q+P5Liq5qih5Z2X55qE5bey5L2/55So5a+85Ye677ybXFxuYCBjb25jYXRlbmF0ZU1vZHVsZXNgICDlkYror4l3ZWJwYWNr5p+l5om+5qih5Z2X5Zu+55qE5ZCE5Liq6YOo5YiG77yM6L+Z5Lqb6YOo5YiG5Y+v5Lul5a6J5YWo5Zyw6L+e5o6l5oiQ5LiA5Liq5qih5Z2X77ybXFxuYHNpZGVFZmZlY3RzYCDlkYror4l3ZWJwYWNr6K+G5YirIHNpZGVFZmZlY3RzIOagh+W/l+eahCBwYWNrYWdlLmpzb24g5oiW6KeE5YiZ5Lul6Lez6L+H5qih5Z2X77yM6L+Z5Lqb5qih5Z2X5Zyo5pyq5L2/55So5a+85Ye65pe26KKr5qCH6K6w5Li65LiN5YyF5ZCr5Ymv5L2c55So77yMIOWImeWPr+S7peaKiuaXoOWJr+S9nOeUqOeahOacquS9v+eUqOeahOWvvOWHuui/m+ihjOWIoOmZpOOAglxcblxcbuaJgOS7peWmguaenOS9oOeahOWMheaXoOWJr+S9nOeUqO+8jOaOqOiNkOWcqCBwYWNrYWdlLmpzb24g6K6+572uIGBzaWRlRWZmZWN0czogZmFsc2VgIOW8gOWQr+agkeaKluWKqOOAglxcbuazqOaEjywg5a6D5Lya5Yig5o6J5qC35byP5paH5Lu277yM5Zug5Li65qC35byP5paH5Lu25piv5rKh5pyJIGV4cG9ydCDnmoTjgILmiYDku6XmiJHku6zpnIDopoHlo7DmmI7moLflvI/mlofku7bmmK/mnInlia/kvZznlKjnmoTjgIJcXG7lnKggcGFja2FnZS5qc29uIOS4reiuvue9ru+8mlxcbmBgYFxcbnNpZGVFZmZlY3RzOiBbXFxuXFx0JyouY3NzJ1xcbl1cXG5gYGBcXG4+5oC757uT77yM5Li65LqG5Yip55So5qCR5pyo5pGH5pmD77yM5L2g5b+F6aG777yaXFxuPiAxIOS9v+eUqEVTMjAxNeaooeWdl+ivreazlSAo6YWN572uIGJhYmVsIOemgeatoui9rOS5iSBlczYg5qih5Z2X6K+t5LmJ77yJXFxuPiAyIOWwhlxcXCJzaWRlRWZmZWN0c1xcXCLlsZ7mgKfmt7vliqDliLDpobnnm67nmoQgcGFja2FnZS5qc29u5paH5Lu25Lit44CCXFxuPiAgMyDphY3lkIjljovnvKnlt6XlhbfkuIDotbfkvb/nlKhcXG5cXG5cXG5bZGVtb10oaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3RyZWUtc2hha2luZy1jc3MpXFxu6YCa6L+H6YWN572uICBgd2VicGFjay5wcm9kLmpzYCBzaWRlRWZmZWN0cyDlgLzvvIwg5L2g5Y+v5Lul55yL5YiwIGJ1aWxkIOaXtiBtYWluLmpzIOaWh+S7tueahOWkp+Wwj+WPkeeUn+aUueWPmOOAglwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[867],{1867:(e,n,t)=>{t.r(n),t.d(n,{default:()=>s});const s="#### 一 webpack 是什么?\n它是一个打包工具。 噗,完啦?\n\n来,我们看官方概念: webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),此依赖图会映射项目所需的每个模块,并生成一个或多个 bundle。\n\n内部如何构建一个依赖图,我们知道 webpack 会配置一个入口,这就是从这入口文件开始, 找到所有被依赖到的文件,比如其他 js / image / json 文件等,然后通过 loader 对这些文件进行处理、编译、打包、优化,生成一个 bundle 或者多个 bundle。\n\n#### 它的原理\n通过以上,主要就是找依赖, 通过配置处理相应环境,根据你的需要配置插件进行优化(如 profill、babel、 miniSize etc) 打包出文件,可以放到服务器上运行。 \n\n关于找依赖,可以想到关于模块化的语法: import 、require、@import etc, 通过解析对应的语法寻找相应的依赖。然后通过读取依赖到的文件,根据对应的 loader 进行处理文件,最后根据你的插件配置,分割,压缩或注入等,根据 output config输出到对应的文件夹。\n\n这里推荐一篇 [webpack原理](https://juejin.im/entry/5b0e3eba5188251534379615) 文章, 下面就提一提我最近遇到的一个很神奇的问题吧\n\n#### 关于 [tree shaking](https://webpack.docschina.org/guides/tree-shaking/)\n想象抖一抖树,枯萎的叶子就会脱落。 这里指的是把没有用到的代码删除掉,从而减小文件的大小。通过这一优化,在引用多个第三方库时,能够大大的减少你的文件大小,但请确定这个包是没有副作用的。\n>什么是副作用?\n就是在导入时会自行运行一段函数,从而改变了 window 变量啊或者其他的变量以供导入的包能正常运行, 而不是只单单 export 了变量。\n\n它是依赖于 es2015 的 `静态导入导出( import / export)`。在打包时就会通过 import 确定引用包的 export 导出的某一个变量之一, 在告知没有副作用的情况下,删除掉没有用到的其他的导出代码。 \n> 静态导入是指一开始就默认加载这个文件,而不是一步一步执行代码判断逻辑,去导入对应文件\n\nwebpack 在生成环境下,默认打开树抖动配置, 如下配置。\n```\noptimization: {\n\tprovidedExports: true,\n\tusedExports: true,\n\tsideEffects: true,\n\tconcatenateModules: true,\n }\n ```\n \n `providedExports` 开启 export 导出收集;\n` usedExportts` 告诉webpack确定每个模块的已使用导出;\n` concatenateModules` 告诉webpack查找模块图的各个部分,这些部分可以安全地连接成一个模块;\n`sideEffects` 告诉webpack识别 sideEffects 标志的 package.json 或规则以跳过模块,这些模块在未使用导出时被标记为不包含副作用, 则可以把无副作用的未使用的导出进行删除。\n\n所以如果你的包无副作用,推荐在 package.json 设置 `sideEffects: false` 开启树抖动。\n注意, 它会删掉样式文件,因为样式文件是没有 export 的。所以我们需要声明样式文件是有副作用的。\n在 package.json 中设置:\n```\nsideEffects: [\n\t'*.css'\n]\n```\n>总结,为了利用树木摇晃,你必须:\n> 1 使用ES2015模块语法 (配置 babel 禁止转义 es6 模块语义)\n> 2 将\"sideEffects\"属性添加到项目的 package.json文件中。\n> 3 配合压缩工具一起使用\n\n\n[demo](https://github.com/cleverboy32/tree-shaking-css)\n通过配置 `webpack.prod.js` sideEffects 值, 你可以看到 build 时 main.js 文件的大小发生改变。"}}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY3LmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoibUlBQUEsZzZEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmVhY3Rfd3l6Ly4uLy4uL2Jsb2dzL21hcmtkb3duL3dlYnBhY2subWQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIjIyMjIOS4gCAgd2VicGFjayDmmK/ku4DkuYjvvJ9cXG7lroPmmK/kuIDkuKrmiZPljIXlt6XlhbfjgIIg5ZmX77yM5a6M5ZWm77yfXFxuXFxu5p2l77yM5oiR5Lus55yL5a6Y5pa55qaC5b+1OiAgd2VicGFjayDmmK/kuIDkuKrnjrDku6MgSmF2YVNjcmlwdCDlupTnlKjnqIvluo/nmoTpnZnmgIHmqKHlnZfmiZPljIXlt6XlhbfjgILlvZMgd2VicGFjayDlpITnkIblupTnlKjnqIvluo/ml7bvvIzlroPkvJrlnKjlhoXpg6jmnoTlu7rkuIDkuKog5L6d6LWW5Zu+KGRlcGVuZGVuY3kgZ3JhcGgp77yM5q2k5L6d6LWW5Zu+5Lya5pig5bCE6aG555uu5omA6ZyA55qE5q+P5Liq5qih5Z2X77yM5bm255Sf5oiQ5LiA5Liq5oiW5aSa5LiqIGJ1bmRsZeOAglxcblxcbuWGhemDqOWmguS9leaehOW7uuS4gOS4quS+nei1luWbvu+8jOaIkeS7rOefpemBkyB3ZWJwYWNrIOS8mumFjee9ruS4gOS4quWFpeWPo++8jOi/meWwseaYr+S7jui/meWFpeWPo+aWh+S7tuW8gOWni++8jCDmib7liLDmiYDmnInooqvkvp3otZbliLDnmoTmlofku7bvvIzmr5TlpoLlhbbku5YganMgLyBpbWFnZSAvIGpzb24g5paH5Lu2562J77yM54S25ZCO6YCa6L+HIGxvYWRlciDlr7nov5nkupvmlofku7bov5vooYzlpITnkIbjgIHnvJbor5HjgIHmiZPljIXjgIHkvJjljJbvvIznlJ/miJDkuIDkuKogYnVuZGxlIOaIluiAheWkmuS4qiBidW5kbGXjgIJcXG5cXG4jIyMjIOWug+eahOWOn+eQhlxcbumAmui/h+S7peS4iu+8jOS4u+imgeWwseaYr+aJvuS+nei1liwg6YCa6L+H6YWN572u5aSE55CG55u45bqU546v5aKD77yM5qC55o2u5L2g55qE6ZyA6KaB6YWN572u5o+S5Lu26L+b6KGM5LyY5YyW77yI5aaCIHByb2ZpbGzjgIFiYWJlbOOAgSBtaW5pU2l6ZSBldGMpIOaJk+WMheWHuuaWh+S7tu+8jOWPr+S7peaUvuWIsOacjeWKoeWZqOS4iui/kOihjOOAgiBcXG5cXG7lhbPkuo7mib7kvp3otZbvvIzlj6/ku6Xmg7PliLDlhbPkuo7mqKHlnZfljJbnmoTor63ms5U6IGltcG9ydCDjgIFyZXF1aXJl44CBQGltcG9ydCBldGPvvIwg6YCa6L+H6Kej5p6Q5a+55bqU55qE6K+t5rOV5a+75om+55u45bqU55qE5L6d6LWW44CC54S25ZCO6YCa6L+H6K+75Y+W5L6d6LWW5Yiw55qE5paH5Lu277yM5qC55o2u5a+55bqU55qEIGxvYWRlciDov5vooYzlpITnkIbmlofku7bvvIzmnIDlkI7moLnmja7kvaDnmoTmj5Lku7bphY3nva7vvIzliIblibLvvIzljovnvKnmiJbms6jlhaXnrYnvvIzmoLnmja4gb3V0cHV0IGNvbmZpZ+i+k+WHuuWIsOWvueW6lOeahOaWh+S7tuWkueOAglxcblxcbui/memHjOaOqOiNkOS4gOevhyBbd2VicGFja+WOn+eQhl0oaHR0cHM6Ly9qdWVqaW4uaW0vZW50cnkvNWIwZTNlYmE1MTg4MjUxNTM0Mzc5NjE1KSDmlofnq6AsIOS4i+mdouWwseaPkOS4gOaPkOaIkeacgOi/kemBh+WIsOeahOS4gOS4quW+iOelnuWlh+eahOmXrumimOWQp1xcblxcbiMjIyMg5YWz5LqOIFt0cmVlIHNoYWtpbmddKGh0dHBzOi8vd2VicGFjay5kb2NzY2hpbmEub3JnL2d1aWRlcy90cmVlLXNoYWtpbmcvKVxcbuaDs+ixoeaKluS4gOaKluagke+8jOaer+iQjueahOWPtuWtkOWwseS8muiEseiQveOAgiDov5nph4zmjIfnmoTmmK/miormsqHmnInnlKjliLDnmoTku6PnoIHliKDpmaTmjonvvIzku47ogIzlh4/lsI/mlofku7bnmoTlpKflsI/jgILpgJrov4fov5nkuIDkvJjljJbvvIzlnKjlvJXnlKjlpJrkuKrnrKzkuInmlrnlupPml7bvvIzog73lpJ/lpKflpKfnmoTlh4/lsJHkvaDnmoTmlofku7blpKflsI/vvIzkvYbor7fnoa7lrprov5nkuKrljIXmmK/msqHmnInlia/kvZznlKjnmoTjgIJcXG4+5LuA5LmI5piv5Ymv5L2c55SoP1xcbuWwseaYr+WcqOWvvOWFpeaXtuS8muiHquihjOi/kOihjOS4gOauteWHveaVsO+8jOS7juiAjOaUueWPmOS6hiB3aW5kb3cg5Y+Y6YeP5ZWK5oiW6ICF5YW25LuW55qE5Y+Y6YeP5Lul5L6b5a+85YWl55qE5YyF6IO95q2j5bi46L+Q6KGM77yMIOiAjOS4jeaYr+WPquWNleWNlSBleHBvcnQg5LqG5Y+Y6YeP44CCXFxuXFxu5a6D5piv5L6d6LWW5LqOIGVzMjAxNSDnmoQgYOmdmeaAgeWvvOWFpeWvvOWHuiggaW1wb3J0IC8gZXhwb3J0KWDjgILlnKjmiZPljIXml7blsLHkvJrpgJrov4cgaW1wb3J0IOehruWumuW8leeUqOWMheeahCBleHBvcnQg5a+85Ye655qE5p+Q5LiA5Liq5Y+Y6YeP5LmL5LiA77yMIOWcqOWRiuefpeayoeacieWJr+S9nOeUqOeahOaDheWGteS4i++8jOWIoOmZpOaOieayoeacieeUqOWIsOeahOWFtuS7lueahOWvvOWHuuS7o+eggeOAgiBcXG4+IOmdmeaAgeWvvOWFpeaYr+aMh+S4gOW8gOWni+Wwsem7mOiupOWKoOi9vei/meS4quaWh+S7tu+8jOiAjOS4jeaYr+S4gOatpeS4gOatpeaJp+ihjOS7o+eggeWIpOaWremAu+i+ke+8jOWOu+WvvOWFpeWvueW6lOaWh+S7tlxcblxcbndlYnBhY2sg5Zyo55Sf5oiQ546v5aKD5LiL77yM6buY6K6k5omT5byA5qCR5oqW5Yqo6YWN572uLCDlpoLkuIvphY3nva7jgIJcXG5gYGBcXG5vcHRpbWl6YXRpb27vvJoge1xcblxcdHByb3ZpZGVkRXhwb3J0czogdHJ1ZSxcXG5cXHR1c2VkRXhwb3J0czogdHJ1ZSxcXG5cXHRzaWRlRWZmZWN0czogdHJ1ZSxcXG5cXHRjb25jYXRlbmF0ZU1vZHVsZXM6IHRydWUsXFxuIH1cXG4gYGBgXFxuIFxcbiBgcHJvdmlkZWRFeHBvcnRzYCDlvIDlkK8gZXhwb3J0IOWvvOWHuuaUtumbhu+8m1xcbmAgdXNlZEV4cG9ydHRzYCDlkYror4l3ZWJwYWNr56Gu5a6a5q+P5Liq5qih5Z2X55qE5bey5L2/55So5a+85Ye677ybXFxuYCBjb25jYXRlbmF0ZU1vZHVsZXNgICDlkYror4l3ZWJwYWNr5p+l5om+5qih5Z2X5Zu+55qE5ZCE5Liq6YOo5YiG77yM6L+Z5Lqb6YOo5YiG5Y+v5Lul5a6J5YWo5Zyw6L+e5o6l5oiQ5LiA5Liq5qih5Z2X77ybXFxuYHNpZGVFZmZlY3RzYCDlkYror4l3ZWJwYWNr6K+G5YirIHNpZGVFZmZlY3RzIOagh+W/l+eahCBwYWNrYWdlLmpzb24g5oiW6KeE5YiZ5Lul6Lez6L+H5qih5Z2X77yM6L+Z5Lqb5qih5Z2X5Zyo5pyq5L2/55So5a+85Ye65pe26KKr5qCH6K6w5Li65LiN5YyF5ZCr5Ymv5L2c55So77yMIOWImeWPr+S7peaKiuaXoOWJr+S9nOeUqOeahOacquS9v+eUqOeahOWvvOWHuui/m+ihjOWIoOmZpOOAglxcblxcbuaJgOS7peWmguaenOS9oOeahOWMheaXoOWJr+S9nOeUqO+8jOaOqOiNkOWcqCBwYWNrYWdlLmpzb24g6K6+572uIGBzaWRlRWZmZWN0czogZmFsc2VgIOW8gOWQr+agkeaKluWKqOOAglxcbuazqOaEjywg5a6D5Lya5Yig5o6J5qC35byP5paH5Lu277yM5Zug5Li65qC35byP5paH5Lu25piv5rKh5pyJIGV4cG9ydCDnmoTjgILmiYDku6XmiJHku6zpnIDopoHlo7DmmI7moLflvI/mlofku7bmmK/mnInlia/kvZznlKjnmoTjgIJcXG7lnKggcGFja2FnZS5qc29uIOS4reiuvue9ru+8mlxcbmBgYFxcbnNpZGVFZmZlY3RzOiBbXFxuXFx0JyouY3NzJ1xcbl1cXG5gYGBcXG4+5oC757uT77yM5Li65LqG5Yip55So5qCR5pyo5pGH5pmD77yM5L2g5b+F6aG777yaXFxuPiAxIOS9v+eUqEVTMjAxNeaooeWdl+ivreazlSAo6YWN572uIGJhYmVsIOemgeatoui9rOS5iSBlczYg5qih5Z2X6K+t5LmJ77yJXFxuPiAyIOWwhlxcXCJzaWRlRWZmZWN0c1xcXCLlsZ7mgKfmt7vliqDliLDpobnnm67nmoQgcGFja2FnZS5qc29u5paH5Lu25Lit44CCXFxuPiAgMyDphY3lkIjljovnvKnlt6XlhbfkuIDotbfkvb/nlKhcXG5cXG5cXG5bZGVtb10oaHR0cHM6Ly9naXRodWIuY29tL2NsZXZlcmJveTMyL3RyZWUtc2hha2luZy1jc3MpXFxu6YCa6L+H6YWN572uICBgd2VicGFjay5wcm9kLmpzYCBzaWRlRWZmZWN0cyDlgLzvvIwg5L2g5Y+v5Lul55yL5YiwIGJ1aWxkIOaXtiBtYWluLmpzIOaWh+S7tueahOWkp+Wwj+WPkeeUn+aUueWPmOOAglwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/707.bundle.js b/870.bundle.js
similarity index 57%
rename from 707.bundle.js
rename to 870.bundle.js
index 4c09e75..88ef120 100644
--- a/707.bundle.js
+++ b/870.bundle.js
@@ -1,2 +1,2 @@
-"use strict";(self.webpackChunkreact_wyz=self.webpackChunkreact_wyz||[]).push([[707],{707:(n,e,t)=>{t.r(e),t.d(e,{default:()=>o});const o="当我们要完成一个应用的时候,会根据对应的功能划分为许多不同的模块,就像一个论坛,有发帖的模块,评论的模块,js 中的模块也正是如此,一个具体功能的代码抽成一个文件,当你做一个东西的时候需要用到这个功能的时,可以直接使用这个文件,实现功能的分离,并能在多个需要的地方使用。就像是螺丝钉、螺丝帽、垫片一样的,通过组合使用实现出你的产品。\n\n通过直白的描述,我们可以知道,模块化的好处就是,抽离代码,重复使用,如现在很直观的代表 npm 包。\n\n\n\n那么模块化到底是怎么实现的呢?\n\n先来了解一下历史,以前的 html 不知道大家还记不记的, 一个html 页面引入了多个 js 文件.\n```\n\n\n\n \n So UI - A Component Library for Vue.js. \n\n\n
\n