Soleris_Roman/.obsidian/plugins/obsidian-prozen/main.js

195 lines
28 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => Prozen
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
var DEFAULT_SETTINGS = {
animationDuration: 2,
showHeader: false,
showScroll: false,
showGraphControls: false,
forceReadable: true,
vignetteOpacity: 0.75,
vignetteScaleLinear: 20,
vignetteScaleRadial: 75
};
var Prozen = class extends import_obsidian.Plugin {
async onload() {
await this.loadSettings();
this.addCommand({
id: "zenmode",
name: "Zen mode",
callback: this.fullscreenMode.bind(this)
});
this.addSettingTab(new ProzenSettingTab(this.app, this));
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
fullscreenMode() {
const leaf = this.app.workspace.getActiveViewOfType(import_obsidian.ItemView).leaf;
if (!leaf)
return;
if (leaf.view.getViewType() === "empty")
return;
const root = document.documentElement;
root.style.setProperty("--fadeIn-duration", this.settings.animationDuration + "s");
root.style.setProperty("--vignette-opacity", this.settings.vignetteOpacity);
root.style.setProperty("--vignette-scale-linear", this.settings.vignetteScaleLinear + "%");
root.style.setProperty("--vignette-scale-radial", this.settings.vignetteScaleRadial + "%");
const containerEl = leaf.containerEl;
if (!document.fullscreenElement) {
containerEl.requestFullscreen();
this.addStyles(leaf);
} else {
document.exitFullscreen();
this.removeStyles(leaf);
}
containerEl.onfullscreenchange = () => {
if (!document.fullscreenElement) {
this.removeStyles(leaf);
}
};
}
addStyles(leaf) {
const viewEl = leaf.view.contentEl;
const header = leaf.view.headerEl;
const isGraph = leaf.view.getViewType() === "graph";
let graphControls;
if (isGraph) {
graphControls = leaf.view.dataEngine.controlsEl;
}
if (!this.settings.showScroll) {
viewEl.classList.add("noscroll");
}
if (isGraph && !this.settings.showGraphControls) {
graphControls.classList.add("hide");
}
isGraph ? viewEl.classList.add("vignette-radial") : viewEl.classList.add("vignette-linear");
if (!isGraph && this.settings.forceReadable) {
leaf.view.editMode.editorEl.classList.add("is-readable-line-width");
}
viewEl.classList.add("animate");
this.settings.showHeader ? header.classList.add("animate") : header.classList.add("hide");
}
removeStyles(leaf) {
const viewEl = leaf.view.contentEl;
const header = leaf.view.headerEl;
const isGraph = leaf.view.getViewType() === "graph";
let graphControls;
if (isGraph) {
graphControls = leaf.view.dataEngine.controlsEl;
graphControls.classList.remove("animate", "hide");
} else if (!this.app.vault.getConfig("readableLineLength")) {
leaf.view.editMode.editorEl.classList.remove("is-readable-line-width");
}
viewEl.classList.remove("vignette-linear", "vignette-radial", "animate", "noscroll");
header.classList.remove("animate", "hide");
}
};
var ProzenSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
this.containerEl.createEl("h3", {
text: "Vignette"
});
let vignetteOpacityNumber;
new import_obsidian.Setting(containerEl).setName("Opacity").setDesc("Intensity of vignette's dimming effect. Set to 0 to turn vignetting off.").addSlider((slider) => slider.setLimits(0, 1, 0.01).setValue(this.plugin.settings.vignetteOpacity).onChange(async (value) => {
vignetteOpacityNumber.innerText = " " + value.toString();
this.plugin.settings.vignetteOpacity = value;
await this.plugin.saveSettings();
})).settingEl.createDiv("", (el) => {
vignetteOpacityNumber = el;
el.style.minWidth = "2.0em";
el.style.textAlign = "right";
el.innerText = " " + this.plugin.settings.vignetteOpacity.toString();
});
let vignetteScaleLinearNumber;
new import_obsidian.Setting(containerEl).setName("Scale in text views").setDesc("Determines how close to the screen's center vignetting spreads from both sides of the screen, as linear gradients.").addSlider((slider) => slider.setLimits(5, 50, 5).setValue(this.plugin.settings.vignetteScaleLinear).onChange(async (value) => {
vignetteScaleLinearNumber.innerText = " " + value.toString();
this.plugin.settings.vignetteScaleLinear = value;
await this.plugin.saveSettings();
})).settingEl.createDiv("", (el) => {
vignetteScaleLinearNumber = el;
el.style.minWidth = "2.0em";
el.style.textAlign = "right";
el.innerText = " " + this.plugin.settings.vignetteScaleLinear.toString();
});
let vignetteScaleRadialNumber;
new import_obsidian.Setting(containerEl).setName("Scale in graph view").setDesc("Determines how close to the screen's center vignetting spreads from borders of the screen, as a radial gradient.").addSlider((slider) => slider.setLimits(5, 100, 5).setValue(this.plugin.settings.vignetteScaleRadial).onChange(async (value) => {
vignetteScaleRadialNumber.innerText = " " + value.toString();
this.plugin.settings.vignetteScaleRadial = value;
await this.plugin.saveSettings();
})).settingEl.createDiv("", (el) => {
vignetteScaleRadialNumber = el;
el.style.minWidth = "2.0em";
el.style.textAlign = "right";
el.innerText = " " + this.plugin.settings.vignetteScaleRadial.toString();
});
this.containerEl.createEl("h3", {
text: "Animation"
});
new import_obsidian.Setting(containerEl).setName("Fade-in duration").setDesc("The duration (in seconds) of fade-in animation on entering Zen mode").addText((text) => text.setPlaceholder("1.2").setValue(String(this.plugin.settings.animationDuration)).onChange(async (value) => {
this.plugin.settings.animationDuration = Number(value);
await this.plugin.saveSettings();
}));
this.containerEl.createEl("h3", {
text: "Element Toggles"
});
new import_obsidian.Setting(containerEl).setName("Show header").setDesc("Show the tab's header in Zen mode").addToggle((toggle) => toggle.setValue(this.plugin.settings.showHeader).onChange(async (value) => {
this.plugin.settings.showHeader = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName("Show scrollbar").setDesc("Show the scrollbar in Zen mode. If it is hidden, scrolling is still available with mousewheel, arrows, touchpad, etc.").addToggle((toggle) => toggle.setValue(this.plugin.settings.showScroll).onChange(async (value) => {
this.plugin.settings.showScroll = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName("Show graph controls").setDesc("Show the graph view's controls in Zen mode").addToggle((toggle) => toggle.setValue(this.plugin.settings.showGraphControls).onChange(async (value) => {
this.plugin.settings.showGraphControls = value;
await this.plugin.saveSettings();
}));
this.containerEl.createEl("h3", {
text: "Misc"
});
new import_obsidian.Setting(containerEl).setName("Force content centering").setDesc("Center text content in Zen mode, even if in regular view it takes all of the screen's width (ignore 'Editor -> Readable line length' being off in Zen mode)").addToggle((toggle) => toggle.setValue(this.plugin.settings.forceReadable).onChange(async (value) => {
this.plugin.settings.forceReadable = value;
await this.plugin.saveSettings();
}));
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBJdGVtVmlldywgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3Mge1xyXG5cdGFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXIsXHJcblx0c2hvd0hlYWRlcjogYm9vbGVhbixcclxuXHRzaG93U2Nyb2xsOiBib29sZWFuLFxyXG5cdHNob3dHcmFwaENvbnRyb2xzOiBib29sZWFuLFxyXG5cdGZvcmNlUmVhZGFibGU6IGJvb2xlYW4sXHJcblx0dmlnbmV0dGVPcGFjaXR5OiBudW1iZXIsXHJcblx0dmlnbmV0dGVTY2FsZUxpbmVhcjogbnVtYmVyLFxyXG5cdHZpZ25ldHRlU2NhbGVSYWRpYWw6IG51bWJlclxyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncyA9IHtcclxuXHRhbmltYXRpb25EdXJhdGlvbjogMixcclxuXHRzaG93SGVhZGVyOiBmYWxzZSxcclxuXHRzaG93U2Nyb2xsOiBmYWxzZSxcclxuXHRzaG93R3JhcGhDb250cm9sczogZmFsc2UsXHJcblx0Zm9yY2VSZWFkYWJsZTogdHJ1ZSwgXHJcblx0dmlnbmV0dGVPcGFjaXR5OiAwLjc1LFxyXG5cdHZpZ25ldHRlU2NhbGVMaW5lYXI6IDIwLFxyXG5cdHZpZ25ldHRlU2NhbGVSYWRpYWw6IDc1XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb3plbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFBsdWdpblNldHRpbmdzO1xyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IFwiemVubW9kZVwiLFxyXG5cdFx0XHRuYW1lOiBcIlplbiBtb2RlXCIsXHJcblx0XHRcdGNhbGxiYWNrOiB0aGlzLmZ1bGxzY3JlZW5Nb2RlLmJpbmQodGhpcyksXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgUHJvemVuU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cclxuXHRmdWxsc2NyZWVuTW9kZSgpIHtcclxuXHRcdC8vIFVzZSBJdGVtVmlldyBmb3IgbXVsdGlwbGUgdmlldyB0eXBlcyAocHJldmlvdXNseSBpdCB3YXMgb25seSBNYXJrZG93blZpZXcpXHJcblx0XHRjb25zdCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoSXRlbVZpZXcpLmxlYWY7XHJcblx0XHRpZiAoIWxlYWYpIHJldHVybjtcclxuXHRcdC8vIERvbid0IHRyaWdnZXIgZnVsbHNjcmVlbiBtb2RlIHdoZW4gY3VycmVudCBsZWFmIGlzIGVtcHR5LlxyXG5cdFx0aWYobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFwiZW1wdHlcIikgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcclxuXHRcdHJvb3Quc3R5bGUuc2V0UHJvcGVydHkoJy0tZmFkZUluLWR1cmF0aW9uJywgdGhpcy5zZXR0aW5ncy5hbmltYXRpb25EdXJhdGlvbiArICdzJylcclxuXHRcdHJvb3Quc3R5bGUuc2V0UHJvcGVydHkoJy0tdmlnbmV0dGUtb3BhY2l0eScsIHRoaXMuc2V0dGluZ3MudmlnbmV0dGVPcGFjaXR5KVxyXG5cdFx0cm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12aWduZXR0ZS1zY2FsZS1saW5lYXInLCB0aGlzLnNldHRpbmdzLnZpZ25ldHRlU2NhbGVMaW5lYXIgKyAnJScpXHJcblx0XHRyb290LnN0eWxlLnNldFByb3BlcnR5KCctLXZpZ25ldHRlLXNjYWxlLXJhZGlhbCcsIHRoaXMuc2V0dGluZ3MudmlnbmV0dGVTY2FsZVJhZGlhbCArICclJylcclxuXHRcdFxyXG5cdFx0Y29uc3QgY29udGFpbmVyRWwgPSBsZWFmLmNvbnRhaW5lckVsO1xyXG5cclxuXHRcdGlmICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpe1xyXG5cdFx0XHRjb250YWluZXJFbC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG5cdFx0XHR0aGlzLmFkZFN0eWxlcyhsZWFmKVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcclxuXHRcdFx0dGhpcy5yZW1vdmVTdHlsZXMobGVhZilcclxuXHRcdH1cclxuXHRcdGNvbnRhaW5lckVsLm9uZnVsbHNjcmVlbmNoYW5nZSA9ICgpID0+IHtcclxuXHRcdFx0aWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCl7XHJcblx0XHRcdFx0dGhpcy5yZW1vdmVTdHlsZXMobGVhZilcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YWRkU3R5bGVzKGxlYWY6IFdvcmtzcGFjZUxlYWYpIHtcclxuXHRcdGNvbnN0IHZpZXdFbCA9IGxlYWYudmlldy5jb250ZW50RWxcclxuXHRcdGNvbnN0IGhlYWRlciA9IGxlYWYudmlldy5oZWFkZXJFbFxyXG5cdFx0Y29uc3QgaXNHcmFwaCA9IGxlYWYudmlldy5nZXRWaWV3VHlwZSgpID09PSBcImdyYXBoXCJcclxuXHJcblx0XHRsZXQgZ3JhcGhDb250cm9sczogSFRNTEVsZW1lbnQ7XHJcblx0XHRpZiAoaXNHcmFwaCkgeyBncmFwaENvbnRyb2xzID0gbGVhZi52aWV3LmRhdGFFbmdpbmUuY29udHJvbHNFbH1cclxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5zaG93U2Nyb2xsKXtcdHZpZXdFbC5jbGFzc0xpc3QuYWRkKFwibm9zY3JvbGxcIikgfVxyXG5cdFx0aWYgKGlzR3JhcGggJiYgIXRoaXMuc2V0dGluZ3Muc2hvd0dyYXBoQ29udHJvbHMpIHsgZ3JhcGhDb250cm9scy5jbGFzc0xpc3QuYWRkKFwiaGlkZVwiKSB9XHJcblx0XHRpc0dyYXBoID8gdmlld0VsLmNsYXNzTGlzdC5hZGQoXCJ2aWduZXR0ZS1yYWRpYWxcIikgOiB2aWV3RWwuY2xhc3NMaXN0LmFkZChcInZpZ25ldHRlLWxpbmVhclwiKVxyXG5cdFx0aWYgKCFpc0dyYXBoICYmIHRoaXMuc2V0dGluZ3MuZm9yY2VSZWFkYWJsZSkgeyBsZWFmLnZpZXcuZWRpdE1vZGUuZWRpdG9yRWwuY2xhc3NMaXN0LmFkZChcImlzLXJlYWRhYmxlLWxpbmUtd2lkdGhcIikgfVxyXG5cclxuXHRcdFxyXG5cdFx0dmlld0VsLmNsYXNzTGlzdC5hZGQoXCJhbmltYXRlXCIpXHJcblx0XHR0aGlzLnNldHRpbmdzLnNob3dIZWFkZXIgPyBoZWFkZXIuY2xhc3NMaXN0LmFkZChcImFuaW1hdGVcIikgOiBoZWFkZXIuY2xhc3NMaXN0LmFkZChcImhpZGVcIilcclxuXHJcblx0fVxyXG5cclxuXHRyZW1vdmVTdHlsZXMobGVhZjogV29ya3NwYWNlTGVhZikge1xyXG5cdFx0Y29uc3Qgdmlld0VsID0gbGVhZi52aWV3LmNvbnRlbnRFbFxyXG5cdFx0Y29uc3QgaGVhZGVyID0gbGVhZi52aWV3LmhlYWRlckVsXHJcblx0XHRjb25zdCBpc0dyYXBoID0gbGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFwiZ3JhcGhcIlxyXG5cclxuXHRcdGxldCBncmFwaENvbnRyb2xzOiBIVE1MRWxlbWVudDtcclxuXHRcdGlmIChpc0dyYXBoKSB7XHJcblx0XHRcdGdyYXBoQ29udHJvbHMgPSBsZWFmLnZpZXcuZGF0YUVuZ2luZS5jb250cm9sc0VsXHJcblx0XHRcdGdyYXBoQ29udHJvbHMuY2xhc3NMaXN0LnJlbW92ZShcImFuaW1hdGVcIiwgXCJoaWRlXCIpXHJcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmFwcC52YXVsdC5nZXRDb25maWcoJ3JlYWRhYmxlTGluZUxlbmd0aCcpKSB7XHJcblx0XHRcdGxlYWYudmlldy5lZGl0TW9kZS5lZGl0b3JFbC5jbGFzc0xpc3QucmVtb3ZlKFwiaXMtcmVhZGFibGUtbGluZS13aWR0aFwiKVxyXG5cdFx0fVxyXG5cclxuXHRcdHZpZXdFbC5jbGFzc0xpc3QucmVtb3ZlKFwidmlnbmV0dGUtbGluZWFyXCIsIFwidmlnbmV0dGUtcmFkaWFsXCIsIFwiYW5pbWF0ZVwiLCBcIm5vc2Nyb2xsXCIpXHJcblx0XHRoZWFkZXIuY2xhc3NMaXN0LnJlbW92ZShcImFuaW1hdGVcIiwgXCJoaWRlXCIpXHJcblx0fVxyXG59XHJcblxyXG5jbGFzcyBQcm96ZW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblx0cGx1Z2luOiBQcm96ZW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFByb3plbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHR0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge1xyXG5cdFx0XHR0ZXh0OiBcIlZpZ25ldHRlXCIsXHJcblx0XHR9KVxyXG5cclxuLy8gVklHTkVUVEUgT1BBQ0lUWSBTRVRUSU5HXHJcblx0XHRsZXQgdmlnbmV0dGVPcGFjaXR5TnVtYmVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnT3BhY2l0eScpXHJcblx0XHRcdC5zZXREZXNjKFwiSW50ZW5zaXR5IG9mIHZpZ25ldHRlJ3MgZGltbWluZyBlZmZlY3QuIFNldCB0byAwIHRvIHR1cm4gdmlnbmV0dGluZyBvZmYuXCIpXHJcblx0XHRcdC5hZGRTbGlkZXIoKHNsaWRlcikgPT4gc2xpZGVyXHJcblx0XHRcdFx0LnNldExpbWl0cygwLjAwLDEsMC4wMSlcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudmlnbmV0dGVPcGFjaXR5KVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHZpZ25ldHRlT3BhY2l0eU51bWJlci5pbm5lclRleHQgPSBcIiBcIiArIHZhbHVlLnRvU3RyaW5nKCk7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52aWduZXR0ZU9wYWNpdHkgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKVxyXG5cdFx0XHRcdC5zZXR0aW5nRWwuY3JlYXRlRGl2KFwiXCIsIChlbDogSFRNTERpdkVsZW1lbnQpID0+IHtcclxuXHRcdFx0XHRcdHZpZ25ldHRlT3BhY2l0eU51bWJlciA9IGVsO1xyXG5cdFx0XHRcdFx0ZWwuc3R5bGUubWluV2lkdGggPSBcIjIuMGVtXCI7XHJcblx0XHRcdFx0XHRlbC5zdHlsZS50ZXh0QWxpZ24gPSBcInJpZ2h0XCI7XHJcblx0XHRcdFx0XHRlbC5pbm5lclRleHQgPSBcIiBcIiArIHRoaXMucGx1Z2luLnNldHRpbmdzLnZpZ25ldHRlT3BhY2l0eS50b1N0cmluZygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuLy8gVklHTkVUVEUgU0NBTEUgTElORUFSIFNFVFRJTkdcclxuXHRcdGxldCB2aWduZXR0ZVNjYWxlTGluZWFyTnVtYmVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnU2NhbGUgaW4gdGV4dCB2aWV3cycpXHJcblx0XHRcdC5zZXREZXNjKFwiRGV0ZXJtaW5lcyBob3cgY2xvc2UgdG8gdGhlIHNjcmVlbidzIGNlbnRlciB2aWduZXR0aW5nIHNwcmVhZHMgZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBzY3JlZW4sIGFzIGxpbmVhciBncmFkaWVudHMuXCIpXHJcblx0XHRcdC5hZGRTbGlkZXIoKHNsaWRlcikgPT4gc2xpZGVyXHJcblx0XHRcdFx0LnNldExpbWl0cyg1LDUwLDUpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZpZ25ldHRlU2NhbGVMaW5lYXIpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dmlnbmV0dGVTY2FsZUxpbmVhck51bWJlci5pbm5lclRleHQgPSBcIiBcIiArIHZhbHVlLnRvU3RyaW5nKCk7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52aWduZXR0ZVNjYWxlTGluZWFyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSlcclxuXHRcdFx0XHQuc2V0dGluZ0VsLmNyZWF0ZURpdihcIlwiLCAoZWw6IEhUTUxEaXZFbGVtZW50KSA9PiB7XHJcblx0XHRcdFx0XHR2aWduZXR0ZVNjYWxlTGluZWFyTnVtYmVyID0gZWw7XHJcblx0XHRcdFx0XHRlbC5zdHlsZS5taW5XaWR0aCA9IFwiMi4wZW1cIjtcclxuXHRcdFx0XHRcdGVsLnN0eWxlLnRleHRBbGlnbiA9IFwicmlnaHRcIjtcclxuXHRcdFx0XHRcdGVsLmlubmVyVGV4dCA9IFwiIFwiICsgdGhpcy5wbHVnaW4uc2V0dGluZ3MudmlnbmV0dGVTY2FsZUxpbmVhci50b1N0cmluZygpO1xyXG5cdFx0XHRcdH0pO1xyXG4vLyBWSUdORVRURSBTQ0FMRSBSQURJQUwgU0VUVElOR1xyXG5cdFx0bGV0IHZpZ25ldHRlU2NhbGVSYWRpYWxOdW1iZXI6IEhUTUxEaXZFbGVtZW50O1xyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTY2FsZSBpbiBncmFwaCB2aWV3JylcclxuXHRcdFx0LnNldERlc2MoXCJEZXRlcm1pbmVzIGhvdyBjbG9zZSB0byB0aGUgc2NyZWVuJ3MgY2VudGVyIHZpZ25ldHRpbmcgc3ByZWFkcyBmcm9tIGJvcmRlcnMgb2YgdGhlIHNjcmVlbiwgYXMgYSByYWRpYWwgZ3JhZGllbnQuXCIpXHJcblx0XHRcdC5hZGRTbGlkZXIoKHNsaWRlcikgPT4gc2xpZGVyXHJcblx0XHRcdFx0LnNldExpbWl0cyg1LDEwMCw1KVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy52aWduZXR0ZVNjYWxlUmFkaWFsKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHZpZ25ldHRlU2NhbGVSYWRpYWxOdW1iZXIuaW5uZXJUZXh0ID0gXCIgXCIgKyB2YWx1ZS50b1N0cmluZygpO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmlnbmV0dGVTY2FsZVJhZGlhbCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpXHJcblx0XHRcdFx0LnNldHRpbmdFbC5jcmVhdGVEaXYoXCJcIiwgKGVsOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xyXG5cdFx0XHRcdFx0dmlnbmV0dGVTY2FsZVJhZGlhbE51bWJlciA9IGVsO1xyXG5cdFx0XHRcdFx0ZWwuc3R5bGUubWluV2lkdGggPSBcIjIuMGVtXCI7XHJcblx0XHRcdFx0XHRlbC5zdHlsZS50ZXh0QWxpZ24gPSBcInJpZ2h0XCI7XHJcblx0XHRcdFx0XHRlbC5pbm5lclRleHQgPSBcIiBcIiArIHRoaXMucGx1Z2luLnNldHRpbmdzLnZpZ25ldHRlU2NhbGVSYWRpYWwudG9TdHJpbmcoKTtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge1xyXG5cdFx0XHR0ZXh0OiBcIkFuaW1hdGlvblwiLFxyXG5cdFx0fSlcclxuLy8gQ09OVEVOVCBGQURFLUlOIERVUkFUSU9OIFNFVFRJTkdcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRmFkZS1pbiBkdXJhdGlvbicpXHJcblx0XHRcdC5zZXREZXNjKCdUaGUgZHVyYXRpb24gKGluIHNlY29uZHMpIG9mIGZhZGUtaW4gYW5pbWF0aW9uIG9uIGVudGVyaW5nIFplbiBtb2RlJylcclxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCcxLjInKVxyXG5cdFx0XHRcdC5zZXRWYWx1ZShTdHJpbmcodGhpcy5wbHVnaW4uc2V0dGluZ3MuYW5pbWF0aW9uRHVyYXRpb24pKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFuaW1hdGlvbkR1cmF0aW9uID0gTnVtYmVyKHZhbHVlKVxyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoM1wiLCB7XHJcblx0XHRcdHRleHQ6IFwiRWxlbWVudCBUb2dnbGVzXCIsXHJcblx0XHR9KVxyXG5cclxuLy8gU0hPVyBIRUFERVIgVE9HR0xFIFNFVFRJTkdcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIlNob3cgaGVhZGVyXCIpXHJcblx0XHRcdC5zZXREZXNjKFwiU2hvdyB0aGUgdGFiJ3MgaGVhZGVyIGluIFplbiBtb2RlXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cdHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93SGVhZGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dIZWFkZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuLy8gU0hPVyBTQ1JPTExCQVIgVE9HR0xFIFNFVFRJTkdcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIlNob3cgc2Nyb2xsYmFyXCIpXHJcblx0XHRcdC5zZXREZXNjKFwiU2hvdyB0aGUgc2Nyb2xsYmFyIGluIFplbiBtb2RlLiBJZiBpdCBpcyBoaWRkZW4sIHNjcm9sbGluZyBpcyBzdGlsbCBhdmFpbGFibGUgd2l0aCBtb3VzZXdoZWVsLCBhcnJvd3MsIHRvdWNocGFkLCBldGMuXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cdHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93U2Nyb2xsKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dTY3JvbGwgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuLy8gU0hPVyBHUkFQSCBDT05UUk9MUyBTRVRUSU5HXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoXCJTaG93IGdyYXBoIGNvbnRyb2xzXCIpXHJcblx0XHRcdC5zZXREZXNjKFwiU2hvdyB0aGUgZ3JhcGggdmlldydzIGNvbnRyb2xzIGluIFplbiBtb2RlXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cdHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93R3JhcGhDb250cm9scylcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93R3JhcGhDb250cm9scyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoM1wiLCB7XHJcblx0XHRcdHRleHQ6IFwiTWlzY1wiLFxyXG5cdFx0fSlcclxuXHJcbi8vIEZPUkNFIFJFQURBQkxFIFNFVFRJTkdcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIkZvcmNlIGNvbnRlbnQgY2VudGVyaW5nXCIpXHJcblx0XHRcdC5zZXREZXNjKFwiQ2VudGVyIHRleHQgY29udGVudCBpbiBaZW4gbW9kZSwgZXZlbiBpZiBpbiByZWd1bGFyIHZpZXcgaXQgdGFrZXMgYWxsIG9mIHRoZSBzY3JlZW4ncyB3aWR0aCAoaWdub3JlICdFZGl0b3IgLT4gUmVhZGFibGUgbGluZSBsZW5ndGgnIGJlaW5nIG9mZiBpbiBaZW4gbW9kZSlcIilcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9Plx0dG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvcmNlUmVhZGFibGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yY2VSZWFkYWJsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFnRjtBQWFoRixJQUFNLG1CQUFtQztBQUFBLEVBQ3hDLG1CQUFtQjtBQUFBLEVBQ25CLFlBQVk7QUFBQSxFQUNaLFlBQVk7QUFBQSxFQUNaLG1CQUFtQjtBQUFBLEVBQ25CLGVBQWU7QUFBQSxFQUNmLGlCQUFpQjtBQUFBLEVBQ2pCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUN0QjtBQUVBLElBQXFCLFNBQXJCLGNBQW9DLHVCQUFPO0FBQUEsRUFHMUMsTUFBTSxTQUFTO0FBQ2QsVUFBTSxLQUFLLGFBQWE7QUFDeEIsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixVQUFVLEtBQUssZUFBZSxLQUFLLElBQUk7QUFBQSxJQUN4QyxDQUFDO0FBQ0QsU0FBSyxjQUFjLElBQUksaUJBQWlCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFBQSxFQUN4RDtBQUFBLEVBRUEsV0FBVztBQUFBLEVBQUM7QUFBQSxFQUVaLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxrQkFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQzFFO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsVUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsRUFDbEM7QUFBQSxFQUVBLGlCQUFpQjtBQUVoQixVQUFNLE9BQU8sS0FBSyxJQUFJLFVBQVUsb0JBQW9CLHdCQUFRLEVBQUU7QUFDOUQsUUFBSSxDQUFDO0FBQU07QUFFWCxRQUFHLEtBQUssS0FBSyxZQUFZLE1BQU07QUFBUztBQUV4QyxVQUFNLE9BQU8sU0FBUztBQUN0QixTQUFLLE1BQU0sWUFBWSxxQkFBcUIs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