MediaWiki:Gadget-Wikiplus-highlight.js:修订间差异

MediaWiki系统消息页面
(Git更新:([https://github.com/TopRealm/InterfaceCodes/commit/d15c45c7c00e01ff7cd2e46db820db46e53c27e5 d15c45c]) feat: add Wikiplus-highlight)
(Git commit 315405d: feat: sync upstream with Qiuwen)
 
(未显示2个用户的6个中间版本)
第1行: 第1行:
/**
/**
* SPDX-License-Identifier: GPL-3.0
* SPDX-License-Identifier: CC-BY-SA-4.0
* _addText: '{{Gadget Header|license=GPL-3.0}}'
* _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
*
*
* @base <https://github.com/bhsd-harry/Wikiplus-highlight/blob/main/main.js>
* @source {@link https://github.com/TopRealm/YsArchives-Gadgets/tree/master/src/Wikiplus-highlight}
* @license CC-BY-SA-4.0 {@link https://youshou.wiki/wiki/H:CC-BY-SA-4.0}
* @source <https://git.qiuwen.wiki/InterfaceAdmin/Gadgets/src/branch/master/src/Gadgets/Wikiplus>
* @author Bhsd <https://github.com/bhsd-harry>
* @author 机智的小鱼君 <https://github.com/Dragon-Fish>
* @dependency mediawiki.storage, mediawiki.Title, mediawiki.util
*/
*/
/**
/**
* +--------------------------------------------------------+
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* | === WARNING: GLOBAL GADGET FILE === |
* +--------------------------------------------------------+
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* | otherwise they will be lost. |
* +--------------------------------------------------------+
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Changes to this page may affect many users. |
* | Please discuss changes at talk page before editing. |
* | Please discuss changes by opening an issue before editing. |
* +--------------------------------------------------------+
* +------------------------------------------------------------+
*/
*/
/* <nowiki> */
/* <nowiki> */
/* Wikiplus-highlight:Wikiplus编辑器的CodeMirror语法高亮扩展 */
(async function wikiplusHighlight() {
if (mw.libs.wphl && mw.libs.wphl.version) {
return;
}
mw.libs.wphl = mw.libs.wphl || {}; // 开始加载
const version = '2.59.5';
const newAddon = 0;
/** @type {typeof mw.storage} */
const storage =
typeof mw.storage === 'object' && typeof mw.storage.getObject === 'function'
? mw.storage
: {
/** @override */
getObject(key) {
const json = localStorage.getItem(key);
if (json === false) {
return false;
}
try {
return JSON.parse(json);
} catch {
return null;
}
},
/** @override */
setObject(key, value) {
try {
return localStorage.setItem(key, JSON.stringify(value));
} catch {
return false;
}
},
};
Object.fromEntries =
Object.fromEntries ||
((entries) => {
const /** @type {Record<string, T>} */ obj = {};
for (const [key, value] of entries) {
obj[key] = value;
}
return obj;
});
/**
* 解析版本号
*
* @param {string} str 版本号
*/
const getVersion = (str = version) => str.split('.').map(Number);
/**
* 比较版本号
*
* @param {string} a 版本号1
* @param {string} b 版本号2
* @return {boolean} `a`的版本号是否小于`b`的版本号
*/
const cmpVersion = (a, b) => {
const [a0, a1] = getVersion(a);
const [b0, b1] = getVersion(b);
return a0 < b0 || (a0 === b0 && a1 < b1);
};
/**
* 获取I18N消息
*
* @param {string} key 消息键,省略`wphl-`前缀
* @param {string[]} args 替换`$1`等的参数
*/
const msg = (key, ...args) => mw.msg(`wphl-${key}`, ...args);
/**
* 生成JQuery的I18N消息
*
* @param {string[]} args 替换`$1`等的参数
*/
const htmlMsg = (...args) => $($.parseHTML(msg(...args)));
/**
* 提示消息
*
* @param {string[]} args 替换`$1`等的参数
*/
const notify =
(...args) =>
() => {
const $p = $('<p>').html(msg(...args));
mw.notify($p, {type: 'success', autoHideSeconds: 'long', tag: 'wikiplus-highlight'});
return $p;
};
// 插件和I18N依主版本号
const majorVersion = getVersion().slice(0, 2).join('.');
// 路径
const CDN = '//fastly.jsdelivr.net';
const CM_CDN = 'npm/codemirror@5.65.3';
const MW_CDN = 'gh/bhsd-harry/codemirror-mediawiki@1.1.10';
const PARSER_CDN = 'npm/wikiparser-node@0.11.0-b';
const REPO_CDN = `npm/wikiplus-highlight@${majorVersion}`;


const {
(() => {

config: {
"use strict";
values: {

wgPageName: page,
// dist/Wikiplus-highlight/Wikiplus-highlight.js
wgNamespaceNumber: ns,
function _createForOfIteratorHelper(r, e) {
wgPageContentModel: contentmodel,
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
wgServer: server,
if (!t) {
wgScriptPath: scriptPath,
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
wgUserLanguage: userLang,
t && (r = t);
skin,
var n = 0, F = function() {
},
};
},
return { s: F, n: function() {
} = mw;
return n >= r.length ? { done: true } : { done: false, value: r[n++] };
// 和本地缓存有关的常数
}, e: function(r2) {
const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null;
throw r2;
const /** @type {Record<string, {time: number, config: mwConfig}>} */ ALL_SETTINGS_CACHE =
}, f: F };
storage.getObject('InPageEditMwConfig') || {};
}
const SITE_ID = `${server}${scriptPath}`;
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
const /** @type {{time: number, config: mwConfig}} */ SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {};
}
const EXPIRED = !(SITE_SETTINGS.time > Date.now() - 86400 * 1000 * 30);
var o, a = true, u = false;
const /** @type {Record<string, string>} */ CONTENTMODEL = {
return { s: function() {
css: 'css',
t = t.call(r);
'sanitized-css': 'css',
}, n: function() {
javascript: 'javascript',
var r2 = t.next();
json: 'javascript',
return a = r2.done, r2;
wikitext: 'mediawiki',
}, e: function(r2) {
};
u = true, o = r2;
const MODE_LIST = USING_LOCAL
}, f: function() {
? {
try {
lib: 'ext.CodeMirror.lib',
a || null == t.return || t.return();
css: 'ext.CodeMirror.lib.mode.css',
} finally {
javascript: 'ext.CodeMirror.lib.mode.javascript',
if (u) throw o;
lua: `${CM_CDN}/mode/lua/lua.min.js`,
}
mediawiki: EXPIRED ? 'ext.CodeMirror.data' : [],
} };
htmlmixed: 'ext.CodeMirror.lib.mode.htmlmixed',
}
xml: [],
function _unsupportedIterableToArray(r, a) {
}
if (r) {
: {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
lib: `${CM_CDN}/lib/codemirror.min.js`,
var t = {}.toString.call(r).slice(8, -1);
css: `${CM_CDN}/mode/css/css.min.js`,
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
javascript: `${CM_CDN}/mode/javascript/javascript.min.js`,
}
lua: `${CM_CDN}/mode/lua/lua.min.js`,
}
mediawiki: [],
function _arrayLikeToArray(r, a) {
htmlmixed: `${CM_CDN}/mode/htmlmixed/htmlmixed.min.js`,
(null == a || a > r.length) && (a = r.length);
xml: `${CM_CDN}/mode/xml/xml.min.js`,
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
};
return n;
const ADDON_LIST = {
}
searchcursor: `${CM_CDN}/addon/search/searchcursor.min.js`,
function asyncGeneratorStep(n, t, e, r, o, a, c) {
search: `${REPO_CDN}/search.min.js`,
try {
markSelection: `${CM_CDN}/addon/selection/mark-selection.min.js`,
var i = n[a](c), u = i.value;
activeLine: `${CM_CDN}/addon/selection/active-line.min.js`,
} catch (n2) {
trailingspace: `${CM_CDN}/addon/edit/trailingspace.min.js`,
return void e(n2);
matchBrackets: `${CM_CDN}/addon/edit/matchbrackets.min.js`,
}
closeBrackets: `${CM_CDN}/addon/edit/closebrackets.min.js`,
i.done ? t(u) : Promise.resolve(u).then(r, o);
matchTags: `${REPO_CDN}/matchtags.min.js`,
}
fold: `${REPO_CDN}/fold.min.js`,
function _asyncToGenerator(n) {
wikiEditor: 'ext.wikiEditor',
return function() {
contextmenu: 'mediawiki.Title',
var t = this, e = arguments;
lint: `${CM_CDN}/addon/lint/lint.min.js`,
return new Promise(function(r, o) {
annotateScrollbar: `${CM_CDN}/addon/scroll/annotatescrollbar.min.js`,
var a = n.apply(t, e);
parser: `${PARSER_CDN}/extensions/base.min.js`,
function _next(n2) {
lintWikitext: `${REPO_CDN}/lint.min.js`,
asyncGeneratorStep(a, r, o, _next, _throw, "next", n2);
};
}
const /** @type {addon[]} */ options = [
function _throw(n2) {
{
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n2);
option: 'styleSelectedText',
}
addon: 'search',
_next(void 0);
download: 'markSelection',
});
only: true,
};
/** @implements */ complex: () => !addons.has('wikiEditor'),
}
},
var __getOwnPropNames = Object.getOwnPropertyNames;
{option: 'styleActiveLine', addon: 'activeLine'},
var __esm = (fn, res) => function __init() {
{option: 'showTrailingSpace', addon: 'trailingspace'},
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
{
};
option: 'matchBrackets',
//! src/Wikiplus-highlight/modules/highlight.ts
/** @implements */ complex: (mode, json) =>
var highlight_exports = {};
mode === 'mediawiki' || json ? {bracketRegex: /[{}[\]]/u} : true,
var import_ext_gadget2;
},
var init_highlight = __esm({
{
"src/Wikiplus-highlight/modules/highlight.ts"() {
option: 'autoCloseBrackets',
"use strict";
addon: 'closeBrackets',
import_ext_gadget2 = require("ext.gadget.Util");
/** @implements */ complex: (mode, json) => (mode === 'mediawiki' || json ? '()[]{}""' : true),
/**
},
* @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展
{option: 'matchTags', addon: ['matchTags', 'fold'], modes: new Set(['mediawiki', 'widget'])},
* @author Bhsd <https://github.com/bhsd-harry>
{option: 'fold', modes: new Set(['mediawiki', 'widget'])},
* @license GPL-3.0
];
*/
const defaultAddons = ['search'];
((_window) => {
const defaultIndent = 4;
const {
const /** @type {Set<string>} */ addons = new Set(storage.getObject('Wikiplus-highlight-addons') || defaultAddons);
libs
let /** @type {number} */ indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent;
} = mw, {
/** @type {Record<string, string>} */
wphl
const entity = {'"': 'quot', "'": 'apos', '<': 'lt', '>': 'gt', '&': 'amp', ' ': 'nbsp'};
} = libs;
const /** @type {(func: (str: string) => string) => (doc: CodeMirror.Editor) => void} */
if (wphl !== null && wphl !== void 0 && wphl.version) {
convert = (func) => (doc) => {
return;
doc.replaceSelections(
}
doc.getSelections().map((selection) => selection.split('\n').map(func).join('\n')),
const version = "3.0.7";
'around'
libs["wphl"] = {
);
version,
};
cmVersion: "2.9",
const escapeHTML = convert((str) =>
...wphl
[...str]
};
.map((c) => {
const CDN = "//testingcf.jsdelivr.net", MW_CDN = "npm/@bhsd/codemirror-mediawiki@".concat(libs["wphl"].cmVersion || "latest", "/dist/mw.min.js"), REPO_CDN = "npm/wikiplus-highlight";
if (c in entity) {
(_window = window).CodeMirror6 || (_window.CodeMirror6 = new Promise((resolve) => {
return `&${entity[c]};`;
const script = document.createElement("script");
}
script.addEventListener("load", () => {
const code = c.codePointAt();
resolve(CodeMirror6);
return code < 256 ? `&#${code};` : `&#x${code.toString(16)};`;
});
})
script.type = "module";
.join('')
script.src = "".concat(CDN, "/").concat(MW_CDN);
);
document.head.append(script);
const escapeURI = convert((str) => {
}));
if (str.includes('%')) {
const {
try {
wgPageName: page,
return decodeURIComponent(str);
wgNamespaceNumber: ns,
} catch {}
wgPageContentModel: contentmodel
}
} = mw.config.get();
return encodeURIComponent(str);
const CONTENTMODELS = {
});
"sanitized-css": "css",
const escapeHash = convert((str) => {
wikitext: "mediawiki"
try {
}, EXTS = {
return decodeURIComponent(str.replace(/\.([\da-f]{2})/giu, '%$1'));
css: "css",
} catch {
js: "javascript",
return str;
json: "json"
}
}, NAMESPACES = {
});
828: "lua",
const /** @type {(cm: typeof CodeMirror) => boolean} */ isPc = ({keyMap}) => keyMap.default === keyMap.pcDefault;
274: "html"
const /** @type {(cm: typeof CodeMirror) => Record<string, (doc: CodeMirror.Editor) => void} */ extraKeys = (
};
CM
const getObject = (key) => {
) => {
return JSON.parse(String(localStorage.getItem(key)));
const ctrl = isPc(CM) ? 'Ctrl' : 'Cmd';
};
return {[`${ctrl}-/`]: escapeHTML, [`${ctrl}-\\`]: escapeURI, [`Shift-${ctrl}-\\`]: escapeHash};
const getPageMode = /* @__PURE__ */ function() {
};
var _ref = _asyncToGenerator(function* (value) {
/**
if (typeof _WikiplusPages === "object") {
* contextMenu插件
const pages = Object.values(_WikiplusPages).filter(({
*
sectionCache
* @param {CodeMirror.Editor} doc CodeMirror编辑区
}) => {
* @param {string} mode 高亮模式
return Object.values(sectionCache).includes(value);
*/
});
const handleContextMenu = (doc, mode) => {
if (pages.some(({
if ((mode !== 'mediawiki' && mode !== 'widget') || !addons.has('contextmenu')) {
title
return;
}) => {
}
return !title.endsWith("/doc");
const $wrapper = $(doc.getWrapperElement()).addClass('CodeMirror-contextmenu');
})) {
const {
yield mw.loader.using("mediawiki.Title");
functionSynonyms: [synonyms],
}
} = mw.config.get('extCodeMirrorConfig') || {
const modes = (0, import_ext_gadget2.uniqueArray)(
functionSynonyms: [{invoke: 'invoke', 调用: 'invoke', widget: 'widget', 小工具: 'widget'}],
// Replace `new Set()` to avoid polyfilling core-js
};
pages.map(({
/**
title
* 生成别名映射表
}) => {
*
var _t$getExtension;
* @param {string} str 别名
if (title.endsWith("/doc")) {
*/
return "template";
const getSysnonyms = (str) =>
}
new Set(
const t = new mw.Title(title), namespace = t.getNamespaceId();
Object.keys(synonyms)
if (namespace % 2) {
.filter((key) => synonyms[key] === str)
return "mediawiki";
.map((key) => (key.startsWith('#') ? key : `#${key}`))
}
);
const mode = EXTS[((_t$getExtension = t.getExtension()) === null || _t$getExtension === void 0 ? void 0 : _t$getExtension.toLowerCase()) || ""] || NAMESPACES[namespace];
const invoke = getSysnonyms('invoke');
if (mode) {
const widget = getSysnonyms('widget');
return mode === "javascript" && (namespace === 8 || namespace === 2300) ? "gadget" : mode;
$wrapper.on('contextmenu', ({pageX, pageY}) => {
}
const pos = doc.coordsChar({left: pageX, top: pageY});
return namespace === 10 || namespace === 2 ? "template" : "mediawiki";
const {line, ch} = pos;
})
const curType = doc.getTokenTypeAt(pos);
);
if (!/\bmw-(?:template-name|parserfunction)\b/u.test(curType)) {
if (modes.length === 1) {
return undefined;
const [mode] = modes;
}
if (mode === "gadget") {
const tokens = doc.getLineTokens(line);
return ["javascript", 8];
for (let i = tokens.length - 1; i > 0; i--) {
}
const {type, end, string} = tokens[i];
return mode === "template" ? ["mediawiki", 10] : [mode];
if (tokens[i - 1].type === type) {
} else if (modes.length === 2) {
tokens[i - 1].end = end;
if (modes.includes("javascript") && modes.includes("gadget")) {
tokens[i - 1].string += string;
return ["javascript"];
tokens.splice(i, 1);
} else if (modes.includes("mediawiki") && modes.includes("template")) {
}
return ["mediawiki"];
}
}
const index = tokens.findIndex(({start, end}) => start < ch && end >= ch);
}
const text = tokens[index].string
}
.replace(/\u200E/gu, '')
if (ns !== 274 && contentmodel !== "Scribunto" || page.endsWith("/doc")) {
.replace(/_/gu, ' ')
return [CONTENTMODELS[contentmodel] || contentmodel, contentmodel === "javascript" ? ns : void 0];
.trim();
}
if (/\bmw-template-name\b/u.test(curType)) {
yield mw.loader.using("oojs-ui-windows");
const title = new mw.Title(text);
if (yield OO.ui.confirm(mw.msg("cm-mw-contentmodel"), {
if (title.namespace !== 0 || text.startsWith(':')) {
actions: [{
open(title.getUrl(), '_blank');
label: ns === 274 ? "Widget" : "Lua"
} else {
}, {
open(mw.util.getUrl(`Template:${text}`), '_blank');
label: "Wikitext",
}
action: "accept"
return false;
}]
} else if (
})) {
index < 2 ||
return ["mediawiki"];
!/\bmw-parserfunction-delimiter\b/u.test(tokens[index - 1].type) ||
}
!/\bmw-parserfunction-name\b/u.test(tokens[index - 2].type)
return [ns === 274 ? "html" : "lua"];
) {
});
return undefined;
return function getPageMode2(_x) {
}
return _ref.apply(this, arguments);
const parserFunction = tokens[index - 2].string.trim().toLowerCase();
};
if (invoke.has(parserFunction)) {
}();
open(mw.util.getUrl(`Module:${text}`), '_blank');
const renderEditor = /* @__PURE__ */ function() {
} else if (widget.has(parserFunction)) {
var _ref2 = _asyncToGenerator(function* ($target, setting) {
open(mw.util.getUrl(`Widget:${text}`, {action: 'edit'}), '_blank');
const cm = yield (yield CodeMirror6).fromTextArea($target[0], ...setting ? ["json"] : yield getPageMode($target.val()));
} else {
if (cm.view) {
return undefined;
cm.view.dom.id = "Wikiplus-CodeMirror";
}
}
return false;
document.querySelector("#Wikiplus-Quickedit-Jump > a").href = "#Wikiplus-CodeMirror";
});
if (!setting) {
};
const settings = getObject("Wikiplus_Settings"), escToExitQuickEdit = settings && (settings["esc_to_exit_quickedit"] || settings["escToExitQuickEdit"]), submit = (
const /** @type {Record<string, string>} */ i18n = storage.getObject('Wikiplus-highlight-i18n') || {};
/** 提交编辑 @return true */
let /** @type {() => JQuery<HTMLElement>} */ welcome;
() => {
if (!i18n['wphl-version']) {
document.querySelector("#Wikiplus-Quickedit-Submit").dispatchEvent(new MouseEvent("click"));
// 首次安装
return true;
welcome = notify('welcome');
}
} else if (cmpVersion(i18n['wphl-version'], version)) {
), submitMinor = (
// 更新版本
/** 提交小编辑 */
welcome = notify(`welcome-${newAddon ? 'new-addon' : 'upgrade'}`, version, newAddon);
() => {
}
document.querySelector("#Wikiplus-Quickedit-MinorEdit").checked = true;
const /** @type {Record<string, string>} */ i18nLanguages = {
return submit();
zh: 'zh-hans',
}
'zh-hans': 'zh-hans',
), escapeEdit = (
'zh-cn': 'zh-hans',
/** 按下Esc键退出编辑 */
'zh-my': 'zh-hans',
() => {
'zh-sg': 'zh-hans',
document.querySelector("#Wikiplus-Quickedit-Back").dispatchEvent(new MouseEvent("click"));
'zh-hant': 'zh-hant',
return true;
'zh-tw': 'zh-hant',
}
'zh-hk': 'zh-hant',
);
'zh-mo': 'zh-hant',
cm.extraKeys([{
ka: 'ka',
key: "Mod-S",
};
run: submit
const i18nLang = i18nLanguages[userLang] || 'en';
}, {
const I18N_CDN = `${CDN}/${REPO_CDN}/i18n/${i18nLang}.json`;
key: "Shift-Mod-S",
const isLatest = i18n['wphl-version'] === majorVersion;
run: submitMinor
/** 加载 I18N */
}, ...escToExitQuickEdit === true || escToExitQuickEdit === "true" ? [{
const setI18N = async () => {
key: "Esc",
if (!isLatest || i18n['wphl-lang'] !== i18nLang) {
run: escapeEdit
Object.assign(
}] : []]);
i18n,
}
await $.ajax(`${I18N_CDN}`, {
const oldKey = "Wikiplus-highlight-addons", oldPrefs = getObject(oldKey), mapping = {
dataType: 'json',
activeLine: "highlightActiveLine",
cache: true,
trailingspace: "highlightTrailingWhitespace",
})
matchBrackets: "bracketMatching",
);
closeBrackets: "closeBrackets",
storage.setObject('Wikiplus-highlight-i18n', i18n);
matchTags: "tagMatching",
}
fold: "codeFolding",
mw.messages.set(i18n);
wikiEditor: "wikiEditor",
};
escape: "escape",
const i18nPromise = Promise.all([
contextmenu: "openLinks",
// 提前加载I18N
lint: "lint"
mw.loader.using('mediawiki.util'),
};
setI18N(),
localStorage.removeItem(oldKey);
]);
if (oldPrefs) {
/**
const obj = {};
* 下载MW扩展脚本
var _iterator = _createForOfIteratorHelper(oldPrefs), _step;
*
try {
* @param {string[]} exts CodeMirror扩展模块
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
*/
const k = _step.value;
const getInternalScript = (exts) => (exts.length > 0 ? mw.loader.using(exts) : Promise.resolve());
if (k in mapping) {
/**
obj[mapping[k]] = true;
* 下载外部脚本
}
*
}
* @param {string[]} urls CodeMirror脚本网址
} catch (err) {
*/
_iterator.e(err);
const getExternalScript = (urls) =>
} finally {
urls.length > 0
_iterator.f();
? $.ajax(`${CDN}/${urls.length > 1 ? 'combine/' : ''}${urls.join()}`, {dataType: 'script', cache: true})
}
: Promise.resolve();
cm.prefer(obj);
/**
}
* 下载脚本
});
*
return function renderEditor2(_x2, _x3) {
* @param {string[]} urls 脚本路径
return _ref2.apply(this, arguments);
* @param {boolean|undefined} local 是否先从本地下载
};
*/
}();
const getScript = async (urls, local) => {
const internal = urls.filter((url) => !url.includes('/'));
const observer = new MutationObserver((records) => {
const $editArea = $(records.flatMap(({
const external = urls.filter((url) => url.includes('/'));
addedNodes
if (local === true) {
}) => {
await getInternalScript(internal);
return [...addedNodes];
return getExternalScript(external);
})).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");
} else if (local === false) {
if ($editArea.length > 0) {
await getExternalScript(external);
void renderEditor($editArea, $editArea.attr("id") === "Wikiplus-Setting-Input");
return getInternalScript(internal);
}
}
});
return Promise.all([getInternalScript(internal), getExternalScript(external)]);
observer.observe(document.body, {
};
childList: true
// 以下进入CodeMirror相关内容
});
let /** @type {CodeMirror.EditorFromTextArea} */ cm;
mw.loader.load("".concat(CDN, "/").concat(REPO_CDN, "@").concat(version, "/styles.min.css"), "text/css");
/**
})();
* 生成需要的插件列表
*
}
});
* @param {typeof CodeMirror} CM CodeMirror
//! src/Wikiplus-highlight/modules/api.ts
* @param {boolean} other 是否用于Wikiplus以外的textarea
var import_ext_gadget = require("ext.gadget.Util");
*/
var api = (0, import_ext_gadget.initMwApi)("Wikiplus-highlight/2.0");
const getAddonScript = (CM, other = false) => {
//! src/Wikiplus-highlight/modules/checkDependencies.ts
const /** @type {string[]} */ addonScript = [];
var checkDependencies = /* @__PURE__ */ function() {
for (const {option, addon = option, download = Array.isArray(addon) ? option : addon, only} of options) {
var _ref3 = _asyncToGenerator(function* () {
if (!(only && other) && !(option in CM.optionHandlers) && intersect(addon, addons)) {
if (!mw.user.options.get("gadget-Wikiplus")) {
addonScript.push(ADDON_LIST[download]);
void api.postWithEditToken({
}
action: "options",
}
change: "gadget-Wikiplus=1"
return addonScript;
};
});
yield mw.loader.using("ext.gadget.Wikiplus");
/**
}
* 交集
});
*
return function checkDependencies2() {
* @param {T[]|T} arr 集合1(可重)
return _ref3.apply(this, arguments);
* @param {Set<T>} set 集合2
};
* @template T
}();
*/
//! src/Wikiplus-highlight/Wikiplus-highlight.ts
const intersect = (arr, set) => (Array.isArray(arr) ? arr.some((ele) => set.has(ele)) : set.has(arr));
(function() {
/**
var _WikiplusHighlight = _asyncToGenerator(function* () {
* 根据文本的高亮模式加载依赖项
void checkDependencies();
*
const {
* @param {string} type 高亮模式
wgAction,
*/
wgIsArticle
const initMode = (type) => {
} = mw.config.get();
let /** @type {string[]} */ scripts = [];
if (wgAction !== "view" || !wgIsArticle) {
const loaded = typeof window.CodeMirror === 'function';
return;
/**
}
* 代替`CodeMirror`的局部变量
const {
*
"visualeditor-enable": isVeEnable
* @type {typeof CodeMirror}
} = mw.user.options.get();
*/
if (isVeEnable) {
const CM = loaded
yield mw.loader.using("ext.visualEditor.core");
? window.CodeMirror
}
: {modes: {}, prototype: {}, commands: {}, optionHandlers: {}, helpers: {}};
if (!("ontouchstart" in document)) {
// lib
yield Promise.resolve().then(() => (init_highlight(), highlight_exports));
if (!loaded) {
}
scripts.push(MODE_LIST.lib);
});
if (!USING_LOCAL) {
function WikiplusHighlight() {
mw.loader.load(`${CDN}/${CM_CDN}/lib/codemirror.min.css`, 'text/css');
return _WikiplusHighlight.apply(this, arguments);
}
}
}
return WikiplusHighlight;
// modes
})()();
if (type === 'mediawiki' && SITE_SETTINGS.config && SITE_SETTINGS.config.tags.html) {
// NamespaceHTML扩展自由度过高,所以这里一律当作允许<html>标签
type = 'html';
}
if ((type === 'mediawiki' || type === 'widget') && !CM.modes.mediawiki) {
// 总是外部样式表和外部脚本
mw.loader.load(`${CDN}/${MW_CDN}/mediawiki.min.css`, 'text/css');
scripts.push(`${MW_CDN}/mediawiki.min.js`);
}
if (type === 'widget' || type === 'html') {
for (const lang of ['css', 'javascript', 'mediawiki', 'htmlmixed', 'xml']) {
if (!CM.modes[lang]) {
scripts = scripts.concat(MODE_LIST[lang]);
}
}
} else {
scripts = scripts.concat(MODE_LIST[type]);
}
// addons
if (!CM.prototype.getSearchCursor && addons.has('search') && !addons.has('wikiEditor')) {
scripts.push(ADDON_LIST.searchcursor);
}
if (!CM.prototype.annotateScrollbar && type === 'mediawiki' && addons.has('lint')) {
scripts.push(ADDON_LIST.annotateScrollbar);
}
if (!CM.commands.find && addons.has('search') && !addons.has('wikiEditor')) {
scripts.push(ADDON_LIST.search);
}
if (!window.wikiparse && type === 'mediawiki' && addons.has('lint')) {
scripts.push(ADDON_LIST.parser);
}
if (!CM.optionHandlers.lint && type === 'mediawiki' && addons.has('lint')) {
mw.loader.load(`${CDN}/${CM_CDN}/addon/lint/lint.min.css`, 'text/css');
scripts.push(ADDON_LIST.lint);
}
if (!(CM.helpers.lint && CM.helpers.lint.mediawiki) && type === 'mediawiki' && addons.has('lint')) {
scripts.push(ADDON_LIST.lintWikitext);
}
if (addons.has('wikiEditor')) {
const state = mw.loader.getState('ext.wikiEditor');
if (!state) {
addons.delete('wikiEditor');
} else if (state !== 'ready') {
scripts.push(ADDON_LIST.wikiEditor);
}
}
if (mw.loader.getState('mediawiki.Title') !== 'ready' && addons.has('contextmenu')) {
scripts.push(ADDON_LIST.contextmenu);
}
scripts.push(...getAddonScript(CM));
return getScript(scripts, loaded ? undefined : USING_LOCAL);
};
/**
* 更新缓存的设置数据
*
* @param {mwConfig} config wikitext设置
*/
const updateCachedConfig = (config) => {
ALL_SETTINGS_CACHE[SITE_ID] = {config, time: Date.now()};
storage.setObject('InPageEditMwConfig', ALL_SETTINGS_CACHE);
};
/**
* 展开别名列表
*
* @param {{aliases: string[], name: string}[]} words 原名
*/
const getAliases = (words) => words.flatMap(({aliases, name}) => aliases.map((alias) => ({alias, name})));
/**
* 将别名信息转换为CodeMirror接受的设置
*
* @param {{alias: string, name: string}[]} aliases 别名
* @return {Record<string, string>}
*/
const getConfig = (aliases) => Object.fromEntries(aliases.map(({alias, name}) => [alias.replace(/:$/u, ''), name]));
/**
* 高亮扩展标签内部
*
* @param {mwConfig} config 设置
*/
const setPlainMode = (config) => {
const tags = ['indicator', 'poem', 'ref', 'tabs', 'tab', 'poll'];
for (const tag of tags) {
if (config.tags[tag]) {
config.tagModes[tag] = 'text/mediawiki';
}
}
};
/**
* 加载CodeMirror的mediawiki模块需要的设置数据
*
* @param {string} type 高亮模式
* @param {Promise<void>} initModePromise 使用本地CodeMirror扩展时大部分数据来自ext.CodeMirror.data模块
*/
const getMwConfig = async (type, initModePromise) => {
if (type !== 'mediawiki' && type !== 'widget') {
return undefined;
}
if (USING_LOCAL && EXPIRED) {
// 只在localStorage过期时才会重新加载ext.CodeMirror.data
await initModePromise;
}
let config = mw.config.get('extCodeMirrorConfig');
if (!config && !EXPIRED && isLatest) {
({config} = SITE_SETTINGS);
setPlainMode(config);
mw.config.set('extCodeMirrorConfig', config);
}
const isIPE = config && Object.values(config.functionSynonyms[0]).includes(true);
// 情形1:config已更新,可能来自localStorage
if (config && config.redirect && config.img && config.variants && !isIPE) {
return config;
}
// 以下情形均需要发送API请求
// 情形2:localStorage未过期但不包含新设置
// 情形3:新加载的 ext.CodeMirror.data
// 情形4:`config === null`
const {
query: {
general: {variants},
magicwords,
extensiontags,
functionhooks,
variables,
},
} = await new mw.Api({
ajax: {
headers: {
'Api-User-Agent': `Qiuwen/1.1 (Wikiplus-highlight/${version}; ${mw.config.get('wgWikiID')})`,
},
},
}).get({
meta: 'siteinfo',
siprop: `general|magicwords${config && !isIPE ? '' : '|extensiontags|functionhooks|variables'}`,
formatversion: 2,
});
const otherMagicwords = new Set(['msg', 'raw', 'msgnw', 'subst', 'safesubst']);
if (config && !isIPE) {
// 情形2或3
const {
functionSynonyms: [insensitive],
} = config;
if (!insensitive.subst) {
const aliases = getAliases(magicwords.filter(({name}) => otherMagicwords.has(name)));
for (const {alias, name} of aliases) {
insensitive[alias.replace(/:$/u, '')] = name;
}
}
} else {
// 情形4:`config === null`
config = {
tagModes: {
pre: 'mw-tag-pre',
nowiki: 'mw-tag-nowiki',
ref: 'text/mediawiki',
},
tags: Object.fromEntries(extensiontags.map((tag) => [tag.slice(1, -1), true])),
urlProtocols: mw.config.get('wgUrlProtocols'),
};
const realMagicwords = new Set([...functionhooks, ...variables, ...otherMagicwords]);
const allMagicwords = magicwords.filter(
({name, aliases}) => aliases.some((alias) => /^__.+__$/u.test(alias)) || realMagicwords.has(name)
);
const sensitive = getAliases(allMagicwords.filter((word) => word['case-sensitive']));
const insensitive = getAliases(allMagicwords.filter((word) => !word['case-sensitive'])).map(
({alias, name}) => ({alias: alias.toLowerCase(), name})
);
config.doubleUnderscore = [
getConfig(insensitive.filter(({alias}) => /^__.+__$/u.test(alias))),
getConfig(sensitive.filter(({alias}) => /^__.+__$/u.test(alias))),
];
config.functionSynonyms = [
getConfig(insensitive.filter(({alias}) => !/^__.+__|^#$/u.test(alias))),
getConfig(sensitive.filter(({alias}) => !/^__.+__|^#$/u.test(alias))),
];
}
config.redirect = magicwords.find(({name}) => name === 'redirect').aliases;
config.img = getConfig(getAliases(magicwords.filter(({name}) => name.startsWith('img_'))));
config.variants = variants ? variants.map(({code}) => code) : [];
setPlainMode(config);
mw.config.set('extCodeMirrorConfig', config);
updateCachedConfig(config);
return config;
};
/** 检查页面语言类型 */
const getPageMode = async () => {
if (page.endsWith('/doc')) {
return 'mediawiki';
} else if (ns !== 274 && ns !== 828) {
return CONTENTMODEL[contentmodel];
}
const pageMode = ns === 274 ? 'Widget' : 'Lua';
await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);
const bool = await OO.ui.confirm(msg('contentmodel'), {
actions: [{label: pageMode}, {label: 'Wikitext', action: 'accept'}],
});
return bool ? 'mediawiki' : pageMode.toLowerCase();
};
/**
* jQuery.textSelection overrides for CodeMirror.
* See jQuery.textSelection.js for method documentation
*/
const cmTextSelection = {
/** @override */ getContents() {
return cm.getValue();
},
/** @override */ setContents(content) {
cm.setValue(content);
return this;
},
/** @override */ getSelection() {
return cm.getSelection();
},
/** @override */ setSelection(option) {
cm.setSelection(cm.posFromIndex(option.start), 'end' in option ? cm.posFromIndex(option.end) : undefined);
cm.focus();
return this;
},
/** @override */ replaceSelection(value) {
cm.replaceSelection(value);
return this;
},
/** @override */ getCaretPosition(option) {
const caretPos = cm.indexFromPos(cm.getCursor('from'));
const endPos = cm.indexFromPos(cm.getCursor('to'));
return option.startAndEnd ? [caretPos, endPos] : caretPos;
},
/** @override */ scrollToCaretPosition() {
cm.scrollIntoView();
return this;
},
};


/**
* 渲染编辑器
*
* @param {JQuery<HTMLTextAreaElement>} $target 目标编辑框
* @param {boolean} setting 是否是Wikiplus设置(使用json语法)
*/
const renderEditor = async ($target, setting) => {
const mode = setting ? 'javascript' : await getPageMode();
const initModePromise = initMode(mode);
const [mwConfig] = await Promise.all([getMwConfig(mode, initModePromise), initModePromise]);
if (!setting && addons.has('wikiEditor')) {
try {
if (typeof mw.addWikiEditor === 'function') {
mw.addWikiEditor($target);
} else {
const {
wikiEditor: {
modules: {
dialogs: {config},
},
},
} = $;
$target.wikiEditor('addModule', {
...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),
...config.getDefaultConfig(),
});
config.replaceIcons($target);
}
} catch (error) {
addons.delete('wikiEditor');
mw.notify('WikiEditor工具栏加载失败。', {type: 'error', tag: 'wikiplus-highlight'});
console.error(error);
}
}
if (mode === 'mediawiki' && mwConfig.tags.html) {
mwConfig.tagModes.html = 'htmlmixed';
await initMode('html'); // 若已经缓存过`mwConfig`,这一步什么都不会发生
} else if (mode === 'widget' && !CodeMirror.mimeModes.widget) {
// 到这里CodeMirror已确定加载完毕
CodeMirror.defineMIME('widget', {name: 'htmlmixed', tags: {noinclude: [[null, null, 'mediawiki']]}});
}
// 储存初始高度
const height = $target.height();
if (cm) {
cm.toTextArea();
}
const json = setting || contentmodel === 'json';
cm = CodeMirror.fromTextArea(
$target[0],
$.extend(
{
inputStyle: 'contenteditable',
lineNumbers: !/Android\b/u.test(navigator.userAgent),
lineWrapping: true,
mode,
mwConfig,
json,
},
Object.fromEntries(
options.map(({option, addon = option, modes, complex = (mod) => !modes || modes.has(mod)}) => {
const mainAddon = Array.isArray(addon) ? addon[0] : addon;
return [option, addons.has(mainAddon) && complex(mode, json)];
})
),
mode === 'mediawiki'
? {
extraKeys: addons.has('escape') && extraKeys(CodeMirror),
}
: {
indentUnit: addons.has('indentWithSpace') ? indent : defaultIndent,
indentWithTabs: !addons.has('indentWithSpace'),
}
)
);
cm.setSize(null, height);
cm.getWrapperElement().id = 'Wikiplus-CodeMirror';
if ($.fn.textSelection) {
$target.textSelection('register', cmTextSelection);
}
const ctrl = isPc(CodeMirror) ? 'Ctrl' : 'Cmd';
if (addons.has('wikiEditor')) {
const context = $target.data('wikiEditorContext');
cm.addKeyMap({
/** 替代CodeMirror的搜索功能 */ [`${ctrl}-F`]() {
$.wikiEditor.modules.dialogs.api.openDialog(context, 'search-and-replace');
},
});
}
handleContextMenu(cm, mode);
$('#Wikiplus-Quickedit-Jump').children('a').attr('href', '#Wikiplus-CodeMirror');
if (!setting) {
// 普通Wikiplus编辑区
const settings = storage.getObject('Wikiplus_Settings');
const escToExitQuickEdit = (settings && settings.esc_to_exit_quickedit) || settings.escToExitQuickEdit;
const submit = /** 提交编辑 */ () => {
$('#Wikiplus-Quickedit-Submit').triggerHandler('click');
};
const submitMinor = /** 提交小编辑 */ () => {
$('#Wikiplus-Quickedit-MinorEdit').trigger('click');
$('#Wikiplus-Quickedit-Submit').triggerHandler('click');
};
cm.addKeyMap(
$.extend(
{[`${ctrl}-S`]: submit, [`Shift-${ctrl}-S`]: submitMinor},
escToExitQuickEdit === true || escToExitQuickEdit === 'true'
? {
/** 按下Esc键退出编辑 */ Esc() {
$('#Wikiplus-Quickedit-Back').triggerHandler('click');
},
}
: {}
)
);
}
cm.refresh();
mw.hook('wiki-codemirror').fire(cm);
};
const {body} = document;
// 监视 Wikiplus 编辑框
const observer = new MutationObserver((records) => {
const $editArea = $(records.flatMap(({addedNodes}) => [...addedNodes])).find(
'#Wikiplus-Quickedit, #Wikiplus-Setting-Input'
);
if ($editArea.length > 0) {
renderEditor($editArea, $editArea.attr('id') === 'Wikiplus-Setting-Input');
}
});
observer.observe(body, {childList: true});
$(body).on(
'keydown.wphl',
'.ui-dialog',
/** @this {HTMLBodyElement} */
function (e) {
if (e.key === 'Escape') {
/** @type {{$textarea: JQuery<HTMLTextAreaElement>}} */
const context = $(this).children('.ui-dialog-content').data('context');
if (context && context.$textarea && context.$textarea.attr('id') === 'Wikiplus-Quickedit') {
e.stopPropagation();
}
}
}
);
/**
* 是否是Wikiplus编辑区
*
* @param {HTMLTextAreaElement} elem textarea元素
*/
const isWikiplus = (elem) => elem.id === 'Wikiplus-Quickedit' || elem.id === 'Wikiplus-Setting-Input';
$.valHooks.textarea = {
/** @override */ get(elem) {
return isWikiplus(elem) && cm ? cm.getValue() : elem.value;
},
/** @override */ set(elem, value) {
if (isWikiplus(elem) && cm) {
cm.setValue(value);
} else {
elem.value = value;
}
},
};
await i18nPromise; // 以下内容依赖I18N
// 设置对话框
let /** @type {OOUI.MessageDialog} */ dialog;
let /** @type {OOUI.CheckboxMultiselectInputWidget} */ inputWidget;
let /** @type {OOUI.CheckboxMultioptionWidget} */ searchWidget;
let /** @type {OOUI.CheckboxMultioptionWidget} */ wikiEditorWidget;
let /** @type {OOUI.NumberInputWidget} */ indentWidget;
let /** @type {OOUI.FieldLayout} */ field;
let /** @type {OOUI.FieldLayout} */ indentField;
/**
* 显示/隐藏缩进大小选项
*
* @param {string[]} value 加载的插件
*/
const toggleIndent = (value = [...addons]) => {
indentField.toggle(value.includes('indentWithSpace'));
};
const portletContainer = {
minerva: 'page-actions-overflow',
moeskin: 'ca-more-actions',
};
const $portlet = $(
mw.util.addPortletLink(portletContainer[skin] || 'p-cactions', '#', msg('portlet'), 'wphl-settings')
).on('click', async () => {
if (dialog) {
inputWidget.setValue([...addons]);
indentWidget.setValue(indent);
} else {
await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);
dialog = new OO.ui.MessageDialog({id: 'Wikiplus-highlight-dialog'});
const windowManager = new OO.ui.WindowManager();
windowManager.$element.appendTo(body);
windowManager.addWindows([dialog]);
inputWidget = new OO.ui.CheckboxMultiselectInputWidget({
options: [
...options.map(({option, addon = option}) => {
const mainAddon = Array.isArray(addon) ? addon[0] : addon;
return {data: mainAddon, label: htmlMsg(`addon-${mainAddon.toLowerCase()}`)};
}),
...['wikiEditor', 'escape', 'contextmenu', 'lint', 'indentWithSpace', 'otherEditors'].map(
(addon) => ({data: addon, label: htmlMsg(`addon-${addon.toLowerCase()}`)})
),
],
value: [...addons],
}).on('change', toggleIndent);
const {checkboxMultiselectWidget} = inputWidget;
searchWidget = checkboxMultiselectWidget.findItemFromData('search');
wikiEditorWidget = checkboxMultiselectWidget.findItemFromData('wikiEditor');
indentWidget = new OO.ui.NumberInputWidget({min: 0, value: indent});
field = new OO.ui.FieldLayout(inputWidget, {
label: msg('addon-label'),
notices: [msg('addon-notice')],
align: 'top',
});
indentField = new OO.ui.FieldLayout(indentWidget, {label: msg('addon-indent')});
toggleIndent();
Object.assign(mw.libs.wphl, {widget: inputWidget, indentWidget});
}
const wikiplusLoaded = typeof window.Wikiplus === 'object' || typeof window._WikiplusPages === 'object';
searchWidget.setDisabled(!wikiplusLoaded);
wikiEditorWidget.setDisabled(!wikiplusLoaded || !mw.loader.getState('ext.wikiEditor'));
const data = await dialog.open({
title: msg('addon-title'),
message: field.$element.add(indentField.$element).add($('<p>').html(msg('feedback'))),
actions: [
{action: 'reject', label: mw.msg('ooui-dialog-message-reject')},
{action: 'accept', label: mw.msg('ooui-dialog-message-accept'), flags: 'progressive'},
],
size: i18nLang === 'en' || skin === 'minerva' ? 'medium' : 'small',
}).closing;
field.$element.detach();
indentField.$element.detach();
if (typeof data === 'object' && data.action === 'accept') {
const value = inputWidget.getValue();
addons.clear();
for (const addon of value) {
addons.add(addon);
}
indent = Number(indentWidget.getValue());
storage.setObject('Wikiplus-highlight-addons', value);
storage.setObject('Wikiplus-highlight-indent', indent);
}
});
if (skin === 'minerva') {
$portlet.find('.mw-ui-icon').addClass('mw-ui-icon-minerva-settings');
}
// 发送欢迎提示
if (typeof welcome === 'function') {
welcome()
.find('#wphl-settings-notify')
.click((e) => {
e.preventDefault();
$('#wphl-settings').triggerHandler('click');
});
}
/**
* 处理非Wikiplus编辑器
*
* @param {CodeMirror.Editor} doc CodeMirror编辑区
*/
const handleOtherEditors = async (doc) => {
if (!addons.has('otherEditors')) {
return;
}
let mode = doc.getOption('mode');
mode = mode === 'text/mediawiki' ? 'mediawiki' : mode;
const addonScript = getAddonScript(CodeMirror, true);
const json = doc.getOption('json');
const {
prototype,
optionHandlers,
helpers: {lint},
} = CodeMirror;
if (!prototype.annotateScrollbar && mode === 'mediawiki' && addons.has('lint')) {
addonScript.push(ADDON_LIST.annotateScrollbar);
}
if (!window.wikiparse && mode === 'mediawiki' && addons.has('lint')) {
addonScript.push(ADDON_LIST.parser);
}
if (!optionHandlers.lint && mode === 'mediawiki' && addons.has('lint')) {
mw.loader.load(`${CDN}/${CM_CDN}/addon/lint/lint.min.css`, 'text/css');
addonScript.push(ADDON_LIST.lint);
}
if (!(lint && lint.mediawiki) && mode === 'mediawiki' && addons.has('lint')) {
addonScript.push(ADDON_LIST.lintWikitext);
}
await getScript(addonScript);
for (const {
option,
addon = option,
modes,
complex = (/** @type {string} */ mod) => !modes || modes.has(mod),
} of options.filter(({only}) => !only)) {
const mainAddon = Array.isArray(addon) ? addon[0] : addon;
if (doc.getOption(option) === undefined && addons.has(mainAddon)) {
doc.setOption(option, complex(mode, json));
}
}
if (mode === 'mediawiki' && addons.has('escape')) {
doc.addKeyMap(extraKeys(CodeMirror), true);
} else if (mode !== 'mediawiki' && addons.has('indentWithSpace')) {
doc.setOption('indentUnit', indent);
doc.setOption('indentWithTabs', false);
}
handleContextMenu(doc, mode);
};
mw.hook('InPageEdit.quickEdit.codemirror').add(
/** @param {{cm: CodeMirror.Editor}} */ ({cm: doc}) => handleOtherEditors(doc)
);
mw.hook('inspector').add(/** @param {CodeMirror.Editor} doc */ (doc) => handleOtherEditors(doc));
mw.hook('wiki-codemirror').add(
/** @param {CodeMirror.Editor} doc */ (doc) => {
if (!doc.getTextArea || !isWikiplus(doc.getTextArea())) {
handleOtherEditors(doc);
}
}
);
mw.loader.load(`${CDN}/${REPO_CDN}/styles.min.css`, 'text/css');
Object.assign(mw.libs.wphl, {
version,
options,
addons,
i18n,
i18nLang,
storage,
$portlet,
CDN,
PARSER_CDN,
USING_LOCAL,
MODE_LIST,
ADDON_LIST,
msg,
htmlMsg,
escapeHTML,
handleContextMenu,
setI18N,
getAddonScript,
updateCachedConfig,
getMwConfig,
renderEditor,
handleOtherEditors,
isPc,
}); // 加载完毕
})();
})();


/* </nowiki> */
/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1dpa2lwbHVzLWhpZ2hsaWdodC9tb2R1bGVzL2hpZ2hsaWdodC50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L21vZHVsZXMvYXBpLnRzIiwgInNyYy9XaWtpcGx1cy1oaWdobGlnaHQvbW9kdWxlcy9jaGVja0RlcGVuZGVuY2llcy50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L1dpa2lwbHVzLWhpZ2hsaWdodC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbmFtZSBXaWtpcGx1cy1oaWdobGlnaHQgV2lraXBsdXPnvJbovpHlmajnmoRDb2RlTWlycm9y6K+t5rOV6auY5Lqu5omp5bGVXG4gKiBAYXV0aG9yIEJoc2QgPGh0dHBzOi8vZ2l0aHViLmNvbS9iaHNkLWhhcnJ5PlxuICogQGxpY2Vuc2UgR1BMLTMuMFxuICovXG5cbmltcG9ydCB7dW5pcXVlQXJyYXl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbigoKTogdm9pZCA9PiB7XG5cdGNvbnN0IHtsaWJzfSA9IG13LFxuXHRcdHt3cGhsfSA9IGxpYnM7XG5cdGlmICh3cGhsPy52ZXJzaW9uKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHZlcnNpb24gPSAnMy4wLjcnO1xuXHRsaWJzWyd3cGhsJ10gPSB7dmVyc2lvbiwgY21WZXJzaW9uOiAnMi45JywgLi4ud3BobH07IC8vIOW8gOWni+WKoOi9vVxuXG5cdC8vIOi3r+W+hFxuXHRjb25zdCBDRE4gPSAnLy90ZXN0aW5nY2YuanNkZWxpdnIubmV0Jyxcblx0XHRNV19DRE4gPSBgbnBtL0BiaHNkL2NvZGVtaXJyb3ItbWVkaWF3aWtpQCR7bGlic1snd3BobCddLmNtVmVyc2lvbiB8fCAnbGF0ZXN0J30vZGlzdC9tdy5taW4uanNgLFxuXHRcdFJFUE9fQ0ROID0gJ25wbS93aWtpcGx1cy1oaWdobGlnaHQnO1xuXG5cdHdpbmRvdy5Db2RlTWlycm9yNiB8fD0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0XHRzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdHJlc29sdmUoQ29kZU1pcnJvcjYpO1xuXHRcdH0pO1xuXHRcdHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG5cdFx0c2NyaXB0LnNyYyA9IGAke0NETn0vJHtNV19DRE59YDtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xuXHR9KTtcblxuXHRjb25zdCB7d2dQYWdlTmFtZTogcGFnZSwgd2dOYW1lc3BhY2VOdW1iZXI6IG5zLCB3Z1BhZ2VDb250ZW50TW9kZWw6IGNvbnRlbnRtb2RlbH0gPSBtdy5jb25maWcuZ2V0KCk7XG5cblx0Y29uc3QgQ09OVEVOVE1PREVMUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0XHRcdCdzYW5pdGl6ZWQtY3NzJzogJ2NzcycsXG5cdFx0XHR3aWtpdGV4dDogJ21lZGlhd2lraScsXG5cdFx0fSxcblx0XHRFWFRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0Y3NzOiAnY3NzJyxcblx0XHRcdGpzOiAnamF2YXNjcmlwdCcsXG5cdFx0XHRqc29uOiAnanNvbicsXG5cdFx0fSxcblx0XHROQU1FU1BBQ0VTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuXHRcdFx0ODI4OiAnbHVhJyxcblx0XHRcdDI3NDogJ2h0bWwnLFxuXHRcdH07XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3QgZ2V0T2JqZWN0ID0gKGtleTogc3RyaW5nKTogYW55ID0+IHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShTdHJpbmcobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiDmo4Dmn6XpobXpnaLor63oqIDnsbvlnotcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIOmhtemdouWGheWuuVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y29uc3QgZ2V0UGFnZU1vZGUgPSBhc3luYyAodmFsdWU6IHN0cmluZyk6IFByb21pc2U8W3N0cmluZywgKG51bWJlciB8IHVuZGVmaW5lZCk/XT4gPT4ge1xuXHRcdGlmICh0eXBlb2YgX1dpa2lwbHVzUGFnZXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRjb25zdCBwYWdlcyA9IE9iamVjdC52YWx1ZXMoX1dpa2lwbHVzUGFnZXMpLmZpbHRlcigoe3NlY3Rpb25DYWNoZX0pID0+IHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC52YWx1ZXMoc2VjdGlvbkNhY2hlKS5pbmNsdWRlcyh2YWx1ZSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0cGFnZXMuc29tZSgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAhdGl0bGUuZW5kc1dpdGgoJy9kb2MnKTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ21lZGlhd2lraS5UaXRsZScpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbW9kZXMgPSB1bmlxdWVBcnJheShcblx0XHRcdFx0Ly8gUmVwbGFjZSBgbmV3IFNldCgpYCB0byBhdm9pZCBwb2x5ZmlsbGluZyBjb3JlLWpzXG5cdFx0XHRcdHBhZ2VzLm1hcCgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aXRsZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3RlbXBsYXRlJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdCA9IG5ldyBtdy5UaXRsZSh0aXRsZSksXG5cdFx0XHRcdFx0XHRuYW1lc3BhY2UgPSB0LmdldE5hbWVzcGFjZUlkKCk7XG5cdFx0XHRcdFx0aWYgKG5hbWVzcGFjZSAlIDIpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnbWVkaWF3aWtpJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgbW9kZSA9IEVYVFNbdC5nZXRFeHRlbnNpb24oKT8udG9Mb3dlckNhc2UoKSB8fCAnJ10gfHwgTkFNRVNQQUNFU1tuYW1lc3BhY2VdO1xuXHRcdFx0XHRcdGlmIChtb2RlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ2phdmFzY3JpcHQnICYmIChuYW1lc3BhY2UgPT09IDggfHwgbmFtZXNwYWNlID09PSAyMzAwKSA/ICdnYWRnZXQnIDogbW9kZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG5hbWVzcGFjZSA9PT0gMTAgfHwgbmFtZXNwYWNlID09PSAyID8gJ3RlbXBsYXRlJyA6ICdtZWRpYXdpa2knO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGlmIChtb2Rlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Y29uc3QgW21vZGVdID0gbW9kZXM7XG5cdFx0XHRcdGlmIChtb2RlID09PSAnZ2FkZ2V0Jykge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnLCA4XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ3RlbXBsYXRlJyA/IFsnbWVkaWF3aWtpJywgMTBdIDogW21vZGUhXTtcblx0XHRcdH0gZWxzZSBpZiAobW9kZXMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlmIChtb2Rlcy5pbmNsdWRlcygnamF2YXNjcmlwdCcpICYmIG1vZGVzLmluY2x1ZGVzKCdnYWRnZXQnKSkge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnXTtcblx0XHRcdFx0fSBlbHNlIGlmIChtb2Rlcy5pbmNsdWRlcygnbWVkaWF3aWtpJykgJiYgbW9kZXMuaW5jbHVkZXMoJ3RlbXBsYXRlJykpIHtcblx0XHRcdFx0XHRyZXR1cm4gWydtZWRpYXdpa2knXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoKG5zICE9PSAyNzQgJiYgY29udGVudG1vZGVsICE9PSAnU2NyaWJ1bnRvJykgfHwgcGFnZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRyZXR1cm4gW0NPTlRFTlRNT0RFTFNbY29udGVudG1vZGVsXSB8fCBjb250ZW50bW9kZWwsIGNvbnRlbnRtb2RlbCA9PT0gJ2phdmFzY3JpcHQnID8gbnMgOiB1bmRlZmluZWRdO1xuXHRcdH1cblx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ29vanMtdWktd2luZG93cycpO1xuXHRcdGlmIChcblx0XHRcdGF3YWl0IE9PLnVpLmNvbmZpcm0obXcubXNnKCdjbS1tdy1jb250ZW50bW9kZWwnKSwge1xuXHRcdFx0XHRhY3Rpb25zOiBbe2xhYmVsOiBucyA9PT0gMjc0ID8gJ1dpZGdldCcgOiAnTHVhJ30sIHtsYWJlbDogJ1dpa2l0ZXh0JywgYWN0aW9uOiAnYWNjZXB0J31dLFxuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdHJldHVybiBbJ21lZGlhd2lraSddO1xuXHRcdH1cblx0XHRyZXR1cm4gW25zID09PSAyNzQgPyAnaHRtbCcgOiAnbHVhJ107XG5cdH07XG5cblx0LyoqXG5cdCAqIOa4suafk+e8lui+keWZqFxuXHQgKlxuXHQgKiBAcGFyYW0ge0pRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Pn0gJHRhcmdldCDnm67moIfnvJbovpHmoYZcblx0ICogQHBhcmFtIHtib29sZWFufSBzZXR0aW5nIOaYr+WQpuaYr1dpa2lwbHVz6K6+572u77yI5L2/55SoanNvbuivreazle+8iVxuXHQgKi9cblx0Y29uc3QgcmVuZGVyRWRpdG9yID0gYXN5bmMgKCR0YXJnZXQ6IEpRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Piwgc2V0dGluZzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdGNvbnN0IGNtID0gYXdhaXQgKFxuXHRcdFx0YXdhaXQgQ29kZU1pcnJvcjZcblx0XHQpLmZyb21UZXh0QXJlYSgkdGFyZ2V0WzBdISwgLi4uKHNldHRpbmcgPyAoWydqc29uJ10gYXMgW3N0cmluZ10pIDogYXdhaXQgZ2V0UGFnZU1vZGUoJHRhcmdldC52YWwoKSEpKSk7XG5cdFx0aWYgKGNtLnZpZXcpIHtcblx0XHRcdGNtLnZpZXcuZG9tLmlkID0gJ1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXHRcdH1cblxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LUp1bXAgPiBhJykhLmhyZWYgPSAnI1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXG5cdFx0aWYgKCFzZXR0aW5nKSB7XG5cdFx0XHQvLyDmma7pgJpXaWtpcGx1c+e8lui+keWMulxuXHRcdFx0Y29uc3Qgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IGdldE9iamVjdCgnV2lraXBsdXNfU2V0dGluZ3MnKSxcblx0XHRcdFx0ZXNjVG9FeGl0UXVpY2tFZGl0ID0gc2V0dGluZ3MgJiYgKHNldHRpbmdzWydlc2NfdG9fZXhpdF9xdWlja2VkaXQnXSB8fCBzZXR0aW5nc1snZXNjVG9FeGl0UXVpY2tFZGl0J10pLFxuXHRcdFx0XHRzdWJtaXQgPSAvKiog5o+Q5Lqk57yW6L6RIEByZXR1cm4gdHJ1ZSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1TdWJtaXQnKSEuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Ym1pdE1pbm9yID0gLyoqIOaPkOS6pOWwj+e8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI1dpa2lwbHVzLVF1aWNrZWRpdC1NaW5vckVkaXQnKSEuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Ym1pdCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlc2NhcGVFZGl0ID0gLyoqIOaMieS4i0VzY+mUrumAgOWHuue8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1CYWNrJykhLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9O1xuXHRcdFx0Y20uZXh0cmFLZXlzKFtcblx0XHRcdFx0e2tleTogJ01vZC1TJywgcnVuOiBzdWJtaXR9LFxuXHRcdFx0XHR7a2V5OiAnU2hpZnQtTW9kLVMnLCBydW46IHN1Ym1pdE1pbm9yfSxcblx0XHRcdFx0Li4uKGVzY1RvRXhpdFF1aWNrRWRpdCA9PT0gdHJ1ZSB8fCBlc2NUb0V4aXRRdWlja0VkaXQgPT09ICd0cnVlJ1xuXHRcdFx0XHRcdD8gW3trZXk6ICdFc2MnLCBydW46IGVzY2FwZUVkaXR9XVxuXHRcdFx0XHRcdDogW10pLFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0LyoqIEB0b2RvIOS7peS4i+i/h+a4oeS7o+eggea3u+WKoOS6jjIwMjQtMDItMDfvvIzlsIbkuo7kuIDmrrXml7bpl7TlkI7lvIPnlKggKi9cblx0XHRjb25zdCBvbGRLZXkgPSAnV2lraXBsdXMtaGlnaGxpZ2h0LWFkZG9ucycsXG5cdFx0XHRvbGRQcmVmczogc3RyaW5nW10gfCBudWxsID0gZ2V0T2JqZWN0KG9sZEtleSksXG5cdFx0XHRtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0XHRhY3RpdmVMaW5lOiAnaGlnaGxpZ2h0QWN0aXZlTGluZScsXG5cdFx0XHRcdHRyYWlsaW5nc3BhY2U6ICdoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UnLFxuXHRcdFx0XHRtYXRjaEJyYWNrZXRzOiAnYnJhY2tldE1hdGNoaW5nJyxcblx0XHRcdFx0Y2xvc2VCcmFja2V0czogJ2Nsb3NlQnJhY2tldHMnLFxuXHRcdFx0XHRtYXRjaFRhZ3M6ICd0YWdNYXRjaGluZycsXG5cdFx0XHRcdGZvbGQ6ICdjb2RlRm9sZGluZycsXG5cdFx0XHRcdHdpa2lFZGl0b3I6ICd3aWtpRWRpdG9yJyxcblx0XHRcdFx0ZXNjYXBlOiAnZXNjYXBlJyxcblx0XHRcdFx0Y29udGV4dG1lbnU6ICdvcGVuTGlua3MnLFxuXHRcdFx0XHRsaW50OiAnbGludCcsXG5cdFx0XHR9O1xuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG9sZEtleSk7XG5cdFx0aWYgKG9sZFByZWZzKSB7XG5cdFx0XHRjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IGsgb2Ygb2xkUHJlZnMpIHtcblx0XHRcdFx0aWYgKGsgaW4gbWFwcGluZykge1xuXHRcdFx0XHRcdG9ialttYXBwaW5nW2tdIV0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNtLnByZWZlcihvYmopO1xuXHRcdH1cblx0fTtcblxuXHQvLyDnm5Hop4YgV2lraXBsdXMg57yW6L6R5qGGXG5cdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHJlY29yZHMpID0+IHtcblx0XHRjb25zdCAkZWRpdEFyZWEgPSAkKFxuXHRcdFx0cmVjb3Jkcy5mbGF0TWFwKCh7YWRkZWROb2Rlc30pID0+IHtcblx0XHRcdFx0cmV0dXJuIFsuLi5hZGRlZE5vZGVzXTtcblx0XHRcdH0pXG5cdFx0KS5maW5kPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LCAjV2lraXBsdXMtU2V0dGluZy1JbnB1dCcpO1xuXHRcdGlmICgkZWRpdEFyZWEubGVuZ3RoID4gMCkge1xuXHRcdFx0dm9pZCByZW5kZXJFZGl0b3IoJGVkaXRBcmVhLCAkZWRpdEFyZWEuYXR0cignaWQnKSA9PT0gJ1dpa2lwbHVzLVNldHRpbmctSW5wdXQnKTtcblx0XHR9XG5cdH0pO1xuXHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtjaGlsZExpc3Q6IHRydWV9KTtcblxuXHRtdy5sb2FkZXIubG9hZChgJHtDRE59LyR7UkVQT19DRE59QCR7dmVyc2lvbn0vc3R5bGVzLm1pbi5jc3NgLCAndGV4dC9jc3MnKTtcbn0pKCk7XG5cbmV4cG9ydCB7fTtcbiIsICJpbXBvcnQge2luaXRNd0FwaX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuY29uc3QgYXBpOiBtdy5BcGkgPSBpbml0TXdBcGkoJ1dpa2lwbHVzLWhpZ2hsaWdodC8yLjAnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgImltcG9ydCB7YXBpfSBmcm9tICcuL2FwaSc7XG5cbmNvbnN0IGNoZWNrRGVwZW5kZW5jaWVzID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoIW13LnVzZXIub3B0aW9ucy5nZXQoJ2dhZGdldC1XaWtpcGx1cycpKSB7XG5cdFx0dm9pZCBhcGkucG9zdFdpdGhFZGl0VG9rZW4oe1xuXHRcdFx0YWN0aW9uOiAnb3B0aW9ucycsXG5cdFx0XHRjaGFuZ2U6ICdnYWRnZXQtV2lraXBsdXM9MScsXG5cdFx0fSBhcyBBcGlPcHRpb25zUGFyYW1zKTtcblxuXHRcdGF3YWl0IG13LmxvYWRlci51c2luZygnZXh0LmdhZGdldC5XaWtpcGx1cycpO1xuXHR9XG59O1xuXG5leHBvcnQge2NoZWNrRGVwZW5kZW5jaWVzfTtcbiIsICJpbXBvcnQgJy4vV2lraXBsdXMtaGlnaGxpZ2h0Lmxlc3MnO1xuaW1wb3J0IHtjaGVja0RlcGVuZGVuY2llc30gZnJvbSAnLi9tb2R1bGVzL2NoZWNrRGVwZW5kZW5jaWVzJztcblxuKGFzeW5jIGZ1bmN0aW9uIFdpa2lwbHVzSGlnaGxpZ2h0KCkge1xuXHR2b2lkIGNoZWNrRGVwZW5kZW5jaWVzKCk7XG5cdGNvbnN0IHt3Z0FjdGlvbiwgd2dJc0FydGljbGV9ID0gbXcuY29uZmlnLmdldCgpO1xuXHRpZiAod2dBY3Rpb24gIT09ICd2aWV3JyB8fCAhd2dJc0FydGljbGUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB7J3Zpc3VhbGVkaXRvci1lbmFibGUnOiBpc1ZlRW5hYmxlfSA9IG13LnVzZXIub3B0aW9ucy5nZXQoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuXHQvKiBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpcGx1cy9XaWtpcGx1cy9pc3N1ZXMvNjU+ICovXG5cdGlmIChpc1ZlRW5hYmxlKSB7XG5cdFx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQudmlzdWFsRWRpdG9yLmNvcmUnKTtcblx0fVxuXG5cdGlmICghKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50KSkge1xuXHRcdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL2hpZ2hsaWdodCcpO1xuXHR9XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsb0JBQUEsQ0FBQTtBQUFBLElBTUFDO0FBTkEsSUFBQUMsaUJBQUFDLE1BQUE7RUFBQSxnREFBQTtBQUFBO0FBTUFGLHlCQUEwQkcsUUFBQSxpQkFBQTtJQU4xQjs7Ozs7QUFRQSxLQUFDQyxhQUFZO0FBQ1osWUFBTTtRQUFDQztNQUFJLElBQUlDLElBQ2Q7UUFBQ0M7TUFBSSxJQUFJRjtBQUNWLFVBQUlFLFNBQUEsUUFBQUEsU0FBQSxVQUFBQSxLQUFNQyxTQUFTO0FBQ2xCO01BQ0Q7QUFDQSxZQUFNQSxVQUFVO0FBQ2hCSCxXQUFLLE1BQU0sSUFBSTtRQUFDRztRQUFTQyxXQUFXO1FBQU8sR0FBR0Y7TUFBSTtBQUdsRCxZQUFNRyxNQUFNLDRCQUNYQyxTQUFBLGtDQUFBQyxPQUEyQ1AsS0FBSyxNQUFNLEVBQUVJLGFBQWEsVUFBUSxpQkFBQSxHQUM3RUksV0FBVztBQUVaLE9BQUFULFVBQUFVLFFBQU9DLGdCQUFQWCxRQUFPVyxjQUFnQixJQUFJQyxRQUFTQyxhQUFZO0FBQy9DLGNBQU1DLFNBQVNDLFNBQVNDLGNBQWMsUUFB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TCxhQUFtQztBQUNuQyxTQUFLbUUsa0JBQWtCO0FBQ3ZCLFVBQU07TUFBQ007TUFBVUM7SUFBVyxJQUFJekosR0FBRzBCLE9BQU9DLElBQUk7QUFDOUMsUUFBSTZILGFBQWEsVUFBVSxDQUFDQyxhQUFhO0FBQ3hDO0lBQ0Q7QUFFQSxVQUFNO01BQUMsdUJBQXVCQztJQUFVLElBQUkxSixHQUFHb0osS0FBS0MsUUFBUTFILElBQUk7QUFHaEUsUUFBSStILFlBQVk7QUFDZixZQUFNMUosR0FBR3dELE9BQU9DLE1BQU0sdUJBQXVCO0lBQzlDO0FBRUEsUUFBSSxFQUFFLGtCQUFrQjVDLFdBQVc7QUFDbEMsWUFBTUgsUUFBQUMsUUFBQSxFQUFBZ0osS0FBQSxPQUFBaEssZUFBQSxHQUFBRixrQkFBQTtJQUNQO0VBQ0QsQ0FBQTtBQUFBLFdBakJnQm1LLG9CQUFBO0FBQUEsV0FBQUMsbUJBQUEvRSxNQUFBLE1BQUFDLFNBQUE7RUFBQTtBQUFBLFNBQUE2RTtBQUFBLEdBQUEsRUFpQmI7IiwKICAibmFtZXMiOiBbImhpZ2hsaWdodF9leHBvcnRzIiwgImltcG9ydF9leHRfZ2FkZ2V0MiIsICJpbml0X2hpZ2hsaWdodCIsICJfX2VzbSIsICJyZXF1aXJlIiwgIl93aW5kb3ciLCAibGlicyIsICJtdyIsICJ3cGhsIiwgInZlcnNpb24iLCAiY21WZXJzaW9uIiwgIkNETiIsICJNV19DRE4iLCAiY29uY2F0IiwgIlJFUE9fQ0ROIiwgIndpbmRvdyIsICJDb2RlTWlycm9yNiIsICJQcm9taXNlIiwgInJlc29sdmUiLCAic2NyaXB0IiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJ0eXBlIiwgInNyYyIsICJoZWFkIiwgImFwcGVuZCIsICJ3Z1BhZ2VOYW1lIiwgInBhZ2UiLCAid2dOYW1lc3BhY2VOdW1iZXIiLCAibnMiLCAid2dQYWdlQ29udGVudE1vZGVsIiwgImNvbnRlbnRtb2RlbCIsICJjb25maWciLCAiZ2V0IiwgIkNPTlRFTlRNT0RFTFMiLCAid2lraXRleHQiLCAiRVhUUyIsICJjc3MiLCAianMiLCAianNvbiIsICJOQU1FU1BBQ0VTIiwgImdldE9iamVjdCIsICJrZXkiLCAiSlNPTiIsICJwYXJzZSIsICJTdHJpbmciLCAibG9jYWxTdG9yYWdlIiwgImdldEl0ZW0iLCAiZ2V0UGFnZU1vZGUiLCAiX3JlZiIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJ2YWx1ZSIsICJfV2lraXBsdXNQYWdlcyIsICJwYWdlcyIsICJPYmplY3QiLCAidmFsdWVzIiwgImZpbHRlciIsICJzZWN0aW9uQ2FjaGUiLCAiaW5jbHVkZXMiLCAic29tZSIsICJ0aXRsZSIsICJlbmRzV2l0aCIsICJsb2FkZXIiLCAidXNpbmciLCAibW9kZXMiLCAidW5pcXVlQXJyYXkiLCAibWFwIiwgIl90JGdldEV4dGVuc2lvbiIsICJ0IiwgIlRpdGxlIiwgIm5hbWVzcGFjZSIsICJnZXROYW1lc3BhY2VJZCIsICJtb2RlIiwgImdldEV4dGVuc2lvbiIsICJ0b0xvd2VyQ2FzZSIsICJsZW5ndGgiLCAiT08iLCAidWkiLCAiY29uZmlybSIsICJtc2ciLCAiYWN0aW9ucyIsICJsYWJlbCIsICJhY3Rpb24iLCAiX3giLCAiYXBwbHkiLCAiYXJndW1lbnRzIiwgInJlbmRlckVkaXRvciIsICJfcmVmMiIsICIkdGFyZ2V0IiwgInNldHRpbmciLCAiY20iLCAiZnJvbVRleHRBcmVhIiwgInZhbCIsICJ2aWV3IiwgImRvbSIsICJpZCIsICJxdWVyeVNlbGVjdG9yIiwgImhyZWYiLCAic2V0dGluZ3MiLCAiZXNjVG9FeGl0UXVpY2tFZGl0IiwgInN1Ym1pdCIsICJkaXNwYXRjaEV2ZW50IiwgIk1vdXNlRXZlbnQiLCAic3VibWl0TWlub3IiLCAiY2hlY2tlZCIsICJlc2NhcGVFZGl0IiwgImV4dHJhS2V5cyIsICJydW4iLCAib2xkS2V5IiwgIm9sZFByZWZzIiwgIm1hcHBpbmciLCAiYWN0aXZlTGluZSIsICJ0cmFpbGluZ3NwYWNlIiwgIm1hdGNoQnJhY2tldHMiLCAiY2xvc2VCcmFja2V0cyIsICJtYXRjaFRhZ3MiLCAiZm9sZCIsICJ3aWtpRWRpdG9yIiwgImVzY2FwZSIsICJjb250ZXh0bWVudSIsICJsaW50IiwgInJlbW92ZUl0ZW0iLCAib2JqIiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJzIiwgIm4iLCAiZG9uZSIsICJrIiwgImVyciIsICJlIiwgImYiLCAicHJlZmVyIiwgIl94MiIsICJfeDMiLCAib2JzZXJ2ZXIiLCAiTXV0YXRpb25PYnNlcnZlciIsICJyZWNvcmRzIiwgIiRlZGl0QXJlYSIsICIkIiwgImZsYXRNYXAiLCAiYWRkZWROb2RlcyIsICJmaW5kIiwgImF0dHIiLCAib2JzZXJ2ZSIsICJib2R5IiwgImNoaWxkTGlzdCIsICJsb2FkIiwgImltcG9ydF9leHRfZ2FkZ2V0IiwgImFwaSIsICJpbml0TXdBcGkiLCAiY2hlY2tEZXBlbmRlbmNpZXMiLCAiX3JlZjMiLCAidXNlciIsICJvcHRpb25zIiwgInBvc3RXaXRoRWRpdFRva2VuIiwgImNoYW5nZSIsICJ3Z0FjdGlvbiIsICJ3Z0lzQXJ0aWNsZSIsICJpc1ZlRW5hYmxlIiwgInRoZW4iLCAiV2lraXBsdXNIaWdobGlnaHQiLCAiX1dpa2lwbHVzSGlnaGxpZ2h0Il0KfQo=

2024年5月31日 (五) 16:02的最新版本

/**
 * SPDX-License-Identifier: CC-BY-SA-4.0
 * _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
 *
 * @source {@link https://github.com/TopRealm/YsArchives-Gadgets/tree/master/src/Wikiplus-highlight}
 * @license CC-BY-SA-4.0 {@link https://youshou.wiki/wiki/H:CC-BY-SA-4.0}
 */
/**
 * +------------------------------------------------------------+
 * |            === WARNING: GLOBAL GADGET FILE ===             |
 * +------------------------------------------------------------+
 * |       All changes should be made in the repository,        |
 * |                otherwise they will be lost.                |
 * +------------------------------------------------------------+
 * |        Changes to this page may affect many users.         |
 * | Please discuss changes by opening an issue before editing. |
 * +------------------------------------------------------------+
 */
/* <nowiki> */

(() => {

"use strict";

// dist/Wikiplus-highlight/Wikiplus-highlight.js
function _createForOfIteratorHelper(r, e) {
  var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
  if (!t) {
    if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
      t && (r = t);
      var n = 0, F = function() {
      };
      return { s: F, n: function() {
        return n >= r.length ? { done: true } : { done: false, value: r[n++] };
      }, e: function(r2) {
        throw r2;
      }, f: F };
    }
    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }
  var o, a = true, u = false;
  return { s: function() {
    t = t.call(r);
  }, n: function() {
    var r2 = t.next();
    return a = r2.done, r2;
  }, e: function(r2) {
    u = true, o = r2;
  }, f: function() {
    try {
      a || null == t.return || t.return();
    } finally {
      if (u) throw o;
    }
  } };
}
function _unsupportedIterableToArray(r, a) {
  if (r) {
    if ("string" == typeof r) return _arrayLikeToArray(r, a);
    var t = {}.toString.call(r).slice(8, -1);
    return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
  }
}
function _arrayLikeToArray(r, a) {
  (null == a || a > r.length) && (a = r.length);
  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
  return n;
}
function asyncGeneratorStep(n, t, e, r, o, a, c) {
  try {
    var i = n[a](c), u = i.value;
  } catch (n2) {
    return void e(n2);
  }
  i.done ? t(u) : Promise.resolve(u).then(r, o);
}
function _asyncToGenerator(n) {
  return function() {
    var t = this, e = arguments;
    return new Promise(function(r, o) {
      var a = n.apply(t, e);
      function _next(n2) {
        asyncGeneratorStep(a, r, o, _next, _throw, "next", n2);
      }
      function _throw(n2) {
        asyncGeneratorStep(a, r, o, _next, _throw, "throw", n2);
      }
      _next(void 0);
    });
  };
}
var __getOwnPropNames = Object.getOwnPropertyNames;
var __esm = (fn, res) => function __init() {
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
//! src/Wikiplus-highlight/modules/highlight.ts
var highlight_exports = {};
var import_ext_gadget2;
var init_highlight = __esm({
  "src/Wikiplus-highlight/modules/highlight.ts"() {
    "use strict";
    import_ext_gadget2 = require("ext.gadget.Util");
    /**
     * @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展
     * @author Bhsd <https://github.com/bhsd-harry>
     * @license GPL-3.0
     */
    ((_window) => {
      const {
        libs
      } = mw, {
        wphl
      } = libs;
      if (wphl !== null && wphl !== void 0 && wphl.version) {
        return;
      }
      const version = "3.0.7";
      libs["wphl"] = {
        version,
        cmVersion: "2.9",
        ...wphl
      };
      const CDN = "//testingcf.jsdelivr.net", MW_CDN = "npm/@bhsd/codemirror-mediawiki@".concat(libs["wphl"].cmVersion || "latest", "/dist/mw.min.js"), REPO_CDN = "npm/wikiplus-highlight";
      (_window = window).CodeMirror6 || (_window.CodeMirror6 = new Promise((resolve) => {
        const script = document.createElement("script");
        script.addEventListener("load", () => {
          resolve(CodeMirror6);
        });
        script.type = "module";
        script.src = "".concat(CDN, "/").concat(MW_CDN);
        document.head.append(script);
      }));
      const {
        wgPageName: page,
        wgNamespaceNumber: ns,
        wgPageContentModel: contentmodel
      } = mw.config.get();
      const CONTENTMODELS = {
        "sanitized-css": "css",
        wikitext: "mediawiki"
      }, EXTS = {
        css: "css",
        js: "javascript",
        json: "json"
      }, NAMESPACES = {
        828: "lua",
        274: "html"
      };
      const getObject = (key) => {
        return JSON.parse(String(localStorage.getItem(key)));
      };
      const getPageMode = /* @__PURE__ */ function() {
        var _ref = _asyncToGenerator(function* (value) {
          if (typeof _WikiplusPages === "object") {
            const pages = Object.values(_WikiplusPages).filter(({
              sectionCache
            }) => {
              return Object.values(sectionCache).includes(value);
            });
            if (pages.some(({
              title
            }) => {
              return !title.endsWith("/doc");
            })) {
              yield mw.loader.using("mediawiki.Title");
            }
            const modes = (0, import_ext_gadget2.uniqueArray)(
              // Replace `new Set()` to avoid polyfilling core-js
              pages.map(({
                title
              }) => {
                var _t$getExtension;
                if (title.endsWith("/doc")) {
                  return "template";
                }
                const t = new mw.Title(title), namespace = t.getNamespaceId();
                if (namespace % 2) {
                  return "mediawiki";
                }
                const mode = EXTS[((_t$getExtension = t.getExtension()) === null || _t$getExtension === void 0 ? void 0 : _t$getExtension.toLowerCase()) || ""] || NAMESPACES[namespace];
                if (mode) {
                  return mode === "javascript" && (namespace === 8 || namespace === 2300) ? "gadget" : mode;
                }
                return namespace === 10 || namespace === 2 ? "template" : "mediawiki";
              })
            );
            if (modes.length === 1) {
              const [mode] = modes;
              if (mode === "gadget") {
                return ["javascript", 8];
              }
              return mode === "template" ? ["mediawiki", 10] : [mode];
            } else if (modes.length === 2) {
              if (modes.includes("javascript") && modes.includes("gadget")) {
                return ["javascript"];
              } else if (modes.includes("mediawiki") && modes.includes("template")) {
                return ["mediawiki"];
              }
            }
          }
          if (ns !== 274 && contentmodel !== "Scribunto" || page.endsWith("/doc")) {
            return [CONTENTMODELS[contentmodel] || contentmodel, contentmodel === "javascript" ? ns : void 0];
          }
          yield mw.loader.using("oojs-ui-windows");
          if (yield OO.ui.confirm(mw.msg("cm-mw-contentmodel"), {
            actions: [{
              label: ns === 274 ? "Widget" : "Lua"
            }, {
              label: "Wikitext",
              action: "accept"
            }]
          })) {
            return ["mediawiki"];
          }
          return [ns === 274 ? "html" : "lua"];
        });
        return function getPageMode2(_x) {
          return _ref.apply(this, arguments);
        };
      }();
      const renderEditor = /* @__PURE__ */ function() {
        var _ref2 = _asyncToGenerator(function* ($target, setting) {
          const cm = yield (yield CodeMirror6).fromTextArea($target[0], ...setting ? ["json"] : yield getPageMode($target.val()));
          if (cm.view) {
            cm.view.dom.id = "Wikiplus-CodeMirror";
          }
          document.querySelector("#Wikiplus-Quickedit-Jump > a").href = "#Wikiplus-CodeMirror";
          if (!setting) {
            const settings = getObject("Wikiplus_Settings"), escToExitQuickEdit = settings && (settings["esc_to_exit_quickedit"] || settings["escToExitQuickEdit"]), submit = (
              /** 提交编辑 @return true */
              () => {
                document.querySelector("#Wikiplus-Quickedit-Submit").dispatchEvent(new MouseEvent("click"));
                return true;
              }
            ), submitMinor = (
              /** 提交小编辑 */
              () => {
                document.querySelector("#Wikiplus-Quickedit-MinorEdit").checked = true;
                return submit();
              }
            ), escapeEdit = (
              /** 按下Esc键退出编辑 */
              () => {
                document.querySelector("#Wikiplus-Quickedit-Back").dispatchEvent(new MouseEvent("click"));
                return true;
              }
            );
            cm.extraKeys([{
              key: "Mod-S",
              run: submit
            }, {
              key: "Shift-Mod-S",
              run: submitMinor
            }, ...escToExitQuickEdit === true || escToExitQuickEdit === "true" ? [{
              key: "Esc",
              run: escapeEdit
            }] : []]);
          }
          const oldKey = "Wikiplus-highlight-addons", oldPrefs = getObject(oldKey), mapping = {
            activeLine: "highlightActiveLine",
            trailingspace: "highlightTrailingWhitespace",
            matchBrackets: "bracketMatching",
            closeBrackets: "closeBrackets",
            matchTags: "tagMatching",
            fold: "codeFolding",
            wikiEditor: "wikiEditor",
            escape: "escape",
            contextmenu: "openLinks",
            lint: "lint"
          };
          localStorage.removeItem(oldKey);
          if (oldPrefs) {
            const obj = {};
            var _iterator = _createForOfIteratorHelper(oldPrefs), _step;
            try {
              for (_iterator.s(); !(_step = _iterator.n()).done; ) {
                const k = _step.value;
                if (k in mapping) {
                  obj[mapping[k]] = true;
                }
              }
            } catch (err) {
              _iterator.e(err);
            } finally {
              _iterator.f();
            }
            cm.prefer(obj);
          }
        });
        return function renderEditor2(_x2, _x3) {
          return _ref2.apply(this, arguments);
        };
      }();
      const observer = new MutationObserver((records) => {
        const $editArea = $(records.flatMap(({
          addedNodes
        }) => {
          return [...addedNodes];
        })).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");
        if ($editArea.length > 0) {
          void renderEditor($editArea, $editArea.attr("id") === "Wikiplus-Setting-Input");
        }
      });
      observer.observe(document.body, {
        childList: true
      });
      mw.loader.load("".concat(CDN, "/").concat(REPO_CDN, "@").concat(version, "/styles.min.css"), "text/css");
    })();
  }
});
//! src/Wikiplus-highlight/modules/api.ts
var import_ext_gadget = require("ext.gadget.Util");
var api = (0, import_ext_gadget.initMwApi)("Wikiplus-highlight/2.0");
//! src/Wikiplus-highlight/modules/checkDependencies.ts
var checkDependencies = /* @__PURE__ */ function() {
  var _ref3 = _asyncToGenerator(function* () {
    if (!mw.user.options.get("gadget-Wikiplus")) {
      void api.postWithEditToken({
        action: "options",
        change: "gadget-Wikiplus=1"
      });
      yield mw.loader.using("ext.gadget.Wikiplus");
    }
  });
  return function checkDependencies2() {
    return _ref3.apply(this, arguments);
  };
}();
//! src/Wikiplus-highlight/Wikiplus-highlight.ts
(function() {
  var _WikiplusHighlight = _asyncToGenerator(function* () {
    void checkDependencies();
    const {
      wgAction,
      wgIsArticle
    } = mw.config.get();
    if (wgAction !== "view" || !wgIsArticle) {
      return;
    }
    const {
      "visualeditor-enable": isVeEnable
    } = mw.user.options.get();
    if (isVeEnable) {
      yield mw.loader.using("ext.visualEditor.core");
    }
    if (!("ontouchstart" in document)) {
      yield Promise.resolve().then(() => (init_highlight(), highlight_exports));
    }
  });
  function WikiplusHighlight() {
    return _WikiplusHighlight.apply(this, arguments);
  }
  return WikiplusHighlight;
})()();

})();

/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1dpa2lwbHVzLWhpZ2hsaWdodC9tb2R1bGVzL2hpZ2hsaWdodC50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L21vZHVsZXMvYXBpLnRzIiwgInNyYy9XaWtpcGx1cy1oaWdobGlnaHQvbW9kdWxlcy9jaGVja0RlcGVuZGVuY2llcy50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L1dpa2lwbHVzLWhpZ2hsaWdodC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbmFtZSBXaWtpcGx1cy1oaWdobGlnaHQgV2lraXBsdXPnvJbovpHlmajnmoRDb2RlTWlycm9y6K+t5rOV6auY5Lqu5omp5bGVXG4gKiBAYXV0aG9yIEJoc2QgPGh0dHBzOi8vZ2l0aHViLmNvbS9iaHNkLWhhcnJ5PlxuICogQGxpY2Vuc2UgR1BMLTMuMFxuICovXG5cbmltcG9ydCB7dW5pcXVlQXJyYXl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbigoKTogdm9pZCA9PiB7XG5cdGNvbnN0IHtsaWJzfSA9IG13LFxuXHRcdHt3cGhsfSA9IGxpYnM7XG5cdGlmICh3cGhsPy52ZXJzaW9uKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHZlcnNpb24gPSAnMy4wLjcnO1xuXHRsaWJzWyd3cGhsJ10gPSB7dmVyc2lvbiwgY21WZXJzaW9uOiAnMi45JywgLi4ud3BobH07IC8vIOW8gOWni+WKoOi9vVxuXG5cdC8vIOi3r+W+hFxuXHRjb25zdCBDRE4gPSAnLy90ZXN0aW5nY2YuanNkZWxpdnIubmV0Jyxcblx0XHRNV19DRE4gPSBgbnBtL0BiaHNkL2NvZGVtaXJyb3ItbWVkaWF3aWtpQCR7bGlic1snd3BobCddLmNtVmVyc2lvbiB8fCAnbGF0ZXN0J30vZGlzdC9tdy5taW4uanNgLFxuXHRcdFJFUE9fQ0ROID0gJ25wbS93aWtpcGx1cy1oaWdobGlnaHQnO1xuXG5cdHdpbmRvdy5Db2RlTWlycm9yNiB8fD0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0XHRzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdHJlc29sdmUoQ29kZU1pcnJvcjYpO1xuXHRcdH0pO1xuXHRcdHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG5cdFx0c2NyaXB0LnNyYyA9IGAke0NETn0vJHtNV19DRE59YDtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xuXHR9KTtcblxuXHRjb25zdCB7d2dQYWdlTmFtZTogcGFnZSwgd2dOYW1lc3BhY2VOdW1iZXI6IG5zLCB3Z1BhZ2VDb250ZW50TW9kZWw6IGNvbnRlbnRtb2RlbH0gPSBtdy5jb25maWcuZ2V0KCk7XG5cblx0Y29uc3QgQ09OVEVOVE1PREVMUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0XHRcdCdzYW5pdGl6ZWQtY3NzJzogJ2NzcycsXG5cdFx0XHR3aWtpdGV4dDogJ21lZGlhd2lraScsXG5cdFx0fSxcblx0XHRFWFRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0Y3NzOiAnY3NzJyxcblx0XHRcdGpzOiAnamF2YXNjcmlwdCcsXG5cdFx0XHRqc29uOiAnanNvbicsXG5cdFx0fSxcblx0XHROQU1FU1BBQ0VTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuXHRcdFx0ODI4OiAnbHVhJyxcblx0XHRcdDI3NDogJ2h0bWwnLFxuXHRcdH07XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3QgZ2V0T2JqZWN0ID0gKGtleTogc3RyaW5nKTogYW55ID0+IHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShTdHJpbmcobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiDmo4Dmn6XpobXpnaLor63oqIDnsbvlnotcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIOmhtemdouWGheWuuVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y29uc3QgZ2V0UGFnZU1vZGUgPSBhc3luYyAodmFsdWU6IHN0cmluZyk6IFByb21pc2U8W3N0cmluZywgKG51bWJlciB8IHVuZGVmaW5lZCk/XT4gPT4ge1xuXHRcdGlmICh0eXBlb2YgX1dpa2lwbHVzUGFnZXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRjb25zdCBwYWdlcyA9IE9iamVjdC52YWx1ZXMoX1dpa2lwbHVzUGFnZXMpLmZpbHRlcigoe3NlY3Rpb25DYWNoZX0pID0+IHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC52YWx1ZXMoc2VjdGlvbkNhY2hlKS5pbmNsdWRlcyh2YWx1ZSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0cGFnZXMuc29tZSgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAhdGl0bGUuZW5kc1dpdGgoJy9kb2MnKTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ21lZGlhd2lraS5UaXRsZScpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbW9kZXMgPSB1bmlxdWVBcnJheShcblx0XHRcdFx0Ly8gUmVwbGFjZSBgbmV3IFNldCgpYCB0byBhdm9pZCBwb2x5ZmlsbGluZyBjb3JlLWpzXG5cdFx0XHRcdHBhZ2VzLm1hcCgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aXRsZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3RlbXBsYXRlJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdCA9IG5ldyBtdy5UaXRsZSh0aXRsZSksXG5cdFx0XHRcdFx0XHRuYW1lc3BhY2UgPSB0LmdldE5hbWVzcGFjZUlkKCk7XG5cdFx0XHRcdFx0aWYgKG5hbWVzcGFjZSAlIDIpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnbWVkaWF3aWtpJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgbW9kZSA9IEVYVFNbdC5nZXRFeHRlbnNpb24oKT8udG9Mb3dlckNhc2UoKSB8fCAnJ10gfHwgTkFNRVNQQUNFU1tuYW1lc3BhY2VdO1xuXHRcdFx0XHRcdGlmIChtb2RlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ2phdmFzY3JpcHQnICYmIChuYW1lc3BhY2UgPT09IDggfHwgbmFtZXNwYWNlID09PSAyMzAwKSA/ICdnYWRnZXQnIDogbW9kZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG5hbWVzcGFjZSA9PT0gMTAgfHwgbmFtZXNwYWNlID09PSAyID8gJ3RlbXBsYXRlJyA6ICdtZWRpYXdpa2knO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGlmIChtb2Rlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Y29uc3QgW21vZGVdID0gbW9kZXM7XG5cdFx0XHRcdGlmIChtb2RlID09PSAnZ2FkZ2V0Jykge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnLCA4XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ3RlbXBsYXRlJyA/IFsnbWVkaWF3aWtpJywgMTBdIDogW21vZGUhXTtcblx0XHRcdH0gZWxzZSBpZiAobW9kZXMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlmIChtb2Rlcy5pbmNsdWRlcygnamF2YXNjcmlwdCcpICYmIG1vZGVzLmluY2x1ZGVzKCdnYWRnZXQnKSkge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnXTtcblx0XHRcdFx0fSBlbHNlIGlmIChtb2Rlcy5pbmNsdWRlcygnbWVkaWF3aWtpJykgJiYgbW9kZXMuaW5jbHVkZXMoJ3RlbXBsYXRlJykpIHtcblx0XHRcdFx0XHRyZXR1cm4gWydtZWRpYXdpa2knXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoKG5zICE9PSAyNzQgJiYgY29udGVudG1vZGVsICE9PSAnU2NyaWJ1bnRvJykgfHwgcGFnZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRyZXR1cm4gW0NPTlRFTlRNT0RFTFNbY29udGVudG1vZGVsXSB8fCBjb250ZW50bW9kZWwsIGNvbnRlbnRtb2RlbCA9PT0gJ2phdmFzY3JpcHQnID8gbnMgOiB1bmRlZmluZWRdO1xuXHRcdH1cblx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ29vanMtdWktd2luZG93cycpO1xuXHRcdGlmIChcblx0XHRcdGF3YWl0IE9PLnVpLmNvbmZpcm0obXcubXNnKCdjbS1tdy1jb250ZW50bW9kZWwnKSwge1xuXHRcdFx0XHRhY3Rpb25zOiBbe2xhYmVsOiBucyA9PT0gMjc0ID8gJ1dpZGdldCcgOiAnTHVhJ30sIHtsYWJlbDogJ1dpa2l0ZXh0JywgYWN0aW9uOiAnYWNjZXB0J31dLFxuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdHJldHVybiBbJ21lZGlhd2lraSddO1xuXHRcdH1cblx0XHRyZXR1cm4gW25zID09PSAyNzQgPyAnaHRtbCcgOiAnbHVhJ107XG5cdH07XG5cblx0LyoqXG5cdCAqIOa4suafk+e8lui+keWZqFxuXHQgKlxuXHQgKiBAcGFyYW0ge0pRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Pn0gJHRhcmdldCDnm67moIfnvJbovpHmoYZcblx0ICogQHBhcmFtIHtib29sZWFufSBzZXR0aW5nIOaYr+WQpuaYr1dpa2lwbHVz6K6+572u77yI5L2/55SoanNvbuivreazle+8iVxuXHQgKi9cblx0Y29uc3QgcmVuZGVyRWRpdG9yID0gYXN5bmMgKCR0YXJnZXQ6IEpRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Piwgc2V0dGluZzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdGNvbnN0IGNtID0gYXdhaXQgKFxuXHRcdFx0YXdhaXQgQ29kZU1pcnJvcjZcblx0XHQpLmZyb21UZXh0QXJlYSgkdGFyZ2V0WzBdISwgLi4uKHNldHRpbmcgPyAoWydqc29uJ10gYXMgW3N0cmluZ10pIDogYXdhaXQgZ2V0UGFnZU1vZGUoJHRhcmdldC52YWwoKSEpKSk7XG5cdFx0aWYgKGNtLnZpZXcpIHtcblx0XHRcdGNtLnZpZXcuZG9tLmlkID0gJ1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXHRcdH1cblxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LUp1bXAgPiBhJykhLmhyZWYgPSAnI1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXG5cdFx0aWYgKCFzZXR0aW5nKSB7XG5cdFx0XHQvLyDmma7pgJpXaWtpcGx1c+e8lui+keWMulxuXHRcdFx0Y29uc3Qgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IGdldE9iamVjdCgnV2lraXBsdXNfU2V0dGluZ3MnKSxcblx0XHRcdFx0ZXNjVG9FeGl0UXVpY2tFZGl0ID0gc2V0dGluZ3MgJiYgKHNldHRpbmdzWydlc2NfdG9fZXhpdF9xdWlja2VkaXQnXSB8fCBzZXR0aW5nc1snZXNjVG9FeGl0UXVpY2tFZGl0J10pLFxuXHRcdFx0XHRzdWJtaXQgPSAvKiog5o+Q5Lqk57yW6L6RIEByZXR1cm4gdHJ1ZSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1TdWJtaXQnKSEuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Ym1pdE1pbm9yID0gLyoqIOaPkOS6pOWwj+e8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI1dpa2lwbHVzLVF1aWNrZWRpdC1NaW5vckVkaXQnKSEuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Ym1pdCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlc2NhcGVFZGl0ID0gLyoqIOaMieS4i0VzY+mUrumAgOWHuue8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1CYWNrJykhLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9O1xuXHRcdFx0Y20uZXh0cmFLZXlzKFtcblx0XHRcdFx0e2tleTogJ01vZC1TJywgcnVuOiBzdWJtaXR9LFxuXHRcdFx0XHR7a2V5OiAnU2hpZnQtTW9kLVMnLCBydW46IHN1Ym1pdE1pbm9yfSxcblx0XHRcdFx0Li4uKGVzY1RvRXhpdFF1aWNrRWRpdCA9PT0gdHJ1ZSB8fCBlc2NUb0V4aXRRdWlja0VkaXQgPT09ICd0cnVlJ1xuXHRcdFx0XHRcdD8gW3trZXk6ICdFc2MnLCBydW46IGVzY2FwZUVkaXR9XVxuXHRcdFx0XHRcdDogW10pLFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0LyoqIEB0b2RvIOS7peS4i+i/h+a4oeS7o+eggea3u+WKoOS6jjIwMjQtMDItMDfvvIzlsIbkuo7kuIDmrrXml7bpl7TlkI7lvIPnlKggKi9cblx0XHRjb25zdCBvbGRLZXkgPSAnV2lraXBsdXMtaGlnaGxpZ2h0LWFkZG9ucycsXG5cdFx0XHRvbGRQcmVmczogc3RyaW5nW10gfCBudWxsID0gZ2V0T2JqZWN0KG9sZEtleSksXG5cdFx0XHRtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0XHRhY3RpdmVMaW5lOiAnaGlnaGxpZ2h0QWN0aXZlTGluZScsXG5cdFx0XHRcdHRyYWlsaW5nc3BhY2U6ICdoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UnLFxuXHRcdFx0XHRtYXRjaEJyYWNrZXRzOiAnYnJhY2tldE1hdGNoaW5nJyxcblx0XHRcdFx0Y2xvc2VCcmFja2V0czogJ2Nsb3NlQnJhY2tldHMnLFxuXHRcdFx0XHRtYXRjaFRhZ3M6ICd0YWdNYXRjaGluZycsXG5cdFx0XHRcdGZvbGQ6ICdjb2RlRm9sZGluZycsXG5cdFx0XHRcdHdpa2lFZGl0b3I6ICd3aWtpRWRpdG9yJyxcblx0XHRcdFx0ZXNjYXBlOiAnZXNjYXBlJyxcblx0XHRcdFx0Y29udGV4dG1lbnU6ICdvcGVuTGlua3MnLFxuXHRcdFx0XHRsaW50OiAnbGludCcsXG5cdFx0XHR9O1xuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG9sZEtleSk7XG5cdFx0aWYgKG9sZFByZWZzKSB7XG5cdFx0XHRjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IGsgb2Ygb2xkUHJlZnMpIHtcblx0XHRcdFx0aWYgKGsgaW4gbWFwcGluZykge1xuXHRcdFx0XHRcdG9ialttYXBwaW5nW2tdIV0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNtLnByZWZlcihvYmopO1xuXHRcdH1cblx0fTtcblxuXHQvLyDnm5Hop4YgV2lraXBsdXMg57yW6L6R5qGGXG5cdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHJlY29yZHMpID0+IHtcblx0XHRjb25zdCAkZWRpdEFyZWEgPSAkKFxuXHRcdFx0cmVjb3Jkcy5mbGF0TWFwKCh7YWRkZWROb2Rlc30pID0+IHtcblx0XHRcdFx0cmV0dXJuIFsuLi5hZGRlZE5vZGVzXTtcblx0XHRcdH0pXG5cdFx0KS5maW5kPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LCAjV2lraXBsdXMtU2V0dGluZy1JbnB1dCcpO1xuXHRcdGlmICgkZWRpdEFyZWEubGVuZ3RoID4gMCkge1xuXHRcdFx0dm9pZCByZW5kZXJFZGl0b3IoJGVkaXRBcmVhLCAkZWRpdEFyZWEuYXR0cignaWQnKSA9PT0gJ1dpa2lwbHVzLVNldHRpbmctSW5wdXQnKTtcblx0XHR9XG5cdH0pO1xuXHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtjaGlsZExpc3Q6IHRydWV9KTtcblxuXHRtdy5sb2FkZXIubG9hZChgJHtDRE59LyR7UkVQT19DRE59QCR7dmVyc2lvbn0vc3R5bGVzLm1pbi5jc3NgLCAndGV4dC9jc3MnKTtcbn0pKCk7XG5cbmV4cG9ydCB7fTtcbiIsICJpbXBvcnQge2luaXRNd0FwaX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuY29uc3QgYXBpOiBtdy5BcGkgPSBpbml0TXdBcGkoJ1dpa2lwbHVzLWhpZ2hsaWdodC8yLjAnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgImltcG9ydCB7YXBpfSBmcm9tICcuL2FwaSc7XG5cbmNvbnN0IGNoZWNrRGVwZW5kZW5jaWVzID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoIW13LnVzZXIub3B0aW9ucy5nZXQoJ2dhZGdldC1XaWtpcGx1cycpKSB7XG5cdFx0dm9pZCBhcGkucG9zdFdpdGhFZGl0VG9rZW4oe1xuXHRcdFx0YWN0aW9uOiAnb3B0aW9ucycsXG5cdFx0XHRjaGFuZ2U6ICdnYWRnZXQtV2lraXBsdXM9MScsXG5cdFx0fSBhcyBBcGlPcHRpb25zUGFyYW1zKTtcblxuXHRcdGF3YWl0IG13LmxvYWRlci51c2luZygnZXh0LmdhZGdldC5XaWtpcGx1cycpO1xuXHR9XG59O1xuXG5leHBvcnQge2NoZWNrRGVwZW5kZW5jaWVzfTtcbiIsICJpbXBvcnQgJy4vV2lraXBsdXMtaGlnaGxpZ2h0Lmxlc3MnO1xuaW1wb3J0IHtjaGVja0RlcGVuZGVuY2llc30gZnJvbSAnLi9tb2R1bGVzL2NoZWNrRGVwZW5kZW5jaWVzJztcblxuKGFzeW5jIGZ1bmN0aW9uIFdpa2lwbHVzSGlnaGxpZ2h0KCkge1xuXHR2b2lkIGNoZWNrRGVwZW5kZW5jaWVzKCk7XG5cdGNvbnN0IHt3Z0FjdGlvbiwgd2dJc0FydGljbGV9ID0gbXcuY29uZmlnLmdldCgpO1xuXHRpZiAod2dBY3Rpb24gIT09ICd2aWV3JyB8fCAhd2dJc0FydGljbGUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB7J3Zpc3VhbGVkaXRvci1lbmFibGUnOiBpc1ZlRW5hYmxlfSA9IG13LnVzZXIub3B0aW9ucy5nZXQoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuXHQvKiBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpcGx1cy9XaWtpcGx1cy9pc3N1ZXMvNjU+ICovXG5cdGlmIChpc1ZlRW5hYmxlKSB7XG5cdFx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQudmlzdWFsRWRpdG9yLmNvcmUnKTtcblx0fVxuXG5cdGlmICghKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50KSkge1xuXHRcdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL2hpZ2hsaWdodCcpO1xuXHR9XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsb0JBQUEsQ0FBQTtBQUFBLElBTUFDO0FBTkEsSUFBQUMsaUJBQUFDLE1BQUE7RUFBQSxnREFBQTtBQUFBO0FBTUFGLHlCQUEwQkcsUUFBQSxpQkFBQTtJQU4xQjs7Ozs7QUFRQSxLQUFDQyxhQUFZO0FBQ1osWUFBTTtRQUFDQztNQUFJLElBQUlDLElBQ2Q7UUFBQ0M7TUFBSSxJQUFJRjtBQUNWLFVBQUlFLFNBQUEsUUFBQUEsU0FBQSxVQUFBQSxLQUFNQyxTQUFTO0FBQ2xCO01BQ0Q7QUFDQSxZQUFNQSxVQUFVO0FBQ2hCSCxXQUFLLE1BQU0sSUFBSTtRQUFDRztRQUFTQyxXQUFXO1FBQU8sR0FBR0Y7TUFBSTtBQUdsRCxZQUFNRyxNQUFNLDRCQUNYQyxTQUFBLGtDQUFBQyxPQUEyQ1AsS0FBSyxNQUFNLEVBQUVJLGFBQWEsVUFBUSxpQkFBQSxHQUM3RUksV0FBVztBQUVaLE9BQUFULFVBQUFVLFFBQU9DLGdCQUFQWCxRQUFPVyxjQUFnQixJQUFJQyxRQUFTQyxhQUFZO0FBQy9DLGNBQU1DLFNBQVNDLFNBQVNDLGNBQWMsUUFB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TCxhQUFtQztBQUNuQyxTQUFLbUUsa0JBQWtCO0FBQ3ZCLFVBQU07TUFBQ007TUFBVUM7SUFBVyxJQUFJekosR0FBRzBCLE9BQU9DLElBQUk7QUFDOUMsUUFBSTZILGFBQWEsVUFBVSxDQUFDQyxhQUFhO0FBQ3hDO0lBQ0Q7QUFFQSxVQUFNO01BQUMsdUJBQXVCQztJQUFVLElBQUkxSixHQUFHb0osS0FBS0MsUUFBUTFILElBQUk7QUFHaEUsUUFBSStILFlBQVk7QUFDZixZQUFNMUosR0FBR3dELE9BQU9DLE1BQU0sdUJBQXVCO0lBQzlDO0FBRUEsUUFBSSxFQUFFLGtCQUFrQjVDLFdBQVc7QUFDbEMsWUFBTUgsUUFBQUMsUUFBQSxFQUFBZ0osS0FBQSxPQUFBaEssZUFBQSxHQUFBRixrQkFBQTtJQUNQO0VBQ0QsQ0FBQTtBQUFBLFdBakJnQm1LLG9CQUFBO0FBQUEsV0FBQUMsbUJBQUEvRSxNQUFBLE1BQUFDLFNBQUE7RUFBQTtBQUFBLFNBQUE2RTtBQUFBLEdBQUEsRUFpQmI7IiwKICAibmFtZXMiOiBbImhpZ2hsaWdodF9leHBvcnRzIiwgImltcG9ydF9leHRfZ2FkZ2V0MiIsICJpbml0X2hpZ2hsaWdodCIsICJfX2VzbSIsICJyZXF1aXJlIiwgIl93aW5kb3ciLCAibGlicyIsICJtdyIsICJ3cGhsIiwgInZlcnNpb24iLCAiY21WZXJzaW9uIiwgIkNETiIsICJNV19DRE4iLCAiY29uY2F0IiwgIlJFUE9fQ0ROIiwgIndpbmRvdyIsICJDb2RlTWlycm9yNiIsICJQcm9taXNlIiwgInJlc29sdmUiLCAic2NyaXB0IiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJ0eXBlIiwgInNyYyIsICJoZWFkIiwgImFwcGVuZCIsICJ3Z1BhZ2VOYW1lIiwgInBhZ2UiLCAid2dOYW1lc3BhY2VOdW1iZXIiLCAibnMiLCAid2dQYWdlQ29udGVudE1vZGVsIiwgImNvbnRlbnRtb2RlbCIsICJjb25maWciLCAiZ2V0IiwgIkNPTlRFTlRNT0RFTFMiLCAid2lraXRleHQiLCAiRVhUUyIsICJjc3MiLCAianMiLCAianNvbiIsICJOQU1FU1BBQ0VTIiwgImdldE9iamVjdCIsICJrZXkiLCAiSlNPTiIsICJwYXJzZSIsICJTdHJpbmciLCAibG9jYWxTdG9yYWdlIiwgImdldEl0ZW0iLCAiZ2V0UGFnZU1vZGUiLCAiX3JlZiIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJ2YWx1ZSIsICJfV2lraXBsdXNQYWdlcyIsICJwYWdlcyIsICJPYmplY3QiLCAidmFsdWVzIiwgImZpbHRlciIsICJzZWN0aW9uQ2FjaGUiLCAiaW5jbHVkZXMiLCAic29tZSIsICJ0aXRsZSIsICJlbmRzV2l0aCIsICJsb2FkZXIiLCAidXNpbmciLCAibW9kZXMiLCAidW5pcXVlQXJyYXkiLCAibWFwIiwgIl90JGdldEV4dGVuc2lvbiIsICJ0IiwgIlRpdGxlIiwgIm5hbWVzcGFjZSIsICJnZXROYW1lc3BhY2VJZCIsICJtb2RlIiwgImdldEV4dGVuc2lvbiIsICJ0b0xvd2VyQ2FzZSIsICJsZW5ndGgiLCAiT08iLCAidWkiLCAiY29uZmlybSIsICJtc2ciLCAiYWN0aW9ucyIsICJsYWJlbCIsICJhY3Rpb24iLCAiX3giLCAiYXBwbHkiLCAiYXJndW1lbnRzIiwgInJlbmRlckVkaXRvciIsICJfcmVmMiIsICIkdGFyZ2V0IiwgInNldHRpbmciLCAiY20iLCAiZnJvbVRleHRBcmVhIiwgInZhbCIsICJ2aWV3IiwgImRvbSIsICJpZCIsICJxdWVyeVNlbGVjdG9yIiwgImhyZWYiLCAic2V0dGluZ3MiLCAiZXNjVG9FeGl0UXVpY2tFZGl0IiwgInN1Ym1pdCIsICJkaXNwYXRjaEV2ZW50IiwgIk1vdXNlRXZlbnQiLCAic3VibWl0TWlub3IiLCAiY2hlY2tlZCIsICJlc2NhcGVFZGl0IiwgImV4dHJhS2V5cyIsICJydW4iLCAib2xkS2V5IiwgIm9sZFByZWZzIiwgIm1hcHBpbmciLCAiYWN0aXZlTGluZSIsICJ0cmFpbGluZ3NwYWNlIiwgIm1hdGNoQnJhY2tldHMiLCAiY2xvc2VCcmFja2V0cyIsICJtYXRjaFRhZ3MiLCAiZm9sZCIsICJ3aWtpRWRpdG9yIiwgImVzY2FwZSIsICJjb250ZXh0bWVudSIsICJsaW50IiwgInJlbW92ZUl0ZW0iLCAib2JqIiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJzIiwgIm4iLCAiZG9uZSIsICJrIiwgImVyciIsICJlIiwgImYiLCAicHJlZmVyIiwgIl94MiIsICJfeDMiLCAib2JzZXJ2ZXIiLCAiTXV0YXRpb25PYnNlcnZlciIsICJyZWNvcmRzIiwgIiRlZGl0QXJlYSIsICIkIiwgImZsYXRNYXAiLCAiYWRkZWROb2RlcyIsICJmaW5kIiwgImF0dHIiLCAib2JzZXJ2ZSIsICJib2R5IiwgImNoaWxkTGlzdCIsICJsb2FkIiwgImltcG9ydF9leHRfZ2FkZ2V0IiwgImFwaSIsICJpbml0TXdBcGkiLCAiY2hlY2tEZXBlbmRlbmNpZXMiLCAiX3JlZjMiLCAidXNlciIsICJvcHRpb25zIiwgInBvc3RXaXRoRWRpdFRva2VuIiwgImNoYW5nZSIsICJ3Z0FjdGlvbiIsICJ3Z0lzQXJ0aWNsZSIsICJpc1ZlRW5hYmxlIiwgInRoZW4iLCAiV2lraXBsdXNIaWdobGlnaHQiLCAiX1dpa2lwbHVzSGlnaGxpZ2h0Il0KfQo=