mirror of
https://github.com/Ellpeck/ObsidianCustomFrames.git
synced 2024-12-22 21:29:23 +01:00
592 lines
68 KiB
Text
592 lines
68 KiB
Text
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
var __export = (target, all) => {
|
|
__markAsModule(target);
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __reExport = (target, module2, desc) => {
|
|
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
for (let key of __getOwnPropNames(module2))
|
|
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
}
|
|
return target;
|
|
};
|
|
var __toModule = (module2) => {
|
|
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
|
};
|
|
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/main.ts
|
|
__export(exports, {
|
|
default: () => CustomFramesPlugin
|
|
});
|
|
var import_obsidian4 = __toModule(require("obsidian"));
|
|
|
|
// src/frame.ts
|
|
var import_obsidian = __toModule(require("obsidian"));
|
|
|
|
// src/settings.ts
|
|
var defaultSettings = {
|
|
frames: [],
|
|
padding: 5
|
|
};
|
|
var presets = {
|
|
"obsidian": {
|
|
url: "https://forum.obsidian.md/",
|
|
displayName: "Obsidian Forum",
|
|
icon: "edit",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: true,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: ""
|
|
},
|
|
"detexify": {
|
|
url: "https://detexify.kirelabs.org/classify.html",
|
|
displayName: "Detexify",
|
|
icon: "type",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: false,
|
|
zoomLevel: 0.95,
|
|
forceIframe: false,
|
|
customCss: `/* hide info clutter and ad banner */
|
|
#classify--info-area,
|
|
.adsbygoogle {
|
|
display: none !important
|
|
}`
|
|
},
|
|
"calendar": {
|
|
url: "https://calendar.google.com/calendar",
|
|
displayName: "Google Calendar",
|
|
icon: "calendar",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: true,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: `/* hide the menu bar, "Keep" text, and logo */
|
|
html > body > div:nth-child(2) > div:nth-child(2) > div:first-child[class*=" "],
|
|
html > body > div:first-child > header:first-child > div > div:first-child > div > div:first-child,
|
|
html > body > div:nth-child(2) > div:nth-child(2) > div:first-child > div:first-child {
|
|
display: none !important;
|
|
}`
|
|
},
|
|
"keep": {
|
|
url: "https://keep.google.com",
|
|
displayName: "Google Keep",
|
|
icon: "files",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: `/* hide the menu bar and the "Keep" text */
|
|
html > body > div:nth-child(2) > div:nth-child(2) > div:first-child,
|
|
html > body > div:first-child > header:first-child > div > div:first-child > div > div:first-child > a:first-child > span {
|
|
display: none !important;
|
|
}`
|
|
},
|
|
"todoist": {
|
|
url: "https://todoist.com",
|
|
displayName: "Todoist",
|
|
icon: "list-checks",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: `/* hide the help, home, search, and productivity overview buttons, create extra space, and prevent toast pop-up from acting weird */
|
|
[aria-label="Go to Home view"], #quick_find, [aria-label="Productivity"], [aria-label="Help & Feedback"] {
|
|
display: none !important;
|
|
}
|
|
|
|
.view_content {
|
|
padding-left: 15px;
|
|
}
|
|
|
|
.view_header {
|
|
padding-left: 15px;
|
|
padding-top: 10px;
|
|
}
|
|
|
|
.undo_toast {
|
|
width: 95%;
|
|
}`
|
|
},
|
|
"notion": {
|
|
url: "https://www.notion.so/",
|
|
displayName: "Notion",
|
|
icon: "box",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: true,
|
|
openInCenter: true,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: ""
|
|
},
|
|
"twitter": {
|
|
url: "https://twitter.com",
|
|
displayName: "Twitter",
|
|
icon: "twitter",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: ""
|
|
},
|
|
"tasks": {
|
|
url: "https://tasks.google.com/embed/?origin=https://calendar.google.com&fullWidth=1",
|
|
displayName: "Google Tasks",
|
|
icon: "list-checks",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: ""
|
|
}
|
|
};
|
|
function getIcon(settings) {
|
|
return settings.icon ? `lucide-${settings.icon}` : "documents";
|
|
}
|
|
function getId(settings) {
|
|
return settings.displayName.toLowerCase().replace(/\s/g, "-");
|
|
}
|
|
|
|
// src/frame.ts
|
|
var CustomFrame = class {
|
|
constructor(settings, data) {
|
|
this.settings = settings;
|
|
this.data = data;
|
|
}
|
|
create(parent, additionalStyle = void 0, urlSuffix = void 0) {
|
|
let style = `padding: ${this.settings.padding}px;`;
|
|
if (additionalStyle)
|
|
style += additionalStyle;
|
|
if (import_obsidian.Platform.isDesktopApp && !this.data.forceIframe) {
|
|
let frameDoc = parent.doc;
|
|
this.frame = frameDoc.createElement("webview");
|
|
parent.appendChild(this.frame);
|
|
this.frame.setAttribute("allowpopups", "");
|
|
this.frame.addEventListener("dom-ready", () => {
|
|
this.frame.setZoomFactor(this.data.zoomLevel);
|
|
this.frame.insertCSS(this.data.customCss);
|
|
});
|
|
this.frame.addEventListener("destroyed", () => {
|
|
if (frameDoc != parent.doc) {
|
|
this.frame.detach();
|
|
this.create(parent, additionalStyle, urlSuffix);
|
|
}
|
|
});
|
|
} else {
|
|
this.frame = parent.doc.createElement("iframe");
|
|
parent.appendChild(this.frame);
|
|
this.frame.setAttribute("sandbox", "allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation");
|
|
this.frame.setAttribute("allow", "encrypted-media; fullscreen; oversized-images; picture-in-picture; sync-xhr; geolocation;");
|
|
style += `transform: scale(${this.data.zoomLevel}); transform-origin: 0 0;`;
|
|
}
|
|
this.frame.addClass("custom-frames-frame");
|
|
this.frame.addClass(`custom-frames-${getId(this.data)}`);
|
|
this.frame.setAttribute("style", style);
|
|
let src = this.data.url;
|
|
if (urlSuffix) {
|
|
if (!urlSuffix.startsWith("/"))
|
|
src += "/";
|
|
src += urlSuffix;
|
|
}
|
|
this.frame.setAttribute("src", src);
|
|
}
|
|
refresh() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.location.reload();
|
|
} else {
|
|
this.frame.reload();
|
|
}
|
|
}
|
|
return() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.open(this.data.url);
|
|
} else {
|
|
this.frame.loadURL(this.data.url);
|
|
}
|
|
}
|
|
goBack() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.history.back();
|
|
} else {
|
|
this.frame.goBack();
|
|
}
|
|
}
|
|
goForward() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.history.forward();
|
|
} else {
|
|
this.frame.goForward();
|
|
}
|
|
}
|
|
toggleDevTools() {
|
|
if (!(this.frame instanceof HTMLIFrameElement)) {
|
|
if (!this.frame.isDevToolsOpened()) {
|
|
this.frame.openDevTools();
|
|
} else {
|
|
this.frame.closeDevTools();
|
|
}
|
|
}
|
|
}
|
|
getCurrentUrl() {
|
|
return this.frame instanceof HTMLIFrameElement ? this.frame.contentWindow.location.href : this.frame.getURL();
|
|
}
|
|
focus() {
|
|
if (this.frame instanceof HTMLIFrameElement) {
|
|
this.frame.contentWindow.focus();
|
|
} else {
|
|
this.frame.focus();
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/settings-tab.ts
|
|
var import_obsidian2 = __toModule(require("obsidian"));
|
|
var CustomFramesSettingTab = class extends import_obsidian2.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
this.containerEl.empty();
|
|
this.containerEl.createEl("h2", { text: "Custom Frames Settings" });
|
|
this.containerEl.createEl("p", { text: "Please note that Obsidian has to be restarted or reloaded for most of these settings to take effect.", cls: "mod-warning" });
|
|
new import_obsidian2.Setting(this.containerEl).setName("Frame Padding").setDesc("The padding that should be left around the inside of custom frame panes, in pixels.").addText((t) => {
|
|
t.inputEl.type = "number";
|
|
t.setValue(String(this.plugin.settings.padding));
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
this.plugin.settings.padding = v.length ? Number(v) : defaultSettings.padding;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
for (let frame of this.plugin.settings.frames) {
|
|
let heading = this.containerEl.createEl("h3", { text: frame.displayName || "Unnamed Frame" });
|
|
let toggle = new import_obsidian2.ButtonComponent(this.containerEl).setButtonText("Show Settings").setClass("custom-frames-show").onClick(() => __async(this, null, function* () {
|
|
content.hidden = !content.hidden;
|
|
toggle.setButtonText(content.hidden ? "Show Settings" : "Hide Settings");
|
|
}));
|
|
let content = this.containerEl.createDiv();
|
|
content.hidden = true;
|
|
new import_obsidian2.Setting(content).setName("Display Name").setDesc("The display name that this frame should have.").addText((t) => {
|
|
t.setValue(frame.displayName);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.displayName = v;
|
|
heading.setText(frame.displayName || "Unnamed Frame");
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Icon").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "The icon that this frame's pane should have. The names of any " });
|
|
f.createEl("a", { text: "Lucide icons", href: "https://lucide.dev/" });
|
|
f.createSpan({ text: " can be used." });
|
|
})).addText((t) => {
|
|
t.setValue(frame.icon);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.icon = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("URL").setDesc("The URL that should be opened in this frame.").addText((t) => {
|
|
t.setValue(frame.url);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.url = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Disable on Mobile").setDesc("Custom Frames is a lot more restricted on mobile devices and doesn't allow for the same types of content to be displayed. If a frame doesn't work as expected on mobile, it can be disabled.").addToggle((t) => {
|
|
t.setValue(frame.hideOnMobile);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.hideOnMobile = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Add Ribbon Icon").setDesc("Whether a button to open this frame should be added to the ribbon.").addToggle((t) => {
|
|
t.setValue(frame.addRibbonIcon);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.addRibbonIcon = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Open in Center").setDesc("Whether this frame should be opened in the unpinned center editor rather than one of the panes on the side. This is useful for sites that don't work well in a narrow view, or sites that don't require a note to be open when viewed.").addToggle((t) => {
|
|
t.setValue(frame.openInCenter);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.openInCenter = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Force iframe").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "Whether this frame should use iframes on desktop as opposed to Electron webviews." });
|
|
f.createEl("br");
|
|
f.createEl("em", { text: "Only enable this setting if the frame is causing issues or frequent crashes. This setting causes all Desktop-only settings to be ignored." });
|
|
})).addToggle((t) => {
|
|
t.setValue(frame.forceIframe);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.forceIframe = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Page Zoom").setDesc("The zoom that this frame's page should be displayed with, as a percentage.").addText((t) => {
|
|
t.inputEl.type = "number";
|
|
t.setValue(String(frame.zoomLevel * 100));
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.zoomLevel = v.length ? Number(v) / 100 : 1;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.Setting(content).setName("Additional CSS").setDesc(createFragment((f) => {
|
|
f.createSpan({ text: "A snippet of additional CSS that should be applied to this frame." });
|
|
f.createEl("br");
|
|
f.createEl("em", { text: "Note that this is only applied on Desktop." });
|
|
})).addTextArea((t) => {
|
|
t.inputEl.rows = 5;
|
|
t.inputEl.cols = 50;
|
|
t.setValue(frame.customCss);
|
|
t.onChange((v) => __async(this, null, function* () {
|
|
frame.customCss = v;
|
|
yield this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
new import_obsidian2.ButtonComponent(content).setButtonText("Remove Frame").onClick(() => __async(this, null, function* () {
|
|
this.plugin.settings.frames.remove(frame);
|
|
yield this.plugin.saveSettings();
|
|
this.display();
|
|
}));
|
|
}
|
|
this.containerEl.createEl("hr");
|
|
this.containerEl.createEl("p", { text: `Create a new frame, either from a preset shipped with the plugin, or a custom one that you can edit yourself. Each frame's pane can be opened using the "Custom Frames: Open" command.` });
|
|
let addDiv = this.containerEl.createDiv();
|
|
let dropdown = new import_obsidian2.DropdownComponent(addDiv);
|
|
dropdown.addOption("new", "Custom");
|
|
for (let key of Object.keys(presets))
|
|
dropdown.addOption(key, presets[key].displayName);
|
|
new import_obsidian2.ButtonComponent(addDiv).setButtonText("Add Frame").setClass("custom-frames-add").onClick(() => __async(this, null, function* () {
|
|
let option = dropdown.getValue();
|
|
if (option == "new") {
|
|
this.plugin.settings.frames.push({
|
|
url: "",
|
|
displayName: "New Frame",
|
|
icon: "",
|
|
hideOnMobile: true,
|
|
addRibbonIcon: false,
|
|
openInCenter: false,
|
|
zoomLevel: 1,
|
|
forceIframe: false,
|
|
customCss: ""
|
|
});
|
|
} else {
|
|
this.plugin.settings.frames.push(presets[option]);
|
|
}
|
|
yield this.plugin.saveSettings();
|
|
this.display();
|
|
}));
|
|
var disclaimer = this.containerEl.createEl("p", { cls: "mod-warning" });
|
|
disclaimer.createSpan({ text: "Please be advised that, when adding a site as a custom frame, you potentially expose personal information you enter to other plugins you have installed. For more information, see " });
|
|
disclaimer.createEl("a", { text: "this discussion", href: "https://github.com/Ellpeck/ObsidianCustomFrames/issues/54#issuecomment-1210879685", cls: "mod-warning" });
|
|
disclaimer.createSpan({ text: "." });
|
|
this.containerEl.createEl("hr");
|
|
this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" });
|
|
this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", { attr: { src: "https://ellpeck.de/res/generalsupport.png" }, cls: "custom-frames-support" });
|
|
}
|
|
};
|
|
|
|
// src/view.ts
|
|
var import_obsidian3 = __toModule(require("obsidian"));
|
|
var _CustomFrameView = class extends import_obsidian3.ItemView {
|
|
constructor(leaf, settings, data, name) {
|
|
super(leaf);
|
|
this.data = data;
|
|
this.name = name;
|
|
this.frame = new CustomFrame(settings, data);
|
|
for (let action of _CustomFrameView.actions)
|
|
this.addAction(action.icon, action.name, () => action.action(this));
|
|
}
|
|
onload() {
|
|
this.contentEl.empty();
|
|
this.contentEl.addClass("custom-frames-view");
|
|
this.frame.create(this.contentEl);
|
|
}
|
|
onPaneMenu(menu, source) {
|
|
super.onPaneMenu(menu, source);
|
|
for (let action of _CustomFrameView.actions) {
|
|
menu.addItem((i) => {
|
|
i.setTitle(action.name);
|
|
i.setIcon(action.icon);
|
|
i.onClick(() => action.action(this));
|
|
});
|
|
}
|
|
}
|
|
getViewType() {
|
|
return this.name;
|
|
}
|
|
getDisplayText() {
|
|
return this.data.displayName;
|
|
}
|
|
getIcon() {
|
|
return getIcon(this.data);
|
|
}
|
|
focus() {
|
|
this.frame.focus();
|
|
}
|
|
};
|
|
var CustomFrameView = _CustomFrameView;
|
|
CustomFrameView.actions = [
|
|
{
|
|
name: "Return to original page",
|
|
icon: "home",
|
|
action: (v) => v.frame.return()
|
|
},
|
|
{
|
|
name: "Open dev tools",
|
|
icon: "binary",
|
|
action: (v) => v.frame.toggleDevTools()
|
|
},
|
|
{
|
|
name: "Copy link",
|
|
icon: "link",
|
|
action: (v) => navigator.clipboard.writeText(v.frame.getCurrentUrl())
|
|
},
|
|
{
|
|
name: "Open in browser",
|
|
icon: "globe",
|
|
action: (v) => open(v.frame.getCurrentUrl())
|
|
},
|
|
{
|
|
name: "Refresh",
|
|
icon: "refresh-cw",
|
|
action: (v) => v.frame.refresh()
|
|
},
|
|
{
|
|
name: "Go back",
|
|
icon: "arrow-left",
|
|
action: (v) => v.frame.goBack()
|
|
},
|
|
{
|
|
name: "Go forward",
|
|
icon: "arrow-right",
|
|
action: (v) => v.frame.goForward()
|
|
}
|
|
];
|
|
|
|
// src/main.ts
|
|
var CustomFramesPlugin = class extends import_obsidian4.Plugin {
|
|
onload() {
|
|
return __async(this, null, function* () {
|
|
yield this.loadSettings();
|
|
for (let frame of this.settings.frames) {
|
|
if (!frame.url || !frame.displayName)
|
|
continue;
|
|
let name = `custom-frames-${getId(frame)}`;
|
|
if (import_obsidian4.Platform.isMobileApp && frame.hideOnMobile) {
|
|
console.log(`Skipping frame ${name} which is hidden on mobile`);
|
|
continue;
|
|
}
|
|
try {
|
|
console.log(`Registering frame ${name} for URL ${frame.url}`);
|
|
this.registerView(name, (l) => new CustomFrameView(l, this.settings, frame, name));
|
|
this.addCommand({
|
|
id: `open-${name}`,
|
|
name: `Open ${frame.displayName}`,
|
|
callback: () => this.openLeaf(name, frame.openInCenter, false)
|
|
});
|
|
if (frame.addRibbonIcon)
|
|
this.addRibbonIcon(getIcon(frame), `Open ${frame.displayName}`, (e) => this.openLeaf(name, frame.openInCenter, import_obsidian4.Platform.isMacOS ? e.metaKey : e.ctrlKey));
|
|
} catch (e) {
|
|
console.error(`Couldn't register frame ${name}, is there already one with the same name?`);
|
|
}
|
|
}
|
|
this.addSettingTab(new CustomFramesSettingTab(this.app, this));
|
|
this.registerMarkdownCodeBlockProcessor("custom-frames", (s, e) => {
|
|
e.empty();
|
|
e.addClass("custom-frames-view-file");
|
|
let frameMatch = /frame:([^\n]+)/gi.exec(s);
|
|
let frameName = frameMatch && frameMatch[1].trim();
|
|
if (!frameName) {
|
|
e.createSpan({ text: "Couldn't parse frame name" });
|
|
return;
|
|
}
|
|
let data = this.settings.frames.find((f) => f.displayName == frameName);
|
|
if (!data) {
|
|
e.createSpan({ text: `Couldn't find a frame with name ${frameName}` });
|
|
return;
|
|
}
|
|
if (import_obsidian4.Platform.isMobileApp && data.hideOnMobile) {
|
|
e.createSpan({ text: `${frameName} is hidden on mobile` });
|
|
return;
|
|
}
|
|
let styleMatch = /style:([^\n]+)/gi.exec(s);
|
|
let style = styleMatch && styleMatch[1].trim();
|
|
style || (style = "height: 600px;");
|
|
let urlSuffixMatch = /urlsuffix:([^\n]+)/gi.exec(s);
|
|
let urlSuffix = urlSuffixMatch && urlSuffixMatch[1].trim();
|
|
urlSuffix || (urlSuffix = "");
|
|
let frame = new CustomFrame(this.settings, data);
|
|
frame.create(e, style, urlSuffix);
|
|
});
|
|
});
|
|
}
|
|
loadSettings() {
|
|
return __async(this, null, function* () {
|
|
this.settings = Object.assign({}, defaultSettings, yield this.loadData());
|
|
});
|
|
}
|
|
saveSettings() {
|
|
return __async(this, null, function* () {
|
|
yield this.saveData(this.settings);
|
|
});
|
|
}
|
|
openLeaf(name, center, split) {
|
|
return __async(this, null, function* () {
|
|
let leaf;
|
|
if (center) {
|
|
leaf = this.app.workspace.getLeaf(split);
|
|
yield leaf.setViewState({ type: name, active: true });
|
|
} else {
|
|
if (!this.app.workspace.getLeavesOfType(name).length)
|
|
yield this.app.workspace.getRightLeaf(false).setViewState({ type: name, active: true });
|
|
leaf = this.app.workspace.getLeavesOfType(name)[0];
|
|
this.app.workspace.revealLeaf(leaf);
|
|
}
|
|
if (leaf.view instanceof CustomFrameView)
|
|
leaf.view.focus();
|
|
});
|
|
}
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL2ZyYW1lLnRzIiwgInNyYy9zZXR0aW5ncy50cyIsICJzcmMvc2V0dGluZ3MtdGFiLnRzIiwgInNyYy92aWV3LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4sIFBsYXRmb3JtLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEN1c3RvbUZyYW1lIH0gZnJvbSBcIi4vZnJhbWVcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRnJhbWVzU2V0dGluZ3MsIGRlZmF1bHRTZXR0aW5ncywgZ2V0SWNvbiwgZ2V0SWQgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21GcmFtZXNTZXR0aW5nVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IEN1c3RvbUZyYW1lVmlldyB9IGZyb20gXCIuL3ZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbUZyYW1lc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblxyXG5cdHNldHRpbmdzOiBDdXN0b21GcmFtZXNTZXR0aW5ncztcclxuXHJcblx0YXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHRmb3IgKGxldCBmcmFtZSBvZiB0aGlzLnNldHRpbmdzLmZyYW1lcykge1xyXG5cdFx0XHRpZiAoIWZyYW1lLnVybCB8fCAhZnJhbWUuZGlzcGxheU5hbWUpXHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdGxldCBuYW1lID0gYGN1c3RvbS1mcmFtZXMtJHtnZXRJZChmcmFtZSl9YDtcclxuXHRcdFx0aWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwICYmIGZyYW1lLmhpZGVPbk1vYmlsZSkge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGBTa2lwcGluZyBmcmFtZSAke25hbWV9IHdoaWNoIGlzIGhpZGRlbiBvbiBtb2JpbGVgKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGBSZWdpc3RlcmluZyBmcmFtZSAke25hbWV9IGZvciBVUkwgJHtmcmFtZS51cmx9YCk7XHJcblxyXG5cdFx0XHRcdHRoaXMucmVnaXN0ZXJWaWV3KG5hbWUsIGwgPT4gbmV3IEN1c3RvbUZyYW1lVmlldyhsLCB0aGlzLnNldHRpbmdzLCBmcmFtZSwgbmFtZSkpO1xyXG5cdFx0XHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdFx0XHRpZDogYG9wZW4tJHtuYW1lfWAsXHJcblx0XHRcdFx0XHRuYW1lOiBgT3BlbiAke2ZyYW1lLmRpc3BsYXlOYW1lfWAsXHJcblx0XHRcdFx0XHRjYWxsYmFjazogKCkgPT4gdGhpcy5vcGVuTGVhZihuYW1lLCBmcmFtZS5vcGVuSW5DZW50ZXIsIGZhbHNlKSxcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKGZyYW1lLmFkZFJpYmJvbkljb24pXHJcblx0XHRcdFx0XHR0aGlzLmFkZFJpYmJvbkljb24oZ2V0SWNvbihmcmFtZSksIGBPcGVuICR7ZnJhbWUuZGlzcGxheU5hbWV9YCxcclxuXHRcdFx0XHRcdFx0ZSA9PiB0aGlzLm9wZW5MZWFmKG5hbWUsIGZyYW1lLm9wZW5JbkNlbnRlciwgUGxhdGZvcm0uaXNNYWNPUyA/IGUubWV0YUtleSA6IGUuY3RybEtleSkpO1xyXG5cdFx0XHR9IGNhdGNoIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBDb3VsZG4ndCByZWdpc3RlciBmcmFtZSAke25hbWV9LCBpcyB0aGVyZSBhbHJlYWR5IG9uZSB3aXRoIHRoZSBzYW1lIG5hbWU/YCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEN1c3RvbUZyYW1lc1NldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoXCJjdXN0b20tZnJhbWVzXCIsIChzLCBlKSA9PiB7XHJcblx0XHRcdGUuZW1wdHkoKTtcclxuXHRcdFx0ZS5hZGRDbGFzcyhcImN1c3RvbS1mcmFtZXMtdmlldy1maWxlXCIpO1xyXG5cclxuXHRcdFx0bGV0IGZyYW1lTWF0Y2ggPSAvZnJhbWU6KFteXFxuXSspL2dpLmV4ZWMocyk7XHJcblx0XHRcdGxldCBmcmFtZU5hbWUgPSBmcmFtZU1hdGNoICYmIGZyYW1lTWF0Y2hbMV0udHJpbSgpO1xyXG5cdFx0XHRpZiAoIWZyYW1lTmFtZSkge1xyXG5cdFx0XHRcdGUuY3JlYXRlU3Bhbih7IHRleHQ6IFwiQ291bGRuJ3QgcGFyc2UgZnJhbWUgbmFtZVwiIH0pO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgZGF0YSA9IHRoaXMuc2V0dGluZ3MuZnJhbWVzLmZpbmQoZiA9PiBmLmRpc3BsYXlOYW1lID09IGZyYW1lTmFtZSk7XHJcblx0XHRcdGlmICghZGF0YSkge1xyXG5cdFx0XHRcdGUuY3JlYXRlU3Bhbih7IHRleHQ6IGBDb3VsZG4ndCBmaW5kIGEgZnJhbWUgd2l0aCBuYW1lICR7ZnJhbWVOYW1lfWAgfSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChQbGF0Zm9ybS5pc01vYmlsZUFwcCAmJiBkYXRhLmhpZGVPbk1vYmlsZSkge1xyXG5cdFx0XHRcdGUuY3JlYXRlU3Bhbih7IHRleHQ6IGAke2ZyYW1lTmFtZX0gaXMgaGlkZGVuIG9uIG1vYmlsZWAgfSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgc3R5bGVNYXRjaCA9IC9zdHlsZTooW15cXG5dKykvZ2kuZXhlYyhzKTtcclxuXHRcdFx0bGV0IHN0eWxlID0gc3R5bGVNYXRjaCAmJiBzdHlsZU1hdGNoWzFdLnRyaW0oKTtcclxuXHRcdFx0c3R5bGUgfHw9IFwiaGVpZ2h0OiA2MDBweDtcIjtcclxuXHJcblx0XHRcdGxldCB1cmxTdWZmaXhNYXRjaCA9IC91cmxzdWZmaXg6KFteXFxuXSspL2dpLmV4ZWMocyk7XHJcblx0XHRcdGxldCB1cmxTdWZmaXggPSB1cmxTdWZmaXhNYXRjaCAmJiB1cmxTdWZmaXhNYXRjaFsxXS50cmltKCk7XHJcblx0XHRcdHVybFN1ZmZpeCB8fD0gXCJcIjtcclxuXHJcblx0XHRcdGxldCBmcmFtZSA9IG5ldyBDdXN0b21GcmFtZSh0aGlzLnNldHRpbmdzLCBkYXRhKTtcclxuXHRcdFx0ZnJhbWUuY3JlYXRlKGUsIHN0eWxlLCB1cmxTdWZmaXgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgb3BlbkxlYWYobmFtZTogc3RyaW5nLCBjZW50ZXI6IGJvb2xlYW4sIHNwbGl0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRsZXQgbGVhZjogV29ya3NwYWNlTGVhZjtcclxuXHRcdGlmIChjZW50ZXIpIHtcclxuXHRcdFx0bGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKHNwbGl0KTtcclxuXHRcdFx0YXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoeyB0eXBlOiBuYW1lLCBhY3RpdmU6IHRydWUgfSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoIXRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUobmFtZSkubGVuZ3RoKVxyXG5cdFx0XHRcdGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRSaWdodExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHR5cGU6IG5hbWUsIGFjdGl2ZTogdHJ1ZSB9KTtcclxuXHRcdFx0bGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUobmFtZSlbMF07XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5yZXZlYWxMZWFmKGxlYWYpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIEN1c3RvbUZyYW1lVmlldylcclxuXHRcdFx0bGVhZi52aWV3LmZvY3VzKCk7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBDdXN0b21GcmFtZVNldHRpbmdzLCBDdXN0b21GcmFtZXNTZXR0aW5ncywgZ2V0SWQgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEN1c3RvbUZyYW1lIHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzOiBDdXN0b21GcmFtZXNTZXR0aW5ncztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogQ3VzdG9tRnJhbWVTZXR0aW5ncztcclxuICAgIHByaXZhdGUgZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBDdXN0b21GcmFtZXNTZXR0aW5ncywgZGF0YTogQ3VzdG9tRnJhbWVTZXR0aW5ncykge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZShwYXJlbnQ6IEhUTUxFbGVtZW50LCBhZGRpdGlvbmFsU3R5bGU6IHN0cmluZyA9IHVuZGVmaW5lZCwgdXJsU3VmZml4OiBzdHJpbmcgPSB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgc3R5bGUgPSBgcGFkZGluZzogJHt0aGlzLnNldHRpbmdzLnBhZGRpbmd9cHg7YDtcclxuICAgICAgICBpZiAoYWRkaXRpb25hbFN0eWxlKVxyXG4gICAgICAgICAgICBzdHlsZSArPSBhZGRpdGlvbmFsU3R5bGU7XHJcbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzRGVza3RvcEFwcCAmJiAhdGhpcy5kYXRhLmZvcmNlSWZyYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBmcmFtZURvYyA9IHBhcmVudC5kb2M7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZURvYy5jcmVhdGVFbGVtZW50KFwid2Vidmlld1wiKTtcclxuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLnNldEF0dHJpYnV0ZShcImFsbG93cG9wdXBzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoXCJkb20tcmVhZHlcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5zZXRab29tRmFjdG9yKHRoaXMuZGF0YS56b29tTGV2ZWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5pbnNlcnRDU1ModGhpcy5kYXRhLmN1c3RvbUNzcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoXCJkZXN0cm95ZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGhlIHdlYnZpZXcgaWYgaXQgd2FzIG1vdmVkIHRvIGEgbmV3IHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lRG9jICE9IHBhcmVudC5kb2MpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHBhcmVudCwgYWRkaXRpb25hbFN0eWxlLCB1cmxTdWZmaXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lID0gcGFyZW50LmRvYy5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuc2V0QXR0cmlidXRlKFwic2FuZGJveFwiLCBcImFsbG93LWZvcm1zIGFsbG93LW1vZGFscyBhbGxvdy1wb3B1cHMgYWxsb3ctcHJlc2VudGF0aW9uIGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMgYWxsb3ctdG9wLW5hdmlnYXRpb24tYnktdXNlci1hY3RpdmF0aW9uXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLnNldEF0dHJpYnV0ZShcImFsbG93XCIsIFwiZW5jcnlwdGVkLW1lZGlhOyBmdWxsc2NyZWVuOyBvdmVyc2l6ZWQtaW1hZ2VzOyBwaWN0dXJlLWluLXBpY3R1cmU7IHN5bmMteGhyOyBnZW9sb2NhdGlvbjtcIik7XHJcbiAgICAgICAgICAgIHN0eWxlICs9IGB0cmFuc2Zvcm06IHNjYWxlKCR7dGhpcy5kYXRhLnpvb21MZXZlbH0pOyB0cmFuc2Zvcm0tb3JpZ2luOiAwIDA7YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcmFtZS5hZGRDbGFzcyhcImN1c3RvbS1mcmFtZXMtZnJhbWVcIik7XHJcbiAgICAgICAgdGhpcy5mcmFtZS5hZGRDbGFzcyhgY3VzdG9tLWZyYW1lcy0ke2dldElkKHRoaXMuZGF0YSl9YCk7XHJcbiAgICAgICAgdGhpcy5mcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBzdHlsZSk7XHJcblxyXG4gICAgICAgIGxldCBzcmMgPSB0aGlzLmRhdGEudXJsO1xyXG4gICAgICAgIGlmICh1cmxTdWZmaXgpIHtcclxuICAgICAgICAgICAgaWYgKCF1cmxTdWZmaXguc3RhcnRzV2l0aChcIi9cIikpXHJcbiAgICAgICAgICAgICAgICBzcmMgKz0gXCIvXCI7XHJcbiAgICAgICAgICAgIHNyYyArPSB1cmxTdWZmaXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHNyYyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5mcmFtZSBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLnJlbG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cub3Blbih0aGlzLmRhdGEudXJsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmxvYWRVUkwodGhpcy5kYXRhLnVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdvQmFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5mcmFtZSBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuY29udGVudFdpbmRvdy5oaXN0b3J5LmJhY2soKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmdvQmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnb0ZvcndhcmQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5mb3J3YXJkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5nb0ZvcndhcmQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlRGV2VG9vbHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCEodGhpcy5mcmFtZSBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZnJhbWUuaXNEZXZUb29sc09wZW5lZCgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lLm9wZW5EZXZUb29scygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5jbG9zZURldlRvb2xzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZyYW1lIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQgPyB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA6IHRoaXMuZnJhbWUuZ2V0VVJMKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cuZm9jdXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZGVmYXVsdFNldHRpbmdzOiBDdXN0b21GcmFtZXNTZXR0aW5ncyA9IHtcclxuICAgIGZyYW1lczogW10sXHJcbiAgICBwYWRkaW5nOiA1XHJcbn07XHJcbmV4cG9ydCBjb25zdCBwcmVzZXRzOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21GcmFtZVNldHRpbmdzPiA9IHtcclxuICAgIFwib2JzaWRpYW5cIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL1wiLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIk9ic2lkaWFuIEZvcnVtXCIsXHJcbiAgICAgICAgaWNvbjogXCJlZGl0XCIsXHJcbiAgICAgICAgaGlkZU9uTW9iaWxlOiB0cnVlLFxyXG4gICAgICAgIGFkZFJpYmJvbkljb246IHRydWUsXHJcbiAgICAgICAgb3BlbkluQ2VudGVyOiB0cnVlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBcIlwiXHJcbiAgICB9LFxyXG4gICAgXCJkZXRleGlmeVwiOiB7XHJcbiAgICAgICAgdXJsOiBcImh0dHBzOi8vZGV0ZXhpZnkua2lyZWxhYnMub3JnL2NsYXNzaWZ5Lmh0bWxcIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJEZXRleGlmeVwiLFxyXG4gICAgICAgIGljb246IFwidHlwZVwiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiB0cnVlLFxyXG4gICAgICAgIG9wZW5JbkNlbnRlcjogZmFsc2UsXHJcbiAgICAgICAgem9vbUxldmVsOiAuOTUsXHJcbiAgICAgICAgZm9yY2VJZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgIGN1c3RvbUNzczogYC8qIGhpZGUgaW5mbyBjbHV0dGVyIGFuZCBhZCBiYW5uZXIgKi9cclxuI2NsYXNzaWZ5LS1pbmZvLWFyZWEsXHJcbi5hZHNieWdvb2dsZSB7XHJcblx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50XHJcbn1gXHJcbiAgICB9LFxyXG4gICAgXCJjYWxlbmRhclwiOiB7XHJcbiAgICAgICAgdXJsOiBcImh0dHBzOi8vY2FsZW5kYXIuZ29vZ2xlLmNvbS9jYWxlbmRhclwiLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIkdvb2dsZSBDYWxlbmRhclwiLFxyXG4gICAgICAgIGljb246IFwiY2FsZW5kYXJcIixcclxuICAgICAgICBoaWRlT25Nb2JpbGU6IHRydWUsXHJcbiAgICAgICAgYWRkUmliYm9uSWNvbjogdHJ1ZSxcclxuICAgICAgICBvcGVuSW5DZW50ZXI6IHRydWUsXHJcbiAgICAgICAgem9vbUxldmVsOiAxLFxyXG4gICAgICAgIGZvcmNlSWZyYW1lOiBmYWxzZSxcclxuICAgICAgICBjdXN0b21Dc3M6IGAvKiBoaWRlIHRoZSBtZW51IGJhciwgXCJLZWVwXCIgdGV4dCwgYW5kIGxvZ28gKi9cclxuaHRtbCA+IGJvZHkgPiBkaXY6bnRoLWNoaWxkKDIpID4gZGl2Om50aC1jaGlsZCgyKSA+IGRpdjpmaXJzdC1jaGlsZFtjbGFzcyo9XCIgXCJdLFxyXG5odG1sID4gYm9keSA+IGRpdjpmaXJzdC1jaGlsZCA+IGhlYWRlcjpmaXJzdC1jaGlsZCA+IGRpdiA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdiA+IGRpdjpmaXJzdC1jaGlsZCxcclxuaHRtbCA+IGJvZHkgPiBkaXY6bnRoLWNoaWxkKDIpID4gZGl2Om50aC1jaGlsZCgyKSA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCB7XHJcbmRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxufWBcclxuICAgIH0sXHJcbiAgICBcImtlZXBcIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2tlZXAuZ29vZ2xlLmNvbVwiLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIkdvb2dsZSBLZWVwXCIsXHJcbiAgICAgICAgaWNvbjogXCJmaWxlc1wiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiBmYWxzZSxcclxuICAgICAgICBvcGVuSW5DZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBgLyogaGlkZSB0aGUgbWVudSBiYXIgYW5kIHRoZSBcIktlZXBcIiB0ZXh0ICovXHJcbmh0bWwgPiBib2R5ID4gZGl2Om50aC1jaGlsZCgyKSA+IGRpdjpudGgtY2hpbGQoMikgPiBkaXY6Zmlyc3QtY2hpbGQsXHJcbmh0bWwgPiBib2R5ID4gZGl2OmZpcnN0LWNoaWxkID4gaGVhZGVyOmZpcnN0LWNoaWxkID4gZGl2ID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2ID4gZGl2OmZpcnN0LWNoaWxkID4gYTpmaXJzdC1jaGlsZCA+IHNwYW4ge1xyXG5cdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxufWBcclxuICAgIH0sXHJcbiAgICBcInRvZG9pc3RcIjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL3RvZG9pc3QuY29tXCIsXHJcbiAgICAgICAgZGlzcGxheU5hbWU6IFwiVG9kb2lzdFwiLFxyXG4gICAgICAgIGljb246IFwibGlzdC1jaGVja3NcIixcclxuICAgICAgICBoaWRlT25Nb2JpbGU6IHRydWUsXHJcbiAgICAgICAgYWRkUmliYm9uSWNvbjogZmFsc2UsXHJcbiAgICAgICAgb3BlbkluQ2VudGVyOiBmYWxzZSxcclxuICAgICAgICB6b29tTGV2ZWw6IDEsXHJcbiAgICAgICAgZm9yY2VJZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgIGN1c3RvbUNzczogYC8qIGhpZGUgdGhlIGhlbHAsIGhvbWUsIHNlYXJjaCwgYW5kIHByb2R1Y3Rpdml0eSBvdmVydmlldyBidXR0b25zLCBjcmVhdGUgZXh0cmEgc3BhY2UsIGFuZCBwcmV2ZW50IHRvYXN0IHBvcC11cCBmcm9tIGFjdGluZyB3ZWlyZCAqL1xyXG5bYXJpYS1sYWJlbD1cIkdvIHRvIEhvbWUgdmlld1wiXSwgI3F1aWNrX2ZpbmQsIFthcmlhLWxhYmVsPVwiUHJvZHVjdGl2aXR5XCJdLCBbYXJpYS1sYWJlbD1cIkhlbHAgJiBGZWVkYmFja1wiXSB7XHJcblx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udmlld19jb250ZW50IHtcclxuXHRwYWRkaW5nLWxlZnQ6IDE1cHg7XHJcbn1cclxuXHJcbi52aWV3X2hlYWRlciB7XHJcblx0cGFkZGluZy1sZWZ0OiAxNXB4O1xyXG5cdHBhZGRpbmctdG9wOiAxMHB4O1xyXG59XHJcblxyXG4udW5kb190b2FzdCB7XHJcblx0d2lkdGg6IDk1JTtcclxufWBcclxuICAgIH0sXHJcbiAgICBcIm5vdGlvblwiOiB7XHJcbiAgICAgICAgdXJsOiBcImh0dHBzOi8vd3d3Lm5vdGlvbi5zby9cIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJOb3Rpb25cIixcclxuICAgICAgICBpY29uOiBcImJveFwiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiB0cnVlLFxyXG4gICAgICAgIG9wZW5JbkNlbnRlcjogdHJ1ZSxcclxuICAgICAgICB6b29tTGV2ZWw6IDEsXHJcbiAgICAgICAgZm9yY2VJZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgIGN1c3RvbUNzczogXCJcIlxyXG4gICAgfSxcclxuICAgIFwidHdpdHRlclwiOiB7XHJcbiAgICAgICAgdXJsOiBcImh0dHBzOi8vdHdpdHRlci5jb21cIixcclxuICAgICAgICBkaXNwbGF5TmFtZTogXCJUd2l0dGVyXCIsXHJcbiAgICAgICAgaWNvbjogXCJ0d2l0dGVyXCIsXHJcbiAgICAgICAgaGlkZU9uTW9iaWxlOiB0cnVlLFxyXG4gICAgICAgIGFkZFJpYmJvbkljb246IGZhbHNlLFxyXG4gICAgICAgIG9wZW5JbkNlbnRlcjogZmFsc2UsXHJcbiAgICAgICAgem9vbUxldmVsOiAxLFxyXG4gICAgICAgIGZvcmNlSWZyYW1lOiBmYWxzZSxcclxuICAgICAgICBjdXN0b21Dc3M6IFwiXCJcclxuICAgIH0sXHJcbiAgICBcInRhc2tzXCI6IHtcclxuICAgICAgICB1cmw6IFwiaHR0cHM6Ly90YXNrcy5nb29nbGUuY29tL2VtYmVkLz9vcmlnaW49aHR0cHM6Ly9jYWxlbmRhci5nb29nbGUuY29tJmZ1bGxXaWR0aD0xXCIsXHJcbiAgICAgICAgZGlzcGxheU5hbWU6IFwiR29vZ2xlIFRhc2tzXCIsXHJcbiAgICAgICAgaWNvbjogXCJsaXN0LWNoZWNrc1wiLFxyXG4gICAgICAgIGhpZGVPbk1vYmlsZTogdHJ1ZSxcclxuICAgICAgICBhZGRSaWJib25JY29uOiBmYWxzZSxcclxuICAgICAgICBvcGVuSW5DZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgIHpvb21MZXZlbDogMSxcclxuICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgY3VzdG9tQ3NzOiBcIlwiXHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUZyYW1lc1NldHRpbmdzIHtcclxuICAgIGZyYW1lczogQ3VzdG9tRnJhbWVTZXR0aW5nc1tdO1xyXG4gICAgcGFkZGluZzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUZyYW1lU2V0dGluZ3Mge1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gICAgaWNvbjogc3RyaW5nO1xyXG4gICAgaGlkZU9uTW9iaWxlOiBib29sZWFuO1xyXG4gICAgYWRkUmliYm9uSWNvbjogYm9vbGVhbjtcclxuICAgIG9wZW5JbkNlbnRlcjogYm9vbGVhbjtcclxuICAgIHpvb21MZXZlbDogbnVtYmVyO1xyXG4gICAgZm9yY2VJZnJhbWU6IGJvb2xlYW47XHJcbiAgICBjdXN0b21Dc3M6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEljb24oc2V0dGluZ3M6IEN1c3RvbUZyYW1lU2V0dGluZ3MpIHtcclxuICAgIHJldHVybiBzZXR0aW5ncy5pY29uID8gYGx1Y2lkZS0ke3NldHRpbmdzLmljb259YCA6IFwiZG9jdW1lbnRzXCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJZChzZXR0aW5nczogQ3VzdG9tRnJhbWVTZXR0aW5ncykge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiLVwiKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgQXBwLCBCdXR0b25Db21wb25lbnQsIERyb3Bkb3duQ29tcG9uZW50LCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRTZXR0aW5ncywgcHJlc2V0cyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21GcmFtZXNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEN1c3RvbUZyYW1lc1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IEN1c3RvbUZyYW1lc1BsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBDdXN0b21GcmFtZXNQbHVnaW4pIHtcclxuICAgICAgICBzdXBlcihhcHAsIHBsdWdpbik7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGxheSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJDdXN0b20gRnJhbWVzIFNldHRpbmdzXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBcIlBsZWFzZSBub3RlIHRoYXQgT2JzaWRpYW4gaGFzIHRvIGJlIHJlc3RhcnRlZCBvciByZWxvYWRlZCBmb3IgbW9zdCBvZiB0aGVzZSBzZXR0aW5ncyB0byB0YWtlIGVmZmVjdC5cIiwgY2xzOiBcIm1vZC13YXJuaW5nXCIgfSk7XHJcblxyXG4gICAgICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpXHJcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRnJhbWUgUGFkZGluZ1wiKVxyXG4gICAgICAgICAgICAuc2V0RGVzYyhcIlRoZSBwYWRkaW5nIHRoYXQgc2hvdWxkIGJlIGxlZnQgYXJvdW5kIHRoZSBpbnNpZGUgb2YgY3VzdG9tIGZyYW1lIHBhbmVzLCBpbiBwaXhlbHMuXCIpXHJcbiAgICAgICAgICAgIC5hZGRUZXh0KHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdC5pbnB1dEVsLnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShTdHJpbmcodGhpcy5wbHVnaW4uc2V0dGluZ3MucGFkZGluZykpO1xyXG4gICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wYWRkaW5nID0gdi5sZW5ndGggPyBOdW1iZXIodikgOiBkZWZhdWx0U2V0dGluZ3MucGFkZGluZztcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgZnJhbWUgb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZnJhbWVzKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWFkaW5nID0gdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogZnJhbWUuZGlzcGxheU5hbWUgfHwgXCJVbm5hbWVkIEZyYW1lXCIgfSk7XHJcbiAgICAgICAgICAgIGxldCB0b2dnbGUgPSBuZXcgQnV0dG9uQ29tcG9uZW50KHRoaXMuY29udGFpbmVyRWwpXHJcbiAgICAgICAgICAgICAgICAuc2V0QnV0dG9uVGV4dChcIlNob3cgU2V0dGluZ3NcIilcclxuICAgICAgICAgICAgICAgIC5zZXRDbGFzcyhcImN1c3RvbS1mcmFtZXMtc2hvd1wiKVxyXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuaGlkZGVuID0gIWNvbnRlbnQuaGlkZGVuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRCdXR0b25UZXh0KGNvbnRlbnQuaGlkZGVuID8gXCJTaG93IFNldHRpbmdzXCIgOiBcIkhpZGUgU2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZURpdigpO1xyXG4gICAgICAgICAgICBjb250ZW50LmhpZGRlbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJEaXNwbGF5IE5hbWVcIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiVGhlIGRpc3BsYXkgbmFtZSB0aGF0IHRoaXMgZnJhbWUgc2hvdWxkIGhhdmUuXCIpXHJcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmRpc3BsYXlOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5kaXNwbGF5TmFtZSA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRpbmcuc2V0VGV4dChmcmFtZS5kaXNwbGF5TmFtZSB8fCBcIlVubmFtZWQgRnJhbWVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkljb25cIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKGNyZWF0ZUZyYWdtZW50KGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlU3Bhbih7IHRleHQ6IFwiVGhlIGljb24gdGhhdCB0aGlzIGZyYW1lJ3MgcGFuZSBzaG91bGQgaGF2ZS4gVGhlIG5hbWVzIG9mIGFueSBcIiB9KTtcclxuICAgICAgICAgICAgICAgICAgICBmLmNyZWF0ZUVsKFwiYVwiLCB7IHRleHQ6IFwiTHVjaWRlIGljb25zXCIsIGhyZWY6IFwiaHR0cHM6Ly9sdWNpZGUuZGV2L1wiIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlU3Bhbih7IHRleHQ6IFwiIGNhbiBiZSB1c2VkLlwiIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmljb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHQub25DaGFuZ2UoYXN5bmMgdiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmljb24gPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJVUkxcIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiVGhlIFVSTCB0aGF0IHNob3VsZCBiZSBvcGVuZWQgaW4gdGhpcyBmcmFtZS5cIilcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZnJhbWUudXJsKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS51cmwgPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJEaXNhYmxlIG9uIE1vYmlsZVwiKVxyXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJDdXN0b20gRnJhbWVzIGlzIGEgbG90IG1vcmUgcmVzdHJpY3RlZCBvbiBtb2JpbGUgZGV2aWNlcyBhbmQgZG9lc24ndCBhbGxvdyBmb3IgdGhlIHNhbWUgdHlwZXMgb2YgY29udGVudCB0byBiZSBkaXNwbGF5ZWQuIElmIGEgZnJhbWUgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIG9uIG1vYmlsZSwgaXQgY2FuIGJlIGRpc2FibGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmhpZGVPbk1vYmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuaGlkZU9uTW9iaWxlID0gdjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGVudClcclxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiQWRkIFJpYmJvbiBJY29uXCIpXHJcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcIldoZXRoZXIgYSBidXR0b24gdG8gb3BlbiB0aGlzIGZyYW1lIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmliYm9uLlwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmFkZFJpYmJvbkljb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHQub25DaGFuZ2UoYXN5bmMgdiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmFkZFJpYmJvbkljb24gPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJPcGVuIGluIENlbnRlclwiKVxyXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXCJXaGV0aGVyIHRoaXMgZnJhbWUgc2hvdWxkIGJlIG9wZW5lZCBpbiB0aGUgdW5waW5uZWQgY2VudGVyIGVkaXRvciByYXRoZXIgdGhhbiBvbmUgb2YgdGhlIHBhbmVzIG9uIHRoZSBzaWRlLiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2l0ZXMgdGhhdCBkb24ndCB3b3JrIHdlbGwgaW4gYSBuYXJyb3cgdmlldywgb3Igc2l0ZXMgdGhhdCBkb24ndCByZXF1aXJlIGEgbm90ZSB0byBiZSBvcGVuIHdoZW4gdmlld2VkLlwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLm9wZW5JbkNlbnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUub3BlbkluQ2VudGVyID0gdjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGVudClcclxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiRm9yY2UgaWZyYW1lXCIpXHJcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhjcmVhdGVGcmFnbWVudChmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmLmNyZWF0ZVNwYW4oeyB0ZXh0OiBcIldoZXRoZXIgdGhpcyBmcmFtZSBzaG91bGQgdXNlIGlmcmFtZXMgb24gZGVza3RvcCBhcyBvcHBvc2VkIHRvIEVsZWN0cm9uIHdlYnZpZXdzLlwiIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlRWwoXCJiclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBmLmNyZWF0ZUVsKFwiZW1cIiwgeyB0ZXh0OiBcIk9ubHkgZW5hYmxlIHRoaXMgc2V0dGluZyBpZiB0aGUgZnJhbWUgaXMgY2F1c2luZyBpc3N1ZXMgb3IgZnJlcXVlbnQgY3Jhc2hlcy4gVGhpcyBzZXR0aW5nIGNhdXNlcyBhbGwgRGVza3RvcC1vbmx5IHNldHRpbmdzIHRvIGJlIGlnbm9yZWQuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC5hZGRUb2dnbGUodCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShmcmFtZS5mb3JjZUlmcmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZm9yY2VJZnJhbWUgPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoXCJQYWdlIFpvb21cIilcclxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiVGhlIHpvb20gdGhhdCB0aGlzIGZyYW1lJ3MgcGFnZSBzaG91bGQgYmUgZGlzcGxheWVkIHdpdGgsIGFzIGEgcGVyY2VudGFnZS5cIilcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHQuaW5wdXRFbC50eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKFN0cmluZyhmcmFtZS56b29tTGV2ZWwgKiAxMDApKTtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKGFzeW5jIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS56b29tTGV2ZWwgPSB2Lmxlbmd0aCA/IE51bWJlcih2KSAvIDEwMCA6IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkFkZGl0aW9uYWwgQ1NTXCIpXHJcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhjcmVhdGVGcmFnbWVudChmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmLmNyZWF0ZVNwYW4oeyB0ZXh0OiBcIkEgc25pcHBldCBvZiBhZGRpdGlvbmFsIENTUyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgZnJhbWUuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZi5jcmVhdGVFbChcImJyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGYuY3JlYXRlRWwoXCJlbVwiLCB7IHRleHQ6IFwiTm90ZSB0aGF0IHRoaXMgaXMgb25seSBhcHBsaWVkIG9uIERlc2t0b3AuXCIgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0QXJlYSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0LmlucHV0RWwucm93cyA9IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5pbnB1dEVsLmNvbHMgPSA1MDtcclxuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGZyYW1lLmN1c3RvbUNzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY3VzdG9tQ3NzID0gdjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoXCJSZW1vdmUgRnJhbWVcIilcclxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5mcmFtZXMucmVtb3ZlKGZyYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogXCJDcmVhdGUgYSBuZXcgZnJhbWUsIGVpdGhlciBmcm9tIGEgcHJlc2V0IHNoaXBwZWQgd2l0aCB0aGUgcGx1Z2luLCBvciBhIGN1c3RvbSBvbmUgdGhhdCB5b3UgY2FuIGVkaXQgeW91cnNlbGYuIEVhY2ggZnJhbWUncyBwYW5lIGNhbiBiZSBvcGVuZWQgdXNpbmcgdGhlIFxcXCJDdXN0b20gRnJhbWVzOiBPcGVuXFxcIiBjb21tYW5kLlwiIH0pO1xyXG5cclxuICAgICAgICBsZXQgYWRkRGl2ID0gdGhpcy5jb250YWluZXJFbC5jcmVhdGVEaXYoKTtcclxuICAgICAgICBsZXQgZHJvcGRvd24gPSBuZXcgRHJvcGRvd25Db21wb25lbnQoYWRkRGl2KTtcclxuICAgICAgICBkcm9wZG93bi5hZGRPcHRpb24oXCJuZXdcIiwgXCJDdXN0b21cIik7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHByZXNldHMpKVxyXG4gICAgICAgICAgICBkcm9wZG93bi5hZGRPcHRpb24oa2V5LCBwcmVzZXRzW2tleV0uZGlzcGxheU5hbWUpO1xyXG4gICAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYWRkRGl2KVxyXG4gICAgICAgICAgICAuc2V0QnV0dG9uVGV4dChcIkFkZCBGcmFtZVwiKVxyXG4gICAgICAgICAgICAuc2V0Q2xhc3MoXCJjdXN0b20tZnJhbWVzLWFkZFwiKVxyXG4gICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uID0gZHJvcGRvd24uZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24gPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZyYW1lcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogXCJOZXcgRnJhbWVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZU9uTW9iaWxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRSaWJib25JY29uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkluQ2VudGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgem9vbUxldmVsOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZUlmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUNzczogXCJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5mcmFtZXMucHVzaChwcmVzZXRzW29wdGlvbl0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciBkaXNjbGFpbWVyID0gdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwgeyBjbHM6IFwibW9kLXdhcm5pbmdcIiB9KTtcclxuICAgICAgICBkaXNjbGFpbWVyLmNyZWF0ZVNwYW4oeyB0ZXh0OiBcIlBsZWFzZSBiZSBhZHZpc2VkIHRoYXQsIHdoZW4gYWRkaW5nIGEgc2l0ZSBhcyBhIGN1c3RvbSBmcmFtZSwgeW91IHBvdGVudGlhbGx5IGV4cG9zZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB5b3UgZW50ZXIgdG8gb3RoZXIgcGx1Z2lucyB5b3UgaGF2ZSBpbnN0YWxsZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgXCIgfSk7XHJcbiAgICAgICAgZGlzY2xhaW1lci5jcmVhdGVFbChcImFcIiwgeyB0ZXh0OiBcInRoaXMgZGlzY3Vzc2lvblwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9FbGxwZWNrL09ic2lkaWFuQ3VzdG9tRnJhbWVzL2lzc3Vlcy81NCNpc3N1ZWNvbW1lbnQtMTIxMDg3OTY4NVwiLCBjbHM6IFwibW9kLXdhcm5pbmdcIiB9KTtcclxuICAgICAgICBkaXNjbGFpbWVyLmNyZWF0ZVNwYW4oeyB0ZXh0OiBcIi5cIiB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogXCJJZiB5b3UgbGlrZSB0aGlzIHBsdWdpbiBhbmQgd2FudCB0byBzdXBwb3J0IGl0cyBkZXZlbG9wbWVudCwgeW91IGNhbiBkbyBzbyB0aHJvdWdoIG15IHdlYnNpdGUgYnkgY2xpY2tpbmcgdGhpcyBmYW5jeSBpbWFnZSFcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYVwiLCB7IGhyZWY6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3N1cHBvcnRcIiB9KVxyXG4gICAgICAgICAgICAuY3JlYXRlRWwoXCJpbWdcIiwgeyBhdHRyOiB7IHNyYzogXCJodHRwczovL2VsbHBlY2suZGUvcmVzL2dlbmVyYWxzdXBwb3J0LnBuZ1wiIH0sIGNsczogXCJjdXN0b20tZnJhbWVzLXN1cHBvcnRcIiB9KTtcclxuICAgIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYsIE1lbnUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQ3VzdG9tRnJhbWUgfSBmcm9tIFwiLi9mcmFtZVwiO1xyXG5pbXBvcnQgeyBDdXN0b21GcmFtZVNldHRpbmdzLCBDdXN0b21GcmFtZXNTZXR0aW5ncywgZ2V0SWNvbiB9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRnJhbWVWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGFjdGlvbnM6IEFjdGlvbltdID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJSZXR1cm4gdG8gb3JpZ2luYWwgcGFnZVwiLFxyXG4gICAgICAgICAgICBpY29uOiBcImhvbWVcIixcclxuICAgICAgICAgICAgYWN0aW9uOiB2ID0+IHYuZnJhbWUucmV0dXJuKClcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiT3BlbiBkZXYgdG9vbHNcIixcclxuICAgICAgICAgICAgaWNvbjogXCJiaW5hcnlcIixcclxuICAgICAgICAgICAgYWN0aW9uOiB2ID0+IHYuZnJhbWUudG9nZ2xlRGV2VG9vbHMoKVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJDb3B5IGxpbmtcIixcclxuICAgICAgICAgICAgaWNvbjogXCJsaW5rXCIsXHJcbiAgICAgICAgICAgIGFjdGlvbjogdiA9PiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh2LmZyYW1lLmdldEN1cnJlbnRVcmwoKSlcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiT3BlbiBpbiBicm93c2VyXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiZ2xvYmVcIixcclxuICAgICAgICAgICAgYWN0aW9uOiB2ID0+IG9wZW4odi5mcmFtZS5nZXRDdXJyZW50VXJsKCkpXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlJlZnJlc2hcIixcclxuICAgICAgICAgICAgaWNvbjogXCJyZWZyZXNoLWN3XCIsXHJcbiAgICAgICAgICAgIGFjdGlvbjogdiA9PiB2LmZyYW1lLnJlZnJlc2goKVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJHbyBiYWNrXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiYXJyb3ctbGVmdFwiLFxyXG4gICAgICAgICAgICBhY3Rpb246IHYgPT4gdi5mcmFtZS5nb0JhY2soKVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJHbyBmb3J3YXJkXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiYXJyb3ctcmlnaHRcIixcclxuICAgICAgICAgICAgYWN0aW9uOiB2ID0+IHYuZnJhbWUuZ29Gb3J3YXJkKClcclxuICAgICAgICB9XHJcbiAgICBdO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogQ3VzdG9tRnJhbWVTZXR0aW5ncztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmcmFtZTogQ3VzdG9tRnJhbWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgc2V0dGluZ3M6IEN1c3RvbUZyYW1lc1NldHRpbmdzLCBkYXRhOiBDdXN0b21GcmFtZVNldHRpbmdzLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihsZWFmKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5mcmFtZSA9IG5ldyBDdXN0b21GcmFtZShzZXR0aW5ncywgZGF0YSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGFjdGlvbiBvZiBDdXN0b21GcmFtZVZpZXcuYWN0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5hZGRBY3Rpb24oYWN0aW9uLmljb24sIGFjdGlvbi5uYW1lLCAoKSA9PiBhY3Rpb24uYWN0aW9uKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBvbmxvYWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50RWwuZW1wdHkoKTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5hZGRDbGFzcyhcImN1c3RvbS1mcmFtZXMtdmlld1wiKTtcclxuICAgICAgICB0aGlzLmZyYW1lLmNyZWF0ZSh0aGlzLmNvbnRlbnRFbCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25QYW5lTWVudShtZW51OiBNZW51LCBzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm9uUGFuZU1lbnUobWVudSwgc291cmNlKTtcclxuICAgICAgICBmb3IgKGxldCBhY3Rpb24gb2YgQ3VzdG9tRnJhbWVWaWV3LmFjdGlvbnMpIHtcclxuICAgICAgICAgICAgbWVudS5hZGRJdGVtKGkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaS5zZXRUaXRsZShhY3Rpb24ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpLnNldEljb24oYWN0aW9uLmljb24pO1xyXG4gICAgICAgICAgICAgICAgaS5vbkNsaWNrKCgpID0+IGFjdGlvbi5hY3Rpb24odGhpcykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Vmlld1R5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERpc3BsYXlUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kaXNwbGF5TmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJY29uKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGdldEljb24odGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZyYW1lLmZvY3VzKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBBY3Rpb24ge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgaWNvbjogc3RyaW5nO1xyXG4gICAgYWN0aW9uOiAodmlldzogQ3VzdG9tRnJhbWVWaWV3KSA9PiBhbnk7XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFnRDs7O0FDQWhELHNCQUF5Qjs7O0FDQWxCLElBQU0sa0JBQXdDO0FBQUEsRUFDakQsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBO0FBRU4sSUFBTSxVQUErQztBQUFBLEVBQ3hELFlBQVk7QUFBQSxJQUNSLEtBQUs7QUFBQSxJQUNMLGFBQWE7QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLGVBQWU7QUFBQSxJQUNmLGNBQWM7QUFBQSxJQUNkLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLFdBQVc7QUFBQTtBQUFBLEVBRWYsWUFBWTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2YsY0FBYztBQUFBLElBQ2QsV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1mLFlBQVk7QUFBQSxJQUNSLEtBQUs7QUFBQSxJQUNMLGFBQWE7QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLGVBQWU7QUFBQSxJQUNmLGNBQWM7QUFBQSxJQUNkLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9mLFFBQVE7QUFBQSxJQUNKLEtBQUs7QUFBQSxJ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
|