heekangpark_obsidian-hk-cod.../dist/main.js
Heekang Park af9b485b77 v0.1.0
2023-02-08 18:14:46 +09:00

674 lines
98 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => HKCodeBlockPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian3 = require("obsidian");
// src/HKCodeBlockSettings.ts
var DEFAULT_SETTINGS = {
useTitleGlobal: "default off, but on when specified",
useLinenosGlobal: "default off, but on when specified",
defaultLinenosStart: 1,
showLinenosSplitter: true,
useHighlightGlobal: "default off, but on when specified",
highlightColor: "#ff0000",
useLanguageGlobal: "default on, but off when specified",
defaultLanguage: "plain text",
useCopyBtnGlobal: "default on, but off when specified",
usePromptGlobal: "default on, but off when specified",
promptingLanguages: ["bash"],
defaultPrompt: "$",
useResultGlobal: "enable",
defaultResultPrompt: "Result",
debugMode: false
};
// src/HKCodeBlockSettingTab.ts
var import_obsidian = require("obsidian");
var fragWithHTML = (text) => {
return createFragment((frag) => {
frag.createDiv().innerHTML = text.split("\n").map((line) => line.trim()).join("<br>");
});
};
var HKCodeBlockSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app2, plugin) {
super(app2, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Title" });
new import_obsidian.Setting(containerEl).setName("Use Title").setDesc(fragWithHTML(`- <b>default off, but on when specified</b> : the title will only be shown if the title statement is specified
- <b>always off</b> : the title will never be shown`)).addDropdown(
(tc) => tc.addOptions({
"default off, but on when specified": "default off, but on when specified",
"always off": "always off"
}).setValue(this.plugin.settings.useTitleGlobal).onChange(async (value) => {
this.plugin.settings.useTitleGlobal = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Line Numbers" });
new import_obsidian.Setting(containerEl).setName("Use Line Numbers").setDesc(fragWithHTML(`- <b>always on</b> : line numbers will always be shown
- <b>default on, but off when specified</b> : line numbers will always be shown, but will not be shown if linenos statement is specified as false
- <b>default off, but on when specified</b> : line numbers will only be shown if the linenos statement is specified as true
- <b>always off</b> : line numbers will never be shown`)).addDropdown(
(tc) => tc.addOptions({
"always on": "always on",
"default on, but off when specified": "default on, but off when specified",
"default off, but on when specified": "default off, but on when specified",
"always off": "always off"
}).setValue(this.plugin.settings.useLinenosGlobal).onChange(async (value) => {
this.plugin.settings.useLinenosGlobal = value;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Default Line Number Start").setDesc("The default line number start of the code block.").addText(
(tc) => tc.setValue(this.plugin.settings.defaultLinenosStart.toString()).onChange(async (value) => {
const num = parseInt(value);
if (isNaN(num))
return;
this.plugin.settings.defaultLinenosStart = num;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Show Line Number Splitter").addToggle(
(tc) => tc.setValue(this.plugin.settings.showLinenosSplitter).onChange(async (value) => {
this.plugin.settings.showLinenosSplitter = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Line Highlight" });
new import_obsidian.Setting(containerEl).setName("Use Line Highlight").setDesc(fragWithHTML(`- <b>default off, but on when specified</b> : line highlight will only be shown if the line highlight statement is specified
- <b>always off</b> : line highlight will never be shown`)).addDropdown(
(tc) => tc.addOptions({
"default off, but on when specified": "default off, but on when specified",
"always off": "always off"
}).setValue(this.plugin.settings.useHighlightGlobal).onChange(async (value) => {
this.plugin.settings.useHighlightGlobal = value;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Line Highlight Color").setDesc("The background color of the highlighted line. Note that the given color will be applied with 0.2 opacity.").addText(
(tc) => tc.setValue(this.plugin.settings.highlightColor).onChange(async (value) => {
this.plugin.settings.highlightColor = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Language Indicator" });
new import_obsidian.Setting(containerEl).setName("Use Language Indicator").setDesc(fragWithHTML(`- <b>always on</b> : language indicator will always be shown
- <b>default on, but off when specified</b> : language indicator will always be shown, but will not be shown if the language indicator statement is specified as false
- <b>default off, but on when specified</b> : language indicator will only be shown if the language indicator statement is specified as true
- <b>always off</b> : language indicator will never be shown`)).addDropdown(
(tc) => tc.addOptions({
"always on": "always on",
"default on, but off when specified": "default on, but off when specified",
"default off, but on when specified": "default off, but on when specified",
"always off": "always off"
}).setValue(this.plugin.settings.useLanguageGlobal).onChange(async (value) => {
this.plugin.settings.useLanguageGlobal = value;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Default Language").setDesc("The default language name of the code block if the language is not specified.").addText(
(tc) => tc.setValue(this.plugin.settings.defaultLanguage).onChange(async (value) => {
this.plugin.settings.defaultLanguage = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Copy Button" });
new import_obsidian.Setting(containerEl).setName("Use Copy Button").setDesc(fragWithHTML(`- <b>always on</b> : copy button will always be shown
- <b>default on, but off when specified</b> : copy button will always be shown, but will not be shown if the copy button statement is specified as false
- <b>default off, but on when specified</b> : copy button will only be shown if the copy button statement is specified as true
- <b>always off</b> : copy button will never be shown`)).addDropdown(
(tc) => tc.addOptions({
"always on": "always on",
"default on, but off when specified": "default on, but off when specified",
"default off, but on when specified": "default off, but on when specified",
"always off": "always off"
}).setValue(this.plugin.settings.useCopyBtnGlobal).onChange(async (value) => {
this.plugin.settings.useCopyBtnGlobal = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Prompt" });
new import_obsidian.Setting(containerEl).setName("Use Prompt").setDesc(fragWithHTML(`- <b>always on</b> : prompt will always be shown
- <b>default on, but off when specified</b> : prompt will always be shown, but will not be shown if the prompt statement is specified as false
- <b>default off, but on when specified</b> : prompt will only be shown if the prompt statement is specified as true
- <b>always off</b> : prompt will never be shown
You can also specify the prompt by the statement like \`prompt:"My Prompt"\`. (default: "$")`)).addDropdown(
(tc) => tc.addOptions({
"always on": "always on",
"default on, but off when specified": "default on, but off when specified",
"default off, but on when specified": "default off, but on when specified",
"always off": "always off"
}).setValue(this.plugin.settings.usePromptGlobal).onChange(async (value) => {
this.plugin.settings.usePromptGlobal = value;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Prompting Languages").setDesc("The languages that will be prompted by default. You can specify multiple languages by separating them with enters.").addTextArea(
(tc) => tc.setValue(this.plugin.settings.promptingLanguages.join("\n")).onChange(async (value) => {
const lines = value.split("\n").filter((line) => line.trim() !== "");
this.plugin.settings.promptingLanguages = lines;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Default Prompt").setDesc("The default prompt of the bash code block.").addText(
(tc) => tc.setValue(this.plugin.settings.defaultPrompt).onChange(async (value) => {
this.plugin.settings.defaultPrompt = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Result" });
new import_obsidian.Setting(containerEl).setName("Use Result").setDesc(fragWithHTML(`- <b>enable</b> : treat the code block starts like \`\`\`\`result\` as the result of the adjacent previous code block
- <b>disable</b> : treat the code block with \`result\` as its language name as a normal code block`)).addDropdown(
(tc) => tc.addOptions({
"enable": "enable",
"disable": "disable"
}).setValue(this.plugin.settings.useResultGlobal).onChange(async (value) => {
this.plugin.settings.useResultGlobal = value;
await this.plugin.saveSettings();
})
);
new import_obsidian.Setting(containerEl).setName("Default Result Prompt").setDesc("The default prompt of the result code block.").addText(
(tc) => tc.setValue(this.plugin.settings.defaultResultPrompt).onChange(async (value) => {
this.plugin.settings.defaultResultPrompt = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "Developers" });
new import_obsidian.Setting(containerEl).setName("Debug Mode").setDesc("Show logs in the console.").addToggle(
(tc) => tc.setValue(this.plugin.settings.debugMode).onChange(async (value) => {
this.plugin.settings.debugMode = value;
await this.plugin.saveSettings();
})
);
}
};
// src/HKCodeBlockProcessor.ts
var import_obsidian2 = require("obsidian");
var REGEX = {
TITLE: /\stitle:(?:'(.*?)'|"(.*?)")\s/,
LINENOS_SIMPLE: /\slinenos\s/,
LINENOS_COMPLICATE: /\slinenos:(true|false|(-{0,1}\d+))\s/,
HIGHLIGHT: /\shighlight:(?:'(.*?)'|"(.*?)")\s/,
LANGUAGE_FROM_CLASS: /^language-(\w+)$/,
LANGUAGE_SIMPLE: /\slanguage\s/,
LANGUAGE_COMPLICATE: /\slanguage:(true|false|'(.*?)'|"(.*?)")\s/,
COPYBTN_SIMPLE: /\scopybtn\s/,
COPYBTN_COMPLICATE: /\scopybtn:(true|false)\s/,
RESULT: /^```result\s/,
PROMPT_SIMPLE: /\sprompt\s/,
PROMPT_COMPLICATE: /\sprompt:(true|false|'(.*?)'|"(.*?)")\s/
};
function getMeta(view, elem_code, section_code, settings) {
const firstline = view.editor.getLine(section_code.lineStart) + " ";
let showTitle = void 0;
let title = "";
const regexResult_title = REGEX.TITLE.exec(firstline);
if (regexResult_title) {
showTitle = true;
title = regexResult_title[1] || regexResult_title[2];
}
let showLinenos = void 0;
let linenosStart = settings.defaultLinenosStart;
const linenosNum = section_code.lineEnd - section_code.lineStart - 1;
const regexResult_linenosSimple = REGEX.LINENOS_SIMPLE.exec(firstline);
const regexResult_linenosComplicate = REGEX.LINENOS_COMPLICATE.exec(firstline);
if (regexResult_linenosSimple) {
showLinenos = true;
} else if (regexResult_linenosComplicate) {
if (regexResult_linenosComplicate[1] === "true") {
showLinenos = true;
} else if (regexResult_linenosComplicate[1] === "false") {
showLinenos = false;
} else {
showLinenos = true;
linenosStart = parseInt(regexResult_linenosComplicate[2]) || 1;
}
}
let showHighlight = void 0;
let highlightLines = [];
const regexResult_highlight = REGEX.HIGHLIGHT.exec(firstline);
if (regexResult_highlight) {
showHighlight = true;
const highlightLines_str = regexResult_highlight[1] || regexResult_highlight[2];
highlightLines = highlightLines_str.split(",").map((line) => parseInt(line));
if (highlightLines.some((line) => isNaN(line))) {
showHighlight = void 0;
highlightLines = [];
} else {
highlightLines = highlightLines.filter((line) => line >= linenosStart && line < linenosStart + linenosNum);
}
}
let showLanguage = void 0;
let language = (() => {
let language2 = settings.defaultLanguage;
elem_code.classList.forEach((className) => {
const regexResult_languageFromClass = REGEX.LANGUAGE_FROM_CLASS.exec(className.trim());
if (regexResult_languageFromClass)
language2 = regexResult_languageFromClass[1];
});
return language2;
})();
const regexResult_languageSimple = REGEX.LANGUAGE_SIMPLE.exec(firstline);
const regexResult_languageComplicate = REGEX.LANGUAGE_COMPLICATE.exec(firstline);
if (regexResult_languageSimple) {
showLanguage = true;
} else if (regexResult_languageComplicate) {
if (regexResult_languageComplicate[1] === "true") {
showLanguage = true;
} else if (regexResult_languageComplicate[1] === "false") {
showLanguage = false;
} else {
showLanguage = true;
language = regexResult_languageComplicate[2] || regexResult_languageComplicate[3];
}
}
let showCopyBtn = void 0;
const regexResult_copyBtnSimple = REGEX.COPYBTN_SIMPLE.exec(firstline);
const regexResult_copyBtnComplicate = REGEX.COPYBTN_COMPLICATE.exec(firstline);
if (regexResult_copyBtnSimple) {
showCopyBtn = true;
} else if (regexResult_copyBtnComplicate) {
if (regexResult_copyBtnComplicate[1] === "true") {
showCopyBtn = true;
} else if (regexResult_copyBtnComplicate[1] === "false") {
showCopyBtn = false;
}
}
let showPrompt = void 0;
let prompt = settings.defaultPrompt;
const regexResult_promptSimple = REGEX.PROMPT_SIMPLE.exec(firstline);
const regexResult_promptComplicate = REGEX.PROMPT_COMPLICATE.exec(firstline);
if (regexResult_promptSimple) {
showPrompt = true;
} else if (regexResult_promptComplicate) {
if (regexResult_promptComplicate[1] === "true") {
showPrompt = true;
} else if (regexResult_promptComplicate[1] === "false") {
showPrompt = false;
} else {
showPrompt = true;
prompt = regexResult_promptComplicate[2] || regexResult_promptComplicate[3];
}
}
let isResult = false;
let resultPrompt = settings.defaultResultPrompt;
const regexResult_result = REGEX.RESULT.exec(firstline);
const regexResultPrompt_result = REGEX.PROMPT_COMPLICATE.exec(firstline);
if (regexResult_result) {
isResult = true;
showTitle = false;
showLanguage = false;
showCopyBtn = false;
showPrompt = false;
if (regexResultPrompt_result) {
resultPrompt = regexResultPrompt_result[2] || regexResultPrompt_result[3];
}
}
return {
showTitle,
title,
showLinenos,
linenosStart,
linenosNum,
showHighlight,
highlightLines,
showLanguage,
language,
showCopyBtn,
isResult,
resultPrompt,
showPrompt,
prompt
};
}
async function HKCodeBlockProcessor(el, context, plugin) {
const settings = plugin.settings;
const view = app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView);
if (!view)
return;
const elem_code = el.querySelector("pre:not(.frontmatter) > code");
if (!elem_code)
return;
const elem_pre = elem_code.parentElement;
if (!elem_pre)
return;
const elem_div = elem_pre.parentElement;
if (!elem_div)
return;
const elem_copyBtn = elem_div.querySelector(".copy-code-button");
if (!elem_copyBtn)
return;
const section_code = context.getSectionInfo(elem_code);
if (!section_code)
return;
const {
showTitle,
title,
showLinenos,
linenosStart,
linenosNum,
showHighlight,
highlightLines,
showLanguage,
language,
showCopyBtn,
isResult,
resultPrompt,
showPrompt,
prompt
} = getMeta(view, elem_code, section_code, settings);
if (settings.debugMode) {
console.log({
showTitle,
title,
showLinenos,
linenosStart,
linenosNum,
showHighlight,
highlightLines,
showLanguage,
language,
showCopyBtn,
isResult,
resultPrompt,
showPrompt,
prompt
});
}
elem_div.classList.add("hk-codeblock");
elem_code.classList.add("hk-codeblock-code");
elem_copyBtn.remove();
if (settings.useTitleGlobal === "default off, but on when specified" && showTitle === true) {
elem_div.classList.add("hk-codeblock-show-title");
const elem_title = document.createElement("div");
elem_title.classList.add("hk-codeblock-title");
elem_title.innerHTML = title;
elem_div.insertBefore(elem_title, elem_pre);
}
if (settings.useLinenosGlobal === "always on" || settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === void 0 || showLinenos === true) || settings.useLinenosGlobal === "default off, but on when specified" && showLinenos === true) {
elem_div.classList.add("hk-codeblock-show-linenos");
const elem_linenos = document.createElement("code");
elem_linenos.classList.add("hk-codeblock-linenos");
elem_linenos.innerText = Array(linenosNum).fill(0).map((_, idx) => idx + linenosStart).join("\n");
elem_pre.insertBefore(elem_linenos, elem_code);
if (settings.showLinenosSplitter) {
elem_linenos.classList.add("show-splitter");
}
}
if (settings.useHighlightGlobal === "default off, but on when specified" && showHighlight === true) {
elem_div.classList.add("hk-codeblock-show-highlight");
elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor);
const elem_highlight = document.createElement("code");
elem_highlight.classList.add("hk-codeblock-highlight");
elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => {
const classNames = [];
if (highlightLines.includes(idx + linenosStart))
classNames.push("highlight");
return `<span class="line line-${idx + linenosStart} ${classNames.join(" ")}"> </span>`;
}).join("\n");
elem_pre.insertBefore(elem_highlight, elem_code);
}
if (settings.useLanguageGlobal === "always on" || settings.useLanguageGlobal === "default on, but off when specified" && (showLanguage === void 0 || showLanguage === true) || settings.useLanguageGlobal === "default off, but on when specified" && showLanguage === true) {
elem_div.classList.add("hk-codeblock-show-language");
const elem_language = document.createElement("div");
elem_language.classList.add("hk-codeblock-language");
elem_language.innerText = language;
elem_pre.prepend(elem_language);
}
if (settings.useCopyBtnGlobal === "always on" || settings.useCopyBtnGlobal === "default on, but off when specified" && (showCopyBtn === void 0 || showCopyBtn === true) || settings.useCopyBtnGlobal === "default off, but on when specified" && showCopyBtn === true) {
elem_div.classList.add("hk-codeblock-show-copybtn");
elem_pre.appendChild(elem_copyBtn);
}
if (settings.usePromptGlobal === "always on" && settings.promptingLanguages.includes(language) || settings.usePromptGlobal === "default on, but off when specified" && settings.promptingLanguages.includes(language) && (showPrompt === void 0 || showPrompt === true) || settings.usePromptGlobal === "default off, but on when specified" && showPrompt === true) {
elem_div.classList.add("hk-codeblock-show-prompt");
let code_lines = elem_code.innerText.split("\n");
if (code_lines[code_lines.length - 1].trim().length == 0)
code_lines.pop();
const no_prompt_line_idxs = code_lines.map((line, idx) => {
if (line.trim().length == 0)
return idx + 1;
if (line.startsWith("#"))
return idx + 1;
return -1;
}).filter((idx) => idx != -1);
elem_pre.classList.add("command-line");
elem_pre.setAttribute("data-prompt", prompt);
elem_pre.setAttribute("data-continuation-str", "\\");
elem_pre.setAttribute("data-continuation-prompt", " ".repeat(prompt.length));
elem_pre.setAttribute("data-output", no_prompt_line_idxs.join(", "));
}
if (settings.useResultGlobal === "enable" && isResult === true) {
elem_div.classList.add("hk-codeblock-result");
elem_code.classList.add("hk-codeblock-result-code");
elem_div.setAttribute("data-result-prompt", resultPrompt);
}
}
// src/prism-plugins/prism-command-line.js
function PrismPlugin_CommandLine(Prism) {
if (typeof Prism === "undefined" || typeof document === "undefined") {
return;
}
var CLASS_PATTERN = /(?:^|\s)command-line(?:\s|$)/;
var PROMPT_CLASS = "command-line-prompt";
var startsWith = "".startsWith ? function(s, p) {
return s.startsWith(p);
} : function(s, p) {
return s.indexOf(p) === 0;
};
var endsWith = "".endsWith ? function(str, suffix) {
return str.endsWith(suffix);
} : function(str, suffix) {
var len = str.length;
return str.substring(len - suffix.length, len) === suffix;
};
function hasCommandLineInfo(env) {
var vars = env.vars = env.vars || {};
return "command-line" in vars;
}
function getCommandLineInfo(env) {
var vars = env.vars = env.vars || {};
return vars["command-line"] = vars["command-line"] || {};
}
Prism.hooks.add("before-highlight", function(env) {
var commandLine = getCommandLineInfo(env);
if (commandLine.complete || !env.code) {
commandLine.complete = true;
return;
}
var pre = env.element.parentElement;
if (!pre || !/pre/i.test(pre.nodeName) || // Abort only if neither the <pre> nor the <code> have the class
!CLASS_PATTERN.test(pre.className) && !CLASS_PATTERN.test(env.element.className)) {
commandLine.complete = true;
return;
}
var existingPrompt = env.element.querySelector("." + PROMPT_CLASS);
if (existingPrompt) {
existingPrompt.remove();
}
var codeLines = env.code.split("\n");
if (codeLines[codeLines.length - 1].trim().length === 0) {
commandLine.numberOfLines = codeLines.length - 1;
} else {
commandLine.numberOfLines = codeLines.length;
}
var outputLines = commandLine.outputLines = [];
var outputSections = pre.getAttribute("data-output");
var outputFilter = pre.getAttribute("data-filter-output");
if (outputSections !== null) {
outputSections.split(",").forEach(function(section) {
var range = section.split("-");
var outputStart = parseInt(range[0], 10);
var outputEnd = range.length === 2 ? parseInt(range[1], 10) : outputStart;
if (!isNaN(outputStart) && !isNaN(outputEnd)) {
if (outputStart < 1) {
outputStart = 1;
}
if (outputEnd > codeLines.length) {
outputEnd = codeLines.length;
}
outputStart--;
outputEnd--;
for (var j2 = outputStart; j2 <= outputEnd; j2++) {
outputLines[j2] = codeLines[j2];
codeLines[j2] = "";
}
}
});
} else if (outputFilter) {
for (var i = 0; i < codeLines.length; i++) {
if (startsWith(codeLines[i], outputFilter)) {
outputLines[i] = codeLines[i].slice(outputFilter.length);
codeLines[i] = "";
}
}
}
var continuationLineIndicies = commandLine.continuationLineIndicies = /* @__PURE__ */ new Set();
var lineContinuationStr = pre.getAttribute("data-continuation-str");
var continuationFilter = pre.getAttribute("data-filter-continuation");
for (var j = 0; j < codeLines.length; j++) {
var line = codeLines[j];
if (!line) {
continue;
}
if (lineContinuationStr && endsWith(line, lineContinuationStr)) {
continuationLineIndicies.add(j + 1);
}
if (j > 0 && continuationFilter && startsWith(line, continuationFilter)) {
codeLines[j] = line.slice(continuationFilter.length);
continuationLineIndicies.add(j);
}
}
env.code = codeLines.join("\n");
});
Prism.hooks.add("before-insert", function(env) {
var commandLine = getCommandLineInfo(env);
if (commandLine.complete) {
return;
}
var codeLines = env.highlightedCode.split("\n");
var outputLines = commandLine.outputLines || [];
for (var i = 0, l = codeLines.length; i < l; i++) {
if (outputLines.hasOwnProperty(i)) {
codeLines[i] = '<span class="token output">' + Prism.util.encode(outputLines[i]) + "</span>";
} else {
codeLines[i] = '<span class="token command">' + codeLines[i] + "</span>";
}
}
env.highlightedCode = codeLines.join("\n");
});
Prism.hooks.add("complete", function(env) {
if (!hasCommandLineInfo(env)) {
return;
}
var commandLine = getCommandLineInfo(env);
if (commandLine.complete) {
return;
}
var pre = env.element.parentElement;
if (CLASS_PATTERN.test(env.element.className)) {
env.element.className = env.element.className.replace(CLASS_PATTERN, " ");
}
if (!CLASS_PATTERN.test(pre.className)) {
pre.className += " command-line";
}
function getAttribute(key, defaultValue) {
return (pre.getAttribute(key) || defaultValue).replace(/"/g, "&quot");
}
var promptLines = "";
var rowCount = commandLine.numberOfLines || 0;
var promptText = getAttribute("data-prompt", "");
var promptLine;
if (promptText !== "") {
promptLine = '<span data-prompt="' + promptText + '"></span>';
} else {
var user = getAttribute("data-user", "user");
var host = getAttribute("data-host", "localhost");
promptLine = '<span data-user="' + user + '" data-host="' + host + '"></span>';
}
var continuationLineIndicies = commandLine.continuationLineIndicies || /* @__PURE__ */ new Set();
var continuationPromptText = getAttribute("data-continuation-prompt", ">");
var continuationPromptLine = '<span data-continuation-prompt="' + continuationPromptText + '"></span>';
for (var j = 0; j < rowCount; j++) {
if (continuationLineIndicies.has(j)) {
promptLines += continuationPromptLine;
} else {
promptLines += promptLine;
}
}
var prompt = document.createElement("span");
prompt.className = PROMPT_CLASS;
prompt.innerHTML = promptLines;
var outputLines = commandLine.outputLines || [];
for (var i = 0, l = outputLines.length; i < l; i++) {
if (outputLines.hasOwnProperty(i)) {
var node = prompt.children[i];
node.removeAttribute("data-user");
node.removeAttribute("data-host");
node.removeAttribute("data-prompt");
}
}
env.element.insertBefore(prompt, env.element.firstChild);
commandLine.complete = true;
});
}
// src/main.ts
var HKCodeBlockPlugin = class extends import_obsidian3.Plugin {
async onload() {
await this.loadSettings();
if (this.settings.debugMode) {
console.log("loading HKCodeBlock plugin");
}
const Prism = await (0, import_obsidian3.loadPrism)();
PrismPlugin_CommandLine(Prism);
this.addSettingTab(new HKCodeBlockSettingTab(this.app, this));
const processor = this.registerMarkdownPostProcessor((el, ctx) => {
HKCodeBlockProcessor(el, ctx, this);
});
processor.sortOrder = 100;
}
onunload() {
if (this.settings.debugMode) {
console.log("unloading HKCodeBlock plugin");
}
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiLCAiLi4vc3JjL3ByaXNtLXBsdWdpbnMvcHJpc20tY29tbWFuZC1saW5lLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4sIGxvYWRQcmlzbSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSAnLi9IS0NvZGVCbG9ja1NldHRpbmdzJztcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgSEtDb2RlQmxvY2tTZXR0aW5nVGFiIH0gZnJvbSAnLi9IS0NvZGVCbG9ja1NldHRpbmdUYWInO1xuaW1wb3J0IHsgSEtDb2RlQmxvY2tQcm9jZXNzb3IgfSBmcm9tICcuL0hLQ29kZUJsb2NrUHJvY2Vzc29yJztcblxuaW1wb3J0IHsgUHJpc21QbHVnaW5fQ29tbWFuZExpbmUgfSBmcm9tICcuL3ByaXNtLXBsdWdpbnMvcHJpc20tY29tbWFuZC1saW5lJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSEtDb2RlQmxvY2tQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncztcblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Z01vZGUpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgUHJpc20gPSBhd2FpdCBsb2FkUHJpc20oKTtcblxuXHRcdC8vIGFjdGl2YXRlIFByaXNtLmpzIHBsdWdpbnNcblx0XHRQcmlzbVBsdWdpbl9Db21tYW5kTGluZShQcmlzbSk7XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMaW5lbm9zU3RhcnQ6IG51bWJlcjtcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogYm9vbGVhbjtcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0aGlnaGxpZ2h0Q29sb3I6IHN0cmluZztcblxuXHR1c2VMYW5ndWFnZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZztcblx0XG5cdHVzZUNvcHlCdG5HbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XG5cdHVzZVByb21wdEdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0UHJvbXB0OiBzdHJpbmc7XG5cdFxuXHR1c2VSZXN1bHRHbG9iYWw6IChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRwcm9tcHRpbmdMYW5ndWFnZXM6IHN0cmluZ1tdO1xuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBzdHJpbmc7XG5cblx0ZGVidWdNb2RlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogSEtDb2RlQmxvY2tTZXR0aW5ncyA9IHtcblx0dXNlVGl0bGVHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZUxpbmVub3NHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGluZW5vc1N0YXJ0OiAxLFxuXHRzaG93TGluZW5vc1NwbGl0dGVyOiB0cnVlLFxuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGhpZ2hsaWdodENvbG9yOiBcIiNmZjAwMDBcIixcblxuXHR1c2VMYW5ndWFnZUdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGRlZmF1bHRMYW5ndWFnZTogXCJwbGFpbiB0ZXh0XCIsXG5cblx0dXNlQ29weUJ0bkdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlUHJvbXB0R2xvYmFsOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0cHJvbXB0aW5nTGFuZ3VhZ2VzOiBbXCJiYXNoXCJdLFxuXHRkZWZhdWx0UHJvbXB0OiBcIiRcIixcblxuXHR1c2VSZXN1bHRHbG9iYWw6IFwiZW5hYmxlXCIsXG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IFwiUmVzdWx0XCIsXG5cblx0ZGVidWdNb2RlOiBmYWxzZSxcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSAnLi9tYWluJztcblxuZXhwb3J0IGNvbnN0IGZyYWdXaXRoSFRNTCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcblx0cmV0dXJuIGNyZWF0ZUZyYWdtZW50KChmcmFnKSA9PiB7XG5cdFx0ZnJhZy5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmpvaW4oXCI8YnI+XCIpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEhLQ29kZUJsb2NrU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuXHRwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luKSB7XG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHQvLyB0aXRsZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1RpdGxlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBUaXRsZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgdGl0bGUgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSB0aXRsZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiB0aGUgdGl0bGUgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGl0bGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIGxpbmUgbnVtYmVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xpbmUgTnVtYmVycycgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBOdW1iZXJzJylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5hbHdheXMgb248L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgZmFsc2Vcblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxpbmVub3Mgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID0gdmFsdWUgYXMgKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdEZWZhdWx0IExpbmUgTnVtYmVyIFN0YXJ0Jylcblx0XHRcdC5zZXREZXNjKCdUaGUgZGVmYXVsdCBsaW5lIG51bWJlciBzdGFydCBvZiB0aGUgY29kZSBibG9jay4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExpbmVub3NTdGFydC50b1N0cmluZygpKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbnVtID0gcGFyc2VJbnQodmFsdWUpO1xuXHRcdFx0XHRcdFx0aWYgKGlzTmFOKG51bSkpIHJldHVybjtcblxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExpbmVub3NTdGFydCA9IG51bTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnU2hvdyBMaW5lIE51bWJlciBTcGxpdHRlcicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd0xpbmVub3NTcGxpdHRlciA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIGhpZ2hsaWdodFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xpbmUgSGlnaGxpZ2h0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBMaW5lIEhpZ2hsaWdodCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxpbmUgaGlnaGxpZ2h0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWRcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGxpbmUgaGlnaGxpZ2h0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VIaWdobGlnaHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VIaWdobGlnaHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0xpbmUgSGlnaGxpZ2h0IENvbG9yJylcblx0XHRcdC5zZXREZXNjKCdUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaGlnaGxpZ2h0ZWQgbGluZS4gTm90ZSB0aGF0IHRoZSBnaXZlbiBjb2xvciB3aWxsIGJlIGFwcGxpZWQgd2l0aCAwLjIgb3BhY2l0eS4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWdobGlnaHRDb2xvciA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsYW5ndWFnZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xhbmd1YWdlIEluZGljYXRvcicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGFuZ3VhZ2UgSW5kaWNhdG9yJylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5hbHdheXMgb248L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgbGFuZ3VhZ2UgaW5kaWNhdG9yIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgZmFsc2Vcblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJhbHdheXMgb25cIjogXCJhbHdheXMgb25cIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMYW5ndWFnZUdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMYW5ndWFnZScpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbmFtZSBvZiB0aGUgY29kZSBibG9jayBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHNwZWNpZmllZC4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcblx0XHQvLyBjb3B5IGJ1dHRvblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvcHkgQnV0dG9uJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb3B5IEJ1dHRvbicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGNvcHkgYnV0dG9uIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogY29weSBidXR0b24gd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID0gdmFsdWUgYXMgKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBwcm9tcHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdQcm9tcHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFByb21wdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIHByb21wdCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBwcm9tcHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBwcm9tcHQgd2lsbCBuZXZlciBiZSBzaG93blxuXHRcdFx0XHRZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgcHJvbXB0IGJ5IHRoZSBzdGF0ZW1lbnQgbGlrZSBcXGBwcm9tcHQ6XCJNeSBQcm9tcHRcIlxcYC4gKGRlZmF1bHQ6IFwiJFwiKWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVByb21wdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnUHJvbXB0aW5nIExhbmd1YWdlcycpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGxhbmd1YWdlcyB0aGF0IHdpbGwgYmUgcHJvbXB0ZWQgYnkgZGVmYXVsdC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxhbmd1YWdlcyBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBlbnRlcnMuJylcblx0XHRcdC5hZGRUZXh0QXJlYSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9tcHRpbmdMYW5ndWFnZXMuam9pbihcIlxcblwiKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpbmVzID0gdmFsdWUuc3BsaXQoXCJcXG5cIikuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09IFwiXCIpO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzID0gbGluZXM7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJEZWZhdWx0IFByb21wdFwiKVxuXHRcdFx0LnNldERlc2MoXCJUaGUgZGVmYXVsdCBwcm9tcHQgb2YgdGhlIGJhc2ggY29kZSBibG9jay5cIilcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRQcm9tcHQpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIHJlc3VsdFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1Jlc3VsdCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgUmVzdWx0Jylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5lbmFibGU8L2I+IDogdHJlYXQgdGhlIGNvZGUgYmxvY2sgc3RhcnRzIGxpa2UgXFxgXFxgXFxgXFxgcmVzdWx0XFxgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGFkamFjZW50IHByZXZpb3VzIGNvZGUgYmxvY2tcblx0XHRcdFx0LSA8Yj5kaXNhYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHdpdGggXFxgcmVzdWx0XFxgIGFzIGl0cyBsYW5ndWFnZSBuYW1lIGFzIGEgbm9ybWFsIGNvZGUgYmxvY2tgKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImVuYWJsZVwiOiBcImVuYWJsZVwiLFxuXHRcdFx0XHRcdFwiZGlzYWJsZVwiOiBcImRpc2FibGVcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlUmVzdWx0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlUmVzdWx0R2xvYmFsID0gdmFsdWUgYXMgKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJEZWZhdWx0IFJlc3VsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSByZXN1bHQgY29kZSBibG9jay5cIilcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIGZvciBkZXZlbG9wZXJzXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnRGV2ZWxvcGVycycgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdEZWJ1ZyBNb2RlJylcblx0XHRcdC5zZXREZXNjKCdTaG93IGxvZ3MgaW4gdGhlIGNvbnNvbGUuJylcblx0XHRcdC5hZGRUb2dnbGUodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdH1cbn0iLCAiaW1wb3J0IHsgTWFya2Rvd25WaWV3IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBIS0NvZGVCbG9ja1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XG5pbXBvcnQgdHlwZSB7IEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tIFwiLi9IS0NvZGVCbG9ja1NldHRpbmdzXCI7XG5cbmNvbnN0IFJFR0VYID0ge1xuICBUSVRMRTogL1xcc3RpdGxlOig/OicoLio/KSd8XCIoLio/KVwiKVxccy8sXG4gIExJTkVOT1NfU0lNUExFOiAvXFxzbGluZW5vc1xccy8sXG4gIExJTkVOT1NfQ09NUExJQ0FURTogL1xcc2xpbmVub3M6KHRydWV8ZmFsc2V8KC17MCwxfVxcZCspKVxccy8sXG4gIEhJR0hMSUdIVDogL1xcc2hpZ2hsaWdodDooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBMQU5HVUFHRV9GUk9NX0NMQVNTOiAvXmxhbmd1YWdlLShcXHcrKSQvLFxuICBMQU5HVUFHRV9TSU1QTEU6IC9cXHNsYW5ndWFnZVxccy8sXG4gIExBTkdVQUdFX0NPTVBMSUNBVEU6IC9cXHNsYW5ndWFnZToodHJ1ZXxmYWxzZXwnKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT1BZQlROX1NJTVBMRTogL1xcc2NvcHlidG5cXHMvLFxuICBDT1BZQlROX0NPTVBMSUNBVEU6IC9cXHNjb3B5YnRuOih0cnVlfGZhbHNlKVxccy8sXG4gIFJFU1VMVDogL15gYGByZXN1bHRcXHMvLFxuICBQUk9NUFRfU0lNUExFOiAvXFxzcHJvbXB0XFxzLyxcbiAgUFJPTVBUX0NPTVBMSUNBVEU6IC9cXHNwcm9tcHQ6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbn1cblxuZnVuY3Rpb24gZ2V0TWV0YSh2aWV3OiBNYXJrZG93blZpZXcsIGVsZW1fY29kZTogSFRNTEVsZW1lbnQsIHNlY3Rpb25fY29kZTogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24sIHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzKToge1xuICBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgdGl0bGU6IHN0cmluZyxcbiAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gIGxpbmVub3NOdW06IG51bWJlcixcbiAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgcHJvbXB0OiBzdHJpbmdcbn0ge1xuICBjb25zdCBmaXJzdGxpbmUgPSB2aWV3LmVkaXRvci5nZXRMaW5lKHNlY3Rpb25fY29kZS5saW5lU3RhcnQpICsgXCIgXCI7IC8vIGFkZCBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgdG8gbWFrZSBzdXJlIHRoZSByZWdleCB3b3Jrc1xuXG4gIC8vIHRpdGxlXG4gIGxldCBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IHRpdGxlID0gXCJcIjtcbiAgY29uc3QgcmVnZXhSZXN1bHRfdGl0bGUgPSBSRUdFWC5USVRMRS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF90aXRsZSkge1xuICAgIHNob3dUaXRsZSA9IHRydWU7XG4gICAgdGl0bGUgPSByZWdleFJlc3VsdF90aXRsZVsxXSB8fCByZWdleFJlc3VsdF90aXRsZVsyXTtcbiAgfVxuXG4gIC8vIGxpbmVub3NcbiAgbGV0IHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsaW5lbm9zU3RhcnQgPSBzZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0O1xuICBjb25zdCBsaW5lbm9zTnVtID0gc2VjdGlvbl9jb2RlLmxpbmVFbmQgLSBzZWN0aW9uX2NvZGUubGluZVN0YXJ0IC0gMTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGluZW5vc1NpbXBsZSA9IFJFR0VYLkxJTkVOT1NfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGUgPSBSRUdFWC5MSU5FTk9TX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfbGluZW5vc1NpbXBsZSkge1xuICAgIHNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dMaW5lbm9zID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgICAgIGxpbmVub3NTdGFydCA9IHBhcnNlSW50KHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzJdKSB8fCAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhpZ2hsaWdodFxuICBsZXQgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpID0gdW5kZWZpbmVkO1xuICBsZXQgaGlnaGxpZ2h0TGluZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodCA9IFJFR0VYLkhJR0hMSUdIVC5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9oaWdobGlnaHQpIHtcbiAgICBzaG93SGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICBjb25zdCBoaWdobGlnaHRMaW5lc19zdHIgPSByZWdleFJlc3VsdF9oaWdobGlnaHRbMV0gfHwgcmVnZXhSZXN1bHRfaGlnaGxpZ2h0WzJdO1xuICAgIGhpZ2hsaWdodExpbmVzID0gaGlnaGxpZ2h0TGluZXNfc3RyLnNwbGl0KFwiLFwiKS5tYXAoKGxpbmUpID0+IHBhcnNlSW50KGxpbmUpKTtcblxuICAgIGlmIChoaWdobGlnaHRMaW5lcy5zb21lKChsaW5lKSA9PiBpc05hTihsaW5lKSkpIHtcbiAgICAgIC8vIGlmIGFueSBlbGVtZW50IGlzIG5hbiwgdGhlbiBzZXQgc2hvd0hpZ2hsaWdodCB0byBmYWxzZVxuICAgICAgc2hvd0hpZ2hsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgIGhpZ2hsaWdodExpbmVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBvbmx5IHZhbGlkIGxpbmUgbnVtYmVyc1xuICAgICAgaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUgPj0gbGluZW5vc1N0YXJ0ICYmIGxpbmUgPCBsaW5lbm9zU3RhcnQgKyBsaW5lbm9zTnVtKTtcbiAgICB9XG4gIH1cblxuICAvLyBsYW5ndWFnZVxuICBsZXQgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsYW5ndWFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IGxhbmd1YWdlID0gc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlO1xuICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcyA9IFJFR0VYLkxBTkdVQUdFX0ZST01fQ0xBU1MuZXhlYyhjbGFzc05hbWUudHJpbSgpKTtcbiAgICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcykgbGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzc1sxXTtcbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ndWFnZTtcbiAgfSkoKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUgPSBSRUdFWC5MQU5HVUFHRV9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUgPSBSRUdFWC5MQU5HVUFHRV9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlU2ltcGxlKSB7XG4gICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICAgIGxhbmd1YWdlID0gcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVszXTtcbiAgICB9XG4gIH1cblxuICAvLyBjb3B5IGJ1dHRvblxuICBsZXQgc2hvd0NvcHlCdG46IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSA9IFJFR0VYLkNPUFlCVE5fU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGUgPSBSRUdFWC5DT1BZQlROX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSkge1xuICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJvbXB0XG4gIGxldCBzaG93UHJvbXB0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBwcm9tcHQgPSBzZXR0aW5ncy5kZWZhdWx0UHJvbXB0O1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRTaW1wbGUgPSBSRUdFWC5QUk9NUFRfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSkge1xuICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93UHJvbXB0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgICAgcHJvbXB0ID0gcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsyXSB8fCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc3VsdFxuICBsZXQgaXNSZXN1bHQgPSBmYWxzZTtcbiAgbGV0IHJlc3VsdFByb21wdCA9IHNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Jlc3VsdCA9IFJFR0VYLlJFU1VMVC5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Jlc3VsdCkge1xuICAgIGlzUmVzdWx0ID0gdHJ1ZTtcbiAgICBcbiAgICAvLyBvdmVycmlkZSBvdGhlciBtZXRhIGRhdGEgOiBvbmx5IGxpbmVub3MsIGhpZ2hsaWdodCBhcmUgYXZhaWxhYmxlXG4gICAgc2hvd1RpdGxlID0gZmFsc2U7XG4gICAgc2hvd0xhbmd1YWdlID0gZmFsc2U7XG4gICAgc2hvd0NvcHlCdG4gPSBmYWxzZTtcbiAgICBzaG93UHJvbXB0ID0gZmFsc2U7XG5cbiAgICBpZiAocmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0KSB7XG4gICAgICByZXN1bHRQcm9tcHQgPSByZWdleFJlc3VsdFByb21wdF9yZXN1bHRbMl0gfHwgcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0WzNdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIHNob3dMaW5lbm9zOiBzaG93TGluZW5vcyxcbiAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICBsaW5lbm9zTnVtOiBsaW5lbm9zTnVtLFxuICAgIHNob3dIaWdobGlnaHQ6IHNob3dIaWdobGlnaHQsXG4gICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgIHNob3dMYW5ndWFnZTogc2hvd0xhbmd1YWdlLFxuICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgaXNSZXN1bHQ6IGlzUmVzdWx0LFxuICAgIHJlc3VsdFByb21wdDogcmVzdWx0UHJvbXB0LFxuICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgcHJvbXB0OiBwcm9tcHRcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEhLQ29kZUJsb2NrUHJvY2Vzc29yKFxuICBlbDogSFRNTEVsZW1lbnQsXG4gIGNvbnRleHQ6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIHBsdWdpbjogSEtDb2RlQmxvY2tQbHVnaW5cbikge1xuICBjb25zdCBzZXR0aW5ncyA9IHBsdWdpbi5zZXR0aW5ncztcblxuICBjb25zdCB2aWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGlmICghdmlldykgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fY29kZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbC5xdWVyeVNlbGVjdG9yKFwicHJlOm5vdCguZnJvbnRtYXR0ZXIpID4gY29kZVwiKTtcbiAgaWYgKCFlbGVtX2NvZGUpIHJldHVybjtcblxuICBjb25zdCBlbGVtX3ByZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX2NvZGUucGFyZW50RWxlbWVudDtcbiAgaWYgKCFlbGVtX3ByZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fZGl2OiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fcHJlLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghZWxlbV9kaXYpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2NvcHlCdG46IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9kaXYucXVlcnlTZWxlY3RvcihcIi5jb3B5LWNvZGUtYnV0dG9uXCIpO1xuICBpZiAoIWVsZW1fY29weUJ0bikgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25fY29kZTogKE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHwgbnVsbCkgPSBjb250ZXh0LmdldFNlY3Rpb25JbmZvKGVsZW1fY29kZSk7XG4gIGlmICghc2VjdGlvbl9jb2RlKSByZXR1cm47XG5cbiAgLy8gZ2V0IG1ldGFkYXRhXG4gIGNvbnN0IHsgXG4gICAgc2hvd1RpdGxlLFxuICAgIHRpdGxlLFxuICAgIHNob3dMaW5lbm9zLFxuICAgIGxpbmVub3NTdGFydCxcbiAgICBsaW5lbm9zTnVtLFxuICAgIHNob3dIaWdobGlnaHQsXG4gICAgaGlnaGxpZ2h0TGluZXMsXG4gICAgc2hvd0xhbmd1YWdlLFxuICAgIGxhbmd1YWdlLFxuICAgIHNob3dDb3B5QnRuLFxuICAgIGlzUmVzdWx0LFxuICAgIHJlc3VsdFByb21wdCxcbiAgICBzaG93UHJvbXB0LFxuICAgIHByb21wdFxuICB9ID0gZ2V0TWV0YSh2aWV3LCBlbGVtX2NvZGUsIHNlY3Rpb25fY29kZSwgc2V0dGluZ3MpO1xuXG4gIGlmIChzZXR0aW5ncy5kZWJ1Z01vZGUpIHtcbiAgICBjb25zb2xlLmxvZyh7IFxuICAgICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICB9KVxuICB9XG5cbiAgLy8gY3JlYXRlIEhUTUwgZWxlbWVudHNcbiAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9ja1wiKTtcbiAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29kZVwiKTtcbiAgZWxlbV9jb3B5QnRuLnJlbW92ZSgpOyAvLyByZW1vdmUgdGhlIG9yaWdpbmFsIGNvcHkgYnV0dG9uIGFzIGRlZmF1bHRcblxuICBpZiAoc2V0dGluZ3MudXNlVGl0bGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93VGl0bGUgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXRpdGxlXCIpO1xuXG4gICAgY29uc3QgZWxlbV90aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWxlbV90aXRsZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXRpdGxlXCIpO1xuICAgIGVsZW1fdGl0bGUuaW5uZXJIVE1MID0gdGl0bGU7XG4gICAgZWxlbV9kaXYuaW5zZXJ0QmVmb3JlKGVsZW1fdGl0bGUsIGVsZW1fcHJlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMaW5lbm9zID09PSB1bmRlZmluZWQgfHwgc2hvd0xpbmVub3MgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xpbmVub3MgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGluZW5vc1wiKTtcblxuICAgIGNvbnN0IGVsZW1fbGluZW5vcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWxpbmVub3NcIik7XG4gICAgZWxlbV9saW5lbm9zLmlubmVyVGV4dCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IGlkeCArIGxpbmVub3NTdGFydCkuam9pbihcIlxcblwiKTtcbiAgICBlbGVtX3ByZS5pbnNlcnRCZWZvcmUoZWxlbV9saW5lbm9zLCBlbGVtX2NvZGUpO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIpIHtcbiAgICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwic2hvdy1zcGxpdHRlclwiKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0hpZ2hsaWdodCA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0XCIpO1xuXG4gICAgZWxlbV9kaXYuc3R5bGUuc2V0UHJvcGVydHkoXCItLWhrLWNvZGVibG9jay1oaWdobGlnaHQtYmFja2dyb3VuZC1jb2xvclwiLCBzZXR0aW5ncy5oaWdobGlnaHRDb2xvcik7XG5cbiAgICBjb25zdCBlbGVtX2hpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2staGlnaGxpZ2h0XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmlubmVySFRNTCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoaGlnaGxpZ2h0TGluZXMuaW5jbHVkZXMoaWR4ICsgbGluZW5vc1N0YXJ0KSkgY2xhc3NOYW1lcy5wdXNoKFwiaGlnaGxpZ2h0XCIpO1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxpbmUgbGluZS0ke2lkeCArIGxpbmVub3NTdGFydH0gJHtjbGFzc05hbWVzLmpvaW4oXCIgXCIpfVwiPiA8L3NwYW4+YDtcbiAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2hpZ2hsaWdodCwgZWxlbV9jb2RlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB1bmRlZmluZWQgfHwgc2hvd0xhbmd1YWdlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGFuZ3VhZ2UgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGFuZ3VhZ2VcIik7XG5cbiAgICBjb25zdCBlbGVtX2xhbmd1YWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xhbmd1YWdlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stbGFuZ3VhZ2VcIik7XG4gICAgZWxlbV9sYW5ndWFnZS5pbm5lclRleHQgPSBsYW5ndWFnZTtcbiAgICBlbGVtX3ByZS5wcmVwZW5kKGVsZW1fbGFuZ3VhZ2UpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHVuZGVmaW5lZCB8fCBzaG93Q29weUJ0biA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93Q29weUJ0biA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuXCIpO1xuXG4gICAgZWxlbV9wcmUuYXBwZW5kQ2hpbGQoZWxlbV9jb3B5QnRuKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImFsd2F5cyBvblwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSAmJiAoc2hvd1Byb21wdCA9PT0gdW5kZWZpbmVkIHx8IHNob3dQcm9tcHQgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93UHJvbXB0ID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXByb21wdFwiKTtcblxuICAgIC8vIHVzaW5nIFByaXNtLmpzIGNvbW1hbmQtbGluZSBwbHVnaW5cbiAgICBsZXQgY29kZV9saW5lcyA9IGVsZW1fY29kZS5pbm5lclRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgaWYgKGNvZGVfbGluZXNbY29kZV9saW5lcy5sZW5ndGggLSAxXS50cmltKCkubGVuZ3RoID09IDApIGNvZGVfbGluZXMucG9wKCk7IC8vIHJlbW92ZSBsYXN0IGxpbmUgaWYgZW1wdHlcblxuICAgIGNvbnN0IG5vX3Byb21wdF9saW5lX2lkeHMgPSBjb2RlX2xpbmVzLm1hcCgobGluZSwgaWR4KSA9PiB7XG4gICAgICBpZiAobGluZS50cmltKCkubGVuZ3RoID09IDApIHJldHVybiAoaWR4ICsgMSk7IC8vIGVtcHR5IGxpbmVcbiAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCIjXCIpKSByZXR1cm4gKGlkeCArIDEpOyAvLyBjb21tZW50IGxpbmVcbiAgICAgIHJldHVybiAtMTtcbiAgICB9KS5maWx0ZXIoKGlkeCkgPT4gaWR4ICE9IC0xKTtcblxuICAgIGVsZW1fcHJlLmNsYXNzTGlzdC5hZGQoXCJjb21tYW5kLWxpbmVcIik7XG4gICAgZWxlbV9wcmUuc2V0QXR0cmlidXRlKFwiZGF0YS1wcm9tcHRcIiwgcHJvbXB0KTtcbiAgICBlbGVtX3ByZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRpbnVhdGlvbi1zdHJcIiwgXCJcXFxcXCIpO1xuICAgIGVsZW1fcHJlLnNldEF0dHJpYnV0ZShcImRhdGEtY29udGludWF0aW9uLXByb21wdFwiLCBcIiBcIi5yZXBlYXQocHJvbXB0Lmxlbmd0aCkpOyAgLy8gdXNlIHNwYWNlcyB0byBhbGlnbiBjb250aW51YXRpb24gcHJvbXB0XG4gICAgZWxlbV9wcmUuc2V0QXR0cmlidXRlKFwiZGF0YS1vdXRwdXRcIiwgbm9fcHJvbXB0X2xpbmVfaWR4cy5qb2luKFwiLCBcIikpO1xuICB9XG5cbiAgaWYoc2V0dGluZ3MudXNlUmVzdWx0R2xvYmFsID09PSBcImVuYWJsZVwiICYmIChpc1Jlc3VsdCA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXJlc3VsdFwiKTtcbiAgICBlbGVtX2NvZGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHQtY29kZVwiKTtcblxuICAgIGVsZW1fZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtcmVzdWx0LXByb21wdFwiLCByZXN1bHRQcm9tcHQpO1xuICB9XG59IiwgImV4cG9ydCBmdW5jdGlvbiBQcmlzbVBsdWdpbl9Db21tYW5kTGluZShQcmlzbSkge1xuXG5cdGlmICh0eXBlb2YgUHJpc20gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgQ0xBU1NfUEFUVEVSTiA9IC8oPzpefFxccyljb21tYW5kLWxpbmUoPzpcXHN8JCkvO1xuXHR2YXIgUFJPTVBUX0NMQVNTID0gJ2NvbW1hbmQtbGluZS1wcm9tcHQnO1xuXG5cdC8qKiBAdHlwZSB7KHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykgPT4gYm9vbGVhbn0gKi9cblx0dmFyIHN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoXG5cdFx0PyBmdW5jdGlvbiAocywgcCkgeyByZXR1cm4gcy5zdGFydHNXaXRoKHApOyB9XG5cdFx0OiBmdW5jdGlvbiAocywgcCkgeyByZXR1cm4gcy5pbmRleE9mKHApID09PSAwOyB9O1xuXG5cdC8vIFN1cHBvcnQgZm9yIElFMTEgdGhhdCBoYXMgbm8gZW5kc1dpdGgoKVxuXHQvKiogQHR5cGUgeyhzdHI6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+IGJvb2xlYW59ICovXG5cdHZhciBlbmRzV2l0aCA9ICcnLmVuZHNXaXRoXG5cdFx0PyBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcblx0XHRcdHJldHVybiBzdHIuZW5kc1dpdGgoc3VmZml4KTtcblx0XHR9XG5cdFx0OiBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcblx0XHRcdHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuXHRcdFx0cmV0dXJuIHN0ci5zdWJzdHJpbmcobGVuIC0gc3VmZml4Lmxlbmd0aCwgbGVuKSA9PT0gc3VmZml4O1xuXHRcdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaG9vayBlbnZpcm9ubWVudCBoYXMgYSBjb21tYW5kIGxpbmUgaW5mbyBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7YW55fSBlbnZcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRmdW5jdGlvbiBoYXNDb21tYW5kTGluZUluZm8oZW52KSB7XG5cdFx0dmFyIHZhcnMgPSBlbnYudmFycyA9IGVudi52YXJzIHx8IHt9O1xuXHRcdHJldHVybiAnY29tbWFuZC1saW5lJyBpbiB2YXJzO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgaW5mbyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaG9vayBlbnZpcm9ubWVudC5cblx0ICpcblx0ICogQHBhcmFtIHthbnl9IGVudlxuXHQgKiBAcmV0dXJucyB7Q29tbWFuZExpbmVJbmZvfVxuXHQgKlxuXHQgKiBAdHlwZWRlZiBDb21tYW5kTGluZUluZm9cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbY29tcGxldGVdXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbnVtYmVyT2ZMaW5lc11cblx0ICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW291dHB1dExpbmVzXVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0Q29tbWFuZExpbmVJbmZvKGVudikge1xuXHRcdHZhciB2YXJzID0gZW52LnZhcnMgPSBlbnYudmFycyB8fCB7fTtcblx0XHRyZXR1cm4gdmFyc1snY29tbWFuZC1saW5lJ10gPSB2YXJzWydjb21tYW5kLWxpbmUnXSB8fCB7fTtcblx0fVxuXG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtaGlnaGxpZ2h0JywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBjb21tYW5kTGluZSA9IGdldENvbW1hbmRMaW5lSW5mbyhlbnYpO1xuXG5cdFx0aWYgKGNvbW1hbmRMaW5lLmNvbXBsZXRlIHx8ICFlbnYuY29kZSkge1xuXHRcdFx0Y29tbWFuZExpbmUuY29tcGxldGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFdvcmtzIG9ubHkgZm9yIDxjb2RlPiB3cmFwcGVkIGluc2lkZSA8cHJlPiAobm90IGlubGluZSkuXG5cdFx0dmFyIHByZSA9IGVudi5lbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0aWYgKCFwcmUgfHwgIS9wcmUvaS50ZXN0KHByZS5ub2RlTmFtZSkgfHwgLy8gQWJvcnQgb25seSBpZiBuZWl0aGVyIHRoZSA8cHJlPiBub3IgdGhlIDxjb2RlPiBoYXZlIHRoZSBjbGFzc1xuXHRcdFx0KCFDTEFTU19QQVRURVJOLnRlc3QocHJlLmNsYXNzTmFtZSkgJiYgIUNMQVNTX1BBVFRFUk4udGVzdChlbnYuZWxlbWVudC5jbGFzc05hbWUpKSkge1xuXHRcdFx0Y29tbWFuZExpbmUuY29tcGxldGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBlbGVtZW50IG1pZ2h0IGJlIGhpZ2hsaWdodGVkIG11bHRpcGxlIHRpbWVzLCBzbyB3ZSBqdXN0IHJlbW92ZSB0aGUgcHJldmlvdXMgcHJvbXB0XG5cdFx0dmFyIGV4aXN0aW5nUHJvbXB0ID0gZW52LmVsZW1lbnQucXVlcnlTZWxlY3RvcignLicgKyBQUk9NUFRfQ0xBU1MpO1xuXHRcdGlmIChleGlzdGluZ1Byb21wdCkge1xuXHRcdFx0ZXhpc3RpbmdQcm9tcHQucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvZGVMaW5lcyA9IGVudi5jb2RlLnNwbGl0KCdcXG4nKTtcblxuXHRcdGlmKGNvZGVMaW5lc1tjb2RlTGluZXMubGVuZ3RoIC0gMV0udHJpbSgpLmxlbmd0aCA9PT0gMCkgeyAvLyBkbyBub3QgY291bnQgdGhlIGxhc3QgbGluZSBpZiBpdCBpcyBlbXB0eVxuXHRcdFx0Y29tbWFuZExpbmUubnVtYmVyT2ZMaW5lcyA9IGNvZGVMaW5lcy5sZW5ndGggLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb21tYW5kTGluZS5udW1iZXJPZkxpbmVzID0gY29kZUxpbmVzLmxlbmd0aDtcblx0XHR9XG5cdFx0LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cblx0XHR2YXIgb3V0cHV0TGluZXMgPSBjb21tYW5kTGluZS5vdXRwdXRMaW5lcyA9IFtdO1xuXG5cdFx0dmFyIG91dHB1dFNlY3Rpb25zID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1vdXRwdXQnKTtcblx0XHR2YXIgb3V0cHV0RmlsdGVyID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1maWx0ZXItb3V0cHV0Jyk7XG5cdFx0aWYgKG91dHB1dFNlY3Rpb25zICE9PSBudWxsKSB7IC8vIFRoZSB1c2VyIHNwZWNpZmllZCB0aGUgb3V0cHV0IGxpbmVzLiAtLSBjd2VsbHNcblx0XHRcdG91dHB1dFNlY3Rpb25zLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAoc2VjdGlvbikge1xuXHRcdFx0XHR2YXIgcmFuZ2UgPSBzZWN0aW9uLnNwbGl0KCctJyk7XG5cdFx0XHRcdHZhciBvdXRwdXRTdGFydCA9IHBhcnNlSW50KHJhbmdlWzBdLCAxMCk7XG5cdFx0XHRcdHZhciBvdXRwdXRFbmQgPSByYW5nZS5sZW5ndGggPT09IDIgPyBwYXJzZUludChyYW5nZVsxXSwgMTApIDogb3V0cHV0U3RhcnQ7XG5cblx0XHRcdFx0aWYgKCFpc05hTihvdXRwdXRTdGFydCkgJiYgIWlzTmFOKG91dHB1dEVuZCkpIHtcblx0XHRcdFx0XHRpZiAob3V0cHV0U3RhcnQgPCAxKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXRTdGFydCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvdXRwdXRFbmQgPiBjb2RlTGluZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXRFbmQgPSBjb2RlTGluZXMubGVuZ3RoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDb252ZXJ0IHN0YXJ0IGFuZCBlbmQgdG8gMC1iYXNlZCB0byBzaW1wbGlmeSB0aGUgYXJyYXlzLiAtLSBjd2VsbHNcblx0XHRcdFx0XHRvdXRwdXRTdGFydC0tO1xuXHRcdFx0XHRcdG91dHB1dEVuZC0tO1xuXHRcdFx0XHRcdC8vIFNhdmUgdGhlIG91dHB1dCBsaW5lIGluIGFuIGFycmF5IGFuZCBjbGVhciBpdCBpbiB0aGUgY29kZSBzbyBpdCdzIG5vdCBoaWdobGlnaHRlZC4gLS0gY3dlbGxzXG5cdFx0XHRcdFx0Zm9yICh2YXIgaiA9IG91dHB1dFN0YXJ0OyBqIDw9IG91dHB1dEVuZDsgaisrKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXRMaW5lc1tqXSA9IGNvZGVMaW5lc1tqXTtcblx0XHRcdFx0XHRcdGNvZGVMaW5lc1tqXSA9ICcnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChvdXRwdXRGaWx0ZXIpIHsgLy8gVHJlYXQgbGluZXMgYmVnaW5uaW5nIHdpdGggdGhpcyBzdHJpbmcgYXMgb3V0cHV0LiAtLSBjd2VsbHNcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY29kZUxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChzdGFydHNXaXRoKGNvZGVMaW5lc1tpXSwgb3V0cHV0RmlsdGVyKSkgeyAvLyBUaGlzIGxpbmUgaXMgb3V0cHV0LiAtLSBjd2VsbHNcblx0XHRcdFx0XHRvdXRwdXRMaW5lc1tpXSA9IGNvZGVMaW5lc1tpXS5zbGljZShvdXRwdXRGaWx0ZXIubGVuZ3RoKTtcblx0XHRcdFx0XHRjb2RlTGluZXNbaV0gPSAnJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBjb250aW51YXRpb25MaW5lSW5kaWNpZXMgPSBjb21tYW5kTGluZS5jb250aW51YXRpb25MaW5lSW5kaWNpZXMgPSBuZXcgU2V0KCk7XG5cdFx0dmFyIGxpbmVDb250aW51YXRpb25TdHIgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbnRpbnVhdGlvbi1zdHInKTtcblx0XHR2YXIgY29udGludWF0aW9uRmlsdGVyID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1maWx0ZXItY29udGludWF0aW9uJyk7XG5cblx0XHQvLyBJZGVudGlmeSBjb2RlIGxpbmVzIHdoZXJlIHRoZSBjb21tYW5kIGhhcyBjb250aW51ZWQgb250byBzdWJzZXF1ZW50XG5cdFx0Ly8gbGluZXMgYW5kIHRodXMgbmVlZCBhIGRpZmZlcmVudCBwcm9tcHQuIE5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgb3V0cHV0XG5cdFx0Ly8gbGluZXMgaGF2ZSBiZWVuIHJlbW92ZWQgdG8gZW5zdXJlIHdlIGRvbid0IHBpY2sgdXAgYSBjb250aW51YXRpb24gc3RyaW5nXG5cdFx0Ly8gaW4gYW4gb3V0cHV0IGxpbmUuXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjb2RlTGluZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdHZhciBsaW5lID0gY29kZUxpbmVzW2pdO1xuXHRcdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIG5leHQgbGluZSBhcyBhIGNvbnRpbnVhdGlvbiBpZiB0aGlzIG9uZSBlbmRzIGluIGEgY29udGludWF0aW9uIHN0ci5cblx0XHRcdGlmIChsaW5lQ29udGludWF0aW9uU3RyICYmIGVuZHNXaXRoKGxpbmUsIGxpbmVDb250aW51YXRpb25TdHIpKSB7XG5cdFx0XHRcdGNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcy5hZGQoaiArIDEpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gUmVjb3JkIHRoaXMgbGluZSBhcyBhIGNvbnRpbnVhdGlvbiBpZiBtYXJrZWQgd2l0aCBhIGNvbnRpbnVhdGlvbiBwcmVmaXhcblx0XHRcdC8vICh0aGF0IHdlIHdpbGwgcmVtb3ZlKS5cblx0XHRcdGlmIChqID4gMCAmJiBjb250aW51YXRpb25GaWx0ZXIgJiYgc3RhcnRzV2l0aChsaW5lLCBjb250aW51YXRpb25GaWx0ZXIpKSB7XG5cdFx0XHRcdGNvZGVMaW5lc1tqXSA9IGxpbmUuc2xpY2UoY29udGludWF0aW9uRmlsdGVyLmxlbmd0aCk7XG5cdFx0XHRcdGNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcy5hZGQoaik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZW52LmNvZGUgPSBjb2RlTGluZXMuam9pbignXFxuJyk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLWluc2VydCcsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgY29tbWFuZExpbmUgPSBnZXRDb21tYW5kTGluZUluZm8oZW52KTtcblxuXHRcdGlmIChjb21tYW5kTGluZS5jb21wbGV0ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlaW5zZXJ0IHRoZSBvdXRwdXQgbGluZXMgaW50byB0aGUgaGlnaGxpZ2h0ZWQgY29kZS4gLS0gY3dlbGxzXG5cdFx0dmFyIGNvZGVMaW5lcyA9IGVudi5oaWdobGlnaHRlZENvZGUuc3BsaXQoJ1xcbicpO1xuXHRcdHZhciBvdXRwdXRMaW5lcyA9IGNvbW1hbmRMaW5lLm91dHB1dExpbmVzIHx8IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gY29kZUxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gQWRkIHNwYW5zIHRvIGFsbG93IGRpc3RpbmN0aW9uIG9mIGlucHV0L291dHB1dCB0ZXh0IGZvciBzdHlsaW5nXG5cdFx0XHRpZiAob3V0cHV0TGluZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0Ly8gb3V0cHV0TGluZXMgd2VyZSByZW1vdmVkIGZyb20gY29kZUxpbmVzIHNvIG1pc3NlZCBvdXQgb24gZXNjYXBpbmdcblx0XHRcdFx0Ly8gb2YgbWFya3VwIHNvIGRvIGl0IGhlcmUuXG5cdFx0XHRcdGNvZGVMaW5lc1tpXSA9ICc8c3BhbiBjbGFzcz1cInRva2VuIG91dHB1dFwiPidcblx0XHRcdFx0XHQrIFByaXNtLnV0aWwuZW5jb2RlKG91dHB1dExpbmVzW2ldKSArICc8L3NwYW4+Jztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvZGVMaW5lc1tpXSA9ICc8c3BhbiBjbGFzcz1cInRva2VuIGNvbW1hbmRcIj4nXG5cdFx0XHRcdFx0KyBjb2RlTGluZXNbaV0gKyAnPC9zcGFuPic7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVudi5oaWdobGlnaHRlZENvZGUgPSBjb2RlTGluZXMuam9pbignXFxuJyk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnY29tcGxldGUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKCFoYXNDb21tYW5kTGluZUluZm8oZW52KSkge1xuXHRcdFx0Ly8gdGhlIHByZXZpb3VzIGhvb2tzIG5ldmVyIHJhblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjb21tYW5kTGluZSA9IGdldENvbW1hbmRMaW5lSW5mbyhlbnYpO1xuXG5cdFx0aWYgKGNvbW1hbmRMaW5lLmNvbXBsZXRlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHByZSA9IGVudi5lbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0aWYgKENMQVNTX1BBVFRFUk4udGVzdChlbnYuZWxlbWVudC5jbGFzc05hbWUpKSB7IC8vIFJlbW92ZSB0aGUgY2xhc3MgXCJjb21tYW5kLWxpbmVcIiBmcm9tIHRoZSA8Y29kZT5cblx0XHRcdGVudi5lbGVtZW50LmNsYXNzTmFtZSA9IGVudi5lbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKENMQVNTX1BBVFRFUk4sICcgJyk7XG5cdFx0fVxuXHRcdGlmICghQ0xBU1NfUEFUVEVSTi50ZXN0KHByZS5jbGFzc05hbWUpKSB7IC8vIEFkZCB0aGUgY2xhc3MgXCJjb21tYW5kLWxpbmVcIiB0byB0aGUgPHByZT5cblx0XHRcdHByZS5jbGFzc05hbWUgKz0gJyBjb21tYW5kLWxpbmUnO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldEF0dHJpYnV0ZShrZXksIGRlZmF1bHRWYWx1ZSkge1xuXHRcdFx0cmV0dXJuIChwcmUuZ2V0QXR0cmlidXRlKGtleSkgfHwgZGVmYXVsdFZhbHVlKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3QnKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIFwicm93c1wiIHRoYXQgd2lsbCBiZWNvbWUgdGhlIGNvbW1hbmQtbGluZSBwcm9tcHRzLiAtLSBjd2VsbHNcblx0XHR2YXIgcHJvbXB0TGluZXMgPSAnJztcblx0XHR2YXIgcm93Q291bnQgPSBjb21tYW5kTGluZS5udW1iZXJPZkxpbmVzIHx8IDA7XG5cdFx0dmFyIHByb21wdFRleHQgPSBnZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvbXB0JywgJycpO1xuXHRcdHZhciBwcm9tcHRMaW5lO1xuXHRcdGlmIChwcm9tcHRUZXh0ICE9PSAnJykge1xuXHRcdFx0cHJvbXB0TGluZSA9ICc8c3BhbiBkYXRhLXByb21wdD1cIicgKyBwcm9tcHRUZXh0ICsgJ1wiPjwvc3Bhbj4nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgdXNlciA9IGdldEF0dHJpYnV0ZSgnZGF0YS11c2VyJywgJ3VzZXInKTtcblx0XHRcdHZhciBob3N0ID0gZ2V0QXR0cmlidXRlKCdkYXRhLWhvc3QnLCAnbG9jYWxob3N0Jyk7XG5cdFx0XHRwcm9tcHRMaW5lID0gJzxzcGFuIGRhdGEtdXNlcj1cIicgKyB1c2VyICsgJ1wiIGRhdGEtaG9zdD1cIicgKyBob3N0ICsgJ1wiPjwvc3Bhbj4nO1xuXHRcdH1cblxuXHRcdHZhciBjb250aW51YXRpb25MaW5lSW5kaWNpZXMgPSBjb21tYW5kTGluZS5jb250aW51YXRpb25MaW5lSW5kaWNpZXMgfHwgbmV3IFNldCgpO1xuXHRcdHZhciBjb250aW51YXRpb25Qcm9tcHRUZXh0ID0gZ2V0QXR0cmlidXRlKCdkYXRhLWNvbnRpbnVhdGlvbi1wcm9tcHQnLCAnPicpO1xuXHRcdHZhciBjb250aW51YXRpb25Qcm9tcHRMaW5lID0gJzxzcGFuIGRhdGEtY29udGludWF0aW9uLXByb21wdD1cIicgKyBjb250aW51YXRpb25Qcm9tcHRUZXh0ICsgJ1wiPjwvc3Bhbj4nO1xuXG5cdFx0Ly8gQXNzZW1ibGUgYWxsIHRoZSBhcHByb3ByaWF0ZSBwcm9tcHQvY29udGludWF0aW9uIGxpbmVzXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCByb3dDb3VudDsgaisrKSB7XG5cdFx0XHRpZiAoY29udGludWF0aW9uTGluZUluZGljaWVzLmhhcyhqKSkge1xuXHRcdFx0XHRwcm9tcHRMaW5lcyArPSBjb250aW51YXRpb25Qcm9tcHRMaW5lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJvbXB0TGluZXMgKz0gcHJvbXB0TGluZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIHdyYXBwZXIgZWxlbWVudC4gLS0gY3dlbGxzXG5cdFx0dmFyIHByb21wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRwcm9tcHQuY2xhc3NOYW1lID0gUFJPTVBUX0NMQVNTO1xuXHRcdHByb21wdC5pbm5lckhUTUwgPSBwcm9tcHRMaW5lcztcblxuXHRcdC8vIFJlbW92ZSB0aGUgcHJvbXB0IGZyb20gdGhlIG91dHB1dCBsaW5lcy4gLS0gY3dlbGxzXG5cdFx0dmFyIG91dHB1dExpbmVzID0gY29tbWFuZExpbmUub3V0cHV0TGluZXMgfHwgW107XG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBvdXRwdXRMaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdGlmIChvdXRwdXRMaW5lcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHByb21wdC5jaGlsZHJlbltpXTtcblx0XHRcdFx0bm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdXNlcicpO1xuXHRcdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1ob3N0Jyk7XG5cdFx0XHRcdG5vZGUucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXByb21wdCcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGVudi5lbGVtZW50Lmluc2VydEJlZm9yZShwcm9tcHQsIGVudi5lbGVtZW50LmZpcnN0Q2hpbGQpO1xuXHRcdGNvbW1hbmRMaW5lLmNvbXBsZXRlID0gdHJ1ZTtcblx0fSk7XG5cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBa0M7OztBQ3lCM0IsSUFBTSxtQkFBd0M7QUFBQSxFQUNwRCxnQkFBZ0I7QUFBQSxFQUVoQixrQkFBa0I7QUFBQSxFQUNsQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUVyQixvQkFBb0I7QUFBQSxFQUNwQixnQkFBZ0I7QUFBQSxFQUVoQixtQkFBbUI7QUFBQSxFQUNuQixpQkFBaUI7QUFBQSxFQUVqQixrQkFBa0I7QUFBQSxFQUVsQixpQkFBaUI7QUFBQSxFQUNqQixvQkFBb0IsQ0FBQyxNQUFNO0FBQUEsRUFDM0IsZUFBZTtBQUFBLEVBRWYsaUJBQWlCO0FBQUEsRUFDakIscUJBQXFCO0FBQUEsRUFFckIsV0FBVztBQUNaOzs7QUNoREEsc0JBQStDO0FBSXhDLElBQU0sZUFBZSxDQUFDLFNBQWlCO0FBQzdDLFNBQU8sZUFBZSxDQUFDLFNBQVM7QUFDL0IsU0FBSyxVQUFVLEVBQUUsWUFBWSxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxNQUFNO0FBQUEsRUFDckYsQ0FBQztBQUNGO0FBRU8sSUFBTSx3QkFBTixjQUFvQyxpQ0FBaUI7QUFBQSxFQUczRCxZQUFZQyxNQUFVLFFBQTJCO0FBQ2hELFVBQU1BLE1BQUssTUFBTTtBQUNqQixT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UUFBUSxVQUFVO0FBQ3ZELGdCQUFZLFdBQVc7QUFBQSxFQUN4QixDQUFDO0FBRUY7OztBSnpPQSxJQUFxQixvQkFBckIsY0FBK0Msd0JBQU87QUFBQSxFQUdyRCxNQUFNLFNBQVM7QUFDZCxVQUFNLEtBQUssYUFBYTtBQUN4QixRQUFJLEtBQUssU0FBUyxXQUFXO0FBQzVCLGNBQVEsSUFBSSw0QkFBNEI7QUFBQSxJQUN6QztBQUVBLFVBQU0sUUFBUSxVQUFNLDRCQUFVO0FBRzlCLDRCQUF3QixLQUFLO0FBRzdCLFNBQUssY0FBYyxJQUFJLHNCQUFzQixLQUFLLEtBQUssSUFBSSxDQUFDO0FBRzVELFVBQU0sWUFBWSxLQUFLLDhCQUE4QixDQUFDLElBQUksUUFBUTtBQUNqRSwyQkFBcUIsSUFBSSxLQUFLLElBQUk7QUFBQSxJQUNuQyxDQUFDO0FBRUQsY0FBVSxZQUFZO0FBQUEsRUFDdkI7QUFBQSxFQUVBLFdBQVc7QUFDVixRQUFJLEtBQUssU0FBUyxXQUFXO0FBQzVCLGNBQVEsSUFBSSw4QkFBOEI7QUFBQSxJQUMzQztBQUFBLEVBQ0Q7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxrQkFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQzFFO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsVUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsRUFDbEM7QUFDRDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJpbXBvcnRfb2JzaWRpYW4iLCAibGFuZ3VhZ2UiLCAiaiJdCn0K