yeban8090_mp-preview/main.js
2025-02-27 12:22:52 +08:00

1170 lines
158 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 __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
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);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/templates/default.json
var require_default = __commonJS({
"src/templates/default.json"(exports, module2) {
module2.exports = {
id: "default",
name: "\u9ED8\u8BA4\u6A21\u677F",
styles: {
container: "width: 100% !important; table-layout: fixed; border-collapse: collapse; border: none; margin: 0; padding: 0; max-width: 100vw;",
title: {
h1: "font-weight: bold; margin: 32px 0 24px; font-size: 2em; color: #2c3e50;",
h2: "font-weight: bold; margin: 28px 0 20px; font-size: 1.5em; color: #34495e;",
h3: "font-weight: bold; margin: 24px 0 16px; font-size: 1.25em; color: #3d566e;",
base: "font-weight: bold; margin: 20px 0 14px; font-size: 1em; color: #47637f;"
},
paragraph: "line-height: 1.8; margin-bottom: 1.2em; font-size: 1em; color: #4a4a4a;",
list: {
container: "padding-left: 20px; margin-bottom: 1.2em; color: #4a4a4a;",
item: "margin-bottom: 0.6em; font-size: 1em; color: #4a4a4a; line-height: 1.8;",
taskList: "list-style: none; margin-left: -24px; font-size: 1em; color: #4a4a4a; line-height: 1.8;"
},
code: {
block: "background: #f8f8f8; padding: 0.5em 1em 1em; border-radius: 8px; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; line-height: 1.6; white-space: pre; overflow-x: auto; word-wrap: normal; color: #333; margin: 1.2em 0; border: 1px solid #eee; box-shadow: 0 2px 4px rgba(0,0,0,0.05); width: 100%;",
inline: "background: #f8f8f8; padding: 2px 6px; border-radius: 4px; color: #333; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; border: 1px solid #eee;"
},
quote: "border-left: 4px solid #e0e0e0; border-radius: 6px; padding: 16px 20px; background: #f6f8fa; margin: 0.8em 0; color: #6a737d; font-style: italic; font-size: 1em; word-wrap: break-word;",
image: "max-width: 100%; height: auto; margin: 1em auto; display: block;",
link: "color: #e0e0e0; text-decoration: none; border-bottom: 1px solid #e0e0e0;",
emphasis: {
strong: "font-weight: bold; color: #4a4a4a;",
em: "font-style: italic; color: #4a4a4a;",
del: "text-decoration: line-through; color: #4a4a4a;"
},
table: {
container: "width: 100%; margin: 1em 0; border-collapse: collapse; border: 1px solid #e1e4e8;",
header: "background: #f6f8fa; font-weight: bold; color: #4a4a4a; border-bottom: 2px solid #e1e4e8; font-size: 1em;",
cell: "border: 1px solid #f0f0f0; padding: 8px; color: #4a4a4a; font-size: 1em;"
},
hr: "border: none; border-top: 1px solid #f0f0f0; margin: 20px 0;",
footnote: {
ref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;",
backref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;"
}
}
};
}
});
// src/templates/minimal.json
var require_minimal = __commonJS({
"src/templates/minimal.json"(exports, module2) {
module2.exports = {
id: "minimal",
name: "\u6781\u7B80\u4E3B\u9898",
styles: {
container: "width: 100% !important; table-layout: fixed; border-collapse: collapse; border: none; margin: 0; padding: 0; max-width: 100vw;",
title: {
h1: "font-weight: bold; margin: 32px 0 24px; font-size: 2em; color: #3B4252; letter-spacing: -0.02em;",
h2: "font-weight: bold; margin: 28px 0 20px; font-size: 1.5em; color: #434C5E; letter-spacing: -0.01em;",
h3: "font-weight: bold; margin: 24px 0 16px; font-size: 1.25em; color: #4C566A;",
base: "font-weight: bold; margin: 20px 0 14px; font-size: 1em; color: #5E81AC;"
},
paragraph: "line-height: 1.8; margin-bottom: 1.2em; font-size: 1em; color: #4a4a4a;",
list: {
container: "padding-left: 20px; margin-bottom: 1.2em; color: #4a4a4a;",
item: "margin-bottom: 0.6em; font-size: 1em; color: #4a4a4a; line-height: 1.8;",
taskList: "list-style: none; margin-left: -24px; font-size: 1em; color: #4a4a4a; line-height: 1.8;"
},
code: {
block: "background: #f8f8f8; padding: 0.5em 1em 1em; border-radius: 8px; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; line-height: 1.6; white-space: pre; overflow-x: auto; word-wrap: normal; color: #333; margin: 1.2em 0; border: 1px solid #eee; box-shadow: 0 2px 4px rgba(0,0,0,0.05); width: 100%;",
inline: "background: #f8f8f8; padding: 2px 6px; border-radius: 4px; color: #333; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; border: 1px solid #eee;"
},
quote: "border-left: 4px solid #81A1C1; border-radius: 6px; padding: 16px 20px; background: #f8f9fc; margin: 0.8em 0; color: #4C566A; font-style: italic; font-size: 1em; word-wrap: break-word;",
image: "max-width: 100%; height: auto; margin: 1em auto; display: block;",
link: "color: #5E81AC; text-decoration: none; border-bottom: 1px solid #81A1C1; transition: all 0.2s ease;",
emphasis: {
strong: "font-weight: bold; color: #4a4a4a;",
em: "font-style: italic; color: #4a4a4a;",
del: "text-decoration: line-through; color: #4a4a4a;"
},
table: {
container: "width: 100%; margin: 1em 0; border-collapse: collapse; border: 1px solid #e1e4e8;",
header: "background: #f6f8fa; font-weight: bold; color: #4a4a4a; border-bottom: 2px solid #e1e4e8; font-size: 1em;",
cell: "border: 1px solid #f0f0f0; padding: 8px; color: #4a4a4a; font-size: 1em;"
},
hr: "border: none; border-top: 1px solid #f0f0f0; margin: 20px 0;",
footnote: {
ref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;",
backref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;"
}
}
};
}
});
// src/templates/elegant.json
var require_elegant = __commonJS({
"src/templates/elegant.json"(exports, module2) {
module2.exports = {
id: "elegant",
name: "\u4F18\u96C5\u4E3B\u9898",
styles: {
container: "width: 100% !important; table-layout: fixed; border-collapse: collapse; border: none; margin: 0; padding: 0; max-width: 100vw;",
title: {
h1: "font-weight: bold; margin: 32px 0 24px; font-size: 2em; color: #553C9A; letter-spacing: -0.03em; border-bottom: 2px solid #9F7AEA; padding-bottom: 0.3em;",
h2: "font-weight: bold; margin: 28px 0 20px; font-size: 1.5em; color: #6B46C1; letter-spacing: -0.02em; border-left: 4px solid #9F7AEA; padding-left: 12px;",
h3: "font-weight: bold; margin: 24px 0 16px; font-size: 1.25em; color: #805AD5; letter-spacing: -0.01em;",
base: "font-weight: bold; margin: 20px 0 14px; font-size: 1em; color: #9F7AEA;"
},
paragraph: "line-height: 1.8; margin-bottom: 1.2em; font-size: 1em; color: #4a4a4a;",
list: {
container: "padding-left: 20px; margin-bottom: 1.2em; color: #4a4a4a;",
item: "margin-bottom: 0.6em; font-size: 1em; color: #4a4a4a; line-height: 1.8;",
taskList: "list-style: none; margin-left: -24px; font-size: 1em; color: #4a4a4a; line-height: 1.8;"
},
code: {
block: "background: #f8f8f8; padding: 0.5em 1em 1em; border-radius: 8px; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; line-height: 1.6; white-space: pre; overflow-x: auto; word-wrap: normal; color: #333; margin: 1.2em 0; border: 1px solid #eee; box-shadow: 0 2px 4px rgba(0,0,0,0.05); width: 100%;",
inline: "background: #f8f8f8; padding: 2px 6px; border-radius: 4px; color: #333; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; border: 1px solid #eee;"
},
quote: "border-left: 4px solid #9F7AEA; border-radius: 6px; padding: 16px 20px; background: #f5f3ff; margin: 0.8em 0; color: #6B46C1; font-style: italic; font-size: 1em; word-wrap: break-word;",
image: "max-width: 100%; height: auto; margin: 1em auto; display: block;",
link: "color: #805AD5; text-decoration: none; border-bottom: 1px solid #9F7AEA; transition: all 0.2s ease;",
emphasis: {
strong: "font-weight: bold; color: #4a4a4a;",
em: "font-style: italic; color: #4a4a4a;",
del: "text-decoration: line-through; color: #4a4a4a;"
},
table: {
container: "width: 100%; margin: 1em 0; border-collapse: collapse; border: 1px solid #e1e4e8;",
header: "background: #f6f8fa; font-weight: bold; color: #4a4a4a; border-bottom: 2px solid #e1e4e8; font-size: 1em;",
cell: "border: 1px solid #f0f0f0; padding: 8px; color: #4a4a4a; font-size: 1em;"
},
hr: "border: none; border-top: 1px solid #f0f0f0; margin: 20px 0;",
footnote: {
ref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;",
backref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;"
}
}
};
}
});
// src/templates/dark.json
var require_dark = __commonJS({
"src/templates/dark.json"(exports, module2) {
module2.exports = {
id: "dark",
name: "\u6DF1\u8272\u4E3B\u9898",
styles: {
container: "width: 100% !important; table-layout: fixed; border-collapse: collapse; border: none; margin: 0; padding: 0; max-width: 100vw;",
title: {
h1: "font-weight: bold; margin: 32px 0 24px; font-size: 2em; color: #4A90E2; letter-spacing: -0.03em; border-bottom: 2px solid #4A90E2; padding-bottom: 0.3em;",
h2: "font-weight: bold; margin: 28px 0 20px; font-size: 1.5em; color: #5B9BE0; letter-spacing: -0.02em; border-left: 4px solid #4A90E2; padding-left: 12px;",
h3: "font-weight: bold; margin: 24px 0 16px; font-size: 1.25em; color: #6BA5DE; letter-spacing: -0.01em;",
base: "font-weight: bold; margin: 20px 0 14px; font-size: 1em; color: #7BB0DD;"
},
paragraph: "line-height: 1.8; margin-bottom: 1.2em; font-size: 1em; color: #4a4a4a;",
list: {
container: "padding-left: 20px; margin-bottom: 1.2em; color: #4a4a4a;",
item: "margin-bottom: 0.6em; font-size: 1em; color: #4a4a4a; line-height: 1.8;",
taskList: "list-style: none; margin-left: -24px; font-size: 1em; color: #4a4a4a; line-height: 1.8;"
},
code: {
block: "background: #f8f8f8; padding: 0.5em 1em 1em; border-radius: 8px; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; line-height: 1.6; white-space: pre; overflow-x: auto; word-wrap: normal; color: #333; margin: 1.2em 0; border: 1px solid #eee; box-shadow: 0 2px 4px rgba(0,0,0,0.05); width: 100%;",
inline: "background: #f8f8f8; padding: 2px 6px; border-radius: 4px; color: #333; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; border: 1px solid #eee;"
},
quote: "border-left: 4px solid #4A90E2; border-radius: 6px; padding: 16px 20px; background: #F5F9FF; margin: 0.8em 0; color: #4A5568; font-style: italic; font-size: 1em; word-wrap: break-word;",
image: "max-width: 100%; height: auto; margin: 1em auto; display: block;",
link: "color: #4A90E2; text-decoration: none; border-bottom: 1px solid #4A90E2; transition: all 0.2s ease;",
emphasis: {
strong: "font-weight: bold; color: #4a4a4a;",
em: "font-style: italic; color: #4a4a4a;",
del: "text-decoration: line-through; color: #4a4a4a;"
},
table: {
container: "width: 100%; margin: 1em 0; border-collapse: collapse; border: 1px solid #e1e4e8;",
header: "background: #f6f8fa; font-weight: bold; color: #4a4a4a; border-bottom: 2px solid #e1e4e8; font-size: 1em;",
cell: "border: 1px solid #f0f0f0; padding: 8px; color: #4a4a4a; font-size: 1em;"
},
hr: "border: none; border-top: 1px solid #f0f0f0; margin: 20px 0;",
footnote: {
ref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;",
backref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;"
}
}
};
}
});
// src/templates/academic.json
var require_academic = __commonJS({
"src/templates/academic.json"(exports, module2) {
module2.exports = {
id: "academic",
name: "\u5B66\u672F\u4E3B\u9898",
styles: {
container: "width: 100% !important; table-layout: fixed; border-collapse: collapse; border: none; margin: 0; padding: 0; max-width: 100vw;",
title: {
h1: "font-weight: bold; margin: 32px 0 24px; font-size: 2em; color: #5D4037; letter-spacing: -0.03em; border-bottom: 2px solid #8D6E63; padding-bottom: 0.3em;",
h2: "font-weight: bold; margin: 28px 0 20px; font-size: 1.5em; color: #6D4C41; letter-spacing: -0.02em; border-left: 4px solid #8D6E63; padding-left: 12px;",
h3: "font-weight: bold; margin: 24px 0 16px; font-size: 1.25em; color: #795548; letter-spacing: -0.01em;",
base: "font-weight: bold; margin: 20px 0 14px; font-size: 1em; color: #8D6E63;"
},
paragraph: "line-height: 1.8; margin-bottom: 1.2em; font-size: 1em; color: #4a4a4a;",
quote: "border-left: 4px solid #8D6E63; border-radius: 6px; padding: 16px 20px; background: #EFEBE9; margin: 0.8em 0; color: #5D4037; font-style: italic; font-size: 1em; word-wrap: break-word;",
link: "color: #795548; text-decoration: none; border-bottom: 1px solid #8D6E63; transition: all 0.2s ease;",
emphasis: {
strong: "font-weight: 600; color: #4a4a4a;",
em: "font-style: italic; color: #4a4a4a;",
del: "text-decoration: line-through; color: #4a4a4a;"
},
list: {
container: "padding-left: 20px; margin-bottom: 1.2em; color: #4a4a4a;",
item: "margin-bottom: 0.6em; font-size: 1em; color: #4a4a4a; line-height: 1.8;",
taskList: "list-style: none; margin-left: -24px; font-size: 1em; color: #4a4a4a; line-height: 1.8;"
},
code: {
block: "background: #f8f8f8; padding: 0.5em 1em 1em; border-radius: 8px; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; line-height: 1.6; white-space: pre; overflow-x: auto; word-wrap: normal; color: #333; margin: 1.2em 0; border: 1px solid #eee; box-shadow: 0 2px 4px rgba(0,0,0,0.05); width: 100%;",
inline: "background: #f8f8f8; padding: 2px 6px; border-radius: 4px; color: #333; font-size: 14px; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; border: 1px solid #eee;"
},
image: "max-width: 100%; height: auto; margin: 1em auto; display: block;",
table: {
container: "width: 100%; margin: 1em 0; border-collapse: collapse; border: 1px solid #e1e4e8;",
header: "background: #f6f8fa; font-weight: bold; color: #4a4a4a; border-bottom: 2px solid #e1e4e8; font-size: 1em;",
cell: "border: 1px solid #f0f0f0; padding: 8px; color: #4a4a4a; font-size: 1em;"
},
hr: "border: none; border-top: 1px solid #f0f0f0; margin: 20px 0;",
footnote: {
ref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;",
backref: "color: #e0e0e0; text-decoration: none; font-size: 0.9em;"
}
}
};
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => MPPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian3 = require("obsidian");
// src/view.ts
var import_obsidian2 = require("obsidian");
// src/converter.ts
var MPConverter = class {
static initialize(app) {
this.app = app;
}
static formatContent(element) {
const table = this.createWrapperTable(element);
this.processElements(table.querySelector("td"));
}
static createWrapperTable(element) {
const table = document.createElement("table");
const tbody = document.createElement("tbody");
const tr = document.createElement("tr");
const td = document.createElement("td");
table.style.width = "100%";
table.style.borderCollapse = "collapse";
td.style.wordBreak = "break-all";
while (element.firstChild) {
td.appendChild(element.firstChild);
}
tr.appendChild(td);
tbody.appendChild(tr);
table.appendChild(tbody);
element.appendChild(table);
return table;
}
static processElements(container) {
if (!container) return;
container.querySelectorAll("strong, em").forEach((el) => {
el.style.display = "inline";
});
container.querySelectorAll("a").forEach((el) => {
el.style.color = "#576b95";
el.style.textDecoration = "none";
});
container.querySelectorAll("table").forEach((el) => {
if (el === container.closest("table")) return;
el.style.borderCollapse = "collapse";
el.style.margin = "1em 0";
el.style.width = "100%";
});
container.querySelectorAll("th, td").forEach((el) => {
if (el === container.closest("td")) return;
el.style.border = "1px solid #dfdfdf";
el.style.padding = "8px";
});
container.querySelectorAll("hr").forEach((el) => {
el.style.border = "none";
el.style.borderTop = "1px solid #dfdfdf";
el.style.margin = "20px 0";
});
container.querySelectorAll("del").forEach((el) => {
el.style.textDecoration = "line-through";
});
container.querySelectorAll(".task-list-item").forEach((el) => {
el.style.listStyle = "none";
const checkbox = el.querySelector('input[type="checkbox"]');
if (checkbox) {
checkbox.style.marginRight = "6px";
}
});
container.querySelectorAll(".footnote-ref, .footnote-backref").forEach((el) => {
el.style.color = "#576b95";
el.style.textDecoration = "none";
});
container.querySelectorAll("pre code").forEach((el) => {
const pre = el.parentElement;
if (pre) {
const dots = document.createElement("div");
dots.style.cssText = `
margin: 8px 0 12px 0;
display: flex;
gap: 6px;
`;
const colors = ["#ff5f56", "#ffbd2e", "#27c93f"];
colors.forEach((color) => {
const dot = document.createElement("span");
dot.style.cssText = `
width: 12px;
height: 12px;
border-radius: 50%;
background-color: ${color};
`;
dots.appendChild(dot);
});
pre.insertBefore(dots, pre.firstChild);
pre.style.paddingTop = "32px";
const copyButton = pre.querySelector(".copy-code-button");
if (copyButton) {
copyButton.remove();
}
}
});
container.querySelectorAll("span.internal-embed[alt][src]").forEach((el) => __async(this, null, function* () {
var _a;
const originalSpan = el;
const src = originalSpan.getAttribute("src");
const alt = originalSpan.getAttribute("alt");
if (!src) return;
try {
const linktext = src.split("|")[0];
const file = this.app.metadataCache.getFirstLinkpathDest(linktext, "");
if (file) {
const absolutePath = this.app.vault.adapter.getResourcePath(file.path);
const newImg = document.createElement("img");
newImg.src = absolutePath;
if (alt) newImg.alt = alt;
newImg.style.maxWidth = "100%";
newImg.style.height = "auto";
newImg.style.display = "block";
newImg.style.margin = "1em auto";
(_a = originalSpan.parentNode) == null ? void 0 : _a.replaceChild(newImg, originalSpan);
}
} catch (error) {
console.error("\u56FE\u7247\u5904\u7406\u5931\u8D25:", error);
}
}));
container.querySelectorAll("blockquote").forEach((el) => {
el.querySelectorAll("p").forEach((p) => {
p.style.margin = "0";
p.style.padding = "0";
p.style.lineHeight = "inherit";
});
});
}
};
// src/copyManager.ts
var import_obsidian = require("obsidian");
var CopyManager = class {
static cleanupHtml(html) {
const tempDiv = document.createElement("div");
tempDiv.innerHTML = html;
tempDiv.querySelectorAll("*").forEach((el) => {
Array.from(el.attributes).forEach((attr) => {
if (attr.name.startsWith("data-")) {
el.removeAttribute(attr.name);
}
});
});
tempDiv.querySelectorAll("*").forEach((el) => {
el.removeAttribute("class");
});
tempDiv.querySelectorAll("*").forEach((el) => {
el.removeAttribute("id");
});
return tempDiv.innerHTML;
}
static processImages(container) {
return __async(this, null, function* () {
const images = container.querySelectorAll("img");
const imageArray = Array.from(images);
for (const img of imageArray) {
try {
const response = yield fetch(img.src);
const blob = yield response.blob();
const reader = new FileReader();
yield new Promise((resolve, reject) => {
reader.onload = () => {
img.src = reader.result;
resolve(null);
};
reader.onerror = reject;
reader.readAsDataURL(blob);
});
} catch (error) {
console.error("\u56FE\u7247\u8F6C\u6362\u5931\u8D25:", error);
}
}
});
}
static copyToClipboard(element) {
return __async(this, null, function* () {
try {
const container = document.createElement("div");
container.style.position = "absolute";
container.style.left = "-9999px";
container.innerHTML = element.innerHTML;
document.body.appendChild(container);
yield this.processImages(container);
const cleanHtml = this.cleanupHtml(container.innerHTML);
const clipData = new ClipboardItem({
"text/html": new Blob([cleanHtml], { type: "text/html" }),
"text/plain": new Blob([container.textContent || ""], { type: "text/plain" })
});
document.body.removeChild(container);
yield navigator.clipboard.write([clipData]);
new import_obsidian.Notice("\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F");
} catch (error) {
new import_obsidian.Notice("\u590D\u5236\u5931\u8D25");
}
});
}
};
// src/donateManager.ts
var DonateManager = class {
static showDonateModal(container) {
this.overlay = container.createEl("div", {
cls: "mp-donate-overlay"
});
this.modal = this.overlay.createEl("div", {
cls: "mp-donate-modal"
});
const closeButton = this.modal.createEl("button", {
cls: "mp-donate-close",
text: "\xD7"
});
this.modal.createEl("h3", {
text: "\u5173\u6CE8\u4F5C\u8005",
cls: "mp-donate-title"
});
const content = this.modal.createEl("div", {
cls: "mp-donate-content"
});
content.createEl("p", {
text: "\u5982\u679C\u4F60\u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u6B22\u8FCE\u5173\u6CE8\u6211\u7684\u516C\u4F17\u53F7 \u2764\uFE0F",
cls: "mp-donate-desc"
});
const qrContainer = content.createEl("div", {
cls: "mp-donate-qr-container"
});
const qrCode = qrContainer.createEl("div", {
cls: "mp-donate-qr active"
});
qrCode.createEl("img", {
attr: {
src: "./assets/qrcode.png",
alt: "\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801"
}
});
content.createEl("p", {
text: "\u516C\u4F17\u53F7\uFF1A\u591C\u534A",
cls: "mp-donate-desc"
});
closeButton.addEventListener("click", () => this.closeDonateModal());
this.overlay.addEventListener("click", (e) => {
if (e.target === this.overlay) {
this.closeDonateModal();
}
});
}
static closeDonateModal() {
if (this.overlay) {
this.overlay.remove();
}
}
};
// src/view.ts
var VIEW_TYPE_MP = "mp-preview";
var MPView = class extends import_obsidian2.ItemView {
constructor(leaf, templateManager, settingsManager) {
super(leaf);
this.currentFile = null;
this.updateTimer = null;
this.isPreviewLocked = false;
this.templateManager = templateManager;
this.settingsManager = settingsManager;
}
getViewType() {
return VIEW_TYPE_MP;
}
getDisplayText() {
return "\u516C\u4F17\u53F7\u9884\u89C8";
}
getIcon() {
return "eye";
}
// 在 onOpen 方法中更新底部锁定按钮的创建
onOpen() {
return __async(this, null, function* () {
var _a, _b, _c, _d;
const container = this.containerEl.children[1];
container.empty();
const toolbar = container.createEl("div", { cls: "mp-toolbar" });
this.lockButton = toolbar.createEl("button", {
cls: "mp-lock-button",
attr: { "aria-label": "\u5173\u95ED\u5B9E\u65F6\u9884\u89C8\u72B6\u6001" }
});
this.lockButton.innerHTML = "\u{1F513}";
this.lockButton.addEventListener("click", () => this.togglePreviewLock());
const controlsGroup = toolbar.createEl("div", { cls: "mp-controls-group" });
this.customTemplateSelect = this.createCustomSelect(
controlsGroup,
"mp-template-select",
yield this.getTemplateOptions()
);
this.customTemplateSelect.id = "template-select";
(_a = this.customTemplateSelect.querySelector(".custom-select")) == null ? void 0 : _a.addEventListener("change", (e) => __async(this, null, function* () {
const value = e.detail.value;
this.templateManager.setCurrentTemplate(value);
yield this.settingsManager.updateSettings({
templateId: value
});
this.templateManager.applyTemplate(this.previewEl);
}));
this.customFontSelect = this.createCustomSelect(
controlsGroup,
"mp-font-select",
this.getFontOptions()
);
(_b = this.customFontSelect.querySelector(".custom-select")) == null ? void 0 : _b.addEventListener("change", (e) => __async(this, null, function* () {
const value = e.detail.value;
this.templateManager.setFont(value);
yield this.settingsManager.updateSettings({
fontFamily: value
});
this.templateManager.applyTemplate(this.previewEl);
}));
this.customFontSelect.id = "font-select";
const fontSizeGroup = controlsGroup.createEl("div", { cls: "mp-font-size-group" });
const decreaseButton = fontSizeGroup.createEl("button", {
cls: "mp-font-size-btn",
text: "-"
});
this.fontSizeSelect = fontSizeGroup.createEl("input", {
cls: "mp-font-size-input",
type: "text",
value: "16",
attr: {
style: "border: none; outline: none; background: transparent;"
}
});
const increaseButton = fontSizeGroup.createEl("button", {
cls: "mp-font-size-btn",
text: "+"
});
const settings = this.settingsManager.getSettings();
if (settings.templateId) {
const templateSelect = this.customTemplateSelect.querySelector(".selected-text");
const templateDropdown = this.customTemplateSelect.querySelector(".select-dropdown");
if (templateSelect && templateDropdown) {
const option = yield this.getTemplateOptions();
const selected = option.find((o) => o.value === settings.templateId);
if (selected) {
templateSelect.textContent = selected.label;
(_c = this.customTemplateSelect.querySelector(".custom-select")) == null ? void 0 : _c.setAttribute("data-value", selected.value);
templateDropdown.querySelectorAll(".select-item").forEach((el) => {
if (el.getAttribute("data-value") === selected.value) {
el.classList.add("selected");
} else {
el.classList.remove("selected");
}
});
}
}
this.templateManager.setCurrentTemplate(settings.templateId);
}
if (settings.fontFamily) {
const fontSelect = this.customFontSelect.querySelector(".selected-text");
const fontDropdown = this.customFontSelect.querySelector(".select-dropdown");
if (fontSelect && fontDropdown) {
const option = this.getFontOptions();
const selected = option.find((o) => o.value === settings.fontFamily);
if (selected) {
fontSelect.textContent = selected.label;
(_d = this.customFontSelect.querySelector(".custom-select")) == null ? void 0 : _d.setAttribute("data-value", selected.value);
fontDropdown.querySelectorAll(".select-item").forEach((el) => {
if (el.getAttribute("data-value") === selected.value) {
el.classList.add("selected");
} else {
el.classList.remove("selected");
}
});
}
}
this.templateManager.setFont(settings.fontFamily);
}
if (settings.fontSize) {
this.fontSizeSelect.value = settings.fontSize.toString();
this.templateManager.setFontSize(settings.fontSize);
}
const updateFontSize = () => __async(this, null, function* () {
const size = parseInt(this.fontSizeSelect.value);
this.templateManager.setFontSize(size);
yield this.settingsManager.updateSettings({
fontSize: size
});
this.templateManager.applyTemplate(this.previewEl);
});
decreaseButton.addEventListener("click", () => {
const currentSize = parseInt(this.fontSizeSelect.value);
if (currentSize > 12) {
this.fontSizeSelect.value = (currentSize - 1).toString();
updateFontSize();
}
});
increaseButton.addEventListener("click", () => {
const currentSize = parseInt(this.fontSizeSelect.value);
if (currentSize < 30) {
this.fontSizeSelect.value = (currentSize + 1).toString();
updateFontSize();
}
});
this.fontSizeSelect.addEventListener("change", updateFontSize);
this.previewEl = container.createEl("div", { cls: "mp-preview-area" });
const bottomBar = container.createEl("div", { cls: "mp-bottom-bar" });
const helpButton = bottomBar.createEl("button", {
cls: "mp-help-button",
attr: { "aria-label": "\u4F7F\u7528\u6307\u5357" }
});
helpButton.innerHTML = "\u2753";
const tooltip = bottomBar.createEl("div", {
cls: "mp-help-tooltip",
text: `\u4F7F\u7528\u6307\u5357\uFF1A
1. \u9009\u62E9\u559C\u6B22\u7684\u4E3B\u9898\u6A21\u677F
2. \u8C03\u6574\u5B57\u4F53\u548C\u5B57\u53F7
3. \u5B9E\u65F6\u9884\u89C8\u6548\u679C
4. \u70B9\u51FB\u3010\u590D\u5236\u6309\u94AE\u3011\u5373\u53EF\u7C98\u8D34\u5230\u516C\u4F17\u53F7
5. \u7F16\u8F91\u5B9E\u65F6\u67E5\u770B\u6548\u679C\uFF0C\u70B9\u{1F513}\u5173\u95ED\u5B9E\u65F6\u5237\u65B0
6. \u5982\u679C\u4F60\u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u6B22\u8FCE\u6253\u8D4F`
});
const bottomControlsGroup = bottomBar.createEl("div", { cls: "mp-bottom-controls-group" });
const likeButton = bottomControlsGroup.createEl("button", {
cls: "mp-like-button"
});
likeButton.innerHTML = '<span style="margin-right: 4px">\u2615\uFE0F</span>\u559C\u6B22\u4F5C\u8005';
likeButton.addEventListener("click", () => {
DonateManager.showDonateModal(this.containerEl);
});
this.copyButton = bottomControlsGroup.createEl("button", {
text: "\u590D\u5236\u4E3A\u516C\u4F17\u53F7\u683C\u5F0F",
cls: "mp-copy-button"
});
const newButton = bottomControlsGroup.createEl("button", {
text: "\u656C\u8BF7\u671F\u5F85",
cls: "mp-new-button"
});
this.copyButton.addEventListener("click", () => __async(this, null, function* () {
if (this.previewEl) {
this.copyButton.disabled = true;
this.copyButton.setText("\u590D\u5236\u4E2D...");
try {
yield CopyManager.copyToClipboard(this.previewEl);
this.copyButton.setText("\u590D\u5236\u6210\u529F");
setTimeout(() => {
this.copyButton.disabled = false;
this.copyButton.setText("\u590D\u5236\u4E3A\u516C\u4F17\u53F7\u683C\u5F0F");
}, 2e3);
} catch (error) {
this.copyButton.setText("\u590D\u5236\u5931\u8D25");
setTimeout(() => {
this.copyButton.disabled = false;
this.copyButton.setText("\u590D\u5236\u4E3A\u516C\u4F17\u53F7\u683C\u5F0F");
}, 2e3);
}
}
}));
this.registerEvent(
this.app.workspace.on("file-open", this.onFileOpen.bind(this))
);
this.registerEvent(
this.app.vault.on("modify", this.onFileModify.bind(this))
);
const currentFile = this.app.workspace.getActiveFile();
yield this.onFileOpen(currentFile);
});
}
updateControlsState(enabled) {
this.lockButton.disabled = !enabled;
const templateSelect = this.customTemplateSelect.querySelector(".custom-select");
const fontSelect = this.customFontSelect.querySelector(".custom-select");
if (templateSelect) {
templateSelect.classList.toggle("disabled", !enabled);
templateSelect.setAttribute("style", `pointer-events: ${enabled ? "auto" : "none"}`);
}
if (fontSelect) {
fontSelect.classList.toggle("disabled", !enabled);
fontSelect.setAttribute("style", `pointer-events: ${enabled ? "auto" : "none"}`);
}
this.fontSizeSelect.disabled = !enabled;
this.copyButton.disabled = !enabled;
const fontSizeButtons = this.containerEl.querySelectorAll(".mp-font-size-btn");
fontSizeButtons.forEach((button) => {
button.disabled = !enabled;
});
}
onFileOpen(file) {
return __async(this, null, function* () {
this.currentFile = file;
if (!file || file.extension !== "md") {
this.previewEl.empty();
this.previewEl.createEl("div", {
text: "\u53EA\u80FD\u9884\u89C8 Markdown \u6587\u672C\u6587\u6863",
cls: "mp-empty-message"
});
this.updateControlsState(false);
return;
}
this.updateControlsState(true);
this.isPreviewLocked = false;
this.lockButton.innerHTML = "\u{1F513}";
yield this.updatePreview();
});
}
togglePreviewLock() {
return __async(this, null, function* () {
this.isPreviewLocked = !this.isPreviewLocked;
const lockIcon = this.isPreviewLocked ? "\u{1F512}" : "\u{1F513}";
const lockStatus = this.isPreviewLocked ? "\u5F00\u542F\u5B9E\u65F6\u9884\u89C8\u72B6\u6001" : "\u5173\u95ED\u5B9E\u65F6\u9884\u89C8\u72B6\u6001";
this.lockButton.innerHTML = lockIcon;
this.lockButton.setAttribute("aria-label", lockStatus);
if (!this.isPreviewLocked) {
yield this.updatePreview();
}
});
}
onFileModify(file) {
return __async(this, null, function* () {
if (file === this.currentFile && !this.isPreviewLocked) {
if (this.updateTimer) {
clearTimeout(this.updateTimer);
}
this.updateTimer = setTimeout(() => {
this.updatePreview();
}, 500);
}
});
}
updatePreview() {
return __async(this, null, function* () {
if (!this.currentFile) return;
this.previewEl.empty();
const content = yield this.app.vault.read(this.currentFile);
yield import_obsidian2.MarkdownRenderer.renderMarkdown(
content,
this.previewEl,
this.currentFile.path,
this
);
MPConverter.formatContent(this.previewEl);
this.templateManager.applyTemplate(this.previewEl);
});
}
// 添加自定义下拉选择器创建方法
createCustomSelect(parent, className, options) {
var _a;
const container = parent.createEl("div", { cls: "custom-select-container" });
const select = container.createEl("div", { cls: "custom-select" });
const selectedText = select.createEl("span", { cls: "selected-text" });
const arrow = select.createEl("span", { cls: "select-arrow", text: "\u25BE" });
const dropdown = container.createEl("div", { cls: "select-dropdown" });
options.forEach((option) => {
const item = dropdown.createEl("div", {
cls: "select-item",
text: option.label
});
item.dataset.value = option.value;
item.addEventListener("click", () => {
dropdown.querySelectorAll(".select-item").forEach((el) => el.classList.remove("selected"));
item.classList.add("selected");
selectedText.textContent = option.label;
select.dataset.value = option.value;
dropdown.classList.remove("show");
select.dispatchEvent(new CustomEvent("change", {
detail: { value: option.value }
}));
});
});
if (options.length > 0) {
selectedText.textContent = options[0].label;
select.dataset.value = options[0].value;
(_a = dropdown.querySelector(".select-item")) == null ? void 0 : _a.classList.add("selected");
}
select.addEventListener("click", (e) => {
e.stopPropagation();
dropdown.classList.toggle("show");
});
document.addEventListener("click", () => {
dropdown.classList.remove("show");
});
return container;
}
// 获取模板选项
getTemplateOptions() {
return __async(this, null, function* () {
yield this.templateManager.loadTemplates();
const templates2 = this.templateManager.getAllTemplates();
return templates2.length > 0 ? templates2.map((t) => ({ value: t.id, label: t.name })) : [{ value: "default", label: "\u9ED8\u8BA4\u6A21\u677F" }];
});
}
// 获取字体选项
getFontOptions() {
return [
{
value: 'Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif',
label: "\u9ED8\u8BA4\u5B57\u4F53"
},
{
value: 'SimSun, "\u5B8B\u4F53", serif',
label: "\u5B8B\u4F53"
},
{
value: 'SimHei, "\u9ED1\u4F53", sans-serif',
label: "\u9ED1\u4F53"
},
{
value: 'KaiTi, "\u6977\u4F53", serif',
label: "\u6977\u4F53"
},
{
value: '"Microsoft YaHei", "\u5FAE\u8F6F\u96C5\u9ED1", sans-serif',
label: "\u96C5\u9ED1"
}
];
}
};
// src/templates/index.ts
var defaultTemplate = require_default();
var minimalTemplate = require_minimal();
var elegantTemplate = require_elegant();
var darkTemplate = require_dark();
var academicTemplate = require_academic();
var templates = {
default: defaultTemplate,
minimal: minimalTemplate,
elegant: elegantTemplate,
dark: darkTemplate,
academic: academicTemplate
};
// src/templateManager.ts
var TemplateManager = class {
constructor(app) {
this.templates = /* @__PURE__ */ new Map();
this.currentFont = "-apple-system";
this.currentFontSize = 16;
this.app = app;
this.loadTemplates();
}
loadTemplates() {
return __async(this, null, function* () {
try {
Object.values(templates).forEach((template) => {
this.templates.set(template.id, template);
if (template.id === "default") {
this.currentTemplate = template;
}
});
} catch (error) {
console.error("\u52A0\u8F7D\u6A21\u677F\u5931\u8D25:", error);
throw new Error("\u65E0\u6CD5\u52A0\u8F7D\u6A21\u677F\u6587\u4EF6");
}
});
}
getTemplate(id) {
return this.templates.get(id);
}
getCurrentTemplate() {
return this.currentTemplate;
}
setCurrentTemplate(id) {
const template = this.templates.get(id);
if (template) {
this.currentTemplate = template;
return true;
}
return false;
}
getAllTemplates() {
return Array.from(this.templates.values());
}
setFont(fontFamily) {
this.currentFont = fontFamily;
}
setFontSize(size) {
this.currentFontSize = size;
}
applyTemplate(element) {
const styles = this.currentTemplate.styles;
const table = element.querySelector("table");
const td = element.querySelector("td");
if (!table || !td) return;
table.setAttribute("style", styles.container);
table.setAttribute("cellpadding", "0");
table.setAttribute("cellspacing", "0");
td.style.cssText = `
word-break: break-all;
padding: 0;
margin: 0;
line-height: 1.7;
overflow-wrap: break-word;
white-space: normal;
border: none;
font-family: ${this.currentFont};
`;
td.querySelectorAll("h1").forEach((el) => {
el.setAttribute("style", `${styles.title.h1}; font-family: ${this.currentFont};`);
});
td.querySelectorAll("h2").forEach((el) => {
el.setAttribute("style", `${styles.title.h2}; font-family: ${this.currentFont};`);
});
td.querySelectorAll("h3").forEach((el) => {
el.setAttribute("style", `${styles.title.h3}; font-family: ${this.currentFont};`);
});
td.querySelectorAll("h4, h5, h6").forEach((el) => {
el.setAttribute("style", `${styles.title.base}; font-family: ${this.currentFont};`);
});
td.querySelectorAll("p").forEach((el) => {
var _a, _b;
if (!((_a = el.parentElement) == null ? void 0 : _a.closest("p")) && !((_b = el.parentElement) == null ? void 0 : _b.closest("blockquote"))) {
el.setAttribute("style", `${styles.paragraph}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
}
});
td.querySelectorAll("ul, ol").forEach((el) => {
el.setAttribute("style", styles.list.container);
});
td.querySelectorAll("li").forEach((el) => {
el.setAttribute("style", `${styles.list.item}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll(".task-list-item").forEach((el) => {
el.setAttribute("style", `${styles.list.taskList}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll("blockquote").forEach((el) => {
el.setAttribute("style", `${styles.quote}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll("pre").forEach((el) => {
el.setAttribute("style", `${styles.code.block}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll("code:not(pre code)").forEach((el) => {
el.setAttribute("style", `${styles.code.inline}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll("a").forEach((el) => {
el.setAttribute("style", styles.link);
});
td.querySelectorAll("strong").forEach((el) => {
el.setAttribute("style", styles.emphasis.strong);
});
td.querySelectorAll("em").forEach((el) => {
el.setAttribute("style", styles.emphasis.em);
});
td.querySelectorAll("del").forEach((el) => {
el.setAttribute("style", styles.emphasis.del);
});
td.querySelectorAll("table").forEach((el) => {
if (el === table) return;
el.setAttribute("style", styles.table.container);
});
td.querySelectorAll("th").forEach((el) => {
el.setAttribute("style", `${styles.table.header}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll("td").forEach((el) => {
if (el === td) return;
el.setAttribute("style", `${styles.table.cell}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
});
td.querySelectorAll("hr").forEach((el) => {
el.setAttribute("style", styles.hr);
});
td.querySelectorAll(".footnote-ref").forEach((el) => {
el.setAttribute("style", styles.footnote.ref);
});
td.querySelectorAll(".footnote-backref").forEach((el) => {
el.setAttribute("style", styles.footnote.backref);
});
td.querySelectorAll("img").forEach((el) => {
const img = el;
el.setAttribute("style", `${styles.image}; font-family: ${this.currentFont};`);
const parent = img.parentElement;
if (parent && parent.tagName.toLowerCase() === "p") {
if (parent.childNodes.length === 1) {
parent.style.textAlign = "center";
parent.style.margin = "1em 0";
}
}
});
td.querySelectorAll("pre").forEach((el) => {
el.setAttribute("style", `${styles.code.block};`);
});
td.querySelectorAll("blockquote").forEach((el) => {
el.setAttribute("style", `${styles.quote};`);
});
td.querySelectorAll("ul, ol").forEach((el) => {
el.setAttribute("style", `${styles.list.container}; font-family: ${this.currentFont};`);
});
td.querySelectorAll("li").forEach((el) => {
el.setAttribute("style", `${styles.list.item}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`);
});
}
};
// src/settings.ts
var DEFAULT_SETTINGS = {
templateId: "default",
fontFamily: "-apple-system",
fontSize: 16
};
var SettingsManager = class {
constructor(plugin) {
this.plugin = plugin;
this.settings = DEFAULT_SETTINGS;
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.plugin.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.plugin.saveData(this.settings);
});
}
getSettings() {
return this.settings;
}
updateSettings(settings) {
return __async(this, null, function* () {
this.settings = __spreadValues(__spreadValues({}, this.settings), settings);
yield this.saveSettings();
});
}
};
// src/main.ts
var MPPlugin = class extends import_obsidian3.Plugin {
onload() {
return __async(this, null, function* () {
this.settingsManager = new SettingsManager(this);
yield this.settingsManager.loadSettings();
const templateManager = new TemplateManager(this.app);
MPConverter.initialize(this.app);
this.registerView(
VIEW_TYPE_MP,
(leaf) => new MPView(leaf, templateManager, this.settingsManager)
);
this.addCommand({
id: "open-mp-preview",
name: "\u6253\u5F00\u516C\u4F17\u53F7\u9884\u89C8\u63D2\u4EF6",
callback: () => __async(this, null, function* () {
yield this.activateView();
})
});
this.app.workspace.onLayoutReady(() => {
this.activateView();
});
MPConverter.initialize(this.app);
});
}
onunload() {
return __async(this, null, function* () {
this.app.workspace.detachLeavesOfType(VIEW_TYPE_MP);
});
}
activateView() {
return __async(this, null, function* () {
const leaves = this.app.workspace.getLeavesOfType(VIEW_TYPE_MP);
if (leaves.length > 0) {
this.app.workspace.revealLeaf(leaves[0]);
return;
}
const rightLeaf = this.app.workspace.getRightLeaf(false);
if (rightLeaf) {
yield rightLeaf.setViewState({
type: VIEW_TYPE_MP,
active: true
});
} else {
new import_obsidian3.Notice("\u65E0\u6CD5\u521B\u5EFA\u89C6\u56FE\u9762\u677F");
}
});
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3RlbXBsYXRlcy9kZWZhdWx0Lmpzb24iLCAic3JjL3RlbXBsYXRlcy9taW5pbWFsLmpzb24iLCAic3JjL3RlbXBsYXRlcy9lbGVnYW50Lmpzb24iLCAic3JjL3RlbXBsYXRlcy9kYXJrLmpzb24iLCAic3JjL3RlbXBsYXRlcy9hY2FkZW1pYy5qc29uIiwgInNyYy9tYWluLnRzIiwgInNyYy92aWV3LnRzIiwgInNyYy9jb252ZXJ0ZXIudHMiLCAic3JjL2NvcHlNYW5hZ2VyLnRzIiwgInNyYy9kb25hdGVNYW5hZ2VyLnRzIiwgInNyYy90ZW1wbGF0ZXMvaW5kZXgudHMiLCAic3JjL3RlbXBsYXRlTWFuYWdlci50cyIsICJzcmMvc2V0dGluZ3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIntcbiAgICBcImlkXCI6IFwiZGVmYXVsdFwiLFxuICAgIFwibmFtZVwiOiBcIlx1OUVEOFx1OEJBNFx1NkEyMVx1Njc3RlwiLFxuICAgIFwic3R5bGVzXCI6IHtcbiAgICAgICAgXCJjb250YWluZXJcIjogXCJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB0YWJsZS1sYXlvdXQ6IGZpeGVkOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBib3JkZXI6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgbWF4LXdpZHRoOiAxMDB2dztcIixcbiAgICAgICAgXCJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBcImgxXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMzJweCAwIDI0cHg7IGZvbnQtc2l6ZTogMmVtOyBjb2xvcjogIzJjM2U1MDtcIixcbiAgICAgICAgICAgIFwiaDJcIjogXCJmb250LXdlaWdodDogYm9sZDsgbWFyZ2luOiAyOHB4IDAgMjBweDsgZm9udC1zaXplOiAxLjVlbTsgY29sb3I6ICMzNDQ5NWU7XCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjRweCAwIDE2cHg7IGZvbnQtc2l6ZTogMS4yNWVtOyBjb2xvcjogIzNkNTY2ZTtcIixcbiAgICAgICAgICAgIFwiYmFzZVwiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDIwcHggMCAxNHB4OyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM0NzYzN2Y7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhZ3JhcGhcIjogXCJsaW5lLWhlaWdodDogMS44OyBtYXJnaW4tYm90dG9tOiAxLjJlbTsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjNGE0YTRhO1wiLFxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgXCJjb250YWluZXJcIjogXCJwYWRkaW5nLWxlZnQ6IDIwcHg7IG1hcmdpbi1ib3R0b206IDEuMmVtOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgICAgIFwiaXRlbVwiOiBcIm1hcmdpbi1ib3R0b206IDAuNmVtOyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM0YTRhNGE7IGxpbmUtaGVpZ2h0OiAxLjg7XCIsXG4gICAgICAgICAgICBcInRhc2tMaXN0XCI6IFwibGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luLWxlZnQ6IC0yNHB4OyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM0YTRhNGE7IGxpbmUtaGVpZ2h0OiAxLjg7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIFwiYmxvY2tcIjogXCJiYWNrZ3JvdW5kOiAjZjhmOGY4OyBwYWRkaW5nOiAwLjVlbSAxZW0gMWVtOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IE9wZXJhdG9yIE1vbm8sIENvbnNvbGFzLCBNb25hY28sIE1lbmxvLCBtb25vc3BhY2U7IGxpbmUtaGVpZ2h0OiAxLjY7IHdoaXRlLXNwYWNlOiBwcmU7IG92ZXJmbG93LXg6IGF1dG87IHdvcmQtd3JhcDogbm9ybWFsOyBjb2xvcjogIzMzMzsgbWFyZ2luOiAxLjJlbSAwOyBib3JkZXI6IDFweCBzb2xpZCAjZWVlOyBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjA1KTsgd2lkdGg6IDEwMCU7XCIsXG4gICAgICAgICAgICBcImlubGluZVwiOiBcImJhY2tncm91bmQ6ICNmOGY4Zjg7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICMzMzM7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IE9wZXJhdG9yIE1vbm8sIENvbnNvbGFzLCBNb25hY28sIE1lbmxvLCBtb25vc3BhY2U7IGJvcmRlcjogMXB4IHNvbGlkICNlZWU7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdW90ZVwiOiBcImJvcmRlci1sZWZ0OiA0cHggc29saWQgI2UwZTBlMDsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxNnB4IDIwcHg7IGJhY2tncm91bmQ6ICNmNmY4ZmE7IG1hcmdpbjogMC44ZW0gMDsgY29sb3I6ICM2YTczN2Q7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOiAxZW07IHdvcmQtd3JhcDogYnJlYWstd29yZDtcIixcbiAgICAgICAgXCJpbWFnZVwiOiBcIm1heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvOyBtYXJnaW46IDFlbSBhdXRvOyBkaXNwbGF5OiBibG9jaztcIixcbiAgICAgICAgXCJsaW5rXCI6IFwiY29sb3I6ICNlMGUwZTA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMGUwZTA7XCIsXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgXCJzdHJvbmdcIjogXCJmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM0YTRhNGE7XCIsXG4gICAgICAgICAgICBcImVtXCI6IFwiZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgICAgIFwiZGVsXCI6IFwidGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IGNvbG9yOiAjNGE0YTRhO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFibGVcIjoge1xuICAgICAgICAgICAgXCJjb250YWluZXJcIjogXCJ3aWR0aDogMTAwJTsgbWFyZ2luOiAxZW0gMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyOiAxcHggc29saWQgI2UxZTRlODtcIixcbiAgICAgICAgICAgIFwiaGVhZGVyXCI6IFwiYmFja2dyb3VuZDogI2Y2ZjhmYTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNGE0YTRhOyBib3JkZXItYm90dG9tOiAycHggc29saWQgI2UxZTRlODsgZm9udC1zaXplOiAxZW07XCIsXG4gICAgICAgICAgICBcImNlbGxcIjogXCJib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOyBwYWRkaW5nOiA4cHg7IGNvbG9yOiAjNGE0YTRhOyBmb250LXNpemU6IDFlbTtcIlxuICAgICAgICB9LFxuICAgICAgICBcImhyXCI6IFwiYm9yZGVyOiBub25lOyBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsgbWFyZ2luOiAyMHB4IDA7XCIsXG4gICAgICAgIFwiZm9vdG5vdGVcIjoge1xuICAgICAgICAgICAgXCJyZWZcIjogXCJjb2xvcjogI2UwZTBlMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDAuOWVtO1wiLFxuICAgICAgICAgICAgXCJiYWNrcmVmXCI6IFwiY29sb3I6ICNlMGUwZTA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAwLjllbTtcIlxuICAgICAgICB9XG4gICAgfVxufSIsICJ7XG4gICAgXCJpZFwiOiBcIm1pbmltYWxcIixcbiAgICBcIm5hbWVcIjogXCJcdTY3ODFcdTdCODBcdTRFM0JcdTk4OThcIixcbiAgICBcInN0eWxlc1wiOiB7XG4gICAgICAgIFwiY29udGFpbmVyXCI6IFwid2lkdGg6IDEwMCUgIWltcG9ydGFudDsgdGFibGUtbGF5b3V0OiBmaXhlZDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyOiBub25lOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IG1heC13aWR0aDogMTAwdnc7XCIsXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgXCJoMVwiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDMycHggMCAyNHB4OyBmb250LXNpemU6IDJlbTsgY29sb3I6ICMzQjQyNTI7IGxldHRlci1zcGFjaW5nOiAtMC4wMmVtO1wiLFxuICAgICAgICAgICAgXCJoMlwiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDI4cHggMCAyMHB4OyBmb250LXNpemU6IDEuNWVtOyBjb2xvcjogIzQzNEM1RTsgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjRweCAwIDE2cHg7IGZvbnQtc2l6ZTogMS4yNWVtOyBjb2xvcjogIzRDNTY2QTtcIixcbiAgICAgICAgICAgIFwiYmFzZVwiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDIwcHggMCAxNHB4OyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM1RTgxQUM7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhZ3JhcGhcIjogXCJsaW5lLWhlaWdodDogMS44OyBtYXJnaW4tYm90dG9tOiAxLjJlbTsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjNGE0YTRhO1wiLFxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgXCJjb250YWluZXJcIjogXCJwYWRkaW5nLWxlZnQ6IDIwcHg7IG1hcmdpbi1ib3R0b206IDEuMmVtOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgICAgIFwiaXRlbVwiOiBcIm1hcmdpbi1ib3R0b206IDAuNmVtOyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM0YTRhNGE7IGxpbmUtaGVpZ2h0OiAxLjg7XCIsXG4gICAgICAgICAgICBcInRhc2tMaXN0XCI6IFwibGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luLWxlZnQ6IC0yNHB4OyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM0YTRhNGE7IGxpbmUtaGVpZ2h0OiAxLjg7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIFwiYmxvY2tcIjogXCJiYWNrZ3JvdW5kOiAjZjhmOGY4OyBwYWRkaW5nOiAwLjVlbSAxZW0gMWVtOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IE9wZXJhdG9yIE1vbm8sIENvbnNvbGFzLCBNb25hY28sIE1lbmxvLCBtb25vc3BhY2U7IGxpbmUtaGVpZ2h0OiAxLjY7IHdoaXRlLXNwYWNlOiBwcmU7IG92ZXJmbG93LXg6IGF1dG87IHdvcmQtd3JhcDogbm9ybWFsOyBjb2xvcjogIzMzMzsgbWFyZ2luOiAxLjJlbSAwOyBib3JkZXI6IDFweCBzb2xpZCAjZWVlOyBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjA1KTsgd2lkdGg6IDEwMCU7XCIsXG4gICAgICAgICAgICBcImlubGluZVwiOiBcImJhY2tncm91bmQ6ICNmOGY4Zjg7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICMzMzM7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IE9wZXJhdG9yIE1vbm8sIENvbnNvbGFzLCBNb25hY28sIE1lbmxvLCBtb25vc3BhY2U7IGJvcmRlcjogMXB4IHNvbGlkICNlZWU7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdW90ZVwiOiBcImJvcmRlci1sZWZ0OiA0cHggc29saWQgIzgxQTFDMTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxNnB4IDIwcHg7IGJhY2tncm91bmQ6ICNmOGY5ZmM7IG1hcmdpbjogMC44ZW0gMDsgY29sb3I6ICM0QzU2NkE7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOiAxZW07IHdvcmQtd3JhcDogYnJlYWstd29yZDtcIixcbiAgICAgICAgXCJpbWFnZVwiOiBcIm1heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvOyBtYXJnaW46IDFlbSBhdXRvOyBkaXNwbGF5OiBibG9jaztcIixcbiAgICAgICAgXCJsaW5rXCI6IFwiY29sb3I6ICM1RTgxQUM7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4MUExQzE7IHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XCIsXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgXCJzdHJvbmdcIjogXCJmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM0YTRhNGE7XCIsXG4gICAgICAgICAgICBcImVtXCI6IFwiZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgICAgIFwiZGVsXCI6IFwidGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IGNvbG9yOiAjNGE0YTRhO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFibGVcIjoge1xuICAgICAgICAgICAgXCJjb250YWluZXJcIjogXCJ3aWR0aDogMTAwJTsgbWFyZ2luOiAxZW0gMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyOiAxcHggc29saWQgI2UxZTRlODtcIixcbiAgICAgICAgICAgIFwiaGVhZGVyXCI6IFwiYmFja2dyb3VuZDogI2Y2ZjhmYTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNGE0YTRhOyBib3JkZXItYm90dG9tOiAycHggc29saWQgI2UxZTRlODsgZm9udC1zaXplOiAxZW07XCIsXG4gICAgICAgICAgICBcImNlbGxcIjogXCJib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOyBwYWRkaW5nOiA4cHg7IGNvbG9yOiAjNGE0YTRhOyBmb250LXNpemU6IDFlbTtcIlxuICAgICAgICB9LFxuICAgICAgICBcImhyXCI6IFwiYm9yZGVyOiBub25lOyBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsgbWFyZ2luOiAyMHB4IDA7XCIsXG4gICAgICAgIFwiZm9vdG5vdGVcIjoge1xuICAgICAgICAgICAgXCJyZWZcIjogXCJjb2xvcjogI2UwZTBlMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDAuOWVtO1wiLFxuICAgICAgICAgICAgXCJiYWNrcmVmXCI6IFwiY29sb3I6ICNlMGUwZTA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAwLjllbTtcIlxuICAgICAgICB9XG4gICAgfVxufSIsICJ7XG4gICAgXCJpZFwiOiBcImVsZWdhbnRcIixcbiAgICBcIm5hbWVcIjogXCJcdTRGMThcdTk2QzVcdTRFM0JcdTk4OThcIixcbiAgICBcInN0eWxlc1wiOiB7XG4gICAgICAgIFwiY29udGFpbmVyXCI6IFwid2lkdGg6IDEwMCUgIWltcG9ydGFudDsgdGFibGUtbGF5b3V0OiBmaXhlZDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyOiBub25lOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IG1heC13aWR0aDogMTAwdnc7XCIsXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgXCJoMVwiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDMycHggMCAyNHB4OyBmb250LXNpemU6IDJlbTsgY29sb3I6ICM1NTNDOUE7IGxldHRlci1zcGFjaW5nOiAtMC4wM2VtOyBib3JkZXItYm90dG9tOiAycHggc29saWQgIzlGN0FFQTsgcGFkZGluZy1ib3R0b206IDAuM2VtO1wiLFxuICAgICAgICAgICAgXCJoMlwiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDI4cHggMCAyMHB4OyBmb250LXNpemU6IDEuNWVtOyBjb2xvcjogIzZCNDZDMTsgbGV0dGVyLXNwYWNpbmc6IC0wLjAyZW07IGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzlGN0FFQTsgcGFkZGluZy1sZWZ0OiAxMnB4O1wiLFxuICAgICAgICAgICAgXCJoM1wiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDI0cHggMCAxNnB4OyBmb250LXNpemU6IDEuMjVlbTsgY29sb3I6ICM4MDVBRDU7IGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1wiLFxuICAgICAgICAgICAgXCJiYXNlXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjBweCAwIDE0cHg7IGZvbnQtc2l6ZTogMWVtOyBjb2xvcjogIzlGN0FFQTtcIlxuICAgICAgICB9LFxuICAgICAgICBcInBhcmFncmFwaFwiOiBcImxpbmUtaGVpZ2h0OiAxLjg7IG1hcmdpbi1ib3R0b206IDEuMmVtOyBmb250LXNpemU6IDFlbTsgY29sb3I6ICM0YTRhNGE7XCIsXG4gICAgICAgIFwibGlzdFwiOiB7XG4gICAgICAgICAgICBcImNvbnRhaW5lclwiOiBcInBhZGRpbmctbGVmdDogMjBweDsgbWFyZ2luLWJvdHRvbTogMS4yZW07IGNvbG9yOiAjNGE0YTRhO1wiLFxuICAgICAgICAgICAgXCJpdGVtXCI6IFwibWFyZ2luLWJvdHRvbTogMC42ZW07IGZvbnQtc2l6ZTogMWVtOyBjb2xvcjogIzRhNGE0YTsgbGluZS1oZWlnaHQ6IDEuODtcIixcbiAgICAgICAgICAgIFwidGFza0xpc3RcIjogXCJsaXN0LXN0eWxlOiBub25lOyBtYXJnaW4tbGVmdDogLTI0cHg7IGZvbnQtc2l6ZTogMWVtOyBjb2xvcjogIzRhNGE0YTsgbGluZS1oZWlnaHQ6IDEuODtcIlxuICAgICAgICB9LFxuICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgXCJibG9ja1wiOiBcImJhY2tncm91bmQ6ICNmOGY4Zjg7IHBhZGRpbmc6IDAuNWVtIDFlbSAxZW07IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogT3BlcmF0b3IgTW9ubywgQ29uc29sYXMsIE1vbmFjbywgTWVubG8sIG1vbm9zcGFjZTsgbGluZS1oZWlnaHQ6IDEuNjsgd2hpdGUtc3BhY2U6IHByZTsgb3ZlcmZsb3cteDogYXV0bzsgd29yZC13cmFwOiBub3JtYWw7IGNvbG9yOiAjMzMzOyBtYXJnaW46IDEuMmVtIDA7IGJvcmRlcjogMXB4IHNvbGlkICNlZWU7IGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMDUpOyB3aWR0aDogMTAwJTtcIixcbiAgICAgICAgICAgIFwiaW5saW5lXCI6IFwiYmFja2dyb3VuZDogI2Y4ZjhmODsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogIzMzMzsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogT3BlcmF0b3IgTW9ubywgQ29uc29sYXMsIE1vbmFjbywgTWVubG8sIG1vbm9zcGFjZTsgYm9yZGVyOiAxcHggc29saWQgI2VlZTtcIlxuICAgICAgICB9LFxuICAgICAgICBcInF1b3RlXCI6IFwiYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjOUY3QUVBOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDE2cHggMjBweDsgYmFja2dyb3VuZDogI2Y1ZjNmZjsgbWFyZ2luOiAwLjhlbSAwOyBjb2xvcjogIzZCNDZDMTsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXNpemU6IDFlbTsgd29yZC13cmFwOiBicmVhay13b3JkO1wiLFxuICAgICAgICBcImltYWdlXCI6IFwibWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IG1hcmdpbjogMWVtIGF1dG87IGRpc3BsYXk6IGJsb2NrO1wiLFxuICAgICAgICBcImxpbmtcIjogXCJjb2xvcjogIzgwNUFENTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzlGN0FFQTsgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcIixcbiAgICAgICAgXCJlbXBoYXNpc1wiOiB7XG4gICAgICAgICAgICBcInN0cm9uZ1wiOiBcImZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgICAgIFwiZW1cIjogXCJmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNGE0YTRhO1wiLFxuICAgICAgICAgICAgXCJkZWxcIjogXCJ0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgY29sb3I6ICM0YTRhNGE7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBcImNvbnRhaW5lclwiOiBcIndpZHRoOiAxMDAlOyBtYXJnaW46IDFlbSAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBib3JkZXI6IDFweCBzb2xpZCAjZTFlNGU4O1wiLFxuICAgICAgICAgICAgXCJoZWFkZXJcIjogXCJiYWNrZ3JvdW5kOiAjZjZmOGZhOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM0YTRhNGE7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZTFlNGU4OyBmb250LXNpemU6IDFlbTtcIixcbiAgICAgICAgICAgIFwiY2VsbFwiOiBcImJvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7IHBhZGRpbmc6IDhweDsgY29sb3I6ICM0YTRhNGE7IGZvbnQtc2l6ZTogMWVtO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHJcIjogXCJib3JkZXI6IG5vbmU7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOyBtYXJnaW46IDIwcHggMDtcIixcbiAgICAgICAgXCJmb290bm90ZVwiOiB7XG4gICAgICAgICAgICBcInJlZlwiOiBcImNvbG9yOiAjZTBlMGUwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMC45ZW07XCIsXG4gICAgICAgICAgICBcImJhY2tyZWZcIjogXCJjb2xvcjogI2UwZTBlMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDAuOWVtO1wiXG4gICAgICAgIH1cbiAgICB9XG59IiwgIntcbiAgICBcImlkXCI6IFwiZGFya1wiLFxuICAgIFwibmFtZVwiOiBcIlx1NkRGMVx1ODI3Mlx1NEUzQlx1OTg5OFwiLFxuICAgIFwic3R5bGVzXCI6IHtcbiAgICAgICAgXCJjb250YWluZXJcIjogXCJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB0YWJsZS1sYXlvdXQ6IGZpeGVkOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBib3JkZXI6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgbWF4LXdpZHRoOiAxMDB2dztcIixcbiAgICAgICAgXCJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBcImgxXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMzJweCAwIDI0cHg7IGZvbnQtc2l6ZTogMmVtOyBjb2xvcjogIzRBOTBFMjsgbGV0dGVyLXNwYWNpbmc6IC0wLjAzZW07IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNEE5MEUyOyBwYWRkaW5nLWJvdHRvbTogMC4zZW07XCIsXG4gICAgICAgICAgICBcImgyXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjhweCAwIDIwcHg7IGZvbnQtc2l6ZTogMS41ZW07IGNvbG9yOiAjNUI5QkUwOyBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjNEE5MEUyOyBwYWRkaW5nLWxlZnQ6IDEycHg7XCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjRweCAwIDE2cHg7IGZvbnQtc2l6ZTogMS4yNWVtOyBjb2xvcjogIzZCQTVERTsgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XCIsXG4gICAgICAgICAgICBcImJhc2VcIjogXCJmb250LXdlaWdodDogYm9sZDsgbWFyZ2luOiAyMHB4IDAgMTRweDsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjN0JCMEREO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicGFyYWdyYXBoXCI6IFwibGluZS1oZWlnaHQ6IDEuODsgbWFyZ2luLWJvdHRvbTogMS4yZW07IGZvbnQtc2l6ZTogMWVtOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIFwiY29udGFpbmVyXCI6IFwicGFkZGluZy1sZWZ0OiAyMHB4OyBtYXJnaW4tYm90dG9tOiAxLjJlbTsgY29sb3I6ICM0YTRhNGE7XCIsXG4gICAgICAgICAgICBcIml0ZW1cIjogXCJtYXJnaW4tYm90dG9tOiAwLjZlbTsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjNGE0YTRhOyBsaW5lLWhlaWdodDogMS44O1wiLFxuICAgICAgICAgICAgXCJ0YXNrTGlzdFwiOiBcImxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbi1sZWZ0OiAtMjRweDsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjNGE0YTRhOyBsaW5lLWhlaWdodDogMS44O1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBcImJsb2NrXCI6IFwiYmFja2dyb3VuZDogI2Y4ZjhmODsgcGFkZGluZzogMC41ZW0gMWVtIDFlbTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBPcGVyYXRvciBNb25vLCBDb25zb2xhcywgTW9uYWNvLCBNZW5sbywgbW9ub3NwYWNlOyBsaW5lLWhlaWdodDogMS42OyB3aGl0ZS1zcGFjZTogcHJlOyBvdmVyZmxvdy14OiBhdXRvOyB3b3JkLXdyYXA6IG5vcm1hbDsgY29sb3I6ICMzMzM7IG1hcmdpbjogMS4yZW0gMDsgYm9yZGVyOiAxcHggc29saWQgI2VlZTsgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4wNSk7IHdpZHRoOiAxMDAlO1wiLFxuICAgICAgICAgICAgXCJpbmxpbmVcIjogXCJiYWNrZ3JvdW5kOiAjZjhmOGY4OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjMzMzOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBPcGVyYXRvciBNb25vLCBDb25zb2xhcywgTW9uYWNvLCBNZW5sbywgbW9ub3NwYWNlOyBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVvdGVcIjogXCJib3JkZXItbGVmdDogNHB4IHNvbGlkICM0QTkwRTI7IGJvcmRlci1yYWRpdXM6IDZweDsgcGFkZGluZzogMTZweCAyMHB4OyBiYWNrZ3JvdW5kOiAjRjVGOUZGOyBtYXJnaW46IDAuOGVtIDA7IGNvbG9yOiAjNEE1NTY4OyBmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtc2l6ZTogMWVtOyB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XCIsXG4gICAgICAgIFwiaW1hZ2VcIjogXCJtYXgtd2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsgbWFyZ2luOiAxZW0gYXV0bzsgZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICAgIFwibGlua1wiOiBcImNvbG9yOiAjNEE5MEUyOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNEE5MEUyOyB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1wiLFxuICAgICAgICBcImVtcGhhc2lzXCI6IHtcbiAgICAgICAgICAgIFwic3Ryb25nXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNGE0YTRhO1wiLFxuICAgICAgICAgICAgXCJlbVwiOiBcImZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM0YTRhNGE7XCIsXG4gICAgICAgICAgICBcImRlbFwiOiBcInRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyBjb2xvcjogIzRhNGE0YTtcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIFwiY29udGFpbmVyXCI6IFwid2lkdGg6IDEwMCU7IG1hcmdpbjogMWVtIDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGJvcmRlcjogMXB4IHNvbGlkICNlMWU0ZTg7XCIsXG4gICAgICAgICAgICBcImhlYWRlclwiOiBcImJhY2tncm91bmQ6ICNmNmY4ZmE7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzRhNGE0YTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNlMWU0ZTg7IGZvbnQtc2l6ZTogMWVtO1wiLFxuICAgICAgICAgICAgXCJjZWxsXCI6IFwiYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsgcGFkZGluZzogOHB4OyBjb2xvcjogIzRhNGE0YTsgZm9udC1zaXplOiAxZW07XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoclwiOiBcImJvcmRlcjogbm9uZTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMGYwZjA7IG1hcmdpbjogMjBweCAwO1wiLFxuICAgICAgICBcImZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIFwicmVmXCI6IFwiY29sb3I6ICNlMGUwZTA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAwLjllbTtcIixcbiAgICAgICAgICAgIFwiYmFja3JlZlwiOiBcImNvbG9yOiAjZTBlMGUwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMC45ZW07XCJcbiAgICAgICAgfVxuICAgIH1cbn0iLCAie1xuICAgIFwiaWRcIjogXCJhY2FkZW1pY1wiLFxuICAgIFwibmFtZVwiOiBcIlx1NUI2Nlx1NjcyRlx1NEUzQlx1OTg5OFwiLFxuICAgIFwic3R5bGVzXCI6IHtcbiAgICAgICAgXCJjb250YWluZXJcIjogXCJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB0YWJsZS1sYXlvdXQ6IGZpeGVkOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBib3JkZXI6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgbWF4LXdpZHRoOiAxMDB2dztcIixcbiAgICAgICAgXCJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBcImgxXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMzJweCAwIDI0cHg7IGZvbnQtc2l6ZTogMmVtOyBjb2xvcjogIzVENDAzNzsgbGV0dGVyLXNwYWNpbmc6IC0wLjAzZW07IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjOEQ2RTYzOyBwYWRkaW5nLWJvdHRvbTogMC4zZW07XCIsXG4gICAgICAgICAgICBcImgyXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjhweCAwIDIwcHg7IGZvbnQtc2l6ZTogMS41ZW07IGNvbG9yOiAjNkQ0QzQxOyBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjOEQ2RTYzOyBwYWRkaW5nLWxlZnQ6IDEycHg7XCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbjogMjRweCAwIDE2cHg7IGZvbnQtc2l6ZTogMS4yNWVtOyBjb2xvcjogIzc5NTU0ODsgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XCIsXG4gICAgICAgICAgICBcImJhc2VcIjogXCJmb250LXdlaWdodDogYm9sZDsgbWFyZ2luOiAyMHB4IDAgMTRweDsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjOEQ2RTYzO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicGFyYWdyYXBoXCI6IFwibGluZS1oZWlnaHQ6IDEuODsgbWFyZ2luLWJvdHRvbTogMS4yZW07IGZvbnQtc2l6ZTogMWVtOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgXCJxdW90ZVwiOiBcImJvcmRlci1sZWZ0OiA0cHggc29saWQgIzhENkU2MzsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxNnB4IDIwcHg7IGJhY2tncm91bmQ6ICNFRkVCRTk7IG1hcmdpbjogMC44ZW0gMDsgY29sb3I6ICM1RDQwMzc7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOiAxZW07IHdvcmQtd3JhcDogYnJlYWstd29yZDtcIixcbiAgICAgICAgXCJsaW5rXCI6IFwiY29sb3I6ICM3OTU1NDg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4RDZFNjM7IHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XCIsXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgXCJzdHJvbmdcIjogXCJmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzRhNGE0YTtcIixcbiAgICAgICAgICAgIFwiZW1cIjogXCJmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNGE0YTRhO1wiLFxuICAgICAgICAgICAgXCJkZWxcIjogXCJ0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgY29sb3I6ICM0YTRhNGE7XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIFwiY29udGFpbmVyXCI6IFwicGFkZGluZy1sZWZ0OiAyMHB4OyBtYXJnaW4tYm90dG9tOiAxLjJlbTsgY29sb3I6ICM0YTRhNGE7XCIsXG4gICAgICAgICAgICBcIml0ZW1cIjogXCJtYXJnaW4tYm90dG9tOiAwLjZlbTsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjNGE0YTRhOyBsaW5lLWhlaWdodDogMS44O1wiLFxuICAgICAgICAgICAgXCJ0YXNrTGlzdFwiOiBcImxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbi1sZWZ0OiAtMjRweDsgZm9udC1zaXplOiAxZW07IGNvbG9yOiAjNGE0YTRhOyBsaW5lLWhlaWdodDogMS44O1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBcImJsb2NrXCI6IFwiYmFja2dyb3VuZDogI2Y4ZjhmODsgcGFkZGluZzogMC41ZW0gMWVtIDFlbTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBPcGVyYXRvciBNb25vLCBDb25zb2xhcywgTW9uYWNvLCBNZW5sbywgbW9ub3NwYWNlOyBsaW5lLWhlaWdodDogMS42OyB3aGl0ZS1zcGFjZTogcHJlOyBvdmVyZmxvdy14OiBhdXRvOyB3b3JkLXdyYXA6IG5vcm1hbDsgY29sb3I6ICMzMzM7IG1hcmdpbjogMS4yZW0gMDsgYm9yZGVyOiAxcHggc29saWQgI2VlZTsgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4wNSk7IHdpZHRoOiAxMDAlO1wiLFxuICAgICAgICAgICAgXCJpbmxpbmVcIjogXCJiYWNrZ3JvdW5kOiAjZjhmOGY4OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjMzMzOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBPcGVyYXRvciBNb25vLCBDb25zb2xhcywgTW9uYWNvLCBNZW5sbywgbW9ub3NwYWNlOyBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1hZ2VcIjogXCJtYXgtd2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsgbWFyZ2luOiAxZW0gYXV0bzsgZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICAgIFwidGFibGVcIjoge1xuICAgICAgICAgICAgXCJjb250YWluZXJcIjogXCJ3aWR0aDogMTAwJTsgbWFyZ2luOiAxZW0gMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyOiAxcHggc29saWQgI2UxZTRlODtcIixcbiAgICAgICAgICAgIFwiaGVhZGVyXCI6IFwiYmFja2dyb3VuZDogI2Y2ZjhmYTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNGE0YTRhOyBib3JkZXItYm90dG9tOiAycHggc29saWQgI2UxZTRlODsgZm9udC1zaXplOiAxZW07XCIsXG4gICAgICAgICAgICBcImNlbGxcIjogXCJib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOyBwYWRkaW5nOiA4cHg7IGNvbG9yOiAjNGE0YTRhOyBmb250LXNpemU6IDFlbTtcIlxuICAgICAgICB9LFxuICAgICAgICBcImhyXCI6IFwiYm9yZGVyOiBub25lOyBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsgbWFyZ2luOiAyMHB4IDA7XCIsXG4gICAgICAgIFwiZm9vdG5vdGVcIjoge1xuICAgICAgICAgICAgXCJyZWZcIjogXCJjb2xvcjogI2UwZTBlMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDAuOWVtO1wiLFxuICAgICAgICAgICAgXCJiYWNrcmVmXCI6IFwiY29sb3I6ICNlMGUwZTA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAwLjllbTtcIlxuICAgICAgICB9XG4gICAgfVxufSIsICJpbXBvcnQgeyBQbHVnaW4sIE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IE1QVmlldywgVklFV19UWVBFX01QIH0gZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4vdGVtcGxhdGVNYW5hZ2VyJztcbmltcG9ydCB7IFNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vc2V0dGluZ3MnO1xuaW1wb3J0IHsgTVBDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcic7XG5pbXBvcnQgeyBEb25hdGVNYW5hZ2VyIH0gZnJvbSAnLi9kb25hdGVNYW5hZ2VyJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1QUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBwcml2YXRlIHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gICAgYXN5bmMgb25sb2FkKCkge1xuICAgICAgICAvLyBcdTUyMURcdTU5Q0JcdTUzMTZcdThCQkVcdTdGNkVcdTdCQTFcdTc0MDZcdTU2NjhcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBuZXcgU2V0dGluZ3NNYW5hZ2VyKHRoaXMpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzTWFuYWdlci5sb2FkU2V0dGluZ3MoKTtcblxuICAgICAgICAvLyBcdTUyMURcdTU5Q0JcdTUzMTZcdTZBMjFcdTY3N0ZcdTdCQTFcdTc0MDZcdTU2NjhcbiAgICAgICAgY29uc3QgdGVtcGxhdGVNYW5hZ2VyID0gbmV3IFRlbXBsYXRlTWFuYWdlcih0aGlzLmFwcCk7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTUyMURcdTU5Q0JcdTUzMTZcdThGNkNcdTYzNjJcdTU2NjhcbiAgICAgICAgTVBDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLmFwcCk7XG5cbiAgICAgICAgLy8gXHU2Q0U4XHU1MThDXHU4OUM2XHU1NkZFXG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KFxuICAgICAgICAgICAgVklFV19UWVBFX01QLFxuICAgICAgICAgICAgKGxlYWYpID0+IG5ldyBNUFZpZXcobGVhZiwgdGVtcGxhdGVNYW5hZ2VyLCB0aGlzLnNldHRpbmdzTWFuYWdlcilcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBcdTZERkJcdTUyQTBcdTU0N0RcdTRFRTRcdTUyMzBcdTU0N0RcdTRFRTRcdTk3NjJcdTY3N0ZcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAnb3Blbi1tcC1wcmV2aWV3JyxcbiAgICAgICAgICAgIG5hbWU6ICdcdTYyNTNcdTVGMDBcdTUxNkNcdTRGMTdcdTUzRjdcdTk4ODRcdTg5QzhcdTYzRDJcdTRFRjYnLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTYzRDJcdTRFRjZcdTUyQTBcdThGN0RcdTY1RjZcdTgxRUFcdTUyQThcdTZGQzBcdTZEM0JcdTg5QzZcdTU2RkVcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVZpZXcoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIE1QQ29udmVydGVyLmluaXRpYWxpemUodGhpcy5hcHApO1xuICAgIH1cblxuICAgIGFzeW5jIG9udW5sb2FkKCkge1xuICAgICAgICAvLyBcdTZFMDVcdTc0MDZcdTg5QzZcdTU2RkVcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShWSUVXX1RZUEVfTVApO1xuICAgIH1cbiAgICBcbiAgICBhc3luYyBhY3RpdmF0ZVZpZXcoKSB7XG4gICAgICAgIC8vIFx1NTk4Mlx1Njc5Q1x1ODlDNlx1NTZGRVx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOFx1RkYwQ1x1NkZDMFx1NkQzQlx1NUI4M1xuICAgICAgICBjb25zdCBsZWF2ZXMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZJRVdfVFlQRV9NUCk7XG4gICAgICAgIGlmIChsZWF2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYobGVhdmVzWzBdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFx1NTIxQlx1NUVGQVx1NjVCMFx1ODlDNlx1NTZGRVxuICAgICAgICBjb25zdCByaWdodExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKTtcbiAgICAgICAgaWYgKHJpZ2h0TGVhZikge1xuICAgICAgICAgICAgYXdhaXQgcmlnaHRMZWFmLnNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogVklFV19UWVBFX01QLFxuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gXHU1OTgyXHU2NzlDXHU2NUUwXHU2Q0Q1XHU4M0I3XHU1M0Q2XHU1M0YzXHU0RkE3XHU5NzYyXHU2NzdGXHVGRjBDXHU2NjNFXHU3OTNBXHU5NTE5XHU4QkVGXHU2M0QwXHU3OTNBXG4gICAgICAgICAgICBuZXcgTm90aWNlKCdcdTY1RTBcdTZDRDVcdTUyMUJcdTVFRkFcdTg5QzZcdTU2RkVcdTk3NjJcdTY3N0YnKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYsIE1hcmtkb3duUmVuZGVyZXIsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgTVBDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcic7XG5pbXBvcnQgeyBDb3B5TWFuYWdlciB9IGZyb20gJy4vY29weU1hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL3RlbXBsYXRlTWFuYWdlcic7XG5pbXBvcnQgeyBEb25hdGVNYW5hZ2VyIH0gZnJvbSAnLi9kb25hdGVNYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5leHBvcnQgY29uc3QgVklFV19UWVBFX01QID0gJ21wLXByZXZpZXcnO1xuXG5leHBvcnQgY2xhc3MgTVBWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIHByaXZhdGUgcHJldmlld0VsOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGN1cnJlbnRGaWxlOiBURmlsZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdXBkYXRlVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc1ByZXZpZXdMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGxvY2tCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIHByaXZhdGUgY29weUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZU1hbmFnZXI6IFRlbXBsYXRlTWFuYWdlcjtcbiAgICBwcml2YXRlIHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuICAgIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVTZWxlY3Q6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgY3VzdG9tRm9udFNlbGVjdDogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBmb250U2l6ZVNlbGVjdDogSFRNTElucHV0RWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBsZWFmOiBXb3Jrc3BhY2VMZWFmLCBcbiAgICAgICAgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXIsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGxlYWYpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlTWFuYWdlciA9IHRlbXBsYXRlTWFuYWdlcjtcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBzZXR0aW5nc01hbmFnZXI7XG4gICAgfVxuXG4gICAgZ2V0Vmlld1R5cGUoKSB7XG4gICAgICAgIHJldHVybiBWSUVXX1RZUEVfTVA7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVRleHQoKSB7XG4gICAgICAgIHJldHVybiAnXHU1MTZDXHU0RjE3XHU1M0Y3XHU5ODg0XHU4OUM4JztcbiAgICB9XG5cbiAgICBnZXRJY29uKCkge1xuICAgICAgIHJldHVybiAnZXllJztcbiAgICB9XG5cbiAgICAvLyBcdTU3Mjggb25PcGVuIFx1NjVCOVx1NkNENVx1NEUyRFx1NjZGNFx1NjVCMFx1NUU5NVx1OTBFOFx1OTUwMVx1NUI5QVx1NjMwOVx1OTRBRVx1NzY4NFx1NTIxQlx1NUVGQVxuICAgIGFzeW5jIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXTtcbiAgICAgICAgY29udGFpbmVyLmVtcHR5KCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ21wLXRvb2xiYXInIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gXHU5NTAxXHU1QjlBXHU2MzA5XHU5NEFFXG4gICAgICAgIHRoaXMubG9ja0J1dHRvbiA9IHRvb2xiYXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIGNsczogJ21wLWxvY2stYnV0dG9uJyxcbiAgICAgICAgICAgIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnXHU1MTczXHU5NUVEXHU1QjlFXHU2NUY2XHU5ODg0XHU4OUM4XHU3MkI2XHU2MDAxJyB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxvY2tCdXR0b24uaW5uZXJIVE1MID0gJ1x1RDgzRFx1REQxMyc7XG4gICAgICAgIHRoaXMubG9ja0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMudG9nZ2xlUHJldmlld0xvY2soKSk7XG4gICAgXG4gICAgICAgIC8vIFx1NTIxQlx1NUVGQVx1NEUyRFx1OTVGNFx1NjNBN1x1NEVGNlx1NUJCOVx1NTY2OFxuICAgICAgICBjb25zdCBjb250cm9sc0dyb3VwID0gdG9vbGJhci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdtcC1jb250cm9scy1ncm91cCcgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTUyMUJcdTVFRkFcdTgxRUFcdTVCOUFcdTRFNDlcdTRFMEJcdTYyQzlcdTkwMDlcdTYyRTlcdTU2NjhcbiAgICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZVNlbGVjdCA9IHRoaXMuY3JlYXRlQ3VzdG9tU2VsZWN0KFxuICAgICAgICAgICAgY29udHJvbHNHcm91cCxcbiAgICAgICAgICAgICdtcC10ZW1wbGF0ZS1zZWxlY3QnLFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUZW1wbGF0ZU9wdGlvbnMoKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlU2VsZWN0LmlkID0gJ3RlbXBsYXRlLXNlbGVjdCc7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTZERkJcdTUyQTBcdTZBMjFcdTY3N0ZcdTkwMDlcdTYyRTlcdTU2NjhcdTc2ODQgY2hhbmdlIFx1NEU4Qlx1NEVGNlx1NzZEMVx1NTQyQ1xuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b20tc2VsZWN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZS5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlTWFuYWdlci5zZXRDdXJyZW50VGVtcGxhdGUodmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5nc01hbmFnZXIudXBkYXRlU2V0dGluZ3Moe1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVNYW5hZ2VyLmFwcGx5VGVtcGxhdGUodGhpcy5wcmV2aWV3RWwpO1xuICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgdGhpcy5jdXN0b21Gb250U2VsZWN0ID0gdGhpcy5jcmVhdGVDdXN0b21TZWxlY3QoXG4gICAgICAgICAgICBjb250cm9sc0dyb3VwLFxuICAgICAgICAgICAgJ21wLWZvbnQtc2VsZWN0JyxcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9udE9wdGlvbnMoKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFx1NkRGQlx1NTJBMFx1NUI1N1x1NEY1M1x1OTAwOVx1NjJFOVx1NTY2OFx1NzY4NCBjaGFuZ2UgXHU0RThCXHU0RUY2XHU3NkQxXHU1NDJDXG4gICAgICAgIHRoaXMuY3VzdG9tRm9udFNlbGVjdC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tLXNlbGVjdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUuZGV0YWlsLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuc2V0Rm9udCh2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzTWFuYWdlci51cGRhdGVTZXR0aW5ncyh7XG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuYXBwbHlUZW1wbGF0ZSh0aGlzLnByZXZpZXdFbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmN1c3RvbUZvbnRTZWxlY3QuaWQgPSAnZm9udC1zZWxlY3QnO1xuICAgICAgICAvLyBcdTVCNTdcdTUzRjdcdThDMDNcdTY1NzRcbiAgICAgICAgY29uc3QgZm9udFNpemVHcm91cCA9IGNvbnRyb2xzR3JvdXAuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnbXAtZm9udC1zaXplLWdyb3VwJyB9KTtcbiAgICAgICAgY29uc3QgZGVjcmVhc2VCdXR0b24gPSBmb250U2l6ZUdyb3VwLmNyZWF0ZUVsKCdidXR0b24nLCB7IFxuICAgICAgICAgICAgY2xzOiAnbXAtZm9udC1zaXplLWJ0bicsXG4gICAgICAgICAgICB0ZXh0OiAnLSdcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm9udFNpemVTZWxlY3QgPSBmb250U2l6ZUdyb3VwLmNyZWF0ZUVsKCdpbnB1dCcsIHsgXG4gICAgICAgICAgICBjbHM6ICdtcC1mb250LXNpemUtaW5wdXQnLFxuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgdmFsdWU6ICcxNicsXG4gICAgICAgICAgICBhdHRyOiB7XG4gICAgICAgICAgICAgICAgc3R5bGU6ICdib3JkZXI6IG5vbmU7IG91dGxpbmU6IG5vbmU7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGluY3JlYXNlQnV0dG9uID0gZm9udFNpemVHcm91cC5jcmVhdGVFbCgnYnV0dG9uJywgeyBcbiAgICAgICAgICAgIGNsczogJ21wLWZvbnQtc2l6ZS1idG4nLFxuICAgICAgICAgICAgdGV4dDogJysnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NEVDRVx1OEJCRVx1N0Y2RVx1NEUyRFx1NjA2Mlx1NTkwRFx1NEUwQVx1NkIyMVx1NzY4NFx1OTAwOVx1NjJFOVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTYwNjJcdTU5MERcdThCQkVcdTdGNkVcbiAgICAgICAgaWYgKHNldHRpbmdzLnRlbXBsYXRlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlU2VsZWN0ID0gdGhpcy5jdXN0b21UZW1wbGF0ZVNlbGVjdC5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0ZWQtdGV4dCcpO1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVEcm9wZG93biA9IHRoaXMuY3VzdG9tVGVtcGxhdGVTZWxlY3QucXVlcnlTZWxlY3RvcignLnNlbGVjdC1kcm9wZG93bicpO1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlU2VsZWN0ICYmIHRlbXBsYXRlRHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gb3B0aW9uLmZpbmQobyA9PiBvLnZhbHVlID09PSBzZXR0aW5ncy50ZW1wbGF0ZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gXHU2NkY0XHU2NUIwXHU5MDA5XHU0RTJEXHU2NTg3XHU2NzJDXHU1NDhDXHU1MDNDXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU2VsZWN0LnRleHRDb250ZW50ID0gc2VsZWN0ZWQubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVTZWxlY3QucXVlcnlTZWxlY3RvcignLmN1c3RvbS1zZWxlY3QnKT8uc2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJywgc2VsZWN0ZWQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBcdTY2RjRcdTY1QjBcdTRFMEJcdTYyQzlcdTUyMTdcdTg4NjhcdTRFMkRcdTc2ODRcdTkwMDlcdTRFMkRcdTcyQjZcdTYwMDFcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEcm9wZG93bi5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0LWl0ZW0nKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSA9PT0gc2VsZWN0ZWQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlTWFuYWdlci5zZXRDdXJyZW50VGVtcGxhdGUoc2V0dGluZ3MudGVtcGxhdGVJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuZm9udEZhbWlseSkge1xuICAgICAgICAgICAgY29uc3QgZm9udFNlbGVjdCA9IHRoaXMuY3VzdG9tRm9udFNlbGVjdC5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0ZWQtdGV4dCcpO1xuICAgICAgICAgICAgY29uc3QgZm9udERyb3Bkb3duID0gdGhpcy5jdXN0b21Gb250U2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJy5zZWxlY3QtZHJvcGRvd24nKTtcbiAgICAgICAgICAgIGlmIChmb250U2VsZWN0ICYmIGZvbnREcm9wZG93bikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZ2V0Rm9udE9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG9wdGlvbi5maW5kKG8gPT4gby52YWx1ZSA9PT0gc2V0dGluZ3MuZm9udEZhbWlseSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFx1NjZGNFx1NjVCMFx1OTAwOVx1NEUyRFx1NjU4N1x1NjcyQ1x1NTQ4Q1x1NTAzQ1xuICAgICAgICAgICAgICAgICAgICBmb250U2VsZWN0LnRleHRDb250ZW50ID0gc2VsZWN0ZWQubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tRm9udFNlbGVjdC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tLXNlbGVjdCcpPy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnLCBzZWxlY3RlZC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFx1NjZGNFx1NjVCMFx1NEUwQlx1NjJDOVx1NTIxN1x1ODg2OFx1NEUyRFx1NzY4NFx1OTAwOVx1NEUyRFx1NzJCNlx1NjAwMVxuICAgICAgICAgICAgICAgICAgICBmb250RHJvcGRvd24ucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdC1pdGVtJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykgPT09IHNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuc2V0Rm9udChzZXR0aW5ncy5mb250RmFtaWx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy5mb250U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5mb250U2l6ZVNlbGVjdC52YWx1ZSA9IHNldHRpbmdzLmZvbnRTaXplLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlTWFuYWdlci5zZXRGb250U2l6ZShzZXR0aW5ncy5mb250U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBcdTY2RjRcdTY1QjBcdTVCNTdcdTUzRjdcdThDMDNcdTY1NzRcdTRFOEJcdTRFRjZcbiAgICAgICAgY29uc3QgdXBkYXRlRm9udFNpemUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gcGFyc2VJbnQodGhpcy5mb250U2l6ZVNlbGVjdC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlTWFuYWdlci5zZXRGb250U2l6ZShzaXplKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnVwZGF0ZVNldHRpbmdzKHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogc2l6ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlTWFuYWdlci5hcHBseVRlbXBsYXRlKHRoaXMucHJldmlld0VsKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBcdTVCNTdcdTUzRjdcdThDMDNcdTY1NzRcdTYzMDlcdTk0QUVcdTRFOEJcdTRFRjZcbiAgICAgICAgZGVjcmVhc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U2l6ZSA9IHBhcnNlSW50KHRoaXMuZm9udFNpemVTZWxlY3QudmFsdWUpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRTaXplID4gMTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvbnRTaXplU2VsZWN0LnZhbHVlID0gKGN1cnJlbnRTaXplIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVGb250U2l6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpbmNyZWFzZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gcGFyc2VJbnQodGhpcy5mb250U2l6ZVNlbGVjdC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFNpemUgPCAzMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9udFNpemVTZWxlY3QudmFsdWUgPSAoY3VycmVudFNpemUgKyAxKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUZvbnRTaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9udFNpemVTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlRm9udFNpemUpO1xuXG4gICAgICAgIC8vIFx1OTg4NFx1ODlDOFx1NTMzQVx1NTdERlxuICAgICAgICB0aGlzLnByZXZpZXdFbCA9IGNvbnRhaW5lci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdtcC1wcmV2aWV3LWFyZWEnIH0pO1xuXG4gICAgICAgIC8vIFx1NUU5NVx1OTBFOFx1NURFNVx1NTE3N1x1NjgwRlxuICAgICAgICBjb25zdCBib3R0b21CYXIgPSBjb250YWluZXIuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnbXAtYm90dG9tLWJhcicgfSk7XG5cbiAgICAgICAgLy8gXHU2REZCXHU1MkEwXHU0RjdGXHU3NTI4XHU4QkY0XHU2NjBFXHU2MzA5XHU5NEFFXG4gICAgICAgIGNvbnN0IGhlbHBCdXR0b24gPSBib3R0b21CYXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIGNsczogJ21wLWhlbHAtYnV0dG9uJyxcbiAgICAgICAgICAgIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnXHU0RjdGXHU3NTI4XHU2MzA3XHU1MzU3JyB9XG4gICAgICAgIH0pO1xuICAgICAgICBoZWxwQnV0dG9uLmlubmVySFRNTCA9ICdcdTI3NTMnO1xuICAgICAgICBcbiAgICAgICAgLy8gXHU1MjFCXHU1RUZBXHU2M0QwXHU3OTNBXHU2ODQ2XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSBib3R0b21CYXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgICAgICAgIGNsczogJ21wLWhlbHAtdG9vbHRpcCcsXG4gICAgICAgICAgICB0ZXh0OiBgXHU0RjdGXHU3NTI4XHU2MzA3XHU1MzU3XHVGRjFBXG4gICAgICAgICAgICAgICAgMS4gXHU5MDA5XHU2MkU5XHU1NTlDXHU2QjIyXHU3Njg0XHU0RTNCXHU5ODk4XHU2QTIxXHU2NzdGXG4gICAgICAgICAgICAgICAgMi4gXHU4QzAzXHU2NTc0XHU1QjU3XHU0RjUzXHU1NDhDXHU1QjU3XHU1M0Y3XG4gICAgICAgICAgICAgICAgMy4gXHU1QjlFXHU2NUY2XHU5ODg0XHU4OUM4XHU2NTQ4XHU2NzlDXG4gICAgICAgICAgICAgICAgNC4gXHU3MEI5XHU1MUZCXHUzMDEwXHU1OTBEXHU1MjM2XHU2MzA5XHU5NEFFXHUzMDExXHU1MzczXHU1M0VGXHU3Qzk4XHU4RDM0XHU1MjMwXHU1MTZDXHU0RjE3XHU1M0Y3XG4gICAgICAgICAgICAgICAgNS4gXHU3RjE2XHU4RjkxXHU1QjlFXHU2NUY2XHU2N0U1XHU3NzBCXHU2NTQ4XHU2NzlDXHVGRjBDXHU3MEI5XHVEODNEXHVERDEzXHU1MTczXHU5NUVEXHU1QjlFXHU2NUY2XHU1MjM3XHU2NUIwXG4gICAgICAgICAgICAgICAgNi4gXHU1OTgyXHU2NzlDXHU0RjYwXHU1NTlDXHU2QjIyXHU4RkQ5XHU0RTJBXHU2M0QyXHU0RUY2XHVGRjBDXHU2QjIyXHU4RkNFXHU2MjUzXHU4RDRGYFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gXHU1MjFCXHU1RUZBXHU0RTJEXHU5NUY0XHU2M0E3XHU0RUY2XHU1QkI5XHU1NjY4XG4gICAgICAgIGNvbnN0IGJvdHRvbUNvbnRyb2xzR3JvdXAgPSBib3R0b21CYXIuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnbXAtYm90dG9tLWNvbnRyb2xzLWdyb3VwJyB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFx1OEJGN1x1NEY1Q1x1ODAwNVx1NTU5RFx1NTQ5Nlx1NTU2MVx1NjMwOVx1OTRBRVxuICAgICAgICBjb25zdCBsaWtlQnV0dG9uID0gYm90dG9tQ29udHJvbHNHcm91cC5jcmVhdGVFbCgnYnV0dG9uJywgeyBcbiAgICAgICAgICAgIGNsczogJ21wLWxpa2UtYnV0dG9uJ1xuICAgICAgICB9KTtcbiAgICAgICAgbGlrZUJ1dHRvbi5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDRweFwiPlx1MjYxNVx1RkUwRjwvc3Bhbj5cdTU1OUNcdTZCMjJcdTRGNUNcdTgwMDUnO1xuICAgICAgICBsaWtlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgRG9uYXRlTWFuYWdlci5zaG93RG9uYXRlTW9kYWwodGhpcy5jb250YWluZXJFbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NTcyOFx1NjNBN1x1NEVGNlx1NUJCOVx1NTY2OFx1NEUyRFx1NTIxQlx1NUVGQVx1NjMwOVx1OTRBRVxuICAgICAgICB0aGlzLmNvcHlCdXR0b24gPSBib3R0b21Db250cm9sc0dyb3VwLmNyZWF0ZUVsKCdidXR0b24nLCB7IFxuICAgICAgICAgICAgdGV4dDogJ1x1NTkwRFx1NTIzNlx1NEUzQVx1NTE2Q1x1NEYxN1x1NTNGN1x1NjgzQ1x1NUYwRicsXG4gICAgICAgICAgICBjbHM6ICdtcC1jb3B5LWJ1dHRvbidcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV3QnV0dG9uID0gYm90dG9tQ29udHJvbHNHcm91cC5jcmVhdGVFbCgnYnV0dG9uJywgeyBcbiAgICAgICAgICAgIHRleHQ6ICdcdTY1NkNcdThCRjdcdTY3MUZcdTVGODUnLFxuICAgICAgICAgICAgY2xzOiAnbXAtbmV3LWJ1dHRvbidcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU2REZCXHU1MkEwXHU1OTBEXHU1MjM2XHU2MzA5XHU5NEFFXHU3MEI5XHU1MUZCXHU0RThCXHU0RUY2XG4gICAgICAgIHRoaXMuY29weUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpZXdFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29weUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5QnV0dG9uLnNldFRleHQoJ1x1NTkwRFx1NTIzNlx1NEUyRC4uLicpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IENvcHlNYW5hZ2VyLmNvcHlUb0NsaXBib2FyZCh0aGlzLnByZXZpZXdFbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUJ1dHRvbi5zZXRUZXh0KCdcdTU5MERcdTUyMzZcdTYyMTBcdTUyOUYnKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3B5QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcHlCdXR0b24uc2V0VGV4dCgnXHU1OTBEXHU1MjM2XHU0RTNBXHU1MTZDXHU0RjE3XHU1M0Y3XHU2ODNDXHU1RjBGJyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUJ1dHRvbi5zZXRUZXh0KCdcdTU5MERcdTUyMzZcdTU5MzFcdThEMjUnKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcHlCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUJ1dHRvbi5zZXRUZXh0KCdcdTU5MERcdTUyMzZcdTRFM0FcdTUxNkNcdTRGMTdcdTUzRjdcdTY4M0NcdTVGMEYnKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTc2RDFcdTU0MkNcdTY1ODdcdTY4NjNcdTUzRDhcdTUzMTZcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uRmlsZU9wZW4uYmluZCh0aGlzKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBcdTc2RDFcdTU0MkNcdTY1ODdcdTY4NjNcdTUxODVcdTVCQjlcdTUzRDhcdTUzMTZcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgICAgICAgdGhpcy5hcHAudmF1bHQub24oJ21vZGlmeScsIHRoaXMub25GaWxlTW9kaWZ5LmJpbmQodGhpcykpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gXHU2OEMwXHU2N0U1XHU1RjUzXHU1MjREXHU2MjUzXHU1RjAwXHU3Njg0XHU2NTg3XHU0RUY2XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkZpbGVPcGVuKGN1cnJlbnRGaWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNvbnRyb2xzU3RhdGUoZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmxvY2tCdXR0b24uZGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgLy8gXHU2NkY0XHU2NUIwXHU4MUVBXHU1QjlBXHU0RTQ5XHU5MDA5XHU2MkU5XHU1NjY4XHU3Njg0XHU3OTgxXHU3NTI4XHU3MkI2XHU2MDAxXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlU2VsZWN0ID0gdGhpcy5jdXN0b21UZW1wbGF0ZVNlbGVjdC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tLXNlbGVjdCcpO1xuICAgICAgICBjb25zdCBmb250U2VsZWN0ID0gdGhpcy5jdXN0b21Gb250U2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b20tc2VsZWN0Jyk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZVNlbGVjdCkge1xuICAgICAgICAgICAgdGVtcGxhdGVTZWxlY3QuY2xhc3NMaXN0LnRvZ2dsZSgnZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG4gICAgICAgICAgICAvLyBcdTRGN0ZcdTc1MjhzZXRBdHRyaWJ1dGVcdTY3NjVcdThCQkVcdTdGNkVzdHlsZVx1NUM1RVx1NjAyN1xuICAgICAgICAgICAgdGVtcGxhdGVTZWxlY3Quc2V0QXR0cmlidXRlKCdzdHlsZScsIGBwb2ludGVyLWV2ZW50czogJHtlbmFibGVkID8gJ2F1dG8nIDogJ25vbmUnfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250U2VsZWN0KSB7XG4gICAgICAgICAgICBmb250U2VsZWN0LmNsYXNzTGlzdC50b2dnbGUoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuICAgICAgICAgICAgLy8gXHU0RjdGXHU3NTI4c2V0QXR0cmlidXRlXHU2NzY1XHU4QkJFXHU3RjZFc3R5bGVcdTVDNUVcdTYwMjdcbiAgICAgICAgICAgIGZvbnRTZWxlY3Quc2V0QXR0cmlidXRlKCdzdHlsZScsIGBwb2ludGVyLWV2ZW50czogJHtlbmFibGVkID8gJ2F1dG8nIDogJ25vbmUnfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9udFNpemVTZWxlY3QuZGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgdGhpcy5jb3B5QnV0dG9uLmRpc2FibGVkID0gIWVuYWJsZWQ7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTZERkJcdTUyQTBcdTVCNTdcdTUzRjdcdThDMDNcdTgyODJcdTYzMDlcdTk0QUVcdTc2ODRcdTcyQjZcdTYwMDFcdTYzQTdcdTUyMzZcbiAgICAgICAgY29uc3QgZm9udFNpemVCdXR0b25zID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcubXAtZm9udC1zaXplLWJ0bicpO1xuICAgICAgICBmb250U2l6ZUJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICAgICAgKGJ1dHRvbiBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25GaWxlT3BlbihmaWxlOiBURmlsZSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsZSA9IGZpbGU7XG4gICAgICAgIGlmICghZmlsZSB8fCBmaWxlLmV4dGVuc2lvbiAhPT0gJ21kJykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3RWwuZW1wdHkoKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlld0VsLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ1x1NTNFQVx1ODBGRFx1OTg4NFx1ODlDOCBNYXJrZG93biBcdTY1ODdcdTY3MkNcdTY1ODdcdTY4NjMnLFxuICAgICAgICAgICAgICAgIGNsczogJ21wLWVtcHR5LW1lc3NhZ2UnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udHJvbHNTdGF0ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbnRyb2xzU3RhdGUodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXNQcmV2aWV3TG9ja2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9ja0J1dHRvbi5pbm5lckhUTUwgPSAnXHVEODNEXHVERDEzJztcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB0b2dnbGVQcmV2aWV3TG9jaygpIHtcbiAgICAgICAgdGhpcy5pc1ByZXZpZXdMb2NrZWQgPSAhdGhpcy5pc1ByZXZpZXdMb2NrZWQ7XG4gICAgICAgIGNvbnN0IGxvY2tJY29uID0gdGhpcy5pc1ByZXZpZXdMb2NrZWQgPyAnXHVEODNEXHVERDEyJyA6ICdcdUQ4M0RcdUREMTMnO1xuICAgICAgICBjb25zdCBsb2NrU3RhdHVzID0gdGhpcy5pc1ByZXZpZXdMb2NrZWQgPyAnXHU1RjAwXHU1NDJGXHU1QjlFXHU2NUY2XHU5ODg0XHU4OUM4XHU3MkI2XHU2MDAxJyA6ICdcdTUxNzNcdTk1RURcdTVCOUVcdTY1RjZcdTk4ODRcdTg5QzhcdTcyQjZcdTYwMDEnO1xuICAgICAgICB0aGlzLmxvY2tCdXR0b24uaW5uZXJIVE1MID0gbG9ja0ljb247XG4gICAgICAgIHRoaXMubG9ja0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBsb2NrU3RhdHVzKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5pc1ByZXZpZXdMb2NrZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUHJldmlldygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25GaWxlTW9kaWZ5KGZpbGU6IFRGaWxlKSB7XG4gICAgICAgIGlmIChmaWxlID09PSB0aGlzLmN1cnJlbnRGaWxlICYmICF0aGlzLmlzUHJldmlld0xvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudXBkYXRlVGltZXIpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVByZXZpZXcoKTtcbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVQcmV2aWV3KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudEZpbGUpIHJldHVybjtcblxuICAgICAgICB0aGlzLnByZXZpZXdFbC5lbXB0eSgpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZCh0aGlzLmN1cnJlbnRGaWxlKTtcbiAgICAgICAgXG4gICAgICAgIC8vIDEuIFx1NTE0OFx1OEY2Q1x1NjM2MiBNYXJrZG93biBcdTRFM0EgSFRNTFxuICAgICAgICBhd2FpdCBNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKFxuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIHRoaXMucHJldmlld0VsLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RmlsZS5wYXRoLFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIDIuIFx1NjgzQ1x1NUYwRlx1NTMxNlx1NTE4NVx1NUJCOSAoXHU1M0VBXHU1NzI4XHU1MTg1XHU1QkI5XHU2NkY0XHU2NUIwXHU2NUY2XHU2MjY3XHU4ODRDKVxuICAgICAgICBNUENvbnZlcnRlci5mb3JtYXRDb250ZW50KHRoaXMucHJldmlld0VsKTtcblxuICAgICAgICAvLyAzLiBcdTVFOTRcdTc1MjhcdTZBMjFcdTY3N0ZcdTY4MzdcdTVGMEZcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuYXBwbHlUZW1wbGF0ZSh0aGlzLnByZXZpZXdFbCk7XG4gICAgfVxuXG4gICAgLy8gXHU2REZCXHU1MkEwXHU4MUVBXHU1QjlBXHU0RTQ5XHU0RTBCXHU2MkM5XHU5MDA5XHU2MkU5XHU1NjY4XHU1MjFCXHU1RUZBXHU2NUI5XHU2Q0Q1XG4gICAgcHJpdmF0ZSBjcmVhdGVDdXN0b21TZWxlY3QoXG4gICAgICAgIHBhcmVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudC5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdjdXN0b20tc2VsZWN0LWNvbnRhaW5lcicgfSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGNvbnRhaW5lci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdjdXN0b20tc2VsZWN0JyB9KTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0LmNyZWF0ZUVsKCdzcGFuJywgeyBjbHM6ICdzZWxlY3RlZC10ZXh0JyB9KTtcbiAgICAgICAgY29uc3QgYXJyb3cgPSBzZWxlY3QuY3JlYXRlRWwoJ3NwYW4nLCB7IGNsczogJ3NlbGVjdC1hcnJvdycsIHRleHQ6ICdcdTI1QkUnIH0pO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZHJvcGRvd24gPSBjb250YWluZXIuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnc2VsZWN0LWRyb3Bkb3duJyB9KTtcbiAgICAgICAgXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRyb3Bkb3duLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICAgICAgICAgICAgY2xzOiAnc2VsZWN0LWl0ZW0nLFxuICAgICAgICAgICAgICAgIHRleHQ6IG9wdGlvbi5sYWJlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGl0ZW0uZGF0YXNldC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gXHU3OUZCXHU5NjY0XHU1MTc2XHU0RUQ2XHU5ODc5XHU3Njg0XHU5MDA5XHU0RTJEXHU3MkI2XHU2MDAxXG4gICAgICAgICAgICAgICAgZHJvcGRvd24ucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdC1pdGVtJykuZm9yRWFjaChlbCA9PiBcbiAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgICAgICAgICAgICAgLy8gXHU2REZCXHU1MkEwXHU1RjUzXHU1MjREXHU5ODc5XHU3Njg0XHU5MDA5XHU0RTJEXHU3MkI2XHU2MDAxXG4gICAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGV4dC50ZXh0Q29udGVudCA9IG9wdGlvbi5sYWJlbDtcbiAgICAgICAgICAgICAgICBzZWxlY3QuZGF0YXNldC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgICAgICAgICAgc2VsZWN0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogeyB2YWx1ZTogb3B0aW9uLnZhbHVlIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBcdThCQkVcdTdGNkVcdTlFRDhcdThCQTRcdTUwM0NcdTU0OENcdTkwMDlcdTRFMkRcdTcyQjZcdTYwMDFcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRUZXh0LnRleHRDb250ZW50ID0gb3B0aW9uc1swXS5sYWJlbDtcbiAgICAgICAgICAgIHNlbGVjdC5kYXRhc2V0LnZhbHVlID0gb3B0aW9uc1swXS52YWx1ZTtcbiAgICAgICAgICAgIGRyb3Bkb3duLnF1ZXJ5U2VsZWN0b3IoJy5zZWxlY3QtaXRlbScpPy5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBcdTcwQjlcdTUxRkJcdTY2M0VcdTc5M0EvXHU5NjkwXHU4NUNGXHU0RTBCXHU2MkM5XHU1MjE3XHU4ODY4XG4gICAgICAgIHNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZHJvcGRvd24uY2xhc3NMaXN0LnRvZ2dsZSgnc2hvdycpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFx1NzBCOVx1NTFGQlx1NTE3Nlx1NEVENlx1NTczMFx1NjVCOVx1NTE3M1x1OTVFRFx1NEUwQlx1NjJDOVx1NTIxN1x1ODg2OFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8vIFx1ODNCN1x1NTNENlx1NkEyMVx1Njc3Rlx1OTAwOVx1OTg3OVxuICAgIHByaXZhdGUgYXN5bmMgZ2V0VGVtcGxhdGVPcHRpb25zKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5sb2FkVGVtcGxhdGVzKCk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmdldEFsbFRlbXBsYXRlcygpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHRlbXBsYXRlcy5tYXAodCA9PiAoeyB2YWx1ZTogdC5pZCwgbGFiZWw6IHQubmFtZSB9KSlcbiAgICAgICAgICAgIDogW3sgdmFsdWU6ICdkZWZhdWx0JywgbGFiZWw6ICdcdTlFRDhcdThCQTRcdTZBMjFcdTY3N0YnIH1dO1xuICAgIH1cblxuICAgIC8vIFx1ODNCN1x1NTNENlx1NUI1N1x1NEY1M1x1OTAwOVx1OTg3OVxuICAgIHByaXZhdGUgZ2V0Rm9udE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnT3B0aW1hLVJlZ3VsYXIsIE9wdGltYSwgUGluZ0ZhbmdTQy1saWdodCwgUGluZ0ZhbmdUQy1saWdodCwgXCJQaW5nRmFuZyBTQ1wiLCBDYW1icmlhLCBDb2NoaW4sIEdlb3JnaWEsIFRpbWVzLCBcIlRpbWVzIE5ldyBSb21hblwiLCBzZXJpZicsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdcdTlFRDhcdThCQTRcdTVCNTdcdTRGNTMnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ1NpbVN1biwgXCJcdTVCOEJcdTRGNTNcIiwgc2VyaWYnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU1QjhCXHU0RjUzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdTaW1IZWksIFwiXHU5RUQxXHU0RjUzXCIsIHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU5RUQxXHU0RjUzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdLYWlUaSwgXCJcdTY5NzdcdTRGNTNcIiwgc2VyaWYnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU2OTc3XHU0RjUzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdcIk1pY3Jvc29mdCBZYUhlaVwiLCBcIlx1NUZBRVx1OEY2Rlx1OTZDNVx1OUVEMVwiLCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1x1OTZDNVx1OUVEMSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG59IiwgImltcG9ydCB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuZXhwb3J0IGNsYXNzIE1QQ29udmVydGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBhcHA6IEFwcDtcblxuICAgIHN0YXRpYyBpbml0aWFsaXplKGFwcDogQXBwKSB7XG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXRDb250ZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIC8vIFx1NTIxQlx1NUVGQVx1ODg2OFx1NjgzQ1x1NTMwNVx1ODhGOVxuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3JlYXRlV3JhcHBlclRhYmxlKGVsZW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU1NDA0XHU3OUNEIE1hcmtkb3duIFx1NTE0M1x1N0QyMFxuICAgICAgICB0aGlzLnByb2Nlc3NFbGVtZW50cyh0YWJsZS5xdWVyeVNlbGVjdG9yKCd0ZCcpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGVXcmFwcGVyVGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MVGFibGVFbGVtZW50IHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpO1xuICAgICAgICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcbiAgICAgICAgY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXG4gICAgICAgIHRhYmxlLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICB0YWJsZS5zdHlsZS5ib3JkZXJDb2xsYXBzZSA9ICdjb2xsYXBzZSc7XG4gICAgICAgIHRkLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnO1xuXG4gICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRkLmFwcGVuZENoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XG4gICAgICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTtcbiAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRhYmxlKTtcblxuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHJvY2Vzc0VsZW1lbnRzKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU1RjNBXHU4QzAzXHU2NTg3XHU2NzJDXG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdzdHJvbmcsIGVtJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAoZWwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU5NEZFXHU2M0E1XG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdhJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAoZWwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmNvbG9yID0gJyM1NzZiOTUnO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU4ODY4XHU2ODNDXG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgaWYgKGVsID09PSBjb250YWluZXIuY2xvc2VzdCgndGFibGUnKSkgcmV0dXJuO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxUYWJsZUVsZW1lbnQpLnN0eWxlLmJvcmRlckNvbGxhcHNlID0gJ2NvbGxhcHNlJztcbiAgICAgICAgICAgIChlbCBhcyBIVE1MVGFibGVFbGVtZW50KS5zdHlsZS5tYXJnaW4gPSAnMWVtIDAnO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxUYWJsZUVsZW1lbnQpLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTU5MDRcdTc0MDZcdTg4NjhcdTY4M0NcdTUzNTVcdTUxNDNcdTY4M0NcbiAgICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLCB0ZCcpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgaWYgKGVsID09PSBjb250YWluZXIuY2xvc2VzdCgndGQnKSkgcmV0dXJuO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KS5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNkZmRmZGYnO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KS5zdHlsZS5wYWRkaW5nID0gJzhweCc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NTkwNFx1NzQwNlx1NTIwNlx1NTI3Mlx1N0VCRlxuICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaHInKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYm9yZGVyID0gJ25vbmUnO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5ib3JkZXJUb3AgPSAnMXB4IHNvbGlkICNkZmRmZGYnO1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5tYXJnaW4gPSAnMjBweCAwJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU1MjIwXHU5NjY0XHU3RUJGXG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdkZWwnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU0RUZCXHU1MkExXHU1MjE3XHU4ODY4XG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcudGFzay1saXN0LWl0ZW0nKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUubGlzdFN0eWxlID0gJ25vbmUnO1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3ggPSBlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgICAgICAgICAgIGlmIChjaGVja2JveCkge1xuICAgICAgICAgICAgICAgIChjaGVja2JveCBhcyBIVE1MRWxlbWVudCkuc3R5bGUubWFyZ2luUmlnaHQgPSAnNnB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU4MTFBXHU2Q0U4XG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZm9vdG5vdGUtcmVmLCAuZm9vdG5vdGUtYmFja3JlZicpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5jb2xvciA9ICcjNTc2Yjk1JztcbiAgICAgICAgICAgIChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbm9uZSc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NTkwNFx1NzQwNlx1NEVFM1x1NzgwMVx1NTc1N1xuICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgncHJlIGNvZGUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZSA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocHJlKSB7XG4gICAgICAgICAgICAgICAgLy8gXHU2REZCXHU1MkEwIG1hY09TIFx1OThDRVx1NjgzQ1x1NzY4NFx1N0E5N1x1NTNFM1x1NjMwOVx1OTRBRVxuICAgICAgICAgICAgICAgIGNvbnN0IGRvdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkb3RzLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogOHB4IDAgMTJweCAwO1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgICAgICAgICBnYXA6IDZweDtcbiAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3JzID0gWycjZmY1ZjU2JywgJyNmZmJkMmUnLCAnIzI3YzkzZiddO1xuICAgICAgICAgICAgICAgIGNvbG9ycy5mb3JFYWNoKGNvbG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgICAgICBkb3Quc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMnB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMnB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgIGRvdHMuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFx1NUMwNlx1N0VBMlx1N0VGRlx1NzA2Rlx1NjNEMlx1NTE2NVx1NTIzMFx1NEVFM1x1NzgwMVx1NTc1N1x1NzY4NFx1NjcwMFx1NTI0RFx1OTc2MlxuICAgICAgICAgICAgICAgIHByZS5pbnNlcnRCZWZvcmUoZG90cywgcHJlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIHByZS5zdHlsZS5wYWRkaW5nVG9wID0gJzMycHgnO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFx1NzlGQlx1OTY2NFx1NTM5Rlx1NjcwOVx1NzY4NFx1NTkwRFx1NTIzNlx1NjMwOVx1OTRBRVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlCdXR0b24gPSBwcmUucXVlcnlTZWxlY3RvcignLmNvcHktY29kZS1idXR0b24nKTtcbiAgICAgICAgICAgICAgICBpZiAoY29weUJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICBjb3B5QnV0dG9uLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU1NkZFXHU3MjQ3XG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLmludGVybmFsLWVtYmVkW2FsdF1bc3JjXScpLmZvckVhY2goYXN5bmMgZWwgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTcGFuID0gZWwgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBvcmlnaW5hbFNwYW4uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgIGNvbnN0IGFsdCA9IG9yaWdpbmFsU3Bhbi5nZXRBdHRyaWJ1dGUoJ2FsdCcpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXNyYykgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFx1ODNCN1x1NTNENlx1NjU4N1x1NEVGNlx1NzY4NFx1NTE0M1x1NjU3MFx1NjM2RVxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmt0ZXh0ID0gc3JjLnNwbGl0KCd8JylbMF07ICAvLyBcdTU5MDRcdTc0MDZcdTUzRUZcdTgwRkRcdTVFMjZcdTY3MDlcdTUyMkJcdTU0MERcdTc2ODRcdTk0RkVcdTYzQTVcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rdGV4dCwgJycpO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0UmVzb3VyY2VQYXRoKGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICAgICAgICAgICAgICBuZXdJbWcuc3JjID0gYWJzb2x1dGVQYXRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWx0KSBuZXdJbWcuYWx0ID0gYWx0O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gXHU1RTk0XHU3NTI4XHU2ODM3XHU1RjBGXG4gICAgICAgICAgICAgICAgICAgIG5ld0ltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgICAgICAgICAgbmV3SW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgICAgICAgICAgICAgICAgbmV3SW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICBuZXdJbWcuc3R5bGUubWFyZ2luID0gJzFlbSBhdXRvJztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFx1NzZGNFx1NjNBNVx1NjZGRlx1NjM2MiBzcGFuIFx1NTE0M1x1N0QyMFx1RkYwQ1x1NEZERFx1NzU1OVx1NkJCNVx1ODQzRFx1NEUyRFx1NzY4NFx1NTE3Nlx1NEVENlx1NTE4NVx1NUJCOVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNwYW4ucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKG5ld0ltZywgb3JpZ2luYWxTcGFuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1x1NTZGRVx1NzI0N1x1NTkwNFx1NzQwNlx1NTkzMVx1OEQyNTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NTkwNFx1NzQwNlx1NUYxNVx1NzUyOFx1NTc1N1xuICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnYmxvY2txdW90ZScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgLy8gXHU2RTA1XHU3NDA2XHU1RjE1XHU3NTI4XHU1NzU3XHU1MTg1XHU5MEU4XHU2QkI1XHU4NDNEXHU3Njg0XHU2ODM3XHU1RjBGXG4gICAgICAgICAgICBlbC5xdWVyeVNlbGVjdG9yQWxsKCdwJykuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgICBwLnN0eWxlLm1hcmdpbiA9ICcwJztcbiAgICAgICAgICAgICAgICBwLnN0eWxlLnBhZGRpbmcgPSAnMCc7XG4gICAgICAgICAgICAgICAgcC5zdHlsZS5saW5lSGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0iLCAiaW1wb3J0IHsgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgY2xhc3MgQ29weU1hbmFnZXIge1xuICAgIHByaXZhdGUgc3RhdGljIGNsZWFudXBIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIFx1NTIxQlx1NUVGQVx1NEUwMFx1NEUyQVx1NEUzNFx1NjVGNlx1NzY4NCBkaXYgXHU1MTQzXHU3RDIwXHU2NzY1XHU1OTA0XHU3NDA2IEhUTUxcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgICAgLy8gXHU3OUZCXHU5NjY0XHU2MjQwXHU2NzA5XHU3Njg0IGRhdGEtKiBcdTVDNUVcdTYwMjdcbiAgICAgICAgdGVtcERpdi5xdWVyeVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmF0dHJpYnV0ZXMpLmZvckVhY2goYXR0ciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZS5zdGFydHNXaXRoKCdkYXRhLScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTc5RkJcdTk2NjRcdTYyNDBcdTY3MDlcdTc2ODQgY2xhc3MgXHU1QzVFXHU2MDI3XG4gICAgICAgIHRlbXBEaXYucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTc5RkJcdTk2NjRcdTYyNDBcdTY3MDlcdTc2ODQgaWQgXHU1QzVFXHU2MDI3XG4gICAgICAgIHRlbXBEaXYucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdpZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGVtcERpdi5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgcHJvY2Vzc0ltYWdlcyhjb250YWluZXI6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGltYWdlcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcbiAgICAgICAgY29uc3QgaW1hZ2VBcnJheSA9IEFycmF5LmZyb20oaW1hZ2VzKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGltYWdlQXJyYXkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChpbWcuc3JjKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdcdTU2RkVcdTcyNDdcdThGNkNcdTYzNjJcdTU5MzFcdThEMjU6JywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjb3B5VG9DbGlwYm9hcmQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgICAgICAgLy8gXHU1OTA0XHU3NDA2XHU1NkZFXHU3MjQ3XHU4RjZDXHU2MzYyXHU0RTNBIGJhc2U2NFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzSW1hZ2VzKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIC8vIFx1NkUwNVx1NzQwNiBIVE1MXG4gICAgICAgICAgICBjb25zdCBjbGVhbkh0bWwgPSB0aGlzLmNsZWFudXBIdG1sKGNvbnRhaW5lci5pbm5lckhUTUwpO1xuXG4gICAgICAgICAgICAvLyBcdTUyMUJcdTVFRkFcdTUyNkFcdThEMzRcdTY3N0ZcdTY1NzBcdTYzNkVcbiAgICAgICAgICAgIGNvbnN0IGNsaXBEYXRhID0gbmV3IENsaXBib2FyZEl0ZW0oe1xuICAgICAgICAgICAgICAgICd0ZXh0L2h0bWwnOiBuZXcgQmxvYihbY2xlYW5IdG1sXSwgeyB0eXBlOiAndGV4dC9odG1sJyB9KSxcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbic6IG5ldyBCbG9iKFtjb250YWluZXIudGV4dENvbnRlbnQgfHwgJyddLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW2NsaXBEYXRhXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoJ1x1NURGMlx1NTkwRFx1NTIzNlx1NTIzMFx1NTI2QVx1OEQzNFx1Njc3RicpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbmV3IE5vdGljZSgnXHU1OTBEXHU1MjM2XHU1OTMxXHU4RDI1Jyk7XG4gICAgICAgIH1cbiAgICB9XG59IiwgImV4cG9ydCBjbGFzcyBEb25hdGVNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBvdmVybGF5OiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHN0YXRpYyBtb2RhbDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3dEb25hdGVNb2RhbChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IGNvbnRhaW5lci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICAgICAgY2xzOiAnbXAtZG9uYXRlLW92ZXJsYXknXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubW9kYWwgPSB0aGlzLm92ZXJsYXkuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgICAgICAgIGNsczogJ21wLWRvbmF0ZS1tb2RhbCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSB0aGlzLm1vZGFsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICAgICAgICBjbHM6ICdtcC1kb25hdGUtY2xvc2UnLFxuICAgICAgICAgICAgdGV4dDogJ1x1MDBENydcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tb2RhbC5jcmVhdGVFbCgnaDMnLCB7XG4gICAgICAgICAgICB0ZXh0OiAnXHU1MTczXHU2Q0U4XHU0RjVDXHU4MDA1JyxcbiAgICAgICAgICAgIGNsczogJ21wLWRvbmF0ZS10aXRsZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMubW9kYWwuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgICAgICAgIGNsczogJ21wLWRvbmF0ZS1jb250ZW50J1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTZERkJcdTUyQTBcdTZFMjlcdTk5QThcdTYzRDBcdTc5M0FcbiAgICAgICAgY29udGVudC5jcmVhdGVFbCgncCcsIHtcbiAgICAgICAgICAgIHRleHQ6ICdcdTU5ODJcdTY3OUNcdTRGNjBcdTU1OUNcdTZCMjJcdThGRDlcdTRFMkFcdTYzRDJcdTRFRjZcdUZGMENcdTZCMjJcdThGQ0VcdTUxNzNcdTZDRThcdTYyMTFcdTc2ODRcdTUxNkNcdTRGMTdcdTUzRjcgXHUyNzY0XHVGRTBGJyxcbiAgICAgICAgICAgIGNsczogJ21wLWRvbmF0ZS1kZXNjJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTUyMUJcdTVFRkFcdTRFOENcdTdFRjRcdTc4MDFcdTY2M0VcdTc5M0FcdTUzM0FcdTU3REZcbiAgICAgICAgY29uc3QgcXJDb250YWluZXIgPSBjb250ZW50LmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICAgICAgICBjbHM6ICdtcC1kb25hdGUtcXItY29udGFpbmVyJ1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBxckNvZGUgPSBxckNvbnRhaW5lci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICAgICAgY2xzOiAnbXAtZG9uYXRlLXFyIGFjdGl2ZSdcbiAgICAgICAgfSk7XG4gICAgICAgIHFyQ29kZS5jcmVhdGVFbCgnaW1nJywge1xuICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgIHNyYzogJy4vYXNzZXRzL3FyY29kZS5wbmcnLFxuICAgICAgICAgICAgICAgIGFsdDogJ1x1NTE2Q1x1NEYxN1x1NTNGN1x1NEU4Q1x1N0VGNFx1NzgwMSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU2REZCXHU1MkEwXHU1MTZDXHU0RjE3XHU1M0Y3XHU1NDBEXHU3OUYwXG4gICAgICAgIGNvbnRlbnQuY3JlYXRlRWwoJ3AnLCB7XG4gICAgICAgICAgICB0ZXh0OiAnXHU1MTZDXHU0RjE3XHU1M0Y3XHVGRjFBXHU1OTFDXHU1MzRBJyxcbiAgICAgICAgICAgIGNsczogJ21wLWRvbmF0ZS1kZXNjJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTZERkJcdTUyQTBcdTUxNzNcdTk1RURcdTRFOEJcdTRFRjZcbiAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlRG9uYXRlTW9kYWwoKSk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IHRoaXMub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VEb25hdGVNb2RhbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjbG9zZURvbmF0ZU1vZGFsKCkge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwgIi8vIFx1NEY3Rlx1NzUyOCByZXF1aXJlIFx1NUJGQ1x1NTE2NSBKU09OIFx1NjU4N1x1NEVGNlx1NEVFNVx1OTA3Rlx1NTE0RCBUeXBlU2NyaXB0IFx1NzY4NCBKU09OIFx1NkEyMVx1NTc1N1x1ODlFM1x1Njc5MFx1OTVFRVx1OTg5OFxuY29uc3QgZGVmYXVsdFRlbXBsYXRlID0gcmVxdWlyZSgnLi9kZWZhdWx0Lmpzb24nKTtcbmNvbnN0IG1pbmltYWxUZW1wbGF0ZSA9IHJlcXVpcmUoJy4vbWluaW1hbC5qc29uJyk7XG5jb25zdCBlbGVnYW50VGVtcGxhdGUgPSByZXF1aXJlKCcuL2VsZWdhbnQuanNvbicpO1xuY29uc3QgZGFya1RlbXBsYXRlID0gcmVxdWlyZSgnLi9kYXJrLmpzb24nKTtcbmNvbnN0IGFjYWRlbWljVGVtcGxhdGUgPSByZXF1aXJlKCcuL2FjYWRlbWljLmpzb24nKTtcblxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgICBkZWZhdWx0OiBkZWZhdWx0VGVtcGxhdGUsXG4gICAgbWluaW1hbDogbWluaW1hbFRlbXBsYXRlLFxuICAgIGVsZWdhbnQ6IGVsZWdhbnRUZW1wbGF0ZSxcbiAgICBkYXJrOiBkYXJrVGVtcGxhdGUsXG4gICAgYWNhZGVtaWM6IGFjYWRlbWljVGVtcGxhdGVcbn07IiwgImltcG9ydCB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IHRlbXBsYXRlcyB9IGZyb20gJy4vdGVtcGxhdGVzJztcblxuaW50ZXJmYWNlIFRlbXBsYXRlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdHlsZXM6IHtcbiAgICAgICAgY29udGFpbmVyOiBzdHJpbmc7XG4gICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICBoMTogc3RyaW5nO1xuICAgICAgICAgICAgaDI6IHN0cmluZztcbiAgICAgICAgICAgIGgzOiBzdHJpbmc7XG4gICAgICAgICAgICBiYXNlOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHBhcmFncmFwaDogc3RyaW5nO1xuICAgICAgICBsaXN0OiB7XG4gICAgICAgICAgICBjb250YWluZXI6IHN0cmluZztcbiAgICAgICAgICAgIGl0ZW06IHN0cmluZztcbiAgICAgICAgICAgIHRhc2tMaXN0OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHF1b3RlOiBzdHJpbmc7XG4gICAgICAgIGNvZGU6IHtcbiAgICAgICAgICAgIGJsb2NrOiBzdHJpbmc7XG4gICAgICAgICAgICBpbmxpbmU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2U6IHN0cmluZztcbiAgICAgICAgbGluazogc3RyaW5nO1xuICAgICAgICBlbXBoYXNpczoge1xuICAgICAgICAgICAgc3Ryb25nOiBzdHJpbmc7XG4gICAgICAgICAgICBlbTogc3RyaW5nO1xuICAgICAgICAgICAgZGVsOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHRhYmxlOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IHN0cmluZztcbiAgICAgICAgICAgIGhlYWRlcjogc3RyaW5nO1xuICAgICAgICAgICAgY2VsbDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgICBocjogc3RyaW5nO1xuICAgICAgICBmb290bm90ZToge1xuICAgICAgICAgICAgcmVmOiBzdHJpbmc7XG4gICAgICAgICAgICBiYWNrcmVmOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlTWFuYWdlciB7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZXM6IE1hcDxzdHJpbmcsIFRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGN1cnJlbnRUZW1wbGF0ZTogVGVtcGxhdGU7XG4gICAgcHJpdmF0ZSBjdXJyZW50Rm9udDogc3RyaW5nID0gJy1hcHBsZS1zeXN0ZW0nO1xuICAgIHByaXZhdGUgY3VycmVudEZvbnRTaXplOiBudW1iZXIgPSAxNjtcbiAgICBwcml2YXRlIGFwcDogQXBwO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHApIHtcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgICAgIHRoaXMubG9hZFRlbXBsYXRlcygpOyAvLyBcdTUyQTBcdThGN0RcdTZBMjFcdTY3N0ZcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZFRlbXBsYXRlcygpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFx1NzZGNFx1NjNBNVx1NEVDRVx1NTE4NVx1N0Y2RVx1NkEyMVx1Njc3Rlx1NTJBMFx1OEY3RFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0ZW1wbGF0ZXMpLmZvckVhY2godGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzLnNldCh0ZW1wbGF0ZS5pZCwgdGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5pZCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdcdTUyQTBcdThGN0RcdTZBMjFcdTY3N0ZcdTU5MzFcdThEMjU6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcdTY1RTBcdTZDRDVcdTUyQTBcdThGN0RcdTZBMjFcdTY3N0ZcdTY1ODdcdTRFRjYnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZShpZDogc3RyaW5nKTogVGVtcGxhdGUgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXMuZ2V0KGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudFRlbXBsYXRlKCk6IFRlbXBsYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRlbXBsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDdXJyZW50VGVtcGxhdGUoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVzLmdldChpZCk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWxsVGVtcGxhdGVzKCk6IFRlbXBsYXRlW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnRlbXBsYXRlcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZvbnQoZm9udEZhbWlseTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEZvbnQgPSBmb250RmFtaWx5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGb250U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9udFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseVRlbXBsYXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY3VycmVudFRlbXBsYXRlLnN0eWxlcztcbiAgICAgICAgY29uc3QgdGFibGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGNvbnN0IHRkID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ZCcpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCF0YWJsZSB8fCAhdGQpIHJldHVybjtcblxuICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTVCQjlcdTU2NjhcdTY4MzdcdTVGMEZcdTUyMzBcdTg4NjhcdTY4M0NcbiAgICAgICAgdGFibGUuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlcy5jb250YWluZXIpO1xuICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoJ2NlbGxwYWRkaW5nJywgJzAnKTtcbiAgICAgICAgdGFibGUuc2V0QXR0cmlidXRlKCdjZWxsc3BhY2luZycsICcwJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTU3RkFcdTc4NDBcdTY4MzdcdTVGMEZcdTUyMzBcdTUzNTVcdTUxNDNcdTY4M0NcbiAgICAgICAgdGQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICBsaW5lLWhlaWdodDogMS43O1xuICAgICAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbiAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTtcbiAgICAgICAgYDtcbiAgICAgICAgXG4gICAgICAgIC8vIFx1NUU5NFx1NzUyOFx1NjgwN1x1OTg5OFx1NjgzN1x1NUYwRlxuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdoMScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy50aXRsZS5oMX07IGZvbnQtZmFtaWx5OiAke3RoaXMuY3VycmVudEZvbnR9O2ApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgnaDInKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtzdHlsZXMudGl0bGUuaDJ9OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTtgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ2gzJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYCR7c3R5bGVzLnRpdGxlLmgzfTsgZm9udC1mYW1pbHk6ICR7dGhpcy5jdXJyZW50Rm9udH07YCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdoNCwgaDUsIGg2JykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYCR7c3R5bGVzLnRpdGxlLmJhc2V9OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTtgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1RTk0XHU3NTI4XHU2QkI1XHU4NDNEXHU2ODM3XHU1RjBGXG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ3AnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIC8vIFx1NjhDMFx1NjdFNVx1NjYyRlx1NTQyNlx1NEUzQVx1NjcwMFx1NTkxNlx1NUM0Mlx1NkJCNVx1ODQzRFxuICAgICAgICAgICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCdwJykgJiYgIWVsLnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ2Jsb2NrcXVvdGUnKSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtzdHlsZXMucGFyYWdyYXBofTsgZm9udC1mYW1pbHk6ICR7dGhpcy5jdXJyZW50Rm9udH07IGZvbnQtc2l6ZTogJHt0aGlzLmN1cnJlbnRGb250U2l6ZX1weDtgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1RTk0XHU3NTI4XHU1MjE3XHU4ODY4XHU2ODM3XHU1RjBGXG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ3VsLCBvbCcpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlcy5saXN0LmNvbnRhaW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy5saXN0Lml0ZW19OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTsgZm9udC1zaXplOiAke3RoaXMuY3VycmVudEZvbnRTaXplfXB4O2ApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgnLnRhc2stbGlzdC1pdGVtJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYCR7c3R5bGVzLmxpc3QudGFza0xpc3R9OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTsgZm9udC1zaXplOiAke3RoaXMuY3VycmVudEZvbnRTaXplfXB4O2ApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTVGMTVcdTc1MjhcdTY4MzdcdTVGMEZcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgnYmxvY2txdW90ZScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy5xdW90ZX07IGZvbnQtZmFtaWx5OiAke3RoaXMuY3VycmVudEZvbnR9OyBmb250LXNpemU6ICR7dGhpcy5jdXJyZW50Rm9udFNpemV9cHg7YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NUU5NFx1NzUyOFx1NEVFM1x1NzgwMVx1NjgzN1x1NUYwRlxuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdwcmUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtzdHlsZXMuY29kZS5ibG9ja307IGZvbnQtc2l6ZTogJHt0aGlzLmN1cnJlbnRGb250U2l6ZX1weDtgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvZGU6bm90KHByZSBjb2RlKScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy5jb2RlLmlubGluZX07IGZvbnQtc2l6ZTogJHt0aGlzLmN1cnJlbnRGb250U2l6ZX1weDtgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU1RTk0XHU3NTI4XHU5NEZFXHU2M0E1XHU2ODM3XHU1RjBGXG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMubGluayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NUU5NFx1NzUyOFx1NUYzQVx1OEMwM1x1NjgzN1x1NUYwRlxuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdzdHJvbmcnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMuZW1waGFzaXMuc3Ryb25nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ2VtJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVzLmVtcGhhc2lzLmVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RlbCcpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlcy5lbXBoYXNpcy5kZWwpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTg4NjhcdTY4M0NcdTY4MzdcdTVGMEZcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gdGFibGUpIHJldHVybjsgLy8gXHU4REYzXHU4RkM3XHU1MzA1XHU4OEY5XHU4ODY4XHU2ODNDXG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVzLnRhYmxlLmNvbnRhaW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy50YWJsZS5oZWFkZXJ9OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTsgZm9udC1zaXplOiAke3RoaXMuY3VycmVudEZvbnRTaXplfXB4O2ApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgndGQnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gdGQpIHJldHVybjsgLy8gXHU4REYzXHU4RkM3XHU1MzA1XHU4OEY5XHU1MzU1XHU1MTQzXHU2ODNDXG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYCR7c3R5bGVzLnRhYmxlLmNlbGx9OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTsgZm9udC1zaXplOiAke3RoaXMuY3VycmVudEZvbnRTaXplfXB4O2ApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTUyMDZcdTUyNzJcdTdFQkZcdTY4MzdcdTVGMEZcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgnaHInKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMuaHIpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTgxMUFcdTZDRThcdTY4MzdcdTVGMEZcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgnLmZvb3Rub3RlLXJlZicpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlcy5mb290bm90ZS5yZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgnLmZvb3Rub3RlLWJhY2tyZWYnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMuZm9vdG5vdGUuYmFja3JlZik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFx1NUU5NFx1NzUyOFx1NTZGRVx1NzI0N1x1NjgzN1x1NUYwRlxuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGVsIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyBcdTVFOTRcdTc1MjhcdTU3RkFcdTc4NDBcdTY4MzdcdTVGMEZcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtzdHlsZXMuaW1hZ2V9OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTtgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gXHU1OTgyXHU2NzlDXHU1NkZFXHU3MjQ3XHU2NjJGXHU2QkI1XHU4NDNEXHU0RTJEXHU1NTJGXHU0RTAwXHU3Njg0XHU1MTQzXHU3RDIwXHVGRjBDXHU2MjREXHU4QkJFXHU3RjZFXHU1QzQ1XHU0RTJEXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBpbWcucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5zdHlsZS5tYXJnaW4gPSAnMWVtIDAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU2NkY0XHU2NUIwXHU0RUUzXHU3ODAxXHU1NzU3XHU2ODM3XHU1RjBGXHU1RTk0XHU3NTI4XG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ3ByZScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy5jb2RlLmJsb2NrfTtgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gXHU2NkY0XHU2NUIwXHU1RjE1XHU3NTI4XHU1NzU3XHU2ODM3XHU1RjBGXHU1RTk0XHU3NTI4XG4gICAgICAgIHRkLnF1ZXJ5U2VsZWN0b3JBbGwoJ2Jsb2NrcXVvdGUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtzdHlsZXMucXVvdGV9O2ApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBcdTY2RjRcdTY1QjBcdTUyMTdcdTg4NjhcdTY4MzdcdTVGMEZcdTVFOTRcdTc1MjhcbiAgICAgICAgdGQucXVlcnlTZWxlY3RvckFsbCgndWwsIG9sJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYCR7c3R5bGVzLmxpc3QuY29udGFpbmVyfTsgZm9udC1mYW1pbHk6ICR7dGhpcy5jdXJyZW50Rm9udH07YCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke3N0eWxlcy5saXN0Lml0ZW19OyBmb250LWZhbWlseTogJHt0aGlzLmN1cnJlbnRGb250fTsgZm9udC1zaXplOiAke3RoaXMuY3VycmVudEZvbnRTaXplfXB4O2ApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCB0ZW1wbGF0ZU1hbmFnZXIgPSAoYXBwOiBBcHApID0+IG5ldyBUZW1wbGF0ZU1hbmFnZXIoYXBwKTtcbiIsICJpbnRlcmZhY2UgTVBTZXR0aW5ncyB7XG4gICAgdGVtcGxhdGVJZDogc3RyaW5nO1xuICAgIGZvbnRGYW1pbHk6IHN0cmluZztcbiAgICBmb250U2l6ZTogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNUFNldHRpbmdzID0ge1xuICAgIHRlbXBsYXRlSWQ6ICdkZWZhdWx0JyxcbiAgICBmb250RmFtaWx5OiAnLWFwcGxlLXN5c3RlbScsXG4gICAgZm9udFNpemU6IDE2XG59O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHBsdWdpbjogYW55O1xuICAgIHByaXZhdGUgc2V0dGluZ3M6IE1QU2V0dGluZ3M7XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IGFueSkge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IERFRkFVTFRfU0VUVElOR1M7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBnZXRTZXR0aW5ncygpOiBNUFNldHRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8TVBTZXR0aW5ncz4pIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5zZXR0aW5ncywgLi4uc2V0dGluZ3MgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsd0NBQUFBLFNBQUE7QUFBQSxJQUFBQSxRQUFBO0FBQUEsTUFDSSxJQUFNO0FBQUEsTUFDTixNQUFRO0FBQUEsTUFDUixRQUFVO0FBQUEsUUFDTixXQUFhO0FBQUEsUUFDYixPQUFTO0FBQUEsVUFDTCxJQUFNO0FBQUEsVUFDTixJQUFNO0FBQUEsVUFDTixJQUFNO0FB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Z0JBQU0sS0FBSyxhQUFhO0FBQUEsUUFDNUI7QUFBQSxNQUNKLENBQUM7QUFHRCxXQUFLLElBQUksVUFBVSxjQUFjLE1BQU07QUFDbkMsYUFBSyxhQUFhO0FBQUEsTUFDdEIsQ0FBQztBQUNELGtCQUFZLFdBQVcsS0FBSyxHQUFHO0FBQUEsSUFDbkM7QUFBQTtBQUFBLEVBRU0sV0FBVztBQUFBO0FBRWIsV0FBSyxJQUFJLFVBQVUsbUJBQW1CLFlBQVk7QUFBQSxJQUN0RDtBQUFBO0FBQUEsRUFFTSxlQUFlO0FBQUE7QUFFakIsWUFBTSxTQUFTLEtBQUssSUFBSSxVQUFVLGdCQUFnQixZQUFZO0FBQzlELFVBQUksT0FBTyxTQUFTLEdBQUc7QUFDbkIsYUFBSyxJQUFJLFVBQVUsV0FBVyxPQUFPLENBQUMsQ0FBQztBQUN2QztBQUFBLE1BQ0o7QUFHQSxZQUFNLFlBQVksS0FBSyxJQUFJLFVBQVUsYUFBYSxLQUFLO0FBQ3ZELFVBQUksV0FBVztBQUNYLGNBQU0sVUFBVSxhQUFhO0FBQUEsVUFDekIsTUFBTTtBQUFBLFVBQ04sUUFBUTtBQUFBLFFBQ1osQ0FBQztBQUFBLE1BQ0wsT0FBTztBQUVILFlBQUksd0JBQU8sa0RBQVU7QUFBQSxNQUN6QjtBQUFBLElBQ0o7QUFBQTtBQUNKOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAidGVtcGxhdGVzIl0KfQo=