mirror of
https://github.com/zigholding/obsidian-notesync-plugin.git
synced 2026-07-22 12:20:23 +00:00
417 lines
41 KiB
JavaScript
417 lines
41 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: () => VaultExpoterPlugin
|
||
});
|
||
module.exports = __toCommonJS(main_exports);
|
||
var import_obsidian = require("obsidian");
|
||
|
||
// src/fseditor.ts
|
||
var FsEditor = class {
|
||
constructor(plugin) {
|
||
this.plugin = plugin;
|
||
this.fs = require("fs");
|
||
this.path = require("path");
|
||
}
|
||
get root() {
|
||
let a = this.plugin.app.vault.adapter;
|
||
return a.basePath.replace(/\\/g, "/");
|
||
}
|
||
abspath(tfile) {
|
||
if (tfile) {
|
||
return this.root + "/" + tfile.path;
|
||
} else {
|
||
return null;
|
||
}
|
||
}
|
||
isfile(path) {
|
||
return this.fs.existsSync(path) && this.fs.statSync(path).isFile();
|
||
}
|
||
isdir(path) {
|
||
return this.fs.existsSync(path) && this.fs.statSync(path).isDirectory();
|
||
}
|
||
first_valid_dir(paths) {
|
||
for (let path of paths) {
|
||
if (this.isdir(path)) {
|
||
return path;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
async select_valid_dir(paths) {
|
||
let xpaths = paths.filter((p) => this.isdir(p));
|
||
if (xpaths.length === 0) {
|
||
return null;
|
||
} else if (xpaths.length == 1) {
|
||
return xpaths[0];
|
||
} else {
|
||
let nc = this.plugin.app.plugins.getPlugin("note-chain");
|
||
if (nc) {
|
||
let path = await nc.chain.tp_suggester(xpaths, xpaths);
|
||
return path;
|
||
} else {
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
mkdirRecursiveSync(path) {
|
||
if (this.isdir(path)) {
|
||
return true;
|
||
}
|
||
const parent = this.path.dirname(path);
|
||
if (!this.isdir(parent)) {
|
||
this.mkdirRecursiveSync(parent);
|
||
}
|
||
this.fs.mkdirSync(path);
|
||
}
|
||
/**
|
||
* 附件 src 到 dst,不在 vault 中,需要绝对路径
|
||
* overwrite,复盖;mtime,新文件;
|
||
*/
|
||
copy_file_by_path(src, dst, mode = "pass>overwrite>mtime") {
|
||
const fs = this.fs;
|
||
mode = mode.split(">")[0];
|
||
if (!fs.existsSync(src)) {
|
||
return false;
|
||
}
|
||
if (fs.existsSync(dst)) {
|
||
if (mode === "overwrite") {
|
||
fs.unlinkSync(dst);
|
||
fs.copyFileSync(src, dst);
|
||
return true;
|
||
} else if (mode === "mtime") {
|
||
if (fs.statSync(dst).mtimeMs < fs.statSync(src).mtimeMs) {
|
||
fs.unlinkSync(dst);
|
||
fs.copyFileSync(src, dst);
|
||
return true;
|
||
}
|
||
}
|
||
} else {
|
||
fs.copyFileSync(src, dst);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
copy_tfile(tfile, dst, mode = "mtime") {
|
||
if (tfile) {
|
||
let src = this.abspath(tfile);
|
||
return src && this.copy_file_by_path(src, dst, mode);
|
||
}
|
||
return false;
|
||
}
|
||
mirror_tfile(tfile, vault_root, mode = "mtime", attachment = true, outlink = false) {
|
||
if (tfile) {
|
||
vault_root = vault_root.replace(/\\g/, "/");
|
||
let src = this.root + "/" + tfile.path;
|
||
let dst = vault_root + "/" + tfile.path;
|
||
this.mkdirRecursiveSync(this.path.dirname);
|
||
this.copy_file_by_path(src, dst, mode);
|
||
if (attachment) {
|
||
let nc = this.plugin.app.plugins.getPlugin("note-chain");
|
||
let tfiles = nc.chain.get_outlinks(tfile);
|
||
for (let t of tfiles) {
|
||
if (!(t.extension === "md")) {
|
||
this.mirror_tfile(t, vault_root, mode, false);
|
||
} else if (outlink) {
|
||
this.mirror_tfile(t, vault_root, mode, false);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
modify(path, callback, encoding = "utf8") {
|
||
const fs = this.fs;
|
||
if (!fs.existsSync(path)) {
|
||
return;
|
||
}
|
||
;
|
||
fs.readFile(
|
||
path,
|
||
encoding,
|
||
(err, data) => {
|
||
if (err) {
|
||
console.error("Error reading file:", err);
|
||
;
|
||
}
|
||
let rs = callback(path, data);
|
||
fs.writeFile(path, rs, encoding, (err2) => {
|
||
if (err2) {
|
||
console.error("Error writing file:", err2);
|
||
} else {
|
||
console.log("File content updated successfully.");
|
||
}
|
||
});
|
||
}
|
||
);
|
||
}
|
||
};
|
||
|
||
// src/strings.ts
|
||
var Strings = class {
|
||
constructor() {
|
||
let lang = window.localStorage.getItem("language");
|
||
if (lang) {
|
||
this.language = lang;
|
||
} else {
|
||
this.language = "en";
|
||
}
|
||
}
|
||
get cmd_export_current_note() {
|
||
if (this.language == "zh") {
|
||
return "\u5BFC\u51FA\u5F53\u524D\u7B14\u8BB0";
|
||
} else {
|
||
return "Export current note";
|
||
}
|
||
}
|
||
get cmd_set_vexporter() {
|
||
if (this.language == "zh") {
|
||
return "\u8BBE\u7F6E\u5BFC\u51FA\u7B14\u8BB0\u9009\u9879";
|
||
} else {
|
||
return "Set config to export note";
|
||
}
|
||
}
|
||
get cmd_export_plugin() {
|
||
if (this.language == "zh") {
|
||
return "\u5BFC\u51FA\u63D2\u4EF6";
|
||
} else {
|
||
return "Export plugin";
|
||
}
|
||
}
|
||
get prompt_path_of_folder() {
|
||
if (this.language == "zh") {
|
||
return "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84";
|
||
} else {
|
||
return "Input path of folder";
|
||
}
|
||
}
|
||
get notice_output() {
|
||
if (this.language == "zh") {
|
||
return "\u5BFC\u51FA\uFF1A";
|
||
} else {
|
||
return "Output:";
|
||
}
|
||
}
|
||
get notice_nosuchdir() {
|
||
if (this.language == "zh") {
|
||
return "\u65E0\u6548\u76EE\u5F55";
|
||
} else {
|
||
return "Invaid path.";
|
||
}
|
||
}
|
||
get setting_plugin_dir() {
|
||
if (this.language == "zh") {
|
||
return "\u63D2\u4EF6\u5BFC\u51FA\u76EE\u5F55";
|
||
} else {
|
||
return "Plugin dir To export";
|
||
}
|
||
}
|
||
};
|
||
var strings = new Strings();
|
||
|
||
// main.ts
|
||
var DEFAULT_SETTINGS = {
|
||
pluginDirExporter: ""
|
||
};
|
||
var cmd_export_current_note = (plugin) => ({
|
||
id: "cmd_export_current_note",
|
||
name: strings.cmd_export_current_note,
|
||
callback: async () => {
|
||
const nc = plugin.notechain;
|
||
let tfile = nc.chain.current_note;
|
||
await plugin.export_readme(tfile, null);
|
||
}
|
||
});
|
||
var cmd_set_vexporter = (plugin) => ({
|
||
id: "cmd_set_vexporter",
|
||
name: strings.cmd_set_vexporter,
|
||
callback: async () => {
|
||
const nc = plugin.notechain;
|
||
let dir = await nc.chain.tp_prompt(strings.prompt_path_of_folder);
|
||
let item = {};
|
||
if (plugin.fsEditor.fs.existsSync(dir)) {
|
||
item["Dir"] = dir;
|
||
}
|
||
item["Name"] = "readMe";
|
||
item["Assets"] = "./assets";
|
||
item["RemoveMeta"] = true;
|
||
item["UseGitLink"] = true;
|
||
await nc.editor.set_frontmatter(
|
||
nc.chain.current_note,
|
||
"vexporter",
|
||
item
|
||
);
|
||
}
|
||
});
|
||
var cmd_export_plugin = (plugin) => ({
|
||
id: "cmd_export_plugin",
|
||
name: strings.cmd_export_plugin,
|
||
callback: async () => {
|
||
const nc = plugin.notechain;
|
||
let plugins = Object.keys(plugin.app.plugins.plugins);
|
||
let p = await nc.chain.tp_suggester(plugins, plugins);
|
||
let eplugin = plugin.app.plugins.getPlugin(p);
|
||
if (eplugin) {
|
||
let target = await plugin.fsEditor.select_valid_dir(
|
||
plugin.settings.pluginDirExporter.split("\n")
|
||
);
|
||
if (!plugin.fsEditor.fs.existsSync(target)) {
|
||
target = await nc.chain.tp_prompt(strings.prompt_path_of_folder);
|
||
}
|
||
target = target.replace(/\\/g, "/");
|
||
if (!target.endsWith("/" + p)) {
|
||
target = target + "/" + p;
|
||
}
|
||
if (!plugin.fsEditor.fs.existsSync(target)) {
|
||
plugin.fsEditor.fs.mkdirSync(target);
|
||
}
|
||
let items = ["main.js", "manifest.json", "styles.css", "data.json"];
|
||
for (let item of items) {
|
||
let src = `${plugin.fsEditor.root}/${eplugin.manifest.dir}/${item}`;
|
||
let dst = `${target}/${item}`;
|
||
plugin.fsEditor.copy_file_by_path(src, dst, "overwrite");
|
||
new import_obsidian.Notice(`${strings.notice_output}${p}/${item}`, 3e3);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
var commandBuilders = [
|
||
cmd_export_current_note,
|
||
cmd_set_vexporter,
|
||
cmd_export_plugin
|
||
];
|
||
function addCommands(plugin) {
|
||
commandBuilders.forEach((c) => {
|
||
plugin.addCommand(c(plugin));
|
||
});
|
||
}
|
||
var VaultExpoterPlugin = class extends import_obsidian.Plugin {
|
||
async onload() {
|
||
await this.loadSettings();
|
||
this.fsEditor = new FsEditor(this);
|
||
this.addSettingTab(new VExporterSettingTab(this.app, this));
|
||
addCommands(this);
|
||
}
|
||
onunload() {
|
||
}
|
||
get notechain() {
|
||
return this.app.plugins.getPlugin("note-chain");
|
||
}
|
||
async loadSettings() {
|
||
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
||
}
|
||
async saveSettings() {
|
||
await this.saveData(this.settings);
|
||
}
|
||
async export_readme(tfile, dst) {
|
||
var _a, _b, _c, _d;
|
||
let nc = this.app.plugins.getPlugin("note-chain");
|
||
if (!tfile) {
|
||
tfile = nc.chain.current_note;
|
||
}
|
||
if (!dst) {
|
||
dst = (_a = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _a.Dir;
|
||
if (!dst) {
|
||
dst = await nc.chain.tp_prompt("Path of LocalGitProject");
|
||
}
|
||
}
|
||
if (!dst || !this.fsEditor.fs.existsSync(dst)) {
|
||
new import_obsidian.Notice(strings.notice_nosuchdir, 3e3);
|
||
return;
|
||
}
|
||
dst = dst.replace(/\\/g, "/");
|
||
let tmp;
|
||
let name = (_b = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _b.Name;
|
||
if (name && !(name === "")) {
|
||
tmp = dst + "/" + name + ".md";
|
||
} else {
|
||
tmp = dst + "/" + tfile.basename + ".md";
|
||
}
|
||
if (this.fsEditor.copy_tfile(tfile, tmp)) {
|
||
if ((_c = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _c.RemoveMeta) {
|
||
const ufunc = (path, data) => {
|
||
var _a2, _b2;
|
||
let res = data;
|
||
if ((_a2 = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _a2.RemoveMeta) {
|
||
res = res.replace(
|
||
/---[\n(\r\n)][\s\S]*?---[\n(\r\n)]/,
|
||
""
|
||
);
|
||
}
|
||
if (((_b2 = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _b2.UseGitLink) && assets) {
|
||
res = res.replace(
|
||
/\!\[\[(.*?)\]\]/g,
|
||
(match, name2) => {
|
||
return ``;
|
||
}
|
||
);
|
||
}
|
||
return res;
|
||
};
|
||
await this.fsEditor.modify(tmp, ufunc);
|
||
}
|
||
}
|
||
let assets = (_d = nc.editor.get_frontmatter(tfile, "vexporter")) == null ? void 0 : _d.Assets;
|
||
if (assets) {
|
||
let olinks = nc.chain.get_outlinks(tfile);
|
||
let adir = dst + "/" + assets;
|
||
this.fsEditor.mkdirRecursiveSync(adir);
|
||
for (let f of olinks) {
|
||
if (!(f.extension === "md")) {
|
||
this.fsEditor.copy_tfile(f, adir + "/" + f.basename + "." + f.extension);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
var VExporterSettingTab = class extends import_obsidian.PluginSettingTab {
|
||
constructor(app, plugin) {
|
||
super(app, plugin);
|
||
this.plugin = plugin;
|
||
}
|
||
getSettingValue(field) {
|
||
return this.plugin.settings[field];
|
||
}
|
||
add_toggle(name, desc, field) {
|
||
const { containerEl } = this;
|
||
let value = this.plugin.settings[field];
|
||
let item = new import_obsidian.Setting(containerEl).setName(name).setDesc(desc).addToggle(
|
||
(text) => text.setValue(value).onChange(async (value2) => {
|
||
this.plugin.settings[field] = value2;
|
||
await this.plugin.saveSettings();
|
||
})
|
||
);
|
||
return item;
|
||
}
|
||
display() {
|
||
const { containerEl } = this;
|
||
containerEl.empty();
|
||
new import_obsidian.Setting(containerEl).setName(strings.setting_plugin_dir).addTextArea((text) => text.setValue(this.plugin.settings.pluginDirExporter).onChange(async (value) => {
|
||
this.plugin.settings.pluginDirExporter = value;
|
||
await this.plugin.saveSettings();
|
||
}));
|
||
}
|
||
};
|
||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCAqIGFzIE1vZHVsZSBmcm9tICdtb2R1bGUnO1xyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IHsgRnNFZGl0b3IgfSBmcm9tICdzcmMvZnNlZGl0b3InO1xyXG5pbXBvcnQgeyBzdHJpbmdzIH0gZnJvbSAnc3JjL3N0cmluZ3MnO1xyXG5cclxuaW50ZXJmYWNlIFZFeHBvcnRlclNldHRpbmdzIHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjpzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFZFeHBvcnRlclNldHRpbmdzID0ge1xyXG5cdHBsdWdpbkRpckV4cG9ydGVyOicnXHJcbn1cclxuXHJcblxyXG5jb25zdCBjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSA9IChwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSA9PiAoe1xyXG5cdGlkOiAnY21kX2V4cG9ydF9jdXJyZW50X25vdGUnLFxyXG5cdG5hbWU6IHN0cmluZ3MuY21kX2V4cG9ydF9jdXJyZW50X25vdGUsXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdGxldCB0ZmlsZSA9IG5jLmNoYWluLmN1cnJlbnRfbm90ZTtcclxuXHRcdGF3YWl0IHBsdWdpbi5leHBvcnRfcmVhZG1lKHRmaWxlLG51bGwpO1xyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjbWRfc2V0X3ZleHBvcnRlciA9IChwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSA9PiAoe1xyXG5cdGlkOiAnY21kX3NldF92ZXhwb3J0ZXInLFxyXG5cdG5hbWU6IHN0cmluZ3MuY21kX3NldF92ZXhwb3J0ZXIsXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdGxldCBkaXIgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQoc3RyaW5ncy5wcm9tcHRfcGF0aF9vZl9mb2xkZXIpO1xyXG5cdFx0bGV0IGl0ZW06IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHRcdGlmKHBsdWdpbi5mc0VkaXRvci5mcy5leGlzdHNTeW5jKGRpcikpe1xyXG5cdFx0XHRpdGVtWydEaXInXSA9IGRpcjtcclxuXHRcdH1cclxuXHRcdGl0ZW1bJ05hbWUnXSA9ICdyZWFkTWUnO1xyXG5cdFx0aXRlbVsnQXNzZXRzJ10gPSAnLi9hc3NldHMnO1xyXG5cdFx0aXRlbVsnUmVtb3ZlTWV0YSddID0gdHJ1ZTtcclxuXHRcdGl0ZW1bJ1VzZUdpdExpbmsnXSA9IHRydWU7XHJcblxyXG5cdFx0YXdhaXQgbmMuZWRpdG9yLnNldF9mcm9udG1hdHRlcihcclxuXHRcdFx0bmMuY2hhaW4uY3VycmVudF9ub3RlLFxyXG5cdFx0XHQndmV4cG9ydGVyJyxcclxuXHRcdFx0aXRlbVxyXG5cdFx0KVxyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjbWRfZXhwb3J0X3BsdWdpbiA9IChwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSA9PiAoe1xyXG5cdGlkOiAnY21kX2V4cG9ydF9wbHVnaW4nLFxyXG5cdG5hbWU6IHN0cmluZ3MuY21kX2V4cG9ydF9wbHVnaW4sXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdFxyXG5cdFx0bGV0IHBsdWdpbnMgPSBPYmplY3Qua2V5cygocGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMucGx1Z2lucyk7XHJcblx0XHRsZXQgcCA9IGF3YWl0IG5jLmNoYWluLnRwX3N1Z2dlc3RlcihwbHVnaW5zLHBsdWdpbnMpO1xyXG5cdFx0bGV0IGVwbHVnaW4gPSAocGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKHApO1xyXG5cdFx0aWYoZXBsdWdpbil7XHJcblx0XHRcdGxldCB0YXJnZXQgPSBhd2FpdCBwbHVnaW4uZnNFZGl0b3Iuc2VsZWN0X3ZhbGlkX2RpcihcclxuXHRcdFx0XHRwbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0KVxyXG5cdFx0XHRpZighcGx1Z2luLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmModGFyZ2V0KSl7XHJcblx0XHRcdFx0dGFyZ2V0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KHN0cmluZ3MucHJvbXB0X3BhdGhfb2ZfZm9sZGVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0YXJnZXQgPSB0YXJnZXQucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGlmKCF0YXJnZXQuZW5kc1dpdGgoJy8nICsgcCkpe1xyXG5cdFx0XHRcdHRhcmdldCA9IHRhcmdldCArICcvJyArIHA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIXBsdWdpbi5mc0VkaXRvci5mcy5leGlzdHNTeW5jKHRhcmdldCkpe1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5mcy5ta2RpclN5bmModGFyZ2V0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgaXRlbXMgPSBbJ21haW4uanMnLCdtYW5pZmVzdC5qc29uJywnc3R5bGVzLmNzcycsJ2RhdGEuanNvbiddO1xyXG5cdFx0XHRmb3IobGV0IGl0ZW0gb2YgaXRlbXMpe1xyXG5cdFx0XHRcdGxldCBzcmMgPSBgJHtwbHVnaW4uZnNFZGl0b3Iucm9vdH0vJHtlcGx1Z2luLm1hbmlmZXN0LmRpcn0vJHtpdGVtfWA7XHJcblx0XHRcdFx0bGV0IGRzdCA9IGAke3RhcmdldH0vJHtpdGVtfWA7XHJcblx0XHRcdFx0cGx1Z2luLmZzRWRpdG9yLmNvcHlfZmlsZV9ieV9wYXRoKHNyYyxkc3QsJ292ZXJ3cml0ZScpO1xyXG5cdFx0XHRcdG5ldyBOb3RpY2UoYCR7c3RyaW5ncy5ub3RpY2Vfb3V0cHV0fSR7cH0vJHtpdGVtfWAsMzAwMCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY29tbWFuZEJ1aWxkZXJzID0gW1xyXG5cdGNtZF9leHBvcnRfY3VycmVudF9ub3RlLFxyXG5cdGNtZF9zZXRfdmV4cG9ydGVyLFxyXG5cdGNtZF9leHBvcnRfcGx1Z2luXHJcbl07XHJcblxyXG5mdW5jdGlvbiBhZGRDb21tYW5kcyhwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSB7XHJcbiAgICBjb21tYW5kQnVpbGRlcnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKGMocGx1Z2luKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5mc0VkaXRvciA9IG5ldyBGc0VkaXRvcih0aGlzKTtcclxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFZFeHBvcnRlclNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHRcdGFkZENvbW1hbmRzKHRoaXMpO1xyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0IG5vdGVjaGFpbigpe1xyXG5cdFx0cmV0dXJuICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cdFxyXG5cdGFzeW5jIGV4cG9ydF9yZWFkbWUodGZpbGU6VEZpbGUsZHN0OnN0cmluZ3xudWxsKXtcclxuXHRcdGxldCBuYyA9ICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0XHRpZighdGZpbGUpe3RmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO31cclxuXHRcdFxyXG5cdFx0Ly8gXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU3NkVFXHU1RjU1XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkRpcjtcclxuXHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KCdQYXRoIG9mIExvY2FsR2l0UHJvamVjdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZighZHN0IHx8ICF0aGlzLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcblx0XHRcdG5ldyBOb3RpY2Uoc3RyaW5ncy5ub3RpY2Vfbm9zdWNoZGlyLDMwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRkc3QgPSBkc3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcclxuXHRcdFxyXG5cdFx0Ly8gXHU1QkZDXHU1MUZBXHU1RjUzXHU1MjREXHU3QjE0XHU4QkIwXHJcblx0XHRsZXQgdG1wO1xyXG5cdFx0bGV0IG5hbWUgPSBuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uTmFtZTtcclxuXHRcdGlmKG5hbWUgJiYgIShuYW1lPT09JycpKXtcclxuXHRcdFx0dG1wID0gZHN0KycvJytuYW1lKycubWQnO1xyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRtcCA9IGRzdCsnLycrdGZpbGUuYmFzZW5hbWUrJy5tZCc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5mc0VkaXRvci5jb3B5X3RmaWxlKHRmaWxlLHRtcCkpe1xyXG5cdFx0XHRpZihuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uUmVtb3ZlTWV0YSl7XHJcblx0XHRcdFx0Y29uc3QgdWZ1bmMgPSAocGF0aDpzdHJpbmcsZGF0YTpzdHJpbmcpPT57XHJcblx0XHRcdFx0XHRsZXQgcmVzID0gZGF0YTtcclxuXHRcdFx0XHRcdGlmKG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5SZW1vdmVNZXRhKXtcclxuXHRcdFx0XHRcdFx0cmVzID0gcmVzLnJlcGxhY2UoXHJcblx0XHRcdFx0XHRcdFx0Ly0tLVtcXG4oXFxyXFxuKV1bXFxzXFxTXSo/LS0tW1xcbihcXHJcXG4pXS8sXHJcblx0XHRcdFx0XHRcdFx0JydcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYobmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LlVzZUdpdExpbmsgJiYgYXNzZXRzKXtcclxuXHRcdFx0XHRcdFx0cmVzID0gcmVzLnJlcGxhY2UoXHJcblx0XHRcdFx0XHRcdFx0L1xcIVxcW1xcWyguKj8pXFxdXFxdL2csXHJcblx0XHRcdFx0XHRcdFx0KG1hdGNoOmFueSwgbmFtZTpzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBgIVske25hbWV9XSgke2Fzc2V0c30vJHtuYW1lfSlgO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRhd2FpdCB0aGlzLmZzRWRpdG9yLm1vZGlmeSh0bXAsdWZ1bmMpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvLyBcdTVCRkNcdTUxRkFcdTk2NDRcdTRFRjZcclxuXHRcdGxldCBhc3NldHMgPSBuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uQXNzZXRzO1xyXG5cdFx0aWYoYXNzZXRzKXtcclxuXHRcdFx0bGV0IG9saW5rcyA9IG5jLmNoYWluLmdldF9vdXRsaW5rcyh0ZmlsZSk7XHJcblx0XHRcdGxldCBhZGlyID0gZHN0KycvJythc3NldHM7XHJcblx0XHRcdHRoaXMuZnNFZGl0b3IubWtkaXJSZWN1cnNpdmVTeW5jKGFkaXIpO1xyXG5cdFx0XHRmb3IobGV0IGYgb2Ygb2xpbmtzKXtcclxuXHRcdFx0XHRpZighKGYuZXh0ZW5zaW9uPT09J21kJykpe1xyXG5cdFx0XHRcdFx0dGhpcy5mc0VkaXRvci5jb3B5X3RmaWxlKGYsYWRpcisnLycrZi5iYXNlbmFtZSsnLicrZi5leHRlbnNpb24pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuY2xhc3MgVkV4cG9ydGVyU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVmF1bHRFeHBvdGVyUGx1Z2luO1xyXG5cdFxyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBWYXVsdEV4cG90ZXJQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0Z2V0U2V0dGluZ1ZhbHVlKGZpZWxkOiBrZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncykge1xyXG5cdFx0cmV0dXJuIHRoaXMucGx1Z2luLnNldHRpbmdzW2ZpZWxkXTtcclxuXHR9XHJcblxyXG5cdGFkZF90b2dnbGUobmFtZTpzdHJpbmcsZGVzYzpzdHJpbmcsZmllbGQ6a2V5b2YgVkV4cG9ydGVyU2V0dGluZ3Mpe1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblx0XHRsZXQgdmFsdWUgPSAodGhpcy5wbHVnaW4uc2V0dGluZ3MgYXMgYW55KVtmaWVsZF0gYXMgYm9vbGVhbjtcclxuXHRcdGxldCBpdGVtID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpICBcclxuXHRcdFx0LnNldE5hbWUobmFtZSlcclxuXHRcdFx0LnNldERlc2MoZGVzYylcclxuXHRcdFx0LmFkZFRvZ2dsZSh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodmFsdWUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTpuZXZlcikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdFx0cmV0dXJuIGl0ZW07XHJcblx0fVxyXG5cclxuXHRkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKHN0cmluZ3Muc2V0dGluZ19wbHVnaW5fZGlyKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0fVxyXG59XHJcbiIsICJcclxuaW1wb3J0IHsgQXBwLCBFZGl0b3IsIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmV4cG9ydCBjbGFzcyBGc0VkaXRvcntcclxuICAgIGZzO1xyXG4gICAgcGF0aDtcclxuICAgIHBsdWdpbiA6UGx1Z2luO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjpQbHVnaW4pe1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgICAgIHRoaXMuZnMgPSByZXF1aXJlKCdmcycpO1xyXG4gICAgICAgIHRoaXMucGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpe1xyXG4gICAgICAgIGxldCBhID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIgYXMgYW55O1xyXG4gICAgICAgIHJldHVybiBhLmJhc2VQYXRoLnJlcGxhY2UoL1xcXFwvZywnLycpO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3BhdGgodGZpbGU6VEZpbGUpe1xyXG5cdFx0aWYodGZpbGUpe1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5yb290KycvJyt0ZmlsZS5wYXRoO1xyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbiAgICBpc2ZpbGUocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmMocGF0aCkgJiYgdGhpcy5mcy5zdGF0U3luYyhwYXRoKS5pc0ZpbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc2RpcihwYXRoOnN0cmluZyl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzU3luYyhwYXRoKSAmJiB0aGlzLmZzLnN0YXRTeW5jKHBhdGgpLmlzRGlyZWN0b3J5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz4pe1xyXG4gICAgICAgIGZvcihsZXQgcGF0aCBvZiBwYXRocyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aCkpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0X3ZhbGlkX2RpcihwYXRoczpBcnJheTxzdHJpbmc+KXtcclxuICAgICAgICBsZXQgeHBhdGhzID0gcGF0aHMuZmlsdGVyKChwOnN0cmluZyk9PnRoaXMuaXNkaXIocCkpO1xyXG4gICAgICAgIGlmKHhwYXRocy5sZW5ndGg9PT0wKXtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfWVsc2UgaWYoeHBhdGhzLmxlbmd0aD09MSl7XHJcbiAgICAgICAgICAgIHJldHVybiB4cGF0aHNbMF07XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgICAgICBpZihuYyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IGF3YWl0IG5jLmNoYWluLnRwX3N1Z2dlc3Rlcih4cGF0aHMseHBhdGhzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgbWtkaXJSZWN1cnNpdmVTeW5jKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICBpZih0aGlzLmlzZGlyKHBhdGgpKXtyZXR1cm4gdHJ1ZTt9XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXRoLmRpcm5hbWUocGF0aCk7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNkaXIocGFyZW50KSl7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJSZWN1cnNpdmVTeW5jKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnMubWtkaXJTeW5jKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCogXHU5NjQ0XHU0RUY2IHNyYyBcdTUyMzAgZHN0XHVGRjBDXHU0RTBEXHU1NzI4IHZhdWx0IFx1NEUyRFx1RkYwQ1x1OTcwMFx1ODk4MVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxyXG5cdCogb3ZlcndyaXRlXHVGRjBDXHU1OTBEXHU3NkQ2XHVGRjFCbXRpbWVcdUZGMENcdTY1QjBcdTY1ODdcdTRFRjZcdUZGMUJcclxuXHQqL1xyXG4gICAgY29weV9maWxlX2J5X3BhdGgoc3JjOnN0cmluZyxkc3Q6c3RyaW5nLG1vZGU9J3Bhc3M+b3ZlcndyaXRlPm10aW1lJykge1xyXG4gICAgICAgIGNvbnN0IGZzID0gdGhpcy5mcztcclxuXHJcbiAgICAgICAgbW9kZSA9IG1vZGUuc3BsaXQoJz4nKVswXVxyXG4gICAgICAgIGlmKCFmcy5leGlzdHNTeW5jKHNyYykpe1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcbiAgICAgICAgICAgIGlmKG1vZGU9PT0nb3ZlcndyaXRlJyl7XHJcbiAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGRzdCk7XHJcbiAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYobW9kZT09PSdtdGltZScpe1xyXG4gICAgICAgICAgICAgICAgLy8gZHN0IFx1NjZGNFx1NjVCMFx1NjVGNlx1OTVGNFx1NUMwRlx1NEU4RSBzcmNcclxuICAgICAgICAgICAgICAgIGlmKGZzLnN0YXRTeW5jKGRzdCkubXRpbWVNczxmcy5zdGF0U3luYyhzcmMpLm10aW1lTXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZHN0KTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyYyxkc3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcHlfdGZpbGUodGZpbGU6VEZpbGUsIGRzdDpzdHJpbmcsbW9kZT0nbXRpbWUnKSB7XHJcblx0XHRpZih0ZmlsZSl7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLmFic3BhdGgodGZpbGUpO1xyXG4gICAgICAgIFxyXG5cdFx0XHRyZXR1cm4gc3JjICYmIHRoaXMuY29weV9maWxlX2J5X3BhdGgoc3JjLGRzdCxtb2RlKTtcclxuXHRcdH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuICAgIG1pcnJvcl90ZmlsZSh0ZmlsZTpURmlsZSx2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Upe1xyXG4gICAgICAgIC8vIFx1NUMwNlx1N0IxNFx1OEJCMFx1OTU1Q1x1NTBDRlx1NzlGQlx1NTJBOFx1NTIzMFx1NTIyQlx1NzY4NFx1NUU5M1x1NEUyRFx1RkYwQ1x1NjU4N1x1NEVGNlx1N0VEM1x1Njc4NFx1NEUwRVx1NUY1M1x1NTI0RFx1NUU5M1x1NzZGOFx1NTQwQ1xyXG4gICAgICAgIGlmKHRmaWxlKXtcclxuICAgICAgICAgICAgdmF1bHRfcm9vdCA9IHZhdWx0X3Jvb3QucmVwbGFjZSgvXFxcXGcvLCcvJyk7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLnJvb3QgKyAnLycgKyB0ZmlsZS5wYXRoO1xyXG4gICAgICAgICAgICBsZXQgZHN0ID0gdmF1bHRfcm9vdCsnLycrdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgdGhpcy5ta2RpclJlY3Vyc2l2ZVN5bmModGhpcy5wYXRoLmRpcm5hbWUpO1xyXG5cdFx0XHR0aGlzLmNvcHlfZmlsZV9ieV9wYXRoKHNyYyxkc3QsbW9kZSk7XHJcbiAgICAgICAgICAgIGlmKGF0dGFjaG1lbnQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5jID0gKHRoaXMucGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGZpbGVzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlKTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdCBvZiB0ZmlsZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEodC5leHRlbnNpb249PT0nbWQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvdXRsaW5rKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmeShwYXRoOnN0cmluZyxjYWxsYmFjazpGdW5jdGlvbixlbmNvZGluZz0ndXRmOCcpe1xyXG4gICAgICAgIGNvbnN0IGZzID0gdGhpcy5mcztcclxuICAgICAgICBpZighZnMuZXhpc3RzU3luYyhwYXRoKSl7cmV0dXJufTtcclxuXHJcbiAgICAgICAgZnMucmVhZEZpbGUocGF0aCwgZW5jb2RpbmcsIChlcnI6RXJyb3IsIGRhdGE6c3RyaW5nKSA9PiB7XHJcblx0XHRcdGlmKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWFkaW5nIGZpbGU6JywgZXJyKTs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJzID0gY2FsbGJhY2socGF0aCxkYXRhKTtcclxuXHRcdFx0ZnMud3JpdGVGaWxlKHBhdGgsIHJzLCBlbmNvZGluZywgKGVycjpFcnJvcikgPT4ge1xyXG5cdFx0XHQgIGlmIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciB3cml0aW5nIGZpbGU6JywgZXJyKTtcclxuXHRcdFx0ICB9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdGaWxlIGNvbnRlbnQgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcblx0XHRcdCAgfVxyXG5cdFx0XHR9KTtcclxuXHRcdCAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwgIlxyXG5jbGFzcyBTdHJpbmdze1xyXG4gICAgbGFuZ3VhZ2U6c3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBsZXQgbGFuZyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKTtcclxuICAgICAgICBpZihsYW5nKXtcclxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSAnZW4nO1xyXG4gICAgICAgIH1cclxuXHR9XHJcblxyXG4gICAgZ2V0IGNtZF9leHBvcnRfY3VycmVudF9ub3RlKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1QkZDXHU1MUZBXHU1RjUzXHU1MjREXHU3QjE0XHU4QkIwJ1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ0V4cG9ydCBjdXJyZW50IG5vdGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX3NldF92ZXhwb3J0ZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThCQkVcdTdGNkVcdTVCRkNcdTUxRkFcdTdCMTRcdThCQjBcdTkwMDlcdTk4NzknXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnU2V0IGNvbmZpZyB0byBleHBvcnQgbm90ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X3BsdWdpbigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1NjNEMlx1NEVGNidcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdFeHBvcnQgcGx1Z2luJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21wdF9wYXRoX29mX2ZvbGRlcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1OEY5M1x1NTE2NVx1NjU4N1x1NEVGNlx1NTkzOVx1OERFRlx1NUY4NCdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdJbnB1dCBwYXRoIG9mIGZvbGRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3RpY2Vfb3V0cHV0KCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1QkZDXHU1MUZBXHVGRjFBJ1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ091dHB1dDonO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBub3RpY2Vfbm9zdWNoZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU2NUUwXHU2NTQ4XHU3NkVFXHU1RjU1J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ0ludmFpZCBwYXRoLic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nX3BsdWdpbl9kaXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTYzRDJcdTRFRjZcdTVCRkNcdTUxRkFcdTc2RUVcdTVGNTUnO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1BsdWdpbiBkaXIgVG8gZXhwb3J0JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgc3RyaW5ncyA9IG5ldyBTdHJpbmdzKCk7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLHNCQUFtRzs7O0FDRTVGLElBQU0sV0FBTixNQUFjO0FBQUEsRUFLakIsWUFBWSxRQUFjO0FBQ3RCLFNBQUssU0FBUztBQUNkLFNBQUssS0FBSyxRQUFRLElBQUk7QUFDdEIsU0FBSyxPQUFPLFFBQVEsTUFBTTtBQUFBLEVBQzlC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
|