From 3520551e5e5c2ee0caf9a777c8342859d1d401f0 Mon Sep 17 00:00:00 2001 From: iLiftALot Date: Wed, 13 Nov 2024 01:25:02 -0500 Subject: [PATCH] Working on workflow... --- esbuild.config.mjs | 29 +--- main.js | 420 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 3 files changed, 427 insertions(+), 24 deletions(-) mode change 120000 => 100644 main.js diff --git a/esbuild.config.mjs b/esbuild.config.mjs index b913973..6dc3332 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -8,9 +8,7 @@ import { existsSync, writeFileSync, readFileSync, - symlinkSync, - unlinkSync, - lstatSync + copyFileSync } from "fs"; const banner = @@ -155,25 +153,12 @@ const context = await esbuild.context({ }) try { - if (existsSync(targetPath)) { - try { - const stat = lstatSync(targetPath); - if (stat.isDirectory()) { - // Remove directory - rmSync(targetPath, { recursive: true, force: true }); - logs.push(`Removed existing directory at ${targetPath}`); - } else { - // Remove file or symlink - unlinkSync(targetPath); - logs.push(`Removed existing file/symlink at ${targetPath}`); - } - } catch (unlinkError) { - console.error(`Error removing existing file/symlink: ${unlinkError}\nLogs:\n${logs.join('\n')}`); - process.exit(1); - } - } - symlinkSync(sourcePath, targetPath); - logs.push(`Symlink created: ${targetPath} -> ${sourcePath}`); + //symlinkSync(sourcePath, targetPath); + //logs.push(`Symlink created: ${targetPath} -> ${sourcePath}`); + + // Copy the file instead of creating a symlink + copyFileSync(sourcePath, targetPath); + logs.push(`Copied file: ${sourcePath} -> ${targetPath}`); } catch (error) { console.error(`Error creating symlink: ${error}\nLogs:\n${logs.join('\n')}`); process.exit(1); diff --git a/main.js b/main.js deleted file mode 120000 index e7b54cf..0000000 --- a/main.js +++ /dev/null @@ -1 +0,0 @@ -/Users/nicholascorbin/Desktop/Knowledge/MyObsidian/ObsidianBackup/My Sync/.obsidian/plugins/insta-toc/dist/dev/main.js \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..8aca44d --- /dev/null +++ b/main.js @@ -0,0 +1,419 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => InstaTocPlugin +}); +module.exports = __toCommonJS(main_exports); + +// +var define_Process_env_default = { envPath: "/Users/nicholascorbin/Desktop/Knowledge/MyObsidian/ObsidianBackup/My Sync/.env", pluginRoot: "/Users/nicholascorbin/Desktop/Knowledge/MyObsidian/ObsidianBackup/My Sync/.obsidian/plugins/insta-toc", pluginManifest: { id: "insta-toc", name: "Insta TOC", version: "2.0.2", minAppVersion: "0.15.0", description: "Simultaneously generate, update, and maintain a table of contents for your notes.", author: "Nick C.", autherUrl: "https://github.com/iLiftALot/insta-toc", isDesktopOnly: false }, pluginSettingsPath: "/Users/nicholascorbin/Desktop/Knowledge/MyObsidian/ObsidianBackup/My Sync/.obsidian/plugins/insta-toc/data.json", pluginSettings: {}, projectRoot: "/Users/nicholascorbin/Desktop/Knowledge/MyObsidian/ObsidianBackup/My Sync/.obsidian/plugins/insta-toc", vaultRoot: "/Users/nicholascorbin/Desktop/Knowledge/MyObsidian/ObsidianBackup/My Sync", vaultName: "My Sync" }; + +// src/main.ts +var import_obsidian2 = require("obsidian"); + +// src/Settings.ts +var DEFAULT_SETTINGS = { + tocString: `> [!SUMMARY] Table of Contents`, + shouldGenToc: false +}; + +// src/SettingsTab.ts +var import_obsidian = require("obsidian"); +var SettingTab = class extends import_obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + new import_obsidian.Setting(containerEl).setName("Setting #1").setDesc("It's a secret").addText((text) => text.setPlaceholder("Enter your secret").setValue(this.plugin.settings.tocString).onChange(async (value) => { + this.plugin.settings.tocString = value; + await this.plugin.saveSettings(); + })); + new import_obsidian.Setting(containerEl).setName("TOC Files").setDesc("Insert files to automatically ").addText((text) => text.setPlaceholder("Enter your secret").setValue(this.plugin.settings.tocString).onChange(async (value) => { + this.plugin.settings.tocString = value; + await this.plugin.saveSettings(); + })); + } +}; + +// node_modules/deepmerge-ts/dist/index.mjs +var actions = { + defaultMerge: Symbol("deepmerge-ts: default merge"), + skip: Symbol("deepmerge-ts: skip") +}; +var actionsInto = { + defaultMerge: actions.defaultMerge +}; +function defaultMetaDataUpdater(previousMeta, metaMeta) { + return metaMeta; +} +function defaultFilterValues(values, meta) { + return values.filter((value) => value !== void 0); +} +var ObjectType; +(function(ObjectType2) { + ObjectType2[ObjectType2["NOT"] = 0] = "NOT"; + ObjectType2[ObjectType2["RECORD"] = 1] = "RECORD"; + ObjectType2[ObjectType2["ARRAY"] = 2] = "ARRAY"; + ObjectType2[ObjectType2["SET"] = 3] = "SET"; + ObjectType2[ObjectType2["MAP"] = 4] = "MAP"; + ObjectType2[ObjectType2["OTHER"] = 5] = "OTHER"; +})(ObjectType || (ObjectType = {})); +function getObjectType(object) { + if (typeof object !== "object" || object === null) { + return 0; + } + if (Array.isArray(object)) { + return 2; + } + if (isRecord(object)) { + return 1; + } + if (object instanceof Set) { + return 3; + } + if (object instanceof Map) { + return 4; + } + return 5; +} +function getKeys(objects) { + const keys = /* @__PURE__ */ new Set(); + for (const object of objects) { + for (const key of [...Object.keys(object), ...Object.getOwnPropertySymbols(object)]) { + keys.add(key); + } + } + return keys; +} +function objectHasProperty(object, property) { + return typeof object === "object" && Object.prototype.propertyIsEnumerable.call(object, property); +} +function getIterableOfIterables(iterables) { + let m_iterablesIndex = 0; + let m_iterator = iterables[0]?.[Symbol.iterator](); + return { + [Symbol.iterator]() { + return { + next() { + do { + if (m_iterator === void 0) { + return { done: true, value: void 0 }; + } + const result = m_iterator.next(); + if (result.done === true) { + m_iterablesIndex += 1; + m_iterator = iterables[m_iterablesIndex]?.[Symbol.iterator](); + continue; + } + return { + done: false, + value: result.value + }; + } while (true); + } + }; + } + }; +} +var validRecordToStringValues = ["[object Object]", "[object Module]"]; +function isRecord(value) { + if (!validRecordToStringValues.includes(Object.prototype.toString.call(value))) { + return false; + } + const { constructor } = value; + if (constructor === void 0) { + return true; + } + const prototype = constructor.prototype; + if (prototype === null || typeof prototype !== "object" || !validRecordToStringValues.includes(Object.prototype.toString.call(prototype))) { + return false; + } + if (!prototype.hasOwnProperty("isPrototypeOf")) { + return false; + } + return true; +} +function mergeRecords$1(values, utils, meta) { + const result = {}; + for (const key of getKeys(values)) { + const propValues = []; + for (const value of values) { + if (objectHasProperty(value, key)) { + propValues.push(value[key]); + } + } + if (propValues.length === 0) { + continue; + } + const updatedMeta = utils.metaDataUpdater(meta, { + key, + parents: values + }); + const propertyResult = mergeUnknowns(propValues, utils, updatedMeta); + if (propertyResult === actions.skip) { + continue; + } + if (key === "__proto__") { + Object.defineProperty(result, key, { + value: propertyResult, + configurable: true, + enumerable: true, + writable: true + }); + } else { + result[key] = propertyResult; + } + } + return result; +} +function mergeArrays$1(values) { + return values.flat(); +} +function mergeSets$1(values) { + return new Set(getIterableOfIterables(values)); +} +function mergeMaps$1(values) { + return new Map(getIterableOfIterables(values)); +} +function mergeOthers$1(values) { + return values.at(-1); +} +var mergeFunctions = { + mergeRecords: mergeRecords$1, + mergeArrays: mergeArrays$1, + mergeSets: mergeSets$1, + mergeMaps: mergeMaps$1, + mergeOthers: mergeOthers$1 +}; +function deepmerge(...objects) { + return deepmergeCustom({})(...objects); +} +function deepmergeCustom(options, rootMetaData) { + const utils = getUtils(options, customizedDeepmerge); + function customizedDeepmerge(...objects) { + return mergeUnknowns(objects, utils, rootMetaData); + } + return customizedDeepmerge; +} +function getUtils(options, customizedDeepmerge) { + return { + defaultMergeFunctions: mergeFunctions, + mergeFunctions: { + ...mergeFunctions, + ...Object.fromEntries(Object.entries(options).filter(([key, option]) => Object.hasOwn(mergeFunctions, key)).map(([key, option]) => option === false ? [key, mergeFunctions.mergeOthers] : [key, option])) + }, + metaDataUpdater: options.metaDataUpdater ?? defaultMetaDataUpdater, + deepmerge: customizedDeepmerge, + useImplicitDefaultMerging: options.enableImplicitDefaultMerging ?? false, + filterValues: options.filterValues === false ? void 0 : options.filterValues ?? defaultFilterValues, + actions + }; +} +function mergeUnknowns(values, utils, meta) { + const filteredValues = utils.filterValues?.(values, meta) ?? values; + if (filteredValues.length === 0) { + return void 0; + } + if (filteredValues.length === 1) { + return mergeOthers(filteredValues, utils, meta); + } + const type = getObjectType(filteredValues[0]); + if (type !== 0 && type !== 5) { + for (let m_index = 1; m_index < filteredValues.length; m_index++) { + if (getObjectType(filteredValues[m_index]) === type) { + continue; + } + return mergeOthers(filteredValues, utils, meta); + } + } + switch (type) { + case 1: { + return mergeRecords(filteredValues, utils, meta); + } + case 2: { + return mergeArrays(filteredValues, utils, meta); + } + case 3: { + return mergeSets(filteredValues, utils, meta); + } + case 4: { + return mergeMaps(filteredValues, utils, meta); + } + default: { + return mergeOthers(filteredValues, utils, meta); + } + } +} +function mergeRecords(values, utils, meta) { + const result = utils.mergeFunctions.mergeRecords(values, utils, meta); + if (result === actions.defaultMerge || utils.useImplicitDefaultMerging && result === void 0 && utils.mergeFunctions.mergeRecords !== utils.defaultMergeFunctions.mergeRecords) { + return utils.defaultMergeFunctions.mergeRecords(values, utils, meta); + } + return result; +} +function mergeArrays(values, utils, meta) { + const result = utils.mergeFunctions.mergeArrays(values, utils, meta); + if (result === actions.defaultMerge || utils.useImplicitDefaultMerging && result === void 0 && utils.mergeFunctions.mergeArrays !== utils.defaultMergeFunctions.mergeArrays) { + return utils.defaultMergeFunctions.mergeArrays(values); + } + return result; +} +function mergeSets(values, utils, meta) { + const result = utils.mergeFunctions.mergeSets(values, utils, meta); + if (result === actions.defaultMerge || utils.useImplicitDefaultMerging && result === void 0 && utils.mergeFunctions.mergeSets !== utils.defaultMergeFunctions.mergeSets) { + return utils.defaultMergeFunctions.mergeSets(values); + } + return result; +} +function mergeMaps(values, utils, meta) { + const result = utils.mergeFunctions.mergeMaps(values, utils, meta); + if (result === actions.defaultMerge || utils.useImplicitDefaultMerging && result === void 0 && utils.mergeFunctions.mergeMaps !== utils.defaultMergeFunctions.mergeMaps) { + return utils.defaultMergeFunctions.mergeMaps(values); + } + return result; +} +function mergeOthers(values, utils, meta) { + const result = utils.mergeFunctions.mergeOthers(values, utils, meta); + if (result === actions.defaultMerge || utils.useImplicitDefaultMerging && result === void 0 && utils.mergeFunctions.mergeOthers !== utils.defaultMergeFunctions.mergeOthers) { + return utils.defaultMergeFunctions.mergeOthers(values); + } + return result; +} + +// typings/Utility.js +function debounce(func, wait) { + let timeout = null; + return function(...args) { + if (timeout !== null) { + clearTimeout(timeout); + } + timeout = window.setTimeout(() => { + func.apply(this, args); + timeout = null; + }, wait); + }; +} + +// src/main.ts +var InstaTocPlugin = class extends import_obsidian2.Plugin { + constructor(app, manifest) { + const mainManifest = manifest ?? define_Process_env_default.pluginManifest; + super(app, mainManifest); + this.app = app; + } + async onload() { + console.log("Loading Insta TOC Plugin"); + await this.loadSettings(); + this.addSettingTab(new SettingTab(this.app, this)); + this.registerMarkdownCodeBlockProcessor( + "insta-toc", + async (source, el, ctx) => { + const pathWithFileExtension = ctx.sourcePath; + const filePath = pathWithFileExtension.substring(0, pathWithFileExtension.lastIndexOf(".")); + const listRegex = /^(\s*)-\s*(.*)/; + const lines = source.split("\n"); + const processedSource = lines.map((line) => { + const match = line.match(listRegex); + if (!match) return line; + const [, indent, contentText] = match; + const navLink = `${filePath}#${contentText}`; + return `${indent}- [[${navLink}|${contentText}]]`; + }).join("\n"); + await import_obsidian2.MarkdownRenderer.render(this.app, processedSource, el, pathWithFileExtension, this); + } + ); + this.registerEvent( + this.app.vault.on( + "modify", + debounce(this.handleEditorChange.bind(this), 2e3) + ) + ); + } + onunload() { + console.log("Unloading Insta TOC Plugin"); + } + async loadSettings() { + let mergedSettings = DEFAULT_SETTINGS; + const settingsData = await this.loadData(); + if (settingsData) { + mergedSettings = deepmerge(DEFAULT_SETTINGS, settingsData); + } + this.settings = mergedSettings; + } + async saveSettings() { + await this.saveData(this.settings); + } + // Provides the insert location range for the new insta-toc codeblock + getTocInsertPosition(instaTocSection) { + const startLine = instaTocSection.position.start.line; + const startCh = 0; + const endLine = instaTocSection.position.end.line; + const endCh = instaTocSection.position.end.col; + const tocStartPos = { line: startLine, ch: startCh }; + const tocEndPos = { line: endLine, ch: endCh }; + return { from: tocStartPos, to: tocEndPos }; + } + // Generates a new insta-toc codeblock + generateToc(fileHeadings) { + const tocHeadingRefs = []; + if (fileHeadings.length > 0) { + fileHeadings.forEach((headingCache) => { + const headingLevel = headingCache.level; + const headingText = headingCache.heading; + const tocHeadingRef = `${" ".repeat((headingLevel - 1) * 4)}- ${headingText}`; + tocHeadingRefs.push(tocHeadingRef); + }); + } + const tocContent = tocHeadingRefs.join("\n"); + return `\`\`\`insta-toc +${tocContent} +\`\`\``; + } + // Dynamically update the TOC + updateAutoToc(editor, file) { + const fileCache = this.app.metadataCache.getFileCache(file); + const fileHeadings = fileCache?.headings ?? []; + const instaTocSection = fileCache?.sections ? fileCache.sections.find( + (section) => section.type === "code" && editor.getLine(section.position.start.line) === "```insta-toc" + ) : void 0; + if (!instaTocSection) return; + const tocInsertRange = this.getTocInsertPosition(instaTocSection); + const newTocBlock = this.generateToc(fileHeadings); + editor.replaceRange(newTocBlock, tocInsertRange.from, tocInsertRange.to); + } + // Main control method to handle all active file changes + async handleEditorChange() { + const activeEditor = this.app.workspace.activeEditor; + const editor = activeEditor?.editor; + const file = activeEditor?.file ?? void 0; + if (!activeEditor || !editor || !file) return; + if (editor) this.updateAutoToc(editor, file); + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21haW4udHMiLCAiPGRlZmluZTpQcm9jZXNzLmVudj4iLCAiLi4vLi4vc3JjL1NldHRpbmdzLnRzIiwgIi4uLy4uL3NyYy9TZXR0aW5nc1RhYi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZGVlcG1lcmdlLXRzL2Rpc3QvaW5kZXgubWpzIiwgIi4uLy4uL3R5cGluZ3MvVXRpbGl0eS5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtcblx0QXBwLFxuXHRDYWNoZWRNZXRhZGF0YSxcblx0RWRpdG9yLFxuXHRFZGl0b3JQb3NpdGlvbixcblx0RWRpdG9yUmFuZ2UsXG5cdEhlYWRpbmdDYWNoZSxcblx0TWFya2Rvd25GaWxlSW5mbyxcblx0TWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCxcblx0TWFya2Rvd25SZW5kZXJlcixcblx0UGx1Z2luLFxuXHRQbHVnaW5NYW5pZmVzdCxcblx0U2VjdGlvbkNhY2hlLFxuXHRURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBJbnN0YVRvY1NldHRpbmdzLCBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSAnLi9TZXR0aW5ncyc7XG5pbXBvcnQgeyBTZXR0aW5nVGFiIH0gZnJvbSAnLi9TZXR0aW5nc1RhYic7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdkZWVwbWVyZ2UtdHMnO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdVdGlsaXR5JztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnN0YVRvY1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHB1YmxpYyBhcHA6IEFwcDtcblx0cHVibGljIHNldHRpbmdzOiBJbnN0YVRvY1NldHRpbmdzO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBtYW5pZmVzdD86IFBsdWdpbk1hbmlmZXN0KSB7XG5cdFx0Y29uc3QgbWFpbk1hbmlmZXN0ID0gbWFuaWZlc3QgPz8gUHJvY2Vzcy5lbnYucGx1Z2luTWFuaWZlc3Q7XG5cdFx0c3VwZXIoYXBwLCBtYWluTWFuaWZlc3QpO1xuXHRcdHRoaXMuYXBwID0gYXBwO1xuXHR9XG5cblx0YXN5bmMgb25sb2FkKCkge1xuXHRcdGNvbnNvbGUubG9nKCdMb2FkaW5nIEluc3RhIFRPQyBQbHVnaW4nKTtcblxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0XHQvLyBDdXN0b20gY29kZWJsb2NrIHByb2Nlc3NvciBmb3IgdGhlIGluc3RhLXRvYyBjb2RlYmxvY2tcblx0XHR0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoXG5cdFx0XHRcImluc3RhLXRvY1wiLFxuXHRcdFx0YXN5bmMgKHNvdXJjZTogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQsIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRjb25zdCBwYXRoV2l0aEZpbGVFeHRlbnNpb246IHN0cmluZyA9IGN0eC5zb3VyY2VQYXRoOyAvLyBJbmNsdWRlcyAubWRcblx0XHRcdFx0Y29uc3QgZmlsZVBhdGg6IHN0cmluZyA9IHBhdGhXaXRoRmlsZUV4dGVuc2lvbi5zdWJzdHJpbmcoMCwgcGF0aFdpdGhGaWxlRXh0ZW5zaW9uLmxhc3RJbmRleE9mKFwiLlwiKSk7XG5cblx0XHRcdFx0Y29uc3QgbGlzdFJlZ2V4ID0gL14oXFxzKiktXFxzKiguKikvOyAvLyBSZWdleCB0byBtYXRjaCBsZWFkaW5nIHNwYWNlcy90YWJzLCBidWxsZXQsIGFuZCBjb250ZW50XG5cdFx0XHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IHNvdXJjZS5zcGxpdCgnXFxuJyk7IC8vIGluc3RhLXRvYyBjb2RlYmxvY2sgY29udGVudFxuXG5cdFx0XHRcdC8vIFByb2Nlc3MgdGhlIGNvZGVibG9jayB0ZXh0IGJ5IGNvbnZlcnRpbmcgZWFjaCBsaW5lIGludG8gYSBtYXJrZG93biBsaW5rIGxpc3QgaXRlbVxuXHRcdFx0XHRjb25zdCBwcm9jZXNzZWRTb3VyY2U6IHN0cmluZyA9IGxpbmVzLm1hcCgobGluZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IGxpbmUubWF0Y2gobGlzdFJlZ2V4KTtcblx0XHRcdFx0XHRpZiAoIW1hdGNoKSByZXR1cm4gbGluZTtcblxuXHRcdFx0XHRcdGNvbnN0IFssIGluZGVudCwgY29udGVudFRleHRdOiBSZWdFeHBNYXRjaEFycmF5ID0gbWF0Y2g7XG5cdFx0XHRcdFx0Y29uc3QgbmF2TGluayA9IGAke2ZpbGVQYXRofSMke2NvbnRlbnRUZXh0fWA7XG5cblx0XHRcdFx0XHRyZXR1cm4gYCR7aW5kZW50fS0gW1ske25hdkxpbmt9fCR7Y29udGVudFRleHR9XV1gO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKCdcXG4nKTtcblxuXHRcdFx0XHQvLyBOb3cgcmVuZGVyIHRoZSBtYXJrZG93blxuXHRcdFx0XHRhd2FpdCBNYXJrZG93blJlbmRlcmVyLnJlbmRlcih0aGlzLmFwcCwgcHJvY2Vzc2VkU291cmNlLCBlbCwgcGF0aFdpdGhGaWxlRXh0ZW5zaW9uLCB0aGlzKTtcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0Ly8gRGV0ZWN0IHdoZW4gdGhlIHVzZXIgdHlwZXMgYW5kIHVwZGF0ZSBoZWFkZXJzXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxuXHRcdFx0dGhpcy5hcHAudmF1bHQub24oXG5cdFx0XHRcdFwibW9kaWZ5XCIsXG5cdFx0XHRcdGRlYm91bmNlKHRoaXMuaGFuZGxlRWRpdG9yQ2hhbmdlLmJpbmQodGhpcyksIDIwMDApXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXG5cdG9udW5sb2FkKCkge1xuXHRcdGNvbnNvbGUubG9nKCdVbmxvYWRpbmcgSW5zdGEgVE9DIFBsdWdpbicpO1xuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdGxldCBtZXJnZWRTZXR0aW5ncyA9IERFRkFVTFRfU0VUVElOR1M7XG5cdFx0Y29uc3Qgc2V0dGluZ3NEYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuXHRcdGlmIChzZXR0aW5nc0RhdGEpIHtcblx0XHRcdG1lcmdlZFNldHRpbmdzID0gZGVlcG1lcmdlKERFRkFVTFRfU0VUVElOR1MsIHNldHRpbmdzRGF0YSk7XG5cdFx0fVxuXHRcdHRoaXMuc2V0dGluZ3MgPSBtZXJnZWRTZXR0aW5ncztcblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuXHR9XG5cblx0Ly8gUHJvdmlkZXMgdGhlIGluc2VydCBsb2NhdGlvbiByYW5nZSBmb3IgdGhlIG5ldyBpbnN0YS10b2MgY29kZWJsb2NrXG5cdHByaXZhdGUgZ2V0VG9jSW5zZXJ0UG9zaXRpb24oaW5zdGFUb2NTZWN0aW9uOiBTZWN0aW9uQ2FjaGUpOiBFZGl0b3JSYW5nZSB7XG5cdFx0Ly8gRGVmaW5lIHRoZSBzdGFyL2VuZCBsaW5lL2NoYXJhY3RlciBpbmRleFxuXHRcdGNvbnN0IHN0YXJ0TGluZTogbnVtYmVyID0gaW5zdGFUb2NTZWN0aW9uLnBvc2l0aW9uLnN0YXJ0LmxpbmU7XG5cdFx0Y29uc3Qgc3RhcnRDaCA9IDA7XG5cdFx0Y29uc3QgZW5kTGluZTogbnVtYmVyID0gaW5zdGFUb2NTZWN0aW9uLnBvc2l0aW9uLmVuZC5saW5lO1xuXHRcdGNvbnN0IGVuZENoOiBudW1iZXIgPSBpbnN0YVRvY1NlY3Rpb24ucG9zaXRpb24uZW5kLmNvbDtcblxuXHRcdGNvbnN0IHRvY1N0YXJ0UG9zOiBFZGl0b3JQb3NpdGlvbiA9IHsgbGluZTogc3RhcnRMaW5lLCBjaDogc3RhcnRDaCB9O1xuXHRcdGNvbnN0IHRvY0VuZFBvczogRWRpdG9yUG9zaXRpb24gPSB7IGxpbmU6IGVuZExpbmUsIGNoOiBlbmRDaCB9O1xuXG5cdFx0cmV0dXJuIHsgZnJvbTogdG9jU3RhcnRQb3MsIHRvOiB0b2NFbmRQb3MgfTtcblx0fVxuXG5cdC8vIEdlbmVyYXRlcyBhIG5ldyBpbnN0YS10b2MgY29kZWJsb2NrXG5cdHByaXZhdGUgZ2VuZXJhdGVUb2MoZmlsZUhlYWRpbmdzOiBIZWFkaW5nQ2FjaGVbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgdG9jSGVhZGluZ1JlZnM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvLyBJdGVyYXRlIGVhY2ggaGVhZGluZyBjYWNoZSBvYmplY3QgdG8gZ2VuZXJhdGUgdGhlIG5ldyBUT0MgY29udGVudFxuXHRcdGlmIChmaWxlSGVhZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0ZmlsZUhlYWRpbmdzLmZvckVhY2goKGhlYWRpbmdDYWNoZTogSGVhZGluZ0NhY2hlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGhlYWRpbmdMZXZlbDogbnVtYmVyID0gaGVhZGluZ0NhY2hlLmxldmVsO1xuXHRcdFx0XHRjb25zdCBoZWFkaW5nVGV4dDogc3RyaW5nID0gaGVhZGluZ0NhY2hlLmhlYWRpbmc7XG5cdFx0XHRcdGNvbnN0IHRvY0hlYWRpbmdSZWYgPSBgJHsnICcucmVwZWF0KChoZWFkaW5nTGV2ZWwgLSAxKSAqIDQpfS0gJHtoZWFkaW5nVGV4dH1gO1xuXG5cdFx0XHRcdHRvY0hlYWRpbmdSZWZzLnB1c2godG9jSGVhZGluZ1JlZik7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCB0b2NDb250ZW50OiBzdHJpbmcgPSB0b2NIZWFkaW5nUmVmcy5qb2luKCdcXG4nKTtcblx0XHRyZXR1cm4gYFxcYFxcYFxcYGluc3RhLXRvY1xcbiR7dG9jQ29udGVudH1cXG5cXGBcXGBcXGBgO1xuXHR9XG5cblx0Ly8gRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBUT0Ncblx0cHJpdmF0ZSB1cGRhdGVBdXRvVG9jKGVkaXRvcjogRWRpdG9yLCBmaWxlOiBURmlsZSk6IHZvaWQge1xuXHRcdC8vIEV4dHJhY3QgdGhlIGhlYWRpbmdzIGFuZCBzZWN0aW9ucyBmcm9tIHRoZSBhY3RpdmUgZmlsZSdzIGNhY2hlXG5cdFx0Y29uc3QgZmlsZUNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcblx0XHRjb25zdCBmaWxlSGVhZGluZ3M6IEhlYWRpbmdDYWNoZVtdID0gZmlsZUNhY2hlPy5oZWFkaW5ncyA/PyBbXTtcblx0XHRjb25zdCBpbnN0YVRvY1NlY3Rpb246IFNlY3Rpb25DYWNoZSB8IHVuZGVmaW5lZCA9IGZpbGVDYWNoZT8uc2VjdGlvbnNcblx0XHRcdD8gZmlsZUNhY2hlLnNlY3Rpb25zLmZpbmQoXG5cdFx0XHRcdChzZWN0aW9uOiBTZWN0aW9uQ2FjaGUpID0+IHNlY3Rpb24udHlwZSA9PT0gJ2NvZGUnICYmXG5cdFx0XHRcdFx0ZWRpdG9yLmdldExpbmUoc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5saW5lKSA9PT0gJ2BgYGluc3RhLXRvYydcblx0XHRcdCkgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBSZXR1cm4gZWFybHkgaWYgbm8gc2VjdGlvbnMgKHdoaWNoIG1lYW5zIG5vIGluc3RhLXRvYyBibG9ja3MpXG5cdFx0aWYgKCFpbnN0YVRvY1NlY3Rpb24pIHJldHVybjtcblxuXHRcdC8vIEdldCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGFuZCBnZW5lcmF0ZSB0aGUgdXBkYXRlZCBUT0Ncblx0XHRjb25zdCB0b2NJbnNlcnRSYW5nZTogRWRpdG9yUmFuZ2UgPSB0aGlzLmdldFRvY0luc2VydFBvc2l0aW9uKGluc3RhVG9jU2VjdGlvbik7XG5cdFx0Y29uc3QgbmV3VG9jQmxvY2sgPSB0aGlzLmdlbmVyYXRlVG9jKGZpbGVIZWFkaW5ncyk7XG5cblx0XHQvLyBSZXBsYWNlIHRoZSBvbGQgVE9DIHdpdGggdGhlIHVwZGF0ZWQgVE9DXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShuZXdUb2NCbG9jaywgdG9jSW5zZXJ0UmFuZ2UuZnJvbSwgdG9jSW5zZXJ0UmFuZ2UudG8pO1xuXHR9XG5cblx0Ly8gTWFpbiBjb250cm9sIG1ldGhvZCB0byBoYW5kbGUgYWxsIGFjdGl2ZSBmaWxlIGNoYW5nZXNcblx0cHJpdmF0ZSBhc3luYyBoYW5kbGVFZGl0b3JDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYWN0aXZlRWRpdG9yOiBNYXJrZG93bkZpbGVJbmZvIHwgbnVsbCA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVFZGl0b3I7XG5cdFx0Y29uc3QgZWRpdG9yOiBFZGl0b3IgfCB1bmRlZmluZWQgPSBhY3RpdmVFZGl0b3I/LmVkaXRvcjtcblx0XHRjb25zdCBmaWxlOiBURmlsZSB8IHVuZGVmaW5lZCA9IGFjdGl2ZUVkaXRvcj8uZmlsZSA/PyB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIWFjdGl2ZUVkaXRvciB8fCAhZWRpdG9yIHx8ICFmaWxlKSByZXR1cm47XG5cblx0XHQvLyBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGluc3RhLXRvYyBjb2RlYmxvY2tcblx0XHRpZiAoZWRpdG9yKSB0aGlzLnVwZGF0ZUF1dG9Ub2MoZWRpdG9yLCBmaWxlKTtcblx0fVxufVxuIiwgIiIsICJleHBvcnQgaW50ZXJmYWNlIEluc3RhVG9jU2V0dGluZ3Mge1xuICAgIHRvY1N0cmluZzogc3RyaW5nO1xuICAgIHNob3VsZEdlblRvYzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IEluc3RhVG9jU2V0dGluZ3MgPSB7XG4gICAgdG9jU3RyaW5nOiBgPiBbIVNVTU1BUlldIFRhYmxlIG9mIENvbnRlbnRzYCxcbiAgICBzaG91bGRHZW5Ub2M6IGZhbHNlXG59XG5cblxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBJbnN0YVRvYyBmcm9tICcuL21haW4nO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIHBsdWdpbjogSW5zdGFUb2M7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBJbnN0YVRvYykge1xuICAgICAgICBzdXBlcihhcHAsIHBsdWdpbik7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgIH1cblxuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG5cbiAgICAgICAgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdTZXR0aW5nICMxJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdJdFxcJ3MgYSBzZWNyZXQnKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB0ZXh0XG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKCdFbnRlciB5b3VyIHNlY3JldCcpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRvY1N0cmluZylcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnRvY1N0cmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ1RPQyBGaWxlcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnSW5zZXJ0IGZpbGVzIHRvIGF1dG9tYXRpY2FsbHkgJylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcignRW50ZXIgeW91ciBzZWNyZXQnKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50b2NTdHJpbmcpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50b2NTdHJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBTcGVjaWFsIHZhbHVlcyB0aGF0IHRlbGwgZGVlcG1lcmdlIHRvIHBlcmZvcm0gYSBjZXJ0YWluIGFjdGlvbi5cbiAqL1xuY29uc3QgYWN0aW9ucyA9IHtcbiAgICBkZWZhdWx0TWVyZ2U6IFN5bWJvbChcImRlZXBtZXJnZS10czogZGVmYXVsdCBtZXJnZVwiKSxcbiAgICBza2lwOiBTeW1ib2woXCJkZWVwbWVyZ2UtdHM6IHNraXBcIiksXG59O1xuLyoqXG4gKiBTcGVjaWFsIHZhbHVlcyB0aGF0IHRlbGwgZGVlcG1lcmdlSW50byB0byBwZXJmb3JtIGEgY2VydGFpbiBhY3Rpb24uXG4gKi9cbmNvbnN0IGFjdGlvbnNJbnRvID0ge1xuICAgIGRlZmF1bHRNZXJnZTogYWN0aW9ucy5kZWZhdWx0TWVyZ2UsXG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIHVwZGF0ZSBtZXRhIGRhdGEuXG4gKlxuICogSXQgZG9lc24ndCB1cGRhdGUgdGhlIG1ldGEgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdE1ldGFEYXRhVXBkYXRlcihwcmV2aW91c01ldGEsIG1ldGFNZXRhKSB7XG4gICAgcmV0dXJuIG1ldGFNZXRhO1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiB0byBmaWx0ZXIgdmFsdWVzLlxuICpcbiAqIEl0IGZpbHRlcnMgb3V0IHVuZGVmaW5lZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXJWYWx1ZXModmFsdWVzLCBtZXRhKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdHMgZGVlcG1lcmdlLXRzIHN1cHBvcnQuXG4gKi9cbnZhciBPYmplY3RUeXBlO1xuKGZ1bmN0aW9uIChPYmplY3RUeXBlKSB7XG4gICAgT2JqZWN0VHlwZVtPYmplY3RUeXBlW1wiTk9UXCJdID0gMF0gPSBcIk5PVFwiO1xuICAgIE9iamVjdFR5cGVbT2JqZWN0VHlwZVtcIlJFQ09SRFwiXSA9IDFdID0gXCJSRUNPUkRcIjtcbiAgICBPYmplY3RUeXBlW09iamVjdFR5cGVbXCJBUlJBWVwiXSA9IDJdID0gXCJBUlJBWVwiO1xuICAgIE9iamVjdFR5cGVbT2JqZWN0VHlwZVtcIlNFVFwiXSA9IDNdID0gXCJTRVRcIjtcbiAgICBPYmplY3RUeXBlW09iamVjdFR5cGVbXCJNQVBcIl0gPSA0XSA9IFwiTUFQXCI7XG4gICAgT2JqZWN0VHlwZVtPYmplY3RUeXBlW1wiT1RIRVJcIl0gPSA1XSA9IFwiT1RIRVJcIjtcbn0pKE9iamVjdFR5cGUgfHwgKE9iamVjdFR5cGUgPSB7fSkpO1xuLyoqXG4gKiBHZXQgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIHR5cGUgb2YuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBnZXRPYmplY3RUeXBlKG9iamVjdCkge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiIHx8IG9iamVjdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMCAvKiBPYmplY3RUeXBlLk5PVCAqLztcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gMiAvKiBPYmplY3RUeXBlLkFSUkFZICovO1xuICAgIH1cbiAgICBpZiAoaXNSZWNvcmQob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gMSAvKiBPYmplY3RUeXBlLlJFQ09SRCAqLztcbiAgICB9XG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICByZXR1cm4gMyAvKiBPYmplY3RUeXBlLlNFVCAqLztcbiAgICB9XG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICByZXR1cm4gNCAvKiBPYmplY3RUeXBlLk1BUCAqLztcbiAgICB9XG4gICAgcmV0dXJuIDUgLyogT2JqZWN0VHlwZS5PVEhFUiAqLztcbn1cbi8qKlxuICogR2V0IHRoZSBrZXlzIG9mIHRoZSBnaXZlbiBvYmplY3RzIGluY2x1ZGluZyBzeW1ib2wga2V5cy5cbiAqXG4gKiBOb3RlOiBPbmx5IGtleXMgdG8gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0cyAtIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gZ2V0IHRoZSBrZXlzIG9mLlxuICogQHJldHVybnMgQSBzZXQgY29udGFpbmluZyBhbGwgdGhlIGtleXMgb2YgYWxsIHRoZSBnaXZlbiBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBnZXRLZXlzKG9iamVjdHMpIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgWy4uLk9iamVjdC5rZXlzKG9iamVjdCksIC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KV0pIHtcbiAgICAgICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG4vKipcbiAqIERvZXMgdGhlIGdpdmVuIG9iamVjdCBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHRlc3QuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0SGFzUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHByb3BlcnR5KTtcbn1cbi8qKlxuICogR2V0IGFuIGl0ZXJhYmxlIG9iamVjdCB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIGl0ZXJhYmxlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0SXRlcmFibGVPZkl0ZXJhYmxlcyhpdGVyYWJsZXMpIHtcbiAgICBsZXQgbV9pdGVyYWJsZXNJbmRleCA9IDA7XG4gICAgbGV0IG1faXRlcmF0b3IgPSBpdGVyYWJsZXNbMF0/LltTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2l0ZXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBtX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faXRlcmFibGVzSW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yID0gaXRlcmFibGVzW21faXRlcmFibGVzSW5kZXhdPy5bU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1zZXQtaGFzIC0tIEFycmF5IGlzIG1vcmUgcGVyZm9ybWFudCBmb3IgYSBsb3cgbnVtYmVyIG9mIGVsZW1lbnRzLlxuY29uc3QgdmFsaWRSZWNvcmRUb1N0cmluZ1ZhbHVlcyA9IFtcIltvYmplY3QgT2JqZWN0XVwiLCBcIltvYmplY3QgTW9kdWxlXVwiXTtcbi8qKlxuICogRG9lcyB0aGUgZ2l2ZW4gb2JqZWN0IGFwcGVhciB0byBiZSBhIHJlY29yZC5cbiAqL1xuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWUpIHtcbiAgICAvLyBBbGwgcmVjb3JkcyBhcmUgb2JqZWN0cy5cbiAgICBpZiAoIXZhbGlkUmVjb3JkVG9TdHJpbmdWYWx1ZXMuaW5jbHVkZXMoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IGNvbnN0cnVjdG9yIH0gPSB2YWx1ZTtcbiAgICAvLyBJZiBoYXMgbW9kaWZpZWQgY29uc3RydWN0b3IuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHRzL25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcm90b3R5cGUgPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgLy8gSWYgaGFzIG1vZGlmaWVkIHByb3RvdHlwZS5cbiAgICBpZiAocHJvdG90eXBlID09PSBudWxsIHx8XG4gICAgICAgIHR5cGVvZiBwcm90b3R5cGUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgIXZhbGlkUmVjb3JkVG9TdHJpbmdWYWx1ZXMuaW5jbHVkZXMoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb3RvdHlwZSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gSWYgY29uc3RydWN0b3IgZG9lcyBub3QgaGF2ZSBhbiBPYmplY3Qtc3BlY2lmaWMgbWV0aG9kLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hci9wcmVmZXItc2luZ2xlLWJvb2xlYW4tcmV0dXJuLCBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICBpZiAoIXByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcImlzUHJvdG90eXBlT2ZcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBNb3N0IGxpa2VseSBhIHJlY29yZC5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBzdHJhdGVneSB0byBtZXJnZSByZWNvcmRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VSZWNvcmRzJDEodmFsdWVzLCB1dGlscywgbWV0YSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGdldEtleXModmFsdWVzKSkge1xuICAgICAgICBjb25zdCBwcm9wVmFsdWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAob2JqZWN0SGFzUHJvcGVydHkodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWVzLnB1c2godmFsdWVba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVkTWV0YSA9IHV0aWxzLm1ldGFEYXRhVXBkYXRlcihtZXRhLCB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwYXJlbnRzOiB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eVJlc3VsdCA9IG1lcmdlVW5rbm93bnMocHJvcFZhbHVlcywgdXRpbHMsIHVwZGF0ZWRNZXRhKTtcbiAgICAgICAgaWYgKHByb3BlcnR5UmVzdWx0ID09PSBhY3Rpb25zLnNraXApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IFwiX19wcm90b19fXCIpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVJlc3VsdCxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wZXJ0eVJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBzdHJhdGVneSB0byBtZXJnZSBhcnJheXMuXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQXJyYXlzJDEodmFsdWVzKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5mbGF0KCk7XG59XG4vKipcbiAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIG1lcmdlIHNldHMuXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBzZXRzLlxuICovXG5mdW5jdGlvbiBtZXJnZVNldHMkMSh2YWx1ZXMpIHtcbiAgICByZXR1cm4gbmV3IFNldChnZXRJdGVyYWJsZU9mSXRlcmFibGVzKHZhbHVlcykpO1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBzdHJhdGVneSB0byBtZXJnZSBtYXBzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgbWFwcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VNYXBzJDEodmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoZ2V0SXRlcmFibGVPZkl0ZXJhYmxlcyh2YWx1ZXMpKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsYXN0IG5vbi11bmRlZmluZWQgdmFsdWUgaW4gdGhlIGdpdmVuIGFycmF5LlxuICovXG5mdW5jdGlvbiBtZXJnZU90aGVycyQxKHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMuYXQoLTEpO1xufVxuLyoqXG4gKiBUaGUgbWVyZ2UgZnVuY3Rpb25zLlxuICovXG5jb25zdCBtZXJnZUZ1bmN0aW9ucyA9IHtcbiAgICBtZXJnZVJlY29yZHM6IG1lcmdlUmVjb3JkcyQxLFxuICAgIG1lcmdlQXJyYXlzOiBtZXJnZUFycmF5cyQxLFxuICAgIG1lcmdlU2V0czogbWVyZ2VTZXRzJDEsXG4gICAgbWVyZ2VNYXBzOiBtZXJnZU1hcHMkMSxcbiAgICBtZXJnZU90aGVyczogbWVyZ2VPdGhlcnMkMSxcbn07XG5cbi8qKlxuICogRGVlcGx5IG1lcmdlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIG9iamVjdHMgLSBUaGUgb2JqZWN0cyB0byBtZXJnZS5cbiAqL1xuZnVuY3Rpb24gZGVlcG1lcmdlKC4uLm9iamVjdHMpIHtcbiAgICByZXR1cm4gZGVlcG1lcmdlQ3VzdG9tKHt9KSguLi5vYmplY3RzKTtcbn1cbmZ1bmN0aW9uIGRlZXBtZXJnZUN1c3RvbShvcHRpb25zLCByb290TWV0YURhdGEpIHtcbiAgICBjb25zdCB1dGlscyA9IGdldFV0aWxzKG9wdGlvbnMsIGN1c3RvbWl6ZWREZWVwbWVyZ2UpO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b21pemVkIGRlZXBtZXJnZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21pemVkRGVlcG1lcmdlKC4uLm9iamVjdHMpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlVW5rbm93bnMob2JqZWN0cywgdXRpbHMsIHJvb3RNZXRhRGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBjdXN0b21pemVkRGVlcG1lcmdlO1xufVxuLyoqXG4gKiBUaGUgdGhlIHV0aWxzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgbWVyZ2UgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdGhlIHVzZXIgc3BlY2lmaWVkXG4gKi9cbmZ1bmN0aW9uIGdldFV0aWxzKG9wdGlvbnMsIGN1c3RvbWl6ZWREZWVwbWVyZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0TWVyZ2VGdW5jdGlvbnM6IG1lcmdlRnVuY3Rpb25zLFxuICAgICAgICBtZXJnZUZ1bmN0aW9uczoge1xuICAgICAgICAgICAgLi4ubWVyZ2VGdW5jdGlvbnMsXG4gICAgICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob3B0aW9ucylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChba2V5LCBvcHRpb25dKSA9PiBPYmplY3QuaGFzT3duKG1lcmdlRnVuY3Rpb25zLCBrZXkpKVxuICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIG9wdGlvbl0pID0+IChvcHRpb24gPT09IGZhbHNlID8gW2tleSwgbWVyZ2VGdW5jdGlvbnMubWVyZ2VPdGhlcnNdIDogW2tleSwgb3B0aW9uXSkpKSxcbiAgICAgICAgfSxcbiAgICAgICAgbWV0YURhdGFVcGRhdGVyOiAob3B0aW9ucy5tZXRhRGF0YVVwZGF0ZXIgPz8gZGVmYXVsdE1ldGFEYXRhVXBkYXRlciksXG4gICAgICAgIGRlZXBtZXJnZTogY3VzdG9taXplZERlZXBtZXJnZSxcbiAgICAgICAgdXNlSW1wbGljaXREZWZhdWx0TWVyZ2luZzogb3B0aW9ucy5lbmFibGVJbXBsaWNpdERlZmF1bHRNZXJnaW5nID8/IGZhbHNlLFxuICAgICAgICBmaWx0ZXJWYWx1ZXM6IG9wdGlvbnMuZmlsdGVyVmFsdWVzID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IChvcHRpb25zLmZpbHRlclZhbHVlcyA/PyBkZWZhdWx0RmlsdGVyVmFsdWVzKSxcbiAgICAgICAgYWN0aW9ucyxcbiAgICB9O1xufVxuLyoqXG4gKiBNZXJnZSB1bmtub3duIHRoaW5ncy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VVbmtub3ducyh2YWx1ZXMsIHV0aWxzLCBtZXRhKSB7XG4gICAgY29uc3QgZmlsdGVyZWRWYWx1ZXMgPSB1dGlscy5maWx0ZXJWYWx1ZXM/Lih2YWx1ZXMsIG1ldGEpID8/IHZhbHVlcztcbiAgICBpZiAoZmlsdGVyZWRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlT3RoZXJzKGZpbHRlcmVkVmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBnZXRPYmplY3RUeXBlKGZpbHRlcmVkVmFsdWVzWzBdKTtcbiAgICBpZiAodHlwZSAhPT0gMCAvKiBPYmplY3RUeXBlLk5PVCAqLyAmJiB0eXBlICE9PSA1IC8qIE9iamVjdFR5cGUuT1RIRVIgKi8pIHtcbiAgICAgICAgZm9yIChsZXQgbV9pbmRleCA9IDE7IG1faW5kZXggPCBmaWx0ZXJlZFZhbHVlcy5sZW5ndGg7IG1faW5kZXgrKykge1xuICAgICAgICAgICAgaWYgKGdldE9iamVjdFR5cGUoZmlsdGVyZWRWYWx1ZXNbbV9pbmRleF0pID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VPdGhlcnMoZmlsdGVyZWRWYWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAxIC8qIE9iamVjdFR5cGUuUkVDT1JEICovOiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VSZWNvcmRzKGZpbHRlcmVkVmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyIC8qIE9iamVjdFR5cGUuQVJSQVkgKi86IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUFycmF5cyhmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMyAvKiBPYmplY3RUeXBlLlNFVCAqLzoge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlU2V0cyhmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNCAvKiBPYmplY3RUeXBlLk1BUCAqLzoge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTWFwcyhmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZU90aGVycyhmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBNZXJnZSByZWNvcmRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VSZWNvcmRzKHZhbHVlcywgdXRpbHMsIG1ldGEpIHtcbiAgICBjb25zdCByZXN1bHQgPSB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZVJlY29yZHModmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gYWN0aW9ucy5kZWZhdWx0TWVyZ2UgfHxcbiAgICAgICAgKHV0aWxzLnVzZUltcGxpY2l0RGVmYXVsdE1lcmdpbmcgJiZcbiAgICAgICAgICAgIHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZVJlY29yZHMgIT09IHV0aWxzLmRlZmF1bHRNZXJnZUZ1bmN0aW9ucy5tZXJnZVJlY29yZHMpKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5kZWZhdWx0TWVyZ2VGdW5jdGlvbnMubWVyZ2VSZWNvcmRzKHZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBNZXJnZSBhcnJheXMuXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQXJyYXlzKHZhbHVlcywgdXRpbHMsIG1ldGEpIHtcbiAgICBjb25zdCByZXN1bHQgPSB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZUFycmF5cyh2YWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICBpZiAocmVzdWx0ID09PSBhY3Rpb25zLmRlZmF1bHRNZXJnZSB8fFxuICAgICAgICAodXRpbHMudXNlSW1wbGljaXREZWZhdWx0TWVyZ2luZyAmJlxuICAgICAgICAgICAgcmVzdWx0ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHV0aWxzLm1lcmdlRnVuY3Rpb25zLm1lcmdlQXJyYXlzICE9PSB1dGlscy5kZWZhdWx0TWVyZ2VGdW5jdGlvbnMubWVyZ2VBcnJheXMpKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5kZWZhdWx0TWVyZ2VGdW5jdGlvbnMubWVyZ2VBcnJheXModmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogTWVyZ2Ugc2V0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHNldHMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlU2V0cyh2YWx1ZXMsIHV0aWxzLCBtZXRhKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbHMubWVyZ2VGdW5jdGlvbnMubWVyZ2VTZXRzKHZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgIGlmIChyZXN1bHQgPT09IGFjdGlvbnMuZGVmYXVsdE1lcmdlIHx8XG4gICAgICAgICh1dGlscy51c2VJbXBsaWNpdERlZmF1bHRNZXJnaW5nICYmXG4gICAgICAgICAgICByZXN1bHQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdXRpbHMubWVyZ2VGdW5jdGlvbnMubWVyZ2VTZXRzICE9PSB1dGlscy5kZWZhdWx0TWVyZ2VGdW5jdGlvbnMubWVyZ2VTZXRzKSkge1xuICAgICAgICByZXR1cm4gdXRpbHMuZGVmYXVsdE1lcmdlRnVuY3Rpb25zLm1lcmdlU2V0cyh2YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBNZXJnZSBtYXBzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgbWFwcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VNYXBzKHZhbHVlcywgdXRpbHMsIG1ldGEpIHtcbiAgICBjb25zdCByZXN1bHQgPSB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZU1hcHModmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gYWN0aW9ucy5kZWZhdWx0TWVyZ2UgfHxcbiAgICAgICAgKHV0aWxzLnVzZUltcGxpY2l0RGVmYXVsdE1lcmdpbmcgJiZcbiAgICAgICAgICAgIHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZU1hcHMgIT09IHV0aWxzLmRlZmF1bHRNZXJnZUZ1bmN0aW9ucy5tZXJnZU1hcHMpKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5kZWZhdWx0TWVyZ2VGdW5jdGlvbnMubWVyZ2VNYXBzKHZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIE1lcmdlIG90aGVyIHRoaW5ncy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIG90aGVyIHRoaW5ncy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPdGhlcnModmFsdWVzLCB1dGlscywgbWV0YSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLm1lcmdlRnVuY3Rpb25zLm1lcmdlT3RoZXJzKHZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgIGlmIChyZXN1bHQgPT09IGFjdGlvbnMuZGVmYXVsdE1lcmdlIHx8XG4gICAgICAgICh1dGlscy51c2VJbXBsaWNpdERlZmF1bHRNZXJnaW5nICYmXG4gICAgICAgICAgICByZXN1bHQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdXRpbHMubWVyZ2VGdW5jdGlvbnMubWVyZ2VPdGhlcnMgIT09IHV0aWxzLmRlZmF1bHRNZXJnZUZ1bmN0aW9ucy5tZXJnZU90aGVycykpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmRlZmF1bHRNZXJnZUZ1bmN0aW9ucy5tZXJnZU90aGVycyh2YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIG1lcmdlIHJlY29yZHMgaW50byBhIHRhcmdldCByZWNvcmQuXG4gKlxuICogQHBhcmFtIG1fdGFyZ2V0IC0gVGhlIHJlc3VsdCB3aWxsIGJlIG11dGF0ZWQgaW50byB0aGlzIHJlY29yZFxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSByZWNvcmRzIChpbmNsdWRpbmcgdGhlIHRhcmdldCdzIHZhbHVlIGlmIHRoZXJlIGlzIG9uZSkuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUmVjb3Jkc0ludG8kMShtX3RhcmdldCwgdmFsdWVzLCB1dGlscywgbWV0YSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGdldEtleXModmFsdWVzKSkge1xuICAgICAgICBjb25zdCBwcm9wVmFsdWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAob2JqZWN0SGFzUHJvcGVydHkodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWVzLnB1c2godmFsdWVba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVkTWV0YSA9IHV0aWxzLm1ldGFEYXRhVXBkYXRlcihtZXRhLCB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwYXJlbnRzOiB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eVRhcmdldCA9IHsgdmFsdWU6IHByb3BWYWx1ZXNbMF0gfTtcbiAgICAgICAgbWVyZ2VVbmtub3duc0ludG8ocHJvcGVydHlUYXJnZXQsIHByb3BWYWx1ZXMsIHV0aWxzLCB1cGRhdGVkTWV0YSk7XG4gICAgICAgIGlmIChrZXkgPT09IFwiX19wcm90b19fXCIpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtX3RhcmdldC52YWx1ZSwga2V5LCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5VGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtX3RhcmdldC52YWx1ZVtrZXldID0gcHJvcGVydHlUYXJnZXQudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIG1lcmdlIGFycmF5cyBpbnRvIGEgdGFyZ2V0IGFycmF5LlxuICpcbiAqIEBwYXJhbSBtX3RhcmdldCAtIFRoZSByZXN1bHQgd2lsbCBiZSBtdXRhdGVkIGludG8gdGhpcyBhcnJheVxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheXMgKGluY2x1ZGluZyB0aGUgdGFyZ2V0J3MgdmFsdWUgaWYgdGhlcmUgaXMgb25lKS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VBcnJheXNJbnRvJDEobV90YXJnZXQsIHZhbHVlcykge1xuICAgIG1fdGFyZ2V0LnZhbHVlLnB1c2goLi4udmFsdWVzLnNsaWNlKDEpLmZsYXQoKSk7XG59XG4vKipcbiAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIG1lcmdlIHNldHMgaW50byBhIHRhcmdldCBzZXQuXG4gKlxuICogQHBhcmFtIG1fdGFyZ2V0IC0gVGhlIHJlc3VsdCB3aWxsIGJlIG11dGF0ZWQgaW50byB0aGlzIHNldFxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBzZXRzIChpbmNsdWRpbmcgdGhlIHRhcmdldCdzIHZhbHVlIGlmIHRoZXJlIGlzIG9uZSkuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlU2V0c0ludG8kMShtX3RhcmdldCwgdmFsdWVzKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBnZXRJdGVyYWJsZU9mSXRlcmFibGVzKHZhbHVlcy5zbGljZSgxKSkpIHtcbiAgICAgICAgbV90YXJnZXQudmFsdWUuYWRkKHZhbHVlKTtcbiAgICB9XG59XG4vKipcbiAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIG1lcmdlIG1hcHMgaW50byBhIHRhcmdldCBtYXAuXG4gKlxuICogQHBhcmFtIG1fdGFyZ2V0IC0gVGhlIHJlc3VsdCB3aWxsIGJlIG11dGF0ZWQgaW50byB0aGlzIG1hcFxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBtYXBzIChpbmNsdWRpbmcgdGhlIHRhcmdldCdzIHZhbHVlIGlmIHRoZXJlIGlzIG9uZSkuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlTWFwc0ludG8kMShtX3RhcmdldCwgdmFsdWVzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZ2V0SXRlcmFibGVPZkl0ZXJhYmxlcyh2YWx1ZXMuc2xpY2UoMSkpKSB7XG4gICAgICAgIG1fdGFyZ2V0LnZhbHVlLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG59XG4vKipcbiAqIFNldCB0aGUgdGFyZ2V0IHRvIHRoZSBsYXN0IG5vbi11bmRlZmluZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3RoZXJzSW50byQxKG1fdGFyZ2V0LCB2YWx1ZXMpIHtcbiAgICBtX3RhcmdldC52YWx1ZSA9IHZhbHVlcy5hdCgtMSk7XG59XG4vKipcbiAqIFRoZSBtZXJnZSBmdW5jdGlvbnMuXG4gKi9cbmNvbnN0IG1lcmdlSW50b0Z1bmN0aW9ucyA9IHtcbiAgICBtZXJnZVJlY29yZHM6IG1lcmdlUmVjb3Jkc0ludG8kMSxcbiAgICBtZXJnZUFycmF5czogbWVyZ2VBcnJheXNJbnRvJDEsXG4gICAgbWVyZ2VTZXRzOiBtZXJnZVNldHNJbnRvJDEsXG4gICAgbWVyZ2VNYXBzOiBtZXJnZU1hcHNJbnRvJDEsXG4gICAgbWVyZ2VPdGhlcnM6IG1lcmdlT3RoZXJzSW50byQxLFxufTtcblxuZnVuY3Rpb24gZGVlcG1lcmdlSW50byh0YXJnZXQsIC4uLm9iamVjdHMpIHtcbiAgICByZXR1cm4gdm9pZCBkZWVwbWVyZ2VJbnRvQ3VzdG9tKHt9KSh0YXJnZXQsIC4uLm9iamVjdHMpO1xufVxuZnVuY3Rpb24gZGVlcG1lcmdlSW50b0N1c3RvbShvcHRpb25zLCByb290TWV0YURhdGEpIHtcbiAgICBjb25zdCB1dGlscyA9IGdldEludG9VdGlscyhvcHRpb25zLCBjdXN0b21pemVkRGVlcG1lcmdlSW50byk7XG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbWl6ZWQgZGVlcG1lcmdlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbWl6ZWREZWVwbWVyZ2VJbnRvKHRhcmdldCwgLi4ub2JqZWN0cykge1xuICAgICAgICBtZXJnZVVua25vd25zSW50byh7IHZhbHVlOiB0YXJnZXQgfSwgW3RhcmdldCwgLi4ub2JqZWN0c10sIHV0aWxzLCByb290TWV0YURhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gY3VzdG9taXplZERlZXBtZXJnZUludG87XG59XG4vKipcbiAqIFRoZSB0aGUgdXRpbHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBtZXJnZSBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyB0aGUgdXNlciBzcGVjaWZpZWRcbiAqL1xuZnVuY3Rpb24gZ2V0SW50b1V0aWxzKG9wdGlvbnMsIGN1c3RvbWl6ZWREZWVwbWVyZ2VJbnRvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdE1lcmdlRnVuY3Rpb25zOiBtZXJnZUludG9GdW5jdGlvbnMsXG4gICAgICAgIG1lcmdlRnVuY3Rpb25zOiB7XG4gICAgICAgICAgICAuLi5tZXJnZUludG9GdW5jdGlvbnMsXG4gICAgICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob3B0aW9ucylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChba2V5LCBvcHRpb25dKSA9PiBPYmplY3QuaGFzT3duKG1lcmdlSW50b0Z1bmN0aW9ucywga2V5KSlcbiAgICAgICAgICAgICAgICAubWFwKChba2V5LCBvcHRpb25dKSA9PiAob3B0aW9uID09PSBmYWxzZSA/IFtrZXksIG1lcmdlSW50b0Z1bmN0aW9ucy5tZXJnZU90aGVyc10gOiBba2V5LCBvcHRpb25dKSkpLFxuICAgICAgICB9LFxuICAgICAgICBtZXRhRGF0YVVwZGF0ZXI6IChvcHRpb25zLm1ldGFEYXRhVXBkYXRlciA/PyBkZWZhdWx0TWV0YURhdGFVcGRhdGVyKSxcbiAgICAgICAgZGVlcG1lcmdlSW50bzogY3VzdG9taXplZERlZXBtZXJnZUludG8sXG4gICAgICAgIGZpbHRlclZhbHVlczogb3B0aW9ucy5maWx0ZXJWYWx1ZXMgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogKG9wdGlvbnMuZmlsdGVyVmFsdWVzID8/IGRlZmF1bHRGaWx0ZXJWYWx1ZXMpLFxuICAgICAgICBhY3Rpb25zOiBhY3Rpb25zSW50byxcbiAgICB9O1xufVxuLyoqXG4gKiBNZXJnZSB1bmtub3duIHRoaW5ncyBpbnRvIGEgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBtX3RhcmdldCAtIFRoZSB0YXJnZXQgdG8gbWVyZ2UgaW50by5cbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVVua25vd25zSW50byhtX3RhcmdldCwgdmFsdWVzLCB1dGlscywgbWV0YSkge1xuICAgIGNvbnN0IGZpbHRlcmVkVmFsdWVzID0gdXRpbHMuZmlsdGVyVmFsdWVzPy4odmFsdWVzLCBtZXRhKSA/PyB2YWx1ZXM7XG4gICAgaWYgKGZpbHRlcmVkVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmaWx0ZXJlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgbWVyZ2VPdGhlcnNJbnRvKG1fdGFyZ2V0LCBmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gZ2V0T2JqZWN0VHlwZShtX3RhcmdldC52YWx1ZSk7XG4gICAgaWYgKHR5cGUgIT09IDAgLyogT2JqZWN0VHlwZS5OT1QgKi8gJiYgdHlwZSAhPT0gNSAvKiBPYmplY3RUeXBlLk9USEVSICovKSB7XG4gICAgICAgIGZvciAobGV0IG1faW5kZXggPSAxOyBtX2luZGV4IDwgZmlsdGVyZWRWYWx1ZXMubGVuZ3RoOyBtX2luZGV4KyspIHtcbiAgICAgICAgICAgIGlmIChnZXRPYmplY3RUeXBlKGZpbHRlcmVkVmFsdWVzW21faW5kZXhdKSA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgbWVyZ2VPdGhlcnNJbnRvKG1fdGFyZ2V0LCBmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIDEgLyogT2JqZWN0VHlwZS5SRUNPUkQgKi86IHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIG1lcmdlUmVjb3Jkc0ludG8obV90YXJnZXQsIGZpbHRlcmVkVmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyIC8qIE9iamVjdFR5cGUuQVJSQVkgKi86IHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIG1lcmdlQXJyYXlzSW50byhtX3RhcmdldCwgZmlsdGVyZWRWYWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMgLyogT2JqZWN0VHlwZS5TRVQgKi86IHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIG1lcmdlU2V0c0ludG8obV90YXJnZXQsIGZpbHRlcmVkVmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA0IC8qIE9iamVjdFR5cGUuTUFQICovOiB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCBtZXJnZU1hcHNJbnRvKG1fdGFyZ2V0LCBmaWx0ZXJlZFZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIG1lcmdlT3RoZXJzSW50byhtX3RhcmdldCwgZmlsdGVyZWRWYWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogTWVyZ2UgcmVjb3JkcyBpbnRvIGEgdGFyZ2V0IHJlY29yZC5cbiAqXG4gKiBAcGFyYW0gbV90YXJnZXQgLSBUaGUgdGFyZ2V0IHRvIG1lcmdlIGludG8uXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUmVjb3Jkc0ludG8obV90YXJnZXQsIHZhbHVlcywgdXRpbHMsIG1ldGEpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZVJlY29yZHMobV90YXJnZXQsIHZhbHVlcywgdXRpbHMsIG1ldGEpO1xuICAgIGlmIChhY3Rpb24gPT09IGFjdGlvbnNJbnRvLmRlZmF1bHRNZXJnZSkge1xuICAgICAgICB1dGlscy5kZWZhdWx0TWVyZ2VGdW5jdGlvbnMubWVyZ2VSZWNvcmRzKG1fdGFyZ2V0LCB2YWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICB9XG59XG4vKipcbiAqIE1lcmdlIGFycmF5cyBpbnRvIGEgdGFyZ2V0IGFycmF5LlxuICpcbiAqIEBwYXJhbSBtX3RhcmdldCAtIFRoZSB0YXJnZXQgdG8gbWVyZ2UgaW50by5cbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgYXJyYXlzLlxuICovXG5mdW5jdGlvbiBtZXJnZUFycmF5c0ludG8obV90YXJnZXQsIHZhbHVlcywgdXRpbHMsIG1ldGEpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZUFycmF5cyhtX3RhcmdldCwgdmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgaWYgKGFjdGlvbiA9PT0gYWN0aW9uc0ludG8uZGVmYXVsdE1lcmdlKSB7XG4gICAgICAgIHV0aWxzLmRlZmF1bHRNZXJnZUZ1bmN0aW9ucy5tZXJnZUFycmF5cyhtX3RhcmdldCwgdmFsdWVzKTtcbiAgICB9XG59XG4vKipcbiAqIE1lcmdlIHNldHMgaW50byBhIHRhcmdldCBzZXQuXG4gKlxuICogQHBhcmFtIG1fdGFyZ2V0IC0gVGhlIHRhcmdldCB0byBtZXJnZSBpbnRvLlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBzZXRzLlxuICovXG5mdW5jdGlvbiBtZXJnZVNldHNJbnRvKG1fdGFyZ2V0LCB2YWx1ZXMsIHV0aWxzLCBtZXRhKSB7XG4gICAgY29uc3QgYWN0aW9uID0gdXRpbHMubWVyZ2VGdW5jdGlvbnMubWVyZ2VTZXRzKG1fdGFyZ2V0LCB2YWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICBpZiAoYWN0aW9uID09PSBhY3Rpb25zSW50by5kZWZhdWx0TWVyZ2UpIHtcbiAgICAgICAgdXRpbHMuZGVmYXVsdE1lcmdlRnVuY3Rpb25zLm1lcmdlU2V0cyhtX3RhcmdldCwgdmFsdWVzKTtcbiAgICB9XG59XG4vKipcbiAqIE1lcmdlIG1hcHMgaW50byBhIHRhcmdldCBtYXAuXG4gKlxuICogQHBhcmFtIG1fdGFyZ2V0IC0gVGhlIHRhcmdldCB0byBtZXJnZSBpbnRvLlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBtYXBzLlxuICovXG5mdW5jdGlvbiBtZXJnZU1hcHNJbnRvKG1fdGFyZ2V0LCB2YWx1ZXMsIHV0aWxzLCBtZXRhKSB7XG4gICAgY29uc3QgYWN0aW9uID0gdXRpbHMubWVyZ2VGdW5jdGlvbnMubWVyZ2VNYXBzKG1fdGFyZ2V0LCB2YWx1ZXMsIHV0aWxzLCBtZXRhKTtcbiAgICBpZiAoYWN0aW9uID09PSBhY3Rpb25zSW50by5kZWZhdWx0TWVyZ2UpIHtcbiAgICAgICAgdXRpbHMuZGVmYXVsdE1lcmdlRnVuY3Rpb25zLm1lcmdlTWFwcyhtX3RhcmdldCwgdmFsdWVzKTtcbiAgICB9XG59XG4vKipcbiAqIE1lcmdlIG90aGVyIHRoaW5ncyBpbnRvIGEgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBtX3RhcmdldCAtIFRoZSB0YXJnZXQgdG8gbWVyZ2UgaW50by5cbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgb3RoZXIgdGhpbmdzLlxuICovXG5mdW5jdGlvbiBtZXJnZU90aGVyc0ludG8obV90YXJnZXQsIHZhbHVlcywgdXRpbHMsIG1ldGEpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB1dGlscy5tZXJnZUZ1bmN0aW9ucy5tZXJnZU90aGVycyhtX3RhcmdldCwgdmFsdWVzLCB1dGlscywgbWV0YSk7XG4gICAgaWYgKGFjdGlvbiA9PT0gYWN0aW9uc0ludG8uZGVmYXVsdE1lcmdlIHx8IG1fdGFyZ2V0LnZhbHVlID09PSBhY3Rpb25zSW50by5kZWZhdWx0TWVyZ2UpIHtcbiAgICAgICAgdXRpbHMuZGVmYXVsdE1lcmdlRnVuY3Rpb25zLm1lcmdlT3RoZXJzKG1fdGFyZ2V0LCB2YWx1ZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgZGVlcG1lcmdlLCBkZWVwbWVyZ2VDdXN0b20sIGRlZXBtZXJnZUludG8sIGRlZXBtZXJnZUludG9DdXN0b20sIGdldEtleXMsIGdldE9iamVjdFR5cGUsIG9iamVjdEhhc1Byb3BlcnR5IH07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlKFxuICAgIGZ1bmMsXG4gICAgd2FpdFxuKSB7XG4gICAgbGV0IHRpbWVvdXQgPSBudWxsO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAodGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgIH0sIHdhaXQpO1xuICAgIH07XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsbUNBQUMsU0FBVSxrRkFBaUYsWUFBYSx5R0FBd0csZ0JBQWlCLEVBQUMsSUFB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 diff --git a/package.json b/package.json index c21d241..acf08e2 100644 --- a/package.json +++ b/package.json @@ -41,4 +41,4 @@ "dependencies": { "deepmerge-ts": "7.1.3" } -} +} \ No newline at end of file