diff --git a/README.md b/README.md index 9609af9..095347c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ The tracker's information is stored in the code block as JSON data. The names, s # 🛣️ Roadmap Super Simple Time Tracker is still in its early stages! There are a lot of plans for it, including: -- A setting to allow users to decide what format timestamps should be displayed in - A setting to link segments to corresponding daily notes automatically - A neat interface to edit previous segments' names and time stamps - The ability to copy the table in various formats, including as text, markdown, and csv diff --git a/src/main.ts b/src/main.ts index 7b8a8ee..2918211 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,7 +15,7 @@ export default class SimpleTimeTrackerPlugin extends Plugin { this.registerMarkdownCodeBlockProcessor("simple-time-tracker", (s, e, i) => { let tracker = loadTracker(s); e.empty(); - displayTracker(tracker, e, () => i.getSectionInfo(e)); + displayTracker(tracker, e, () => i.getSectionInfo(e), this.settings); }); this.addCommand({ diff --git a/src/settings-tab.ts b/src/settings-tab.ts index b9fad76..05f5398 100644 --- a/src/settings-tab.ts +++ b/src/settings-tab.ts @@ -1,5 +1,6 @@ -import { App, PluginSettingTab } from "obsidian"; +import { App, PluginSettingTab, Setting } from "obsidian"; import SimpleTimeTrackerPlugin from "./main"; +import { defaultSettings } from "./settings"; export class SimpleTimeTrackerSettingsTab extends PluginSettingTab { @@ -14,7 +15,20 @@ export class SimpleTimeTrackerSettingsTab extends PluginSettingTab { this.containerEl.empty(); this.containerEl.createEl("h2", { text: "Super Simple Time Tracker Settings" }); - this.containerEl.createEl("p", { text: "Settings coming soon!" }); + new Setting(this.containerEl) + .setName("Timestamp Display Format") + .setDesc(createFragment(f => { + f.createSpan({ text: "The way that timestamps in time tracker tables should be displayed. Uses " }); + f.createEl("a", { text: "moment.js", href: "https://momentjs.com/docs/#/parsing/string-format/" }); + f.createSpan({ text: " syntax. Clear to reset to default." }); + })) + .addText(t => { + t.setValue(String(this.plugin.settings.timestampFormat)); + t.onChange(async v => { + this.plugin.settings.timestampFormat = v.length ? v : defaultSettings.timestampFormat; + await this.plugin.saveSettings(); + }); + }); this.containerEl.createEl("hr"); this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" }); diff --git a/src/settings.ts b/src/settings.ts index e0eb31a..35256e1 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,7 +1,9 @@ export const defaultSettings: SimpleTimeTrackerSettings = { - + timestampFormat: "YY-MM-DD hh:mm:ss" }; export interface SimpleTimeTrackerSettings { + timestampFormat: string; + } diff --git a/src/tracker.ts b/src/tracker.ts index 3558e0e..f5f95fe 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -1,4 +1,5 @@ import { moment, App, MarkdownSectionInformation, ButtonComponent, TextComponent } from "obsidian"; +import { SimpleTimeTrackerSettings } from "./settings"; export class Tracker { entries: Entry[]; @@ -52,7 +53,7 @@ export function loadTracker(json: string): Tracker { return { entries: [] }; } -export function displayTracker(tracker: Tracker, element: HTMLElement, getSectionInfo: () => MarkdownSectionInformation): void { +export function displayTracker(tracker: Tracker, element: HTMLElement, getSectionInfo: () => MarkdownSectionInformation, settings: SimpleTimeTrackerSettings): void { // add start/stop controls let running = isRunning(tracker); let btn = new ButtonComponent(element) @@ -92,9 +93,9 @@ export function displayTracker(tracker: Tracker, element: HTMLElement, getSectio for (let entry of tracker.entries) { let row = table.createEl("tr"); row.createEl("td", { text: entry.name }); - row.createEl("td", { text: moment.unix(entry.startTime).format("YY-MM-DD hh:mm:ss") }); + row.createEl("td", { text: moment.unix(entry.startTime).format(settings.timestampFormat) }); if (entry.endTime) { - row.createEl("td", { text: moment.unix(entry.endTime).format("YY-MM-DD hh:mm:ss") }); + row.createEl("td", { text: moment.unix(entry.endTime).format(settings.timestampFormat) }); let duration = moment.unix(entry.endTime).diff(moment.unix(entry.startTime)); row.createEl("td", { text: getCountdownDisplay(moment.duration(duration)) }); } diff --git a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/data.json b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/data.json new file mode 100644 index 0000000..3a84795 --- /dev/null +++ b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/data.json @@ -0,0 +1,3 @@ +{ + "timestampFormat": "YY-MM-DD hh:mm:ss" +} \ No newline at end of file diff --git a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js index ae9c74b..d042e68 100644 --- a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js +++ b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js @@ -53,7 +53,9 @@ __export(exports, { var import_obsidian3 = __toModule(require("obsidian")); // src/settings.ts -var defaultSettings = {}; +var defaultSettings = { + timestampFormat: "YY-MM-DD hh:mm:ss" +}; // src/settings-tab.ts var import_obsidian = __toModule(require("obsidian")); @@ -65,7 +67,17 @@ var SimpleTimeTrackerSettingsTab = class extends import_obsidian.PluginSettingTa display() { this.containerEl.empty(); this.containerEl.createEl("h2", { text: "Super Simple Time Tracker Settings" }); - this.containerEl.createEl("p", { text: "Settings coming soon!" }); + new import_obsidian.Setting(this.containerEl).setName("Timestamp Display Format").setDesc(createFragment((f) => { + f.createSpan({ text: "The way that timestamps in time tracker tables should be displayed. Uses " }); + f.createEl("a", { text: "moment.js", href: "https://momentjs.com/docs/#/parsing/string-format/" }); + f.createSpan({ text: " syntax. Clear to reset to default." }); + })).addText((t) => { + t.setValue(String(this.plugin.settings.timestampFormat)); + t.onChange((v) => __async(this, null, function* () { + this.plugin.settings.timestampFormat = v.length ? v : defaultSettings.timestampFormat; + yield this.plugin.saveSettings(); + })); + }); this.containerEl.createEl("hr"); this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" }); this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", { attr: { src: "https://ellpeck.de/res/generalsupport.png" }, cls: "simple-time-tracker-support" }); @@ -111,7 +123,7 @@ function loadTracker(json) { } return { entries: [] }; } -function displayTracker(tracker, element, getSectionInfo) { +function displayTracker(tracker, element, getSectionInfo, settings) { let running = isRunning(tracker); let btn = new import_obsidian2.ButtonComponent(element).setButtonText(running ? "End" : "Start").onClick(() => __async(this, null, function* () { if (running) { @@ -137,9 +149,9 @@ function displayTracker(tracker, element, getSectionInfo) { for (let entry of tracker.entries) { let row = table.createEl("tr"); row.createEl("td", { text: entry.name }); - row.createEl("td", { text: import_obsidian2.moment.unix(entry.startTime).format("YY-MM-DD hh:mm:ss") }); + row.createEl("td", { text: import_obsidian2.moment.unix(entry.startTime).format(settings.timestampFormat) }); if (entry.endTime) { - row.createEl("td", { text: import_obsidian2.moment.unix(entry.endTime).format("YY-MM-DD hh:mm:ss") }); + row.createEl("td", { text: import_obsidian2.moment.unix(entry.endTime).format(settings.timestampFormat) }); let duration = import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime)); row.createEl("td", { text: getCountdownDisplay(import_obsidian2.moment.duration(duration)) }); } @@ -189,7 +201,7 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian3.Plugin { this.registerMarkdownCodeBlockProcessor("simple-time-tracker", (s, e, i) => { let tracker = loadTracker(s); e.empty(); - displayTracker(tracker, e, () => i.getSectionInfo(e)); + displayTracker(tracker, e, () => i.getSectionInfo(e), this.settings); }); this.addCommand({ id: `insert-simple-time-tracker`, @@ -211,4 +223,4 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian3.Plugin { }); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2V0dGluZ3MsIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IGRpc3BsYXlUcmFja2VyLCBsb2FkVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRsZXQgdHJhY2tlciA9IGxvYWRUcmFja2VyKHMpO1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblx0XHRcdGRpc3BsYXlUcmFja2VyKHRyYWNrZXIsIGUsICgpID0+IGkuZ2V0U2VjdGlvbkluZm8oZSkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IGBpbnNlcnQtc2ltcGxlLXRpbWUtdHJhY2tlcmAsXHJcblx0XHRcdG5hbWU6IGBJbnNlcnQgVGltZSBUcmFja2VyYCxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlLCBfKSA9PiB7XHJcblx0XHRcdFx0ZS5yZXBsYWNlU2VsZWN0aW9uKFwiYGBgc2ltcGxlLXRpbWUtdHJhY2tlclxcbmBgYFxcblwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIiwgImV4cG9ydCBjb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgPSB7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIHtcclxuXHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgU2ltcGxlVGltZVRyYWNrZXJQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiU3VwZXIgU2ltcGxlIFRpbWUgVHJhY2tlciBTZXR0aW5nc1wiIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiU2V0dGluZ3MgY29taW5nIHNvb24hXCIgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vZWxscGVjay5kZS9zdXBwb3J0XCIgfSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIiB9LCBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci1zdXBwb3J0XCIgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwgImltcG9ydCB7IG1vbWVudCwgQXBwLCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiwgQnV0dG9uQ29tcG9uZW50LCBUZXh0Q29tcG9uZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHJhY2tlciB7XHJcbiAgICBlbnRyaWVzOiBFbnRyeVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudHJ5IHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHN0YXJ0VGltZTogbnVtYmVyO1xyXG4gICAgZW5kVGltZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRFbnRyeSh0cmFja2VyOiBUcmFja2VyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghbmFtZSlcclxuICAgICAgICBuYW1lID0gYFNlZ21lbnQgJHt0cmFja2VyLmVudHJpZXMubGVuZ3RoICsgMX1gO1xyXG4gICAgbGV0IGVudHJ5OiBFbnRyeSA9IHsgbmFtZTogbmFtZSwgc3RhcnRUaW1lOiBtb21lbnQoKS51bml4KCksIGVuZFRpbWU6IG51bGwgfTtcclxuICAgIHRyYWNrZXIuZW50cmllcy5wdXNoKGVudHJ5KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbmRFbnRyeSh0cmFja2VyOiBUcmFja2VyKTogdm9pZCB7XHJcbiAgICBsZXQgbGFzdCA9IHRyYWNrZXIuZW50cmllcy5sYXN0KCk7XHJcbiAgICBsYXN0LmVuZFRpbWUgPSBtb21lbnQoKS51bml4KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1J1bm5pbmcodHJhY2tlcjogVHJhY2tlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxhc3QgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgcmV0dXJuIGxhc3QgIT0gbnVsbCAmJiAhbGFzdC5lbmRUaW1lO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgYXBwOiBBcHAsIHNlY3Rpb246IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcclxuXHJcbiAgICAvLyBmaWd1cmUgb3V0IHdoYXQgcGFydCBvZiB0aGUgY29udGVudCB3ZSBoYXZlIHRvIGVkaXRcclxuICAgIGxldCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICBsZXQgcHJldiA9IGxpbmVzLmZpbHRlcigoXywgaSkgPT4gaSA8PSBzZWN0aW9uLmxpbmVTdGFydCkuam9pbihcIlxcblwiKTtcclxuICAgIGxldCBuZXh0ID0gbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpID49IHNlY3Rpb24ubGluZUVuZCkuam9pbihcIlxcblwiKTtcclxuICAgIC8vIGVkaXQgb25seSB0aGUgY29kZSBibG9jayBjb250ZW50LCBsZWF2ZSB0aGUgcmVzdCB1bnRvdWNoZWRcclxuICAgIGNvbnRlbnQgPSBgJHtwcmV2fVxcbiR7SlNPTi5zdHJpbmdpZnkodHJhY2tlcil9XFxuJHtuZXh0fWA7XHJcblxyXG4gICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUcmFja2VyKGpzb246IHN0cmluZyk6IFRyYWNrZXIge1xyXG4gICAgaWYgKGpzb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gcGFyc2UgVHJhY2tlciBmcm9tICR7anNvbn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGdldFNlY3Rpb25JbmZvOiAoKSA9PiBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbik6IHZvaWQge1xyXG4gICAgLy8gYWRkIHN0YXJ0L3N0b3AgY29udHJvbHNcclxuICAgIGxldCBydW5uaW5nID0gaXNSdW5uaW5nKHRyYWNrZXIpO1xyXG4gICAgbGV0IGJ0biA9IG5ldyBCdXR0b25Db21wb25lbnQoZWxlbWVudClcclxuICAgICAgICAuc2V0QnV0dG9uVGV4dChydW5uaW5nID8gXCJFbmRcIiA6IFwiU3RhcnRcIilcclxuICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRFbnRyeSh0cmFja2VyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RW50cnkodHJhY2tlciwgbmFtZS5nZXRWYWx1ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBzYXZlVHJhY2tlcih0cmFja2VyLCB0aGlzLmFwcCwgZ2V0U2VjdGlvbkluZm8oKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICBidG4uYnV0dG9uRWwuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyLWJ0blwiKTtcclxuICAgIGxldCBuYW1lID0gbmV3IFRleHRDb21wb25lbnQoZWxlbWVudClcclxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJTZWdtZW50IG5hbWVcIilcclxuICAgICAgICAuc2V0RGlzYWJsZWQocnVubmluZyk7XHJcbiAgICBuYW1lLmlucHV0RWwuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyLXR4dFwiKTtcclxuXHJcbiAgICAvLyBhZGQgdGltZXJzXHJcbiAgICBsZXQgdGltZXIgPSBlbGVtZW50LmNyZWF0ZURpdih7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyc1wiIH0pO1xyXG4gICAgbGV0IGN1cnJlbnREaXYgPSB0aW1lci5jcmVhdGVFbChcImRpdlwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyXCIgfSk7XHJcbiAgICBsZXQgY3VycmVudCA9IGN1cnJlbnREaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiIH0pO1xyXG4gICAgY3VycmVudERpdi5jcmVhdGVFbChcInNwYW5cIiwgeyB0ZXh0OiBcIkN1cnJlbnRcIiB9KTtcclxuICAgIGxldCB0b3RhbERpdiA9IHRpbWVyLmNyZWF0ZUVsKFwiZGl2XCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJcIiB9KTtcclxuICAgIGxldCB0b3RhbCA9IHRvdGFsRGl2LmNyZWF0ZUVsKFwic3BhblwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyLXRpbWVcIiwgdGV4dDogXCIwc1wiIH0pO1xyXG4gICAgdG90YWxEaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgdGV4dDogXCJUb3RhbFwiIH0pO1xyXG5cclxuICAgIC8vIGFkZCB0YWJsZVxyXG4gICAgaWYgKHRyYWNrZXIuZW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHRhYmxlID0gZWxlbWVudC5jcmVhdGVFbChcInRhYmxlXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGFibGVcIiB9KTtcclxuICAgICAgICB0YWJsZS5jcmVhdGVFbChcInRyXCIpLmFwcGVuZChcclxuICAgICAgICAgICAgY3JlYXRlRWwoXCJ0aFwiLCB7IHRleHQ6IFwiU2VnbWVudFwiIH0pLFxyXG4gICAgICAgICAgICBjcmVhdGVFbChcInRoXCIsIHsgdGV4dDogXCJTdGFydCB0aW1lXCIgfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIkVuZCB0aW1lXCIgfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIlRvdGFsXCIgfSkpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB0cmFja2VyLmVudHJpZXMpIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IHRhYmxlLmNyZWF0ZUVsKFwidHJcIik7XHJcbiAgICAgICAgICAgIHJvdy5jcmVhdGVFbChcInRkXCIsIHsgdGV4dDogZW50cnkubmFtZSB9KTtcclxuICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpLmZvcm1hdChcIllZLU1NLUREIGhoOm1tOnNzXCIpIH0pO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkuZW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKS5mb3JtYXQoXCJZWS1NTS1ERCBoaDptbTpzc1wiKSB9KTtcclxuICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IG1vbWVudC51bml4KGVudHJ5LmVuZFRpbWUpLmRpZmYobW9tZW50LnVuaXgoZW50cnkuc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgICAgICAgICByb3cuY3JlYXRlRWwoXCJ0ZFwiLCB7IHRleHQ6IGdldENvdW50ZG93bkRpc3BsYXkobW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKSkgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q291bnRkb3duVmFsdWVzKHRyYWNrZXIsIGN1cnJlbnQsIHRvdGFsLCBjdXJyZW50RGl2KTtcclxuICAgIGxldCBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvLyB3ZSBkZWxldGUgdGhlIGludGVydmFsIHRpbWVyIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG4gICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlciwgY3VycmVudCwgdG90YWwsIGN1cnJlbnREaXYpO1xyXG4gICAgfSwgMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldENvdW50ZG93bkRpc3BsYXkoZHVyYXRpb246IG1vbWVudC5EdXJhdGlvbik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmV0ID0gXCJcIjtcclxuICAgIGlmIChkdXJhdGlvbi5ob3VycygpID4gMClcclxuICAgICAgICByZXQgKz0gZHVyYXRpb24uaG91cnMoKSArIFwiaCBcIjtcclxuICAgIGlmIChkdXJhdGlvbi5taW51dGVzKCkgPiAwKVxyXG4gICAgICAgIHJldCArPSBkdXJhdGlvbi5taW51dGVzKCkgKyBcIm0gXCI7XHJcbiAgICByZXQgKz0gZHVyYXRpb24uc2Vjb25kcygpICsgXCJzXCI7XHJcbiAgICByZXR1cm4gcmV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlcjogVHJhY2tlciwgY3VycmVudDogSFRNTEVsZW1lbnQsIHRvdGFsOiBIVE1MRWxlbWVudCwgY3VycmVudERpdjogSFRNTERpdkVsZW1lbnQpIHtcclxuICAgIGxldCBjdXJyRW50cnkgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgaWYgKGN1cnJFbnRyeSkge1xyXG4gICAgICAgIGlmICghY3VyckVudHJ5LmVuZFRpbWUpIHtcclxuICAgICAgICAgICAgbGV0IGN1cnJEdXJhdGlvbiA9IG1vbWVudCgpLmRpZmYobW9tZW50LnVuaXgoY3VyckVudHJ5LnN0YXJ0VGltZSkpO1xyXG4gICAgICAgICAgICBjdXJyZW50LnNldFRleHQoZ2V0Q291bnRkb3duRGlzcGxheShtb21lbnQuZHVyYXRpb24oY3VyckR1cmF0aW9uKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvdGFsRHVyYXRpb24gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRyYWNrZXIuZW50cmllcykge1xyXG4gICAgICAgICAgICBsZXQgZW5kVGltZSA9IGVudHJ5LmVuZFRpbWUgPyBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKSA6IG1vbWVudCgpO1xyXG4gICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IGVuZFRpbWUuZGlmZihtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdG90YWwuc2V0VGV4dChnZXRDb3VudGRvd25EaXNwbGF5KG1vbWVudC5kdXJhdGlvbih0b3RhbER1cmF0aW9uKSkpO1xyXG4gICAgfVxyXG4gICAgY3VycmVudERpdi5oaWRkZW4gPSAhY3VyckVudHJ5IHx8ICEhY3VyckVudHJ5LmVuZFRpbWU7XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUF1Qjs7O0FDQWhCLElBQU0sa0JBQTZDOzs7QUNBMUQsc0JBQXNDO0FBRy9CLGlEQUEyQyxpQ0FBaUI7QUFBQSxFQUkvRCxZQUFZLEtBQVUsUUFBaUM7QUFDbkQsVUFBTSxLQUFLO0FBQ1gsU0FBSyxTQUFTO0FBQUE7QUFBQSxFQUdsQixVQUFnQjtBQUNaLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVksU0FBUyxNQUFNLEVBQUUsTUFBTTtBQUV4QyxTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUUsTUFBTTtBQUV2QyxTQUFLLFlBQVksU0FBUztBQUMxQixTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUUsTUFBTTtBQUN2QyxTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUUsTUFBTSxnQ0FDbEMsU0FBUyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssK0NBQStDLEtBQUs7QUFBQTtBQUFBOzs7QUNyQmhHLHVCQUF3RjtBQVlqRixvQkFBb0IsU0FBa0IsTUFBb0I7QUFDN0QsTUFBSSxDQUFDO0FBQ0QsV0FBTyxXQUFXLFFBQVEsUUFBUSxTQUFTO0FBQy9DLE1BQUksUUFBZSxFQUFFLE1BQVksV0FBVywrQkFBUyxRQUFRLFNBQVM7QUFDdEUsVUFBUSxRQUFRLEtBQUs7QUFBQTtBQUdsQixrQkFBa0IsU0FBd0I7QUFDN0MsTUFBSSxPQUFPLFFBQVEsUUFBUTtBQUMzQixPQUFLLFVBQVUsK0JBQVM7QUFBQTtBQUdyQixtQkFBbUIsU0FBMkI7QUFDakQsTUFBSSxPQUFPLFFBQVEsUUFBUTtBQUMzQixTQUFPLFFBQVEsUUFBUSxDQUFDLEtBQUs7QUFBQTtBQUdqQyxxQkFBa0MsU0FBa0IsS0FBVSxTQUFvRDtBQUFBO0FBQzlHLFFBQUksT0FBTyxJQUFJLFVBQVU7QUFDekIsUUFBSSxVQUFVLE1BQU0sSUFBSSxNQUFNLFdBQVc7QUFHekMsUUFBSSxRQUFRLFFBQVEsTUFBTTtBQUMxQixRQUFJLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxNQUFNLEtBQUssUUFBUSxXQUFXLEtBQUs7QUFDL0QsUUFBSSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxLQUFLLFFBQVEsU0FBUyxLQUFLO0FBRTdELGNBQVUsR0FBRztBQUFBLEVBQVMsS0FBSyxVQUFVO0FBQUEsRUFBYTtBQUVsRCxVQUFNLElBQUksTUFBTSxPQUFPLE1BQU07QUFBQTtBQUFBO0FBRzFCLHFCQUFxQixNQUF1QjtBQUMvQyxNQUFJLE1BQU07QUFDTixRQUFJO0FBQ0EsYUFBTyxLQUFLLE1BQU07QUFBQSxhQUNiLEdBQVA7QUFDRSxjQUFRLElBQUksZ0NBQWdDO0FBQUE7QUFBQTtBQUdwRCxTQUFPLEVBQUUsU0FBUztBQUFBO0FBR2Ysd0JBQXdCLFNBQWtCLFNBQXNCLGdCQUF3RDtBQUUzSCxNQUFJLFVBQVUsVUFBVTtBQUN4QixNQUFJLE1BQU0sSUFBSSxpQ0FBZ0IsU0FDekIsY0FBYyxVQUFVLFFBQVEsU0FDaEMsUUFBUSxNQUFZO0FBQ2pCLFFBQUksU0FBUztBQUNULGVBQVM7QUFBQSxXQUNOO0FBQ0gsaUJBQVcsU0FBUyxLQUFLO0FBQUE7QUFFN0IsVUFBTSxZQUFZLFNBQVMsS0FBSyxLQUFLO0FBQUE7QUFFN0MsTUFBSSxTQUFTLFNBQVM7QUFDdEIsTUFBSSxPQUFPLElBQUksK0JBQWMsU0FDeEIsZUFBZSxnQkFDZixZQUFZO0FBQ2pCLE9BQUssUUFBUSxTQUFTO0FBR3RCLE1BQUksUUFBUSxRQUFRLFVBQVUsRUFBRSxLQUFLO0FBQ3JDLE1BQUksYUFBYSxNQUFNLFNBQVMsT0FBTyxFQUFFLEtBQUs7QUFDOUMsTUFBSSxVQUFVLFdBQVcsU0FBUyxRQUFRLEVBQUUsS0FBSztBQUNqRCxhQUFXLFNBQVMsUUFBUSxFQUFFLE1BQU07QUFDcEMsTUFBSSxXQUFXLE1BQU0sU0FBUyxPQUFPLEVBQUUsS0FBSztBQUM1QyxNQUFJLFFBQVEsU0FBUyxTQUFTLFFBQVEsRUFBRSxLQUFLLGtDQUFrQyxNQUFNO0FBQ3JGLFdBQVMsU0FBUyxRQUFRLEVBQUUsTUFBTTtBQUdsQyxNQUFJLFFBQVEsUUFBUSxTQUFTLEdBQUc7QUFDNUIsUUFBSSxRQUFRLFFBQVEsU0FBUyxTQUFTLEVBQUUsS0FBSztBQUM3QyxVQUFNLFNBQVMsTUFBTSxPQUNqQixTQUFTLE1BQU0sRUFBRSxNQUFNLGNBQ3ZCLFNBQVMsTUFBTSxFQUFFLE1BQU0saUJBQ3ZCLFNBQVMsTUFBTSxFQUFFLE1BQU0sZUFDdkIsU0FBUyxNQUFNLEVBQUUsTUFBTTtBQUUzQixhQUFTLFNBQVMsUUFBUSxTQUFTO0FBQy9CLFVBQUksTUFBTSxNQUFNLFNBQVM7QUFDekIsVUFBSSxTQUFTLE1BQU0sRUFBRSxNQUFNLE1BQU07QUFDakMsVUFBSSxTQUFTLE1BQU0sRUFBRSxNQUFNLHdCQUFPLEtBQUssTUFBTSxXQUFXLE9BQU87QUFDL0QsVUFBSSxNQUFNLFNBQVM7QUFDZixZQUFJLFNBQVMsTUFBTSxFQUFFLE1BQU0sd0JBQU8sS0FBSyxNQUFNLFNBQVMsT0FBTztBQUM3RCxZQUFJLFdBQVcsd0JBQU8sS0FBSyxNQUFNLFNBQVMsS0FBSyx3QkFBTyxLQUFLLE1BQU07QUFDakUsWUFBSSxTQUFTLE1BQU0sRUFBRSxNQUFNLG9CQUFvQix3QkFBTyxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBSzNFLHFCQUFtQixTQUFTLFNBQVMsT0FBTztBQUM1QyxNQUFJLGFBQWEsT0FBTyxZQUFZLE1BQU07QUFFdEMsUUFBSSxDQUFDLFFBQVEsYUFBYTtBQUN0QixhQUFPLGNBQWM7QUFDckI7QUFBQTtBQUVKLHVCQUFtQixTQUFTLFNBQVMsT0FBTztBQUFBLEtBQzdDO0FBQUE7QUFHUCw2QkFBNkIsVUFBbUM7QUFDNUQsTUFBSSxNQUFNO0FBQ1YsTUFBSSxTQUFTLFVBQVU7QUFDbkIsV0FBTyxTQUFTLFVBQVU7QUFDOUIsTUFBSSxTQUFTLFlBQVk7QUFDckIsV0FBTyxTQUFTLFlBQVk7QUFDaEMsU0FBTyxTQUFTLFlBQVk7QUFDNUIsU0FBTztBQUFBO0FBR1gsNEJBQTRCLFNBQWtCLFNBQXNCLE9BQW9CLFlBQTRCO0FBQ2hILE1BQUksWUFBWSxRQUFRLFFBQVE7QUFDaEMsTUFBSSxXQUFXO0FBQ1gsUUFBSSxDQUFDLFVBQVUsU0FBUztBQUNwQixVQUFJLGVBQWUsK0JBQVMsS0FBSyx3QkFBTyxLQUFLLFVBQVU7QUFDdkQsY0FBUSxRQUFRLG9CQUFvQix3QkFBTyxTQUFTO0FBQUE7QUFHeEQsUUFBSSxnQkFBZ0I7QUFDcEIsYUFBUyxTQUFTLFFBQVEsU0FBUztBQUMvQixVQUFJLFVBQVUsTUFBTSxVQUFVLHdCQUFPLEtBQUssTUFBTSxXQUFXO0FBQzNELHVCQUFpQixRQUFRLEtBQUssd0JBQU8sS0FBSyxNQUFNO0FBQUE7QUFFcEQsVUFBTSxRQUFRLG9CQUFvQix3QkFBTyxTQUFTO0FBQUE7QUFFdEQsYUFBVyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVTtBQUFBOzs7QUh0SWxELDRDQUFxRCx3QkFBTztBQUFBLEVBSXJELFNBQXdCO0FBQUE7QUFDN0IsWUFBTSxLQUFLO0FBRVgsV0FBSyxjQUFjLElBQUksNkJBQTZCLEtBQUssS0FBSztBQUU5RCxXQUFLLG1DQUFtQyx1QkFBdUIsQ0FBQyxHQUFHLEdBQUcsTUFBTTtBQUMzRSxZQUFJLFVBQVUsWUFBWTtBQUMxQixVQUFFO0FBQ0YsdUJBQWUsU0FBUyxHQUFHLE1BQU0sRUFBRSxlQUFlO0FBQUE7QUFHbkQsV0FBSyxXQUFXO0FBQUEsUUFDZixJQUFJO0FBQUEsUUFDSixNQUFNO0FBQUEsUUFDTixnQkFBZ0IsQ0FBQyxHQUFHLE1BQU07QUFDekIsWUFBRSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2hCLGVBQWU7QUFBQTtBQUNwQixXQUFLLFdBQVcsT0FBTyxPQUFPLElBQUksaUJBQWlCLE1BQU0sS0FBSztBQUFBO0FBQUE7QUFBQSxFQUd6RCxlQUFlO0FBQUE7QUFDcEIsWUFBTSxLQUFLLFNBQVMsS0FBSztBQUFBO0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2V0dGluZ3MsIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IGRpc3BsYXlUcmFja2VyLCBsb2FkVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRsZXQgdHJhY2tlciA9IGxvYWRUcmFja2VyKHMpO1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblx0XHRcdGRpc3BsYXlUcmFja2VyKHRyYWNrZXIsIGUsICgpID0+IGkuZ2V0U2VjdGlvbkluZm8oZSksIHRoaXMuc2V0dGluZ3MpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IGBpbnNlcnQtc2ltcGxlLXRpbWUtdHJhY2tlcmAsXHJcblx0XHRcdG5hbWU6IGBJbnNlcnQgVGltZSBUcmFja2VyYCxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlLCBfKSA9PiB7XHJcblx0XHRcdFx0ZS5yZXBsYWNlU2VsZWN0aW9uKFwiYGBgc2ltcGxlLXRpbWUtdHJhY2tlclxcbmBgYFxcblwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIiwgImV4cG9ydCBjb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgPSB7XHJcbiAgICB0aW1lc3RhbXBGb3JtYXQ6IFwiWVktTU0tREQgaGg6bW06c3NcIlxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIHtcclxuXHJcbiAgICB0aW1lc3RhbXBGb3JtYXQ6IHN0cmluZztcclxuXHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgU2ltcGxlVGltZVRyYWNrZXJQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiU3VwZXIgU2ltcGxlIFRpbWUgVHJhY2tlciBTZXR0aW5nc1wiIH0pO1xyXG5cclxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZShcIlRpbWVzdGFtcCBEaXNwbGF5IEZvcm1hdFwiKVxyXG4gICAgICAgICAgICAuc2V0RGVzYyhjcmVhdGVGcmFnbWVudChmID0+IHtcclxuICAgICAgICAgICAgICAgIGYuY3JlYXRlU3Bhbih7IHRleHQ6IFwiVGhlIHdheSB0aGF0IHRpbWVzdGFtcHMgaW4gdGltZSB0cmFja2VyIHRhYmxlcyBzaG91bGQgYmUgZGlzcGxheWVkLiBVc2VzIFwiIH0pO1xyXG4gICAgICAgICAgICAgICAgZi5jcmVhdGVFbChcImFcIiwgeyB0ZXh0OiBcIm1vbWVudC5qc1wiLCBocmVmOiBcImh0dHBzOi8vbW9tZW50anMuY29tL2RvY3MvIy9wYXJzaW5nL3N0cmluZy1mb3JtYXQvXCIgfSk7XHJcbiAgICAgICAgICAgICAgICBmLmNyZWF0ZVNwYW4oeyB0ZXh0OiBcIiBzeW50YXguIENsZWFyIHRvIHJlc2V0IHRvIGRlZmF1bHQuXCIgfSk7XHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAuYWRkVGV4dCh0ID0+IHtcclxuICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoU3RyaW5nKHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcEZvcm1hdCkpO1xyXG4gICAgICAgICAgICAgICAgdC5vbkNoYW5nZShhc3luYyB2ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50aW1lc3RhbXBGb3JtYXQgPSB2Lmxlbmd0aCA/IHYgOiBkZWZhdWx0U2V0dGluZ3MudGltZXN0YW1wRm9ybWF0O1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBcIklmIHlvdSBsaWtlIHRoaXMgcGx1Z2luIGFuZCB3YW50IHRvIHN1cHBvcnQgaXRzIGRldmVsb3BtZW50LCB5b3UgY2FuIGRvIHNvIHRocm91Z2ggbXkgd2Vic2l0ZSBieSBjbGlja2luZyB0aGlzIGZhbmN5IGltYWdlIVwiIH0pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJhXCIsIHsgaHJlZjogXCJodHRwczovL2VsbHBlY2suZGUvc3VwcG9ydFwiIH0pXHJcbiAgICAgICAgICAgIC5jcmVhdGVFbChcImltZ1wiLCB7IGF0dHI6IHsgc3JjOiBcImh0dHBzOi8vZWxscGVjay5kZS9yZXMvZ2VuZXJhbHN1cHBvcnQucG5nXCIgfSwgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItc3VwcG9ydFwiIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBtb21lbnQsIEFwcCwgTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24sIEJ1dHRvbkNvbXBvbmVudCwgVGV4dENvbXBvbmVudCB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmFja2VyIHtcclxuICAgIGVudHJpZXM6IEVudHJ5W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50cnkge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XHJcbiAgICBlbmRUaW1lOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdGFydEVudHJ5KHRyYWNrZXI6IFRyYWNrZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFuYW1lKVxyXG4gICAgICAgIG5hbWUgPSBgU2VnbWVudCAke3RyYWNrZXIuZW50cmllcy5sZW5ndGggKyAxfWA7XHJcbiAgICBsZXQgZW50cnk6IEVudHJ5ID0geyBuYW1lOiBuYW1lLCBzdGFydFRpbWU6IG1vbWVudCgpLnVuaXgoKSwgZW5kVGltZTogbnVsbCB9O1xyXG4gICAgdHJhY2tlci5lbnRyaWVzLnB1c2goZW50cnkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVuZEVudHJ5KHRyYWNrZXI6IFRyYWNrZXIpOiB2b2lkIHtcclxuICAgIGxldCBsYXN0ID0gdHJhY2tlci5lbnRyaWVzLmxhc3QoKTtcclxuICAgIGxhc3QuZW5kVGltZSA9IG1vbWVudCgpLnVuaXgoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUnVubmluZyh0cmFja2VyOiBUcmFja2VyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGFzdCA9IHRyYWNrZXIuZW50cmllcy5sYXN0KCk7XHJcbiAgICByZXR1cm4gbGFzdCAhPSBudWxsICYmICFsYXN0LmVuZFRpbWU7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVHJhY2tlcih0cmFja2VyOiBUcmFja2VyLCBhcHA6IEFwcCwgc2VjdGlvbjogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmaWxlID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XHJcbiAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xyXG5cclxuICAgIC8vIGZpZ3VyZSBvdXQgd2hhdCBwYXJ0IG9mIHRoZSBjb250ZW50IHdlIGhhdmUgdG8gZWRpdFxyXG4gICAgbGV0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuICAgIGxldCBwcmV2ID0gbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpIDw9IHNlY3Rpb24ubGluZVN0YXJ0KS5qb2luKFwiXFxuXCIpO1xyXG4gICAgbGV0IG5leHQgPSBsaW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgPj0gc2VjdGlvbi5saW5lRW5kKS5qb2luKFwiXFxuXCIpO1xyXG4gICAgLy8gZWRpdCBvbmx5IHRoZSBjb2RlIGJsb2NrIGNvbnRlbnQsIGxlYXZlIHRoZSByZXN0IHVudG91Y2hlZFxyXG4gICAgY29udGVudCA9IGAke3ByZXZ9XFxuJHtKU09OLnN0cmluZ2lmeSh0cmFja2VyKX1cXG4ke25leHR9YDtcclxuXHJcbiAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIGNvbnRlbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZFRyYWNrZXIoanNvbjogc3RyaW5nKTogVHJhY2tlciB7XHJcbiAgICBpZiAoanNvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBwYXJzZSBUcmFja2VyIGZyb20gJHtqc29ufWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5VHJhY2tlcih0cmFja2VyOiBUcmFja2VyLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0U2VjdGlvbkluZm86ICgpID0+IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLCBzZXR0aW5nczogU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyk6IHZvaWQge1xyXG4gICAgLy8gYWRkIHN0YXJ0L3N0b3AgY29udHJvbHNcclxuICAgIGxldCBydW5uaW5nID0gaXNSdW5uaW5nKHRyYWNrZXIpO1xyXG4gICAgbGV0IGJ0biA9IG5ldyBCdXR0b25Db21wb25lbnQoZWxlbWVudClcclxuICAgICAgICAuc2V0QnV0dG9uVGV4dChydW5uaW5nID8gXCJFbmRcIiA6IFwiU3RhcnRcIilcclxuICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRFbnRyeSh0cmFja2VyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RW50cnkodHJhY2tlciwgbmFtZS5nZXRWYWx1ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBzYXZlVHJhY2tlcih0cmFja2VyLCB0aGlzLmFwcCwgZ2V0U2VjdGlvbkluZm8oKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICBidG4uYnV0dG9uRWwuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyLWJ0blwiKTtcclxuICAgIGxldCBuYW1lID0gbmV3IFRleHRDb21wb25lbnQoZWxlbWVudClcclxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJTZWdtZW50IG5hbWVcIilcclxuICAgICAgICAuc2V0RGlzYWJsZWQocnVubmluZyk7XHJcbiAgICBuYW1lLmlucHV0RWwuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyLXR4dFwiKTtcclxuXHJcbiAgICAvLyBhZGQgdGltZXJzXHJcbiAgICBsZXQgdGltZXIgPSBlbGVtZW50LmNyZWF0ZURpdih7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyc1wiIH0pO1xyXG4gICAgbGV0IGN1cnJlbnREaXYgPSB0aW1lci5jcmVhdGVFbChcImRpdlwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyXCIgfSk7XHJcbiAgICBsZXQgY3VycmVudCA9IGN1cnJlbnREaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiIH0pO1xyXG4gICAgY3VycmVudERpdi5jcmVhdGVFbChcInNwYW5cIiwgeyB0ZXh0OiBcIkN1cnJlbnRcIiB9KTtcclxuICAgIGxldCB0b3RhbERpdiA9IHRpbWVyLmNyZWF0ZUVsKFwiZGl2XCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJcIiB9KTtcclxuICAgIGxldCB0b3RhbCA9IHRvdGFsRGl2LmNyZWF0ZUVsKFwic3BhblwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyLXRpbWVcIiwgdGV4dDogXCIwc1wiIH0pO1xyXG4gICAgdG90YWxEaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgdGV4dDogXCJUb3RhbFwiIH0pO1xyXG5cclxuICAgIC8vIGFkZCB0YWJsZVxyXG4gICAgaWYgKHRyYWNrZXIuZW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHRhYmxlID0gZWxlbWVudC5jcmVhdGVFbChcInRhYmxlXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGFibGVcIiB9KTtcclxuICAgICAgICB0YWJsZS5jcmVhdGVFbChcInRyXCIpLmFwcGVuZChcclxuICAgICAgICAgICAgY3JlYXRlRWwoXCJ0aFwiLCB7IHRleHQ6IFwiU2VnbWVudFwiIH0pLFxyXG4gICAgICAgICAgICBjcmVhdGVFbChcInRoXCIsIHsgdGV4dDogXCJTdGFydCB0aW1lXCIgfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIkVuZCB0aW1lXCIgfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIlRvdGFsXCIgfSkpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB0cmFja2VyLmVudHJpZXMpIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IHRhYmxlLmNyZWF0ZUVsKFwidHJcIik7XHJcbiAgICAgICAgICAgIHJvdy5jcmVhdGVFbChcInRkXCIsIHsgdGV4dDogZW50cnkubmFtZSB9KTtcclxuICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpLmZvcm1hdChzZXR0aW5ncy50aW1lc3RhbXBGb3JtYXQpIH0pO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkuZW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKS5mb3JtYXQoc2V0dGluZ3MudGltZXN0YW1wRm9ybWF0KSB9KTtcclxuICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IG1vbWVudC51bml4KGVudHJ5LmVuZFRpbWUpLmRpZmYobW9tZW50LnVuaXgoZW50cnkuc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgICAgICAgICByb3cuY3JlYXRlRWwoXCJ0ZFwiLCB7IHRleHQ6IGdldENvdW50ZG93bkRpc3BsYXkobW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKSkgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q291bnRkb3duVmFsdWVzKHRyYWNrZXIsIGN1cnJlbnQsIHRvdGFsLCBjdXJyZW50RGl2KTtcclxuICAgIGxldCBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvLyB3ZSBkZWxldGUgdGhlIGludGVydmFsIHRpbWVyIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG4gICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlciwgY3VycmVudCwgdG90YWwsIGN1cnJlbnREaXYpO1xyXG4gICAgfSwgMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldENvdW50ZG93bkRpc3BsYXkoZHVyYXRpb246IG1vbWVudC5EdXJhdGlvbik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmV0ID0gXCJcIjtcclxuICAgIGlmIChkdXJhdGlvbi5ob3VycygpID4gMClcclxuICAgICAgICByZXQgKz0gZHVyYXRpb24uaG91cnMoKSArIFwiaCBcIjtcclxuICAgIGlmIChkdXJhdGlvbi5taW51dGVzKCkgPiAwKVxyXG4gICAgICAgIHJldCArPSBkdXJhdGlvbi5taW51dGVzKCkgKyBcIm0gXCI7XHJcbiAgICByZXQgKz0gZHVyYXRpb24uc2Vjb25kcygpICsgXCJzXCI7XHJcbiAgICByZXR1cm4gcmV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlcjogVHJhY2tlciwgY3VycmVudDogSFRNTEVsZW1lbnQsIHRvdGFsOiBIVE1MRWxlbWVudCwgY3VycmVudERpdjogSFRNTERpdkVsZW1lbnQpIHtcclxuICAgIGxldCBjdXJyRW50cnkgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgaWYgKGN1cnJFbnRyeSkge1xyXG4gICAgICAgIGlmICghY3VyckVudHJ5LmVuZFRpbWUpIHtcclxuICAgICAgICAgICAgbGV0IGN1cnJEdXJhdGlvbiA9IG1vbWVudCgpLmRpZmYobW9tZW50LnVuaXgoY3VyckVudHJ5LnN0YXJ0VGltZSkpO1xyXG4gICAgICAgICAgICBjdXJyZW50LnNldFRleHQoZ2V0Q291bnRkb3duRGlzcGxheShtb21lbnQuZHVyYXRpb24oY3VyckR1cmF0aW9uKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvdGFsRHVyYXRpb24gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRyYWNrZXIuZW50cmllcykge1xyXG4gICAgICAgICAgICBsZXQgZW5kVGltZSA9IGVudHJ5LmVuZFRpbWUgPyBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKSA6IG1vbWVudCgpO1xyXG4gICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IGVuZFRpbWUuZGlmZihtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdG90YWwuc2V0VGV4dChnZXRDb3VudGRvd25EaXNwbGF5KG1vbWVudC5kdXJhdGlvbih0b3RhbER1cmF0aW9uKSkpO1xyXG4gICAgfVxyXG4gICAgY3VycmVudERpdi5oaWRkZW4gPSAhY3VyckVudHJ5IHx8ICEhY3VyckVudHJ5LmVuZFRpbWU7XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUF1Qjs7O0FDQWhCLElBQU0sa0JBQTZDO0FBQUEsRUFDdEQsaUJBQWlCO0FBQUE7OztBQ0RyQixzQkFBK0M7QUFJeEMsaURBQTJDLGlDQUFpQjtBQUFBLEVBSS9ELFlBQVksS0FBVSxRQUFpQztBQUNuRCxVQUFNLEtBQUs7QUFDWCxTQUFLLFNBQVM7QUFBQTtBQUFBLEVBR2xCLFVBQWdCO0FBQ1osU0FBSyxZQUFZO0FBQ2pCLFNBQUssWUFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNO0FBRXhDLFFBQUksd0JBQVEsS0FBSyxhQUNaLFFBQVEsNEJBQ1IsUUFBUSxlQUFlLE9BQUs7QUFDekIsUUFBRSxXQUFXLEVBQUUsTUFBTTtBQUNyQixRQUFFLFNBQVMsS0FBSyxFQUFFLE1BQU0sYUFBYSxNQUFN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