var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); // wwwroot/ts/modules/sidebar.ts var _SidebarController = class _SidebarController { constructor() { this.menuToggle = null; this.appLayout = null; this.menuTooltip = null; this.menuToggle = document.getElementById("menuToggle"); this.appLayout = document.querySelector("swp-app-layout"); this.menuTooltip = document.getElementById("menuTooltip"); this.setupListeners(); this.setupTooltips(); this.restoreState(); } /** * Check if sidebar is collapsed */ get isCollapsed() { return this.appLayout?.classList.contains("menu-collapsed") ?? false; } /** * Toggle sidebar collapsed state */ toggle() { if (!this.appLayout) return; this.appLayout.classList.toggle("menu-collapsed"); localStorage.setItem("sidebar-collapsed", String(this.isCollapsed)); } /** * Collapse the sidebar */ collapse() { this.appLayout?.classList.add("menu-collapsed"); localStorage.setItem("sidebar-collapsed", "true"); } /** * Expand the sidebar */ expand() { this.appLayout?.classList.remove("menu-collapsed"); localStorage.setItem("sidebar-collapsed", "false"); } setupListeners() { this.menuToggle?.addEventListener("click", () => this.toggle()); } setupTooltips() { if (!this.menuTooltip) return; const menuItems = document.querySelectorAll("swp-side-menu-item[data-tooltip]"); menuItems.forEach((item) => { item.addEventListener("mouseenter", () => this.showTooltip(item)); item.addEventListener("mouseleave", () => this.hideTooltip()); }); } showTooltip(item) { if (!this.isCollapsed || !this.menuTooltip) return; const rect = item.getBoundingClientRect(); const tooltipText = item.dataset.tooltip; if (!tooltipText) return; this.menuTooltip.textContent = tooltipText; this.menuTooltip.style.left = `${rect.right + 8}px`; this.menuTooltip.style.top = `${rect.top + rect.height / 2}px`; this.menuTooltip.style.transform = "translateY(-50%)"; this.menuTooltip.showPopover(); } hideTooltip() { this.menuTooltip?.hidePopover(); } restoreState() { if (!this.appLayout) return; if (localStorage.getItem("sidebar-collapsed") === "true") { this.appLayout.classList.add("menu-collapsed"); } } }; __name(_SidebarController, "SidebarController"); var SidebarController = _SidebarController; // wwwroot/ts/modules/drawers.ts var _DrawerController = class _DrawerController { constructor() { this.profileDrawer = null; this.notificationDrawer = null; this.todoDrawer = null; this.newTodoDrawer = null; this.overlay = null; this.activeDrawer = null; this.profileDrawer = document.getElementById("profileDrawer"); this.notificationDrawer = document.getElementById("notificationDrawer"); this.todoDrawer = document.getElementById("todoDrawer"); this.newTodoDrawer = document.getElementById("newTodoDrawer"); this.overlay = document.getElementById("drawerOverlay"); this.setupListeners(); } /** * Get currently active drawer name */ get active() { return this.activeDrawer; } /** * Open a drawer by name */ open(name) { this.closeAll(); const drawer = this.getDrawer(name); if (drawer && this.overlay) { drawer.classList.add("active"); this.overlay.classList.add("active"); document.body.style.overflow = "hidden"; this.activeDrawer = name; } } /** * Close a specific drawer */ close(name) { const drawer = this.getDrawer(name); drawer?.classList.remove("active"); if (this.overlay && !document.querySelector('.active[class*="drawer"]')) { this.overlay.classList.remove("active"); document.body.style.overflow = ""; } if (this.activeDrawer === name) { this.activeDrawer = null; } } /** * Close all drawers */ closeAll() { [this.profileDrawer, this.notificationDrawer, this.todoDrawer, this.newTodoDrawer].forEach((drawer) => drawer?.classList.remove("active")); this.overlay?.classList.remove("active"); document.body.style.overflow = ""; this.activeDrawer = null; } /** * Open profile drawer */ openProfile() { this.open("profile"); } /** * Open notification drawer */ openNotification() { this.open("notification"); } /** * Open todo drawer (slides on top of profile) */ openTodo() { this.todoDrawer?.classList.add("active"); } /** * Close todo drawer */ closeTodo() { this.todoDrawer?.classList.remove("active"); this.closeNewTodo(); } /** * Open new todo drawer */ openNewTodo() { this.newTodoDrawer?.classList.add("active"); } /** * Close new todo drawer */ closeNewTodo() { this.newTodoDrawer?.classList.remove("active"); } /** * Mark all notifications as read */ markAllNotificationsRead() { if (!this.notificationDrawer) return; const unreadItems = this.notificationDrawer.querySelectorAll( 'swp-notification-item[data-unread="true"]' ); unreadItems.forEach((item) => item.removeAttribute("data-unread")); const badge = document.querySelector("swp-notification-badge"); if (badge) { badge.style.display = "none"; } } getDrawer(name) { switch (name) { case "profile": return this.profileDrawer; case "notification": return this.notificationDrawer; case "todo": return this.todoDrawer; case "newTodo": return this.newTodoDrawer; } } setupListeners() { document.getElementById("profileTrigger")?.addEventListener("click", () => this.openProfile()); document.getElementById("drawerClose")?.addEventListener("click", () => this.close("profile")); document.getElementById("notificationsBtn")?.addEventListener("click", () => this.openNotification()); document.getElementById("notificationDrawerClose")?.addEventListener("click", () => this.close("notification")); document.getElementById("markAllRead")?.addEventListener("click", () => this.markAllNotificationsRead()); document.getElementById("openTodoDrawer")?.addEventListener("click", () => this.openTodo()); document.getElementById("todoDrawerBack")?.addEventListener("click", () => this.closeTodo()); document.getElementById("addTodoBtn")?.addEventListener("click", () => this.openNewTodo()); document.getElementById("newTodoDrawerBack")?.addEventListener("click", () => this.closeNewTodo()); document.getElementById("cancelNewTodo")?.addEventListener("click", () => this.closeNewTodo()); document.getElementById("saveNewTodo")?.addEventListener("click", () => this.closeNewTodo()); this.overlay?.addEventListener("click", () => this.closeAll()); document.addEventListener("keydown", (e) => { if (e.key === "Escape") this.closeAll(); }); this.todoDrawer?.addEventListener("click", (e) => this.handleTodoClick(e)); document.addEventListener("click", (e) => this.handleVisibilityClick(e)); } handleTodoClick(e) { const target = e.target; const todoItem = target.closest("swp-todo-item"); const checkbox = target.closest("swp-todo-checkbox"); if (checkbox && todoItem) { const isCompleted = todoItem.dataset.completed === "true"; if (isCompleted) { todoItem.removeAttribute("data-completed"); } else { todoItem.dataset.completed = "true"; } } const sectionHeader = target.closest("swp-todo-section-header"); if (sectionHeader) { const section = sectionHeader.closest("swp-todo-section"); section?.classList.toggle("collapsed"); } } handleVisibilityClick(e) { const target = e.target; const option = target.closest("swp-visibility-option"); if (option) { document.querySelectorAll("swp-visibility-option").forEach((o) => o.classList.remove("active")); option.classList.add("active"); } } }; __name(_DrawerController, "DrawerController"); var DrawerController = _DrawerController; // wwwroot/ts/modules/theme.ts var _ThemeController = class _ThemeController { constructor() { this.root = document.documentElement; this.themeOptions = document.querySelectorAll("swp-theme-option"); this.applyTheme(this.current); this.updateUI(); this.setupListeners(); } /** * Get the current theme setting */ get current() { const stored = localStorage.getItem(_ThemeController.STORAGE_KEY); if (stored === "dark" || stored === "light" || stored === "system") { return stored; } return "system"; } /** * Check if dark mode is currently active */ get isDark() { return this.root.classList.contains(_ThemeController.DARK_CLASS) || this.systemPrefersDark && !this.root.classList.contains(_ThemeController.LIGHT_CLASS); } /** * Check if system prefers dark mode */ get systemPrefersDark() { return window.matchMedia("(prefers-color-scheme: dark)").matches; } /** * Set theme and persist preference */ set(theme) { localStorage.setItem(_ThemeController.STORAGE_KEY, theme); this.applyTheme(theme); this.updateUI(); } /** * Toggle between light and dark themes */ toggle() { this.set(this.isDark ? "light" : "dark"); } applyTheme(theme) { this.root.classList.remove(_ThemeController.DARK_CLASS, _ThemeController.LIGHT_CLASS); if (theme === "dark") { this.root.classList.add(_ThemeController.DARK_CLASS); } else if (theme === "light") { this.root.classList.add(_ThemeController.LIGHT_CLASS); } } updateUI() { if (!this.themeOptions) return; const darkActive = this.isDark; this.themeOptions.forEach((option) => { const theme = option.dataset.theme; const isActive = theme === "dark" && darkActive || theme === "light" && !darkActive; option.classList.toggle("active", isActive); }); } setupListeners() { this.themeOptions.forEach((option) => { option.addEventListener("click", (e) => this.handleOptionClick(e)); }); window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => this.handleSystemChange()); } handleOptionClick(e) { const target = e.target; const option = target.closest("swp-theme-option"); if (option) { const theme = option.dataset.theme; if (theme) { this.set(theme); } } } handleSystemChange() { if (this.current === "system") { this.updateUI(); } } }; __name(_ThemeController, "ThemeController"); _ThemeController.STORAGE_KEY = "theme-preference"; _ThemeController.DARK_CLASS = "dark-mode"; _ThemeController.LIGHT_CLASS = "light-mode"; var ThemeController = _ThemeController; // wwwroot/ts/modules/search.ts var _SearchController = class _SearchController { constructor() { this.input = null; this.container = null; this.input = document.getElementById("globalSearch"); this.container = document.querySelector("swp-topbar-search"); this.setupListeners(); } /** * Get current search value */ get value() { return this.input?.value ?? ""; } /** * Set search value */ set value(val) { if (this.input) { this.input.value = val; } } /** * Focus the search input */ focus() { this.input?.focus(); } /** * Blur the search input */ blur() { this.input?.blur(); } /** * Clear the search input */ clear() { this.value = ""; } setupListeners() { document.addEventListener("keydown", (e) => this.handleKeyboard(e)); if (this.input) { this.input.addEventListener("input", (e) => this.handleInput(e)); const form = this.input.closest("form"); form?.addEventListener("submit", (e) => this.handleSubmit(e)); } } handleKeyboard(e) { if ((e.metaKey || e.ctrlKey) && e.key === "k") { e.preventDefault(); this.focus(); return; } if (e.key === "Escape" && document.activeElement === this.input) { this.blur(); } } handleInput(e) { const target = e.target; const query = target.value.trim(); document.dispatchEvent(new CustomEvent("app:search", { detail: { query }, bubbles: true })); } handleSubmit(e) { e.preventDefault(); const query = this.value.trim(); if (!query) return; document.dispatchEvent(new CustomEvent("app:search-submit", { detail: { query }, bubbles: true })); } }; __name(_SearchController, "SearchController"); var SearchController = _SearchController; // wwwroot/ts/modules/lockscreen.ts var _LockScreenController = class _LockScreenController { constructor(drawers) { // Demo PIN this.lockScreen = null; this.pinInput = null; this.pinKeypad = null; this.lockTimeEl = null; this.pinDigits = null; this.currentPin = ""; this.drawers = null; this.drawers = drawers ?? null; this.lockScreen = document.getElementById("lockScreen"); this.pinInput = document.getElementById("pinInput"); this.pinKeypad = document.getElementById("pinKeypad"); this.lockTimeEl = document.getElementById("lockTime"); this.pinDigits = this.pinInput?.querySelectorAll("swp-pin-digit") ?? null; this.setupListeners(); } /** * Check if lock screen is active */ get isActive() { return this.lockScreen?.classList.contains("active") ?? false; } /** * Show the lock screen */ show() { this.drawers?.closeAll(); if (this.lockScreen) { this.lockScreen.classList.add("active"); document.body.style.overflow = "hidden"; } this.currentPin = ""; this.updateDisplay(); if (this.lockTimeEl) { this.lockTimeEl.textContent = `L\xE5st kl. ${this.formatTime()}`; } } /** * Hide the lock screen */ hide() { if (this.lockScreen) { this.lockScreen.classList.remove("active"); document.body.style.overflow = ""; } this.currentPin = ""; this.updateDisplay(); } formatTime() { const now = /* @__PURE__ */ new Date(); const hours = now.getHours().toString().padStart(2, "0"); const minutes = now.getMinutes().toString().padStart(2, "0"); return `${hours}:${minutes}`; } updateDisplay() { if (!this.pinDigits) return; this.pinDigits.forEach((digit, index) => { digit.classList.remove("filled", "error"); if (index < this.currentPin.length) { digit.textContent = "\u2022"; digit.classList.add("filled"); } else { digit.textContent = ""; } }); } showError() { if (!this.pinDigits) return; this.pinDigits.forEach((digit) => digit.classList.add("error")); this.pinInput?.classList.add("shake"); setTimeout(() => { this.currentPin = ""; this.updateDisplay(); this.pinInput?.classList.remove("shake"); }, 500); } verify() { if (this.currentPin === _LockScreenController.CORRECT_PIN) { this.hide(); } else { this.showError(); } } addDigit(digit) { if (this.currentPin.length >= 4) return; this.currentPin += digit; this.updateDisplay(); if (this.currentPin.length === 4) { setTimeout(() => this.verify(), 200); } } removeDigit() { if (this.currentPin.length === 0) return; this.currentPin = this.currentPin.slice(0, -1); this.updateDisplay(); } clearPin() { this.currentPin = ""; this.updateDisplay(); } setupListeners() { this.pinKeypad?.addEventListener("click", (e) => this.handleKeypadClick(e)); document.addEventListener("keydown", (e) => this.handleKeyboard(e)); document.querySelector("swp-side-menu-action.lock")?.addEventListener("click", () => this.show()); } handleKeypadClick(e) { const target = e.target; const key = target.closest("swp-pin-key"); if (!key) return; const digit = key.dataset.digit; const action = key.dataset.action; if (digit) { this.addDigit(digit); } else if (action === "backspace") { this.removeDigit(); } else if (action === "clear") { this.clearPin(); } } handleKeyboard(e) { if (!this.isActive) return; e.preventDefault(); if (e.key >= "0" && e.key <= "9") { this.addDigit(e.key); } else if (e.key === "Backspace") { this.removeDigit(); } else if (e.key === "Escape") { this.clearPin(); } } }; __name(_LockScreenController, "LockScreenController"); _LockScreenController.CORRECT_PIN = "1234"; var LockScreenController = _LockScreenController; // wwwroot/ts/app.ts var _App = class _App { constructor() { this.sidebar = new SidebarController(); this.drawers = new DrawerController(); this.theme = new ThemeController(); this.search = new SearchController(); this.lockScreen = new LockScreenController(this.drawers); } }; __name(_App, "App"); var App = _App; var app; function init() { app = new App(); if (typeof window !== "undefined") { window.app = app; } } __name(init, "init"); if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } var app_default = App; export { App, app, app_default as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdHMvbW9kdWxlcy9zaWRlYmFyLnRzIiwgIi4uL3RzL21vZHVsZXMvZHJhd2Vycy50cyIsICIuLi90cy9tb2R1bGVzL3RoZW1lLnRzIiwgIi4uL3RzL21vZHVsZXMvc2VhcmNoLnRzIiwgIi4uL3RzL21vZHVsZXMvbG9ja3NjcmVlbi50cyIsICIuLi90cy9hcHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogU2lkZWJhciBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBzaWRlYmFyIGNvbGxhcHNlL2V4cGFuZCBhbmQgdG9vbHRpcCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuZXhwb3J0IGNsYXNzIFNpZGViYXJDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBtZW51VG9nZ2xlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFwcExheW91dDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZW51VG9vbHRpcDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1lbnVUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudVRvZ2dsZScpO1xuICAgIHRoaXMuYXBwTGF5b3V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3dwLWFwcC1sYXlvdXQnKTtcbiAgICB0aGlzLm1lbnVUb29sdGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnVUb29sdGlwJyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zZXR1cFRvb2x0aXBzKCk7XG4gICAgdGhpcy5yZXN0b3JlU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzaWRlYmFyIGlzIGNvbGxhcHNlZFxuICAgKi9cbiAgZ2V0IGlzQ29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwcExheW91dD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LWNvbGxhcHNlZCcpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBzaWRlYmFyIGNvbGxhcHNlZCBzdGF0ZVxuICAgKi9cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcHBMYXlvdXQpIHJldHVybjtcblxuICAgIHRoaXMuYXBwTGF5b3V0LmNsYXNzTGlzdC50b2dnbGUoJ21lbnUtY29sbGFwc2VkJyk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NpZGViYXItY29sbGFwc2VkJywgU3RyaW5nKHRoaXMuaXNDb2xsYXBzZWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXBzZSB0aGUgc2lkZWJhclxuICAgKi9cbiAgY29sbGFwc2UoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBMYXlvdXQ/LmNsYXNzTGlzdC5hZGQoJ21lbnUtY29sbGFwc2VkJyk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NpZGViYXItY29sbGFwc2VkJywgJ3RydWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIHNpZGViYXJcbiAgICovXG4gIGV4cGFuZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcExheW91dD8uY2xhc3NMaXN0LnJlbW92ZSgnbWVudS1jb2xsYXBzZWQnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2lkZWJhci1jb2xsYXBzZWQnLCAnZmFsc2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW51VG9nZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMudG9nZ2xlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFRvb2x0aXBzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZW51VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWVudUl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1zaWRlLW1lbnUtaXRlbVtkYXRhLXRvb2x0aXBdJyk7XG5cbiAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHRoaXMuc2hvd1Rvb2x0aXAoaXRlbSkpO1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oaWRlVG9vbHRpcCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1Rvb2x0aXAoaXRlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDb2xsYXBzZWQgfHwgIXRoaXMubWVudVRvb2x0aXApIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gaXRlbS5kYXRhc2V0LnRvb2x0aXA7XG5cbiAgICBpZiAoIXRvb2x0aXBUZXh0KSByZXR1cm47XG5cbiAgICB0aGlzLm1lbnVUb29sdGlwLnRleHRDb250ZW50ID0gdG9vbHRpcFRleHQ7XG4gICAgdGhpcy5tZW51VG9vbHRpcC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodCArIDh9cHhgO1xuICAgIHRoaXMubWVudVRvb2x0aXAuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJ9cHhgO1xuICAgIHRoaXMubWVudVRvb2x0aXAuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTUwJSknO1xuICAgIHRoaXMubWVudVRvb2x0aXAuc2hvd1BvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZVRvb2x0aXAoKTogdm9pZCB7XG4gICAgdGhpcy5tZW51VG9vbHRpcD8uaGlkZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVN0YXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcHBMYXlvdXQpIHJldHVybjtcblxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2lkZWJhci1jb2xsYXBzZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLmFwcExheW91dC5jbGFzc0xpc3QuYWRkKCdtZW51LWNvbGxhcHNlZCcpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogRHJhd2VyIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIGFsbCBkcmF3ZXIgZnVuY3Rpb25hbGl0eSBpbmNsdWRpbmcgcHJvZmlsZSwgbm90aWZpY2F0aW9ucywgYW5kIHRvZG8gZHJhd2Vyc1xuICovXG5cbmV4cG9ydCB0eXBlIERyYXdlck5hbWUgPSAncHJvZmlsZScgfCAnbm90aWZpY2F0aW9uJyB8ICd0b2RvJyB8ICduZXdUb2RvJztcblxuZXhwb3J0IGNsYXNzIERyYXdlckNvbnRyb2xsZXIge1xuICBwcml2YXRlIHByb2ZpbGVEcmF3ZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uRHJhd2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRvZG9EcmF3ZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbmV3VG9kb0RyYXdlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFjdGl2ZURyYXdlcjogRHJhd2VyTmFtZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvZmlsZURyYXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9maWxlRHJhd2VyJyk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25EcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uRHJhd2VyJyk7XG4gICAgdGhpcy50b2RvRHJhd2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZG9EcmF3ZXInKTtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3VG9kb0RyYXdlcicpO1xuICAgIHRoaXMub3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3ZXJPdmVybGF5Jyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBhY3RpdmUgZHJhd2VyIG5hbWVcbiAgICovXG4gIGdldCBhY3RpdmUoKTogRHJhd2VyTmFtZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZURyYXdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJhd2VyIGJ5IG5hbWVcbiAgICovXG4gIG9wZW4obmFtZTogRHJhd2VyTmFtZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBbGwoKTtcblxuICAgIGNvbnN0IGRyYXdlciA9IHRoaXMuZ2V0RHJhd2VyKG5hbWUpO1xuICAgIGlmIChkcmF3ZXIgJiYgdGhpcy5vdmVybGF5KSB7XG4gICAgICBkcmF3ZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICB0aGlzLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdlciA9IG5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGEgc3BlY2lmaWMgZHJhd2VyXG4gICAqL1xuICBjbG9zZShuYW1lOiBEcmF3ZXJOYW1lKTogdm9pZCB7XG4gICAgY29uc3QgZHJhd2VyID0gdGhpcy5nZXREcmF3ZXIobmFtZSk7XG4gICAgZHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgIC8vIE9ubHkgaGlkZSBvdmVybGF5IGlmIG5vIGRyYXdlcnMgYXJlIGFjdGl2ZVxuICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmVbY2xhc3MqPVwiZHJhd2VyXCJdJykpIHtcbiAgICAgIHRoaXMub3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVEcmF3ZXIgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2VyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYWxsIGRyYXdlcnNcbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIFt0aGlzLnByb2ZpbGVEcmF3ZXIsIHRoaXMubm90aWZpY2F0aW9uRHJhd2VyLCB0aGlzLnRvZG9EcmF3ZXIsIHRoaXMubmV3VG9kb0RyYXdlcl1cbiAgICAgIC5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXI/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcblxuICAgIHRoaXMub3ZlcmxheT8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIHRoaXMuYWN0aXZlRHJhd2VyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHByb2ZpbGUgZHJhd2VyXG4gICAqL1xuICBvcGVuUHJvZmlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4oJ3Byb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIG5vdGlmaWNhdGlvbiBkcmF3ZXJcbiAgICovXG4gIG9wZW5Ob3RpZmljYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuKCdub3RpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRvZG8gZHJhd2VyIChzbGlkZXMgb24gdG9wIG9mIHByb2ZpbGUpXG4gICAqL1xuICBvcGVuVG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZG9EcmF3ZXI/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRvZG8gZHJhd2VyXG4gICAqL1xuICBjbG9zZVRvZG8oKTogdm9pZCB7XG4gICAgdGhpcy50b2RvRHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB0aGlzLmNsb3NlTmV3VG9kbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gbmV3IHRvZG8gZHJhd2VyXG4gICAqL1xuICBvcGVuTmV3VG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXI/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIG5ldyB0b2RvIGRyYXdlclxuICAgKi9cbiAgY2xvc2VOZXdUb2RvKCk6IHZvaWQge1xuICAgIHRoaXMubmV3VG9kb0RyYXdlcj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBhbGwgbm90aWZpY2F0aW9ucyBhcyByZWFkXG4gICAqL1xuICBtYXJrQWxsTm90aWZpY2F0aW9uc1JlYWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvbkRyYXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgdW5yZWFkSXRlbXMgPSB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICdzd3Atbm90aWZpY2F0aW9uLWl0ZW1bZGF0YS11bnJlYWQ9XCJ0cnVlXCJdJ1xuICAgICk7XG4gICAgdW5yZWFkSXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXVucmVhZCcpKTtcblxuICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC1ub3RpZmljYXRpb24tYmFkZ2UnKTtcbiAgICBpZiAoYmFkZ2UpIHtcbiAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREcmF3ZXIobmFtZTogRHJhd2VyTmFtZSk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdwcm9maWxlJzogcmV0dXJuIHRoaXMucHJvZmlsZURyYXdlcjtcbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlcjtcbiAgICAgIGNhc2UgJ3RvZG8nOiByZXR1cm4gdGhpcy50b2RvRHJhd2VyO1xuICAgICAgY2FzZSAnbmV3VG9kbyc6IHJldHVybiB0aGlzLm5ld1RvZG9EcmF3ZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBQcm9maWxlIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9maWxlVHJpZ2dlcicpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuUHJvZmlsZSgpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyQ2xvc2UnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoJ3Byb2ZpbGUnKSk7XG5cbiAgICAvLyBOb3RpZmljYXRpb24gZHJhd2VyIHRyaWdnZXJzXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnNCdG4nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3Blbk5vdGlmaWNhdGlvbigpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uRHJhd2VyQ2xvc2UnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoJ25vdGlmaWNhdGlvbicpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFya0FsbFJlYWQnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMubWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkKCkpO1xuXG4gICAgLy8gVG9kbyBkcmF3ZXIgdHJpZ2dlcnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BlblRvZG9EcmF3ZXInKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlblRvZG8oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZG9EcmF3ZXJCYWNrJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlVG9kbygpKTtcblxuICAgIC8vIE5ldyB0b2RvIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRUb2RvQnRuJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5OZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXdUb2RvRHJhd2VyQmFjaycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZU5ld1RvZG8oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbE5ld1RvZG8nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2VOZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlTmV3VG9kbycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZU5ld1RvZG8oKSk7XG5cbiAgICAvLyBPdmVybGF5IGNsaWNrIGNsb3NlcyBhbGxcbiAgICB0aGlzLm92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZUFsbCgpKTtcblxuICAgIC8vIEVzY2FwZSBrZXkgY2xvc2VzIGFsbFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5jbG9zZUFsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVG9kbyBpbnRlcmFjdGlvbnNcbiAgICB0aGlzLnRvZG9EcmF3ZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlVG9kb0NsaWNrKGUpKTtcblxuICAgIC8vIFZpc2liaWxpdHkgb3B0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlVmlzaWJpbGl0eUNsaWNrKGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG9kb0NsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgdG9kb0l0ZW0gPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLWl0ZW0nKTtcbiAgICBjb25zdCBjaGVja2JveCA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRvZG8tY2hlY2tib3gnKTtcblxuICAgIGlmIChjaGVja2JveCAmJiB0b2RvSXRlbSkge1xuICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSB0b2RvSXRlbS5kYXRhc2V0LmNvbXBsZXRlZCA9PT0gJ3RydWUnO1xuICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgIHRvZG9JdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jb21wbGV0ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvZG9JdGVtLmRhdGFzZXQuY29tcGxldGVkID0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvZ2dsZSBzZWN0aW9uIGNvbGxhcHNlXG4gICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRvZG8tc2VjdGlvbi1oZWFkZXInKTtcbiAgICBpZiAoc2VjdGlvbkhlYWRlcikge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25IZWFkZXIuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLXNlY3Rpb24nKTtcbiAgICAgIHNlY3Rpb24/LmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVmlzaWJpbGl0eUNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgb3B0aW9uID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdmlzaWJpbGl0eS1vcHRpb24nKTtcblxuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtdmlzaWJpbGl0eS1vcHRpb24nKVxuICAgICAgICAuZm9yRWFjaChvID0+IG8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgb3B0aW9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogVGhlbWUgQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgZGFyay9saWdodCBtb2RlIHN3aXRjaGluZyBhbmQgc3lzdGVtIHByZWZlcmVuY2UgZGV0ZWN0aW9uXG4gKi9cblxuZXhwb3J0IHR5cGUgVGhlbWUgPSAnbGlnaHQnIHwgJ2RhcmsnIHwgJ3N5c3RlbSc7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZUNvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX0tFWSA9ICd0aGVtZS1wcmVmZXJlbmNlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREFSS19DTEFTUyA9ICdkYXJrLW1vZGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMSUdIVF9DTEFTUyA9ICdsaWdodC1tb2RlJztcblxuICBwcml2YXRlIHJvb3Q6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHRoZW1lT3B0aW9uczogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMudGhlbWVPcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC10aGVtZS1vcHRpb24nKTtcblxuICAgIHRoaXMuYXBwbHlUaGVtZSh0aGlzLmN1cnJlbnQpO1xuICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHRoZW1lIHNldHRpbmdcbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFRoZW1lIHtcbiAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShUaGVtZUNvbnRyb2xsZXIuU1RPUkFHRV9LRVkpIGFzIFRoZW1lIHwgbnVsbDtcbiAgICBpZiAoc3RvcmVkID09PSAnZGFyaycgfHwgc3RvcmVkID09PSAnbGlnaHQnIHx8IHN0b3JlZCA9PT0gJ3N5c3RlbScpIHtcbiAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgfVxuICAgIHJldHVybiAnc3lzdGVtJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkYXJrIG1vZGUgaXMgY3VycmVudGx5IGFjdGl2ZVxuICAgKi9cbiAgZ2V0IGlzRGFyaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb290LmNsYXNzTGlzdC5jb250YWlucyhUaGVtZUNvbnRyb2xsZXIuREFSS19DTEFTUykgfHxcbiAgICAgICh0aGlzLnN5c3RlbVByZWZlcnNEYXJrICYmICF0aGlzLnJvb3QuY2xhc3NMaXN0LmNvbnRhaW5zKFRoZW1lQ29udHJvbGxlci5MSUdIVF9DTEFTUykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHN5c3RlbSBwcmVmZXJzIGRhcmsgbW9kZVxuICAgKi9cbiAgZ2V0IHN5c3RlbVByZWZlcnNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZW1lIGFuZCBwZXJzaXN0IHByZWZlcmVuY2VcbiAgICovXG4gIHNldCh0aGVtZTogVGhlbWUpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShUaGVtZUNvbnRyb2xsZXIuU1RPUkFHRV9LRVksIHRoZW1lKTtcbiAgICB0aGlzLmFwcGx5VGhlbWUodGhlbWUpO1xuICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgYmV0d2VlbiBsaWdodCBhbmQgZGFyayB0aGVtZXNcbiAgICovXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldCh0aGlzLmlzRGFyayA/ICdsaWdodCcgOiAnZGFyaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRoZW1lKHRoZW1lOiBUaGVtZSk6IHZvaWQge1xuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QucmVtb3ZlKFRoZW1lQ29udHJvbGxlci5EQVJLX0NMQVNTLCBUaGVtZUNvbnRyb2xsZXIuTElHSFRfQ0xBU1MpO1xuXG4gICAgaWYgKHRoZW1lID09PSAnZGFyaycpIHtcbiAgICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKFRoZW1lQ29udHJvbGxlci5EQVJLX0NMQVNTKTtcbiAgICB9IGVsc2UgaWYgKHRoZW1lID09PSAnbGlnaHQnKSB7XG4gICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChUaGVtZUNvbnRyb2xsZXIuTElHSFRfQ0xBU1MpO1xuICAgIH1cbiAgICAvLyAnc3lzdGVtJyBsZWF2ZXMgYm90aCBjbGFzc2VzIG9mZiwgbGV0dGluZyBDU1MgbWVkaWEgcXVlcnkgaGFuZGxlIGl0XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVVJKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aGVtZU9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGRhcmtBY3RpdmUgPSB0aGlzLmlzRGFyaztcblxuICAgIHRoaXMudGhlbWVPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IHRoZW1lID0gb3B0aW9uLmRhdGFzZXQudGhlbWUgYXMgVGhlbWU7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9ICh0aGVtZSA9PT0gJ2RhcmsnICYmIGRhcmtBY3RpdmUpIHx8ICh0aGVtZSA9PT0gJ2xpZ2h0JyAmJiAhZGFya0FjdGl2ZSk7XG4gICAgICBvcHRpb24uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgaXNBY3RpdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBUaGVtZSBvcHRpb24gY2xpY2tzXG4gICAgdGhpcy50aGVtZU9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgb3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlT3B0aW9uQ2xpY2soZSkpO1xuICAgIH0pO1xuXG4gICAgLy8gU3lzdGVtIHRoZW1lIGNoYW5nZXNcbiAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5oYW5kbGVTeXN0ZW1DaGFuZ2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9wdGlvbkNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgb3B0aW9uID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdGhlbWUtb3B0aW9uJyk7XG5cbiAgICBpZiAob3B0aW9uKSB7XG4gICAgICBjb25zdCB0aGVtZSA9IG9wdGlvbi5kYXRhc2V0LnRoZW1lIGFzIFRoZW1lO1xuICAgICAgaWYgKHRoZW1lKSB7XG4gICAgICAgIHRoaXMuc2V0KHRoZW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5c3RlbUNoYW5nZSgpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHJlYWN0IHRvIHN5c3RlbSBjaGFuZ2VzIGlmIHdlJ3JlIHVzaW5nIHN5c3RlbSBwcmVmZXJlbmNlXG4gICAgaWYgKHRoaXMuY3VycmVudCA9PT0gJ3N5c3RlbScpIHtcbiAgICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFNlYXJjaCBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBnbG9iYWwgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgYW5kIGtleWJvYXJkIHNob3J0Y3V0c1xuICovXG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbFNlYXJjaCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC10b3BiYXItc2VhcmNoJyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc2VhcmNoIHZhbHVlXG4gICAqL1xuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dD8udmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlYXJjaCB2YWx1ZVxuICAgKi9cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXQudmFsdWUgPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzIHRoZSBzZWFyY2ggaW5wdXRcbiAgICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQmx1ciB0aGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBibHVyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXQ/LmJsdXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIEtleWJvYXJkIHNob3J0Y3V0c1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5oYW5kbGVLZXlib2FyZChlKSk7XG5cbiAgICAvLyBJbnB1dCBoYW5kbGVyc1xuICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHRoaXMuaGFuZGxlSW5wdXQoZSkpO1xuXG4gICAgICAvLyBQcmV2ZW50IGZvcm0gc3VibWlzc2lvbiBpZiB3cmFwcGVkIGluIGZvcm1cbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmlucHV0LmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICAgIGZvcm0/LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdChlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlib2FyZChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ21kL0N0cmwgKyBLIHRvIGZvY3VzIHNlYXJjaFxuICAgIGlmICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSB0byBibHVyIHNlYXJjaCB3aGVuIGZvY3VzZWRcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGFyZ2V0LnZhbHVlLnRyaW0oKTtcblxuICAgIC8vIEVtaXQgY3VzdG9tIGV2ZW50IGZvciBzZWFyY2hcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnYXBwOnNlYXJjaCcsIHtcbiAgICAgIGRldGFpbDogeyBxdWVyeSB9LFxuICAgICAgYnViYmxlczogdHJ1ZVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KGU6IEV2ZW50KTogdm9pZCB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm47XG5cbiAgICAvLyBFbWl0IGN1c3RvbSBldmVudCBmb3Igc2VhcmNoIHN1Ym1pdFxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdhcHA6c2VhcmNoLXN1Ym1pdCcsIHtcbiAgICAgIGRldGFpbDogeyBxdWVyeSB9LFxuICAgICAgYnViYmxlczogdHJ1ZVxuICAgIH0pKTtcbiAgfVxufVxuIiwgIi8qKlxuICogTG9jayBTY3JlZW4gQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgUElOLWJhc2VkIGxvY2sgc2NyZWVuIGZ1bmN0aW9uYWxpdHlcbiAqL1xuXG5pbXBvcnQgeyBEcmF3ZXJDb250cm9sbGVyIH0gZnJvbSAnLi9kcmF3ZXJzJztcblxuZXhwb3J0IGNsYXNzIExvY2tTY3JlZW5Db250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09SUkVDVF9QSU4gPSAnMTIzNCc7IC8vIERlbW8gUElOXG5cbiAgcHJpdmF0ZSBsb2NrU2NyZWVuOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbklucHV0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbktleXBhZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NrVGltZUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbkRpZ2l0czogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGluID0gJyc7XG4gIHByaXZhdGUgZHJhd2VyczogRHJhd2VyQ29udHJvbGxlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRyYXdlcnM/OiBEcmF3ZXJDb250cm9sbGVyKSB7XG4gICAgdGhpcy5kcmF3ZXJzID0gZHJhd2VycyA/PyBudWxsO1xuICAgIHRoaXMubG9ja1NjcmVlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NrU2NyZWVuJyk7XG4gICAgdGhpcy5waW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaW5JbnB1dCcpO1xuICAgIHRoaXMucGluS2V5cGFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpbktleXBhZCcpO1xuICAgIHRoaXMubG9ja1RpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NrVGltZScpO1xuICAgIHRoaXMucGluRGlnaXRzID0gdGhpcy5waW5JbnB1dD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1waW4tZGlnaXQnKSA/PyBudWxsO1xuXG4gICAgdGhpcy5zZXR1cExpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGxvY2sgc2NyZWVuIGlzIGFjdGl2ZVxuICAgKi9cbiAgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tTY3JlZW4/LmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGUgbG9jayBzY3JlZW5cbiAgICovXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3ZXJzPy5jbG9zZUFsbCgpO1xuXG4gICAgaWYgKHRoaXMubG9ja1NjcmVlbikge1xuICAgICAgdGhpcy5sb2NrU2NyZWVuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBpbiA9ICcnO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuXG4gICAgLy8gVXBkYXRlIGxvY2sgdGltZVxuICAgIGlmICh0aGlzLmxvY2tUaW1lRWwpIHtcbiAgICAgIHRoaXMubG9ja1RpbWVFbC50ZXh0Q29udGVudCA9IGBMXHUwMEU1c3Qga2wuICR7dGhpcy5mb3JtYXRUaW1lKCl9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgbG9jayBzY3JlZW5cbiAgICovXG4gIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9ja1NjcmVlbikge1xuICAgICAgdGhpcy5sb2NrU2NyZWVuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBpbiA9ICcnO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBob3VycyA9IG5vdy5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtaW51dGVzID0gbm93LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGluRGlnaXRzKSByZXR1cm47XG5cbiAgICB0aGlzLnBpbkRpZ2l0cy5mb3JFYWNoKChkaWdpdCwgaW5kZXgpID0+IHtcbiAgICAgIGRpZ2l0LmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcsICdlcnJvcicpO1xuICAgICAgaWYgKGluZGV4IDwgdGhpcy5jdXJyZW50UGluLmxlbmd0aCkge1xuICAgICAgICBkaWdpdC50ZXh0Q29udGVudCA9ICdcdTIwMjInO1xuICAgICAgICBkaWdpdC5jbGFzc0xpc3QuYWRkKCdmaWxsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpZ2l0LnRleHRDb250ZW50ID0gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGluRGlnaXRzKSByZXR1cm47XG5cbiAgICB0aGlzLnBpbkRpZ2l0cy5mb3JFYWNoKGRpZ2l0ID0+IGRpZ2l0LmNsYXNzTGlzdC5hZGQoJ2Vycm9yJykpO1xuXG4gICAgLy8gU2hha2UgYW5pbWF0aW9uXG4gICAgdGhpcy5waW5JbnB1dD8uY2xhc3NMaXN0LmFkZCgnc2hha2UnKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50UGluID0gJyc7XG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgICAgIHRoaXMucGluSW5wdXQ/LmNsYXNzTGlzdC5yZW1vdmUoJ3NoYWtlJyk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQaW4gPT09IExvY2tTY3JlZW5Db250cm9sbGVyLkNPUlJFQ1RfUElOKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZERpZ2l0KGRpZ2l0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGluLmxlbmd0aCA+PSA0KSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRQaW4gKz0gZGlnaXQ7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICAvLyBBdXRvLXZlcmlmeSB3aGVuIDQgZGlnaXRzIGVudGVyZWRcbiAgICBpZiAodGhpcy5jdXJyZW50UGluLmxlbmd0aCA9PT0gNCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnZlcmlmeSgpLCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRGlnaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpbi5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRQaW4gPSB0aGlzLmN1cnJlbnRQaW4uc2xpY2UoMCwgLTEpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBpbigpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQaW4gPSAnJztcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gS2V5cGFkIGNsaWNrIGhhbmRsZXJcbiAgICB0aGlzLnBpbktleXBhZD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5oYW5kbGVLZXlwYWRDbGljayhlKSk7XG5cbiAgICAvLyBLZXlib2FyZCBpbnB1dFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5oYW5kbGVLZXlib2FyZChlKSk7XG5cbiAgICAvLyBMb2NrIGJ1dHRvbiBpbiBzaWRlYmFyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC1zaWRlLW1lbnUtYWN0aW9uLmxvY2snKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2hvdygpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5cGFkQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBrZXkgPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC1waW4ta2V5Jyk7XG5cbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlnaXQgPSBrZXkuZGF0YXNldC5kaWdpdDtcbiAgICBjb25zdCBhY3Rpb24gPSBrZXkuZGF0YXNldC5hY3Rpb247XG5cbiAgICBpZiAoZGlnaXQpIHtcbiAgICAgIHRoaXMuYWRkRGlnaXQoZGlnaXQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYmFja3NwYWNlJykge1xuICAgICAgdGhpcy5yZW1vdmVEaWdpdCgpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICB0aGlzLmNsZWFyUGluKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlib2FyZChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBQcmV2ZW50IGRlZmF1bHQgdG8gYXZvaWQgb3RoZXIgaW50ZXJhY3Rpb25zXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGUua2V5ID49ICcwJyAmJiBlLmtleSA8PSAnOScpIHtcbiAgICAgIHRoaXMuYWRkRGlnaXQoZS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICB0aGlzLnJlbW92ZURpZ2l0KCk7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuY2xlYXJQaW4oKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFNhbG9uIE9TIEFwcFxuICpcbiAqIE1haW4gYXBwbGljYXRpb24gY2xhc3MgdGhhdCBvcmNoZXN0cmF0ZXMgYWxsIFVJIGNvbnRyb2xsZXJzXG4gKi9cblxuaW1wb3J0IHsgU2lkZWJhckNvbnRyb2xsZXIgfSBmcm9tICcuL21vZHVsZXMvc2lkZWJhcic7XG5pbXBvcnQgeyBEcmF3ZXJDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL2RyYXdlcnMnO1xuaW1wb3J0IHsgVGhlbWVDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL3RoZW1lJztcbmltcG9ydCB7IFNlYXJjaENvbnRyb2xsZXIgfSBmcm9tICcuL21vZHVsZXMvc2VhcmNoJztcbmltcG9ydCB7IExvY2tTY3JlZW5Db250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL2xvY2tzY3JlZW4nO1xuXG4vKipcbiAqIE1haW4gYXBwbGljYXRpb24gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEFwcCB7XG4gIHJlYWRvbmx5IHNpZGViYXI6IFNpZGViYXJDb250cm9sbGVyO1xuICByZWFkb25seSBkcmF3ZXJzOiBEcmF3ZXJDb250cm9sbGVyO1xuICByZWFkb25seSB0aGVtZTogVGhlbWVDb250cm9sbGVyO1xuICByZWFkb25seSBzZWFyY2g6IFNlYXJjaENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGxvY2tTY3JlZW46IExvY2tTY3JlZW5Db250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgY29udHJvbGxlcnNcbiAgICB0aGlzLnNpZGViYXIgPSBuZXcgU2lkZWJhckNvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmRyYXdlcnMgPSBuZXcgRHJhd2VyQ29udHJvbGxlcigpO1xuICAgIHRoaXMudGhlbWUgPSBuZXcgVGhlbWVDb250cm9sbGVyKCk7XG4gICAgdGhpcy5zZWFyY2ggPSBuZXcgU2VhcmNoQ29udHJvbGxlcigpO1xuICAgIHRoaXMubG9ja1NjcmVlbiA9IG5ldyBMb2NrU2NyZWVuQ29udHJvbGxlcih0aGlzLmRyYXdlcnMpO1xuICB9XG59XG5cbi8qKlxuICogR2xvYmFsIGFwcCBpbnN0YW5jZVxuICovXG5sZXQgYXBwOiBBcHA7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqL1xuZnVuY3Rpb24gaW5pdCgpOiB2b2lkIHtcbiAgYXBwID0gbmV3IEFwcCgpO1xuXG4gIC8vIEV4cG9zZSB0byB3aW5kb3cgZm9yIGRlYnVnZ2luZ1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAod2luZG93IGFzIHVua25vd24gYXMgeyBhcHA6IEFwcCB9KS5hcHAgPSBhcHA7XG4gIH1cbn1cblxuLy8gV2FpdCBmb3IgRE9NIHJlYWR5XG5pZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTtcbn0gZWxzZSB7XG4gIGluaXQoKTtcbn1cblxuZXhwb3J0IHsgYXBw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