From 582f901c9ba9e3f834470a75e36491486ad76e06 Mon Sep 17 00:00:00 2001 From: WaitSpring <98642411+WaitSpringQW@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:07:47 +0800 Subject: [PATCH] refactor(SiteCommon_JS): optimize logic (#1458) * refactor(SiteCommon_JS): optimize logic * remove noPermWarning * optimize logic in loadWithURL * try to optimize logic in unihanPopup --- dist/SiteCommon_JS/SiteCommon_JS.js | 235 ++++++++++++---------------- src/SiteCommon_JS/SiteCommon_JS.ts | 6 +- src/SiteCommon_JS/modules/core.tsx | 135 +++++----------- 3 files changed, 144 insertions(+), 232 deletions(-) diff --git a/dist/SiteCommon_JS/SiteCommon_JS.js b/dist/SiteCommon_JS/SiteCommon_JS.js index 7127bec5f..7c4843728 100644 --- a/dist/SiteCommon_JS/SiteCommon_JS.js +++ b/dist/SiteCommon_JS/SiteCommon_JS.js @@ -157,6 +157,7 @@ var getMessage = (key) => { return i18nMessages[key] || key; }; //! src/SiteCommon_JS/modules/core.tsx +var import_ext_gadget3 = require("ext.gadget.Util"); var { wgAction, wgCanonicalSpecialPageName, @@ -165,111 +166,77 @@ var { wgScript, wgUserName } = mw.config.get(); -var loadWithURL = () => { - const URL_WITH_CSS = mw.util.getParamValue("withCSS"); - const URL_WITH_JS = mw.util.getParamValue("withJS"); - const URL_WITH_MODULE = mw.util.getParamValue("withModule"); - if (URL_WITH_CSS || URL_WITH_JS || URL_WITH_MODULE) { - if (URL_WITH_CSS && /^MediaWiki:[^#%&<=>]*\.css$/.test(URL_WITH_CSS)) { - mw.loader.load(mw.util.getUrl(URL_WITH_CSS, { - action: "raw", - ctype: "text/css", - maxage: "3600", - smaxage: "3600" - }), "text/css"); - } - if (URL_WITH_JS && /^MediaWiki:[^#%&<=>]*\.js$/.test(URL_WITH_JS)) { - void mw.loader.using("").then((require2) => { - mw.loader.load(mw.util.getUrl(URL_WITH_JS, { +var loadWithURL = /* @__PURE__ */ function() { + var _ref = _asyncToGenerator(function* () { + const URL_WITH_CSS = mw.util.getParamValue("withCSS"); + const URL_WITH_JS = mw.util.getParamValue("withJS"); + const URL_WITH_MODULE = mw.util.getParamValue("withModule"); + if (URL_WITH_CSS || URL_WITH_JS || URL_WITH_MODULE) { + if (URL_WITH_CSS && /^MediaWiki:[^#%&<=>]*\.css$/.test(URL_WITH_CSS)) { + mw.loader.load(mw.util.getUrl(URL_WITH_CSS, { action: "raw", - ctype: "text/javascript", + ctype: "text/css", maxage: "3600", smaxage: "3600" - })); - }); - } - if (URL_WITH_MODULE && /^ext\.[^,|]+$/.test(URL_WITH_MODULE)) { - void mw.loader.using(URL_WITH_MODULE).then((require2) => { - mw.loader.load(URL_WITH_MODULE); - }); + }), "text/css"); + } + if (URL_WITH_JS || URL_WITH_MODULE) { + const require2 = yield mw.loader.using("ext.gadget.SiteCommon_JS"); + if (URL_WITH_JS && /^MediaWiki:[^#%&<=>]*\.js$/.test(URL_WITH_JS)) { + mw.loader.load(mw.util.getUrl(URL_WITH_JS, { + action: "raw", + ctype: "text/javascript", + maxage: "3600", + smaxage: "3600" + })); + } + if (URL_WITH_MODULE && /^((ext\.[^,|]+)[,|]?)+$/.test(URL_WITH_MODULE)) { + const modules = (0, import_ext_gadget3.uniqueArray)(URL_WITH_MODULE.split(/[,|]/)); + mw.loader.load(modules); + } + } } - } - const URL_USE = mw.util.getParamValue("use"); - if (URL_USE) { - const wgUserNameExcaped = mw.util.escapeRegExp(wgUserName !== null && wgUserName !== void 0 ? wgUserName : ""); - const REGEX_FILE = new RegExp("^(?:MediaWiki:".concat(wgUserNameExcaped ? "|User:".concat(wgUserNameExcaped, "/") : "", ")[^&<>=%#]*\\.(js|css)$")); - const REGEX_EXT = /^ext\.[^,]+$/; - const path = "".concat(wgScript, "?action=raw&ctype=text/"); - var _iterator2 = _createForOfIteratorHelper(URL_USE.split("|")), _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) { - var _REGEX_FILE$exec; - const useFile = _step2.value; - const name = useFile.toString().trim(); - const what = (_REGEX_FILE$exec = REGEX_FILE.exec(name)) !== null && _REGEX_FILE$exec !== void 0 ? _REGEX_FILE$exec : ["", ""]; - switch (what[1]) { - case "js": - void mw.loader.using("").then((require2) => { - mw.loader.load("".concat(path, "javascript&title=").concat(encodeURIComponent(name))); - }); - break; - case "css": - mw.loader.load("".concat(path, "css&title=").concat(encodeURIComponent(name))); - break; - default: - if (REGEX_EXT.test(name)) { - void mw.loader.using(name).then((require2) => { - mw.loader.load(name); - }); + const URL_USE = mw.util.getParamValue("use"); + if (URL_USE) { + const wgUserNameExcaped = mw.util.escapeRegExp(wgUserName !== null && wgUserName !== void 0 ? wgUserName : ""); + const REGEX_FILE = new RegExp("^(?:MediaWiki:".concat(wgUserNameExcaped ? "|User:".concat(wgUserNameExcaped, "/") : "", ")[^&<>=%#]*\\.(js|css)$")); + const REGEX_EXT = /^ext\.[^,]+$/; + const path = wgScript; + const useFiles = URL_USE.split(/[,|]/); + var _iterator2 = _createForOfIteratorHelper(useFiles), _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) { + var _REGEX_FILE$exec; + const useFile = _step2.value; + const name = useFile.toString().trim(); + const what = (_REGEX_FILE$exec = REGEX_FILE.exec(name)) !== null && _REGEX_FILE$exec !== void 0 ? _REGEX_FILE$exec : ["", ""]; + switch (what[1]) { + case "css": + mw.loader.load("".concat(path, "?action=raw&ctype=text/css&title=").concat(encodeURIComponent(name))); + break; + case "js": { + const require2 = yield mw.loader.using("ext.gadget.SiteCommon_JS"); + mw.loader.load("".concat(path, "?action=raw&ctype=text/javascript&title=").concat(encodeURIComponent(name))); + break; } + default: + if (REGEX_EXT.test(name)) { + const require2 = yield mw.loader.using("ext.gadget.SiteCommon_JS"); + mw.loader.load(name); + } + } } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); } - } -}; -var noPermWarning = () => { - const URL_NO_PERM = mw.util.getParamValue("noperm"); - if (!URL_NO_PERM) { - return; - } - switch (URL_NO_PERM) { - case "0": - void mw.notify(window.wgULS("因技术原因,您没有权限访问相关页面。若有疑问,请与求闻百科运营者联系。", "因技術原因,您沒有權限訪問相關頁面。若有疑問,請與求聞百科運營者聯系。"), { - tag: "noPerm", - type: "error" - }); - break; - case "1": - void mw.notify(window.wgULS("您没有权限访问相关页面。若您是资深编者,请与求闻百科技术团队联系,以获取权限。", "您沒有權限訪問相關頁面。若您是資深編者,請與求聞百科技術團隊聯系,以獲取權限。"), { - tag: "noPerm", - type: "error" - }); - break; - case "2": - void mw.notify(window.wgULS("您的网络环境存在风险,请登录后继续使用。若您没有求闻百科账号,请注册后登录。", "您的網路環境存在風險,請登入後繼續使用。若您沒有求聞百科賬號,請注冊後登錄。"), { - tag: "noPerm", - type: "warn" - }); - break; - case "3": - void mw.notify(window.wgULS("相关功能仅向注册用户开放,请登录后继续使用。若您没有求闻百科账号,请注册后登录。", "相關功能僅向注冊用戶開放,請登入後繼續使用。若您沒有求聞百科賬號,請注冊後登錄。"), { - tag: "noPerm", - type: "warn" - }); - break; - default: - void mw.notify(window.wgULS("您没有权限访问相关页面。若有疑问,请与求闻百科运营者联系。", "您沒有權限訪問相關頁面。若有疑問,請與求聞百科運營者聯系。"), { - tag: "noPerm", - type: "error" - }); - } - const newUrl = location.href.replace(/[?&]noperm=[0-9]+/, ""); - history.pushState({}, document.title, newUrl); -}; + }); + return function loadWithURL2() { + return _ref.apply(this, arguments); + }; +}(); var highLightRev = ($body) => { const URL_HIGHLIGHT = mw.util.getParamValue("highlight"); const URL_HILIGHT = mw.util.getParamValue("hilight"); @@ -346,20 +313,21 @@ var titleCleanUp = ($body) => { document.title = replaceTitle(documentTitle); $firstHeading.text(replaceTitle(pageTitle)); }; -var unihanPopup = ($body) => { - if (wgNamespaceNumber < 0) { - return; - } - var _iterator4 = _createForOfIteratorHelper($body.find("attr, .inline-unihan")), _step4; - try { - for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) { - const element = _step4.value; - const $element = $(element); - const title = $element.attr("title"); - if (!title) { - continue; - } - void mw.loader.using("oojs-ui-core").then(() => { +var unihanPopup = /* @__PURE__ */ function() { + var _ref2 = _asyncToGenerator(function* ($body) { + if (wgNamespaceNumber < 0) { + return; + } + yield mw.loader.using("oojs-ui-core"); + var _iterator4 = _createForOfIteratorHelper($body.find("attr, .inline-unihan")), _step4; + try { + for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) { + const element = _step4.value; + const $element = $(element); + const title = $element.attr("title"); + if (!title) { + continue; + } const popup = new OO.ui.PopupWidget({ $content: $(/* @__PURE__ */ import_ext_gadget2.default.createElement("p", null, title)), label: getMessage("Note"), @@ -367,17 +335,21 @@ var unihanPopup = ($body) => { head: true, padded: true }); - $element.append(popup.$element).on("click", () => { + $body.append(popup.$element); + $element.on("click", () => { popup.toggle(); }); - }); + } + } catch (err) { + _iterator4.e(err); + } finally { + _iterator4.f(); } - } catch (err) { - _iterator4.e(err); - } finally { - _iterator4.f(); - } -}; + }); + return function unihanPopup2(_x) { + return _ref2.apply(this, arguments); + }; +}(); var fixLocationHash = () => { if (location.hash) { location.href = location.hash; @@ -404,7 +376,7 @@ var toggleLink = ($body) => { } }; //! src/SiteCommon_JS/modules/tippy.ts -var import_ext_gadget3 = require("ext.gadget.Tippy"); +var import_ext_gadget4 = require("ext.gadget.Tippy"); var { skin } = mw.config.get(); @@ -443,7 +415,7 @@ var tippyForCitizenHeader = ($body) => { "aria-label": title, title: "" }); - (0, import_ext_gadget3.tippy)($element.get(0), { + (0, import_ext_gadget4.tippy)($element.get(0), { arrow: true, content: title, placement: "bottom", @@ -459,9 +431,9 @@ var tippyForCitizenHeader = ($body) => { } }; var tippyForExtension = /* @__PURE__ */ function() { - var _ref = _asyncToGenerator(function* () { + var _ref3 = _asyncToGenerator(function* () { yield mw.loader.using("ext.CollapsibleSidebar.js"); - (0, import_ext_gadget3.tippy)("#sidebarButton", { + (0, import_ext_gadget4.tippy)("#sidebarButton", { arrow: true, content: getContent, placement: "left", @@ -471,7 +443,7 @@ var tippyForExtension = /* @__PURE__ */ function() { }); if (skin === "vector") { yield mw.loader.using("ext.CollapsibleSidebar.vector"); - (0, import_ext_gadget3.tippy)("#sidebarCollapse", { + (0, import_ext_gadget4.tippy)("#sidebarCollapse", { arrow: true, content: getContent, placement: "right", @@ -481,7 +453,7 @@ var tippyForExtension = /* @__PURE__ */ function() { }); } yield mw.loader.using("ext.DarkMode"); - (0, import_ext_gadget3.tippy)("#darkmode-button", { + (0, import_ext_gadget4.tippy)("#darkmode-button", { arrow: true, content: getContent, placement: "left", @@ -491,7 +463,7 @@ var tippyForExtension = /* @__PURE__ */ function() { }); }); return function tippyForExtension2() { - return _ref.apply(this, arguments); + return _ref3.apply(this, arguments); }; }(); //! src/SiteCommon_JS/modules/deprecatedFunctions.ts @@ -547,23 +519,22 @@ var deprecatedFunctions = () => { ); }; //! src/SiteCommon_JS/SiteCommon_JS.ts -var import_ext_gadget4 = require("ext.gadget.Util"); +var import_ext_gadget5 = require("ext.gadget.Util"); (function siteCommon() { const configKey = "gadget-SiteCommon_JS__Initialized"; if (mw.config.get(configKey)) { return; } mw.config.set(configKey, true); - loadWithURL(); - noPermWarning(); + void loadWithURL(); fixLocationHash(); - void (0, import_ext_gadget4.getBody)().then(($body) => { + void (0, import_ext_gadget5.getBody)().then(($body) => { highLightRev($body); addTargetBlank($body); removeTitleFromPermalink($body); openSearchInNewTab($body); titleCleanUp($body); - unihanPopup($body); + void unihanPopup($body); hideNewUsersLog($body); toggleLink($body); tippyForCitizenHeader($body); @@ -576,4 +547,4 @@ var import_ext_gadget4 = require("ext.gadget.Util"); /* */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1NpdGVDb21tb25fSlMvbW9kdWxlcy9jb3JlLnRzeCIsICJzcmMvU2l0ZUNvbW1vbl9KUy9tb2R1bGVzL2kxOG4udHMiLCAic3JjL1NpdGVDb21tb25fSlMvbW9kdWxlcy90aXBweS50cyIsICJzcmMvU2l0ZUNvbW1vbl9KUy9tb2R1bGVzL2RlcHJlY2F0ZWRGdW5jdGlvbnMudHMiLCAic3JjL1NpdGVDb21tb25fSlMvU2l0ZUNvbW1vbl9KUy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IFJlYWN0IGZyb20gJ2V4dC5nYWRnZXQuUmVhY3QnO1xuaW1wb3J0IHtnZXRNZXNzYWdlfSBmcm9tICcuL2kxOG4nO1xuXG5jb25zdCB7d2dBY3Rpb24sIHdnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lLCB3Z05hbWVzcGFjZU51bWJlciwgd2dQYWdlTmFtZSwgd2dTY3JpcHQsIHdnVXNlck5hbWV9ID0gbXcuY29uZmlnLmdldCgpO1xuXG5jb25zdCBsb2FkV2l0aFVSTCA9ICgpOiB2b2lkID0+IHtcblx0Y29uc3QgVVJMX1dJVEhfQ1NTOiBzdHJpbmcgfCBudWxsID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd3aXRoQ1NTJyk7XG5cdGNvbnN0IFVSTF9XSVRIX0pTOiBzdHJpbmcgfCBudWxsID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd3aXRoSlMnKTtcblx0Y29uc3QgVVJMX1dJVEhfTU9EVUxFOiBzdHJpbmcgfCBudWxsID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd3aXRoTW9kdWxlJyk7XG5cdC8qKlxuXHQgKiAmd2l0aENTUz0gYW5kICZ3aXRoSlM9IFVSTCBwYXJhbWV0ZXJzXG5cdCAqIEFsbG93IHRvIHRyeSBjdXN0b20gc2NyaXB0cyBmcm9tIE1lZGlhV2lraSBzcGFjZVxuXHQgKiB3aXRob3V0IGVkaXRpbmcgcGVyc29uYWwgLmNzcyBvciAuanMgZmlsZXNcblx0ICovXG5cdGlmIChVUkxfV0lUSF9DU1MgfHwgVVJMX1dJVEhfSlMgfHwgVVJMX1dJVEhfTU9EVUxFKSB7XG5cdFx0aWYgKFVSTF9XSVRIX0NTUyAmJiAvXk1lZGlhV2lraTpbXiMlJjw9Pl0qXFwuY3NzJC8udGVzdChVUkxfV0lUSF9DU1MpKSB7XG5cdFx0XHRtdy5sb2FkZXIubG9hZChcblx0XHRcdFx0bXcudXRpbC5nZXRVcmwoVVJMX1dJVEhfQ1NTLCB7XG5cdFx0XHRcdFx0YWN0aW9uOiAncmF3Jyxcblx0XHRcdFx0XHRjdHlwZTogJ3RleHQvY3NzJyxcblx0XHRcdFx0XHRtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0XHRzbWF4YWdlOiAnMzYwMCcsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHQndGV4dC9jc3MnXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoVVJMX1dJVEhfSlMgJiYgL15NZWRpYVdpa2k6W14jJSY8PT5dKlxcLmpzJC8udGVzdChVUkxfV0lUSF9KUykpIHtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFM2MTMzXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0XHR2b2lkIG13LmxvYWRlci51c2luZygnJykudGhlbigocmVxdWlyZSk6IHZvaWQgPT4ge1xuXHRcdFx0XHRtdy5sb2FkZXIubG9hZChcblx0XHRcdFx0XHRtdy51dGlsLmdldFVybChVUkxfV0lUSF9KUywge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiAncmF3Jyxcblx0XHRcdFx0XHRcdGN0eXBlOiAndGV4dC9qYXZhc2NyaXB0Jyxcblx0XHRcdFx0XHRcdG1heGFnZTogJzM2MDAnLFxuXHRcdFx0XHRcdFx0c21heGFnZTogJzM2MDAnLFxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKFVSTF9XSVRIX01PRFVMRSAmJiAvXmV4dFxcLlteLHxdKyQvLnRlc3QoVVJMX1dJVEhfTU9EVUxFKSkge1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUzYxMzNcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0XHRcdHZvaWQgbXcubG9hZGVyLnVzaW5nKFVSTF9XSVRIX01PRFVMRSkudGhlbigocmVxdWlyZSk6IHZvaWQgPT4ge1xuXHRcdFx0XHRtdy5sb2FkZXIubG9hZChVUkxfV0lUSF9NT0RVTEUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBMb2FkIENTUyBhbmQgSlMgZmlsZXMgdGVtcG9yYXJpbHkgdGhyb3VnaCBVUkwuXG5cdCAqICZ1c2U9RmlsZTEuY3NzfEZpbGUyLmNzc3xGaWxlMy5qc1xuXHQgKi9cblx0Y29uc3QgVVJMX1VTRTogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndXNlJyk7XG5cdGlmIChVUkxfVVNFKSB7XG5cdFx0Y29uc3Qgd2dVc2VyTmFtZUV4Y2FwZWQ6IHN0cmluZyA9IG13LnV0aWwuZXNjYXBlUmVnRXhwKHdnVXNlck5hbWUgPz8gJycpO1xuXHRcdGNvbnN0IFJFR0VYX0ZJTEU6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG5cdFx0XHRgXig/Ok1lZGlhV2lraToke3dnVXNlck5hbWVFeGNhcGVkID8gYHxVc2VyOiR7d2dVc2VyTmFtZUV4Y2FwZWR9L2AgOiAnJ30pW14mPD49JSNdKlxcXFwuKGpzfGNzcykkYFxuXHRcdCk7XG5cdFx0Y29uc3QgUkVHRVhfRVhUOiBSZWdFeHAgPSAvXmV4dFxcLlteLF0rJC87XG5cdFx0Y29uc3QgcGF0aDogc3RyaW5nID0gYCR7d2dTY3JpcHR9P2FjdGlvbj1yYXcmY3R5cGU9dGV4dC9gO1xuXHRcdGZvciAoY29uc3QgdXNlRmlsZSBvZiBVUkxfVVNFLnNwbGl0KCd8JykpIHtcblx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IHVzZUZpbGUudG9TdHJpbmcoKS50cmltKCk7XG5cdFx0XHRjb25zdCB3aGF0OiBzdHJpbmdbXSA9IFJFR0VYX0ZJTEUuZXhlYyhuYW1lKSA/PyBbJycsICcnXTtcblx0XHRcdHN3aXRjaCAod2hhdFsxXSkge1xuXHRcdFx0XHRjYXNlICdqcyc6XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUzYxMzNcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0XHRcdFx0dm9pZCBtdy5sb2FkZXIudXNpbmcoJycpLnRoZW4oKHJlcXVpcmUpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdG13LmxvYWRlci5sb2FkKGAke3BhdGh9amF2YXNjcmlwdCZ0aXRsZT0ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnY3NzJzpcblx0XHRcdFx0XHRtdy5sb2FkZXIubG9hZChgJHtwYXRofWNzcyZ0aXRsZT0ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRpZiAoUkVHRVhfRVhULnRlc3QobmFtZSkpIHtcblx0XHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFM2MTMzXG5cdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0XHRcdFx0XHR2b2lkIG13LmxvYWRlci51c2luZyhuYW1lKS50aGVuKChyZXF1aXJlKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdG13LmxvYWRlci5sb2FkKG5hbWUpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuY29uc3Qgbm9QZXJtV2FybmluZyA9ICgpOiB2b2lkID0+IHtcblx0LyoqXG5cdCAqIExvYWQgd2FybmluZyhzKSB3aGVuIHVzZXIgaGFzIG5vIGFjY2VzcyB0byBwYWdlXG5cdCAqL1xuXHRjb25zdCBVUkxfTk9fUEVSTTogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnbm9wZXJtJyk7XG5cdGlmICghVVJMX05PX1BFUk0pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzd2l0Y2ggKFVSTF9OT19QRVJNKSB7XG5cdFx0Y2FzZSAnMCc6XG5cdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCflm6DmioDmnK/ljp/lm6DvvIzmgqjmsqHmnInmnYPpmZDorr/pl67nm7jlhbPpobXpnaLjgILoi6XmnInnlpHpl67vvIzor7fkuI7msYLpl7vnmb7np5Hov5DokKXogIXogZTns7vjgIInLFxuXHRcdFx0XHRcdCflm6DmioDooZPljp/lm6DvvIzmgqjmspLmnInmrIrpmZDoqKrllY/nm7jpl5zpoIHpnaLjgILoi6XmnInnlpHllY/vvIzoq4voiIfmsYLogZ7nmb7np5HpgYvnh5/ogIXoga/ns7vjgIInXG5cdFx0XHRcdCksXG5cdFx0XHRcdHt0YWc6ICdub1Blcm0nLCB0eXBlOiAnZXJyb3InfVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJzEnOlxuXHRcdFx0dm9pZCBtdy5ub3RpZnkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oKo5rKh5pyJ5p2D6ZmQ6K6/6Zeu55u45YWz6aG16Z2i44CC6Iul5oKo5piv6LWE5rex57yW6ICF77yM6K+35LiO5rGC6Ze755m+56eR5oqA5pyv5Zui6Zif6IGU57O777yM5Lul6I635Y+W5p2D6ZmQ44CCJyxcblx0XHRcdFx0XHQn5oKo5rKS5pyJ5qyK6ZmQ6Kiq5ZWP55u46Zec6aCB6Z2i44CC6Iul5oKo5piv6LOH5rex57eo6ICF77yM6KuL6IiH5rGC6IGe55m+56eR5oqA6KGT5ZyY6ZqK6IGv57O777yM5Lul542y5Y+W5qyK6ZmQ44CCJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHR7dGFnOiAnbm9QZXJtJywgdHlwZTogJ2Vycm9yJ31cblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICcyJzpcblx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aCqOeahOe9kee7nOeOr+Wig+WtmOWcqOmjjumZqe+8jOivt+eZu+W9leWQjue7p+e7reS9v+eUqOOAguiLpeaCqOayoeacieaxgumXu+eZvuenkei0puWPt++8jOivt+azqOWGjOWQjueZu+W9leOAgicsXG5cdFx0XHRcdFx0J+aCqOeahOe2sui3r+eSsOWig+WtmOWcqOmiqOmaqu+8jOiri+eZu+WFpeW+jOe5vOe6jOS9v+eUqOOAguiLpeaCqOaykuacieaxguiBnueZvuenkeizrOiZn++8jOiri+azqOWGiuW+jOeZu+mMhOOAgidcblx0XHRcdFx0KSxcblx0XHRcdFx0e3RhZzogJ25vUGVybScsIHR5cGU6ICd3YXJuJ31cblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICczJzpcblx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+ebuOWFs+WKn+iDveS7heWQkeazqOWGjOeUqOaIt+W8gOaUvu+8jOivt+eZu+W9leWQjue7p+e7reS9v+eUqOOAguiLpeaCqOayoeacieaxgumXu+eZvuenkei0puWPt++8jOivt+azqOWGjOWQjueZu+W9leOAgicsXG5cdFx0XHRcdFx0J+ebuOmXnOWKn+iDveWDheWQkeazqOWGiueUqOaItumWi+aUvu+8jOiri+eZu+WFpeW+jOe5vOe6jOS9v+eUqOOAguiLpeaCqOaykuacieaxguiBnueZvuenkeizrOiZn++8jOiri+azqOWGiuW+jOeZu+mMhOOAgidcblx0XHRcdFx0KSxcblx0XHRcdFx0e3RhZzogJ25vUGVybScsIHR5cGU6ICd3YXJuJ31cblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dm9pZCBtdy5ub3RpZnkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oKo5rKh5pyJ5p2D6ZmQ6K6/6Zeu55u45YWz6aG16Z2i44CC6Iul5pyJ55aR6Zeu77yM6K+35LiO5rGC6Ze755m+56eR6L+Q6JCl6ICF6IGU57O744CCJyxcblx0XHRcdFx0XHQn5oKo5rKS5pyJ5qyK6ZmQ6Kiq5ZWP55u46Zec6aCB6Z2i44CC6Iul5pyJ55aR5ZWP77yM6KuL6IiH5rGC6IGe55m+56eR6YGL54ef6ICF6IGv57O744CCJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHR7dGFnOiAnbm9QZXJtJywgdHlwZTogJ2Vycm9yJ31cblx0XHRcdCk7XG5cdH1cblxuXHRjb25zdCBuZXdVcmw6IHN0cmluZyA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvWz8mXW5vcGVybT1bMC05XSsvLCAnJyk7XG5cdGhpc3RvcnkucHVzaFN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgbmV3VXJsKTtcbn07XG5cbmNvbnN0IGhpZ2hMaWdodFJldiA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0LyoqXG5cdCAqIEFkZCBoaWdobGlnaHQgdG8gcmV2aXNpb25zIHdoZW4gdXNpbmcgYCZoaWxpZ2h0PXJldmlkYCBvciBgJmhpZ2hsaWdodD1yZXZpZGBcblx0ICovXG5cdGNvbnN0IFVSTF9ISUdITElHSFQ6IHN0cmluZyB8IG51bGwgPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2hpZ2hsaWdodCcpO1xuXHRjb25zdCBVUkxfSElMSUdIVDogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnaGlsaWdodCcpO1xuXHRjb25zdCBoaWdobGlnaHQ6IHN0cmluZyB8IG51bGwgPSBVUkxfSElHSExJR0hUID8/IFVSTF9ISUxJR0hUO1xuXG5cdGlmICghaGlnaGxpZ2h0IHx8IHdnQWN0aW9uICE9PSAnaGlzdG9yeScpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRmb3IgKGNvbnN0IHZlcnNpb24gb2YgaGlnaGxpZ2h0LnNwbGl0KCcsJykpIHtcblx0XHQkYm9keS5maW5kKGBpbnB1dFtuYW1lPW9sZGlkXVt2YWx1ZT0ke3ZlcnNpb259XWApLnBhcmVudCgpLmFkZENsYXNzKCdub3QtcGF0cm9sbGVkJyk7XG5cdH1cbn07XG5cbmNvbnN0IGFkZFRhcmdldEJsYW5rID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHQvKipcblx0ICogQWRkIHRhcmdldD1cImJsYW5rXCIgdG8gZXh0ZXJuYWwgbGlua3Ncblx0ICovXG5cdCRib2R5LmZpbmQ8SFRNTEFuY2hvckVsZW1lbnQ+KCdhLmV4dGVybmFsLCBhW3JlbD1cIm13OkV4dExpbmtcIl0nKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCk6IGJvb2xlYW4gPT4ge1xuXHRcdGNvbnN0IGxpbmtIcmVmOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAkKGVsZW1lbnQpLmF0dHIoJ2hyZWYnKTtcblx0XHRpZiAobGlua0hyZWYpIHtcblx0XHRcdGNvbnN0IGhyZWZTcGxpdDogc3RyaW5nW10gPSBsaW5rSHJlZi5zcGxpdCgnLycpO1xuXHRcdFx0aWYgKGhyZWZTcGxpdC5sZW5ndGggPCAzIHx8IGhyZWZTcGxpdFsyXSA9PT0gbG9jYXRpb24uaG9zdCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGVsZW1lbnQuaHJlZi5pbmNsdWRlcyhgJHtsb2NhdGlvbi5wcm90b2NvbH0vLyR7bG9jYXRpb24uaG9zdG5hbWV9YCkpIHtcblx0XHRcdGVsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG5cdFx0XHRpZiAoIWVsZW1lbnQucmVsLmluY2x1ZGVzKCdub29wZW5lcicpKSB7XG5cdFx0XHRcdGVsZW1lbnQucmVsICs9ICcgbm9vcGVuZXInO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFlbGVtZW50LnJlbC5pbmNsdWRlcygnbm9yZWZlcnJlcicpKSB7XG5cdFx0XHRcdGVsZW1lbnQucmVsICs9ICcgbm9yZWZlcnJlcic7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0pO1xufTtcblxuY29uc3QgcmVtb3ZlVGl0bGVGcm9tUGVybWFsaW5rID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHQvKipcblx0ICogUmVtb3ZlIHRpdGxlPSogZnJvbSBwZXJtYWxpbmtcblx0ICovXG5cdGNvbnN0ICRwZXJtYUxpbms6IEpRdWVyeSA9ICRib2R5LmZpbmQoJyN0LXBlcm1hbGluaycpO1xuXHRpZiAoISRwZXJtYUxpbmsubGVuZ3RoKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgJHBlcm1hTGlua0ZpcnN0Q2hpbGQ6IEpRdWVyeTxIVE1MQW5jaG9yRWxlbWVudD4gPSAkcGVybWFMaW5rLmZpbmQ8SFRNTEFuY2hvckVsZW1lbnQ+KCc6Zmlyc3QtY2hpbGQnKTtcblxuXHRjb25zdCBocmVmOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAkcGVybWFMaW5rRmlyc3RDaGlsZC5hdHRyKCdocmVmJyk/LnJlcGxhY2UoL3RpdGxlPVteJl0qJi8sICcnKTtcblx0aWYgKCFocmVmKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0JHBlcm1hTGlua0ZpcnN0Q2hpbGQuYXR0cignaHJlZicsIGhyZWYpO1xufTtcblxuY29uc3Qgb3BlblNlYXJjaEluTmV3VGFiID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHQvKipcblx0ICogT3BlbiBzZWFyY2ggcmVzdWx0cyBpbiBhIG5ldyB0YWIgb3Igd2luZG93XG5cdCAqIHdoZW4gaG9sZGluZyBkb3duIHRoZSBDdHJsIGtleSAoYnkgVGltZXNoaWZ0ZXIpXG5cdCAqL1xuXHQkYm9keVxuXHRcdC5maW5kKFsnI3NlYXJjaCcsICcjc2VhcmNoYm94JywgJyNzZWFyY2hmb3JtJywgJy5zZWFyY2gtdHlwZXMnLCAnI3NlYXJjaC10eXBlcyddLmpvaW4oJywnKSlcblx0XHQub24oJ2tleWRvd24ga2V5dXAgbW91c2Vkb3duJywgKGV2ZW50OiBKUXVlcnkuVHJpZ2dlcmVkRXZlbnQ8SFRNTEVsZW1lbnQ+KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCB7Y3RybEtleSwgbWV0YUtleSwgdGFyZ2V0fSA9IGV2ZW50O1xuXHRcdFx0JCh0YXJnZXQpLmF0dHIoJ3RhcmdldCcsIChjdHJsS2V5ID8/IG1ldGFLZXkpID8gJ19ibGFuaycgOiAnJyk7XG5cdFx0fSk7XG59O1xuXG5jb25zdCB0aXRsZUNsZWFuVXAgPSAoJGJvZHk6IEpRdWVyeTxIVE1MQm9keUVsZW1lbnQ+KTogdm9pZCA9PiB7XG5cdC8qKlxuXHQgKiBDbGVhbnVwIHRpdGxlIGZvciBhbGwgcGFnZXNcblx0ICovXG5cdGNvbnN0IFVSTF9ESUZGOiBzdHJpbmcgfCBudWxsID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdkaWZmJyk7XG5cdGlmIChVUkxfRElGRiB8fCB3Z0FjdGlvbiAhPT0gJ3ZpZXcnIHx8ICFbNiwgMTE4XS5pbmNsdWRlcyh3Z05hbWVzcGFjZU51bWJlcikpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBmdWxsUGFnZU5hbWU6IHN0cmluZyA9IG5ldyBtdy5UaXRsZSh3Z1BhZ2VOYW1lKS5nZXRQcmVmaXhlZFRleHQoKTtcblx0Y29uc3QgJGZpcnN0SGVhZGluZzogSlF1ZXJ5ID0gJGJvZHkuZmluZCgnLmZpcnN0SGVhZGluZycpO1xuXHRjb25zdCBkb2N1bWVudFRpdGxlOiBzdHJpbmcgPSBkb2N1bWVudC50aXRsZTtcblx0Y29uc3QgcGFnZVRpdGxlOiBzdHJpbmcgPSAkZmlyc3RIZWFkaW5nLnRleHQoKTtcblxuXHRjb25zdCByZXBsYWNlVGl0bGUgPSAodGl0bGU6IHN0cmluZyk6IHN0cmluZyA9PiB0aXRsZS5yZXBsYWNlKHBhZ2VUaXRsZSwgZnVsbFBhZ2VOYW1lKTtcblxuXHRkb2N1bWVudC50aXRsZSA9IHJlcGxhY2VUaXRsZShkb2N1bWVudFRpdGxlKTtcblx0JGZpcnN0SGVhZGluZy50ZXh0KHJlcGxhY2VUaXRsZShwYWdlVGl0bGUpKTtcbn07XG5cbmNvbnN0IHVuaWhhblBvcHVwID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHQvKipcblx0ICogRGlzcGxheSB0aXRsZT0oLiopIG9mIDxzcGFuIGNsYXNzPVwiaW5saW5lLXVuaWhhblwiPiBhZnRlciB0aGVtLlxuXHQgKiAoYmV0YSB0ZXN0KVxuXHQgKi9cblx0Ly8gRG8gbm90IGRpc3BsYXkgb24gU3BlY2lhbCBQYWdlc1xuXHRpZiAod2dOYW1lc3BhY2VOdW1iZXIgPCAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Zm9yIChjb25zdCBlbGVtZW50IG9mICRib2R5LmZpbmQoJ2F0dHIsIC5pbmxpbmUtdW5paGFuJykpIHtcblx0XHRjb25zdCAkZWxlbWVudDogSlF1ZXJ5ID0gJChlbGVtZW50KTtcblxuXHRcdGNvbnN0IHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAkZWxlbWVudC5hdHRyKCd0aXRsZScpO1xuXHRcdGlmICghdGl0bGUpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZvaWQgbXcubG9hZGVyLnVzaW5nKCdvb2pzLXVpLWNvcmUnKS50aGVuKCgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IHBvcHVwOiBPTy51aS5Qb3B1cFdpZGdldCA9IG5ldyBPTy51aS5Qb3B1cFdpZGdldCh7XG5cdFx0XHRcdCRjb250ZW50OiAkKDxwPnt0aXRsZX08L3A+KSBhcyBKUXVlcnksXG5cdFx0XHRcdGxhYmVsOiBnZXRNZXNzYWdlKCdOb3RlJyksXG5cdFx0XHRcdGFuY2hvcjogdHJ1ZSxcblx0XHRcdFx0aGVhZDogdHJ1ZSxcblx0XHRcdFx0cGFkZGVkOiB0cnVlLFxuXHRcdFx0fSk7XG5cdFx0XHQkZWxlbWVudC5hcHBlbmQocG9wdXAuJGVsZW1lbnQpLm9uKCdjbGljaycsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0cG9wdXAudG9nZ2xlKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufTtcblxuY29uc3QgZml4TG9jYXRpb25IYXNoID0gKCk6IHZvaWQgPT4ge1xuXHQvKiDkv67mraPmipjlj6DlkI7lrprkvY3lj5jljJYgKi9cblx0aWYgKGxvY2F0aW9uLmhhc2gpIHtcblx0XHRsb2NhdGlvbi5ocmVmID0gbG9jYXRpb24uaGFzaDtcblx0fVxufTtcblxuY29uc3QgaGlkZU5ld1VzZXJzTG9nID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHQvKiDkuLTml7bvvJrnpoHmraLnlKjmiLfmn6XnnIvnlKjmiLfliJvlu7rml6Xlv5cgKi9cblx0aWYgKHdnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lICE9PSAnTG9nJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0ICRuZXdVc2Vyc0xvZzogSlF1ZXJ5ID0gJGJvZHkuZmluZCgnaW5wdXRbbmFtZT1cIndwZmlsdGVyc1tdXCJdW3ZhbHVlPW5ld3VzZXJzXScpO1xuXHQkbmV3VXNlcnNMb2cucHJvcCh7XG5cdFx0Y2hlY2tlZDogZmFsc2UsXG5cdFx0ZGlzYWJsZWQ6IHRydWUsXG5cdH0pO1xufTtcblxuY29uc3QgdG9nZ2xlTGluayA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0Lyog6LCD5pW05oqY5Y+g5oyJ6ZKu55qE6aKc6ImyICovXG5cdGNvbnN0ICR0b2dnbGVyOiBKUXVlcnkgPSAkYm9keS5maW5kKCcubXctY29sbGFwc2libGUtdG9nZ2xlLCAuZ2FkZ2V0LWNvbGxhcHNpYmxlLXRvZ2dsZXInKTtcblx0aWYgKCEkdG9nZ2xlci5sZW5ndGgpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoJHRvZ2dsZXIucGFyZW50KClbMF0/LnN0eWxlLmNvbG9yKSB7XG5cdFx0JHRvZ2dsZXIuZmluZCgnYScpLmNzcygnY29sb3InLCAnaW5oZXJpdCcpO1xuXHR9XG59O1xuXG5leHBvcnQge1xuXHRsb2FkV2l0aFVSTCxcblx0bm9QZXJtV2FybmluZyxcblx0aGlnaExpZ2h0UmV2LFxuXHRhZGRUYXJnZXRCbGFuayxcblx0cmVtb3ZlVGl0bGVGcm9tUGVybWFsaW5rLFxuXHRvcGVuU2VhcmNoSW5OZXdUYWIsXG5cdHRpdGxlQ2xlYW5VcCxcblx0dW5paGFuUG9wdXAsXG5cdGZpeExvY2F0aW9uSGFzaCxcblx0aGlkZU5ld1VzZXJzTG9nLFxuXHR0b2dnbGVMaW5rLFxufTtcbiIsICJpbXBvcnQge2xvY2FsaXplfSBmcm9tICdleHQuZ2FkZ2V0LmkxOG4nO1xuXG5jb25zdCBnZXRJMThuTWVzc2FnZXMgPSAoKSA9PiB7XG5cdGNvbnN0IHt3Z1VMU30gPSB3aW5kb3c7XG5cdHJldHVybiB7XG5cdFx0Tm90ZTogbG9jYWxpemUoe1xuXHRcdFx0ZW46ICdOb3RlOiAnLFxuXHRcdFx0J3poLWhhbnMnOiAn5rOo6YeK77yaJyxcblx0XHRcdCd6aC1oYW50JzogJ+azqOmHi++8micsXG5cdFx0fSksXG5cdFx0Tm9QZXJtRXJyb3IwOiB3Z1VMUyhcblx0XHRcdCflm6DmioDmnK/ljp/lm6DvvIzmgqjmsqHmnInmnYPpmZDorr/pl67nm7jlhbPpobXpnaLjgILoi6XmnInnlpHpl67vvIzor7fkuI7msYLpl7vnmb7np5Hov5DokKXogIXogZTns7vjgIInLFxuXHRcdFx0J+WboOaKgOihk+WOn+WboO+8jOaCqOaykuacieasiumZkOioquWVj+ebuOmXnOmggemdouOAguiLpeacieeWkeWVj++8jOiri+iIh+axguiBnueZvuenkemBi+eHn+iAheiBr+ezu+OAgidcblx0XHQpLFxuXHRcdE5vUGVybUVycm9yMTogd2dVTFMoXG5cdFx0XHQn5oKo5rKh5pyJ5p2D6ZmQ6K6/6Zeu55u45YWz6aG16Z2i44CC6Iul5oKo5piv6LWE5rex57yW6ICF77yM6K+35LiO5rGC6Ze755m+56eR5oqA5pyv5Zui6Zif6IGU57O777yM5Lul6I635Y+W5p2D6ZmQ44CCJyxcblx0XHRcdCfmgqjmspLmnInmrIrpmZDoqKrllY/nm7jpl5zpoIHpnaLjgILoi6XmgqjmmK/os4fmt7Hnt6jogIXvvIzoq4voiIfmsYLogZ7nmb7np5HmioDooZPlnJjpmoroga/ns7vvvIzku6XnjbLlj5bmrIrpmZDjgIInXG5cdFx0KSxcblx0XHROb1Blcm1FcnJvcjI6IHdnVUxTKFxuXHRcdFx0J+aCqOeahOe9kee7nOeOr+Wig+WtmOWcqOmjjumZqe+8jOivt+eZu+W9leWQjue7p+e7reS9v+eUqOOAguiLpeaCqOayoeacieaxgumXu+eZvuenkei0puWPt++8jOivt+azqOWGjOWQjueZu+W9leOAgicsXG5cdFx0XHQn5oKo55qE57ay6Lev55Kw5aKD5a2Y5Zyo6aKo6Zqq77yM6KuL55m75YWl5b6M57m857qM5L2/55So44CC6Iul5oKo5rKS5pyJ5rGC6IGe55m+56eR6LOs6Jmf77yM6KuL5rOo5YaK5b6M55m76YyE44CCJ1xuXHRcdCksXG5cdFx0Tm9QZXJtRXJyb3IzOiB3Z1VMUyhcblx0XHRcdCfnm7jlhbPlip/og73ku4XlkJHms6jlhoznlKjmiLflvIDmlL7vvIzor7fnmbvlvZXlkI7nu6fnu63kvb/nlKjjgILoi6XmgqjmsqHmnInmsYLpl7vnmb7np5HotKblj7fvvIzor7fms6jlhozlkI7nmbvlvZXjgIInLFxuXHRcdFx0J+ebuOmXnOWKn+iDveWDheWQkeazqOWGiueUqOaItumWi+aUvu+8jOiri+eZu+WFpeW+jOe5vOe6jOS9v+eUqOOAguiLpeaCqOaykuacieaxguiBnueZvuenkeizrOiZn++8jOiri+azqOWGiuW+jOeZu+mMhOOAgidcblx0XHQpLFxuXHRcdE5vUGVybUVycm9yNDogd2dVTFMoXG5cdFx0XHQn5oKo5rKh5pyJ5p2D6ZmQ6K6/6Zeu55u45YWz6aG16Z2i44CC6Iul5pyJ55aR6Zeu77yM6K+35LiO5rGC6Ze755m+56eR6L+Q6JCl6ICF6IGU57O744CCJyxcblx0XHRcdCfmgqjmspLmnInmrIrpmZDoqKrllY/nm7jpl5zpoIHpnaLjgILoi6XmnInnlpHllY/vvIzoq4voiIfmsYLogZ7nmb7np5HpgYvnh5/ogIXoga/ns7vjgIInXG5cdFx0KSxcblx0fTtcbn07XG5cbmNvbnN0IGkxOG5NZXNzYWdlcyA9IGdldEkxOG5NZXNzYWdlcygpO1xuXG5jb25zdCBnZXRNZXNzYWdlOiBHZXRNZXNzYWdlczx0eXBlb2YgaTE4bk1lc3NhZ2VzPiA9IChrZXkpID0+IHtcblx0cmV0dXJuIGkxOG5NZXNzYWdlc1trZXldIHx8IGtleTtcbn07XG5cbmV4cG9ydCB7Z2V0TWVzc2FnZX07XG4iLCAiaW1wb3J0IHt0aXBweX0gZnJvbSAnZXh0LmdhZGdldC5UaXBweSc7XG5cbmNvbnN0IHtza2lufSA9IG13LmNvbmZpZy5nZXQoKTtcblxuY29uc3QgZ2V0Q29udGVudCA9IChyZWZlcmVuY2U6IEVsZW1lbnQpOiBzdHJpbmcgPT4ge1xuXHRjb25zdCBsYWJlbDogc3RyaW5nIHwgbnVsbCA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcblx0Y29uc3QgdGl0bGU6IHN0cmluZyB8IG51bGwgPSByZWZlcmVuY2UuZ2V0QXR0cmlidXRlKCdhbHQnKSA/PyByZWZlcmVuY2UuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuXG5cdHJldHVybiAobGFiZWwgPT09IHRpdGxlID8gbGFiZWwgOiB0aXRsZSB8fCBsYWJlbCkgfHwgKHJlZmVyZW5jZS50ZXh0Q29udGVudCBhcyBzdHJpbmcpO1xufTtcblxuY29uc3Qgb25DcmVhdGVDYWxsYmFjayA9IChpbnN0YW5jZTogUmV0dXJuVHlwZTx0eXBlb2YgdGlwcHk+WzBdKTogdm9pZCA9PiB7XG5cdGNvbnN0IHtyZWZlcmVuY2V9ID0gaW5zdGFuY2U7XG5cdHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBnZXRDb250ZW50KHJlZmVyZW5jZSkpO1xuXHRyZWZlcmVuY2UucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xufTtcblxuY29uc3Qgb25TaG93Q2FsbGJhY2sgPSAoaW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIHRpcHB5PlswXSk6IHZvaWQgPT4ge1xuXHRvbkNyZWF0ZUNhbGxiYWNrKGluc3RhbmNlKTtcblx0aW5zdGFuY2Uuc2V0Q29udGVudChnZXRDb250ZW50KGluc3RhbmNlLnJlZmVyZW5jZSkpO1xufTtcblxuY29uc3QgdGlwcHlGb3JDaXRpemVuSGVhZGVyID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHRpZiAoc2tpbiAhPT0gJ2NpdGl6ZW4nKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Zm9yIChjb25zdCBlbGVtZW50IG9mICRib2R5LmZpbmQoXG5cdFx0W1xuXHRcdFx0Jy5jaXRpemVuLWhlYWRlciBsYWJlbFt0aXRsZV0nLFxuXHRcdFx0Jy5jaXRpemVuLWhlYWRlciAubXctZWNoby1ub3RpZmljYXRpb25zLWJhZGdlJyxcblx0XHRcdCcuY2l0aXplbi1oZWFkZXJfX2xvZ28gYScsXG5cdFx0XHQnLnBhZ2UtYWN0aW9ucz5uYXY+dWw+bGkgYScsXG5cdFx0XHQnLnBhZ2UtYWN0aW9uc19fYnV0dG9uJyxcblx0XHRdLmpvaW4oJywnKVxuXHQpKSB7XG5cdFx0Y29uc3QgJGVsZW1lbnQ6IEpRdWVyeSA9ICQoZWxlbWVudCk7XG5cdFx0bGV0IHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAkZWxlbWVudC5hdHRyKCd0aXRsZScpO1xuXHRcdGlmICghdGl0bGUpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXFxzKj9cXFsuKz9dJC8sICcnKTtcblxuXHRcdCRlbGVtZW50LmF0dHIoe1xuXHRcdFx0J2FyaWEtbGFiZWwnOiB0aXRsZSxcblx0XHRcdHRpdGxlOiAnJyxcblx0XHR9KTtcblx0XHR0aXBweSgkZWxlbWVudC5nZXQoMCkgYXMgSFRNTEVsZW1lbnQsIHtcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0Y29udGVudDogdGl0bGUsXG5cdFx0XHRwbGFjZW1lbnQ6ICdib3R0b20nLFxuXHRcdFx0b25DcmVhdGU6IG9uQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRvbkhpZGRlbjogb25DcmVhdGVDYWxsYmFjayxcblx0XHRcdG9uU2hvdzogb25TaG93Q2FsbGJhY2ssXG5cdFx0fSk7XG5cdH1cbn07XG5cbmNvbnN0IHRpcHB5Rm9yRXh0ZW5zaW9uID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ2V4dC5Db2xsYXBzaWJsZVNpZGViYXIuanMnKTtcblx0dGlwcHkoJyNzaWRlYmFyQnV0dG9uJywge1xuXHRcdGFycm93OiB0cnVlLFxuXHRcdGNvbnRlbnQ6IGdldENvbnRlbnQsXG5cdFx0cGxhY2VtZW50OiAnbGVmdCcsXG5cdFx0b25DcmVhdGU6IG9uQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0b25IaWRkZW46IG9uQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0b25TaG93OiBvblNob3dDYWxsYmFjayxcblx0fSk7XG5cblx0aWYgKHNraW4gPT09ICd2ZWN0b3InKSB7XG5cdFx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQuQ29sbGFwc2libGVTaWRlYmFyLnZlY3RvcicpO1xuXHRcdHRpcHB5KCcjc2lkZWJhckNvbGxhcHNlJywge1xuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRjb250ZW50OiBnZXRDb250ZW50LFxuXHRcdFx0cGxhY2VtZW50OiAncmlnaHQnLFxuXHRcdFx0b25DcmVhdGU6IG9uQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRvbkhpZGRlbjogb25DcmVhdGVDYWxsYmFjayxcblx0XHRcdG9uU2hvdzogb25TaG93Q2FsbGJhY2ssXG5cdFx0fSk7XG5cdH1cblxuXHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ2V4dC5EYXJrTW9kZScpO1xuXHR0aXBweSgnI2Rhcmttb2RlLWJ1dHRvbicsIHtcblx0XHRhcnJvdzogdHJ1ZSxcblx0XHRjb250ZW50OiBnZXRDb250ZW50LFxuXHRcdHBsYWNlbWVudDogJ2xlZnQnLFxuXHRcdG9uQ3JlYXRlOiBvbkNyZWF0ZUNhbGxiYWNrLFxuXHRcdG9uSGlkZGVuOiBvbkNyZWF0ZUNhbGxiYWNrLFxuXHRcdG9uU2hvdzogb25TaG93Q2FsbGJhY2ssXG5cdH0pO1xufTtcblxuZXhwb3J0IHt0aXBweUZvckNpdGl6ZW5IZWFkZXIsIHRpcHB5Rm9yRXh0ZW5zaW9ufTtcbiIsICJjb25zdCBkZXByZWNhdGVkRnVuY3Rpb25zID0gKCk6IHZvaWQgPT4ge1xuXHQvKiFcblx0ICogbWFpbnRlbmFuY2U6IFNvbWUgdXNlciBzY3JpcHRzIG1heSBiZSB1c2luZyB0aGUgZm9sbG93aW5nIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLlxuXHQgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSB1cGRhdGVkLlxuXHQgKi9cblx0bXcubG9nLmRlcHJlY2F0ZShcblx0XHR3aW5kb3csXG5cdFx0J2ltcG9ydFNjcmlwdCcsXG5cdFx0KHRpdGxlOiBzdHJpbmcpOiBIVE1MU2NyaXB0RWxlbWVudCA9PiB7XG5cdFx0XHRyZXR1cm4gbXcubG9hZGVyLmFkZFNjcmlwdFRhZyhcblx0XHRcdFx0bXcudXRpbC5nZXRVcmwodGl0bGUsIHtcblx0XHRcdFx0XHRhY3Rpb246ICdyYXcnLFxuXHRcdFx0XHRcdGN0eXBlOiAndGV4dC9qYXZhc2NyaXB0Jyxcblx0XHRcdFx0XHRtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0XHRzbWF4YWdlOiAnMzYwMCcsXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH0sXG5cdFx0J1VzZSBtdy5sb2FkZXIuYWRkU2NyaXB0VGFnKCkgaW5zdGVhZCdcblx0KTtcblxuXHRtdy5sb2cuZGVwcmVjYXRlKFxuXHRcdHdpbmRvdyxcblx0XHQnaW1wb3J0U3R5bGVzaGVldCcsXG5cdFx0KHRpdGxlOiBzdHJpbmcpOiBIVE1MTGlua0VsZW1lbnQgPT4ge1xuXHRcdFx0cmV0dXJuIG13LmxvYWRlci5hZGRMaW5rVGFnKFxuXHRcdFx0XHRtdy51dGlsLmdldFVybCh0aXRsZSwge1xuXHRcdFx0XHRcdGFjdGlvbjogJ3JhdycsXG5cdFx0XHRcdFx0Y3R5cGU6ICd0ZXh0L2NzcycsXG5cdFx0XHRcdFx0bWF4YWdlOiAnMzYwMCcsXG5cdFx0XHRcdFx0c21heGFnZTogJzM2MDAnLFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0J3RleHQvY3NzJ1xuXHRcdFx0KTtcblx0XHR9LFxuXHRcdCdVc2UgbXcubG9hZGVyLmFkZExpbmtUYWcoKSBpbnN0ZWFkJ1xuXHQpO1xuXG5cdG13LmxvZy5kZXByZWNhdGUoXG5cdFx0d2luZG93LFxuXHRcdCdpbXBvcnRTY3JpcHRVUkknLFxuXHRcdChtb2R1bGVzOiBzdHJpbmcpOiBIVE1MU2NyaXB0RWxlbWVudCA9PiB7XG5cdFx0XHRyZXR1cm4gbXcubG9hZGVyLmFkZFNjcmlwdFRhZyhtdy51dGlsLndpa2lVcmxlbmNvZGUobW9kdWxlcykpO1xuXHRcdH0sXG5cdFx0J1VzZSBtdy5sb2FkZXIuYWRkU2NyaXB0VGFnKCkgb3IgbXcubG9hZGVyLmdldFNjcmlwdCgpIGluc3RlYWQnXG5cdCk7XG5cblx0bXcubG9nLmRlcHJlY2F0ZShcblx0XHR3aW5kb3csXG5cdFx0J2ltcG9ydFN0eWxlc2hlZXRVUkknLFxuXHRcdChtb2R1bGVzOiBzdHJpbmcpOiBIVE1MTGlua0VsZW1lbnQgPT4ge1xuXHRcdFx0cmV0dXJuIG13LmxvYWRlci5hZGRMaW5rVGFnKG13LnV0aWwud2lraVVybGVuY29kZShtb2R1bGVzKSwgJ3RleHQvY3NzJyk7XG5cdFx0fSxcblx0XHQnVXNlIG13LmxvYWRlci5hZGRMaW5rVGFnKCkgaW5zdGVhZCdcblx0KTtcblxuXHRtdy5sb2cuZGVwcmVjYXRlKFxuXHRcdHdpbmRvdyxcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTMjM0NVxuXHRcdCdpbXBvcnRTY3JpcHRDYWxsYmFjaycsXG5cdFx0KHRpdGxlOiBzdHJpbmcsIHJlYWR5OiBuZXZlcik6IHZvaWQgPT4ge1xuXHRcdFx0dm9pZCBtdy5sb2FkZXJcblx0XHRcdFx0LmdldFNjcmlwdChcblx0XHRcdFx0XHRtdy51dGlsLmdldFVybCh0aXRsZSwge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiAncmF3Jyxcblx0XHRcdFx0XHRcdGN0eXBlOiAndGV4dC9qYXZhc2NyaXB0Jyxcblx0XHRcdFx0XHRcdG1heGFnZTogJzM2MDAnLFxuXHRcdFx0XHRcdFx0c21heGFnZTogJzM2MDAnLFxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4ocmVhZHkpO1xuXHRcdH0sXG5cdFx0J1VzZSBtdy5sb2FkZXIuZ2V0U2NyaXB0KCkgaW5zdGVhZCdcblx0KTtcblxuXHRtdy5sb2cuZGVwcmVjYXRlKFxuXHRcdHdpbmRvdyxcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTMjM0NVxuXHRcdCdpbXBvcnRTY3JpcHRVUklDYWxsYmFjaycsXG5cdFx0KHVybDogc3RyaW5nLCByZWFkeTogbmV2ZXIpOiB2b2lkID0+IHtcblx0XHRcdHZvaWQgbXcubG9hZGVyLmdldFNjcmlwdCh1cmwpLnRoZW4ocmVhZHkpO1xuXHRcdH0sXG5cdFx0J1VzZSBtdy5sb2FkZXIuZ2V0U2NyaXB0KCkgaW5zdGVhZCdcblx0KTtcblx0LyoqXG5cdCAqIG1haW50ZW5hbmNlOiBTb21lIHVzZXIgc2NyaXB0cyBtYXkgYmUgdXNpbmcgdGhlIGZvbGxvd2luZyBkZXByZWNhdGVkIGZ1bmN0aW9ucy5cblx0ICogVGhlc2UgZnVuY3Rpb25zIGFyZSBrZXB0IGZvciBjb21wYWJpbGl0eS5cblx0ICovXG5cdC8vIG13LmxvZy5kZXByZWNhdGUod2luZG93LCAnSlNDb25maWcnLCB7fSwgJ1VzZSB7fSBpbnN0ZWFkJyk7XG5cdC8qKlxuXHQgKiB3Z1UqUyBmdW5jdGlvbnMgaGF2ZSBiZWVuIHNwbGl0IHRvIGEgc2VwZXJhdGUgZ2FkZ2V0IChleHQuZ2FkZ2V0LmkxOG4pLlxuXHQgKi9cbn07XG5cbmV4cG9ydCB7ZGVwcmVjYXRlZEZ1bmN0aW9uc307XG4iLCAiaW1wb3J0IHtcblx0YWRkVGFyZ2V0QmxhbmssXG5cdGZpeExvY2F0aW9uSGFzaCxcblx0aGlkZU5ld1VzZXJzTG9nLFxuXHRoaWdoTGlnaHRSZXYsXG5cdGxvYWRXaXRoVVJMLFxuXHRub1Blcm1XYXJuaW5nLFxuXHRvcGVuU2VhcmNoSW5OZXdUYWIsXG5cdHJlbW92ZVRpdGxlRnJvbVBlcm1hbGluayxcblx0dGl0bGVDbGVhblVwLFxuXHR0b2dnbGVMaW5rLFxuXHR1bmloYW5Qb3B1cCxcbn0gZnJvbSAnLi9tb2R1bGVzL2NvcmUnO1xuaW1wb3J0IHt0aXBweUZvckNpdGl6ZW5IZWFkZXIsIHRpcHB5Rm9yRXh0ZW5zaW9ufSBmcm9tICcuL21vZHVsZXMvdGlwcHknO1xuaW1wb3J0IHtkZXByZWNhdGVkRnVuY3Rpb25zfSBmcm9tICcuL21vZHVsZXMvZGVwcmVjYXRlZEZ1bmN0aW9ucyc7XG5pbXBvcnQge2dldEJvZHl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbihmdW5jdGlvbiBzaXRlQ29tbW9uKCk6IHZvaWQge1xuXHRjb25zdCBjb25maWdLZXk6IHN0cmluZyA9ICdnYWRnZXQtU2l0ZUNvbW1vbl9KU19fSW5pdGlhbGl6ZWQnO1xuXG5cdC8vIEd1YXJkIGFnYWluc3QgZG91YmxlIGluY2x1c2lvbnNcblx0aWYgKG13LmNvbmZpZy5nZXQoY29uZmlnS2V5KSkge1xuXHRcdHJldHVybjtcblx0fVxuXHQvLyBTZXQgZ3VhcmRcblx0bXcuY29uZmlnLnNldChjb25maWdLZXksIHRydWUpO1xuXG5cdC8vIENvcmUgbW9kdWxlc1xuXHRsb2FkV2l0aFVSTCgpO1xuXHRub1Blcm1XYXJuaW5nKCk7XG5cdGZpeExvY2F0aW9uSGFzaCgpO1xuXG5cdHZvaWQgZ2V0Qm9keSgpLnRoZW4oKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHRcdC8vIENvcmUgbW9kdWxlcyAobmVlZCAkLnJlYWR5KVxuXHRcdGhpZ2hMaWdodFJldigkYm9keSk7XG5cdFx0YWRkVGFyZ2V0QmxhbmsoJGJvZHkpO1xuXHRcdHJlbW92ZVRpdGxlRnJvbVBlcm1hbGluaygkYm9keSk7XG5cdFx0b3BlblNlYXJjaEluTmV3VGFiKCRib2R5KTtcblx0XHR0aXRsZUNsZWFuVXAoJGJvZHkpO1xuXHRcdHVuaWhhblBvcHVwKCRib2R5KTtcblx0XHRoaWRlTmV3VXNlcnNMb2coJGJvZHkpO1xuXHRcdHRvZ2dsZUxpbmsoJGJvZHkpO1xuXG5cdFx0Ly8gVGlwcHktcmVsYXRlZCBjb2RlcyAobmVlZCAkLnJlYWR5KVxuXHRcdHRpcHB5Rm9yQ2l0aXplbkhlYWRlcigkYm9keSk7XG5cdH0pO1xuXG5cdC8vIERlcHJlY2F0ZWQgZnVuY3Rpb25zXG5cdGRlcHJlY2F0ZWRGdW5jdGlvbnMoKTtcblxuXHQvLyBUaXBweS1yZWxhdGVkIGNvZGVzXG5cdHZvaWQgdGlwcHlGb3JFeHRlbnNpb24oKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLHFCQUFrQkMsUUFBQUMsUUFBQSxrQkFBQSxHQUFBLENBQUE7O0FDQWxCLElBQUFDLG9CQUF1QkQsUUFBQSxpQkFBQTtBQUV2QixJQUFNRSxrQkFBa0JBLE1BQU07QUFDN0IsUUFBTTtJQUFDQztFQUFLLElBQUlDO0FBQ2hCLFNBQU87SUFDTkMsT0FBQSxHQUFNSixrQkFBQUssVUFBUztNQUNkQyxJQUFJO01BQ0osV0FBVztNQUNYLFdBQVc7SUFDWixDQUFDO0lBQ0RDLGNBQWNMLE1BQ2IsdUNBQ0EscUNBQ0Q7SUFDQU0sY0FBY04sTUFDYiwyQ0FDQSx5Q0FDRDtJQUNBTyxjQUFjUCxNQUNiLDBDQUNBLHdDQUNEO0lBQ0FRLGNBQWNSLE1BQ2IsNENBQ0EsMENBQ0Q7SUFDQVMsY0FBY1QsTUFDYixpQ0FDQSwrQkFDRDtFQUNEO0FBQ0Q7QUFFQSxJQUFNVSxlQUFlWCxnQkFBZ0I7QUFFckMsSUFBTVksYUFBZ0RDLFNBQVE7QUFDN0QsU0FBT0YsYUFBYUUsR0FBRyxLQUFLQTtBQUM3Qjs7QURsQ0EsSUFBTTtFQUFDQztFQUFVQztFQUE0QkM7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LG1CQUFlVixLQUFLO0FBQ3BCeUIsNkJBQXlCekIsS0FBSztBQUM5QjZCLHVCQUFtQjdCLEtBQUs7QUFDeEJtQyxpQkFBYW5DLEtBQUs7QUFDbEI2QyxnQkFBWTdDLEtBQUs7QUFDakJnRSxvQkFBZ0JoRSxLQUFLO0FBQ3JCcUUsZUFBV3JFLEtBQUs7QUFHaEJ3RiwwQkFBc0J4RixLQUFLO0VBQzVCLENBQUM7QUFHRHVHLHNCQUFvQjtBQUdwQixPQUFLTCxrQkFBa0I7QUFDeEIsR0FBRzsiLAogICJuYW1lcyI6IFsiaW1wb3J0X2V4dF9nYWRnZXQyIiwgIl9fdG9FU00iLCAicmVxdWlyZSIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJnZXRJMThuTWVzc2FnZXMiLCAid2dVTFMiLCAid2luZG93IiwgIk5vdGUiLCAibG9jYWxpemUiLCAiZW4iLCAiTm9QZXJtRXJyb3IwIiwgIk5vUGVybUVycm9yMSIsICJOb1Blcm1FcnJvcjIiLCAiTm9QZXJtRXJyb3IzIiwgIk5vUGVybUVycm9yNCIsICJpMThuTWVzc2FnZXMiLCAiZ2V0TWVzc2FnZSIsICJrZXkiLCAid2dBY3Rpb24iLCAid2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUiLCAid2dOYW1lc3BhY2VOdW1iZXIiLCAid2dQYWdlTmFtZSIsICJ3Z1NjcmlwdCIsICJ3Z1VzZXJOYW1lIiwgIm13IiwgImNvbmZpZyIsICJnZXQiLCAibG9hZFdpdGhVUkwiLCAiVVJMX1dJVEhfQ1NTIiwgInV0aWwiLCAiZ2V0UGFyYW1WYWx1ZSIsICJVUkxfV0lUSF9KUyIsICJVUkxfV0lUSF9NT0RVTEUiLCAidGVzdCIsICJsb2FkZXIiLCAibG9hZCIsICJnZXRVcmwiLCAiYWN0aW9uIiwgImN0eXBlIiwgIm1heGFnZSIsICJzbWF4YWdlIiwgInVzaW5nIiwgInRoZW4iLCAicmVxdWlyZTIiLCAiVVJMX1VTRSIsICJ3Z1VzZXJOYW1lRXhjYXBlZCIsICJlc2NhcGVSZWdFeHAiLCAiUkVHRVhfRklMRSIsICJSZWdFeHAiLCAiY29uY2F0IiwgIlJFR0VYX0VYVCIsICJwYXRoIiwgIl9pdGVyYXRvcjIiLCAiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCAic3BsaXQiLCAiX3N0ZXAyIiwgInMiLCAibiIsICJkb25lIiwgIl9SRUdFWF9GSUxFJGV4ZWMiLCAidXNlRmlsZSIsICJ2YWx1ZSIsICJuYW1lIiwgInRvU3RyaW5nIiwgInRyaW0iLCAid2hhdCIsICJleGVjIiwgImVuY29kZVVSSUNvbXBvbmVudCIsICJlcnIiLCAiZSIsICJmIiwgIm5vUGVybVdhcm5pbmciLCAiVVJMX05PX1BFUk0iLCAibm90aWZ5IiwgInRhZyIsICJ0eXBlIiwgIm5ld1VybCIsICJsb2NhdGlvbiIsICJocmVmIiwgInJlcGxhY2UiLCAiaGlzdG9yeSIsICJwdXNoU3RhdGUiLCAiZG9jdW1lbnQiLCAidGl0bGUiLCAiaGlnaExpZ2h0UmV2IiwgIiRib2R5IiwgIlVSTF9ISUdITElHSFQiLCAiVVJMX0hJTElHSFQiLCAiaGlnaGxpZ2h0IiwgIl9pdGVyYXRvcjMiLCAiX3N0ZXAzIiwgInZlcnNpb24iLCAiZmluZCIsICJwYXJlbnQiLCAiYWRkQ2xhc3MiLCAiYWRkVGFyZ2V0QmxhbmsiLCAiZmlsdGVyIiwgIl9pbmRleCIsICJlbGVtZW50IiwgImxpbmtIcmVmIiwgIiQiLCAiYXR0ciIsICJocmVmU3BsaXQiLCAibGVuZ3RoIiwgImhvc3QiLCAiaW5jbHVkZXMiLCAicHJvdG9jb2wiLCAiaG9zdG5hbWUiLCAidGFyZ2V0IiwgInJlbCIsICJyZW1vdmVUaXRsZUZyb21QZXJtYWxpbmsiLCAiXyRwZXJtYUxpbmtGaXJzdENoaWxkIiwgIiRwZXJtYUxpbmsiLCAiJHBlcm1hTGlua0ZpcnN0Q2hpbGQiLCAib3BlblNlYXJjaEluTmV3VGFiIiwgImpvaW4iLCAib24iLCAiZXZlbnQiLCAiY3RybEtleSIsICJtZXRhS2V5IiwgInRpdGxlQ2xlYW5VcCIsICJVUkxfRElGRiIsICJmdWxsUGFnZU5hbWUiLCAiVGl0bGUiLCAiZ2V0UHJlZml4ZWRUZXh0IiwgIiRmaXJzdEhlYWRpbmciLCAiZG9jdW1lbnRUaXRsZSIsICJwYWdlVGl0bGUiLCAidGV4dCIsICJyZXBsYWNlVGl0bGUiLCAidW5paGFuUG9wdXAiLCAiX2l0ZXJhdG9yNCIsICJfc3RlcDQiLCAiJGVsZW1lbnQiLCAicG9wdXAiLCAiT08iLCAidWkiLCAiUG9wdXBXaWRnZXQiLCAiJGNvbnRlbnQiLCAiZGVmYXVsdCIsICJjcmVhdGVFbGVtZW50IiwgImxhYmVsIiwgImFuY2hvciIsICJoZWFkIiwgInBhZGRlZCIsICJhcHBlbmQiLCAidG9nZ2xlIiwgImZpeExvY2F0aW9uSGFzaCIsICJoYXNoIiwgImhpZGVOZXdVc2Vyc0xvZyIsICIkbmV3VXNlcnNMb2ciLCAicHJvcCIsICJjaGVja2VkIiwgImRpc2FibGVkIiwgInRvZ2dsZUxpbmsiLCAiXyR0b2dnbGVyJHBhcmVudCQiLCAiJHRvZ2dsZXIiLCAic3R5bGUiLCAiY29sb3IiLCAiY3NzIiwgImltcG9ydF9leHRfZ2FkZ2V0MyIsICJza2luIiwgImdldENvbnRlbnQiLCAicmVmZXJlbmNlIiwgIl9yZWZlcmVuY2UkZ2V0QXR0cmlidSIsICJnZXRBdHRyaWJ1dGUiLCAidGV4dENvbnRlbnQiLCAib25DcmVhdGVDYWxsYmFjayIsICJpbnN0YW5jZSIsICJzZXRBdHRyaWJ1dGUiLCAicmVtb3ZlQXR0cmlidXRlIiwgIm9uU2hvd0NhbGxiYWNrIiwgInNldENvbnRlbnQiLCAidGlwcHlGb3JDaXRpemVuSGVhZGVyIiwgIl9pdGVyYXRvcjUiLCAiX3N0ZXA1IiwgInRpcHB5IiwgImFycm93IiwgImNvbnRlbnQiLCAicGxhY2VtZW50IiwgIm9uQ3JlYXRlIiwgIm9uSGlkZGVuIiwgIm9uU2hvdyIsICJ0aXBweUZvckV4dGVuc2lvbiIsICJfcmVmIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgImFwcGx5IiwgImFyZ3VtZW50cyIsICJkZXByZWNhdGVkRnVuY3Rpb25zIiwgImxvZyIsICJkZXByZWNhdGUiLCAiYWRkU2NyaXB0VGFnIiwgImFkZExpbmtUYWciLCAibW9kdWxlcyIsICJ3aWtpVXJsZW5jb2RlIiwgInJlYWR5IiwgImdldFNjcmlwdCIsICJ1cmwiLCAiaW1wb3J0X2V4dF9nYWRnZXQ0IiwgInNpdGVDb21tb24iLCAiY29uZmlnS2V5IiwgInNldCIsICJnZXRCb2R5Il0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1NpdGVDb21tb25fSlMvbW9kdWxlcy9jb3JlLnRzeCIsICJzcmMvU2l0ZUNvbW1vbl9KUy9tb2R1bGVzL2kxOG4udHMiLCAic3JjL1NpdGVDb21tb25fSlMvbW9kdWxlcy90aXBweS50cyIsICJzcmMvU2l0ZUNvbW1vbl9KUy9tb2R1bGVzL2RlcHJlY2F0ZWRGdW5jdGlvbnMudHMiLCAic3JjL1NpdGVDb21tb25fSlMvU2l0ZUNvbW1vbl9KUy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IFJlYWN0IGZyb20gJ2V4dC5nYWRnZXQuUmVhY3QnO1xuaW1wb3J0IHtnZXRNZXNzYWdlfSBmcm9tICcuL2kxOG4nO1xuaW1wb3J0IHt1bmlxdWVBcnJheX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuY29uc3Qge3dnQWN0aW9uLCB3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZSwgd2dOYW1lc3BhY2VOdW1iZXIsIHdnUGFnZU5hbWUsIHdnU2NyaXB0LCB3Z1VzZXJOYW1lfSA9IG13LmNvbmZpZy5nZXQoKTtcblxuY29uc3QgbG9hZFdpdGhVUkwgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdGNvbnN0IFVSTF9XSVRIX0NTUzogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnd2l0aENTUycpO1xuXHRjb25zdCBVUkxfV0lUSF9KUzogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnd2l0aEpTJyk7XG5cdGNvbnN0IFVSTF9XSVRIX01PRFVMRTogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnd2l0aE1vZHVsZScpO1xuXHQvKipcblx0ICogJndpdGhDU1M9IGFuZCAmd2l0aEpTPSBVUkwgcGFyYW1ldGVyc1xuXHQgKiBBbGxvdyB0byB0cnkgY3VzdG9tIHNjcmlwdHMgZnJvbSBNZWRpYVdpa2kgc3BhY2Vcblx0ICogd2l0aG91dCBlZGl0aW5nIHBlcnNvbmFsIC5jc3Mgb3IgLmpzIGZpbGVzXG5cdCAqL1xuXHRpZiAoVVJMX1dJVEhfQ1NTIHx8IFVSTF9XSVRIX0pTIHx8IFVSTF9XSVRIX01PRFVMRSkge1xuXHRcdGlmIChVUkxfV0lUSF9DU1MgJiYgL15NZWRpYVdpa2k6W14jJSY8PT5dKlxcLmNzcyQvLnRlc3QoVVJMX1dJVEhfQ1NTKSkge1xuXHRcdFx0bXcubG9hZGVyLmxvYWQoXG5cdFx0XHRcdG13LnV0aWwuZ2V0VXJsKFVSTF9XSVRIX0NTUywge1xuXHRcdFx0XHRcdGFjdGlvbjogJ3JhdycsXG5cdFx0XHRcdFx0Y3R5cGU6ICd0ZXh0L2NzcycsXG5cdFx0XHRcdFx0bWF4YWdlOiAnMzYwMCcsXG5cdFx0XHRcdFx0c21heGFnZTogJzM2MDAnLFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0J3RleHQvY3NzJ1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKFVSTF9XSVRIX0pTIHx8IFVSTF9XSVRIX01PRFVMRSkge1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUzYxMzNcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0XHRcdGNvbnN0IHJlcXVpcmUgPSBhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ2V4dC5nYWRnZXQuU2l0ZUNvbW1vbl9KUycpO1xuXG5cdFx0XHRpZiAoVVJMX1dJVEhfSlMgJiYgL15NZWRpYVdpa2k6W14jJSY8PT5dKlxcLmpzJC8udGVzdChVUkxfV0lUSF9KUykpIHtcblx0XHRcdFx0bXcubG9hZGVyLmxvYWQoXG5cdFx0XHRcdFx0bXcudXRpbC5nZXRVcmwoVVJMX1dJVEhfSlMsIHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3JhdycsXG5cdFx0XHRcdFx0XHRjdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG5cdFx0XHRcdFx0XHRtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0XHRcdHNtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoVVJMX1dJVEhfTU9EVUxFICYmIC9eKChleHRcXC5bXix8XSspWyx8XT8pKyQvLnRlc3QoVVJMX1dJVEhfTU9EVUxFKSkge1xuXHRcdFx0XHRjb25zdCBtb2R1bGVzID0gdW5pcXVlQXJyYXkoVVJMX1dJVEhfTU9EVUxFLnNwbGl0KC9bLHxdLykpO1xuXHRcdFx0XHRtdy5sb2FkZXIubG9hZChtb2R1bGVzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIExvYWQgQ1NTIGFuZCBKUyBmaWxlcyB0ZW1wb3JhcmlseSB0aHJvdWdoIFVSTC5cblx0ICogJnVzZT1GaWxlMS5jc3N8RmlsZTIuY3NzfEZpbGUzLmpzXG5cdCAqL1xuXHRjb25zdCBVUkxfVVNFOiBzdHJpbmcgfCBudWxsID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd1c2UnKTtcblx0aWYgKFVSTF9VU0UpIHtcblx0XHRjb25zdCB3Z1VzZXJOYW1lRXhjYXBlZDogc3RyaW5nID0gbXcudXRpbC5lc2NhcGVSZWdFeHAod2dVc2VyTmFtZSA/PyAnJyk7XG5cdFx0Y29uc3QgUkVHRVhfRklMRTogUmVnRXhwID0gbmV3IFJlZ0V4cChcblx0XHRcdGBeKD86TWVkaWFXaWtpOiR7d2dVc2VyTmFtZUV4Y2FwZWQgPyBgfFVzZXI6JHt3Z1VzZXJOYW1lRXhjYXBlZH0vYCA6ICcnfSlbXiY8Pj0lI10qXFxcXC4oanN8Y3NzKSRgXG5cdFx0KTtcblx0XHRjb25zdCBSRUdFWF9FWFQ6IFJlZ0V4cCA9IC9eZXh0XFwuW14sXSskLztcblx0XHRjb25zdCBwYXRoOiBzdHJpbmcgPSB3Z1NjcmlwdDtcblx0XHRjb25zdCB1c2VGaWxlcyA9IFVSTF9VU0Uuc3BsaXQoL1ssfF0vKTtcblx0XHRmb3IgKGNvbnN0IHVzZUZpbGUgb2YgdXNlRmlsZXMpIHtcblx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IHVzZUZpbGUudG9TdHJpbmcoKS50cmltKCk7XG5cdFx0XHRjb25zdCB3aGF0OiBzdHJpbmdbXSA9IFJFR0VYX0ZJTEUuZXhlYyhuYW1lKSA/PyBbJycsICcnXTtcblx0XHRcdHN3aXRjaCAod2hhdFsxXSkge1xuXHRcdFx0XHRjYXNlICdjc3MnOlxuXHRcdFx0XHRcdG13LmxvYWRlci5sb2FkKGAke3BhdGh9P2FjdGlvbj1yYXcmY3R5cGU9dGV4dC9jc3MmdGl0bGU9JHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2pzJzoge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFM2MTMzXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdFx0XHRcdGNvbnN0IHJlcXVpcmUgPSBhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ2V4dC5nYWRnZXQuU2l0ZUNvbW1vbl9KUycpO1xuXHRcdFx0XHRcdG13LmxvYWRlci5sb2FkKGAke3BhdGh9P2FjdGlvbj1yYXcmY3R5cGU9dGV4dC9qYXZhc2NyaXB0JnRpdGxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYgKFJFR0VYX0VYVC50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTNjEzM1xuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVxdWlyZSA9IGF3YWl0IG13LmxvYWRlci51c2luZygnZXh0LmdhZGdldC5TaXRlQ29tbW9uX0pTJyk7XG5cdFx0XHRcdFx0XHRtdy5sb2FkZXIubG9hZChuYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBoaWdoTGlnaHRSZXYgPSAoJGJvZHk6IEpRdWVyeTxIVE1MQm9keUVsZW1lbnQ+KTogdm9pZCA9PiB7XG5cdC8qKlxuXHQgKiBBZGQgaGlnaGxpZ2h0IHRvIHJldmlzaW9ucyB3aGVuIHVzaW5nIGAmaGlsaWdodD1yZXZpZGAgb3IgYCZoaWdobGlnaHQ9cmV2aWRgXG5cdCAqL1xuXHRjb25zdCBVUkxfSElHSExJR0hUOiBzdHJpbmcgfCBudWxsID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdoaWdobGlnaHQnKTtcblx0Y29uc3QgVVJMX0hJTElHSFQ6IHN0cmluZyB8IG51bGwgPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2hpbGlnaHQnKTtcblx0Y29uc3QgaGlnaGxpZ2h0OiBzdHJpbmcgfCBudWxsID0gVVJMX0hJR0hMSUdIVCA/PyBVUkxfSElMSUdIVDtcblxuXHRpZiAoIWhpZ2hsaWdodCB8fCB3Z0FjdGlvbiAhPT0gJ2hpc3RvcnknKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Zm9yIChjb25zdCB2ZXJzaW9uIG9mIGhpZ2hsaWdodC5zcGxpdCgnLCcpKSB7XG5cdFx0JGJvZHkuZmluZChgaW5wdXRbbmFtZT1vbGRpZF1bdmFsdWU9JHt2ZXJzaW9ufV1gKS5wYXJlbnQoKS5hZGRDbGFzcygnbm90LXBhdHJvbGxlZCcpO1xuXHR9XG59O1xuXG5jb25zdCBhZGRUYXJnZXRCbGFuayA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0LyoqXG5cdCAqIEFkZCB0YXJnZXQ9XCJibGFua1wiIHRvIGV4dGVybmFsIGxpbmtzXG5cdCAqL1xuXHQkYm9keS5maW5kPEhUTUxBbmNob3JFbGVtZW50PignYS5leHRlcm5hbCwgYVtyZWw9XCJtdzpFeHRMaW5rXCJdJykuZmlsdGVyKChfaW5kZXgsIGVsZW1lbnQpOiBib29sZWFuID0+IHtcblx0XHRjb25zdCBsaW5rSHJlZjogc3RyaW5nIHwgdW5kZWZpbmVkID0gJChlbGVtZW50KS5hdHRyKCdocmVmJyk7XG5cdFx0aWYgKGxpbmtIcmVmKSB7XG5cdFx0XHRjb25zdCBocmVmU3BsaXQ6IHN0cmluZ1tdID0gbGlua0hyZWYuc3BsaXQoJy8nKTtcblx0XHRcdGlmIChocmVmU3BsaXQubGVuZ3RoIDwgMyB8fCBocmVmU3BsaXRbMl0gPT09IGxvY2F0aW9uLmhvc3QpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChlbGVtZW50LmhyZWYuaW5jbHVkZXMoYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3RuYW1lfWApKSB7XG5cdFx0XHRlbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuXHRcdFx0aWYgKCFlbGVtZW50LnJlbC5pbmNsdWRlcygnbm9vcGVuZXInKSkge1xuXHRcdFx0XHRlbGVtZW50LnJlbCArPSAnIG5vb3BlbmVyJztcblx0XHRcdH1cblx0XHRcdGlmICghZWxlbWVudC5yZWwuaW5jbHVkZXMoJ25vcmVmZXJyZXInKSkge1xuXHRcdFx0XHRlbGVtZW50LnJlbCArPSAnIG5vcmVmZXJyZXInO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9KTtcbn07XG5cbmNvbnN0IHJlbW92ZVRpdGxlRnJvbVBlcm1hbGluayA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0LyoqXG5cdCAqIFJlbW92ZSB0aXRsZT0qIGZyb20gcGVybWFsaW5rXG5cdCAqL1xuXHRjb25zdCAkcGVybWFMaW5rOiBKUXVlcnkgPSAkYm9keS5maW5kKCcjdC1wZXJtYWxpbmsnKTtcblx0aWYgKCEkcGVybWFMaW5rLmxlbmd0aCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0ICRwZXJtYUxpbmtGaXJzdENoaWxkOiBKUXVlcnk8SFRNTEFuY2hvckVsZW1lbnQ+ID0gJHBlcm1hTGluay5maW5kPEhUTUxBbmNob3JFbGVtZW50PignOmZpcnN0LWNoaWxkJyk7XG5cblx0Y29uc3QgaHJlZjogc3RyaW5nIHwgdW5kZWZpbmVkID0gJHBlcm1hTGlua0ZpcnN0Q2hpbGQuYXR0cignaHJlZicpPy5yZXBsYWNlKC90aXRsZT1bXiZdKiYvLCAnJyk7XG5cdGlmICghaHJlZikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdCRwZXJtYUxpbmtGaXJzdENoaWxkLmF0dHIoJ2hyZWYnLCBocmVmKTtcbn07XG5cbmNvbnN0IG9wZW5TZWFyY2hJbk5ld1RhYiA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0LyoqXG5cdCAqIE9wZW4gc2VhcmNoIHJlc3VsdHMgaW4gYSBuZXcgdGFiIG9yIHdpbmRvd1xuXHQgKiB3aGVuIGhvbGRpbmcgZG93biB0aGUgQ3RybCBrZXkgKGJ5IFRpbWVzaGlmdGVyKVxuXHQgKi9cblx0JGJvZHlcblx0XHQuZmluZChbJyNzZWFyY2gnLCAnI3NlYXJjaGJveCcsICcjc2VhcmNoZm9ybScsICcuc2VhcmNoLXR5cGVzJywgJyNzZWFyY2gtdHlwZXMnXS5qb2luKCcsJykpXG5cdFx0Lm9uKCdrZXlkb3duIGtleXVwIG1vdXNlZG93bicsIChldmVudDogSlF1ZXJ5LlRyaWdnZXJlZEV2ZW50PEhUTUxFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qge2N0cmxLZXksIG1ldGFLZXksIHRhcmdldH0gPSBldmVudDtcblx0XHRcdCQodGFyZ2V0KS5hdHRyKCd0YXJnZXQnLCAoY3RybEtleSA/PyBtZXRhS2V5KSA/ICdfYmxhbmsnIDogJycpO1xuXHRcdH0pO1xufTtcblxuY29uc3QgdGl0bGVDbGVhblVwID0gKCRib2R5OiBKUXVlcnk8SFRNTEJvZHlFbGVtZW50Pik6IHZvaWQgPT4ge1xuXHQvKipcblx0ICogQ2xlYW51cCB0aXRsZSBmb3IgYWxsIHBhZ2VzXG5cdCAqL1xuXHRjb25zdCBVUkxfRElGRjogc3RyaW5nIHwgbnVsbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnZGlmZicpO1xuXHRpZiAoVVJMX0RJRkYgfHwgd2dBY3Rpb24gIT09ICd2aWV3JyB8fCAhWzYsIDExOF0uaW5jbHVkZXMod2dOYW1lc3BhY2VOdW1iZXIpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgZnVsbFBhZ2VOYW1lOiBzdHJpbmcgPSBuZXcgbXcuVGl0bGUod2dQYWdlTmFtZSkuZ2V0UHJlZml4ZWRUZXh0KCk7XG5cdGNvbnN0ICRmaXJzdEhlYWRpbmc6IEpRdWVyeSA9ICRib2R5LmZpbmQoJy5maXJzdEhlYWRpbmcnKTtcblx0Y29uc3QgZG9jdW1lbnRUaXRsZTogc3RyaW5nID0gZG9jdW1lbnQudGl0bGU7XG5cdGNvbnN0IHBhZ2VUaXRsZTogc3RyaW5nID0gJGZpcnN0SGVhZGluZy50ZXh0KCk7XG5cblx0Y29uc3QgcmVwbGFjZVRpdGxlID0gKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdGl0bGUucmVwbGFjZShwYWdlVGl0bGUsIGZ1bGxQYWdlTmFtZSk7XG5cblx0ZG9jdW1lbnQudGl0bGUgPSByZXBsYWNlVGl0bGUoZG9jdW1lbnRUaXRsZSk7XG5cdCRmaXJzdEhlYWRpbmcudGV4dChyZXBsYWNlVGl0bGUocGFnZVRpdGxlKSk7XG59O1xuXG5jb25zdCB1bmloYW5Qb3B1cCA9IGFzeW5jICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0LyoqXG5cdCAqIERpc3BsYXkgdGl0bGU9KC4qKSBvZiA8c3BhbiBjbGFzcz1cImlubGluZS11bmloYW5cIj4gYWZ0ZXIgdGhlbS5cblx0ICogKGJldGEgdGVzdClcblx0ICovXG5cdC8vIERvIG5vdCBkaXNwbGF5IG9uIFNwZWNpYWwgUGFnZXNcblx0aWYgKHdnTmFtZXNwYWNlTnVtYmVyIDwgMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGF3YWl0IG13LmxvYWRlci51c2luZygnb29qcy11aS1jb3JlJyk7XG5cblx0Zm9yIChjb25zdCBlbGVtZW50IG9mICRib2R5LmZpbmQoJ2F0dHIsIC5pbmxpbmUtdW5paGFuJykpIHtcblx0XHRjb25zdCAkZWxlbWVudDogSlF1ZXJ5ID0gJChlbGVtZW50KTtcblxuXHRcdGNvbnN0IHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAkZWxlbWVudC5hdHRyKCd0aXRsZScpO1xuXHRcdGlmICghdGl0bGUpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBvcHVwOiBPTy51aS5Qb3B1cFdpZGdldCA9IG5ldyBPTy51aS5Qb3B1cFdpZGdldCh7XG5cdFx0XHQkY29udGVudDogJCg8cD57dGl0bGV9PC9wPikgYXMgSlF1ZXJ5LFxuXHRcdFx0bGFiZWw6IGdldE1lc3NhZ2UoJ05vdGUnKSxcblx0XHRcdGFuY2hvcjogdHJ1ZSxcblx0XHRcdGhlYWQ6IHRydWUsXG5cdFx0XHRwYWRkZWQ6IHRydWUsXG5cdFx0fSk7XG5cblx0XHQkYm9keS5hcHBlbmQocG9wdXAuJGVsZW1lbnQpO1xuXG5cdFx0JGVsZW1lbnQub24oJ2NsaWNrJywgKCk6IHZvaWQgPT4ge1xuXHRcdFx0cG9wdXAudG9nZ2xlKCk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmNvbnN0IGZpeExvY2F0aW9uSGFzaCA9ICgpOiB2b2lkID0+IHtcblx0Lyog5L+u5q2j5oqY5Y+g5ZCO5a6a5L2N5Y+Y5YyWICovXG5cdGlmIChsb2NhdGlvbi5oYXNoKSB7XG5cdFx0bG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhhc2g7XG5cdH1cbn07XG5cbmNvbnN0IGhpZGVOZXdVc2Vyc0xvZyA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0Lyog5Li05pe277ya56aB5q2i55So5oi35p+l55yL55So5oi35Yib5bu65pel5b+XICovXG5cdGlmICh3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZSAhPT0gJ0xvZycpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCAkbmV3VXNlcnNMb2c6IEpRdWVyeSA9ICRib2R5LmZpbmQoJ2lucHV0W25hbWU9XCJ3cGZpbHRlcnNbXVwiXVt2YWx1ZT1uZXd1c2Vyc10nKTtcblx0JG5ld1VzZXJzTG9nLnByb3Aoe1xuXHRcdGNoZWNrZWQ6IGZhbHNlLFxuXHRcdGRpc2FibGVkOiB0cnVlLFxuXHR9KTtcbn07XG5cbmNvbnN0IHRvZ2dsZUxpbmsgPSAoJGJvZHk6IEpRdWVyeTxIVE1MQm9keUVsZW1lbnQ+KTogdm9pZCA9PiB7XG5cdC8qIOiwg+aVtOaKmOWPoOaMiemSrueahOminOiJsiAqL1xuXHRjb25zdCAkdG9nZ2xlcjogSlF1ZXJ5ID0gJGJvZHkuZmluZCgnLm13LWNvbGxhcHNpYmxlLXRvZ2dsZSwgLmdhZGdldC1jb2xsYXBzaWJsZS10b2dnbGVyJyk7XG5cdGlmICghJHRvZ2dsZXIubGVuZ3RoKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCR0b2dnbGVyLnBhcmVudCgpWzBdPy5zdHlsZS5jb2xvcikge1xuXHRcdCR0b2dnbGVyLmZpbmQoJ2EnKS5jc3MoJ2NvbG9yJywgJ2luaGVyaXQnKTtcblx0fVxufTtcblxuZXhwb3J0IHtcblx0bG9hZFdpdGhVUkwsXG5cdGhpZ2hMaWdodFJldixcblx0YWRkVGFyZ2V0QmxhbmssXG5cdHJlbW92ZVRpdGxlRnJvbVBlcm1hbGluayxcblx0b3BlblNlYXJjaEluTmV3VGFiLFxuXHR0aXRsZUNsZWFuVXAsXG5cdHVuaWhhblBvcHVwLFxuXHRmaXhMb2NhdGlvbkhhc2gsXG5cdGhpZGVOZXdVc2Vyc0xvZyxcblx0dG9nZ2xlTGluayxcbn07XG4iLCAiaW1wb3J0IHtsb2NhbGl6ZX0gZnJvbSAnZXh0LmdhZGdldC5pMThuJztcblxuY29uc3QgZ2V0STE4bk1lc3NhZ2VzID0gKCkgPT4ge1xuXHRjb25zdCB7d2dVTFN9ID0gd2luZG93O1xuXHRyZXR1cm4ge1xuXHRcdE5vdGU6IGxvY2FsaXplKHtcblx0XHRcdGVuOiAnTm90ZTogJyxcblx0XHRcdCd6aC1oYW5zJzogJ+azqOmHiu+8micsXG5cdFx0XHQnemgtaGFudCc6ICfms6jph4vvvJonLFxuXHRcdH0pLFxuXHRcdE5vUGVybUVycm9yMDogd2dVTFMoXG5cdFx0XHQn5Zug5oqA5pyv5Y6f5Zug77yM5oKo5rKh5pyJ5p2D6ZmQ6K6/6Zeu55u45YWz6aG16Z2i44CC6Iul5pyJ55aR6Zeu77yM6K+35LiO5rGC6Ze755m+56eR6L+Q6JCl6ICF6IGU57O744CCJyxcblx0XHRcdCflm6DmioDooZPljp/lm6DvvIzmgqjmspLmnInmrIrpmZDoqKrllY/nm7jpl5zpoIHpnaLjgILoi6XmnInnlpHllY/vvIzoq4voiIfmsYLogZ7nmb7np5HpgYvnh5/ogIXoga/ns7vjgIInXG5cdFx0KSxcblx0XHROb1Blcm1FcnJvcjE6IHdnVUxTKFxuXHRcdFx0J+aCqOayoeacieadg+mZkOiuv+mXruebuOWFs+mhtemdouOAguiLpeaCqOaYr+i1hOa3see8luiAhe+8jOivt+S4juaxgumXu+eZvuenkeaKgOacr+WboumYn+iBlOezu++8jOS7peiOt+WPluadg+mZkOOAgicsXG5cdFx0XHQn5oKo5rKS5pyJ5qyK6ZmQ6Kiq5ZWP55u46Zec6aCB6Z2i44CC6Iul5oKo5piv6LOH5rex57eo6ICF77yM6KuL6IiH5rGC6IGe55m+56eR5oqA6KGT5ZyY6ZqK6IGv57O777yM5Lul542y5Y+W5qyK6ZmQ44CCJ1xuXHRcdCksXG5cdFx0Tm9QZXJtRXJyb3IyOiB3Z1VMUyhcblx0XHRcdCfmgqjnmoTnvZHnu5znjq/looPlrZjlnKjpo47pmanvvIzor7fnmbvlvZXlkI7nu6fnu63kvb/nlKjjgILoi6XmgqjmsqHmnInmsYLpl7vnmb7np5HotKblj7fvvIzor7fms6jlhozlkI7nmbvlvZXjgIInLFxuXHRcdFx0J+aCqOeahOe2sui3r+eSsOWig+WtmOWcqOmiqOmaqu+8jOiri+eZu+WFpeW+jOe5vOe6jOS9v+eUqOOAguiLpeaCqOaykuacieaxguiBnueZvuenkeizrOiZn++8jOiri+azqOWGiuW+jOeZu+mMhOOAgidcblx0XHQpLFxuXHRcdE5vUGVybUVycm9yMzogd2dVTFMoXG5cdFx0XHQn55u45YWz5Yqf6IO95LuF5ZCR5rOo5YaM55So5oi35byA5pS+77yM6K+355m75b2V5ZCO57un57ut5L2/55So44CC6Iul5oKo5rKh5pyJ5rGC6Ze755m+56eR6LSm5Y+377yM6K+35rOo5YaM5ZCO55m75b2V44CCJyxcblx0XHRcdCfnm7jpl5zlip/og73lg4XlkJHms6jlhornlKjmiLbplovmlL7vvIzoq4vnmbvlhaXlvoznubznuozkvb/nlKjjgILoi6XmgqjmspLmnInmsYLogZ7nmb7np5Hos6zomZ/vvIzoq4vms6jlhorlvoznmbvpjITjgIInXG5cdFx0KSxcblx0XHROb1Blcm1FcnJvcjQ6IHdnVUxTKFxuXHRcdFx0J+aCqOayoeacieadg+mZkOiuv+mXruebuOWFs+mhtemdouOAguiLpeacieeWkemXru+8jOivt+S4juaxgumXu+eZvuenkei/kOiQpeiAheiBlOezu+OAgicsXG5cdFx0XHQn5oKo5rKS5pyJ5qyK6ZmQ6Kiq5ZWP55u46Zec6aCB6Z2i44CC6Iul5pyJ55aR5ZWP77yM6KuL6IiH5rGC6IGe55m+56eR6YGL54ef6ICF6IGv57O744CCJ1xuXHRcdCksXG5cdH07XG59O1xuXG5jb25zdCBpMThuTWVzc2FnZXMgPSBnZXRJMThuTWVzc2FnZXMoKTtcblxuY29uc3QgZ2V0TWVzc2FnZTogR2V0TWVzc2FnZXM8dHlwZW9mIGkxOG5NZXNzYWdlcz4gPSAoa2V5KSA9PiB7XG5cdHJldHVybiBpMThuTWVzc2FnZXNba2V5XSB8fCBrZXk7XG59O1xuXG5leHBvcnQge2dldE1lc3NhZ2V9O1xuIiwgImltcG9ydCB7dGlwcHl9IGZyb20gJ2V4dC5nYWRnZXQuVGlwcHknO1xuXG5jb25zdCB7c2tpbn0gPSBtdy5jb25maWcuZ2V0KCk7XG5cbmNvbnN0IGdldENvbnRlbnQgPSAocmVmZXJlbmNlOiBFbGVtZW50KTogc3RyaW5nID0+IHtcblx0Y29uc3QgbGFiZWw6IHN0cmluZyB8IG51bGwgPSByZWZlcmVuY2UuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG5cdGNvbnN0IHRpdGxlOiBzdHJpbmcgfCBudWxsID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSgnYWx0JykgPz8gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcblxuXHRyZXR1cm4gKGxhYmVsID09PSB0aXRsZSA/IGxhYmVsIDogdGl0bGUgfHwgbGFiZWwpIHx8IChyZWZlcmVuY2UudGV4dENvbnRlbnQgYXMgc3RyaW5nKTtcbn07XG5cbmNvbnN0IG9uQ3JlYXRlQ2FsbGJhY2sgPSAoaW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIHRpcHB5PlswXSk6IHZvaWQgPT4ge1xuXHRjb25zdCB7cmVmZXJlbmNlfSA9IGluc3RhbmNlO1xuXHRyZWZlcmVuY2Uuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgZ2V0Q29udGVudChyZWZlcmVuY2UpKTtcblx0cmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbn07XG5cbmNvbnN0IG9uU2hvd0NhbGxiYWNrID0gKGluc3RhbmNlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aXBweT5bMF0pOiB2b2lkID0+IHtcblx0b25DcmVhdGVDYWxsYmFjayhpbnN0YW5jZSk7XG5cdGluc3RhbmNlLnNldENvbnRlbnQoZ2V0Q29udGVudChpbnN0YW5jZS5yZWZlcmVuY2UpKTtcbn07XG5cbmNvbnN0IHRpcHB5Rm9yQ2l0aXplbkhlYWRlciA9ICgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0aWYgKHNraW4gIT09ICdjaXRpemVuJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiAkYm9keS5maW5kKFxuXHRcdFtcblx0XHRcdCcuY2l0aXplbi1oZWFkZXIgbGFiZWxbdGl0bGVdJyxcblx0XHRcdCcuY2l0aXplbi1oZWFkZXIgLm13LWVjaG8tbm90aWZpY2F0aW9ucy1iYWRnZScsXG5cdFx0XHQnLmNpdGl6ZW4taGVhZGVyX19sb2dvIGEnLFxuXHRcdFx0Jy5wYWdlLWFjdGlvbnM+bmF2PnVsPmxpIGEnLFxuXHRcdFx0Jy5wYWdlLWFjdGlvbnNfX2J1dHRvbicsXG5cdFx0XS5qb2luKCcsJylcblx0KSkge1xuXHRcdGNvbnN0ICRlbGVtZW50OiBKUXVlcnkgPSAkKGVsZW1lbnQpO1xuXHRcdGxldCB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gJGVsZW1lbnQuYXR0cigndGl0bGUnKTtcblx0XHRpZiAoIXRpdGxlKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR0aXRsZSA9IHRpdGxlLnJlcGxhY2UoL1xccyo/XFxbLis/XSQvLCAnJyk7XG5cblx0XHQkZWxlbWVudC5hdHRyKHtcblx0XHRcdCdhcmlhLWxhYmVsJzogdGl0bGUsXG5cdFx0XHR0aXRsZTogJycsXG5cdFx0fSk7XG5cdFx0dGlwcHkoJGVsZW1lbnQuZ2V0KDApIGFzIEhUTUxFbGVtZW50LCB7XG5cdFx0XHRhcnJvdzogdHJ1ZSxcblx0XHRcdGNvbnRlbnQ6IHRpdGxlLFxuXHRcdFx0cGxhY2VtZW50OiAnYm90dG9tJyxcblx0XHRcdG9uQ3JlYXRlOiBvbkNyZWF0ZUNhbGxiYWNrLFxuXHRcdFx0b25IaWRkZW46IG9uQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRvblNob3c6IG9uU2hvd0NhbGxiYWNrLFxuXHRcdH0pO1xuXHR9XG59O1xuXG5jb25zdCB0aXBweUZvckV4dGVuc2lvbiA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQuQ29sbGFwc2libGVTaWRlYmFyLmpzJyk7XG5cdHRpcHB5KCcjc2lkZWJhckJ1dHRvbicsIHtcblx0XHRhcnJvdzogdHJ1ZSxcblx0XHRjb250ZW50OiBnZXRDb250ZW50LFxuXHRcdHBsYWNlbWVudDogJ2xlZnQnLFxuXHRcdG9uQ3JlYXRlOiBvbkNyZWF0ZUNhbGxiYWNrLFxuXHRcdG9uSGlkZGVuOiBvbkNyZWF0ZUNhbGxiYWNrLFxuXHRcdG9uU2hvdzogb25TaG93Q2FsbGJhY2ssXG5cdH0pO1xuXG5cdGlmIChza2luID09PSAndmVjdG9yJykge1xuXHRcdGF3YWl0IG13LmxvYWRlci51c2luZygnZXh0LkNvbGxhcHNpYmxlU2lkZWJhci52ZWN0b3InKTtcblx0XHR0aXBweSgnI3NpZGViYXJDb2xsYXBzZScsIHtcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0Y29udGVudDogZ2V0Q29udGVudCxcblx0XHRcdHBsYWNlbWVudDogJ3JpZ2h0Jyxcblx0XHRcdG9uQ3JlYXRlOiBvbkNyZWF0ZUNhbGxiYWNrLFxuXHRcdFx0b25IaWRkZW46IG9uQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRvblNob3c6IG9uU2hvd0NhbGxiYWNrLFxuXHRcdH0pO1xuXHR9XG5cblx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQuRGFya01vZGUnKTtcblx0dGlwcHkoJyNkYXJrbW9kZS1idXR0b24nLCB7XG5cdFx0YXJyb3c6IHRydWUsXG5cdFx0Y29udGVudDogZ2V0Q29udGVudCxcblx0XHRwbGFjZW1lbnQ6ICdsZWZ0Jyxcblx0XHRvbkNyZWF0ZTogb25DcmVhdGVDYWxsYmFjayxcblx0XHRvbkhpZGRlbjogb25DcmVhdGVDYWxsYmFjayxcblx0XHRvblNob3c6IG9uU2hvd0NhbGxiYWNrLFxuXHR9KTtcbn07XG5cbmV4cG9ydCB7dGlwcHlGb3JDaXRpemVuSGVhZGVyLCB0aXBweUZvckV4dGVuc2lvbn07XG4iLCAiY29uc3QgZGVwcmVjYXRlZEZ1bmN0aW9ucyA9ICgpOiB2b2lkID0+IHtcblx0LyohXG5cdCAqIG1haW50ZW5hbmNlOiBTb21lIHVzZXIgc2NyaXB0cyBtYXkgYmUgdXNpbmcgdGhlIGZvbGxvd2luZyBkZXByZWNhdGVkIGZ1bmN0aW9ucy5cblx0ICogVGhlc2UgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgdXBkYXRlZC5cblx0ICovXG5cdG13LmxvZy5kZXByZWNhdGUoXG5cdFx0d2luZG93LFxuXHRcdCdpbXBvcnRTY3JpcHQnLFxuXHRcdCh0aXRsZTogc3RyaW5nKTogSFRNTFNjcmlwdEVsZW1lbnQgPT4ge1xuXHRcdFx0cmV0dXJuIG13LmxvYWRlci5hZGRTY3JpcHRUYWcoXG5cdFx0XHRcdG13LnV0aWwuZ2V0VXJsKHRpdGxlLCB7XG5cdFx0XHRcdFx0YWN0aW9uOiAncmF3Jyxcblx0XHRcdFx0XHRjdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG5cdFx0XHRcdFx0bWF4YWdlOiAnMzYwMCcsXG5cdFx0XHRcdFx0c21heGFnZTogJzM2MDAnLFxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9LFxuXHRcdCdVc2UgbXcubG9hZGVyLmFkZFNjcmlwdFRhZygpIGluc3RlYWQnXG5cdCk7XG5cblx0bXcubG9nLmRlcHJlY2F0ZShcblx0XHR3aW5kb3csXG5cdFx0J2ltcG9ydFN0eWxlc2hlZXQnLFxuXHRcdCh0aXRsZTogc3RyaW5nKTogSFRNTExpbmtFbGVtZW50ID0+IHtcblx0XHRcdHJldHVybiBtdy5sb2FkZXIuYWRkTGlua1RhZyhcblx0XHRcdFx0bXcudXRpbC5nZXRVcmwodGl0bGUsIHtcblx0XHRcdFx0XHRhY3Rpb246ICdyYXcnLFxuXHRcdFx0XHRcdGN0eXBlOiAndGV4dC9jc3MnLFxuXHRcdFx0XHRcdG1heGFnZTogJzM2MDAnLFxuXHRcdFx0XHRcdHNtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0fSksXG5cdFx0XHRcdCd0ZXh0L2Nzcydcblx0XHRcdCk7XG5cdFx0fSxcblx0XHQnVXNlIG13LmxvYWRlci5hZGRMaW5rVGFnKCkgaW5zdGVhZCdcblx0KTtcblxuXHRtdy5sb2cuZGVwcmVjYXRlKFxuXHRcdHdpbmRvdyxcblx0XHQnaW1wb3J0U2NyaXB0VVJJJyxcblx0XHQobW9kdWxlczogc3RyaW5nKTogSFRNTFNjcmlwdEVsZW1lbnQgPT4ge1xuXHRcdFx0cmV0dXJuIG13LmxvYWRlci5hZGRTY3JpcHRUYWcobXcudXRpbC53aWtpVXJsZW5jb2RlKG1vZHVsZXMpKTtcblx0XHR9LFxuXHRcdCdVc2UgbXcubG9hZGVyLmFkZFNjcmlwdFRhZygpIG9yIG13LmxvYWRlci5nZXRTY3JpcHQoKSBpbnN0ZWFkJ1xuXHQpO1xuXG5cdG13LmxvZy5kZXByZWNhdGUoXG5cdFx0d2luZG93LFxuXHRcdCdpbXBvcnRTdHlsZXNoZWV0VVJJJyxcblx0XHQobW9kdWxlczogc3RyaW5nKTogSFRNTExpbmtFbGVtZW50ID0+IHtcblx0XHRcdHJldHVybiBtdy5sb2FkZXIuYWRkTGlua1RhZyhtdy51dGlsLndpa2lVcmxlbmNvZGUobW9kdWxlcyksICd0ZXh0L2NzcycpO1xuXHRcdH0sXG5cdFx0J1VzZSBtdy5sb2FkZXIuYWRkTGlua1RhZygpIGluc3RlYWQnXG5cdCk7XG5cblx0bXcubG9nLmRlcHJlY2F0ZShcblx0XHR3aW5kb3csXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUzIzNDVcblx0XHQnaW1wb3J0U2NyaXB0Q2FsbGJhY2snLFxuXHRcdCh0aXRsZTogc3RyaW5nLCByZWFkeTogbmV2ZXIpOiB2b2lkID0+IHtcblx0XHRcdHZvaWQgbXcubG9hZGVyXG5cdFx0XHRcdC5nZXRTY3JpcHQoXG5cdFx0XHRcdFx0bXcudXRpbC5nZXRVcmwodGl0bGUsIHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3JhdycsXG5cdFx0XHRcdFx0XHRjdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG5cdFx0XHRcdFx0XHRtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0XHRcdHNtYXhhZ2U6ICczNjAwJyxcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpXG5cdFx0XHRcdC50aGVuKHJlYWR5KTtcblx0XHR9LFxuXHRcdCdVc2UgbXcubG9hZGVyLmdldFNjcmlwdCgpIGluc3RlYWQnXG5cdCk7XG5cblx0bXcubG9nLmRlcHJlY2F0ZShcblx0XHR3aW5kb3csXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUzIzNDVcblx0XHQnaW1wb3J0U2NyaXB0VVJJQ2FsbGJhY2snLFxuXHRcdCh1cmw6IHN0cmluZywgcmVhZHk6IG5ldmVyKTogdm9pZCA9PiB7XG5cdFx0XHR2b2lkIG13LmxvYWRlci5nZXRTY3JpcHQodXJsKS50aGVuKHJlYWR5KTtcblx0XHR9LFxuXHRcdCdVc2UgbXcubG9hZGVyLmdldFNjcmlwdCgpIGluc3RlYWQnXG5cdCk7XG5cdC8qKlxuXHQgKiBtYWludGVuYW5jZTogU29tZSB1c2VyIHNjcmlwdHMgbWF5IGJlIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGVwcmVjYXRlZCBmdW5jdGlvbnMuXG5cdCAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUga2VwdCBmb3IgY29tcGFiaWxpdHkuXG5cdCAqL1xuXHQvLyBtdy5sb2cuZGVwcmVjYXRlKHdpbmRvdywgJ0pTQ29uZmlnJywge30sICdVc2Uge30gaW5zdGVhZCcpO1xuXHQvKipcblx0ICogd2dVKlMgZnVuY3Rpb25zIGhhdmUgYmVlbiBzcGxpdCB0byBhIHNlcGVyYXRlIGdhZGdldCAoZXh0LmdhZGdldC5pMThuKS5cblx0ICovXG59O1xuXG5leHBvcnQge2RlcHJlY2F0ZWRGdW5jdGlvbnN9O1xuIiwgImltcG9ydCB7XG5cdGFkZFRhcmdldEJsYW5rLFxuXHRmaXhMb2NhdGlvbkhhc2gsXG5cdGhpZGVOZXdVc2Vyc0xvZyxcblx0aGlnaExpZ2h0UmV2LFxuXHRsb2FkV2l0aFVSTCxcblx0b3BlblNlYXJjaEluTmV3VGFiLFxuXHRyZW1vdmVUaXRsZUZyb21QZXJtYWxpbmssXG5cdHRpdGxlQ2xlYW5VcCxcblx0dG9nZ2xlTGluayxcblx0dW5paGFuUG9wdXAsXG59IGZyb20gJy4vbW9kdWxlcy9jb3JlJztcbmltcG9ydCB7dGlwcHlGb3JDaXRpemVuSGVhZGVyLCB0aXBweUZvckV4dGVuc2lvbn0gZnJvbSAnLi9tb2R1bGVzL3RpcHB5JztcbmltcG9ydCB7ZGVwcmVjYXRlZEZ1bmN0aW9uc30gZnJvbSAnLi9tb2R1bGVzL2RlcHJlY2F0ZWRGdW5jdGlvbnMnO1xuaW1wb3J0IHtnZXRCb2R5fSBmcm9tICdleHQuZ2FkZ2V0LlV0aWwnO1xuXG4oZnVuY3Rpb24gc2l0ZUNvbW1vbigpOiB2b2lkIHtcblx0Y29uc3QgY29uZmlnS2V5OiBzdHJpbmcgPSAnZ2FkZ2V0LVNpdGVDb21tb25fSlNfX0luaXRpYWxpemVkJztcblxuXHQvLyBHdWFyZCBhZ2FpbnN0IGRvdWJsZSBpbmNsdXNpb25zXG5cdGlmIChtdy5jb25maWcuZ2V0KGNvbmZpZ0tleSkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Ly8gU2V0IGd1YXJkXG5cdG13LmNvbmZpZy5zZXQoY29uZmlnS2V5LCB0cnVlKTtcblxuXHQvLyBDb3JlIG1vZHVsZXNcblx0dm9pZCBsb2FkV2l0aFVSTCgpO1xuXHRmaXhMb2NhdGlvbkhhc2goKTtcblxuXHR2b2lkIGdldEJvZHkoKS50aGVuKCgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0XHQvLyBDb3JlIG1vZHVsZXMgKG5lZWQgJC5yZWFkeSlcblx0XHRoaWdoTGlnaHRSZXYoJGJvZHkpO1xuXHRcdGFkZFRhcmdldEJsYW5rKCRib2R5KTtcblx0XHRyZW1vdmVUaXRsZUZyb21QZXJtYWxpbmsoJGJvZHkpO1xuXHRcdG9wZW5TZWFyY2hJbk5ld1RhYigkYm9keSk7XG5cdFx0dGl0bGVDbGVhblVwKCRib2R5KTtcblx0XHR2b2lkIHVuaWhhblBvcHVwKCRib2R5KTtcblx0XHRoaWRlTmV3VXNlcnNMb2coJGJvZHkpO1xuXHRcdHRvZ2dsZUxpbmsoJGJvZHkpO1xuXG5cdFx0Ly8gVGlwcHktcmVsYXRlZCBjb2RlcyAobmVlZCAkLnJlYWR5KVxuXHRcdHRpcHB5Rm9yQ2l0aXplbkhlYWRlcigkYm9keSk7XG5cdH0pO1xuXG5cdC8vIERlcHJlY2F0ZWQgZnVuY3Rpb25zXG5cdGRlcHJlY2F0ZWRGdW5jdGlvbnMoKTtcblxuXHQvLyBUaXBweS1yZWxhdGVkIGNvZGVzXG5cdHZvaWQgdGlwcHlGb3JFeHRlbnNpb24oKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLHFCQUFrQkMsUUFBQUMsUUFBQSxrQkFBQSxHQUFBLENBQUE7O0FD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LFNBQUtrRCxZQUFZbEQsS0FBSztBQUN0QnVFLG9CQUFnQnZFLEtBQUs7QUFDckI0RSxlQUFXNUUsS0FBSztBQUdoQitGLDBCQUFzQi9GLEtBQUs7RUFDNUIsQ0FBQztBQUdEMkcsc0JBQW9CO0FBR3BCLE9BQUtGLGtCQUFrQjtBQUN4QixHQUFHOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfZXh0X2dhZGdldDIiLCAiX190b0VTTSIsICJyZXF1aXJlIiwgImltcG9ydF9leHRfZ2FkZ2V0IiwgImdldEkxOG5NZXNzYWdlcyIsICJ3Z1VMUyIsICJ3aW5kb3ciLCAiTm90ZSIsICJsb2NhbGl6ZSIsICJlbiIsICJOb1Blcm1FcnJvcjAiLCAiTm9QZXJtRXJyb3IxIiwgIk5vUGVybUVycm9yMiIsICJOb1Blcm1FcnJvcjMiLCAiTm9QZXJtRXJyb3I0IiwgImkxOG5NZXNzYWdlcyIsICJnZXRNZXNzYWdlIiwgImtleSIsICJpbXBvcnRfZXh0X2dhZGdldDMiLCAid2dBY3Rpb24iLCAid2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUiLCAid2dOYW1lc3BhY2VOdW1iZXIiLCAid2dQYWdlTmFtZSIsICJ3Z1NjcmlwdCIsICJ3Z1VzZXJOYW1lIiwgIm13IiwgImNvbmZpZyIsICJnZXQiLCAibG9hZFdpdGhVUkwiLCAiX3JlZiIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJVUkxfV0lUSF9DU1MiLCAidXRpbCIsICJnZXRQYXJhbVZhbHVlIiwgIlVSTF9XSVRIX0pTIiwgIlVSTF9XSVRIX01PRFVMRSIsICJ0ZXN0IiwgImxvYWRlciIsICJsb2FkIiwgImdldFVybCIsICJhY3Rpb24iLCAiY3R5cGUiLCAibWF4YWdlIiwgInNtYXhhZ2UiLCAicmVxdWlyZTIiLCAidXNpbmciLCAibW9kdWxlcyIsICJ1bmlxdWVBcnJheSIsICJzcGxpdCIsICJVUkxfVVNFIiwgIndnVXNlck5hbWVFeGNhcGVkIiwgImVzY2FwZVJlZ0V4cCIsICJSRUdFWF9GSUxFIiwgIlJlZ0V4cCIsICJjb25jYXQiLCAiUkVHRVhfRVhUIiwgInBhdGgiLCAidXNlRmlsZXMiLCAiX2l0ZXJhdG9yMiIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcDIiLCAicyIsICJuIiwgImRvbmUiLCAiX1JFR0VYX0ZJTEUkZXhlYyIsICJ1c2VGaWxlIiwgInZhbHVlIiwgIm5hbWUiLCAidG9TdHJpbmciLCAidHJpbSIsICJ3aGF0IiwgImV4ZWMiLCAiZW5jb2RlVVJJQ29tcG9uZW50IiwgImVyciIsICJlIiwgImYiLCAiYXBwbHkiLCAiYXJndW1lbnRzIiwgImhpZ2hMaWdodFJldiIsICIkYm9keSIsICJVUkxfSElHSExJR0hUIiwgIlVSTF9ISUxJR0hUIiwgImhpZ2hsaWdodCIsICJfaXRlcmF0b3IzIiwgIl9zdGVwMyIsICJ2ZXJzaW9uIiwgImZpbmQiLCAicGFyZW50IiwgImFkZENsYXNzIiwgImFkZFRhcmdldEJsYW5rIiwgImZpbHRlciIsICJfaW5kZXgiLCAiZWxlbWVudCIsICJsaW5rSHJlZiIsICIkIiwgImF0dHIiLCAiaHJlZlNwbGl0IiwgImxlbmd0aCIsICJsb2NhdGlvbiIsICJob3N0IiwgImhyZWYiLCAiaW5jbHVkZXMiLCAicHJvdG9jb2wiLCAiaG9zdG5hbWUiLCAidGFyZ2V0IiwgInJlbCIsICJyZW1vdmVUaXRsZUZyb21QZXJtYWxpbmsiLCAiXyRwZXJtYUxpbmtGaXJzdENoaWxkIiwgIiRwZXJtYUxpbmsiLCAiJHBlcm1hTGlua0ZpcnN0Q2hpbGQiLCAicmVwbGFjZSIsICJvcGVuU2VhcmNoSW5OZXdUYWIiLCAiam9pbiIsICJvbiIsICJldmVudCIsICJjdHJsS2V5IiwgIm1ldGFLZXkiLCAidGl0bGVDbGVhblVwIiwgIlVSTF9ESUZGIiwgImZ1bGxQYWdlTmFtZSIsICJUaXRsZSIsICJnZXRQcmVmaXhlZFRleHQiLCAiJGZpcnN0SGVhZGluZyIsICJkb2N1bWVudFRpdGxlIiwgImRvY3VtZW50IiwgInRpdGxlIiwgInBhZ2VUaXRsZSIsICJ0ZXh0IiwgInJlcGxhY2VUaXRsZSIsICJ1bmloYW5Qb3B1cCIsICJfcmVmMiIsICJfaXRlcmF0b3I0IiwgIl9zdGVwNCIsICIkZWxlbWVudCIsICJwb3B1cCIsICJPTyIsICJ1aSIsICJQb3B1cFdpZGdldCIsICIkY29udGVudCIsICJkZWZhdWx0IiwgImNyZWF0ZUVsZW1lbnQiLCAibGFiZWwiLCAiYW5jaG9yIiwgImhlYWQiLCAicGFkZGVkIiwgImFwcGVuZCIsICJ0b2dnbGUiLCAiX3giLCAiZml4TG9jYXRpb25IYXNoIiwgImhhc2giLCAiaGlkZU5ld1VzZXJzTG9nIiwgIiRuZXdVc2Vyc0xvZyIsICJwcm9wIiwgImNoZWNrZWQiLCAiZGlzYWJsZWQiLCAidG9nZ2xlTGluayIsICJfJHRvZ2dsZXIkcGFyZW50JCIsICIkdG9nZ2xlciIsICJzdHlsZSIsICJjb2xvciIsICJjc3MiLCAiaW1wb3J0X2V4dF9nYWRnZXQ0IiwgInNraW4iLCAiZ2V0Q29udGVudCIsICJyZWZlcmVuY2UiLCAiX3JlZmVyZW5jZSRnZXRBdHRyaWJ1IiwgImdldEF0dHJpYnV0ZSIsICJ0ZXh0Q29udGVudCIsICJvbkNyZWF0ZUNhbGxiYWNrIiwgImluc3RhbmNlIiwgInNldEF0dHJpYnV0ZSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAib25TaG93Q2FsbGJhY2siLCAic2V0Q29udGVudCIsICJ0aXBweUZvckNpdGl6ZW5IZWFkZXIiLCAiX2l0ZXJhdG9yNSIsICJfc3RlcDUiLCAidGlwcHkiLCAiYXJyb3ciLCAiY29udGVudCIsICJwbGFjZW1lbnQiLCAib25DcmVhdGUiLCAib25IaWRkZW4iLCAib25TaG93IiwgInRpcHB5Rm9yRXh0ZW5zaW9uIiwgIl9yZWYzIiwgImRlcHJlY2F0ZWRGdW5jdGlvbnMiLCAibG9nIiwgImRlcHJlY2F0ZSIsICJhZGRTY3JpcHRUYWciLCAiYWRkTGlua1RhZyIsICJ3aWtpVXJsZW5jb2RlIiwgInJlYWR5IiwgImdldFNjcmlwdCIsICJ0aGVuIiwgInVybCIsICJpbXBvcnRfZXh0X2dhZGdldDUiLCAic2l0ZUNvbW1vbiIsICJjb25maWdLZXkiLCAic2V0IiwgImdldEJvZHkiXQp9Cg== diff --git a/src/SiteCommon_JS/SiteCommon_JS.ts b/src/SiteCommon_JS/SiteCommon_JS.ts index c49acb18c..4fe9a962e 100644 --- a/src/SiteCommon_JS/SiteCommon_JS.ts +++ b/src/SiteCommon_JS/SiteCommon_JS.ts @@ -4,7 +4,6 @@ import { hideNewUsersLog, highLightRev, loadWithURL, - noPermWarning, openSearchInNewTab, removeTitleFromPermalink, titleCleanUp, @@ -26,8 +25,7 @@ import {getBody} from 'ext.gadget.Util'; mw.config.set(configKey, true); // Core modules - loadWithURL(); - noPermWarning(); + void loadWithURL(); fixLocationHash(); void getBody().then(($body: JQuery): void => { @@ -37,7 +35,7 @@ import {getBody} from 'ext.gadget.Util'; removeTitleFromPermalink($body); openSearchInNewTab($body); titleCleanUp($body); - unihanPopup($body); + void unihanPopup($body); hideNewUsersLog($body); toggleLink($body); diff --git a/src/SiteCommon_JS/modules/core.tsx b/src/SiteCommon_JS/modules/core.tsx index 598d1ae0b..a13e6983f 100644 --- a/src/SiteCommon_JS/modules/core.tsx +++ b/src/SiteCommon_JS/modules/core.tsx @@ -1,9 +1,10 @@ import React from 'ext.gadget.React'; import {getMessage} from './i18n'; +import {uniqueArray} from 'ext.gadget.Util'; const {wgAction, wgCanonicalSpecialPageName, wgNamespaceNumber, wgPageName, wgScript, wgUserName} = mw.config.get(); -const loadWithURL = (): void => { +const loadWithURL = async (): Promise => { const URL_WITH_CSS: string | null = mw.util.getParamValue('withCSS'); const URL_WITH_JS: string | null = mw.util.getParamValue('withJS'); const URL_WITH_MODULE: string | null = mw.util.getParamValue('withModule'); @@ -24,10 +25,12 @@ const loadWithURL = (): void => { 'text/css' ); } - if (URL_WITH_JS && /^MediaWiki:[^#%&<=>]*\.js$/.test(URL_WITH_JS)) { + if (URL_WITH_JS || URL_WITH_MODULE) { // @ts-expect-error TS6133 // eslint-disable-next-line @typescript-eslint/no-unused-vars - void mw.loader.using('').then((require): void => { + const require = await mw.loader.using('ext.gadget.SiteCommon_JS'); + + if (URL_WITH_JS && /^MediaWiki:[^#%&<=>]*\.js$/.test(URL_WITH_JS)) { mw.loader.load( mw.util.getUrl(URL_WITH_JS, { action: 'raw', @@ -36,14 +39,12 @@ const loadWithURL = (): void => { smaxage: '3600', }) ); - }); - } - if (URL_WITH_MODULE && /^ext\.[^,|]+$/.test(URL_WITH_MODULE)) { - // @ts-expect-error TS6133 - // eslint-disable-next-line @typescript-eslint/no-unused-vars - void mw.loader.using(URL_WITH_MODULE).then((require): void => { - mw.loader.load(URL_WITH_MODULE); - }); + } + + if (URL_WITH_MODULE && /^((ext\.[^,|]+)[,|]?)+$/.test(URL_WITH_MODULE)) { + const modules = uniqueArray(URL_WITH_MODULE.split(/[,|]/)); + mw.loader.load(modules); + } } } /** @@ -57,94 +58,34 @@ const loadWithURL = (): void => { `^(?:MediaWiki:${wgUserNameExcaped ? `|User:${wgUserNameExcaped}/` : ''})[^&<>=%#]*\\.(js|css)$` ); const REGEX_EXT: RegExp = /^ext\.[^,]+$/; - const path: string = `${wgScript}?action=raw&ctype=text/`; - for (const useFile of URL_USE.split('|')) { + const path: string = wgScript; + const useFiles = URL_USE.split(/[,|]/); + for (const useFile of useFiles) { const name: string = useFile.toString().trim(); const what: string[] = REGEX_FILE.exec(name) ?? ['', '']; switch (what[1]) { - case 'js': + case 'css': + mw.loader.load(`${path}?action=raw&ctype=text/css&title=${encodeURIComponent(name)}`); + break; + case 'js': { // @ts-expect-error TS6133 // eslint-disable-next-line @typescript-eslint/no-unused-vars - void mw.loader.using('').then((require): void => { - mw.loader.load(`${path}javascript&title=${encodeURIComponent(name)}`); - }); - break; - case 'css': - mw.loader.load(`${path}css&title=${encodeURIComponent(name)}`); + const require = await mw.loader.using('ext.gadget.SiteCommon_JS'); + mw.loader.load(`${path}?action=raw&ctype=text/javascript&title=${encodeURIComponent(name)}`); break; + } default: if (REGEX_EXT.test(name)) { // @ts-expect-error TS6133 // eslint-disable-next-line @typescript-eslint/no-unused-vars - void mw.loader.using(name).then((require): void => { - mw.loader.load(name); - }); + const require = await mw.loader.using('ext.gadget.SiteCommon_JS'); + mw.loader.load(name); } } } } }; -const noPermWarning = (): void => { - /** - * Load warning(s) when user has no access to page - */ - const URL_NO_PERM: string | null = mw.util.getParamValue('noperm'); - if (!URL_NO_PERM) { - return; - } - - switch (URL_NO_PERM) { - case '0': - void mw.notify( - window.wgULS( - '因技术原因,您没有权限访问相关页面。若有疑问,请与求闻百科运营者联系。', - '因技術原因,您沒有權限訪問相關頁面。若有疑問,請與求聞百科運營者聯系。' - ), - {tag: 'noPerm', type: 'error'} - ); - break; - case '1': - void mw.notify( - window.wgULS( - '您没有权限访问相关页面。若您是资深编者,请与求闻百科技术团队联系,以获取权限。', - '您沒有權限訪問相關頁面。若您是資深編者,請與求聞百科技術團隊聯系,以獲取權限。' - ), - {tag: 'noPerm', type: 'error'} - ); - break; - case '2': - void mw.notify( - window.wgULS( - '您的网络环境存在风险,请登录后继续使用。若您没有求闻百科账号,请注册后登录。', - '您的網路環境存在風險,請登入後繼續使用。若您沒有求聞百科賬號,請注冊後登錄。' - ), - {tag: 'noPerm', type: 'warn'} - ); - break; - case '3': - void mw.notify( - window.wgULS( - '相关功能仅向注册用户开放,请登录后继续使用。若您没有求闻百科账号,请注册后登录。', - '相關功能僅向注冊用戶開放,請登入後繼續使用。若您沒有求聞百科賬號,請注冊後登錄。' - ), - {tag: 'noPerm', type: 'warn'} - ); - break; - default: - void mw.notify( - window.wgULS( - '您没有权限访问相关页面。若有疑问,请与求闻百科运营者联系。', - '您沒有權限訪問相關頁面。若有疑問,請與求聞百科運營者聯系。' - ), - {tag: 'noPerm', type: 'error'} - ); - } - - const newUrl: string = location.href.replace(/[?&]noperm=[0-9]+/, ''); - history.pushState({}, document.title, newUrl); -}; - const highLightRev = ($body: JQuery): void => { /** * Add highlight to revisions when using `&hilight=revid` or `&highlight=revid` @@ -241,7 +182,7 @@ const titleCleanUp = ($body: JQuery): void => { $firstHeading.text(replaceTitle(pageTitle)); }; -const unihanPopup = ($body: JQuery): void => { +const unihanPopup = async ($body: JQuery): Promise => { /** * Display title=(.*) of after them. * (beta test) @@ -251,6 +192,8 @@ const unihanPopup = ($body: JQuery): void => { return; } + await mw.loader.using('oojs-ui-core'); + for (const element of $body.find('attr, .inline-unihan')) { const $element: JQuery = $(element); @@ -259,17 +202,18 @@ const unihanPopup = ($body: JQuery): void => { continue; } - void mw.loader.using('oojs-ui-core').then((): void => { - const popup: OO.ui.PopupWidget = new OO.ui.PopupWidget({ - $content: $(

{title}

) as JQuery, - label: getMessage('Note'), - anchor: true, - head: true, - padded: true, - }); - $element.append(popup.$element).on('click', (): void => { - popup.toggle(); - }); + const popup: OO.ui.PopupWidget = new OO.ui.PopupWidget({ + $content: $(

{title}

) as JQuery, + label: getMessage('Note'), + anchor: true, + head: true, + padded: true, + }); + + $body.append(popup.$element); + + $element.on('click', (): void => { + popup.toggle(); }); } }; @@ -308,7 +252,6 @@ const toggleLink = ($body: JQuery): void => { export { loadWithURL, - noPermWarning, highLightRev, addTargetBlank, removeTitleFromPermalink,