diff --git a/suites-experimental/suites.mjs b/suites-experimental/suites.mjs index 2f740e4bd..b6e4dce80 100644 --- a/suites-experimental/suites.mjs +++ b/suites-experimental/suites.mjs @@ -292,4 +292,43 @@ export const ExperimentalSuites = freezeSuites([ }), ], }, + { + name: "Terminal-Xterm", + url: "suites-experimental/terminal-xterm/dist/index.html", + tags: ["terminal", "xterm", "experimental"], + type: "async", + async prepare(page) { + await page.waitForElement("#terminal-container"); + }, + tests: [ + new BenchmarkTestStep("DumpAndScrollOutput", async (page) => { + const stepComplete = new Promise((resolve) => { + page.addEventListener("step-complete", resolve, { once: true }); + }); + page.querySelector("#btn-dump-scroll").click(); + await stepComplete; + }), + new BenchmarkTestStep("ParseAndHoverInlineLinks", async (page) => { + const stepComplete = new Promise((resolve) => { + page.addEventListener("step-complete", resolve, { once: true }); + }); + page.querySelector("#btn-hover-links").click(); + await stepComplete; + }), + new BenchmarkTestStep("NcursesColorUI", async (page) => { + const stepComplete = new Promise((resolve) => { + page.addEventListener("step-complete", resolve, { once: true }); + }); + page.querySelector("#btn-ncurses").click(); + await stepComplete; + }), + new BenchmarkTestStep("SwitchTabsAndResize", async (page) => { + const stepComplete = new Promise((resolve) => { + page.addEventListener("step-complete", resolve, { once: true }); + }); + page.querySelector("#btn-switch-tabs").click(); + await stepComplete; + }), + ], + }, ]); diff --git a/suites-experimental/terminal-xterm/README.md b/suites-experimental/terminal-xterm/README.md new file mode 100644 index 000000000..186fb0685 --- /dev/null +++ b/suites-experimental/terminal-xterm/README.md @@ -0,0 +1,33 @@ +# Speedometer 3.0: Terminal Emulator (Xterm.js) + +## Description + +This workload simulates an interactive developer terminal environment using [xterm.js](https://xtermjs.org/) and its official addons (`@xterm/addon-fit`, `@xterm/addon-web-links`, `@xterm/addon-canvas`, and `@xterm/addon-webgl`). + +## Implementation Details + +The application maintains four distinct terminal sessions organized into tabs (`Build Log`, `Links & Traces`, `Ncurses Monitor`, and `Git Status`). To ensure deterministic timing and repeatable results during benchmark runs, the workload incorporates universal asynchronous overrides (`async-overrides.js`) that intercept and synchronize `setTimeout`, `requestAnimationFrame`, `createImageBitmap`, and DOM observers (`ResizeObserver`, `IntersectionObserver`, `MutationObserver`). + +### Benchmark Steps + +1. **Dump & Scroll Output**: Dumps ~75 chunks (~750+ lines) of verbose C++ compilation logs into the viewport, exercises scrolling operations, and simulates user selection across blocks of output. +2. **Parse & Hover Inline Links**: Emits test logs saturated with URLs and file paths, then dispatches synthetic mouse hover events across grid cells to trigger regex link matching and decoration updates (`@xterm/addon-web-links`). +3. **Ncurses Color UI**: Sequentially renders 4 dynamic frames of an `htop`-style system process monitor using cursor positioning, RGB TrueColor escape sequences, and partial buffer refreshes. +4. **Switch Tabs & Resize**: Simulates switching active terminal tabs and resizing panel widths to trigger column reflow calculations (`@xterm/addon-fit`). + +## Build Steps + +The workload uses Vite to bundle dependencies into the `dist/` folder: + +```bash +npm install +npm run build-dev +``` + +## Local Preview + +To run the application in development mode with live reloading: + +```bash +npm run dev +``` diff --git a/suites-experimental/terminal-xterm/app.js b/suites-experimental/terminal-xterm/app.js new file mode 100644 index 000000000..fd2ed7aa4 --- /dev/null +++ b/suites-experimental/terminal-xterm/app.js @@ -0,0 +1,487 @@ +// Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). +import "@xterm/xterm/css/xterm.css"; +import { Terminal } from "@xterm/xterm"; +import { FitAddon } from "@xterm/addon-fit"; +import { WebLinksAddon } from "@xterm/addon-web-links"; +import { CanvasAddon } from "@xterm/addon-canvas"; +import { WebGLAddon } from "@xterm/addon-webgl"; +import { generateBuildLogSession, generateLinksSession, generateNcursesSession } from "./sessions.js"; + +// Terminal instances and addons storage +const terminals = {}; +const fitAddons = {}; +let activeTabId = "build"; +let isInitialized = false; + +// Pre-generate session data for deterministic benchmarking +const buildLogChunks = generateBuildLogSession(); +const linksChunks = generateLinksSession(); +const ncursesFrames = generateNcursesSession(); + +// Determine renderer backend from URL query param (default: canvas, fallback: dom) +const params = new URLSearchParams(window.location.search); +const rendererType = (params.get("renderer") || "canvas").toLowerCase(); + +/** + * Initialize all 4 terminal panes and attach addons + */ +export function initTerminals() { + if (isInitialized) + return; + + const tabs = ["build", "links", "ncurses", "git"]; + tabs.forEach((tabId) => initTerminalForTab(tabId)); + + // Populate Git tab with static sample output + if (terminals.git) { + writeAndFlushSync(terminals.git, "\x1b[33mOn branch main\x1b[0m\r\n"); + writeAndFlushSync(terminals.git, "Your branch is up to date with 'origin/main'.\r\n\r\n"); + writeAndFlushSync(terminals.git, "Changes not staged for commit:\r\n"); + writeAndFlushSync(terminals.git, ' (use "git add ..." to update what will be committed)\r\n'); + writeAndFlushSync(terminals.git, ' (use "git restore ..." to discard changes in working directory)\r\n'); + writeAndFlushSync(terminals.git, "\t\x1b[31mmodified: src/app.js\x1b[0m\r\n"); + writeAndFlushSync(terminals.git, "\t\x1b[31mmodified: style.css\x1b[0m\r\n\r\n"); + writeAndFlushSync(terminals.git, "Untracked files:\r\n"); + writeAndFlushSync(terminals.git, ' (use "git add ..." to include in what will be committed)\r\n'); + writeAndFlushSync(terminals.git, "\t\x1b[31msessions.js\x1b[0m\r\n\r\n"); + writeAndFlushSync(terminals.git, 'no changes added to commit (use "git add" and/or "git commit -a")\r\n'); + } + + // Display initial content in all terminals so font loading, glyph texture atlas + // generation, and canvas renderer warmup are covered in the setup phase. + if (terminals.build && buildLogChunks.length > 0) { + writeSync(terminals.build, "\x1b[36m⚡ Speedometer Terminal Emulator Suite - Initializing Build Environment...\x1b[0m\r\n\r\n"); + for (let i = 0; i < Math.min(10, buildLogChunks.length); i++) + writeSync(terminals.build, buildLogChunks[i]); + } + if (terminals.links && linksChunks.length > 0) { + writeSync(terminals.links, "\x1b[36m🔗 Speedometer Web Links & Traces - Initializing Link Environment...\x1b[0m\r\n\r\n"); + for (let i = 0; i < Math.min(10, linksChunks.length); i++) + writeSync(terminals.links, linksChunks[i]); + } + if (terminals.ncurses && ncursesFrames.length > 0) + writeSync(terminals.ncurses, ncursesFrames[0]); + + // Synchronously unpause and flush all terminals during setup so texture atlases + // and renderer backends are 100% warmed up before benchmark step measurement begins. + Object.values(terminals).forEach((term) => { + if (term._core && term._core._renderService) { + const rs = term._core._renderService; + if (rs._isPaused) { + rs._isPaused = false; + if (rs._charSizeService && !rs._charSizeService.hasValidSize) + rs._charSizeService.measure(); + + if (rs._needsFullRefresh) { + if (rs._pausedResizeTask && typeof rs._pausedResizeTask.flush === "function") + rs._pausedResizeTask.flush(); + + rs.refreshRows(0, rs._rowCount - 1); + rs._needsFullRefresh = false; + } + } + } + flushSync(term); + }); + + isInitialized = true; + switchTab("build"); +} + +function initTerminalForTab(tabId) { + const container = document.getElementById(`pane-${tabId}`); + if (!container) + return; + + const term = new Terminal({ + theme: { + background: "#1e1e1e", + foreground: "#d4d4d4", + cursor: "#007acc", + selectionBackground: "#264f78", + black: "#000000", + red: "#cd3131", + green: "#0dbc79", + yellow: "#e5e510", + blue: "#2472c8", + magenta: "#bc3fbc", + cyan: "#11a8cd", + white: "#e5e5e5", + brightBlack: "#666666", + brightRed: "#f14c4c", + brightGreen: "#23d18b", + brightYellow: "#f5f543", + brightBlue: "#3b8eea", + brightMagenta: "#d670d6", + brightCyan: "#29b8db", + brightWhite: "#e5e5e5", + }, + fontFamily: 'Menlo, Monaco, "Courier New", monospace', + fontSize: 13, + lineHeight: 1.2, + scrollback: 5000, + cursorBlink: false, // Turn off blinking for deterministic rendering + allowTransparency: false, + }); + + const fitAddon = new FitAddon(); + const webLinksAddon = new WebLinksAddon(); + + term.loadAddon(fitAddon); + term.loadAddon(webLinksAddon); + + // Load performance rendering backend + if (rendererType === "webgl") { + try { + const webglAddon = new WebGLAddon(); + term.loadAddon(webglAddon); + } catch (e) { + console.warn("WebGL renderer failed to initialize, falling back to Canvas/DOM:", e); + tryLoadCanvas(term); + } + } else if (rendererType === "canvas") { + tryLoadCanvas(term); + } + + term.open(container); + fitAddon.fit(); + + terminals[tabId] = term; + fitAddons[tabId] = fitAddon; +} + +function tryLoadCanvas(term) { + try { + const canvasAddon = new CanvasAddon(); + term.loadAddon(canvasAddon); + } catch (e) { + console.warn("Canvas renderer failed to initialize, using default DOM renderer:", e); + } +} + +/** + * Synchronously flush any pending debounced render passes or animation frames on + * the terminal's render debouncer, viewport scrollbar, and selection overlays, + * forcing dirty rows and DOM elements to update immediately. + */ +export function flushSync(term) { + if (!term || !term._core) + return; + + // 1. Flush terminal grid renderer (RenderService / RenderDebouncer) + if (term._core._renderService) { + const debouncer = term._core._renderService._renderDebouncer; + if (debouncer && typeof debouncer._innerRefresh === "function") { + if (debouncer._animationFrame) { + window.cancelAnimationFrame(debouncer._animationFrame); + debouncer._animationFrame = undefined; + } + debouncer._innerRefresh(); + } + } + + // 2. Flush viewport scrollbar synchronization (Viewport) + if (term._core.viewport) { + const vp = term._core.viewport; + if (vp._refreshAnimationFrame) { + window.cancelAnimationFrame(vp._refreshAnimationFrame); + vp._refreshAnimationFrame = undefined; + } + if (typeof vp._innerRefresh === "function") + vp._innerRefresh(); + } + + // 3. Flush selection overlays (SelectionService) + if (term._core._selectionService) { + const sel = term._core._selectionService; + if (sel._refreshAnimationFrame) { + window.cancelAnimationFrame(sel._refreshAnimationFrame); + sel._refreshAnimationFrame = undefined; + } + if (typeof sel._refresh === "function") + sel._refresh(); + } +} + +/** + * Synchronously write data to the terminal buffer without macro-task timer delays + * or 12ms chunking, updating grid cells without triggering intermediate canvas redraws. + */ +export function writeSync(term, data) { + if (!term) + return; + if (term._core && term._core._writeBuffer && typeof term._core._writeBuffer.writeSync === "function") + term._core._writeBuffer.writeSync(data); + else + term.write(data); +} + +/** + * Synchronously write data to the terminal buffer and immediately flush all renderers. + */ +export function writeAndFlushSync(term, data) { + writeSync(term, data); + flushSync(term); +} + +/** + * Switch active tab and resize terminal viewport + */ +export function switchTab(tabId) { + if (!terminals[tabId]) + return; + + activeTabId = tabId; + + // Update tab header UI + document.querySelectorAll(".tab").forEach((btn) => { + btn.classList.toggle("active", btn.getAttribute("data-tab") === tabId); + }); + + // Update terminal pane visibility + document.querySelectorAll(".terminal-pane").forEach((pane) => { + pane.classList.toggle("active", pane.id === `pane-${tabId}`); + }); + + // Reflow and fit terminal to container + fitAddons[tabId].fit(); + + const term = terminals[tabId]; + term.focus(); + + // Immediately unpause render service and force pending layout/resize tasks + // so that terminal operations render synchronously during -Sync instead of + // waiting for asynchronous IntersectionObserver callbacks in -Async! + if (term._core && term._core._renderService) { + const rs = term._core._renderService; + if (rs._isPaused) { + rs._isPaused = false; + if (rs._charSizeService && !rs._charSizeService.hasValidSize) + rs._charSizeService.measure(); + + if (rs._needsFullRefresh) { + if (rs._pausedResizeTask && typeof rs._pausedResizeTask.flush === "function") + rs._pausedResizeTask.flush(); + + rs.refreshRows(0, rs._rowCount - 1); + rs._needsFullRefresh = false; + } + } + } + flushSync(term); +} + +async function finishStep() { + // 1. Give xterm and addons initial microtask ticks to allow any pending + // DOM observer callbacks or event listeners to push their rendering timers. + for (let i = 0; i < 10; i++) + await Promise.resolve(); + + // 2. Loop until all scheduled xterm rendering passes, texture atlas warmups, + // macro-task timers (setTimeout/rAF/rIC), DOM observers, and + // asynchronous GPU texture bitmaps (createImageBitmap) have completely drained. + let drainLimit = 300; + while ((window.__activeTimers.size > 0 || window.__activeBitmaps.size > 0 || (window.__activeObservers && window.__activeObservers.size > 0)) && drainLimit-- > 0) { + if (window.__activeBitmaps.size > 0) + await Promise.all(Array.from(window.__activeBitmaps)); + + Object.values(terminals).forEach((term) => flushSync(term)); + // Yield to the browser's Macro-Task Queue so pending setTimeout(0), + // requestAnimationFrame, and requestIdleCallback callbacks actually execute! + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + // 3. Final defensive settling phase: await additional microtask ticks to ensure + // zero deferred rendering work spills over into subsequent steps or async measurement. + for (let i = 0; i < 20; i++) + await Promise.resolve(); + + // 4. Synchronously flush all terminal renderers, viewports, and selection overlays + // right before step completion so zero animation frames spill over into -async. + Object.values(terminals).forEach((term) => flushSync(term)); + + window.dispatchEvent(new CustomEvent("step-complete")); +} + +/** + * Benchmark Step 1: Dump & Scroll Output + * Dumps ~1,500 lines of verbose build logs, triggers line wrapping, and scrolls through buffer + */ +export async function dumpAndScroll() { + switchTab("build"); + const term = terminals.build; + if (!term) { + await finishStep(); + return; + } + + term.clear(); + + // Write ~50% of build log chunks to target ~50ms workload complexity + const limit = Math.min(75, buildLogChunks.length); + for (let i = 0; i < limit; i++) + writeSync(term, buildLogChunks[i]); + + flushSync(term); + + // Force viewport scroll manipulations and text selection + term.scrollToTop(); + flushSync(term); + for (let i = 0; i < 10; i++) { + term.scrollLines(50); + flushSync(term); + } + term.scrollToBottom(); + flushSync(term); + + // Simulate user selecting a block of logs + term.select(0, 10, 80); + flushSync(term); + term.clearSelection(); + flushSync(term); + + await finishStep(); +} + +/** + * Benchmark Step 2: Inline Links & Hover + * Dumps URLs and paths, then simulates mouse hover events across grid to trigger regex link provider + */ +export async function hoverInlineLinks() { + switchTab("links"); + const term = terminals.links; + if (!term) { + await finishStep(); + return; + } + + term.clear(); + // Write ~50% of link chunks to target ~15ms workload complexity + const limit = Math.min(40, linksChunks.length); + for (let i = 0; i < limit; i++) + writeSync(term, linksChunks[i]); + + flushSync(term); + + // Simulate mouse moves across rows to trigger @xterm/addon-web-links regex matching & decorations + const screenElement = term.element ? term.element.querySelector(".xterm-screen") : null; + if (screenElement) { + const rect = screenElement.getBoundingClientRect(); + const stepY = rect.height / 25; + const stepX = rect.width / 4; + + for (let row = 1; row <= 10; row++) { + for (let col = 1; col <= 3; col++) { + const clientX = rect.left + col * stepX; + const clientY = rect.top + row * stepY; + const moveEvent = new MouseEvent("mousemove", { + view: window, + bubbles: true, + cancelable: true, + clientX, + clientY, + }); + screenElement.dispatchEvent(moveEvent); + flushSync(term); + } + } + } + + await finishStep(); +} + +/** + * Benchmark Step 3: Ncurses Color UI + * Emits 4 sequential frames of an htop monitor with cursor positioning, TrueColor, and partial grid redraws + */ +export async function ncursesColorUI() { + switchTab("ncurses"); + const term = terminals.ncurses; + if (!term) { + await finishStep(); + return; + } + + for (let i = 0; i < ncursesFrames.length; i++) + writeAndFlushSync(term, ncursesFrames[i]); + + term.refresh(0, term.rows - 1); + flushSync(term); + await finishStep(); +} + +/** + * Benchmark Step 4: Switch Tabs & Resize + * Simulates switching between multiple active IDE terminal panels and reflowing columns + */ +export async function switchTabsAndResize() { + // Switch between 2 active panels ("build" and "links") to target ~20ms workload complexity + const tabs = ["build", "links"]; + const container = document.getElementById("terminal-container"); + + for (let cycle = 0; cycle < 1; cycle++) { + for (let i = 0; i < tabs.length; i++) { + const tabId = tabs[i]; + + // Simulate IDE sidebar toggling or panel resizing by mutating width slightly + container.style.width = i === 0 ? "95%" : "100%"; + + switchTab(tabId); + + // Write a small status ping and synchronously reflow/flush on active tab + writeAndFlushSync(terminals[tabId], `\x1b[2m[Tab switched to ${tabId} at ${Date.now()}]\x1b[0m\r\n`); + } + } + + container.style.width = "100%"; + + switchTab("build"); + await finishStep(); +} + +/** + * Benchmark Step 5: Layout Check + */ +export function layoutCheck() { + const body = document.body.getBoundingClientRect(); + layoutCheck.e = document.elementFromPoint((body.width / 2) | 0, (body.height / 2) | 0); +} + +// Event bindings for UI buttons and tab headers +window.addEventListener("DOMContentLoaded", () => { + initTerminals(); + + document.querySelectorAll(".tab").forEach((btn) => { + btn.addEventListener("click", () => { + switchTab(btn.getAttribute("data-tab")); + }); + }); + + document.getElementById("btn-init").addEventListener("click", initTerminals); + document.getElementById("btn-dump-scroll").addEventListener("click", dumpAndScroll); + document.getElementById("btn-hover-links").addEventListener("click", hoverInlineLinks); + document.getElementById("btn-ncurses").addEventListener("click", ncursesColorUI); + document.getElementById("btn-switch-tabs").addEventListener("click", switchTabsAndResize); + document.getElementById("btn-layout").addEventListener("click", layoutCheck); + + // Handle window resizing + window.addEventListener("resize", () => { + fitAddons[activeTabId].fit(); + }); +}); + +// Expose benchmark steps globally for Speedometer suite runner and local experimentation +window.terminalBenchmark = { + init: initTerminals, + dumpAndScroll, + hoverInlineLinks, + ncursesColorUI, + switchTabsAndResize, + layout: layoutCheck, + switchTab, + terminals, + fitAddons, +}; diff --git a/suites-experimental/terminal-xterm/dist/assets/main.css b/suites-experimental/terminal-xterm/dist/assets/main.css new file mode 100644 index 000000000..7ef597d95 --- /dev/null +++ b/suites-experimental/terminal-xterm/dist/assets/main.css @@ -0,0 +1,384 @@ +/* Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). + */ + +/* IDE Terminal Panel Styling */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body, +html { + width: 100%; + height: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + background-color: #1e1e1e; + color: #d4d4d4; + overflow: hidden; +} + +#app { + display: flex; + flex-direction: column; + width: 100vw; + height: 100vh; +} + +/* Header & Tab Bar */ +#header { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + background-color: #252526; + border-bottom: 1px solid #3c3c3c; + height: 40px; + padding: 0 8px; + user-select: none; +} + +#tab-bar { + display: flex; + flex-direction: row; + align-items: center; + gap: 2px; + height: 100%; +} + +.tab { + display: flex; + align-items: center; + gap: 6px; + padding: 0 12px; + height: 100%; + font-size: 13px; + color: #969696; + background-color: #2d2d2d; + border: none; + border-top: 2px solid transparent; + cursor: pointer; + transition: background-color 0.1s, color 0.1s; +} + +.tab:hover { + background-color: #282828; + color: #cccccc; +} + +.tab.active { + background-color: #1e1e1e; + color: #ffffff; + border-top-color: #007acc; /* VS Code blue accent */ + font-weight: 500; +} + +.tab-icon { + font-size: 14px; +} + +/* Control Toolbar */ +#controls { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; +} + +.btn { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + font-size: 12px; + font-weight: 500; + color: #cccccc; + background-color: #333333; + border: 1px solid #454545; + border-radius: 3px; + cursor: pointer; + transition: background-color 0.15s, border-color 0.15s; +} + +.btn:hover:not(:disabled) { + background-color: #3e3e3e; + border-color: #555555; + color: #ffffff; +} + +.btn:active:not(:disabled) { + background-color: #007acc; + border-color: #007acc; + color: #ffffff; +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn.active { + background-color: #007acc; + border-color: #007acc; + color: #ffffff; +} + +/* Terminal Viewport Container */ +#terminal-container { + flex: 1; + position: relative; + width: 100%; + height: calc(100vh - 40px); + padding: 8px; + background-color: #1e1e1e; +} + +.terminal-pane { + position: absolute; + top: 8px; + left: 8px; + right: 8px; + bottom: 8px; + display: none; + width: calc(100% - 16px); + height: calc(100% - 16px); +} + +.terminal-pane.active { + display: block; +} + +/* Override xterm scrollbar styling to match dark IDE theme */ +.xterm .xterm-viewport::-webkit-scrollbar { + width: 10px; +} +.xterm .xterm-viewport::-webkit-scrollbar-track { + background: #1e1e1e; +} +.xterm .xterm-viewport::-webkit-scrollbar-thumb { + background: #424242; +} +.xterm .xterm-viewport::-webkit-scrollbar-thumb:hover { + background: #4f4f4f; +} +/** + * Copyright (c) 2014 The xterm.js authors. All rights reserved. + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * https://github.com/chjj/term.js + * @license MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + * The original design remains. The terminal itself + * has been extended to include xterm CSI codes, among + * other features. + */ + +/** + * Default styles for xterm.js + */ + +.xterm { + cursor: text; + position: relative; + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; +} + +.xterm.focus, +.xterm:focus { + outline: none; +} + +.xterm .xterm-helpers { + position: absolute; + top: 0; + /** + * The z-index of the helpers must be higher than the canvases in order for + * IMEs to appear on top. + */ + z-index: 5; +} + +.xterm .xterm-helper-textarea { + padding: 0; + border: 0; + margin: 0; + /* Move textarea out of the screen to the far left, so that the cursor is not visible */ + position: absolute; + opacity: 0; + left: -9999em; + top: 0; + width: 0; + height: 0; + z-index: -5; + /** Prevent wrapping so the IME appears against the textarea at the correct position */ + white-space: nowrap; + overflow: hidden; + resize: none; +} + +.xterm .composition-view { + /* TODO: Composition position got messed up somewhere */ + background: #000; + color: #FFF; + display: none; + position: absolute; + white-space: nowrap; + z-index: 1; +} + +.xterm .composition-view.active { + display: block; +} + +.xterm .xterm-viewport { + /* On OS X this is required in order for the scroll bar to appear fully opaque */ + background-color: #000; + overflow-y: scroll; + cursor: default; + position: absolute; + right: 0; + left: 0; + top: 0; + bottom: 0; +} + +.xterm .xterm-screen { + position: relative; +} + +.xterm .xterm-screen canvas { + position: absolute; + left: 0; + top: 0; +} + +.xterm .xterm-scroll-area { + visibility: hidden; +} + +.xterm-char-measure-element { + display: inline-block; + visibility: hidden; + position: absolute; + top: 0; + left: -9999em; + line-height: normal; +} + +.xterm.enable-mouse-events { + /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ + cursor: default; +} + +.xterm.xterm-cursor-pointer, +.xterm .xterm-cursor-pointer { + cursor: pointer; +} + +.xterm.column-select.focus { + /* Column selection mode */ + cursor: crosshair; +} + +.xterm .xterm-accessibility:not(.debug), +.xterm .xterm-message { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 10; + color: transparent; + pointer-events: none; +} + +.xterm .xterm-accessibility-tree:not(.debug) *::selection { + color: transparent; +} + +.xterm .xterm-accessibility-tree { + user-select: text; + white-space: pre; +} + +.xterm .live-region { + position: absolute; + left: -9999px; + width: 1px; + height: 1px; + overflow: hidden; +} + +.xterm-dim { + /* Dim should not apply to background, so the opacity of the foreground color is applied + * explicitly in the generated class and reset to 1 here */ + opacity: 1 !important; +} + +.xterm-underline-1 { text-decoration: underline; } +.xterm-underline-2 { text-decoration: double underline; } +.xterm-underline-3 { text-decoration: wavy underline; } +.xterm-underline-4 { text-decoration: dotted underline; } +.xterm-underline-5 { text-decoration: dashed underline; } + +.xterm-overline { + text-decoration: overline; +} + +.xterm-overline.xterm-underline-1 { text-decoration: overline underline; } +.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; } +.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; } +.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; } +.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; } + +.xterm-strikethrough { + text-decoration: line-through; +} + +.xterm-screen .xterm-decoration-container .xterm-decoration { + z-index: 6; + position: absolute; +} + +.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { + z-index: 7; +} + +.xterm-decoration-overview-ruler { + z-index: 8; + position: absolute; + top: 0; + right: 0; + pointer-events: none; +} + +.xterm-decoration-top { + z-index: 2; + position: relative; +} diff --git a/suites-experimental/terminal-xterm/dist/assets/main.js b/suites-experimental/terminal-xterm/dist/assets/main.js new file mode 100644 index 000000000..a85a019d7 --- /dev/null +++ b/suites-experimental/terminal-xterm/dist/assets/main.js @@ -0,0 +1,10621 @@ +var xterm = { exports: {} }; +(function(module, exports) { + !function(e, t) { + module.exports = t(); + }(globalThis, () => (() => { + var e = { 4567: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.AccessibilityManager = void 0; + const n = i2(9042), o = i2(9924), a = i2(844), h = i2(4725), c = i2(2585), l = i2(3656); + let d = t2.AccessibilityManager = class extends a.Disposable { + constructor(e3, t3, i3, s3) { + super(), this._terminal = e3, this._coreBrowserService = i3, this._renderService = s3, this._rowColumns = /* @__PURE__ */ new WeakMap(), this._liveRegionLineCount = 0, this._charsToConsume = [], this._charsToAnnounce = "", this._accessibilityContainer = this._coreBrowserService.mainDocument.createElement("div"), this._accessibilityContainer.classList.add("xterm-accessibility"), this._rowContainer = this._coreBrowserService.mainDocument.createElement("div"), this._rowContainer.setAttribute("role", "list"), this._rowContainer.classList.add("xterm-accessibility-tree"), this._rowElements = []; + for (let e4 = 0; e4 < this._terminal.rows; e4++) this._rowElements[e4] = this._createAccessibilityTreeNode(), this._rowContainer.appendChild(this._rowElements[e4]); + if (this._topBoundaryFocusListener = (e4) => this._handleBoundaryFocus(e4, 0), this._bottomBoundaryFocusListener = (e4) => this._handleBoundaryFocus(e4, 1), this._rowElements[0].addEventListener("focus", this._topBoundaryFocusListener), this._rowElements[this._rowElements.length - 1].addEventListener("focus", this._bottomBoundaryFocusListener), this._refreshRowsDimensions(), this._accessibilityContainer.appendChild(this._rowContainer), this._liveRegion = this._coreBrowserService.mainDocument.createElement("div"), this._liveRegion.classList.add("live-region"), this._liveRegion.setAttribute("aria-live", "assertive"), this._accessibilityContainer.appendChild(this._liveRegion), this._liveRegionDebouncer = this.register(new o.TimeBasedDebouncer(this._renderRows.bind(this))), !this._terminal.element) throw new Error("Cannot enable accessibility before Terminal.open"); + this._terminal.element.insertAdjacentElement("afterbegin", this._accessibilityContainer), this.register(this._terminal.onResize((e4) => this._handleResize(e4.rows))), this.register(this._terminal.onRender((e4) => this._refreshRows(e4.start, e4.end))), this.register(this._terminal.onScroll(() => this._refreshRows())), this.register(this._terminal.onA11yChar((e4) => this._handleChar(e4))), this.register(this._terminal.onLineFeed(() => this._handleChar("\n"))), this.register(this._terminal.onA11yTab((e4) => this._handleTab(e4))), this.register(this._terminal.onKey((e4) => this._handleKey(e4.key))), this.register(this._terminal.onBlur(() => this._clearLiveRegion())), this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions())), this.register((0, l.addDisposableDomListener)(document, "selectionchange", () => this._handleSelectionChange())), this.register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions())), this._refreshRows(), this.register((0, a.toDisposable)(() => { + this._accessibilityContainer.remove(), this._rowElements.length = 0; + })); + } + _handleTab(e3) { + for (let t3 = 0; t3 < e3; t3++) this._handleChar(" "); + } + _handleChar(e3) { + this._liveRegionLineCount < 21 && (this._charsToConsume.length > 0 ? this._charsToConsume.shift() !== e3 && (this._charsToAnnounce += e3) : this._charsToAnnounce += e3, "\n" === e3 && (this._liveRegionLineCount++, 21 === this._liveRegionLineCount && (this._liveRegion.textContent += n.tooMuchOutput))); + } + _clearLiveRegion() { + this._liveRegion.textContent = "", this._liveRegionLineCount = 0; + } + _handleKey(e3) { + this._clearLiveRegion(), new RegExp("\\p{Control}", "u").test(e3) || this._charsToConsume.push(e3); + } + _refreshRows(e3, t3) { + this._liveRegionDebouncer.refresh(e3, t3, this._terminal.rows); + } + _renderRows(e3, t3) { + const i3 = this._terminal.buffer, s3 = i3.lines.length.toString(); + for (let r2 = e3; r2 <= t3; r2++) { + const e4 = i3.lines.get(i3.ydisp + r2), t4 = [], n2 = (e4 == null ? void 0 : e4.translateToString(true, void 0, void 0, t4)) || "", o2 = (i3.ydisp + r2 + 1).toString(), a2 = this._rowElements[r2]; + a2 && (0 === n2.length ? (a2.innerText = " ", this._rowColumns.set(a2, [0, 1])) : (a2.textContent = n2, this._rowColumns.set(a2, t4)), a2.setAttribute("aria-posinset", o2), a2.setAttribute("aria-setsize", s3)); + } + this._announceCharacters(); + } + _announceCharacters() { + 0 !== this._charsToAnnounce.length && (this._liveRegion.textContent += this._charsToAnnounce, this._charsToAnnounce = ""); + } + _handleBoundaryFocus(e3, t3) { + const i3 = e3.target, s3 = this._rowElements[0 === t3 ? 1 : this._rowElements.length - 2]; + if (i3.getAttribute("aria-posinset") === (0 === t3 ? "1" : `${this._terminal.buffer.lines.length}`)) return; + if (e3.relatedTarget !== s3) return; + let r2, n2; + if (0 === t3 ? (r2 = i3, n2 = this._rowElements.pop(), this._rowContainer.removeChild(n2)) : (r2 = this._rowElements.shift(), n2 = i3, this._rowContainer.removeChild(r2)), r2.removeEventListener("focus", this._topBoundaryFocusListener), n2.removeEventListener("focus", this._bottomBoundaryFocusListener), 0 === t3) { + const e4 = this._createAccessibilityTreeNode(); + this._rowElements.unshift(e4), this._rowContainer.insertAdjacentElement("afterbegin", e4); + } else { + const e4 = this._createAccessibilityTreeNode(); + this._rowElements.push(e4), this._rowContainer.appendChild(e4); + } + this._rowElements[0].addEventListener("focus", this._topBoundaryFocusListener), this._rowElements[this._rowElements.length - 1].addEventListener("focus", this._bottomBoundaryFocusListener), this._terminal.scrollLines(0 === t3 ? -1 : 1), this._rowElements[0 === t3 ? 1 : this._rowElements.length - 2].focus(), e3.preventDefault(), e3.stopImmediatePropagation(); + } + _handleSelectionChange() { + var _a; + if (0 === this._rowElements.length) return; + const e3 = document.getSelection(); + if (!e3) return; + if (e3.isCollapsed) return void (this._rowContainer.contains(e3.anchorNode) && this._terminal.clearSelection()); + if (!e3.anchorNode || !e3.focusNode) return void console.error("anchorNode and/or focusNode are null"); + let t3 = { node: e3.anchorNode, offset: e3.anchorOffset }, i3 = { node: e3.focusNode, offset: e3.focusOffset }; + if ((t3.node.compareDocumentPosition(i3.node) & Node.DOCUMENT_POSITION_PRECEDING || t3.node === i3.node && t3.offset > i3.offset) && ([t3, i3] = [i3, t3]), t3.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING) && (t3 = { node: this._rowElements[0].childNodes[0], offset: 0 }), !this._rowContainer.contains(t3.node)) return; + const s3 = this._rowElements.slice(-1)[0]; + if (i3.node.compareDocumentPosition(s3) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING) && (i3 = { node: s3, offset: ((_a = s3.textContent) == null ? void 0 : _a.length) ?? 0 }), !this._rowContainer.contains(i3.node)) return; + const r2 = ({ node: e4, offset: t4 }) => { + const i4 = e4 instanceof Text ? e4.parentNode : e4; + let s4 = parseInt(i4 == null ? void 0 : i4.getAttribute("aria-posinset"), 10) - 1; + if (isNaN(s4)) return console.warn("row is invalid. Race condition?"), null; + const r3 = this._rowColumns.get(i4); + if (!r3) return console.warn("columns is null. Race condition?"), null; + let n3 = t4 < r3.length ? r3[t4] : r3.slice(-1)[0] + 1; + return n3 >= this._terminal.cols && (++s4, n3 = 0), { row: s4, column: n3 }; + }, n2 = r2(t3), o2 = r2(i3); + if (n2 && o2) { + if (n2.row > o2.row || n2.row === o2.row && n2.column >= o2.column) throw new Error("invalid range"); + this._terminal.select(n2.column, n2.row, (o2.row - n2.row) * this._terminal.cols - n2.column + o2.column); + } + } + _handleResize(e3) { + this._rowElements[this._rowElements.length - 1].removeEventListener("focus", this._bottomBoundaryFocusListener); + for (let e4 = this._rowContainer.children.length; e4 < this._terminal.rows; e4++) this._rowElements[e4] = this._createAccessibilityTreeNode(), this._rowContainer.appendChild(this._rowElements[e4]); + for (; this._rowElements.length > e3; ) this._rowContainer.removeChild(this._rowElements.pop()); + this._rowElements[this._rowElements.length - 1].addEventListener("focus", this._bottomBoundaryFocusListener), this._refreshRowsDimensions(); + } + _createAccessibilityTreeNode() { + const e3 = this._coreBrowserService.mainDocument.createElement("div"); + return e3.setAttribute("role", "listitem"), e3.tabIndex = -1, this._refreshRowDimensions(e3), e3; + } + _refreshRowsDimensions() { + if (this._renderService.dimensions.css.cell.height) { + this._accessibilityContainer.style.width = `${this._renderService.dimensions.css.canvas.width}px`, this._rowElements.length !== this._terminal.rows && this._handleResize(this._terminal.rows); + for (let e3 = 0; e3 < this._terminal.rows; e3++) this._refreshRowDimensions(this._rowElements[e3]); + } + } + _refreshRowDimensions(e3) { + e3.style.height = `${this._renderService.dimensions.css.cell.height}px`; + } + }; + t2.AccessibilityManager = d = s2([r(1, c.IInstantiationService), r(2, h.ICoreBrowserService), r(3, h.IRenderService)], d); + }, 3614: (e2, t2) => { + function i2(e3) { + return e3.replace(/\r?\n/g, "\r"); + } + function s2(e3, t3) { + return t3 ? "\x1B[200~" + e3 + "\x1B[201~" : e3; + } + function r(e3, t3, r2, n2) { + e3 = s2(e3 = i2(e3), r2.decPrivateModes.bracketedPasteMode && true !== n2.rawOptions.ignoreBracketedPasteMode), r2.triggerDataEvent(e3, true), t3.value = ""; + } + function n(e3, t3, i3) { + const s3 = i3.getBoundingClientRect(), r2 = e3.clientX - s3.left - 10, n2 = e3.clientY - s3.top - 10; + t3.style.width = "20px", t3.style.height = "20px", t3.style.left = `${r2}px`, t3.style.top = `${n2}px`, t3.style.zIndex = "1000", t3.focus(); + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.rightClickHandler = t2.moveTextAreaUnderMouseCursor = t2.paste = t2.handlePasteEvent = t2.copyHandler = t2.bracketTextForPaste = t2.prepareTextForTerminal = void 0, t2.prepareTextForTerminal = i2, t2.bracketTextForPaste = s2, t2.copyHandler = function(e3, t3) { + e3.clipboardData && e3.clipboardData.setData("text/plain", t3.selectionText), e3.preventDefault(); + }, t2.handlePasteEvent = function(e3, t3, i3, s3) { + e3.stopPropagation(), e3.clipboardData && r(e3.clipboardData.getData("text/plain"), t3, i3, s3); + }, t2.paste = r, t2.moveTextAreaUnderMouseCursor = n, t2.rightClickHandler = function(e3, t3, i3, s3, r2) { + n(e3, t3, i3), r2 && s3.rightClickSelect(e3), t3.value = s3.selectionText, t3.select(); + }; + }, 7239: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ColorContrastCache = void 0; + const s2 = i2(1505); + t2.ColorContrastCache = class { + constructor() { + this._color = new s2.TwoKeyMap(), this._css = new s2.TwoKeyMap(); + } + setCss(e3, t3, i3) { + this._css.set(e3, t3, i3); + } + getCss(e3, t3) { + return this._css.get(e3, t3); + } + setColor(e3, t3, i3) { + this._color.set(e3, t3, i3); + } + getColor(e3, t3) { + return this._color.get(e3, t3); + } + clear() { + this._color.clear(), this._css.clear(); + } + }; + }, 3656: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.addDisposableDomListener = void 0, t2.addDisposableDomListener = function(e3, t3, i2, s2) { + e3.addEventListener(t3, i2, s2); + let r = false; + return { dispose: () => { + r || (r = true, e3.removeEventListener(t3, i2, s2)); + } }; + }; + }, 3551: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.Linkifier = void 0; + const n = i2(3656), o = i2(8460), a = i2(844), h = i2(2585), c = i2(4725); + let l = t2.Linkifier = class extends a.Disposable { + get currentLink() { + return this._currentLink; + } + constructor(e3, t3, i3, s3, r2) { + super(), this._element = e3, this._mouseService = t3, this._renderService = i3, this._bufferService = s3, this._linkProviderService = r2, this._linkCacheDisposables = [], this._isMouseOut = true, this._wasResized = false, this._activeLine = -1, this._onShowLinkUnderline = this.register(new o.EventEmitter()), this.onShowLinkUnderline = this._onShowLinkUnderline.event, this._onHideLinkUnderline = this.register(new o.EventEmitter()), this.onHideLinkUnderline = this._onHideLinkUnderline.event, this.register((0, a.getDisposeArrayDisposable)(this._linkCacheDisposables)), this.register((0, a.toDisposable)(() => { + var _a; + this._lastMouseEvent = void 0, (_a = this._activeProviderReplies) == null ? void 0 : _a.clear(); + })), this.register(this._bufferService.onResize(() => { + this._clearCurrentLink(), this._wasResized = true; + })), this.register((0, n.addDisposableDomListener)(this._element, "mouseleave", () => { + this._isMouseOut = true, this._clearCurrentLink(); + })), this.register((0, n.addDisposableDomListener)(this._element, "mousemove", this._handleMouseMove.bind(this))), this.register((0, n.addDisposableDomListener)(this._element, "mousedown", this._handleMouseDown.bind(this))), this.register((0, n.addDisposableDomListener)(this._element, "mouseup", this._handleMouseUp.bind(this))); + } + _handleMouseMove(e3) { + this._lastMouseEvent = e3; + const t3 = this._positionFromMouseEvent(e3, this._element, this._mouseService); + if (!t3) return; + this._isMouseOut = false; + const i3 = e3.composedPath(); + for (let e4 = 0; e4 < i3.length; e4++) { + const t4 = i3[e4]; + if (t4.classList.contains("xterm")) break; + if (t4.classList.contains("xterm-hover")) return; + } + this._lastBufferCell && t3.x === this._lastBufferCell.x && t3.y === this._lastBufferCell.y || (this._handleHover(t3), this._lastBufferCell = t3); + } + _handleHover(e3) { + if (this._activeLine !== e3.y || this._wasResized) return this._clearCurrentLink(), this._askForLink(e3, false), void (this._wasResized = false); + this._currentLink && this._linkAtPosition(this._currentLink.link, e3) || (this._clearCurrentLink(), this._askForLink(e3, true)); + } + _askForLink(e3, t3) { + var _a, _b; + this._activeProviderReplies && t3 || ((_a = this._activeProviderReplies) == null ? void 0 : _a.forEach((e4) => { + e4 == null ? void 0 : e4.forEach((e5) => { + e5.link.dispose && e5.link.dispose(); + }); + }), this._activeProviderReplies = /* @__PURE__ */ new Map(), this._activeLine = e3.y); + let i3 = false; + for (const [s3, r2] of this._linkProviderService.linkProviders.entries()) if (t3) { + const t4 = (_b = this._activeProviderReplies) == null ? void 0 : _b.get(s3); + t4 && (i3 = this._checkLinkProviderResult(s3, e3, i3)); + } else r2.provideLinks(e3.y, (t4) => { + var _a2, _b2; + if (this._isMouseOut) return; + const r3 = t4 == null ? void 0 : t4.map((e4) => ({ link: e4 })); + (_a2 = this._activeProviderReplies) == null ? void 0 : _a2.set(s3, r3), i3 = this._checkLinkProviderResult(s3, e3, i3), ((_b2 = this._activeProviderReplies) == null ? void 0 : _b2.size) === this._linkProviderService.linkProviders.length && this._removeIntersectingLinks(e3.y, this._activeProviderReplies); + }); + } + _removeIntersectingLinks(e3, t3) { + const i3 = /* @__PURE__ */ new Set(); + for (let s3 = 0; s3 < t3.size; s3++) { + const r2 = t3.get(s3); + if (r2) for (let t4 = 0; t4 < r2.length; t4++) { + const s4 = r2[t4], n2 = s4.link.range.start.y < e3 ? 0 : s4.link.range.start.x, o2 = s4.link.range.end.y > e3 ? this._bufferService.cols : s4.link.range.end.x; + for (let e4 = n2; e4 <= o2; e4++) { + if (i3.has(e4)) { + r2.splice(t4--, 1); + break; + } + i3.add(e4); + } + } + } + } + _checkLinkProviderResult(e3, t3, i3) { + var _a; + if (!this._activeProviderReplies) return i3; + const s3 = this._activeProviderReplies.get(e3); + let r2 = false; + for (let t4 = 0; t4 < e3; t4++) this._activeProviderReplies.has(t4) && !this._activeProviderReplies.get(t4) || (r2 = true); + if (!r2 && s3) { + const e4 = s3.find((e5) => this._linkAtPosition(e5.link, t3)); + e4 && (i3 = true, this._handleNewLink(e4)); + } + if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !i3) for (let e4 = 0; e4 < this._activeProviderReplies.size; e4++) { + const s4 = (_a = this._activeProviderReplies.get(e4)) == null ? void 0 : _a.find((e5) => this._linkAtPosition(e5.link, t3)); + if (s4) { + i3 = true, this._handleNewLink(s4); + break; + } + } + return i3; + } + _handleMouseDown() { + this._mouseDownLink = this._currentLink; + } + _handleMouseUp(e3) { + if (!this._currentLink) return; + const t3 = this._positionFromMouseEvent(e3, this._element, this._mouseService); + t3 && this._mouseDownLink === this._currentLink && this._linkAtPosition(this._currentLink.link, t3) && this._currentLink.link.activate(e3, this._currentLink.link.text); + } + _clearCurrentLink(e3, t3) { + this._currentLink && this._lastMouseEvent && (!e3 || !t3 || this._currentLink.link.range.start.y >= e3 && this._currentLink.link.range.end.y <= t3) && (this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent), this._currentLink = void 0, (0, a.disposeArray)(this._linkCacheDisposables)); + } + _handleNewLink(e3) { + if (!this._lastMouseEvent) return; + const t3 = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService); + t3 && this._linkAtPosition(e3.link, t3) && (this._currentLink = e3, this._currentLink.state = { decorations: { underline: void 0 === e3.link.decorations || e3.link.decorations.underline, pointerCursor: void 0 === e3.link.decorations || e3.link.decorations.pointerCursor }, isHovered: true }, this._linkHover(this._element, e3.link, this._lastMouseEvent), e3.link.decorations = {}, Object.defineProperties(e3.link.decorations, { pointerCursor: { get: () => { + var _a, _b; + return (_b = (_a = this._currentLink) == null ? void 0 : _a.state) == null ? void 0 : _b.decorations.pointerCursor; + }, set: (e4) => { + var _a; + ((_a = this._currentLink) == null ? void 0 : _a.state) && this._currentLink.state.decorations.pointerCursor !== e4 && (this._currentLink.state.decorations.pointerCursor = e4, this._currentLink.state.isHovered && this._element.classList.toggle("xterm-cursor-pointer", e4)); + } }, underline: { get: () => { + var _a, _b; + return (_b = (_a = this._currentLink) == null ? void 0 : _a.state) == null ? void 0 : _b.decorations.underline; + }, set: (t4) => { + var _a, _b, _c; + ((_a = this._currentLink) == null ? void 0 : _a.state) && ((_c = (_b = this._currentLink) == null ? void 0 : _b.state) == null ? void 0 : _c.decorations.underline) !== t4 && (this._currentLink.state.decorations.underline = t4, this._currentLink.state.isHovered && this._fireUnderlineEvent(e3.link, t4)); + } } }), this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e4) => { + if (!this._currentLink) return; + const t4 = 0 === e4.start ? 0 : e4.start + 1 + this._bufferService.buffer.ydisp, i3 = this._bufferService.buffer.ydisp + 1 + e4.end; + if (this._currentLink.link.range.start.y >= t4 && this._currentLink.link.range.end.y <= i3 && (this._clearCurrentLink(t4, i3), this._lastMouseEvent)) { + const e5 = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService); + e5 && this._askForLink(e5, false); + } + }))); + } + _linkHover(e3, t3, i3) { + var _a; + ((_a = this._currentLink) == null ? void 0 : _a.state) && (this._currentLink.state.isHovered = true, this._currentLink.state.decorations.underline && this._fireUnderlineEvent(t3, true), this._currentLink.state.decorations.pointerCursor && e3.classList.add("xterm-cursor-pointer")), t3.hover && t3.hover(i3, t3.text); + } + _fireUnderlineEvent(e3, t3) { + const i3 = e3.range, s3 = this._bufferService.buffer.ydisp, r2 = this._createLinkUnderlineEvent(i3.start.x - 1, i3.start.y - s3 - 1, i3.end.x, i3.end.y - s3 - 1, void 0); + (t3 ? this._onShowLinkUnderline : this._onHideLinkUnderline).fire(r2); + } + _linkLeave(e3, t3, i3) { + var _a; + ((_a = this._currentLink) == null ? void 0 : _a.state) && (this._currentLink.state.isHovered = false, this._currentLink.state.decorations.underline && this._fireUnderlineEvent(t3, false), this._currentLink.state.decorations.pointerCursor && e3.classList.remove("xterm-cursor-pointer")), t3.leave && t3.leave(i3, t3.text); + } + _linkAtPosition(e3, t3) { + const i3 = e3.range.start.y * this._bufferService.cols + e3.range.start.x, s3 = e3.range.end.y * this._bufferService.cols + e3.range.end.x, r2 = t3.y * this._bufferService.cols + t3.x; + return i3 <= r2 && r2 <= s3; + } + _positionFromMouseEvent(e3, t3, i3) { + const s3 = i3.getCoords(e3, t3, this._bufferService.cols, this._bufferService.rows); + if (s3) return { x: s3[0], y: s3[1] + this._bufferService.buffer.ydisp }; + } + _createLinkUnderlineEvent(e3, t3, i3, s3, r2) { + return { x1: e3, y1: t3, x2: i3, y2: s3, cols: this._bufferService.cols, fg: r2 }; + } + }; + t2.Linkifier = l = s2([r(1, c.IMouseService), r(2, c.IRenderService), r(3, h.IBufferService), r(4, c.ILinkProviderService)], l); + }, 9042: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.tooMuchOutput = t2.promptLabel = void 0, t2.promptLabel = "Terminal input", t2.tooMuchOutput = "Too much output to announce, navigate to rows manually to read"; + }, 3730: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.OscLinkProvider = void 0; + const n = i2(511), o = i2(2585); + let a = t2.OscLinkProvider = class { + constructor(e3, t3, i3) { + this._bufferService = e3, this._optionsService = t3, this._oscLinkService = i3; + } + provideLinks(e3, t3) { + var _a; + const i3 = this._bufferService.buffer.lines.get(e3 - 1); + if (!i3) return void t3(void 0); + const s3 = [], r2 = this._optionsService.rawOptions.linkHandler, o2 = new n.CellData(), a2 = i3.getTrimmedLength(); + let c = -1, l = -1, d = false; + for (let t4 = 0; t4 < a2; t4++) if (-1 !== l || i3.hasContent(t4)) { + if (i3.loadCell(t4, o2), o2.hasExtendedAttrs() && o2.extended.urlId) { + if (-1 === l) { + l = t4, c = o2.extended.urlId; + continue; + } + d = o2.extended.urlId !== c; + } else -1 !== l && (d = true); + if (d || -1 !== l && t4 === a2 - 1) { + const i4 = (_a = this._oscLinkService.getLinkData(c)) == null ? void 0 : _a.uri; + if (i4) { + const n2 = { start: { x: l + 1, y: e3 }, end: { x: t4 + (d || t4 !== a2 - 1 ? 0 : 1), y: e3 } }; + let o3 = false; + if (!(r2 == null ? void 0 : r2.allowNonHttpProtocols)) try { + const e4 = new URL(i4); + ["http:", "https:"].includes(e4.protocol) || (o3 = true); + } catch (e4) { + o3 = true; + } + o3 || s3.push({ text: i4, range: n2, activate: (e4, t5) => r2 ? r2.activate(e4, t5, n2) : h(0, t5), hover: (e4, t5) => { + var _a2; + return (_a2 = r2 == null ? void 0 : r2.hover) == null ? void 0 : _a2.call(r2, e4, t5, n2); + }, leave: (e4, t5) => { + var _a2; + return (_a2 = r2 == null ? void 0 : r2.leave) == null ? void 0 : _a2.call(r2, e4, t5, n2); + } }); + } + d = false, o2.hasExtendedAttrs() && o2.extended.urlId ? (l = t4, c = o2.extended.urlId) : (l = -1, c = -1); + } + } + t3(s3); + } + }; + function h(e3, t3) { + if (confirm(`Do you want to navigate to ${t3}? + +WARNING: This link could potentially be dangerous`)) { + const e4 = window.open(); + if (e4) { + try { + e4.opener = null; + } catch { + } + e4.location.href = t3; + } else console.warn("Opening link blocked as opener could not be cleared"); + } + } + t2.OscLinkProvider = a = s2([r(0, o.IBufferService), r(1, o.IOptionsService), r(2, o.IOscLinkService)], a); + }, 6193: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.RenderDebouncer = void 0, t2.RenderDebouncer = class { + constructor(e3, t3) { + this._renderCallback = e3, this._coreBrowserService = t3, this._refreshCallbacks = []; + } + dispose() { + this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + addRefreshCallback(e3) { + return this._refreshCallbacks.push(e3), this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh())), this._animationFrame; + } + refresh(e3, t3, i2) { + this._rowCount = i2, e3 = void 0 !== e3 ? e3 : 0, t3 = void 0 !== t3 ? t3 : this._rowCount - 1, this._rowStart = void 0 !== this._rowStart ? Math.min(this._rowStart, e3) : e3, this._rowEnd = void 0 !== this._rowEnd ? Math.max(this._rowEnd, t3) : t3, this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh())); + } + _innerRefresh() { + if (this._animationFrame = void 0, void 0 === this._rowStart || void 0 === this._rowEnd || void 0 === this._rowCount) return void this._runRefreshCallbacks(); + const e3 = Math.max(this._rowStart, 0), t3 = Math.min(this._rowEnd, this._rowCount - 1); + this._rowStart = void 0, this._rowEnd = void 0, this._renderCallback(e3, t3), this._runRefreshCallbacks(); + } + _runRefreshCallbacks() { + for (const e3 of this._refreshCallbacks) e3(0); + this._refreshCallbacks = []; + } + }; + }, 3236: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Terminal = void 0; + const s2 = i2(3614), r = i2(3656), n = i2(3551), o = i2(9042), a = i2(3730), h = i2(1680), c = i2(3107), l = i2(5744), d = i2(2950), _ = i2(1296), u = i2(428), f = i2(4269), v = i2(5114), p = i2(8934), g = i2(3230), m = i2(9312), S = i2(4725), C = i2(6731), b = i2(8055), w = i2(8969), y = i2(8460), E = i2(844), k = i2(6114), L = i2(8437), D = i2(2584), R = i2(7399), x = i2(5941), A = i2(9074), B = i2(2585), T = i2(5435), M = i2(4567), O = i2(779); + class P extends w.CoreTerminal { + get onFocus() { + return this._onFocus.event; + } + get onBlur() { + return this._onBlur.event; + } + get onA11yChar() { + return this._onA11yCharEmitter.event; + } + get onA11yTab() { + return this._onA11yTabEmitter.event; + } + get onWillOpen() { + return this._onWillOpen.event; + } + constructor(e3 = {}) { + super(e3), this.browser = k, this._keyDownHandled = false, this._keyDownSeen = false, this._keyPressHandled = false, this._unprocessedDeadKey = false, this._accessibilityManager = this.register(new E.MutableDisposable()), this._onCursorMove = this.register(new y.EventEmitter()), this.onCursorMove = this._onCursorMove.event, this._onKey = this.register(new y.EventEmitter()), this.onKey = this._onKey.event, this._onRender = this.register(new y.EventEmitter()), this.onRender = this._onRender.event, this._onSelectionChange = this.register(new y.EventEmitter()), this.onSelectionChange = this._onSelectionChange.event, this._onTitleChange = this.register(new y.EventEmitter()), this.onTitleChange = this._onTitleChange.event, this._onBell = this.register(new y.EventEmitter()), this.onBell = this._onBell.event, this._onFocus = this.register(new y.EventEmitter()), this._onBlur = this.register(new y.EventEmitter()), this._onA11yCharEmitter = this.register(new y.EventEmitter()), this._onA11yTabEmitter = this.register(new y.EventEmitter()), this._onWillOpen = this.register(new y.EventEmitter()), this._setup(), this._decorationService = this._instantiationService.createInstance(A.DecorationService), this._instantiationService.setService(B.IDecorationService, this._decorationService), this._linkProviderService = this._instantiationService.createInstance(O.LinkProviderService), this._instantiationService.setService(S.ILinkProviderService, this._linkProviderService), this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)), this.register(this._inputHandler.onRequestBell(() => this._onBell.fire())), this.register(this._inputHandler.onRequestRefreshRows((e4, t3) => this.refresh(e4, t3))), this.register(this._inputHandler.onRequestSendFocus(() => this._reportFocus())), this.register(this._inputHandler.onRequestReset(() => this.reset())), this.register(this._inputHandler.onRequestWindowsOptionsReport((e4) => this._reportWindowsOptions(e4))), this.register(this._inputHandler.onColor((e4) => this._handleColorEvent(e4))), this.register((0, y.forwardEvent)(this._inputHandler.onCursorMove, this._onCursorMove)), this.register((0, y.forwardEvent)(this._inputHandler.onTitleChange, this._onTitleChange)), this.register((0, y.forwardEvent)(this._inputHandler.onA11yChar, this._onA11yCharEmitter)), this.register((0, y.forwardEvent)(this._inputHandler.onA11yTab, this._onA11yTabEmitter)), this.register(this._bufferService.onResize((e4) => this._afterResize(e4.cols, e4.rows))), this.register((0, E.toDisposable)(() => { + var _a, _b; + this._customKeyEventHandler = void 0, (_b = (_a = this.element) == null ? void 0 : _a.parentNode) == null ? void 0 : _b.removeChild(this.element); + })); + } + _handleColorEvent(e3) { + if (this._themeService) for (const t3 of e3) { + let e4, i3 = ""; + switch (t3.index) { + case 256: + e4 = "foreground", i3 = "10"; + break; + case 257: + e4 = "background", i3 = "11"; + break; + case 258: + e4 = "cursor", i3 = "12"; + break; + default: + e4 = "ansi", i3 = "4;" + t3.index; + } + switch (t3.type) { + case 0: + const s3 = b.color.toColorRGB("ansi" === e4 ? this._themeService.colors.ansi[t3.index] : this._themeService.colors[e4]); + this.coreService.triggerDataEvent(`${D.C0.ESC}]${i3};${(0, x.toRgbString)(s3)}${D.C1_ESCAPED.ST}`); + break; + case 1: + if ("ansi" === e4) this._themeService.modifyColors((e5) => e5.ansi[t3.index] = b.channels.toColor(...t3.color)); + else { + const i4 = e4; + this._themeService.modifyColors((e5) => e5[i4] = b.channels.toColor(...t3.color)); + } + break; + case 2: + this._themeService.restoreColor(t3.index); + } + } + } + _setup() { + super._setup(), this._customKeyEventHandler = void 0; + } + get buffer() { + return this.buffers.active; + } + focus() { + this.textarea && this.textarea.focus({ preventScroll: true }); + } + _handleScreenReaderModeOptionChange(e3) { + e3 ? !this._accessibilityManager.value && this._renderService && (this._accessibilityManager.value = this._instantiationService.createInstance(M.AccessibilityManager, this)) : this._accessibilityManager.clear(); + } + _handleTextAreaFocus(e3) { + this.coreService.decPrivateModes.sendFocus && this.coreService.triggerDataEvent(D.C0.ESC + "[I"), this.element.classList.add("focus"), this._showCursor(), this._onFocus.fire(); + } + blur() { + var _a; + return (_a = this.textarea) == null ? void 0 : _a.blur(); + } + _handleTextAreaBlur() { + this.textarea.value = "", this.refresh(this.buffer.y, this.buffer.y), this.coreService.decPrivateModes.sendFocus && this.coreService.triggerDataEvent(D.C0.ESC + "[O"), this.element.classList.remove("focus"), this._onBlur.fire(); + } + _syncTextArea() { + if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper.isComposing || !this._renderService) return; + const e3 = this.buffer.ybase + this.buffer.y, t3 = this.buffer.lines.get(e3); + if (!t3) return; + const i3 = Math.min(this.buffer.x, this.cols - 1), s3 = this._renderService.dimensions.css.cell.height, r2 = t3.getWidth(i3), n2 = this._renderService.dimensions.css.cell.width * r2, o2 = this.buffer.y * this._renderService.dimensions.css.cell.height, a2 = i3 * this._renderService.dimensions.css.cell.width; + this.textarea.style.left = a2 + "px", this.textarea.style.top = o2 + "px", this.textarea.style.width = n2 + "px", this.textarea.style.height = s3 + "px", this.textarea.style.lineHeight = s3 + "px", this.textarea.style.zIndex = "-5"; + } + _initGlobal() { + this._bindKeys(), this.register((0, r.addDisposableDomListener)(this.element, "copy", (e4) => { + this.hasSelection() && (0, s2.copyHandler)(e4, this._selectionService); + })); + const e3 = (e4) => (0, s2.handlePasteEvent)(e4, this.textarea, this.coreService, this.optionsService); + this.register((0, r.addDisposableDomListener)(this.textarea, "paste", e3)), this.register((0, r.addDisposableDomListener)(this.element, "paste", e3)), k.isFirefox ? this.register((0, r.addDisposableDomListener)(this.element, "mousedown", (e4) => { + 2 === e4.button && (0, s2.rightClickHandler)(e4, this.textarea, this.screenElement, this._selectionService, this.options.rightClickSelectsWord); + })) : this.register((0, r.addDisposableDomListener)(this.element, "contextmenu", (e4) => { + (0, s2.rightClickHandler)(e4, this.textarea, this.screenElement, this._selectionService, this.options.rightClickSelectsWord); + })), k.isLinux && this.register((0, r.addDisposableDomListener)(this.element, "auxclick", (e4) => { + 1 === e4.button && (0, s2.moveTextAreaUnderMouseCursor)(e4, this.textarea, this.screenElement); + })); + } + _bindKeys() { + this.register((0, r.addDisposableDomListener)(this.textarea, "keyup", (e3) => this._keyUp(e3), true)), this.register((0, r.addDisposableDomListener)(this.textarea, "keydown", (e3) => this._keyDown(e3), true)), this.register((0, r.addDisposableDomListener)(this.textarea, "keypress", (e3) => this._keyPress(e3), true)), this.register((0, r.addDisposableDomListener)(this.textarea, "compositionstart", () => this._compositionHelper.compositionstart())), this.register((0, r.addDisposableDomListener)(this.textarea, "compositionupdate", (e3) => this._compositionHelper.compositionupdate(e3))), this.register((0, r.addDisposableDomListener)(this.textarea, "compositionend", () => this._compositionHelper.compositionend())), this.register((0, r.addDisposableDomListener)(this.textarea, "input", (e3) => this._inputEvent(e3), true)), this.register(this.onRender(() => this._compositionHelper.updateCompositionElements())); + } + open(e3) { + var _a; + if (!e3) throw new Error("Terminal requires a parent element."); + if (e3.isConnected || this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"), ((_a = this.element) == null ? void 0 : _a.ownerDocument.defaultView) && this._coreBrowserService) return void (this.element.ownerDocument.defaultView !== this._coreBrowserService.window && (this._coreBrowserService.window = this.element.ownerDocument.defaultView)); + this._document = e3.ownerDocument, this.options.documentOverride && this.options.documentOverride instanceof Document && (this._document = this.optionsService.rawOptions.documentOverride), this.element = this._document.createElement("div"), this.element.dir = "ltr", this.element.classList.add("terminal"), this.element.classList.add("xterm"), e3.appendChild(this.element); + const t3 = this._document.createDocumentFragment(); + this._viewportElement = this._document.createElement("div"), this._viewportElement.classList.add("xterm-viewport"), t3.appendChild(this._viewportElement), this._viewportScrollArea = this._document.createElement("div"), this._viewportScrollArea.classList.add("xterm-scroll-area"), this._viewportElement.appendChild(this._viewportScrollArea), this.screenElement = this._document.createElement("div"), this.screenElement.classList.add("xterm-screen"), this.register((0, r.addDisposableDomListener)(this.screenElement, "mousemove", (e4) => this.updateCursorStyle(e4))), this._helperContainer = this._document.createElement("div"), this._helperContainer.classList.add("xterm-helpers"), this.screenElement.appendChild(this._helperContainer), t3.appendChild(this.screenElement), this.textarea = this._document.createElement("textarea"), this.textarea.classList.add("xterm-helper-textarea"), this.textarea.setAttribute("aria-label", o.promptLabel), k.isChromeOS || this.textarea.setAttribute("aria-multiline", "false"), this.textarea.setAttribute("autocorrect", "off"), this.textarea.setAttribute("autocapitalize", "off"), this.textarea.setAttribute("spellcheck", "false"), this.textarea.tabIndex = 0, this._coreBrowserService = this.register(this._instantiationService.createInstance(v.CoreBrowserService, this.textarea, e3.ownerDocument.defaultView ?? window, this._document ?? "undefined" != typeof window ? window.document : null)), this._instantiationService.setService(S.ICoreBrowserService, this._coreBrowserService), this.register((0, r.addDisposableDomListener)(this.textarea, "focus", (e4) => this._handleTextAreaFocus(e4))), this.register((0, r.addDisposableDomListener)(this.textarea, "blur", () => this._handleTextAreaBlur())), this._helperContainer.appendChild(this.textarea), this._charSizeService = this._instantiationService.createInstance(u.CharSizeService, this._document, this._helperContainer), this._instantiationService.setService(S.ICharSizeService, this._charSizeService), this._themeService = this._instantiationService.createInstance(C.ThemeService), this._instantiationService.setService(S.IThemeService, this._themeService), this._characterJoinerService = this._instantiationService.createInstance(f.CharacterJoinerService), this._instantiationService.setService(S.ICharacterJoinerService, this._characterJoinerService), this._renderService = this.register(this._instantiationService.createInstance(g.RenderService, this.rows, this.screenElement)), this._instantiationService.setService(S.IRenderService, this._renderService), this.register(this._renderService.onRenderedViewportChange((e4) => this._onRender.fire(e4))), this.onResize((e4) => this._renderService.resize(e4.cols, e4.rows)), this._compositionView = this._document.createElement("div"), this._compositionView.classList.add("composition-view"), this._compositionHelper = this._instantiationService.createInstance(d.CompositionHelper, this.textarea, this._compositionView), this._helperContainer.appendChild(this._compositionView), this._mouseService = this._instantiationService.createInstance(p.MouseService), this._instantiationService.setService(S.IMouseService, this._mouseService), this.linkifier = this.register(this._instantiationService.createInstance(n.Linkifier, this.screenElement)), this.element.appendChild(t3); + try { + this._onWillOpen.fire(this.element); + } catch { + } + this._renderService.hasRenderer() || this._renderService.setRenderer(this._createRenderer()), this.viewport = this._instantiationService.createInstance(h.Viewport, this._viewportElement, this._viewportScrollArea), this.viewport.onRequestScrollLines((e4) => this.scrollLines(e4.amount, e4.suppressScrollEvent, 1)), this.register(this._inputHandler.onRequestSyncScrollBar(() => this.viewport.syncScrollArea())), this.register(this.viewport), this.register(this.onCursorMove(() => { + this._renderService.handleCursorMove(), this._syncTextArea(); + })), this.register(this.onResize(() => this._renderService.handleResize(this.cols, this.rows))), this.register(this.onBlur(() => this._renderService.handleBlur())), this.register(this.onFocus(() => this._renderService.handleFocus())), this.register(this._renderService.onDimensionsChange(() => this.viewport.syncScrollArea())), this._selectionService = this.register(this._instantiationService.createInstance(m.SelectionService, this.element, this.screenElement, this.linkifier)), this._instantiationService.setService(S.ISelectionService, this._selectionService), this.register(this._selectionService.onRequestScrollLines((e4) => this.scrollLines(e4.amount, e4.suppressScrollEvent))), this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire())), this.register(this._selectionService.onRequestRedraw((e4) => this._renderService.handleSelectionChanged(e4.start, e4.end, e4.columnSelectMode))), this.register(this._selectionService.onLinuxMouseSelection((e4) => { + this.textarea.value = e4, this.textarea.focus(), this.textarea.select(); + })), this.register(this._onScroll.event((e4) => { + this.viewport.syncScrollArea(), this._selectionService.refresh(); + })), this.register((0, r.addDisposableDomListener)(this._viewportElement, "scroll", () => this._selectionService.refresh())), this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer, this.screenElement)), this.register((0, r.addDisposableDomListener)(this.element, "mousedown", (e4) => this._selectionService.handleMouseDown(e4))), this.coreMouseService.areMouseEventsActive ? (this._selectionService.disable(), this.element.classList.add("enable-mouse-events")) : this._selectionService.enable(), this.options.screenReaderMode && (this._accessibilityManager.value = this._instantiationService.createInstance(M.AccessibilityManager, this)), this.register(this.optionsService.onSpecificOptionChange("screenReaderMode", (e4) => this._handleScreenReaderModeOptionChange(e4))), this.options.overviewRulerWidth && (this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer, this._viewportElement, this.screenElement))), this.optionsService.onSpecificOptionChange("overviewRulerWidth", (e4) => { + !this._overviewRulerRenderer && e4 && this._viewportElement && this.screenElement && (this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer, this._viewportElement, this.screenElement))); + }), this._charSizeService.measure(), this.refresh(0, this.rows - 1), this._initGlobal(), this.bindMouse(); + } + _createRenderer() { + return this._instantiationService.createInstance(_.DomRenderer, this, this._document, this.element, this.screenElement, this._viewportElement, this._helperContainer, this.linkifier); + } + bindMouse() { + const e3 = this, t3 = this.element; + function i3(t4) { + const i4 = e3._mouseService.getMouseReportCoords(t4, e3.screenElement); + if (!i4) return false; + let s4, r2; + switch (t4.overrideType || t4.type) { + case "mousemove": + r2 = 32, void 0 === t4.buttons ? (s4 = 3, void 0 !== t4.button && (s4 = t4.button < 3 ? t4.button : 3)) : s4 = 1 & t4.buttons ? 0 : 4 & t4.buttons ? 1 : 2 & t4.buttons ? 2 : 3; + break; + case "mouseup": + r2 = 0, s4 = t4.button < 3 ? t4.button : 3; + break; + case "mousedown": + r2 = 1, s4 = t4.button < 3 ? t4.button : 3; + break; + case "wheel": + if (e3._customWheelEventHandler && false === e3._customWheelEventHandler(t4)) return false; + if (0 === e3.viewport.getLinesScrolled(t4)) return false; + r2 = t4.deltaY < 0 ? 0 : 1, s4 = 4; + break; + default: + return false; + } + return !(void 0 === r2 || void 0 === s4 || s4 > 4) && e3.coreMouseService.triggerMouseEvent({ col: i4.col, row: i4.row, x: i4.x, y: i4.y, button: s4, action: r2, ctrl: t4.ctrlKey, alt: t4.altKey, shift: t4.shiftKey }); + } + const s3 = { mouseup: null, wheel: null, mousedrag: null, mousemove: null }, n2 = { mouseup: (e4) => (i3(e4), e4.buttons || (this._document.removeEventListener("mouseup", s3.mouseup), s3.mousedrag && this._document.removeEventListener("mousemove", s3.mousedrag)), this.cancel(e4)), wheel: (e4) => (i3(e4), this.cancel(e4, true)), mousedrag: (e4) => { + e4.buttons && i3(e4); + }, mousemove: (e4) => { + e4.buttons || i3(e4); + } }; + this.register(this.coreMouseService.onProtocolChange((e4) => { + e4 ? ("debug" === this.optionsService.rawOptions.logLevel && this._logService.debug("Binding to mouse events:", this.coreMouseService.explainEvents(e4)), this.element.classList.add("enable-mouse-events"), this._selectionService.disable()) : (this._logService.debug("Unbinding from mouse events."), this.element.classList.remove("enable-mouse-events"), this._selectionService.enable()), 8 & e4 ? s3.mousemove || (t3.addEventListener("mousemove", n2.mousemove), s3.mousemove = n2.mousemove) : (t3.removeEventListener("mousemove", s3.mousemove), s3.mousemove = null), 16 & e4 ? s3.wheel || (t3.addEventListener("wheel", n2.wheel, { passive: false }), s3.wheel = n2.wheel) : (t3.removeEventListener("wheel", s3.wheel), s3.wheel = null), 2 & e4 ? s3.mouseup || (s3.mouseup = n2.mouseup) : (this._document.removeEventListener("mouseup", s3.mouseup), s3.mouseup = null), 4 & e4 ? s3.mousedrag || (s3.mousedrag = n2.mousedrag) : (this._document.removeEventListener("mousemove", s3.mousedrag), s3.mousedrag = null); + })), this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol, this.register((0, r.addDisposableDomListener)(t3, "mousedown", (e4) => { + if (e4.preventDefault(), this.focus(), this.coreMouseService.areMouseEventsActive && !this._selectionService.shouldForceSelection(e4)) return i3(e4), s3.mouseup && this._document.addEventListener("mouseup", s3.mouseup), s3.mousedrag && this._document.addEventListener("mousemove", s3.mousedrag), this.cancel(e4); + })), this.register((0, r.addDisposableDomListener)(t3, "wheel", (e4) => { + if (!s3.wheel) { + if (this._customWheelEventHandler && false === this._customWheelEventHandler(e4)) return false; + if (!this.buffer.hasScrollback) { + const t4 = this.viewport.getLinesScrolled(e4); + if (0 === t4) return; + const i4 = D.C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? "O" : "[") + (e4.deltaY < 0 ? "A" : "B"); + let s4 = ""; + for (let e5 = 0; e5 < Math.abs(t4); e5++) s4 += i4; + return this.coreService.triggerDataEvent(s4, true), this.cancel(e4, true); + } + return this.viewport.handleWheel(e4) ? this.cancel(e4) : void 0; + } + }, { passive: false })), this.register((0, r.addDisposableDomListener)(t3, "touchstart", (e4) => { + if (!this.coreMouseService.areMouseEventsActive) return this.viewport.handleTouchStart(e4), this.cancel(e4); + }, { passive: true })), this.register((0, r.addDisposableDomListener)(t3, "touchmove", (e4) => { + if (!this.coreMouseService.areMouseEventsActive) return this.viewport.handleTouchMove(e4) ? void 0 : this.cancel(e4); + }, { passive: false })); + } + refresh(e3, t3) { + var _a; + (_a = this._renderService) == null ? void 0 : _a.refreshRows(e3, t3); + } + updateCursorStyle(e3) { + var _a; + ((_a = this._selectionService) == null ? void 0 : _a.shouldColumnSelect(e3)) ? this.element.classList.add("column-select") : this.element.classList.remove("column-select"); + } + _showCursor() { + this.coreService.isCursorInitialized || (this.coreService.isCursorInitialized = true, this.refresh(this.buffer.y, this.buffer.y)); + } + scrollLines(e3, t3, i3 = 0) { + var _a; + 1 === i3 ? (super.scrollLines(e3, t3, i3), this.refresh(0, this.rows - 1)) : (_a = this.viewport) == null ? void 0 : _a.scrollLines(e3); + } + paste(e3) { + (0, s2.paste)(e3, this.textarea, this.coreService, this.optionsService); + } + attachCustomKeyEventHandler(e3) { + this._customKeyEventHandler = e3; + } + attachCustomWheelEventHandler(e3) { + this._customWheelEventHandler = e3; + } + registerLinkProvider(e3) { + return this._linkProviderService.registerLinkProvider(e3); + } + registerCharacterJoiner(e3) { + if (!this._characterJoinerService) throw new Error("Terminal must be opened first"); + const t3 = this._characterJoinerService.register(e3); + return this.refresh(0, this.rows - 1), t3; + } + deregisterCharacterJoiner(e3) { + if (!this._characterJoinerService) throw new Error("Terminal must be opened first"); + this._characterJoinerService.deregister(e3) && this.refresh(0, this.rows - 1); + } + get markers() { + return this.buffer.markers; + } + registerMarker(e3) { + return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + e3); + } + registerDecoration(e3) { + return this._decorationService.registerDecoration(e3); + } + hasSelection() { + return !!this._selectionService && this._selectionService.hasSelection; + } + select(e3, t3, i3) { + this._selectionService.setSelection(e3, t3, i3); + } + getSelection() { + return this._selectionService ? this._selectionService.selectionText : ""; + } + getSelectionPosition() { + if (this._selectionService && this._selectionService.hasSelection) return { start: { x: this._selectionService.selectionStart[0], y: this._selectionService.selectionStart[1] }, end: { x: this._selectionService.selectionEnd[0], y: this._selectionService.selectionEnd[1] } }; + } + clearSelection() { + var _a; + (_a = this._selectionService) == null ? void 0 : _a.clearSelection(); + } + selectAll() { + var _a; + (_a = this._selectionService) == null ? void 0 : _a.selectAll(); + } + selectLines(e3, t3) { + var _a; + (_a = this._selectionService) == null ? void 0 : _a.selectLines(e3, t3); + } + _keyDown(e3) { + if (this._keyDownHandled = false, this._keyDownSeen = true, this._customKeyEventHandler && false === this._customKeyEventHandler(e3)) return false; + const t3 = this.browser.isMac && this.options.macOptionIsMeta && e3.altKey; + if (!t3 && !this._compositionHelper.keydown(e3)) return this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp && this.scrollToBottom(), false; + t3 || "Dead" !== e3.key && "AltGraph" !== e3.key || (this._unprocessedDeadKey = true); + const i3 = (0, R.evaluateKeyboardEvent)(e3, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); + if (this.updateCursorStyle(e3), 3 === i3.type || 2 === i3.type) { + const t4 = this.rows - 1; + return this.scrollLines(2 === i3.type ? -t4 : t4), this.cancel(e3, true); + } + return 1 === i3.type && this.selectAll(), !!this._isThirdLevelShift(this.browser, e3) || (i3.cancel && this.cancel(e3, true), !i3.key || !!(e3.key && !e3.ctrlKey && !e3.altKey && !e3.metaKey && 1 === e3.key.length && e3.key.charCodeAt(0) >= 65 && e3.key.charCodeAt(0) <= 90) || (this._unprocessedDeadKey ? (this._unprocessedDeadKey = false, true) : (i3.key !== D.C0.ETX && i3.key !== D.C0.CR || (this.textarea.value = ""), this._onKey.fire({ key: i3.key, domEvent: e3 }), this._showCursor(), this.coreService.triggerDataEvent(i3.key, true), !this.optionsService.rawOptions.screenReaderMode || e3.altKey || e3.ctrlKey ? this.cancel(e3, true) : void (this._keyDownHandled = true)))); + } + _isThirdLevelShift(e3, t3) { + const i3 = e3.isMac && !this.options.macOptionIsMeta && t3.altKey && !t3.ctrlKey && !t3.metaKey || e3.isWindows && t3.altKey && t3.ctrlKey && !t3.metaKey || e3.isWindows && t3.getModifierState("AltGraph"); + return "keypress" === t3.type ? i3 : i3 && (!t3.keyCode || t3.keyCode > 47); + } + _keyUp(e3) { + this._keyDownSeen = false, this._customKeyEventHandler && false === this._customKeyEventHandler(e3) || (function(e4) { + return 16 === e4.keyCode || 17 === e4.keyCode || 18 === e4.keyCode; + }(e3) || this.focus(), this.updateCursorStyle(e3), this._keyPressHandled = false); + } + _keyPress(e3) { + let t3; + if (this._keyPressHandled = false, this._keyDownHandled) return false; + if (this._customKeyEventHandler && false === this._customKeyEventHandler(e3)) return false; + if (this.cancel(e3), e3.charCode) t3 = e3.charCode; + else if (null === e3.which || void 0 === e3.which) t3 = e3.keyCode; + else { + if (0 === e3.which || 0 === e3.charCode) return false; + t3 = e3.which; + } + return !(!t3 || (e3.altKey || e3.ctrlKey || e3.metaKey) && !this._isThirdLevelShift(this.browser, e3) || (t3 = String.fromCharCode(t3), this._onKey.fire({ key: t3, domEvent: e3 }), this._showCursor(), this.coreService.triggerDataEvent(t3, true), this._keyPressHandled = true, this._unprocessedDeadKey = false, 0)); + } + _inputEvent(e3) { + if (e3.data && "insertText" === e3.inputType && (!e3.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) { + if (this._keyPressHandled) return false; + this._unprocessedDeadKey = false; + const t3 = e3.data; + return this.coreService.triggerDataEvent(t3, true), this.cancel(e3), true; + } + return false; + } + resize(e3, t3) { + e3 !== this.cols || t3 !== this.rows ? super.resize(e3, t3) : this._charSizeService && !this._charSizeService.hasValidSize && this._charSizeService.measure(); + } + _afterResize(e3, t3) { + var _a, _b; + (_a = this._charSizeService) == null ? void 0 : _a.measure(), (_b = this.viewport) == null ? void 0 : _b.syncScrollArea(true); + } + clear() { + var _a; + if (0 !== this.buffer.ybase || 0 !== this.buffer.y) { + this.buffer.clearAllMarkers(), this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)), this.buffer.lines.length = 1, this.buffer.ydisp = 0, this.buffer.ybase = 0, this.buffer.y = 0; + for (let e3 = 1; e3 < this.rows; e3++) this.buffer.lines.push(this.buffer.getBlankLine(L.DEFAULT_ATTR_DATA)); + this._onScroll.fire({ position: this.buffer.ydisp, source: 0 }), (_a = this.viewport) == null ? void 0 : _a.reset(), this.refresh(0, this.rows - 1); + } + } + reset() { + var _a, _b; + this.options.rows = this.rows, this.options.cols = this.cols; + const e3 = this._customKeyEventHandler; + this._setup(), super.reset(), (_a = this._selectionService) == null ? void 0 : _a.reset(), this._decorationService.reset(), (_b = this.viewport) == null ? void 0 : _b.reset(), this._customKeyEventHandler = e3, this.refresh(0, this.rows - 1); + } + clearTextureAtlas() { + var _a; + (_a = this._renderService) == null ? void 0 : _a.clearTextureAtlas(); + } + _reportFocus() { + var _a; + ((_a = this.element) == null ? void 0 : _a.classList.contains("focus")) ? this.coreService.triggerDataEvent(D.C0.ESC + "[I") : this.coreService.triggerDataEvent(D.C0.ESC + "[O"); + } + _reportWindowsOptions(e3) { + if (this._renderService) switch (e3) { + case T.WindowsOptionsReportType.GET_WIN_SIZE_PIXELS: + const e4 = this._renderService.dimensions.css.canvas.width.toFixed(0), t3 = this._renderService.dimensions.css.canvas.height.toFixed(0); + this.coreService.triggerDataEvent(`${D.C0.ESC}[4;${t3};${e4}t`); + break; + case T.WindowsOptionsReportType.GET_CELL_SIZE_PIXELS: + const i3 = this._renderService.dimensions.css.cell.width.toFixed(0), s3 = this._renderService.dimensions.css.cell.height.toFixed(0); + this.coreService.triggerDataEvent(`${D.C0.ESC}[6;${s3};${i3}t`); + } + } + cancel(e3, t3) { + if (this.options.cancelEvents || t3) return e3.preventDefault(), e3.stopPropagation(), false; + } + } + t2.Terminal = P; + }, 9924: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TimeBasedDebouncer = void 0, t2.TimeBasedDebouncer = class { + constructor(e3, t3 = 1e3) { + this._renderCallback = e3, this._debounceThresholdMS = t3, this._lastRefreshMs = 0, this._additionalRefreshRequested = false; + } + dispose() { + this._refreshTimeoutID && clearTimeout(this._refreshTimeoutID); + } + refresh(e3, t3, i2) { + this._rowCount = i2, e3 = void 0 !== e3 ? e3 : 0, t3 = void 0 !== t3 ? t3 : this._rowCount - 1, this._rowStart = void 0 !== this._rowStart ? Math.min(this._rowStart, e3) : e3, this._rowEnd = void 0 !== this._rowEnd ? Math.max(this._rowEnd, t3) : t3; + const s2 = Date.now(); + if (s2 - this._lastRefreshMs >= this._debounceThresholdMS) this._lastRefreshMs = s2, this._innerRefresh(); + else if (!this._additionalRefreshRequested) { + const e4 = s2 - this._lastRefreshMs, t4 = this._debounceThresholdMS - e4; + this._additionalRefreshRequested = true, this._refreshTimeoutID = window.setTimeout(() => { + this._lastRefreshMs = Date.now(), this._innerRefresh(), this._additionalRefreshRequested = false, this._refreshTimeoutID = void 0; + }, t4); + } + } + _innerRefresh() { + if (void 0 === this._rowStart || void 0 === this._rowEnd || void 0 === this._rowCount) return; + const e3 = Math.max(this._rowStart, 0), t3 = Math.min(this._rowEnd, this._rowCount - 1); + this._rowStart = void 0, this._rowEnd = void 0, this._renderCallback(e3, t3); + } + }; + }, 1680: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.Viewport = void 0; + const n = i2(3656), o = i2(4725), a = i2(8460), h = i2(844), c = i2(2585); + let l = t2.Viewport = class extends h.Disposable { + constructor(e3, t3, i3, s3, r2, o2, h2, c2) { + super(), this._viewportElement = e3, this._scrollArea = t3, this._bufferService = i3, this._optionsService = s3, this._charSizeService = r2, this._renderService = o2, this._coreBrowserService = h2, this.scrollBarWidth = 0, this._currentRowHeight = 0, this._currentDeviceCellHeight = 0, this._lastRecordedBufferLength = 0, this._lastRecordedViewportHeight = 0, this._lastRecordedBufferHeight = 0, this._lastTouchY = 0, this._lastScrollTop = 0, this._wheelPartialScroll = 0, this._refreshAnimationFrame = null, this._ignoreNextScrollEvent = false, this._smoothScrollState = { startTime: 0, origin: -1, target: -1 }, this._onRequestScrollLines = this.register(new a.EventEmitter()), this.onRequestScrollLines = this._onRequestScrollLines.event, this.scrollBarWidth = this._viewportElement.offsetWidth - this._scrollArea.offsetWidth || 15, this.register((0, n.addDisposableDomListener)(this._viewportElement, "scroll", this._handleScroll.bind(this))), this._activeBuffer = this._bufferService.buffer, this.register(this._bufferService.buffers.onBufferActivate((e4) => this._activeBuffer = e4.activeBuffer)), this._renderDimensions = this._renderService.dimensions, this.register(this._renderService.onDimensionsChange((e4) => this._renderDimensions = e4)), this._handleThemeChange(c2.colors), this.register(c2.onChangeColors((e4) => this._handleThemeChange(e4))), this.register(this._optionsService.onSpecificOptionChange("scrollback", () => this.syncScrollArea())), setTimeout(() => this.syncScrollArea()); + } + _handleThemeChange(e3) { + this._viewportElement.style.backgroundColor = e3.background.css; + } + reset() { + this._currentRowHeight = 0, this._currentDeviceCellHeight = 0, this._lastRecordedBufferLength = 0, this._lastRecordedViewportHeight = 0, this._lastRecordedBufferHeight = 0, this._lastTouchY = 0, this._lastScrollTop = 0, this._coreBrowserService.window.requestAnimationFrame(() => this.syncScrollArea()); + } + _refresh(e3) { + if (e3) return this._innerRefresh(), void (null !== this._refreshAnimationFrame && this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame)); + null === this._refreshAnimationFrame && (this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh())); + } + _innerRefresh() { + if (this._charSizeService.height > 0) { + this._currentRowHeight = this._renderDimensions.device.cell.height / this._coreBrowserService.dpr, this._currentDeviceCellHeight = this._renderDimensions.device.cell.height, this._lastRecordedViewportHeight = this._viewportElement.offsetHeight; + const e4 = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderDimensions.css.canvas.height); + this._lastRecordedBufferHeight !== e4 && (this._lastRecordedBufferHeight = e4, this._scrollArea.style.height = this._lastRecordedBufferHeight + "px"); + } + const e3 = this._bufferService.buffer.ydisp * this._currentRowHeight; + this._viewportElement.scrollTop !== e3 && (this._ignoreNextScrollEvent = true, this._viewportElement.scrollTop = e3), this._refreshAnimationFrame = null; + } + syncScrollArea(e3 = false) { + if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) return this._lastRecordedBufferLength = this._bufferService.buffer.lines.length, void this._refresh(e3); + this._lastRecordedViewportHeight === this._renderService.dimensions.css.canvas.height && this._lastScrollTop === this._activeBuffer.ydisp * this._currentRowHeight && this._renderDimensions.device.cell.height === this._currentDeviceCellHeight || this._refresh(e3); + } + _handleScroll(e3) { + if (this._lastScrollTop = this._viewportElement.scrollTop, !this._viewportElement.offsetParent) return; + if (this._ignoreNextScrollEvent) return this._ignoreNextScrollEvent = false, void this._onRequestScrollLines.fire({ amount: 0, suppressScrollEvent: true }); + const t3 = Math.round(this._lastScrollTop / this._currentRowHeight) - this._bufferService.buffer.ydisp; + this._onRequestScrollLines.fire({ amount: t3, suppressScrollEvent: true }); + } + _smoothScroll() { + if (this._isDisposed || -1 === this._smoothScrollState.origin || -1 === this._smoothScrollState.target) return; + const e3 = this._smoothScrollPercent(); + this._viewportElement.scrollTop = this._smoothScrollState.origin + Math.round(e3 * (this._smoothScrollState.target - this._smoothScrollState.origin)), e3 < 1 ? this._coreBrowserService.window.requestAnimationFrame(() => this._smoothScroll()) : this._clearSmoothScrollState(); + } + _smoothScrollPercent() { + return this._optionsService.rawOptions.smoothScrollDuration && this._smoothScrollState.startTime ? Math.max(Math.min((Date.now() - this._smoothScrollState.startTime) / this._optionsService.rawOptions.smoothScrollDuration, 1), 0) : 1; + } + _clearSmoothScrollState() { + this._smoothScrollState.startTime = 0, this._smoothScrollState.origin = -1, this._smoothScrollState.target = -1; + } + _bubbleScroll(e3, t3) { + const i3 = this._viewportElement.scrollTop + this._lastRecordedViewportHeight; + return !(t3 < 0 && 0 !== this._viewportElement.scrollTop || t3 > 0 && i3 < this._lastRecordedBufferHeight) || (e3.cancelable && e3.preventDefault(), false); + } + handleWheel(e3) { + const t3 = this._getPixelsScrolled(e3); + return 0 !== t3 && (this._optionsService.rawOptions.smoothScrollDuration ? (this._smoothScrollState.startTime = Date.now(), this._smoothScrollPercent() < 1 ? (this._smoothScrollState.origin = this._viewportElement.scrollTop, -1 === this._smoothScrollState.target ? this._smoothScrollState.target = this._viewportElement.scrollTop + t3 : this._smoothScrollState.target += t3, this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0), this._smoothScroll()) : this._clearSmoothScrollState()) : this._viewportElement.scrollTop += t3, this._bubbleScroll(e3, t3)); + } + scrollLines(e3) { + if (0 !== e3) if (this._optionsService.rawOptions.smoothScrollDuration) { + const t3 = e3 * this._currentRowHeight; + this._smoothScrollState.startTime = Date.now(), this._smoothScrollPercent() < 1 ? (this._smoothScrollState.origin = this._viewportElement.scrollTop, this._smoothScrollState.target = this._smoothScrollState.origin + t3, this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0), this._smoothScroll()) : this._clearSmoothScrollState(); + } else this._onRequestScrollLines.fire({ amount: e3, suppressScrollEvent: false }); + } + _getPixelsScrolled(e3) { + if (0 === e3.deltaY || e3.shiftKey) return 0; + let t3 = this._applyScrollModifier(e3.deltaY, e3); + return e3.deltaMode === WheelEvent.DOM_DELTA_LINE ? t3 *= this._currentRowHeight : e3.deltaMode === WheelEvent.DOM_DELTA_PAGE && (t3 *= this._currentRowHeight * this._bufferService.rows), t3; + } + getBufferElements(e3, t3) { + var _a; + let i3, s3 = ""; + const r2 = [], n2 = t3 ?? this._bufferService.buffer.lines.length, o2 = this._bufferService.buffer.lines; + for (let t4 = e3; t4 < n2; t4++) { + const e4 = o2.get(t4); + if (!e4) continue; + const n3 = (_a = o2.get(t4 + 1)) == null ? void 0 : _a.isWrapped; + if (s3 += e4.translateToString(!n3), !n3 || t4 === o2.length - 1) { + const e5 = document.createElement("div"); + e5.textContent = s3, r2.push(e5), s3.length > 0 && (i3 = e5), s3 = ""; + } + } + return { bufferElements: r2, cursorElement: i3 }; + } + getLinesScrolled(e3) { + if (0 === e3.deltaY || e3.shiftKey) return 0; + let t3 = this._applyScrollModifier(e3.deltaY, e3); + return e3.deltaMode === WheelEvent.DOM_DELTA_PIXEL ? (t3 /= this._currentRowHeight + 0, this._wheelPartialScroll += t3, t3 = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1), this._wheelPartialScroll %= 1) : e3.deltaMode === WheelEvent.DOM_DELTA_PAGE && (t3 *= this._bufferService.rows), t3; + } + _applyScrollModifier(e3, t3) { + const i3 = this._optionsService.rawOptions.fastScrollModifier; + return "alt" === i3 && t3.altKey || "ctrl" === i3 && t3.ctrlKey || "shift" === i3 && t3.shiftKey ? e3 * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity : e3 * this._optionsService.rawOptions.scrollSensitivity; + } + handleTouchStart(e3) { + this._lastTouchY = e3.touches[0].pageY; + } + handleTouchMove(e3) { + const t3 = this._lastTouchY - e3.touches[0].pageY; + return this._lastTouchY = e3.touches[0].pageY, 0 !== t3 && (this._viewportElement.scrollTop += t3, this._bubbleScroll(e3, t3)); + } + }; + t2.Viewport = l = s2([r(2, c.IBufferService), r(3, c.IOptionsService), r(4, o.ICharSizeService), r(5, o.IRenderService), r(6, o.ICoreBrowserService), r(7, o.IThemeService)], l); + }, 3107: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferDecorationRenderer = void 0; + const n = i2(4725), o = i2(844), a = i2(2585); + let h = t2.BufferDecorationRenderer = class extends o.Disposable { + constructor(e3, t3, i3, s3, r2) { + super(), this._screenElement = e3, this._bufferService = t3, this._coreBrowserService = i3, this._decorationService = s3, this._renderService = r2, this._decorationElements = /* @__PURE__ */ new Map(), this._altBufferIsActive = false, this._dimensionsChanged = false, this._container = document.createElement("div"), this._container.classList.add("xterm-decoration-container"), this._screenElement.appendChild(this._container), this.register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations())), this.register(this._renderService.onDimensionsChange(() => { + this._dimensionsChanged = true, this._queueRefresh(); + })), this.register(this._coreBrowserService.onDprChange(() => this._queueRefresh())), this.register(this._bufferService.buffers.onBufferActivate(() => { + this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt; + })), this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh())), this.register(this._decorationService.onDecorationRemoved((e4) => this._removeDecoration(e4))), this.register((0, o.toDisposable)(() => { + this._container.remove(), this._decorationElements.clear(); + })); + } + _queueRefresh() { + void 0 === this._animationFrame && (this._animationFrame = this._renderService.addRefreshCallback(() => { + this._doRefreshDecorations(), this._animationFrame = void 0; + })); + } + _doRefreshDecorations() { + for (const e3 of this._decorationService.decorations) this._renderDecoration(e3); + this._dimensionsChanged = false; + } + _renderDecoration(e3) { + this._refreshStyle(e3), this._dimensionsChanged && this._refreshXPosition(e3); + } + _createElement(e3) { + var _a; + const t3 = this._coreBrowserService.mainDocument.createElement("div"); + t3.classList.add("xterm-decoration"), t3.classList.toggle("xterm-decoration-top-layer", "top" === ((_a = e3 == null ? void 0 : e3.options) == null ? void 0 : _a.layer)), t3.style.width = `${Math.round((e3.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`, t3.style.height = (e3.options.height || 1) * this._renderService.dimensions.css.cell.height + "px", t3.style.top = (e3.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height + "px", t3.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`; + const i3 = e3.options.x ?? 0; + return i3 && i3 > this._bufferService.cols && (t3.style.display = "none"), this._refreshXPosition(e3, t3), t3; + } + _refreshStyle(e3) { + const t3 = e3.marker.line - this._bufferService.buffers.active.ydisp; + if (t3 < 0 || t3 >= this._bufferService.rows) e3.element && (e3.element.style.display = "none", e3.onRenderEmitter.fire(e3.element)); + else { + let i3 = this._decorationElements.get(e3); + i3 || (i3 = this._createElement(e3), e3.element = i3, this._decorationElements.set(e3, i3), this._container.appendChild(i3), e3.onDispose(() => { + this._decorationElements.delete(e3), i3.remove(); + })), i3.style.top = t3 * this._renderService.dimensions.css.cell.height + "px", i3.style.display = this._altBufferIsActive ? "none" : "block", e3.onRenderEmitter.fire(i3); + } + } + _refreshXPosition(e3, t3 = e3.element) { + if (!t3) return; + const i3 = e3.options.x ?? 0; + "right" === (e3.options.anchor || "left") ? t3.style.right = i3 ? i3 * this._renderService.dimensions.css.cell.width + "px" : "" : t3.style.left = i3 ? i3 * this._renderService.dimensions.css.cell.width + "px" : ""; + } + _removeDecoration(e3) { + var _a; + (_a = this._decorationElements.get(e3)) == null ? void 0 : _a.remove(), this._decorationElements.delete(e3), e3.dispose(); + } + }; + t2.BufferDecorationRenderer = h = s2([r(1, a.IBufferService), r(2, n.ICoreBrowserService), r(3, a.IDecorationService), r(4, n.IRenderService)], h); + }, 5871: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ColorZoneStore = void 0, t2.ColorZoneStore = class { + constructor() { + this._zones = [], this._zonePool = [], this._zonePoolIndex = 0, this._linePadding = { full: 0, left: 0, center: 0, right: 0 }; + } + get zones() { + return this._zonePool.length = Math.min(this._zonePool.length, this._zones.length), this._zones; + } + clear() { + this._zones.length = 0, this._zonePoolIndex = 0; + } + addDecoration(e3) { + if (e3.options.overviewRulerOptions) { + for (const t3 of this._zones) if (t3.color === e3.options.overviewRulerOptions.color && t3.position === e3.options.overviewRulerOptions.position) { + if (this._lineIntersectsZone(t3, e3.marker.line)) return; + if (this._lineAdjacentToZone(t3, e3.marker.line, e3.options.overviewRulerOptions.position)) return void this._addLineToZone(t3, e3.marker.line); + } + if (this._zonePoolIndex < this._zonePool.length) return this._zonePool[this._zonePoolIndex].color = e3.options.overviewRulerOptions.color, this._zonePool[this._zonePoolIndex].position = e3.options.overviewRulerOptions.position, this._zonePool[this._zonePoolIndex].startBufferLine = e3.marker.line, this._zonePool[this._zonePoolIndex].endBufferLine = e3.marker.line, void this._zones.push(this._zonePool[this._zonePoolIndex++]); + this._zones.push({ color: e3.options.overviewRulerOptions.color, position: e3.options.overviewRulerOptions.position, startBufferLine: e3.marker.line, endBufferLine: e3.marker.line }), this._zonePool.push(this._zones[this._zones.length - 1]), this._zonePoolIndex++; + } + } + setPadding(e3) { + this._linePadding = e3; + } + _lineIntersectsZone(e3, t3) { + return t3 >= e3.startBufferLine && t3 <= e3.endBufferLine; + } + _lineAdjacentToZone(e3, t3, i2) { + return t3 >= e3.startBufferLine - this._linePadding[i2 || "full"] && t3 <= e3.endBufferLine + this._linePadding[i2 || "full"]; + } + _addLineToZone(e3, t3) { + e3.startBufferLine = Math.min(e3.startBufferLine, t3), e3.endBufferLine = Math.max(e3.endBufferLine, t3); + } + }; + }, 5744: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.OverviewRulerRenderer = void 0; + const n = i2(5871), o = i2(4725), a = i2(844), h = i2(2585), c = { full: 0, left: 0, center: 0, right: 0 }, l = { full: 0, left: 0, center: 0, right: 0 }, d = { full: 0, left: 0, center: 0, right: 0 }; + let _ = t2.OverviewRulerRenderer = class extends a.Disposable { + get _width() { + return this._optionsService.options.overviewRulerWidth || 0; + } + constructor(e3, t3, i3, s3, r2, o2, h2) { + var _a; + super(), this._viewportElement = e3, this._screenElement = t3, this._bufferService = i3, this._decorationService = s3, this._renderService = r2, this._optionsService = o2, this._coreBrowserService = h2, this._colorZoneStore = new n.ColorZoneStore(), this._shouldUpdateDimensions = true, this._shouldUpdateAnchor = true, this._lastKnownBufferLength = 0, this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"), this._canvas.classList.add("xterm-decoration-overview-ruler"), this._refreshCanvasDimensions(), (_a = this._viewportElement.parentElement) == null ? void 0 : _a.insertBefore(this._canvas, this._viewportElement); + const c2 = this._canvas.getContext("2d"); + if (!c2) throw new Error("Ctx cannot be null"); + this._ctx = c2, this._registerDecorationListeners(), this._registerBufferChangeListeners(), this._registerDimensionChangeListeners(), this.register((0, a.toDisposable)(() => { + var _a2; + (_a2 = this._canvas) == null ? void 0 : _a2.remove(); + })); + } + _registerDecorationListeners() { + this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(void 0, true))), this.register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(void 0, true))); + } + _registerBufferChangeListeners() { + this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh())), this.register(this._bufferService.buffers.onBufferActivate(() => { + this._canvas.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? "none" : "block"; + })), this.register(this._bufferService.onScroll(() => { + this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length && (this._refreshDrawHeightConstants(), this._refreshColorZonePadding()); + })); + } + _registerDimensionChangeListeners() { + this.register(this._renderService.onRender(() => { + this._containerHeight && this._containerHeight === this._screenElement.clientHeight || (this._queueRefresh(true), this._containerHeight = this._screenElement.clientHeight); + })), this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth", () => this._queueRefresh(true))), this.register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true))), this._queueRefresh(true); + } + _refreshDrawConstants() { + const e3 = Math.floor(this._canvas.width / 3), t3 = Math.ceil(this._canvas.width / 3); + l.full = this._canvas.width, l.left = e3, l.center = t3, l.right = e3, this._refreshDrawHeightConstants(), d.full = 0, d.left = 0, d.center = l.left, d.right = l.left + l.center; + } + _refreshDrawHeightConstants() { + c.full = Math.round(2 * this._coreBrowserService.dpr); + const e3 = this._canvas.height / this._bufferService.buffer.lines.length, t3 = Math.round(Math.max(Math.min(e3, 12), 6) * this._coreBrowserService.dpr); + c.left = t3, c.center = t3, c.right = t3; + } + _refreshColorZonePadding() { + this._colorZoneStore.setPadding({ full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.full), left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.left), center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.center), right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.right) }), this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length; + } + _refreshCanvasDimensions() { + this._canvas.style.width = `${this._width}px`, this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr), this._canvas.style.height = `${this._screenElement.clientHeight}px`, this._canvas.height = Math.round(this._screenElement.clientHeight * this._coreBrowserService.dpr), this._refreshDrawConstants(), this._refreshColorZonePadding(); + } + _refreshDecorations() { + this._shouldUpdateDimensions && this._refreshCanvasDimensions(), this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height), this._colorZoneStore.clear(); + for (const e4 of this._decorationService.decorations) this._colorZoneStore.addDecoration(e4); + this._ctx.lineWidth = 1; + const e3 = this._colorZoneStore.zones; + for (const t3 of e3) "full" !== t3.position && this._renderColorZone(t3); + for (const t3 of e3) "full" === t3.position && this._renderColorZone(t3); + this._shouldUpdateDimensions = false, this._shouldUpdateAnchor = false; + } + _renderColorZone(e3) { + this._ctx.fillStyle = e3.color, this._ctx.fillRect(d[e3.position || "full"], Math.round((this._canvas.height - 1) * (e3.startBufferLine / this._bufferService.buffers.active.lines.length) - c[e3.position || "full"] / 2), l[e3.position || "full"], Math.round((this._canvas.height - 1) * ((e3.endBufferLine - e3.startBufferLine) / this._bufferService.buffers.active.lines.length) + c[e3.position || "full"])); + } + _queueRefresh(e3, t3) { + this._shouldUpdateDimensions = e3 || this._shouldUpdateDimensions, this._shouldUpdateAnchor = t3 || this._shouldUpdateAnchor, void 0 === this._animationFrame && (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._refreshDecorations(), this._animationFrame = void 0; + })); + } + }; + t2.OverviewRulerRenderer = _ = s2([r(2, h.IBufferService), r(3, h.IDecorationService), r(4, o.IRenderService), r(5, h.IOptionsService), r(6, o.ICoreBrowserService)], _); + }, 2950: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CompositionHelper = void 0; + const n = i2(4725), o = i2(2585), a = i2(2584); + let h = t2.CompositionHelper = class { + get isComposing() { + return this._isComposing; + } + constructor(e3, t3, i3, s3, r2, n2) { + this._textarea = e3, this._compositionView = t3, this._bufferService = i3, this._optionsService = s3, this._coreService = r2, this._renderService = n2, this._isComposing = false, this._isSendingComposition = false, this._compositionPosition = { start: 0, end: 0 }, this._dataAlreadySent = ""; + } + compositionstart() { + this._isComposing = true, this._compositionPosition.start = this._textarea.value.length, this._compositionView.textContent = "", this._dataAlreadySent = "", this._compositionView.classList.add("active"); + } + compositionupdate(e3) { + this._compositionView.textContent = e3.data, this.updateCompositionElements(), setTimeout(() => { + this._compositionPosition.end = this._textarea.value.length; + }, 0); + } + compositionend() { + this._finalizeComposition(true); + } + keydown(e3) { + if (this._isComposing || this._isSendingComposition) { + if (229 === e3.keyCode) return false; + if (16 === e3.keyCode || 17 === e3.keyCode || 18 === e3.keyCode) return false; + this._finalizeComposition(false); + } + return 229 !== e3.keyCode || (this._handleAnyTextareaChanges(), false); + } + _finalizeComposition(e3) { + if (this._compositionView.classList.remove("active"), this._isComposing = false, e3) { + const e4 = { start: this._compositionPosition.start, end: this._compositionPosition.end }; + this._isSendingComposition = true, setTimeout(() => { + if (this._isSendingComposition) { + let t3; + this._isSendingComposition = false, e4.start += this._dataAlreadySent.length, t3 = this._isComposing ? this._textarea.value.substring(e4.start, e4.end) : this._textarea.value.substring(e4.start), t3.length > 0 && this._coreService.triggerDataEvent(t3, true); + } + }, 0); + } else { + this._isSendingComposition = false; + const e4 = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end); + this._coreService.triggerDataEvent(e4, true); + } + } + _handleAnyTextareaChanges() { + const e3 = this._textarea.value; + setTimeout(() => { + if (!this._isComposing) { + const t3 = this._textarea.value, i3 = t3.replace(e3, ""); + this._dataAlreadySent = i3, t3.length > e3.length ? this._coreService.triggerDataEvent(i3, true) : t3.length < e3.length ? this._coreService.triggerDataEvent(`${a.C0.DEL}`, true) : t3.length === e3.length && t3 !== e3 && this._coreService.triggerDataEvent(t3, true); + } + }, 0); + } + updateCompositionElements(e3) { + if (this._isComposing) { + if (this._bufferService.buffer.isCursorInViewport) { + const e4 = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1), t3 = this._renderService.dimensions.css.cell.height, i3 = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height, s3 = e4 * this._renderService.dimensions.css.cell.width; + this._compositionView.style.left = s3 + "px", this._compositionView.style.top = i3 + "px", this._compositionView.style.height = t3 + "px", this._compositionView.style.lineHeight = t3 + "px", this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily, this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + "px"; + const r2 = this._compositionView.getBoundingClientRect(); + this._textarea.style.left = s3 + "px", this._textarea.style.top = i3 + "px", this._textarea.style.width = Math.max(r2.width, 1) + "px", this._textarea.style.height = Math.max(r2.height, 1) + "px", this._textarea.style.lineHeight = r2.height + "px"; + } + e3 || setTimeout(() => this.updateCompositionElements(true), 0); + } + } + }; + t2.CompositionHelper = h = s2([r(2, o.IBufferService), r(3, o.IOptionsService), r(4, o.ICoreService), r(5, n.IRenderService)], h); + }, 9806: (e2, t2) => { + function i2(e3, t3, i3) { + const s2 = i3.getBoundingClientRect(), r = e3.getComputedStyle(i3), n = parseInt(r.getPropertyValue("padding-left")), o = parseInt(r.getPropertyValue("padding-top")); + return [t3.clientX - s2.left - n, t3.clientY - s2.top - o]; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getCoords = t2.getCoordsRelativeToElement = void 0, t2.getCoordsRelativeToElement = i2, t2.getCoords = function(e3, t3, s2, r, n, o, a, h, c) { + if (!o) return; + const l = i2(e3, t3, s2); + return l ? (l[0] = Math.ceil((l[0] + (c ? a / 2 : 0)) / a), l[1] = Math.ceil(l[1] / h), l[0] = Math.min(Math.max(l[0], 1), r + (c ? 1 : 0)), l[1] = Math.min(Math.max(l[1], 1), n), l) : void 0; + }; + }, 9504: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.moveToCellSequence = void 0; + const s2 = i2(2584); + function r(e3, t3, i3, s3) { + const r2 = e3 - n(e3, i3), a2 = t3 - n(t3, i3), l = Math.abs(r2 - a2) - function(e4, t4, i4) { + let s4 = 0; + const r3 = e4 - n(e4, i4), a3 = t4 - n(t4, i4); + for (let n2 = 0; n2 < Math.abs(r3 - a3); n2++) { + const a4 = "A" === o(e4, t4) ? -1 : 1, h2 = i4.buffer.lines.get(r3 + a4 * n2); + (h2 == null ? void 0 : h2.isWrapped) && s4++; + } + return s4; + }(e3, t3, i3); + return c(l, h(o(e3, t3), s3)); + } + function n(e3, t3) { + let i3 = 0, s3 = t3.buffer.lines.get(e3), r2 = s3 == null ? void 0 : s3.isWrapped; + for (; r2 && e3 >= 0 && e3 < t3.rows; ) i3++, s3 = t3.buffer.lines.get(--e3), r2 = s3 == null ? void 0 : s3.isWrapped; + return i3; + } + function o(e3, t3) { + return e3 > t3 ? "A" : "B"; + } + function a(e3, t3, i3, s3, r2, n2) { + let o2 = e3, a2 = t3, h2 = ""; + for (; o2 !== i3 || a2 !== s3; ) o2 += r2 ? 1 : -1, r2 && o2 > n2.cols - 1 ? (h2 += n2.buffer.translateBufferLineToString(a2, false, e3, o2), o2 = 0, e3 = 0, a2++) : !r2 && o2 < 0 && (h2 += n2.buffer.translateBufferLineToString(a2, false, 0, e3 + 1), o2 = n2.cols - 1, e3 = o2, a2--); + return h2 + n2.buffer.translateBufferLineToString(a2, false, e3, o2); + } + function h(e3, t3) { + const i3 = t3 ? "O" : "["; + return s2.C0.ESC + i3 + e3; + } + function c(e3, t3) { + e3 = Math.floor(e3); + let i3 = ""; + for (let s3 = 0; s3 < e3; s3++) i3 += t3; + return i3; + } + t2.moveToCellSequence = function(e3, t3, i3, s3) { + const o2 = i3.buffer.x, l = i3.buffer.y; + if (!i3.buffer.hasScrollback) return function(e4, t4, i4, s4, o3, l2) { + return 0 === r(t4, s4, o3, l2).length ? "" : c(a(e4, t4, e4, t4 - n(t4, o3), false, o3).length, h("D", l2)); + }(o2, l, 0, t3, i3, s3) + r(l, t3, i3, s3) + function(e4, t4, i4, s4, o3, l2) { + let d2; + d2 = r(t4, s4, o3, l2).length > 0 ? s4 - n(s4, o3) : t4; + const _2 = s4, u = function(e5, t5, i5, s5, o4, a2) { + let h2; + return h2 = r(i5, s5, o4, a2).length > 0 ? s5 - n(s5, o4) : t5, e5 < i5 && h2 <= s5 || e5 >= i5 && h2 < s5 ? "C" : "D"; + }(e4, t4, i4, s4, o3, l2); + return c(a(e4, d2, i4, _2, "C" === u, o3).length, h(u, l2)); + }(o2, l, e3, t3, i3, s3); + let d; + if (l === t3) return d = o2 > e3 ? "D" : "C", c(Math.abs(o2 - e3), h(d, s3)); + d = l > t3 ? "D" : "C"; + const _ = Math.abs(l - t3); + return c(function(e4, t4) { + return t4.cols - e4; + }(l > t3 ? e3 : o2, i3) + (_ - 1) * i3.cols + 1 + ((l > t3 ? o2 : e3) - 1), h(d, s3)); + }; + }, 1296: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.DomRenderer = void 0; + const n = i2(3787), o = i2(2550), a = i2(2223), h = i2(6171), c = i2(6052), l = i2(4725), d = i2(8055), _ = i2(8460), u = i2(844), f = i2(2585), v = "xterm-dom-renderer-owner-", p = "xterm-rows", g = "xterm-fg-", m = "xterm-bg-", S = "xterm-focus", C = "xterm-selection"; + let b = 1, w = t2.DomRenderer = class extends u.Disposable { + constructor(e3, t3, i3, s3, r2, a2, l2, d2, f2, g2, m2, S2, w2) { + super(), this._terminal = e3, this._document = t3, this._element = i3, this._screenElement = s3, this._viewportElement = r2, this._helperContainer = a2, this._linkifier2 = l2, this._charSizeService = f2, this._optionsService = g2, this._bufferService = m2, this._coreBrowserService = S2, this._themeService = w2, this._terminalClass = b++, this._rowElements = [], this._selectionRenderModel = (0, c.createSelectionRenderModel)(), this.onRequestRedraw = this.register(new _.EventEmitter()).event, this._rowContainer = this._document.createElement("div"), this._rowContainer.classList.add(p), this._rowContainer.style.lineHeight = "normal", this._rowContainer.setAttribute("aria-hidden", "true"), this._refreshRowElements(this._bufferService.cols, this._bufferService.rows), this._selectionContainer = this._document.createElement("div"), this._selectionContainer.classList.add(C), this._selectionContainer.setAttribute("aria-hidden", "true"), this.dimensions = (0, h.createRenderDimensions)(), this._updateDimensions(), this.register(this._optionsService.onOptionChange(() => this._handleOptionsChanged())), this.register(this._themeService.onChangeColors((e4) => this._injectCss(e4))), this._injectCss(this._themeService.colors), this._rowFactory = d2.createInstance(n.DomRendererRowFactory, document), this._element.classList.add(v + this._terminalClass), this._screenElement.appendChild(this._rowContainer), this._screenElement.appendChild(this._selectionContainer), this.register(this._linkifier2.onShowLinkUnderline((e4) => this._handleLinkHover(e4))), this.register(this._linkifier2.onHideLinkUnderline((e4) => this._handleLinkLeave(e4))), this.register((0, u.toDisposable)(() => { + this._element.classList.remove(v + this._terminalClass), this._rowContainer.remove(), this._selectionContainer.remove(), this._widthCache.dispose(), this._themeStyleElement.remove(), this._dimensionsStyleElement.remove(); + })), this._widthCache = new o.WidthCache(this._document, this._helperContainer), this._widthCache.setFont(this._optionsService.rawOptions.fontFamily, this._optionsService.rawOptions.fontSize, this._optionsService.rawOptions.fontWeight, this._optionsService.rawOptions.fontWeightBold), this._setDefaultSpacing(); + } + _updateDimensions() { + const e3 = this._coreBrowserService.dpr; + this.dimensions.device.char.width = this._charSizeService.width * e3, this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * e3), this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing), this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight), this.dimensions.device.char.left = 0, this.dimensions.device.char.top = 0, this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols, this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows, this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / e3), this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / e3), this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols, this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows; + for (const e4 of this._rowElements) e4.style.width = `${this.dimensions.css.canvas.width}px`, e4.style.height = `${this.dimensions.css.cell.height}px`, e4.style.lineHeight = `${this.dimensions.css.cell.height}px`, e4.style.overflow = "hidden"; + this._dimensionsStyleElement || (this._dimensionsStyleElement = this._document.createElement("style"), this._screenElement.appendChild(this._dimensionsStyleElement)); + const t3 = `${this._terminalSelector} .${p} span { display: inline-block; height: 100%; vertical-align: top;}`; + this._dimensionsStyleElement.textContent = t3, this._selectionContainer.style.height = this._viewportElement.style.height, this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`, this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`; + } + _injectCss(e3) { + this._themeStyleElement || (this._themeStyleElement = this._document.createElement("style"), this._screenElement.appendChild(this._themeStyleElement)); + let t3 = `${this._terminalSelector} .${p} { color: ${e3.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`; + t3 += `${this._terminalSelector} .${p} .xterm-dim { color: ${d.color.multiplyOpacity(e3.foreground, 0.5).css};}`, t3 += `${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`; + const i3 = `blink_underline_${this._terminalClass}`, s3 = `blink_bar_${this._terminalClass}`, r2 = `blink_block_${this._terminalClass}`; + t3 += `@keyframes ${i3} { 50% { border-bottom-style: hidden; }}`, t3 += `@keyframes ${s3} { 50% { box-shadow: none; }}`, t3 += `@keyframes ${r2} { 0% { background-color: ${e3.cursor.css}; color: ${e3.cursorAccent.css}; } 50% { background-color: inherit; color: ${e3.cursor.css}; }}`, t3 += `${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i3} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s3} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r2} 1s step-end infinite;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block { background-color: ${e3.cursor.css}; color: ${e3.cursorAccent.css};}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e3.cursor.css} !important; color: ${e3.cursorAccent.css} !important;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e3.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e3.cursor.css} inset;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e3.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`, t3 += `${this._terminalSelector} .${C} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${C} div { position: absolute; background-color: ${e3.selectionBackgroundOpaque.css};}${this._terminalSelector} .${C} div { position: absolute; background-color: ${e3.selectionInactiveBackgroundOpaque.css};}`; + for (const [i4, s4] of e3.ansi.entries()) t3 += `${this._terminalSelector} .${g}${i4} { color: ${s4.css}; }${this._terminalSelector} .${g}${i4}.xterm-dim { color: ${d.color.multiplyOpacity(s4, 0.5).css}; }${this._terminalSelector} .${m}${i4} { background-color: ${s4.css}; }`; + t3 += `${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { color: ${d.color.opaque(e3.background).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${d.color.multiplyOpacity(d.color.opaque(e3.background), 0.5).css}; }${this._terminalSelector} .${m}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e3.foreground.css}; }`, this._themeStyleElement.textContent = t3; + } + _setDefaultSpacing() { + const e3 = this.dimensions.css.cell.width - this._widthCache.get("W", false, false); + this._rowContainer.style.letterSpacing = `${e3}px`, this._rowFactory.defaultSpacing = e3; + } + handleDevicePixelRatioChange() { + this._updateDimensions(), this._widthCache.clear(), this._setDefaultSpacing(); + } + _refreshRowElements(e3, t3) { + for (let e4 = this._rowElements.length; e4 <= t3; e4++) { + const e5 = this._document.createElement("div"); + this._rowContainer.appendChild(e5), this._rowElements.push(e5); + } + for (; this._rowElements.length > t3; ) this._rowContainer.removeChild(this._rowElements.pop()); + } + handleResize(e3, t3) { + this._refreshRowElements(e3, t3), this._updateDimensions(), this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode); + } + handleCharSizeChanged() { + this._updateDimensions(), this._widthCache.clear(), this._setDefaultSpacing(); + } + handleBlur() { + this._rowContainer.classList.remove(S), this.renderRows(0, this._bufferService.rows - 1); + } + handleFocus() { + this._rowContainer.classList.add(S), this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y); + } + handleSelectionChanged(e3, t3, i3) { + if (this._selectionContainer.replaceChildren(), this._rowFactory.handleSelectionChanged(e3, t3, i3), this.renderRows(0, this._bufferService.rows - 1), !e3 || !t3) return; + this._selectionRenderModel.update(this._terminal, e3, t3, i3); + const s3 = this._selectionRenderModel.viewportStartRow, r2 = this._selectionRenderModel.viewportEndRow, n2 = this._selectionRenderModel.viewportCappedStartRow, o2 = this._selectionRenderModel.viewportCappedEndRow; + if (n2 >= this._bufferService.rows || o2 < 0) return; + const a2 = this._document.createDocumentFragment(); + if (i3) { + const i4 = e3[0] > t3[0]; + a2.appendChild(this._createSelectionElement(n2, i4 ? t3[0] : e3[0], i4 ? e3[0] : t3[0], o2 - n2 + 1)); + } else { + const i4 = s3 === n2 ? e3[0] : 0, h2 = n2 === r2 ? t3[0] : this._bufferService.cols; + a2.appendChild(this._createSelectionElement(n2, i4, h2)); + const c2 = o2 - n2 - 1; + if (a2.appendChild(this._createSelectionElement(n2 + 1, 0, this._bufferService.cols, c2)), n2 !== o2) { + const e4 = r2 === o2 ? t3[0] : this._bufferService.cols; + a2.appendChild(this._createSelectionElement(o2, 0, e4)); + } + } + this._selectionContainer.appendChild(a2); + } + _createSelectionElement(e3, t3, i3, s3 = 1) { + const r2 = this._document.createElement("div"), n2 = t3 * this.dimensions.css.cell.width; + let o2 = this.dimensions.css.cell.width * (i3 - t3); + return n2 + o2 > this.dimensions.css.canvas.width && (o2 = this.dimensions.css.canvas.width - n2), r2.style.height = s3 * this.dimensions.css.cell.height + "px", r2.style.top = e3 * this.dimensions.css.cell.height + "px", r2.style.left = `${n2}px`, r2.style.width = `${o2}px`, r2; + } + handleCursorMove() { + } + _handleOptionsChanged() { + this._updateDimensions(), this._injectCss(this._themeService.colors), this._widthCache.setFont(this._optionsService.rawOptions.fontFamily, this._optionsService.rawOptions.fontSize, this._optionsService.rawOptions.fontWeight, this._optionsService.rawOptions.fontWeightBold), this._setDefaultSpacing(); + } + clear() { + for (const e3 of this._rowElements) e3.replaceChildren(); + } + renderRows(e3, t3) { + const i3 = this._bufferService.buffer, s3 = i3.ybase + i3.y, r2 = Math.min(i3.x, this._bufferService.cols - 1), n2 = this._optionsService.rawOptions.cursorBlink, o2 = this._optionsService.rawOptions.cursorStyle, a2 = this._optionsService.rawOptions.cursorInactiveStyle; + for (let h2 = e3; h2 <= t3; h2++) { + const e4 = h2 + i3.ydisp, t4 = this._rowElements[h2], c2 = i3.lines.get(e4); + if (!t4 || !c2) break; + t4.replaceChildren(...this._rowFactory.createRow(c2, e4, e4 === s3, o2, a2, r2, n2, this.dimensions.css.cell.width, this._widthCache, -1, -1)); + } + } + get _terminalSelector() { + return `.${v}${this._terminalClass}`; + } + _handleLinkHover(e3) { + this._setCellUnderline(e3.x1, e3.x2, e3.y1, e3.y2, e3.cols, true); + } + _handleLinkLeave(e3) { + this._setCellUnderline(e3.x1, e3.x2, e3.y1, e3.y2, e3.cols, false); + } + _setCellUnderline(e3, t3, i3, s3, r2, n2) { + i3 < 0 && (e3 = 0), s3 < 0 && (t3 = 0); + const o2 = this._bufferService.rows - 1; + i3 = Math.max(Math.min(i3, o2), 0), s3 = Math.max(Math.min(s3, o2), 0), r2 = Math.min(r2, this._bufferService.cols); + const a2 = this._bufferService.buffer, h2 = a2.ybase + a2.y, c2 = Math.min(a2.x, r2 - 1), l2 = this._optionsService.rawOptions.cursorBlink, d2 = this._optionsService.rawOptions.cursorStyle, _2 = this._optionsService.rawOptions.cursorInactiveStyle; + for (let o3 = i3; o3 <= s3; ++o3) { + const u2 = o3 + a2.ydisp, f2 = this._rowElements[o3], v2 = a2.lines.get(u2); + if (!f2 || !v2) break; + f2.replaceChildren(...this._rowFactory.createRow(v2, u2, u2 === h2, d2, _2, c2, l2, this.dimensions.css.cell.width, this._widthCache, n2 ? o3 === i3 ? e3 : 0 : -1, n2 ? (o3 === s3 ? t3 : r2) - 1 : -1)); + } + } + }; + t2.DomRenderer = w = s2([r(7, f.IInstantiationService), r(8, l.ICharSizeService), r(9, f.IOptionsService), r(10, f.IBufferService), r(11, l.ICoreBrowserService), r(12, l.IThemeService)], w); + }, 3787: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.DomRendererRowFactory = void 0; + const n = i2(2223), o = i2(643), a = i2(511), h = i2(2585), c = i2(8055), l = i2(4725), d = i2(4269), _ = i2(6171), u = i2(3734); + let f = t2.DomRendererRowFactory = class { + constructor(e3, t3, i3, s3, r2, n2, o2) { + this._document = e3, this._characterJoinerService = t3, this._optionsService = i3, this._coreBrowserService = s3, this._coreService = r2, this._decorationService = n2, this._themeService = o2, this._workCell = new a.CellData(), this._columnSelectMode = false, this.defaultSpacing = 0; + } + handleSelectionChanged(e3, t3, i3) { + this._selectionStart = e3, this._selectionEnd = t3, this._columnSelectMode = i3; + } + createRow(e3, t3, i3, s3, r2, a2, h2, l2, _2, f2, p) { + const g = [], m = this._characterJoinerService.getJoinedCharacters(t3), S = this._themeService.colors; + let C, b = e3.getNoBgTrimmedLength(); + i3 && b < a2 + 1 && (b = a2 + 1); + let w = 0, y = "", E = 0, k = 0, L = 0, D = false, R = 0, x = false, A = 0; + const B = [], T = -1 !== f2 && -1 !== p; + for (let M = 0; M < b; M++) { + e3.loadCell(M, this._workCell); + let b2 = this._workCell.getWidth(); + if (0 === b2) continue; + let O = false, P = M, I = this._workCell; + if (m.length > 0 && M === m[0][0]) { + O = true; + const t4 = m.shift(); + I = new d.JoinedCellData(this._workCell, e3.translateToString(true, t4[0], t4[1]), t4[1] - t4[0]), P = t4[1] - 1, b2 = I.getWidth(); + } + const H = this._isCellInSelection(M, t3), F = i3 && M === a2, W = T && M >= f2 && M <= p; + let U = false; + this._decorationService.forEachDecorationAtCell(M, t3, void 0, (e4) => { + U = true; + }); + let N = I.getChars() || o.WHITESPACE_CELL_CHAR; + if (" " === N && (I.isUnderline() || I.isOverline()) && (N = " "), A = b2 * l2 - _2.get(N, I.isBold(), I.isItalic()), C) { + if (w && (H && x || !H && !x && I.bg === E) && (H && x && S.selectionForeground || I.fg === k) && I.extended.ext === L && W === D && A === R && !F && !O && !U) { + I.isInvisible() ? y += o.WHITESPACE_CELL_CHAR : y += N, w++; + continue; + } + w && (C.textContent = y), C = this._document.createElement("span"), w = 0, y = ""; + } else C = this._document.createElement("span"); + if (E = I.bg, k = I.fg, L = I.extended.ext, D = W, R = A, x = H, O && a2 >= M && a2 <= P && (a2 = M), !this._coreService.isCursorHidden && F && this._coreService.isCursorInitialized) { + if (B.push("xterm-cursor"), this._coreBrowserService.isFocused) h2 && B.push("xterm-cursor-blink"), B.push("bar" === s3 ? "xterm-cursor-bar" : "underline" === s3 ? "xterm-cursor-underline" : "xterm-cursor-block"); + else if (r2) switch (r2) { + case "outline": + B.push("xterm-cursor-outline"); + break; + case "block": + B.push("xterm-cursor-block"); + break; + case "bar": + B.push("xterm-cursor-bar"); + break; + case "underline": + B.push("xterm-cursor-underline"); + } + } + if (I.isBold() && B.push("xterm-bold"), I.isItalic() && B.push("xterm-italic"), I.isDim() && B.push("xterm-dim"), y = I.isInvisible() ? o.WHITESPACE_CELL_CHAR : I.getChars() || o.WHITESPACE_CELL_CHAR, I.isUnderline() && (B.push(`xterm-underline-${I.extended.underlineStyle}`), " " === y && (y = " "), !I.isUnderlineColorDefault())) if (I.isUnderlineColorRGB()) C.style.textDecorationColor = `rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`; + else { + let e4 = I.getUnderlineColor(); + this._optionsService.rawOptions.drawBoldTextInBrightColors && I.isBold() && e4 < 8 && (e4 += 8), C.style.textDecorationColor = S.ansi[e4].css; + } + I.isOverline() && (B.push("xterm-overline"), " " === y && (y = " ")), I.isStrikethrough() && B.push("xterm-strikethrough"), W && (C.style.textDecoration = "underline"); + let $ = I.getFgColor(), j = I.getFgColorMode(), z = I.getBgColor(), K = I.getBgColorMode(); + const q = !!I.isInverse(); + if (q) { + const e4 = $; + $ = z, z = e4; + const t4 = j; + j = K, K = t4; + } + let V, G, X, J = false; + switch (this._decorationService.forEachDecorationAtCell(M, t3, void 0, (e4) => { + "top" !== e4.options.layer && J || (e4.backgroundColorRGB && (K = 50331648, z = e4.backgroundColorRGB.rgba >> 8 & 16777215, V = e4.backgroundColorRGB), e4.foregroundColorRGB && (j = 50331648, $ = e4.foregroundColorRGB.rgba >> 8 & 16777215, G = e4.foregroundColorRGB), J = "top" === e4.options.layer); + }), !J && H && (V = this._coreBrowserService.isFocused ? S.selectionBackgroundOpaque : S.selectionInactiveBackgroundOpaque, z = V.rgba >> 8 & 16777215, K = 50331648, J = true, S.selectionForeground && (j = 50331648, $ = S.selectionForeground.rgba >> 8 & 16777215, G = S.selectionForeground)), J && B.push("xterm-decoration-top"), K) { + case 16777216: + case 33554432: + X = S.ansi[z], B.push(`xterm-bg-${z}`); + break; + case 50331648: + X = c.channels.toColor(z >> 16, z >> 8 & 255, 255 & z), this._addStyle(C, `background-color:#${v((z >>> 0).toString(16), "0", 6)}`); + break; + default: + q ? (X = S.foreground, B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)) : X = S.background; + } + switch (V || I.isDim() && (V = c.color.multiplyOpacity(X, 0.5)), j) { + case 16777216: + case 33554432: + I.isBold() && $ < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors && ($ += 8), this._applyMinimumContrast(C, X, S.ansi[$], I, V, void 0) || B.push(`xterm-fg-${$}`); + break; + case 50331648: + const e4 = c.channels.toColor($ >> 16 & 255, $ >> 8 & 255, 255 & $); + this._applyMinimumContrast(C, X, e4, I, V, G) || this._addStyle(C, `color:#${v($.toString(16), "0", 6)}`); + break; + default: + this._applyMinimumContrast(C, X, S.foreground, I, V, G) || q && B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`); + } + B.length && (C.className = B.join(" "), B.length = 0), F || O || U ? C.textContent = y : w++, A !== this.defaultSpacing && (C.style.letterSpacing = `${A}px`), g.push(C), M = P; + } + return C && w && (C.textContent = y), g; + } + _applyMinimumContrast(e3, t3, i3, s3, r2, n2) { + if (1 === this._optionsService.rawOptions.minimumContrastRatio || (0, _.treatGlyphAsBackgroundColor)(s3.getCode())) return false; + const o2 = this._getContrastCache(s3); + let a2; + if (r2 || n2 || (a2 = o2.getColor(t3.rgba, i3.rgba)), void 0 === a2) { + const e4 = this._optionsService.rawOptions.minimumContrastRatio / (s3.isDim() ? 2 : 1); + a2 = c.color.ensureContrastRatio(r2 || t3, n2 || i3, e4), o2.setColor((r2 || t3).rgba, (n2 || i3).rgba, a2 ?? null); + } + return !!a2 && (this._addStyle(e3, `color:${a2.css}`), true); + } + _getContrastCache(e3) { + return e3.isDim() ? this._themeService.colors.halfContrastCache : this._themeService.colors.contrastCache; + } + _addStyle(e3, t3) { + e3.setAttribute("style", `${e3.getAttribute("style") || ""}${t3};`); + } + _isCellInSelection(e3, t3) { + const i3 = this._selectionStart, s3 = this._selectionEnd; + return !(!i3 || !s3) && (this._columnSelectMode ? i3[0] <= s3[0] ? e3 >= i3[0] && t3 >= i3[1] && e3 < s3[0] && t3 <= s3[1] : e3 < i3[0] && t3 >= i3[1] && e3 >= s3[0] && t3 <= s3[1] : t3 > i3[1] && t3 < s3[1] || i3[1] === s3[1] && t3 === i3[1] && e3 >= i3[0] && e3 < s3[0] || i3[1] < s3[1] && t3 === s3[1] && e3 < s3[0] || i3[1] < s3[1] && t3 === i3[1] && e3 >= i3[0]); + } + }; + function v(e3, t3, i3) { + for (; e3.length < i3; ) e3 = t3 + e3; + return e3; + } + t2.DomRendererRowFactory = f = s2([r(1, l.ICharacterJoinerService), r(2, h.IOptionsService), r(3, l.ICoreBrowserService), r(4, h.ICoreService), r(5, h.IDecorationService), r(6, l.IThemeService)], f); + }, 2550: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WidthCache = void 0, t2.WidthCache = class { + constructor(e3, t3) { + this._flat = new Float32Array(256), this._font = "", this._fontSize = 0, this._weight = "normal", this._weightBold = "bold", this._measureElements = [], this._container = e3.createElement("div"), this._container.classList.add("xterm-width-cache-measure-container"), this._container.setAttribute("aria-hidden", "true"), this._container.style.whiteSpace = "pre", this._container.style.fontKerning = "none"; + const i2 = e3.createElement("span"); + i2.classList.add("xterm-char-measure-element"); + const s2 = e3.createElement("span"); + s2.classList.add("xterm-char-measure-element"), s2.style.fontWeight = "bold"; + const r = e3.createElement("span"); + r.classList.add("xterm-char-measure-element"), r.style.fontStyle = "italic"; + const n = e3.createElement("span"); + n.classList.add("xterm-char-measure-element"), n.style.fontWeight = "bold", n.style.fontStyle = "italic", this._measureElements = [i2, s2, r, n], this._container.appendChild(i2), this._container.appendChild(s2), this._container.appendChild(r), this._container.appendChild(n), t3.appendChild(this._container), this.clear(); + } + dispose() { + this._container.remove(), this._measureElements.length = 0, this._holey = void 0; + } + clear() { + this._flat.fill(-9999), this._holey = /* @__PURE__ */ new Map(); + } + setFont(e3, t3, i2, s2) { + e3 === this._font && t3 === this._fontSize && i2 === this._weight && s2 === this._weightBold || (this._font = e3, this._fontSize = t3, this._weight = i2, this._weightBold = s2, this._container.style.fontFamily = this._font, this._container.style.fontSize = `${this._fontSize}px`, this._measureElements[0].style.fontWeight = `${i2}`, this._measureElements[1].style.fontWeight = `${s2}`, this._measureElements[2].style.fontWeight = `${i2}`, this._measureElements[3].style.fontWeight = `${s2}`, this.clear()); + } + get(e3, t3, i2) { + let s2 = 0; + if (!t3 && !i2 && 1 === e3.length && (s2 = e3.charCodeAt(0)) < 256) { + if (-9999 !== this._flat[s2]) return this._flat[s2]; + const t4 = this._measure(e3, 0); + return t4 > 0 && (this._flat[s2] = t4), t4; + } + let r = e3; + t3 && (r += "B"), i2 && (r += "I"); + let n = this._holey.get(r); + if (void 0 === n) { + let s3 = 0; + t3 && (s3 |= 1), i2 && (s3 |= 2), n = this._measure(e3, s3), n > 0 && this._holey.set(r, n); + } + return n; + } + _measure(e3, t3) { + const i2 = this._measureElements[t3]; + return i2.textContent = e3.repeat(32), i2.offsetWidth / 32; + } + }; + }, 2223: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TEXT_BASELINE = t2.DIM_OPACITY = t2.INVERTED_DEFAULT_COLOR = void 0; + const s2 = i2(6114); + t2.INVERTED_DEFAULT_COLOR = 257, t2.DIM_OPACITY = 0.5, t2.TEXT_BASELINE = s2.isFirefox || s2.isLegacyEdge ? "bottom" : "ideographic"; + }, 6171: (e2, t2) => { + function i2(e3) { + return 57508 <= e3 && e3 <= 57558; + } + function s2(e3) { + return e3 >= 128512 && e3 <= 128591 || e3 >= 127744 && e3 <= 128511 || e3 >= 128640 && e3 <= 128767 || e3 >= 9728 && e3 <= 9983 || e3 >= 9984 && e3 <= 10175 || e3 >= 65024 && e3 <= 65039 || e3 >= 129280 && e3 <= 129535 || e3 >= 127462 && e3 <= 127487; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.computeNextVariantOffset = t2.createRenderDimensions = t2.treatGlyphAsBackgroundColor = t2.allowRescaling = t2.isEmoji = t2.isRestrictedPowerlineGlyph = t2.isPowerlineGlyph = t2.throwIfFalsy = void 0, t2.throwIfFalsy = function(e3) { + if (!e3) throw new Error("value must not be falsy"); + return e3; + }, t2.isPowerlineGlyph = i2, t2.isRestrictedPowerlineGlyph = function(e3) { + return 57520 <= e3 && e3 <= 57527; + }, t2.isEmoji = s2, t2.allowRescaling = function(e3, t3, r, n) { + return 1 === t3 && r > Math.ceil(1.5 * n) && void 0 !== e3 && e3 > 255 && !s2(e3) && !i2(e3) && !function(e4) { + return 57344 <= e4 && e4 <= 63743; + }(e3); + }, t2.treatGlyphAsBackgroundColor = function(e3) { + return i2(e3) || function(e4) { + return 9472 <= e4 && e4 <= 9631; + }(e3); + }, t2.createRenderDimensions = function() { + return { css: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 } }, device: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 }, char: { width: 0, height: 0, left: 0, top: 0 } } }; + }, t2.computeNextVariantOffset = function(e3, t3, i3 = 0) { + return (e3 - (2 * Math.round(t3) - i3)) % (2 * Math.round(t3)); + }; + }, 6052: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createSelectionRenderModel = void 0; + class i2 { + constructor() { + this.clear(); + } + clear() { + this.hasSelection = false, this.columnSelectMode = false, this.viewportStartRow = 0, this.viewportEndRow = 0, this.viewportCappedStartRow = 0, this.viewportCappedEndRow = 0, this.startCol = 0, this.endCol = 0, this.selectionStart = void 0, this.selectionEnd = void 0; + } + update(e3, t3, i3, s2 = false) { + if (this.selectionStart = t3, this.selectionEnd = i3, !t3 || !i3 || t3[0] === i3[0] && t3[1] === i3[1]) return void this.clear(); + const r = e3.buffers.active.ydisp, n = t3[1] - r, o = i3[1] - r, a = Math.max(n, 0), h = Math.min(o, e3.rows - 1); + a >= e3.rows || h < 0 ? this.clear() : (this.hasSelection = true, this.columnSelectMode = s2, this.viewportStartRow = n, this.viewportEndRow = o, this.viewportCappedStartRow = a, this.viewportCappedEndRow = h, this.startCol = t3[0], this.endCol = i3[0]); + } + isCellSelected(e3, t3, i3) { + return !!this.hasSelection && (i3 -= e3.buffer.active.viewportY, this.columnSelectMode ? this.startCol <= this.endCol ? t3 >= this.startCol && i3 >= this.viewportCappedStartRow && t3 < this.endCol && i3 <= this.viewportCappedEndRow : t3 < this.startCol && i3 >= this.viewportCappedStartRow && t3 >= this.endCol && i3 <= this.viewportCappedEndRow : i3 > this.viewportStartRow && i3 < this.viewportEndRow || this.viewportStartRow === this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportEndRow && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol); + } + } + t2.createSelectionRenderModel = function() { + return new i2(); + }; + }, 456: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.SelectionModel = void 0, t2.SelectionModel = class { + constructor(e3) { + this._bufferService = e3, this.isSelectAllActive = false, this.selectionStartLength = 0; + } + clearSelection() { + this.selectionStart = void 0, this.selectionEnd = void 0, this.isSelectAllActive = false, this.selectionStartLength = 0; + } + get finalSelectionStart() { + return this.isSelectAllActive ? [0, 0] : this.selectionEnd && this.selectionStart && this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart; + } + get finalSelectionEnd() { + if (this.isSelectAllActive) return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1]; + if (this.selectionStart) { + if (!this.selectionEnd || this.areSelectionValuesReversed()) { + const e3 = this.selectionStart[0] + this.selectionStartLength; + return e3 > this._bufferService.cols ? e3 % this._bufferService.cols == 0 ? [this._bufferService.cols, this.selectionStart[1] + Math.floor(e3 / this._bufferService.cols) - 1] : [e3 % this._bufferService.cols, this.selectionStart[1] + Math.floor(e3 / this._bufferService.cols)] : [e3, this.selectionStart[1]]; + } + if (this.selectionStartLength && this.selectionEnd[1] === this.selectionStart[1]) { + const e3 = this.selectionStart[0] + this.selectionStartLength; + return e3 > this._bufferService.cols ? [e3 % this._bufferService.cols, this.selectionStart[1] + Math.floor(e3 / this._bufferService.cols)] : [Math.max(e3, this.selectionEnd[0]), this.selectionEnd[1]]; + } + return this.selectionEnd; + } + } + areSelectionValuesReversed() { + const e3 = this.selectionStart, t3 = this.selectionEnd; + return !(!e3 || !t3) && (e3[1] > t3[1] || e3[1] === t3[1] && e3[0] > t3[0]); + } + handleTrim(e3) { + return this.selectionStart && (this.selectionStart[1] -= e3), this.selectionEnd && (this.selectionEnd[1] -= e3), this.selectionEnd && this.selectionEnd[1] < 0 ? (this.clearSelection(), true) : (this.selectionStart && this.selectionStart[1] < 0 && (this.selectionStart[1] = 0), false); + } + }; + }, 428: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharSizeService = void 0; + const n = i2(2585), o = i2(8460), a = i2(844); + let h = t2.CharSizeService = class extends a.Disposable { + get hasValidSize() { + return this.width > 0 && this.height > 0; + } + constructor(e3, t3, i3) { + super(), this._optionsService = i3, this.width = 0, this.height = 0, this._onCharSizeChange = this.register(new o.EventEmitter()), this.onCharSizeChange = this._onCharSizeChange.event; + try { + this._measureStrategy = this.register(new d(this._optionsService)); + } catch { + this._measureStrategy = this.register(new l(e3, t3, this._optionsService)); + } + this.register(this._optionsService.onMultipleOptionChange(["fontFamily", "fontSize"], () => this.measure())); + } + measure() { + const e3 = this._measureStrategy.measure(); + e3.width === this.width && e3.height === this.height || (this.width = e3.width, this.height = e3.height, this._onCharSizeChange.fire()); + } + }; + t2.CharSizeService = h = s2([r(2, n.IOptionsService)], h); + class c extends a.Disposable { + constructor() { + super(...arguments), this._result = { width: 0, height: 0 }; + } + _validateAndSet(e3, t3) { + void 0 !== e3 && e3 > 0 && void 0 !== t3 && t3 > 0 && (this._result.width = e3, this._result.height = t3); + } + } + class l extends c { + constructor(e3, t3, i3) { + super(), this._document = e3, this._parentElement = t3, this._optionsService = i3, this._measureElement = this._document.createElement("span"), this._measureElement.classList.add("xterm-char-measure-element"), this._measureElement.textContent = "W".repeat(32), this._measureElement.setAttribute("aria-hidden", "true"), this._measureElement.style.whiteSpace = "pre", this._measureElement.style.fontKerning = "none", this._parentElement.appendChild(this._measureElement); + } + measure() { + return this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily, this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`, this._validateAndSet(Number(this._measureElement.offsetWidth) / 32, Number(this._measureElement.offsetHeight)), this._result; + } + } + class d extends c { + constructor(e3) { + super(), this._optionsService = e3, this._canvas = new OffscreenCanvas(100, 100), this._ctx = this._canvas.getContext("2d"); + const t3 = this._ctx.measureText("W"); + if (!("width" in t3 && "fontBoundingBoxAscent" in t3 && "fontBoundingBoxDescent" in t3)) throw new Error("Required font metrics not supported"); + } + measure() { + this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`; + const e3 = this._ctx.measureText("W"); + return this._validateAndSet(e3.width, e3.fontBoundingBoxAscent + e3.fontBoundingBoxDescent), this._result; + } + } + }, 4269: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharacterJoinerService = t2.JoinedCellData = void 0; + const n = i2(3734), o = i2(643), a = i2(511), h = i2(2585); + class c extends n.AttributeData { + constructor(e3, t3, i3) { + super(), this.content = 0, this.combinedData = "", this.fg = e3.fg, this.bg = e3.bg, this.combinedData = t3, this._width = i3; + } + isCombined() { + return 2097152; + } + getWidth() { + return this._width; + } + getChars() { + return this.combinedData; + } + getCode() { + return 2097151; + } + setFromCharData(e3) { + throw new Error("not implemented"); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.JoinedCellData = c; + let l = t2.CharacterJoinerService = class e3 { + constructor(e4) { + this._bufferService = e4, this._characterJoiners = [], this._nextCharacterJoinerId = 0, this._workCell = new a.CellData(); + } + register(e4) { + const t3 = { id: this._nextCharacterJoinerId++, handler: e4 }; + return this._characterJoiners.push(t3), t3.id; + } + deregister(e4) { + for (let t3 = 0; t3 < this._characterJoiners.length; t3++) if (this._characterJoiners[t3].id === e4) return this._characterJoiners.splice(t3, 1), true; + return false; + } + getJoinedCharacters(e4) { + if (0 === this._characterJoiners.length) return []; + const t3 = this._bufferService.buffer.lines.get(e4); + if (!t3 || 0 === t3.length) return []; + const i3 = [], s3 = t3.translateToString(true); + let r2 = 0, n2 = 0, a2 = 0, h2 = t3.getFg(0), c2 = t3.getBg(0); + for (let e5 = 0; e5 < t3.getTrimmedLength(); e5++) if (t3.loadCell(e5, this._workCell), 0 !== this._workCell.getWidth()) { + if (this._workCell.fg !== h2 || this._workCell.bg !== c2) { + if (e5 - r2 > 1) { + const e6 = this._getJoinedRanges(s3, a2, n2, t3, r2); + for (let t4 = 0; t4 < e6.length; t4++) i3.push(e6[t4]); + } + r2 = e5, a2 = n2, h2 = this._workCell.fg, c2 = this._workCell.bg; + } + n2 += this._workCell.getChars().length || o.WHITESPACE_CELL_CHAR.length; + } + if (this._bufferService.cols - r2 > 1) { + const e5 = this._getJoinedRanges(s3, a2, n2, t3, r2); + for (let t4 = 0; t4 < e5.length; t4++) i3.push(e5[t4]); + } + return i3; + } + _getJoinedRanges(t3, i3, s3, r2, n2) { + const o2 = t3.substring(i3, s3); + let a2 = []; + try { + a2 = this._characterJoiners[0].handler(o2); + } catch (e4) { + console.error(e4); + } + for (let t4 = 1; t4 < this._characterJoiners.length; t4++) try { + const i4 = this._characterJoiners[t4].handler(o2); + for (let t5 = 0; t5 < i4.length; t5++) e3._mergeRanges(a2, i4[t5]); + } catch (e4) { + console.error(e4); + } + return this._stringRangesToCellRanges(a2, r2, n2), a2; + } + _stringRangesToCellRanges(e4, t3, i3) { + let s3 = 0, r2 = false, n2 = 0, a2 = e4[s3]; + if (a2) { + for (let h2 = i3; h2 < this._bufferService.cols; h2++) { + const i4 = t3.getWidth(h2), c2 = t3.getString(h2).length || o.WHITESPACE_CELL_CHAR.length; + if (0 !== i4) { + if (!r2 && a2[0] <= n2 && (a2[0] = h2, r2 = true), a2[1] <= n2) { + if (a2[1] = h2, a2 = e4[++s3], !a2) break; + a2[0] <= n2 ? (a2[0] = h2, r2 = true) : r2 = false; + } + n2 += c2; + } + } + a2 && (a2[1] = this._bufferService.cols); + } + } + static _mergeRanges(e4, t3) { + let i3 = false; + for (let s3 = 0; s3 < e4.length; s3++) { + const r2 = e4[s3]; + if (i3) { + if (t3[1] <= r2[0]) return e4[s3 - 1][1] = t3[1], e4; + if (t3[1] <= r2[1]) return e4[s3 - 1][1] = Math.max(t3[1], r2[1]), e4.splice(s3, 1), e4; + e4.splice(s3, 1), s3--; + } else { + if (t3[1] <= r2[0]) return e4.splice(s3, 0, t3), e4; + if (t3[1] <= r2[1]) return r2[0] = Math.min(t3[0], r2[0]), e4; + t3[0] < r2[1] && (r2[0] = Math.min(t3[0], r2[0]), i3 = true); + } + } + return i3 ? e4[e4.length - 1][1] = t3[1] : e4.push(t3), e4; + } + }; + t2.CharacterJoinerService = l = s2([r(0, h.IBufferService)], l); + }, 5114: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreBrowserService = void 0; + const s2 = i2(844), r = i2(8460), n = i2(3656); + class o extends s2.Disposable { + constructor(e3, t3, i3) { + super(), this._textarea = e3, this._window = t3, this.mainDocument = i3, this._isFocused = false, this._cachedIsFocused = void 0, this._screenDprMonitor = new a(this._window), this._onDprChange = this.register(new r.EventEmitter()), this.onDprChange = this._onDprChange.event, this._onWindowChange = this.register(new r.EventEmitter()), this.onWindowChange = this._onWindowChange.event, this.register(this.onWindowChange((e4) => this._screenDprMonitor.setWindow(e4))), this.register((0, r.forwardEvent)(this._screenDprMonitor.onDprChange, this._onDprChange)), this._textarea.addEventListener("focus", () => this._isFocused = true), this._textarea.addEventListener("blur", () => this._isFocused = false); + } + get window() { + return this._window; + } + set window(e3) { + this._window !== e3 && (this._window = e3, this._onWindowChange.fire(this._window)); + } + get dpr() { + return this.window.devicePixelRatio; + } + get isFocused() { + return void 0 === this._cachedIsFocused && (this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus(), queueMicrotask(() => this._cachedIsFocused = void 0)), this._cachedIsFocused; + } + } + t2.CoreBrowserService = o; + class a extends s2.Disposable { + constructor(e3) { + super(), this._parentWindow = e3, this._windowResizeListener = this.register(new s2.MutableDisposable()), this._onDprChange = this.register(new r.EventEmitter()), this.onDprChange = this._onDprChange.event, this._outerListener = () => this._setDprAndFireIfDiffers(), this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio, this._updateDpr(), this._setWindowResizeListener(), this.register((0, s2.toDisposable)(() => this.clearListener())); + } + setWindow(e3) { + this._parentWindow = e3, this._setWindowResizeListener(), this._setDprAndFireIfDiffers(); + } + _setWindowResizeListener() { + this._windowResizeListener.value = (0, n.addDisposableDomListener)(this._parentWindow, "resize", () => this._setDprAndFireIfDiffers()); + } + _setDprAndFireIfDiffers() { + this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio && this._onDprChange.fire(this._parentWindow.devicePixelRatio), this._updateDpr(); + } + _updateDpr() { + var _a2; + this._outerListener && ((_a2 = this._resolutionMediaMatchList) == null ? void 0 : _a2.removeListener(this._outerListener), this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio, this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`), this._resolutionMediaMatchList.addListener(this._outerListener)); + } + clearListener() { + this._resolutionMediaMatchList && this._outerListener && (this._resolutionMediaMatchList.removeListener(this._outerListener), this._resolutionMediaMatchList = void 0, this._outerListener = void 0); + } + } + }, 779: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkProviderService = void 0; + const s2 = i2(844); + class r extends s2.Disposable { + constructor() { + super(), this.linkProviders = [], this.register((0, s2.toDisposable)(() => this.linkProviders.length = 0)); + } + registerLinkProvider(e3) { + return this.linkProviders.push(e3), { dispose: () => { + const t3 = this.linkProviders.indexOf(e3); + -1 !== t3 && this.linkProviders.splice(t3, 1); + } }; + } + } + t2.LinkProviderService = r; + }, 8934: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.MouseService = void 0; + const n = i2(4725), o = i2(9806); + let a = t2.MouseService = class { + constructor(e3, t3) { + this._renderService = e3, this._charSizeService = t3; + } + getCoords(e3, t3, i3, s3, r2) { + return (0, o.getCoords)(window, e3, t3, i3, s3, this._charSizeService.hasValidSize, this._renderService.dimensions.css.cell.width, this._renderService.dimensions.css.cell.height, r2); + } + getMouseReportCoords(e3, t3) { + const i3 = (0, o.getCoordsRelativeToElement)(window, e3, t3); + if (this._charSizeService.hasValidSize) return i3[0] = Math.min(Math.max(i3[0], 0), this._renderService.dimensions.css.canvas.width - 1), i3[1] = Math.min(Math.max(i3[1], 0), this._renderService.dimensions.css.canvas.height - 1), { col: Math.floor(i3[0] / this._renderService.dimensions.css.cell.width), row: Math.floor(i3[1] / this._renderService.dimensions.css.cell.height), x: Math.floor(i3[0]), y: Math.floor(i3[1]) }; + } + }; + t2.MouseService = a = s2([r(0, n.IRenderService), r(1, n.ICharSizeService)], a); + }, 3230: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.RenderService = void 0; + const n = i2(6193), o = i2(4725), a = i2(8460), h = i2(844), c = i2(7226), l = i2(2585); + let d = t2.RenderService = class extends h.Disposable { + get dimensions() { + return this._renderer.value.dimensions; + } + constructor(e3, t3, i3, s3, r2, o2, l2, d2) { + super(), this._rowCount = e3, this._charSizeService = s3, this._renderer = this.register(new h.MutableDisposable()), this._pausedResizeTask = new c.DebouncedIdleTask(), this._observerDisposable = this.register(new h.MutableDisposable()), this._isPaused = false, this._needsFullRefresh = false, this._isNextRenderRedrawOnly = true, this._needsSelectionRefresh = false, this._canvasWidth = 0, this._canvasHeight = 0, this._selectionState = { start: void 0, end: void 0, columnSelectMode: false }, this._onDimensionsChange = this.register(new a.EventEmitter()), this.onDimensionsChange = this._onDimensionsChange.event, this._onRenderedViewportChange = this.register(new a.EventEmitter()), this.onRenderedViewportChange = this._onRenderedViewportChange.event, this._onRender = this.register(new a.EventEmitter()), this.onRender = this._onRender.event, this._onRefreshRequest = this.register(new a.EventEmitter()), this.onRefreshRequest = this._onRefreshRequest.event, this._renderDebouncer = new n.RenderDebouncer((e4, t4) => this._renderRows(e4, t4), l2), this.register(this._renderDebouncer), this.register(l2.onDprChange(() => this.handleDevicePixelRatioChange())), this.register(o2.onResize(() => this._fullRefresh())), this.register(o2.buffers.onBufferActivate(() => { + var _a; + return (_a = this._renderer.value) == null ? void 0 : _a.clear(); + })), this.register(i3.onOptionChange(() => this._handleOptionsChanged())), this.register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged())), this.register(r2.onDecorationRegistered(() => this._fullRefresh())), this.register(r2.onDecorationRemoved(() => this._fullRefresh())), this.register(i3.onMultipleOptionChange(["customGlyphs", "drawBoldTextInBrightColors", "letterSpacing", "lineHeight", "fontFamily", "fontSize", "fontWeight", "fontWeightBold", "minimumContrastRatio", "rescaleOverlappingGlyphs"], () => { + this.clear(), this.handleResize(o2.cols, o2.rows), this._fullRefresh(); + })), this.register(i3.onMultipleOptionChange(["cursorBlink", "cursorStyle"], () => this.refreshRows(o2.buffer.y, o2.buffer.y, true))), this.register(d2.onChangeColors(() => this._fullRefresh())), this._registerIntersectionObserver(l2.window, t3), this.register(l2.onWindowChange((e4) => this._registerIntersectionObserver(e4, t3))); + } + _registerIntersectionObserver(e3, t3) { + if ("IntersectionObserver" in e3) { + const i3 = new e3.IntersectionObserver((e4) => this._handleIntersectionChange(e4[e4.length - 1]), { threshold: 0 }); + i3.observe(t3), this._observerDisposable.value = (0, h.toDisposable)(() => i3.disconnect()); + } + } + _handleIntersectionChange(e3) { + this._isPaused = void 0 === e3.isIntersecting ? 0 === e3.intersectionRatio : !e3.isIntersecting, this._isPaused || this._charSizeService.hasValidSize || this._charSizeService.measure(), !this._isPaused && this._needsFullRefresh && (this._pausedResizeTask.flush(), this.refreshRows(0, this._rowCount - 1), this._needsFullRefresh = false); + } + refreshRows(e3, t3, i3 = false) { + this._isPaused ? this._needsFullRefresh = true : (i3 || (this._isNextRenderRedrawOnly = false), this._renderDebouncer.refresh(e3, t3, this._rowCount)); + } + _renderRows(e3, t3) { + this._renderer.value && (e3 = Math.min(e3, this._rowCount - 1), t3 = Math.min(t3, this._rowCount - 1), this._renderer.value.renderRows(e3, t3), this._needsSelectionRefresh && (this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode), this._needsSelectionRefresh = false), this._isNextRenderRedrawOnly || this._onRenderedViewportChange.fire({ start: e3, end: t3 }), this._onRender.fire({ start: e3, end: t3 }), this._isNextRenderRedrawOnly = true); + } + resize(e3, t3) { + this._rowCount = t3, this._fireOnCanvasResize(); + } + _handleOptionsChanged() { + this._renderer.value && (this.refreshRows(0, this._rowCount - 1), this._fireOnCanvasResize()); + } + _fireOnCanvasResize() { + this._renderer.value && (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight || this._onDimensionsChange.fire(this._renderer.value.dimensions)); + } + hasRenderer() { + return !!this._renderer.value; + } + setRenderer(e3) { + this._renderer.value = e3, this._renderer.value && (this._renderer.value.onRequestRedraw((e4) => this.refreshRows(e4.start, e4.end, true)), this._needsSelectionRefresh = true, this._fullRefresh()); + } + addRefreshCallback(e3) { + return this._renderDebouncer.addRefreshCallback(e3); + } + _fullRefresh() { + this._isPaused ? this._needsFullRefresh = true : this.refreshRows(0, this._rowCount - 1); + } + clearTextureAtlas() { + var _a, _b; + this._renderer.value && ((_b = (_a = this._renderer.value).clearTextureAtlas) == null ? void 0 : _b.call(_a), this._fullRefresh()); + } + handleDevicePixelRatioChange() { + this._charSizeService.measure(), this._renderer.value && (this._renderer.value.handleDevicePixelRatioChange(), this.refreshRows(0, this._rowCount - 1)); + } + handleResize(e3, t3) { + this._renderer.value && (this._isPaused ? this._pausedResizeTask.set(() => { + var _a; + return (_a = this._renderer.value) == null ? void 0 : _a.handleResize(e3, t3); + }) : this._renderer.value.handleResize(e3, t3), this._fullRefresh()); + } + handleCharSizeChanged() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleCharSizeChanged(); + } + handleBlur() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleBlur(); + } + handleFocus() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleFocus(); + } + handleSelectionChanged(e3, t3, i3) { + var _a; + this._selectionState.start = e3, this._selectionState.end = t3, this._selectionState.columnSelectMode = i3, (_a = this._renderer.value) == null ? void 0 : _a.handleSelectionChanged(e3, t3, i3); + } + handleCursorMove() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleCursorMove(); + } + clear() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.clear(); + } + }; + t2.RenderService = d = s2([r(2, l.IOptionsService), r(3, o.ICharSizeService), r(4, l.IDecorationService), r(5, l.IBufferService), r(6, o.ICoreBrowserService), r(7, o.IThemeService)], d); + }, 9312: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.SelectionService = void 0; + const n = i2(9806), o = i2(9504), a = i2(456), h = i2(4725), c = i2(8460), l = i2(844), d = i2(6114), _ = i2(4841), u = i2(511), f = i2(2585), v = String.fromCharCode(160), p = new RegExp(v, "g"); + let g = t2.SelectionService = class extends l.Disposable { + constructor(e3, t3, i3, s3, r2, n2, o2, h2, d2) { + super(), this._element = e3, this._screenElement = t3, this._linkifier = i3, this._bufferService = s3, this._coreService = r2, this._mouseService = n2, this._optionsService = o2, this._renderService = h2, this._coreBrowserService = d2, this._dragScrollAmount = 0, this._enabled = true, this._workCell = new u.CellData(), this._mouseDownTimeStamp = 0, this._oldHasSelection = false, this._oldSelectionStart = void 0, this._oldSelectionEnd = void 0, this._onLinuxMouseSelection = this.register(new c.EventEmitter()), this.onLinuxMouseSelection = this._onLinuxMouseSelection.event, this._onRedrawRequest = this.register(new c.EventEmitter()), this.onRequestRedraw = this._onRedrawRequest.event, this._onSelectionChange = this.register(new c.EventEmitter()), this.onSelectionChange = this._onSelectionChange.event, this._onRequestScrollLines = this.register(new c.EventEmitter()), this.onRequestScrollLines = this._onRequestScrollLines.event, this._mouseMoveListener = (e4) => this._handleMouseMove(e4), this._mouseUpListener = (e4) => this._handleMouseUp(e4), this._coreService.onUserInput(() => { + this.hasSelection && this.clearSelection(); + }), this._trimListener = this._bufferService.buffer.lines.onTrim((e4) => this._handleTrim(e4)), this.register(this._bufferService.buffers.onBufferActivate((e4) => this._handleBufferActivate(e4))), this.enable(), this._model = new a.SelectionModel(this._bufferService), this._activeSelectionMode = 0, this.register((0, l.toDisposable)(() => { + this._removeMouseDownListeners(); + })); + } + reset() { + this.clearSelection(); + } + disable() { + this.clearSelection(), this._enabled = false; + } + enable() { + this._enabled = true; + } + get selectionStart() { + return this._model.finalSelectionStart; + } + get selectionEnd() { + return this._model.finalSelectionEnd; + } + get hasSelection() { + const e3 = this._model.finalSelectionStart, t3 = this._model.finalSelectionEnd; + return !(!e3 || !t3 || e3[0] === t3[0] && e3[1] === t3[1]); + } + get selectionText() { + const e3 = this._model.finalSelectionStart, t3 = this._model.finalSelectionEnd; + if (!e3 || !t3) return ""; + const i3 = this._bufferService.buffer, s3 = []; + if (3 === this._activeSelectionMode) { + if (e3[0] === t3[0]) return ""; + const r2 = e3[0] < t3[0] ? e3[0] : t3[0], n2 = e3[0] < t3[0] ? t3[0] : e3[0]; + for (let o2 = e3[1]; o2 <= t3[1]; o2++) { + const e4 = i3.translateBufferLineToString(o2, true, r2, n2); + s3.push(e4); + } + } else { + const r2 = e3[1] === t3[1] ? t3[0] : void 0; + s3.push(i3.translateBufferLineToString(e3[1], true, e3[0], r2)); + for (let r3 = e3[1] + 1; r3 <= t3[1] - 1; r3++) { + const e4 = i3.lines.get(r3), t4 = i3.translateBufferLineToString(r3, true); + (e4 == null ? void 0 : e4.isWrapped) ? s3[s3.length - 1] += t4 : s3.push(t4); + } + if (e3[1] !== t3[1]) { + const e4 = i3.lines.get(t3[1]), r3 = i3.translateBufferLineToString(t3[1], true, 0, t3[0]); + e4 && e4.isWrapped ? s3[s3.length - 1] += r3 : s3.push(r3); + } + } + return s3.map((e4) => e4.replace(p, " ")).join(d.isWindows ? "\r\n" : "\n"); + } + clearSelection() { + this._model.clearSelection(), this._removeMouseDownListeners(), this.refresh(), this._onSelectionChange.fire(); + } + refresh(e3) { + this._refreshAnimationFrame || (this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh())), d.isLinux && e3 && this.selectionText.length && this._onLinuxMouseSelection.fire(this.selectionText); + } + _refresh() { + this._refreshAnimationFrame = void 0, this._onRedrawRequest.fire({ start: this._model.finalSelectionStart, end: this._model.finalSelectionEnd, columnSelectMode: 3 === this._activeSelectionMode }); + } + _isClickInSelection(e3) { + const t3 = this._getMouseBufferCoords(e3), i3 = this._model.finalSelectionStart, s3 = this._model.finalSelectionEnd; + return !!(i3 && s3 && t3) && this._areCoordsInSelection(t3, i3, s3); + } + isCellInSelection(e3, t3) { + const i3 = this._model.finalSelectionStart, s3 = this._model.finalSelectionEnd; + return !(!i3 || !s3) && this._areCoordsInSelection([e3, t3], i3, s3); + } + _areCoordsInSelection(e3, t3, i3) { + return e3[1] > t3[1] && e3[1] < i3[1] || t3[1] === i3[1] && e3[1] === t3[1] && e3[0] >= t3[0] && e3[0] < i3[0] || t3[1] < i3[1] && e3[1] === i3[1] && e3[0] < i3[0] || t3[1] < i3[1] && e3[1] === t3[1] && e3[0] >= t3[0]; + } + _selectWordAtCursor(e3, t3) { + var _a, _b; + const i3 = (_b = (_a = this._linkifier.currentLink) == null ? void 0 : _a.link) == null ? void 0 : _b.range; + if (i3) return this._model.selectionStart = [i3.start.x - 1, i3.start.y - 1], this._model.selectionStartLength = (0, _.getRangeLength)(i3, this._bufferService.cols), this._model.selectionEnd = void 0, true; + const s3 = this._getMouseBufferCoords(e3); + return !!s3 && (this._selectWordAt(s3, t3), this._model.selectionEnd = void 0, true); + } + selectAll() { + this._model.isSelectAllActive = true, this.refresh(), this._onSelectionChange.fire(); + } + selectLines(e3, t3) { + this._model.clearSelection(), e3 = Math.max(e3, 0), t3 = Math.min(t3, this._bufferService.buffer.lines.length - 1), this._model.selectionStart = [0, e3], this._model.selectionEnd = [this._bufferService.cols, t3], this.refresh(), this._onSelectionChange.fire(); + } + _handleTrim(e3) { + this._model.handleTrim(e3) && this.refresh(); + } + _getMouseBufferCoords(e3) { + const t3 = this._mouseService.getCoords(e3, this._screenElement, this._bufferService.cols, this._bufferService.rows, true); + if (t3) return t3[0]--, t3[1]--, t3[1] += this._bufferService.buffer.ydisp, t3; + } + _getMouseEventScrollAmount(e3) { + let t3 = (0, n.getCoordsRelativeToElement)(this._coreBrowserService.window, e3, this._screenElement)[1]; + const i3 = this._renderService.dimensions.css.canvas.height; + return t3 >= 0 && t3 <= i3 ? 0 : (t3 > i3 && (t3 -= i3), t3 = Math.min(Math.max(t3, -50), 50), t3 /= 50, t3 / Math.abs(t3) + Math.round(14 * t3)); + } + shouldForceSelection(e3) { + return d.isMac ? e3.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection : e3.shiftKey; + } + handleMouseDown(e3) { + if (this._mouseDownTimeStamp = e3.timeStamp, (2 !== e3.button || !this.hasSelection) && 0 === e3.button) { + if (!this._enabled) { + if (!this.shouldForceSelection(e3)) return; + e3.stopPropagation(); + } + e3.preventDefault(), this._dragScrollAmount = 0, this._enabled && e3.shiftKey ? this._handleIncrementalClick(e3) : 1 === e3.detail ? this._handleSingleClick(e3) : 2 === e3.detail ? this._handleDoubleClick(e3) : 3 === e3.detail && this._handleTripleClick(e3), this._addMouseDownListeners(), this.refresh(true); + } + } + _addMouseDownListeners() { + this._screenElement.ownerDocument && (this._screenElement.ownerDocument.addEventListener("mousemove", this._mouseMoveListener), this._screenElement.ownerDocument.addEventListener("mouseup", this._mouseUpListener)), this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), 50); + } + _removeMouseDownListeners() { + this._screenElement.ownerDocument && (this._screenElement.ownerDocument.removeEventListener("mousemove", this._mouseMoveListener), this._screenElement.ownerDocument.removeEventListener("mouseup", this._mouseUpListener)), this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer), this._dragScrollIntervalTimer = void 0; + } + _handleIncrementalClick(e3) { + this._model.selectionStart && (this._model.selectionEnd = this._getMouseBufferCoords(e3)); + } + _handleSingleClick(e3) { + if (this._model.selectionStartLength = 0, this._model.isSelectAllActive = false, this._activeSelectionMode = this.shouldColumnSelect(e3) ? 3 : 0, this._model.selectionStart = this._getMouseBufferCoords(e3), !this._model.selectionStart) return; + this._model.selectionEnd = void 0; + const t3 = this._bufferService.buffer.lines.get(this._model.selectionStart[1]); + t3 && t3.length !== this._model.selectionStart[0] && 0 === t3.hasWidth(this._model.selectionStart[0]) && this._model.selectionStart[0]++; + } + _handleDoubleClick(e3) { + this._selectWordAtCursor(e3, true) && (this._activeSelectionMode = 1); + } + _handleTripleClick(e3) { + const t3 = this._getMouseBufferCoords(e3); + t3 && (this._activeSelectionMode = 2, this._selectLineAt(t3[1])); + } + shouldColumnSelect(e3) { + return e3.altKey && !(d.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection); + } + _handleMouseMove(e3) { + if (e3.stopImmediatePropagation(), !this._model.selectionStart) return; + const t3 = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null; + if (this._model.selectionEnd = this._getMouseBufferCoords(e3), !this._model.selectionEnd) return void this.refresh(true); + 2 === this._activeSelectionMode ? this._model.selectionEnd[1] < this._model.selectionStart[1] ? this._model.selectionEnd[0] = 0 : this._model.selectionEnd[0] = this._bufferService.cols : 1 === this._activeSelectionMode && this._selectToWordAt(this._model.selectionEnd), this._dragScrollAmount = this._getMouseEventScrollAmount(e3), 3 !== this._activeSelectionMode && (this._dragScrollAmount > 0 ? this._model.selectionEnd[0] = this._bufferService.cols : this._dragScrollAmount < 0 && (this._model.selectionEnd[0] = 0)); + const i3 = this._bufferService.buffer; + if (this._model.selectionEnd[1] < i3.lines.length) { + const e4 = i3.lines.get(this._model.selectionEnd[1]); + e4 && 0 === e4.hasWidth(this._model.selectionEnd[0]) && this._model.selectionEnd[0] < this._bufferService.cols && this._model.selectionEnd[0]++; + } + t3 && t3[0] === this._model.selectionEnd[0] && t3[1] === this._model.selectionEnd[1] || this.refresh(true); + } + _dragScroll() { + if (this._model.selectionEnd && this._model.selectionStart && this._dragScrollAmount) { + this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false }); + const e3 = this._bufferService.buffer; + this._dragScrollAmount > 0 ? (3 !== this._activeSelectionMode && (this._model.selectionEnd[0] = this._bufferService.cols), this._model.selectionEnd[1] = Math.min(e3.ydisp + this._bufferService.rows, e3.lines.length - 1)) : (3 !== this._activeSelectionMode && (this._model.selectionEnd[0] = 0), this._model.selectionEnd[1] = e3.ydisp), this.refresh(); + } + } + _handleMouseUp(e3) { + const t3 = e3.timeStamp - this._mouseDownTimeStamp; + if (this._removeMouseDownListeners(), this.selectionText.length <= 1 && t3 < 500 && e3.altKey && this._optionsService.rawOptions.altClickMovesCursor) { + if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) { + const t4 = this._mouseService.getCoords(e3, this._element, this._bufferService.cols, this._bufferService.rows, false); + if (t4 && void 0 !== t4[0] && void 0 !== t4[1]) { + const e4 = (0, o.moveToCellSequence)(t4[0] - 1, t4[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys); + this._coreService.triggerDataEvent(e4, true); + } + } + } else this._fireEventIfSelectionChanged(); + } + _fireEventIfSelectionChanged() { + const e3 = this._model.finalSelectionStart, t3 = this._model.finalSelectionEnd, i3 = !(!e3 || !t3 || e3[0] === t3[0] && e3[1] === t3[1]); + i3 ? e3 && t3 && (this._oldSelectionStart && this._oldSelectionEnd && e3[0] === this._oldSelectionStart[0] && e3[1] === this._oldSelectionStart[1] && t3[0] === this._oldSelectionEnd[0] && t3[1] === this._oldSelectionEnd[1] || this._fireOnSelectionChange(e3, t3, i3)) : this._oldHasSelection && this._fireOnSelectionChange(e3, t3, i3); + } + _fireOnSelectionChange(e3, t3, i3) { + this._oldSelectionStart = e3, this._oldSelectionEnd = t3, this._oldHasSelection = i3, this._onSelectionChange.fire(); + } + _handleBufferActivate(e3) { + this.clearSelection(), this._trimListener.dispose(), this._trimListener = e3.activeBuffer.lines.onTrim((e4) => this._handleTrim(e4)); + } + _convertViewportColToCharacterIndex(e3, t3) { + let i3 = t3; + for (let s3 = 0; t3 >= s3; s3++) { + const r2 = e3.loadCell(s3, this._workCell).getChars().length; + 0 === this._workCell.getWidth() ? i3-- : r2 > 1 && t3 !== s3 && (i3 += r2 - 1); + } + return i3; + } + setSelection(e3, t3, i3) { + this._model.clearSelection(), this._removeMouseDownListeners(), this._model.selectionStart = [e3, t3], this._model.selectionStartLength = i3, this.refresh(), this._fireEventIfSelectionChanged(); + } + rightClickSelect(e3) { + this._isClickInSelection(e3) || (this._selectWordAtCursor(e3, false) && this.refresh(true), this._fireEventIfSelectionChanged()); + } + _getWordAt(e3, t3, i3 = true, s3 = true) { + if (e3[0] >= this._bufferService.cols) return; + const r2 = this._bufferService.buffer, n2 = r2.lines.get(e3[1]); + if (!n2) return; + const o2 = r2.translateBufferLineToString(e3[1], false); + let a2 = this._convertViewportColToCharacterIndex(n2, e3[0]), h2 = a2; + const c2 = e3[0] - a2; + let l2 = 0, d2 = 0, _2 = 0, u2 = 0; + if (" " === o2.charAt(a2)) { + for (; a2 > 0 && " " === o2.charAt(a2 - 1); ) a2--; + for (; h2 < o2.length && " " === o2.charAt(h2 + 1); ) h2++; + } else { + let t4 = e3[0], i4 = e3[0]; + 0 === n2.getWidth(t4) && (l2++, t4--), 2 === n2.getWidth(i4) && (d2++, i4++); + const s4 = n2.getString(i4).length; + for (s4 > 1 && (u2 += s4 - 1, h2 += s4 - 1); t4 > 0 && a2 > 0 && !this._isCharWordSeparator(n2.loadCell(t4 - 1, this._workCell)); ) { + n2.loadCell(t4 - 1, this._workCell); + const e4 = this._workCell.getChars().length; + 0 === this._workCell.getWidth() ? (l2++, t4--) : e4 > 1 && (_2 += e4 - 1, a2 -= e4 - 1), a2--, t4--; + } + for (; i4 < n2.length && h2 + 1 < o2.length && !this._isCharWordSeparator(n2.loadCell(i4 + 1, this._workCell)); ) { + n2.loadCell(i4 + 1, this._workCell); + const e4 = this._workCell.getChars().length; + 2 === this._workCell.getWidth() ? (d2++, i4++) : e4 > 1 && (u2 += e4 - 1, h2 += e4 - 1), h2++, i4++; + } + } + h2++; + let f2 = a2 + c2 - l2 + _2, v2 = Math.min(this._bufferService.cols, h2 - a2 + l2 + d2 - _2 - u2); + if (t3 || "" !== o2.slice(a2, h2).trim()) { + if (i3 && 0 === f2 && 32 !== n2.getCodePoint(0)) { + const t4 = r2.lines.get(e3[1] - 1); + if (t4 && n2.isWrapped && 32 !== t4.getCodePoint(this._bufferService.cols - 1)) { + const t5 = this._getWordAt([this._bufferService.cols - 1, e3[1] - 1], false, true, false); + if (t5) { + const e4 = this._bufferService.cols - t5.start; + f2 -= e4, v2 += e4; + } + } + } + if (s3 && f2 + v2 === this._bufferService.cols && 32 !== n2.getCodePoint(this._bufferService.cols - 1)) { + const t4 = r2.lines.get(e3[1] + 1); + if ((t4 == null ? void 0 : t4.isWrapped) && 32 !== t4.getCodePoint(0)) { + const t5 = this._getWordAt([0, e3[1] + 1], false, false, true); + t5 && (v2 += t5.length); + } + } + return { start: f2, length: v2 }; + } + } + _selectWordAt(e3, t3) { + const i3 = this._getWordAt(e3, t3); + if (i3) { + for (; i3.start < 0; ) i3.start += this._bufferService.cols, e3[1]--; + this._model.selectionStart = [i3.start, e3[1]], this._model.selectionStartLength = i3.length; + } + } + _selectToWordAt(e3) { + const t3 = this._getWordAt(e3, true); + if (t3) { + let i3 = e3[1]; + for (; t3.start < 0; ) t3.start += this._bufferService.cols, i3--; + if (!this._model.areSelectionValuesReversed()) for (; t3.start + t3.length > this._bufferService.cols; ) t3.length -= this._bufferService.cols, i3++; + this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? t3.start : t3.start + t3.length, i3]; + } + } + _isCharWordSeparator(e3) { + return 0 !== e3.getWidth() && this._optionsService.rawOptions.wordSeparator.indexOf(e3.getChars()) >= 0; + } + _selectLineAt(e3) { + const t3 = this._bufferService.buffer.getWrappedRangeForLine(e3), i3 = { start: { x: 0, y: t3.first }, end: { x: this._bufferService.cols - 1, y: t3.last } }; + this._model.selectionStart = [0, t3.first], this._model.selectionEnd = void 0, this._model.selectionStartLength = (0, _.getRangeLength)(i3, this._bufferService.cols); + } + }; + t2.SelectionService = g = s2([r(3, f.IBufferService), r(4, f.ICoreService), r(5, h.IMouseService), r(6, f.IOptionsService), r(7, h.IRenderService), r(8, h.ICoreBrowserService)], g); + }, 4725: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ILinkProviderService = t2.IThemeService = t2.ICharacterJoinerService = t2.ISelectionService = t2.IRenderService = t2.IMouseService = t2.ICoreBrowserService = t2.ICharSizeService = void 0; + const s2 = i2(8343); + t2.ICharSizeService = (0, s2.createDecorator)("CharSizeService"), t2.ICoreBrowserService = (0, s2.createDecorator)("CoreBrowserService"), t2.IMouseService = (0, s2.createDecorator)("MouseService"), t2.IRenderService = (0, s2.createDecorator)("RenderService"), t2.ISelectionService = (0, s2.createDecorator)("SelectionService"), t2.ICharacterJoinerService = (0, s2.createDecorator)("CharacterJoinerService"), t2.IThemeService = (0, s2.createDecorator)("ThemeService"), t2.ILinkProviderService = (0, s2.createDecorator)("LinkProviderService"); + }, 6731: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.ThemeService = t2.DEFAULT_ANSI_COLORS = void 0; + const n = i2(7239), o = i2(8055), a = i2(8460), h = i2(844), c = i2(2585), l = o.css.toColor("#ffffff"), d = o.css.toColor("#000000"), _ = o.css.toColor("#ffffff"), u = o.css.toColor("#000000"), f = { css: "rgba(255, 255, 255, 0.3)", rgba: 4294967117 }; + t2.DEFAULT_ANSI_COLORS = Object.freeze((() => { + const e3 = [o.css.toColor("#2e3436"), o.css.toColor("#cc0000"), o.css.toColor("#4e9a06"), o.css.toColor("#c4a000"), o.css.toColor("#3465a4"), o.css.toColor("#75507b"), o.css.toColor("#06989a"), o.css.toColor("#d3d7cf"), o.css.toColor("#555753"), o.css.toColor("#ef2929"), o.css.toColor("#8ae234"), o.css.toColor("#fce94f"), o.css.toColor("#729fcf"), o.css.toColor("#ad7fa8"), o.css.toColor("#34e2e2"), o.css.toColor("#eeeeec")], t3 = [0, 95, 135, 175, 215, 255]; + for (let i3 = 0; i3 < 216; i3++) { + const s3 = t3[i3 / 36 % 6 | 0], r2 = t3[i3 / 6 % 6 | 0], n2 = t3[i3 % 6]; + e3.push({ css: o.channels.toCss(s3, r2, n2), rgba: o.channels.toRgba(s3, r2, n2) }); + } + for (let t4 = 0; t4 < 24; t4++) { + const i3 = 8 + 10 * t4; + e3.push({ css: o.channels.toCss(i3, i3, i3), rgba: o.channels.toRgba(i3, i3, i3) }); + } + return e3; + })()); + let v = t2.ThemeService = class extends h.Disposable { + get colors() { + return this._colors; + } + constructor(e3) { + super(), this._optionsService = e3, this._contrastCache = new n.ColorContrastCache(), this._halfContrastCache = new n.ColorContrastCache(), this._onChangeColors = this.register(new a.EventEmitter()), this.onChangeColors = this._onChangeColors.event, this._colors = { foreground: l, background: d, cursor: _, cursorAccent: u, selectionForeground: void 0, selectionBackgroundTransparent: f, selectionBackgroundOpaque: o.color.blend(d, f), selectionInactiveBackgroundTransparent: f, selectionInactiveBackgroundOpaque: o.color.blend(d, f), ansi: t2.DEFAULT_ANSI_COLORS.slice(), contrastCache: this._contrastCache, halfContrastCache: this._halfContrastCache }, this._updateRestoreColors(), this._setTheme(this._optionsService.rawOptions.theme), this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio", () => this._contrastCache.clear())), this.register(this._optionsService.onSpecificOptionChange("theme", () => this._setTheme(this._optionsService.rawOptions.theme))); + } + _setTheme(e3 = {}) { + const i3 = this._colors; + if (i3.foreground = p(e3.foreground, l), i3.background = p(e3.background, d), i3.cursor = p(e3.cursor, _), i3.cursorAccent = p(e3.cursorAccent, u), i3.selectionBackgroundTransparent = p(e3.selectionBackground, f), i3.selectionBackgroundOpaque = o.color.blend(i3.background, i3.selectionBackgroundTransparent), i3.selectionInactiveBackgroundTransparent = p(e3.selectionInactiveBackground, i3.selectionBackgroundTransparent), i3.selectionInactiveBackgroundOpaque = o.color.blend(i3.background, i3.selectionInactiveBackgroundTransparent), i3.selectionForeground = e3.selectionForeground ? p(e3.selectionForeground, o.NULL_COLOR) : void 0, i3.selectionForeground === o.NULL_COLOR && (i3.selectionForeground = void 0), o.color.isOpaque(i3.selectionBackgroundTransparent)) { + const e4 = 0.3; + i3.selectionBackgroundTransparent = o.color.opacity(i3.selectionBackgroundTransparent, e4); + } + if (o.color.isOpaque(i3.selectionInactiveBackgroundTransparent)) { + const e4 = 0.3; + i3.selectionInactiveBackgroundTransparent = o.color.opacity(i3.selectionInactiveBackgroundTransparent, e4); + } + if (i3.ansi = t2.DEFAULT_ANSI_COLORS.slice(), i3.ansi[0] = p(e3.black, t2.DEFAULT_ANSI_COLORS[0]), i3.ansi[1] = p(e3.red, t2.DEFAULT_ANSI_COLORS[1]), i3.ansi[2] = p(e3.green, t2.DEFAULT_ANSI_COLORS[2]), i3.ansi[3] = p(e3.yellow, t2.DEFAULT_ANSI_COLORS[3]), i3.ansi[4] = p(e3.blue, t2.DEFAULT_ANSI_COLORS[4]), i3.ansi[5] = p(e3.magenta, t2.DEFAULT_ANSI_COLORS[5]), i3.ansi[6] = p(e3.cyan, t2.DEFAULT_ANSI_COLORS[6]), i3.ansi[7] = p(e3.white, t2.DEFAULT_ANSI_COLORS[7]), i3.ansi[8] = p(e3.brightBlack, t2.DEFAULT_ANSI_COLORS[8]), i3.ansi[9] = p(e3.brightRed, t2.DEFAULT_ANSI_COLORS[9]), i3.ansi[10] = p(e3.brightGreen, t2.DEFAULT_ANSI_COLORS[10]), i3.ansi[11] = p(e3.brightYellow, t2.DEFAULT_ANSI_COLORS[11]), i3.ansi[12] = p(e3.brightBlue, t2.DEFAULT_ANSI_COLORS[12]), i3.ansi[13] = p(e3.brightMagenta, t2.DEFAULT_ANSI_COLORS[13]), i3.ansi[14] = p(e3.brightCyan, t2.DEFAULT_ANSI_COLORS[14]), i3.ansi[15] = p(e3.brightWhite, t2.DEFAULT_ANSI_COLORS[15]), e3.extendedAnsi) { + const s3 = Math.min(i3.ansi.length - 16, e3.extendedAnsi.length); + for (let r2 = 0; r2 < s3; r2++) i3.ansi[r2 + 16] = p(e3.extendedAnsi[r2], t2.DEFAULT_ANSI_COLORS[r2 + 16]); + } + this._contrastCache.clear(), this._halfContrastCache.clear(), this._updateRestoreColors(), this._onChangeColors.fire(this.colors); + } + restoreColor(e3) { + this._restoreColor(e3), this._onChangeColors.fire(this.colors); + } + _restoreColor(e3) { + if (void 0 !== e3) switch (e3) { + case 256: + this._colors.foreground = this._restoreColors.foreground; + break; + case 257: + this._colors.background = this._restoreColors.background; + break; + case 258: + this._colors.cursor = this._restoreColors.cursor; + break; + default: + this._colors.ansi[e3] = this._restoreColors.ansi[e3]; + } + else for (let e4 = 0; e4 < this._restoreColors.ansi.length; ++e4) this._colors.ansi[e4] = this._restoreColors.ansi[e4]; + } + modifyColors(e3) { + e3(this._colors), this._onChangeColors.fire(this.colors); + } + _updateRestoreColors() { + this._restoreColors = { foreground: this._colors.foreground, background: this._colors.background, cursor: this._colors.cursor, ansi: this._colors.ansi.slice() }; + } + }; + function p(e3, t3) { + if (void 0 !== e3) try { + return o.css.toColor(e3); + } catch { + } + return t3; + } + t2.ThemeService = v = s2([r(0, c.IOptionsService)], v); + }, 6349: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CircularList = void 0; + const s2 = i2(8460), r = i2(844); + class n extends r.Disposable { + constructor(e3) { + super(), this._maxLength = e3, this.onDeleteEmitter = this.register(new s2.EventEmitter()), this.onDelete = this.onDeleteEmitter.event, this.onInsertEmitter = this.register(new s2.EventEmitter()), this.onInsert = this.onInsertEmitter.event, this.onTrimEmitter = this.register(new s2.EventEmitter()), this.onTrim = this.onTrimEmitter.event, this._array = new Array(this._maxLength), this._startIndex = 0, this._length = 0; + } + get maxLength() { + return this._maxLength; + } + set maxLength(e3) { + if (this._maxLength === e3) return; + const t3 = new Array(e3); + for (let i3 = 0; i3 < Math.min(e3, this.length); i3++) t3[i3] = this._array[this._getCyclicIndex(i3)]; + this._array = t3, this._maxLength = e3, this._startIndex = 0; + } + get length() { + return this._length; + } + set length(e3) { + if (e3 > this._length) for (let t3 = this._length; t3 < e3; t3++) this._array[t3] = void 0; + this._length = e3; + } + get(e3) { + return this._array[this._getCyclicIndex(e3)]; + } + set(e3, t3) { + this._array[this._getCyclicIndex(e3)] = t3; + } + push(e3) { + this._array[this._getCyclicIndex(this._length)] = e3, this._length === this._maxLength ? (this._startIndex = ++this._startIndex % this._maxLength, this.onTrimEmitter.fire(1)) : this._length++; + } + recycle() { + if (this._length !== this._maxLength) throw new Error("Can only recycle when the buffer is full"); + return this._startIndex = ++this._startIndex % this._maxLength, this.onTrimEmitter.fire(1), this._array[this._getCyclicIndex(this._length - 1)]; + } + get isFull() { + return this._length === this._maxLength; + } + pop() { + return this._array[this._getCyclicIndex(this._length-- - 1)]; + } + splice(e3, t3, ...i3) { + if (t3) { + for (let i4 = e3; i4 < this._length - t3; i4++) this._array[this._getCyclicIndex(i4)] = this._array[this._getCyclicIndex(i4 + t3)]; + this._length -= t3, this.onDeleteEmitter.fire({ index: e3, amount: t3 }); + } + for (let t4 = this._length - 1; t4 >= e3; t4--) this._array[this._getCyclicIndex(t4 + i3.length)] = this._array[this._getCyclicIndex(t4)]; + for (let t4 = 0; t4 < i3.length; t4++) this._array[this._getCyclicIndex(e3 + t4)] = i3[t4]; + if (i3.length && this.onInsertEmitter.fire({ index: e3, amount: i3.length }), this._length + i3.length > this._maxLength) { + const e4 = this._length + i3.length - this._maxLength; + this._startIndex += e4, this._length = this._maxLength, this.onTrimEmitter.fire(e4); + } else this._length += i3.length; + } + trimStart(e3) { + e3 > this._length && (e3 = this._length), this._startIndex += e3, this._length -= e3, this.onTrimEmitter.fire(e3); + } + shiftElements(e3, t3, i3) { + if (!(t3 <= 0)) { + if (e3 < 0 || e3 >= this._length) throw new Error("start argument out of range"); + if (e3 + i3 < 0) throw new Error("Cannot shift elements in list beyond index 0"); + if (i3 > 0) { + for (let s4 = t3 - 1; s4 >= 0; s4--) this.set(e3 + s4 + i3, this.get(e3 + s4)); + const s3 = e3 + t3 + i3 - this._length; + if (s3 > 0) for (this._length += s3; this._length > this._maxLength; ) this._length--, this._startIndex++, this.onTrimEmitter.fire(1); + } else for (let s3 = 0; s3 < t3; s3++) this.set(e3 + s3 + i3, this.get(e3 + s3)); + } + } + _getCyclicIndex(e3) { + return (this._startIndex + e3) % this._maxLength; + } + } + t2.CircularList = n; + }, 1439: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.clone = void 0, t2.clone = function e3(t3, i2 = 5) { + if ("object" != typeof t3) return t3; + const s2 = Array.isArray(t3) ? [] : {}; + for (const r in t3) s2[r] = i2 <= 1 ? t3[r] : t3[r] && e3(t3[r], i2 - 1); + return s2; + }; + }, 8055: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.contrastRatio = t2.toPaddedHex = t2.rgba = t2.rgb = t2.css = t2.color = t2.channels = t2.NULL_COLOR = void 0; + let i2 = 0, s2 = 0, r = 0, n = 0; + var o, a, h, c, l; + function d(e3) { + const t3 = e3.toString(16); + return t3.length < 2 ? "0" + t3 : t3; + } + function _(e3, t3) { + return e3 < t3 ? (t3 + 0.05) / (e3 + 0.05) : (e3 + 0.05) / (t3 + 0.05); + } + t2.NULL_COLOR = { css: "#00000000", rgba: 0 }, function(e3) { + e3.toCss = function(e4, t3, i3, s3) { + return void 0 !== s3 ? `#${d(e4)}${d(t3)}${d(i3)}${d(s3)}` : `#${d(e4)}${d(t3)}${d(i3)}`; + }, e3.toRgba = function(e4, t3, i3, s3 = 255) { + return (e4 << 24 | t3 << 16 | i3 << 8 | s3) >>> 0; + }, e3.toColor = function(t3, i3, s3, r2) { + return { css: e3.toCss(t3, i3, s3, r2), rgba: e3.toRgba(t3, i3, s3, r2) }; + }; + }(o || (t2.channels = o = {})), function(e3) { + function t3(e4, t4) { + return n = Math.round(255 * t4), [i2, s2, r] = l.toChannels(e4.rgba), { css: o.toCss(i2, s2, r, n), rgba: o.toRgba(i2, s2, r, n) }; + } + e3.blend = function(e4, t4) { + if (n = (255 & t4.rgba) / 255, 1 === n) return { css: t4.css, rgba: t4.rgba }; + const a2 = t4.rgba >> 24 & 255, h2 = t4.rgba >> 16 & 255, c2 = t4.rgba >> 8 & 255, l2 = e4.rgba >> 24 & 255, d2 = e4.rgba >> 16 & 255, _2 = e4.rgba >> 8 & 255; + return i2 = l2 + Math.round((a2 - l2) * n), s2 = d2 + Math.round((h2 - d2) * n), r = _2 + Math.round((c2 - _2) * n), { css: o.toCss(i2, s2, r), rgba: o.toRgba(i2, s2, r) }; + }, e3.isOpaque = function(e4) { + return 255 == (255 & e4.rgba); + }, e3.ensureContrastRatio = function(e4, t4, i3) { + const s3 = l.ensureContrastRatio(e4.rgba, t4.rgba, i3); + if (s3) return o.toColor(s3 >> 24 & 255, s3 >> 16 & 255, s3 >> 8 & 255); + }, e3.opaque = function(e4) { + const t4 = (255 | e4.rgba) >>> 0; + return [i2, s2, r] = l.toChannels(t4), { css: o.toCss(i2, s2, r), rgba: t4 }; + }, e3.opacity = t3, e3.multiplyOpacity = function(e4, i3) { + return n = 255 & e4.rgba, t3(e4, n * i3 / 255); + }, e3.toColorRGB = function(e4) { + return [e4.rgba >> 24 & 255, e4.rgba >> 16 & 255, e4.rgba >> 8 & 255]; + }; + }(a || (t2.color = a = {})), function(e3) { + let t3, a2; + try { + const e4 = document.createElement("canvas"); + e4.width = 1, e4.height = 1; + const i3 = e4.getContext("2d", { willReadFrequently: true }); + i3 && (t3 = i3, t3.globalCompositeOperation = "copy", a2 = t3.createLinearGradient(0, 0, 1, 1)); + } catch { + } + e3.toColor = function(e4) { + if (e4.match(/#[\da-f]{3,8}/i)) switch (e4.length) { + case 4: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), o.toColor(i2, s2, r); + case 5: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), n = parseInt(e4.slice(4, 5).repeat(2), 16), o.toColor(i2, s2, r, n); + case 7: + return { css: e4, rgba: (parseInt(e4.slice(1), 16) << 8 | 255) >>> 0 }; + case 9: + return { css: e4, rgba: parseInt(e4.slice(1), 16) >>> 0 }; + } + const h2 = e4.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/); + if (h2) return i2 = parseInt(h2[1]), s2 = parseInt(h2[2]), r = parseInt(h2[3]), n = Math.round(255 * (void 0 === h2[5] ? 1 : parseFloat(h2[5]))), o.toColor(i2, s2, r, n); + if (!t3 || !a2) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillStyle = a2, t3.fillStyle = e4, "string" != typeof t3.fillStyle) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillRect(0, 0, 1, 1), [i2, s2, r, n] = t3.getImageData(0, 0, 1, 1).data, 255 !== n) throw new Error("css.toColor: Unsupported css format"); + return { rgba: o.toRgba(i2, s2, r, n), css: e4 }; + }; + }(h || (t2.css = h = {})), function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 / 255, r2 = t4 / 255, n2 = i3 / 255; + return 0.2126 * (s3 <= 0.03928 ? s3 / 12.92 : Math.pow((s3 + 0.055) / 1.055, 2.4)) + 0.7152 * (r2 <= 0.03928 ? r2 / 12.92 : Math.pow((r2 + 0.055) / 1.055, 2.4)) + 0.0722 * (n2 <= 0.03928 ? n2 / 12.92 : Math.pow((n2 + 0.055) / 1.055, 2.4)); + } + e3.relativeLuminance = function(e4) { + return t3(e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4); + }, e3.relativeLuminance2 = t3; + }(c || (t2.rgb = c = {})), function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, n2 = e4 >> 8 & 255; + let o2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + for (; l2 < i3 && (o2 > 0 || a3 > 0 || h2 > 0); ) o2 -= Math.max(0, Math.ceil(0.1 * o2)), a3 -= Math.max(0, Math.ceil(0.1 * a3)), h2 -= Math.max(0, Math.ceil(0.1 * h2)), l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + return (o2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + function a2(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, n2 = e4 >> 8 & 255; + let o2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + for (; l2 < i3 && (o2 < 255 || a3 < 255 || h2 < 255); ) o2 = Math.min(255, o2 + Math.ceil(0.1 * (255 - o2))), a3 = Math.min(255, a3 + Math.ceil(0.1 * (255 - a3))), h2 = Math.min(255, h2 + Math.ceil(0.1 * (255 - h2))), l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + return (o2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + e3.blend = function(e4, t4) { + if (n = (255 & t4) / 255, 1 === n) return t4; + const a3 = t4 >> 24 & 255, h2 = t4 >> 16 & 255, c2 = t4 >> 8 & 255, l2 = e4 >> 24 & 255, d2 = e4 >> 16 & 255, _2 = e4 >> 8 & 255; + return i2 = l2 + Math.round((a3 - l2) * n), s2 = d2 + Math.round((h2 - d2) * n), r = _2 + Math.round((c2 - _2) * n), o.toRgba(i2, s2, r); + }, e3.ensureContrastRatio = function(e4, i3, s3) { + const r2 = c.relativeLuminance(e4 >> 8), n2 = c.relativeLuminance(i3 >> 8); + if (_(r2, n2) < s3) { + if (n2 < r2) { + const n3 = t3(e4, i3, s3), o3 = _(r2, c.relativeLuminance(n3 >> 8)); + if (o3 < s3) { + const t4 = a2(e4, i3, s3); + return o3 > _(r2, c.relativeLuminance(t4 >> 8)) ? n3 : t4; + } + return n3; + } + const o2 = a2(e4, i3, s3), h2 = _(r2, c.relativeLuminance(o2 >> 8)); + if (h2 < s3) { + const n3 = t3(e4, i3, s3); + return h2 > _(r2, c.relativeLuminance(n3 >> 8)) ? o2 : n3; + } + return o2; + } + }, e3.reduceLuminance = t3, e3.increaseLuminance = a2, e3.toChannels = function(e4) { + return [e4 >> 24 & 255, e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4]; + }; + }(l || (t2.rgba = l = {})), t2.toPaddedHex = d, t2.contrastRatio = _; + }, 8969: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreTerminal = void 0; + const s2 = i2(844), r = i2(2585), n = i2(4348), o = i2(7866), a = i2(744), h = i2(7302), c = i2(6975), l = i2(8460), d = i2(1753), _ = i2(1480), u = i2(7994), f = i2(9282), v = i2(5435), p = i2(5981), g = i2(2660); + let m = false; + class S extends s2.Disposable { + get onScroll() { + return this._onScrollApi || (this._onScrollApi = this.register(new l.EventEmitter()), this._onScroll.event((e3) => { + var _a; + (_a = this._onScrollApi) == null ? void 0 : _a.fire(e3.position); + })), this._onScrollApi.event; + } + get cols() { + return this._bufferService.cols; + } + get rows() { + return this._bufferService.rows; + } + get buffers() { + return this._bufferService.buffers; + } + get options() { + return this.optionsService.options; + } + set options(e3) { + for (const t3 in e3) this.optionsService.options[t3] = e3[t3]; + } + constructor(e3) { + super(), this._windowsWrappingHeuristics = this.register(new s2.MutableDisposable()), this._onBinary = this.register(new l.EventEmitter()), this.onBinary = this._onBinary.event, this._onData = this.register(new l.EventEmitter()), this.onData = this._onData.event, this._onLineFeed = this.register(new l.EventEmitter()), this.onLineFeed = this._onLineFeed.event, this._onResize = this.register(new l.EventEmitter()), this.onResize = this._onResize.event, this._onWriteParsed = this.register(new l.EventEmitter()), this.onWriteParsed = this._onWriteParsed.event, this._onScroll = this.register(new l.EventEmitter()), this._instantiationService = new n.InstantiationService(), this.optionsService = this.register(new h.OptionsService(e3)), this._instantiationService.setService(r.IOptionsService, this.optionsService), this._bufferService = this.register(this._instantiationService.createInstance(a.BufferService)), this._instantiationService.setService(r.IBufferService, this._bufferService), this._logService = this.register(this._instantiationService.createInstance(o.LogService)), this._instantiationService.setService(r.ILogService, this._logService), this.coreService = this.register(this._instantiationService.createInstance(c.CoreService)), this._instantiationService.setService(r.ICoreService, this.coreService), this.coreMouseService = this.register(this._instantiationService.createInstance(d.CoreMouseService)), this._instantiationService.setService(r.ICoreMouseService, this.coreMouseService), this.unicodeService = this.register(this._instantiationService.createInstance(_.UnicodeService)), this._instantiationService.setService(r.IUnicodeService, this.unicodeService), this._charsetService = this._instantiationService.createInstance(u.CharsetService), this._instantiationService.setService(r.ICharsetService, this._charsetService), this._oscLinkService = this._instantiationService.createInstance(g.OscLinkService), this._instantiationService.setService(r.IOscLinkService, this._oscLinkService), this._inputHandler = this.register(new v.InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService)), this.register((0, l.forwardEvent)(this._inputHandler.onLineFeed, this._onLineFeed)), this.register(this._inputHandler), this.register((0, l.forwardEvent)(this._bufferService.onResize, this._onResize)), this.register((0, l.forwardEvent)(this.coreService.onData, this._onData)), this.register((0, l.forwardEvent)(this.coreService.onBinary, this._onBinary)), this.register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom())), this.register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput())), this.register(this.optionsService.onMultipleOptionChange(["windowsMode", "windowsPty"], () => this._handleWindowsPtyOptionChange())), this.register(this._bufferService.onScroll((e4) => { + this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: 0 }), this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom); + })), this.register(this._inputHandler.onScroll((e4) => { + this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: 0 }), this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom); + })), this._writeBuffer = this.register(new p.WriteBuffer((e4, t3) => this._inputHandler.parse(e4, t3))), this.register((0, l.forwardEvent)(this._writeBuffer.onWriteParsed, this._onWriteParsed)); + } + write(e3, t3) { + this._writeBuffer.write(e3, t3); + } + writeSync(e3, t3) { + this._logService.logLevel <= r.LogLevelEnum.WARN && !m && (this._logService.warn("writeSync is unreliable and will be removed soon."), m = true), this._writeBuffer.writeSync(e3, t3); + } + input(e3, t3 = true) { + this.coreService.triggerDataEvent(e3, t3); + } + resize(e3, t3) { + isNaN(e3) || isNaN(t3) || (e3 = Math.max(e3, a.MINIMUM_COLS), t3 = Math.max(t3, a.MINIMUM_ROWS), this._bufferService.resize(e3, t3)); + } + scroll(e3, t3 = false) { + this._bufferService.scroll(e3, t3); + } + scrollLines(e3, t3, i3) { + this._bufferService.scrollLines(e3, t3, i3); + } + scrollPages(e3) { + this.scrollLines(e3 * (this.rows - 1)); + } + scrollToTop() { + this.scrollLines(-this._bufferService.buffer.ydisp); + } + scrollToBottom() { + this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp); + } + scrollToLine(e3) { + const t3 = e3 - this._bufferService.buffer.ydisp; + 0 !== t3 && this.scrollLines(t3); + } + registerEscHandler(e3, t3) { + return this._inputHandler.registerEscHandler(e3, t3); + } + registerDcsHandler(e3, t3) { + return this._inputHandler.registerDcsHandler(e3, t3); + } + registerCsiHandler(e3, t3) { + return this._inputHandler.registerCsiHandler(e3, t3); + } + registerOscHandler(e3, t3) { + return this._inputHandler.registerOscHandler(e3, t3); + } + _setup() { + this._handleWindowsPtyOptionChange(); + } + reset() { + this._inputHandler.reset(), this._bufferService.reset(), this._charsetService.reset(), this.coreService.reset(), this.coreMouseService.reset(); + } + _handleWindowsPtyOptionChange() { + let e3 = false; + const t3 = this.optionsService.rawOptions.windowsPty; + t3 && void 0 !== t3.buildNumber && void 0 !== t3.buildNumber ? e3 = !!("conpty" === t3.backend && t3.buildNumber < 21376) : this.optionsService.rawOptions.windowsMode && (e3 = true), e3 ? this._enableWindowsWrappingHeuristics() : this._windowsWrappingHeuristics.clear(); + } + _enableWindowsWrappingHeuristics() { + if (!this._windowsWrappingHeuristics.value) { + const e3 = []; + e3.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null, this._bufferService))), e3.push(this.registerCsiHandler({ final: "H" }, () => ((0, f.updateWindowsModeWrappedState)(this._bufferService), false))), this._windowsWrappingHeuristics.value = (0, s2.toDisposable)(() => { + for (const t3 of e3) t3.dispose(); + }); + } + } + } + t2.CoreTerminal = S; + }, 8460: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let s2 = 0; s2 < i2.length; s2++) i2[s2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3((e4) => t3.fire(e4)); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3((e4) => t3(e4)); + }; + }, 5435: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.InputHandler = t2.WindowsOptionsReportType = void 0; + const n = i2(2584), o = i2(7116), a = i2(2015), h = i2(844), c = i2(482), l = i2(8437), d = i2(8460), _ = i2(643), u = i2(511), f = i2(3734), v = i2(2585), p = i2(1480), g = i2(6242), m = i2(6351), S = i2(5941), C = { "(": 0, ")": 1, "*": 2, "+": 3, "-": 1, ".": 2 }, b = 131072; + function w(e3, t3) { + if (e3 > 24) return t3.setWinLines || false; + switch (e3) { + case 1: + return !!t3.restoreWin; + case 2: + return !!t3.minimizeWin; + case 3: + return !!t3.setWinPosition; + case 4: + return !!t3.setWinSizePixels; + case 5: + return !!t3.raiseWin; + case 6: + return !!t3.lowerWin; + case 7: + return !!t3.refreshWin; + case 8: + return !!t3.setWinSizeChars; + case 9: + return !!t3.maximizeWin; + case 10: + return !!t3.fullscreenWin; + case 11: + return !!t3.getWinState; + case 13: + return !!t3.getWinPosition; + case 14: + return !!t3.getWinSizePixels; + case 15: + return !!t3.getScreenSizePixels; + case 16: + return !!t3.getCellSizePixels; + case 18: + return !!t3.getWinSizeChars; + case 19: + return !!t3.getScreenSizeChars; + case 20: + return !!t3.getIconTitle; + case 21: + return !!t3.getWinTitle; + case 22: + return !!t3.pushTitle; + case 23: + return !!t3.popTitle; + case 24: + return !!t3.setWinLines; + } + return false; + } + var y; + !function(e3) { + e3[e3.GET_WIN_SIZE_PIXELS = 0] = "GET_WIN_SIZE_PIXELS", e3[e3.GET_CELL_SIZE_PIXELS = 1] = "GET_CELL_SIZE_PIXELS"; + }(y || (t2.WindowsOptionsReportType = y = {})); + let E = 0; + class k extends h.Disposable { + getAttrData() { + return this._curAttrData; + } + constructor(e3, t3, i3, s3, r2, h2, _2, f2, v2 = new a.EscapeSequenceParser()) { + super(), this._bufferService = e3, this._charsetService = t3, this._coreService = i3, this._logService = s3, this._optionsService = r2, this._oscLinkService = h2, this._coreMouseService = _2, this._unicodeService = f2, this._parser = v2, this._parseBuffer = new Uint32Array(4096), this._stringDecoder = new c.StringToUtf32(), this._utf8Decoder = new c.Utf8ToUtf32(), this._workCell = new u.CellData(), this._windowTitle = "", this._iconName = "", this._windowTitleStack = [], this._iconNameStack = [], this._curAttrData = l.DEFAULT_ATTR_DATA.clone(), this._eraseAttrDataInternal = l.DEFAULT_ATTR_DATA.clone(), this._onRequestBell = this.register(new d.EventEmitter()), this.onRequestBell = this._onRequestBell.event, this._onRequestRefreshRows = this.register(new d.EventEmitter()), this.onRequestRefreshRows = this._onRequestRefreshRows.event, this._onRequestReset = this.register(new d.EventEmitter()), this.onRequestReset = this._onRequestReset.event, this._onRequestSendFocus = this.register(new d.EventEmitter()), this.onRequestSendFocus = this._onRequestSendFocus.event, this._onRequestSyncScrollBar = this.register(new d.EventEmitter()), this.onRequestSyncScrollBar = this._onRequestSyncScrollBar.event, this._onRequestWindowsOptionsReport = this.register(new d.EventEmitter()), this.onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event, this._onA11yChar = this.register(new d.EventEmitter()), this.onA11yChar = this._onA11yChar.event, this._onA11yTab = this.register(new d.EventEmitter()), this.onA11yTab = this._onA11yTab.event, this._onCursorMove = this.register(new d.EventEmitter()), this.onCursorMove = this._onCursorMove.event, this._onLineFeed = this.register(new d.EventEmitter()), this.onLineFeed = this._onLineFeed.event, this._onScroll = this.register(new d.EventEmitter()), this.onScroll = this._onScroll.event, this._onTitleChange = this.register(new d.EventEmitter()), this.onTitleChange = this._onTitleChange.event, this._onColor = this.register(new d.EventEmitter()), this.onColor = this._onColor.event, this._parseStack = { paused: false, cursorStartX: 0, cursorStartY: 0, decodedLength: 0, position: 0 }, this._specialColors = [256, 257, 258], this.register(this._parser), this._dirtyRowTracker = new L(this._bufferService), this._activeBuffer = this._bufferService.buffer, this.register(this._bufferService.buffers.onBufferActivate((e4) => this._activeBuffer = e4.activeBuffer)), this._parser.setCsiHandlerFallback((e4, t4) => { + this._logService.debug("Unknown CSI code: ", { identifier: this._parser.identToString(e4), params: t4.toArray() }); + }), this._parser.setEscHandlerFallback((e4) => { + this._logService.debug("Unknown ESC code: ", { identifier: this._parser.identToString(e4) }); + }), this._parser.setExecuteHandlerFallback((e4) => { + this._logService.debug("Unknown EXECUTE code: ", { code: e4 }); + }), this._parser.setOscHandlerFallback((e4, t4, i4) => { + this._logService.debug("Unknown OSC code: ", { identifier: e4, action: t4, data: i4 }); + }), this._parser.setDcsHandlerFallback((e4, t4, i4) => { + "HOOK" === t4 && (i4 = i4.toArray()), this._logService.debug("Unknown DCS code: ", { identifier: this._parser.identToString(e4), action: t4, payload: i4 }); + }), this._parser.setPrintHandler((e4, t4, i4) => this.print(e4, t4, i4)), this._parser.registerCsiHandler({ final: "@" }, (e4) => this.insertChars(e4)), this._parser.registerCsiHandler({ intermediates: " ", final: "@" }, (e4) => this.scrollLeft(e4)), this._parser.registerCsiHandler({ final: "A" }, (e4) => this.cursorUp(e4)), this._parser.registerCsiHandler({ intermediates: " ", final: "A" }, (e4) => this.scrollRight(e4)), this._parser.registerCsiHandler({ final: "B" }, (e4) => this.cursorDown(e4)), this._parser.registerCsiHandler({ final: "C" }, (e4) => this.cursorForward(e4)), this._parser.registerCsiHandler({ final: "D" }, (e4) => this.cursorBackward(e4)), this._parser.registerCsiHandler({ final: "E" }, (e4) => this.cursorNextLine(e4)), this._parser.registerCsiHandler({ final: "F" }, (e4) => this.cursorPrecedingLine(e4)), this._parser.registerCsiHandler({ final: "G" }, (e4) => this.cursorCharAbsolute(e4)), this._parser.registerCsiHandler({ final: "H" }, (e4) => this.cursorPosition(e4)), this._parser.registerCsiHandler({ final: "I" }, (e4) => this.cursorForwardTab(e4)), this._parser.registerCsiHandler({ final: "J" }, (e4) => this.eraseInDisplay(e4, false)), this._parser.registerCsiHandler({ prefix: "?", final: "J" }, (e4) => this.eraseInDisplay(e4, true)), this._parser.registerCsiHandler({ final: "K" }, (e4) => this.eraseInLine(e4, false)), this._parser.registerCsiHandler({ prefix: "?", final: "K" }, (e4) => this.eraseInLine(e4, true)), this._parser.registerCsiHandler({ final: "L" }, (e4) => this.insertLines(e4)), this._parser.registerCsiHandler({ final: "M" }, (e4) => this.deleteLines(e4)), this._parser.registerCsiHandler({ final: "P" }, (e4) => this.deleteChars(e4)), this._parser.registerCsiHandler({ final: "S" }, (e4) => this.scrollUp(e4)), this._parser.registerCsiHandler({ final: "T" }, (e4) => this.scrollDown(e4)), this._parser.registerCsiHandler({ final: "X" }, (e4) => this.eraseChars(e4)), this._parser.registerCsiHandler({ final: "Z" }, (e4) => this.cursorBackwardTab(e4)), this._parser.registerCsiHandler({ final: "`" }, (e4) => this.charPosAbsolute(e4)), this._parser.registerCsiHandler({ final: "a" }, (e4) => this.hPositionRelative(e4)), this._parser.registerCsiHandler({ final: "b" }, (e4) => this.repeatPrecedingCharacter(e4)), this._parser.registerCsiHandler({ final: "c" }, (e4) => this.sendDeviceAttributesPrimary(e4)), this._parser.registerCsiHandler({ prefix: ">", final: "c" }, (e4) => this.sendDeviceAttributesSecondary(e4)), this._parser.registerCsiHandler({ final: "d" }, (e4) => this.linePosAbsolute(e4)), this._parser.registerCsiHandler({ final: "e" }, (e4) => this.vPositionRelative(e4)), this._parser.registerCsiHandler({ final: "f" }, (e4) => this.hVPosition(e4)), this._parser.registerCsiHandler({ final: "g" }, (e4) => this.tabClear(e4)), this._parser.registerCsiHandler({ final: "h" }, (e4) => this.setMode(e4)), this._parser.registerCsiHandler({ prefix: "?", final: "h" }, (e4) => this.setModePrivate(e4)), this._parser.registerCsiHandler({ final: "l" }, (e4) => this.resetMode(e4)), this._parser.registerCsiHandler({ prefix: "?", final: "l" }, (e4) => this.resetModePrivate(e4)), this._parser.registerCsiHandler({ final: "m" }, (e4) => this.charAttributes(e4)), this._parser.registerCsiHandler({ final: "n" }, (e4) => this.deviceStatus(e4)), this._parser.registerCsiHandler({ prefix: "?", final: "n" }, (e4) => this.deviceStatusPrivate(e4)), this._parser.registerCsiHandler({ intermediates: "!", final: "p" }, (e4) => this.softReset(e4)), this._parser.registerCsiHandler({ intermediates: " ", final: "q" }, (e4) => this.setCursorStyle(e4)), this._parser.registerCsiHandler({ final: "r" }, (e4) => this.setScrollRegion(e4)), this._parser.registerCsiHandler({ final: "s" }, (e4) => this.saveCursor(e4)), this._parser.registerCsiHandler({ final: "t" }, (e4) => this.windowOptions(e4)), this._parser.registerCsiHandler({ final: "u" }, (e4) => this.restoreCursor(e4)), this._parser.registerCsiHandler({ intermediates: "'", final: "}" }, (e4) => this.insertColumns(e4)), this._parser.registerCsiHandler({ intermediates: "'", final: "~" }, (e4) => this.deleteColumns(e4)), this._parser.registerCsiHandler({ intermediates: '"', final: "q" }, (e4) => this.selectProtected(e4)), this._parser.registerCsiHandler({ intermediates: "$", final: "p" }, (e4) => this.requestMode(e4, true)), this._parser.registerCsiHandler({ prefix: "?", intermediates: "$", final: "p" }, (e4) => this.requestMode(e4, false)), this._parser.setExecuteHandler(n.C0.BEL, () => this.bell()), this._parser.setExecuteHandler(n.C0.LF, () => this.lineFeed()), this._parser.setExecuteHandler(n.C0.VT, () => this.lineFeed()), this._parser.setExecuteHandler(n.C0.FF, () => this.lineFeed()), this._parser.setExecuteHandler(n.C0.CR, () => this.carriageReturn()), this._parser.setExecuteHandler(n.C0.BS, () => this.backspace()), this._parser.setExecuteHandler(n.C0.HT, () => this.tab()), this._parser.setExecuteHandler(n.C0.SO, () => this.shiftOut()), this._parser.setExecuteHandler(n.C0.SI, () => this.shiftIn()), this._parser.setExecuteHandler(n.C1.IND, () => this.index()), this._parser.setExecuteHandler(n.C1.NEL, () => this.nextLine()), this._parser.setExecuteHandler(n.C1.HTS, () => this.tabSet()), this._parser.registerOscHandler(0, new g.OscHandler((e4) => (this.setTitle(e4), this.setIconName(e4), true))), this._parser.registerOscHandler(1, new g.OscHandler((e4) => this.setIconName(e4))), this._parser.registerOscHandler(2, new g.OscHandler((e4) => this.setTitle(e4))), this._parser.registerOscHandler(4, new g.OscHandler((e4) => this.setOrReportIndexedColor(e4))), this._parser.registerOscHandler(8, new g.OscHandler((e4) => this.setHyperlink(e4))), this._parser.registerOscHandler(10, new g.OscHandler((e4) => this.setOrReportFgColor(e4))), this._parser.registerOscHandler(11, new g.OscHandler((e4) => this.setOrReportBgColor(e4))), this._parser.registerOscHandler(12, new g.OscHandler((e4) => this.setOrReportCursorColor(e4))), this._parser.registerOscHandler(104, new g.OscHandler((e4) => this.restoreIndexedColor(e4))), this._parser.registerOscHandler(110, new g.OscHandler((e4) => this.restoreFgColor(e4))), this._parser.registerOscHandler(111, new g.OscHandler((e4) => this.restoreBgColor(e4))), this._parser.registerOscHandler(112, new g.OscHandler((e4) => this.restoreCursorColor(e4))), this._parser.registerEscHandler({ final: "7" }, () => this.saveCursor()), this._parser.registerEscHandler({ final: "8" }, () => this.restoreCursor()), this._parser.registerEscHandler({ final: "D" }, () => this.index()), this._parser.registerEscHandler({ final: "E" }, () => this.nextLine()), this._parser.registerEscHandler({ final: "H" }, () => this.tabSet()), this._parser.registerEscHandler({ final: "M" }, () => this.reverseIndex()), this._parser.registerEscHandler({ final: "=" }, () => this.keypadApplicationMode()), this._parser.registerEscHandler({ final: ">" }, () => this.keypadNumericMode()), this._parser.registerEscHandler({ final: "c" }, () => this.fullReset()), this._parser.registerEscHandler({ final: "n" }, () => this.setgLevel(2)), this._parser.registerEscHandler({ final: "o" }, () => this.setgLevel(3)), this._parser.registerEscHandler({ final: "|" }, () => this.setgLevel(3)), this._parser.registerEscHandler({ final: "}" }, () => this.setgLevel(2)), this._parser.registerEscHandler({ final: "~" }, () => this.setgLevel(1)), this._parser.registerEscHandler({ intermediates: "%", final: "@" }, () => this.selectDefaultCharset()), this._parser.registerEscHandler({ intermediates: "%", final: "G" }, () => this.selectDefaultCharset()); + for (const e4 in o.CHARSETS) this._parser.registerEscHandler({ intermediates: "(", final: e4 }, () => this.selectCharset("(" + e4)), this._parser.registerEscHandler({ intermediates: ")", final: e4 }, () => this.selectCharset(")" + e4)), this._parser.registerEscHandler({ intermediates: "*", final: e4 }, () => this.selectCharset("*" + e4)), this._parser.registerEscHandler({ intermediates: "+", final: e4 }, () => this.selectCharset("+" + e4)), this._parser.registerEscHandler({ intermediates: "-", final: e4 }, () => this.selectCharset("-" + e4)), this._parser.registerEscHandler({ intermediates: ".", final: e4 }, () => this.selectCharset("." + e4)), this._parser.registerEscHandler({ intermediates: "/", final: e4 }, () => this.selectCharset("/" + e4)); + this._parser.registerEscHandler({ intermediates: "#", final: "8" }, () => this.screenAlignmentPattern()), this._parser.setErrorHandler((e4) => (this._logService.error("Parsing error: ", e4), e4)), this._parser.registerDcsHandler({ intermediates: "$", final: "q" }, new m.DcsHandler((e4, t4) => this.requestStatusString(e4, t4))); + } + _preserveStack(e3, t3, i3, s3) { + this._parseStack.paused = true, this._parseStack.cursorStartX = e3, this._parseStack.cursorStartY = t3, this._parseStack.decodedLength = i3, this._parseStack.position = s3; + } + _logSlowResolvingAsync(e3) { + this._logService.logLevel <= v.LogLevelEnum.WARN && Promise.race([e3, new Promise((e4, t3) => setTimeout(() => t3("#SLOW_TIMEOUT"), 5e3))]).catch((e4) => { + if ("#SLOW_TIMEOUT" !== e4) throw e4; + console.warn("async parser handler taking longer than 5000 ms"); + }); + } + _getCurrentLinkId() { + return this._curAttrData.extended.urlId; + } + parse(e3, t3) { + let i3, s3 = this._activeBuffer.x, r2 = this._activeBuffer.y, n2 = 0; + const o2 = this._parseStack.paused; + if (o2) { + if (i3 = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, t3)) return this._logSlowResolvingAsync(i3), i3; + s3 = this._parseStack.cursorStartX, r2 = this._parseStack.cursorStartY, this._parseStack.paused = false, e3.length > b && (n2 = this._parseStack.position + b); + } + if (this._logService.logLevel <= v.LogLevelEnum.DEBUG && this._logService.debug("parsing data" + ("string" == typeof e3 ? ` "${e3}"` : ` "${Array.prototype.map.call(e3, (e4) => String.fromCharCode(e4)).join("")}"`), "string" == typeof e3 ? e3.split("").map((e4) => e4.charCodeAt(0)) : e3), this._parseBuffer.length < e3.length && this._parseBuffer.length < b && (this._parseBuffer = new Uint32Array(Math.min(e3.length, b))), o2 || this._dirtyRowTracker.clearRange(), e3.length > b) for (let t4 = n2; t4 < e3.length; t4 += b) { + const n3 = t4 + b < e3.length ? t4 + b : e3.length, o3 = "string" == typeof e3 ? this._stringDecoder.decode(e3.substring(t4, n3), this._parseBuffer) : this._utf8Decoder.decode(e3.subarray(t4, n3), this._parseBuffer); + if (i3 = this._parser.parse(this._parseBuffer, o3)) return this._preserveStack(s3, r2, o3, t4), this._logSlowResolvingAsync(i3), i3; + } + else if (!o2) { + const t4 = "string" == typeof e3 ? this._stringDecoder.decode(e3, this._parseBuffer) : this._utf8Decoder.decode(e3, this._parseBuffer); + if (i3 = this._parser.parse(this._parseBuffer, t4)) return this._preserveStack(s3, r2, t4, 0), this._logSlowResolvingAsync(i3), i3; + } + this._activeBuffer.x === s3 && this._activeBuffer.y === r2 || this._onCursorMove.fire(); + const a2 = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp), h2 = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp); + h2 < this._bufferService.rows && this._onRequestRefreshRows.fire(Math.min(h2, this._bufferService.rows - 1), Math.min(a2, this._bufferService.rows - 1)); + } + print(e3, t3, i3) { + let s3, r2; + const n2 = this._charsetService.charset, o2 = this._optionsService.rawOptions.screenReaderMode, a2 = this._bufferService.cols, h2 = this._coreService.decPrivateModes.wraparound, d2 = this._coreService.modes.insertMode, u2 = this._curAttrData; + let f2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._activeBuffer.x && i3 - t3 > 0 && 2 === f2.getWidth(this._activeBuffer.x - 1) && f2.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, u2); + let v2 = this._parser.precedingJoinState; + for (let g2 = t3; g2 < i3; ++g2) { + if (s3 = e3[g2], s3 < 127 && n2) { + const e4 = n2[String.fromCharCode(s3)]; + e4 && (s3 = e4.charCodeAt(0)); + } + const t4 = this._unicodeService.charProperties(s3, v2); + r2 = p.UnicodeService.extractWidth(t4); + const i4 = p.UnicodeService.extractShouldJoin(t4), m2 = i4 ? p.UnicodeService.extractWidth(v2) : 0; + if (v2 = t4, o2 && this._onA11yChar.fire((0, c.stringFromCodePoint)(s3)), this._getCurrentLinkId() && this._oscLinkService.addLineToLink(this._getCurrentLinkId(), this._activeBuffer.ybase + this._activeBuffer.y), this._activeBuffer.x + r2 - m2 > a2) { + if (h2) { + const e4 = f2; + let t5 = this._activeBuffer.x - m2; + for (this._activeBuffer.x = m2, this._activeBuffer.y++, this._activeBuffer.y === this._activeBuffer.scrollBottom + 1 ? (this._activeBuffer.y--, this._bufferService.scroll(this._eraseAttrData(), true)) : (this._activeBuffer.y >= this._bufferService.rows && (this._activeBuffer.y = this._bufferService.rows - 1), this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).isWrapped = true), f2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y), m2 > 0 && f2 instanceof l.BufferLine && f2.copyCellsFrom(e4, t5, 0, m2, false); t5 < a2; ) e4.setCellFromCodepoint(t5++, 0, 1, u2); + } else if (this._activeBuffer.x = a2 - 1, 2 === r2) continue; + } + if (i4 && this._activeBuffer.x) { + const e4 = f2.getWidth(this._activeBuffer.x - 1) ? 1 : 2; + f2.addCodepointToCell(this._activeBuffer.x - e4, s3, r2); + for (let e5 = r2 - m2; --e5 >= 0; ) f2.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, u2); + } else if (d2 && (f2.insertCells(this._activeBuffer.x, r2 - m2, this._activeBuffer.getNullCell(u2)), 2 === f2.getWidth(a2 - 1) && f2.setCellFromCodepoint(a2 - 1, _.NULL_CELL_CODE, _.NULL_CELL_WIDTH, u2)), f2.setCellFromCodepoint(this._activeBuffer.x++, s3, r2, u2), r2 > 0) for (; --r2; ) f2.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, u2); + } + this._parser.precedingJoinState = v2, this._activeBuffer.x < a2 && i3 - t3 > 0 && 0 === f2.getWidth(this._activeBuffer.x) && !f2.hasContent(this._activeBuffer.x) && f2.setCellFromCodepoint(this._activeBuffer.x, 0, 1, u2), this._dirtyRowTracker.markDirty(this._activeBuffer.y); + } + registerCsiHandler(e3, t3) { + return "t" !== e3.final || e3.prefix || e3.intermediates ? this._parser.registerCsiHandler(e3, t3) : this._parser.registerCsiHandler(e3, (e4) => !w(e4.params[0], this._optionsService.rawOptions.windowOptions) || t3(e4)); + } + registerDcsHandler(e3, t3) { + return this._parser.registerDcsHandler(e3, new m.DcsHandler(t3)); + } + registerEscHandler(e3, t3) { + return this._parser.registerEscHandler(e3, t3); + } + registerOscHandler(e3, t3) { + return this._parser.registerOscHandler(e3, new g.OscHandler(t3)); + } + bell() { + return this._onRequestBell.fire(), true; + } + lineFeed() { + return this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._optionsService.rawOptions.convertEol && (this._activeBuffer.x = 0), this._activeBuffer.y++, this._activeBuffer.y === this._activeBuffer.scrollBottom + 1 ? (this._activeBuffer.y--, this._bufferService.scroll(this._eraseAttrData())) : this._activeBuffer.y >= this._bufferService.rows ? this._activeBuffer.y = this._bufferService.rows - 1 : this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).isWrapped = false, this._activeBuffer.x >= this._bufferService.cols && this._activeBuffer.x--, this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._onLineFeed.fire(), true; + } + carriageReturn() { + return this._activeBuffer.x = 0, true; + } + backspace() { + var _a; + if (!this._coreService.decPrivateModes.reverseWraparound) return this._restrictCursor(), this._activeBuffer.x > 0 && this._activeBuffer.x--, true; + if (this._restrictCursor(this._bufferService.cols), this._activeBuffer.x > 0) this._activeBuffer.x--; + else if (0 === this._activeBuffer.x && this._activeBuffer.y > this._activeBuffer.scrollTop && this._activeBuffer.y <= this._activeBuffer.scrollBottom && ((_a = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)) == null ? void 0 : _a.isWrapped)) { + this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).isWrapped = false, this._activeBuffer.y--, this._activeBuffer.x = this._bufferService.cols - 1; + const e3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + e3.hasWidth(this._activeBuffer.x) && !e3.hasContent(this._activeBuffer.x) && this._activeBuffer.x--; + } + return this._restrictCursor(), true; + } + tab() { + if (this._activeBuffer.x >= this._bufferService.cols) return true; + const e3 = this._activeBuffer.x; + return this._activeBuffer.x = this._activeBuffer.nextStop(), this._optionsService.rawOptions.screenReaderMode && this._onA11yTab.fire(this._activeBuffer.x - e3), true; + } + shiftOut() { + return this._charsetService.setgLevel(1), true; + } + shiftIn() { + return this._charsetService.setgLevel(0), true; + } + _restrictCursor(e3 = this._bufferService.cols - 1) { + this._activeBuffer.x = Math.min(e3, Math.max(0, this._activeBuffer.x)), this._activeBuffer.y = this._coreService.decPrivateModes.origin ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y)) : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y)), this._dirtyRowTracker.markDirty(this._activeBuffer.y); + } + _setCursor(e3, t3) { + this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._coreService.decPrivateModes.origin ? (this._activeBuffer.x = e3, this._activeBuffer.y = this._activeBuffer.scrollTop + t3) : (this._activeBuffer.x = e3, this._activeBuffer.y = t3), this._restrictCursor(), this._dirtyRowTracker.markDirty(this._activeBuffer.y); + } + _moveCursor(e3, t3) { + this._restrictCursor(), this._setCursor(this._activeBuffer.x + e3, this._activeBuffer.y + t3); + } + cursorUp(e3) { + const t3 = this._activeBuffer.y - this._activeBuffer.scrollTop; + return t3 >= 0 ? this._moveCursor(0, -Math.min(t3, e3.params[0] || 1)) : this._moveCursor(0, -(e3.params[0] || 1)), true; + } + cursorDown(e3) { + const t3 = this._activeBuffer.scrollBottom - this._activeBuffer.y; + return t3 >= 0 ? this._moveCursor(0, Math.min(t3, e3.params[0] || 1)) : this._moveCursor(0, e3.params[0] || 1), true; + } + cursorForward(e3) { + return this._moveCursor(e3.params[0] || 1, 0), true; + } + cursorBackward(e3) { + return this._moveCursor(-(e3.params[0] || 1), 0), true; + } + cursorNextLine(e3) { + return this.cursorDown(e3), this._activeBuffer.x = 0, true; + } + cursorPrecedingLine(e3) { + return this.cursorUp(e3), this._activeBuffer.x = 0, true; + } + cursorCharAbsolute(e3) { + return this._setCursor((e3.params[0] || 1) - 1, this._activeBuffer.y), true; + } + cursorPosition(e3) { + return this._setCursor(e3.length >= 2 ? (e3.params[1] || 1) - 1 : 0, (e3.params[0] || 1) - 1), true; + } + charPosAbsolute(e3) { + return this._setCursor((e3.params[0] || 1) - 1, this._activeBuffer.y), true; + } + hPositionRelative(e3) { + return this._moveCursor(e3.params[0] || 1, 0), true; + } + linePosAbsolute(e3) { + return this._setCursor(this._activeBuffer.x, (e3.params[0] || 1) - 1), true; + } + vPositionRelative(e3) { + return this._moveCursor(0, e3.params[0] || 1), true; + } + hVPosition(e3) { + return this.cursorPosition(e3), true; + } + tabClear(e3) { + const t3 = e3.params[0]; + return 0 === t3 ? delete this._activeBuffer.tabs[this._activeBuffer.x] : 3 === t3 && (this._activeBuffer.tabs = {}), true; + } + cursorForwardTab(e3) { + if (this._activeBuffer.x >= this._bufferService.cols) return true; + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.x = this._activeBuffer.nextStop(); + return true; + } + cursorBackwardTab(e3) { + if (this._activeBuffer.x >= this._bufferService.cols) return true; + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.x = this._activeBuffer.prevStop(); + return true; + } + selectProtected(e3) { + const t3 = e3.params[0]; + return 1 === t3 && (this._curAttrData.bg |= 536870912), 2 !== t3 && 0 !== t3 || (this._curAttrData.bg &= -536870913), true; + } + _eraseInBufferLine(e3, t3, i3, s3 = false, r2 = false) { + const n2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e3); + n2.replaceCells(t3, i3, this._activeBuffer.getNullCell(this._eraseAttrData()), r2), s3 && (n2.isWrapped = false); + } + _resetBufferLine(e3, t3 = false) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e3); + i3 && (i3.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), t3), this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + e3), i3.isWrapped = false); + } + eraseInDisplay(e3, t3 = false) { + let i3; + switch (this._restrictCursor(this._bufferService.cols), e3.params[0]) { + case 0: + for (i3 = this._activeBuffer.y, this._dirtyRowTracker.markDirty(i3), this._eraseInBufferLine(i3++, this._activeBuffer.x, this._bufferService.cols, 0 === this._activeBuffer.x, t3); i3 < this._bufferService.rows; i3++) this._resetBufferLine(i3, t3); + this._dirtyRowTracker.markDirty(i3); + break; + case 1: + for (i3 = this._activeBuffer.y, this._dirtyRowTracker.markDirty(i3), this._eraseInBufferLine(i3, 0, this._activeBuffer.x + 1, true, t3), this._activeBuffer.x + 1 >= this._bufferService.cols && (this._activeBuffer.lines.get(i3 + 1).isWrapped = false); i3--; ) this._resetBufferLine(i3, t3); + this._dirtyRowTracker.markDirty(0); + break; + case 2: + for (i3 = this._bufferService.rows, this._dirtyRowTracker.markDirty(i3 - 1); i3--; ) this._resetBufferLine(i3, t3); + this._dirtyRowTracker.markDirty(0); + break; + case 3: + const e4 = this._activeBuffer.lines.length - this._bufferService.rows; + e4 > 0 && (this._activeBuffer.lines.trimStart(e4), this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - e4, 0), this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - e4, 0), this._onScroll.fire(0)); + } + return true; + } + eraseInLine(e3, t3 = false) { + switch (this._restrictCursor(this._bufferService.cols), e3.params[0]) { + case 0: + this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, 0 === this._activeBuffer.x, t3); + break; + case 1: + this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, t3); + break; + case 2: + this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, t3); + } + return this._dirtyRowTracker.markDirty(this._activeBuffer.y), true; + } + insertLines(e3) { + this._restrictCursor(); + let t3 = e3.params[0] || 1; + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const i3 = this._activeBuffer.ybase + this._activeBuffer.y, s3 = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom, r2 = this._bufferService.rows - 1 + this._activeBuffer.ybase - s3 + 1; + for (; t3--; ) this._activeBuffer.lines.splice(r2 - 1, 1), this._activeBuffer.lines.splice(i3, 0, this._activeBuffer.getBlankLine(this._eraseAttrData())); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom), this._activeBuffer.x = 0, true; + } + deleteLines(e3) { + this._restrictCursor(); + let t3 = e3.params[0] || 1; + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const i3 = this._activeBuffer.ybase + this._activeBuffer.y; + let s3; + for (s3 = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom, s3 = this._bufferService.rows - 1 + this._activeBuffer.ybase - s3; t3--; ) this._activeBuffer.lines.splice(i3, 1), this._activeBuffer.lines.splice(s3, 0, this._activeBuffer.getBlankLine(this._eraseAttrData())); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom), this._activeBuffer.x = 0, true; + } + insertChars(e3) { + this._restrictCursor(); + const t3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + return t3 && (t3.insertCells(this._activeBuffer.x, e3.params[0] || 1, this._activeBuffer.getNullCell(this._eraseAttrData())), this._dirtyRowTracker.markDirty(this._activeBuffer.y)), true; + } + deleteChars(e3) { + this._restrictCursor(); + const t3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + return t3 && (t3.deleteCells(this._activeBuffer.x, e3.params[0] || 1, this._activeBuffer.getNullCell(this._eraseAttrData())), this._dirtyRowTracker.markDirty(this._activeBuffer.y)), true; + } + scrollUp(e3) { + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1), this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData())); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + scrollDown(e3) { + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1), this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(l.DEFAULT_ATTR_DATA)); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + scrollLeft(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.deleteCells(0, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + scrollRight(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.insertCells(0, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + insertColumns(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.insertCells(this._activeBuffer.x, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + deleteColumns(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.deleteCells(this._activeBuffer.x, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + eraseChars(e3) { + this._restrictCursor(); + const t3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + return t3 && (t3.replaceCells(this._activeBuffer.x, this._activeBuffer.x + (e3.params[0] || 1), this._activeBuffer.getNullCell(this._eraseAttrData())), this._dirtyRowTracker.markDirty(this._activeBuffer.y)), true; + } + repeatPrecedingCharacter(e3) { + const t3 = this._parser.precedingJoinState; + if (!t3) return true; + const i3 = e3.params[0] || 1, s3 = p.UnicodeService.extractWidth(t3), r2 = this._activeBuffer.x - s3, n2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).getString(r2), o2 = new Uint32Array(n2.length * i3); + let a2 = 0; + for (let e4 = 0; e4 < n2.length; ) { + const t4 = n2.codePointAt(e4) || 0; + o2[a2++] = t4, e4 += t4 > 65535 ? 2 : 1; + } + let h2 = a2; + for (let e4 = 1; e4 < i3; ++e4) o2.copyWithin(h2, 0, a2), h2 += a2; + return this.print(o2, 0, h2), true; + } + sendDeviceAttributesPrimary(e3) { + return e3.params[0] > 0 || (this._is("xterm") || this._is("rxvt-unicode") || this._is("screen") ? this._coreService.triggerDataEvent(n.C0.ESC + "[?1;2c") : this._is("linux") && this._coreService.triggerDataEvent(n.C0.ESC + "[?6c")), true; + } + sendDeviceAttributesSecondary(e3) { + return e3.params[0] > 0 || (this._is("xterm") ? this._coreService.triggerDataEvent(n.C0.ESC + "[>0;276;0c") : this._is("rxvt-unicode") ? this._coreService.triggerDataEvent(n.C0.ESC + "[>85;95;0c") : this._is("linux") ? this._coreService.triggerDataEvent(e3.params[0] + "c") : this._is("screen") && this._coreService.triggerDataEvent(n.C0.ESC + "[>83;40003;0c")), true; + } + _is(e3) { + return 0 === (this._optionsService.rawOptions.termName + "").indexOf(e3); + } + setMode(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 4: + this._coreService.modes.insertMode = true; + break; + case 20: + this._optionsService.options.convertEol = true; + } + return true; + } + setModePrivate(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 1: + this._coreService.decPrivateModes.applicationCursorKeys = true; + break; + case 2: + this._charsetService.setgCharset(0, o.DEFAULT_CHARSET), this._charsetService.setgCharset(1, o.DEFAULT_CHARSET), this._charsetService.setgCharset(2, o.DEFAULT_CHARSET), this._charsetService.setgCharset(3, o.DEFAULT_CHARSET); + break; + case 3: + this._optionsService.rawOptions.windowOptions.setWinLines && (this._bufferService.resize(132, this._bufferService.rows), this._onRequestReset.fire()); + break; + case 6: + this._coreService.decPrivateModes.origin = true, this._setCursor(0, 0); + break; + case 7: + this._coreService.decPrivateModes.wraparound = true; + break; + case 12: + this._optionsService.options.cursorBlink = true; + break; + case 45: + this._coreService.decPrivateModes.reverseWraparound = true; + break; + case 66: + this._logService.debug("Serial port requested application keypad."), this._coreService.decPrivateModes.applicationKeypad = true, this._onRequestSyncScrollBar.fire(); + break; + case 9: + this._coreMouseService.activeProtocol = "X10"; + break; + case 1e3: + this._coreMouseService.activeProtocol = "VT200"; + break; + case 1002: + this._coreMouseService.activeProtocol = "DRAG"; + break; + case 1003: + this._coreMouseService.activeProtocol = "ANY"; + break; + case 1004: + this._coreService.decPrivateModes.sendFocus = true, this._onRequestSendFocus.fire(); + break; + case 1005: + this._logService.debug("DECSET 1005 not supported (see #2507)"); + break; + case 1006: + this._coreMouseService.activeEncoding = "SGR"; + break; + case 1015: + this._logService.debug("DECSET 1015 not supported (see #2507)"); + break; + case 1016: + this._coreMouseService.activeEncoding = "SGR_PIXELS"; + break; + case 25: + this._coreService.isCursorHidden = false; + break; + case 1048: + this.saveCursor(); + break; + case 1049: + this.saveCursor(); + case 47: + case 1047: + this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()), this._coreService.isCursorInitialized = true, this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1), this._onRequestSyncScrollBar.fire(); + break; + case 2004: + this._coreService.decPrivateModes.bracketedPasteMode = true; + } + return true; + } + resetMode(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 4: + this._coreService.modes.insertMode = false; + break; + case 20: + this._optionsService.options.convertEol = false; + } + return true; + } + resetModePrivate(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 1: + this._coreService.decPrivateModes.applicationCursorKeys = false; + break; + case 3: + this._optionsService.rawOptions.windowOptions.setWinLines && (this._bufferService.resize(80, this._bufferService.rows), this._onRequestReset.fire()); + break; + case 6: + this._coreService.decPrivateModes.origin = false, this._setCursor(0, 0); + break; + case 7: + this._coreService.decPrivateModes.wraparound = false; + break; + case 12: + this._optionsService.options.cursorBlink = false; + break; + case 45: + this._coreService.decPrivateModes.reverseWraparound = false; + break; + case 66: + this._logService.debug("Switching back to normal keypad."), this._coreService.decPrivateModes.applicationKeypad = false, this._onRequestSyncScrollBar.fire(); + break; + case 9: + case 1e3: + case 1002: + case 1003: + this._coreMouseService.activeProtocol = "NONE"; + break; + case 1004: + this._coreService.decPrivateModes.sendFocus = false; + break; + case 1005: + this._logService.debug("DECRST 1005 not supported (see #2507)"); + break; + case 1006: + case 1016: + this._coreMouseService.activeEncoding = "DEFAULT"; + break; + case 1015: + this._logService.debug("DECRST 1015 not supported (see #2507)"); + break; + case 25: + this._coreService.isCursorHidden = true; + break; + case 1048: + this.restoreCursor(); + break; + case 1049: + case 47: + case 1047: + this._bufferService.buffers.activateNormalBuffer(), 1049 === e3.params[t3] && this.restoreCursor(), this._coreService.isCursorInitialized = true, this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1), this._onRequestSyncScrollBar.fire(); + break; + case 2004: + this._coreService.decPrivateModes.bracketedPasteMode = false; + } + return true; + } + requestMode(e3, t3) { + const i3 = this._coreService.decPrivateModes, { activeProtocol: s3, activeEncoding: r2 } = this._coreMouseService, o2 = this._coreService, { buffers: a2, cols: h2 } = this._bufferService, { active: c2, alt: l2 } = a2, d2 = this._optionsService.rawOptions, _2 = (e4) => e4 ? 1 : 2, u2 = e3.params[0]; + return f2 = u2, v2 = t3 ? 2 === u2 ? 4 : 4 === u2 ? _2(o2.modes.insertMode) : 12 === u2 ? 3 : 20 === u2 ? _2(d2.convertEol) : 0 : 1 === u2 ? _2(i3.applicationCursorKeys) : 3 === u2 ? d2.windowOptions.setWinLines ? 80 === h2 ? 2 : 132 === h2 ? 1 : 0 : 0 : 6 === u2 ? _2(i3.origin) : 7 === u2 ? _2(i3.wraparound) : 8 === u2 ? 3 : 9 === u2 ? _2("X10" === s3) : 12 === u2 ? _2(d2.cursorBlink) : 25 === u2 ? _2(!o2.isCursorHidden) : 45 === u2 ? _2(i3.reverseWraparound) : 66 === u2 ? _2(i3.applicationKeypad) : 67 === u2 ? 4 : 1e3 === u2 ? _2("VT200" === s3) : 1002 === u2 ? _2("DRAG" === s3) : 1003 === u2 ? _2("ANY" === s3) : 1004 === u2 ? _2(i3.sendFocus) : 1005 === u2 ? 4 : 1006 === u2 ? _2("SGR" === r2) : 1015 === u2 ? 4 : 1016 === u2 ? _2("SGR_PIXELS" === r2) : 1048 === u2 ? 1 : 47 === u2 || 1047 === u2 || 1049 === u2 ? _2(c2 === l2) : 2004 === u2 ? _2(i3.bracketedPasteMode) : 0, o2.triggerDataEvent(`${n.C0.ESC}[${t3 ? "" : "?"}${f2};${v2}$y`), true; + var f2, v2; + } + _updateAttrColor(e3, t3, i3, s3, r2) { + return 2 === t3 ? (e3 |= 50331648, e3 &= -16777216, e3 |= f.AttributeData.fromColorRGB([i3, s3, r2])) : 5 === t3 && (e3 &= -50331904, e3 |= 33554432 | 255 & i3), e3; + } + _extractColor(e3, t3, i3) { + const s3 = [0, 0, -1, 0, 0, 0]; + let r2 = 0, n2 = 0; + do { + if (s3[n2 + r2] = e3.params[t3 + n2], e3.hasSubParams(t3 + n2)) { + const i4 = e3.getSubParams(t3 + n2); + let o2 = 0; + do { + 5 === s3[1] && (r2 = 1), s3[n2 + o2 + 1 + r2] = i4[o2]; + } while (++o2 < i4.length && o2 + n2 + 1 + r2 < s3.length); + break; + } + if (5 === s3[1] && n2 + r2 >= 2 || 2 === s3[1] && n2 + r2 >= 5) break; + s3[1] && (r2 = 1); + } while (++n2 + t3 < e3.length && n2 + r2 < s3.length); + for (let e4 = 2; e4 < s3.length; ++e4) -1 === s3[e4] && (s3[e4] = 0); + switch (s3[0]) { + case 38: + i3.fg = this._updateAttrColor(i3.fg, s3[1], s3[3], s3[4], s3[5]); + break; + case 48: + i3.bg = this._updateAttrColor(i3.bg, s3[1], s3[3], s3[4], s3[5]); + break; + case 58: + i3.extended = i3.extended.clone(), i3.extended.underlineColor = this._updateAttrColor(i3.extended.underlineColor, s3[1], s3[3], s3[4], s3[5]); + } + return n2; + } + _processUnderline(e3, t3) { + t3.extended = t3.extended.clone(), (!~e3 || e3 > 5) && (e3 = 1), t3.extended.underlineStyle = e3, t3.fg |= 268435456, 0 === e3 && (t3.fg &= -268435457), t3.updateExtended(); + } + _processSGR0(e3) { + e3.fg = l.DEFAULT_ATTR_DATA.fg, e3.bg = l.DEFAULT_ATTR_DATA.bg, e3.extended = e3.extended.clone(), e3.extended.underlineStyle = 0, e3.extended.underlineColor &= -67108864, e3.updateExtended(); + } + charAttributes(e3) { + if (1 === e3.length && 0 === e3.params[0]) return this._processSGR0(this._curAttrData), true; + const t3 = e3.length; + let i3; + const s3 = this._curAttrData; + for (let r2 = 0; r2 < t3; r2++) i3 = e3.params[r2], i3 >= 30 && i3 <= 37 ? (s3.fg &= -50331904, s3.fg |= 16777216 | i3 - 30) : i3 >= 40 && i3 <= 47 ? (s3.bg &= -50331904, s3.bg |= 16777216 | i3 - 40) : i3 >= 90 && i3 <= 97 ? (s3.fg &= -50331904, s3.fg |= 16777224 | i3 - 90) : i3 >= 100 && i3 <= 107 ? (s3.bg &= -50331904, s3.bg |= 16777224 | i3 - 100) : 0 === i3 ? this._processSGR0(s3) : 1 === i3 ? s3.fg |= 134217728 : 3 === i3 ? s3.bg |= 67108864 : 4 === i3 ? (s3.fg |= 268435456, this._processUnderline(e3.hasSubParams(r2) ? e3.getSubParams(r2)[0] : 1, s3)) : 5 === i3 ? s3.fg |= 536870912 : 7 === i3 ? s3.fg |= 67108864 : 8 === i3 ? s3.fg |= 1073741824 : 9 === i3 ? s3.fg |= 2147483648 : 2 === i3 ? s3.bg |= 134217728 : 21 === i3 ? this._processUnderline(2, s3) : 22 === i3 ? (s3.fg &= -134217729, s3.bg &= -134217729) : 23 === i3 ? s3.bg &= -67108865 : 24 === i3 ? (s3.fg &= -268435457, this._processUnderline(0, s3)) : 25 === i3 ? s3.fg &= -536870913 : 27 === i3 ? s3.fg &= -67108865 : 28 === i3 ? s3.fg &= -1073741825 : 29 === i3 ? s3.fg &= 2147483647 : 39 === i3 ? (s3.fg &= -67108864, s3.fg |= 16777215 & l.DEFAULT_ATTR_DATA.fg) : 49 === i3 ? (s3.bg &= -67108864, s3.bg |= 16777215 & l.DEFAULT_ATTR_DATA.bg) : 38 === i3 || 48 === i3 || 58 === i3 ? r2 += this._extractColor(e3, r2, s3) : 53 === i3 ? s3.bg |= 1073741824 : 55 === i3 ? s3.bg &= -1073741825 : 59 === i3 ? (s3.extended = s3.extended.clone(), s3.extended.underlineColor = -1, s3.updateExtended()) : 100 === i3 ? (s3.fg &= -67108864, s3.fg |= 16777215 & l.DEFAULT_ATTR_DATA.fg, s3.bg &= -67108864, s3.bg |= 16777215 & l.DEFAULT_ATTR_DATA.bg) : this._logService.debug("Unknown SGR attribute: %d.", i3); + return true; + } + deviceStatus(e3) { + switch (e3.params[0]) { + case 5: + this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`); + break; + case 6: + const e4 = this._activeBuffer.y + 1, t3 = this._activeBuffer.x + 1; + this._coreService.triggerDataEvent(`${n.C0.ESC}[${e4};${t3}R`); + } + return true; + } + deviceStatusPrivate(e3) { + if (6 === e3.params[0]) { + const e4 = this._activeBuffer.y + 1, t3 = this._activeBuffer.x + 1; + this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e4};${t3}R`); + } + return true; + } + softReset(e3) { + return this._coreService.isCursorHidden = false, this._onRequestSyncScrollBar.fire(), this._activeBuffer.scrollTop = 0, this._activeBuffer.scrollBottom = this._bufferService.rows - 1, this._curAttrData = l.DEFAULT_ATTR_DATA.clone(), this._coreService.reset(), this._charsetService.reset(), this._activeBuffer.savedX = 0, this._activeBuffer.savedY = this._activeBuffer.ybase, this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg, this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg, this._activeBuffer.savedCharset = this._charsetService.charset, this._coreService.decPrivateModes.origin = false, true; + } + setCursorStyle(e3) { + const t3 = e3.params[0] || 1; + switch (t3) { + case 1: + case 2: + this._optionsService.options.cursorStyle = "block"; + break; + case 3: + case 4: + this._optionsService.options.cursorStyle = "underline"; + break; + case 5: + case 6: + this._optionsService.options.cursorStyle = "bar"; + } + const i3 = t3 % 2 == 1; + return this._optionsService.options.cursorBlink = i3, true; + } + setScrollRegion(e3) { + const t3 = e3.params[0] || 1; + let i3; + return (e3.length < 2 || (i3 = e3.params[1]) > this._bufferService.rows || 0 === i3) && (i3 = this._bufferService.rows), i3 > t3 && (this._activeBuffer.scrollTop = t3 - 1, this._activeBuffer.scrollBottom = i3 - 1, this._setCursor(0, 0)), true; + } + windowOptions(e3) { + if (!w(e3.params[0], this._optionsService.rawOptions.windowOptions)) return true; + const t3 = e3.length > 1 ? e3.params[1] : 0; + switch (e3.params[0]) { + case 14: + 2 !== t3 && this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS); + break; + case 16: + this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS); + break; + case 18: + this._bufferService && this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`); + break; + case 22: + 0 !== t3 && 2 !== t3 || (this._windowTitleStack.push(this._windowTitle), this._windowTitleStack.length > 10 && this._windowTitleStack.shift()), 0 !== t3 && 1 !== t3 || (this._iconNameStack.push(this._iconName), this._iconNameStack.length > 10 && this._iconNameStack.shift()); + break; + case 23: + 0 !== t3 && 2 !== t3 || this._windowTitleStack.length && this.setTitle(this._windowTitleStack.pop()), 0 !== t3 && 1 !== t3 || this._iconNameStack.length && this.setIconName(this._iconNameStack.pop()); + } + return true; + } + saveCursor(e3) { + return this._activeBuffer.savedX = this._activeBuffer.x, this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg, this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg, this._activeBuffer.savedCharset = this._charsetService.charset, true; + } + restoreCursor(e3) { + return this._activeBuffer.x = this._activeBuffer.savedX || 0, this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0), this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg, this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg, this._charsetService.charset = this._savedCharset, this._activeBuffer.savedCharset && (this._charsetService.charset = this._activeBuffer.savedCharset), this._restrictCursor(), true; + } + setTitle(e3) { + return this._windowTitle = e3, this._onTitleChange.fire(e3), true; + } + setIconName(e3) { + return this._iconName = e3, true; + } + setOrReportIndexedColor(e3) { + const t3 = [], i3 = e3.split(";"); + for (; i3.length > 1; ) { + const e4 = i3.shift(), s3 = i3.shift(); + if (/^\d+$/.exec(e4)) { + const i4 = parseInt(e4); + if (D(i4)) if ("?" === s3) t3.push({ type: 0, index: i4 }); + else { + const e5 = (0, S.parseColor)(s3); + e5 && t3.push({ type: 1, index: i4, color: e5 }); + } + } + } + return t3.length && this._onColor.fire(t3), true; + } + setHyperlink(e3) { + const t3 = e3.split(";"); + return !(t3.length < 2) && (t3[1] ? this._createHyperlink(t3[0], t3[1]) : !t3[0] && this._finishHyperlink()); + } + _createHyperlink(e3, t3) { + this._getCurrentLinkId() && this._finishHyperlink(); + const i3 = e3.split(":"); + let s3; + const r2 = i3.findIndex((e4) => e4.startsWith("id=")); + return -1 !== r2 && (s3 = i3[r2].slice(3) || void 0), this._curAttrData.extended = this._curAttrData.extended.clone(), this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id: s3, uri: t3 }), this._curAttrData.updateExtended(), true; + } + _finishHyperlink() { + return this._curAttrData.extended = this._curAttrData.extended.clone(), this._curAttrData.extended.urlId = 0, this._curAttrData.updateExtended(), true; + } + _setOrReportSpecialColor(e3, t3) { + const i3 = e3.split(";"); + for (let e4 = 0; e4 < i3.length && !(t3 >= this._specialColors.length); ++e4, ++t3) if ("?" === i3[e4]) this._onColor.fire([{ type: 0, index: this._specialColors[t3] }]); + else { + const s3 = (0, S.parseColor)(i3[e4]); + s3 && this._onColor.fire([{ type: 1, index: this._specialColors[t3], color: s3 }]); + } + return true; + } + setOrReportFgColor(e3) { + return this._setOrReportSpecialColor(e3, 0); + } + setOrReportBgColor(e3) { + return this._setOrReportSpecialColor(e3, 1); + } + setOrReportCursorColor(e3) { + return this._setOrReportSpecialColor(e3, 2); + } + restoreIndexedColor(e3) { + if (!e3) return this._onColor.fire([{ type: 2 }]), true; + const t3 = [], i3 = e3.split(";"); + for (let e4 = 0; e4 < i3.length; ++e4) if (/^\d+$/.exec(i3[e4])) { + const s3 = parseInt(i3[e4]); + D(s3) && t3.push({ type: 2, index: s3 }); + } + return t3.length && this._onColor.fire(t3), true; + } + restoreFgColor(e3) { + return this._onColor.fire([{ type: 2, index: 256 }]), true; + } + restoreBgColor(e3) { + return this._onColor.fire([{ type: 2, index: 257 }]), true; + } + restoreCursorColor(e3) { + return this._onColor.fire([{ type: 2, index: 258 }]), true; + } + nextLine() { + return this._activeBuffer.x = 0, this.index(), true; + } + keypadApplicationMode() { + return this._logService.debug("Serial port requested application keypad."), this._coreService.decPrivateModes.applicationKeypad = true, this._onRequestSyncScrollBar.fire(), true; + } + keypadNumericMode() { + return this._logService.debug("Switching back to normal keypad."), this._coreService.decPrivateModes.applicationKeypad = false, this._onRequestSyncScrollBar.fire(), true; + } + selectDefaultCharset() { + return this._charsetService.setgLevel(0), this._charsetService.setgCharset(0, o.DEFAULT_CHARSET), true; + } + selectCharset(e3) { + return 2 !== e3.length ? (this.selectDefaultCharset(), true) : ("/" === e3[0] || this._charsetService.setgCharset(C[e3[0]], o.CHARSETS[e3[1]] || o.DEFAULT_CHARSET), true); + } + index() { + return this._restrictCursor(), this._activeBuffer.y++, this._activeBuffer.y === this._activeBuffer.scrollBottom + 1 ? (this._activeBuffer.y--, this._bufferService.scroll(this._eraseAttrData())) : this._activeBuffer.y >= this._bufferService.rows && (this._activeBuffer.y = this._bufferService.rows - 1), this._restrictCursor(), true; + } + tabSet() { + return this._activeBuffer.tabs[this._activeBuffer.x] = true, true; + } + reverseIndex() { + if (this._restrictCursor(), this._activeBuffer.y === this._activeBuffer.scrollTop) { + const e3 = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop; + this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, e3, 1), this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData())), this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom); + } else this._activeBuffer.y--, this._restrictCursor(); + return true; + } + fullReset() { + return this._parser.reset(), this._onRequestReset.fire(), true; + } + reset() { + this._curAttrData = l.DEFAULT_ATTR_DATA.clone(), this._eraseAttrDataInternal = l.DEFAULT_ATTR_DATA.clone(); + } + _eraseAttrData() { + return this._eraseAttrDataInternal.bg &= -67108864, this._eraseAttrDataInternal.bg |= 67108863 & this._curAttrData.bg, this._eraseAttrDataInternal; + } + setgLevel(e3) { + return this._charsetService.setgLevel(e3), true; + } + screenAlignmentPattern() { + const e3 = new u.CellData(); + e3.content = 1 << 22 | "E".charCodeAt(0), e3.fg = this._curAttrData.fg, e3.bg = this._curAttrData.bg, this._setCursor(0, 0); + for (let t3 = 0; t3 < this._bufferService.rows; ++t3) { + const i3 = this._activeBuffer.ybase + this._activeBuffer.y + t3, s3 = this._activeBuffer.lines.get(i3); + s3 && (s3.fill(e3), s3.isWrapped = false); + } + return this._dirtyRowTracker.markAllDirty(), this._setCursor(0, 0), true; + } + requestStatusString(e3, t3) { + const i3 = this._bufferService.buffer, s3 = this._optionsService.rawOptions; + return ((e4) => (this._coreService.triggerDataEvent(`${n.C0.ESC}${e4}${n.C0.ESC}\\`), true))('"q' === e3 ? `P1$r${this._curAttrData.isProtected() ? 1 : 0}"q` : '"p' === e3 ? 'P1$r61;1"p' : "r" === e3 ? `P1$r${i3.scrollTop + 1};${i3.scrollBottom + 1}r` : "m" === e3 ? "P1$r0m" : " q" === e3 ? `P1$r${{ block: 2, underline: 4, bar: 6 }[s3.cursorStyle] - (s3.cursorBlink ? 1 : 0)} q` : "P0$r"); + } + markRangeDirty(e3, t3) { + this._dirtyRowTracker.markRangeDirty(e3, t3); + } + } + t2.InputHandler = k; + let L = class { + constructor(e3) { + this._bufferService = e3, this.clearRange(); + } + clearRange() { + this.start = this._bufferService.buffer.y, this.end = this._bufferService.buffer.y; + } + markDirty(e3) { + e3 < this.start ? this.start = e3 : e3 > this.end && (this.end = e3); + } + markRangeDirty(e3, t3) { + e3 > t3 && (E = e3, e3 = t3, t3 = E), e3 < this.start && (this.start = e3), t3 > this.end && (this.end = t3); + } + markAllDirty() { + this.markRangeDirty(0, this._bufferService.rows - 1); + } + }; + function D(e3) { + return 0 <= e3 && e3 < 256; + } + L = s2([r(0, v.IBufferService)], L); + }, 844: (e2, t2) => { + function i2(e3) { + for (const t3 of e3) t3.dispose(); + e3.length = 0; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getDisposeArrayDisposable = t2.disposeArray = t2.toDisposable = t2.MutableDisposable = t2.Disposable = void 0, t2.Disposable = class { + constructor() { + this._disposables = [], this._isDisposed = false; + } + dispose() { + this._isDisposed = true; + for (const e3 of this._disposables) e3.dispose(); + this._disposables.length = 0; + } + register(e3) { + return this._disposables.push(e3), e3; + } + unregister(e3) { + const t3 = this._disposables.indexOf(e3); + -1 !== t3 && this._disposables.splice(t3, 1); + } + }, t2.MutableDisposable = class { + constructor() { + this._isDisposed = false; + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(e3) { + var _a; + this._isDisposed || e3 === this._value || ((_a = this._value) == null ? void 0 : _a.dispose(), this._value = e3); + } + clear() { + this.value = void 0; + } + dispose() { + var _a; + this._isDisposed = true, (_a = this._value) == null ? void 0 : _a.dispose(), this._value = void 0; + } + }, t2.toDisposable = function(e3) { + return { dispose: e3 }; + }, t2.disposeArray = i2, t2.getDisposeArrayDisposable = function(e3) { + return { dispose: () => i2(e3) }; + }; + }, 1505: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.FourKeyMap = t2.TwoKeyMap = void 0; + class i2 { + constructor() { + this._data = {}; + } + set(e3, t3, i3) { + this._data[e3] || (this._data[e3] = {}), this._data[e3][t3] = i3; + } + get(e3, t3) { + return this._data[e3] ? this._data[e3][t3] : void 0; + } + clear() { + this._data = {}; + } + } + t2.TwoKeyMap = i2, t2.FourKeyMap = class { + constructor() { + this._data = new i2(); + } + set(e3, t3, s2, r, n) { + this._data.get(e3, t3) || this._data.set(e3, t3, new i2()), this._data.get(e3, t3).set(s2, r, n); + } + get(e3, t3, i3, s2) { + var _a; + return (_a = this._data.get(e3, t3)) == null ? void 0 : _a.get(i3, s2); + } + clear() { + this._data.clear(); + } + }; + }, 6114: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.isChromeOS = t2.isLinux = t2.isWindows = t2.isIphone = t2.isIpad = t2.isMac = t2.getSafariVersion = t2.isSafari = t2.isLegacyEdge = t2.isFirefox = t2.isNode = void 0, t2.isNode = "undefined" != typeof process && "title" in process; + const i2 = t2.isNode ? "node" : navigator.userAgent, s2 = t2.isNode ? "node" : navigator.platform; + t2.isFirefox = i2.includes("Firefox"), t2.isLegacyEdge = i2.includes("Edge"), t2.isSafari = /^((?!chrome|android).)*safari/i.test(i2), t2.getSafariVersion = function() { + if (!t2.isSafari) return 0; + const e3 = i2.match(/Version\/(\d+)/); + return null === e3 || e3.length < 2 ? 0 : parseInt(e3[1]); + }, t2.isMac = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"].includes(s2), t2.isIpad = "iPad" === s2, t2.isIphone = "iPhone" === s2, t2.isWindows = ["Windows", "Win16", "Win32", "WinCE"].includes(s2), t2.isLinux = s2.indexOf("Linux") >= 0, t2.isChromeOS = /\bCrOS\b/.test(i2); + }, 6106: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.SortedList = void 0; + let i2 = 0; + t2.SortedList = class { + constructor(e3) { + this._getKey = e3, this._array = []; + } + clear() { + this._array.length = 0; + } + insert(e3) { + 0 !== this._array.length ? (i2 = this._search(this._getKey(e3)), this._array.splice(i2, 0, e3)) : this._array.push(e3); + } + delete(e3) { + if (0 === this._array.length) return false; + const t3 = this._getKey(e3); + if (void 0 === t3) return false; + if (i2 = this._search(t3), -1 === i2) return false; + if (this._getKey(this._array[i2]) !== t3) return false; + do { + if (this._array[i2] === e3) return this._array.splice(i2, 1), true; + } while (++i2 < this._array.length && this._getKey(this._array[i2]) === t3); + return false; + } + *getKeyIterator(e3) { + if (0 !== this._array.length && (i2 = this._search(e3), !(i2 < 0 || i2 >= this._array.length) && this._getKey(this._array[i2]) === e3)) do { + yield this._array[i2]; + } while (++i2 < this._array.length && this._getKey(this._array[i2]) === e3); + } + forEachByKey(e3, t3) { + if (0 !== this._array.length && (i2 = this._search(e3), !(i2 < 0 || i2 >= this._array.length) && this._getKey(this._array[i2]) === e3)) do { + t3(this._array[i2]); + } while (++i2 < this._array.length && this._getKey(this._array[i2]) === e3); + } + values() { + return [...this._array].values(); + } + _search(e3) { + let t3 = 0, i3 = this._array.length - 1; + for (; i3 >= t3; ) { + let s2 = t3 + i3 >> 1; + const r = this._getKey(this._array[s2]); + if (r > e3) i3 = s2 - 1; + else { + if (!(r < e3)) { + for (; s2 > 0 && this._getKey(this._array[s2 - 1]) === e3; ) s2--; + return s2; + } + t3 = s2 + 1; + } + } + return t3; + } + }; + }, 7226: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DebouncedIdleTask = t2.IdleTaskQueue = t2.PriorityTaskQueue = void 0; + const s2 = i2(6114); + class r { + constructor() { + this._tasks = [], this._i = 0; + } + enqueue(e3) { + this._tasks.push(e3), this._start(); + } + flush() { + for (; this._i < this._tasks.length; ) this._tasks[this._i]() || this._i++; + this.clear(); + } + clear() { + this._idleCallback && (this._cancelCallback(this._idleCallback), this._idleCallback = void 0), this._i = 0, this._tasks.length = 0; + } + _start() { + this._idleCallback || (this._idleCallback = this._requestCallback(this._process.bind(this))); + } + _process(e3) { + this._idleCallback = void 0; + let t3 = 0, i3 = 0, s3 = e3.timeRemaining(), r2 = 0; + for (; this._i < this._tasks.length; ) { + if (t3 = Date.now(), this._tasks[this._i]() || this._i++, t3 = Math.max(1, Date.now() - t3), i3 = Math.max(t3, i3), r2 = e3.timeRemaining(), 1.5 * i3 > r2) return s3 - t3 < -20 && console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s3 - t3))}ms`), void this._start(); + s3 = r2; + } + this.clear(); + } + } + class n extends r { + _requestCallback(e3) { + return setTimeout(() => e3(this._createDeadline(16))); + } + _cancelCallback(e3) { + clearTimeout(e3); + } + _createDeadline(e3) { + const t3 = Date.now() + e3; + return { timeRemaining: () => Math.max(0, t3 - Date.now()) }; + } + } + t2.PriorityTaskQueue = n, t2.IdleTaskQueue = !s2.isNode && "requestIdleCallback" in window ? class extends r { + _requestCallback(e3) { + return requestIdleCallback(e3); + } + _cancelCallback(e3) { + cancelIdleCallback(e3); + } + } : n, t2.DebouncedIdleTask = class { + constructor() { + this._queue = new t2.IdleTaskQueue(); + } + set(e3) { + this._queue.clear(), this._queue.enqueue(e3); + } + flush() { + this._queue.flush(); + } + }; + }, 9282: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.updateWindowsModeWrappedState = void 0; + const s2 = i2(643); + t2.updateWindowsModeWrappedState = function(e3) { + const t3 = e3.buffer.lines.get(e3.buffer.ybase + e3.buffer.y - 1), i3 = t3 == null ? void 0 : t3.get(e3.cols - 1), r = e3.buffer.lines.get(e3.buffer.ybase + e3.buffer.y); + r && i3 && (r.isWrapped = i3[s2.CHAR_DATA_CODE_INDEX] !== s2.NULL_CELL_CODE && i3[s2.CHAR_DATA_CODE_INDEX] !== s2.WHITESPACE_CELL_CODE); + }; + }, 3734: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ExtendedAttrs = t2.AttributeData = void 0; + class i2 { + constructor() { + this.fg = 0, this.bg = 0, this.extended = new s2(); + } + static toColorRGB(e3) { + return [e3 >>> 16 & 255, e3 >>> 8 & 255, 255 & e3]; + } + static fromColorRGB(e3) { + return (255 & e3[0]) << 16 | (255 & e3[1]) << 8 | 255 & e3[2]; + } + clone() { + const e3 = new i2(); + return e3.fg = this.fg, e3.bg = this.bg, e3.extended = this.extended.clone(), e3; + } + isInverse() { + return 67108864 & this.fg; + } + isBold() { + return 134217728 & this.fg; + } + isUnderline() { + return this.hasExtendedAttrs() && 0 !== this.extended.underlineStyle ? 1 : 268435456 & this.fg; + } + isBlink() { + return 536870912 & this.fg; + } + isInvisible() { + return 1073741824 & this.fg; + } + isItalic() { + return 67108864 & this.bg; + } + isDim() { + return 134217728 & this.bg; + } + isStrikethrough() { + return 2147483648 & this.fg; + } + isProtected() { + return 536870912 & this.bg; + } + isOverline() { + return 1073741824 & this.bg; + } + getFgColorMode() { + return 50331648 & this.fg; + } + getBgColorMode() { + return 50331648 & this.bg; + } + isFgRGB() { + return 50331648 == (50331648 & this.fg); + } + isBgRGB() { + return 50331648 == (50331648 & this.bg); + } + isFgPalette() { + return 16777216 == (50331648 & this.fg) || 33554432 == (50331648 & this.fg); + } + isBgPalette() { + return 16777216 == (50331648 & this.bg) || 33554432 == (50331648 & this.bg); + } + isFgDefault() { + return 0 == (50331648 & this.fg); + } + isBgDefault() { + return 0 == (50331648 & this.bg); + } + isAttributeDefault() { + return 0 === this.fg && 0 === this.bg; + } + getFgColor() { + switch (50331648 & this.fg) { + case 16777216: + case 33554432: + return 255 & this.fg; + case 50331648: + return 16777215 & this.fg; + default: + return -1; + } + } + getBgColor() { + switch (50331648 & this.bg) { + case 16777216: + case 33554432: + return 255 & this.bg; + case 50331648: + return 16777215 & this.bg; + default: + return -1; + } + } + hasExtendedAttrs() { + return 268435456 & this.bg; + } + updateExtended() { + this.extended.isEmpty() ? this.bg &= -268435457 : this.bg |= 268435456; + } + getUnderlineColor() { + if (268435456 & this.bg && ~this.extended.underlineColor) switch (50331648 & this.extended.underlineColor) { + case 16777216: + case 33554432: + return 255 & this.extended.underlineColor; + case 50331648: + return 16777215 & this.extended.underlineColor; + default: + return this.getFgColor(); + } + return this.getFgColor(); + } + getUnderlineColorMode() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 & this.extended.underlineColor : this.getFgColorMode(); + } + isUnderlineColorRGB() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 == (50331648 & this.extended.underlineColor) : this.isFgRGB(); + } + isUnderlineColorPalette() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 16777216 == (50331648 & this.extended.underlineColor) || 33554432 == (50331648 & this.extended.underlineColor) : this.isFgPalette(); + } + isUnderlineColorDefault() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 0 == (50331648 & this.extended.underlineColor) : this.isFgDefault(); + } + getUnderlineStyle() { + return 268435456 & this.fg ? 268435456 & this.bg ? this.extended.underlineStyle : 1 : 0; + } + getUnderlineVariantOffset() { + return this.extended.underlineVariantOffset; + } + } + t2.AttributeData = i2; + class s2 { + get ext() { + return this._urlId ? -469762049 & this._ext | this.underlineStyle << 26 : this._ext; + } + set ext(e3) { + this._ext = e3; + } + get underlineStyle() { + return this._urlId ? 5 : (469762048 & this._ext) >> 26; + } + set underlineStyle(e3) { + this._ext &= -469762049, this._ext |= e3 << 26 & 469762048; + } + get underlineColor() { + return 67108863 & this._ext; + } + set underlineColor(e3) { + this._ext &= -67108864, this._ext |= 67108863 & e3; + } + get urlId() { + return this._urlId; + } + set urlId(e3) { + this._urlId = e3; + } + get underlineVariantOffset() { + const e3 = (3758096384 & this._ext) >> 29; + return e3 < 0 ? 4294967288 ^ e3 : e3; + } + set underlineVariantOffset(e3) { + this._ext &= 536870911, this._ext |= e3 << 29 & 3758096384; + } + constructor(e3 = 0, t3 = 0) { + this._ext = 0, this._urlId = 0, this._ext = e3, this._urlId = t3; + } + clone() { + return new s2(this._ext, this._urlId); + } + isEmpty() { + return 0 === this.underlineStyle && 0 === this._urlId; + } + } + t2.ExtendedAttrs = s2; + }, 9092: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Buffer = t2.MAX_BUFFER_SIZE = void 0; + const s2 = i2(6349), r = i2(7226), n = i2(3734), o = i2(8437), a = i2(4634), h = i2(511), c = i2(643), l = i2(4863), d = i2(7116); + t2.MAX_BUFFER_SIZE = 4294967295, t2.Buffer = class { + constructor(e3, t3, i3) { + this._hasScrollback = e3, this._optionsService = t3, this._bufferService = i3, this.ydisp = 0, this.ybase = 0, this.y = 0, this.x = 0, this.tabs = {}, this.savedY = 0, this.savedX = 0, this.savedCurAttrData = o.DEFAULT_ATTR_DATA.clone(), this.savedCharset = d.DEFAULT_CHARSET, this.markers = [], this._nullCell = h.CellData.fromCharData([0, c.NULL_CELL_CHAR, c.NULL_CELL_WIDTH, c.NULL_CELL_CODE]), this._whitespaceCell = h.CellData.fromCharData([0, c.WHITESPACE_CELL_CHAR, c.WHITESPACE_CELL_WIDTH, c.WHITESPACE_CELL_CODE]), this._isClearing = false, this._memoryCleanupQueue = new r.IdleTaskQueue(), this._memoryCleanupPosition = 0, this._cols = this._bufferService.cols, this._rows = this._bufferService.rows, this.lines = new s2.CircularList(this._getCorrectBufferLength(this._rows)), this.scrollTop = 0, this.scrollBottom = this._rows - 1, this.setupTabStops(); + } + getNullCell(e3) { + return e3 ? (this._nullCell.fg = e3.fg, this._nullCell.bg = e3.bg, this._nullCell.extended = e3.extended) : (this._nullCell.fg = 0, this._nullCell.bg = 0, this._nullCell.extended = new n.ExtendedAttrs()), this._nullCell; + } + getWhitespaceCell(e3) { + return e3 ? (this._whitespaceCell.fg = e3.fg, this._whitespaceCell.bg = e3.bg, this._whitespaceCell.extended = e3.extended) : (this._whitespaceCell.fg = 0, this._whitespaceCell.bg = 0, this._whitespaceCell.extended = new n.ExtendedAttrs()), this._whitespaceCell; + } + getBlankLine(e3, t3) { + return new o.BufferLine(this._bufferService.cols, this.getNullCell(e3), t3); + } + get hasScrollback() { + return this._hasScrollback && this.lines.maxLength > this._rows; + } + get isCursorInViewport() { + const e3 = this.ybase + this.y - this.ydisp; + return e3 >= 0 && e3 < this._rows; + } + _getCorrectBufferLength(e3) { + if (!this._hasScrollback) return e3; + const i3 = e3 + this._optionsService.rawOptions.scrollback; + return i3 > t2.MAX_BUFFER_SIZE ? t2.MAX_BUFFER_SIZE : i3; + } + fillViewportRows(e3) { + if (0 === this.lines.length) { + void 0 === e3 && (e3 = o.DEFAULT_ATTR_DATA); + let t3 = this._rows; + for (; t3--; ) this.lines.push(this.getBlankLine(e3)); + } + } + clear() { + this.ydisp = 0, this.ybase = 0, this.y = 0, this.x = 0, this.lines = new s2.CircularList(this._getCorrectBufferLength(this._rows)), this.scrollTop = 0, this.scrollBottom = this._rows - 1, this.setupTabStops(); + } + resize(e3, t3) { + const i3 = this.getNullCell(o.DEFAULT_ATTR_DATA); + let s3 = 0; + const r2 = this._getCorrectBufferLength(t3); + if (r2 > this.lines.maxLength && (this.lines.maxLength = r2), this.lines.length > 0) { + if (this._cols < e3) for (let t4 = 0; t4 < this.lines.length; t4++) s3 += +this.lines.get(t4).resize(e3, i3); + let n2 = 0; + if (this._rows < t3) for (let s4 = this._rows; s4 < t3; s4++) this.lines.length < t3 + this.ybase && (this._optionsService.rawOptions.windowsMode || void 0 !== this._optionsService.rawOptions.windowsPty.backend || void 0 !== this._optionsService.rawOptions.windowsPty.buildNumber ? this.lines.push(new o.BufferLine(e3, i3)) : this.ybase > 0 && this.lines.length <= this.ybase + this.y + n2 + 1 ? (this.ybase--, n2++, this.ydisp > 0 && this.ydisp--) : this.lines.push(new o.BufferLine(e3, i3))); + else for (let e4 = this._rows; e4 > t3; e4--) this.lines.length > t3 + this.ybase && (this.lines.length > this.ybase + this.y + 1 ? this.lines.pop() : (this.ybase++, this.ydisp++)); + if (r2 < this.lines.maxLength) { + const e4 = this.lines.length - r2; + e4 > 0 && (this.lines.trimStart(e4), this.ybase = Math.max(this.ybase - e4, 0), this.ydisp = Math.max(this.ydisp - e4, 0), this.savedY = Math.max(this.savedY - e4, 0)), this.lines.maxLength = r2; + } + this.x = Math.min(this.x, e3 - 1), this.y = Math.min(this.y, t3 - 1), n2 && (this.y += n2), this.savedX = Math.min(this.savedX, e3 - 1), this.scrollTop = 0; + } + if (this.scrollBottom = t3 - 1, this._isReflowEnabled && (this._reflow(e3, t3), this._cols > e3)) for (let t4 = 0; t4 < this.lines.length; t4++) s3 += +this.lines.get(t4).resize(e3, i3); + this._cols = e3, this._rows = t3, this._memoryCleanupQueue.clear(), s3 > 0.1 * this.lines.length && (this._memoryCleanupPosition = 0, this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup())); + } + _batchedMemoryCleanup() { + let e3 = true; + this._memoryCleanupPosition >= this.lines.length && (this._memoryCleanupPosition = 0, e3 = false); + let t3 = 0; + for (; this._memoryCleanupPosition < this.lines.length; ) if (t3 += this.lines.get(this._memoryCleanupPosition++).cleanupMemory(), t3 > 100) return true; + return e3; + } + get _isReflowEnabled() { + const e3 = this._optionsService.rawOptions.windowsPty; + return e3 && e3.buildNumber ? this._hasScrollback && "conpty" === e3.backend && e3.buildNumber >= 21376 : this._hasScrollback && !this._optionsService.rawOptions.windowsMode; + } + _reflow(e3, t3) { + this._cols !== e3 && (e3 > this._cols ? this._reflowLarger(e3, t3) : this._reflowSmaller(e3, t3)); + } + _reflowLarger(e3, t3) { + const i3 = (0, a.reflowLargerGetLinesToRemove)(this.lines, this._cols, e3, this.ybase + this.y, this.getNullCell(o.DEFAULT_ATTR_DATA)); + if (i3.length > 0) { + const s3 = (0, a.reflowLargerCreateNewLayout)(this.lines, i3); + (0, a.reflowLargerApplyNewLayout)(this.lines, s3.layout), this._reflowLargerAdjustViewport(e3, t3, s3.countRemoved); + } + } + _reflowLargerAdjustViewport(e3, t3, i3) { + const s3 = this.getNullCell(o.DEFAULT_ATTR_DATA); + let r2 = i3; + for (; r2-- > 0; ) 0 === this.ybase ? (this.y > 0 && this.y--, this.lines.length < t3 && this.lines.push(new o.BufferLine(e3, s3))) : (this.ydisp === this.ybase && this.ydisp--, this.ybase--); + this.savedY = Math.max(this.savedY - i3, 0); + } + _reflowSmaller(e3, t3) { + const i3 = this.getNullCell(o.DEFAULT_ATTR_DATA), s3 = []; + let r2 = 0; + for (let n2 = this.lines.length - 1; n2 >= 0; n2--) { + let h2 = this.lines.get(n2); + if (!h2 || !h2.isWrapped && h2.getTrimmedLength() <= e3) continue; + const c2 = [h2]; + for (; h2.isWrapped && n2 > 0; ) h2 = this.lines.get(--n2), c2.unshift(h2); + const l2 = this.ybase + this.y; + if (l2 >= n2 && l2 < n2 + c2.length) continue; + const d2 = c2[c2.length - 1].getTrimmedLength(), _ = (0, a.reflowSmallerGetNewLineLengths)(c2, this._cols, e3), u = _.length - c2.length; + let f; + f = 0 === this.ybase && this.y !== this.lines.length - 1 ? Math.max(0, this.y - this.lines.maxLength + u) : Math.max(0, this.lines.length - this.lines.maxLength + u); + const v = []; + for (let e4 = 0; e4 < u; e4++) { + const e5 = this.getBlankLine(o.DEFAULT_ATTR_DATA, true); + v.push(e5); + } + v.length > 0 && (s3.push({ start: n2 + c2.length + r2, newLines: v }), r2 += v.length), c2.push(...v); + let p = _.length - 1, g = _[p]; + 0 === g && (p--, g = _[p]); + let m = c2.length - u - 1, S = d2; + for (; m >= 0; ) { + const e4 = Math.min(S, g); + if (void 0 === c2[p]) break; + if (c2[p].copyCellsFrom(c2[m], S - e4, g - e4, e4, true), g -= e4, 0 === g && (p--, g = _[p]), S -= e4, 0 === S) { + m--; + const e5 = Math.max(m, 0); + S = (0, a.getWrappedLineTrimmedLength)(c2, e5, this._cols); + } + } + for (let t4 = 0; t4 < c2.length; t4++) _[t4] < e3 && c2[t4].setCell(_[t4], i3); + let C = u - f; + for (; C-- > 0; ) 0 === this.ybase ? this.y < t3 - 1 ? (this.y++, this.lines.pop()) : (this.ybase++, this.ydisp++) : this.ybase < Math.min(this.lines.maxLength, this.lines.length + r2) - t3 && (this.ybase === this.ydisp && this.ydisp++, this.ybase++); + this.savedY = Math.min(this.savedY + u, this.ybase + t3 - 1); + } + if (s3.length > 0) { + const e4 = [], t4 = []; + for (let e5 = 0; e5 < this.lines.length; e5++) t4.push(this.lines.get(e5)); + const i4 = this.lines.length; + let n2 = i4 - 1, o2 = 0, a2 = s3[o2]; + this.lines.length = Math.min(this.lines.maxLength, this.lines.length + r2); + let h2 = 0; + for (let c3 = Math.min(this.lines.maxLength - 1, i4 + r2 - 1); c3 >= 0; c3--) if (a2 && a2.start > n2 + h2) { + for (let e5 = a2.newLines.length - 1; e5 >= 0; e5--) this.lines.set(c3--, a2.newLines[e5]); + c3++, e4.push({ index: n2 + 1, amount: a2.newLines.length }), h2 += a2.newLines.length, a2 = s3[++o2]; + } else this.lines.set(c3, t4[n2--]); + let c2 = 0; + for (let t5 = e4.length - 1; t5 >= 0; t5--) e4[t5].index += c2, this.lines.onInsertEmitter.fire(e4[t5]), c2 += e4[t5].amount; + const l2 = Math.max(0, i4 + r2 - this.lines.maxLength); + l2 > 0 && this.lines.onTrimEmitter.fire(l2); + } + } + translateBufferLineToString(e3, t3, i3 = 0, s3) { + const r2 = this.lines.get(e3); + return r2 ? r2.translateToString(t3, i3, s3) : ""; + } + getWrappedRangeForLine(e3) { + let t3 = e3, i3 = e3; + for (; t3 > 0 && this.lines.get(t3).isWrapped; ) t3--; + for (; i3 + 1 < this.lines.length && this.lines.get(i3 + 1).isWrapped; ) i3++; + return { first: t3, last: i3 }; + } + setupTabStops(e3) { + for (null != e3 ? this.tabs[e3] || (e3 = this.prevStop(e3)) : (this.tabs = {}, e3 = 0); e3 < this._cols; e3 += this._optionsService.rawOptions.tabStopWidth) this.tabs[e3] = true; + } + prevStop(e3) { + for (null == e3 && (e3 = this.x); !this.tabs[--e3] && e3 > 0; ) ; + return e3 >= this._cols ? this._cols - 1 : e3 < 0 ? 0 : e3; + } + nextStop(e3) { + for (null == e3 && (e3 = this.x); !this.tabs[++e3] && e3 < this._cols; ) ; + return e3 >= this._cols ? this._cols - 1 : e3 < 0 ? 0 : e3; + } + clearMarkers(e3) { + this._isClearing = true; + for (let t3 = 0; t3 < this.markers.length; t3++) this.markers[t3].line === e3 && (this.markers[t3].dispose(), this.markers.splice(t3--, 1)); + this._isClearing = false; + } + clearAllMarkers() { + this._isClearing = true; + for (let e3 = 0; e3 < this.markers.length; e3++) this.markers[e3].dispose(), this.markers.splice(e3--, 1); + this._isClearing = false; + } + addMarker(e3) { + const t3 = new l.Marker(e3); + return this.markers.push(t3), t3.register(this.lines.onTrim((e4) => { + t3.line -= e4, t3.line < 0 && t3.dispose(); + })), t3.register(this.lines.onInsert((e4) => { + t3.line >= e4.index && (t3.line += e4.amount); + })), t3.register(this.lines.onDelete((e4) => { + t3.line >= e4.index && t3.line < e4.index + e4.amount && t3.dispose(), t3.line > e4.index && (t3.line -= e4.amount); + })), t3.register(t3.onDispose(() => this._removeMarker(t3))), t3; + } + _removeMarker(e3) { + this._isClearing || this.markers.splice(this.markers.indexOf(e3), 1); + } + }; + }, 8437: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferLine = t2.DEFAULT_ATTR_DATA = void 0; + const s2 = i2(3734), r = i2(511), n = i2(643), o = i2(482); + t2.DEFAULT_ATTR_DATA = Object.freeze(new s2.AttributeData()); + let a = 0; + class h { + constructor(e3, t3, i3 = false) { + this.isWrapped = i3, this._combined = {}, this._extendedAttrs = {}, this._data = new Uint32Array(3 * e3); + const s3 = t3 || r.CellData.fromCharData([0, n.NULL_CELL_CHAR, n.NULL_CELL_WIDTH, n.NULL_CELL_CODE]); + for (let t4 = 0; t4 < e3; ++t4) this.setCell(t4, s3); + this.length = e3; + } + get(e3) { + const t3 = this._data[3 * e3 + 0], i3 = 2097151 & t3; + return [this._data[3 * e3 + 1], 2097152 & t3 ? this._combined[e3] : i3 ? (0, o.stringFromCodePoint)(i3) : "", t3 >> 22, 2097152 & t3 ? this._combined[e3].charCodeAt(this._combined[e3].length - 1) : i3]; + } + set(e3, t3) { + this._data[3 * e3 + 1] = t3[n.CHAR_DATA_ATTR_INDEX], t3[n.CHAR_DATA_CHAR_INDEX].length > 1 ? (this._combined[e3] = t3[1], this._data[3 * e3 + 0] = 2097152 | e3 | t3[n.CHAR_DATA_WIDTH_INDEX] << 22) : this._data[3 * e3 + 0] = t3[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | t3[n.CHAR_DATA_WIDTH_INDEX] << 22; + } + getWidth(e3) { + return this._data[3 * e3 + 0] >> 22; + } + hasWidth(e3) { + return 12582912 & this._data[3 * e3 + 0]; + } + getFg(e3) { + return this._data[3 * e3 + 1]; + } + getBg(e3) { + return this._data[3 * e3 + 2]; + } + hasContent(e3) { + return 4194303 & this._data[3 * e3 + 0]; + } + getCodePoint(e3) { + const t3 = this._data[3 * e3 + 0]; + return 2097152 & t3 ? this._combined[e3].charCodeAt(this._combined[e3].length - 1) : 2097151 & t3; + } + isCombined(e3) { + return 2097152 & this._data[3 * e3 + 0]; + } + getString(e3) { + const t3 = this._data[3 * e3 + 0]; + return 2097152 & t3 ? this._combined[e3] : 2097151 & t3 ? (0, o.stringFromCodePoint)(2097151 & t3) : ""; + } + isProtected(e3) { + return 536870912 & this._data[3 * e3 + 2]; + } + loadCell(e3, t3) { + return a = 3 * e3, t3.content = this._data[a + 0], t3.fg = this._data[a + 1], t3.bg = this._data[a + 2], 2097152 & t3.content && (t3.combinedData = this._combined[e3]), 268435456 & t3.bg && (t3.extended = this._extendedAttrs[e3]), t3; + } + setCell(e3, t3) { + 2097152 & t3.content && (this._combined[e3] = t3.combinedData), 268435456 & t3.bg && (this._extendedAttrs[e3] = t3.extended), this._data[3 * e3 + 0] = t3.content, this._data[3 * e3 + 1] = t3.fg, this._data[3 * e3 + 2] = t3.bg; + } + setCellFromCodepoint(e3, t3, i3, s3) { + 268435456 & s3.bg && (this._extendedAttrs[e3] = s3.extended), this._data[3 * e3 + 0] = t3 | i3 << 22, this._data[3 * e3 + 1] = s3.fg, this._data[3 * e3 + 2] = s3.bg; + } + addCodepointToCell(e3, t3, i3) { + let s3 = this._data[3 * e3 + 0]; + 2097152 & s3 ? this._combined[e3] += (0, o.stringFromCodePoint)(t3) : 2097151 & s3 ? (this._combined[e3] = (0, o.stringFromCodePoint)(2097151 & s3) + (0, o.stringFromCodePoint)(t3), s3 &= -2097152, s3 |= 2097152) : s3 = t3 | 1 << 22, i3 && (s3 &= -12582913, s3 |= i3 << 22), this._data[3 * e3 + 0] = s3; + } + insertCells(e3, t3, i3) { + if ((e3 %= this.length) && 2 === this.getWidth(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), t3 < this.length - e3) { + const s3 = new r.CellData(); + for (let i4 = this.length - e3 - t3 - 1; i4 >= 0; --i4) this.setCell(e3 + t3 + i4, this.loadCell(e3 + i4, s3)); + for (let s4 = 0; s4 < t3; ++s4) this.setCell(e3 + s4, i3); + } else for (let t4 = e3; t4 < this.length; ++t4) this.setCell(t4, i3); + 2 === this.getWidth(this.length - 1) && this.setCellFromCodepoint(this.length - 1, 0, 1, i3); + } + deleteCells(e3, t3, i3) { + if (e3 %= this.length, t3 < this.length - e3) { + const s3 = new r.CellData(); + for (let i4 = 0; i4 < this.length - e3 - t3; ++i4) this.setCell(e3 + i4, this.loadCell(e3 + t3 + i4, s3)); + for (let e4 = this.length - t3; e4 < this.length; ++e4) this.setCell(e4, i3); + } else for (let t4 = e3; t4 < this.length; ++t4) this.setCell(t4, i3); + e3 && 2 === this.getWidth(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), 0 !== this.getWidth(e3) || this.hasContent(e3) || this.setCellFromCodepoint(e3, 0, 1, i3); + } + replaceCells(e3, t3, i3, s3 = false) { + if (s3) for (e3 && 2 === this.getWidth(e3 - 1) && !this.isProtected(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), t3 < this.length && 2 === this.getWidth(t3 - 1) && !this.isProtected(t3) && this.setCellFromCodepoint(t3, 0, 1, i3); e3 < t3 && e3 < this.length; ) this.isProtected(e3) || this.setCell(e3, i3), e3++; + else for (e3 && 2 === this.getWidth(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), t3 < this.length && 2 === this.getWidth(t3 - 1) && this.setCellFromCodepoint(t3, 0, 1, i3); e3 < t3 && e3 < this.length; ) this.setCell(e3++, i3); + } + resize(e3, t3) { + if (e3 === this.length) return 4 * this._data.length * 2 < this._data.buffer.byteLength; + const i3 = 3 * e3; + if (e3 > this.length) { + if (this._data.buffer.byteLength >= 4 * i3) this._data = new Uint32Array(this._data.buffer, 0, i3); + else { + const e4 = new Uint32Array(i3); + e4.set(this._data), this._data = e4; + } + for (let i4 = this.length; i4 < e3; ++i4) this.setCell(i4, t3); + } else { + this._data = this._data.subarray(0, i3); + const t4 = Object.keys(this._combined); + for (let i4 = 0; i4 < t4.length; i4++) { + const s4 = parseInt(t4[i4], 10); + s4 >= e3 && delete this._combined[s4]; + } + const s3 = Object.keys(this._extendedAttrs); + for (let t5 = 0; t5 < s3.length; t5++) { + const i4 = parseInt(s3[t5], 10); + i4 >= e3 && delete this._extendedAttrs[i4]; + } + } + return this.length = e3, 4 * i3 * 2 < this._data.buffer.byteLength; + } + cleanupMemory() { + if (4 * this._data.length * 2 < this._data.buffer.byteLength) { + const e3 = new Uint32Array(this._data.length); + return e3.set(this._data), this._data = e3, 1; + } + return 0; + } + fill(e3, t3 = false) { + if (t3) for (let t4 = 0; t4 < this.length; ++t4) this.isProtected(t4) || this.setCell(t4, e3); + else { + this._combined = {}, this._extendedAttrs = {}; + for (let t4 = 0; t4 < this.length; ++t4) this.setCell(t4, e3); + } + } + copyFrom(e3) { + this.length !== e3.length ? this._data = new Uint32Array(e3._data) : this._data.set(e3._data), this.length = e3.length, this._combined = {}; + for (const t3 in e3._combined) this._combined[t3] = e3._combined[t3]; + this._extendedAttrs = {}; + for (const t3 in e3._extendedAttrs) this._extendedAttrs[t3] = e3._extendedAttrs[t3]; + this.isWrapped = e3.isWrapped; + } + clone() { + const e3 = new h(0); + e3._data = new Uint32Array(this._data), e3.length = this.length; + for (const t3 in this._combined) e3._combined[t3] = this._combined[t3]; + for (const t3 in this._extendedAttrs) e3._extendedAttrs[t3] = this._extendedAttrs[t3]; + return e3.isWrapped = this.isWrapped, e3; + } + getTrimmedLength() { + for (let e3 = this.length - 1; e3 >= 0; --e3) if (4194303 & this._data[3 * e3 + 0]) return e3 + (this._data[3 * e3 + 0] >> 22); + return 0; + } + getNoBgTrimmedLength() { + for (let e3 = this.length - 1; e3 >= 0; --e3) if (4194303 & this._data[3 * e3 + 0] || 50331648 & this._data[3 * e3 + 2]) return e3 + (this._data[3 * e3 + 0] >> 22); + return 0; + } + copyCellsFrom(e3, t3, i3, s3, r2) { + const n2 = e3._data; + if (r2) for (let r3 = s3 - 1; r3 >= 0; r3--) { + for (let e4 = 0; e4 < 3; e4++) this._data[3 * (i3 + r3) + e4] = n2[3 * (t3 + r3) + e4]; + 268435456 & n2[3 * (t3 + r3) + 2] && (this._extendedAttrs[i3 + r3] = e3._extendedAttrs[t3 + r3]); + } + else for (let r3 = 0; r3 < s3; r3++) { + for (let e4 = 0; e4 < 3; e4++) this._data[3 * (i3 + r3) + e4] = n2[3 * (t3 + r3) + e4]; + 268435456 & n2[3 * (t3 + r3) + 2] && (this._extendedAttrs[i3 + r3] = e3._extendedAttrs[t3 + r3]); + } + const o2 = Object.keys(e3._combined); + for (let s4 = 0; s4 < o2.length; s4++) { + const r3 = parseInt(o2[s4], 10); + r3 >= t3 && (this._combined[r3 - t3 + i3] = e3._combined[r3]); + } + } + translateToString(e3, t3, i3, s3) { + t3 = t3 ?? 0, i3 = i3 ?? this.length, e3 && (i3 = Math.min(i3, this.getTrimmedLength())), s3 && (s3.length = 0); + let r2 = ""; + for (; t3 < i3; ) { + const e4 = this._data[3 * t3 + 0], i4 = 2097151 & e4, a2 = 2097152 & e4 ? this._combined[t3] : i4 ? (0, o.stringFromCodePoint)(i4) : n.WHITESPACE_CELL_CHAR; + if (r2 += a2, s3) for (let e5 = 0; e5 < a2.length; ++e5) s3.push(t3); + t3 += e4 >> 22 || 1; + } + return s3 && s3.push(t3), r2; + } + } + t2.BufferLine = h; + }, 4841: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.getRangeLength = void 0, t2.getRangeLength = function(e3, t3) { + if (e3.start.y > e3.end.y) throw new Error(`Buffer range end (${e3.end.x}, ${e3.end.y}) cannot be before start (${e3.start.x}, ${e3.start.y})`); + return t3 * (e3.end.y - e3.start.y) + (e3.end.x - e3.start.x + 1); + }; + }, 4634: (e2, t2) => { + function i2(e3, t3, i3) { + if (t3 === e3.length - 1) return e3[t3].getTrimmedLength(); + const s2 = !e3[t3].hasContent(i3 - 1) && 1 === e3[t3].getWidth(i3 - 1), r = 2 === e3[t3 + 1].getWidth(0); + return s2 && r ? i3 - 1 : i3; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getWrappedLineTrimmedLength = t2.reflowSmallerGetNewLineLengths = t2.reflowLargerApplyNewLayout = t2.reflowLargerCreateNewLayout = t2.reflowLargerGetLinesToRemove = void 0, t2.reflowLargerGetLinesToRemove = function(e3, t3, s2, r, n) { + const o = []; + for (let a = 0; a < e3.length - 1; a++) { + let h = a, c = e3.get(++h); + if (!c.isWrapped) continue; + const l = [e3.get(a)]; + for (; h < e3.length && c.isWrapped; ) l.push(c), c = e3.get(++h); + if (r >= a && r < h) { + a += l.length - 1; + continue; + } + let d = 0, _ = i2(l, d, t3), u = 1, f = 0; + for (; u < l.length; ) { + const e4 = i2(l, u, t3), r2 = e4 - f, o2 = s2 - _, a2 = Math.min(r2, o2); + l[d].copyCellsFrom(l[u], f, _, a2, false), _ += a2, _ === s2 && (d++, _ = 0), f += a2, f === e4 && (u++, f = 0), 0 === _ && 0 !== d && 2 === l[d - 1].getWidth(s2 - 1) && (l[d].copyCellsFrom(l[d - 1], s2 - 1, _++, 1, false), l[d - 1].setCell(s2 - 1, n)); + } + l[d].replaceCells(_, s2, n); + let v = 0; + for (let e4 = l.length - 1; e4 > 0 && (e4 > d || 0 === l[e4].getTrimmedLength()); e4--) v++; + v > 0 && (o.push(a + l.length - v), o.push(v)), a += l.length - 1; + } + return o; + }, t2.reflowLargerCreateNewLayout = function(e3, t3) { + const i3 = []; + let s2 = 0, r = t3[s2], n = 0; + for (let o = 0; o < e3.length; o++) if (r === o) { + const i4 = t3[++s2]; + e3.onDeleteEmitter.fire({ index: o - n, amount: i4 }), o += i4 - 1, n += i4, r = t3[++s2]; + } else i3.push(o); + return { layout: i3, countRemoved: n }; + }, t2.reflowLargerApplyNewLayout = function(e3, t3) { + const i3 = []; + for (let s2 = 0; s2 < t3.length; s2++) i3.push(e3.get(t3[s2])); + for (let t4 = 0; t4 < i3.length; t4++) e3.set(t4, i3[t4]); + e3.length = t3.length; + }, t2.reflowSmallerGetNewLineLengths = function(e3, t3, s2) { + const r = [], n = e3.map((s3, r2) => i2(e3, r2, t3)).reduce((e4, t4) => e4 + t4); + let o = 0, a = 0, h = 0; + for (; h < n; ) { + if (n - h < s2) { + r.push(n - h); + break; + } + o += s2; + const c = i2(e3, a, t3); + o > c && (o -= c, a++); + const l = 2 === e3[a].getWidth(o - 1); + l && o--; + const d = l ? s2 - 1 : s2; + r.push(d), h += d; + } + return r; + }, t2.getWrappedLineTrimmedLength = i2; + }, 5295: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferSet = void 0; + const s2 = i2(8460), r = i2(844), n = i2(9092); + class o extends r.Disposable { + constructor(e3, t3) { + super(), this._optionsService = e3, this._bufferService = t3, this._onBufferActivate = this.register(new s2.EventEmitter()), this.onBufferActivate = this._onBufferActivate.event, this.reset(), this.register(this._optionsService.onSpecificOptionChange("scrollback", () => this.resize(this._bufferService.cols, this._bufferService.rows))), this.register(this._optionsService.onSpecificOptionChange("tabStopWidth", () => this.setupTabStops())); + } + reset() { + this._normal = new n.Buffer(true, this._optionsService, this._bufferService), this._normal.fillViewportRows(), this._alt = new n.Buffer(false, this._optionsService, this._bufferService), this._activeBuffer = this._normal, this._onBufferActivate.fire({ activeBuffer: this._normal, inactiveBuffer: this._alt }), this.setupTabStops(); + } + get alt() { + return this._alt; + } + get active() { + return this._activeBuffer; + } + get normal() { + return this._normal; + } + activateNormalBuffer() { + this._activeBuffer !== this._normal && (this._normal.x = this._alt.x, this._normal.y = this._alt.y, this._alt.clearAllMarkers(), this._alt.clear(), this._activeBuffer = this._normal, this._onBufferActivate.fire({ activeBuffer: this._normal, inactiveBuffer: this._alt })); + } + activateAltBuffer(e3) { + this._activeBuffer !== this._alt && (this._alt.fillViewportRows(e3), this._alt.x = this._normal.x, this._alt.y = this._normal.y, this._activeBuffer = this._alt, this._onBufferActivate.fire({ activeBuffer: this._alt, inactiveBuffer: this._normal })); + } + resize(e3, t3) { + this._normal.resize(e3, t3), this._alt.resize(e3, t3), this.setupTabStops(e3); + } + setupTabStops(e3) { + this._normal.setupTabStops(e3), this._alt.setupTabStops(e3); + } + } + t2.BufferSet = o; + }, 511: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellData = void 0; + const s2 = i2(482), r = i2(643), n = i2(3734); + class o extends n.AttributeData { + constructor() { + super(...arguments), this.content = 0, this.fg = 0, this.bg = 0, this.extended = new n.ExtendedAttrs(), this.combinedData = ""; + } + static fromCharData(e3) { + const t3 = new o(); + return t3.setFromCharData(e3), t3; + } + isCombined() { + return 2097152 & this.content; + } + getWidth() { + return this.content >> 22; + } + getChars() { + return 2097152 & this.content ? this.combinedData : 2097151 & this.content ? (0, s2.stringFromCodePoint)(2097151 & this.content) : ""; + } + getCode() { + return this.isCombined() ? this.combinedData.charCodeAt(this.combinedData.length - 1) : 2097151 & this.content; + } + setFromCharData(e3) { + this.fg = e3[r.CHAR_DATA_ATTR_INDEX], this.bg = 0; + let t3 = false; + if (e3[r.CHAR_DATA_CHAR_INDEX].length > 2) t3 = true; + else if (2 === e3[r.CHAR_DATA_CHAR_INDEX].length) { + const i3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0); + if (55296 <= i3 && i3 <= 56319) { + const s3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1); + 56320 <= s3 && s3 <= 57343 ? this.content = 1024 * (i3 - 55296) + s3 - 56320 + 65536 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22 : t3 = true; + } else t3 = true; + } else this.content = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | e3[r.CHAR_DATA_WIDTH_INDEX] << 22; + t3 && (this.combinedData = e3[r.CHAR_DATA_CHAR_INDEX], this.content = 2097152 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.CellData = o; + }, 643: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WHITESPACE_CELL_CODE = t2.WHITESPACE_CELL_WIDTH = t2.WHITESPACE_CELL_CHAR = t2.NULL_CELL_CODE = t2.NULL_CELL_WIDTH = t2.NULL_CELL_CHAR = t2.CHAR_DATA_CODE_INDEX = t2.CHAR_DATA_WIDTH_INDEX = t2.CHAR_DATA_CHAR_INDEX = t2.CHAR_DATA_ATTR_INDEX = t2.DEFAULT_EXT = t2.DEFAULT_ATTR = t2.DEFAULT_COLOR = void 0, t2.DEFAULT_COLOR = 0, t2.DEFAULT_ATTR = 256 | t2.DEFAULT_COLOR << 9, t2.DEFAULT_EXT = 0, t2.CHAR_DATA_ATTR_INDEX = 0, t2.CHAR_DATA_CHAR_INDEX = 1, t2.CHAR_DATA_WIDTH_INDEX = 2, t2.CHAR_DATA_CODE_INDEX = 3, t2.NULL_CELL_CHAR = "", t2.NULL_CELL_WIDTH = 1, t2.NULL_CELL_CODE = 0, t2.WHITESPACE_CELL_CHAR = " ", t2.WHITESPACE_CELL_WIDTH = 1, t2.WHITESPACE_CELL_CODE = 32; + }, 4863: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Marker = void 0; + const s2 = i2(8460), r = i2(844); + class n { + get id() { + return this._id; + } + constructor(e3) { + this.line = e3, this.isDisposed = false, this._disposables = [], this._id = n._nextId++, this._onDispose = this.register(new s2.EventEmitter()), this.onDispose = this._onDispose.event; + } + dispose() { + this.isDisposed || (this.isDisposed = true, this.line = -1, this._onDispose.fire(), (0, r.disposeArray)(this._disposables), this._disposables.length = 0); + } + register(e3) { + return this._disposables.push(e3), e3; + } + } + t2.Marker = n, n._nextId = 1; + }, 7116: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DEFAULT_CHARSET = t2.CHARSETS = void 0, t2.CHARSETS = {}, t2.DEFAULT_CHARSET = t2.CHARSETS.B, t2.CHARSETS[0] = { "`": "◆", a: "▒", b: "␉", c: "␌", d: "␍", e: "␊", f: "°", g: "±", h: "␤", i: "␋", j: "┘", k: "┐", l: "┌", m: "└", n: "┼", o: "⎺", p: "⎻", q: "─", r: "⎼", s: "⎽", t: "├", u: "┤", v: "┴", w: "┬", x: "│", y: "≤", z: "≥", "{": "π", "|": "≠", "}": "£", "~": "·" }, t2.CHARSETS.A = { "#": "£" }, t2.CHARSETS.B = void 0, t2.CHARSETS[4] = { "#": "£", "@": "¾", "[": "ij", "\\": "½", "]": "|", "{": "¨", "|": "f", "}": "¼", "~": "´" }, t2.CHARSETS.C = t2.CHARSETS[5] = { "[": "Ä", "\\": "Ö", "]": "Å", "^": "Ü", "`": "é", "{": "ä", "|": "ö", "}": "å", "~": "ü" }, t2.CHARSETS.R = { "#": "£", "@": "à", "[": "°", "\\": "ç", "]": "§", "{": "é", "|": "ù", "}": "è", "~": "¨" }, t2.CHARSETS.Q = { "@": "à", "[": "â", "\\": "ç", "]": "ê", "^": "î", "`": "ô", "{": "é", "|": "ù", "}": "è", "~": "û" }, t2.CHARSETS.K = { "@": "§", "[": "Ä", "\\": "Ö", "]": "Ü", "{": "ä", "|": "ö", "}": "ü", "~": "ß" }, t2.CHARSETS.Y = { "#": "£", "@": "§", "[": "°", "\\": "ç", "]": "é", "`": "ù", "{": "à", "|": "ò", "}": "è", "~": "ì" }, t2.CHARSETS.E = t2.CHARSETS[6] = { "@": "Ä", "[": "Æ", "\\": "Ø", "]": "Å", "^": "Ü", "`": "ä", "{": "æ", "|": "ø", "}": "å", "~": "ü" }, t2.CHARSETS.Z = { "#": "£", "@": "§", "[": "¡", "\\": "Ñ", "]": "¿", "{": "°", "|": "ñ", "}": "ç" }, t2.CHARSETS.H = t2.CHARSETS[7] = { "@": "É", "[": "Ä", "\\": "Ö", "]": "Å", "^": "Ü", "`": "é", "{": "ä", "|": "ö", "}": "å", "~": "ü" }, t2.CHARSETS["="] = { "#": "ù", "@": "à", "[": "é", "\\": "ç", "]": "ê", "^": "î", _: "è", "`": "ô", "{": "ä", "|": "ö", "}": "ü", "~": "û" }; + }, 2584: (e2, t2) => { + var i2, s2, r; + Object.defineProperty(t2, "__esModule", { value: true }), t2.C1_ESCAPED = t2.C1 = t2.C0 = void 0, function(e3) { + e3.NUL = "\0", e3.SOH = "", e3.STX = "", e3.ETX = "", e3.EOT = "", e3.ENQ = "", e3.ACK = "", e3.BEL = "\x07", e3.BS = "\b", e3.HT = " ", e3.LF = "\n", e3.VT = "\v", e3.FF = "\f", e3.CR = "\r", e3.SO = "", e3.SI = "", e3.DLE = "", e3.DC1 = "", e3.DC2 = "", e3.DC3 = "", e3.DC4 = "", e3.NAK = "", e3.SYN = "", e3.ETB = "", e3.CAN = "", e3.EM = "", e3.SUB = "", e3.ESC = "\x1B", e3.FS = "", e3.GS = "", e3.RS = "", e3.US = "", e3.SP = " ", e3.DEL = ""; + }(i2 || (t2.C0 = i2 = {})), function(e3) { + e3.PAD = "€", e3.HOP = "", e3.BPH = "‚", e3.NBH = "ƒ", e3.IND = "„", e3.NEL = "…", e3.SSA = "†", e3.ESA = "‡", e3.HTS = "ˆ", e3.HTJ = "‰", e3.VTS = "Š", e3.PLD = "‹", e3.PLU = "Œ", e3.RI = "", e3.SS2 = "Ž", e3.SS3 = "", e3.DCS = "", e3.PU1 = "‘", e3.PU2 = "’", e3.STS = "“", e3.CCH = "”", e3.MW = "•", e3.SPA = "–", e3.EPA = "—", e3.SOS = "˜", e3.SGCI = "™", e3.SCI = "š", e3.CSI = "›", e3.ST = "œ", e3.OSC = "", e3.PM = "ž", e3.APC = "Ÿ"; + }(s2 || (t2.C1 = s2 = {})), function(e3) { + e3.ST = `${i2.ESC}\\`; + }(r || (t2.C1_ESCAPED = r = {})); + }, 7399: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.evaluateKeyboardEvent = void 0; + const s2 = i2(2584), r = { 48: ["0", ")"], 49: ["1", "!"], 50: ["2", "@"], 51: ["3", "#"], 52: ["4", "$"], 53: ["5", "%"], 54: ["6", "^"], 55: ["7", "&"], 56: ["8", "*"], 57: ["9", "("], 186: [";", ":"], 187: ["=", "+"], 188: [",", "<"], 189: ["-", "_"], 190: [".", ">"], 191: ["/", "?"], 192: ["`", "~"], 219: ["[", "{"], 220: ["\\", "|"], 221: ["]", "}"], 222: ["'", '"'] }; + t2.evaluateKeyboardEvent = function(e3, t3, i3, n) { + const o = { type: 0, cancel: false, key: void 0 }, a = (e3.shiftKey ? 1 : 0) | (e3.altKey ? 2 : 0) | (e3.ctrlKey ? 4 : 0) | (e3.metaKey ? 8 : 0); + switch (e3.keyCode) { + case 0: + "UIKeyInputUpArrow" === e3.key ? o.key = t3 ? s2.C0.ESC + "OA" : s2.C0.ESC + "[A" : "UIKeyInputLeftArrow" === e3.key ? o.key = t3 ? s2.C0.ESC + "OD" : s2.C0.ESC + "[D" : "UIKeyInputRightArrow" === e3.key ? o.key = t3 ? s2.C0.ESC + "OC" : s2.C0.ESC + "[C" : "UIKeyInputDownArrow" === e3.key && (o.key = t3 ? s2.C0.ESC + "OB" : s2.C0.ESC + "[B"); + break; + case 8: + o.key = e3.ctrlKey ? "\b" : s2.C0.DEL, e3.altKey && (o.key = s2.C0.ESC + o.key); + break; + case 9: + if (e3.shiftKey) { + o.key = s2.C0.ESC + "[Z"; + break; + } + o.key = s2.C0.HT, o.cancel = true; + break; + case 13: + o.key = e3.altKey ? s2.C0.ESC + s2.C0.CR : s2.C0.CR, o.cancel = true; + break; + case 27: + o.key = s2.C0.ESC, e3.altKey && (o.key = s2.C0.ESC + s2.C0.ESC), o.cancel = true; + break; + case 37: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "D", o.key === s2.C0.ESC + "[1;3D" && (o.key = s2.C0.ESC + (i3 ? "b" : "[1;5D"))) : o.key = t3 ? s2.C0.ESC + "OD" : s2.C0.ESC + "[D"; + break; + case 39: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "C", o.key === s2.C0.ESC + "[1;3C" && (o.key = s2.C0.ESC + (i3 ? "f" : "[1;5C"))) : o.key = t3 ? s2.C0.ESC + "OC" : s2.C0.ESC + "[C"; + break; + case 38: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "A", i3 || o.key !== s2.C0.ESC + "[1;3A" || (o.key = s2.C0.ESC + "[1;5A")) : o.key = t3 ? s2.C0.ESC + "OA" : s2.C0.ESC + "[A"; + break; + case 40: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "B", i3 || o.key !== s2.C0.ESC + "[1;3B" || (o.key = s2.C0.ESC + "[1;5B")) : o.key = t3 ? s2.C0.ESC + "OB" : s2.C0.ESC + "[B"; + break; + case 45: + e3.shiftKey || e3.ctrlKey || (o.key = s2.C0.ESC + "[2~"); + break; + case 46: + o.key = a ? s2.C0.ESC + "[3;" + (a + 1) + "~" : s2.C0.ESC + "[3~"; + break; + case 36: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "H" : t3 ? s2.C0.ESC + "OH" : s2.C0.ESC + "[H"; + break; + case 35: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "F" : t3 ? s2.C0.ESC + "OF" : s2.C0.ESC + "[F"; + break; + case 33: + e3.shiftKey ? o.type = 2 : e3.ctrlKey ? o.key = s2.C0.ESC + "[5;" + (a + 1) + "~" : o.key = s2.C0.ESC + "[5~"; + break; + case 34: + e3.shiftKey ? o.type = 3 : e3.ctrlKey ? o.key = s2.C0.ESC + "[6;" + (a + 1) + "~" : o.key = s2.C0.ESC + "[6~"; + break; + case 112: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "P" : s2.C0.ESC + "OP"; + break; + case 113: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "Q" : s2.C0.ESC + "OQ"; + break; + case 114: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "R" : s2.C0.ESC + "OR"; + break; + case 115: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "S" : s2.C0.ESC + "OS"; + break; + case 116: + o.key = a ? s2.C0.ESC + "[15;" + (a + 1) + "~" : s2.C0.ESC + "[15~"; + break; + case 117: + o.key = a ? s2.C0.ESC + "[17;" + (a + 1) + "~" : s2.C0.ESC + "[17~"; + break; + case 118: + o.key = a ? s2.C0.ESC + "[18;" + (a + 1) + "~" : s2.C0.ESC + "[18~"; + break; + case 119: + o.key = a ? s2.C0.ESC + "[19;" + (a + 1) + "~" : s2.C0.ESC + "[19~"; + break; + case 120: + o.key = a ? s2.C0.ESC + "[20;" + (a + 1) + "~" : s2.C0.ESC + "[20~"; + break; + case 121: + o.key = a ? s2.C0.ESC + "[21;" + (a + 1) + "~" : s2.C0.ESC + "[21~"; + break; + case 122: + o.key = a ? s2.C0.ESC + "[23;" + (a + 1) + "~" : s2.C0.ESC + "[23~"; + break; + case 123: + o.key = a ? s2.C0.ESC + "[24;" + (a + 1) + "~" : s2.C0.ESC + "[24~"; + break; + default: + if (!e3.ctrlKey || e3.shiftKey || e3.altKey || e3.metaKey) if (i3 && !n || !e3.altKey || e3.metaKey) !i3 || e3.altKey || e3.ctrlKey || e3.shiftKey || !e3.metaKey ? e3.key && !e3.ctrlKey && !e3.altKey && !e3.metaKey && e3.keyCode >= 48 && 1 === e3.key.length ? o.key = e3.key : e3.key && e3.ctrlKey && ("_" === e3.key && (o.key = s2.C0.US), "@" === e3.key && (o.key = s2.C0.NUL)) : 65 === e3.keyCode && (o.type = 1); + else { + const t4 = r[e3.keyCode], i4 = t4 == null ? void 0 : t4[e3.shiftKey ? 1 : 0]; + if (i4) o.key = s2.C0.ESC + i4; + else if (e3.keyCode >= 65 && e3.keyCode <= 90) { + const t5 = e3.ctrlKey ? e3.keyCode - 64 : e3.keyCode + 32; + let i5 = String.fromCharCode(t5); + e3.shiftKey && (i5 = i5.toUpperCase()), o.key = s2.C0.ESC + i5; + } else if (32 === e3.keyCode) o.key = s2.C0.ESC + (e3.ctrlKey ? s2.C0.NUL : " "); + else if ("Dead" === e3.key && e3.code.startsWith("Key")) { + let t5 = e3.code.slice(3, 4); + e3.shiftKey || (t5 = t5.toLowerCase()), o.key = s2.C0.ESC + t5, o.cancel = true; + } + } + else e3.keyCode >= 65 && e3.keyCode <= 90 ? o.key = String.fromCharCode(e3.keyCode - 64) : 32 === e3.keyCode ? o.key = s2.C0.NUL : e3.keyCode >= 51 && e3.keyCode <= 55 ? o.key = String.fromCharCode(e3.keyCode - 51 + 27) : 56 === e3.keyCode ? o.key = s2.C0.DEL : 219 === e3.keyCode ? o.key = s2.C0.ESC : 220 === e3.keyCode ? o.key = s2.C0.FS : 221 === e3.keyCode && (o.key = s2.C0.GS); + } + return o; + }; + }, 482: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Utf8ToUtf32 = t2.StringToUtf32 = t2.utf32ToString = t2.stringFromCodePoint = void 0, t2.stringFromCodePoint = function(e3) { + return e3 > 65535 ? (e3 -= 65536, String.fromCharCode(55296 + (e3 >> 10)) + String.fromCharCode(e3 % 1024 + 56320)) : String.fromCharCode(e3); + }, t2.utf32ToString = function(e3, t3 = 0, i2 = e3.length) { + let s2 = ""; + for (let r = t3; r < i2; ++r) { + let t4 = e3[r]; + t4 > 65535 ? (t4 -= 65536, s2 += String.fromCharCode(55296 + (t4 >> 10)) + String.fromCharCode(t4 % 1024 + 56320)) : s2 += String.fromCharCode(t4); + } + return s2; + }, t2.StringToUtf32 = class { + constructor() { + this._interim = 0; + } + clear() { + this._interim = 0; + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2 = 0, r = 0; + if (this._interim) { + const i3 = e3.charCodeAt(r++); + 56320 <= i3 && i3 <= 57343 ? t3[s2++] = 1024 * (this._interim - 55296) + i3 - 56320 + 65536 : (t3[s2++] = this._interim, t3[s2++] = i3), this._interim = 0; + } + for (let n = r; n < i2; ++n) { + const r2 = e3.charCodeAt(n); + if (55296 <= r2 && r2 <= 56319) { + if (++n >= i2) return this._interim = r2, s2; + const o = e3.charCodeAt(n); + 56320 <= o && o <= 57343 ? t3[s2++] = 1024 * (r2 - 55296) + o - 56320 + 65536 : (t3[s2++] = r2, t3[s2++] = o); + } else 65279 !== r2 && (t3[s2++] = r2); + } + return s2; + } + }, t2.Utf8ToUtf32 = class { + constructor() { + this.interim = new Uint8Array(3); + } + clear() { + this.interim.fill(0); + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2, r, n, o, a = 0, h = 0, c = 0; + if (this.interim[0]) { + let s3 = false, r2 = this.interim[0]; + r2 &= 192 == (224 & r2) ? 31 : 224 == (240 & r2) ? 15 : 7; + let n2, o2 = 0; + for (; (n2 = 63 & this.interim[++o2]) && o2 < 4; ) r2 <<= 6, r2 |= n2; + const h2 = 192 == (224 & this.interim[0]) ? 2 : 224 == (240 & this.interim[0]) ? 3 : 4, l2 = h2 - o2; + for (; c < l2; ) { + if (c >= i2) return 0; + if (n2 = e3[c++], 128 != (192 & n2)) { + c--, s3 = true; + break; + } + this.interim[o2++] = n2, r2 <<= 6, r2 |= 63 & n2; + } + s3 || (2 === h2 ? r2 < 128 ? c-- : t3[a++] = r2 : 3 === h2 ? r2 < 2048 || r2 >= 55296 && r2 <= 57343 || 65279 === r2 || (t3[a++] = r2) : r2 < 65536 || r2 > 1114111 || (t3[a++] = r2)), this.interim.fill(0); + } + const l = i2 - 4; + let d = c; + for (; d < i2; ) { + for (; !(!(d < l) || 128 & (s2 = e3[d]) || 128 & (r = e3[d + 1]) || 128 & (n = e3[d + 2]) || 128 & (o = e3[d + 3])); ) t3[a++] = s2, t3[a++] = r, t3[a++] = n, t3[a++] = o, d += 4; + if (s2 = e3[d++], s2 < 128) t3[a++] = s2; + else if (192 == (224 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (h = (31 & s2) << 6 | 63 & r, h < 128) { + d--; + continue; + } + t3[a++] = h; + } else if (224 == (240 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (h = (15 & s2) << 12 | (63 & r) << 6 | 63 & n, h < 2048 || h >= 55296 && h <= 57343 || 65279 === h) continue; + t3[a++] = h; + } else if (240 == (248 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, this.interim[2] = n, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (h = (7 & s2) << 18 | (63 & r) << 12 | (63 & n) << 6 | 63 & o, h < 65536 || h > 1114111) continue; + t3[a++] = h; + } + } + return a; + } + }; + }, 225: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeV6 = void 0; + const s2 = i2(1480), r = [[768, 879], [1155, 1158], [1160, 1161], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1536, 1539], [1552, 1557], [1611, 1630], [1648, 1648], [1750, 1764], [1767, 1768], [1770, 1773], [1807, 1807], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2305, 2306], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2388], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2672, 2673], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2883], [2893, 2893], [2902, 2902], [2946, 2946], [3008, 3008], [3021, 3021], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3393, 3395], [3405, 3405], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3769], [3771, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3984, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4146], [4150, 4151], [4153, 4153], [4184, 4185], [4448, 4607], [4959, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6157], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7616, 7626], [7678, 7679], [8203, 8207], [8234, 8238], [8288, 8291], [8298, 8303], [8400, 8431], [12330, 12335], [12441, 12442], [43014, 43014], [43019, 43019], [43045, 43046], [64286, 64286], [65024, 65039], [65056, 65059], [65279, 65279], [65529, 65531]], n = [[68097, 68099], [68101, 68102], [68108, 68111], [68152, 68154], [68159, 68159], [119143, 119145], [119155, 119170], [119173, 119179], [119210, 119213], [119362, 119364], [917505, 917505], [917536, 917631], [917760, 917999]]; + let o; + t2.UnicodeV6 = class { + constructor() { + if (this.version = "6", !o) { + o = new Uint8Array(65536), o.fill(1), o[0] = 0, o.fill(0, 1, 32), o.fill(0, 127, 160), o.fill(2, 4352, 4448), o[9001] = 2, o[9002] = 2, o.fill(2, 11904, 42192), o[12351] = 1, o.fill(2, 44032, 55204), o.fill(2, 63744, 64256), o.fill(2, 65040, 65050), o.fill(2, 65072, 65136), o.fill(2, 65280, 65377), o.fill(2, 65504, 65511); + for (let e3 = 0; e3 < r.length; ++e3) o.fill(0, r[e3][0], r[e3][1] + 1); + } + } + wcwidth(e3) { + return e3 < 32 ? 0 : e3 < 127 ? 1 : e3 < 65536 ? o[e3] : function(e4, t3) { + let i3, s3 = 0, r2 = t3.length - 1; + if (e4 < t3[0][0] || e4 > t3[r2][1]) return false; + for (; r2 >= s3; ) if (i3 = s3 + r2 >> 1, e4 > t3[i3][1]) s3 = i3 + 1; + else { + if (!(e4 < t3[i3][0])) return true; + r2 = i3 - 1; + } + return false; + }(e3, n) ? 0 : e3 >= 131072 && e3 <= 196605 || e3 >= 196608 && e3 <= 262141 ? 2 : 1; + } + charProperties(e3, t3) { + let i3 = this.wcwidth(e3), r2 = 0 === i3 && 0 !== t3; + if (r2) { + const e4 = s2.UnicodeService.extractWidth(t3); + 0 === e4 ? r2 = false : e4 > i3 && (i3 = e4); + } + return s2.UnicodeService.createPropertyValue(0, i3, r2); + } + }; + }, 5981: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WriteBuffer = void 0; + const s2 = i2(8460), r = i2(844); + class n extends r.Disposable { + constructor(e3) { + super(), this._action = e3, this._writeBuffer = [], this._callbacks = [], this._pendingData = 0, this._bufferOffset = 0, this._isSyncWriting = false, this._syncCalls = 0, this._didUserInput = false, this._onWriteParsed = this.register(new s2.EventEmitter()), this.onWriteParsed = this._onWriteParsed.event; + } + handleUserInput() { + this._didUserInput = true; + } + writeSync(e3, t3) { + if (void 0 !== t3 && this._syncCalls > t3) return void (this._syncCalls = 0); + if (this._pendingData += e3.length, this._writeBuffer.push(e3), this._callbacks.push(void 0), this._syncCalls++, this._isSyncWriting) return; + let i3; + for (this._isSyncWriting = true; i3 = this._writeBuffer.shift(); ) { + this._action(i3); + const e4 = this._callbacks.shift(); + e4 && e4(); + } + this._pendingData = 0, this._bufferOffset = 2147483647, this._isSyncWriting = false, this._syncCalls = 0; + } + write(e3, t3) { + if (this._pendingData > 5e7) throw new Error("write data discarded, use flow control to avoid losing data"); + if (!this._writeBuffer.length) { + if (this._bufferOffset = 0, this._didUserInput) return this._didUserInput = false, this._pendingData += e3.length, this._writeBuffer.push(e3), this._callbacks.push(t3), void this._innerWrite(); + setTimeout(() => this._innerWrite()); + } + this._pendingData += e3.length, this._writeBuffer.push(e3), this._callbacks.push(t3); + } + _innerWrite(e3 = 0, t3 = true) { + const i3 = e3 || Date.now(); + for (; this._writeBuffer.length > this._bufferOffset; ) { + const e4 = this._writeBuffer[this._bufferOffset], s3 = this._action(e4, t3); + if (s3) { + const e5 = (e6) => Date.now() - i3 >= 12 ? setTimeout(() => this._innerWrite(0, e6)) : this._innerWrite(i3, e6); + return void s3.catch((e6) => (queueMicrotask(() => { + throw e6; + }), Promise.resolve(false))).then(e5); + } + const r2 = this._callbacks[this._bufferOffset]; + if (r2 && r2(), this._bufferOffset++, this._pendingData -= e4.length, Date.now() - i3 >= 12) break; + } + this._writeBuffer.length > this._bufferOffset ? (this._bufferOffset > 50 && (this._writeBuffer = this._writeBuffer.slice(this._bufferOffset), this._callbacks = this._callbacks.slice(this._bufferOffset), this._bufferOffset = 0), setTimeout(() => this._innerWrite())) : (this._writeBuffer.length = 0, this._callbacks.length = 0, this._pendingData = 0, this._bufferOffset = 0), this._onWriteParsed.fire(); + } + } + t2.WriteBuffer = n; + }, 5941: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.toRgbString = t2.parseColor = void 0; + const i2 = /^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/, s2 = /^[\da-f]+$/; + function r(e3, t3) { + const i3 = e3.toString(16), s3 = i3.length < 2 ? "0" + i3 : i3; + switch (t3) { + case 4: + return i3[0]; + case 8: + return s3; + case 12: + return (s3 + s3).slice(0, 3); + default: + return s3 + s3; + } + } + t2.parseColor = function(e3) { + if (!e3) return; + let t3 = e3.toLowerCase(); + if (0 === t3.indexOf("rgb:")) { + t3 = t3.slice(4); + const e4 = i2.exec(t3); + if (e4) { + const t4 = e4[1] ? 15 : e4[4] ? 255 : e4[7] ? 4095 : 65535; + return [Math.round(parseInt(e4[1] || e4[4] || e4[7] || e4[10], 16) / t4 * 255), Math.round(parseInt(e4[2] || e4[5] || e4[8] || e4[11], 16) / t4 * 255), Math.round(parseInt(e4[3] || e4[6] || e4[9] || e4[12], 16) / t4 * 255)]; + } + } else if (0 === t3.indexOf("#") && (t3 = t3.slice(1), s2.exec(t3) && [3, 6, 9, 12].includes(t3.length))) { + const e4 = t3.length / 3, i3 = [0, 0, 0]; + for (let s3 = 0; s3 < 3; ++s3) { + const r2 = parseInt(t3.slice(e4 * s3, e4 * s3 + e4), 16); + i3[s3] = 1 === e4 ? r2 << 4 : 2 === e4 ? r2 : 3 === e4 ? r2 >> 4 : r2 >> 8; + } + return i3; + } + }, t2.toRgbString = function(e3, t3 = 16) { + const [i3, s3, n] = e3; + return `rgb:${r(i3, t3)}/${r(s3, t3)}/${r(n, t3)}`; + }; + }, 5770: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.PAYLOAD_LIMIT = void 0, t2.PAYLOAD_LIMIT = 1e7; + }, 6351: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DcsHandler = t2.DcsParser = void 0; + const s2 = i2(482), r = i2(8742), n = i2(5770), o = []; + t2.DcsParser = class { + constructor() { + this._handlers = /* @__PURE__ */ Object.create(null), this._active = o, this._ident = 0, this._handlerFb = () => { + }, this._stack = { paused: false, loopPosition: 0, fallThrough: false }; + } + dispose() { + this._handlers = /* @__PURE__ */ Object.create(null), this._handlerFb = () => { + }, this._active = o; + } + registerHandler(e3, t3) { + void 0 === this._handlers[e3] && (this._handlers[e3] = []); + const i3 = this._handlers[e3]; + return i3.push(t3), { dispose: () => { + const e4 = i3.indexOf(t3); + -1 !== e4 && i3.splice(e4, 1); + } }; + } + clearHandler(e3) { + this._handlers[e3] && delete this._handlers[e3]; + } + setHandlerFallback(e3) { + this._handlerFb = e3; + } + reset() { + if (this._active.length) for (let e3 = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; e3 >= 0; --e3) this._active[e3].unhook(false); + this._stack.paused = false, this._active = o, this._ident = 0; + } + hook(e3, t3) { + if (this.reset(), this._ident = e3, this._active = this._handlers[e3] || o, this._active.length) for (let e4 = this._active.length - 1; e4 >= 0; e4--) this._active[e4].hook(t3); + else this._handlerFb(this._ident, "HOOK", t3); + } + put(e3, t3, i3) { + if (this._active.length) for (let s3 = this._active.length - 1; s3 >= 0; s3--) this._active[s3].put(e3, t3, i3); + else this._handlerFb(this._ident, "PUT", (0, s2.utf32ToString)(e3, t3, i3)); + } + unhook(e3, t3 = true) { + if (this._active.length) { + let i3 = false, s3 = this._active.length - 1, r2 = false; + if (this._stack.paused && (s3 = this._stack.loopPosition - 1, i3 = t3, r2 = this._stack.fallThrough, this._stack.paused = false), !r2 && false === i3) { + for (; s3 >= 0 && (i3 = this._active[s3].unhook(e3), true !== i3); s3--) if (i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = false, i3; + s3--; + } + for (; s3 >= 0; s3--) if (i3 = this._active[s3].unhook(false), i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = true, i3; + } else this._handlerFb(this._ident, "UNHOOK", e3); + this._active = o, this._ident = 0; + } + }; + const a = new r.Params(); + a.addParam(0), t2.DcsHandler = class { + constructor(e3) { + this._handler = e3, this._data = "", this._params = a, this._hitLimit = false; + } + hook(e3) { + this._params = e3.length > 1 || e3.params[0] ? e3.clone() : a, this._data = "", this._hitLimit = false; + } + put(e3, t3, i3) { + this._hitLimit || (this._data += (0, s2.utf32ToString)(e3, t3, i3), this._data.length > n.PAYLOAD_LIMIT && (this._data = "", this._hitLimit = true)); + } + unhook(e3) { + let t3 = false; + if (this._hitLimit) t3 = false; + else if (e3 && (t3 = this._handler(this._data, this._params), t3 instanceof Promise)) return t3.then((e4) => (this._params = a, this._data = "", this._hitLimit = false, e4)); + return this._params = a, this._data = "", this._hitLimit = false, t3; + } + }; + }, 2015: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.EscapeSequenceParser = t2.VT500_TRANSITION_TABLE = t2.TransitionTable = void 0; + const s2 = i2(844), r = i2(8742), n = i2(6242), o = i2(6351); + class a { + constructor(e3) { + this.table = new Uint8Array(e3); + } + setDefault(e3, t3) { + this.table.fill(e3 << 4 | t3); + } + add(e3, t3, i3, s3) { + this.table[t3 << 8 | e3] = i3 << 4 | s3; + } + addMany(e3, t3, i3, s3) { + for (let r2 = 0; r2 < e3.length; r2++) this.table[t3 << 8 | e3[r2]] = i3 << 4 | s3; + } + } + t2.TransitionTable = a; + const h = 160; + t2.VT500_TRANSITION_TABLE = function() { + const e3 = new a(4095), t3 = Array.apply(null, Array(256)).map((e4, t4) => t4), i3 = (e4, i4) => t3.slice(e4, i4), s3 = i3(32, 127), r2 = i3(0, 24); + r2.push(25), r2.push.apply(r2, i3(28, 32)); + const n2 = i3(0, 14); + let o2; + for (o2 in e3.setDefault(1, 0), e3.addMany(s3, 0, 2, 0), n2) e3.addMany([24, 26, 153, 154], o2, 3, 0), e3.addMany(i3(128, 144), o2, 3, 0), e3.addMany(i3(144, 152), o2, 3, 0), e3.add(156, o2, 0, 0), e3.add(27, o2, 11, 1), e3.add(157, o2, 4, 8), e3.addMany([152, 158, 159], o2, 0, 7), e3.add(155, o2, 11, 3), e3.add(144, o2, 11, 9); + return e3.addMany(r2, 0, 3, 0), e3.addMany(r2, 1, 3, 1), e3.add(127, 1, 0, 1), e3.addMany(r2, 8, 0, 8), e3.addMany(r2, 3, 3, 3), e3.add(127, 3, 0, 3), e3.addMany(r2, 4, 3, 4), e3.add(127, 4, 0, 4), e3.addMany(r2, 6, 3, 6), e3.addMany(r2, 5, 3, 5), e3.add(127, 5, 0, 5), e3.addMany(r2, 2, 3, 2), e3.add(127, 2, 0, 2), e3.add(93, 1, 4, 8), e3.addMany(s3, 8, 5, 8), e3.add(127, 8, 5, 8), e3.addMany([156, 27, 24, 26, 7], 8, 6, 0), e3.addMany(i3(28, 32), 8, 0, 8), e3.addMany([88, 94, 95], 1, 0, 7), e3.addMany(s3, 7, 0, 7), e3.addMany(r2, 7, 0, 7), e3.add(156, 7, 0, 0), e3.add(127, 7, 0, 7), e3.add(91, 1, 11, 3), e3.addMany(i3(64, 127), 3, 7, 0), e3.addMany(i3(48, 60), 3, 8, 4), e3.addMany([60, 61, 62, 63], 3, 9, 4), e3.addMany(i3(48, 60), 4, 8, 4), e3.addMany(i3(64, 127), 4, 7, 0), e3.addMany([60, 61, 62, 63], 4, 0, 6), e3.addMany(i3(32, 64), 6, 0, 6), e3.add(127, 6, 0, 6), e3.addMany(i3(64, 127), 6, 0, 0), e3.addMany(i3(32, 48), 3, 9, 5), e3.addMany(i3(32, 48), 5, 9, 5), e3.addMany(i3(48, 64), 5, 0, 6), e3.addMany(i3(64, 127), 5, 7, 0), e3.addMany(i3(32, 48), 4, 9, 5), e3.addMany(i3(32, 48), 1, 9, 2), e3.addMany(i3(32, 48), 2, 9, 2), e3.addMany(i3(48, 127), 2, 10, 0), e3.addMany(i3(48, 80), 1, 10, 0), e3.addMany(i3(81, 88), 1, 10, 0), e3.addMany([89, 90, 92], 1, 10, 0), e3.addMany(i3(96, 127), 1, 10, 0), e3.add(80, 1, 11, 9), e3.addMany(r2, 9, 0, 9), e3.add(127, 9, 0, 9), e3.addMany(i3(28, 32), 9, 0, 9), e3.addMany(i3(32, 48), 9, 9, 12), e3.addMany(i3(48, 60), 9, 8, 10), e3.addMany([60, 61, 62, 63], 9, 9, 10), e3.addMany(r2, 11, 0, 11), e3.addMany(i3(32, 128), 11, 0, 11), e3.addMany(i3(28, 32), 11, 0, 11), e3.addMany(r2, 10, 0, 10), e3.add(127, 10, 0, 10), e3.addMany(i3(28, 32), 10, 0, 10), e3.addMany(i3(48, 60), 10, 8, 10), e3.addMany([60, 61, 62, 63], 10, 0, 11), e3.addMany(i3(32, 48), 10, 9, 12), e3.addMany(r2, 12, 0, 12), e3.add(127, 12, 0, 12), e3.addMany(i3(28, 32), 12, 0, 12), e3.addMany(i3(32, 48), 12, 9, 12), e3.addMany(i3(48, 64), 12, 0, 11), e3.addMany(i3(64, 127), 12, 12, 13), e3.addMany(i3(64, 127), 10, 12, 13), e3.addMany(i3(64, 127), 9, 12, 13), e3.addMany(r2, 13, 13, 13), e3.addMany(s3, 13, 13, 13), e3.add(127, 13, 0, 13), e3.addMany([27, 156, 24, 26], 13, 14, 0), e3.add(h, 0, 2, 0), e3.add(h, 8, 5, 8), e3.add(h, 6, 0, 6), e3.add(h, 11, 0, 11), e3.add(h, 13, 13, 13), e3; + }(); + class c extends s2.Disposable { + constructor(e3 = t2.VT500_TRANSITION_TABLE) { + super(), this._transitions = e3, this._parseStack = { state: 0, handlers: [], handlerPos: 0, transition: 0, chunkPos: 0 }, this.initialState = 0, this.currentState = this.initialState, this._params = new r.Params(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0, this._printHandlerFb = (e4, t3, i3) => { + }, this._executeHandlerFb = (e4) => { + }, this._csiHandlerFb = (e4, t3) => { + }, this._escHandlerFb = (e4) => { + }, this._errorHandlerFb = (e4) => e4, this._printHandler = this._printHandlerFb, this._executeHandlers = /* @__PURE__ */ Object.create(null), this._csiHandlers = /* @__PURE__ */ Object.create(null), this._escHandlers = /* @__PURE__ */ Object.create(null), this.register((0, s2.toDisposable)(() => { + this._csiHandlers = /* @__PURE__ */ Object.create(null), this._executeHandlers = /* @__PURE__ */ Object.create(null), this._escHandlers = /* @__PURE__ */ Object.create(null); + })), this._oscParser = this.register(new n.OscParser()), this._dcsParser = this.register(new o.DcsParser()), this._errorHandler = this._errorHandlerFb, this.registerEscHandler({ final: "\\" }, () => true); + } + _identifier(e3, t3 = [64, 126]) { + let i3 = 0; + if (e3.prefix) { + if (e3.prefix.length > 1) throw new Error("only one byte as prefix supported"); + if (i3 = e3.prefix.charCodeAt(0), i3 && 60 > i3 || i3 > 63) throw new Error("prefix must be in range 0x3c .. 0x3f"); + } + if (e3.intermediates) { + if (e3.intermediates.length > 2) throw new Error("only two bytes as intermediates are supported"); + for (let t4 = 0; t4 < e3.intermediates.length; ++t4) { + const s4 = e3.intermediates.charCodeAt(t4); + if (32 > s4 || s4 > 47) throw new Error("intermediate must be in range 0x20 .. 0x2f"); + i3 <<= 8, i3 |= s4; + } + } + if (1 !== e3.final.length) throw new Error("final must be a single byte"); + const s3 = e3.final.charCodeAt(0); + if (t3[0] > s3 || s3 > t3[1]) throw new Error(`final must be in range ${t3[0]} .. ${t3[1]}`); + return i3 <<= 8, i3 |= s3, i3; + } + identToString(e3) { + const t3 = []; + for (; e3; ) t3.push(String.fromCharCode(255 & e3)), e3 >>= 8; + return t3.reverse().join(""); + } + setPrintHandler(e3) { + this._printHandler = e3; + } + clearPrintHandler() { + this._printHandler = this._printHandlerFb; + } + registerEscHandler(e3, t3) { + const i3 = this._identifier(e3, [48, 126]); + void 0 === this._escHandlers[i3] && (this._escHandlers[i3] = []); + const s3 = this._escHandlers[i3]; + return s3.push(t3), { dispose: () => { + const e4 = s3.indexOf(t3); + -1 !== e4 && s3.splice(e4, 1); + } }; + } + clearEscHandler(e3) { + this._escHandlers[this._identifier(e3, [48, 126])] && delete this._escHandlers[this._identifier(e3, [48, 126])]; + } + setEscHandlerFallback(e3) { + this._escHandlerFb = e3; + } + setExecuteHandler(e3, t3) { + this._executeHandlers[e3.charCodeAt(0)] = t3; + } + clearExecuteHandler(e3) { + this._executeHandlers[e3.charCodeAt(0)] && delete this._executeHandlers[e3.charCodeAt(0)]; + } + setExecuteHandlerFallback(e3) { + this._executeHandlerFb = e3; + } + registerCsiHandler(e3, t3) { + const i3 = this._identifier(e3); + void 0 === this._csiHandlers[i3] && (this._csiHandlers[i3] = []); + const s3 = this._csiHandlers[i3]; + return s3.push(t3), { dispose: () => { + const e4 = s3.indexOf(t3); + -1 !== e4 && s3.splice(e4, 1); + } }; + } + clearCsiHandler(e3) { + this._csiHandlers[this._identifier(e3)] && delete this._csiHandlers[this._identifier(e3)]; + } + setCsiHandlerFallback(e3) { + this._csiHandlerFb = e3; + } + registerDcsHandler(e3, t3) { + return this._dcsParser.registerHandler(this._identifier(e3), t3); + } + clearDcsHandler(e3) { + this._dcsParser.clearHandler(this._identifier(e3)); + } + setDcsHandlerFallback(e3) { + this._dcsParser.setHandlerFallback(e3); + } + registerOscHandler(e3, t3) { + return this._oscParser.registerHandler(e3, t3); + } + clearOscHandler(e3) { + this._oscParser.clearHandler(e3); + } + setOscHandlerFallback(e3) { + this._oscParser.setHandlerFallback(e3); + } + setErrorHandler(e3) { + this._errorHandler = e3; + } + clearErrorHandler() { + this._errorHandler = this._errorHandlerFb; + } + reset() { + this.currentState = this.initialState, this._oscParser.reset(), this._dcsParser.reset(), this._params.reset(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0, 0 !== this._parseStack.state && (this._parseStack.state = 2, this._parseStack.handlers = []); + } + _preserveStack(e3, t3, i3, s3, r2) { + this._parseStack.state = e3, this._parseStack.handlers = t3, this._parseStack.handlerPos = i3, this._parseStack.transition = s3, this._parseStack.chunkPos = r2; + } + parse(e3, t3, i3) { + let s3, r2 = 0, n2 = 0, o2 = 0; + if (this._parseStack.state) if (2 === this._parseStack.state) this._parseStack.state = 0, o2 = this._parseStack.chunkPos + 1; + else { + if (void 0 === i3 || 1 === this._parseStack.state) throw this._parseStack.state = 1, new Error("improper continuation due to previous async handler, giving up parsing"); + const t4 = this._parseStack.handlers; + let n3 = this._parseStack.handlerPos - 1; + switch (this._parseStack.state) { + case 3: + if (false === i3 && n3 > -1) { + for (; n3 >= 0 && (s3 = t4[n3](this._params), true !== s3); n3--) if (s3 instanceof Promise) return this._parseStack.handlerPos = n3, s3; + } + this._parseStack.handlers = []; + break; + case 4: + if (false === i3 && n3 > -1) { + for (; n3 >= 0 && (s3 = t4[n3](), true !== s3); n3--) if (s3 instanceof Promise) return this._parseStack.handlerPos = n3, s3; + } + this._parseStack.handlers = []; + break; + case 6: + if (r2 = e3[this._parseStack.chunkPos], s3 = this._dcsParser.unhook(24 !== r2 && 26 !== r2, i3), s3) return s3; + 27 === r2 && (this._parseStack.transition |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0; + break; + case 5: + if (r2 = e3[this._parseStack.chunkPos], s3 = this._oscParser.end(24 !== r2 && 26 !== r2, i3), s3) return s3; + 27 === r2 && (this._parseStack.transition |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0; + } + this._parseStack.state = 0, o2 = this._parseStack.chunkPos + 1, this.precedingJoinState = 0, this.currentState = 15 & this._parseStack.transition; + } + for (let i4 = o2; i4 < t3; ++i4) { + switch (r2 = e3[i4], n2 = this._transitions.table[this.currentState << 8 | (r2 < 160 ? r2 : h)], n2 >> 4) { + case 2: + for (let s4 = i4 + 1; ; ++s4) { + if (s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + if (++s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + if (++s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + if (++s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + } + break; + case 3: + this._executeHandlers[r2] ? this._executeHandlers[r2]() : this._executeHandlerFb(r2), this.precedingJoinState = 0; + break; + case 0: + break; + case 1: + if (this._errorHandler({ position: i4, code: r2, currentState: this.currentState, collect: this._collect, params: this._params, abort: false }).abort) return; + break; + case 7: + const o3 = this._csiHandlers[this._collect << 8 | r2]; + let a2 = o3 ? o3.length - 1 : -1; + for (; a2 >= 0 && (s3 = o3[a2](this._params), true !== s3); a2--) if (s3 instanceof Promise) return this._preserveStack(3, o3, a2, n2, i4), s3; + a2 < 0 && this._csiHandlerFb(this._collect << 8 | r2, this._params), this.precedingJoinState = 0; + break; + case 8: + do { + switch (r2) { + case 59: + this._params.addParam(0); + break; + case 58: + this._params.addSubParam(-1); + break; + default: + this._params.addDigit(r2 - 48); + } + } while (++i4 < t3 && (r2 = e3[i4]) > 47 && r2 < 60); + i4--; + break; + case 9: + this._collect <<= 8, this._collect |= r2; + break; + case 10: + const c2 = this._escHandlers[this._collect << 8 | r2]; + let l = c2 ? c2.length - 1 : -1; + for (; l >= 0 && (s3 = c2[l](), true !== s3); l--) if (s3 instanceof Promise) return this._preserveStack(4, c2, l, n2, i4), s3; + l < 0 && this._escHandlerFb(this._collect << 8 | r2), this.precedingJoinState = 0; + break; + case 11: + this._params.reset(), this._params.addParam(0), this._collect = 0; + break; + case 12: + this._dcsParser.hook(this._collect << 8 | r2, this._params); + break; + case 13: + for (let s4 = i4 + 1; ; ++s4) if (s4 >= t3 || 24 === (r2 = e3[s4]) || 26 === r2 || 27 === r2 || r2 > 127 && r2 < h) { + this._dcsParser.put(e3, i4, s4), i4 = s4 - 1; + break; + } + break; + case 14: + if (s3 = this._dcsParser.unhook(24 !== r2 && 26 !== r2), s3) return this._preserveStack(6, [], 0, n2, i4), s3; + 27 === r2 && (n2 |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0; + break; + case 4: + this._oscParser.start(); + break; + case 5: + for (let s4 = i4 + 1; ; s4++) if (s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 127 && r2 < h) { + this._oscParser.put(e3, i4, s4), i4 = s4 - 1; + break; + } + break; + case 6: + if (s3 = this._oscParser.end(24 !== r2 && 26 !== r2), s3) return this._preserveStack(5, [], 0, n2, i4), s3; + 27 === r2 && (n2 |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0; + } + this.currentState = 15 & n2; + } + } + } + t2.EscapeSequenceParser = c; + }, 6242: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.OscHandler = t2.OscParser = void 0; + const s2 = i2(5770), r = i2(482), n = []; + t2.OscParser = class { + constructor() { + this._state = 0, this._active = n, this._id = -1, this._handlers = /* @__PURE__ */ Object.create(null), this._handlerFb = () => { + }, this._stack = { paused: false, loopPosition: 0, fallThrough: false }; + } + registerHandler(e3, t3) { + void 0 === this._handlers[e3] && (this._handlers[e3] = []); + const i3 = this._handlers[e3]; + return i3.push(t3), { dispose: () => { + const e4 = i3.indexOf(t3); + -1 !== e4 && i3.splice(e4, 1); + } }; + } + clearHandler(e3) { + this._handlers[e3] && delete this._handlers[e3]; + } + setHandlerFallback(e3) { + this._handlerFb = e3; + } + dispose() { + this._handlers = /* @__PURE__ */ Object.create(null), this._handlerFb = () => { + }, this._active = n; + } + reset() { + if (2 === this._state) for (let e3 = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; e3 >= 0; --e3) this._active[e3].end(false); + this._stack.paused = false, this._active = n, this._id = -1, this._state = 0; + } + _start() { + if (this._active = this._handlers[this._id] || n, this._active.length) for (let e3 = this._active.length - 1; e3 >= 0; e3--) this._active[e3].start(); + else this._handlerFb(this._id, "START"); + } + _put(e3, t3, i3) { + if (this._active.length) for (let s3 = this._active.length - 1; s3 >= 0; s3--) this._active[s3].put(e3, t3, i3); + else this._handlerFb(this._id, "PUT", (0, r.utf32ToString)(e3, t3, i3)); + } + start() { + this.reset(), this._state = 1; + } + put(e3, t3, i3) { + if (3 !== this._state) { + if (1 === this._state) for (; t3 < i3; ) { + const i4 = e3[t3++]; + if (59 === i4) { + this._state = 2, this._start(); + break; + } + if (i4 < 48 || 57 < i4) return void (this._state = 3); + -1 === this._id && (this._id = 0), this._id = 10 * this._id + i4 - 48; + } + 2 === this._state && i3 - t3 > 0 && this._put(e3, t3, i3); + } + } + end(e3, t3 = true) { + if (0 !== this._state) { + if (3 !== this._state) if (1 === this._state && this._start(), this._active.length) { + let i3 = false, s3 = this._active.length - 1, r2 = false; + if (this._stack.paused && (s3 = this._stack.loopPosition - 1, i3 = t3, r2 = this._stack.fallThrough, this._stack.paused = false), !r2 && false === i3) { + for (; s3 >= 0 && (i3 = this._active[s3].end(e3), true !== i3); s3--) if (i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = false, i3; + s3--; + } + for (; s3 >= 0; s3--) if (i3 = this._active[s3].end(false), i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = true, i3; + } else this._handlerFb(this._id, "END", e3); + this._active = n, this._id = -1, this._state = 0; + } + } + }, t2.OscHandler = class { + constructor(e3) { + this._handler = e3, this._data = "", this._hitLimit = false; + } + start() { + this._data = "", this._hitLimit = false; + } + put(e3, t3, i3) { + this._hitLimit || (this._data += (0, r.utf32ToString)(e3, t3, i3), this._data.length > s2.PAYLOAD_LIMIT && (this._data = "", this._hitLimit = true)); + } + end(e3) { + let t3 = false; + if (this._hitLimit) t3 = false; + else if (e3 && (t3 = this._handler(this._data), t3 instanceof Promise)) return t3.then((e4) => (this._data = "", this._hitLimit = false, e4)); + return this._data = "", this._hitLimit = false, t3; + } + }; + }, 8742: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Params = void 0; + const i2 = 2147483647; + class s2 { + static fromArray(e3) { + const t3 = new s2(); + if (!e3.length) return t3; + for (let i3 = Array.isArray(e3[0]) ? 1 : 0; i3 < e3.length; ++i3) { + const s3 = e3[i3]; + if (Array.isArray(s3)) for (let e4 = 0; e4 < s3.length; ++e4) t3.addSubParam(s3[e4]); + else t3.addParam(s3); + } + return t3; + } + constructor(e3 = 32, t3 = 32) { + if (this.maxLength = e3, this.maxSubParamsLength = t3, t3 > 256) throw new Error("maxSubParamsLength must not be greater than 256"); + this.params = new Int32Array(e3), this.length = 0, this._subParams = new Int32Array(t3), this._subParamsLength = 0, this._subParamsIdx = new Uint16Array(e3), this._rejectDigits = false, this._rejectSubDigits = false, this._digitIsSub = false; + } + clone() { + const e3 = new s2(this.maxLength, this.maxSubParamsLength); + return e3.params.set(this.params), e3.length = this.length, e3._subParams.set(this._subParams), e3._subParamsLength = this._subParamsLength, e3._subParamsIdx.set(this._subParamsIdx), e3._rejectDigits = this._rejectDigits, e3._rejectSubDigits = this._rejectSubDigits, e3._digitIsSub = this._digitIsSub, e3; + } + toArray() { + const e3 = []; + for (let t3 = 0; t3 < this.length; ++t3) { + e3.push(this.params[t3]); + const i3 = this._subParamsIdx[t3] >> 8, s3 = 255 & this._subParamsIdx[t3]; + s3 - i3 > 0 && e3.push(Array.prototype.slice.call(this._subParams, i3, s3)); + } + return e3; + } + reset() { + this.length = 0, this._subParamsLength = 0, this._rejectDigits = false, this._rejectSubDigits = false, this._digitIsSub = false; + } + addParam(e3) { + if (this._digitIsSub = false, this.length >= this.maxLength) this._rejectDigits = true; + else { + if (e3 < -1) throw new Error("values lesser than -1 are not allowed"); + this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength, this.params[this.length++] = e3 > i2 ? i2 : e3; + } + } + addSubParam(e3) { + if (this._digitIsSub = true, this.length) if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) this._rejectSubDigits = true; + else { + if (e3 < -1) throw new Error("values lesser than -1 are not allowed"); + this._subParams[this._subParamsLength++] = e3 > i2 ? i2 : e3, this._subParamsIdx[this.length - 1]++; + } + } + hasSubParams(e3) { + return (255 & this._subParamsIdx[e3]) - (this._subParamsIdx[e3] >> 8) > 0; + } + getSubParams(e3) { + const t3 = this._subParamsIdx[e3] >> 8, i3 = 255 & this._subParamsIdx[e3]; + return i3 - t3 > 0 ? this._subParams.subarray(t3, i3) : null; + } + getSubParamsAll() { + const e3 = {}; + for (let t3 = 0; t3 < this.length; ++t3) { + const i3 = this._subParamsIdx[t3] >> 8, s3 = 255 & this._subParamsIdx[t3]; + s3 - i3 > 0 && (e3[t3] = this._subParams.slice(i3, s3)); + } + return e3; + } + addDigit(e3) { + let t3; + if (this._rejectDigits || !(t3 = this._digitIsSub ? this._subParamsLength : this.length) || this._digitIsSub && this._rejectSubDigits) return; + const s3 = this._digitIsSub ? this._subParams : this.params, r = s3[t3 - 1]; + s3[t3 - 1] = ~r ? Math.min(10 * r + e3, i2) : e3; + } + } + t2.Params = s2; + }, 5741: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.AddonManager = void 0, t2.AddonManager = class { + constructor() { + this._addons = []; + } + dispose() { + for (let e3 = this._addons.length - 1; e3 >= 0; e3--) this._addons[e3].instance.dispose(); + } + loadAddon(e3, t3) { + const i2 = { instance: t3, dispose: t3.dispose, isDisposed: false }; + this._addons.push(i2), t3.dispose = () => this._wrappedAddonDispose(i2), t3.activate(e3); + } + _wrappedAddonDispose(e3) { + if (e3.isDisposed) return; + let t3 = -1; + for (let i2 = 0; i2 < this._addons.length; i2++) if (this._addons[i2] === e3) { + t3 = i2; + break; + } + if (-1 === t3) throw new Error("Could not dispose an addon that has not been loaded"); + e3.isDisposed = true, e3.dispose.apply(e3.instance), this._addons.splice(t3, 1); + } + }; + }, 8771: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferApiView = void 0; + const s2 = i2(3785), r = i2(511); + t2.BufferApiView = class { + constructor(e3, t3) { + this._buffer = e3, this.type = t3; + } + init(e3) { + return this._buffer = e3, this; + } + get cursorY() { + return this._buffer.y; + } + get cursorX() { + return this._buffer.x; + } + get viewportY() { + return this._buffer.ydisp; + } + get baseY() { + return this._buffer.ybase; + } + get length() { + return this._buffer.lines.length; + } + getLine(e3) { + const t3 = this._buffer.lines.get(e3); + if (t3) return new s2.BufferLineApiView(t3); + } + getNullCell() { + return new r.CellData(); + } + }; + }, 3785: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferLineApiView = void 0; + const s2 = i2(511); + t2.BufferLineApiView = class { + constructor(e3) { + this._line = e3; + } + get isWrapped() { + return this._line.isWrapped; + } + get length() { + return this._line.length; + } + getCell(e3, t3) { + if (!(e3 < 0 || e3 >= this._line.length)) return t3 ? (this._line.loadCell(e3, t3), t3) : this._line.loadCell(e3, new s2.CellData()); + } + translateToString(e3, t3, i3) { + return this._line.translateToString(e3, t3, i3); + } + }; + }, 8285: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferNamespaceApi = void 0; + const s2 = i2(8771), r = i2(8460), n = i2(844); + class o extends n.Disposable { + constructor(e3) { + super(), this._core = e3, this._onBufferChange = this.register(new r.EventEmitter()), this.onBufferChange = this._onBufferChange.event, this._normal = new s2.BufferApiView(this._core.buffers.normal, "normal"), this._alternate = new s2.BufferApiView(this._core.buffers.alt, "alternate"), this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)); + } + get active() { + if (this._core.buffers.active === this._core.buffers.normal) return this.normal; + if (this._core.buffers.active === this._core.buffers.alt) return this.alternate; + throw new Error("Active buffer is neither normal nor alternate"); + } + get normal() { + return this._normal.init(this._core.buffers.normal); + } + get alternate() { + return this._alternate.init(this._core.buffers.alt); + } + } + t2.BufferNamespaceApi = o; + }, 7975: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ParserApi = void 0, t2.ParserApi = class { + constructor(e3) { + this._core = e3; + } + registerCsiHandler(e3, t3) { + return this._core.registerCsiHandler(e3, (e4) => t3(e4.toArray())); + } + addCsiHandler(e3, t3) { + return this.registerCsiHandler(e3, t3); + } + registerDcsHandler(e3, t3) { + return this._core.registerDcsHandler(e3, (e4, i2) => t3(e4, i2.toArray())); + } + addDcsHandler(e3, t3) { + return this.registerDcsHandler(e3, t3); + } + registerEscHandler(e3, t3) { + return this._core.registerEscHandler(e3, t3); + } + addEscHandler(e3, t3) { + return this.registerEscHandler(e3, t3); + } + registerOscHandler(e3, t3) { + return this._core.registerOscHandler(e3, t3); + } + addOscHandler(e3, t3) { + return this.registerOscHandler(e3, t3); + } + }; + }, 7090: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeApi = void 0, t2.UnicodeApi = class { + constructor(e3) { + this._core = e3; + } + register(e3) { + this._core.unicodeService.register(e3); + } + get versions() { + return this._core.unicodeService.versions; + } + get activeVersion() { + return this._core.unicodeService.activeVersion; + } + set activeVersion(e3) { + this._core.unicodeService.activeVersion = e3; + } + }; + }, 744: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferService = t2.MINIMUM_ROWS = t2.MINIMUM_COLS = void 0; + const n = i2(8460), o = i2(844), a = i2(5295), h = i2(2585); + t2.MINIMUM_COLS = 2, t2.MINIMUM_ROWS = 1; + let c = t2.BufferService = class extends o.Disposable { + get buffer() { + return this.buffers.active; + } + constructor(e3) { + super(), this.isUserScrolling = false, this._onResize = this.register(new n.EventEmitter()), this.onResize = this._onResize.event, this._onScroll = this.register(new n.EventEmitter()), this.onScroll = this._onScroll.event, this.cols = Math.max(e3.rawOptions.cols || 0, t2.MINIMUM_COLS), this.rows = Math.max(e3.rawOptions.rows || 0, t2.MINIMUM_ROWS), this.buffers = this.register(new a.BufferSet(e3, this)); + } + resize(e3, t3) { + this.cols = e3, this.rows = t3, this.buffers.resize(e3, t3), this._onResize.fire({ cols: e3, rows: t3 }); + } + reset() { + this.buffers.reset(), this.isUserScrolling = false; + } + scroll(e3, t3 = false) { + const i3 = this.buffer; + let s3; + s3 = this._cachedBlankLine, s3 && s3.length === this.cols && s3.getFg(0) === e3.fg && s3.getBg(0) === e3.bg || (s3 = i3.getBlankLine(e3, t3), this._cachedBlankLine = s3), s3.isWrapped = t3; + const r2 = i3.ybase + i3.scrollTop, n2 = i3.ybase + i3.scrollBottom; + if (0 === i3.scrollTop) { + const e4 = i3.lines.isFull; + n2 === i3.lines.length - 1 ? e4 ? i3.lines.recycle().copyFrom(s3) : i3.lines.push(s3.clone()) : i3.lines.splice(n2 + 1, 0, s3.clone()), e4 ? this.isUserScrolling && (i3.ydisp = Math.max(i3.ydisp - 1, 0)) : (i3.ybase++, this.isUserScrolling || i3.ydisp++); + } else { + const e4 = n2 - r2 + 1; + i3.lines.shiftElements(r2 + 1, e4 - 1, -1), i3.lines.set(n2, s3.clone()); + } + this.isUserScrolling || (i3.ydisp = i3.ybase), this._onScroll.fire(i3.ydisp); + } + scrollLines(e3, t3, i3) { + const s3 = this.buffer; + if (e3 < 0) { + if (0 === s3.ydisp) return; + this.isUserScrolling = true; + } else e3 + s3.ydisp >= s3.ybase && (this.isUserScrolling = false); + const r2 = s3.ydisp; + s3.ydisp = Math.max(Math.min(s3.ydisp + e3, s3.ybase), 0), r2 !== s3.ydisp && (t3 || this._onScroll.fire(s3.ydisp)); + } + }; + t2.BufferService = c = s2([r(0, h.IOptionsService)], c); + }, 7994: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharsetService = void 0, t2.CharsetService = class { + constructor() { + this.glevel = 0, this._charsets = []; + } + reset() { + this.charset = void 0, this._charsets = [], this.glevel = 0; + } + setgLevel(e3) { + this.glevel = e3, this.charset = this._charsets[e3]; + } + setgCharset(e3, t3) { + this._charsets[e3] = t3, this.glevel === e3 && (this.charset = t3); + } + }; + }, 1753: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreMouseService = void 0; + const n = i2(2585), o = i2(8460), a = i2(844), h = { NONE: { events: 0, restrict: () => false }, X10: { events: 1, restrict: (e3) => 4 !== e3.button && 1 === e3.action && (e3.ctrl = false, e3.alt = false, e3.shift = false, true) }, VT200: { events: 19, restrict: (e3) => 32 !== e3.action }, DRAG: { events: 23, restrict: (e3) => 32 !== e3.action || 3 !== e3.button }, ANY: { events: 31, restrict: (e3) => true } }; + function c(e3, t3) { + let i3 = (e3.ctrl ? 16 : 0) | (e3.shift ? 4 : 0) | (e3.alt ? 8 : 0); + return 4 === e3.button ? (i3 |= 64, i3 |= e3.action) : (i3 |= 3 & e3.button, 4 & e3.button && (i3 |= 64), 8 & e3.button && (i3 |= 128), 32 === e3.action ? i3 |= 32 : 0 !== e3.action || t3 || (i3 |= 3)), i3; + } + const l = String.fromCharCode, d = { DEFAULT: (e3) => { + const t3 = [c(e3, false) + 32, e3.col + 32, e3.row + 32]; + return t3[0] > 255 || t3[1] > 255 || t3[2] > 255 ? "" : `\x1B[M${l(t3[0])}${l(t3[1])}${l(t3[2])}`; + }, SGR: (e3) => { + const t3 = 0 === e3.action && 4 !== e3.button ? "m" : "M"; + return `\x1B[<${c(e3, true)};${e3.col};${e3.row}${t3}`; + }, SGR_PIXELS: (e3) => { + const t3 = 0 === e3.action && 4 !== e3.button ? "m" : "M"; + return `\x1B[<${c(e3, true)};${e3.x};${e3.y}${t3}`; + } }; + let _ = t2.CoreMouseService = class extends a.Disposable { + constructor(e3, t3) { + super(), this._bufferService = e3, this._coreService = t3, this._protocols = {}, this._encodings = {}, this._activeProtocol = "", this._activeEncoding = "", this._lastEvent = null, this._onProtocolChange = this.register(new o.EventEmitter()), this.onProtocolChange = this._onProtocolChange.event; + for (const e4 of Object.keys(h)) this.addProtocol(e4, h[e4]); + for (const e4 of Object.keys(d)) this.addEncoding(e4, d[e4]); + this.reset(); + } + addProtocol(e3, t3) { + this._protocols[e3] = t3; + } + addEncoding(e3, t3) { + this._encodings[e3] = t3; + } + get activeProtocol() { + return this._activeProtocol; + } + get areMouseEventsActive() { + return 0 !== this._protocols[this._activeProtocol].events; + } + set activeProtocol(e3) { + if (!this._protocols[e3]) throw new Error(`unknown protocol "${e3}"`); + this._activeProtocol = e3, this._onProtocolChange.fire(this._protocols[e3].events); + } + get activeEncoding() { + return this._activeEncoding; + } + set activeEncoding(e3) { + if (!this._encodings[e3]) throw new Error(`unknown encoding "${e3}"`); + this._activeEncoding = e3; + } + reset() { + this.activeProtocol = "NONE", this.activeEncoding = "DEFAULT", this._lastEvent = null; + } + triggerMouseEvent(e3) { + if (e3.col < 0 || e3.col >= this._bufferService.cols || e3.row < 0 || e3.row >= this._bufferService.rows) return false; + if (4 === e3.button && 32 === e3.action) return false; + if (3 === e3.button && 32 !== e3.action) return false; + if (4 !== e3.button && (2 === e3.action || 3 === e3.action)) return false; + if (e3.col++, e3.row++, 32 === e3.action && this._lastEvent && this._equalEvents(this._lastEvent, e3, "SGR_PIXELS" === this._activeEncoding)) return false; + if (!this._protocols[this._activeProtocol].restrict(e3)) return false; + const t3 = this._encodings[this._activeEncoding](e3); + return t3 && ("DEFAULT" === this._activeEncoding ? this._coreService.triggerBinaryEvent(t3) : this._coreService.triggerDataEvent(t3, true)), this._lastEvent = e3, true; + } + explainEvents(e3) { + return { down: !!(1 & e3), up: !!(2 & e3), drag: !!(4 & e3), move: !!(8 & e3), wheel: !!(16 & e3) }; + } + _equalEvents(e3, t3, i3) { + if (i3) { + if (e3.x !== t3.x) return false; + if (e3.y !== t3.y) return false; + } else { + if (e3.col !== t3.col) return false; + if (e3.row !== t3.row) return false; + } + return e3.button === t3.button && e3.action === t3.action && e3.ctrl === t3.ctrl && e3.alt === t3.alt && e3.shift === t3.shift; + } + }; + t2.CoreMouseService = _ = s2([r(0, n.IBufferService), r(1, n.ICoreService)], _); + }, 6975: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreService = void 0; + const n = i2(1439), o = i2(8460), a = i2(844), h = i2(2585), c = Object.freeze({ insertMode: false }), l = Object.freeze({ applicationCursorKeys: false, applicationKeypad: false, bracketedPasteMode: false, origin: false, reverseWraparound: false, sendFocus: false, wraparound: true }); + let d = t2.CoreService = class extends a.Disposable { + constructor(e3, t3, i3) { + super(), this._bufferService = e3, this._logService = t3, this._optionsService = i3, this.isCursorInitialized = false, this.isCursorHidden = false, this._onData = this.register(new o.EventEmitter()), this.onData = this._onData.event, this._onUserInput = this.register(new o.EventEmitter()), this.onUserInput = this._onUserInput.event, this._onBinary = this.register(new o.EventEmitter()), this.onBinary = this._onBinary.event, this._onRequestScrollToBottom = this.register(new o.EventEmitter()), this.onRequestScrollToBottom = this._onRequestScrollToBottom.event, this.modes = (0, n.clone)(c), this.decPrivateModes = (0, n.clone)(l); + } + reset() { + this.modes = (0, n.clone)(c), this.decPrivateModes = (0, n.clone)(l); + } + triggerDataEvent(e3, t3 = false) { + if (this._optionsService.rawOptions.disableStdin) return; + const i3 = this._bufferService.buffer; + t3 && this._optionsService.rawOptions.scrollOnUserInput && i3.ybase !== i3.ydisp && this._onRequestScrollToBottom.fire(), t3 && this._onUserInput.fire(), this._logService.debug(`sending data "${e3}"`, () => e3.split("").map((e4) => e4.charCodeAt(0))), this._onData.fire(e3); + } + triggerBinaryEvent(e3) { + this._optionsService.rawOptions.disableStdin || (this._logService.debug(`sending binary "${e3}"`, () => e3.split("").map((e4) => e4.charCodeAt(0))), this._onBinary.fire(e3)); + } + }; + t2.CoreService = d = s2([r(0, h.IBufferService), r(1, h.ILogService), r(2, h.IOptionsService)], d); + }, 9074: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DecorationService = void 0; + const s2 = i2(8055), r = i2(8460), n = i2(844), o = i2(6106); + let a = 0, h = 0; + class c extends n.Disposable { + get decorations() { + return this._decorations.values(); + } + constructor() { + super(), this._decorations = new o.SortedList((e3) => e3 == null ? void 0 : e3.marker.line), this._onDecorationRegistered = this.register(new r.EventEmitter()), this.onDecorationRegistered = this._onDecorationRegistered.event, this._onDecorationRemoved = this.register(new r.EventEmitter()), this.onDecorationRemoved = this._onDecorationRemoved.event, this.register((0, n.toDisposable)(() => this.reset())); + } + registerDecoration(e3) { + if (e3.marker.isDisposed) return; + const t3 = new l(e3); + if (t3) { + const e4 = t3.marker.onDispose(() => t3.dispose()); + t3.onDispose(() => { + t3 && (this._decorations.delete(t3) && this._onDecorationRemoved.fire(t3), e4.dispose()); + }), this._decorations.insert(t3), this._onDecorationRegistered.fire(t3); + } + return t3; + } + reset() { + for (const e3 of this._decorations.values()) e3.dispose(); + this._decorations.clear(); + } + *getDecorationsAtCell(e3, t3, i3) { + let s3 = 0, r2 = 0; + for (const n2 of this._decorations.getKeyIterator(t3)) s3 = n2.options.x ?? 0, r2 = s3 + (n2.options.width ?? 1), e3 >= s3 && e3 < r2 && (!i3 || (n2.options.layer ?? "bottom") === i3) && (yield n2); + } + forEachDecorationAtCell(e3, t3, i3, s3) { + this._decorations.forEachByKey(t3, (t4) => { + a = t4.options.x ?? 0, h = a + (t4.options.width ?? 1), e3 >= a && e3 < h && (!i3 || (t4.options.layer ?? "bottom") === i3) && s3(t4); + }); + } + } + t2.DecorationService = c; + class l extends n.Disposable { + get isDisposed() { + return this._isDisposed; + } + get backgroundColorRGB() { + return null === this._cachedBg && (this.options.backgroundColor ? this._cachedBg = s2.css.toColor(this.options.backgroundColor) : this._cachedBg = void 0), this._cachedBg; + } + get foregroundColorRGB() { + return null === this._cachedFg && (this.options.foregroundColor ? this._cachedFg = s2.css.toColor(this.options.foregroundColor) : this._cachedFg = void 0), this._cachedFg; + } + constructor(e3) { + super(), this.options = e3, this.onRenderEmitter = this.register(new r.EventEmitter()), this.onRender = this.onRenderEmitter.event, this._onDispose = this.register(new r.EventEmitter()), this.onDispose = this._onDispose.event, this._cachedBg = null, this._cachedFg = null, this.marker = e3.marker, this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position && (this.options.overviewRulerOptions.position = "full"); + } + dispose() { + this._onDispose.fire(), super.dispose(); + } + } + }, 4348: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.InstantiationService = t2.ServiceCollection = void 0; + const s2 = i2(2585), r = i2(8343); + class n { + constructor(...e3) { + this._entries = /* @__PURE__ */ new Map(); + for (const [t3, i3] of e3) this.set(t3, i3); + } + set(e3, t3) { + const i3 = this._entries.get(e3); + return this._entries.set(e3, t3), i3; + } + forEach(e3) { + for (const [t3, i3] of this._entries.entries()) e3(t3, i3); + } + has(e3) { + return this._entries.has(e3); + } + get(e3) { + return this._entries.get(e3); + } + } + t2.ServiceCollection = n, t2.InstantiationService = class { + constructor() { + this._services = new n(), this._services.set(s2.IInstantiationService, this); + } + setService(e3, t3) { + this._services.set(e3, t3); + } + getService(e3) { + return this._services.get(e3); + } + createInstance(e3, ...t3) { + const i3 = (0, r.getServiceDependencies)(e3).sort((e4, t4) => e4.index - t4.index), s3 = []; + for (const t4 of i3) { + const i4 = this._services.get(t4.id); + if (!i4) throw new Error(`[createInstance] ${e3.name} depends on UNKNOWN service ${t4.id}.`); + s3.push(i4); + } + const n2 = i3.length > 0 ? i3[0].index : t3.length; + if (t3.length !== n2) throw new Error(`[createInstance] First service dependency of ${e3.name} at position ${n2 + 1} conflicts with ${t3.length} static arguments`); + return new e3(...[...t3, ...s3]); + } + }; + }, 7866: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.traceCall = t2.setTraceLogger = t2.LogService = void 0; + const n = i2(844), o = i2(2585), a = { trace: o.LogLevelEnum.TRACE, debug: o.LogLevelEnum.DEBUG, info: o.LogLevelEnum.INFO, warn: o.LogLevelEnum.WARN, error: o.LogLevelEnum.ERROR, off: o.LogLevelEnum.OFF }; + let h, c = t2.LogService = class extends n.Disposable { + get logLevel() { + return this._logLevel; + } + constructor(e3) { + super(), this._optionsService = e3, this._logLevel = o.LogLevelEnum.OFF, this._updateLogLevel(), this.register(this._optionsService.onSpecificOptionChange("logLevel", () => this._updateLogLevel())), h = this; + } + _updateLogLevel() { + this._logLevel = a[this._optionsService.rawOptions.logLevel]; + } + _evalLazyOptionalParams(e3) { + for (let t3 = 0; t3 < e3.length; t3++) "function" == typeof e3[t3] && (e3[t3] = e3[t3]()); + } + _log(e3, t3, i3) { + this._evalLazyOptionalParams(i3), e3.call(console, (this._optionsService.options.logger ? "" : "xterm.js: ") + t3, ...i3); + } + trace(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.TRACE && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.trace.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + debug(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.DEBUG && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.debug.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + info(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.INFO && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.info.bind(this._optionsService.options.logger)) ?? console.info, e3, t3); + } + warn(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.WARN && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.warn.bind(this._optionsService.options.logger)) ?? console.warn, e3, t3); + } + error(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.ERROR && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.error.bind(this._optionsService.options.logger)) ?? console.error, e3, t3); + } + }; + t2.LogService = c = s2([r(0, o.IOptionsService)], c), t2.setTraceLogger = function(e3) { + h = e3; + }, t2.traceCall = function(e3, t3, i3) { + if ("function" != typeof i3.value) throw new Error("not supported"); + const s3 = i3.value; + i3.value = function(...e4) { + if (h.logLevel !== o.LogLevelEnum.TRACE) return s3.apply(this, e4); + h.trace(`GlyphRenderer#${s3.name}(${e4.map((e5) => JSON.stringify(e5)).join(", ")})`); + const t4 = s3.apply(this, e4); + return h.trace(`GlyphRenderer#${s3.name} return`, t4), t4; + }; + }; + }, 7302: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.OptionsService = t2.DEFAULT_OPTIONS = void 0; + const s2 = i2(8460), r = i2(844), n = i2(6114); + t2.DEFAULT_OPTIONS = { cols: 80, rows: 24, cursorBlink: false, cursorStyle: "block", cursorWidth: 1, cursorInactiveStyle: "outline", customGlyphs: true, drawBoldTextInBrightColors: true, documentOverride: null, fastScrollModifier: "alt", fastScrollSensitivity: 5, fontFamily: "courier-new, courier, monospace", fontSize: 15, fontWeight: "normal", fontWeightBold: "bold", ignoreBracketedPasteMode: false, lineHeight: 1, letterSpacing: 0, linkHandler: null, logLevel: "info", logger: null, scrollback: 1e3, scrollOnUserInput: true, scrollSensitivity: 1, screenReaderMode: false, smoothScrollDuration: 0, macOptionIsMeta: false, macOptionClickForcesSelection: false, minimumContrastRatio: 1, disableStdin: false, allowProposedApi: false, allowTransparency: false, tabStopWidth: 8, theme: {}, rescaleOverlappingGlyphs: false, rightClickSelectsWord: n.isMac, windowOptions: {}, windowsMode: false, windowsPty: {}, wordSeparator: " ()[]{}',\"`", altClickMovesCursor: true, convertEol: false, termName: "xterm", cancelEvents: false, overviewRulerWidth: 0 }; + const o = ["normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900"]; + class a extends r.Disposable { + constructor(e3) { + super(), this._onOptionChange = this.register(new s2.EventEmitter()), this.onOptionChange = this._onOptionChange.event; + const i3 = { ...t2.DEFAULT_OPTIONS }; + for (const t3 in e3) if (t3 in i3) try { + const s3 = e3[t3]; + i3[t3] = this._sanitizeAndValidateOption(t3, s3); + } catch (e4) { + console.error(e4); + } + this.rawOptions = i3, this.options = { ...i3 }, this._setupOptions(), this.register((0, r.toDisposable)(() => { + this.rawOptions.linkHandler = null, this.rawOptions.documentOverride = null; + })); + } + onSpecificOptionChange(e3, t3) { + return this.onOptionChange((i3) => { + i3 === e3 && t3(this.rawOptions[e3]); + }); + } + onMultipleOptionChange(e3, t3) { + return this.onOptionChange((i3) => { + -1 !== e3.indexOf(i3) && t3(); + }); + } + _setupOptions() { + const e3 = (e4) => { + if (!(e4 in t2.DEFAULT_OPTIONS)) throw new Error(`No option with key "${e4}"`); + return this.rawOptions[e4]; + }, i3 = (e4, i4) => { + if (!(e4 in t2.DEFAULT_OPTIONS)) throw new Error(`No option with key "${e4}"`); + i4 = this._sanitizeAndValidateOption(e4, i4), this.rawOptions[e4] !== i4 && (this.rawOptions[e4] = i4, this._onOptionChange.fire(e4)); + }; + for (const t3 in this.rawOptions) { + const s3 = { get: e3.bind(this, t3), set: i3.bind(this, t3) }; + Object.defineProperty(this.options, t3, s3); + } + } + _sanitizeAndValidateOption(e3, i3) { + switch (e3) { + case "cursorStyle": + if (i3 || (i3 = t2.DEFAULT_OPTIONS[e3]), !/* @__PURE__ */ function(e4) { + return "block" === e4 || "underline" === e4 || "bar" === e4; + }(i3)) throw new Error(`"${i3}" is not a valid value for ${e3}`); + break; + case "wordSeparator": + i3 || (i3 = t2.DEFAULT_OPTIONS[e3]); + break; + case "fontWeight": + case "fontWeightBold": + if ("number" == typeof i3 && 1 <= i3 && i3 <= 1e3) break; + i3 = o.includes(i3) ? i3 : t2.DEFAULT_OPTIONS[e3]; + break; + case "cursorWidth": + i3 = Math.floor(i3); + case "lineHeight": + case "tabStopWidth": + if (i3 < 1) throw new Error(`${e3} cannot be less than 1, value: ${i3}`); + break; + case "minimumContrastRatio": + i3 = Math.max(1, Math.min(21, Math.round(10 * i3) / 10)); + break; + case "scrollback": + if ((i3 = Math.min(i3, 4294967295)) < 0) throw new Error(`${e3} cannot be less than 0, value: ${i3}`); + break; + case "fastScrollSensitivity": + case "scrollSensitivity": + if (i3 <= 0) throw new Error(`${e3} cannot be less than or equal to 0, value: ${i3}`); + break; + case "rows": + case "cols": + if (!i3 && 0 !== i3) throw new Error(`${e3} must be numeric, value: ${i3}`); + break; + case "windowsPty": + i3 = i3 ?? {}; + } + return i3; + } + } + t2.OptionsService = a; + }, 2660: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a = e3.length - 1; a >= 0; a--) (r2 = e3[a]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.OscLinkService = void 0; + const n = i2(2585); + let o = t2.OscLinkService = class { + constructor(e3) { + this._bufferService = e3, this._nextId = 1, this._entriesWithId = /* @__PURE__ */ new Map(), this._dataByLinkId = /* @__PURE__ */ new Map(); + } + registerLink(e3) { + const t3 = this._bufferService.buffer; + if (void 0 === e3.id) { + const i4 = t3.addMarker(t3.ybase + t3.y), s4 = { data: e3, id: this._nextId++, lines: [i4] }; + return i4.onDispose(() => this._removeMarkerFromLink(s4, i4)), this._dataByLinkId.set(s4.id, s4), s4.id; + } + const i3 = e3, s3 = this._getEntryIdKey(i3), r2 = this._entriesWithId.get(s3); + if (r2) return this.addLineToLink(r2.id, t3.ybase + t3.y), r2.id; + const n2 = t3.addMarker(t3.ybase + t3.y), o2 = { id: this._nextId++, key: this._getEntryIdKey(i3), data: i3, lines: [n2] }; + return n2.onDispose(() => this._removeMarkerFromLink(o2, n2)), this._entriesWithId.set(o2.key, o2), this._dataByLinkId.set(o2.id, o2), o2.id; + } + addLineToLink(e3, t3) { + const i3 = this._dataByLinkId.get(e3); + if (i3 && i3.lines.every((e4) => e4.line !== t3)) { + const e4 = this._bufferService.buffer.addMarker(t3); + i3.lines.push(e4), e4.onDispose(() => this._removeMarkerFromLink(i3, e4)); + } + } + getLinkData(e3) { + var _a; + return (_a = this._dataByLinkId.get(e3)) == null ? void 0 : _a.data; + } + _getEntryIdKey(e3) { + return `${e3.id};;${e3.uri}`; + } + _removeMarkerFromLink(e3, t3) { + const i3 = e3.lines.indexOf(t3); + -1 !== i3 && (e3.lines.splice(i3, 1), 0 === e3.lines.length && (void 0 !== e3.data.id && this._entriesWithId.delete(e3.key), this._dataByLinkId.delete(e3.id))); + } + }; + t2.OscLinkService = o = s2([r(0, n.IBufferService)], o); + }, 8343: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createDecorator = t2.getServiceDependencies = t2.serviceRegistry = void 0; + const i2 = "di$target", s2 = "di$dependencies"; + t2.serviceRegistry = /* @__PURE__ */ new Map(), t2.getServiceDependencies = function(e3) { + return e3[s2] || []; + }, t2.createDecorator = function(e3) { + if (t2.serviceRegistry.has(e3)) return t2.serviceRegistry.get(e3); + const r = function(e4, t3, n) { + if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); + !function(e5, t4, r2) { + t4[i2] === t4 ? t4[s2].push({ id: e5, index: r2 }) : (t4[s2] = [{ id: e5, index: r2 }], t4[i2] = t4); + }(r, e4, n); + }; + return r.toString = () => e3, t2.serviceRegistry.set(e3, r), r; + }; + }, 2585: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.IDecorationService = t2.IUnicodeService = t2.IOscLinkService = t2.IOptionsService = t2.ILogService = t2.LogLevelEnum = t2.IInstantiationService = t2.ICharsetService = t2.ICoreService = t2.ICoreMouseService = t2.IBufferService = void 0; + const s2 = i2(8343); + var r; + t2.IBufferService = (0, s2.createDecorator)("BufferService"), t2.ICoreMouseService = (0, s2.createDecorator)("CoreMouseService"), t2.ICoreService = (0, s2.createDecorator)("CoreService"), t2.ICharsetService = (0, s2.createDecorator)("CharsetService"), t2.IInstantiationService = (0, s2.createDecorator)("InstantiationService"), function(e3) { + e3[e3.TRACE = 0] = "TRACE", e3[e3.DEBUG = 1] = "DEBUG", e3[e3.INFO = 2] = "INFO", e3[e3.WARN = 3] = "WARN", e3[e3.ERROR = 4] = "ERROR", e3[e3.OFF = 5] = "OFF"; + }(r || (t2.LogLevelEnum = r = {})), t2.ILogService = (0, s2.createDecorator)("LogService"), t2.IOptionsService = (0, s2.createDecorator)("OptionsService"), t2.IOscLinkService = (0, s2.createDecorator)("OscLinkService"), t2.IUnicodeService = (0, s2.createDecorator)("UnicodeService"), t2.IDecorationService = (0, s2.createDecorator)("DecorationService"); + }, 1480: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeService = void 0; + const s2 = i2(8460), r = i2(225); + class n { + static extractShouldJoin(e3) { + return 0 != (1 & e3); + } + static extractWidth(e3) { + return e3 >> 1 & 3; + } + static extractCharKind(e3) { + return e3 >> 3; + } + static createPropertyValue(e3, t3, i3 = false) { + return (16777215 & e3) << 3 | (3 & t3) << 1 | (i3 ? 1 : 0); + } + constructor() { + this._providers = /* @__PURE__ */ Object.create(null), this._active = "", this._onChange = new s2.EventEmitter(), this.onChange = this._onChange.event; + const e3 = new r.UnicodeV6(); + this.register(e3), this._active = e3.version, this._activeProvider = e3; + } + dispose() { + this._onChange.dispose(); + } + get versions() { + return Object.keys(this._providers); + } + get activeVersion() { + return this._active; + } + set activeVersion(e3) { + if (!this._providers[e3]) throw new Error(`unknown Unicode version "${e3}"`); + this._active = e3, this._activeProvider = this._providers[e3], this._onChange.fire(e3); + } + register(e3) { + this._providers[e3.version] = e3; + } + wcwidth(e3) { + return this._activeProvider.wcwidth(e3); + } + getStringCellWidth(e3) { + let t3 = 0, i3 = 0; + const s3 = e3.length; + for (let r2 = 0; r2 < s3; ++r2) { + let o = e3.charCodeAt(r2); + if (55296 <= o && o <= 56319) { + if (++r2 >= s3) return t3 + this.wcwidth(o); + const i4 = e3.charCodeAt(r2); + 56320 <= i4 && i4 <= 57343 ? o = 1024 * (o - 55296) + i4 - 56320 + 65536 : t3 += this.wcwidth(i4); + } + const a = this.charProperties(o, i3); + let h = n.extractWidth(a); + n.extractShouldJoin(a) && (h -= n.extractWidth(i3)), t3 += h, i3 = a; + } + return t3; + } + charProperties(e3, t3) { + return this._activeProvider.charProperties(e3, t3); + } + } + t2.UnicodeService = n; + } }, t = {}; + function i(s2) { + var r = t[s2]; + if (void 0 !== r) return r.exports; + var n = t[s2] = { exports: {} }; + return e[s2].call(n.exports, n, n.exports, i), n.exports; + } + var s = {}; + return (() => { + var e2 = s; + Object.defineProperty(e2, "__esModule", { value: true }), e2.Terminal = void 0; + const t2 = i(9042), r = i(3236), n = i(844), o = i(5741), a = i(8285), h = i(7975), c = i(7090), l = ["cols", "rows"]; + class d extends n.Disposable { + constructor(e3) { + super(), this._core = this.register(new r.Terminal(e3)), this._addonManager = this.register(new o.AddonManager()), this._publicOptions = { ...this._core.options }; + const t3 = (e4) => this._core.options[e4], i2 = (e4, t4) => { + this._checkReadonlyOptions(e4), this._core.options[e4] = t4; + }; + for (const e4 in this._core.options) { + const s2 = { get: t3.bind(this, e4), set: i2.bind(this, e4) }; + Object.defineProperty(this._publicOptions, e4, s2); + } + } + _checkReadonlyOptions(e3) { + if (l.includes(e3)) throw new Error(`Option "${e3}" can only be set in the constructor`); + } + _checkProposedApi() { + if (!this._core.optionsService.rawOptions.allowProposedApi) throw new Error("You must set the allowProposedApi option to true to use proposed API"); + } + get onBell() { + return this._core.onBell; + } + get onBinary() { + return this._core.onBinary; + } + get onCursorMove() { + return this._core.onCursorMove; + } + get onData() { + return this._core.onData; + } + get onKey() { + return this._core.onKey; + } + get onLineFeed() { + return this._core.onLineFeed; + } + get onRender() { + return this._core.onRender; + } + get onResize() { + return this._core.onResize; + } + get onScroll() { + return this._core.onScroll; + } + get onSelectionChange() { + return this._core.onSelectionChange; + } + get onTitleChange() { + return this._core.onTitleChange; + } + get onWriteParsed() { + return this._core.onWriteParsed; + } + get element() { + return this._core.element; + } + get parser() { + return this._parser || (this._parser = new h.ParserApi(this._core)), this._parser; + } + get unicode() { + return this._checkProposedApi(), new c.UnicodeApi(this._core); + } + get textarea() { + return this._core.textarea; + } + get rows() { + return this._core.rows; + } + get cols() { + return this._core.cols; + } + get buffer() { + return this._buffer || (this._buffer = this.register(new a.BufferNamespaceApi(this._core))), this._buffer; + } + get markers() { + return this._checkProposedApi(), this._core.markers; + } + get modes() { + const e3 = this._core.coreService.decPrivateModes; + let t3 = "none"; + switch (this._core.coreMouseService.activeProtocol) { + case "X10": + t3 = "x10"; + break; + case "VT200": + t3 = "vt200"; + break; + case "DRAG": + t3 = "drag"; + break; + case "ANY": + t3 = "any"; + } + return { applicationCursorKeysMode: e3.applicationCursorKeys, applicationKeypadMode: e3.applicationKeypad, bracketedPasteMode: e3.bracketedPasteMode, insertMode: this._core.coreService.modes.insertMode, mouseTrackingMode: t3, originMode: e3.origin, reverseWraparoundMode: e3.reverseWraparound, sendFocusMode: e3.sendFocus, wraparoundMode: e3.wraparound }; + } + get options() { + return this._publicOptions; + } + set options(e3) { + for (const t3 in e3) this._publicOptions[t3] = e3[t3]; + } + blur() { + this._core.blur(); + } + focus() { + this._core.focus(); + } + input(e3, t3 = true) { + this._core.input(e3, t3); + } + resize(e3, t3) { + this._verifyIntegers(e3, t3), this._core.resize(e3, t3); + } + open(e3) { + this._core.open(e3); + } + attachCustomKeyEventHandler(e3) { + this._core.attachCustomKeyEventHandler(e3); + } + attachCustomWheelEventHandler(e3) { + this._core.attachCustomWheelEventHandler(e3); + } + registerLinkProvider(e3) { + return this._core.registerLinkProvider(e3); + } + registerCharacterJoiner(e3) { + return this._checkProposedApi(), this._core.registerCharacterJoiner(e3); + } + deregisterCharacterJoiner(e3) { + this._checkProposedApi(), this._core.deregisterCharacterJoiner(e3); + } + registerMarker(e3 = 0) { + return this._verifyIntegers(e3), this._core.registerMarker(e3); + } + registerDecoration(e3) { + return this._checkProposedApi(), this._verifyPositiveIntegers(e3.x ?? 0, e3.width ?? 0, e3.height ?? 0), this._core.registerDecoration(e3); + } + hasSelection() { + return this._core.hasSelection(); + } + select(e3, t3, i2) { + this._verifyIntegers(e3, t3, i2), this._core.select(e3, t3, i2); + } + getSelection() { + return this._core.getSelection(); + } + getSelectionPosition() { + return this._core.getSelectionPosition(); + } + clearSelection() { + this._core.clearSelection(); + } + selectAll() { + this._core.selectAll(); + } + selectLines(e3, t3) { + this._verifyIntegers(e3, t3), this._core.selectLines(e3, t3); + } + dispose() { + super.dispose(); + } + scrollLines(e3) { + this._verifyIntegers(e3), this._core.scrollLines(e3); + } + scrollPages(e3) { + this._verifyIntegers(e3), this._core.scrollPages(e3); + } + scrollToTop() { + this._core.scrollToTop(); + } + scrollToBottom() { + this._core.scrollToBottom(); + } + scrollToLine(e3) { + this._verifyIntegers(e3), this._core.scrollToLine(e3); + } + clear() { + this._core.clear(); + } + write(e3, t3) { + this._core.write(e3, t3); + } + writeln(e3, t3) { + this._core.write(e3), this._core.write("\r\n", t3); + } + paste(e3) { + this._core.paste(e3); + } + refresh(e3, t3) { + this._verifyIntegers(e3, t3), this._core.refresh(e3, t3); + } + reset() { + this._core.reset(); + } + clearTextureAtlas() { + this._core.clearTextureAtlas(); + } + loadAddon(e3) { + this._addonManager.loadAddon(this, e3); + } + static get strings() { + return t2; + } + _verifyIntegers(...e3) { + for (const t3 of e3) if (t3 === 1 / 0 || isNaN(t3) || t3 % 1 != 0) throw new Error("This API only accepts integers"); + } + _verifyPositiveIntegers(...e3) { + for (const t3 of e3) if (t3 && (t3 === 1 / 0 || isNaN(t3) || t3 % 1 != 0 || t3 < 0)) throw new Error("This API only accepts positive integers"); + } + } + e2.Terminal = d; + })(), s; + })()); +})(xterm); +var xtermExports = xterm.exports; +var addonFit = { exports: {} }; +(function(module, exports) { + !function(e, t) { + module.exports = t(); + }(self, () => (() => { + var e = {}; + return (() => { + var t = e; + Object.defineProperty(t, "__esModule", { value: true }), t.FitAddon = void 0, t.FitAddon = class { + activate(e2) { + this._terminal = e2; + } + dispose() { + } + fit() { + const e2 = this.proposeDimensions(); + if (!e2 || !this._terminal || isNaN(e2.cols) || isNaN(e2.rows)) return; + const t2 = this._terminal._core; + this._terminal.rows === e2.rows && this._terminal.cols === e2.cols || (t2._renderService.clear(), this._terminal.resize(e2.cols, e2.rows)); + } + proposeDimensions() { + if (!this._terminal) return; + if (!this._terminal.element || !this._terminal.element.parentElement) return; + const e2 = this._terminal._core, t2 = e2._renderService.dimensions; + if (0 === t2.css.cell.width || 0 === t2.css.cell.height) return; + const r = 0 === this._terminal.options.scrollback ? 0 : e2.viewport.scrollBarWidth, i = window.getComputedStyle(this._terminal.element.parentElement), o = parseInt(i.getPropertyValue("height")), s = Math.max(0, parseInt(i.getPropertyValue("width"))), n = window.getComputedStyle(this._terminal.element), l = o - (parseInt(n.getPropertyValue("padding-top")) + parseInt(n.getPropertyValue("padding-bottom"))), a = s - (parseInt(n.getPropertyValue("padding-right")) + parseInt(n.getPropertyValue("padding-left"))) - r; + return { cols: Math.max(2, Math.floor(a / t2.css.cell.width)), rows: Math.max(1, Math.floor(l / t2.css.cell.height)) }; + } + }; + })(), e; + })()); +})(addonFit); +var addonFitExports = addonFit.exports; +var addonWebLinks = { exports: {} }; +(function(module, exports) { + !function(e, t) { + module.exports = t(); + }(self, () => (() => { + var e = { 6: (e2, t2) => { + function n2(e3) { + try { + const t3 = new URL(e3), n3 = t3.password && t3.username ? `${t3.protocol}//${t3.username}:${t3.password}@${t3.host}` : t3.username ? `${t3.protocol}//${t3.username}@${t3.host}` : `${t3.protocol}//${t3.host}`; + return e3.toLocaleLowerCase().startsWith(n3.toLocaleLowerCase()); + } catch (e4) { + return false; + } + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkComputer = t2.WebLinkProvider = void 0, t2.WebLinkProvider = class { + constructor(e3, t3, n3, o3 = {}) { + this._terminal = e3, this._regex = t3, this._handler = n3, this._options = o3; + } + provideLinks(e3, t3) { + const n3 = o2.computeLink(e3, this._regex, this._terminal, this._handler); + t3(this._addCallbacks(n3)); + } + _addCallbacks(e3) { + return e3.map((e4) => (e4.leave = this._options.leave, e4.hover = (t3, n3) => { + if (this._options.hover) { + const { range: o3 } = e4; + this._options.hover(t3, n3, o3); + } + }, e4)); + } + }; + class o2 { + static computeLink(e3, t3, r, i) { + const s = new RegExp(t3.source, (t3.flags || "") + "g"), [a, c] = o2._getWindowedLineStrings(e3 - 1, r), l = a.join(""); + let d; + const p = []; + for (; d = s.exec(l); ) { + const e4 = d[0]; + if (!n2(e4)) continue; + const [t4, s2] = o2._mapStrIdx(r, c, 0, d.index), [a2, l2] = o2._mapStrIdx(r, t4, s2, e4.length); + if (-1 === t4 || -1 === s2 || -1 === a2 || -1 === l2) continue; + const h = { start: { x: s2 + 1, y: t4 + 1 }, end: { x: l2, y: a2 + 1 } }; + p.push({ range: h, text: e4, activate: i }); + } + return p; + } + static _getWindowedLineStrings(e3, t3) { + let n3, o3 = e3, r = e3, i = 0, s = ""; + const a = []; + if (n3 = t3.buffer.active.getLine(e3)) { + const e4 = n3.translateToString(true); + if (n3.isWrapped && " " !== e4[0]) { + for (i = 0; (n3 = t3.buffer.active.getLine(--o3)) && i < 2048 && (s = n3.translateToString(true), i += s.length, a.push(s), n3.isWrapped && -1 === s.indexOf(" ")); ) ; + a.reverse(); + } + for (a.push(e4), i = 0; (n3 = t3.buffer.active.getLine(++r)) && n3.isWrapped && i < 2048 && (s = n3.translateToString(true), i += s.length, a.push(s), -1 === s.indexOf(" ")); ) ; + } + return [a, o3]; + } + static _mapStrIdx(e3, t3, n3, o3) { + const r = e3.buffer.active, i = r.getNullCell(); + let s = n3; + for (; o3; ) { + const e4 = r.getLine(t3); + if (!e4) return [-1, -1]; + for (let n4 = s; n4 < e4.length; ++n4) { + e4.getCell(n4, i); + const s2 = i.getChars(); + if (i.getWidth() && (o3 -= s2.length || 1, n4 === e4.length - 1 && "" === s2)) { + const e5 = r.getLine(t3 + 1); + e5 && e5.isWrapped && (e5.getCell(0, i), 2 === i.getWidth() && (o3 += 1)); + } + if (o3 < 0) return [t3, n4]; + } + t3++, s = 0; + } + return [t3, s]; + } + } + t2.LinkComputer = o2; + } }, t = {}; + function n(o2) { + var r = t[o2]; + if (void 0 !== r) return r.exports; + var i = t[o2] = { exports: {} }; + return e[o2](i, i.exports, n), i.exports; + } + var o = {}; + return (() => { + var e2 = o; + Object.defineProperty(e2, "__esModule", { value: true }), e2.WebLinksAddon = void 0; + const t2 = n(6), r = /(https?|HTTPS?):[/]{2}[^\s"'!*(){}|\\\^<>`]*[^\s"':,.!?{}|\\\^~\[\]`()<>]/; + function i(e3, t3) { + const n2 = window.open(); + if (n2) { + try { + n2.opener = null; + } catch { + } + n2.location.href = t3; + } else console.warn("Opening link blocked as opener could not be cleared"); + } + e2.WebLinksAddon = class { + constructor(e3 = i, t3 = {}) { + this._handler = e3, this._options = t3; + } + activate(e3) { + this._terminal = e3; + const n2 = this._options, o2 = n2.urlRegex || r; + this._linkProvider = this._terminal.registerLinkProvider(new t2.WebLinkProvider(this._terminal, o2, this._handler, n2)); + } + dispose() { + var _a; + (_a = this._linkProvider) == null ? void 0 : _a.dispose(); + } + }; + })(), o; + })()); +})(addonWebLinks); +var addonWebLinksExports = addonWebLinks.exports; +var addonCanvas = { exports: {} }; +(function(module, exports) { + !function(e, t) { + module.exports = t(); + }(self, () => (() => { + var e = { 903: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BaseRenderLayer = void 0; + const s2 = i2(274), r = i2(627), o = i2(237), n = i2(860), a = i2(374), h = i2(296), l = i2(345), c = i2(859), d = i2(399), _ = i2(855); + class u extends c.Disposable { + get canvas() { + return this._canvas; + } + get cacheCanvas() { + var _a; + return (_a = this._charAtlas) == null ? void 0 : _a.pages[0].canvas; + } + constructor(e3, t3, i3, r2, o2, n2, a2, d2, _2, u2) { + super(), this._terminal = e3, this._container = t3, this._alpha = o2, this._themeService = n2, this._bufferService = a2, this._optionsService = d2, this._decorationService = _2, this._coreBrowserService = u2, this._deviceCharWidth = 0, this._deviceCharHeight = 0, this._deviceCellWidth = 0, this._deviceCellHeight = 0, this._deviceCharLeft = 0, this._deviceCharTop = 0, this._selectionModel = (0, h.createSelectionRenderModel)(), this._bitmapGenerator = [], this._charAtlasDisposable = this.register(new c.MutableDisposable()), this._onAddTextureAtlasCanvas = this.register(new l.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._cellColorResolver = new s2.CellColorResolver(this._terminal, this._optionsService, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService), this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"), this._canvas.classList.add(`xterm-${i3}-layer`), this._canvas.style.zIndex = r2.toString(), this._initCanvas(), this._container.appendChild(this._canvas), this._refreshCharAtlas(this._themeService.colors), this.register(this._themeService.onChangeColors((e4) => { + this._refreshCharAtlas(e4), this.reset(), this.handleSelectionChanged(this._selectionModel.selectionStart, this._selectionModel.selectionEnd, this._selectionModel.columnSelectMode); + })), this.register((0, c.toDisposable)(() => { + this._canvas.remove(); + })); + } + _initCanvas() { + this._ctx = (0, a.throwIfFalsy)(this._canvas.getContext("2d", { alpha: this._alpha })), this._alpha || this._clearAll(); + } + handleBlur() { + } + handleFocus() { + } + handleCursorMove() { + } + handleGridChanged(e3, t3) { + } + handleSelectionChanged(e3, t3, i3 = false) { + this._selectionModel.update(this._terminal._core, e3, t3, i3); + } + _setTransparency(e3) { + if (e3 === this._alpha) return; + const t3 = this._canvas; + this._alpha = e3, this._canvas = this._canvas.cloneNode(), this._initCanvas(), this._container.replaceChild(this._canvas, t3), this._refreshCharAtlas(this._themeService.colors), this.handleGridChanged(0, this._bufferService.rows - 1); + } + _refreshCharAtlas(e3) { + if (!(this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0)) { + this._charAtlas = (0, r.acquireTextureAtlas)(this._terminal, this._optionsService.rawOptions, e3, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr), this._charAtlasDisposable.value = (0, l.forwardEvent)(this._charAtlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas), this._charAtlas.warmUp(); + for (let e4 = 0; e4 < this._charAtlas.pages.length; e4++) this._bitmapGenerator[e4] = new g(this._charAtlas.pages[e4].canvas); + } + } + resize(e3) { + this._deviceCellWidth = e3.device.cell.width, this._deviceCellHeight = e3.device.cell.height, this._deviceCharWidth = e3.device.char.width, this._deviceCharHeight = e3.device.char.height, this._deviceCharLeft = e3.device.char.left, this._deviceCharTop = e3.device.char.top, this._canvas.width = e3.device.canvas.width, this._canvas.height = e3.device.canvas.height, this._canvas.style.width = `${e3.css.canvas.width}px`, this._canvas.style.height = `${e3.css.canvas.height}px`, this._alpha || this._clearAll(), this._refreshCharAtlas(this._themeService.colors); + } + clearTextureAtlas() { + var _a; + (_a = this._charAtlas) == null ? void 0 : _a.clearTexture(); + } + _fillCells(e3, t3, i3, s3) { + this._ctx.fillRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight); + } + _fillMiddleLineAtCells(e3, t3, i3 = 1) { + const s3 = Math.ceil(0.5 * this._deviceCellHeight); + this._ctx.fillRect(e3 * this._deviceCellWidth, (t3 + 1) * this._deviceCellHeight - s3 - this._coreBrowserService.dpr, i3 * this._deviceCellWidth, this._coreBrowserService.dpr); + } + _fillBottomLineAtCells(e3, t3, i3 = 1, s3 = 0) { + this._ctx.fillRect(e3 * this._deviceCellWidth, (t3 + 1) * this._deviceCellHeight + s3 - this._coreBrowserService.dpr - 1, i3 * this._deviceCellWidth, this._coreBrowserService.dpr); + } + _curlyUnderlineAtCell(e3, t3, i3 = 1) { + this._ctx.save(), this._ctx.beginPath(), this._ctx.strokeStyle = this._ctx.fillStyle; + const s3 = this._coreBrowserService.dpr; + this._ctx.lineWidth = s3; + for (let r2 = 0; r2 < i3; r2++) { + const i4 = (e3 + r2) * this._deviceCellWidth, o2 = (e3 + r2 + 0.5) * this._deviceCellWidth, n2 = (e3 + r2 + 1) * this._deviceCellWidth, a2 = (t3 + 1) * this._deviceCellHeight - s3 - 1, h2 = a2 - s3, l2 = a2 + s3; + this._ctx.moveTo(i4, a2), this._ctx.bezierCurveTo(i4, h2, o2, h2, o2, a2), this._ctx.bezierCurveTo(o2, l2, n2, l2, n2, a2); + } + this._ctx.stroke(), this._ctx.restore(); + } + _dottedUnderlineAtCell(e3, t3, i3 = 1) { + this._ctx.save(), this._ctx.beginPath(), this._ctx.strokeStyle = this._ctx.fillStyle; + const s3 = this._coreBrowserService.dpr; + this._ctx.lineWidth = s3, this._ctx.setLineDash([2 * s3, s3]); + const r2 = e3 * this._deviceCellWidth, o2 = (t3 + 1) * this._deviceCellHeight - s3 - 1; + this._ctx.moveTo(r2, o2); + for (let t4 = 0; t4 < i3; t4++) { + const s4 = (e3 + i3 + t4) * this._deviceCellWidth; + this._ctx.lineTo(s4, o2); + } + this._ctx.stroke(), this._ctx.closePath(), this._ctx.restore(); + } + _dashedUnderlineAtCell(e3, t3, i3 = 1) { + this._ctx.save(), this._ctx.beginPath(), this._ctx.strokeStyle = this._ctx.fillStyle; + const s3 = this._coreBrowserService.dpr; + this._ctx.lineWidth = s3, this._ctx.setLineDash([4 * s3, 3 * s3]); + const r2 = e3 * this._deviceCellWidth, o2 = (e3 + i3) * this._deviceCellWidth, n2 = (t3 + 1) * this._deviceCellHeight - s3 - 1; + this._ctx.moveTo(r2, n2), this._ctx.lineTo(o2, n2), this._ctx.stroke(), this._ctx.closePath(), this._ctx.restore(); + } + _fillLeftLineAtCell(e3, t3, i3) { + this._ctx.fillRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, this._coreBrowserService.dpr * i3, this._deviceCellHeight); + } + _strokeRectAtCell(e3, t3, i3, s3) { + const r2 = this._coreBrowserService.dpr; + this._ctx.lineWidth = r2, this._ctx.strokeRect(e3 * this._deviceCellWidth + r2 / 2, t3 * this._deviceCellHeight + r2 / 2, i3 * this._deviceCellWidth - r2, s3 * this._deviceCellHeight - r2); + } + _clearAll() { + this._alpha ? this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height) : (this._ctx.fillStyle = this._themeService.colors.background.css, this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height)); + } + _clearCells(e3, t3, i3, s3) { + this._alpha ? this._ctx.clearRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight) : (this._ctx.fillStyle = this._themeService.colors.background.css, this._ctx.fillRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight)); + } + _fillCharTrueColor(e3, t3, i3) { + this._ctx.font = this._getFont(false, false), this._ctx.textBaseline = o.TEXT_BASELINE, this._clipRow(i3); + let s3 = false; + false !== this._optionsService.rawOptions.customGlyphs && (s3 = (0, n.tryDrawCustomChar)(this._ctx, e3.getChars(), t3 * this._deviceCellWidth, i3 * this._deviceCellHeight, this._deviceCellWidth, this._deviceCellHeight, this._optionsService.rawOptions.fontSize, this._coreBrowserService.dpr)), s3 || this._ctx.fillText(e3.getChars(), t3 * this._deviceCellWidth + this._deviceCharLeft, i3 * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight); + } + _drawChars(e3, t3, i3) { + var _a, _b, _c, _d; + const s3 = e3.getChars(); + if (this._cellColorResolver.resolve(e3, t3, this._bufferService.buffer.ydisp + i3, this._deviceCellWidth), !this._charAtlas) return; + let r2; + r2 = s3 && s3.length > 1 ? this._charAtlas.getRasterizedGlyphCombinedChar(s3, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, true) : this._charAtlas.getRasterizedGlyph(e3.getCode() || _.WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, true), r2.size.x && r2.size.y && (this._ctx.save(), this._clipRow(i3), this._bitmapGenerator[r2.texturePage] && this._charAtlas.pages[r2.texturePage].canvas !== this._bitmapGenerator[r2.texturePage].canvas && ((_b = (_a = this._bitmapGenerator[r2.texturePage]) == null ? void 0 : _a.bitmap) == null ? void 0 : _b.close(), delete this._bitmapGenerator[r2.texturePage]), this._charAtlas.pages[r2.texturePage].version !== ((_c = this._bitmapGenerator[r2.texturePage]) == null ? void 0 : _c.version) && (this._bitmapGenerator[r2.texturePage] || (this._bitmapGenerator[r2.texturePage] = new g(this._charAtlas.pages[r2.texturePage].canvas)), this._bitmapGenerator[r2.texturePage].refresh(), this._bitmapGenerator[r2.texturePage].version = this._charAtlas.pages[r2.texturePage].version), this._ctx.drawImage(((_d = this._bitmapGenerator[r2.texturePage]) == null ? void 0 : _d.bitmap) || this._charAtlas.pages[r2.texturePage].canvas, r2.texturePosition.x, r2.texturePosition.y, r2.size.x, r2.size.y, t3 * this._deviceCellWidth + this._deviceCharLeft - r2.offset.x, i3 * this._deviceCellHeight + this._deviceCharTop - r2.offset.y, r2.size.x, r2.size.y), this._ctx.restore()); + } + _clipRow(e3) { + this._ctx.beginPath(), this._ctx.rect(0, e3 * this._deviceCellHeight, this._bufferService.cols * this._deviceCellWidth, this._deviceCellHeight), this._ctx.clip(); + } + _getFont(e3, t3) { + return `${t3 ? "italic" : ""} ${e3 ? this._optionsService.rawOptions.fontWeightBold : this._optionsService.rawOptions.fontWeight} ${this._optionsService.rawOptions.fontSize * this._coreBrowserService.dpr}px ${this._optionsService.rawOptions.fontFamily}`; + } + } + t2.BaseRenderLayer = u; + class g { + get bitmap() { + return this._bitmap; + } + constructor(e3) { + this.canvas = e3, this._state = 0, this._commitTimeout = void 0, this._bitmap = void 0, this.version = -1; + } + refresh() { + var _a; + (_a = this._bitmap) == null ? void 0 : _a.close(), this._bitmap = void 0, d.isSafari || (void 0 === this._commitTimeout && (this._commitTimeout = window.setTimeout(() => this._generate(), 100)), 1 === this._state && (this._state = 2)); + } + _generate() { + var _a; + 0 === this._state && ((_a = this._bitmap) == null ? void 0 : _a.close(), this._bitmap = void 0, this._state = 1, window.createImageBitmap(this.canvas).then((e3) => { + 2 === this._state ? this.refresh() : this._bitmap = e3, this._state = 0; + }), this._commitTimeout && (this._commitTimeout = void 0)); + } + } + }, 949: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CanvasRenderer = void 0; + const s2 = i2(627), r = i2(56), o = i2(374), n = i2(345), a = i2(859), h = i2(873), l = i2(43), c = i2(630), d = i2(744); + class _ extends a.Disposable { + constructor(e3, t3, i3, _2, u, g, f, v, C, p, m) { + super(), this._terminal = e3, this._screenElement = t3, this._bufferService = _2, this._charSizeService = u, this._optionsService = g, this._coreBrowserService = C, this._themeService = m, this._observerDisposable = this.register(new a.MutableDisposable()), this._onRequestRedraw = this.register(new n.EventEmitter()), this.onRequestRedraw = this._onRequestRedraw.event, this._onChangeTextureAtlas = this.register(new n.EventEmitter()), this.onChangeTextureAtlas = this._onChangeTextureAtlas.event, this._onAddTextureAtlasCanvas = this.register(new n.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event; + const x = this._optionsService.rawOptions.allowTransparency; + this._renderLayers = [new d.TextRenderLayer(this._terminal, this._screenElement, 0, x, this._bufferService, this._optionsService, f, p, this._coreBrowserService, m), new c.SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, p, this._optionsService, m), new l.LinkRenderLayer(this._terminal, this._screenElement, 2, i3, this._bufferService, this._optionsService, p, this._coreBrowserService, m), new h.CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, v, this._coreBrowserService, p, m)]; + for (const e4 of this._renderLayers) (0, n.forwardEvent)(e4.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas); + this.dimensions = (0, o.createRenderDimensions)(), this._devicePixelRatio = this._coreBrowserService.dpr, this._updateDimensions(), this._observerDisposable.value = (0, r.observeDevicePixelDimensions)(this._renderLayers[0].canvas, this._coreBrowserService.window, (e4, t4) => this._setCanvasDevicePixelDimensions(e4, t4)), this.register(this._coreBrowserService.onWindowChange((e4) => { + this._observerDisposable.value = (0, r.observeDevicePixelDimensions)(this._renderLayers[0].canvas, e4, (e5, t4) => this._setCanvasDevicePixelDimensions(e5, t4)); + })), this.register((0, a.toDisposable)(() => { + for (const e4 of this._renderLayers) e4.dispose(); + (0, s2.removeTerminalFromCache)(this._terminal); + })); + } + get textureAtlas() { + return this._renderLayers[0].cacheCanvas; + } + handleDevicePixelRatioChange() { + this._devicePixelRatio !== this._coreBrowserService.dpr && (this._devicePixelRatio = this._coreBrowserService.dpr, this.handleResize(this._bufferService.cols, this._bufferService.rows)); + } + handleResize(e3, t3) { + this._updateDimensions(); + for (const e4 of this._renderLayers) e4.resize(this.dimensions); + this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`, this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`; + } + handleCharSizeChanged() { + this.handleResize(this._bufferService.cols, this._bufferService.rows); + } + handleBlur() { + this._runOperation((e3) => e3.handleBlur()); + } + handleFocus() { + this._runOperation((e3) => e3.handleFocus()); + } + handleSelectionChanged(e3, t3, i3 = false) { + this._runOperation((s3) => s3.handleSelectionChanged(e3, t3, i3)), this._themeService.colors.selectionForeground && this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }); + } + handleCursorMove() { + this._runOperation((e3) => e3.handleCursorMove()); + } + clear() { + this._runOperation((e3) => e3.reset()); + } + _runOperation(e3) { + for (const t3 of this._renderLayers) e3(t3); + } + renderRows(e3, t3) { + for (const i3 of this._renderLayers) i3.handleGridChanged(e3, t3); + } + clearTextureAtlas() { + for (const e3 of this._renderLayers) e3.clearTextureAtlas(); + } + _updateDimensions() { + if (!this._charSizeService.hasValidSize) return; + const e3 = this._coreBrowserService.dpr; + this.dimensions.device.char.width = Math.floor(this._charSizeService.width * e3), this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * e3), this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight), this.dimensions.device.char.top = 1 === this._optionsService.rawOptions.lineHeight ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2), this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing), this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2), this.dimensions.device.canvas.height = this._bufferService.rows * this.dimensions.device.cell.height, this.dimensions.device.canvas.width = this._bufferService.cols * this.dimensions.device.cell.width, this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / e3), this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / e3), this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows, this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols; + } + _setCanvasDevicePixelDimensions(e3, t3) { + this.dimensions.device.canvas.height = t3, this.dimensions.device.canvas.width = e3; + for (const e4 of this._renderLayers) e4.resize(this.dimensions); + this._requestRedrawViewport(); + } + _requestRedrawViewport() { + this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }); + } + } + t2.CanvasRenderer = _; + }, 873: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CursorRenderLayer = void 0; + const s2 = i2(457), r = i2(859), o = i2(399), n = i2(782), a = i2(903); + class h extends a.BaseRenderLayer { + constructor(e3, t3, i3, s3, o2, a2, h2, l, c, d) { + super(e3, t3, "cursor", i3, true, d, o2, a2, c, l), this._onRequestRedraw = s3, this._coreService = h2, this._cursorBlinkStateManager = this.register(new r.MutableDisposable()), this._cell = new n.CellData(), this._state = { x: 0, y: 0, isFocused: false, style: "", width: 0 }, this._cursorRenderers = { bar: this._renderBarCursor.bind(this), block: this._renderBlockCursor.bind(this), underline: this._renderUnderlineCursor.bind(this), outline: this._renderOutlineCursor.bind(this) }, this.register(a2.onOptionChange(() => this._handleOptionsChanged())), this._handleOptionsChanged(); + } + resize(e3) { + super.resize(e3), this._state = { x: 0, y: 0, isFocused: false, style: "", width: 0 }; + } + reset() { + var _a; + this._clearCursor(), (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.restartBlinkAnimation(), this._handleOptionsChanged(); + } + handleBlur() { + var _a; + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.pause(), this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y }); + } + handleFocus() { + var _a; + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.resume(), this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y }); + } + _handleOptionsChanged() { + this._optionsService.rawOptions.cursorBlink ? this._cursorBlinkStateManager.value || (this._cursorBlinkStateManager.value = new s2.CursorBlinkStateManager(() => this._render(true), this._coreBrowserService)) : this._cursorBlinkStateManager.clear(), this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y }); + } + handleCursorMove() { + var _a; + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.restartBlinkAnimation(); + } + handleGridChanged(e3, t3) { + !this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isPaused ? this._render(false) : this._cursorBlinkStateManager.value.restartBlinkAnimation(); + } + _render(e3) { + if (!this._coreService.isCursorInitialized || this._coreService.isCursorHidden) return void this._clearCursor(); + const t3 = this._bufferService.buffer.ybase + this._bufferService.buffer.y, i3 = t3 - this._bufferService.buffer.ydisp; + if (i3 < 0 || i3 >= this._bufferService.rows) return void this._clearCursor(); + const s3 = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1); + if (this._bufferService.buffer.lines.get(t3).loadCell(s3, this._cell), void 0 !== this._cell.content) { + if (!this._coreBrowserService.isFocused) { + this._clearCursor(), this._ctx.save(), this._ctx.fillStyle = this._themeService.colors.cursor.css; + const e4 = this._optionsService.rawOptions.cursorStyle, t4 = this._optionsService.rawOptions.cursorInactiveStyle; + return t4 && "none" !== t4 && this._cursorRenderers[t4](s3, i3, this._cell), this._ctx.restore(), this._state.x = s3, this._state.y = i3, this._state.isFocused = false, this._state.style = e4, void (this._state.width = this._cell.getWidth()); + } + if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) { + if (this._state) { + if (this._state.x === s3 && this._state.y === i3 && this._state.isFocused === this._coreBrowserService.isFocused && this._state.style === this._optionsService.rawOptions.cursorStyle && this._state.width === this._cell.getWidth()) return; + this._clearCursor(); + } + this._ctx.save(), this._cursorRenderers[this._optionsService.rawOptions.cursorStyle || "block"](s3, i3, this._cell), this._ctx.restore(), this._state.x = s3, this._state.y = i3, this._state.isFocused = false, this._state.style = this._optionsService.rawOptions.cursorStyle, this._state.width = this._cell.getWidth(); + } else this._clearCursor(); + } + } + _clearCursor() { + this._state && (o.isFirefox || this._coreBrowserService.dpr < 1 ? this._clearAll() : this._clearCells(this._state.x, this._state.y, this._state.width, 1), this._state = { x: 0, y: 0, isFocused: false, style: "", width: 0 }); + } + _renderBarCursor(e3, t3, i3) { + this._ctx.save(), this._ctx.fillStyle = this._themeService.colors.cursor.css, this._fillLeftLineAtCell(e3, t3, this._optionsService.rawOptions.cursorWidth), this._ctx.restore(); + } + _renderBlockCursor(e3, t3, i3) { + this._ctx.save(), this._ctx.fillStyle = this._themeService.colors.cursor.css, this._fillCells(e3, t3, i3.getWidth(), 1), this._ctx.fillStyle = this._themeService.colors.cursorAccent.css, this._fillCharTrueColor(i3, e3, t3), this._ctx.restore(); + } + _renderUnderlineCursor(e3, t3, i3) { + this._ctx.save(), this._ctx.fillStyle = this._themeService.colors.cursor.css, this._fillBottomLineAtCells(e3, t3), this._ctx.restore(); + } + _renderOutlineCursor(e3, t3, i3) { + this._ctx.save(), this._ctx.strokeStyle = this._themeService.colors.cursor.css, this._strokeRectAtCell(e3, t3, i3.getWidth(), 1), this._ctx.restore(); + } + } + t2.CursorRenderLayer = h; + }, 574: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.GridCache = void 0, t2.GridCache = class { + constructor() { + this.cache = []; + } + resize(e3, t3) { + for (let i2 = 0; i2 < e3; i2++) { + this.cache.length <= i2 && this.cache.push([]); + for (let e4 = this.cache[i2].length; e4 < t3; e4++) this.cache[i2].push(void 0); + this.cache[i2].length = t3; + } + this.cache.length = e3; + } + clear() { + for (let e3 = 0; e3 < this.cache.length; e3++) for (let t3 = 0; t3 < this.cache[e3].length; t3++) this.cache[e3][t3] = void 0; + } + }; + }, 43: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkRenderLayer = void 0; + const s2 = i2(197), r = i2(237), o = i2(903); + class n extends o.BaseRenderLayer { + constructor(e3, t3, i3, s3, r2, o2, n2, a, h) { + super(e3, t3, "link", i3, true, h, r2, o2, n2, a), this.register(s3.onShowLinkUnderline((e4) => this._handleShowLinkUnderline(e4))), this.register(s3.onHideLinkUnderline((e4) => this._handleHideLinkUnderline(e4))); + } + resize(e3) { + super.resize(e3), this._state = void 0; + } + reset() { + this._clearCurrentLink(); + } + _clearCurrentLink() { + if (this._state) { + this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1); + const e3 = this._state.y2 - this._state.y1 - 1; + e3 > 0 && this._clearCells(0, this._state.y1 + 1, this._state.cols, e3), this._clearCells(0, this._state.y2, this._state.x2, 1), this._state = void 0; + } + } + _handleShowLinkUnderline(e3) { + if (e3.fg === r.INVERTED_DEFAULT_COLOR ? this._ctx.fillStyle = this._themeService.colors.background.css : e3.fg && (0, s2.is256Color)(e3.fg) ? this._ctx.fillStyle = this._themeService.colors.ansi[e3.fg].css : this._ctx.fillStyle = this._themeService.colors.foreground.css, e3.y1 === e3.y2) this._fillBottomLineAtCells(e3.x1, e3.y1, e3.x2 - e3.x1); + else { + this._fillBottomLineAtCells(e3.x1, e3.y1, e3.cols - e3.x1); + for (let t3 = e3.y1 + 1; t3 < e3.y2; t3++) this._fillBottomLineAtCells(0, t3, e3.cols); + this._fillBottomLineAtCells(0, e3.y2, e3.x2); + } + this._state = e3; + } + _handleHideLinkUnderline(e3) { + this._clearCurrentLink(); + } + } + t2.LinkRenderLayer = n; + }, 630: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.SelectionRenderLayer = void 0; + const s2 = i2(903); + class r extends s2.BaseRenderLayer { + constructor(e3, t3, i3, s3, r2, o, n, a) { + super(e3, t3, "selection", i3, true, a, s3, n, o, r2), this._clearState(); + } + _clearState() { + this._state = { start: void 0, end: void 0, columnSelectMode: void 0, ydisp: void 0 }; + } + resize(e3) { + super.resize(e3), this._selectionModel.selectionStart && this._selectionModel.selectionEnd && (this._clearState(), this._redrawSelection(this._selectionModel.selectionStart, this._selectionModel.selectionEnd, this._selectionModel.columnSelectMode)); + } + reset() { + this._state.start && this._state.end && (this._clearState(), this._clearAll()); + } + handleBlur() { + this.reset(), this._redrawSelection(this._selectionModel.selectionStart, this._selectionModel.selectionEnd, this._selectionModel.columnSelectMode); + } + handleFocus() { + this.reset(), this._redrawSelection(this._selectionModel.selectionStart, this._selectionModel.selectionEnd, this._selectionModel.columnSelectMode); + } + handleSelectionChanged(e3, t3, i3) { + super.handleSelectionChanged(e3, t3, i3), this._redrawSelection(e3, t3, i3); + } + _redrawSelection(e3, t3, i3) { + if (!this._didStateChange(e3, t3, i3, this._bufferService.buffer.ydisp)) return; + if (this._clearAll(), !e3 || !t3) return void this._clearState(); + const s3 = e3[1] - this._bufferService.buffer.ydisp, r2 = t3[1] - this._bufferService.buffer.ydisp, o = Math.max(s3, 0), n = Math.min(r2, this._bufferService.rows - 1); + if (o >= this._bufferService.rows || n < 0) this._state.ydisp = this._bufferService.buffer.ydisp; + else { + if (this._ctx.fillStyle = (this._coreBrowserService.isFocused ? this._themeService.colors.selectionBackgroundTransparent : this._themeService.colors.selectionInactiveBackgroundTransparent).css, i3) { + const i4 = e3[0], s4 = t3[0] - i4, r3 = n - o + 1; + this._fillCells(i4, o, s4, r3); + } else { + const i4 = s3 === o ? e3[0] : 0, a = o === r2 ? t3[0] : this._bufferService.cols; + this._fillCells(i4, o, a - i4, 1); + const h = Math.max(n - o - 1, 0); + if (this._fillCells(0, o + 1, this._bufferService.cols, h), o !== n) { + const e4 = r2 === n ? t3[0] : this._bufferService.cols; + this._fillCells(0, n, e4, 1); + } + } + this._state.start = [e3[0], e3[1]], this._state.end = [t3[0], t3[1]], this._state.columnSelectMode = i3, this._state.ydisp = this._bufferService.buffer.ydisp; + } + } + _didStateChange(e3, t3, i3, s3) { + return !this._areCoordinatesEqual(e3, this._state.start) || !this._areCoordinatesEqual(t3, this._state.end) || i3 !== this._state.columnSelectMode || s3 !== this._state.ydisp; + } + _areCoordinatesEqual(e3, t3) { + return !(!e3 || !t3) && e3[0] === t3[0] && e3[1] === t3[1]; + } + } + t2.SelectionRenderLayer = r; + }, 744: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TextRenderLayer = void 0; + const s2 = i2(577), r = i2(147), o = i2(782), n = i2(855), a = i2(903), h = i2(574); + class l extends a.BaseRenderLayer { + constructor(e3, t3, i3, s3, r2, n2, a2, l2, c, d) { + super(e3, t3, "text", i3, s3, d, r2, n2, l2, c), this._characterJoinerService = a2, this._characterWidth = 0, this._characterFont = "", this._characterOverlapCache = {}, this._workCell = new o.CellData(), this._state = new h.GridCache(), this.register(n2.onSpecificOptionChange("allowTransparency", (e4) => this._setTransparency(e4))); + } + resize(e3) { + super.resize(e3); + const t3 = this._getFont(false, false); + this._characterWidth === e3.device.char.width && this._characterFont === t3 || (this._characterWidth = e3.device.char.width, this._characterFont = t3, this._characterOverlapCache = {}), this._state.clear(), this._state.resize(this._bufferService.cols, this._bufferService.rows); + } + reset() { + this._state.clear(), this._clearAll(); + } + _forEachCell(e3, t3, i3) { + for (let r2 = e3; r2 <= t3; r2++) { + const e4 = r2 + this._bufferService.buffer.ydisp, t4 = this._bufferService.buffer.lines.get(e4), o2 = this._characterJoinerService.getJoinedCharacters(e4); + for (let e5 = 0; e5 < this._bufferService.cols; e5++) { + t4.loadCell(e5, this._workCell); + let a2 = this._workCell, h2 = false, l2 = e5; + if (0 !== a2.getWidth()) { + if (o2.length > 0 && e5 === o2[0][0]) { + h2 = true; + const e6 = o2.shift(); + a2 = new s2.JoinedCellData(this._workCell, t4.translateToString(true, e6[0], e6[1]), e6[1] - e6[0]), l2 = e6[1] - 1; + } + !h2 && this._isOverlapping(a2) && l2 < t4.length - 1 && t4.getCodePoint(l2 + 1) === n.NULL_CELL_CODE && (a2.content &= -12582913, a2.content |= 2 << 22), i3(a2, e5, r2), e5 = l2; + } + } + } + } + _drawBackground(e3, t3) { + const i3 = this._ctx, s3 = this._bufferService.cols; + let o2 = 0, n2 = 0, a2 = null; + i3.save(), this._forEachCell(e3, t3, (e4, t4, h2) => { + let l2 = null; + e4.isInverse() ? l2 = e4.isFgDefault() ? this._themeService.colors.foreground.css : e4.isFgRGB() ? `rgb(${r.AttributeData.toColorRGB(e4.getFgColor()).join(",")})` : this._themeService.colors.ansi[e4.getFgColor()].css : e4.isBgRGB() ? l2 = `rgb(${r.AttributeData.toColorRGB(e4.getBgColor()).join(",")})` : e4.isBgPalette() && (l2 = this._themeService.colors.ansi[e4.getBgColor()].css); + let c = false; + this._decorationService.forEachDecorationAtCell(t4, this._bufferService.buffer.ydisp + h2, void 0, (e5) => { + "top" !== e5.options.layer && c || (e5.backgroundColorRGB && (l2 = e5.backgroundColorRGB.css), c = "top" === e5.options.layer); + }), null === a2 && (o2 = t4, n2 = h2), h2 !== n2 ? (i3.fillStyle = a2 || "", this._fillCells(o2, n2, s3 - o2, 1), o2 = t4, n2 = h2) : a2 !== l2 && (i3.fillStyle = a2 || "", this._fillCells(o2, n2, t4 - o2, 1), o2 = t4, n2 = h2), a2 = l2; + }), null !== a2 && (i3.fillStyle = a2, this._fillCells(o2, n2, s3 - o2, 1)), i3.restore(); + } + _drawForeground(e3, t3) { + this._forEachCell(e3, t3, (e4, t4, i3) => this._drawChars(e4, t4, i3)); + } + handleGridChanged(e3, t3) { + 0 !== this._state.cache.length && (this._charAtlas && this._charAtlas.beginFrame(), this._clearCells(0, e3, this._bufferService.cols, t3 - e3 + 1), this._drawBackground(e3, t3), this._drawForeground(e3, t3)); + } + _isOverlapping(e3) { + if (1 !== e3.getWidth()) return false; + if (e3.getCode() < 256) return false; + const t3 = e3.getChars(); + if (this._characterOverlapCache.hasOwnProperty(t3)) return this._characterOverlapCache[t3]; + this._ctx.save(), this._ctx.font = this._characterFont; + const i3 = Math.floor(this._ctx.measureText(t3).width) > this._characterWidth; + return this._ctx.restore(), this._characterOverlapCache[t3] = i3, i3; + } + } + t2.TextRenderLayer = l; + }, 274: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellColorResolver = void 0; + const s2 = i2(855), r = i2(160), o = i2(374); + let n, a = 0, h = 0, l = false, c = false, d = false, _ = 0; + t2.CellColorResolver = class { + constructor(e3, t3, i3, s3, r2, o2) { + this._terminal = e3, this._optionService = t3, this._selectionRenderModel = i3, this._decorationService = s3, this._coreBrowserService = r2, this._themeService = o2, this.result = { fg: 0, bg: 0, ext: 0 }; + } + resolve(e3, t3, i3, u) { + if (this.result.bg = e3.bg, this.result.fg = e3.fg, this.result.ext = 268435456 & e3.bg ? e3.extended.ext : 0, h = 0, a = 0, c = false, l = false, d = false, n = this._themeService.colors, _ = 0, e3.getCode() !== s2.NULL_CELL_CODE && 4 === e3.extended.underlineStyle) { + const e4 = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15)); + _ = t3 * u % (2 * Math.round(e4)); + } + if (this._decorationService.forEachDecorationAtCell(t3, i3, "bottom", (e4) => { + e4.backgroundColorRGB && (h = e4.backgroundColorRGB.rgba >> 8 & 16777215, c = true), e4.foregroundColorRGB && (a = e4.foregroundColorRGB.rgba >> 8 & 16777215, l = true); + }), d = this._selectionRenderModel.isCellSelected(this._terminal, t3, i3), d) { + if (67108864 & this.result.fg || 0 != (50331648 & this.result.bg)) { + if (67108864 & this.result.fg) switch (50331648 & this.result.fg) { + case 16777216: + case 33554432: + h = this._themeService.colors.ansi[255 & this.result.fg].rgba; + break; + case 50331648: + h = (16777215 & this.result.fg) << 8 | 255; + break; + default: + h = this._themeService.colors.foreground.rgba; + } + else switch (50331648 & this.result.bg) { + case 16777216: + case 33554432: + h = this._themeService.colors.ansi[255 & this.result.bg].rgba; + break; + case 50331648: + h = (16777215 & this.result.bg) << 8 | 255; + } + h = r.rgba.blend(h, 4294967040 & (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba | 128) >> 8 & 16777215; + } else h = (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba >> 8 & 16777215; + if (c = true, n.selectionForeground && (a = n.selectionForeground.rgba >> 8 & 16777215, l = true), (0, o.treatGlyphAsBackgroundColor)(e3.getCode())) { + if (67108864 & this.result.fg && 0 == (50331648 & this.result.bg)) a = (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba >> 8 & 16777215; + else { + if (67108864 & this.result.fg) switch (50331648 & this.result.bg) { + case 16777216: + case 33554432: + a = this._themeService.colors.ansi[255 & this.result.bg].rgba; + break; + case 50331648: + a = (16777215 & this.result.bg) << 8 | 255; + } + else switch (50331648 & this.result.fg) { + case 16777216: + case 33554432: + a = this._themeService.colors.ansi[255 & this.result.fg].rgba; + break; + case 50331648: + a = (16777215 & this.result.fg) << 8 | 255; + break; + default: + a = this._themeService.colors.foreground.rgba; + } + a = r.rgba.blend(a, 4294967040 & (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba | 128) >> 8 & 16777215; + } + l = true; + } + } + this._decorationService.forEachDecorationAtCell(t3, i3, "top", (e4) => { + e4.backgroundColorRGB && (h = e4.backgroundColorRGB.rgba >> 8 & 16777215, c = true), e4.foregroundColorRGB && (a = e4.foregroundColorRGB.rgba >> 8 & 16777215, l = true); + }), c && (h = d ? -16777216 & e3.bg & -134217729 | h | 50331648 : -16777216 & e3.bg | h | 50331648), l && (a = -16777216 & e3.fg & -67108865 | a | 50331648), 67108864 & this.result.fg && (c && !l && (a = 0 == (50331648 & this.result.bg) ? -134217728 & this.result.fg | 16777215 & n.background.rgba >> 8 | 50331648 : -134217728 & this.result.fg | 67108863 & this.result.bg, l = true), !c && l && (h = 0 == (50331648 & this.result.fg) ? -67108864 & this.result.bg | 16777215 & n.foreground.rgba >> 8 | 50331648 : -67108864 & this.result.bg | 67108863 & this.result.fg, c = true)), n = void 0, this.result.bg = c ? h : this.result.bg, this.result.fg = l ? a : this.result.fg, this.result.ext &= 536870911, this.result.ext |= _ << 29 & 3758096384; + } + }; + }, 627: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.removeTerminalFromCache = t2.acquireTextureAtlas = void 0; + const s2 = i2(509), r = i2(197), o = []; + t2.acquireTextureAtlas = function(e3, t3, i3, n, a, h, l, c) { + const d = (0, r.generateConfig)(n, a, h, l, t3, i3, c); + for (let t4 = 0; t4 < o.length; t4++) { + const i4 = o[t4], s3 = i4.ownedBy.indexOf(e3); + if (s3 >= 0) { + if ((0, r.configEquals)(i4.config, d)) return i4.atlas; + 1 === i4.ownedBy.length ? (i4.atlas.dispose(), o.splice(t4, 1)) : i4.ownedBy.splice(s3, 1); + break; + } + } + for (let t4 = 0; t4 < o.length; t4++) { + const i4 = o[t4]; + if ((0, r.configEquals)(i4.config, d)) return i4.ownedBy.push(e3), i4.atlas; + } + const _ = e3._core, u = { atlas: new s2.TextureAtlas(document, d, _.unicodeService), config: d, ownedBy: [e3] }; + return o.push(u), u.atlas; + }, t2.removeTerminalFromCache = function(e3) { + for (let t3 = 0; t3 < o.length; t3++) { + const i3 = o[t3].ownedBy.indexOf(e3); + if (-1 !== i3) { + 1 === o[t3].ownedBy.length ? (o[t3].atlas.dispose(), o.splice(t3, 1)) : o[t3].ownedBy.splice(i3, 1); + break; + } + } + }; + }, 197: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.is256Color = t2.configEquals = t2.generateConfig = void 0; + const s2 = i2(160); + t2.generateConfig = function(e3, t3, i3, r, o, n, a) { + const h = { foreground: n.foreground, background: n.background, cursor: s2.NULL_COLOR, cursorAccent: s2.NULL_COLOR, selectionForeground: s2.NULL_COLOR, selectionBackgroundTransparent: s2.NULL_COLOR, selectionBackgroundOpaque: s2.NULL_COLOR, selectionInactiveBackgroundTransparent: s2.NULL_COLOR, selectionInactiveBackgroundOpaque: s2.NULL_COLOR, ansi: n.ansi.slice(), contrastCache: n.contrastCache, halfContrastCache: n.halfContrastCache }; + return { customGlyphs: o.customGlyphs, devicePixelRatio: a, letterSpacing: o.letterSpacing, lineHeight: o.lineHeight, deviceCellWidth: e3, deviceCellHeight: t3, deviceCharWidth: i3, deviceCharHeight: r, fontFamily: o.fontFamily, fontSize: o.fontSize, fontWeight: o.fontWeight, fontWeightBold: o.fontWeightBold, allowTransparency: o.allowTransparency, drawBoldTextInBrightColors: o.drawBoldTextInBrightColors, minimumContrastRatio: o.minimumContrastRatio, colors: h }; + }, t2.configEquals = function(e3, t3) { + for (let i3 = 0; i3 < e3.colors.ansi.length; i3++) if (e3.colors.ansi[i3].rgba !== t3.colors.ansi[i3].rgba) return false; + return e3.devicePixelRatio === t3.devicePixelRatio && e3.customGlyphs === t3.customGlyphs && e3.lineHeight === t3.lineHeight && e3.letterSpacing === t3.letterSpacing && e3.fontFamily === t3.fontFamily && e3.fontSize === t3.fontSize && e3.fontWeight === t3.fontWeight && e3.fontWeightBold === t3.fontWeightBold && e3.allowTransparency === t3.allowTransparency && e3.deviceCharWidth === t3.deviceCharWidth && e3.deviceCharHeight === t3.deviceCharHeight && e3.drawBoldTextInBrightColors === t3.drawBoldTextInBrightColors && e3.minimumContrastRatio === t3.minimumContrastRatio && e3.colors.foreground.rgba === t3.colors.foreground.rgba && e3.colors.background.rgba === t3.colors.background.rgba; + }, t2.is256Color = function(e3) { + return 16777216 == (50331648 & e3) || 33554432 == (50331648 & e3); + }; + }, 237: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TEXT_BASELINE = t2.DIM_OPACITY = t2.INVERTED_DEFAULT_COLOR = void 0; + const s2 = i2(399); + t2.INVERTED_DEFAULT_COLOR = 257, t2.DIM_OPACITY = 0.5, t2.TEXT_BASELINE = s2.isFirefox || s2.isLegacyEdge ? "bottom" : "ideographic"; + }, 457: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CursorBlinkStateManager = void 0; + t2.CursorBlinkStateManager = class { + constructor(e3, t3) { + this._renderCallback = e3, this._coreBrowserService = t3, this.isCursorVisible = true, this._coreBrowserService.isFocused && this._restartInterval(); + } + get isPaused() { + return !(this._blinkStartTimeout || this._blinkInterval); + } + dispose() { + this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout && (this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout), this._blinkStartTimeout = void 0), this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + restartBlinkAnimation() { + this.isPaused || (this._animationTimeRestarted = Date.now(), this.isCursorVisible = true, this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._renderCallback(), this._animationFrame = void 0; + }))); + } + _restartInterval(e3 = 600) { + this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => { + if (this._animationTimeRestarted) { + const e4 = 600 - (Date.now() - this._animationTimeRestarted); + if (this._animationTimeRestarted = void 0, e4 > 0) return void this._restartInterval(e4); + } + this.isCursorVisible = false, this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._renderCallback(), this._animationFrame = void 0; + }), this._blinkInterval = this._coreBrowserService.window.setInterval(() => { + if (this._animationTimeRestarted) { + const e4 = 600 - (Date.now() - this._animationTimeRestarted); + return this._animationTimeRestarted = void 0, void this._restartInterval(e4); + } + this.isCursorVisible = !this.isCursorVisible, this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._renderCallback(), this._animationFrame = void 0; + }); + }, 600); + }, e3); + } + pause() { + this.isCursorVisible = true, this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout && (this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout), this._blinkStartTimeout = void 0), this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + resume() { + this.pause(), this._animationTimeRestarted = void 0, this._restartInterval(), this.restartBlinkAnimation(); + } + }; + }, 860: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.tryDrawCustomChar = t2.powerlineDefinitions = t2.boxDrawingDefinitions = t2.blockElementDefinitions = void 0; + const s2 = i2(374); + t2.blockElementDefinitions = { "▀": [{ x: 0, y: 0, w: 8, h: 4 }], "▁": [{ x: 0, y: 7, w: 8, h: 1 }], "▂": [{ x: 0, y: 6, w: 8, h: 2 }], "▃": [{ x: 0, y: 5, w: 8, h: 3 }], "▄": [{ x: 0, y: 4, w: 8, h: 4 }], "▅": [{ x: 0, y: 3, w: 8, h: 5 }], "▆": [{ x: 0, y: 2, w: 8, h: 6 }], "▇": [{ x: 0, y: 1, w: 8, h: 7 }], "█": [{ x: 0, y: 0, w: 8, h: 8 }], "▉": [{ x: 0, y: 0, w: 7, h: 8 }], "▊": [{ x: 0, y: 0, w: 6, h: 8 }], "▋": [{ x: 0, y: 0, w: 5, h: 8 }], "▌": [{ x: 0, y: 0, w: 4, h: 8 }], "▍": [{ x: 0, y: 0, w: 3, h: 8 }], "▎": [{ x: 0, y: 0, w: 2, h: 8 }], "▏": [{ x: 0, y: 0, w: 1, h: 8 }], "▐": [{ x: 4, y: 0, w: 4, h: 8 }], "▔": [{ x: 0, y: 0, w: 8, h: 1 }], "▕": [{ x: 7, y: 0, w: 1, h: 8 }], "▖": [{ x: 0, y: 4, w: 4, h: 4 }], "▗": [{ x: 4, y: 4, w: 4, h: 4 }], "▘": [{ x: 0, y: 0, w: 4, h: 4 }], "▙": [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], "▚": [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], "▛": [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], "▜": [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], "▝": [{ x: 4, y: 0, w: 4, h: 4 }], "▞": [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], "▟": [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], "🭰": [{ x: 1, y: 0, w: 1, h: 8 }], "🭱": [{ x: 2, y: 0, w: 1, h: 8 }], "🭲": [{ x: 3, y: 0, w: 1, h: 8 }], "🭳": [{ x: 4, y: 0, w: 1, h: 8 }], "🭴": [{ x: 5, y: 0, w: 1, h: 8 }], "🭵": [{ x: 6, y: 0, w: 1, h: 8 }], "🭶": [{ x: 0, y: 1, w: 8, h: 1 }], "🭷": [{ x: 0, y: 2, w: 8, h: 1 }], "🭸": [{ x: 0, y: 3, w: 8, h: 1 }], "🭹": [{ x: 0, y: 4, w: 8, h: 1 }], "🭺": [{ x: 0, y: 5, w: 8, h: 1 }], "🭻": [{ x: 0, y: 6, w: 8, h: 1 }], "🭼": [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }], "🭽": [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }], "🭾": [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }], "🭿": [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }], "🮀": [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }], "🮁": [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }], "🮂": [{ x: 0, y: 0, w: 8, h: 2 }], "🮃": [{ x: 0, y: 0, w: 8, h: 3 }], "🮄": [{ x: 0, y: 0, w: 8, h: 5 }], "🮅": [{ x: 0, y: 0, w: 8, h: 6 }], "🮆": [{ x: 0, y: 0, w: 8, h: 7 }], "🮇": [{ x: 6, y: 0, w: 2, h: 8 }], "🮈": [{ x: 5, y: 0, w: 3, h: 8 }], "🮉": [{ x: 3, y: 0, w: 5, h: 8 }], "🮊": [{ x: 2, y: 0, w: 6, h: 8 }], "🮋": [{ x: 1, y: 0, w: 7, h: 8 }], "🮕": [{ x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 }, { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 }, { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 }, { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }], "🮖": [{ x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 }, { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 }, { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 }, { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }], "🮗": [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }] }; + const r = { "░": [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0]], "▒": [[1, 0], [0, 0], [0, 1], [0, 0]], "▓": [[0, 1], [1, 1], [1, 0], [1, 1]] }; + t2.boxDrawingDefinitions = { "─": { 1: "M0,.5 L1,.5" }, "━": { 3: "M0,.5 L1,.5" }, "│": { 1: "M.5,0 L.5,1" }, "┃": { 3: "M.5,0 L.5,1" }, "┌": { 1: "M0.5,1 L.5,.5 L1,.5" }, "┏": { 3: "M0.5,1 L.5,.5 L1,.5" }, "┐": { 1: "M0,.5 L.5,.5 L.5,1" }, "┓": { 3: "M0,.5 L.5,.5 L.5,1" }, "└": { 1: "M.5,0 L.5,.5 L1,.5" }, "┗": { 3: "M.5,0 L.5,.5 L1,.5" }, "┘": { 1: "M.5,0 L.5,.5 L0,.5" }, "┛": { 3: "M.5,0 L.5,.5 L0,.5" }, "├": { 1: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "┣": { 3: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "┤": { 1: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "┫": { 3: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "┬": { 1: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "┳": { 3: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "┴": { 1: "M0,.5 L1,.5 M.5,.5 L.5,0" }, "┻": { 3: "M0,.5 L1,.5 M.5,.5 L.5,0" }, "┼": { 1: "M0,.5 L1,.5 M.5,0 L.5,1" }, "╋": { 3: "M0,.5 L1,.5 M.5,0 L.5,1" }, "╴": { 1: "M.5,.5 L0,.5" }, "╸": { 3: "M.5,.5 L0,.5" }, "╵": { 1: "M.5,.5 L.5,0" }, "╹": { 3: "M.5,.5 L.5,0" }, "╶": { 1: "M.5,.5 L1,.5" }, "╺": { 3: "M.5,.5 L1,.5" }, "╷": { 1: "M.5,.5 L.5,1" }, "╻": { 3: "M.5,.5 L.5,1" }, "═": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "║": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "╒": { 1: (e3, t3) => `M.5,1 L.5,${0.5 - t3} L1,${0.5 - t3} M.5,${0.5 + t3} L1,${0.5 + t3}` }, "╓": { 1: (e3, t3) => `M${0.5 - e3},1 L${0.5 - e3},.5 L1,.5 M${0.5 + e3},.5 L${0.5 + e3},1` }, "╔": { 1: (e3, t3) => `M1,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1` }, "╕": { 1: (e3, t3) => `M0,${0.5 - t3} L.5,${0.5 - t3} L.5,1 M0,${0.5 + t3} L.5,${0.5 + t3}` }, "╖": { 1: (e3, t3) => `M${0.5 + e3},1 L${0.5 + e3},.5 L0,.5 M${0.5 - e3},.5 L${0.5 - e3},1` }, "╗": { 1: (e3, t3) => `M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M0,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},1` }, "╘": { 1: (e3, t3) => `M.5,0 L.5,${0.5 + t3} L1,${0.5 + t3} M.5,${0.5 - t3} L1,${0.5 - t3}` }, "╙": { 1: (e3, t3) => `M1,.5 L${0.5 - e3},.5 L${0.5 - e3},0 M${0.5 + e3},.5 L${0.5 + e3},0` }, "╚": { 1: (e3, t3) => `M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0 M1,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},0` }, "╛": { 1: (e3, t3) => `M0,${0.5 + t3} L.5,${0.5 + t3} L.5,0 M0,${0.5 - t3} L.5,${0.5 - t3}` }, "╜": { 1: (e3, t3) => `M0,.5 L${0.5 + e3},.5 L${0.5 + e3},0 M${0.5 - e3},.5 L${0.5 - e3},0` }, "╝": { 1: (e3, t3) => `M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M0,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},0` }, "╞": { 1: (e3, t3) => `M.5,0 L.5,1 M.5,${0.5 - t3} L1,${0.5 - t3} M.5,${0.5 + t3} L1,${0.5 + t3}` }, "╟": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1 M${0.5 + e3},.5 L1,.5` }, "╠": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "╡": { 1: (e3, t3) => `M.5,0 L.5,1 M0,${0.5 - t3} L.5,${0.5 - t3} M0,${0.5 + t3} L.5,${0.5 + t3}` }, "╢": { 1: (e3, t3) => `M0,.5 L${0.5 - e3},.5 M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "╣": { 1: (e3, t3) => `M${0.5 + e3},0 L${0.5 + e3},1 M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0` }, "╤": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3} M.5,${0.5 + t3} L.5,1` }, "╥": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},.5 L${0.5 - e3},1 M${0.5 + e3},.5 L${0.5 + e3},1` }, "╦": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1` }, "╧": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3} M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "╨": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},.5 L${0.5 - e3},0 M${0.5 + e3},.5 L${0.5 + e3},0` }, "╩": { 1: (e3, t3) => `M0,${0.5 + t3} L1,${0.5 + t3} M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "╪": { 1: (e3, t3) => `M.5,0 L.5,1 M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "╫": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "╬": { 1: (e3, t3) => `M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1 M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "╱": { 1: "M1,0 L0,1" }, "╲": { 1: "M0,0 L1,1" }, "╳": { 1: "M1,0 L0,1 M0,0 L1,1" }, "╼": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "╽": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L.5,1" }, "╾": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "╿": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "┍": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L1,.5" }, "┎": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "┑": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L0,.5" }, "┒": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L.5,1" }, "┕": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L1,.5" }, "┖": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "┙": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L0,.5" }, "┚": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L.5,0" }, "┝": { 1: "M.5,0 L.5,1", 3: "M.5,.5 L1,.5" }, "┞": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "┟": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "┠": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,1" }, "┡": { 1: "M.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L1,.5" }, "┢": { 1: "M.5,.5 L.5,0", 3: "M0.5,1 L.5,.5 L1,.5" }, "┥": { 1: "M.5,0 L.5,1", 3: "M.5,.5 L0,.5" }, "┦": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "┧": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M.5,.5 L.5,1" }, "┨": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,1" }, "┩": { 1: "M.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L0,.5" }, "┪": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L.5,.5 L.5,1" }, "┭": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "┮": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,.5 L1,.5" }, "┯": { 1: "M.5,.5 L.5,1", 3: "M0,.5 L1,.5" }, "┰": { 1: "M0,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "┱": { 1: "M.5,.5 L1,.5", 3: "M0,.5 L.5,.5 L.5,1" }, "┲": { 1: "M.5,.5 L0,.5", 3: "M0.5,1 L.5,.5 L1,.5" }, "┵": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "┶": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "┷": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L1,.5" }, "┸": { 1: "M0,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "┹": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,.5 L0,.5" }, "┺": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,.5 L1,.5" }, "┽": { 1: "M.5,0 L.5,1 M.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "┾": { 1: "M.5,0 L.5,1 M.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "┿": { 1: "M.5,0 L.5,1", 3: "M0,.5 L1,.5" }, "╀": { 1: "M0,.5 L1,.5 M.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "╁": { 1: "M.5,.5 L.5,0 M0,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "╂": { 1: "M0,.5 L1,.5", 3: "M.5,0 L.5,1" }, "╃": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,0 L.5,.5 L0,.5" }, "╄": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L1,.5" }, "╅": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M0,.5 L.5,.5 L.5,1" }, "╆": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M0.5,1 L.5,.5 L1,.5" }, "╇": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L.5,0 M0,.5 L1,.5" }, "╈": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "╉": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "╊": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "╌": { 1: "M.1,.5 L.4,.5 M.6,.5 L.9,.5" }, "╍": { 3: "M.1,.5 L.4,.5 M.6,.5 L.9,.5" }, "┄": { 1: "M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5" }, "┅": { 3: "M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5" }, "┈": { 1: "M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5" }, "┉": { 3: "M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5" }, "╎": { 1: "M.5,.1 L.5,.4 M.5,.6 L.5,.9" }, "╏": { 3: "M.5,.1 L.5,.4 M.5,.6 L.5,.9" }, "┆": { 1: "M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333" }, "┇": { 3: "M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333" }, "┊": { 1: "M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95" }, "┋": { 3: "M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95" }, "╭": { 1: (e3, t3) => `M.5,1 L.5,${0.5 + t3 / 0.15 * 0.5} C.5,${0.5 + t3 / 0.15 * 0.5},.5,.5,1,.5` }, "╮": { 1: (e3, t3) => `M.5,1 L.5,${0.5 + t3 / 0.15 * 0.5} C.5,${0.5 + t3 / 0.15 * 0.5},.5,.5,0,.5` }, "╯": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3 / 0.15 * 0.5} C.5,${0.5 - t3 / 0.15 * 0.5},.5,.5,0,.5` }, "╰": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3 / 0.15 * 0.5} C.5,${0.5 - t3 / 0.15 * 0.5},.5,.5,1,.5` } }, t2.powerlineDefinitions = { "": { d: "M0,0 L1,.5 L0,1", type: 0, rightPadding: 2 }, "": { d: "M-1,-.5 L1,.5 L-1,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M1,0 L0,.5 L1,1", type: 0, leftPadding: 2 }, "": { d: "M2,-.5 L0,.5 L2,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0", type: 0, rightPadding: 1 }, "": { d: "M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0", type: 1, rightPadding: 1 }, "": { d: "M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0", type: 0, leftPadding: 1 }, "": { d: "M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0", type: 1, leftPadding: 1 }, "": { d: "M-.5,-.5 L1.5,1.5 L-.5,1.5", type: 0 }, "": { d: "M-.5,-.5 L1.5,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M1.5,-.5 L-.5,1.5 L1.5,1.5", type: 0 }, "": { d: "M1.5,-.5 L-.5,1.5 L-.5,-.5", type: 0 }, "": { d: "M1.5,-.5 L-.5,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M-.5,-.5 L1.5,1.5 L1.5,-.5", type: 0 } }, t2.powerlineDefinitions[""] = t2.powerlineDefinitions[""], t2.powerlineDefinitions[""] = t2.powerlineDefinitions[""], t2.tryDrawCustomChar = function(e3, i3, n2, l, c, d, _, u) { + const g = t2.blockElementDefinitions[i3]; + if (g) return function(e4, t3, i4, s3, r2, o2) { + for (let n3 = 0; n3 < t3.length; n3++) { + const a2 = t3[n3], h2 = r2 / 8, l2 = o2 / 8; + e4.fillRect(i4 + a2.x * h2, s3 + a2.y * l2, a2.w * h2, a2.h * l2); + } + }(e3, g, n2, l, c, d), true; + const f = r[i3]; + if (f) return function(e4, t3, i4, r2, n3, a2) { + let h2 = o.get(t3); + h2 || (h2 = /* @__PURE__ */ new Map(), o.set(t3, h2)); + const l2 = e4.fillStyle; + if ("string" != typeof l2) throw new Error(`Unexpected fillStyle type "${l2}"`); + let c2 = h2.get(l2); + if (!c2) { + const i5 = t3[0].length, r3 = t3.length, o2 = e4.canvas.ownerDocument.createElement("canvas"); + o2.width = i5, o2.height = r3; + const n4 = (0, s2.throwIfFalsy)(o2.getContext("2d")), a3 = new ImageData(i5, r3); + let d2, _2, u2, g2; + if (l2.startsWith("#")) d2 = parseInt(l2.slice(1, 3), 16), _2 = parseInt(l2.slice(3, 5), 16), u2 = parseInt(l2.slice(5, 7), 16), g2 = l2.length > 7 && parseInt(l2.slice(7, 9), 16) || 1; + else { + if (!l2.startsWith("rgba")) throw new Error(`Unexpected fillStyle color format "${l2}" when drawing pattern glyph`); + [d2, _2, u2, g2] = l2.substring(5, l2.length - 1).split(",").map((e5) => parseFloat(e5)); + } + for (let e5 = 0; e5 < r3; e5++) for (let s3 = 0; s3 < i5; s3++) a3.data[4 * (e5 * i5 + s3)] = d2, a3.data[4 * (e5 * i5 + s3) + 1] = _2, a3.data[4 * (e5 * i5 + s3) + 2] = u2, a3.data[4 * (e5 * i5 + s3) + 3] = t3[e5][s3] * (255 * g2); + n4.putImageData(a3, 0, 0), c2 = (0, s2.throwIfFalsy)(e4.createPattern(o2, null)), h2.set(l2, c2); + } + e4.fillStyle = c2, e4.fillRect(i4, r2, n3, a2); + }(e3, f, n2, l, c, d), true; + const v = t2.boxDrawingDefinitions[i3]; + if (v) return function(e4, t3, i4, s3, r2, o2, n3) { + e4.strokeStyle = e4.fillStyle; + for (const [l2, c2] of Object.entries(t3)) { + let t4; + e4.beginPath(), e4.lineWidth = n3 * Number.parseInt(l2), t4 = "function" == typeof c2 ? c2(0.15, 0.15 / o2 * r2) : c2; + for (const l3 of t4.split(" ")) { + const t5 = l3[0], c3 = a[t5]; + if (!c3) { + console.error(`Could not find drawing instructions for "${t5}"`); + continue; + } + const d2 = l3.substring(1).split(","); + d2[0] && d2[1] && c3(e4, h(d2, r2, o2, i4, s3, true, n3)); + } + e4.stroke(), e4.closePath(); + } + }(e3, v, n2, l, c, d, u), true; + const C = t2.powerlineDefinitions[i3]; + return !!C && (function(e4, t3, i4, s3, r2, o2, n3, l2) { + const c2 = new Path2D(); + c2.rect(i4, s3, r2, o2), e4.clip(c2), e4.beginPath(); + const d2 = n3 / 12; + e4.lineWidth = l2 * d2; + for (const n4 of t3.d.split(" ")) { + const c3 = n4[0], _2 = a[c3]; + if (!_2) { + console.error(`Could not find drawing instructions for "${c3}"`); + continue; + } + const u2 = n4.substring(1).split(","); + u2[0] && u2[1] && _2(e4, h(u2, r2, o2, i4, s3, false, l2, (t3.leftPadding ?? 0) * (d2 / 2), (t3.rightPadding ?? 0) * (d2 / 2))); + } + 1 === t3.type ? (e4.strokeStyle = e4.fillStyle, e4.stroke()) : e4.fill(), e4.closePath(); + }(e3, C, n2, l, c, d, _, u), true); + }; + const o = /* @__PURE__ */ new Map(); + function n(e3, t3, i3 = 0) { + return Math.max(Math.min(e3, t3), i3); + } + const a = { C: (e3, t3) => e3.bezierCurveTo(t3[0], t3[1], t3[2], t3[3], t3[4], t3[5]), L: (e3, t3) => e3.lineTo(t3[0], t3[1]), M: (e3, t3) => e3.moveTo(t3[0], t3[1]) }; + function h(e3, t3, i3, s3, r2, o2, a2, h2 = 0, l = 0) { + const c = e3.map((e4) => parseFloat(e4) || parseInt(e4)); + if (c.length < 2) throw new Error("Too few arguments for instruction"); + for (let e4 = 0; e4 < c.length; e4 += 2) c[e4] *= t3 - h2 * a2 - l * a2, o2 && 0 !== c[e4] && (c[e4] = n(Math.round(c[e4] + 0.5) - 0.5, t3, 0)), c[e4] += s3 + h2 * a2; + for (let e4 = 1; e4 < c.length; e4 += 2) c[e4] *= i3, o2 && 0 !== c[e4] && (c[e4] = n(Math.round(c[e4] + 0.5) - 0.5, i3, 0)), c[e4] += r2; + return c; + } + }, 56: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.observeDevicePixelDimensions = void 0; + const s2 = i2(859); + t2.observeDevicePixelDimensions = function(e3, t3, i3) { + let r = new t3.ResizeObserver((t4) => { + const s3 = t4.find((t5) => t5.target === e3); + if (!s3) return; + if (!("devicePixelContentBoxSize" in s3)) return r == null ? void 0 : r.disconnect(), void (r = void 0); + const o = s3.devicePixelContentBoxSize[0].inlineSize, n = s3.devicePixelContentBoxSize[0].blockSize; + o > 0 && n > 0 && i3(o, n); + }); + try { + r.observe(e3, { box: ["device-pixel-content-box"] }); + } catch { + r.disconnect(), r = void 0; + } + return (0, s2.toDisposable)(() => r == null ? void 0 : r.disconnect()); + }; + }, 374: (e2, t2) => { + function i2(e3) { + return 57508 <= e3 && e3 <= 57558; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.computeNextVariantOffset = t2.createRenderDimensions = t2.treatGlyphAsBackgroundColor = t2.isRestrictedPowerlineGlyph = t2.isPowerlineGlyph = t2.throwIfFalsy = void 0, t2.throwIfFalsy = function(e3) { + if (!e3) throw new Error("value must not be falsy"); + return e3; + }, t2.isPowerlineGlyph = i2, t2.isRestrictedPowerlineGlyph = function(e3) { + return 57520 <= e3 && e3 <= 57527; + }, t2.treatGlyphAsBackgroundColor = function(e3) { + return i2(e3) || function(e4) { + return 9472 <= e4 && e4 <= 9631; + }(e3); + }, t2.createRenderDimensions = function() { + return { css: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 } }, device: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 }, char: { width: 0, height: 0, left: 0, top: 0 } } }; + }, t2.computeNextVariantOffset = function(e3, t3, i3 = 0) { + return (e3 - (2 * Math.round(t3) - i3)) % (2 * Math.round(t3)); + }; + }, 296: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createSelectionRenderModel = void 0; + class i2 { + constructor() { + this.clear(); + } + clear() { + this.hasSelection = false, this.columnSelectMode = false, this.viewportStartRow = 0, this.viewportEndRow = 0, this.viewportCappedStartRow = 0, this.viewportCappedEndRow = 0, this.startCol = 0, this.endCol = 0, this.selectionStart = void 0, this.selectionEnd = void 0; + } + update(e3, t3, i3, s2 = false) { + if (this.selectionStart = t3, this.selectionEnd = i3, !t3 || !i3 || t3[0] === i3[0] && t3[1] === i3[1]) return void this.clear(); + const r = e3.buffers.active.ydisp, o = t3[1] - r, n = i3[1] - r, a = Math.max(o, 0), h = Math.min(n, e3.rows - 1); + a >= e3.rows || h < 0 ? this.clear() : (this.hasSelection = true, this.columnSelectMode = s2, this.viewportStartRow = o, this.viewportEndRow = n, this.viewportCappedStartRow = a, this.viewportCappedEndRow = h, this.startCol = t3[0], this.endCol = i3[0]); + } + isCellSelected(e3, t3, i3) { + return !!this.hasSelection && (i3 -= e3.buffer.active.viewportY, this.columnSelectMode ? this.startCol <= this.endCol ? t3 >= this.startCol && i3 >= this.viewportCappedStartRow && t3 < this.endCol && i3 <= this.viewportCappedEndRow : t3 < this.startCol && i3 >= this.viewportCappedStartRow && t3 >= this.endCol && i3 <= this.viewportCappedEndRow : i3 > this.viewportStartRow && i3 < this.viewportEndRow || this.viewportStartRow === this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportEndRow && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol); + } + } + t2.createSelectionRenderModel = function() { + return new i2(); + }; + }, 509: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TextureAtlas = void 0; + const s2 = i2(237), r = i2(860), o = i2(374), n = i2(160), a = i2(345), h = i2(485), l = i2(385), c = i2(147), d = i2(855), _ = { texturePage: 0, texturePosition: { x: 0, y: 0 }, texturePositionClipSpace: { x: 0, y: 0 }, offset: { x: 0, y: 0 }, size: { x: 0, y: 0 }, sizeClipSpace: { x: 0, y: 0 } }; + let u; + class g { + get pages() { + return this._pages; + } + constructor(e3, t3, i3) { + this._document = e3, this._config = t3, this._unicodeService = i3, this._didWarmUp = false, this._cacheMap = new h.FourKeyMap(), this._cacheMapCombined = new h.FourKeyMap(), this._pages = [], this._activePages = [], this._workBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 }, this._workAttributeData = new c.AttributeData(), this._textureSize = 512, this._onAddTextureAtlasCanvas = new a.EventEmitter(), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = new a.EventEmitter(), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._requestClearModel = false, this._createNewPage(), this._tmpCanvas = C(e3, 4 * this._config.deviceCellWidth + 4, this._config.deviceCellHeight + 4), this._tmpCtx = (0, o.throwIfFalsy)(this._tmpCanvas.getContext("2d", { alpha: this._config.allowTransparency, willReadFrequently: true })); + } + dispose() { + for (const e3 of this.pages) e3.canvas.remove(); + this._onAddTextureAtlasCanvas.dispose(); + } + warmUp() { + this._didWarmUp || (this._doWarmUp(), this._didWarmUp = true); + } + _doWarmUp() { + const e3 = new l.IdleTaskQueue(); + for (let t3 = 33; t3 < 126; t3++) e3.enqueue(() => { + if (!this._cacheMap.get(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT)) { + const e4 = this._drawToCache(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT); + this._cacheMap.set(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT, e4); + } + }); + } + beginFrame() { + return this._requestClearModel; + } + clearTexture() { + if (0 !== this._pages[0].currentRow.x || 0 !== this._pages[0].currentRow.y) { + for (const e3 of this._pages) e3.clear(); + this._cacheMap.clear(), this._cacheMapCombined.clear(), this._didWarmUp = false; + } + } + _createNewPage() { + if (g.maxAtlasPages && this._pages.length >= Math.max(4, g.maxAtlasPages)) { + const e4 = this._pages.filter((e5) => 2 * e5.canvas.width <= (g.maxTextureSize || 4096)).sort((e5, t4) => t4.canvas.width !== e5.canvas.width ? t4.canvas.width - e5.canvas.width : t4.percentageUsed - e5.percentageUsed); + let t3 = -1, i3 = 0; + for (let s4 = 0; s4 < e4.length; s4++) if (e4[s4].canvas.width !== i3) t3 = s4, i3 = e4[s4].canvas.width; + else if (s4 - t3 == 3) break; + const s3 = e4.slice(t3, t3 + 4), r2 = s3.map((e5) => e5.glyphs[0].texturePage).sort((e5, t4) => e5 > t4 ? 1 : -1), o2 = this.pages.length - s3.length, n2 = this._mergePages(s3, o2); + n2.version++; + for (let e5 = r2.length - 1; e5 >= 0; e5--) this._deletePage(r2[e5]); + this.pages.push(n2), this._requestClearModel = true, this._onAddTextureAtlasCanvas.fire(n2.canvas); + } + const e3 = new f(this._document, this._textureSize); + return this._pages.push(e3), this._activePages.push(e3), this._onAddTextureAtlasCanvas.fire(e3.canvas), e3; + } + _mergePages(e3, t3) { + const i3 = 2 * e3[0].canvas.width, s3 = new f(this._document, i3, e3); + for (const [r2, o2] of e3.entries()) { + const e4 = r2 * o2.canvas.width % i3, n2 = Math.floor(r2 / 2) * o2.canvas.height; + s3.ctx.drawImage(o2.canvas, e4, n2); + for (const s4 of o2.glyphs) s4.texturePage = t3, s4.sizeClipSpace.x = s4.size.x / i3, s4.sizeClipSpace.y = s4.size.y / i3, s4.texturePosition.x += e4, s4.texturePosition.y += n2, s4.texturePositionClipSpace.x = s4.texturePosition.x / i3, s4.texturePositionClipSpace.y = s4.texturePosition.y / i3; + this._onRemoveTextureAtlasCanvas.fire(o2.canvas); + const a2 = this._activePages.indexOf(o2); + -1 !== a2 && this._activePages.splice(a2, 1); + } + return s3; + } + _deletePage(e3) { + this._pages.splice(e3, 1); + for (let t3 = e3; t3 < this._pages.length; t3++) { + const e4 = this._pages[t3]; + for (const t4 of e4.glyphs) t4.texturePage--; + e4.version++; + } + } + getRasterizedGlyphCombinedChar(e3, t3, i3, s3, r2) { + return this._getFromCacheMap(this._cacheMapCombined, e3, t3, i3, s3, r2); + } + getRasterizedGlyph(e3, t3, i3, s3, r2) { + return this._getFromCacheMap(this._cacheMap, e3, t3, i3, s3, r2); + } + _getFromCacheMap(e3, t3, i3, s3, r2, o2 = false) { + return u = e3.get(t3, i3, s3, r2), u || (u = this._drawToCache(t3, i3, s3, r2, o2), e3.set(t3, i3, s3, r2, u)), u; + } + _getColorFromAnsiIndex(e3) { + if (e3 >= this._config.colors.ansi.length) throw new Error("No color found for idx " + e3); + return this._config.colors.ansi[e3]; + } + _getBackgroundColor(e3, t3, i3, s3) { + if (this._config.allowTransparency) return n.NULL_COLOR; + let r2; + switch (e3) { + case 16777216: + case 33554432: + r2 = this._getColorFromAnsiIndex(t3); + break; + case 50331648: + const e4 = c.AttributeData.toColorRGB(t3); + r2 = n.channels.toColor(e4[0], e4[1], e4[2]); + break; + default: + r2 = i3 ? n.color.opaque(this._config.colors.foreground) : this._config.colors.background; + } + return r2; + } + _getForegroundColor(e3, t3, i3, r2, o2, a2, h2, l2, d2, _2) { + const u2 = this._getMinimumContrastColor(e3, t3, i3, r2, o2, a2, h2, d2, l2, _2); + if (u2) return u2; + let g2; + switch (o2) { + case 16777216: + case 33554432: + this._config.drawBoldTextInBrightColors && d2 && a2 < 8 && (a2 += 8), g2 = this._getColorFromAnsiIndex(a2); + break; + case 50331648: + const e4 = c.AttributeData.toColorRGB(a2); + g2 = n.channels.toColor(e4[0], e4[1], e4[2]); + break; + default: + g2 = h2 ? this._config.colors.background : this._config.colors.foreground; + } + return this._config.allowTransparency && (g2 = n.color.opaque(g2)), l2 && (g2 = n.color.multiplyOpacity(g2, s2.DIM_OPACITY)), g2; + } + _resolveBackgroundRgba(e3, t3, i3) { + switch (e3) { + case 16777216: + case 33554432: + return this._getColorFromAnsiIndex(t3).rgba; + case 50331648: + return t3 << 8; + default: + return i3 ? this._config.colors.foreground.rgba : this._config.colors.background.rgba; + } + } + _resolveForegroundRgba(e3, t3, i3, s3) { + switch (e3) { + case 16777216: + case 33554432: + return this._config.drawBoldTextInBrightColors && s3 && t3 < 8 && (t3 += 8), this._getColorFromAnsiIndex(t3).rgba; + case 50331648: + return t3 << 8; + default: + return i3 ? this._config.colors.background.rgba : this._config.colors.foreground.rgba; + } + } + _getMinimumContrastColor(e3, t3, i3, s3, r2, o2, a2, h2, l2, c2) { + if (1 === this._config.minimumContrastRatio || c2) return; + const d2 = this._getContrastCache(l2), _2 = d2.getColor(e3, s3); + if (void 0 !== _2) return _2 || void 0; + const u2 = this._resolveBackgroundRgba(t3, i3, a2), g2 = this._resolveForegroundRgba(r2, o2, a2, h2), f2 = n.rgba.ensureContrastRatio(u2, g2, this._config.minimumContrastRatio / (l2 ? 2 : 1)); + if (!f2) return void d2.setColor(e3, s3, null); + const v2 = n.channels.toColor(f2 >> 24 & 255, f2 >> 16 & 255, f2 >> 8 & 255); + return d2.setColor(e3, s3, v2), v2; + } + _getContrastCache(e3) { + return e3 ? this._config.colors.halfContrastCache : this._config.colors.contrastCache; + } + _drawToCache(e3, t3, i3, n2, a2 = false) { + const h2 = "number" == typeof e3 ? String.fromCharCode(e3) : e3, l2 = Math.min(this._config.deviceCellWidth * Math.max(h2.length, 2) + 4, this._textureSize); + this._tmpCanvas.width < l2 && (this._tmpCanvas.width = l2); + const d2 = Math.min(this._config.deviceCellHeight + 8, this._textureSize); + if (this._tmpCanvas.height < d2 && (this._tmpCanvas.height = d2), this._tmpCtx.save(), this._workAttributeData.fg = i3, this._workAttributeData.bg = t3, this._workAttributeData.extended.ext = n2, this._workAttributeData.isInvisible()) return _; + const u2 = !!this._workAttributeData.isBold(), f2 = !!this._workAttributeData.isInverse(), C2 = !!this._workAttributeData.isDim(), p = !!this._workAttributeData.isItalic(), m = !!this._workAttributeData.isUnderline(), x = !!this._workAttributeData.isStrikethrough(), L = !!this._workAttributeData.isOverline(); + let w = this._workAttributeData.getFgColor(), b = this._workAttributeData.getFgColorMode(), M = this._workAttributeData.getBgColor(), S = this._workAttributeData.getBgColorMode(); + if (f2) { + const e4 = w; + w = M, M = e4; + const t4 = b; + b = S, S = t4; + } + const y = this._getBackgroundColor(S, M, f2, C2); + this._tmpCtx.globalCompositeOperation = "copy", this._tmpCtx.fillStyle = y.css, this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height), this._tmpCtx.globalCompositeOperation = "source-over"; + const R = u2 ? this._config.fontWeightBold : this._config.fontWeight, A = p ? "italic" : ""; + this._tmpCtx.font = `${A} ${R} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`, this._tmpCtx.textBaseline = s2.TEXT_BASELINE; + const D = 1 === h2.length && (0, o.isPowerlineGlyph)(h2.charCodeAt(0)), T = 1 === h2.length && (0, o.isRestrictedPowerlineGlyph)(h2.charCodeAt(0)), k = this._getForegroundColor(t3, S, M, i3, b, w, f2, C2, u2, (0, o.treatGlyphAsBackgroundColor)(h2.charCodeAt(0))); + this._tmpCtx.fillStyle = k.css; + const E = T ? 0 : 4; + let B = false; + false !== this._config.customGlyphs && (B = (0, r.tryDrawCustomChar)(this._tmpCtx, h2, E, E, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio)); + let $, P = !D; + if ($ = "number" == typeof e3 ? this._unicodeService.wcwidth(e3) : this._unicodeService.getStringCellWidth(e3), m) { + this._tmpCtx.save(); + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15)), t4 = e4 % 2 == 1 ? 0.5 : 0; + if (this._tmpCtx.lineWidth = e4, this._workAttributeData.isUnderlineColorDefault()) this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle; + else if (this._workAttributeData.isUnderlineColorRGB()) P = false, this._tmpCtx.strokeStyle = `rgb(${c.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`; + else { + P = false; + let e5 = this._workAttributeData.getUnderlineColor(); + this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && e5 < 8 && (e5 += 8), this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(e5).css; + } + this._tmpCtx.beginPath(); + const i4 = E, s3 = Math.ceil(E + this._config.deviceCharHeight) - t4 - (a2 ? 2 * e4 : 0), r2 = s3 + e4, n3 = s3 + 2 * e4; + let l3 = this._workAttributeData.getUnderlineVariantOffset(); + for (let a3 = 0; a3 < $; a3++) { + this._tmpCtx.save(); + const h3 = i4 + a3 * this._config.deviceCellWidth, c2 = i4 + (a3 + 1) * this._config.deviceCellWidth, d3 = h3 + this._config.deviceCellWidth / 2; + switch (this._workAttributeData.extended.underlineStyle) { + case 2: + this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3), this._tmpCtx.moveTo(h3, n3), this._tmpCtx.lineTo(c2, n3); + break; + case 3: + const i5 = e4 <= 1 ? n3 : Math.ceil(E + this._config.deviceCharHeight - e4 / 2) - t4, a4 = e4 <= 1 ? s3 : Math.ceil(E + this._config.deviceCharHeight + e4 / 2) - t4, _2 = new Path2D(); + _2.rect(h3, s3, this._config.deviceCellWidth, n3 - s3), this._tmpCtx.clip(_2), this._tmpCtx.moveTo(h3 - this._config.deviceCellWidth / 2, r2), this._tmpCtx.bezierCurveTo(h3 - this._config.deviceCellWidth / 2, a4, h3, a4, h3, r2), this._tmpCtx.bezierCurveTo(h3, i5, d3, i5, d3, r2), this._tmpCtx.bezierCurveTo(d3, a4, c2, a4, c2, r2), this._tmpCtx.bezierCurveTo(c2, i5, c2 + this._config.deviceCellWidth / 2, i5, c2 + this._config.deviceCellWidth / 2, r2); + break; + case 4: + const u3 = 0 === l3 ? 0 : l3 >= e4 ? 2 * e4 - l3 : e4 - l3; + false == !(l3 >= e4) || 0 === u3 ? (this._tmpCtx.setLineDash([Math.round(e4), Math.round(e4)]), this._tmpCtx.moveTo(h3 + u3, s3), this._tmpCtx.lineTo(c2, s3)) : (this._tmpCtx.setLineDash([Math.round(e4), Math.round(e4)]), this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(h3 + u3, s3), this._tmpCtx.moveTo(h3 + u3 + e4, s3), this._tmpCtx.lineTo(c2, s3)), l3 = (0, o.computeNextVariantOffset)(c2 - h3, e4, l3); + break; + case 5: + const g2 = 0.6, f3 = 0.3, v2 = c2 - h3, C3 = Math.floor(g2 * v2), p2 = Math.floor(f3 * v2), m2 = v2 - C3 - p2; + this._tmpCtx.setLineDash([C3, p2, m2]), this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3); + break; + default: + this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3); + } + this._tmpCtx.stroke(), this._tmpCtx.restore(); + } + if (this._tmpCtx.restore(), !B && this._config.fontSize >= 12 && !this._config.allowTransparency && " " !== h2) { + this._tmpCtx.save(), this._tmpCtx.textBaseline = "alphabetic"; + const t5 = this._tmpCtx.measureText(h2); + if (this._tmpCtx.restore(), "actualBoundingBoxDescent" in t5 && t5.actualBoundingBoxDescent > 0) { + this._tmpCtx.save(); + const t6 = new Path2D(); + t6.rect(i4, s3 - Math.ceil(e4 / 2), this._config.deviceCellWidth * $, n3 - s3 + Math.ceil(e4 / 2)), this._tmpCtx.clip(t6), this._tmpCtx.lineWidth = 3 * this._config.devicePixelRatio, this._tmpCtx.strokeStyle = y.css, this._tmpCtx.strokeText(h2, E, E + this._config.deviceCharHeight), this._tmpCtx.restore(); + } + } + } + if (L) { + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15)), t4 = e4 % 2 == 1 ? 0.5 : 0; + this._tmpCtx.lineWidth = e4, this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle, this._tmpCtx.beginPath(), this._tmpCtx.moveTo(E, E + t4), this._tmpCtx.lineTo(E + this._config.deviceCharWidth * $, E + t4), this._tmpCtx.stroke(); + } + if (B || this._tmpCtx.fillText(h2, E, E + this._config.deviceCharHeight), "_" === h2 && !this._config.allowTransparency) { + let e4 = v(this._tmpCtx.getImageData(E, E, this._config.deviceCellWidth, this._config.deviceCellHeight), y, k, P); + if (e4) for (let t4 = 1; t4 <= 5 && (this._tmpCtx.save(), this._tmpCtx.fillStyle = y.css, this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height), this._tmpCtx.restore(), this._tmpCtx.fillText(h2, E, E + this._config.deviceCharHeight - t4), e4 = v(this._tmpCtx.getImageData(E, E, this._config.deviceCellWidth, this._config.deviceCellHeight), y, k, P), e4); t4++) ; + } + if (x) { + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10)), t4 = this._tmpCtx.lineWidth % 2 == 1 ? 0.5 : 0; + this._tmpCtx.lineWidth = e4, this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle, this._tmpCtx.beginPath(), this._tmpCtx.moveTo(E, E + Math.floor(this._config.deviceCharHeight / 2) - t4), this._tmpCtx.lineTo(E + this._config.deviceCharWidth * $, E + Math.floor(this._config.deviceCharHeight / 2) - t4), this._tmpCtx.stroke(); + } + this._tmpCtx.restore(); + const O = this._tmpCtx.getImageData(0, 0, this._tmpCanvas.width, this._tmpCanvas.height); + let I; + if (I = this._config.allowTransparency ? function(e4) { + for (let t4 = 0; t4 < e4.data.length; t4 += 4) if (e4.data[t4 + 3] > 0) return false; + return true; + }(O) : v(O, y, k, P), I) return _; + const F = this._findGlyphBoundingBox(O, this._workBoundingBox, l2, T, B, E); + let W, H; + for (; ; ) { + if (0 === this._activePages.length) { + const e4 = this._createNewPage(); + W = e4, H = e4.currentRow, H.height = F.size.y; + break; + } + W = this._activePages[this._activePages.length - 1], H = W.currentRow; + for (const e4 of this._activePages) F.size.y <= e4.currentRow.height && (W = e4, H = e4.currentRow); + for (let e4 = this._activePages.length - 1; e4 >= 0; e4--) for (const t4 of this._activePages[e4].fixedRows) t4.height <= H.height && F.size.y <= t4.height && (W = this._activePages[e4], H = t4); + if (H.y + F.size.y >= W.canvas.height || H.height > F.size.y + 2) { + let e4 = false; + if (W.currentRow.y + W.currentRow.height + F.size.y >= W.canvas.height) { + let t4; + for (const e5 of this._activePages) if (e5.currentRow.y + e5.currentRow.height + F.size.y < e5.canvas.height) { + t4 = e5; + break; + } + if (t4) W = t4; + else if (g.maxAtlasPages && this._pages.length >= g.maxAtlasPages && H.y + F.size.y <= W.canvas.height && H.height >= F.size.y && H.x + F.size.x <= W.canvas.width) e4 = true; + else { + const t5 = this._createNewPage(); + W = t5, H = t5.currentRow, H.height = F.size.y, e4 = true; + } + } + e4 || (W.currentRow.height > 0 && W.fixedRows.push(W.currentRow), H = { x: 0, y: W.currentRow.y + W.currentRow.height, height: F.size.y }, W.fixedRows.push(H), W.currentRow = { x: 0, y: H.y + H.height, height: 0 }); + } + if (H.x + F.size.x <= W.canvas.width) break; + H === W.currentRow ? (H.x = 0, H.y += H.height, H.height = 0) : W.fixedRows.splice(W.fixedRows.indexOf(H), 1); + } + return F.texturePage = this._pages.indexOf(W), F.texturePosition.x = H.x, F.texturePosition.y = H.y, F.texturePositionClipSpace.x = H.x / W.canvas.width, F.texturePositionClipSpace.y = H.y / W.canvas.height, F.sizeClipSpace.x /= W.canvas.width, F.sizeClipSpace.y /= W.canvas.height, H.height = Math.max(H.height, F.size.y), H.x += F.size.x, W.ctx.putImageData(O, F.texturePosition.x - this._workBoundingBox.left, F.texturePosition.y - this._workBoundingBox.top, this._workBoundingBox.left, this._workBoundingBox.top, F.size.x, F.size.y), W.addGlyph(F), W.version++, F; + } + _findGlyphBoundingBox(e3, t3, i3, s3, r2, o2) { + t3.top = 0; + const n2 = s3 ? this._config.deviceCellHeight : this._tmpCanvas.height, a2 = s3 ? this._config.deviceCellWidth : i3; + let h2 = false; + for (let i4 = 0; i4 < n2; i4++) { + for (let s4 = 0; s4 < a2; s4++) { + const r3 = i4 * this._tmpCanvas.width * 4 + 4 * s4 + 3; + if (0 !== e3.data[r3]) { + t3.top = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.left = 0, h2 = false; + for (let i4 = 0; i4 < o2 + a2; i4++) { + for (let s4 = 0; s4 < n2; s4++) { + const r3 = s4 * this._tmpCanvas.width * 4 + 4 * i4 + 3; + if (0 !== e3.data[r3]) { + t3.left = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.right = a2, h2 = false; + for (let i4 = o2 + a2 - 1; i4 >= o2; i4--) { + for (let s4 = 0; s4 < n2; s4++) { + const r3 = s4 * this._tmpCanvas.width * 4 + 4 * i4 + 3; + if (0 !== e3.data[r3]) { + t3.right = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.bottom = n2, h2 = false; + for (let i4 = n2 - 1; i4 >= 0; i4--) { + for (let s4 = 0; s4 < a2; s4++) { + const r3 = i4 * this._tmpCanvas.width * 4 + 4 * s4 + 3; + if (0 !== e3.data[r3]) { + t3.bottom = i4, h2 = true; + break; + } + } + if (h2) break; + } + return { texturePage: 0, texturePosition: { x: 0, y: 0 }, texturePositionClipSpace: { x: 0, y: 0 }, size: { x: t3.right - t3.left + 1, y: t3.bottom - t3.top + 1 }, sizeClipSpace: { x: t3.right - t3.left + 1, y: t3.bottom - t3.top + 1 }, offset: { x: -t3.left + o2 + (s3 || r2 ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0), y: -t3.top + o2 + (s3 || r2 ? 1 === this._config.lineHeight ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0) } }; + } + } + t2.TextureAtlas = g; + class f { + get percentageUsed() { + return this._usedPixels / (this.canvas.width * this.canvas.height); + } + get glyphs() { + return this._glyphs; + } + addGlyph(e3) { + this._glyphs.push(e3), this._usedPixels += e3.size.x * e3.size.y; + } + constructor(e3, t3, i3) { + if (this._usedPixels = 0, this._glyphs = [], this.version = 0, this.currentRow = { x: 0, y: 0, height: 0 }, this.fixedRows = [], i3) for (const e4 of i3) this._glyphs.push(...e4.glyphs), this._usedPixels += e4._usedPixels; + this.canvas = C(e3, t3, t3), this.ctx = (0, o.throwIfFalsy)(this.canvas.getContext("2d", { alpha: true })); + } + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height), this.currentRow.x = 0, this.currentRow.y = 0, this.currentRow.height = 0, this.fixedRows.length = 0, this.version++; + } + } + function v(e3, t3, i3, s3) { + const r2 = t3.rgba >>> 24, o2 = t3.rgba >>> 16 & 255, n2 = t3.rgba >>> 8 & 255, a2 = i3.rgba >>> 24, h2 = i3.rgba >>> 16 & 255, l2 = i3.rgba >>> 8 & 255, c2 = Math.floor((Math.abs(r2 - a2) + Math.abs(o2 - h2) + Math.abs(n2 - l2)) / 12); + let d2 = true; + for (let t4 = 0; t4 < e3.data.length; t4 += 4) e3.data[t4] === r2 && e3.data[t4 + 1] === o2 && e3.data[t4 + 2] === n2 || s3 && Math.abs(e3.data[t4] - r2) + Math.abs(e3.data[t4 + 1] - o2) + Math.abs(e3.data[t4 + 2] - n2) < c2 ? e3.data[t4 + 3] = 0 : d2 = false; + return d2; + } + function C(e3, t3, i3) { + const s3 = e3.createElement("canvas"); + return s3.width = t3, s3.height = i3, s3; + } + }, 577: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, o2 = arguments.length, n2 = o2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) n2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (n2 = (o2 < 3 ? r2(n2) : o2 > 3 ? r2(t3, i3, n2) : r2(t3, i3)) || n2); + return o2 > 3 && n2 && Object.defineProperty(t3, i3, n2), n2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharacterJoinerService = t2.JoinedCellData = void 0; + const o = i2(147), n = i2(855), a = i2(782), h = i2(97); + class l extends o.AttributeData { + constructor(e3, t3, i3) { + super(), this.content = 0, this.combinedData = "", this.fg = e3.fg, this.bg = e3.bg, this.combinedData = t3, this._width = i3; + } + isCombined() { + return 2097152; + } + getWidth() { + return this._width; + } + getChars() { + return this.combinedData; + } + getCode() { + return 2097151; + } + setFromCharData(e3) { + throw new Error("not implemented"); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.JoinedCellData = l; + let c = t2.CharacterJoinerService = class e3 { + constructor(e4) { + this._bufferService = e4, this._characterJoiners = [], this._nextCharacterJoinerId = 0, this._workCell = new a.CellData(); + } + register(e4) { + const t3 = { id: this._nextCharacterJoinerId++, handler: e4 }; + return this._characterJoiners.push(t3), t3.id; + } + deregister(e4) { + for (let t3 = 0; t3 < this._characterJoiners.length; t3++) if (this._characterJoiners[t3].id === e4) return this._characterJoiners.splice(t3, 1), true; + return false; + } + getJoinedCharacters(e4) { + if (0 === this._characterJoiners.length) return []; + const t3 = this._bufferService.buffer.lines.get(e4); + if (!t3 || 0 === t3.length) return []; + const i3 = [], s3 = t3.translateToString(true); + let r2 = 0, o2 = 0, a2 = 0, h2 = t3.getFg(0), l2 = t3.getBg(0); + for (let e5 = 0; e5 < t3.getTrimmedLength(); e5++) if (t3.loadCell(e5, this._workCell), 0 !== this._workCell.getWidth()) { + if (this._workCell.fg !== h2 || this._workCell.bg !== l2) { + if (e5 - r2 > 1) { + const e6 = this._getJoinedRanges(s3, a2, o2, t3, r2); + for (let t4 = 0; t4 < e6.length; t4++) i3.push(e6[t4]); + } + r2 = e5, a2 = o2, h2 = this._workCell.fg, l2 = this._workCell.bg; + } + o2 += this._workCell.getChars().length || n.WHITESPACE_CELL_CHAR.length; + } + if (this._bufferService.cols - r2 > 1) { + const e5 = this._getJoinedRanges(s3, a2, o2, t3, r2); + for (let t4 = 0; t4 < e5.length; t4++) i3.push(e5[t4]); + } + return i3; + } + _getJoinedRanges(t3, i3, s3, r2, o2) { + const n2 = t3.substring(i3, s3); + let a2 = []; + try { + a2 = this._characterJoiners[0].handler(n2); + } catch (e4) { + console.error(e4); + } + for (let t4 = 1; t4 < this._characterJoiners.length; t4++) try { + const i4 = this._characterJoiners[t4].handler(n2); + for (let t5 = 0; t5 < i4.length; t5++) e3._mergeRanges(a2, i4[t5]); + } catch (e4) { + console.error(e4); + } + return this._stringRangesToCellRanges(a2, r2, o2), a2; + } + _stringRangesToCellRanges(e4, t3, i3) { + let s3 = 0, r2 = false, o2 = 0, a2 = e4[s3]; + if (a2) { + for (let h2 = i3; h2 < this._bufferService.cols; h2++) { + const i4 = t3.getWidth(h2), l2 = t3.getString(h2).length || n.WHITESPACE_CELL_CHAR.length; + if (0 !== i4) { + if (!r2 && a2[0] <= o2 && (a2[0] = h2, r2 = true), a2[1] <= o2) { + if (a2[1] = h2, a2 = e4[++s3], !a2) break; + a2[0] <= o2 ? (a2[0] = h2, r2 = true) : r2 = false; + } + o2 += l2; + } + } + a2 && (a2[1] = this._bufferService.cols); + } + } + static _mergeRanges(e4, t3) { + let i3 = false; + for (let s3 = 0; s3 < e4.length; s3++) { + const r2 = e4[s3]; + if (i3) { + if (t3[1] <= r2[0]) return e4[s3 - 1][1] = t3[1], e4; + if (t3[1] <= r2[1]) return e4[s3 - 1][1] = Math.max(t3[1], r2[1]), e4.splice(s3, 1), e4; + e4.splice(s3, 1), s3--; + } else { + if (t3[1] <= r2[0]) return e4.splice(s3, 0, t3), e4; + if (t3[1] <= r2[1]) return r2[0] = Math.min(t3[0], r2[0]), e4; + t3[0] < r2[1] && (r2[0] = Math.min(t3[0], r2[0]), i3 = true); + } + } + return i3 ? e4[e4.length - 1][1] = t3[1] : e4.push(t3), e4; + } + }; + t2.CharacterJoinerService = c = s2([r(0, h.IBufferService)], c); + }, 160: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.contrastRatio = t2.toPaddedHex = t2.rgba = t2.rgb = t2.css = t2.color = t2.channels = t2.NULL_COLOR = void 0; + const s2 = i2(399); + let r = 0, o = 0, n = 0, a = 0; + var h, l, c, d, _; + function u(e3) { + const t3 = e3.toString(16); + return t3.length < 2 ? "0" + t3 : t3; + } + function g(e3, t3) { + return e3 < t3 ? (t3 + 0.05) / (e3 + 0.05) : (e3 + 0.05) / (t3 + 0.05); + } + t2.NULL_COLOR = { css: "#00000000", rgba: 0 }, function(e3) { + e3.toCss = function(e4, t3, i3, s3) { + return void 0 !== s3 ? `#${u(e4)}${u(t3)}${u(i3)}${u(s3)}` : `#${u(e4)}${u(t3)}${u(i3)}`; + }, e3.toRgba = function(e4, t3, i3, s3 = 255) { + return (e4 << 24 | t3 << 16 | i3 << 8 | s3) >>> 0; + }, e3.toColor = function(t3, i3, s3, r2) { + return { css: e3.toCss(t3, i3, s3, r2), rgba: e3.toRgba(t3, i3, s3, r2) }; + }; + }(h || (t2.channels = h = {})), function(e3) { + function t3(e4, t4) { + return a = Math.round(255 * t4), [r, o, n] = _.toChannels(e4.rgba), { css: h.toCss(r, o, n, a), rgba: h.toRgba(r, o, n, a) }; + } + e3.blend = function(e4, t4) { + if (a = (255 & t4.rgba) / 255, 1 === a) return { css: t4.css, rgba: t4.rgba }; + const i3 = t4.rgba >> 24 & 255, s3 = t4.rgba >> 16 & 255, l2 = t4.rgba >> 8 & 255, c2 = e4.rgba >> 24 & 255, d2 = e4.rgba >> 16 & 255, _2 = e4.rgba >> 8 & 255; + return r = c2 + Math.round((i3 - c2) * a), o = d2 + Math.round((s3 - d2) * a), n = _2 + Math.round((l2 - _2) * a), { css: h.toCss(r, o, n), rgba: h.toRgba(r, o, n) }; + }, e3.isOpaque = function(e4) { + return 255 == (255 & e4.rgba); + }, e3.ensureContrastRatio = function(e4, t4, i3) { + const s3 = _.ensureContrastRatio(e4.rgba, t4.rgba, i3); + if (s3) return h.toColor(s3 >> 24 & 255, s3 >> 16 & 255, s3 >> 8 & 255); + }, e3.opaque = function(e4) { + const t4 = (255 | e4.rgba) >>> 0; + return [r, o, n] = _.toChannels(t4), { css: h.toCss(r, o, n), rgba: t4 }; + }, e3.opacity = t3, e3.multiplyOpacity = function(e4, i3) { + return a = 255 & e4.rgba, t3(e4, a * i3 / 255); + }, e3.toColorRGB = function(e4) { + return [e4.rgba >> 24 & 255, e4.rgba >> 16 & 255, e4.rgba >> 8 & 255]; + }; + }(l || (t2.color = l = {})), function(e3) { + let t3, i3; + if (!s2.isNode) { + const e4 = document.createElement("canvas"); + e4.width = 1, e4.height = 1; + const s3 = e4.getContext("2d", { willReadFrequently: true }); + s3 && (t3 = s3, t3.globalCompositeOperation = "copy", i3 = t3.createLinearGradient(0, 0, 1, 1)); + } + e3.toColor = function(e4) { + if (e4.match(/#[\da-f]{3,8}/i)) switch (e4.length) { + case 4: + return r = parseInt(e4.slice(1, 2).repeat(2), 16), o = parseInt(e4.slice(2, 3).repeat(2), 16), n = parseInt(e4.slice(3, 4).repeat(2), 16), h.toColor(r, o, n); + case 5: + return r = parseInt(e4.slice(1, 2).repeat(2), 16), o = parseInt(e4.slice(2, 3).repeat(2), 16), n = parseInt(e4.slice(3, 4).repeat(2), 16), a = parseInt(e4.slice(4, 5).repeat(2), 16), h.toColor(r, o, n, a); + case 7: + return { css: e4, rgba: (parseInt(e4.slice(1), 16) << 8 | 255) >>> 0 }; + case 9: + return { css: e4, rgba: parseInt(e4.slice(1), 16) >>> 0 }; + } + const s3 = e4.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/); + if (s3) return r = parseInt(s3[1]), o = parseInt(s3[2]), n = parseInt(s3[3]), a = Math.round(255 * (void 0 === s3[5] ? 1 : parseFloat(s3[5]))), h.toColor(r, o, n, a); + if (!t3 || !i3) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillStyle = i3, t3.fillStyle = e4, "string" != typeof t3.fillStyle) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillRect(0, 0, 1, 1), [r, o, n, a] = t3.getImageData(0, 0, 1, 1).data, 255 !== a) throw new Error("css.toColor: Unsupported css format"); + return { rgba: h.toRgba(r, o, n, a), css: e4 }; + }; + }(c || (t2.css = c = {})), function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 / 255, r2 = t4 / 255, o2 = i3 / 255; + return 0.2126 * (s3 <= 0.03928 ? s3 / 12.92 : Math.pow((s3 + 0.055) / 1.055, 2.4)) + 0.7152 * (r2 <= 0.03928 ? r2 / 12.92 : Math.pow((r2 + 0.055) / 1.055, 2.4)) + 0.0722 * (o2 <= 0.03928 ? o2 / 12.92 : Math.pow((o2 + 0.055) / 1.055, 2.4)); + } + e3.relativeLuminance = function(e4) { + return t3(e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4); + }, e3.relativeLuminance2 = t3; + }(d || (t2.rgb = d = {})), function(e3) { + function t3(e4, t4, i4) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, o2 = e4 >> 8 & 255; + let n2 = t4 >> 24 & 255, a2 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, l2 = g(d.relativeLuminance2(n2, a2, h2), d.relativeLuminance2(s3, r2, o2)); + for (; l2 < i4 && (n2 > 0 || a2 > 0 || h2 > 0); ) n2 -= Math.max(0, Math.ceil(0.1 * n2)), a2 -= Math.max(0, Math.ceil(0.1 * a2)), h2 -= Math.max(0, Math.ceil(0.1 * h2)), l2 = g(d.relativeLuminance2(n2, a2, h2), d.relativeLuminance2(s3, r2, o2)); + return (n2 << 24 | a2 << 16 | h2 << 8 | 255) >>> 0; + } + function i3(e4, t4, i4) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, o2 = e4 >> 8 & 255; + let n2 = t4 >> 24 & 255, a2 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, l2 = g(d.relativeLuminance2(n2, a2, h2), d.relativeLuminance2(s3, r2, o2)); + for (; l2 < i4 && (n2 < 255 || a2 < 255 || h2 < 255); ) n2 = Math.min(255, n2 + Math.ceil(0.1 * (255 - n2))), a2 = Math.min(255, a2 + Math.ceil(0.1 * (255 - a2))), h2 = Math.min(255, h2 + Math.ceil(0.1 * (255 - h2))), l2 = g(d.relativeLuminance2(n2, a2, h2), d.relativeLuminance2(s3, r2, o2)); + return (n2 << 24 | a2 << 16 | h2 << 8 | 255) >>> 0; + } + e3.blend = function(e4, t4) { + if (a = (255 & t4) / 255, 1 === a) return t4; + const i4 = t4 >> 24 & 255, s3 = t4 >> 16 & 255, l2 = t4 >> 8 & 255, c2 = e4 >> 24 & 255, d2 = e4 >> 16 & 255, _2 = e4 >> 8 & 255; + return r = c2 + Math.round((i4 - c2) * a), o = d2 + Math.round((s3 - d2) * a), n = _2 + Math.round((l2 - _2) * a), h.toRgba(r, o, n); + }, e3.ensureContrastRatio = function(e4, s3, r2) { + const o2 = d.relativeLuminance(e4 >> 8), n2 = d.relativeLuminance(s3 >> 8); + if (g(o2, n2) < r2) { + if (n2 < o2) { + const n3 = t3(e4, s3, r2), a3 = g(o2, d.relativeLuminance(n3 >> 8)); + if (a3 < r2) { + const t4 = i3(e4, s3, r2); + return a3 > g(o2, d.relativeLuminance(t4 >> 8)) ? n3 : t4; + } + return n3; + } + const a2 = i3(e4, s3, r2), h2 = g(o2, d.relativeLuminance(a2 >> 8)); + if (h2 < r2) { + const i4 = t3(e4, s3, r2); + return h2 > g(o2, d.relativeLuminance(i4 >> 8)) ? a2 : i4; + } + return a2; + } + }, e3.reduceLuminance = t3, e3.increaseLuminance = i3, e3.toChannels = function(e4) { + return [e4 >> 24 & 255, e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4]; + }; + }(_ || (t2.rgba = _ = {})), t2.toPaddedHex = u, t2.contrastRatio = g; + }, 345: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let s2 = 0; s2 < i2.length; s2++) i2[s2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3((e4) => t3.fire(e4)); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3((e4) => t3(e4)); + }; + }, 859: (e2, t2) => { + function i2(e3) { + for (const t3 of e3) t3.dispose(); + e3.length = 0; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getDisposeArrayDisposable = t2.disposeArray = t2.toDisposable = t2.MutableDisposable = t2.Disposable = void 0, t2.Disposable = class { + constructor() { + this._disposables = [], this._isDisposed = false; + } + dispose() { + this._isDisposed = true; + for (const e3 of this._disposables) e3.dispose(); + this._disposables.length = 0; + } + register(e3) { + return this._disposables.push(e3), e3; + } + unregister(e3) { + const t3 = this._disposables.indexOf(e3); + -1 !== t3 && this._disposables.splice(t3, 1); + } + }, t2.MutableDisposable = class { + constructor() { + this._isDisposed = false; + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(e3) { + var _a; + this._isDisposed || e3 === this._value || ((_a = this._value) == null ? void 0 : _a.dispose(), this._value = e3); + } + clear() { + this.value = void 0; + } + dispose() { + var _a; + this._isDisposed = true, (_a = this._value) == null ? void 0 : _a.dispose(), this._value = void 0; + } + }, t2.toDisposable = function(e3) { + return { dispose: e3 }; + }, t2.disposeArray = i2, t2.getDisposeArrayDisposable = function(e3) { + return { dispose: () => i2(e3) }; + }; + }, 485: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.FourKeyMap = t2.TwoKeyMap = void 0; + class i2 { + constructor() { + this._data = {}; + } + set(e3, t3, i3) { + this._data[e3] || (this._data[e3] = {}), this._data[e3][t3] = i3; + } + get(e3, t3) { + return this._data[e3] ? this._data[e3][t3] : void 0; + } + clear() { + this._data = {}; + } + } + t2.TwoKeyMap = i2, t2.FourKeyMap = class { + constructor() { + this._data = new i2(); + } + set(e3, t3, s2, r, o) { + this._data.get(e3, t3) || this._data.set(e3, t3, new i2()), this._data.get(e3, t3).set(s2, r, o); + } + get(e3, t3, i3, s2) { + var _a; + return (_a = this._data.get(e3, t3)) == null ? void 0 : _a.get(i3, s2); + } + clear() { + this._data.clear(); + } + }; + }, 399: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.isChromeOS = t2.isLinux = t2.isWindows = t2.isIphone = t2.isIpad = t2.isMac = t2.getSafariVersion = t2.isSafari = t2.isLegacyEdge = t2.isFirefox = t2.isNode = void 0, t2.isNode = "undefined" != typeof process; + const i2 = t2.isNode ? "node" : navigator.userAgent, s2 = t2.isNode ? "node" : navigator.platform; + t2.isFirefox = i2.includes("Firefox"), t2.isLegacyEdge = i2.includes("Edge"), t2.isSafari = /^((?!chrome|android).)*safari/i.test(i2), t2.getSafariVersion = function() { + if (!t2.isSafari) return 0; + const e3 = i2.match(/Version\/(\d+)/); + return null === e3 || e3.length < 2 ? 0 : parseInt(e3[1]); + }, t2.isMac = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"].includes(s2), t2.isIpad = "iPad" === s2, t2.isIphone = "iPhone" === s2, t2.isWindows = ["Windows", "Win16", "Win32", "WinCE"].includes(s2), t2.isLinux = s2.indexOf("Linux") >= 0, t2.isChromeOS = /\bCrOS\b/.test(i2); + }, 385: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DebouncedIdleTask = t2.IdleTaskQueue = t2.PriorityTaskQueue = void 0; + const s2 = i2(399); + class r { + constructor() { + this._tasks = [], this._i = 0; + } + enqueue(e3) { + this._tasks.push(e3), this._start(); + } + flush() { + for (; this._i < this._tasks.length; ) this._tasks[this._i]() || this._i++; + this.clear(); + } + clear() { + this._idleCallback && (this._cancelCallback(this._idleCallback), this._idleCallback = void 0), this._i = 0, this._tasks.length = 0; + } + _start() { + this._idleCallback || (this._idleCallback = this._requestCallback(this._process.bind(this))); + } + _process(e3) { + this._idleCallback = void 0; + let t3 = 0, i3 = 0, s3 = e3.timeRemaining(), r2 = 0; + for (; this._i < this._tasks.length; ) { + if (t3 = Date.now(), this._tasks[this._i]() || this._i++, t3 = Math.max(1, Date.now() - t3), i3 = Math.max(t3, i3), r2 = e3.timeRemaining(), 1.5 * i3 > r2) return s3 - t3 < -20 && console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s3 - t3))}ms`), void this._start(); + s3 = r2; + } + this.clear(); + } + } + class o extends r { + _requestCallback(e3) { + return setTimeout(() => e3(this._createDeadline(16))); + } + _cancelCallback(e3) { + clearTimeout(e3); + } + _createDeadline(e3) { + const t3 = Date.now() + e3; + return { timeRemaining: () => Math.max(0, t3 - Date.now()) }; + } + } + t2.PriorityTaskQueue = o, t2.IdleTaskQueue = !s2.isNode && "requestIdleCallback" in window ? class extends r { + _requestCallback(e3) { + return requestIdleCallback(e3); + } + _cancelCallback(e3) { + cancelIdleCallback(e3); + } + } : o, t2.DebouncedIdleTask = class { + constructor() { + this._queue = new t2.IdleTaskQueue(); + } + set(e3) { + this._queue.clear(), this._queue.enqueue(e3); + } + flush() { + this._queue.flush(); + } + }; + }, 147: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ExtendedAttrs = t2.AttributeData = void 0; + class i2 { + constructor() { + this.fg = 0, this.bg = 0, this.extended = new s2(); + } + static toColorRGB(e3) { + return [e3 >>> 16 & 255, e3 >>> 8 & 255, 255 & e3]; + } + static fromColorRGB(e3) { + return (255 & e3[0]) << 16 | (255 & e3[1]) << 8 | 255 & e3[2]; + } + clone() { + const e3 = new i2(); + return e3.fg = this.fg, e3.bg = this.bg, e3.extended = this.extended.clone(), e3; + } + isInverse() { + return 67108864 & this.fg; + } + isBold() { + return 134217728 & this.fg; + } + isUnderline() { + return this.hasExtendedAttrs() && 0 !== this.extended.underlineStyle ? 1 : 268435456 & this.fg; + } + isBlink() { + return 536870912 & this.fg; + } + isInvisible() { + return 1073741824 & this.fg; + } + isItalic() { + return 67108864 & this.bg; + } + isDim() { + return 134217728 & this.bg; + } + isStrikethrough() { + return 2147483648 & this.fg; + } + isProtected() { + return 536870912 & this.bg; + } + isOverline() { + return 1073741824 & this.bg; + } + getFgColorMode() { + return 50331648 & this.fg; + } + getBgColorMode() { + return 50331648 & this.bg; + } + isFgRGB() { + return 50331648 == (50331648 & this.fg); + } + isBgRGB() { + return 50331648 == (50331648 & this.bg); + } + isFgPalette() { + return 16777216 == (50331648 & this.fg) || 33554432 == (50331648 & this.fg); + } + isBgPalette() { + return 16777216 == (50331648 & this.bg) || 33554432 == (50331648 & this.bg); + } + isFgDefault() { + return 0 == (50331648 & this.fg); + } + isBgDefault() { + return 0 == (50331648 & this.bg); + } + isAttributeDefault() { + return 0 === this.fg && 0 === this.bg; + } + getFgColor() { + switch (50331648 & this.fg) { + case 16777216: + case 33554432: + return 255 & this.fg; + case 50331648: + return 16777215 & this.fg; + default: + return -1; + } + } + getBgColor() { + switch (50331648 & this.bg) { + case 16777216: + case 33554432: + return 255 & this.bg; + case 50331648: + return 16777215 & this.bg; + default: + return -1; + } + } + hasExtendedAttrs() { + return 268435456 & this.bg; + } + updateExtended() { + this.extended.isEmpty() ? this.bg &= -268435457 : this.bg |= 268435456; + } + getUnderlineColor() { + if (268435456 & this.bg && ~this.extended.underlineColor) switch (50331648 & this.extended.underlineColor) { + case 16777216: + case 33554432: + return 255 & this.extended.underlineColor; + case 50331648: + return 16777215 & this.extended.underlineColor; + default: + return this.getFgColor(); + } + return this.getFgColor(); + } + getUnderlineColorMode() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 & this.extended.underlineColor : this.getFgColorMode(); + } + isUnderlineColorRGB() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 == (50331648 & this.extended.underlineColor) : this.isFgRGB(); + } + isUnderlineColorPalette() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 16777216 == (50331648 & this.extended.underlineColor) || 33554432 == (50331648 & this.extended.underlineColor) : this.isFgPalette(); + } + isUnderlineColorDefault() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 0 == (50331648 & this.extended.underlineColor) : this.isFgDefault(); + } + getUnderlineStyle() { + return 268435456 & this.fg ? 268435456 & this.bg ? this.extended.underlineStyle : 1 : 0; + } + getUnderlineVariantOffset() { + return this.extended.underlineVariantOffset; + } + } + t2.AttributeData = i2; + class s2 { + get ext() { + return this._urlId ? -469762049 & this._ext | this.underlineStyle << 26 : this._ext; + } + set ext(e3) { + this._ext = e3; + } + get underlineStyle() { + return this._urlId ? 5 : (469762048 & this._ext) >> 26; + } + set underlineStyle(e3) { + this._ext &= -469762049, this._ext |= e3 << 26 & 469762048; + } + get underlineColor() { + return 67108863 & this._ext; + } + set underlineColor(e3) { + this._ext &= -67108864, this._ext |= 67108863 & e3; + } + get urlId() { + return this._urlId; + } + set urlId(e3) { + this._urlId = e3; + } + get underlineVariantOffset() { + const e3 = (3758096384 & this._ext) >> 29; + return e3 < 0 ? 4294967288 ^ e3 : e3; + } + set underlineVariantOffset(e3) { + this._ext &= 536870911, this._ext |= e3 << 29 & 3758096384; + } + constructor(e3 = 0, t3 = 0) { + this._ext = 0, this._urlId = 0, this._ext = e3, this._urlId = t3; + } + clone() { + return new s2(this._ext, this._urlId); + } + isEmpty() { + return 0 === this.underlineStyle && 0 === this._urlId; + } + } + t2.ExtendedAttrs = s2; + }, 782: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellData = void 0; + const s2 = i2(133), r = i2(855), o = i2(147); + class n extends o.AttributeData { + constructor() { + super(...arguments), this.content = 0, this.fg = 0, this.bg = 0, this.extended = new o.ExtendedAttrs(), this.combinedData = ""; + } + static fromCharData(e3) { + const t3 = new n(); + return t3.setFromCharData(e3), t3; + } + isCombined() { + return 2097152 & this.content; + } + getWidth() { + return this.content >> 22; + } + getChars() { + return 2097152 & this.content ? this.combinedData : 2097151 & this.content ? (0, s2.stringFromCodePoint)(2097151 & this.content) : ""; + } + getCode() { + return this.isCombined() ? this.combinedData.charCodeAt(this.combinedData.length - 1) : 2097151 & this.content; + } + setFromCharData(e3) { + this.fg = e3[r.CHAR_DATA_ATTR_INDEX], this.bg = 0; + let t3 = false; + if (e3[r.CHAR_DATA_CHAR_INDEX].length > 2) t3 = true; + else if (2 === e3[r.CHAR_DATA_CHAR_INDEX].length) { + const i3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0); + if (55296 <= i3 && i3 <= 56319) { + const s3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1); + 56320 <= s3 && s3 <= 57343 ? this.content = 1024 * (i3 - 55296) + s3 - 56320 + 65536 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22 : t3 = true; + } else t3 = true; + } else this.content = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | e3[r.CHAR_DATA_WIDTH_INDEX] << 22; + t3 && (this.combinedData = e3[r.CHAR_DATA_CHAR_INDEX], this.content = 2097152 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.CellData = n; + }, 855: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WHITESPACE_CELL_CODE = t2.WHITESPACE_CELL_WIDTH = t2.WHITESPACE_CELL_CHAR = t2.NULL_CELL_CODE = t2.NULL_CELL_WIDTH = t2.NULL_CELL_CHAR = t2.CHAR_DATA_CODE_INDEX = t2.CHAR_DATA_WIDTH_INDEX = t2.CHAR_DATA_CHAR_INDEX = t2.CHAR_DATA_ATTR_INDEX = t2.DEFAULT_EXT = t2.DEFAULT_ATTR = t2.DEFAULT_COLOR = void 0, t2.DEFAULT_COLOR = 0, t2.DEFAULT_ATTR = 256 | t2.DEFAULT_COLOR << 9, t2.DEFAULT_EXT = 0, t2.CHAR_DATA_ATTR_INDEX = 0, t2.CHAR_DATA_CHAR_INDEX = 1, t2.CHAR_DATA_WIDTH_INDEX = 2, t2.CHAR_DATA_CODE_INDEX = 3, t2.NULL_CELL_CHAR = "", t2.NULL_CELL_WIDTH = 1, t2.NULL_CELL_CODE = 0, t2.WHITESPACE_CELL_CHAR = " ", t2.WHITESPACE_CELL_WIDTH = 1, t2.WHITESPACE_CELL_CODE = 32; + }, 133: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Utf8ToUtf32 = t2.StringToUtf32 = t2.utf32ToString = t2.stringFromCodePoint = void 0, t2.stringFromCodePoint = function(e3) { + return e3 > 65535 ? (e3 -= 65536, String.fromCharCode(55296 + (e3 >> 10)) + String.fromCharCode(e3 % 1024 + 56320)) : String.fromCharCode(e3); + }, t2.utf32ToString = function(e3, t3 = 0, i2 = e3.length) { + let s2 = ""; + for (let r = t3; r < i2; ++r) { + let t4 = e3[r]; + t4 > 65535 ? (t4 -= 65536, s2 += String.fromCharCode(55296 + (t4 >> 10)) + String.fromCharCode(t4 % 1024 + 56320)) : s2 += String.fromCharCode(t4); + } + return s2; + }, t2.StringToUtf32 = class { + constructor() { + this._interim = 0; + } + clear() { + this._interim = 0; + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2 = 0, r = 0; + if (this._interim) { + const i3 = e3.charCodeAt(r++); + 56320 <= i3 && i3 <= 57343 ? t3[s2++] = 1024 * (this._interim - 55296) + i3 - 56320 + 65536 : (t3[s2++] = this._interim, t3[s2++] = i3), this._interim = 0; + } + for (let o = r; o < i2; ++o) { + const r2 = e3.charCodeAt(o); + if (55296 <= r2 && r2 <= 56319) { + if (++o >= i2) return this._interim = r2, s2; + const n = e3.charCodeAt(o); + 56320 <= n && n <= 57343 ? t3[s2++] = 1024 * (r2 - 55296) + n - 56320 + 65536 : (t3[s2++] = r2, t3[s2++] = n); + } else 65279 !== r2 && (t3[s2++] = r2); + } + return s2; + } + }, t2.Utf8ToUtf32 = class { + constructor() { + this.interim = new Uint8Array(3); + } + clear() { + this.interim.fill(0); + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2, r, o, n, a = 0, h = 0, l = 0; + if (this.interim[0]) { + let s3 = false, r2 = this.interim[0]; + r2 &= 192 == (224 & r2) ? 31 : 224 == (240 & r2) ? 15 : 7; + let o2, n2 = 0; + for (; (o2 = 63 & this.interim[++n2]) && n2 < 4; ) r2 <<= 6, r2 |= o2; + const h2 = 192 == (224 & this.interim[0]) ? 2 : 224 == (240 & this.interim[0]) ? 3 : 4, c2 = h2 - n2; + for (; l < c2; ) { + if (l >= i2) return 0; + if (o2 = e3[l++], 128 != (192 & o2)) { + l--, s3 = true; + break; + } + this.interim[n2++] = o2, r2 <<= 6, r2 |= 63 & o2; + } + s3 || (2 === h2 ? r2 < 128 ? l-- : t3[a++] = r2 : 3 === h2 ? r2 < 2048 || r2 >= 55296 && r2 <= 57343 || 65279 === r2 || (t3[a++] = r2) : r2 < 65536 || r2 > 1114111 || (t3[a++] = r2)), this.interim.fill(0); + } + const c = i2 - 4; + let d = l; + for (; d < i2; ) { + for (; !(!(d < c) || 128 & (s2 = e3[d]) || 128 & (r = e3[d + 1]) || 128 & (o = e3[d + 2]) || 128 & (n = e3[d + 3])); ) t3[a++] = s2, t3[a++] = r, t3[a++] = o, t3[a++] = n, d += 4; + if (s2 = e3[d++], s2 < 128) t3[a++] = s2; + else if (192 == (224 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (h = (31 & s2) << 6 | 63 & r, h < 128) { + d--; + continue; + } + t3[a++] = h; + } else if (224 == (240 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (h = (15 & s2) << 12 | (63 & r) << 6 | 63 & o, h < 2048 || h >= 55296 && h <= 57343 || 65279 === h) continue; + t3[a++] = h; + } else if (240 == (248 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, this.interim[2] = o, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (h = (7 & s2) << 18 | (63 & r) << 12 | (63 & o) << 6 | 63 & n, h < 65536 || h > 1114111) continue; + t3[a++] = h; + } + } + return a; + } + }; + }, 776: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, o2 = arguments.length, n2 = o2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) n2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (n2 = (o2 < 3 ? r2(n2) : o2 > 3 ? r2(t3, i3, n2) : r2(t3, i3)) || n2); + return o2 > 3 && n2 && Object.defineProperty(t3, i3, n2), n2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.traceCall = t2.setTraceLogger = t2.LogService = void 0; + const o = i2(859), n = i2(97), a = { trace: n.LogLevelEnum.TRACE, debug: n.LogLevelEnum.DEBUG, info: n.LogLevelEnum.INFO, warn: n.LogLevelEnum.WARN, error: n.LogLevelEnum.ERROR, off: n.LogLevelEnum.OFF }; + let h, l = t2.LogService = class extends o.Disposable { + get logLevel() { + return this._logLevel; + } + constructor(e3) { + super(), this._optionsService = e3, this._logLevel = n.LogLevelEnum.OFF, this._updateLogLevel(), this.register(this._optionsService.onSpecificOptionChange("logLevel", () => this._updateLogLevel())), h = this; + } + _updateLogLevel() { + this._logLevel = a[this._optionsService.rawOptions.logLevel]; + } + _evalLazyOptionalParams(e3) { + for (let t3 = 0; t3 < e3.length; t3++) "function" == typeof e3[t3] && (e3[t3] = e3[t3]()); + } + _log(e3, t3, i3) { + this._evalLazyOptionalParams(i3), e3.call(console, (this._optionsService.options.logger ? "" : "xterm.js: ") + t3, ...i3); + } + trace(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.TRACE && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.trace.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + debug(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.DEBUG && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.debug.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + info(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.INFO && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.info.bind(this._optionsService.options.logger)) ?? console.info, e3, t3); + } + warn(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.WARN && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.warn.bind(this._optionsService.options.logger)) ?? console.warn, e3, t3); + } + error(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.ERROR && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.error.bind(this._optionsService.options.logger)) ?? console.error, e3, t3); + } + }; + t2.LogService = l = s2([r(0, n.IOptionsService)], l), t2.setTraceLogger = function(e3) { + h = e3; + }, t2.traceCall = function(e3, t3, i3) { + if ("function" != typeof i3.value) throw new Error("not supported"); + const s3 = i3.value; + i3.value = function(...e4) { + if (h.logLevel !== n.LogLevelEnum.TRACE) return s3.apply(this, e4); + h.trace(`GlyphRenderer#${s3.name}(${e4.map((e5) => JSON.stringify(e5)).join(", ")})`); + const t4 = s3.apply(this, e4); + return h.trace(`GlyphRenderer#${s3.name} return`, t4), t4; + }; + }; + }, 726: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createDecorator = t2.getServiceDependencies = t2.serviceRegistry = void 0; + const i2 = "di$target", s2 = "di$dependencies"; + t2.serviceRegistry = /* @__PURE__ */ new Map(), t2.getServiceDependencies = function(e3) { + return e3[s2] || []; + }, t2.createDecorator = function(e3) { + if (t2.serviceRegistry.has(e3)) return t2.serviceRegistry.get(e3); + const r = function(e4, t3, o) { + if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); + !function(e5, t4, r2) { + t4[i2] === t4 ? t4[s2].push({ id: e5, index: r2 }) : (t4[s2] = [{ id: e5, index: r2 }], t4[i2] = t4); + }(r, e4, o); + }; + return r.toString = () => e3, t2.serviceRegistry.set(e3, r), r; + }; + }, 97: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.IDecorationService = t2.IUnicodeService = t2.IOscLinkService = t2.IOptionsService = t2.ILogService = t2.LogLevelEnum = t2.IInstantiationService = t2.ICharsetService = t2.ICoreService = t2.ICoreMouseService = t2.IBufferService = void 0; + const s2 = i2(726); + var r; + t2.IBufferService = (0, s2.createDecorator)("BufferService"), t2.ICoreMouseService = (0, s2.createDecorator)("CoreMouseService"), t2.ICoreService = (0, s2.createDecorator)("CoreService"), t2.ICharsetService = (0, s2.createDecorator)("CharsetService"), t2.IInstantiationService = (0, s2.createDecorator)("InstantiationService"), function(e3) { + e3[e3.TRACE = 0] = "TRACE", e3[e3.DEBUG = 1] = "DEBUG", e3[e3.INFO = 2] = "INFO", e3[e3.WARN = 3] = "WARN", e3[e3.ERROR = 4] = "ERROR", e3[e3.OFF = 5] = "OFF"; + }(r || (t2.LogLevelEnum = r = {})), t2.ILogService = (0, s2.createDecorator)("LogService"), t2.IOptionsService = (0, s2.createDecorator)("OptionsService"), t2.IOscLinkService = (0, s2.createDecorator)("OscLinkService"), t2.IUnicodeService = (0, s2.createDecorator)("UnicodeService"), t2.IDecorationService = (0, s2.createDecorator)("DecorationService"); + } }, t = {}; + function i(s2) { + var r = t[s2]; + if (void 0 !== r) return r.exports; + var o = t[s2] = { exports: {} }; + return e[s2].call(o.exports, o, o.exports, i), o.exports; + } + var s = {}; + return (() => { + var e2 = s; + Object.defineProperty(e2, "__esModule", { value: true }), e2.CanvasAddon = void 0; + const t2 = i(345), r = i(859), o = i(776), n = i(949); + class a extends r.Disposable { + constructor() { + super(...arguments), this._onChangeTextureAtlas = this.register(new t2.EventEmitter()), this.onChangeTextureAtlas = this._onChangeTextureAtlas.event, this._onAddTextureAtlasCanvas = this.register(new t2.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event; + } + get textureAtlas() { + var _a2; + return (_a2 = this._renderer) == null ? void 0 : _a2.textureAtlas; + } + activate(e3) { + const i2 = e3._core; + if (!e3.element) return void this.register(i2.onWillOpen(() => this.activate(e3))); + this._terminal = e3; + const s2 = i2.coreService, a2 = i2.optionsService, h = i2.screenElement, l = i2.linkifier, c = i2, d = c._bufferService, _ = c._renderService, u = c._characterJoinerService, g = c._charSizeService, f = c._coreBrowserService, v = c._decorationService, C = c._logService, p = c._themeService; + (0, o.setTraceLogger)(C), this._renderer = new n.CanvasRenderer(e3, h, l, d, g, a2, u, s2, f, v, p), this.register((0, t2.forwardEvent)(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)), this.register((0, t2.forwardEvent)(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)), _.setRenderer(this._renderer), _.handleResize(d.cols, d.rows), this.register((0, r.toDisposable)(() => { + var _a2; + _.setRenderer(this._terminal._core._createRenderer()), _.handleResize(e3.cols, e3.rows), (_a2 = this._renderer) == null ? void 0 : _a2.dispose(), this._renderer = void 0; + })); + } + clearTextureAtlas() { + var _a2; + (_a2 = this._renderer) == null ? void 0 : _a2.clearTextureAtlas(); + } + } + e2.CanvasAddon = a; + })(), s; + })()); +})(addonCanvas); +var addonCanvasExports = addonCanvas.exports; +var addonWebgl = { exports: {} }; +(function(module, exports) { + !function(e, t) { + module.exports = t(); + }(self, () => (() => { + var e = { 965: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.GlyphRenderer = void 0; + const s2 = i2(374), r = i2(509), o = i2(855), n = i2(859), a = i2(381), h = 11, l = h * Float32Array.BYTES_PER_ELEMENT; + let c, d = 0, _ = 0, u = 0; + class g extends n.Disposable { + constructor(e3, t3, i3, o2) { + super(), this._terminal = e3, this._gl = t3, this._dimensions = i3, this._optionsService = o2, this._activeBuffer = 0, this._vertices = { count: 0, attributes: new Float32Array(0), attributesBuffers: [new Float32Array(0), new Float32Array(0)] }; + const h2 = this._gl; + void 0 === r.TextureAtlas.maxAtlasPages && (r.TextureAtlas.maxAtlasPages = Math.min(32, (0, s2.throwIfFalsy)(h2.getParameter(h2.MAX_TEXTURE_IMAGE_UNITS))), r.TextureAtlas.maxTextureSize = (0, s2.throwIfFalsy)(h2.getParameter(h2.MAX_TEXTURE_SIZE))), this._program = (0, s2.throwIfFalsy)((0, a.createProgram)(h2, "#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}", function(e4) { + let t4 = ""; + for (let i4 = 1; i4 < e4; i4++) t4 += ` else if (v_texpage == ${i4}) { outColor = texture(u_texture[${i4}], v_texcoord); }`; + return `#version 300 es +precision lowp float; + +in vec2 v_texcoord; +flat in int v_texpage; + +uniform sampler2D u_texture[${e4}]; + +out vec4 outColor; + +void main() { + if (v_texpage == 0) { + outColor = texture(u_texture[0], v_texcoord); + } ${t4} +}`; + }(r.TextureAtlas.maxAtlasPages))), this.register((0, n.toDisposable)(() => h2.deleteProgram(this._program))), this._projectionLocation = (0, s2.throwIfFalsy)(h2.getUniformLocation(this._program, "u_projection")), this._resolutionLocation = (0, s2.throwIfFalsy)(h2.getUniformLocation(this._program, "u_resolution")), this._textureLocation = (0, s2.throwIfFalsy)(h2.getUniformLocation(this._program, "u_texture")), this._vertexArrayObject = h2.createVertexArray(), h2.bindVertexArray(this._vertexArrayObject); + const c2 = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), d2 = h2.createBuffer(); + this.register((0, n.toDisposable)(() => h2.deleteBuffer(d2))), h2.bindBuffer(h2.ARRAY_BUFFER, d2), h2.bufferData(h2.ARRAY_BUFFER, c2, h2.STATIC_DRAW), h2.enableVertexAttribArray(0), h2.vertexAttribPointer(0, 2, this._gl.FLOAT, false, 0, 0); + const _2 = new Uint8Array([0, 1, 2, 3]), u2 = h2.createBuffer(); + this.register((0, n.toDisposable)(() => h2.deleteBuffer(u2))), h2.bindBuffer(h2.ELEMENT_ARRAY_BUFFER, u2), h2.bufferData(h2.ELEMENT_ARRAY_BUFFER, _2, h2.STATIC_DRAW), this._attributesBuffer = (0, s2.throwIfFalsy)(h2.createBuffer()), this.register((0, n.toDisposable)(() => h2.deleteBuffer(this._attributesBuffer))), h2.bindBuffer(h2.ARRAY_BUFFER, this._attributesBuffer), h2.enableVertexAttribArray(2), h2.vertexAttribPointer(2, 2, h2.FLOAT, false, l, 0), h2.vertexAttribDivisor(2, 1), h2.enableVertexAttribArray(3), h2.vertexAttribPointer(3, 2, h2.FLOAT, false, l, 2 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(3, 1), h2.enableVertexAttribArray(4), h2.vertexAttribPointer(4, 1, h2.FLOAT, false, l, 4 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(4, 1), h2.enableVertexAttribArray(5), h2.vertexAttribPointer(5, 2, h2.FLOAT, false, l, 5 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(5, 1), h2.enableVertexAttribArray(6), h2.vertexAttribPointer(6, 2, h2.FLOAT, false, l, 7 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(6, 1), h2.enableVertexAttribArray(1), h2.vertexAttribPointer(1, 2, h2.FLOAT, false, l, 9 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(1, 1), h2.useProgram(this._program); + const g2 = new Int32Array(r.TextureAtlas.maxAtlasPages); + for (let e4 = 0; e4 < r.TextureAtlas.maxAtlasPages; e4++) g2[e4] = e4; + h2.uniform1iv(this._textureLocation, g2), h2.uniformMatrix4fv(this._projectionLocation, false, a.PROJECTION_MATRIX), this._atlasTextures = []; + for (let e4 = 0; e4 < r.TextureAtlas.maxAtlasPages; e4++) { + const t4 = new a.GLTexture((0, s2.throwIfFalsy)(h2.createTexture())); + this.register((0, n.toDisposable)(() => h2.deleteTexture(t4.texture))), h2.activeTexture(h2.TEXTURE0 + e4), h2.bindTexture(h2.TEXTURE_2D, t4.texture), h2.texParameteri(h2.TEXTURE_2D, h2.TEXTURE_WRAP_S, h2.CLAMP_TO_EDGE), h2.texParameteri(h2.TEXTURE_2D, h2.TEXTURE_WRAP_T, h2.CLAMP_TO_EDGE), h2.texImage2D(h2.TEXTURE_2D, 0, h2.RGBA, 1, 1, 0, h2.RGBA, h2.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255])), this._atlasTextures[e4] = t4; + } + h2.enable(h2.BLEND), h2.blendFunc(h2.SRC_ALPHA, h2.ONE_MINUS_SRC_ALPHA), this.handleResize(); + } + beginFrame() { + return !this._atlas || this._atlas.beginFrame(); + } + updateCell(e3, t3, i3, s3, r2, o2, n2, a2, h2) { + this._updateCell(this._vertices.attributes, e3, t3, i3, s3, r2, o2, n2, a2, h2); + } + _updateCell(e3, t3, i3, r2, n2, a2, l2, g2, v, f) { + d = (i3 * this._terminal.cols + t3) * h, r2 !== o.NULL_CELL_CODE && void 0 !== r2 ? this._atlas && (c = g2 && g2.length > 1 ? this._atlas.getRasterizedGlyphCombinedChar(g2, n2, a2, l2, false) : this._atlas.getRasterizedGlyph(r2, n2, a2, l2, false), _ = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2), n2 !== f && c.offset.x > _ ? (u = c.offset.x - _, e3[d] = -(c.offset.x - u) + this._dimensions.device.char.left, e3[d + 1] = -c.offset.y + this._dimensions.device.char.top, e3[d + 2] = (c.size.x - u) / this._dimensions.device.canvas.width, e3[d + 3] = c.size.y / this._dimensions.device.canvas.height, e3[d + 4] = c.texturePage, e3[d + 5] = c.texturePositionClipSpace.x + u / this._atlas.pages[c.texturePage].canvas.width, e3[d + 6] = c.texturePositionClipSpace.y, e3[d + 7] = c.sizeClipSpace.x - u / this._atlas.pages[c.texturePage].canvas.width, e3[d + 8] = c.sizeClipSpace.y) : (e3[d] = -c.offset.x + this._dimensions.device.char.left, e3[d + 1] = -c.offset.y + this._dimensions.device.char.top, e3[d + 2] = c.size.x / this._dimensions.device.canvas.width, e3[d + 3] = c.size.y / this._dimensions.device.canvas.height, e3[d + 4] = c.texturePage, e3[d + 5] = c.texturePositionClipSpace.x, e3[d + 6] = c.texturePositionClipSpace.y, e3[d + 7] = c.sizeClipSpace.x, e3[d + 8] = c.sizeClipSpace.y), this._optionsService.rawOptions.rescaleOverlappingGlyphs && (0, s2.allowRescaling)(r2, v, c.size.x, this._dimensions.device.cell.width) && (e3[d + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width)) : e3.fill(0, d, d + h - 1 - 2); + } + clear() { + const e3 = this._terminal, t3 = e3.cols * e3.rows * h; + this._vertices.count !== t3 ? this._vertices.attributes = new Float32Array(t3) : this._vertices.attributes.fill(0); + let i3 = 0; + for (; i3 < this._vertices.attributesBuffers.length; i3++) this._vertices.count !== t3 ? this._vertices.attributesBuffers[i3] = new Float32Array(t3) : this._vertices.attributesBuffers[i3].fill(0); + this._vertices.count = t3, i3 = 0; + for (let t4 = 0; t4 < e3.rows; t4++) for (let s3 = 0; s3 < e3.cols; s3++) this._vertices.attributes[i3 + 9] = s3 / e3.cols, this._vertices.attributes[i3 + 10] = t4 / e3.rows, i3 += h; + } + handleResize() { + const e3 = this._gl; + e3.useProgram(this._program), e3.viewport(0, 0, e3.canvas.width, e3.canvas.height), e3.uniform2f(this._resolutionLocation, e3.canvas.width, e3.canvas.height), this.clear(); + } + render(e3) { + if (!this._atlas) return; + const t3 = this._gl; + t3.useProgram(this._program), t3.bindVertexArray(this._vertexArrayObject), this._activeBuffer = (this._activeBuffer + 1) % 2; + const i3 = this._vertices.attributesBuffers[this._activeBuffer]; + let s3 = 0; + for (let t4 = 0; t4 < e3.lineLengths.length; t4++) { + const r2 = t4 * this._terminal.cols * h, o2 = this._vertices.attributes.subarray(r2, r2 + e3.lineLengths[t4] * h); + i3.set(o2, s3), s3 += o2.length; + } + t3.bindBuffer(t3.ARRAY_BUFFER, this._attributesBuffer), t3.bufferData(t3.ARRAY_BUFFER, i3.subarray(0, s3), t3.STREAM_DRAW); + for (let e4 = 0; e4 < this._atlas.pages.length; e4++) this._atlas.pages[e4].version !== this._atlasTextures[e4].version && this._bindAtlasPageTexture(t3, this._atlas, e4); + t3.drawElementsInstanced(t3.TRIANGLE_STRIP, 4, t3.UNSIGNED_BYTE, 0, s3 / h); + } + setAtlas(e3) { + this._atlas = e3; + for (const e4 of this._atlasTextures) e4.version = -1; + } + _bindAtlasPageTexture(e3, t3, i3) { + e3.activeTexture(e3.TEXTURE0 + i3), e3.bindTexture(e3.TEXTURE_2D, this._atlasTextures[i3].texture), e3.texParameteri(e3.TEXTURE_2D, e3.TEXTURE_WRAP_S, e3.CLAMP_TO_EDGE), e3.texParameteri(e3.TEXTURE_2D, e3.TEXTURE_WRAP_T, e3.CLAMP_TO_EDGE), e3.texImage2D(e3.TEXTURE_2D, 0, e3.RGBA, e3.RGBA, e3.UNSIGNED_BYTE, t3.pages[i3].canvas), e3.generateMipmap(e3.TEXTURE_2D), this._atlasTextures[i3].version = t3.pages[i3].version; + } + setDimensions(e3) { + this._dimensions = e3; + } + } + t2.GlyphRenderer = g; + }, 742: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.RectangleRenderer = void 0; + const s2 = i2(374), r = i2(859), o = i2(310), n = i2(381), a = 8 * Float32Array.BYTES_PER_ELEMENT; + class h { + constructor() { + this.attributes = new Float32Array(160), this.count = 0; + } + } + let l = 0, c = 0, d = 0, _ = 0, u = 0, g = 0, v = 0; + class f extends r.Disposable { + constructor(e3, t3, i3, o2) { + super(), this._terminal = e3, this._gl = t3, this._dimensions = i3, this._themeService = o2, this._vertices = new h(), this._verticesCursor = new h(); + const l2 = this._gl; + this._program = (0, s2.throwIfFalsy)((0, n.createProgram)(l2, "#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_size;\nlayout (location = 2) in vec4 a_color;\nlayout (location = 3) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}", "#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}")), this.register((0, r.toDisposable)(() => l2.deleteProgram(this._program))), this._projectionLocation = (0, s2.throwIfFalsy)(l2.getUniformLocation(this._program, "u_projection")), this._vertexArrayObject = l2.createVertexArray(), l2.bindVertexArray(this._vertexArrayObject); + const c2 = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), d2 = l2.createBuffer(); + this.register((0, r.toDisposable)(() => l2.deleteBuffer(d2))), l2.bindBuffer(l2.ARRAY_BUFFER, d2), l2.bufferData(l2.ARRAY_BUFFER, c2, l2.STATIC_DRAW), l2.enableVertexAttribArray(3), l2.vertexAttribPointer(3, 2, this._gl.FLOAT, false, 0, 0); + const _2 = new Uint8Array([0, 1, 2, 3]), u2 = l2.createBuffer(); + this.register((0, r.toDisposable)(() => l2.deleteBuffer(u2))), l2.bindBuffer(l2.ELEMENT_ARRAY_BUFFER, u2), l2.bufferData(l2.ELEMENT_ARRAY_BUFFER, _2, l2.STATIC_DRAW), this._attributesBuffer = (0, s2.throwIfFalsy)(l2.createBuffer()), this.register((0, r.toDisposable)(() => l2.deleteBuffer(this._attributesBuffer))), l2.bindBuffer(l2.ARRAY_BUFFER, this._attributesBuffer), l2.enableVertexAttribArray(0), l2.vertexAttribPointer(0, 2, l2.FLOAT, false, a, 0), l2.vertexAttribDivisor(0, 1), l2.enableVertexAttribArray(1), l2.vertexAttribPointer(1, 2, l2.FLOAT, false, a, 2 * Float32Array.BYTES_PER_ELEMENT), l2.vertexAttribDivisor(1, 1), l2.enableVertexAttribArray(2), l2.vertexAttribPointer(2, 4, l2.FLOAT, false, a, 4 * Float32Array.BYTES_PER_ELEMENT), l2.vertexAttribDivisor(2, 1), this._updateCachedColors(o2.colors), this.register(this._themeService.onChangeColors((e4) => { + this._updateCachedColors(e4), this._updateViewportRectangle(); + })); + } + renderBackgrounds() { + this._renderVertices(this._vertices); + } + renderCursor() { + this._renderVertices(this._verticesCursor); + } + _renderVertices(e3) { + const t3 = this._gl; + t3.useProgram(this._program), t3.bindVertexArray(this._vertexArrayObject), t3.uniformMatrix4fv(this._projectionLocation, false, n.PROJECTION_MATRIX), t3.bindBuffer(t3.ARRAY_BUFFER, this._attributesBuffer), t3.bufferData(t3.ARRAY_BUFFER, e3.attributes, t3.DYNAMIC_DRAW), t3.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, t3.UNSIGNED_BYTE, 0, e3.count); + } + handleResize() { + this._updateViewportRectangle(); + } + setDimensions(e3) { + this._dimensions = e3; + } + _updateCachedColors(e3) { + this._bgFloat = this._colorToFloat32Array(e3.background), this._cursorFloat = this._colorToFloat32Array(e3.cursor); + } + _updateViewportRectangle() { + this._addRectangleFloat(this._vertices.attributes, 0, 0, 0, this._terminal.cols * this._dimensions.device.cell.width, this._terminal.rows * this._dimensions.device.cell.height, this._bgFloat); + } + updateBackgrounds(e3) { + const t3 = this._terminal, i3 = this._vertices; + let s3, r2, n2, a2, h2, l2, c2, d2, _2, u2, g2, v2 = 1; + for (s3 = 0; s3 < t3.rows; s3++) { + for (n2 = -1, a2 = 0, h2 = 0, l2 = false, r2 = 0; r2 < t3.cols; r2++) c2 = (s3 * t3.cols + r2) * o.RENDER_MODEL_INDICIES_PER_CELL, d2 = e3.cells[c2 + o.RENDER_MODEL_BG_OFFSET], _2 = e3.cells[c2 + o.RENDER_MODEL_FG_OFFSET], u2 = !!(67108864 & _2), (d2 !== a2 || _2 !== h2 && (l2 || u2)) && ((0 !== a2 || l2 && 0 !== h2) && (g2 = 8 * v2++, this._updateRectangle(i3, g2, h2, a2, n2, r2, s3)), n2 = r2, a2 = d2, h2 = _2, l2 = u2); + (0 !== a2 || l2 && 0 !== h2) && (g2 = 8 * v2++, this._updateRectangle(i3, g2, h2, a2, n2, t3.cols, s3)); + } + i3.count = v2; + } + updateCursor(e3) { + const t3 = this._verticesCursor, i3 = e3.cursor; + if (!i3 || "block" === i3.style) return void (t3.count = 0); + let s3, r2 = 0; + "bar" !== i3.style && "outline" !== i3.style || (s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, i3.x * this._dimensions.device.cell.width, i3.y * this._dimensions.device.cell.height, "bar" === i3.style ? i3.dpr * i3.cursorWidth : i3.dpr, this._dimensions.device.cell.height, this._cursorFloat)), "underline" !== i3.style && "outline" !== i3.style || (s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, i3.x * this._dimensions.device.cell.width, (i3.y + 1) * this._dimensions.device.cell.height - i3.dpr, i3.width * this._dimensions.device.cell.width, i3.dpr, this._cursorFloat)), "outline" === i3.style && (s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, i3.x * this._dimensions.device.cell.width, i3.y * this._dimensions.device.cell.height, i3.width * this._dimensions.device.cell.width, i3.dpr, this._cursorFloat), s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, (i3.x + i3.width) * this._dimensions.device.cell.width - i3.dpr, i3.y * this._dimensions.device.cell.height, i3.dpr, this._dimensions.device.cell.height, this._cursorFloat)), t3.count = r2; + } + _updateRectangle(e3, t3, i3, s3, r2, o2, a2) { + if (67108864 & i3) switch (50331648 & i3) { + case 16777216: + case 33554432: + l = this._themeService.colors.ansi[255 & i3].rgba; + break; + case 50331648: + l = (16777215 & i3) << 8; + break; + default: + l = this._themeService.colors.foreground.rgba; + } + else switch (50331648 & s3) { + case 16777216: + case 33554432: + l = this._themeService.colors.ansi[255 & s3].rgba; + break; + case 50331648: + l = (16777215 & s3) << 8; + break; + default: + l = this._themeService.colors.background.rgba; + } + e3.attributes.length < t3 + 4 && (e3.attributes = (0, n.expandFloat32Array)(e3.attributes, this._terminal.rows * this._terminal.cols * 8)), c = r2 * this._dimensions.device.cell.width, d = a2 * this._dimensions.device.cell.height, _ = (l >> 24 & 255) / 255, u = (l >> 16 & 255) / 255, g = (l >> 8 & 255) / 255, v = 1, this._addRectangle(e3.attributes, t3, c, d, (o2 - r2) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, _, u, g, v); + } + _addRectangle(e3, t3, i3, s3, r2, o2, n2, a2, h2, l2) { + e3[t3] = i3 / this._dimensions.device.canvas.width, e3[t3 + 1] = s3 / this._dimensions.device.canvas.height, e3[t3 + 2] = r2 / this._dimensions.device.canvas.width, e3[t3 + 3] = o2 / this._dimensions.device.canvas.height, e3[t3 + 4] = n2, e3[t3 + 5] = a2, e3[t3 + 6] = h2, e3[t3 + 7] = l2; + } + _addRectangleFloat(e3, t3, i3, s3, r2, o2, n2) { + e3[t3] = i3 / this._dimensions.device.canvas.width, e3[t3 + 1] = s3 / this._dimensions.device.canvas.height, e3[t3 + 2] = r2 / this._dimensions.device.canvas.width, e3[t3 + 3] = o2 / this._dimensions.device.canvas.height, e3[t3 + 4] = n2[0], e3[t3 + 5] = n2[1], e3[t3 + 6] = n2[2], e3[t3 + 7] = n2[3]; + } + _colorToFloat32Array(e3) { + return new Float32Array([(e3.rgba >> 24 & 255) / 255, (e3.rgba >> 16 & 255) / 255, (e3.rgba >> 8 & 255) / 255, (255 & e3.rgba) / 255]); + } + } + t2.RectangleRenderer = f; + }, 310: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.RenderModel = t2.COMBINED_CHAR_BIT_MASK = t2.RENDER_MODEL_EXT_OFFSET = t2.RENDER_MODEL_FG_OFFSET = t2.RENDER_MODEL_BG_OFFSET = t2.RENDER_MODEL_INDICIES_PER_CELL = void 0; + const s2 = i2(296); + t2.RENDER_MODEL_INDICIES_PER_CELL = 4, t2.RENDER_MODEL_BG_OFFSET = 1, t2.RENDER_MODEL_FG_OFFSET = 2, t2.RENDER_MODEL_EXT_OFFSET = 3, t2.COMBINED_CHAR_BIT_MASK = 2147483648, t2.RenderModel = class { + constructor() { + this.cells = new Uint32Array(0), this.lineLengths = new Uint32Array(0), this.selection = (0, s2.createSelectionRenderModel)(); + } + resize(e3, i3) { + const s3 = e3 * i3 * t2.RENDER_MODEL_INDICIES_PER_CELL; + s3 !== this.cells.length && (this.cells = new Uint32Array(s3), this.lineLengths = new Uint32Array(i3)); + } + clear() { + this.cells.fill(0, 0), this.lineLengths.fill(0, 0); + } + }; + }, 666: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.JoinedCellData = t2.WebglRenderer = void 0; + const s2 = i2(820), r = i2(274), o = i2(627), n = i2(457), a = i2(56), h = i2(374), l = i2(345), c = i2(859), d = i2(147), _ = i2(782), u = i2(855), g = i2(965), v = i2(742), f = i2(310), p = i2(733); + class C extends c.Disposable { + constructor(e3, t3, i3, n2, d2, u2, g2, v2, C2) { + super(), this._terminal = e3, this._characterJoinerService = t3, this._charSizeService = i3, this._coreBrowserService = n2, this._coreService = d2, this._decorationService = u2, this._optionsService = g2, this._themeService = v2, this._cursorBlinkStateManager = new c.MutableDisposable(), this._charAtlasDisposable = this.register(new c.MutableDisposable()), this._observerDisposable = this.register(new c.MutableDisposable()), this._model = new f.RenderModel(), this._workCell = new _.CellData(), this._workCell2 = new _.CellData(), this._rectangleRenderer = this.register(new c.MutableDisposable()), this._glyphRenderer = this.register(new c.MutableDisposable()), this._onChangeTextureAtlas = this.register(new l.EventEmitter()), this.onChangeTextureAtlas = this._onChangeTextureAtlas.event, this._onAddTextureAtlasCanvas = this.register(new l.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = this.register(new l.EventEmitter()), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._onRequestRedraw = this.register(new l.EventEmitter()), this.onRequestRedraw = this._onRequestRedraw.event, this._onContextLoss = this.register(new l.EventEmitter()), this.onContextLoss = this._onContextLoss.event, this.register(this._themeService.onChangeColors(() => this._handleColorChange())), this._cellColorResolver = new r.CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService), this._core = this._terminal._core, this._renderLayers = [new p.LinkRenderLayer(this._core.screenElement, 2, this._terminal, this._core.linkifier, this._coreBrowserService, g2, this._themeService)], this.dimensions = (0, h.createRenderDimensions)(), this._devicePixelRatio = this._coreBrowserService.dpr, this._updateDimensions(), this._updateCursorBlink(), this.register(g2.onOptionChange(() => this._handleOptionsChanged())), this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"); + const m2 = { antialias: false, depth: false, preserveDrawingBuffer: C2 }; + if (this._gl = this._canvas.getContext("webgl2", m2), !this._gl) throw new Error("WebGL2 not supported " + this._gl); + this.register((0, s2.addDisposableDomListener)(this._canvas, "webglcontextlost", (e4) => { + console.log("webglcontextlost event received"), e4.preventDefault(), this._contextRestorationTimeout = setTimeout(() => { + this._contextRestorationTimeout = void 0, console.warn("webgl context not restored; firing onContextLoss"), this._onContextLoss.fire(e4); + }, 3e3); + })), this.register((0, s2.addDisposableDomListener)(this._canvas, "webglcontextrestored", (e4) => { + console.warn("webglcontextrestored event received"), clearTimeout(this._contextRestorationTimeout), this._contextRestorationTimeout = void 0, (0, o.removeTerminalFromCache)(this._terminal), this._initializeWebGLState(), this._requestRedrawViewport(); + })), this._observerDisposable.value = (0, a.observeDevicePixelDimensions)(this._canvas, this._coreBrowserService.window, (e4, t4) => this._setCanvasDevicePixelDimensions(e4, t4)), this.register(this._coreBrowserService.onWindowChange((e4) => { + this._observerDisposable.value = (0, a.observeDevicePixelDimensions)(this._canvas, e4, (e5, t4) => this._setCanvasDevicePixelDimensions(e5, t4)); + })), this._core.screenElement.appendChild(this._canvas), [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState(), this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement), this.register((0, c.toDisposable)(() => { + var _a; + for (const e4 of this._renderLayers) e4.dispose(); + (_a = this._canvas.parentElement) == null ? void 0 : _a.removeChild(this._canvas), (0, o.removeTerminalFromCache)(this._terminal); + })); + } + get textureAtlas() { + var _a; + return (_a = this._charAtlas) == null ? void 0 : _a.pages[0].canvas; + } + _handleColorChange() { + this._refreshCharAtlas(), this._clearModel(true); + } + handleDevicePixelRatioChange() { + this._devicePixelRatio !== this._coreBrowserService.dpr && (this._devicePixelRatio = this._coreBrowserService.dpr, this.handleResize(this._terminal.cols, this._terminal.rows)); + } + handleResize(e3, t3) { + var _a, _b, _c, _d; + this._updateDimensions(), this._model.resize(this._terminal.cols, this._terminal.rows); + for (const e4 of this._renderLayers) e4.resize(this._terminal, this.dimensions); + this._canvas.width = this.dimensions.device.canvas.width, this._canvas.height = this.dimensions.device.canvas.height, this._canvas.style.width = `${this.dimensions.css.canvas.width}px`, this._canvas.style.height = `${this.dimensions.css.canvas.height}px`, this._core.screenElement.style.width = `${this.dimensions.css.canvas.width}px`, this._core.screenElement.style.height = `${this.dimensions.css.canvas.height}px`, (_a = this._rectangleRenderer.value) == null ? void 0 : _a.setDimensions(this.dimensions), (_b = this._rectangleRenderer.value) == null ? void 0 : _b.handleResize(), (_c = this._glyphRenderer.value) == null ? void 0 : _c.setDimensions(this.dimensions), (_d = this._glyphRenderer.value) == null ? void 0 : _d.handleResize(), this._refreshCharAtlas(), this._clearModel(false); + } + handleCharSizeChanged() { + this.handleResize(this._terminal.cols, this._terminal.rows); + } + handleBlur() { + var _a; + for (const e3 of this._renderLayers) e3.handleBlur(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.pause(), this._requestRedrawViewport(); + } + handleFocus() { + var _a; + for (const e3 of this._renderLayers) e3.handleFocus(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.resume(), this._requestRedrawViewport(); + } + handleSelectionChanged(e3, t3, i3) { + for (const s3 of this._renderLayers) s3.handleSelectionChanged(this._terminal, e3, t3, i3); + this._model.selection.update(this._core, e3, t3, i3), this._requestRedrawViewport(); + } + handleCursorMove() { + var _a; + for (const e3 of this._renderLayers) e3.handleCursorMove(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.restartBlinkAnimation(); + } + _handleOptionsChanged() { + this._updateDimensions(), this._refreshCharAtlas(), this._updateCursorBlink(); + } + _initializeWebGLState() { + return this._rectangleRenderer.value = new v.RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService), this._glyphRenderer.value = new g.GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService), this.handleCharSizeChanged(), [this._rectangleRenderer.value, this._glyphRenderer.value]; + } + _refreshCharAtlas() { + var _a; + if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) return void (this._isAttached = false); + const e3 = (0, o.acquireTextureAtlas)(this._terminal, this._optionsService.rawOptions, this._themeService.colors, this.dimensions.device.cell.width, this.dimensions.device.cell.height, this.dimensions.device.char.width, this.dimensions.device.char.height, this._coreBrowserService.dpr); + this._charAtlas !== e3 && (this._onChangeTextureAtlas.fire(e3.pages[0].canvas), this._charAtlasDisposable.value = (0, c.getDisposeArrayDisposable)([(0, l.forwardEvent)(e3.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas), (0, l.forwardEvent)(e3.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)])), this._charAtlas = e3, this._charAtlas.warmUp(), (_a = this._glyphRenderer.value) == null ? void 0 : _a.setAtlas(this._charAtlas); + } + _clearModel(e3) { + var _a; + this._model.clear(), e3 && ((_a = this._glyphRenderer.value) == null ? void 0 : _a.clear()); + } + clearTextureAtlas() { + var _a; + (_a = this._charAtlas) == null ? void 0 : _a.clearTexture(), this._clearModel(true), this._requestRedrawViewport(); + } + clear() { + var _a; + this._clearModel(true); + for (const e3 of this._renderLayers) e3.reset(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.restartBlinkAnimation(), this._updateCursorBlink(); + } + registerCharacterJoiner(e3) { + return -1; + } + deregisterCharacterJoiner(e3) { + return false; + } + renderRows(e3, t3) { + if (!this._isAttached) { + if (!(this._coreBrowserService.window.document.body.contains(this._core.screenElement) && this._charSizeService.width && this._charSizeService.height)) return; + this._updateDimensions(), this._refreshCharAtlas(), this._isAttached = true; + } + for (const i3 of this._renderLayers) i3.handleGridChanged(this._terminal, e3, t3); + this._glyphRenderer.value && this._rectangleRenderer.value && (this._glyphRenderer.value.beginFrame() ? (this._clearModel(true), this._updateModel(0, this._terminal.rows - 1)) : this._updateModel(e3, t3), this._rectangleRenderer.value.renderBackgrounds(), this._glyphRenderer.value.render(this._model), this._cursorBlinkStateManager.value && !this._cursorBlinkStateManager.value.isCursorVisible || this._rectangleRenderer.value.renderCursor()); + } + _updateCursorBlink() { + this._terminal.options.cursorBlink ? this._cursorBlinkStateManager.value = new n.CursorBlinkStateManager(() => { + this._requestRedrawCursor(); + }, this._coreBrowserService) : this._cursorBlinkStateManager.clear(), this._requestRedrawCursor(); + } + _updateModel(e3, t3) { + const i3 = this._core; + let s3, r2, o2, n2, a2, h2, l2, c2, d2, _2, g2, v2, p2, C2, x = this._workCell; + e3 = L(e3, i3.rows - 1, 0), t3 = L(t3, i3.rows - 1, 0); + const w = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY, b = w - i3.buffer.ydisp, M = Math.min(this._terminal.buffer.active.cursorX, i3.cols - 1); + let R = -1; + const y = this._coreService.isCursorInitialized && !this._coreService.isCursorHidden && (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible); + this._model.cursor = void 0; + let A = false; + for (r2 = e3; r2 <= t3; r2++) for (o2 = r2 + i3.buffer.ydisp, n2 = i3.buffer.lines.get(o2), this._model.lineLengths[r2] = 0, a2 = this._characterJoinerService.getJoinedCharacters(o2), p2 = 0; p2 < i3.cols; p2++) if (s3 = this._cellColorResolver.result.bg, n2.loadCell(p2, x), 0 === p2 && (s3 = this._cellColorResolver.result.bg), h2 = false, l2 = p2, a2.length > 0 && p2 === a2[0][0] && (h2 = true, c2 = a2.shift(), x = new m(x, n2.translateToString(true, c2[0], c2[1]), c2[1] - c2[0]), l2 = c2[1] - 1), d2 = x.getChars(), _2 = x.getCode(), v2 = (r2 * i3.cols + p2) * f.RENDER_MODEL_INDICIES_PER_CELL, this._cellColorResolver.resolve(x, p2, o2, this.dimensions.device.cell.width), y && o2 === w && (p2 === M && (this._model.cursor = { x: M, y: b, width: x.getWidth(), style: this._coreBrowserService.isFocused ? i3.options.cursorStyle || "block" : i3.options.cursorInactiveStyle, cursorWidth: i3.options.cursorWidth, dpr: this._devicePixelRatio }, R = M + x.getWidth() - 1), p2 >= M && p2 <= R && (this._coreBrowserService.isFocused && "block" === (i3.options.cursorStyle || "block") || false === this._coreBrowserService.isFocused && "block" === i3.options.cursorInactiveStyle) && (this._cellColorResolver.result.fg = 50331648 | this._themeService.colors.cursorAccent.rgba >> 8 & 16777215, this._cellColorResolver.result.bg = 50331648 | this._themeService.colors.cursor.rgba >> 8 & 16777215)), _2 !== u.NULL_CELL_CODE && (this._model.lineLengths[r2] = p2 + 1), (this._model.cells[v2] !== _2 || this._model.cells[v2 + f.RENDER_MODEL_BG_OFFSET] !== this._cellColorResolver.result.bg || this._model.cells[v2 + f.RENDER_MODEL_FG_OFFSET] !== this._cellColorResolver.result.fg || this._model.cells[v2 + f.RENDER_MODEL_EXT_OFFSET] !== this._cellColorResolver.result.ext) && (A = true, d2.length > 1 && (_2 |= f.COMBINED_CHAR_BIT_MASK), this._model.cells[v2] = _2, this._model.cells[v2 + f.RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg, this._model.cells[v2 + f.RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg, this._model.cells[v2 + f.RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext, g2 = x.getWidth(), this._glyphRenderer.value.updateCell(p2, r2, _2, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, d2, g2, s3), h2)) for (x = this._workCell, p2++; p2 < l2; p2++) C2 = (r2 * i3.cols + p2) * f.RENDER_MODEL_INDICIES_PER_CELL, this._glyphRenderer.value.updateCell(p2, r2, u.NULL_CELL_CODE, 0, 0, 0, u.NULL_CELL_CHAR, 0, 0), this._model.cells[C2] = u.NULL_CELL_CODE, this._model.cells[C2 + f.RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg, this._model.cells[C2 + f.RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg, this._model.cells[C2 + f.RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext; + A && this._rectangleRenderer.value.updateBackgrounds(this._model), this._rectangleRenderer.value.updateCursor(this._model); + } + _updateDimensions() { + this._charSizeService.width && this._charSizeService.height && (this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio), this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio), this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight), this.dimensions.device.char.top = 1 === this._optionsService.rawOptions.lineHeight ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2), this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing), this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2), this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height, this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width, this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio), this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio), this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio, this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio); + } + _setCanvasDevicePixelDimensions(e3, t3) { + this._canvas.width === e3 && this._canvas.height === t3 || (this._canvas.width = e3, this._canvas.height = t3, this._requestRedrawViewport()); + } + _requestRedrawViewport() { + this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 }); + } + _requestRedrawCursor() { + const e3 = this._terminal.buffer.active.cursorY; + this._onRequestRedraw.fire({ start: e3, end: e3 }); + } + } + t2.WebglRenderer = C; + class m extends d.AttributeData { + constructor(e3, t3, i3) { + super(), this.content = 0, this.combinedData = "", this.fg = e3.fg, this.bg = e3.bg, this.combinedData = t3, this._width = i3; + } + isCombined() { + return 2097152; + } + getWidth() { + return this._width; + } + getChars() { + return this.combinedData; + } + getCode() { + return 2097151; + } + setFromCharData(e3) { + throw new Error("not implemented"); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + function L(e3, t3, i3 = 0) { + return Math.max(Math.min(e3, t3), i3); + } + t2.JoinedCellData = m; + }, 381: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.GLTexture = t2.expandFloat32Array = t2.createShader = t2.createProgram = t2.PROJECTION_MATRIX = void 0; + const s2 = i2(374); + function r(e3, t3, i3) { + const r2 = (0, s2.throwIfFalsy)(e3.createShader(t3)); + if (e3.shaderSource(r2, i3), e3.compileShader(r2), e3.getShaderParameter(r2, e3.COMPILE_STATUS)) return r2; + console.error(e3.getShaderInfoLog(r2)), e3.deleteShader(r2); + } + t2.PROJECTION_MATRIX = new Float32Array([2, 0, 0, 0, 0, -2, 0, 0, 0, 0, 1, 0, -1, 1, 0, 1]), t2.createProgram = function(e3, t3, i3) { + const o = (0, s2.throwIfFalsy)(e3.createProgram()); + if (e3.attachShader(o, (0, s2.throwIfFalsy)(r(e3, e3.VERTEX_SHADER, t3))), e3.attachShader(o, (0, s2.throwIfFalsy)(r(e3, e3.FRAGMENT_SHADER, i3))), e3.linkProgram(o), e3.getProgramParameter(o, e3.LINK_STATUS)) return o; + console.error(e3.getProgramInfoLog(o)), e3.deleteProgram(o); + }, t2.createShader = r, t2.expandFloat32Array = function(e3, t3) { + const i3 = Math.min(2 * e3.length, t3), s3 = new Float32Array(i3); + for (let t4 = 0; t4 < e3.length; t4++) s3[t4] = e3[t4]; + return s3; + }, t2.GLTexture = class { + constructor(e3) { + this.texture = e3, this.version = -1; + } + }; + }, 592: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BaseRenderLayer = void 0; + const s2 = i2(627), r = i2(237), o = i2(374), n = i2(859); + class a extends n.Disposable { + constructor(e3, t3, i3, s3, r2, o2, a2, h) { + super(), this._container = t3, this._alpha = r2, this._coreBrowserService = o2, this._optionsService = a2, this._themeService = h, this._deviceCharWidth = 0, this._deviceCharHeight = 0, this._deviceCellWidth = 0, this._deviceCellHeight = 0, this._deviceCharLeft = 0, this._deviceCharTop = 0, this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"), this._canvas.classList.add(`xterm-${i3}-layer`), this._canvas.style.zIndex = s3.toString(), this._initCanvas(), this._container.appendChild(this._canvas), this.register(this._themeService.onChangeColors((t4) => { + this._refreshCharAtlas(e3, t4), this.reset(e3); + })), this.register((0, n.toDisposable)(() => { + this._canvas.remove(); + })); + } + _initCanvas() { + this._ctx = (0, o.throwIfFalsy)(this._canvas.getContext("2d", { alpha: this._alpha })), this._alpha || this._clearAll(); + } + handleBlur(e3) { + } + handleFocus(e3) { + } + handleCursorMove(e3) { + } + handleGridChanged(e3, t3, i3) { + } + handleSelectionChanged(e3, t3, i3, s3 = false) { + } + _setTransparency(e3, t3) { + if (t3 === this._alpha) return; + const i3 = this._canvas; + this._alpha = t3, this._canvas = this._canvas.cloneNode(), this._initCanvas(), this._container.replaceChild(this._canvas, i3), this._refreshCharAtlas(e3, this._themeService.colors), this.handleGridChanged(e3, 0, e3.rows - 1); + } + _refreshCharAtlas(e3, t3) { + this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0 || (this._charAtlas = (0, s2.acquireTextureAtlas)(e3, this._optionsService.rawOptions, t3, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr), this._charAtlas.warmUp()); + } + resize(e3, t3) { + this._deviceCellWidth = t3.device.cell.width, this._deviceCellHeight = t3.device.cell.height, this._deviceCharWidth = t3.device.char.width, this._deviceCharHeight = t3.device.char.height, this._deviceCharLeft = t3.device.char.left, this._deviceCharTop = t3.device.char.top, this._canvas.width = t3.device.canvas.width, this._canvas.height = t3.device.canvas.height, this._canvas.style.width = `${t3.css.canvas.width}px`, this._canvas.style.height = `${t3.css.canvas.height}px`, this._alpha || this._clearAll(), this._refreshCharAtlas(e3, this._themeService.colors); + } + _fillBottomLineAtCells(e3, t3, i3 = 1) { + this._ctx.fillRect(e3 * this._deviceCellWidth, (t3 + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1, i3 * this._deviceCellWidth, this._coreBrowserService.dpr); + } + _clearAll() { + this._alpha ? this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height) : (this._ctx.fillStyle = this._themeService.colors.background.css, this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height)); + } + _clearCells(e3, t3, i3, s3) { + this._alpha ? this._ctx.clearRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight) : (this._ctx.fillStyle = this._themeService.colors.background.css, this._ctx.fillRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight)); + } + _fillCharTrueColor(e3, t3, i3, s3) { + this._ctx.font = this._getFont(e3, false, false), this._ctx.textBaseline = r.TEXT_BASELINE, this._clipCell(i3, s3, t3.getWidth()), this._ctx.fillText(t3.getChars(), i3 * this._deviceCellWidth + this._deviceCharLeft, s3 * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight); + } + _clipCell(e3, t3, i3) { + this._ctx.beginPath(), this._ctx.rect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, this._deviceCellHeight), this._ctx.clip(); + } + _getFont(e3, t3, i3) { + return `${i3 ? "italic" : ""} ${t3 ? e3.options.fontWeightBold : e3.options.fontWeight} ${e3.options.fontSize * this._coreBrowserService.dpr}px ${e3.options.fontFamily}`; + } + } + t2.BaseRenderLayer = a; + }, 733: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkRenderLayer = void 0; + const s2 = i2(197), r = i2(237), o = i2(592); + class n extends o.BaseRenderLayer { + constructor(e3, t3, i3, s3, r2, o2, n2) { + super(i3, e3, "link", t3, true, r2, o2, n2), this.register(s3.onShowLinkUnderline((e4) => this._handleShowLinkUnderline(e4))), this.register(s3.onHideLinkUnderline((e4) => this._handleHideLinkUnderline(e4))); + } + resize(e3, t3) { + super.resize(e3, t3), this._state = void 0; + } + reset(e3) { + this._clearCurrentLink(); + } + _clearCurrentLink() { + if (this._state) { + this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1); + const e3 = this._state.y2 - this._state.y1 - 1; + e3 > 0 && this._clearCells(0, this._state.y1 + 1, this._state.cols, e3), this._clearCells(0, this._state.y2, this._state.x2, 1), this._state = void 0; + } + } + _handleShowLinkUnderline(e3) { + if (e3.fg === r.INVERTED_DEFAULT_COLOR ? this._ctx.fillStyle = this._themeService.colors.background.css : void 0 !== e3.fg && (0, s2.is256Color)(e3.fg) ? this._ctx.fillStyle = this._themeService.colors.ansi[e3.fg].css : this._ctx.fillStyle = this._themeService.colors.foreground.css, e3.y1 === e3.y2) this._fillBottomLineAtCells(e3.x1, e3.y1, e3.x2 - e3.x1); + else { + this._fillBottomLineAtCells(e3.x1, e3.y1, e3.cols - e3.x1); + for (let t3 = e3.y1 + 1; t3 < e3.y2; t3++) this._fillBottomLineAtCells(0, t3, e3.cols); + this._fillBottomLineAtCells(0, e3.y2, e3.x2); + } + this._state = e3; + } + _handleHideLinkUnderline(e3) { + this._clearCurrentLink(); + } + } + t2.LinkRenderLayer = n; + }, 820: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.addDisposableDomListener = void 0, t2.addDisposableDomListener = function(e3, t3, i2, s2) { + e3.addEventListener(t3, i2, s2); + let r = false; + return { dispose: () => { + r || (r = true, e3.removeEventListener(t3, i2, s2)); + } }; + }; + }, 274: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellColorResolver = void 0; + const s2 = i2(855), r = i2(160), o = i2(374); + let n, a = 0, h = 0, l = false, c = false, d = false, _ = 0; + t2.CellColorResolver = class { + constructor(e3, t3, i3, s3, r2, o2) { + this._terminal = e3, this._optionService = t3, this._selectionRenderModel = i3, this._decorationService = s3, this._coreBrowserService = r2, this._themeService = o2, this.result = { fg: 0, bg: 0, ext: 0 }; + } + resolve(e3, t3, i3, u) { + if (this.result.bg = e3.bg, this.result.fg = e3.fg, this.result.ext = 268435456 & e3.bg ? e3.extended.ext : 0, h = 0, a = 0, c = false, l = false, d = false, n = this._themeService.colors, _ = 0, e3.getCode() !== s2.NULL_CELL_CODE && 4 === e3.extended.underlineStyle) { + const e4 = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15)); + _ = t3 * u % (2 * Math.round(e4)); + } + if (this._decorationService.forEachDecorationAtCell(t3, i3, "bottom", (e4) => { + e4.backgroundColorRGB && (h = e4.backgroundColorRGB.rgba >> 8 & 16777215, c = true), e4.foregroundColorRGB && (a = e4.foregroundColorRGB.rgba >> 8 & 16777215, l = true); + }), d = this._selectionRenderModel.isCellSelected(this._terminal, t3, i3), d) { + if (67108864 & this.result.fg || 0 != (50331648 & this.result.bg)) { + if (67108864 & this.result.fg) switch (50331648 & this.result.fg) { + case 16777216: + case 33554432: + h = this._themeService.colors.ansi[255 & this.result.fg].rgba; + break; + case 50331648: + h = (16777215 & this.result.fg) << 8 | 255; + break; + default: + h = this._themeService.colors.foreground.rgba; + } + else switch (50331648 & this.result.bg) { + case 16777216: + case 33554432: + h = this._themeService.colors.ansi[255 & this.result.bg].rgba; + break; + case 50331648: + h = (16777215 & this.result.bg) << 8 | 255; + } + h = r.rgba.blend(h, 4294967040 & (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba | 128) >> 8 & 16777215; + } else h = (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba >> 8 & 16777215; + if (c = true, n.selectionForeground && (a = n.selectionForeground.rgba >> 8 & 16777215, l = true), (0, o.treatGlyphAsBackgroundColor)(e3.getCode())) { + if (67108864 & this.result.fg && 0 == (50331648 & this.result.bg)) a = (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba >> 8 & 16777215; + else { + if (67108864 & this.result.fg) switch (50331648 & this.result.bg) { + case 16777216: + case 33554432: + a = this._themeService.colors.ansi[255 & this.result.bg].rgba; + break; + case 50331648: + a = (16777215 & this.result.bg) << 8 | 255; + } + else switch (50331648 & this.result.fg) { + case 16777216: + case 33554432: + a = this._themeService.colors.ansi[255 & this.result.fg].rgba; + break; + case 50331648: + a = (16777215 & this.result.fg) << 8 | 255; + break; + default: + a = this._themeService.colors.foreground.rgba; + } + a = r.rgba.blend(a, 4294967040 & (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba | 128) >> 8 & 16777215; + } + l = true; + } + } + this._decorationService.forEachDecorationAtCell(t3, i3, "top", (e4) => { + e4.backgroundColorRGB && (h = e4.backgroundColorRGB.rgba >> 8 & 16777215, c = true), e4.foregroundColorRGB && (a = e4.foregroundColorRGB.rgba >> 8 & 16777215, l = true); + }), c && (h = d ? -16777216 & e3.bg & -134217729 | h | 50331648 : -16777216 & e3.bg | h | 50331648), l && (a = -16777216 & e3.fg & -67108865 | a | 50331648), 67108864 & this.result.fg && (c && !l && (a = 0 == (50331648 & this.result.bg) ? -134217728 & this.result.fg | 16777215 & n.background.rgba >> 8 | 50331648 : -134217728 & this.result.fg | 67108863 & this.result.bg, l = true), !c && l && (h = 0 == (50331648 & this.result.fg) ? -67108864 & this.result.bg | 16777215 & n.foreground.rgba >> 8 | 50331648 : -67108864 & this.result.bg | 67108863 & this.result.fg, c = true)), n = void 0, this.result.bg = c ? h : this.result.bg, this.result.fg = l ? a : this.result.fg, this.result.ext &= 536870911, this.result.ext |= _ << 29 & 3758096384; + } + }; + }, 627: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.removeTerminalFromCache = t2.acquireTextureAtlas = void 0; + const s2 = i2(509), r = i2(197), o = []; + t2.acquireTextureAtlas = function(e3, t3, i3, n, a, h, l, c) { + const d = (0, r.generateConfig)(n, a, h, l, t3, i3, c); + for (let t4 = 0; t4 < o.length; t4++) { + const i4 = o[t4], s3 = i4.ownedBy.indexOf(e3); + if (s3 >= 0) { + if ((0, r.configEquals)(i4.config, d)) return i4.atlas; + 1 === i4.ownedBy.length ? (i4.atlas.dispose(), o.splice(t4, 1)) : i4.ownedBy.splice(s3, 1); + break; + } + } + for (let t4 = 0; t4 < o.length; t4++) { + const i4 = o[t4]; + if ((0, r.configEquals)(i4.config, d)) return i4.ownedBy.push(e3), i4.atlas; + } + const _ = e3._core, u = { atlas: new s2.TextureAtlas(document, d, _.unicodeService), config: d, ownedBy: [e3] }; + return o.push(u), u.atlas; + }, t2.removeTerminalFromCache = function(e3) { + for (let t3 = 0; t3 < o.length; t3++) { + const i3 = o[t3].ownedBy.indexOf(e3); + if (-1 !== i3) { + 1 === o[t3].ownedBy.length ? (o[t3].atlas.dispose(), o.splice(t3, 1)) : o[t3].ownedBy.splice(i3, 1); + break; + } + } + }; + }, 197: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.is256Color = t2.configEquals = t2.generateConfig = void 0; + const s2 = i2(160); + t2.generateConfig = function(e3, t3, i3, r, o, n, a) { + const h = { foreground: n.foreground, background: n.background, cursor: s2.NULL_COLOR, cursorAccent: s2.NULL_COLOR, selectionForeground: s2.NULL_COLOR, selectionBackgroundTransparent: s2.NULL_COLOR, selectionBackgroundOpaque: s2.NULL_COLOR, selectionInactiveBackgroundTransparent: s2.NULL_COLOR, selectionInactiveBackgroundOpaque: s2.NULL_COLOR, ansi: n.ansi.slice(), contrastCache: n.contrastCache, halfContrastCache: n.halfContrastCache }; + return { customGlyphs: o.customGlyphs, devicePixelRatio: a, letterSpacing: o.letterSpacing, lineHeight: o.lineHeight, deviceCellWidth: e3, deviceCellHeight: t3, deviceCharWidth: i3, deviceCharHeight: r, fontFamily: o.fontFamily, fontSize: o.fontSize, fontWeight: o.fontWeight, fontWeightBold: o.fontWeightBold, allowTransparency: o.allowTransparency, drawBoldTextInBrightColors: o.drawBoldTextInBrightColors, minimumContrastRatio: o.minimumContrastRatio, colors: h }; + }, t2.configEquals = function(e3, t3) { + for (let i3 = 0; i3 < e3.colors.ansi.length; i3++) if (e3.colors.ansi[i3].rgba !== t3.colors.ansi[i3].rgba) return false; + return e3.devicePixelRatio === t3.devicePixelRatio && e3.customGlyphs === t3.customGlyphs && e3.lineHeight === t3.lineHeight && e3.letterSpacing === t3.letterSpacing && e3.fontFamily === t3.fontFamily && e3.fontSize === t3.fontSize && e3.fontWeight === t3.fontWeight && e3.fontWeightBold === t3.fontWeightBold && e3.allowTransparency === t3.allowTransparency && e3.deviceCharWidth === t3.deviceCharWidth && e3.deviceCharHeight === t3.deviceCharHeight && e3.drawBoldTextInBrightColors === t3.drawBoldTextInBrightColors && e3.minimumContrastRatio === t3.minimumContrastRatio && e3.colors.foreground.rgba === t3.colors.foreground.rgba && e3.colors.background.rgba === t3.colors.background.rgba; + }, t2.is256Color = function(e3) { + return 16777216 == (50331648 & e3) || 33554432 == (50331648 & e3); + }; + }, 237: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TEXT_BASELINE = t2.DIM_OPACITY = t2.INVERTED_DEFAULT_COLOR = void 0; + const s2 = i2(399); + t2.INVERTED_DEFAULT_COLOR = 257, t2.DIM_OPACITY = 0.5, t2.TEXT_BASELINE = s2.isFirefox || s2.isLegacyEdge ? "bottom" : "ideographic"; + }, 457: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CursorBlinkStateManager = void 0; + t2.CursorBlinkStateManager = class { + constructor(e3, t3) { + this._renderCallback = e3, this._coreBrowserService = t3, this.isCursorVisible = true, this._coreBrowserService.isFocused && this._restartInterval(); + } + get isPaused() { + return !(this._blinkStartTimeout || this._blinkInterval); + } + dispose() { + this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout && (this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout), this._blinkStartTimeout = void 0), this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + restartBlinkAnimation() { + this.isPaused || (this._animationTimeRestarted = Date.now(), this.isCursorVisible = true, this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._renderCallback(), this._animationFrame = void 0; + }))); + } + _restartInterval(e3 = 600) { + this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => { + if (this._animationTimeRestarted) { + const e4 = 600 - (Date.now() - this._animationTimeRestarted); + if (this._animationTimeRestarted = void 0, e4 > 0) return void this._restartInterval(e4); + } + this.isCursorVisible = false, this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._renderCallback(), this._animationFrame = void 0; + }), this._blinkInterval = this._coreBrowserService.window.setInterval(() => { + if (this._animationTimeRestarted) { + const e4 = 600 - (Date.now() - this._animationTimeRestarted); + return this._animationTimeRestarted = void 0, void this._restartInterval(e4); + } + this.isCursorVisible = !this.isCursorVisible, this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => { + this._renderCallback(), this._animationFrame = void 0; + }); + }, 600); + }, e3); + } + pause() { + this.isCursorVisible = true, this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout && (this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout), this._blinkStartTimeout = void 0), this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + resume() { + this.pause(), this._animationTimeRestarted = void 0, this._restartInterval(), this.restartBlinkAnimation(); + } + }; + }, 860: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.tryDrawCustomChar = t2.powerlineDefinitions = t2.boxDrawingDefinitions = t2.blockElementDefinitions = void 0; + const s2 = i2(374); + t2.blockElementDefinitions = { "▀": [{ x: 0, y: 0, w: 8, h: 4 }], "▁": [{ x: 0, y: 7, w: 8, h: 1 }], "▂": [{ x: 0, y: 6, w: 8, h: 2 }], "▃": [{ x: 0, y: 5, w: 8, h: 3 }], "▄": [{ x: 0, y: 4, w: 8, h: 4 }], "▅": [{ x: 0, y: 3, w: 8, h: 5 }], "▆": [{ x: 0, y: 2, w: 8, h: 6 }], "▇": [{ x: 0, y: 1, w: 8, h: 7 }], "█": [{ x: 0, y: 0, w: 8, h: 8 }], "▉": [{ x: 0, y: 0, w: 7, h: 8 }], "▊": [{ x: 0, y: 0, w: 6, h: 8 }], "▋": [{ x: 0, y: 0, w: 5, h: 8 }], "▌": [{ x: 0, y: 0, w: 4, h: 8 }], "▍": [{ x: 0, y: 0, w: 3, h: 8 }], "▎": [{ x: 0, y: 0, w: 2, h: 8 }], "▏": [{ x: 0, y: 0, w: 1, h: 8 }], "▐": [{ x: 4, y: 0, w: 4, h: 8 }], "▔": [{ x: 0, y: 0, w: 8, h: 1 }], "▕": [{ x: 7, y: 0, w: 1, h: 8 }], "▖": [{ x: 0, y: 4, w: 4, h: 4 }], "▗": [{ x: 4, y: 4, w: 4, h: 4 }], "▘": [{ x: 0, y: 0, w: 4, h: 4 }], "▙": [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], "▚": [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], "▛": [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], "▜": [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], "▝": [{ x: 4, y: 0, w: 4, h: 4 }], "▞": [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], "▟": [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], "🭰": [{ x: 1, y: 0, w: 1, h: 8 }], "🭱": [{ x: 2, y: 0, w: 1, h: 8 }], "🭲": [{ x: 3, y: 0, w: 1, h: 8 }], "🭳": [{ x: 4, y: 0, w: 1, h: 8 }], "🭴": [{ x: 5, y: 0, w: 1, h: 8 }], "🭵": [{ x: 6, y: 0, w: 1, h: 8 }], "🭶": [{ x: 0, y: 1, w: 8, h: 1 }], "🭷": [{ x: 0, y: 2, w: 8, h: 1 }], "🭸": [{ x: 0, y: 3, w: 8, h: 1 }], "🭹": [{ x: 0, y: 4, w: 8, h: 1 }], "🭺": [{ x: 0, y: 5, w: 8, h: 1 }], "🭻": [{ x: 0, y: 6, w: 8, h: 1 }], "🭼": [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }], "🭽": [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }], "🭾": [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }], "🭿": [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }], "🮀": [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }], "🮁": [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }], "🮂": [{ x: 0, y: 0, w: 8, h: 2 }], "🮃": [{ x: 0, y: 0, w: 8, h: 3 }], "🮄": [{ x: 0, y: 0, w: 8, h: 5 }], "🮅": [{ x: 0, y: 0, w: 8, h: 6 }], "🮆": [{ x: 0, y: 0, w: 8, h: 7 }], "🮇": [{ x: 6, y: 0, w: 2, h: 8 }], "🮈": [{ x: 5, y: 0, w: 3, h: 8 }], "🮉": [{ x: 3, y: 0, w: 5, h: 8 }], "🮊": [{ x: 2, y: 0, w: 6, h: 8 }], "🮋": [{ x: 1, y: 0, w: 7, h: 8 }], "🮕": [{ x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 }, { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 }, { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 }, { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }], "🮖": [{ x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 }, { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 }, { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 }, { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }], "🮗": [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }] }; + const r = { "░": [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0]], "▒": [[1, 0], [0, 0], [0, 1], [0, 0]], "▓": [[0, 1], [1, 1], [1, 0], [1, 1]] }; + t2.boxDrawingDefinitions = { "─": { 1: "M0,.5 L1,.5" }, "━": { 3: "M0,.5 L1,.5" }, "│": { 1: "M.5,0 L.5,1" }, "┃": { 3: "M.5,0 L.5,1" }, "┌": { 1: "M0.5,1 L.5,.5 L1,.5" }, "┏": { 3: "M0.5,1 L.5,.5 L1,.5" }, "┐": { 1: "M0,.5 L.5,.5 L.5,1" }, "┓": { 3: "M0,.5 L.5,.5 L.5,1" }, "└": { 1: "M.5,0 L.5,.5 L1,.5" }, "┗": { 3: "M.5,0 L.5,.5 L1,.5" }, "┘": { 1: "M.5,0 L.5,.5 L0,.5" }, "┛": { 3: "M.5,0 L.5,.5 L0,.5" }, "├": { 1: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "┣": { 3: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "┤": { 1: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "┫": { 3: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "┬": { 1: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "┳": { 3: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "┴": { 1: "M0,.5 L1,.5 M.5,.5 L.5,0" }, "┻": { 3: "M0,.5 L1,.5 M.5,.5 L.5,0" }, "┼": { 1: "M0,.5 L1,.5 M.5,0 L.5,1" }, "╋": { 3: "M0,.5 L1,.5 M.5,0 L.5,1" }, "╴": { 1: "M.5,.5 L0,.5" }, "╸": { 3: "M.5,.5 L0,.5" }, "╵": { 1: "M.5,.5 L.5,0" }, "╹": { 3: "M.5,.5 L.5,0" }, "╶": { 1: "M.5,.5 L1,.5" }, "╺": { 3: "M.5,.5 L1,.5" }, "╷": { 1: "M.5,.5 L.5,1" }, "╻": { 3: "M.5,.5 L.5,1" }, "═": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "║": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "╒": { 1: (e3, t3) => `M.5,1 L.5,${0.5 - t3} L1,${0.5 - t3} M.5,${0.5 + t3} L1,${0.5 + t3}` }, "╓": { 1: (e3, t3) => `M${0.5 - e3},1 L${0.5 - e3},.5 L1,.5 M${0.5 + e3},.5 L${0.5 + e3},1` }, "╔": { 1: (e3, t3) => `M1,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1` }, "╕": { 1: (e3, t3) => `M0,${0.5 - t3} L.5,${0.5 - t3} L.5,1 M0,${0.5 + t3} L.5,${0.5 + t3}` }, "╖": { 1: (e3, t3) => `M${0.5 + e3},1 L${0.5 + e3},.5 L0,.5 M${0.5 - e3},.5 L${0.5 - e3},1` }, "╗": { 1: (e3, t3) => `M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M0,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},1` }, "╘": { 1: (e3, t3) => `M.5,0 L.5,${0.5 + t3} L1,${0.5 + t3} M.5,${0.5 - t3} L1,${0.5 - t3}` }, "╙": { 1: (e3, t3) => `M1,.5 L${0.5 - e3},.5 L${0.5 - e3},0 M${0.5 + e3},.5 L${0.5 + e3},0` }, "╚": { 1: (e3, t3) => `M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0 M1,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},0` }, "╛": { 1: (e3, t3) => `M0,${0.5 + t3} L.5,${0.5 + t3} L.5,0 M0,${0.5 - t3} L.5,${0.5 - t3}` }, "╜": { 1: (e3, t3) => `M0,.5 L${0.5 + e3},.5 L${0.5 + e3},0 M${0.5 - e3},.5 L${0.5 - e3},0` }, "╝": { 1: (e3, t3) => `M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M0,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},0` }, "╞": { 1: (e3, t3) => `M.5,0 L.5,1 M.5,${0.5 - t3} L1,${0.5 - t3} M.5,${0.5 + t3} L1,${0.5 + t3}` }, "╟": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1 M${0.5 + e3},.5 L1,.5` }, "╠": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "╡": { 1: (e3, t3) => `M.5,0 L.5,1 M0,${0.5 - t3} L.5,${0.5 - t3} M0,${0.5 + t3} L.5,${0.5 + t3}` }, "╢": { 1: (e3, t3) => `M0,.5 L${0.5 - e3},.5 M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "╣": { 1: (e3, t3) => `M${0.5 + e3},0 L${0.5 + e3},1 M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0` }, "╤": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3} M.5,${0.5 + t3} L.5,1` }, "╥": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},.5 L${0.5 - e3},1 M${0.5 + e3},.5 L${0.5 + e3},1` }, "╦": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1` }, "╧": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3} M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "╨": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},.5 L${0.5 - e3},0 M${0.5 + e3},.5 L${0.5 + e3},0` }, "╩": { 1: (e3, t3) => `M0,${0.5 + t3} L1,${0.5 + t3} M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "╪": { 1: (e3, t3) => `M.5,0 L.5,1 M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "╫": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "╬": { 1: (e3, t3) => `M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1 M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "╱": { 1: "M1,0 L0,1" }, "╲": { 1: "M0,0 L1,1" }, "╳": { 1: "M1,0 L0,1 M0,0 L1,1" }, "╼": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "╽": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L.5,1" }, "╾": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "╿": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "┍": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L1,.5" }, "┎": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "┑": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L0,.5" }, "┒": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L.5,1" }, "┕": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L1,.5" }, "┖": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "┙": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L0,.5" }, "┚": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L.5,0" }, "┝": { 1: "M.5,0 L.5,1", 3: "M.5,.5 L1,.5" }, "┞": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "┟": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "┠": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,1" }, "┡": { 1: "M.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L1,.5" }, "┢": { 1: "M.5,.5 L.5,0", 3: "M0.5,1 L.5,.5 L1,.5" }, "┥": { 1: "M.5,0 L.5,1", 3: "M.5,.5 L0,.5" }, "┦": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "┧": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M.5,.5 L.5,1" }, "┨": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,1" }, "┩": { 1: "M.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L0,.5" }, "┪": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L.5,.5 L.5,1" }, "┭": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "┮": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,.5 L1,.5" }, "┯": { 1: "M.5,.5 L.5,1", 3: "M0,.5 L1,.5" }, "┰": { 1: "M0,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "┱": { 1: "M.5,.5 L1,.5", 3: "M0,.5 L.5,.5 L.5,1" }, "┲": { 1: "M.5,.5 L0,.5", 3: "M0.5,1 L.5,.5 L1,.5" }, "┵": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "┶": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "┷": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L1,.5" }, "┸": { 1: "M0,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "┹": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,.5 L0,.5" }, "┺": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,.5 L1,.5" }, "┽": { 1: "M.5,0 L.5,1 M.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "┾": { 1: "M.5,0 L.5,1 M.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "┿": { 1: "M.5,0 L.5,1", 3: "M0,.5 L1,.5" }, "╀": { 1: "M0,.5 L1,.5 M.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "╁": { 1: "M.5,.5 L.5,0 M0,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "╂": { 1: "M0,.5 L1,.5", 3: "M.5,0 L.5,1" }, "╃": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,0 L.5,.5 L0,.5" }, "╄": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L1,.5" }, "╅": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M0,.5 L.5,.5 L.5,1" }, "╆": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M0.5,1 L.5,.5 L1,.5" }, "╇": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L.5,0 M0,.5 L1,.5" }, "╈": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "╉": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "╊": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "╌": { 1: "M.1,.5 L.4,.5 M.6,.5 L.9,.5" }, "╍": { 3: "M.1,.5 L.4,.5 M.6,.5 L.9,.5" }, "┄": { 1: "M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5" }, "┅": { 3: "M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5" }, "┈": { 1: "M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5" }, "┉": { 3: "M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5" }, "╎": { 1: "M.5,.1 L.5,.4 M.5,.6 L.5,.9" }, "╏": { 3: "M.5,.1 L.5,.4 M.5,.6 L.5,.9" }, "┆": { 1: "M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333" }, "┇": { 3: "M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333" }, "┊": { 1: "M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95" }, "┋": { 3: "M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95" }, "╭": { 1: (e3, t3) => `M.5,1 L.5,${0.5 + t3 / 0.15 * 0.5} C.5,${0.5 + t3 / 0.15 * 0.5},.5,.5,1,.5` }, "╮": { 1: (e3, t3) => `M.5,1 L.5,${0.5 + t3 / 0.15 * 0.5} C.5,${0.5 + t3 / 0.15 * 0.5},.5,.5,0,.5` }, "╯": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3 / 0.15 * 0.5} C.5,${0.5 - t3 / 0.15 * 0.5},.5,.5,0,.5` }, "╰": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3 / 0.15 * 0.5} C.5,${0.5 - t3 / 0.15 * 0.5},.5,.5,1,.5` } }, t2.powerlineDefinitions = { "": { d: "M0,0 L1,.5 L0,1", type: 0, rightPadding: 2 }, "": { d: "M-1,-.5 L1,.5 L-1,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M1,0 L0,.5 L1,1", type: 0, leftPadding: 2 }, "": { d: "M2,-.5 L0,.5 L2,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0", type: 0, rightPadding: 1 }, "": { d: "M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0", type: 1, rightPadding: 1 }, "": { d: "M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0", type: 0, leftPadding: 1 }, "": { d: "M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0", type: 1, leftPadding: 1 }, "": { d: "M-.5,-.5 L1.5,1.5 L-.5,1.5", type: 0 }, "": { d: "M-.5,-.5 L1.5,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M1.5,-.5 L-.5,1.5 L1.5,1.5", type: 0 }, "": { d: "M1.5,-.5 L-.5,1.5 L-.5,-.5", type: 0 }, "": { d: "M1.5,-.5 L-.5,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "": { d: "M-.5,-.5 L1.5,1.5 L1.5,-.5", type: 0 } }, t2.powerlineDefinitions[""] = t2.powerlineDefinitions[""], t2.powerlineDefinitions[""] = t2.powerlineDefinitions[""], t2.tryDrawCustomChar = function(e3, i3, n2, l, c, d, _, u) { + const g = t2.blockElementDefinitions[i3]; + if (g) return function(e4, t3, i4, s3, r2, o2) { + for (let n3 = 0; n3 < t3.length; n3++) { + const a2 = t3[n3], h2 = r2 / 8, l2 = o2 / 8; + e4.fillRect(i4 + a2.x * h2, s3 + a2.y * l2, a2.w * h2, a2.h * l2); + } + }(e3, g, n2, l, c, d), true; + const v = r[i3]; + if (v) return function(e4, t3, i4, r2, n3, a2) { + let h2 = o.get(t3); + h2 || (h2 = /* @__PURE__ */ new Map(), o.set(t3, h2)); + const l2 = e4.fillStyle; + if ("string" != typeof l2) throw new Error(`Unexpected fillStyle type "${l2}"`); + let c2 = h2.get(l2); + if (!c2) { + const i5 = t3[0].length, r3 = t3.length, o2 = e4.canvas.ownerDocument.createElement("canvas"); + o2.width = i5, o2.height = r3; + const n4 = (0, s2.throwIfFalsy)(o2.getContext("2d")), a3 = new ImageData(i5, r3); + let d2, _2, u2, g2; + if (l2.startsWith("#")) d2 = parseInt(l2.slice(1, 3), 16), _2 = parseInt(l2.slice(3, 5), 16), u2 = parseInt(l2.slice(5, 7), 16), g2 = l2.length > 7 && parseInt(l2.slice(7, 9), 16) || 1; + else { + if (!l2.startsWith("rgba")) throw new Error(`Unexpected fillStyle color format "${l2}" when drawing pattern glyph`); + [d2, _2, u2, g2] = l2.substring(5, l2.length - 1).split(",").map((e5) => parseFloat(e5)); + } + for (let e5 = 0; e5 < r3; e5++) for (let s3 = 0; s3 < i5; s3++) a3.data[4 * (e5 * i5 + s3)] = d2, a3.data[4 * (e5 * i5 + s3) + 1] = _2, a3.data[4 * (e5 * i5 + s3) + 2] = u2, a3.data[4 * (e5 * i5 + s3) + 3] = t3[e5][s3] * (255 * g2); + n4.putImageData(a3, 0, 0), c2 = (0, s2.throwIfFalsy)(e4.createPattern(o2, null)), h2.set(l2, c2); + } + e4.fillStyle = c2, e4.fillRect(i4, r2, n3, a2); + }(e3, v, n2, l, c, d), true; + const f = t2.boxDrawingDefinitions[i3]; + if (f) return function(e4, t3, i4, s3, r2, o2, n3) { + e4.strokeStyle = e4.fillStyle; + for (const [l2, c2] of Object.entries(t3)) { + let t4; + e4.beginPath(), e4.lineWidth = n3 * Number.parseInt(l2), t4 = "function" == typeof c2 ? c2(0.15, 0.15 / o2 * r2) : c2; + for (const l3 of t4.split(" ")) { + const t5 = l3[0], c3 = a[t5]; + if (!c3) { + console.error(`Could not find drawing instructions for "${t5}"`); + continue; + } + const d2 = l3.substring(1).split(","); + d2[0] && d2[1] && c3(e4, h(d2, r2, o2, i4, s3, true, n3)); + } + e4.stroke(), e4.closePath(); + } + }(e3, f, n2, l, c, d, u), true; + const p = t2.powerlineDefinitions[i3]; + return !!p && (function(e4, t3, i4, s3, r2, o2, n3, l2) { + const c2 = new Path2D(); + c2.rect(i4, s3, r2, o2), e4.clip(c2), e4.beginPath(); + const d2 = n3 / 12; + e4.lineWidth = l2 * d2; + for (const n4 of t3.d.split(" ")) { + const c3 = n4[0], _2 = a[c3]; + if (!_2) { + console.error(`Could not find drawing instructions for "${c3}"`); + continue; + } + const u2 = n4.substring(1).split(","); + u2[0] && u2[1] && _2(e4, h(u2, r2, o2, i4, s3, false, l2, (t3.leftPadding ?? 0) * (d2 / 2), (t3.rightPadding ?? 0) * (d2 / 2))); + } + 1 === t3.type ? (e4.strokeStyle = e4.fillStyle, e4.stroke()) : e4.fill(), e4.closePath(); + }(e3, p, n2, l, c, d, _, u), true); + }; + const o = /* @__PURE__ */ new Map(); + function n(e3, t3, i3 = 0) { + return Math.max(Math.min(e3, t3), i3); + } + const a = { C: (e3, t3) => e3.bezierCurveTo(t3[0], t3[1], t3[2], t3[3], t3[4], t3[5]), L: (e3, t3) => e3.lineTo(t3[0], t3[1]), M: (e3, t3) => e3.moveTo(t3[0], t3[1]) }; + function h(e3, t3, i3, s3, r2, o2, a2, h2 = 0, l = 0) { + const c = e3.map((e4) => parseFloat(e4) || parseInt(e4)); + if (c.length < 2) throw new Error("Too few arguments for instruction"); + for (let e4 = 0; e4 < c.length; e4 += 2) c[e4] *= t3 - h2 * a2 - l * a2, o2 && 0 !== c[e4] && (c[e4] = n(Math.round(c[e4] + 0.5) - 0.5, t3, 0)), c[e4] += s3 + h2 * a2; + for (let e4 = 1; e4 < c.length; e4 += 2) c[e4] *= i3, o2 && 0 !== c[e4] && (c[e4] = n(Math.round(c[e4] + 0.5) - 0.5, i3, 0)), c[e4] += r2; + return c; + } + }, 56: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.observeDevicePixelDimensions = void 0; + const s2 = i2(859); + t2.observeDevicePixelDimensions = function(e3, t3, i3) { + let r = new t3.ResizeObserver((t4) => { + const s3 = t4.find((t5) => t5.target === e3); + if (!s3) return; + if (!("devicePixelContentBoxSize" in s3)) return r == null ? void 0 : r.disconnect(), void (r = void 0); + const o = s3.devicePixelContentBoxSize[0].inlineSize, n = s3.devicePixelContentBoxSize[0].blockSize; + o > 0 && n > 0 && i3(o, n); + }); + try { + r.observe(e3, { box: ["device-pixel-content-box"] }); + } catch { + r.disconnect(), r = void 0; + } + return (0, s2.toDisposable)(() => r == null ? void 0 : r.disconnect()); + }; + }, 374: (e2, t2) => { + function i2(e3) { + return 57508 <= e3 && e3 <= 57558; + } + function s2(e3) { + return e3 >= 128512 && e3 <= 128591 || e3 >= 127744 && e3 <= 128511 || e3 >= 128640 && e3 <= 128767 || e3 >= 9728 && e3 <= 9983 || e3 >= 9984 && e3 <= 10175 || e3 >= 65024 && e3 <= 65039 || e3 >= 129280 && e3 <= 129535 || e3 >= 127462 && e3 <= 127487; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.computeNextVariantOffset = t2.createRenderDimensions = t2.treatGlyphAsBackgroundColor = t2.allowRescaling = t2.isEmoji = t2.isRestrictedPowerlineGlyph = t2.isPowerlineGlyph = t2.throwIfFalsy = void 0, t2.throwIfFalsy = function(e3) { + if (!e3) throw new Error("value must not be falsy"); + return e3; + }, t2.isPowerlineGlyph = i2, t2.isRestrictedPowerlineGlyph = function(e3) { + return 57520 <= e3 && e3 <= 57527; + }, t2.isEmoji = s2, t2.allowRescaling = function(e3, t3, r, o) { + return 1 === t3 && r > Math.ceil(1.5 * o) && void 0 !== e3 && e3 > 255 && !s2(e3) && !i2(e3) && !function(e4) { + return 57344 <= e4 && e4 <= 63743; + }(e3); + }, t2.treatGlyphAsBackgroundColor = function(e3) { + return i2(e3) || function(e4) { + return 9472 <= e4 && e4 <= 9631; + }(e3); + }, t2.createRenderDimensions = function() { + return { css: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 } }, device: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 }, char: { width: 0, height: 0, left: 0, top: 0 } } }; + }, t2.computeNextVariantOffset = function(e3, t3, i3 = 0) { + return (e3 - (2 * Math.round(t3) - i3)) % (2 * Math.round(t3)); + }; + }, 296: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createSelectionRenderModel = void 0; + class i2 { + constructor() { + this.clear(); + } + clear() { + this.hasSelection = false, this.columnSelectMode = false, this.viewportStartRow = 0, this.viewportEndRow = 0, this.viewportCappedStartRow = 0, this.viewportCappedEndRow = 0, this.startCol = 0, this.endCol = 0, this.selectionStart = void 0, this.selectionEnd = void 0; + } + update(e3, t3, i3, s2 = false) { + if (this.selectionStart = t3, this.selectionEnd = i3, !t3 || !i3 || t3[0] === i3[0] && t3[1] === i3[1]) return void this.clear(); + const r = e3.buffers.active.ydisp, o = t3[1] - r, n = i3[1] - r, a = Math.max(o, 0), h = Math.min(n, e3.rows - 1); + a >= e3.rows || h < 0 ? this.clear() : (this.hasSelection = true, this.columnSelectMode = s2, this.viewportStartRow = o, this.viewportEndRow = n, this.viewportCappedStartRow = a, this.viewportCappedEndRow = h, this.startCol = t3[0], this.endCol = i3[0]); + } + isCellSelected(e3, t3, i3) { + return !!this.hasSelection && (i3 -= e3.buffer.active.viewportY, this.columnSelectMode ? this.startCol <= this.endCol ? t3 >= this.startCol && i3 >= this.viewportCappedStartRow && t3 < this.endCol && i3 <= this.viewportCappedEndRow : t3 < this.startCol && i3 >= this.viewportCappedStartRow && t3 >= this.endCol && i3 <= this.viewportCappedEndRow : i3 > this.viewportStartRow && i3 < this.viewportEndRow || this.viewportStartRow === this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportEndRow && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol); + } + } + t2.createSelectionRenderModel = function() { + return new i2(); + }; + }, 509: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TextureAtlas = void 0; + const s2 = i2(237), r = i2(860), o = i2(374), n = i2(160), a = i2(345), h = i2(485), l = i2(385), c = i2(147), d = i2(855), _ = { texturePage: 0, texturePosition: { x: 0, y: 0 }, texturePositionClipSpace: { x: 0, y: 0 }, offset: { x: 0, y: 0 }, size: { x: 0, y: 0 }, sizeClipSpace: { x: 0, y: 0 } }; + let u; + class g { + get pages() { + return this._pages; + } + constructor(e3, t3, i3) { + this._document = e3, this._config = t3, this._unicodeService = i3, this._didWarmUp = false, this._cacheMap = new h.FourKeyMap(), this._cacheMapCombined = new h.FourKeyMap(), this._pages = [], this._activePages = [], this._workBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 }, this._workAttributeData = new c.AttributeData(), this._textureSize = 512, this._onAddTextureAtlasCanvas = new a.EventEmitter(), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = new a.EventEmitter(), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._requestClearModel = false, this._createNewPage(), this._tmpCanvas = p(e3, 4 * this._config.deviceCellWidth + 4, this._config.deviceCellHeight + 4), this._tmpCtx = (0, o.throwIfFalsy)(this._tmpCanvas.getContext("2d", { alpha: this._config.allowTransparency, willReadFrequently: true })); + } + dispose() { + for (const e3 of this.pages) e3.canvas.remove(); + this._onAddTextureAtlasCanvas.dispose(); + } + warmUp() { + this._didWarmUp || (this._doWarmUp(), this._didWarmUp = true); + } + _doWarmUp() { + const e3 = new l.IdleTaskQueue(); + for (let t3 = 33; t3 < 126; t3++) e3.enqueue(() => { + if (!this._cacheMap.get(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT)) { + const e4 = this._drawToCache(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT); + this._cacheMap.set(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT, e4); + } + }); + } + beginFrame() { + return this._requestClearModel; + } + clearTexture() { + if (0 !== this._pages[0].currentRow.x || 0 !== this._pages[0].currentRow.y) { + for (const e3 of this._pages) e3.clear(); + this._cacheMap.clear(), this._cacheMapCombined.clear(), this._didWarmUp = false; + } + } + _createNewPage() { + if (g.maxAtlasPages && this._pages.length >= Math.max(4, g.maxAtlasPages)) { + const e4 = this._pages.filter((e5) => 2 * e5.canvas.width <= (g.maxTextureSize || 4096)).sort((e5, t4) => t4.canvas.width !== e5.canvas.width ? t4.canvas.width - e5.canvas.width : t4.percentageUsed - e5.percentageUsed); + let t3 = -1, i3 = 0; + for (let s4 = 0; s4 < e4.length; s4++) if (e4[s4].canvas.width !== i3) t3 = s4, i3 = e4[s4].canvas.width; + else if (s4 - t3 == 3) break; + const s3 = e4.slice(t3, t3 + 4), r2 = s3.map((e5) => e5.glyphs[0].texturePage).sort((e5, t4) => e5 > t4 ? 1 : -1), o2 = this.pages.length - s3.length, n2 = this._mergePages(s3, o2); + n2.version++; + for (let e5 = r2.length - 1; e5 >= 0; e5--) this._deletePage(r2[e5]); + this.pages.push(n2), this._requestClearModel = true, this._onAddTextureAtlasCanvas.fire(n2.canvas); + } + const e3 = new v(this._document, this._textureSize); + return this._pages.push(e3), this._activePages.push(e3), this._onAddTextureAtlasCanvas.fire(e3.canvas), e3; + } + _mergePages(e3, t3) { + const i3 = 2 * e3[0].canvas.width, s3 = new v(this._document, i3, e3); + for (const [r2, o2] of e3.entries()) { + const e4 = r2 * o2.canvas.width % i3, n2 = Math.floor(r2 / 2) * o2.canvas.height; + s3.ctx.drawImage(o2.canvas, e4, n2); + for (const s4 of o2.glyphs) s4.texturePage = t3, s4.sizeClipSpace.x = s4.size.x / i3, s4.sizeClipSpace.y = s4.size.y / i3, s4.texturePosition.x += e4, s4.texturePosition.y += n2, s4.texturePositionClipSpace.x = s4.texturePosition.x / i3, s4.texturePositionClipSpace.y = s4.texturePosition.y / i3; + this._onRemoveTextureAtlasCanvas.fire(o2.canvas); + const a2 = this._activePages.indexOf(o2); + -1 !== a2 && this._activePages.splice(a2, 1); + } + return s3; + } + _deletePage(e3) { + this._pages.splice(e3, 1); + for (let t3 = e3; t3 < this._pages.length; t3++) { + const e4 = this._pages[t3]; + for (const t4 of e4.glyphs) t4.texturePage--; + e4.version++; + } + } + getRasterizedGlyphCombinedChar(e3, t3, i3, s3, r2) { + return this._getFromCacheMap(this._cacheMapCombined, e3, t3, i3, s3, r2); + } + getRasterizedGlyph(e3, t3, i3, s3, r2) { + return this._getFromCacheMap(this._cacheMap, e3, t3, i3, s3, r2); + } + _getFromCacheMap(e3, t3, i3, s3, r2, o2 = false) { + return u = e3.get(t3, i3, s3, r2), u || (u = this._drawToCache(t3, i3, s3, r2, o2), e3.set(t3, i3, s3, r2, u)), u; + } + _getColorFromAnsiIndex(e3) { + if (e3 >= this._config.colors.ansi.length) throw new Error("No color found for idx " + e3); + return this._config.colors.ansi[e3]; + } + _getBackgroundColor(e3, t3, i3, s3) { + if (this._config.allowTransparency) return n.NULL_COLOR; + let r2; + switch (e3) { + case 16777216: + case 33554432: + r2 = this._getColorFromAnsiIndex(t3); + break; + case 50331648: + const e4 = c.AttributeData.toColorRGB(t3); + r2 = n.channels.toColor(e4[0], e4[1], e4[2]); + break; + default: + r2 = i3 ? n.color.opaque(this._config.colors.foreground) : this._config.colors.background; + } + return r2; + } + _getForegroundColor(e3, t3, i3, r2, o2, a2, h2, l2, d2, _2) { + const u2 = this._getMinimumContrastColor(e3, t3, i3, r2, o2, a2, h2, d2, l2, _2); + if (u2) return u2; + let g2; + switch (o2) { + case 16777216: + case 33554432: + this._config.drawBoldTextInBrightColors && d2 && a2 < 8 && (a2 += 8), g2 = this._getColorFromAnsiIndex(a2); + break; + case 50331648: + const e4 = c.AttributeData.toColorRGB(a2); + g2 = n.channels.toColor(e4[0], e4[1], e4[2]); + break; + default: + g2 = h2 ? this._config.colors.background : this._config.colors.foreground; + } + return this._config.allowTransparency && (g2 = n.color.opaque(g2)), l2 && (g2 = n.color.multiplyOpacity(g2, s2.DIM_OPACITY)), g2; + } + _resolveBackgroundRgba(e3, t3, i3) { + switch (e3) { + case 16777216: + case 33554432: + return this._getColorFromAnsiIndex(t3).rgba; + case 50331648: + return t3 << 8; + default: + return i3 ? this._config.colors.foreground.rgba : this._config.colors.background.rgba; + } + } + _resolveForegroundRgba(e3, t3, i3, s3) { + switch (e3) { + case 16777216: + case 33554432: + return this._config.drawBoldTextInBrightColors && s3 && t3 < 8 && (t3 += 8), this._getColorFromAnsiIndex(t3).rgba; + case 50331648: + return t3 << 8; + default: + return i3 ? this._config.colors.background.rgba : this._config.colors.foreground.rgba; + } + } + _getMinimumContrastColor(e3, t3, i3, s3, r2, o2, a2, h2, l2, c2) { + if (1 === this._config.minimumContrastRatio || c2) return; + const d2 = this._getContrastCache(l2), _2 = d2.getColor(e3, s3); + if (void 0 !== _2) return _2 || void 0; + const u2 = this._resolveBackgroundRgba(t3, i3, a2), g2 = this._resolveForegroundRgba(r2, o2, a2, h2), v2 = n.rgba.ensureContrastRatio(u2, g2, this._config.minimumContrastRatio / (l2 ? 2 : 1)); + if (!v2) return void d2.setColor(e3, s3, null); + const f2 = n.channels.toColor(v2 >> 24 & 255, v2 >> 16 & 255, v2 >> 8 & 255); + return d2.setColor(e3, s3, f2), f2; + } + _getContrastCache(e3) { + return e3 ? this._config.colors.halfContrastCache : this._config.colors.contrastCache; + } + _drawToCache(e3, t3, i3, n2, a2 = false) { + const h2 = "number" == typeof e3 ? String.fromCharCode(e3) : e3, l2 = Math.min(this._config.deviceCellWidth * Math.max(h2.length, 2) + 4, this._textureSize); + this._tmpCanvas.width < l2 && (this._tmpCanvas.width = l2); + const d2 = Math.min(this._config.deviceCellHeight + 8, this._textureSize); + if (this._tmpCanvas.height < d2 && (this._tmpCanvas.height = d2), this._tmpCtx.save(), this._workAttributeData.fg = i3, this._workAttributeData.bg = t3, this._workAttributeData.extended.ext = n2, this._workAttributeData.isInvisible()) return _; + const u2 = !!this._workAttributeData.isBold(), v2 = !!this._workAttributeData.isInverse(), p2 = !!this._workAttributeData.isDim(), C = !!this._workAttributeData.isItalic(), m = !!this._workAttributeData.isUnderline(), L = !!this._workAttributeData.isStrikethrough(), x = !!this._workAttributeData.isOverline(); + let w = this._workAttributeData.getFgColor(), b = this._workAttributeData.getFgColorMode(), M = this._workAttributeData.getBgColor(), R = this._workAttributeData.getBgColorMode(); + if (v2) { + const e4 = w; + w = M, M = e4; + const t4 = b; + b = R, R = t4; + } + const y = this._getBackgroundColor(R, M, v2, p2); + this._tmpCtx.globalCompositeOperation = "copy", this._tmpCtx.fillStyle = y.css, this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height), this._tmpCtx.globalCompositeOperation = "source-over"; + const A = u2 ? this._config.fontWeightBold : this._config.fontWeight, E = C ? "italic" : ""; + this._tmpCtx.font = `${E} ${A} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`, this._tmpCtx.textBaseline = s2.TEXT_BASELINE; + const S = 1 === h2.length && (0, o.isPowerlineGlyph)(h2.charCodeAt(0)), T = 1 === h2.length && (0, o.isRestrictedPowerlineGlyph)(h2.charCodeAt(0)), D = this._getForegroundColor(t3, R, M, i3, b, w, v2, p2, u2, (0, o.treatGlyphAsBackgroundColor)(h2.charCodeAt(0))); + this._tmpCtx.fillStyle = D.css; + const B = T ? 0 : 4; + let F = false; + false !== this._config.customGlyphs && (F = (0, r.tryDrawCustomChar)(this._tmpCtx, h2, B, B, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio)); + let P, I = !S; + if (P = "number" == typeof e3 ? this._unicodeService.wcwidth(e3) : this._unicodeService.getStringCellWidth(e3), m) { + this._tmpCtx.save(); + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15)), t4 = e4 % 2 == 1 ? 0.5 : 0; + if (this._tmpCtx.lineWidth = e4, this._workAttributeData.isUnderlineColorDefault()) this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle; + else if (this._workAttributeData.isUnderlineColorRGB()) I = false, this._tmpCtx.strokeStyle = `rgb(${c.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`; + else { + I = false; + let e5 = this._workAttributeData.getUnderlineColor(); + this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && e5 < 8 && (e5 += 8), this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(e5).css; + } + this._tmpCtx.beginPath(); + const i4 = B, s3 = Math.ceil(B + this._config.deviceCharHeight) - t4 - (a2 ? 2 * e4 : 0), r2 = s3 + e4, n3 = s3 + 2 * e4; + let l3 = this._workAttributeData.getUnderlineVariantOffset(); + for (let a3 = 0; a3 < P; a3++) { + this._tmpCtx.save(); + const h3 = i4 + a3 * this._config.deviceCellWidth, c2 = i4 + (a3 + 1) * this._config.deviceCellWidth, d3 = h3 + this._config.deviceCellWidth / 2; + switch (this._workAttributeData.extended.underlineStyle) { + case 2: + this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3), this._tmpCtx.moveTo(h3, n3), this._tmpCtx.lineTo(c2, n3); + break; + case 3: + const i5 = e4 <= 1 ? n3 : Math.ceil(B + this._config.deviceCharHeight - e4 / 2) - t4, a4 = e4 <= 1 ? s3 : Math.ceil(B + this._config.deviceCharHeight + e4 / 2) - t4, _2 = new Path2D(); + _2.rect(h3, s3, this._config.deviceCellWidth, n3 - s3), this._tmpCtx.clip(_2), this._tmpCtx.moveTo(h3 - this._config.deviceCellWidth / 2, r2), this._tmpCtx.bezierCurveTo(h3 - this._config.deviceCellWidth / 2, a4, h3, a4, h3, r2), this._tmpCtx.bezierCurveTo(h3, i5, d3, i5, d3, r2), this._tmpCtx.bezierCurveTo(d3, a4, c2, a4, c2, r2), this._tmpCtx.bezierCurveTo(c2, i5, c2 + this._config.deviceCellWidth / 2, i5, c2 + this._config.deviceCellWidth / 2, r2); + break; + case 4: + const u3 = 0 === l3 ? 0 : l3 >= e4 ? 2 * e4 - l3 : e4 - l3; + false == !(l3 >= e4) || 0 === u3 ? (this._tmpCtx.setLineDash([Math.round(e4), Math.round(e4)]), this._tmpCtx.moveTo(h3 + u3, s3), this._tmpCtx.lineTo(c2, s3)) : (this._tmpCtx.setLineDash([Math.round(e4), Math.round(e4)]), this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(h3 + u3, s3), this._tmpCtx.moveTo(h3 + u3 + e4, s3), this._tmpCtx.lineTo(c2, s3)), l3 = (0, o.computeNextVariantOffset)(c2 - h3, e4, l3); + break; + case 5: + const g2 = 0.6, v3 = 0.3, f2 = c2 - h3, p3 = Math.floor(g2 * f2), C2 = Math.floor(v3 * f2), m2 = f2 - p3 - C2; + this._tmpCtx.setLineDash([p3, C2, m2]), this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3); + break; + default: + this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3); + } + this._tmpCtx.stroke(), this._tmpCtx.restore(); + } + if (this._tmpCtx.restore(), !F && this._config.fontSize >= 12 && !this._config.allowTransparency && " " !== h2) { + this._tmpCtx.save(), this._tmpCtx.textBaseline = "alphabetic"; + const t5 = this._tmpCtx.measureText(h2); + if (this._tmpCtx.restore(), "actualBoundingBoxDescent" in t5 && t5.actualBoundingBoxDescent > 0) { + this._tmpCtx.save(); + const t6 = new Path2D(); + t6.rect(i4, s3 - Math.ceil(e4 / 2), this._config.deviceCellWidth * P, n3 - s3 + Math.ceil(e4 / 2)), this._tmpCtx.clip(t6), this._tmpCtx.lineWidth = 3 * this._config.devicePixelRatio, this._tmpCtx.strokeStyle = y.css, this._tmpCtx.strokeText(h2, B, B + this._config.deviceCharHeight), this._tmpCtx.restore(); + } + } + } + if (x) { + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15)), t4 = e4 % 2 == 1 ? 0.5 : 0; + this._tmpCtx.lineWidth = e4, this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle, this._tmpCtx.beginPath(), this._tmpCtx.moveTo(B, B + t4), this._tmpCtx.lineTo(B + this._config.deviceCharWidth * P, B + t4), this._tmpCtx.stroke(); + } + if (F || this._tmpCtx.fillText(h2, B, B + this._config.deviceCharHeight), "_" === h2 && !this._config.allowTransparency) { + let e4 = f(this._tmpCtx.getImageData(B, B, this._config.deviceCellWidth, this._config.deviceCellHeight), y, D, I); + if (e4) for (let t4 = 1; t4 <= 5 && (this._tmpCtx.save(), this._tmpCtx.fillStyle = y.css, this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height), this._tmpCtx.restore(), this._tmpCtx.fillText(h2, B, B + this._config.deviceCharHeight - t4), e4 = f(this._tmpCtx.getImageData(B, B, this._config.deviceCellWidth, this._config.deviceCellHeight), y, D, I), e4); t4++) ; + } + if (L) { + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10)), t4 = this._tmpCtx.lineWidth % 2 == 1 ? 0.5 : 0; + this._tmpCtx.lineWidth = e4, this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle, this._tmpCtx.beginPath(), this._tmpCtx.moveTo(B, B + Math.floor(this._config.deviceCharHeight / 2) - t4), this._tmpCtx.lineTo(B + this._config.deviceCharWidth * P, B + Math.floor(this._config.deviceCharHeight / 2) - t4), this._tmpCtx.stroke(); + } + this._tmpCtx.restore(); + const O = this._tmpCtx.getImageData(0, 0, this._tmpCanvas.width, this._tmpCanvas.height); + let k; + if (k = this._config.allowTransparency ? function(e4) { + for (let t4 = 0; t4 < e4.data.length; t4 += 4) if (e4.data[t4 + 3] > 0) return false; + return true; + }(O) : f(O, y, D, I), k) return _; + const $ = this._findGlyphBoundingBox(O, this._workBoundingBox, l2, T, F, B); + let U, N; + for (; ; ) { + if (0 === this._activePages.length) { + const e4 = this._createNewPage(); + U = e4, N = e4.currentRow, N.height = $.size.y; + break; + } + U = this._activePages[this._activePages.length - 1], N = U.currentRow; + for (const e4 of this._activePages) $.size.y <= e4.currentRow.height && (U = e4, N = e4.currentRow); + for (let e4 = this._activePages.length - 1; e4 >= 0; e4--) for (const t4 of this._activePages[e4].fixedRows) t4.height <= N.height && $.size.y <= t4.height && (U = this._activePages[e4], N = t4); + if (N.y + $.size.y >= U.canvas.height || N.height > $.size.y + 2) { + let e4 = false; + if (U.currentRow.y + U.currentRow.height + $.size.y >= U.canvas.height) { + let t4; + for (const e5 of this._activePages) if (e5.currentRow.y + e5.currentRow.height + $.size.y < e5.canvas.height) { + t4 = e5; + break; + } + if (t4) U = t4; + else if (g.maxAtlasPages && this._pages.length >= g.maxAtlasPages && N.y + $.size.y <= U.canvas.height && N.height >= $.size.y && N.x + $.size.x <= U.canvas.width) e4 = true; + else { + const t5 = this._createNewPage(); + U = t5, N = t5.currentRow, N.height = $.size.y, e4 = true; + } + } + e4 || (U.currentRow.height > 0 && U.fixedRows.push(U.currentRow), N = { x: 0, y: U.currentRow.y + U.currentRow.height, height: $.size.y }, U.fixedRows.push(N), U.currentRow = { x: 0, y: N.y + N.height, height: 0 }); + } + if (N.x + $.size.x <= U.canvas.width) break; + N === U.currentRow ? (N.x = 0, N.y += N.height, N.height = 0) : U.fixedRows.splice(U.fixedRows.indexOf(N), 1); + } + return $.texturePage = this._pages.indexOf(U), $.texturePosition.x = N.x, $.texturePosition.y = N.y, $.texturePositionClipSpace.x = N.x / U.canvas.width, $.texturePositionClipSpace.y = N.y / U.canvas.height, $.sizeClipSpace.x /= U.canvas.width, $.sizeClipSpace.y /= U.canvas.height, N.height = Math.max(N.height, $.size.y), N.x += $.size.x, U.ctx.putImageData(O, $.texturePosition.x - this._workBoundingBox.left, $.texturePosition.y - this._workBoundingBox.top, this._workBoundingBox.left, this._workBoundingBox.top, $.size.x, $.size.y), U.addGlyph($), U.version++, $; + } + _findGlyphBoundingBox(e3, t3, i3, s3, r2, o2) { + t3.top = 0; + const n2 = s3 ? this._config.deviceCellHeight : this._tmpCanvas.height, a2 = s3 ? this._config.deviceCellWidth : i3; + let h2 = false; + for (let i4 = 0; i4 < n2; i4++) { + for (let s4 = 0; s4 < a2; s4++) { + const r3 = i4 * this._tmpCanvas.width * 4 + 4 * s4 + 3; + if (0 !== e3.data[r3]) { + t3.top = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.left = 0, h2 = false; + for (let i4 = 0; i4 < o2 + a2; i4++) { + for (let s4 = 0; s4 < n2; s4++) { + const r3 = s4 * this._tmpCanvas.width * 4 + 4 * i4 + 3; + if (0 !== e3.data[r3]) { + t3.left = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.right = a2, h2 = false; + for (let i4 = o2 + a2 - 1; i4 >= o2; i4--) { + for (let s4 = 0; s4 < n2; s4++) { + const r3 = s4 * this._tmpCanvas.width * 4 + 4 * i4 + 3; + if (0 !== e3.data[r3]) { + t3.right = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.bottom = n2, h2 = false; + for (let i4 = n2 - 1; i4 >= 0; i4--) { + for (let s4 = 0; s4 < a2; s4++) { + const r3 = i4 * this._tmpCanvas.width * 4 + 4 * s4 + 3; + if (0 !== e3.data[r3]) { + t3.bottom = i4, h2 = true; + break; + } + } + if (h2) break; + } + return { texturePage: 0, texturePosition: { x: 0, y: 0 }, texturePositionClipSpace: { x: 0, y: 0 }, size: { x: t3.right - t3.left + 1, y: t3.bottom - t3.top + 1 }, sizeClipSpace: { x: t3.right - t3.left + 1, y: t3.bottom - t3.top + 1 }, offset: { x: -t3.left + o2 + (s3 || r2 ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0), y: -t3.top + o2 + (s3 || r2 ? 1 === this._config.lineHeight ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0) } }; + } + } + t2.TextureAtlas = g; + class v { + get percentageUsed() { + return this._usedPixels / (this.canvas.width * this.canvas.height); + } + get glyphs() { + return this._glyphs; + } + addGlyph(e3) { + this._glyphs.push(e3), this._usedPixels += e3.size.x * e3.size.y; + } + constructor(e3, t3, i3) { + if (this._usedPixels = 0, this._glyphs = [], this.version = 0, this.currentRow = { x: 0, y: 0, height: 0 }, this.fixedRows = [], i3) for (const e4 of i3) this._glyphs.push(...e4.glyphs), this._usedPixels += e4._usedPixels; + this.canvas = p(e3, t3, t3), this.ctx = (0, o.throwIfFalsy)(this.canvas.getContext("2d", { alpha: true })); + } + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height), this.currentRow.x = 0, this.currentRow.y = 0, this.currentRow.height = 0, this.fixedRows.length = 0, this.version++; + } + } + function f(e3, t3, i3, s3) { + const r2 = t3.rgba >>> 24, o2 = t3.rgba >>> 16 & 255, n2 = t3.rgba >>> 8 & 255, a2 = i3.rgba >>> 24, h2 = i3.rgba >>> 16 & 255, l2 = i3.rgba >>> 8 & 255, c2 = Math.floor((Math.abs(r2 - a2) + Math.abs(o2 - h2) + Math.abs(n2 - l2)) / 12); + let d2 = true; + for (let t4 = 0; t4 < e3.data.length; t4 += 4) e3.data[t4] === r2 && e3.data[t4 + 1] === o2 && e3.data[t4 + 2] === n2 || s3 && Math.abs(e3.data[t4] - r2) + Math.abs(e3.data[t4 + 1] - o2) + Math.abs(e3.data[t4 + 2] - n2) < c2 ? e3.data[t4 + 3] = 0 : d2 = false; + return d2; + } + function p(e3, t3, i3) { + const s3 = e3.createElement("canvas"); + return s3.width = t3, s3.height = i3, s3; + } + }, 160: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.contrastRatio = t2.toPaddedHex = t2.rgba = t2.rgb = t2.css = t2.color = t2.channels = t2.NULL_COLOR = void 0; + let i2 = 0, s2 = 0, r = 0, o = 0; + var n, a, h, l, c; + function d(e3) { + const t3 = e3.toString(16); + return t3.length < 2 ? "0" + t3 : t3; + } + function _(e3, t3) { + return e3 < t3 ? (t3 + 0.05) / (e3 + 0.05) : (e3 + 0.05) / (t3 + 0.05); + } + t2.NULL_COLOR = { css: "#00000000", rgba: 0 }, function(e3) { + e3.toCss = function(e4, t3, i3, s3) { + return void 0 !== s3 ? `#${d(e4)}${d(t3)}${d(i3)}${d(s3)}` : `#${d(e4)}${d(t3)}${d(i3)}`; + }, e3.toRgba = function(e4, t3, i3, s3 = 255) { + return (e4 << 24 | t3 << 16 | i3 << 8 | s3) >>> 0; + }, e3.toColor = function(t3, i3, s3, r2) { + return { css: e3.toCss(t3, i3, s3, r2), rgba: e3.toRgba(t3, i3, s3, r2) }; + }; + }(n || (t2.channels = n = {})), function(e3) { + function t3(e4, t4) { + return o = Math.round(255 * t4), [i2, s2, r] = c.toChannels(e4.rgba), { css: n.toCss(i2, s2, r, o), rgba: n.toRgba(i2, s2, r, o) }; + } + e3.blend = function(e4, t4) { + if (o = (255 & t4.rgba) / 255, 1 === o) return { css: t4.css, rgba: t4.rgba }; + const a2 = t4.rgba >> 24 & 255, h2 = t4.rgba >> 16 & 255, l2 = t4.rgba >> 8 & 255, c2 = e4.rgba >> 24 & 255, d2 = e4.rgba >> 16 & 255, _2 = e4.rgba >> 8 & 255; + return i2 = c2 + Math.round((a2 - c2) * o), s2 = d2 + Math.round((h2 - d2) * o), r = _2 + Math.round((l2 - _2) * o), { css: n.toCss(i2, s2, r), rgba: n.toRgba(i2, s2, r) }; + }, e3.isOpaque = function(e4) { + return 255 == (255 & e4.rgba); + }, e3.ensureContrastRatio = function(e4, t4, i3) { + const s3 = c.ensureContrastRatio(e4.rgba, t4.rgba, i3); + if (s3) return n.toColor(s3 >> 24 & 255, s3 >> 16 & 255, s3 >> 8 & 255); + }, e3.opaque = function(e4) { + const t4 = (255 | e4.rgba) >>> 0; + return [i2, s2, r] = c.toChannels(t4), { css: n.toCss(i2, s2, r), rgba: t4 }; + }, e3.opacity = t3, e3.multiplyOpacity = function(e4, i3) { + return o = 255 & e4.rgba, t3(e4, o * i3 / 255); + }, e3.toColorRGB = function(e4) { + return [e4.rgba >> 24 & 255, e4.rgba >> 16 & 255, e4.rgba >> 8 & 255]; + }; + }(a || (t2.color = a = {})), function(e3) { + let t3, a2; + try { + const e4 = document.createElement("canvas"); + e4.width = 1, e4.height = 1; + const i3 = e4.getContext("2d", { willReadFrequently: true }); + i3 && (t3 = i3, t3.globalCompositeOperation = "copy", a2 = t3.createLinearGradient(0, 0, 1, 1)); + } catch { + } + e3.toColor = function(e4) { + if (e4.match(/#[\da-f]{3,8}/i)) switch (e4.length) { + case 4: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), n.toColor(i2, s2, r); + case 5: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), o = parseInt(e4.slice(4, 5).repeat(2), 16), n.toColor(i2, s2, r, o); + case 7: + return { css: e4, rgba: (parseInt(e4.slice(1), 16) << 8 | 255) >>> 0 }; + case 9: + return { css: e4, rgba: parseInt(e4.slice(1), 16) >>> 0 }; + } + const h2 = e4.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/); + if (h2) return i2 = parseInt(h2[1]), s2 = parseInt(h2[2]), r = parseInt(h2[3]), o = Math.round(255 * (void 0 === h2[5] ? 1 : parseFloat(h2[5]))), n.toColor(i2, s2, r, o); + if (!t3 || !a2) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillStyle = a2, t3.fillStyle = e4, "string" != typeof t3.fillStyle) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillRect(0, 0, 1, 1), [i2, s2, r, o] = t3.getImageData(0, 0, 1, 1).data, 255 !== o) throw new Error("css.toColor: Unsupported css format"); + return { rgba: n.toRgba(i2, s2, r, o), css: e4 }; + }; + }(h || (t2.css = h = {})), function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 / 255, r2 = t4 / 255, o2 = i3 / 255; + return 0.2126 * (s3 <= 0.03928 ? s3 / 12.92 : Math.pow((s3 + 0.055) / 1.055, 2.4)) + 0.7152 * (r2 <= 0.03928 ? r2 / 12.92 : Math.pow((r2 + 0.055) / 1.055, 2.4)) + 0.0722 * (o2 <= 0.03928 ? o2 / 12.92 : Math.pow((o2 + 0.055) / 1.055, 2.4)); + } + e3.relativeLuminance = function(e4) { + return t3(e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4); + }, e3.relativeLuminance2 = t3; + }(l || (t2.rgb = l = {})), function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, o2 = e4 >> 8 & 255; + let n2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + for (; c2 < i3 && (n2 > 0 || a3 > 0 || h2 > 0); ) n2 -= Math.max(0, Math.ceil(0.1 * n2)), a3 -= Math.max(0, Math.ceil(0.1 * a3)), h2 -= Math.max(0, Math.ceil(0.1 * h2)), c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + return (n2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + function a2(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, o2 = e4 >> 8 & 255; + let n2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + for (; c2 < i3 && (n2 < 255 || a3 < 255 || h2 < 255); ) n2 = Math.min(255, n2 + Math.ceil(0.1 * (255 - n2))), a3 = Math.min(255, a3 + Math.ceil(0.1 * (255 - a3))), h2 = Math.min(255, h2 + Math.ceil(0.1 * (255 - h2))), c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + return (n2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + e3.blend = function(e4, t4) { + if (o = (255 & t4) / 255, 1 === o) return t4; + const a3 = t4 >> 24 & 255, h2 = t4 >> 16 & 255, l2 = t4 >> 8 & 255, c2 = e4 >> 24 & 255, d2 = e4 >> 16 & 255, _2 = e4 >> 8 & 255; + return i2 = c2 + Math.round((a3 - c2) * o), s2 = d2 + Math.round((h2 - d2) * o), r = _2 + Math.round((l2 - _2) * o), n.toRgba(i2, s2, r); + }, e3.ensureContrastRatio = function(e4, i3, s3) { + const r2 = l.relativeLuminance(e4 >> 8), o2 = l.relativeLuminance(i3 >> 8); + if (_(r2, o2) < s3) { + if (o2 < r2) { + const o3 = t3(e4, i3, s3), n3 = _(r2, l.relativeLuminance(o3 >> 8)); + if (n3 < s3) { + const t4 = a2(e4, i3, s3); + return n3 > _(r2, l.relativeLuminance(t4 >> 8)) ? o3 : t4; + } + return o3; + } + const n2 = a2(e4, i3, s3), h2 = _(r2, l.relativeLuminance(n2 >> 8)); + if (h2 < s3) { + const o3 = t3(e4, i3, s3); + return h2 > _(r2, l.relativeLuminance(o3 >> 8)) ? n2 : o3; + } + return n2; + } + }, e3.reduceLuminance = t3, e3.increaseLuminance = a2, e3.toChannels = function(e4) { + return [e4 >> 24 & 255, e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4]; + }; + }(c || (t2.rgba = c = {})), t2.toPaddedHex = d, t2.contrastRatio = _; + }, 345: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let s2 = 0; s2 < i2.length; s2++) i2[s2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3((e4) => t3.fire(e4)); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3((e4) => t3(e4)); + }; + }, 859: (e2, t2) => { + function i2(e3) { + for (const t3 of e3) t3.dispose(); + e3.length = 0; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getDisposeArrayDisposable = t2.disposeArray = t2.toDisposable = t2.MutableDisposable = t2.Disposable = void 0, t2.Disposable = class { + constructor() { + this._disposables = [], this._isDisposed = false; + } + dispose() { + this._isDisposed = true; + for (const e3 of this._disposables) e3.dispose(); + this._disposables.length = 0; + } + register(e3) { + return this._disposables.push(e3), e3; + } + unregister(e3) { + const t3 = this._disposables.indexOf(e3); + -1 !== t3 && this._disposables.splice(t3, 1); + } + }, t2.MutableDisposable = class { + constructor() { + this._isDisposed = false; + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(e3) { + var _a; + this._isDisposed || e3 === this._value || ((_a = this._value) == null ? void 0 : _a.dispose(), this._value = e3); + } + clear() { + this.value = void 0; + } + dispose() { + var _a; + this._isDisposed = true, (_a = this._value) == null ? void 0 : _a.dispose(), this._value = void 0; + } + }, t2.toDisposable = function(e3) { + return { dispose: e3 }; + }, t2.disposeArray = i2, t2.getDisposeArrayDisposable = function(e3) { + return { dispose: () => i2(e3) }; + }; + }, 485: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.FourKeyMap = t2.TwoKeyMap = void 0; + class i2 { + constructor() { + this._data = {}; + } + set(e3, t3, i3) { + this._data[e3] || (this._data[e3] = {}), this._data[e3][t3] = i3; + } + get(e3, t3) { + return this._data[e3] ? this._data[e3][t3] : void 0; + } + clear() { + this._data = {}; + } + } + t2.TwoKeyMap = i2, t2.FourKeyMap = class { + constructor() { + this._data = new i2(); + } + set(e3, t3, s2, r, o) { + this._data.get(e3, t3) || this._data.set(e3, t3, new i2()), this._data.get(e3, t3).set(s2, r, o); + } + get(e3, t3, i3, s2) { + var _a; + return (_a = this._data.get(e3, t3)) == null ? void 0 : _a.get(i3, s2); + } + clear() { + this._data.clear(); + } + }; + }, 399: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.isChromeOS = t2.isLinux = t2.isWindows = t2.isIphone = t2.isIpad = t2.isMac = t2.getSafariVersion = t2.isSafari = t2.isLegacyEdge = t2.isFirefox = t2.isNode = void 0, t2.isNode = "undefined" != typeof process && "title" in process; + const i2 = t2.isNode ? "node" : navigator.userAgent, s2 = t2.isNode ? "node" : navigator.platform; + t2.isFirefox = i2.includes("Firefox"), t2.isLegacyEdge = i2.includes("Edge"), t2.isSafari = /^((?!chrome|android).)*safari/i.test(i2), t2.getSafariVersion = function() { + if (!t2.isSafari) return 0; + const e3 = i2.match(/Version\/(\d+)/); + return null === e3 || e3.length < 2 ? 0 : parseInt(e3[1]); + }, t2.isMac = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"].includes(s2), t2.isIpad = "iPad" === s2, t2.isIphone = "iPhone" === s2, t2.isWindows = ["Windows", "Win16", "Win32", "WinCE"].includes(s2), t2.isLinux = s2.indexOf("Linux") >= 0, t2.isChromeOS = /\bCrOS\b/.test(i2); + }, 385: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DebouncedIdleTask = t2.IdleTaskQueue = t2.PriorityTaskQueue = void 0; + const s2 = i2(399); + class r { + constructor() { + this._tasks = [], this._i = 0; + } + enqueue(e3) { + this._tasks.push(e3), this._start(); + } + flush() { + for (; this._i < this._tasks.length; ) this._tasks[this._i]() || this._i++; + this.clear(); + } + clear() { + this._idleCallback && (this._cancelCallback(this._idleCallback), this._idleCallback = void 0), this._i = 0, this._tasks.length = 0; + } + _start() { + this._idleCallback || (this._idleCallback = this._requestCallback(this._process.bind(this))); + } + _process(e3) { + this._idleCallback = void 0; + let t3 = 0, i3 = 0, s3 = e3.timeRemaining(), r2 = 0; + for (; this._i < this._tasks.length; ) { + if (t3 = Date.now(), this._tasks[this._i]() || this._i++, t3 = Math.max(1, Date.now() - t3), i3 = Math.max(t3, i3), r2 = e3.timeRemaining(), 1.5 * i3 > r2) return s3 - t3 < -20 && console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s3 - t3))}ms`), void this._start(); + s3 = r2; + } + this.clear(); + } + } + class o extends r { + _requestCallback(e3) { + return setTimeout(() => e3(this._createDeadline(16))); + } + _cancelCallback(e3) { + clearTimeout(e3); + } + _createDeadline(e3) { + const t3 = Date.now() + e3; + return { timeRemaining: () => Math.max(0, t3 - Date.now()) }; + } + } + t2.PriorityTaskQueue = o, t2.IdleTaskQueue = !s2.isNode && "requestIdleCallback" in window ? class extends r { + _requestCallback(e3) { + return requestIdleCallback(e3); + } + _cancelCallback(e3) { + cancelIdleCallback(e3); + } + } : o, t2.DebouncedIdleTask = class { + constructor() { + this._queue = new t2.IdleTaskQueue(); + } + set(e3) { + this._queue.clear(), this._queue.enqueue(e3); + } + flush() { + this._queue.flush(); + } + }; + }, 147: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ExtendedAttrs = t2.AttributeData = void 0; + class i2 { + constructor() { + this.fg = 0, this.bg = 0, this.extended = new s2(); + } + static toColorRGB(e3) { + return [e3 >>> 16 & 255, e3 >>> 8 & 255, 255 & e3]; + } + static fromColorRGB(e3) { + return (255 & e3[0]) << 16 | (255 & e3[1]) << 8 | 255 & e3[2]; + } + clone() { + const e3 = new i2(); + return e3.fg = this.fg, e3.bg = this.bg, e3.extended = this.extended.clone(), e3; + } + isInverse() { + return 67108864 & this.fg; + } + isBold() { + return 134217728 & this.fg; + } + isUnderline() { + return this.hasExtendedAttrs() && 0 !== this.extended.underlineStyle ? 1 : 268435456 & this.fg; + } + isBlink() { + return 536870912 & this.fg; + } + isInvisible() { + return 1073741824 & this.fg; + } + isItalic() { + return 67108864 & this.bg; + } + isDim() { + return 134217728 & this.bg; + } + isStrikethrough() { + return 2147483648 & this.fg; + } + isProtected() { + return 536870912 & this.bg; + } + isOverline() { + return 1073741824 & this.bg; + } + getFgColorMode() { + return 50331648 & this.fg; + } + getBgColorMode() { + return 50331648 & this.bg; + } + isFgRGB() { + return 50331648 == (50331648 & this.fg); + } + isBgRGB() { + return 50331648 == (50331648 & this.bg); + } + isFgPalette() { + return 16777216 == (50331648 & this.fg) || 33554432 == (50331648 & this.fg); + } + isBgPalette() { + return 16777216 == (50331648 & this.bg) || 33554432 == (50331648 & this.bg); + } + isFgDefault() { + return 0 == (50331648 & this.fg); + } + isBgDefault() { + return 0 == (50331648 & this.bg); + } + isAttributeDefault() { + return 0 === this.fg && 0 === this.bg; + } + getFgColor() { + switch (50331648 & this.fg) { + case 16777216: + case 33554432: + return 255 & this.fg; + case 50331648: + return 16777215 & this.fg; + default: + return -1; + } + } + getBgColor() { + switch (50331648 & this.bg) { + case 16777216: + case 33554432: + return 255 & this.bg; + case 50331648: + return 16777215 & this.bg; + default: + return -1; + } + } + hasExtendedAttrs() { + return 268435456 & this.bg; + } + updateExtended() { + this.extended.isEmpty() ? this.bg &= -268435457 : this.bg |= 268435456; + } + getUnderlineColor() { + if (268435456 & this.bg && ~this.extended.underlineColor) switch (50331648 & this.extended.underlineColor) { + case 16777216: + case 33554432: + return 255 & this.extended.underlineColor; + case 50331648: + return 16777215 & this.extended.underlineColor; + default: + return this.getFgColor(); + } + return this.getFgColor(); + } + getUnderlineColorMode() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 & this.extended.underlineColor : this.getFgColorMode(); + } + isUnderlineColorRGB() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 == (50331648 & this.extended.underlineColor) : this.isFgRGB(); + } + isUnderlineColorPalette() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 16777216 == (50331648 & this.extended.underlineColor) || 33554432 == (50331648 & this.extended.underlineColor) : this.isFgPalette(); + } + isUnderlineColorDefault() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 0 == (50331648 & this.extended.underlineColor) : this.isFgDefault(); + } + getUnderlineStyle() { + return 268435456 & this.fg ? 268435456 & this.bg ? this.extended.underlineStyle : 1 : 0; + } + getUnderlineVariantOffset() { + return this.extended.underlineVariantOffset; + } + } + t2.AttributeData = i2; + class s2 { + get ext() { + return this._urlId ? -469762049 & this._ext | this.underlineStyle << 26 : this._ext; + } + set ext(e3) { + this._ext = e3; + } + get underlineStyle() { + return this._urlId ? 5 : (469762048 & this._ext) >> 26; + } + set underlineStyle(e3) { + this._ext &= -469762049, this._ext |= e3 << 26 & 469762048; + } + get underlineColor() { + return 67108863 & this._ext; + } + set underlineColor(e3) { + this._ext &= -67108864, this._ext |= 67108863 & e3; + } + get urlId() { + return this._urlId; + } + set urlId(e3) { + this._urlId = e3; + } + get underlineVariantOffset() { + const e3 = (3758096384 & this._ext) >> 29; + return e3 < 0 ? 4294967288 ^ e3 : e3; + } + set underlineVariantOffset(e3) { + this._ext &= 536870911, this._ext |= e3 << 29 & 3758096384; + } + constructor(e3 = 0, t3 = 0) { + this._ext = 0, this._urlId = 0, this._ext = e3, this._urlId = t3; + } + clone() { + return new s2(this._ext, this._urlId); + } + isEmpty() { + return 0 === this.underlineStyle && 0 === this._urlId; + } + } + t2.ExtendedAttrs = s2; + }, 782: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellData = void 0; + const s2 = i2(133), r = i2(855), o = i2(147); + class n extends o.AttributeData { + constructor() { + super(...arguments), this.content = 0, this.fg = 0, this.bg = 0, this.extended = new o.ExtendedAttrs(), this.combinedData = ""; + } + static fromCharData(e3) { + const t3 = new n(); + return t3.setFromCharData(e3), t3; + } + isCombined() { + return 2097152 & this.content; + } + getWidth() { + return this.content >> 22; + } + getChars() { + return 2097152 & this.content ? this.combinedData : 2097151 & this.content ? (0, s2.stringFromCodePoint)(2097151 & this.content) : ""; + } + getCode() { + return this.isCombined() ? this.combinedData.charCodeAt(this.combinedData.length - 1) : 2097151 & this.content; + } + setFromCharData(e3) { + this.fg = e3[r.CHAR_DATA_ATTR_INDEX], this.bg = 0; + let t3 = false; + if (e3[r.CHAR_DATA_CHAR_INDEX].length > 2) t3 = true; + else if (2 === e3[r.CHAR_DATA_CHAR_INDEX].length) { + const i3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0); + if (55296 <= i3 && i3 <= 56319) { + const s3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1); + 56320 <= s3 && s3 <= 57343 ? this.content = 1024 * (i3 - 55296) + s3 - 56320 + 65536 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22 : t3 = true; + } else t3 = true; + } else this.content = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | e3[r.CHAR_DATA_WIDTH_INDEX] << 22; + t3 && (this.combinedData = e3[r.CHAR_DATA_CHAR_INDEX], this.content = 2097152 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.CellData = n; + }, 855: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WHITESPACE_CELL_CODE = t2.WHITESPACE_CELL_WIDTH = t2.WHITESPACE_CELL_CHAR = t2.NULL_CELL_CODE = t2.NULL_CELL_WIDTH = t2.NULL_CELL_CHAR = t2.CHAR_DATA_CODE_INDEX = t2.CHAR_DATA_WIDTH_INDEX = t2.CHAR_DATA_CHAR_INDEX = t2.CHAR_DATA_ATTR_INDEX = t2.DEFAULT_EXT = t2.DEFAULT_ATTR = t2.DEFAULT_COLOR = void 0, t2.DEFAULT_COLOR = 0, t2.DEFAULT_ATTR = 256 | t2.DEFAULT_COLOR << 9, t2.DEFAULT_EXT = 0, t2.CHAR_DATA_ATTR_INDEX = 0, t2.CHAR_DATA_CHAR_INDEX = 1, t2.CHAR_DATA_WIDTH_INDEX = 2, t2.CHAR_DATA_CODE_INDEX = 3, t2.NULL_CELL_CHAR = "", t2.NULL_CELL_WIDTH = 1, t2.NULL_CELL_CODE = 0, t2.WHITESPACE_CELL_CHAR = " ", t2.WHITESPACE_CELL_WIDTH = 1, t2.WHITESPACE_CELL_CODE = 32; + }, 133: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Utf8ToUtf32 = t2.StringToUtf32 = t2.utf32ToString = t2.stringFromCodePoint = void 0, t2.stringFromCodePoint = function(e3) { + return e3 > 65535 ? (e3 -= 65536, String.fromCharCode(55296 + (e3 >> 10)) + String.fromCharCode(e3 % 1024 + 56320)) : String.fromCharCode(e3); + }, t2.utf32ToString = function(e3, t3 = 0, i2 = e3.length) { + let s2 = ""; + for (let r = t3; r < i2; ++r) { + let t4 = e3[r]; + t4 > 65535 ? (t4 -= 65536, s2 += String.fromCharCode(55296 + (t4 >> 10)) + String.fromCharCode(t4 % 1024 + 56320)) : s2 += String.fromCharCode(t4); + } + return s2; + }, t2.StringToUtf32 = class { + constructor() { + this._interim = 0; + } + clear() { + this._interim = 0; + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2 = 0, r = 0; + if (this._interim) { + const i3 = e3.charCodeAt(r++); + 56320 <= i3 && i3 <= 57343 ? t3[s2++] = 1024 * (this._interim - 55296) + i3 - 56320 + 65536 : (t3[s2++] = this._interim, t3[s2++] = i3), this._interim = 0; + } + for (let o = r; o < i2; ++o) { + const r2 = e3.charCodeAt(o); + if (55296 <= r2 && r2 <= 56319) { + if (++o >= i2) return this._interim = r2, s2; + const n = e3.charCodeAt(o); + 56320 <= n && n <= 57343 ? t3[s2++] = 1024 * (r2 - 55296) + n - 56320 + 65536 : (t3[s2++] = r2, t3[s2++] = n); + } else 65279 !== r2 && (t3[s2++] = r2); + } + return s2; + } + }, t2.Utf8ToUtf32 = class { + constructor() { + this.interim = new Uint8Array(3); + } + clear() { + this.interim.fill(0); + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2, r, o, n, a = 0, h = 0, l = 0; + if (this.interim[0]) { + let s3 = false, r2 = this.interim[0]; + r2 &= 192 == (224 & r2) ? 31 : 224 == (240 & r2) ? 15 : 7; + let o2, n2 = 0; + for (; (o2 = 63 & this.interim[++n2]) && n2 < 4; ) r2 <<= 6, r2 |= o2; + const h2 = 192 == (224 & this.interim[0]) ? 2 : 224 == (240 & this.interim[0]) ? 3 : 4, c2 = h2 - n2; + for (; l < c2; ) { + if (l >= i2) return 0; + if (o2 = e3[l++], 128 != (192 & o2)) { + l--, s3 = true; + break; + } + this.interim[n2++] = o2, r2 <<= 6, r2 |= 63 & o2; + } + s3 || (2 === h2 ? r2 < 128 ? l-- : t3[a++] = r2 : 3 === h2 ? r2 < 2048 || r2 >= 55296 && r2 <= 57343 || 65279 === r2 || (t3[a++] = r2) : r2 < 65536 || r2 > 1114111 || (t3[a++] = r2)), this.interim.fill(0); + } + const c = i2 - 4; + let d = l; + for (; d < i2; ) { + for (; !(!(d < c) || 128 & (s2 = e3[d]) || 128 & (r = e3[d + 1]) || 128 & (o = e3[d + 2]) || 128 & (n = e3[d + 3])); ) t3[a++] = s2, t3[a++] = r, t3[a++] = o, t3[a++] = n, d += 4; + if (s2 = e3[d++], s2 < 128) t3[a++] = s2; + else if (192 == (224 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (h = (31 & s2) << 6 | 63 & r, h < 128) { + d--; + continue; + } + t3[a++] = h; + } else if (224 == (240 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (h = (15 & s2) << 12 | (63 & r) << 6 | 63 & o, h < 2048 || h >= 55296 && h <= 57343 || 65279 === h) continue; + t3[a++] = h; + } else if (240 == (248 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, this.interim[2] = o, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (h = (7 & s2) << 18 | (63 & r) << 12 | (63 & o) << 6 | 63 & n, h < 65536 || h > 1114111) continue; + t3[a++] = h; + } + } + return a; + } + }; + }, 776: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, o2 = arguments.length, n2 = o2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) n2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (n2 = (o2 < 3 ? r2(n2) : o2 > 3 ? r2(t3, i3, n2) : r2(t3, i3)) || n2); + return o2 > 3 && n2 && Object.defineProperty(t3, i3, n2), n2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.traceCall = t2.setTraceLogger = t2.LogService = void 0; + const o = i2(859), n = i2(97), a = { trace: n.LogLevelEnum.TRACE, debug: n.LogLevelEnum.DEBUG, info: n.LogLevelEnum.INFO, warn: n.LogLevelEnum.WARN, error: n.LogLevelEnum.ERROR, off: n.LogLevelEnum.OFF }; + let h, l = t2.LogService = class extends o.Disposable { + get logLevel() { + return this._logLevel; + } + constructor(e3) { + super(), this._optionsService = e3, this._logLevel = n.LogLevelEnum.OFF, this._updateLogLevel(), this.register(this._optionsService.onSpecificOptionChange("logLevel", () => this._updateLogLevel())), h = this; + } + _updateLogLevel() { + this._logLevel = a[this._optionsService.rawOptions.logLevel]; + } + _evalLazyOptionalParams(e3) { + for (let t3 = 0; t3 < e3.length; t3++) "function" == typeof e3[t3] && (e3[t3] = e3[t3]()); + } + _log(e3, t3, i3) { + this._evalLazyOptionalParams(i3), e3.call(console, (this._optionsService.options.logger ? "" : "xterm.js: ") + t3, ...i3); + } + trace(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.TRACE && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.trace.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + debug(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.DEBUG && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.debug.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + info(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.INFO && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.info.bind(this._optionsService.options.logger)) ?? console.info, e3, t3); + } + warn(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.WARN && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.warn.bind(this._optionsService.options.logger)) ?? console.warn, e3, t3); + } + error(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.ERROR && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.error.bind(this._optionsService.options.logger)) ?? console.error, e3, t3); + } + }; + t2.LogService = l = s2([r(0, n.IOptionsService)], l), t2.setTraceLogger = function(e3) { + h = e3; + }, t2.traceCall = function(e3, t3, i3) { + if ("function" != typeof i3.value) throw new Error("not supported"); + const s3 = i3.value; + i3.value = function(...e4) { + if (h.logLevel !== n.LogLevelEnum.TRACE) return s3.apply(this, e4); + h.trace(`GlyphRenderer#${s3.name}(${e4.map((e5) => JSON.stringify(e5)).join(", ")})`); + const t4 = s3.apply(this, e4); + return h.trace(`GlyphRenderer#${s3.name} return`, t4), t4; + }; + }; + }, 726: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createDecorator = t2.getServiceDependencies = t2.serviceRegistry = void 0; + const i2 = "di$target", s2 = "di$dependencies"; + t2.serviceRegistry = /* @__PURE__ */ new Map(), t2.getServiceDependencies = function(e3) { + return e3[s2] || []; + }, t2.createDecorator = function(e3) { + if (t2.serviceRegistry.has(e3)) return t2.serviceRegistry.get(e3); + const r = function(e4, t3, o) { + if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); + !function(e5, t4, r2) { + t4[i2] === t4 ? t4[s2].push({ id: e5, index: r2 }) : (t4[s2] = [{ id: e5, index: r2 }], t4[i2] = t4); + }(r, e4, o); + }; + return r.toString = () => e3, t2.serviceRegistry.set(e3, r), r; + }; + }, 97: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.IDecorationService = t2.IUnicodeService = t2.IOscLinkService = t2.IOptionsService = t2.ILogService = t2.LogLevelEnum = t2.IInstantiationService = t2.ICharsetService = t2.ICoreService = t2.ICoreMouseService = t2.IBufferService = void 0; + const s2 = i2(726); + var r; + t2.IBufferService = (0, s2.createDecorator)("BufferService"), t2.ICoreMouseService = (0, s2.createDecorator)("CoreMouseService"), t2.ICoreService = (0, s2.createDecorator)("CoreService"), t2.ICharsetService = (0, s2.createDecorator)("CharsetService"), t2.IInstantiationService = (0, s2.createDecorator)("InstantiationService"), function(e3) { + e3[e3.TRACE = 0] = "TRACE", e3[e3.DEBUG = 1] = "DEBUG", e3[e3.INFO = 2] = "INFO", e3[e3.WARN = 3] = "WARN", e3[e3.ERROR = 4] = "ERROR", e3[e3.OFF = 5] = "OFF"; + }(r || (t2.LogLevelEnum = r = {})), t2.ILogService = (0, s2.createDecorator)("LogService"), t2.IOptionsService = (0, s2.createDecorator)("OptionsService"), t2.IOscLinkService = (0, s2.createDecorator)("OscLinkService"), t2.IUnicodeService = (0, s2.createDecorator)("UnicodeService"), t2.IDecorationService = (0, s2.createDecorator)("DecorationService"); + } }, t = {}; + function i(s2) { + var r = t[s2]; + if (void 0 !== r) return r.exports; + var o = t[s2] = { exports: {} }; + return e[s2].call(o.exports, o, o.exports, i), o.exports; + } + var s = {}; + return (() => { + var e2 = s; + Object.defineProperty(e2, "__esModule", { value: true }), e2.WebglAddon = void 0; + const t2 = i(345), r = i(859), o = i(399), n = i(666), a = i(776); + class h extends r.Disposable { + constructor(e3) { + if (o.isSafari && (0, o.getSafariVersion)() < 16) { + const e4 = { antialias: false, depth: false, preserveDrawingBuffer: true }; + if (!document.createElement("canvas").getContext("webgl2", e4)) throw new Error("Webgl2 is only supported on Safari 16 and above"); + } + super(), this._preserveDrawingBuffer = e3, this._onChangeTextureAtlas = this.register(new t2.EventEmitter()), this.onChangeTextureAtlas = this._onChangeTextureAtlas.event, this._onAddTextureAtlasCanvas = this.register(new t2.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = this.register(new t2.EventEmitter()), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._onContextLoss = this.register(new t2.EventEmitter()), this.onContextLoss = this._onContextLoss.event; + } + activate(e3) { + const i2 = e3._core; + if (!e3.element) return void this.register(i2.onWillOpen(() => this.activate(e3))); + this._terminal = e3; + const s2 = i2.coreService, o2 = i2.optionsService, h2 = i2, l = h2._renderService, c = h2._characterJoinerService, d = h2._charSizeService, _ = h2._coreBrowserService, u = h2._decorationService, g = h2._logService, v = h2._themeService; + (0, a.setTraceLogger)(g), this._renderer = this.register(new n.WebglRenderer(e3, c, d, _, s2, u, o2, v, this._preserveDrawingBuffer)), this.register((0, t2.forwardEvent)(this._renderer.onContextLoss, this._onContextLoss)), this.register((0, t2.forwardEvent)(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)), this.register((0, t2.forwardEvent)(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)), this.register((0, t2.forwardEvent)(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)), l.setRenderer(this._renderer), this.register((0, r.toDisposable)(() => { + const t3 = this._terminal._core._renderService; + t3.setRenderer(this._terminal._core._createRenderer()), t3.handleResize(e3.cols, e3.rows); + })); + } + get textureAtlas() { + var _a; + return (_a = this._renderer) == null ? void 0 : _a.textureAtlas; + } + clearTextureAtlas() { + var _a; + (_a = this._renderer) == null ? void 0 : _a.clearTextureAtlas(); + } + } + e2.WebglAddon = h; + })(), s; + })()); +})(addonWebgl); +var addonWebglExports = addonWebgl.exports; +const ANSI = { + reset: "\x1B[0m", + bold: "\x1B[1m", + dim: "\x1B[2m", + red: "\x1B[31m", + green: "\x1B[32m", + yellow: "\x1B[33m", + blue: "\x1B[34m", + magenta: "\x1B[35m", + cyan: "\x1B[36m", + clearScreen: "\x1B[2J\x1B[H", + cursorHome: "\x1B[H", + hideCursor: "\x1B[?25l" +}; +function generateBuildLogSession() { + const chunks = []; + const components = ["WebCore", "JavaScriptCore", "WebKit2", "WTF", "PAL", "Angle", "Skia", "V8", "Blink", "Platform"]; + const files = ["Node.cpp", "Element.cpp", "Document.cpp", "JSLexer.cpp", "Parser.cpp", "RenderBox.cpp", "CSSParser.cpp", "EventLoop.cpp", "FrameView.cpp", "DOMWindow.cpp"]; + chunks.push(`${ANSI.bold}${ANSI.cyan}==> Starting build suite configuration (Speedometer Terminal Emulator Workload)...${ANSI.reset}\r +`); + chunks.push(`${ANSI.green}✔ Pre-build checks passed. Environment: Linux x86_64, Node v22.0.0, Clang 18.0.0${ANSI.reset}\r +`); + let totalProgress = 0; + for (let i = 1; i <= 150; i++) { + let chunk = ""; + const comp = components[i % components.length]; + const file = files[i % files.length]; + totalProgress = Math.min(100, Math.floor(i / 150 * 100)); + chunk += `${ANSI.dim}[${new Date(1720448e6 + i * 500).toISOString()}]${ANSI.reset} [${ANSI.bold}${totalProgress.toString().padStart(3, " ")}%${ANSI.reset}] Building CXX object Source/${comp}/CMakeFiles/${comp}.dir/${file}.o\r +`; + if (i % 7 === 0) { + chunk += `${ANSI.bold}${ANSI.yellow}warning:${ANSI.reset} unused parameter 'execState' [-Wunused-parameter]\r +`; + chunk += ` 142 | JSValue ${comp}::evaluate(JSGlobalObject* ${ANSI.bold}${ANSI.yellow}execState${ANSI.reset}, const SourceCode& source)\r +`; + chunk += ` | ${ANSI.yellow}^~~~~~~~~~${ANSI.reset}\r +`; + } + if (i % 19 === 0) { + chunk += `${ANSI.bold}${ANSI.cyan}info:${ANSI.reset} vectorization enabled for loop in ${file} at line ${100 + i}\r +`; + chunk += ` ${ANSI.dim}remark: vectorized 4 instructions in unrolled loop (-Rpass=loop-vectorize)${ANSI.reset}\r +`; + } + if (i % 31 === 0) { + chunk += `${ANSI.bold}${ANSI.magenta}[LINK]${ANSI.reset} Linking shared library lib${comp}.so...\r +`; + chunk += ` ${ANSI.green}✔ Created lib${comp}.so (48.2 MB)${ANSI.reset}\r +`; + } + if (i % 45 === 0) { + chunk += `${ANSI.bold}${ANSI.red}error (ignored):${ANSI.reset} temporary lock contention in distributed cache for ${file}\r +`; + chunk += " Retrying build step 2 of 3...\r\n"; + chunk += ` ${ANSI.green}✔ Retry successful!${ANSI.reset}\r +`; + } + chunks.push(chunk); + } + chunks.push(`${ANSI.bold}${ANSI.green}==> Build completed successfully in 42.8s! Total artifacts: 1,420 targets.${ANSI.reset}\r +`); + return chunks; +} +function generateLinksSession() { + const chunks = []; + chunks.push(`${ANSI.bold}${ANSI.blue}=== Test Execution Summary & Artifact Links ===${ANSI.reset}\r +`); + for (let i = 1; i <= 80; i++) { + let chunk = ""; + chunk += `[Test Worker #${i % 8 + 1}] RUNNING: https://github.com/WebKit/Speedometer/issues/${1e3 + i}\r +`; + chunk += " ↳ Reference spec: https://html.spec.whatwg.org/multipage/webappapis.html#event-loops\r\n"; + chunk += ` ↳ Local fixture: file:///usr/local/google/home/cbruni/Documents/Speedometer/suites/editors/codemirror.html:${10 + i}:${i % 20 + 1}\r +`; + chunk += ` ↳ Stack trace: at Object.runTest (src/speedometer-utils/benchmark.mjs:${50 + i}:12)\r +`; + chunk += " ↳ Documentation: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext\r\n"; + chunk += ` ↳ NPM Registry: https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.${i % 10}.tgz\r +`; + chunks.push(chunk); + } + return chunks; +} +function rgbFg(r, g, b, text) { + return `\x1B[38;2;${r};${g};${b}m${text}${ANSI.reset}`; +} +function rgbBg(r, g, b, text) { + return `\x1B[48;2;${r};${g};${b}m${text}${ANSI.reset}`; +} +function generateNcursesSession() { + const frames = []; + const procList = [ + { pid: 1420, user: "cbruni", pri: 20, ni: 0, virt: "4820M", res: "312M", shr: "84M", s: "R", cpu: 45.2, mem: 1.9, time: "4:12.08", cmd: "/usr/bin/google-chrome-stable --type=renderer" }, + { pid: 1842, user: "cbruni", pri: 20, ni: 0, virt: "8920M", res: "1.2G", shr: "120M", s: "S", cpu: 32.8, mem: 7.4, time: "18:45.12", cmd: "node tests/server.mjs --port 8000" }, + { pid: 2901, user: "cbruni", pri: 20, ni: 0, virt: "1420M", res: "180M", shr: "64M", s: "R", cpu: 28.4, mem: 1.1, time: "1:02.45", cmd: "vite build --watch" }, + { pid: 3105, user: "cbruni", pri: 20, ni: 0, virt: "980M", res: "92M", shr: "45M", s: "S", cpu: 14.1, mem: 0.6, time: "0:45.90", cmd: "python3 sidecar.py --daemon" }, + { pid: 402, user: "root", pri: 20, ni: 0, virt: "310M", res: "24M", shr: "18M", s: "S", cpu: 5, mem: 0.2, time: "12:10.01", cmd: "/lib/systemd/systemd-journald" }, + { pid: 881, user: "root", pri: -20, ni: -20, virt: "0", res: "0", shr: "0", s: "I", cpu: 1.2, mem: 0, time: "0:04.12", cmd: "[kworker/u16:2-events_unbound]" }, + { pid: 5120, user: "cbruni", pri: 20, ni: 0, virt: "2100M", res: "410M", shr: "95M", s: "S", cpu: 0.8, mem: 2.5, time: "2:14.50", cmd: "code /usr/local/google/home/cbruni/Documents/Speedometer" }, + { pid: 6012, user: "cbruni", pri: 20, ni: 0, virt: "650M", res: "45M", shr: "28M", s: "S", cpu: 0.4, mem: 0.3, time: "0:12.80", cmd: "bash -i" }, + { pid: 7100, user: "cbruni", pri: 20, ni: 0, virt: "520M", res: "38M", shr: "22M", s: "S", cpu: 0.1, mem: 0.2, time: "0:05.10", cmd: "git status -uall" }, + { pid: 8192, user: "cbruni", pri: 20, ni: 0, virt: "120M", res: "8M", shr: "6M", s: "R", cpu: 0, mem: 0.1, time: "0:00.05", cmd: "ps aux --sort=-pcpu" } + ]; + for (let frameIdx = 0; frameIdx < 4; frameIdx++) { + let frame = frameIdx === 0 ? ANSI.clearScreen + ANSI.hideCursor : ANSI.cursorHome; + const load1 = (2.45 + Math.sin(frameIdx / 5) * 0.5).toFixed(2); + const load5 = (2.1 + Math.cos(frameIdx / 7) * 0.3).toFixed(2); + const load15 = (1.85 + Math.sin(frameIdx / 10) * 0.2).toFixed(2); + frame += `${rgbFg(100, 220, 255, "htop 3.3.0")} - ${rgbFg(220, 220, 220, "16:15:27 up 14 days, 6:42, 4 users")}, load average: ${rgbFg(255, 100, 100, load1)}, ${rgbFg(255, 180, 100, load5)}, ${rgbFg(180, 255, 100, load15)}\r +`; + frame += `Tasks: ${ANSI.bold}142${ANSI.reset}, ${ANSI.bold}430${ANSI.reset} thr; ${rgbFg(100, 255, 100, "3 running")}, 427 sleeping, 0 stopped, 0 zombie\r +\r +`; + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 2; col++) { + const coreNum = row + col * 4 + 1; + const cpuPct = Math.min(100, Math.max(2, Math.floor(40 + Math.sin(frameIdx * 0.3 + coreNum) * 35 + coreNum % 3 * 10))); + const barWidth = 25; + const filledWidth = Math.floor(cpuPct / 100 * barWidth); + let barStr = "["; + for (let b = 0; b < barWidth; b++) { + if (b < filledWidth) { + if (b < 12) + barStr += rgbFg(80, 250, 120, "|"); + else if (b < 20) + barStr += rgbFg(255, 200, 50, "|"); + else + barStr += rgbFg(250, 70, 70, "|"); + } else { + barStr += rgbFg(60, 60, 60, " "); + } + } + barStr += `] ${rgbFg(220, 220, 220, `${cpuPct.toString().padStart(5, " ")}%`)}`; + const label = rgbFg(100, 220, 255, `CPU${coreNum}`.padEnd(5, " ")); + frame += `${label}${barStr} `; + } + frame += "\r\n"; + } + const memPct = 42.5 + Math.sin(frameIdx * 0.1) * 2; + const swapPct = 12; + const memBarWidth = 63; + const memFilled = Math.floor(memPct / 100 * memBarWidth); + let memBar = "["; + for (let b = 0; b < memBarWidth; b++) + memBar += b < memFilled ? rgbFg(80, 200, 255, "|") : rgbFg(60, 60, 60, " "); + memBar += `] ${rgbFg(220, 220, 220, "13.6G/32.0G")}`; + frame += `${rgbFg(100, 220, 255, "Mem ")}${memBar}\r +`; + let swapBar = "["; + const swapFilled = Math.floor(swapPct / 100 * memBarWidth); + for (let b = 0; b < memBarWidth; b++) + swapBar += b < swapFilled ? rgbFg(255, 100, 200, "|") : rgbFg(60, 60, 60, " "); + swapBar += `] ${rgbFg(220, 220, 220, "1.92G/16.0G")}`; + frame += `${rgbFg(100, 220, 255, "Swp ")}${swapBar}\r +\r +`; + const headerText = " PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command".padEnd(80, " "); + frame += `${rgbBg(40, 90, 60, rgbFg(255, 255, 255, ANSI.bold + headerText))}\r +`; + for (let pIdx = 0; pIdx < procList.length; pIdx++) { + const proc = procList[pIdx]; + let curCpu = proc.cpu; + if (proc.s === "R") + curCpu = Math.max(0.1, (proc.cpu + Math.sin(frameIdx + pIdx) * 5).toFixed(1)); + const rowBg = pIdx === frameIdx % procList.length ? "\x1B[48;2;60;80;100m" : ""; + const pidStr = rgbFg(255, 180, 100, proc.pid.toString().padStart(5, " ")); + const userStr = rgbFg(180, 220, 255, proc.user.padEnd(8, " ")); + const priStr = proc.pri.toString().padStart(4, " "); + const niStr = proc.ni.toString().padStart(3, " "); + const virtStr = proc.virt.padStart(6, " "); + const resStr = rgbFg(150, 255, 150, proc.res.padStart(5, " ")); + const shrStr = proc.shr.padStart(5, " "); + const sStr = proc.s === "R" ? rgbFg(80, 250, 120, proc.s) : proc.s; + const cpuStr = proc.s === "R" ? rgbFg(255, 100, 100, curCpu.toString().padStart(5, " ")) : curCpu.toString().padStart(5, " "); + const memStr = proc.mem.toString().padStart(5, " "); + const timeStr = proc.time.padStart(9, " "); + const cmdStr = proc.cmd.slice(0, 32).padEnd(32, " "); + frame += `${rowBg}${pidStr} ${userStr} ${priStr} ${niStr} ${virtStr} ${resStr} ${shrStr} ${sStr} ${cpuStr} ${memStr} ${timeStr} ${cmdStr}${ANSI.reset}\r +`; + } + frame += `\r +${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F1"))}Help ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F2"))}Setup ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F3"))}Search ${rgbBg( + 50, + 50, + 50, + rgbFg(255, 255, 255, "F4") + )}Filter ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F5"))}Tree ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F6"))}SortBy ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F7"))}Nice - ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F8"))}Nice + ${rgbBg( + 50, + 50, + 50, + rgbFg(255, 255, 255, "F9") + )}Kill ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F10"))}Quit`; + frames.push(frame); + } + return frames; +} +const terminals = {}; +const fitAddons = {}; +let activeTabId = "build"; +let isInitialized = false; +const buildLogChunks = generateBuildLogSession(); +const linksChunks = generateLinksSession(); +const ncursesFrames = generateNcursesSession(); +const params = new URLSearchParams(window.location.search); +const rendererType = (params.get("renderer") || "canvas").toLowerCase(); +function initTerminals() { + if (isInitialized) return; + const tabs = ["build", "links", "ncurses", "git"]; + tabs.forEach((tabId) => initTerminalForTab(tabId)); + if (terminals.git) { + writeAndFlushSync(terminals.git, "\x1B[33mOn branch main\x1B[0m\r\n"); + writeAndFlushSync(terminals.git, "Your branch is up to date with 'origin/main'.\r\n\r\n"); + writeAndFlushSync(terminals.git, "Changes not staged for commit:\r\n"); + writeAndFlushSync(terminals.git, ' (use "git add ..." to update what will be committed)\r\n'); + writeAndFlushSync(terminals.git, ' (use "git restore ..." to discard changes in working directory)\r\n'); + writeAndFlushSync(terminals.git, " \x1B[31mmodified: src/app.js\x1B[0m\r\n"); + writeAndFlushSync(terminals.git, " \x1B[31mmodified: style.css\x1B[0m\r\n\r\n"); + writeAndFlushSync(terminals.git, "Untracked files:\r\n"); + writeAndFlushSync(terminals.git, ' (use "git add ..." to include in what will be committed)\r\n'); + writeAndFlushSync(terminals.git, " \x1B[31msessions.js\x1B[0m\r\n\r\n"); + writeAndFlushSync(terminals.git, 'no changes added to commit (use "git add" and/or "git commit -a")\r\n'); + } + if (terminals.build && buildLogChunks.length > 0) { + writeSync(terminals.build, "\x1B[36m⚡ Speedometer Terminal Emulator Suite - Initializing Build Environment...\x1B[0m\r\n\r\n"); + for (let i = 0; i < Math.min(10, buildLogChunks.length); i++) writeSync(terminals.build, buildLogChunks[i]); + } + if (terminals.links && linksChunks.length > 0) { + writeSync(terminals.links, "\x1B[36m🔗 Speedometer Web Links & Traces - Initializing Link Environment...\x1B[0m\r\n\r\n"); + for (let i = 0; i < Math.min(10, linksChunks.length); i++) writeSync(terminals.links, linksChunks[i]); + } + if (terminals.ncurses && ncursesFrames.length > 0) writeSync(terminals.ncurses, ncursesFrames[0]); + Object.values(terminals).forEach((term) => { + if (term._core && term._core._renderService) { + const rs = term._core._renderService; + if (rs._isPaused) { + rs._isPaused = false; + if (rs._charSizeService && !rs._charSizeService.hasValidSize) rs._charSizeService.measure(); + if (rs._needsFullRefresh) { + if (rs._pausedResizeTask && typeof rs._pausedResizeTask.flush === "function") rs._pausedResizeTask.flush(); + rs.refreshRows(0, rs._rowCount - 1); + rs._needsFullRefresh = false; + } + } + } + flushSync(term); + }); + isInitialized = true; + switchTab("build"); +} +function initTerminalForTab(tabId) { + const container = document.getElementById(`pane-${tabId}`); + if (!container) return; + const term = new xtermExports.Terminal({ + theme: { + background: "#1e1e1e", + foreground: "#d4d4d4", + cursor: "#007acc", + selectionBackground: "#264f78", + black: "#000000", + red: "#cd3131", + green: "#0dbc79", + yellow: "#e5e510", + blue: "#2472c8", + magenta: "#bc3fbc", + cyan: "#11a8cd", + white: "#e5e5e5", + brightBlack: "#666666", + brightRed: "#f14c4c", + brightGreen: "#23d18b", + brightYellow: "#f5f543", + brightBlue: "#3b8eea", + brightMagenta: "#d670d6", + brightCyan: "#29b8db", + brightWhite: "#e5e5e5" + }, + fontFamily: 'Menlo, Monaco, "Courier New", monospace', + fontSize: 13, + lineHeight: 1.2, + scrollback: 5e3, + cursorBlink: false, + // Turn off blinking for deterministic rendering + allowTransparency: false + }); + const fitAddon = new addonFitExports.FitAddon(); + const webLinksAddon = new addonWebLinksExports.WebLinksAddon(); + term.loadAddon(fitAddon); + term.loadAddon(webLinksAddon); + if (rendererType === "webgl") { + try { + const webglAddon = new addonWebglExports.WebGLAddon(); + term.loadAddon(webglAddon); + } catch (e) { + console.warn("WebGL renderer failed to initialize, falling back to Canvas/DOM:", e); + tryLoadCanvas(term); + } + } else if (rendererType === "canvas") { + tryLoadCanvas(term); + } + term.open(container); + fitAddon.fit(); + terminals[tabId] = term; + fitAddons[tabId] = fitAddon; +} +function tryLoadCanvas(term) { + try { + const canvasAddon = new addonCanvasExports.CanvasAddon(); + term.loadAddon(canvasAddon); + } catch (e) { + console.warn("Canvas renderer failed to initialize, using default DOM renderer:", e); + } +} +function flushSync(term) { + if (!term || !term._core) return; + if (term._core._renderService) { + const debouncer = term._core._renderService._renderDebouncer; + if (debouncer && typeof debouncer._innerRefresh === "function") { + if (debouncer._animationFrame) { + window.cancelAnimationFrame(debouncer._animationFrame); + debouncer._animationFrame = void 0; + } + debouncer._innerRefresh(); + } + } + if (term._core.viewport) { + const vp = term._core.viewport; + if (vp._refreshAnimationFrame) { + window.cancelAnimationFrame(vp._refreshAnimationFrame); + vp._refreshAnimationFrame = void 0; + } + if (typeof vp._innerRefresh === "function") vp._innerRefresh(); + } + if (term._core._selectionService) { + const sel = term._core._selectionService; + if (sel._refreshAnimationFrame) { + window.cancelAnimationFrame(sel._refreshAnimationFrame); + sel._refreshAnimationFrame = void 0; + } + if (typeof sel._refresh === "function") sel._refresh(); + } +} +function writeSync(term, data) { + if (!term) return; + if (term._core && term._core._writeBuffer && typeof term._core._writeBuffer.writeSync === "function") term._core._writeBuffer.writeSync(data); + else term.write(data); +} +function writeAndFlushSync(term, data) { + writeSync(term, data); + flushSync(term); +} +function switchTab(tabId) { + if (!terminals[tabId]) return; + activeTabId = tabId; + document.querySelectorAll(".tab").forEach((btn) => { + btn.classList.toggle("active", btn.getAttribute("data-tab") === tabId); + }); + document.querySelectorAll(".terminal-pane").forEach((pane) => { + pane.classList.toggle("active", pane.id === `pane-${tabId}`); + }); + fitAddons[tabId].fit(); + const term = terminals[tabId]; + term.focus(); + if (term._core && term._core._renderService) { + const rs = term._core._renderService; + if (rs._isPaused) { + rs._isPaused = false; + if (rs._charSizeService && !rs._charSizeService.hasValidSize) rs._charSizeService.measure(); + if (rs._needsFullRefresh) { + if (rs._pausedResizeTask && typeof rs._pausedResizeTask.flush === "function") rs._pausedResizeTask.flush(); + rs.refreshRows(0, rs._rowCount - 1); + rs._needsFullRefresh = false; + } + } + } + flushSync(term); +} +async function finishStep() { + for (let i = 0; i < 10; i++) await Promise.resolve(); + let drainLimit = 300; + while ((window.__activeTimers.size > 0 || window.__activeBitmaps.size > 0 || window.__activeObservers && window.__activeObservers.size > 0) && drainLimit-- > 0) { + if (window.__activeBitmaps.size > 0) await Promise.all(Array.from(window.__activeBitmaps)); + Object.values(terminals).forEach((term) => flushSync(term)); + await new Promise((resolve) => setTimeout(resolve, 0)); + } + for (let i = 0; i < 20; i++) await Promise.resolve(); + Object.values(terminals).forEach((term) => flushSync(term)); + window.dispatchEvent(new CustomEvent("step-complete")); +} +async function dumpAndScroll() { + switchTab("build"); + const term = terminals.build; + if (!term) { + await finishStep(); + return; + } + term.clear(); + const limit = Math.min(75, buildLogChunks.length); + for (let i = 0; i < limit; i++) writeSync(term, buildLogChunks[i]); + flushSync(term); + term.scrollToTop(); + flushSync(term); + for (let i = 0; i < 10; i++) { + term.scrollLines(50); + flushSync(term); + } + term.scrollToBottom(); + flushSync(term); + term.select(0, 10, 80); + flushSync(term); + term.clearSelection(); + flushSync(term); + await finishStep(); +} +async function hoverInlineLinks() { + switchTab("links"); + const term = terminals.links; + if (!term) { + await finishStep(); + return; + } + term.clear(); + const limit = Math.min(40, linksChunks.length); + for (let i = 0; i < limit; i++) writeSync(term, linksChunks[i]); + flushSync(term); + const screenElement = term.element ? term.element.querySelector(".xterm-screen") : null; + if (screenElement) { + const rect = screenElement.getBoundingClientRect(); + const stepY = rect.height / 25; + const stepX = rect.width / 4; + for (let row = 1; row <= 10; row++) { + for (let col = 1; col <= 3; col++) { + const clientX = rect.left + col * stepX; + const clientY = rect.top + row * stepY; + const moveEvent = new MouseEvent("mousemove", { + view: window, + bubbles: true, + cancelable: true, + clientX, + clientY + }); + screenElement.dispatchEvent(moveEvent); + flushSync(term); + } + } + } + await finishStep(); +} +async function ncursesColorUI() { + switchTab("ncurses"); + const term = terminals.ncurses; + if (!term) { + await finishStep(); + return; + } + for (let i = 0; i < ncursesFrames.length; i++) writeAndFlushSync(term, ncursesFrames[i]); + term.refresh(0, term.rows - 1); + flushSync(term); + await finishStep(); +} +async function switchTabsAndResize() { + const tabs = ["build", "links"]; + const container = document.getElementById("terminal-container"); + for (let cycle = 0; cycle < 1; cycle++) { + for (let i = 0; i < tabs.length; i++) { + const tabId = tabs[i]; + container.style.width = i === 0 ? "95%" : "100%"; + switchTab(tabId); + writeAndFlushSync(terminals[tabId], `\x1B[2m[Tab switched to ${tabId} at ${Date.now()}]\x1B[0m\r +`); + } + } + container.style.width = "100%"; + switchTab("build"); + await finishStep(); +} +function layoutCheck() { + const body = document.body.getBoundingClientRect(); + layoutCheck.e = document.elementFromPoint(body.width / 2 | 0, body.height / 2 | 0); +} +window.addEventListener("DOMContentLoaded", () => { + initTerminals(); + document.querySelectorAll(".tab").forEach((btn) => { + btn.addEventListener("click", () => { + switchTab(btn.getAttribute("data-tab")); + }); + }); + document.getElementById("btn-init").addEventListener("click", initTerminals); + document.getElementById("btn-dump-scroll").addEventListener("click", dumpAndScroll); + document.getElementById("btn-hover-links").addEventListener("click", hoverInlineLinks); + document.getElementById("btn-ncurses").addEventListener("click", ncursesColorUI); + document.getElementById("btn-switch-tabs").addEventListener("click", switchTabsAndResize); + document.getElementById("btn-layout").addEventListener("click", layoutCheck); + window.addEventListener("resize", () => { + fitAddons[activeTabId].fit(); + }); +}); +window.terminalBenchmark = { + init: initTerminals, + dumpAndScroll, + hoverInlineLinks, + ncursesColorUI, + switchTabsAndResize, + layout: layoutCheck, + switchTab, + terminals, + fitAddons +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9BY2Nlc3NpYmlsaXR5TWFuYWdlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9DbGlwYm9hcmQudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0xpZmVjeWNsZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9MaW5raWZpZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvTG9jYWxpemFibGVTdHJpbmdzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL09zY0xpbmtQcm92aWRlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9SZW5kZXJEZWJvdW5jZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvVGVybWluYWwudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvVGltZUJhc2VkRGVib3VuY2VyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL1ZpZXdwb3J0LnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL2RlY29yYXRpb25zL0J1ZmZlckRlY29yYXRpb25SZW5kZXJlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9kZWNvcmF0aW9ucy9Db2xvclpvbmVTdG9yZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9kZWNvcmF0aW9ucy9PdmVydmlld1J1bGVyUmVuZGVyZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvaW5wdXQvQ29tcG9zaXRpb25IZWxwZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvaW5wdXQvTW91c2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvaW5wdXQvTW92ZVRvQ2VsbC50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9yZW5kZXJlci9kb20vRG9tUmVuZGVyZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvZG9tL0RvbVJlbmRlcmVyUm93RmFjdG9yeS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9yZW5kZXJlci9kb20vV2lkdGhDYWNoZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9TZWxlY3Rpb25SZW5kZXJNb2RlbC50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZWxlY3Rpb24vU2VsZWN0aW9uTW9kZWwudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvQ2hhclNpemVTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL0NoYXJhY3RlckpvaW5lclNlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvQ29yZUJyb3dzZXJTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL0xpbmtQcm92aWRlclNlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvTW91c2VTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL1JlbmRlclNlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvU2VsZWN0aW9uU2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9DaXJjdWxhckxpc3QudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9DbG9uZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL0NvbG9yLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vQ29yZVRlcm1pbmFsLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vRXZlbnRFbWl0dGVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vSW5wdXRIYW5kbGVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9QbGF0Zm9ybS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL1NvcnRlZExpc3QudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9UYXNrUXVldWUudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9XaW5kb3dzTW9kZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL0J1ZmZlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9CdWZmZXJMaW5lLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL0J1ZmZlclJhbmdlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL0J1ZmZlclJlZmxvdy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9CdWZmZXJTZXQudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQ2VsbERhdGEudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL01hcmtlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL2RhdGEvQ2hhcnNldHMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9kYXRhL0VzY2FwZVNlcXVlbmNlcy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL2lucHV0L0tleWJvYXJkLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vaW5wdXQvVGV4dERlY29kZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9pbnB1dC9Vbmljb2RlVjYudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9pbnB1dC9Xcml0ZUJ1ZmZlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL2lucHV0L1hQYXJzZUNvbG9yLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcGFyc2VyL0NvbnN0YW50cy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3BhcnNlci9EY3NQYXJzZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wYXJzZXIvRXNjYXBlU2VxdWVuY2VQYXJzZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wYXJzZXIvT3NjUGFyc2VyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcGFyc2VyL1BhcmFtcy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9BZGRvbk1hbmFnZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wdWJsaWMvQnVmZmVyQXBpVmlldy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9CdWZmZXJMaW5lQXBpVmlldy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9CdWZmZXJOYW1lc3BhY2VBcGkudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wdWJsaWMvUGFyc2VyQXBpLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcHVibGljL1VuaWNvZGVBcGkudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9CdWZmZXJTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvQ2hhcnNldFNlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9Db3JlTW91c2VTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvQ29yZVNlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9EZWNvcmF0aW9uU2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL0luc3RhbnRpYXRpb25TZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvTG9nU2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL09wdGlvbnNTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvT3NjTGlua1NlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi93ZWJwYWNrOi9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0veHRlcm0vbGliL3dlYnBhY2s6L0B4dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL1VuaWNvZGVTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3dlYnBhY2svYm9vdHN0cmFwIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9saWIvd2VicGFjazovQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3B1YmxpYy9UZXJtaW5hbC50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tZml0L2xpYi93ZWJwYWNrOi9GaXRBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWZpdC9saWIvd2VicGFjazovRml0QWRkb24vc3JjL0ZpdEFkZG9uLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWItbGlua3MvbGliL3dlYnBhY2s6L1dlYkxpbmtzQWRkb24vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWItbGlua3MvbGliL3dlYnBhY2s6L1dlYkxpbmtzQWRkb24vc3JjL1dlYkxpbmtQcm92aWRlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViLWxpbmtzL2xpYi93ZWJwYWNrOi9XZWJMaW5rc0FkZG9uL3dlYnBhY2svYm9vdHN0cmFwIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWItbGlua3MvbGliL3dlYnBhY2s6L1dlYkxpbmtzQWRkb24vc3JjL1dlYkxpbmtzQWRkb24udHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvd2VicGFjazovQ2FudmFzQWRkb24vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3dlYnBhY2s6L0NhbnZhc0FkZG9uL3NyYy9CYXNlUmVuZGVyTGF5ZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvd2VicGFjazovQ2FudmFzQWRkb24vc3JjL0NhbnZhc1JlbmRlcmVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3dlYnBhY2s6L0NhbnZhc0FkZG9uL3NyYy9DdXJzb3JSZW5kZXJMYXllci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi93ZWJwYWNrOi9DYW52YXNBZGRvbi9zcmMvR3JpZENhY2hlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3dlYnBhY2s6L0NhbnZhc0FkZG9uL3NyYy9MaW5rUmVuZGVyTGF5ZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvd2VicGFjazovQ2FudmFzQWRkb24vc3JjL1NlbGVjdGlvblJlbmRlckxheWVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3dlYnBhY2s6L0NhbnZhc0FkZG9uL3NyYy9UZXh0UmVuZGVyTGF5ZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NlbGxDb2xvclJlc29sdmVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNDYWNoZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzVXRpbHMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0N1c3RvbUdseXBocy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvRGV2aWNlUGl4ZWxPYnNlcnZlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvU2VsZWN0aW9uUmVuZGVyTW9kZWwudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1RleHR1cmVBdGxhcy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9jb21tb24vQ29sb3IudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2NvbW1vbi9FdmVudEVtaXR0ZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2NvbW1vbi9MaWZlY3ljbGUudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2NvbW1vbi9NdWx0aUtleU1hcC50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tY2FudmFzL2xpYi9zcmMvY29tbW9uL1BsYXRmb3JtLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9jb21tb24vVGFza1F1ZXVlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9jb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2NvbW1vbi9idWZmZXIvQ2VsbERhdGEudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9jb21tb24vaW5wdXQvVGV4dERlY29kZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvc3JjL2NvbW1vbi9zZXJ2aWNlcy9Mb2dTZXJ2aWNlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1jYW52YXMvbGliL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZXMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvd2VicGFjazovQ2FudmFzQWRkb24vd2VicGFjay9ib290c3RyYXAiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWNhbnZhcy9saWIvd2VicGFjazovQ2FudmFzQWRkb24vc3JjL0NhbnZhc0FkZG9uLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvd2VicGFjazovV2ViZ2xBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi93ZWJwYWNrOi9XZWJnbEFkZG9uL3NyYy9HbHlwaFJlbmRlcmVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvd2VicGFjazovV2ViZ2xBZGRvbi9zcmMvUmVjdGFuZ2xlUmVuZGVyZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi93ZWJwYWNrOi9XZWJnbEFkZG9uL3NyYy9SZW5kZXJNb2RlbC50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3dlYnBhY2s6L1dlYmdsQWRkb24vc3JjL1dlYmdsUmVuZGVyZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi93ZWJwYWNrOi9XZWJnbEFkZG9uL3NyYy9XZWJnbFV0aWxzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvd2VicGFjazovV2ViZ2xBZGRvbi9zcmMvcmVuZGVyTGF5ZXIvQmFzZVJlbmRlckxheWVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvd2VicGFjazovV2ViZ2xBZGRvbi9zcmMvcmVuZGVyTGF5ZXIvTGlua1JlbmRlckxheWVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvTGlmZWN5Y2xlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NlbGxDb2xvclJlc29sdmVyLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc0NhY2hlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc1V0aWxzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DdXJzb3JCbGlua1N0YXRlTWFuYWdlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DdXN0b21HbHlwaHMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvRGV2aWNlUGl4ZWxPYnNlcnZlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1NlbGVjdGlvblJlbmRlck1vZGVsLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1RleHR1cmVBdGxhcy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vQ29sb3IudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi9zcmMvY29tbW9uL0V2ZW50RW1pdHRlci50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvc3JjL2NvbW1vbi9NdWx0aUtleU1hcC50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vUGxhdGZvcm0udHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi9zcmMvY29tbW9uL1Rhc2tRdWV1ZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi9zcmMvY29tbW9uL2J1ZmZlci9DZWxsRGF0YS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vYnVmZmVyL0NvbnN0YW50cy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vaW5wdXQvVGV4dERlY29kZXIudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi9zcmMvY29tbW9uL3NlcnZpY2VzL0xvZ1NlcnZpY2UudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi9zcmMvY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvbGliL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZXMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL2xpYi93ZWJwYWNrOi9XZWJnbEFkZG9uL3dlYnBhY2svYm9vdHN0cmFwIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9saWIvd2VicGFjazovV2ViZ2xBZGRvbi9zcmMvV2ViZ2xBZGRvbi50cyIsIi4uLy4uL3Nlc3Npb25zLmpzIiwiLi4vLi4vYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KShnbG9iYWxUaGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgKiBhcyBTdHJpbmdzIGZyb20gJ2Jyb3dzZXIvTG9jYWxpemFibGVTdHJpbmdzJztcbmltcG9ydCB7IElUZXJtaW5hbCwgSVJlbmRlckRlYm91bmNlciB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgVGltZUJhc2VkRGVib3VuY2VyIH0gZnJvbSAnYnJvd3Nlci9UaW1lQmFzZWREZWJvdW5jZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUluc3RhbnRpYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcblxuY29uc3QgTUFYX1JPV1NfVE9fUkVBRCA9IDIwO1xuXG5jb25zdCBlbnVtIEJvdW5kYXJ5UG9zaXRpb24ge1xuICBUT1AsXG4gIEJPVFRPTVxufVxuXG4vLyBUdXJuIHRoaXMgb24gdG8gdW5oaWRlIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgYW5kIGRpc3BsYXkgaXQgdW5kZXJcbi8vIChpbnN0ZWFkIG9mIG92ZXJsYXBwaW5nIHdpdGgpIHRoZSB0ZXJtaW5hbC5cbmNvbnN0IERFQlVHID0gZmFsc2U7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIF9kZWJ1Z1Jvb3RDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICBwcml2YXRlIF9yb3dDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9yb3dFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfcm93Q29sdW1uczogV2Vha01hcDxIVE1MRWxlbWVudCwgbnVtYmVyW10+ID0gbmV3IFdlYWtNYXAoKTtcblxuICBwcml2YXRlIF9saXZlUmVnaW9uOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfbGl2ZVJlZ2lvbkxpbmVDb3VudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGl2ZVJlZ2lvbkRlYm91bmNlcjogSVJlbmRlckRlYm91bmNlcjtcblxuICBwcml2YXRlIF90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIF9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGlzIHF1ZXVlIGhhcyBhIGNoYXJhY3RlciBwdXNoZWQgdG8gaXQgZm9yIGtleXMgdGhhdCBhcmUgcHJlc3NlZCwgaWYgdGhlXG4gICAqIG5leHQgY2hhcmFjdGVyIGFkZGVkIHRvIHRoZSB0ZXJtaW5hbCBpcyBlcXVhbCB0byB0aGUga2V5IGNoYXIgdGhlbiBpdCBpc1xuICAgKiBub3QgYW5ub3VuY2VkIChhZGRlZCB0byBsaXZlIHJlZ2lvbikgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGFubm91bmNlZFxuICAgKiBieSB0aGUgdGV4dGFyZWEgZXZlbnQgKHdoaWNoIGNhbm5vdCBiZSBjYW5jZWxlZCkuIFRoZXJlIGFyZSBzb21lIHJhY2VcbiAgICogY29uZGl0aW9uIGNhc2VzIGlmIHRoZXJlIGlzIHR5cGluZyB3aGlsZSBkYXRhIGlzIHN0cmVhbWluZywgYnV0IHRoaXMgY292ZXJzXG4gICAqIHRoZSBtYWluIGNhc2Ugb2YgdHlwaW5nIGludG8gdGhlIHByb21wdCBhbmQgaW5wdXR0aW5nIHRoZSBhbnN3ZXIgdG8gYVxuICAgKiBxdWVzdGlvbiAoWS9OLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgX2NoYXJzVG9Db25zdW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2NoYXJzVG9Bbm5vdW5jZTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IElUZXJtaW5hbCxcbiAgICBASUluc3RhbnRpYXRpb25TZXJ2aWNlIGluc3RhbnRpYXRpb25TZXJ2aWNlOiBJSW5zdGFudGlhdGlvblNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0tYWNjZXNzaWJpbGl0eScpO1xuXG4gICAgdGhpcy5fcm93Q29udGFpbmVyID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2xpc3QnKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0tYWNjZXNzaWJpbGl0eS10cmVlJyk7XG4gICAgdGhpcy5fcm93RWxlbWVudHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Rlcm1pbmFsLnJvd3M7IGkrKykge1xuICAgICAgdGhpcy5fcm93RWxlbWVudHNbaV0gPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb3dFbGVtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyID0gZSA9PiB0aGlzLl9oYW5kbGVCb3VuZGFyeUZvY3VzKGUsIEJvdW5kYXJ5UG9zaXRpb24uVE9QKTtcbiAgICB0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIgPSBlID0+IHRoaXMuX2hhbmRsZUJvdW5kYXJ5Rm9jdXMoZSwgQm91bmRhcnlQb3NpdGlvbi5CT1RUT00pO1xuICAgIHRoaXMuX3Jvd0VsZW1lbnRzWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICB0aGlzLl9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3Jvd0NvbnRhaW5lcik7XG5cbiAgICB0aGlzLl9saXZlUmVnaW9uID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9saXZlUmVnaW9uLmNsYXNzTGlzdC5hZGQoJ2xpdmUtcmVnaW9uJyk7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdhc3NlcnRpdmUnKTtcbiAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2xpdmVSZWdpb24pO1xuICAgIHRoaXMuX2xpdmVSZWdpb25EZWJvdW5jZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBUaW1lQmFzZWREZWJvdW5jZXIodGhpcy5fcmVuZGVyUm93cy5iaW5kKHRoaXMpKSk7XG5cbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGJlZm9yZSBUZXJtaW5hbC5vcGVuJyk7XG4gICAgfVxuXG4gICAgaWYgKERFQlVHKSB7XG4gICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2RlYnVnJyk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVidWcnKTtcblxuICAgICAgLy8gVXNlIGEgYDxkaXYgY2xhc3M9XCJ4dGVybVwiPmAgY29udGFpbmVyIHNvIHRoYXQgdGhlIGNzcyB3aWxsIHN0aWxsIGFwcGx5LlxuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0nKTtcblxuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCctLS0tLS1zdGFydCBhMTF5LS0tLS0tJykpO1xuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIpO1xuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCctLS0tLS1lbmQgYTExeS0tLS0tLScpKTtcblxuICAgICAgdGhpcy5fdGVybWluYWwuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5fZGVidWdSb290Q29udGFpbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVybWluYWwuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uUmVzaXplKGUgPT4gdGhpcy5faGFuZGxlUmVzaXplKGUucm93cykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uUmVuZGVyKGUgPT4gdGhpcy5fcmVmcmVzaFJvd3MoZS5zdGFydCwgZS5lbmQpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vblNjcm9sbCgoKSA9PiB0aGlzLl9yZWZyZXNoUm93cygpKSk7XG4gICAgLy8gTGluZSBmZWVkIGlzIGFuIGlzc3VlIGFzIHRoZSBwcm9tcHQgd29uJ3QgYmUgcmVhZCBvdXQgYWZ0ZXIgYSBjb21tYW5kIGlzIHJ1blxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25BMTF5Q2hhcihjaGFyID0+IHRoaXMuX2hhbmRsZUNoYXIoY2hhcikpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uTGluZUZlZWQoKCkgPT4gdGhpcy5faGFuZGxlQ2hhcignXFxuJykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uQTExeVRhYihzcGFjZUNvdW50ID0+IHRoaXMuX2hhbmRsZVRhYihzcGFjZUNvdW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25LZXkoZSA9PiB0aGlzLl9oYW5kbGVLZXkoZS5rZXkpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbkJsdXIoKCkgPT4gdGhpcy5fY2xlYXJMaXZlUmVnaW9uKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25EaW1lbnNpb25zQ2hhbmdlKCgpID0+IHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIoZG9jdW1lbnQsICdzZWxlY3Rpb25jaGFuZ2UnLCAoKSA9PiB0aGlzLl9oYW5kbGVTZWxlY3Rpb25DaGFuZ2UoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm9uRHByQ2hhbmdlKCgpID0+IHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpKSk7XG5cbiAgICB0aGlzLl9yZWZyZXNoUm93cygpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIGlmIChERUJVRykge1xuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIhLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCA9IDA7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiKHNwYWNlQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhY2VDb3VudDsgaSsrKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDaGFyKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2hhcihjaGFyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCA8IE1BWF9ST1dTX1RPX1JFQUQgKyAxKSB7XG4gICAgICBpZiAodGhpcy5fY2hhcnNUb0NvbnN1bWUubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBIYXZlIHRoZSBzY3JlZW4gcmVhZGVyIGlnbm9yZSB0aGUgY2hhciBpZiBpdCB3YXMganVzdCBpbnB1dFxuICAgICAgICBjb25zdCBzaGlmdGVkQ2hhciA9IHRoaXMuX2NoYXJzVG9Db25zdW1lLnNoaWZ0KCk7XG4gICAgICAgIGlmIChzaGlmdGVkQ2hhciAhPT0gY2hhcikge1xuICAgICAgICAgIHRoaXMuX2NoYXJzVG9Bbm5vdW5jZSArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jaGFyc1RvQW5ub3VuY2UgKz0gY2hhcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQrKztcbiAgICAgICAgaWYgKHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQgPT09IE1BWF9ST1dTX1RPX1JFQUQgKyAxKSB7XG4gICAgICAgICAgdGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCArPSBTdHJpbmdzLnRvb011Y2hPdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckxpdmVSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCA9ICcnO1xuICAgIHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5KGtleUNoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyTGl2ZVJlZ2lvbigpO1xuICAgIC8vIE9ubHkgYWRkIHRoZSBjaGFyIGlmIHRoZXJlIGlzIG5vIGNvbnRyb2wgY2hhcmFjdGVyLlxuICAgIGlmICghL1xccHtDb250cm9sfS91LnRlc3Qoa2V5Q2hhcikpIHtcbiAgICAgIHRoaXMuX2NoYXJzVG9Db25zdW1lLnB1c2goa2V5Q2hhcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd3Moc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xpdmVSZWdpb25EZWJvdW5jZXIucmVmcmVzaChzdGFydCwgZW5kLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXI6IElCdWZmZXIgPSB0aGlzLl90ZXJtaW5hbC5idWZmZXI7XG4gICAgY29uc3Qgc2V0U2l6ZSA9IGJ1ZmZlci5saW5lcy5sZW5ndGgudG9TdHJpbmcoKTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGJ1ZmZlci55ZGlzcCArIGkpO1xuICAgICAgY29uc3QgY29sdW1uczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGxpbmVEYXRhID0gbGluZT8udHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbHVtbnMpIHx8ICcnO1xuICAgICAgY29uc3QgcG9zSW5TZXQgPSAoYnVmZmVyLnlkaXNwICsgaSArIDEpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHNbaV07XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBpZiAobGluZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWxlbWVudC5pbm5lclRleHQgPSAnXFx1MDBhMCc7XG4gICAgICAgICAgdGhpcy5fcm93Q29sdW1ucy5zZXQoZWxlbWVudCwgWzAsIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gbGluZURhdGE7XG4gICAgICAgICAgdGhpcy5fcm93Q29sdW1ucy5zZXQoZWxlbWVudCwgY29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcG9zaW5zZXQnLCBwb3NJblNldCk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNldHNpemUnLCBzZXRTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYW5ub3VuY2VDaGFyYWN0ZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIF9hbm5vdW5jZUNoYXJhY3RlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoYXJzVG9Bbm5vdW5jZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCArPSB0aGlzLl9jaGFyc1RvQW5ub3VuY2U7XG4gICAgdGhpcy5fY2hhcnNUb0Fubm91bmNlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVCb3VuZGFyeUZvY3VzKGU6IEZvY3VzRXZlbnQsIHBvc2l0aW9uOiBCb3VuZGFyeVBvc2l0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgYm91bmRhcnlFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgYmVmb3JlQm91bmRhcnlFbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHNbcG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gMSA6IHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAtIDJdO1xuXG4gICAgLy8gRG9uJ3Qgc2Nyb2xsIGlmIHRoZSBidWZmZXIgdG9wIGhhcyByZWFjaGVkIHRoZSBlbmQgaW4gdGhhdCBkaXJlY3Rpb25cbiAgICBjb25zdCBwb3NJblNldCA9IGJvdW5kYXJ5RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtcG9zaW5zZXQnKTtcbiAgICBjb25zdCBsYXN0Um93UG9zID0gcG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gJzEnIDogYCR7dGhpcy5fdGVybWluYWwuYnVmZmVyLmxpbmVzLmxlbmd0aH1gO1xuICAgIGlmIChwb3NJblNldCA9PT0gbGFzdFJvd1Bvcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvbid0IHNjcm9sbCB3aGVuIHRoZSBsYXN0IGZvY3VzZWQgaXRlbSB3YXMgbm90IHRoZSBzZWNvbmQgcm93IChmb2N1cyBpcyBnb2luZyB0aGUgb3RoZXJcbiAgICAvLyBkaXJlY3Rpb24pXG4gICAgaWYgKGUucmVsYXRlZFRhcmdldCAhPT0gYmVmb3JlQm91bmRhcnlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG9sZCBib3VuZGFyeSBlbGVtZW50IGZyb20gYXJyYXlcbiAgICBsZXQgdG9wQm91bmRhcnlFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBsZXQgYm90dG9tQm91bmRhcnlFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBpZiAocG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QKSB7XG4gICAgICB0b3BCb3VuZGFyeUVsZW1lbnQgPSBib3VuZGFyeUVsZW1lbnQ7XG4gICAgICBib3R0b21Cb3VuZGFyeUVsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50cy5wb3AoKSE7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQoYm90dG9tQm91bmRhcnlFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9wQm91bmRhcnlFbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHMuc2hpZnQoKSE7XG4gICAgICBib3R0b21Cb3VuZGFyeUVsZW1lbnQgPSBib3VuZGFyeUVsZW1lbnQ7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQodG9wQm91bmRhcnlFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIGZyb20gb2xkIGJvdW5kYXJ5IGVsZW1lbnRzXG4gICAgdG9wQm91bmRhcnlFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcbiAgICBib3R0b21Cb3VuZGFyeUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIpO1xuXG4gICAgLy8gQWRkIG5ldyBlbGVtZW50IHRvIGFycmF5L0RPTVxuICAgIGlmIChwb3NpdGlvbiA9PT0gQm91bmRhcnlQb3NpdGlvbi5UT1ApIHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLnVuc2hpZnQobmV3RWxlbWVudCk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgbmV3RWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLnB1c2gobmV3RWxlbWVudCk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGxpc3RlbmVycyB0byBuZXcgYm91bmRhcnkgZWxlbWVudHNcbiAgICB0aGlzLl9yb3dFbGVtZW50c1swXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG4gICAgdGhpcy5fcm93RWxlbWVudHNbdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoIC0gMV0uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIpO1xuXG4gICAgLy8gU2Nyb2xsIHVwXG4gICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsTGluZXMocG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gLTEgOiAxKTtcblxuICAgIC8vIEZvY3VzIG5ldyBib3VuZGFyeSBiZWZvcmUgZWxlbWVudFxuICAgIHRoaXMuX3Jvd0VsZW1lbnRzW3Bvc2l0aW9uID09PSBCb3VuZGFyeVBvc2l0aW9uLlRPUCA/IDEgOiB0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAyXS5mb2N1cygpO1xuXG4gICAgLy8gUHJldmVudCB0aGUgc3RhbmRhcmQgYmVoYXZpb3JcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVNlbGVjdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm93RWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG4gICAgICAvLyBPbmx5IGRvIHNvbWV0aGluZyB3aGVuIHRoZSBhbmNob3JOb2RlIGlzIGluc2lkZSB0aGUgcm93IGNvbnRhaW5lci4gVGhpc1xuICAgICAgLy8gYmVoYXZpb3IgbWlycm9ycyB3aGF0IHdlIGRvIHdpdGggbW91c2UgLS0tIGlmIHRoZSBtb3VzZSBjbGlja3NcbiAgICAgIC8vIHNvbWV3aGVyZSBvdXRzaWRlIG9mIHRoZSB0ZXJtaW5hbCwgd2UgZG9uJ3QgY2xlYXIgdGhlIHNlbGVjdGlvbi5cbiAgICAgIGlmICh0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSB8fCAhc2VsZWN0aW9uLmZvY3VzTm9kZSkge1xuICAgICAgY29uc29sZS5lcnJvcignYW5jaG9yTm9kZSBhbmQvb3IgZm9jdXNOb2RlIGFyZSBudWxsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgdHdvIHNlbGVjdGlvbiBwb2ludHMgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgbGV0IGJlZ2luID0geyBub2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSwgb2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IH07XG4gICAgbGV0IGVuZCA9IHsgbm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSwgb2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgfTtcbiAgICBpZiAoKGJlZ2luLm5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZW5kLm5vZGUpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHx8IChiZWdpbi5ub2RlID09PSBlbmQubm9kZSAmJiBiZWdpbi5vZmZzZXQgPiBlbmQub2Zmc2V0KSApIHtcbiAgICAgIFtiZWdpbiwgZW5kXSA9IFtlbmQsIGJlZ2luXTtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCBiZWdpbi9lbmQgdG8gdGhlIGluc2lkZSBvZiB0aGUgcm93IGNvbnRhaW5lci5cbiAgICBpZiAoYmVnaW4ubm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLl9yb3dFbGVtZW50c1swXSkgJiAoTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgfCBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykpIHtcbiAgICAgIGJlZ2luID0geyBub2RlOiB0aGlzLl9yb3dFbGVtZW50c1swXS5jaGlsZE5vZGVzWzBdLCBvZmZzZXQ6IDAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoYmVnaW4ubm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGBiZWdpbmAgaXMgYmVsb3cgdGhlIGxhc3Qgcm93LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0Um93RWxlbWVudCA9IHRoaXMuX3Jvd0VsZW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAoZW5kLm5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obGFzdFJvd0VsZW1lbnQpICYgKE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZIHwgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpKSB7XG4gICAgICBlbmQgPSB7XG4gICAgICAgIG5vZGU6IGxhc3RSb3dFbGVtZW50LFxuICAgICAgICBvZmZzZXQ6IGxhc3RSb3dFbGVtZW50LnRleHRDb250ZW50Py5sZW5ndGggPz8gMFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoZW5kLm5vZGUpKSB7XG4gICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBgZW5kYCBpcyBhYm92ZSB0aGUgZmlyc3Qgcm93LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvUm93Q29sdW1uID0gKHsgbm9kZSwgb2Zmc2V0IH06IHR5cGVvZiBiZWdpbik6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9IHwgbnVsbCA9PiB7XG4gICAgICAvLyBgbm9kZWAgaXMgZWl0aGVyIHRoZSByb3cgZWxlbWVudCBvciB0aGUgVGV4dCBub2RlIGluc2lkZSBpdC5cbiAgICAgIGNvbnN0IHJvd0VsZW1lbnQ6IGFueSA9IG5vZGUgaW5zdGFuY2VvZiBUZXh0ID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZTtcbiAgICAgIGxldCByb3cgPSBwYXJzZUludChyb3dFbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ2FyaWEtcG9zaW5zZXQnKSwgMTApIC0gMTtcbiAgICAgIGlmIChpc05hTihyb3cpKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybigncm93IGlzIGludmFsaWQuIFJhY2UgY29uZGl0aW9uPycpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX3Jvd0NvbHVtbnMuZ2V0KHJvd0VsZW1lbnQpO1xuICAgICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignY29sdW1ucyBpcyBudWxsLiBSYWNlIGNvbmRpdGlvbj8nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb2x1bW4gPSBvZmZzZXQgPCBjb2x1bW5zLmxlbmd0aCA/IGNvbHVtbnNbb2Zmc2V0XSA6IGNvbHVtbnMuc2xpY2UoLTEpWzBdICsgMTtcbiAgICAgIGlmIChjb2x1bW4gPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICArK3JvdztcbiAgICAgICAgY29sdW1uID0gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvdyxcbiAgICAgICAgY29sdW1uXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBiZWdpblJvd0NvbHVtbiA9IHRvUm93Q29sdW1uKGJlZ2luKTtcbiAgICBjb25zdCBlbmRSb3dDb2x1bW4gPSB0b1Jvd0NvbHVtbihlbmQpO1xuXG4gICAgaWYgKCFiZWdpblJvd0NvbHVtbiB8fCAhZW5kUm93Q29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJlZ2luUm93Q29sdW1uLnJvdyA+IGVuZFJvd0NvbHVtbi5yb3cgfHwgKGJlZ2luUm93Q29sdW1uLnJvdyA9PT0gZW5kUm93Q29sdW1uLnJvdyAmJiBiZWdpblJvd0NvbHVtbi5jb2x1bW4gPj0gZW5kUm93Q29sdW1uLmNvbHVtbikpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHdlIGhhdmUgc29tZSBidWdzLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJhbmdlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdGVybWluYWwuc2VsZWN0KFxuICAgICAgYmVnaW5Sb3dDb2x1bW4uY29sdW1uLFxuICAgICAgYmVnaW5Sb3dDb2x1bW4ucm93LFxuICAgICAgKGVuZFJvd0NvbHVtbi5yb3cgLSBiZWdpblJvd0NvbHVtbi5yb3cpICogdGhpcy5fdGVybWluYWwuY29scyAtIGJlZ2luUm93Q29sdW1uLmNvbHVtbiArIGVuZFJvd0NvbHVtbi5jb2x1bW5cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlUmVzaXplKHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBib3R0b20gYm91bmRhcnkgbGlzdGVuZXJcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICAvLyBHcm93IHJvd3MgYXMgcmVxdWlyZWRcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fcm93Q29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IHRoaXMuX3Rlcm1pbmFsLnJvd3M7IGkrKykge1xuICAgICAgdGhpcy5fcm93RWxlbWVudHNbaV0gPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb3dFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIC8vIFNocmluayByb3dzIGFzIHJlcXVpcmVkXG4gICAgd2hpbGUgKHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCA+IHJvd3MpIHtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLl9yb3dFbGVtZW50cy5wb3AoKSEpO1xuICAgIH1cblxuICAgIC8vIEFkZCBib3R0b20gYm91bmRhcnkgbGlzdGVuZXJcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICB0aGlzLl9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbGlzdGl0ZW0nKTtcbiAgICBlbGVtZW50LnRhYkluZGV4ID0gLTE7XG4gICAgdGhpcy5fcmVmcmVzaFJvd0RpbWVuc2lvbnMoZWxlbWVudCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd3NEaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIGlmICh0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggIT09IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90ZXJtaW5hbC5yb3dzOyBpKyspIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hSb3dEaW1lbnNpb25zKHRoaXMuX3Jvd0VsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd0RpbWVuc2lvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQ29yZVNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogUHJlcGFyZXMgdGV4dCB0byBiZSBwYXN0ZWQgaW50byB0aGUgdGVybWluYWwgYnkgbm9ybWFsaXppbmcgdGhlIGxpbmUgZW5kaW5nc1xuICogQHBhcmFtIHRleHQgVGhlIHBhc3RlZCB0ZXh0IHRoYXQgbmVlZHMgcHJvY2Vzc2luZyBiZWZvcmUgaW5zZXJ0aW5nIGludG8gdGhlIHRlcm1pbmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlVGV4dEZvclRlcm1pbmFsKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xccj9cXG4vZywgJ1xccicpO1xufVxuXG4vKipcbiAqIEJyYWNrZXQgdGV4dCBmb3IgcGFzdGUsIGlmIG5lY2Vzc2FyeSwgYXMgcGVyIGh0dHBzOi8vY2lydy5pbi9ibG9nL2JyYWNrZXRlZC1wYXN0ZVxuICogQHBhcmFtIHRleHQgVGhlIHBhc3RlZCB0ZXh0IHRvIGJyYWNrZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyYWNrZXRUZXh0Rm9yUGFzdGUodGV4dDogc3RyaW5nLCBicmFja2V0ZWRQYXN0ZU1vZGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoYnJhY2tldGVkUGFzdGVNb2RlKSB7XG4gICAgcmV0dXJuICdcXHgxYlsyMDB+JyArIHRleHQgKyAnXFx4MWJbMjAxfic7XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbi8qKlxuICogQmluZHMgY29weSBmdW5jdGlvbmFsaXR5IHRvIHRoZSBnaXZlbiB0ZXJtaW5hbC5cbiAqIEBwYXJhbSBldiBUaGUgb3JpZ2luYWwgY29weSBldmVudCB0byBiZSBoYW5kbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5SGFuZGxlcihldjogQ2xpcGJvYXJkRXZlbnQsIHNlbGVjdGlvblNlcnZpY2U6IElTZWxlY3Rpb25TZXJ2aWNlKTogdm9pZCB7XG4gIGlmIChldi5jbGlwYm9hcmREYXRhKSB7XG4gICAgZXYuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L3BsYWluJywgc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25UZXh0KTtcbiAgfVxuICAvLyBQcmV2ZW50IG9yIHRoZSBvcmlnaW5hbCB0ZXh0IHdpbGwgYmUgY29waWVkLlxuICBldi5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG4vKipcbiAqIFJlZGlyZWN0IHRoZSBjbGlwYm9hcmQncyBkYXRhIHRvIHRoZSB0ZXJtaW5hbCdzIGlucHV0IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXN0ZUV2ZW50KGV2OiBDbGlwYm9hcmRFdmVudCwgdGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQsIGNvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UpOiB2b2lkIHtcbiAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIGlmIChldi5jbGlwYm9hcmREYXRhKSB7XG4gICAgY29uc3QgdGV4dCA9IGV2LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xuICAgIHBhc3RlKHRleHQsIHRleHRhcmVhLCBjb3JlU2VydmljZSwgb3B0aW9uc1NlcnZpY2UpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXN0ZSh0ZXh0OiBzdHJpbmcsIHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LCBjb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlLCBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlKTogdm9pZCB7XG4gIHRleHQgPSBwcmVwYXJlVGV4dEZvclRlcm1pbmFsKHRleHQpO1xuICB0ZXh0ID0gYnJhY2tldFRleHRGb3JQYXN0ZSh0ZXh0LCBjb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlICYmIG9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlICE9PSB0cnVlKTtcbiAgY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudCh0ZXh0LCB0cnVlKTtcbiAgdGV4dGFyZWEudmFsdWUgPSAnJztcbn1cblxuLyoqXG4gKiBNb3ZlcyB0aGUgdGV4dGFyZWEgdW5kZXIgdGhlIG1vdXNlIGN1cnNvciBhbmQgZm9jdXNlcyBpdC5cbiAqIEBwYXJhbSBldiBUaGUgb3JpZ2luYWwgcmlnaHQgY2xpY2sgZXZlbnQgdG8gYmUgaGFuZGxlZC5cbiAqIEBwYXJhbSB0ZXh0YXJlYSBUaGUgdGVybWluYWwncyB0ZXh0YXJlYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVUZXh0QXJlYVVuZGVyTW91c2VDdXJzb3IoZXY6IE1vdXNlRXZlbnQsIHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LCBzY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gIC8vIENhbGN1bGF0ZSB0ZXh0YXJlYSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGVsZW1lbnRcbiAgY29uc3QgcG9zID0gc2NyZWVuRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgbGVmdCA9IGV2LmNsaWVudFggLSBwb3MubGVmdCAtIDEwO1xuICBjb25zdCB0b3AgPSBldi5jbGllbnRZIC0gcG9zLnRvcCAtIDEwO1xuXG4gIC8vIEJyaW5nIHRleHRhcmVhIGF0IHRoZSBjdXJzb3IgcG9zaXRpb25cbiAgdGV4dGFyZWEuc3R5bGUud2lkdGggPSAnMjBweCc7XG4gIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICcyMHB4JztcbiAgdGV4dGFyZWEuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICB0ZXh0YXJlYS5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICB0ZXh0YXJlYS5zdHlsZS56SW5kZXggPSAnMTAwMCc7XG5cbiAgdGV4dGFyZWEuZm9jdXMoKTtcbn1cblxuLyoqXG4gKiBCaW5kIHRvIHJpZ2h0LWNsaWNrIGV2ZW50IGFuZCBhbGxvdyByaWdodC1jbGljayBjb3B5IGFuZCBwYXN0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJpZ2h0Q2xpY2tIYW5kbGVyKGV2OiBNb3VzZUV2ZW50LCB0ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCwgc2NyZWVuRWxlbWVudDogSFRNTEVsZW1lbnQsIHNlbGVjdGlvblNlcnZpY2U6IElTZWxlY3Rpb25TZXJ2aWNlLCBzaG91bGRTZWxlY3RXb3JkOiBib29sZWFuKTogdm9pZCB7XG4gIG1vdmVUZXh0QXJlYVVuZGVyTW91c2VDdXJzb3IoZXYsIHRleHRhcmVhLCBzY3JlZW5FbGVtZW50KTtcblxuICBpZiAoc2hvdWxkU2VsZWN0V29yZCkge1xuICAgIHNlbGVjdGlvblNlcnZpY2UucmlnaHRDbGlja1NlbGVjdChldik7XG4gIH1cblxuICAvLyBHZXQgdGV4dGFyZWEgcmVhZHkgdG8gY29weSBmcm9tIHRoZSBjb250ZXh0IG1lbnVcbiAgdGV4dGFyZWEudmFsdWUgPSBzZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvblRleHQ7XG4gIHRleHRhcmVhLnNlbGVjdCgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgVHdvS2V5TWFwIH0gZnJvbSAnY29tbW9uL011bHRpS2V5TWFwJztcblxuZXhwb3J0IGNsYXNzIENvbG9yQ29udHJhc3RDYWNoZSBpbXBsZW1lbnRzIElDb2xvckNvbnRyYXN0Q2FjaGUge1xuICBwcml2YXRlIF9jb2xvcjogVHdvS2V5TWFwPC8qIGJnICovbnVtYmVyLCAvKiBmZyAqL251bWJlciwgSUNvbG9yIHwgbnVsbD4gPSBuZXcgVHdvS2V5TWFwKCk7XG4gIHByaXZhdGUgX2NzczogVHdvS2V5TWFwPC8qIGJnICovbnVtYmVyLCAvKiBmZyAqL251bWJlciwgc3RyaW5nIHwgbnVsbD4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2Nzcy5zZXQoYmcsIGZnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3NzKGJnOiBudW1iZXIsIGZnOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY3NzLmdldChiZywgZmcpO1xuICB9XG5cbiAgcHVibGljIHNldENvbG9yKGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIHZhbHVlOiBJQ29sb3IgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY29sb3Iuc2V0KGJnLCBmZywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldENvbG9yKGJnOiBudW1iZXIsIGZnOiBudW1iZXIpOiBJQ29sb3IgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3IuZ2V0KGJnLCBmZyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY29sb3IuY2xlYXIoKTtcbiAgICB0aGlzLl9jc3MuY2xlYXIoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQWRkcyBhIGRpc3Bvc2FibGUgbGlzdGVuZXIgdG8gYSBub2RlIGluIHRoZSBET00sIHJldHVybmluZyB0aGUgZGlzcG9zYWJsZS5cbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZCBhIGxpc3RlbmVyIHRvLlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmb3IgdGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIGJvb2xlYW4gb3Igb3B0aW9ucyBvYmplY3QgdG8gcGFzcyBvbiB0byB0aGUgZXZlbnRcbiAqIGxpc3RlbmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKFxuICBub2RlOiBFbGVtZW50IHwgV2luZG93IHwgRG9jdW1lbnQsXG4gIHR5cGU6IHN0cmluZyxcbiAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuKTogSURpc3Bvc2FibGUge1xuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGlmIChkaXNwb3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaXNwb3NlZCA9IHRydWU7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIgfSBmcm9tICdicm93c2VyL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQnVmZmVyQ2VsbFBvc2l0aW9uLCBJTGluaywgSUxpbmtEZWNvcmF0aW9ucywgSUxpbmtXaXRoU3RhdGUsIElMaW5raWZpZXIyLCBJTGlua2lmaWVyRXZlbnQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgZGlzcG9zZUFycmF5LCBnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElMaW5rUHJvdmlkZXJTZXJ2aWNlLCBJTW91c2VTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgTGlua2lmaWVyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElMaW5raWZpZXIyIHtcbiAgcHVibGljIGdldCBjdXJyZW50TGluaygpOiBJTGlua1dpdGhTdGF0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jdXJyZW50TGluazsgfVxuICBwcm90ZWN0ZWQgX2N1cnJlbnRMaW5rOiBJTGlua1dpdGhTdGF0ZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbW91c2VEb3duTGluazogSUxpbmtXaXRoU3RhdGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RNb3VzZUV2ZW50OiBNb3VzZUV2ZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9saW5rQ2FjaGVEaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuICBwcml2YXRlIF9sYXN0QnVmZmVyQ2VsbDogSUJ1ZmZlckNlbGxQb3NpdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaXNNb3VzZU91dDogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX3dhc1Jlc2l6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYWN0aXZlUHJvdmlkZXJSZXBsaWVzOiBNYXA8TnVtYmVyLCBJTGlua1dpdGhTdGF0ZVtdIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYWN0aXZlTGluZTogbnVtYmVyID0gLTE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25TaG93TGlua1VuZGVybGluZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJTGlua2lmaWVyRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25TaG93TGlua1VuZGVybGluZSA9IHRoaXMuX29uU2hvd0xpbmtVbmRlcmxpbmUuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uSGlkZUxpbmtVbmRlcmxpbmUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUxpbmtpZmllckV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uSGlkZUxpbmtVbmRlcmxpbmUgPSB0aGlzLl9vbkhpZGVMaW5rVW5kZXJsaW5lLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJTW91c2VTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX21vdXNlU2VydmljZTogSU1vdXNlU2VydmljZSxcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJTGlua1Byb3ZpZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9saW5rUHJvdmlkZXJTZXJ2aWNlOiBJTGlua1Byb3ZpZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIoZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZSh0aGlzLl9saW5rQ2FjaGVEaXNwb3NhYmxlcykpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMuX2xhc3RNb3VzZUV2ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgLy8gQ2xlYXIgb3V0IGxpbmsgcHJvdmlkZXJzIGFzIHRoZXkgY291bGQgZWFzaWx5IGNhdXNlIGFuIGVtYmVkZGVyIG1lbW9yeSBsZWFrXG4gICAgICB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXM/LmNsZWFyKCk7XG4gICAgfSkpO1xuICAgIC8vIExpc3RlbiB0byByZXNpemUgdG8gY2F0Y2ggdGhlIGNhc2Ugd2hlcmUgaXQncyByZXNpemVkIGFuZCB0aGUgY3Vyc29yIGlzIG91dCBvZiB0aGUgdmlld3BvcnQuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uUmVzaXplKCgpID0+IHtcbiAgICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgICAgIHRoaXMuX3dhc1Jlc2l6ZWQgPSB0cnVlO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9lbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgIHRoaXMuX2lzTW91c2VPdXQgPSB0cnVlO1xuICAgICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9lbGVtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9lbGVtZW50LCAnbW91c2Vkb3duJywgdGhpcy5faGFuZGxlTW91c2VEb3duLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9lbGVtZW50LCAnbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXAuYmluZCh0aGlzKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fbGFzdE1vdXNlRXZlbnQgPSBldmVudDtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fcG9zaXRpb25Gcm9tTW91c2VFdmVudChldmVudCwgdGhpcy5fZWxlbWVudCwgdGhpcy5fbW91c2VTZXJ2aWNlKTtcbiAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzTW91c2VPdXQgPSBmYWxzZTtcblxuICAgIC8vIElnbm9yZSB0aGUgZXZlbnQgaWYgaXQncyBhbiBlbWJlZGRlciBjcmVhdGVkIGhvdmVyIHdpZGdldFxuICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpIGFzIEhUTUxFbGVtZW50W107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb3NlZFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGNvbXBvc2VkUGF0aFtpXTtcbiAgICAgIC8vIEhpdCBUZXJtaW5hbC5lbGVtZW50LCBicmVhayBhbmQgY29udGludWVcbiAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd4dGVybScpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gSXQncyBhIGhvdmVyLCBkb24ndCByZXNwZWN0IGhvdmVyIGV2ZW50XG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygneHRlcm0taG92ZXInKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9sYXN0QnVmZmVyQ2VsbCB8fCAocG9zaXRpb24ueCAhPT0gdGhpcy5fbGFzdEJ1ZmZlckNlbGwueCB8fCBwb3NpdGlvbi55ICE9PSB0aGlzLl9sYXN0QnVmZmVyQ2VsbC55KSkge1xuICAgICAgdGhpcy5faGFuZGxlSG92ZXIocG9zaXRpb24pO1xuICAgICAgdGhpcy5fbGFzdEJ1ZmZlckNlbGwgPSBwb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVIb3Zlcihwb3NpdGlvbjogSUJ1ZmZlckNlbGxQb3NpdGlvbik6IHZvaWQge1xuICAgIC8vIFRPRE86IFRoaXMgY3VycmVudGx5IGRvZXMgbm90IGNhY2hlIGxpbmsgcHJvdmlkZXIgcmVzdWx0cyBhY3Jvc3Mgd3JhcHBlZCBsaW5lcywgYWN0aXZlTGluZVxuICAgIC8vICAgICAgIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgYWN0aXZlUmFuZ2U6IHtzdGFydFksIGVuZFl9YFxuICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gY2xlYXIgdGhlIGxpbmtcbiAgICBpZiAodGhpcy5fYWN0aXZlTGluZSAhPT0gcG9zaXRpb24ueSB8fCB0aGlzLl93YXNSZXNpemVkKSB7XG4gICAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gICAgICB0aGlzLl9hc2tGb3JMaW5rKHBvc2l0aW9uLCBmYWxzZSk7XG4gICAgICB0aGlzLl93YXNSZXNpemVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhlIGlmIHRoZSBsaW5rIGlzIGluIHRoZSBtb3VzZSBwb3NpdGlvblxuICAgIGNvbnN0IGlzQ3VycmVudExpbmtJblBvc2l0aW9uID0gdGhpcy5fY3VycmVudExpbmsgJiYgdGhpcy5fbGlua0F0UG9zaXRpb24odGhpcy5fY3VycmVudExpbmsubGluaywgcG9zaXRpb24pO1xuICAgIGlmICghaXNDdXJyZW50TGlua0luUG9zaXRpb24pIHtcbiAgICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgICAgIHRoaXMuX2Fza0ZvckxpbmsocG9zaXRpb24sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Fza0ZvckxpbmsocG9zaXRpb246IElCdWZmZXJDZWxsUG9zaXRpb24sIHVzZUxpbmVDYWNoZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzIHx8ICF1c2VMaW5lQ2FjaGUpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uZm9yRWFjaChyZXBseSA9PiB7XG4gICAgICAgIHJlcGx5Py5mb3JFYWNoKGxpbmtXaXRoU3RhdGUgPT4ge1xuICAgICAgICAgIGlmIChsaW5rV2l0aFN0YXRlLmxpbmsuZGlzcG9zZSkge1xuICAgICAgICAgICAgbGlua1dpdGhTdGF0ZS5saW5rLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9hY3RpdmVMaW5lID0gcG9zaXRpb24ueTtcbiAgICB9XG4gICAgbGV0IGxpbmtQcm92aWRlZCA9IGZhbHNlO1xuXG4gICAgLy8gVGhlcmUgaXMgbm8gbGluayBjYWNoZWQsIHNvIGFzayBmb3Igb25lXG4gICAgZm9yIChjb25zdCBbaSwgbGlua1Byb3ZpZGVyXSBvZiB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLmxpbmtQcm92aWRlcnMuZW50cmllcygpKSB7XG4gICAgICBpZiAodXNlTGluZUNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbHkgPSB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXM/LmdldChpKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSByZXBseSwgdGhlIHByb3ZpZGVyIGhhc24ndCByZXNwb25kZWQgeWV0LlxuXG4gICAgICAgIC8vIFRPRE86IElmIHRoZXJlIGlzbid0IGEgcmVwbHkgeWV0IGl0IG1lYW5zIHRoYXQgdGhlIHByb3ZpZGVyIGlzIHN0aWxsIHJlc29sdmluZy4gRW5zdXJpbmdcbiAgICAgICAgLy8gcHJvdmlkZUxpbmtzIGlzbid0IHRyaWdnZXJlZCBhZ2FpbiBzYXZlcyBJTGluay5ob3ZlciBmaXJpbmcgdHdpY2UgdGhvdWdoLiBUaGlzIHByb2JhYmx5XG4gICAgICAgIC8vIG5lZWRzIHByb21pc2VzIHRvIGdldCBmaXhlZFxuICAgICAgICBpZiAoZXhpc3RpbmdSZXBseSkge1xuICAgICAgICAgIGxpbmtQcm92aWRlZCA9IHRoaXMuX2NoZWNrTGlua1Byb3ZpZGVyUmVzdWx0KGksIHBvc2l0aW9uLCBsaW5rUHJvdmlkZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5rUHJvdmlkZXIucHJvdmlkZUxpbmtzKHBvc2l0aW9uLnksIChsaW5rczogSUxpbmtbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9pc01vdXNlT3V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxpbmtzV2l0aFN0YXRlOiBJTGlua1dpdGhTdGF0ZVtdIHwgdW5kZWZpbmVkID0gbGlua3M/Lm1hcChsaW5rICA9PiAoeyBsaW5rIH0pKTtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXM/LnNldChpLCBsaW5rc1dpdGhTdGF0ZSk7XG4gICAgICAgICAgbGlua1Byb3ZpZGVkID0gdGhpcy5fY2hlY2tMaW5rUHJvdmlkZXJSZXN1bHQoaSwgcG9zaXRpb24sIGxpbmtQcm92aWRlZCk7XG5cbiAgICAgICAgICAvLyBJZiBhbGwgcHJvdmlkZXJzIGhhdmUgcmVzcG9uZGVkLCByZW1vdmUgbG93ZXIgcHJpb3JpdHkgbGlua3MgdGhhdCBpbnRlcnNlY3QgcmFuZ2VzIG9mXG4gICAgICAgICAgLy8gaGlnaGVyIHByaW9yaXR5IGxpbmtzXG4gICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uc2l6ZSA9PT0gdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5saW5rUHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlSW50ZXJzZWN0aW5nTGlua3MocG9zaXRpb24ueSwgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUludGVyc2VjdGluZ0xpbmtzKHk6IG51bWJlciwgcmVwbGllczogTWFwPE51bWJlciwgSUxpbmtXaXRoU3RhdGVbXSB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgICBjb25zdCBvY2N1cGllZENlbGxzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBsaWVzLnNpemU7IGkrKykge1xuICAgICAgY29uc3QgcHJvdmlkZXJSZXBseSA9IHJlcGxpZXMuZ2V0KGkpO1xuICAgICAgaWYgKCFwcm92aWRlclJlcGx5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlclJlcGx5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmtXaXRoU3RhdGUgPSBwcm92aWRlclJlcGx5W2ldO1xuICAgICAgICBjb25zdCBzdGFydFggPSBsaW5rV2l0aFN0YXRlLmxpbmsucmFuZ2Uuc3RhcnQueSA8IHkgPyAwIDogbGlua1dpdGhTdGF0ZS5saW5rLnJhbmdlLnN0YXJ0Lng7XG4gICAgICAgIGNvbnN0IGVuZFggPSBsaW5rV2l0aFN0YXRlLmxpbmsucmFuZ2UuZW5kLnkgPiB5ID8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIDogbGlua1dpdGhTdGF0ZS5saW5rLnJhbmdlLmVuZC54O1xuICAgICAgICBmb3IgKGxldCB4ID0gc3RhcnRYOyB4IDw9IGVuZFg7IHgrKykge1xuICAgICAgICAgIGlmIChvY2N1cGllZENlbGxzLmhhcyh4KSkge1xuICAgICAgICAgICAgcHJvdmlkZXJSZXBseS5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvY2N1cGllZENlbGxzLmFkZCh4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrTGlua1Byb3ZpZGVyUmVzdWx0KGluZGV4OiBudW1iZXIsIHBvc2l0aW9uOiBJQnVmZmVyQ2VsbFBvc2l0aW9uLCBsaW5rUHJvdmlkZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcykge1xuICAgICAgcmV0dXJuIGxpbmtQcm92aWRlZDtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5rcyA9IHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5nZXQoaW5kZXgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgZXZlcnkgcHJvdmlkZXIgYmVmb3JlIHRoaXMgb25lIGhhcyBjb21lIGJhY2sgdW5kZWZpbmVkXG4gICAgbGV0IGhhc0xpbmtCZWZvcmUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGV4OyBqKyspIHtcbiAgICAgIGlmICghdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLmhhcyhqKSB8fCB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuZ2V0KGopKSB7XG4gICAgICAgIGhhc0xpbmtCZWZvcmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGFsbCBwcm92aWRlcnMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgY2FtZSBiYWNrIHVuZGVmaW5lZCwgdGhlbiB0aGlzIHByb3ZpZGVyJ3MgbGluayBmb3JcbiAgICAvLyB0aGUgcG9zaXRpb24gc2hvdWxkIGJlIHVzZWRcbiAgICBpZiAoIWhhc0xpbmtCZWZvcmUgJiYgbGlua3MpIHtcbiAgICAgIGNvbnN0IGxpbmtBdFBvc2l0aW9uID0gbGlua3MuZmluZChsaW5rID0+IHRoaXMuX2xpbmtBdFBvc2l0aW9uKGxpbmsubGluaywgcG9zaXRpb24pKTtcbiAgICAgIGlmIChsaW5rQXRQb3NpdGlvbikge1xuICAgICAgICBsaW5rUHJvdmlkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9oYW5kbGVOZXdMaW5rKGxpbmtBdFBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhbGwgdGhlIHByb3ZpZGVycyBoYXZlIHJlc3BvbmRlZFxuICAgIGlmICh0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuc2l6ZSA9PT0gdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5saW5rUHJvdmlkZXJzLmxlbmd0aCAmJiAhbGlua1Byb3ZpZGVkKSB7XG4gICAgICAvLyBSZXNwZWN0IHRoZSBvcmRlciBvZiB0aGUgbGluayBwcm92aWRlcnNcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLnNpemU7IGorKykge1xuICAgICAgICBjb25zdCBjdXJyZW50TGluayA9IHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5nZXQoaik/LmZpbmQobGluayA9PiB0aGlzLl9saW5rQXRQb3NpdGlvbihsaW5rLmxpbmssIHBvc2l0aW9uKSk7XG4gICAgICAgIGlmIChjdXJyZW50TGluaykge1xuICAgICAgICAgIGxpbmtQcm92aWRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5faGFuZGxlTmV3TGluayhjdXJyZW50TGluayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlua1Byb3ZpZGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTW91c2VEb3duKCk6IHZvaWQge1xuICAgIHRoaXMuX21vdXNlRG93bkxpbmsgPSB0aGlzLl9jdXJyZW50TGluaztcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbkZyb21Nb3VzZUV2ZW50KGV2ZW50LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9tb3VzZVNlcnZpY2UpO1xuICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbW91c2VEb3duTGluayA9PT0gdGhpcy5fY3VycmVudExpbmsgJiYgdGhpcy5fbGlua0F0UG9zaXRpb24odGhpcy5fY3VycmVudExpbmsubGluaywgcG9zaXRpb24pKSB7XG4gICAgICB0aGlzLl9jdXJyZW50TGluay5saW5rLmFjdGl2YXRlKGV2ZW50LCB0aGlzLl9jdXJyZW50TGluay5saW5rLnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyQ3VycmVudExpbmsoc3RhcnRSb3c/OiBudW1iZXIsIGVuZFJvdz86IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY3VycmVudExpbmsgfHwgIXRoaXMuX2xhc3RNb3VzZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHN0YXJ0IGFuZCBlbmQgcm93LCBjaGVjayB0aGF0IHRoZSBsaW5rIGlzIHdpdGhpbiBpdFxuICAgIGlmICghc3RhcnRSb3cgfHwgIWVuZFJvdyB8fCAodGhpcy5fY3VycmVudExpbmsubGluay5yYW5nZS5zdGFydC55ID49IHN0YXJ0Um93ICYmIHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsucmFuZ2UuZW5kLnkgPD0gZW5kUm93KSkge1xuICAgICAgdGhpcy5fbGlua0xlYXZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuX2N1cnJlbnRMaW5rLmxpbmssIHRoaXMuX2xhc3RNb3VzZUV2ZW50KTtcbiAgICAgIHRoaXMuX2N1cnJlbnRMaW5rID0gdW5kZWZpbmVkO1xuICAgICAgZGlzcG9zZUFycmF5KHRoaXMuX2xpbmtDYWNoZURpc3Bvc2FibGVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVOZXdMaW5rKGxpbmtXaXRoU3RhdGU6IElMaW5rV2l0aFN0YXRlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9sYXN0TW91c2VFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fcG9zaXRpb25Gcm9tTW91c2VFdmVudCh0aGlzLl9sYXN0TW91c2VFdmVudCwgdGhpcy5fZWxlbWVudCwgdGhpcy5fbW91c2VTZXJ2aWNlKTtcblxuICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGhvdmVyIGlmIHRoZSB3ZSBoYXZlIGEgbGluayBhdCB0aGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fbGlua0F0UG9zaXRpb24obGlua1dpdGhTdGF0ZS5saW5rLCBwb3NpdGlvbikpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRMaW5rID0gbGlua1dpdGhTdGF0ZTtcbiAgICAgIHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlID0ge1xuICAgICAgICBkZWNvcmF0aW9uczoge1xuICAgICAgICAgIHVuZGVybGluZTogbGlua1dpdGhTdGF0ZS5saW5rLmRlY29yYXRpb25zID09PSB1bmRlZmluZWQgPyB0cnVlIDogbGlua1dpdGhTdGF0ZS5saW5rLmRlY29yYXRpb25zLnVuZGVybGluZSxcbiAgICAgICAgICBwb2ludGVyQ3Vyc29yOiBsaW5rV2l0aFN0YXRlLmxpbmsuZGVjb3JhdGlvbnMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBsaW5rV2l0aFN0YXRlLmxpbmsuZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvclxuICAgICAgICB9LFxuICAgICAgICBpc0hvdmVyZWQ6IHRydWVcbiAgICAgIH07XG4gICAgICB0aGlzLl9saW5rSG92ZXIodGhpcy5fZWxlbWVudCwgbGlua1dpdGhTdGF0ZS5saW5rLCB0aGlzLl9sYXN0TW91c2VFdmVudCk7XG5cbiAgICAgIC8vIEFkZCBsaXN0ZW5lciBmb3IgdHJhY2tpbmcgZGVjb3JhdGlvbnMgY2hhbmdlc1xuICAgICAgbGlua1dpdGhTdGF0ZS5saW5rLmRlY29yYXRpb25zID0ge30gYXMgSUxpbmtEZWNvcmF0aW9ucztcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxpbmtXaXRoU3RhdGUubGluay5kZWNvcmF0aW9ucywge1xuICAgICAgICBwb2ludGVyQ3Vyc29yOiB7XG4gICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9jdXJyZW50TGluaz8uc3RhdGU/LmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3IsXG4gICAgICAgICAgc2V0OiB2ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluaz8uc3RhdGUgJiYgdGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvciAhPT0gdikge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yID0gdjtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmlzSG92ZXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgneHRlcm0tY3Vyc29yLXBvaW50ZXInLCB2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdW5kZXJsaW5lOiB7XG4gICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9jdXJyZW50TGluaz8uc3RhdGU/LmRlY29yYXRpb25zLnVuZGVybGluZSxcbiAgICAgICAgICBzZXQ6IHYgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZSAmJiB0aGlzLl9jdXJyZW50TGluaz8uc3RhdGU/LmRlY29yYXRpb25zLnVuZGVybGluZSAhPT0gdikge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy51bmRlcmxpbmUgPSB2O1xuICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudExpbmsuc3RhdGUuaXNIb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZVVuZGVybGluZUV2ZW50KGxpbmtXaXRoU3RhdGUubGluaywgdik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gdG8gdmlld3BvcnQgY2hhbmdlcyB0byByZS1yZW5kZXIgdGhlIGxpbmsgdW5kZXIgdGhlIGN1cnNvciAob25seSB3aGVuIHRoZSBsaW5lIHRoZVxuICAgICAgLy8gbGluayBpcyBvbiBjaGFuZ2VzKVxuICAgICAgdGhpcy5fbGlua0NhY2hlRGlzcG9zYWJsZXMucHVzaCh0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZShlID0+IHtcbiAgICAgICAgLy8gU2FuaXR5IGNoZWNrLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gaW4gcHJhY3RpY2UgYXMgdGhpcyBsaXN0ZW5lciB3b3VsZCBiZSBkaXNwb3NlZFxuICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gc3RhcnQgaXMgMCBhIHNjcm9sbCBtb3N0IGxpa2VseSBvY2N1cnJlZCwgbWFrZSBzdXJlIGxpbmtzIGFib3ZlIHRoZSBmb2xkIGFsc28gZ2V0XG4gICAgICAgIC8vIGNsZWFyZWQuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZS5zdGFydCA9PT0gMCA/IDAgOiBlLnN0YXJ0ICsgMSArIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCArIDEgKyBlLmVuZDtcbiAgICAgICAgLy8gT25seSBjbGVhciB0aGUgbGluayBpZiB0aGUgdmlld3BvcnQgY2hhbmdlIGhhcHBlbmVkIG9uIHRoaXMgbGluZVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudExpbmsubGluay5yYW5nZS5zdGFydC55ID49IHN0YXJ0ICYmIHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsucmFuZ2UuZW5kLnkgPD0gZW5kKSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJDdXJyZW50TGluayhzdGFydCwgZW5kKTtcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdE1vdXNlRXZlbnQpIHtcbiAgICAgICAgICAgIC8vIHJlLWV2YWwgcHJldmlvdXNseSBhY3RpdmUgbGluayBhZnRlciBjaGFuZ2VzXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQodGhpcy5fbGFzdE1vdXNlRXZlbnQsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX21vdXNlU2VydmljZSEpO1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Fza0ZvckxpbmsocG9zaXRpb24sIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2xpbmtIb3ZlcihlbGVtZW50OiBIVE1MRWxlbWVudCwgbGluazogSUxpbmssIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZSkge1xuICAgICAgdGhpcy5fY3VycmVudExpbmsuc3RhdGUuaXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy51bmRlcmxpbmUpIHtcbiAgICAgICAgdGhpcy5fZmlyZVVuZGVybGluZUV2ZW50KGxpbmssIHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3IpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS1jdXJzb3ItcG9pbnRlcicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5rLmhvdmVyKSB7XG4gICAgICBsaW5rLmhvdmVyKGV2ZW50LCBsaW5rLnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVVbmRlcmxpbmVFdmVudChsaW5rOiBJTGluaywgc2hvd0V2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmFuZ2UgPSBsaW5rLnJhbmdlO1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5fY3JlYXRlTGlua1VuZGVybGluZUV2ZW50KHJhbmdlLnN0YXJ0LnggLSAxLCByYW5nZS5zdGFydC55IC0gc2Nyb2xsT2Zmc2V0IC0gMSwgcmFuZ2UuZW5kLngsIHJhbmdlLmVuZC55IC0gc2Nyb2xsT2Zmc2V0IC0gMSwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlbWl0dGVyID0gc2hvd0V2ZW50ID8gdGhpcy5fb25TaG93TGlua1VuZGVybGluZSA6IHRoaXMuX29uSGlkZUxpbmtVbmRlcmxpbmU7XG4gICAgZW1pdHRlci5maXJlKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbGlua0xlYXZlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBsaW5rOiBJTGluaywgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3VycmVudExpbms/LnN0YXRlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy51bmRlcmxpbmUpIHtcbiAgICAgICAgdGhpcy5fZmlyZVVuZGVybGluZUV2ZW50KGxpbmssIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgneHRlcm0tY3Vyc29yLXBvaW50ZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluay5sZWF2ZSkge1xuICAgICAgbGluay5sZWF2ZShldmVudCwgbGluay50ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlIGxpbmtcbiAgICogQHBhcmFtIGxpbmtcbiAgICogQHBhcmFtIHBvc2l0aW9uXG4gICAqL1xuICBwcml2YXRlIF9saW5rQXRQb3NpdGlvbihsaW5rOiBJTGluaywgcG9zaXRpb246IElCdWZmZXJDZWxsUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBsb3dlciA9IGxpbmsucmFuZ2Uuc3RhcnQueSAqIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyArIGxpbmsucmFuZ2Uuc3RhcnQueDtcbiAgICBjb25zdCB1cHBlciA9IGxpbmsucmFuZ2UuZW5kLnkgKiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgKyBsaW5rLnJhbmdlLmVuZC54O1xuICAgIGNvbnN0IGN1cnJlbnQgPSBwb3NpdGlvbi55ICogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzICsgcG9zaXRpb24ueDtcbiAgICByZXR1cm4gKGxvd2VyIDw9IGN1cnJlbnQgJiYgY3VycmVudCA8PSB1cHBlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBidWZmZXIgcG9zaXRpb24gZnJvbSBhIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfcG9zaXRpb25Gcm9tTW91c2VFdmVudChldmVudDogTW91c2VFdmVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG1vdXNlU2VydmljZTogSU1vdXNlU2VydmljZSk6IElCdWZmZXJDZWxsUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvb3JkcyA9IG1vdXNlU2VydmljZS5nZXRDb29yZHMoZXZlbnQsIGVsZW1lbnQsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKTtcbiAgICBpZiAoIWNvb3Jkcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB7IHg6IGNvb3Jkc1swXSwgeTogY29vcmRzWzFdICsgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUxpbmtVbmRlcmxpbmVFdmVudCh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBmZzogbnVtYmVyIHwgdW5kZWZpbmVkKTogSUxpbmtpZmllckV2ZW50IHtcbiAgICByZXR1cm4geyB4MSwgeTEsIHgyLCB5MiwgY29sczogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCBmZyB9O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8vIFRoaXMgZmlsZSBjb250YWlucyBzdHJpbmdzIHRoYXQgZ2V0IGV4cG9ydGVkIGluIHRoZSBBUEkgc28gdGhleSBjYW4gYmUgbG9jYWxpemVkXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbmV4cG9ydCBsZXQgcHJvbXB0TGFiZWwgPSAnVGVybWluYWwgaW5wdXQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5leHBvcnQgbGV0IHRvb011Y2hPdXRwdXQgPSAnVG9vIG11Y2ggb3V0cHV0IHRvIGFubm91bmNlLCBuYXZpZ2F0ZSB0byByb3dzIG1hbnVhbGx5IHRvIHJlYWQnO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyUmFuZ2UsIElMaW5rIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJTGlua1Byb3ZpZGVyIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElPcHRpb25zU2VydmljZSwgSU9zY0xpbmtTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNsYXNzIE9zY0xpbmtQcm92aWRlciBpbXBsZW1lbnRzIElMaW5rUHJvdmlkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJT3NjTGlua1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3NjTGlua1NlcnZpY2U6IElPc2NMaW5rU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBwcm92aWRlTGlua3MoeTogbnVtYmVyLCBjYWxsYmFjazogKGxpbmtzOiBJTGlua1tdIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldCh5IC0gMSk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICBjYWxsYmFjayh1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogSUxpbmtbXSA9IFtdO1xuICAgIGNvbnN0IGxpbmtIYW5kbGVyID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5saW5rSGFuZGxlcjtcbiAgICBjb25zdCBjZWxsID0gbmV3IENlbGxEYXRhKCk7XG4gICAgY29uc3QgbGluZUxlbmd0aCA9IGxpbmUuZ2V0VHJpbW1lZExlbmd0aCgpO1xuICAgIGxldCBjdXJyZW50TGlua0lkID0gLTE7XG4gICAgbGV0IGN1cnJlbnRTdGFydCA9IC0xO1xuICAgIGxldCBmaW5pc2hMaW5rID0gZmFsc2U7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBsaW5lTGVuZ3RoOyB4KyspIHtcbiAgICAgIC8vIE1pbm9yIG9wdGltaXphdGlvbiwgb25seSBjaGVjayBmb3IgY29udGVudCBpZiB0aGVyZSBpc24ndCBhIGxpbmsgaW4gY2FzZSB0aGUgbGluayBlbmRzIHdpdGhcbiAgICAgIC8vIGEgbnVsbCBjZWxsXG4gICAgICBpZiAoY3VycmVudFN0YXJ0ID09PSAtMSAmJiAhbGluZS5oYXNDb250ZW50KHgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsaW5lLmxvYWRDZWxsKHgsIGNlbGwpO1xuICAgICAgaWYgKGNlbGwuaGFzRXh0ZW5kZWRBdHRycygpICYmIGNlbGwuZXh0ZW5kZWQudXJsSWQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRTdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICBjdXJyZW50U3RhcnQgPSB4O1xuICAgICAgICAgIGN1cnJlbnRMaW5rSWQgPSBjZWxsLmV4dGVuZGVkLnVybElkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmlzaExpbmsgPSBjZWxsLmV4dGVuZGVkLnVybElkICE9PSBjdXJyZW50TGlua0lkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VycmVudFN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGZpbmlzaExpbmsgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5pc2hMaW5rIHx8IChjdXJyZW50U3RhcnQgIT09IC0xICYmIHggPT09IGxpbmVMZW5ndGggLSAxKSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5fb3NjTGlua1NlcnZpY2UuZ2V0TGlua0RhdGEoY3VycmVudExpbmtJZCk/LnVyaTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAvLyBUaGVzZSByYW5nZXMgYXJlIDEtYmFzZWRcbiAgICAgICAgICBjb25zdCByYW5nZTogSUJ1ZmZlclJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgeDogY3VycmVudFN0YXJ0ICsgMSxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAvLyBPZmZzZXQgZW5kIHggaWYgaXQncyBhIGxpbmsgdGhhdCBlbmRzIG9uIHRoZSBsYXN0IGNlbGwgaW4gdGhlIGxpbmVcbiAgICAgICAgICAgICAgeDogeCArICghZmluaXNoTGluayAmJiB4ID09PSBsaW5lTGVuZ3RoIC0gMSA/IDEgOiAwKSxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBsZXQgaWdub3JlTGluayA9IGZhbHNlO1xuICAgICAgICAgIGlmICghbGlua0hhbmRsZXI/LmFsbG93Tm9uSHR0cFByb3RvY29scykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh0ZXh0KTtcbiAgICAgICAgICAgICAgaWYgKCFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgICAgICBpZ25vcmVMaW5rID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCBVUkxzIHRvIHByZXZlbnQgdW5leHBlY3RlZCBiZWhhdmlvcnNcbiAgICAgICAgICAgICAgaWdub3JlTGluayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpZ25vcmVMaW5rKSB7XG4gICAgICAgICAgICAvLyBPU0MgbGlua3MgYWx3YXlzIHVzZSB1bmRlcmxpbmUgYW5kIHBvaW50ZXIgZGVjb3JhdGlvbnNcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgIGFjdGl2YXRlOiAoZSwgdGV4dCkgPT4gKGxpbmtIYW5kbGVyID8gbGlua0hhbmRsZXIuYWN0aXZhdGUoZSwgdGV4dCwgcmFuZ2UpIDogZGVmYXVsdEFjdGl2YXRlKGUsIHRleHQpKSxcbiAgICAgICAgICAgICAgaG92ZXI6IChlLCB0ZXh0KSA9PiBsaW5rSGFuZGxlcj8uaG92ZXI/LihlLCB0ZXh0LCByYW5nZSksXG4gICAgICAgICAgICAgIGxlYXZlOiAoZSwgdGV4dCkgPT4gbGlua0hhbmRsZXI/LmxlYXZlPy4oZSwgdGV4dCwgcmFuZ2UpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoTGluayA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENsZWFyIGxpbmsgb3Igc3RhcnQgYSBuZXcgbGluayBpZiBvbmUgc3RhcnRzIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmIChjZWxsLmhhc0V4dGVuZGVkQXR0cnMoKSAmJiBjZWxsLmV4dGVuZGVkLnVybElkKSB7XG4gICAgICAgICAgY3VycmVudFN0YXJ0ID0geDtcbiAgICAgICAgICBjdXJyZW50TGlua0lkID0gY2VsbC5leHRlbmRlZC51cmxJZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50U3RhcnQgPSAtMTtcbiAgICAgICAgICBjdXJyZW50TGlua0lkID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBIYW5kbGUgZmV0Y2hpbmcgYW5kIHJldHVybmluZyBvdGhlciBsaW5rIHJhbmdlcyB0byB1bmRlcmxpbmUgb3RoZXIgbGlua3Mgd2l0aCB0aGUgc2FtZVxuICAgIC8vICAgICAgIGlkXG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QWN0aXZhdGUoZTogTW91c2VFdmVudCwgdXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYW5zd2VyID0gY29uZmlybShgRG8geW91IHdhbnQgdG8gbmF2aWdhdGUgdG8gJHt1cml9P1xcblxcbldBUk5JTkc6IFRoaXMgbGluayBjb3VsZCBwb3RlbnRpYWxseSBiZSBkYW5nZXJvdXNgKTtcbiAgaWYgKGFuc3dlcikge1xuICAgIGNvbnN0IG5ld1dpbmRvdyA9IHdpbmRvdy5vcGVuKCk7XG4gICAgaWYgKG5ld1dpbmRvdykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm8tb3AsIEVsZWN0cm9uIGNhbiB0aHJvd1xuICAgICAgfVxuICAgICAgbmV3V2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignT3BlbmluZyBsaW5rIGJsb2NrZWQgYXMgb3BlbmVyIGNvdWxkIG5vdCBiZSBjbGVhcmVkJyk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElSZW5kZXJEZWJvdW5jZXJXaXRoQ2FsbGJhY2sgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuLyoqXG4gKiBEZWJvdW5jZXMgY2FsbHMgdG8gcmVuZGVyIHRlcm1pbmFsIHJvd3MgdXNpbmcgYW5pbWF0aW9uIGZyYW1lcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlckRlYm91bmNlciBpbXBsZW1lbnRzIElSZW5kZXJEZWJvdW5jZXJXaXRoQ2FsbGJhY2sge1xuICBwcml2YXRlIF9yb3dTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yb3dFbmQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcmVmcmVzaENhbGxiYWNrczogRnJhbWVSZXF1ZXN0Q2FsbGJhY2tbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlckNhbGxiYWNrOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lKTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRSZWZyZXNoQ2FsbGJhY2soY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyIHtcbiAgICB0aGlzLl9yZWZyZXNoQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIGlmICghdGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5faW5uZXJSZWZyZXNoKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYW5pbWF0aW9uRnJhbWU7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaChyb3dTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkLCByb3dFbmQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcm93Q291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3Jvd0NvdW50ID0gcm93Q291bnQ7XG4gICAgLy8gR2V0IHRoZSBtaW4vbWF4IHJvdyBzdGFydC9lbmQgZm9yIHRoZSBhcmcgdmFsdWVzXG4gICAgcm93U3RhcnQgPSByb3dTdGFydCAhPT0gdW5kZWZpbmVkID8gcm93U3RhcnQgOiAwO1xuICAgIHJvd0VuZCA9IHJvd0VuZCAhPT0gdW5kZWZpbmVkID8gcm93RW5kIDogdGhpcy5fcm93Q291bnQgLSAxO1xuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyB0byB0aGUgdXBkYXRlZCB2YWx1ZXNcbiAgICB0aGlzLl9yb3dTdGFydCA9IHRoaXMuX3Jvd1N0YXJ0ICE9PSB1bmRlZmluZWQgPyBNYXRoLm1pbih0aGlzLl9yb3dTdGFydCwgcm93U3RhcnQpIDogcm93U3RhcnQ7XG4gICAgdGhpcy5fcm93RW5kID0gdGhpcy5fcm93RW5kICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCh0aGlzLl9yb3dFbmQsIHJvd0VuZCkgOiByb3dFbmQ7XG5cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuX2lubmVyUmVmcmVzaCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lubmVyUmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZXMgYXJlIHNldFxuICAgIGlmICh0aGlzLl9yb3dTdGFydCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3Jvd0VuZCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3Jvd0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3J1blJlZnJlc2hDYWxsYmFja3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCB2YWx1ZXNcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KHRoaXMuX3Jvd1N0YXJ0LCAwKTtcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbih0aGlzLl9yb3dFbmQsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG5cbiAgICAvLyBSZXNldCBkZWJvdW5jZXIgKHRoaXMgaGFwcGVucyBiZWZvcmUgcmVuZGVyIGNhbGxiYWNrIGFzIHRoZSByZW5kZXIgY291bGQgdHJpZ2dlciBpdCBhZ2FpbilcbiAgICB0aGlzLl9yb3dTdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yb3dFbmQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSdW4gcmVuZGVyIGNhbGxiYWNrXG4gICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soc3RhcnQsIGVuZCk7XG4gICAgdGhpcy5fcnVuUmVmcmVzaENhbGxiYWNrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcnVuUmVmcmVzaENhbGxiYWNrcygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuX3JlZnJlc2hDYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrKDApO1xuICAgIH1cbiAgICB0aGlzLl9yZWZyZXNoQ2FsbGJhY2tzID0gW107XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIENocmlzdG9waGVyIEplZmZyZXkgKE1JVCBMaWNlbnNlKVxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogT3JpZ2luYWxseSBmb3JrZWQgZnJvbSAod2l0aCB0aGUgYXV0aG9yJ3MgcGVybWlzc2lvbik6XG4gKiAgIEZhYnJpY2UgQmVsbGFyZCdzIGphdmFzY3JpcHQgdnQxMDAgZm9yIGpzbGludXg6XG4gKiAgIGh0dHA6Ly9iZWxsYXJkLm9yZy9qc2xpbnV4L1xuICogICBDb3B5cmlnaHQgKGMpIDIwMTEgRmFicmljZSBCZWxsYXJkXG4gKiAgIFRoZSBvcmlnaW5hbCBkZXNpZ24gcmVtYWlucy4gVGhlIHRlcm1pbmFsIGl0c2VsZlxuICogICBoYXMgYmVlbiBleHRlbmRlZCB0byBpbmNsdWRlIHh0ZXJtIENTSSBjb2RlcywgYW1vbmdcbiAqICAgb3RoZXIgZmVhdHVyZXMuXG4gKlxuICogVGVybWluYWwgRW11bGF0aW9uIFJlZmVyZW5jZXM6XG4gKiAgIGh0dHA6Ly92dDEwMC5uZXQvXG4gKiAgIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC94dGVybS9jdGxzZXFzL2N0bHNlcXMudHh0XG4gKiAgIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC94dGVybS9jdGxzZXFzL2N0bHNlcXMuaHRtbFxuICogICBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQvdnR0ZXN0L1xuICogICBodHRwOi8vd3d3Lmlud2FwLmNvbS9wZHAxMC9hbnNpY29kZS50eHRcbiAqICAgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzQvY29uc29sZV9jb2Rlc1xuICogICBodHRwOi8vbGludXguZGllLm5ldC9tYW4vNy91cnh2dFxuICovXG5cbmltcG9ydCB7IGNvcHlIYW5kbGVyLCBoYW5kbGVQYXN0ZUV2ZW50LCBtb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yLCBwYXN0ZSwgcmlnaHRDbGlja0hhbmRsZXIgfSBmcm9tICdicm93c2VyL0NsaXBib2FyZCc7XG5pbXBvcnQgeyBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIgfSBmcm9tICdicm93c2VyL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBMaW5raWZpZXIgfSBmcm9tICcuL0xpbmtpZmllcic7XG5pbXBvcnQgKiBhcyBTdHJpbmdzIGZyb20gJ2Jyb3dzZXIvTG9jYWxpemFibGVTdHJpbmdzJztcbmltcG9ydCB7IE9zY0xpbmtQcm92aWRlciB9IGZyb20gJ2Jyb3dzZXIvT3NjTGlua1Byb3ZpZGVyJztcbmltcG9ydCB7IENoYXJhY3RlckpvaW5lckhhbmRsZXIsIEN1c3RvbUtleUV2ZW50SGFuZGxlciwgQ3VzdG9tV2hlZWxFdmVudEhhbmRsZXIsIElCcm93c2VyLCBJQnVmZmVyUmFuZ2UsIElDb21wb3NpdGlvbkhlbHBlciwgSUxpbmtpZmllcjIsIElUZXJtaW5hbCwgSVZpZXdwb3J0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBWaWV3cG9ydCB9IGZyb20gJ2Jyb3dzZXIvVmlld3BvcnQnO1xuaW1wb3J0IHsgQnVmZmVyRGVjb3JhdGlvblJlbmRlcmVyIH0gZnJvbSAnYnJvd3Nlci9kZWNvcmF0aW9ucy9CdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXInO1xuaW1wb3J0IHsgT3ZlcnZpZXdSdWxlclJlbmRlcmVyIH0gZnJvbSAnYnJvd3Nlci9kZWNvcmF0aW9ucy9PdmVydmlld1J1bGVyUmVuZGVyZXInO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25IZWxwZXIgfSBmcm9tICdicm93c2VyL2lucHV0L0NvbXBvc2l0aW9uSGVscGVyJztcbmltcG9ydCB7IERvbVJlbmRlcmVyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9kb20vRG9tUmVuZGVyZXInO1xuaW1wb3J0IHsgSVJlbmRlcmVyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgQ2hhclNpemVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9DaGFyU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhcmFjdGVySm9pbmVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvQ2hhcmFjdGVySm9pbmVyU2VydmljZSc7XG5pbXBvcnQgeyBDb3JlQnJvd3NlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL0NvcmVCcm93c2VyU2VydmljZSc7XG5pbXBvcnQgeyBNb3VzZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL01vdXNlU2VydmljZSc7XG5pbXBvcnQgeyBSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9SZW5kZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElMaW5rUHJvdmlkZXJTZXJ2aWNlLCBJTW91c2VTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVNlbGVjdGlvblNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvVGhlbWVTZXJ2aWNlJztcbmltcG9ydCB7IGNoYW5uZWxzLCBjb2xvciB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBDb3JlVGVybWluYWwgfSBmcm9tICdjb21tb24vQ29yZVRlcm1pbmFsJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSUV2ZW50LCBmb3J3YXJkRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IE11dGFibGVEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcbmltcG9ydCB7IENvbG9yUmVxdWVzdFR5cGUsIENvcmVNb3VzZUFjdGlvbiwgQ29yZU1vdXNlQnV0dG9uLCBDb3JlTW91c2VFdmVudFR5cGUsIElDb2xvckV2ZW50LCBJVGVybWluYWxPcHRpb25zLCBLZXlib2FyZFJlc3VsdFR5cGUsIFNjcm9sbFNvdXJjZSwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9BVFRSX0RBVEEgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlckxpbmUnO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgQzAsIEMxX0VTQ0FQRUQgfSBmcm9tICdjb21tb24vZGF0YS9Fc2NhcGVTZXF1ZW5jZXMnO1xuaW1wb3J0IHsgZXZhbHVhdGVLZXlib2FyZEV2ZW50IH0gZnJvbSAnY29tbW9uL2lucHV0L0tleWJvYXJkJztcbmltcG9ydCB7IHRvUmdiU3RyaW5nIH0gZnJvbSAnY29tbW9uL2lucHV0L1hQYXJzZUNvbG9yJztcbmltcG9ydCB7IERlY29yYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0RlY29yYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IElEZWNvcmF0aW9uU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvbiwgSURlY29yYXRpb25PcHRpb25zLCBJRGlzcG9zYWJsZSwgSUxpbmtQcm92aWRlciwgSU1hcmtlciB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGUgfSBmcm9tICcuLi9jb21tb24vSW5wdXRIYW5kbGVyJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlNYW5hZ2VyIH0gZnJvbSAnLi9BY2Nlc3NpYmlsaXR5TWFuYWdlcic7XG5pbXBvcnQgeyBMaW5rUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9MaW5rUHJvdmlkZXJTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFRlcm1pbmFsIGV4dGVuZHMgQ29yZVRlcm1pbmFsIGltcGxlbWVudHMgSVRlcm1pbmFsIHtcbiAgcHVibGljIHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3ZpZXdwb3J0U2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3ZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2hlbHBlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NvbXBvc2l0aW9uVmlldzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGxpbmtpZmllcjogSUxpbmtpZmllcjIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX292ZXJ2aWV3UnVsZXJSZW5kZXJlcjogT3ZlcnZpZXdSdWxlclJlbmRlcmVyIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBicm93c2VyOiBJQnJvd3NlciA9IEJyb3dzZXIgYXMgYW55O1xuXG4gIHByaXZhdGUgX2N1c3RvbUtleUV2ZW50SGFuZGxlcjogQ3VzdG9tS2V5RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jdXN0b21XaGVlbEV2ZW50SGFuZGxlcjogQ3VzdG9tV2hlZWxFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gQnJvd3NlciBzZXJ2aWNlc1xuICBwcml2YXRlIF9kZWNvcmF0aW9uU2VydmljZTogRGVjb3JhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgX2xpbmtQcm92aWRlclNlcnZpY2U6IElMaW5rUHJvdmlkZXJTZXJ2aWNlO1xuXG4gIC8vIE9wdGlvbmFsIGJyb3dzZXIgc2VydmljZXNcbiAgcHJpdmF0ZSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX21vdXNlU2VydmljZTogSU1vdXNlU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY2hhcmFjdGVySm9pbmVyU2VydmljZTogSUNoYXJhY3RlckpvaW5lclNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3NlbGVjdGlvblNlcnZpY2U6IElTZWxlY3Rpb25TZXJ2aWNlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHdoZXRoZXIgdGhlIGtleWRvd24gZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGFuZCB0cmlnZ2VyZWQgYSBkYXRhIGV2ZW50LCBpZiBzb1xuICAgKiB0aGUga2V5cHJlc3MgZXZlbnQgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgZGF0YSBldmVudCBidXQgc2hvdWxkIHN0aWxsIHByaW50IHRvIHRoZSB0ZXh0YXJlYSBzb1xuICAgKiBzY3JlZW4gcmVhZGVycyB3aWxsIGFubm91bmNlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfa2V5RG93bkhhbmRsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVjb3JkcyB3aGV0aGVyIGEga2V5ZG93biBldmVudCBoYXMgb2NjdXJlZCBzaW5jZSB0aGUgbGFzdCBrZXl1cCBldmVudCwgaS5lLiB3aGV0aGVyIGEga2V5XG4gICAqIGlzIGN1cnJlbnRseSBcInByZXNzZWRcIi5cbiAgICovXG4gIHByaXZhdGUgX2tleURvd25TZWVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgd2hldGhlciB0aGUga2V5cHJlc3MgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGFuZCB0cmlnZ2VyZWQgYSBkYXRhIGV2ZW50LCBpZiBzb1xuICAgKiB0aGUgaW5wdXQgZXZlbnQgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgZGF0YSBldmVudCBidXQgc2hvdWxkIHN0aWxsIHByaW50IHRvIHRoZSB0ZXh0YXJlYSBzb1xuICAgKiBzY3JlZW4gcmVhZGVycyB3aWxsIGFubm91bmNlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfa2V5UHJlc3NIYW5kbGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIGtleWRvd24gZXZlbnQgZm9yIGEgZGVhZCBrZXkgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcga2V5ZG93blxuICAgKiBldmVudCBmb3IgdGhlIGNvbXBvc2VkL2FsdGVybmF0aXZlIGNoYXJhY3Rlci4gSWYgd2UgY2FuY2VsIHRoZSBrZXlkb3duIGV2ZW50IGZvciB0aGUgZGVhZCBrZXksXG4gICAqIG5vIGV2ZW50cyB3aWxsIGJlIGVtaXR0ZWQgZm9yIHRoZSBmaW5hbCBjaGFyYWN0ZXIuXG4gICAqL1xuICBwcml2YXRlIF91bnByb2Nlc3NlZERlYWRLZXk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgdmlld3BvcnQ6IElWaWV3cG9ydCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29tcG9zaXRpb25IZWxwZXI6IElDb21wb3NpdGlvbkhlbHBlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYWNjZXNzaWJpbGl0eU1hbmFnZXI6IE11dGFibGVEaXNwb3NhYmxlPEFjY2Vzc2liaWxpdHlNYW5hZ2VyPiA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ3Vyc29yTW92ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ3Vyc29yTW92ZSA9IHRoaXMuX29uQ3Vyc29yTW92ZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25LZXkgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZywgZG9tRXZlbnQ6IEtleWJvYXJkRXZlbnQgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbktleSA9IHRoaXMuX29uS2V5LmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlbmRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW5kZXIgPSB0aGlzLl9vblJlbmRlci5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblRpdGxlQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblRpdGxlQ2hhbmdlID0gdGhpcy5fb25UaXRsZUNoYW5nZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25CZWxsID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25CZWxsID0gdGhpcy5fb25CZWxsLmV2ZW50O1xuXG4gIHByaXZhdGUgX29uRm9jdXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyBnZXQgb25Gb2N1cygpOiBJRXZlbnQ8dm9pZD4geyByZXR1cm4gdGhpcy5fb25Gb2N1cy5ldmVudDsgfVxuICBwcml2YXRlIF9vbkJsdXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyBnZXQgb25CbHVyKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9vbkJsdXIuZXZlbnQ7IH1cbiAgcHJpdmF0ZSBfb25BMTF5Q2hhckVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIGdldCBvbkExMXlDaGFyKCk6IElFdmVudDxzdHJpbmc+IHsgcmV0dXJuIHRoaXMuX29uQTExeUNoYXJFbWl0dGVyLmV2ZW50OyB9XG4gIHByaXZhdGUgX29uQTExeVRhYkVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpKTtcbiAgcHVibGljIGdldCBvbkExMXlUYWIoKTogSUV2ZW50PG51bWJlcj4geyByZXR1cm4gdGhpcy5fb25BMTF5VGFiRW1pdHRlci5ldmVudDsgfVxuICBwcml2YXRlIF9vbldpbGxPcGVuID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50PigpKTtcbiAgcHVibGljIGdldCBvbldpbGxPcGVuKCk6IElFdmVudDxIVE1MRWxlbWVudD4geyByZXR1cm4gdGhpcy5fb25XaWxsT3Blbi5ldmVudDsgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SVRlcm1pbmFsT3B0aW9ucz4gPSB7fVxuICApIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuX3NldHVwKCk7XG5cbiAgICB0aGlzLl9kZWNvcmF0aW9uU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKERlY29yYXRpb25TZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElEZWNvcmF0aW9uU2VydmljZSwgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShMaW5rUHJvdmlkZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElMaW5rUHJvdmlkZXJTZXJ2aWNlLCB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLnJlZ2lzdGVyTGlua1Byb3ZpZGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKE9zY0xpbmtQcm92aWRlcikpO1xuXG4gICAgLy8gU2V0dXAgSW5wdXRIYW5kbGVyIGxpc3RlbmVyc1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdEJlbGwoKCkgPT4gdGhpcy5fb25CZWxsLmZpcmUoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFJlZnJlc2hSb3dzKChzdGFydCwgZW5kKSA9PiB0aGlzLnJlZnJlc2goc3RhcnQsIGVuZCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2lucHV0SGFuZGxlci5vblJlcXVlc3RTZW5kRm9jdXMoKCkgPT4gdGhpcy5fcmVwb3J0Rm9jdXMoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFJlc2V0KCgpID0+IHRoaXMucmVzZXQoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0KHR5cGUgPT4gdGhpcy5fcmVwb3J0V2luZG93c09wdGlvbnModHlwZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2lucHV0SGFuZGxlci5vbkNvbG9yKChldmVudCkgPT4gdGhpcy5faGFuZGxlQ29sb3JFdmVudChldmVudCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9pbnB1dEhhbmRsZXIub25DdXJzb3JNb3ZlLCB0aGlzLl9vbkN1cnNvck1vdmUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9pbnB1dEhhbmRsZXIub25UaXRsZUNoYW5nZSwgdGhpcy5fb25UaXRsZUNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vbkExMXlDaGFyLCB0aGlzLl9vbkExMXlDaGFyRW1pdHRlcikpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vbkExMXlUYWIsIHRoaXMuX29uQTExeVRhYkVtaXR0ZXIpKTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVyc1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5vblJlc2l6ZShlID0+IHRoaXMuX2FmdGVyUmVzaXplKGUuY29scywgZS5yb3dzKSkpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5lbGVtZW50Py5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sb3IgZXZlbnQgZnJvbSBpbnB1dGhhbmRsZXIgZm9yIE9TQyA0fDEwNCB8IDEwfDExMCB8IDExfDExMSB8IDEyfDExMi5cbiAgICogQW4gZXZlbnQgZnJvbSBPU0MgNHwxMDQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgc2V0IG9yIHJlcG9ydCByZXF1ZXN0cywgYW5kIG11bHRpcGxlXG4gICAqIG9yIG5vbmUgcmVzdG9yZSByZXF1ZXN0cyAocmVzZXR0aW5nIGFsbCksXG4gICAqIHdoaWxlIGFuIGV2ZW50IGZyb20gT1NDIDEwfDExMCB8IDExfDExMSB8IDEyfDExMiBhbHdheXMgY29udGFpbnMgYSBzaW5nbGUgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNvbG9yRXZlbnQoZXZlbnQ6IElDb2xvckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90aGVtZVNlcnZpY2UpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHJlcSBvZiBldmVudCkge1xuICAgICAgbGV0IGFjYzogJ2ZvcmVncm91bmQnIHwgJ2JhY2tncm91bmQnIHwgJ2N1cnNvcicgfCAnYW5zaSc7XG4gICAgICBsZXQgaWRlbnQgPSAnJztcbiAgICAgIHN3aXRjaCAocmVxLmluZGV4KSB7XG4gICAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguRk9SRUdST1VORDogLy8gT1NDIDEwIHwgMTEwXG4gICAgICAgICAgYWNjID0gJ2ZvcmVncm91bmQnO1xuICAgICAgICAgIGlkZW50ID0gJzEwJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5CQUNLR1JPVU5EOiAvLyBPU0MgMTEgfCAxMTFcbiAgICAgICAgICBhY2MgPSAnYmFja2dyb3VuZCc7XG4gICAgICAgICAgaWRlbnQgPSAnMTEnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkNVUlNPUjogLy8gT1NDIDEyIHwgMTEyXG4gICAgICAgICAgYWNjID0gJ2N1cnNvcic7XG4gICAgICAgICAgaWRlbnQgPSAnMTInO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBPU0MgNCB8IDEwNFxuICAgICAgICAgIC8vIHdlIGNhbiBza2lwIHRoZSBbMC4uMjU1XSByYW5nZSBjaGVjayBoZXJlIChhbHJlYWR5IGRvbmUgaW4gaW5wdXRoYW5kbGVyKVxuICAgICAgICAgIGFjYyA9ICdhbnNpJztcbiAgICAgICAgICBpZGVudCA9ICc0OycgKyByZXEuaW5kZXg7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgIGNhc2UgQ29sb3JSZXF1ZXN0VHlwZS5SRVBPUlQ6XG4gICAgICAgICAgY29uc3QgY29sb3JSZ2IgPSBjb2xvci50b0NvbG9yUkdCKGFjYyA9PT0gJ2Fuc2knXG4gICAgICAgICAgICA/IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtyZXEuaW5kZXhdXG4gICAgICAgICAgICA6IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnNbYWNjXSk7XG4gICAgICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkVTQ31dJHtpZGVudH07JHt0b1JnYlN0cmluZyhjb2xvclJnYil9JHtDMV9FU0NBUEVELlNUfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbG9yUmVxdWVzdFR5cGUuU0VUOlxuICAgICAgICAgIGlmIChhY2MgPT09ICdhbnNpJykge1xuICAgICAgICAgICAgdGhpcy5fdGhlbWVTZXJ2aWNlLm1vZGlmeUNvbG9ycyhjb2xvcnMgPT4gY29sb3JzLmFuc2lbcmVxLmluZGV4XSA9IGNoYW5uZWxzLnRvQ29sb3IoLi4ucmVxLmNvbG9yKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd2VkQWNjID0gYWNjO1xuICAgICAgICAgICAgdGhpcy5fdGhlbWVTZXJ2aWNlLm1vZGlmeUNvbG9ycyhjb2xvcnMgPT4gY29sb3JzW25hcnJvd2VkQWNjXSA9IGNoYW5uZWxzLnRvQ29sb3IoLi4ucmVxLmNvbG9yKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbG9yUmVxdWVzdFR5cGUuUkVTVE9SRTpcbiAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2UucmVzdG9yZUNvbG9yKHJlcS5pbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXR1cCgpOiB2b2lkIHtcbiAgICBzdXBlci5fc2V0dXAoKTtcblxuICAgIHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBwcm9wZXJ0eSB0byBhY3RpdmUgYnVmZmVyLlxuICAgKi9cbiAgcHVibGljIGdldCBidWZmZXIoKTogSUJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVycy5hY3RpdmU7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdGhlIHRlcm1pbmFsLiBEZWxlZ2F0ZXMgZm9jdXMgaGFuZGxpbmcgdG8gdGhlIHRlcm1pbmFsJ3MgRE9NIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGV4dGFyZWEpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVNjcmVlblJlYWRlck1vZGVPcHRpb25DaGFuZ2UodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5fYWNjZXNzaWJpbGl0eU1hbmFnZXIudmFsdWUgJiYgdGhpcy5fcmVuZGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlci52YWx1ZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhlIGRlc2lyZWQgZm9jdXMgYmVoYXZpb3Igb24gYSBnaXZlbiB0ZXJtaW5hbCBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVUZXh0QXJlYUZvY3VzKGV2OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnNlbmRGb2N1cykge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbSScpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgdGhpcy5fc2hvd0N1cnNvcigpO1xuICAgIHRoaXMuX29uRm9jdXMuZmlyZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJsdXIgdGhlIHRlcm1pbmFsLCBjYWxsaW5nIHRoZSBibHVyIGZ1bmN0aW9uIG9uIHRoZSB0ZXJtaW5hbCdzIHVuZGVybHlpbmdcbiAgICogdGV4dGFyZWEuXG4gICAqL1xuICBwdWJsaWMgYmx1cigpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0YXJlYT8uYmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBkZXNpcmVkIGJsdXIgYmVoYXZpb3Igb24gYSBnaXZlbiB0ZXJtaW5hbCBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVUZXh0QXJlYUJsdXIoKTogdm9pZCB7XG4gICAgLy8gVGV4dCBjYW4gc2FmZWx5IGJlIHJlbW92ZWQgb24gYmx1ci4gRG9pbmcgaXQgZWFybGllciBjb3VsZCBpbnRlcmZlcmUgd2l0aFxuICAgIC8vIHNjcmVlbiByZWFkZXJzIHJlYWRpbmcgaXQgb3V0LlxuICAgIHRoaXMudGV4dGFyZWEhLnZhbHVlID0gJyc7XG4gICAgdGhpcy5yZWZyZXNoKHRoaXMuYnVmZmVyLnksIHRoaXMuYnVmZmVyLnkpO1xuICAgIGlmICh0aGlzLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5zZW5kRm9jdXMpIHtcbiAgICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChDMC5FU0MgKyAnW08nKTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50IS5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1cycpO1xuICAgIHRoaXMuX29uQmx1ci5maXJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jVGV4dEFyZWEoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRleHRhcmVhIHx8ICF0aGlzLmJ1ZmZlci5pc0N1cnNvckluVmlld3BvcnQgfHwgdGhpcy5fY29tcG9zaXRpb25IZWxwZXIhLmlzQ29tcG9zaW5nIHx8ICF0aGlzLl9yZW5kZXJTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnNvclkgPSB0aGlzLmJ1ZmZlci55YmFzZSArIHRoaXMuYnVmZmVyLnk7XG4gICAgY29uc3QgYnVmZmVyTGluZSA9IHRoaXMuYnVmZmVyLmxpbmVzLmdldChjdXJzb3JZKTtcbiAgICBpZiAoIWJ1ZmZlckxpbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3Vyc29yWCA9IE1hdGgubWluKHRoaXMuYnVmZmVyLngsIHRoaXMuY29scyAtIDEpO1xuICAgIGNvbnN0IGNlbGxIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoID0gYnVmZmVyTGluZS5nZXRXaWR0aChjdXJzb3JYKTtcbiAgICBjb25zdCBjZWxsV2lkdGggPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGggKiB3aWR0aDtcbiAgICBjb25zdCBjdXJzb3JUb3AgPSB0aGlzLmJ1ZmZlci55ICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodDtcbiAgICBjb25zdCBjdXJzb3JMZWZ0ID0gY3Vyc29yWCAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aDtcblxuICAgIC8vIFN5bmMgdGhlIHRleHRhcmVhIHRvIHRoZSBleGFjdCBwb3NpdGlvbiBvZiB0aGUgY29tcG9zaXRpb24gdmlldyBzbyB0aGUgSU1FIGtub3dzIHdoZXJlIHRoZVxuICAgIC8vIHRleHQgaXMuXG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gY3Vyc29yTGVmdCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS50b3AgPSBjdXJzb3JUb3AgKyAncHgnO1xuICAgIHRoaXMudGV4dGFyZWEuc3R5bGUud2lkdGggPSBjZWxsV2lkdGggKyAncHgnO1xuICAgIHRoaXMudGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gY2VsbEhlaWdodCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS5saW5lSGVpZ2h0ID0gY2VsbEhlaWdodCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS56SW5kZXggPSAnLTUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgZGVmYXVsdCBiZWhhdmlvclxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdEdsb2JhbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9iaW5kS2V5cygpO1xuXG4gICAgLy8gQmluZCBjbGlwYm9hcmQgZnVuY3Rpb25hbGl0eVxuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuZWxlbWVudCEsICdjb3B5JywgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gSWYgbW91c2UgZXZlbnRzIGFyZSBhY3RpdmUgaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGlzIGRpc2FibGVkIGFuZFxuICAgICAgLy8gY29weSBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgaG9zdCBwcm9ncmFtLlxuICAgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvcHlIYW5kbGVyKGV2ZW50LCB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlISk7XG4gICAgfSkpO1xuICAgIGNvbnN0IHBhc3RlSGFuZGxlcldyYXBwZXIgPSAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCA9PiBoYW5kbGVQYXN0ZUV2ZW50KGV2ZW50LCB0aGlzLnRleHRhcmVhISwgdGhpcy5jb3JlU2VydmljZSwgdGhpcy5vcHRpb25zU2VydmljZSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdwYXN0ZScsIHBhc3RlSGFuZGxlcldyYXBwZXIpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLmVsZW1lbnQhLCAncGFzdGUnLCBwYXN0ZUhhbmRsZXJXcmFwcGVyKSk7XG5cbiAgICAvLyBIYW5kbGUgcmlnaHQgY2xpY2sgY29udGV4dCBtZW51c1xuICAgIGlmIChCcm93c2VyLmlzRmlyZWZveCkge1xuICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IGFwcGVhciB0byBmaXJlIHRoZSBjb250ZXh0bWVudSBldmVudCBvbiByaWdodCBjbGlja1xuICAgICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5lbGVtZW50ISwgJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgICAgcmlnaHRDbGlja0hhbmRsZXIoZXZlbnQsIHRoaXMudGV4dGFyZWEhLCB0aGlzLnNjcmVlbkVsZW1lbnQhLCB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlISwgdGhpcy5vcHRpb25zLnJpZ2h0Q2xpY2tTZWxlY3RzV29yZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5lbGVtZW50ISwgJ2NvbnRleHRtZW51JywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHJpZ2h0Q2xpY2tIYW5kbGVyKGV2ZW50LCB0aGlzLnRleHRhcmVhISwgdGhpcy5zY3JlZW5FbGVtZW50ISwgdGhpcy5fc2VsZWN0aW9uU2VydmljZSEsIHRoaXMub3B0aW9ucy5yaWdodENsaWNrU2VsZWN0c1dvcmQpO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdGhlIHRleHRhcmVhIHVuZGVyIHRoZSBjdXJzb3Igd2hlbiBtaWRkbGUgY2xpY2tpbmcgb24gTGludXggdG8gZW5zdXJlXG4gICAgLy8gbWlkZGxlIGNsaWNrIHRvIHBhc3RlIHNlbGVjdGlvbiB3b3Jrcy4gVGhpcyBvbmx5IGFwcGVhcnMgdG8gd29yayBpbiBDaHJvbWVcbiAgICAvLyBhdCB0aGUgdGltZSBpcyB3cml0aW5nLlxuICAgIGlmIChCcm93c2VyLmlzTGludXgpIHtcbiAgICAgIC8vIFVzZSBhdXhjbGljayBldmVudCBvdmVyIG1vdXNlZG93biB0aGUgbGF0dGVyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLiBOb3RlXG4gICAgICAvLyB0aGF0IHRoZSByZWd1bGFyIGNsaWNrIGV2ZW50IGRvZXNuJ3QgZmlyZSBmb3IgdGhlIG1pZGRsZSBtb3VzZSBidXR0b24uXG4gICAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLmVsZW1lbnQhLCAnYXV4Y2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICAgIG1vdmVUZXh0QXJlYVVuZGVyTW91c2VDdXJzb3IoZXZlbnQsIHRoaXMudGV4dGFyZWEhLCB0aGlzLnNjcmVlbkVsZW1lbnQhKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBrZXkgaGFuZGxpbmcgdG8gdGhlIHRlcm1pbmFsXG4gICAqL1xuICBwcml2YXRlIF9iaW5kS2V5cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2tleXVwJywgKGV2OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9rZXlVcChldiksIHRydWUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2tleWRvd24nLCAoZXY6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2tleURvd24oZXYpLCB0cnVlKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdrZXlwcmVzcycsIChldjogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5fa2V5UHJlc3MoZXYpLCB0cnVlKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdjb21wb3NpdGlvbnN0YXJ0JywgKCkgPT4gdGhpcy5fY29tcG9zaXRpb25IZWxwZXIhLmNvbXBvc2l0aW9uc3RhcnQoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMudGV4dGFyZWEhLCAnY29tcG9zaXRpb251cGRhdGUnLCAoZTogQ29tcG9zaXRpb25FdmVudCkgPT4gdGhpcy5fY29tcG9zaXRpb25IZWxwZXIhLmNvbXBvc2l0aW9udXBkYXRlKGUpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdjb21wb3NpdGlvbmVuZCcsICgpID0+IHRoaXMuX2NvbXBvc2l0aW9uSGVscGVyIS5jb21wb3NpdGlvbmVuZCgpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdpbnB1dCcsIChldjogSW5wdXRFdmVudCkgPT4gdGhpcy5faW5wdXRFdmVudChldiksIHRydWUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub25SZW5kZXIoKCkgPT4gdGhpcy5fY29tcG9zaXRpb25IZWxwZXIhLnVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSB0ZXJtaW5hbCB3aXRoaW4gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmVudCBUaGUgZWxlbWVudCB0byBjcmVhdGUgdGhlIHRlcm1pbmFsIHdpdGhpbi5cbiAgICovXG4gIHB1YmxpYyBvcGVuKHBhcmVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXJtaW5hbCByZXF1aXJlcyBhIHBhcmVudCBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdUZXJtaW5hbC5vcGVuIHdhcyBjYWxsZWQgb24gYW4gZWxlbWVudCB0aGF0IHdhcyBub3QgYXR0YWNoZWQgdG8gdGhlIERPTScpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0ZXJtaW5hbCBpcyBhbHJlYWR5IG9wZW5lZFxuICAgIGlmICh0aGlzLmVsZW1lbnQ/Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlKSB7XG4gICAgICAvLyBBZGp1c3QgdGhlIHdpbmRvdyBpZiBuZWVkZWRcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAhPT0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdykge1xuICAgICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93ID0gdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRvY3VtZW50T3ZlcnJpZGUgJiYgdGhpcy5vcHRpb25zLmRvY3VtZW50T3ZlcnJpZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgdGhpcy5fZG9jdW1lbnQgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSBhcyBEb2N1bWVudDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbWFpbiBlbGVtZW50IGNvbnRhaW5lclxuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZWxlbWVudC5kaXIgPSAnbHRyJzsgICAvLyB4dGVybS5jc3MgYXNzdW1lcyBMVFJcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGVybWluYWwnKTtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgneHRlcm0nKTtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcblxuICAgIC8vIFBlcmZvcm1hbmNlOiBVc2UgYSBkb2N1bWVudCBmcmFnbWVudCB0byBidWlsZCB0aGUgdGVybWluYWxcbiAgICAvLyB2aWV3cG9ydCBhbmQgaGVscGVyIGVsZW1lbnRzIGRldGFjaGVkIGZyb20gdGhlIERPTVxuICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS12aWV3cG9ydCcpO1xuICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuX3ZpZXdwb3J0RWxlbWVudCk7XG5cbiAgICB0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEuY2xhc3NMaXN0LmFkZCgneHRlcm0tc2Nyb2xsLWFyZWEnKTtcbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdmlld3BvcnRTY3JvbGxBcmVhKTtcblxuICAgIHRoaXMuc2NyZWVuRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuc2NyZWVuRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS1zY3JlZW4nKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnNjcmVlbkVsZW1lbnQsICdtb3VzZW1vdmUnLCAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMudXBkYXRlQ3Vyc29yU3R5bGUoZXYpKSk7XG4gICAgLy8gQ3JlYXRlIHRoZSBjb250YWluZXIgdGhhdCB3aWxsIGhvbGQgaGVscGVycyBsaWtlIHRoZSB0ZXh0YXJlYSBmb3JcbiAgICAvLyBjYXB0dXJpbmcgRE9NIEV2ZW50cy4gVGhlbiBwcm9kdWNlIHRoZSBoZWxwZXJzLlxuICAgIHRoaXMuX2hlbHBlckNvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2hlbHBlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS1oZWxwZXJzJyk7XG4gICAgdGhpcy5zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2hlbHBlckNvbnRhaW5lcik7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5zY3JlZW5FbGVtZW50KTtcblxuICAgIHRoaXMudGV4dGFyZWEgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIHRoaXMudGV4dGFyZWEuY2xhc3NMaXN0LmFkZCgneHRlcm0taGVscGVyLXRleHRhcmVhJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBTdHJpbmdzLnByb21wdExhYmVsKTtcbiAgICBpZiAoIUJyb3dzZXIuaXNDaHJvbWVPUykge1xuICAgICAgLy8gQ2hyb21lVm94IG9uIENocm9tZU9TIGRvZXMgbm90IGxpa2UgdGhpcy4gU2VlXG4gICAgICAvLyBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lzc3Vlcy8yNjAxNzAzOTdcbiAgICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLW11bHRpbGluZScsICdmYWxzZScpO1xuICAgIH1cbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXV0b2NvcnJlY3QnLCAnb2ZmJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2F1dG9jYXBpdGFsaXplJywgJ29mZicpO1xuICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdzcGVsbGNoZWNrJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy50ZXh0YXJlYS50YWJJbmRleCA9IDA7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgY29yZSBicm93c2VyIHNlcnZpY2UgYmVmb3JlIHRoZSBnZW5lcmljIHRleHRhcmVhIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHNvIGl0XG4gICAgLy8gaGFuZGxlcyB0aGVtIGZpcnN0LiBPdGhlcndpc2UgdGhlIHJlbmRlcmVycyBtYXkgdXNlIHRoZSB3cm9uZyBmb2N1cyBzdGF0ZS5cbiAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENvcmVCcm93c2VyU2VydmljZSxcbiAgICAgIHRoaXMudGV4dGFyZWEsXG4gICAgICBwYXJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA/PyB3aW5kb3csXG4gICAgICAvLyBGb3JjZSB1bnNhZmUgbnVsbCBpbiBub2RlLmpzIGVudmlyb25tZW50IGZvciB0ZXN0c1xuICAgICAgdGhpcy5fZG9jdW1lbnQgPz8gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSA/IHdpbmRvdy5kb2N1bWVudCA6IG51bGwgYXMgYW55XG4gICAgKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ29yZUJyb3dzZXJTZXJ2aWNlLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSwgJ2ZvY3VzJywgKGV2OiBGb2N1c0V2ZW50KSA9PiB0aGlzLl9oYW5kbGVUZXh0QXJlYUZvY3VzKGV2KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMudGV4dGFyZWEsICdibHVyJywgKCkgPT4gdGhpcy5faGFuZGxlVGV4dEFyZWFCbHVyKCkpKTtcbiAgICB0aGlzLl9oZWxwZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50ZXh0YXJlYSk7XG5cbiAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShDaGFyU2l6ZVNlcnZpY2UsIHRoaXMuX2RvY3VtZW50LCB0aGlzLl9oZWxwZXJDb250YWluZXIpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUNoYXJTaXplU2VydmljZSwgdGhpcy5fY2hhclNpemVTZXJ2aWNlKTtcblxuICAgIHRoaXMuX3RoZW1lU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKFRoZW1lU2VydmljZSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJVGhlbWVTZXJ2aWNlLCB0aGlzLl90aGVtZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENoYXJhY3RlckpvaW5lclNlcnZpY2UpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIHRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UpO1xuXG4gICAgdGhpcy5fcmVuZGVyU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoUmVuZGVyU2VydmljZSwgdGhpcy5yb3dzLCB0aGlzLnNjcmVlbkVsZW1lbnQpKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElSZW5kZXJTZXJ2aWNlLCB0aGlzLl9yZW5kZXJTZXJ2aWNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlKGUgPT4gdGhpcy5fb25SZW5kZXIuZmlyZShlKSkpO1xuICAgIHRoaXMub25SZXNpemUoZSA9PiB0aGlzLl9yZW5kZXJTZXJ2aWNlIS5yZXNpemUoZS5jb2xzLCBlLnJvd3MpKTtcblxuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QuYWRkKCdjb21wb3NpdGlvbi12aWV3Jyk7XG4gICAgdGhpcy5fY29tcG9zaXRpb25IZWxwZXIgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShDb21wb3NpdGlvbkhlbHBlciwgdGhpcy50ZXh0YXJlYSwgdGhpcy5fY29tcG9zaXRpb25WaWV3KTtcbiAgICB0aGlzLl9oZWxwZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29tcG9zaXRpb25WaWV3KTtcblxuICAgIHRoaXMuX21vdXNlU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKE1vdXNlU2VydmljZSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJTW91c2VTZXJ2aWNlLCB0aGlzLl9tb3VzZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5saW5raWZpZXIgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKExpbmtpZmllciwgdGhpcy5zY3JlZW5FbGVtZW50KSk7XG5cbiAgICAvLyBQZXJmb3JtYW5jZTogQWRkIHZpZXdwb3J0IGFuZCBoZWxwZXIgZWxlbWVudHMgZnJvbSB0aGUgZnJhZ21lbnRcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX29uV2lsbE9wZW4uZmlyZSh0aGlzLmVsZW1lbnQpO1xuICAgIH1cbiAgICBjYXRjaCB7IC8qIGZhaWxzIHRvIGxvYWQgYWRkb24gZm9yIHNvbWUgcmVhc29uICovIH1cbiAgICBpZiAoIXRoaXMuX3JlbmRlclNlcnZpY2UuaGFzUmVuZGVyZXIoKSkge1xuICAgICAgdGhpcy5fcmVuZGVyU2VydmljZS5zZXRSZW5kZXJlcih0aGlzLl9jcmVhdGVSZW5kZXJlcigpKTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoVmlld3BvcnQsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCwgdGhpcy5fdmlld3BvcnRTY3JvbGxBcmVhKTtcbiAgICB0aGlzLnZpZXdwb3J0Lm9uUmVxdWVzdFNjcm9sbExpbmVzKGUgPT4gdGhpcy5zY3JvbGxMaW5lcyhlLmFtb3VudCwgZS5zdXBwcmVzc1Njcm9sbEV2ZW50LCBTY3JvbGxTb3VyY2UuVklFV1BPUlQpKSxcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2lucHV0SGFuZGxlci5vblJlcXVlc3RTeW5jU2Nyb2xsQmFyKCgpID0+IHRoaXMudmlld3BvcnQhLnN5bmNTY3JvbGxBcmVhKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMudmlld3BvcnQpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9uQ3Vyc29yTW92ZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlIS5oYW5kbGVDdXJzb3JNb3ZlKCk7XG4gICAgICB0aGlzLl9zeW5jVGV4dEFyZWEoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9uUmVzaXplKCgpID0+IHRoaXMuX3JlbmRlclNlcnZpY2UhLmhhbmRsZVJlc2l6ZSh0aGlzLmNvbHMsIHRoaXMucm93cykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub25CbHVyKCgpID0+IHRoaXMuX3JlbmRlclNlcnZpY2UhLmhhbmRsZUJsdXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vbkZvY3VzKCgpID0+IHRoaXMuX3JlbmRlclNlcnZpY2UhLmhhbmRsZUZvY3VzKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25EaW1lbnNpb25zQ2hhbmdlKCgpID0+IHRoaXMudmlld3BvcnQhLnN5bmNTY3JvbGxBcmVhKCkpKTtcblxuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKFNlbGVjdGlvblNlcnZpY2UsXG4gICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICB0aGlzLnNjcmVlbkVsZW1lbnQsXG4gICAgICB0aGlzLmxpbmtpZmllclxuICAgICkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSVNlbGVjdGlvblNlcnZpY2UsIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fc2VsZWN0aW9uU2VydmljZS5vblJlcXVlc3RTY3JvbGxMaW5lcyhlID0+IHRoaXMuc2Nyb2xsTGluZXMoZS5hbW91bnQsIGUuc3VwcHJlc3NTY3JvbGxFdmVudCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uub25TZWxlY3Rpb25DaGFuZ2UoKCkgPT4gdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLm9uUmVxdWVzdFJlZHJhdyhlID0+IHRoaXMuX3JlbmRlclNlcnZpY2UhLmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoZS5zdGFydCwgZS5lbmQsIGUuY29sdW1uU2VsZWN0TW9kZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uub25MaW51eE1vdXNlU2VsZWN0aW9uKHRleHQgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUncyBhIG5ldyBzZWxlY3Rpb24sIHB1dCBpdCBpbnRvIHRoZSB0ZXh0YXJlYSwgZm9jdXMgYW5kIHNlbGVjdCBpdFxuICAgICAgLy8gaW4gb3JkZXIgdG8gcmVnaXN0ZXIgaXQgYXMgYSBzZWxlY3Rpb24gb24gdGhlIE9TLiBUaGlzIGV2ZW50IGlzIGZpcmVkXG4gICAgICAvLyBvbmx5IG9uIExpbnV4IHRvIGVuYWJsZSBtaWRkbGUgY2xpY2sgdG8gcGFzdGUgc2VsZWN0aW9uLlxuICAgICAgdGhpcy50ZXh0YXJlYSEudmFsdWUgPSB0ZXh0O1xuICAgICAgdGhpcy50ZXh0YXJlYSEuZm9jdXMoKTtcbiAgICAgIHRoaXMudGV4dGFyZWEhLnNlbGVjdCgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29uU2Nyb2xsLmV2ZW50KGV2ID0+IHtcbiAgICAgIHRoaXMudmlld3BvcnQhLnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5yZWZyZXNoKCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX3ZpZXdwb3J0RWxlbWVudCwgJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLnJlZnJlc2goKSkpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShCdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXIsIHRoaXMuc2NyZWVuRWxlbWVudCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuZWxlbWVudCwgJ21vdXNlZG93bicsIChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5oYW5kbGVNb3VzZURvd24oZSkpKTtcblxuICAgIC8vIGFwcGx5IG1vdXNlIGV2ZW50IGNsYXNzZXMgc2V0IGJ5IGVzY2FwZSBjb2RlcyBiZWZvcmUgdGVybWluYWwgd2FzIGF0dGFjaGVkXG4gICAgaWYgKHRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZS5kaXNhYmxlKCk7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZW5hYmxlLW1vdXNlLWV2ZW50cycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2NyZWVuUmVhZGVyTW9kZSkge1xuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBkb25lICphZnRlciogdGhlIHJlbmRlcmVyIGlzIGNyZWF0ZWQgaW4gb3JkZXIgdG9cbiAgICAgIC8vIGVuc3VyZSB0aGUgY29ycmVjdCBvcmRlciBvZiB0aGUgZHByY2hhbmdlIGV2ZW50XG4gICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlci52YWx1ZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLCB0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ3NjcmVlblJlYWRlck1vZGUnLCBlID0+IHRoaXMuX2hhbmRsZVNjcmVlblJlYWRlck1vZGVPcHRpb25DaGFuZ2UoZSkpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnZpZXdSdWxlcldpZHRoKSB7XG4gICAgICB0aGlzLl9vdmVydmlld1J1bGVyUmVuZGVyZXIgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKE92ZXJ2aWV3UnVsZXJSZW5kZXJlciwgdGhpcy5fdmlld3BvcnRFbGVtZW50LCB0aGlzLnNjcmVlbkVsZW1lbnQpKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdvdmVydmlld1J1bGVyV2lkdGgnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX292ZXJ2aWV3UnVsZXJSZW5kZXJlciAmJiB2YWx1ZSAmJiB0aGlzLl92aWV3cG9ydEVsZW1lbnQgJiYgdGhpcy5zY3JlZW5FbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX292ZXJ2aWV3UnVsZXJSZW5kZXJlciA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoT3ZlcnZpZXdSdWxlclJlbmRlcmVyLCB0aGlzLl92aWV3cG9ydEVsZW1lbnQsIHRoaXMuc2NyZWVuRWxlbWVudCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIE1lYXN1cmUgdGhlIGNoYXJhY3RlciBzaXplXG4gICAgdGhpcy5fY2hhclNpemVTZXJ2aWNlLm1lYXN1cmUoKTtcblxuICAgIC8vIFNldHVwIGxvb3AgdGhhdCBkcmF3cyB0byBzY3JlZW5cbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGdsb2JhbCBhY3Rpb25zIHRoYXQgbmVlZCB0byBiZSB0YWtlbiBvbiB0aGUgZG9jdW1lbnQuXG4gICAgdGhpcy5faW5pdEdsb2JhbCgpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBtb3VzZSBldmVudHMgYW5kIHRyYW5zbGF0ZVxuICAgIC8vIHRoZW0gaW50byB0ZXJtaW5hbCBtb3VzZSBwcm90b2NvbHMuXG4gICAgdGhpcy5iaW5kTW91c2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVJlbmRlcmVyKCk6IElSZW5kZXJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKERvbVJlbmRlcmVyLCB0aGlzLCB0aGlzLl9kb2N1bWVudCEsIHRoaXMuZWxlbWVudCEsIHRoaXMuc2NyZWVuRWxlbWVudCEsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCEsIHRoaXMuX2hlbHBlckNvbnRhaW5lciEsIHRoaXMubGlua2lmaWVyISk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBjZXJ0YWluIG1vdXNlIGV2ZW50cyB0byB0aGUgdGVybWluYWwuXG4gICAqIEJ5IGRlZmF1bHQgb25seSAzIGJ1dHRvbiArIHdoZWVsIHVwL2Rvd24gaXMgYXRpdmF0ZWQuIEZvciBoaWdoZXIgYnV0dG9uc1xuICAgKiBubyBtb3VzZSByZXBvcnQgd2lsbCBiZSBjcmVhdGVkLiBUeXBpY2FsbHkgdGhlIHN0YW5kYXJkIGFjdGlvbnMgd2lsbCBiZSBhY3RpdmUuXG4gICAqXG4gICAqIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgbm90IHRvIGVuYWJsZSBzdXBwb3J0IGZvciBoaWdoZXIgYnV0dG9ucy93aGVlbDpcbiAgICogLSBCdXR0b24gNCBhbmQgNSBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGhpc3RvcnkgYmFjayBhbmQgZm9yd2FyZCBuYXZpZ2F0aW9uLFxuICAgKiAgIHRoZXJlIGlzIG5vIHN0cmFpZ2h0IGZvcndhcmQgd2F5IHRvIHN1cHJlc3MvaW50ZXJjZXB0IHRob3NlIHN0YW5kYXJkIGFjdGlvbnMuXG4gICAqIC0gU3VwcG9ydCBmb3IgaGlnaGVyIGJ1dHRvbnMgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtL2Jyb3dzZXIgY29tYmluYXRpb25zLlxuICAgKiAtIExlZnQvcmlnaHQgd2hlZWwgd2FzIG5vdCB0ZXN0ZWQuXG4gICAqIC0gRW11bGF0b3JzIHZhcnkgaW4gbW91c2UgYnV0dG9uIHN1cHBvcnQsIHR5cGljYWxseSBvbmx5IDMgYnV0dG9ucyBhbmRcbiAgICogICB3aGVlbCB1cC9kb3duIHdvcmsgcmVsaWFibGUuXG4gICAqXG4gICAqIFRPRE86IE1vdmUgbW91c2UgZXZlbnQgY29kZSBpbnRvIGl0cyBvd24gZmlsZS5cbiAgICovXG4gIHB1YmxpYyBiaW5kTW91c2UoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnQhO1xuXG4gICAgLy8gc2VuZCBldmVudCB0byBDb3JlTW91c2VTZXJ2aWNlXG4gICAgZnVuY3Rpb24gc2VuZEV2ZW50KGV2OiBNb3VzZUV2ZW50IHwgV2hlZWxFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgLy8gZ2V0IG1vdXNlIGNvb3JkaW5hdGVzXG4gICAgICBjb25zdCBwb3MgPSBzZWxmLl9tb3VzZVNlcnZpY2UhLmdldE1vdXNlUmVwb3J0Q29vcmRzKGV2LCBzZWxmLnNjcmVlbkVsZW1lbnQhKTtcbiAgICAgIGlmICghcG9zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGJ1dDogQ29yZU1vdXNlQnV0dG9uO1xuICAgICAgbGV0IGFjdGlvbjogQ29yZU1vdXNlQWN0aW9uIHwgdW5kZWZpbmVkO1xuICAgICAgc3dpdGNoICgoZXYgYXMgYW55KS5vdmVycmlkZVR5cGUgfHwgZXYudHlwZSkge1xuICAgICAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgICAgICAgIGFjdGlvbiA9IENvcmVNb3VzZUFjdGlvbi5NT1ZFO1xuICAgICAgICAgIGlmIChldi5idXR0b25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGJ1dHRvbnMgaXMgbm90IHN1cHBvcnRlZCBvbiBtYWNPUywgdHJ5IHRvIGdldCBhIHZhbHVlIGZyb20gYnV0dG9uIGluc3RlYWRcbiAgICAgICAgICAgIGJ1dCA9IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgICAgICAgICAgaWYgKGV2LmJ1dHRvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGJ1dCA9IGV2LmJ1dHRvbiA8IDMgPyBldi5idXR0b24gOiBDb3JlTW91c2VCdXR0b24uTk9ORTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIE1ETiBidXR0b25zIG9ubHkgcmVwb3J0cyB1cCB0byBidXR0b24gNSAoQVVYMilcbiAgICAgICAgICAgIGJ1dCA9IGV2LmJ1dHRvbnMgJiAxID8gQ29yZU1vdXNlQnV0dG9uLkxFRlQgOlxuICAgICAgICAgICAgICBldi5idXR0b25zICYgNCA/IENvcmVNb3VzZUJ1dHRvbi5NSURETEUgOlxuICAgICAgICAgICAgICAgIGV2LmJ1dHRvbnMgJiAyID8gQ29yZU1vdXNlQnV0dG9uLlJJR0hUIDpcbiAgICAgICAgICAgICAgICAgIENvcmVNb3VzZUJ1dHRvbi5OT05FOyAvLyBmYWxsYmFjayB0byBOT05FXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICBhY3Rpb24gPSBDb3JlTW91c2VBY3Rpb24uVVA7XG4gICAgICAgICAgYnV0ID0gZXYuYnV0dG9uIDwgMyA/IGV2LmJ1dHRvbiA6IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgICAgIGFjdGlvbiA9IENvcmVNb3VzZUFjdGlvbi5ET1dOO1xuICAgICAgICAgIGJ1dCA9IGV2LmJ1dHRvbiA8IDMgPyBldi5idXR0b24gOiBDb3JlTW91c2VCdXR0b24uTk9ORTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2hlZWwnOlxuICAgICAgICAgIGlmIChzZWxmLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlciAmJiBzZWxmLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlcihldiBhcyBXaGVlbEV2ZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gc2VsZi52aWV3cG9ydCEuZ2V0TGluZXNTY3JvbGxlZChldiBhcyBXaGVlbEV2ZW50KTtcblxuICAgICAgICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSAoZXYgYXMgV2hlZWxFdmVudCkuZGVsdGFZIDwgMCA/IENvcmVNb3VzZUFjdGlvbi5VUCA6IENvcmVNb3VzZUFjdGlvbi5ET1dOO1xuICAgICAgICAgIGJ1dCA9IENvcmVNb3VzZUJ1dHRvbi5XSEVFTDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBkb250IGhhbmRsZSBvdGhlciBldmVudCB0eXBlcyBieSBhY2NpZGVudFxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXhpdCBpZiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHZhbGlkIGJ1dHRvbi9hY3Rpb24gdmFsdWVzXG4gICAgICAvLyBkbyBub3RoaW5nIGZvciBoaWdoZXIgYnV0dG9ucyB0aGFuIHdoZWVsXG4gICAgICBpZiAoYWN0aW9uID09PSB1bmRlZmluZWQgfHwgYnV0ID09PSB1bmRlZmluZWQgfHwgYnV0ID4gQ29yZU1vdXNlQnV0dG9uLldIRUVMKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY29yZU1vdXNlU2VydmljZS50cmlnZ2VyTW91c2VFdmVudCh7XG4gICAgICAgIGNvbDogcG9zLmNvbCxcbiAgICAgICAgcm93OiBwb3Mucm93LFxuICAgICAgICB4OiBwb3MueCxcbiAgICAgICAgeTogcG9zLnksXG4gICAgICAgIGJ1dHRvbjogYnV0LFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGN0cmw6IGV2LmN0cmxLZXksXG4gICAgICAgIGFsdDogZXYuYWx0S2V5LFxuICAgICAgICBzaGlmdDogZXYuc2hpZnRLZXlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxpc3RlbmVyIHN0YXRlIGhhbmRsaW5nLlxuICAgICAqIFdlIGxpc3RlbiB0byB0aGUgb25Qcm90b2NvbENoYW5nZSBldmVudCBvZiBDb3JlTW91c2VTZXJ2aWNlIGFuZCBwdXRcbiAgICAgKiByZXF1ZXN0ZWQgbGlzdGVuZXJzIGluIGByZXF1ZXN0ZWRFdmVudHNgLiBXaXRoIHRoaXMgdGhlIGxpc3RlbmVyc1xuICAgICAqIGhhdmUgYWxsIGJpdHMgdG8gZG8gdGhlIGV2ZW50IGxpc3RlbmVyIGp1Z2dsaW5nLlxuICAgICAqIE5vdGU6ICdtb3VzZWRvd24nIGN1cnJlbnRseSBpcyBcImFsd2F5cyBvblwiIGFuZCBub3QgbWFuYWdlZFxuICAgICAqIGJ5IG9uUHJvdG9jb2xDaGFuZ2UuXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdGVkRXZlbnRzOiB7IFtrZXk6IHN0cmluZ106ICgoZXY6IEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgfSA9IHtcbiAgICAgIG1vdXNldXA6IG51bGwsXG4gICAgICB3aGVlbDogbnVsbCxcbiAgICAgIG1vdXNlZHJhZzogbnVsbCxcbiAgICAgIG1vdXNlbW92ZTogbnVsbFxuICAgIH07XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IHsgW2tleTogc3RyaW5nXTogKGV2OiBhbnkpID0+IHZvaWQgfCBib29sZWFuIH0gPSB7XG4gICAgICBtb3VzZXVwOiAoZXY6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgc2VuZEV2ZW50KGV2KTtcbiAgICAgICAgaWYgKCFldi5idXR0b25zKSB7XG4gICAgICAgICAgLy8gaWYgbm8gb3RoZXIgYnV0dG9uIGlzIGhlbGQgcmVtb3ZlIGdsb2JhbCBoYW5kbGVyc1xuICAgICAgICAgIHRoaXMuX2RvY3VtZW50IS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAhKTtcbiAgICAgICAgICBpZiAocmVxdWVzdGVkRXZlbnRzLm1vdXNlZHJhZykge1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYpO1xuICAgICAgfSxcbiAgICAgIHdoZWVsOiAoZXY6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgICAgc2VuZEV2ZW50KGV2KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2LCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBtb3VzZWRyYWc6IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBkZWFsIG9ubHkgd2l0aCBtb3ZlIHdoaWxlIGEgYnV0dG9uIGlzIGhlbGRcbiAgICAgICAgaWYgKGV2LmJ1dHRvbnMpIHtcbiAgICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbW91c2Vtb3ZlOiAoZXY6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgLy8gZGVhbCBvbmx5IHdpdGggbW92ZSB3aXRob3V0IGFueSBidXR0b25cbiAgICAgICAgaWYgKCFldi5idXR0b25zKSB7XG4gICAgICAgICAgc2VuZEV2ZW50KGV2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLmNvcmVNb3VzZVNlcnZpY2Uub25Qcm90b2NvbENoYW5nZShldmVudHMgPT4ge1xuICAgICAgLy8gYXBwbHkgZ2xvYmFsIGNoYW5nZXMgb24gZXZlbnRzXG4gICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubG9nTGV2ZWwgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdCaW5kaW5nIHRvIG1vdXNlIGV2ZW50czonLCB0aGlzLmNvcmVNb3VzZVNlcnZpY2UuZXhwbGFpbkV2ZW50cyhldmVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5hZGQoJ2VuYWJsZS1tb3VzZS1ldmVudHMnKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZSEuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5iaW5kaW5nIGZyb20gbW91c2UgZXZlbnRzLicpO1xuICAgICAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5yZW1vdmUoJ2VuYWJsZS1tb3VzZS1ldmVudHMnKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZSEuZW5hYmxlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZC9yZW1vdmUgaGFuZGxlcnMgZnJvbSByZXF1ZXN0ZWRFdmVudHNcblxuICAgICAgaWYgKCEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLk1PVkUpKSB7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZW1vdmUhKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNlbW92ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCFyZXF1ZXN0ZWRFdmVudHMubW91c2Vtb3ZlKSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGV2ZW50TGlzdGVuZXJzLm1vdXNlbW92ZSk7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy5tb3VzZW1vdmUgPSBldmVudExpc3RlbmVycy5tb3VzZW1vdmU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5XSEVFTCkpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCByZXF1ZXN0ZWRFdmVudHMud2hlZWwhKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLndoZWVsID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoIXJlcXVlc3RlZEV2ZW50cy53aGVlbCkge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIGV2ZW50TGlzdGVuZXJzLndoZWVsLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgICByZXF1ZXN0ZWRFdmVudHMud2hlZWwgPSBldmVudExpc3RlbmVycy53aGVlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLlVQKSkge1xuICAgICAgICB0aGlzLl9kb2N1bWVudCEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwISk7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoIXJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwKSB7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwID0gZXZlbnRMaXN0ZW5lcnMubW91c2V1cDtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcpKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50IS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCByZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnISk7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghcmVxdWVzdGVkRXZlbnRzLm1vdXNlZHJhZykge1xuICAgICAgICByZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnID0gZXZlbnRMaXN0ZW5lcnMubW91c2VkcmFnO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICAvLyBmb3JjZSBpbml0aWFsIG9uUHJvdG9jb2xDaGFuZ2Ugc28gd2UgZG9udCBtaXNzIGVhcmx5IG1vdXNlIHJlcXVlc3RzXG4gICAgdGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sID0gdGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sO1xuXG4gICAgLyoqXG4gICAgICogXCJBbHdheXMgb25cIiBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIoZWwsICdtb3VzZWRvd24nLCAoZXY6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICAgIC8vIERvbid0IHNlbmQgdGhlIG1vdXNlIGJ1dHRvbiB0byB0aGUgcHR5IGlmIG1vdXNlIGV2ZW50cyBhcmUgZGlzYWJsZWQgb3JcbiAgICAgIC8vIGlmIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBpcyBoYXZpbmcgc2VsZWN0aW9uIGZvcmNlZCAoaWUuIGEgbW9kaWZpZXIgaXNcbiAgICAgIC8vIGhlbGQpLlxuICAgICAgaWYgKCF0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYXJlTW91c2VFdmVudHNBY3RpdmUgfHwgdGhpcy5fc2VsZWN0aW9uU2VydmljZSEuc2hvdWxkRm9yY2VTZWxlY3Rpb24oZXYpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VuZEV2ZW50KGV2KTtcblxuICAgICAgLy8gUmVnaXN0ZXIgYWRkaXRpb25hbCBnbG9iYWwgaGFuZGxlcnMgd2hpY2ggc2hvdWxkIGtlZXAgcmVwb3J0aW5nIG91dHNpZGVcbiAgICAgIC8vIG9mIHRoZSB0ZXJtaW5hbCBlbGVtZW50LlxuICAgICAgLy8gTm90ZTogT3RoZXIgZW11bGF0b3JzIGFsc28gZG8gdGhpcyBmb3IgJ21vdXNlZG93bicgd2hpbGUgYSBidXR0b25cbiAgICAgIC8vIGlzIGhlbGQsIHdlIGN1cnJlbnRseSBsaW1pdCAnbW91c2Vkb3duJyB0byB0aGUgdGVybWluYWwgb25seS5cbiAgICAgIGlmIChyZXF1ZXN0ZWRFdmVudHMubW91c2V1cCkge1xuICAgICAgICB0aGlzLl9kb2N1bWVudCEuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50IS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCByZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2KTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihlbCwgJ3doZWVsJywgKGV2OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICAvLyBkbyBub3RoaW5nLCBpZiBhcHAgc2lkZSBoYW5kbGVzIHdoZWVsIGl0c2VsZlxuICAgICAgaWYgKHJlcXVlc3RlZEV2ZW50cy53aGVlbCkgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5fY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIgJiYgdGhpcy5fY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIoZXYpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5idWZmZXIuaGFzU2Nyb2xsYmFjaykge1xuICAgICAgICAvLyBDb252ZXJ0IHdoZWVsIGV2ZW50cyBpbnRvIHVwL2Rvd24gZXZlbnRzIHdoZW4gdGhlIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIHNjcm9sbGJhY2ssIHRoaXNcbiAgICAgICAgLy8gZW5hYmxlcyBzY3JvbGxpbmcgaW4gYXBwcyBob3N0ZWQgaW4gdGhlIGFsdCBidWZmZXIgc3VjaCBhcyB2aW0gb3IgdG11eC5cbiAgICAgICAgY29uc3QgYW1vdW50ID0gdGhpcy52aWV3cG9ydCEuZ2V0TGluZXNTY3JvbGxlZChldik7XG5cbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSdzIG5vIHZlcnRpY2FsIHNjcm9sbFxuICAgICAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGFuZCBzZW5kIHNlcXVlbmNlc1xuICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IEMwLkVTQyArICh0aGlzLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMgPyAnTycgOiAnWycpICsgKGV2LmRlbHRhWSA8IDAgPyAnQScgOiAnQicpO1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguYWJzKGFtb3VudCk7IGkrKykge1xuICAgICAgICAgIGRhdGEgKz0gc2VxdWVuY2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGRhdGEsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBub3JtYWwgdmlld3BvcnQgc2Nyb2xsaW5nXG4gICAgICAvLyBjb25kaXRpb25hbGx5IHN0b3AgZXZlbnQsIGlmIHRoZSB2aWV3cG9ydCBzdGlsbCBoYWQgcm93cyB0byBzY3JvbGwgd2l0aGluXG4gICAgICBpZiAodGhpcy52aWV3cG9ydCEuaGFuZGxlV2hlZWwoZXYpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldik7XG4gICAgICB9XG4gICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihlbCwgJ3RvdWNoc3RhcnQnLCAoZXY6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYXJlTW91c2VFdmVudHNBY3RpdmUpIHJldHVybjtcbiAgICAgIHRoaXMudmlld3BvcnQhLmhhbmRsZVRvdWNoU3RhcnQoZXYpO1xuICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2KTtcbiAgICB9LCB7IHBhc3NpdmU6IHRydWUgfSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIoZWwsICd0b3VjaG1vdmUnLCAoZXY6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYXJlTW91c2VFdmVudHNBY3RpdmUpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy52aWV3cG9ydCEuaGFuZGxlVG91Y2hNb3ZlKGV2KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYpO1xuICAgICAgfVxuICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSkpO1xuICB9XG5cblxuICAvKipcbiAgICogVGVsbHMgdGhlIHJlbmRlcmVyIHRvIHJlZnJlc2ggdGVybWluYWwgY29udGVudCBiZXR3ZWVuIHR3byByb3dzIChpbmNsdXNpdmUpIGF0IHRoZSBuZXh0XG4gICAqIG9wcG9ydHVuaXR5LlxuICAgKiBAcGFyYW0gc3RhcnQgVGhlIHJvdyB0byBzdGFydCBmcm9tIChiZXR3ZWVuIDAgYW5kIHRoaXMucm93cyAtIDEpLlxuICAgKiBAcGFyYW0gZW5kIFRoZSByb3cgdG8gZW5kIGF0IChiZXR3ZWVuIHN0YXJ0IGFuZCB0aGlzLnJvd3MgLSAxKS5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyU2VydmljZT8ucmVmcmVzaFJvd3Moc3RhcnQsIGVuZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBjdXJzb3Igc3R5bGUgZm9yIGRpZmZlcmVudCBzZWxlY3Rpb24gbW9kZXNcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDdXJzb3JTdHlsZShldjogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uU2VydmljZT8uc2hvdWxkQ29sdW1uU2VsZWN0KGV2KSkge1xuICAgICAgdGhpcy5lbGVtZW50IS5jbGFzc0xpc3QuYWRkKCdjb2x1bW4tc2VsZWN0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZSgnY29sdW1uLXNlbGVjdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBjdXJzb3IgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfc2hvd0N1cnNvcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS5pc0N1cnNvckluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVmcmVzaCh0aGlzLmJ1ZmZlci55LCB0aGlzLmJ1ZmZlci55KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbiwgc291cmNlID0gU2Nyb2xsU291cmNlLlRFUk1JTkFMKTogdm9pZCB7XG4gICAgaWYgKHNvdXJjZSA9PT0gU2Nyb2xsU291cmNlLlZJRVdQT1JUKSB7XG4gICAgICBzdXBlci5zY3JvbGxMaW5lcyhkaXNwLCBzdXBwcmVzc1Njcm9sbEV2ZW50LCBzb3VyY2UpO1xuICAgICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZXdwb3J0Py5zY3JvbGxMaW5lcyhkaXNwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFzdGUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgcGFzdGUoZGF0YSwgdGhpcy50ZXh0YXJlYSEsIHRoaXMuY29yZVNlcnZpY2UsIHRoaXMub3B0aW9uc1NlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIGF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlcihjdXN0b21LZXlFdmVudEhhbmRsZXI6IEN1c3RvbUtleUV2ZW50SGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlciA9IGN1c3RvbUtleUV2ZW50SGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBhdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlcihjdXN0b21XaGVlbEV2ZW50SGFuZGxlcjogQ3VzdG9tV2hlZWxFdmVudEhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlciA9IGN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTGlua1Byb3ZpZGVyKGxpbmtQcm92aWRlcjogSUxpbmtQcm92aWRlcik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5yZWdpc3RlckxpbmtQcm92aWRlcihsaW5rUHJvdmlkZXIpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGhhbmRsZXI6IENoYXJhY3RlckpvaW5lckhhbmRsZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXJtaW5hbCBtdXN0IGJlIG9wZW5lZCBmaXJzdCcpO1xuICAgIH1cbiAgICBjb25zdCBqb2luZXJJZCA9IHRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UucmVnaXN0ZXIoaGFuZGxlcik7XG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgIHJldHVybiBqb2luZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGpvaW5lcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVybWluYWwgbXVzdCBiZSBvcGVuZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UuZGVyZWdpc3Rlcihqb2luZXJJZCkpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hcmtlcnMoKTogSU1hcmtlcltdIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIubWFya2VycztcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck1hcmtlcihjdXJzb3JZT2Zmc2V0OiBudW1iZXIpOiBJTWFya2VyIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuYWRkTWFya2VyKHRoaXMuYnVmZmVyLnliYXNlICsgdGhpcy5idWZmZXIueSArIGN1cnNvcllPZmZzZXQpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5yZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgdGVybWluYWwgaGFzIGFuIGFjdGl2ZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlID8gdGhpcy5fc2VsZWN0aW9uU2VydmljZS5oYXNTZWxlY3Rpb24gOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRleHQgd2l0aGluIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHRoZSBzZWxlY3Rpb24gc3RhcnRzIGF0Li5cbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IHRoZSBzZWxlY3Rpb24gc3RhcnRzIGF0LlxuICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3QoY29sdW1uOiBudW1iZXIsIHJvdzogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLnNldFNlbGVjdGlvbihjb2x1bW4sIHJvdywgbGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0ZXJtaW5hbCdzIGN1cnJlbnQgc2VsZWN0aW9uLCB0aGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGNvcHlcbiAgICogYmVoYXZpb3Igb3V0c2lkZSBvZiB4dGVybS5qcy5cbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uU2VydmljZSA/IHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uVGV4dCA6ICcnO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGlvblBvc2l0aW9uKCk6IElCdWZmZXJSYW5nZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIHx8ICF0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgeDogdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25TdGFydCFbMF0sXG4gICAgICAgIHk6IHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uU3RhcnQhWzFdXG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIHg6IHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uRW5kIVswXSxcbiAgICAgICAgeTogdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25FbmQhWzFdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgdGVybWluYWwgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LmNsZWFyU2VsZWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhbGwgdGV4dCB3aXRoaW4gdGhlIHRlcm1pbmFsLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPy5zZWxlY3RBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMaW5lcyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnNlbGVjdExpbmVzKHN0YXJ0LCBlbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGtleWRvd24gW0tleWJvYXJkRXZlbnRdLlxuICAgKlxuICAgKiBbS2V5Ym9hcmRFdmVudF06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRE9NL0tleWJvYXJkRXZlbnRcbiAgICovXG4gIHByb3RlY3RlZCBfa2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHRoaXMuX2tleURvd25IYW5kbGVkID0gZmFsc2U7XG4gICAgdGhpcy5fa2V5RG93blNlZW4gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlciAmJiB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIoZXZlbnQpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElnbm9yZSBjb21wb3Npbmcgd2l0aCBBbHQga2V5IG9uIE1hYyB3aGVuIG1hY09wdGlvbklzTWV0YSBpcyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkSWdub3JlQ29tcG9zaXRpb24gPSB0aGlzLmJyb3dzZXIuaXNNYWMgJiYgdGhpcy5vcHRpb25zLm1hY09wdGlvbklzTWV0YSAmJiBldmVudC5hbHRLZXk7XG5cbiAgICBpZiAoIXNob3VsZElnbm9yZUNvbXBvc2l0aW9uICYmICF0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEua2V5ZG93bihldmVudCkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2Nyb2xsT25Vc2VySW5wdXQgJiYgdGhpcy5idWZmZXIueWJhc2UgIT09IHRoaXMuYnVmZmVyLnlkaXNwKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXNob3VsZElnbm9yZUNvbXBvc2l0aW9uICYmIChldmVudC5rZXkgPT09ICdEZWFkJyB8fCBldmVudC5rZXkgPT09ICdBbHRHcmFwaCcpKSB7XG4gICAgICB0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGV2YWx1YXRlS2V5Ym9hcmRFdmVudChldmVudCwgdGhpcy5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzLCB0aGlzLmJyb3dzZXIuaXNNYWMsIHRoaXMub3B0aW9ucy5tYWNPcHRpb25Jc01ldGEpO1xuXG4gICAgdGhpcy51cGRhdGVDdXJzb3JTdHlsZShldmVudCk7XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IEtleWJvYXJkUmVzdWx0VHlwZS5QQUdFX0RPV04gfHwgcmVzdWx0LnR5cGUgPT09IEtleWJvYXJkUmVzdWx0VHlwZS5QQUdFX1VQKSB7XG4gICAgICBjb25zdCBzY3JvbGxDb3VudCA9IHRoaXMucm93cyAtIDE7XG4gICAgICB0aGlzLnNjcm9sbExpbmVzKHJlc3VsdC50eXBlID09PSBLZXlib2FyZFJlc3VsdFR5cGUuUEFHRV9VUCA/IC1zY3JvbGxDb3VudCA6IHNjcm9sbENvdW50KTtcbiAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC50eXBlID09PSBLZXlib2FyZFJlc3VsdFR5cGUuU0VMRUNUX0FMTCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNUaGlyZExldmVsU2hpZnQodGhpcy5icm93c2VyLCBldmVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuY2FuY2VsKSB7XG4gICAgICAvLyBUaGUgZXZlbnQgaXMgY2FuY2VsZWQgYXQgdGhlIGVuZCBhbHJlYWR5LCBpcyB0aGlzIG5lY2Vzc2FyeT9cbiAgICAgIHRoaXMuY2FuY2VsKGV2ZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5rZXkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhBQ0s6IFByb2Nlc3MgQS1aIGluIHRoZSBrZXlwcmVzcyBldmVudCB0byBmaXggYW4gaXNzdWUgd2l0aCBtYWNPUyBJTUVzIHdoZXJlIGxvd2VyIGNhc2VcbiAgICAvLyBsZXR0ZXJzIGNhbm5vdCBiZSBpbnB1dCB3aGlsZSBjYXBzIGxvY2sgaXMgb24uXG4gICAgaWYgKGV2ZW50LmtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChldmVudC5rZXkuY2hhckNvZGVBdCgwKSA+PSA2NSAmJiBldmVudC5rZXkuY2hhckNvZGVBdCgwKSA8PSA5MCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdW5wcm9jZXNzZWREZWFkS2V5KSB7XG4gICAgICB0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIGN0cmwrYyBvciBlbnRlciBpcyBiZWluZyBzZW50LCBjbGVhciBvdXQgdGhlIHRleHRhcmVhLiBUaGlzIGlzIGRvbmUgc28gdGhhdCBzY3JlZW4gcmVhZGVyc1xuICAgIC8vIHdpbGwgYW5ub3VuY2UgZGVsZXRlZCBjaGFyYWN0ZXJzLiBUaGlzIHdpbGwgbm90IHdvcmsgMTAwJSBvZiB0aGUgdGltZSBidXQgaXQgc2hvdWxkIGNvdmVyXG4gICAgLy8gbW9zdCBzY2VuYXJpb3MuXG4gICAgaWYgKHJlc3VsdC5rZXkgPT09IEMwLkVUWCB8fCByZXN1bHQua2V5ID09PSBDMC5DUikge1xuICAgICAgdGhpcy50ZXh0YXJlYSEudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLl9vbktleS5maXJlKHsga2V5OiByZXN1bHQua2V5LCBkb21FdmVudDogZXZlbnQgfSk7XG4gICAgdGhpcy5fc2hvd0N1cnNvcigpO1xuICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChyZXN1bHQua2V5LCB0cnVlKTtcblxuICAgIC8vIENhbmNlbCBldmVudHMgd2hlbiBub3QgaW4gc2NyZWVuIHJlYWRlciBtb2RlIHNvIGV2ZW50cyBkb24ndCBnZXQgYnViYmxlZCB1cCBhbmQgaGFuZGxlZCBieVxuICAgIC8vIG90aGVyIGxpc3RlbmVycy4gV2hlbiBzY3JlZW4gcmVhZGVyIG1vZGUgaXMgZW5hYmxlZCwgd2UgZG9uJ3QgY2FuY2VsIHRoZW0gKHVubGVzcyBjdHJsIG9yIGFsdFxuICAgIC8vIGlzIGFsc28gZGVwcmVzc2VkKSBzbyB0aGF0IHRoZSBjdXJzb3IgdGV4dGFyZWEgY2FuIGJlIHVwZGF0ZWQsIHdoaWNoIHRyaWdnZXJzIHRoZSBzY3JlZW5cbiAgICAvLyByZWFkZXIgdG8gcmVhZCBpdC5cbiAgICBpZiAoIXRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlIHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXZlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuX2tleURvd25IYW5kbGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVGhpcmRMZXZlbFNoaWZ0KGJyb3dzZXI6IElCcm93c2VyLCBldjogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRoaXJkTGV2ZWxLZXkgPVxuICAgICAgKGJyb3dzZXIuaXNNYWMgJiYgIXRoaXMub3B0aW9ucy5tYWNPcHRpb25Jc01ldGEgJiYgZXYuYWx0S2V5ICYmICFldi5jdHJsS2V5ICYmICFldi5tZXRhS2V5KSB8fFxuICAgICAgKGJyb3dzZXIuaXNXaW5kb3dzICYmIGV2LmFsdEtleSAmJiBldi5jdHJsS2V5ICYmICFldi5tZXRhS2V5KSB8fFxuICAgICAgKGJyb3dzZXIuaXNXaW5kb3dzICYmIGV2LmdldE1vZGlmaWVyU3RhdGUoJ0FsdEdyYXBoJykpO1xuXG4gICAgaWYgKGV2LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiB0aGlyZExldmVsS2V5O1xuICAgIH1cblxuICAgIC8vIERvbid0IGludm9rZSBmb3IgYXJyb3dzLCBwYWdlRG93biwgaG9tZSwgYmFja3NwYWNlLCBldGMuIChvbiBub24ta2V5cHJlc3MgZXZlbnRzKVxuICAgIHJldHVybiB0aGlyZExldmVsS2V5ICYmICghZXYua2V5Q29kZSB8fCBldi5rZXlDb2RlID4gNDcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9rZXlVcChldjogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2tleURvd25TZWVuID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyICYmIHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcihldikgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF3YXNNb2RpZmllcktleU9ubHlFdmVudChldikpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUN1cnNvclN0eWxlKGV2KTtcbiAgICB0aGlzLl9rZXlQcmVzc0hhbmRsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBrZXlwcmVzcyBldmVudC5cbiAgICogS2V5IFJlc291cmNlczpcbiAgICogICAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRE9NL0tleWJvYXJkRXZlbnRcbiAgICogQHBhcmFtIGV2IFRoZSBrZXlwcmVzcyBldmVudCB0byBiZSBoYW5kbGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9rZXlQcmVzcyhldjogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBrZXk7XG5cbiAgICB0aGlzLl9rZXlQcmVzc0hhbmRsZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLl9rZXlEb3duSGFuZGxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgJiYgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyKGV2KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbmNlbChldik7XG5cbiAgICBpZiAoZXYuY2hhckNvZGUpIHtcbiAgICAgIGtleSA9IGV2LmNoYXJDb2RlO1xuICAgIH0gZWxzZSBpZiAoZXYud2hpY2ggPT09IG51bGwgfHwgZXYud2hpY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gZXYua2V5Q29kZTtcbiAgICB9IGVsc2UgaWYgKGV2LndoaWNoICE9PSAwICYmIGV2LmNoYXJDb2RlICE9PSAwKSB7XG4gICAgICBrZXkgPSBldi53aGljaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgha2V5IHx8IChcbiAgICAgIChldi5hbHRLZXkgfHwgZXYuY3RybEtleSB8fCBldi5tZXRhS2V5KSAmJiAhdGhpcy5faXNUaGlyZExldmVsU2hpZnQodGhpcy5icm93c2VyLCBldilcbiAgICApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAga2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpO1xuXG4gICAgdGhpcy5fb25LZXkuZmlyZSh7IGtleSwgZG9tRXZlbnQ6IGV2IH0pO1xuICAgIHRoaXMuX3Nob3dDdXJzb3IoKTtcbiAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoa2V5LCB0cnVlKTtcblxuICAgIHRoaXMuX2tleVByZXNzSGFuZGxlZCA9IHRydWU7XG5cbiAgICAvLyBUaGUga2V5IHdhcyBoYW5kbGVkIHNvIGNsZWFyIHRoZSBkZWFkIGtleSBzdGF0ZSwgb3RoZXJ3aXNlIGNlcnRhaW4ga2V5c3Ryb2tlcyBsaWtlIGFycm93XG4gICAgLy8ga2V5cyBjb3VsZCBiZSBpZ25vcmVkXG4gICAgdGhpcy5fdW5wcm9jZXNzZWREZWFkS2V5ID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYW4gaW5wdXQgZXZlbnQuXG4gICAqIEtleSBSZXNvdXJjZXM6XG4gICAqICAgLSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW5wdXRFdmVudFxuICAgKiBAcGFyYW0gZXYgVGhlIGlucHV0IGV2ZW50IHRvIGJlIGhhbmRsZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2lucHV0RXZlbnQoZXY6IElucHV0RXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHN1cHBvcnQgZW1vamkgSU1FcyB3aGVuIHNjcmVlbiByZWFkZXIgbW9kZSBpcyBkaXNhYmxlZCBhcyB0aGUgZXZlbnQgbXVzdCBidWJibGUgdXAgdG9cbiAgICAvLyBzdXBwb3J0IHJlYWRpbmcgb3V0IGNoYXJhY3RlciBpbnB1dCB3aGljaCBjYW4gZG91YmxpbmcgdXAgaW5wdXQgY2hhcmFjdGVyc1xuICAgIC8vIEJhc2VkIG9uIHRoZXNlIGV2ZW50IHRyYWNlczogaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2NzlcbiAgICBpZiAoZXYuZGF0YSAmJiBldi5pbnB1dFR5cGUgPT09ICdpbnNlcnRUZXh0JyAmJiAoIWV2LmNvbXBvc2VkIHx8ICF0aGlzLl9rZXlEb3duU2VlbikgJiYgIXRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlKSB7XG4gICAgICBpZiAodGhpcy5fa2V5UHJlc3NIYW5kbGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGtleSB3YXMgaGFuZGxlZCBzbyBjbGVhciB0aGUgZGVhZCBrZXkgc3RhdGUsIG90aGVyd2lzZSBjZXJ0YWluIGtleXN0cm9rZXMgbGlrZSBhcnJvd1xuICAgICAgLy8ga2V5cyBjb3VsZCBiZSBpZ25vcmVkXG4gICAgICB0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdGV4dCA9IGV2LmRhdGE7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQodGV4dCwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuY2FuY2VsKGV2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemVzIHRoZSB0ZXJtaW5hbC5cbiAgICpcbiAgICogQHBhcmFtIHggVGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIHJlc2l6ZSB0by5cbiAgICogQHBhcmFtIHkgVGhlIG51bWJlciBvZiByb3dzIHRvIHJlc2l6ZSB0by5cbiAgICovXG4gIHB1YmxpYyByZXNpemUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoeCA9PT0gdGhpcy5jb2xzICYmIHkgPT09IHRoaXMucm93cykge1xuICAgICAgLy8gQ2hlY2sgaWYgd2Ugc3RpbGwgbmVlZCB0byBtZWFzdXJlIHRoZSBjaGFyIHNpemUgKGZpeGVzICM3ODUpLlxuICAgICAgaWYgKHRoaXMuX2NoYXJTaXplU2VydmljZSAmJiAhdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhhc1ZhbGlkU2l6ZSkge1xuICAgICAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UubWVhc3VyZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLnJlc2l6ZSh4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FmdGVyUmVzaXplKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhclNpemVTZXJ2aWNlPy5tZWFzdXJlKCk7XG5cbiAgICAvLyBTeW5jIHRoZSBzY3JvbGwgYXJlYSB0byBtYWtlIHN1cmUgc2Nyb2xsIGV2ZW50cyBkb24ndCBmaXJlIGFuZCBzY3JvbGwgdGhlIHZpZXdwb3J0IHRvIGFuXG4gICAgLy8gaW52YWxpZCBsb2NhdGlvblxuICAgIHRoaXMudmlld3BvcnQ/LnN5bmNTY3JvbGxBcmVhKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBlbnRpcmUgYnVmZmVyLCBtYWtpbmcgdGhlIHByb21wdCBsaW5lIHRoZSBuZXcgZmlyc3QgbGluZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5idWZmZXIueWJhc2UgPT09IDAgJiYgdGhpcy5idWZmZXIueSA9PT0gMCkge1xuICAgICAgLy8gRG9uJ3QgY2xlYXIgaWYgaXQncyBhbHJlYWR5IGNsZWFyXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLmNsZWFyQWxsTWFya2VycygpO1xuICAgIHRoaXMuYnVmZmVyLmxpbmVzLnNldCgwLCB0aGlzLmJ1ZmZlci5saW5lcy5nZXQodGhpcy5idWZmZXIueWJhc2UgKyB0aGlzLmJ1ZmZlci55KSEpO1xuICAgIHRoaXMuYnVmZmVyLmxpbmVzLmxlbmd0aCA9IDE7XG4gICAgdGhpcy5idWZmZXIueWRpc3AgPSAwO1xuICAgIHRoaXMuYnVmZmVyLnliYXNlID0gMDtcbiAgICB0aGlzLmJ1ZmZlci55ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICB0aGlzLmJ1ZmZlci5saW5lcy5wdXNoKHRoaXMuYnVmZmVyLmdldEJsYW5rTGluZShERUZBVUxUX0FUVFJfREFUQSkpO1xuICAgIH1cbiAgICAvLyBJTVBPUlRBTlQ6IEZpcmUgc2Nyb2xsIGV2ZW50IGJlZm9yZSB2aWV3cG9ydCBpcyByZXNldC4gVGhpcyBlbnN1cmVzIGVtYmVkZGVycyBnZXQgdGhlIGNsZWFyXG4gICAgLy8gc2Nyb2xsIGV2ZW50IGFuZCB0aGF0IHRoZSB2aWV3cG9ydCdzIHN0YXRlIHdpbGwgYmUgdmFsaWQgZm9yIGltbWVkaWF0ZSB3cml0ZXMuXG4gICAgdGhpcy5fb25TY3JvbGwuZmlyZSh7IHBvc2l0aW9uOiB0aGlzLmJ1ZmZlci55ZGlzcCwgc291cmNlOiBTY3JvbGxTb3VyY2UuVEVSTUlOQUwgfSk7XG4gICAgdGhpcy52aWV3cG9ydD8ucmVzZXQoKTtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGVybWluYWwuXG4gICAqIE5vdGU6IENhbGxpbmcgdGhpcyBkaXJlY3RseSBmcm9tIEpTIGlzIHN5bmNocm9ub3VzIGJ1dCBkb2VzIG5vdCBjbGVhclxuICAgKiBpbnB1dCBidWZmZXJzIGFuZCBkb2VzIG5vdCByZXNldCB0aGUgcGFyc2VyLCB0aHVzIHRoZSB0ZXJtaW5hbCB3aWxsXG4gICAqIGNvbnRpbnVlIHRvIGFwcGx5IHBlbmRpbmcgaW5wdXQgZGF0YS5cbiAgICogSWYgeW91IG5lZWQgaW4gYmFuZCByZXNldCAoc3luY2hyb25vdXMgd2l0aCBpbnB1dCBkYXRhKSBjb25zaWRlclxuICAgKiB1c2luZyBERUNTVFIgKHNvZnQgcmVzZXQsIENTSSAhIHApIG9yIFJJUyBpbnN0ZWFkIChoYXJkIHJlc2V0LCBFU0MgYykuXG4gICAqL1xuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogU2luY2UgX3NldHVwIGhhbmRsZXMgYSBmdWxsIHRlcm1pbmFsIGNyZWF0aW9uLCB3ZSBoYXZlIHRvIGNhcnJ5IGZvcndhcmRcbiAgICAgKiBhIGZldyB0aGluZ3MgdGhhdCBzaG91bGQgbm90IHJlc2V0LlxuICAgICAqL1xuICAgIHRoaXMub3B0aW9ucy5yb3dzID0gdGhpcy5yb3dzO1xuICAgIHRoaXMub3B0aW9ucy5jb2xzID0gdGhpcy5jb2xzO1xuICAgIGNvbnN0IGN1c3RvbUtleUV2ZW50SGFuZGxlciA9IHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcjtcblxuICAgIHRoaXMuX3NldHVwKCk7XG4gICAgc3VwZXIucmVzZXQoKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPy5yZXNldCgpO1xuICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy52aWV3cG9ydD8ucmVzZXQoKTtcblxuICAgIC8vIHJlYXR0YWNoXG4gICAgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gY3VzdG9tS2V5RXZlbnRIYW5kbGVyO1xuXG4gICAgLy8gZG8gYSBmdWxsIHNjcmVlbiByZWZyZXNoXG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyVGV4dHVyZUF0bGFzKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlclNlcnZpY2U/LmNsZWFyVGV4dHVyZUF0bGFzKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXBvcnRGb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbGVtZW50Py5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzJykpIHtcbiAgICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChDMC5FU0MgKyAnW0knKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbTycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydFdpbmRvd3NPcHRpb25zKHR5cGU6IFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVuZGVyU2VydmljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGUuR0VUX1dJTl9TSVpFX1BJWEVMUzpcbiAgICAgICAgY29uc3QgY2FudmFzV2lkdGggPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aC50b0ZpeGVkKDApO1xuICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQudG9GaXhlZCgwKTtcbiAgICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkVTQ31bNDske2NhbnZhc0hlaWdodH07JHtjYW52YXNXaWR0aH10YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGUuR0VUX0NFTExfU0laRV9QSVhFTFM6XG4gICAgICAgIGNvbnN0IGNlbGxXaWR0aCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aC50b0ZpeGVkKDApO1xuICAgICAgICBjb25zdCBjZWxsSGVpZ2h0ID0gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodC50b0ZpeGVkKDApO1xuICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVs2OyR7Y2VsbEhlaWdodH07JHtjZWxsV2lkdGh9dGApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBSZW1vdmUgY2FuY2VsIGZ1bmN0aW9uIGFuZCBjYW5jZWxFdmVudHMgb3B0aW9uXG4gIHB1YmxpYyBjYW5jZWwoZXY6IEV2ZW50LCBmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jYW5jZWxFdmVudHMgJiYgIWZvcmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyc1xuICovXG5cbmZ1bmN0aW9uIHdhc01vZGlmaWVyS2V5T25seUV2ZW50KGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBldi5rZXlDb2RlID09PSAxNiB8fCAvLyBTaGlmdFxuICAgIGV2LmtleUNvZGUgPT09IDE3IHx8IC8vIEN0cmxcbiAgICBldi5rZXlDb2RlID09PSAxODsgLy8gQWx0XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmNvbnN0IFJFTkRFUl9ERUJPVU5DRV9USFJFU0hPTERfTVMgPSAxMDAwOyAvLyAxIFNlY29uZFxuXG5pbXBvcnQgeyBJUmVuZGVyRGVib3VuY2VyIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5cbi8qKlxuICogRGVib3VuY2VzIGNhbGxzIHRvIHVwZGF0ZSBzY3JlZW4gcmVhZGVycyB0byB1cGRhdGUgYXQgbW9zdCBvbmNlIGNvbmZpZ3VyYWJsZSBpbnRlcnZhbCBvZiB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgVGltZUJhc2VkRGVib3VuY2VyIGltcGxlbWVudHMgSVJlbmRlckRlYm91bmNlciB7XG4gIHByaXZhdGUgX3Jvd1N0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Jvd0VuZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBsYXN0IG1vbWVudCB0aGF0IHRoZSBUZXJtaW5hbCB3YXMgcmVmcmVzaGVkIGF0XG4gIHByaXZhdGUgX2xhc3RSZWZyZXNoTXMgPSAwO1xuICAvLyBXaGV0aGVyIGEgdHJhaWxpbmcgcmVmcmVzaCBzaG91bGQgYmUgdHJpZ2dlcmVkIGR1ZSB0byBhIHJlZnJlc2ggcmVxdWVzdCB0aGF0IHdhcyB0aHJvdHRsZWRcbiAgcHJpdmF0ZSBfYWRkaXRpb25hbFJlZnJlc2hSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9yZWZyZXNoVGltZW91dElEOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcmVuZGVyQ2FsbGJhY2s6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZWJvdW5jZVRocmVzaG9sZE1TID0gUkVOREVSX0RFQk9VTkNFX1RIUkVTSE9MRF9NU1xuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZWZyZXNoVGltZW91dElEKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVmcmVzaFRpbWVvdXRJRCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2gocm93U3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcm93RW5kOiBudW1iZXIgfCB1bmRlZmluZWQsIHJvd0NvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dDb3VudCA9IHJvd0NvdW50O1xuICAgIC8vIEdldCB0aGUgbWluL21heCByb3cgc3RhcnQvZW5kIGZvciB0aGUgYXJnIHZhbHVlc1xuICAgIHJvd1N0YXJ0ID0gcm93U3RhcnQgIT09IHVuZGVmaW5lZCA/IHJvd1N0YXJ0IDogMDtcbiAgICByb3dFbmQgPSByb3dFbmQgIT09IHVuZGVmaW5lZCA/IHJvd0VuZCA6IHRoaXMuX3Jvd0NvdW50IC0gMTtcbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgdG8gdGhlIHVwZGF0ZWQgdmFsdWVzXG4gICAgdGhpcy5fcm93U3RhcnQgPSB0aGlzLl9yb3dTdGFydCAhPT0gdW5kZWZpbmVkID8gTWF0aC5taW4odGhpcy5fcm93U3RhcnQsIHJvd1N0YXJ0KSA6IHJvd1N0YXJ0O1xuICAgIHRoaXMuX3Jvd0VuZCA9IHRoaXMuX3Jvd0VuZCAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgodGhpcy5fcm93RW5kLCByb3dFbmQpIDogcm93RW5kO1xuXG4gICAgLy8gT25seSByZWZyZXNoIGlmIHRoZSB0aW1lIHNpbmNlIGxhc3QgcmVmcmVzaCBpcyBhYm92ZSBhIHRocmVzaG9sZCwgb3RoZXJ3aXNlIHdhaXQgZm9yXG4gICAgLy8gZW5vdWdoIHRpbWUgdG8gcGFzcyBiZWZvcmUgcmVmcmVzaGluZyBhZ2Fpbi5cbiAgICBjb25zdCByZWZyZXNoUmVxdWVzdFRpbWU6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgaWYgKHJlZnJlc2hSZXF1ZXN0VGltZSAtIHRoaXMuX2xhc3RSZWZyZXNoTXMgPj0gdGhpcy5fZGVib3VuY2VUaHJlc2hvbGRNUykge1xuICAgICAgLy8gRW5vdWdoIHRpbWUgaGFzIGxhcHNlZCBzaW5jZSB0aGUgbGFzdCByZWZyZXNoOyByZWZyZXNoIGltbWVkaWF0ZWx5XG4gICAgICB0aGlzLl9sYXN0UmVmcmVzaE1zID0gcmVmcmVzaFJlcXVlc3RUaW1lO1xuICAgICAgdGhpcy5faW5uZXJSZWZyZXNoKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fYWRkaXRpb25hbFJlZnJlc2hSZXF1ZXN0ZWQpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGFkZGl0aW9uYWwgcmVxdWVzdCB0aHJvdHRsZWQ7IHNldCB1cCB0cmFpbGluZyByZWZyZXNoXG4gICAgICBjb25zdCBlbGFwc2VkID0gcmVmcmVzaFJlcXVlc3RUaW1lIC0gdGhpcy5fbGFzdFJlZnJlc2hNcztcbiAgICAgIGNvbnN0IHdhaXRQZXJpb2RCZWZvcmVUcmFpbGluZ1JlZnJlc2ggPSB0aGlzLl9kZWJvdW5jZVRocmVzaG9sZE1TIC0gZWxhcHNlZDtcbiAgICAgIHRoaXMuX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fcmVmcmVzaFRpbWVvdXRJRCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fbGFzdFJlZnJlc2hNcyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuX2lubmVyUmVmcmVzaCgpO1xuICAgICAgICB0aGlzLl9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZWZyZXNoVGltZW91dElEID0gdW5kZWZpbmVkOyAvLyBObyBsb25nZXIgbmVlZCB0byBjbGVhciB0aGUgdGltZW91dFxuICAgICAgfSwgd2FpdFBlcmlvZEJlZm9yZVRyYWlsaW5nUmVmcmVzaCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5uZXJSZWZyZXNoKCk6IHZvaWQge1xuICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZXMgYXJlIHNldFxuICAgIGlmICh0aGlzLl9yb3dTdGFydCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3Jvd0VuZCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3Jvd0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCB2YWx1ZXNcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KHRoaXMuX3Jvd1N0YXJ0LCAwKTtcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbih0aGlzLl9yb3dFbmQsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG5cbiAgICAvLyBSZXNldCBkZWJvdW5jZXIgKHRoaXMgaGFwcGVucyBiZWZvcmUgcmVuZGVyIGNhbGxiYWNrIGFzIHRoZSByZW5kZXIgY291bGQgdHJpZ2dlciBpdCBhZ2FpbilcbiAgICB0aGlzLl9yb3dTdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yb3dFbmQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSdW4gcmVuZGVyIGNhbGxiYWNrXG4gICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soc3RhcnQsIGVuZCk7XG4gIH1cbn1cblxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIgfSBmcm9tICdicm93c2VyL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJVmlld3BvcnQsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVJlbmRlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmNvbnN0IEZBTExCQUNLX1NDUk9MTF9CQVJfV0lEVEggPSAxNTtcblxuaW50ZXJmYWNlIElTbW9vdGhTY3JvbGxTdGF0ZSB7XG4gIHN0YXJ0VGltZTogbnVtYmVyO1xuICBvcmlnaW46IG51bWJlcjtcbiAgdGFyZ2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdmlld3BvcnQgb2YgYSB0ZXJtaW5hbCwgdGhlIHZpc2libGUgYXJlYSB3aXRoaW4gdGhlIGxhcmdlciBidWZmZXIgb2Ygb3V0cHV0LlxuICogTG9naWMgZm9yIHRoZSB2aXJ0dWFsIHNjcm9sbCBiYXIgaXMgaW5jbHVkZWQgaW4gdGhpcyBvYmplY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBWaWV3cG9ydCBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVmlld3BvcnQge1xuICBwdWJsaWMgc2Nyb2xsQmFyV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2N1cnJlbnRSb3dIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2N1cnJlbnREZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RUb3VjaFk6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RTY3JvbGxUb3A6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2FjdGl2ZUJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcHJpdmF0ZSBfcmVuZGVyRGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnM7XG5cbiAgLy8gU3RvcmVzIGEgcGFydGlhbCBsaW5lIGFtb3VudCB3aGVuIHNjcm9sbGluZywgdGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG11Y2ggb2YgYSBsaW5lXG4gIC8vIGlzIHNjcm9sbGVkIHNvIHdlIGNhbiBcInNjcm9sbFwiIG92ZXIgcGFydGlhbCBsaW5lcyBhbmQgZmVlbCBuYXR1cmFsIG9uIHRvdWNocGFkcy4gVGhpcyBpcyBhXG4gIC8vIHF1aWNrIGZpeCBhbmQgY291bGQgaGF2ZSBhIG1vcmUgcm9idXN0IHNvbHV0aW9uIGluIHBsYWNlIHRoYXQgcmVzZXQgdGhlIHZhbHVlIHdoZW4gbmVlZGVkLlxuICBwcml2YXRlIF93aGVlbFBhcnRpYWxTY3JvbGw6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaEFuaW1hdGlvbkZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaWdub3JlTmV4dFNjcm9sbEV2ZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Ntb290aFNjcm9sbFN0YXRlOiBJU21vb3RoU2Nyb2xsU3RhdGUgPSB7XG4gICAgc3RhcnRUaW1lOiAwLFxuICAgIG9yaWdpbjogLTEsXG4gICAgdGFyZ2V0OiAtMVxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFNjcm9sbExpbmVzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgYW1vdW50OiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ6IGJvb2xlYW4gfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RTY3JvbGxMaW5lcyA9IHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUNoYXJTaXplU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UsXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlLFxuICAgIEBJQ29yZUJyb3dzZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBASVRoZW1lU2VydmljZSB0aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIE1lYXN1cmUgdGhlIHdpZHRoIG9mIHRoZSBzY3JvbGxiYXIuIElmIGl0IGlzIDAgd2UgY2FuIGFzc3VtZSBpdCdzIGFuIE9TWCBvdmVybGF5IHNjcm9sbGJhci5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBvdmVybGF5IHNjcm9sbGJhciB3b3VsZCBiZSBoaWRkZW4gdW5kZXJuZWF0aCB0aGUgc2NyZWVuIGVsZW1lbnQgaW4gdGhhdFxuICAgIC8vIGNhc2UsIHRoZXJlZm9yZSB3ZSBhY2NvdW50IGZvciBhIHN0YW5kYXJkIGFtb3VudCB0byBtYWtlIGl0IHZpc2libGVcbiAgICB0aGlzLnNjcm9sbEJhcldpZHRoID0gKHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5vZmZzZXRXaWR0aCAtIHRoaXMuX3Njcm9sbEFyZWEub2Zmc2V0V2lkdGgpIHx8IEZBTExCQUNLX1NDUk9MTF9CQVJfV0lEVEg7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fdmlld3BvcnRFbGVtZW50LCAnc2Nyb2xsJywgdGhpcy5faGFuZGxlU2Nyb2xsLmJpbmQodGhpcykpKTtcblxuICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdXNlZCBpbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBjb2RlIG1hbnVhbGx5IHRvIGF2b2lkIHVzaW5nIHNsb3cgZ2V0dGVyc1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoZSA9PiB0aGlzLl9hY3RpdmVCdWZmZXIgPSBlLmFjdGl2ZUJ1ZmZlcikpO1xuICAgIHRoaXMuX3JlbmRlckRpbWVuc2lvbnMgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnM7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZShlID0+IHRoaXMuX3JlbmRlckRpbWVuc2lvbnMgPSBlKSk7XG5cbiAgICB0aGlzLl9oYW5kbGVUaGVtZUNoYW5nZSh0aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycyhlID0+IHRoaXMuX2hhbmRsZVRoZW1lQ2hhbmdlKGUpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdzY3JvbGxiYWNrJywgKCkgPT4gdGhpcy5zeW5jU2Nyb2xsQXJlYSgpKSk7XG5cbiAgICAvLyBQZXJmb3JtIHRoaXMgYXN5bmMgdG8gZW5zdXJlIHRoZSBJQ2hhclNpemVTZXJ2aWNlIGlzIHJlYWR5LlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jU2Nyb2xsQXJlYSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVRoZW1lQ2hhbmdlKGNvbG9yczogUmVhZG9ubHlDb2xvclNldCk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcnMuYmFja2dyb3VuZC5jc3M7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFJvd0hlaWdodCA9IDA7XG4gICAgdGhpcy5fY3VycmVudERldmljZUNlbGxIZWlnaHQgPSAwO1xuICAgIHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgdGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQgPSAwO1xuICAgIHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCA9IDA7XG4gICAgdGhpcy5fbGFzdFRvdWNoWSA9IDA7XG4gICAgdGhpcy5fbGFzdFNjcm9sbFRvcCA9IDA7XG4gICAgLy8gU3luYyBvbiBuZXh0IGFuaW1hdGlvbiBmcmFtZSB0byBlbnN1cmUgdGhlIG5ldyB0ZXJtaW5hbCBzdGF0ZSBpcyB1c2VkXG4gICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5zeW5jU2Nyb2xsQXJlYSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgcm93IGhlaWdodCwgc2V0dGluZyBsaW5lLWhlaWdodCwgdmlld3BvcnQgaGVpZ2h0IGFuZCBzY3JvbGwgYXJlYSBoZWlnaHQgaWZcbiAgICogbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVmcmVzaChpbW1lZGlhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICB0aGlzLl9pbm5lclJlZnJlc2goKTtcbiAgICAgIGlmICh0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl9pbm5lclJlZnJlc2goKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5uZXJSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0ID4gMCkge1xuICAgICAgdGhpcy5fY3VycmVudFJvd0hlaWdodCA9IHRoaXMuX3JlbmRlckRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0IC8gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICAgIHRoaXMuX2N1cnJlbnREZXZpY2VDZWxsSGVpZ2h0ID0gdGhpcy5fcmVuZGVyRGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQ7XG4gICAgICB0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICBjb25zdCBuZXdCdWZmZXJIZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQgKiB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGgpICsgKHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0IC0gdGhpcy5fcmVuZGVyRGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCk7XG4gICAgICBpZiAodGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0ICE9PSBuZXdCdWZmZXJIZWlnaHQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0ID0gbmV3QnVmZmVySGVpZ2h0O1xuICAgICAgICB0aGlzLl9zY3JvbGxBcmVhLnN0eWxlLmhlaWdodCA9IHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3luYyBzY3JvbGxUb3BcbiAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCAqIHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQ7XG4gICAgaWYgKHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgIT09IHNjcm9sbFRvcCkge1xuICAgICAgLy8gSWdub3JlIHRoZSBuZXh0IHNjcm9sbCBldmVudCB3aGljaCB3aWxsIGJlIHRyaWdnZXJlZCBieSBzZXR0aW5nIHRoZSBzY3JvbGxUb3AgYXMgd2UgZG8gbm90XG4gICAgICAvLyB3YW50IHRoaXMgZXZlbnQgdG8gc2Nyb2xsIHRoZSB0ZXJtaW5hbFxuICAgICAgdGhpcy5faWdub3JlTmV4dFNjcm9sbEV2ZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGRpbWVuc2lvbnMgYW5kIHN5bmNocm9uaXplcyB0aGUgc2Nyb2xsIGFyZWEgaWYgbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHVibGljIHN5bmNTY3JvbGxBcmVhKGltbWVkaWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gSWYgYnVmZmVyIGhlaWdodCBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCAhPT0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGggPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5sZW5ndGg7XG4gICAgICB0aGlzLl9yZWZyZXNoKGltbWVkaWF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdmlld3BvcnQgaGVpZ2h0IGNoYW5nZWRcbiAgICBpZiAodGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQgIT09IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCkge1xuICAgICAgdGhpcy5fcmVmcmVzaChpbW1lZGlhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBidWZmZXIgcG9zaXRpb24gZG9lc24ndCBtYXRjaCBsYXN0IHNjcm9sbCB0b3BcbiAgICBpZiAodGhpcy5fbGFzdFNjcm9sbFRvcCAhPT0gdGhpcy5fYWN0aXZlQnVmZmVyLnlkaXNwICogdGhpcy5fY3VycmVudFJvd0hlaWdodCkge1xuICAgICAgdGhpcy5fcmVmcmVzaChpbW1lZGlhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHJvdyBoZWlnaHQgY2hhbmdlZFxuICAgIGlmICh0aGlzLl9yZW5kZXJEaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAhPT0gdGhpcy5fY3VycmVudERldmljZUNlbGxIZWlnaHQpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2goaW1tZWRpYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBzY3JvbGwgZXZlbnRzIG9uIHRoZSB2aWV3cG9ydCwgY2FsY3VsYXRpbmcgdGhlIG5ldyB2aWV3cG9ydCBhbmQgcmVxdWVzdGluZyB0aGVcbiAgICogdGVybWluYWwgdG8gc2Nyb2xsIHRvIGl0LlxuICAgKiBAcGFyYW0gZXYgVGhlIHNjcm9sbCBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVNjcm9sbChldjogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZWNvcmQgY3VycmVudCBzY3JvbGwgdG9wIHBvc2l0aW9uXG4gICAgdGhpcy5fbGFzdFNjcm9sbFRvcCA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3A7XG5cbiAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHNjcm9sbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgdmlzaWJsZSwgb3RoZXJ3aXNlIHNjcm9sbFRvcCB3aWxsIGJlIGNvcnJ1cHRcbiAgICAvLyB3aGljaCBjYXVzZXMgdGhlIHRlcm1pbmFsIHRvIHNjcm9sbCB0aGUgYnVmZmVyIHRvIHRoZSB0b3BcbiAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0RWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZ25vcmUgdGhlIGV2ZW50IGlmIGl0IHdhcyBmbGFnZ2VkIHRvIGlnbm9yZSAod2hlbiB0aGUgc291cmNlIG9mIHRoZSBldmVudCBpcyBmcm9tIFZpZXdwb3J0KVxuICAgIGlmICh0aGlzLl9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQpIHtcbiAgICAgIHRoaXMuX2lnbm9yZU5leHRTY3JvbGxFdmVudCA9IGZhbHNlO1xuICAgICAgLy8gU3RpbGwgdHJpZ2dlciB0aGUgc2Nyb2xsIHNvIGxpbmVzIGdldCByZWZyZXNoZWRcbiAgICAgIHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmZpcmUoeyBhbW91bnQ6IDAsIHN1cHByZXNzU2Nyb2xsRXZlbnQ6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Um93ID0gTWF0aC5yb3VuZCh0aGlzLl9sYXN0U2Nyb2xsVG9wIC8gdGhpcy5fY3VycmVudFJvd0hlaWdodCk7XG4gICAgY29uc3QgZGlmZiA9IG5ld1JvdyAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgIHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmZpcmUoeyBhbW91bnQ6IGRpZmYsIHN1cHByZXNzU2Nyb2xsRXZlbnQ6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zbW9vdGhTY3JvbGwoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgdmFsaWQgc3RhdGVcbiAgICBpZiAodGhpcy5faXNEaXNwb3NlZCB8fCB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4gPT09IC0xIHx8IHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gY29tcGxldGVcbiAgICBjb25zdCBwZXJjZW50ID0gdGhpcy5fc21vb3RoU2Nyb2xsUGVyY2VudCgpO1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4gKyBNYXRoLnJvdW5kKHBlcmNlbnQgKiAodGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0IC0gdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luKSk7XG5cbiAgICAvLyBDb250aW51ZSBvciBmaW5pc2ggc21vb3RoIHNjcm9sbFxuICAgIGlmIChwZXJjZW50IDwgMSkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fc21vb3RoU2Nyb2xsKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbGVhclNtb290aFNjcm9sbFN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc21vb3RoU2Nyb2xsUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zbW9vdGhTY3JvbGxEdXJhdGlvbiB8fCAhdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKChEYXRlLm5vdygpIC0gdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lKSAvIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc21vb3RoU2Nyb2xsRHVyYXRpb24sIDEpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyU21vb3RoU2Nyb2xsU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4gPSAtMTtcbiAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPSAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJ1YmJsaW5nIG9mIHNjcm9sbCBldmVudCBpbiBjYXNlIHRoZSB2aWV3cG9ydCBoYXMgcmVhY2hlZCB0b3Agb3IgYm90dG9tXG4gICAqIEBwYXJhbSBldiBUaGUgc2Nyb2xsIGV2ZW50LlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgc2Nyb2xsZWRcbiAgICovXG4gIHByaXZhdGUgX2J1YmJsZVNjcm9sbChldjogRXZlbnQsIGFtb3VudDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zRnJvbVRvcCA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgKyB0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodDtcbiAgICBpZiAoKGFtb3VudCA8IDAgJiYgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCAhPT0gMCkgfHxcbiAgICAgIChhbW91bnQgPiAwICYmIHNjcm9sbFBvc0Zyb21Ub3AgPCB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQpKSB7XG4gICAgICBpZiAoZXYuY2FuY2VsYWJsZSkge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1vdXNlIHdoZWVsIGV2ZW50cyBieSBhZGp1c3RpbmcgdGhlIHZpZXdwb3J0J3Mgc2Nyb2xsVG9wIGFuZCBkZWxlZ2F0aW5nIHRoZSBhY3R1YWxcbiAgICogc2Nyb2xsaW5nIHRvIGBvblNjcm9sbGAsIHRoaXMgZXZlbnQgbmVlZHMgdG8gYmUgYXR0YWNoZWQgbWFudWFsbHkgYnkgdGhlIGNvbnN1bWVyIG9mXG4gICAqIGBWaWV3cG9ydGAuXG4gICAqIEBwYXJhbSBldiBUaGUgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlV2hlZWwoZXY6IFdoZWVsRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbW91bnQgPSB0aGlzLl9nZXRQaXhlbHNTY3JvbGxlZChldik7XG4gICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc21vb3RoU2Nyb2xsRHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgKz0gYW1vdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHRoaXMuX3Ntb290aFNjcm9sbFBlcmNlbnQoKSA8IDEpIHtcbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgaWYgKHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9PT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wICsgYW1vdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCArPSBhbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0LCB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KSwgMCk7XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYnViYmxlU2Nyb2xsKGV2LCBhbW91bnQpO1xuICB9XG5cbiAgcHVibGljIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkaXNwID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zbW9vdGhTY3JvbGxEdXJhdGlvbikge1xuICAgICAgdGhpcy5fb25SZXF1ZXN0U2Nyb2xsTGluZXMuZmlyZSh7IGFtb3VudDogZGlzcCwgc3VwcHJlc3NTY3JvbGxFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IGRpc3AgKiB0aGlzLl9jdXJyZW50Um93SGVpZ2h0O1xuICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0aGlzLl9zbW9vdGhTY3JvbGxQZXJjZW50KCkgPCAxKSB7XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbiA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9IHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbiArIGFtb3VudDtcbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0LCB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KSwgMCk7XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFBpeGVsc1Njcm9sbGVkKGV2OiBXaGVlbEV2ZW50KTogbnVtYmVyIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0J3Mgbm90IGEgdmVydGljYWwgc2Nyb2xsIGV2ZW50XG4gICAgaWYgKGV2LmRlbHRhWSA9PT0gMCB8fCBldi5zaGlmdEtleSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUxcbiAgICBsZXQgYW1vdW50ID0gdGhpcy5fYXBwbHlTY3JvbGxNb2RpZmllcihldi5kZWx0YVksIGV2KTtcbiAgICBpZiAoZXYuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FKSB7XG4gICAgICBhbW91bnQgKj0gdGhpcy5fY3VycmVudFJvd0hlaWdodDtcbiAgICB9IGVsc2UgaWYgKGV2LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSkge1xuICAgICAgYW1vdW50ICo9IHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQgKiB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG4gICAgfVxuICAgIHJldHVybiBhbW91bnQ7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRCdWZmZXJFbGVtZW50cyhzdGFydExpbmU6IG51bWJlciwgZW5kTGluZT86IG51bWJlcik6IHsgYnVmZmVyRWxlbWVudHM6IEhUTUxFbGVtZW50W10sIGN1cnNvckVsZW1lbnQ/OiBIVE1MRWxlbWVudCB9IHtcbiAgICBsZXQgY3VycmVudExpbmU6IHN0cmluZyA9ICcnO1xuICAgIGxldCBjdXJzb3JFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBidWZmZXJFbGVtZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGVuZCA9IGVuZExpbmUgPz8gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoO1xuICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXM7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXMuZ2V0KGkpO1xuICAgICAgaWYgKCFsaW5lKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNXcmFwcGVkID0gbGluZXMuZ2V0KGkgKyAxKT8uaXNXcmFwcGVkO1xuICAgICAgY3VycmVudExpbmUgKz0gbGluZS50cmFuc2xhdGVUb1N0cmluZyghaXNXcmFwcGVkKTtcbiAgICAgIGlmICghaXNXcmFwcGVkIHx8IGkgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi50ZXh0Q29udGVudCA9IGN1cnJlbnRMaW5lO1xuICAgICAgICBidWZmZXJFbGVtZW50cy5wdXNoKGRpdik7XG4gICAgICAgIGlmIChjdXJyZW50TGluZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY3Vyc29yRWxlbWVudCA9IGRpdjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50TGluZSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBidWZmZXJFbGVtZW50cywgY3Vyc29yRWxlbWVudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBwaXhlbHMgc2Nyb2xsZWQgYnkgdGhlIG1vdXNlIGV2ZW50IHRha2luZyBpbnRvIGFjY291bnQgd2hhdCB0eXBlIG9mIGRlbHRhXG4gICAqIGlzIGJlaW5nIHVzZWQuXG4gICAqIEBwYXJhbSBldiBUaGUgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TGluZXNTY3JvbGxlZChldjogV2hlZWxFdmVudCk6IG51bWJlciB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBpdCdzIG5vdCBhIHZlcnRpY2FsIHNjcm9sbCBldmVudFxuICAgIGlmIChldi5kZWx0YVkgPT09IDAgfHwgZXYuc2hpZnRLZXkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIFdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkVcbiAgICBsZXQgYW1vdW50ID0gdGhpcy5fYXBwbHlTY3JvbGxNb2RpZmllcihldi5kZWx0YVksIGV2KTtcbiAgICBpZiAoZXYuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCkge1xuICAgICAgYW1vdW50IC89IHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQgKyAwLjA7IC8vIFByZXZlbnQgaW50ZWdlciBkaXZpc2lvblxuICAgICAgdGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsICs9IGFtb3VudDtcbiAgICAgIGFtb3VudCA9IE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsKSkgKiAodGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsID4gMCA/IDEgOiAtMSk7XG4gICAgICB0aGlzLl93aGVlbFBhcnRpYWxTY3JvbGwgJT0gMTtcbiAgICB9IGVsc2UgaWYgKGV2LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSkge1xuICAgICAgYW1vdW50ICo9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICB9XG4gICAgcmV0dXJuIGFtb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5U2Nyb2xsTW9kaWZpZXIoYW1vdW50OiBudW1iZXIsIGV2OiBXaGVlbEV2ZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBtb2RpZmllciA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZmFzdFNjcm9sbE1vZGlmaWVyO1xuICAgIC8vIE11bHRpcGx5IHRoZSBzY3JvbGwgc3BlZWQgd2hlbiB0aGUgbW9kaWZpZXIgaXMgZG93blxuICAgIGlmICgobW9kaWZpZXIgPT09ICdhbHQnICYmIGV2LmFsdEtleSkgfHxcbiAgICAgIChtb2RpZmllciA9PT0gJ2N0cmwnICYmIGV2LmN0cmxLZXkpIHx8XG4gICAgICAobW9kaWZpZXIgPT09ICdzaGlmdCcgJiYgZXYuc2hpZnRLZXkpKSB7XG4gICAgICByZXR1cm4gYW1vdW50ICogdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mYXN0U2Nyb2xsU2Vuc2l0aXZpdHkgKiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5O1xuICAgIH1cblxuICAgIHJldHVybiBhbW91bnQgKiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoc3RhcnQgZXZlbnQsIHJlY29yZGluZyB0aGUgdG91Y2ggb2NjdXJyZWQuXG4gICAqIEBwYXJhbSBldiBUaGUgdG91Y2ggZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVG91Y2hTdGFydChldjogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2xhc3RUb3VjaFkgPSBldi50b3VjaGVzWzBdLnBhZ2VZO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNobW92ZSBldmVudCwgc2Nyb2xsaW5nIHRoZSB2aWV3cG9ydCBpZiB0aGUgcG9zaXRpb24gc2hpZnRlZC5cbiAgICogQHBhcmFtIGV2IFRoZSB0b3VjaCBldmVudC5cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVUb3VjaE1vdmUoZXY6IFRvdWNoRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZWx0YVkgPSB0aGlzLl9sYXN0VG91Y2hZIC0gZXYudG91Y2hlc1swXS5wYWdlWTtcbiAgICB0aGlzLl9sYXN0VG91Y2hZID0gZXYudG91Y2hlc1swXS5wYWdlWTtcbiAgICBpZiAoZGVsdGFZID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgKz0gZGVsdGFZO1xuICAgIHJldHVybiB0aGlzLl9idWJibGVTY3JvbGwoZXYsIGRlbHRhWSk7XG4gIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJSW50ZXJuYWxEZWNvcmF0aW9uIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNsYXNzIEJ1ZmZlckRlY29yYXRpb25SZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uRWxlbWVudHM6IE1hcDxJSW50ZXJuYWxEZWNvcmF0aW9uLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYWx0QnVmZmVySXNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZGltZW5zaW9uc0NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJRGVjb3JhdGlvblNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSxcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS1kZWNvcmF0aW9uLWNvbnRhaW5lcicpO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UoKCkgPT4gdGhpcy5fZG9SZWZyZXNoRGVjb3JhdGlvbnMoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vbkRpbWVuc2lvbnNDaGFuZ2UoKCkgPT4ge1xuICAgICAgdGhpcy5fZGltZW5zaW9uc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fcXVldWVSZWZyZXNoKCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm9uRHByQ2hhbmdlKCgpID0+IHRoaXMuX3F1ZXVlUmVmcmVzaCgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZSgoKSA9PiB7XG4gICAgICB0aGlzLl9hbHRCdWZmZXJJc0FjdGl2ZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyID09PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWx0O1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLm9uRGVjb3JhdGlvblJlZ2lzdGVyZWQoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLm9uRGVjb3JhdGlvblJlbW92ZWQoZGVjb3JhdGlvbiA9PiB0aGlzLl9yZW1vdmVEZWNvcmF0aW9uKGRlY29yYXRpb24pKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgdGhpcy5fZGVjb3JhdGlvbkVsZW1lbnRzLmNsZWFyKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcXVldWVSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdGhpcy5fcmVuZGVyU2VydmljZS5hZGRSZWZyZXNoQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5fZG9SZWZyZXNoRGVjb3JhdGlvbnMoKTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZG9SZWZyZXNoRGVjb3JhdGlvbnMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkZWNvcmF0aW9uIG9mIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmRlY29yYXRpb25zKSB7XG4gICAgICB0aGlzLl9yZW5kZXJEZWNvcmF0aW9uKGRlY29yYXRpb24pO1xuICAgIH1cbiAgICB0aGlzLl9kaW1lbnNpb25zQ2hhbmdlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fcmVmcmVzaFN0eWxlKGRlY29yYXRpb24pO1xuICAgIGlmICh0aGlzLl9kaW1lbnNpb25zQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fcmVmcmVzaFhQb3NpdGlvbihkZWNvcmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVFbGVtZW50KGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS1kZWNvcmF0aW9uJyk7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd4dGVybS1kZWNvcmF0aW9uLXRvcC1sYXllcicsIGRlY29yYXRpb24/Lm9wdGlvbnM/LmxheWVyID09PSAndG9wJyk7XG4gICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGAke01hdGgucm91bmQoKGRlY29yYXRpb24ub3B0aW9ucy53aWR0aCB8fCAxKSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCl9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7KGRlY29yYXRpb24ub3B0aW9ucy5oZWlnaHQgfHwgMSkgKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLnRvcCA9IGAkeyhkZWNvcmF0aW9uLm1hcmtlci5saW5lIC0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS55ZGlzcCkgKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLmxpbmVIZWlnaHQgPSBgJHt0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcblxuICAgIGNvbnN0IHggPSBkZWNvcmF0aW9uLm9wdGlvbnMueCA/PyAwO1xuICAgIGlmICh4ICYmIHggPiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIC8vIGV4Y2VlZGVkIHRoZSBjb250YWluZXIgd2lkdGgsIHNvIGhpZGVcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gICAgdGhpcy5fcmVmcmVzaFhQb3NpdGlvbihkZWNvcmF0aW9uLCBlbGVtZW50KTtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFN0eWxlKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBsaW5lID0gZGVjb3JhdGlvbi5tYXJrZXIubGluZSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUueWRpc3A7XG4gICAgaWYgKGxpbmUgPCAwIHx8IGxpbmUgPj0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKSB7XG4gICAgICAvLyBvdXRzaWRlIG9mIHZpZXdwb3J0XG4gICAgICBpZiAoZGVjb3JhdGlvbi5lbGVtZW50KSB7XG4gICAgICAgIGRlY29yYXRpb24uZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkZWNvcmF0aW9uLm9uUmVuZGVyRW1pdHRlci5maXJlKGRlY29yYXRpb24uZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5fZGVjb3JhdGlvbkVsZW1lbnRzLmdldChkZWNvcmF0aW9uKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gdGhpcy5fY3JlYXRlRWxlbWVudChkZWNvcmF0aW9uKTtcbiAgICAgICAgZGVjb3JhdGlvbi5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fZGVjb3JhdGlvbkVsZW1lbnRzLnNldChkZWNvcmF0aW9uLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICBkZWNvcmF0aW9uLm9uRGlzcG9zZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVjb3JhdGlvbkVsZW1lbnRzLmRlbGV0ZShkZWNvcmF0aW9uKTtcbiAgICAgICAgICBlbGVtZW50IS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IGAke2xpbmUgKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuX2FsdEJ1ZmZlcklzQWN0aXZlID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgIGRlY29yYXRpb24ub25SZW5kZXJFbWl0dGVyLmZpcmUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFhQb3NpdGlvbihkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uLCBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IGRlY29yYXRpb24uZWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB4ID0gZGVjb3JhdGlvbi5vcHRpb25zLnggPz8gMDtcbiAgICBpZiAoKGRlY29yYXRpb24ub3B0aW9ucy5hbmNob3IgfHwgJ2xlZnQnKSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9IHggPyBgJHt4ICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRofXB4YCA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSB4ID8gYCR7eCAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aH1weGAgOiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVEZWNvcmF0aW9uKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZ2V0KGRlY29yYXRpb24pPy5yZW1vdmUoKTtcbiAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZGVsZXRlKGRlY29yYXRpb24pO1xuICAgIGRlY29yYXRpb24uZGlzcG9zZSgpO1xuICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSUludGVybmFsRGVjb3JhdGlvbiB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbG9yWm9uZVN0b3JlIHtcbiAgcmVhZG9ubHkgem9uZXM6IElDb2xvclpvbmVbXTtcbiAgY2xlYXIoKTogdm9pZDtcbiAgYWRkRGVjb3JhdGlvbihkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKTogdm9pZDtcbiAgLyoqXG4gICAqIFNldHMgdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIGxpbmVzIHRoYXQgd2lsbCBiZSBhZGRlZCBiZXR3ZWVuIHpvbmVzLCBpZiBuZXcgbGluZXMgaW50ZXJzZWN0XG4gICAqIHRoZSBwYWRkaW5nIHRoZXkgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgc2FtZSB6b25lLlxuICAgKi9cbiAgc2V0UGFkZGluZyhwYWRkaW5nOiB7IFtwb3NpdGlvbjogc3RyaW5nXTogbnVtYmVyIH0pOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2xvclpvbmUge1xuICAvKiogQ29sb3IgaW4gYSBmb3JtYXQgc3VwcG9ydGVkIGJ5IGNhbnZhcycgZmlsbFN0eWxlLiAqL1xuICBjb2xvcjogc3RyaW5nO1xuICBwb3NpdGlvbjogJ2Z1bGwnIHwgJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnIHwgdW5kZWZpbmVkO1xuICBzdGFydEJ1ZmZlckxpbmU6IG51bWJlcjtcbiAgZW5kQnVmZmVyTGluZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSU1pbmltYWxEZWNvcmF0aW9uRm9yQ29sb3Jab25lIHtcbiAgbWFya2VyOiBQaWNrPElJbnRlcm5hbERlY29yYXRpb25bJ21hcmtlciddLCAnbGluZSc+O1xuICBvcHRpb25zOiBQaWNrPElJbnRlcm5hbERlY29yYXRpb25bJ29wdGlvbnMnXSwgJ292ZXJ2aWV3UnVsZXJPcHRpb25zJz47XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvclpvbmVTdG9yZSBpbXBsZW1lbnRzIElDb2xvclpvbmVTdG9yZSB7XG4gIHByaXZhdGUgX3pvbmVzOiBJQ29sb3Jab25lW10gPSBbXTtcblxuICAvLyBUaGUgem9uZSBwb29sIGlzIHVzZWQgdG8ga2VlcCB6b25lIG9iamVjdHMgZnJvbSBiZWluZyBmcmVlZCBiZXR3ZWVuIGNsZWFyaW5nIHRoZSBjb2xvciB6b25lXG4gIC8vIHN0b3JlIGFuZCBmZXRjaGluZyB0aGUgem9uZXMuIFRoaXMgaGVscHMgcmVkdWNlIEdDIHByZXNzdXJlIHNpbmNlIHRoZSBjb2xvciB6b25lcyBhcmVcbiAgLy8gYWNjdW11bGF0ZWQgb24gcG90ZW50aWFsbHkgZXZlcnkgc2Nyb2xsIGV2ZW50LlxuICBwcml2YXRlIF96b25lUG9vbDogSUNvbG9yWm9uZVtdID0gW107XG4gIHByaXZhdGUgX3pvbmVQb29sSW5kZXggPSAwO1xuXG4gIHByaXZhdGUgX2xpbmVQYWRkaW5nOiB7IFtwb3NpdGlvbjogc3RyaW5nXTogbnVtYmVyIH0gPSB7XG4gICAgZnVsbDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGNlbnRlcjogMCxcbiAgICByaWdodDogMFxuICB9O1xuXG4gIHB1YmxpYyBnZXQgem9uZXMoKTogSUNvbG9yWm9uZVtdIHtcbiAgICAvLyBUcmltIHRoZSB6b25lIHBvb2wgdG8gZnJlZSB1bnVzZWQgbWVtb3J5XG4gICAgdGhpcy5fem9uZVBvb2wubGVuZ3RoID0gTWF0aC5taW4odGhpcy5fem9uZVBvb2wubGVuZ3RoLCB0aGlzLl96b25lcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLl96b25lcztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl96b25lcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3pvbmVQb29sSW5kZXggPSAwO1xuICB9XG5cbiAgcHVibGljIGFkZERlY29yYXRpb24oZGVjb3JhdGlvbjogSU1pbmltYWxEZWNvcmF0aW9uRm9yQ29sb3Jab25lKTogdm9pZCB7XG4gICAgaWYgKCFkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB6IG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoei5jb2xvciA9PT0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yICYmXG4gICAgICAgICAgei5wb3NpdGlvbiA9PT0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lSW50ZXJzZWN0c1pvbmUoeiwgZGVjb3JhdGlvbi5tYXJrZXIubGluZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2xpbmVBZGphY2VudFRvWm9uZSh6LCBkZWNvcmF0aW9uLm1hcmtlci5saW5lLCBkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24pKSB7XG4gICAgICAgICAgdGhpcy5fYWRkTGluZVRvWm9uZSh6LCBkZWNvcmF0aW9uLm1hcmtlci5saW5lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ3JlYXRlIHVzaW5nIHpvbmUgcG9vbCBpZiBwb3NzaWJsZVxuICAgIGlmICh0aGlzLl96b25lUG9vbEluZGV4IDwgdGhpcy5fem9uZVBvb2wubGVuZ3RoKSB7XG4gICAgICB0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4XS5jb2xvciA9IGRlY29yYXRpb24ub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5jb2xvcjtcbiAgICAgIHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXhdLnBvc2l0aW9uID0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uO1xuICAgICAgdGhpcy5fem9uZVBvb2xbdGhpcy5fem9uZVBvb2xJbmRleF0uc3RhcnRCdWZmZXJMaW5lID0gZGVjb3JhdGlvbi5tYXJrZXIubGluZTtcbiAgICAgIHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXhdLmVuZEJ1ZmZlckxpbmUgPSBkZWNvcmF0aW9uLm1hcmtlci5saW5lO1xuICAgICAgdGhpcy5fem9uZXMucHVzaCh0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4KytdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlXG4gICAgdGhpcy5fem9uZXMucHVzaCh7XG4gICAgICBjb2xvcjogZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yLFxuICAgICAgcG9zaXRpb246IGRlY29yYXRpb24ub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5wb3NpdGlvbixcbiAgICAgIHN0YXJ0QnVmZmVyTGluZTogZGVjb3JhdGlvbi5tYXJrZXIubGluZSxcbiAgICAgIGVuZEJ1ZmZlckxpbmU6IGRlY29yYXRpb24ubWFya2VyLmxpbmVcbiAgICB9KTtcbiAgICB0aGlzLl96b25lUG9vbC5wdXNoKHRoaXMuX3pvbmVzW3RoaXMuX3pvbmVzLmxlbmd0aCAtIDFdKTtcbiAgICB0aGlzLl96b25lUG9vbEluZGV4Kys7XG4gIH1cblxuICBwdWJsaWMgc2V0UGFkZGluZyhwYWRkaW5nOiB7IFtwb3NpdGlvbjogc3RyaW5nXTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lUGFkZGluZyA9IHBhZGRpbmc7XG4gIH1cblxuICBwcml2YXRlIF9saW5lSW50ZXJzZWN0c1pvbmUoem9uZTogSUNvbG9yWm9uZSwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxpbmUgPj0gem9uZS5zdGFydEJ1ZmZlckxpbmUgJiZcbiAgICAgIGxpbmUgPD0gem9uZS5lbmRCdWZmZXJMaW5lXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpbmVBZGphY2VudFRvWm9uZSh6b25lOiBJQ29sb3Jab25lLCBsaW5lOiBudW1iZXIsIHBvc2l0aW9uOiBJQ29sb3Jab25lWydwb3NpdGlvbiddKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIChsaW5lID49IHpvbmUuc3RhcnRCdWZmZXJMaW5lIC0gdGhpcy5fbGluZVBhZGRpbmdbcG9zaXRpb24gfHwgJ2Z1bGwnXSkgJiZcbiAgICAgIChsaW5lIDw9IHpvbmUuZW5kQnVmZmVyTGluZSArIHRoaXMuX2xpbmVQYWRkaW5nW3Bvc2l0aW9uIHx8ICdmdWxsJ10pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZExpbmVUb1pvbmUoem9uZTogSUNvbG9yWm9uZSwgbGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgem9uZS5zdGFydEJ1ZmZlckxpbmUgPSBNYXRoLm1pbih6b25lLnN0YXJ0QnVmZmVyTGluZSwgbGluZSk7XG4gICAgem9uZS5lbmRCdWZmZXJMaW5lID0gTWF0aC5tYXgoem9uZS5lbmRCdWZmZXJMaW5lLCBsaW5lKTtcbiAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENvbG9yWm9uZVN0b3JlLCBJQ29sb3Jab25lLCBJQ29sb3Jab25lU3RvcmUgfSBmcm9tICdicm93c2VyL2RlY29yYXRpb25zL0NvbG9yWm9uZVN0b3JlJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8vIEhlbHBlciBvYmplY3RzIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBjYWxjdWxhdGlvbiBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uIGR1cmluZyByZW5kZXJpbmcuIFRoZXNlIGFyZVxuLy8gc3RhdGljIHZhbHVlcyBmb3IgZWFjaCByZW5kZXIgYW5kIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgZGVjb3JhdGlvbiBwb3NpdGlvbiBhcyB0aGUga2V5LlxuY29uc3QgZHJhd0hlaWdodCA9IHtcbiAgZnVsbDogMCxcbiAgbGVmdDogMCxcbiAgY2VudGVyOiAwLFxuICByaWdodDogMFxufTtcbmNvbnN0IGRyYXdXaWR0aCA9IHtcbiAgZnVsbDogMCxcbiAgbGVmdDogMCxcbiAgY2VudGVyOiAwLFxuICByaWdodDogMFxufTtcbmNvbnN0IGRyYXdYID0ge1xuICBmdWxsOiAwLFxuICBsZWZ0OiAwLFxuICBjZW50ZXI6IDAsXG4gIHJpZ2h0OiAwXG59O1xuXG5leHBvcnQgY2xhc3MgT3ZlcnZpZXdSdWxlclJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xvclpvbmVTdG9yZTogSUNvbG9yWm9uZVN0b3JlID0gbmV3IENvbG9yWm9uZVN0b3JlKCk7XG4gIHByaXZhdGUgZ2V0IF93aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLm92ZXJ2aWV3UnVsZXJXaWR0aCB8fCAwO1xuICB9XG4gIHByaXZhdGUgX2FuaW1hdGlvbkZyYW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfc2hvdWxkVXBkYXRlRGltZW5zaW9uczogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3VsZFVwZGF0ZUFuY2hvcjogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIHByaXZhdGUgX2xhc3RLbm93bkJ1ZmZlckxlbmd0aDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIF9jb250YWluZXJIZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASURlY29yYXRpb25TZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jYW52YXMgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHRoaXMuX2NhbnZhcy5jbGFzc0xpc3QuYWRkKCd4dGVybS1kZWNvcmF0aW9uLW92ZXJ2aWV3LXJ1bGVyJyk7XG4gICAgdGhpcy5fcmVmcmVzaENhbnZhc0RpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKHRoaXMuX2NhbnZhcywgdGhpcy5fdmlld3BvcnRFbGVtZW50KTtcbiAgICBjb25zdCBjdHggPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdHggY2Fubm90IGJlIG51bGwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3R4ID0gY3R4O1xuICAgIH1cbiAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRpb25MaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9yZWdpc3RlckJ1ZmZlckNoYW5nZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRGltZW5zaW9uQ2hhbmdlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2FudmFzPy5yZW1vdmUoKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogT24gZGVjb3JhdGlvbiBhZGQgb3IgcmVtb3ZlLCByZWRyYXdcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyRGVjb3JhdGlvbkxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLm9uRGVjb3JhdGlvblJlZ2lzdGVyZWQoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKHVuZGVmaW5lZCwgdHJ1ZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLm9uRGVjb3JhdGlvblJlbW92ZWQoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKHVuZGVmaW5lZCwgdHJ1ZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBidWZmZXIgY2hhbmdlLCByZWRyYXdcbiAgICogYW5kIGhpZGUgdGhlIGNhbnZhcyBpZiB0aGUgYWx0IGJ1ZmZlciBpcyBhY3RpdmVcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyQnVmZmVyQ2hhbmdlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbnZhcyEuc3R5bGUuZGlzcGxheSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyID09PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWx0ID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uU2Nyb2xsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9sYXN0S25vd25CdWZmZXJMZW5ndGggIT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5ub3JtYWwubGluZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hEcmF3SGVpZ2h0Q29uc3RhbnRzKCk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hDb2xvclpvbmVQYWRkaW5nKCk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBPbiBkaW1lbnNpb24gY2hhbmdlLCB1cGRhdGUgY2FudmFzIGRpbWVuc2lvbnNcbiAgICogYW5kIHRoZW4gcmVkcmF3XG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlckRpbWVuc2lvbkNoYW5nZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBjb250YWluZXIgaGVpZ2h0IGNoYW5nZWRcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25SZW5kZXIoKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb250YWluZXJIZWlnaHQgfHwgdGhpcy5fY29udGFpbmVySGVpZ2h0ICE9PSB0aGlzLl9zY3JlZW5FbGVtZW50LmNsaWVudEhlaWdodCkge1xuICAgICAgICB0aGlzLl9xdWV1ZVJlZnJlc2godHJ1ZSk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckhlaWdodCA9IHRoaXMuX3NjcmVlbkVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgfVxuICAgIH0pKTtcbiAgICAvLyBvdmVydmlldyBydWxlciB3aWR0aCBjaGFuZ2VkXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdvdmVydmlld1J1bGVyV2lkdGgnLCAoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2godHJ1ZSkpKTtcbiAgICAvLyBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlZFxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm9uRHByQ2hhbmdlKCgpID0+IHRoaXMuX3F1ZXVlUmVmcmVzaCh0cnVlKSkpO1xuICAgIC8vIHNldCB0aGUgY2FudmFzIGRpbWVuc2lvbnNcbiAgICB0aGlzLl9xdWV1ZVJlZnJlc2godHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoRHJhd0NvbnN0YW50cygpOiB2b2lkIHtcbiAgICAvLyB3aWR0aFxuICAgIGNvbnN0IG91dGVyV2lkdGggPSBNYXRoLmZsb29yKHRoaXMuX2NhbnZhcy53aWR0aCAvIDMpO1xuICAgIGNvbnN0IGlubmVyV2lkdGggPSBNYXRoLmNlaWwodGhpcy5fY2FudmFzLndpZHRoIC8gMyk7XG4gICAgZHJhd1dpZHRoLmZ1bGwgPSB0aGlzLl9jYW52YXMud2lkdGg7XG4gICAgZHJhd1dpZHRoLmxlZnQgPSBvdXRlcldpZHRoO1xuICAgIGRyYXdXaWR0aC5jZW50ZXIgPSBpbm5lcldpZHRoO1xuICAgIGRyYXdXaWR0aC5yaWdodCA9IG91dGVyV2lkdGg7XG4gICAgLy8gaGVpZ2h0XG4gICAgdGhpcy5fcmVmcmVzaERyYXdIZWlnaHRDb25zdGFudHMoKTtcbiAgICAvLyB4XG4gICAgZHJhd1guZnVsbCA9IDA7XG4gICAgZHJhd1gubGVmdCA9IDA7XG4gICAgZHJhd1guY2VudGVyID0gZHJhd1dpZHRoLmxlZnQ7XG4gICAgZHJhd1gucmlnaHQgPSBkcmF3V2lkdGgubGVmdCArIGRyYXdXaWR0aC5jZW50ZXI7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoRHJhd0hlaWdodENvbnN0YW50cygpOiB2b2lkIHtcbiAgICBkcmF3SGVpZ2h0LmZ1bGwgPSBNYXRoLnJvdW5kKDIgKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHBpeGVscyBwZXIgbGluZVxuICAgIGNvbnN0IHBpeGVsc1BlckxpbmUgPSB0aGlzLl9jYW52YXMuaGVpZ2h0IC8gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoO1xuICAgIC8vIENsYW1wIGFjdHVhbCBwaXhlbHMgd2l0aGluIGEgcmFuZ2VcbiAgICBjb25zdCBub25GdWxsSGVpZ2h0ID0gTWF0aC5yb3VuZChNYXRoLm1heChNYXRoLm1pbihwaXhlbHNQZXJMaW5lLCAxMiksIDYpICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gICAgZHJhd0hlaWdodC5sZWZ0ID0gbm9uRnVsbEhlaWdodDtcbiAgICBkcmF3SGVpZ2h0LmNlbnRlciA9IG5vbkZ1bGxIZWlnaHQ7XG4gICAgZHJhd0hlaWdodC5yaWdodCA9IG5vbkZ1bGxIZWlnaHQ7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoQ29sb3Jab25lUGFkZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvclpvbmVTdG9yZS5zZXRQYWRkaW5nKHtcbiAgICAgIGZ1bGw6IE1hdGguZmxvb3IodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGggLyAodGhpcy5fY2FudmFzLmhlaWdodCAtIDEpICogZHJhd0hlaWdodC5mdWxsKSxcbiAgICAgIGxlZnQ6IE1hdGguZmxvb3IodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGggLyAodGhpcy5fY2FudmFzLmhlaWdodCAtIDEpICogZHJhd0hlaWdodC5sZWZ0KSxcbiAgICAgIGNlbnRlcjogTWF0aC5mbG9vcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCAvICh0aGlzLl9jYW52YXMuaGVpZ2h0IC0gMSkgKiBkcmF3SGVpZ2h0LmNlbnRlciksXG4gICAgICByaWdodDogTWF0aC5mbG9vcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCAvICh0aGlzLl9jYW52YXMuaGVpZ2h0IC0gMSkgKiBkcmF3SGVpZ2h0LnJpZ2h0KVxuICAgIH0pO1xuICAgIHRoaXMuX2xhc3RLbm93bkJ1ZmZlckxlbmd0aCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5ub3JtYWwubGluZXMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaENhbnZhc0RpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLndpZHRoID0gYCR7dGhpcy5fd2lkdGh9cHhgO1xuICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IE1hdGgucm91bmQodGhpcy5fd2lkdGggKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5fc2NyZWVuRWxlbWVudC5jbGllbnRIZWlnaHR9cHhgO1xuICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuX3NjcmVlbkVsZW1lbnQuY2xpZW50SGVpZ2h0ICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gICAgdGhpcy5fcmVmcmVzaERyYXdDb25zdGFudHMoKTtcbiAgICB0aGlzLl9yZWZyZXNoQ29sb3Jab25lUGFkZGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaERlY29yYXRpb25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zaG91bGRVcGRhdGVEaW1lbnNpb25zKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoQ2FudmFzRGltZW5zaW9ucygpO1xuICAgIH1cbiAgICB0aGlzLl9jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX2NhbnZhcy53aWR0aCwgdGhpcy5fY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5fY29sb3Jab25lU3RvcmUuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZGVjb3JhdGlvbnMpIHtcbiAgICAgIHRoaXMuX2NvbG9yWm9uZVN0b3JlLmFkZERlY29yYXRpb24oZGVjb3JhdGlvbik7XG4gICAgfVxuICAgIHRoaXMuX2N0eC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnN0IHpvbmVzID0gdGhpcy5fY29sb3Jab25lU3RvcmUuem9uZXM7XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHpvbmVzKSB7XG4gICAgICBpZiAoem9uZS5wb3NpdGlvbiAhPT0gJ2Z1bGwnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlckNvbG9yWm9uZSh6b25lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHpvbmVzKSB7XG4gICAgICBpZiAoem9uZS5wb3NpdGlvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlckNvbG9yWm9uZSh6b25lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2hvdWxkVXBkYXRlRGltZW5zaW9ucyA9IGZhbHNlO1xuICAgIHRoaXMuX3Nob3VsZFVwZGF0ZUFuY2hvciA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29sb3Jab25lKHpvbmU6IElDb2xvclpvbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gem9uZS5jb2xvcjtcbiAgICB0aGlzLl9jdHguZmlsbFJlY3QoXG4gICAgICAvKiB4ICovIGRyYXdYW3pvbmUucG9zaXRpb24gfHwgJ2Z1bGwnXSxcbiAgICAgIC8qIHkgKi8gTWF0aC5yb3VuZChcbiAgICAgICAgKHRoaXMuX2NhbnZhcy5oZWlnaHQgLSAxKSAqIC8vIC0xIHRvIGVuc3VyZSBhdCBsZWFzdCAycHggYXJlIGFsbG93ZWQgZm9yIGRlY29yYXRpb24gb24gbGFzdCBsaW5lXG4gICAgICAgICh6b25lLnN0YXJ0QnVmZmVyTGluZSAvIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoKSAtIGRyYXdIZWlnaHRbem9uZS5wb3NpdGlvbiB8fCAnZnVsbCddIC8gMlxuICAgICAgKSxcbiAgICAgIC8qIHcgKi8gZHJhd1dpZHRoW3pvbmUucG9zaXRpb24gfHwgJ2Z1bGwnXSxcbiAgICAgIC8qIGggKi8gTWF0aC5yb3VuZChcbiAgICAgICAgKHRoaXMuX2NhbnZhcy5oZWlnaHQgLSAxKSAqIC8vIC0xIHRvIGVuc3VyZSBhdCBsZWFzdCAycHggYXJlIGFsbG93ZWQgZm9yIGRlY29yYXRpb24gb24gbGFzdCBsaW5lXG4gICAgICAgICgoem9uZS5lbmRCdWZmZXJMaW5lIC0gem9uZS5zdGFydEJ1ZmZlckxpbmUpIC8gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGgpICsgZHJhd0hlaWdodFt6b25lLnBvc2l0aW9uIHx8ICdmdWxsJ11cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfcXVldWVSZWZyZXNoKHVwZGF0ZUNhbnZhc0RpbWVuc2lvbnM/OiBib29sZWFuLCB1cGRhdGVBbmNob3I/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvdWxkVXBkYXRlRGltZW5zaW9ucyA9IHVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMgfHwgdGhpcy5fc2hvdWxkVXBkYXRlRGltZW5zaW9ucztcbiAgICB0aGlzLl9zaG91bGRVcGRhdGVBbmNob3IgPSB1cGRhdGVBbmNob3IgfHwgdGhpcy5fc2hvdWxkVXBkYXRlQW5jaG9yO1xuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVmcmVzaERlY29yYXRpb25zKCk7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJUmVuZGVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElDb3JlU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEMwIH0gZnJvbSAnY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzJztcblxuaW50ZXJmYWNlIElQb3NpdGlvbiB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgZm9yIGhhbmRsaW5nIGNvbXBvc2l0aW9uc3RhcnQsIGNvbXBvc2l0aW9udXBkYXRlIGFuZCBjb21wb3NpdGlvbmVuZFxuICogZXZlbnRzLCBkaXNwbGF5aW5nIHRoZSBpbi1wcm9ncmVzcyBjb21wb3NpdGlvbiB0byB0aGUgVUkgYW5kIGZvcndhcmRpbmcgdGhlIGZpbmFsIGNvbXBvc2l0aW9uXG4gKiB0byB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uSGVscGVyIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgaW5wdXQgY29tcG9zaXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZywgZWcuIHZpYSBhIG1vYmlsZSBrZXlib2FyZCwgc3BlZWNoIGlucHV0IG9yXG4gICAqIElNRS4gVGhpcyB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvc2l0aW9uVGV4dCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSBVSS5cbiAgICovXG4gIHByaXZhdGUgX2lzQ29tcG9zaW5nOiBib29sZWFuO1xuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNDb21wb3Npbmc7IH1cblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgdGV4dGFyZWEncyB2YWx1ZSBvZiB0aGUgY3VycmVudCBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2NvbXBvc2l0aW9uUG9zaXRpb246IElQb3NpdGlvbjtcblxuICAvKipcbiAgICogV2hldGhlciBhIGNvbXBvc2l0aW9uIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHNlbnQsIHNldHRpbmcgdGhpcyB0byBmYWxzZSB3aWxsIGNhbmNlbCBhbnlcbiAgICogaW4tcHJvZ3Jlc3MgY29tcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9pc1NlbmRpbmdDb21wb3NpdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGF0YSBhbHJlYWR5IHNlbnQgZHVlIHRvIGtleWRvd24gZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9kYXRhQWxyZWFkeVNlbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb21wb3NpdGlvblZpZXc6IEhUTUxFbGVtZW50LFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElDb3JlU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLl9pc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgIHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbiA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgIHRoaXMuX2RhdGFBbHJlYWR5U2VudCA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbXBvc2l0aW9uc3RhcnQgZXZlbnQsIGFjdGl2YXRpbmcgdGhlIGNvbXBvc2l0aW9uIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgY29tcG9zaXRpb25zdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0NvbXBvc2luZyA9IHRydWU7XG4gICAgdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5zdGFydCA9IHRoaXMuX3RleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcudGV4dENvbnRlbnQgPSAnJztcbiAgICB0aGlzLl9kYXRhQWxyZWFkeVNlbnQgPSAnJztcbiAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY29tcG9zaXRpb251cGRhdGUgZXZlbnQsIHVwZGF0aW5nIHRoZSBjb21wb3NpdGlvbiB2aWV3LlxuICAgKiBAcGFyYW0gZXYgVGhlIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGNvbXBvc2l0aW9udXBkYXRlKGV2OiBQaWNrPENvbXBvc2l0aW9uRXZlbnQsICdkYXRhJz4pOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcudGV4dENvbnRlbnQgPSBldi5kYXRhO1xuICAgIHRoaXMudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5lbmQgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnQsIGhpZGluZyB0aGUgY29tcG9zaXRpb24gdmlldyBhbmQgc2VuZGluZyB0aGUgY29tcG9zaXRpb24gdG9cbiAgICogdGhlIGhhbmRsZXIuXG4gICAqL1xuICBwdWJsaWMgY29tcG9zaXRpb25lbmQoKTogdm9pZCB7XG4gICAgdGhpcy5fZmluYWxpemVDb21wb3NpdGlvbih0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBrZXlkb3duIGV2ZW50LCByb3V0aW5nIGFueSBuZWNlc3NhcnkgZXZlbnRzIHRvIHRoZSBDb21wb3NpdGlvbkhlbHBlciBmdW5jdGlvbnMuXG4gICAqIEBwYXJhbSBldiBUaGUga2V5ZG93biBldmVudC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgVGVybWluYWwgc2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGtleWRvd24gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMga2V5ZG93bihldjogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9pc0NvbXBvc2luZyB8fCB0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbikge1xuICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICAvLyBDb250aW51ZSBjb21wb3NpbmcgaWYgdGhlIGtleUNvZGUgaXMgdGhlIFwiY29tcG9zaXRpb24gY2hhcmFjdGVyXCJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDE2IHx8IGV2LmtleUNvZGUgPT09IDE3IHx8IGV2LmtleUNvZGUgPT09IDE4KSB7XG4gICAgICAgIC8vIENvbnRpbnVlIGNvbXBvc2luZyBpZiB0aGUga2V5Q29kZSBpcyBhIG1vZGlmaWVyIGtleVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBGaW5pc2ggY29tcG9zaXRpb24gaW1tZWRpYXRlbHkuIFRoaXMgaXMgbWFpbmx5IGhlcmUgZm9yIHRoZSBjYXNlIHdoZXJlIGVudGVyIGlzXG4gICAgICAvLyBwcmVzc2VkIGFuZCB0aGUgaGFuZGxlciBuZWVkcyB0byBiZSB0cmlnZ2VyZWQgYmVmb3JlIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkLlxuICAgICAgdGhpcy5fZmluYWxpemVDb21wb3NpdGlvbihmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKGV2LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgLy8gSWYgdGhlIFwiY29tcG9zaXRpb24gY2hhcmFjdGVyXCIgaXMgdXNlZCBidXQgZ2V0cyB0byB0aGlzIHBvaW50IGl0IG1lYW5zIGEgbm9uLWNvbXBvc2l0aW9uXG4gICAgICAvLyBjaGFyYWN0ZXIgKGVnLiBudW1iZXJzIGFuZCBwdW5jdHVhdGlvbikgd2FzIHByZXNzZWQgd2hlbiB0aGUgSU1FIHdhcyBhY3RpdmUuXG4gICAgICB0aGlzLl9oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZXMgdGhlIGNvbXBvc2l0aW9uLCByZXN1bWluZyByZWd1bGFyIGlucHV0IGFjdGlvbnMuIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjb21wb3NpdGlvblxuICAgKiBpcyBlbmRpbmcuXG4gICAqIEBwYXJhbSB3YWl0Rm9yUHJvcGFnYXRpb24gV2hldGhlciB0byB3YWl0IGZvciBldmVudHMgdG8gcHJvcGFnYXRlIGJlZm9yZSBzZW5kaW5nXG4gICAqICAgdGhlIGlucHV0LiBUaGlzIHNob3VsZCBiZSBmYWxzZSBpZiBhIG5vbi1jb21wb3NpdGlvbiBrZXlzdHJva2UgaXMgZW50ZXJlZCBiZWZvcmUgdGhlXG4gICAqICAgY29tcG9zaXRpb25lbmQgZXZlbnQgaXMgdHJpZ2dlcmVkLCBzdWNoIGFzIGVudGVyLCBzbyB0aGF0IHRoZSBjb21wb3NpdGlvbiBpcyBzZW50IGJlZm9yZVxuICAgKiAgIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmluYWxpemVDb21wb3NpdGlvbih3YWl0Rm9yUHJvcGFnYXRpb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgdGhpcy5faXNDb21wb3NpbmcgPSBmYWxzZTtcblxuICAgIGlmICghd2FpdEZvclByb3BhZ2F0aW9uKSB7XG4gICAgICAvLyBDYW5jZWwgYW55IGRlbGF5ZWQgY29tcG9zaXRpb24gc2VuZCByZXF1ZXN0cyBhbmQgc2VuZCB0aGUgaW5wdXQgaW1tZWRpYXRlbHkuXG4gICAgICB0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcodGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5zdGFydCwgdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5lbmQpO1xuICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChpbnB1dCwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1ha2UgYSBkZWVwIGNvcHkgb2YgdGhlIGNvbXBvc2l0aW9uIHBvc2l0aW9uIGhlcmUgYXMgYSBuZXcgY29tcG9zaXRpb25zdGFydCBldmVudCBtYXlcbiAgICAgIC8vIGZpcmUgYmVmb3JlIHRoZSBzZXRUaW1lb3V0IGV4ZWN1dGVzLlxuICAgICAgY29uc3QgY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24gPSB7XG4gICAgICAgIHN0YXJ0OiB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LFxuICAgICAgICBlbmQ6IHRoaXMuX2NvbXBvc2l0aW9uUG9zaXRpb24uZW5kXG4gICAgICB9O1xuXG4gICAgICAvLyBTaW5jZSBjb21wb3NpdGlvbiogZXZlbnRzIGhhcHBlbiBiZWZvcmUgdGhlIGNoYW5nZXMgdGFrZSBwbGFjZSBpbiB0aGUgdGV4dGFyZWEgb24gbW9zdFxuICAgICAgLy8gYnJvd3NlcnMsIHVzZSBhIHNldFRpbWVvdXQgd2l0aCAwbXMgdGltZSB0byBhbGxvdyB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IHRvXG4gICAgICAvLyBjb21wbGV0ZS4gVGhpcyBlbnN1cmVzIHRoZSBjb3JyZWN0IGNoYXJhY3RlciBpcyByZXRyaWV2ZWQuXG4gICAgICAvLyBUaGlzIHNvbHV0aW9uIHdhcyB1c2VkIGJlY2F1c2U6XG4gICAgICAvLyAtIFRoZSBjb21wb3NpdGlvbmVuZCBldmVudCdzIGRhdGEgcHJvcGVydHkgaXMgdW5yZWxpYWJsZSwgYXQgbGVhc3Qgb24gQ2hyb21pdW1cbiAgICAgIC8vIC0gVGhlIGxhc3QgY29tcG9zaXRpb251cGRhdGUgZXZlbnQncyBkYXRhIHByb3BlcnR5IGRvZXMgbm90IGFsd2F5cyBhY2N1cmF0ZWx5IGRlc2NyaWJlXG4gICAgICAvLyAgIHRoZSBjaGFyYWN0ZXIsIGEgY291bnRlciBleGFtcGxlIGJlaW5nIEtvcmVhbiB3aGVyZSBhbiBlbmRpbmcgY29uc29uc2FudCBjYW4gbW92ZSB0b1xuICAgICAgLy8gICB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciBpZiB0aGUgZm9sbG93aW5nIGlucHV0IGlzIGEgdm93ZWwuXG4gICAgICB0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbiA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGlucHV0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHNlbnRcbiAgICAgICAgaWYgKHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICAgICAgICBsZXQgaW5wdXQ7XG4gICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBkYXRhIGFscmVhZHkgc2VudCBkdWUgdG8ga2V5ZG93biBldmVudCxcbiAgICAgICAgICAvLyBvdGhlcndpc2UgaW5wdXQgY2hhcmFjdGVycyBjYW4gYmUgZHVwbGljYXRlZC4gKElzc3VlICMzMTkxKVxuICAgICAgICAgIGN1cnJlbnRDb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0ICs9IHRoaXMuX2RhdGFBbHJlYWR5U2VudC5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIGVuZCBwb3NpdGlvbiB0byBnZXQgdGhlIHN0cmluZyBpZiBhIG5ldyBjb21wb3NpdGlvbiBoYXMgc3RhcnRlZC5cbiAgICAgICAgICAgIGlucHV0ID0gdGhpcy5fdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRDb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LCBjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbi5lbmQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEb24ndCB1c2UgdGhlIGVuZCBwb3NpdGlvbiBoZXJlIGluIG9yZGVyIHRvIHBpY2sgdXAgYW55IGNoYXJhY3RlcnMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAvLyBjb21wb3NpdGlvbiBoYXMgZmluaXNoZWQsIGZvciBleGFtcGxlIHdoZW4gdHlwaW5nIGEgbm9uLWNvbXBvc2l0aW9uIGNoYXJhY3RlclxuICAgICAgICAgICAgLy8gKGVnLiAyKSBhZnRlciBhIGNvbXBvc2l0aW9uIGNoYXJhY3Rlci5cbiAgICAgICAgICAgIGlucHV0ID0gdGhpcy5fdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRDb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoaW5wdXQsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIHRleHRhcmVhIGFmdGVyIHRoZSBjdXJyZW50IGV2ZW50IGNoYWluIGlzIGFsbG93ZWQgdG8gY29tcGxldGUuXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIG5vdCBjdXJyZW50bHkgY29tcG9zaW5nIGJ1dCBhIGtleWRvd24gZXZlbnQgd2l0aCB0aGUgXCJjb21wb3NpdGlvblxuICAgKiBjaGFyYWN0ZXJcIiAoMjI5KSBpcyB0cmlnZ2VyZWQsIGluIG9yZGVyIHRvIGFsbG93IG5vbi1jb21wb3NpdGlvbiB0ZXh0IHRvIGJlIGVudGVyZWQgd2hlbiBhblxuICAgKiBJTUUgaXMgYWN0aXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQW55VGV4dGFyZWFDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fdGV4dGFyZWEudmFsdWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgaWYgYSBjb21wb3NpdGlvbiBoYXMgc3RhcnRlZCBzaW5jZSB0aGUgdGltZW91dFxuICAgICAgaWYgKCF0aGlzLl9pc0NvbXBvc2luZykge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuX3RleHRhcmVhLnZhbHVlO1xuXG4gICAgICAgIGNvbnN0IGRpZmYgPSBuZXdWYWx1ZS5yZXBsYWNlKG9sZFZhbHVlLCAnJyk7XG5cbiAgICAgICAgdGhpcy5fZGF0YUFscmVhZHlTZW50ID0gZGlmZjtcblxuICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID4gb2xkVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChkaWZmLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZS5sZW5ndGggPCBvbGRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkRFTH1gLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICgobmV3VmFsdWUubGVuZ3RoID09PSBvbGRWYWx1ZS5sZW5ndGgpICYmIChuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChuZXdWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0aGUgY29tcG9zaXRpb24gdmlldyBvbiB0b3Agb2YgdGhlIGN1cnNvciBhbmQgdGhlIHRleHRhcmVhIGp1c3QgYmVsb3cgaXQgKHNvIHRoZVxuICAgKiBJTUUgaGVscGVyIGRpYWxvZyBpcyBwb3NpdGlvbmVkIGNvcnJlY3RseSkuXG4gICAqIEBwYXJhbSBkb250UmVjdXJzZSBXaGV0aGVyIHRvIHVzZSBzZXRUaW1lb3V0IHRvIHJlY3Vyc2l2ZWx5IHRyaWdnZXIgYW5vdGhlciB1cGRhdGUsIHRoaXMgaXNcbiAgICogICBuZWNlc3NhcnkgYXMgdGhlIElNRSBldmVudHMgYWNyb3NzIGJyb3dzZXJzIGFyZSBub3QgY29uc2lzdGVudGx5IHRyaWdnZXJlZC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzKGRvbnRSZWN1cnNlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNDb21wb3NpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuaXNDdXJzb3JJblZpZXdwb3J0KSB7XG4gICAgICBjb25zdCBjdXJzb3JYID0gTWF0aC5taW4odGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSk7XG5cbiAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0O1xuICAgICAgY29uc3QgY3Vyc29yVG9wID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQ7XG4gICAgICBjb25zdCBjdXJzb3JMZWZ0ID0gY3Vyc29yWCAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aDtcblxuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmxlZnQgPSBjdXJzb3JMZWZ0ICsgJ3B4JztcbiAgICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5zdHlsZS50b3AgPSBjdXJzb3JUb3AgKyAncHgnO1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmhlaWdodCA9IGNlbGxIZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmxpbmVIZWlnaHQgPSBjZWxsSGVpZ2h0ICsgJ3B4JztcbiAgICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5zdHlsZS5mb250RmFtaWx5ID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5O1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmZvbnRTaXplID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSArICdweCc7XG4gICAgICAvLyBTeW5jIHRoZSB0ZXh0YXJlYSB0byB0aGUgZXhhY3QgcG9zaXRpb24gb2YgdGhlIGNvbXBvc2l0aW9uIHZpZXcgc28gdGhlIElNRSBrbm93cyB3aGVyZSB0aGVcbiAgICAgIC8vIHRleHQgaXMuXG4gICAgICBjb25zdCBjb21wb3NpdGlvblZpZXdCb3VuZHMgPSB0aGlzLl9jb21wb3NpdGlvblZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLl90ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gY3Vyc29yTGVmdCArICdweCc7XG4gICAgICB0aGlzLl90ZXh0YXJlYS5zdHlsZS50b3AgPSBjdXJzb3JUb3AgKyAncHgnO1xuICAgICAgLy8gRW5zdXJlIHRoZSB0ZXh0IGFyZWEgaXMgYXQgbGVhc3QgMXgxLCBvdGhlcndpc2UgY2VydGFpbiBJTUVzIG1heSBicmVha1xuICAgICAgdGhpcy5fdGV4dGFyZWEuc3R5bGUud2lkdGggPSBNYXRoLm1heChjb21wb3NpdGlvblZpZXdCb3VuZHMud2lkdGgsIDEpICsgJ3B4JztcbiAgICAgIHRoaXMuX3RleHRhcmVhLnN0eWxlLmhlaWdodCA9IE1hdGgubWF4KGNvbXBvc2l0aW9uVmlld0JvdW5kcy5oZWlnaHQsIDEpICsgJ3B4JztcbiAgICAgIHRoaXMuX3RleHRhcmVhLnN0eWxlLmxpbmVIZWlnaHQgPSBjb21wb3NpdGlvblZpZXdCb3VuZHMuaGVpZ2h0ICsgJ3B4JztcbiAgICB9XG5cbiAgICBpZiAoIWRvbnRSZWN1cnNlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cyh0cnVlKSwgMCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCh3aW5kb3c6IFBpY2s8V2luZG93LCAnZ2V0Q29tcHV0ZWRTdHlsZSc+LCBldmVudDoge2NsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyfSwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGVsZW1lbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICBjb25zdCBsZWZ0UGFkZGluZyA9IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWxlZnQnKSk7XG4gIGNvbnN0IHRvcFBhZGRpbmcgPSBwYXJzZUludChlbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gIHJldHVybiBbXG4gICAgZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGxlZnRQYWRkaW5nLFxuICAgIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIHRvcFBhZGRpbmdcbiAgXTtcbn1cblxuLyoqXG4gKiBHZXRzIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgdGVybWluYWwgZm9yIGEgcGFydGljdWxhciBtb3VzZSBldmVudC4gVGhlIHJlc3VsdFxuICogaXMgcmV0dXJuZWQgYXMgYW4gYXJyYXkgaW4gdGhlIGZvcm0gW3gsIHldIGluc3RlYWQgb2YgYW4gb2JqZWN0IGFzIGl0J3MgYVxuICogbGl0dGxlIGZhc3RlciBhbmQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIHNvbWUgbG93IGxldmVsIGNvZGUuXG4gKiBAcGFyYW0gd2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHRoZSBlbGVtZW50IGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIHRlcm1pbmFsJ3MgY29udGFpbmVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gY29sQ291bnQgVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbC5cbiAqIEBwYXJhbSByb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgbiB0aGUgdGVybWluYWwuXG4gKiBAcGFyYW0gaGFzVmFsaWRDaGFyU2l6ZSBXaGV0aGVyIHRoZXJlIGlzIGEgdmFsaWQgY2hhcmFjdGVyIHNpemUgYXZhaWxhYmxlLlxuICogQHBhcmFtIGNzc0NlbGxXaWR0aCBUaGUgY2VsbCB3aWR0aCBkZXZpY2UgcGl4ZWwgcmVuZGVyIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0gY3NzQ2VsbEhlaWdodCBUaGUgY2VsbCBoZWlnaHQgZGV2aWNlIHBpeGVsIHJlbmRlciBkaW1lbnNpb25zLlxuICogQHBhcmFtIGlzU2VsZWN0aW9uIFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgZm9yIHRoZSBzZWxlY3Rpb24gb3Igbm90LiBUaGlzIHdpbGxcbiAqIGFwcGx5IGFuIG9mZnNldCB0byB0aGUgeCB2YWx1ZSBzdWNoIHRoYXQgdGhlIGxlZnQgaGFsZiBvZiB0aGUgY2VsbCB3aWxsXG4gKiBzZWxlY3QgdGhhdCBjZWxsIGFuZCB0aGUgcmlnaHQgaGFsZiB3aWxsIHNlbGVjdCB0aGUgbmV4dCBjZWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRzKHdpbmRvdzogUGljazxXaW5kb3csICdnZXRDb21wdXRlZFN0eWxlJz4sIGV2ZW50OiBQaWNrPE1vdXNlRXZlbnQsICdjbGllbnRYJyB8ICdjbGllbnRZJz4sIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2xDb3VudDogbnVtYmVyLCByb3dDb3VudDogbnVtYmVyLCBoYXNWYWxpZENoYXJTaXplOiBib29sZWFuLCBjc3NDZWxsV2lkdGg6IG51bWJlciwgY3NzQ2VsbEhlaWdodDogbnVtYmVyLCBpc1NlbGVjdGlvbj86IGJvb2xlYW4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ29vcmRpbmF0ZXMgY2Fubm90IGJlIG1lYXN1cmVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZFxuICBpZiAoIWhhc1ZhbGlkQ2hhclNpemUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29vcmRzID0gZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQod2luZG93LCBldmVudCwgZWxlbWVudCk7XG4gIGlmICghY29vcmRzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvb3Jkc1swXSA9IE1hdGguY2VpbCgoY29vcmRzWzBdICsgKGlzU2VsZWN0aW9uID8gY3NzQ2VsbFdpZHRoIC8gMiA6IDApKSAvIGNzc0NlbGxXaWR0aCk7XG4gIGNvb3Jkc1sxXSA9IE1hdGguY2VpbChjb29yZHNbMV0gLyBjc3NDZWxsSGVpZ2h0KTtcblxuICAvLyBFbnN1cmUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgdGVybWluYWwgdmlld3BvcnQuIE5vdGUgdGhhdCBzZWxlY3Rpb25zXG4gIC8vIG5lZWQgYW4gYWRkaXRpb24gcG9pbnQgb2YgcHJlY2lzaW9uIHRvIGNvdmVyIHRoZSBlbmQgcG9pbnQgKGFzIGNoYXJhY3RlcnNcbiAgLy8gY292ZXIgaGFsZiBvZiBvbmUgY2hhciBhbmQgaGFsZiBvZiB0aGUgbmV4dCkuXG4gIGNvb3Jkc1swXSA9IE1hdGgubWluKE1hdGgubWF4KGNvb3Jkc1swXSwgMSksIGNvbENvdW50ICsgKGlzU2VsZWN0aW9uID8gMSA6IDApKTtcbiAgY29vcmRzWzFdID0gTWF0aC5taW4oTWF0aC5tYXgoY29vcmRzWzFdLCAxKSwgcm93Q291bnQpO1xuXG4gIHJldHVybiBjb29yZHM7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEMwIH0gZnJvbSAnY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgZW51bSBEaXJlY3Rpb24ge1xuICBVUCA9ICdBJyxcbiAgRE9XTiA9ICdCJyxcbiAgUklHSFQgPSAnQycsXG4gIExFRlQgPSAnRCdcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgYWxsIHRoZSBhcnJvdyBzZXF1ZW5jZXMgdG9nZXRoZXIuXG4gKiBSZXNldHMgdGhlIHN0YXJ0aW5nIHJvdyB0byBhbiB1bndyYXBwZWQgcm93LCBtb3ZlcyB0byB0aGUgcmVxdWVzdGVkIHJvdyxcbiAqIHRoZW4gbW92ZXMgdG8gcmVxdWVzdGVkIGNvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0NlbGxTZXF1ZW5jZSh0YXJnZXRYOiBudW1iZXIsIHRhcmdldFk6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhcnRYID0gYnVmZmVyU2VydmljZS5idWZmZXIueDtcbiAgY29uc3Qgc3RhcnRZID0gYnVmZmVyU2VydmljZS5idWZmZXIueTtcblxuICAvLyBUaGUgYWx0IGJ1ZmZlciBzaG91bGQgdHJ5IHRvIG5hdmlnYXRlIGJldHdlZW4gcm93c1xuICBpZiAoIWJ1ZmZlclNlcnZpY2UuYnVmZmVyLmhhc1Njcm9sbGJhY2spIHtcbiAgICByZXR1cm4gcmVzZXRTdGFydGluZ1JvdyhzdGFydFgsIHN0YXJ0WSwgdGFyZ2V0WCwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpICtcbiAgICAgIG1vdmVUb1JlcXVlc3RlZFJvdyhzdGFydFksIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKSArXG4gICAgICBtb3ZlVG9SZXF1ZXN0ZWRDb2woc3RhcnRYLCBzdGFydFksIHRhcmdldFgsIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKTtcbiAgfVxuXG4gIC8vIE9ubHkgbW92ZSBob3Jpem9udGFsbHkgZm9yIHRoZSBub3JtYWwgYnVmZmVyXG4gIGxldCBkaXJlY3Rpb247XG4gIGlmIChzdGFydFkgPT09IHRhcmdldFkpIHtcbiAgICBkaXJlY3Rpb24gPSBzdGFydFggPiB0YXJnZXRYID8gRGlyZWN0aW9uLkxFRlQgOiBEaXJlY3Rpb24uUklHSFQ7XG4gICAgcmV0dXJuIHJlcGVhdChNYXRoLmFicyhzdGFydFggLSB0YXJnZXRYKSwgc2VxdWVuY2UoZGlyZWN0aW9uLCBhcHBsaWNhdGlvbkN1cnNvcikpO1xuICB9XG4gIGRpcmVjdGlvbiA9IHN0YXJ0WSA+IHRhcmdldFkgPyBEaXJlY3Rpb24uTEVGVCA6IERpcmVjdGlvbi5SSUdIVDtcbiAgY29uc3Qgcm93RGlmZmVyZW5jZSA9IE1hdGguYWJzKHN0YXJ0WSAtIHRhcmdldFkpO1xuICBjb25zdCBjZWxsc1RvTW92ZSA9IGNvbHNGcm9tUm93RW5kKHN0YXJ0WSA+IHRhcmdldFkgPyB0YXJnZXRYIDogc3RhcnRYLCBidWZmZXJTZXJ2aWNlKSArXG4gICAgKHJvd0RpZmZlcmVuY2UgLSAxKSAqIGJ1ZmZlclNlcnZpY2UuY29scyArIDEgLyogd3JhcCBhcm91bmQgMSByb3cgKi8gK1xuICAgIGNvbHNGcm9tUm93QmVnaW5uaW5nKHN0YXJ0WSA+IHRhcmdldFkgPyBzdGFydFggOiB0YXJnZXRYLCBidWZmZXJTZXJ2aWNlKTtcbiAgcmV0dXJuIHJlcGVhdChjZWxsc1RvTW92ZSwgc2VxdWVuY2UoZGlyZWN0aW9uLCBhcHBsaWNhdGlvbkN1cnNvcikpO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIG51bWJlciBvZiBjb2xzIGZyb20gYSByb3cgYmVnaW5uaW5nIHRvIGEgY29sLlxuICovXG5mdW5jdGlvbiBjb2xzRnJvbVJvd0JlZ2lubmluZyhjdXJyWDogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSk6IG51bWJlciB7XG4gIHJldHVybiBjdXJyWCAtIDE7XG59XG5cbi8qKlxuICogRmluZCB0aGUgbnVtYmVyIG9mIGNvbHMgZnJvbSBhIGNvbCB0byByb3cgZW5kLlxuICovXG5mdW5jdGlvbiBjb2xzRnJvbVJvd0VuZChjdXJyWDogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSk6IG51bWJlciB7XG4gIHJldHVybiBidWZmZXJTZXJ2aWNlLmNvbHMgLSBjdXJyWDtcbn1cblxuLyoqXG4gKiBJZiB0aGUgaW5pdGlhbCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGlzIG9uIGEgcm93IHRoYXQgaXMgd3JhcHBlZCwgbW92ZSB0aGVcbiAqIGN1cnNvciB1cCB0byB0aGUgZmlyc3Qgcm93IHRoYXQgaXMgbm90IHdyYXBwZWQgdG8gaGF2ZSBhY2N1cmF0ZSB2ZXJ0aWNhbFxuICogcG9zaXRpb25pbmcuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0U3RhcnRpbmdSb3coc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB0YXJnZXRYOiBudW1iZXIsIHRhcmdldFk6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKG1vdmVUb1JlcXVlc3RlZFJvdyhzdGFydFksIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIHJlcGVhdChidWZmZXJMaW5lKFxuICAgIHN0YXJ0WCwgc3RhcnRZLCBzdGFydFgsXG4gICAgc3RhcnRZIC0gd3JhcHBlZFJvd3NGb3JSb3coc3RhcnRZLCBidWZmZXJTZXJ2aWNlKSwgZmFsc2UsIGJ1ZmZlclNlcnZpY2VcbiAgKS5sZW5ndGgsIHNlcXVlbmNlKERpcmVjdGlvbi5MRUZULCBhcHBsaWNhdGlvbkN1cnNvcikpO1xufVxuXG4vKipcbiAqIFVzaW5nIHRoZSByZXNldCBzdGFydGluZyBhbmQgZW5kaW5nIHJvdywgbW92ZSB0byB0aGUgcmVxdWVzdGVkIHJvdyxcbiAqIGlnbm9yaW5nIHdyYXBwZWQgcm93c1xuICovXG5mdW5jdGlvbiBtb3ZlVG9SZXF1ZXN0ZWRSb3coc3RhcnRZOiBudW1iZXIsIHRhcmdldFk6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhcnRSb3cgPSBzdGFydFkgLSB3cmFwcGVkUm93c0ZvclJvdyhzdGFydFksIGJ1ZmZlclNlcnZpY2UpO1xuICBjb25zdCBlbmRSb3cgPSB0YXJnZXRZIC0gd3JhcHBlZFJvd3NGb3JSb3codGFyZ2V0WSwgYnVmZmVyU2VydmljZSk7XG5cbiAgY29uc3Qgcm93c1RvTW92ZSA9IE1hdGguYWJzKHN0YXJ0Um93IC0gZW5kUm93KSAtIHdyYXBwZWRSb3dzQ291bnQoc3RhcnRZLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlKTtcblxuICByZXR1cm4gcmVwZWF0KHJvd3NUb01vdmUsIHNlcXVlbmNlKHZlcnRpY2FsRGlyZWN0aW9uKHN0YXJ0WSwgdGFyZ2V0WSksIGFwcGxpY2F0aW9uQ3Vyc29yKSk7XG59XG5cbi8qKlxuICogTW92ZSB0byB0aGUgcmVxdWVzdGVkIGNvbCBvbiB0aGUgZW5kaW5nIHJvd1xuICovXG5mdW5jdGlvbiBtb3ZlVG9SZXF1ZXN0ZWRDb2woc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB0YXJnZXRYOiBudW1iZXIsIHRhcmdldFk6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yOiBib29sZWFuKTogc3RyaW5nIHtcbiAgbGV0IHN0YXJ0Um93O1xuICBpZiAobW92ZVRvUmVxdWVzdGVkUm93KHN0YXJ0WSwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpLmxlbmd0aCA+IDApIHtcbiAgICBzdGFydFJvdyA9IHRhcmdldFkgLSB3cmFwcGVkUm93c0ZvclJvdyh0YXJnZXRZLCBidWZmZXJTZXJ2aWNlKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydFJvdyA9IHN0YXJ0WTtcbiAgfVxuXG4gIGNvbnN0IGVuZFJvdyA9IHRhcmdldFk7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IGhvcml6b250YWxEaXJlY3Rpb24oc3RhcnRYLCBzdGFydFksIHRhcmdldFgsIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKTtcblxuICByZXR1cm4gcmVwZWF0KGJ1ZmZlckxpbmUoXG4gICAgc3RhcnRYLCBzdGFydFJvdywgdGFyZ2V0WCwgZW5kUm93LFxuICAgIGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLlJJR0hULCBidWZmZXJTZXJ2aWNlXG4gICkubGVuZ3RoLCBzZXF1ZW5jZShkaXJlY3Rpb24sIGFwcGxpY2F0aW9uQ3Vyc29yKSk7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiB3cmFwcGVkIHJvd3MgYmV0d2VlbiB0aGUgdW53cmFwcGVkIHN0YXJ0aW5nIGFuZFxuICogZW5kaW5nIHJvd3MuIFRoZXNlIHJvd3MgbmVlZCB0byBpZ25vcmVkIHNpbmNlIHRoZSBjdXJzb3Igc2tpcHMgb3ZlciB0aGVtLlxuICovXG5mdW5jdGlvbiB3cmFwcGVkUm93c0NvdW50KHN0YXJ0WTogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlKTogbnVtYmVyIHtcbiAgbGV0IHdyYXBwZWRSb3dzID0gMDtcbiAgY29uc3Qgc3RhcnRSb3cgPSBzdGFydFkgLSB3cmFwcGVkUm93c0ZvclJvdyhzdGFydFksIGJ1ZmZlclNlcnZpY2UpO1xuICBjb25zdCBlbmRSb3cgPSB0YXJnZXRZIC0gd3JhcHBlZFJvd3NGb3JSb3codGFyZ2V0WSwgYnVmZmVyU2VydmljZSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLmFicyhzdGFydFJvdyAtIGVuZFJvdyk7IGkrKykge1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHZlcnRpY2FsRGlyZWN0aW9uKHN0YXJ0WSwgdGFyZ2V0WSkgPT09IERpcmVjdGlvbi5VUCA/IC0xIDogMTtcbiAgICBjb25zdCBsaW5lID0gYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KHN0YXJ0Um93ICsgKGRpcmVjdGlvbiAqIGkpKTtcbiAgICBpZiAobGluZT8uaXNXcmFwcGVkKSB7XG4gICAgICB3cmFwcGVkUm93cysrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3cmFwcGVkUm93cztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2Ygd3JhcHBlZCByb3dzIHRoYXQgbWFrZSB1cCBhIGdpdmVuIHJvdy5cbiAqIEBwYXJhbSBjdXJyZW50Um93IFRoZSByb3cgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHdyYXBwZWQgcm93cyBtYWtlIGl0IHVwXG4gKi9cbmZ1bmN0aW9uIHdyYXBwZWRSb3dzRm9yUm93KGN1cnJlbnRSb3c6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UpOiBudW1iZXIge1xuICBsZXQgcm93Q291bnQgPSAwO1xuICBsZXQgbGluZSA9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChjdXJyZW50Um93KTtcbiAgbGV0IGxpbmVXcmFwcyA9IGxpbmU/LmlzV3JhcHBlZDtcblxuICB3aGlsZSAobGluZVdyYXBzICYmIGN1cnJlbnRSb3cgPj0gMCAmJiBjdXJyZW50Um93IDwgYnVmZmVyU2VydmljZS5yb3dzKSB7XG4gICAgcm93Q291bnQrKztcbiAgICBsaW5lID0gYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KC0tY3VycmVudFJvdyk7XG4gICAgbGluZVdyYXBzID0gbGluZT8uaXNXcmFwcGVkO1xuICB9XG5cbiAgcmV0dXJuIHJvd0NvdW50O1xufVxuXG4vKipcbiAqIERpcmVjdGlvbiBkZXRlcm1pbmVyc1xuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcmlnaHQgb3IgbGVmdCBhcnJvdyBpcyBuZWVkZWRcbiAqL1xuZnVuY3Rpb24gaG9yaXpvbnRhbERpcmVjdGlvbihzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHRhcmdldFg6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3I6IGJvb2xlYW4pOiBEaXJlY3Rpb24ge1xuICBsZXQgc3RhcnRSb3c7XG4gIGlmIChtb3ZlVG9SZXF1ZXN0ZWRSb3codGFyZ2V0WCwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpLmxlbmd0aCA+IDApIHtcbiAgICBzdGFydFJvdyA9IHRhcmdldFkgLSB3cmFwcGVkUm93c0ZvclJvdyh0YXJnZXRZLCBidWZmZXJTZXJ2aWNlKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydFJvdyA9IHN0YXJ0WTtcbiAgfVxuXG4gIGlmICgoc3RhcnRYIDwgdGFyZ2V0WCAmJlxuICAgIHN0YXJ0Um93IDw9IHRhcmdldFkpIHx8IC8vIGRvd24vcmlnaHQgb3Igc2FtZSB5L3JpZ2h0XG4gICAgKHN0YXJ0WCA+PSB0YXJnZXRYICYmXG4gICAgc3RhcnRSb3cgPCB0YXJnZXRZKSkgeyAgLy8gZG93bi9sZWZ0IG9yIHNhbWUgeS9sZWZ0XG4gICAgcmV0dXJuIERpcmVjdGlvbi5SSUdIVDtcbiAgfVxuICByZXR1cm4gRGlyZWN0aW9uLkxFRlQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgdXAgb3IgZG93biBhcnJvdyBpcyBuZWVkZWRcbiAqL1xuZnVuY3Rpb24gdmVydGljYWxEaXJlY3Rpb24oc3RhcnRZOiBudW1iZXIsIHRhcmdldFk6IG51bWJlcik6IERpcmVjdGlvbiB7XG4gIHJldHVybiBzdGFydFkgPiB0YXJnZXRZID8gRGlyZWN0aW9uLlVQIDogRGlyZWN0aW9uLkRPV047XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyB0aGUgc3RyaW5nIG9mIGNoYXJzIGluIHRoZSBidWZmZXIgZnJvbSBhIHN0YXJ0aW5nIHJvdyBhbmQgY29sXG4gKiB0byBhbiBlbmRpbmcgcm93IGFuZCBjb2xcbiAqIEBwYXJhbSBzdGFydENvbCBUaGUgc3RhcnRpbmcgY29sdW1uIHBvc2l0aW9uXG4gKiBAcGFyYW0gc3RhcnRSb3cgVGhlIHN0YXJ0aW5nIHJvdyBwb3NpdGlvblxuICogQHBhcmFtIGVuZENvbCBUaGUgZW5kaW5nIGNvbHVtbiBwb3NpdGlvblxuICogQHBhcmFtIGVuZFJvdyBUaGUgZW5kaW5nIHJvdyBwb3NpdGlvblxuICogQHBhcmFtIGZvcndhcmQgRGlyZWN0aW9uIHRvIG1vdmVcbiAqL1xuZnVuY3Rpb24gYnVmZmVyTGluZShcbiAgc3RhcnRDb2w6IG51bWJlcixcbiAgc3RhcnRSb3c6IG51bWJlcixcbiAgZW5kQ29sOiBudW1iZXIsXG4gIGVuZFJvdzogbnVtYmVyLFxuICBmb3J3YXJkOiBib29sZWFuLFxuICBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZVxuKTogc3RyaW5nIHtcbiAgbGV0IGN1cnJlbnRDb2wgPSBzdGFydENvbDtcbiAgbGV0IGN1cnJlbnRSb3cgPSBzdGFydFJvdztcbiAgbGV0IGJ1ZmZlclN0ciA9ICcnO1xuXG4gIHdoaWxlIChjdXJyZW50Q29sICE9PSBlbmRDb2wgfHwgY3VycmVudFJvdyAhPT0gZW5kUm93KSB7XG4gICAgY3VycmVudENvbCArPSBmb3J3YXJkID8gMSA6IC0xO1xuXG4gICAgaWYgKGZvcndhcmQgJiYgY3VycmVudENvbCA+IGJ1ZmZlclNlcnZpY2UuY29scyAtIDEpIHtcbiAgICAgIGJ1ZmZlclN0ciArPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoXG4gICAgICAgIGN1cnJlbnRSb3csIGZhbHNlLCBzdGFydENvbCwgY3VycmVudENvbFxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRDb2wgPSAwO1xuICAgICAgc3RhcnRDb2wgPSAwO1xuICAgICAgY3VycmVudFJvdysrO1xuICAgIH0gZWxzZSBpZiAoIWZvcndhcmQgJiYgY3VycmVudENvbCA8IDApIHtcbiAgICAgIGJ1ZmZlclN0ciArPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoXG4gICAgICAgIGN1cnJlbnRSb3csIGZhbHNlLCAwLCBzdGFydENvbCArIDFcbiAgICAgICk7XG4gICAgICBjdXJyZW50Q29sID0gYnVmZmVyU2VydmljZS5jb2xzIC0gMTtcbiAgICAgIHN0YXJ0Q29sID0gY3VycmVudENvbDtcbiAgICAgIGN1cnJlbnRSb3ctLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmZmVyU3RyICsgYnVmZmVyU2VydmljZS5idWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKFxuICAgIGN1cnJlbnRSb3csIGZhbHNlLCBzdGFydENvbCwgY3VycmVudENvbFxuICApO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgdGhlIGVzY2FwZSBzZXF1ZW5jZSBmb3IgY2xpY2tpbmcgYW4gYXJyb3dcbiAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBtb3ZlXG4gKi9cbmZ1bmN0aW9uIHNlcXVlbmNlKGRpcmVjdGlvbjogRGlyZWN0aW9uLCBhcHBsaWNhdGlvbkN1cnNvcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IG1vZCA9ICBhcHBsaWNhdGlvbkN1cnNvciA/ICdPJyA6ICdbJztcbiAgcmV0dXJuIEMwLkVTQyArIG1vZCArIGRpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcGVhdGVkIGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzXG4gKiBQb2x5ZmlsbCBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9yZXBlYXRcbiAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nXG4gKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdGhhdCBpcyB0byBiZSByZXBlYXRlZFxuICovXG5mdW5jdGlvbiByZXBlYXQoY291bnQ6IG51bWJlciwgc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb3VudCA9IE1hdGguZmxvb3IoY291bnQpO1xuICBsZXQgcnB0ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIHJwdCArPSBzdHI7XG4gIH1cbiAgcmV0dXJuIHJwdDtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRG9tUmVuZGVyZXJSb3dGYWN0b3J5LCBSb3dDc3MgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL2RvbS9Eb21SZW5kZXJlclJvd0ZhY3RvcnknO1xuaW1wb3J0IHsgV2lkdGhDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvZG9tL1dpZHRoQ2FjaGUnO1xuaW1wb3J0IHsgSU5WRVJURURfREVGQVVMVF9DT0xPUiB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBjcmVhdGVSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1NlbGVjdGlvblJlbmRlck1vZGVsJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zLCBJUmVuZGVyZXIsIElSZXF1ZXN0UmVkcmF3RXZlbnQsIElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDaGFyU2l6ZVNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElMaW5raWZpZXIyLCBJTGlua2lmaWVyRXZlbnQsIElUZXJtaW5hbCwgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJSW5zdGFudGlhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cblxuY29uc3QgVEVSTUlOQUxfQ0xBU1NfUFJFRklYID0gJ3h0ZXJtLWRvbS1yZW5kZXJlci1vd25lci0nO1xuY29uc3QgUk9XX0NPTlRBSU5FUl9DTEFTUyA9ICd4dGVybS1yb3dzJztcbmNvbnN0IEZHX0NMQVNTX1BSRUZJWCA9ICd4dGVybS1mZy0nO1xuY29uc3QgQkdfQ0xBU1NfUFJFRklYID0gJ3h0ZXJtLWJnLSc7XG5jb25zdCBGT0NVU19DTEFTUyA9ICd4dGVybS1mb2N1cyc7XG5jb25zdCBTRUxFQ1RJT05fQ0xBU1MgPSAneHRlcm0tc2VsZWN0aW9uJztcblxubGV0IG5leHRUZXJtaW5hbElkID0gMTtcblxuLyoqXG4gKiBBIGZhbGxiYWNrIHJlbmRlcmVyIGZvciB3aGVuIGNhbnZhcyBpcyBzbG93LiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZVxuICogcGFydGljdWxhcmx5IGZhc3Qgb3IgZmVhdHVyZSBjb21wbGV0ZSwgbW9yZSBqdXN0IHN0YWJsZSBhbmQgdXNhYmxlIGZvciB3aGVuXG4gKiBjYW52YXMgaXMgbm90IGFuIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIERvbVJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJlciB7XG4gIHByaXZhdGUgX3Jvd0ZhY3Rvcnk6IERvbVJlbmRlcmVyUm93RmFjdG9yeTtcbiAgcHJpdmF0ZSBfdGVybWluYWxDbGFzczogbnVtYmVyID0gbmV4dFRlcm1pbmFsSWQrKztcblxuICBwcml2YXRlIF90aGVtZVN0eWxlRWxlbWVudCE6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gIHByaXZhdGUgX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQhOiBIVE1MU3R5bGVFbGVtZW50O1xuICBwcml2YXRlIF9yb3dDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9yb3dFbGVtZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9zZWxlY3Rpb25Db250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF93aWR0aENhY2hlOiBXaWR0aENhY2hlO1xuICBwcml2YXRlIF9zZWxlY3Rpb25SZW5kZXJNb2RlbDogSVNlbGVjdGlvblJlbmRlck1vZGVsID0gY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTtcblxuICBwdWJsaWMgZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFJlZHJhdyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJUmVxdWVzdFJlZHJhd0V2ZW50PigpKS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogSVRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hlbHBlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbGlua2lmaWVyMjogSUxpbmtpZmllcjIsXG4gICAgQElJbnN0YW50aWF0aW9uU2VydmljZSBpbnN0YW50aWF0aW9uU2VydmljZTogSUluc3RhbnRpYXRpb25TZXJ2aWNlLFxuICAgIEBJQ2hhclNpemVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJTaXplU2VydmljZTogSUNoYXJTaXplU2VydmljZSxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJQ29yZUJyb3dzZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBASVRoZW1lU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuY2xhc3NMaXN0LmFkZChST1dfQ09OVEFJTkVSX0NMQVNTKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9ICdub3JtYWwnO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICB0aGlzLl9yZWZyZXNoUm93RWxlbWVudHModGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFNFTEVDVElPTl9DTEFTUyk7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgdGhpcy5kaW1lbnNpb25zID0gY3JlYXRlUmVuZGVyRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uT3B0aW9uQ2hhbmdlKCgpID0+IHRoaXMuX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCkpKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKGUgPT4gdGhpcy5faW5qZWN0Q3NzKGUpKSk7XG4gICAgdGhpcy5faW5qZWN0Q3NzKHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuXG4gICAgdGhpcy5fcm93RmFjdG9yeSA9IGluc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKERvbVJlbmRlcmVyUm93RmFjdG9yeSwgZG9jdW1lbnQpO1xuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKFRFUk1JTkFMX0NMQVNTX1BSRUZJWCArIHRoaXMuX3Rlcm1pbmFsQ2xhc3MpO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcm93Q29udGFpbmVyKTtcbiAgICB0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lcik7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2xpbmtpZmllcjIub25TaG93TGlua1VuZGVybGluZShlID0+IHRoaXMuX2hhbmRsZUxpbmtIb3ZlcihlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fbGlua2lmaWVyMi5vbkhpZGVMaW5rVW5kZXJsaW5lKGUgPT4gdGhpcy5faGFuZGxlTGlua0xlYXZlKGUpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoVEVSTUlOQUxfQ0xBU1NfUFJFRklYICsgdGhpcy5fdGVybWluYWxDbGFzcyk7XG5cbiAgICAgIC8vIE91dHNpZGUgaW5mbHVlbmNlcyBzdWNoIGFzIFJlYWN0IHVubW91bnRzIG1heSBtYW5pcHVsYXRlIHRoZSBET00gYmVmb3JlIG91ciBkaXNwb3NhbC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS94dGVybWpzL3h0ZXJtLmpzL2lzc3Vlcy8yOTYwXG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLl93aWR0aENhY2hlLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX3RoZW1lU3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLl93aWR0aENhY2hlID0gbmV3IFdpZHRoQ2FjaGUodGhpcy5fZG9jdW1lbnQsIHRoaXMuX2hlbHBlckNvbnRhaW5lcik7XG4gICAgdGhpcy5fd2lkdGhDYWNoZS5zZXRGb250KFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5LFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodCxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodEJvbGRcbiAgICApO1xuICAgIHRoaXMuX3NldERlZmF1bHRTcGFjaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IGRwciA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoID0gdGhpcy5fY2hhclNpemVTZXJ2aWNlLndpZHRoICogZHByO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCAqIGRwcik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoICsgTWF0aC5yb3VuZCh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxldHRlclNwYWNpbmcpO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgKiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmVIZWlnaHQpO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0ID0gMDtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIudG9wID0gMDtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAqIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0ICogdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aCAvIGRwcik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQgLyBkcHIpO1xuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQgPSB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgLyB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fcm93RWxlbWVudHMpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgICAgZWxlbWVudC5zdHlsZS5saW5lSGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gICAgICAvLyBNYWtlIHN1cmUgcm93cyBkb24ndCBvdmVyZmxvdyBvbnRvIGZvbGxvd2luZyByb3dcbiAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9kaW1lbnNpb25zU3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZXMgPVxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30gc3BhbiB7YCArXG4gICAgICBgIGRpc3BsYXk6IGlubGluZS1ibG9jaztgICsgICAvLyBUT0RPOiBmaW5kIHdvcmthcm91bmQgZm9yIGlubGluZS1ibG9jayAoY3JlYXRlcyB+MjAlIHJlbmRlciBwZW5hbHR5KVxuICAgICAgYCBoZWlnaHQ6IDEwMCU7YCArXG4gICAgICBgIHZlcnRpY2FsLWFsaWduOiB0b3A7YCArXG4gICAgICBgfWA7XG5cbiAgICB0aGlzLl9kaW1lbnNpb25zU3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gc3R5bGVzO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zdHlsZS5oZWlnaHQ7XG4gICAgdGhpcy5fc2NyZWVuRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRofXB4YDtcbiAgICB0aGlzLl9zY3JlZW5FbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodH1weGA7XG4gIH1cblxuICBwcml2YXRlIF9pbmplY3RDc3MoY29sb3JzOiBSZWFkb25seUNvbG9yU2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90aGVtZVN0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90aGVtZVN0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gQmFzZSBDU1NcbiAgICBsZXQgc3R5bGVzID1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1JPV19DT05UQUlORVJfQ0xBU1N9IHtgICtcbiAgICAgIGAgY29sb3I6ICR7Y29sb3JzLmZvcmVncm91bmQuY3NzfTtgICtcbiAgICAgIGAgZm9udC1mYW1pbHk6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5fTtgICtcbiAgICAgIGAgZm9udC1zaXplOiAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemV9cHg7YCArXG4gICAgICBgIGZvbnQta2VybmluZzogbm9uZTtgICtcbiAgICAgIGAgd2hpdGUtc3BhY2U6IHByZWAgK1xuICAgICAgYH1gO1xuICAgIHN0eWxlcyArPVxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30gLnh0ZXJtLWRpbSB7YCArXG4gICAgICBgIGNvbG9yOiAke2NvbG9yLm11bHRpcGx5T3BhY2l0eShjb2xvcnMuZm9yZWdyb3VuZCwgMC41KS5jc3N9O2AgK1xuICAgICAgYH1gO1xuICAgIC8vIFRleHQgc3R5bGVzXG4gICAgc3R5bGVzICs9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSBzcGFuOm5vdCguJHtSb3dDc3MuQk9MRF9DTEFTU30pIHtgICtcbiAgICAgIGAgZm9udC13ZWlnaHQ6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0fTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSBzcGFuLiR7Um93Q3NzLkJPTERfQ0xBU1N9IHtgICtcbiAgICAgIGAgZm9udC13ZWlnaHQ6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0Qm9sZH07YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gc3Bhbi4ke1Jvd0Nzcy5JVEFMSUNfQ0xBU1N9IHtgICtcbiAgICAgIGAgZm9udC1zdHlsZTogaXRhbGljO2AgK1xuICAgICAgYH1gO1xuICAgIC8vIEJsaW5rIGFuaW1hdGlvblxuICAgIGNvbnN0IGJsaW5rQW5pbWF0aW9uVW5kZXJsaW5lSWQgPSBgYmxpbmtfdW5kZXJsaW5lXyR7dGhpcy5fdGVybWluYWxDbGFzc31gO1xuICAgIGNvbnN0IGJsaW5rQW5pbWF0aW9uQmFySWQgPSBgYmxpbmtfYmFyXyR7dGhpcy5fdGVybWluYWxDbGFzc31gO1xuICAgIGNvbnN0IGJsaW5rQW5pbWF0aW9uQmxvY2tJZCA9IGBibGlua19ibG9ja18ke3RoaXMuX3Rlcm1pbmFsQ2xhc3N9YDtcbiAgICBzdHlsZXMgKz1cbiAgICAgIGBAa2V5ZnJhbWVzICR7YmxpbmtBbmltYXRpb25VbmRlcmxpbmVJZH0ge2AgK1xuICAgICAgYCA1MCUge2AgK1xuICAgICAgYCAgYm9yZGVyLWJvdHRvbS1zdHlsZTogaGlkZGVuO2AgK1xuICAgICAgYCB9YCArXG4gICAgICBgfWA7XG4gICAgc3R5bGVzICs9XG4gICAgICBgQGtleWZyYW1lcyAke2JsaW5rQW5pbWF0aW9uQmFySWR9IHtgICtcbiAgICAgIGAgNTAlIHtgICtcbiAgICAgIGAgIGJveC1zaGFkb3c6IG5vbmU7YCArXG4gICAgICBgIH1gICtcbiAgICAgIGB9YDtcbiAgICBzdHlsZXMgKz1cbiAgICAgIGBAa2V5ZnJhbWVzICR7YmxpbmtBbmltYXRpb25CbG9ja0lkfSB7YCArXG4gICAgICBgIDAlIHtgICtcbiAgICAgIGAgIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLmN1cnNvci5jc3N9O2AgK1xuICAgICAgYCAgY29sb3I6ICR7Y29sb3JzLmN1cnNvckFjY2VudC5jc3N9O2AgK1xuICAgICAgYCB9YCArXG4gICAgICBgIDUwJSB7YCArXG4gICAgICBgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O2AgK1xuICAgICAgYCAgY29sb3I6ICR7Y29sb3JzLmN1cnNvci5jc3N9O2AgK1xuICAgICAgYCB9YCArXG4gICAgICBgfWA7XG4gICAgLy8gQ3Vyc29yXG4gICAgc3R5bGVzICs9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfS4ke0ZPQ1VTX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfQkxJTktfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9TVFlMRV9VTkRFUkxJTkVfQ0xBU1N9IHtgICtcbiAgICAgIGAgYW5pbWF0aW9uOiAke2JsaW5rQW5pbWF0aW9uVW5kZXJsaW5lSWR9IDFzIHN0ZXAtZW5kIGluZmluaXRlO2AgK1xuICAgICAgYH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1JPV19DT05UQUlORVJfQ0xBU1N9LiR7Rk9DVVNfQ0xBU1N9IC4ke1Jvd0Nzcy5DVVJTT1JfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9CTElOS19DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX0JBUl9DTEFTU30ge2AgK1xuICAgICAgYCBhbmltYXRpb246ICR7YmxpbmtBbmltYXRpb25CYXJJZH0gMXMgc3RlcC1lbmQgaW5maW5pdGU7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30uJHtGT0NVU19DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX0JMSU5LX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1N9IHtgICtcbiAgICAgIGAgYW5pbWF0aW9uOiAke2JsaW5rQW5pbWF0aW9uQmxvY2tJZH0gMXMgc3RlcC1lbmQgaW5maW5pdGU7YCArXG4gICAgICBgfWAgK1xuICAgICAgLy8gIWltcG9ydGFudCBoZWxwcyBmaXggYW4gaXNzdWUgd2hlcmUgdGhlIGN1cnNvciB3aWxsIG5vdCByZW5kZXIgb24gdG9wIG9mIHRoZSBzZWxlY3Rpb24sXG4gICAgICAvLyBob3dldmVyIGl0J3MgdmVyeSBoYXJkIHRvIGZpeCB0aGlzIGlzc3VlIGFuZCByZXRhaW4gdGhlIGJsaW5rIGFuaW1hdGlvbiB3aXRob3V0IHRoZSB1c2Ugb2ZcbiAgICAgIC8vICFpbXBvcnRhbnQuIFNvIHRoaXMgZWRnZSBjYXNlIGZhaWxzIHdoZW4gY3Vyc29yIGJsaW5rIGlzIG9uLlxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX0JMT0NLX0NMQVNTfSB7YCArXG4gICAgICBgIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLmN1cnNvci5jc3N9O2AgK1xuICAgICAgYCBjb2xvcjogJHtjb2xvcnMuY3Vyc29yQWNjZW50LmNzc307YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX0JMT0NLX0NMQVNTfTpub3QoLiR7Um93Q3NzLkNVUlNPUl9CTElOS19DTEFTU30pIHtgICtcbiAgICAgIGAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc30gIWltcG9ydGFudDtgICtcbiAgICAgIGAgY29sb3I6ICR7Y29sb3JzLmN1cnNvckFjY2VudC5jc3N9ICFpbXBvcnRhbnQ7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX09VVExJTkVfQ0xBU1N9IHtgICtcbiAgICAgIGAgb3V0bGluZTogMXB4IHNvbGlkICR7Y29sb3JzLmN1cnNvci5jc3N9O2AgK1xuICAgICAgYCBvdXRsaW5lLW9mZnNldDogLTFweDtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkFSX0NMQVNTfSB7YCArXG4gICAgICBgIGJveC1zaGFkb3c6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JXaWR0aH1weCAwIDAgJHtjb2xvcnMuY3Vyc29yLmNzc30gaW5zZXQ7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTU30ge2AgK1xuICAgICAgYCBib3JkZXItYm90dG9tOiAxcHggJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO2AgK1xuICAgICAgYCBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFweCk7YCArXG4gICAgICBgfWA7XG4gICAgLy8gU2VsZWN0aW9uXG4gICAgc3R5bGVzICs9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtTRUxFQ1RJT05fQ0xBU1N9IHtgICtcbiAgICAgIGAgcG9zaXRpb246IGFic29sdXRlO2AgK1xuICAgICAgYCB0b3A6IDA7YCArXG4gICAgICBgIGxlZnQ6IDA7YCArXG4gICAgICBgIHotaW5kZXg6IDE7YCArXG4gICAgICBgIHBvaW50ZXItZXZlbnRzOiBub25lO2AgK1xuICAgICAgYH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9LmZvY3VzIC4ke1NFTEVDVElPTl9DTEFTU30gZGl2IHtgICtcbiAgICAgIGAgcG9zaXRpb246IGFic29sdXRlO2AgK1xuICAgICAgYCBiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlLmNzc307YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7U0VMRUNUSU9OX0NMQVNTfSBkaXYge2AgK1xuICAgICAgYCBwb3NpdGlvbjogYWJzb2x1dGU7YCArXG4gICAgICBgIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZS5jc3N9O2AgK1xuICAgICAgYH1gO1xuICAgIC8vIENvbG9yc1xuICAgIGZvciAoY29uc3QgW2ksIGNdIG9mIGNvbG9ycy5hbnNpLmVudHJpZXMoKSkge1xuICAgICAgc3R5bGVzICs9XG4gICAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0ZHX0NMQVNTX1BSRUZJWH0ke2l9IHsgY29sb3I6ICR7Yy5jc3N9OyB9YCArXG4gICAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0ZHX0NMQVNTX1BSRUZJWH0ke2l9LiR7Um93Q3NzLkRJTV9DTEFTU30geyBjb2xvcjogJHtjb2xvci5tdWx0aXBseU9wYWNpdHkoYywgMC41KS5jc3N9OyB9YCArXG4gICAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0JHX0NMQVNTX1BSRUZJWH0ke2l9IHsgYmFja2dyb3VuZC1jb2xvcjogJHtjLmNzc307IH1gO1xuICAgIH1cbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0ZHX0NMQVNTX1BSRUZJWH0ke0lOVkVSVEVEX0RFRkFVTFRfQ09MT1J9IHsgY29sb3I6ICR7Y29sb3Iub3BhcXVlKGNvbG9ycy5iYWNrZ3JvdW5kKS5jc3N9OyB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtGR19DTEFTU19QUkVGSVh9JHtJTlZFUlRFRF9ERUZBVUxUX0NPTE9SfS4ke1Jvd0Nzcy5ESU1fQ0xBU1N9IHsgY29sb3I6ICR7Y29sb3IubXVsdGlwbHlPcGFjaXR5KGNvbG9yLm9wYXF1ZShjb2xvcnMuYmFja2dyb3VuZCksIDAuNSkuY3NzfTsgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7QkdfQ0xBU1NfUFJFRklYfSR7SU5WRVJURURfREVGQVVMVF9DT0xPUn0geyBiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9ycy5mb3JlZ3JvdW5kLmNzc307IH1gO1xuXG4gICAgdGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gIH1cblxuICAvKipcbiAgICogZGVmYXVsdCBsZXR0ZXIgc3BhY2luZ1xuICAgKiBEdWUgdG8gcm91bmRpbmcgaXNzdWVzIGluIGRpbWVuc2lvbnMgZHByIGNhbGMgZ2x5cGggbWlnaHQgcmVuZGVyXG4gICAqIHNsaWdodGx5IHRvbyB3aWRlIG9yIHRvbyBuYXJyb3cuIFRoZSBtZXRob2QgY29ycmVjdHMgdGhlIHN0YWNraW5nIG9mZnNldHNcbiAgICogYnkgYXBwbHlpbmcgYSBkZWZhdWx0IGxldHRlci1zcGFjaW5nIGZvciBhbGwgY2hhcnMuXG4gICAqIFRoZSB2YWx1ZSBnZXRzIHBhc3NlZCB0byB0aGUgcm93IGZhY3RvcnkgdG8gYXZvaWQgc2V0dGluZyB0aGlzIHZhbHVlIGFnYWluXG4gICAqIChyZW5kZXIgc3BlZWR1cCBpcyByb3VnaGx5IDEwJSkuXG4gICAqL1xuICBwcml2YXRlIF9zZXREZWZhdWx0U3BhY2luZygpOiB2b2lkIHtcbiAgICAvLyBtZWFzdXJlIHNhbWUgY2hhciBhcyBpbiBDaGFyU2l6ZVNlcnZpY2UgdG8gZ2V0IHRoZSBiYXNlIGRldmlhdGlvblxuICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGggLSB0aGlzLl93aWR0aENhY2hlLmdldCgnVycsIGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5fcm93Q29udGFpbmVyLnN0eWxlLmxldHRlclNwYWNpbmcgPSBgJHtzcGFjaW5nfXB4YDtcbiAgICB0aGlzLl9yb3dGYWN0b3J5LmRlZmF1bHRTcGFjaW5nID0gc3BhY2luZztcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl93aWR0aENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hSb3dFbGVtZW50cyhjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEFkZCBtaXNzaW5nIGVsZW1lbnRzXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aDsgaSA8PSByb3dzOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5fcm93Q29udGFpbmVyLmFwcGVuZENoaWxkKHJvdyk7XG4gICAgICB0aGlzLl9yb3dFbGVtZW50cy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBleGNlc3MgZWxlbWVudHNcbiAgICB3aGlsZSAodGhpcy5fcm93RWxlbWVudHMubGVuZ3RoID4gcm93cykge1xuICAgICAgdGhpcy5fcm93Q29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0VsZW1lbnRzLnBvcCgpISk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3JlZnJlc2hSb3dFbGVtZW50cyhjb2xzLCByb3dzKTtcbiAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnNlbGVjdGlvblN0YXJ0LCB0aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC5zZWxlY3Rpb25FbmQsIHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLmNvbHVtblNlbGVjdE1vZGUpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fd2lkdGhDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3NldERlZmF1bHRTcGFjaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShGT0NVU19DTEFTUyk7XG4gICAgdGhpcy5yZW5kZXJSb3dzKDAsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKEZPQ1VTX0NMQVNTKTtcbiAgICB0aGlzLnJlbmRlclJvd3ModGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueSwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGFsbCBzZWxlY3Rpb25zXG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIHRoaXMuX3Jvd0ZhY3RvcnkuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB0aGlzLnJlbmRlclJvd3MoMCwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSk7XG5cbiAgICAvLyBTZWxlY3Rpb24gZG9lcyBub3QgZXhpc3RcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC51cGRhdGUodGhpcy5fdGVybWluYWwsIHN0YXJ0LCBlbmQsIGNvbHVtblNlbGVjdE1vZGUpO1xuXG4gICAgLy8gVHJhbnNsYXRlIGZyb20gYnVmZmVyIHBvc2l0aW9uIHRvIHZpZXdwb3J0IHBvc2l0aW9uXG4gICAgY29uc3Qgdmlld3BvcnRTdGFydFJvdyA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnZpZXdwb3J0U3RhcnRSb3c7XG4gICAgY29uc3Qgdmlld3BvcnRFbmRSb3cgPSB0aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC52aWV3cG9ydEVuZFJvdztcbiAgICBjb25zdCB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwudmlld3BvcnRDYXBwZWRTdGFydFJvdztcbiAgICBjb25zdCB2aWV3cG9ydENhcHBlZEVuZFJvdyA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuXG4gICAgLy8gTm8gbmVlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgfHwgdmlld3BvcnRDYXBwZWRFbmRSb3cgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBzZWxlY3Rpb25zXG4gICAgY29uc3QgZG9jdW1lbnRGcmFnbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgIGlmIChjb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBjb25zdCBpc1hGbGlwcGVkID0gc3RhcnRbMF0gPiBlbmRbMF07XG4gICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKFxuICAgICAgICB0aGlzLl9jcmVhdGVTZWxlY3Rpb25FbGVtZW50KHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3csIGlzWEZsaXBwZWQgPyBlbmRbMF0gOiBzdGFydFswXSwgaXNYRmxpcHBlZCA/IHN0YXJ0WzBdIDogZW5kWzBdLCB2aWV3cG9ydENhcHBlZEVuZFJvdyAtIHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgKyAxKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRHJhdyBmaXJzdCByb3dcbiAgICAgIGNvbnN0IHN0YXJ0Q29sID0gdmlld3BvcnRTdGFydFJvdyA9PT0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyA/IHN0YXJ0WzBdIDogMDtcbiAgICAgIGNvbnN0IGVuZENvbCA9IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPT09IHZpZXdwb3J0RW5kUm93ID8gZW5kWzBdIDogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgZG9jdW1lbnRGcmFnbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVTZWxlY3Rpb25FbGVtZW50KHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3csIHN0YXJ0Q29sLCBlbmRDb2wpKTtcbiAgICAgIC8vIERyYXcgbWlkZGxlIHJvd3NcbiAgICAgIGNvbnN0IG1pZGRsZVJvd3NDb3VudCA9IHZpZXdwb3J0Q2FwcGVkRW5kUm93IC0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyAtIDE7XG4gICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQodmlld3BvcnRDYXBwZWRTdGFydFJvdyArIDEsIDAsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgbWlkZGxlUm93c0NvdW50KSk7XG4gICAgICAvLyBEcmF3IGZpbmFsIHJvd1xuICAgICAgaWYgKHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgIT09IHZpZXdwb3J0Q2FwcGVkRW5kUm93KSB7XG4gICAgICAgIC8vIE9ubHkgZHJhdyB2aWV3cG9ydEVuZFJvdyBpZiBpdCdzIG5vdCB0aGUgc2FtZSBhcyB2aWV3cG9ydHRhcnRSb3dcbiAgICAgICAgY29uc3QgZW5kQ29sID0gdmlld3BvcnRFbmRSb3cgPT09IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID8gZW5kWzBdIDogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQodmlld3BvcnRDYXBwZWRFbmRSb3csIDAsIGVuZENvbCkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnRGcmFnbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNlbGVjdGlvbiBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBvZiB0aGUgc2VsZWN0aW9uLlxuICAgKiBAcGFyYW0gY29sU3RhcnQgVGhlIHN0YXJ0IGNvbHVtbi5cbiAgICogQHBhcmFtIGNvbEVuZCBUaGUgZW5kIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVTZWxlY3Rpb25FbGVtZW50KHJvdzogbnVtYmVyLCBjb2xTdGFydDogbnVtYmVyLCBjb2xFbmQ6IG51bWJlciwgcm93Q291bnQ6IG51bWJlciA9IDEpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGxlZnQgPSBjb2xTdGFydCAqIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aDtcbiAgICBsZXQgd2lkdGggPSB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGggKiAoY29sRW5kIC0gY29sU3RhcnQpO1xuICAgIGlmIChsZWZ0ICsgd2lkdGggPiB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aCkge1xuICAgICAgd2lkdGggPSB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aCAtIGxlZnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyb3dDb3VudCAqIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7cm93ICogdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQge1xuICAgIC8vIE5vLW9wLCB0aGUgY3Vyc29yIGlzIGRyYXduIHdoZW4gcm93cyBhcmUgZHJhd25cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICAvLyBSZWZyZXNoIENTU1xuICAgIHRoaXMuX2luamVjdENzcyh0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICAvLyB1cGRhdGUgc3BhY2luZyBjYWNoZVxuICAgIHRoaXMuX3dpZHRoQ2FjaGUuc2V0Rm9udChcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udEZhbWlseSxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemUsXG4gICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHQsXG4gICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHRCb2xkXG4gICAgKTtcbiAgICB0aGlzLl9zZXREZWZhdWx0U3BhY2luZygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yb3dFbGVtZW50cykge1xuICAgICAgLyoqXG4gICAgICAgKiBOT1RFOiBUaGlzIHVzZWQgdG8gYmUgYGUuaW5uZXJUZXh0ID0gJyc7YCBidXQgdGhhdCBkb2Vzbid0IHdvcmsgd2hlbiB1c2luZyBganNkb21gIGFuZFxuICAgICAgICogYEB0ZXN0aW5nLWxpYnJhcnkvcmVhY3RgXG4gICAgICAgKlxuICAgICAgICogcmVmZXJlbmNlczpcbiAgICAgICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Rlc3RpbmctbGlicmFyeS9yZWFjdC10ZXN0aW5nLWxpYnJhcnkvaXNzdWVzLzExNDZcbiAgICAgICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL2pzZG9tL2pzZG9tL2lzc3Vlcy8xMjQ1XG4gICAgICAgKi9cbiAgICAgIGUucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbmRlclJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcbiAgICBjb25zdCBjdXJzb3JBYnNvbHV0ZVkgPSBidWZmZXIueWJhc2UgKyBidWZmZXIueTtcbiAgICBjb25zdCBjdXJzb3JYID0gTWF0aC5taW4oYnVmZmVyLngsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAtIDEpO1xuICAgIGNvbnN0IGN1cnNvckJsaW5rID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JCbGluaztcbiAgICBjb25zdCBjdXJzb3JTdHlsZSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29yU3R5bGU7XG4gICAgY29uc3QgY3Vyc29ySW5hY3RpdmVTdHlsZSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29ySW5hY3RpdmVTdHlsZTtcblxuICAgIGZvciAobGV0IHkgPSBzdGFydDsgeSA8PSBlbmQ7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0geSArIGJ1ZmZlci55ZGlzcDtcbiAgICAgIGNvbnN0IHJvd0VsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50c1t5XTtcbiAgICAgIGNvbnN0IGxpbmVEYXRhID0gYnVmZmVyLmxpbmVzLmdldChyb3cpO1xuICAgICAgaWYgKCFyb3dFbGVtZW50IHx8ICFsaW5lRGF0YSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJvd0VsZW1lbnQucmVwbGFjZUNoaWxkcmVuKFxuICAgICAgICAuLi50aGlzLl9yb3dGYWN0b3J5LmNyZWF0ZVJvdyhcbiAgICAgICAgICBsaW5lRGF0YSxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgcm93ID09PSBjdXJzb3JBYnNvbHV0ZVksXG4gICAgICAgICAgY3Vyc29yU3R5bGUsXG4gICAgICAgICAgY3Vyc29ySW5hY3RpdmVTdHlsZSxcbiAgICAgICAgICBjdXJzb3JYLFxuICAgICAgICAgIGN1cnNvckJsaW5rLFxuICAgICAgICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCxcbiAgICAgICAgICB0aGlzLl93aWR0aENhY2hlLFxuICAgICAgICAgIC0xLFxuICAgICAgICAgIC0xXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3Rlcm1pbmFsU2VsZWN0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC4ke1RFUk1JTkFMX0NMQVNTX1BSRUZJWH0ke3RoaXMuX3Rlcm1pbmFsQ2xhc3N9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUxpbmtIb3ZlcihlOiBJTGlua2lmaWVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRDZWxsVW5kZXJsaW5lKGUueDEsIGUueDIsIGUueTEsIGUueTIsIGUuY29scywgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVMaW5rTGVhdmUoZTogSUxpbmtpZmllckV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fc2V0Q2VsbFVuZGVybGluZShlLngxLCBlLngyLCBlLnkxLCBlLnkyLCBlLmNvbHMsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldENlbGxVbmRlcmxpbmUoeDogbnVtYmVyLCB4MjogbnVtYmVyLCB5OiBudW1iZXIsIHkyOiBudW1iZXIsIGNvbHM6IG51bWJlciwgZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIE5PVEU6IFRoZSBsaW5raWZpZXIgbWF5IHNlbmQgb3V0IG9mIHZpZXdwb3J0IHktdmFsdWVzIGlmOlxuICAgICAqIC0gbmVnYXRpdmUgeS12YWx1ZTogdGhlIGxpbmsgc3RhcnRlZCBhdCBhIGhpZ2hlciBsaW5lXG4gICAgICogLSB5LXZhbHVlID49IG1heFk6IHRoZSBsaW5rIGVuZHMgYXQgYSBsaW5lIGJlbG93IHZpZXdwb3J0XG4gICAgICpcbiAgICAgKiBGb3IgbmVnYXRpdmUgeS12YWx1ZXMgd2UgY2FuIHNpbXBseSBhZGp1c3QgeCA9IDAsXG4gICAgICogYXMgaGlnaGVyIHVwIGxpbmsgc3RhcnQgbWVhbnMsIHRoYXQgZXZlcnl0aGluZyBmcm9tXG4gICAgICogKDAsMCkgaXMgYSBsaW5rIHVuZGVyIHRvcC1kb3duLWxlZnQtcmlnaHQgY2hhciBwcm9ncmVzc2lvblxuICAgICAqXG4gICAgICogQWRkaXRpb25hbGx5IHRoZXJlIG1pZ2h0IGJlIGEgc21hbGwgY2hhbmNlIG9mIG91dC1vZi1zeW5jIHh8eS12YWx1ZXNcbiAgICAgKiBmcm9tIGEgcmFjZSBjb25kaXRpb24gb2YgcmVuZGVyIHVwZGF0ZXMgdnMuIGxpbmsgZXZlbnQgaGFuZGxlciBleGVjdXRpb246XG4gICAgICogLSAoc3luYykgcmVzaXplOiBjaGFuY2VzIHRlcm1pbmFsIGJ1ZmZlciBpbiBzeW5jLCBzY2hlZHVsZXMgcmVuZGVyIHVwZGF0ZSBhc3luY1xuICAgICAqIC0gKGFzeW5jKSBsaW5rIGhhbmRsZXIgcmFjZSBjb25kaXRpb246IG5ldyBidWZmZXIgbWV0cmljcywgYnV0IHN0aWxsIG9uIG9sZCByZW5kZXIgc3RhdGVcbiAgICAgKiAtIChhc3luYykgcmVuZGVyIHVwZGF0ZTogYnJpbmdzIHRlcm0gbWV0cmljcyBhbmQgcmVuZGVyIHN0YXRlIGJhY2sgaW4gc3luY1xuICAgICAqL1xuICAgIC8vIGNsaXAgY29vcmRzIGludG8gdmlld3BvcnRcbiAgICBpZiAoeSA8IDApIHggPSAwO1xuICAgIGlmICh5MiA8IDApIHgyID0gMDtcbiAgICBjb25zdCBtYXhZID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMTtcbiAgICB5ID0gTWF0aC5tYXgoTWF0aC5taW4oeSwgbWF4WSksIDApO1xuICAgIHkyID0gTWF0aC5tYXgoTWF0aC5taW4oeTIsIG1heFkpLCAwKTtcblxuICAgIGNvbHMgPSBNYXRoLm1pbihjb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IGN1cnNvckFic29sdXRlWSA9IGJ1ZmZlci55YmFzZSArIGJ1ZmZlci55O1xuICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbihidWZmZXIueCwgY29scyAtIDEpO1xuICAgIGNvbnN0IGN1cnNvckJsaW5rID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JCbGluaztcbiAgICBjb25zdCBjdXJzb3JTdHlsZSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29yU3R5bGU7XG4gICAgY29uc3QgY3Vyc29ySW5hY3RpdmVTdHlsZSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29ySW5hY3RpdmVTdHlsZTtcblxuICAgIC8vIHJlZnJlc2ggcm93cyB3aXRoaW4gbGluayByYW5nZVxuICAgIGZvciAobGV0IGkgPSB5OyBpIDw9IHkyOyArK2kpIHtcbiAgICAgIGNvbnN0IHJvdyA9IGkgKyBidWZmZXIueWRpc3A7XG4gICAgICBjb25zdCByb3dFbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHNbaV07XG4gICAgICBjb25zdCBidWZmZXJsaW5lID0gYnVmZmVyLmxpbmVzLmdldChyb3cpO1xuICAgICAgaWYgKCFyb3dFbGVtZW50IHx8ICFidWZmZXJsaW5lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcm93RWxlbWVudC5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAgIC4uLnRoaXMuX3Jvd0ZhY3RvcnkuY3JlYXRlUm93KFxuICAgICAgICAgIGJ1ZmZlcmxpbmUsXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIHJvdyA9PT0gY3Vyc29yQWJzb2x1dGVZLFxuICAgICAgICAgIGN1cnNvclN0eWxlLFxuICAgICAgICAgIGN1cnNvckluYWN0aXZlU3R5bGUsXG4gICAgICAgICAgY3Vyc29yWCxcbiAgICAgICAgICBjdXJzb3JCbGluayxcbiAgICAgICAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGgsXG4gICAgICAgICAgdGhpcy5fd2lkdGhDYWNoZSxcbiAgICAgICAgICBlbmFibGVkID8gKGkgPT09IHkgPyB4IDogMCkgOiAtMSxcbiAgICAgICAgICBlbmFibGVkID8gKChpID09PSB5MiA/IHgyIDogY29scykgLSAxKSA6IC0xXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJMaW5lLCBJQ2VsbERhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IFdISVRFU1BBQ0VfQ0VMTF9DSEFSLCBBdHRyaWJ1dGVzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IElDb3JlU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBKb2luZWRDZWxsRGF0YSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvQ2hhcmFjdGVySm9pbmVyU2VydmljZSc7XG5pbXBvcnQgeyB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgV2lkdGhDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvZG9tL1dpZHRoQ2FjaGUnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuXG5cbmV4cG9ydCBjb25zdCBlbnVtIFJvd0NzcyB7XG4gIEJPTERfQ0xBU1MgPSAneHRlcm0tYm9sZCcsXG4gIERJTV9DTEFTUyA9ICd4dGVybS1kaW0nLFxuICBJVEFMSUNfQ0xBU1MgPSAneHRlcm0taXRhbGljJyxcbiAgVU5ERVJMSU5FX0NMQVNTID0gJ3h0ZXJtLXVuZGVybGluZScsXG4gIE9WRVJMSU5FX0NMQVNTID0gJ3h0ZXJtLW92ZXJsaW5lJyxcbiAgU1RSSUtFVEhST1VHSF9DTEFTUyA9ICd4dGVybS1zdHJpa2V0aHJvdWdoJyxcbiAgQ1VSU09SX0NMQVNTID0gJ3h0ZXJtLWN1cnNvcicsXG4gIENVUlNPUl9CTElOS19DTEFTUyA9ICd4dGVybS1jdXJzb3ItYmxpbmsnLFxuICBDVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1MgPSAneHRlcm0tY3Vyc29yLWJsb2NrJyxcbiAgQ1VSU09SX1NUWUxFX09VVExJTkVfQ0xBU1MgPSAneHRlcm0tY3Vyc29yLW91dGxpbmUnLFxuICBDVVJTT1JfU1RZTEVfQkFSX0NMQVNTID0gJ3h0ZXJtLWN1cnNvci1iYXInLFxuICBDVVJTT1JfU1RZTEVfVU5ERVJMSU5FX0NMQVNTID0gJ3h0ZXJtLWN1cnNvci11bmRlcmxpbmUnXG59XG5cblxuZXhwb3J0IGNsYXNzIERvbVJlbmRlcmVyUm93RmFjdG9yeSB7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuXG4gIHByaXZhdGUgX3NlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9zZWxlY3Rpb25FbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZGVmYXVsdFNwYWNpbmcgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASUNoYXJhY3RlckpvaW5lclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhcmFjdGVySm9pbmVyU2VydmljZTogSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJQ29yZUJyb3dzZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJVGhlbWVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5fc2VsZWN0aW9uRW5kID0gZW5kO1xuICAgIHRoaXMuX2NvbHVtblNlbGVjdE1vZGUgPSBjb2x1bW5TZWxlY3RNb2RlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVJvdyhcbiAgICBsaW5lRGF0YTogSUJ1ZmZlckxpbmUsXG4gICAgcm93OiBudW1iZXIsXG4gICAgaXNDdXJzb3JSb3c6IGJvb2xlYW4sXG4gICAgY3Vyc29yU3R5bGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjdXJzb3JJbmFjdGl2ZVN0eWxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY3Vyc29yWDogbnVtYmVyLFxuICAgIGN1cnNvckJsaW5rOiBib29sZWFuLFxuICAgIGNlbGxXaWR0aDogbnVtYmVyLFxuICAgIHdpZHRoQ2FjaGU6IFdpZHRoQ2FjaGUsXG4gICAgbGlua1N0YXJ0OiBudW1iZXIsXG4gICAgbGlua0VuZDogbnVtYmVyXG4gICk6IEhUTUxTcGFuRWxlbWVudFtdIHtcblxuICAgIGNvbnN0IGVsZW1lbnRzOiBIVE1MU3BhbkVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGpvaW5lZFJhbmdlcyA9IHRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UuZ2V0Sm9pbmVkQ2hhcmFjdGVycyhyb3cpO1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnM7XG5cbiAgICBsZXQgbGluZUxlbmd0aCA9IGxpbmVEYXRhLmdldE5vQmdUcmltbWVkTGVuZ3RoKCk7XG4gICAgaWYgKGlzQ3Vyc29yUm93ICYmIGxpbmVMZW5ndGggPCBjdXJzb3JYICsgMSkge1xuICAgICAgbGluZUxlbmd0aCA9IGN1cnNvclggKyAxO1xuICAgIH1cblxuICAgIGxldCBjaGFyRWxlbWVudDogSFRNTFNwYW5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGxldCBjZWxsQW1vdW50ID0gMDtcbiAgICBsZXQgdGV4dCA9ICcnO1xuICAgIGxldCBvbGRCZyA9IDA7XG4gICAgbGV0IG9sZEZnID0gMDtcbiAgICBsZXQgb2xkRXh0ID0gMDtcbiAgICBsZXQgb2xkTGlua0hvdmVyOiBudW1iZXIgfCBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IG9sZFNwYWNpbmcgPSAwO1xuICAgIGxldCBvbGRJc0luU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IHNwYWNpbmcgPSAwO1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBoYXNIb3ZlciA9IGxpbmtTdGFydCAhPT0gLTEgJiYgbGlua0VuZCAhPT0gLTE7XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGxpbmVMZW5ndGg7IHgrKykge1xuICAgICAgbGluZURhdGEubG9hZENlbGwoeCwgdGhpcy5fd29ya0NlbGwpO1xuICAgICAgbGV0IHdpZHRoID0gdGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKTtcblxuICAgICAgLy8gVGhlIGNoYXJhY3RlciB0byB0aGUgbGVmdCBpcyBhIHdpZGUgY2hhcmFjdGVyLCBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSBjaGFyIGF0IHgtMVxuICAgICAgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIocykgdG8gZHJhdyB3ZXJlIGpvaW5lZC5cbiAgICAgIGxldCBpc0pvaW5lZCA9IGZhbHNlO1xuICAgICAgbGV0IGxhc3RDaGFyWCA9IHg7XG5cbiAgICAgIC8vIFByb2Nlc3MgYW55IGpvaW5lZCBjaGFyYWN0ZXIgcmFuZ2VzIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiBob3cgdGhlXG4gICAgICAvLyByYW5nZXMgYXJlIHByb2R1Y2VkLCB3ZSBrbm93IHRoYXQgdGhleSBhcmUgdmFsaWQgZm9yIHRoZSBjaGFyYWN0ZXJzXG4gICAgICAvLyBhbmQgYXR0cmlidXRlcyBvZiBvdXIgaW5wdXQuXG4gICAgICBsZXQgY2VsbCA9IHRoaXMuX3dvcmtDZWxsO1xuICAgICAgaWYgKGpvaW5lZFJhbmdlcy5sZW5ndGggPiAwICYmIHggPT09IGpvaW5lZFJhbmdlc1swXVswXSkge1xuICAgICAgICBpc0pvaW5lZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gam9pbmVkUmFuZ2VzLnNoaWZ0KCkhO1xuXG4gICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgZXhhY3Qgc3RhcnQgYW5kIGVuZCBjb2x1bW4gb2YgdGhlIGpvaW5lZCByYW5nZSxcbiAgICAgICAgLy8gc28gd2UgZ2V0IHRoZSBzdHJpbmcgYW5kIHdpZHRoIHJlcHJlc2VudGluZyBpdCBkaXJlY3RseVxuICAgICAgICBjZWxsID0gbmV3IEpvaW5lZENlbGxEYXRhKFxuICAgICAgICAgIHRoaXMuX3dvcmtDZWxsLFxuICAgICAgICAgIGxpbmVEYXRhLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUsIHJhbmdlWzBdLCByYW5nZVsxXSksXG4gICAgICAgICAgcmFuZ2VbMV0gLSByYW5nZVswXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgb3ZlciB0aGUgY2VsbHMgb2NjdXBpZWQgYnkgdGhpcyByYW5nZSBpbiB0aGUgbG9vcFxuICAgICAgICBsYXN0Q2hhclggPSByYW5nZVsxXSAtIDE7XG5cbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgd2lkdGhcbiAgICAgICAgd2lkdGggPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzSW5TZWxlY3Rpb24gPSB0aGlzLl9pc0NlbGxJblNlbGVjdGlvbih4LCByb3cpO1xuICAgICAgY29uc3QgaXNDdXJzb3JDZWxsID0gaXNDdXJzb3JSb3cgJiYgeCA9PT0gY3Vyc29yWDtcbiAgICAgIGNvbnN0IGlzTGlua0hvdmVyID0gaGFzSG92ZXIgJiYgeCA+PSBsaW5rU3RhcnQgJiYgeCA8PSBsaW5rRW5kO1xuXG4gICAgICBsZXQgaXNEZWNvcmF0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHgsIHJvdywgdW5kZWZpbmVkLCBkID0+IHtcbiAgICAgICAgaXNEZWNvcmF0ZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCBjaGFycyB0byByZW5kZXIgZm9yIHRoaXMgY2VsbFxuICAgICAgbGV0IGNoYXJzID0gY2VsbC5nZXRDaGFycygpIHx8IFdISVRFU1BBQ0VfQ0VMTF9DSEFSO1xuICAgICAgaWYgKGNoYXJzID09PSAnICcgJiYgKGNlbGwuaXNVbmRlcmxpbmUoKSB8fCBjZWxsLmlzT3ZlcmxpbmUoKSkpIHtcbiAgICAgICAgY2hhcnMgPSAnXFx4YTAnO1xuICAgICAgfVxuXG4gICAgICAvLyBsb29rdXAgY2hhciByZW5kZXIgd2lkdGggYW5kIGNhbGMgc3BhY2luZ1xuICAgICAgc3BhY2luZyA9IHdpZHRoICogY2VsbFdpZHRoIC0gd2lkdGhDYWNoZS5nZXQoY2hhcnMsIGNlbGwuaXNCb2xkKCksIGNlbGwuaXNJdGFsaWMoKSk7XG5cbiAgICAgIGlmICghY2hhckVsZW1lbnQpIHtcbiAgICAgICAgY2hhckVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogY2hhcnMgY2FuIG9ubHkgYmUgbWVyZ2VkIG9uIGV4aXN0aW5nIHNwYW4gaWY6XG4gICAgICAgICAqIC0gZXhpc3Rpbmcgc3BhbiBvbmx5IGNvbnRhaW5zIG1lcmdlYWJsZSBjaGFycyAoY2VsbEFtb3VudCAhPSAwKVxuICAgICAgICAgKiAtIGJnIGRpZCBub3QgY2hhbmdlIChvciBib3RoIGFyZSBpbiBzZWxlY3Rpb24pXG4gICAgICAgICAqIC0gZmcgZGlkIG5vdCBjaGFuZ2UgKG9yIGJvdGggYXJlIGluIHNlbGVjdGlvbiBhbmQgc2VsZWN0aW9uIGZnIGlzIHNldClcbiAgICAgICAgICogLSBleHQgZGlkIG5vdCBjaGFuZ2VcbiAgICAgICAgICogLSB1bmRlcmxpbmUgZnJvbSBob3ZlciBzdGF0ZSBkaWQgbm90IGNoYW5nZVxuICAgICAgICAgKiAtIGNlbGwgY29udGVudCByZW5kZXJzIHRvIHNhbWUgbGV0dGVyLXNwYWNpbmdcbiAgICAgICAgICogLSBjZWxsIGlzIG5vdCBjdXJzb3JcbiAgICAgICAgICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjZWxsQW1vdW50XG4gICAgICAgICAgJiYgKFxuICAgICAgICAgICAgKGlzSW5TZWxlY3Rpb24gJiYgb2xkSXNJblNlbGVjdGlvbilcbiAgICAgICAgICAgIHx8ICghaXNJblNlbGVjdGlvbiAmJiAhb2xkSXNJblNlbGVjdGlvbiAmJiBjZWxsLmJnID09PSBvbGRCZylcbiAgICAgICAgICApXG4gICAgICAgICAgJiYgKFxuICAgICAgICAgICAgKGlzSW5TZWxlY3Rpb24gJiYgb2xkSXNJblNlbGVjdGlvbiAmJiBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZClcbiAgICAgICAgICAgIHx8IGNlbGwuZmcgPT09IG9sZEZnXG4gICAgICAgICAgKVxuICAgICAgICAgICYmIGNlbGwuZXh0ZW5kZWQuZXh0ID09PSBvbGRFeHRcbiAgICAgICAgICAmJiBpc0xpbmtIb3ZlciA9PT0gb2xkTGlua0hvdmVyXG4gICAgICAgICAgJiYgc3BhY2luZyA9PT0gb2xkU3BhY2luZ1xuICAgICAgICAgICYmICFpc0N1cnNvckNlbGxcbiAgICAgICAgICAmJiAhaXNKb2luZWRcbiAgICAgICAgICAmJiAhaXNEZWNvcmF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gbm8gc3BhbiBhbHRlcmF0aW9ucywgdGh1cyBvbmx5IGFjY291bnQgY2hhcnMgc2tpcHBpbmcgYWxsIGNvZGUgYmVsb3dcbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IFdISVRFU1BBQ0VfQ0VMTF9DSEFSO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ICs9IGNoYXJzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjZWxsQW1vdW50Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogY2Fubm90IG1lcmdlOlxuICAgICAgICAgICAqIC0gYXBwbHkgbGVmdC1vdmVyIHRleHQgdG8gb2xkIHNwYW5cbiAgICAgICAgICAgKiAtIGNyZWF0ZSBuZXcgc3BhbiwgcmVzZXQgc3RhdGUgaG9sZGVycyBjZWxsQW1vdW50ICYgdGV4dFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChjZWxsQW1vdW50KSB7XG4gICAgICAgICAgICBjaGFyRWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYXJFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGNlbGxBbW91bnQgPSAwO1xuICAgICAgICAgIHRleHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gcHJlc2VydmUgY29uZGl0aW9ucyBmb3IgbmV4dCBtZXJnZXIgZXZhbCByb3VuZFxuICAgICAgb2xkQmcgPSBjZWxsLmJnO1xuICAgICAgb2xkRmcgPSBjZWxsLmZnO1xuICAgICAgb2xkRXh0ID0gY2VsbC5leHRlbmRlZC5leHQ7XG4gICAgICBvbGRMaW5rSG92ZXIgPSBpc0xpbmtIb3ZlcjtcbiAgICAgIG9sZFNwYWNpbmcgPSBzcGFjaW5nO1xuICAgICAgb2xkSXNJblNlbGVjdGlvbiA9IGlzSW5TZWxlY3Rpb247XG5cbiAgICAgIGlmIChpc0pvaW5lZCkge1xuICAgICAgICAvLyBUaGUgRE9NIHJlbmRlcmVyIGNvbG9ycyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgY3Vyc29yIGJ1dCBmb3IgbGlnYXR1cmVzIGFsbCBjZWxscyBhcmVcbiAgICAgICAgLy8gam9pbmVkLiBUaGUgd29ya2Fyb3VuZCBoZXJlIGlzIHRvIHNob3cgYSBjdXJzb3IgYXJvdW5kIHRoZSB3aG9sZSBsaWdhdHVyZSBzbyBpdCBzaG93cyB1cCxcbiAgICAgICAgLy8gdGhlIGN1cnNvciBsb29rcyB0aGUgc2FtZSB3aGVuIG9uIGFueSBjaGFyYWN0ZXIgb2YgdGhlIGxpZ2F0dXJlIHRob3VnaFxuICAgICAgICBpZiAoY3Vyc29yWCA+PSB4ICYmIGN1cnNvclggPD0gbGFzdENoYXJYKSB7XG4gICAgICAgICAgY3Vyc29yWCA9IHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiAmJiBpc0N1cnNvckNlbGwgJiYgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9DTEFTUyk7XG4gICAgICAgIGlmICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgaWYgKGN1cnNvckJsaW5rKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9CTElOS19DTEFTUyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsYXNzZXMucHVzaChcbiAgICAgICAgICAgIGN1cnNvclN0eWxlID09PSAnYmFyJ1xuICAgICAgICAgICAgICA/IFJvd0Nzcy5DVVJTT1JfU1RZTEVfQkFSX0NMQVNTXG4gICAgICAgICAgICAgIDogY3Vyc29yU3R5bGUgPT09ICd1bmRlcmxpbmUnXG4gICAgICAgICAgICAgICAgPyBSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTU1xuICAgICAgICAgICAgICAgIDogUm93Q3NzLkNVUlNPUl9TVFlMRV9CTE9DS19DTEFTU1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGN1cnNvckluYWN0aXZlU3R5bGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY3Vyc29ySW5hY3RpdmVTdHlsZSkge1xuICAgICAgICAgICAgICBjYXNlICdvdXRsaW5lJzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9TVFlMRV9PVVRMSU5FX0NMQVNTKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnYmxvY2snOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX1NUWUxFX0JMT0NLX0NMQVNTKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnYmFyJzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9TVFlMRV9CQVJfQ0xBU1MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICd1bmRlcmxpbmUnOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTUyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzQm9sZCgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQk9MRF9DTEFTUyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5JVEFMSUNfQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0RpbSgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuRElNX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNJbnZpc2libGUoKSkge1xuICAgICAgICB0ZXh0ID0gV0hJVEVTUEFDRV9DRUxMX0NIQVI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gY2VsbC5nZXRDaGFycygpIHx8IFdISVRFU1BBQ0VfQ0VMTF9DSEFSO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgJHtSb3dDc3MuVU5ERVJMSU5FX0NMQVNTfS0ke2NlbGwuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGV9YCk7XG4gICAgICAgIGlmICh0ZXh0ID09PSAnICcpIHtcbiAgICAgICAgICB0ZXh0ID0gJ1xceGEwJzsgLy8gPSAmbmJzcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNlbGwuaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKSkge1xuICAgICAgICAgIGlmIChjZWxsLmlzVW5kZXJsaW5lQ29sb3JSR0IoKSkge1xuICAgICAgICAgICAgY2hhckVsZW1lbnQuc3R5bGUudGV4dERlY29yYXRpb25Db2xvciA9IGByZ2IoJHtBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoY2VsbC5nZXRVbmRlcmxpbmVDb2xvcigpKS5qb2luKCcsJyl9KWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmZyA9IGNlbGwuZ2V0VW5kZXJsaW5lQ29sb3IoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmIGNlbGwuaXNCb2xkKCkgJiYgZmcgPCA4KSB7XG4gICAgICAgICAgICAgIGZnICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGFyRWxlbWVudC5zdHlsZS50ZXh0RGVjb3JhdGlvbkNvbG9yID0gY29sb3JzLmFuc2lbZmddLmNzcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNPdmVybGluZSgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuT1ZFUkxJTkVfQ0xBU1MpO1xuICAgICAgICBpZiAodGV4dCA9PT0gJyAnKSB7XG4gICAgICAgICAgdGV4dCA9ICdcXHhhMCc7IC8vID0gJm5ic3A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5TVFJJS0VUSFJPVUdIX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgbGluayBob3ZlciB1bmRlcmxpbmUgbGF0ZSwgZWZmZWN0aXZlbHkgb3ZlcnJpZGVzIGFueSBwcmV2aW91cyB0ZXh0LWRlY29yYXRpb25cbiAgICAgIC8vIHNldHRpbmdzXG4gICAgICBpZiAoaXNMaW5rSG92ZXIpIHtcbiAgICAgICAgY2hhckVsZW1lbnQuc3R5bGUudGV4dERlY29yYXRpb24gPSAndW5kZXJsaW5lJztcbiAgICAgIH1cblxuICAgICAgbGV0IGZnID0gY2VsbC5nZXRGZ0NvbG9yKCk7XG4gICAgICBsZXQgZmdDb2xvck1vZGUgPSBjZWxsLmdldEZnQ29sb3JNb2RlKCk7XG4gICAgICBsZXQgYmcgPSBjZWxsLmdldEJnQ29sb3IoKTtcbiAgICAgIGxldCBiZ0NvbG9yTW9kZSA9IGNlbGwuZ2V0QmdDb2xvck1vZGUoKTtcbiAgICAgIGNvbnN0IGlzSW52ZXJzZSA9ICEhY2VsbC5pc0ludmVyc2UoKTtcbiAgICAgIGlmIChpc0ludmVyc2UpIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IGZnO1xuICAgICAgICBmZyA9IGJnO1xuICAgICAgICBiZyA9IHRlbXA7XG4gICAgICAgIGNvbnN0IHRlbXAyID0gZmdDb2xvck1vZGU7XG4gICAgICAgIGZnQ29sb3JNb2RlID0gYmdDb2xvck1vZGU7XG4gICAgICAgIGJnQ29sb3JNb2RlID0gdGVtcDI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGFueSBkZWNvcmF0aW9uIGZvcmVncm91bmQvYmFja2dyb3VuZCBvdmVycmlkZXMsIHRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgaW52ZXJzZSBoYXNcbiAgICAgIC8vIGJlZW4gYXBwbGllZFxuICAgICAgbGV0IGJnT3ZlcnJpZGU6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmZ092ZXJyaWRlOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgaXNUb3AgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHgsIHJvdywgdW5kZWZpbmVkLCBkID0+IHtcbiAgICAgICAgaWYgKGQub3B0aW9ucy5sYXllciAhPT0gJ3RvcCcgJiYgaXNUb3ApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQuYmFja2dyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICAgYmdDb2xvck1vZGUgPSBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgICBiZyA9IGQuYmFja2dyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIDB4RkZGRkZGO1xuICAgICAgICAgIGJnT3ZlcnJpZGUgPSBkLmJhY2tncm91bmRDb2xvclJHQjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZC5mb3JlZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgICBmZ0NvbG9yTW9kZSA9IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICAgIGZnID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgMHhGRkZGRkY7XG4gICAgICAgICAgZmdPdmVycmlkZSA9IGQuZm9yZWdyb3VuZENvbG9yUkdCO1xuICAgICAgICB9XG4gICAgICAgIGlzVG9wID0gZC5vcHRpb25zLmxheWVyID09PSAndG9wJztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBcHBseSBzZWxlY3Rpb25cbiAgICAgIGlmICghaXNUb3AgJiYgaXNJblNlbGVjdGlvbikge1xuICAgICAgICAvLyBJZiBpbiB0aGUgc2VsZWN0aW9uLCBmb3JjZSB0aGUgZWxlbWVudCB0byBiZSBhYm92ZSB0aGUgc2VsZWN0aW9uIHRvIGltcHJvdmUgY29udHJhc3QgYW5kXG4gICAgICAgIC8vIHN1cHBvcnQgb3BhcXVlIHNlbGVjdGlvbnMuIFRoZSBhcHBsaWVzIGJhY2tncm91bmQgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBoZXJlIGFzXG4gICAgICAgIC8vIHNlbGVjdGlvbiBpcyBkcmF3biBpbiBhIHNlcGVyYXRlIGNvbnRhaW5lciwgdGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHRvIGVuc3VyaW5nIG1pbmltdW1cbiAgICAgICAgLy8gY29udHJhc3QgcmF0aW9cbiAgICAgICAgYmdPdmVycmlkZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6IGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU7XG4gICAgICAgIGJnID0gYmdPdmVycmlkZS5yZ2JhID4+IDggJiAweEZGRkZGRjtcbiAgICAgICAgYmdDb2xvck1vZGUgPSBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgLy8gU2luY2UgYW4gb3BhcXVlIHNlbGVjdGlvbiBpcyBiZWluZyByZW5kZXJlZCwgdGhlIHNlbGVjdGlvbiBwcmV0ZW5kcyB0byBiZSBhIGRlY29yYXRpb24gdG9cbiAgICAgICAgLy8gZW5zdXJlIHRleHQgaXMgZHJhd24gYWJvdmUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgaXNUb3AgPSB0cnVlO1xuICAgICAgICAvLyBBcHBseSBzZWxlY3Rpb24gZm9yZWdyb3VuZCBpZiBhcHBsaWNhYmxlXG4gICAgICAgIGlmIChjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCkge1xuICAgICAgICAgIGZnQ29sb3JNb2RlID0gQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgICAgZmcgPSBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZC5yZ2JhID4+IDggJiAweEZGRkZGRjtcbiAgICAgICAgICBmZ092ZXJyaWRlID0gY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIHRvcCBkZWNvcmF0aW9uLCByZW5kZXIgYWJvdmUgdGhlIHNlbGVjdGlvblxuICAgICAgaWYgKGlzVG9wKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgneHRlcm0tZGVjb3JhdGlvbi10b3AnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFja2dyb3VuZFxuICAgICAgbGV0IHJlc29sdmVkQmc6IElDb2xvcjtcbiAgICAgIHN3aXRjaCAoYmdDb2xvck1vZGUpIHtcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgcmVzb2x2ZWRCZyA9IGNvbG9ycy5hbnNpW2JnXTtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goYHh0ZXJtLWJnLSR7Ymd9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgcmVzb2x2ZWRCZyA9IGNoYW5uZWxzLnRvQ29sb3IoYmcgPj4gMTYsIGJnID4+IDggJiAweEZGLCBiZyAmIDB4RkYpO1xuICAgICAgICAgIHRoaXMuX2FkZFN0eWxlKGNoYXJFbGVtZW50LCBgYmFja2dyb3VuZC1jb2xvcjojJHtwYWRTdGFydCgoYmcgPj4+IDApLnRvU3RyaW5nKDE2KSwgJzAnLCA2KX1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGlzSW52ZXJzZSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRCZyA9IGNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKGB4dGVybS1iZy0ke0lOVkVSVEVEX0RFRkFVTFRfQ09MT1J9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVkQmcgPSBjb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJhY2tncm91bmQgb3ZlcnJpZGUgYnkgbm93IGl0J3MgdGhlIG9yaWdpbmFsIGNvbG9yLCBzbyBhcHBseSBkaW0gaWYgbmVlZGVkXG4gICAgICBpZiAoIWJnT3ZlcnJpZGUpIHtcbiAgICAgICAgaWYgKGNlbGwuaXNEaW0oKSkge1xuICAgICAgICAgIGJnT3ZlcnJpZGUgPSBjb2xvci5tdWx0aXBseU9wYWNpdHkocmVzb2x2ZWRCZywgMC41KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3JlZ3JvdW5kXG4gICAgICBzd2l0Y2ggKGZnQ29sb3JNb2RlKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgIGlmIChjZWxsLmlzQm9sZCgpICYmIGZnIDwgOCAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzKSB7XG4gICAgICAgICAgICBmZyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KGNoYXJFbGVtZW50LCByZXNvbHZlZEJnLCBjb2xvcnMuYW5zaVtmZ10sIGNlbGwsIGJnT3ZlcnJpZGUsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChgeHRlcm0tZmctJHtmZ31gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBjaGFubmVscy50b0NvbG9yKFxuICAgICAgICAgICAgKGZnID4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoZmcgPj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChmZyAgICAgICkgJiAweEZGXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KGNoYXJFbGVtZW50LCByZXNvbHZlZEJnLCBjb2xvciwgY2VsbCwgYmdPdmVycmlkZSwgZmdPdmVycmlkZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFN0eWxlKGNoYXJFbGVtZW50LCBgY29sb3I6IyR7cGFkU3RhcnQoZmcudG9TdHJpbmcoMTYpLCAnMCcsIDYpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCF0aGlzLl9hcHBseU1pbmltdW1Db250cmFzdChjaGFyRWxlbWVudCwgcmVzb2x2ZWRCZywgY29sb3JzLmZvcmVncm91bmQsIGNlbGwsIGJnT3ZlcnJpZGUsIGZnT3ZlcnJpZGUpKSB7XG4gICAgICAgICAgICBpZiAoaXNJbnZlcnNlKSB7XG4gICAgICAgICAgICAgIGNsYXNzZXMucHVzaChgeHRlcm0tZmctJHtJTlZFUlRFRF9ERUZBVUxUX0NPTE9SfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgQ1NTIGNsYXNzZXNcbiAgICAgIC8vIHNsaWdodGx5IGZhc3RlciB0aGFuIHVzaW5nIGNsYXNzTGlzdCBieSBvbWl0dGluZ1xuICAgICAgLy8gY2hlY2tzIGZvciBkb3VibGVkIGVudHJpZXMgKGNvZGUgYWJvdmUgc2hvdWxkIG5vdCBoYXZlIGRvdWJsZXRzKVxuICAgICAgaWYgKGNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYXJFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbignICcpO1xuICAgICAgICBjbGFzc2VzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIGV4Y2x1ZGUgY29uZGl0aW9ucyBmb3IgY2VsbCBtZXJnaW5nIC0gbmV2ZXIgbWVyZ2UgdGhlc2VcbiAgICAgIGlmICghaXNDdXJzb3JDZWxsICYmICFpc0pvaW5lZCAmJiAhaXNEZWNvcmF0ZWQpIHtcbiAgICAgICAgY2VsbEFtb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhckVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgfVxuICAgICAgLy8gYXBwbHkgbGV0dGVyLXNwYWNpbmcgcnVsZVxuICAgICAgaWYgKHNwYWNpbmcgIT09IHRoaXMuZGVmYXVsdFNwYWNpbmcpIHtcbiAgICAgICAgY2hhckVsZW1lbnQuc3R5bGUubGV0dGVyU3BhY2luZyA9IGAke3NwYWNpbmd9cHhgO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50cy5wdXNoKGNoYXJFbGVtZW50KTtcbiAgICAgIHggPSBsYXN0Q2hhclg7XG4gICAgfVxuXG4gICAgLy8gcG9zdGZpeCB0ZXh0IG9mIGxhc3QgbWVyZ2VkIHNwYW5cbiAgICBpZiAoY2hhckVsZW1lbnQgJiYgY2VsbEFtb3VudCkge1xuICAgICAgY2hhckVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5TWluaW11bUNvbnRyYXN0KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBiZzogSUNvbG9yLCBmZzogSUNvbG9yLCBjZWxsOiBJQ2VsbERhdGEsIGJnT3ZlcnJpZGU6IElDb2xvciB8IHVuZGVmaW5lZCwgZmdPdmVycmlkZTogSUNvbG9yIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWluaW11bUNvbnRyYXN0UmF0aW8gPT09IDEgfHwgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNlbGwuZ2V0Q29kZSgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSBnZXQgZnJvbSBjYWNoZSBmaXJzdCwgb25seSB1c2UgdGhlIGNhY2hlIHdoZW4gdGhlcmUgYXJlIG5vIGRlY29yYXRpb24gb3ZlcnJpZGVzXG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9nZXRDb250cmFzdENhY2hlKGNlbGwpO1xuICAgIGxldCBhZGp1c3RlZENvbG9yOiBJQ29sb3IgfCB1bmRlZmluZWQgfCBudWxsID0gdW5kZWZpbmVkO1xuICAgIGlmICghYmdPdmVycmlkZSAmJiAhZmdPdmVycmlkZSkge1xuICAgICAgYWRqdXN0ZWRDb2xvciA9IGNhY2hlLmdldENvbG9yKGJnLnJnYmEsIGZnLnJnYmEpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc3RvcmUgaW4gY2FjaGVcbiAgICBpZiAoYWRqdXN0ZWRDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEaW0gY2VsbHMgb25seSByZXF1aXJlIGhhbGYgdGhlIGNvbnRyYXN0LCBvdGhlcndpc2UgdGhleSB3b3VsZG4ndCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbVxuICAgICAgLy8gbm9uLWRpbSBjZWxsc1xuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLm1pbmltdW1Db250cmFzdFJhdGlvIC8gKGNlbGwuaXNEaW0oKSA/IDIgOiAxKTtcbiAgICAgIGFkanVzdGVkQ29sb3IgPSBjb2xvci5lbnN1cmVDb250cmFzdFJhdGlvKGJnT3ZlcnJpZGUgfHwgYmcsIGZnT3ZlcnJpZGUgfHwgZmcsIHJhdGlvKTtcbiAgICAgIGNhY2hlLnNldENvbG9yKChiZ092ZXJyaWRlIHx8IGJnKS5yZ2JhLCAoZmdPdmVycmlkZSB8fCBmZykucmdiYSwgYWRqdXN0ZWRDb2xvciA/PyBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoYWRqdXN0ZWRDb2xvcikge1xuICAgICAgdGhpcy5fYWRkU3R5bGUoZWxlbWVudCwgYGNvbG9yOiR7YWRqdXN0ZWRDb2xvci5jc3N9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb250cmFzdENhY2hlKGNlbGw6IElDZWxsRGF0YSk6IElDb2xvckNvbnRyYXN0Q2FjaGUge1xuICAgIGlmIChjZWxsLmlzRGltKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmhhbGZDb250cmFzdENhY2hlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jb250cmFzdENhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU3R5bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0eWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKSB8fCAnJ30ke3N0eWxlfTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzQ2VsbEluU2VsZWN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9zZWxlY3Rpb25FbmQ7XG4gICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBpZiAoc3RhcnRbMF0gPD0gZW5kWzBdKSB7XG4gICAgICAgIHJldHVybiB4ID49IHN0YXJ0WzBdICYmIHkgPj0gc3RhcnRbMV0gJiZcbiAgICAgICAgICB4IDwgZW5kWzBdICYmIHkgPD0gZW5kWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHggPCBzdGFydFswXSAmJiB5ID49IHN0YXJ0WzFdICYmXG4gICAgICAgIHggPj0gZW5kWzBdICYmIHkgPD0gZW5kWzFdO1xuICAgIH1cbiAgICByZXR1cm4gKHkgPiBzdGFydFsxXSAmJiB5IDwgZW5kWzFdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPT09IGVuZFsxXSAmJiB5ID09PSBzdGFydFsxXSAmJiB4ID49IHN0YXJ0WzBdICYmIHggPCBlbmRbMF0pIHx8XG4gICAgICAgIChzdGFydFsxXSA8IGVuZFsxXSAmJiB5ID09PSBlbmRbMV0gJiYgeCA8IGVuZFswXSkgfHxcbiAgICAgICAgKHN0YXJ0WzFdIDwgZW5kWzFdICYmIHkgPT09IHN0YXJ0WzFdICYmIHggPj0gc3RhcnRbMF0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhZFN0YXJ0KHRleHQ6IHN0cmluZywgcGFkQ2hhcjogc3RyaW5nLCBsZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIHdoaWxlICh0ZXh0Lmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIHRleHQgPSBwYWRDaGFyICsgdGV4dDtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRm9udFdlaWdodCB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cblxuZXhwb3J0IGNvbnN0IGVudW0gV2lkdGhDYWNoZVNldHRpbmdzIHtcbiAgLyoqIHNlbnRpbmVsIGZvciB1bnNldCB2YWx1ZXMgaW4gZmxhdCBjYWNoZSAqL1xuICBGTEFUX1VOU0VUID0gLTk5OTksXG4gIC8qKiBzaXplIG9mIGZsYXQgY2FjaGUsIHNpemUtMSBlcXVhbHMgaGlnaGVzdCBjb2RlcG9pbnQgaGFuZGxlZCBieSBmbGF0ICovXG4gIEZMQVRfU0laRSA9IDI1NixcbiAgLyoqIGNoYXIgcmVwZWF0IGZvciBtZWFzdXJpbmcgKi9cbiAgUkVQRUFUID0gMzJcbn1cblxuXG5jb25zdCBlbnVtIEZvbnRWYXJpYW50IHtcbiAgUkVHVUxBUiA9IDAsXG4gIEJPTEQgPSAxLFxuICBJVEFMSUMgPSAyLFxuICBCT0xEX0lUQUxJQyA9IDNcbn1cblxuXG5leHBvcnQgY2xhc3MgV2lkdGhDYWNoZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgLy8gZmxhdCBjYWNoZSBmb3IgcmVndWxhciB2YXJpYW50IHVwIHRvIENhY2hlU2V0dGluZ3MuRkxBVF9TSVpFXG4gIC8vIE5PVEU6IH40eCBmYXN0ZXIgYWNjZXNzIHRoYW4gaG9sZXkgKHNlcnZpbmcgPj44MCUgb2YgdGVybWluYWwgY29udGVudClcbiAgLy8gICAgICAgSXQgaGFzIGEgc21hbGwgbWVtb3J5IGZvb3RwcmludCAob25seSAxTUIgZm9yIGZ1bGwgQk1QIGNhY2hpbmcpLFxuICAvLyAgICAgICBzdGlsbCB0aGUgc3dlZXQgc3BvdCBpcyBub3QgcmVhY2hlZCBiZWZvcmUgdG91Y2hpbmcgMzJrIGRpZmZlcmVudCBjb2RlcG9pbnRzLFxuICAvLyAgICAgICB0aHVzIHdlIHN0b3JlIHRoZSByZW1haW5pbmcgPDwyMCUgb2YgdGVybWluYWwgZGF0YSBpbiBhIGhvbGV5IHN0cnVjdHVyZS5cbiAgcHJvdGVjdGVkIF9mbGF0ID0gbmV3IEZsb2F0MzJBcnJheShXaWR0aENhY2hlU2V0dGluZ3MuRkxBVF9TSVpFKTtcblxuICAvLyBob2xleSBjYWNoZSBmb3IgYm9sZCwgaXRhbGljIGFuZCBib2xkJml0YWxpYyBmb3IgYW55IHN0cmluZ1xuICAvLyBGSVhNRTogY2FuIGdyb3cgcmVhbGx5IGJpZyBvdmVyIHRpbWUgKH44LjUgTUIgZm9yIGZ1bGwgQk1QIGNhY2hpbmcpLFxuICAvLyAgICAgICAgc28gYSBzaGFyZWQgQVBJIGFjcm9zcyB0ZXJtaW5hbHMgaXMgbmVlZGVkXG4gIHByb3RlY3RlZCBfaG9sZXk6IE1hcDxzdHJpbmcsIG51bWJlcj4gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfZm9udCA9ICcnO1xuICBwcml2YXRlIF9mb250U2l6ZSA9IDA7XG4gIHByaXZhdGUgX3dlaWdodDogRm9udFdlaWdodCA9ICdub3JtYWwnO1xuICBwcml2YXRlIF93ZWlnaHRCb2xkOiBGb250V2VpZ2h0ID0gJ2JvbGQnO1xuICBwcml2YXRlIF9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIF9tZWFzdXJlRWxlbWVudHM6IEhUTUxTcGFuRWxlbWVudFtdID0gW107XG5cbiAgY29uc3RydWN0b3IoX2RvY3VtZW50OiBEb2N1bWVudCwgX2hlbHBlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jb250YWluZXIgPSBfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXdpZHRoLWNhY2hlLW1lYXN1cmUtY29udGFpbmVyJyk7XG4gICAgdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIC8vIFNQIHNob3VsZCBzdGFjayBpbiBzcGFuc1xuICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gJ3ByZSc7XG4gICAgLy8gYXZvaWQgdW5kZXJjdXRzIGluIG5vbi1tb25vc3BhY2UgZm9udHMgZnJvbSBrZXJuaW5nXG4gICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmZvbnRLZXJuaW5nID0gJ25vbmUnO1xuXG4gICAgY29uc3QgcmVndWxhciA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgcmVndWxhci5jbGFzc0xpc3QuYWRkKCd4dGVybS1jaGFyLW1lYXN1cmUtZWxlbWVudCcpO1xuXG4gICAgY29uc3QgYm9sZCA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgYm9sZC5jbGFzc0xpc3QuYWRkKCd4dGVybS1jaGFyLW1lYXN1cmUtZWxlbWVudCcpO1xuICAgIGJvbGQuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcblxuICAgIGNvbnN0IGl0YWxpYyA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgaXRhbGljLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50Jyk7XG4gICAgaXRhbGljLnN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnO1xuXG4gICAgY29uc3QgYm9sZEl0YWxpYyA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgYm9sZEl0YWxpYy5jbGFzc0xpc3QuYWRkKCd4dGVybS1jaGFyLW1lYXN1cmUtZWxlbWVudCcpO1xuICAgIGJvbGRJdGFsaWMuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICBib2xkSXRhbGljLnN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnO1xuXG4gICAgLy8gTk9URTogbXVzdCBiZSBpbiBvcmRlciBvZiBGb250VmFyaWFudFxuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50cyA9IFtyZWd1bGFyLCBib2xkLCBpdGFsaWMsIGJvbGRJdGFsaWNdO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChyZWd1bGFyKTtcbiAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoYm9sZCk7XG4gICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGl0YWxpYyk7XG4gICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGJvbGRJdGFsaWMpO1xuXG4gICAgX2hlbHBlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuXG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpOyAgICAgICAgICAgLy8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gRE9NXG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnRzLmxlbmd0aCA9IDA7ICAgLy8gcmVsZWFzZSBlbGVtZW50IHJlZnNcbiAgICB0aGlzLl9ob2xleSA9IHVuZGVmaW5lZDsgICAgICAgICAgICAvLyBmcmVlIGNhY2hlIG1lbW9yeSB2aWEgR0NcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgd2lkdGggY2FjaGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZmxhdC5maWxsKFdpZHRoQ2FjaGVTZXR0aW5ncy5GTEFUX1VOU0VUKTtcbiAgICAvLyAuY2xlYXIoKSBoYXMgc29tZSBvdmVyaGVhZCwgcmUtYXNzaWduIGluc3RlYWQgKD4zIHRpbWVzIGZhc3RlcilcbiAgICB0aGlzLl9ob2xleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBmb250IGZvciBtZWFzdXJpbmcuXG4gICAqIE11c3QgYmUgY2FsbGVkIGZvciBhbnkgY2hhbmdlcyBvbiBmb250IHNldHRpbmdzLlxuICAgKiBBbHNvIGNsZWFycyB0aGUgY2FjaGUuXG4gICAqL1xuICBwdWJsaWMgc2V0Rm9udChmb250OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIHdlaWdodDogRm9udFdlaWdodCwgd2VpZ2h0Qm9sZDogRm9udFdlaWdodCk6IHZvaWQge1xuICAgIC8vIHNraXAgaWYgbm90aGluZyBjaGFuZ2VkXG4gICAgaWYgKGZvbnQgPT09IHRoaXMuX2ZvbnRcbiAgICAgICYmIGZvbnRTaXplID09PSB0aGlzLl9mb250U2l6ZVxuICAgICAgJiYgd2VpZ2h0ID09PSB0aGlzLl93ZWlnaHRcbiAgICAgICYmIHdlaWdodEJvbGQgPT09IHRoaXMuX3dlaWdodEJvbGRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250ID0gZm9udDtcbiAgICB0aGlzLl9mb250U2l6ZSA9IGZvbnRTaXplO1xuICAgIHRoaXMuX3dlaWdodCA9IHdlaWdodDtcbiAgICB0aGlzLl93ZWlnaHRCb2xkID0gd2VpZ2h0Qm9sZDtcblxuICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5mb250RmFtaWx5ID0gdGhpcy5fZm9udDtcbiAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZm9udFNpemUgPSBgJHt0aGlzLl9mb250U2l6ZX1weGA7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnRzW0ZvbnRWYXJpYW50LlJFR1VMQVJdLnN0eWxlLmZvbnRXZWlnaHQgPSBgJHt3ZWlnaHR9YDtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudHNbRm9udFZhcmlhbnQuQk9MRF0uc3R5bGUuZm9udFdlaWdodCA9IGAke3dlaWdodEJvbGR9YDtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudHNbRm9udFZhcmlhbnQuSVRBTElDXS5zdHlsZS5mb250V2VpZ2h0ID0gYCR7d2VpZ2h0fWA7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnRzW0ZvbnRWYXJpYW50LkJPTERfSVRBTElDXS5zdHlsZS5mb250V2VpZ2h0ID0gYCR7d2VpZ2h0Qm9sZH1gO1xuXG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVuZGVyIHdpZHRoIGZvciBjZWxsIGNvbnRlbnQgYGNgIHdpdGggY3VycmVudCBmb250IHNldHRpbmdzLlxuICAgKiBgdmFyaWFudGAgZGVub3RlcyB0aGUgZm9udCB2YXJpYW50IHRvIGJlIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0KGM6IHN0cmluZywgYm9sZDogYm9vbGVhbiB8IG51bWJlciwgaXRhbGljOiBib29sZWFuIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgY3AgPSAwO1xuICAgIGlmICghYm9sZCAmJiAhaXRhbGljICYmIGMubGVuZ3RoID09PSAxICYmIChjcCA9IGMuY2hhckNvZGVBdCgwKSkgPCBXaWR0aENhY2hlU2V0dGluZ3MuRkxBVF9TSVpFKSB7XG4gICAgICBpZiAodGhpcy5fZmxhdFtjcF0gIT09IFdpZHRoQ2FjaGVTZXR0aW5ncy5GTEFUX1VOU0VUKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mbGF0W2NwXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fbWVhc3VyZShjLCAwKTtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fZmxhdFtjcF0gPSB3aWR0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG4gICAgbGV0IGtleSA9IGM7XG4gICAgaWYgKGJvbGQpIGtleSArPSAnQic7XG4gICAgaWYgKGl0YWxpYykga2V5ICs9ICdJJztcbiAgICBsZXQgd2lkdGggPSB0aGlzLl9ob2xleSEuZ2V0KGtleSk7XG4gICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCB2YXJpYW50ID0gMDtcbiAgICAgIGlmIChib2xkKSB2YXJpYW50IHw9IEZvbnRWYXJpYW50LkJPTEQ7XG4gICAgICBpZiAoaXRhbGljKSB2YXJpYW50IHw9IEZvbnRWYXJpYW50LklUQUxJQztcbiAgICAgIHdpZHRoID0gdGhpcy5fbWVhc3VyZShjLCB2YXJpYW50KTtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5faG9sZXkhLnNldChrZXksIHdpZHRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdpZHRoO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9tZWFzdXJlKGM6IHN0cmluZywgdmFyaWFudDogRm9udFZhcmlhbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IGVsID0gdGhpcy5fbWVhc3VyZUVsZW1lbnRzW3ZhcmlhbnRdO1xuICAgIGVsLnRleHRDb250ZW50ID0gYy5yZXBlYXQoV2lkdGhDYWNoZVNldHRpbmdzLlJFUEVBVCk7XG4gICAgcmV0dXJuIGVsLm9mZnNldFdpZHRoIC8gV2lkdGhDYWNoZVNldHRpbmdzLlJFUEVBVDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBpc0ZpcmVmb3gsIGlzTGVnYWN5RWRnZSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5cbmV4cG9ydCBjb25zdCBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SID0gMjU3O1xuXG5leHBvcnQgY29uc3QgRElNX09QQUNJVFkgPSAwLjU7XG4vLyBUaGUgdGV4dCBiYXNlbGluZSBpcyBzZXQgY29uZGl0aW9uYWxseSBieSBicm93c2VyLiBVc2luZyAnaWRlb2dyYXBoaWMnIGZvciBGaXJlZm94IG9yIExlZ2FjeSBFZGdlXG4vLyB3b3VsZCByZXN1bHQgaW4gdHJ1bmNhdGVkIHRleHQgKElzc3VlIDMzNTMpLiBVc2luZyAnYm90dG9tJyBmb3IgQ2hyb21lIHdvdWxkIHJlc3VsdCBpbiBzbGlnaHRseVxuLy8gdW5hbGlnbmVkIFBvd2VybGluZSBmb250cyAoUFIgMzM1NiNpc3N1ZWNvbW1lbnQtODUwOTI4MTc5KS5cbmV4cG9ydCBjb25zdCBURVhUX0JBU0VMSU5FOiBDYW52YXNUZXh0QmFzZWxpbmUgPSBpc0ZpcmVmb3ggfHwgaXNMZWdhY3lFZGdlID8gJ2JvdHRvbScgOiAnaWRlb2dyYXBoaWMnO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGltZW5zaW9ucywgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmRmFsc3k8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQgfCBudWxsKTogVCB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlIG11c3Qgbm90IGJlIGZhbHN5Jyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAvLyBPbmx5IHJldHVybiB0cnVlIGZvciBQb3dlcmxpbmUgc3ltYm9scyB3aGljaCByZXF1aXJlXG4gIC8vIGRpZmZlcmVudCBwYWRkaW5nIGFuZCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBtaW5pbXVtIGNvbnRyYXN0XG4gIC8vIHJhdGlvIHN0YW5kYXJkc1xuICByZXR1cm4gMHhFMEE0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEQ2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTBCMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RTBCNztcbn1cblxuZnVuY3Rpb24gaXNOZXJkRm9udEdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAweEUwMDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEY4RkY7XG59XG5cbmZ1bmN0aW9uIGlzQm94T3JCbG9ja0dseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAweDI1MDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweDI1OUY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vtb2ppKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29kZXBvaW50ID49IDB4MUY2MDAgJiYgY29kZXBvaW50IDw9IDB4MUY2NEYgfHwgLy8gRW1vdGljb25zXG4gICAgY29kZXBvaW50ID49IDB4MUYzMDAgJiYgY29kZXBvaW50IDw9IDB4MUY1RkYgfHwgLy8gTWlzYyBTeW1ib2xzIGFuZCBQaWN0b2dyYXBoc1xuICAgIGNvZGVwb2ludCA+PSAweDFGNjgwICYmIGNvZGVwb2ludCA8PSAweDFGNkZGIHx8IC8vIFRyYW5zcG9ydCBhbmQgTWFwXG4gICAgY29kZXBvaW50ID49IDB4MjYwMCAgJiYgY29kZXBvaW50IDw9IDB4MjZGRiAgfHwgLy8gTWlzYyBzeW1ib2xzXG4gICAgY29kZXBvaW50ID49IDB4MjcwMCAgJiYgY29kZXBvaW50IDw9IDB4MjdCRiAgfHwgLy8gRGluZ2JhdHNcbiAgICBjb2RlcG9pbnQgPj0gMHhGRTAwICAmJiBjb2RlcG9pbnQgPD0gMHhGRTBGICB8fCAvLyBWYXJpYXRpb24gU2VsZWN0b3JzXG4gICAgY29kZXBvaW50ID49IDB4MUY5MDAgJiYgY29kZXBvaW50IDw9IDB4MUY5RkYgfHwgLy8gU3VwcGxlbWVudGFsIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUYxRTYgJiYgY29kZXBvaW50IDw9IDB4MUYxRkZcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93UmVzY2FsaW5nKGNvZGVwb2ludDogbnVtYmVyIHwgdW5kZWZpbmVkLCB3aWR0aDogbnVtYmVyLCBnbHlwaFNpemVYOiBudW1iZXIsIGRldmljZUNlbGxXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgLy8gSXMgc2luZ2xlIGNlbGwgd2lkdGhcbiAgICB3aWR0aCA9PT0gMSAmJlxuICAgIC8vIEdseXBoIGV4Y2VlZHMgY2VsbCBib3VuZHMsIGFkZCA1MCUgdG8gYXZvaWQgaHVydGluZyByZWFkYWJpbGl0eSBieSByZXNjYWxpbmcgZ2x5cGhzIHRoYXRcbiAgICAvLyBiYXJlbHkgb3ZlcmxhcFxuICAgIGdseXBoU2l6ZVggPiBNYXRoLmNlaWwoZGV2aWNlQ2VsbFdpZHRoICogMS41KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgYXNjaWlcbiAgICBjb2RlcG9pbnQgIT09IHVuZGVmaW5lZCAmJiBjb2RlcG9pbnQgPiAweEZGICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBlbW9qaVxuICAgICFpc0Vtb2ppKGNvZGVwb2ludCkgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIHBvd2VybGluZSBvciBuZXJkIGZvbnRzXG4gICAgIWlzUG93ZXJsaW5lR2x5cGgoY29kZXBvaW50KSAmJiAhaXNOZXJkRm9udEdseXBoKGNvZGVwb2ludClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcihjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpIHx8IGlzQm94T3JCbG9ja0dseXBoKGNvZGVwb2ludCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk6IElSZW5kZXJEaW1lbnNpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBjc3M6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKVxuICAgIH0sXG4gICAgZGV2aWNlOiB7XG4gICAgICBjYW52YXM6IGNyZWF0ZURpbWVuc2lvbigpLFxuICAgICAgY2VsbDogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjaGFyOiB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGltZW5zaW9uKCk6IElEaW1lbnNpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVOZXh0VmFyaWFudE9mZnNldChjZWxsV2lkdGg6IG51bWJlciwgbGluZVdpZHRoOiBudW1iZXIsIGN1cnJlbnRPZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gKGNlbGxXaWR0aCAtIChNYXRoLnJvdW5kKGxpbmVXaWR0aCkgKiAyIC0gY3VycmVudE9mZnNldCkpICUgKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuY2xhc3MgU2VsZWN0aW9uUmVuZGVyTW9kZWwgaW1wbGVtZW50cyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwge1xuICBwdWJsaWMgaGFzU2VsZWN0aW9uITogYm9vbGVhbjtcbiAgcHVibGljIGNvbHVtblNlbGVjdE1vZGUhOiBib29sZWFuO1xuICBwdWJsaWMgdmlld3BvcnRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0RW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0Q2FwcGVkRW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgc3RhcnRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBlbmRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IDA7XG4gICAgdGhpcy5zdGFydENvbCA9IDA7XG4gICAgdGhpcy5lbmRDb2wgPSAwO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKHRlcm1pbmFsOiBJVGVybWluYWwsIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICAvLyBTZWxlY3Rpb24gZG9lcyBub3QgZXhpc3RcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQgfHwgKHN0YXJ0WzBdID09PSBlbmRbMF0gJiYgc3RhcnRbMV0gPT09IGVuZFsxXSkpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2xhdGUgZnJvbSBidWZmZXIgcG9zaXRpb24gdG8gdmlld3BvcnQgcG9zaXRpb25cbiAgICBjb25zdCB2aWV3cG9ydFkgPSB0ZXJtaW5hbC5idWZmZXJzLmFjdGl2ZS55ZGlzcDtcbiAgICBjb25zdCB2aWV3cG9ydFN0YXJ0Um93ID0gc3RhcnRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRFbmRSb3cgPSBlbmRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IE1hdGgubWF4KHZpZXdwb3J0U3RhcnRSb3csIDApO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gTWF0aC5taW4odmlld3BvcnRFbmRSb3csIHRlcm1pbmFsLnJvd3MgLSAxKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gZHJhdyB0aGUgc2VsZWN0aW9uXG4gICAgaWYgKHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPj0gdGVybWluYWwucm93cyB8fCB2aWV3cG9ydENhcHBlZEVuZFJvdyA8IDApIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5jb2x1bW5TZWxlY3RNb2RlID0gY29sdW1uU2VsZWN0TW9kZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSB2aWV3cG9ydFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSB2aWV3cG9ydEVuZFJvdztcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3cgPSB2aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB0aGlzLnN0YXJ0Q29sID0gc3RhcnRbMF07XG4gICAgdGhpcy5lbmRDb2wgPSBlbmRbMF07XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsU2VsZWN0ZWQodGVybWluYWw6IFRlcm1pbmFsLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgeSAtPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICBpZiAodGhpcy5jb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydENvbCA8PSB0aGlzLmVuZENvbCkge1xuICAgICAgICByZXR1cm4geCA+PSB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgICAgeCA8IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICAgIH1cbiAgICAgIHJldHVybiB4IDwgdGhpcy5zdGFydENvbCAmJiB5ID49IHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyAmJlxuICAgICAgICB4ID49IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB9XG4gICAgcmV0dXJuICh5ID4gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHkgPCB0aGlzLnZpZXdwb3J0RW5kUm93KSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sICYmIHggPCB0aGlzLmVuZENvbCkgfHxcbiAgICAgICh0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPCB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHggPj0gdGhpcy5zdGFydENvbCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsKCk6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzZWxlY3Rpb24gd2l0aGluIHRoZSBidWZmZXIuIFRoaXMgbW9kZWwgb25seSBjYXJlcyBhYm91dCBjb2x1bW5cbiAqIGFuZCByb3cgY29vcmRpbmF0ZXMsIG5vdCB3aWRlIGNoYXJhY3RlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlbGVjdCBhbGwgaXMgY3VycmVudGx5IGFjdGl2ZS5cbiAgICovXG4gIHB1YmxpYyBpc1NlbGVjdEFsbEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW1hbCBsZW5ndGggb2YgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBzdGFydCBwb3NpdGlvbi4gV2hlbiBkb3VibGVcbiAgICogY2xpY2tpbmcgb24gYSB3b3JkLCB0aGUgd29yZCB3aWxsIGJlIHNlbGVjdGVkIHdoaWNoIG1ha2VzIHRoZSBzZWxlY3Rpb25cbiAgICogc3RhcnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3b3JkIGFuZCBtYWtlcyB0aGlzIHZhcmlhYmxlIHRoZSBsZW5ndGguXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0aW9uU3RhcnRMZW5ndGg6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBbeCwgeV0gcG9zaXRpb24gdGhlIHNlbGVjdGlvbiBzdGFydHMgYXQuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0aW9uU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBbeCwgeV0gcG9zaXRpb24gdGhlIHNlbGVjdGlvbiBlbmRzIGF0LlxuICAgKi9cbiAgcHVibGljIHNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZVxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc1NlbGVjdEFsbEFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaW5hbCBzZWxlY3Rpb24gc3RhcnQsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gc2VsZWN0IGFsbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmluYWxTZWxlY3Rpb25TdGFydCgpOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdEFsbEFjdGl2ZSkge1xuICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uRW5kIHx8ICF0aGlzLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCgpID8gdGhpcy5zZWxlY3Rpb25FbmQgOiB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaW5hbCBzZWxlY3Rpb24gZW5kLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIHNlbGVjdCBhbGwsIGRvdWJsZSBjbGlja1xuICAgKiB3b3JkIHNlbGVjdGlvbiBhbmQgdHJpcGxlIGNsaWNrIGxpbmUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBmaW5hbFNlbGVjdGlvbkVuZCgpOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdEFsbEFjdGl2ZSkge1xuICAgICAgcmV0dXJuIFt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlICsgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgc2VsZWN0aW9uIHN0YXJ0ICsgbGVuZ3RoIGlmIHRoZSBlbmQgZG9lc24ndCBleGlzdCBvciB0aGV5J3JlIHJldmVyc2VkXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvbkVuZCB8fCB0aGlzLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkpIHtcbiAgICAgIGNvbnN0IHN0YXJ0UGx1c0xlbmd0aCA9IHRoaXMuc2VsZWN0aW9uU3RhcnRbMF0gKyB0aGlzLnNlbGVjdGlvblN0YXJ0TGVuZ3RoO1xuICAgICAgaWYgKHN0YXJ0UGx1c0xlbmd0aCA+IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgICAvLyBFbnN1cmUgdGhlIHRyYWlsaW5nIEVPTCBpc24ndCBpbmNsdWRlZCB3aGVuIHRoZSBzZWxlY3Rpb24gZW5kcyBvbiB0aGUgcmlnaHQgZWRnZVxuICAgICAgICBpZiAoc3RhcnRQbHVzTGVuZ3RoICUgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0gKyBNYXRoLmZsb29yKHN0YXJ0UGx1c0xlbmd0aCAvIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3N0YXJ0UGx1c0xlbmd0aCAlIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSArIE1hdGguZmxvb3Ioc3RhcnRQbHVzTGVuZ3RoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW3N0YXJ0UGx1c0xlbmd0aCwgdGhpcy5zZWxlY3Rpb25TdGFydFsxXV07XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoZSB0aGUgd29yZC9saW5lIGlzIHNlbGVjdGVkIGFmdGVyIGEgZG91YmxlL3RyaXBsZSBjbGlja1xuICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0TGVuZ3RoKSB7XG4gICAgICAvLyBTZWxlY3QgdGhlIGxhcmdlciBvZiB0aGUgdHdvIHdoZW4gc3RhcnQgYW5kIGVuZCBhcmUgb24gdGhlIHNhbWUgbGluZVxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRW5kWzFdID09PSB0aGlzLnNlbGVjdGlvblN0YXJ0WzFdKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIHdob2xlIHdyYXBwZWQgd29yZC9saW5lIHNlbGVjdGVkIGlmIHRoZSBjb250ZW50IHdyYXBzIG11bHRpcGxlIGxpbmVzXG4gICAgICAgIGNvbnN0IHN0YXJ0UGx1c0xlbmd0aCA9IHRoaXMuc2VsZWN0aW9uU3RhcnRbMF0gKyB0aGlzLnNlbGVjdGlvblN0YXJ0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RhcnRQbHVzTGVuZ3RoID4gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgICAgcmV0dXJuIFtzdGFydFBsdXNMZW5ndGggJSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0gKyBNYXRoLmZsb29yKHN0YXJ0UGx1c0xlbmd0aCAvIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbTWF0aC5tYXgoc3RhcnRQbHVzTGVuZ3RoLCB0aGlzLnNlbGVjdGlvbkVuZFswXSksIHRoaXMuc2VsZWN0aW9uRW5kWzFdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQgYXJlIHJldmVyc2VkLlxuICAgKi9cbiAgcHVibGljIGFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLnNlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0WzFdID4gZW5kWzFdIHx8IChzdGFydFsxXSA9PT0gZW5kWzFdICYmIHN0YXJ0WzBdID4gZW5kWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGJ1ZmZlciBiZWluZyB0cmltbWVkLCBhZGp1c3QgdGhlIHNlbGVjdGlvbiBwb3NpdGlvbi5cbiAgICogQHBhcmFtIGFtb3VudCBUaGUgYW1vdW50IHRoZSBidWZmZXIgaXMgYmVpbmcgdHJpbW1lZC5cbiAgICogQHJldHVybnMgV2hldGhlciBhIHJlZnJlc2ggaXMgbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZVRyaW0oYW1vdW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBBZGp1c3QgdGhlIHNlbGVjdGlvbiBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdHJpbW1lZCBhbW91bnQuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0gLT0gYW1vdW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmQpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uRW5kWzFdIC09IGFtb3VudDtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIGhhcyBtb3ZlZCBvZmYgdGhlIGJ1ZmZlciwgY2xlYXIgaXQuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRW5kICYmIHRoaXMuc2VsZWN0aW9uRW5kWzFdIDwgMCkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBzdGFydCBpcyB0cmltbWVkLCBlbnN1cmUgdGhlIHN0YXJ0IGNvbHVtbiBpcyAwLlxuICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ICYmIHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0gPCAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0WzFdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElDaGFyU2l6ZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZXhwb3J0IGNsYXNzIENoYXJTaXplU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ2hhclNpemVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyID0gMDtcbiAgcHVibGljIGhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbWVhc3VyZVN0cmF0ZWd5OiBJTWVhc3VyZVN0cmF0ZWd5O1xuXG4gIHB1YmxpYyBnZXQgaGFzVmFsaWRTaXplKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy53aWR0aCA+IDAgJiYgdGhpcy5oZWlnaHQgPiAwOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFyU2l6ZUNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhclNpemVDaGFuZ2UgPSB0aGlzLl9vbkNoYXJTaXplQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbWVhc3VyZVN0cmF0ZWd5ID0gdGhpcy5yZWdpc3RlcihuZXcgVGV4dE1ldHJpY3NNZWFzdXJlU3RyYXRlZ3kodGhpcy5fb3B0aW9uc1NlcnZpY2UpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuX21lYXN1cmVTdHJhdGVneSA9IHRoaXMucmVnaXN0ZXIobmV3IERvbU1lYXN1cmVTdHJhdGVneShkb2N1bWVudCwgcGFyZW50RWxlbWVudCwgdGhpcy5fb3B0aW9uc1NlcnZpY2UpKTtcbiAgICB9XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKFsnZm9udEZhbWlseScsICdmb250U2l6ZSddLCAoKSA9PiB0aGlzLm1lYXN1cmUoKSkpO1xuICB9XG5cbiAgcHVibGljIG1lYXN1cmUoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fbWVhc3VyZVN0cmF0ZWd5Lm1lYXN1cmUoKTtcbiAgICBpZiAocmVzdWx0LndpZHRoICE9PSB0aGlzLndpZHRoIHx8IHJlc3VsdC5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLndpZHRoID0gcmVzdWx0LndpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSByZXN1bHQuaGVpZ2h0O1xuICAgICAgdGhpcy5fb25DaGFyU2l6ZUNoYW5nZS5maXJlKCk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBJTWVhc3VyZVN0cmF0ZWd5IHtcbiAgbWVhc3VyZSgpOiBSZWFkb25seTxJTWVhc3VyZVJlc3VsdD47XG59XG5cbmludGVyZmFjZSBJTWVhc3VyZVJlc3VsdCB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5jb25zdCBlbnVtIERvbU1lYXN1cmVTdHJhdGVneUNvbnN0YW50cyB7XG4gIFJFUEVBVCA9IDMyXG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VNZWFzdXJlU3RhdGVneSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTWVhc3VyZVN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIF9yZXN1bHQ6IElNZWFzdXJlUmVzdWx0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG5cbiAgcHJvdGVjdGVkIF92YWxpZGF0ZUFuZFNldCh3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLCBoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIElmIHZhbHVlcyBhcmUgMCB0aGVuIHRoZSBlbGVtZW50IGlzIGxpa2VseSBjdXJyZW50bHkgZGlzcGxheTpub25lLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZFxuICAgIC8vIHJldGFpbiB0aGUgcHJldmlvdXMgdmFsdWUuXG4gICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgd2lkdGggPiAwICYmIGhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGhlaWdodCA+IDApIHtcbiAgICAgIHRoaXMuX3Jlc3VsdC53aWR0aCA9IHdpZHRoO1xuICAgICAgdGhpcy5fcmVzdWx0LmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgbWVhc3VyZSgpOiBSZWFkb25seTxJTWVhc3VyZVJlc3VsdD47XG59XG5cbmNsYXNzIERvbU1lYXN1cmVTdHJhdGVneSBleHRlbmRzIEJhc2VNZWFzdXJlU3RhdGVneSB7XG4gIHByaXZhdGUgX21lYXN1cmVFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50Jyk7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVycucmVwZWF0KERvbU1lYXN1cmVTdHJhdGVneUNvbnN0YW50cy5SRVBFQVQpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLndoaXRlU3BhY2UgPSAncHJlJztcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250S2VybmluZyA9ICdub25lJztcbiAgICB0aGlzLl9wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX21lYXN1cmVFbGVtZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBtZWFzdXJlKCk6IFJlYWRvbmx5PElNZWFzdXJlUmVzdWx0PiB7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQuc3R5bGUuZm9udEZhbWlseSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udEZhbWlseTtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9IGAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemV9cHhgO1xuXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyBsYXlvdXRcbiAgICB0aGlzLl92YWxpZGF0ZUFuZFNldChOdW1iZXIodGhpcy5fbWVhc3VyZUVsZW1lbnQub2Zmc2V0V2lkdGgpIC8gRG9tTWVhc3VyZVN0cmF0ZWd5Q29uc3RhbnRzLlJFUEVBVCwgTnVtYmVyKHRoaXMuX21lYXN1cmVFbGVtZW50Lm9mZnNldEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdDtcbiAgfVxufVxuXG5jbGFzcyBUZXh0TWV0cmljc01lYXN1cmVTdHJhdGVneSBleHRlbmRzIEJhc2VNZWFzdXJlU3RhdGVneSB7XG4gIHByaXZhdGUgX2NhbnZhczogT2Zmc2NyZWVuQ2FudmFzO1xuICBwcml2YXRlIF9jdHg6IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGFueSByZXF1aXJlZCBBUEkgaXMgbm90IHN1cHBvcnRlZFxuICAgIHRoaXMuX2NhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMTAwLCAxMDApO1xuICAgIHRoaXMuX2N0eCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcbiAgICBjb25zdCBhID0gdGhpcy5fY3R4Lm1lYXN1cmVUZXh0KCdXJyk7XG4gICAgaWYgKCEoJ3dpZHRoJyBpbiBhICYmICdmb250Qm91bmRpbmdCb3hBc2NlbnQnIGluIGEgJiYgJ2ZvbnRCb3VuZGluZ0JveERlc2NlbnQnIGluIGEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIGZvbnQgbWV0cmljcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1lYXN1cmUoKTogUmVhZG9ubHk8SU1lYXN1cmVSZXN1bHQ+IHtcbiAgICB0aGlzLl9jdHguZm9udCA9IGAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemV9cHggJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHl9YDtcbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5fY3R4Lm1lYXN1cmVUZXh0KCdXJyk7XG4gICAgdGhpcy5fdmFsaWRhdGVBbmRTZXQobWV0cmljcy53aWR0aCwgbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQgKyBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpO1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSwgQ2hhckRhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJhY3RlckpvaW5lciB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBXSElURVNQQUNFX0NFTExfQ0hBUiwgQ29udGVudCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgSm9pbmVkQ2VsbERhdGEgZXh0ZW5kcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUNlbGxEYXRhIHtcbiAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgLy8gLmNvbnRlbnQgY2FycmllcyBubyBtZWFuaW5nIGZvciBqb2luZWQgQ2VsbERhdGEsIHNpbXBseSBudWxsaWZ5IGl0XG4gIC8vIHRodXMgd2UgaGF2ZSB0byBvdmVybG9hZCBhbGwgb3RoZXIgLmNvbnRlbnQgYWNjZXNzb3JzXG4gIHB1YmxpYyBjb250ZW50OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZmc6IG51bWJlcjtcbiAgcHVibGljIGJnOiBudW1iZXI7XG4gIHB1YmxpYyBjb21iaW5lZERhdGE6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKGZpcnN0Q2VsbDogSUNlbGxEYXRhLCBjaGFyczogc3RyaW5nLCB3aWR0aDogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZnID0gZmlyc3RDZWxsLmZnO1xuICAgIHRoaXMuYmcgPSBmaXJzdENlbGwuYmc7XG4gICAgdGhpcy5jb21iaW5lZERhdGEgPSBjaGFycztcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuICB9XG5cbiAgcHVibGljIGlzQ29tYmluZWQoKTogbnVtYmVyIHtcbiAgICAvLyBhbHdheXMgbWFyayBqb2luZWQgY2VsbCBkYXRhIGFzIGNvbWJpbmVkXG4gICAgcmV0dXJuIENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgfVxuXG4gIHB1YmxpYyBnZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2RlKCk6IG51bWJlciB7XG4gICAgLy8gY29kZSBhbHdheXMgZ2V0cyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBmYWtlIGNvZGVwb2ludCAocmVhZCBhcyAtMSlcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCBhcyBjb2RlIGlzIHVzZWQgYnkgY2FjaGVzIGFzIGlkZW50aWZpZXJcbiAgICByZXR1cm4gMHgxRkZGRkY7XG4gIH1cblxuICBwdWJsaWMgc2V0RnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXNDaGFyRGF0YSgpOiBDaGFyRGF0YSB7XG4gICAgcmV0dXJuIFt0aGlzLmZnLCB0aGlzLmdldENoYXJzKCksIHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRDb2RlKCldO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIGltcGxlbWVudHMgSUNoYXJhY3RlckpvaW5lclNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfY2hhcmFjdGVySm9pbmVyczogSUNoYXJhY3RlckpvaW5lcltdID0gW107XG4gIHByaXZhdGUgX25leHRDaGFyYWN0ZXJKb2luZXJJZDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfd29ya0NlbGw6IENlbGxEYXRhID0gbmV3IENlbGxEYXRhKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKGhhbmRsZXI6ICh0ZXh0OiBzdHJpbmcpID0+IFtudW1iZXIsIG51bWJlcl1bXSk6IG51bWJlciB7XG4gICAgY29uc3Qgam9pbmVyOiBJQ2hhcmFjdGVySm9pbmVyID0ge1xuICAgICAgaWQ6IHRoaXMuX25leHRDaGFyYWN0ZXJKb2luZXJJZCsrLFxuICAgICAgaGFuZGxlclxuICAgIH07XG5cbiAgICB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzLnB1c2goam9pbmVyKTtcbiAgICByZXR1cm4gam9pbmVyLmlkO1xuICB9XG5cbiAgcHVibGljIGRlcmVnaXN0ZXIoam9pbmVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2hhcmFjdGVySm9pbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2NoYXJhY3RlckpvaW5lcnNbaV0uaWQgPT09IGpvaW5lcklkKSB7XG4gICAgICAgIHRoaXMuX2NoYXJhY3RlckpvaW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0Sm9pbmVkQ2hhcmFjdGVycyhyb3c6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgaWYgKHRoaXMuX2NoYXJhY3RlckpvaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChyb3cpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgY29uc3QgbGluZVN0ciA9IGxpbmUudHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSk7XG5cbiAgICAvLyBCZWNhdXNlIHNvbWUgY2VsbHMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG11bHRpcGxlIGphdmFzY3JpcHQgY2hhcmFjdGVycyxcbiAgICAvLyB3ZSB0cmFjayB0aGUgY2VsbCBhbmQgdGhlIHN0cmluZyBpbmRleGVzIHNlcGFyYXRlbHkuIFRoaXMgYWxsb3dzIHVzIHRvXG4gICAgLy8gdHJhbnNsYXRlIHRoZSBzdHJpbmcgcmFuZ2VzIHdlIGdldCBmcm9tIHRoZSBqb2luZXJzIGJhY2sgaW50byBjZWxsIHJhbmdlc1xuICAgIC8vIGZvciB1c2Ugd2hlbiByZW5kZXJpbmdcbiAgICBsZXQgcmFuZ2VTdGFydENvbHVtbiA9IDA7XG4gICAgbGV0IGN1cnJlbnRTdHJpbmdJbmRleCA9IDA7XG4gICAgbGV0IHJhbmdlU3RhcnRTdHJpbmdJbmRleCA9IDA7XG4gICAgbGV0IHJhbmdlQXR0ckZHID0gbGluZS5nZXRGZygwKTtcbiAgICBsZXQgcmFuZ2VBdHRyQkcgPSBsaW5lLmdldEJnKDApO1xuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBsaW5lLmdldFRyaW1tZWRMZW5ndGgoKTsgeCsrKSB7XG4gICAgICBsaW5lLmxvYWRDZWxsKHgsIHRoaXMuX3dvcmtDZWxsKTtcblxuICAgICAgaWYgKHRoaXMuX3dvcmtDZWxsLmdldFdpZHRoKCkgPT09IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBjaGFyYWN0ZXIgaXMgb2Ygd2lkdGggMCwgc2tpcCBpdC5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZCBvZiByYW5nZVxuICAgICAgaWYgKHRoaXMuX3dvcmtDZWxsLmZnICE9PSByYW5nZUF0dHJGRyB8fCB0aGlzLl93b3JrQ2VsbC5iZyAhPT0gcmFuZ2VBdHRyQkcpIHtcbiAgICAgICAgLy8gSWYgd2UgZW5kZWQgdXAgd2l0aCBhIHNlcXVlbmNlIG9mIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLFxuICAgICAgICAvLyBsb29rIGZvciByYW5nZXMgdG8gam9pbi5cbiAgICAgICAgaWYgKHggLSByYW5nZVN0YXJ0Q29sdW1uID4gMSkge1xuICAgICAgICAgIGNvbnN0IGpvaW5lZFJhbmdlcyA9IHRoaXMuX2dldEpvaW5lZFJhbmdlcyhcbiAgICAgICAgICAgIGxpbmVTdHIsXG4gICAgICAgICAgICByYW5nZVN0YXJ0U3RyaW5nSW5kZXgsXG4gICAgICAgICAgICBjdXJyZW50U3RyaW5nSW5kZXgsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgcmFuZ2VTdGFydENvbHVtblxuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqb2luZWRSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGpvaW5lZFJhbmdlc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgb3VyIG1hcmtlcnMgZm9yIGEgbmV3IHJhbmdlLlxuICAgICAgICByYW5nZVN0YXJ0Q29sdW1uID0geDtcbiAgICAgICAgcmFuZ2VTdGFydFN0cmluZ0luZGV4ID0gY3VycmVudFN0cmluZ0luZGV4O1xuICAgICAgICByYW5nZUF0dHJGRyA9IHRoaXMuX3dvcmtDZWxsLmZnO1xuICAgICAgICByYW5nZUF0dHJCRyA9IHRoaXMuX3dvcmtDZWxsLmJnO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50U3RyaW5nSW5kZXggKz0gdGhpcy5fd29ya0NlbGwuZ2V0Q2hhcnMoKS5sZW5ndGggfHwgV0hJVEVTUEFDRV9DRUxMX0NIQVIubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgYW55IHRyYWlsaW5nIHJhbmdlcy5cbiAgICBpZiAodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gcmFuZ2VTdGFydENvbHVtbiA+IDEpIHtcbiAgICAgIGNvbnN0IGpvaW5lZFJhbmdlcyA9IHRoaXMuX2dldEpvaW5lZFJhbmdlcyhcbiAgICAgICAgbGluZVN0cixcbiAgICAgICAgcmFuZ2VTdGFydFN0cmluZ0luZGV4LFxuICAgICAgICBjdXJyZW50U3RyaW5nSW5kZXgsXG4gICAgICAgIGxpbmUsXG4gICAgICAgIHJhbmdlU3RhcnRDb2x1bW5cbiAgICAgICk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpvaW5lZFJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByYW5nZXMucHVzaChqb2luZWRSYW5nZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBzZWdtZW50IG9mIGEgbGluZSBvZiB0ZXh0LCBmaW5kIGFsbCByYW5nZXMgb2YgdGV4dCB0aGF0IHNob3VsZCBiZVxuICAgKiBqb2luZWQgaW4gYSBzaW5nbGUgcmVuZGVyaW5nIHVuaXQuIFJhbmdlcyBhcmUgaW50ZXJuYWxseSBjb252ZXJ0ZWQgdG9cbiAgICogY29sdW1uIHJhbmdlcywgcmF0aGVyIHRoYW4gc3RyaW5nIHJhbmdlcy5cbiAgICogQHBhcmFtIGxpbmUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmdWxsIGxpbmUgb2YgdGV4dFxuICAgKiBAcGFyYW0gc3RhcnRJbmRleCBTdGFydCBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgdG8gc2VhcmNoIGluIHRoZSBzdHJpbmcgKGluY2x1c2l2ZSlcbiAgICogQHBhcmFtIGVuZEluZGV4IEVuZCBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgdG8gc2VhcmNoIGluIHRoZSBzdHJpbmcgKGV4Y2x1c2l2ZSlcbiAgICovXG4gIHByaXZhdGUgX2dldEpvaW5lZFJhbmdlcyhsaW5lOiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgbGluZURhdGE6IElCdWZmZXJMaW5lLCBzdGFydENvbDogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXVtdIHtcbiAgICBjb25zdCB0ZXh0ID0gbGluZS5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGpvaW5lciBzb1xuICAgIC8vIHdlIGNhbiBqdXN0IHB1bGwgaXRzIHZhbHVlIGFuZCBhc3NpZ24gaXQgZGlyZWN0bHkgcmF0aGVyIHRoYW5cbiAgICAvLyBtZXJnaW5nIGl0IGludG8gYW4gZW1wdHkgYXJyYXksIHdoaWNoIGluY3VycyB1bm5lY2Vzc2FyeSB3cml0ZXMuXG4gICAgbGV0IGFsbEpvaW5lZFJhbmdlczogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGFsbEpvaW5lZFJhbmdlcyA9IHRoaXMuX2NoYXJhY3RlckpvaW5lcnNbMF0uaGFuZGxlcih0ZXh0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY2hhcmFjdGVySm9pbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gV2UgbWVyZ2UgYW55IG92ZXJsYXBwaW5nIHJhbmdlcyBhY3Jvc3MgdGhlIGRpZmZlcmVudCBqb2luZXJzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqb2luZXJSYW5nZXMgPSB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzW2ldLmhhbmRsZXIodGV4dCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgam9pbmVyUmFuZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgQ2hhcmFjdGVySm9pbmVyU2VydmljZS5fbWVyZ2VSYW5nZXMoYWxsSm9pbmVkUmFuZ2VzLCBqb2luZXJSYW5nZXNbal0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RyaW5nUmFuZ2VzVG9DZWxsUmFuZ2VzKGFsbEpvaW5lZFJhbmdlcywgbGluZURhdGEsIHN0YXJ0Q29sKTtcbiAgICByZXR1cm4gYWxsSm9pbmVkUmFuZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBwcm92aWRlZCByYW5nZXMgaW4tcGxhY2UgdG8gYWRqdXN0IGZvciB2YXJpYXRpb25zIGJldHdlZW5cbiAgICogc3RyaW5nIGxlbmd0aCBhbmQgY2VsbCB3aWR0aCBzbyB0aGF0IHRoZSByYW5nZSByZXByZXNlbnRzIGEgY2VsbCByYW5nZSxcbiAgICogcmF0aGVyIHRoYW4gdGhlIHN0cmluZyByYW5nZSB0aGUgam9pbmVyIHByb3ZpZGVzLlxuICAgKiBAcGFyYW0gcmFuZ2VzIFN0cmluZyByYW5nZXMgY29udGFpbmluZyBzdGFydCAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIGluZGV4XG4gICAqIEBwYXJhbSBsaW5lIENlbGwgZGF0YSBmb3IgdGhlIHJlbGV2YW50IGxpbmUgaW4gdGhlIHRlcm1pbmFsXG4gICAqIEBwYXJhbSBzdGFydENvbCBPZmZzZXQgd2l0aGluIHRoZSBsaW5lIHRvIHN0YXJ0IGZyb21cbiAgICovXG4gIHByaXZhdGUgX3N0cmluZ1Jhbmdlc1RvQ2VsbFJhbmdlcyhyYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXSwgbGluZTogSUJ1ZmZlckxpbmUsIHN0YXJ0Q29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudFJhbmdlSW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50UmFuZ2VTdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRTdHJpbmdJbmRleCA9IDA7XG4gICAgbGV0IGN1cnJlbnRSYW5nZSA9IHJhbmdlc1tjdXJyZW50UmFuZ2VJbmRleF07XG5cbiAgICAvLyBJZiB3ZSBnb3QgdGhyb3VnaCBhbGwgb2YgdGhlIHJhbmdlcywgc3RvcCBzZWFyY2hpbmdcbiAgICBpZiAoIWN1cnJlbnRSYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IHggPSBzdGFydENvbDsgeCA8IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczsgeCsrKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGxpbmUuZ2V0V2lkdGgoeCk7XG4gICAgICBjb25zdCBsZW5ndGggPSBsaW5lLmdldFN0cmluZyh4KS5sZW5ndGggfHwgV0hJVEVTUEFDRV9DRUxMX0NIQVIubGVuZ3RoO1xuXG4gICAgICAvLyBXZSBza2lwIHplcm8td2lkdGggY2hhcmFjdGVycyB3aGVuIGNyZWF0aW5nIHRoZSBzdHJpbmcgdG8gam9pbiB0aGUgdGV4dFxuICAgICAgLy8gc28gd2UgZG8gdGhlIHNhbWUgaGVyZVxuICAgICAgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZVxuICAgICAgaWYgKCFjdXJyZW50UmFuZ2VTdGFydGVkICYmIGN1cnJlbnRSYW5nZVswXSA8PSBjdXJyZW50U3RyaW5nSW5kZXgpIHtcbiAgICAgICAgY3VycmVudFJhbmdlWzBdID0geDtcbiAgICAgICAgY3VycmVudFJhbmdlU3RhcnRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgZW5kIG9mIHRoZSByYW5nZVxuICAgICAgaWYgKGN1cnJlbnRSYW5nZVsxXSA8PSBjdXJyZW50U3RyaW5nSW5kZXgpIHtcbiAgICAgICAgY3VycmVudFJhbmdlWzFdID0geDtcblxuICAgICAgICAvLyBXZSdyZSBmaW5pc2hlZCB3aXRoIHRoaXMgcmFuZ2UsIHNvIHdlIG1vdmUgdG8gdGhlIG5leHQgb25lXG4gICAgICAgIGN1cnJlbnRSYW5nZSA9IHJhbmdlc1srK2N1cnJlbnRSYW5nZUluZGV4XTtcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSByYW5nZXMgbGVmdCwgc3RvcCBzZWFyY2hpbmdcbiAgICAgICAgaWYgKCFjdXJyZW50UmFuZ2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhbmdlcyBjYW4gYmUgb24gYWRqYWNlbnQgY2hhcmFjdGVycy4gQmVjYXVzZSB0aGUgZW5kIGluZGV4IG9mIHRoZVxuICAgICAgICAvLyByYW5nZXMgYXJlIGV4Y2x1c2l2ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBpbmRleCBmb3IgdGhlIHN0YXJ0IG9mIGFcbiAgICAgICAgLy8gcmFuZ2UgY2FuIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgaW5kZXggb2YgdGhlIHByZXZpb3VzIHJhbmdlLiBUb1xuICAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgc3RhcnQgb2YgdGhlIG5leHQgcmFuZ2UsIHdlIGNoZWNrIGhlcmUganVzdCBpbiBjYXNlLlxuICAgICAgICBpZiAoY3VycmVudFJhbmdlWzBdIDw9IGN1cnJlbnRTdHJpbmdJbmRleCkge1xuICAgICAgICAgIGN1cnJlbnRSYW5nZVswXSA9IHg7XG4gICAgICAgICAgY3VycmVudFJhbmdlU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFJhbmdlU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgc3RyaW5nIGluZGV4IGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIHRvIGxpbmUgdXAgd2l0aFxuICAgICAgLy8gdGhlIGNvbHVtbiBhZGp1c3RtZW50XG4gICAgICBjdXJyZW50U3RyaW5nSW5kZXggKz0gbGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIGEgcmFuZ2UgbGVmdCBhdCB0aGUgZW5kLCBpdCBtdXN0IGV4dGVuZCBhbGwgdGhlIHdheSB0b1xuICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgaWYgKGN1cnJlbnRSYW5nZSkge1xuICAgICAgY3VycmVudFJhbmdlWzFdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgdGhlIHJhbmdlIGRlZmluZWQgYnkgdGhlIHByb3ZpZGVkIHN0YXJ0IGFuZCBlbmQgaW50byB0aGUgbGlzdCBvZlxuICAgKiBleGlzdGluZyByYW5nZXMuIFRoZSBtZXJnZSBpcyBkb25lIGluIHBsYWNlIG9uIHRoZSBleGlzdGluZyByYW5nZSBmb3JcbiAgICogcGVyZm9ybWFuY2UgYW5kIGlzIGFsc28gcmV0dXJuZWQuXG4gICAqIEBwYXJhbSByYW5nZXMgRXhpc3RpbmcgcmFuZ2UgbGlzdFxuICAgKiBAcGFyYW0gbmV3UmFuZ2UgVHVwbGUgb2YgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBuZXcgcmFuZ2UgdG8gbWVyZ2UgaW4uXG4gICAqIEByZXR1cm5zIFRoZSByYW5nZXMgaW5wdXQgd2l0aCB0aGUgbmV3IHJhbmdlIG1lcmdlZCBpbiBwbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX21lcmdlUmFuZ2VzKHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdLCBuZXdSYW5nZTogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgbGV0IGluUmFuZ2UgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICBpZiAoIWluUmFuZ2UpIHtcbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzBdKSB7XG4gICAgICAgICAgLy8gQ2FzZSAxOiBOZXcgcmFuZ2UgaXMgYmVmb3JlIHRoZSBzZWFyY2ggcmFuZ2VcbiAgICAgICAgICByYW5nZXMuc3BsaWNlKGksIDAsIG5ld1JhbmdlKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzFdKSB7XG4gICAgICAgICAgLy8gQ2FzZSAyOiBOZXcgcmFuZ2UgaXMgZWl0aGVyIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZVxuICAgICAgICAgIC8vIHNlYXJjaCByYW5nZSBvciBvdmVybGFwcyB3aXRoIHRoZSBmcm9udCBvZiBpdFxuICAgICAgICAgIHJhbmdlWzBdID0gTWF0aC5taW4obmV3UmFuZ2VbMF0sIHJhbmdlWzBdKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JhbmdlWzBdIDwgcmFuZ2VbMV0pIHtcbiAgICAgICAgICAvLyBDYXNlIDM6IE5ldyByYW5nZSBlaXRoZXIgd2hvbGx5IGNvbnRhaW5zIHRoZSBzZWFyY2ggcmFuZ2VcbiAgICAgICAgICAvLyBvciBvdmVybGFwcyB3aXRoIHRoZSBlbmQgb2YgaXRcbiAgICAgICAgICByYW5nZVswXSA9IE1hdGgubWluKG5ld1JhbmdlWzBdLCByYW5nZVswXSk7XG4gICAgICAgICAgaW5SYW5nZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYXNlIDQ6IE5ldyByYW5nZSBzdGFydHMgYWZ0ZXIgdGhlIHNlYXJjaCByYW5nZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXdSYW5nZVsxXSA8PSByYW5nZVswXSkge1xuICAgICAgICAgIC8vIENhc2UgNTogTmV3IHJhbmdlIGV4dGVuZHMgZnJvbSBwcmV2aW91cyByYW5nZSBidXQgZG9lc24ndFxuICAgICAgICAgIC8vIHJlYWNoIHRoZSBjdXJyZW50IG9uZVxuICAgICAgICAgIHJhbmdlc1tpIC0gMV1bMV0gPSBuZXdSYW5nZVsxXTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzFdKSB7XG4gICAgICAgICAgLy8gQ2FzZSA2OiBOZXcgcmFuZ2UgZXh0ZW5kcyBmcm9tIHBydmlvdXMgcmFuZ2UgaW50byB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHJhbmdlXG4gICAgICAgICAgcmFuZ2VzW2kgLSAxXVsxXSA9IE1hdGgubWF4KG5ld1JhbmdlWzFdLCByYW5nZVsxXSk7XG4gICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FzZSA3OiBOZXcgcmFuZ2UgZXh0ZW5kcyBmcm9tIHByZXZpb3VzIHJhbmdlIHBhc3QgdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCByYW5nZVxuICAgICAgICByYW5nZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBpLS07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluUmFuZ2UpIHtcbiAgICAgIC8vIENhc2UgODogTmV3IHJhbmdlIGV4dGVuZHMgcGFzdCB0aGUgbGFzdCBleGlzdGluZyByYW5nZVxuICAgICAgcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXVsxXSA9IG5ld1JhbmdlWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXNlIDk6IE5ldyByYW5nZSBzdGFydHMgYWZ0ZXIgdGhlIGxhc3QgZXhpc3RpbmcgcmFuZ2VcbiAgICAgIHJhbmdlcy5wdXNoKG5ld1JhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2VzO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUsIE11dGFibGVEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgZm9yd2FyZEV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIgfSBmcm9tICdicm93c2VyL0xpZmVjeWNsZSc7XG5cbmV4cG9ydCBjbGFzcyBDb3JlQnJvd3NlclNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUNvcmVCcm93c2VyU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2FjaGVkSXNGb2N1c2VkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9zY3JlZW5EcHJNb25pdG9yID0gbmV3IFNjcmVlbkRwck1vbml0b3IodGhpcy5fd2luZG93KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRwckNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EcHJDaGFuZ2UgPSB0aGlzLl9vbkRwckNoYW5nZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25XaW5kb3dDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8V2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXM+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25XaW5kb3dDaGFuZ2UgPSB0aGlzLl9vbldpbmRvd0NoYW5nZS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICBwcml2YXRlIF93aW5kb3c6IFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzLFxuICAgIHB1YmxpYyByZWFkb25seSBtYWluRG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBNb25pdG9yIGRldmljZSBwaXhlbCByYXRpb1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vbldpbmRvd0NoYW5nZSh3ID0+IHRoaXMuX3NjcmVlbkRwck1vbml0b3Iuc2V0V2luZG93KHcpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fc2NyZWVuRHByTW9uaXRvci5vbkRwckNoYW5nZSwgdGhpcy5fb25EcHJDaGFuZ2UpKTtcblxuICAgIHRoaXMuX3RleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gdGhpcy5faXNGb2N1c2VkID0gdHJ1ZSk7XG4gICAgdGhpcy5fdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHRoaXMuX2lzRm9jdXNlZCA9IGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd2luZG93KCk6IFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzIHtcbiAgICByZXR1cm4gdGhpcy5fd2luZG93O1xuICB9XG5cbiAgcHVibGljIHNldCB3aW5kb3codmFsdWU6IFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzKSB7XG4gICAgaWYgKHRoaXMuX3dpbmRvdyAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3dpbmRvdyA9IHZhbHVlO1xuICAgICAgdGhpcy5fb25XaW5kb3dDaGFuZ2UuZmlyZSh0aGlzLl93aW5kb3cpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZHByKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMud2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkSXNGb2N1c2VkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NhY2hlZElzRm9jdXNlZCA9IHRoaXMuX2lzRm9jdXNlZCAmJiB0aGlzLl90ZXh0YXJlYS5vd25lckRvY3VtZW50Lmhhc0ZvY3VzKCk7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLl9jYWNoZWRJc0ZvY3VzZWQgPSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkSXNGb2N1c2VkO1xuICB9XG59XG5cblxuLyoqXG4gKiBUaGUgc2NyZWVuIGRldmljZSBwaXhlbCByYXRpbyBtb25pdG9yIGFsbG93cyBsaXN0ZW5pbmcgZm9yIHdoZW4gdGhlXG4gKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB2YWx1ZSBjaGFuZ2VzLiBUaGlzIGlzIGRvbmUgbm90IHdpdGggcG9sbGluZyBidXQgd2l0aFxuICogdGhlIHVzZSBvZiB3aW5kb3cubWF0Y2hNZWRpYSB0byB3YXRjaCBtZWRpYSBxdWVyaWVzLiBXaGVuIHRoZSBldmVudCBmaXJlcyxcbiAqIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHJlYXR0YWNoZWQgdXNpbmcgYSBkaWZmZXJlbnQgbWVkaWEgcXVlcnkgdG8gZW5zdXJlIHRoYXRcbiAqIGFueSBmdXJ0aGVyIGNoYW5nZXMgd2lsbCByZWdpc3Rlci5cbiAqXG4gKiBUaGUgbGlzdGVuZXIgc2hvdWxkIGZpcmUgb24gYm90aCB3aW5kb3cgem9vbSBjaGFuZ2VzIGFuZCBzd2l0Y2hpbmcgdG8gYVxuICogbW9uaXRvciB3aXRoIGEgZGlmZmVyZW50IERQSS5cbiAqL1xuY2xhc3MgU2NyZWVuRHByTW9uaXRvciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIF9jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuICBwcml2YXRlIF9vdXRlckxpc3RlbmVyOiAoKHRoaXM6IE1lZGlhUXVlcnlMaXN0LCBldjogTWVkaWFRdWVyeUxpc3RFdmVudCkgPT4gYW55KSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0OiBNZWRpYVF1ZXJ5TGlzdCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfd2luZG93UmVzaXplTGlzdGVuZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRwckNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EcHJDaGFuZ2UgPSB0aGlzLl9vbkRwckNoYW5nZS5ldmVudDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wYXJlbnRXaW5kb3c6IFdpbmRvdykge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGxpc3RlbmVyIGFuZCBkcHIgdmFsdWVcbiAgICB0aGlzLl9vdXRlckxpc3RlbmVyID0gKCkgPT4gdGhpcy5fc2V0RHByQW5kRmlyZUlmRGlmZmVycygpO1xuICAgIHRoaXMuX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvID0gdGhpcy5fcGFyZW50V2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgdGhpcy5fdXBkYXRlRHByKCk7XG5cbiAgICAvLyBNb25pdG9yIGFjdGl2ZSB3aW5kb3cgcmVzaXplXG4gICAgdGhpcy5fc2V0V2luZG93UmVzaXplTGlzdGVuZXIoKTtcblxuICAgIC8vIFNldHVwIGFkZGl0aW9uYWwgZGlzcG9zYWJsZXNcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB0aGlzLmNsZWFyTGlzdGVuZXIoKSkpO1xuICB9XG5cblxuICBwdWJsaWMgc2V0V2luZG93KHBhcmVudFdpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgdGhpcy5fcGFyZW50V2luZG93ID0gcGFyZW50V2luZG93O1xuICAgIHRoaXMuX3NldFdpbmRvd1Jlc2l6ZUxpc3RlbmVyKCk7XG4gICAgdGhpcy5fc2V0RHByQW5kRmlyZUlmRGlmZmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0V2luZG93UmVzaXplTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5fd2luZG93UmVzaXplTGlzdGVuZXIudmFsdWUgPSBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fcGFyZW50V2luZG93LCAncmVzaXplJywgKCkgPT4gdGhpcy5fc2V0RHByQW5kRmlyZUlmRGlmZmVycygpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldERwckFuZEZpcmVJZkRpZmZlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICE9PSB0aGlzLl9jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgdGhpcy5fb25EcHJDaGFuZ2UuZmlyZSh0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZURwcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRHByKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fb3V0ZXJMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGxpc3RlbmVycyBmb3Igb2xkIERQUlxuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdD8ucmVtb3ZlTGlzdGVuZXIodGhpcy5fb3V0ZXJMaXN0ZW5lcik7XG5cbiAgICAvLyBBZGQgbGlzdGVuZXJzIGZvciBuZXcgRFBSXG4gICAgdGhpcy5fY3VycmVudERldmljZVBpeGVsUmF0aW8gPSB0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB0aGlzLl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3QgPSB0aGlzLl9wYXJlbnRXaW5kb3cubWF0Y2hNZWRpYShgc2NyZWVuIGFuZCAocmVzb2x1dGlvbjogJHt0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpb31kcHB4KWApO1xuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdC5hZGRMaXN0ZW5lcih0aGlzLl9vdXRlckxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0IHx8ICF0aGlzLl9vdXRlckxpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdC5yZW1vdmVMaXN0ZW5lcih0aGlzLl9vdXRlckxpc3RlbmVyKTtcbiAgICB0aGlzLl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3QgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb3V0ZXJMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSUxpbmtQcm92aWRlciwgSUxpbmtQcm92aWRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTGlua1Byb3ZpZGVyU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTGlua1Byb3ZpZGVyU2VydmljZSB7XG4gIGRlY2xhcmUgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyByZWFkb25seSBsaW5rUHJvdmlkZXJzOiBJTGlua1Byb3ZpZGVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHRoaXMubGlua1Byb3ZpZGVycy5sZW5ndGggPSAwKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyOiBJTGlua1Byb3ZpZGVyKTogSURpc3Bvc2FibGUge1xuICAgIHRoaXMubGlua1Byb3ZpZGVycy5wdXNoKGxpbmtQcm92aWRlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaW5rIHByb3ZpZGVyIGZyb20gdGhlIGxpc3RcbiAgICAgICAgY29uc3QgcHJvdmlkZXJJbmRleCA9IHRoaXMubGlua1Byb3ZpZGVycy5pbmRleE9mKGxpbmtQcm92aWRlcik7XG5cbiAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5saW5rUHJvdmlkZXJzLnNwbGljZShwcm92aWRlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSVJlbmRlclNlcnZpY2UsIElNb3VzZVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzJztcbmltcG9ydCB7IGdldENvb3JkcywgZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQgfSBmcm9tICdicm93c2VyL2lucHV0L01vdXNlJztcblxuZXhwb3J0IGNsYXNzIE1vdXNlU2VydmljZSBpbXBsZW1lbnRzIElNb3VzZVNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlLFxuICAgIEBJQ2hhclNpemVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJTaXplU2VydmljZTogSUNoYXJTaXplU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb29yZHMoZXZlbnQ6IHtjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcn0sIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2xDb3VudDogbnVtYmVyLCByb3dDb3VudDogbnVtYmVyLCBpc1NlbGVjdGlvbj86IGJvb2xlYW4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZ2V0Q29vcmRzKFxuICAgICAgd2luZG93LFxuICAgICAgZXZlbnQsXG4gICAgICBlbGVtZW50LFxuICAgICAgY29sQ291bnQsXG4gICAgICByb3dDb3VudCxcbiAgICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUsXG4gICAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0LFxuICAgICAgaXNTZWxlY3Rpb25cbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldE1vdXNlUmVwb3J0Q29vcmRzKGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCk6IHsgY29sOiBudW1iZXIsIHJvdzogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCh3aW5kb3csIGV2ZW50LCBlbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvb3Jkc1swXSA9IE1hdGgubWluKE1hdGgubWF4KGNvb3Jkc1swXSwgMCksIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoIC0gMSk7XG4gICAgY29vcmRzWzFdID0gTWF0aC5taW4oTWF0aC5tYXgoY29vcmRzWzFdLCAwKSwgdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0IC0gMSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogTWF0aC5mbG9vcihjb29yZHNbMF0gLyB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGgpLFxuICAgICAgcm93OiBNYXRoLmZsb29yKGNvb3Jkc1sxXSAvIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQpLFxuICAgICAgeDogTWF0aC5mbG9vcihjb29yZHNbMF0pLFxuICAgICAgeTogTWF0aC5mbG9vcihjb29yZHNbMV0pXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBSZW5kZXJEZWJvdW5jZXIgfSBmcm9tICdicm93c2VyL1JlbmRlckRlYm91bmNlcic7XG5pbXBvcnQgeyBJUmVuZGVyRGVib3VuY2VyV2l0aENhbGxiYWNrIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucywgSVJlbmRlcmVyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVJlbmRlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgRGVib3VuY2VkSWRsZVRhc2sgfSBmcm9tICdjb21tb24vVGFza1F1ZXVlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmludGVyZmFjZSBJU2VsZWN0aW9uU3RhdGUge1xuICBzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUmVuZGVyU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJUmVuZGVyU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9yZW5kZXJlcjogTXV0YWJsZURpc3Bvc2FibGU8SVJlbmRlcmVyPiA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuICBwcml2YXRlIF9yZW5kZXJEZWJvdW5jZXI6IElSZW5kZXJEZWJvdW5jZXJXaXRoQ2FsbGJhY2s7XG4gIHByaXZhdGUgX3BhdXNlZFJlc2l6ZVRhc2sgPSBuZXcgRGVib3VuY2VkSWRsZVRhc2soKTtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXJEaXNwb3NhYmxlID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSBfaXNQYXVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbmVlZHNGdWxsUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc05leHRSZW5kZXJSZWRyYXdPbmx5OiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfbmVlZHNTZWxlY3Rpb25SZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhbnZhc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jYW52YXNIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGlvblN0YXRlOiBJU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgc3RhcnQ6IHVuZGVmaW5lZCxcbiAgICBlbmQ6IHVuZGVmaW5lZCxcbiAgICBjb2x1bW5TZWxlY3RNb2RlOiBmYWxzZVxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGltZW5zaW9uc0NoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJUmVuZGVyRGltZW5zaW9ucz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRpbWVuc2lvbnNDaGFuZ2UgPSB0aGlzLl9vbkRpbWVuc2lvbnNDaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlID0gdGhpcy5fb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlbmRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW5kZXIgPSB0aGlzLl9vblJlbmRlci5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZWZyZXNoUmVxdWVzdCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZWZyZXNoUmVxdWVzdCA9IHRoaXMuX29uUmVmcmVzaFJlcXVlc3QuZXZlbnQ7XG5cbiAgcHVibGljIGdldCBkaW1lbnNpb25zKCk6IElSZW5kZXJEaW1lbnNpb25zIHsgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLnZhbHVlIS5kaW1lbnNpb25zOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcm93Q291bnQ6IG51bWJlcixcbiAgICBzY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElDaGFyU2l6ZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlLFxuICAgIEBJRGVjb3JhdGlvblNlcnZpY2UgZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSxcbiAgICBASUJ1ZmZlclNlcnZpY2UgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJVGhlbWVTZXJ2aWNlIHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fcmVuZGVyRGVib3VuY2VyID0gbmV3IFJlbmRlckRlYm91bmNlcigoc3RhcnQsIGVuZCkgPT4gdGhpcy5fcmVuZGVyUm93cyhzdGFydCwgZW5kKSwgY29yZUJyb3dzZXJTZXJ2aWNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlckRlYm91bmNlcik7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGNvcmVCcm93c2VyU2VydmljZS5vbkRwckNoYW5nZSgoKSA9PiB0aGlzLmhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihidWZmZXJTZXJ2aWNlLm9uUmVzaXplKCgpID0+IHRoaXMuX2Z1bGxSZWZyZXNoKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGJ1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKCgpID0+IHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5jbGVhcigpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihvcHRpb25zU2VydmljZS5vbk9wdGlvbkNoYW5nZSgoKSA9PiB0aGlzLl9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uub25DaGFyU2l6ZUNoYW5nZSgoKSA9PiB0aGlzLmhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpKSk7XG5cbiAgICAvLyBEbyBhIGZ1bGwgcmVmcmVzaCB3aGVuZXZlciBhbnkgZGVjb3JhdGlvbiBpcyBhZGRlZCBvciByZW1vdmVkLiBUaGlzIG1heSBub3QgYWN0dWFsbHkgcmVzdWx0XG4gICAgLy8gaW4gY2hhbmdlcyBidXQgc2luY2UgZGVjb3JhdGlvbnMgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5IG9yIGFkZGVkL3JlbW92ZWQgYWxsIGluIHRoZSBzYW1lXG4gICAgLy8gZnJhbWUgdGhpcyBzaG91bGQgaGF2ZSBtaW5pbWFsIHBlcmZvcm1hbmNlIGltcGFjdC5cbiAgICB0aGlzLnJlZ2lzdGVyKGRlY29yYXRpb25TZXJ2aWNlLm9uRGVjb3JhdGlvblJlZ2lzdGVyZWQoKCkgPT4gdGhpcy5fZnVsbFJlZnJlc2goKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVtb3ZlZCgoKSA9PiB0aGlzLl9mdWxsUmVmcmVzaCgpKSk7XG5cbiAgICAvLyBDbGVhciB0aGUgcmVuZGVyZXIgd2hlbiB0aGUgYSBjaGFuZ2UgdGhhdCBjb3VsZCBhZmZlY3QgZ2x5cGhzIG9jY3Vyc1xuICAgIHRoaXMucmVnaXN0ZXIob3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbXG4gICAgICAnY3VzdG9tR2x5cGhzJyxcbiAgICAgICdkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycycsXG4gICAgICAnbGV0dGVyU3BhY2luZycsXG4gICAgICAnbGluZUhlaWdodCcsXG4gICAgICAnZm9udEZhbWlseScsXG4gICAgICAnZm9udFNpemUnLFxuICAgICAgJ2ZvbnRXZWlnaHQnLFxuICAgICAgJ2ZvbnRXZWlnaHRCb2xkJyxcbiAgICAgICdtaW5pbXVtQ29udHJhc3RSYXRpbycsXG4gICAgICAncmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzJ1xuICAgIF0sICgpID0+IHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKGJ1ZmZlclNlcnZpY2UuY29scywgYnVmZmVyU2VydmljZS5yb3dzKTtcbiAgICAgIHRoaXMuX2Z1bGxSZWZyZXNoKCk7XG4gICAgfSkpO1xuXG4gICAgLy8gUmVmcmVzaCB0aGUgY3Vyc29yIGxpbmUgd2hlbiB0aGUgY3Vyc29yIGNoYW5nZXNcbiAgICB0aGlzLnJlZ2lzdGVyKG9wdGlvbnNTZXJ2aWNlLm9uTXVsdGlwbGVPcHRpb25DaGFuZ2UoW1xuICAgICAgJ2N1cnNvckJsaW5rJyxcbiAgICAgICdjdXJzb3JTdHlsZSdcbiAgICBdLCAoKSA9PiB0aGlzLnJlZnJlc2hSb3dzKGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnksIGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnksIHRydWUpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycygoKSA9PiB0aGlzLl9mdWxsUmVmcmVzaCgpKSk7XG5cbiAgICB0aGlzLl9yZWdpc3RlckludGVyc2VjdGlvbk9ic2VydmVyKGNvcmVCcm93c2VyU2VydmljZS53aW5kb3csIHNjcmVlbkVsZW1lbnQpO1xuICAgIHRoaXMucmVnaXN0ZXIoY29yZUJyb3dzZXJTZXJ2aWNlLm9uV2luZG93Q2hhbmdlKCh3KSA9PiB0aGlzLl9yZWdpc3RlckludGVyc2VjdGlvbk9ic2VydmVyKHcsIHNjcmVlbkVsZW1lbnQpKSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckludGVyc2VjdGlvbk9ic2VydmVyKHc6IFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzLCBzY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIERldGVjdCB3aGV0aGVyIEludGVyc2VjdGlvbk9ic2VydmVyIGlzIGRldGVjdGVkIGFuZCBlbmFibGUgcmVuZGVyZXIgcGF1c2VcbiAgICAvLyBhbmQgcmVzdW1lIGJhc2VkIG9uIHRlcm1pbmFsIHZpc2liaWxpdHkgaWYgc29cbiAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3KSB7XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyB3LkludGVyc2VjdGlvbk9ic2VydmVyKGUgPT4gdGhpcy5faGFuZGxlSW50ZXJzZWN0aW9uQ2hhbmdlKGVbZS5sZW5ndGggLSAxXSksIHsgdGhyZXNob2xkOiAwIH0pO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShzY3JlZW5FbGVtZW50KTtcbiAgICAgIHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZSA9IHRvRGlzcG9zYWJsZSgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUludGVyc2VjdGlvbkNoYW5nZShlbnRyeTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSk6IHZvaWQge1xuICAgIHRoaXMuX2lzUGF1c2VkID0gZW50cnkuaXNJbnRlcnNlY3RpbmcgPT09IHVuZGVmaW5lZCA/IChlbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyA9PT0gMCkgOiAhZW50cnkuaXNJbnRlcnNlY3Rpbmc7XG5cbiAgICAvLyBUZXJtaW5hbCB3YXMgaGlkZGVuIG9uIG9wZW5cbiAgICBpZiAoIXRoaXMuX2lzUGF1c2VkICYmICF0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGFzVmFsaWRTaXplKSB7XG4gICAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UubWVhc3VyZSgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNQYXVzZWQgJiYgdGhpcy5fbmVlZHNGdWxsUmVmcmVzaCkge1xuICAgICAgdGhpcy5fcGF1c2VkUmVzaXplVGFzay5mbHVzaCgpO1xuICAgICAgdGhpcy5yZWZyZXNoUm93cygwLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuICAgICAgdGhpcy5fbmVlZHNGdWxsUmVmcmVzaCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoUm93cyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgaXNSZWRyYXdPbmx5OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNQYXVzZWQpIHtcbiAgICAgIHRoaXMuX25lZWRzRnVsbFJlZnJlc2ggPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzUmVkcmF3T25seSkge1xuICAgICAgdGhpcy5faXNOZXh0UmVuZGVyUmVkcmF3T25seSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJEZWJvdW5jZXIucmVmcmVzaChzdGFydCwgZW5kLCB0aGlzLl9yb3dDb3VudCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIHRoaXMgaXMgZGVib3VuY2VkLCBhIHJlc2l6ZSBldmVudCBjb3VsZCBoYXZlIGhhcHBlbmVkIGJldHdlZW4gdGhlIHRpbWUgYSByZWZyZXNoIHdhc1xuICAgIC8vIHJlcXVlc3RlZCBhbmQgd2hlbiB0aGlzIHRyaWdnZXJzLiBDbGFtcCB0aGUgdmFsdWVzIG9mIHN0YXJ0IGFuZCBlbmQgdG8gZW5zdXJlIHRoZXkncmUgdmFsaWRcbiAgICAvLyBnaXZlbiB0aGUgY3VycmVudCB2aWV3cG9ydCBzdGF0ZS5cbiAgICBzdGFydCA9IE1hdGgubWluKHN0YXJ0LCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdGhpcy5fcm93Q291bnQgLSAxKTtcblxuICAgIC8vIFJlbmRlclxuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLnJlbmRlclJvd3Moc3RhcnQsIGVuZCk7XG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2gpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQodGhpcy5fc2VsZWN0aW9uU3RhdGUuc3RhcnQsIHRoaXMuX3NlbGVjdGlvblN0YXRlLmVuZCwgdGhpcy5fc2VsZWN0aW9uU3RhdGUuY29sdW1uU2VsZWN0TW9kZSk7XG4gICAgICB0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2ggPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIHJlbmRlciBldmVudCBvbmx5IGlmIGl0IHdhcyBub3QgYSByZWRyYXdcbiAgICBpZiAoIXRoaXMuX2lzTmV4dFJlbmRlclJlZHJhd09ubHkpIHtcbiAgICAgIHRoaXMuX29uUmVuZGVyZWRWaWV3cG9ydENoYW5nZS5maXJlKHsgc3RhcnQsIGVuZCB9KTtcbiAgICB9XG4gICAgdGhpcy5fb25SZW5kZXIuZmlyZSh7IHN0YXJ0LCBlbmQgfSk7XG4gICAgdGhpcy5faXNOZXh0UmVuZGVyUmVkcmF3T25seSA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcm93Q291bnQgPSByb3dzO1xuICAgIHRoaXMuX2ZpcmVPbkNhbnZhc1Jlc2l6ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3B0aW9uc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hSb3dzKDAsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gICAgdGhpcy5fZmlyZU9uQ2FudmFzUmVzaXplKCk7XG4gIH1cblxuICBwcml2YXRlIF9maXJlT25DYW52YXNSZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCBpZiB0aGUgZGltZW5zaW9ucyBoYXZlbid0IGNoYW5nZWRcbiAgICBpZiAodGhpcy5fcmVuZGVyZXIudmFsdWUuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoID09PSB0aGlzLl9jYW52YXNXaWR0aCAmJiB0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0ID09PSB0aGlzLl9jYW52YXNIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fb25EaW1lbnNpb25zQ2hhbmdlLmZpcmUodGhpcy5fcmVuZGVyZXIudmFsdWUuZGltZW5zaW9ucyk7XG4gIH1cblxuICBwdWJsaWMgaGFzUmVuZGVyZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fcmVuZGVyZXIudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0UmVuZGVyZXIocmVuZGVyZXI6IElSZW5kZXJlcik6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlID0gcmVuZGVyZXI7XG4gICAgLy8gSWYgdGhlIHZhbHVlIHdhcyBub3Qgc2V0LCB0aGUgdGVybWluYWwgaXMgYmVpbmcgZGlzcG9zZWQgc28gaWdub3JlIGl0XG4gICAgaWYgKHRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci52YWx1ZS5vblJlcXVlc3RSZWRyYXcoZSA9PiB0aGlzLnJlZnJlc2hSb3dzKGUuc3RhcnQsIGUuZW5kLCB0cnVlKSk7XG5cbiAgICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgICAgdGhpcy5fbmVlZHNTZWxlY3Rpb25SZWZyZXNoID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2Z1bGxSZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZFJlZnJlc2hDYWxsYmFjayhjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJEZWJvdW5jZXIuYWRkUmVmcmVzaENhbGxiYWNrKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Z1bGxSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1BhdXNlZCkge1xuICAgICAgdGhpcy5fbmVlZHNGdWxsUmVmcmVzaCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmcmVzaFJvd3MoMCwgdGhpcy5fcm93Q291bnQgLSAxKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZS5jbGVhclRleHR1cmVBdGxhcz8uKCk7XG4gICAgdGhpcy5fZnVsbFJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIEZvcmNlIGNoYXIgc2l6ZSBtZWFzdXJlbWVudCBhcyBEb21NZWFzdXJlU3RyYXRlZ3koZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSBpcyBub3Qgc3RhYmxlXG4gICAgLy8gd2hlbiBkZXZpY2VQaXhlbFJhdGlvIGNoYW5nZXNcbiAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UubWVhc3VyZSgpO1xuXG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZS5oYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk7XG4gICAgdGhpcy5yZWZyZXNoUm93cygwLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVuZGVyZXIudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzUGF1c2VkKSB7XG4gICAgICB0aGlzLl9wYXVzZWRSZXNpemVUYXNrLnNldCgoKSA9PiB0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlUmVzaXplKGNvbHMsIHJvd3MpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVuZGVyZXIudmFsdWUuaGFuZGxlUmVzaXplKGNvbHMsIHJvd3MpO1xuICAgIH1cbiAgICB0aGlzLl9mdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgLy8gVE9ETzogSXMgdGhpcyB1c2VmdWwgd2hlbiB3ZSBoYXZlIG9uUmVzaXplP1xuICBwdWJsaWMgaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5oYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5oYW5kbGVCbHVyKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU3RhdGUuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5lbmQgPSBlbmQ7XG4gICAgdGhpcy5fc2VsZWN0aW9uU3RhdGUuY29sdW1uU2VsZWN0TW9kZSA9IGNvbHVtblNlbGVjdE1vZGU7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ3Vyc29yTW92ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlQ3Vyc29yTW92ZSgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJSYW5nZSwgSUxpbmtpZmllcjIgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IGdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50IH0gZnJvbSAnYnJvd3Nlci9pbnB1dC9Nb3VzZSc7XG5pbXBvcnQgeyBtb3ZlVG9DZWxsU2VxdWVuY2UgfSBmcm9tICdicm93c2VyL2lucHV0L01vdmVUb0NlbGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdicm93c2VyL3NlbGVjdGlvbi9TZWxlY3Rpb25Nb2RlbCc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uUmVkcmF3UmVxdWVzdEV2ZW50LCBJU2VsZWN0aW9uUmVxdWVzdFNjcm9sbExpbmVzRXZlbnQgfSBmcm9tICdicm93c2VyL3NlbGVjdGlvbi9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJTW91c2VTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgKiBhcyBCcm93c2VyIGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBJQnVmZmVyTGluZSwgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0UmFuZ2VMZW5ndGggfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlclJhbmdlJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSUNvcmVTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBhYm92ZSBvciBiZWxvdyB0aGUgdmlld3BvcnQgaW5cbiAqIG9yZGVyIHRvIHNjcm9sbCBhdCB0aGUgbWF4aW11bSBzcGVlZC5cbiAqL1xuY29uc3QgRFJBR19TQ1JPTExfTUFYX1RIUkVTSE9MRCA9IDUwO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHNjcm9sbGluZyBzcGVlZFxuICovXG5jb25zdCBEUkFHX1NDUk9MTF9NQVhfU1BFRUQgPSAxNTtcblxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGRyYWcgc2Nyb2xsIHVwZGF0ZXMuXG4gKi9cbmNvbnN0IERSQUdfU0NST0xMX0lOVEVSVkFMID0gNTA7XG5cbi8qKlxuICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCBjYW4gaGF2ZSBlbGFwc2VkIGZvciBhbiBhbHQgY2xpY2sgdG8gbW92ZSB0aGVcbiAqIGN1cnNvci5cbiAqL1xuY29uc3QgQUxUX0NMSUNLX01PVkVfQ1VSU09SX1RJTUUgPSA1MDA7XG5cbmNvbnN0IE5PTl9CUkVBS0lOR19TUEFDRV9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xuY29uc3QgQUxMX05PTl9CUkVBS0lOR19TUEFDRV9SRUdFWCA9IG5ldyBSZWdFeHAoTk9OX0JSRUFLSU5HX1NQQUNFX0NIQVIsICdnJyk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHBvc2l0aW9uIG9mIGEgd29yZCBvbiBhIGxpbmUuXG4gKi9cbmludGVyZmFjZSBJV29yZFBvc2l0aW9uIHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgbGVuZ3RoOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gbW9kZSwgdGhpcyBkcml2ZXMgaG93IHRoZSBzZWxlY3Rpb24gYmVoYXZlcyBvbiBtb3VzZSBtb3ZlLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZWxlY3Rpb25Nb2RlIHtcbiAgTk9STUFMLFxuICBXT1JELFxuICBMSU5FLFxuICBDT0xVTU5cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSB0ZXJtaW5hbC4gV2l0aCBoZWxwIGZyb21cbiAqIFNlbGVjdGlvbk1vZGVsLCBTZWxlY3Rpb25TZXJ2aWNlIGhhbmRsZXMgd2l0aCBhbGwgbG9naWMgYXNzb2NpYXRlZCB3aXRoXG4gKiBkZWFsaW5nIHdpdGggdGhlIHNlbGVjdGlvbiwgaW5jbHVkaW5nIGhhbmRsaW5nIG1vdXNlIGludGVyYWN0aW9uLCB3aWRlXG4gKiBjaGFyYWN0ZXJzIGFuZCBmZXRjaGluZyB0aGUgYWN0dWFsIHRleHQgd2l0aGluIHRoZSBzZWxlY3Rpb24uIFJlbmRlcmluZyBpc1xuICogbm90IGhhbmRsZWQgYnkgdGhlIFNlbGVjdGlvblNlcnZpY2UgYnV0IHRoZSBvblJlZHJhd1JlcXVlc3QgZXZlbnQgaXMgZmlyZWRcbiAqIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyByZWFkeSB0byBiZSByZWRyYXduIChvbiBhbiBhbmltYXRpb24gZnJhbWUpLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJU2VsZWN0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgX21vZGVsOiBTZWxlY3Rpb25Nb2RlbDtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCB0byBzY3JvbGwgZXZlcnkgZHJhZyBzY3JvbGwgdXBkYXRlIChkZXBlbmRzIG9uIGhvdyBmYXIgdGhlIG1vdXNlXG4gICAqIGRyYWcgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHRlcm1pbmFsKS5cbiAgICovXG4gIHByaXZhdGUgX2RyYWdTY3JvbGxBbW91bnQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9hY3RpdmVTZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlO1xuXG4gIC8qKlxuICAgKiBBIHNldEludGVydmFsIHRpbWVyIHRoYXQgaXMgYWN0aXZlIHdoaWxlIHRoZSBtb3VzZSBpcyBkb3duIHdob3NlIGNhbGxiYWNrXG4gICAqIHNjcm9sbHMgdGhlIHZpZXdwb3J0IHdoZW4gbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSBfZHJhZ1Njcm9sbEludGVydmFsVGltZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGFuaW1hdGlvbiBmcmFtZSBJRCB1c2VkIGZvciByZWZyZXNoaW5nIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIF9yZWZyZXNoQW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBzZWxlY3Rpb24gaXMgZW5hYmxlZC5cbiAgICovXG4gIHByaXZhdGUgX2VuYWJsZWQgPSB0cnVlO1xuXG4gIHByaXZhdGUgX21vdXNlTW92ZUxpc3RlbmVyOiBFdmVudExpc3RlbmVyO1xuICBwcml2YXRlIF9tb3VzZVVwTGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI7XG4gIHByaXZhdGUgX3RyaW1MaXN0ZW5lcjogSURpc3Bvc2FibGU7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuXG4gIHByaXZhdGUgX21vdXNlRG93blRpbWVTdGFtcDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfb2xkSGFzU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX29sZFNlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9vbGRTZWxlY3Rpb25FbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25MaW51eE1vdXNlU2VsZWN0aW9uID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkxpbnV4TW91c2VTZWxlY3Rpb24gPSB0aGlzLl9vbkxpbnV4TW91c2VTZWxlY3Rpb24uZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVkcmF3UmVxdWVzdCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uUmVkcmF3UmVxdWVzdEV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFJlZHJhdyA9IHRoaXMuX29uUmVkcmF3UmVxdWVzdC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RTY3JvbGxMaW5lcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uUmVxdWVzdFNjcm9sbExpbmVzRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsTGluZXMgPSB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saW5raWZpZXI6IElMaW5raWZpZXIyLFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgQElNb3VzZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfbW91c2VTZXJ2aWNlOiBJTW91c2VTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0IGxpc3RlbmVyc1xuICAgIHRoaXMuX21vdXNlTW92ZUxpc3RlbmVyID0gZXZlbnQgPT4gdGhpcy5faGFuZGxlTW91c2VNb3ZlKGV2ZW50IGFzIE1vdXNlRXZlbnQpO1xuICAgIHRoaXMuX21vdXNlVXBMaXN0ZW5lciA9IGV2ZW50ID0+IHRoaXMuX2hhbmRsZU1vdXNlVXAoZXZlbnQgYXMgTW91c2VFdmVudCk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2Uub25Vc2VySW5wdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl90cmltTGlzdGVuZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5vblRyaW0oYW1vdW50ID0+IHRoaXMuX2hhbmRsZVRyaW0oYW1vdW50KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZShlID0+IHRoaXMuX2hhbmRsZUJ1ZmZlckFjdGl2YXRlKGUpKSk7XG5cbiAgICB0aGlzLmVuYWJsZSgpO1xuXG4gICAgdGhpcy5fbW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWwodGhpcy5fYnVmZmVyU2VydmljZSk7XG4gICAgdGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTk9STUFMO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgc2VsZWN0aW9uIG1hbmFnZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB3aGVuIHRlcm1pbmFsIG1vdXNlXG4gICAqIGFyZSBlbmFibGVkLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uU3RhcnQoKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0OyB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uRW5kKCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7IH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSB0ZXh0IHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0WzBdICE9PSBlbmRbMF0gfHwgc3RhcnRbMV0gIT09IGVuZFsxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0ZXh0IGN1cnJlbnRseSBzZWxlY3RlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5DT0xVTU4pIHtcbiAgICAgIC8vIElnbm9yZSB6ZXJvIHdpZHRoIHNlbGVjdGlvbnNcbiAgICAgIGlmIChzdGFydFswXSA9PT0gZW5kWzBdKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIGNvbHVtbiBzZWxlY3Rpb24gaXQncyBub3QgZW5vdWdoIHRvIHJlbHkgb24gZmluYWwgc2VsZWN0aW9uJ3Mgc3dhcHBpbmcgb2YgcmV2ZXJzZWRcbiAgICAgIC8vIHZhbHVlcywgaXQgYWxzbyBuZWVkcyB0aGUgeCBjb29yZGluYXRlcyB0byBzd2FwIGluZGVwZW5kZW50bHkgb2YgdGhlIHkgY29vcmRpbmF0ZSBpcyBuZWVkZWRcbiAgICAgIGNvbnN0IHN0YXJ0Q29sID0gc3RhcnRbMF0gPCBlbmRbMF0gPyBzdGFydFswXSA6IGVuZFswXTtcbiAgICAgIGNvbnN0IGVuZENvbCA9IHN0YXJ0WzBdIDwgZW5kWzBdID8gZW5kWzBdIDogc3RhcnRbMF07XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnRbMV07IGkgPD0gZW5kWzFdOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZVRleHQgPSBidWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGksIHRydWUsIHN0YXJ0Q29sLCBlbmRDb2wpO1xuICAgICAgICByZXN1bHQucHVzaChsaW5lVGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdldCBmaXJzdCByb3dcbiAgICAgIGNvbnN0IHN0YXJ0Um93RW5kQ29sID0gc3RhcnRbMV0gPT09IGVuZFsxXSA/IGVuZFswXSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc3VsdC5wdXNoKGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoc3RhcnRbMV0sIHRydWUsIHN0YXJ0WzBdLCBzdGFydFJvd0VuZENvbCkpO1xuXG4gICAgICAvLyBHZXQgbWlkZGxlIHJvd3NcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydFsxXSArIDE7IGkgPD0gZW5kWzFdIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGkpO1xuICAgICAgICBjb25zdCBsaW5lVGV4dCA9IGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoaSwgdHJ1ZSk7XG4gICAgICAgIGlmIChidWZmZXJMaW5lPy5pc1dyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdICs9IGxpbmVUZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGxpbmVUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgZmluYWwgcm93XG4gICAgICBpZiAoc3RhcnRbMV0gIT09IGVuZFsxXSkge1xuICAgICAgICBjb25zdCBidWZmZXJMaW5lID0gYnVmZmVyLmxpbmVzLmdldChlbmRbMV0pO1xuICAgICAgICBjb25zdCBsaW5lVGV4dCA9IGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoZW5kWzFdLCB0cnVlLCAwLCBlbmRbMF0pO1xuICAgICAgICBpZiAoYnVmZmVyTGluZSAmJiBidWZmZXJMaW5lIS5pc1dyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdICs9IGxpbmVUZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGxpbmVUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdCBzdHJpbmcgYnkgcmVwbGFjaW5nIG5vbi1icmVha2luZyBzcGFjZSBjaGFycyB3aXRoIHJlZ3VsYXIgc3BhY2VzXG4gICAgLy8gYW5kIGpvaW5pbmcgdGhlIGFycmF5IGludG8gYSBtdWx0aS1saW5lIHN0cmluZy5cbiAgICBjb25zdCBmb3JtYXR0ZWRSZXN1bHQgPSByZXN1bHQubWFwKGxpbmUgPT4ge1xuICAgICAgcmV0dXJuIGxpbmUucmVwbGFjZShBTExfTk9OX0JSRUFLSU5HX1NQQUNFX1JFR0VYLCAnICcpO1xuICAgIH0pLmpvaW4oQnJvd3Nlci5pc1dpbmRvd3MgPyAnXFxyXFxuJyA6ICdcXG4nKTtcblxuICAgIHJldHVybiBmb3JtYXR0ZWRSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHRlcm1pbmFsIHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhclNlbGVjdGlvbigpO1xuICAgIHRoaXMuX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycygpO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmZpcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZXMgYSByZWZyZXNoLCByZWRyYXdpbmcgdGhlIHNlbGVjdGlvbiBvbiB0aGUgbmV4dCBvcHBvcnR1bml0eS5cbiAgICogQHBhcmFtIGlzTGludXhNb3VzZVNlbGVjdGlvbiBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgYSBuZXdcbiAgICogc2VsZWN0aW9uIG9uIExpbnV4LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goaXNMaW51eE1vdXNlU2VsZWN0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFF1ZXVlIHRoZSByZWZyZXNoIGZvciB0aGUgcmVuZGVyZXJcbiAgICBpZiAoIXRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fcmVmcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSByZWZyZXNoIGNhbGwgY29tZXMgZnJvbSBhIG1vdXNlIGV2ZW50LFxuICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gZm9yIG1pZGRsZSBjbGljayB0byBwYXN0ZSBzZWxlY3Rpb24uXG4gICAgaWYgKEJyb3dzZXIuaXNMaW51eCAmJiBpc0xpbnV4TW91c2VTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvblRleHQgPSB0aGlzLnNlbGVjdGlvblRleHQ7XG4gICAgICBpZiAoc2VsZWN0aW9uVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fb25MaW51eE1vdXNlU2VsZWN0aW9uLmZpcmUodGhpcy5zZWxlY3Rpb25UZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgdGhlIHJlZnJlc2ggZXZlbnQsIGNhdXNpbmcgY29uc3VtZXJzIHRvIHBpY2sgaXQgdXAgYW5kIHJlZHJhdyB0aGVcbiAgICogc2VsZWN0aW9uIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb25SZWRyYXdSZXF1ZXN0LmZpcmUoe1xuICAgICAgc3RhcnQ6IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kLFxuICAgICAgY29sdW1uU2VsZWN0TW9kZTogdGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5DT0xVTU5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgY2xpY2sgd2FzIGluc2lkZSB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfaXNDbGlja0luU2VsZWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcblxuICAgIGlmICghc3RhcnQgfHwgIWVuZCB8fCAhY29vcmRzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FyZUNvb3Jkc0luU2VsZWN0aW9uKGNvb3Jkcywgc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsSW5TZWxlY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQ7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7XG4gICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcmVDb29yZHNJblNlbGVjdGlvbihbeCwgeV0sIHN0YXJ0LCBlbmQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hcmVDb29yZHNJblNlbGVjdGlvbihjb29yZHM6IFtudW1iZXIsIG51bWJlcl0sIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGNvb3Jkc1sxXSA+IHN0YXJ0WzFdICYmIGNvb3Jkc1sxXSA8IGVuZFsxXSkgfHxcbiAgICAgICAgKHN0YXJ0WzFdID09PSBlbmRbMV0gJiYgY29vcmRzWzFdID09PSBzdGFydFsxXSAmJiBjb29yZHNbMF0gPj0gc3RhcnRbMF0gJiYgY29vcmRzWzBdIDwgZW5kWzBdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPCBlbmRbMV0gJiYgY29vcmRzWzFdID09PSBlbmRbMV0gJiYgY29vcmRzWzBdIDwgZW5kWzBdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPCBlbmRbMV0gJiYgY29vcmRzWzFdID09PSBzdGFydFsxXSAmJiBjb29yZHNbMF0gPj0gc3RhcnRbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgd29yZCBhdCB0aGUgY3VycmVudCBtb3VzZSBldmVudCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX3NlbGVjdFdvcmRBdEN1cnNvcihldmVudDogTW91c2VFdmVudCwgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgbGluayB1bmRlciB0aGUgY3Vyc29yIGZpcnN0IGFuZCBzZWxlY3QgdGhhdCBpZiBzb1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fbGlua2lmaWVyLmN1cnJlbnRMaW5rPy5saW5rPy5yYW5nZTtcbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gW3JhbmdlLnN0YXJ0LnggLSAxLCByYW5nZS5zdGFydC55IC0gMV07XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IGdldFJhbmdlTGVuZ3RoKHJhbmdlLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFdvcmRBdChjb29yZHMsIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24pO1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCB0ZXh0IHdpdGhpbiB0aGUgdGVybWluYWwuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsLmlzU2VsZWN0QWxsQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TGluZXMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhclNlbGVjdGlvbigpO1xuICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoIC0gMSk7XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQgPSBbMCwgc3RhcnRdO1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCA9IFt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIGVuZF07XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgYnVmZmVyIGJlaW5nIHRyaW1tZWQsIGFkanVzdCB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdGhlIGJ1ZmZlciBpcyBiZWluZyB0cmltbWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVHJpbShhbW91bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5lZWRzUmVmcmVzaCA9IHRoaXMuX21vZGVsLmhhbmRsZVRyaW0oYW1vdW50KTtcbiAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgMC1iYXNlZCBbeCwgeV0gYnVmZmVyIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IG1vdXNlIGV2ZW50LlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQ6IE1vdXNlRXZlbnQpOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9tb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKGV2ZW50LCB0aGlzLl9zY3JlZW5FbGVtZW50LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cywgdHJ1ZSk7XG4gICAgaWYgKCFjb29yZHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0byAwLWJhc2VkXG4gICAgY29vcmRzWzBdLS07XG4gICAgY29vcmRzWzFdLS07XG5cbiAgICAvLyBDb252ZXJ0IHZpZXdwb3J0IGNvb3JkcyB0byBidWZmZXIgY29vcmRzXG4gICAgY29vcmRzWzFdICs9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgIHJldHVybiBjb29yZHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYW1vdW50IHRoZSB2aWV3cG9ydCBzaG91bGQgYmUgc2Nyb2xsZWQgYmFzZWQgb24gaG93IGZhciBvdXQgb2YgdGhlXG4gICAqIHRlcm1pbmFsIHRoZSBtb3VzZSBpcy5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2dldE1vdXNlRXZlbnRTY3JvbGxBbW91bnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiBudW1iZXIge1xuICAgIGxldCBvZmZzZXQgPSBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LCBldmVudCwgdGhpcy5fc2NyZWVuRWxlbWVudClbMV07XG4gICAgY29uc3QgdGVybWluYWxIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQ7XG4gICAgaWYgKG9mZnNldCA+PSAwICYmIG9mZnNldCA8PSB0ZXJtaW5hbEhlaWdodCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPiB0ZXJtaW5hbEhlaWdodCkge1xuICAgICAgb2Zmc2V0IC09IHRlcm1pbmFsSGVpZ2h0O1xuICAgIH1cblxuICAgIG9mZnNldCA9IE1hdGgubWluKE1hdGgubWF4KG9mZnNldCwgLURSQUdfU0NST0xMX01BWF9USFJFU0hPTEQpLCBEUkFHX1NDUk9MTF9NQVhfVEhSRVNIT0xEKTtcbiAgICBvZmZzZXQgLz0gRFJBR19TQ1JPTExfTUFYX1RIUkVTSE9MRDtcbiAgICByZXR1cm4gKG9mZnNldCAvIE1hdGguYWJzKG9mZnNldCkpICsgTWF0aC5yb3VuZChvZmZzZXQgKiAoRFJBR19TQ1JPTExfTUFYX1NQRUVEIC0gMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgc2hvdWxkIGZvcmNlIHNlbGVjdGlvbiwgcmVnYXJkbGVzcyBvZlxuICAgKiB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBpcyBpbiBtb3VzZSBldmVudHMgbW9kZS5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHB1YmxpYyBzaG91bGRGb3JjZVNlbGVjdGlvbihldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChCcm93c2VyLmlzTWFjKSB7XG4gICAgICByZXR1cm4gZXZlbnQuYWx0S2V5ICYmIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGUgbW91c2Vkb3duIGV2ZW50LCBzZXR0aW5nIHVwIGZvciBhIG5ldyBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2Vkb3duIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX21vdXNlRG93blRpbWVTdGFtcCA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICAvLyBJZiB3ZSBoYXZlIHNlbGVjdGlvbiwgd2Ugd2FudCB0aGUgY29udGV4dCBtZW51IG9uIHJpZ2h0IGNsaWNrIGV2ZW4gaWYgdGhlXG4gICAgLy8gdGVybWluYWwgaXMgaW4gbW91c2UgbW9kZS5cbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyICYmIHRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBhY3Rpb24gdGhlIHByaW1hcnkgYnV0dG9uXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHNlbGVjdGlvbiB3aGVuIHVzaW5nIGEgc3BlY2lmaWMgbW9kaWZpZXIga2V5LCBldmVuIHdoZW4gZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRGb3JjZVNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBzZW5kIHRoZSBtb3VzZSBkb3duIGV2ZW50IHRvIHRoZSBjdXJyZW50IHByb2Nlc3MsIHdlIHdhbnQgdG8gc2VsZWN0XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBUZWxsIHRoZSBicm93c2VyIG5vdCB0byBzdGFydCBhIHJlZ3VsYXIgc2VsZWN0aW9uXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFJlc2V0IGRyYWcgc2Nyb2xsIHN0YXRlXG4gICAgdGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA9IDA7XG5cbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5faGFuZGxlSW5jcmVtZW50YWxDbGljayhldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChldmVudC5kZXRhaWwgPT09IDEpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlU2luZ2xlQ2xpY2soZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5kZXRhaWwgPT09IDIpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5kZXRhaWwgPT09IDMpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVHJpcGxlQ2xpY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FkZE1vdXNlRG93bkxpc3RlbmVycygpO1xuICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGxpc3RlbmVycyB3aGVuIG1vdXNlZG93biBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICBwcml2YXRlIF9hZGRNb3VzZURvd25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuIG9uIHRoZSBkb2N1bWVudCBzbyB0aGF0IGRyYWdnaW5nIG91dHNpZGUgb2Ygdmlld3BvcnQgd29ya3NcbiAgICBpZiAodGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fbW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgdGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9tb3VzZVVwTGlzdGVuZXIpO1xuICAgIH1cbiAgICB0aGlzLl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lciA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5fZHJhZ1Njcm9sbCgpLCBEUkFHX1NDUk9MTF9JTlRFUlZBTCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2hlbiBtb3VzZWRvd24gaXMgdHJpZ2dlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lcik7XG4gICAgdGhpcy5fZHJhZ1Njcm9sbEludGVydmFsVGltZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gaW5jcmVtZW50YWwgY2xpY2ssIHNldHRpbmcgdGhlIHNlbGVjdGlvbiBlbmQgcG9zaXRpb24gdG8gdGhlIG1vdXNlXG4gICAqIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlSW5jcmVtZW50YWxDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCkge1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHNpbmdsZSBjbGljaywgcmVzZXR0aW5nIHJlbGV2YW50IHN0YXRlIGFuZCBzZXR0aW5nIHRoZSBzZWxlY3Rpb25cbiAgICogc3RhcnQgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTaW5nbGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0TGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tb2RlbC5pc1NlbGVjdEFsbEFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgPSB0aGlzLnNob3VsZENvbHVtblNlbGVjdChldmVudCkgPyBTZWxlY3Rpb25Nb2RlLkNPTFVNTiA6IFNlbGVjdGlvbk1vZGUuTk9STUFMO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgbmV3IHNlbGVjdGlvblxuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGlmICghdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBsaW5lIGV4aXN0c1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQodGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMV0pO1xuICAgIGlmICghbGluZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBlYXJseSBpZiB0aGUgY2xpY2sgZXZlbnQgaXMgbm90IGluIHRoZSBidWZmZXIgKGVnLiBpbiBzY3JvbGwgYmFyKVxuICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgc2Vjb25kIGhhbGYgb2YgYSB3aWRlIGNoYXJhY3RlciwgYWRqdXN0IHRoZVxuICAgIC8vIHNlbGVjdGlvbiB0byBjb3ZlciB0aGUgd2hvbGUgY2hhcmFjdGVyXG4gICAgaWYgKGxpbmUuaGFzV2lkdGgodGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMF0pID09PSAwKSB7XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFswXSsrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIGRvdWJsZSBjbGljaywgc2VsZWN0aW5nIHRoZSBjdXJyZW50IHdvcmQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVEb3VibGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZWxlY3RXb3JkQXRDdXJzb3IoZXZlbnQsIHRydWUpKSB7XG4gICAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5XT1JEO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHRyaXBsZSBjbGljaywgc2VsZWN0aW5nIHRoZSBjdXJyZW50IGxpbmUgYW5kIGFjdGl2YXRpbmcgbGluZVxuICAgKiBzZWxlY3QgbW9kZS5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRyaXBsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLkxJTkU7XG4gICAgICB0aGlzLl9zZWxlY3RMaW5lQXQoY29vcmRzWzFdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBzaG91bGQgb3BlcmF0ZSBpbiBjb2x1bW4gc2VsZWN0IG1vZGVcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudFxuICAgKi9cbiAgcHVibGljIHNob3VsZENvbHVtblNlbGVjdChldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlbnQuYWx0S2V5ICYmICEoQnJvd3Nlci5pc01hYyAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLm1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZW1vdmUgZXZlbnQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIGRvd24sIHJlY29yZGluZyB0aGVcbiAgICogZW5kIG9mIHRoZSBzZWxlY3Rpb24gYW5kIHJlZnJlc2hpbmcgdGhlIHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZW1vdmUgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgbW91c2Vtb3ZlIGxpc3RlbmVyIGlzIGFjdGl2ZSBpdCBtZWFucyB0aGF0IGEgc2VsZWN0aW9uIGlzXG4gICAgLy8gY3VycmVudGx5IGJlaW5nIG1hZGUsIHdlIHNob3VsZCBzdG9wIHByb3BhZ2F0aW9uIHRvIHByZXZlbnQgbW91c2UgZXZlbnRzXG4gICAgLy8gdG8gYmUgc2VudCB0byB0aGUgcHR5LlxuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24gc3RhcnQsIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgZmlyc3RcbiAgICAvLyBjbGljayBpbiB0aGUgdGVybWluYWwgaXMgYW4gaW5jcmVtZW50YWwgY2xpY2tcbiAgICBpZiAoIXRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRoZSBwcmV2aW91cyBwb3NpdGlvbiBzbyB3ZSBrbm93IHdoZXRoZXIgdG8gcmVkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICAvLyBhdCB0aGUgZW5kLlxuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uRW5kID0gdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID8gW3RoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSwgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdXSA6IG51bGw7XG5cbiAgICAvLyBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGVuZCBiYXNlZCBvbiB0aGUgbW91c2UgY29vcmRpbmF0ZXNcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgaWYgKCF0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQpIHtcbiAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWxlY3QgdGhlIGVudGlyZSBsaW5lIGlmIGxpbmUgc2VsZWN0IG1vZGUgaXMgYWN0aXZlLlxuICAgIGlmICh0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkxJTkUpIHtcbiAgICAgIGlmICh0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0gPCB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFsxXSkge1xuICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5XT1JEKSB7XG4gICAgICB0aGlzLl9zZWxlY3RUb1dvcmRBdCh0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0aGF0IHdpbGwgaGFwcGVuLlxuICAgIHRoaXMuX2RyYWdTY3JvbGxBbW91bnQgPSB0aGlzLl9nZXRNb3VzZUV2ZW50U2Nyb2xsQW1vdW50KGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3Igd2FzIGFib3ZlIG9yIGJlbG93IHRoZSB2aWV3cG9ydCwgbWFrZSBzdXJlIGl0J3MgYXQgdGhlXG4gICAgLy8gc3RhcnQgb3IgZW5kIG9mIHRoZSB2aWV3cG9ydCByZXNwZWN0aXZlbHkuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW5cbiAgICAvLyBOT1QgaW4gY29sdW1uIHNlbGVjdCBtb2RlLlxuICAgIGlmICh0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlICE9PSBTZWxlY3Rpb25Nb2RlLkNPTFVNTikge1xuICAgICAgaWYgKHRoaXMuX2RyYWdTY3JvbGxBbW91bnQgPiAwKSB7XG4gICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA8IDApIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIGEgd2lkZSBjaGFyYWN0ZXIgaW5jbHVkZSB0aGUgY2VsbCB0byB0aGUgcmlnaHQgaW4gdGhlXG4gICAgLy8gc2VsZWN0aW9uLiBOb3RlIHRoYXQgc2VsZWN0aW9ucyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGxpbmUgd2lsbCBuZXZlclxuICAgIC8vIGhhdmUgYSBjaGFyYWN0ZXIuXG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgaWYgKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSA8IGJ1ZmZlci5saW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBidWZmZXIubGluZXMuZ2V0KHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSk7XG4gICAgICBpZiAobGluZSAmJiBsaW5lLmhhc1dpZHRoKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSkgPT09IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSA8IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBkcmF3IGhlcmUgaWYgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLlxuICAgIGlmICghcHJldmlvdXNTZWxlY3Rpb25FbmQgfHxcbiAgICAgIHByZXZpb3VzU2VsZWN0aW9uRW5kWzBdICE9PSB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gfHxcbiAgICAgIHByZXZpb3VzU2VsZWN0aW9uRW5kWzFdICE9PSB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0pIHtcbiAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRoYXQgb2NjdXJzIGV2ZXJ5IERSQUdfU0NST0xMX0lOVEVSVkFMIG1zIHRoYXQgZG9lcyB0aGVcbiAgICogc2Nyb2xsaW5nIG9mIHRoZSB2aWV3cG9ydC5cbiAgICovXG4gIHByaXZhdGUgX2RyYWdTY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgfHwgIXRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9kcmFnU2Nyb2xsQW1vdW50KSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHsgYW1vdW50OiB0aGlzLl9kcmFnU2Nyb2xsQW1vdW50LCBzdXBwcmVzc1Njcm9sbEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIC8vIFJlLWV2YWx1YXRlIHNlbGVjdGlvblxuICAgICAgLy8gSWYgdGhlIGN1cnNvciB3YXMgYWJvdmUgb3IgYmVsb3cgdGhlIHZpZXdwb3J0LCBtYWtlIHN1cmUgaXQncyBhdCB0aGVcbiAgICAgIC8vIHN0YXJ0IG9yIGVuZCBvZiB0aGUgdmlld3BvcnQgcmVzcGVjdGl2ZWx5LiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuXG4gICAgICAvLyBOT1QgaW4gY29sdW1uIHNlbGVjdCBtb2RlLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgICBpZiAodGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgIT09IFNlbGVjdGlvbk1vZGUuQ09MVU1OKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSA9IE1hdGgubWluKGJ1ZmZlci55ZGlzcCArIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cywgYnVmZmVyLmxpbmVzLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgIT09IFNlbGVjdGlvbk1vZGUuQ09MVU1OKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0gPSBidWZmZXIueWRpc3A7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgbW91c2V1cCBldmVudCwgcmVtb3ZpbmcgdGhlIG1vdXNlZG93biBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2V1cCBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lRWxhcHNlZCA9IGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX21vdXNlRG93blRpbWVTdGFtcDtcblxuICAgIHRoaXMuX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycygpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uVGV4dC5sZW5ndGggPD0gMSAmJiB0aW1lRWxhcHNlZCA8IEFMVF9DTElDS19NT1ZFX0NVUlNPUl9USU1FICYmIGV2ZW50LmFsdEtleSAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmFsdENsaWNrTW92ZXNDdXJzb3IpIHtcbiAgICAgIGlmICh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZSA9PT0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApIHtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSB0aGlzLl9tb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHRoaXMuX2VsZW1lbnQsXG4gICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLFxuICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgICBpZiAoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXNbMF0gIT09IHVuZGVmaW5lZCAmJiBjb29yZGluYXRlc1sxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2UgPSBtb3ZlVG9DZWxsU2VxdWVuY2UoY29vcmRpbmF0ZXNbMF0gLSAxLCBjb29yZGluYXRlc1sxXSAtIDEsIHRoaXMuX2J1ZmZlclNlcnZpY2UsIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMpO1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoc2VxdWVuY2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQ7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gISFzdGFydCAmJiAhIWVuZCAmJiAoc3RhcnRbMF0gIT09IGVuZFswXSB8fCBzdGFydFsxXSAhPT0gZW5kWzFdKTtcblxuICAgIGlmICghaGFzU2VsZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5fb2xkSGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShzdGFydCwgZW5kLCBoYXNTZWxlY3Rpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNhbml0eSBjaGVjaywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQgYXMgdGhlcmUgaXMgYSBzZWxlY3Rpb25cbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX29sZFNlbGVjdGlvblN0YXJ0IHx8ICF0aGlzLl9vbGRTZWxlY3Rpb25FbmQgfHwgKFxuICAgICAgc3RhcnRbMF0gIT09IHRoaXMuX29sZFNlbGVjdGlvblN0YXJ0WzBdIHx8IHN0YXJ0WzFdICE9PSB0aGlzLl9vbGRTZWxlY3Rpb25TdGFydFsxXSB8fFxuICAgICAgZW5kWzBdICE9PSB0aGlzLl9vbGRTZWxlY3Rpb25FbmRbMF0gfHwgZW5kWzFdICE9PSB0aGlzLl9vbGRTZWxlY3Rpb25FbmRbMV0pKSB7XG5cbiAgICAgIHRoaXMuX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShzdGFydCwgZW5kLCBoYXNTZWxlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBoYXNTZWxlY3Rpb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9vbGRTZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX29sZFNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICB0aGlzLl9vbGRIYXNTZWxlY3Rpb24gPSBoYXNTZWxlY3Rpb247XG4gICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQnVmZmVyQWN0aXZhdGUoZToge2FjdGl2ZUJ1ZmZlcjogSUJ1ZmZlciwgaW5hY3RpdmVCdWZmZXI6IElCdWZmZXJ9KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIC8vIE9ubHkgYWRqdXN0IHRoZSBzZWxlY3Rpb24gb24gdHJpbSwgc2hpZnRFbGVtZW50cyBpcyByYXJlbHkgdXNlZCAob25seSBpblxuICAgIC8vIHJldmVyc2VJbmRleCkgYW5kIGRlbGV0ZSBpbiBhIHNwbGljZSBpcyBvbmx5IGV2ZXIgdXNlZCB3aGVuIHRoZSBzYW1lXG4gICAgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHdhcyBqdXN0IGFkZGVkLiBHaXZlbiB0aGlzIGlzIGNvdWxkIGFjdHVhbGx5IGJlXG4gICAgLy8gYmVuZWZpY2lhbCB0byBsZWF2ZSB0aGUgc2VsZWN0aW9uIGFzIGlzIGZvciB0aGVzZSBjYXNlcy5cbiAgICB0aGlzLl90cmltTGlzdGVuZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuX3RyaW1MaXN0ZW5lciA9IGUuYWN0aXZlQnVmZmVyLmxpbmVzLm9uVHJpbShhbW91bnQgPT4gdGhpcy5faGFuZGxlVHJpbShhbW91bnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZpZXdwb3J0IGNvbHVtbiAoMCB0byBjb2xzIC0gMSkgdG8gdGhlIGNoYXJhY3RlciBpbmRleCBvbiB0aGVcbiAgICogYnVmZmVyIGxpbmUsIHRoZSBsYXR0ZXIgdGFrZXMgaW50byBhY2NvdW50IHdpZGUgYW5kIG51bGwgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIGJ1ZmZlckxpbmUgVGhlIGJ1ZmZlciBsaW5lIHRvIHVzZS5cbiAgICogQHBhcmFtIHggVGhlIHggaW5kZXggaW4gdGhlIGJ1ZmZlciBsaW5lIHRvIGNvbnZlcnQuXG4gICAqL1xuICBwcml2YXRlIF9jb252ZXJ0Vmlld3BvcnRDb2xUb0NoYXJhY3RlckluZGV4KGJ1ZmZlckxpbmU6IElCdWZmZXJMaW5lLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBjaGFySW5kZXggPSB4O1xuICAgIGZvciAobGV0IGkgPSAwOyB4ID49IGk7IGkrKykge1xuICAgICAgY29uc3QgbGVuZ3RoID0gYnVmZmVyTGluZS5sb2FkQ2VsbChpLCB0aGlzLl93b3JrQ2VsbCkuZ2V0Q2hhcnMoKS5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICAvLyBXaWRlIGNoYXJhY3RlcnMgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBsaW5lIHN0cmluZyBzbyBkZWNyZW1lbnQgdGhlXG4gICAgICAgIC8vIGluZGV4IHNvIHRoZSBpbmRleCBpcyBiYWNrIG9uIHRoZSB3aWRlIGNoYXJhY3Rlci5cbiAgICAgICAgY2hhckluZGV4LS07XG4gICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDEgJiYgeCAhPT0gaSkge1xuICAgICAgICAvLyBFbW9qaXMgdGFrZSB1cCBtdWx0aXBsZSBjaGFyYWN0ZXJzLCBzbyBhZGp1c3QgYWNjb3JkaW5nbHkuIEZvciB0aGVzZVxuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IG90IGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgY29sdW1uIGFzIHdlJ3JlXG4gICAgICAgIC8vIHJldHVybmluZyB0aGUgc3RhcnQgaW5kZXggaW4gdGhlIHN0cmluZywgbm90IHRoZSBlbmQgaW5kZXguXG4gICAgICAgIGNoYXJJbmRleCArPSBsZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhckluZGV4O1xuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGlvbihjb2w6IG51bWJlciwgcm93OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kZWwuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB0aGlzLl9yZW1vdmVNb3VzZURvd25MaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFtjb2wsIHJvd107XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRMZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5fZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgcmlnaHRDbGlja1NlbGVjdChldjogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNDbGlja0luU2VsZWN0aW9uKGV2KSkge1xuICAgICAgaWYgKHRoaXMuX3NlbGVjdFdvcmRBdEN1cnNvcihldiwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBvc2l0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSB3b3JkIGF0IHRoZSBjb29yZGluYXRlZCBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSBjb29yZHMgVGhlIGNvb3JkaW5hdGVzIHRvIGdldCB0aGUgd29yZCBhdC5cbiAgICovXG4gIHByaXZhdGUgX2dldFdvcmRBdChjb29yZHM6IFtudW1iZXIsIG51bWJlcl0sIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb246IGJvb2xlYW4sIGZvbGxvd1dyYXBwZWRMaW5lc0Fib3ZlOiBib29sZWFuID0gdHJ1ZSwgZm9sbG93V3JhcHBlZExpbmVzQmVsb3c6IGJvb2xlYW4gPSB0cnVlKTogSVdvcmRQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gRW5zdXJlIGNvb3JkcyBhcmUgd2l0aGluIHZpZXdwb3J0IChlZy4gbm90IHdpdGhpbiBzY3JvbGwgYmFyKVxuICAgIGlmIChjb29yZHNbMF0gPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGNvb3Jkc1sxXSk7XG4gICAgaWYgKCFidWZmZXJMaW5lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmUgPSBidWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGNvb3Jkc1sxXSwgZmFsc2UpO1xuXG4gICAgLy8gR2V0IGFjdHVhbCBpbmRleCwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiB3aWRlIGNoYXJhY3RlcnNcbiAgICBsZXQgc3RhcnRJbmRleCA9IHRoaXMuX2NvbnZlcnRWaWV3cG9ydENvbFRvQ2hhcmFjdGVySW5kZXgoYnVmZmVyTGluZSwgY29vcmRzWzBdKTtcbiAgICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4O1xuXG4gICAgLy8gUmVjb3JkIG9mZnNldCB0byBiZSB1c2VkIGxhdGVyXG4gICAgY29uc3QgY2hhck9mZnNldCA9IGNvb3Jkc1swXSAtIHN0YXJ0SW5kZXg7XG4gICAgbGV0IGxlZnRXaWRlQ2hhckNvdW50ID0gMDtcbiAgICBsZXQgcmlnaHRXaWRlQ2hhckNvdW50ID0gMDtcbiAgICBsZXQgbGVmdExvbmdDaGFyT2Zmc2V0ID0gMDtcbiAgICBsZXQgcmlnaHRMb25nQ2hhck9mZnNldCA9IDA7XG5cbiAgICBpZiAobGluZS5jaGFyQXQoc3RhcnRJbmRleCkgPT09ICcgJykge1xuICAgICAgLy8gRXhwYW5kIHVudGlsIG5vbi13aGl0ZXNwYWNlIGlzIGhpdFxuICAgICAgd2hpbGUgKHN0YXJ0SW5kZXggPiAwICYmIGxpbmUuY2hhckF0KHN0YXJ0SW5kZXggLSAxKSA9PT0gJyAnKSB7XG4gICAgICAgIHN0YXJ0SW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbmRJbmRleCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGVuZEluZGV4ICsgMSkgPT09ICcgJykge1xuICAgICAgICBlbmRJbmRleCsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFeHBhbmQgdW50aWwgd2hpdGVzcGFjZSBpcyBoaXQuIFRoaXMgYWxnb3JpdGhtIHdvcmtzIGJ5IHNjYW5uaW5nIGxlZnRcbiAgICAgIC8vIGFuZCByaWdodCBmcm9tIHRoZSBzdGFydGluZyBwb3NpdGlvbiwga2VlcGluZyBib3RoIHRoZSBpbmRleCBmb3JtYXRcbiAgICAgIC8vIChsaW5lKSBhbmQgdGhlIGNvbHVtbiBmb3JtYXQgKGJ1ZmZlckxpbmUpIGluIHN5bmMuIFdoZW4gYSB3aWRlXG4gICAgICAvLyBjaGFyYWN0ZXIgaXMgaGl0LCBpdCBpcyByZWNvcmRlZCBhbmQgdGhlIGNvbHVtbiBpbmRleCBpcyBhZGp1c3RlZC5cbiAgICAgIGxldCBzdGFydENvbCA9IGNvb3Jkc1swXTtcbiAgICAgIGxldCBlbmRDb2wgPSBjb29yZHNbMF07XG5cbiAgICAgIC8vIENvbnNpZGVyIHRoZSBpbml0aWFsIHBvc2l0aW9uLCBza2lwIGl0IGFuZCBpbmNyZW1lbnQgdGhlIHdpZGUgY2hhclxuICAgICAgLy8gdmFyaWFibGVcbiAgICAgIGlmIChidWZmZXJMaW5lLmdldFdpZHRoKHN0YXJ0Q29sKSA9PT0gMCkge1xuICAgICAgICBsZWZ0V2lkZUNoYXJDb3VudCsrO1xuICAgICAgICBzdGFydENvbC0tO1xuICAgICAgfVxuICAgICAgaWYgKGJ1ZmZlckxpbmUuZ2V0V2lkdGgoZW5kQ29sKSA9PT0gMikge1xuICAgICAgICByaWdodFdpZGVDaGFyQ291bnQrKztcbiAgICAgICAgZW5kQ29sKys7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgZW5kIGluZGV4IGZvciBjaGFyYWN0ZXJzIHdob3NlIGxlbmd0aCBhcmUgPiAxIChlbW9qaXMpXG4gICAgICBjb25zdCBsZW5ndGggPSBidWZmZXJMaW5lLmdldFN0cmluZyhlbmRDb2wpLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgIHJpZ2h0TG9uZ0NoYXJPZmZzZXQgKz0gbGVuZ3RoIC0gMTtcbiAgICAgICAgZW5kSW5kZXggKz0gbGVuZ3RoIC0gMTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhwYW5kIHRoZSBzdHJpbmcgaW4gYm90aCBkaXJlY3Rpb25zIHVudGlsIGEgc3BhY2UgaXMgaGl0XG4gICAgICB3aGlsZSAoc3RhcnRDb2wgPiAwICYmIHN0YXJ0SW5kZXggPiAwICYmICF0aGlzLl9pc0NoYXJXb3JkU2VwYXJhdG9yKGJ1ZmZlckxpbmUubG9hZENlbGwoc3RhcnRDb2wgLSAxLCB0aGlzLl93b3JrQ2VsbCkpKSB7XG4gICAgICAgIGJ1ZmZlckxpbmUubG9hZENlbGwoc3RhcnRDb2wgLSAxLCB0aGlzLl93b3JrQ2VsbCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX3dvcmtDZWxsLmdldENoYXJzKCkubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIHdpZGUgY2hhciwgcmVjb3JkIGl0IGFuZCBza2lwIHRoZSBjb2x1bW5cbiAgICAgICAgICBsZWZ0V2lkZUNoYXJDb3VudCsrO1xuICAgICAgICAgIHN0YXJ0Q29sLS07XG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlcidzIHN0cmluZyBpcyBsb25nZXIgdGhhbiAxIGNoYXIgKGVnLiBlbW9qaSksXG4gICAgICAgICAgLy8gYWRqdXN0IHRoZSBpbmRleFxuICAgICAgICAgIGxlZnRMb25nQ2hhck9mZnNldCArPSBsZW5ndGggLSAxO1xuICAgICAgICAgIHN0YXJ0SW5kZXggLT0gbGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydEluZGV4LS07XG4gICAgICAgIHN0YXJ0Q29sLS07XG4gICAgICB9XG4gICAgICB3aGlsZSAoZW5kQ29sIDwgYnVmZmVyTGluZS5sZW5ndGggJiYgZW5kSW5kZXggKyAxIDwgbGluZS5sZW5ndGggJiYgIXRoaXMuX2lzQ2hhcldvcmRTZXBhcmF0b3IoYnVmZmVyTGluZS5sb2FkQ2VsbChlbmRDb2wgKyAxLCB0aGlzLl93b3JrQ2VsbCkpKSB7XG4gICAgICAgIGJ1ZmZlckxpbmUubG9hZENlbGwoZW5kQ29sICsgMSwgdGhpcy5fd29ya0NlbGwpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl93b3JrQ2VsbC5nZXRDaGFycygpLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtDZWxsLmdldFdpZHRoKCkgPT09IDIpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSB3aWRlIGNoYXIsIHJlY29yZCBpdCBhbmQgc2tpcCB0aGUgY29sdW1uXG4gICAgICAgICAgcmlnaHRXaWRlQ2hhckNvdW50Kys7XG4gICAgICAgICAgZW5kQ29sKys7XG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlcidzIHN0cmluZyBpcyBsb25nZXIgdGhhbiAxIGNoYXIgKGVnLiBlbW9qaSksXG4gICAgICAgICAgLy8gYWRqdXN0IHRoZSBpbmRleFxuICAgICAgICAgIHJpZ2h0TG9uZ0NoYXJPZmZzZXQgKz0gbGVuZ3RoIC0gMTtcbiAgICAgICAgICBlbmRJbmRleCArPSBsZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgICAgIGVuZENvbCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluY3JlbWVuZXQgdGhlIGVuZCBpbmRleCBzbyBpdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY2hhcmFjdGVyXG4gICAgZW5kSW5kZXgrKztcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnQgX2NvbHVtbl8sIGNvbnZlcnRpbmcgdGhlIHRoZSBzdHJpbmcgaW5kZXhlcyBiYWNrIHRvXG4gICAgLy8gY29sdW1uIGNvb3JkaW5hdGVzLlxuICAgIGxldCBzdGFydCA9XG4gICAgICAgIHN0YXJ0SW5kZXggLy8gVGhlIGluZGV4IG9mIHRoZSBzZWxlY3Rpb24ncyBzdGFydCBjaGFyIGluIHRoZSBsaW5lIHN0cmluZ1xuICAgICAgICArIGNoYXJPZmZzZXQgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5pdGlhbCBjaGFyJ3MgY29sdW1uIGFuZCBpbmRleFxuICAgICAgICAtIGxlZnRXaWRlQ2hhckNvdW50IC8vIFRoZSBudW1iZXIgb2Ygd2lkZSBjaGFycyBsZWZ0IG9mIHRoZSBpbml0aWFsIGNoYXJcbiAgICAgICAgKyBsZWZ0TG9uZ0NoYXJPZmZzZXQ7IC8vIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjaGFycyBsZWZ0IG9mIHRoZSBpbml0aWFsIGNoYXIgYWRkZWQgYnkgY29sdW1ucyB3aXRoIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMSAoZW1vamlzKVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggaW4gX2NvbHVtbnNfLCBjb252ZXJ0aW5nIHRoZSB0aGUgc3RyaW5nIGluZGV4ZXMgYmFja1xuICAgIC8vIHRvIGNvbHVtbiBjb29yZGluYXRlcy5cbiAgICBsZXQgbGVuZ3RoID0gTWF0aC5taW4odGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCAvLyBEaXNhbGxvdyBsZW5ndGhzIGxhcmdlciB0aGFuIHRoZSB0ZXJtaW5hbCBjb2xzXG4gICAgICBlbmRJbmRleCAvLyBUaGUgaW5kZXggb2YgdGhlIHNlbGVjdGlvbidzIGVuZCBjaGFyIGluIHRoZSBsaW5lIHN0cmluZ1xuICAgICAgLSBzdGFydEluZGV4IC8vIFRoZSBpbmRleCBvZiB0aGUgc2VsZWN0aW9uJ3Mgc3RhcnQgY2hhciBpbiB0aGUgbGluZSBzdHJpbmdcbiAgICAgICsgbGVmdFdpZGVDaGFyQ291bnQgLy8gVGhlIG51bWJlciBvZiB3aWRlIGNoYXJzIGxlZnQgb2YgdGhlIGluaXRpYWwgY2hhclxuICAgICAgKyByaWdodFdpZGVDaGFyQ291bnQgLy8gVGhlIG51bWJlciBvZiB3aWRlIGNoYXJzIHJpZ2h0IG9mIHRoZSBpbml0aWFsIGNoYXIgKGluY2x1c2l2ZSlcbiAgICAgIC0gbGVmdExvbmdDaGFyT2Zmc2V0IC8vIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjaGFycyBsZWZ0IG9mIHRoZSBpbml0aWFsIGNoYXIgYWRkZWQgYnkgY29sdW1ucyB3aXRoIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMSAoZW1vamlzKVxuICAgICAgLSByaWdodExvbmdDaGFyT2Zmc2V0KTsgLy8gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNoYXJzIHJpZ2h0IG9mIHRoZSBpbml0aWFsIGNoYXIgKGluY2x1c2l2ZSkgYWRkZWQgYnkgY29sdW1ucyB3aXRoIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMSAoZW1vamlzKVxuXG4gICAgaWYgKCFhbGxvd1doaXRlc3BhY2VPbmx5U2VsZWN0aW9uICYmIGxpbmUuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gUmVjdXJzZSB1cHdhcmRzIGlmIHRoZSBsaW5lIGlzIHdyYXBwZWQgYW5kIHRoZSB3b3JkIHdyYXBzIHRvIHRoZSBhYm92ZSBsaW5lXG4gICAgaWYgKGZvbGxvd1dyYXBwZWRMaW5lc0Fib3ZlKSB7XG4gICAgICBpZiAoc3RhcnQgPT09IDAgJiYgYnVmZmVyTGluZS5nZXRDb2RlUG9pbnQoMCkgIT09IDMyIC8qICcgJyAqLykge1xuICAgICAgICBjb25zdCBwcmV2aW91c0J1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGNvb3Jkc1sxXSAtIDEpO1xuICAgICAgICBpZiAocHJldmlvdXNCdWZmZXJMaW5lICYmIGJ1ZmZlckxpbmUuaXNXcmFwcGVkICYmIHByZXZpb3VzQnVmZmVyTGluZS5nZXRDb2RlUG9pbnQodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSkgIT09IDMyIC8qICcgJyAqLykge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzTGluZVdvcmRQb3NpdGlvbiA9IHRoaXMuX2dldFdvcmRBdChbdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSwgY29vcmRzWzFdIC0gMV0sIGZhbHNlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgaWYgKHByZXZpb3VzTGluZVdvcmRQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gcHJldmlvdXNMaW5lV29yZFBvc2l0aW9uLnN0YXJ0O1xuICAgICAgICAgICAgc3RhcnQgLT0gb2Zmc2V0O1xuICAgICAgICAgICAgbGVuZ3RoICs9IG9mZnNldDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWN1cnNlIGRvd253YXJkcyBpZiB0aGUgbGluZSBpcyB3cmFwcGVkIGFuZCB0aGUgd29yZCB3cmFwcyB0byB0aGUgbmV4dCBsaW5lXG4gICAgaWYgKGZvbGxvd1dyYXBwZWRMaW5lc0JlbG93KSB7XG4gICAgICBpZiAoc3RhcnQgKyBsZW5ndGggPT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAmJiBidWZmZXJMaW5lLmdldENvZGVQb2ludCh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKSAhPT0gMzIgLyogJyAnICovKSB7XG4gICAgICAgIGNvbnN0IG5leHRCdWZmZXJMaW5lID0gYnVmZmVyLmxpbmVzLmdldChjb29yZHNbMV0gKyAxKTtcbiAgICAgICAgaWYgKG5leHRCdWZmZXJMaW5lPy5pc1dyYXBwZWQgJiYgbmV4dEJ1ZmZlckxpbmUuZ2V0Q29kZVBvaW50KDApICE9PSAzMiAvKiAnICcgKi8pIHtcbiAgICAgICAgICBjb25zdCBuZXh0TGluZVdvcmRQb3NpdGlvbiA9IHRoaXMuX2dldFdvcmRBdChbMCwgY29vcmRzWzFdICsgMV0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKG5leHRMaW5lV29yZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gbmV4dExpbmVXb3JkUG9zaXRpb24ubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0LCBsZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSB3b3JkIGF0IHRoZSBjb29yZGluYXRlcyBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSBjb29yZHMgVGhlIGNvb3JkaW5hdGVzIHRvIGdldCB0aGUgd29yZCBhdC5cbiAgICogQHBhcmFtIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24gSWYgd2hpdGVzcGFjZSBzaG91bGQgYmUgc2VsZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBfc2VsZWN0V29yZEF0KGNvb3JkczogW251bWJlciwgbnVtYmVyXSwgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmRQb3NpdGlvbiA9IHRoaXMuX2dldFdvcmRBdChjb29yZHMsIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24pO1xuICAgIGlmICh3b3JkUG9zaXRpb24pIHtcbiAgICAgIC8vIEFkanVzdCBuZWdhdGl2ZSBzdGFydCB2YWx1ZVxuICAgICAgd2hpbGUgKHdvcmRQb3NpdGlvbi5zdGFydCA8IDApIHtcbiAgICAgICAgd29yZFBvc2l0aW9uLnN0YXJ0ICs9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICAgICAgY29vcmRzWzFdLS07XG4gICAgICB9XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFt3b3JkUG9zaXRpb24uc3RhcnQsIGNvb3Jkc1sxXV07XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IHdvcmRQb3NpdGlvbi5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdGlvbiBlbmQgdG8gdGhlIHdvcmQgYXQgdGhlIGNvb3JkaW5hdGVkIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGNvb3JkcyBUaGUgY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSB3b3JkIGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0VG9Xb3JkQXQoY29vcmRzOiBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgY29uc3Qgd29yZFBvc2l0aW9uID0gdGhpcy5fZ2V0V29yZEF0KGNvb3JkcywgdHJ1ZSk7XG4gICAgaWYgKHdvcmRQb3NpdGlvbikge1xuICAgICAgbGV0IGVuZFJvdyA9IGNvb3Jkc1sxXTtcblxuICAgICAgLy8gQWRqdXN0IG5lZ2F0aXZlIHN0YXJ0IHZhbHVlXG4gICAgICB3aGlsZSAod29yZFBvc2l0aW9uLnN0YXJ0IDwgMCkge1xuICAgICAgICB3b3JkUG9zaXRpb24uc3RhcnQgKz0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgICBlbmRSb3ctLTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHdyYXBwZWQgbGVuZ3RoIHZhbHVlLCB0aGlzIG9ubHkgbmVlZHMgdG8gaGFwcGVuIHdoZW4gdmFsdWVzIGFyZSByZXZlcnNlZCBhcyBpbiB0aGF0XG4gICAgICAvLyBjYXNlIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkLCBub3QgdGhlIGVuZFxuICAgICAgaWYgKCF0aGlzLl9tb2RlbC5hcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCgpKSB7XG4gICAgICAgIHdoaWxlICh3b3JkUG9zaXRpb24uc3RhcnQgKyB3b3JkUG9zaXRpb24ubGVuZ3RoID4gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgICAgd29yZFBvc2l0aW9uLmxlbmd0aCAtPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICAgICAgZW5kUm93Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gW3RoaXMuX21vZGVsLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkgPyB3b3JkUG9zaXRpb24uc3RhcnQgOiB3b3JkUG9zaXRpb24uc3RhcnQgKyB3b3JkUG9zaXRpb24ubGVuZ3RoLCBlbmRSb3ddO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIGEgd29yZCBzZXBhcmF0b3IgYnkgdGhlIHNlbGVjdFxuICAgKiB3b3JkIGxvZ2ljLlxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCB0byBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgX2lzQ2hhcldvcmRTZXBhcmF0b3IoY2VsbDogQ2VsbERhdGEpOiBib29sZWFuIHtcbiAgICAvLyBaZXJvIHdpZHRoIGNoYXJhY3RlcnMgYXJlIG5ldmVyIHNlcGFyYXRvcnMgYXMgdGhleSBhcmUgYWx3YXlzIHRvIHRoZVxuICAgIC8vIHJpZ2h0IG9mIHdpZGUgY2hhcmFjdGVyc1xuICAgIGlmIChjZWxsLmdldFdpZHRoKCkgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud29yZFNlcGFyYXRvci5pbmRleE9mKGNlbGwuZ2V0Q2hhcnMoKSkgPj0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBsaW5lIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgaW5kZXguXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NlbGVjdExpbmVBdChsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3cmFwcGVkUmFuZ2UgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5nZXRXcmFwcGVkUmFuZ2VGb3JMaW5lKGxpbmUpO1xuICAgIGNvbnN0IHJhbmdlOiBJQnVmZmVyUmFuZ2UgPSB7XG4gICAgICBzdGFydDogeyB4OiAwLCB5OiB3cmFwcGVkUmFuZ2UuZmlyc3QgfSxcbiAgICAgIGVuZDogeyB4OiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxLCB5OiB3cmFwcGVkUmFuZ2UubGFzdCB9XG4gICAgfTtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFswLCB3cmFwcGVkUmFuZ2UuZmlyc3RdO1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IGdldFJhbmdlTGVuZ3RoKHJhbmdlLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMsIElSZW5kZXJlciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDb2xvclNldCwgSUxpbmssIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZWRyYXdSZXF1ZXN0RXZlbnQgYXMgSVNlbGVjdGlvblJlcXVlc3RSZWRyYXdFdmVudCwgSVNlbGVjdGlvblJlcXVlc3RTY3JvbGxMaW5lc0V2ZW50IH0gZnJvbSAnYnJvd3Nlci9zZWxlY3Rpb24vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRGVjb3JhdG9yIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBBbGxDb2xvckluZGV4LCBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmV4cG9ydCBjb25zdCBJQ2hhclNpemVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDaGFyU2l6ZVNlcnZpY2U+KCdDaGFyU2l6ZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJTaXplU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuICByZWFkb25seSBoYXNWYWxpZFNpemU6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgb25DaGFyU2l6ZUNoYW5nZTogSUV2ZW50PHZvaWQ+O1xuXG4gIG1lYXN1cmUoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlQnJvd3NlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVCcm93c2VyU2VydmljZT4oJ0NvcmVCcm93c2VyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZUJyb3dzZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgaXNGb2N1c2VkOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG9uRHByQ2hhbmdlOiBJRXZlbnQ8bnVtYmVyPjtcbiAgcmVhZG9ubHkgb25XaW5kb3dDaGFuZ2U6IElFdmVudDxXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcz47XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcGFyZW50IHdpbmRvdyB0aGF0IHRoZSB0ZXJtaW5hbCBpcyByZW5kZXJlZCBpbnRvLiBET00gYW5kIHJlbmRlcmluZyBBUElzIChlLmcuXG4gICAqIHJlcXVlc3RBbmltYXRpb25GcmFtZSkgc2hvdWxkIGJlIGludm9rZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyB3aW5kb3cuIFRoaXMgc2hvdWxkIGJlIHNldCB3aGVuXG4gICAqIHRoZSB3aW5kb3cgaG9zdGluZyB0aGUgeHRlcm0uanMgaW5zdGFuY2UgY2hhbmdlcy5cbiAgICovXG4gIHdpbmRvdzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXM7XG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnQgb2YgdGhlIHByaW1hcnkgd2luZG93IHRvIGJlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHdoZW4gd29ya2luZyB3aXRoIG11bHRpcGxlXG4gICAqIHdpbmRvd3MuIFRoaXMgaXMgZGVmaW5lZCBieSB0aGUgZG9jdW1lbnRPdmVycmlkZSBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFpbkRvY3VtZW50OiBEb2N1bWVudDtcbiAgLyoqXG4gICAqIEhlbHBlciBmb3IgZ2V0dGluZyB0aGUgZGV2aWNlUGl4ZWxSYXRpbyBvZiB0aGUgcGFyZW50IHdpbmRvdy5cbiAgICovXG4gIHJlYWRvbmx5IGRwcjogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgSU1vdXNlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJTW91c2VTZXJ2aWNlPignTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElNb3VzZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBnZXRDb29yZHMoZXZlbnQ6IHtjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcn0sIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2xDb3VudDogbnVtYmVyLCByb3dDb3VudDogbnVtYmVyLCBpc1NlbGVjdGlvbj86IGJvb2xlYW4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBnZXRNb3VzZVJlcG9ydENvb3JkcyhldmVudDogTW91c2VFdmVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB7IGNvbDogbnVtYmVyLCByb3c6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNvbnN0IElSZW5kZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElSZW5kZXJTZXJ2aWNlPignUmVuZGVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJUmVuZGVyU2VydmljZSBleHRlbmRzIElEaXNwb3NhYmxlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgb25EaW1lbnNpb25zQ2hhbmdlOiBJRXZlbnQ8SVJlbmRlckRpbWVuc2lvbnM+O1xuICAvKipcbiAgICogRmlyZXMgd2hlbiBidWZmZXIgY2hhbmdlcyBhcmUgcmVuZGVyZWQuIFRoaXMgZG9lcyBub3QgZmlyZSB3aGVuIG9ubHkgY3Vyc29yXG4gICAqIG9yIHNlbGVjdGlvbnMgYXJlIHJlbmRlcmVkLlxuICAgKi9cbiAgb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlOiBJRXZlbnQ8eyBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciB9PjtcbiAgLyoqXG4gICAqIEZpcmVzIG9uIHJlbmRlclxuICAgKi9cbiAgb25SZW5kZXI6IElFdmVudDx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+O1xuICBvblJlZnJlc2hSZXF1ZXN0OiBJRXZlbnQ8eyBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciB9PjtcblxuICBkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICBhZGRSZWZyZXNoQ2FsbGJhY2soY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyO1xuXG4gIHJlZnJlc2hSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZDtcbiAgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZDtcbiAgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZDtcbiAgaGFzUmVuZGVyZXIoKTogYm9vbGVhbjtcbiAgc2V0UmVuZGVyZXIocmVuZGVyZXI6IElSZW5kZXJlcik6IHZvaWQ7XG4gIGhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTogdm9pZDtcbiAgaGFuZGxlUmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZDtcbiAgaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCk6IHZvaWQ7XG4gIGhhbmRsZUJsdXIoKTogdm9pZDtcbiAgaGFuZGxlRm9jdXMoKTogdm9pZDtcbiAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZDtcbiAgaGFuZGxlQ3Vyc29yTW92ZSgpOiB2b2lkO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSVNlbGVjdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVNlbGVjdGlvblNlcnZpY2U+KCdTZWxlY3Rpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBoYXNTZWxlY3Rpb246IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzZWxlY3Rpb25FbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgb25MaW51eE1vdXNlU2VsZWN0aW9uOiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25SZXF1ZXN0UmVkcmF3OiBJRXZlbnQ8SVNlbGVjdGlvblJlcXVlc3RSZWRyYXdFdmVudD47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbExpbmVzOiBJRXZlbnQ8SVNlbGVjdGlvblJlcXVlc3RTY3JvbGxMaW5lc0V2ZW50PjtcbiAgcmVhZG9ubHkgb25TZWxlY3Rpb25DaGFuZ2U6IElFdmVudDx2b2lkPjtcblxuICBkaXNhYmxlKCk6IHZvaWQ7XG4gIGVuYWJsZSgpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICBzZXRTZWxlY3Rpb24ocm93OiBudW1iZXIsIGNvbDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IHZvaWQ7XG4gIHNlbGVjdEFsbCgpOiB2b2lkO1xuICBzZWxlY3RMaW5lcyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQ7XG4gIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQ7XG4gIHJpZ2h0Q2xpY2tTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkO1xuICBzaG91bGRDb2x1bW5TZWxlY3QoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogYm9vbGVhbjtcbiAgc2hvdWxkRm9yY2VTZWxlY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuO1xuICByZWZyZXNoKGlzTGludXhNb3VzZVNlbGVjdGlvbj86IGJvb2xlYW4pOiB2b2lkO1xuICBoYW5kbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkO1xuICBpc0NlbGxJblNlbGVjdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ2hhcmFjdGVySm9pbmVyU2VydmljZT4oJ0NoYXJhY3RlckpvaW5lclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJhY3RlckpvaW5lclNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWdpc3RlcihoYW5kbGVyOiAodGV4dDogc3RyaW5nKSA9PiBbbnVtYmVyLCBudW1iZXJdW10pOiBudW1iZXI7XG4gIGRlcmVnaXN0ZXIoam9pbmVySWQ6IG51bWJlcik6IGJvb2xlYW47XG4gIGdldEpvaW5lZENoYXJhY3RlcnMocm93OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdW107XG59XG5cbmV4cG9ydCBjb25zdCBJVGhlbWVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElUaGVtZVNlcnZpY2U+KCdUaGVtZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVRoZW1lU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGNvbG9yczogUmVhZG9ubHlDb2xvclNldDtcblxuICByZWFkb25seSBvbkNoYW5nZUNvbG9yczogSUV2ZW50PFJlYWRvbmx5Q29sb3JTZXQ+O1xuXG4gIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBBbGxvd3MgZXh0ZXJuYWwgbW9kaWZ5aW5nIG9mIGNvbG9ycyBpbiB0aGUgdGhlbWUsIHRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIHtAbGluayBjb2xvcnN9IHRvXG4gICAqIHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMuXG4gICAqL1xuICBtb2RpZnlDb2xvcnMoY2FsbGJhY2s6IChjb2xvcnM6IElDb2xvclNldCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cblxuZXhwb3J0IGNvbnN0IElMaW5rUHJvdmlkZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMaW5rUHJvdmlkZXJTZXJ2aWNlPignTGlua1Byb3ZpZGVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTGlua1Byb3ZpZGVyU2VydmljZSBleHRlbmRzIElEaXNwb3NhYmxlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGxpbmtQcm92aWRlcnM6IFJlYWRvbmx5QXJyYXk8SUxpbmtQcm92aWRlcj47XG4gIHJlZ2lzdGVyTGlua1Byb3ZpZGVyKGxpbmtQcm92aWRlcjogSUxpbmtQcm92aWRlcik6IElEaXNwb3NhYmxlO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTGlua1Byb3ZpZGVyIHtcbiAgcHJvdmlkZUxpbmtzKHk6IG51bWJlciwgY2FsbGJhY2s6IChsaW5rczogSUxpbmtbXSB8IHVuZGVmaW5lZCkgPT4gdm9pZCk6IHZvaWQ7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlJztcbmltcG9ydCB7IElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUsIElDb2xvclNldCwgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yLCBjc3MsIE5VTExfQ09MT1IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJT3B0aW9uc1NlcnZpY2UsIElUaGVtZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBBbGxDb2xvckluZGV4LCBJQ29sb3IsIFNwZWNpYWxDb2xvckluZGV4IH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElSZXN0b3JlQ29sb3JTZXQge1xuICBmb3JlZ3JvdW5kOiBJQ29sb3I7XG4gIGJhY2tncm91bmQ6IElDb2xvcjtcbiAgY3Vyc29yOiBJQ29sb3I7XG4gIGFuc2k6IElDb2xvcltdO1xufVxuXG5cbmNvbnN0IERFRkFVTFRfRk9SRUdST1VORCA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0JBQ0tHUk9VTkQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9DVVJTT1IgPSBjc3MudG9Db2xvcignI2ZmZmZmZicpO1xuY29uc3QgREVGQVVMVF9DVVJTT1JfQUNDRU5UID0gY3NzLnRvQ29sb3IoJyMwMDAwMDAnKTtcbmNvbnN0IERFRkFVTFRfU0VMRUNUSU9OID0ge1xuICBjc3M6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyknLFxuICByZ2JhOiAweEZGRkZGRjREXG59O1xuXG4vLyBBbiBJSUZFIHRvIGdlbmVyYXRlIERFRkFVTFRfQU5TSV9DT0xPUlMuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTlNJX0NPTE9SUyA9IE9iamVjdC5mcmVlemUoKCgpID0+IHtcbiAgY29uc3QgY29sb3JzID0gW1xuICAgIC8vIGRhcms6XG4gICAgY3NzLnRvQ29sb3IoJyMyZTM0MzYnKSxcbiAgICBjc3MudG9Db2xvcignI2NjMDAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNGU5YTA2JyksXG4gICAgY3NzLnRvQ29sb3IoJyNjNGEwMDAnKSxcbiAgICBjc3MudG9Db2xvcignIzM0NjVhNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNzU1MDdiJyksXG4gICAgY3NzLnRvQ29sb3IoJyMwNjk4OWEnKSxcbiAgICBjc3MudG9Db2xvcignI2QzZDdjZicpLFxuICAgIC8vIGJyaWdodDpcbiAgICBjc3MudG9Db2xvcignIzU1NTc1MycpLFxuICAgIGNzcy50b0NvbG9yKCcjZWYyOTI5JyksXG4gICAgY3NzLnRvQ29sb3IoJyM4YWUyMzQnKSxcbiAgICBjc3MudG9Db2xvcignI2ZjZTk0ZicpLFxuICAgIGNzcy50b0NvbG9yKCcjNzI5ZmNmJyksXG4gICAgY3NzLnRvQ29sb3IoJyNhZDdmYTgnKSxcbiAgICBjc3MudG9Db2xvcignIzM0ZTJlMicpLFxuICAgIGNzcy50b0NvbG9yKCcjZWVlZWVjJylcbiAgXTtcblxuICAvLyBGaWxsIGluIHRoZSByZW1haW5pbmcgMjQwIEFOU0kgY29sb3JzLlxuICAvLyBHZW5lcmF0ZSBjb2xvcnMgKDE2LTIzMSlcbiAgY29uc3QgdiA9IFsweDAwLCAweDVmLCAweDg3LCAweGFmLCAweGQ3LCAweGZmXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMTY7IGkrKykge1xuICAgIGNvbnN0IHIgPSB2WyhpIC8gMzYpICUgNiB8IDBdO1xuICAgIGNvbnN0IGcgPSB2WyhpIC8gNikgJSA2IHwgMF07XG4gICAgY29uc3QgYiA9IHZbaSAlIDZdO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYilcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGdyZXlzICgyMzItMjU1KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICBjb25zdCBjID0gOCArIGkgKiAxMDtcbiAgICBjb2xvcnMucHVzaCh7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKGMsIGMsIGMpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKGMsIGMsIGMpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufSkoKSk7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVRoZW1lU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9jb2xvcnM6IElDb2xvclNldDtcbiAgcHJpdmF0ZSBfY29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfaGFsZkNvbnRyYXN0Q2FjaGU6IElDb2xvckNvbnRyYXN0Q2FjaGUgPSBuZXcgQ29sb3JDb250cmFzdENhY2hlKCk7XG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcnMhOiBJUmVzdG9yZUNvbG9yU2V0O1xuXG4gIHB1YmxpYyBnZXQgY29sb3JzKCk6IFJlYWRvbmx5Q29sb3JTZXQgeyByZXR1cm4gdGhpcy5fY29sb3JzOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2VDb2xvcnMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8UmVhZG9ubHlDb2xvclNldD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZUNvbG9ycyA9IHRoaXMuX29uQ2hhbmdlQ29sb3JzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29sb3JzID0ge1xuICAgICAgZm9yZWdyb3VuZDogREVGQVVMVF9GT1JFR1JPVU5ELFxuICAgICAgYmFja2dyb3VuZDogREVGQVVMVF9CQUNLR1JPVU5ELFxuICAgICAgY3Vyc29yOiBERUZBVUxUX0NVUlNPUixcbiAgICAgIGN1cnNvckFjY2VudDogREVGQVVMVF9DVVJTT1JfQUNDRU5ULFxuICAgICAgc2VsZWN0aW9uRm9yZWdyb3VuZDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50OiBERUZBVUxUX1NFTEVDVElPTixcbiAgICAgIHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOiBjb2xvci5ibGVuZChERUZBVUxUX0JBQ0tHUk9VTkQsIERFRkFVTFRfU0VMRUNUSU9OKSxcbiAgICAgIGFuc2k6IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKSxcbiAgICAgIGNvbnRyYXN0Q2FjaGU6IHRoaXMuX2NvbnRyYXN0Q2FjaGUsXG4gICAgICBoYWxmQ29udHJhc3RDYWNoZTogdGhpcy5faGFsZkNvbnRyYXN0Q2FjaGVcbiAgICB9O1xuICAgIHRoaXMuX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTtcbiAgICB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnbWluaW11bUNvbnRyYXN0UmF0aW8nLCAoKSA9PiB0aGlzLl9jb250cmFzdENhY2hlLmNsZWFyKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ3RoZW1lJywgKCkgPT4gdGhpcy5fc2V0VGhlbWUodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy50aGVtZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXJtaW5hbCdzIHRoZW1lLlxuICAgKiBAcGFyYW0gdGhlbWUgVGhlICB0aGVtZSB0byB1c2UuIElmIGEgcGFydGlhbCB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGRlZmF1bHRcbiAgICogY29sb3JzIHdpbGwgYmUgdXNlZCB3aGVyZSBjb2xvcnMgYXJlIG5vdCBkZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0VGhlbWUodGhlbWU6IElUaGVtZSA9IHt9KTogdm9pZCB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5fY29sb3JzO1xuICAgIGNvbG9ycy5mb3JlZ3JvdW5kID0gcGFyc2VDb2xvcih0aGVtZS5mb3JlZ3JvdW5kLCBERUZBVUxUX0ZPUkVHUk9VTkQpO1xuICAgIGNvbG9ycy5iYWNrZ3JvdW5kID0gcGFyc2VDb2xvcih0aGVtZS5iYWNrZ3JvdW5kLCBERUZBVUxUX0JBQ0tHUk9VTkQpO1xuICAgIGNvbG9ycy5jdXJzb3IgPSBwYXJzZUNvbG9yKHRoZW1lLmN1cnNvciwgREVGQVVMVF9DVVJTT1IpO1xuICAgIGNvbG9ycy5jdXJzb3JBY2NlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLmN1cnNvckFjY2VudCwgREVGQVVMVF9DVVJTT1JfQUNDRU5UKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25CYWNrZ3JvdW5kLCBERUZBVUxUX1NFTEVDVElPTik7XG4gICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgPSBjb2xvci5ibGVuZChjb2xvcnMuYmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQsIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUgPSBjb2xvci5ibGVuZChjb2xvcnMuYmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHRoZW1lLnNlbGVjdGlvbkZvcmVncm91bmQgPyBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkZvcmVncm91bmQsIE5VTExfQ09MT1IpIDogdW5kZWZpbmVkO1xuICAgIGlmIChjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9PT0gTlVMTF9DT0xPUikge1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgc2VsZWN0aW9uIGNvbG9yIGlzIG9wYXF1ZSwgYmxlbmQgaXQgd2l0aCBiYWNrZ3JvdW5kIHdpdGggMC4zIG9wYWNpdHlcbiAgICAgKiBJc3N1ZSAjMjczN1xuICAgICAqL1xuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KSkge1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IDAuMztcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBjb2xvci5vcGFjaXR5KGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBpZiAoY29sb3IuaXNPcGFxdWUoY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KSkge1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IDAuMztcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50LCBvcGFjaXR5KTtcbiAgICB9XG4gICAgY29sb3JzLmFuc2kgPSBERUZBVUxUX0FOU0lfQ09MT1JTLnNsaWNlKCk7XG4gICAgY29sb3JzLmFuc2lbMF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsYWNrLCBERUZBVUxUX0FOU0lfQ09MT1JTWzBdKTtcbiAgICBjb2xvcnMuYW5zaVsxXSA9IHBhcnNlQ29sb3IodGhlbWUucmVkLCBERUZBVUxUX0FOU0lfQ09MT1JTWzFdKTtcbiAgICBjb2xvcnMuYW5zaVsyXSA9IHBhcnNlQ29sb3IodGhlbWUuZ3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMl0pO1xuICAgIGNvbG9ycy5hbnNpWzNdID0gcGFyc2VDb2xvcih0aGVtZS55ZWxsb3csIERFRkFVTFRfQU5TSV9DT0xPUlNbM10pO1xuICAgIGNvbG9ycy5hbnNpWzRdID0gcGFyc2VDb2xvcih0aGVtZS5ibHVlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzRdKTtcbiAgICBjb2xvcnMuYW5zaVs1XSA9IHBhcnNlQ29sb3IodGhlbWUubWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1s1XSk7XG4gICAgY29sb3JzLmFuc2lbNl0gPSBwYXJzZUNvbG9yKHRoZW1lLmN5YW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbNl0pO1xuICAgIGNvbG9ycy5hbnNpWzddID0gcGFyc2VDb2xvcih0aGVtZS53aGl0ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1s3XSk7XG4gICAgY29sb3JzLmFuc2lbOF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEJsYWNrLCBERUZBVUxUX0FOU0lfQ09MT1JTWzhdKTtcbiAgICBjb2xvcnMuYW5zaVs5XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0UmVkLCBERUZBVUxUX0FOU0lfQ09MT1JTWzldKTtcbiAgICBjb2xvcnMuYW5zaVsxMF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEdyZWVuLCBERUZBVUxUX0FOU0lfQ09MT1JTWzEwXSk7XG4gICAgY29sb3JzLmFuc2lbMTFdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRZZWxsb3csIERFRkFVTFRfQU5TSV9DT0xPUlNbMTFdKTtcbiAgICBjb2xvcnMuYW5zaVsxMl0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTJdKTtcbiAgICBjb2xvcnMuYW5zaVsxM10gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodE1hZ2VudGEsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTNdKTtcbiAgICBjb2xvcnMuYW5zaVsxNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEN5YW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTRdKTtcbiAgICBjb2xvcnMuYW5zaVsxNV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFdoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzE1XSk7XG4gICAgaWYgKHRoZW1lLmV4dGVuZGVkQW5zaSkge1xuICAgICAgY29uc3QgY29sb3JDb3VudCA9IE1hdGgubWluKGNvbG9ycy5hbnNpLmxlbmd0aCAtIDE2LCB0aGVtZS5leHRlbmRlZEFuc2kubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbG9ycy5hbnNpW2kgKyAxNl0gPSBwYXJzZUNvbG9yKHRoZW1lLmV4dGVuZGVkQW5zaVtpXSwgREVGQVVMVF9BTlNJX0NPTE9SU1tpICsgMTZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYXIgb3VyIHRoZSBjYWNoZVxuICAgIHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlQ29sb3Ioc2xvdD86IEFsbENvbG9ySW5kZXgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlQ29sb3Ioc2xvdCk7XG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF9yZXN0b3JlQ29sb3Ioc2xvdDogQWxsQ29sb3JJbmRleCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIHVuc2V0IHNsb3QgcmVzdG9yZXMgYWxsIGFuc2kgY29sb3JzXG4gICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2kubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5fY29sb3JzLmFuc2lbaV0gPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbaV07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoc2xvdCkge1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EOlxuICAgICAgICB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuZm9yZWdyb3VuZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkJBQ0tHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SOlxuICAgICAgICB0aGlzLl9jb2xvcnMuY3Vyc29yID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5jdXJzb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmFuc2lbc2xvdF0gPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbc2xvdF07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vZGlmeUNvbG9ycyhjYWxsYmFjazogKGNvbG9yczogSUNvbG9yU2V0KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY2FsbGJhY2sodGhpcy5fY29sb3JzKTtcbiAgICAvLyBBc3N1bWUgdGhlIGNoYW5nZSBoYXBwZW5lZFxuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmVzdG9yZUNvbG9ycygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlQ29sb3JzID0ge1xuICAgICAgZm9yZWdyb3VuZDogdGhpcy5fY29sb3JzLmZvcmVncm91bmQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLl9jb2xvcnMuYmFja2dyb3VuZCxcbiAgICAgIGN1cnNvcjogdGhpcy5fY29sb3JzLmN1cnNvcixcbiAgICAgIGFuc2k6IHRoaXMuX2NvbG9ycy5hbnNpLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29sb3IoXG4gIGNzc1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFjazogSUNvbG9yXG4pOiBJQ29sb3Ige1xuICBpZiAoY3NzU3RyaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNzcy50b0NvbG9yKGNzc1N0cmluZyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBuby1vcFxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDaXJjdWxhckxpc3QgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUluc2VydEV2ZW50IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgYW1vdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlbGV0ZUV2ZW50IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgYW1vdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNpcmN1bGFyIGxpc3Q7IGEgbGlzdCB3aXRoIGEgbWF4aW11bSBzaXplIHRoYXQgd3JhcHMgYXJvdW5kIHdoZW4gcHVzaCBpcyBjYWxsZWQsXG4gKiBvdmVycmlkaW5nIHZhbHVlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaXJjdWxhckxpc3Q8VD4gZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUNpcmN1bGFyTGlzdDxUPiB7XG4gIHByb3RlY3RlZCBfYXJyYXk6IChUIHwgdW5kZWZpbmVkKVtdO1xuICBwcml2YXRlIF9zdGFydEluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgX2xlbmd0aDogbnVtYmVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBvbkRlbGV0ZUVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SURlbGV0ZUV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGVsZXRlID0gdGhpcy5vbkRlbGV0ZUVtaXR0ZXIuZXZlbnQ7XG4gIHB1YmxpYyByZWFkb25seSBvbkluc2VydEVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUluc2VydEV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uSW5zZXJ0ID0gdGhpcy5vbkluc2VydEVtaXR0ZXIuZXZlbnQ7XG4gIHB1YmxpYyByZWFkb25seSBvblRyaW1FbWl0dGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblRyaW0gPSB0aGlzLm9uVHJpbUVtaXR0ZXIuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9hcnJheSA9IG5ldyBBcnJheTxUPih0aGlzLl9tYXhMZW5ndGgpO1xuICAgIHRoaXMuX3N0YXJ0SW5kZXggPSAwO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXhMZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1heExlbmd0aChuZXdNYXhMZW5ndGg6IG51bWJlcikge1xuICAgIC8vIFRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gbWF4TGVuZ3RoLCByZXR1cm4gZWFybHkuXG4gICAgaWYgKHRoaXMuX21heExlbmd0aCA9PT0gbmV3TWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb25zdHJ1Y3QgYXJyYXksIHN0YXJ0aW5nIGF0IGluZGV4IDAuIE9ubHkgdHJhbnNmZXIgdmFsdWVzIGZyb20gdGhlXG4gICAgLy8gaW5kZXhlcyAwIHRvIGxlbmd0aC5cbiAgICBjb25zdCBuZXdBcnJheSA9IG5ldyBBcnJheTxUIHwgdW5kZWZpbmVkPihuZXdNYXhMZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obmV3TWF4TGVuZ3RoLCB0aGlzLmxlbmd0aCk7IGkrKykge1xuICAgICAgbmV3QXJyYXlbaV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV07XG4gICAgfVxuICAgIHRoaXMuX2FycmF5ID0gbmV3QXJyYXk7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbmV3TWF4TGVuZ3RoO1xuICAgIHRoaXMuX3N0YXJ0SW5kZXggPSAwO1xuICB9XG5cbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHNldCBsZW5ndGgobmV3TGVuZ3RoOiBudW1iZXIpIHtcbiAgICBpZiAobmV3TGVuZ3RoID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5fbGVuZ3RoOyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fYXJyYXlbaV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2xlbmd0aCA9IG5ld0xlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBhbiBpbmRleC5cbiAgICpcbiAgICogTm90ZSB0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZXJlIGlzIG5vIGJvdW5kcyBjaGVja2luZyBoZXJlLCB0aGUgaW5kZXggcmVmZXJlbmNlIGlzXG4gICAqIGNpcmN1bGFyIHNvIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSB2YWx1ZSBhbmQgbmV2ZXIgdGhyb3cuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGluZGV4KV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgYXQgYW4gaW5kZXguXG4gICAqXG4gICAqIE5vdGUgdGhhdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGVyZSBpcyBubyBib3VuZHMgY2hlY2tpbmcgaGVyZSwgdGhlIGluZGV4IHJlZmVyZW5jZSBpc1xuICAgKiBjaXJjdWxhciBzbyB0aGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgdmFsdWUgYW5kIG5ldmVyIHRocm93LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIHNldC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBUIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaW5kZXgpXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhIG5ldyB2YWx1ZSBvbnRvIHRoZSBsaXN0LCB3cmFwcGluZyBhcm91bmQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBhcnJheSwgb3ZlcnJpZGluZyBpbmRleCAwXG4gICAqIGlmIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyByZWFjaGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHB1c2ggb250byB0aGUgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBwdXNoKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgodGhpcy5fbGVuZ3RoKV0gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09PSB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N0YXJ0SW5kZXggPSArK3RoaXMuX3N0YXJ0SW5kZXggJSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICB0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGVuZ3RoKys7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgcmluZ2J1ZmZlciBpbmRleCBhbmQgcmV0dXJuIGN1cnJlbnQgZWxlbWVudCBmb3IgcmVjeWNsaW5nLlxuICAgKiBOb3RlOiBUaGUgYnVmZmVyIG11c3QgYmUgZnVsbCBmb3IgdGhpcyBtZXRob2QgdG8gd29yay5cbiAgICogQHRocm93cyBXaGVuIHRoZSBidWZmZXIgaXMgbm90IGZ1bGwuXG4gICAqL1xuICBwdWJsaWMgcmVjeWNsZSgpOiBUIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9PSB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgcmVjeWNsZSB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCcpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydEluZGV4ID0gKyt0aGlzLl9zdGFydEluZGV4ICUgdGhpcy5fbWF4TGVuZ3RoO1xuICAgIHRoaXMub25UcmltRW1pdHRlci5maXJlKDEpO1xuICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0aGlzLl9sZW5ndGggLSAxKV0hO1xuICB9XG5cbiAgLyoqXG4gICAqIFJpbmdidWZmZXIgaXMgYXQgbWF4IGxlbmd0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNGdWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sZW5ndGggPT09IHRoaXMuX21heExlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIG9uIHRoZSBsaXN0LlxuICAgKiBAcmV0dXJucyBUaGUgcG9wcGVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHBvcCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgodGhpcy5fbGVuZ3RoLS0gLSAxKV07XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbmQvb3IgaW5zZXJ0cyBpdGVtcyBhdCBhIHBhcnRpY3VsYXIgaW5kZXggKGluIHRoYXQgb3JkZXIpLiBVbmxpa2VcbiAgICogQXJyYXkucHJvdG90eXBlLnNwbGljZSwgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgcmV0dXJuIHRoZSBkZWxldGVkIGl0ZW1zIGFzIGEgbmV3IGFycmF5IGluXG4gICAqIG9yZGVyIHRvIHNhdmUgY3JlYXRpbmcgYSBuZXcgYXJyYXkuIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBtYXkgc2hpZnQgYWxsIHZhbHVlcyBpbiB0aGUgbGlzdFxuICAgKiBpbiB0aGUgd29yc3QgY2FzZS5cbiAgICogQHBhcmFtIHN0YXJ0IFRoZSBpbmRleCB0byBkZWxldGUgYW5kL29yIGluc2VydC5cbiAgICogQHBhcmFtIGRlbGV0ZUNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGluc2VydC5cbiAgICovXG4gIHB1YmxpYyBzcGxpY2Uoc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IFRbXSk6IHZvaWQge1xuICAgIC8vIERlbGV0ZSBpdGVtc1xuICAgIGlmIChkZWxldGVDb3VudCkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgdGhpcy5fbGVuZ3RoIC0gZGVsZXRlQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpICsgZGVsZXRlQ291bnQpXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xlbmd0aCAtPSBkZWxldGVDb3VudDtcbiAgICAgIHRoaXMub25EZWxldGVFbWl0dGVyLmZpcmUoeyBpbmRleDogc3RhcnQsIGFtb3VudDogZGVsZXRlQ291bnQgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGl0ZW1zXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX2xlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IGktLSkge1xuICAgICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSArIGl0ZW1zLmxlbmd0aCldID0gdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSldO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChzdGFydCArIGkpXSA9IGl0ZW1zW2ldO1xuICAgIH1cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm9uSW5zZXJ0RW1pdHRlci5maXJlKHsgaW5kZXg6IHN0YXJ0LCBhbW91bnQ6IGl0ZW1zLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGp1c3QgbGVuZ3RoIGFzIG5lZWRlZFxuICAgIGlmICh0aGlzLl9sZW5ndGggKyBpdGVtcy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNvdW50VG9UcmltID0gKHRoaXMuX2xlbmd0aCArIGl0ZW1zLmxlbmd0aCkgLSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICB0aGlzLl9zdGFydEluZGV4ICs9IGNvdW50VG9UcmltO1xuICAgICAgdGhpcy5fbGVuZ3RoID0gdGhpcy5fbWF4TGVuZ3RoO1xuICAgICAgdGhpcy5vblRyaW1FbWl0dGVyLmZpcmUoY291bnRUb1RyaW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sZW5ndGggKz0gaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltcyBhIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGlzdC5cbiAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHRyaW1TdGFydChjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGNvdW50ID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICBjb3VudCA9IHRoaXMuX2xlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRJbmRleCArPSBjb3VudDtcbiAgICB0aGlzLl9sZW5ndGggLT0gY291bnQ7XG4gICAgdGhpcy5vblRyaW1FbWl0dGVyLmZpcmUoY291bnQpO1xuICB9XG5cbiAgcHVibGljIHNoaWZ0RWxlbWVudHMoc3RhcnQ6IG51bWJlciwgY291bnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMuX2xlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBhcmd1bWVudCBvdXQgb2YgcmFuZ2UnKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICsgb2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2hpZnQgZWxlbWVudHMgaW4gbGlzdCBiZXlvbmQgaW5kZXggMCcpO1xuICAgIH1cblxuICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLnNldChzdGFydCArIGkgKyBvZmZzZXQsIHRoaXMuZ2V0KHN0YXJ0ICsgaSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwYW5kTGlzdEJ5ID0gKHN0YXJ0ICsgY291bnQgKyBvZmZzZXQpIC0gdGhpcy5fbGVuZ3RoO1xuICAgICAgaWYgKGV4cGFuZExpc3RCeSA+IDApIHtcbiAgICAgICAgdGhpcy5fbGVuZ3RoICs9IGV4cGFuZExpc3RCeTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2xlbmd0aCA+IHRoaXMuX21heExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2xlbmd0aC0tO1xuICAgICAgICAgIHRoaXMuX3N0YXJ0SW5kZXgrKztcbiAgICAgICAgICB0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5zZXQoc3RhcnQgKyBpICsgb2Zmc2V0LCB0aGlzLmdldChzdGFydCArIGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3ljbGljIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgaW5kZXguIFRoZSBjeWNsaWMgaW5kZXggY2FuIHRoZW4gYmUgdXNlZCBvbiB0aGVcbiAgICogYmFja2luZyBhcnJheSB0byBnZXQgdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWd1bGFyIGluZGV4LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHJlZ3VsYXIgaW5kZXguXG4gICAqIEByZXR1cm5zIFRoZSBjeWNsaWMgaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9nZXRDeWNsaWNJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0SW5kZXggKyBpbmRleCkgJSB0aGlzLl9tYXhMZW5ndGg7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLypcbiAqIEEgc2ltcGxlIHV0aWxpdHkgZm9yIGNsb25pbmcgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZTxUPih2YWw6IFQsIGRlcHRoOiBudW1iZXIgPSA1KTogVCB7XG4gIGlmICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvLyBJZiB3ZSdyZSBjbG9uaW5nIGFuIGFycmF5LCB1c2UgYW4gYXJyYXkgYXMgdGhlIGJhc2UsIG90aGVyd2lzZSB1c2UgYW4gb2JqZWN0XG4gIGNvbnN0IGNsb25lZE9iamVjdDogYW55ID0gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiB2YWwpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjbG9uZSBlYWNrIGl0ZW0gdW5sZXNzIHdlJ3JlIGF0IHRoZSBtYXhpbXVtIGRlcHRoXG4gICAgY2xvbmVkT2JqZWN0W2tleV0gPSBkZXB0aCA8PSAxID8gdmFsW2tleV0gOiAodmFsW2tleV0gJiYgY2xvbmUodmFsW2tleV0sIGRlcHRoIC0gMSkpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lZE9iamVjdCBhcyBUO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3IsIElDb2xvclJHQiB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmxldCAkciA9IDA7XG5sZXQgJGcgPSAwO1xubGV0ICRiID0gMDtcbmxldCAkYSA9IDA7XG5cbmV4cG9ydCBjb25zdCBOVUxMX0NPTE9SOiBJQ29sb3IgPSB7XG4gIGNzczogJyMwMDAwMDAwMCcsXG4gIHJnYmE6IDBcbn07XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJjaGFubmVsc1wiIChpbmRpdmlkdWFsIGNvbG9yIGNoYW5uZWxzIGFzIG51bWJlcnMpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNoYW5uZWxzIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ3NzKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfSR7dG9QYWRkZWRIZXgoYSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9YDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b1JnYmEocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMHhGRik6IG51bWJlciB7XG4gICAgLy8gTm90ZTogVGhlIGFnZ3JlZ2F0ZWQgbnVtYmVyIGlzIFJHQkEzMiAoQkUpLCB0aHVzIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBBQkdSMzJcbiAgICAvLyBvbiBMRSBzeXN0ZW1zLCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgZm9yIGRpcmVjdCAzMi1iaXQgYnVmZmVyIHdyaXRlcy5cbiAgICAvLyA+Pj4gMCBmb3JjZXMgYW4gdW5zaWduZWQgaW50XG4gICAgcmV0dXJuIChyIDw8IDI0IHwgZyA8PCAxNiB8IGIgPDwgOCB8IGEpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IElDb2xvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiwgYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYiwgYSlcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgYElDb2xvcmAuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY29sb3Ige1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IElDb2xvciwgZmc6IElDb2xvcik6IElDb2xvciB7XG4gICAgJGEgPSAoZmcucmdiYSAmIDB4RkYpIC8gMjU1O1xuICAgIGlmICgkYSA9PT0gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBmZy5jc3MsXG4gICAgICAgIHJnYmE6IGZnLnJnYmFcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBmZ0IgPSAoZmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICBjb25zdCBjc3MgPSBjaGFubmVscy50b0NzcygkciwgJGcsICRiKTtcbiAgICBjb25zdCByZ2JhID0gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICAgIHJldHVybiB7IGNzcywgcmdiYSB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzT3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGNvbG9yLnJnYmEgJiAweEZGKSA9PT0gMHhGRjtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb250cmFzdFJhdGlvKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IsIHJhdGlvOiBudW1iZXIpOiBJQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJnYmEuZW5zdXJlQ29udHJhc3RSYXRpbyhiZy5yZ2JhLCBmZy5yZ2JhLCByYXRpbyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKFxuICAgICAgKHJlc3VsdCA+PiAyNCAmIDB4RkYpLFxuICAgICAgKHJlc3VsdCA+PiAxNiAmIDB4RkYpLFxuICAgICAgKHJlc3VsdCA+PiA4ICAmIDB4RkYpXG4gICAgKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFxdWUoY29sb3I6IElDb2xvcik6IElDb2xvciB7XG4gICAgY29uc3QgcmdiYUNvbG9yID0gKGNvbG9yLnJnYmEgfCAweEZGKSA+Pj4gMDtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMocmdiYUNvbG9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiKSxcbiAgICAgIHJnYmE6IHJnYmFDb2xvclxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhY2l0eShjb2xvcjogSUNvbG9yLCBvcGFjaXR5OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gTWF0aC5yb3VuZChvcGFjaXR5ICogMHhGRik7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKGNvbG9yLnJnYmEpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiLCAkYSlcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5T3BhY2l0eShjb2xvcjogSUNvbG9yLCBmYWN0b3I6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBjb2xvci5yZ2JhICYgMHhGRjtcbiAgICByZXR1cm4gb3BhY2l0eShjb2xvciwgKCRhICogZmFjdG9yKSAvIDB4RkYpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3JSR0IoY29sb3I6IElDb2xvcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFsoY29sb3IucmdiYSA+PiAyNCkgJiAweEZGLCAoY29sb3IucmdiYSA+PiAxNikgJiAweEZGLCAoY29sb3IucmdiYSA+PiA4KSAmIDB4RkZdO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJjc3NcIiAoc3RyaW5nOiAnI3JnYicsICcjcmdiYScsICcjcnJnZ2JiJyxcbiAqICcjcnJnZ2JiYWEnKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjc3Mge1xuICAvLyBBdHRlbXB0IHRvIHNldCBnZXQgdGhlIHNoYXJlZCBjYW52YXMgY29udGV4dFxuICBsZXQgJGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgdW5kZWZpbmVkO1xuICBsZXQgJGxpdG11c0NvbG9yOiBDYW52YXNHcmFkaWVudCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIHRoZSBmaXJzdCB3aW5kb3csIHNvIGRvY3VtZW50IHNob3VsZCBiZSBjb3JyZWN0XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICAkY3R4ID0gY3R4O1xuICAgICAgJGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnY29weSc7XG4gICAgICAkbGl0bXVzQ29sb3IgPSAkY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDEsIDEpO1xuICAgIH1cbiAgfVxuICBjYXRjaCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY3NzIHN0cmluZyB0byBhbiBJQ29sb3IsIHRoaXMgc2hvdWxkIGhhbmRsZSBhbGwgdmFsaWQgQ1NTIGNvbG9yIHN0cmluZ3MgYW5kIHdpbGxcbiAgICogdGhyb3cgaWYgaXQncyBpbnZhbGlkLiBUaGUgaWRlYWwgZm9ybWF0IHRvIHVzZSBpcyBgI3JyZ2diYlthYV1gIGFzIGl0J3MgdGhlIGZhc3Rlc3QgdG8gcGFyc2UuXG4gICAqXG4gICAqIE9ubHkgYCNyZ2JbYV1gLCBgI3JyZ2diYlthYV1gLCBgcmdiKClgIGFuZCBgcmdiYSgpYCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgd2hlbiBydW4gaW4gYSBOb2RlXG4gICAqIGVudmlyb25tZW50LlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3IoY3NzOiBzdHJpbmcpOiBJQ29sb3Ige1xuICAgIC8vIEZvcm1hdHM6ICNyZ2JbYV0gYW5kICNycmdnYmJbYWFdXG4gICAgaWYgKGNzcy5tYXRjaCgvI1tcXGRhLWZdezMsOH0vaSkpIHtcbiAgICAgIHN3aXRjaCAoY3NzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDQ6IHsgLy8gI3JnYlxuICAgICAgICAgICRyID0gcGFyc2VJbnQoY3NzLnNsaWNlKDEsIDIpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRnID0gcGFyc2VJbnQoY3NzLnNsaWNlKDIsIDMpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRiID0gcGFyc2VJbnQoY3NzLnNsaWNlKDMsIDQpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNTogeyAvLyAjcmdiYVxuICAgICAgICAgICRyID0gcGFyc2VJbnQoY3NzLnNsaWNlKDEsIDIpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRnID0gcGFyc2VJbnQoY3NzLnNsaWNlKDIsIDMpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRiID0gcGFyc2VJbnQoY3NzLnNsaWNlKDMsIDQpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRhID0gcGFyc2VJbnQoY3NzLnNsaWNlKDQsIDUpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDc6IC8vICNycmdnYmJcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogKHBhcnNlSW50KGNzcy5zbGljZSgxKSwgMTYpIDw8IDggfCAweEZGKSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgOTogLy8gI3JyZ2diYmFhXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IHBhcnNlSW50KGNzcy5zbGljZSgxKSwgMTYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JtYXRzOiByZ2IoKSBvciByZ2JhKClcbiAgICBjb25zdCByZ2JhTWF0Y2ggPSBjc3MubWF0Y2goL3JnYmE/XFwoXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyooLFxccyooMHwxfFxcZD9cXC4oXFxkKykpXFxzKik/XFwpLyk7XG4gICAgaWYgKHJnYmFNYXRjaCkge1xuICAgICAgJHIgPSBwYXJzZUludChyZ2JhTWF0Y2hbMV0pO1xuICAgICAgJGcgPSBwYXJzZUludChyZ2JhTWF0Y2hbMl0pO1xuICAgICAgJGIgPSBwYXJzZUludChyZ2JhTWF0Y2hbM10pO1xuICAgICAgJGEgPSBNYXRoLnJvdW5kKChyZ2JhTWF0Y2hbNV0gPT09IHVuZGVmaW5lZCA/IDEgOiBwYXJzZUZsb2F0KHJnYmFNYXRjaFs1XSkpICogMHhGRik7XG4gICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbnRleHQgaXMgYXZhaWxhYmxlIGZvciBjYW52YXMtYmFzZWQgY29sb3IgcGFyc2luZ1xuICAgIGlmICghJGN0eCB8fCAhJGxpdG11c0NvbG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIHVzaW5nIGNhbnZhcyBmaWxsU3R5bGVcbiAgICAvLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjZmlsbC1hbmQtc3Ryb2tlLXN0eWxlc1xuICAgICRjdHguZmlsbFN0eWxlID0gJGxpdG11c0NvbG9yO1xuICAgICRjdHguZmlsbFN0eWxlID0gY3NzO1xuICAgIGlmICh0eXBlb2YgJGN0eC5maWxsU3R5bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgJGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcbiAgICBbJHIsICRnLCAkYiwgJGFdID0gJGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciBpcyBub24tdHJhbnNwYXJlbnQgYXMgY29sb3IgaHVlIGdldHMgbG9zdCB3aGVuIGRyYXduIHRvIHRoZSBjYW52YXNcbiAgICBpZiAoJGEgIT09IDB4RkYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBjb2xvciBmcm9tIHRoZSBjYW52YXMnIGZpbGxTdHlsZSBwcm9wZXJ0eSB3aGljaCBleHBvc2VzIHRoZSBjb2xvciB2YWx1ZSBpbiByZ2JhKClcbiAgICAvLyBmb3JtYXRcbiAgICAvLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjc2VyaWFsaXNhdGlvbi1vZi1hLWNvbG9yXG4gICAgcmV0dXJuIHtcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiLCAkYSksXG4gICAgICBjc3NcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JcIiAobnVtYmVyOiAweHJyZ2diYikuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByZ2IgVGhlIGNvbG9yIHRvIHVzZS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlKHJnYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVsYXRpdmVMdW1pbmFuY2UyKFxuICAgICAgKHJnYiA+PiAxNikgJiAweEZGLFxuICAgICAgKHJnYiA+PiA4ICkgJiAweEZGLFxuICAgICAgKHJnYiAgICAgICkgJiAweEZGKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gciBUaGUgcmVkIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gYiBUaGUgYmx1ZSBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHJzID0gciAvIDI1NTtcbiAgICBjb25zdCBncyA9IGcgLyAyNTU7XG4gICAgY29uc3QgYnMgPSBiIC8gMjU1O1xuICAgIGNvbnN0IHJyID0gcnMgPD0gMC4wMzkyOCA/IHJzIC8gMTIuOTIgOiBNYXRoLnBvdygocnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByZyA9IGdzIDw9IDAuMDM5MjggPyBncyAvIDEyLjkyIDogTWF0aC5wb3coKGdzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmIgPSBicyA8PSAwLjAzOTI4ID8gYnMgLyAxMi45MiA6IE1hdGgucG93KChicyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIHJldHVybiByciAqIDAuMjEyNiArIHJnICogMC43MTUyICsgcmIgKiAwLjA3MjI7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYmFcIiAobnVtYmVyOiAweHJyZ2diYmFhKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2JhIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBudW1iZXIsIGZnOiBudW1iZXIpOiBudW1iZXIge1xuICAgICRhID0gKGZnICYgMHhGRikgLyAweEZGO1xuICAgIGlmICgkYSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGZnO1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBmZ0IgPSAoZmcgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZyA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGZvcmVncm91bmQgY29sb3IgYW5kIGEgYmFja2dyb3VuZCBjb2xvciwgZWl0aGVyIGluY3JlYXNlIG9yIHJlZHVjZSB0aGUgbHVtaW5hbmNlIG9mIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIHVudGlsIHRoZSBzcGVjaWZpZWQgY29udHJhc3QgcmF0aW8gaXMgbWV0LiBJZiBwdXJlIHdoaXRlIG9yIGJsYWNrIGlzIGhpdFxuICAgKiB3aXRob3V0IHRoZSBjb250cmFzdCByYXRpbyBiZWluZyBtZXQsIGdvIHRoZSBvdGhlciBkaXJlY3Rpb24gdXNpbmcgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgYW5kIHRha2UgZWl0aGVyIHRoZSBmaXJzdCBvciBzZWNvbmQgcmVzdWx0IGRlcGVuZGluZyBvbiB3aGljaCBoYXMgdGhlIGhpZ2hlclxuICAgKiBjb250cmFzdCByYXRpby5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgYWxyZWFkeSBtZXQuXG4gICAqXG4gICAqIEBwYXJhbSBiZ1JnYmEgVGhlIGJhY2tncm91bmQgY29sb3IgaW4gcmdiYSBmb3JtYXQuXG4gICAqIEBwYXJhbSBmZ1JnYmEgVGhlIGZvcmVncm91bmQgY29sb3IgaW4gcmdiYSBmb3JtYXQuXG4gICAqIEBwYXJhbSByYXRpbyBUaGUgY29udHJhc3QgcmF0aW8gdG8gYWNoaWV2ZS5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb250cmFzdFJhdGlvKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGJnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBmZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoZmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGNyID0gY29udHJhc3RSYXRpbyhiZ0wsIGZnTCk7XG4gICAgaWYgKGNyIDwgcmF0aW8pIHtcbiAgICAgIGlmIChmZ0wgPCBiZ0wpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QSA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgICBjb25zdCByZXN1bHRCID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRBUmF0aW8gPiByZXN1bHRCUmF0aW8gPyByZXN1bHRBIDogcmVzdWx0QjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdEEgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICBjb25zdCByZXN1bHRCID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgIHJldHVybiByZXN1bHRBUmF0aW8gPiByZXN1bHRCUmF0aW8gPyByZXN1bHRBIDogcmVzdWx0QjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRBO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byByZWR1Y2luZyBsdW1pbmFuY2UgYXMgY29udmVydGluZyB0b1xuICAgIC8vIEhTTCBhbmQgYmFjayBpcyBleHBlbnNpdmVcbiAgICBjb25zdCBiZ1IgPSAoYmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgZmdSID0gKGZnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGxldCBmZ0cgPSAoZmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgbGV0IGZnQiA9IChmZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIHdoaWxlIChjciA8IHJhdGlvICYmIChmZ1IgPiAwIHx8IGZnRyA+IDAgfHwgZmdCID4gMCkpIHtcbiAgICAgIC8vIFJlZHVjZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ1IgKiAwLjEpKTtcbiAgICAgIGZnRyAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdHICogMC4xKSk7XG4gICAgICBmZ0IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnQiAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gaW5jcmVhc2luZyBsdW1pbmFuY2UgYXMgY29udmVydGluZyB0b1xuICAgIC8vIEhTTCBhbmQgYmFjayBpcyBleHBlbnNpdmVcbiAgICBjb25zdCBiZ1IgPSAoYmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgZmdSID0gKGZnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGxldCBmZ0cgPSAoZmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgbGV0IGZnQiA9IChmZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIHdoaWxlIChjciA8IHJhdGlvICYmIChmZ1IgPCAweEZGIHx8IGZnRyA8IDB4RkYgfHwgZmdCIDwgMHhGRikpIHtcbiAgICAgIC8vIEluY3JlYXNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgPSBNYXRoLm1pbigweEZGLCBmZ1IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnUikgKiAwLjEpKTtcbiAgICAgIGZnRyA9IE1hdGgubWluKDB4RkYsIGZnRyArIE1hdGguY2VpbCgoMjU1IC0gZmdHKSAqIDAuMSkpO1xuICAgICAgZmdCID0gTWF0aC5taW4oMHhGRiwgZmdCICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0IpICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NoYW5uZWxzKHZhbHVlOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIFsodmFsdWUgPj4gMjQpICYgMHhGRiwgKHZhbHVlID4+IDE2KSAmIDB4RkYsICh2YWx1ZSA+PiA4KSAmIDB4RkYsIHZhbHVlICYgMHhGRl07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFkZGVkSGV4KGM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSBjLnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/ICcwJyArIHMgOiBzO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbnRyYXN0IHJhdGlvIGJldHdlZW4gdHdvIHJlbGF0aXZlIGx1bWluYW5jZSB2YWx1ZXMuXG4gKiBAcGFyYW0gbDEgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBwYXJhbSBsMiBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJhc3RSYXRpbyhsMTogbnVtYmVyLCBsMjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGwxIDwgbDIpIHtcbiAgICByZXR1cm4gKGwyICsgMC4wNSkgLyAobDEgKyAwLjA1KTtcbiAgfVxuICByZXR1cm4gKGwxICsgMC4wNSkgLyAobDIgKyAwLjA1KTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgQ2hyaXN0b3BoZXIgSmVmZnJleSAoTUlUIExpY2Vuc2UpXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBPcmlnaW5hbGx5IGZvcmtlZCBmcm9tICh3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uKTpcbiAqICAgRmFicmljZSBCZWxsYXJkJ3MgamF2YXNjcmlwdCB2dDEwMCBmb3IganNsaW51eDpcbiAqICAgaHR0cDovL2JlbGxhcmQub3JnL2pzbGludXgvXG4gKiAgIENvcHlyaWdodCAoYykgMjAxMSBGYWJyaWNlIEJlbGxhcmRcbiAqICAgVGhlIG9yaWdpbmFsIGRlc2lnbiByZW1haW5zLiBUaGUgdGVybWluYWwgaXRzZWxmXG4gKiAgIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGluY2x1ZGUgeHRlcm0gQ1NJIGNvZGVzLCBhbW9uZ1xuICogICBvdGhlciBmZWF0dXJlcy5cbiAqXG4gKiBUZXJtaW5hbCBFbXVsYXRpb24gUmVmZXJlbmNlczpcbiAqICAgaHR0cDovL3Z0MTAwLm5ldC9cbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy50eHRcbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sXG4gKiAgIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC92dHRlc3QvXG4gKiAgIGh0dHA6Ly93d3cuaW53YXAuY29tL3BkcDEwL2Fuc2ljb2RlLnR4dFxuICogICBodHRwOi8vbGludXguZGllLm5ldC9tYW4vNC9jb25zb2xlX2NvZGVzXG4gKiAgIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi83L3VyeHZ0XG4gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUluc3RhbnRpYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UsIElCdWZmZXJTZXJ2aWNlLCBJTG9nU2VydmljZSwgSUNoYXJzZXRTZXJ2aWNlLCBJQ29yZVNlcnZpY2UsIElDb3JlTW91c2VTZXJ2aWNlLCBJVW5pY29kZVNlcnZpY2UsIExvZ0xldmVsRW51bSwgSVRlcm1pbmFsT3B0aW9ucywgSU9zY0xpbmtTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEluc3RhbnRpYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0luc3RhbnRpYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvTG9nU2VydmljZSc7XG5pbXBvcnQgeyBCdWZmZXJTZXJ2aWNlLCBNSU5JTVVNX0NPTFMsIE1JTklNVU1fUk9XUyB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9CdWZmZXJTZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL09wdGlvbnNTZXJ2aWNlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlLCBJQXR0cmlidXRlRGF0YSwgSUNvcmVUZXJtaW5hbCwgSVNjcm9sbEV2ZW50LCBTY3JvbGxTb3VyY2UgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQ29yZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvQ29yZVNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJRXZlbnQsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgQ29yZU1vdXNlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Db3JlTW91c2VTZXJ2aWNlJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1VuaWNvZGVTZXJ2aWNlJztcbmltcG9ydCB7IENoYXJzZXRTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0NoYXJzZXRTZXJ2aWNlJztcbmltcG9ydCB7IHVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlIH0gZnJvbSAnY29tbW9uL1dpbmRvd3NNb2RlJztcbmltcG9ydCB7IElGdW5jdGlvbklkZW50aWZpZXIsIElQYXJhbXMgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElucHV0SGFuZGxlciB9IGZyb20gJ2NvbW1vbi9JbnB1dEhhbmRsZXInO1xuaW1wb3J0IHsgV3JpdGVCdWZmZXIgfSBmcm9tICdjb21tb24vaW5wdXQvV3JpdGVCdWZmZXInO1xuaW1wb3J0IHsgT3NjTGlua1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvT3NjTGlua1NlcnZpY2UnO1xuXG4vLyBPbmx5IHRyaWdnZXIgdGhpcyB3YXJuaW5nIGEgc2luZ2xlIHRpbWUgcGVyIHNlc3Npb25cbmxldCBoYXNXcml0ZVN5bmNXYXJuSGFwcGVuZWQgPSBmYWxzZTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvcmVUZXJtaW5hbCBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ29yZVRlcm1pbmFsIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pbnN0YW50aWF0aW9uU2VydmljZTogSUluc3RhbnRpYXRpb25TZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2xvZ1NlcnZpY2U6IElMb2dTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NoYXJzZXRTZXJ2aWNlOiBJQ2hhcnNldFNlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBfb3NjTGlua1NlcnZpY2U6IElPc2NMaW5rU2VydmljZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29yZU1vdXNlU2VydmljZTogSUNvcmVNb3VzZVNlcnZpY2U7XG4gIHB1YmxpYyByZWFkb25seSBjb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlO1xuICBwdWJsaWMgcmVhZG9ubHkgdW5pY29kZVNlcnZpY2U6IElVbmljb2RlU2VydmljZTtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2U7XG5cbiAgcHJvdGVjdGVkIF9pbnB1dEhhbmRsZXI6IElucHV0SGFuZGxlcjtcbiAgcHJpdmF0ZSBfd3JpdGVCdWZmZXI6IFdyaXRlQnVmZmVyO1xuICBwcml2YXRlIF93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25CaW5hcnkgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQmluYXJ5ID0gdGhpcy5fb25CaW5hcnkuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGF0YSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EYXRhID0gdGhpcy5fb25EYXRhLmV2ZW50O1xuICBwcm90ZWN0ZWQgX29uTGluZUZlZWQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkxpbmVGZWVkID0gdGhpcy5fb25MaW5lRmVlZC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXNpemUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8eyBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlciB9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVzaXplID0gdGhpcy5fb25SZXNpemUuZXZlbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBfb25Xcml0ZVBhcnNlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uV3JpdGVQYXJzZWQgPSB0aGlzLl9vbldyaXRlUGFyc2VkLmV2ZW50O1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbGx5IHdlIHRyYWNrIHRoZSBzb3VyY2Ugb2YgdGhlIHNjcm9sbCBidXQgdGhpcyBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBsaWJyYXJ5IHNvXG4gICAqIGl0J3MgZmlsdGVyZWQgb3V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9vblNjcm9sbEFwaT86IEV2ZW50RW1pdHRlcjxudW1iZXIsIHZvaWQ+O1xuICBwcm90ZWN0ZWQgX29uU2Nyb2xsID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElTY3JvbGxFdmVudCwgdm9pZD4oKSk7XG4gIHB1YmxpYyBnZXQgb25TY3JvbGwoKTogSUV2ZW50PG51bWJlciwgdm9pZD4ge1xuICAgIGlmICghdGhpcy5fb25TY3JvbGxBcGkpIHtcbiAgICAgIHRoaXMuX29uU2Nyb2xsQXBpID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlciwgdm9pZD4oKSk7XG4gICAgICB0aGlzLl9vblNjcm9sbC5ldmVudChldiA9PiB7XG4gICAgICAgIHRoaXMuX29uU2Nyb2xsQXBpPy5maXJlKGV2LnBvc2l0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb25TY3JvbGxBcGkuZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczsgfVxuICBwdWJsaWMgZ2V0IHJvd3MoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93czsgfVxuICBwdWJsaWMgZ2V0IGJ1ZmZlcnMoKTogSUJ1ZmZlclNldCB7IHJldHVybiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnM7IH1cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+IHsgcmV0dXJuIHRoaXMub3B0aW9uc1NlcnZpY2Uub3B0aW9uczsgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnMob3B0aW9uczogSVRlcm1pbmFsT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc1NlcnZpY2Uub3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SVRlcm1pbmFsT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIFNldHVwIGFuZCBpbml0aWFsaXplIHNlcnZpY2VzXG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UgPSBuZXcgSW5zdGFudGlhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLm9wdGlvbnNTZXJ2aWNlID0gdGhpcy5yZWdpc3RlcihuZXcgT3B0aW9uc1NlcnZpY2Uob3B0aW9ucykpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSU9wdGlvbnNTZXJ2aWNlLCB0aGlzLm9wdGlvbnNTZXJ2aWNlKTtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShCdWZmZXJTZXJ2aWNlKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQnVmZmVyU2VydmljZSwgdGhpcy5fYnVmZmVyU2VydmljZSk7XG4gICAgdGhpcy5fbG9nU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTG9nU2VydmljZSkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUxvZ1NlcnZpY2UsIHRoaXMuX2xvZ1NlcnZpY2UpO1xuICAgIHRoaXMuY29yZVNlcnZpY2UgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENvcmVTZXJ2aWNlKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ29yZVNlcnZpY2UsIHRoaXMuY29yZVNlcnZpY2UpO1xuICAgIHRoaXMuY29yZU1vdXNlU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ29yZU1vdXNlU2VydmljZSkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUNvcmVNb3VzZVNlcnZpY2UsIHRoaXMuY29yZU1vdXNlU2VydmljZSk7XG4gICAgdGhpcy51bmljb2RlU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoVW5pY29kZVNlcnZpY2UpKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElVbmljb2RlU2VydmljZSwgdGhpcy51bmljb2RlU2VydmljZSk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2UgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShDaGFyc2V0U2VydmljZSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ2hhcnNldFNlcnZpY2UsIHRoaXMuX2NoYXJzZXRTZXJ2aWNlKTtcbiAgICB0aGlzLl9vc2NMaW5rU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKE9zY0xpbmtTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElPc2NMaW5rU2VydmljZSwgdGhpcy5fb3NjTGlua1NlcnZpY2UpO1xuXG5cbiAgICAvLyBSZWdpc3RlciBpbnB1dCBoYW5kbGVyIGFuZCBoYW5kbGUvZm9yd2FyZCBldmVudHNcbiAgICB0aGlzLl9pbnB1dEhhbmRsZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBJbnB1dEhhbmRsZXIodGhpcy5fYnVmZmVyU2VydmljZSwgdGhpcy5fY2hhcnNldFNlcnZpY2UsIHRoaXMuY29yZVNlcnZpY2UsIHRoaXMuX2xvZ1NlcnZpY2UsIHRoaXMub3B0aW9uc1NlcnZpY2UsIHRoaXMuX29zY0xpbmtTZXJ2aWNlLCB0aGlzLmNvcmVNb3VzZVNlcnZpY2UsIHRoaXMudW5pY29kZVNlcnZpY2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9pbnB1dEhhbmRsZXIub25MaW5lRmVlZCwgdGhpcy5fb25MaW5lRmVlZCkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyKTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVyc1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2J1ZmZlclNlcnZpY2Uub25SZXNpemUsIHRoaXMuX29uUmVzaXplKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5jb3JlU2VydmljZS5vbkRhdGEsIHRoaXMuX29uRGF0YSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuY29yZVNlcnZpY2Uub25CaW5hcnksIHRoaXMuX29uQmluYXJ5KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLmNvcmVTZXJ2aWNlLm9uUmVxdWVzdFNjcm9sbFRvQm90dG9tKCgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5jb3JlU2VydmljZS5vblVzZXJJbnB1dCgoKSA9PiAgdGhpcy5fd3JpdGVCdWZmZXIuaGFuZGxlVXNlcklucHV0KCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbJ3dpbmRvd3NNb2RlJywgJ3dpbmRvd3NQdHknXSwgKCkgPT4gdGhpcy5faGFuZGxlV2luZG93c1B0eU9wdGlvbkNoYW5nZSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uU2Nyb2xsKGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuX29uU2Nyb2xsLmZpcmUoeyBwb3NpdGlvbjogdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AsIHNvdXJjZTogU2Nyb2xsU291cmNlLlRFUk1JTkFMIH0pO1xuICAgICAgdGhpcy5faW5wdXRIYW5kbGVyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25TY3JvbGwoZXZlbnQgPT4ge1xuICAgICAgdGhpcy5fb25TY3JvbGwuZmlyZSh7IHBvc2l0aW9uOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCwgc291cmNlOiBTY3JvbGxTb3VyY2UuVEVSTUlOQUwgfSk7XG4gICAgICB0aGlzLl9pbnB1dEhhbmRsZXIubWFya1JhbmdlRGlydHkodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIH0pKTtcblxuICAgIC8vIFNldHVwIFdyaXRlQnVmZmVyXG4gICAgdGhpcy5fd3JpdGVCdWZmZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBXcml0ZUJ1ZmZlcigoZGF0YSwgcHJvbWlzZVJlc3VsdCkgPT4gdGhpcy5faW5wdXRIYW5kbGVyLnBhcnNlKGRhdGEsIHByb21pc2VSZXN1bHQpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fd3JpdGVCdWZmZXIub25Xcml0ZVBhcnNlZCwgdGhpcy5fb25Xcml0ZVBhcnNlZCkpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIGNhbGxiYWNrPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3dyaXRlQnVmZmVyLndyaXRlKGRhdGEsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBkYXRhIHRvIHRlcm1pbmFsIHN5bmNob25vdXNseS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdW5yZWxpYWJsZSB3aXRoIGFzeW5jIHBhcnNlciBoYW5kbGVycywgdGh1cyBzaG91bGQgbm90XG4gICAqIGJlIHVzZWQgYW55bW9yZS4gSWYgeW91IG5lZWQgYmxvY2tpbmcgc2VtYW50aWNzIG9uIGRhdGEgaW5wdXQgY29uc2lkZXJcbiAgICogYHdyaXRlYCB3aXRoIGEgY2FsbGJhY2sgaW5zdGVhZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVW5yZWxpYWJsZSwgd2lsbCBiZSByZW1vdmVkIHNvb24uXG4gICAqL1xuICBwdWJsaWMgd3JpdGVTeW5jKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIG1heFN1YnNlcXVlbnRDYWxscz86IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dTZXJ2aWNlLmxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5XQVJOICYmICFoYXNXcml0ZVN5bmNXYXJuSGFwcGVuZWQpIHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2Fybignd3JpdGVTeW5jIGlzIHVucmVsaWFibGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzb29uLicpO1xuICAgICAgaGFzV3JpdGVTeW5jV2FybkhhcHBlbmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fd3JpdGVCdWZmZXIud3JpdGVTeW5jKGRhdGEsIG1heFN1YnNlcXVlbnRDYWxscyk7XG4gIH1cblxuICBwdWJsaWMgaW5wdXQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGRhdGEsIHdhc1VzZXJJbnB1dCk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeCA9IE1hdGgubWF4KHgsIE1JTklNVU1fQ09MUyk7XG4gICAgeSA9IE1hdGgubWF4KHksIE1JTklNVU1fUk9XUyk7XG5cbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnJlc2l6ZSh4LCB5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgdGhlIHRlcm1pbmFsIGRvd24gMSByb3csIGNyZWF0aW5nIGEgYmxhbmsgbGluZS5cbiAgICogQHBhcmFtIGVyYXNlQXR0ciBUaGUgYXR0cmlidXRlIGRhdGEgdG8gdXNlIHRoZSBmb3IgYmxhbmsgbGluZS5cbiAgICogQHBhcmFtIGlzV3JhcHBlZCBXaGV0aGVyIHRoZSBuZXcgbGluZSBpcyB3cmFwcGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwoZXJhc2VBdHRyLCBpc1dyYXBwZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCB0aGUgZGlzcGxheSBvZiB0aGUgdGVybWluYWxcbiAgICogQHBhcmFtIGRpc3AgVGhlIG51bWJlciBvZiBsaW5lcyB0byBzY3JvbGwgZG93biAobmVnYXRpdmUgc2Nyb2xsIHVwKS5cbiAgICogQHBhcmFtIHN1cHByZXNzU2Nyb2xsRXZlbnQgRG9uJ3QgZW1pdCB0aGUgc2Nyb2xsIGV2ZW50IGFzIHNjcm9sbExpbmVzLiBUaGlzIGlzIHVzZWQgdG8gYXZvaWRcbiAgICogdW53YW50ZWQgZXZlbnRzIGJlaW5nIGhhbmRsZWQgYnkgdGhlIHZpZXdwb3J0IHdoZW4gdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgZnJvbSB0aGUgdmlld3BvcnRcbiAgICogb3JpZ2luYWxseS5cbiAgICogQHBhcmFtIHNvdXJjZSBXaGljaCBjb21wb25lbnQgdGhlIGV2ZW50IGNhbWUgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnNjcm9sbExpbmVzKGRpc3AsIHN1cHByZXNzU2Nyb2xsRXZlbnQsIHNvdXJjZSk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsUGFnZXMocGFnZUNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbExpbmVzKHBhZ2VDb3VudCAqICh0aGlzLnJvd3MgLSAxKSk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsVG9Ub3AoKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxMaW5lcygtdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApO1xuICB9XG5cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsTGluZXModGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsVG9MaW5lKGxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbEFtb3VudCA9IGxpbmUgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcDtcbiAgICBpZiAoc2Nyb2xsQW1vdW50ICE9PSAwKSB7XG4gICAgICB0aGlzLnNjcm9sbExpbmVzKHNjcm9sbEFtb3VudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFkZCBoYW5kbGVyIGZvciBFU0MgZXNjYXBlIHNlcXVlbmNlLiBTZWUgeHRlcm0uZC50cyBmb3IgZGV0YWlscy4gKi9cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJFc2NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQWRkIGhhbmRsZXIgZm9yIERDUyBlc2NhcGUgc2VxdWVuY2UuIFNlZSB4dGVybS5kLnRzIGZvciBkZXRhaWxzLiAqL1xuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZywgcGFyYW06IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJEY3NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQWRkIGhhbmRsZXIgZm9yIENTSSBlc2NhcGUgc2VxdWVuY2UuIFNlZSB4dGVybS5kLnRzIGZvciBkZXRhaWxzLiAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDc2lIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKHBhcmFtczogSVBhcmFtcykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0SGFuZGxlci5yZWdpc3RlckNzaUhhbmRsZXIoaWQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBBZGQgaGFuZGxlciBmb3IgT1NDIGVzY2FwZSBzZXF1ZW5jZS4gU2VlIHh0ZXJtLmQudHMgZm9yIGRldGFpbHMuICovXG4gIHB1YmxpYyByZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQ6IG51bWJlciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldHVwKCk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnB1dEhhbmRsZXIucmVzZXQoKTtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLmNvcmVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5jb3JlTW91c2VTZXJ2aWNlLnJlc2V0KCk7XG4gIH1cblxuXG4gIHByaXZhdGUgX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gZmFsc2U7XG4gICAgY29uc3Qgd2luZG93c1B0eSA9IHRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzUHR5O1xuICAgIGlmICh3aW5kb3dzUHR5ICYmIHdpbmRvd3NQdHkuYnVpbGROdW1iZXIgIT09IHVuZGVmaW5lZCAmJiB3aW5kb3dzUHR5LmJ1aWxkTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gISEod2luZG93c1B0eS5iYWNrZW5kID09PSAnY29ucHR5JyAmJiB3aW5kb3dzUHR5LmJ1aWxkTnVtYmVyIDwgMjEzNzYpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NNb2RlKSB7XG4gICAgICB2YWx1ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fZW5hYmxlV2luZG93c1dyYXBwaW5nSGV1cmlzdGljcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9lbmFibGVXaW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fd2luZG93c1dyYXBwaW5nSGV1cmlzdGljcy52YWx1ZSkge1xuICAgICAgY29uc3QgZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgICAgIGRpc3Bvc2FibGVzLnB1c2godGhpcy5vbkxpbmVGZWVkKHVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlLmJpbmQobnVsbCwgdGhpcy5fYnVmZmVyU2VydmljZSkpKTtcbiAgICAgIGRpc3Bvc2FibGVzLnB1c2godGhpcy5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0gnIH0sICgpID0+IHtcbiAgICAgICAgdXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUodGhpcy5fYnVmZmVyU2VydmljZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMuX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MudmFsdWUgPSB0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGQgb2YgZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgICBkLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgQ2hyaXN0b3BoZXIgSmVmZnJleSAoTUlUIExpY2Vuc2UpXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJSW5wdXRIYW5kbGVyLCBJQXR0cmlidXRlRGF0YSwgSURpc3Bvc2FibGUsIElXaW5kb3dPcHRpb25zLCBJQ29sb3JFdmVudCwgSVBhcnNlU3RhY2ssIENvbG9ySW5kZXgsIENvbG9yUmVxdWVzdFR5cGUsIFNwZWNpYWxDb2xvckluZGV4IH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEMwLCBDMSB9IGZyb20gJ2NvbW1vbi9kYXRhL0VzY2FwZVNlcXVlbmNlcyc7XG5pbXBvcnQgeyBDSEFSU0VUUywgREVGQVVMVF9DSEFSU0VUIH0gZnJvbSAnY29tbW9uL2RhdGEvQ2hhcnNldHMnO1xuaW1wb3J0IHsgRXNjYXBlU2VxdWVuY2VQYXJzZXIgfSBmcm9tICdjb21tb24vcGFyc2VyL0VzY2FwZVNlcXVlbmNlUGFyc2VyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IFN0cmluZ1RvVXRmMzIsIHN0cmluZ0Zyb21Db2RlUG9pbnQsIFV0ZjhUb1V0ZjMyIH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcbmltcG9ydCB7IEJ1ZmZlckxpbmUsIERFRkFVTFRfQVRUUl9EQVRBIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9CdWZmZXJMaW5lJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSVBhcnNpbmdTdGF0ZSwgSUVzY2FwZVNlcXVlbmNlUGFyc2VyLCBJUGFyYW1zLCBJRnVuY3Rpb25JZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3BhcnNlci9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NFTExfQ09ERSwgTlVMTF9DRUxMX1dJRFRILCBBdHRyaWJ1dGVzLCBGZ0ZsYWdzLCBCZ0ZsYWdzLCBDb250ZW50LCBVbmRlcmxpbmVTdHlsZSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IElDb3JlU2VydmljZSwgSUJ1ZmZlclNlcnZpY2UsIElPcHRpb25zU2VydmljZSwgSUxvZ1NlcnZpY2UsIElDb3JlTW91c2VTZXJ2aWNlLCBJQ2hhcnNldFNlcnZpY2UsIElVbmljb2RlU2VydmljZSwgTG9nTGV2ZWxFbnVtLCBJT3NjTGlua1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVW5pY29kZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvVW5pY29kZVNlcnZpY2UnO1xuaW1wb3J0IHsgT3NjSGFuZGxlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvT3NjUGFyc2VyJztcbmltcG9ydCB7IERjc0hhbmRsZXIgfSBmcm9tICdjb21tb24vcGFyc2VyL0Rjc1BhcnNlcic7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBwYXJzZUNvbG9yIH0gZnJvbSAnY29tbW9uL2lucHV0L1hQYXJzZUNvbG9yJztcblxuLyoqXG4gKiBNYXAgY29sbGVjdCB0byBnbGV2ZWwuIFVzZWQgaW4gYHNlbGVjdENoYXJzZXRgLlxuICovXG5jb25zdCBHTEVWRUw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7ICcoJzogMCwgJyknOiAxLCAnKic6IDIsICcrJzogMywgJy0nOiAxLCAnLic6IDIgfTtcblxuLyoqXG4gKiBWVCBjb21tYW5kcyBkb25lIGJ5IHRoZSBwYXJzZXIgLSBGSVhNRTogbW92ZSB0aGlzIHRvIHRoZSBwYXJzZXI/XG4gKi9cbi8vIEB2dDogI1kgICBFU0MgICBDU0kgICBcIkNvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlclwiICAgXCJFU0MgW1wiICAgXCJTdGFydCBvZiBhIENTSSBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEVTQyAgIE9TQyAgIFwiT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kXCIgICAgICBcIkVTQyBdXCIgICBcIlN0YXJ0IG9mIGFuIE9TQyBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEVTQyAgIERDUyAgIFwiRGV2aWNlIENvbnRyb2wgU3RyaW5nXCIgICAgICAgICBcIkVTQyBQXCIgICBcIlN0YXJ0IG9mIGEgRENTIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgRVNDICAgU1QgICAgXCJTdHJpbmcgVGVybWluYXRvclwiICAgICAgICAgICAgIFwiRVNDIFxcXCIgICBcIlRlcm1pbmF0b3IgdXNlZCBmb3Igc3RyaW5nIHR5cGUgc2VxdWVuY2VzLlwiXG4vLyBAdnQ6ICNZICAgRVNDICAgUE0gICAgXCJQcml2YWN5IE1lc3NhZ2VcIiAgICAgICAgICAgICAgIFwiRVNDIF5cIiAgIFwiU3RhcnQgb2YgYSBwcml2YWN5IG1lc3NhZ2UuXCJcbi8vIEB2dDogI1kgICBFU0MgICBBUEMgICBcIkFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZFwiICAgXCJFU0MgX1wiICAgXCJTdGFydCBvZiBhbiBBUEMgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBDU0kgICBcIkNvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlclwiICAgXCJcXHg5QlwiICAgIFwiU3RhcnQgb2YgYSBDU0kgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBPU0MgICBcIk9wZXJhdGluZyBTeXN0ZW0gQ29tbWFuZFwiICAgICAgXCJcXHg5RFwiICAgIFwiU3RhcnQgb2YgYW4gT1NDIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgQzEgICAgRENTICAgXCJEZXZpY2UgQ29udHJvbCBTdHJpbmdcIiAgICAgICAgIFwiXFx4OTBcIiAgICBcIlN0YXJ0IG9mIGEgRENTIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgQzEgICAgU1QgICAgXCJTdHJpbmcgVGVybWluYXRvclwiICAgICAgICAgICAgIFwiXFx4OUNcIiAgICBcIlRlcm1pbmF0b3IgdXNlZCBmb3Igc3RyaW5nIHR5cGUgc2VxdWVuY2VzLlwiXG4vLyBAdnQ6ICNZICAgQzEgICAgUE0gICAgXCJQcml2YWN5IE1lc3NhZ2VcIiAgICAgICAgICAgICAgIFwiXFx4OUVcIiAgICBcIlN0YXJ0IG9mIGEgcHJpdmFjeSBtZXNzYWdlLlwiXG4vLyBAdnQ6ICNZICAgQzEgICAgQVBDICAgXCJBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmRcIiAgIFwiXFx4OUZcIiAgICBcIlN0YXJ0IG9mIGFuIEFQQyBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEMwICAgIE5VTCAgIFwiTnVsbFwiICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcMCwgXFx4MDBcIiAgXCJOVUwgaXMgaWdub3JlZC5cIlxuLy8gQHZ0OiAjWSAgIEMwICAgIEVTQyAgIFwiRXNjYXBlXCIgICAgICAgICAgICAgICAgICAgICAgICBcIlxcZSwgXFx4MUJcIiAgXCJTdGFydCBvZiBhIHNlcXVlbmNlLiBDYW5jZWxzIGFueSBvdGhlciBzZXF1ZW5jZS5cIlxuXG4vKipcbiAqIERvY3VtZW50IHh0ZXJtIFZUIGZlYXR1cmVzIGhlcmUgdGhhdCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkXG4gKi9cbi8vIEB2dDogI0VbU3VwcG9ydGVkIHZpYSBAeHRlcm0vYWRkb24taW1hZ2UuXSAgRENTICAgU0lYRUwgICAgICAgXCJTSVhFTCBHcmFwaGljc1wiICAgICAgICAgIFwiRENTIFBzIDsgUHMgOyBQcyA7IHEgXHRQdCBTVFwiICBcIkRyYXcgU0lYRUwgaW1hZ2UuXCJcbi8vIEB2dDogI04gIERDUyAgIERFQ1VESyAgICAgIFwiVXNlciBEZWZpbmVkIEtleXNcIiAgICAgICBcIkRDUyBQcyA7IFBzIFxcfCBQdCBTVFwiICAgICAgICAgICBcIkRlZmluaXRpb25zIGZvciB1c2VyLWRlZmluZWQga2V5cy5cIlxuLy8gQHZ0OiAjTiAgRENTICAgWFRHRVRUQ0FQICAgXCJSZXF1ZXN0IFRlcm1pbmZvIFN0cmluZ1wiIFwiRENTICsgcSBQdCBTVFwiICAgICAgICAgICAgICAgICBcIlJlcXVlc3QgVGVybWluZm8gU3RyaW5nLlwiXG4vLyBAdnQ6ICNOICBEQ1MgICBYVFNFVFRDQVAgICBcIlNldCBUZXJtaW5mbyBEYXRhXCIgICAgICAgXCJEQ1MgKyBwIFB0IFNUXCIgICAgICAgICAgICAgICAgIFwiU2V0IFRlcm1pbmZvIERhdGEuXCJcbi8vIEB2dDogI04gIE9TQyAgIDEgICAgICAgICAgIFwiU2V0IEljb24gTmFtZVwiICAgICAgICAgICBcIk9TQyAxIDsgUHQgQkVMXCIgICAgICAgICAgICAgICAgXCJTZXQgaWNvbiBuYW1lLlwiXG5cbi8qKlxuICogTWF4IGxlbmd0aCBvZiB0aGUgVVRGMzIgaW5wdXQgYnVmZmVyLiBSZWFsIG1lbW9yeSBjb25zdW1wdGlvbiBpcyA0IHRpbWVzIGhpZ2hlci5cbiAqL1xuY29uc3QgTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCA9IDEzMTA3MjtcblxuLyoqXG4gKiBMaW1pdCBsZW5ndGggb2YgdGl0bGUgYW5kIGljb24gbmFtZSBzdGFja3MuXG4gKi9cbmNvbnN0IFNUQUNLX0xJTUlUID0gMTA7XG5cbi8vIG1hcCBwYXJhbXMgdG8gd2luZG93IG9wdGlvblxuZnVuY3Rpb24gcGFyYW1Ub1dpbmRvd09wdGlvbihuOiBudW1iZXIsIG9wdHM6IElXaW5kb3dPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChuID4gMjQpIHtcbiAgICByZXR1cm4gb3B0cy5zZXRXaW5MaW5lcyB8fCBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDE6IHJldHVybiAhIW9wdHMucmVzdG9yZVdpbjtcbiAgICBjYXNlIDI6IHJldHVybiAhIW9wdHMubWluaW1pemVXaW47XG4gICAgY2FzZSAzOiByZXR1cm4gISFvcHRzLnNldFdpblBvc2l0aW9uO1xuICAgIGNhc2UgNDogcmV0dXJuICEhb3B0cy5zZXRXaW5TaXplUGl4ZWxzO1xuICAgIGNhc2UgNTogcmV0dXJuICEhb3B0cy5yYWlzZVdpbjtcbiAgICBjYXNlIDY6IHJldHVybiAhIW9wdHMubG93ZXJXaW47XG4gICAgY2FzZSA3OiByZXR1cm4gISFvcHRzLnJlZnJlc2hXaW47XG4gICAgY2FzZSA4OiByZXR1cm4gISFvcHRzLnNldFdpblNpemVDaGFycztcbiAgICBjYXNlIDk6IHJldHVybiAhIW9wdHMubWF4aW1pemVXaW47XG4gICAgY2FzZSAxMDogcmV0dXJuICEhb3B0cy5mdWxsc2NyZWVuV2luO1xuICAgIGNhc2UgMTE6IHJldHVybiAhIW9wdHMuZ2V0V2luU3RhdGU7XG4gICAgY2FzZSAxMzogcmV0dXJuICEhb3B0cy5nZXRXaW5Qb3NpdGlvbjtcbiAgICBjYXNlIDE0OiByZXR1cm4gISFvcHRzLmdldFdpblNpemVQaXhlbHM7XG4gICAgY2FzZSAxNTogcmV0dXJuICEhb3B0cy5nZXRTY3JlZW5TaXplUGl4ZWxzO1xuICAgIGNhc2UgMTY6IHJldHVybiAhIW9wdHMuZ2V0Q2VsbFNpemVQaXhlbHM7XG4gICAgY2FzZSAxODogcmV0dXJuICEhb3B0cy5nZXRXaW5TaXplQ2hhcnM7XG4gICAgY2FzZSAxOTogcmV0dXJuICEhb3B0cy5nZXRTY3JlZW5TaXplQ2hhcnM7XG4gICAgY2FzZSAyMDogcmV0dXJuICEhb3B0cy5nZXRJY29uVGl0bGU7XG4gICAgY2FzZSAyMTogcmV0dXJuICEhb3B0cy5nZXRXaW5UaXRsZTtcbiAgICBjYXNlIDIyOiByZXR1cm4gISFvcHRzLnB1c2hUaXRsZTtcbiAgICBjYXNlIDIzOiByZXR1cm4gISFvcHRzLnBvcFRpdGxlO1xuICAgIGNhc2UgMjQ6IHJldHVybiAhIW9wdHMuc2V0V2luTGluZXM7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZW51bSBXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGUge1xuICBHRVRfV0lOX1NJWkVfUElYRUxTID0gMCxcbiAgR0VUX0NFTExfU0laRV9QSVhFTFMgPSAxXG59XG5cbi8vIGNyZWF0ZSBhIHdhcm5pbmcgbG9nIGlmIGFuIGFzeW5jIGhhbmRsZXIgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIGxpbWl0IChpbiBtcylcbmNvbnN0IFNMT1dfQVNZTkNfTElNSVQgPSA1MDAwO1xuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkdGVtcCA9IDA7XG5cbi8qKlxuICogVGhlIHRlcm1pbmFsJ3Mgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgSUlucHV0SGFuZGxlciwgdGhpcyBoYW5kbGVzIGFsbFxuICogaW5wdXQgZnJvbSB0aGUgUGFyc2VyLlxuICpcbiAqIFJlZmVyIHRvIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC94dGVybS9jdGxzZXFzL2N0bHNlcXMuaHRtbCB0byB1bmRlcnN0YW5kXG4gKiBlYWNoIGZ1bmN0aW9uJ3MgaGVhZGVyIGNvbW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dEhhbmRsZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUlucHV0SGFuZGxlciB7XG4gIHByaXZhdGUgX3BhcnNlQnVmZmVyOiBVaW50MzJBcnJheSA9IG5ldyBVaW50MzJBcnJheSg0MDk2KTtcbiAgcHJpdmF0ZSBfc3RyaW5nRGVjb2RlcjogU3RyaW5nVG9VdGYzMiA9IG5ldyBTdHJpbmdUb1V0ZjMyKCk7XG4gIHByaXZhdGUgX3V0ZjhEZWNvZGVyOiBVdGY4VG9VdGYzMiA9IG5ldyBVdGY4VG9VdGYzMigpO1xuICBwcml2YXRlIF93b3JrQ2VsbDogQ2VsbERhdGEgPSBuZXcgQ2VsbERhdGEoKTtcbiAgcHJpdmF0ZSBfd2luZG93VGl0bGUgPSAnJztcbiAgcHJpdmF0ZSBfaWNvbk5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfZGlydHlSb3dUcmFja2VyOiBJRGlydHlSb3dUcmFja2VyO1xuICBwcm90ZWN0ZWQgX3dpbmRvd1RpdGxlU3RhY2s6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBfaWNvbk5hbWVTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICBwcml2YXRlIF9jdXJBdHRyRGF0YTogSUF0dHJpYnV0ZURhdGEgPSBERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpO1xuICBwdWJsaWMgZ2V0QXR0ckRhdGEoKTogSUF0dHJpYnV0ZURhdGEgeyByZXR1cm4gdGhpcy5fY3VyQXR0ckRhdGE7IH1cbiAgcHJpdmF0ZSBfZXJhc2VBdHRyRGF0YUludGVybmFsOiBJQXR0cmlidXRlRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG5cbiAgcHJpdmF0ZSBfYWN0aXZlQnVmZmVyOiBJQnVmZmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdEJlbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RCZWxsID0gdGhpcy5fb25SZXF1ZXN0QmVsbC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0UmVmcmVzaFJvd3MgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyLCBudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0UmVmcmVzaFJvd3MgPSB0aGlzLl9vblJlcXVlc3RSZWZyZXNoUm93cy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0UmVzZXQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZXNldCA9IHRoaXMuX29uUmVxdWVzdFJlc2V0LmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RTZW5kRm9jdXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RTZW5kRm9jdXMgPSB0aGlzLl9vblJlcXVlc3RTZW5kRm9jdXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFN5bmNTY3JvbGxCYXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RTeW5jU2Nyb2xsQmFyID0gdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8V2luZG93c09wdGlvbnNSZXBvcnRUeXBlPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0ID0gdGhpcy5fb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQuZXZlbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25BMTF5Q2hhciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BMTF5Q2hhciA9IHRoaXMuX29uQTExeUNoYXIuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQTExeVRhYiA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BMTF5VGFiID0gdGhpcy5fb25BMTF5VGFiLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkN1cnNvck1vdmUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkN1cnNvck1vdmUgPSB0aGlzLl9vbkN1cnNvck1vdmUuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uTGluZUZlZWQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkxpbmVGZWVkID0gdGhpcy5fb25MaW5lRmVlZC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TY3JvbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2Nyb2xsID0gdGhpcy5fb25TY3JvbGwuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uVGl0bGVDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uVGl0bGVDaGFuZ2UgPSB0aGlzLl9vblRpdGxlQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNvbG9yID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElDb2xvckV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ29sb3IgPSB0aGlzLl9vbkNvbG9yLmV2ZW50O1xuXG4gIHByaXZhdGUgX3BhcnNlU3RhY2s6IElQYXJzZVN0YWNrID0ge1xuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgY3Vyc29yU3RhcnRYOiAwLFxuICAgIGN1cnNvclN0YXJ0WTogMCxcbiAgICBkZWNvZGVkTGVuZ3RoOiAwLFxuICAgIHBvc2l0aW9uOiAwXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhcnNldFNlcnZpY2U6IElDaGFyc2V0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1NlcnZpY2U6IElMb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3NjTGlua1NlcnZpY2U6IElPc2NMaW5rU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlTW91c2VTZXJ2aWNlOiBJQ29yZU1vdXNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF91bmljb2RlU2VydmljZTogSVVuaWNvZGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcnNlcjogSUVzY2FwZVNlcXVlbmNlUGFyc2VyID0gbmV3IEVzY2FwZVNlcXVlbmNlUGFyc2VyKClcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3BhcnNlcik7XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyID0gbmV3IERpcnR5Um93VHJhY2tlcih0aGlzLl9idWZmZXJTZXJ2aWNlKTtcblxuICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdXNlZCBpbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBjb2RlIG1hbnVhbGx5IHRvIGF2b2lkIHVzaW5nIHNsb3cgZ2V0dGVyc1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoZSA9PiB0aGlzLl9hY3RpdmVCdWZmZXIgPSBlLmFjdGl2ZUJ1ZmZlcikpO1xuXG4gICAgLyoqXG4gICAgICogY3VzdG9tIGZhbGxiYWNrIGhhbmRsZXJzXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnNldENzaUhhbmRsZXJGYWxsYmFjaygoaWRlbnQsIHBhcmFtcykgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBDU0kgY29kZTogJywgeyBpZGVudGlmaWVyOiB0aGlzLl9wYXJzZXIuaWRlbnRUb1N0cmluZyhpZGVudCksIHBhcmFtczogcGFyYW1zLnRvQXJyYXkoKSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXNjSGFuZGxlckZhbGxiYWNrKGlkZW50ID0+IHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Vua25vd24gRVNDIGNvZGU6ICcsIHsgaWRlbnRpZmllcjogdGhpcy5fcGFyc2VyLmlkZW50VG9TdHJpbmcoaWRlbnQpIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlckZhbGxiYWNrKGNvZGUgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBFWEVDVVRFIGNvZGU6ICcsIHsgY29kZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0T3NjSGFuZGxlckZhbGxiYWNrKChpZGVudGlmaWVyLCBhY3Rpb24sIGRhdGEpID0+IHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Vua25vd24gT1NDIGNvZGU6ICcsIHsgaWRlbnRpZmllciwgYWN0aW9uLCBkYXRhIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BhcnNlci5zZXREY3NIYW5kbGVyRmFsbGJhY2soKGlkZW50LCBhY3Rpb24sIHBheWxvYWQpID0+IHtcbiAgICAgIGlmIChhY3Rpb24gPT09ICdIT09LJykge1xuICAgICAgICBwYXlsb2FkID0gcGF5bG9hZC50b0FycmF5KCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmtub3duIERDUyBjb2RlOiAnLCB7IGlkZW50aWZpZXI6IHRoaXMuX3BhcnNlci5pZGVudFRvU3RyaW5nKGlkZW50KSwgYWN0aW9uLCBwYXlsb2FkIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogcHJpbnQgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5zZXRQcmludEhhbmRsZXIoKGRhdGEsIHN0YXJ0LCBlbmQpID0+IHRoaXMucHJpbnQoZGF0YSwgc3RhcnQsIGVuZCkpO1xuXG4gICAgLyoqXG4gICAgICogQ1NJIGhhbmRsZXJcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdAJyB9LCBwYXJhbXMgPT4gdGhpcy5pbnNlcnRDaGFycyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyAnLCBmaW5hbDogJ0AnIH0sIHBhcmFtcyA9PiB0aGlzLnNjcm9sbExlZnQocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnQScgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yVXAocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcgJywgZmluYWw6ICdBJyB9LCBwYXJhbXMgPT4gdGhpcy5zY3JvbGxSaWdodChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdCJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JEb3duKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0MnIH0sIHBhcmFtcyA9PiB0aGlzLmN1cnNvckZvcndhcmQocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnRCcgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yQmFja3dhcmQocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnRScgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yTmV4dExpbmUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnRicgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yUHJlY2VkaW5nTGluZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdHJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JDaGFyQWJzb2x1dGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnSCcgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yUG9zaXRpb24ocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnSScgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yRm9yd2FyZFRhYihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdKJyB9LCBwYXJhbXMgPT4gdGhpcy5lcmFzZUluRGlzcGxheShwYXJhbXMsIGZhbHNlKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBmaW5hbDogJ0onIH0sIHBhcmFtcyA9PiB0aGlzLmVyYXNlSW5EaXNwbGF5KHBhcmFtcywgdHJ1ZSkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0snIH0sIHBhcmFtcyA9PiB0aGlzLmVyYXNlSW5MaW5lKHBhcmFtcywgZmFsc2UpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgcHJlZml4OiAnPycsIGZpbmFsOiAnSycgfSwgcGFyYW1zID0+IHRoaXMuZXJhc2VJbkxpbmUocGFyYW1zLCB0cnVlKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnTCcgfSwgcGFyYW1zID0+IHRoaXMuaW5zZXJ0TGluZXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnTScgfSwgcGFyYW1zID0+IHRoaXMuZGVsZXRlTGluZXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnUCcgfSwgcGFyYW1zID0+IHRoaXMuZGVsZXRlQ2hhcnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnUycgfSwgcGFyYW1zID0+IHRoaXMuc2Nyb2xsVXAocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnVCcgfSwgcGFyYW1zID0+IHRoaXMuc2Nyb2xsRG93bihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdYJyB9LCBwYXJhbXMgPT4gdGhpcy5lcmFzZUNoYXJzKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ1onIH0sIHBhcmFtcyA9PiB0aGlzLmN1cnNvckJhY2t3YXJkVGFiKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2AnIH0sIHBhcmFtcyA9PiB0aGlzLmNoYXJQb3NBYnNvbHV0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdhJyB9LCBwYXJhbXMgPT4gdGhpcy5oUG9zaXRpb25SZWxhdGl2ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdiJyB9LCBwYXJhbXMgPT4gdGhpcy5yZXBlYXRQcmVjZWRpbmdDaGFyYWN0ZXIocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnYycgfSwgcGFyYW1zID0+IHRoaXMuc2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5KHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBwcmVmaXg6ICc+JywgZmluYWw6ICdjJyB9LCBwYXJhbXMgPT4gdGhpcy5zZW5kRGV2aWNlQXR0cmlidXRlc1NlY29uZGFyeShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdkJyB9LCBwYXJhbXMgPT4gdGhpcy5saW5lUG9zQWJzb2x1dGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnZScgfSwgcGFyYW1zID0+IHRoaXMudlBvc2l0aW9uUmVsYXRpdmUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnZicgfSwgcGFyYW1zID0+IHRoaXMuaFZQb3NpdGlvbihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdnJyB9LCBwYXJhbXMgPT4gdGhpcy50YWJDbGVhcihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdoJyB9LCBwYXJhbXMgPT4gdGhpcy5zZXRNb2RlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBwcmVmaXg6ICc/JywgZmluYWw6ICdoJyB9LCBwYXJhbXMgPT4gdGhpcy5zZXRNb2RlUHJpdmF0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdsJyB9LCBwYXJhbXMgPT4gdGhpcy5yZXNldE1vZGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBmaW5hbDogJ2wnIH0sIHBhcmFtcyA9PiB0aGlzLnJlc2V0TW9kZVByaXZhdGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnbScgfSwgcGFyYW1zID0+IHRoaXMuY2hhckF0dHJpYnV0ZXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnbicgfSwgcGFyYW1zID0+IHRoaXMuZGV2aWNlU3RhdHVzKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBwcmVmaXg6ICc/JywgZmluYWw6ICduJyB9LCBwYXJhbXMgPT4gdGhpcy5kZXZpY2VTdGF0dXNQcml2YXRlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnIScsIGZpbmFsOiAncCcgfSwgcGFyYW1zID0+IHRoaXMuc29mdFJlc2V0KHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnICcsIGZpbmFsOiAncScgfSwgcGFyYW1zID0+IHRoaXMuc2V0Q3Vyc29yU3R5bGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAncicgfSwgcGFyYW1zID0+IHRoaXMuc2V0U2Nyb2xsUmVnaW9uKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ3MnIH0sIHBhcmFtcyA9PiB0aGlzLnNhdmVDdXJzb3IocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAndCcgfSwgcGFyYW1zID0+IHRoaXMud2luZG93T3B0aW9ucyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICd1JyB9LCBwYXJhbXMgPT4gdGhpcy5yZXN0b3JlQ3Vyc29yKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnXFwnJywgZmluYWw6ICd9JyB9LCBwYXJhbXMgPT4gdGhpcy5pbnNlcnRDb2x1bW5zKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnXFwnJywgZmluYWw6ICd+JyB9LCBwYXJhbXMgPT4gdGhpcy5kZWxldGVDb2x1bW5zKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnXCInLCBmaW5hbDogJ3EnIH0sIHBhcmFtcyA9PiB0aGlzLnNlbGVjdFByb3RlY3RlZChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyQnLCBmaW5hbDogJ3AnIH0sIHBhcmFtcyA9PiB0aGlzLnJlcXVlc3RNb2RlKHBhcmFtcywgdHJ1ZSkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBwcmVmaXg6ICc/JywgaW50ZXJtZWRpYXRlczogJyQnLCBmaW5hbDogJ3AnIH0sIHBhcmFtcyA9PiB0aGlzLnJlcXVlc3RNb2RlKHBhcmFtcywgZmFsc2UpKTtcblxuICAgIC8qKlxuICAgICAqIGV4ZWN1dGUgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5CRUwsICgpID0+IHRoaXMuYmVsbCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuTEYsICgpID0+IHRoaXMubGluZUZlZWQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLlZULCAoKSA9PiB0aGlzLmxpbmVGZWVkKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5GRiwgKCkgPT4gdGhpcy5saW5lRmVlZCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuQ1IsICgpID0+IHRoaXMuY2FycmlhZ2VSZXR1cm4oKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLkJTLCAoKSA9PiB0aGlzLmJhY2tzcGFjZSgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuSFQsICgpID0+IHRoaXMudGFiKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5TTywgKCkgPT4gdGhpcy5zaGlmdE91dCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuU0ksICgpID0+IHRoaXMuc2hpZnRJbigpKTtcbiAgICAvLyBGSVhNRTogICBXaGF0IGRvIHRvIHdpdGggbWlzc2luZz8gT2xkIGNvZGUganVzdCBhZGRlZCB0aG9zZSB0byBwcmludC5cblxuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMS5JTkQsICgpID0+IHRoaXMuaW5kZXgoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMxLk5FTCwgKCkgPT4gdGhpcy5uZXh0TGluZSgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzEuSFRTLCAoKSA9PiB0aGlzLnRhYlNldCgpKTtcblxuICAgIC8qKlxuICAgICAqIE9TQyBoYW5kbGVyXG4gICAgICovXG4gICAgLy8gICAwIC0gaWNvbiBuYW1lICsgdGl0bGVcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDAsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4geyB0aGlzLnNldFRpdGxlKGRhdGEpOyB0aGlzLnNldEljb25OYW1lKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfSkpO1xuICAgIC8vICAgMSAtIGljb24gbmFtZVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMSwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldEljb25OYW1lKGRhdGEpKSk7XG4gICAgLy8gICAyIC0gdGl0bGVcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDIsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5zZXRUaXRsZShkYXRhKSkpO1xuICAgIC8vICAgMyAtIHNldCBwcm9wZXJ0eSBYIGluIHRoZSBmb3JtIFwicHJvcD12YWx1ZVwiXG4gICAgLy8gICA0IC0gQ2hhbmdlIENvbG9yIE51bWJlclxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoNCwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldE9yUmVwb3J0SW5kZXhlZENvbG9yKGRhdGEpKSk7XG4gICAgLy8gICA1IC0gQ2hhbmdlIFNwZWNpYWwgQ29sb3IgTnVtYmVyXG4gICAgLy8gICA2IC0gRW5hYmxlL2Rpc2FibGUgU3BlY2lhbCBDb2xvciBOdW1iZXIgY1xuICAgIC8vICAgNyAtIGN1cnJlbnQgZGlyZWN0b3J5PyAobm90IGluIHh0ZXJtIHNwZWMsIHNlZSBodHRwczovL2dpdGxhYi5jb20vZ25hY2htYW4vaXRlcm0yL2lzc3Vlcy8zOTM5KVxuICAgIC8vICAgOCAtIGNyZWF0ZSBoeXBlcmxpbmsgKG5vdCBpbiB4dGVybSBzcGVjLCBzZWUgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZWdtb250a29iL2ViMTE0Mjk0ZWZiY2Q1YWRiMTk0NGM5ZjNjYjVmZWRhKVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoOCwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldEh5cGVybGluayhkYXRhKSkpO1xuICAgIC8vICAxMCAtIENoYW5nZSBWVDEwMCB0ZXh0IGZvcmVncm91bmQgY29sb3IgdG8gUHQuXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMCwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldE9yUmVwb3J0RmdDb2xvcihkYXRhKSkpO1xuICAgIC8vICAxMSAtIENoYW5nZSBWVDEwMCB0ZXh0IGJhY2tncm91bmQgY29sb3IgdG8gUHQuXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMSwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldE9yUmVwb3J0QmdDb2xvcihkYXRhKSkpO1xuICAgIC8vICAxMiAtIENoYW5nZSB0ZXh0IGN1cnNvciBjb2xvciB0byBQdC5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDEyLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRDdXJzb3JDb2xvcihkYXRhKSkpO1xuICAgIC8vICAxMyAtIENoYW5nZSBtb3VzZSBmb3JlZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICAxNCAtIENoYW5nZSBtb3VzZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICAxNSAtIENoYW5nZSBUZWt0cm9uaXggZm9yZWdyb3VuZCBjb2xvciB0byBQdC5cbiAgICAvLyAgMTYgLSBDaGFuZ2UgVGVrdHJvbml4IGJhY2tncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE3IC0gQ2hhbmdlIGhpZ2hsaWdodCBiYWNrZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICAxOCAtIENoYW5nZSBUZWt0cm9uaXggY3Vyc29yIGNvbG9yIHRvIFB0LlxuICAgIC8vICAxOSAtIENoYW5nZSBoaWdobGlnaHQgZm9yZWdyb3VuZCBjb2xvciB0byBQdC5cbiAgICAvLyAgNDYgLSBDaGFuZ2UgTG9nIEZpbGUgdG8gUHQuXG4gICAgLy8gIDUwIC0gU2V0IEZvbnQgdG8gUHQuXG4gICAgLy8gIDUxIC0gcmVzZXJ2ZWQgZm9yIEVtYWNzIHNoZWxsLlxuICAgIC8vICA1MiAtIE1hbmlwdWxhdGUgU2VsZWN0aW9uIERhdGEuXG4gICAgLy8gMTA0IDsgYyAtIFJlc2V0IENvbG9yIE51bWJlciBjLlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTA0LCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMucmVzdG9yZUluZGV4ZWRDb2xvcihkYXRhKSkpO1xuICAgIC8vIDEwNSA7IGMgLSBSZXNldCBTcGVjaWFsIENvbG9yIE51bWJlciBjLlxuICAgIC8vIDEwNiA7IGM7IGYgLSBFbmFibGUvZGlzYWJsZSBTcGVjaWFsIENvbG9yIE51bWJlciBjLlxuICAgIC8vIDExMCAtIFJlc2V0IFZUMTAwIHRleHQgZm9yZWdyb3VuZCBjb2xvci5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDExMCwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnJlc3RvcmVGZ0NvbG9yKGRhdGEpKSk7XG4gICAgLy8gMTExIC0gUmVzZXQgVlQxMDAgdGV4dCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTExLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMucmVzdG9yZUJnQ29sb3IoZGF0YSkpKTtcbiAgICAvLyAxMTIgLSBSZXNldCB0ZXh0IGN1cnNvciBjb2xvci5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDExMiwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnJlc3RvcmVDdXJzb3JDb2xvcihkYXRhKSkpO1xuICAgIC8vIDExMyAtIFJlc2V0IG1vdXNlIGZvcmVncm91bmQgY29sb3IuXG4gICAgLy8gMTE0IC0gUmVzZXQgbW91c2UgYmFja2dyb3VuZCBjb2xvci5cbiAgICAvLyAxMTUgLSBSZXNldCBUZWt0cm9uaXggZm9yZWdyb3VuZCBjb2xvci5cbiAgICAvLyAxMTYgLSBSZXNldCBUZWt0cm9uaXggYmFja2dyb3VuZCBjb2xvci5cbiAgICAvLyAxMTcgLSBSZXNldCBoaWdobGlnaHQgY29sb3IuXG4gICAgLy8gMTE4IC0gUmVzZXQgVGVrdHJvbml4IGN1cnNvciBjb2xvci5cbiAgICAvLyAxMTkgLSBSZXNldCBoaWdobGlnaHQgZm9yZWdyb3VuZCBjb2xvci5cblxuICAgIC8qKlxuICAgICAqIEVTQyBoYW5kbGVyc1xuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJzcnIH0sICgpID0+IHRoaXMuc2F2ZUN1cnNvcigpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICc4JyB9LCAoKSA9PiB0aGlzLnJlc3RvcmVDdXJzb3IoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnRCcgfSwgKCkgPT4gdGhpcy5pbmRleCgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdFJyB9LCAoKSA9PiB0aGlzLm5leHRMaW5lKCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ0gnIH0sICgpID0+IHRoaXMudGFiU2V0KCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ00nIH0sICgpID0+IHRoaXMucmV2ZXJzZUluZGV4KCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJz0nIH0sICgpID0+IHRoaXMua2V5cGFkQXBwbGljYXRpb25Nb2RlKCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJz4nIH0sICgpID0+IHRoaXMua2V5cGFkTnVtZXJpY01vZGUoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnYycgfSwgKCkgPT4gdGhpcy5mdWxsUmVzZXQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnbicgfSwgKCkgPT4gdGhpcy5zZXRnTGV2ZWwoMikpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ28nIH0sICgpID0+IHRoaXMuc2V0Z0xldmVsKDMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICd8JyB9LCAoKSA9PiB0aGlzLnNldGdMZXZlbCgzKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnfScgfSwgKCkgPT4gdGhpcy5zZXRnTGV2ZWwoMikpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ34nIH0sICgpID0+IHRoaXMuc2V0Z0xldmVsKDEpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyUnLCBmaW5hbDogJ0AnIH0sICgpID0+IHRoaXMuc2VsZWN0RGVmYXVsdENoYXJzZXQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICclJywgZmluYWw6ICdHJyB9LCAoKSA9PiB0aGlzLnNlbGVjdERlZmF1bHRDaGFyc2V0KCkpO1xuICAgIGZvciAoY29uc3QgZmxhZyBpbiBDSEFSU0VUUykge1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcoJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCcoJyArIGZsYWcpKTtcbiAgICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnKScsIGZpbmFsOiBmbGFnIH0sICgpID0+IHRoaXMuc2VsZWN0Q2hhcnNldCgnKScgKyBmbGFnKSk7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyonLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJyonICsgZmxhZykpO1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcrJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCcrJyArIGZsYWcpKTtcbiAgICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnLScsIGZpbmFsOiBmbGFnIH0sICgpID0+IHRoaXMuc2VsZWN0Q2hhcnNldCgnLScgKyBmbGFnKSk7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJy4nLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJy4nICsgZmxhZykpO1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcvJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCcvJyArIGZsYWcpKTsgLy8gVE9ETzogc3VwcG9ydGVkP1xuICAgIH1cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyMnLCBmaW5hbDogJzgnIH0sICgpID0+IHRoaXMuc2NyZWVuQWxpZ25tZW50UGF0dGVybigpKTtcblxuICAgIC8qKlxuICAgICAqIGVycm9yIGhhbmRsZXJcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzZXIuc2V0RXJyb3JIYW5kbGVyKChzdGF0ZTogSVBhcnNpbmdTdGF0ZSkgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5lcnJvcignUGFyc2luZyBlcnJvcjogJywgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogRENTIGhhbmRsZXJcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJEY3NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyQnLCBmaW5hbDogJ3EnIH0sIG5ldyBEY3NIYW5kbGVyKChkYXRhLCBwYXJhbXMpID0+IHRoaXMucmVxdWVzdFN0YXR1c1N0cmluZyhkYXRhLCBwYXJhbXMpKSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgcGFyc2Ugc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgX3ByZXNlcnZlU3RhY2soY3Vyc29yU3RhcnRYOiBudW1iZXIsIGN1cnNvclN0YXJ0WTogbnVtYmVyLCBkZWNvZGVkTGVuZ3RoOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLnBhdXNlZCA9IHRydWU7XG4gICAgdGhpcy5fcGFyc2VTdGFjay5jdXJzb3JTdGFydFggPSBjdXJzb3JTdGFydFg7XG4gICAgdGhpcy5fcGFyc2VTdGFjay5jdXJzb3JTdGFydFkgPSBjdXJzb3JTdGFydFk7XG4gICAgdGhpcy5fcGFyc2VTdGFjay5kZWNvZGVkTGVuZ3RoID0gZGVjb2RlZExlbmd0aDtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIF9sb2dTbG93UmVzb2x2aW5nQXN5bmMocDogUHJvbWlzZTxib29sZWFuPik6IHZvaWQge1xuICAgIC8vIGxvZyBhIGxpbWl0ZWQgd2FybmluZyBhYm91dCBhbiBhc3luYyBoYW5kbGVyIHRha2luZyB0b28gbG9uZ1xuICAgIGlmICh0aGlzLl9sb2dTZXJ2aWNlLmxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5XQVJOKSB7XG4gICAgICBQcm9taXNlLnJhY2UoW3AsIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4gc2V0VGltZW91dCgoKSA9PiByZWooJyNTTE9XX1RJTUVPVVQnKSwgU0xPV19BU1lOQ19MSU1JVCkpXSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGVyciAhPT0gJyNTTE9XX1RJTUVPVVQnKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUud2FybihgYXN5bmMgcGFyc2VyIGhhbmRsZXIgdGFraW5nIGxvbmdlciB0aGFuICR7U0xPV19BU1lOQ19MSU1JVH0gbXNgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q3VycmVudExpbmtJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZC51cmxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBjYWxsIHdpdGggYXN5bmMgaGFuZGxlciBzdXBwb3J0LlxuICAgKlxuICAgKiBXaGV0aGVyIHRoZSBzdGFjayBzdGF0ZSBnb3QgcHJlc2VydmVkIGZvciB0aGUgbmV4dCBjYWxsLCBpcyBpbmRpY2F0ZWQgYnkgdGhlIHJldHVybiB2YWx1ZTpcbiAgICogLSB1bmRlZmluZWQgKHZvaWQpOlxuICAgKiAgIGFsbCBoYW5kbGVycyB3ZXJlIHN5bmMsIG5vIHN0YWNrIHNhdmUsIGNvbnRpbnVlIG5vcm1hbGx5IHdpdGggbmV4dCBjaHVua1xuICAgKiAtIFByb21pc2VcXDxib29sZWFuXFw+OlxuICAgKiAgIGV4ZWN1dGlvbiBzdG9wcGVkIGF0IGFzeW5jIGhhbmRsZXIsIHN0YWNrIHNhdmVkLCBjb250aW51ZSB3aXRoIHNhbWUgY2h1bmsgYW5kIHRoZSBwcm9taXNlXG4gICAqICAgcmVzb2x2ZSB2YWx1ZSBhcyBgcHJvbWlzZVJlc3VsdGAgdW50aWwgdGhlIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBgVGVybWluYWwud3JpdGVgIHRvIGVuc3VyZSBjb3JyZWN0IGV4ZWN1dGlvbiBvcmRlclxuICAgKiBhbmQgcHJvcGVyIGNvbnRpbnVhdGlvbiBvZiBhc3luYyBwYXJzZXIgaGFuZGxlcnMuXG4gICAqL1xuICBwdWJsaWMgcGFyc2UoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgcHJvbWlzZVJlc3VsdD86IGJvb2xlYW4pOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogdm9pZCB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAgbGV0IGN1cnNvclN0YXJ0WCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54O1xuICAgIGxldCBjdXJzb3JTdGFydFkgPSB0aGlzLl9hY3RpdmVCdWZmZXIueTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGNvbnN0IHdhc1BhdXNlZCA9IHRoaXMuX3BhcnNlU3RhY2sucGF1c2VkO1xuXG4gICAgaWYgKHdhc1BhdXNlZCkge1xuICAgICAgLy8gYXNzdW1wdGlvbjogX3BhcnNlQnVmZmVyIG5ldmVyIG11dGF0ZXMgYmV0d2VlbiBhc3luYyBjYWxsc1xuICAgICAgaWYgKHJlc3VsdCA9IHRoaXMuX3BhcnNlci5wYXJzZSh0aGlzLl9wYXJzZUJ1ZmZlciwgdGhpcy5fcGFyc2VTdGFjay5kZWNvZGVkTGVuZ3RoLCBwcm9taXNlUmVzdWx0KSkge1xuICAgICAgICB0aGlzLl9sb2dTbG93UmVzb2x2aW5nQXN5bmMocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGN1cnNvclN0YXJ0WCA9IHRoaXMuX3BhcnNlU3RhY2suY3Vyc29yU3RhcnRYO1xuICAgICAgY3Vyc29yU3RhcnRZID0gdGhpcy5fcGFyc2VTdGFjay5jdXJzb3JTdGFydFk7XG4gICAgICB0aGlzLl9wYXJzZVN0YWNrLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCkge1xuICAgICAgICBzdGFydCA9IHRoaXMuX3BhcnNlU3RhY2sucG9zaXRpb24gKyBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvZyBkZWJ1ZyBkYXRhLCB0aGUgbG9nIGxldmVsIGdhdGUgaXMgdG8gcHJldmVudCBleHRyYSB3b3JrIGluIHRoaXMgaG90IHBhdGhcbiAgICBpZiAodGhpcy5fbG9nU2VydmljZS5sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uREVCVUcpIHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoYHBhcnNpbmcgZGF0YSR7dHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gYCBcIiR7ZGF0YX1cImAgOiBgIFwiJHtBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZGF0YSwgZSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKS5qb2luKCcnKX1cImB9YCwgdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZGF0YS5zcGxpdCgnJykubWFwKGUgPT4gZS5jaGFyQ29kZUF0KDApKVxuICAgICAgICA6IGRhdGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcmVzaXplIGlucHV0IGJ1ZmZlciBpZiBuZWVkZWRcbiAgICBpZiAodGhpcy5fcGFyc2VCdWZmZXIubGVuZ3RoIDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLl9wYXJzZUJ1ZmZlci5sZW5ndGggPCBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlQnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KE1hdGgubWluKGRhdGEubGVuZ3RoLCBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIGRpcnR5IHJvdyBzZXJ2aWNlIHNvIHdlIGtub3cgd2hpY2ggbGluZXMgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiBwYXJzaW5nXG4gICAgLy8gSW1wb3J0YW50OiBkbyBub3QgY2xlYXIgYmV0d2VlbiBhc3luYyBjYWxscywgb3RoZXJ3aXNlIHdlIGxvc3QgcGVuZGluZyB1cGRhdGUgaW5mb3JtYXRpb24uXG4gICAgaWYgKCF3YXNQYXVzZWQpIHtcbiAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5jbGVhclJhbmdlKCk7XG4gICAgfVxuXG4gICAgLy8gcHJvY2VzcyBiaWcgZGF0YSBpbiBzbWFsbGVyIGNodW5rc1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IE1BWF9QQVJTRUJVRkZFUl9MRU5HVEgpIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IE1BWF9QQVJTRUJVRkZFUl9MRU5HVEgpIHtcbiAgICAgICAgY29uc3QgZW5kID0gaSArIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEggPCBkYXRhLmxlbmd0aCA/IGkgKyBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGxlbiA9ICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgPyB0aGlzLl9zdHJpbmdEZWNvZGVyLmRlY29kZShkYXRhLnN1YnN0cmluZyhpLCBlbmQpLCB0aGlzLl9wYXJzZUJ1ZmZlcilcbiAgICAgICAgICA6IHRoaXMuX3V0ZjhEZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KGksIGVuZCksIHRoaXMuX3BhcnNlQnVmZmVyKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9IHRoaXMuX3BhcnNlci5wYXJzZSh0aGlzLl9wYXJzZUJ1ZmZlciwgbGVuKSkge1xuICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soY3Vyc29yU3RhcnRYLCBjdXJzb3JTdGFydFksIGxlbiwgaSk7XG4gICAgICAgICAgdGhpcy5fbG9nU2xvd1Jlc29sdmluZ0FzeW5jKHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXdhc1BhdXNlZCkge1xuICAgICAgICBjb25zdCBsZW4gPSAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKVxuICAgICAgICAgID8gdGhpcy5fc3RyaW5nRGVjb2Rlci5kZWNvZGUoZGF0YSwgdGhpcy5fcGFyc2VCdWZmZXIpXG4gICAgICAgICAgOiB0aGlzLl91dGY4RGVjb2Rlci5kZWNvZGUoZGF0YSwgdGhpcy5fcGFyc2VCdWZmZXIpO1xuICAgICAgICBpZiAocmVzdWx0ID0gdGhpcy5fcGFyc2VyLnBhcnNlKHRoaXMuX3BhcnNlQnVmZmVyLCBsZW4pKSB7XG4gICAgICAgICAgdGhpcy5fcHJlc2VydmVTdGFjayhjdXJzb3JTdGFydFgsIGN1cnNvclN0YXJ0WSwgbGVuLCAwKTtcbiAgICAgICAgICB0aGlzLl9sb2dTbG93UmVzb2x2aW5nQXN5bmMocmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICE9PSBjdXJzb3JTdGFydFggfHwgdGhpcy5fYWN0aXZlQnVmZmVyLnkgIT09IGN1cnNvclN0YXJ0WSkge1xuICAgICAgdGhpcy5fb25DdXJzb3JNb3ZlLmZpcmUoKTtcbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIGFueSBkaXJ0eSByb3dzIGFjY3VtdWxhdGVkIGFzIHBhcnQgb2YgcGFyc2luZywgZmlyZSBvbmx5IGZvciByb3dzIHdpdGhpbiB0aGVcbiAgICAvLyBfdmlld3BvcnRfIHdoaWNoIGlzIHJlbGF0aXZlIHRvIHlkaXNwLCBub3QgcmVsYXRpdmUgdG8geWJhc2UuXG4gICAgY29uc3Qgdmlld3BvcnRFbmQgPSB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIuZW5kICsgKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlIC0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApO1xuICAgIGNvbnN0IHZpZXdwb3J0U3RhcnQgPSB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIuc3RhcnQgKyAodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCk7XG4gICAgaWYgKHZpZXdwb3J0U3RhcnQgPCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmZpcmUoTWF0aC5taW4odmlld3BvcnRTdGFydCwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSksIE1hdGgubWluKHZpZXdwb3J0RW5kLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByaW50KGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBjb2RlOiBudW1iZXI7XG4gICAgbGV0IGNoV2lkdGg6IG51bWJlcjtcbiAgICBjb25zdCBjaGFyc2V0ID0gdGhpcy5fY2hhcnNldFNlcnZpY2UuY2hhcnNldDtcbiAgICBjb25zdCBzY3JlZW5SZWFkZXJNb2RlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlO1xuICAgIGNvbnN0IGNvbHMgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgY29uc3Qgd3JhcGFyb3VuZE1vZGUgPSB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMud3JhcGFyb3VuZDtcbiAgICBjb25zdCBpbnNlcnRNb2RlID0gdGhpcy5fY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZTtcbiAgICBjb25zdCBjdXJBdHRyID0gdGhpcy5fY3VyQXR0ckRhdGE7XG4gICAgbGV0IGJ1ZmZlclJvdyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpITtcblxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuXG4gICAgLy8gaGFuZGxlIHdpZGUgY2hhcnM6IHJlc2V0IHN0YXJ0X2NlbGwtMSBpZiB3ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICYmIGVuZCAtIHN0YXJ0ID4gMCAmJiBidWZmZXJSb3cuZ2V0V2lkdGgodGhpcy5fYWN0aXZlQnVmZmVyLnggLSAxKSA9PT0gMikge1xuICAgICAgYnVmZmVyUm93LnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54IC0gMSwgMCwgMSwgY3VyQXR0cik7XG4gICAgfVxuXG4gICAgbGV0IHByZWNlZGluZ0pvaW5TdGF0ZSA9IHRoaXMuX3BhcnNlci5wcmVjZWRpbmdKb2luU3RhdGU7XG4gICAgZm9yIChsZXQgcG9zID0gc3RhcnQ7IHBvcyA8IGVuZDsgKytwb3MpIHtcbiAgICAgIGNvZGUgPSBkYXRhW3Bvc107XG5cbiAgICAgIC8vIGdldCBjaGFyc2V0IHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgLy8gY2hhcnNldCBpcyBvbmx5IGRlZmluZWQgZm9yIEFTQ0lJLCB0aGVyZWZvcmUgd2Ugb25seVxuICAgICAgLy8gc2VhcmNoIGZvciBhbiByZXBsYWNlbWVudCBjaGFyIGlmIGNvZGUgPCAxMjdcbiAgICAgIGlmIChjb2RlIDwgMTI3ICYmIGNoYXJzZXQpIHtcbiAgICAgICAgY29uc3QgY2ggPSBjaGFyc2V0W1N0cmluZy5mcm9tQ2hhckNvZGUoY29kZSldO1xuICAgICAgICBpZiAoY2gpIHtcbiAgICAgICAgICBjb2RlID0gY2guY2hhckNvZGVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50SW5mbyA9IHRoaXMuX3VuaWNvZGVTZXJ2aWNlLmNoYXJQcm9wZXJ0aWVzKGNvZGUsIHByZWNlZGluZ0pvaW5TdGF0ZSk7XG4gICAgICBjaFdpZHRoID0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKGN1cnJlbnRJbmZvKTtcbiAgICAgIGNvbnN0IHNob3VsZEpvaW4gPSBVbmljb2RlU2VydmljZS5leHRyYWN0U2hvdWxkSm9pbihjdXJyZW50SW5mbyk7XG4gICAgICBjb25zdCBvbGRXaWR0aCA9IHNob3VsZEpvaW4gPyBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgocHJlY2VkaW5nSm9pblN0YXRlKSA6IDA7XG4gICAgICBwcmVjZWRpbmdKb2luU3RhdGUgPSBjdXJyZW50SW5mbztcblxuICAgICAgaWYgKHNjcmVlblJlYWRlck1vZGUpIHtcbiAgICAgICAgdGhpcy5fb25BMTF5Q2hhci5maXJlKHN0cmluZ0Zyb21Db2RlUG9pbnQoY29kZSkpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2dldEN1cnJlbnRMaW5rSWQoKSkge1xuICAgICAgICB0aGlzLl9vc2NMaW5rU2VydmljZS5hZGRMaW5lVG9MaW5rKHRoaXMuX2dldEN1cnJlbnRMaW5rSWQoKSwgdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgICAgfVxuXG4gICAgICAvLyBnb3RvIG5leHQgbGluZSBpZiBjaCB3b3VsZCBvdmVyZmxvd1xuICAgICAgLy8gTk9URTogVG8gYXZvaWQgY29zdGx5IHdpZHRoIGNoZWNrcyBoZXJlLFxuICAgICAgLy8gdGhlIHRlcm1pbmFsIGRvZXMgbm90IGFsbG93IGEgY29scyA8IDIuXG4gICAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggKyBjaFdpZHRoIC0gb2xkV2lkdGggPiBjb2xzKSB7XG4gICAgICAgIC8vIGF1dG93cmFwIC0gREVDQVdNXG4gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgd3JhcHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lXG4gICAgICAgIGlmICh3cmFwYXJvdW5kTW9kZSkge1xuICAgICAgICAgIGNvbnN0IG9sZFJvdyA9IGJ1ZmZlclJvdztcbiAgICAgICAgICBsZXQgb2xkQ29sID0gdGhpcy5fYWN0aXZlQnVmZmVyLnggLSBvbGRXaWR0aDtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IG9sZFdpZHRoO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55Kys7XG4gICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID09PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tICsgMSkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnktLTtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2Uuc2Nyb2xsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGxpbmUgYWxyZWFkeSBleGlzdHMgKGVnLiB0aGUgaW5pdGlhbCB2aWV3cG9ydCksIG1hcmsgaXQgYXMgYVxuICAgICAgICAgICAgLy8gd3JhcHBlZCBsaW5lXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSEuaXNXcmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcm93IGNoYW5nZWQsIGdldCBpdCBhZ2FpblxuICAgICAgICAgIGJ1ZmZlclJvdyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpITtcbiAgICAgICAgICBpZiAob2xkV2lkdGggPiAwICYmIGJ1ZmZlclJvdyBpbnN0YW5jZW9mIEJ1ZmZlckxpbmUpIHtcbiAgICAgICAgICAgIC8vIENvbWJpbmluZyBjaGFyYWN0ZXIgd2lkZW5zIDEgY29sdW1uIHRvIDIuXG4gICAgICAgICAgICAvLyBNb3ZlIG9sZCBjaGFyYWN0ZXIgdG8gbmV4dCBsaW5lLlxuICAgICAgICAgICAgYnVmZmVyUm93LmNvcHlDZWxsc0Zyb20ob2xkUm93IGFzIEJ1ZmZlckxpbmUsXG4gICAgICAgICAgICAgIG9sZENvbCwgMCwgb2xkV2lkdGgsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY2xlYXIgbGVmdCBvdmVyIGNlbGxzIHRvIHRoZSByaWdodFxuICAgICAgICAgIHdoaWxlIChvbGRDb2wgPCBjb2xzKSB7XG4gICAgICAgICAgICBvbGRSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQob2xkQ29sKyssIDAsIDEsIGN1ckF0dHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IGNvbHMgLSAxO1xuICAgICAgICAgIGlmIChjaFdpZHRoID09PSAyKSB7XG4gICAgICAgICAgICAvLyBGSVhNRTogY2hlY2sgZm9yIHh0ZXJtIGJlaGF2aW9yXG4gICAgICAgICAgICAvLyBXaGF0IHRvIGRvIGhlcmU/IFdlIGdvdCBhIHdpZGUgY2hhciB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIGxhc3QgY2VsbFxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGluc2VydCBjb21iaW5pbmcgY2hhciBhdCBsYXN0IGN1cnNvciBwb3NpdGlvblxuICAgICAgLy8gdGhpcy5fYWN0aXZlQnVmZmVyLnggc2hvdWxkIG5ldmVyIGJlIDAgZm9yIGEgY29tYmluaW5nIGNoYXJcbiAgICAgIC8vIHNpbmNlIHRoZXkgYWx3YXlzIGZvbGxvdyBhIGNlbGwgY29uc3VtaW5nIGNoYXJcbiAgICAgIC8vIHRoZXJlZm9yZSB3ZSBjYW4gdGVzdCBmb3IgdGhpcy5fYWN0aXZlQnVmZmVyLnggdG8gYXZvaWQgb3ZlcmZsb3cgbGVmdFxuICAgICAgaWYgKHNob3VsZEpvaW4gJiYgdGhpcy5fYWN0aXZlQnVmZmVyLngpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVmZmVyUm93LmdldFdpZHRoKHRoaXMuX2FjdGl2ZUJ1ZmZlci54IC0gMSkgPyAxIDogMjtcbiAgICAgICAgLy8gaWYgZW1wdHkgY2VsbCBhZnRlciBmdWxsd2lkdGgsIG5lZWQgdG8gZ28gMiBjZWxscyBiYWNrXG4gICAgICAgIC8vIGl0IGlzIHNhdmUgdG8gc3RlcCAyIGNlbGxzIGJhY2sgaGVyZVxuICAgICAgICAvLyBzaW5jZSBhbiBlbXB0eSBjZWxsIGlzIG9ubHkgc2V0IGJ5IGZ1bGx3aWR0aCBjaGFyc1xuICAgICAgICBidWZmZXJSb3cuYWRkQ29kZXBvaW50VG9DZWxsKHRoaXMuX2FjdGl2ZUJ1ZmZlci54IC0gb2Zmc2V0LFxuICAgICAgICAgIGNvZGUsIGNoV2lkdGgpO1xuICAgICAgICBmb3IgKGxldCBkZWx0YSA9IGNoV2lkdGggLSBvbGRXaWR0aDsgLS1kZWx0YSA+PSAwOyApIHtcbiAgICAgICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngrKywgMCwgMCwgY3VyQXR0cik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGluc2VydCBtb2RlOiBtb3ZlIGNoYXJhY3RlcnMgdG8gcmlnaHRcbiAgICAgIGlmIChpbnNlcnRNb2RlKSB7XG4gICAgICAgIC8vIHJpZ2h0IHNoaWZ0IGNlbGxzIGFjY29yZGluZyB0byB0aGUgd2lkdGhcbiAgICAgICAgYnVmZmVyUm93Lmluc2VydENlbGxzKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCBjaFdpZHRoIC0gb2xkV2lkdGgsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbChjdXJBdHRyKSk7XG4gICAgICAgIC8vIHRlc3QgbGFzdCBjZWxsIC0gc2luY2UgdGhlIGxhc3QgY2VsbCBoYXMgb25seSByb29tIGZvclxuICAgICAgICAvLyBhIGhhbGZ3aWR0aCBjaGFyIGFueSBmdWxsd2lkdGggc2hpZnRlZCB0aGVyZSBpcyBsb3N0XG4gICAgICAgIC8vIGFuZCB3aWxsIGJlIHNldCB0byBlbXB0eSBjZWxsXG4gICAgICAgIGlmIChidWZmZXJSb3cuZ2V0V2lkdGgoY29scyAtIDEpID09PSAyKSB7XG4gICAgICAgICAgYnVmZmVyUm93LnNldENlbGxGcm9tQ29kZXBvaW50KGNvbHMgLSAxLCBOVUxMX0NFTExfQ09ERSwgTlVMTF9DRUxMX1dJRFRILCBjdXJBdHRyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB3cml0ZSBjdXJyZW50IGNoYXIgdG8gYnVmZmVyIGFuZCBhZHZhbmNlIGN1cnNvclxuICAgICAgYnVmZmVyUm93LnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54KyssIGNvZGUsIGNoV2lkdGgsIGN1ckF0dHIpO1xuXG4gICAgICAvLyBmdWxsd2lkdGggY2hhciAtIGFsc28gc2V0IG5leHQgY2VsbCB0byBwbGFjZWhvbGRlciBzdHViIGFuZCBhZHZhbmNlIGN1cnNvclxuICAgICAgLy8gZm9yIGdyYXBoZW1lcyBiaWdnZXIgdGhhbiBmdWxsd2lkdGggd2UgY2FuIHNpbXBseSBsb29wIHRvIHplcm9cbiAgICAgIC8vIHdlIGFscmVhZHkgbWFkZSBzdXJlIGFib3ZlLCB0aGF0IHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgY2hXaWR0aCB3aWxsIG5vdCBvdmVyZmxvdyByaWdodFxuICAgICAgaWYgKGNoV2lkdGggPiAwKSB7XG4gICAgICAgIHdoaWxlICgtLWNoV2lkdGgpIHtcbiAgICAgICAgICAvLyBvdGhlciB0aGFuIGEgcmVndWxhciBlbXB0eSBjZWxsIGEgY2VsbCBmb2xsb3dpbmcgYSB3aWRlIGNoYXIgaGFzIG5vIHdpZHRoXG4gICAgICAgICAgYnVmZmVyUm93LnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54KyssIDAsIDAsIGN1ckF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcGFyc2VyLnByZWNlZGluZ0pvaW5TdGF0ZSA9IHByZWNlZGluZ0pvaW5TdGF0ZTtcblxuICAgIC8vIGhhbmRsZSB3aWRlIGNoYXJzOiByZXNldCBjZWxsIHRvIHRoZSByaWdodCBpZiBpdCBpcyBzZWNvbmQgY2VsbCBvZiBhIHdpZGUgY2hhclxuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA8IGNvbHMgJiYgZW5kIC0gc3RhcnQgPiAwICYmIGJ1ZmZlclJvdy5nZXRXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCkgPT09IDAgJiYgIWJ1ZmZlclJvdy5oYXNDb250ZW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54KSkge1xuICAgICAgYnVmZmVyUm93LnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCAwLCAxLCBjdXJBdHRyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3J3YXJkIHJlZ2lzdGVyQ3NpSGFuZGxlciBmcm9tIHBhcnNlci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckNzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAocGFyYW1zOiBJUGFyYW1zKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICBpZiAoaWQuZmluYWwgPT09ICd0JyAmJiAhaWQucHJlZml4ICYmICFpZC5pbnRlcm1lZGlhdGVzKSB7XG4gICAgICAvLyBzZWN1cml0eTogYWx3YXlzIGNoZWNrIHdoZXRoZXIgd2luZG93IG9wdGlvbiBpcyBhbGxvd2VkXG4gICAgICByZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcihpZCwgcGFyYW1zID0+IHtcbiAgICAgICAgaWYgKCFwYXJhbVRvV2luZG93T3B0aW9uKHBhcmFtcy5wYXJhbXNbMF0sIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2socGFyYW1zKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcihpZCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmQgcmVnaXN0ZXJEY3NIYW5kbGVyIGZyb20gcGFyc2VyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRGNzSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcsIHBhcmFtOiBJUGFyYW1zKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRGNzSGFuZGxlcihpZCwgbmV3IERjc0hhbmRsZXIoY2FsbGJhY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3J3YXJkIHJlZ2lzdGVyRXNjSGFuZGxlciBmcm9tIHBhcnNlci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckVzY0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcihpZCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmQgcmVnaXN0ZXJPc2NIYW5kbGVyIGZyb20gcGFyc2VyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudDogbnVtYmVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQsIG5ldyBPc2NIYW5kbGVyKGNhbGxiYWNrKSk7XG4gIH1cblxuICAvKipcbiAgICogQkVMXG4gICAqIEJlbGwgKEN0cmwtRykuXG4gICAqXG4gICAqIEB2dDogI1kgICBDMCAgICBCRUwgICBcIkJlbGxcIiAgXCJcXGEsIFxceDA3XCIgIFwiUmluZyB0aGUgYmVsbC5cIlxuICAgKiBUaGUgYmVoYXZpb3Igb2YgdGhlIGJlbGwgaXMgZnVydGhlciBjdXN0b21pemFibGUgd2l0aCBgSVRlcm1pbmFsT3B0aW9ucy5iZWxsU3R5bGVgXG4gICAqIGFuZCBgSVRlcm1pbmFsT3B0aW9ucy5iZWxsU291bmRgLlxuICAgKi9cbiAgcHVibGljIGJlbGwoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fb25SZXF1ZXN0QmVsbC5maXJlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTEZcbiAgICogTGluZSBGZWVkIG9yIE5ldyBMaW5lIChOTCkuICAoTEYgIGlzIEN0cmwtSikuXG4gICAqXG4gICAqIEB2dDogI1kgICBDMCAgICBMRiAgIFwiTGluZSBGZWVkXCIgICAgICAgICAgICBcIlxcbiwgXFx4MEFcIiAgXCJNb3ZlIHRoZSBjdXJzb3Igb25lIHJvdyBkb3duLCBzY3JvbGxpbmcgaWYgbmVlZGVkLlwiXG4gICAqIFNjcm9sbGluZyBpcyByZXN0cmljdGVkIHRvIHNjcm9sbCBtYXJnaW5zIGFuZCB3aWxsIG9ubHkgaGFwcGVuIG9uIHRoZSBib3R0b20gbGluZS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIFZUICAgXCJWZXJ0aWNhbCBUYWJ1bGF0aW9uXCIgIFwiXFx2LCBcXHgwQlwiICBcIlRyZWF0ZWQgYXMgTEYuXCJcbiAgICogQHZ0OiAjWSAgIEMwICAgIEZGICAgXCJGb3JtIEZlZWRcIiAgICAgICAgICAgIFwiXFxmLCBcXHgwQ1wiICBcIlRyZWF0ZWQgYXMgTEYuXCJcbiAgICovXG4gIHB1YmxpYyBsaW5lRmVlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jb252ZXJ0RW9sKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IDA7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55Kys7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID09PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tICsgMSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnktLTtcbiAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2Uuc2Nyb2xsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlcmUgd2FzIGFuIGV4cGxpY2l0IGxpbmUgZmVlZCAobm90IGp1c3QgYSBjYXJyaWFnZSByZXR1cm4pLCBzbyBjbGVhciB0aGUgd3JhcHBlZCBzdGF0ZSBvZlxuICAgICAgLy8gdGhlIGxpbmUuIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBvbiBjb25wdHkvV2luZG93cyB3aGVyZSByZXZpc2l0aW5nIGxpbmVzIHRvXG4gICAgICAvLyByZXByaW50IGlzIGNvbW1vbiwgZXNwZWNpYWxseSBvbiByZXNpemUuIE5vdGUgdGhhdCB0aGUgd2luZG93c01vZGUgd3JhcHBlZCBsaW5lIGhldXJpc3RpY3NcbiAgICAgIC8vIGNhbiBtZXNzIHdpdGggdGhpcyBzbyB3aW5kb3dzTW9kZSBzaG91bGQgYmUgZGlzYWJsZWQsIHdoaWNoIGlzIHJlY29tbWVuZGVkIG9uIFdpbmRvd3MgYnVpbGRcbiAgICAgIC8vIDIxMzc2IGFuZCBhYm92ZS5cbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpIS5pc1dyYXBwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgbGluZSBpcyBoaXQsIHByZXZlbnQgdGhpcyBhY3Rpb24gZnJvbSB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG5leHQgbGluZS5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueC0tO1xuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcblxuICAgIHRoaXMuX29uTGluZUZlZWQuZmlyZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENSXG4gICAqIENhcnJpYWdlIFJldHVybiAoQ3RybC1NKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIENSICAgXCJDYXJyaWFnZSBSZXR1cm5cIiAgXCJcXHIsIFxceDBEXCIgIFwiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdy5cIlxuICAgKi9cbiAgcHVibGljIGNhcnJpYWdlUmV0dXJuKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCU1xuICAgKiBCYWNrc3BhY2UgKEN0cmwtSCkuXG4gICAqXG4gICAqIEB2dDogI1kgICBDMCAgICBCUyAgIFwiQmFja3NwYWNlXCIgIFwiXFxiLCBcXHgwOFwiICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgcG9zaXRpb24gdG8gdGhlIGxlZnQuXCJcbiAgICogQnkgZGVmYXVsdCBpdCBpcyBub3QgcG9zc2libGUgdG8gbW92ZSB0aGUgY3Vyc29yIHBhc3QgdGhlIGxlZnRtb3N0IHBvc2l0aW9uLlxuICAgKiBJZiBgcmV2ZXJzZSB3cmFwLWFyb3VuZGAgKGBDU0kgPyA0NSBoYCkgaXMgc2V0LCBhIHByZXZpb3VzIHNvZnQgbGluZSB3cmFwIChERUNBV00pXG4gICAqIGNhbiBiZSB1bmRvbmUgd2l0aCBCUyB3aXRoaW4gdGhlIHNjcm9sbCBtYXJnaW5zLiBJbiB0aGF0IGNhc2UgdGhlIGN1cnNvciB3aWxsIHdyYXAgYmFja1xuICAgKiB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByb3cuIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gcGVlayBiYWNrIGludG8gdGhlIHNjcm9sbGJ1ZmZlclxuICAgKiB3aXRoIHRoZSBjdXJzb3IsIHRodXMgYXQgdGhlIGhvbWUgcG9zaXRpb24gKHRvcC1sZWZ0bW9zdCBjZWxsKSB0aGlzIGhhcyBubyBlZmZlY3QuXG4gICAqL1xuICBwdWJsaWMgYmFja3NwYWNlKCk6IGJvb2xlYW4ge1xuICAgIC8vIHJldmVyc2Ugd3JhcC1hcm91bmQgaXMgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZCkge1xuICAgICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+IDApIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLngtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIHJldmVyc2Ugd3JhcC1hcm91bmQgaXMgZW5hYmxlZFxuICAgIC8vIG90aGVyIHRoYW4gZm9yIG5vcm1hbCBvcGVyYXRpb24gbW9kZSwgcmV2ZXJzZSB3cmFwLWFyb3VuZCBhbGxvd3MgdGhlIGN1cnNvclxuICAgIC8vIHRvIGJlIGF0IHg9Y29scyB0byBiZSBhYmxlIHRvIGFkZHJlc3MgdGhlIGxhc3QgY2VsbCBvZiBhIHJvdyBieSBCU1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyk7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPiAwKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueC0tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKipcbiAgICAgICAqIHJldmVyc2Ugd3JhcC1hcm91bmQgaGFuZGxpbmc6XG4gICAgICAgKiBPdXIgaW1wbGVtZW50YXRpb24gZGV2aWF0ZXMgZnJvbSB4dGVybSBvbiBwdXJwb3NlLiBEZXRhaWxzOlxuICAgICAgICogLSBvbmx5IHByZXZpb3VzIHNvZnQgTkxzIGNhbiBiZSByZXZlcnNlZCAoaXNXcmFwcGVkPXRydWUpXG4gICAgICAgKiAtIG9ubHkgd29ya3Mgd2l0aGluIHNjcm9sbGJvcmRlcnMgKHRvcC9ib3R0b20sIGxlZnQvcmlnaHQgbm90IHlldCBzdXBwb3J0ZWQpXG4gICAgICAgKiAtIGNhbm5vdCBwZWVrIGludG8gc2Nyb2xsYnVmZmVyXG4gICAgICAgKiAtIGFueSBjdXJzb3IgbW92ZW1lbnQgc2VxdWVuY2Uga2VlcHMgd29ya2luZyBhcyBleHBlY3RlZFxuICAgICAgICovXG4gICAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPT09IDBcbiAgICAgICAgJiYgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wXG4gICAgICAgICYmIHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDw9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b21cbiAgICAgICAgJiYgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk/LmlzV3JhcHBlZCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSEuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55LS07XG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMTtcbiAgICAgICAgLy8gZmluZCBsYXN0IHRha2VuIGNlbGwgLSBsYXN0IGNlbGwgY2FuIGhhdmUgMyBkaWZmZXJlbnQgc3RhdGVzOlxuICAgICAgICAvLyAtIGhhc0NvbnRlbnQodHJ1ZSkgKyBoYXNXaWR0aCgxKTogbmFycm93IGNoYXIgLSB3ZSBhcmUgZG9uZVxuICAgICAgICAvLyAtIGhhc1dpZHRoKDApOiBzZWNvbmQgcGFydCBvZiB3aWRlIGNoYXIgLSB3ZSBhcmUgZG9uZVxuICAgICAgICAvLyAtIGhhc0NvbnRlbnQoZmFsc2UpICsgaGFzV2lkdGgoMSk6IGVtcHR5IGNlbGwgZHVlIHRvIGVhcmx5IHdyYXBwaW5nIHdpZGUgY2hhciwgZ28gb25lXG4gICAgICAgIC8vICAgY2VsbCBmdXJ0aGVyIGJhY2tcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpITtcbiAgICAgICAgaWYgKGxpbmUuaGFzV2lkdGgodGhpcy5fYWN0aXZlQnVmZmVyLngpICYmICFsaW5lLmhhc0NvbnRlbnQodGhpcy5fYWN0aXZlQnVmZmVyLngpKSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLngtLTtcbiAgICAgICAgICAvLyBXZSBkbyB0aGlzIG9ubHkgb25jZSwgc2luY2Ugd2lkdGg9MSArIGhhc0NvbnRlbnQ9ZmFsc2UgY3VycmVudGx5IGhhcHBlbnMgb25seSBvbmNlXG4gICAgICAgICAgLy8gYmVmb3JlIGVhcmx5IHdyYXBwaW5nIG9mIGEgd2lkZSBjaGFyLlxuICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQgb25jZSB3ZSBzdXBwb3J0IGdyYXBoZW1lcyB0YWtpbmcgbW9yZSB0aGFuIDIgY2VsbHMuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUQUJcbiAgICogSG9yaXpvbnRhbCBUYWIgKEhUKSAoQ3RybC1JKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIEhUICAgXCJIb3Jpem9udGFsIFRhYnVsYXRpb25cIiAgXCJcXHQsIFxceDA5XCIgIFwiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGNoYXJhY3RlciB0YWIgc3RvcC5cIlxuICAgKi9cbiAgcHVibGljIHRhYigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxYID0gdGhpcy5fYWN0aXZlQnVmZmVyLng7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSB0aGlzLl9hY3RpdmVCdWZmZXIubmV4dFN0b3AoKTtcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlKSB7XG4gICAgICB0aGlzLl9vbkExMXlUYWIuZmlyZSh0aGlzLl9hY3RpdmVCdWZmZXIueCAtIG9yaWdpbmFsWCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNPXG4gICAqIFNoaWZ0IE91dCAoQ3RybC1OKSAtPiBTd2l0Y2ggdG8gQWx0ZXJuYXRlIENoYXJhY3RlciBTZXQuICBUaGlzIGludm9rZXMgdGhlXG4gICAqIEcxIGNoYXJhY3RlciBzZXQuXG4gICAqXG4gICAqIEB2dDogI1BbT25seSBsaW1pdGVkIElTTy0yMDIyIGNoYXJzZXQgc3VwcG9ydC5dICBDMCAgICBTTyAgIFwiU2hpZnQgT3V0XCIgIFwiXFx4MEVcIiAgXCJTd2l0Y2ggdG8gYW4gYWx0ZXJuYXRpdmUgY2hhcmFjdGVyIHNldC5cIlxuICAgKi9cbiAgcHVibGljIHNoaWZ0T3V0KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdMZXZlbCgxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTSVxuICAgKiBTaGlmdCBJbiAoQ3RybC1PKSAtPiBTd2l0Y2ggdG8gU3RhbmRhcmQgQ2hhcmFjdGVyIFNldC4gIFRoaXMgaW52b2tlcyB0aGUgRzBcbiAgICogY2hhcmFjdGVyIHNldCAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgU0kgICBcIlNoaWZ0IEluXCIgICBcIlxceDBGXCIgIFwiUmV0dXJuIHRvIHJlZ3VsYXIgY2hhcmFjdGVyIHNldCBhZnRlciBTaGlmdCBPdXQuXCJcbiAgICovXG4gIHB1YmxpYyBzaGlmdEluKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdMZXZlbCgwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmljdCBjdXJzb3IgdG8gdmlld3BvcnQgc2l6ZSAvIHNjcm9sbCBtYXJnaW4gKG9yaWdpbiBtb2RlKS5cbiAgICovXG4gIHByaXZhdGUgX3Jlc3RyaWN0Q3Vyc29yKG1heENvbDogbnVtYmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gTWF0aC5taW4obWF4Q29sLCBNYXRoLm1heCgwLCB0aGlzLl9hY3RpdmVCdWZmZXIueCkpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLm9yaWdpblxuICAgICAgPyBNYXRoLm1pbih0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tLCBNYXRoLm1heCh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIueSkpXG4gICAgICA6IE1hdGgubWluKHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEsIE1hdGgubWF4KDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSk7XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFic29sdXRlIGN1cnNvciBwb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX3NldEN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmICh0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHg7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AgKyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHg7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueSA9IHk7XG4gICAgfVxuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJlbGF0aXZlIGN1cnNvciBwb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX21vdmVDdXJzb3IoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBmb3IgcmVsYXRpdmUgY2hhbmdlcyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgd2l0aGluIDAgLi4gY29scy9yb3dzIC0gMVxuICAgIC8vIGJlZm9yZSBjYWxjdWxhdGluZyB0aGUgbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICB0aGlzLl9zZXRDdXJzb3IodGhpcy5fYWN0aXZlQnVmZmVyLnggKyB4LCB0aGlzLl9hY3RpdmVCdWZmZXIueSArIHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBBXG4gICAqIEN1cnNvciBVcCBQcyBUaW1lcyAoZGVmYXVsdCA9IDEpIChDVVUpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDVVUgICBcIkN1cnNvciBVcFwiICAgXCJDU0kgUHMgQVwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgdXAgKGRlZmF1bHQ9MSkuXCJcbiAgICogSWYgdGhlIGN1cnNvciB3b3VsZCBwYXNzIHRoZSB0b3Agc2Nyb2xsIG1hcmdpbiwgaXQgd2lsbCBzdG9wIHRoZXJlLlxuICAgKi9cbiAgcHVibGljIGN1cnNvclVwKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIC8vIHN0b3AgYXQgc2Nyb2xsVG9wXG4gICAgY29uc3QgZGlmZlRvVG9wID0gdGhpcy5fYWN0aXZlQnVmZmVyLnkgLSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wO1xuICAgIGlmIChkaWZmVG9Ub3AgPj0gMCkge1xuICAgICAgdGhpcy5fbW92ZUN1cnNvcigwLCAtTWF0aC5taW4oZGlmZlRvVG9wLCBwYXJhbXMucGFyYW1zWzBdIHx8IDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbW92ZUN1cnNvcigwLCAtKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgQlxuICAgKiBDdXJzb3IgRG93biBQcyBUaW1lcyAoZGVmYXVsdCA9IDEpIChDVUQpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDVUQgICBcIkN1cnNvciBEb3duXCIgICBcIkNTSSBQcyBCXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyBkb3duIChkZWZhdWx0PTEpLlwiXG4gICAqIElmIHRoZSBjdXJzb3Igd291bGQgcGFzcyB0aGUgYm90dG9tIHNjcm9sbCBtYXJnaW4sIGl0IHdpbGwgc3RvcCB0aGVyZS5cbiAgICovXG4gIHB1YmxpYyBjdXJzb3JEb3duKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIC8vIHN0b3AgYXQgc2Nyb2xsQm90dG9tXG4gICAgY29uc3QgZGlmZlRvQm90dG9tID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSAtIHRoaXMuX2FjdGl2ZUJ1ZmZlci55O1xuICAgIGlmIChkaWZmVG9Cb3R0b20gPj0gMCkge1xuICAgICAgdGhpcy5fbW92ZUN1cnNvcigwLCBNYXRoLm1pbihkaWZmVG9Cb3R0b20sIHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIHBhcmFtcy5wYXJhbXNbMF0gfHwgMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBDXG4gICAqIEN1cnNvciBGb3J3YXJkIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENVRikuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENVRiAgIFwiQ3Vyc29yIEZvcndhcmRcIiAgICBcIkNTSSBQcyBDXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyBmb3J3YXJkIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yRm9yd2FyZChwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9tb3ZlQ3Vyc29yKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIERcbiAgICogQ3Vyc29yIEJhY2t3YXJkIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENVQikuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENVQiAgIFwiQ3Vyc29yIEJhY2t3YXJkXCIgICBcIkNTSSBQcyBEXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyBiYWNrd2FyZCAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIGN1cnNvckJhY2t3YXJkKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX21vdmVDdXJzb3IoLShwYXJhbXMucGFyYW1zWzBdIHx8IDEpLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgRVxuICAgKiBDdXJzb3IgTmV4dCBMaW5lIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENOTCkuXG4gICAqIE90aGVyIHRoYW4gY3Vyc29yRG93biAoQ1VEKSBhbHNvIHNldCB0aGUgY3Vyc29yIHRvIGZpcnN0IGNvbHVtbi5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgQ05MICAgXCJDdXJzb3IgTmV4dCBMaW5lXCIgIFwiQ1NJIFBzIEVcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGRvd24gKGRlZmF1bHQ9MSkgYW5kIHRvIHRoZSBmaXJzdCBjb2x1bW4uXCJcbiAgICogU2FtZSBhcyBDVUQsIGFkZGl0aW9uYWxseSBwbGFjZXMgdGhlIGN1cnNvciBhdCB0aGUgZmlyc3QgY29sdW1uLlxuICAgKi9cbiAgcHVibGljIGN1cnNvck5leHRMaW5lKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY3Vyc29yRG93bihwYXJhbXMpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgRlxuICAgKiBDdXJzb3IgUHJldmlvdXMgTGluZSBQcyBUaW1lcyAoZGVmYXVsdCA9IDEpIChDUEwpLlxuICAgKiBPdGhlciB0aGFuIGN1cnNvclVwIChDVVUpIGFsc28gc2V0IHRoZSBjdXJzb3IgdG8gZmlyc3QgY29sdW1uLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDUEwgICBcIkN1cnNvciBCYWNrd2FyZFwiICAgXCJDU0kgUHMgRlwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgdXAgKGRlZmF1bHQ9MSkgYW5kIHRvIHRoZSBmaXJzdCBjb2x1bW4uXCJcbiAgICogU2FtZSBhcyBDVVUsIGFkZGl0aW9uYWxseSBwbGFjZXMgdGhlIGN1cnNvciBhdCB0aGUgZmlyc3QgY29sdW1uLlxuICAgKi9cbiAgcHVibGljIGN1cnNvclByZWNlZGluZ0xpbmUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jdXJzb3JVcChwYXJhbXMpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgR1xuICAgKiBDdXJzb3IgQ2hhcmFjdGVyIEFic29sdXRlICBbY29sdW1uXSAoZGVmYXVsdCA9IFtyb3csMV0pIChDSEEpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDSEEgICBcIkN1cnNvciBIb3Jpem9udGFsIEFic29sdXRlXCIgXCJDU0kgUHMgR1wiIFwiTW92ZSBjdXJzb3IgdG8gYFBzYC10aCBjb2x1bW4gb2YgdGhlIGFjdGl2ZSByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBjdXJzb3JDaGFyQWJzb2x1dGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKChwYXJhbXMucGFyYW1zWzBdIHx8IDEpIC0gMSwgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIEhcbiAgICogQ3Vyc29yIFBvc2l0aW9uIFtyb3c7Y29sdW1uXSAoZGVmYXVsdCA9IFsxLDFdKSAoQ1VQKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgQ1VQICAgXCJDdXJzb3IgUG9zaXRpb25cIiAgIFwiQ1NJIFBzIDsgUHMgSFwiICBcIlNldCBjdXJzb3IgdG8gcG9zaXRpb24gW2BQc2AsIGBQc2BdIChkZWZhdWx0ID0gWzEsIDFdKS5cIlxuICAgKiBJZiBPUklHSU4gbW9kZSBpcyBzZXQsIHBsYWNlcyB0aGUgY3Vyc29yIHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHNjcm9sbCBtYXJnaW5zLlxuICAgKiBJZiBPUklHSU4gbW9kZSBpcyBub3Qgc2V0LCBwbGFjZXMgdGhlIGN1cnNvciB0byB0aGUgYWJzb2x1dGUgcG9zaXRpb24gd2l0aGluIHRoZSB2aWV3cG9ydC5cbiAgICogTm90ZSB0aGF0IHRoZSBjb29yZGluYXRlcyBhcmUgMS1iYXNlZCwgdGh1cyB0aGUgdG9wIGxlZnQgcG9zaXRpb24gc3RhcnRzIGF0IGAxIDsgMWAuXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yUG9zaXRpb24ocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKFxuICAgICAgLy8gY29sXG4gICAgICAocGFyYW1zLmxlbmd0aCA+PSAyKSA/IChwYXJhbXMucGFyYW1zWzFdIHx8IDEpIC0gMSA6IDAsXG4gICAgICAvLyByb3dcbiAgICAgIChwYXJhbXMucGFyYW1zWzBdIHx8IDEpIC0gMVxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtIGAgIENoYXJhY3RlciBQb3NpdGlvbiBBYnNvbHV0ZVxuICAgKiAgIFtjb2x1bW5dIChkZWZhdWx0ID0gW3JvdywxXSkgKEhQQSkuXG4gICAqIEN1cnJlbnRseSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQ0hBLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBIUEEgICBcIkhvcml6b250YWwgUG9zaXRpb24gQWJzb2x1dGVcIiAgXCJDU0kgUHMgYCBcIiBcIlNhbWUgYXMgQ0hBLlwiXG4gICAqL1xuICBwdWJsaWMgY2hhclBvc0Fic29sdXRlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3NldEN1cnNvcigocGFyYW1zLnBhcmFtc1swXSB8fCAxKSAtIDEsIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gYSAgQ2hhcmFjdGVyIFBvc2l0aW9uIFJlbGF0aXZlXG4gICAqICAgW2NvbHVtbnNdIChkZWZhdWx0ID0gW3Jvdyxjb2wrMV0pIChIUFIpXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEhQUiAgIFwiSG9yaXpvbnRhbCBQb3NpdGlvbiBSZWxhdGl2ZVwiICBcIkNTSSBQcyBhXCIgIFwiU2FtZSBhcyBDVUYuXCJcbiAgICovXG4gIHB1YmxpYyBoUG9zaXRpb25SZWxhdGl2ZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9tb3ZlQ3Vyc29yKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtIGQgIFZlcnRpY2FsIFBvc2l0aW9uIEFic29sdXRlIChWUEEpXG4gICAqICAgW3Jvd10gKGRlZmF1bHQgPSBbMSxjb2x1bW5dKVxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBWUEEgICBcIlZlcnRpY2FsIFBvc2l0aW9uIEFic29sdXRlXCIgICAgXCJDU0kgUHMgZFwiICBcIk1vdmUgY3Vyc29yIHRvIGBQc2AtdGggcm93IChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgbGluZVBvc0Fic29sdXRlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3NldEN1cnNvcih0aGlzLl9hY3RpdmVCdWZmZXIueCwgKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkgLSAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gZSAgVmVydGljYWwgUG9zaXRpb24gUmVsYXRpdmUgKFZQUilcbiAgICogICBbcm93c10gKGRlZmF1bHQgPSBbcm93KzEsY29sdW1uXSlcbiAgICogcmV1c2UgQ1NJIFBzIEIgP1xuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBWUFIgICBcIlZlcnRpY2FsIFBvc2l0aW9uIFJlbGF0aXZlXCIgICAgXCJDU0kgUHMgZVwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgZG93biAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIHZQb3NpdGlvblJlbGF0aXZlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX21vdmVDdXJzb3IoMCwgcGFyYW1zLnBhcmFtc1swXSB8fCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgOyBQcyBmXG4gICAqICAgSG9yaXpvbnRhbCBhbmQgVmVydGljYWwgUG9zaXRpb24gW3Jvdztjb2x1bW5dIChkZWZhdWx0ID1cbiAgICogICBbMSwxXSkgKEhWUCkuXG4gICAqICAgU2FtZSBhcyBDVVAuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEhWUCAgIFwiSG9yaXpvbnRhbCBhbmQgVmVydGljYWwgUG9zaXRpb25cIiBcIkNTSSBQcyA7IFBzIGZcIiAgXCJTYW1lIGFzIENVUC5cIlxuICAgKi9cbiAgcHVibGljIGhWUG9zaXRpb24ocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jdXJzb3JQb3NpdGlvbihwYXJhbXMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBnICBUYWIgQ2xlYXIgKFRCQykuXG4gICAqICAgICBQcyA9IDAgIC0+IENsZWFyIEN1cnJlbnQgQ29sdW1uIChkZWZhdWx0KS5cbiAgICogICAgIFBzID0gMyAgLT4gQ2xlYXIgQWxsLlxuICAgKiBQb3RlbnRpYWxseTpcbiAgICogICBQcyA9IDIgIC0+IENsZWFyIFN0b3BzIG9uIExpbmUuXG4gICAqICAgaHR0cDovL3Z0MTAwLm5ldC9hbm5hcmJvci9hYWEtdWcvc2VjdGlvbjYuaHRtbFxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBUQkMgICBcIlRhYiBDbGVhclwiIFwiQ1NJIFBzIGdcIiAgXCJDbGVhciB0YWIgc3RvcHMgYXQgY3VycmVudCBwb3NpdGlvbiAoMCkgb3IgYWxsICgzKSAoZGVmYXVsdD0wKS5cIlxuICAgKiBDbGVhcmluZyB0YWJzdG9wcyBvZmYgdGhlIGFjdGl2ZSByb3cgKFBzID0gMiwgVlQxMDApIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuICAgKi9cbiAgcHVibGljIHRhYkNsZWFyKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXTtcbiAgICBpZiAocGFyYW0gPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9hY3RpdmVCdWZmZXIudGFic1t0aGlzLl9hY3RpdmVCdWZmZXIueF07XG4gICAgfSBlbHNlIGlmIChwYXJhbSA9PT0gMykge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnRhYnMgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIElcbiAgICogICBDdXJzb3IgRm9yd2FyZCBUYWJ1bGF0aW9uIFBzIHRhYiBzdG9wcyAoZGVmYXVsdCA9IDEpIChDSFQpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDSFQgICBcIkN1cnNvciBIb3Jpem9udGFsIFRhYnVsYXRpb25cIiBcIkNTSSBQcyBJXCIgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIHRhYnMgZm9yd2FyZCAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIGN1cnNvckZvcndhcmRUYWIocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID49IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSB0aGlzLl9hY3RpdmVCdWZmZXIubmV4dFN0b3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFogIEN1cnNvciBCYWNrd2FyZCBUYWJ1bGF0aW9uIFBzIHRhYiBzdG9wcyAoZGVmYXVsdCA9IDEpIChDQlQpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDQlQgICBcIkN1cnNvciBCYWNrd2FyZCBUYWJ1bGF0aW9uXCIgIFwiQ1NJIFBzIFpcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRhYnMgYmFja3dhcmQgKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBjdXJzb3JCYWNrd2FyZFRhYihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuXG4gICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnByZXZTdG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBcIiBxICBTZWxlY3QgQ2hhcmFjdGVyIFByb3RlY3Rpb24gQXR0cmlidXRlIChERUNTQ0EpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNTQ0EgICBcIlNlbGVjdCBDaGFyYWN0ZXIgUHJvdGVjdGlvbiBBdHRyaWJ1dGVcIiAgXCJDU0kgUHMgXCIgcVwiICBcIldoZXRoZXIgREVDU0VEIGFuZCBERUNTRUwgY2FuIGVyYXNlICgwPWRlZmF1bHQsIDIpIG9yIG5vdCAoMSkuXCJcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RQcm90ZWN0ZWQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcCA9IHBhcmFtcy5wYXJhbXNbMF07XG4gICAgaWYgKHAgPT09IDEpIHRoaXMuX2N1ckF0dHJEYXRhLmJnIHw9IEJnRmxhZ3MuUFJPVEVDVEVEO1xuICAgIGlmIChwID09PSAyIHx8IHAgPT09IDApIHRoaXMuX2N1ckF0dHJEYXRhLmJnICY9IH5CZ0ZsYWdzLlBST1RFQ1RFRDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZXJhc2UgY2VsbHMgaW4gYSB0ZXJtaW5hbCByb3cuXG4gICAqIFRoZSBjZWxsIGdldHMgcmVwbGFjZWQgd2l0aCB0aGUgZXJhc2VDaGFyIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyBpbmRleCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQuXG4gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgeCBpbmRleCBvZiB0aGUgcmFuZ2UgdG8gYmUgZXJhc2VkLlxuICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgeCBpbmRleCBvZiB0aGUgcmFuZ2UgdG8gYmUgZXJhc2VkIChleGNsdXNpdmUpLlxuICAgKiBAcGFyYW0gY2xlYXJXcmFwIGNsZWFyIHRoZSBpc1dyYXBwZWQgZmxhZ1xuICAgKiBAcGFyYW0gcmVzcGVjdFByb3RlY3QgV2hldGhlciB0byByZXNwZWN0IHRoZSBwcm90ZWN0aW9uIGF0dHJpYnV0ZSAoREVDU0NBKS5cbiAgICovXG4gIHByaXZhdGUgX2VyYXNlSW5CdWZmZXJMaW5lKHk6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGNsZWFyV3JhcDogYm9vbGVhbiA9IGZhbHNlLCByZXNwZWN0UHJvdGVjdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgeSkhO1xuICAgIGxpbmUucmVwbGFjZUNlbGxzKFxuICAgICAgc3RhcnQsXG4gICAgICBlbmQsXG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSxcbiAgICAgIHJlc3BlY3RQcm90ZWN0XG4gICAgKTtcbiAgICBpZiAoY2xlYXJXcmFwKSB7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJlc2V0IGNlbGxzIGluIGEgdGVybWluYWwgcm93LiBUaGUgY2VsbCBnZXRzIHJlcGxhY2VkIHdpdGggdGhlIGVyYXNlQ2hhciBvZlxuICAgKiB0aGUgdGVybWluYWwgYW5kIHRoZSBpc1dyYXBwZWQgcHJvcGVydHkgaXMgc2V0IHRvIGZhbHNlLlxuICAgKiBAcGFyYW0geSByb3cgaW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QnVmZmVyTGluZSh5OiBudW1iZXIsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KTtcbiAgICBpZiAobGluZSkge1xuICAgICAgbGluZS5maWxsKHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5jbGVhck1hcmtlcnModGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgeSk7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgSiAgRXJhc2UgaW4gRGlzcGxheSAoRUQpLlxuICAgKiAgICAgUHMgPSAwICAtPiBFcmFzZSBCZWxvdyAoZGVmYXVsdCkuXG4gICAqICAgICBQcyA9IDEgIC0+IEVyYXNlIEFib3ZlLlxuICAgKiAgICAgUHMgPSAyICAtPiBFcmFzZSBBbGwuXG4gICAqICAgICBQcyA9IDMgIC0+IEVyYXNlIFNhdmVkIExpbmVzICh4dGVybSkuXG4gICAqIENTSSA/IFBzIEpcbiAgICogICBFcmFzZSBpbiBEaXNwbGF5IChERUNTRUQpLlxuICAgKiAgICAgUHMgPSAwICAtPiBTZWxlY3RpdmUgRXJhc2UgQmVsb3cgKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBTZWxlY3RpdmUgRXJhc2UgQWJvdmUuXG4gICAqICAgICBQcyA9IDIgIC0+IFNlbGVjdGl2ZSBFcmFzZSBBbGwuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEVEICBcIkVyYXNlIEluIERpc3BsYXlcIiAgXCJDU0kgUHMgSlwiICBcIkVyYXNlIHZhcmlvdXMgcGFydHMgb2YgdGhlIHZpZXdwb3J0LlwiXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXM6XG4gICAqXG4gICAqIHwgUHMgfCBFZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IC0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICogfCAwICB8IEVyYXNlIGZyb20gdGhlIGN1cnNvciB0aHJvdWdoIHRoZSBlbmQgb2YgdGhlIHZpZXdwb3J0LiAgICAgICB8XG4gICAqIHwgMSAgfCBFcmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZXdwb3J0IHRocm91Z2ggdGhlIGN1cnNvci4gfFxuICAgKiB8IDIgIHwgRXJhc2UgY29tcGxldGUgdmlld3BvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCAzICB8IEVyYXNlIHNjcm9sbGJhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ1NFRCAgIFwiU2VsZWN0aXZlIEVyYXNlIEluIERpc3BsYXlcIiAgXCJDU0kgPyBQcyBKXCIgIFwiU2FtZSBhcyBFRCB3aXRoIHJlc3BlY3RpbmcgcHJvdGVjdGlvbiBmbGFnLlwiXG4gICAqL1xuICBwdWJsaWMgZXJhc2VJbkRpc3BsYXkocGFyYW1zOiBJUGFyYW1zLCByZXNwZWN0UHJvdGVjdDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKTtcbiAgICBsZXQgajtcbiAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbMF0pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgaiA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55O1xuICAgICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KGopO1xuICAgICAgICB0aGlzLl9lcmFzZUluQnVmZmVyTGluZShqKyssIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID09PSAwLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIGZvciAoOyBqIDwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzOyBqKyspIHtcbiAgICAgICAgICB0aGlzLl9yZXNldEJ1ZmZlckxpbmUoaiwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoaik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBqID0gdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoaik7XG4gICAgICAgIC8vIERlbGV0ZWQgZnJvbnQgcGFydCBvZiBsaW5lIGFuZCBldmVyeXRoaW5nIGJlZm9yZS4gVGhpcyBsaW5lIHdpbGwgbm8gbG9uZ2VyIGJlIHdyYXBwZWQuXG4gICAgICAgIHRoaXMuX2VyYXNlSW5CdWZmZXJMaW5lKGosIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgMSwgdHJ1ZSwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggKyAxID49IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgICAgIC8vIERlbGV0ZWQgZW50aXJlIHByZXZpb3VzIGxpbmUuIFRoaXMgbmV4dCBsaW5lIGNhbiBubyBsb25nZXIgYmUgd3JhcHBlZC5cbiAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KGogKyAxKSEuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGotLSkge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0QnVmZmVyTGluZShqLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSgwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGogPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoaiAtIDEpO1xuICAgICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRCdWZmZXJMaW5lKGosIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgLy8gQ2xlYXIgc2Nyb2xsYmFjayAoZXZlcnl0aGluZyBub3QgaW4gdmlld3BvcnQpXG4gICAgICAgIGNvbnN0IHNjcm9sbEJhY2tTaXplID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmxlbmd0aCAtIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICAgICAgaWYgKHNjcm9sbEJhY2tTaXplID4gMCkge1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy50cmltU3RhcnQoc2Nyb2xsQmFja1NpemUpO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSA9IE1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSAtIHNjcm9sbEJhY2tTaXplLCAwKTtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueWRpc3AgPSBNYXRoLm1heCh0aGlzLl9hY3RpdmVCdWZmZXIueWRpc3AgLSBzY3JvbGxCYWNrU2l6ZSwgMCk7XG4gICAgICAgICAgLy8gRm9yY2UgYSBzY3JvbGwgZXZlbnQgdG8gcmVmcmVzaCB2aWV3cG9ydFxuICAgICAgICAgIHRoaXMuX29uU2Nyb2xsLmZpcmUoMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBLICBFcmFzZSBpbiBMaW5lIChFTCkuXG4gICAqICAgICBQcyA9IDAgIC0+IEVyYXNlIHRvIFJpZ2h0IChkZWZhdWx0KS5cbiAgICogICAgIFBzID0gMSAgLT4gRXJhc2UgdG8gTGVmdC5cbiAgICogICAgIFBzID0gMiAgLT4gRXJhc2UgQWxsLlxuICAgKiBDU0kgPyBQcyBLXG4gICAqICAgRXJhc2UgaW4gTGluZSAoREVDU0VMKS5cbiAgICogICAgIFBzID0gMCAgLT4gU2VsZWN0aXZlIEVyYXNlIHRvIFJpZ2h0IChkZWZhdWx0KS5cbiAgICogICAgIFBzID0gMSAgLT4gU2VsZWN0aXZlIEVyYXNlIHRvIExlZnQuXG4gICAqICAgICBQcyA9IDIgIC0+IFNlbGVjdGl2ZSBFcmFzZSBBbGwuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEVMICAgIFwiRXJhc2UgSW4gTGluZVwiICBcIkNTSSBQcyBLXCIgIFwiRXJhc2UgdmFyaW91cyBwYXJ0cyBvZiB0aGUgYWN0aXZlIHJvdy5cIlxuICAgKiBTdXBwb3J0ZWQgcGFyYW0gdmFsdWVzOlxuICAgKlxuICAgKiB8IFBzIHwgRWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IC0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgKiB8IDAgIHwgRXJhc2UgZnJvbSB0aGUgY3Vyc29yIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgcm93LiAgICAgICAgfFxuICAgKiB8IDEgIHwgRXJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHRocm91Z2ggdGhlIGN1cnNvci4gfFxuICAgKiB8IDIgIHwgRXJhc2UgY29tcGxldGUgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNTRUwgICBcIlNlbGVjdGl2ZSBFcmFzZSBJbiBMaW5lXCIgIFwiQ1NJID8gUHMgS1wiICBcIlNhbWUgYXMgRUwgd2l0aCByZXNwZWN0aW5nIHByb3RlY3RpbmcgZmxhZy5cIlxuICAgKi9cbiAgcHVibGljIGVyYXNlSW5MaW5lKHBhcmFtczogSVBhcmFtcywgcmVzcGVjdFByb3RlY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyk7XG4gICAgc3dpdGNoIChwYXJhbXMucGFyYW1zWzBdKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMuX2VyYXNlSW5CdWZmZXJMaW5lKHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCB0aGlzLl9hY3RpdmVCdWZmZXIueCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9hY3RpdmVCdWZmZXIueCA9PT0gMCwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgMSwgZmFsc2UsIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMuX2VyYXNlSW5CdWZmZXJMaW5lKHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCAwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRydWUsIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBMXG4gICAqIEluc2VydCBQcyBMaW5lKHMpIChkZWZhdWx0ID0gMSkgKElMKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgSUwgIFwiSW5zZXJ0IExpbmVcIiAgIFwiQ1NJIFBzIExcIiAgXCJJbnNlcnQgYFBzYCBibGFuayBsaW5lcyBhdCBhY3RpdmUgcm93IChkZWZhdWx0PTEpLlwiXG4gICAqIEZvciBldmVyeSBpbnNlcnRlZCBsaW5lIGF0IHRoZSBzY3JvbGwgdG9wIG9uZSBsaW5lIGF0IHRoZSBzY3JvbGwgYm90dG9tIGdldHMgcmVtb3ZlZC5cbiAgICogVGhlIGN1cnNvciBpcyBzZXQgdG8gdGhlIGZpcnN0IGNvbHVtbi5cbiAgICogSUwgaGFzIG5vIGVmZmVjdCBpZiB0aGUgY3Vyc29yIGlzIG91dHNpZGUgdGhlIHNjcm9sbCBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGluc2VydExpbmVzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdzogbnVtYmVyID0gdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG5cbiAgICBjb25zdCBzY3JvbGxCb3R0b21Sb3dzT2Zmc2V0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSAtIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b207XG4gICAgY29uc3Qgc2Nyb2xsQm90dG9tQWJzb2x1dGUgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxICsgdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlIC0gc2Nyb2xsQm90dG9tUm93c09mZnNldCArIDE7XG4gICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgIC8vIHRlc3Q6IGVjaG8gLWUgJ1xcZVs0NG1cXGVbMUxcXGVbMG0nXG4gICAgICAvLyBibGFua0xpbmUodHJ1ZSkgLSB4dGVybS9saW51eCBiZWhhdmlvclxuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZShzY3JvbGxCb3R0b21BYnNvbHV0ZSAtIDEsIDEpO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZShyb3csIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IDA7IC8vIHNlZSBodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL2NoYXB0ZXI0Lmh0bWwgLSB2dDIyMCBvbmx5P1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBNXG4gICAqIERlbGV0ZSBQcyBMaW5lKHMpIChkZWZhdWx0ID0gMSkgKERMKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREwgIFwiRGVsZXRlIExpbmVcIiAgIFwiQ1NJIFBzIE1cIiAgXCJEZWxldGUgYFBzYCBsaW5lcyBhdCBhY3RpdmUgcm93IChkZWZhdWx0PTEpLlwiXG4gICAqIEZvciBldmVyeSBkZWxldGVkIGxpbmUgYXQgdGhlIHNjcm9sbCB0b3Agb25lIGJsYW5rIGxpbmUgYXQgdGhlIHNjcm9sbCBib3R0b20gZ2V0cyBhcHBlbmRlZC5cbiAgICogVGhlIGN1cnNvciBpcyBzZXQgdG8gdGhlIGZpcnN0IGNvbHVtbi5cbiAgICogREwgaGFzIG5vIGVmZmVjdCBpZiB0aGUgY3Vyc29yIGlzIG91dHNpZGUgdGhlIHNjcm9sbCBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUxpbmVzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdzogbnVtYmVyID0gdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG5cbiAgICBsZXQgajogbnVtYmVyO1xuICAgIGogPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxIC0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTtcbiAgICBqID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSAtIGo7XG4gICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgIC8vIHRlc3Q6IGVjaG8gLWUgJ1xcZVs0NG1cXGVbMU1cXGVbMG0nXG4gICAgICAvLyBibGFua0xpbmUodHJ1ZSkgLSB4dGVybS9saW51eCBiZWhhdmlvclxuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZShyb3csIDEpO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZShqLCAwLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0QmxhbmtMaW5lKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpO1xuICAgIH1cblxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwOyAvLyBzZWUgaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS9jaGFwdGVyNC5odG1sIC0gdnQyMjAgb25seT9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgQFxuICAgKiBJbnNlcnQgUHMgKEJsYW5rKSBDaGFyYWN0ZXIocykgKGRlZmF1bHQgPSAxKSAoSUNIKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgSUNIICBcIkluc2VydCBDaGFyYWN0ZXJzXCIgICBcIkNTSSBQcyBAXCIgIFwiSW5zZXJ0IGBQc2AgKGJsYW5rKSBjaGFyYWN0ZXJzIChkZWZhdWx0ID0gMSkuXCJcbiAgICogVGhlIElDSCBzZXF1ZW5jZSBpbnNlcnRzIGBQc2AgYmxhbmsgY2hhcmFjdGVycy4gVGhlIGN1cnNvciByZW1haW5zIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gICAqIGJsYW5rIGNoYXJhY3RlcnMuIFRleHQgYmV0d2VlbiB0aGUgY3Vyc29yIGFuZCByaWdodCBtYXJnaW4gbW92ZXMgdG8gdGhlIHJpZ2h0LiBDaGFyYWN0ZXJzIG1vdmVkXG4gICAqIHBhc3QgdGhlIHJpZ2h0IG1hcmdpbiBhcmUgbG9zdC5cbiAgICpcbiAgICpcbiAgICogRklYTUU6IGNoZWNrIGFnYWluc3QgeHRlcm0gLSBzaG91bGQgbm90IHdvcmsgb3V0c2lkZSBvZiBzY3JvbGwgbWFyZ2lucyAoc2VlIFZUNTIwIG1hbnVhbClcbiAgICovXG4gIHB1YmxpYyBpbnNlcnRDaGFycyhwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgICBpZiAobGluZSkge1xuICAgICAgbGluZS5pbnNlcnRDZWxscyhcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLngsXG4gICAgICAgIHBhcmFtcy5wYXJhbXNbMF0gfHwgMSxcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSlcbiAgICAgICk7XG4gICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFBcbiAgICogRGVsZXRlIFBzIENoYXJhY3RlcihzKSAoZGVmYXVsdCA9IDEpIChEQ0gpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBEQ0ggICBcIkRlbGV0ZSBDaGFyYWN0ZXJcIiAgXCJDU0kgUHMgUFwiICBcIkRlbGV0ZSBgUHNgIGNoYXJhY3RlcnMgKGRlZmF1bHQ9MSkuXCJcbiAgICogQXMgY2hhcmFjdGVycyBhcmUgZGVsZXRlZCwgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIGN1cnNvciBhbmQgcmlnaHQgbWFyZ2luIG1vdmUgdG9cbiAgICogdGhlIGxlZnQuIENoYXJhY3RlciBhdHRyaWJ1dGVzIG1vdmUgd2l0aCB0aGUgY2hhcmFjdGVycy4gVGhlIHRlcm1pbmFsIGFkZHMgYmxhbmsgY2hhcmFjdGVycyBhdFxuICAgKiB0aGUgcmlnaHQgbWFyZ2luLlxuICAgKlxuICAgKlxuICAgKiBGSVhNRTogY2hlY2sgYWdhaW5zdCB4dGVybSAtIHNob3VsZCBub3Qgd29yayBvdXRzaWRlIG9mIHNjcm9sbCBtYXJnaW5zIChzZWUgVlQ1MjAgbWFudWFsKVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNoYXJzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICBsaW5lLmRlbGV0ZUNlbGxzKFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCxcbiAgICAgICAgcGFyYW1zLnBhcmFtc1swXSB8fCAxLFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKVxuICAgICAgKTtcbiAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgUyAgU2Nyb2xsIHVwIFBzIGxpbmVzIChkZWZhdWx0ID0gMSkgKFNVKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgU1UgIFwiU2Nyb2xsIFVwXCIgICBcIkNTSSBQcyBTXCIgIFwiU2Nyb2xsIGBQc2AgbGluZXMgdXAgKGRlZmF1bHQ9MSkuXCJcbiAgICpcbiAgICpcbiAgICogRklYTUU6IHNjcm9sbGVkIG91dCBsaW5lcyBhdCB0b3AgPSAxIHNob3VsZCBhZGQgdG8gc2Nyb2xsYmFjayAoeHRlcm0pXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVXAocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuXG4gICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20sIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgVCAgU2Nyb2xsIGRvd24gUHMgbGluZXMgKGRlZmF1bHQgPSAxKSAoU0QpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBTRCAgXCJTY3JvbGwgRG93blwiICAgXCJDU0kgUHMgVFwiICBcIlNjcm9sbCBgUHNgIGxpbmVzIGRvd24gKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxEb3duKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGxldCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcblxuICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20sIDEpO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZSh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCAwLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0QmxhbmtMaW5lKERFRkFVTFRfQVRUUl9EQVRBKSk7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgU1AgQCAgU2Nyb2xsIGxlZnQgUHMgY29sdW1ucyAoZGVmYXVsdCA9IDEpIChTTCkgRUNNQS00OFxuICAgKlxuICAgKiBOb3RhdGlvbjogKFBuKVxuICAgKiBSZXByZXNlbnRhdGlvbjogQ1NJIFBuIDAyLzAwIDA0LzAwXG4gICAqIFBhcmFtZXRlciBkZWZhdWx0IHZhbHVlOiBQbiA9IDFcbiAgICogU0wgY2F1c2VzIHRoZSBkYXRhIGluIHRoZSBwcmVzZW50YXRpb24gY29tcG9uZW50IHRvIGJlIG1vdmVkIGJ5IG4gY2hhcmFjdGVyIHBvc2l0aW9uc1xuICAgKiBpZiB0aGUgbGluZSBvcmllbnRhdGlvbiBpcyBob3Jpem9udGFsLCBvciBieSBuIGxpbmUgcG9zaXRpb25zIGlmIHRoZSBsaW5lIG9yaWVudGF0aW9uXG4gICAqIGlzIHZlcnRpY2FsLCBzdWNoIHRoYXQgdGhlIGRhdGEgYXBwZWFyIHRvIG1vdmUgdG8gdGhlIGxlZnQ7IHdoZXJlIG4gZXF1YWxzIHRoZSB2YWx1ZSBvZiBQbi5cbiAgICogVGhlIGFjdGl2ZSBwcmVzZW50YXRpb24gcG9zaXRpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgY29udHJvbCBmdW5jdGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkOlxuICAgKiAgIC0gYWx3YXlzIGxlZnQgc2hpZnQgKG5vIGxpbmUgb3JpZW50YXRpb24gc2V0dGluZyByZXNwZWN0ZWQpXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFNMICBcIlNjcm9sbCBMZWZ0XCIgXCJDU0kgUHMgU1AgQFwiIFwiU2Nyb2xsIHZpZXdwb3J0IGBQc2AgdGltZXMgdG8gdGhlIGxlZnQuXCJcbiAgICogU0wgbW92ZXMgdGhlIGNvbnRlbnQgb2YgYWxsIGxpbmVzIHdpdGhpbiB0aGUgc2Nyb2xsIG1hcmdpbnMgYFBzYCB0aW1lcyB0byB0aGUgbGVmdC5cbiAgICogU0wgaGFzIG5vIGVmZmVjdCBvdXRzaWRlIG9mIHRoZSBzY3JvbGwgbWFyZ2lucy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxMZWZ0KHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA+IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gfHwgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG4gICAgZm9yIChsZXQgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7IHkgPD0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTsgKyt5KSB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KSE7XG4gICAgICBsaW5lLmRlbGV0ZUNlbGxzKDAsIHBhcmFtLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFNQIEEgIFNjcm9sbCByaWdodCBQcyBjb2x1bW5zIChkZWZhdWx0ID0gMSkgKFNSKSBFQ01BLTQ4XG4gICAqXG4gICAqIE5vdGF0aW9uOiAoUG4pXG4gICAqIFJlcHJlc2VudGF0aW9uOiBDU0kgUG4gMDIvMDAgMDQvMDFcbiAgICogUGFyYW1ldGVyIGRlZmF1bHQgdmFsdWU6IFBuID0gMVxuICAgKiBTUiBjYXVzZXMgdGhlIGRhdGEgaW4gdGhlIHByZXNlbnRhdGlvbiBjb21wb25lbnQgdG8gYmUgbW92ZWQgYnkgbiBjaGFyYWN0ZXIgcG9zaXRpb25zXG4gICAqIGlmIHRoZSBsaW5lIG9yaWVudGF0aW9uIGlzIGhvcml6b250YWwsIG9yIGJ5IG4gbGluZSBwb3NpdGlvbnMgaWYgdGhlIGxpbmUgb3JpZW50YXRpb25cbiAgICogaXMgdmVydGljYWwsIHN1Y2ggdGhhdCB0aGUgZGF0YSBhcHBlYXIgdG8gbW92ZSB0byB0aGUgcmlnaHQ7IHdoZXJlIG4gZXF1YWxzIHRoZSB2YWx1ZSBvZiBQbi5cbiAgICogVGhlIGFjdGl2ZSBwcmVzZW50YXRpb24gcG9zaXRpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgY29udHJvbCBmdW5jdGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkOlxuICAgKiAgIC0gYWx3YXlzIHJpZ2h0IHNoaWZ0IChubyBsaW5lIG9yaWVudGF0aW9uIHNldHRpbmcgcmVzcGVjdGVkKVxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBTUiAgXCJTY3JvbGwgUmlnaHRcIiAgXCJDU0kgUHMgU1AgQVwiICAgXCJTY3JvbGwgdmlld3BvcnQgYFBzYCB0aW1lcyB0byB0aGUgcmlnaHQuXCJcbiAgICogU0wgbW92ZXMgdGhlIGNvbnRlbnQgb2YgYWxsIGxpbmVzIHdpdGhpbiB0aGUgc2Nyb2xsIG1hcmdpbnMgYFBzYCB0aW1lcyB0byB0aGUgcmlnaHQuXG4gICAqIENvbnRlbnQgYXQgdGhlIHJpZ2h0IG1hcmdpbiBpcyBsb3N0LlxuICAgKiBTTCBoYXMgbm8gZWZmZWN0IG91dHNpZGUgb2YgdGhlIHNjcm9sbCBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbFJpZ2h0KHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA+IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gfHwgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG4gICAgZm9yIChsZXQgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7IHkgPD0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTsgKyt5KSB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KSE7XG4gICAgICBsaW5lLmluc2VydENlbGxzKDAsIHBhcmFtLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtICcgfVxuICAgKiBJbnNlcnQgUHMgQ29sdW1uKHMpIChkZWZhdWx0ID0gMSkgKERFQ0lDKSwgVlQ0MjAgYW5kIHVwLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNJQyBcIkluc2VydCBDb2x1bW5zXCIgIFwiQ1NJIFBzICcgfVwiICBcIkluc2VydCBgUHNgIGNvbHVtbnMgYXQgY3Vyc29yIHBvc2l0aW9uLlwiXG4gICAqIERFQ0lDIGluc2VydHMgYFBzYCB0aW1lcyBibGFuayBjb2x1bW5zIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24gZm9yIGFsbCBsaW5lcyB3aXRoIHRoZSBzY3JvbGxcbiAgICogbWFyZ2lucywgbW92aW5nIGNvbnRlbnQgdG8gdGhlIHJpZ2h0LiBDb250ZW50IGF0IHRoZSByaWdodCBtYXJnaW4gaXMgbG9zdC4gREVDSUMgaGFzIG5vIGVmZmVjdFxuICAgKiBvdXRzaWRlIHRoZSBzY3JvbGxpbmcgbWFyZ2lucy5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnRDb2x1bW5zKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA+IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gfHwgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG4gICAgZm9yIChsZXQgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7IHkgPD0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTsgKyt5KSB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KSE7XG4gICAgICBsaW5lLmluc2VydENlbGxzKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCBwYXJhbSwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpO1xuICAgICAgbGluZS5pc1dyYXBwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQbSAnIH5cbiAgICogRGVsZXRlIFBzIENvbHVtbihzKSAoZGVmYXVsdCA9IDEpIChERUNEQyksIFZUNDIwIGFuZCB1cC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDREMgXCJEZWxldGUgQ29sdW1uc1wiICBcIkNTSSBQcyAnIH5cIiAgXCJEZWxldGUgYFBzYCBjb2x1bW5zIGF0IGN1cnNvciBwb3NpdGlvbi5cIlxuICAgKiBERUNEQyBkZWxldGVzIGBQc2AgdGltZXMgY29sdW1ucyBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uIGZvciBhbGwgbGluZXMgd2l0aCB0aGUgc2Nyb2xsIG1hcmdpbnMsXG4gICAqIG1vdmluZyBjb250ZW50IHRvIHRoZSBsZWZ0LiBCbGFuayBjb2x1bW5zIGFyZSBhZGRlZCBhdCB0aGUgcmlnaHQgbWFyZ2luLlxuICAgKiBERUNEQyBoYXMgbm8gZWZmZWN0IG91dHNpZGUgdGhlIHNjcm9sbGluZyBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNvbHVtbnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuZGVsZXRlQ2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsIHBhcmFtLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFhcbiAgICogRXJhc2UgUHMgQ2hhcmFjdGVyKHMpIChkZWZhdWx0ID0gMSkgKEVDSCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEVDSCAgIFwiRXJhc2UgQ2hhcmFjdGVyXCIgICBcIkNTSSBQcyBYXCIgIFwiRXJhc2UgYFBzYCBjaGFyYWN0ZXJzIGZyb20gY3VycmVudCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIHJpZ2h0IChkZWZhdWx0PTEpLlwiXG4gICAqIEVEIGVyYXNlcyBgUHNgIGNoYXJhY3RlcnMgZnJvbSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB0byB0aGUgcmlnaHQuXG4gICAqIEVEIHdvcmtzIGluc2lkZSBvciBvdXRzaWRlIHRoZSBzY3JvbGxpbmcgbWFyZ2lucy5cbiAgICovXG4gIHB1YmxpYyBlcmFzZUNoYXJzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICBsaW5lLnJlcGxhY2VDZWxscyhcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLngsXG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSksXG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpXG4gICAgICApO1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBiICBSZXBlYXQgdGhlIHByZWNlZGluZyBncmFwaGljIGNoYXJhY3RlciBQcyB0aW1lcyAoUkVQKS5cbiAgICogRnJvbSBFQ01BIDQ4IChAc2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTA0OC5wZGYpXG4gICAqICAgIE5vdGF0aW9uOiAoUG4pXG4gICAqICAgIFJlcHJlc2VudGF0aW9uOiBDU0kgUG4gMDYvMDJcbiAgICogICAgUGFyYW1ldGVyIGRlZmF1bHQgdmFsdWU6IFBuID0gMVxuICAgKiAgICBSRVAgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVyIGluIHRoZSBkYXRhIHN0cmVhbSxcbiAgICogICAgaWYgaXQgaXMgYSBncmFwaGljIGNoYXJhY3RlciAocmVwcmVzZW50ZWQgYnkgb25lIG9yIG1vcmUgYml0IGNvbWJpbmF0aW9ucykgaW5jbHVkaW5nIFNQQUNFLFxuICAgKiAgICBpcyB0byBiZSByZXBlYXRlZCBuIHRpbWVzLCB3aGVyZSBuIGVxdWFscyB0aGUgdmFsdWUgb2YgUG4uXG4gICAqICAgIElmIHRoZSBjaGFyYWN0ZXIgcHJlY2VkaW5nIFJFUCBpcyBhIGNvbnRyb2wgZnVuY3Rpb24gb3IgcGFydCBvZiBhIGNvbnRyb2wgZnVuY3Rpb24sXG4gICAqICAgIHRoZSBlZmZlY3Qgb2YgUkVQIGlzIG5vdCBkZWZpbmVkIGJ5IHRoaXMgU3RhbmRhcmQuXG4gICAqXG4gICAqIFdlIGV4dGVuZCB4dGVybSdzIGJlaGF2aW9yIHRvIGFsbG93IHJlcGVhdGluZyBlbnRpcmUgZ3JhcGhlbWUgY2x1c3RlcnMuXG4gICAqIFRoaXMgaXNuJ3QgMTAwJSB4dGVybS1jb21wYXRpYmxlLCBidXQgaXQgc2VlbXMgc2FuZXIgYW5kIG1vcmUgdXNlZnVsLlxuICAgKiAgICAtIHRleHQgYXR0cnMgYXJlIGFwcGxpZWQgbm9ybWFsbHlcbiAgICogICAgLSB3cmFwIGFyb3VuZCBpcyByZXNwZWN0ZWRcbiAgICogICAgLSBhbnkgdmFsaWQgc2VxdWVuY2UgcmVzZXRzIHRoZSBjYXJyaWVkIGZvcndhcmQgY2hhclxuICAgKlxuICAgKiBOb3RlOiBUbyBnZXQgcmVzZXQgb24gYSB2YWxpZCBzZXF1ZW5jZSB3b3JraW5nIGNvcnJlY3RseSB3aXRob3V0IG11Y2ggcnVudGltZSBwZW5hbHR5LCB0aGVcbiAgICogcHJlY2VkaW5nIGNvZGVwb2ludCBpcyBzdG9yZWQgb24gdGhlIHBhcnNlciBpbiBgdGhpcy5wcmludGAgYW5kIHJlc2V0IGR1cmluZyBgcGFyc2VyLnBhcnNlYC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgUkVQICAgXCJSZXBlYXQgUHJlY2VkaW5nIENoYXJhY3RlclwiICAgIFwiQ1NJIFBzIGJcIiAgXCJSZXBlYXQgcHJlY2VkaW5nIGNoYXJhY3RlciBgUHNgIHRpbWVzIChkZWZhdWx0PTEpLlwiXG4gICAqIFJFUCByZXBlYXRzIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgYFBzYCB0aW1lcyBhZHZhbmNpbmcgdGhlIGN1cnNvciwgYWxzbyB3cmFwcGluZyBpZiBERUNBV00gaXNcbiAgICogc2V0LiBSRVAgaGFzIG5vIGVmZmVjdCBpZiB0aGUgc2VxdWVuY2UgZG9lcyBub3QgZm9sbG93IGEgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlclxuICAgKiAoTk9PUCBmb3IgYW55IG90aGVyIHNlcXVlbmNlIGluIGJldHdlZW4gb3IgTk9OIEFTQ0lJIGNoYXJhY3RlcnMpLlxuICAgKi9cbiAgcHVibGljIHJlcGVhdFByZWNlZGluZ0NoYXJhY3RlcihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBqb2luU3RhdGUgPSB0aGlzLl9wYXJzZXIucHJlY2VkaW5nSm9pblN0YXRlO1xuICAgIGlmICgham9pblN0YXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gY2FsbCBwcmludCB0byBpbnNlcnQgdGhlIGNoYXJzIGFuZCBoYW5kbGUgY29ycmVjdCB3cmFwcGluZ1xuICAgIGNvbnN0IGxlbmd0aCA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBjb25zdCBjaFdpZHRoID0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKGpvaW5TdGF0ZSk7XG4gICAgY29uc3QgeCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54IC0gY2hXaWR0aDtcbiAgICBjb25zdCBidWZmZXJSb3cgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSE7XG4gICAgY29uc3QgdGV4dCA9IGJ1ZmZlclJvdy5nZXRTdHJpbmcoeCk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSh0ZXh0Lmxlbmd0aCAqIGxlbmd0aCk7XG4gICAgbGV0IGlkYXRhID0gMDtcbiAgICBmb3IgKGxldCBpdGV4dCA9IDA7IGl0ZXh0IDwgdGV4dC5sZW5ndGg7ICkge1xuICAgICAgY29uc3QgY2ggPSB0ZXh0LmNvZGVQb2ludEF0KGl0ZXh0KSB8fCAwO1xuICAgICAgZGF0YVtpZGF0YSsrXSA9IGNoO1xuICAgICAgaXRleHQgKz0gY2ggPiAweGZmZmYgPyAyIDogMTtcbiAgICB9XG4gICAgbGV0IHRsZW5ndGggPSBpZGF0YTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBkYXRhLmNvcHlXaXRoaW4odGxlbmd0aCwgMCwgaWRhdGEpO1xuICAgICAgdGxlbmd0aCArPSBpZGF0YTtcbiAgICB9XG4gICAgdGhpcy5wcmludChkYXRhLCAwLCB0bGVuZ3RoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgYyAgU2VuZCBEZXZpY2UgQXR0cmlidXRlcyAoUHJpbWFyeSBEQSkuXG4gICAqICAgICBQcyA9IDAgIG9yIG9taXR0ZWQgLT4gcmVxdWVzdCBhdHRyaWJ1dGVzIGZyb20gdGVybWluYWwuICBUaGVcbiAgICogICAgIHJlc3BvbnNlIGRlcGVuZHMgb24gdGhlIGRlY1Rlcm1pbmFsSUQgcmVzb3VyY2Ugc2V0dGluZy5cbiAgICogICAgIC0+IENTSSA/IDEgOyAyIGMgIChgYFZUMTAwIHdpdGggQWR2YW5jZWQgVmlkZW8gT3B0aW9uJycpXG4gICAqICAgICAtPiBDU0kgPyAxIDsgMCBjICAoYGBWVDEwMSB3aXRoIE5vIE9wdGlvbnMnJylcbiAgICogICAgIC0+IENTSSA/IDYgYyAgKGBgVlQxMDInJylcbiAgICogICAgIC0+IENTSSA/IDYgMCA7IDEgOyAyIDsgNiA7IDggOyA5IDsgMSA1IDsgYyAgKGBgVlQyMjAnJylcbiAgICogICBUaGUgVlQxMDAtc3R5bGUgcmVzcG9uc2UgcGFyYW1ldGVycyBkbyBub3QgbWVhbiBhbnl0aGluZyBieVxuICAgKiAgIHRoZW1zZWx2ZXMuICBWVDIyMCBwYXJhbWV0ZXJzIGRvLCB0ZWxsaW5nIHRoZSBob3N0IHdoYXQgZmVhLVxuICAgKiAgIHR1cmVzIHRoZSB0ZXJtaW5hbCBzdXBwb3J0czpcbiAgICogICAgIFBzID0gMSAgLT4gMTMyLWNvbHVtbnMuXG4gICAqICAgICBQcyA9IDIgIC0+IFByaW50ZXIuXG4gICAqICAgICBQcyA9IDYgIC0+IFNlbGVjdGl2ZSBlcmFzZS5cbiAgICogICAgIFBzID0gOCAgLT4gVXNlci1kZWZpbmVkIGtleXMuXG4gICAqICAgICBQcyA9IDkgIC0+IE5hdGlvbmFsIHJlcGxhY2VtZW50IGNoYXJhY3RlciBzZXRzLlxuICAgKiAgICAgUHMgPSAxIDUgIC0+IFRlY2huaWNhbCBjaGFyYWN0ZXJzLlxuICAgKiAgICAgUHMgPSAyIDIgIC0+IEFOU0kgY29sb3IsIGUuZy4sIFZUNTI1LlxuICAgKiAgICAgUHMgPSAyIDkgIC0+IEFOU0kgdGV4dCBsb2NhdG9yIChpLmUuLCBERUMgTG9jYXRvciBtb2RlKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREExICAgXCJQcmltYXJ5IERldmljZSBBdHRyaWJ1dGVzXCIgICAgIFwiQ1NJIGNcIiAgXCJTZW5kIHByaW1hcnkgZGV2aWNlIGF0dHJpYnV0ZXMuXCJcbiAgICpcbiAgICpcbiAgICogVE9ETzogZml4IGFuZCBjbGVhbnVwIHJlc3BvbnNlXG4gICAqL1xuICBwdWJsaWMgc2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5KHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmIChwYXJhbXMucGFyYW1zWzBdID4gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pcygneHRlcm0nKSB8fCB0aGlzLl9pcygncnh2dC11bmljb2RlJykgfHwgdGhpcy5faXMoJ3NjcmVlbicpKSB7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbPzE7MmMnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzKCdsaW51eCcpKSB7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbPzZjJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSA+IFBzIGNcbiAgICogICBTZW5kIERldmljZSBBdHRyaWJ1dGVzIChTZWNvbmRhcnkgREEpLlxuICAgKiAgICAgUHMgPSAwICBvciBvbWl0dGVkIC0+IHJlcXVlc3QgdGhlIHRlcm1pbmFsJ3MgaWRlbnRpZmljYXRpb25cbiAgICogICAgIGNvZGUuICBUaGUgcmVzcG9uc2UgZGVwZW5kcyBvbiB0aGUgZGVjVGVybWluYWxJRCByZXNvdXJjZSBzZXQtXG4gICAqICAgICB0aW5nLiAgSXQgc2hvdWxkIGFwcGx5IG9ubHkgdG8gVlQyMjAgYW5kIHVwLCBidXQgeHRlcm0gZXh0ZW5kc1xuICAgKiAgICAgdGhpcyB0byBWVDEwMC5cbiAgICogICAgIC0+IENTSSAgPiBQcCA7IFB2IDsgUGMgY1xuICAgKiAgIHdoZXJlIFBwIGRlbm90ZXMgdGhlIHRlcm1pbmFsIHR5cGVcbiAgICogICAgIFBwID0gMCAgLT4gYGBWVDEwMCcnLlxuICAgKiAgICAgUHAgPSAxICAtPiBgYFZUMjIwJycuXG4gICAqICAgYW5kIFB2IGlzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIChmb3IgeHRlcm0sIHRoaXMgd2FzIG9yaWdpbmFsbHlcbiAgICogICB0aGUgWEZyZWU4NiBwYXRjaCBudW1iZXIsIHN0YXJ0aW5nIHdpdGggOTUpLiAgSW4gYSBERUMgdGVybWktXG4gICAqICAgbmFsLCBQYyBpbmRpY2F0ZXMgdGhlIFJPTSBjYXJ0cmlkZ2UgcmVnaXN0cmF0aW9uIG51bWJlciBhbmQgaXNcbiAgICogICBhbHdheXMgemVyby5cbiAgICogTW9yZSBpbmZvcm1hdGlvbjpcbiAgICogICB4dGVybS9jaGFycHJvYy5jIC0gbGluZSAyMDEyLCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogICB2aW0gcmVzcG9uZHMgd2l0aCBeW1s/MGMgb3IgXltbPzFjIGFmdGVyIHRoZSB0ZXJtaW5hbCdzIHJlc3BvbnNlICg/KVxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBEQTIgICBcIlNlY29uZGFyeSBEZXZpY2UgQXR0cmlidXRlc1wiICAgXCJDU0kgPiBjXCIgXCJTZW5kIHByaW1hcnkgZGV2aWNlIGF0dHJpYnV0ZXMuXCJcbiAgICpcbiAgICpcbiAgICogVE9ETzogZml4IGFuZCBjbGVhbnVwIHJlc3BvbnNlXG4gICAqL1xuICBwdWJsaWMgc2VuZERldmljZUF0dHJpYnV0ZXNTZWNvbmRhcnkocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhcmFtcy5wYXJhbXNbMF0gPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8geHRlcm0gYW5kIHVyeHZ0XG4gICAgLy8gc2VlbSB0byBzcGl0IHRoaXNcbiAgICAvLyBvdXQgYXJvdW5kIH4zNzAgdGltZXMgKD8pLlxuICAgIGlmICh0aGlzLl9pcygneHRlcm0nKSkge1xuICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChDMC5FU0MgKyAnWz4wOzI3NjswYycpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faXMoJ3J4dnQtdW5pY29kZScpKSB7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbPjg1Ozk1OzBjJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9pcygnbGludXgnKSkge1xuICAgICAgLy8gbm90IHN1cHBvcnRlZCBieSBsaW51eCBjb25zb2xlLlxuICAgICAgLy8gbGludXggY29uc29sZSBlY2hvZXMgcGFyYW1ldGVycy5cbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQocGFyYW1zLnBhcmFtc1swXSArICdjJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9pcygnc2NyZWVuJykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s+ODM7NDAwMDM7MGMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgaWYgdGhlIGN1cnJlbnQgdGVybWluYWwgaXMgdGhlIGdpdmVuIGFyZ3VtZW50LlxuICAgKiBAcGFyYW0gdGVybSBUaGUgdGVybWluYWwgbmFtZSB0byBldmFsdWF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaXModGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRlcm1OYW1lICsgJycpLmluZGV4T2YodGVybSkgPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtIGggIFNldCBNb2RlIChTTSkuXG4gICAqICAgICBQcyA9IDIgIC0+IEtleWJvYXJkIEFjdGlvbiBNb2RlIChBTSkuXG4gICAqICAgICBQcyA9IDQgIC0+IEluc2VydCBNb2RlIChJUk0pLlxuICAgKiAgICAgUHMgPSAxIDIgIC0+IFNlbmQvcmVjZWl2ZSAoU1JNKS5cbiAgICogICAgIFBzID0gMiAwICAtPiBBdXRvbWF0aWMgTmV3bGluZSAoTE5NKS5cbiAgICpcbiAgICogQHZ0OiAjUFtPbmx5IElSTSBpcyBzdXBwb3J0ZWQuXSAgICBDU0kgU00gICAgXCJTZXQgTW9kZVwiICBcIkNTSSBQbSBoXCIgIFwiU2V0IHZhcmlvdXMgdGVybWluYWwgbW9kZXMuXCJcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlcyBieSBTTTpcbiAgICpcbiAgICogfCBQYXJhbSB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3VwcG9ydCB8XG4gICAqIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDIgICAgIHwgS2V5Ym9hcmQgQWN0aW9uIE1vZGUgKEtBTSkuIEFsd2F5cyBvbi4gfCAjTiAgICAgIHxcbiAgICogfCA0ICAgICB8IEluc2VydCBNb2RlIChJUk0pLiAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTIgICAgfCBTZW5kL3JlY2VpdmUgKFNSTSkuIEFsd2F5cyBvZmYuICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDIwICAgIHwgQXV0b21hdGljIE5ld2xpbmUgKExOTSkuICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICovXG4gIHB1YmxpYyBzZXRNb2RlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbaV0pIHtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLm1vZGVzLmluc2VydE1vZGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY29udmVydEVvbCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSA/IFBtIGhcbiAgICogICBERUMgUHJpdmF0ZSBNb2RlIFNldCAoREVDU0VUKS5cbiAgICogICAgIFBzID0gMSAgLT4gQXBwbGljYXRpb24gQ3Vyc29yIEtleXMgKERFQ0NLTSkuXG4gICAqICAgICBQcyA9IDIgIC0+IERlc2lnbmF0ZSBVU0FTQ0lJIGZvciBjaGFyYWN0ZXIgc2V0cyBHMC1HM1xuICAgKiAgICAgKERFQ0FOTSksIGFuZCBzZXQgVlQxMDAgbW9kZS5cbiAgICogICAgIFBzID0gMyAgLT4gMTMyIENvbHVtbiBNb2RlIChERUNDT0xNKS5cbiAgICogICAgIFBzID0gNCAgLT4gU21vb3RoIChTbG93KSBTY3JvbGwgKERFQ1NDTE0pLlxuICAgKiAgICAgUHMgPSA1ICAtPiBSZXZlcnNlIFZpZGVvIChERUNTQ05NKS5cbiAgICogICAgIFBzID0gNiAgLT4gT3JpZ2luIE1vZGUgKERFQ09NKS5cbiAgICogICAgIFBzID0gNyAgLT4gV3JhcGFyb3VuZCBNb2RlIChERUNBV00pLlxuICAgKiAgICAgUHMgPSA4ICAtPiBBdXRvLXJlcGVhdCBLZXlzIChERUNBUk0pLlxuICAgKiAgICAgUHMgPSA5ICAtPiBTZW5kIE1vdXNlIFggJiBZIG9uIGJ1dHRvbiBwcmVzcy4gIFNlZSB0aGUgc2VjLVxuICAgKiAgICAgdGlvbiBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwICAtPiBTaG93IHRvb2xiYXIgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDIgIC0+IFN0YXJ0IEJsaW5raW5nIEN1cnNvciAoYXR0NjEwKS5cbiAgICogICAgIFBzID0gMSA4ICAtPiBQcmludCBmb3JtIGZlZWQgKERFQ1BGRikuXG4gICAqICAgICBQcyA9IDEgOSAgLT4gU2V0IHByaW50IGV4dGVudCB0byBmdWxsIHNjcmVlbiAoREVDUEVYKS5cbiAgICogICAgIFBzID0gMiA1ICAtPiBTaG93IEN1cnNvciAoREVDVENFTSkuXG4gICAqICAgICBQcyA9IDMgMCAgLT4gU2hvdyBzY3JvbGxiYXIgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAzIDUgIC0+IEVuYWJsZSBmb250LXNoaWZ0aW5nIGZ1bmN0aW9ucyAocnh2dCkuXG4gICAqICAgICBQcyA9IDMgOCAgLT4gRW50ZXIgVGVrdHJvbml4IE1vZGUgKERFQ1RFSykuXG4gICAqICAgICBQcyA9IDQgMCAgLT4gQWxsb3cgODAgLT4gMTMyIE1vZGUuXG4gICAqICAgICBQcyA9IDQgMSAgLT4gbW9yZSgxKSBmaXggKHNlZSBjdXJzZXMgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSA0IDIgIC0+IEVuYWJsZSBOYXRpb24gUmVwbGFjZW1lbnQgQ2hhcmFjdGVyIHNldHMgKERFQ04tXG4gICAqICAgICBSQ00pLlxuICAgKiAgICAgUHMgPSA0IDQgIC0+IFR1cm4gT24gTWFyZ2luIEJlbGwuXG4gICAqICAgICBQcyA9IDQgNSAgLT4gUmV2ZXJzZS13cmFwYXJvdW5kIE1vZGUuXG4gICAqICAgICBQcyA9IDQgNiAgLT4gU3RhcnQgTG9nZ2luZy4gIFRoaXMgaXMgbm9ybWFsbHkgZGlzYWJsZWQgYnkgYVxuICAgKiAgICAgY29tcGlsZS10aW1lIG9wdGlvbi5cbiAgICogICAgIFBzID0gNCA3ICAtPiBVc2UgQWx0ZXJuYXRlIFNjcmVlbiBCdWZmZXIuICAoVGhpcyBtYXkgYmUgZGlzLVxuICAgKiAgICAgYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gNiA2ICAtPiBBcHBsaWNhdGlvbiBrZXlwYWQgKERFQ05LTSkuXG4gICAqICAgICBQcyA9IDYgNyAgLT4gQmFja2Fycm93IGtleSBzZW5kcyBiYWNrc3BhY2UgKERFQ0JLTSkuXG4gICAqICAgICBQcyA9IDEgMCAwIDAgIC0+IFNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzIGFuZFxuICAgKiAgICAgcmVsZWFzZS4gIFNlZSB0aGUgc2VjdGlvbiBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwIDAgMSAgLT4gVXNlIEhpbGl0ZSBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwIDAgMiAgLT4gVXNlIENlbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAzICAtPiBVc2UgQWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwIDAgNCAgLT4gU2VuZCBGb2N1c0luL0ZvY3VzT3V0IGV2ZW50cy5cbiAgICogICAgIFBzID0gMSAwIDAgNSAgLT4gRW5hYmxlIEV4dGVuZGVkIE1vdXNlIE1vZGUuXG4gICAqICAgICBQcyA9IDEgMCAxIDAgIC0+IFNjcm9sbCB0byBib3R0b20gb24gdHR5IG91dHB1dCAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMCAxIDEgIC0+IFNjcm9sbCB0byBib3R0b20gb24ga2V5IHByZXNzIChyeHZ0KS5cbiAgICogICAgIFBzID0gMSAwIDMgNCAgLT4gSW50ZXJwcmV0IFwibWV0YVwiIGtleSwgc2V0cyBlaWdodGggYml0LlxuICAgKiAgICAgKGVuYWJsZXMgdGhlIGVpZ2h0Qml0SW5wdXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA1ICAtPiBFbmFibGUgc3BlY2lhbCBtb2RpZmllcnMgZm9yIEFsdCBhbmQgTnVtLVxuICAgKiAgICAgTG9jayBrZXlzLiAgKFRoaXMgZW5hYmxlcyB0aGUgbnVtTG9jayByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCAzIDYgIC0+IFNlbmQgRVNDICAgd2hlbiBNZXRhIG1vZGlmaWVzIGEga2V5LiAgKFRoaXNcbiAgICogICAgIGVuYWJsZXMgdGhlIG1ldGFTZW5kc0VzY2FwZSByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCAzIDcgIC0+IFNlbmQgREVMIGZyb20gdGhlIGVkaXRpbmcta2V5cGFkIERlbGV0ZVxuICAgKiAgICAga2V5LlxuICAgKiAgICAgUHMgPSAxIDAgMyA5ICAtPiBTZW5kIEVTQyAgd2hlbiBBbHQgbW9kaWZpZXMgYSBrZXkuICAoVGhpc1xuICAgKiAgICAgZW5hYmxlcyB0aGUgYWx0U2VuZHNFc2NhcGUgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAwICAtPiBLZWVwIHNlbGVjdGlvbiBldmVuIGlmIG5vdCBoaWdobGlnaHRlZC5cbiAgICogICAgIChUaGlzIGVuYWJsZXMgdGhlIGtlZXBTZWxlY3Rpb24gcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAxICAtPiBVc2UgdGhlIENMSVBCT0FSRCBzZWxlY3Rpb24uICAoVGhpcyBlbmFibGVzXG4gICAqICAgICB0aGUgc2VsZWN0VG9DbGlwYm9hcmQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAyICAtPiBFbmFibGUgVXJnZW5jeSB3aW5kb3cgbWFuYWdlciBoaW50IHdoZW5cbiAgICogICAgIENvbnRyb2wtRyBpcyByZWNlaXZlZC4gIChUaGlzIGVuYWJsZXMgdGhlIGJlbGxJc1VyZ2VudFxuICAgKiAgICAgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAzICAtPiBFbmFibGUgcmFpc2luZyBvZiB0aGUgd2luZG93IHdoZW4gQ29udHJvbC1HXG4gICAqICAgICBpcyByZWNlaXZlZC4gIChlbmFibGVzIHRoZSBwb3BPbkJlbGwgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCA3ICAtPiBVc2UgQWx0ZXJuYXRlIFNjcmVlbiBCdWZmZXIuICAoVGhpcyBtYXkgYmVcbiAgICogICAgIGRpc2FibGVkIGJ5IHRoZSB0aXRlSW5oaWJpdCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDggIC0+IFNhdmUgY3Vyc29yIGFzIGluIERFQ1NDLiAgKFRoaXMgbWF5IGJlIGRpcy1cbiAgICogICAgIGFibGVkIGJ5IHRoZSB0aXRlSW5oaWJpdCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDkgIC0+IFNhdmUgY3Vyc29yIGFzIGluIERFQ1NDIGFuZCB1c2UgQWx0ZXJuYXRlXG4gICAqICAgICBTY3JlZW4gQnVmZmVyLCBjbGVhcmluZyBpdCBmaXJzdC4gIChUaGlzIG1heSBiZSBkaXNhYmxlZCBieVxuICAgKiAgICAgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS4gIFRoaXMgY29tYmluZXMgdGhlIGVmZmVjdHMgb2YgdGhlIDFcbiAgICogICAgIDAgNCA3ICBhbmQgMSAwIDQgOCAgbW9kZXMuICBVc2UgdGhpcyB3aXRoIHRlcm1pbmZvLWJhc2VkXG4gICAqICAgICBhcHBsaWNhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIDQgNyAgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMCAgLT4gU2V0IHRlcm1pbmZvL3Rlcm1jYXAgZnVuY3Rpb24ta2V5IG1vZGUuXG4gICAqICAgICBQcyA9IDEgMCA1IDEgIC0+IFNldCBTdW4gZnVuY3Rpb24ta2V5IG1vZGUuXG4gICAqICAgICBQcyA9IDEgMCA1IDIgIC0+IFNldCBIUCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMyAgLT4gU2V0IFNDTyBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDYgMCAgLT4gU2V0IGxlZ2FjeSBrZXlib2FyZCBlbXVsYXRpb24gKFgxMVI2KS5cbiAgICogICAgIFBzID0gMSAwIDYgMSAgLT4gU2V0IFZUMjIwIGtleWJvYXJkIGVtdWxhdGlvbi5cbiAgICogICAgIFBzID0gMiAwIDAgNCAgLT4gU2V0IGJyYWNrZXRlZCBwYXN0ZSBtb2RlLlxuICAgKiBNb2RlczpcbiAgICogICBodHRwOiAqdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vY2hhcHRlcjQuaHRtbFxuICAgKlxuICAgKiBAdnQ6ICNQW1NlZSBiZWxvdyBmb3Igc3VwcG9ydGVkIG1vZGVzLl0gICAgQ1NJIERFQ1NFVCAgXCJERUMgUHJpdmF0ZSBTZXQgTW9kZVwiIFwiQ1NJID8gUG0gaFwiICBcIlNldCB2YXJpb3VzIHRlcm1pbmFsIGF0dHJpYnV0ZXMuXCJcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlcyBieSBERUNTRVQ6XG4gICAqXG4gICAqIHwgcGFyYW0gfCBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3VwcG9ydCB8XG4gICAqIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS18XG4gICAqIHwgMSAgICAgfCBBcHBsaWNhdGlvbiBDdXJzb3IgS2V5cyAoREVDQ0tNKS4gICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMiAgICAgfCBEZXNpZ25hdGUgVVMtQVNDSUkgZm9yIGNoYXJhY3RlciBzZXRzIEcwLUczIChERUNBTk0pLiAgIHwgI1kgICAgICB8XG4gICAqIHwgMyAgICAgfCAxMzIgQ29sdW1uIE1vZGUgKERFQ0NPTE0pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNiAgICAgfCBPcmlnaW4gTW9kZSAoREVDT00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNyAgICAgfCBBdXRvLXdyYXAgTW9kZSAoREVDQVdNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgOCAgICAgfCBBdXRvLXJlcGVhdCBLZXlzIChERUNBUk0pLiBBbHdheXMgb24uICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgOSAgICAgfCBYMTAgeHRlcm0gbW91c2UgcHJvdG9jb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTIgICAgfCBTdGFydCBCbGlua2luZyBDdXJzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjUgICAgfCBTaG93IEN1cnNvciAoREVDVENFTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDUgICAgfCBSZXZlcnNlIHdyYXAtYXJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDcgICAgfCBVc2UgQWx0ZXJuYXRlIFNjcmVlbiBCdWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNjYgICAgfCBBcHBsaWNhdGlvbiBrZXlwYWQgKERFQ05LTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwMCAgfCBYMTEgeHRlcm0gbW91c2UgcHJvdG9jb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwMiAgfCBVc2UgQ2VsbCBNb3Rpb24gTW91c2UgVHJhY2tpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwMyAgfCBVc2UgQWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwNCAgfCBTZW5kIEZvY3VzSW4vRm9jdXNPdXQgZXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwNSAgfCBFbmFibGUgVVRGLTggTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMTAwNiAgfCBFbmFibGUgU0dSIE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAxNSAgfCBFbmFibGUgdXJ4dnQgTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMTAxNiAgfCBFbmFibGUgU0dSLVBpeGVscyBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTA0NyAgfCBVc2UgQWx0ZXJuYXRlIFNjcmVlbiBCdWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTA0OCAgfCBTYXZlIGN1cnNvciBhcyBpbiBERUNTQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTA0OSAgfCBTYXZlIGN1cnNvciBhbmQgc3dpdGNoIHRvIGFsdGVybmF0ZSBidWZmZXIgY2xlYXJpbmcgaXQuIHwgI1BbRG9lcyBub3QgY2xlYXIgdGhlIGFsdGVybmF0ZSBidWZmZXIuXSB8XG4gICAqIHwgMjAwNCAgfCBTZXQgYnJhY2tldGVkIHBhc3RlIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiBpbXBsZW1lbnQgREVDU0NOTSwgMTA0OSBzaG91bGQgY2xlYXIgYWx0YnVmZmVyXG4gICAqL1xuICBwdWJsaWMgc2V0TW9kZVByaXZhdGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1tpXSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnQ2hhcnNldCgwLCBERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KDEsIERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMiwgREVGQVVMVF9DSEFSU0VUKTtcbiAgICAgICAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnQ2hhcnNldCgzLCBERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgIC8vIHNldCBWVDEwMCBtb2RlIGhlcmVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERFQ0NPTE0gLSAxMzIgY29sdW1uIG1vZGUuXG4gICAgICAgICAgICogVGhpcyBpcyBvbmx5IGFjdGl2ZSBpZiAnU2V0V2luTGluZXMnICgyNCkgaXMgZW5hYmxlZFxuICAgICAgICAgICAqIHRocm91Z2ggYG9wdGlvbnMud2luZG93c09wdGlvbnNgLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd09wdGlvbnMuc2V0V2luTGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UucmVzaXplKDEzMiwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKTtcbiAgICAgICAgICAgIHRoaXMuX29uUmVxdWVzdFJlc2V0LmZpcmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRDdXJzb3IoMCwgMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMud3JhcGFyb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JCbGluayA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnJldmVyc2VXcmFwYXJvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2NjpcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdTZXJpYWwgcG9ydCByZXF1ZXN0ZWQgYXBwbGljYXRpb24ga2V5cGFkLicpO1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbktleXBhZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTogLy8gWDEwIE1vdXNlXG4gICAgICAgICAgLy8gbm8gcmVsZWFzZSwgbm8gbW90aW9uLCBubyB3aGVlbCwgbm8gbW9kaWZpZXJzLlxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSAnWDEwJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDAwOiAvLyB2dDIwMCBtb3VzZVxuICAgICAgICAgIC8vIG5vIG1vdGlvbi5cbiAgICAgICAgICB0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sID0gJ1ZUMjAwJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDAyOiAvLyBidXR0b24gZXZlbnQgbW91c2VcbiAgICAgICAgICB0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sID0gJ0RSQUcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDM6IC8vIGFueSBldmVudCBtb3VzZVxuICAgICAgICAgIC8vIGFueSBldmVudCAtIHNlbmRzIG1vdGlvbiBldmVudHMsXG4gICAgICAgICAgLy8gZXZlbiBpZiB0aGVyZSBpcyBubyBidXR0b24gaGVsZCBkb3duLlxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSAnQU5ZJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDA0OiAvLyBzZW5kIGZvY3VzaW4vZm9jdXNvdXQgZXZlbnRzXG4gICAgICAgICAgLy8gZm9jdXNpbjogXltbSVxuICAgICAgICAgIC8vIGZvY3Vzb3V0OiBeW1tPXG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnNlbmRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0U2VuZEZvY3VzLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDA1OiAvLyB1dGY4IGV4dCBtb2RlIG1vdXNlIC0gcmVtb3ZlZCBpbiAjMjUwN1xuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ0RFQ1NFVCAxMDA1IG5vdCBzdXBwb3J0ZWQgKHNlZSAjMjUwNyknKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDA2OiAvLyBzZ3IgZXh0IG1vZGUgbW91c2VcbiAgICAgICAgICB0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZUVuY29kaW5nID0gJ1NHUic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAxNTogLy8gdXJ4dnQgZXh0IG1vZGUgbW91c2UgLSByZW1vdmVkIGluICMyNTA3XG4gICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnREVDU0VUIDEwMTUgbm90IHN1cHBvcnRlZCAoc2VlICMyNTA3KScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMTY6IC8vIHNnciBwaXhlbHMgbW9kZSBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlRW5jb2RpbmcgPSAnU0dSX1BJWEVMUyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjU6IC8vIHNob3cgY3Vyc29yXG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDQ4OiAvLyBhbHQgc2NyZWVuIGN1cnNvclxuICAgICAgICAgIHRoaXMuc2F2ZUN1cnNvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwNDk6IC8vIGFsdCBzY3JlZW4gYnVmZmVyIGN1cnNvclxuICAgICAgICAgIHRoaXMuc2F2ZUN1cnNvcigpO1xuICAgICAgICAvLyBGQUxMLVRIUk9VR0hcbiAgICAgICAgY2FzZSA0NzogLy8gYWx0IHNjcmVlbiBidWZmZXJcbiAgICAgICAgY2FzZSAxMDQ3OiAvLyBhbHQgc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmF0ZUFsdEJ1ZmZlcih0aGlzLl9lcmFzZUF0dHJEYXRhKCkpO1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmZpcmUoMCwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSk7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjAwNDogLy8gYnJhY2tldGVkIHBhc3RlIG1vZGUgKGh0dHBzOi8vY2lydy5pbi9ibG9nL2JyYWNrZXRlZC1wYXN0ZSlcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDU0kgUG0gbCAgUmVzZXQgTW9kZSAoUk0pLlxuICAgKiAgICAgUHMgPSAyICAtPiBLZXlib2FyZCBBY3Rpb24gTW9kZSAoQU0pLlxuICAgKiAgICAgUHMgPSA0ICAtPiBSZXBsYWNlIE1vZGUgKElSTSkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU2VuZC9yZWNlaXZlIChTUk0pLlxuICAgKiAgICAgUHMgPSAyIDAgIC0+IE5vcm1hbCBMaW5lZmVlZCAoTE5NKS5cbiAgICpcbiAgICogQHZ0OiAjUFtPbmx5IElSTSBpcyBzdXBwb3J0ZWQuXSAgICBDU0kgUk0gICAgXCJSZXNldCBNb2RlXCIgIFwiQ1NJIFBtIGxcIiAgXCJTZXQgdmFyaW91cyB0ZXJtaW5hbCBhdHRyaWJ1dGVzLlwiXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXMgYnkgUk06XG4gICAqXG4gICAqIHwgUGFyYW0gfCBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1cHBvcnQgfFxuICAgKiB8IC0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHxcbiAgICogfCAyICAgICB8IEtleWJvYXJkIEFjdGlvbiBNb2RlIChLQU0pLiBBbHdheXMgb24uIHwgI04gICAgICB8XG4gICAqIHwgNCAgICAgfCBSZXBsYWNlIE1vZGUgKElSTSkuIChkZWZhdWx0KSAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDEyICAgIHwgU2VuZC9yZWNlaXZlIChTUk0pLiBBbHdheXMgb2ZmLiAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAyMCAgICB8IE5vcm1hbCBMaW5lZmVlZCAoTE5NKS4gICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiB3aHkgaXMgTE5NIGNvbW1lbnRlZCBvdXQ/XG4gICAqL1xuICBwdWJsaWMgcmVzZXRNb2RlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbaV0pIHtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLm1vZGVzLmluc2VydE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmNvbnZlcnRFb2wgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJID8gUG0gbFxuICAgKiAgIERFQyBQcml2YXRlIE1vZGUgUmVzZXQgKERFQ1JTVCkuXG4gICAqICAgICBQcyA9IDEgIC0+IE5vcm1hbCBDdXJzb3IgS2V5cyAoREVDQ0tNKS5cbiAgICogICAgIFBzID0gMiAgLT4gRGVzaWduYXRlIFZUNTIgbW9kZSAoREVDQU5NKS5cbiAgICogICAgIFBzID0gMyAgLT4gODAgQ29sdW1uIE1vZGUgKERFQ0NPTE0pLlxuICAgKiAgICAgUHMgPSA0ICAtPiBKdW1wIChGYXN0KSBTY3JvbGwgKERFQ1NDTE0pLlxuICAgKiAgICAgUHMgPSA1ICAtPiBOb3JtYWwgVmlkZW8gKERFQ1NDTk0pLlxuICAgKiAgICAgUHMgPSA2ICAtPiBOb3JtYWwgQ3Vyc29yIE1vZGUgKERFQ09NKS5cbiAgICogICAgIFBzID0gNyAgLT4gTm8gV3JhcGFyb3VuZCBNb2RlIChERUNBV00pLlxuICAgKiAgICAgUHMgPSA4ICAtPiBObyBBdXRvLXJlcGVhdCBLZXlzIChERUNBUk0pLlxuICAgKiAgICAgUHMgPSA5ICAtPiBEb24ndCBzZW5kIE1vdXNlIFggJiBZIG9uIGJ1dHRvbiBwcmVzcy5cbiAgICogICAgIFBzID0gMSAwICAtPiBIaWRlIHRvb2xiYXIgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDIgIC0+IFN0b3AgQmxpbmtpbmcgQ3Vyc29yIChhdHQ2MTApLlxuICAgKiAgICAgUHMgPSAxIDggIC0+IERvbid0IHByaW50IGZvcm0gZmVlZCAoREVDUEZGKS5cbiAgICogICAgIFBzID0gMSA5ICAtPiBMaW1pdCBwcmludCB0byBzY3JvbGxpbmcgcmVnaW9uIChERUNQRVgpLlxuICAgKiAgICAgUHMgPSAyIDUgIC0+IEhpZGUgQ3Vyc29yIChERUNUQ0VNKS5cbiAgICogICAgIFBzID0gMyAwICAtPiBEb24ndCBzaG93IHNjcm9sbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDMgNSAgLT4gRGlzYWJsZSBmb250LXNoaWZ0aW5nIGZ1bmN0aW9ucyAocnh2dCkuXG4gICAqICAgICBQcyA9IDQgMCAgLT4gRGlzYWxsb3cgODAgLT4gMTMyIE1vZGUuXG4gICAqICAgICBQcyA9IDQgMSAgLT4gTm8gbW9yZSgxKSBmaXggKHNlZSBjdXJzZXMgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSA0IDIgIC0+IERpc2FibGUgTmF0aW9uIFJlcGxhY2VtZW50IENoYXJhY3RlciBzZXRzIChERUMtXG4gICAqICAgICBOUkNNKS5cbiAgICogICAgIFBzID0gNCA0ICAtPiBUdXJuIE9mZiBNYXJnaW4gQmVsbC5cbiAgICogICAgIFBzID0gNCA1ICAtPiBObyBSZXZlcnNlLXdyYXBhcm91bmQgTW9kZS5cbiAgICogICAgIFBzID0gNCA2ICAtPiBTdG9wIExvZ2dpbmcuICAoVGhpcyBpcyBub3JtYWxseSBkaXNhYmxlZCBieSBhXG4gICAqICAgICBjb21waWxlLXRpbWUgb3B0aW9uKS5cbiAgICogICAgIFBzID0gNCA3ICAtPiBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIuXG4gICAqICAgICBQcyA9IDYgNiAgLT4gTnVtZXJpYyBrZXlwYWQgKERFQ05LTSkuXG4gICAqICAgICBQcyA9IDYgNyAgLT4gQmFja2Fycm93IGtleSBzZW5kcyBkZWxldGUgKERFQ0JLTSkuXG4gICAqICAgICBQcyA9IDEgMCAwIDAgIC0+IERvbid0IHNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzIGFuZFxuICAgKiAgICAgcmVsZWFzZS4gIFNlZSB0aGUgc2VjdGlvbiBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwIDAgMSAgLT4gRG9uJ3QgdXNlIEhpbGl0ZSBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwIDAgMiAgLT4gRG9uJ3QgdXNlIENlbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAzICAtPiBEb24ndCB1c2UgQWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy5cbiAgICogICAgIFBzID0gMSAwIDAgNCAgLT4gRG9uJ3Qgc2VuZCBGb2N1c0luL0ZvY3VzT3V0IGV2ZW50cy5cbiAgICogICAgIFBzID0gMSAwIDAgNSAgLT4gRGlzYWJsZSBFeHRlbmRlZCBNb3VzZSBNb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgMSAwICAtPiBEb24ndCBzY3JvbGwgdG8gYm90dG9tIG9uIHR0eSBvdXRwdXRcbiAgICogICAgIChyeHZ0KS5cbiAgICogICAgIFBzID0gMSAwIDEgMSAgLT4gRG9uJ3Qgc2Nyb2xsIHRvIGJvdHRvbSBvbiBrZXkgcHJlc3MgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA0ICAtPiBEb24ndCBpbnRlcnByZXQgXCJtZXRhXCIga2V5LiAgKFRoaXMgZGlzYWJsZXNcbiAgICogICAgIHRoZSBlaWdodEJpdElucHV0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNSAgLT4gRGlzYWJsZSBzcGVjaWFsIG1vZGlmaWVycyBmb3IgQWx0IGFuZCBOdW0tXG4gICAqICAgICBMb2NrIGtleXMuICAoVGhpcyBkaXNhYmxlcyB0aGUgbnVtTG9jayByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCAzIDYgIC0+IERvbid0IHNlbmQgRVNDICB3aGVuIE1ldGEgbW9kaWZpZXMgYSBrZXkuXG4gICAqICAgICAoVGhpcyBkaXNhYmxlcyB0aGUgbWV0YVNlbmRzRXNjYXBlIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNyAgLT4gU2VuZCBWVDIyMCBSZW1vdmUgZnJvbSB0aGUgZWRpdGluZy1rZXlwYWRcbiAgICogICAgIERlbGV0ZSBrZXkuXG4gICAqICAgICBQcyA9IDEgMCAzIDkgIC0+IERvbid0IHNlbmQgRVNDICB3aGVuIEFsdCBtb2RpZmllcyBhIGtleS5cbiAgICogICAgIChUaGlzIGRpc2FibGVzIHRoZSBhbHRTZW5kc0VzY2FwZSByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDAgIC0+IERvIG5vdCBrZWVwIHNlbGVjdGlvbiB3aGVuIG5vdCBoaWdobGlnaHRlZC5cbiAgICogICAgIChUaGlzIGRpc2FibGVzIHRoZSBrZWVwU2VsZWN0aW9uIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgMSAgLT4gVXNlIHRoZSBQUklNQVJZIHNlbGVjdGlvbi4gIChUaGlzIGRpc2FibGVzXG4gICAqICAgICB0aGUgc2VsZWN0VG9DbGlwYm9hcmQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAyICAtPiBEaXNhYmxlIFVyZ2VuY3kgd2luZG93IG1hbmFnZXIgaGludCB3aGVuXG4gICAqICAgICBDb250cm9sLUcgaXMgcmVjZWl2ZWQuICAoVGhpcyBkaXNhYmxlcyB0aGUgYmVsbElzVXJnZW50XG4gICAqICAgICByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDMgIC0+IERpc2FibGUgcmFpc2luZyBvZiB0aGUgd2luZG93IHdoZW4gQ29udHJvbC1cbiAgICogICAgIEcgaXMgcmVjZWl2ZWQuICAoVGhpcyBkaXNhYmxlcyB0aGUgcG9wT25CZWxsIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgNyAgLT4gVXNlIE5vcm1hbCBTY3JlZW4gQnVmZmVyLCBjbGVhcmluZyBzY3JlZW5cbiAgICogICAgIGZpcnN0IGlmIGluIHRoZSBBbHRlcm5hdGUgU2NyZWVuLiAgKFRoaXMgbWF5IGJlIGRpc2FibGVkIGJ5XG4gICAqICAgICB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCA4ICAtPiBSZXN0b3JlIGN1cnNvciBhcyBpbiBERUNSQy4gIChUaGlzIG1heSBiZVxuICAgKiAgICAgZGlzYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgOSAgLT4gVXNlIE5vcm1hbCBTY3JlZW4gQnVmZmVyIGFuZCByZXN0b3JlIGN1cnNvclxuICAgKiAgICAgYXMgaW4gREVDUkMuICAoVGhpcyBtYXkgYmUgZGlzYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0XG4gICAqICAgICByZXNvdXJjZSkuICBUaGlzIGNvbWJpbmVzIHRoZSBlZmZlY3RzIG9mIHRoZSAxIDAgNCA3ICBhbmQgMSAwXG4gICAqICAgICA0IDggIG1vZGVzLiAgVXNlIHRoaXMgd2l0aCB0ZXJtaW5mby1iYXNlZCBhcHBsaWNhdGlvbnMgcmF0aGVyXG4gICAqICAgICB0aGFuIHRoZSA0IDcgIG1vZGUuXG4gICAqICAgICBQcyA9IDEgMCA1IDAgIC0+IFJlc2V0IHRlcm1pbmZvL3Rlcm1jYXAgZnVuY3Rpb24ta2V5IG1vZGUuXG4gICAqICAgICBQcyA9IDEgMCA1IDEgIC0+IFJlc2V0IFN1biBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMiAgLT4gUmVzZXQgSFAgZnVuY3Rpb24ta2V5IG1vZGUuXG4gICAqICAgICBQcyA9IDEgMCA1IDMgIC0+IFJlc2V0IFNDTyBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDYgMCAgLT4gUmVzZXQgbGVnYWN5IGtleWJvYXJkIGVtdWxhdGlvbiAoWDExUjYpLlxuICAgKiAgICAgUHMgPSAxIDAgNiAxICAtPiBSZXNldCBrZXlib2FyZCBlbXVsYXRpb24gdG8gU3VuL1BDIHN0eWxlLlxuICAgKiAgICAgUHMgPSAyIDAgMCA0ICAtPiBSZXNldCBicmFja2V0ZWQgcGFzdGUgbW9kZS5cbiAgICpcbiAgICogQHZ0OiAjUFtTZWUgYmVsb3cgZm9yIHN1cHBvcnRlZCBtb2Rlcy5dICAgIENTSSBERUNSU1QgIFwiREVDIFByaXZhdGUgUmVzZXQgTW9kZVwiIFwiQ1NJID8gUG0gbFwiICBcIlJlc2V0IHZhcmlvdXMgdGVybWluYWwgYXR0cmlidXRlcy5cIlxuICAgKiBTdXBwb3J0ZWQgcGFyYW0gdmFsdWVzIGJ5IERFQ1JTVDpcbiAgICpcbiAgICogfCBwYXJhbSB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHxcbiAgICogfCAxICAgICB8IE5vcm1hbCBDdXJzb3IgS2V5cyAoREVDQ0tNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICB8IERlc2lnbmF0ZSBWVDUyIG1vZGUgKERFQ0FOTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAzICAgICB8IDgwIENvbHVtbiBNb2RlIChERUNDT0xNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjQltTd2l0Y2hlcyB0byBvbGQgY29sdW1uIHdpZHRoIGluc3RlYWQgb2YgODAuXSB8XG4gICAqIHwgNiAgICAgfCBOb3JtYWwgQ3Vyc29yIE1vZGUgKERFQ09NKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNyAgICAgfCBObyBXcmFwYXJvdW5kIE1vZGUgKERFQ0FXTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgOCAgICAgfCBObyBBdXRvLXJlcGVhdCBLZXlzIChERUNBUk0pLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgOSAgICAgfCBEb24ndCBzZW5kIE1vdXNlIFggJiBZIG9uIGJ1dHRvbiBwcmVzcy4gICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTIgICAgfCBTdG9wIEJsaW5raW5nIEN1cnNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjUgICAgfCBIaWRlIEN1cnNvciAoREVDVENFTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDUgICAgfCBObyByZXZlcnNlIHdyYXAtYXJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDcgICAgfCBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNjYgICAgfCBOdW1lcmljIGtleXBhZCAoREVDTktNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwMCAgfCBEb24ndCBzZW5kIE1vdXNlIHJlcG9ydHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwMiAgfCBEb24ndCB1c2UgQ2VsbCBNb3Rpb24gTW91c2UgVHJhY2tpbmcuICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwMyAgfCBEb24ndCB1c2UgQWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy4gICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwNCAgfCBEb24ndCBzZW5kIEZvY3VzSW4vRm9jdXNPdXQgZXZlbnRzLiAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAwNSAgfCBEaXNhYmxlIFVURi04IE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMTAwNiAgfCBEaXNhYmxlIFNHUiBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTAxNSAgfCBEaXNhYmxlIHVyeHZ0IE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMTAxNiAgfCBEaXNhYmxlIFNHUi1QaXhlbHMgTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTA0NyAgfCBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIgKGNsZWFyaW5nIHNjcmVlbiBpZiBpbiBhbHQpLiAgIHwgI1kgICAgICB8XG4gICAqIHwgMTA0OCAgfCBSZXN0b3JlIGN1cnNvciBhcyBpbiBERUNSQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTA0OSAgfCBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIgYW5kIHJlc3RvcmUgY3Vyc29yLiAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjAwNCAgfCBSZXNldCBicmFja2V0ZWQgcGFzdGUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiBERUNDT0xNIGlzIGN1cnJlbnRseSBicm9rZW4gKGFscmVhZHkgZml4ZWQgaW4gd2luZG93IG9wdGlvbnMgUFIpXG4gICAqL1xuICBwdWJsaWMgcmVzZXRNb2RlUHJpdmF0ZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoIChwYXJhbXMucGFyYW1zW2ldKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBERUNDT0xNIC0gODAgY29sdW1uIG1vZGUuXG4gICAgICAgICAgICogVGhpcyBpcyBvbmx5IGFjdGl2ZSBpZiAnU2V0V2luTGluZXMnICgyNCkgaXMgZW5hYmxlZFxuICAgICAgICAgICAqIHRocm91Z2ggYG9wdGlvbnMud2luZG93c09wdGlvbnNgLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd09wdGlvbnMuc2V0V2luTGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UucmVzaXplKDgwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVzZXQuZmlyZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9zZXRDdXJzb3IoMCwgMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMud3JhcGFyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY3Vyc29yQmxpbmsgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMucmV2ZXJzZVdyYXBhcm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2NjpcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdTd2l0Y2hpbmcgYmFjayB0byBub3JtYWwga2V5cGFkLicpO1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbktleXBhZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX29uUmVxdWVzdFN5bmNTY3JvbGxCYXIuZmlyZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk6IC8vIFgxMCBNb3VzZVxuICAgICAgICBjYXNlIDEwMDA6IC8vIHZ0MjAwIG1vdXNlXG4gICAgICAgIGNhc2UgMTAwMjogLy8gYnV0dG9uIGV2ZW50IG1vdXNlXG4gICAgICAgIGNhc2UgMTAwMzogLy8gYW55IGV2ZW50IG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCA9ICdOT05FJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDA0OiAvLyBzZW5kIGZvY3VzaW4vZm9jdXNvdXQgZXZlbnRzXG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnNlbmRGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDU6IC8vIHV0ZjggZXh0IG1vZGUgbW91c2UgLSByZW1vdmVkIGluICMyNTA3XG4gICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnREVDUlNUIDEwMDUgbm90IHN1cHBvcnRlZCAoc2VlICMyNTA3KScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDY6IC8vIHNnciBleHQgbW9kZSBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlRW5jb2RpbmcgPSAnREVGQVVMVCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAxNTogLy8gdXJ4dnQgZXh0IG1vZGUgbW91c2UgLSByZW1vdmVkIGluICMyNTA3XG4gICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnREVDUlNUIDEwMTUgbm90IHN1cHBvcnRlZCAoc2VlICMyNTA3KScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMTY6IC8vIHNnciBwaXhlbHMgbW9kZSBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlRW5jb2RpbmcgPSAnREVGQVVMVCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjU6IC8vIGhpZGUgY3Vyc29yXG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwNDg6IC8vIGFsdCBzY3JlZW4gY3Vyc29yXG4gICAgICAgICAgdGhpcy5yZXN0b3JlQ3Vyc29yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA0OTogLy8gYWx0IHNjcmVlbiBidWZmZXIgY3Vyc29yXG4gICAgICAgIC8vIEZBTEwtVEhST1VHSFxuICAgICAgICBjYXNlIDQ3OiAvLyBub3JtYWwgc2NyZWVuIGJ1ZmZlclxuICAgICAgICBjYXNlIDEwNDc6IC8vIG5vcm1hbCBzY3JlZW4gYnVmZmVyIC0gY2xlYXJpbmcgaXQgZmlyc3RcbiAgICAgICAgICAvLyBFbnN1cmUgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGhhcyB0aGUgY29ycmVjdCBidWZmZXJcbiAgICAgICAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZhdGVOb3JtYWxCdWZmZXIoKTtcbiAgICAgICAgICBpZiAocGFyYW1zLnBhcmFtc1tpXSA9PT0gMTA0OSkge1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlQ3Vyc29yKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmZpcmUoMCwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSk7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjAwNDogLy8gYnJhY2tldGVkIHBhc3RlIG1vZGUgKGh0dHBzOi8vY2lydy5pbi9ibG9nL2JyYWNrZXRlZC1wYXN0ZSlcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyAkIHAgUmVxdWVzdCBBTlNJIE1vZGUgKERFQ1JRTSkuXG4gICAqXG4gICAqIFJlcG9ydHMgQ1NJIFBzOyBQbSAkIHkgKERFQ1JQTSksIHdoZXJlIFBzIGlzIHRoZSBtb2RlIG51bWJlciBhcyBpbiBTTS9STSxcbiAgICogYW5kIFBtIGlzIHRoZSBtb2RlIHZhbHVlOlxuICAgKiAgICAwIC0gbm90IHJlY29nbml6ZWRcbiAgICogICAgMSAtIHNldFxuICAgKiAgICAyIC0gcmVzZXRcbiAgICogICAgMyAtIHBlcm1hbmVudGx5IHNldFxuICAgKiAgICA0IC0gcGVybWFuZW50bHkgcmVzZXRcbiAgICpcbiAgICogQHZ0OiAjWSAgQ1NJICAgREVDUlFNICBcIlJlcXVlc3QgTW9kZVwiICBcIkNTSSBQcyAkcFwiICBcIlJlcXVlc3QgbW9kZSBzdGF0ZS5cIlxuICAgKiBSZXR1cm5zIGEgcmVwb3J0IGFzIGBDU0kgUHM7IFBtICQgeWAgKERFQ1JQTSksIHdoZXJlIGBQc2AgaXMgdGhlIG1vZGUgbnVtYmVyIGFzIGluIFNNL1JNXG4gICAqIG9yIERFQ1NFVC9ERUNSU1QsIGFuZCBgUG1gIGlzIHRoZSBtb2RlIHZhbHVlOlxuICAgKiAtIDA6IG5vdCByZWNvZ25pemVkXG4gICAqIC0gMTogc2V0XG4gICAqIC0gMjogcmVzZXRcbiAgICogLSAzOiBwZXJtYW5lbnRseSBzZXRcbiAgICogLSA0OiBwZXJtYW5lbnRseSByZXNldFxuICAgKlxuICAgKiBGb3IgbW9kZXMgbm90IHVuZGVyc3Rvb2QgeHRlcm0uanMgYWx3YXlzIHJldHVybnMgYG5vdFJlY29nbml6ZWRgLiBJbiBnZW5lcmFsIHRoaXMgbWVhbnMsXG4gICAqIHRoYXQgYSBjZXJ0YWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCBhbmQgY2Fubm90IGJlIHVzZWQuXG4gICAqXG4gICAqIE1vZGVzIGNoYW5naW5nIHRoZSBhY3RpdmUgdGVybWluYWwgYnVmZmVyICg0NywgMTA0NywgMTA0OSkgYXJlIG5vdCBzdWJxdWVyaWVkXG4gICAqIGFuZCBvbmx5IHJlcG9ydCwgd2hldGhlciB0aGUgYWx0ZXJuYXRlIGJ1ZmZlciBpcyBzZXQuXG4gICAqXG4gICAqIE1vdXNlIGVuY29kaW5ncyBhbmQgbW91c2UgcHJvdG9jb2xzIGFyZSBoYW5kbGVkIG11dHVhbCBleGNsdXNpdmUsXG4gICAqIHRodXMgb25seSBvbmUgb2YgZWFjaCBvZiB0aG9zZSBjYW4gYmUgc2V0IGF0IGEgZ2l2ZW4gdGltZS5cbiAgICpcbiAgICogVGhlcmUgaXMgYSBjaGFuY2UsIHRoYXQgc29tZSBtb2RlIHJlcG9ydHMgYXJlIG5vdCBmdWxseSBpbiBsaW5lIHdpdGggeHRlcm0uanMnIGJlaGF2aW9yLFxuICAgKiBlLmcuIGlmIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFscmVhZHkgZXhwb3NlcyBhIGNlcnRhaW4gYmVoYXZpb3IuIElmIHlvdSBmaW5kXG4gICAqIGRpc2NyZXBhbmNpZXMgaW4gdGhlIG1vZGUgcmVwb3J0cywgcGxlYXNlIGZpbGUgYSBidWcuXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdE1vZGUocGFyYW1zOiBJUGFyYW1zLCBhbnNpOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gcmV0dXJuIHZhbHVlIGFzIGluIERFQ1JQTVxuICAgIGNvbnN0IGVudW0gViB7XG4gICAgICBOT1RfUkVDT0dOSVpFRCA9IDAsXG4gICAgICBTRVQgPSAxLFxuICAgICAgUkVTRVQgPSAyLFxuICAgICAgUEVSTUFORU5UTFlfU0VUID0gMyxcbiAgICAgIFBFUk1BTkVOVExZX1JFU0VUID0gNFxuICAgIH1cblxuICAgIC8vIGFjY2VzcyBoZWxwZXJzXG4gICAgY29uc3QgZG0gPSB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXM7XG4gICAgY29uc3QgeyBhY3RpdmVQcm90b2NvbDogbW91c2VQcm90b2NvbCwgYWN0aXZlRW5jb2Rpbmc6IG1vdXNlRW5jb2RpbmcgfSA9IHRoaXMuX2NvcmVNb3VzZVNlcnZpY2U7XG4gICAgY29uc3QgY3MgPSB0aGlzLl9jb3JlU2VydmljZTtcbiAgICBjb25zdCB7IGJ1ZmZlcnMsIGNvbHMgfSA9IHRoaXMuX2J1ZmZlclNlcnZpY2U7XG4gICAgY29uc3QgeyBhY3RpdmUsIGFsdCB9ID0gYnVmZmVycztcbiAgICBjb25zdCBvcHRzID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucztcblxuICAgIGNvbnN0IGYgPSAobTogbnVtYmVyLCB2OiBWKTogYm9vbGVhbiA9PiB7XG4gICAgICBjcy50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkVTQ31bJHthbnNpID8gJycgOiAnPyd9JHttfTske3Z9JHlgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgY29uc3QgYjJ2ID0gKHZhbHVlOiBib29sZWFuKTogViA9PiB2YWx1ZSA/IFYuU0VUIDogVi5SRVNFVDtcblxuICAgIGNvbnN0IHAgPSBwYXJhbXMucGFyYW1zWzBdO1xuXG4gICAgaWYgKGFuc2kpIHtcbiAgICAgIGlmIChwID09PSAyKSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1JFU0VUKTtcbiAgICAgIGlmIChwID09PSA0KSByZXR1cm4gZihwLCBiMnYoY3MubW9kZXMuaW5zZXJ0TW9kZSkpO1xuICAgICAgaWYgKHAgPT09IDEyKSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1NFVCk7XG4gICAgICBpZiAocCA9PT0gMjApIHJldHVybiBmKHAsIGIydihvcHRzLmNvbnZlcnRFb2wpKTtcbiAgICAgIHJldHVybiBmKHAsIFYuTk9UX1JFQ09HTklaRUQpO1xuICAgIH1cblxuICAgIGlmIChwID09PSAxKSByZXR1cm4gZihwLCBiMnYoZG0uYXBwbGljYXRpb25DdXJzb3JLZXlzKSk7XG4gICAgaWYgKHAgPT09IDMpIHJldHVybiBmKHAsIG9wdHMud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcyA/IChjb2xzID09PSA4MCA/IFYuUkVTRVQgOiBjb2xzID09PSAxMzIgPyBWLlNFVCA6IFYuTk9UX1JFQ09HTklaRUQpIDogVi5OT1RfUkVDT0dOSVpFRCk7XG4gICAgaWYgKHAgPT09IDYpIHJldHVybiBmKHAsIGIydihkbS5vcmlnaW4pKTtcbiAgICBpZiAocCA9PT0gNykgcmV0dXJuIGYocCwgYjJ2KGRtLndyYXBhcm91bmQpKTtcbiAgICBpZiAocCA9PT0gOCkgcmV0dXJuIGYocCwgVi5QRVJNQU5FTlRMWV9TRVQpO1xuICAgIGlmIChwID09PSA5KSByZXR1cm4gZihwLCBiMnYobW91c2VQcm90b2NvbCA9PT0gJ1gxMCcpKTtcbiAgICBpZiAocCA9PT0gMTIpIHJldHVybiBmKHAsIGIydihvcHRzLmN1cnNvckJsaW5rKSk7XG4gICAgaWYgKHAgPT09IDI1KSByZXR1cm4gZihwLCBiMnYoIWNzLmlzQ3Vyc29ySGlkZGVuKSk7XG4gICAgaWYgKHAgPT09IDQ1KSByZXR1cm4gZihwLCBiMnYoZG0ucmV2ZXJzZVdyYXBhcm91bmQpKTtcbiAgICBpZiAocCA9PT0gNjYpIHJldHVybiBmKHAsIGIydihkbS5hcHBsaWNhdGlvbktleXBhZCkpO1xuICAgIGlmIChwID09PSA2NykgcmV0dXJuIGYocCwgVi5QRVJNQU5FTlRMWV9SRVNFVCk7XG4gICAgaWYgKHAgPT09IDEwMDApIHJldHVybiBmKHAsIGIydihtb3VzZVByb3RvY29sID09PSAnVlQyMDAnKSk7XG4gICAgaWYgKHAgPT09IDEwMDIpIHJldHVybiBmKHAsIGIydihtb3VzZVByb3RvY29sID09PSAnRFJBRycpKTtcbiAgICBpZiAocCA9PT0gMTAwMykgcmV0dXJuIGYocCwgYjJ2KG1vdXNlUHJvdG9jb2wgPT09ICdBTlknKSk7XG4gICAgaWYgKHAgPT09IDEwMDQpIHJldHVybiBmKHAsIGIydihkbS5zZW5kRm9jdXMpKTtcbiAgICBpZiAocCA9PT0gMTAwNSkgcmV0dXJuIGYocCwgVi5QRVJNQU5FTlRMWV9SRVNFVCk7XG4gICAgaWYgKHAgPT09IDEwMDYpIHJldHVybiBmKHAsIGIydihtb3VzZUVuY29kaW5nID09PSAnU0dSJykpO1xuICAgIGlmIChwID09PSAxMDE1KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1JFU0VUKTtcbiAgICBpZiAocCA9PT0gMTAxNikgcmV0dXJuIGYocCwgYjJ2KG1vdXNlRW5jb2RpbmcgPT09ICdTR1JfUElYRUxTJykpO1xuICAgIGlmIChwID09PSAxMDQ4KSByZXR1cm4gZihwLCBWLlNFVCk7IC8vIHh0ZXJtIGFsd2F5cyByZXR1cm5zIFNFVCBoZXJlXG4gICAgaWYgKHAgPT09IDQ3IHx8IHAgPT09IDEwNDcgfHwgcCA9PT0gMTA0OSkgcmV0dXJuIGYocCwgYjJ2KGFjdGl2ZSA9PT0gYWx0KSk7XG4gICAgaWYgKHAgPT09IDIwMDQpIHJldHVybiBmKHAsIGIydihkbS5icmFja2V0ZWRQYXN0ZU1vZGUpKTtcbiAgICByZXR1cm4gZihwLCBWLk5PVF9SRUNPR05JWkVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gd3JpdGUgY29sb3IgaW5mb3JtYXRpb24gcGFja2VkIHdpdGggY29sb3IgbW9kZS5cbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZUF0dHJDb2xvcihjb2xvcjogbnVtYmVyLCBtb2RlOiBudW1iZXIsIGMxOiBudW1iZXIsIGMyOiBudW1iZXIsIGMzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChtb2RlID09PSAyKSB7XG4gICAgICBjb2xvciB8PSBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgIGNvbG9yICY9IH5BdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgY29sb3IgfD0gQXR0cmlidXRlRGF0YS5mcm9tQ29sb3JSR0IoW2MxLCBjMiwgYzNdKTtcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IDUpIHtcbiAgICAgIGNvbG9yICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5QQ09MT1JfTUFTSyk7XG4gICAgICBjb2xvciB8PSBBdHRyaWJ1dGVzLkNNX1AyNTYgfCAoYzEgJiAweGZmKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBleHRyYWN0IGFuZCBhcHBseSBjb2xvciBwYXJhbXMvc3VicGFyYW1zLlxuICAgKiBSZXR1cm5zIGFkdmFuY2UgZm9yIHBhcmFtcyBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX2V4dHJhY3RDb2xvcihwYXJhbXM6IElQYXJhbXMsIHBvczogbnVtYmVyLCBhdHRyOiBJQXR0cmlidXRlRGF0YSk6IG51bWJlciB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtc1xuICAgIC8vIG1lYW5pbmc6IFt0YXJnZXQsIENNLCBpZ24sIHZhbCwgdmFsLCB2YWxdXG4gICAgLy8gUkdCICAgIDogWyAzOC80OCwgIDIsIGlnbiwgICByLCAgIGcsICAgYl1cbiAgICAvLyBQMjU2ICAgOiBbIDM4LzQ4LCAgNSwgaWduLCAgIHYsIGlnbiwgaWduXVxuICAgIGNvbnN0IGFjY3UgPSBbMCwgMCwgLTEsIDAsIDAsIDBdO1xuXG4gICAgLy8gYWxpZ25tZW50IHBsYWNlaG9sZGVyIGZvciBub24gY29sb3Igc3BhY2Ugc2VxdWVuY2VzXG4gICAgbGV0IGNTcGFjZSA9IDA7XG5cbiAgICAvLyByZXR1cm4gYWR2YW5jZSB3ZSB0b29rIGluIHBhcmFtc1xuICAgIGxldCBhZHZhbmNlID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGFjY3VbYWR2YW5jZSArIGNTcGFjZV0gPSBwYXJhbXMucGFyYW1zW3BvcyArIGFkdmFuY2VdO1xuICAgICAgaWYgKHBhcmFtcy5oYXNTdWJQYXJhbXMocG9zICsgYWR2YW5jZSkpIHtcbiAgICAgICAgY29uc3Qgc3VicGFyYW1zID0gcGFyYW1zLmdldFN1YlBhcmFtcyhwb3MgKyBhZHZhbmNlKSE7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChhY2N1WzFdID09PSA1KSB7XG4gICAgICAgICAgICBjU3BhY2UgPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY2N1W2FkdmFuY2UgKyBpICsgMSArIGNTcGFjZV0gPSBzdWJwYXJhbXNbaV07XG4gICAgICAgIH0gd2hpbGUgKCsraSA8IHN1YnBhcmFtcy5sZW5ndGggJiYgaSArIGFkdmFuY2UgKyAxICsgY1NwYWNlIDwgYWNjdS5sZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIGV4aXQgZWFybHkgaWYgY2FuIGRlY2lkZSBjb2xvciBtb2RlIHdpdGggc2VtaWNvbG9uc1xuICAgICAgaWYgKChhY2N1WzFdID09PSA1ICYmIGFkdmFuY2UgKyBjU3BhY2UgPj0gMilcbiAgICAgICAgfHwgKGFjY3VbMV0gPT09IDIgJiYgYWR2YW5jZSArIGNTcGFjZSA+PSA1KSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIG9mZnNldCBjb2xvclNwYWNlIHNsb3QgZm9yIHNlbWljb2xvbiBtb2RlXG4gICAgICBpZiAoYWNjdVsxXSkge1xuICAgICAgICBjU3BhY2UgPSAxO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKCsrYWR2YW5jZSArIHBvcyA8IHBhcmFtcy5sZW5ndGggJiYgYWR2YW5jZSArIGNTcGFjZSA8IGFjY3UubGVuZ3RoKTtcblxuICAgIC8vIHNldCBkZWZhdWx0IHZhbHVlcyB0byAwXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBhY2N1Lmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoYWNjdVtpXSA9PT0gLTEpIHtcbiAgICAgICAgYWNjdVtpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgY29sb3JzXG4gICAgc3dpdGNoIChhY2N1WzBdKSB7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICBhdHRyLmZnID0gdGhpcy5fdXBkYXRlQXR0ckNvbG9yKGF0dHIuZmcsIGFjY3VbMV0sIGFjY3VbM10sIGFjY3VbNF0sIGFjY3VbNV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDg6XG4gICAgICAgIGF0dHIuYmcgPSB0aGlzLl91cGRhdGVBdHRyQ29sb3IoYXR0ci5iZywgYWNjdVsxXSwgYWNjdVszXSwgYWNjdVs0XSwgYWNjdVs1XSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1ODpcbiAgICAgICAgYXR0ci5leHRlbmRlZCA9IGF0dHIuZXh0ZW5kZWQuY2xvbmUoKTtcbiAgICAgICAgYXR0ci5leHRlbmRlZC51bmRlcmxpbmVDb2xvciA9IHRoaXMuX3VwZGF0ZUF0dHJDb2xvcihhdHRyLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yLCBhY2N1WzFdLCBhY2N1WzNdLCBhY2N1WzRdLCBhY2N1WzVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWR2YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTR1IgNCBzdWJwYXJhbXM6XG4gICAqICAgIDQ6MCAgIC0gICBlcXVhbCB0byBTR1IgMjQgKHR1cm4gb2ZmIGFsbCB1bmRlcmxpbmUpXG4gICAqICAgIDQ6MSAgIC0gICBlcXVhbCB0byBTR1IgNCAoc2luZ2xlIHVuZGVybGluZSlcbiAgICogICAgNDoyICAgLSAgIGVxdWFsIHRvIFNHUiAyMSAoZG91YmxlIHVuZGVybGluZSlcbiAgICogICAgNDozICAgLSAgIGN1cmx5IHVuZGVybGluZVxuICAgKiAgICA0OjQgICAtICAgZG90dGVkIHVuZGVybGluZVxuICAgKiAgICA0OjUgICAtICAgZGFzaGVkIHVuZGVybGluZVxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc1VuZGVybGluZShzdHlsZTogbnVtYmVyLCBhdHRyOiBJQXR0cmlidXRlRGF0YSk6IHZvaWQge1xuICAgIC8vIHRyZWF0IGV4dGVuZGVkIGF0dHJzIGFzIGltbXV0YWJsZSwgdGh1cyBhbHdheXMgY2xvbmUgZnJvbSBvbGQgb25lXG4gICAgLy8gdGhpcyBpcyBuZWVkZWQgc2luY2UgdGhlIGJ1ZmZlciBvbmx5IGhvbGRzIHJlZmVyZW5jZXMgdG8gaXRcbiAgICBhdHRyLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZC5jbG9uZSgpO1xuXG4gICAgLy8gZGVmYXVsdCB0byAxID09IHNpbmdsZSB1bmRlcmxpbmVcbiAgICBpZiAoIX5zdHlsZSB8fCBzdHlsZSA+IDUpIHtcbiAgICAgIHN0eWxlID0gMTtcbiAgICB9XG4gICAgYXR0ci5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA9IHN0eWxlO1xuICAgIGF0dHIuZmcgfD0gRmdGbGFncy5VTkRFUkxJTkU7XG5cbiAgICAvLyAwIGRlYWN0aXZhdGVzIHVuZGVybGluZVxuICAgIGlmIChzdHlsZSA9PT0gMCkge1xuICAgICAgYXR0ci5mZyAmPSB+RmdGbGFncy5VTkRFUkxJTkU7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIEhBU19FWFRFTkRFRCBpbiBCR1xuICAgIGF0dHIudXBkYXRlRXh0ZW5kZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NTR1IwKGF0dHI6IElBdHRyaWJ1dGVEYXRhKTogdm9pZCB7XG4gICAgYXR0ci5mZyA9IERFRkFVTFRfQVRUUl9EQVRBLmZnO1xuICAgIGF0dHIuYmcgPSBERUZBVUxUX0FUVFJfREFUQS5iZztcbiAgICBhdHRyLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZC5jbG9uZSgpO1xuICAgIC8vIFJlc2V0IHVuZGVybGluZSBzdHlsZSBhbmQgY29sb3IuIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJlc2V0IG90aGVyXG4gICAgLy8gZmllbGRzIHN1Y2ggYXMgdGhlIHVybCBpZC5cbiAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlID0gVW5kZXJsaW5lU3R5bGUuTk9ORTtcbiAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgYXR0ci51cGRhdGVFeHRlbmRlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQbSBtICBDaGFyYWN0ZXIgQXR0cmlidXRlcyAoU0dSKS5cbiAgICpcbiAgICogQHZ0OiAjUFtTZWUgYmVsb3cgZm9yIHN1cHBvcnRlZCBhdHRyaWJ1dGVzLl0gICAgQ1NJIFNHUiAgIFwiU2VsZWN0IEdyYXBoaWMgUmVuZGl0aW9uXCIgIFwiQ1NJIFBtIG1cIiAgXCJTZXQvUmVzZXQgdmFyaW91cyB0ZXh0IGF0dHJpYnV0ZXMuXCJcbiAgICogU0dSIHNlbGVjdHMgb25lIG9yIG1vcmUgY2hhcmFjdGVyIGF0dHJpYnV0ZXMgYXQgdGhlIHNhbWUgdGltZS4gTXVsdGlwbGUgcGFyYW1zICh1cCB0byAzMilcbiAgICogYXJlIGFwcGxpZWQgaW4gb3JkZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBUaGUgY2hhbmdlZCBhdHRyaWJ1dGVzIGFyZSBhcHBsaWVkIHRvIGFsbCBuZXdcbiAgICogY2hhcmFjdGVycyByZWNlaXZlZC4gSWYgeW91IG1vdmUgY2hhcmFjdGVycyBpbiB0aGUgdmlld3BvcnQgYnkgc2Nyb2xsaW5nIG9yIGFueSBvdGhlciBtZWFucyxcbiAgICogdGhlbiB0aGUgYXR0cmlidXRlcyBtb3ZlIHdpdGggdGhlIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXMgYnkgU0dSOlxuICAgKlxuICAgKiB8IFBhcmFtICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3VwcG9ydCB8XG4gICAqIHwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHxcbiAgICogfCAwICAgICAgICAgfCBOb3JtYWwgKGRlZmF1bHQpLiBSZXNldHMgYW55IG90aGVyIHByZWNlZGluZyBTR1IuICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDEgICAgICAgICB8IEJvbGQuIChhbHNvIHNlZSBgb3B0aW9ucy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9yc2ApICAgIHwgI1kgICAgICB8XG4gICAqIHwgMiAgICAgICAgIHwgRmFpbnQsIGRlY3JlYXNlZCBpbnRlbnNpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzICAgICAgICAgfCBJdGFsaWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQgICAgICAgICB8IFVuZGVybGluZWQgKHNlZSBiZWxvdyBmb3Igc3R5bGUgc3VwcG9ydCkuICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNSAgICAgICAgIHwgU2xvd2x5IGJsaW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCA2ICAgICAgICAgfCBSYXBpZGx5IGJsaW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDcgICAgICAgICB8IEludmVyc2UuIEZsaXBzIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3IuICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgOCAgICAgICAgIHwgSW52aXNpYmxlIChoaWRkZW4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA5ICAgICAgICAgfCBDcm9zc2VkLW91dCBjaGFyYWN0ZXJzIChzdHJpa2V0aHJvdWdoKS4gICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDIxICAgICAgICB8IERvdWJseSB1bmRlcmxpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjIgICAgICAgIHwgTm9ybWFsIChuZWl0aGVyIGJvbGQgbm9yIGZhaW50KS4gICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyMyAgICAgICAgfCBObyBpdGFsaWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDI0ICAgICAgICB8IE5vdCB1bmRlcmxpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjUgICAgICAgIHwgU3RlYWR5IChub3QgYmxpbmtpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNyAgICAgICAgfCBQb3NpdGl2ZSAobm90IGludmVyc2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDI4ICAgICAgICB8IFZpc2libGUgKG5vdCBoaWRkZW4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjkgICAgICAgIHwgTm90IENyb3NzZWQtb3V0IChzdHJpa2V0aHJvdWdoKS4gICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzMCAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBCbGFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMxICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IFJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzIgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogR3JlZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzMyAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBZZWxsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDM0ICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IEJsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzUgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogTWFnZW50YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzNiAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBDeWFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDM3ICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IFdoaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzggICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogRXh0ZW5kZWQgY29sb3IuICAgICAgICAgICAgICAgICAgICAgICAgfCAjUFtTdXBwb3J0IGZvciBSR0IgYW5kIGluZGV4ZWQgY29sb3JzLCBzZWUgYmVsb3cuXSB8XG4gICAqIHwgMzkgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogRGVmYXVsdCAob3JpZ2luYWwpLiAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0MCAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBCbGFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQxICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IFJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDIgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogR3JlZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0MyAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBZZWxsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQ0ICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IEJsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDUgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogTWFnZW50YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NiAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBDeWFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQ3ICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IFdoaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDggICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogRXh0ZW5kZWQgY29sb3IuICAgICAgICAgICAgICAgICAgICAgICAgfCAjUFtTdXBwb3J0IGZvciBSR0IgYW5kIGluZGV4ZWQgY29sb3JzLCBzZWUgYmVsb3cuXSB8XG4gICAqIHwgNDkgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogRGVmYXVsdCAob3JpZ2luYWwpLiAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1MyAgICAgICAgfCBPdmVybGluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDU1ICAgICAgICB8IE5vdCBPdmVybGluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNTggICAgICAgIHwgVW5kZXJsaW5lIGNvbG9yOiBFeHRlbmRlZCBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICAgfCAjUFtTdXBwb3J0IGZvciBSR0IgYW5kIGluZGV4ZWQgY29sb3JzLCBzZWUgYmVsb3cuXSB8XG4gICAqIHwgOTAgLSA5NyAgIHwgQnJpZ2h0IGZvcmVncm91bmQgY29sb3IgKGFuYWxvZ291cyB0byAzMCAtIDM3KS4gICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAgLSAxMDcgfCBCcmlnaHQgYmFja2dyb3VuZCBjb2xvciAoYW5hbG9nb3VzIHRvIDQwIC0gNDcpLiAgICAgICAgICB8ICNZICAgICAgfFxuICAgKlxuICAgKiBVbmRlcmxpbmUgc3VwcG9ydHMgc3VicGFyYW1zIHRvIGRlbm90ZSB0aGUgc3R5bGUgaW4gdGhlIGZvcm0gYDQgOiB4YDpcbiAgICpcbiAgICogfCB4ICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3VwcG9ydCB8XG4gICAqIHwgLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDAgICAgICB8IE5vIHVuZGVybGluZS4gU2FtZSBhcyBgU0dSIDI0IG1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxICAgICAgfCBTaW5nbGUgdW5kZXJsaW5lLiBTYW1lIGFzIGBTR1IgNCBtYC4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMiAgICAgIHwgRG91YmxlIHVuZGVybGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMgICAgICB8IEN1cmx5IHVuZGVybGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0ICAgICAgfCBEb3R0ZWQgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNSAgICAgIHwgRGFzaGVkIHVuZGVybGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IG90aGVyICB8IFNpbmdsZSB1bmRlcmxpbmUuIFNhbWUgYXMgYFNHUiA0IG1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICogRXh0ZW5kZWQgY29sb3JzIGFyZSBzdXBwb3J0ZWQgZm9yIGZvcmVncm91bmQgKFBzPTM4KSwgYmFja2dyb3VuZCAoUHM9NDgpIGFuZCB1bmRlcmxpbmUgKFBzPTU4KVxuICAgKiBhcyBmb2xsb3dzOlxuICAgKlxuICAgKiB8IFBzICsgMSB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8XG4gICAqIHwgMCAgICAgIHwgSW1wbGVtZW50YXRpb24gZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDEgICAgICB8IFRyYW5zcGFyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAyICAgICAgfCBSR0IgY29sb3IgYXMgYFBzIDsgMiA7IFIgOyBHIDsgQmAgb3IgYFBzIDogMiA6IDogUiA6IEcgOiBCYC4gIHwgI1kgICAgICB8XG4gICAqIHwgMyAgICAgIHwgQ01ZIGNvbG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDQgICAgICB8IENNWUsgY29sb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCA1ICAgICAgfCBJbmRleGVkICgyNTYgY29sb3JzKSBhcyBgUHMgOyA1IDsgSU5ERVhgIG9yIGBQcyA6IDUgOiBJTkRFWGAuIHwgI1kgICAgICB8XG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiBibGlua2luZyBpcyBpbXBsZW1lbnRlZCBpbiBhdHRycywgYnV0IG5vdCB3b3JraW5nIGluIHJlbmRlcmVycz9cbiAgICogRklYTUU6IHJlbW92ZSBkZWFkIGJyYW5jaCBmb3IgcD0xMDBcbiAgICovXG4gIHB1YmxpYyBjaGFyQXR0cmlidXRlcyhwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICAvLyBPcHRpbWl6ZSBhIHNpbmdsZSBTR1IwLlxuICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAxICYmIHBhcmFtcy5wYXJhbXNbMF0gPT09IDApIHtcbiAgICAgIHRoaXMuX3Byb2Nlc3NTR1IwKHRoaXMuX2N1ckF0dHJEYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGwgPSBwYXJhbXMubGVuZ3RoO1xuICAgIGxldCBwO1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLl9jdXJBdHRyRGF0YTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICBwID0gcGFyYW1zLnBhcmFtc1tpXTtcbiAgICAgIGlmIChwID49IDMwICYmIHAgPD0gMzcpIHtcbiAgICAgICAgLy8gZmcgY29sb3IgOFxuICAgICAgICBhdHRyLmZnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5QQ09MT1JfTUFTSyk7XG4gICAgICAgIGF0dHIuZmcgfD0gQXR0cmlidXRlcy5DTV9QMTYgfCAocCAtIDMwKTtcbiAgICAgIH0gZWxzZSBpZiAocCA+PSA0MCAmJiBwIDw9IDQ3KSB7XG4gICAgICAgIC8vIGJnIGNvbG9yIDhcbiAgICAgICAgYXR0ci5iZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUENPTE9SX01BU0spO1xuICAgICAgICBhdHRyLmJnIHw9IEF0dHJpYnV0ZXMuQ01fUDE2IHwgKHAgLSA0MCk7XG4gICAgICB9IGVsc2UgaWYgKHAgPj0gOTAgJiYgcCA8PSA5Nykge1xuICAgICAgICAvLyBmZyBjb2xvciAxNlxuICAgICAgICBhdHRyLmZnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5QQ09MT1JfTUFTSyk7XG4gICAgICAgIGF0dHIuZmcgfD0gQXR0cmlidXRlcy5DTV9QMTYgfCAocCAtIDkwKSB8IDg7XG4gICAgICB9IGVsc2UgaWYgKHAgPj0gMTAwICYmIHAgPD0gMTA3KSB7XG4gICAgICAgIC8vIGJnIGNvbG9yIDE2XG4gICAgICAgIGF0dHIuYmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgICAgYXR0ci5iZyB8PSBBdHRyaWJ1dGVzLkNNX1AxNiB8IChwIC0gMTAwKSB8IDg7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDApIHtcbiAgICAgICAgLy8gZGVmYXVsdFxuICAgICAgICB0aGlzLl9wcm9jZXNzU0dSMChhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMSkge1xuICAgICAgICAvLyBib2xkIHRleHRcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLkJPTEQ7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDMpIHtcbiAgICAgICAgLy8gaXRhbGljIHRleHRcbiAgICAgICAgYXR0ci5iZyB8PSBCZ0ZsYWdzLklUQUxJQztcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gNCkge1xuICAgICAgICAvLyB1bmRlcmxpbmVkIHRleHRcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLlVOREVSTElORTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1VuZGVybGluZShwYXJhbXMuaGFzU3ViUGFyYW1zKGkpID8gcGFyYW1zLmdldFN1YlBhcmFtcyhpKSFbMF0gOiBVbmRlcmxpbmVTdHlsZS5TSU5HTEUsIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA1KSB7XG4gICAgICAgIC8vIGJsaW5rXG4gICAgICAgIGF0dHIuZmcgfD0gRmdGbGFncy5CTElOSztcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gNykge1xuICAgICAgICAvLyBpbnZlcnNlIGFuZCBwb3NpdGl2ZVxuICAgICAgICAvLyB0ZXN0IHdpdGg6IGVjaG8gLWUgJ1xcZVszMW1cXGVbNDJtaGVsbG9cXGVbN213b3JsZFxcZVsyN21oaVxcZVttJ1xuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuSU5WRVJTRTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gOCkge1xuICAgICAgICAvLyBpbnZpc2libGVcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLklOVklTSUJMRTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gOSkge1xuICAgICAgICAvLyBzdHJpa2V0aHJvdWdoXG4gICAgICAgIGF0dHIuZmcgfD0gRmdGbGFncy5TVFJJS0VUSFJPVUdIO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyKSB7XG4gICAgICAgIC8vIGRpbW1lZCB0ZXh0XG4gICAgICAgIGF0dHIuYmcgfD0gQmdGbGFncy5ESU07XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDIxKSB7XG4gICAgICAgIC8vIGRvdWJsZSB1bmRlcmxpbmVcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1VuZGVybGluZShVbmRlcmxpbmVTdHlsZS5ET1VCTEUsIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyMikge1xuICAgICAgICAvLyBub3QgYm9sZCBub3IgZmFpbnRcbiAgICAgICAgYXR0ci5mZyAmPSB+RmdGbGFncy5CT0xEO1xuICAgICAgICBhdHRyLmJnICY9IH5CZ0ZsYWdzLkRJTTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjMpIHtcbiAgICAgICAgLy8gbm90IGl0YWxpY1xuICAgICAgICBhdHRyLmJnICY9IH5CZ0ZsYWdzLklUQUxJQztcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjQpIHtcbiAgICAgICAgLy8gbm90IHVuZGVybGluZWRcbiAgICAgICAgYXR0ci5mZyAmPSB+RmdGbGFncy5VTkRFUkxJTkU7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NVbmRlcmxpbmUoVW5kZXJsaW5lU3R5bGUuTk9ORSwgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDI1KSB7XG4gICAgICAgIC8vIG5vdCBibGlua1xuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLkJMSU5LO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyNykge1xuICAgICAgICAvLyBub3QgaW52ZXJzZVxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLklOVkVSU0U7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDI4KSB7XG4gICAgICAgIC8vIG5vdCBpbnZpc2libGVcbiAgICAgICAgYXR0ci5mZyAmPSB+RmdGbGFncy5JTlZJU0lCTEU7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDI5KSB7XG4gICAgICAgIC8vIG5vdCBzdHJpa2V0aHJvdWdoXG4gICAgICAgIGF0dHIuZmcgJj0gfkZnRmxhZ3MuU1RSSUtFVEhST1VHSDtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMzkpIHtcbiAgICAgICAgLy8gcmVzZXQgZmdcbiAgICAgICAgYXR0ci5mZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICBhdHRyLmZnIHw9IERFRkFVTFRfQVRUUl9EQVRBLmZnICYgKEF0dHJpYnV0ZXMuUENPTE9SX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gNDkpIHtcbiAgICAgICAgLy8gcmVzZXQgYmdcbiAgICAgICAgYXR0ci5iZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICBhdHRyLmJnIHw9IERFRkFVTFRfQVRUUl9EQVRBLmJnICYgKEF0dHJpYnV0ZXMuUENPTE9SX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMzggfHwgcCA9PT0gNDggfHwgcCA9PT0gNTgpIHtcbiAgICAgICAgLy8gZmcgY29sb3IgMjU2IGFuZCBSR0JcbiAgICAgICAgaSArPSB0aGlzLl9leHRyYWN0Q29sb3IocGFyYW1zLCBpLCBhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gNTMpIHtcbiAgICAgICAgLy8gb3ZlcmxpbmVcbiAgICAgICAgYXR0ci5iZyB8PSBCZ0ZsYWdzLk9WRVJMSU5FO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA1NSkge1xuICAgICAgICAvLyBub3Qgb3ZlcmxpbmVcbiAgICAgICAgYXR0ci5iZyAmPSB+QmdGbGFncy5PVkVSTElORTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gNTkpIHtcbiAgICAgICAgYXR0ci5leHRlbmRlZCA9IGF0dHIuZXh0ZW5kZWQuY2xvbmUoKTtcbiAgICAgICAgYXR0ci5leHRlbmRlZC51bmRlcmxpbmVDb2xvciA9IC0xO1xuICAgICAgICBhdHRyLnVwZGF0ZUV4dGVuZGVkKCk7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDEwMCkgeyAvLyBGSVhNRTogZGVhZCBicmFuY2gsIHA9MTAwIGFscmVhZHkgaGFuZGxlZCBhYm92ZSFcbiAgICAgICAgLy8gcmVzZXQgZmcvYmdcbiAgICAgICAgYXR0ci5mZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICBhdHRyLmZnIHw9IERFRkFVTFRfQVRUUl9EQVRBLmZnICYgKEF0dHJpYnV0ZXMuUENPTE9SX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICAgICAgYXR0ci5iZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICBhdHRyLmJnIHw9IERFRkFVTFRfQVRUUl9EQVRBLmJnICYgKEF0dHJpYnV0ZXMuUENPTE9SX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Vua25vd24gU0dSIGF0dHJpYnV0ZTogJWQuJywgcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBuICBEZXZpY2UgU3RhdHVzIFJlcG9ydCAoRFNSKS5cbiAgICogICAgIFBzID0gNSAgLT4gU3RhdHVzIFJlcG9ydC4gIFJlc3VsdCAoYGBPSycnKSBpc1xuICAgKiAgIENTSSAwIG5cbiAgICogICAgIFBzID0gNiAgLT4gUmVwb3J0IEN1cnNvciBQb3NpdGlvbiAoQ1BSKSBbcm93O2NvbHVtbl0uXG4gICAqICAgUmVzdWx0IGlzXG4gICAqICAgQ1NJIHIgOyBjIFJcbiAgICogQ1NJID8gUHMgblxuICAgKiAgIERldmljZSBTdGF0dXMgUmVwb3J0IChEU1IsIERFQy1zcGVjaWZpYykuXG4gICAqICAgICBQcyA9IDYgIC0+IFJlcG9ydCBDdXJzb3IgUG9zaXRpb24gKENQUikgW3Jvdztjb2x1bW5dIGFzIENTSVxuICAgKiAgICAgPyByIDsgYyBSIChhc3N1bWVzIHBhZ2UgaXMgemVybykuXG4gICAqICAgICBQcyA9IDEgNSAgLT4gUmVwb3J0IFByaW50ZXIgc3RhdHVzIGFzIENTSSA/IDEgMCAgbiAgKHJlYWR5KS5cbiAgICogICAgIG9yIENTSSA/IDEgMSAgbiAgKG5vdCByZWFkeSkuXG4gICAqICAgICBQcyA9IDIgNSAgLT4gUmVwb3J0IFVESyBzdGF0dXMgYXMgQ1NJID8gMiAwICBuICAodW5sb2NrZWQpXG4gICAqICAgICBvciBDU0kgPyAyIDEgIG4gIChsb2NrZWQpLlxuICAgKiAgICAgUHMgPSAyIDYgIC0+IFJlcG9ydCBLZXlib2FyZCBzdGF0dXMgYXNcbiAgICogICBDU0kgPyAyIDcgIDsgIDEgIDsgIDAgIDsgIDAgIG4gIChOb3J0aCBBbWVyaWNhbikuXG4gICAqICAgVGhlIGxhc3QgdHdvIHBhcmFtZXRlcnMgYXBwbHkgdG8gVlQ0MDAgJiB1cCwgYW5kIGRlbm90ZSBrZXktXG4gICAqICAgYm9hcmQgcmVhZHkgYW5kIExLMDEgcmVzcGVjdGl2ZWx5LlxuICAgKiAgICAgUHMgPSA1IDMgIC0+IFJlcG9ydCBMb2NhdG9yIHN0YXR1cyBhc1xuICAgKiAgIENTSSA/IDUgMyAgbiAgTG9jYXRvciBhdmFpbGFibGUsIGlmIGNvbXBpbGVkLWluLCBvclxuICAgKiAgIENTSSA/IDUgMCAgbiAgTm8gTG9jYXRvciwgaWYgbm90LlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBEU1IgICBcIkRldmljZSBTdGF0dXMgUmVwb3J0XCIgIFwiQ1NJIFBzIG5cIiAgXCJSZXF1ZXN0IGN1cnNvciBwb3NpdGlvbiAoQ1BSKSB3aXRoIGBQc2AgPSA2LlwiXG4gICAqL1xuICBwdWJsaWMgZGV2aWNlU3RhdHVzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1swXSkge1xuICAgICAgY2FzZSA1OlxuICAgICAgICAvLyBzdGF0dXMgcmVwb3J0XG4gICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVswbmApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgLy8gY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLl9hY3RpdmVCdWZmZXIueSArIDE7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLl9hY3RpdmVCdWZmZXIueCArIDE7XG4gICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVske3l9OyR7eH1SYCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEB2dDogI1BbT25seSBDUFIgaXMgc3VwcG9ydGVkLl0gIENTSSBERUNEU1IgIFwiREVDIERldmljZSBTdGF0dXMgUmVwb3J0XCIgIFwiQ1NJID8gUHMgblwiICBcIk9ubHkgQ1BSIGlzIHN1cHBvcnRlZCAoc2FtZSBhcyBEU1IpLlwiXG4gIHB1YmxpYyBkZXZpY2VTdGF0dXNQcml2YXRlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIC8vIG1vZGVybiB4dGVybSBkb2VzbnQgc2VlbSB0b1xuICAgIC8vIHJlc3BvbmQgdG8gYW55IG9mIHRoZXNlIGV4Y2VwdCA/NiwgNiwgYW5kIDVcbiAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbMF0pIHtcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgLy8gY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLl9hY3RpdmVCdWZmZXIueSArIDE7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLl9hY3RpdmVCdWZmZXIueCArIDE7XG4gICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVs/JHt5fTske3h9UmApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIC8vIG5vIHByaW50ZXJcbiAgICAgICAgLy8gdGhpcy5oYW5kbGVyKEMwLkVTQyArICdbPzExbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjU6XG4gICAgICAgIC8vIGRvbnQgc3VwcG9ydCB1c2VyIGRlZmluZWQga2V5c1xuICAgICAgICAvLyB0aGlzLmhhbmRsZXIoQzAuRVNDICsgJ1s/MjFuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNjpcbiAgICAgICAgLy8gbm9ydGggYW1lcmljYW4ga2V5Ym9hcmRcbiAgICAgICAgLy8gdGhpcy5oYW5kbGVyKEMwLkVTQyArICdbPzI3OzE7MDswbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTM6XG4gICAgICAgIC8vIG5vIGRlYyBsb2NhdG9yL21vdXNlXG4gICAgICAgIC8vIHRoaXMuaGFuZGxlcihDMC5FU0MgKyAnWz81MG4nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSAhIHAgICBTb2Z0IHRlcm1pbmFsIHJlc2V0IChERUNTVFIpLlxuICAgKiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGU0LTEwLmh0bWxcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDU1RSICBcIlNvZnQgVGVybWluYWwgUmVzZXRcIiAgIFwiQ1NJICEgcFwiICAgXCJSZXNldCBzZXZlcmFsIHRlcm1pbmFsIGF0dHJpYnV0ZXMgdG8gaW5pdGlhbCBzdGF0ZS5cIlxuICAgKiBUaGVyZSBhcmUgdHdvIHRlcm1pbmFsIHJlc2V0IHNlcXVlbmNlcyAtIFJJUyBhbmQgREVDU1RSLiBXaGlsZSBSSVMgcGVyZm9ybXMgYWxtb3N0IGEgZnVsbFxuICAgKiB0ZXJtaW5hbCBib290c3RyYXAsIERFQ1NUUiBvbmx5IHJlc2V0cyBjZXJ0YWluIGF0dHJpYnV0ZXMuIEZvciBtb3N0IG5lZWRzIERFQ1NUUiBzaG91bGQgYmVcbiAgICogc3VmZmljaWVudC5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyB0ZXJtaW5hbCBhdHRyaWJ1dGVzIGFyZSByZXNldCB0byBkZWZhdWx0IHZhbHVlczpcbiAgICogLSBJUk0gaXMgcmVzZXQgKGRhZmF1bHQgPSBmYWxzZSlcbiAgICogLSBzY3JvbGwgbWFyZ2lucyBhcmUgcmVzZXQgKGRlZmF1bHQgPSB2aWV3cG9ydCBzaXplKVxuICAgKiAtIGVyYXNlIGF0dHJpYnV0ZXMgYXJlIHJlc2V0IHRvIGRlZmF1bHRcbiAgICogLSBjaGFyc2V0cyBhcmUgcmVzZXRcbiAgICogLSBERUNTQyBkYXRhIGlzIHJlc2V0IHRvIGluaXRpYWwgdmFsdWVzXG4gICAqIC0gREVDT00gaXMgcmVzZXQgdG8gYWJzb2x1dGUgbW9kZVxuICAgKlxuICAgKlxuICAgKiBGSVhNRTogdGhlcmUgYXJlIHNldmVyYWwgbW9yZSBhdHRyaWJ1dGVzIG1pc3NpbmcgKHNlZSBWVDUyMCBtYW51YWwpXG4gICAqL1xuICBwdWJsaWMgc29mdFJlc2V0KHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDE7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEgPSBERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpO1xuICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2UucmVzZXQoKTtcblxuICAgIC8vIHJlc2V0IERFQ1NDIGRhdGFcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRYID0gMDtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRZID0gdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZEN1ckF0dHJEYXRhLmZnID0gdGhpcy5fY3VyQXR0ckRhdGEuZmc7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuYmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5iZztcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0ID0gdGhpcy5fY2hhcnNldFNlcnZpY2UuY2hhcnNldDtcblxuICAgIC8vIHJlc2V0IERFQ09NXG4gICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLm9yaWdpbiA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBTUCBxICBTZXQgY3Vyc29yIHN0eWxlIChERUNTQ1VTUiwgVlQ1MjApLlxuICAgKiAgIFBzID0gMCAgLT4gYmxpbmtpbmcgYmxvY2suXG4gICAqICAgUHMgPSAxICAtPiBibGlua2luZyBibG9jayAoZGVmYXVsdCkuXG4gICAqICAgUHMgPSAyICAtPiBzdGVhZHkgYmxvY2suXG4gICAqICAgUHMgPSAzICAtPiBibGlua2luZyB1bmRlcmxpbmUuXG4gICAqICAgUHMgPSA0ICAtPiBzdGVhZHkgdW5kZXJsaW5lLlxuICAgKiAgIFBzID0gNSAgLT4gYmxpbmtpbmcgYmFyICh4dGVybSkuXG4gICAqICAgUHMgPSA2ICAtPiBzdGVhZHkgYmFyICh4dGVybSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ1NDVVNSICBcIlNldCBDdXJzb3IgU3R5bGVcIiAgXCJDU0kgUHMgU1AgcVwiICAgXCJTZXQgY3Vyc29yIHN0eWxlLlwiXG4gICAqIFN1cHBvcnRlZCBjdXJzb3Igc3R5bGVzOlxuICAgKiAgLSBlbXB0eSwgMCBvciAxOiBzdGVhZHkgYmxvY2tcbiAgICogIC0gMjogYmxpbmsgYmxvY2tcbiAgICogIC0gMzogc3RlYWR5IHVuZGVybGluZVxuICAgKiAgLSA0OiBibGluayB1bmRlcmxpbmVcbiAgICogIC0gNTogc3RlYWR5IGJhclxuICAgKiAgLSA2OiBibGluayBiYXJcbiAgICovXG4gIHB1YmxpYyBzZXRDdXJzb3JTdHlsZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBzd2l0Y2ggKHBhcmFtKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY3Vyc29yU3R5bGUgPSAnYmxvY2snO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JTdHlsZSA9ICd1bmRlcmxpbmUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JTdHlsZSA9ICdiYXInO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgaXNCbGlua2luZyA9IHBhcmFtICUgMiA9PT0gMTtcbiAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvckJsaW5rID0gaXNCbGlua2luZztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgOyBQcyByXG4gICAqICAgU2V0IFNjcm9sbGluZyBSZWdpb24gW3RvcDtib3R0b21dIChkZWZhdWx0ID0gZnVsbCBzaXplIG9mIHdpbi1cbiAgICogICBkb3cpIChERUNTVEJNKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDU1RCTSBcIlNldCBUb3AgYW5kIEJvdHRvbSBNYXJnaW5cIiBcIkNTSSBQcyA7IFBzIHJcIiBcIlNldCB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIG9mIHRoZSB2aWV3cG9ydCBbdG9wO2JvdHRvbV0gKGRlZmF1bHQgPSB2aWV3cG9ydCBzaXplKS5cIlxuICAgKi9cbiAgcHVibGljIHNldFNjcm9sbFJlZ2lvbihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b3AgPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG4gICAgbGV0IGJvdHRvbTogbnVtYmVyO1xuXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPCAyIHx8IChib3R0b20gPSBwYXJhbXMucGFyYW1zWzFdKSA+IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyB8fCBib3R0b20gPT09IDApIHtcbiAgICAgIGJvdHRvbSA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tID4gdG9wKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wID0gdG9wIC0gMTtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gPSBib3R0b20gLSAxO1xuICAgICAgdGhpcy5fc2V0Q3Vyc29yKDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgOyBQcyA7IFBzIHQgLSBWYXJpb3VzIHdpbmRvdyBtYW5pcHVsYXRpb25zIGFuZCByZXBvcnRzICh4dGVybSlcbiAgICpcbiAgICogTm90ZTogT25seSB0aG9zZSBsaXN0ZWQgYmVsb3cgYXJlIHN1cHBvcnRlZC4gQWxsIG90aGVycyBhcmUgbGVmdCB0byBpbnRlZ3JhdG9ycyBhbmRcbiAgICogbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBiYXNlZCBvbiB0aGUgZW1iZWRkaW5nIGVudmlyb25tZW50LlxuICAgKlxuICAgKiAgICBQcyA9IDEgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgICBSZXBvcnQgeHRlcm0gdGV4dCBhcmVhIHNpemUgaW4gcGl4ZWxzLlxuICAgKiAgICAgIFJlc3VsdCBpcyBDU0kgNCA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICogICAgUHMgPSAxNCA7IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGltcGxlbWVudGVkXG4gICAqICAgIFBzID0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICAgIFJlcG9ydCB4dGVybSBjaGFyYWN0ZXIgY2VsbCBzaXplIGluIHBpeGVscy5cbiAgICogICAgICBSZXN1bHQgaXMgQ1NJIDYgOyBoZWlnaHQgOyB3aWR0aCB0XG4gICAqICAgIFBzID0gMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICAgIFJlcG9ydCB0aGUgc2l6ZSBvZiB0aGUgdGV4dCBhcmVhIGluIGNoYXJhY3RlcnMuXG4gICAqICAgICAgUmVzdWx0IGlzIENTSSA4IDsgaGVpZ2h0IDsgd2lkdGggdFxuICAgKiAgICBQcyA9IDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgICBSZXBvcnQgeHRlcm0gd2luZG93J3MgaWNvbiBsYWJlbC5cbiAgICogICAgICBSZXN1bHQgaXMgT1NDIEwgbGFiZWwgU1RcbiAgICogICAgUHMgPSAyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgICAgUmVwb3J0IHh0ZXJtIHdpbmRvdydzIHRpdGxlLlxuICAgKiAgICAgIFJlc3VsdCBpcyBPU0MgbCBsYWJlbCBTVFxuICAgKiAgICBQcyA9IDIyIDsgMCAgLT4gU2F2ZSB4dGVybSBpY29uIGFuZCB3aW5kb3cgdGl0bGUgb24gc3RhY2suICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgUHMgPSAyMiA7IDEgIC0+IFNhdmUgeHRlcm0gaWNvbiB0aXRsZSBvbiBzdGFjay4gICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgIFBzID0gMjIgOyAyICAtPiBTYXZlIHh0ZXJtIHdpbmRvdyB0aXRsZSBvbiBzdGFjay4gICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICBQcyA9IDIzIDsgMCAgLT4gUmVzdG9yZSB4dGVybSBpY29uIGFuZCB3aW5kb3cgdGl0bGUgZnJvbSBzdGFjay4gICBzdXBwb3J0ZWRcbiAgICogICAgUHMgPSAyMyA7IDEgIC0+IFJlc3RvcmUgeHRlcm0gaWNvbiB0aXRsZSBmcm9tIHN0YWNrLiAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgIFBzID0gMjMgOyAyICAtPiBSZXN0b3JlIHh0ZXJtIHdpbmRvdyB0aXRsZSBmcm9tIHN0YWNrLiAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICBQcyA+PSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW1wbGVtZW50ZWRcbiAgICovXG4gIHB1YmxpYyB3aW5kb3dPcHRpb25zKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmICghcGFyYW1Ub1dpbmRvd09wdGlvbihwYXJhbXMucGFyYW1zWzBdLCB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd09wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2Vjb25kID0gKHBhcmFtcy5sZW5ndGggPiAxKSA/IHBhcmFtcy5wYXJhbXNbMV0gOiAwO1xuICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1swXSkge1xuICAgICAgY2FzZSAxNDogIC8vIEdldFdpblNpemVQaXhlbHMsIHJldHVybnMgQ1NJIDQgOyBoZWlnaHQgOyB3aWR0aCB0XG4gICAgICAgIGlmIChzZWNvbmQgIT09IDIpIHtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydC5maXJlKFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfV0lOX1NJWkVfUElYRUxTKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTY6ICAvLyBHZXRDZWxsU2l6ZVBpeGVscywgcmV0dXJucyBDU0kgNiA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICAgICAgdGhpcy5fb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQuZmlyZShXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGUuR0VUX0NFTExfU0laRV9QSVhFTFMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTg6ICAvLyBHZXRXaW5TaXplQ2hhcnMsIHJldHVybnMgQ1NJIDggOyBoZWlnaHQgOyB3aWR0aCB0XG4gICAgICAgIGlmICh0aGlzLl9idWZmZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9Wzg7JHt0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3N9OyR7dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzfXRgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjI6ICAvLyBQdXNoVGl0bGVcbiAgICAgICAgaWYgKHNlY29uZCA9PT0gMCB8fCBzZWNvbmQgPT09IDIpIHtcbiAgICAgICAgICB0aGlzLl93aW5kb3dUaXRsZVN0YWNrLnB1c2godGhpcy5fd2luZG93VGl0bGUpO1xuICAgICAgICAgIGlmICh0aGlzLl93aW5kb3dUaXRsZVN0YWNrLmxlbmd0aCA+IFNUQUNLX0xJTUlUKSB7XG4gICAgICAgICAgICB0aGlzLl93aW5kb3dUaXRsZVN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmQgPT09IDAgfHwgc2Vjb25kID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5faWNvbk5hbWVTdGFjay5wdXNoKHRoaXMuX2ljb25OYW1lKTtcbiAgICAgICAgICBpZiAodGhpcy5faWNvbk5hbWVTdGFjay5sZW5ndGggPiBTVEFDS19MSU1JVCkge1xuICAgICAgICAgICAgdGhpcy5faWNvbk5hbWVTdGFjay5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjM6ICAvLyBQb3BUaXRsZVxuICAgICAgICBpZiAoc2Vjb25kID09PSAwIHx8IHNlY29uZCA9PT0gMikge1xuICAgICAgICAgIGlmICh0aGlzLl93aW5kb3dUaXRsZVN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXRUaXRsZSh0aGlzLl93aW5kb3dUaXRsZVN0YWNrLnBvcCgpISk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmQgPT09IDAgfHwgc2Vjb25kID09PSAxKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2ljb25OYW1lU3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldEljb25OYW1lKHRoaXMuX2ljb25OYW1lU3RhY2sucG9wKCkhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogQ1NJIHNcbiAgICogRVNDIDdcbiAgICogICBTYXZlIGN1cnNvciAoQU5TSS5TWVMpLlxuICAgKlxuICAgKiBAdnQ6ICNQW1RPRE8uLi5dICBDU0kgU0NPU0MgICBcIlNhdmUgQ3Vyc29yXCIgICBcIkNTSSBzXCIgICBcIlNhdmUgY3Vyc29yIHBvc2l0aW9uLCBjaGFybWFwIGFuZCB0ZXh0IGF0dHJpYnV0ZXMuXCJcbiAgICogQHZ0OiAjWSBFU0MgIFNDICAgXCJTYXZlIEN1cnNvclwiICAgXCJFU0MgN1wiICAgXCJTYXZlIGN1cnNvciBwb3NpdGlvbiwgY2hhcm1hcCBhbmQgdGV4dCBhdHRyaWJ1dGVzLlwiXG4gICAqL1xuICBwdWJsaWMgc2F2ZUN1cnNvcihwYXJhbXM/OiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54O1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFkgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5mZyA9IHRoaXMuX2N1ckF0dHJEYXRhLmZnO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZEN1ckF0dHJEYXRhLmJnID0gdGhpcy5fY3VyQXR0ckRhdGEuYmc7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ2hhcnNldCA9IHRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDU0kgdVxuICAgKiBFU0MgOFxuICAgKiAgIFJlc3RvcmUgY3Vyc29yIChBTlNJLlNZUykuXG4gICAqXG4gICAqIEB2dDogI1BbVE9ETy4uLl0gIENTSSBTQ09SQyBcIlJlc3RvcmUgQ3Vyc29yXCIgIFwiQ1NJIHVcIiAgIFwiUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24sIGNoYXJtYXAgYW5kIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKiBAdnQ6ICNZIEVTQyAgUkMgXCJSZXN0b3JlIEN1cnNvclwiICBcIkVTQyA4XCIgICBcIlJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uLCBjaGFybWFwIGFuZCB0ZXh0IGF0dHJpYnV0ZXMuXCJcbiAgICovXG4gIHB1YmxpYyByZXN0b3JlQ3Vyc29yKHBhcmFtcz86IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFggfHwgMDtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueSA9IE1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFkgLSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UsIDApO1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhLmZnID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuZmc7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuYmcgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5iZztcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0ID0gKHRoaXMgYXMgYW55KS5fc2F2ZWRDaGFyc2V0O1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0KSB7XG4gICAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ2hhcnNldDtcbiAgICB9XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE9TQyAyOyA8ZGF0YT4gU1QgKHNldCB3aW5kb3cgdGl0bGUpXG4gICAqICAgUHJveHkgdG8gc2V0IHdpbmRvdyB0aXRsZS5cbiAgICpcbiAgICogQHZ0OiAjUFtJY29uIG5hbWUgaXMgbm90IGV4cG9zZWQuXSAgIE9TQyAgICAwICAgXCJTZXQgV2luZG93cyBUaXRsZSBhbmQgSWNvbiBOYW1lXCIgIFwiT1NDIDAgOyBQdCBCRUxcIiAgXCJTZXQgd2luZG93IHRpdGxlIGFuZCBpY29uIG5hbWUuXCJcbiAgICogSWNvbiBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuIEZvciBXaW5kb3cgVGl0bGUgc2VlIGJlbG93LlxuICAgKlxuICAgKiBAdnQ6ICNZICAgICBPU0MgICAgMiAgIFwiU2V0IFdpbmRvd3MgVGl0bGVcIiAgXCJPU0MgMiA7IFB0IEJFTFwiICBcIlNldCB3aW5kb3cgdGl0bGUuXCJcbiAgICogeHRlcm0uanMgZG9lcyBub3QgbWFuaXB1bGF0ZSB0aGUgdGl0bGUgZGlyZWN0bHksIGluc3RlYWQgZXhwb3NlcyBjaGFuZ2VzIHZpYSB0aGUgZXZlbnRcbiAgICogYFRlcm1pbmFsLm9uVGl0bGVDaGFuZ2VgLlxuICAgKi9cbiAgcHVibGljIHNldFRpdGxlKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3dpbmRvd1RpdGxlID0gZGF0YTtcbiAgICB0aGlzLl9vblRpdGxlQ2hhbmdlLmZpcmUoZGF0YSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDE7IDxkYXRhPiBTVFxuICAgKiBOb3RlOiBJY29uIG5hbWUgaXMgbm90IGV4cG9zZWQuXG4gICAqL1xuICBwdWJsaWMgc2V0SWNvbk5hbWUoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5faWNvbk5hbWUgPSBkYXRhO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyA0OyA8bnVtPiA7IDx0ZXh0PiBTVCAoc2V0IEFOU0kgY29sb3IgPG51bT4gdG8gPHRleHQ+KVxuICAgKlxuICAgKiBAdnQ6ICNZICAgIE9TQyAgICA0ICAgIFwiU2V0IEFOU0kgY29sb3JcIiAgIFwiT1NDIDQgOyBjIDsgc3BlYyBCRUxcIiBcIkNoYW5nZSBjb2xvciBudW1iZXIgYGNgIHRvIHRoZSBjb2xvciBzcGVjaWZpZWQgYnkgYHNwZWNgLlwiXG4gICAqIGBjYCBpcyB0aGUgY29sb3IgaW5kZXggYmV0d2VlbiAwIGFuZCAyNTUuIFRoZSBjb2xvciBmb3JtYXQgb2YgYHNwZWNgIGlzIGRlcml2ZWQgZnJvbVxuICAgKiBgWFBhcnNlQ29sb3JgIChzZWUgT1NDIDEwIGZvciBzdXBwb3J0ZWQgZm9ybWF0cykuIFRoZXJlIG1heSBiZSBtdWx0aXBlIGBjIDsgc3BlY2AgcGFpcnMgcHJlc2VudFxuICAgKiBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gSWYgYHNwZWNgIGNvbnRhaW5zIGA/YCB0aGUgdGVybWluYWwgcmV0dXJucyBhIHNlcXVlbmNlIHdpdGggdGhlXG4gICAqIGN1cnJlbnRseSBzZXQgY29sb3IuXG4gICAqL1xuICBwdWJsaWMgc2V0T3JSZXBvcnRJbmRleGVkQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXZlbnQ6IElDb2xvckV2ZW50ID0gW107XG4gICAgY29uc3Qgc2xvdHMgPSBkYXRhLnNwbGl0KCc7Jyk7XG4gICAgd2hpbGUgKHNsb3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHNsb3RzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgc3BlYyA9IHNsb3RzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKC9eXFxkKyQvLmV4ZWMoaWR4KSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGlkeCk7XG4gICAgICAgIGlmIChpc1ZhbGlkQ29sb3JJbmRleChpbmRleCkpIHtcbiAgICAgICAgICBpZiAoc3BlYyA9PT0gJz8nKSB7XG4gICAgICAgICAgICBldmVudC5wdXNoKHsgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVBPUlQsIGluZGV4IH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHBhcnNlQ29sb3Ioc3BlYyk7XG4gICAgICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHVzaCh7IHR5cGU6IENvbG9yUmVxdWVzdFR5cGUuU0VULCBpbmRleCwgY29sb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShldmVudCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyA4IDsgPHBhcmFtcz4gOyA8dXJpPiBTVCAtIGNyZWF0ZSBoeXBlcmxpbmtcbiAgICogT1NDIDggOyA7IFNUIC0gZmluaXNoIGh5cGVybGlua1xuICAgKlxuICAgKiBUZXN0IGNhc2U6XG4gICAqXG4gICAqIGBgYHNoXG4gICAqIHByaW50ZiAnXFxlXTg7O2h0dHA6Ly9leGFtcGxlLmNvbVxcZVxcXFxUaGlzIGlzIGEgbGlua1xcZV04OztcXGVcXFxcXFxuJ1xuICAgKiBgYGBcbiAgICpcbiAgICogQHZ0OiAjWSAgICBPU0MgICAgOCAgICBcIkNyZWF0ZSBoeXBlcmxpbmtcIiAgIFwiT1NDIDggOyBwYXJhbXMgOyB1cmkgQkVMXCIgXCJDcmVhdGUgYSBoeXBlcmxpbmsgdG8gYHVyaWAgdXNpbmcgYHBhcmFtc2AuXCJcbiAgICogYHVyaWAgaXMgYSBoeXBlcmxpbmsgc3RhcnRpbmcgd2l0aCBgaHR0cDovL2AsIGBodHRwczovL2AsIGBmdHA6Ly9gLCBgZmlsZTovL2Agb3IgYG1haWx0bzovL2AuIGBwYXJhbXNgIGlzIGFuXG4gICAqIG9wdGlvbmFsIGxpc3Qgb2Yga2V5PXZhbHVlIGFzc2lnbm1lbnRzLCBzZXBhcmF0ZWQgYnkgdGhlIDogY2hhcmFjdGVyLlxuICAgKiBFeGFtcGxlOiBgaWQ9eHl6MTIzOmZvbz1iYXI6YmF6PXF1dXhgLlxuICAgKiBDdXJyZW50bHkgb25seSB0aGUgaWQga2V5IGlzIGRlZmluZWQuIENlbGxzIHRoYXQgc2hhcmUgdGhlIHNhbWUgSUQgYW5kIFVSSSBzaGFyZSBob3ZlclxuICAgKiBmZWVkYmFjay4gVXNlIGBPU0MgOCA7IDsgQkVMYCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgaHlwZXJsaW5rLlxuICAgKi9cbiAgcHVibGljIHNldEh5cGVybGluayhkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBhcmdzID0gZGF0YS5zcGxpdCgnOycpO1xuICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFyZ3NbMV0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVIeXBlcmxpbmsoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgfVxuICAgIGlmIChhcmdzWzBdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9maW5pc2hIeXBlcmxpbmsoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUh5cGVybGluayhwYXJhbXM6IHN0cmluZywgdXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJdCdzIGxlZ2FsIHRvIG9wZW4gYSBuZXcgaHlwZXJsaW5rIHdpdGhvdXQgZXhwbGljaXRseSBmaW5pc2hpbmcgdGhlIHByZXZpb3VzIG9uZVxuICAgIGlmICh0aGlzLl9nZXRDdXJyZW50TGlua0lkKCkpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaEh5cGVybGluaygpO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRQYXJhbXMgPSBwYXJhbXMuc3BsaXQoJzonKTtcbiAgICBsZXQgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpZFBhcmFtSW5kZXggPSBwYXJzZWRQYXJhbXMuZmluZEluZGV4KGUgPT4gZS5zdGFydHNXaXRoKCdpZD0nKSk7XG4gICAgaWYgKGlkUGFyYW1JbmRleCAhPT0gLTEpIHtcbiAgICAgIGlkID0gcGFyc2VkUGFyYW1zW2lkUGFyYW1JbmRleF0uc2xpY2UoMykgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZCA9IHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQudXJsSWQgPSB0aGlzLl9vc2NMaW5rU2VydmljZS5yZWdpc3RlckxpbmsoeyBpZCwgdXJpIH0pO1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhLnVwZGF0ZUV4dGVuZGVkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9maW5pc2hIeXBlcmxpbmsoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQgPSB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZC5jbG9uZSgpO1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLnVybElkID0gMDtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS51cGRhdGVFeHRlbmRlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gc3BlY2lhbCBjb2xvcnMgLSBPU0MgMTAgfCAxMSB8IDEyXG4gIHByaXZhdGUgX3NwZWNpYWxDb2xvcnMgPSBbU3BlY2lhbENvbG9ySW5kZXguRk9SRUdST1VORCwgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORCwgU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SXTtcblxuICAvKipcbiAgICogQXBwbHkgY29sb3JzIHJlcXVlc3RzIGZvciBzcGVjaWFsIGNvbG9ycyBpbiBPU0MgMTAgfCAxMSB8IDEyLlxuICAgKiBTaW5jZSB0aGVzZSBjb21tYW5kcyBhcmUgc3RhY2tpbmcgZnJvbSBtdWx0aXBsZSBwYXJhbWV0ZXJzLFxuICAgKiB3ZSBoYW5kbGUgdGhlbSBpbiBhIGxvb3Agd2l0aCBhbiBlbnRyeSBvZmZzZXQgdG8gYF9zcGVjaWFsQ29sb3JzYC5cbiAgICovXG4gIHByaXZhdGUgX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGRhdGE6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzbG90cyA9IGRhdGEuc3BsaXQoJzsnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RzLmxlbmd0aDsgKytpLCArK29mZnNldCkge1xuICAgICAgaWYgKG9mZnNldCA+PSB0aGlzLl9zcGVjaWFsQ29sb3JzLmxlbmd0aCkgYnJlYWs7XG4gICAgICBpZiAoc2xvdHNbaV0gPT09ICc/Jykge1xuICAgICAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVBPUlQsIGluZGV4OiB0aGlzLl9zcGVjaWFsQ29sb3JzW29mZnNldF0gfV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBwYXJzZUNvbG9yKHNsb3RzW2ldKTtcbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgdGhpcy5fb25Db2xvci5maXJlKFt7IHR5cGU6IENvbG9yUmVxdWVzdFR5cGUuU0VULCBpbmRleDogdGhpcy5fc3BlY2lhbENvbG9yc1tvZmZzZXRdLCBjb2xvciB9XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDEwIDsgPHhjb2xvciBuYW1lPnw8Pz4gU1QgLSBzZXQgb3IgcXVlcnkgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDEwICAgIFwiU2V0IG9yIHF1ZXJ5IGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvclwiICAgXCJPU0MgMTAgOyBQdCBCRUxcIiAgXCJTZXQgb3IgcXVlcnkgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yLlwiXG4gICAqIFRvIHNldCB0aGUgY29sb3IsIHRoZSBmb2xsb3dpbmcgY29sb3Igc3BlY2lmaWNhdGlvbiBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ6XG4gICAqIC0gYHJnYjo8cmVkPi88Z3JlZW4+LzxibHVlPmAgZm9yICBgPHJlZD4sIDxncmVlbj4sIDxibHVlPmAgaW4gYGggfCBoaCB8IGhoaCB8IGhoaGhgLCB3aGVyZVxuICAgKiAgIGBoYCBpcyBhIHNpbmdsZSBoZXhhZGVjaW1hbCBkaWdpdCAoY2FzZSBpbnNpZ25pZmljYW50KS4gVGhlIGRpZmZlcmVudCB3aWR0aHMgc2NhbGVcbiAgICogICBmcm9tIDQgYml0IChgaGApIHRvIDE2IGJpdCAoYGhoaGhgKSBhbmQgZ2V0IGNvbnZlcnRlZCB0byA4IGJpdCAoYGhoYCkuXG4gICAqIC0gYCNSR0JgIC0gNCBiaXRzIHBlciBjaGFubmVsLCBleHBhbmRlZCB0byBgI1IwRzBCMGBcbiAgICogLSBgI1JSR0dCQmAgLSA4IGJpdHMgcGVyIGNoYW5uZWxcbiAgICogLSBgI1JSUkdHR0JCQmAgLSAxMiBiaXRzIHBlciBjaGFubmVsLCB0cnVuY2F0ZWQgdG8gYCNSUkdHQkJgXG4gICAqIC0gYCNSUlJSR0dHR0JCQkJgIC0gMTYgYml0cyBwZXIgY2hhbm5lbCwgdHJ1bmNhdGVkIHRvIGAjUlJHR0JCYFxuICAgKlxuICAgKiAqKk5vdGU6KiogWDExIG5hbWVkIGNvbG9ycyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkLlxuICAgKlxuICAgKiBJZiBgUHRgIGNvbnRhaW5zIGA/YCBpbnN0ZWFkIG9mIGEgY29sb3Igc3BlY2lmaWNhdGlvbiwgdGhlIHRlcm1pbmFsXG4gICAqIHJldHVybnMgYSBzZXF1ZW5jZSB3aXRoIHRoZSBjdXJyZW50IGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvclxuICAgKiAodXNlIHRoYXQgc2VxdWVuY2UgdG8gcmVzdG9yZSB0aGUgY29sb3IgYWZ0ZXIgY2hhbmdlcykuXG4gICAqXG4gICAqICoqTm90ZToqKiBPdGhlciB0aGFuIHh0ZXJtLCB4dGVybS5qcyBkb2VzIG5vdCBzdXBwb3J0IE9TQyAxMiAtIDE5LlxuICAgKiBUaGVyZWZvcmUgc3RhY2tpbmcgbXVsdGlwbGUgYFB0YCBzZXBhcmF0ZWQgYnkgYDtgIG9ubHkgd29ya3MgZm9yIHRoZSBmaXJzdCB0d28gZW50cmllcy5cbiAgICovXG4gIHB1YmxpYyBzZXRPclJlcG9ydEZnQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGRhdGEsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMSA7IDx4Y29sb3IgbmFtZT58PD8+IFNUIC0gc2V0IG9yIHF1ZXJ5IGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvclxuICAgKlxuICAgKiBAdnQ6ICNZICBPU0MgICAxMSAgICBcIlNldCBvciBxdWVyeSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3JcIiAgIFwiT1NDIDExIDsgUHQgQkVMXCIgIFwiU2FtZSBhcyBPU0MgMTAsIGJ1dCBmb3IgZGVmYXVsdCBiYWNrZ3JvdW5kLlwiXG4gICAqL1xuICBwdWJsaWMgc2V0T3JSZXBvcnRCZ0NvbG9yKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXRPclJlcG9ydFNwZWNpYWxDb2xvcihkYXRhLCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTIgOyA8eGNvbG9yIG5hbWU+fDw/PiBTVCAtIHNldCBvciBxdWVyeSBkZWZhdWx0IGN1cnNvciBjb2xvclxuICAgKlxuICAgKiBAdnQ6ICNZICBPU0MgICAxMiAgICBcIlNldCBvciBxdWVyeSBkZWZhdWx0IGN1cnNvciBjb2xvclwiICAgXCJPU0MgMTIgOyBQdCBCRUxcIiAgXCJTYW1lIGFzIE9TQyAxMCwgYnV0IGZvciBkZWZhdWx0IGN1cnNvciBjb2xvci5cIlxuICAgKi9cbiAgcHVibGljIHNldE9yUmVwb3J0Q3Vyc29yQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGRhdGEsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMDQgOyA8bnVtPiBTVCAtIHJlc3RvcmUgQU5TSSBjb2xvciA8bnVtPlxuICAgKlxuICAgKiBAdnQ6ICNZICBPU0MgICAxMDQgICAgXCJSZXNldCBBTlNJIGNvbG9yXCIgICBcIk9TQyAxMDQgOyBjIEJFTFwiIFwiUmVzZXQgY29sb3IgbnVtYmVyIGBjYCB0byB0aGVtZWQgY29sb3IuXCJcbiAgICogYGNgIGlzIHRoZSBjb2xvciBpbmRleCBiZXR3ZWVuIDAgYW5kIDI1NS4gVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgZGVmYXVsdCBjb2xvciBmb3IgYGNgIGFzXG4gICAqIHNwZWNpZmllZCBieSB0aGUgbG9hZGVkIHRoZW1lLiBBbnkgbnVtYmVyIG9mIGBjYCBwYXJhbWV0ZXJzIG1heSBiZSBnaXZlbi5cbiAgICogSWYgbm8gcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZSBlbnRpcmUgaW5kZXhlZCBjb2xvciB0YWJsZSB3aWxsIGJlIHJlc2V0LlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVJbmRleGVkQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFIH1dKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBldmVudDogSUNvbG9yRXZlbnQgPSBbXTtcbiAgICBjb25zdCBzbG90cyA9IGRhdGEuc3BsaXQoJzsnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoL15cXGQrJC8uZXhlYyhzbG90c1tpXSkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChzbG90c1tpXSk7XG4gICAgICAgIGlmIChpc1ZhbGlkQ29sb3JJbmRleChpbmRleCkpIHtcbiAgICAgICAgICBldmVudC5wdXNoKHsgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnQubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9vbkNvbG9yLmZpcmUoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTEwIFNUIC0gcmVzdG9yZSBkZWZhdWx0IGZvcmVncm91bmQgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTEwICAgIFwiUmVzdG9yZSBkZWZhdWx0IGZvcmVncm91bmQgY29sb3JcIiAgIFwiT1NDIDExMCBCRUxcIiAgXCJSZXN0b3JlIGRlZmF1bHQgZm9yZWdyb3VuZCB0byB0aGVtZWQgY29sb3IuXCJcbiAgICovXG4gIHB1YmxpYyByZXN0b3JlRmdDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFLCBpbmRleDogU3BlY2lhbENvbG9ySW5kZXguRk9SRUdST1VORCB9XSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDExMSBTVCAtIHJlc3RvcmUgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDExMSAgICBcIlJlc3RvcmUgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yXCIgICBcIk9TQyAxMTEgQkVMXCIgIFwiUmVzdG9yZSBkZWZhdWx0IGJhY2tncm91bmQgdG8gdGhlbWVkIGNvbG9yLlwiXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZUJnQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fb25Db2xvci5maXJlKFt7IHR5cGU6IENvbG9yUmVxdWVzdFR5cGUuUkVTVE9SRSwgaW5kZXg6IFNwZWNpYWxDb2xvckluZGV4LkJBQ0tHUk9VTkQgfV0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMTIgU1QgLSByZXN0b3JlIGRlZmF1bHQgY3Vyc29yIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDExMiAgICBcIlJlc3RvcmUgZGVmYXVsdCBjdXJzb3IgY29sb3JcIiAgIFwiT1NDIDExMiBCRUxcIiAgXCJSZXN0b3JlIGRlZmF1bHQgY3Vyc29yIHRvIHRoZW1lZCBjb2xvci5cIlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVDdXJzb3JDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFLCBpbmRleDogU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SIH1dKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgRVxuICAgKiBDMS5ORUxcbiAgICogICBERUMgbW5lbW9uaWM6IE5FTCAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ORUwpXG4gICAqICAgTW92ZXMgY3Vyc29yIHRvIGZpcnN0IHBvc2l0aW9uIG9uIG5leHQgbGluZS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMxICAgIE5FTCAgIFwiTmV4dCBMaW5lXCIgICBcIlxceDg1XCIgICAgXCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByb3cuXCJcbiAgICogQHZ0OiAjWSAgIEVTQyAgIE5FTCAgIFwiTmV4dCBMaW5lXCIgICBcIkVTQyBFXCIgICBcIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdy5cIlxuICAgKi9cbiAgcHVibGljIG5leHRMaW5lKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDtcbiAgICB0aGlzLmluZGV4KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDID1cbiAgICogICBERUMgbW5lbW9uaWM6IERFQ0tQQU0gKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vREVDS1BBTS5odG1sKVxuICAgKiAgIEVuYWJsZXMgdGhlIG51bWVyaWMga2V5cGFkIHRvIHNlbmQgYXBwbGljYXRpb24gc2VxdWVuY2VzIHRvIHRoZSBob3N0LlxuICAgKi9cbiAgcHVibGljIGtleXBhZEFwcGxpY2F0aW9uTW9kZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdTZXJpYWwgcG9ydCByZXF1ZXN0ZWQgYXBwbGljYXRpb24ga2V5cGFkLicpO1xuICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbktleXBhZCA9IHRydWU7XG4gICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDID5cbiAgICogICBERUMgbW5lbW9uaWM6IERFQ0tQTk0gKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vREVDS1BOTS5odG1sKVxuICAgKiAgIEVuYWJsZXMgdGhlIGtleXBhZCB0byBzZW5kIG51bWVyaWMgY2hhcmFjdGVycyB0byB0aGUgaG9zdC5cbiAgICovXG4gIHB1YmxpYyBrZXlwYWROdW1lcmljTW9kZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdTd2l0Y2hpbmcgYmFjayB0byBub3JtYWwga2V5cGFkLicpO1xuICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbktleXBhZCA9IGZhbHNlO1xuICAgIHRoaXMuX29uUmVxdWVzdFN5bmNTY3JvbGxCYXIuZmlyZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyAlIEBcbiAgICogRVNDICUgR1xuICAgKiAgIFNlbGVjdCBkZWZhdWx0IGNoYXJhY3RlciBzZXQuIFVURi04IGlzIG5vdCBzdXBwb3J0ZWQgKHN0cmluZyBhcmUgdW5pY29kZSBhbnl3YXlzKVxuICAgKiAgIHRoZXJlZm9yZSBFU0MgJSBHIGRvZXMgdGhlIHNhbWUuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0RGVmYXVsdENoYXJzZXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKDApO1xuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KDAsIERFRkFVTFRfQ0hBUlNFVCk7IC8vIFVTIChkZWZhdWx0KVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyAoIENcbiAgICogICBEZXNpZ25hdGUgRzAgQ2hhcmFjdGVyIFNldCwgVlQxMDAsIElTTyAyMDIyLlxuICAgKiBFU0MgKSBDXG4gICAqICAgRGVzaWduYXRlIEcxIENoYXJhY3RlciBTZXQgKElTTyAyMDIyLCBWVDEwMCkuXG4gICAqIEVTQyAqIENcbiAgICogICBEZXNpZ25hdGUgRzIgQ2hhcmFjdGVyIFNldCAoSVNPIDIwMjIsIFZUMjIwKS5cbiAgICogRVNDICsgQ1xuICAgKiAgIERlc2lnbmF0ZSBHMyBDaGFyYWN0ZXIgU2V0IChJU08gMjAyMiwgVlQyMjApLlxuICAgKiBFU0MgLSBDXG4gICAqICAgRGVzaWduYXRlIEcxIENoYXJhY3RlciBTZXQgKFZUMzAwKS5cbiAgICogRVNDIC4gQ1xuICAgKiAgIERlc2lnbmF0ZSBHMiBDaGFyYWN0ZXIgU2V0IChWVDMwMCkuXG4gICAqIEVTQyAvIENcbiAgICogICBEZXNpZ25hdGUgRzMgQ2hhcmFjdGVyIFNldCAoVlQzMDApLiBDID0gQSAgLT4gSVNPIExhdGluLTEgU3VwcGxlbWVudGFsLiAtIFN1cHBvcnRlZD9cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RDaGFyc2V0KGNvbGxlY3RBbmRGbGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoY29sbGVjdEFuZEZsYWcubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aGlzLnNlbGVjdERlZmF1bHRDaGFyc2V0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbGxlY3RBbmRGbGFnWzBdID09PSAnLycpIHtcbiAgICAgIHJldHVybiB0cnVlOyAgLy8gVE9ETzogSXMgdGhpcyBzdXBwb3J0ZWQ/XG4gICAgfVxuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KEdMRVZFTFtjb2xsZWN0QW5kRmxhZ1swXV0sIENIQVJTRVRTW2NvbGxlY3RBbmRGbGFnWzFdXSB8fCBERUZBVUxUX0NIQVJTRVQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBEXG4gICAqIEMxLklORFxuICAgKiAgIERFQyBtbmVtb25pYzogSU5EIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0lORC5odG1sKVxuICAgKiAgIE1vdmVzIHRoZSBjdXJzb3IgZG93biBvbmUgbGluZSBpbiB0aGUgc2FtZSBjb2x1bW4uXG4gICAqXG4gICAqIEB2dDogI1kgICBDMSAgICBJTkQgICBcIkluZGV4XCIgICBcIlxceDg0XCIgICAgXCJNb3ZlIHRoZSBjdXJzb3Igb25lIGxpbmUgZG93biBzY3JvbGxpbmcgaWYgbmVlZGVkLlwiXG4gICAqIEB2dDogI1kgICBFU0MgICBJTkQgICBcIkluZGV4XCIgICBcIkVTQyBEXCIgICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgbGluZSBkb3duIHNjcm9sbGluZyBpZiBuZWVkZWQuXCJcbiAgICovXG4gIHB1YmxpYyBpbmRleCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55Kys7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID09PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tICsgMSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnktLTtcbiAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2Uuc2Nyb2xsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMTtcbiAgICB9XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgSFxuICAgKiBDMS5IVFNcbiAgICogICBERUMgbW5lbW9uaWM6IEhUUyAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9IVFMuaHRtbClcbiAgICogICBTZXRzIGEgaG9yaXpvbnRhbCB0YWIgc3RvcCBhdCB0aGUgY29sdW1uIHBvc2l0aW9uIGluZGljYXRlZCBieVxuICAgKiAgIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGNvbHVtbiB3aGVuIHRoZSB0ZXJtaW5hbCByZWNlaXZlcyBhbiBIVFMuXG4gICAqXG4gICAqIEB2dDogI1kgICBDMSAgICBIVFMgICBcIkhvcml6b250YWwgVGFidWxhdGlvbiBTZXRcIiBcIlxceDg4XCIgICAgXCJQbGFjZXMgYSB0YWIgc3RvcCBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXCJcbiAgICogQHZ0OiAjWSAgIEVTQyAgIEhUUyAgIFwiSG9yaXpvbnRhbCBUYWJ1bGF0aW9uIFNldFwiIFwiRVNDIEhcIiAgIFwiUGxhY2VzIGEgdGFiIHN0b3AgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLlwiXG4gICAqL1xuICBwdWJsaWMgdGFiU2V0KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci50YWJzW3RoaXMuX2FjdGl2ZUJ1ZmZlci54XSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDIE1cbiAgICogQzEuUklcbiAgICogICBERUMgbW5lbW9uaWM6IEhUU1xuICAgKiAgIE1vdmVzIHRoZSBjdXJzb3IgdXAgb25lIGxpbmUgaW4gdGhlIHNhbWUgY29sdW1uLiBJZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSB0b3AgbWFyZ2luLFxuICAgKiAgIHRoZSBwYWdlIHNjcm9sbHMgZG93bi5cbiAgICpcbiAgICogQHZ0OiAjWSBFU0MgIElSIFwiUmV2ZXJzZSBJbmRleFwiIFwiRVNDIE1cIiAgXCJNb3ZlIHRoZSBjdXJzb3Igb25lIGxpbmUgdXAgc2Nyb2xsaW5nIGlmIG5lZWRlZC5cIlxuICAgKi9cbiAgcHVibGljIHJldmVyc2VJbmRleCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueSA9PT0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgLy8gcG9zc2libHkgbW92ZSB0aGUgY29kZSBiZWxvdyB0byB0ZXJtLnJldmVyc2VTY3JvbGwoKTtcbiAgICAgIC8vIHRlc3Q6IGVjaG8gLW5lICdcXGVbMTsxSFxcZVs0NG1cXGVNXFxlWzBtJ1xuICAgICAgLy8gYmxhbmtMaW5lKHRydWUpIGlzIHh0ZXJtL2xpbnV4IGJlaGF2aW9yXG4gICAgICBjb25zdCBzY3JvbGxSZWdpb25IZWlnaHQgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIC0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zaGlmdEVsZW1lbnRzKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCBzY3JvbGxSZWdpb25IZWlnaHQsIDEpO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldEJsYW5rTGluZSh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnktLTtcbiAgICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7IC8vIHF1aWNrZml4IHRvIG5vdCBydW4gb3V0IG9mIGJvdW5kc1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgY1xuICAgKiAgIERFQyBtbmVtb25pYzogUklTIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL1JJUy5odG1sKVxuICAgKiAgIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZnVsbFJlc2V0KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3BhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuX29uUmVxdWVzdFJlc2V0LmZpcmUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG4gICAgdGhpcy5fZXJhc2VBdHRyRGF0YUludGVybmFsID0gREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBiYWNrX2NvbG9yX2VyYXNlIGZlYXR1cmUgZm9yIHh0ZXJtLlxuICAgKi9cbiAgcHJpdmF0ZSBfZXJhc2VBdHRyRGF0YSgpOiBJQXR0cmlidXRlRGF0YSB7XG4gICAgdGhpcy5fZXJhc2VBdHRyRGF0YUludGVybmFsLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgMHhGRkZGRkYpO1xuICAgIHRoaXMuX2VyYXNlQXR0ckRhdGFJbnRlcm5hbC5iZyB8PSB0aGlzLl9jdXJBdHRyRGF0YS5iZyAmIH4weEZDMDAwMDAwO1xuICAgIHJldHVybiB0aGlzLl9lcmFzZUF0dHJEYXRhSW50ZXJuYWw7XG4gIH1cblxuICAvKipcbiAgICogRVNDIG5cbiAgICogRVNDIG9cbiAgICogRVNDIHxcbiAgICogRVNDIH1cbiAgICogRVNDIH5cbiAgICogICBERUMgbW5lbW9uaWM6IExTIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0xTLmh0bWwpXG4gICAqICAgV2hlbiB5b3UgdXNlIGEgbG9ja2luZyBzaGlmdCwgdGhlIGNoYXJhY3RlciBzZXQgcmVtYWlucyBpbiBHTCBvciBHUiB1bnRpbFxuICAgKiAgIHlvdSB1c2UgYW5vdGhlciBsb2NraW5nIHNoaWZ0LiAocGFydGx5IHN1cHBvcnRlZClcbiAgICovXG4gIHB1YmxpYyBzZXRnTGV2ZWwobGV2ZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdMZXZlbChsZXZlbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDICMgOFxuICAgKiAgIERFQyBtbmVtb25pYzogREVDQUxOIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0RFQ0FMTi5odG1sKVxuICAgKiAgIFRoaXMgY29udHJvbCBmdW5jdGlvbiBmaWxscyB0aGUgY29tcGxldGUgc2NyZWVuIGFyZWEgd2l0aFxuICAgKiAgIGEgdGVzdCBwYXR0ZXJuIChFKSB1c2VkIGZvciBhZGp1c3Rpbmcgc2NyZWVuIGFsaWdubWVudC5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEVTQyAgIERFQ0FMTiAgIFwiU2NyZWVuIEFsaWdubWVudCBQYXR0ZXJuXCIgIFwiRVNDICMgOFwiICBcIkZpbGwgdmlld3BvcnQgd2l0aCBhIHRlc3QgcGF0dGVybiAoRSkuXCJcbiAgICovXG4gIHB1YmxpYyBzY3JlZW5BbGlnbm1lbnRQYXR0ZXJuKCk6IGJvb2xlYW4ge1xuICAgIC8vIHByZXBhcmUgY2VsbCBkYXRhXG4gICAgY29uc3QgY2VsbCA9IG5ldyBDZWxsRGF0YSgpO1xuICAgIGNlbGwuY29udGVudCA9IDEgPDwgQ29udGVudC5XSURUSF9TSElGVCB8ICdFJy5jaGFyQ29kZUF0KDApO1xuICAgIGNlbGwuZmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5mZztcbiAgICBjZWxsLmJnID0gdGhpcy5fY3VyQXR0ckRhdGEuYmc7XG5cblxuICAgIHRoaXMuX3NldEN1cnNvcigwLCAwKTtcbiAgICBmb3IgKGxldCB5T2Zmc2V0ID0gMDsgeU9mZnNldCA8IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93czsgKyt5T2Zmc2V0KSB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSArIHlPZmZzZXQ7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldChyb3cpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgbGluZS5maWxsKGNlbGwpO1xuICAgICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0FsbERpcnR5KCk7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKDAsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogRENTICQgcSBQdCBTVFxuICAgKiAgIERFQ1JRU1MgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vREVDUlFTUy5odG1sKVxuICAgKiAgIFJlcXVlc3QgU3RhdHVzIFN0cmluZyAoREVDUlFTUyksIFZUNDIwIGFuZCB1cC5cbiAgICogICBSZXNwb25zZTogREVDUlBTUyAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNSUFNTLmh0bWwpXG4gICAqXG4gICAqIEB2dDogI1BbTGltaXRlZCBzdXBwb3J0LCBzZWUgYmVsb3cuXSAgRENTICAgREVDUlFTUyAgIFwiUmVxdWVzdCBTZWxlY3Rpb24gb3IgU2V0dGluZ1wiICBcIkRDUyAkIHEgUHQgU1RcIiAgIFwiUmVxdWVzdCBzZXZlcmFsIHRlcm1pbmFsIHNldHRpbmdzLlwiXG4gICAqIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtIGBFU0MgUCAxICQgciBQdCBTVGAgZm9yIHZhbGlkIHJlcXVlc3RzLCB3aGVyZSBgUHRgIGNvbnRhaW5zIHRoZVxuICAgKiBjb3JyZXNwb25kaW5nIENTSSBzdHJpbmcsIGBFU0MgUCAwIFNUYCBmb3IgaW52YWxpZCByZXF1ZXN0cy5cbiAgICpcbiAgICogU3VwcG9ydGVkIHJlcXVlc3RzIGFuZCByZXNwb25zZXM6XG4gICAqXG4gICAqIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXF1ZXN0ICAgICAgICAgICB8IFJlc3BvbnNlIChgUHRgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgKiB8IEdyYXBoaWMgUmVuZGl0aW9uIChTR1IpICAgICAgICAgIHwgYERDUyAkIHEgbSBTVGAgICAgfCBhbHdheXMgcmVwb3J0aW5nIGAwbWAgKGN1cnJlbnRseSBicm9rZW4pICAgICAgICAgICAgICB8XG4gICAqIHwgVG9wIGFuZCBCb3R0b20gTWFyZ2lucyAoREVDU1RCTSkgfCBgRENTICQgcSByIFNUYCAgICB8IGBQcyA7IFBzIHJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBDdXJzb3IgU3R5bGUgKERFQ1NDVVNSKSAgICAgICAgICB8IGBEQ1MgJCBxIFNQIHEgU1RgIHwgYFBzIFNQIHFgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFByb3RlY3Rpb24gQXR0cmlidXRlIChERUNTQ0EpICAgIHwgYERDUyAkIHEgXCIgcSBTVGAgIHwgYFBzIFwiIHFgIChERUNTQ0EgMiBpcyByZXBvcnRlZCBhcyBQcyA9IDApICAgICAgICAgICAgIHxcbiAgICogfCBDb25mb3JtYW5jZSBMZXZlbCAoREVDU0NMKSAgICAgICB8IGBEQ1MgJCBxIFwiIHAgU1RgICB8IGFsd2F5cyByZXBvcnRpbmcgYDYxIDsgMSBcIiBwYCAoREVDU0NMIGlzIHVuc3VwcG9ydGVkKSB8XG4gICAqXG4gICAqXG4gICAqIFRPRE86XG4gICAqIC0gZml4IFNHUiByZXBvcnRcbiAgICogLSBlaXRoZXIgY2hlY2sgd2hpY2ggY29uZm9ybWFuY2UgaXMgYmV0dGVyIHN1aXRlZCBvciByZW1vdmUgdGhlIHJlcG9ydCBjb21wbGV0ZWx5XG4gICAqICAgLS0+IHdlIGFyZSBjdXJyZW50bHkgYSBtaXh0dXJlIG9mIGFsbCB1cCB0byBWVDQwMCBidXQgZG9udCBmb2xsb3cgYW55b25lIHN0cmljdGx5XG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFN0YXR1c1N0cmluZyhkYXRhOiBzdHJpbmcsIHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSAoczogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkVTQ30ke3N9JHtDMC5FU0N9XFxcXGApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIC8vIGFjY2VzcyBoZWxwZXJzXG4gICAgY29uc3QgYiA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zO1xuICAgIGNvbnN0IFNUWUxFUzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHsgJ2Jsb2NrJzogMiwgJ3VuZGVybGluZSc6IDQsICdiYXInOiA2IH07XG5cbiAgICBpZiAoZGF0YSA9PT0gJ1wicScpIHJldHVybiBmKGBQMSRyJHt0aGlzLl9jdXJBdHRyRGF0YS5pc1Byb3RlY3RlZCgpID8gMSA6IDB9XCJxYCk7XG4gICAgaWYgKGRhdGEgPT09ICdcInAnKSByZXR1cm4gZihgUDEkcjYxOzFcInBgKTtcbiAgICBpZiAoZGF0YSA9PT0gJ3InKSByZXR1cm4gZihgUDEkciR7Yi5zY3JvbGxUb3AgKyAxfTske2Iuc2Nyb2xsQm90dG9tICsgMX1yYCk7XG4gICAgLy8gRklYTUU6IHJlcG9ydCByZWFsIFNHUiBzZXR0aW5ncyBpbnN0ZWFkIG9mIDBtXG4gICAgaWYgKGRhdGEgPT09ICdtJykgcmV0dXJuIGYoYFAxJHIwbWApO1xuICAgIGlmIChkYXRhID09PSAnIHEnKSByZXR1cm4gZihgUDEkciR7U1RZTEVTW29wdHMuY3Vyc29yU3R5bGVdIC0gKG9wdHMuY3Vyc29yQmxpbmsgPyAxIDogMCl9IHFgKTtcbiAgICByZXR1cm4gZihgUDAkcmApO1xuICB9XG5cbiAgcHVibGljIG1hcmtSYW5nZURpcnR5KHkxOiBudW1iZXIsIHkyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkoeTEsIHkyKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaXJ0eVJvd1RyYWNrZXIge1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xuICByZWFkb25seSBlbmQ6IG51bWJlcjtcblxuICBjbGVhclJhbmdlKCk6IHZvaWQ7XG4gIG1hcmtEaXJ0eSh5OiBudW1iZXIpOiB2b2lkO1xuICBtYXJrUmFuZ2VEaXJ0eSh5MTogbnVtYmVyLCB5MjogbnVtYmVyKTogdm9pZDtcbiAgbWFya0FsbERpcnR5KCk6IHZvaWQ7XG59XG5cbmNsYXNzIERpcnR5Um93VHJhY2tlciBpbXBsZW1lbnRzIElEaXJ0eVJvd1RyYWNrZXIge1xuICBwdWJsaWMgc3RhcnQhOiBudW1iZXI7XG4gIHB1YmxpYyBlbmQhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY2xlYXJSYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyUmFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnk7XG4gICAgdGhpcy5lbmQgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55O1xuICB9XG5cbiAgcHVibGljIG1hcmtEaXJ0eSh5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoeSA8IHRoaXMuc3RhcnQpIHtcbiAgICAgIHRoaXMuc3RhcnQgPSB5O1xuICAgIH0gZWxzZSBpZiAoeSA+IHRoaXMuZW5kKSB7XG4gICAgICB0aGlzLmVuZCA9IHk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1hcmtSYW5nZURpcnR5KHkxOiBudW1iZXIsIHkyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoeTEgPiB5Mikge1xuICAgICAgJHRlbXAgPSB5MTtcbiAgICAgIHkxID0geTI7XG4gICAgICB5MiA9ICR0ZW1wO1xuICAgIH1cbiAgICBpZiAoeTEgPCB0aGlzLnN0YXJ0KSB7XG4gICAgICB0aGlzLnN0YXJ0ID0geTE7XG4gICAgfVxuICAgIGlmICh5MiA+IHRoaXMuZW5kKSB7XG4gICAgICB0aGlzLmVuZCA9IHkyO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtYXJrQWxsRGlydHkoKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrUmFuZ2VEaXJ0eSgwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29sb3JJbmRleCh2YWx1ZTogbnVtYmVyKTogdmFsdWUgaXMgQ29sb3JJbmRleCB7XG4gIHJldHVybiAwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmludGVyZmFjZSBJTmF2aWdhdG9yIHtcbiAgdXNlckFnZW50OiBzdHJpbmc7XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG59XG5cbi8vIFdlJ3JlIGRlY2xhcmluZyBhIG5hdmlnYXRvciBnbG9iYWwgaGVyZSBhcyB3ZSBleHBlY3QgaXQgaW4gYWxsIHJ1bnRpbWVzIChub2RlIGFuZCBicm93c2VyKSwgYnV0XG4vLyB3ZSB3YW50IHRoaXMgbW9kdWxlIHRvIGxpdmUgaW4gY29tbW9uLlxuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IElOYXZpZ2F0b3I7XG5kZWNsYXJlIGNvbnN0IHByb2Nlc3M6IHVua25vd247XG5cbmV4cG9ydCBjb25zdCBpc05vZGUgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICd0aXRsZScgaW4gKHByb2Nlc3MgYXMgYW55KSkgPyB0cnVlIDogZmFsc2U7XG5jb25zdCB1c2VyQWdlbnQgPSAoaXNOb2RlKSA/ICdub2RlJyA6IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5jb25zdCBwbGF0Zm9ybSA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnBsYXRmb3JtO1xuXG5leHBvcnQgY29uc3QgaXNGaXJlZm94ID0gdXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94Jyk7XG5leHBvcnQgY29uc3QgaXNMZWdhY3lFZGdlID0gdXNlckFnZW50LmluY2x1ZGVzKCdFZGdlJyk7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KHVzZXJBZ2VudCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmYXJpVmVyc2lvbigpOiBudW1iZXIge1xuICBpZiAoIWlzU2FmYXJpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gdXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXFwvKFxcZCspLyk7XG4gIGlmIChtYWpvclZlcnNpb24gPT09IG51bGwgfHwgbWFqb3JWZXJzaW9uLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQobWFqb3JWZXJzaW9uWzFdKTtcbn1cblxuLy8gRmluZCB0aGUgdXNlcnMgcGxhdGZvcm0uIFdlIHVzZSB0aGlzIHRvIGludGVycHJldCB0aGUgbWV0YSBrZXlcbi8vIGFuZCBJU08gdGhpcmQgbGV2ZWwgc2hpZnRzLlxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMTk4Nzc5MjQvNTc3NTk4XG5leHBvcnQgY29uc3QgaXNNYWMgPSBbJ01hY2ludG9zaCcsICdNYWNJbnRlbCcsICdNYWNQUEMnLCAnTWFjNjhLJ10uaW5jbHVkZXMocGxhdGZvcm0pO1xuZXhwb3J0IGNvbnN0IGlzSXBhZCA9IHBsYXRmb3JtID09PSAnaVBhZCc7XG5leHBvcnQgY29uc3QgaXNJcGhvbmUgPSBwbGF0Zm9ybSA9PT0gJ2lQaG9uZSc7XG5leHBvcnQgY29uc3QgaXNXaW5kb3dzID0gWydXaW5kb3dzJywgJ1dpbjE2JywgJ1dpbjMyJywgJ1dpbkNFJ10uaW5jbHVkZXMocGxhdGZvcm0pO1xuZXhwb3J0IGNvbnN0IGlzTGludXggPSBwbGF0Zm9ybS5pbmRleE9mKCdMaW51eCcpID49IDA7XG4vLyBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzIHRydWUsIGlzTGludXggd2lsbCBhbHNvIGJlIHRydWUuXG5leHBvcnQgY29uc3QgaXNDaHJvbWVPUyA9IC9cXGJDck9TXFxiLy50ZXN0KHVzZXJBZ2VudCk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbi5cbmxldCBpID0gMDtcblxuLyoqXG4gKiBBIGdlbmVyaWMgbGlzdCB0aGF0IGlzIG1haW50YWluZWQgaW4gc29ydGVkIG9yZGVyIGFuZCBhbGxvd3MgdmFsdWVzIHdpdGggZHVwbGljYXRlIGtleXMuIFRoaXNcbiAqIGxpc3QgaXMgYmFzZWQgb24gYmluYXJ5IHNlYXJjaCBhbmQgYXMgc3VjaCBsb2NhdGluZyBhIGtleSB3aWxsIHRha2UgTyhsb2cgbikgYW1vcnRpemVkLCB0aGlzXG4gKiBpbmNsdWRlcyB0aGUgYnkga2V5IGl0ZXJhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgU29ydGVkTGlzdDxUPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FycmF5OiBUW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nZXRLZXk6ICh2YWx1ZTogVCkgPT4gbnVtYmVyXG4gICkge1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2FycmF5Lmxlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0KHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGkgPSB0aGlzLl9zZWFyY2godGhpcy5fZ2V0S2V5KHZhbHVlKSk7XG4gICAgdGhpcy5fYXJyYXkuc3BsaWNlKGksIDAsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUodmFsdWU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRoaXMuX2dldEtleSh2YWx1ZSk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGkgPSB0aGlzLl9zZWFyY2goa2V5KTtcbiAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSkgIT09IGtleSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBkbyB7XG4gICAgICBpZiAodGhpcy5fYXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpIDwgdGhpcy5fYXJyYXkubGVuZ3RoICYmIHRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSkgPT09IGtleSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljICpnZXRLZXlJdGVyYXRvcihrZXk6IG51bWJlcik6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgIGlmICh0aGlzLl9hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaSA9IHRoaXMuX3NlYXJjaChrZXkpO1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSAhPT0ga2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIHlpZWxkIHRoaXMuX2FycmF5W2ldO1xuICAgIH0gd2hpbGUgKCsraSA8IHRoaXMuX2FycmF5Lmxlbmd0aCAmJiB0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pID09PSBrZXkpO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2hCeUtleShrZXk6IG51bWJlciwgY2FsbGJhY2s6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaSA9IHRoaXMuX3NlYXJjaChrZXkpO1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSAhPT0ga2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMuX2FycmF5W2ldKTtcbiAgICB9IHdoaWxlICgrK2kgPCB0aGlzLl9hcnJheS5sZW5ndGggJiYgdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSA9PT0ga2V5KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gICAgLy8gRHVwbGljYXRlIHRoZSBhcnJheSB0byBhdm9pZCBpc3N1ZXMgd2hlbiBfYXJyYXkgY2hhbmdlcyB3aGlsZSBpdGVyYXRpbmdcbiAgICByZXR1cm4gWy4uLnRoaXMuX2FycmF5XS52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlYXJjaChrZXk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IG1pbiA9IDA7XG4gICAgbGV0IG1heCA9IHRoaXMuX2FycmF5Lmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKG1heCA+PSBtaW4pIHtcbiAgICAgIGxldCBtaWQgPSAobWluICsgbWF4KSA+PiAxO1xuICAgICAgY29uc3QgbWlkS2V5ID0gdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W21pZF0pO1xuICAgICAgaWYgKG1pZEtleSA+IGtleSkge1xuICAgICAgICBtYXggPSBtaWQgLSAxO1xuICAgICAgfSBlbHNlIGlmIChtaWRLZXkgPCBrZXkpIHtcbiAgICAgICAgbWluID0gbWlkICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGtleSBpbiBsaXN0LCB3YWxrIHRvIGxvd2VzdCBkdXBsaWNhdGVcbiAgICAgICAgd2hpbGUgKG1pZCA+IDAgJiYgdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W21pZCAtIDFdKSA9PT0ga2V5KSB7XG4gICAgICAgICAgbWlkLS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8ga2V5IG5vdCBpbiBsaXN0XG4gICAgLy8gc3RpbGwgcmV0dXJuIGNsb3Nlc3QgbWluIChhbHNvIHVzZWQgYXMgaW5zZXJ0IHBvc2l0aW9uKVxuICAgIHJldHVybiBtaW47XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuaW50ZXJmYWNlIElUYXNrUXVldWUge1xuICAvKipcbiAgICogQWRkcyBhIHRhc2sgdG8gdGhlIHF1ZXVlIHdoaWNoIHdpbGwgcnVuIGluIGEgZnV0dXJlIGlkbGUgY2FsbGJhY2suXG4gICAqIFRvIGF2b2lkIHBlcmNlaXZhYmxlIHN0YWxscyBvbiB0aGUgbWFpbnRocmVhZCwgdGFza3Mgd2l0aCBoZWF2eSB3b3JrbG9hZFxuICAgKiBzaG91bGQgc3BsaXQgdGhlaXIgd29yayBpbnRvIHNtYWxsZXIgcGllY2VzIGFuZCByZXR1cm4gYHRydWVgIHRvIGdldFxuICAgKiBjYWxsZWQgYWdhaW4gdW50aWwgdGhlIHdvcmsgaXMgZG9uZSAob24gZmFsc3kgcmV0dXJuIHZhbHVlKS5cbiAgICovXG4gIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBxdWV1ZSwgcnVubmluZyBhbGwgcmVtYWluaW5nIHRhc2tzIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBmbHVzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IHJlbWFpbmluZyB0YXNrcyBmcm9tIHRoZSBxdWV1ZSwgdGhlc2Ugd2lsbCBub3QgYmUgcnVuLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElUYXNrRGVhZGxpbmUge1xuICB0aW1lUmVtYWluaW5nKCk6IG51bWJlcjtcbn1cbnR5cGUgQ2FsbGJhY2tXaXRoRGVhZGxpbmUgPSAoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpID0+IHZvaWQ7XG5cbmFic3RyYWN0IGNsYXNzIFRhc2tRdWV1ZSBpbXBsZW1lbnRzIElUYXNrUXVldWUge1xuICBwcml2YXRlIF90YXNrczogKCgpID0+IGJvb2xlYW4gfCB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX2lkbGVDYWxsYmFjaz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaSA9IDA7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IENhbGxiYWNrV2l0aERlYWRsaW5lKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQ7XG5cbiAgcHVibGljIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl90YXNrcy5wdXNoKHRhc2spO1xuICAgIHRoaXMuX3N0YXJ0KCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIGlmICghdGhpcy5fdGFza3NbdGhpcy5faV0oKSkge1xuICAgICAgICB0aGlzLl9pKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faWRsZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9jYW5jZWxDYWxsYmFjayh0aGlzLl9pZGxlQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9pID0gMDtcbiAgICB0aGlzLl90YXNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pZGxlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHRoaXMuX3JlcXVlc3RDYWxsYmFjayh0aGlzLl9wcm9jZXNzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3MoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHRhc2tEdXJhdGlvbiA9IDA7XG4gICAgbGV0IGxvbmdlc3RUYXNrID0gMDtcbiAgICBsZXQgbGFzdERlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgIGxldCBkZWFkbGluZVJlbWFpbmluZyA9IDA7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIHRhc2tEdXJhdGlvbiA9IERhdGUubm93KCk7XG4gICAgICBpZiAoIXRoaXMuX3Rhc2tzW3RoaXMuX2ldKCkpIHtcbiAgICAgICAgdGhpcy5faSsrO1xuICAgICAgfVxuICAgICAgLy8gb3RoZXIgdGhhbiBwZXJmb3JtYW5jZS5ub3csIERhdGUubm93IG1pZ2h0IG5vdCBiZSBzdGFibGUgKGNoYW5nZXMgb24gd2FsbCBjbG9jayBjaGFuZ2VzKSxcbiAgICAgIC8vIHRoaXMgaXMgbm90IGFuIGlzc3VlIGhlcmUgYXMgYSBjbG9jayBjaGFuZ2UgZHVyaW5nIGEgc2hvcnQgcnVubmluZyB0YXNrIGlzIHZlcnkgdW5saWtlbHlcbiAgICAgIC8vIGluIGNhc2UgaXQgc3RpbGwgaGFwcGVuZWQgYW5kIGxlYWRzIHRvIG5lZ2F0aXZlIGR1cmF0aW9uLCBzaW1wbHkgYXNzdW1lIDEgbXNlY1xuICAgICAgdGFza0R1cmF0aW9uID0gTWF0aC5tYXgoMSwgRGF0ZS5ub3coKSAtIHRhc2tEdXJhdGlvbik7XG4gICAgICBsb25nZXN0VGFzayA9IE1hdGgubWF4KHRhc2tEdXJhdGlvbiwgbG9uZ2VzdFRhc2spO1xuICAgICAgLy8gR3Vlc3MgdGhlIGZvbGxvd2luZyB0YXNrIHdpbGwgdGFrZSBhIHNpbWlsYXIgdGltZSB0byB0aGUgbG9uZ2VzdCB0YXNrIGluIHRoaXMgYmF0Y2gsIGFsbG93XG4gICAgICAvLyBhZGRpdGlvbmFsIHJvb20gdG8gdHJ5IGF2b2lkIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmVcbiAgICAgIGRlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgICAgaWYgKGxvbmdlc3RUYXNrICogMS41ID4gZGVhZGxpbmVSZW1haW5pbmcpIHtcbiAgICAgICAgLy8gV2FybiB3aGVuIHRoZSB0aW1lIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmUgaXMgb3ZlciAyMG1zLCBpZiB0aGlzIGhhcHBlbnMgaW4gcHJhY3RpY2UgdGhlXG4gICAgICAgIC8vIHRhc2sgc2hvdWxkIGJlIHNwbGl0IGludG8gc3ViLXRhc2tzIHRvIGVuc3VyZSB0aGUgVUkgcmVtYWlucyByZXNwb25zaXZlLlxuICAgICAgICBpZiAobGFzdERlYWRsaW5lUmVtYWluaW5nIC0gdGFza0R1cmF0aW9uIDwgLTIwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGB0YXNrIHF1ZXVlIGV4Y2VlZGVkIGFsbG90dGVkIGRlYWRsaW5lIGJ5ICR7TWF0aC5hYnMoTWF0aC5yb3VuZChsYXN0RGVhZGxpbmVSZW1haW5pbmcgLSB0YXNrRHVyYXRpb24pKX1tc2ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3REZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lUmVtYWluaW5nO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgdGFza3MgdmlhIHNldFRpbWVvdXQsIHRyeWluZyB0byBtYWludGFpbiBhYm92ZSA2MCBmcmFtZXNcbiAqIHBlciBzZWNvbmQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5IHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlcixcbiAqIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdCBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUHJpb3JpdHlUYXNrUXVldWUgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogQ2FsbGJhY2tXaXRoRGVhZGxpbmUpOiBudW1iZXIge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHRoaXMuX2NyZWF0ZURlYWRsaW5lKDE2KSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaWRlbnRpZmllcik7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEZWFkbGluZShkdXJhdGlvbjogbnVtYmVyKTogSVRhc2tEZWFkbGluZSB7XG4gICAgY29uc3QgZW5kID0gRGF0ZS5ub3coKSArIGR1cmF0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lUmVtYWluaW5nOiAoKSA9PiBNYXRoLm1heCgwLCBlbmQgLSBEYXRlLm5vdygpKVxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgSWRsZVRhc2tRdWV1ZUludGVybmFsIGV4dGVuZHMgVGFza1F1ZXVlIHtcbiAgcHJvdGVjdGVkIF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IElkbGVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0SWRsZUNhbGxiYWNrKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY2FuY2VsSWRsZUNhbGxiYWNrKGlkZW50aWZpZXIpO1xuICB9XG59XG5cbi8qKlxuICogQSBxdWV1ZSBvZiB0aGF0IHJ1bnMgdGFza3Mgb3ZlciBzZXZlcmFsIGlkbGUgY2FsbGJhY2tzLCB0cnlpbmcgdG8gcmVzcGVjdCB0aGUgaWRsZSBjYWxsYmFjaydzXG4gKiBkZWFkbGluZSBnaXZlbiBieSB0aGUgZW52aXJvbm1lbnQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5XG4gKiB3aWxsIHJ1biBzb21lIHRpbWUgbGF0ZXIsIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdFxuICogaW50cm9kdWNlIHJhY2UgY29uZGl0aW9ucy5cbiAqXG4gKiBUaGlzIHJldmVydHMgdG8gYSB7QGxpbmsgUHJpb3JpdHlUYXNrUXVldWV9IGlmIHRoZSBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGlkbGUgY2FsbGJhY2tzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgSWRsZVRhc2tRdWV1ZSA9ICghaXNOb2RlICYmICdyZXF1ZXN0SWRsZUNhbGxiYWNrJyBpbiB3aW5kb3cpID8gSWRsZVRhc2tRdWV1ZUludGVybmFsIDogUHJpb3JpdHlUYXNrUXVldWU7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgdHJhY2tzIGEgc2luZ2xlIGRlYm91bmNlZCB0YXNrIHRoYXQgd2lsbCBydW4gb24gdGhlIG5leHQgaWRsZSBmcmFtZS4gV2hlbiBjYWxsZWRcbiAqIG11bHRpcGxlIHRpbWVzLCBvbmx5IHRoZSBsYXN0IHNldCB0YXNrIHdpbGwgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgRGVib3VuY2VkSWRsZVRhc2sge1xuICBwcml2YXRlIF9xdWV1ZTogSVRhc2tRdWV1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9xdWV1ZSA9IG5ldyBJZGxlVGFza1F1ZXVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fcXVldWUuY2xlYXIoKTtcbiAgICB0aGlzLl9xdWV1ZS5lbnF1ZXVlKHRhc2spO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCk6IHZvaWQge1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ0hBUl9EQVRBX0NPREVfSU5ERVgsIE5VTExfQ0VMTF9DT0RFLCBXSElURVNQQUNFX0NFTExfQ09ERSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlKGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlKTogdm9pZCB7XG4gIC8vIFdpbnB0eSBkb2VzIG5vdCBzdXBwb3J0IHdyYXBhcm91bmQgbW9kZSB3aGljaCBtZWFucyB0aGF0IGxpbmVzIHdpbGwgbmV2ZXJcbiAgLy8gYmUgbWFya2VkIGFzIHdyYXBwZWQuIFRoaXMgY2F1c2VzIGlzc3VlcyBmb3IgdGhpbmdzIGxpa2UgY29weWluZyBhIGxpbmVcbiAgLy8gcmV0YWluaW5nIHRoZSB3cmFwcGVkIG5ldyBsaW5lIGNoYXJhY3RlcnMgb3IgaWYgY29uc3VtZXJzIGFyZSBsaXN0ZW5pbmdcbiAgLy8gaW4gb24gdGhlIGRhdGEgc3RyZWFtLlxuICAvL1xuICAvLyBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBpcyB0byBsaXN0ZW4gdG8gZXZlcnkgaW5jb21pbmcgbGluZSBmZWVkIGFuZCBtYXJrXG4gIC8vIHRoZSBsaW5lIGFzIHdyYXBwZWQgaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBwcmV2aW91cyBsaW5lIGlzIG5vdCBhXG4gIC8vIHNwYWNlLiBUaGlzIGlzIGNlcnRhaW5seSBub3Qgd2l0aG91dCBpdHMgcHJvYmxlbXMsIGJ1dCBnZW5lcmFsbHkgb25cbiAgLy8gV2luZG93cyB3aGVuIHRleHQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXJtaW5hbCBpdCdzIGxpa2VseSBnb2luZyB0byBiZVxuICAvLyB3cmFwcGVkLlxuICBjb25zdCBsaW5lID0gYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlICsgYnVmZmVyU2VydmljZS5idWZmZXIueSAtIDEpO1xuICBjb25zdCBsYXN0Q2hhciA9IGxpbmU/LmdldChidWZmZXJTZXJ2aWNlLmNvbHMgLSAxKTtcblxuICBjb25zdCBuZXh0TGluZSA9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChidWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZSArIGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnkpO1xuICBpZiAobmV4dExpbmUgJiYgbGFzdENoYXIpIHtcbiAgICBuZXh0TGluZS5pc1dyYXBwZWQgPSAobGFzdENoYXJbQ0hBUl9EQVRBX0NPREVfSU5ERVhdICE9PSBOVUxMX0NFTExfQ09ERSAmJiBsYXN0Q2hhcltDSEFSX0RBVEFfQ09ERV9JTkRFWF0gIT09IFdISVRFU1BBQ0VfQ0VMTF9DT0RFKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUNvbG9yUkdCLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzLCBCZ0ZsYWdzLCBVbmRlcmxpbmVTdHlsZSwgRXh0RmxhZ3MgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUF0dHJpYnV0ZURhdGEge1xuICBwdWJsaWMgc3RhdGljIHRvQ29sb3JSR0IodmFsdWU6IG51bWJlcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLlJFRF9TSElGVCAmIDI1NSxcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLkdSRUVOX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgJiAyNTVcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29sb3JSR0IodmFsdWU6IElDb2xvclJHQik6IG51bWJlciB7XG4gICAgcmV0dXJuICh2YWx1ZVswXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5SRURfU0hJRlQgfCAodmFsdWVbMV0gJiAyNTUpIDw8IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgfCB2YWx1ZVsyXSAmIDI1NTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBJQXR0cmlidXRlRGF0YSB7XG4gICAgY29uc3QgbmV3T2JqID0gbmV3IEF0dHJpYnV0ZURhdGEoKTtcbiAgICBuZXdPYmouZmcgPSB0aGlzLmZnO1xuICAgIG5ld09iai5iZyA9IHRoaXMuYmc7XG4gICAgbmV3T2JqLmV4dGVuZGVkID0gdGhpcy5leHRlbmRlZC5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH1cblxuICAvLyBkYXRhXG4gIHB1YmxpYyBmZyA9IDA7XG4gIHB1YmxpYyBiZyA9IDA7XG4gIHB1YmxpYyBleHRlbmRlZDogSUV4dGVuZGVkQXR0cnMgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuXG4gIC8vIGZsYWdzXG4gIHB1YmxpYyBpc0ludmVyc2UoKTogbnVtYmVyICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVkVSU0U7IH1cbiAgcHVibGljIGlzQm9sZCgpOiBudW1iZXIgICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQk9MRDsgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmUoKTogbnVtYmVyICAgICB7XG4gICAgaWYgKHRoaXMuaGFzRXh0ZW5kZWRBdHRycygpICYmIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgIT09IFVuZGVybGluZVN0eWxlLk5PTkUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FO1xuICB9XG4gIHB1YmxpYyBpc0JsaW5rKCk6IG51bWJlciAgICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLkJMSU5LOyB9XG4gIHB1YmxpYyBpc0ludmlzaWJsZSgpOiBudW1iZXIgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVklTSUJMRTsgfVxuICBwdWJsaWMgaXNJdGFsaWMoKTogbnVtYmVyICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5JVEFMSUM7IH1cbiAgcHVibGljIGlzRGltKCk6IG51bWJlciAgICAgICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuRElNOyB9XG4gIHB1YmxpYyBpc1N0cmlrZXRocm91Z2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlNUUklLRVRIUk9VR0g7IH1cbiAgcHVibGljIGlzUHJvdGVjdGVkKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuUFJPVEVDVEVEOyB9XG4gIHB1YmxpYyBpc092ZXJsaW5lKCk6IG51bWJlciAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLk9WRVJMSU5FOyB9XG5cbiAgLy8gY29sb3IgbW9kZXNcbiAgcHVibGljIGdldEZnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBnZXRCZ0NvbG9yTW9kZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSzsgfVxuICBwdWJsaWMgaXNGZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzQmdSR0IoKTogYm9vbGVhbiAgICAgICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCOyB9XG4gIHB1YmxpYyBpc0ZnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNCZ1BhbGV0dGUoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTY7IH1cbiAgcHVibGljIGlzRmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQXR0cmlidXRlRGVmYXVsdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZmcgPT09IDAgJiYgdGhpcy5iZyA9PT0gMDsgfVxuXG4gIC8vIGNvbG9yc1xuICBwdWJsaWMgZ2V0RmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEJnQ29sb3IoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6ICAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvLyBDTV9ERUZBVUxUIGRlZmF1bHRzIHRvIC0xXG4gICAgfVxuICB9XG5cbiAgLy8gZXh0ZW5kZWQgYXR0cnNcbiAgcHVibGljIGhhc0V4dGVuZGVkQXR0cnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFeHRlbmRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHRlbmRlZC5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuYmcgJj0gfkJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJnIHw9IEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3IoKTogbnVtYmVyIHtcbiAgICBpZiAoKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmdDb2xvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZUNvbG9yTW9kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLXG4gICAgICA6IHRoaXMuZ2V0RmdDb2xvck1vZGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclJHQigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQlxuICAgICAgOiB0aGlzLmlzRmdSR0IoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclBhbGV0dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTZcbiAgICAgICAgICB8fCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NlxuICAgICAgOiB0aGlzLmlzRmdQYWxldHRlKCk7XG4gIH1cbiAgcHVibGljIGlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDBcbiAgICAgIDogdGhpcy5pc0ZnRGVmYXVsdCgpO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlVOREVSTElORVxuICAgICAgPyAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEID8gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA6IFVuZGVybGluZVN0eWxlLlNJTkdMRSlcbiAgICAgIDogVW5kZXJsaW5lU3R5bGUuTk9ORTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVZhcmlhbnRPZmZzZXQ7XG4gIH1cbn1cblxuXG4vKipcbiAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGEgY2VsbC5cbiAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVudCB1bmRlcmxpbmUgc3R5bGVzIGFuZCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuZGVkQXR0cnMgaW1wbGVtZW50cyBJRXh0ZW5kZWRBdHRycyB7XG4gIHByaXZhdGUgX2V4dDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCBleHQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9leHQgJiB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSB8XG4gICAgICAgICh0aGlzLnVuZGVybGluZVN0eWxlIDw8IDI2KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4dDtcbiAgfVxuICBwdWJsaWMgc2V0IGV4dCh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX2V4dCA9IHZhbHVlOyB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiB0aGUgVVJMIHN0eWxlIGlmIGl0IGhhcyBvbmVcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiBVbmRlcmxpbmVTdHlsZS5EQVNIRUQ7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5fZXh0ICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSA+PiAyNjtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZVN0eWxlKHZhbHVlOiBVbmRlcmxpbmVTdHlsZSkge1xuICAgIHRoaXMuX2V4dCAmPSB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjYpICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHQgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVDb2xvcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgdGhpcy5fZXh0IHw9IHZhbHVlICYgKEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsSWQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgdXJsSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsSWQ7XG4gIH1cbiAgcHVibGljIHNldCB1cmxJZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdXJsSWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbCA9ICh0aGlzLl9leHQgJiBFeHRGbGFncy5WQVJJQU5UX09GRlNFVCkgPj4gMjk7XG4gICAgaWYgKHZhbCA8IDApIHtcbiAgICAgIHJldHVybiB2YWwgXiAweEZGRkZGRkY4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLl9leHQgfD0gKHZhbHVlIDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZXh0OiBudW1iZXIgPSAwLFxuICAgIHVybElkOiBudW1iZXIgPSAwXG4gICkge1xuICAgIHRoaXMuX2V4dCA9IGV4dDtcbiAgICB0aGlzLl91cmxJZCA9IHVybElkO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElFeHRlbmRlZEF0dHJzIHtcbiAgICByZXR1cm4gbmV3IEV4dGVuZGVkQXR0cnModGhpcy5fZXh0LCB0aGlzLl91cmxJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudCBtZXRob2QgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb2JqZWN0IGhvbGRzIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sXG4gICAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGFudCBpbiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudW5kZXJsaW5lU3R5bGUgPT09IFVuZGVybGluZVN0eWxlLk5PTkUgJiYgdGhpcy5fdXJsSWQgPT09IDA7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ2lyY3VsYXJMaXN0LCBJSW5zZXJ0RXZlbnQgfSBmcm9tICdjb21tb24vQ2lyY3VsYXJMaXN0JztcbmltcG9ydCB7IElkbGVUYXNrUXVldWUgfSBmcm9tICdjb21tb24vVGFza1F1ZXVlJztcbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQnVmZmVyTGluZSwgSUNlbGxEYXRhLCBJQ2hhcnNldCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IEJ1ZmZlckxpbmUsIERFRkFVTFRfQVRUUl9EQVRBIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9CdWZmZXJMaW5lJztcbmltcG9ydCB7IGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCwgcmVmbG93TGFyZ2VyQXBwbHlOZXdMYXlvdXQsIHJlZmxvd0xhcmdlckNyZWF0ZU5ld0xheW91dCwgcmVmbG93TGFyZ2VyR2V0TGluZXNUb1JlbW92ZSwgcmVmbG93U21hbGxlckdldE5ld0xpbmVMZW5ndGhzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9CdWZmZXJSZWZsb3cnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IE5VTExfQ0VMTF9DSEFSLCBOVUxMX0NFTExfQ09ERSwgTlVMTF9DRUxMX1dJRFRILCBXSElURVNQQUNFX0NFTExfQ0hBUiwgV0hJVEVTUEFDRV9DRUxMX0NPREUsIFdISVRFU1BBQ0VfQ0VMTF9XSURUSCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IE1hcmtlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvTWFya2VyJztcbmltcG9ydCB7IElCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQ0hBUlNFVCB9IGZyb20gJ2NvbW1vbi9kYXRhL0NoYXJzZXRzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY29uc3QgTUFYX0JVRkZFUl9TSVpFID0gNDI5NDk2NzI5NTsgLy8gMl4zMiAtIDFcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB0ZXJtaW5hbCBidWZmZXIgKGFuIGludGVybmFsIHN0YXRlIG9mIHRoZSB0ZXJtaW5hbCksIHdoZXJlIHRoZVxuICogZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCAoaW4gaGlnaC1sZXZlbCk6XG4gKiAgIC0gdGV4dCBjb250ZW50IG9mIHRoaXMgcGFydGljdWxhciBidWZmZXJcbiAqICAgLSBjdXJzb3IgcG9zaXRpb25cbiAqICAgLSBzY3JvbGwgcG9zaXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1ZmZlciBpbXBsZW1lbnRzIElCdWZmZXIge1xuICBwdWJsaWMgbGluZXM6IENpcmN1bGFyTGlzdDxJQnVmZmVyTGluZT47XG4gIHB1YmxpYyB5ZGlzcDogbnVtYmVyID0gMDtcbiAgcHVibGljIHliYXNlOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgeTogbnVtYmVyID0gMDtcbiAgcHVibGljIHg6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBzY3JvbGxCb3R0b206IG51bWJlcjtcbiAgcHVibGljIHNjcm9sbFRvcDogbnVtYmVyO1xuICBwdWJsaWMgdGFiczogeyBbY29sdW1uOiBudW1iZXJdOiBib29sZWFuIHwgdW5kZWZpbmVkIH0gPSB7fTtcbiAgcHVibGljIHNhdmVkWTogbnVtYmVyID0gMDtcbiAgcHVibGljIHNhdmVkWDogbnVtYmVyID0gMDtcbiAgcHVibGljIHNhdmVkQ3VyQXR0ckRhdGEgPSBERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpO1xuICBwdWJsaWMgc2F2ZWRDaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZCA9IERFRkFVTFRfQ0hBUlNFVDtcbiAgcHVibGljIG1hcmtlcnM6IE1hcmtlcltdID0gW107XG4gIHByaXZhdGUgX251bGxDZWxsOiBJQ2VsbERhdGEgPSBDZWxsRGF0YS5mcm9tQ2hhckRhdGEoWzAsIE5VTExfQ0VMTF9DSEFSLCBOVUxMX0NFTExfV0lEVEgsIE5VTExfQ0VMTF9DT0RFXSk7XG4gIHByaXZhdGUgX3doaXRlc3BhY2VDZWxsOiBJQ2VsbERhdGEgPSBDZWxsRGF0YS5mcm9tQ2hhckRhdGEoWzAsIFdISVRFU1BBQ0VfQ0VMTF9DSEFSLCBXSElURVNQQUNFX0NFTExfV0lEVEgsIFdISVRFU1BBQ0VfQ0VMTF9DT0RFXSk7XG4gIHByaXZhdGUgX2NvbHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcm93czogbnVtYmVyO1xuICBwcml2YXRlIF9pc0NsZWFyaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaGFzU2Nyb2xsYmFjazogYm9vbGVhbixcbiAgICBwcml2YXRlIF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2NvbHMgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgdGhpcy5fcm93cyA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICB0aGlzLmxpbmVzID0gbmV3IENpcmN1bGFyTGlzdDxJQnVmZmVyTGluZT4odGhpcy5fZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aCh0aGlzLl9yb3dzKSk7XG4gICAgdGhpcy5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuc2Nyb2xsQm90dG9tID0gdGhpcy5fcm93cyAtIDE7XG4gICAgdGhpcy5zZXR1cFRhYlN0b3BzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVsbENlbGwoYXR0cj86IElBdHRyaWJ1dGVEYXRhKTogSUNlbGxEYXRhIHtcbiAgICBpZiAoYXR0cikge1xuICAgICAgdGhpcy5fbnVsbENlbGwuZmcgPSBhdHRyLmZnO1xuICAgICAgdGhpcy5fbnVsbENlbGwuYmcgPSBhdHRyLmJnO1xuICAgICAgdGhpcy5fbnVsbENlbGwuZXh0ZW5kZWQgPSBhdHRyLmV4dGVuZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9udWxsQ2VsbC5mZyA9IDA7XG4gICAgICB0aGlzLl9udWxsQ2VsbC5iZyA9IDA7XG4gICAgICB0aGlzLl9udWxsQ2VsbC5leHRlbmRlZCA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9udWxsQ2VsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRXaGl0ZXNwYWNlQ2VsbChhdHRyPzogSUF0dHJpYnV0ZURhdGEpOiBJQ2VsbERhdGEge1xuICAgIGlmIChhdHRyKSB7XG4gICAgICB0aGlzLl93aGl0ZXNwYWNlQ2VsbC5mZyA9IGF0dHIuZmc7XG4gICAgICB0aGlzLl93aGl0ZXNwYWNlQ2VsbC5iZyA9IGF0dHIuYmc7XG4gICAgICB0aGlzLl93aGl0ZXNwYWNlQ2VsbC5leHRlbmRlZCA9IGF0dHIuZXh0ZW5kZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3doaXRlc3BhY2VDZWxsLmZnID0gMDtcbiAgICAgIHRoaXMuX3doaXRlc3BhY2VDZWxsLmJnID0gMDtcbiAgICAgIHRoaXMuX3doaXRlc3BhY2VDZWxsLmV4dGVuZGVkID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3doaXRlc3BhY2VDZWxsO1xuICB9XG5cbiAgcHVibGljIGdldEJsYW5rTGluZShhdHRyOiBJQXR0cmlidXRlRGF0YSwgaXNXcmFwcGVkPzogYm9vbGVhbik6IElCdWZmZXJMaW5lIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpbmUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLmdldE51bGxDZWxsKGF0dHIpLCBpc1dyYXBwZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNTY3JvbGxiYWNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNTY3JvbGxiYWNrICYmIHRoaXMubGluZXMubWF4TGVuZ3RoID4gdGhpcy5fcm93cztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDdXJzb3JJblZpZXdwb3J0KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFic29sdXRlWSA9IHRoaXMueWJhc2UgKyB0aGlzLnk7XG4gICAgY29uc3QgcmVsYXRpdmVZID0gYWJzb2x1dGVZIC0gdGhpcy55ZGlzcDtcbiAgICByZXR1cm4gKHJlbGF0aXZlWSA+PSAwICYmIHJlbGF0aXZlWSA8IHRoaXMuX3Jvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvcnJlY3QgYnVmZmVyIGxlbmd0aCBiYXNlZCBvbiB0aGUgcm93cyBwcm92aWRlZCwgdGhlIHRlcm1pbmFsJ3NcbiAgICogc2Nyb2xsYmFjayBhbmQgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBmbGFnZ2VkIHRvIGhhdmUgc2Nyb2xsYmFjayBvciBub3QuXG4gICAqIEBwYXJhbSByb3dzIFRoZSB0ZXJtaW5hbCByb3dzIHRvIHVzZSBpbiB0aGUgY2FsY3VsYXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb3JyZWN0QnVmZmVyTGVuZ3RoKHJvd3M6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLl9oYXNTY3JvbGxiYWNrKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBjb25zdCBjb3JyZWN0QnVmZmVyTGVuZ3RoID0gcm93cyArIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc2Nyb2xsYmFjaztcblxuICAgIHJldHVybiBjb3JyZWN0QnVmZmVyTGVuZ3RoID4gTUFYX0JVRkZFUl9TSVpFID8gTUFYX0JVRkZFUl9TSVpFIDogY29ycmVjdEJ1ZmZlckxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWxscyB0aGUgYnVmZmVyJ3Mgdmlld3BvcnQgd2l0aCBibGFuayBsaW5lcy5cbiAgICovXG4gIHB1YmxpYyBmaWxsVmlld3BvcnRSb3dzKGZpbGxBdHRyPzogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChmaWxsQXR0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpbGxBdHRyID0gREVGQVVMVF9BVFRSX0RBVEE7XG4gICAgICB9XG4gICAgICBsZXQgaSA9IHRoaXMuX3Jvd3M7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCh0aGlzLmdldEJsYW5rTGluZShmaWxsQXR0cikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGJ1ZmZlciB0byBpdCdzIGluaXRpYWwgc3RhdGUsIGRpc2NhcmRpbmcgYWxsIHByZXZpb3VzIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy55ZGlzcCA9IDA7XG4gICAgdGhpcy55YmFzZSA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMubGluZXMgPSBuZXcgQ2lyY3VsYXJMaXN0PElCdWZmZXJMaW5lPih0aGlzLl9nZXRDb3JyZWN0QnVmZmVyTGVuZ3RoKHRoaXMuX3Jvd3MpKTtcbiAgICB0aGlzLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSB0aGlzLl9yb3dzIC0gMTtcbiAgICB0aGlzLnNldHVwVGFiU3RvcHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemVzIHRoZSBidWZmZXIsIGFkanVzdGluZyBpdHMgZGF0YSBhY2NvcmRpbmdseS5cbiAgICogQHBhcmFtIG5ld0NvbHMgVGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucy5cbiAgICogQHBhcmFtIG5ld1Jvd3MgVGhlIG5ldyBudW1iZXIgb2Ygcm93cy5cbiAgICovXG4gIHB1YmxpYyByZXNpemUobmV3Q29sczogbnVtYmVyLCBuZXdSb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gbnVsbCBjZWxsIHdpdGggZGVmYXVsdCBhdHRyc1xuICAgIGNvbnN0IG51bGxDZWxsID0gdGhpcy5nZXROdWxsQ2VsbChERUZBVUxUX0FUVFJfREFUQSk7XG5cbiAgICAvLyBjb3VudCBidWZmZXJsaW5lcyB3aXRoIG92ZXJseSBiaWcgbWVtb3J5IHRvIGJlIGNsZWFuZWQgYWZ0ZXJ3YXJkc1xuICAgIGxldCBkaXJ0eU1lbW9yeUxpbmVzID0gMDtcblxuICAgIC8vIEluY3JlYXNlIG1heCBsZW5ndGggaWYgbmVlZGVkIGJlZm9yZSBhZGp1c3RtZW50cyB0byBhbGxvdyBzcGFjZSB0byBmaWxsXG4gICAgLy8gYXMgcmVxdWlyZWQuXG4gICAgY29uc3QgbmV3TWF4TGVuZ3RoID0gdGhpcy5fZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aChuZXdSb3dzKTtcbiAgICBpZiAobmV3TWF4TGVuZ3RoID4gdGhpcy5saW5lcy5tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMubGluZXMubWF4TGVuZ3RoID0gbmV3TWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRqdXN0bWVudHMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBidWZmZXIgaGFzIGJlZW5cbiAgICAvLyBpbml0aWFsaXplZC9maWxsZWQuXG4gICAgaWYgKHRoaXMubGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRGVhbCB3aXRoIGNvbHVtbnMgaW5jcmVhc2luZyAocmVkdWNpbmcgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHJlZmxvdylcbiAgICAgIGlmICh0aGlzLl9jb2xzIDwgbmV3Q29scykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyArYm9vbGVhbiBmb3IgZmFzdCAwIG9yIDEgY29udmVyc2lvblxuICAgICAgICAgIGRpcnR5TWVtb3J5TGluZXMgKz0gK3RoaXMubGluZXMuZ2V0KGkpIS5yZXNpemUobmV3Q29scywgbnVsbENlbGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2l6ZSByb3dzIGluIGJvdGggZGlyZWN0aW9ucyBhcyBuZWVkZWRcbiAgICAgIGxldCBhZGRUb1kgPSAwO1xuICAgICAgaWYgKHRoaXMuX3Jvd3MgPCBuZXdSb3dzKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSB0aGlzLl9yb3dzOyB5IDwgbmV3Um93czsgeSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoIDwgbmV3Um93cyArIHRoaXMueWJhc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NNb2RlIHx8IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c1B0eS5iYWNrZW5kICE9PSB1bmRlZmluZWQgfHwgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzUHR5LmJ1aWxkTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gSnVzdCBhZGQgdGhlIG5ldyBtaXNzaW5nIHJvd3Mgb24gV2luZG93cyBhcyBjb25wdHkgcmVwcmludHMgdGhlIHNjcmVlbiB3aXRoIGl0J3NcbiAgICAgICAgICAgICAgLy8gdmlldyBvZiB0aGUgd29ybGQuIE9uY2UgYSBsaW5lIGVudGVycyBzY3JvbGxiYWNrIGZvciBjb25wdHkgaXQgcmVtYWlucyB0aGVyZVxuICAgICAgICAgICAgICB0aGlzLmxpbmVzLnB1c2gobmV3IEJ1ZmZlckxpbmUobmV3Q29scywgbnVsbENlbGwpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnliYXNlID4gMCAmJiB0aGlzLmxpbmVzLmxlbmd0aCA8PSB0aGlzLnliYXNlICsgdGhpcy55ICsgYWRkVG9ZICsgMSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIHJvb20gYWJvdmUgdGhlIGJ1ZmZlciBhbmQgdGhlcmUgYXJlIG5vIGVtcHR5IGVsZW1lbnRzIGJlbG93IHRoZSBsaW5lLFxuICAgICAgICAgICAgICAgIC8vIHNjcm9sbCB1cFxuICAgICAgICAgICAgICAgIHRoaXMueWJhc2UtLTtcbiAgICAgICAgICAgICAgICBhZGRUb1krKztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy55ZGlzcCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFZpZXdwb3J0IGlzIGF0IHRoZSB0b3Agb2YgdGhlIGJ1ZmZlciwgbXVzdCBpbmNyZWFzZSBkb3dud2FyZHNcbiAgICAgICAgICAgICAgICAgIHRoaXMueWRpc3AtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgYmxhbmsgbGluZSBpZiB0aGVyZSBpcyBubyBidWZmZXIgbGVmdCBhdCB0aGUgdG9wIHRvIHNjcm9sbCB0bywgb3IgaWYgdGhlcmVcbiAgICAgICAgICAgICAgICAvLyBhcmUgYmxhbmsgbGluZXMgYWZ0ZXIgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgIHRoaXMubGluZXMucHVzaChuZXcgQnVmZmVyTGluZShuZXdDb2xzLCBudWxsQ2VsbCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyAodGhpcy5fcm93cyA+PSBuZXdSb3dzKVxuICAgICAgICBmb3IgKGxldCB5ID0gdGhpcy5fcm93czsgeSA+IG5ld1Jvd3M7IHktLSkge1xuICAgICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA+IG5ld1Jvd3MgKyB0aGlzLnliYXNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiB0aGlzLnliYXNlICsgdGhpcy55ICsgMSkge1xuICAgICAgICAgICAgICAvLyBUaGUgbGluZSBpcyBhIGJsYW5rIGxpbmUgYmVsb3cgdGhlIGN1cnNvciwgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgIHRoaXMubGluZXMucG9wKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGUgbGluZSBpcyB0aGUgY3Vyc29yLCBzY3JvbGwgZG93blxuICAgICAgICAgICAgICB0aGlzLnliYXNlKys7XG4gICAgICAgICAgICAgIHRoaXMueWRpc3ArKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVkdWNlIG1heCBsZW5ndGggaWYgbmVlZGVkIGFmdGVyIGFkanVzdG1lbnRzLCB0aGlzIGlzIGRvbmUgYWZ0ZXIgYXMgaXRcbiAgICAgIC8vIHdvdWxkIG90aGVyd2lzZSBjdXQgZGF0YSBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJ1ZmZlci5cbiAgICAgIGlmIChuZXdNYXhMZW5ndGggPCB0aGlzLmxpbmVzLm1heExlbmd0aCkge1xuICAgICAgICAvLyBUcmltIGZyb20gdGhlIHRvcCBvZiB0aGUgYnVmZmVyIGFuZCBhZGp1c3QgeWJhc2UgYW5kIHlkaXNwLlxuICAgICAgICBjb25zdCBhbW91bnRUb1RyaW0gPSB0aGlzLmxpbmVzLmxlbmd0aCAtIG5ld01heExlbmd0aDtcbiAgICAgICAgaWYgKGFtb3VudFRvVHJpbSA+IDApIHtcbiAgICAgICAgICB0aGlzLmxpbmVzLnRyaW1TdGFydChhbW91bnRUb1RyaW0pO1xuICAgICAgICAgIHRoaXMueWJhc2UgPSBNYXRoLm1heCh0aGlzLnliYXNlIC0gYW1vdW50VG9UcmltLCAwKTtcbiAgICAgICAgICB0aGlzLnlkaXNwID0gTWF0aC5tYXgodGhpcy55ZGlzcCAtIGFtb3VudFRvVHJpbSwgMCk7XG4gICAgICAgICAgdGhpcy5zYXZlZFkgPSBNYXRoLm1heCh0aGlzLnNhdmVkWSAtIGFtb3VudFRvVHJpbSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saW5lcy5tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjdXJzb3Igc3RheXMgb24gc2NyZWVuXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIG5ld0NvbHMgLSAxKTtcbiAgICAgIHRoaXMueSA9IE1hdGgubWluKHRoaXMueSwgbmV3Um93cyAtIDEpO1xuICAgICAgaWYgKGFkZFRvWSkge1xuICAgICAgICB0aGlzLnkgKz0gYWRkVG9ZO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlZFggPSBNYXRoLm1pbih0aGlzLnNhdmVkWCwgbmV3Q29scyAtIDEpO1xuXG4gICAgICB0aGlzLnNjcm9sbFRvcCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSBuZXdSb3dzIC0gMTtcblxuICAgIGlmICh0aGlzLl9pc1JlZmxvd0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3JlZmxvdyhuZXdDb2xzLCBuZXdSb3dzKTtcblxuICAgICAgLy8gVHJpbSB0aGUgZW5kIG9mIHRoZSBsaW5lIG9mZiBpZiBjb2xzIHNocnVua1xuICAgICAgaWYgKHRoaXMuX2NvbHMgPiBuZXdDb2xzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vICtib29sZWFuIGZvciBmYXN0IDAgb3IgMSBjb252ZXJzaW9uXG4gICAgICAgICAgZGlydHlNZW1vcnlMaW5lcyArPSArdGhpcy5saW5lcy5nZXQoaSkhLnJlc2l6ZShuZXdDb2xzLCBudWxsQ2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jb2xzID0gbmV3Q29scztcbiAgICB0aGlzLl9yb3dzID0gbmV3Um93cztcblxuICAgIHRoaXMuX21lbW9yeUNsZWFudXBRdWV1ZS5jbGVhcigpO1xuICAgIC8vIHNjaGVkdWxlIG1lbW9yeSBjbGVhbnVwIG9ubHksIGlmIG1vcmUgdGhhbiAxMCUgb2YgdGhlIGxpbmVzIGFyZSBhZmZlY3RlZFxuICAgIGlmIChkaXJ0eU1lbW9yeUxpbmVzID4gMC4xICogdGhpcy5saW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbiA9IDA7XG4gICAgICB0aGlzLl9tZW1vcnlDbGVhbnVwUXVldWUuZW5xdWV1ZSgoKSA9PiB0aGlzLl9iYXRjaGVkTWVtb3J5Q2xlYW51cCgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9tZW1vcnlDbGVhbnVwUXVldWUgPSBuZXcgSWRsZVRhc2tRdWV1ZSgpO1xuICBwcml2YXRlIF9tZW1vcnlDbGVhbnVwUG9zaXRpb24gPSAwO1xuXG4gIHByaXZhdGUgX2JhdGNoZWRNZW1vcnlDbGVhbnVwKCk6IGJvb2xlYW4ge1xuICAgIGxldCBub3JtYWxSdW4gPSB0cnVlO1xuICAgIGlmICh0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb24gPj0gdGhpcy5saW5lcy5sZW5ndGgpIHtcbiAgICAgIC8vIGNsZWFudXAgbWFkZSBpdCBvbmNlIHRocm91Z2ggYWxsIGxpbmVzLCB0aHVzIHJlc2NhbiBpbiBsb29wIGJlbG93IHRvIGFsc28gY2F0Y2ggc2hpZnRlZFxuICAgICAgLy8gbGluZXMsIHdoaWNoIHNob3VsZCBmaW5pc2ggcmF0aGVyIHF1aWNrIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNsZWFudXBzIHBlbmRpbmdcbiAgICAgIHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbiA9IDA7XG4gICAgICBub3JtYWxSdW4gPSBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGNvdW50ZWQgPSAwO1xuICAgIHdoaWxlICh0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb24gPCB0aGlzLmxpbmVzLmxlbmd0aCkge1xuICAgICAgY291bnRlZCArPSB0aGlzLmxpbmVzLmdldCh0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb24rKykhLmNsZWFudXBNZW1vcnkoKTtcbiAgICAgIC8vIGNsZWFudXAgbWF4IDEwMCBsaW5lcyBwZXIgYmF0Y2hcbiAgICAgIGlmIChjb3VudGVkID4gMTAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBub3JtYWwgcnVucyBhbHdheXMgbmVlZCBhbm90aGVyIHJlc2NhbiBhZnRlcndhcmRzXG4gICAgLy8gaWYgd2UgbWFkZSBpdCBoZXJlIHdpdGggbm9ybWFsUnVuPWZhbHNlLCB3ZSBhcmUgaW4gYSBmaW5hbCBydW5cbiAgICAvLyBhbmQgY2FuIGVuZCB0aGUgY2xlYW51cCB0YXNrIGZvciBzdXJlXG4gICAgcmV0dXJuIG5vcm1hbFJ1bjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9pc1JlZmxvd0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgd2luZG93c1B0eSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c1B0eTtcbiAgICBpZiAod2luZG93c1B0eSAmJiB3aW5kb3dzUHR5LmJ1aWxkTnVtYmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFzU2Nyb2xsYmFjayAmJiB3aW5kb3dzUHR5LmJhY2tlbmQgPT09ICdjb25wdHknICYmIHdpbmRvd3NQdHkuYnVpbGROdW1iZXIgPj0gMjEzNzY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oYXNTY3JvbGxiYWNrICYmICF0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NNb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmbG93KG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbHMgPT09IG5ld0NvbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggcm93cywgaWdub3JlIHRoZSBsYXN0IG9uZSBhcyBpdCBjYW5ub3QgYmUgd3JhcHBlZFxuICAgIGlmIChuZXdDb2xzID4gdGhpcy5fY29scykge1xuICAgICAgdGhpcy5fcmVmbG93TGFyZ2VyKG5ld0NvbHMsIG5ld1Jvd3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWZsb3dTbWFsbGVyKG5ld0NvbHMsIG5ld1Jvd3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZmxvd0xhcmdlcihuZXdDb2xzOiBudW1iZXIsIG5ld1Jvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IHJlZmxvd0xhcmdlckdldExpbmVzVG9SZW1vdmUodGhpcy5saW5lcywgdGhpcy5fY29scywgbmV3Q29scywgdGhpcy55YmFzZSArIHRoaXMueSwgdGhpcy5nZXROdWxsQ2VsbChERUZBVUxUX0FUVFJfREFUQSkpO1xuICAgIGlmICh0b1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdMYXlvdXRSZXN1bHQgPSByZWZsb3dMYXJnZXJDcmVhdGVOZXdMYXlvdXQodGhpcy5saW5lcywgdG9SZW1vdmUpO1xuICAgICAgcmVmbG93TGFyZ2VyQXBwbHlOZXdMYXlvdXQodGhpcy5saW5lcywgbmV3TGF5b3V0UmVzdWx0LmxheW91dCk7XG4gICAgICB0aGlzLl9yZWZsb3dMYXJnZXJBZGp1c3RWaWV3cG9ydChuZXdDb2xzLCBuZXdSb3dzLCBuZXdMYXlvdXRSZXN1bHQuY291bnRSZW1vdmVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZsb3dMYXJnZXJBZGp1c3RWaWV3cG9ydChuZXdDb2xzOiBudW1iZXIsIG5ld1Jvd3M6IG51bWJlciwgY291bnRSZW1vdmVkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBudWxsQ2VsbCA9IHRoaXMuZ2V0TnVsbENlbGwoREVGQVVMVF9BVFRSX0RBVEEpO1xuICAgIC8vIEFkanVzdCB2aWV3cG9ydCBiYXNlZCBvbiBudW1iZXIgb2YgaXRlbXMgcmVtb3ZlZFxuICAgIGxldCB2aWV3cG9ydEFkanVzdG1lbnRzID0gY291bnRSZW1vdmVkO1xuICAgIHdoaWxlICh2aWV3cG9ydEFkanVzdG1lbnRzLS0gPiAwKSB7XG4gICAgICBpZiAodGhpcy55YmFzZSA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy55ID4gMCkge1xuICAgICAgICAgIHRoaXMueS0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IG5ld1Jvd3MpIHtcbiAgICAgICAgICAvLyBBZGQgYW4gZXh0cmEgcm93IGF0IHRoZSBib3R0b20gb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgICAgdGhpcy5saW5lcy5wdXNoKG5ldyBCdWZmZXJMaW5lKG5ld0NvbHMsIG51bGxDZWxsKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnlkaXNwID09PSB0aGlzLnliYXNlKSB7XG4gICAgICAgICAgdGhpcy55ZGlzcC0tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueWJhc2UtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zYXZlZFkgPSBNYXRoLm1heCh0aGlzLnNhdmVkWSAtIGNvdW50UmVtb3ZlZCwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWZsb3dTbWFsbGVyKG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbnVsbENlbGwgPSB0aGlzLmdldE51bGxDZWxsKERFRkFVTFRfQVRUUl9EQVRBKTtcbiAgICAvLyBHYXRoZXIgYWxsIEJ1ZmZlckxpbmVzIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBCdWZmZXIgaGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlXG4gICAgLy8gYmF0Y2hlZCB1cCBhbmQgb25seSBjb21taXR0ZWQgb25jZVxuICAgIGNvbnN0IHRvSW5zZXJ0ID0gW107XG4gICAgbGV0IGNvdW50VG9JbnNlcnQgPSAwO1xuICAgIC8vIEdvIGJhY2t3YXJkcyBhcyBtYW55IGxpbmVzIG1heSBiZSB0cmltbWVkIGFuZCB0aGlzIHdpbGwgYXZvaWQgY29uc2lkZXJpbmcgdGhlbVxuICAgIGZvciAobGV0IHkgPSB0aGlzLmxpbmVzLmxlbmd0aCAtIDE7IHkgPj0gMDsgeS0tKSB7XG4gICAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgbGluZSBpcyBhIHByb2JsZW1cbiAgICAgIGxldCBuZXh0TGluZSA9IHRoaXMubGluZXMuZ2V0KHkpIGFzIEJ1ZmZlckxpbmU7XG4gICAgICBpZiAoIW5leHRMaW5lIHx8ICFuZXh0TGluZS5pc1dyYXBwZWQgJiYgbmV4dExpbmUuZ2V0VHJpbW1lZExlbmd0aCgpIDw9IG5ld0NvbHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdhdGhlciB3cmFwcGVkIGxpbmVzIGFuZCBhZGp1c3QgeSB0byBiZSB0aGUgc3RhcnRpbmcgbGluZVxuICAgICAgY29uc3Qgd3JhcHBlZExpbmVzOiBCdWZmZXJMaW5lW10gPSBbbmV4dExpbmVdO1xuICAgICAgd2hpbGUgKG5leHRMaW5lLmlzV3JhcHBlZCAmJiB5ID4gMCkge1xuICAgICAgICBuZXh0TGluZSA9IHRoaXMubGluZXMuZ2V0KC0teSkgYXMgQnVmZmVyTGluZTtcbiAgICAgICAgd3JhcHBlZExpbmVzLnVuc2hpZnQobmV4dExpbmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVzZSBsaW5lcyBjb250YWluIHRoZSBjdXJzb3IgZG9uJ3QgdG91Y2ggdGhlbSwgdGhlIHByb2dyYW0gd2lsbCBoYW5kbGUgZml4aW5nIHVwXG4gICAgICAvLyB3cmFwcGVkIGxpbmVzIHdpdGggdGhlIGN1cnNvclxuICAgICAgY29uc3QgYWJzb2x1dGVZID0gdGhpcy55YmFzZSArIHRoaXMueTtcbiAgICAgIGlmIChhYnNvbHV0ZVkgPj0geSAmJiBhYnNvbHV0ZVkgPCB5ICsgd3JhcHBlZExpbmVzLmxlbmd0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFzdExpbmVMZW5ndGggPSB3cmFwcGVkTGluZXNbd3JhcHBlZExpbmVzLmxlbmd0aCAtIDFdLmdldFRyaW1tZWRMZW5ndGgoKTtcbiAgICAgIGNvbnN0IGRlc3RMaW5lTGVuZ3RocyA9IHJlZmxvd1NtYWxsZXJHZXROZXdMaW5lTGVuZ3Rocyh3cmFwcGVkTGluZXMsIHRoaXMuX2NvbHMsIG5ld0NvbHMpO1xuICAgICAgY29uc3QgbGluZXNUb0FkZCA9IGRlc3RMaW5lTGVuZ3Rocy5sZW5ndGggLSB3cmFwcGVkTGluZXMubGVuZ3RoO1xuICAgICAgbGV0IHRyaW1tZWRMaW5lczogbnVtYmVyO1xuICAgICAgaWYgKHRoaXMueWJhc2UgPT09IDAgJiYgdGhpcy55ICE9PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgLy8gSWYgdGhlIHRvcCBzZWN0aW9uIG9mIHRoZSBidWZmZXIgaXMgbm90IHlldCBmaWxsZWRcbiAgICAgICAgdHJpbW1lZExpbmVzID0gTWF0aC5tYXgoMCwgdGhpcy55IC0gdGhpcy5saW5lcy5tYXhMZW5ndGggKyBsaW5lc1RvQWRkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaW1tZWRMaW5lcyA9IE1hdGgubWF4KDAsIHRoaXMubGluZXMubGVuZ3RoIC0gdGhpcy5saW5lcy5tYXhMZW5ndGggKyBsaW5lc1RvQWRkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBuZXcgbGluZXNcbiAgICAgIGNvbnN0IG5ld0xpbmVzOiBCdWZmZXJMaW5lW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNUb0FkZDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5ld0xpbmUgPSB0aGlzLmdldEJsYW5rTGluZShERUZBVUxUX0FUVFJfREFUQSwgdHJ1ZSkgYXMgQnVmZmVyTGluZTtcbiAgICAgICAgbmV3TGluZXMucHVzaChuZXdMaW5lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRvSW5zZXJ0LnB1c2goe1xuICAgICAgICAgIC8vIGNvdW50VG9JbnNlcnQgaGVyZSBnZXRzIHRoZSBhY3R1YWwgaW5kZXgsIHRha2luZyBpbnRvIGFjY291bnQgb3RoZXIgaW5zZXJ0ZWQgaXRlbXMuXG4gICAgICAgICAgLy8gdXNpbmcgdGhpcyB3ZSBjYW4gaXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IGZvcndhcmRzXG4gICAgICAgICAgc3RhcnQ6IHkgKyB3cmFwcGVkTGluZXMubGVuZ3RoICsgY291bnRUb0luc2VydCxcbiAgICAgICAgICBuZXdMaW5lc1xuICAgICAgICB9KTtcbiAgICAgICAgY291bnRUb0luc2VydCArPSBuZXdMaW5lcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICB3cmFwcGVkTGluZXMucHVzaCguLi5uZXdMaW5lcyk7XG5cbiAgICAgIC8vIENvcHkgYnVmZmVyIGRhdGEgdG8gbmV3IGxvY2F0aW9ucywgdGhpcyBuZWVkcyB0byBoYXBwZW4gYmFja3dhcmRzIHRvIGRvIGluLXBsYWNlXG4gICAgICBsZXQgZGVzdExpbmVJbmRleCA9IGRlc3RMaW5lTGVuZ3Rocy5sZW5ndGggLSAxOyAvLyBNYXRoLmZsb29yKGNlbGxzTmVlZGVkIC8gbmV3Q29scyk7XG4gICAgICBsZXQgZGVzdENvbCA9IGRlc3RMaW5lTGVuZ3Roc1tkZXN0TGluZUluZGV4XTsgLy8gY2VsbHNOZWVkZWQgJSBuZXdDb2xzO1xuICAgICAgaWYgKGRlc3RDb2wgPT09IDApIHtcbiAgICAgICAgZGVzdExpbmVJbmRleC0tO1xuICAgICAgICBkZXN0Q29sID0gZGVzdExpbmVMZW5ndGhzW2Rlc3RMaW5lSW5kZXhdO1xuICAgICAgfVxuICAgICAgbGV0IHNyY0xpbmVJbmRleCA9IHdyYXBwZWRMaW5lcy5sZW5ndGggLSBsaW5lc1RvQWRkIC0gMTtcbiAgICAgIGxldCBzcmNDb2wgPSBsYXN0TGluZUxlbmd0aDtcbiAgICAgIHdoaWxlIChzcmNMaW5lSW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBjZWxsc1RvQ29weSA9IE1hdGgubWluKHNyY0NvbCwgZGVzdENvbCk7XG4gICAgICAgIGlmICh3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHRoZSBsaW5lIGV4aXN0cywgdGhpcyBoYXMgYmVlbiBrbm93biB0byBmYWlsIGZvciBhbiB1bmtub3duIHJlYXNvblxuICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIHN0b3AgdGhlIHJlZmxvdyBmcm9tIGhhcHBlbmluZyBpZiBhbiBleGNlcHRpb24gd291bGQgdGhyb3cuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXhdLmNvcHlDZWxsc0Zyb20od3JhcHBlZExpbmVzW3NyY0xpbmVJbmRleF0sIHNyY0NvbCAtIGNlbGxzVG9Db3B5LCBkZXN0Q29sIC0gY2VsbHNUb0NvcHksIGNlbGxzVG9Db3B5LCB0cnVlKTtcbiAgICAgICAgZGVzdENvbCAtPSBjZWxsc1RvQ29weTtcbiAgICAgICAgaWYgKGRlc3RDb2wgPT09IDApIHtcbiAgICAgICAgICBkZXN0TGluZUluZGV4LS07XG4gICAgICAgICAgZGVzdENvbCA9IGRlc3RMaW5lTGVuZ3Roc1tkZXN0TGluZUluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBzcmNDb2wgLT0gY2VsbHNUb0NvcHk7XG4gICAgICAgIGlmIChzcmNDb2wgPT09IDApIHtcbiAgICAgICAgICBzcmNMaW5lSW5kZXgtLTtcbiAgICAgICAgICBjb25zdCB3cmFwcGVkTGluZXNJbmRleCA9IE1hdGgubWF4KHNyY0xpbmVJbmRleCwgMCk7XG4gICAgICAgICAgc3JjQ29sID0gZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoKHdyYXBwZWRMaW5lcywgd3JhcHBlZExpbmVzSW5kZXgsIHRoaXMuX2NvbHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE51bGwgb3V0IHRoZSBlbmQgb2YgdGhlIGxpbmUgZW5kcyBpZiBhIHdpZGUgY2hhcmFjdGVyIHdyYXBwZWQgdG8gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXBwZWRMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZGVzdExpbmVMZW5ndGhzW2ldIDwgbmV3Q29scykge1xuICAgICAgICAgIHdyYXBwZWRMaW5lc1tpXS5zZXRDZWxsKGRlc3RMaW5lTGVuZ3Roc1tpXSwgbnVsbENlbGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB2aWV3cG9ydCBhcyBuZWVkZWRcbiAgICAgIGxldCB2aWV3cG9ydEFkanVzdG1lbnRzID0gbGluZXNUb0FkZCAtIHRyaW1tZWRMaW5lcztcbiAgICAgIHdoaWxlICh2aWV3cG9ydEFkanVzdG1lbnRzLS0gPiAwKSB7XG4gICAgICAgIGlmICh0aGlzLnliYXNlID09PSAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMueSA8IG5ld1Jvd3MgLSAxKSB7XG4gICAgICAgICAgICB0aGlzLnkrKztcbiAgICAgICAgICAgIHRoaXMubGluZXMucG9wKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMueWJhc2UrKztcbiAgICAgICAgICAgIHRoaXMueWRpc3ArKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRW5zdXJlIHliYXNlIGRvZXMgbm90IGV4Y2VlZCBpdHMgbWF4aW11bSB2YWx1ZVxuICAgICAgICAgIGlmICh0aGlzLnliYXNlIDwgTWF0aC5taW4odGhpcy5saW5lcy5tYXhMZW5ndGgsIHRoaXMubGluZXMubGVuZ3RoICsgY291bnRUb0luc2VydCkgLSBuZXdSb3dzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy55YmFzZSA9PT0gdGhpcy55ZGlzcCkge1xuICAgICAgICAgICAgICB0aGlzLnlkaXNwKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnliYXNlKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNhdmVkWSA9IE1hdGgubWluKHRoaXMuc2F2ZWRZICsgbGluZXNUb0FkZCwgdGhpcy55YmFzZSArIG5ld1Jvd3MgLSAxKTtcbiAgICB9XG5cbiAgICAvLyBSZWFycmFuZ2UgbGluZXMgaW4gdGhlIGJ1ZmZlciBpZiB0aGVyZSBhcmUgYW55IGluc2VydGlvbnMsIHRoaXMgaXMgZG9uZSBhdCB0aGUgZW5kIHJhdGhlclxuICAgIC8vIHRoYW4gZWFybGllciBzbyB0aGF0IGl0J3MgYSBzaW5nbGUgTyhuKSBwYXNzIHRocm91Z2ggdGhlIGJ1ZmZlciwgaW5zdGVhZCBvZiBPKG5eMikgZnJvbSBtYW55XG4gICAgLy8gY29zdGx5IGNhbGxzIHRvIENpcmN1bGFyTGlzdC5zcGxpY2UuXG4gICAgaWYgKHRvSW5zZXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFJlY29yZCBidWZmZXIgaW5zZXJ0IGV2ZW50cyBhbmQgdGhlbiBwbGF5IHRoZW0gYmFjayBiYWNrd2FyZHMgc28gdGhhdCB0aGUgaW5kZXhlcyBhcmVcbiAgICAgIC8vIGNvcnJlY3RcbiAgICAgIGNvbnN0IGluc2VydEV2ZW50czogSUluc2VydEV2ZW50W10gPSBbXTtcblxuICAgICAgLy8gUmVjb3JkIG9yaWdpbmFsIGxpbmVzIHNvIHRoZXkgZG9uJ3QgZ2V0IG92ZXJyaWRkZW4gd2hlbiB3ZSByZWFycmFuZ2UgdGhlIGxpc3RcbiAgICAgIGNvbnN0IG9yaWdpbmFsTGluZXM6IEJ1ZmZlckxpbmVbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9yaWdpbmFsTGluZXMucHVzaCh0aGlzLmxpbmVzLmdldChpKSBhcyBCdWZmZXJMaW5lKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yaWdpbmFsTGluZXNMZW5ndGggPSB0aGlzLmxpbmVzLmxlbmd0aDtcblxuICAgICAgbGV0IG9yaWdpbmFsTGluZUluZGV4ID0gb3JpZ2luYWxMaW5lc0xlbmd0aCAtIDE7XG4gICAgICBsZXQgbmV4dFRvSW5zZXJ0SW5kZXggPSAwO1xuICAgICAgbGV0IG5leHRUb0luc2VydCA9IHRvSW5zZXJ0W25leHRUb0luc2VydEluZGV4XTtcbiAgICAgIHRoaXMubGluZXMubGVuZ3RoID0gTWF0aC5taW4odGhpcy5saW5lcy5tYXhMZW5ndGgsIHRoaXMubGluZXMubGVuZ3RoICsgY291bnRUb0luc2VydCk7XG4gICAgICBsZXQgY291bnRJbnNlcnRlZFNvRmFyID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1pbih0aGlzLmxpbmVzLm1heExlbmd0aCAtIDEsIG9yaWdpbmFsTGluZXNMZW5ndGggKyBjb3VudFRvSW5zZXJ0IC0gMSk7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChuZXh0VG9JbnNlcnQgJiYgbmV4dFRvSW5zZXJ0LnN0YXJ0ID4gb3JpZ2luYWxMaW5lSW5kZXggKyBjb3VudEluc2VydGVkU29GYXIpIHtcbiAgICAgICAgICAvLyBJbnNlcnQgZXh0cmEgbGluZXMgaGVyZSwgYWRqdXN0aW5nIGkgYXMgbmVlZGVkXG4gICAgICAgICAgZm9yIChsZXQgbmV4dEkgPSBuZXh0VG9JbnNlcnQubmV3TGluZXMubGVuZ3RoIC0gMTsgbmV4dEkgPj0gMDsgbmV4dEktLSkge1xuICAgICAgICAgICAgdGhpcy5saW5lcy5zZXQoaS0tLCBuZXh0VG9JbnNlcnQubmV3TGluZXNbbmV4dEldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSsrO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGluc2VydCBldmVudHMgZm9yIGxhdGVyXG4gICAgICAgICAgaW5zZXJ0RXZlbnRzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IG9yaWdpbmFsTGluZUluZGV4ICsgMSxcbiAgICAgICAgICAgIGFtb3VudDogbmV4dFRvSW5zZXJ0Lm5ld0xpbmVzLmxlbmd0aFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY291bnRJbnNlcnRlZFNvRmFyICs9IG5leHRUb0luc2VydC5uZXdMaW5lcy5sZW5ndGg7XG4gICAgICAgICAgbmV4dFRvSW5zZXJ0ID0gdG9JbnNlcnRbKytuZXh0VG9JbnNlcnRJbmRleF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5saW5lcy5zZXQoaSwgb3JpZ2luYWxMaW5lc1tvcmlnaW5hbExpbmVJbmRleC0tXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIG1hcmtlcnNcbiAgICAgIGxldCBpbnNlcnRDb3VudEVtaXR0ZWQgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IGluc2VydEV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpbnNlcnRFdmVudHNbaV0uaW5kZXggKz0gaW5zZXJ0Q291bnRFbWl0dGVkO1xuICAgICAgICB0aGlzLmxpbmVzLm9uSW5zZXJ0RW1pdHRlci5maXJlKGluc2VydEV2ZW50c1tpXSk7XG4gICAgICAgIGluc2VydENvdW50RW1pdHRlZCArPSBpbnNlcnRFdmVudHNbaV0uYW1vdW50O1xuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50VG9UcmltID0gTWF0aC5tYXgoMCwgb3JpZ2luYWxMaW5lc0xlbmd0aCArIGNvdW50VG9JbnNlcnQgLSB0aGlzLmxpbmVzLm1heExlbmd0aCk7XG4gICAgICBpZiAoYW1vdW50VG9UcmltID4gMCkge1xuICAgICAgICB0aGlzLmxpbmVzLm9uVHJpbUVtaXR0ZXIuZmlyZShhbW91bnRUb1RyaW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2xhdGVzIGEgYnVmZmVyIGxpbmUgdG8gYSBzdHJpbmcsIHdpdGggb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCBjb2x1bW5zLlxuICAgKiBXaWRlIGNoYXJhY3RlcnMgd2lsbCBjb3VudCBhcyB0d28gY29sdW1ucyBpbiB0aGUgcmVzdWx0aW5nIHN0cmluZy4gVGhpc1xuICAgKiBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGdldHRpbmcgdGhlIGFjdHVhbCB0ZXh0IHVuZGVybmVhdGggdGhlIHJhdyBzZWxlY3Rpb25cbiAgICogcG9zaXRpb24uXG4gICAqIEBwYXJhbSBsaW5lSW5kZXggVGhlIGFic29sdXRlIGluZGV4IG9mIHRoZSBsaW5lIGJlaW5nIHRyYW5zbGF0ZWQuXG4gICAqIEBwYXJhbSB0cmltUmlnaHQgV2hldGhlciB0byB0cmltIHdoaXRlc3BhY2UgdG8gdGhlIHJpZ2h0LlxuICAgKiBAcGFyYW0gc3RhcnRDb2wgVGhlIGNvbHVtbiB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIGVuZENvbCBUaGUgY29sdW1uIHRvIGVuZCBhdC5cbiAgICovXG4gIHB1YmxpYyB0cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcobGluZUluZGV4OiBudW1iZXIsIHRyaW1SaWdodDogYm9vbGVhbiwgc3RhcnRDb2w6IG51bWJlciA9IDAsIGVuZENvbD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZSA9IHRoaXMubGluZXMuZ2V0KGxpbmVJbmRleCk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBsaW5lLnRyYW5zbGF0ZVRvU3RyaW5nKHRyaW1SaWdodCwgc3RhcnRDb2wsIGVuZENvbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0V3JhcHBlZFJhbmdlRm9yTGluZSh5OiBudW1iZXIpOiB7IGZpcnN0OiBudW1iZXIsIGxhc3Q6IG51bWJlciB9IHtcbiAgICBsZXQgZmlyc3QgPSB5O1xuICAgIGxldCBsYXN0ID0geTtcbiAgICAvLyBTY2FuIHVwd2FyZHMgZm9yIHdyYXBwZWQgbGluZXNcbiAgICB3aGlsZSAoZmlyc3QgPiAwICYmIHRoaXMubGluZXMuZ2V0KGZpcnN0KSEuaXNXcmFwcGVkKSB7XG4gICAgICBmaXJzdC0tO1xuICAgIH1cbiAgICAvLyBTY2FuIGRvd253YXJkcyBmb3Igd3JhcHBlZCBsaW5lc1xuICAgIHdoaWxlIChsYXN0ICsgMSA8IHRoaXMubGluZXMubGVuZ3RoICYmIHRoaXMubGluZXMuZ2V0KGxhc3QgKyAxKSEuaXNXcmFwcGVkKSB7XG4gICAgICBsYXN0Kys7XG4gICAgfVxuICAgIHJldHVybiB7IGZpcnN0LCBsYXN0IH07XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgdGhlIHRhYiBzdG9wcy5cbiAgICogQHBhcmFtIGkgVGhlIGluZGV4IHRvIHN0YXJ0IHNldHRpbmcgdXAgdGFiIHN0b3BzIGZyb20uXG4gICAqL1xuICBwdWJsaWMgc2V0dXBUYWJTdG9wcyhpPzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGkgIT09IG51bGwgJiYgaSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXRoaXMudGFic1tpXSkge1xuICAgICAgICBpID0gdGhpcy5wcmV2U3RvcChpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJzID0ge307XG4gICAgICBpID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKDsgaSA8IHRoaXMuX2NvbHM7IGkgKz0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy50YWJTdG9wV2lkdGgpIHtcbiAgICAgIHRoaXMudGFic1tpXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgdGFiIHN0b3AgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24gKGRlZmF1bHQgaXMgY3VycmVudCkuXG4gICAqIEBwYXJhbSB4IFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIHRhYiBzdG9wLlxuICAgKi9cbiAgcHVibGljIHByZXZTdG9wKHg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgeCA9IHRoaXMueDtcbiAgICB9XG4gICAgd2hpbGUgKCF0aGlzLnRhYnNbLS14XSAmJiB4ID4gMCk7XG4gICAgcmV0dXJuIHggPj0gdGhpcy5fY29scyA/IHRoaXMuX2NvbHMgLSAxIDogeCA8IDAgPyAwIDogeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBjdXJzb3Igb25lIHRhYiBzdG9wIGZvcndhcmQgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24gKGRlZmF1bHQgaXMgY3VycmVudCkuXG4gICAqIEBwYXJhbSB4IFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBjdXJzb3Igb25lIHRhYiBzdG9wIGZvcndhcmQuXG4gICAqL1xuICBwdWJsaWMgbmV4dFN0b3AoeD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB4ID0gdGhpcy54O1xuICAgIH1cbiAgICB3aGlsZSAoIXRoaXMudGFic1srK3hdICYmIHggPCB0aGlzLl9jb2xzKTtcbiAgICByZXR1cm4geCA+PSB0aGlzLl9jb2xzID8gdGhpcy5fY29scyAtIDEgOiB4IDwgMCA/IDAgOiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBtYXJrZXJzIG9uIHNpbmdsZSBsaW5lLlxuICAgKiBAcGFyYW0geSBUaGUgbGluZSB0byBjbGVhci5cbiAgICovXG4gIHB1YmxpYyBjbGVhck1hcmtlcnMoeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faXNDbGVhcmluZyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLm1hcmtlcnNbaV0ubGluZSA9PT0geSkge1xuICAgICAgICB0aGlzLm1hcmtlcnNbaV0uZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLm1hcmtlcnMuc3BsaWNlKGktLSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2lzQ2xlYXJpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgbWFya2VycyBvbiBhbGwgbGluZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckFsbE1hcmtlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5faXNDbGVhcmluZyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubWFya2Vyc1tpXS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm1hcmtlcnMuc3BsaWNlKGktLSwgMSk7XG4gICAgfVxuICAgIHRoaXMuX2lzQ2xlYXJpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNYXJrZXIoeTogbnVtYmVyKTogTWFya2VyIHtcbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgTWFya2VyKHkpO1xuICAgIHRoaXMubWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgbWFya2VyLnJlZ2lzdGVyKHRoaXMubGluZXMub25UcmltKGFtb3VudCA9PiB7XG4gICAgICBtYXJrZXIubGluZSAtPSBhbW91bnQ7XG4gICAgICAvLyBUaGUgbWFya2VyIHNob3VsZCBiZSBkaXNwb3NlZCB3aGVuIHRoZSBsaW5lIGlzIHRyaW1tZWQgZnJvbSB0aGUgYnVmZmVyXG4gICAgICBpZiAobWFya2VyLmxpbmUgPCAwKSB7XG4gICAgICAgIG1hcmtlci5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIG1hcmtlci5yZWdpc3Rlcih0aGlzLmxpbmVzLm9uSW5zZXJ0KGV2ZW50ID0+IHtcbiAgICAgIGlmIChtYXJrZXIubGluZSA+PSBldmVudC5pbmRleCkge1xuICAgICAgICBtYXJrZXIubGluZSArPSBldmVudC5hbW91bnQ7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIG1hcmtlci5yZWdpc3Rlcih0aGlzLmxpbmVzLm9uRGVsZXRlKGV2ZW50ID0+IHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgbWFya2VyIGlmIGl0J3Mgd2l0aGluIHRoZSByYW5nZVxuICAgICAgaWYgKG1hcmtlci5saW5lID49IGV2ZW50LmluZGV4ICYmIG1hcmtlci5saW5lIDwgZXZlbnQuaW5kZXggKyBldmVudC5hbW91bnQpIHtcbiAgICAgICAgbWFya2VyLmRpc3Bvc2UoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hpZnQgdGhlIG1hcmtlciBpZiBpdCdzIGFmdGVyIHRoZSBkZWxldGVkIHJhbmdlXG4gICAgICBpZiAobWFya2VyLmxpbmUgPiBldmVudC5pbmRleCkge1xuICAgICAgICBtYXJrZXIubGluZSAtPSBldmVudC5hbW91bnQ7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIG1hcmtlci5yZWdpc3RlcihtYXJrZXIub25EaXNwb3NlKCgpID0+IHRoaXMuX3JlbW92ZU1hcmtlcihtYXJrZXIpKSk7XG4gICAgcmV0dXJuIG1hcmtlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZU1hcmtlcihtYXJrZXI6IE1hcmtlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNDbGVhcmluZykge1xuICAgICAgdGhpcy5tYXJrZXJzLnNwbGljZSh0aGlzLm1hcmtlcnMuaW5kZXhPZihtYXJrZXIpLCAxKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ2hhckRhdGEsIElBdHRyaWJ1dGVEYXRhLCBJQnVmZmVyTGluZSwgSUNlbGxEYXRhLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBCZ0ZsYWdzLCBDSEFSX0RBVEFfQVRUUl9JTkRFWCwgQ0hBUl9EQVRBX0NIQVJfSU5ERVgsIENIQVJfREFUQV9XSURUSF9JTkRFWCwgQ29udGVudCwgTlVMTF9DRUxMX0NIQVIsIE5VTExfQ0VMTF9DT0RFLCBOVUxMX0NFTExfV0lEVEgsIFdISVRFU1BBQ0VfQ0VMTF9DSEFSIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgc3RyaW5nRnJvbUNvZGVQb2ludCB9IGZyb20gJ2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlcic7XG5cbi8qKlxuICogYnVmZmVyIG1lbW9yeSBsYXlvdXQ6XG4gKlxuICogICB8ICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIHwgICAgICAgIHVpbnQzMl90ICAgICAgICAgfCAgICAgICAgdWludDMyX3QgICAgICAgICB8XG4gKiAgIHwgICAgICAgICAgICAgYGNvbnRlbnRgICAgICAgICAgICAgfCAgICAgICAgICBgRkdgICAgICAgICAgICB8ICAgICAgICAgIGBCR2AgICAgICAgICAgIHxcbiAqICAgfCB3Y3dpZHRoKDIpIGNvbWIoMSkgY29kZXBvaW50KDIxKSB8IGZsYWdzKDgpIFIoOCkgRyg4KSBCKDgpIHwgZmxhZ3MoOCkgUig4KSBHKDgpIEIoOCkgfFxuICovXG5cblxuLyoqIHR5cGVkIGFycmF5IHNsb3RzIHRha2VuIGJ5IG9uZSBjZWxsICovXG5jb25zdCBDRUxMX1NJWkUgPSAzO1xuXG4vKipcbiAqIENlbGwgbWVtYmVyIGluZGljZXMuXG4gKlxuICogRGlyZWN0IGFjY2VzczpcbiAqICAgIGBjb250ZW50ID0gZGF0YVtjb2x1bW4gKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdO2BcbiAqICAgIGBmZyA9IGRhdGFbY29sdW1uICogQ0VMTF9TSVpFICsgQ2VsbC5GR107YFxuICogICAgYGJnID0gZGF0YVtjb2x1bW4gKiBDRUxMX1NJWkUgKyBDZWxsLkJHXTtgXG4gKi9cbmNvbnN0IGVudW0gQ2VsbCB7XG4gIENPTlRFTlQgPSAwLFxuICBGRyA9IDEsIC8vIGN1cnJlbnRseSBzaW1wbHkgaG9sZHMgYWxsIGtub3duIGF0dHJzXG4gIEJHID0gMiAgLy8gY3VycmVudGx5IHVudXNlZFxufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BVFRSX0RBVEEgPSBPYmplY3QuZnJlZXplKG5ldyBBdHRyaWJ1dGVEYXRhKCkpO1xuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkc3RhcnRJbmRleCA9IDA7XG5cbi8qKiBGYWN0b3Igd2hlbiB0byBjbGVhbnVwIHVuZGVybHlpbmcgYXJyYXkgYnVmZmVyIGFmdGVyIHNocmlua2luZy4gKi9cbmNvbnN0IENMRUFOVVBfVEhSRVNIT0xEID0gMjtcblxuLyoqXG4gKiBUeXBlZCBhcnJheSBiYXNlZCBidWZmZXJsaW5lIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoZXJlIGFyZSAyIHdheXMgdG8gaW5zZXJ0IGRhdGEgaW50byB0aGUgY2VsbCBidWZmZXI6XG4gKiAtIGBzZXRDZWxsRnJvbUNvZGVwb2ludGAgKyBgYWRkQ29kZXBvaW50VG9DZWxsYFxuICogICBVc2UgdGhlc2UgZm9yIGRhdGEgdGhhdCBpcyBhbHJlYWR5IFVURjMyLlxuICogICBVc2VkIGR1cmluZyBub3JtYWwgaW5wdXQgaW4gYElucHV0SGFuZGxlcmAgZm9yIGZhc3RlciBidWZmZXIgYWNjZXNzLlxuICogLSBgc2V0Q2VsbGBcbiAqICAgVGhpcyBtZXRob2QgdGFrZXMgYSBDZWxsRGF0YSBvYmplY3QgYW5kIHN0b3JlcyB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyLlxuICogICBVc2UgYENlbGxEYXRhLmZyb21DaGFyRGF0YWAgdG8gY3JlYXRlIHRoZSBDZWxsRGF0YSBvYmplY3QgKGUuZy4gZnJvbSBKUyBzdHJpbmcpLlxuICpcbiAqIFRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHVzZSBlaXRoZXIgb25lIG9mIHRoZSBwcmltaXRpdmUgbWV0aG9kc1xuICogKGlmIG9ubHkgb25lIHBhcnRpY3VsYXIgdmFsdWUgaXMgbmVlZGVkKSBvciBgbG9hZENlbGxgLiBGb3IgYGxvYWRDZWxsYCBpbiBhIGxvb3BcbiAqIG1lbW9yeSBhbGxvY3MgLyBHQyBwcmVzc3VyZSBjYW4gYmUgZ3JlYXRseSByZWR1Y2VkIGJ5IHJldXNpbmcgdGhlIENlbGxEYXRhIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1ZmZlckxpbmUgaW1wbGVtZW50cyBJQnVmZmVyTGluZSB7XG4gIHByb3RlY3RlZCBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByb3RlY3RlZCBfY29tYmluZWQ6IHtbaW5kZXg6IG51bWJlcl06IHN0cmluZ30gPSB7fTtcbiAgcHJvdGVjdGVkIF9leHRlbmRlZEF0dHJzOiB7W2luZGV4OiBudW1iZXJdOiBJRXh0ZW5kZWRBdHRycyB8IHVuZGVmaW5lZH0gPSB7fTtcbiAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbHM6IG51bWJlciwgZmlsbENlbGxEYXRhPzogSUNlbGxEYXRhLCBwdWJsaWMgaXNXcmFwcGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLl9kYXRhID0gbmV3IFVpbnQzMkFycmF5KGNvbHMgKiBDRUxMX1NJWkUpO1xuICAgIGNvbnN0IGNlbGwgPSBmaWxsQ2VsbERhdGEgfHwgQ2VsbERhdGEuZnJvbUNoYXJEYXRhKFswLCBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX1dJRFRILCBOVUxMX0NFTExfQ09ERV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sczsgKytpKSB7XG4gICAgICB0aGlzLnNldENlbGwoaSwgY2VsbCk7XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gY29scztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2VsbCBkYXRhIENoYXJEYXRhLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogQ2hhckRhdGEge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXTtcbiAgICBjb25zdCBjcCA9IGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5GR10sXG4gICAgICAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSylcbiAgICAgICAgPyB0aGlzLl9jb21iaW5lZFtpbmRleF1cbiAgICAgICAgOiAoY3ApID8gc3RyaW5nRnJvbUNvZGVQb2ludChjcCkgOiAnJyxcbiAgICAgIGNvbnRlbnQgPj4gQ29udGVudC5XSURUSF9TSElGVCxcbiAgICAgIChjb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKVxuICAgICAgICA/IHRoaXMuX2NvbWJpbmVkW2luZGV4XS5jaGFyQ29kZUF0KHRoaXMuX2NvbWJpbmVkW2luZGV4XS5sZW5ndGggLSAxKVxuICAgICAgICA6IGNwXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2VsbCBkYXRhIGZyb20gQ2hhckRhdGEuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgc2V0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBDaGFyRGF0YSk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXSA9IHZhbHVlW0NIQVJfREFUQV9BVFRSX0lOREVYXTtcbiAgICBpZiAodmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX2NvbWJpbmVkW2luZGV4XSA9IHZhbHVlWzFdO1xuICAgICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPSBpbmRleCB8IENvbnRlbnQuSVNfQ09NQklORURfTUFTSyB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDApIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHByaW1pdGl2ZSBnZXR0ZXJzXG4gICAqIHVzZSB0aGVzZSB3aGVuIG9ubHkgb25lIHZhbHVlIGlzIG5lZWRlZCwgb3RoZXJ3aXNlIHVzZSBgbG9hZENlbGxgXG4gICAqL1xuICBwdWJsaWMgZ2V0V2lkdGgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID4+IENvbnRlbnQuV0lEVEhfU0hJRlQ7XG4gIH1cblxuICAvKiogVGVzdCB3aGV0aGVyIGNvbnRlbnQgaGFzIHdpZHRoLiAqL1xuICBwdWJsaWMgaGFzV2lkdGgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdICYgQ29udGVudC5XSURUSF9NQVNLO1xuICB9XG5cbiAgLyoqIEdldCBGRyBjZWxsIGNvbXBvbmVudC4gKi9cbiAgcHVibGljIGdldEZnKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5GR107XG4gIH1cblxuICAvKiogR2V0IEJHIGNlbGwgY29tcG9uZW50LiAqL1xuICBwdWJsaWMgZ2V0QmcoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkJHXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IHdoZXRoZXIgY29udGFpbnMgYW55IGNoYXJzLlxuICAgKiBCYXNpY2FsbHkgYW4gZW1wdHkgaGFzIG5vIGNvbnRlbnQsIGJ1dCBvdGhlciBjZWxscyBtaWdodCBkaWZmZXIgaW4gRkcvQkdcbiAgICogZnJvbSByZWFsIGVtcHR5IGNlbGxzLlxuICAgKi9cbiAgcHVibGljIGhhc0NvbnRlbnQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdICYgQ29udGVudC5IQVNfQ09OVEVOVF9NQVNLO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2RlcG9pbnQgb2YgdGhlIGNlbGwuXG4gICAqIFRvIGJlIGluIGxpbmUgd2l0aCBgY29kZWAgaW4gQ2hhckRhdGEgdGhpcyBlaXRoZXIgcmV0dXJuc1xuICAgKiBhIHNpbmdsZSBVVEYzMiBjb2RlcG9pbnQgb3IgdGhlIGxhc3QgY29kZXBvaW50IG9mIGEgY29tYmluZWQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGdldENvZGVQb2ludChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF07XG4gICAgaWYgKGNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb21iaW5lZFtpbmRleF0uY2hhckNvZGVBdCh0aGlzLl9jb21iaW5lZFtpbmRleF0ubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSztcbiAgfVxuXG4gIC8qKiBUZXN0IHdoZXRoZXIgdGhlIGNlbGwgY29udGFpbnMgYSBjb21iaW5lZCBzdHJpbmcuICovXG4gIHB1YmxpYyBpc0NvbWJpbmVkKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgY29udGVudCBvZiB0aGUgY2VsbC4gKi9cbiAgcHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF07XG4gICAgaWYgKGNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb21iaW5lZFtpbmRleF07XG4gICAgfVxuICAgIGlmIChjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgcmV0dXJuIHN0cmluZ0Zyb21Db2RlUG9pbnQoY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0spO1xuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgc3RyaW5nIGZvciBlbXB0eSBjZWxsc1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKiBHZXQgc3RhdGUgb2YgcHJvdGVjdGVkIGZsYWcuICovXG4gIHB1YmxpYyBpc1Byb3RlY3RlZChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddICYgQmdGbGFncy5QUk9URUNURUQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBkYXRhIGF0IGBpbmRleGAgaW50byBgY2VsbGAuIFRoaXMgaXMgdXNlZCB0byBhY2Nlc3MgY2VsbHMgaW4gYSB3YXkgdGhhdCdzIG1vcmUgZnJpZW5kbHlcbiAgICogdG8gR0MgYXMgaXQgc2lnbmlmaWNhbnRseSByZWR1Y2VkIHRoZSBhbW91bnQgb2YgbmV3IG9iamVjdHMvcmVmZXJlbmNlcyBuZWVkZWQuXG4gICAqL1xuICBwdWJsaWMgbG9hZENlbGwoaW5kZXg6IG51bWJlciwgY2VsbDogSUNlbGxEYXRhKTogSUNlbGxEYXRhIHtcbiAgICAkc3RhcnRJbmRleCA9IGluZGV4ICogQ0VMTF9TSVpFO1xuICAgIGNlbGwuY29udGVudCA9IHRoaXMuX2RhdGFbJHN0YXJ0SW5kZXggKyBDZWxsLkNPTlRFTlRdO1xuICAgIGNlbGwuZmcgPSB0aGlzLl9kYXRhWyRzdGFydEluZGV4ICsgQ2VsbC5GR107XG4gICAgY2VsbC5iZyA9IHRoaXMuX2RhdGFbJHN0YXJ0SW5kZXggKyBDZWxsLkJHXTtcbiAgICBpZiAoY2VsbC5jb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKSB7XG4gICAgICBjZWxsLmNvbWJpbmVkRGF0YSA9IHRoaXMuX2NvbWJpbmVkW2luZGV4XTtcbiAgICB9XG4gICAgaWYgKGNlbGwuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkge1xuICAgICAgY2VsbC5leHRlbmRlZCA9IHRoaXMuX2V4dGVuZGVkQXR0cnNbaW5kZXhdITtcbiAgICB9XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRhdGEgYXQgYGluZGV4YCB0byBgY2VsbGAuXG4gICAqL1xuICBwdWJsaWMgc2V0Q2VsbChpbmRleDogbnVtYmVyLCBjZWxsOiBJQ2VsbERhdGEpOiB2b2lkIHtcbiAgICBpZiAoY2VsbC5jb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKSB7XG4gICAgICB0aGlzLl9jb21iaW5lZFtpbmRleF0gPSBjZWxsLmNvbWJpbmVkRGF0YTtcbiAgICB9XG4gICAgaWYgKGNlbGwuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkge1xuICAgICAgdGhpcy5fZXh0ZW5kZWRBdHRyc1tpbmRleF0gPSBjZWxsLmV4dGVuZGVkO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA9IGNlbGwuY29udGVudDtcbiAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5GR10gPSBjZWxsLmZnO1xuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkJHXSA9IGNlbGwuYmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNlbGwgZGF0YSBmcm9tIGlucHV0IGhhbmRsZXIuXG4gICAqIFNpbmNlIHRoZSBpbnB1dCBoYW5kbGVyIHNlZSB0aGUgaW5jb21pbmcgY2hhcnMgYXMgVVRGMzIgY29kZXBvaW50cyxcbiAgICogaXQgZ2V0cyBhbiBvcHRpbWl6ZWQgYWNjZXNzIG1ldGhvZC5cbiAgICovXG4gIHB1YmxpYyBzZXRDZWxsRnJvbUNvZGVwb2ludChpbmRleDogbnVtYmVyLCBjb2RlUG9pbnQ6IG51bWJlciwgd2lkdGg6IG51bWJlciwgYXR0cnM6IElBdHRyaWJ1dGVEYXRhKTogdm9pZCB7XG4gICAgaWYgKGF0dHJzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpIHtcbiAgICAgIHRoaXMuX2V4dGVuZGVkQXR0cnNbaW5kZXhdID0gYXR0cnMuZXh0ZW5kZWQ7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID0gY29kZVBvaW50IHwgKHdpZHRoIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXSA9IGF0dHJzLmZnO1xuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkJHXSA9IGF0dHJzLmJnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvZGVwb2ludCB0byBhIGNlbGwgZnJvbSBpbnB1dCBoYW5kbGVyLlxuICAgKiBEdXJpbmcgaW5wdXQgc3RhZ2UgY29tYmluaW5nIGNoYXJzIHdpdGggYSB3aWR0aCBvZiAwIGZvbGxvdyBhbmQgc3RhY2tcbiAgICogb250byBhIGxlYWRpbmcgY2hhci4gU2luY2Ugd2UgYWxyZWFkeSBzZXQgdGhlIGF0dHJzXG4gICAqIGJ5IHRoZSBwcmV2aW91cyBgc2V0RGF0YUZyb21Db2RlUG9pbnRgIGNhbGwsIHdlIGNhbiBvbWl0IGl0IGhlcmUuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29kZXBvaW50VG9DZWxsKGluZGV4OiBudW1iZXIsIGNvZGVQb2ludDogbnVtYmVyLCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGNvbnRlbnQgPSB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXTtcbiAgICBpZiAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIGEgY29tYmluZWQgc3RyaW5nLCBzaW1wbHkgYWRkXG4gICAgICB0aGlzLl9jb21iaW5lZFtpbmRleF0gKz0gc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0spIHtcbiAgICAgICAgLy8gbm9ybWFsIGNhc2UgZm9yIGNvbWJpbmluZyBjaGFyczpcbiAgICAgICAgLy8gIC0gbW92ZSBjdXJyZW50IGxlYWRpbmcgY2hhciArIG5ldyBvbmUgaW50byBjb21iaW5lZCBzdHJpbmdcbiAgICAgICAgLy8gIC0gc2V0IGNvbWJpbmVkIGZsYWdcbiAgICAgICAgdGhpcy5fY29tYmluZWRbaW5kZXhdID0gc3RyaW5nRnJvbUNvZGVQb2ludChjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykgKyBzdHJpbmdGcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIGNvbnRlbnQgJj0gfkNvbnRlbnQuQ09ERVBPSU5UX01BU0s7IC8vIHNldCBjb2RlcG9pbnQgaW4gYnVmZmVyIHRvIDBcbiAgICAgICAgY29udGVudCB8PSBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiAtIHdlIGFjdHVhbGx5IGhhdmUgbm8gZGF0YSBpbiB0aGUgY2VsbCB5ZXRcbiAgICAgICAgLy8gc2ltcGx5IHNldCB0aGUgZGF0YSBpbiB0aGUgY2VsbCBidWZmZXIgd2l0aCBhIHdpZHRoIG9mIDFcbiAgICAgICAgY29udGVudCA9IGNvZGVQb2ludCB8ICgxIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2lkdGgpIHtcbiAgICAgIGNvbnRlbnQgJj0gfkNvbnRlbnQuV0lEVEhfTUFTSztcbiAgICAgIGNvbnRlbnQgfD0gd2lkdGggPDwgQ29udGVudC5XSURUSF9TSElGVDtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPSBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIGluc2VydENlbGxzKHBvczogbnVtYmVyLCBuOiBudW1iZXIsIGZpbGxDZWxsRGF0YTogSUNlbGxEYXRhKTogdm9pZCB7XG4gICAgcG9zICU9IHRoaXMubGVuZ3RoO1xuXG4gICAgLy8gaGFuZGxlIGZ1bGx3aWR0aCBhdCBwb3M6IHJlc2V0IGNlbGwgb25lIHRvIHRoZSBsZWZ0IGlmIHBvcyBpcyBzZWNvbmQgY2VsbCBvZiBhIHdpZGUgY2hhclxuICAgIGlmIChwb3MgJiYgdGhpcy5nZXRXaWR0aChwb3MgLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChwb3MgLSAxLCAwLCAxLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cblxuICAgIGlmIChuIDwgdGhpcy5sZW5ndGggLSBwb3MpIHtcbiAgICAgIGNvbnN0IGNlbGwgPSBuZXcgQ2VsbERhdGEoKTtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxlbmd0aCAtIHBvcyAtIG4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB0aGlzLnNldENlbGwocG9zICsgbiArIGksIHRoaXMubG9hZENlbGwocG9zICsgaSwgY2VsbCkpO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsKHBvcyArIGksIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgbGluZSBlbmQ6IHJlc2V0IGxhc3QgY2VsbCBpZiBpdCBpcyBmaXJzdCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHRoaXMuZ2V0V2lkdGgodGhpcy5sZW5ndGggLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludCh0aGlzLmxlbmd0aCAtIDEsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZUNlbGxzKHBvczogbnVtYmVyLCBuOiBudW1iZXIsIGZpbGxDZWxsRGF0YTogSUNlbGxEYXRhKTogdm9pZCB7XG4gICAgcG9zICU9IHRoaXMubGVuZ3RoO1xuICAgIGlmIChuIDwgdGhpcy5sZW5ndGggLSBwb3MpIHtcbiAgICAgIGNvbnN0IGNlbGwgPSBuZXcgQ2VsbERhdGEoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggLSBwb3MgLSBuOyArK2kpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsKHBvcyArIGksIHRoaXMubG9hZENlbGwocG9zICsgbiArIGksIGNlbGwpKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxlbmd0aCAtIG47IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLnNldENlbGwoaSwgZmlsbENlbGxEYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgZnVsbHdpZHRoIGF0IHBvczpcbiAgICAvLyAtIHJlc2V0IHBvcy0xIGlmIHdpZGUgY2hhclxuICAgIC8vIC0gcmVzZXQgcG9zIGlmIHdpZHRoPT0wIChwcmV2aW91cyBzZWNvbmQgY2VsbCBvZiBhIHdpZGUgY2hhcilcbiAgICBpZiAocG9zICYmIHRoaXMuZ2V0V2lkdGgocG9zIC0gMSkgPT09IDIpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbEZyb21Db2RlcG9pbnQocG9zIC0gMSwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2V0V2lkdGgocG9zKSA9PT0gMCAmJiAhdGhpcy5oYXNDb250ZW50KHBvcykpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbEZyb21Db2RlcG9pbnQocG9zLCAwLCAxLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXBsYWNlQ2VsbHMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZpbGxDZWxsRGF0YTogSUNlbGxEYXRhLCByZXNwZWN0UHJvdGVjdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gZnVsbCBicmFuY2hpbmcgb24gcmVzcGVjdFByb3RlY3Q9PXRydWUsIGhvcGVmdWxseSBnZXR0aW5nIGZhc3QgSklUIGZvciBzdGFuZGFyZCBjYXNlXG4gICAgaWYgKHJlc3BlY3RQcm90ZWN0KSB7XG4gICAgICBpZiAoc3RhcnQgJiYgdGhpcy5nZXRXaWR0aChzdGFydCAtIDEpID09PSAyICYmICF0aGlzLmlzUHJvdGVjdGVkKHN0YXJ0IC0gMSkpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChzdGFydCAtIDEsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kIDwgdGhpcy5sZW5ndGggJiYgdGhpcy5nZXRXaWR0aChlbmQgLSAxKSA9PT0gMiAmJiAhdGhpcy5pc1Byb3RlY3RlZChlbmQpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbEZyb21Db2RlcG9pbnQoZW5kLCAwLCAxLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kICAmJiBzdGFydCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1Byb3RlY3RlZChzdGFydCkpIHtcbiAgICAgICAgICB0aGlzLnNldENlbGwoc3RhcnQsIGZpbGxDZWxsRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQrKztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgZnVsbHdpZHRoIGF0IHN0YXJ0OiByZXNldCBjZWxsIG9uZSB0byB0aGUgbGVmdCBpZiBzdGFydCBpcyBzZWNvbmQgY2VsbCBvZiBhIHdpZGUgY2hhclxuICAgIGlmIChzdGFydCAmJiB0aGlzLmdldFdpZHRoKHN0YXJ0IC0gMSkgPT09IDIpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbEZyb21Db2RlcG9pbnQoc3RhcnQgLSAxLCAwLCAxLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgZnVsbHdpZHRoIGF0IGxhc3QgY2VsbCArIDE6IHJlc2V0IHRvIGVtcHR5IGNlbGwgaWYgaXQgaXMgc2Vjb25kIHBhcnQgb2YgYSB3aWRlIGNoYXJcbiAgICBpZiAoZW5kIDwgdGhpcy5sZW5ndGggJiYgdGhpcy5nZXRXaWR0aChlbmQgLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChlbmQsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YXJ0IDwgZW5kICAmJiBzdGFydCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldENlbGwoc3RhcnQrKywgZmlsbENlbGxEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzaXplIEJ1ZmZlckxpbmUgdG8gYGNvbHNgIGZpbGxpbmcgZXhjZXNzIGNlbGxzIHdpdGggYGZpbGxDZWxsRGF0YWAuXG4gICAqIFRoZSB1bmRlcmx5aW5nIGFycmF5IGJ1ZmZlciB3aWxsIG5vdCBjaGFuZ2UgaWYgdGhlcmUgaXMgc3RpbGwgZW5vdWdoIHNwYWNlXG4gICAqIHRvIGhvbGQgdGhlIG5ldyBidWZmZXIgbGluZSBkYXRhLlxuICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nLCB3aGV0aGVyIGEgYGNsZWFudXBNZW1vcnlgIGNhbGwgd291bGQgZnJlZVxuICAgKiBleGNlc3MgbWVtb3J5ICh0cnVlIGFmdGVyIHNocmlua2luZyA+IENMRUFOVVBfVEhSRVNIT0xEKS5cbiAgICovXG4gIHB1YmxpYyByZXNpemUoY29sczogbnVtYmVyLCBmaWxsQ2VsbERhdGE6IElDZWxsRGF0YSk6IGJvb2xlYW4ge1xuICAgIGlmIChjb2xzID09PSB0aGlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGEubGVuZ3RoICogNCAqIENMRUFOVVBfVEhSRVNIT0xEIDwgdGhpcy5fZGF0YS5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgdWludDMyQ2VsbHMgPSBjb2xzICogQ0VMTF9TSVpFO1xuICAgIGlmIChjb2xzID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoID49IHVpbnQzMkNlbGxzICogNCkge1xuICAgICAgICAvLyBvcHRpbWl6YXRpb246IGF2b2lkIGFsbG9jIGFuZCBkYXRhIGNvcHkgaWYgYnVmZmVyIGhhcyBlbm91Z2ggcm9vbVxuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX2RhdGEuYnVmZmVyLCAwLCB1aW50MzJDZWxscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzbG93IHBhdGg6IG5ldyBhbGxvYyBhbmQgZnVsbCBkYXRhIGNvcHlcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSh1aW50MzJDZWxscyk7XG4gICAgICAgIGRhdGEuc2V0KHRoaXMuX2RhdGEpO1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxlbmd0aDsgaSA8IGNvbHM7ICsraSkge1xuICAgICAgICB0aGlzLnNldENlbGwoaSwgZmlsbENlbGxEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3B0aW1pemF0aW9uOiBqdXN0IHNocmluayB0aGUgdmlldyBvbiBleGlzdGluZyBidWZmZXJcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhLnN1YmFycmF5KDAsIHVpbnQzMkNlbGxzKTtcbiAgICAgIC8vIFJlbW92ZSBhbnkgY3V0IG9mZiBjb21iaW5lZCBkYXRhXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fY29tYmluZWQpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHBhcnNlSW50KGtleXNbaV0sIDEwKTtcbiAgICAgICAgaWYgKGtleSA+PSBjb2xzKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2NvbWJpbmVkW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSBhbnkgY3V0IG9mZiBleHRlbmRlZCBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBleHRLZXlzID0gT2JqZWN0LmtleXModGhpcy5fZXh0ZW5kZWRBdHRycyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFyc2VJbnQoZXh0S2V5c1tpXSwgMTApO1xuICAgICAgICBpZiAoa2V5ID49IGNvbHMpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fZXh0ZW5kZWRBdHRyc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gY29scztcbiAgICByZXR1cm4gdWludDMyQ2VsbHMgKiA0ICogQ0xFQU5VUF9USFJFU0hPTEQgPCB0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgdW5kZXJseWluZyBhcnJheSBidWZmZXIuXG4gICAqIEEgY2xlYW51cCB3aWxsIGJlIHRyaWdnZXJlZCBpZiB0aGUgYXJyYXkgYnVmZmVyIGV4Y2VlZHMgdGhlIGFjdHVhbCB1c2VkXG4gICAqIG1lbW9yeSBieSBhIGZhY3RvciBvZiBDTEVBTlVQX1RIUkVTSE9MRC5cbiAgICogUmV0dXJucyAwIG9yIDEgaW5kaWNhdGluZyB3aGV0aGVyIGEgY2xlYW51cCBoYXBwZW5lZC5cbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwTWVtb3J5KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2RhdGEubGVuZ3RoICogNCAqIENMRUFOVVBfVEhSRVNIT0xEIDwgdGhpcy5fZGF0YS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLl9kYXRhLmxlbmd0aCk7XG4gICAgICBkYXRhLnNldCh0aGlzLl9kYXRhKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqIGZpbGwgYSBsaW5lIHdpdGggZmlsbENoYXJEYXRhICovXG4gIHB1YmxpYyBmaWxsKGZpbGxDZWxsRGF0YTogSUNlbGxEYXRhLCByZXNwZWN0UHJvdGVjdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gZnVsbCBicmFuY2hpbmcgb24gcmVzcGVjdFByb3RlY3Q9PXRydWUsIGhvcGVmdWxseSBnZXR0aW5nIGZhc3QgSklUIGZvciBzdGFuZGFyZCBjYXNlXG4gICAgaWYgKHJlc3BlY3RQcm90ZWN0KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUHJvdGVjdGVkKGkpKSB7XG4gICAgICAgICAgdGhpcy5zZXRDZWxsKGksIGZpbGxDZWxsRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29tYmluZWQgPSB7fTtcbiAgICB0aGlzLl9leHRlbmRlZEF0dHJzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICB0aGlzLnNldENlbGwoaSwgZmlsbENlbGxEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKiogYWx0ZXIgdG8gYSBmdWxsIGNvcHkgb2YgbGluZSAgKi9cbiAgcHVibGljIGNvcHlGcm9tKGxpbmU6IEJ1ZmZlckxpbmUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZW5ndGggIT09IGxpbmUubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9kYXRhID0gbmV3IFVpbnQzMkFycmF5KGxpbmUuX2RhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1c2UgaGlnaCBzcGVlZCBjb3B5IGlmIGxlbmd0aHMgYXJlIGVxdWFsXG4gICAgICB0aGlzLl9kYXRhLnNldChsaW5lLl9kYXRhKTtcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBsaW5lLmxlbmd0aDtcbiAgICB0aGlzLl9jb21iaW5lZCA9IHt9O1xuICAgIGZvciAoY29uc3QgZWwgaW4gbGluZS5fY29tYmluZWQpIHtcbiAgICAgIHRoaXMuX2NvbWJpbmVkW2VsXSA9IGxpbmUuX2NvbWJpbmVkW2VsXTtcbiAgICB9XG4gICAgdGhpcy5fZXh0ZW5kZWRBdHRycyA9IHt9O1xuICAgIGZvciAoY29uc3QgZWwgaW4gbGluZS5fZXh0ZW5kZWRBdHRycykge1xuICAgICAgdGhpcy5fZXh0ZW5kZWRBdHRyc1tlbF0gPSBsaW5lLl9leHRlbmRlZEF0dHJzW2VsXTtcbiAgICB9XG4gICAgdGhpcy5pc1dyYXBwZWQgPSBsaW5lLmlzV3JhcHBlZDtcbiAgfVxuXG4gIC8qKiBjcmVhdGUgYSBuZXcgY2xvbmUgKi9cbiAgcHVibGljIGNsb25lKCk6IElCdWZmZXJMaW5lIHtcbiAgICBjb25zdCBuZXdMaW5lID0gbmV3IEJ1ZmZlckxpbmUoMCk7XG4gICAgbmV3TGluZS5fZGF0YSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLl9kYXRhKTtcbiAgICBuZXdMaW5lLmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgZWwgaW4gdGhpcy5fY29tYmluZWQpIHtcbiAgICAgIG5ld0xpbmUuX2NvbWJpbmVkW2VsXSA9IHRoaXMuX2NvbWJpbmVkW2VsXTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9leHRlbmRlZEF0dHJzKSB7XG4gICAgICBuZXdMaW5lLl9leHRlbmRlZEF0dHJzW2VsXSA9IHRoaXMuX2V4dGVuZGVkQXR0cnNbZWxdO1xuICAgIH1cbiAgICBuZXdMaW5lLmlzV3JhcHBlZCA9IHRoaXMuaXNXcmFwcGVkO1xuICAgIHJldHVybiBuZXdMaW5lO1xuICB9XG5cbiAgcHVibGljIGdldFRyaW1tZWRMZW5ndGgoKTogbnVtYmVyIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgaWYgKCh0aGlzLl9kYXRhW2kgKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdICYgQ29udGVudC5IQVNfQ09OVEVOVF9NQVNLKSkge1xuICAgICAgICByZXR1cm4gaSArICh0aGlzLl9kYXRhW2kgKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID4+IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXROb0JnVHJpbW1lZExlbmd0aCgpOiBudW1iZXIge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBpZiAoKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LkhBU19DT05URU5UX01BU0spIHx8ICh0aGlzLl9kYXRhW2kgKiBDRUxMX1NJWkUgKyBDZWxsLkJHXSAmIEF0dHJpYnV0ZXMuQ01fTUFTSykpIHtcbiAgICAgICAgcmV0dXJuIGkgKyAodGhpcy5fZGF0YVtpICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA+PiBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgY29weUNlbGxzRnJvbShzcmM6IEJ1ZmZlckxpbmUsIHNyY0NvbDogbnVtYmVyLCBkZXN0Q29sOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBhcHBseUluUmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHNyY0RhdGEgPSBzcmMuX2RhdGE7XG4gICAgaWYgKGFwcGx5SW5SZXZlcnNlKSB7XG4gICAgICBmb3IgKGxldCBjZWxsID0gbGVuZ3RoIC0gMTsgY2VsbCA+PSAwOyBjZWxsLS0pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDRUxMX1NJWkU7IGkrKykge1xuICAgICAgICAgIHRoaXMuX2RhdGFbKGRlc3RDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIGldID0gc3JjRGF0YVsoc3JjQ29sICsgY2VsbCkgKiBDRUxMX1NJWkUgKyBpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3JjRGF0YVsoc3JjQ29sICsgY2VsbCkgKiBDRUxMX1NJWkUgKyBDZWxsLkJHXSAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSB7XG4gICAgICAgICAgdGhpcy5fZXh0ZW5kZWRBdHRyc1tkZXN0Q29sICsgY2VsbF0gPSBzcmMuX2V4dGVuZGVkQXR0cnNbc3JjQ29sICsgY2VsbF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgY2VsbCA9IDA7IGNlbGwgPCBsZW5ndGg7IGNlbGwrKykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENFTExfU0laRTsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5fZGF0YVsoZGVzdENvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgaV0gPSBzcmNEYXRhWyhzcmNDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIGldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcmNEYXRhWyhzcmNDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIENlbGwuQkddICYgQmdGbGFncy5IQVNfRVhURU5ERUQpIHtcbiAgICAgICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2Rlc3RDb2wgKyBjZWxsXSA9IHNyYy5fZXh0ZW5kZWRBdHRyc1tzcmNDb2wgKyBjZWxsXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1vdmUgYW55IGNvbWJpbmVkIGRhdGEgb3ZlciBhcyBuZWVkZWQsIEZJWE1FOiByZXBlYXQgZm9yIGV4dGVuZGVkIGF0dHJzXG4gICAgY29uc3Qgc3JjQ29tYmluZWRLZXlzID0gT2JqZWN0LmtleXMoc3JjLl9jb21iaW5lZCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmNDb21iaW5lZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhcnNlSW50KHNyY0NvbWJpbmVkS2V5c1tpXSwgMTApO1xuICAgICAgaWYgKGtleSA+PSBzcmNDb2wpIHtcbiAgICAgICAgdGhpcy5fY29tYmluZWRba2V5IC0gc3JjQ29sICsgZGVzdENvbF0gPSBzcmMuX2NvbWJpbmVkW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgdGhlIGJ1ZmZlciBsaW5lIHRvIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdHJpbVJpZ2h0IFdoZXRoZXIgdG8gdHJpbSBhbnkgZW1wdHkgY2VsbHMgb24gdGhlIHJpZ2h0LlxuICAgKiBAcGFyYW0gc3RhcnRDb2wgVGhlIGNvbHVtbiB0byBzdGFydCB0aGUgc3RyaW5nICgwLWJhc2VkIGluY2x1c2l2ZSkuXG4gICAqIEBwYXJhbSBlbmRDb2wgVGhlIGNvbHVtbiB0byBlbmQgdGhlIHN0cmluZyAoMC1iYXNlZCBleGNsdXNpdmUpLlxuICAgKiBAcGFyYW0gb3V0Q29sdW1ucyBpZiBzcGVjaWZpZWQsIHRoaXMgYXJyYXkgd2lsbCBiZSBmaWxsZWQgd2l0aCBjb2x1bW4gbnVtYmVycyBzdWNoIHRoYXRcbiAgICogYHJldHVybmVkU3RyaW5nW2ldYCBpcyBkaXNwbGF5ZWQgYXQgYG91dENvbHVtbnNbaV1gIGNvbHVtbi4gYG91dENvbHVtbnNbcmV0dXJuZWRTdHJpbmcubGVuZ3RoXWBcbiAgICogaXMgd2hlcmUgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgYHJldHVybmVkU3RyaW5nYCB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICpcbiAgICogV2hlbiBhIHNpbmdsZSBjZWxsIGlzIHRyYW5zbGF0ZWQgdG8gbXVsdGlwbGUgVVRGLTE2IGNvZGUgdW5pdHMgKGUuZy4gc3Vycm9nYXRlIHBhaXIpIGluIHRoZVxuICAgKiByZXR1cm5lZCBzdHJpbmcsIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gYG91dENvbHVtbnNgIHdpbGwgaGF2ZSB0aGUgc2FtZSBjb2x1bW4gbnVtYmVyLlxuICAgKi9cbiAgcHVibGljIHRyYW5zbGF0ZVRvU3RyaW5nKHRyaW1SaWdodD86IGJvb2xlYW4sIHN0YXJ0Q29sPzogbnVtYmVyLCBlbmRDb2w/OiBudW1iZXIsIG91dENvbHVtbnM/OiBudW1iZXJbXSk6IHN0cmluZyB7XG4gICAgc3RhcnRDb2wgPSBzdGFydENvbCA/PyAwO1xuICAgIGVuZENvbCA9IGVuZENvbCA/PyB0aGlzLmxlbmd0aDtcbiAgICBpZiAodHJpbVJpZ2h0KSB7XG4gICAgICBlbmRDb2wgPSBNYXRoLm1pbihlbmRDb2wsIHRoaXMuZ2V0VHJpbW1lZExlbmd0aCgpKTtcbiAgICB9XG4gICAgaWYgKG91dENvbHVtbnMpIHtcbiAgICAgIG91dENvbHVtbnMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlIChzdGFydENvbCA8IGVuZENvbCkge1xuICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuX2RhdGFbc3RhcnRDb2wgKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdO1xuICAgICAgY29uc3QgY3AgPSBjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSztcbiAgICAgIGNvbnN0IGNoYXJzID0gKGNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spID8gdGhpcy5fY29tYmluZWRbc3RhcnRDb2xdIDogKGNwKSA/IHN0cmluZ0Zyb21Db2RlUG9pbnQoY3ApIDogV0hJVEVTUEFDRV9DRUxMX0NIQVI7XG4gICAgICByZXN1bHQgKz0gY2hhcnM7XG4gICAgICBpZiAob3V0Q29sdW1ucykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgb3V0Q29sdW1ucy5wdXNoKHN0YXJ0Q29sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhcnRDb2wgKz0gKGNvbnRlbnQgPj4gQ29udGVudC5XSURUSF9TSElGVCkgfHwgMTsgLy8gYWx3YXlzIGFkdmFuY2UgYnkgYXQgbGVhc3QgMVxuICAgIH1cbiAgICBpZiAob3V0Q29sdW1ucykge1xuICAgICAgb3V0Q29sdW1ucy5wdXNoKHN0YXJ0Q29sKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyUmFuZ2UgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VMZW5ndGgocmFuZ2U6IElCdWZmZXJSYW5nZSwgYnVmZmVyQ29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHJhbmdlLnN0YXJ0LnkgPiByYW5nZS5lbmQueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnVmZmVyIHJhbmdlIGVuZCAoJHtyYW5nZS5lbmQueH0sICR7cmFuZ2UuZW5kLnl9KSBjYW5ub3QgYmUgYmVmb3JlIHN0YXJ0ICgke3JhbmdlLnN0YXJ0Lnh9LCAke3JhbmdlLnN0YXJ0Lnl9KWApO1xuICB9XG4gIHJldHVybiBidWZmZXJDb2xzICogKHJhbmdlLmVuZC55IC0gcmFuZ2Uuc3RhcnQueSkgKyAocmFuZ2UuZW5kLnggLSByYW5nZS5zdGFydC54ICsgMSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEJ1ZmZlckxpbmUgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlckxpbmUnO1xuaW1wb3J0IHsgQ2lyY3VsYXJMaXN0IH0gZnJvbSAnY29tbW9uL0NpcmN1bGFyTGlzdCc7XG5pbXBvcnQgeyBJQnVmZmVyTGluZSwgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJTmV3TGF5b3V0UmVzdWx0IHtcbiAgbGF5b3V0OiBudW1iZXJbXTtcbiAgY291bnRSZW1vdmVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGFuZCByZXR1cm5zIGluZGV4ZXMgdG8gYmUgcmVtb3ZlZCBhZnRlciBhIHJlZmxvdyBsYXJnZXIgb2NjdXJzLiBMaW5lcyB3aWxsIGJlIHJlbW92ZWRcbiAqIHdoZW4gYSB3cmFwcGVkIGxpbmUgdW53cmFwcy5cbiAqIEBwYXJhbSBsaW5lcyBUaGUgYnVmZmVyIGxpbmVzLlxuICogQHBhcmFtIG9sZENvbHMgVGhlIGNvbHVtbnMgYmVmb3JlIHJlc2l6ZVxuICogQHBhcmFtIG5ld0NvbHMgVGhlIGNvbHVtbnMgYWZ0ZXIgcmVzaXplLlxuICogQHBhcmFtIGJ1ZmZlckFic29sdXRlWSBUaGUgYWJzb2x1dGUgeSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIChiYXNlWSArIGN1cnNvclkpLlxuICogQHBhcmFtIG51bGxDZWxsIFRoZSBjZWxsIGRhdGEgdG8gdXNlIHdoZW4gZmlsbGluZyBpbiBlbXB0eSBjZWxscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxvd0xhcmdlckdldExpbmVzVG9SZW1vdmUobGluZXM6IENpcmN1bGFyTGlzdDxJQnVmZmVyTGluZT4sIG9sZENvbHM6IG51bWJlciwgbmV3Q29sczogbnVtYmVyLCBidWZmZXJBYnNvbHV0ZVk6IG51bWJlciwgbnVsbENlbGw6IElDZWxsRGF0YSk6IG51bWJlcltdIHtcbiAgLy8gR2F0aGVyIGFsbCBCdWZmZXJMaW5lcyB0aGF0IG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBCdWZmZXIgaGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlXG4gIC8vIGJhdGNoZWQgdXAgYW5kIG9ubHkgY29tbWl0dGVkIG9uY2VcbiAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBsaW5lcy5sZW5ndGggLSAxOyB5KyspIHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIHJvdyBpcyB3cmFwcGVkXG4gICAgbGV0IGkgPSB5O1xuICAgIGxldCBuZXh0TGluZSA9IGxpbmVzLmdldCgrK2kpIGFzIEJ1ZmZlckxpbmU7XG4gICAgaWYgKCFuZXh0TGluZS5pc1dyYXBwZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGhvdyBtYW55IGxpbmVzIGl0J3Mgd3JhcHBlZCBmb3JcbiAgICBjb25zdCB3cmFwcGVkTGluZXM6IEJ1ZmZlckxpbmVbXSA9IFtsaW5lcy5nZXQoeSkgYXMgQnVmZmVyTGluZV07XG4gICAgd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgbmV4dExpbmUuaXNXcmFwcGVkKSB7XG4gICAgICB3cmFwcGVkTGluZXMucHVzaChuZXh0TGluZSk7XG4gICAgICBuZXh0TGluZSA9IGxpbmVzLmdldCgrK2kpIGFzIEJ1ZmZlckxpbmU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlc2UgbGluZXMgY29udGFpbiB0aGUgY3Vyc29yIGRvbid0IHRvdWNoIHRoZW0sIHRoZSBwcm9ncmFtIHdpbGwgaGFuZGxlIGZpeGluZyB1cCB3cmFwcGVkXG4gICAgLy8gbGluZXMgd2l0aCB0aGUgY3Vyc29yXG4gICAgaWYgKGJ1ZmZlckFic29sdXRlWSA+PSB5ICYmIGJ1ZmZlckFic29sdXRlWSA8IGkpIHtcbiAgICAgIHkgKz0gd3JhcHBlZExpbmVzLmxlbmd0aCAtIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IGJ1ZmZlciBkYXRhIHRvIG5ldyBsb2NhdGlvbnNcbiAgICBsZXQgZGVzdExpbmVJbmRleCA9IDA7XG4gICAgbGV0IGRlc3RDb2wgPSBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgod3JhcHBlZExpbmVzLCBkZXN0TGluZUluZGV4LCBvbGRDb2xzKTtcbiAgICBsZXQgc3JjTGluZUluZGV4ID0gMTtcbiAgICBsZXQgc3JjQ29sID0gMDtcbiAgICB3aGlsZSAoc3JjTGluZUluZGV4IDwgd3JhcHBlZExpbmVzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc3JjVHJpbW1lZFRpbmVMZW5ndGggPSBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgod3JhcHBlZExpbmVzLCBzcmNMaW5lSW5kZXgsIG9sZENvbHMpO1xuICAgICAgY29uc3Qgc3JjUmVtYWluaW5nQ2VsbHMgPSBzcmNUcmltbWVkVGluZUxlbmd0aCAtIHNyY0NvbDtcbiAgICAgIGNvbnN0IGRlc3RSZW1haW5pbmdDZWxscyA9IG5ld0NvbHMgLSBkZXN0Q29sO1xuICAgICAgY29uc3QgY2VsbHNUb0NvcHkgPSBNYXRoLm1pbihzcmNSZW1haW5pbmdDZWxscywgZGVzdFJlbWFpbmluZ0NlbGxzKTtcblxuICAgICAgd3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXhdLmNvcHlDZWxsc0Zyb20od3JhcHBlZExpbmVzW3NyY0xpbmVJbmRleF0sIHNyY0NvbCwgZGVzdENvbCwgY2VsbHNUb0NvcHksIGZhbHNlKTtcblxuICAgICAgZGVzdENvbCArPSBjZWxsc1RvQ29weTtcbiAgICAgIGlmIChkZXN0Q29sID09PSBuZXdDb2xzKSB7XG4gICAgICAgIGRlc3RMaW5lSW5kZXgrKztcbiAgICAgICAgZGVzdENvbCA9IDA7XG4gICAgICB9XG4gICAgICBzcmNDb2wgKz0gY2VsbHNUb0NvcHk7XG4gICAgICBpZiAoc3JjQ29sID09PSBzcmNUcmltbWVkVGluZUxlbmd0aCkge1xuICAgICAgICBzcmNMaW5lSW5kZXgrKztcbiAgICAgICAgc3JjQ29sID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSBsYXN0IGNlbGwgaXNuJ3Qgd2lkZSwgaWYgaXQgaXMgY29weSBpdCB0byB0aGUgY3VycmVudCBkZXN0XG4gICAgICBpZiAoZGVzdENvbCA9PT0gMCAmJiBkZXN0TGluZUluZGV4ICE9PSAwKSB7XG4gICAgICAgIGlmICh3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleCAtIDFdLmdldFdpZHRoKG5ld0NvbHMgLSAxKSA9PT0gMikge1xuICAgICAgICAgIHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4XS5jb3B5Q2VsbHNGcm9tKHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4IC0gMV0sIG5ld0NvbHMgLSAxLCBkZXN0Q29sKyssIDEsIGZhbHNlKTtcbiAgICAgICAgICAvLyBOdWxsIG91dCB0aGUgZW5kIG9mIHRoZSBsYXN0IHJvd1xuICAgICAgICAgIHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4IC0gMV0uc2V0Q2VsbChuZXdDb2xzIC0gMSwgbnVsbENlbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgb3V0IHJlbWFpbmluZyBjZWxscyBvciBmcmFnbWVudHMgY291bGQgcmVtYWluO1xuICAgIHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4XS5yZXBsYWNlQ2VsbHMoZGVzdENvbCwgbmV3Q29scywgbnVsbENlbGwpO1xuXG4gICAgLy8gV29yayBiYWNrd2FyZHMgYW5kIHJlbW92ZSBhbnkgcm93cyBhdCB0aGUgZW5kIHRoYXQgb25seSBjb250YWluIG51bGwgY2VsbHNcbiAgICBsZXQgY291bnRUb1JlbW92ZSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHdyYXBwZWRMaW5lcy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICBpZiAoaSA+IGRlc3RMaW5lSW5kZXggfHwgd3JhcHBlZExpbmVzW2ldLmdldFRyaW1tZWRMZW5ndGgoKSA9PT0gMCkge1xuICAgICAgICBjb3VudFRvUmVtb3ZlKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY291bnRUb1JlbW92ZSA+IDApIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goeSArIHdyYXBwZWRMaW5lcy5sZW5ndGggLSBjb3VudFRvUmVtb3ZlKTsgLy8gaW5kZXhcbiAgICAgIHRvUmVtb3ZlLnB1c2goY291bnRUb1JlbW92ZSk7XG4gICAgfVxuXG4gICAgeSArPSB3cmFwcGVkTGluZXMubGVuZ3RoIC0gMTtcbiAgfVxuICByZXR1cm4gdG9SZW1vdmU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJuIHRoZSBuZXcgbGF5b3V0IGZvciBsaW5lcyBnaXZlbiBhbiBhcnJheSBvZiBpbmRleGVzIHRvIGJlIHJlbW92ZWQuXG4gKiBAcGFyYW0gbGluZXMgVGhlIGJ1ZmZlciBsaW5lcy5cbiAqIEBwYXJhbSB0b1JlbW92ZSBUaGUgaW5kZXhlcyB0byByZW1vdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsb3dMYXJnZXJDcmVhdGVOZXdMYXlvdXQobGluZXM6IENpcmN1bGFyTGlzdDxJQnVmZmVyTGluZT4sIHRvUmVtb3ZlOiBudW1iZXJbXSk6IElOZXdMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IG51bWJlcltdID0gW107XG4gIC8vIEZpcnN0IGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBhbmQgZ2V0IHRoZSBhY3R1YWwgaW5kZXhlcyB0byB1c2UgZm9yIHJvd3NcbiAgbGV0IG5leHRUb1JlbW92ZUluZGV4ID0gMDtcbiAgbGV0IG5leHRUb1JlbW92ZVN0YXJ0ID0gdG9SZW1vdmVbbmV4dFRvUmVtb3ZlSW5kZXhdO1xuICBsZXQgY291bnRSZW1vdmVkU29GYXIgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5leHRUb1JlbW92ZVN0YXJ0ID09PSBpKSB7XG4gICAgICBjb25zdCBjb3VudFRvUmVtb3ZlID0gdG9SZW1vdmVbKytuZXh0VG9SZW1vdmVJbmRleF07XG5cbiAgICAgIC8vIFRlbGwgbWFya2VycyB0aGF0IHRoZXJlIHdhcyBhIGRlbGV0aW9uXG4gICAgICBsaW5lcy5vbkRlbGV0ZUVtaXR0ZXIuZmlyZSh7XG4gICAgICAgIGluZGV4OiBpIC0gY291bnRSZW1vdmVkU29GYXIsXG4gICAgICAgIGFtb3VudDogY291bnRUb1JlbW92ZVxuICAgICAgfSk7XG5cbiAgICAgIGkgKz0gY291bnRUb1JlbW92ZSAtIDE7XG4gICAgICBjb3VudFJlbW92ZWRTb0ZhciArPSBjb3VudFRvUmVtb3ZlO1xuICAgICAgbmV4dFRvUmVtb3ZlU3RhcnQgPSB0b1JlbW92ZVsrK25leHRUb1JlbW92ZUluZGV4XTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0LnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGNvdW50UmVtb3ZlZDogY291bnRSZW1vdmVkU29GYXJcbiAgfTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgbmV3IGxheW91dCB0byB0aGUgYnVmZmVyLiBUaGlzIGVzc2VudGlhbGx5IGRvZXMgdGhlIHNhbWUgYXMgbWFueSBzcGxpY2UgY2FsbHMgYnV0IGl0J3NcbiAqIGRvbmUgYWxsIGF0IG9uY2UgaW4gYSBzaW5nbGUgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGxpc3Qgc2luY2Ugc3BsaWNlIGlzIHZlcnkgZXhwZW5zaXZlLlxuICogQHBhcmFtIGxpbmVzIFRoZSBidWZmZXIgbGluZXMuXG4gKiBAcGFyYW0gbmV3TGF5b3V0IFRoZSBuZXcgbGF5b3V0IHRvIGFwcGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbG93TGFyZ2VyQXBwbHlOZXdMYXlvdXQobGluZXM6IENpcmN1bGFyTGlzdDxJQnVmZmVyTGluZT4sIG5ld0xheW91dDogbnVtYmVyW10pOiB2b2lkIHtcbiAgLy8gUmVjb3JkIG9yaWdpbmFsIGxpbmVzIHNvIHRoZXkgZG9uJ3QgZ2V0IG92ZXJyaWRkZW4gd2hlbiB3ZSByZWFycmFuZ2UgdGhlIGxpc3RcbiAgY29uc3QgbmV3TGF5b3V0TGluZXM6IEJ1ZmZlckxpbmVbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0xheW91dC5sZW5ndGg7IGkrKykge1xuICAgIG5ld0xheW91dExpbmVzLnB1c2gobGluZXMuZ2V0KG5ld0xheW91dFtpXSkgYXMgQnVmZmVyTGluZSk7XG4gIH1cblxuICAvLyBSZWFycmFuZ2UgdGhlIGxpc3RcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMYXlvdXRMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxpbmVzLnNldChpLCBuZXdMYXlvdXRMaW5lc1tpXSk7XG4gIH1cbiAgbGluZXMubGVuZ3RoID0gbmV3TGF5b3V0Lmxlbmd0aDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXcgbGluZSBsZW5ndGhzIGZvciBhIGdpdmVuIHdyYXBwZWQgbGluZS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpdCB0byBwcmUtXG4gKiBjb21wdXRlIHRoZSB3cmFwcGluZyBwb2ludHMgc2luY2Ugd2lkZSBjaGFyYWN0ZXJzIG1heSBuZWVkIHRvIGJlIHdyYXBwZWQgb250byB0aGUgZm9sbG93aW5nIGxpbmUuXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG51bWJlcnMgb2Ygd2hlcmUgZWFjaCBsaW5lIHdyYXBzIHRvLCB0aGUgcmVzdWx0aW5nIGFycmF5XG4gKiB3aWxsIG9ubHkgY29udGFpbiB0aGUgdmFsdWVzIGBuZXdDb2xzYCAod2hlbiB0aGUgbGluZSBkb2VzIG5vdCBlbmQgd2l0aCBhIHdpZGUgY2hhcmFjdGVyKSBhbmRcbiAqIGBuZXdDb2xzIC0gMWAgKHdoZW4gdGhlIGxpbmUgZG9lcyBlbmQgd2l0aCBhIHdpZGUgY2hhcmFjdGVyKSwgZXhjZXB0IGZvciB0aGUgbGFzdCB2YWx1ZSB3aGljaFxuICogd2lsbCBjb250YWluIHRoZSByZW1haW5pbmcgaXRlbXMgdG8gZmlsbCB0aGUgbGluZS5cbiAqXG4gKiBDYWxsaW5nIHRoaXMgd2l0aCBhIGBuZXdDb2xzYCB2YWx1ZSBvZiBgMWAgd2lsbCBsb2NrIHVwLlxuICpcbiAqIEBwYXJhbSB3cmFwcGVkTGluZXMgVGhlIHdyYXBwZWQgbGluZXMgdG8gZXZhbHVhdGUuXG4gKiBAcGFyYW0gb2xkQ29scyBUaGUgY29sdW1ucyBiZWZvcmUgcmVzaXplLlxuICogQHBhcmFtIG5ld0NvbHMgVGhlIGNvbHVtbnMgYWZ0ZXIgcmVzaXplLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbG93U21hbGxlckdldE5ld0xpbmVMZW5ndGhzKHdyYXBwZWRMaW5lczogQnVmZmVyTGluZVtdLCBvbGRDb2xzOiBudW1iZXIsIG5ld0NvbHM6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgbmV3TGluZUxlbmd0aHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGNlbGxzTmVlZGVkID0gd3JhcHBlZExpbmVzLm1hcCgobCwgaSkgPT4gZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoKHdyYXBwZWRMaW5lcywgaSwgb2xkQ29scykpLnJlZHVjZSgocCwgYykgPT4gcCArIGMpO1xuXG4gIC8vIFVzZSBzcmNDb2wgYW5kIHNyY0xpbmUgdG8gZmluZCB0aGUgbmV3IHdyYXBwaW5nIHBvaW50LCB1c2UgdGhhdCB0byBnZXQgdGhlIGNlbGxzQXZhaWxhYmxlIGFuZFxuICAvLyBsaW5lc05lZWRlZFxuICBsZXQgc3JjQ29sID0gMDtcbiAgbGV0IHNyY0xpbmUgPSAwO1xuICBsZXQgY2VsbHNBdmFpbGFibGUgPSAwO1xuICB3aGlsZSAoY2VsbHNBdmFpbGFibGUgPCBjZWxsc05lZWRlZCkge1xuICAgIGlmIChjZWxsc05lZWRlZCAtIGNlbGxzQXZhaWxhYmxlIDwgbmV3Q29scykge1xuICAgICAgLy8gQWRkIHRoZSBmaW5hbCBsaW5lIGFuZCBleGl0IHRoZSBsb29wXG4gICAgICBuZXdMaW5lTGVuZ3Rocy5wdXNoKGNlbGxzTmVlZGVkIC0gY2VsbHNBdmFpbGFibGUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHNyY0NvbCArPSBuZXdDb2xzO1xuICAgIGNvbnN0IG9sZFRyaW1tZWRMZW5ndGggPSBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgod3JhcHBlZExpbmVzLCBzcmNMaW5lLCBvbGRDb2xzKTtcbiAgICBpZiAoc3JjQ29sID4gb2xkVHJpbW1lZExlbmd0aCkge1xuICAgICAgc3JjQ29sIC09IG9sZFRyaW1tZWRMZW5ndGg7XG4gICAgICBzcmNMaW5lKys7XG4gICAgfVxuICAgIGNvbnN0IGVuZHNXaXRoV2lkZSA9IHdyYXBwZWRMaW5lc1tzcmNMaW5lXS5nZXRXaWR0aChzcmNDb2wgLSAxKSA9PT0gMjtcbiAgICBpZiAoZW5kc1dpdGhXaWRlKSB7XG4gICAgICBzcmNDb2wtLTtcbiAgICB9XG4gICAgY29uc3QgbGluZUxlbmd0aCA9IGVuZHNXaXRoV2lkZSA/IG5ld0NvbHMgLSAxIDogbmV3Q29scztcbiAgICBuZXdMaW5lTGVuZ3Rocy5wdXNoKGxpbmVMZW5ndGgpO1xuICAgIGNlbGxzQXZhaWxhYmxlICs9IGxpbmVMZW5ndGg7XG4gIH1cblxuICByZXR1cm4gbmV3TGluZUxlbmd0aHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgobGluZXM6IEJ1ZmZlckxpbmVbXSwgaTogbnVtYmVyLCBjb2xzOiBudW1iZXIpOiBudW1iZXIge1xuICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IHJvdyBpbiB0aGUgd3JhcHBlZCBsaW5lLCBnZXQgdGhlIGFjdHVhbCB0cmltbWVkIGxlbmd0aFxuICBpZiAoaSA9PT0gbGluZXMubGVuZ3RoIC0gMSkge1xuICAgIHJldHVybiBsaW5lc1tpXS5nZXRUcmltbWVkTGVuZ3RoKCk7XG4gIH1cbiAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhlIGZvbGxvd2luZyBsaW5lIHN0YXJ0cyB3aXRoIGEgd2lkZSBjaGFyYWN0ZXIgYW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZVxuICAvLyBpcyBudWxsLCBpZiBzbyB0aGVuIHdlIGNhbiBiZSBwcmV0dHkgc3VyZSB0aGUgbnVsbCBjaGFyYWN0ZXIgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGxpbmVcbiAgLy8gbGVuZ3RoXVxuICBjb25zdCBlbmRzSW5OdWxsID0gIShsaW5lc1tpXS5oYXNDb250ZW50KGNvbHMgLSAxKSkgJiYgbGluZXNbaV0uZ2V0V2lkdGgoY29scyAtIDEpID09PSAxO1xuICBjb25zdCBmb2xsb3dpbmdMaW5lU3RhcnRzV2l0aFdpZGUgPSBsaW5lc1tpICsgMV0uZ2V0V2lkdGgoMCkgPT09IDI7XG4gIGlmIChlbmRzSW5OdWxsICYmIGZvbGxvd2luZ0xpbmVTdGFydHNXaXRoV2lkZSkge1xuICAgIHJldHVybiBjb2xzIC0gMTtcbiAgfVxuICByZXR1cm4gY29scztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlcic7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuLyoqXG4gKiBUaGUgQnVmZmVyU2V0IHJlcHJlc2VudHMgdGhlIHNldCBvZiB0d28gYnVmZmVycyB1c2VkIGJ5IHh0ZXJtIHRlcm1pbmFscyAobm9ybWFsIGFuZCBhbHQpIGFuZFxuICogcHJvdmlkZXMgYWxzbyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgQnVmZmVyU2V0IGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElCdWZmZXJTZXQge1xuICBwcml2YXRlIF9ub3JtYWwhOiBCdWZmZXI7XG4gIHByaXZhdGUgX2FsdCE6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSBfYWN0aXZlQnVmZmVyITogQnVmZmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQnVmZmVyQWN0aXZhdGUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8e2FjdGl2ZUJ1ZmZlcjogSUJ1ZmZlciwgaW5hY3RpdmVCdWZmZXI6IElCdWZmZXJ9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQnVmZmVyQWN0aXZhdGUgPSB0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlLmV2ZW50O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgQnVmZmVyU2V0IGZvciB0aGUgZ2l2ZW4gdGVybWluYWwuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnc2Nyb2xsYmFjaycsICgpID0+IHRoaXMucmVzaXplKHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGFiU3RvcFdpZHRoJywgKCkgPT4gdGhpcy5zZXR1cFRhYlN0b3BzKCkpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3JtYWwgPSBuZXcgQnVmZmVyKHRydWUsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl9idWZmZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9ub3JtYWwuZmlsbFZpZXdwb3J0Um93cygpO1xuXG4gICAgLy8gVGhlIGFsdCBidWZmZXIgc2hvdWxkIG5ldmVyIGhhdmUgc2Nyb2xsYmFjay5cbiAgICAvLyBTZWUgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sI2gyLVRoZS1BbHRlcm5hdGUtU2NyZWVuLUJ1ZmZlclxuICAgIHRoaXMuX2FsdCA9IG5ldyBCdWZmZXIoZmFsc2UsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl9idWZmZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIgPSB0aGlzLl9ub3JtYWw7XG4gICAgdGhpcy5fb25CdWZmZXJBY3RpdmF0ZS5maXJlKHtcbiAgICAgIGFjdGl2ZUJ1ZmZlcjogdGhpcy5fbm9ybWFsLFxuICAgICAgaW5hY3RpdmVCdWZmZXI6IHRoaXMuX2FsdFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR1cFRhYlN0b3BzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWx0IEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsdCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9hbHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSBCdWZmZXIgb2YgdGhlIEJ1ZmZlclNldFxuICAgKi9cbiAgcHVibGljIGdldCBhY3RpdmUoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlQnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vcm1hbCBCdWZmZXIgb2YgdGhlIEJ1ZmZlclNldFxuICAgKi9cbiAgcHVibGljIGdldCBub3JtYWwoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbm9ybWFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5vcm1hbCBCdWZmZXIgb2YgdGhlIEJ1ZmZlclNldCBhcyBpdHMgY3VycmVudGx5IGFjdGl2ZSBCdWZmZXJcbiAgICovXG4gIHB1YmxpYyBhY3RpdmF0ZU5vcm1hbEJ1ZmZlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyID09PSB0aGlzLl9ub3JtYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbm9ybWFsLnggPSB0aGlzLl9hbHQueDtcbiAgICB0aGlzLl9ub3JtYWwueSA9IHRoaXMuX2FsdC55O1xuICAgIC8vIFRoZSBhbHQgYnVmZmVyIHNob3VsZCBhbHdheXMgYmUgY2xlYXJlZCB3aGVuIHdlIHN3aXRjaCB0byB0aGUgbm9ybWFsXG4gICAgLy8gYnVmZmVyLiBUaGlzIGZyZWVzIHVwIG1lbW9yeSBzaW5jZSB0aGUgYWx0IGJ1ZmZlciBzaG91bGQgYWx3YXlzIGJlIG5ld1xuICAgIC8vIHdoZW4gYWN0aXZhdGVkLlxuICAgIHRoaXMuX2FsdC5jbGVhckFsbE1hcmtlcnMoKTtcbiAgICB0aGlzLl9hbHQuY2xlYXIoKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIgPSB0aGlzLl9ub3JtYWw7XG4gICAgdGhpcy5fb25CdWZmZXJBY3RpdmF0ZS5maXJlKHtcbiAgICAgIGFjdGl2ZUJ1ZmZlcjogdGhpcy5fbm9ybWFsLFxuICAgICAgaW5hY3RpdmVCdWZmZXI6IHRoaXMuX2FsdFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFsdCBCdWZmZXIgb2YgdGhlIEJ1ZmZlclNldCBhcyBpdHMgY3VycmVudGx5IGFjdGl2ZSBCdWZmZXJcbiAgICovXG4gIHB1YmxpYyBhY3RpdmF0ZUFsdEJ1ZmZlcihmaWxsQXR0cj86IElBdHRyaWJ1dGVEYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlciA9PT0gdGhpcy5fYWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNpbmNlIHRoZSBhbHQgYnVmZmVyIGlzIGFsd2F5cyBjbGVhcmVkIHdoZW4gdGhlIG5vcm1hbCBidWZmZXIgaXNcbiAgICAvLyBhY3RpdmF0ZWQsIHdlIHdhbnQgdG8gZmlsbCBpdCB3aGVuIHN3aXRjaGluZyB0byBpdC5cbiAgICB0aGlzLl9hbHQuZmlsbFZpZXdwb3J0Um93cyhmaWxsQXR0cik7XG4gICAgdGhpcy5fYWx0LnggPSB0aGlzLl9ub3JtYWwueDtcbiAgICB0aGlzLl9hbHQueSA9IHRoaXMuX25vcm1hbC55O1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX2FsdDtcbiAgICB0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlLmZpcmUoe1xuICAgICAgYWN0aXZlQnVmZmVyOiB0aGlzLl9hbHQsXG4gICAgICBpbmFjdGl2ZUJ1ZmZlcjogdGhpcy5fbm9ybWFsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzaXplcyBib3RoIG5vcm1hbCBhbmQgYWx0IGJ1ZmZlcnMsIGFkanVzdGluZyB0aGVpciBkYXRhIGFjY29yZGluZ2x5LlxuICAgKiBAcGFyYW0gbmV3Q29scyBUaGUgbmV3IG51bWJlciBvZiBjb2x1bW5zLlxuICAgKiBAcGFyYW0gbmV3Um93cyBUaGUgbmV3IG51bWJlciBvZiByb3dzLlxuICAgKi9cbiAgcHVibGljIHJlc2l6ZShuZXdDb2xzOiBudW1iZXIsIG5ld1Jvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX25vcm1hbC5yZXNpemUobmV3Q29scywgbmV3Um93cyk7XG4gICAgdGhpcy5fYWx0LnJlc2l6ZShuZXdDb2xzLCBuZXdSb3dzKTtcbiAgICB0aGlzLnNldHVwVGFiU3RvcHMobmV3Q29scyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgdGhlIHRhYiBzdG9wcy5cbiAgICogQHBhcmFtIGkgVGhlIGluZGV4IHRvIHN0YXJ0IHNldHRpbmcgdXAgdGFiIHN0b3BzIGZyb20uXG4gICAqL1xuICBwdWJsaWMgc2V0dXBUYWJTdG9wcyhpPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm9ybWFsLnNldHVwVGFiU3RvcHMoaSk7XG4gICAgdGhpcy5fYWx0LnNldHVwVGFiU3RvcHMoaSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ2hhckRhdGEsIElDZWxsRGF0YSwgSUV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgc3RyaW5nRnJvbUNvZGVQb2ludCB9IGZyb20gJ2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlcic7XG5pbXBvcnQgeyBDSEFSX0RBVEFfQ0hBUl9JTkRFWCwgQ0hBUl9EQVRBX1dJRFRIX0lOREVYLCBDSEFSX0RBVEFfQVRUUl9JTkRFWCwgQ29udGVudCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEsIEV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuXG4vKipcbiAqIENlbGxEYXRhIC0gcmVwcmVzZW50cyBhIHNpbmdsZSBDZWxsIGluIHRoZSB0ZXJtaW5hbCBidWZmZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICAvKiogSGVscGVyIHRvIGNyZWF0ZSBDZWxsRGF0YSBmcm9tIENoYXJEYXRhLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiBDZWxsRGF0YSB7XG4gICAgY29uc3Qgb2JqID0gbmV3IENlbGxEYXRhKCk7XG4gICAgb2JqLnNldEZyb21DaGFyRGF0YSh2YWx1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICAvKiogUHJpbWl0aXZlcyBmcm9tIHRlcm1pbmFsIGJ1ZmZlci4gKi9cbiAgcHVibGljIGNvbnRlbnQgPSAwO1xuICBwdWJsaWMgZmcgPSAwO1xuICBwdWJsaWMgYmcgPSAwO1xuICBwdWJsaWMgZXh0ZW5kZWQ6IElFeHRlbmRlZEF0dHJzID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcbiAgcHVibGljIGNvbWJpbmVkRGF0YSA9ICcnO1xuICAvKiogV2hldGhlciBjZWxsIGNvbnRhaW5zIGEgY29tYmluZWQgc3RyaW5nLiAqL1xuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gIH1cbiAgLyoqIFdpZHRoIG9mIHRoZSBjZWxsLiAqL1xuICBwdWJsaWMgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50ID4+IENvbnRlbnQuV0lEVEhfU0hJRlQ7XG4gIH1cbiAgLyoqIEpTIHN0cmluZyBvZiB0aGUgY29udGVudC4gKi9cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgcmV0dXJuIHN0cmluZ0Zyb21Db2RlUG9pbnQodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuICAvKipcbiAgICogQ29kZXBvaW50IG9mIGNlbGxcbiAgICogTm90ZSB0aGlzIHJldHVybnMgdGhlIFVURjMyIGNvZGVwb2ludCBvZiBzaW5nbGUgY2hhcnMsXG4gICAqIGlmIGNvbnRlbnQgaXMgYSBjb21iaW5lZCBzdHJpbmcgaXQgcmV0dXJucyB0aGUgY29kZXBvaW50XG4gICAqIG9mIHRoZSBsYXN0IGNoYXIgaW4gc3RyaW5nIHRvIGJlIGluIGxpbmUgd2l0aCBjb2RlIGluIENoYXJEYXRhLlxuICAgKi9cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuaXNDb21iaW5lZCgpKVxuICAgICAgPyB0aGlzLmNvbWJpbmVkRGF0YS5jaGFyQ29kZUF0KHRoaXMuY29tYmluZWREYXRhLmxlbmd0aCAtIDEpXG4gICAgICA6IHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0s7XG4gIH1cbiAgLyoqIFNldCBkYXRhIGZyb20gQ2hhckRhdGEgKi9cbiAgcHVibGljIHNldEZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmZnID0gdmFsdWVbQ0hBUl9EQVRBX0FUVFJfSU5ERVhdO1xuICAgIHRoaXMuYmcgPSAwO1xuICAgIGxldCBjb21iaW5lZCA9IGZhbHNlO1xuICAgIC8vIHN1cnJvZ2F0ZXMgYW5kIGNvbWJpbmVkIHN0cmluZ3MgbmVlZCBzcGVjaWFsIHRyZWF0bWVudFxuICAgIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID4gMikge1xuICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyBpZiB0aGUgMi1jaGFyIHN0cmluZyBpcyBhIHN1cnJvZ2F0ZSBjcmVhdGUgc2luZ2xlIGNvZGVwb2ludFxuICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGlzIGNvbWJpbmVkXG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMSk7XG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSAoKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWQpIHtcbiAgICAgIHRoaXMuY29tYmluZWREYXRhID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdO1xuICAgICAgdGhpcy5jb250ZW50ID0gQ29udGVudC5JU19DT01CSU5FRF9NQVNLIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICB9XG4gIC8qKiBHZXQgZGF0YSBhcyBDaGFyRGF0YS4gKi9cbiAgcHVibGljIGdldEFzQ2hhckRhdGEoKTogQ2hhckRhdGEge1xuICAgIHJldHVybiBbdGhpcy5mZywgdGhpcy5nZXRDaGFycygpLCB0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0Q29kZSgpXTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DT0xPUiA9IDA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9BVFRSID0gKDAgPDwgMTgpIHwgKERFRkFVTFRfQ09MT1IgPDwgOSkgfCAoMjU2IDw8IDApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhUID0gMDtcblxuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9BVFRSX0lOREVYID0gMDtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQ0hBUl9JTkRFWCA9IDE7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX1dJRFRIX0lOREVYID0gMjtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQ09ERV9JTkRFWCA9IDM7XG5cbi8qKlxuICogTnVsbCBjZWxsIC0gYSByZWFsIGVtcHR5IGNlbGwgKGNvbnRhaW5pbmcgbm90aGluZykuXG4gKiBOb3RlIHRoYXQgY29kZSBzaG91bGQgYWx3YXlzIGJlIDAgZm9yIGEgbnVsbCBjZWxsIGFzXG4gKiBzZXZlcmFsIHRlc3QgY29uZGl0aW9uIG9mIHRoZSBidWZmZXIgbGluZSByZWx5IG9uIHRoaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfQ0hBUiA9ICcnO1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9XSURUSCA9IDE7XG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX0NPREUgPSAwO1xuXG4vKipcbiAqIFdoaXRlc3BhY2UgY2VsbC5cbiAqIFRoaXMgaXMgbWVhbnQgYXMgYSByZXBsYWNlbWVudCBmb3IgZW1wdHkgY2VsbHMgd2hlbiBuZWVkZWRcbiAqIGR1cmluZyByZW5kZXJpbmcgbGluZXMgdG8gcHJlc2VydmUgY29ycmVjdCBhbGlnbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9DSEFSID0gJyAnO1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9XSURUSCA9IDE7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX0NPREUgPSAzMjtcblxuLyoqXG4gKiBCaXRtYXNrcyBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gYGNvbnRlbnRgLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBDb250ZW50IHtcbiAgLyoqXG4gICAqIGJpdCAxLi4yMSAgICBjb2RlcG9pbnQsIG1heCBhbGxvd2VkIGluIFVURjMyIGlzIDB4MTBGRkZGICgyMSBiaXRzIHRha2VuKVxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgY29kZXBvaW50ID0gY29udGVudCAmIENvbnRlbnQuY29kZXBvaW50TWFzaztgXG4gICAqICAgICAgICAgICAgICB3cml0ZTogIGBjb250ZW50IHw9IGNvZGVwb2ludCAmIENvbnRlbnQuY29kZXBvaW50TWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IGlmIHByZWNvbmRpdGlvbiBgY29kZXBvaW50IDw9IDB4MTBGRkZGYCBpcyBtZXQ6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBjb250ZW50IHw9IGNvZGVwb2ludDtgXG4gICAqL1xuICBDT0RFUE9JTlRfTUFTSyA9IDB4MUZGRkZGLFxuXG4gIC8qKlxuICAgKiBiaXQgMjIgICAgICAgZmxhZyBpbmRpY2F0aW9uIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGNvbWJpbmVkIGNvbnRlbnRcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGlzQ29tYmluZWQgPSBjb250ZW50ICYgQ29udGVudC5pc0NvbWJpbmVkO2BcbiAgICogICAgICAgICAgICAgIHNldDogICAgYGNvbnRlbnQgfD0gQ29udGVudC5pc0NvbWJpbmVkO2BcbiAgICogICAgICAgICAgICAgIGNsZWFyOiAgYGNvbnRlbnQgJj0gfkNvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqL1xuICBJU19DT01CSU5FRF9NQVNLID0gMHgyMDAwMDAsICAvLyAxIDw8IDIxXG5cbiAgLyoqXG4gICAqIGJpdCAxLi4yMiAgICBtYXNrIHRvIGNoZWNrIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGFueSBzdHJpbmcgZGF0YVxuICAgKiAgICAgICAgICAgICAgd2UgbmVlZCB0byBjaGVjayBmb3IgY29kZXBvaW50IGFuZCBpc0NvbWJpbmVkIGJpdHMgdG8gc2VlXG4gICAqICAgICAgICAgICAgICB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBhbnl0aGluZ1xuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgaXNFbXB0eSA9ICEoY29udGVudCAmIENvbnRlbnQuaGFzQ29udGVudClgXG4gICAqL1xuICBIQVNfQ09OVEVOVF9NQVNLID0gMHgzRkZGRkYsXG5cbiAgLyoqXG4gICAqIGJpdCAyMy4uMjQgICB3Y3dpZHRoIHZhbHVlIG9mIGNlbGwsIHRha2VzIDIgYml0cyAocmFuZ2VzIGZyb20gMC4uMilcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYHdpZHRoID0gKGNvbnRlbnQgJiBDb250ZW50LndpZHRoTWFzaykgPj4gQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGhhc1dpZHRoID0gY29udGVudCAmIENvbnRlbnQud2lkdGhNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgYXMgbG9uZyBhcyB3Y3dpZHRoIGlzIGhpZ2hlc3QgdmFsdWUgaW4gYGNvbnRlbnRgOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgd2lkdGggPSBjb250ZW50ID4+IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqICAgICAgICAgICAgICB3cml0ZTogIGBjb250ZW50IHw9ICh3aWR0aCA8PCBDb250ZW50LndpZHRoU2hpZnQpICYgQ29udGVudC53aWR0aE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCBpZiBwcmVjb25kaXRpb24gYDAgPD0gd2lkdGggPD0gM2AgaXMgbWV0OlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgY29udGVudCB8PSB3aWR0aCA8PCBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKi9cbiAgV0lEVEhfTUFTSyA9IDB4QzAwMDAwLCAgIC8vIDMgPDwgMjJcbiAgV0lEVEhfU0hJRlQgPSAyMlxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIGJpdCAxLi44ICAgICBibHVlIGluIFJHQiwgY29sb3IgaW4gUDI1NiBhbmQgUDE2XG4gICAqL1xuICBCTFVFX01BU0sgPSAweEZGLFxuICBCTFVFX1NISUZUID0gMCxcbiAgUENPTE9SX01BU0sgPSAweEZGLFxuICBQQ09MT1JfU0hJRlQgPSAwLFxuXG4gIC8qKlxuICAgKiBiaXQgOS4uMTYgICAgZ3JlZW4gaW4gUkdCXG4gICAqL1xuICBHUkVFTl9NQVNLID0gMHhGRjAwLFxuICBHUkVFTl9TSElGVCA9IDgsXG5cbiAgLyoqXG4gICAqIGJpdCAxNy4uMjQgICByZWQgaW4gUkdCXG4gICAqL1xuICBSRURfTUFTSyA9IDB4RkYwMDAwLFxuICBSRURfU0hJRlQgPSAxNixcblxuICAvKipcbiAgICogYml0IDI1Li4yNiAgIGNvbG9yIG1vZGU6IERFRkFVTFQgKDApIHwgUDE2ICgxKSB8IFAyNTYgKDIpIHwgUkdCICgzKVxuICAgKi9cbiAgQ01fTUFTSyA9IDB4MzAwMDAwMCxcbiAgQ01fREVGQVVMVCA9IDAsXG4gIENNX1AxNiA9IDB4MTAwMDAwMCxcbiAgQ01fUDI1NiA9IDB4MjAwMDAwMCxcbiAgQ01fUkdCID0gMHgzMDAwMDAwLFxuXG4gIC8qKlxuICAgKiBiaXQgMS4uMjQgIFJHQiByb29tXG4gICAqL1xuICBSR0JfTUFTSyA9IDB4RkZGRkZGXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEZnRmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4zMlxuICAgKi9cbiAgSU5WRVJTRSA9IDB4NDAwMDAwMCxcbiAgQk9MRCA9IDB4ODAwMDAwMCxcbiAgVU5ERVJMSU5FID0gMHgxMDAwMDAwMCxcbiAgQkxJTksgPSAweDIwMDAwMDAwLFxuICBJTlZJU0lCTEUgPSAweDQwMDAwMDAwLFxuICBTVFJJS0VUSFJPVUdIID0gMHg4MDAwMDAwMCxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQmdGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjMyICh1cHBlciAyIHVudXNlZClcbiAgICovXG4gIElUQUxJQyA9IDB4NDAwMDAwMCxcbiAgRElNID0gMHg4MDAwMDAwLFxuICBIQVNfRVhURU5ERUQgPSAweDEwMDAwMDAwLFxuICBQUk9URUNURUQgPSAweDIwMDAwMDAwLFxuICBPVkVSTElORSA9IDB4NDAwMDAwMDBcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRXh0RmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4yOVxuICAgKi9cbiAgVU5ERVJMSU5FX1NUWUxFID0gMHgxQzAwMDAwMCxcblxuICAvKipcbiAgICogYml0IDMwLi4zMlxuICAgKlxuICAgKiBBbiBvcHRpb25hbCB2YXJpYW50IGZvciB0aGUgZ2x5cGgsIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gb2Zmc2V0IHVuZGVybGluZXMgYnkgYVxuICAgKiBudW1iZXIgb2YgcGl4ZWxzIHRvIGNyZWF0ZSBhIHBlcmZlY3QgcGF0dGVybi5cbiAgICovXG4gIFZBUklBTlRfT0ZGU0VUID0gMHhFMDAwMDAwMFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBVbmRlcmxpbmVTdHlsZSB7XG4gIE5PTkUgPSAwLFxuICBTSU5HTEUgPSAxLFxuICBET1VCTEUgPSAyLFxuICBDVVJMWSA9IDMsXG4gIERPVFRFRCA9IDQsXG4gIERBU0hFRCA9IDVcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBkaXNwb3NlQXJyYXkgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlLCBJTWFya2VyIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGNsYXNzIE1hcmtlciBpbXBsZW1lbnRzIElNYXJrZXIge1xuICBwcml2YXRlIHN0YXRpYyBfbmV4dElkID0gMTtcblxuICBwdWJsaWMgaXNEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lkOiBudW1iZXIgPSBNYXJrZXIuX25leHRJZCsrO1xuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9pZDsgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGlzcG9zZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGlzcG9zZSA9IHRoaXMuX29uRGlzcG9zZS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbGluZTogbnVtYmVyXG4gICkge1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMubGluZSA9IC0xO1xuICAgIC8vIEVtaXQgYmVmb3JlIHN1cGVyLmRpc3Bvc2Ugc3VjaCB0aGF0IGRpc3Bvc2UgbGlzdGVuZXJzIGdldCBhIGNoYW5nZSB0byByZWFjdFxuICAgIHRoaXMuX29uRGlzcG9zZS5maXJlKCk7XG4gICAgZGlzcG9zZUFycmF5KHRoaXMuX2Rpc3Bvc2FibGVzKTtcbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZGlzcG9zYWJsZTogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJzZXQgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXIgc2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHRlcm1pbmFsLiBUaGVzZSBlbmFibGUgc2V2ZXJhbCBsYW5ndWFnZXNcbiAqIHRvIGJlIHJlcHJlc2VudGVkIHdpdGhpbiB0aGUgdGVybWluYWwgd2l0aCBvbmx5IDgtYml0IGVuY29kaW5nLiBTZWUgSVNPIDIwMjJcbiAqIGZvciBhIGRpc2N1c3Npb24gb24gY2hhcmFjdGVyIHNldHMuIE9ubHkgVlQxMDAgY2hhcmFjdGVyIHNldHMgYXJlIHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQVJTRVRTOiB7IFtrZXk6IHN0cmluZ106IElDaGFyc2V0IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0LCBVUy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0hBUlNFVDogSUNoYXJzZXQgfCB1bmRlZmluZWQgPSBDSEFSU0VUU1snQiddO1xuXG4vKipcbiAqIERFQyBTcGVjaWFsIENoYXJhY3RlciBhbmQgTGluZSBEcmF3aW5nIFNldC5cbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MTAyLXVnL3RhYmxlNS0xMy5odG1sXG4gKiBBIGxvdCBvZiBjdXJzZXMgYXBwcyB1c2UgdGhpcyBpZiB0aGV5IHNlZSBURVJNPXh0ZXJtLlxuICogdGVzdGluZzogZWNobyAtZSAnXFxlKDBhXFxlKEInXG4gKiBUaGUgeHRlcm0gb3V0cHV0IHNvbWV0aW1lcyBzZWVtcyB0byBjb25mbGljdCB3aXRoIHRoZVxuICogcmVmZXJlbmNlIGFib3ZlLiB4dGVybSBzZWVtcyBpbiBsaW5lIHdpdGggdGhlIHJlZmVyZW5jZVxuICogd2hlbiBydW5uaW5nIHZ0dGVzdCBob3dldmVyLlxuICogVGhlIHRhYmxlIGJlbG93IG5vdyB1c2VzIHh0ZXJtJ3Mgb3V0cHV0IGZyb20gdnR0ZXN0LlxuICovXG5DSEFSU0VUU1snMCddID0ge1xuICAnYCc6ICdcXHUyNWM2JywgLy8gJ+KXhidcbiAgJ2EnOiAnXFx1MjU5MicsIC8vICfilpInXG4gICdiJzogJ1xcdTI0MDknLCAvLyAn4pCJJyAoSFQpXG4gICdjJzogJ1xcdTI0MGMnLCAvLyAn4pCMJyAoRkYpXG4gICdkJzogJ1xcdTI0MGQnLCAvLyAn4pCNJyAoQ1IpXG4gICdlJzogJ1xcdTI0MGEnLCAvLyAn4pCKJyAoTEYpXG4gICdmJzogJ1xcdTAwYjAnLCAvLyAnwrAnXG4gICdnJzogJ1xcdTAwYjEnLCAvLyAnwrEnXG4gICdoJzogJ1xcdTI0MjQnLCAvLyAn4pCkJyAoTkwpXG4gICdpJzogJ1xcdTI0MGInLCAvLyAn4pCLJyAoVlQpXG4gICdqJzogJ1xcdTI1MTgnLCAvLyAn4pSYJ1xuICAnayc6ICdcXHUyNTEwJywgLy8gJ+KUkCdcbiAgJ2wnOiAnXFx1MjUwYycsIC8vICfilIwnXG4gICdtJzogJ1xcdTI1MTQnLCAvLyAn4pSUJ1xuICAnbic6ICdcXHUyNTNjJywgLy8gJ+KUvCdcbiAgJ28nOiAnXFx1MjNiYScsIC8vICfijronXG4gICdwJzogJ1xcdTIzYmInLCAvLyAn4o67J1xuICAncSc6ICdcXHUyNTAwJywgLy8gJ+KUgCdcbiAgJ3InOiAnXFx1MjNiYycsIC8vICfijrwnXG4gICdzJzogJ1xcdTIzYmQnLCAvLyAn4o69J1xuICAndCc6ICdcXHUyNTFjJywgLy8gJ+KUnCdcbiAgJ3UnOiAnXFx1MjUyNCcsIC8vICfilKQnXG4gICd2JzogJ1xcdTI1MzQnLCAvLyAn4pS0J1xuICAndyc6ICdcXHUyNTJjJywgLy8gJ+KUrCdcbiAgJ3gnOiAnXFx1MjUwMicsIC8vICfilIInXG4gICd5JzogJ1xcdTIyNjQnLCAvLyAn4omkJ1xuICAneic6ICdcXHUyMjY1JywgLy8gJ+KJpSdcbiAgJ3snOiAnXFx1MDNjMCcsIC8vICfPgCdcbiAgJ3wnOiAnXFx1MjI2MCcsIC8vICfiiaAnXG4gICd9JzogJ1xcdTAwYTMnLCAvLyAnwqMnXG4gICd+JzogJ1xcdTAwYjcnICAvLyAnwrcnXG59O1xuXG4vKipcbiAqIEJyaXRpc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChBXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItNS5odG1sXG4gKi9cbkNIQVJTRVRTWydBJ10gPSB7XG4gICcjJzogJ8KjJ1xufTtcblxuLyoqXG4gKiBVbml0ZWQgU3RhdGVzIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoQlxuICovXG5DSEFSU0VUU1snQiddID0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIER1dGNoIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoNFxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTYuaHRtbFxuICovXG5DSEFSU0VUU1snNCddID0ge1xuICAnIyc6ICfCoycsXG4gICdAJzogJ8K+JyxcbiAgJ1snOiAnaWonLFxuICAnXFxcXCc6ICfCvScsXG4gICddJzogJ3wnLFxuICAneyc6ICfCqCcsXG4gICd8JzogJ2YnLFxuICAnfSc6ICfCvCcsXG4gICd+JzogJ8K0J1xufTtcblxuLyoqXG4gKiBGaW5uaXNoIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoQyBvciBFU0MgKDVcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi03Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0MnXSA9XG5DSEFSU0VUU1snNSddID0ge1xuICAnWyc6ICfDhCcsXG4gICdcXFxcJzogJ8OWJyxcbiAgJ10nOiAnw4UnLFxuICAnXic6ICfDnCcsXG4gICdgJzogJ8OpJyxcbiAgJ3snOiAnw6QnLFxuICAnfCc6ICfDticsXG4gICd9JzogJ8OlJyxcbiAgJ34nOiAnw7wnXG59O1xuXG4vKipcbiAqIEZyZW5jaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKFJcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi04Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ1InXSA9IHtcbiAgJyMnOiAnwqMnLFxuICAnQCc6ICfDoCcsXG4gICdbJzogJ8KwJyxcbiAgJ1xcXFwnOiAnw6cnLFxuICAnXSc6ICfCpycsXG4gICd7JzogJ8OpJyxcbiAgJ3wnOiAnw7knLFxuICAnfSc6ICfDqCcsXG4gICd+JzogJ8KoJ1xufTtcblxuLyoqXG4gKiBGcmVuY2ggQ2FuYWRpYW4gY2hhcmFjdGVyIHNldFxuICogRVNDIChRXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItOS5odG1sXG4gKi9cbkNIQVJTRVRTWydRJ10gPSB7XG4gICdAJzogJ8OgJyxcbiAgJ1snOiAnw6InLFxuICAnXFxcXCc6ICfDpycsXG4gICddJzogJ8OqJyxcbiAgJ14nOiAnw64nLFxuICAnYCc6ICfDtCcsXG4gICd7JzogJ8OpJyxcbiAgJ3wnOiAnw7knLFxuICAnfSc6ICfDqCcsXG4gICd+JzogJ8O7J1xufTtcblxuLyoqXG4gKiBHZXJtYW4gY2hhcmFjdGVyIHNldFxuICogRVNDIChLXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTAuaHRtbFxuICovXG5DSEFSU0VUU1snSyddID0ge1xuICAnQCc6ICfCpycsXG4gICdbJzogJ8OEJyxcbiAgJ1xcXFwnOiAnw5YnLFxuICAnXSc6ICfDnCcsXG4gICd7JzogJ8OkJyxcbiAgJ3wnOiAnw7YnLFxuICAnfSc6ICfDvCcsXG4gICd+JzogJ8OfJ1xufTtcblxuLyoqXG4gKiBJdGFsaWFuIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoWVxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTExLmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ1knXSA9IHtcbiAgJyMnOiAnwqMnLFxuICAnQCc6ICfCpycsXG4gICdbJzogJ8KwJyxcbiAgJ1xcXFwnOiAnw6cnLFxuICAnXSc6ICfDqScsXG4gICdgJzogJ8O5JyxcbiAgJ3snOiAnw6AnLFxuICAnfCc6ICfDsicsXG4gICd9JzogJ8OoJyxcbiAgJ34nOiAnw6wnXG59O1xuXG4vKipcbiAqIE5vcndlZ2lhbi9EYW5pc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChFIG9yIEVTQyAoNlxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTEyLmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0UnXSA9XG5DSEFSU0VUU1snNiddID0ge1xuICAnQCc6ICfDhCcsXG4gICdbJzogJ8OGJyxcbiAgJ1xcXFwnOiAnw5gnLFxuICAnXSc6ICfDhScsXG4gICdeJzogJ8OcJyxcbiAgJ2AnOiAnw6QnLFxuICAneyc6ICfDpicsXG4gICd8JzogJ8O4JyxcbiAgJ30nOiAnw6UnLFxuICAnfic6ICfDvCdcbn07XG5cbi8qKlxuICogU3BhbmlzaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKFpcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi0xMy5odG1sXG4gKi9cbkNIQVJTRVRTWydaJ10gPSB7XG4gICcjJzogJ8KjJyxcbiAgJ0AnOiAnwqcnLFxuICAnWyc6ICfCoScsXG4gICdcXFxcJzogJ8ORJyxcbiAgJ10nOiAnwr8nLFxuICAneyc6ICfCsCcsXG4gICd8JzogJ8OxJyxcbiAgJ30nOiAnw6cnXG59O1xuXG4vKipcbiAqIFN3ZWRpc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChIIG9yIEVTQyAoN1xuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTE0Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0gnXSA9XG5DSEFSU0VUU1snNyddID0ge1xuICAnQCc6ICfDiScsXG4gICdbJzogJ8OEJyxcbiAgJ1xcXFwnOiAnw5YnLFxuICAnXSc6ICfDhScsXG4gICdeJzogJ8OcJyxcbiAgJ2AnOiAnw6knLFxuICAneyc6ICfDpCcsXG4gICd8JzogJ8O2JyxcbiAgJ30nOiAnw6UnLFxuICAnfic6ICfDvCdcbn07XG5cbi8qKlxuICogU3dpc3MgY2hhcmFjdGVyIHNldFxuICogRVNDICg9XG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTUuaHRtbFxuICovXG5DSEFSU0VUU1snPSddID0ge1xuICAnIyc6ICfDuScsXG4gICdAJzogJ8OgJyxcbiAgJ1snOiAnw6knLFxuICAnXFxcXCc6ICfDpycsXG4gICddJzogJ8OqJyxcbiAgJ14nOiAnw64nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICdfJzogJ8OoJyxcbiAgJ2AnOiAnw7QnLFxuICAneyc6ICfDpCcsXG4gICd8JzogJ8O2JyxcbiAgJ30nOiAnw7wnLFxuICAnfic6ICfDuydcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qKlxuICogQzAgY29udHJvbCBjb2Rlc1xuICogU2VlID0gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQzBfYW5kX0MxX2NvbnRyb2xfY29kZXNcbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBDMCB7XG4gIC8qKiBOdWxsIChDYXJldCA9IF5ALCBDID0gXFwwKSAqL1xuICBleHBvcnQgY29uc3QgTlVMID0gJ1xceDAwJztcbiAgLyoqIFN0YXJ0IG9mIEhlYWRpbmcgKENhcmV0ID0gXkEpICovXG4gIGV4cG9ydCBjb25zdCBTT0ggPSAnXFx4MDEnO1xuICAvKiogU3RhcnQgb2YgVGV4dCAoQ2FyZXQgPSBeQikgKi9cbiAgZXhwb3J0IGNvbnN0IFNUWCA9ICdcXHgwMic7XG4gIC8qKiBFbmQgb2YgVGV4dCAoQ2FyZXQgPSBeQykgKi9cbiAgZXhwb3J0IGNvbnN0IEVUWCA9ICdcXHgwMyc7XG4gIC8qKiBFbmQgb2YgVHJhbnNtaXNzaW9uIChDYXJldCA9IF5EKSAqL1xuICBleHBvcnQgY29uc3QgRU9UID0gJ1xceDA0JztcbiAgLyoqIEVucXVpcnkgKENhcmV0ID0gXkUpICovXG4gIGV4cG9ydCBjb25zdCBFTlEgPSAnXFx4MDUnO1xuICAvKiogQWNrbm93bGVkZ2UgKENhcmV0ID0gXkYpICovXG4gIGV4cG9ydCBjb25zdCBBQ0sgPSAnXFx4MDYnO1xuICAvKiogQmVsbCAoQ2FyZXQgPSBeRywgQyA9IFxcYSkgKi9cbiAgZXhwb3J0IGNvbnN0IEJFTCA9ICdcXHgwNyc7XG4gIC8qKiBCYWNrc3BhY2UgKENhcmV0ID0gXkgsIEMgPSBcXGIpICovXG4gIGV4cG9ydCBjb25zdCBCUyAgPSAnXFx4MDgnO1xuICAvKiogQ2hhcmFjdGVyIFRhYnVsYXRpb24sIEhvcml6b250YWwgVGFidWxhdGlvbiAoQ2FyZXQgPSBeSSwgQyA9IFxcdCkgKi9cbiAgZXhwb3J0IGNvbnN0IEhUICA9ICdcXHgwOSc7XG4gIC8qKiBMaW5lIEZlZWQgKENhcmV0ID0gXkosIEMgPSBcXG4pICovXG4gIGV4cG9ydCBjb25zdCBMRiAgPSAnXFx4MGEnO1xuICAvKiogTGluZSBUYWJ1bGF0aW9uLCBWZXJ0aWNhbCBUYWJ1bGF0aW9uIChDYXJldCA9IF5LLCBDID0gXFx2KSAqL1xuICBleHBvcnQgY29uc3QgVlQgID0gJ1xceDBiJztcbiAgLyoqIEZvcm0gRmVlZCAoQ2FyZXQgPSBeTCwgQyA9IFxcZikgKi9cbiAgZXhwb3J0IGNvbnN0IEZGICA9ICdcXHgwYyc7XG4gIC8qKiBDYXJyaWFnZSBSZXR1cm4gKENhcmV0ID0gXk0sIEMgPSBcXHIpICovXG4gIGV4cG9ydCBjb25zdCBDUiAgPSAnXFx4MGQnO1xuICAvKiogU2hpZnQgT3V0IChDYXJldCA9IF5OKSAqL1xuICBleHBvcnQgY29uc3QgU08gID0gJ1xceDBlJztcbiAgLyoqIFNoaWZ0IEluIChDYXJldCA9IF5PKSAqL1xuICBleHBvcnQgY29uc3QgU0kgID0gJ1xceDBmJztcbiAgLyoqIERhdGEgTGluayBFc2NhcGUgKENhcmV0ID0gXlApICovXG4gIGV4cG9ydCBjb25zdCBETEUgPSAnXFx4MTAnO1xuICAvKiogRGV2aWNlIENvbnRyb2wgT25lIChYT04pIChDYXJldCA9IF5RKSAqL1xuICBleHBvcnQgY29uc3QgREMxID0gJ1xceDExJztcbiAgLyoqIERldmljZSBDb250cm9sIFR3byAoQ2FyZXQgPSBeUikgKi9cbiAgZXhwb3J0IGNvbnN0IERDMiA9ICdcXHgxMic7XG4gIC8qKiBEZXZpY2UgQ29udHJvbCBUaHJlZSAoWE9GRikgKENhcmV0ID0gXlMpICovXG4gIGV4cG9ydCBjb25zdCBEQzMgPSAnXFx4MTMnO1xuICAvKiogRGV2aWNlIENvbnRyb2wgRm91ciAoQ2FyZXQgPSBeVCkgKi9cbiAgZXhwb3J0IGNvbnN0IERDNCA9ICdcXHgxNCc7XG4gIC8qKiBOZWdhdGl2ZSBBY2tub3dsZWRnZSAoQ2FyZXQgPSBeVSkgKi9cbiAgZXhwb3J0IGNvbnN0IE5BSyA9ICdcXHgxNSc7XG4gIC8qKiBTeW5jaHJvbm91cyBJZGxlIChDYXJldCA9IF5WKSAqL1xuICBleHBvcnQgY29uc3QgU1lOID0gJ1xceDE2JztcbiAgLyoqIEVuZCBvZiBUcmFuc21pc3Npb24gQmxvY2sgKENhcmV0ID0gXlcpICovXG4gIGV4cG9ydCBjb25zdCBFVEIgPSAnXFx4MTcnO1xuICAvKiogQ2FuY2VsIChDYXJldCA9IF5YKSAqL1xuICBleHBvcnQgY29uc3QgQ0FOID0gJ1xceDE4JztcbiAgLyoqIEVuZCBvZiBNZWRpdW0gKENhcmV0ID0gXlkpICovXG4gIGV4cG9ydCBjb25zdCBFTSAgPSAnXFx4MTknO1xuICAvKiogU3Vic3RpdHV0ZSAoQ2FyZXQgPSBeWikgKi9cbiAgZXhwb3J0IGNvbnN0IFNVQiA9ICdcXHgxYSc7XG4gIC8qKiBFc2NhcGUgKENhcmV0ID0gXlssIEMgPSBcXGUpICovXG4gIGV4cG9ydCBjb25zdCBFU0MgPSAnXFx4MWInO1xuICAvKiogRmlsZSBTZXBhcmF0b3IgKENhcmV0ID0gXlxcKSAqL1xuICBleHBvcnQgY29uc3QgRlMgID0gJ1xceDFjJztcbiAgLyoqIEdyb3VwIFNlcGFyYXRvciAoQ2FyZXQgPSBeXSkgKi9cbiAgZXhwb3J0IGNvbnN0IEdTICA9ICdcXHgxZCc7XG4gIC8qKiBSZWNvcmQgU2VwYXJhdG9yIChDYXJldCA9IF5eKSAqL1xuICBleHBvcnQgY29uc3QgUlMgID0gJ1xceDFlJztcbiAgLyoqIFVuaXQgU2VwYXJhdG9yIChDYXJldCA9IF5fKSAqL1xuICBleHBvcnQgY29uc3QgVVMgID0gJ1xceDFmJztcbiAgLyoqIFNwYWNlICovXG4gIGV4cG9ydCBjb25zdCBTUCAgPSAnXFx4MjAnO1xuICAvKiogRGVsZXRlIChDYXJldCA9IF4/KSAqL1xuICBleHBvcnQgY29uc3QgREVMID0gJ1xceDdmJztcbn1cblxuLyoqXG4gKiBDMSBjb250cm9sIGNvZGVzXG4gKiBTZWUgPSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DMF9hbmRfQzFfY29udHJvbF9jb2Rlc1xuICovXG5leHBvcnQgbmFtZXNwYWNlIEMxIHtcbiAgLyoqIHBhZGRpbmcgY2hhcmFjdGVyICovXG4gIGV4cG9ydCBjb25zdCBQQUQgPSAnXFx4ODAnO1xuICAvKiogSGlnaCBPY3RldCBQcmVzZXQgKi9cbiAgZXhwb3J0IGNvbnN0IEhPUCA9ICdcXHg4MSc7XG4gIC8qKiBCcmVhayBQZXJtaXR0ZWQgSGVyZSAqL1xuICBleHBvcnQgY29uc3QgQlBIID0gJ1xceDgyJztcbiAgLyoqIE5vIEJyZWFrIEhlcmUgKi9cbiAgZXhwb3J0IGNvbnN0IE5CSCA9ICdcXHg4Myc7XG4gIC8qKiBJbmRleCAqL1xuICBleHBvcnQgY29uc3QgSU5EID0gJ1xceDg0JztcbiAgLyoqIE5leHQgTGluZSAqL1xuICBleHBvcnQgY29uc3QgTkVMID0gJ1xceDg1JztcbiAgLyoqIFN0YXJ0IG9mIFNlbGVjdGVkIEFyZWEgKi9cbiAgZXhwb3J0IGNvbnN0IFNTQSA9ICdcXHg4Nic7XG4gIC8qKiBFbmQgb2YgU2VsZWN0ZWQgQXJlYSAqL1xuICBleHBvcnQgY29uc3QgRVNBID0gJ1xceDg3JztcbiAgLyoqIEhvcml6b250YWwgVGFidWxhdGlvbiBTZXQgKi9cbiAgZXhwb3J0IGNvbnN0IEhUUyA9ICdcXHg4OCc7XG4gIC8qKiBIb3Jpem9udGFsIFRhYnVsYXRpb24gV2l0aCBKdXN0aWZpY2F0aW9uICovXG4gIGV4cG9ydCBjb25zdCBIVEogPSAnXFx4ODknO1xuICAvKiogVmVydGljYWwgVGFidWxhdGlvbiBTZXQgKi9cbiAgZXhwb3J0IGNvbnN0IFZUUyA9ICdcXHg4YSc7XG4gIC8qKiBQYXJ0aWFsIExpbmUgRG93biAqL1xuICBleHBvcnQgY29uc3QgUExEID0gJ1xceDhiJztcbiAgLyoqIFBhcnRpYWwgTGluZSBVcCAqL1xuICBleHBvcnQgY29uc3QgUExVID0gJ1xceDhjJztcbiAgLyoqIFJldmVyc2UgSW5kZXggKi9cbiAgZXhwb3J0IGNvbnN0IFJJID0gJ1xceDhkJztcbiAgLyoqIFNpbmdsZS1TaGlmdCAyICovXG4gIGV4cG9ydCBjb25zdCBTUzIgPSAnXFx4OGUnO1xuICAvKiogU2luZ2xlLVNoaWZ0IDMgKi9cbiAgZXhwb3J0IGNvbnN0IFNTMyA9ICdcXHg4Zic7XG4gIC8qKiBEZXZpY2UgQ29udHJvbCBTdHJpbmcgKi9cbiAgZXhwb3J0IGNvbnN0IERDUyA9ICdcXHg5MCc7XG4gIC8qKiBQcml2YXRlIFVzZSAxICovXG4gIGV4cG9ydCBjb25zdCBQVTEgPSAnXFx4OTEnO1xuICAvKiogUHJpdmF0ZSBVc2UgMiAqL1xuICBleHBvcnQgY29uc3QgUFUyID0gJ1xceDkyJztcbiAgLyoqIFNldCBUcmFuc21pdCBTdGF0ZSAqL1xuICBleHBvcnQgY29uc3QgU1RTID0gJ1xceDkzJztcbiAgLyoqIERlc3RydWN0aXZlIGJhY2tzcGFjZSwgaW50ZW5kZWQgdG8gZWxpbWluYXRlIGFtYmlndWl0eSBhYm91dCBtZWFuaW5nIG9mIEJTLiAqL1xuICBleHBvcnQgY29uc3QgQ0NIID0gJ1xceDk0JztcbiAgLyoqIE1lc3NhZ2UgV2FpdGluZyAqL1xuICBleHBvcnQgY29uc3QgTVcgPSAnXFx4OTUnO1xuICAvKiogU3RhcnQgb2YgUHJvdGVjdGVkIEFyZWEgKi9cbiAgZXhwb3J0IGNvbnN0IFNQQSA9ICdcXHg5Nic7XG4gIC8qKiBFbmQgb2YgUHJvdGVjdGVkIEFyZWEgKi9cbiAgZXhwb3J0IGNvbnN0IEVQQSA9ICdcXHg5Nyc7XG4gIC8qKiBTdGFydCBvZiBTdHJpbmcgKi9cbiAgZXhwb3J0IGNvbnN0IFNPUyA9ICdcXHg5OCc7XG4gIC8qKiBTaW5nbGUgR3JhcGhpYyBDaGFyYWN0ZXIgSW50cm9kdWNlciAqL1xuICBleHBvcnQgY29uc3QgU0dDSSA9ICdcXHg5OSc7XG4gIC8qKiBTaW5nbGUgQ2hhcmFjdGVyIEludHJvZHVjZXIgKi9cbiAgZXhwb3J0IGNvbnN0IFNDSSA9ICdcXHg5YSc7XG4gIC8qKiBDb250cm9sIFNlcXVlbmNlIEludHJvZHVjZXIgKi9cbiAgZXhwb3J0IGNvbnN0IENTSSA9ICdcXHg5Yic7XG4gIC8qKiBTdHJpbmcgVGVybWluYXRvciAqL1xuICBleHBvcnQgY29uc3QgU1QgPSAnXFx4OWMnO1xuICAvKiogT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kICovXG4gIGV4cG9ydCBjb25zdCBPU0MgPSAnXFx4OWQnO1xuICAvKiogUHJpdmFjeSBNZXNzYWdlICovXG4gIGV4cG9ydCBjb25zdCBQTSA9ICdcXHg5ZSc7XG4gIC8qKiBBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmQgKi9cbiAgZXhwb3J0IGNvbnN0IEFQQyA9ICdcXHg5Zic7XG59XG5leHBvcnQgbmFtZXNwYWNlIEMxX0VTQ0FQRUQge1xuICBleHBvcnQgY29uc3QgU1QgPSBgJHtDMC5FU0N9XFxcXGA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBDaHJpc3RvcGhlciBKZWZmcmV5IChNSVQgTGljZW5zZSlcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElLZXlib2FyZEV2ZW50LCBJS2V5Ym9hcmRSZXN1bHQsIEtleWJvYXJkUmVzdWx0VHlwZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBDMCB9IGZyb20gJ2NvbW1vbi9kYXRhL0VzY2FwZVNlcXVlbmNlcyc7XG5cbi8vIHJlZyArIHNoaWZ0IGtleSBtYXBwaW5ncyBmb3IgZGlnaXRzIGFuZCBzcGVjaWFsIGNoYXJzXG5jb25zdCBLRVlDT0RFX0tFWV9NQVBQSU5HUzogeyBba2V5OiBudW1iZXJdOiBbc3RyaW5nLCBzdHJpbmddfSA9IHtcbiAgLy8gZGlnaXRzIDAtOVxuICA0ODogWycwJywgJyknXSxcbiAgNDk6IFsnMScsICchJ10sXG4gIDUwOiBbJzInLCAnQCddLFxuICA1MTogWyczJywgJyMnXSxcbiAgNTI6IFsnNCcsICckJ10sXG4gIDUzOiBbJzUnLCAnJSddLFxuICA1NDogWyc2JywgJ14nXSxcbiAgNTU6IFsnNycsICcmJ10sXG4gIDU2OiBbJzgnLCAnKiddLFxuICA1NzogWyc5JywgJygnXSxcblxuICAvLyBzcGVjaWFsIGNoYXJzXG4gIDE4NjogWyc7JywgJzonXSxcbiAgMTg3OiBbJz0nLCAnKyddLFxuICAxODg6IFsnLCcsICc8J10sXG4gIDE4OTogWyctJywgJ18nXSxcbiAgMTkwOiBbJy4nLCAnPiddLFxuICAxOTE6IFsnLycsICc/J10sXG4gIDE5MjogWydgJywgJ34nXSxcbiAgMjE5OiBbJ1snLCAneyddLFxuICAyMjA6IFsnXFxcXCcsICd8J10sXG4gIDIyMTogWyddJywgJ30nXSxcbiAgMjIyOiBbJ1xcJycsICdcIiddXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVLZXlib2FyZEV2ZW50KFxuICBldjogSUtleWJvYXJkRXZlbnQsXG4gIGFwcGxpY2F0aW9uQ3Vyc29yTW9kZTogYm9vbGVhbixcbiAgaXNNYWM6IGJvb2xlYW4sXG4gIG1hY09wdGlvbklzTWV0YTogYm9vbGVhblxuKTogSUtleWJvYXJkUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0OiBJS2V5Ym9hcmRSZXN1bHQgPSB7XG4gICAgdHlwZTogS2V5Ym9hcmRSZXN1bHRUeXBlLlNFTkRfS0VZLFxuICAgIC8vIFdoZXRoZXIgdG8gY2FuY2VsIGV2ZW50IHByb3BhZ2F0aW9uIChOT1RFOiB0aGlzIG1heSBub3QgYmUgbmVlZGVkIHNpbmNlIHRoZSBldmVudCBpc1xuICAgIC8vIGNhbmNlbGVkIGF0IHRoZSBlbmQgb2Yga2V5RG93blxuICAgIGNhbmNlbDogZmFsc2UsXG4gICAgLy8gVGhlIG5ldyBrZXkgZXZlbiB0byBlbWl0XG4gICAga2V5OiB1bmRlZmluZWRcbiAgfTtcbiAgY29uc3QgbW9kaWZpZXJzID0gKGV2LnNoaWZ0S2V5ID8gMSA6IDApIHwgKGV2LmFsdEtleSA/IDIgOiAwKSB8IChldi5jdHJsS2V5ID8gNCA6IDApIHwgKGV2Lm1ldGFLZXkgPyA4IDogMCk7XG4gIHN3aXRjaCAoZXYua2V5Q29kZSkge1xuICAgIGNhc2UgMDpcbiAgICAgIGlmIChldi5rZXkgPT09ICdVSUtleUlucHV0VXBBcnJvdycpIHtcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0EnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0EnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChldi5rZXkgPT09ICdVSUtleUlucHV0TGVmdEFycm93Jykge1xuICAgICAgICBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPRCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbRCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGV2LmtleSA9PT0gJ1VJS2V5SW5wdXRSaWdodEFycm93Jykge1xuICAgICAgICBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPQyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbQyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGV2LmtleSA9PT0gJ1VJS2V5SW5wdXREb3duQXJyb3cnKSB7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09CJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tCJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA4OlxuICAgICAgLy8gYmFja3NwYWNlXG4gICAgICByZXN1bHQua2V5ID0gZXYuY3RybEtleSA/ICdcXGInIDogQzAuREVMOyAvLyBeSCBvciBeP1xuICAgICAgaWYgKGV2LmFsdEtleSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgcmVzdWx0LmtleTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIC8vIHRhYlxuICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW1onO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5rZXkgPSBDMC5IVDtcbiAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzpcbiAgICAgIC8vIHJldHVybi9lbnRlclxuICAgICAgcmVzdWx0LmtleSA9IGV2LmFsdEtleSA/IEMwLkVTQyArIEMwLkNSIDogQzAuQ1I7XG4gICAgICByZXN1bHQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjc6XG4gICAgICAvLyBlc2NhcGVcbiAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0M7XG4gICAgICBpZiAoZXYuYWx0S2V5KSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyBDMC5FU0M7XG4gICAgICB9XG4gICAgICByZXN1bHQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzc6XG4gICAgICAvLyBsZWZ0LWFycm93XG4gICAgICBpZiAoZXYubWV0YUtleSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0QnO1xuICAgICAgICAvLyBIQUNLOiBNYWtlIEFsdCArIGxlZnQtYXJyb3cgYmVoYXZlIGxpa2UgQ3RybCArIGxlZnQtYXJyb3c6IG1vdmUgb25lIHdvcmQgYmFja3dhcmRzXG4gICAgICAgIC8vIGh0dHA6Ly91bml4LnN0YWNrZXhjaGFuZ2UuY29tL2EvMTA4MTA2XG4gICAgICAgIC8vIG1hY09TIHVzZXMgZGlmZmVyZW50IGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBsaW51eFxuICAgICAgICBpZiAocmVzdWx0LmtleSA9PT0gQzAuRVNDICsgJ1sxOzNEJykge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAoaXNNYWMgPyAnYicgOiAnWzE7NUQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPRCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tEJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzk6XG4gICAgICAvLyByaWdodC1hcnJvd1xuICAgICAgaWYgKGV2Lm1ldGFLZXkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdDJztcbiAgICAgICAgLy8gSEFDSzogTWFrZSBBbHQgKyByaWdodC1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgcmlnaHQtYXJyb3c6IG1vdmUgb25lIHdvcmQgZm9yd2FyZFxuICAgICAgICAvLyBodHRwOi8vdW5peC5zdGFja2V4Y2hhbmdlLmNvbS9hLzEwODEwNlxuICAgICAgICAvLyBtYWNPUyB1c2VzIGRpZmZlcmVudCBlc2NhcGUgc2VxdWVuY2VzIHRoYW4gbGludXhcbiAgICAgICAgaWYgKHJlc3VsdC5rZXkgPT09IEMwLkVTQyArICdbMTszQycpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgKGlzTWFjID8gJ2YnIDogJ1sxOzVDJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0MnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbQyc7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM4OlxuICAgICAgLy8gdXAtYXJyb3dcbiAgICAgIGlmIChldi5tZXRhS2V5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnQSc7XG4gICAgICAgIC8vIEhBQ0s6IE1ha2UgQWx0ICsgdXAtYXJyb3cgYmVoYXZlIGxpa2UgQ3RybCArIHVwLWFycm93XG4gICAgICAgIC8vIGh0dHA6Ly91bml4LnN0YWNrZXhjaGFuZ2UuY29tL2EvMTA4MTA2XG4gICAgICAgIC8vIG1hY09TIHVzZXMgZGlmZmVyZW50IGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBsaW51eFxuICAgICAgICBpZiAoIWlzTWFjICYmIHJlc3VsdC5rZXkgPT09IEMwLkVTQyArICdbMTszQScpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOzVBJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPQSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tBJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDA6XG4gICAgICAvLyBkb3duLWFycm93XG4gICAgICBpZiAoZXYubWV0YUtleSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0InO1xuICAgICAgICAvLyBIQUNLOiBNYWtlIEFsdCArIGRvd24tYXJyb3cgYmVoYXZlIGxpa2UgQ3RybCArIGRvd24tYXJyb3dcbiAgICAgICAgLy8gaHR0cDovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vYS8xMDgxMDZcbiAgICAgICAgLy8gbWFjT1MgdXNlcyBkaWZmZXJlbnQgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIGxpbnV4XG4gICAgICAgIGlmICghaXNNYWMgJiYgcmVzdWx0LmtleSA9PT0gQzAuRVNDICsgJ1sxOzNCJykge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7NUInO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09CJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0InO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0NTpcbiAgICAgIC8vIGluc2VydFxuICAgICAgaWYgKCFldi5zaGlmdEtleSAmJiAhZXYuY3RybEtleSkge1xuICAgICAgICAvLyA8Q3RybD4gb3IgPFNoaWZ0PiArIDxJbnNlcnQ+IGFyZSB1c2VkIHRvXG4gICAgICAgIC8vIGNvcHktcGFzdGUgb24gc29tZSBzeXN0ZW1zLlxuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syfic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ2OlxuICAgICAgLy8gZGVsZXRlXG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzM7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzN+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzY6XG4gICAgICAvLyBob21lXG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdIJztcbiAgICAgIH0gZWxzZSBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbSCc7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM1OlxuICAgICAgLy8gZW5kXG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdGJztcbiAgICAgIH0gZWxzZSBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0YnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbRic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDMzOlxuICAgICAgLy8gcGFnZSB1cFxuICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgIHJlc3VsdC50eXBlID0gS2V5Ym9hcmRSZXN1bHRUeXBlLlBBR0VfVVA7XG4gICAgICB9IGVsc2UgaWYgKGV2LmN0cmxLZXkpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbNTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbNX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzNDpcbiAgICAgIC8vIHBhZ2UgZG93blxuICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgIHJlc3VsdC50eXBlID0gS2V5Ym9hcmRSZXN1bHRUeXBlLlBBR0VfRE9XTjtcbiAgICAgIH0gZWxzZSBpZiAoZXYuY3RybEtleSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1s2OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1s2fic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDExMjpcbiAgICAgIC8vIEYxLUYxMlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09QJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTEzOlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09RJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE0OlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09SJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE1OlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09TJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE2OlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxNTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTV+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE3OlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxNzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTd+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE4OlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxODsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTh+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE5OlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTl+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTIwOlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMDsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMjB+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTIxOlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMjF+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTIyOlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMjN+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTIzOlxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syNDsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMjR+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBhLXogYW5kIHNwYWNlXG4gICAgICBpZiAoZXYuY3RybEtleSAmJiAhZXYuc2hpZnRLZXkgJiYgIWV2LmFsdEtleSAmJiAhZXYubWV0YUtleSkge1xuICAgICAgICBpZiAoZXYua2V5Q29kZSA+PSA2NSAmJiBldi5rZXlDb2RlIDw9IDkwKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXYua2V5Q29kZSAtIDY0KTtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAzMikge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5OVUw7XG4gICAgICAgIH0gZWxzZSBpZiAoZXYua2V5Q29kZSA+PSA1MSAmJiBldi5rZXlDb2RlIDw9IDU1KSB7XG4gICAgICAgICAgLy8gZXNjYXBlLCBmaWxlIHNlcCwgZ3JvdXAgc2VwLCByZWNvcmQgc2VwLCB1bml0IHNlcFxuICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2LmtleUNvZGUgLSA1MSArIDI3KTtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSA1Nikge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5ERUw7XG4gICAgICAgIH0gZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gMjE5KSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQztcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMjApIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRlM7XG4gICAgICAgIH0gZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gMjIxKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkdTO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCghaXNNYWMgfHwgbWFjT3B0aW9uSXNNZXRhKSAmJiBldi5hbHRLZXkgJiYgIWV2Lm1ldGFLZXkpIHtcbiAgICAgICAgLy8gT24gbWFjT1MgdGhpcyBpcyBhIHRoaXJkIGxldmVsIHNoaWZ0IHdoZW4gIW1hY09wdGlvbklzTWV0YS4gVXNlIDxFc2M+IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGtleU1hcHBpbmcgPSBLRVlDT0RFX0tFWV9NQVBQSU5HU1tldi5rZXlDb2RlXTtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5TWFwcGluZz8uWyFldi5zaGlmdEtleSA/IDAgOiAxXTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyBrZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXYua2V5Q29kZSA+PSA2NSAmJiBldi5rZXlDb2RlIDw9IDkwKSB7XG4gICAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2LmN0cmxLZXkgPyBldi5rZXlDb2RlIC0gNjQgOiBldi5rZXlDb2RlICsgMzI7XG4gICAgICAgICAgbGV0IGtleVN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Q29kZSk7XG4gICAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBrZXlTdHJpbmcgPSBrZXlTdHJpbmcudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIGtleVN0cmluZztcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAzMikge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAoZXYuY3RybEtleSA/IEMwLk5VTCA6ICcgJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXYua2V5ID09PSAnRGVhZCcgJiYgZXYuY29kZS5zdGFydHNXaXRoKCdLZXknKSkge1xuICAgICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM3MjVcbiAgICAgICAgICAvLyBBbHQgd2lsbCBwcm9kdWNlIGEgXCJkZWFkIGtleVwiIChpbml0YXRlIGNvbXBvc2l0aW9uKSB3aXRoIHNvbWVcbiAgICAgICAgICAvLyBvZiB0aGUgbGV0dGVycyBpbiBVUyBsYXlvdXQgKGUuZy4gTi9FL1UpLlxuICAgICAgICAgIC8vIEl0J3Mgc2FmZSB0byBtYXRjaCBhZ2FpbnN0IEtleSogc2luY2Ugbm8gb3RoZXIgYGNvZGVgIHZhbHVlcyBiZWdpbiB3aXRoIFwiS2V5XCIuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQvY29kZS9jb2RlX3ZhbHVlcyNjb2RlX3ZhbHVlc19vbl9tYWNcbiAgICAgICAgICBsZXQga2V5U3RyaW5nID0gZXYuY29kZS5zbGljZSgzLCA0KTtcbiAgICAgICAgICBpZiAoIWV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBrZXlTdHJpbmcgPSBrZXlTdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIGtleVN0cmluZztcbiAgICAgICAgICByZXN1bHQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc01hYyAmJiAhZXYuYWx0S2V5ICYmICFldi5jdHJsS2V5ICYmICFldi5zaGlmdEtleSAmJiBldi5tZXRhS2V5KSB7XG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSA2NSkgeyAvLyBjbWQgKyBhXG4gICAgICAgICAgcmVzdWx0LnR5cGUgPSBLZXlib2FyZFJlc3VsdFR5cGUuU0VMRUNUX0FMTDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldi5rZXkgJiYgIWV2LmN0cmxLZXkgJiYgIWV2LmFsdEtleSAmJiAhZXYubWV0YUtleSAmJiBldi5rZXlDb2RlID49IDQ4ICYmIGV2LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gSW5jbHVkZSBvbmx5IGtleXMgdGhhdCB0aGF0IHJlc3VsdCBpbiBhIF9zaW5nbGVfIGNoYXJhY3RlcjsgZG9uJ3QgaW5jbHVkZSBudW0gbG9jayxcbiAgICAgICAgLy8gdm9sdW1lIHVwLCBldGMuXG4gICAgICAgIHJlc3VsdC5rZXkgPSBldi5rZXk7XG4gICAgICB9IGVsc2UgaWYgKGV2LmtleSAmJiBldi5jdHJsS2V5KSB7XG4gICAgICAgIGlmIChldi5rZXkgPT09ICdfJykgeyAvLyBeX1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5VUztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXYua2V5ID09PSAnQCcpIHsgLy8gXiArIHNoaWZ0ICsgMiA9IF4gKyBAXG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLk5VTDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKipcbiAqIFBvbHlmaWxsIC0gQ29udmVydCBVVEYzMiBjb2RlcG9pbnQgaW50byBKUyBzdHJpbmcuXG4gKiBOb3RlOiBUaGUgYnVpbHQtaW4gU3RyaW5nLmZyb21Db2RlUG9pbnQgaGFwcGVucyB0byBiZSBtdWNoIHNsb3dlclxuICogICAgICAgZHVlIHRvIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrcy4gV2UgY2FuIGF2b2lkIHRoZW0gc2luY2VcbiAqICAgICAgIHdlIGFsd2F5cyBvcGVyYXRlIG9uIGxlZ2FsIFVURjMyIChncmFudGVkIGJ5IHRoZSBpbnB1dCBkZWNvZGVycylcbiAqICAgICAgIGFuZCB1c2UgdGhpcyBmYXN0ZXIgdmVyc2lvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlUG9pbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZVBvaW50ID4+IDEwKSArIDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgJSAweDQwMCkgKyAweERDMDApO1xuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG59XG5cbi8qKlxuICogQ29udmVydCBVVEYzMiBjaGFyIGNvZGVzIGludG8gSlMgc3RyaW5nLlxuICogQmFzaWNhbGx5IHRoZSBzYW1lIGFzIGBzdHJpbmdGcm9tQ29kZVBvaW50YCBidXQgZm9yIG11bHRpcGxlIGNvZGVwb2ludHNcbiAqIGluIGEgbG9vcCAod2hpY2ggaXMgYSBsb3QgZmFzdGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjMyVG9TdHJpbmcoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIgPSAwLCBlbmQ6IG51bWJlciA9IGRhdGEubGVuZ3RoKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIGxldCBjb2RlcG9pbnQgPSBkYXRhW2ldO1xuICAgIGlmIChjb2RlcG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIEpTIHN0cmluZ3MgYXJlIGVuY29kZWQgYXMgVVRGMTYsIHRodXMgYSBub24gQk1QIGNvZGVwb2ludCBnZXRzIGNvbnZlcnRlZCBpbnRvIGEgc3Vycm9nYXRlXG4gICAgICAvLyBwYWlyIGNvbnZlcnNpb24gcnVsZXM6XG4gICAgICAvLyAgLSBzdWJ0cmFjdCAweDEwMDAwIGZyb20gY29kZSBwb2ludCwgbGVhdmluZyBhIDIwIGJpdCBudW1iZXJcbiAgICAgIC8vICAtIGFkZCBoaWdoIDEwIGJpdHMgdG8gMHhEODAwICAtLT4gZmlyc3Qgc3Vycm9nYXRlXG4gICAgICAvLyAgLSBhZGQgbG93IDEwIGJpdHMgdG8gMHhEQzAwICAgLS0+IHNlY29uZCBzdXJyb2dhdGVcbiAgICAgIGNvZGVwb2ludCAtPSAweDEwMDAwO1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVwb2ludCA+PiAxMCkgKyAweEQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZXBvaW50ICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZXBvaW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdUb1V0ZjMyIC0gZGVjb2RlcyBVVEYxNiBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICogVG8ga2VlcCB0aGUgZGVjb2RlciBpbiBsaW5lIHdpdGggSlMgc3RyaW5ncyBpdCBoYW5kbGVzIHNpbmdsZSBzdXJyb2dhdGVzIGFzIFVDUzIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdUb1V0ZjMyIHtcbiAgcHJpdmF0ZSBfaW50ZXJpbTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQ2xlYXJzIGludGVyaW0gYW5kIHJlc2V0cyBkZWNvZGVyIHRvIGNsZWFuIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBKUyBzdHJpbmcgdG8gVVRGMzIgY29kZXBvaW50cy5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkXG4gICAqIHN1cnJvZ2F0ZSBwYWlycyBhbmQgZGVjb2RlIHRoZW0gd2l0aCB0aGUgbmV4dCBkYXRhIGNodW5rLlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm8gYm91bmQgY2hlY2tzIGZvciB0YXJnZXQsIHRoZXJlZm9yZSBtYWtlIHN1cmVcbiAgICogdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgZG9lcyBub3QgZXhjZWVkIHRoZSBzaXplIG9mIGB0YXJnZXRgLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKi9cbiAgcHVibGljIGRlY29kZShpbnB1dDogc3RyaW5nLCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgc3Vycm9nYXRlIGhpZ2hcbiAgICBpZiAodGhpcy5faW50ZXJpbSkge1xuICAgICAgY29uc3Qgc2Vjb25kID0gaW5wdXQuY2hhckNvZGVBdChzdGFydFBvcysrKTtcbiAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAodGhpcy5faW50ZXJpbSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCAoVVNDMiBoYW5kbGluZylcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSB0aGlzLl9pbnRlcmltO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHNlY29uZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBzdGFydFBvczsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyIGZpcnN0XG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcmltID0gY29kZTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgKFVTQzIgaGFuZGxpbmcpXG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlO1xuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gc2Vjb25kO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4RkVGRikge1xuICAgICAgICAvLyBCT01cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGU7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG59XG5cbi8qKlxuICogVXRmOERlY29kZXIgLSBkZWNvZGVzIFVURjggYnl0ZSBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVXRmOFRvVXRmMzIge1xuICBwdWJsaWMgaW50ZXJpbTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KDMpO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgaW50ZXJpbSBieXRlcyBhbmQgcmVzZXRzIGRlY29kZXIgdG8gY2xlYW4gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcmltLmZpbGwoMCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBVVEY4IGJ5dGUgc2VxdWVuY2VzIGluIGBpbnB1dGAgdG8gVVRGMzIgY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkIGJ5dGVzXG4gICAqIGFuZCBkZWNvZGUgdGhlbSB3aXRoIHRoZSBuZXh0IGRhdGEgY2h1bmsuXG4gICAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBubyBib3VuZCBjaGVja3MgZm9yIHRhcmdldCwgdGhlcmVmb3JlIG1ha2Ugc3VyZVxuICAgKiB0aGUgcHJvdmlkZWQgZGF0YSBjaHVuayBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYHRhcmdldGAuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlKGlucHV0OiBVaW50OEFycmF5LCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBieXRlMTogbnVtYmVyO1xuICAgIGxldCBieXRlMjogbnVtYmVyO1xuICAgIGxldCBieXRlMzogbnVtYmVyO1xuICAgIGxldCBieXRlNDogbnVtYmVyO1xuICAgIGxldCBjb2RlcG9pbnQgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgYnl0ZXNcbiAgICBpZiAodGhpcy5pbnRlcmltWzBdKSB7XG4gICAgICBsZXQgZGlzY2FyZEludGVyaW0gPSBmYWxzZTtcbiAgICAgIGxldCBjcCA9IHRoaXMuaW50ZXJpbVswXTtcbiAgICAgIGNwICY9ICgoKChjcCAmIDB4RTApID09PSAweEMwKSkgPyAweDFGIDogKCgoY3AgJiAweEYwKSA9PT0gMHhFMCkpID8gMHgwRiA6IDB4MDcpO1xuICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICBsZXQgdG1wOiBudW1iZXI7XG4gICAgICB3aGlsZSAoKHRtcCA9IHRoaXMuaW50ZXJpbVsrK3Bvc10gJiAweDNGKSAmJiBwb3MgPCA0KSB7XG4gICAgICAgIGNwIDw8PSA2O1xuICAgICAgICBjcCB8PSB0bXA7XG4gICAgICB9XG4gICAgICAvLyBtaXNzaW5nIGJ5dGVzIC0gcmVhZCBhaGVhZCBmcm9tIGlucHV0XG4gICAgICBjb25zdCB0eXBlID0gKCgodGhpcy5pbnRlcmltWzBdICYgMHhFMCkgPT09IDB4QzApKSA/IDIgOiAoKCh0aGlzLmludGVyaW1bMF0gJiAweEYwKSA9PT0gMHhFMCkpID8gMyA6IDQ7XG4gICAgICBjb25zdCBtaXNzaW5nID0gdHlwZSAtIHBvcztcbiAgICAgIHdoaWxlIChzdGFydFBvcyA8IG1pc3NpbmcpIHtcbiAgICAgICAgaWYgKHN0YXJ0UG9zID49IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHRtcCA9IGlucHV0W3N0YXJ0UG9zKytdO1xuICAgICAgICBpZiAoKHRtcCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uLCBkaXNjYXJkIGludGVyaW0gYnl0ZXMgY29tcGxldGVseVxuICAgICAgICAgIHN0YXJ0UG9zLS07XG4gICAgICAgICAgZGlzY2FyZEludGVyaW0gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5lZWQgdG8gc2F2ZSBzbyB3ZSBjYW4gY29udGludWUgc2hvcnQgaW5wdXRzIGluIG5leHQgY2FsbFxuICAgICAgICAgIHRoaXMuaW50ZXJpbVtwb3MrK10gPSB0bXA7XG4gICAgICAgICAgY3AgPDw9IDY7XG4gICAgICAgICAgY3AgfD0gdG1wICYgMHgzRjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNjYXJkSW50ZXJpbSkge1xuICAgICAgICAvLyBmaW5hbCB0ZXN0IGlzIHR5cGUgZGVwZW5kZW50XG4gICAgICAgIGlmICh0eXBlID09PSAyKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHg4MCkge1xuICAgICAgICAgICAgLy8gd3Jvbmcgc3RhcnRlciBieXRlXG4gICAgICAgICAgICBzdGFydFBvcy0tO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAzKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwODAwIHx8IChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhERkZGKSB8fCBjcCA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCBvciBCT01cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwMTAwMDAgfHwgY3AgPiAweDEwRkZGRikge1xuICAgICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW50ZXJpbS5maWxsKDApO1xuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBpbnB1dFxuICAgIGNvbnN0IGZvdXJTdG9wID0gbGVuZ3RoIC0gNDtcbiAgICBsZXQgaSA9IHN0YXJ0UG9zO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEFTQ0lJIHNob3J0Y3V0IHdpdGggbG9vcCB1bnJvbGxlZCB0byA0IGNvbnNlY3V0aXZlIEFTQ0lJIGNoYXJzLlxuICAgICAgICogVGhpcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBnYWluIGZvciBBU0NJSVxuICAgICAgICogYW5kIHBlbmFsdHkgZm9yIG5vbiBBU0NJSTpcbiAgICAgICAqIEZvciBiZXN0IEFTQ0lJIHBlcmZvcm1hbmNlIHRoZSBjaGFyIHNob3VsZCBiZSBzdG9yZWQgZGlyZWN0bHkgaW50byB0YXJnZXQsXG4gICAgICAgKiBidXQgZXZlbiBhIHNpbmdsZSBhdHRlbXB0IHRvIHdyaXRlIHRvIHRhcmdldCBhbmQgY29tcGFyZSBhZnRlcndhcmRzXG4gICAgICAgKiBwZW5hbGl6ZXMgbm9uIEFTQ0lJIHJlYWxseSBiYWQgKC01MCUpLCB0aHVzIHdlIGxvYWQgdGhlIGNoYXIgaW50byBieXRlWCBmaXJzdCxcbiAgICAgICAqIHdoaWNoIHJlZHVjZXMgQVNDSUkgcGVyZm9ybWFuY2UgYnkgfjE1JS5cbiAgICAgICAqIFRoaXMgdHJpYWwgZm9yIEFTQ0lJIHJlZHVjZXMgbm9uIEFTQ0lJIHBlcmZvcm1hbmNlIGJ5IH4xMCUgd2hpY2ggc2VlbXMgYWNjZXB0aWJsZVxuICAgICAgICogY29tcGFyZWQgdG8gdGhlIGdhaW5zLlxuICAgICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgZm9yIDQgY29uc2VjdXRpdmUgQVNDSUkgY2hhcnMsXG4gICAgICAgKiBmb3IgYW55IHNob3J0ZXIgaXQgYmFpbHMgb3V0LiBXb3JzdCBjYXNlIC0gYWxsIDQgYnl0ZXMgYmVpbmcgcmVhZCBidXRcbiAgICAgICAqIHRocm93biBhd2F5IGR1ZSB0byB0aGUgbGFzdCBiZWluZyBhIG5vbiBBU0NJSSBjaGFyICgtMTAlIHBlcmZvcm1hbmNlKS5cbiAgICAgICAqL1xuICAgICAgd2hpbGUgKGkgPCBmb3VyU3RvcFxuICAgICAgICAmJiAhKChieXRlMSA9IGlucHV0W2ldKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUyID0gaW5wdXRbaSArIDFdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUzID0gaW5wdXRbaSArIDJdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGU0ID0gaW5wdXRbaSArIDNdKSAmIDB4ODApKVxuICAgICAge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUxO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUyO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUzO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGU0O1xuICAgICAgICBpICs9IDQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlcmVhZCBieXRlMVxuICAgICAgYnl0ZTEgPSBpbnB1dFtpKytdO1xuXG4gICAgICAvLyAxIGJ5dGVcbiAgICAgIGlmIChieXRlMSA8IDB4ODApIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMTtcblxuICAgICAgICAvLyAyIGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RTApID09PSAweEMwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MUYpIDw8IDYgfCAoYnl0ZTIgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBzdGFydGVyIGJ5dGVcbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG5cbiAgICAgICAgLy8gMyBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEYwKSA9PT0gMHhFMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMyA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTMgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDBGKSA8PCAxMiB8IChieXRlMiAmIDB4M0YpIDw8IDYgfCAoYnl0ZTMgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MDgwMCB8fCAoY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGKSB8fCBjb2RlcG9pbnQgPT09IDB4RkVGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IG9yIEJPTSwgbm8gaS0tIGhlcmVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcblxuICAgICAgICAvLyA0IGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RjgpID09PSAweEYwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMyAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsyXSA9IGJ5dGUzO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGU0ID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlNCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MDcpIDw8IDE4IHwgKGJ5dGUyICYgMHgzRikgPDwgMTIgfCAoYnl0ZTMgJiAweDNGKSA8PCA2IHwgKGJ5dGU0ICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDAxMDAwMCB8fCBjb2RlcG9pbnQgPiAweDEwRkZGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50LCBubyBpLS0gaGVyZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWxsZWdhbCBieXRlLCBqdXN0IHNraXBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmltcG9ydCB7IElVbmljb2RlVmVyc2lvblByb3ZpZGVyLCBVbmljb2RlQ2hhclByb3BlcnRpZXMsIFVuaWNvZGVDaGFyV2lkdGggfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVW5pY29kZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvVW5pY29kZVNlcnZpY2UnO1xuXG5jb25zdCBCTVBfQ09NQklOSU5HID0gW1xuICBbMHgwMzAwLCAweDAzNkZdLCBbMHgwNDgzLCAweDA0ODZdLCBbMHgwNDg4LCAweDA0ODldLFxuICBbMHgwNTkxLCAweDA1QkRdLCBbMHgwNUJGLCAweDA1QkZdLCBbMHgwNUMxLCAweDA1QzJdLFxuICBbMHgwNUM0LCAweDA1QzVdLCBbMHgwNUM3LCAweDA1QzddLCBbMHgwNjAwLCAweDA2MDNdLFxuICBbMHgwNjEwLCAweDA2MTVdLCBbMHgwNjRCLCAweDA2NUVdLCBbMHgwNjcwLCAweDA2NzBdLFxuICBbMHgwNkQ2LCAweDA2RTRdLCBbMHgwNkU3LCAweDA2RThdLCBbMHgwNkVBLCAweDA2RURdLFxuICBbMHgwNzBGLCAweDA3MEZdLCBbMHgwNzExLCAweDA3MTFdLCBbMHgwNzMwLCAweDA3NEFdLFxuICBbMHgwN0E2LCAweDA3QjBdLCBbMHgwN0VCLCAweDA3RjNdLCBbMHgwOTAxLCAweDA5MDJdLFxuICBbMHgwOTNDLCAweDA5M0NdLCBbMHgwOTQxLCAweDA5NDhdLCBbMHgwOTRELCAweDA5NERdLFxuICBbMHgwOTUxLCAweDA5NTRdLCBbMHgwOTYyLCAweDA5NjNdLCBbMHgwOTgxLCAweDA5ODFdLFxuICBbMHgwOUJDLCAweDA5QkNdLCBbMHgwOUMxLCAweDA5QzRdLCBbMHgwOUNELCAweDA5Q0RdLFxuICBbMHgwOUUyLCAweDA5RTNdLCBbMHgwQTAxLCAweDBBMDJdLCBbMHgwQTNDLCAweDBBM0NdLFxuICBbMHgwQTQxLCAweDBBNDJdLCBbMHgwQTQ3LCAweDBBNDhdLCBbMHgwQTRCLCAweDBBNERdLFxuICBbMHgwQTcwLCAweDBBNzFdLCBbMHgwQTgxLCAweDBBODJdLCBbMHgwQUJDLCAweDBBQkNdLFxuICBbMHgwQUMxLCAweDBBQzVdLCBbMHgwQUM3LCAweDBBQzhdLCBbMHgwQUNELCAweDBBQ0RdLFxuICBbMHgwQUUyLCAweDBBRTNdLCBbMHgwQjAxLCAweDBCMDFdLCBbMHgwQjNDLCAweDBCM0NdLFxuICBbMHgwQjNGLCAweDBCM0ZdLCBbMHgwQjQxLCAweDBCNDNdLCBbMHgwQjRELCAweDBCNERdLFxuICBbMHgwQjU2LCAweDBCNTZdLCBbMHgwQjgyLCAweDBCODJdLCBbMHgwQkMwLCAweDBCQzBdLFxuICBbMHgwQkNELCAweDBCQ0RdLCBbMHgwQzNFLCAweDBDNDBdLCBbMHgwQzQ2LCAweDBDNDhdLFxuICBbMHgwQzRBLCAweDBDNERdLCBbMHgwQzU1LCAweDBDNTZdLCBbMHgwQ0JDLCAweDBDQkNdLFxuICBbMHgwQ0JGLCAweDBDQkZdLCBbMHgwQ0M2LCAweDBDQzZdLCBbMHgwQ0NDLCAweDBDQ0RdLFxuICBbMHgwQ0UyLCAweDBDRTNdLCBbMHgwRDQxLCAweDBENDNdLCBbMHgwRDRELCAweDBENERdLFxuICBbMHgwRENBLCAweDBEQ0FdLCBbMHgwREQyLCAweDBERDRdLCBbMHgwREQ2LCAweDBERDZdLFxuICBbMHgwRTMxLCAweDBFMzFdLCBbMHgwRTM0LCAweDBFM0FdLCBbMHgwRTQ3LCAweDBFNEVdLFxuICBbMHgwRUIxLCAweDBFQjFdLCBbMHgwRUI0LCAweDBFQjldLCBbMHgwRUJCLCAweDBFQkNdLFxuICBbMHgwRUM4LCAweDBFQ0RdLCBbMHgwRjE4LCAweDBGMTldLCBbMHgwRjM1LCAweDBGMzVdLFxuICBbMHgwRjM3LCAweDBGMzddLCBbMHgwRjM5LCAweDBGMzldLCBbMHgwRjcxLCAweDBGN0VdLFxuICBbMHgwRjgwLCAweDBGODRdLCBbMHgwRjg2LCAweDBGODddLCBbMHgwRjkwLCAweDBGOTddLFxuICBbMHgwRjk5LCAweDBGQkNdLCBbMHgwRkM2LCAweDBGQzZdLCBbMHgxMDJELCAweDEwMzBdLFxuICBbMHgxMDMyLCAweDEwMzJdLCBbMHgxMDM2LCAweDEwMzddLCBbMHgxMDM5LCAweDEwMzldLFxuICBbMHgxMDU4LCAweDEwNTldLCBbMHgxMTYwLCAweDExRkZdLCBbMHgxMzVGLCAweDEzNUZdLFxuICBbMHgxNzEyLCAweDE3MTRdLCBbMHgxNzMyLCAweDE3MzRdLCBbMHgxNzUyLCAweDE3NTNdLFxuICBbMHgxNzcyLCAweDE3NzNdLCBbMHgxN0I0LCAweDE3QjVdLCBbMHgxN0I3LCAweDE3QkRdLFxuICBbMHgxN0M2LCAweDE3QzZdLCBbMHgxN0M5LCAweDE3RDNdLCBbMHgxN0RELCAweDE3RERdLFxuICBbMHgxODBCLCAweDE4MERdLCBbMHgxOEE5LCAweDE4QTldLCBbMHgxOTIwLCAweDE5MjJdLFxuICBbMHgxOTI3LCAweDE5MjhdLCBbMHgxOTMyLCAweDE5MzJdLCBbMHgxOTM5LCAweDE5M0JdLFxuICBbMHgxQTE3LCAweDFBMThdLCBbMHgxQjAwLCAweDFCMDNdLCBbMHgxQjM0LCAweDFCMzRdLFxuICBbMHgxQjM2LCAweDFCM0FdLCBbMHgxQjNDLCAweDFCM0NdLCBbMHgxQjQyLCAweDFCNDJdLFxuICBbMHgxQjZCLCAweDFCNzNdLCBbMHgxREMwLCAweDFEQ0FdLCBbMHgxREZFLCAweDFERkZdLFxuICBbMHgyMDBCLCAweDIwMEZdLCBbMHgyMDJBLCAweDIwMkVdLCBbMHgyMDYwLCAweDIwNjNdLFxuICBbMHgyMDZBLCAweDIwNkZdLCBbMHgyMEQwLCAweDIwRUZdLCBbMHgzMDJBLCAweDMwMkZdLFxuICBbMHgzMDk5LCAweDMwOUFdLCBbMHhBODA2LCAweEE4MDZdLCBbMHhBODBCLCAweEE4MEJdLFxuICBbMHhBODI1LCAweEE4MjZdLCBbMHhGQjFFLCAweEZCMUVdLCBbMHhGRTAwLCAweEZFMEZdLFxuICBbMHhGRTIwLCAweEZFMjNdLCBbMHhGRUZGLCAweEZFRkZdLCBbMHhGRkY5LCAweEZGRkJdXG5dO1xuY29uc3QgSElHSF9DT01CSU5JTkcgPSBbXG4gIFsweDEwQTAxLCAweDEwQTAzXSwgWzB4MTBBMDUsIDB4MTBBMDZdLCBbMHgxMEEwQywgMHgxMEEwRl0sXG4gIFsweDEwQTM4LCAweDEwQTNBXSwgWzB4MTBBM0YsIDB4MTBBM0ZdLCBbMHgxRDE2NywgMHgxRDE2OV0sXG4gIFsweDFEMTczLCAweDFEMTgyXSwgWzB4MUQxODUsIDB4MUQxOEJdLCBbMHgxRDFBQSwgMHgxRDFBRF0sXG4gIFsweDFEMjQyLCAweDFEMjQ0XSwgWzB4RTAwMDEsIDB4RTAwMDFdLCBbMHhFMDAyMCwgMHhFMDA3Rl0sXG4gIFsweEUwMTAwLCAweEUwMUVGXVxuXTtcblxuLy8gQk1QIGxvb2t1cCB0YWJsZSwgbGF6eSBpbml0aWFsaXplZCBkdXJpbmcgZmlyc3QgYWRkb24gbG9hZGluZ1xubGV0IHRhYmxlOiBVaW50OEFycmF5O1xuXG5mdW5jdGlvbiBiaXNlYXJjaCh1Y3M6IG51bWJlciwgZGF0YTogbnVtYmVyW11bXSk6IGJvb2xlYW4ge1xuICBsZXQgbWluID0gMDtcbiAgbGV0IG1heCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgbGV0IG1pZDtcbiAgaWYgKHVjcyA8IGRhdGFbMF1bMF0gfHwgdWNzID4gZGF0YVttYXhdWzFdKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHdoaWxlIChtYXggPj0gbWluKSB7XG4gICAgbWlkID0gKG1pbiArIG1heCkgPj4gMTtcbiAgICBpZiAodWNzID4gZGF0YVttaWRdWzFdKSB7XG4gICAgICBtaW4gPSBtaWQgKyAxO1xuICAgIH0gZWxzZSBpZiAodWNzIDwgZGF0YVttaWRdWzBdKSB7XG4gICAgICBtYXggPSBtaWQgLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY2xhc3MgVW5pY29kZVY2IGltcGxlbWVudHMgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9ICc2JztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBpbml0IGxvb2t1cCB0YWJsZSBvbmNlXG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGFibGUgPSBuZXcgVWludDhBcnJheSg2NTUzNik7XG4gICAgICB0YWJsZS5maWxsKDEpO1xuICAgICAgdGFibGVbMF0gPSAwO1xuICAgICAgLy8gY29udHJvbCBjaGFyc1xuICAgICAgdGFibGUuZmlsbCgwLCAxLCAzMik7XG4gICAgICB0YWJsZS5maWxsKDAsIDB4N2YsIDB4YTApO1xuXG4gICAgICAvLyBhcHBseSB3aWRlIGNoYXIgcnVsZXMgZmlyc3RcbiAgICAgIC8vIHdpZGUgY2hhcnNcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHgxMTAwLCAweDExNjApO1xuICAgICAgdGFibGVbMHgyMzI5XSA9IDI7XG4gICAgICB0YWJsZVsweDIzMmFdID0gMjtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHgyZTgwLCAweGE0ZDApO1xuICAgICAgdGFibGVbMHgzMDNmXSA9IDE7ICAvLyB3cm9uZ2x5IGluIGxhc3QgbGluZVxuXG4gICAgICB0YWJsZS5maWxsKDIsIDB4YWMwMCwgMHhkN2E0KTtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhmOTAwLCAweGZiMDApO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGZlMTAsIDB4ZmUxYSk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZmUzMCwgMHhmZTcwKTtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhmZjAwLCAweGZmNjEpO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGZmZTAsIDB4ZmZlNyk7XG5cbiAgICAgIC8vIGFwcGx5IGNvbWJpbmluZyBsYXN0IHRvIGVuc3VyZSB3ZSBvdmVyd3JpdGVcbiAgICAgIC8vIHdyb25nbHkgd2lkZSBzZXQgY2hhcnM6XG4gICAgICAvLyAgICB0aGUgb3JpZ2luYWwgYWxnbyBldmFscyBjb21iaW5pbmcgZmlyc3QgYW5kIGZhbGxzXG4gICAgICAvLyAgICB0aHJvdWdoIHRvIHdpZGUgY2hlY2sgc28gd2Ugc2ltcGx5IGRvIGhlcmUgdGhlIG9wcG9zaXRlXG4gICAgICAvLyBjb21iaW5pbmcgMFxuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBCTVBfQ09NQklOSU5HLmxlbmd0aDsgKytyKSB7XG4gICAgICAgIHRhYmxlLmZpbGwoMCwgQk1QX0NPTUJJTklOR1tyXVswXSwgQk1QX0NPTUJJTklOR1tyXVsxXSArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3Y3dpZHRoKG51bTogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aCB7XG4gICAgaWYgKG51bSA8IDMyKSByZXR1cm4gMDtcbiAgICBpZiAobnVtIDwgMTI3KSByZXR1cm4gMTtcbiAgICBpZiAobnVtIDwgNjU1MzYpIHJldHVybiB0YWJsZVtudW1dIGFzIFVuaWNvZGVDaGFyV2lkdGg7XG4gICAgaWYgKGJpc2VhcmNoKG51bSwgSElHSF9DT01CSU5JTkcpKSByZXR1cm4gMDtcbiAgICBpZiAoKG51bSA+PSAweDIwMDAwICYmIG51bSA8PSAweDJmZmZkKSB8fCAobnVtID49IDB4MzAwMDAgJiYgbnVtIDw9IDB4M2ZmZmQpKSByZXR1cm4gMjtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXMge1xuICAgIGxldCB3aWR0aCA9IHRoaXMud2N3aWR0aChjb2RlcG9pbnQpO1xuICAgIGxldCBzaG91bGRKb2luID0gd2lkdGggPT09IDAgJiYgcHJlY2VkaW5nICE9PSAwO1xuICAgIGlmIChzaG91bGRKb2luKSB7XG4gICAgICBjb25zdCBvbGRXaWR0aCA9IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aChwcmVjZWRpbmcpO1xuICAgICAgaWYgKG9sZFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNob3VsZEpvaW4gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAob2xkV2lkdGggPiB3aWR0aCkge1xuICAgICAgICB3aWR0aCA9IG9sZFdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gVW5pY29kZVNlcnZpY2UuY3JlYXRlUHJvcGVydHlWYWx1ZSgwLCB3aWR0aCwgc2hvdWxkSm9pbik7XG4gIH1cbn1cbiIsIlxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZGVjbGFyZSBjb25zdCBzZXRUaW1lb3V0OiAoaGFuZGxlcjogKCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcikgPT4gdm9pZDtcblxuLyoqXG4gKiBTYWZldHkgd2F0ZXJtYXJrIHRvIGF2b2lkIG1lbW9yeSBleGhhdXN0aW9uIGFuZCBicm93c2VyIGVuZ2luZSBjcmFzaCBvbiBmYXN0IGRhdGEgaW5wdXQuXG4gKiBFbmFibGUgZmxvdyBjb250cm9sIHRvIGF2b2lkIHRoaXMgbGltaXQgYW5kIG1ha2Ugc3VyZSB0aGF0IHlvdXIgYmFja2VuZCBjb3JyZWN0bHlcbiAqIHByb3BhZ2F0ZXMgdGhpcyB0byB0aGUgdW5kZXJseWluZyBwdHkuIChzZWUgZG9jcyBmb3IgZnVydGhlciBpbnN0cnVjdGlvbnMpXG4gKiBTaW5jZSB0aGlzIGxpbWl0IGlzIG1lYW50IGFzIGEgc2FmZXR5IHBhcmFjaHV0ZSB0byBwcmV2ZW50IGJyb3dzZXIgY3Jhc2hzLFxuICogaXQgaXMgc2V0IHRvIGEgdmVyeSBoaWdoIG51bWJlci4gVHlwaWNhbGx5IHh0ZXJtLmpzIGdldHMgdW5yZXNwb25zaXZlIHdpdGhcbiAqIGEgMTAwIHRpbWVzIGxvd2VyIG51bWJlciAoPjUwMCBrQikuXG4gKi9cbmNvbnN0IERJU0NBUkRfV0FURVJNQVJLID0gNTAwMDAwMDA7IC8vIH41MCBNQlxuXG4vKipcbiAqIFRoZSBtYXggbnVtYmVyIG9mIG1zIHRvIHNwZW5kIG9uIHdyaXRlcyBiZWZvcmUgYWxsb3dpbmcgdGhlIHJlbmRlcmVyIHRvXG4gKiBjYXRjaCB1cCB3aXRoIGEgMG1zIHNldFRpbWVvdXQuIEEgdmFsdWUgb2YgPCAzMyB0byBrZWVwIHVzIGNsb3NlIHRvXG4gKiAzMGZwcywgYW5kIGEgdmFsdWUgb2YgPCAxNiB0byB0cnkgdG8gcnVuIGF0IDYwZnBzLiBPZiBjb3Vyc2UsIHRoZSByZWFsIEZQU1xuICogZGVwZW5kcyBvbiB0aGUgdGltZSBpdCB0YWtlcyBmb3IgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIGZyYW1lLlxuICovXG5jb25zdCBXUklURV9USU1FT1VUX01TID0gMTI7XG5cbi8qKlxuICogVGhyZXNob2xkIG9mIG1heCBoZWxkIGNodW5rcyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGF0IHdlcmUgYWxyZWFkeSBwcm9jZXNzZWQuXG4gKiBUaGlzIGlzIGEgdHJhZGVvZmYgYmV0d2VlbiBleHRlbnNpdmUgd3JpdGUgYnVmZmVyIHNoaWZ0cyAoYmFkIHJ1bnRpbWUpIGFuZCBoaWdoXG4gKiBtZW1vcnkgY29uc3VtcHRpb24gYnkgZGF0YSB0aGF0cyBub3QgdXNlZCBhbnltb3JlLlxuICovXG5jb25zdCBXUklURV9CVUZGRVJfTEVOR1RIX1RIUkVTSE9MRCA9IDUwO1xuXG5leHBvcnQgY2xhc3MgV3JpdGVCdWZmZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfd3JpdGVCdWZmZXI6IChzdHJpbmcgfCBVaW50OEFycmF5KVtdID0gW107XG4gIHByaXZhdGUgX2NhbGxiYWNrczogKCgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICBwcml2YXRlIF9wZW5kaW5nRGF0YSA9IDA7XG4gIHByaXZhdGUgX2J1ZmZlck9mZnNldCA9IDA7XG4gIHByaXZhdGUgX2lzU3luY1dyaXRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3luY0NhbGxzID0gMDtcbiAgcHJpdmF0ZSBfZGlkVXNlcklucHV0ID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Xcml0ZVBhcnNlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uV3JpdGVQYXJzZWQgPSB0aGlzLl9vbldyaXRlUGFyc2VkLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FjdGlvbjogKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIHByb21pc2VSZXN1bHQ/OiBib29sZWFuKSA9PiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlVXNlcklucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuX2RpZFVzZXJJbnB1dCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVW5yZWxpYWJsZSwgdG8gYmUgcmVtb3ZlZCBzb29uLlxuICAgKi9cbiAgcHVibGljIHdyaXRlU3luYyhkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBtYXhTdWJzZXF1ZW50Q2FsbHM/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBzdG9wIHdyaXRlU3luYyByZWN1cnNpb25zIHdpdGggbWF4U3Vic2VxdWVudENhbGxzIGFyZ3VtZW50XG4gICAgLy8gVGhpcyBpcyBkYW5nZXJvdXMgdG8gdXNlIGFzIGl0IHdpbGwgbG9zZSB0aGUgY3VycmVudCBkYXRhIGNodW5rXG4gICAgLy8gYW5kIHJldHVybiBpbW1lZGlhdGVseS5cbiAgICBpZiAobWF4U3Vic2VxdWVudENhbGxzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fc3luY0NhbGxzID4gbWF4U3Vic2VxdWVudENhbGxzKSB7XG4gICAgICAvLyBjb21tZW50IG5leHQgbGluZSBpZiBhIHdob2xlIGxvb3AgYmxvY2sgc2hvdWxkIG9ubHkgY29udGFpbiB4IGB3cml0ZVN5bmNgIGNhbGxzXG4gICAgICAvLyAodG90YWwgZmxhdCB2cy4gZGVlcCBuZXN0ZWQgbGltaXQpXG4gICAgICB0aGlzLl9zeW5jQ2FsbHMgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBhcHBlbmQgY2h1bmsgdG8gYnVmZmVyXG4gICAgdGhpcy5fcGVuZGluZ0RhdGEgKz0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5fd3JpdGVCdWZmZXIucHVzaChkYXRhKTtcbiAgICB0aGlzLl9jYWxsYmFja3MucHVzaCh1bmRlZmluZWQpO1xuXG4gICAgLy8gaW5jcmVhc2UgcmVjdXJzaW9uIGNvdW50ZXJcbiAgICB0aGlzLl9zeW5jQ2FsbHMrKztcbiAgICAvLyBleGl0IGVhcmx5IGlmIGFub3RoZXIgd3JpdGVTeW5jIGxvb3AgaXMgYWN0aXZlXG4gICAgaWYgKHRoaXMuX2lzU3luY1dyaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNTeW5jV3JpdGluZyA9IHRydWU7XG5cbiAgICAvLyBmb3JjZSBzeW5jIHByb2Nlc3Npbmcgb24gcGVuZGluZyBkYXRhIGNodW5rcyB0byBhdm9pZCBpbi1iYW5kIGRhdGEgc2NyYW1ibGluZ1xuICAgIC8vIGRvZXMgdGhlIHNhbWUgYXMgaW5uZXJXcml0ZSBidXQgd2l0aG91dCBldmVudCBsb29wXG4gICAgLy8gd2UgaGF2ZSB0byBkbyBpdCBoZXJlIGFzIHNpbmdsZSBsb29wIHN0ZXBzIHRvIG5vdCBjb3JydXB0IGxvb3Agc3ViamVjdFxuICAgIC8vIGJ5IGFub3RoZXIgd3JpdGVTeW5jIGNhbGwgdHJpZ2dlcmVkIGZyb20gX2FjdGlvblxuICAgIGxldCBjaHVuazogc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgICB3aGlsZSAoY2h1bmsgPSB0aGlzLl93cml0ZUJ1ZmZlci5zaGlmdCgpKSB7XG4gICAgICB0aGlzLl9hY3Rpb24oY2h1bmspO1xuICAgICAgY29uc3QgY2IgPSB0aGlzLl9jYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgIGlmIChjYikgY2IoKTtcbiAgICB9XG4gICAgLy8gcmVzZXQgdG8gYXZvaWQgcmVwcm9jZXNzaW5nIG9mIGNodW5rcyB3aXRoIHNjaGVkdWxlZCBpbm5lcldyaXRlIGNhbGxcbiAgICAvLyBzdG9wcGluZyBzY2hlZHVsZWQgaW5uZXJXcml0ZSBieSBvZmZzZXQgPiBsZW5ndGggY29uZGl0aW9uXG4gICAgdGhpcy5fcGVuZGluZ0RhdGEgPSAwO1xuICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDB4N0ZGRkZGRkY7XG5cbiAgICAvLyBhbGxvdyBhbm90aGVyIHdyaXRlU3luYyB0byBsb29wXG4gICAgdGhpcy5faXNTeW5jV3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3N5bmNDYWxscyA9IDA7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BlbmRpbmdEYXRhID4gRElTQ0FSRF9XQVRFUk1BUkspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd3JpdGUgZGF0YSBkaXNjYXJkZWQsIHVzZSBmbG93IGNvbnRyb2wgdG8gYXZvaWQgbG9zaW5nIGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBzY2hlZHVsZSBjaHVuayBwcm9jZXNzaW5nIGZvciBuZXh0IGV2ZW50IGxvb3AgcnVuXG4gICAgaWYgKCF0aGlzLl93cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHdyaXRlIGNhbGwgYWZ0ZXIgdGhlIHVzZXIgaGFzIGRvbmUgc29tZSBpbnB1dCxcbiAgICAgIC8vIHBhcnNlIGl0IGltbWVkaWF0ZWx5IHRvIG1pbmltaXplIGlucHV0IGxhdGVuY3ksXG4gICAgICAvLyBvdGhlcndpc2Ugc2NoZWR1bGUgZm9yIHRoZSBuZXh0IGV2ZW50XG4gICAgICBpZiAodGhpcy5fZGlkVXNlcklucHV0KSB7XG4gICAgICAgIHRoaXMuX2RpZFVzZXJJbnB1dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wZW5kaW5nRGF0YSArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fd3JpdGVCdWZmZXIucHVzaChkYXRhKTtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9pbm5lcldyaXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9pbm5lcldyaXRlKCkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BlbmRpbmdEYXRhICs9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuX3dyaXRlQnVmZmVyLnB1c2goZGF0YSk7XG4gICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIElubmVyIHdyaXRlIGNhbGwsIHRoYXQgZW50ZXJzIHRoZSBzbGljZWQgY2h1bmsgcHJvY2Vzc2luZyBieSB0aW1pbmcuXG4gICAqXG4gICAqIGBsYXN0VGltZWAgaW5kaWNhdGVzLCB3aGVuIHRoZSBsYXN0IF9pbm5lcldyaXRlIGNhbGwgaGFkIHN0YXJ0ZWQuXG4gICAqIEl0IGlzIHVzZWQgdG8gYWdncmVnYXRlIGFzeW5jIGhhbmRsZXIgZXhlY3V0aW9uIHVuZGVyIGEgdGltZW91dCBjb25zdHJhaW50XG4gICAqIGVmZmVjdGl2ZWx5IGxvd2VyaW5nIHRoZSByZWRyYXdpbmcgbmVlZHMsIHNjaGVtYXRpY2FsbHk6XG4gICAqXG4gICAqICAgbWFjcm9UYXNrIF9pbm5lcldyaXRlOlxuICAgKiAgICAgaWYgKERhdGUubm93KCkgLSAobGFzdFRpbWUgfCAwKSA8IFdSSVRFX1RJTUVPVVRfTVMpOlxuICAgKiAgICAgICAgc2NoZWR1bGUgbWljcm9UYXNrIF9pbm5lcldyaXRlKGxhc3RUaW1lKVxuICAgKiAgICAgZWxzZTpcbiAgICogICAgICAgIHNjaGVkdWxlIG1hY3JvVGFzayBfaW5uZXJXcml0ZSgwKVxuICAgKlxuICAgKiAgIG92ZXJhbGwgZXhlY3V0aW9uIG9yZGVyIG9uIHRhc2sgcXVldWVzOlxuICAgKlxuICAgKiAgIG1hY3JvdGFza3M6ICBbLi4uXSAgLS0+ICBfaW5uZXJXcml0ZSgwKSAgLS0+ICBbLi4uXSAgLS0+ICBzY3JlZW5VcGRhdGUgIC0tPiAgWy4uLl1cbiAgICogICAgICAgICBtICB0OiAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgIGkgIGE6ICAgICAgICAgICAgICAgICAgWy4uLl1cbiAgICogICAgICAgICBjICBzOiAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgIHIgIGs6ICAgICAgICAgICAgICB3aGlsZSA8IHRpbWVvdXQ6XG4gICAqICAgICAgICAgbyAgczogICAgICAgICAgICAgICAgX2lubmVyV3JpdGUodGltZW91dClcbiAgICpcbiAgICogYHByb21pc2VSZXN1bHRgIGRlcGljdHMgdGhlIHByb21pc2UgcmVzb2x2ZSB2YWx1ZSBvZiBhbiBhc3luYyBoYW5kbGVyLlxuICAgKiBUaGlzIHZhbHVlIGdldHMgY2FycmllZCBmb3J3YXJkIHRocm91Z2ggYWxsIHNhdmVkIHN0YWNrIHN0YXRlcyBvZiB0aGVcbiAgICogcGF1c2VkIHBhcnNlciBmb3IgcHJvcGVyIGNvbnRpbnVhdGlvbi5cbiAgICpcbiAgICogTm90ZSwgZm9yIHB1cmUgc3luYyBjb2RlIGBsYXN0VGltZWAgYW5kIGBwcm9taXNlUmVzdWx0YCBoYXZlIG5vIG1lYW5pbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2lubmVyV3JpdGUobGFzdFRpbWU6IG51bWJlciA9IDAsIHByb21pc2VSZXN1bHQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gbGFzdFRpbWUgfHwgRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAodGhpcy5fd3JpdGVCdWZmZXIubGVuZ3RoID4gdGhpcy5fYnVmZmVyT2Zmc2V0KSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5fd3JpdGVCdWZmZXJbdGhpcy5fYnVmZmVyT2Zmc2V0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2FjdGlvbihkYXRhLCBwcm9taXNlUmVzdWx0KTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHdlIGdldCBhIHByb21pc2UgYXMgcmV0dXJuIHZhbHVlLCB3ZSByZS1zY2hlZHVsZSB0aGUgY29udGludWF0aW9uXG4gICAgICAgICAqIGFzIHRoZW5hYmxlIG9uIHRoZSBwcm9taXNlIGFuZCBleGl0IHJpZ2h0IGF3YXkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBleGl0IGhlcmUgbWVhbnMsIHRoYXQgd2UgYmxvY2sgaW5wdXQgcHJvY2Vzc2luZyBhdCB0aGUgY3VycmVudCBhY3RpdmUgY2h1bmssXG4gICAgICAgICAqIHRoZSBleGFjdCBleGVjdXRpb24gcG9zaXRpb24gd2l0aGluIHRoZSBjaHVuayBpcyBwcmVzZXJ2ZWQgYnkgdGhlIHNhdmVkXG4gICAgICAgICAqIHN0YWNrIGNvbnRlbnQgaW4gSW5wdXRIYW5kbGVyIGFuZCBFc2NhcGVTZXF1ZW5jZVBhcnNlci5cbiAgICAgICAgICpcbiAgICAgICAgICogUmVzdW1pbmcgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGZyb20gdGhhdCBzYXZlZCBzdGFjayBzdGF0ZS5cbiAgICAgICAgICogQWxzbyB0aGUgcmVzb2x2ZWQgcHJvbWlzZSB2YWx1ZSBpcyBwYXNzZWQgYWxvbmcgdGhlIGNhbGxzdGFjayB0b1xuICAgICAgICAgKiBgRXNjYXBlU2VxdWVuY2VQYXJzZXIucGFyc2VgIHRvIGNvcnJlY3RseSByZXN1bWUgdGhlIHN0b3BwZWQgaGFuZGxlciBsb29wLlxuICAgICAgICAgKlxuICAgICAgICAgKiBFeGNlcHRpb25zIG9uIGFzeW5jIGhhbmRsZXJzIHdpbGwgYmUgbG9nZ2VkIHRvIGNvbnNvbGUgYXN5bmMsIGJ1dCBkbyBub3QgaW50ZXJydXB0XG4gICAgICAgICAqIHRoZSBpbnB1dCBwcm9jZXNzaW5nIChjb250aW51ZXMgd2l0aCBuZXh0IGhhbmRsZXIgYXQgdGhlIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24pLlxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYSBwcm9taXNlIHRha2VzIGxvbmcgdG8gcmVzb2x2ZSwgd2Ugc2hvdWxkIHNjaGVkdWxlIGNvbnRpbnVhdGlvbiBiZWhpbmQgc2V0VGltZW91dC5cbiAgICAgICAgICogVGhpcyBtaWdodCBhbHJlYWR5IGJlIHRvbyBsYXRlLCBpZiBvdXIgLnRoZW4gZW50ZXJzIHJlYWxseSBsYXRlIChleGVjdXRvciArIHByZXYgdGhlbnNcbiAgICAgICAgICogdG9vayB2ZXJ5IGxvbmcpLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgaGVyZSBmb3IgdGhlIGhhbmRsZXIgaXRzZWxmIChpdCBpcyB0aGUgaGFuZGxlcnNcbiAgICAgICAgICogcmVzcG9uc2liaWxpdHkgdG8gc2xpY2UgaGFyZCB3b3JrKSwgYnV0IHdlIGNhbiBhdCBsZWFzdCBzY2hlZHVsZSBhIHNjcmVlbiB1cGRhdGUgYXMgd2VcbiAgICAgICAgICogZ2FpbiBjb250cm9sLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgY29udGludWF0aW9uOiAocjogYm9vbGVhbikgPT4gdm9pZCA9IChyOiBib29sZWFuKSA9PiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IFdSSVRFX1RJTUVPVVRfTVNcbiAgICAgICAgICA/IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faW5uZXJXcml0ZSgwLCByKSlcbiAgICAgICAgICA6IHRoaXMuX2lubmVyV3JpdGUoc3RhcnRUaW1lLCByKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3B0aW1pemF0aW9uIGNvbnNpZGVyYXRpb25zOlxuICAgICAgICAgKiBUaGUgY29udGludWF0aW9uIGFib3ZlIGZhdm9ycyBGUFMgb3ZlciB0aHJvdWdocHV0IGJ5IGV2YWwnaW5nIGBzdGFydFRpbWVgIG9uIHJlc29sdmUuXG4gICAgICAgICAqIFRoaXMgbWlnaHQgc2NoZWR1bGUgdG9vIG1hbnkgc2NyZWVuIHVwZGF0ZXMgd2l0aCBiYWQgdGhyb3VnaHB1dCBkcm9wcyAoaW4gY2FzZSBhIHNsb3dcbiAgICAgICAgICogcmVzb2x2aW5nIGhhbmRsZXIgc2xpY2VkIGl0cyB3b3JrIHByb3Blcmx5IGJlaGluZCBzZXRUaW1lb3V0IGNhbGxzKS4gV2UgY2Fubm90IHNwb3RcbiAgICAgICAgICogdGhpcyBjb25kaXRpb24gaGVyZSwgYWxzbyB0aGUgcmVuZGVyZXIgaGFzIG5vIHdheSB0byBzcG90IG5vbnNlbnNlIHVwZGF0ZXMgZWl0aGVyLlxuICAgICAgICAgKiBGSVhNRTogQSBwcm9wZXIgZml4IGZvciB0aGlzIHdvdWxkIHRyYWNrIHRoZSBGUFMgYXQgdGhlIHJlbmRlcmVyIGVudHJ5IGxldmVsIHNlcGFyYXRlbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIGZhdm9yaW5nIG9mIEZQUyBzaG93cyBiYWQgdGhyb3VnaHRwdXQgaW1wYWN0LCB1c2UgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLiBJdCBmYXZvcnNcbiAgICAgICAgICogdGhyb3VnaHB1dCBieSBldmFsJ2luZyBgc3RhcnRUaW1lYCB1cGZyb250IHB1bGxpbmcgYXQgbGVhc3Qgb25lIG1vcmUgY2h1bmsgaW50byB0aGVcbiAgICAgICAgICogY3VycmVudCBtaWNyb3Rhc2sgcXVldWUgKGV4ZWN1dGVkIGJlZm9yZSBzZXRUaW1lb3V0KS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIGNvbnN0IGNvbnRpbnVhdGlvbjogKHI6IGJvb2xlYW4pID0+IHZvaWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IFdSSVRFX1RJTUVPVVRfTVNcbiAgICAgICAgLy8gICA/IHIgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9pbm5lcldyaXRlKDAsIHIpKVxuICAgICAgICAvLyAgIDogciA9PiB0aGlzLl9pbm5lcldyaXRlKHN0YXJ0VGltZSwgcik7XG5cbiAgICAgICAgLy8gSGFuZGxlIGV4Y2VwdGlvbnMgc3luY2hyb25vdXNseSB0byBjdXJyZW50IGJhbmQgcG9zaXRpb24sIGlkZWE6XG4gICAgICAgIC8vIDEuIHNwYXduIGEgc2luZ2xlIG1pY3JvdGFzayB3aGljaCB3ZSBhbGxvdyB0byB0aHJvdyBoYXJkXG4gICAgICAgIC8vIDIuIHNwYXduIGEgcHJvbWlzZSBpbW1lZGlhdGVseSByZXNvbHZpbmcgdG8gYHRydWVgXG4gICAgICAgIC8vIChleGVjdXRlZCBvbiB0aGUgc2FtZSBxdWV1ZSwgdGh1cyBwcm9wZXJseSBhbGlnbmVkIGJlZm9yZSBjb250aW51YXRpb24gaGFwcGVucylcbiAgICAgICAgcmVzdWx0LmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge3Rocm93IGVycjt9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfSkudGhlbihjb250aW51YXRpb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNiID0gdGhpcy5fY2FsbGJhY2tzW3RoaXMuX2J1ZmZlck9mZnNldF07XG4gICAgICBpZiAoY2IpIGNiKCk7XG4gICAgICB0aGlzLl9idWZmZXJPZmZzZXQrKztcbiAgICAgIHRoaXMuX3BlbmRpbmdEYXRhIC09IGRhdGEubGVuZ3RoO1xuXG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSBXUklURV9USU1FT1VUX01TKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fd3JpdGVCdWZmZXIubGVuZ3RoID4gdGhpcy5fYnVmZmVyT2Zmc2V0KSB7XG4gICAgICAvLyBBbGxvdyByZW5kZXJlciB0byBjYXRjaCB1cCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCBiYXRjaFxuICAgICAgLy8gdHJpbSBhbHJlYWR5IHByb2Nlc3NlZCBjaHVua3MgaWYgd2UgYXJlIGFib3ZlIHRocmVzaG9sZFxuICAgICAgaWYgKHRoaXMuX2J1ZmZlck9mZnNldCA+IFdSSVRFX0JVRkZFUl9MRU5HVEhfVEhSRVNIT0xEKSB7XG4gICAgICAgIHRoaXMuX3dyaXRlQnVmZmVyID0gdGhpcy5fd3JpdGVCdWZmZXIuc2xpY2UodGhpcy5fYnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzLnNsaWNlKHRoaXMuX2J1ZmZlck9mZnNldCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2lubmVyV3JpdGUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dyaXRlQnVmZmVyLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLl9jYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuX3BlbmRpbmdEYXRhID0gMDtcbiAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG4gICAgfVxuICAgIHRoaXMuX29uV3JpdGVQYXJzZWQuZmlyZSgpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cblxuLy8gJ3JnYjonIHJ1bGUgLSBtYXRjaGluZzogci9nL2IgfCByci9nZy9iYiB8IHJyci9nZ2cvYmJiIHwgcnJyci9nZ2dnL2JiYmIgKGhleCBkaWdpdHMpXG5jb25zdCBSR0JfUkVYID0gL14oW1xcZGEtZl0pXFwvKFtcXGRhLWZdKVxcLyhbXFxkYS1mXSkkfF4oW1xcZGEtZl17Mn0pXFwvKFtcXGRhLWZdezJ9KVxcLyhbXFxkYS1mXXsyfSkkfF4oW1xcZGEtZl17M30pXFwvKFtcXGRhLWZdezN9KVxcLyhbXFxkYS1mXXszfSkkfF4oW1xcZGEtZl17NH0pXFwvKFtcXGRhLWZdezR9KVxcLyhbXFxkYS1mXXs0fSkkLztcbi8vICcjLi4uJyBydWxlIC0gbWF0Y2hpbmcgYW55IGhleCBkaWdpdHNcbmNvbnN0IEhBU0hfUkVYID0gL15bXFxkYS1mXSskLztcblxuLyoqXG4gKiBQYXJzZSBjb2xvciBzcGVjIHRvIFJHQiB2YWx1ZXMgKDggYml0IHBlciBjaGFubmVsKS5cbiAqIFNlZSBgbWFuIHhwYXJzZWNvbG9yYCBmb3IgZGV0YWlscyBhYm91dCBjZXJ0YWluIGZvcm1hdCBzcGVjaWZpY2F0aW9ucy5cbiAqXG4gKiBTdXBwb3J0ZWQgZm9ybWF0czpcbiAqIC0gcmdiOjxyZWQ+LzxncmVlbj4vPGJsdWU+IHdpdGggPHJlZD4sIDxncmVlbj4sIDxibHVlPiBpbiBoIHwgaGggfCBoaGggfCBoaGhoXG4gKiAtICNSR0IsICNSUkdHQkIsICNSUlJHR0dCQkIsICNSUlJSR0dHR0JCQkJcbiAqXG4gKiBBbGwgb3RoZXIgZm9ybWF0cyBsaWtlIHJnYmk6IG9yIGRldmljZS1pbmRlcGVuZGVudCBzdHJpbmcgc3BlY2lmaWNhdGlvbnNcbiAqIHdpdGggZmxvYXQgbnVtYmVyaW5nIGFyZSBub3Qgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb2xvcihkYXRhOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICBpZiAoIWRhdGEpIHJldHVybjtcbiAgLy8gYWxzbyBoYW5kbGUgdXBwZXJjYXNlc1xuICBsZXQgbG93ID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xuICBpZiAobG93LmluZGV4T2YoJ3JnYjonKSA9PT0gMCkge1xuICAgIC8vICdyZ2I6JyBzcGVjaWZpZXJcbiAgICBsb3cgPSBsb3cuc2xpY2UoNCk7XG4gICAgY29uc3QgbSA9IFJHQl9SRVguZXhlYyhsb3cpO1xuICAgIGlmIChtKSB7XG4gICAgICBjb25zdCBiYXNlID0gbVsxXSA/IDE1IDogbVs0XSA/IDI1NSA6IG1bN10gPyA0MDk1IDogNjU1MzU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKHBhcnNlSW50KG1bMV0gfHwgbVs0XSB8fCBtWzddIHx8IG1bMTBdLCAxNikgLyBiYXNlICogMjU1KSxcbiAgICAgICAgTWF0aC5yb3VuZChwYXJzZUludChtWzJdIHx8IG1bNV0gfHwgbVs4XSB8fCBtWzExXSwgMTYpIC8gYmFzZSAqIDI1NSksXG4gICAgICAgIE1hdGgucm91bmQocGFyc2VJbnQobVszXSB8fCBtWzZdIHx8IG1bOV0gfHwgbVsxMl0sIDE2KSAvIGJhc2UgKiAyNTUpXG4gICAgICBdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChsb3cuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgLy8gJyMnIHNwZWNpZmllclxuICAgIGxvdyA9IGxvdy5zbGljZSgxKTtcbiAgICBpZiAoSEFTSF9SRVguZXhlYyhsb3cpICYmIFszLCA2LCA5LCAxMl0uaW5jbHVkZXMobG93Lmxlbmd0aCkpIHtcbiAgICAgIGNvbnN0IGFkdiA9IGxvdy5sZW5ndGggLyAzO1xuICAgICAgY29uc3QgcmVzdWx0OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMF07XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgICBjb25zdCBjID0gcGFyc2VJbnQobG93LnNsaWNlKGFkdiAqIGksIGFkdiAqIGkgKyBhZHYpLCAxNik7XG4gICAgICAgIHJlc3VsdFtpXSA9IGFkdiA9PT0gMSA/IGMgPDwgNCA6IGFkdiA9PT0gMiA/IGMgOiBhZHYgPT09IDMgPyBjID4+IDQgOiBjID4+IDg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hbWVkIGNvbG9ycyBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZHVlIHRvIHRoZSBsYXJnZSBhZGRpdGlvbiB0byB0aGUgeHRlcm0uanMgYnVuZGxlIHNpemVcbiAgLy8gdGhleSB3b3VsZCBhZGQuIEluIG9yZGVyIHRvIHN1cHBvcnQgbmFtZWQgY29sb3JzLCB3ZSB3b3VsZCBuZWVkIHNvbWUgd2F5IG9mIG9wdGlvbmFsbHkgbG9hZGluZ1xuICAvLyBhZGRpdGlvbmFsIHBheWxvYWRzIHNvIHN0YXJ0dXAvZG93bmxvYWQgdGltZSBpcyBub3QgYmxvYXRlZCAoc2VlICMzNTMwKS5cbn1cblxuLy8gcGFkIGhleCBvdXRwdXQgdG8gcmVxdWVzdGVkIGJpdCB3aWR0aFxuZnVuY3Rpb24gcGFkKG46IG51bWJlciwgYml0czogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IG4udG9TdHJpbmcoMTYpO1xuICBjb25zdCBzMiA9IHMubGVuZ3RoIDwgMiA/ICcwJyArIHMgOiBzO1xuICBzd2l0Y2ggKGJpdHMpIHtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gc1swXTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gczI7XG4gICAgY2FzZSAxMjpcbiAgICAgIHJldHVybiAoczIgKyBzMikuc2xpY2UoMCwgMyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzMiArIHMyO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIGdpdmVuIGNvbG9yIHRvIHJnYjouLi8uLi8uLiBzdHJpbmcgb2YgYGJpdHNgIGRlcHRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9SZ2JTdHJpbmcoY29sb3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYml0czogbnVtYmVyID0gMTYpOiBzdHJpbmcge1xuICBjb25zdCBbciwgZywgYl0gPSBjb2xvcjtcbiAgcmV0dXJuIGByZ2I6JHtwYWQociwgYml0cyl9LyR7cGFkKGcsIGJpdHMpfS8ke3BhZChiLCBiaXRzKX1gO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKipcbiAqIEludGVybmFsIHN0YXRlcyBvZiBFc2NhcGVTZXF1ZW5jZVBhcnNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gUGFyc2VyU3RhdGUge1xuICBHUk9VTkQgPSAwLFxuICBFU0NBUEUgPSAxLFxuICBFU0NBUEVfSU5URVJNRURJQVRFID0gMixcbiAgQ1NJX0VOVFJZID0gMyxcbiAgQ1NJX1BBUkFNID0gNCxcbiAgQ1NJX0lOVEVSTUVESUFURSA9IDUsXG4gIENTSV9JR05PUkUgPSA2LFxuICBTT1NfUE1fQVBDX1NUUklORyA9IDcsXG4gIE9TQ19TVFJJTkcgPSA4LFxuICBEQ1NfRU5UUlkgPSA5LFxuICBEQ1NfUEFSQU0gPSAxMCxcbiAgRENTX0lHTk9SRSA9IDExLFxuICBEQ1NfSU5URVJNRURJQVRFID0gMTIsXG4gIERDU19QQVNTVEhST1VHSCA9IDEzXG59XG5cbi8qKlxuICogSW50ZXJuYWwgYWN0aW9ucyBvZiBFc2NhcGVTZXF1ZW5jZVBhcnNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gUGFyc2VyQWN0aW9uIHtcbiAgSUdOT1JFID0gMCxcbiAgRVJST1IgPSAxLFxuICBQUklOVCA9IDIsXG4gIEVYRUNVVEUgPSAzLFxuICBPU0NfU1RBUlQgPSA0LFxuICBPU0NfUFVUID0gNSxcbiAgT1NDX0VORCA9IDYsXG4gIENTSV9ESVNQQVRDSCA9IDcsXG4gIFBBUkFNID0gOCxcbiAgQ09MTEVDVCA9IDksXG4gIEVTQ19ESVNQQVRDSCA9IDEwLFxuICBDTEVBUiA9IDExLFxuICBEQ1NfSE9PSyA9IDEyLFxuICBEQ1NfUFVUID0gMTMsXG4gIERDU19VTkhPT0sgPSAxNFxufVxuXG4vKipcbiAqIEludGVybmFsIHN0YXRlcyBvZiBPc2NQYXJzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIE9zY1N0YXRlIHtcbiAgU1RBUlQgPSAwLFxuICBJRCA9IDEsXG4gIFBBWUxPQUQgPSAyLFxuICBBQk9SVCA9IDNcbn1cblxuLy8gcGF5bG9hZCBsaW1pdCBmb3IgT1NDIGFuZCBEQ1NcbmV4cG9ydCBjb25zdCBQQVlMT0FEX0xJTUlUID0gMTAwMDAwMDA7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElEY3NIYW5kbGVyLCBJUGFyYW1zLCBJSGFuZGxlckNvbGxlY3Rpb24sIElEY3NQYXJzZXIsIERjc0ZhbGxiYWNrSGFuZGxlclR5cGUsIElTdWJQYXJzZXJTdGFja1N0YXRlIH0gZnJvbSAnY29tbW9uL3BhcnNlci9UeXBlcyc7XG5pbXBvcnQgeyB1dGYzMlRvU3RyaW5nIH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcbmltcG9ydCB7IFBhcmFtcyB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvUGFyYW1zJztcbmltcG9ydCB7IFBBWUxPQURfTElNSVQgfSBmcm9tICdjb21tb24vcGFyc2VyL0NvbnN0YW50cyc7XG5cbmNvbnN0IEVNUFRZX0hBTkRMRVJTOiBJRGNzSGFuZGxlcltdID0gW107XG5cbmV4cG9ydCBjbGFzcyBEY3NQYXJzZXIgaW1wbGVtZW50cyBJRGNzUGFyc2VyIHtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IElIYW5kbGVyQ29sbGVjdGlvbjxJRGNzSGFuZGxlcj4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwcml2YXRlIF9hY3RpdmU6IElEY3NIYW5kbGVyW10gPSBFTVBUWV9IQU5ETEVSUztcbiAgcHJpdmF0ZSBfaWRlbnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2hhbmRsZXJGYjogRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBfc3RhY2s6IElTdWJQYXJzZXJTdGFja1N0YXRlID0ge1xuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgbG9vcFBvc2l0aW9uOiAwLFxuICAgIGZhbGxUaHJvdWdoOiBmYWxzZVxuICB9O1xuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9oYW5kbGVyRmIgPSAoKSA9PiB7IH07XG4gICAgdGhpcy5fYWN0aXZlID0gRU1QVFlfSEFORExFUlM7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGlkZW50OiBudW1iZXIsIGhhbmRsZXI6IElEY3NIYW5kbGVyKTogSURpc3Bvc2FibGUge1xuICAgIGlmICh0aGlzLl9oYW5kbGVyc1tpZGVudF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faGFuZGxlcnNbaWRlbnRdID0gW107XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXJMaXN0ID0gdGhpcy5faGFuZGxlcnNbaWRlbnRdO1xuICAgIGhhbmRsZXJMaXN0LnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZGV4ID0gaGFuZGxlckxpc3QuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGhhbmRsZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBoYW5kbGVyTGlzdC5zcGxpY2UoaGFuZGxlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2xlYXJIYW5kbGVyKGlkZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGFuZGxlcnNbaWRlbnRdKSBkZWxldGUgdGhpcy5faGFuZGxlcnNbaWRlbnRdO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRsZXJGYWxsYmFjayhoYW5kbGVyOiBEY3NGYWxsYmFja0hhbmRsZXJUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlckZiID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAvLyBmb3JjZSBjbGVhbnVwIGxlZnRvdmVyIGhhbmRsZXJzXG4gICAgaWYgKHRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGogPSB0aGlzLl9zdGFjay5wYXVzZWQgPyB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gLSAxIDogdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgLS1qKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS51bmhvb2soZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgICB0aGlzLl9pZGVudCA9IDA7XG4gIH1cblxuICBwdWJsaWMgaG9vayhpZGVudDogbnVtYmVyLCBwYXJhbXM6IElQYXJhbXMpOiB2b2lkIHtcbiAgICAvLyBhbHdheXMgcmVzZXQgbGVmdG92ZXIgaGFuZGxlcnNcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5faWRlbnQgPSBpZGVudDtcbiAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLl9oYW5kbGVyc1tpZGVudF0gfHwgRU1QVFlfSEFORExFUlM7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWRlbnQsICdIT09LJywgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVbal0uaG9vayhwYXJhbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwdXQoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWRlbnQsICdQVVQnLCB1dGYzMlRvU3RyaW5nKGRhdGEsIHN0YXJ0LCBlbmQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVbal0ucHV0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmhvb2soc3VjY2VzczogYm9vbGVhbiwgcHJvbWlzZVJlc3VsdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWRlbnQsICdVTkhPT0snLCBzdWNjZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+ID0gZmFsc2U7XG4gICAgICBsZXQgaiA9IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxO1xuICAgICAgbGV0IGZhbGxUaHJvdWdoID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5fc3RhY2sucGF1c2VkKSB7XG4gICAgICAgIGogPSB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gLSAxO1xuICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcHJvbWlzZVJlc3VsdDtcbiAgICAgICAgZmFsbFRocm91Z2ggPSB0aGlzLl9zdGFjay5mYWxsVGhyb3VnaDtcbiAgICAgICAgdGhpcy5fc3RhY2sucGF1c2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWZhbGxUaHJvdWdoICYmIGhhbmRsZXJSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIGZvciAoOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9hY3RpdmVbal0udW5ob29rKHN1Y2Nlc3MpO1xuICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uID0gajtcbiAgICAgICAgICAgIHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgai0tO1xuICAgICAgfVxuICAgICAgLy8gY2xlYW51cCBsZWZ0IG92ZXIgaGFuZGxlcnMgKGZhbGxUaHJvdWdoIGZvciBhc3luYylcbiAgICAgIGZvciAoOyBqID49IDA7IGotLSkge1xuICAgICAgICBoYW5kbGVyUmVzdWx0ID0gdGhpcy5fYWN0aXZlW2pdLnVuaG9vayhmYWxzZSk7XG4gICAgICAgIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uID0gajtcbiAgICAgICAgICB0aGlzLl9zdGFjay5mYWxsVGhyb3VnaCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlID0gRU1QVFlfSEFORExFUlM7XG4gICAgdGhpcy5faWRlbnQgPSAwO1xuICB9XG59XG5cbi8vIHByZWRlZmluZSBlbXB0eSBwYXJhbXMgYXMgWzBdIChaRE0pXG5jb25zdCBFTVBUWV9QQVJBTVMgPSBuZXcgUGFyYW1zKCk7XG5FTVBUWV9QQVJBTVMuYWRkUGFyYW0oMCk7XG5cbi8qKlxuICogQ29udmVuaWVudCBjbGFzcyB0byBjcmVhdGUgYSBEQ1MgaGFuZGxlciBmcm9tIGEgc2luZ2xlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogTm90ZTogVGhlIHBheWxvYWQgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8gNTAgTUIgKGhhcmRjb2RlZCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEY3NIYW5kbGVyIGltcGxlbWVudHMgSURjc0hhbmRsZXIge1xuICBwcml2YXRlIF9kYXRhID0gJyc7XG4gIHByaXZhdGUgX3BhcmFtczogSVBhcmFtcyA9IEVNUFRZX1BBUkFNUztcbiAgcHJpdmF0ZSBfaGl0TGltaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oYW5kbGVyOiAoZGF0YTogc3RyaW5nLCBwYXJhbXM6IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSB7IH1cblxuICBwdWJsaWMgaG9vayhwYXJhbXM6IElQYXJhbXMpOiB2b2lkIHtcbiAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIHByZXNlcnZlIHBhcmFtcyB1bnRpbCBgdW5ob29rYCwgd2UgaGF2ZSB0byBjbG9uZSBpdFxuICAgIC8vIChvbmx5IGJvcnJvd2VkIGZyb20gcGFyc2VyIGFuZCBzcGFucyBtdWx0aXBsZSBwYXJzZXIgc3RhdGVzKVxuICAgIC8vIHBlcmYgb3B0aW1pemF0aW9uOlxuICAgIC8vIGNsb25lIG9ubHksIGlmIHdlIGhhdmUgbm9uIGVtcHR5IHBhcmFtcywgb3RoZXJ3aXNlIHN0aWNrIHdpdGggZGVmYXVsdFxuICAgIHRoaXMuX3BhcmFtcyA9IChwYXJhbXMubGVuZ3RoID4gMSB8fCBwYXJhbXMucGFyYW1zWzBdKSA/IHBhcmFtcy5jbG9uZSgpIDogRU1QVFlfUEFSQU1TO1xuICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHB1dChkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZGF0YSArPSB1dGYzMlRvU3RyaW5nKGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgIGlmICh0aGlzLl9kYXRhLmxlbmd0aCA+IFBBWUxPQURfTElNSVQpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICAgIHRoaXMuX2hpdExpbWl0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5ob29rKHN1Y2Nlc3M6IGJvb2xlYW4pOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHJldDogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgIHJldCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoc3VjY2Vzcykge1xuICAgICAgcmV0ID0gdGhpcy5faGFuZGxlcih0aGlzLl9kYXRhLCB0aGlzLl9wYXJhbXMpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gbmVlZCB0byBob2xkIGRhdGEgYW5kIHBhcmFtcyB1bnRpbCBgcmV0YCBnb3QgcmVzb2x2ZWRcbiAgICAgICAgLy8gZG9udCBjYXJlIGZvciBlcnJvcnMsIGRhdGEgd2lsbCBiZSBmcmVlZCBhbnl3YXkgb24gbmV4dCBzdGFydFxuICAgICAgICByZXR1cm4gcmV0LnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMgPSBFTVBUWV9QQVJBTVM7XG4gICAgICAgICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3BhcmFtcyA9IEVNUFRZX1BBUkFNUztcbiAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElQYXJzaW5nU3RhdGUsIElEY3NIYW5kbGVyLCBJRXNjYXBlU2VxdWVuY2VQYXJzZXIsIElQYXJhbXMsIElPc2NIYW5kbGVyLCBJSGFuZGxlckNvbGxlY3Rpb24sIENzaUhhbmRsZXJUeXBlLCBPc2NGYWxsYmFja0hhbmRsZXJUeXBlLCBJT3NjUGFyc2VyLCBFc2NIYW5kbGVyVHlwZSwgSURjc1BhcnNlciwgRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSwgSUZ1bmN0aW9uSWRlbnRpZmllciwgRXhlY3V0ZUZhbGxiYWNrSGFuZGxlclR5cGUsIENzaUZhbGxiYWNrSGFuZGxlclR5cGUsIEVzY0ZhbGxiYWNrSGFuZGxlclR5cGUsIFByaW50SGFuZGxlclR5cGUsIFByaW50RmFsbGJhY2tIYW5kbGVyVHlwZSwgRXhlY3V0ZUhhbmRsZXJUeXBlLCBJUGFyc2VyU3RhY2tTdGF0ZSwgUGFyc2VyU3RhY2tUeXBlLCBSZXN1bWFibGVIYW5kbGVyc1R5cGUgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IFBhcnNlclN0YXRlLCBQYXJzZXJBY3Rpb24gfSBmcm9tICdjb21tb24vcGFyc2VyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFBhcmFtcyB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvUGFyYW1zJztcbmltcG9ydCB7IE9zY1BhcnNlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvT3NjUGFyc2VyJztcbmltcG9ydCB7IERjc1BhcnNlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvRGNzUGFyc2VyJztcblxuLyoqXG4gKiBUYWJsZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZCBsaWtlIHRoaXM6XG4gKiAgICBpbmRleDogIGN1cnJlbnRTdGF0ZSA8PCBUYWJsZVZhbHVlLklOREVYX1NUQVRFX1NISUZUIHwgY2hhckNvZGVcbiAqICAgIHZhbHVlOiAgYWN0aW9uIDw8IFRhYmxlVmFsdWUuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQgfCBuZXh0U3RhdGVcbiAqL1xuY29uc3QgZW51bSBUYWJsZUFjY2VzcyB7XG4gIFRSQU5TSVRJT05fQUNUSU9OX1NISUZUID0gNCxcbiAgVFJBTlNJVElPTl9TVEFURV9NQVNLID0gMTUsXG4gIElOREVYX1NUQVRFX1NISUZUID0gOFxufVxuXG4vKipcbiAqIFRyYW5zaXRpb24gdGFibGUgZm9yIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvblRhYmxlIHtcbiAgcHVibGljIHRhYmxlOiBVaW50OEFycmF5O1xuXG4gIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKSB7XG4gICAgdGhpcy50YWJsZSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgdHJhbnNpdGlvbi5cbiAgICogQHBhcmFtIGFjdGlvbiBkZWZhdWx0IGFjdGlvblxuICAgKiBAcGFyYW0gbmV4dCBkZWZhdWx0IG5leHQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXREZWZhdWx0KGFjdGlvbjogUGFyc2VyQWN0aW9uLCBuZXh0OiBQYXJzZXJTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMudGFibGUuZmlsbChhY3Rpb24gPDwgVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQgfCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB0cmFuc2l0aW9uIHRvIHRoZSB0cmFuc2l0aW9uIHRhYmxlLlxuICAgKiBAcGFyYW0gY29kZSBpbnB1dCBjaGFyYWN0ZXIgY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgY3VycmVudCBwYXJzZXIgc3RhdGVcbiAgICogQHBhcmFtIGFjdGlvbiBwYXJzZXIgYWN0aW9uIHRvIGJlIGRvbmVcbiAgICogQHBhcmFtIG5leHQgbmV4dCBwYXJzZXIgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBhZGQoY29kZTogbnVtYmVyLCBzdGF0ZTogUGFyc2VyU3RhdGUsIGFjdGlvbjogUGFyc2VyQWN0aW9uLCBuZXh0OiBQYXJzZXJTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMudGFibGVbc3RhdGUgPDwgVGFibGVBY2Nlc3MuSU5ERVhfU1RBVEVfU0hJRlQgfCBjb2RlXSA9IGFjdGlvbiA8PCBUYWJsZUFjY2Vzcy5UUkFOU0lUSU9OX0FDVElPTl9TSElGVCB8IG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYW5zaXRpb25zIGZvciBtdWx0aXBsZSBpbnB1dCBjaGFyYWN0ZXIgY29kZXMuXG4gICAqIEBwYXJhbSBjb2RlcyBpbnB1dCBjaGFyYWN0ZXIgY29kZSBhcnJheVxuICAgKiBAcGFyYW0gc3RhdGUgY3VycmVudCBwYXJzZXIgc3RhdGVcbiAgICogQHBhcmFtIGFjdGlvbiBwYXJzZXIgYWN0aW9uIHRvIGJlIGRvbmVcbiAgICogQHBhcmFtIG5leHQgbmV4dCBwYXJzZXIgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBhZGRNYW55KGNvZGVzOiBudW1iZXJbXSwgc3RhdGU6IFBhcnNlclN0YXRlLCBhY3Rpb246IFBhcnNlckFjdGlvbiwgbmV4dDogUGFyc2VyU3RhdGUpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnRhYmxlW3N0YXRlIDw8IFRhYmxlQWNjZXNzLklOREVYX1NUQVRFX1NISUZUIHwgY29kZXNbaV1dID0gYWN0aW9uIDw8IFRhYmxlQWNjZXNzLlRSQU5TSVRJT05fQUNUSU9OX1NISUZUIHwgbmV4dDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBQc2V1ZG8tY2hhcmFjdGVyIHBsYWNlaG9sZGVyIGZvciBwcmludGFibGUgbm9uLWFzY2lpIGNoYXJhY3RlcnMgKHVuaWNvZGUpLlxuY29uc3QgTk9OX0FTQ0lJX1BSSU5UQUJMRSA9IDB4QTA7XG5cblxuLyoqXG4gKiBWVDUwMCBjb21wYXRpYmxlIHRyYW5zaXRpb24gdGFibGUuXG4gKiBUYWtlbiBmcm9tIGh0dHBzOi8vdnQxMDAubmV0L2VtdS9kZWNfYW5zaV9wYXJzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBWVDUwMF9UUkFOU0lUSU9OX1RBQkxFID0gKGZ1bmN0aW9uICgpOiBUcmFuc2l0aW9uVGFibGUge1xuICBjb25zdCB0YWJsZTogVHJhbnNpdGlvblRhYmxlID0gbmV3IFRyYW5zaXRpb25UYWJsZSg0MDk1KTtcblxuICAvLyByYW5nZSBtYWNybyBmb3IgYnl0ZVxuICBjb25zdCBCWVRFX1ZBTFVFUyA9IDI1NjtcbiAgY29uc3QgYmx1ZXByaW50ID0gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoQllURV9WQUxVRVMpKS5tYXAoKHVudXNlZDogYW55LCBpOiBudW1iZXIpID0+IGkpO1xuICBjb25zdCByID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyW10gPT4gYmx1ZXByaW50LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIC8vIERlZmF1bHQgZGVmaW5pdGlvbnMuXG4gIGNvbnN0IFBSSU5UQUJMRVMgPSByKDB4MjAsIDB4N2YpOyAvLyAweDIwIChTUCkgaW5jbHVkZWQsIDB4N0YgKERFTCkgZXhjbHVkZWRcbiAgY29uc3QgRVhFQ1VUQUJMRVMgPSByKDB4MDAsIDB4MTgpO1xuICBFWEVDVVRBQkxFUy5wdXNoKDB4MTkpO1xuICBFWEVDVVRBQkxFUy5wdXNoLmFwcGx5KEVYRUNVVEFCTEVTLCByKDB4MWMsIDB4MjApKTtcblxuICBjb25zdCBzdGF0ZXM6IG51bWJlcltdID0gcihQYXJzZXJTdGF0ZS5HUk9VTkQsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCArIDEpO1xuICBsZXQgc3RhdGU6IGFueTtcblxuICAvLyBzZXQgZGVmYXVsdCB0cmFuc2l0aW9uXG4gIHRhYmxlLnNldERlZmF1bHQoUGFyc2VyQWN0aW9uLkVSUk9SLCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICAvLyBwcmludGFibGVzXG4gIHRhYmxlLmFkZE1hbnkoUFJJTlRBQkxFUywgUGFyc2VyU3RhdGUuR1JPVU5ELCBQYXJzZXJBY3Rpb24uUFJJTlQsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIC8vIGdsb2JhbCBhbnl3aGVyZSBydWxlc1xuICBmb3IgKHN0YXRlIGluIHN0YXRlcykge1xuICAgIHRhYmxlLmFkZE1hbnkoWzB4MTgsIDB4MWEsIDB4OTksIDB4OWFdLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gICAgdGFibGUuYWRkTWFueShyKDB4ODAsIDB4OTApLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gICAgdGFibGUuYWRkTWFueShyKDB4OTAsIDB4OTgpLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gICAgdGFibGUuYWRkKDB4OWMsIHN0YXRlLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5HUk9VTkQpOyAvLyBTVCBhcyB0ZXJtaW5hdG9yXG4gICAgdGFibGUuYWRkKDB4MWIsIHN0YXRlLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkVTQ0FQRSk7ICAvLyBFU0NcbiAgICB0YWJsZS5hZGQoMHg5ZCwgc3RhdGUsIFBhcnNlckFjdGlvbi5PU0NfU1RBUlQsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcpOyAgLy8gT1NDXG4gICAgdGFibGUuYWRkTWFueShbMHg5OCwgMHg5ZSwgMHg5Zl0sIHN0YXRlLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORyk7XG4gICAgdGFibGUuYWRkKDB4OWIsIHN0YXRlLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7ICAvLyBDU0lcbiAgICB0YWJsZS5hZGQoMHg5MCwgc3RhdGUsIFBhcnNlckFjdGlvbi5DTEVBUiwgUGFyc2VyU3RhdGUuRENTX0VOVFJZKTsgIC8vIERDU1xuICB9XG4gIC8vIHJ1bGVzIGZvciBleGVjdXRhYmxlcyBhbmQgN2ZcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuR1JPVU5ELCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuRVNDQVBFKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRVNDQVBFKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5DU0lfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUsIFBhcnNlckFjdGlvbi5FWEVDVVRFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5FWEVDVVRFLCBQYXJzZXJTdGF0ZS5FU0NBUEVfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUpO1xuICAvLyBvc2NcbiAgdGFibGUuYWRkKDB4NWQsIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLk9TQ19TVEFSVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZE1hbnkoUFJJTlRBQkxFUywgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLk9TQ19QVVQsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLk9TQ19QVVQsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcpO1xuICB0YWJsZS5hZGRNYW55KFsweDljLCAweDFiLCAweDE4LCAweDFhLCAweDA3XSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLk9TQ19FTkQsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIC8vIHNvcy9wbS9hcGMgZG9lcyBub3RoaW5nXG4gIHRhYmxlLmFkZE1hbnkoWzB4NTgsIDB4NWUsIDB4NWZdLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLlNPU19QTV9BUENfU1RSSU5HKTtcbiAgdGFibGUuYWRkTWFueShQUklOVEFCTEVTLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICB0YWJsZS5hZGQoMHg5YywgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICAvLyBjc2kgZW50cmllc1xuICB0YWJsZS5hZGQoMHg1YiwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ1NJX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHgzYyksIFBhcnNlclN0YXRlLkNTSV9FTlRSWSwgUGFyc2VyQWN0aW9uLlBBUkFNLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KFsweDNjLCAweDNkLCAweDNlLCAweDNmXSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4M2MpLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5QQVJBTSwgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5DU0lfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4M2MsIDB4M2QsIDB4M2UsIDB4M2ZdLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHg0MCksIFBhcnNlclN0YXRlLkNTSV9JR05PUkUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4MzApLCBQYXJzZXJTdGF0ZS5DU0lfRU5UUlksIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4MzApLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDQwKSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkNTSV9ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4MzApLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFKTtcbiAgLy8gZXNjX2ludGVybWVkaWF0ZVxuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5FU0NBUEVfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5FU0NBUEVfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHg1MCksIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkVTQ19ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NTEsIDB4NTgpLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4NTksIDB4NWEsIDB4NWNdLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDYwLCAweDdmKSwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICAvLyBkY3MgZW50cnlcbiAgdGFibGUuYWRkKDB4NTAsIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkNMRUFSLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlkpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19FTlRSWSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlkpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkRDU19FTlRSWSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHgzYyksIFBhcnNlclN0YXRlLkRDU19FTlRSWSwgUGFyc2VyQWN0aW9uLlBBUkFNLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KFsweDNjLCAweDNkLCAweDNlLCAweDNmXSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDgwKSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MWMsIDB4MjApLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDNjKSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uUEFSQU0sIFBhcnNlclN0YXRlLkRDU19QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4M2MsIDB4M2QsIDB4M2UsIDB4M2ZdLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgxYywgMHgyMCksIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4NDApLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uRENTX0hPT0ssIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uRENTX0hPT0ssIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uRENTX0hPT0ssIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCwgUGFyc2VyQWN0aW9uLkRDU19QVVQsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkoUFJJTlRBQkxFUywgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uRENTX1BVVCwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkTWFueShbMHgxYiwgMHg5YywgMHgxOCwgMHgxYV0sIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCwgUGFyc2VyQWN0aW9uLkRDU19VTkhPT0ssIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIC8vIHNwZWNpYWwgaGFuZGxpbmcgb2YgdW5pY29kZSBjaGFyc1xuICB0YWJsZS5hZGQoTk9OX0FTQ0lJX1BSSU5UQUJMRSwgUGFyc2VyU3RhdGUuR1JPVU5ELCBQYXJzZXJBY3Rpb24uUFJJTlQsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZChOT05fQVNDSUlfUFJJTlRBQkxFLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uT1NDX1BVVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZChOT05fQVNDSUlfUFJJTlRBQkxFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFKTtcbiAgdGFibGUuYWRkKE5PTl9BU0NJSV9QUklOVEFCTEUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUpO1xuICB0YWJsZS5hZGQoTk9OX0FTQ0lJX1BSSU5UQUJMRSwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uRENTX1BVVCwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgcmV0dXJuIHRhYmxlO1xufSkoKTtcblxuXG4vKipcbiAqIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBBTlNJL0RFQyBjb21wYXRpYmxlIHBhcnNlciBkZXNjcmliZWQgYnlcbiAqIFBhdWwgV2lsbGlhbXMgKGh0dHBzOi8vdnQxMDAubmV0L2VtdS9kZWNfYW5zaV9wYXJzZXIpLlxuICpcbiAqIFRvIGltcGxlbWVudCBjdXN0b20gQU5TSSBjb21wbGlhbnQgZXNjYXBlIHNlcXVlbmNlcyBpdCBpcyBub3QgbmVlZGVkIHRvXG4gKiBhbHRlciB0aGlzIHBhcnNlciwgaW5zdGVhZCBjb25zaWRlciByZWdpc3RlcmluZyBhIGN1c3RvbSBoYW5kbGVyLlxuICogRm9yIG5vbiBBTlNJIGNvbXBsaWFudCBzZXF1ZW5jZXMgY2hhbmdlIHRoZSB0cmFuc2l0aW9uIHRhYmxlIHdpdGhcbiAqIHRoZSBvcHRpb25hbCBgdHJhbnNpdGlvbnNgIGNvbnN0cnVjdG9yIGFyZ3VtZW50IGFuZFxuICogcmVpbXBsZW1lbnQgdGhlIGBwYXJzZWAgbWV0aG9kLlxuICpcbiAqIFRoaXMgcGFyc2VyIGlzIGN1cnJlbnRseSBoYXJkY29kZWQgdG8gb3BlcmF0ZSBpbiBaRE0gKFplcm8gRGVmYXVsdCBNb2RlKVxuICogYXMgc3VnZ2VzdGVkIGJ5IHRoZSBvcmlnaW5hbCBwYXJzZXIsIHRodXMgZW1wdHkgcGFyYW1ldGVycyBhcmUgc2V0IHRvIDAuXG4gKiBUaGlzIHRoaXMgaXMgbm90IGluIGxpbmUgd2l0aCB0aGUgbGF0ZXN0IEVDTUEtNDggc3BlY2lmaWNhdGlvblxuICogKFpETSB3YXMgcGFydCBvZiB0aGUgZWFybHkgc3BlY3MgYW5kIGdvdCBjb21wbGV0ZWx5IHJlbW92ZWQgbGF0ZXIgb24pLlxuICpcbiAqIE90aGVyIHRoYW4gdGhlIG9yaWdpbmFsIHBhcnNlciBmcm9tIHZ0MTAwLm5ldCB0aGlzIHBhcnNlciBzdXBwb3J0c1xuICogc3ViIHBhcmFtZXRlcnMgaW4gZGlnaXRhbCBwYXJhbWV0ZXJzIHNlcGFyYXRlZCBieSBjb2xvbnMuIEVtcHR5IHN1YiBwYXJhbWV0ZXJzXG4gKiBhcmUgc2V0IHRvIC0xIChubyBaRE0gZm9yIHN1YiBwYXJhbWV0ZXJzKS5cbiAqXG4gKiBBYm91dCBwcmVmaXggYW5kIGludGVybWVkaWF0ZSBieXRlczpcbiAqIFRoaXMgcGFyc2VyIGZvbGxvd3MgdGhlIGFzc3VtcHRpb25zIG9mIHRoZSB2dDEwMC5uZXQgcGFyc2VyIHdpdGggdGhlc2UgcmVzdHJpY3Rpb25zOlxuICogLSBvbmx5IG9uZSBwcmVmaXggYnl0ZSBpcyBhbGxvd2VkIGFzIGZpcnN0IHBhcmFtZXRlciBieXRlLCBieXRlIHJhbmdlIDB4M2MgLi4gMHgzZlxuICogLSBtYXguIHR3byBpbnRlcm1lZGlhdGVzIGFyZSByZXNwZWN0ZWQsIGJ5dGUgcmFuZ2UgMHgyMCAuLiAweDJmXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgaW4gbGluZSB3aXRoIEVDTUEtNDggd2hpY2ggZG9lcyBub3QgbGltaXQgZWl0aGVyIG9mIHRob3NlLlxuICogRnVydGhlcm1vcmUgRUNNQS00OCBhbGxvd3MgdGhlIHByZWZpeCBieXRlIHJhbmdlIGF0IGFueSBwYXJhbSBieXRlIHBvc2l0aW9uLiBDdXJyZW50bHlcbiAqIHRoZXJlIGFyZSBubyBrbm93biBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgdGhlIGJyb2FkZXIgZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBUT0RPOiBpbXBsZW1lbnQgZXJyb3IgcmVjb3ZlcnkgaG9vayB2aWEgZXJyb3IgaGFuZGxlciByZXR1cm4gdmFsdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBFc2NhcGVTZXF1ZW5jZVBhcnNlciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRXNjYXBlU2VxdWVuY2VQYXJzZXIge1xuICBwdWJsaWMgaW5pdGlhbFN0YXRlOiBudW1iZXI7XG4gIHB1YmxpYyBjdXJyZW50U3RhdGU6IG51bWJlcjtcbiAgcHVibGljIHByZWNlZGluZ0pvaW5TdGF0ZTogbnVtYmVyOyAvLyBVbmljb2RlSm9pblByb3BlcnRpZXNcblxuICAvLyBidWZmZXJzIG92ZXIgc2V2ZXJhbCBwYXJzZSBjYWxsc1xuICBwcm90ZWN0ZWQgX3BhcmFtczogUGFyYW1zO1xuICBwcm90ZWN0ZWQgX2NvbGxlY3Q6IG51bWJlcjtcblxuICAvLyBoYW5kbGVyIGxvb2t1cCBjb250YWluZXJzXG4gIHByb3RlY3RlZCBfcHJpbnRIYW5kbGVyOiBQcmludEhhbmRsZXJUeXBlO1xuICBwcm90ZWN0ZWQgX2V4ZWN1dGVIYW5kbGVyczogeyBbZmxhZzogbnVtYmVyXTogRXhlY3V0ZUhhbmRsZXJUeXBlIH07XG4gIHByb3RlY3RlZCBfY3NpSGFuZGxlcnM6IElIYW5kbGVyQ29sbGVjdGlvbjxDc2lIYW5kbGVyVHlwZT47XG4gIHByb3RlY3RlZCBfZXNjSGFuZGxlcnM6IElIYW5kbGVyQ29sbGVjdGlvbjxFc2NIYW5kbGVyVHlwZT47XG4gIHByb3RlY3RlZCByZWFkb25seSBfb3NjUGFyc2VyOiBJT3NjUGFyc2VyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Rjc1BhcnNlcjogSURjc1BhcnNlcjtcbiAgcHJvdGVjdGVkIF9lcnJvckhhbmRsZXI6IChzdGF0ZTogSVBhcnNpbmdTdGF0ZSkgPT4gSVBhcnNpbmdTdGF0ZTtcblxuICAvLyBmYWxsYmFjayBoYW5kbGVyc1xuICBwcm90ZWN0ZWQgX3ByaW50SGFuZGxlckZiOiBQcmludEZhbGxiYWNrSGFuZGxlclR5cGU7XG4gIHByb3RlY3RlZCBfZXhlY3V0ZUhhbmRsZXJGYjogRXhlY3V0ZUZhbGxiYWNrSGFuZGxlclR5cGU7XG4gIHByb3RlY3RlZCBfY3NpSGFuZGxlckZiOiBDc2lGYWxsYmFja0hhbmRsZXJUeXBlO1xuICBwcm90ZWN0ZWQgX2VzY0hhbmRsZXJGYjogRXNjRmFsbGJhY2tIYW5kbGVyVHlwZTtcbiAgcHJvdGVjdGVkIF9lcnJvckhhbmRsZXJGYjogKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiBJUGFyc2luZ1N0YXRlO1xuXG4gIC8vIHBhcnNlciBzdGFjayBzYXZlIGZvciBhc3luYyBoYW5kbGVyIHN1cHBvcnRcbiAgcHJvdGVjdGVkIF9wYXJzZVN0YWNrOiBJUGFyc2VyU3RhY2tTdGF0ZSA9IHtcbiAgICBzdGF0ZTogUGFyc2VyU3RhY2tUeXBlLk5PTkUsXG4gICAgaGFuZGxlcnM6IFtdLFxuICAgIGhhbmRsZXJQb3M6IDAsXG4gICAgdHJhbnNpdGlvbjogMCxcbiAgICBjaHVua1BvczogMFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdHJhbnNpdGlvbnM6IFRyYW5zaXRpb25UYWJsZSA9IFZUNTAwX1RSQU5TSVRJT05fVEFCTEVcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gUGFyc2VyU3RhdGUuR1JPVU5EO1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5pbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fcGFyYW1zID0gbmV3IFBhcmFtcygpOyAvLyBkZWZhdWx0cyB0byAzMiBzdG9yYWJsZSBwYXJhbXMvc3VicGFyYW1zXG4gICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAgICAvLyBaRE1cbiAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG5cbiAgICAvLyBzZXQgZGVmYXVsdCBmYWxsYmFjayBoYW5kbGVycyBhbmQgaGFuZGxlciBsb29rdXAgY29udGFpbmVyc1xuICAgIHRoaXMuX3ByaW50SGFuZGxlckZiID0gKGRhdGEsIHN0YXJ0LCBlbmQpOiB2b2lkID0+IHsgfTtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlckZiID0gKGNvZGU6IG51bWJlcik6IHZvaWQgPT4geyB9O1xuICAgIHRoaXMuX2NzaUhhbmRsZXJGYiA9IChpZGVudDogbnVtYmVyLCBwYXJhbXM6IElQYXJhbXMpOiB2b2lkID0+IHsgfTtcbiAgICB0aGlzLl9lc2NIYW5kbGVyRmIgPSAoaWRlbnQ6IG51bWJlcik6IHZvaWQgPT4geyB9O1xuICAgIHRoaXMuX2Vycm9ySGFuZGxlckZiID0gKHN0YXRlOiBJUGFyc2luZ1N0YXRlKTogSVBhcnNpbmdTdGF0ZSA9PiBzdGF0ZTtcbiAgICB0aGlzLl9wcmludEhhbmRsZXIgPSB0aGlzLl9wcmludEhhbmRsZXJGYjtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2NzaUhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9lc2NIYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY3NpSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2VzY0hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9KSk7XG4gICAgdGhpcy5fb3NjUGFyc2VyID0gdGhpcy5yZWdpc3RlcihuZXcgT3NjUGFyc2VyKCkpO1xuICAgIHRoaXMuX2Rjc1BhcnNlciA9IHRoaXMucmVnaXN0ZXIobmV3IERjc1BhcnNlcigpKTtcbiAgICB0aGlzLl9lcnJvckhhbmRsZXIgPSB0aGlzLl9lcnJvckhhbmRsZXJGYjtcblxuICAgIC8vIHN3YWxsb3cgN2JpdCBTVCAoRVNDK1xcKVxuICAgIHRoaXMucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdcXFxcJyB9LCAoKSA9PiB0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaWRlbnRpZmllcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgZmluYWxSYW5nZTogbnVtYmVyW10gPSBbMHg0MCwgMHg3ZV0pOiBudW1iZXIge1xuICAgIGxldCByZXMgPSAwO1xuICAgIGlmIChpZC5wcmVmaXgpIHtcbiAgICAgIGlmIChpZC5wcmVmaXgubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgb25lIGJ5dGUgYXMgcHJlZml4IHN1cHBvcnRlZCcpO1xuICAgICAgfVxuICAgICAgcmVzID0gaWQucHJlZml4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAocmVzICYmIDB4M2MgPiByZXMgfHwgcmVzID4gMHgzZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByZWZpeCBtdXN0IGJlIGluIHJhbmdlIDB4M2MgLi4gMHgzZicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWQuaW50ZXJtZWRpYXRlcykge1xuICAgICAgaWYgKGlkLmludGVybWVkaWF0ZXMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgdHdvIGJ5dGVzIGFzIGludGVybWVkaWF0ZXMgYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5pbnRlcm1lZGlhdGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGludGVybWVkaWF0ZSA9IGlkLmludGVybWVkaWF0ZXMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKDB4MjAgPiBpbnRlcm1lZGlhdGUgfHwgaW50ZXJtZWRpYXRlID4gMHgyZikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW50ZXJtZWRpYXRlIG11c3QgYmUgaW4gcmFuZ2UgMHgyMCAuLiAweDJmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzIDw8PSA4O1xuICAgICAgICByZXMgfD0gaW50ZXJtZWRpYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWQuZmluYWwubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbmFsIG11c3QgYmUgYSBzaW5nbGUgYnl0ZScpO1xuICAgIH1cbiAgICBjb25zdCBmaW5hbENvZGUgPSBpZC5maW5hbC5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChmaW5hbFJhbmdlWzBdID4gZmluYWxDb2RlIHx8IGZpbmFsQ29kZSA+IGZpbmFsUmFuZ2VbMV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluYWwgbXVzdCBiZSBpbiByYW5nZSAke2ZpbmFsUmFuZ2VbMF19IC4uICR7ZmluYWxSYW5nZVsxXX1gKTtcbiAgICB9XG4gICAgcmVzIDw8PSA4O1xuICAgIHJlcyB8PSBmaW5hbENvZGU7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGlkZW50VG9TdHJpbmcoaWRlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChpZGVudCkge1xuICAgICAgcmVzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpZGVudCAmIDB4RkYpKTtcbiAgICAgIGlkZW50ID4+PSA4O1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQcmludEhhbmRsZXIoaGFuZGxlcjogUHJpbnRIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3ByaW50SGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cbiAgcHVibGljIGNsZWFyUHJpbnRIYW5kbGVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByaW50SGFuZGxlciA9IHRoaXMuX3ByaW50SGFuZGxlckZiO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgaGFuZGxlcjogRXNjSGFuZGxlclR5cGUpOiBJRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgaWRlbnQgPSB0aGlzLl9pZGVudGlmaWVyKGlkLCBbMHgzMCwgMHg3ZV0pO1xuICAgIGlmICh0aGlzLl9lc2NIYW5kbGVyc1tpZGVudF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZXNjSGFuZGxlcnNbaWRlbnRdID0gW107XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXJMaXN0ID0gdGhpcy5fZXNjSGFuZGxlcnNbaWRlbnRdO1xuICAgIGhhbmRsZXJMaXN0LnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZGV4ID0gaGFuZGxlckxpc3QuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGhhbmRsZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBoYW5kbGVyTGlzdC5zcGxpY2UoaGFuZGxlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcHVibGljIGNsZWFyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9lc2NIYW5kbGVyc1t0aGlzLl9pZGVudGlmaWVyKGlkLCBbMHgzMCwgMHg3ZV0pXSkgZGVsZXRlIHRoaXMuX2VzY0hhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQsIFsweDMwLCAweDdlXSldO1xuICB9XG4gIHB1YmxpYyBzZXRFc2NIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogRXNjRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2VzY0hhbmRsZXJGYiA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhlY3V0ZUhhbmRsZXIoZmxhZzogc3RyaW5nLCBoYW5kbGVyOiBFeGVjdXRlSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlcnNbZmxhZy5jaGFyQ29kZUF0KDApXSA9IGhhbmRsZXI7XG4gIH1cbiAgcHVibGljIGNsZWFyRXhlY3V0ZUhhbmRsZXIoZmxhZzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2V4ZWN1dGVIYW5kbGVyc1tmbGFnLmNoYXJDb2RlQXQoMCldKSBkZWxldGUgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzW2ZsYWcuY2hhckNvZGVBdCgwKV07XG4gIH1cbiAgcHVibGljIHNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogRXhlY3V0ZUZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlckZiID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGhhbmRsZXI6IENzaUhhbmRsZXJUeXBlKTogSURpc3Bvc2FibGUge1xuICAgIGNvbnN0IGlkZW50ID0gdGhpcy5faWRlbnRpZmllcihpZCk7XG4gICAgaWYgKHRoaXMuX2NzaUhhbmRsZXJzW2lkZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jc2lIYW5kbGVyc1tpZGVudF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlckxpc3QgPSB0aGlzLl9jc2lIYW5kbGVyc1tpZGVudF07XG4gICAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5kZXggPSBoYW5kbGVyTGlzdC5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaGFuZGxlckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGhhbmRsZXJMaXN0LnNwbGljZShoYW5kbGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgY2xlYXJDc2lIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NzaUhhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQpXSkgZGVsZXRlIHRoaXMuX2NzaUhhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQpXTtcbiAgfVxuICBwdWJsaWMgc2V0Q3NpSGFuZGxlckZhbGxiYWNrKGNhbGxiYWNrOiAoaWRlbnQ6IG51bWJlciwgcGFyYW1zOiBJUGFyYW1zKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY3NpSGFuZGxlckZiID0gY2FsbGJhY2s7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBoYW5kbGVyOiBJRGNzSGFuZGxlcik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fZGNzUGFyc2VyLnJlZ2lzdGVySGFuZGxlcih0aGlzLl9pZGVudGlmaWVyKGlkKSwgaGFuZGxlcik7XG4gIH1cbiAgcHVibGljIGNsZWFyRGNzSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllcik6IHZvaWQge1xuICAgIHRoaXMuX2Rjc1BhcnNlci5jbGVhckhhbmRsZXIodGhpcy5faWRlbnRpZmllcihpZCkpO1xuICB9XG4gIHB1YmxpYyBzZXREY3NIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2Rjc1BhcnNlci5zZXRIYW5kbGVyRmFsbGJhY2soaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIsIGhhbmRsZXI6IElPc2NIYW5kbGVyKTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9vc2NQYXJzZXIucmVnaXN0ZXJIYW5kbGVyKGlkZW50LCBoYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9vc2NQYXJzZXIuY2xlYXJIYW5kbGVyKGlkZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0T3NjSGFuZGxlckZhbGxiYWNrKGhhbmRsZXI6IE9zY0ZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9vc2NQYXJzZXIuc2V0SGFuZGxlckZhbGxiYWNrKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHNldEVycm9ySGFuZGxlcihjYWxsYmFjazogKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiBJUGFyc2luZ1N0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5fZXJyb3JIYW5kbGVyID0gY2FsbGJhY2s7XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JIYW5kbGVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2Vycm9ySGFuZGxlciA9IHRoaXMuX2Vycm9ySGFuZGxlckZiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhcnNlciB0byBpbml0aWFsIHZhbHVlcy5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGxpZnQgdGhlIGltcHJvcGVyIGNvbnRpbnVhdGlvbiBlcnJvciBjb25kaXRpb25cbiAgICogd2hlbiBkZWFsaW5nIHdpdGggYXN5bmMgaGFuZGxlcnMuIFVzZSB0aGlzIG9ubHkgYXMgYSBsYXN0IHJlc29ydCB0byBzaWxlbmNlXG4gICAqIHRoYXQgZXJyb3Igd2hlbiB0aGUgdGVybWluYWwgaGFzIG5vIHBlbmRpbmcgZGF0YSB0byBiZSBwcm9jZXNzZWQuIE5vdGUgdGhhdFxuICAgKiB0aGUgaW50ZXJydXB0ZWQgYXN5bmMgaGFuZGxlciBtaWdodCBjb250aW51ZSBpdHMgd29yayBpbiB0aGUgZnV0dXJlIG1lc3NpbmdcbiAgICogdXAgdGhlIHRlcm1pbmFsIHN0YXRlIGV2ZW4gZnVydGhlci5cbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuX29zY1BhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuX2Rjc1BhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgdGhpcy5fY29sbGVjdCA9IDA7XG4gICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgIC8vIGFib3J0IHBlbmRpbmcgY29udGludWF0aW9uIGZyb20gYXN5bmMgaGFuZGxlclxuICAgIC8vIEhlcmUgdGhlIFJFU0VUIHR5cGUgaW5kaWNhdGVzLCB0aGF0IHRoZSBuZXh0IHBhcnNlIGNhbGwgd2lsbFxuICAgIC8vIGlnbm9yZSBhbnkgc2F2ZWQgc3RhY2ssIGluc3RlYWQgY29udGludWVzIHN5bmMgd2l0aCBuZXh0IGNvZGVwb2ludCBmcm9tIEdST1VORFxuICAgIGlmICh0aGlzLl9wYXJzZVN0YWNrLnN0YXRlICE9PSBQYXJzZXJTdGFja1R5cGUuTk9ORSkge1xuICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5SRVNFVDtcbiAgICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnMgPSBbXTsgLy8gYWxzbyByZWxlYXNlIGhhbmRsZXJzIHJlZlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBwYXJzZSBzdXBwb3J0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9wcmVzZXJ2ZVN0YWNrKFxuICAgIHN0YXRlOiBQYXJzZXJTdGFja1R5cGUsXG4gICAgaGFuZGxlcnM6IFJlc3VtYWJsZUhhbmRsZXJzVHlwZSxcbiAgICBoYW5kbGVyUG9zOiBudW1iZXIsXG4gICAgdHJhbnNpdGlvbjogbnVtYmVyLFxuICAgIGNodW5rUG9zOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJQb3MgPSBoYW5kbGVyUG9zO1xuICAgIHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG4gICAgdGhpcy5fcGFyc2VTdGFjay5jaHVua1BvcyA9IGNodW5rUG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIFVURjMyIGNvZGVwb2ludHMgaW4gYGRhdGFgIHVwIHRvIGBsZW5ndGhgLlxuICAgKlxuICAgKiBOb3RlOiBGb3Igc2V2ZXJhbCBhY3Rpb25zIHdpdGggaGlnaCBkYXRhIGxvYWQgdGhlIHBhcnNpbmcgaXMgb3B0aW1pemVkXG4gICAqIGJ5IHVzaW5nIGxvY2FsIHJlYWQgYWhlYWQgbG9vcHMgd2l0aCBoYXJkY29kZWQgY29uZGl0aW9ucyB0b1xuICAgKiBhdm9pZCBjb3N0bHkgdGFibGUgbG9va3Vwcy4gTWFrZSBzdXJlIHRoYXQgYW55IGNoYW5nZSBvZiB0YWJsZSB2YWx1ZXNcbiAgICogd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGxvb3AgY29uZGl0aW9ucyBhcyB3ZWxsIGFuZCB2aWNlIHZlcnNhLlxuICAgKiBBZmZlY3RlZCBzdGF0ZXMvYWN0aW9uczpcbiAgICogLSBHUk9VTkQ6UFJJTlRcbiAgICogLSBDU0lfUEFSQU06UEFSQU1cbiAgICogLSBEQ1NfUEFSQU06UEFSQU1cbiAgICogLSBPU0NfU1RSSU5HOk9TQ19QVVRcbiAgICogLSBEQ1NfUEFTU1RIUk9VR0g6RENTX1BVVFxuICAgKlxuICAgKiBOb3RlIG9uIGFzeW5jaHJvbm91cyBoYW5kbGVyIHN1cHBvcnQ6XG4gICAqIEFueSBoYW5kbGVyIHJldHVybmluZyBhIHByb21pc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGFzeW5jaHJvbm91cy5cbiAgICogVG8ga2VlcCB0aGUgaW4tYmFuZCBibG9ja2luZyB3b3JraW5nIGZvciBhc3luYyBoYW5kbGVycywgYHBhcnNlYCBwYXVzZXMgZXhlY3V0aW9uLFxuICAgKiBjcmVhdGVzIGEgc3RhY2sgc2F2ZSBhbmQgcmV0dXJucyB0aGUgcHJvbWlzZSB0byB0aGUgY2FsbGVyLlxuICAgKiBGb3IgcHJvcGVyIGNvbnRpbnVhdGlvbiBvZiB0aGUgcGF1c2VkIHN0YXRlIGl0IGlzIGltcG9ydGFudFxuICAgKiB0byBhd2FpdCB0aGUgcHJvbWlzZSByZXNvbHZpbmcuIE9uIHJlc29sdmUgdGhlIHBhcnNlIG11c3QgYmUgcmVwZWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSBjaHVuayBvZiBkYXRhIGFuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgaW4gYHByb21pc2VSZXN1bHRgXG4gICAqIHVudGlsIG5vIHByb21pc2UgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEltcG9ydGFudDogV2l0aCBvbmx5IHN5bmMgaGFuZGxlcnMgZGVmaW5lZCwgcGFyc2luZyBpcyBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIGFzIHdlbGwuXG4gICAqIEFzIHNvb24gYXMgYW4gYXN5bmMgaGFuZGxlciBpcyBpbnZvbHZlZCwgc3luY2hyb25vdXMgcGFyc2luZyBpcyBub3QgcG9zc2libGUgYW55bW9yZS5cbiAgICpcbiAgICogQm9pbGVycGxhdGUgZm9yIHByb3BlciBwYXJzaW5nIG9mIG11bHRpcGxlIGNodW5rcyB3aXRoIGFzeW5jIGhhbmRsZXJzOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVDaHVua3MoY2h1bmtzOiBVaW50MzJBcnJheVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAqICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICogICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+O1xuICAgKiAgICAgbGV0IHByZXY6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAqICAgICB3aGlsZSAocmVzdWx0ID0gcGFyc2VyLnBhcnNlKGNodW5rLCBjaHVuay5sZW5ndGgsIHByZXYpKSB7XG4gICAqICAgICAgIHByZXYgPSBhd2FpdCByZXN1bHQ7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiAgIC8vIGZpbmlzaGVkIHBhcnNpbmcgYWxsIGNodW5rcy4uLlxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHBhcnNlKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlciwgcHJvbWlzZVJlc3VsdD86IGJvb2xlYW4pOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGNvZGUgPSAwO1xuICAgIGxldCB0cmFuc2l0aW9uID0gMDtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBoYW5kbGVyUmVzdWx0OiB2b2lkIHwgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICAvLyByZXN1bWUgZnJvbSBhc3luYyBoYW5kbGVyXG4gICAgaWYgKHRoaXMuX3BhcnNlU3RhY2suc3RhdGUpIHtcbiAgICAgIC8vIGFsbG93IHN5bmMgcGFyc2VyIHJlc2V0IGV2ZW4gaW4gY29udGludWF0aW9uIG1vZGVcbiAgICAgIC8vIE5vdGU6IGNhbiBiZSB1c2VkIHRvIHJlY292ZXIgcGFyc2VyIGZyb20gaW1wcm9wZXIgY29udGludWF0aW9uIGVycm9yIGJlbG93XG4gICAgICBpZiAodGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9PT0gUGFyc2VyU3RhY2tUeXBlLlJFU0VUKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlU3RhY2suc3RhdGUgPSBQYXJzZXJTdGFja1R5cGUuTk9ORTtcbiAgICAgICAgc3RhcnQgPSB0aGlzLl9wYXJzZVN0YWNrLmNodW5rUG9zICsgMTsgLy8gY29udGludWUgd2l0aCBuZXh0IGNvZGVwb2ludCBpbiBHUk9VTkRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9taXNlUmVzdWx0ID09PSB1bmRlZmluZWQgfHwgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9PT0gUGFyc2VyU3RhY2tUeXBlLkZBSUwpIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZWplY3QgZnVydGhlciBwYXJzaW5nIG9uIGltcHJvcGVyIGNvbnRpbnVhdGlvbiBhZnRlciBwYXVzaW5nLiBUaGlzIGlzIGEgcmVhbGx5IGJhZFxuICAgICAgICAgICAqIGNvbmRpdGlvbiB3aXRoIHNjcmV3ZWQgdXAgZXhlY3V0aW9uIG9yZGVyIGFuZCBwcm9sbHkgbWVzc2VkIHVwIHRlcm1pbmFsIHN0YXRlLFxuICAgICAgICAgICAqIHRoZXJlZm9yZSB3ZSBleGl0IGhhcmQgd2l0aCBhbiBleGNlcHRpb24gYW5kIHJlamVjdCBhbnkgZnVydGhlciBwYXJzaW5nLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogTm90ZTogV2l0aCBgVGVybWluYWwud3JpdGVgIHVzYWdlIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBuZXZlciBvY2N1ciwgYXMgdGhlIHRvcCBsZXZlbFxuICAgICAgICAgICAqIGNhbGxzIGFyZSBndWFyYW50ZWVkIHRvIGhhbmRsZSBhc3luYyBjb25kaXRpb25zIHByb3Blcmx5LiBJZiB5b3UgZXZlciBlbmNvdW50ZXIgdGhpc1xuICAgICAgICAgICAqIGV4Y2VwdGlvbiBpbiB5b3VyIHRlcm1pbmFsIGludGVncmF0aW9uIGl0IGluZGljYXRlcywgdGhhdCB5b3UgaW5qZWN0ZWQgZGF0YSBjaHVua3MgdG9cbiAgICAgICAgICAgKiBgSW5wdXRIYW5kbGVyLnBhcnNlYCBvciBgRXNjYXBlU2VxdWVuY2VQYXJzZXIucGFyc2VgIHN5bmNocm9ub3VzbHkgd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAqIGNvbnRpbnVhdGlvbiBvZiBhIHJ1bm5pbmcgYXN5bmMgaGFuZGxlci5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIGdldCByaWQgb2YgdGhpcyBlcnJvciBieSBjYWxsaW5nIGByZXNldGAuIEJ1dCBkb250IHJlbHkgb24gdGhhdCwgYXNcbiAgICAgICAgICAgKiB0aGUgcGVuZGluZyBhc3luYyBoYW5kbGVyIHN0aWxsIG1pZ2h0IG1lc3MgdXAgdGhlIHRlcm1pbmFsIGxhdGVyLiBJbnN0ZWFkIGZpeCB0aGVcbiAgICAgICAgICAgKiBmYXVsdHkgYXN5bmMgaGFuZGxpbmcsIHNvIHRoaXMgZXJyb3Igd2lsbCBub3QgYmUgdGhyb3duIGFueW1vcmUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5GQUlMO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW1wcm9wZXIgY29udGludWF0aW9uIGR1ZSB0byBwcmV2aW91cyBhc3luYyBoYW5kbGVyLCBnaXZpbmcgdXAgcGFyc2luZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2UgaGF2ZSB0byByZXN1bWUgdGhlIG9sZCBoYW5kbGVyIGxvb3AgaWY6XG4gICAgICAgIC8vIC0gcmV0dXJuIHZhbHVlIG9mIHRoZSBwcm9taXNlIHdhcyBgZmFsc2VgXG4gICAgICAgIC8vIC0gaGFuZGxlcnMgYXJlIG5vdCBleGhhdXN0ZWQgeWV0XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycztcbiAgICAgICAgbGV0IGhhbmRsZXJQb3MgPSB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJQb3MgLSAxO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3BhcnNlU3RhY2suc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFBhcnNlclN0YWNrVHlwZS5DU0k6XG4gICAgICAgICAgICBpZiAocHJvbWlzZVJlc3VsdCA9PT0gZmFsc2UgJiYgaGFuZGxlclBvcyA+IC0xKSB7XG4gICAgICAgICAgICAgIGZvciAoOyBoYW5kbGVyUG9zID49IDA7IGhhbmRsZXJQb3MtLSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSAoaGFuZGxlcnMgYXMgQ3NpSGFuZGxlclR5cGVbXSlbaGFuZGxlclBvc10odGhpcy5fcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVyUG9zID0gaGFuZGxlclBvcztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycyA9IFtdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBQYXJzZXJTdGFja1R5cGUuRVNDOlxuICAgICAgICAgICAgaWYgKHByb21pc2VSZXN1bHQgPT09IGZhbHNlICYmIGhhbmRsZXJQb3MgPiAtMSkge1xuICAgICAgICAgICAgICBmb3IgKDsgaGFuZGxlclBvcyA+PSAwOyBoYW5kbGVyUG9zLS0pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gKGhhbmRsZXJzIGFzIEVzY0hhbmRsZXJUeXBlW10pW2hhbmRsZXJQb3NdKCk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlclBvcyA9IGhhbmRsZXJQb3M7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnMgPSBbXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUGFyc2VyU3RhY2tUeXBlLkRDUzpcbiAgICAgICAgICAgIGNvZGUgPSBkYXRhW3RoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3NdO1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2Rjc1BhcnNlci51bmhvb2soY29kZSAhPT0gMHgxOCAmJiBjb2RlICE9PSAweDFhLCBwcm9taXNlUmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IDB4MWIpIHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbiB8PSBQYXJzZXJTdGF0ZS5FU0NBUEU7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUGFyc2VyU3RhY2tUeXBlLk9TQzpcbiAgICAgICAgICAgIGNvZGUgPSBkYXRhW3RoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3NdO1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX29zY1BhcnNlci5lbmQoY29kZSAhPT0gMHgxOCAmJiBjb2RlICE9PSAweDFhLCBwcm9taXNlUmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IDB4MWIpIHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbiB8PSBQYXJzZXJTdGF0ZS5FU0NBUEU7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFudXAgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGUgbWFpbiBzeW5jIGxvb3BcbiAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5OT05FO1xuICAgICAgICBzdGFydCA9IHRoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3MgKyAxO1xuICAgICAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5fcGFyc2VTdGFjay50cmFuc2l0aW9uICYgVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9TVEFURV9NQVNLO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnRpbnVlIHdpdGggbWFpbiBzeW5jIGxvb3BcblxuICAgIC8vIHByb2Nlc3MgaW5wdXQgc3RyaW5nXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvZGUgPSBkYXRhW2ldO1xuXG4gICAgICAvLyBub3JtYWwgdHJhbnNpdGlvbiAmIGFjdGlvbiBsb29rdXBcbiAgICAgIHRyYW5zaXRpb24gPSB0aGlzLl90cmFuc2l0aW9ucy50YWJsZVt0aGlzLmN1cnJlbnRTdGF0ZSA8PCBUYWJsZUFjY2Vzcy5JTkRFWF9TVEFURV9TSElGVCB8IChjb2RlIDwgMHhhMCA/IGNvZGUgOiBOT05fQVNDSUlfUFJJTlRBQkxFKV07XG4gICAgICBzd2l0Y2ggKHRyYW5zaXRpb24gPj4gVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQpIHtcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uUFJJTlQ6XG4gICAgICAgICAgLy8gcmVhZCBhaGVhZCB3aXRoIGxvb3AgdW5yb2xsaW5nXG4gICAgICAgICAgLy8gTm90ZTogMHgyMCAoU1ApIGlzIGluY2x1ZGVkLCAweDdGIChERUwpIGlzIGV4Y2x1ZGVkXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyA7ICsraikge1xuICAgICAgICAgICAgaWYgKGogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPCAweDIwIHx8IChjb2RlID4gMHg3ZSAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJpbnRIYW5kbGVyKGRhdGEsIGksIGopO1xuICAgICAgICAgICAgICBpID0gaiAtIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCsraiA+PSBsZW5ndGggfHwgKGNvZGUgPSBkYXRhW2pdKSA8IDB4MjAgfHwgKGNvZGUgPiAweDdlICYmIGNvZGUgPCBOT05fQVNDSUlfUFJJTlRBQkxFKSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcmludEhhbmRsZXIoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKytqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pIDwgMHgyMCB8fCAoY29kZSA+IDB4N2UgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3ByaW50SGFuZGxlcihkYXRhLCBpLCBqKTtcbiAgICAgICAgICAgICAgaSA9IGogLSAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgrK2ogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPCAweDIwIHx8IChjb2RlID4gMHg3ZSAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJpbnRIYW5kbGVyKGRhdGEsIGksIGopO1xuICAgICAgICAgICAgICBpID0gaiAtIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uRVhFQ1VURTpcbiAgICAgICAgICBpZiAodGhpcy5fZXhlY3V0ZUhhbmRsZXJzW2NvZGVdKSB0aGlzLl9leGVjdXRlSGFuZGxlcnNbY29kZV0oKTtcbiAgICAgICAgICBlbHNlIHRoaXMuX2V4ZWN1dGVIYW5kbGVyRmIoY29kZSk7XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5JR05PUkU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkVSUk9SOlxuICAgICAgICAgIGNvbnN0IGluamVjdDogSVBhcnNpbmdTdGF0ZSA9IHRoaXMuX2Vycm9ySGFuZGxlcihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGksXG4gICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogdGhpcy5jdXJyZW50U3RhdGUsXG4gICAgICAgICAgICAgIGNvbGxlY3Q6IHRoaXMuX2NvbGxlY3QsXG4gICAgICAgICAgICAgIHBhcmFtczogdGhpcy5fcGFyYW1zLFxuICAgICAgICAgICAgICBhYm9ydDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpbmplY3QuYWJvcnQpIHJldHVybjtcbiAgICAgICAgICAvLyBpbmplY3QgdmFsdWVzOiBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkNTSV9ESVNQQVRDSDpcbiAgICAgICAgICAvLyBUcmlnZ2VyIENTSSBIYW5kbGVyXG4gICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9jc2lIYW5kbGVyc1t0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlXTtcbiAgICAgICAgICBsZXQgaiA9IGhhbmRsZXJzID8gaGFuZGxlcnMubGVuZ3RoIC0gMSA6IC0xO1xuICAgICAgICAgIGZvciAoOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgLy8gdHJ1ZSBtZWFucyBzdWNjZXNzIGFuZCB0byBzdG9wIGJ1YmJsaW5nXG4gICAgICAgICAgICAvLyBhIHByb21pc2UgaW5kaWNhdGVzIGFuIGFzeW5jIGhhbmRsZXIgdGhhdCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHByb2dyZXNzaW5nXG4gICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gaGFuZGxlcnNbal0odGhpcy5fcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcmVzZXJ2ZVN0YWNrKFBhcnNlclN0YWNrVHlwZS5DU0ksIGhhbmRsZXJzLCBqLCB0cmFuc2l0aW9uLCBpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fY3NpSGFuZGxlckZiKHRoaXMuX2NvbGxlY3QgPDwgOCB8IGNvZGUsIHRoaXMuX3BhcmFtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uUEFSQU06XG4gICAgICAgICAgLy8gaW5uZXIgbG9vcDogZGlnaXRzICgweDMwIC0gMHgzOSkgYW5kIDsgKDB4M2IpIGFuZCA6ICgweDNhKVxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICBjYXNlIDB4M2I6XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAgLy8gWkRNXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgMHgzYTpcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkU3ViUGFyYW0oLTEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OiAgLy8gMHgzMCAtIDB4MzlcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkRGlnaXQoY29kZSAtIDQ4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlICgrK2kgPCBsZW5ndGggJiYgKGNvZGUgPSBkYXRhW2ldKSA+IDB4MmYgJiYgY29kZSA8IDB4M2MpO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uQ09MTEVDVDpcbiAgICAgICAgICB0aGlzLl9jb2xsZWN0IDw8PSA4O1xuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgfD0gY29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENIOlxuICAgICAgICAgIGNvbnN0IGhhbmRsZXJzRXNjID0gdGhpcy5fZXNjSGFuZGxlcnNbdGhpcy5fY29sbGVjdCA8PCA4IHwgY29kZV07XG4gICAgICAgICAgbGV0IGpqID0gaGFuZGxlcnNFc2MgPyBoYW5kbGVyc0VzYy5sZW5ndGggLSAxIDogLTE7XG4gICAgICAgICAgZm9yICg7IGpqID49IDA7IGpqLS0pIHtcbiAgICAgICAgICAgIC8vIHRydWUgbWVhbnMgc3VjY2VzcyBhbmQgdG8gc3RvcCBidWJibGluZ1xuICAgICAgICAgICAgLy8gYSBwcm9taXNlIGluZGljYXRlcyBhbiBhc3luYyBoYW5kbGVyIHRoYXQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSBwcm9ncmVzc2luZ1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IGhhbmRsZXJzRXNjW2pqXSgpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLkVTQywgaGFuZGxlcnNFc2MsIGpqLCB0cmFuc2l0aW9uLCBpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqaiA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2VzY0hhbmRsZXJGYih0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5DTEVBUjpcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7IC8vIFpETVxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5EQ1NfSE9PSzpcbiAgICAgICAgICB0aGlzLl9kY3NQYXJzZXIuaG9vayh0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlLCB0aGlzLl9wYXJhbXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5EQ1NfUFVUOlxuICAgICAgICAgIC8vIGlubmVyIGxvb3AgLSBleGl0IERDU19QVVQ6IDB4MTgsIDB4MWEsIDB4MWIsIDB4N2YsIDB4ODAgLSAweDlmXG4gICAgICAgICAgLy8gdW5ob29rIHRyaWdnZXJlZCBieTogMHgxYiwgMHg5YyAoc3VjY2VzcykgYW5kIDB4MTgsIDB4MWEgKGFib3J0KVxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgOyArK2opIHtcbiAgICAgICAgICAgIGlmIChqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pID09PSAweDE4IHx8IGNvZGUgPT09IDB4MWEgfHwgY29kZSA9PT0gMHgxYiB8fCAoY29kZSA+IDB4N2YgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Rjc1BhcnNlci5wdXQoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5EQ1NfVU5IT09LOlxuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9kY3NQYXJzZXIudW5ob29rKGNvZGUgIT09IDB4MTggJiYgY29kZSAhPT0gMHgxYSk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLkRDUywgW10sIDAsIHRyYW5zaXRpb24sIGkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlID09PSAweDFiKSB0cmFuc2l0aW9uIHw9IFBhcnNlclN0YXRlLkVTQ0FQRTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7IC8vIFpETVxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uT1NDX1NUQVJUOlxuICAgICAgICAgIHRoaXMuX29zY1BhcnNlci5zdGFydCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5PU0NfUFVUOlxuICAgICAgICAgIC8vIGlubmVyIGxvb3A6IDB4MjAgKFNQKSBpbmNsdWRlZCwgMHg3RiAoREVMKSBpbmNsdWRlZFxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pIDwgMHgyMCB8fCAoY29kZSA+IDB4N2YgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX29zY1BhcnNlci5wdXQoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5PU0NfRU5EOlxuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9vc2NQYXJzZXIuZW5kKGNvZGUgIT09IDB4MTggJiYgY29kZSAhPT0gMHgxYSk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLk9TQywgW10sIDAsIHRyYW5zaXRpb24sIGkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlID09PSAweDFiKSB0cmFuc2l0aW9uIHw9IFBhcnNlclN0YXRlLkVTQ0FQRTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7IC8vIFpETVxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gdHJhbnNpdGlvbiAmIFRhYmxlQWNjZXNzLlRSQU5TSVRJT05fU1RBVEVfTUFTSztcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSU9zY0hhbmRsZXIsIElIYW5kbGVyQ29sbGVjdGlvbiwgT3NjRmFsbGJhY2tIYW5kbGVyVHlwZSwgSU9zY1BhcnNlciwgSVN1YlBhcnNlclN0YWNrU3RhdGUgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IE9zY1N0YXRlLCBQQVlMT0FEX0xJTUlUIH0gZnJvbSAnY29tbW9uL3BhcnNlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgdXRmMzJUb1N0cmluZyB9IGZyb20gJ2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlcic7XG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmNvbnN0IEVNUFRZX0hBTkRMRVJTOiBJT3NjSGFuZGxlcltdID0gW107XG5cbmV4cG9ydCBjbGFzcyBPc2NQYXJzZXIgaW1wbGVtZW50cyBJT3NjUGFyc2VyIHtcbiAgcHJpdmF0ZSBfc3RhdGUgPSBPc2NTdGF0ZS5TVEFSVDtcbiAgcHJpdmF0ZSBfYWN0aXZlID0gRU1QVFlfSEFORExFUlM7XG4gIHByaXZhdGUgX2lkID0gLTE7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBJSGFuZGxlckNvbGxlY3Rpb248SU9zY0hhbmRsZXI+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcHJpdmF0ZSBfaGFuZGxlckZiOiBPc2NGYWxsYmFja0hhbmRsZXJUeXBlID0gKCkgPT4geyB9O1xuICBwcml2YXRlIF9zdGFjazogSVN1YlBhcnNlclN0YWNrU3RhdGUgPSB7XG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBsb29wUG9zaXRpb246IDAsXG4gICAgZmFsbFRocm91Z2g6IGZhbHNlXG4gIH07XG5cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZGVudDogbnVtYmVyLCBoYW5kbGVyOiBJT3NjSGFuZGxlcik6IElEaXNwb3NhYmxlIHtcbiAgICBpZiAodGhpcy5faGFuZGxlcnNbaWRlbnRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJzW2lkZW50XSA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVyTGlzdCA9IHRoaXMuX2hhbmRsZXJzW2lkZW50XTtcbiAgICBoYW5kbGVyTGlzdC5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmRleCA9IGhhbmRsZXJMaXN0LmluZGV4T2YoaGFuZGxlcik7XG4gICAgICAgIGlmIChoYW5kbGVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgaGFuZGxlckxpc3Quc3BsaWNlKGhhbmRsZXJJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHB1YmxpYyBjbGVhckhhbmRsZXIoaWRlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oYW5kbGVyc1tpZGVudF0pIGRlbGV0ZSB0aGlzLl9oYW5kbGVyc1tpZGVudF07XG4gIH1cbiAgcHVibGljIHNldEhhbmRsZXJGYWxsYmFjayhoYW5kbGVyOiBPc2NGYWxsYmFja0hhbmRsZXJUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlckZiID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9oYW5kbGVyRmIgPSAoKSA9PiB7IH07XG4gICAgdGhpcy5fYWN0aXZlID0gRU1QVFlfSEFORExFUlM7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gZm9yY2UgY2xlYW51cCBoYW5kbGVycyBpZiBwYXlsb2FkIHdhcyBhbHJlYWR5IHNlbnRcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IE9zY1N0YXRlLlBBWUxPQUQpIHtcbiAgICAgIGZvciAobGV0IGogPSB0aGlzLl9zdGFjay5wYXVzZWQgPyB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gLSAxIDogdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgLS1qKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5lbmQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgICB0aGlzLl9pZCA9IC0xO1xuICAgIHRoaXMuX3N0YXRlID0gT3NjU3RhdGUuU1RBUlQ7XG4gIH1cblxuICBwcml2YXRlIF9zdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLl9oYW5kbGVyc1t0aGlzLl9pZF0gfHwgRU1QVFlfSEFORExFUlM7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWQsICdTVEFSVCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5zdGFydCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3B1dChkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZCwgJ1BVVCcsIHV0ZjMyVG9TdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5wdXQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIGFsd2F5cyByZXNldCBsZWZ0b3ZlciBoYW5kbGVyc1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9zdGF0ZSA9IE9zY1N0YXRlLklEO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCBkYXRhIHRvIGN1cnJlbnQgT1NDIGNvbW1hbmQuXG4gICAqIEV4cGVjdHMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIE9TQyBjb21tYW5kIGluIHRoZSBmb3JtXG4gICAqIE9TQyBpZCA7IHBheWxvYWQgU1QvQkVMXG4gICAqIFBheWxvYWQgY2h1bmtzIGFyZSBub3QgZnVydGhlciBwcm9jZXNzZWQgYW5kIGdldFxuICAgKiBkaXJlY3RseSBwYXNzZWQgdG8gdGhlIGhhbmRsZXJzLlxuICAgKi9cbiAgcHVibGljIHB1dChkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IE9zY1N0YXRlLkFCT1JUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gT3NjU3RhdGUuSUQpIHtcbiAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgICAgICBjb25zdCBjb2RlID0gZGF0YVtzdGFydCsrXTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4M2IpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IE9zY1N0YXRlLlBBWUxPQUQ7XG4gICAgICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA8IDB4MzAgfHwgMHgzOSA8IGNvZGUpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IE9zY1N0YXRlLkFCT1JUO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faWQgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5faWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lkID0gdGhpcy5faWQgKiAxMCArIGNvZGUgLSA0ODtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBPc2NTdGF0ZS5QQVlMT0FEICYmIGVuZCAtIHN0YXJ0ID4gMCkge1xuICAgICAgdGhpcy5fcHV0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgZW5kIG9mIGFuIE9TQyBjb21tYW5kLlxuICAgKiBXaGV0aGVyIHRoZSBPU0MgZ290IGFib3J0ZWQgb3IgZmluaXNoZWQgbm9ybWFsbHlcbiAgICogaXMgaW5kaWNhdGVkIGJ5IGBzdWNjZXNzYC5cbiAgICovXG4gIHB1YmxpYyBlbmQoc3VjY2VzczogYm9vbGVhbiwgcHJvbWlzZVJlc3VsdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBPc2NTdGF0ZS5TVEFSVCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBkbyBub3RoaW5nIGlmIGNvbW1hbmQgd2FzIGZhdWx0eVxuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gT3NjU3RhdGUuQUJPUlQpIHtcbiAgICAgIC8vIGlmIHdlIGFyZSBzdGlsbCBpbiBJRCBzdGF0ZSBhbmQgZ2V0IGFuIGVhcmx5IGVuZFxuICAgICAgLy8gbWVhbnMgdGhhdCB0aGUgY29tbWFuZCBoYXMgbm8gcGF5bG9hZCB0aHVzIHdlIHN0aWxsIGhhdmVcbiAgICAgIC8vIHRvIGFubm91bmNlIFNUQVJUIGFuZCBzZW5kIEVORCByaWdodCBhZnRlclxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBPc2NTdGF0ZS5JRCkge1xuICAgICAgICB0aGlzLl9zdGFydCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlckZiKHRoaXMuX2lkLCAnRU5EJywgc3VjY2Vzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgaGFuZGxlclJlc3VsdDogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gPSBmYWxzZTtcbiAgICAgICAgbGV0IGogPSB0aGlzLl9hY3RpdmUubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IGZhbGxUaHJvdWdoID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9zdGFjay5wYXVzZWQpIHtcbiAgICAgICAgICBqID0gdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uIC0gMTtcbiAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcHJvbWlzZVJlc3VsdDtcbiAgICAgICAgICBmYWxsVGhyb3VnaCA9IHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoO1xuICAgICAgICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmFsbFRocm91Z2ggJiYgaGFuZGxlclJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9hY3RpdmVbal0uZW5kKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiA9IGo7XG4gICAgICAgICAgICAgIHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBqLS07XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYW51cCBsZWZ0IG92ZXIgaGFuZGxlcnNcbiAgICAgICAgLy8gd2UgYWx3YXlzIGhhdmUgdG8gY2FsbCAuZW5kIGZvciBwcm9wZXIgY2xlYW51cCxcbiAgICAgICAgLy8gaGVyZSB3ZSB1c2UgYHN1Y2Nlc3NgIHRvIGluZGljYXRlIHdoZXRoZXIgYSBoYW5kbGVyIHNob3VsZCBleGVjdXRlXG4gICAgICAgIGZvciAoOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9hY3RpdmVbal0uZW5kKGZhbHNlKTtcbiAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gPSBqO1xuICAgICAgICAgICAgdGhpcy5fc3RhY2suZmFsbFRocm91Z2ggPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlID0gRU1QVFlfSEFORExFUlM7XG4gICAgdGhpcy5faWQgPSAtMTtcbiAgICB0aGlzLl9zdGF0ZSA9IE9zY1N0YXRlLlNUQVJUO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVuaWVudCBjbGFzcyB0byBhbGxvdyBhdHRhY2hpbmcgc3RyaW5nIGJhc2VkIGhhbmRsZXIgZnVuY3Rpb25zXG4gKiBhcyBPU0MgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPc2NIYW5kbGVyIGltcGxlbWVudHMgSU9zY0hhbmRsZXIge1xuICBwcml2YXRlIF9kYXRhID0gJyc7XG4gIHByaXZhdGUgX2hpdExpbWl0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaGFuZGxlcjogKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pIHsgfVxuXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBwdXQoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2hpdExpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RhdGEgKz0gdXRmMzJUb1N0cmluZyhkYXRhLCBzdGFydCwgZW5kKTtcbiAgICBpZiAodGhpcy5fZGF0YS5sZW5ndGggPiBQQVlMT0FEX0xJTUlUKSB7XG4gICAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgICB0aGlzLl9oaXRMaW1pdCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVuZChzdWNjZXNzOiBib29sZWFuKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCByZXQ6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2hpdExpbWl0KSB7XG4gICAgICByZXQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHJldCA9IHRoaXMuX2hhbmRsZXIodGhpcy5fZGF0YSk7XG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBuZWVkIHRvIGhvbGQgZGF0YSB1bnRpbCBgcmV0YCBnb3QgcmVzb2x2ZWRcbiAgICAgICAgLy8gZG9udCBjYXJlIGZvciBlcnJvcnMsIGRhdGEgd2lsbCBiZSBmcmVlZCBhbnl3YXkgb24gbmV4dCBzdGFydFxuICAgICAgICByZXR1cm4gcmV0LnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2U7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSVBhcmFtcywgUGFyYW1zQXJyYXkgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcblxuLy8gbWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgYSBzaW5nbGUgcGFyYW0vc3VicGFyYW0gKGNsYW1wZWQgdG8gcG9zaXRpdmUgaW50MzIgcmFuZ2UpXG5jb25zdCBNQVhfVkFMVUUgPSAweDdGRkZGRkZGO1xuLy8gbWF4IGFsbG93ZWQgc3VicGFyYW1zIGZvciBhIHNpbmdsZSBzZXF1ZW5jZSAoaGFyZGNvZGVkIGxpbWl0YXRpb24pXG5jb25zdCBNQVhfU1VCUEFSQU1TID0gMjU2O1xuXG4vKipcbiAqIFBhcmFtcyBzdG9yYWdlIGNsYXNzLlxuICogVGhpcyB0eXBlIGlzIHVzZWQgYnkgdGhlIHBhcnNlciB0byBhY2N1bXVsYXRlIHNlcXVlbmNlIHBhcmFtZXRlcnMgYW5kIHN1YiBwYXJhbWV0ZXJzXG4gKiBhbmQgdHJhbnNtaXQgdGhlbSB0byB0aGUgaW5wdXQgaGFuZGxlciBhY3Rpb25zLlxuICpcbiAqIE5PVEVTOlxuICogIC0gcGFyYW1zIG9iamVjdCBmb3IgYWN0aW9uIGhhbmRsZXJzIGlzIGJvcnJvd2VkLCB1c2UgYC50b0FycmF5YCBvciBgLmNsb25lYCB0byBnZXQgYSBjb3B5XG4gKiAgLSBuZXZlciByZWFkIGJleW9uZCBgcGFyYW1zLmxlbmd0aCAtIDFgIChsaWtlbHkgdG8gY29udGFpbiBhcmJpdHJhcnkgZGF0YSlcbiAqICAtIGAuZ2V0U3ViUGFyYW1zYCByZXR1cm5zIGEgYm9ycm93ZWQgdHlwZWQgYXJyYXksIHVzZSBgLmdldFN1YlBhcmFtc0FsbGAgZm9yIGNsb25lZCBzdWIgcGFyYW1zXG4gKiAgLSBoYXJkY29kZWQgbGltaXRhdGlvbnM6XG4gKiAgICAtIG1heC4gdmFsdWUgZm9yIGEgc2luZ2xlIChzdWIpIHBhcmFtIGlzIDJeMzEgLSAxIChncmVhdGVyIHZhbHVlcyBhcmUgY2xhbXBlZCB0byB0aGF0KVxuICogICAgLSBtYXguIDI1NiBzdWIgcGFyYW1zIHBvc3NpYmxlXG4gKiAgICAtIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbm90IGFsbG93ZWQgYmVzaWRlIC0xIChwbGFjZWhvbGRlciBmb3IgZGVmYXVsdCB2YWx1ZSlcbiAqXG4gKiBBYm91dCBaRE0gKFplcm8gRGVmYXVsdCBNb2RlKTpcbiAqIFpETSBpcyBub3Qgb3JjaGVzdHJhdGVkIGJ5IHRoaXMgY2xhc3MuIElmIHRoZSBwYXJzZXIgaXMgaW4gWkRNLFxuICogaXQgc2hvdWxkIGFkZCAwIGZvciBlbXB0eSBwYXJhbXMsIG90aGVyd2lzZSAtMS4gVGhpcyBkb2VzIG5vdCBhcHBseVxuICogdG8gc3VicGFyYW1zLCBlbXB0eSBzdWJwYXJhbXMgc2hvdWxkIGFsd2F5cyBiZSBhZGRlZCB3aXRoIC0xLlxuICovXG5leHBvcnQgY2xhc3MgUGFyYW1zIGltcGxlbWVudHMgSVBhcmFtcyB7XG4gIC8vIHBhcmFtcyBzdG9yZSBhbmQgbGVuZ3RoXG4gIHB1YmxpYyBwYXJhbXM6IEludDMyQXJyYXk7XG4gIHB1YmxpYyBsZW5ndGg6IG51bWJlcjtcblxuICAvLyBzdWIgcGFyYW1zIHN0b3JlIGFuZCBsZW5ndGhcbiAgcHJvdGVjdGVkIF9zdWJQYXJhbXM6IEludDMyQXJyYXk7XG4gIHByb3RlY3RlZCBfc3ViUGFyYW1zTGVuZ3RoOiBudW1iZXI7XG5cbiAgLy8gc3ViIHBhcmFtcyBvZmZzZXRzIGZyb20gcGFyYW06IHBhcmFtIGlkeCAtLT4gW3N0YXJ0LCBlbmRdIG9mZnNldFxuICBwcml2YXRlIF9zdWJQYXJhbXNJZHg6IFVpbnQxNkFycmF5O1xuICBwcml2YXRlIF9yZWplY3REaWdpdHM6IGJvb2xlYW47XG4gIHByaXZhdGUgX3JlamVjdFN1YkRpZ2l0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGlnaXRJc1N1YjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgYFBhcmFtc2AgdHlwZSBmcm9tIEpTIGFycmF5IHJlcHJlc2VudGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXJyYXkodmFsdWVzOiBQYXJhbXNBcnJheSk6IFBhcmFtcyB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFBhcmFtcygpO1xuICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgLy8gc2tpcCBsZWFkaW5nIHN1YiBwYXJhbXNcbiAgICBmb3IgKGxldCBpID0gKEFycmF5LmlzQXJyYXkodmFsdWVzWzBdKSkgPyAxIDogMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB2YWx1ZS5sZW5ndGg7ICsraykge1xuICAgICAgICAgIHBhcmFtcy5hZGRTdWJQYXJhbSh2YWx1ZVtrXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5hZGRQYXJhbSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG1heExlbmd0aCBtYXggbGVuZ3RoIG9mIHN0b3JhYmxlIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIG1heFN1YlBhcmFtc0xlbmd0aCBtYXggbGVuZ3RoIG9mIHN0b3JhYmxlIHN1YiBwYXJhbWV0ZXJzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgPSAzMiwgcHVibGljIG1heFN1YlBhcmFtc0xlbmd0aDogbnVtYmVyID0gMzIpIHtcbiAgICBpZiAobWF4U3ViUGFyYW1zTGVuZ3RoID4gTUFYX1NVQlBBUkFNUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXhTdWJQYXJhbXNMZW5ndGggbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIDI1NicpO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtcyA9IG5ldyBJbnQzMkFycmF5KG1heExlbmd0aCk7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3N1YlBhcmFtcyA9IG5ldyBJbnQzMkFycmF5KG1heFN1YlBhcmFtc0xlbmd0aCk7XG4gICAgdGhpcy5fc3ViUGFyYW1zTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zdWJQYXJhbXNJZHggPSBuZXcgVWludDE2QXJyYXkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLl9yZWplY3REaWdpdHMgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWplY3RTdWJEaWdpdHMgPSBmYWxzZTtcbiAgICB0aGlzLl9kaWdpdElzU3ViID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmUgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGNsb25lKCk6IFBhcmFtcyB7XG4gICAgY29uc3QgbmV3UGFyYW1zID0gbmV3IFBhcmFtcyh0aGlzLm1heExlbmd0aCwgdGhpcy5tYXhTdWJQYXJhbXNMZW5ndGgpO1xuICAgIG5ld1BhcmFtcy5wYXJhbXMuc2V0KHRoaXMucGFyYW1zKTtcbiAgICBuZXdQYXJhbXMubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgbmV3UGFyYW1zLl9zdWJQYXJhbXMuc2V0KHRoaXMuX3N1YlBhcmFtcyk7XG4gICAgbmV3UGFyYW1zLl9zdWJQYXJhbXNMZW5ndGggPSB0aGlzLl9zdWJQYXJhbXNMZW5ndGg7XG4gICAgbmV3UGFyYW1zLl9zdWJQYXJhbXNJZHguc2V0KHRoaXMuX3N1YlBhcmFtc0lkeCk7XG4gICAgbmV3UGFyYW1zLl9yZWplY3REaWdpdHMgPSB0aGlzLl9yZWplY3REaWdpdHM7XG4gICAgbmV3UGFyYW1zLl9yZWplY3RTdWJEaWdpdHMgPSB0aGlzLl9yZWplY3RTdWJEaWdpdHM7XG4gICAgbmV3UGFyYW1zLl9kaWdpdElzU3ViID0gdGhpcy5fZGlnaXRJc1N1YjtcbiAgICByZXR1cm4gbmV3UGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIEpTIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMgYW5kIHN1YiBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgYXJyYXkgaXMgc3RydWN0dXJlZCBhcyBmb2xsb3dzOlxuICAgKiAgICBzZXF1ZW5jZTogXCIxOzI6Mzo0OzU6OjZcIlxuICAgKiAgICBhcnJheSAgIDogWzEsIDIsIFszLCA0XSwgNSwgWy0xLCA2XV1cbiAgICovXG4gIHB1YmxpYyB0b0FycmF5KCk6IFBhcmFtc0FycmF5IHtcbiAgICBjb25zdCByZXM6IFBhcmFtc0FycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICByZXMucHVzaCh0aGlzLnBhcmFtc1tpXSk7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N1YlBhcmFtc0lkeFtpXSA+PiA4O1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5fc3ViUGFyYW1zSWR4W2ldICYgMHhGRjtcbiAgICAgIGlmIChlbmQgLSBzdGFydCA+IDApIHtcbiAgICAgICAgcmVzLnB1c2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fc3ViUGFyYW1zLCBzdGFydCwgZW5kKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdG8gaW5pdGlhbCBlbXB0eSBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fc3ViUGFyYW1zTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yZWplY3REaWdpdHMgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWplY3RTdWJEaWdpdHMgPSBmYWxzZTtcbiAgICB0aGlzLl9kaWdpdElzU3ViID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBgUGFyYW1zYCBvbmx5IHN0b3JlcyB1cCB0byBgbWF4TGVuZ3RoYCBwYXJhbWV0ZXJzLCBhbnkgbGF0ZXJcbiAgICogcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC5cbiAgICogTm90ZTogVlQgZGV2aWNlcyBvbmx5IHN0b3JlZCB1cCB0byAxNiB2YWx1ZXMsIHh0ZXJtIHNlZW1zIHRvXG4gICAqIHN0b3JlIHVwIHRvIDMwLlxuICAgKi9cbiAgcHVibGljIGFkZFBhcmFtKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWdpdElzU3ViID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubGVuZ3RoID49IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICB0aGlzLl9yZWplY3REaWdpdHMgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPCAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMgbGVzc2VyIHRoYW4gLTEgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgfVxuICAgIHRoaXMuX3N1YlBhcmFtc0lkeFt0aGlzLmxlbmd0aF0gPSB0aGlzLl9zdWJQYXJhbXNMZW5ndGggPDwgOCB8IHRoaXMuX3N1YlBhcmFtc0xlbmd0aDtcbiAgICB0aGlzLnBhcmFtc1t0aGlzLmxlbmd0aCsrXSA9IHZhbHVlID4gTUFYX1ZBTFVFID8gTUFYX1ZBTFVFIDogdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc3ViIHBhcmFtZXRlciB2YWx1ZS5cbiAgICogVGhlIHN1YiBwYXJhbWV0ZXIgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBUaHVzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBhZGQgYSBzdWJwYXJhbWV0ZXIgd2l0aG91dCBhbnkgcGFyYW1ldGVyIGFkZGVkIHlldC5cbiAgICogYFBhcmFtc2Agb25seSBzdG9yZXMgdXAgdG8gYHN1YlBhcmFtc0xlbmd0aGAgc3ViIHBhcmFtZXRlcnMsIGFueSBsYXRlclxuICAgKiBzdWIgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRTdWJQYXJhbSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGlnaXRJc1N1YiA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVqZWN0RGlnaXRzIHx8IHRoaXMuX3N1YlBhcmFtc0xlbmd0aCA+PSB0aGlzLm1heFN1YlBhcmFtc0xlbmd0aCkge1xuICAgICAgdGhpcy5fcmVqZWN0U3ViRGlnaXRzID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbHVlIDwgLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIGxlc3NlciB0aGFuIC0xIGFyZSBub3QgYWxsb3dlZCcpO1xuICAgIH1cbiAgICB0aGlzLl9zdWJQYXJhbXNbdGhpcy5fc3ViUGFyYW1zTGVuZ3RoKytdID0gdmFsdWUgPiBNQVhfVkFMVUUgPyBNQVhfVkFMVUUgOiB2YWx1ZTtcbiAgICB0aGlzLl9zdWJQYXJhbXNJZHhbdGhpcy5sZW5ndGggLSAxXSsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcGFyYW1ldGVyIGF0IGluZGV4IGBpZHhgIGhhcyBzdWIgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBoYXNTdWJQYXJhbXMoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKCh0aGlzLl9zdWJQYXJhbXNJZHhbaWR4XSAmIDB4RkYpIC0gKHRoaXMuX3N1YlBhcmFtc0lkeFtpZHhdID4+IDgpID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHN1YiBwYXJhbWV0ZXJzIGZvciBwYXJhbWV0ZXIgYXQgaW5kZXggYGlkeGAuXG4gICAqIE5vdGU6IFRoZSB2YWx1ZXMgYXJlIGJvcnJvd2VkLCB0aHVzIHlvdSBuZWVkIHRvIGNvcHlcbiAgICogdGhlIHZhbHVlcyBpZiB5b3UgbmVlZCB0byBob2xkIHRoZW0gaW4gbm9ubG9jYWwgc2NvcGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0U3ViUGFyYW1zKGlkeDogbnVtYmVyKTogSW50MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3ViUGFyYW1zSWR4W2lkeF0gPj4gODtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9zdWJQYXJhbXNJZHhbaWR4XSAmIDB4RkY7XG4gICAgaWYgKGVuZCAtIHN0YXJ0ID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1YlBhcmFtcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCBzdWIgcGFyYW1ldGVycyBhcyB7aWR4OiBzdWJwYXJhbXN9IG1hcHBpbmcuXG4gICAqIE5vdGU6IFRoZSB2YWx1ZXMgYXJlIG5vdCBib3Jyb3dlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWJQYXJhbXNBbGwoKToge1tpZHg6IG51bWJlcl06IEludDMyQXJyYXl9IHtcbiAgICBjb25zdCByZXN1bHQ6IHtbaWR4OiBudW1iZXJdOiBJbnQzMkFycmF5fSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9zdWJQYXJhbXNJZHhbaV0gPj4gODtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3N1YlBhcmFtc0lkeFtpXSAmIDB4RkY7XG4gICAgICBpZiAoZW5kIC0gc3RhcnQgPiAwKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHRoaXMuX3N1YlBhcmFtcy5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzaW5nbGUgZGlnaXQgdmFsdWUgdG8gY3VycmVudCBwYXJhbWV0ZXIuXG4gICAqIFRoaXMgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGFjY291bnQgZGlnaXRzIG9uIGEgY2hhciBieSBjaGFyIGJhc2lzLlxuICAgKi9cbiAgcHVibGljIGFkZERpZ2l0KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmICh0aGlzLl9yZWplY3REaWdpdHNcbiAgICAgIHx8ICEobGVuZ3RoID0gdGhpcy5fZGlnaXRJc1N1YiA/IHRoaXMuX3N1YlBhcmFtc0xlbmd0aCA6IHRoaXMubGVuZ3RoKVxuICAgICAgfHwgKHRoaXMuX2RpZ2l0SXNTdWIgJiYgdGhpcy5fcmVqZWN0U3ViRGlnaXRzKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5fZGlnaXRJc1N1YiA/IHRoaXMuX3N1YlBhcmFtcyA6IHRoaXMucGFyYW1zO1xuICAgIGNvbnN0IGN1ciA9IHN0b3JlW2xlbmd0aCAtIDFdO1xuICAgIHN0b3JlW2xlbmd0aCAtIDFdID0gfmN1ciA/IE1hdGgubWluKGN1ciAqIDEwICsgdmFsdWUsIE1BWF9WQUxVRSkgOiB2YWx1ZTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJVGVybWluYWxBZGRvbiwgSURpc3Bvc2FibGUsIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGludGVyZmFjZSBJTG9hZGVkQWRkb24ge1xuICBpbnN0YW5jZTogSVRlcm1pbmFsQWRkb247XG4gIGRpc3Bvc2U6ICgpID0+IHZvaWQ7XG4gIGlzRGlzcG9zZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBBZGRvbk1hbmFnZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfYWRkb25zOiBJTG9hZGVkQWRkb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLl9hZGRvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMuX2FkZG9uc1tpXS5pbnN0YW5jZS5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRBZGRvbih0ZXJtaW5hbDogVGVybWluYWwsIGluc3RhbmNlOiBJVGVybWluYWxBZGRvbik6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlZEFkZG9uOiBJTG9hZGVkQWRkb24gPSB7XG4gICAgICBpbnN0YW5jZSxcbiAgICAgIGRpc3Bvc2U6IGluc3RhbmNlLmRpc3Bvc2UsXG4gICAgICBpc0Rpc3Bvc2VkOiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5fYWRkb25zLnB1c2gobG9hZGVkQWRkb24pO1xuICAgIGluc3RhbmNlLmRpc3Bvc2UgPSAoKSA9PiB0aGlzLl93cmFwcGVkQWRkb25EaXNwb3NlKGxvYWRlZEFkZG9uKTtcbiAgICBpbnN0YW5jZS5hY3RpdmF0ZSh0ZXJtaW5hbCBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfd3JhcHBlZEFkZG9uRGlzcG9zZShsb2FkZWRBZGRvbjogSUxvYWRlZEFkZG9uKTogdm9pZCB7XG4gICAgaWYgKGxvYWRlZEFkZG9uLmlzRGlzcG9zZWQpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgaWYgYWxyZWFkeSBkaXNwb3NlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2FkZG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2FkZG9uc1tpXSA9PT0gbG9hZGVkQWRkb24pIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGlzcG9zZSBhbiBhZGRvbiB0aGF0IGhhcyBub3QgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG4gICAgbG9hZGVkQWRkb24uaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgbG9hZGVkQWRkb24uZGlzcG9zZS5hcHBseShsb2FkZWRBZGRvbi5pbnN0YW5jZSk7XG4gICAgdGhpcy5fYWRkb25zLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlciBhcyBJQnVmZmVyQXBpLCBJQnVmZmVyTGluZSBhcyBJQnVmZmVyTGluZUFwaSwgSUJ1ZmZlckNlbGwgYXMgSUJ1ZmZlckNlbGxBcGkgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgQnVmZmVyTGluZUFwaVZpZXcgfSBmcm9tICdjb21tb24vcHVibGljL0J1ZmZlckxpbmVBcGlWaWV3JztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5cbmV4cG9ydCBjbGFzcyBCdWZmZXJBcGlWaWV3IGltcGxlbWVudHMgSUJ1ZmZlckFwaSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2J1ZmZlcjogSUJ1ZmZlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogJ25vcm1hbCcgfCAnYWx0ZXJuYXRlJ1xuICApIHsgfVxuXG4gIHB1YmxpYyBpbml0KGJ1ZmZlcjogSUJ1ZmZlcik6IEJ1ZmZlckFwaVZpZXcge1xuICAgIHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3Vyc29yWSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyLnk7IH1cbiAgcHVibGljIGdldCBjdXJzb3JYKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9idWZmZXIueDsgfVxuICBwdWJsaWMgZ2V0IHZpZXdwb3J0WSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyLnlkaXNwOyB9XG4gIHB1YmxpYyBnZXQgYmFzZVkoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlci55YmFzZTsgfVxuICBwdWJsaWMgZ2V0IGxlbmd0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyLmxpbmVzLmxlbmd0aDsgfVxuICBwdWJsaWMgZ2V0TGluZSh5OiBudW1iZXIpOiBJQnVmZmVyTGluZUFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlci5saW5lcy5nZXQoeSk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpbmVBcGlWaWV3KGxpbmUpO1xuICB9XG4gIHB1YmxpYyBnZXROdWxsQ2VsbCgpOiBJQnVmZmVyQ2VsbEFwaSB7IHJldHVybiBuZXcgQ2VsbERhdGEoKTsgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyQ2VsbCBhcyBJQnVmZmVyQ2VsbEFwaSwgSUJ1ZmZlckxpbmUgYXMgSUJ1ZmZlckxpbmVBcGkgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY2xhc3MgQnVmZmVyTGluZUFwaVZpZXcgaW1wbGVtZW50cyBJQnVmZmVyTGluZUFwaSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xpbmU6IElCdWZmZXJMaW5lKSB7IH1cblxuICBwdWJsaWMgZ2V0IGlzV3JhcHBlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2xpbmUuaXNXcmFwcGVkOyB9XG4gIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9saW5lLmxlbmd0aDsgfVxuICBwdWJsaWMgZ2V0Q2VsbCh4OiBudW1iZXIsIGNlbGw/OiBJQnVmZmVyQ2VsbEFwaSk6IElCdWZmZXJDZWxsQXBpIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoeCA8IDAgfHwgeCA+PSB0aGlzLl9saW5lLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoY2VsbCkge1xuICAgICAgdGhpcy5fbGluZS5sb2FkQ2VsbCh4LCBjZWxsIGFzIElDZWxsRGF0YSk7XG4gICAgICByZXR1cm4gY2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xpbmUubG9hZENlbGwoeCwgbmV3IENlbGxEYXRhKCkpO1xuICB9XG4gIHB1YmxpYyB0cmFuc2xhdGVUb1N0cmluZyh0cmltUmlnaHQ/OiBib29sZWFuLCBzdGFydENvbHVtbj86IG51bWJlciwgZW5kQ29sdW1uPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZS50cmFuc2xhdGVUb1N0cmluZyh0cmltUmlnaHQsIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXIgYXMgSUJ1ZmZlckFwaSwgSUJ1ZmZlck5hbWVzcGFjZSBhcyBJQnVmZmVyTmFtZXNwYWNlQXBpIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEJ1ZmZlckFwaVZpZXcgfSBmcm9tICdjb21tb24vcHVibGljL0J1ZmZlckFwaVZpZXcnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQ29yZVRlcm1pbmFsIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZXhwb3J0IGNsYXNzIEJ1ZmZlck5hbWVzcGFjZUFwaSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQnVmZmVyTmFtZXNwYWNlQXBpIHtcbiAgcHJpdmF0ZSBfbm9ybWFsOiBCdWZmZXJBcGlWaWV3O1xuICBwcml2YXRlIF9hbHRlcm5hdGU6IEJ1ZmZlckFwaVZpZXc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25CdWZmZXJDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUJ1ZmZlckFwaT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkJ1ZmZlckNoYW5nZSA9IHRoaXMuX29uQnVmZmVyQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvcmU6IElDb3JlVGVybWluYWwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX25vcm1hbCA9IG5ldyBCdWZmZXJBcGlWaWV3KHRoaXMuX2NvcmUuYnVmZmVycy5ub3JtYWwsICdub3JtYWwnKTtcbiAgICB0aGlzLl9hbHRlcm5hdGUgPSBuZXcgQnVmZmVyQXBpVmlldyh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0LCAnYWx0ZXJuYXRlJyk7XG4gICAgdGhpcy5fY29yZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoKCkgPT4gdGhpcy5fb25CdWZmZXJDaGFuZ2UuZmlyZSh0aGlzLmFjdGl2ZSkpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IElCdWZmZXJBcGkge1xuICAgIGlmICh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWN0aXZlID09PSB0aGlzLl9jb3JlLmJ1ZmZlcnMubm9ybWFsKSB7IHJldHVybiB0aGlzLm5vcm1hbDsgfVxuICAgIGlmICh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWN0aXZlID09PSB0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0KSB7IHJldHVybiB0aGlzLmFsdGVybmF0ZTsgfVxuICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZlIGJ1ZmZlciBpcyBuZWl0aGVyIG5vcm1hbCBub3IgYWx0ZXJuYXRlJyk7XG4gIH1cbiAgcHVibGljIGdldCBub3JtYWwoKTogSUJ1ZmZlckFwaSB7XG4gICAgcmV0dXJuIHRoaXMuX25vcm1hbC5pbml0KHRoaXMuX2NvcmUuYnVmZmVycy5ub3JtYWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWx0ZXJuYXRlKCk6IElCdWZmZXJBcGkge1xuICAgIHJldHVybiB0aGlzLl9hbHRlcm5hdGUuaW5pdCh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJUGFyYW1zIH0gZnJvbSAnY29tbW9uL3BhcnNlci9UeXBlcyc7XG5pbXBvcnQgeyBJRGlzcG9zYWJsZSwgSUZ1bmN0aW9uSWRlbnRpZmllciwgSVBhcnNlciB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJQ29yZVRlcm1pbmFsIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFBhcnNlckFwaSBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb3JlOiBJQ29yZVRlcm1pbmFsKSB7IH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDc2lIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKHBhcmFtczogKG51bWJlciB8IG51bWJlcltdKVtdKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckNzaUhhbmRsZXIoaWQsIChwYXJhbXM6IElQYXJhbXMpID0+IGNhbGxiYWNrKHBhcmFtcy50b0FycmF5KCkpKTtcbiAgfVxuICBwdWJsaWMgYWRkQ3NpSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChwYXJhbXM6IChudW1iZXIgfCBudW1iZXJbXSlbXSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJDc2lIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyRGNzSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcsIHBhcmFtOiAobnVtYmVyIHwgbnVtYmVyW10pW10pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyRGNzSGFuZGxlcihpZCwgKGRhdGE6IHN0cmluZywgcGFyYW1zOiBJUGFyYW1zKSA9PiBjYWxsYmFjayhkYXRhLCBwYXJhbXMudG9BcnJheSgpKSk7XG4gIH1cbiAgcHVibGljIGFkZERjc0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nLCBwYXJhbTogKG51bWJlciB8IG51bWJlcltdKVtdKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlckRjc0hhbmRsZXIoaWQsIGNhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJFc2NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBoYW5kbGVyOiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckVzY0hhbmRsZXIoaWQsIGhhbmRsZXIpO1xuICB9XG4gIHB1YmxpYyBhZGRFc2NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBoYW5kbGVyOiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVzY0hhbmRsZXIoaWQsIGhhbmRsZXIpO1xuICB9XG4gIHB1YmxpYyByZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQ6IG51bWJlciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudCwgY2FsbGJhY2spO1xuICB9XG4gIHB1YmxpYyBhZGRPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQsIGNhbGxiYWNrKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29yZVRlcm1pbmFsIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElVbmljb2RlSGFuZGxpbmcsIElVbmljb2RlVmVyc2lvblByb3ZpZGVyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGNsYXNzIFVuaWNvZGVBcGkgaW1wbGVtZW50cyBJVW5pY29kZUhhbmRsaW5nIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29yZTogSUNvcmVUZXJtaW5hbCkgeyB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUudW5pY29kZVNlcnZpY2UucmVnaXN0ZXIocHJvdmlkZXIpO1xuICB9XG5cbiAgcHVibGljIGdldCB2ZXJzaW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUudW5pY29kZVNlcnZpY2UudmVyc2lvbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS51bmljb2RlU2VydmljZS5hY3RpdmVWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmVWZXJzaW9uKHZlcnNpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NvcmUudW5pY29kZVNlcnZpY2UuYWN0aXZlVmVyc2lvbiA9IHZlcnNpb247XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUJ1ZmZlckxpbmUsIFNjcm9sbFNvdXJjZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlclNldCc7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNvbnN0IE1JTklNVU1fQ09MUyA9IDI7IC8vIExlc3MgdGhhbiAyIGNhbiBtZXNzIHdpdGggd2lkZSBjaGFyc1xuZXhwb3J0IGNvbnN0IE1JTklNVU1fUk9XUyA9IDE7XG5cbmV4cG9ydCBjbGFzcyBCdWZmZXJTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElCdWZmZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHB1YmxpYyBjb2xzOiBudW1iZXI7XG4gIHB1YmxpYyByb3dzOiBudW1iZXI7XG4gIHB1YmxpYyBidWZmZXJzOiBJQnVmZmVyU2V0O1xuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBzY3JvbGxpbmcgKGxvY2tzIHRoZSBzY3JvbGwgcG9zaXRpb24pICovXG4gIHB1YmxpYyBpc1VzZXJTY3JvbGxpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlc2l6ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXNpemUgPSB0aGlzLl9vblJlc2l6ZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TY3JvbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2Nyb2xsID0gdGhpcy5fb25TY3JvbGwuZXZlbnQ7XG5cbiAgcHVibGljIGdldCBidWZmZXIoKTogSUJ1ZmZlciB7IHJldHVybiB0aGlzLmJ1ZmZlcnMuYWN0aXZlOyB9XG5cbiAgLyoqIEFuIElCdWZmZXJsaW5lIHRvIGNsb25lL2NvcHkgZnJvbSBmb3IgbmV3IGJsYW5rIGxpbmVzICovXG4gIHByaXZhdGUgX2NhY2hlZEJsYW5rTGluZTogSUJ1ZmZlckxpbmUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoQElPcHRpb25zU2VydmljZSBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbHMgPSBNYXRoLm1heChvcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmNvbHMgfHwgMCwgTUlOSU1VTV9DT0xTKTtcbiAgICB0aGlzLnJvd3MgPSBNYXRoLm1heChvcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnJvd3MgfHwgMCwgTUlOSU1VTV9ST1dTKTtcbiAgICB0aGlzLmJ1ZmZlcnMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBCdWZmZXJTZXQob3B0aW9uc1NlcnZpY2UsIHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHMgPSBjb2xzO1xuICAgIHRoaXMucm93cyA9IHJvd3M7XG4gICAgdGhpcy5idWZmZXJzLnJlc2l6ZShjb2xzLCByb3dzKTtcbiAgICAvLyBUT0RPOiBUaGlzIGRvZXNuJ3QgZmlyZSB3aGVuIHNjcm9sbGJhY2sgY2hhbmdlcyAtIGFkZCBhIHJlc2l6ZSBldmVudCB0byBCdWZmZXJTZXQgYW5kIGZvcndhcmRcbiAgICAvLyAgICAgICBldmVudFxuICAgIHRoaXMuX29uUmVzaXplLmZpcmUoeyBjb2xzLCByb3dzIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVycy5yZXNldCgpO1xuICAgIHRoaXMuaXNVc2VyU2Nyb2xsaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRoZSB0ZXJtaW5hbCBkb3duIDEgcm93LCBjcmVhdGluZyBhIGJsYW5rIGxpbmUuXG4gICAqIEBwYXJhbSBlcmFzZUF0dHIgVGhlIGF0dHJpYnV0ZSBkYXRhIHRvIHVzZSB0aGUgZm9yIGJsYW5rIGxpbmUuXG4gICAqIEBwYXJhbSBpc1dyYXBwZWQgV2hldGhlciB0aGUgbmV3IGxpbmUgaXMgd3JhcHBlZCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXG4gICAgbGV0IG5ld0xpbmU6IElCdWZmZXJMaW5lIHwgdW5kZWZpbmVkO1xuICAgIG5ld0xpbmUgPSB0aGlzLl9jYWNoZWRCbGFua0xpbmU7XG4gICAgaWYgKCFuZXdMaW5lIHx8IG5ld0xpbmUubGVuZ3RoICE9PSB0aGlzLmNvbHMgfHwgbmV3TGluZS5nZXRGZygwKSAhPT0gZXJhc2VBdHRyLmZnIHx8IG5ld0xpbmUuZ2V0QmcoMCkgIT09IGVyYXNlQXR0ci5iZykge1xuICAgICAgbmV3TGluZSA9IGJ1ZmZlci5nZXRCbGFua0xpbmUoZXJhc2VBdHRyLCBpc1dyYXBwZWQpO1xuICAgICAgdGhpcy5fY2FjaGVkQmxhbmtMaW5lID0gbmV3TGluZTtcbiAgICB9XG4gICAgbmV3TGluZS5pc1dyYXBwZWQgPSBpc1dyYXBwZWQ7XG5cbiAgICBjb25zdCB0b3BSb3cgPSBidWZmZXIueWJhc2UgKyBidWZmZXIuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IGJvdHRvbVJvdyA9IGJ1ZmZlci55YmFzZSArIGJ1ZmZlci5zY3JvbGxCb3R0b207XG5cbiAgICBpZiAoYnVmZmVyLnNjcm9sbFRvcCA9PT0gMCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBnb2luZyB0byBiZSB0cmltbWVkIGFmdGVyIGluc2VydGlvbi5cbiAgICAgIGNvbnN0IHdpbGxCdWZmZXJCZVRyaW1tZWQgPSBidWZmZXIubGluZXMuaXNGdWxsO1xuXG4gICAgICAvLyBJbnNlcnQgdGhlIGxpbmUgdXNpbmcgdGhlIGZhc3Rlc3QgbWV0aG9kXG4gICAgICBpZiAoYm90dG9tUm93ID09PSBidWZmZXIubGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAod2lsbEJ1ZmZlckJlVHJpbW1lZCkge1xuICAgICAgICAgIGJ1ZmZlci5saW5lcy5yZWN5Y2xlKCkuY29weUZyb20obmV3TGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmZmVyLmxpbmVzLnB1c2gobmV3TGluZS5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLmxpbmVzLnNwbGljZShib3R0b21Sb3cgKyAxLCAwLCBuZXdMaW5lLmNsb25lKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGFkanVzdCB5YmFzZSBhbmQgeWRpc3Agd2hlbiB0aGUgYnVmZmVyIGlzIG5vdCB0cmltbWVkXG4gICAgICBpZiAoIXdpbGxCdWZmZXJCZVRyaW1tZWQpIHtcbiAgICAgICAgYnVmZmVyLnliYXNlKys7XG4gICAgICAgIC8vIE9ubHkgc2Nyb2xsIHRoZSB5ZGlzcCB3aXRoIHliYXNlIGlmIHRoZSB1c2VyIGhhcyBub3Qgc2Nyb2xsZWQgdXBcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGluZykge1xuICAgICAgICAgIGJ1ZmZlci55ZGlzcCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgdGhlIHVzZXIgaGFzIHNjcm9sbGVkIHVwLCBrZWVwIHRoZSB0ZXh0XG4gICAgICAgIC8vIHN0YWJsZSB1bmxlc3MgeWRpc3AgaXMgcmlnaHQgYXQgdGhlIHRvcFxuICAgICAgICBpZiAodGhpcy5pc1VzZXJTY3JvbGxpbmcpIHtcbiAgICAgICAgICBidWZmZXIueWRpc3AgPSBNYXRoLm1heChidWZmZXIueWRpc3AgLSAxLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzY3JvbGxUb3AgaXMgbm9uLXplcm8gd2hpY2ggbWVhbnMgbm8gbGluZSB3aWxsIGJlIGdvaW5nIHRvIHRoZVxuICAgICAgLy8gc2Nyb2xsYmFjaywgaW5zdGVhZCB3ZSBjYW4ganVzdCBzaGlmdCB0aGVtIGluLXBsYWNlLlxuICAgICAgY29uc3Qgc2Nyb2xsUmVnaW9uSGVpZ2h0ID0gYm90dG9tUm93IC0gdG9wUm93ICsgMSAvKiBhcyBpdCdzIHplcm8tYmFzZWQgKi87XG4gICAgICBidWZmZXIubGluZXMuc2hpZnRFbGVtZW50cyh0b3BSb3cgKyAxLCBzY3JvbGxSZWdpb25IZWlnaHQgLSAxLCAtMSk7XG4gICAgICBidWZmZXIubGluZXMuc2V0KGJvdHRvbVJvdywgbmV3TGluZS5jbG9uZSgpKTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHRoZSB2aWV3cG9ydCB0byB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIgdW5sZXNzIHRoZSB1c2VyIGlzXG4gICAgLy8gc2Nyb2xsaW5nLlxuICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxpbmcpIHtcbiAgICAgIGJ1ZmZlci55ZGlzcCA9IGJ1ZmZlci55YmFzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9vblNjcm9sbC5maXJlKGJ1ZmZlci55ZGlzcCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRoZSBkaXNwbGF5IG9mIHRoZSB0ZXJtaW5hbFxuICAgKiBAcGFyYW0gZGlzcCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRvIHNjcm9sbCBkb3duIChuZWdhdGl2ZSBzY3JvbGwgdXApLlxuICAgKiBAcGFyYW0gc3VwcHJlc3NTY3JvbGxFdmVudCBEb24ndCBlbWl0IHRoZSBzY3JvbGwgZXZlbnQgYXMgc2Nyb2xsTGluZXMuIFRoaXMgaXMgdXNlZFxuICAgKiB0byBhdm9pZCB1bndhbnRlZCBldmVudHMgYmVpbmcgaGFuZGxlZCBieSB0aGUgdmlld3BvcnQgd2hlbiB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBmcm9tIHRoZVxuICAgKiB2aWV3cG9ydCBvcmlnaW5hbGx5LlxuICAgKi9cbiAgcHVibGljIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudD86IGJvb2xlYW4sIHNvdXJjZT86IFNjcm9sbFNvdXJjZSk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgIGlmIChkaXNwIDwgMCkge1xuICAgICAgaWYgKGJ1ZmZlci55ZGlzcCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzVXNlclNjcm9sbGluZyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNwICsgYnVmZmVyLnlkaXNwID49IGJ1ZmZlci55YmFzZSkge1xuICAgICAgdGhpcy5pc1VzZXJTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRZZGlzcCA9IGJ1ZmZlci55ZGlzcDtcbiAgICBidWZmZXIueWRpc3AgPSBNYXRoLm1heChNYXRoLm1pbihidWZmZXIueWRpc3AgKyBkaXNwLCBidWZmZXIueWJhc2UpLCAwKTtcblxuICAgIC8vIE5vIGNoYW5nZSBvY2N1cnJlZCwgZG9uJ3QgdHJpZ2dlciBzY3JvbGwvcmVmcmVzaFxuICAgIGlmIChvbGRZZGlzcCA9PT0gYnVmZmVyLnlkaXNwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzdXBwcmVzc1Njcm9sbEV2ZW50KSB7XG4gICAgICB0aGlzLl9vblNjcm9sbC5maXJlKGJ1ZmZlci55ZGlzcCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDaGFyc2V0U2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQ2hhcnNldCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDaGFyc2V0U2VydmljZSBpbXBsZW1lbnRzIElDaGFyc2V0U2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwdWJsaWMgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnbGV2ZWw6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfY2hhcnNldHM6IChJQ2hhcnNldCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJzZXQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2hhcnNldHMgPSBbXTtcbiAgICB0aGlzLmdsZXZlbCA9IDA7XG4gIH1cblxuICBwdWJsaWMgc2V0Z0xldmVsKGc6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ2xldmVsID0gZztcbiAgICB0aGlzLmNoYXJzZXQgPSB0aGlzLl9jaGFyc2V0c1tnXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhcnNldHNbZ10gPSBjaGFyc2V0O1xuICAgIGlmICh0aGlzLmdsZXZlbCA9PT0gZykge1xuICAgICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJQ29yZVNlcnZpY2UsIElDb3JlTW91c2VTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSUNvcmVNb3VzZVByb3RvY29sLCBJQ29yZU1vdXNlRXZlbnQsIENvcmVNb3VzZUVuY29kaW5nLCBDb3JlTW91c2VFdmVudFR5cGUsIENvcmVNb3VzZUJ1dHRvbiwgQ29yZU1vdXNlQWN0aW9uIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuLyoqXG4gKiBTdXBwb3J0ZWQgZGVmYXVsdCBwcm90b2NvbHMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJPVE9DT0xTOiB7IFtrZXk6IHN0cmluZ106IElDb3JlTW91c2VQcm90b2NvbCB9ID0ge1xuICAvKipcbiAgICogTk9ORVxuICAgKiBFdmVudHM6IG5vbmVcbiAgICogTW9kaWZpZXJzOiBub25lXG4gICAqL1xuICBOT05FOiB7XG4gICAgZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUuTk9ORSxcbiAgICByZXN0cmljdDogKCkgPT4gZmFsc2VcbiAgfSxcbiAgLyoqXG4gICAqIFgxMFxuICAgKiBFdmVudHM6IG1vdXNlZG93blxuICAgKiBNb2RpZmllcnM6IG5vbmVcbiAgICovXG4gIFgxMDoge1xuICAgIGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlLkRPV04sXG4gICAgcmVzdHJpY3Q6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIG5vIHdoZWVsLCBubyBtb3ZlLCBubyB1cFxuICAgICAgaWYgKGUuYnV0dG9uID09PSBDb3JlTW91c2VCdXR0b24uV0hFRUwgfHwgZS5hY3Rpb24gIT09IENvcmVNb3VzZUFjdGlvbi5ET1dOKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIG5vIG1vZGlmaWVyc1xuICAgICAgZS5jdHJsID0gZmFsc2U7XG4gICAgICBlLmFsdCA9IGZhbHNlO1xuICAgICAgZS5zaGlmdCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogVlQyMDBcbiAgICogRXZlbnRzOiBtb3VzZWRvd24gLyBtb3VzZXVwIC8gd2hlZWxcbiAgICogTW9kaWZpZXJzOiBhbGxcbiAgICovXG4gIFZUMjAwOiB7XG4gICAgZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUuRE9XTiB8IENvcmVNb3VzZUV2ZW50VHlwZS5VUCB8IENvcmVNb3VzZUV2ZW50VHlwZS5XSEVFTCxcbiAgICByZXN0cmljdDogKGU6IElDb3JlTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gbm8gbW92ZVxuICAgICAgaWYgKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uTU9WRSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBEUkFHXG4gICAqIEV2ZW50czogbW91c2Vkb3duIC8gbW91c2V1cCAvIHdoZWVsIC8gbW91c2VkcmFnXG4gICAqIE1vZGlmaWVyczogYWxsXG4gICAqL1xuICBEUkFHOiB7XG4gICAgZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUuRE9XTiB8IENvcmVNb3VzZUV2ZW50VHlwZS5VUCB8IENvcmVNb3VzZUV2ZW50VHlwZS5XSEVFTCB8IENvcmVNb3VzZUV2ZW50VHlwZS5EUkFHLFxuICAgIHJlc3RyaWN0OiAoZTogSUNvcmVNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBubyBtb3ZlIHdpdGhvdXQgYnV0dG9uXG4gICAgICBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5NT1ZFICYmIGUuYnV0dG9uID09PSBDb3JlTW91c2VCdXR0b24uTk9ORSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBBTllcbiAgICogRXZlbnRzOiBhbGwgbW91c2UgcmVsYXRlZCBldmVudHNcbiAgICogTW9kaWZpZXJzOiBhbGxcbiAgICovXG4gIEFOWToge1xuICAgIGV2ZW50czpcbiAgICAgIENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOIHwgQ29yZU1vdXNlRXZlbnRUeXBlLlVQIHwgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMXG4gICAgICB8IENvcmVNb3VzZUV2ZW50VHlwZS5EUkFHIHwgQ29yZU1vdXNlRXZlbnRUeXBlLk1PVkUsXG4gICAgcmVzdHJpY3Q6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHRydWVcbiAgfVxufTtcblxuY29uc3QgZW51bSBNb2RpZmllcnMge1xuICBTSElGVCA9IDQsXG4gIEFMVCA9IDgsXG4gIENUUkwgPSAxNlxufVxuXG4vLyBoZWxwZXIgZm9yIGRlZmF1bHQgZW5jb2RlcnMgdG8gZ2VuZXJhdGUgdGhlIGV2ZW50IGNvZGUuXG5mdW5jdGlvbiBldmVudENvZGUoZTogSUNvcmVNb3VzZUV2ZW50LCBpc1NHUjogYm9vbGVhbik6IG51bWJlciB7XG4gIGxldCBjb2RlID0gKGUuY3RybCA/IE1vZGlmaWVycy5DVFJMIDogMCkgfCAoZS5zaGlmdCA/IE1vZGlmaWVycy5TSElGVCA6IDApIHwgKGUuYWx0ID8gTW9kaWZpZXJzLkFMVCA6IDApO1xuICBpZiAoZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCkge1xuICAgIGNvZGUgfD0gNjQ7XG4gICAgY29kZSB8PSBlLmFjdGlvbjtcbiAgfSBlbHNlIHtcbiAgICBjb2RlIHw9IGUuYnV0dG9uICYgMztcbiAgICBpZiAoZS5idXR0b24gJiA0KSB7XG4gICAgICBjb2RlIHw9IDY0O1xuICAgIH1cbiAgICBpZiAoZS5idXR0b24gJiA4KSB7XG4gICAgICBjb2RlIHw9IDEyODtcbiAgICB9XG4gICAgaWYgKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uTU9WRSkge1xuICAgICAgY29kZSB8PSBDb3JlTW91c2VBY3Rpb24uTU9WRTtcbiAgICB9IGVsc2UgaWYgKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uVVAgJiYgIWlzU0dSKSB7XG4gICAgICAvLyBzcGVjaWFsIGNhc2UgLSBvbmx5IFNHUiBjYW4gcmVwb3J0IGJ1dHRvbiBvbiByZWxlYXNlXG4gICAgICAvLyBhbGwgb3RoZXJzIGhhdmUgdG8gZ28gd2l0aCBOT05FXG4gICAgICBjb2RlIHw9IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29kZTtcbn1cblxuY29uc3QgUyA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbi8qKlxuICogU3VwcG9ydGVkIGRlZmF1bHQgZW5jb2RpbmdzLlxuICovXG5jb25zdCBERUZBVUxUX0VOQ09ESU5HUzogeyBba2V5OiBzdHJpbmddOiBDb3JlTW91c2VFbmNvZGluZyB9ID0ge1xuICAvKipcbiAgICogREVGQVVMVCAtIENTSSBNIFBiIFB4IFB5XG4gICAqIFNpbmdsZSBieXRlIGVuY29kaW5nIGZvciBjb29yZHMgYW5kIGV2ZW50IGNvZGUuXG4gICAqIENhbiBlbmNvZGUgdmFsdWVzIHVwIHRvIDIyMyAoMS1iYXNlZCkuXG4gICAqL1xuICBERUZBVUxUOiAoZTogSUNvcmVNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gW2V2ZW50Q29kZShlLCBmYWxzZSkgKyAzMiwgZS5jb2wgKyAzMiwgZS5yb3cgKyAzMl07XG4gICAgLy8gc3VwcmVzcyBtb3VzZSByZXBvcnQgaWYgd2UgZXhjZWVkIGFkZHJlc3NpYmxlIHJhbmdlXG4gICAgLy8gTm90ZSB0aGlzIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgYnkgZW11bGF0b3JzXG4gICAgLy8gLSB4dGVybTogICAgICAgICBzZW5kcyAwOzAgY29vcmRzIGluc3RlYWRcbiAgICAvLyAtIHZ0ZSwga29uc29sZTogIG5vIHJlcG9ydFxuICAgIGlmIChwYXJhbXNbMF0gPiAyNTUgfHwgcGFyYW1zWzFdID4gMjU1IHx8IHBhcmFtc1syXSA+IDI1NSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYFxceDFiW00ke1MocGFyYW1zWzBdKX0ke1MocGFyYW1zWzFdKX0ke1MocGFyYW1zWzJdKX1gO1xuICB9LFxuICAvKipcbiAgICogU0dSIC0gQ1NJIDwgUGIgOyBQeCA7IFB5IE18bVxuICAgKiBObyBlbmNvZGluZyBsaW1pdGF0aW9uLlxuICAgKiBDYW4gcmVwb3J0IGJ1dHRvbiBvbiByZWxlYXNlIGFuZCB3b3JrcyB3aXRoIGEgd2VsbCBmb3JtZWQgc2VxdWVuY2UuXG4gICAqL1xuICBTR1I6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBmaW5hbCA9IChlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLlVQICYmIGUuYnV0dG9uICE9PSBDb3JlTW91c2VCdXR0b24uV0hFRUwpID8gJ20nIDogJ00nO1xuICAgIHJldHVybiBgXFx4MWJbPCR7ZXZlbnRDb2RlKGUsIHRydWUpfTske2UuY29sfTske2Uucm93fSR7ZmluYWx9YDtcbiAgfSxcbiAgU0dSX1BJWEVMUzogKGU6IElDb3JlTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsID0gKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uVVAgJiYgZS5idXR0b24gIT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCkgPyAnbScgOiAnTSc7XG4gICAgcmV0dXJuIGBcXHgxYls8JHtldmVudENvZGUoZSwgdHJ1ZSl9OyR7ZS54fTske2UueX0ke2ZpbmFsfWA7XG4gIH1cbn07XG5cbi8qKlxuICogQ29yZU1vdXNlU2VydmljZVxuICpcbiAqIFByb3ZpZGVzIG1vdXNlIHRyYWNraW5nIHJlcG9ydHMgd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2xzIGFuZCBlbmNvZGluZ3MuXG4gKiAgLSBwcm90b2NvbHM6IE5PTkUgKGRlZmF1bHQpLCBYMTAsIFZUMjAwLCBEUkFHLCBBTllcbiAqICAtIGVuY29kaW5nczogREVGQVVMVCwgU0dSIChVVEY4LCBVUlhWVCByZW1vdmVkIGluICMyNTA3KVxuICpcbiAqIEN1c3RvbSBwcm90b2NvbHMvZW5jb2RpbmdzIGNhbiBiZSBhZGRlZCBieSBgYWRkUHJvdG9jb2xgIC8gYGFkZEVuY29kaW5nYC5cbiAqIFRvIGFjdGl2YXRlIGEgcHJvdG9jb2wvZW5jb2RpbmcsIHNldCBgYWN0aXZlUHJvdG9jb2xgIC8gYGFjdGl2ZUVuY29kaW5nYC5cbiAqIFN3aXRjaGluZyBhIHByb3RvY29sIHdpbGwgc2VuZCBhIG5vdGlmaWNhdGlvbiBldmVudCBgb25Qcm90b2NvbENoYW5nZWBcbiAqIHdpdGggYSBsaXN0IG9mIG5lZWRlZCBldmVudHMgdG8gdHJhY2suXG4gKlxuICogVGhlIHNlcnZpY2UgaGFuZGxlcyB0aGUgbW91c2UgdHJhY2tpbmcgc3RhdGUgYW5kIGRlY2lkZXMgd2hldGhlciB0byBzZW5kXG4gKiBhIHRyYWNraW5nIHJlcG9ydCB0byB0aGUgYmFja2VuZCBiYXNlZCBvbiBwcm90b2NvbCBhbmQgZW5jb2RpbmcgbGltaXRhdGlvbnMuXG4gKiBUbyBzZW5kIGEgbW91c2UgZXZlbnQgY2FsbCBgdHJpZ2dlck1vdXNlRXZlbnRgLlxuICovXG5leHBvcnQgY2xhc3MgQ29yZU1vdXNlU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ29yZU1vdXNlU2VydmljZSB7XG4gIHByaXZhdGUgX3Byb3RvY29sczogeyBbbmFtZTogc3RyaW5nXTogSUNvcmVNb3VzZVByb3RvY29sIH0gPSB7fTtcbiAgcHJpdmF0ZSBfZW5jb2RpbmdzOiB7IFtuYW1lOiBzdHJpbmddOiBDb3JlTW91c2VFbmNvZGluZyB9ID0ge307XG4gIHByaXZhdGUgX2FjdGl2ZVByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aXZlRW5jb2Rpbmc6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9sYXN0RXZlbnQ6IElDb3JlTW91c2VFdmVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUHJvdG9jb2xDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8Q29yZU1vdXNlRXZlbnRUeXBlPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUHJvdG9jb2xDaGFuZ2UgPSAgdGhpcy5fb25Qcm90b2NvbENoYW5nZS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElDb3JlU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gcmVnaXN0ZXIgZGVmYXVsdCBwcm90b2NvbHMgYW5kIGVuY29kaW5nc1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhERUZBVUxUX1BST1RPQ09MUykpIHRoaXMuYWRkUHJvdG9jb2wobmFtZSwgREVGQVVMVF9QUk9UT0NPTFNbbmFtZV0pO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhERUZBVUxUX0VOQ09ESU5HUykpIHRoaXMuYWRkRW5jb2RpbmcobmFtZSwgREVGQVVMVF9FTkNPRElOR1NbbmFtZV0pO1xuICAgIC8vIGNhbGwgcmVzZXQgdG8gc2V0IGRlZmF1bHRzXG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQge1xuICAgIHRoaXMuX3Byb3RvY29sc1tuYW1lXSA9IHByb3RvY29sO1xuICB9XG5cbiAgcHVibGljIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZW5jb2RpbmdzW25hbWVdID0gZW5jb2Rpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZVByb3RvY29sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVByb3RvY29sO1xuICB9XG5cbiAgcHVibGljIGdldCBhcmVNb3VzZUV2ZW50c0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2xzW3RoaXMuX2FjdGl2ZVByb3RvY29sXS5ldmVudHMgIT09IDA7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZVByb3RvY29sKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5fcHJvdG9jb2xzW25hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gcHJvdG9jb2wgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlUHJvdG9jb2wgPSBuYW1lO1xuICAgIHRoaXMuX29uUHJvdG9jb2xDaGFuZ2UuZmlyZSh0aGlzLl9wcm90b2NvbHNbbmFtZV0uZXZlbnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRW5jb2RpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRW5jb2Rpbmc7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZUVuY29kaW5nKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5fZW5jb2RpbmdzW25hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gZW5jb2RpbmcgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlRW5jb2RpbmcgPSBuYW1lO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUHJvdG9jb2wgPSAnTk9ORSc7XG4gICAgdGhpcy5hY3RpdmVFbmNvZGluZyA9ICdERUZBVUxUJztcbiAgICB0aGlzLl9sYXN0RXZlbnQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbW91c2UgZXZlbnQgdG8gYmUgc2VudC5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBwYXNzZWQgYWxsIHByb3RvY29sIHJlc3RyaWN0aW9ucyBhbmQgYSByZXBvcnRcbiAgICogd2FzIHNlbnQsIG90aGVyd2lzZSBmYWxzZS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlclxuICAgKiB0aGUgZGVmYXVsdCBldmVudCBhY3Rpb24gaW4gdGhlIGJvd3NlciBjb21wb25lbnQgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBtZXRob2Qgd2lsbCBjaGFuZ2UgdmFsdWVzIG9mIHRoZSBnaXZlbiBldmVudCBvYmplY3RcbiAgICogdG8gZnVsbGZpbGwgcHJvdG9jb2wgYW5kIGVuY29kaW5nIHJlc3RyaWN0aW9ucy5cbiAgICovXG4gIHB1YmxpYyB0cmlnZ2VyTW91c2VFdmVudChlOiBJQ29yZU1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyByYW5nZSBjaGVjayBmb3IgY29sL3Jvd1xuICAgIGlmIChlLmNvbCA8IDAgfHwgZS5jb2wgPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzXG4gICAgICB8fCBlLnJvdyA8IDAgfHwgZS5yb3cgPj0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG5vbnNlbnNlIGNvbWJpbmF0aW9ucyBvZiBidXR0b24gKyBhY3Rpb25cbiAgICBpZiAoZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCAmJiBlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLk1PVkUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUuYnV0dG9uID09PSBDb3JlTW91c2VCdXR0b24uTk9ORSAmJiBlLmFjdGlvbiAhPT0gQ29yZU1vdXNlQWN0aW9uLk1PVkUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUuYnV0dG9uICE9PSBDb3JlTW91c2VCdXR0b24uV0hFRUwgJiYgKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uTEVGVCB8fCBlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLlJJR0hUKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHJlcG9ydCAxLWJhc2VkIGNvb3Jkc1xuICAgIGUuY29sKys7XG4gICAgZS5yb3crKztcblxuICAgIC8vIGRlYm91bmNlIG1vdmUgZXZlbnRzIGF0IGdyaWQgb3IgcGl4ZWwgbGV2ZWxcbiAgICBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5NT1ZFXG4gICAgICAmJiB0aGlzLl9sYXN0RXZlbnRcbiAgICAgICYmIHRoaXMuX2VxdWFsRXZlbnRzKHRoaXMuX2xhc3RFdmVudCwgZSwgdGhpcy5fYWN0aXZlRW5jb2RpbmcgPT09ICdTR1JfUElYRUxTJylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBwcm90b2NvbCByZXN0cmljdGlvbnNcbiAgICBpZiAoIXRoaXMuX3Byb3RvY29sc1t0aGlzLl9hY3RpdmVQcm90b2NvbF0ucmVzdHJpY3QoZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBlbmNvZGUgcmVwb3J0IGFuZCBzZW5kXG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZW5jb2RpbmdzW3RoaXMuX2FjdGl2ZUVuY29kaW5nXShlKTtcbiAgICBpZiAocmVwb3J0KSB7XG4gICAgICAvLyBhbHdheXMgc2VuZCBERUZBVUxUIGFzIGJpbmFyeSBkYXRhXG4gICAgICBpZiAodGhpcy5fYWN0aXZlRW5jb2RpbmcgPT09ICdERUZBVUxUJykge1xuICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyQmluYXJ5RXZlbnQocmVwb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQocmVwb3J0LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0RXZlbnQgPSBlO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZXhwbGFpbkV2ZW50cyhldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZSk6IHsgW2V2ZW50OiBzdHJpbmddOiBib29sZWFuIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBkb3duOiAhIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuRE9XTiksXG4gICAgICB1cDogISEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLlVQKSxcbiAgICAgIGRyYWc6ICEhKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5EUkFHKSxcbiAgICAgIG1vdmU6ICEhKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5NT1ZFKSxcbiAgICAgIHdoZWVsOiAhIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuV0hFRUwpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VxdWFsRXZlbnRzKGUxOiBJQ29yZU1vdXNlRXZlbnQsIGUyOiBJQ29yZU1vdXNlRXZlbnQsIHBpeGVsczogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmIChwaXhlbHMpIHtcbiAgICAgIGlmIChlMS54ICE9PSBlMi54KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZTEueSAhPT0gZTIueSkgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZTEuY29sICE9PSBlMi5jb2wpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChlMS5yb3cgIT09IGUyLnJvdykgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZTEuYnV0dG9uICE9PSBlMi5idXR0b24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZTEuYWN0aW9uICE9PSBlMi5hY3Rpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZTEuY3RybCAhPT0gZTIuY3RybCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlMS5hbHQgIT09IGUyLmFsdCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlMS5zaGlmdCAhPT0gZTIuc2hpZnQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ2NvbW1vbi9DbG9uZSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElNb2RlcyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSUNvcmVTZXJ2aWNlLCBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgREVGQVVMVF9NT0RFUzogSU1vZGVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGluc2VydE1vZGU6IGZhbHNlXG59KTtcblxuY29uc3QgREVGQVVMVF9ERUNfUFJJVkFURV9NT0RFUzogSURlY1ByaXZhdGVNb2RlcyA9IE9iamVjdC5mcmVlemUoe1xuICBhcHBsaWNhdGlvbkN1cnNvcktleXM6IGZhbHNlLFxuICBhcHBsaWNhdGlvbktleXBhZDogZmFsc2UsXG4gIGJyYWNrZXRlZFBhc3RlTW9kZTogZmFsc2UsXG4gIG9yaWdpbjogZmFsc2UsXG4gIHJldmVyc2VXcmFwYXJvdW5kOiBmYWxzZSxcbiAgc2VuZEZvY3VzOiBmYWxzZSxcbiAgd3JhcGFyb3VuZDogdHJ1ZSAvLyBkZWZhdWx0czogeHRlcm0gLSB0cnVlLCB2dDEwMCAtIGZhbHNlXG59KTtcblxuZXhwb3J0IGNsYXNzIENvcmVTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElDb3JlU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwdWJsaWMgaXNDdXJzb3JJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNDdXJzb3JIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG1vZGVzOiBJTW9kZXM7XG4gIHB1YmxpYyBkZWNQcml2YXRlTW9kZXM6IElEZWNQcml2YXRlTW9kZXM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EYXRhID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRhdGEgPSB0aGlzLl9vbkRhdGEuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uVXNlcklucHV0ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Vc2VySW5wdXQgPSB0aGlzLl9vblVzZXJJbnB1dC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25CaW5hcnkgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQmluYXJ5ID0gdGhpcy5fb25CaW5hcnkuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFNjcm9sbFRvQm90dG9tID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20gPSB0aGlzLl9vblJlcXVlc3RTY3JvbGxUb0JvdHRvbS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElMb2dTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1NlcnZpY2U6IElMb2dTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubW9kZXMgPSBjbG9uZShERUZBVUxUX01PREVTKTtcbiAgICB0aGlzLmRlY1ByaXZhdGVNb2RlcyA9IGNsb25lKERFRkFVTFRfREVDX1BSSVZBVEVfTU9ERVMpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZXMgPSBjbG9uZShERUZBVUxUX01PREVTKTtcbiAgICB0aGlzLmRlY1ByaXZhdGVNb2RlcyA9IGNsb25lKERFRkFVTFRfREVDX1BSSVZBVEVfTU9ERVMpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJEYXRhRXZlbnQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIFByZXZlbnRzIGFsbCBldmVudHMgdG8gcHR5IHByb2Nlc3MgaWYgc3RkaW4gaXMgZGlzYWJsZWRcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kaXNhYmxlU3RkaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbnB1dCBpcyBiZWluZyBzZW50IHRvIHRoZSB0ZXJtaW5hbCwgdGhlIHRlcm1pbmFsIHNob3VsZCBmb2N1cyB0aGUgcHJvbXB0LlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGlmICh3YXNVc2VySW5wdXQgJiYgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JvbGxPblVzZXJJbnB1dCAmJiBidWZmZXIueWJhc2UgIT09IGJ1ZmZlci55ZGlzcCkge1xuICAgICAgdGhpcy5fb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20uZmlyZSgpO1xuICAgIH1cblxuICAgIC8vIEZpcmUgb25Vc2VySW5wdXQgc28gbGlzdGVuZXJzIGNhbiByZWFjdCBhcyB3ZWxsIChlZy4gY2xlYXIgc2VsZWN0aW9uKVxuICAgIGlmICh3YXNVc2VySW5wdXQpIHtcbiAgICAgIHRoaXMuX29uVXNlcklucHV0LmZpcmUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIG9uRGF0YSBBUElcbiAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKGBzZW5kaW5nIGRhdGEgXCIke2RhdGF9XCJgLCAoKSA9PiBkYXRhLnNwbGl0KCcnKS5tYXAoZSA9PiBlLmNoYXJDb2RlQXQoMCkpKTtcbiAgICB0aGlzLl9vbkRhdGEuZmlyZShkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyQmluYXJ5RXZlbnQoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZGlzYWJsZVN0ZGluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoYHNlbmRpbmcgYmluYXJ5IFwiJHtkYXRhfVwiYCwgKCkgPT4gZGF0YS5zcGxpdCgnJykubWFwKGUgPT4gZS5jaGFyQ29kZUF0KDApKSk7XG4gICAgdGhpcy5fb25CaW5hcnkuZmlyZShkYXRhKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBjc3MgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEZWNvcmF0aW9uU2VydmljZSwgSUludGVybmFsRGVjb3JhdGlvbiB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBTb3J0ZWRMaXN0IH0gZnJvbSAnY29tbW9uL1NvcnRlZExpc3QnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElEZWNvcmF0aW9uLCBJRGVjb3JhdGlvbk9wdGlvbnMsIElNYXJrZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkeG1pbiA9IDA7XG5sZXQgJHhtYXggPSAwO1xuXG5leHBvcnQgY2xhc3MgRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSURlY29yYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgYWxsIGRlY29yYXRpb25zLCBzb3J0ZWQgYnkgdGhlIG1hcmtlcidzIGxpbmUgdmFsdWUuIFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXRcbiAgICogd2hpbGUgbWFya2VyIGxpbmUgdmFsdWVzIGRvIGNoYW5nZSwgdGhleSBzaG91bGQgYWxsIGNoYW5nZSBieSB0aGUgc2FtZSBhbW91bnQgc28gdGhpcyBzaG91bGRcbiAgICogbmV2ZXIgYmVjb21lIG91dCBvZiBvcmRlci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25zOiBTb3J0ZWRMaXN0PElJbnRlcm5hbERlY29yYXRpb24+ID0gbmV3IFNvcnRlZExpc3QoZSA9PiBlPy5tYXJrZXIubGluZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EZWNvcmF0aW9uUmVnaXN0ZXJlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJSW50ZXJuYWxEZWNvcmF0aW9uPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlZ2lzdGVyZWQgPSB0aGlzLl9vbkRlY29yYXRpb25SZWdpc3RlcmVkLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlY29yYXRpb25SZW1vdmVkID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElJbnRlcm5hbERlY29yYXRpb24+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVtb3ZlZCA9IHRoaXMuX29uRGVjb3JhdGlvblJlbW92ZWQuZXZlbnQ7XG5cbiAgcHVibGljIGdldCBkZWNvcmF0aW9ucygpOiBJdGVyYWJsZUl0ZXJhdG9yPElJbnRlcm5hbERlY29yYXRpb24+IHsgcmV0dXJuIHRoaXMuX2RlY29yYXRpb25zLnZhbHVlcygpOyB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHRoaXMucmVzZXQoKSkpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyRGVjb3JhdGlvbihvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9wdGlvbnMubWFya2VyLmlzRGlzcG9zZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGRlY29yYXRpb24gPSBuZXcgRGVjb3JhdGlvbihvcHRpb25zKTtcbiAgICBpZiAoZGVjb3JhdGlvbikge1xuICAgICAgY29uc3QgbWFya2VyRGlzcG9zZSA9IGRlY29yYXRpb24ubWFya2VyLm9uRGlzcG9zZSgoKSA9PiBkZWNvcmF0aW9uLmRpc3Bvc2UoKSk7XG4gICAgICBkZWNvcmF0aW9uLm9uRGlzcG9zZSgoKSA9PiB7XG4gICAgICAgIGlmIChkZWNvcmF0aW9uKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RlY29yYXRpb25zLmRlbGV0ZShkZWNvcmF0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5fb25EZWNvcmF0aW9uUmVtb3ZlZC5maXJlKGRlY29yYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXJrZXJEaXNwb3NlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9kZWNvcmF0aW9ucy5pbnNlcnQoZGVjb3JhdGlvbik7XG4gICAgICB0aGlzLl9vbkRlY29yYXRpb25SZWdpc3RlcmVkLmZpcmUoZGVjb3JhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBkZWNvcmF0aW9uO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZCBvZiB0aGlzLl9kZWNvcmF0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgZC5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX2RlY29yYXRpb25zLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgKmdldERlY29yYXRpb25zQXRDZWxsKHg6IG51bWJlciwgbGluZTogbnVtYmVyLCBsYXllcj86ICdib3R0b20nIHwgJ3RvcCcpOiBJdGVyYWJsZUl0ZXJhdG9yPElJbnRlcm5hbERlY29yYXRpb24+IHtcbiAgICBsZXQgeG1pbiA9IDA7XG4gICAgbGV0IHhtYXggPSAwO1xuICAgIGZvciAoY29uc3QgZCBvZiB0aGlzLl9kZWNvcmF0aW9ucy5nZXRLZXlJdGVyYXRvcihsaW5lKSkge1xuICAgICAgeG1pbiA9IGQub3B0aW9ucy54ID8/IDA7XG4gICAgICB4bWF4ID0geG1pbiArIChkLm9wdGlvbnMud2lkdGggPz8gMSk7XG4gICAgICBpZiAoeCA+PSB4bWluICYmIHggPCB4bWF4ICYmICghbGF5ZXIgfHwgKGQub3B0aW9ucy5sYXllciA/PyAnYm90dG9tJykgPT09IGxheWVyKSkge1xuICAgICAgICB5aWVsZCBkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2RlY29yYXRpb25zLmZvckVhY2hCeUtleShsaW5lLCBkID0+IHtcbiAgICAgICR4bWluID0gZC5vcHRpb25zLnggPz8gMDtcbiAgICAgICR4bWF4ID0gJHhtaW4gKyAoZC5vcHRpb25zLndpZHRoID8/IDEpO1xuICAgICAgaWYgKHggPj0gJHhtaW4gJiYgeCA8ICR4bWF4ICYmICghbGF5ZXIgfHwgKGQub3B0aW9ucy5sYXllciA/PyAnYm90dG9tJykgPT09IGxheWVyKSkge1xuICAgICAgICBjYWxsYmFjayhkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBEZWNvcmF0aW9uIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElJbnRlcm5hbERlY29yYXRpb24ge1xuICBwdWJsaWMgcmVhZG9ubHkgbWFya2VyOiBJTWFya2VyO1xuICBwdWJsaWMgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQgaXNEaXNwb3NlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQ7IH1cblxuICBwdWJsaWMgcmVhZG9ubHkgb25SZW5kZXJFbWl0dGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVuZGVyID0gdGhpcy5vblJlbmRlckVtaXR0ZXIuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGlzcG9zZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGlzcG9zZSA9IHRoaXMuX29uRGlzcG9zZS5ldmVudDtcblxuICBwcml2YXRlIF9jYWNoZWRCZzogSUNvbG9yIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yUkdCKCk6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZEJnID09PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLl9jYWNoZWRCZyA9IGNzcy50b0NvbG9yKHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkQmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRCZztcbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlZEZnOiBJQ29sb3IgfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGdldCBmb3JlZ3JvdW5kQ29sb3JSR0IoKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkRmcgPT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9yZWdyb3VuZENvbG9yKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZEZnID0gY3NzLnRvQ29sb3IodGhpcy5vcHRpb25zLmZvcmVncm91bmRDb2xvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWNoZWRGZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZEZnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWFya2VyID0gb3B0aW9ucy5tYXJrZXI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucyAmJiAhdGhpcy5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICB0aGlzLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24gPSAnZnVsbCc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fb25EaXNwb3NlLmZpcmUoKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogVGhpcyB3YXMgaGVhdmlseSBpbnNwaXJlZCBmcm9tIG1pY3Jvc29mdC92c2NvZGUncyBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0gKE1JVCkuXG4gKi9cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJSW5zdGFudGlhdGlvblNlcnZpY2UsIElTZXJ2aWNlSWRlbnRpZmllciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQ29sbGVjdGlvbiB7XG5cbiAgcHJpdmF0ZSBfZW50cmllcyA9IG5ldyBNYXA8SVNlcnZpY2VJZGVudGlmaWVyPGFueT4sIGFueT4oKTtcblxuICBjb25zdHJ1Y3RvciguLi5lbnRyaWVzOiBbSVNlcnZpY2VJZGVudGlmaWVyPGFueT4sIGFueV1bXSkge1xuICAgIGZvciAoY29uc3QgW2lkLCBzZXJ2aWNlXSBvZiBlbnRyaWVzKSB7XG4gICAgICB0aGlzLnNldChpZCwgc2VydmljZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldDxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IFQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2VudHJpZXMuZ2V0KGlkKTtcbiAgICB0aGlzLl9lbnRyaWVzLnNldChpZCwgaW5zdGFuY2UpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZm9yRWFjaChjYWxsYmFjazogKGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5zdGFuY2U6IGFueSkgPT4gYW55KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNhbGxiYWNrKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXMoaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuaGFzKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzLmdldChpZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluc3RhbnRpYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgSUluc3RhbnRpYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlcnZpY2VzOiBTZXJ2aWNlQ29sbGVjdGlvbiA9IG5ldyBTZXJ2aWNlQ29sbGVjdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzLnNldChJSW5zdGFudGlhdGlvblNlcnZpY2UsIHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHNldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiwgaW5zdGFuY2U6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlcy5zZXQoaWQsIGluc3RhbmNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmljZXMuZ2V0KGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVJbnN0YW5jZTxUPihjdG9yOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgY29uc3Qgc2VydmljZURlcGVuZGVuY2llcyA9IGdldFNlcnZpY2VEZXBlbmRlbmNpZXMoY3Rvcikuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgY29uc3Qgc2VydmljZUFyZ3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHNlcnZpY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLl9zZXJ2aWNlcy5nZXQoZGVwZW5kZW5jeS5pZCk7XG4gICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbY3JlYXRlSW5zdGFuY2VdICR7Y3Rvci5uYW1lfSBkZXBlbmRzIG9uIFVOS05PV04gc2VydmljZSAke2RlcGVuZGVuY3kuaWR9LmApO1xuICAgICAgfVxuICAgICAgc2VydmljZUFyZ3MucHVzaChzZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFNlcnZpY2VBcmdQb3MgPSBzZXJ2aWNlRGVwZW5kZW5jaWVzLmxlbmd0aCA+IDAgPyBzZXJ2aWNlRGVwZW5kZW5jaWVzWzBdLmluZGV4IDogYXJncy5sZW5ndGg7XG5cbiAgICAvLyBjaGVjayBmb3IgYXJndW1lbnQgbWlzbWF0Y2hlcywgYWRqdXN0IHN0YXRpYyBhcmdzIGlmIG5lZWRlZFxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gZmlyc3RTZXJ2aWNlQXJnUG9zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtjcmVhdGVJbnN0YW5jZV0gRmlyc3Qgc2VydmljZSBkZXBlbmRlbmN5IG9mICR7Y3Rvci5uYW1lfSBhdCBwb3NpdGlvbiAke2ZpcnN0U2VydmljZUFyZ1BvcyArIDF9IGNvbmZsaWN0cyB3aXRoICR7YXJncy5sZW5ndGh9IHN0YXRpYyBhcmd1bWVudHNgKTtcbiAgICB9XG5cbiAgICAvLyBub3cgY3JlYXRlIHRoZSBpbnN0YW5jZVxuICAgIHJldHVybiBuZXcgY3RvciguLi5bLi4uYXJncywgLi4uc2VydmljZUFyZ3NdKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBMb2dMZXZlbEVudW0gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG50eXBlIExvZ1R5cGUgPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgSUNvbnNvbGUge1xuICBsb2c6IExvZ1R5cGU7XG4gIGVycm9yOiBMb2dUeXBlO1xuICBpbmZvOiBMb2dUeXBlO1xuICB0cmFjZTogTG9nVHlwZTtcbiAgd2FybjogTG9nVHlwZTtcbn1cblxuLy8gY29uc29sZSBpcyBhdmFpbGFibGUgb24gYm90aCBub2RlLmpzIGFuZCBicm93c2VyIGNvbnRleHRzIGJ1dCB0aGUgY29tbW9uXG4vLyBtb2R1bGUgZG9lc24ndCBkZXBlbmQgb24gdGhlbSBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgZGVjbGFyZSBpdC5cbmRlY2xhcmUgY29uc3QgY29uc29sZTogSUNvbnNvbGU7XG5cbmNvbnN0IG9wdGlvbnNLZXlUb0xvZ0xldmVsOiB7IFtrZXk6IHN0cmluZ106IExvZ0xldmVsRW51bSB9ID0ge1xuICB0cmFjZTogTG9nTGV2ZWxFbnVtLlRSQUNFLFxuICBkZWJ1ZzogTG9nTGV2ZWxFbnVtLkRFQlVHLFxuICBpbmZvOiBMb2dMZXZlbEVudW0uSU5GTyxcbiAgd2FybjogTG9nTGV2ZWxFbnVtLldBUk4sXG4gIGVycm9yOiBMb2dMZXZlbEVudW0uRVJST1IsXG4gIG9mZjogTG9nTGV2ZWxFbnVtLk9GRlxufTtcblxuY29uc3QgTE9HX1BSRUZJWCA9ICd4dGVybS5qczogJztcblxuZXhwb3J0IGNsYXNzIExvZ1NlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUxvZ1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbG9nTGV2ZWw6IExvZ0xldmVsRW51bSA9IExvZ0xldmVsRW51bS5PRkY7XG4gIHB1YmxpYyBnZXQgbG9nTGV2ZWwoKTogTG9nTGV2ZWxFbnVtIHsgcmV0dXJuIHRoaXMuX2xvZ0xldmVsOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ2xvZ0xldmVsJywgKCkgPT4gdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKSkpO1xuXG4gICAgLy8gRm9yIHRyYWNlIGxvZ2dpbmcsIGFzc3VtZSB0aGUgbGF0ZXN0IGNyZWF0ZWQgbG9nIHNlcnZpY2UgaXMgdmFsaWRcbiAgICB0cmFjZUxvZ2dlciA9IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVMb2dMZXZlbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dMZXZlbCA9IG9wdGlvbnNLZXlUb0xvZ0xldmVsW3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubG9nTGV2ZWxdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXZhbExhenlPcHRpb25hbFBhcmFtcyhvcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbmFsUGFyYW1zW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbmFsUGFyYW1zW2ldID0gb3B0aW9uYWxQYXJhbXNbaV0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2codHlwZTogTG9nVHlwZSwgbWVzc2FnZTogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zKG9wdGlvbmFsUGFyYW1zKTtcbiAgICB0eXBlLmNhbGwoY29uc29sZSwgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyID8gJycgOiBMT0dfUFJFRklYKSArIG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uVFJBQ0UpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8udHJhY2UuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5sb2csIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLkRFQlVHKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmRlYnVnLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUubG9nLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLklORk8pIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uaW5mby5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmluZm8sIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uV0FSTikge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy53YXJuLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUud2FybiwgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uRVJST1IpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZXJyb3IuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5lcnJvciwgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgdHJhY2VMb2dnZXI6IElMb2dTZXJ2aWNlO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRyYWNlTG9nZ2VyKGxvZ2dlcjogSUxvZ1NlcnZpY2UpOiB2b2lkIHtcbiAgdHJhY2VMb2dnZXIgPSBsb2dnZXI7XG59XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGxvZyB0cmFjZSBjYWxscyB0byB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2VDYWxsKF90YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IGFueSk6IGFueSB7XG4gIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCcpO1xuICB9XG4gIGNvbnN0IGZuS2V5ID0gJ3ZhbHVlJztcbiAgY29uc3QgZm4gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICBkZXNjcmlwdG9yW2ZuS2V5XSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIC8vIEVhcmx5IGV4aXRcbiAgICBpZiAodHJhY2VMb2dnZXIubG9nTGV2ZWwgIT09IExvZ0xldmVsRW51bS5UUkFDRSkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cblxuICAgIHRyYWNlTG9nZ2VyLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7Zm4ubmFtZX0oJHthcmdzLm1hcChlID0+IEpTT04uc3RyaW5naWZ5KGUpKS5qb2luKCcsICcpfSlgKTtcbiAgICBjb25zdCByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB0cmFjZUxvZ2dlci50cmFjZShgR2x5cGhSZW5kZXJlciMke2ZuLm5hbWV9IHJldHVybmAsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IGlzTWFjIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcbmltcG9ydCB7IEN1cnNvclN0eWxlLCBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBGb250V2VpZ2h0LCBJT3B0aW9uc1NlcnZpY2UsIElUZXJtaW5hbE9wdGlvbnMgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TOiBSZWFkb25seTxSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPj4gPSB7XG4gIGNvbHM6IDgwLFxuICByb3dzOiAyNCxcbiAgY3Vyc29yQmxpbms6IGZhbHNlLFxuICBjdXJzb3JTdHlsZTogJ2Jsb2NrJyxcbiAgY3Vyc29yV2lkdGg6IDEsXG4gIGN1cnNvckluYWN0aXZlU3R5bGU6ICdvdXRsaW5lJyxcbiAgY3VzdG9tR2x5cGhzOiB0cnVlLFxuICBkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9yczogdHJ1ZSxcbiAgZG9jdW1lbnRPdmVycmlkZTogbnVsbCxcbiAgZmFzdFNjcm9sbE1vZGlmaWVyOiAnYWx0JyxcbiAgZmFzdFNjcm9sbFNlbnNpdGl2aXR5OiA1LFxuICBmb250RmFtaWx5OiAnY291cmllci1uZXcsIGNvdXJpZXIsIG1vbm9zcGFjZScsXG4gIGZvbnRTaXplOiAxNSxcbiAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gIGZvbnRXZWlnaHRCb2xkOiAnYm9sZCcsXG4gIGlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZTogZmFsc2UsXG4gIGxpbmVIZWlnaHQ6IDEuMCxcbiAgbGV0dGVyU3BhY2luZzogMCxcbiAgbGlua0hhbmRsZXI6IG51bGwsXG4gIGxvZ0xldmVsOiAnaW5mbycsXG4gIGxvZ2dlcjogbnVsbCxcbiAgc2Nyb2xsYmFjazogMTAwMCxcbiAgc2Nyb2xsT25Vc2VySW5wdXQ6IHRydWUsXG4gIHNjcm9sbFNlbnNpdGl2aXR5OiAxLFxuICBzY3JlZW5SZWFkZXJNb2RlOiBmYWxzZSxcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb246IDAsXG4gIG1hY09wdGlvbklzTWV0YTogZmFsc2UsXG4gIG1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uOiBmYWxzZSxcbiAgbWluaW11bUNvbnRyYXN0UmF0aW86IDEsXG4gIGRpc2FibGVTdGRpbjogZmFsc2UsXG4gIGFsbG93UHJvcG9zZWRBcGk6IGZhbHNlLFxuICBhbGxvd1RyYW5zcGFyZW5jeTogZmFsc2UsXG4gIHRhYlN0b3BXaWR0aDogOCxcbiAgdGhlbWU6IHt9LFxuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM6IGZhbHNlLFxuICByaWdodENsaWNrU2VsZWN0c1dvcmQ6IGlzTWFjLFxuICB3aW5kb3dPcHRpb25zOiB7fSxcbiAgd2luZG93c01vZGU6IGZhbHNlLFxuICB3aW5kb3dzUHR5OiB7fSxcbiAgd29yZFNlcGFyYXRvcjogJyAoKVtde31cXCcsXCJgJyxcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcjogdHJ1ZSxcbiAgY29udmVydEVvbDogZmFsc2UsXG4gIHRlcm1OYW1lOiAneHRlcm0nLFxuICBjYW5jZWxFdmVudHM6IGZhbHNlLFxuICBvdmVydmlld1J1bGVyV2lkdGg6IDBcbn07XG5cbmNvbnN0IEZPTlRfV0VJR0hUX09QVElPTlM6IEV4dHJhY3Q8Rm9udFdlaWdodCwgc3RyaW5nPltdID0gWydub3JtYWwnLCAnYm9sZCcsICcxMDAnLCAnMjAwJywgJzMwMCcsICc0MDAnLCAnNTAwJywgJzYwMCcsICc3MDAnLCAnODAwJywgJzkwMCddO1xuXG5leHBvcnQgY2xhc3MgT3B0aW9uc1NlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSU9wdGlvbnNTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHB1YmxpYyByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcbiAgcHVibGljIG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uT3B0aW9uQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPGtleW9mIElUZXJtaW5hbE9wdGlvbnM+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25PcHRpb25DaGFuZ2UgPSB0aGlzLl9vbk9wdGlvbkNoYW5nZS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQYXJ0aWFsPElUZXJtaW5hbE9wdGlvbnM+KSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgZWFjaCBvcHRpb25cbiAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHsgLi4uREVGQVVMVF9PUFRJT05TIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKGtleSBpbiBkZWZhdWx0T3B0aW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gb3B0aW9uc1trZXldO1xuICAgICAgICAgIGRlZmF1bHRPcHRpb25zW2tleV0gPSB0aGlzLl9zYW5pdGl6ZUFuZFZhbGlkYXRlT3B0aW9uKGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciBlYWNoIG9wdGlvblxuICAgIHRoaXMucmF3T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4uIGRlZmF1bHRPcHRpb25zIH07XG4gICAgdGhpcy5fc2V0dXBPcHRpb25zKCk7XG5cbiAgICAvLyBDbGVhciBvdXQgb3B0aW9ucyB0aGF0IGNvdWxkIGxpbmsgb3V0c2lkZSB4dGVybS5qcyBhcyB0aGV5IGNvdWxkIGVhc2lseSBjYXVzZSBhbiBlbWJlZGRlclxuICAgIC8vIG1lbW9yeSBsZWFrXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5yYXdPcHRpb25zLmxpbmtIYW5kbGVyID0gbnVsbDtcbiAgICAgIHRoaXMucmF3T3B0aW9ucy5kb2N1bWVudE92ZXJyaWRlID0gbnVsbDtcbiAgICB9KSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIHB1YmxpYyBvblNwZWNpZmljT3B0aW9uQ2hhbmdlPFQgZXh0ZW5kcyBrZXlvZiBJVGVybWluYWxPcHRpb25zPihrZXk6IFQsIGxpc3RlbmVyOiAodmFsdWU6IElUZXJtaW5hbE9wdGlvbnNbVF0pID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5vbk9wdGlvbkNoYW5nZShldmVudEtleSA9PiB7XG4gICAgICBpZiAoZXZlbnRLZXkgPT09IGtleSkge1xuICAgICAgICBsaXN0ZW5lcih0aGlzLnJhd09wdGlvbnNba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIHB1YmxpYyBvbk11bHRpcGxlT3B0aW9uQ2hhbmdlKGtleXM6IChrZXlvZiBJVGVybWluYWxPcHRpb25zKVtdLCBsaXN0ZW5lcjogKCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLm9uT3B0aW9uQ2hhbmdlKGV2ZW50S2V5ID0+IHtcbiAgICAgIGlmIChrZXlzLmluZGV4T2YoZXZlbnRLZXkpICE9PSAtMSkge1xuICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBPcHRpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IGdldHRlciA9IChwcm9wTmFtZTogc3RyaW5nKTogYW55ID0+IHtcbiAgICAgIGlmICghKHByb3BOYW1lIGluIERFRkFVTFRfT1BUSU9OUykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gd2l0aCBrZXkgXCIke3Byb3BOYW1lfVwiYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yYXdPcHRpb25zW3Byb3BOYW1lXTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0dGVyID0gKHByb3BOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgIGlmICghKHByb3BOYW1lIGluIERFRkFVTFRfT1BUSU9OUykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gd2l0aCBrZXkgXCIke3Byb3BOYW1lfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVBbmRWYWxpZGF0ZU9wdGlvbihwcm9wTmFtZSwgdmFsdWUpO1xuICAgICAgLy8gRG9uJ3QgZmlyZSBhbiBvcHRpb24gY2hhbmdlIGV2ZW50IGlmIHRoZXkgZGlkbid0IGNoYW5nZVxuICAgICAgaWYgKHRoaXMucmF3T3B0aW9uc1twcm9wTmFtZV0gIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMucmF3T3B0aW9uc1twcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fb25PcHRpb25DaGFuZ2UuZmlyZShwcm9wTmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdGhpcy5yYXdPcHRpb25zKSB7XG4gICAgICBjb25zdCBkZXNjID0ge1xuICAgICAgICBnZXQ6IGdldHRlci5iaW5kKHRoaXMsIHByb3BOYW1lKSxcbiAgICAgICAgc2V0OiBzZXR0ZXIuYmluZCh0aGlzLCBwcm9wTmFtZSlcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5vcHRpb25zLCBwcm9wTmFtZSwgZGVzYyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2FuaXRpemVBbmRWYWxpZGF0ZU9wdGlvbihrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2N1cnNvclN0eWxlJzpcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgIHZhbHVlID0gREVGQVVMVF9PUFRJT05TW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0N1cnNvclN0eWxlKHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCIke3ZhbHVlfVwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dvcmRTZXBhcmF0b3InOlxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgdmFsdWUgPSBERUZBVUxUX09QVElPTlNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZvbnRXZWlnaHQnOlxuICAgICAgY2FzZSAnZm9udFdlaWdodEJvbGQnOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAxIDw9IHZhbHVlICYmIHZhbHVlIDw9IDEwMDApIHtcbiAgICAgICAgICAvLyBhbHJlYWR5IHZhbGlkIG51bWVyaWMgdmFsdWVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IEZPTlRfV0VJR0hUX09QVElPTlMuaW5jbHVkZXModmFsdWUpID8gdmFsdWUgOiBERUZBVUxUX09QVElPTlNba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXJzb3JXaWR0aCc6XG4gICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCBmb3IgYm91bmRzIGNoZWNrXG4gICAgICBjYXNlICdsaW5lSGVpZ2h0JzpcbiAgICAgIGNhc2UgJ3RhYlN0b3BXaWR0aCc6XG4gICAgICAgIGlmICh2YWx1ZSA8IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEsIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWluaW11bUNvbnRyYXN0UmF0aW8nOlxuICAgICAgICB2YWx1ZSA9IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBNYXRoLnJvdW5kKHZhbHVlICogMTApIC8gMTApKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzY3JvbGxiYWNrJzpcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1pbih2YWx1ZSwgNDI5NDk2NzI5NSk7XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBjYW5ub3QgYmUgbGVzcyB0aGFuIDAsIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmFzdFNjcm9sbFNlbnNpdGl2aXR5JzpcbiAgICAgIGNhc2UgJ3Njcm9sbFNlbnNpdGl2aXR5JzpcbiAgICAgICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAsIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncm93cyc6XG4gICAgICBjYXNlICdjb2xzJzpcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IG11c3QgYmUgbnVtZXJpYywgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aW5kb3dzUHR5JzpcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/PyB7fTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1cnNvclN0eWxlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ3Vyc29yU3R5bGUge1xuICByZXR1cm4gdmFsdWUgPT09ICdibG9jaycgfHwgdmFsdWUgPT09ICd1bmRlcmxpbmUnIHx8IHZhbHVlID09PSAnYmFyJztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJT3NjTGlua1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSU1hcmtlciwgSU9zY0xpbmtEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGNsYXNzIE9zY0xpbmtTZXJ2aWNlIGltcGxlbWVudHMgSU9zY0xpbmtTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHByaXZhdGUgX25leHRJZCA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIHRoZSBsaW5rIGtleSB0byBsaW5rIGVudHJ5LiBUaGlzIGlzIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgbGluZXMgdG8gbGlua3Mgd2l0aCBpZHMuXG4gICAqL1xuICBwcml2YXRlIF9lbnRyaWVzV2l0aElkOiBNYXA8c3RyaW5nLCBJT3NjTGlua0VudHJ5V2l0aElkPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgdGhlIGxpbmsgaWQgdG8gdGhlIGxpbmsgZW50cnkuIFRoZSBcImxpbmsgaWRcIiAobnVtYmVyKSB3aGljaCBpcyB0aGUgbnVtYmVyaWNcbiAgICogcmVwcmVzZW50YXRpb24gb2YgYSB1bmlxdWUgbGluayBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggXCJpZFwiIChzdHJpbmcpIHdoaWNoIGNvbWVzIGluIHdpdGhcbiAgICogYGlkPWAgaW4gdGhlIE9TQyBsaW5rJ3MgcHJvcGVydGllcy5cbiAgICovXG4gIHByaXZhdGUgX2RhdGFCeUxpbmtJZDogTWFwPG51bWJlciwgSU9zY0xpbmtFbnRyeU5vSWQgfCBJT3NjTGlua0VudHJ5V2l0aElkPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaW5rKGRhdGE6IElPc2NMaW5rRGF0YSk6IG51bWJlciB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG5cbiAgICAvLyBMaW5rcyB3aXRoIG5vIGlkIHdpbGwgb25seSBldmVyIGJlIHJlZ2lzdGVyZWQgYSBzaW5nbGUgdGltZVxuICAgIGlmIChkYXRhLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IGJ1ZmZlci5hZGRNYXJrZXIoYnVmZmVyLnliYXNlICsgYnVmZmVyLnkpO1xuICAgICAgY29uc3QgZW50cnk6IElPc2NMaW5rRW50cnlOb0lkID0ge1xuICAgICAgICBkYXRhLFxuICAgICAgICBpZDogdGhpcy5fbmV4dElkKyssXG4gICAgICAgIGxpbmVzOiBbbWFya2VyXVxuICAgICAgfTtcbiAgICAgIG1hcmtlci5vbkRpc3Bvc2UoKCkgPT4gdGhpcy5fcmVtb3ZlTWFya2VyRnJvbUxpbmsoZW50cnksIG1hcmtlcikpO1xuICAgICAgdGhpcy5fZGF0YUJ5TGlua0lkLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgICAgcmV0dXJuIGVudHJ5LmlkO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgbGluZSB0byB0aGUgbGluayBpZiBpdCBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGNhc3REYXRhID0gZGF0YSBhcyBSZXF1aXJlZDxJT3NjTGlua0RhdGE+O1xuICAgIGNvbnN0IGtleSA9IHRoaXMuX2dldEVudHJ5SWRLZXkoY2FzdERhdGEpO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5fZW50cmllc1dpdGhJZC5nZXQoa2V5KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHRoaXMuYWRkTGluZVRvTGluayhtYXRjaC5pZCwgYnVmZmVyLnliYXNlICsgYnVmZmVyLnkpO1xuICAgICAgcmV0dXJuIG1hdGNoLmlkO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgbGlua1xuICAgIGNvbnN0IG1hcmtlciA9IGJ1ZmZlci5hZGRNYXJrZXIoYnVmZmVyLnliYXNlICsgYnVmZmVyLnkpO1xuICAgIGNvbnN0IGVudHJ5OiBJT3NjTGlua0VudHJ5V2l0aElkID0ge1xuICAgICAgaWQ6IHRoaXMuX25leHRJZCsrLFxuICAgICAga2V5OiB0aGlzLl9nZXRFbnRyeUlkS2V5KGNhc3REYXRhKSxcbiAgICAgIGRhdGE6IGNhc3REYXRhLFxuICAgICAgbGluZXM6IFttYXJrZXJdXG4gICAgfTtcbiAgICBtYXJrZXIub25EaXNwb3NlKCgpID0+IHRoaXMuX3JlbW92ZU1hcmtlckZyb21MaW5rKGVudHJ5LCBtYXJrZXIpKTtcbiAgICB0aGlzLl9lbnRyaWVzV2l0aElkLnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICB0aGlzLl9kYXRhQnlMaW5rSWQuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5LmlkO1xuICB9XG5cbiAgcHVibGljIGFkZExpbmVUb0xpbmsobGlua0lkOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZGF0YUJ5TGlua0lkLmdldChsaW5rSWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVudHJ5LmxpbmVzLmV2ZXJ5KGUgPT4gZS5saW5lICE9PSB5KSkge1xuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuYWRkTWFya2VyKHkpO1xuICAgICAgZW50cnkubGluZXMucHVzaChtYXJrZXIpO1xuICAgICAgbWFya2VyLm9uRGlzcG9zZSgoKSA9PiB0aGlzLl9yZW1vdmVNYXJrZXJGcm9tTGluayhlbnRyeSwgbWFya2VyKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YUJ5TGlua0lkLmdldChsaW5rSWQpPy5kYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RW50cnlJZEtleShsaW5rRGF0YTogUmVxdWlyZWQ8SU9zY0xpbmtEYXRhPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2xpbmtEYXRhLmlkfTs7JHtsaW5rRGF0YS51cml9YDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZU1hcmtlckZyb21MaW5rKGVudHJ5OiBJT3NjTGlua0VudHJ5Tm9JZCB8IElPc2NMaW5rRW50cnlXaXRoSWQsIG1hcmtlcjogSU1hcmtlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gZW50cnkubGluZXMuaW5kZXhPZihtYXJrZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cnkubGluZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cnkubGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoZW50cnkuZGF0YS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2VudHJpZXNXaXRoSWQuZGVsZXRlKChlbnRyeSBhcyBJT3NjTGlua0VudHJ5V2l0aElkKS5rZXkpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YUJ5TGlua0lkLmRlbGV0ZShlbnRyeS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBJT3NjTGlua0VudHJ5PFQgZXh0ZW5kcyBJT3NjTGlua0RhdGE+IHtcbiAgZGF0YTogVDtcbiAgaWQ6IG51bWJlcjtcbiAgbGluZXM6IElNYXJrZXJbXTtcbn1cblxuaW50ZXJmYWNlIElPc2NMaW5rRW50cnlOb0lkIGV4dGVuZHMgSU9zY0xpbmtFbnRyeTxJT3NjTGlua0RhdGE+IHtcbn1cblxuaW50ZXJmYWNlIElPc2NMaW5rRW50cnlXaXRoSWQgZXh0ZW5kcyBJT3NjTGlua0VudHJ5PFJlcXVpcmVkPElPc2NMaW5rRGF0YT4+IHtcbiAga2V5OiBzdHJpbmc7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IFVuaWNvZGVWNiB9IGZyb20gJ2NvbW1vbi9pbnB1dC9Vbmljb2RlVjYnO1xuaW1wb3J0IHsgSVVuaWNvZGVTZXJ2aWNlLCBJVW5pY29kZVZlcnNpb25Qcm92aWRlciwgVW5pY29kZUNoYXJQcm9wZXJ0aWVzLCBVbmljb2RlQ2hhcldpZHRoIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNsYXNzIFVuaWNvZGVTZXJ2aWNlIGltcGxlbWVudHMgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHByaXZhdGUgX3Byb3ZpZGVyczoge1trZXk6IHN0cmluZ106IElVbmljb2RlVmVyc2lvblByb3ZpZGVyfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHByaXZhdGUgX2FjdGl2ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2FjdGl2ZVByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5ldmVudDtcblxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RTaG91bGRKb2luKHZhbHVlOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHZhbHVlICYgMSkgIT09IDA7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0V2lkdGgodmFsdWU6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyV2lkdGgge1xuICAgIHJldHVybiAoKHZhbHVlID4+IDEpICYgMHgzKSBhcyBVbmljb2RlQ2hhcldpZHRoO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdENoYXJLaW5kKHZhbHVlOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBudW1iZXIge1xuICAgIHJldHVybiB2YWx1ZSA+PiAzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvcGVydHlWYWx1ZShzdGF0ZTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBzaG91bGRKb2luOiBib29sZWFuID0gZmFsc2UpOiBVbmljb2RlQ2hhclByb3BlcnRpZXMge1xuICAgIHJldHVybiAoKHN0YXRlICYgMHhmZmZmZmYpIDw8IDMpIHwgKCh3aWR0aCAmIDMpIDw8IDEpIHwgKHNob3VsZEpvaW4/MTowKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IGRlZmF1bHRQcm92aWRlciA9IG5ldyBVbmljb2RlVjYoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGRlZmF1bHRQcm92aWRlcik7XG4gICAgdGhpcy5fYWN0aXZlID0gZGVmYXVsdFByb3ZpZGVyLnZlcnNpb247XG4gICAgdGhpcy5fYWN0aXZlUHJvdmlkZXIgPSBkZWZhdWx0UHJvdmlkZXI7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZS5kaXNwb3NlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcHJvdmlkZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9wcm92aWRlcnNbdmVyc2lvbl0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBVbmljb2RlIHZlcnNpb24gXCIke3ZlcnNpb259XCJgKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlID0gdmVyc2lvbjtcbiAgICB0aGlzLl9hY3RpdmVQcm92aWRlciA9IHRoaXMuX3Byb3ZpZGVyc1t2ZXJzaW9uXTtcbiAgICB0aGlzLl9vbkNoYW5nZS5maXJlKHZlcnNpb24pO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQge1xuICAgIHRoaXMuX3Byb3ZpZGVyc1twcm92aWRlci52ZXJzaW9uXSA9IHByb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaWNvZGUgdmVyc2lvbiBkZXBlbmRlbnQgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIHdjd2lkdGgobnVtOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUHJvdmlkZXIud2N3aWR0aChudW0pO1xuICB9XG5cbiAgcHVibGljIGdldFN0cmluZ0NlbGxXaWR0aChzOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGxldCBwcmVjZWRpbmdJbmZvID0gMDtcbiAgICBjb25zdCBsZW5ndGggPSBzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBsZXQgY29kZSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyIGZpcnN0XG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggc3RyaW5ncyByZXRyaWV2ZWQgZnJvbVxuICAgICAgICAgIC8vIEJ1ZmZlci50cmFuc2xhdGVUb1N0cmluZyBhcyBpdCBjb252ZXJ0cyBmcm9tIFVURi0zMlxuICAgICAgICAgIC8vIGFuZCB0aGVyZWZvcmUgYWx3YXlzIHNob3VsZCBjb250YWluIHRoZSBzZWNvbmQgcGFydFxuICAgICAgICAgIC8vIGZvciBhbnkgb3RoZXIgc3RyaW5nIHdlIHN0aWxsIGhhdmUgdG8gaGFuZGxlIGl0IHNvbWVob3c6XG4gICAgICAgICAgLy8gc2ltcGx5IHRyZWF0IHRoZSBsb25lbHkgc3Vycm9nYXRlIGZpcnN0IGFzIGEgc2luZ2xlIGNoYXIgKFVDUy0yIGJlaGF2aW9yKVxuICAgICAgICAgIHJldHVybiByZXN1bHQgKyB0aGlzLndjd2lkdGgoY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2Vjb25kID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBjb252ZXJ0IHN1cnJvZ2F0ZSBwYWlyIHRvIGhpZ2ggY29kZXBvaW50IG9ubHkgZm9yIHZhbGlkIHNlY29uZCBwYXJ0IChVVEYtMTYpXG4gICAgICAgIC8vIG90aGVyd2lzZSB0cmVhdCB0aGVtIGluZGVwZW5kZW50bHkgKFVDUy0yIGJlaGF2aW9yKVxuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgY29kZSA9IChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgKz0gdGhpcy53Y3dpZHRoKHNlY29uZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRJbmZvID0gdGhpcy5jaGFyUHJvcGVydGllcyhjb2RlLCBwcmVjZWRpbmdJbmZvKTtcbiAgICAgIGxldCBjaFdpZHRoID0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKGN1cnJlbnRJbmZvKTtcbiAgICAgIGlmIChVbmljb2RlU2VydmljZS5leHRyYWN0U2hvdWxkSm9pbihjdXJyZW50SW5mbykpIHtcbiAgICAgICAgY2hXaWR0aCAtPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgocHJlY2VkaW5nSW5mbyk7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hXaWR0aDtcbiAgICAgIHByZWNlZGluZ0luZm8gPSBjdXJyZW50SW5mbztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXMge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQcm92aWRlci5jaGFyUHJvcGVydGllcyhjb2RlcG9pbnQsIHByZWNlZGluZyk7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCAqIGFzIFN0cmluZ3MgZnJvbSAnYnJvd3Nlci9Mb2NhbGl6YWJsZVN0cmluZ3MnO1xuaW1wb3J0IHsgVGVybWluYWwgYXMgVGVybWluYWxDb3JlIH0gZnJvbSAnYnJvd3Nlci9UZXJtaW5hbCc7XG5pbXBvcnQgeyBJQnVmZmVyUmFuZ2UsIElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJVGVybWluYWxPcHRpb25zIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEFkZG9uTWFuYWdlciB9IGZyb20gJ2NvbW1vbi9wdWJsaWMvQWRkb25NYW5hZ2VyJztcbmltcG9ydCB7IEJ1ZmZlck5hbWVzcGFjZUFwaSB9IGZyb20gJ2NvbW1vbi9wdWJsaWMvQnVmZmVyTmFtZXNwYWNlQXBpJztcbmltcG9ydCB7IFBhcnNlckFwaSB9IGZyb20gJ2NvbW1vbi9wdWJsaWMvUGFyc2VyQXBpJztcbmltcG9ydCB7IFVuaWNvZGVBcGkgfSBmcm9tICdjb21tb24vcHVibGljL1VuaWNvZGVBcGknO1xuaW1wb3J0IHsgSUJ1ZmZlck5hbWVzcGFjZSBhcyBJQnVmZmVyTmFtZXNwYWNlQXBpLCBJRGVjb3JhdGlvbiwgSURlY29yYXRpb25PcHRpb25zLCBJRGlzcG9zYWJsZSwgSUxpbmtQcm92aWRlciwgSUxvY2FsaXphYmxlU3RyaW5ncywgSU1hcmtlciwgSU1vZGVzLCBJUGFyc2VyLCBJVGVybWluYWxBZGRvbiwgVGVybWluYWwgYXMgSVRlcm1pbmFsQXBpLCBJVGVybWluYWxJbml0T25seU9wdGlvbnMsIElVbmljb2RlSGFuZGxpbmcgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG4vKipcbiAqIFRoZSBzZXQgb2Ygb3B0aW9ucyB0aGF0IG9ubHkgaGF2ZSBhbiBlZmZlY3Qgd2hlbiBzZXQgaW4gdGhlIFRlcm1pbmFsIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCBDT05TVFJVQ1RPUl9PTkxZX09QVElPTlMgPSBbJ2NvbHMnLCAncm93cyddO1xuXG5leHBvcnQgY2xhc3MgVGVybWluYWwgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVRlcm1pbmFsQXBpIHtcbiAgcHJpdmF0ZSBfY29yZTogSVRlcm1pbmFsO1xuICBwcml2YXRlIF9hZGRvbk1hbmFnZXI6IEFkZG9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBfcGFyc2VyOiBJUGFyc2VyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9idWZmZXI6IEJ1ZmZlck5hbWVzcGFjZUFwaSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcHVibGljT3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IElUZXJtaW5hbE9wdGlvbnMgJiBJVGVybWluYWxJbml0T25seU9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29yZSA9IHRoaXMucmVnaXN0ZXIobmV3IFRlcm1pbmFsQ29yZShvcHRpb25zKSk7XG4gICAgdGhpcy5fYWRkb25NYW5hZ2VyID0gdGhpcy5yZWdpc3RlcihuZXcgQWRkb25NYW5hZ2VyKCkpO1xuXG4gICAgdGhpcy5fcHVibGljT3B0aW9ucyA9IHsgLi4uIHRoaXMuX2NvcmUub3B0aW9ucyB9O1xuICAgIGNvbnN0IGdldHRlciA9IChwcm9wTmFtZTogc3RyaW5nKTogYW55ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3JlLm9wdGlvbnNbcHJvcE5hbWVdO1xuICAgIH07XG4gICAgY29uc3Qgc2V0dGVyID0gKHByb3BOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuX2NoZWNrUmVhZG9ubHlPcHRpb25zKHByb3BOYW1lKTtcbiAgICAgIHRoaXMuX2NvcmUub3B0aW9uc1twcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiB0aGlzLl9jb3JlLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGRlc2MgPSB7XG4gICAgICAgIGdldDogZ2V0dGVyLmJpbmQodGhpcywgcHJvcE5hbWUpLFxuICAgICAgICBzZXQ6IHNldHRlci5iaW5kKHRoaXMsIHByb3BOYW1lKVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLl9wdWJsaWNPcHRpb25zLCBwcm9wTmFtZSwgZGVzYyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tSZWFkb25seU9wdGlvbnMocHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGFueSBjb25zdHJ1Y3RvciBvbmx5IG9wdGlvbiBpcyBtb2RpZmllZFxuICAgIC8vIGZyb20gdGVybWluYWwub3B0aW9uc1xuICAgIC8vIE1vZGlmaWNhdGlvbnMgZnJvbSBhbnl3aGVyZSBlbHNlIGFyZSBhbGxvd2VkXG4gICAgaWYgKENPTlNUUlVDVE9SX09OTFlfT1BUSU9OUy5pbmNsdWRlcyhwcm9wTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uIFwiJHtwcm9wTmFtZX1cIiBjYW4gb25seSBiZSBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tQcm9wb3NlZEFwaSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NvcmUub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5hbGxvd1Byb3Bvc2VkQXBpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHNldCB0aGUgYWxsb3dQcm9wb3NlZEFwaSBvcHRpb24gdG8gdHJ1ZSB0byB1c2UgcHJvcG9zZWQgQVBJJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBvbkJlbGwoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25CZWxsOyB9XG4gIHB1YmxpYyBnZXQgb25CaW5hcnkoKTogSUV2ZW50PHN0cmluZz4geyByZXR1cm4gdGhpcy5fY29yZS5vbkJpbmFyeTsgfVxuICBwdWJsaWMgZ2V0IG9uQ3Vyc29yTW92ZSgpOiBJRXZlbnQ8dm9pZD4geyByZXR1cm4gdGhpcy5fY29yZS5vbkN1cnNvck1vdmU7IH1cbiAgcHVibGljIGdldCBvbkRhdGEoKTogSUV2ZW50PHN0cmluZz4geyByZXR1cm4gdGhpcy5fY29yZS5vbkRhdGE7IH1cbiAgcHVibGljIGdldCBvbktleSgpOiBJRXZlbnQ8eyBrZXk6IHN0cmluZywgZG9tRXZlbnQ6IEtleWJvYXJkRXZlbnQgfT4geyByZXR1cm4gdGhpcy5fY29yZS5vbktleTsgfVxuICBwdWJsaWMgZ2V0IG9uTGluZUZlZWQoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25MaW5lRmVlZDsgfVxuICBwdWJsaWMgZ2V0IG9uUmVuZGVyKCk6IElFdmVudDx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25SZW5kZXI7IH1cbiAgcHVibGljIGdldCBvblJlc2l6ZSgpOiBJRXZlbnQ8eyBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlciB9PiB7IHJldHVybiB0aGlzLl9jb3JlLm9uUmVzaXplOyB9XG4gIHB1YmxpYyBnZXQgb25TY3JvbGwoKTogSUV2ZW50PG51bWJlcj4geyByZXR1cm4gdGhpcy5fY29yZS5vblNjcm9sbDsgfVxuICBwdWJsaWMgZ2V0IG9uU2VsZWN0aW9uQ2hhbmdlKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uU2VsZWN0aW9uQ2hhbmdlOyB9XG4gIHB1YmxpYyBnZXQgb25UaXRsZUNoYW5nZSgpOiBJRXZlbnQ8c3RyaW5nPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uVGl0bGVDaGFuZ2U7IH1cbiAgcHVibGljIGdldCBvbldyaXRlUGFyc2VkKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uV3JpdGVQYXJzZWQ7IH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29yZS5lbGVtZW50OyB9XG4gIHB1YmxpYyBnZXQgcGFyc2VyKCk6IElQYXJzZXIge1xuICAgIGlmICghdGhpcy5fcGFyc2VyKSB7XG4gICAgICB0aGlzLl9wYXJzZXIgPSBuZXcgUGFyc2VyQXBpKHRoaXMuX2NvcmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFyc2VyO1xuICB9XG4gIHB1YmxpYyBnZXQgdW5pY29kZSgpOiBJVW5pY29kZUhhbmRsaW5nIHtcbiAgICB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCk7XG4gICAgcmV0dXJuIG5ldyBVbmljb2RlQXBpKHRoaXMuX2NvcmUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dGFyZWEoKTogSFRNTFRleHRBcmVhRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jb3JlLnRleHRhcmVhOyB9XG4gIHB1YmxpYyBnZXQgcm93cygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fY29yZS5yb3dzOyB9XG4gIHB1YmxpYyBnZXQgY29scygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fY29yZS5jb2xzOyB9XG4gIHB1YmxpYyBnZXQgYnVmZmVyKCk6IElCdWZmZXJOYW1lc3BhY2VBcGkge1xuICAgIGlmICghdGhpcy5fYnVmZmVyKSB7XG4gICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBCdWZmZXJOYW1lc3BhY2VBcGkodGhpcy5fY29yZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICB9XG4gIHB1YmxpYyBnZXQgbWFya2VycygpOiBSZWFkb25seUFycmF5PElNYXJrZXI+IHtcbiAgICB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUubWFya2VycztcbiAgfVxuICBwdWJsaWMgZ2V0IG1vZGVzKCk6IElNb2RlcyB7XG4gICAgY29uc3QgbSA9IHRoaXMuX2NvcmUuY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzO1xuICAgIGxldCBtb3VzZVRyYWNraW5nTW9kZTogJ25vbmUnIHwgJ3gxMCcgfCAndnQyMDAnIHwgJ2RyYWcnIHwgJ2FueScgPSAnbm9uZSc7XG4gICAgc3dpdGNoICh0aGlzLl9jb3JlLmNvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgJ1gxMCc6IG1vdXNlVHJhY2tpbmdNb2RlID0gJ3gxMCc7IGJyZWFrO1xuICAgICAgY2FzZSAnVlQyMDAnOiBtb3VzZVRyYWNraW5nTW9kZSA9ICd2dDIwMCc7IGJyZWFrO1xuICAgICAgY2FzZSAnRFJBRyc6IG1vdXNlVHJhY2tpbmdNb2RlID0gJ2RyYWcnOyBicmVhaztcbiAgICAgIGNhc2UgJ0FOWSc6IG1vdXNlVHJhY2tpbmdNb2RlID0gJ2FueSc7IGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZTogbS5hcHBsaWNhdGlvbkN1cnNvcktleXMsXG4gICAgICBhcHBsaWNhdGlvbktleXBhZE1vZGU6IG0uYXBwbGljYXRpb25LZXlwYWQsXG4gICAgICBicmFja2V0ZWRQYXN0ZU1vZGU6IG0uYnJhY2tldGVkUGFzdGVNb2RlLFxuICAgICAgaW5zZXJ0TW9kZTogdGhpcy5fY29yZS5jb3JlU2VydmljZS5tb2Rlcy5pbnNlcnRNb2RlLFxuICAgICAgbW91c2VUcmFja2luZ01vZGU6IG1vdXNlVHJhY2tpbmdNb2RlLFxuICAgICAgb3JpZ2luTW9kZTogbS5vcmlnaW4sXG4gICAgICByZXZlcnNlV3JhcGFyb3VuZE1vZGU6IG0ucmV2ZXJzZVdyYXBhcm91bmQsXG4gICAgICBzZW5kRm9jdXNNb2RlOiBtLnNlbmRGb2N1cyxcbiAgICAgIHdyYXBhcm91bmRNb2RlOiBtLndyYXBhcm91bmRcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMuX3B1YmxpY09wdGlvbnM7XG4gIH1cbiAgcHVibGljIHNldCBvcHRpb25zKG9wdGlvbnM6IElUZXJtaW5hbE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX3B1YmxpY09wdGlvbnNbcHJvcE5hbWVdID0gb3B0aW9uc1twcm9wTmFtZV07XG4gICAgfVxuICB9XG4gIHB1YmxpYyBibHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuYmx1cigpO1xuICB9XG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmZvY3VzKCk7XG4gIH1cbiAgcHVibGljIGlucHV0KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuaW5wdXQoZGF0YSwgd2FzVXNlcklucHV0KTtcbiAgfVxuICBwdWJsaWMgcmVzaXplKGNvbHVtbnM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMoY29sdW1ucywgcm93cyk7XG4gICAgdGhpcy5fY29yZS5yZXNpemUoY29sdW1ucywgcm93cyk7XG4gIH1cbiAgcHVibGljIG9wZW4ocGFyZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUub3BlbihwYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBhdHRhY2hDdXN0b21LZXlFdmVudEhhbmRsZXIoY3VzdG9tS2V5RXZlbnRIYW5kbGVyOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlcihjdXN0b21LZXlFdmVudEhhbmRsZXIpO1xuICB9XG4gIHB1YmxpYyBhdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlcihjdXN0b21XaGVlbEV2ZW50SGFuZGxlcjogKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5hdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlcihjdXN0b21XaGVlbEV2ZW50SGFuZGxlcik7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyTGlua1Byb3ZpZGVyKGxpbmtQcm92aWRlcjogSUxpbmtQcm92aWRlcik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckxpbmtQcm92aWRlcihsaW5rUHJvdmlkZXIpO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlckNoYXJhY3RlckpvaW5lcihoYW5kbGVyOiAodGV4dDogc3RyaW5nKSA9PiBbbnVtYmVyLCBudW1iZXJdW10pOiBudW1iZXIge1xuICAgIHRoaXMuX2NoZWNrUHJvcG9zZWRBcGkoKTtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckNoYXJhY3RlckpvaW5lcihoYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lcihqb2luZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpO1xuICAgIHRoaXMuX2NvcmUuZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lcihqb2luZXJJZCk7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyTWFya2VyKGN1cnNvcllPZmZzZXQ6IG51bWJlciA9IDApOiBJTWFya2VyIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2VycyhjdXJzb3JZT2Zmc2V0KTtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3Rlck1hcmtlcihjdXJzb3JZT2Zmc2V0KTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpO1xuICAgIHRoaXMuX3ZlcmlmeVBvc2l0aXZlSW50ZWdlcnMoZGVjb3JhdGlvbk9wdGlvbnMueCA/PyAwLCBkZWNvcmF0aW9uT3B0aW9ucy53aWR0aCA/PyAwLCBkZWNvcmF0aW9uT3B0aW9ucy5oZWlnaHQgPz8gMCk7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zKTtcbiAgfVxuICBwdWJsaWMgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLmhhc1NlbGVjdGlvbigpO1xuICB9XG4gIHB1YmxpYyBzZWxlY3QoY29sdW1uOiBudW1iZXIsIHJvdzogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKGNvbHVtbiwgcm93LCBsZW5ndGgpO1xuICAgIHRoaXMuX2NvcmUuc2VsZWN0KGNvbHVtbiwgcm93LCBsZW5ndGgpO1xuICB9XG4gIHB1YmxpYyBnZXRTZWxlY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5nZXRTZWxlY3Rpb24oKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2VsZWN0aW9uUG9zaXRpb24oKTogSUJ1ZmZlclJhbmdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5nZXRTZWxlY3Rpb25Qb3NpdGlvbigpO1xuICB9XG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmNsZWFyU2VsZWN0aW9uKCk7XG4gIH1cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLnNlbGVjdEFsbCgpO1xuICB9XG4gIHB1YmxpYyBzZWxlY3RMaW5lcyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKHN0YXJ0LCBlbmQpO1xuICAgIHRoaXMuX2NvcmUuc2VsZWN0TGluZXMoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHB1YmxpYyBzY3JvbGxMaW5lcyhhbW91bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKGFtb3VudCk7XG4gICAgdGhpcy5fY29yZS5zY3JvbGxMaW5lcyhhbW91bnQpO1xuICB9XG4gIHB1YmxpYyBzY3JvbGxQYWdlcyhwYWdlQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKHBhZ2VDb3VudCk7XG4gICAgdGhpcy5fY29yZS5zY3JvbGxQYWdlcyhwYWdlQ291bnQpO1xuICB9XG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLnNjcm9sbFRvVG9wKCk7XG4gIH1cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgfVxuICBwdWJsaWMgc2Nyb2xsVG9MaW5lKGxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKGxpbmUpO1xuICAgIHRoaXMuX2NvcmUuc2Nyb2xsVG9MaW5lKGxpbmUpO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmNsZWFyKCk7XG4gIH1cbiAgcHVibGljIHdyaXRlKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIGNhbGxiYWNrPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUud3JpdGUoZGF0YSwgY2FsbGJhY2spO1xuICB9XG4gIHB1YmxpYyB3cml0ZWxuKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIGNhbGxiYWNrPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUud3JpdGUoZGF0YSk7XG4gICAgdGhpcy5fY29yZS53cml0ZSgnXFxyXFxuJywgY2FsbGJhY2spO1xuICB9XG4gIHB1YmxpYyBwYXN0ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLnBhc3RlKGRhdGEpO1xuICB9XG4gIHB1YmxpYyByZWZyZXNoKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMoc3RhcnQsIGVuZCk7XG4gICAgdGhpcy5fY29yZS5yZWZyZXNoKHN0YXJ0LCBlbmQpO1xuICB9XG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLnJlc2V0KCk7XG4gIH1cbiAgcHVibGljIGNsZWFyVGV4dHVyZUF0bGFzKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuY2xlYXJUZXh0dXJlQXRsYXMoKTtcbiAgfVxuICBwdWJsaWMgbG9hZEFkZG9uKGFkZG9uOiBJVGVybWluYWxBZGRvbik6IHZvaWQge1xuICAgIHRoaXMuX2FkZG9uTWFuYWdlci5sb2FkQWRkb24odGhpcywgYWRkb24pO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHN0cmluZ3MoKTogSUxvY2FsaXphYmxlU3RyaW5ncyB7XG4gICAgcmV0dXJuIFN0cmluZ3M7XG4gIH1cblxuICBwcml2YXRlIF92ZXJpZnlJbnRlZ2VycyguLi52YWx1ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gSW5maW5pdHkgfHwgaXNOYU4odmFsdWUpIHx8IHZhbHVlICUgMSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgQVBJIG9ubHkgYWNjZXB0cyBpbnRlZ2VycycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ZlcmlmeVBvc2l0aXZlSW50ZWdlcnMoLi4udmFsdWVzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgJiYgKHZhbHVlID09PSBJbmZpbml0eSB8fCBpc05hTih2YWx1ZSkgfHwgdmFsdWUgJSAxICE9PSAwIHx8IHZhbHVlIDwgMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIEFQSSBvbmx5IGFjY2VwdHMgcG9zaXRpdmUgaW50ZWdlcnMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkZpdEFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkZpdEFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBUZXJtaW5hbCwgSVRlcm1pbmFsQWRkb24gfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBGaXRBZGRvbiBhcyBJRml0QXBpIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLWZpdCc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuaW50ZXJmYWNlIElUZXJtaW5hbERpbWVuc2lvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIHJvd3M6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIGNvbHM6IG51bWJlcjtcbn1cblxuY29uc3QgTUlOSU1VTV9DT0xTID0gMjtcbmNvbnN0IE1JTklNVU1fUk9XUyA9IDE7XG5cbmV4cG9ydCBjbGFzcyBGaXRBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSUZpdEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge31cblxuICBwdWJsaWMgZml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgaWYgKCFkaW1zIHx8ICF0aGlzLl90ZXJtaW5hbCB8fCBpc05hTihkaW1zLmNvbHMpIHx8IGlzTmFOKGRpbXMucm93cykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBSZW1vdmUgcmVsaWFuY2Ugb24gcHJpdmF0ZSBBUElcbiAgICBjb25zdCBjb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICAvLyBGb3JjZSBhIGZ1bGwgcmVuZGVyXG4gICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnJvd3MgIT09IGRpbXMucm93cyB8fCB0aGlzLl90ZXJtaW5hbC5jb2xzICE9PSBkaW1zLmNvbHMpIHtcbiAgICAgIGNvcmUuX3JlbmRlclNlcnZpY2UuY2xlYXIoKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLnJlc2l6ZShkaW1zLmNvbHMsIGRpbXMucm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3Bvc2VEaW1lbnNpb25zKCk6IElUZXJtaW5hbERpbWVuc2lvbnMgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5lbGVtZW50IHx8ICF0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVtb3ZlIHJlbGlhbmNlIG9uIHByaXZhdGUgQVBJXG4gICAgY29uc3QgY29yZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuICAgIGNvbnN0IGRpbXM6IElSZW5kZXJEaW1lbnNpb25zID0gY29yZS5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zO1xuXG4gICAgaWYgKGRpbXMuY3NzLmNlbGwud2lkdGggPT09IDAgfHwgZGltcy5jc3MuY2VsbC5oZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLnNjcm9sbGJhY2sgPT09IDAgP1xuICAgICAgMCA6IGNvcmUudmlld3BvcnQuc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBjb25zdCBwYXJlbnRFbGVtZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRIZWlnaHQgPSBwYXJzZUludChwYXJlbnRFbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRXaWR0aCA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHBhcmVudEVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpKSk7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fdGVybWluYWwuZWxlbWVudCk7XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmcgPSB7XG4gICAgICB0b3A6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKSxcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpLFxuICAgICAgcmlnaHQ6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpLFxuICAgICAgbGVmdDogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKVxuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdWZXIgPSBlbGVtZW50UGFkZGluZy50b3AgKyBlbGVtZW50UGFkZGluZy5ib3R0b207XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdIb3IgPSBlbGVtZW50UGFkZGluZy5yaWdodCArIGVsZW1lbnRQYWRkaW5nLmxlZnQ7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gcGFyZW50RWxlbWVudEhlaWdodCAtIGVsZW1lbnRQYWRkaW5nVmVyO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gcGFyZW50RWxlbWVudFdpZHRoIC0gZWxlbWVudFBhZGRpbmdIb3IgLSBzY3JvbGxiYXJXaWR0aDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHtcbiAgICAgIGNvbHM6IE1hdGgubWF4KE1JTklNVU1fQ09MUywgTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIGRpbXMuY3NzLmNlbGwud2lkdGgpKSxcbiAgICAgIHJvd3M6IE1hdGgubWF4KE1JTklNVU1fUk9XUywgTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBkaW1zLmNzcy5jZWxsLmhlaWdodCkpXG4gICAgfTtcbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIldlYkxpbmtzQWRkb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiV2ViTGlua3NBZGRvblwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElMaW5rUHJvdmlkZXIsIElMaW5rLCBUZXJtaW5hbCwgSVZpZXdwb3J0UmFuZ2UsIElCdWZmZXJMaW5lIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGludGVyZmFjZSBJTGlua1Byb3ZpZGVyT3B0aW9ucyB7XG4gIGhvdmVyPyhldmVudDogTW91c2VFdmVudCwgdGV4dDogc3RyaW5nLCBsb2NhdGlvbjogSVZpZXdwb3J0UmFuZ2UpOiB2b2lkO1xuICBsZWF2ZT8oZXZlbnQ6IE1vdXNlRXZlbnQsIHRleHQ6IHN0cmluZyk6IHZvaWQ7XG4gIHVybFJlZ2V4PzogUmVnRXhwO1xufVxuXG5leHBvcnQgY2xhc3MgV2ViTGlua1Byb3ZpZGVyIGltcGxlbWVudHMgSUxpbmtQcm92aWRlciB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlZ2V4OiBSZWdFeHAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGFuZGxlcjogKGV2ZW50OiBNb3VzZUV2ZW50LCB1cmk6IHN0cmluZykgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBJTGlua1Byb3ZpZGVyT3B0aW9ucyA9IHt9XG4gICkge1xuXG4gIH1cblxuICBwdWJsaWMgcHJvdmlkZUxpbmtzKHk6IG51bWJlciwgY2FsbGJhY2s6IChsaW5rczogSUxpbmtbXSB8IHVuZGVmaW5lZCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmtzID0gTGlua0NvbXB1dGVyLmNvbXB1dGVMaW5rKHksIHRoaXMuX3JlZ2V4LCB0aGlzLl90ZXJtaW5hbCwgdGhpcy5faGFuZGxlcik7XG4gICAgY2FsbGJhY2sodGhpcy5fYWRkQ2FsbGJhY2tzKGxpbmtzKSk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRDYWxsYmFja3MobGlua3M6IElMaW5rW10pOiBJTGlua1tdIHtcbiAgICByZXR1cm4gbGlua3MubWFwKGxpbmsgPT4ge1xuICAgICAgbGluay5sZWF2ZSA9IHRoaXMuX29wdGlvbnMubGVhdmU7XG4gICAgICBsaW5rLmhvdmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50LCB1cmk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5ob3Zlcikge1xuICAgICAgICAgIGNvbnN0IHsgcmFuZ2UgfSA9IGxpbms7XG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy5ob3ZlcihldmVudCwgdXJpLCByYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gbGluaztcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1VybCh1cmxTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTtcbiAgICBjb25zdCBwYXJzZWRCYXNlID0gdXJsLnBhc3N3b3JkICYmIHVybC51c2VybmFtZVxuICAgICAgPyBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC51c2VybmFtZX06JHt1cmwucGFzc3dvcmR9QCR7dXJsLmhvc3R9YFxuICAgICAgOiB1cmwudXNlcm5hbWVcbiAgICAgICAgPyBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC51c2VybmFtZX1AJHt1cmwuaG9zdH1gXG4gICAgICAgIDogYCR7dXJsLnByb3RvY29sfS8vJHt1cmwuaG9zdH1gO1xuICAgIHJldHVybiB1cmxTdHJpbmcudG9Mb2NhbGVMb3dlckNhc2UoKS5zdGFydHNXaXRoKHBhcnNlZEJhc2UudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmtDb21wdXRlciB7XG4gIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUxpbmsoeTogbnVtYmVyLCByZWdleDogUmVnRXhwLCB0ZXJtaW5hbDogVGVybWluYWwsIGFjdGl2YXRlOiAoZXZlbnQ6IE1vdXNlRXZlbnQsIHVyaTogc3RyaW5nKSA9PiB2b2lkKTogSUxpbmtbXSB7XG4gICAgY29uc3QgcmV4ID0gbmV3IFJlZ0V4cChyZWdleC5zb3VyY2UsIChyZWdleC5mbGFncyB8fCAnJykgKyAnZycpO1xuXG4gICAgY29uc3QgW2xpbmVzLCBzdGFydExpbmVJbmRleF0gPSBMaW5rQ29tcHV0ZXIuX2dldFdpbmRvd2VkTGluZVN0cmluZ3MoeSAtIDEsIHRlcm1pbmFsKTtcbiAgICBjb25zdCBsaW5lID0gbGluZXMuam9pbignJyk7XG5cbiAgICBsZXQgbWF0Y2g7XG4gICAgY29uc3QgcmVzdWx0OiBJTGlua1tdID0gW107XG5cbiAgICB3aGlsZSAobWF0Y2ggPSByZXguZXhlYyhsaW5lKSkge1xuICAgICAgY29uc3QgdGV4dCA9IG1hdGNoWzBdO1xuXG4gICAgICAvLyBjaGVjayB2aWEgVVJMIGlmIHRoZSBtYXRjaGVkIHRleHQgd291bGQgZm9ybSBhIHByb3BlciB1cmxcbiAgICAgIGlmICghaXNVcmwodGV4dCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIG1hcCBzdHJpbmcgcG9zaXRpb25zIGJhY2sgdG8gYnVmZmVyIHBvc2l0aW9uc1xuICAgICAgLy8gdmFsdWVzIGFyZSAwLWJhc2VkIHJpZ2h0IHNpZGUgZXhjbHVkaW5nXG4gICAgICBjb25zdCBbc3RhcnRZLCBzdGFydFhdID0gTGlua0NvbXB1dGVyLl9tYXBTdHJJZHgodGVybWluYWwsIHN0YXJ0TGluZUluZGV4LCAwLCBtYXRjaC5pbmRleCk7XG4gICAgICBjb25zdCBbZW5kWSwgZW5kWF0gPSBMaW5rQ29tcHV0ZXIuX21hcFN0cklkeCh0ZXJtaW5hbCwgc3RhcnRZLCBzdGFydFgsIHRleHQubGVuZ3RoKTtcblxuICAgICAgaWYgKHN0YXJ0WSA9PT0gLTEgfHwgc3RhcnRYID09PSAtMSB8fCBlbmRZID09PSAtMSB8fCBlbmRYID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcmFuZ2UgZXhwZWN0cyB2YWx1ZXMgMS1iYXNlZCByaWdodCBzaWRlIGluY2x1ZGluZywgdGh1cyArMSBleGNlcHQgZm9yIGVuZFhcbiAgICAgIGNvbnN0IHJhbmdlID0ge1xuICAgICAgICBzdGFydDoge1xuICAgICAgICAgIHg6IHN0YXJ0WCArIDEsXG4gICAgICAgICAgeTogc3RhcnRZICsgMVxuICAgICAgICB9LFxuICAgICAgICBlbmQ6IHtcbiAgICAgICAgICB4OiBlbmRYLFxuICAgICAgICAgIHk6IGVuZFkgKyAxXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdC5wdXNoKHsgcmFuZ2UsIHRleHQsIGFjdGl2YXRlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdyYXBwZWQgY29udGVudCBsaW5lcyBmb3IgdGhlIGN1cnJlbnQgbGluZSBpbmRleC5cbiAgICogVGhlIHRvcC9ib3R0b20gbGluZSBleHBhbnNpb24gc3RvcHMgYXQgd2hpdGVzcGFjZXMgb3IgbGVuZ3RoID4gMjA0OC5cbiAgICogUmV0dXJucyBhbiBhcnJheSB3aXRoIGxpbmUgc3RyaW5ncyBhbmQgdGhlIHRvcCBsaW5lIGluZGV4LlxuICAgKlxuICAgKiBOT1RFOiBXZSBwdWxsIGxpbmUgc3RyaW5ncyB3aXRoIHRyaW1SaWdodD10cnVlIG9uIHB1cnBvc2UgdG8gbWFrZSBzdXJlXG4gICAqIHRvIGNvcnJlY3RseSBtYXRjaCB1cmxzIHdpdGggZWFybHkgd3JhcHBlZCB3aWRlIGNoYXJzLiBUaGlzIGNvcnJ1cHRzIHRoZSBzdHJpbmcgaW5kZXhcbiAgICogZm9yIDE6MSBiYWNrbWFwcGluZyB0byBidWZmZXIgcG9zaXRpb25zLCB0aHVzIG5lZWRzIGFuIGFkZGl0aW9uYWwgY29ycmVjdGlvbiBpbiBfbWFwU3RySWR4LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFdpbmRvd2VkTGluZVN0cmluZ3MobGluZUluZGV4OiBudW1iZXIsIHRlcm1pbmFsOiBUZXJtaW5hbCk6IFtzdHJpbmdbXSwgbnVtYmVyXSB7XG4gICAgbGV0IGxpbmU6IElCdWZmZXJMaW5lIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0b3BJZHggPSBsaW5lSW5kZXg7XG4gICAgbGV0IGJvdHRvbUlkeCA9IGxpbmVJbmRleDtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBsZXQgY29udGVudCA9ICcnO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKChsaW5lID0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5nZXRMaW5lKGxpbmVJbmRleCkpKSB7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGxpbmUudHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSk7XG5cbiAgICAgIC8vIGV4cGFuZCB0b3AsIHN0b3Agb24gd2hpdGVzcGFjZXMgb3IgbGVuZ3RoID4gMjA0OFxuICAgICAgaWYgKGxpbmUuaXNXcmFwcGVkICYmIGN1cnJlbnRDb250ZW50WzBdICE9PSAnICcpIHtcbiAgICAgICAgbGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKChsaW5lID0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5nZXRMaW5lKC0tdG9wSWR4KSkgJiYgbGVuZ3RoIDwgMjA0OCkge1xuICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUpO1xuICAgICAgICAgIGxlbmd0aCArPSBjb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICBsaW5lcy5wdXNoKGNvbnRlbnQpO1xuICAgICAgICAgIGlmICghbGluZS5pc1dyYXBwZWQgfHwgY29udGVudC5pbmRleE9mKCcgJykgIT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucmV2ZXJzZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBhcHBlbmQgY3VycmVudCBsaW5lXG4gICAgICBsaW5lcy5wdXNoKGN1cnJlbnRDb250ZW50KTtcblxuICAgICAgLy8gZXhwYW5kIGJvdHRvbSwgc3RvcCBvbiB3aGl0ZXNwYWNlcyBvciBsZW5ndGggPiAyMDQ4XG4gICAgICBsZW5ndGggPSAwO1xuICAgICAgd2hpbGUgKChsaW5lID0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5nZXRMaW5lKCsrYm90dG9tSWR4KSkgJiYgbGluZS5pc1dyYXBwZWQgJiYgbGVuZ3RoIDwgMjA0OCkge1xuICAgICAgICBjb250ZW50ID0gbGluZS50cmFuc2xhdGVUb1N0cmluZyh0cnVlKTtcbiAgICAgICAgbGVuZ3RoICs9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICBsaW5lcy5wdXNoKGNvbnRlbnQpO1xuICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCcgJykgIT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtsaW5lcywgdG9wSWR4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBzdHJpbmcgaW5kZXggYmFjayB0byBidWZmZXIgcG9zaXRpb25zLlxuICAgKiBSZXR1cm5zIGJ1ZmZlciBwb3NpdGlvbiBhcyBbbGluZUluZGV4LCBjb2x1bW5JbmRleF0gMC1iYXNlZCxcbiAgICogb3IgWy0xLCAtMV0gaW4gY2FzZSB0aGUgbG9va3VwIHJhbiBpbnRvIGEgbm9uLWV4aXN0aW5nIGxpbmUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfbWFwU3RySWR4KHRlcm1pbmFsOiBUZXJtaW5hbCwgbGluZUluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIsIHN0cmluZ0luZGV4OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCBidWYgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlO1xuICAgIGNvbnN0IGNlbGwgPSBidWYuZ2V0TnVsbENlbGwoKTtcbiAgICBsZXQgc3RhcnQgPSByb3dJbmRleDtcbiAgICB3aGlsZSAoc3RyaW5nSW5kZXgpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBidWYuZ2V0TGluZShsaW5lSW5kZXgpO1xuICAgICAgaWYgKCFsaW5lKSB7XG4gICAgICAgIHJldHVybiBbLTEsIC0xXTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGxpbmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbGluZS5nZXRDZWxsKGksIGNlbGwpO1xuICAgICAgICBjb25zdCBjaGFycyA9IGNlbGwuZ2V0Q2hhcnMoKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICAgIHN0cmluZ0luZGV4IC09IGNoYXJzLmxlbmd0aCB8fCAxO1xuXG4gICAgICAgICAgLy8gY29ycmVjdCBzdHJpbmdJbmRleCBmb3IgZWFybHkgd3JhcHBlZCB3aWRlIGNoYXJzOlxuICAgICAgICAgIC8vIC0gY3VycmVudGx5IG9ubHkgaGFwcGVucyBhdCBsYXN0IGNlbGxcbiAgICAgICAgICAvLyAtIGNlbGxzIHRvIHRoZSByaWdodCBhcmUgcmVzZXQgd2l0aCBjaGFycz0nJyBhbmQgd2lkdGg9MSBpbiBJbnB1dEhhbmRsZXIucHJpbnRcbiAgICAgICAgICAvLyAtIGZvbGxvdy11cCBsaW5lIG11c3QgYmUgd3JhcHBlZCBhbmQgY29udGFpbiB3aWRlIGNoYXIgYXQgZmlyc3QgY2VsbFxuICAgICAgICAgIC8vIC0tPiBpZiBhbGwgdGhlc2UgY29uZGl0aW9ucyBhcmUgbWV0LCBjb3JyZWN0IHN0cmluZ0luZGV4IGJ5ICsxXG4gICAgICAgICAgaWYgKGkgPT09IGxpbmUubGVuZ3RoIC0gMSAmJiBjaGFycyA9PT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBidWYuZ2V0TGluZShsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIGlmIChsaW5lICYmIGxpbmUuaXNXcmFwcGVkKSB7XG4gICAgICAgICAgICAgIGxpbmUuZ2V0Q2VsbCgwLCBjZWxsKTtcbiAgICAgICAgICAgICAgaWYgKGNlbGwuZ2V0V2lkdGgoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgIHN0cmluZ0luZGV4ICs9IDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmluZ0luZGV4IDwgMCkge1xuICAgICAgICAgIHJldHVybiBbbGluZUluZGV4LCBpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGluZUluZGV4Kys7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBbbGluZUluZGV4LCBzdGFydF07XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB0eXBlIHsgVGVybWluYWwsIElUZXJtaW5hbEFkZG9uLCBJRGlzcG9zYWJsZSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IFdlYkxpbmtzQWRkb24gYXMgSVdlYkxpbmtzQXBpIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXdlYi1saW5rcyc7XG5pbXBvcnQgeyBJTGlua1Byb3ZpZGVyT3B0aW9ucywgV2ViTGlua1Byb3ZpZGVyIH0gZnJvbSAnLi9XZWJMaW5rUHJvdmlkZXInO1xuXG4vLyBjb25zaWRlciBldmVydGhpbmcgc3RhcnRpbmcgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vXG4vLyB1cCB0byBmaXJzdCB3aGl0ZXNwYWNlLCBgXCJgIG9yIGAnYCBhcyB1cmxcbi8vIE5PVEU6IFRoZSByZXBlYXRlZCBlbmQgY2xhdXNlIGlzIG5lZWRlZCB0byBub3QgbWF0Y2ggYSBkYW5nbGluZyBgOmBcbi8vIHJlc2VtYmxpbmcgdGhlIG9sZCAoLi4uKSooW146XCJcXCdcXFxcc10pIGZpbmFsIHBhdGggY2xhdXNlXG4vLyBhZGRpdGlvbmFsbHkgZXhjbHVkZSBlYXJseSArIGZpbmFsOlxuLy8gLSB1bnNhZmUgZnJvbSByZmMzOTg2OiAhKicoKVxuLy8gLSB1bnNhZmUgY2hhcnMgZnJvbSByZmMxNzM4OiB7fXxcXF5+W11gIChtaW51cyBbXSBhcyB3ZSBuZWVkIHRoZW0gZm9yIGlwdjYgYWRyZXNzZXMsIGFsc28gYWxsb3cgfilcbi8vIGFsc28gZXhjbHVkZSBhcyBmaW5hbHM6XG4vLyAtIGZpbmFsIGludGVycHVuY3Rpb24gbGlrZSAsLiE/XG4vLyAtIGFueSBzb3J0IG9mIGJyYWNrZXRzIDw+KClbXXt9IChub3Qgc3BlYyBjb25mb3JtLCBidXQgb2Z0ZW4gdXNlZCB0byBlbmNsb3NlIHVybHMpXG4vLyAtIHVuc2FmZSBjaGFycyBmcm9tIHJmYzE3Mzg6IHt9fFxcXn5bXWBcbmNvbnN0IHN0cmljdFVybFJlZ2V4ID0gLyhodHRwcz98SFRUUFM/KTpbL117Mn1bXlxcc1wiJyEqKCl7fXxcXFxcXFxePD5gXSpbXlxcc1wiJzosLiE/e318XFxcXFxcXn5cXFtcXF1gKCk8Pl0vO1xuXG5cbmZ1bmN0aW9uIGhhbmRsZUxpbmsoZXZlbnQ6IE1vdXNlRXZlbnQsIHVyaTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG5ld1dpbmRvdyA9IHdpbmRvdy5vcGVuKCk7XG4gIGlmIChuZXdXaW5kb3cpIHtcbiAgICB0cnkge1xuICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBuby1vcCwgRWxlY3Ryb24gY2FuIHRocm93XG4gICAgfVxuICAgIG5ld1dpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUud2FybignT3BlbmluZyBsaW5rIGJsb2NrZWQgYXMgb3BlbmVyIGNvdWxkIG5vdCBiZSBjbGVhcmVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYkxpbmtzQWRkb24gaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElXZWJMaW5rc0FwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGlua1Byb3ZpZGVyOiBJRGlzcG9zYWJsZSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9oYW5kbGVyOiAoZXZlbnQ6IE1vdXNlRXZlbnQsIHVyaTogc3RyaW5nKSA9PiB2b2lkID0gaGFuZGxlTGluayxcbiAgICBwcml2YXRlIF9vcHRpb25zOiBJTGlua1Byb3ZpZGVyT3B0aW9ucyA9IHt9XG4gICkge1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIHRoaXMuX3Rlcm1pbmFsID0gdGVybWluYWw7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnMgYXMgSUxpbmtQcm92aWRlck9wdGlvbnM7XG4gICAgY29uc3QgcmVnZXggPSBvcHRpb25zLnVybFJlZ2V4IHx8IHN0cmljdFVybFJlZ2V4O1xuICAgIHRoaXMuX2xpbmtQcm92aWRlciA9IHRoaXMuX3Rlcm1pbmFsLnJlZ2lzdGVyTGlua1Byb3ZpZGVyKG5ldyBXZWJMaW5rUHJvdmlkZXIodGhpcy5fdGVybWluYWwsIHJlZ2V4LCB0aGlzLl9oYW5kbGVyLCBvcHRpb25zKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5rUHJvdmlkZXI/LmRpc3Bvc2UoKTtcbiAgfVxufVxuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQ2FudmFzQWRkb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ2FudmFzQWRkb25cIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBDZWxsQ29sb3JSZXNvbHZlciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NlbGxDb2xvclJlc29sdmVyJztcbmltcG9ydCB7IGFjcXVpcmVUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNDYWNoZSc7XG5pbXBvcnQgeyBURVhUX0JBU0VMSU5FIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IHRyeURyYXdDdXN0b21DaGFyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3VzdG9tR2x5cGhzJztcbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9TZWxlY3Rpb25SZW5kZXJNb2RlbCc7XG5pbXBvcnQgeyBJUmFzdGVyaXplZEdseXBoLCBJUmVuZGVyRGltZW5zaW9ucywgSVNlbGVjdGlvblJlbmRlck1vZGVsLCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBmb3J3YXJkRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIE11dGFibGVEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IGlzU2FmYXJpIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcbmltcG9ydCB7IElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgV0hJVEVTUEFDRV9DRUxMX0NPREUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSVJlbmRlckxheWVyIH0gZnJvbSAnLi9UeXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuZGVyTGF5ZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVJlbmRlckxheWVyIHtcbiAgcHJpdmF0ZSBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJvdGVjdGVkIF9jdHghOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgX2RldmljZUNoYXJXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhckhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDaGFyTGVmdDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhclRvcDogbnVtYmVyID0gMDtcblxuICBwcm90ZWN0ZWQgX3NlbGVjdGlvbk1vZGVsOiBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgPSBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xuICBwcml2YXRlIF9jZWxsQ29sb3JSZXNvbHZlcjogQ2VsbENvbG9yUmVzb2x2ZXI7XG4gIHByaXZhdGUgX2JpdG1hcEdlbmVyYXRvcjogKEJpdG1hcEdlbmVyYXRvciB8IHVuZGVmaW5lZClbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBfY2hhckF0bGFzITogSVRleHR1cmVBdGxhcztcbiAgcHJvdGVjdGVkIF9jaGFyQXRsYXNEaXNwb3NhYmxlID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHVibGljIGdldCBjYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQgeyByZXR1cm4gdGhpcy5fY2FudmFzOyB9XG4gIHB1YmxpYyBnZXQgY2FjaGVDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQgeyByZXR1cm4gdGhpcy5fY2hhckF0bGFzPy5wYWdlc1swXS5jYW52YXMhOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHpJbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FscGhhOiBib29sZWFuLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyID0gbmV3IENlbGxDb2xvclJlc29sdmVyKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9vcHRpb25zU2VydmljZSwgdGhpcy5fc2VsZWN0aW9uTW9kZWwsIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UsIHRoaXMuX3RoZW1lU2VydmljZSk7XG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB0aGlzLl9jYW52YXMuY2xhc3NMaXN0LmFkZChgeHRlcm0tJHtpZH0tbGF5ZXJgKTtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUuekluZGV4ID0gekluZGV4LnRvU3RyaW5nKCk7XG4gICAgdGhpcy5faW5pdENhbnZhcygpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpO1xuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXModGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycyk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoZSA9PiB7XG4gICAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKGUpO1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgLy8gVHJpZ2dlciBzZWxlY3Rpb24gY2hhbmdlZCBhcyBpdCdzIGhhbmRsZWQgc2VwYXJhdGVseSB0byByZWd1bGFyIHJlbmRlcmluZ1xuICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblN0YXJ0LCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25FbmQsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNvbHVtblNlbGVjdE1vZGUpO1xuICAgIH0pKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbnZhcy5yZW1vdmUoKTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0Q2FudmFzKCk6IHZvaWQge1xuICAgIHRoaXMuX2N0eCA9IHRocm93SWZGYWxzeSh0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IGFscGhhOiB0aGlzLl9hbHBoYSB9KSk7XG4gICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZCBpZiB0aGlzIGlzIGFuIG9wYXF1ZSBsYXllclxuICAgIGlmICghdGhpcy5fYWxwaGEpIHtcbiAgICAgIHRoaXMuX2NsZWFyQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUJsdXIoKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlQ3Vyc29yTW92ZSgpOiB2b2lkIHt9XG4gIHB1YmxpYyBoYW5kbGVHcmlkQ2hhbmdlZChzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge31cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC51cGRhdGUoKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUsIHN0YXJ0LCBlbmQsIGNvbHVtblNlbGVjdE1vZGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXRUcmFuc3BhcmVuY3koYWxwaGE6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBEbyBub3RoaW5nIHdoZW4gYWxwaGEgZG9lc24ndCBjaGFuZ2VcbiAgICBpZiAoYWxwaGEgPT09IHRoaXMuX2FscGhhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG5ldyBjYW52YXMgYW5kIHJlcGxhY2Ugb2xkIG9uZVxuICAgIGNvbnN0IG9sZENhbnZhcyA9IHRoaXMuX2NhbnZhcztcbiAgICB0aGlzLl9hbHBoYSA9IGFscGhhO1xuICAgIC8vIENsb25pbmcgcHJlc2VydmVzIHByb3BlcnRpZXNcbiAgICB0aGlzLl9jYW52YXMgPSB0aGlzLl9jYW52YXMuY2xvbmVOb2RlKCkgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgdGhpcy5faW5pdENhbnZhcygpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5yZXBsYWNlQ2hpbGQodGhpcy5fY2FudmFzLCBvbGRDYW52YXMpO1xuXG4gICAgLy8gUmVnZW5lcmF0ZSBjaGFyIGF0bGFzIGFuZCBmb3JjZSBhIGZ1bGwgcmVkcmF3XG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcyh0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICB0aGlzLmhhbmRsZUdyaWRDaGFuZ2VkKDAsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgY2hhciBhdGxhcywgYXF1aXJpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIGNvbG9yU2V0IFRoZSBjb2xvciBzZXQgdG8gdXNlIGZvciB0aGUgY2hhciBhdGxhcy5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2hDaGFyQXRsYXMoY29sb3JTZXQ6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGV2aWNlQ2hhcldpZHRoIDw9IDAgJiYgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NoYXJBdGxhcyA9IGFjcXVpcmVUZXh0dXJlQXRsYXModGhpcy5fdGVybWluYWwsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMsIGNvbG9yU2V0LCB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsIHRoaXMuX2RldmljZUNoYXJXaWR0aCwgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gICAgdGhpcy5fY2hhckF0bGFzRGlzcG9zYWJsZS52YWx1ZSA9IGZvcndhcmRFdmVudCh0aGlzLl9jaGFyQXRsYXMub25BZGRUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzKTtcbiAgICB0aGlzLl9jaGFyQXRsYXMud2FybVVwKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jaGFyQXRsYXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2JpdG1hcEdlbmVyYXRvcltpXSA9IG5ldyBCaXRtYXBHZW5lcmF0b3IodGhpcy5fY2hhckF0bGFzLnBhZ2VzW2ldLmNhbnZhcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2l6ZShkaW06IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fZGV2aWNlQ2VsbFdpZHRoID0gZGltLmRldmljZS5jZWxsLndpZHRoO1xuICAgIHRoaXMuX2RldmljZUNlbGxIZWlnaHQgPSBkaW0uZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgIHRoaXMuX2RldmljZUNoYXJXaWR0aCA9IGRpbS5kZXZpY2UuY2hhci53aWR0aDtcbiAgICB0aGlzLl9kZXZpY2VDaGFySGVpZ2h0ID0gZGltLmRldmljZS5jaGFyLmhlaWdodDtcbiAgICB0aGlzLl9kZXZpY2VDaGFyTGVmdCA9IGRpbS5kZXZpY2UuY2hhci5sZWZ0O1xuICAgIHRoaXMuX2RldmljZUNoYXJUb3AgPSBkaW0uZGV2aWNlLmNoYXIudG9wO1xuICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IGRpbS5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBkaW0uZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLndpZHRoID0gYCR7ZGltLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtkaW0uY3NzLmNhbnZhcy5oZWlnaHR9cHhgO1xuXG4gICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZCBpZiB0aGlzIGlzIGFuIG9wYXF1ZSBsYXllclxuICAgIGlmICghdGhpcy5fYWxwaGEpIHtcbiAgICAgIHRoaXMuX2NsZWFyQWxsKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcyh0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZXNldCgpOiB2b2lkO1xuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFyQXRsYXM/LmNsZWFyVGV4dHVyZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIDErIGNlbGxzIGNvbXBsZXRlbHkuIFRoaXMgdXNlcyB0aGUgZXhpc3RpbmcgZmlsbFN0eWxlIG9uIHRoZSBjb250ZXh0LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIHN0YXJ0IGF0LlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIHN0YXJ0IGF0XG4gICAqIEBwYXJhbSB3aWR0aCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gZmlsbC5cbiAgICogQHBhcmFtIGhlaWdodCBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gZmlsbC5cbiAgICovXG4gIHByb3RlY3RlZCBfZmlsbENlbGxzKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgaGVpZ2h0ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsbHMgYSAxcHggbGluZSAoMnB4IG9uIEhEUEkpIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGNlbGwuIFRoaXMgdXNlcyB0aGVcbiAgICogZXhpc3RpbmcgZmlsbFN0eWxlIG9uIHRoZSBjb250ZXh0LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIGZpbGwuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gZmlsbC5cbiAgICovXG4gIHByb3RlY3RlZCBfZmlsbE1pZGRsZUxpbmVBdENlbGxzKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIGNvbnN0IGNlbGxPZmZzZXQgPSBNYXRoLmNlaWwodGhpcy5fZGV2aWNlQ2VsbEhlaWdodCAqIDAuNSk7XG4gICAgdGhpcy5fY3R4LmZpbGxSZWN0KFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICh5ICsgMSkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0IC0gY2VsbE9mZnNldCAtIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIsXG4gICAgICB3aWR0aCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIGEgMXB4IGxpbmUgKDJweCBvbiBIRFBJKSBhdCB0aGUgYm90dG9tIG9mIHRoZSBjZWxsLiBUaGlzIHVzZXMgdGhlXG4gICAqIGV4aXN0aW5nIGZpbGxTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBmaWxsLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIGZpbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2ZpbGxCb3R0b21MaW5lQXRDZWxscyh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciA9IDEsIHBpeGVsT2Zmc2V0OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmZpbGxSZWN0KFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICh5ICsgMSkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0ICsgcGl4ZWxPZmZzZXQgLSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByIC0gMSAvKiBFbnN1cmUgaXQncyBkcmF3biB3aXRoaW4gdGhlIGNlbGwgKi8sXG4gICAgICB3aWR0aCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jdXJseVVuZGVybGluZUF0Q2VsbCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguc2F2ZSgpO1xuICAgIHRoaXMuX2N0eC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLl9jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl9jdHguZmlsbFN0eWxlO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgdGhpcy5fY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICBmb3IgKGxldCB4T2Zmc2V0ID0gMDsgeE9mZnNldCA8IHdpZHRoOyB4T2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IHhMZWZ0ID0gKHggKyB4T2Zmc2V0KSAqIHRoaXMuX2RldmljZUNlbGxXaWR0aDtcbiAgICAgIGNvbnN0IHhNaWQgPSAoeCArIHhPZmZzZXQgKyAwLjUpICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgY29uc3QgeFJpZ2h0ID0gKHggKyB4T2Zmc2V0ICsgMSkgKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGg7XG4gICAgICBjb25zdCB5TWlkID0gKHkgKyAxKSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQgLSBsaW5lV2lkdGggLSAxO1xuICAgICAgY29uc3QgeU1pZEJvdCA9IHlNaWQgLSBsaW5lV2lkdGg7XG4gICAgICBjb25zdCB5TWlkVG9wID0geU1pZCArIGxpbmVXaWR0aDtcbiAgICAgIHRoaXMuX2N0eC5tb3ZlVG8oeExlZnQsIHlNaWQpO1xuICAgICAgdGhpcy5fY3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgIHhMZWZ0LCB5TWlkQm90LFxuICAgICAgICB4TWlkLCB5TWlkQm90LFxuICAgICAgICB4TWlkLCB5TWlkXG4gICAgICApO1xuICAgICAgdGhpcy5fY3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgIHhNaWQsIHlNaWRUb3AsXG4gICAgICAgIHhSaWdodCwgeU1pZFRvcCxcbiAgICAgICAgeFJpZ2h0LCB5TWlkXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9jdHguc3Ryb2tlKCk7XG4gICAgdGhpcy5fY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZG90dGVkVW5kZXJsaW5lQXRDZWxsKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5zYXZlKCk7XG4gICAgdGhpcy5fY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuX2N0eC5zdHJva2VTdHlsZSA9IHRoaXMuX2N0eC5maWxsU3R5bGU7XG4gICAgY29uc3QgbGluZVdpZHRoID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLl9jdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIHRoaXMuX2N0eC5zZXRMaW5lRGFzaChbbGluZVdpZHRoICogMiwgbGluZVdpZHRoXSk7XG4gICAgY29uc3QgeExlZnQgPSB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoO1xuICAgIGNvbnN0IHlNaWQgPSAoeSArIDEpICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCAtIGxpbmVXaWR0aCAtIDE7XG4gICAgdGhpcy5fY3R4Lm1vdmVUbyh4TGVmdCwgeU1pZCk7XG4gICAgZm9yIChsZXQgeE9mZnNldCA9IDA7IHhPZmZzZXQgPCB3aWR0aDsgeE9mZnNldCsrKSB7XG4gICAgICAvLyBjb25zdCB4TGVmdCA9IHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGg7XG4gICAgICBjb25zdCB4UmlnaHQgPSAoeCArIHdpZHRoICsgeE9mZnNldCkgKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGg7XG4gICAgICB0aGlzLl9jdHgubGluZVRvKHhSaWdodCwgeU1pZCk7XG4gICAgfVxuICAgIHRoaXMuX2N0eC5zdHJva2UoKTtcbiAgICB0aGlzLl9jdHguY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGFzaGVkVW5kZXJsaW5lQXRDZWxsKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5zYXZlKCk7XG4gICAgdGhpcy5fY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuX2N0eC5zdHJva2VTdHlsZSA9IHRoaXMuX2N0eC5maWxsU3R5bGU7XG4gICAgY29uc3QgbGluZVdpZHRoID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLl9jdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIHRoaXMuX2N0eC5zZXRMaW5lRGFzaChbbGluZVdpZHRoICogNCwgbGluZVdpZHRoICogM10pO1xuICAgIGNvbnN0IHhMZWZ0ID0geCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aDtcbiAgICBjb25zdCB4UmlnaHQgPSAoeCArIHdpZHRoKSAqIHRoaXMuX2RldmljZUNlbGxXaWR0aDtcbiAgICBjb25zdCB5TWlkID0gKHkgKyAxKSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQgLSBsaW5lV2lkdGggLSAxO1xuICAgIHRoaXMuX2N0eC5tb3ZlVG8oeExlZnQsIHlNaWQpO1xuICAgIHRoaXMuX2N0eC5saW5lVG8oeFJpZ2h0LCB5TWlkKTtcbiAgICB0aGlzLl9jdHguc3Ryb2tlKCk7XG4gICAgdGhpcy5fY3R4LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2N0eC5yZXN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsbHMgYSAxcHggbGluZSAoMnB4IG9uIEhEUEkpIGF0IHRoZSBsZWZ0IG9mIHRoZSBjZWxsLiBUaGlzIHVzZXMgdGhlXG4gICAqIGV4aXN0aW5nIGZpbGxTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBmaWxsLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIGZpbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2ZpbGxMZWZ0TGluZUF0Q2VsbCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIgKiB3aWR0aCxcbiAgICAgIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cm9rZXMgYSAxcHggcmVjdGFuZ2xlICgycHggb24gSERQSSkgYXJvdW5kIGEgY2VsbC4gVGhpcyB1c2VzIHRoZSBleGlzdGluZ1xuICAgKiBzdHJva2VTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBmaWxsLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIGZpbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3N0cm9rZVJlY3RBdENlbGwoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbGluZVdpZHRoID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLl9jdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIHRoaXMuX2N0eC5zdHJva2VSZWN0KFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCArIGxpbmVXaWR0aCAvIDIsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCArIChsaW5lV2lkdGggLyAyKSxcbiAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoIC0gbGluZVdpZHRoLFxuICAgICAgKGhlaWdodCAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpIC0gbGluZVdpZHRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NsZWFyQWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICAgIHRoaXMuX2N0eC5maWxsUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgMSsgY2VsbHMgY29tcGxldGVseS5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIHdpZHRoIFRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBjbGVhci5cbiAgICogQHBhcmFtIGhlaWdodCBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gY2xlYXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NsZWFyQ2VsbHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jdHguY2xlYXJSZWN0KFxuICAgICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAgIGhlaWdodCAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsXG4gICAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICBoZWlnaHQgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSB0cnVlY29sb3IgY2hhcmFjdGVyIGF0IHRoZSBjZWxsLiBUaGUgY2hhcmFjdGVyIHdpbGwgYmUgY2xpcHBlZCB0b1xuICAgKiBlbnN1cmUgdGhhdCBpdCBmaXRzIHdpdGggdGhlIGNlbGwsIGluY2x1ZGluZyB0aGUgY2VsbCB0byB0aGUgcmlnaHQgaWYgaXQnc1xuICAgKiBhIHdpZGUgY2hhcmFjdGVyLiBUaGlzIHVzZXMgdGhlIGV4aXN0aW5nIGZpbGxTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgZGF0YSBmb3IgdGhlIGNoYXJhY3RlciB0byBkcmF3LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIGRyYXcgYXQuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gZHJhdyBhdC5cbiAgICovXG4gIHByb3RlY3RlZCBfZmlsbENoYXJUcnVlQ29sb3IoY2VsbDogQ2VsbERhdGEsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmZvbnQgPSB0aGlzLl9nZXRGb250KGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5fY3R4LnRleHRCYXNlbGluZSA9IFRFWFRfQkFTRUxJTkU7XG4gICAgdGhpcy5fY2xpcFJvdyh5KTtcblxuICAgIC8vIERyYXcgY3VzdG9tIGNoYXJhY3RlcnMgaWYgYXBwbGljYWJsZVxuICAgIGxldCBkcmF3U3VjY2VzcyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1c3RvbUdseXBocyAhPT0gZmFsc2UpIHtcbiAgICAgIGRyYXdTdWNjZXNzID0gdHJ5RHJhd0N1c3RvbUNoYXIodGhpcy5fY3R4LCBjZWxsLmdldENoYXJzKCksIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsIHkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0LCB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemUsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIGNoYXJhY3RlclxuICAgIGlmICghZHJhd1N1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsVGV4dChcbiAgICAgICAgY2VsbC5nZXRDaGFycygpLFxuICAgICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoICsgdGhpcy5fZGV2aWNlQ2hhckxlZnQsXG4gICAgICAgIHkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0ICsgdGhpcy5fZGV2aWNlQ2hhclRvcCArIHRoaXMuX2RldmljZUNoYXJIZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGF0IGEgY2VsbC4gSWYgcG9zc2libGUgdGhpcyB3aWxsIGRyYXcgdXNpbmdcbiAgICogdGhlIGNoYXJhY3RlciBhdGxhcyB0byByZWR1Y2UgZHJhdyB0aW1lLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9kcmF3Q2hhcnMoY2VsbDogSUNlbGxEYXRhLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNoYXJzID0gY2VsbC5nZXRDaGFycygpO1xuICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc29sdmUoY2VsbCwgeCwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AgKyB5LCB0aGlzLl9kZXZpY2VDZWxsV2lkdGgpO1xuXG4gICAgaWYgKCF0aGlzLl9jaGFyQXRsYXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZ2x5cGg6IElSYXN0ZXJpemVkR2x5cGg7XG4gICAgaWYgKGNoYXJzICYmIGNoYXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGdseXBoID0gdGhpcy5fY2hhckF0bGFzLmdldFJhc3Rlcml6ZWRHbHlwaENvbWJpbmVkQ2hhcihjaGFycywgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnLCB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZmcsIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbHlwaCA9IHRoaXMuX2NoYXJBdGxhcy5nZXRSYXN0ZXJpemVkR2x5cGgoY2VsbC5nZXRDb2RlKCkgfHwgV0hJVEVTUEFDRV9DRUxMX0NPREUsIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZywgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnLCB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZXh0LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKCFnbHlwaC5zaXplLnggfHwgIWdseXBoLnNpemUueSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jdHguc2F2ZSgpO1xuICAgIHRoaXMuX2NsaXBSb3coeSk7XG5cbiAgICAvLyBEcmF3IHRoZSBpbWFnZSwgdXNlIHRoZSBiaXRtYXAgaWYgaXQncyBhdmFpbGFibGVcblxuICAgIC8vIEhBQ0s6IElmIHRoZSBjYW52YXMgZG9lc24ndCBtYXRjaCwgZGVsZXRlIHRoZSBnZW5lcmF0b3IuIEl0J3Mgbm90IGNsZWFyIGhvdyB0aGlzIGhhcHBlbnMgYnV0XG4gICAgLy8gc29tZXRoaW5nIGlzIHdyb25nIHdpdGggZWl0aGVyIHRoZSBsaWZlY3ljbGUgb2YgX2JpdG1hcEdlbmVyYXRvciBvciB0aGUgcGFnZSBjYW52YXNlcyBhcmVcbiAgICAvLyBzd2FwcGVkIG91dCB1bmV4cGVjdGVkbHlcbiAgICBpZiAodGhpcy5fYml0bWFwR2VuZXJhdG9yW2dseXBoLnRleHR1cmVQYWdlXSAmJiB0aGlzLl9jaGFyQXRsYXMucGFnZXNbZ2x5cGgudGV4dHVyZVBhZ2VdLmNhbnZhcyAhPT0gdGhpcy5fYml0bWFwR2VuZXJhdG9yW2dseXBoLnRleHR1cmVQYWdlXSEuY2FudmFzKSB7XG4gICAgICB0aGlzLl9iaXRtYXBHZW5lcmF0b3JbZ2x5cGgudGV4dHVyZVBhZ2VdPy5iaXRtYXA/LmNsb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5fYml0bWFwR2VuZXJhdG9yW2dseXBoLnRleHR1cmVQYWdlXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2hhckF0bGFzLnBhZ2VzW2dseXBoLnRleHR1cmVQYWdlXS52ZXJzaW9uICE9PSB0aGlzLl9iaXRtYXBHZW5lcmF0b3JbZ2x5cGgudGV4dHVyZVBhZ2VdPy52ZXJzaW9uKSB7XG4gICAgICBpZiAoIXRoaXMuX2JpdG1hcEdlbmVyYXRvcltnbHlwaC50ZXh0dXJlUGFnZV0pIHtcbiAgICAgICAgdGhpcy5fYml0bWFwR2VuZXJhdG9yW2dseXBoLnRleHR1cmVQYWdlXSA9IG5ldyBCaXRtYXBHZW5lcmF0b3IodGhpcy5fY2hhckF0bGFzLnBhZ2VzW2dseXBoLnRleHR1cmVQYWdlXS5jYW52YXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYml0bWFwR2VuZXJhdG9yW2dseXBoLnRleHR1cmVQYWdlXSEucmVmcmVzaCgpO1xuICAgICAgdGhpcy5fYml0bWFwR2VuZXJhdG9yW2dseXBoLnRleHR1cmVQYWdlXSEudmVyc2lvbiA9IHRoaXMuX2NoYXJBdGxhcy5wYWdlc1tnbHlwaC50ZXh0dXJlUGFnZV0udmVyc2lvbjtcbiAgICB9XG4gICAgdGhpcy5fY3R4LmRyYXdJbWFnZShcbiAgICAgIHRoaXMuX2JpdG1hcEdlbmVyYXRvcltnbHlwaC50ZXh0dXJlUGFnZV0/LmJpdG1hcCB8fCB0aGlzLl9jaGFyQXRsYXMhLnBhZ2VzW2dseXBoLnRleHR1cmVQYWdlXS5jYW52YXMsXG4gICAgICBnbHlwaC50ZXh0dXJlUG9zaXRpb24ueCxcbiAgICAgIGdseXBoLnRleHR1cmVQb3NpdGlvbi55LFxuICAgICAgZ2x5cGguc2l6ZS54LFxuICAgICAgZ2x5cGguc2l6ZS55LFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCArIHRoaXMuX2RldmljZUNoYXJMZWZ0IC0gZ2x5cGgub2Zmc2V0LngsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCArIHRoaXMuX2RldmljZUNoYXJUb3AgLSBnbHlwaC5vZmZzZXQueSxcbiAgICAgIGdseXBoLnNpemUueCxcbiAgICAgIGdseXBoLnNpemUueVxuICAgICk7XG4gICAgdGhpcy5fY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlwcyBhIHJvdyB0byBlbnN1cmUgbm8gcGl4ZWxzIHdpbGwgYmUgZHJhd24gb3V0c2lkZSB0aGUgY2VsbHMgaW4gdGhlIHJvdy5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBjbGlwLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpcFJvdyh5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguYmVnaW5QYXRoKCk7XG4gICAgdGhpcy5fY3R4LnJlY3QoXG4gICAgICAwLFxuICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsXG4gICAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICB0aGlzLl9jdHguY2xpcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZm9udC5cbiAgICogQHBhcmFtIGlzQm9sZCBJZiB3ZSBzaG91bGQgdXNlIHRoZSBib2xkIGZvbnRXZWlnaHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2dldEZvbnQoaXNCb2xkOiBib29sZWFuLCBpc0l0YWxpYzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9udFdlaWdodCA9IGlzQm9sZCA/IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodEJvbGQgOiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHQ7XG4gICAgY29uc3QgZm9udFN0eWxlID0gaXNJdGFsaWMgPyAnaXRhbGljJyA6ICcnO1xuXG4gICAgcmV0dXJuIGAke2ZvbnRTdHlsZX0gJHtmb250V2VpZ2h0fSAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemUgKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByfXB4ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBJbWFnZUJpdG1hcCwgdGhpcyBpcyB0byBkZWJvdW5jZS9iYXRjaFxuICogdGhlIG9wZXJhdGlvbiBhcyB3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAgaXMgYXN5bmNocm9ub3VzLlxuICovXG5jb25zdCBHTFlQSF9CSVRNQVBfQ09NTUlUX0RFTEFZID0gMTAwO1xuXG5jb25zdCBlbnVtIEJpdG1hcEdlbmVyYXRvclN0YXRlIHtcbiAgSURMRSA9IDAsXG4gIEdFTkVSQVRJTkcgPSAxLFxuICBHRU5FUkFUSU5HX0lOVkFMSUQgPSAyXG59XG5cbmNsYXNzIEJpdG1hcEdlbmVyYXRvciB7XG4gIHByaXZhdGUgX3N0YXRlOiBCaXRtYXBHZW5lcmF0b3JTdGF0ZSA9IEJpdG1hcEdlbmVyYXRvclN0YXRlLklETEU7XG4gIHByaXZhdGUgX2NvbW1pdFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYml0bWFwOiBJbWFnZUJpdG1hcCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHVibGljIGdldCBiaXRtYXAoKTogSW1hZ2VCaXRtYXAgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fYml0bWFwOyB9XG4gIHB1YmxpYyB2ZXJzaW9uOiBudW1iZXIgPSAtMTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIGJpdG1hcCBpbW1lZGlhdGVseSBhcyBpdCdzIHN0YWxlXG4gICAgdGhpcy5fYml0bWFwPy5jbG9zZSgpO1xuICAgIHRoaXMuX2JpdG1hcCA9IHVuZGVmaW5lZDtcbiAgICAvLyBEaXNhYmxlIEltYWdlQml0bWFwcyBvbiBTYWZhcmkgYmVjYXVzZSBvZiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5OTkwXG4gICAgaWYgKGlzU2FmYXJpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21taXRUaW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NvbW1pdFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLl9nZW5lcmF0ZSgpLCBHTFlQSF9CSVRNQVBfQ09NTUlUX0RFTEFZKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBCaXRtYXBHZW5lcmF0b3JTdGF0ZS5HRU5FUkFUSU5HKSB7XG4gICAgICB0aGlzLl9zdGF0ZSA9IEJpdG1hcEdlbmVyYXRvclN0YXRlLkdFTkVSQVRJTkdfSU5WQUxJRDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZW5lcmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IEJpdG1hcEdlbmVyYXRvclN0YXRlLklETEUpIHtcbiAgICAgIHRoaXMuX2JpdG1hcD8uY2xvc2UoKTtcbiAgICAgIHRoaXMuX2JpdG1hcCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N0YXRlID0gQml0bWFwR2VuZXJhdG9yU3RhdGUuR0VORVJBVElORztcbiAgICAgIHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmNhbnZhcykudGhlbihiaXRtYXAgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IEJpdG1hcEdlbmVyYXRvclN0YXRlLkdFTkVSQVRJTkdfSU5WQUxJRCkge1xuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2JpdG1hcCA9IGJpdG1hcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSA9IEJpdG1hcEdlbmVyYXRvclN0YXRlLklETEU7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLl9jb21taXRUaW1lb3V0KSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElMaW5raWZpZXIyIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyByZW1vdmVUZXJtaW5hbEZyb21DYWNoZSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc0NhY2hlJztcbmltcG9ydCB7IG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9EZXZpY2VQaXhlbE9ic2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zLCBJUmVuZGVyZXIsIElSZXF1ZXN0UmVkcmF3RXZlbnQgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBmb3J3YXJkRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIE11dGFibGVEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJQ29yZVNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEN1cnNvclJlbmRlckxheWVyIH0gZnJvbSAnLi9DdXJzb3JSZW5kZXJMYXllcic7XG5pbXBvcnQgeyBMaW5rUmVuZGVyTGF5ZXIgfSBmcm9tICcuL0xpbmtSZW5kZXJMYXllcic7XG5pbXBvcnQgeyBTZWxlY3Rpb25SZW5kZXJMYXllciB9IGZyb20gJy4vU2VsZWN0aW9uUmVuZGVyTGF5ZXInO1xuaW1wb3J0IHsgVGV4dFJlbmRlckxheWVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyTGF5ZXInO1xuaW1wb3J0IHsgSVJlbmRlckxheWVyIH0gZnJvbSAnLi9UeXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDYW52YXNSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJUmVuZGVyZXIge1xuICBwcml2YXRlIF9yZW5kZXJMYXllcnM6IElSZW5kZXJMYXllcltdO1xuICBwcml2YXRlIF9kZXZpY2VQaXhlbFJhdGlvOiBudW1iZXI7XG4gIHByaXZhdGUgX29ic2VydmVyRGlzcG9zYWJsZSA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHB1YmxpYyBkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZWRyYXcgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SVJlcXVlc3RSZWRyYXdFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZWRyYXcgPSB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGxpbmtpZmllcjI6IElMaW5raWZpZXIyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJTaXplU2VydmljZTogSUNoYXJTaXplU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIGNoYXJhY3RlckpvaW5lclNlcnZpY2U6IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLFxuICAgIGNvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIGRlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgYWxsb3dUcmFuc3BhcmVuY3kgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmFsbG93VHJhbnNwYXJlbmN5O1xuICAgIHRoaXMuX3JlbmRlckxheWVycyA9IFtcbiAgICAgIG5ldyBUZXh0UmVuZGVyTGF5ZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX3NjcmVlbkVsZW1lbnQsIDAsIGFsbG93VHJhbnNwYXJlbmN5LCB0aGlzLl9idWZmZXJTZXJ2aWNlLCB0aGlzLl9vcHRpb25zU2VydmljZSwgY2hhcmFjdGVySm9pbmVyU2VydmljZSwgZGVjb3JhdGlvblNlcnZpY2UsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSwgX3RoZW1lU2VydmljZSksXG4gICAgICBuZXcgU2VsZWN0aW9uUmVuZGVyTGF5ZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX3NjcmVlbkVsZW1lbnQsIDEsIHRoaXMuX2J1ZmZlclNlcnZpY2UsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSwgZGVjb3JhdGlvblNlcnZpY2UsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCBfdGhlbWVTZXJ2aWNlKSxcbiAgICAgIG5ldyBMaW5rUmVuZGVyTGF5ZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX3NjcmVlbkVsZW1lbnQsIDIsIGxpbmtpZmllcjIsIHRoaXMuX2J1ZmZlclNlcnZpY2UsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCBkZWNvcmF0aW9uU2VydmljZSwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLCBfdGhlbWVTZXJ2aWNlKSxcbiAgICAgIG5ldyBDdXJzb3JSZW5kZXJMYXllcih0aGlzLl90ZXJtaW5hbCwgdGhpcy5fc2NyZWVuRWxlbWVudCwgMywgdGhpcy5fb25SZXF1ZXN0UmVkcmF3LCB0aGlzLl9idWZmZXJTZXJ2aWNlLCB0aGlzLl9vcHRpb25zU2VydmljZSwgY29yZVNlcnZpY2UsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSwgZGVjb3JhdGlvblNlcnZpY2UsIF90aGVtZVNlcnZpY2UpXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgZm9yd2FyZEV2ZW50KGxheWVyLm9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLCB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyk7XG4gICAgfVxuICAgIHRoaXMuZGltZW5zaW9ucyA9IGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG5cbiAgICB0aGlzLl9vYnNlcnZlckRpc3Bvc2FibGUudmFsdWUgPSBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHRoaXMuX3JlbmRlckxheWVyc1swXS5jYW52YXMsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3csICh3LCBoKSA9PiB0aGlzLl9zZXRDYW52YXNEZXZpY2VQaXhlbERpbWVuc2lvbnModywgaCkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm9uV2luZG93Q2hhbmdlKHcgPT4ge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJEaXNwb3NhYmxlLnZhbHVlID0gb2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyh0aGlzLl9yZW5kZXJMYXllcnNbMF0uY2FudmFzLCB3LCAodywgaCkgPT4gdGhpcy5fc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHcsIGgpKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICAgIGwuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGhpcy5fdGVybWluYWwpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGV4dHVyZUF0bGFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyTGF5ZXJzWzBdLmNhY2hlQ2FudmFzO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGRldmljZSBwaXhlbCByYXRpbyBjaGFuZ2VkLCB0aGUgY2hhciBhdGxhcyBuZWVkcyB0byBiZSByZWdlbmVyYXRlZFxuICAgIC8vIGFuZCB0aGUgdGVybWluYWwgbmVlZHMgdG8gcmVmcmVzaGVkXG4gICAgaWYgKHRoaXMuX2RldmljZVBpeGVsUmF0aW8gIT09IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpIHtcbiAgICAgIHRoaXMuX2RldmljZVBpeGVsUmF0aW8gPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByO1xuICAgICAgdGhpcy5oYW5kbGVSZXNpemUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgY2hhcmFjdGVyIGFuZCBjYW52YXMgZGltZW5zaW9uc1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcblxuICAgIC8vIFJlc2l6ZSBhbGwgcmVuZGVyIGxheWVyc1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwucmVzaXplKHRoaXMuZGltZW5zaW9ucyk7XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIHRoZSBzY3JlZW5cbiAgICB0aGlzLl9zY3JlZW5FbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0fXB4YDtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVSZXNpemUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcnVuT3BlcmF0aW9uKGwgPT4gbC5oYW5kbGVCbHVyKCkpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3J1bk9wZXJhdGlvbihsID0+IGwuaGFuZGxlRm9jdXMoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLl9ydW5PcGVyYXRpb24obCA9PiBsLmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSkpO1xuICAgIC8vIFNlbGVjdGlvbiBmb3JlZ3JvdW5kIHJlcXVpcmVzIGEgZnVsbCByZS1yZW5kZXJcbiAgICBpZiAodGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kKSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZmlyZSh7IHN0YXJ0OiAwLCBlbmQ6IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUN1cnNvck1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5fcnVuT3BlcmF0aW9uKGwgPT4gbC5oYW5kbGVDdXJzb3JNb3ZlKCkpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX3J1bk9wZXJhdGlvbihsID0+IGwucmVzZXQoKSk7XG4gIH1cblxuICBwcml2YXRlIF9ydW5PcGVyYXRpb24ob3BlcmF0aW9uOiAobGF5ZXI6IElSZW5kZXJMYXllcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIG9wZXJhdGlvbihsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIHJlZnJlc2ggbG9vcCBjYWxsYmFjaywgY2FsbGluZyByZWZyZXNoIG9ubHkgaWYgYSByZWZyZXNoIGlzXG4gICAqIG5lY2Vzc2FyeSBiZWZvcmUgcXVldWVpbmcgdXAgdGhlIG5leHQgb25lLlxuICAgKi9cbiAgcHVibGljIHJlbmRlclJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLmhhbmRsZUdyaWRDaGFuZ2VkKHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgbGF5ZXIuY2xlYXJUZXh0dXJlQXRsYXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGVzIHRoZSBjaGFyYWN0ZXIgYW5kIGNhbnZhcyBkaW1lbnNpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlRGltZW5zaW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWUgdGhlIFdlYkdMIHJlbmRlcmVyIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIHNlY3Rpb24uXG4gICAgY29uc3QgZHByID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggPSBNYXRoLmZsb29yKHRoaXMuX2NoYXJTaXplU2VydmljZS53aWR0aCAqIGRwcik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0ICogZHByKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIuaGVpZ2h0ICogdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5saW5lSGVpZ2h0KTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIudG9wID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5saW5lSGVpZ2h0ID09PSAxID8gMCA6IE1hdGgucm91bmQoKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgLSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIuaGVpZ2h0KSAvIDIpO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCArIE1hdGgucm91bmQodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIubGVmdCA9IE1hdGguZmxvb3IodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nIC8gMik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzICogdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodDtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAqIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aDtcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCAvIGRwcik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoIC8gZHByKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0ID0gdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0IC8gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgLy8gUmVzaXplIGFsbCByZW5kZXIgbGF5ZXJzXG4gICAgZm9yIChjb25zdCBsIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgbC5yZXNpemUodGhpcy5kaW1lbnNpb25zKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVkcmF3LmZpcmUoeyBzdGFydDogMCwgZW5kOiB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXInO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMsIElSZXF1ZXN0UmVkcmF3RXZlbnQgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBNdXRhYmxlRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgaXNGaXJlZm94IH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcbmltcG9ydCB7IElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElDb3JlU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgQmFzZVJlbmRlckxheWVyIH0gZnJvbSAnLi9CYXNlUmVuZGVyTGF5ZXInO1xuXG5pbnRlcmZhY2UgSUN1cnNvclN0YXRlIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgc3R5bGU6IHN0cmluZztcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEN1cnNvclJlbmRlckxheWVyIGV4dGVuZHMgQmFzZVJlbmRlckxheWVyIHtcbiAgcHJpdmF0ZSBfc3RhdGU6IElDdXJzb3JTdGF0ZTtcbiAgcHJpdmF0ZSBfY3Vyc29yUmVuZGVyZXJzOiB7W2tleTogc3RyaW5nXTogKHg6IG51bWJlciwgeTogbnVtYmVyLCBjZWxsOiBJQ2VsbERhdGEpID0+IHZvaWR9O1xuICBwcml2YXRlIF9jdXJzb3JCbGlua1N0YXRlTWFuYWdlcjogTXV0YWJsZURpc3Bvc2FibGU8Q3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXI+ID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG4gIHByaXZhdGUgX2NlbGw6IElDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHpJbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFJlZHJhdzogSUV2ZW50RW1pdHRlcjxJUmVxdWVzdFJlZHJhd0V2ZW50PixcbiAgICBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIGRlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHRlcm1pbmFsLCBjb250YWluZXIsICdjdXJzb3InLCB6SW5kZXgsIHRydWUsIHRoZW1lU2VydmljZSwgYnVmZmVyU2VydmljZSwgb3B0aW9uc1NlcnZpY2UsIGRlY29yYXRpb25TZXJ2aWNlLCBjb3JlQnJvd3NlclNlcnZpY2UpO1xuICAgIHRoaXMuX3N0YXRlID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc3R5bGU6ICcnLFxuICAgICAgd2lkdGg6IDBcbiAgICB9O1xuICAgIHRoaXMuX2N1cnNvclJlbmRlcmVycyA9IHtcbiAgICAgICdiYXInOiB0aGlzLl9yZW5kZXJCYXJDdXJzb3IuYmluZCh0aGlzKSxcbiAgICAgICdibG9jayc6IHRoaXMuX3JlbmRlckJsb2NrQ3Vyc29yLmJpbmQodGhpcyksXG4gICAgICAndW5kZXJsaW5lJzogdGhpcy5fcmVuZGVyVW5kZXJsaW5lQ3Vyc29yLmJpbmQodGhpcyksXG4gICAgICAnb3V0bGluZSc6IHRoaXMuX3JlbmRlck91dGxpbmVDdXJzb3IuYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RlcihvcHRpb25zU2VydmljZS5vbk9wdGlvbkNoYW5nZSgoKSA9PiB0aGlzLl9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpKSk7XG4gICAgdGhpcy5faGFuZGxlT3B0aW9uc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoZGltOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHN1cGVyLnJlc2l6ZShkaW0pO1xuICAgIC8vIFJlc2l6aW5nIHRoZSBjYW52YXMgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMgc28gY2xlYXIgc3RhdGVcbiAgICB0aGlzLl9zdGF0ZSA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgaXNGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHN0eWxlOiAnJyxcbiAgICAgIHdpZHRoOiAwXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhckN1cnNvcigpO1xuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgICB0aGlzLl9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWU/LnBhdXNlKCk7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVkcmF3LmZpcmUoeyBzdGFydDogdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueSwgZW5kOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55IH0pO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN1bWUoKTtcbiAgICB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZmlyZSh7IHN0YXJ0OiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55LCBlbmQ6IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnkgfSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JCbGluaykge1xuICAgICAgaWYgKCF0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZSkge1xuICAgICAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZSA9IG5ldyBDdXJzb3JCbGlua1N0YXRlTWFuYWdlcigoKSA9PiB0aGlzLl9yZW5kZXIodHJ1ZSksIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLmNsZWFyKCk7XG4gICAgfVxuICAgIC8vIFJlcXVlc3QgYSByZWZyZXNoIGZyb20gdGhlIHRlcm1pbmFsIGFzIG1hbmFnZW1lbnQgb2YgcmVuZGVyaW5nIGlzIGJlaW5nXG4gICAgLy8gbW92ZWQgYmFjayB0byB0aGUgdGVybWluYWxcbiAgICB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZmlyZSh7IHN0YXJ0OiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55LCBlbmQ6IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnkgfSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ3Vyc29yTW92ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlR3JpZENoYW5nZWQoc3RhcnRSb3c6IG51bWJlciwgZW5kUm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlIHx8IHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlLmlzUGF1c2VkKSB7XG4gICAgICB0aGlzLl9yZW5kZXIoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZS5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXIodHJpZ2dlcmVkQnlBbmltYXRpb25GcmFtZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIERvbid0IGRyYXcgdGhlIGN1cnNvciBpZiBpdCdzIGhpZGRlblxuICAgIGlmICghdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCB8fCB0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbikge1xuICAgICAgdGhpcy5fY2xlYXJDdXJzb3IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JZID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgKyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55O1xuICAgIGNvbnN0IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZID0gY3Vyc29yWSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuXG4gICAgLy8gRG9uJ3QgZHJhdyB0aGUgY3Vyc29yIGlmIGl0J3Mgb2ZmLXNjcmVlblxuICAgIGlmICh2aWV3cG9ydFJlbGF0aXZlQ3Vyc29yWSA8IDAgfHwgdmlld3BvcnRSZWxhdGl2ZUN1cnNvclkgPj0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKSB7XG4gICAgICB0aGlzLl9jbGVhckN1cnNvcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGluIGNhc2UgY3Vyc29yLnggPT0gY29scyBhZGp1c3QgdmlzdWFsIGN1cnNvciB0byBjb2xzIC0gMVxuICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci54LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKTtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQoY3Vyc29yWSkhLmxvYWRDZWxsKGN1cnNvclgsIHRoaXMuX2NlbGwpO1xuICAgIGlmICh0aGlzLl9jZWxsLmNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCkge1xuICAgICAgdGhpcy5fY2xlYXJDdXJzb3IoKTtcbiAgICAgIHRoaXMuX2N0eC5zYXZlKCk7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jdXJzb3IuY3NzO1xuICAgICAgY29uc3QgY3Vyc29yU3R5bGUgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvclN0eWxlO1xuICAgICAgY29uc3QgY3Vyc29ySW5hY3RpdmVTdHlsZSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgICAgIGlmIChjdXJzb3JJbmFjdGl2ZVN0eWxlICYmIGN1cnNvckluYWN0aXZlU3R5bGUgIT09ICdub25lJykge1xuICAgICAgICB0aGlzLl9jdXJzb3JSZW5kZXJlcnNbY3Vyc29ySW5hY3RpdmVTdHlsZV0oY3Vyc29yWCwgdmlld3BvcnRSZWxhdGl2ZUN1cnNvclksIHRoaXMuX2NlbGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuX3N0YXRlLnggPSBjdXJzb3JYO1xuICAgICAgdGhpcy5fc3RhdGUueSA9IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZO1xuICAgICAgdGhpcy5fc3RhdGUuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zdGF0ZS5zdHlsZSA9IGN1cnNvclN0eWxlO1xuICAgICAgdGhpcy5fc3RhdGUud2lkdGggPSB0aGlzLl9jZWxsLmdldFdpZHRoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgZHJhdyB0aGUgY3Vyc29yIGlmIGl0J3MgYmxpbmtpbmdcbiAgICBpZiAodGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUgJiYgIXRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlLmlzQ3Vyc29yVmlzaWJsZSkge1xuICAgICAgdGhpcy5fY2xlYXJDdXJzb3IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIC8vIFRoZSBjdXJzb3IgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBzcG90LCBkb24ndCByZWRyYXdcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS54ID09PSBjdXJzb3JYICYmXG4gICAgICAgICAgdGhpcy5fc3RhdGUueSA9PT0gdmlld3BvcnRSZWxhdGl2ZUN1cnNvclkgJiZcbiAgICAgICAgICB0aGlzLl9zdGF0ZS5pc0ZvY3VzZWQgPT09IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgJiZcbiAgICAgICAgICB0aGlzLl9zdGF0ZS5zdHlsZSA9PT0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JTdHlsZSAmJlxuICAgICAgICAgIHRoaXMuX3N0YXRlLndpZHRoID09PSB0aGlzLl9jZWxsLmdldFdpZHRoKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2xlYXJDdXJzb3IoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdHguc2F2ZSgpO1xuICAgIHRoaXMuX2N1cnNvclJlbmRlcmVyc1t0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvclN0eWxlIHx8ICdibG9jayddKGN1cnNvclgsIHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZLCB0aGlzLl9jZWxsKTtcbiAgICB0aGlzLl9jdHgucmVzdG9yZSgpO1xuXG4gICAgdGhpcy5fc3RhdGUueCA9IGN1cnNvclg7XG4gICAgdGhpcy5fc3RhdGUueSA9IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZO1xuICAgIHRoaXMuX3N0YXRlLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3N0YXRlLnN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JTdHlsZTtcbiAgICB0aGlzLl9zdGF0ZS53aWR0aCA9IHRoaXMuX2NlbGwuZ2V0V2lkdGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyQ3Vyc29yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgLy8gQXZvaWQgcG90ZW50aWFsIHJvdW5kaW5nIGVycm9ycyB3aGVuIGJyb3dzZXIgaXMgRmlyZWZveCAoIzQ0ODcpIG9yIGRldmljZSBwaXhlbCByYXRpbyBpc1xuICAgICAgLy8gbGVzcyB0aGFuIDFcbiAgICAgIGlmIChpc0ZpcmVmb3ggfHwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwciA8IDEpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsZWFyQ2VsbHModGhpcy5fc3RhdGUueCwgdGhpcy5fc3RhdGUueSwgdGhpcy5fc3RhdGUud2lkdGgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhdGUgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGlzRm9jdXNlZDogZmFsc2UsXG4gICAgICAgIHN0eWxlOiAnJyxcbiAgICAgICAgd2lkdGg6IDBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQmFyQ3Vyc29yKHg6IG51bWJlciwgeTogbnVtYmVyLCBjZWxsOiBJQ2VsbERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguc2F2ZSgpO1xuICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmN1cnNvci5jc3M7XG4gICAgdGhpcy5fZmlsbExlZnRMaW5lQXRDZWxsKHgsIHksIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29yV2lkdGgpO1xuICAgIHRoaXMuX2N0eC5yZXN0b3JlKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJCbG9ja0N1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlciwgY2VsbDogSUNlbGxEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LnNhdmUoKTtcbiAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jdXJzb3IuY3NzO1xuICAgIHRoaXMuX2ZpbGxDZWxscyh4LCB5LCBjZWxsLmdldFdpZHRoKCksIDEpO1xuICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmN1cnNvckFjY2VudC5jc3M7XG4gICAgdGhpcy5fZmlsbENoYXJUcnVlQ29sb3IoY2VsbCwgeCwgeSk7XG4gICAgdGhpcy5fY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclVuZGVybGluZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlciwgY2VsbDogSUNlbGxEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LnNhdmUoKTtcbiAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jdXJzb3IuY3NzO1xuICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscyh4LCB5KTtcbiAgICB0aGlzLl9jdHgucmVzdG9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyT3V0bGluZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlciwgY2VsbDogSUNlbGxEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LnNhdmUoKTtcbiAgICB0aGlzLl9jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmN1cnNvci5jc3M7XG4gICAgdGhpcy5fc3Ryb2tlUmVjdEF0Q2VsbCh4LCB5LCBjZWxsLmdldFdpZHRoKCksIDEpO1xuICAgIHRoaXMuX2N0eC5yZXN0b3JlKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIEdyaWRDYWNoZTxUPiB7XG4gIHB1YmxpYyBjYWNoZTogKFQgfCB1bmRlZmluZWQpW11bXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWNoZSA9IFtdO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoIDw9IHgpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IHkgPSB0aGlzLmNhY2hlW3hdLmxlbmd0aDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIHRoaXMuY2FjaGVbeF0ucHVzaCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZVt4XS5sZW5ndGggPSBoZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuY2FjaGUubGVuZ3RoID0gd2lkdGg7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLmNhY2hlLmxlbmd0aDsgeCsrKSB7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuY2FjaGVbeF0ubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgdGhpcy5jYWNoZVt4XVt5XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUxpbmtpZmllcjIsIElMaW5raWZpZXJFdmVudCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgaXMyNTZDb2xvciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc1V0aWxzJztcbmltcG9ydCB7IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgQmFzZVJlbmRlckxheWVyIH0gZnJvbSAnLi9CYXNlUmVuZGVyTGF5ZXInO1xuXG5leHBvcnQgY2xhc3MgTGlua1JlbmRlckxheWVyIGV4dGVuZHMgQmFzZVJlbmRlckxheWVyIHtcbiAgcHJpdmF0ZSBfc3RhdGU6IElMaW5raWZpZXJFdmVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0ZXJtaW5hbDogVGVybWluYWwsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICBsaW5raWZpZXIyOiBJTGlua2lmaWVyMixcbiAgICBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIGRlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcih0ZXJtaW5hbCwgY29udGFpbmVyLCAnbGluaycsIHpJbmRleCwgdHJ1ZSwgdGhlbWVTZXJ2aWNlLCBidWZmZXJTZXJ2aWNlLCBvcHRpb25zU2VydmljZSwgZGVjb3JhdGlvblNlcnZpY2UsIGNvcmVCcm93c2VyU2VydmljZSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGxpbmtpZmllcjIub25TaG93TGlua1VuZGVybGluZShlID0+IHRoaXMuX2hhbmRsZVNob3dMaW5rVW5kZXJsaW5lKGUpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihsaW5raWZpZXIyLm9uSGlkZUxpbmtVbmRlcmxpbmUoZSA9PiB0aGlzLl9oYW5kbGVIaWRlTGlua1VuZGVybGluZShlKSkpO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZShkaW06IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgc3VwZXIucmVzaXplKGRpbSk7XG4gICAgLy8gUmVzaXppbmcgdGhlIGNhbnZhcyBkaXNjYXJkcyB0aGUgY29udGVudHMgb2YgdGhlIGNhbnZhcyBzbyBjbGVhciBzdGF0ZVxuICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyQ3VycmVudExpbmsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICB0aGlzLl9jbGVhckNlbGxzKHRoaXMuX3N0YXRlLngxLCB0aGlzLl9zdGF0ZS55MSwgdGhpcy5fc3RhdGUuY29scyAtIHRoaXMuX3N0YXRlLngxLCAxKTtcbiAgICAgIGNvbnN0IG1pZGRsZVJvd0NvdW50ID0gdGhpcy5fc3RhdGUueTIgLSB0aGlzLl9zdGF0ZS55MSAtIDE7XG4gICAgICBpZiAobWlkZGxlUm93Q291bnQgPiAwKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyQ2VsbHMoMCwgdGhpcy5fc3RhdGUueTEgKyAxLCB0aGlzLl9zdGF0ZS5jb2xzLCBtaWRkbGVSb3dDb3VudCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jbGVhckNlbGxzKDAsIHRoaXMuX3N0YXRlLnkyLCB0aGlzLl9zdGF0ZS54MiwgMSk7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVTaG93TGlua1VuZGVybGluZShlOiBJTGlua2lmaWVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5mZyA9PT0gSU5WRVJURURfREVGQVVMVF9DT0xPUikge1xuICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYmFja2dyb3VuZC5jc3M7XG4gICAgfSBlbHNlIGlmIChlLmZnICYmIGlzMjU2Q29sb3IoZS5mZykpIHtcbiAgICAgIC8vIDI1NiBjb2xvciBzdXBwb3J0XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2UuZmddLmNzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5jc3M7XG4gICAgfVxuXG4gICAgaWYgKGUueTEgPT09IGUueTIpIHtcbiAgICAgIC8vIFNpbmdsZSBsaW5lIGxpbmtcbiAgICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscyhlLngxLCBlLnkxLCBlLngyIC0gZS54MSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpLWxpbmUgbGlua1xuICAgICAgdGhpcy5fZmlsbEJvdHRvbUxpbmVBdENlbGxzKGUueDEsIGUueTEsIGUuY29scyAtIGUueDEpO1xuICAgICAgZm9yIChsZXQgeSA9IGUueTEgKyAxOyB5IDwgZS55MjsgeSsrKSB7XG4gICAgICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscygwLCB5LCBlLmNvbHMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlsbEJvdHRvbUxpbmVBdENlbGxzKDAsIGUueTIsIGUueDIpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IGU7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVIaWRlTGlua1VuZGVybGluZShlOiBJTGlua2lmaWVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBCYXNlUmVuZGVyTGF5ZXIgfSBmcm9tICcuL0Jhc2VSZW5kZXJMYXllcic7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5pbnRlcmZhY2UgSVNlbGVjdGlvblN0YXRlIHtcbiAgc3RhcnQ/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBlbmQ/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBjb2x1bW5TZWxlY3RNb2RlPzogYm9vbGVhbjtcbiAgeWRpc3A/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25SZW5kZXJMYXllciBleHRlbmRzIEJhc2VSZW5kZXJMYXllciB7XG4gIHByaXZhdGUgX3N0YXRlITogSVNlbGVjdGlvblN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHpJbmRleDogbnVtYmVyLFxuICAgIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIGNvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHRlcm1pbmFsLCBjb250YWluZXIsICdzZWxlY3Rpb24nLCB6SW5kZXgsIHRydWUsIHRoZW1lU2VydmljZSwgYnVmZmVyU2VydmljZSwgb3B0aW9uc1NlcnZpY2UsIGRlY29yYXRpb25TZXJ2aWNlLCBjb3JlQnJvd3NlclNlcnZpY2UpO1xuICAgIHRoaXMuX2NsZWFyU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUgPSB7XG4gICAgICBzdGFydDogdW5kZWZpbmVkLFxuICAgICAgZW5kOiB1bmRlZmluZWQsXG4gICAgICBjb2x1bW5TZWxlY3RNb2RlOiB1bmRlZmluZWQsXG4gICAgICB5ZGlzcDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoZGltOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHN1cGVyLnJlc2l6ZShkaW0pO1xuICAgIC8vIE9uIHJlc2l6ZSB1c2UgdGhlIGJhc2UgcmVuZGVyIGxheWVyJ3MgY2FjaGVkIHNlbGVjdGlvbiB2YWx1ZXMgc2luY2UgcmVzaXplIGNsZWFycyBfc3RhdGVcbiAgICAvLyBpbnNpZGUgcmVzZXQuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblN0YXJ0ICYmIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbkVuZCkge1xuICAgICAgdGhpcy5fY2xlYXJTdGF0ZSgpO1xuICAgICAgdGhpcy5fcmVkcmF3U2VsZWN0aW9uKHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblN0YXJ0LCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25FbmQsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNvbHVtblNlbGVjdE1vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc3RhdGUuc3RhcnQgJiYgdGhpcy5fc3RhdGUuZW5kKSB7XG4gICAgICB0aGlzLl9jbGVhclN0YXRlKCk7XG4gICAgICB0aGlzLl9jbGVhckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9yZWRyYXdTZWxlY3Rpb24odGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uU3RhcnQsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbkVuZCwgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY29sdW1uU2VsZWN0TW9kZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMuX3JlZHJhd1NlbGVjdGlvbih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25TdGFydCwgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uRW5kLCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jb2x1bW5TZWxlY3RNb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBzdXBlci5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0LCBlbmQsIGNvbHVtblNlbGVjdE1vZGUpO1xuICAgIHRoaXMuX3JlZHJhd1NlbGVjdGlvbihzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZHJhd1NlbGVjdGlvbihzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gU2VsZWN0aW9uIGhhcyBub3QgY2hhbmdlZFxuICAgIGlmICghdGhpcy5fZGlkU3RhdGVDaGFuZ2Uoc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCBzZWxlY3Rpb25zXG4gICAgdGhpcy5fY2xlYXJBbGwoKTtcblxuICAgIC8vIFNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgdGhpcy5fY2xlYXJTdGF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zbGF0ZSBmcm9tIGJ1ZmZlciBwb3NpdGlvbiB0byB2aWV3cG9ydCBwb3NpdGlvblxuICAgIGNvbnN0IHZpZXdwb3J0U3RhcnRSb3cgPSBzdGFydFsxXSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgIGNvbnN0IHZpZXdwb3J0RW5kUm93ID0gZW5kWzFdIC0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IE1hdGgubWF4KHZpZXdwb3J0U3RhcnRSb3csIDApO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gTWF0aC5taW4odmlld3BvcnRFbmRSb3csIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpO1xuXG4gICAgLy8gTm8gbmVlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgfHwgdmlld3BvcnRDYXBwZWRFbmRSb3cgPCAwKSB7XG4gICAgICB0aGlzLl9zdGF0ZS55ZGlzcCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZFxuICAgICAgPyB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudFxuICAgICAgOiB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KS5jc3M7XG5cbiAgICBpZiAoY29sdW1uU2VsZWN0TW9kZSkge1xuICAgICAgY29uc3Qgc3RhcnRDb2wgPSBzdGFydFswXTtcbiAgICAgIGNvbnN0IHdpZHRoID0gZW5kWzBdIC0gc3RhcnRDb2w7XG4gICAgICBjb25zdCBoZWlnaHQgPSB2aWV3cG9ydENhcHBlZEVuZFJvdyAtIHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgKyAxO1xuICAgICAgdGhpcy5fZmlsbENlbGxzKHN0YXJ0Q29sLCB2aWV3cG9ydENhcHBlZFN0YXJ0Um93LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRHJhdyBmaXJzdCByb3dcbiAgICAgIGNvbnN0IHN0YXJ0Q29sID0gdmlld3BvcnRTdGFydFJvdyA9PT0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyA/IHN0YXJ0WzBdIDogMDtcbiAgICAgIGNvbnN0IHN0YXJ0Um93RW5kQ29sID0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9PT0gdmlld3BvcnRFbmRSb3cgPyBlbmRbMF0gOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICB0aGlzLl9maWxsQ2VsbHMoc3RhcnRDb2wsIHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3csIHN0YXJ0Um93RW5kQ29sIC0gc3RhcnRDb2wsIDEpO1xuXG4gICAgICAvLyBEcmF3IG1pZGRsZSByb3dzXG4gICAgICBjb25zdCBtaWRkbGVSb3dzQ291bnQgPSBNYXRoLm1heCh2aWV3cG9ydENhcHBlZEVuZFJvdyAtIHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgLSAxLCAwKTtcbiAgICAgIHRoaXMuX2ZpbGxDZWxscygwLCB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ICsgMSwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCBtaWRkbGVSb3dzQ291bnQpO1xuXG4gICAgICAvLyBEcmF3IGZpbmFsIHJvd1xuICAgICAgaWYgKHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgIT09IHZpZXdwb3J0Q2FwcGVkRW5kUm93KSB7XG4gICAgICAgIC8vIE9ubHkgZHJhdyB2aWV3cG9ydEVuZFJvdyBpZiBpdCdzIG5vdCB0aGUgc2FtZSBhcyB2aWV3cG9ydFN0YXJ0Um93XG4gICAgICAgIGNvbnN0IGVuZENvbCA9IHZpZXdwb3J0RW5kUm93ID09PSB2aWV3cG9ydENhcHBlZEVuZFJvdyA/IGVuZFswXSA6IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICAgICAgdGhpcy5fZmlsbENlbGxzKDAsIHZpZXdwb3J0Q2FwcGVkRW5kUm93LCBlbmRDb2wsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNhdmUgc3RhdGUgZm9yIG5leHQgcmVuZGVyXG4gICAgdGhpcy5fc3RhdGUuc3RhcnQgPSBbc3RhcnRbMF0sIHN0YXJ0WzFdXTtcbiAgICB0aGlzLl9zdGF0ZS5lbmQgPSBbZW5kWzBdLCBlbmRbMV1dO1xuICAgIHRoaXMuX3N0YXRlLmNvbHVtblNlbGVjdE1vZGUgPSBjb2x1bW5TZWxlY3RNb2RlO1xuICAgIHRoaXMuX3N0YXRlLnlkaXNwID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7XG4gIH1cblxuICBwcml2YXRlIF9kaWRTdGF0ZUNoYW5nZShzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuLCB5ZGlzcDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9hcmVDb29yZGluYXRlc0VxdWFsKHN0YXJ0LCB0aGlzLl9zdGF0ZS5zdGFydCkgfHxcbiAgICAgICF0aGlzLl9hcmVDb29yZGluYXRlc0VxdWFsKGVuZCwgdGhpcy5fc3RhdGUuZW5kKSB8fFxuICAgICAgY29sdW1uU2VsZWN0TW9kZSAhPT0gdGhpcy5fc3RhdGUuY29sdW1uU2VsZWN0TW9kZSB8fFxuICAgICAgeWRpc3AgIT09IHRoaXMuX3N0YXRlLnlkaXNwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJlQ29vcmRpbmF0ZXNFcXVhbChjb29yZDE6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvb3JkMjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY29vcmQxIHx8ICFjb29yZDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29vcmQxWzBdID09PSBjb29yZDJbMF0gJiYgY29vcmQxWzFdID09PSBjb29yZDJbMV07XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBKb2luZWRDZWxsRGF0YSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvQ2hhcmFjdGVySm9pbmVyU2VydmljZSc7XG5pbXBvcnQgeyBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgQ2hhckRhdGEsIElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBDb250ZW50LCBOVUxMX0NFTExfQ09ERSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBCYXNlUmVuZGVyTGF5ZXIgfSBmcm9tICcuL0Jhc2VSZW5kZXJMYXllcic7XG5pbXBvcnQgeyBHcmlkQ2FjaGUgfSBmcm9tICcuL0dyaWRDYWNoZSc7XG5cbi8qKlxuICogVGhpcyBDaGFyRGF0YSBsb29rcyBsaWtlIGEgbnVsbCBjaGFyYWN0ZXIsIHdoaWNoIHdpbGwgZm9yYyBhIGNsZWFyIGFuZCByZW5kZXJcbiAqIHdoZW4gdGhlIGNoYXJhY3RlciBjaGFuZ2VzIChhIHJlZ3VsYXIgc3BhY2UgJyAnIGNoYXJhY3RlciBtYXkgbm90IGFzIGl0J3NcbiAqIGRyYXduIHN0YXRlIGlzIGEgY2xlYXJlZCBjZWxsKS5cbiAqL1xuLy8gY29uc3QgT1ZFUkxBUF9PV05FRF9DSEFSX0RBVEE6IENoYXJEYXRhID0gW251bGwsICcnLCAwLCAtMV07XG5cbmV4cG9ydCBjbGFzcyBUZXh0UmVuZGVyTGF5ZXIgZXh0ZW5kcyBCYXNlUmVuZGVyTGF5ZXIge1xuICBwcml2YXRlIF9zdGF0ZTogR3JpZENhY2hlPENoYXJEYXRhPjtcbiAgcHJpdmF0ZSBfY2hhcmFjdGVyV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2NoYXJhY3RlckZvbnQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9jaGFyYWN0ZXJPdmVybGFwQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIHByaXZhdGUgX3dvcmtDZWxsID0gbmV3IENlbGxEYXRhKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgYWxwaGE6IGJvb2xlYW4sXG4gICAgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSxcbiAgICBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIGNvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICB0aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIodGVybWluYWwsIGNvbnRhaW5lciwgJ3RleHQnLCB6SW5kZXgsIGFscGhhLCB0aGVtZVNlcnZpY2UsIGJ1ZmZlclNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlLCBkZWNvcmF0aW9uU2VydmljZSwgY29yZUJyb3dzZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9zdGF0ZSA9IG5ldyBHcmlkQ2FjaGU8Q2hhckRhdGE+KCk7XG4gICAgdGhpcy5yZWdpc3RlcihvcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdhbGxvd1RyYW5zcGFyZW5jeScsIHZhbHVlID0+IHRoaXMuX3NldFRyYW5zcGFyZW5jeSh2YWx1ZSkpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoZGltOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHN1cGVyLnJlc2l6ZShkaW0pO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGNoYXJhY3RlciB3aWR0aCBjYWNoZSBpZiB0aGUgZm9udCBvciB3aWR0aCBoYXMgY2hhbmdlZFxuICAgIGNvbnN0IHRlcm1pbmFsRm9udCA9IHRoaXMuX2dldEZvbnQoZmFsc2UsIGZhbHNlKTtcbiAgICBpZiAodGhpcy5fY2hhcmFjdGVyV2lkdGggIT09IGRpbS5kZXZpY2UuY2hhci53aWR0aCB8fCB0aGlzLl9jaGFyYWN0ZXJGb250ICE9PSB0ZXJtaW5hbEZvbnQpIHtcbiAgICAgIHRoaXMuX2NoYXJhY3RlcldpZHRoID0gZGltLmRldmljZS5jaGFyLndpZHRoO1xuICAgICAgdGhpcy5fY2hhcmFjdGVyRm9udCA9IHRlcm1pbmFsRm9udDtcbiAgICAgIHRoaXMuX2NoYXJhY3Rlck92ZXJsYXBDYWNoZSA9IHt9O1xuICAgIH1cbiAgICAvLyBSZXNpemluZyB0aGUgY2FudmFzIGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2FudmFzIHNvIGNsZWFyIHN0YXRlXG4gICAgdGhpcy5fc3RhdGUuY2xlYXIoKTtcbiAgICB0aGlzLl9zdGF0ZS5yZXNpemUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXRlLmNsZWFyKCk7XG4gICAgdGhpcy5fY2xlYXJBbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZvckVhY2hDZWxsKFxuICAgIGZpcnN0Um93OiBudW1iZXIsXG4gICAgbGFzdFJvdzogbnVtYmVyLFxuICAgIGNhbGxiYWNrOiAoXG4gICAgICBjZWxsOiBJQ2VsbERhdGEsXG4gICAgICB4OiBudW1iZXIsXG4gICAgICB5OiBudW1iZXJcbiAgICApID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgZm9yIChsZXQgeSA9IGZpcnN0Um93OyB5IDw9IGxhc3RSb3c7IHkrKykge1xuICAgICAgY29uc3Qgcm93ID0geSArIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChyb3cpO1xuICAgICAgY29uc3Qgam9pbmVkUmFuZ2VzID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5nZXRKb2luZWRDaGFyYWN0ZXJzKHJvdyk7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczsgeCsrKSB7XG4gICAgICAgIGxpbmUhLmxvYWRDZWxsKHgsIHRoaXMuX3dvcmtDZWxsKTtcbiAgICAgICAgbGV0IGNlbGwgPSB0aGlzLl93b3JrQ2VsbDtcblxuICAgICAgICAvLyBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIocykgdG8gZHJhdyB3ZXJlIGpvaW5lZC5cbiAgICAgICAgbGV0IGlzSm9pbmVkID0gZmFsc2U7XG4gICAgICAgIGxldCBsYXN0Q2hhclggPSB4O1xuXG4gICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgdG8gdGhlIGxlZnQgaXMgYSB3aWRlIGNoYXJhY3RlciwgZHJhd2luZyBpcyBvd25lZCBieVxuICAgICAgICAvLyB0aGUgY2hhciBhdCB4LTFcbiAgICAgICAgaWYgKGNlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXhpdCBlYXJseSBmb3IgTlVMTCBhbmQgU1BcbiAgICAgICAgLy8gTk9URTogY29tbWVudGVkIG91dCBkdWUgdG8gIzQxMjAgKG5lZWRzIGEgbW9yZSBjbGV2ZXIgcGF0Y2ggdG8ga2VlcCB0aGluZ3MgcGVyZm9ybWFudClcbiAgICAgICAgLy8gY29uc3QgY29kZSA9IGNlbGwuZ2V0Q29kZSgpO1xuICAgICAgICAvLyBpZiAoY29kZSA9PT0gMCB8fCBjb2RlID09PSAzMikge1xuICAgICAgICAvLyAgY29udGludWU7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBQcm9jZXNzIGFueSBqb2luZWQgY2hhcmFjdGVyIHJhbmdlcyBhcyBuZWVkZWQuIEJlY2F1c2Ugb2YgaG93IHRoZVxuICAgICAgICAvLyByYW5nZXMgYXJlIHByb2R1Y2VkLCB3ZSBrbm93IHRoYXQgdGhleSBhcmUgdmFsaWQgZm9yIHRoZSBjaGFyYWN0ZXJzXG4gICAgICAgIC8vIGFuZCBhdHRyaWJ1dGVzIG9mIG91ciBpbnB1dC5cbiAgICAgICAgaWYgKGpvaW5lZFJhbmdlcy5sZW5ndGggPiAwICYmIHggPT09IGpvaW5lZFJhbmdlc1swXVswXSkge1xuICAgICAgICAgIGlzSm9pbmVkID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IGpvaW5lZFJhbmdlcy5zaGlmdCgpITtcblxuICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgZXhhY3Qgc3RhcnQgYW5kIGVuZCBjb2x1bW4gb2YgdGhlIGpvaW5lZCByYW5nZSxcbiAgICAgICAgICAvLyBzbyB3ZSBnZXQgdGhlIHN0cmluZyBhbmQgd2lkdGggcmVwcmVzZW50aW5nIGl0IGRpcmVjdGx5XG4gICAgICAgICAgY2VsbCA9IG5ldyBKb2luZWRDZWxsRGF0YShcbiAgICAgICAgICAgIHRoaXMuX3dvcmtDZWxsLFxuICAgICAgICAgICAgbGluZSEudHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSwgcmFuZ2VbMF0sIHJhbmdlWzFdKSxcbiAgICAgICAgICAgIHJhbmdlWzFdIC0gcmFuZ2VbMF1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBjZWxscyBvY2N1cGllZCBieSB0aGlzIHJhbmdlIGluIHRoZSBsb29wXG4gICAgICAgICAgbGFzdENoYXJYID0gcmFuZ2VbMV0gLSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBhbiBvdmVybGFwcGluZyBjaGFyIGFuZCB0aGUgY2hhcmFjdGVyIHRvIHRoZVxuICAgICAgICAvLyByaWdodCBpcyBhIHNwYWNlLCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgY2VsbCB0byB0aGUgcmlnaHQuIFdlIHNraXBcbiAgICAgICAgLy8gdGhpcyBjaGVjayBmb3Igam9pbmVkIGNoYXJhY3RlcnMgYmVjYXVzZSB0aGVpciByZW5kZXJpbmcgbGlrZWx5IHdvbid0XG4gICAgICAgIC8vIHlpZWxkIHRoZSBzYW1lIHJlc3VsdCBhcyByZW5kZXJpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIGluZGl2aWR1YWxseS5cbiAgICAgICAgaWYgKCFpc0pvaW5lZCAmJiB0aGlzLl9pc092ZXJsYXBwaW5nKGNlbGwpKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBvdmVybGFwcGluZywgd2Ugd2FudCB0byBmb3JjZSBhIHJlLXJlbmRlciBvbiBldmVyeVxuICAgICAgICAgIC8vIGZyYW1lLiBUaGlzIGlzIHNwZWNpZmljYWxseSB0byB3b3JrIGFyb3VuZCB0aGUgY2FzZSB3aGVyZSB0d29cbiAgICAgICAgICAvLyBvdmVybGFwaW5nIGNoYXJzIGBhYCBhbmQgYGJgIGFyZSBhZGphY2VudCwgdGhlIGN1cnNvciBpcyBtb3ZlZCB0byBiIGFuZCBhXG4gICAgICAgICAgLy8gc3BhY2UgaXMgYWRkZWQuIFdpdGhvdXQgdGhpcywgdGhlIGZpcnN0IGhhbGYgb2YgYGJgIHdvdWxkIG5ldmVyXG4gICAgICAgICAgLy8gZ2V0IHJlbW92ZWQsIGFuZCBgYWAgd291bGQgbm90IHJlLXJlbmRlciBiZWNhdXNlIGl0IHRoaW5rcyBpdCdzXG4gICAgICAgICAgLy8gYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBzdGF0ZS5cbiAgICAgICAgICAvLyB0aGlzLl9zdGF0ZS5jYWNoZVt4XVt5XSA9IE9WRVJMQVBfT1dORURfQ0hBUl9EQVRBO1xuICAgICAgICAgIGlmIChsYXN0Q2hhclggPCBsaW5lIS5sZW5ndGggLSAxICYmIGxpbmUhLmdldENvZGVQb2ludChsYXN0Q2hhclggKyAxKSA9PT0gTlVMTF9DRUxMX0NPREUpIHtcbiAgICAgICAgICAgIC8vIHBhdGNoIHdpZHRoIHRvIDJcbiAgICAgICAgICAgIGNlbGwuY29udGVudCAmPSB+Q29udGVudC5XSURUSF9NQVNLO1xuICAgICAgICAgICAgY2VsbC5jb250ZW50IHw9IDIgPDwgQ29udGVudC5XSURUSF9TSElGVDtcbiAgICAgICAgICAgIC8vIHRoaXMuX2NsZWFyQ2hhcih4ICsgMSwgeSk7XG4gICAgICAgICAgICAvLyBUaGUgb3ZlcmxhcHBpbmcgY2hhcidzIGNoYXIgZGF0YSB3aWxsIGZvcmNlIGEgY2xlYXIgYW5kIHJlbmRlciB3aGVuIHRoZVxuICAgICAgICAgICAgLy8gb3ZlcmxhcHBpbmcgY2hhciBpcyBubyBsb25nZXIgdG8gdGhlIGxlZnQgb2YgdGhlIGNoYXJhY3RlciBhbmQgYWxzbyB3aGVuXG4gICAgICAgICAgICAvLyB0aGUgc3BhY2UgY2hhbmdlcyB0byBhbm90aGVyIGNoYXJhY3Rlci5cbiAgICAgICAgICAgIC8vIHRoaXMuX3N0YXRlLmNhY2hlW3ggKyAxXVt5XSA9IE9WRVJMQVBfT1dORURfQ0hBUl9EQVRBO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgIGNlbGwsXG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgICk7XG5cbiAgICAgICAgeCA9IGxhc3RDaGFyWDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIGJhY2tncm91bmQgZm9yIGEgc3BlY2lmaWVkIHJhbmdlIG9mIGNvbHVtbnMuIFRyaWVzIHRvIGJhdGNoIGFkamFjZW50IGNlbGxzIG9mIHRoZVxuICAgKiBzYW1lIGNvbG9yIHRvZ2V0aGVyIHRvIHJlZHVjZSBkcmF3IGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZHJhd0JhY2tncm91bmQoZmlyc3RSb3c6IG51bWJlciwgbGFzdFJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5fY3R4O1xuICAgIGNvbnN0IGNvbHMgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgbGV0IHN0YXJ0WDogbnVtYmVyID0gMDtcbiAgICBsZXQgc3RhcnRZOiBudW1iZXIgPSAwO1xuICAgIGxldCBwcmV2RmlsbFN0eWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIGN0eC5zYXZlKCk7XG5cbiAgICB0aGlzLl9mb3JFYWNoQ2VsbChmaXJzdFJvdywgbGFzdFJvdywgKGNlbGwsIHgsIHkpID0+IHtcbiAgICAgIC8vIGxpYnZ0ZSBhbmQgeHRlcm0gYm90aCBkcmF3IHRoZSBiYWNrZ3JvdW5kIChidXQgbm90IGZvcmVncm91bmQpIG9mIGludmlzaWJsZSBjaGFyYWN0ZXJzLFxuICAgICAgLy8gc28gd2Ugc2hvdWxkIHRvby5cbiAgICAgIGxldCBuZXh0RmlsbFN0eWxlID0gbnVsbDsgLy8gbnVsbCByZXByZXNlbnRzIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvclxuXG4gICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSkge1xuICAgICAgICBpZiAoY2VsbC5pc0ZnRGVmYXVsdCgpKSB7XG4gICAgICAgICAgbmV4dEZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5jc3M7XG4gICAgICAgIH0gZWxzZSBpZiAoY2VsbC5pc0ZnUkdCKCkpIHtcbiAgICAgICAgICBuZXh0RmlsbFN0eWxlID0gYHJnYigke0F0dHJpYnV0ZURhdGEudG9Db2xvclJHQihjZWxsLmdldEZnQ29sb3IoKSkuam9pbignLCcpfSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHRGaWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbY2VsbC5nZXRGZ0NvbG9yKCldLmNzcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjZWxsLmlzQmdSR0IoKSkge1xuICAgICAgICBuZXh0RmlsbFN0eWxlID0gYHJnYigke0F0dHJpYnV0ZURhdGEudG9Db2xvclJHQihjZWxsLmdldEJnQ29sb3IoKSkuam9pbignLCcpfSlgO1xuICAgICAgfSBlbHNlIGlmIChjZWxsLmlzQmdQYWxldHRlKCkpIHtcbiAgICAgICAgbmV4dEZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtjZWxsLmdldEJnQ29sb3IoKV0uY3NzO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgYW55IGRlY29yYXRpb24gZm9yZWdyb3VuZC9iYWNrZ3JvdW5kIG92ZXJyaWRlcywgdGhpcyBtdXN0IGJlIGZldGNoZWQgYmVmb3JlIHRoZSBlYXJseVxuICAgICAgLy8gZXhpc3QgYnV0IGFwcGxpZWQgYWZ0ZXIgaW52ZXJzZVxuICAgICAgbGV0IGlzVG9wID0gZmFsc2U7XG4gICAgICB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCArIHksIHVuZGVmaW5lZCwgZCA9PiB7XG4gICAgICAgIGlmIChkLm9wdGlvbnMubGF5ZXIgIT09ICd0b3AnICYmIGlzVG9wKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkLmJhY2tncm91bmRDb2xvclJHQikge1xuICAgICAgICAgIG5leHRGaWxsU3R5bGUgPSBkLmJhY2tncm91bmRDb2xvclJHQi5jc3M7XG4gICAgICAgIH1cbiAgICAgICAgaXNUb3AgPSBkLm9wdGlvbnMubGF5ZXIgPT09ICd0b3AnO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcmV2RmlsbFN0eWxlID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgZWl0aGVyIHRoZSBmaXJzdCBpdGVyYXRpb24sIG9yIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgd2FzIHNldC4gRWl0aGVyIHdheSwgd2VcbiAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBkcmF3IGFueXRoaW5nLlxuICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgfVxuXG4gICAgICBpZiAoeSAhPT0gc3RhcnRZKSB7XG4gICAgICAgIC8vIG91ciByb3cgY2hhbmdlZCwgZHJhdyB0aGUgcHJldmlvdXMgcm93XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBwcmV2RmlsbFN0eWxlIHx8ICcnO1xuICAgICAgICB0aGlzLl9maWxsQ2VsbHMoc3RhcnRYLCBzdGFydFksIGNvbHMgLSBzdGFydFgsIDEpO1xuICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgfSBlbHNlIGlmIChwcmV2RmlsbFN0eWxlICE9PSBuZXh0RmlsbFN0eWxlKSB7XG4gICAgICAgIC8vIG91ciBjb2xvciBjaGFuZ2VkLCBkcmF3IHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJzIGluIHRoaXMgcm93XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBwcmV2RmlsbFN0eWxlIHx8ICcnO1xuICAgICAgICB0aGlzLl9maWxsQ2VsbHMoc3RhcnRYLCBzdGFydFksIHggLSBzdGFydFgsIDEpO1xuICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgfVxuXG4gICAgICBwcmV2RmlsbFN0eWxlID0gbmV4dEZpbGxTdHlsZTtcbiAgICB9KTtcblxuICAgIC8vIGZsdXNoIHRoZSBsYXN0IGNvbG9yIHdlIGVuY291bnRlcmVkXG4gICAgaWYgKHByZXZGaWxsU3R5bGUgIT09IG51bGwpIHtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBwcmV2RmlsbFN0eWxlO1xuICAgICAgdGhpcy5fZmlsbENlbGxzKHN0YXJ0WCwgc3RhcnRZLCBjb2xzIC0gc3RhcnRYLCAxKTtcbiAgICB9XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd0ZvcmVncm91bmQoZmlyc3RSb3c6IG51bWJlciwgbGFzdFJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZm9yRWFjaENlbGwoZmlyc3RSb3csIGxhc3RSb3csIChjZWxsLCB4LCB5KSA9PiB0aGlzLl9kcmF3Q2hhcnMoY2VsbCwgeCwgeSkpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUdyaWRDaGFuZ2VkKGZpcnN0Um93OiBudW1iZXIsIGxhc3RSb3c6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlc2l6ZSBoYXMgbm90IGJlZW4gY2FsbGVkIHlldFxuICAgIGlmICh0aGlzLl9zdGF0ZS5jYWNoZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2hhckF0bGFzKSB7XG4gICAgICB0aGlzLl9jaGFyQXRsYXMuYmVnaW5GcmFtZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2NsZWFyQ2VsbHMoMCwgZmlyc3RSb3csIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7XG4gICAgdGhpcy5fZHJhd0JhY2tncm91bmQoZmlyc3RSb3csIGxhc3RSb3cpO1xuICAgIHRoaXMuX2RyYXdGb3JlZ3JvdW5kKGZpcnN0Um93LCBsYXN0Um93KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgY2hhcmFjdGVyIGlzIG92ZXJsYXBwaW5nIHRvIHRoZSBuZXh0IGNlbGwuXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJsYXBwaW5nKGNlbGw6IElDZWxsRGF0YSk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgc2luZ2xlIGNlbGwgY2hhcmFjdGVycyBjYW4gYmUgb3ZlcmxhcHBpbmcsIHJlbmRlcmluZyBpc3N1ZXMgY2FuXG4gICAgLy8gb2NjdXIgd2l0aG91dCB0aGlzIGNoZWNrXG4gICAgaWYgKGNlbGwuZ2V0V2lkdGgoKSAhPT0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFueSBhc2NpaSBjaGFyYWN0ZXIgd2lsbCBub3Qgb3ZlcmxhcFxuICAgIGlmIChjZWxsLmdldENvZGUoKSA8IDI1Nikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYXJzID0gY2VsbC5nZXRDaGFycygpO1xuXG4gICAgLy8gRGVsaXZlciBmcm9tIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLl9jaGFyYWN0ZXJPdmVybGFwQ2FjaGUuaGFzT3duUHJvcGVydHkoY2hhcnMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hhcmFjdGVyT3ZlcmxhcENhY2hlW2NoYXJzXTtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCB0aGUgZm9udFxuICAgIHRoaXMuX2N0eC5zYXZlKCk7XG4gICAgdGhpcy5fY3R4LmZvbnQgPSB0aGlzLl9jaGFyYWN0ZXJGb250O1xuXG4gICAgLy8gTWVhc3VyZSB0aGUgd2lkdGggb2YgdGhlIGNoYXJhY3RlciwgYnV0IE1hdGguZmxvb3IgaXRcbiAgICAvLyBiZWNhdXNlIHRoYXQgaXMgd2hhdCB0aGUgcmVuZGVyZXIgZG9lcyB3aGVuIGl0IGNhbGN1bGF0ZXNcbiAgICAvLyB0aGUgY2hhcmFjdGVyIGRpbWVuc2lvbnMgd2UgYXJlIGNvbXBhcmluZyBhZ2FpbnN0XG4gICAgY29uc3Qgb3ZlcmxhcHMgPSBNYXRoLmZsb29yKHRoaXMuX2N0eC5tZWFzdXJlVGV4dChjaGFycykud2lkdGgpID4gdGhpcy5fY2hhcmFjdGVyV2lkdGg7XG5cbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG4gICAgdGhpcy5fY3R4LnJlc3RvcmUoKTtcblxuICAgIC8vIENhY2hlIGFuZCByZXR1cm5cbiAgICB0aGlzLl9jaGFyYWN0ZXJPdmVybGFwQ2FjaGVbY2hhcnNdID0gb3ZlcmxhcHM7XG4gICAgcmV0dXJuIG92ZXJsYXBzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBCZ0ZsYWdzLCBFeHRGbGFncywgRmdGbGFncywgTlVMTF9DRUxMX0NPREUsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IHJnYmEgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRmZyA9IDA7XG5sZXQgJGJnID0gMDtcbmxldCAkaGFzRmcgPSBmYWxzZTtcbmxldCAkaGFzQmcgPSBmYWxzZTtcbmxldCAkaXNTZWxlY3RlZCA9IGZhbHNlO1xubGV0ICRjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQgfCB1bmRlZmluZWQ7XG5sZXQgJHZhcmlhbnRPZmZzZXQgPSAwO1xuXG5leHBvcnQgY2xhc3MgQ2VsbENvbG9yUmVzb2x2ZXIge1xuICAvKipcbiAgICogVGhlIHNoYXJlZCByZXN1bHQgb2YgdGhlIHtAbGluayByZXNvbHZlfSBjYWxsLiBUaGlzIGlzIG9ubHkgc2FmZSB0byB1c2UgaW1tZWRpYXRlbHkgYWZ0ZXIgYXNcbiAgICogYW55IG90aGVyIGNhbGxzIHdpbGwgc2hhcmUgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogeyBmZzogbnVtYmVyLCBiZzogbnVtYmVyLCBleHQ6IG51bWJlciB9ID0ge1xuICAgIGZnOiAwLFxuICAgIGJnOiAwLFxuICAgIGV4dDogMFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25TZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uUmVuZGVyTW9kZWw6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY29sb3JzIGZvciB0aGUgY2VsbCwgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gdGhlIHNoYXJlZCB7QGxpbmsgcmVzdWx0fS4gVGhpcyByZXNvbHZlc1xuICAgKiBvdmVycmlkZXMsIGludmVyc2UgYW5kIHNlbGVjdGlvbiBmb3IgdGhlIGNlbGwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBmZWVkIGludG8gdGhlIHJlbmRlcmVyLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmUoY2VsbDogSUNlbGxEYXRhLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdC5iZyA9IGNlbGwuYmc7XG4gICAgdGhpcy5yZXN1bHQuZmcgPSBjZWxsLmZnO1xuICAgIHRoaXMucmVzdWx0LmV4dCA9IGNlbGwuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCA/IGNlbGwuZXh0ZW5kZWQuZXh0IDogMDtcbiAgICAvLyBHZXQgYW55IGZvcmVncm91bmQvYmFja2dyb3VuZCBvdmVycmlkZXMsIHRoaXMgaGFwcGVucyBvbiB0aGUgbW9kZWwgdG8gYXZvaWQgc3ByZWFkaW5nXG4gICAgLy8gb3ZlcnJpZGUgbG9naWMgdGhyb3VnaG91dCB0aGUgZGlmZmVyZW50IHN1Yi1yZW5kZXJlcnNcblxuICAgIC8vIFJlc2V0IG92ZXJyaWRlcyB3b3JrIHZhcmlhYmxlc1xuICAgICRiZyA9IDA7XG4gICAgJGZnID0gMDtcbiAgICAkaGFzQmcgPSBmYWxzZTtcbiAgICAkaGFzRmcgPSBmYWxzZTtcbiAgICAkaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICRjb2xvcnMgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzO1xuICAgICR2YXJpYW50T2Zmc2V0ID0gMDtcblxuICAgIGNvbnN0IGNvZGUgPSBjZWxsLmdldENvZGUoKTtcbiAgICBpZiAoY29kZSAhPT0gTlVMTF9DRUxMX0NPREUgJiYgY2VsbC5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA9PT0gVW5kZXJsaW5lU3R5bGUuRE9UVEVEKSB7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX29wdGlvblNlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIgLyAxNSkpO1xuICAgICAgJHZhcmlhbnRPZmZzZXQgPSB4ICogZGV2aWNlQ2VsbFdpZHRoICUgKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlY29yYXRpb25zIG9uIHRoZSBib3R0b20gbGF5ZXJcbiAgICB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4LCB5LCAnYm90dG9tJywgZCA9PiB7XG4gICAgICBpZiAoZC5iYWNrZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGJnID0gZC5iYWNrZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkLmZvcmVncm91bmRDb2xvclJHQikge1xuICAgICAgICAkZmcgPSBkLmZvcmVncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwbHkgdGhlIHNlbGVjdGlvbiBjb2xvciBpZiBuZWVkZWRcbiAgICAkaXNTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLmlzQ2VsbFNlbGVjdGVkKHRoaXMuX3Rlcm1pbmFsLCB4LCB5KTtcbiAgICBpZiAoJGlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSBjZWxsIGhhcyBhIGJnIGNvbG9yLCByZXRhaW4gdGhlIGNvbG9yIGJ5IGJsZW5kaW5nIGl0IHdpdGggdGhlIHNlbGVjdGlvbiBjb2xvclxuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpIHx8XG4gICAgICAgICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgIT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVFxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHN0YW5kYXJkIGJnIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAkYmcgPSAoKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAkYmcgPSAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY29uc2lkZXIgZGVmYXVsdCBiZyBjb2xvciBoZXJlIGFzIGl0J3Mgbm90IHBvc3NpYmxlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJsZW5kIHdpdGggc2VsZWN0aW9uIGJnIGNvbG9yXG4gICAgICAgICRiZyA9IHJnYmEuYmxlbmQoXG4gICAgICAgICAgJGJnLFxuICAgICAgICAgICgodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhICYgMHhGRkZGRkYwMCkgfCAweDgwXG4gICAgICAgICkgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkYmcgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgfVxuICAgICAgJGhhc0JnID0gdHJ1ZTtcblxuICAgICAgLy8gQXBwbHkgZXhwbGljaXQgc2VsZWN0aW9uIGZvcmVncm91bmQgaWYgcHJlc2VudFxuICAgICAgaWYgKCRjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCkge1xuICAgICAgICAkZmcgPSAkY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcndyaXRlIGZnIGFzIGJnIGlmIGl0J3MgYSBzcGVjaWFsIGRlY29yYXRpdmUgZ2x5cGggKGVnLiBwb3dlcmxpbmUpXG4gICAgICBpZiAodHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNlbGwuZ2V0Q29kZSgpKSkge1xuICAgICAgICAvLyBJbnZlcnNlIGRlZmF1bHQgYmFja2dyb3VuZCBzaG91bGQgYmUgdHJlYXRlZCBhcyB0cmFuc3BhcmVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSAmJlxuICAgICAgICAgICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVFxuICAgICAgICApIHtcbiAgICAgICAgICAkZmcgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVt0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgICAgICAgJGZnID0gKCh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDgpIHwgMHhGRjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjb25zaWRlciBkZWZhdWx0IGJnIGNvbG9yIGhlcmUgYXMgaXQncyBub3QgcG9zc2libGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgICAkZmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAgICRmZyA9ICgodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4KSB8IDB4RkY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgICRmZyA9IHJnYmEuYmxlbmQoXG4gICAgICAgICAgICAkZmcsXG4gICAgICAgICAgICAoKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyAkY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgOiAkY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSkucmdiYSAmIDB4RkZGRkZGMDApIHwgMHg4MFxuICAgICAgICAgICkgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWNvcmF0aW9ucyBvbiB0aGUgdG9wIGxheWVyXG4gICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZm9yRWFjaERlY29yYXRpb25BdENlbGwoeCwgeSwgJ3RvcCcsIGQgPT4ge1xuICAgICAgaWYgKGQuYmFja2dyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICRiZyA9IGQuYmFja2dyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNCZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZC5mb3JlZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGZnID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgYW55IG92ZXJyaWRlcyBmcm9tIHJnYmEgdG8gdGhlIGZnL2JnIHBhY2tlZCBmb3JtYXQuIFRoaXMgcmVzb2x2ZXMgdGhlIGludmVyc2UgZmxhZ1xuICAgIC8vIGFoZWFkIG9mIHRpbWUgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb3JyZWN0IGNhY2hlIGtleVxuICAgIGlmICgkaGFzQmcpIHtcbiAgICAgIGlmICgkaXNTZWxlY3RlZCkge1xuICAgICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIGZvcmNlIG5vbi1kaW0gKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAgICRiZyA9IChjZWxsLmJnICYgfkF0dHJpYnV0ZXMuUkdCX01BU0sgJiB+QmdGbGFncy5ESU0pIHwgJGJnIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIG92ZXJyaWRlICsgZm9yY2UgUkdCIGNvbG9yIG1vZGVcbiAgICAgICAgJGJnID0gKGNlbGwuYmcgJiB+QXR0cmlidXRlcy5SR0JfTUFTSykgfCAkYmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCRoYXNGZykge1xuICAgICAgLy8gTm9uLVJHQiBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgKyBmb3JjZSBkaXNhYmxlIGludmVyc2UgKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAkZmcgPSAoY2VsbC5mZyAmIH5BdHRyaWJ1dGVzLlJHQl9NQVNLICYgfkZnRmxhZ3MuSU5WRVJTRSkgfCAkZmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBpbnZlcnNlIHdhcyBzcGVjaWZpZWQgYnkgb25seSBvbmUgb2YgYmcgb3ZlcnJpZGUgb3IgZmcgb3ZlcnJpZGUgd2FzIHNldCxcbiAgICAvLyByZXNvbHZpbmcgdGhlIG90aGVyIGludmVyc2UgY29sb3IgYW5kIHNldHRpbmcgdGhlIGludmVyc2UgZmxhZyBpZiBuZWVkZWQuXG4gICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICBpZiAoJGhhc0JnICYmICEkaGFzRmcpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBiZyBjb2xvciB0eXBlIChkZWZhdWx0IGNvbG9yIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGluIGZnIHZzIGJnKVxuICAgICAgICBpZiAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9ERUZBVUxUKSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMucmVzdWx0LmZnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgRmdGbGFncy5JTlZFUlNFIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCAoKCRjb2xvcnMuYmFja2dyb3VuZC5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMucmVzdWx0LmZnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgRmdGbGFncy5JTlZFUlNFIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCB0aGlzLnJlc3VsdC5iZyAmIChBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgQXR0cmlidXRlcy5DTV9NQVNLKTtcbiAgICAgICAgfVxuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEkaGFzQmcgJiYgJGhhc0ZnKSB7XG4gICAgICAgIC8vIFJlc29sdmUgYmcgY29sb3IgdHlwZSAoZGVmYXVsdCBjb2xvciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBpbiBmZyB2cyBiZylcbiAgICAgICAgaWYgKCh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVCkge1xuICAgICAgICAgICRiZyA9ICh0aGlzLnJlc3VsdC5iZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgKCgkY29sb3JzLmZvcmVncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSykgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRiZyA9ICh0aGlzLnJlc3VsdC5iZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgdGhpcy5yZXN1bHQuZmcgJiAoQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSyk7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIG9iamVjdFxuICAgICRjb2xvcnMgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBVc2UgdGhlIG92ZXJyaWRlIGlmIGl0IGV4aXN0c1xuICAgIHRoaXMucmVzdWx0LmJnID0gJGhhc0JnID8gJGJnIDogdGhpcy5yZXN1bHQuYmc7XG4gICAgdGhpcy5yZXN1bHQuZmcgPSAkaGFzRmcgPyAkZmcgOiB0aGlzLnJlc3VsdC5mZztcblxuICAgIC8vIFJlc2V0IG92ZXJyaWRlcyB2YXJpYW50T2Zmc2V0XG4gICAgdGhpcy5yZXN1bHQuZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLnJlc3VsdC5leHQgfD0gKCR2YXJpYW50T2Zmc2V0IDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1RleHR1cmVBdGxhcyc7XG5pbXBvcnQgeyBJVGVybWluYWxPcHRpb25zLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJVGVybWluYWwsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDaGFyQXRsYXNDb25maWcsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbmZpZywgY29uZmlnRXF1YWxzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzVXRpbHMnO1xuXG5pbnRlcmZhY2UgSVRleHR1cmVBdGxhc0NhY2hlRW50cnkge1xuICBhdGxhczogSVRleHR1cmVBdGxhcztcbiAgY29uZmlnOiBJQ2hhckF0bGFzQ29uZmlnO1xuICAvLyBOLkIuIFRoaXMgaW1wbGVtZW50YXRpb24gcG90ZW50aWFsbHkgaG9sZHMgb250byBjb3BpZXMgb2YgdGhlIHRlcm1pbmFsIGZvcmV2ZXIsIHNvXG4gIC8vIHRoaXMgbWF5IGNhdXNlIG1lbW9yeSBsZWFrcy5cbiAgb3duZWRCeTogVGVybWluYWxbXTtcbn1cblxuY29uc3QgY2hhckF0bGFzQ2FjaGU6IElUZXh0dXJlQXRsYXNDYWNoZUVudHJ5W10gPSBbXTtcblxuLyoqXG4gKiBBY3F1aXJlcyBhIGNoYXIgYXRsYXMsIGVpdGhlciBnZW5lcmF0aW5nIGEgbmV3IG9uZSBvciByZXR1cm5pbmcgYW4gZXhpc3RpbmdcbiAqIG9uZSB0aGF0IGlzIGluIHVzZSBieSBhbm90aGVyIHRlcm1pbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgdGVybWluYWw6IFRlcm1pbmFsLFxuICBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPixcbiAgY29sb3JzOiBSZWFkb25seUNvbG9yU2V0LFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VDaGFyV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2hhckhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IElUZXh0dXJlQXRsYXMge1xuICBjb25zdCBuZXdDb25maWcgPSBnZW5lcmF0ZUNvbmZpZyhkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZUNoYXJXaWR0aCwgZGV2aWNlQ2hhckhlaWdodCwgb3B0aW9ucywgY29sb3JzLCBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRlcm1pbmFsIGFscmVhZHkgb3ducyB0aGlzIGNvbmZpZ1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJBdGxhc0NhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50cnkgPSBjaGFyQXRsYXNDYWNoZVtpXTtcbiAgICBjb25zdCBvd25lZEJ5SW5kZXggPSBlbnRyeS5vd25lZEJ5LmluZGV4T2YodGVybWluYWwpO1xuICAgIGlmIChvd25lZEJ5SW5kZXggPj0gMCkge1xuICAgICAgaWYgKGNvbmZpZ0VxdWFscyhlbnRyeS5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LmF0bGFzO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGNvbmZpZ3MgZGlmZmVyLCByZWxlYXNlIHRoZSB0ZXJtaW5hbCBmcm9tIHRoZSBlbnRyeVxuICAgICAgaWYgKGVudHJ5Lm93bmVkQnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVudHJ5LmF0bGFzLmRpc3Bvc2UoKTtcbiAgICAgICAgY2hhckF0bGFzQ2FjaGUuc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkub3duZWRCeS5zcGxpY2Uob3duZWRCeUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSBtYXRjaCBhIGNoYXIgYXRsYXMgZnJvbSB0aGUgY2FjaGVcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQXRsYXNDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gY2hhckF0bGFzQ2FjaGVbaV07XG4gICAgaWYgKGNvbmZpZ0VxdWFscyhlbnRyeS5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgIC8vIEFkZCB0aGUgdGVybWluYWwgdG8gdGhlIGNhY2hlIGVudHJ5IGFuZCByZXR1cm5cbiAgICAgIGVudHJ5Lm93bmVkQnkucHVzaCh0ZXJtaW5hbCk7XG4gICAgICByZXR1cm4gZW50cnkuYXRsYXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29yZTogSVRlcm1pbmFsID0gKHRlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG4gIGNvbnN0IG5ld0VudHJ5OiBJVGV4dHVyZUF0bGFzQ2FjaGVFbnRyeSA9IHtcbiAgICBhdGxhczogbmV3IFRleHR1cmVBdGxhcyhkb2N1bWVudCwgbmV3Q29uZmlnLCBjb3JlLnVuaWNvZGVTZXJ2aWNlKSxcbiAgICBjb25maWc6IG5ld0NvbmZpZyxcbiAgICBvd25lZEJ5OiBbdGVybWluYWxdXG4gIH07XG4gIGNoYXJBdGxhc0NhY2hlLnB1c2gobmV3RW50cnkpO1xuICByZXR1cm4gbmV3RW50cnkuYXRsYXM7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIHRlcm1pbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBjYWNoZSwgYWxsb3dpbmcgaXRzIG1lbW9yeSB0byBiZSBmcmVlZC5cbiAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwgdG8gcmVtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckF0bGFzQ2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmRleCA9IGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkuaW5kZXhPZih0ZXJtaW5hbCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2FjaGUgZW50cnkgaWYgaXQncyB0aGUgb25seSB0ZXJtaW5hbFxuICAgICAgICBjaGFyQXRsYXNDYWNoZVtpXS5hdGxhcy5kaXNwb3NlKCk7XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGNhY2hlIGVudHJ5XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ2hhckF0bGFzQ29uZmlnIH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSVRlcm1pbmFsT3B0aW9ucyB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJQ29sb3JTZXQsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IE5VTExfQ09MT1IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb25maWcoZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlciwgZGV2aWNlQ2hhcldpZHRoOiBudW1iZXIsIGRldmljZUNoYXJIZWlnaHQ6IG51bWJlciwgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz4sIGNvbG9yczogUmVhZG9ubHlDb2xvclNldCwgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyKTogSUNoYXJBdGxhc0NvbmZpZyB7XG4gIC8vIG51bGwgb3V0IHNvbWUgZmllbGRzIHRoYXQgZG9uJ3QgbWF0dGVyXG4gIGNvbnN0IGNsb25lZENvbG9yczogSUNvbG9yU2V0ID0ge1xuICAgIGZvcmVncm91bmQ6IGNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIGJhY2tncm91bmQ6IGNvbG9ycy5iYWNrZ3JvdW5kLFxuICAgIGN1cnNvcjogTlVMTF9DT0xPUixcbiAgICBjdXJzb3JBY2NlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uRm9yZWdyb3VuZDogTlVMTF9DT0xPUixcbiAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogTlVMTF9DT0xPUixcbiAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogTlVMTF9DT0xPUixcbiAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IE5VTExfQ09MT1IsXG4gICAgLy8gRm9yIHRoZSBzdGF0aWMgY2hhciBhdGxhcywgd2Ugb25seSB1c2UgdGhlIGZpcnN0IDE2IGNvbG9ycywgYnV0IHdlIG5lZWQgYWxsIDI1NiBmb3IgdGhlXG4gICAgLy8gZHluYW1pYyBjaGFyYWN0ZXIgYXRsYXMuXG4gICAgYW5zaTogY29sb3JzLmFuc2kuc2xpY2UoKSxcbiAgICBjb250cmFzdENhY2hlOiBjb2xvcnMuY29udHJhc3RDYWNoZSxcbiAgICBoYWxmQ29udHJhc3RDYWNoZTogY29sb3JzLmhhbGZDb250cmFzdENhY2hlXG4gIH07XG4gIHJldHVybiB7XG4gICAgY3VzdG9tR2x5cGhzOiBvcHRpb25zLmN1c3RvbUdseXBocyxcbiAgICBkZXZpY2VQaXhlbFJhdGlvLFxuICAgIGxldHRlclNwYWNpbmc6IG9wdGlvbnMubGV0dGVyU3BhY2luZyxcbiAgICBsaW5lSGVpZ2h0OiBvcHRpb25zLmxpbmVIZWlnaHQsXG4gICAgZGV2aWNlQ2VsbFdpZHRoOiBkZXZpY2VDZWxsV2lkdGgsXG4gICAgZGV2aWNlQ2VsbEhlaWdodDogZGV2aWNlQ2VsbEhlaWdodCxcbiAgICBkZXZpY2VDaGFyV2lkdGg6IGRldmljZUNoYXJXaWR0aCxcbiAgICBkZXZpY2VDaGFySGVpZ2h0OiBkZXZpY2VDaGFySGVpZ2h0LFxuICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICBmb250V2VpZ2h0OiBvcHRpb25zLmZvbnRXZWlnaHQsXG4gICAgZm9udFdlaWdodEJvbGQ6IG9wdGlvbnMuZm9udFdlaWdodEJvbGQsXG4gICAgYWxsb3dUcmFuc3BhcmVuY3k6IG9wdGlvbnMuYWxsb3dUcmFuc3BhcmVuY3ksXG4gICAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM6IG9wdGlvbnMuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMsXG4gICAgbWluaW11bUNvbnRyYXN0UmF0aW86IG9wdGlvbnMubWluaW11bUNvbnRyYXN0UmF0aW8sXG4gICAgY29sb3JzOiBjbG9uZWRDb2xvcnNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ0VxdWFscyhhOiBJQ2hhckF0bGFzQ29uZmlnLCBiOiBJQ2hhckF0bGFzQ29uZmlnKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5jb2xvcnMuYW5zaS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhLmNvbG9ycy5hbnNpW2ldLnJnYmEgIT09IGIuY29sb3JzLmFuc2lbaV0ucmdiYSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYS5kZXZpY2VQaXhlbFJhdGlvID09PSBiLmRldmljZVBpeGVsUmF0aW8gJiZcbiAgICAgIGEuY3VzdG9tR2x5cGhzID09PSBiLmN1c3RvbUdseXBocyAmJlxuICAgICAgYS5saW5lSGVpZ2h0ID09PSBiLmxpbmVIZWlnaHQgJiZcbiAgICAgIGEubGV0dGVyU3BhY2luZyA9PT0gYi5sZXR0ZXJTcGFjaW5nICYmXG4gICAgICBhLmZvbnRGYW1pbHkgPT09IGIuZm9udEZhbWlseSAmJlxuICAgICAgYS5mb250U2l6ZSA9PT0gYi5mb250U2l6ZSAmJlxuICAgICAgYS5mb250V2VpZ2h0ID09PSBiLmZvbnRXZWlnaHQgJiZcbiAgICAgIGEuZm9udFdlaWdodEJvbGQgPT09IGIuZm9udFdlaWdodEJvbGQgJiZcbiAgICAgIGEuYWxsb3dUcmFuc3BhcmVuY3kgPT09IGIuYWxsb3dUcmFuc3BhcmVuY3kgJiZcbiAgICAgIGEuZGV2aWNlQ2hhcldpZHRoID09PSBiLmRldmljZUNoYXJXaWR0aCAmJlxuICAgICAgYS5kZXZpY2VDaGFySGVpZ2h0ID09PSBiLmRldmljZUNoYXJIZWlnaHQgJiZcbiAgICAgIGEuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgPT09IGIuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiZcbiAgICAgIGEubWluaW11bUNvbnRyYXN0UmF0aW8gPT09IGIubWluaW11bUNvbnRyYXN0UmF0aW8gJiZcbiAgICAgIGEuY29sb3JzLmZvcmVncm91bmQucmdiYSA9PT0gYi5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhICYmXG4gICAgICBhLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmEgPT09IGIuY29sb3JzLmJhY2tncm91bmQucmdiYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzMjU2Q29sb3IoY29sb3JDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChjb2xvckNvZGUgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAoY29sb3JDb2RlICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBpc0ZpcmVmb3gsIGlzTGVnYWN5RWRnZSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5cbmV4cG9ydCBjb25zdCBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SID0gMjU3O1xuXG5leHBvcnQgY29uc3QgRElNX09QQUNJVFkgPSAwLjU7XG4vLyBUaGUgdGV4dCBiYXNlbGluZSBpcyBzZXQgY29uZGl0aW9uYWxseSBieSBicm93c2VyLiBVc2luZyAnaWRlb2dyYXBoaWMnIGZvciBGaXJlZm94IG9yIExlZ2FjeSBFZGdlXG4vLyB3b3VsZCByZXN1bHQgaW4gdHJ1bmNhdGVkIHRleHQgKElzc3VlIDMzNTMpLiBVc2luZyAnYm90dG9tJyBmb3IgQ2hyb21lIHdvdWxkIHJlc3VsdCBpbiBzbGlnaHRseVxuLy8gdW5hbGlnbmVkIFBvd2VybGluZSBmb250cyAoUFIgMzM1NiNpc3N1ZWNvbW1lbnQtODUwOTI4MTc5KS5cbmV4cG9ydCBjb25zdCBURVhUX0JBU0VMSU5FOiBDYW52YXNUZXh0QmFzZWxpbmUgPSBpc0ZpcmVmb3ggfHwgaXNMZWdhY3lFZGdlID8gJ2JvdHRvbScgOiAnaWRlb2dyYXBoaWMnO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogVGhlIHRpbWUgYmV0d2VlbiBjdXJzb3IgYmxpbmtzLlxuICovXG5jb25zdCBCTElOS19JTlRFUlZBTCA9IDYwMDtcblxuZXhwb3J0IGNsYXNzIEN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIHtcbiAgcHVibGljIGlzQ3Vyc29yVmlzaWJsZTogYm9vbGVhbjtcblxuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9ibGlua1N0YXJ0VGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9ibGlua0ludGVydmFsOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhbmltYXRpb24gZnJhbWUgd2FzIHJlc3RhcnRlZCwgdGhpcyBpcyB1c2VkIG9uIHRoZVxuICAgKiBuZXh0IHJlbmRlciB0byByZXN0YXJ0IHRoZSB0aW1lcnMgc28gdGhleSBkb24ndCBuZWVkIHRvIHJlc3RhcnQgdGhlIHRpbWVyc1xuICAgKiBtdWx0aXBsZSB0aW1lcyBvdmVyIGEgc2hvcnQgcGVyaW9kLlxuICAgKi9cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uVGltZVJlc3RhcnRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlckNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQpIHtcbiAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQYXVzZWQoKTogYm9vbGVhbiB7IHJldHVybiAhKHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0IHx8IHRoaXMuX2JsaW5rSW50ZXJ2YWwpOyB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2JsaW5rSW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9ibGlua0ludGVydmFsKTtcbiAgICAgIHRoaXMuX2JsaW5rSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpO1xuICAgICAgdGhpcy5fYmxpbmtTdGFydFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzdGFydEJsaW5rQW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUGF1c2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNhdmUgYSB0aW1lc3RhbXAgc28gdGhhdCB0aGUgcmVzdGFydCBjYW4gYmUgZG9uZSBvbiB0aGUgbmV4dCBpbnRlcnZhbFxuICAgIHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xuICAgIC8vIEZvcmNlIGEgY3Vyc29yIHJlbmRlciB0byBlbnN1cmUgaXQncyB2aXNpYmxlIGFuZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXN0YXJ0SW50ZXJ2YWwodGltZVRvU3RhcnQ6IG51bWJlciA9IEJMSU5LX0lOVEVSVkFMKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGludGVydmFsXG4gICAgaWYgKHRoaXMuX2JsaW5rSW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9ibGlua0ludGVydmFsKTtcbiAgICAgIHRoaXMuX2JsaW5rSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgdGhlIGluaXRpYWwgdGltZW91dCB3aGljaCB3aWxsIGhpZGUgdGhlIGN1cnNvciwgdGhpcyBpcyBkb25lIGJlZm9yZVxuICAgIC8vIHRoZSByZWd1bGFyIGludGVydmFsIGlzIHNldHVwIGluIG9yZGVyIHRvIHN1cHBvcnQgcmVzdGFydGluZyB0aGUgYmxpbmtcbiAgICAvLyBhbmltYXRpb24gaW4gYSBsaWdodHdlaWdodCB3YXkgKHdpdGhvdXQgdGhyYXNoaW5nIGNsZWFySW50ZXJ2YWwgYW5kXG4gICAgLy8gc2V0SW50ZXJ2YWwpLlxuICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIGFub3RoZXIgYW5pbWF0aW9uIHJlc3RhcnQgd2FzIHJlcXVlc3RlZCB3aGlsZSB0aGlzIHdhcyBiZWluZ1xuICAgICAgLy8gc3RhcnRlZFxuICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IEJMSU5LX0lOVEVSVkFMIC0gKERhdGUubm93KCkgLSB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRpbWUgPiAwKSB7XG4gICAgICAgICAgdGhpcy5fcmVzdGFydEludGVydmFsKHRpbWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIHRoZSBjdXJzb3JcbiAgICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0dXAgdGhlIGJsaW5rIGludGVydmFsXG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYW5pbWF0aW9uIHRpbWUgaWYgaXQgd2FzIHJlc3RhcnRlZFxuICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCkge1xuICAgICAgICAgIC8vIGNhbGMgdGltZSBkaWZmXG4gICAgICAgICAgLy8gTWFrZSByZXN0YXJ0IGludGVydmFsIGRvIGEgc2V0VGltZW91dCBpbml0aWFsbHk/XG4gICAgICAgICAgY29uc3QgdGltZSA9IEJMSU5LX0lOVEVSVkFMIC0gKERhdGUubm93KCkgLSB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCh0aW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnZlcnQgdmlzaWJpbGl0eSBhbmQgcmVuZGVyXG4gICAgICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gIXRoaXMuaXNDdXJzb3JWaXNpYmxlO1xuICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJDYWxsYmFjaygpO1xuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgIH0sIEJMSU5LX0lOVEVSVkFMKTtcbiAgICB9LCB0aW1lVG9TdGFydCk7XG4gIH1cblxuICBwdWJsaWMgcGF1c2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc0N1cnNvclZpc2libGUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc3VtZSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBvdXQgYW55IGV4aXN0aW5nIHRpbWVycyBqdXN0IGluIGNhc2VcbiAgICB0aGlzLnBhdXNlKCk7XG5cbiAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCgpO1xuICAgIHRoaXMucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbmludGVyZmFjZSBJQmxvY2tWZWN0b3Ige1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgdzogbnVtYmVyO1xuICBoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBibG9ja0VsZW1lbnREZWZpbml0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IElCbG9ja1ZlY3RvcltdIHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIEJsb2NrIGVsZW1lbnRzICgweDI1ODAtMHgyNTkwKVxuICAn4paAJzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNCB9XSwgLy8gVVBQRVIgSEFMRiBCTE9DS1xuICAn4paBJzogW3sgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSwgLy8gTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAn4paCJzogW3sgeDogMCwgeTogNiwgdzogOCwgaDogMiB9XSwgLy8gTE9XRVIgT05FIFFVQVJURVIgQkxPQ0tcbiAgJ+KWgyc6IFt7IHg6IDAsIHk6IDUsIHc6IDgsIGg6IDMgfV0sIC8vIExPV0VSIFRIUkVFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWhCc6IFt7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDQgfV0sIC8vIExPV0VSIEhBTEYgQkxPQ0tcbiAgJ+KWhSc6IFt7IHg6IDAsIHk6IDMsIHc6IDgsIGg6IDUgfV0sIC8vIExPV0VSIEZJVkUgRUlHSFRIUyBCTE9DS1xuICAn4paGJzogW3sgeDogMCwgeTogMiwgdzogOCwgaDogNiB9XSwgLy8gTE9XRVIgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ+KWhyc6IFt7IHg6IDAsIHk6IDEsIHc6IDgsIGg6IDcgfV0sIC8vIExPV0VSIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWiCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDggfV0sIC8vIEZVTEwgQkxPQ0tcbiAgJ+KWiSc6IFt7IHg6IDAsIHk6IDAsIHc6IDcsIGg6IDggfV0sIC8vIExFRlQgU0VWRU4gRUlHSFRIUyBCTE9DS1xuICAn4paKJzogW3sgeDogMCwgeTogMCwgdzogNiwgaDogOCB9XSwgLy8gTEVGVCBUSFJFRSBRVUFSVEVSUyBCTE9DS1xuICAn4paLJzogW3sgeDogMCwgeTogMCwgdzogNSwgaDogOCB9XSwgLy8gTEVGVCBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWjCc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIExFRlQgSEFMRiBCTE9DS1xuICAn4paNJzogW3sgeDogMCwgeTogMCwgdzogMywgaDogOCB9XSwgLy8gTEVGVCBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICfilo4nOiBbeyB4OiAwLCB5OiAwLCB3OiAyLCBoOiA4IH1dLCAvLyBMRUZUIE9ORSBRVUFSVEVSIEJMT0NLXG4gICfilo8nOiBbeyB4OiAwLCB5OiAwLCB3OiAxLCBoOiA4IH1dLCAvLyBMRUZUIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWkCc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIFJJR0hUIEhBTEYgQkxPQ0tcblxuICAvLyBCbG9jayBlbGVtZW50cyAoMHgyNTk0LTB4MjU5NSlcbiAgJ+KWlCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sIC8vIFVQUEVSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWlSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfV0sIC8vIFJJR0hUIE9ORSBFSUdIVEggQkxPQ0tcblxuICAvLyBUZXJtaW5hbCBncmFwaGljIGNoYXJhY3RlcnMgKDB4MjU5Ni0weDI1OUYpXG4gICfilpYnOiBbeyB4OiAwLCB5OiA0LCB3OiA0LCBoOiA0IH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVBRFJBTlQgTE9XRVIgTEVGVFxuICAn4paXJzogW3sgeDogNCwgeTogNCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIExPV0VSIFJJR0hUXG4gICfilpgnOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA0IH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVFxuICAn4paZJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogOCB9LCB7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIExPV0VSIExFRlQgQU5EIExPV0VSIFJJR0hUXG4gICfilponOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA0IH0sIHsgeDogNCwgeTogNCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVCBBTkQgTE9XRVIgUklHSFRcbiAgJ+KWmyc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgTEVGVFxuICAn4pacJzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNCB9LCB7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIFVQUEVSIFJJR0hUIEFORCBMT1dFUiBSSUdIVFxuICAn4padJzogW3sgeDogNCwgeTogMCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIFVQUEVSIFJJR0hUXG4gICfilp4nOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA0IH0sIHsgeDogMCwgeTogNCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlRcbiAgJ+KWnyc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgTEVGVCBBTkQgTE9XRVIgUklHSFRcblxuICAvLyBWRVJUSUNBTCBPTkUgRUlHSFRIIEJMT0NLLTIgdGhyb3VnaCBWRVJUSUNBTCBPTkUgRUlHSFRIIEJMT0NLLTdcbiAgJ1xcdXsxRkI3MH0nOiBbeyB4OiAxLCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjcxfSc6IFt7IHg6IDIsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzJ9JzogW3sgeDogMywgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3M30nOiBbeyB4OiA0LCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjc0fSc6IFt7IHg6IDUsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzV9JzogW3sgeDogNiwgeTogMCwgdzogMSwgaDogOCB9XSxcblxuICAvLyBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stMiB0aHJvdWdoIEhPUklaT05UQUwgT05FIEVJR0hUSCBCTE9DSy03XG4gICdcXHV7MUZCNzZ9JzogW3sgeDogMCwgeTogMSwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3N30nOiBbeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjc4fSc6IFt7IHg6IDAsIHk6IDMsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCNzl9JzogW3sgeDogMCwgeTogNCwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3QX0nOiBbeyB4OiAwLCB5OiA1LCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjdCfSc6IFt7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDEgfV0sXG5cbiAgLy8gTEVGVCBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdDfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBMRUZUIEFORCBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0R9JzogW3sgeDogMCwgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFJJR0hUIEFORCBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0V9JzogW3sgeDogNywgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFJJR0hUIEFORCBMT1dFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0Z9JzogW3sgeDogNywgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFVQUEVSIEFORCBMT1dFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCODB9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIEhPUklaT05UQUwgT05FIEVJR0hUSCBCTE9DSy0xMzU4XG4gICdcXHV7MUZCODF9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiAxIH0sIHsgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSxcblxuICAvLyBVUFBFUiBPTkUgUVVBUlRFUiBCTE9DS1xuICAnXFx1ezFGQjgyfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDIgfV0sXG4gIC8vIFVQUEVSIFRIUkVFIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4M30nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAzIH1dLFxuICAvLyBVUFBFUiBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4NH0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA1IH1dLFxuICAvLyBVUFBFUiBUSFJFRSBRVUFSVEVSUyBCTE9DS1xuICAnXFx1ezFGQjg1fSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDYgfV0sXG4gIC8vIFVQUEVSIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4Nn0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA3IH1dLFxuXG4gIC8vIFJJR0hUIE9ORSBRVUFSVEVSIEJMT0NLXG4gICdcXHV7MUZCODd9JzogW3sgeDogNiwgeTogMCwgdzogMiwgaDogOCB9XSxcbiAgLy8gUklHSFQgVEhSRUUgRUlHSFRIUyBCME9DS1xuICAnXFx1ezFGQjg4fSc6IFt7IHg6IDUsIHk6IDAsIHc6IDMsIGg6IDggfV0sXG4gIC8vIFJJR0hUIEZJVkUgRUlHSFRIUyBCTDBDS1xuICAnXFx1ezFGQjg5fSc6IFt7IHg6IDMsIHk6IDAsIHc6IDUsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFRIUkVFIFFVQVJURVJTIDBMT0NLXG4gICdcXHV7MUZCOEF9JzogW3sgeDogMiwgeTogMCwgdzogNiwgaDogOCB9XSxcbiAgLy8gUklHSFQgU0VWRU4gRUlHSFRIUyBCME9DS1xuICAnXFx1ezFGQjhCfSc6IFt7IHg6IDEsIHk6IDAsIHc6IDcsIGg6IDggfV0sXG5cbiAgLy8gQ0hFQ0tFUiBCT0FSRCBGSUxMXG4gICdcXHV7MUZCOTV9JzogW1xuICAgIHsgeDogMCwgeTogMCwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDAsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDIsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiAyLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiA0LCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogNCwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMiwgeTogNiwgdzogMiwgaDogMiB9LCB7IHg6IDYsIHk6IDYsIHc6IDIsIGg6IDIgfVxuICBdLFxuICAvLyBJTlZFUlNFIENIRUNLRVIgQk9BUkQgRklMTFxuICAnXFx1ezFGQjk2fSc6IFtcbiAgICB7IHg6IDIsIHk6IDAsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiAwLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiAyLCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogMiwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMiwgeTogNCwgdzogMiwgaDogMiB9LCB7IHg6IDYsIHk6IDQsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDAsIHk6IDYsIHc6IDIsIGg6IDIgfSwgeyB4OiA0LCB5OiA2LCB3OiAyLCBoOiAyIH1cbiAgXSxcbiAgLy8gSEVBVlkgSE9SSVpPTlRBTCBGSUxMICh1cHBlciBtaWRkbGUgYW5kIGxvd2VyIG9uZSBxdWFydGVyIGJsb2NrKVxuICAnXFx1ezFGQjk3fSc6IFt7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDIgfSwgeyB4OiAwLCB5OiA2LCB3OiA4LCBoOiAyIH1dXG59O1xuXG50eXBlIFBhdHRlcm5EZWZpbml0aW9uID0gbnVtYmVyW11bXTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXBlYXRpbmcgcGF0dGVybiB1c2VkIGJ5IHNwZWNpYWwgY2hhcmFjdGVycywgdGhlIHBhdHRlcm4gaXMgbWFkZSB1cCBvZiBhIDJkIGFycmF5IG9mXG4gKiBwaXhlbCB2YWx1ZXMgdG8gYmUgZmlsbGVkICgxKSBvciBub3QgZmlsbGVkICgwKS5cbiAqL1xuY29uc3QgcGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zOiB7IFtrZXk6IHN0cmluZ106IFBhdHRlcm5EZWZpbml0aW9uIHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIFNoYWRlIGNoYXJhY3RlcnMgKDB4MjU5MS0weDI1OTMpXG4gICfilpEnOiBbIC8vIExJR0hUIFNIQURFICgyNSUpXG4gICAgWzEsIDAsIDAsIDBdLFxuICAgIFswLCAwLCAwLCAwXSxcbiAgICBbMCwgMCwgMSwgMF0sXG4gICAgWzAsIDAsIDAsIDBdXG4gIF0sXG4gICfilpInOiBbIC8vIE1FRElVTSBTSEFERSAoNTAlKVxuICAgIFsxLCAwXSxcbiAgICBbMCwgMF0sXG4gICAgWzAsIDFdLFxuICAgIFswLCAwXVxuICBdLFxuICAn4paTJzogWyAvLyBEQVJLIFNIQURFICg3NSUpXG4gICAgWzAsIDFdLFxuICAgIFsxLCAxXSxcbiAgICBbMSwgMF0sXG4gICAgWzEsIDFdXG4gIF1cbn07XG5cbmNvbnN0IGVudW0gU2hhcGVzIHtcbiAgLyoqIOKUgiAqLyBUT1BfVE9fQk9UVE9NID0gJ00uNSwwIEwuNSwxJyxcbiAgLyoqIOKUgCAqLyBMRUZUX1RPX1JJR0hUID0gJ00wLC41IEwxLC41JyxcblxuICAvKiog4pSUICovIFRPUF9UT19SSUdIVCA9ICdNLjUsMCBMLjUsLjUgTDEsLjUnLFxuICAvKiog4pSYICovIFRPUF9UT19MRUZUID0gJ00uNSwwIEwuNSwuNSBMMCwuNScsXG4gIC8qKiDilJAgKi8gTEVGVF9UT19CT1RUT00gPSAnTTAsLjUgTC41LC41IEwuNSwxJyxcbiAgLyoqIOKUjCAqLyBSSUdIVF9UT19CT1RUT00gPSAnTTAuNSwxIEwuNSwuNSBMMSwuNScsXG5cbiAgLyoqIOKVtSAqLyBNSURETEVfVE9fVE9QID0gJ00uNSwuNSBMLjUsMCcsXG4gIC8qKiDilbQgKi8gTUlERExFX1RPX0xFRlQgPSAnTS41LC41IEwwLC41JyxcbiAgLyoqIOKVtiAqLyBNSURETEVfVE9fUklHSFQgPSAnTS41LC41IEwxLC41JyxcbiAgLyoqIOKVtyAqLyBNSURETEVfVE9fQk9UVE9NID0gJ00uNSwuNSBMLjUsMScsXG5cbiAgLyoqIOKUtCAqLyBUX1RPUCA9ICdNMCwuNSBMMSwuNSBNLjUsLjUgTC41LDAnLFxuICAvKiog4pSkICovIFRfTEVGVCA9ICdNLjUsMCBMLjUsMSBNLjUsLjUgTDAsLjUnLFxuICAvKiog4pScICovIFRfUklHSFQgPSAnTS41LDAgTC41LDEgTS41LC41IEwxLC41JyxcbiAgLyoqIOKUrCAqLyBUX0JPVFRPTSA9ICdNMCwuNSBMMSwuNSBNLjUsLjUgTC41LDEnLFxuXG4gIC8qKiDilLwgKi8gQ1JPU1MgPSAnTTAsLjUgTDEsLjUgTS41LDAgTC41LDEnLFxuXG4gIC8qKiDilYwgKi8gVFdPX0RBU0hFU19IT1JJWk9OVEFMID0gJ00uMSwuNSBMLjQsLjUgTS42LC41IEwuOSwuNScsIC8vIC4yIGVtcHR5LCAuMyBmaWxsZWRcbiAgLyoqIOKUhCAqLyBUSFJFRV9EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjA2NjcsLjUgTC4yNjY3LC41IE0uNCwuNSBMLjYsLjUgTS43MzMzLC41IEwuOTMzMywuNScsIC8vIC4xMzMzIGVtcHR5LCAuMiBmaWxsZWRcbiAgLyoqIOKUiSAqLyBGT1VSX0RBU0hFU19IT1JJWk9OVEFMID0gJ00uMDUsLjUgTC4yLC41IE0uMywuNSBMLjQ1LC41IE0uNTUsLjUgTC43LC41IE0uOCwuNSBMLjk1LC41JywgLy8gLjEgZW1wdHksIC4xNSBmaWxsZWRcbiAgLyoqIOKVjiAqLyBUV09fREFTSEVTX1ZFUlRJQ0FMID0gJ00uNSwuMSBMLjUsLjQgTS41LC42IEwuNSwuOScsXG4gIC8qKiDilIYgKi8gVEhSRUVfREFTSEVTX1ZFUlRJQ0FMID0gJ00uNSwuMDY2NyBMLjUsLjI2NjcgTS41LC40IEwuNSwuNiBNLjUsLjczMzMgTC41LC45MzMzJyxcbiAgLyoqIOKUiiAqLyBGT1VSX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjA1IEwuNSwuMiBNLjUsLjMgTC41LC40NSBMLjUsLjU1IE0uNSwuNyBMLjUsLjk1Jyxcbn1cblxuY29uc3QgZW51bSBTdHlsZSB7XG4gIE5PUk1BTCA9IDEsXG4gIEJPTEQgPSAzXG59XG5cbi8qKlxuICogQHBhcmFtIHhwIFRoZSBwZXJjZW50YWdlIG9mIDE1JSBvZiB0aGUgeCBheGlzLlxuICogQHBhcmFtIHlwIFRoZSBwZXJjZW50YWdlIG9mIDE1JSBvZiB0aGUgeCBheGlzIG9uIHRoZSB5IGF4aXMuXG4gKi9cbnR5cGUgRHJhd0Z1bmN0aW9uRGVmaW5pdGlvbiA9ICh4cDogbnVtYmVyLCB5cDogbnVtYmVyKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIGJveCBkcmF3aW5nIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBvZiBTVkcgcGF0aHMgKGllLiB0aGVcbiAqIHN2ZyBkIGF0dHJpYnV0ZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBib3hEcmF3aW5nRGVmaW5pdGlvbnM6IHsgW2NoYXJhY3Rlcjogc3RyaW5nXTogeyBbZm9udFdlaWdodDogbnVtYmVyXTogc3RyaW5nIHwgRHJhd0Z1bmN0aW9uRGVmaW5pdGlvbiB9IHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIFVuaWZvcm0gbm9ybWFsIGFuZCBib2xkXG4gICfilIAnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pSBJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUgic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilIMnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pSMJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSPJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSQJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilJMnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUlCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUlyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUmCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pSbJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilJwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9SSUdIVCB9LFxuICAn4pSjJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRfUklHSFQgfSxcbiAgJ+KUpCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UX0xFRlQgfSxcbiAgJ+KUqyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX0xFRlQgfSxcbiAgJ+KUrCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UX0JPVFRPTSB9LFxuICAn4pSzJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRfQk9UVE9NIH0sXG4gICfilLQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9UT1AgfSxcbiAgJ+KUuyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX1RPUCB9LFxuICAn4pS8JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkNST1NTIH0sXG4gICfilYsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuQ1JPU1MgfSxcbiAgJ+KVtCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW4JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilbUnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pW5JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVtic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KVuic6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KVtyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilbsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuXG4gIC8vIERvdWJsZSBib3JkZXJcbiAgJ+KVkCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWRJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDFgIH0sXG4gICfilZInOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDEgTC41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWTJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDEgTCR7LjUgLSB4cH0sLjUgTDEsLjUgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVlCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMSwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVlSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwuNSwkey41IC0geXB9IEwuNSwxIE0wLCR7LjUgKyB5cH0gTC41LCR7LjUgKyB5cH1gIH0sXG4gICfilZYnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgKyB4cH0sMSBMJHsuNSArIHhwfSwuNSBMMCwuNSBNJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwxYCB9LFxuICAn4pWXJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWYJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTS41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfWAgfSxcbiAgJ+KVmSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMSwuNSBMJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwwIE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDBgIH0sXG4gICfilZonOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDAgTTEsJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwkey41ICsgeXB9IEwkey41IC0geHB9LDBgIH0sXG4gICfilZsnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSArIHlwfSBMLjUsJHsuNSArIHlwfSBMLjUsMCBNMCwkey41IC0geXB9IEwuNSwkey41IC0geXB9YCB9LFxuICAn4pWcJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLC41IEwkey41ICsgeHB9LC41IEwkey41ICsgeHB9LDAgTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMGAgfSxcbiAgJ+KVnSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMCBNMCwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMGAgfSxcbiAgJ+KVnic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSBNLjUsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0uNSwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH1gIH0sXG4gICfilZ8nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMSBNJHsuNSArIHhwfSwuNSBMMSwuNWAgfSxcbiAgJ+KVoCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDEgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaEnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwuNSwkey41ICsgeXB9YCB9LFxuICAn4pWiJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLC41IEwkey41IC0geHB9LC41IE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDFgIH0sXG4gICfilaMnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxIE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwYCB9LFxuICAn4pWkJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTS41LCR7LjUgKyB5cH0gTC41LDFgIH0sXG4gICfilaUnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWmJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVpyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSAtIHlwfSBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWoJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9IE0key41IC0geHB9LC41IEwkey41IC0geHB9LDAgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMGAgfSxcbiAgJ+KVqSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTTAsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDAgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaonOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVqyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWsJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0xLCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sJHsuNSArIHlwfSBMJHsuNSArIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuXG4gIC8vIERpYWdvbmFsXG4gICfilbEnOiB7IFtTdHlsZS5OT1JNQUxdOiAnTTEsMCBMMCwxJyB9LFxuICAn4pWyJzogeyBbU3R5bGUuTk9STUFMXTogJ00wLDAgTDEsMScgfSxcbiAgJ+KVsyc6IHsgW1N0eWxlLk5PUk1BTF06ICdNMSwwIEwwLDEgTTAsMCBMMSwxJyB9LFxuXG4gIC8vIE1peGVkIHdlaWdodFxuICAn4pW8JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilb0nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilb4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW/JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSNJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilI4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilJEnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pSSJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSVJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilJYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilJknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pSaJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSdJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilJ4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuUklHSFRfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilJ8nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilKAnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilKEnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUoic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSlJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUpic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUpyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUqCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KUqSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilKonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSB9LFxuICAn4pStJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUric6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSvJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pSwJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSxJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUsic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pS1JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUtic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pS3JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pS4JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pS5JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KUuic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19SSUdIVCB9LFxuICAn4pS9JzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19SSUdIVH1gLCAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUvic6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fTEVGVH1gLCAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pS/JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pWAJzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9ICR7U2hhcGVzLk1JRERMRV9UT19CT1RUT019YCwgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pWBJzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLk1JRERMRV9UT19UT1B9ICR7U2hhcGVzLkxFRlRfVE9fUklHSFR9YCwgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pWCJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pWDJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KVhCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19SSUdIVCB9LFxuICAn4pWFJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KVhic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pWHJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBgJHtTaGFwZXMuTUlERExFX1RPX1RPUH0gJHtTaGFwZXMuTEVGVF9UT19SSUdIVH1gIH0sXG4gICfilYgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSAke1NoYXBlcy5NSURETEVfVE9fQk9UVE9NfWAgfSxcbiAgJ+KViSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19MRUZUfWAgfSxcbiAgJ+KViic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19SSUdIVH1gIH0sXG5cbiAgLy8gRGFzaGVkXG4gICfilYwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVFdPX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilY0nOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVFdPX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVEhSRUVfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUhSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5USFJFRV9EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pSIJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkZPVVJfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUiSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5GT1VSX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilY4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVFdPX0RBU0hFU19WRVJUSUNBTCB9LFxuICAn4pWPJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRXT19EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KUhic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5USFJFRV9EQVNIRVNfVkVSVElDQUwgIH0sXG4gICfilIcnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVEhSRUVfREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuRk9VUl9EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KUiyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5GT1VSX0RBU0hFU19WRVJUSUNBTCB9LFxuXG4gIC8vIEN1cnZlZFxuICAn4pWtJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwxIEwuNSwkey41ICsgKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMSwuNWAgfSxcbiAgJ+KVric6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMSBMLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDAsLjVgIH0sXG4gICfila8nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDAgTC41LCR7LjUgLSAoeXAgLyAuMTUgKiAuNSl9IEMuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSwuNSwuNSwwLC41YCB9LFxuICAn4pWwJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMSwuNWAgfVxufTtcblxuaW50ZXJmYWNlIElWZWN0b3JTaGFwZSB7XG4gIGQ6IHN0cmluZztcbiAgdHlwZTogVmVjdG9yVHlwZTtcbiAgbGVmdFBhZGRpbmc/OiBudW1iZXI7XG4gIHJpZ2h0UGFkZGluZz86IG51bWJlcjtcbn1cblxuY29uc3QgZW51bSBWZWN0b3JUeXBlIHtcbiAgRklMTCxcbiAgU1RST0tFXG59XG5cbi8qKlxuICogVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHByaW1hcmlseSB1c2VkIGJveCBkcmF3aW5nIGNoYXJhY3RlcnMgYXMgdmVjdG9yIHNoYXBlcy4gVGhlXG4gKiByZWFzb24gdGhlc2UgY2hhcmFjdGVycyBhcmUgZGVmaW5lZCBzcGVjaWFsbHkgaXMgdG8gYXZvaWQgY29tbW9uIHByb2JsZW1zIGlmIGEgdXNlcidzIGZvbnQgaGFzXG4gKiBub3QgYmVlbiBwYXRjaGVkIHdpdGggcG93ZXJsaW5lIGNoYXJhY3RlcnMgYW5kIGFsc28gdG8gZ2V0IHBpeGVsIHBlcmZlY3QgcmVuZGVyaW5nIGFzIHJlbmRlcmluZ1xuICogaXNzdWVzIGNhbiBvY2N1ciBhcm91bmQgQUEvU1BBQS5cbiAqXG4gKiBUaGUgbGluZSB2YXJpYW50cyBkcmF3IGJleW9uZCB0aGUgY2VsbCBhbmQgZ2V0IGNsaXBwZWQgdG8gZW5zdXJlIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgbm90XG4gKiB2aXNpYmxlLlxuICpcbiAqIE9yaWdpbmFsIHN5bWJvbHMgZGVmaW5lZCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG93ZXJsaW5lL2ZvbnRwYXRjaGVyXG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlcmxpbmVEZWZpbml0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IElWZWN0b3JTaGFwZSB9ID0ge1xuICAvLyBSaWdodCB0cmlhbmdsZSBzb2xpZFxuICAnXFx1e0UwQjB9JzogeyBkOiAnTTAsMCBMMSwuNSBMMCwxJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCByaWdodFBhZGRpbmc6IDIgfSxcbiAgLy8gUmlnaHQgdHJpYW5nbGUgbGluZVxuICAnXFx1e0UwQjF9JzogeyBkOiAnTS0xLC0uNSBMMSwuNSBMLTEsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCB0cmlhbmdsZSBzb2xpZFxuICAnXFx1e0UwQjJ9JzogeyBkOiAnTTEsMCBMMCwuNSBMMSwxJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCBsZWZ0UGFkZGluZzogMiB9LFxuICAvLyBMZWZ0IHRyaWFuZ2xlIGxpbmVcbiAgJ1xcdXtFMEIzfSc6IHsgZDogJ00yLC0uNSBMMCwuNSBMMiwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBSaWdodCBzZW1pLWNpcmNsZSBzb2xpZFxuICAnXFx1e0UwQjR9JzogeyBkOiAnTTAsMCBMMCwxIEMwLjU1MiwxLDEsMC43NzYsMSwuNSBDMSwwLjIyNCwwLjU1MiwwLDAsMCcsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIFJpZ2h0IHNlbWktY2lyY2xlIGxpbmVcbiAgJ1xcdXtFMEI1fSc6IHsgZDogJ00uMiwxIEMuNDIyLDEsLjgsLjgyNiwuNzgsLjUgQy44LC4xNzQsMC40MjIsMCwuMiwwJywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBMZWZ0IHNlbWktY2lyY2xlIHNvbGlkXG4gICdcXHV7RTBCNn0nOiB7IGQ6ICdNMSwwIEwxLDEgQzAuNDQ4LDEsMCwwLjc3NiwwLC41IEMwLDAuMjI0LDAuNDQ4LDAsMSwwJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCBsZWZ0UGFkZGluZzogMSB9LFxuICAvLyBMZWZ0IHNlbWktY2lyY2xlIGxpbmVcbiAgJ1xcdXtFMEI3fSc6IHsgZDogJ00uOCwxIEMwLjU3OCwxLDAuMiwuODI2LC4yMiwuNSBDMC4yLDAuMTc0LDAuNTc4LDAsMC44LDAnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEgfSxcbiAgLy8gTG93ZXIgbGVmdCB0cmlhbmdsZVxuICAnXFx1e0UwQjh9JzogeyBkOiAnTS0uNSwtLjUgTDEuNSwxLjUgTC0uNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gQmFja3NsYXNoIHNlcGFyYXRvclxuICAnXFx1e0UwQjl9JzogeyBkOiAnTS0uNSwtLjUgTDEuNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBMb3dlciByaWdodCB0cmlhbmdsZVxuICAnXFx1e0UwQkF9JzogeyBkOiAnTTEuNSwtLjUgTC0uNSwxLjUgTDEuNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gVXBwZXIgbGVmdCB0cmlhbmdsZVxuICAnXFx1e0UwQkN9JzogeyBkOiAnTTEuNSwtLjUgTC0uNSwxLjUgTC0uNSwtLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gRm9yd2FyZCBzbGFzaCBzZXBhcmF0b3JcbiAgJ1xcdXtFMEJEfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gVXBwZXIgcmlnaHQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJFfSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41IEwxLjUsLS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH1cbn07XG4vLyBGb3J3YXJkIHNsYXNoIHNlcGFyYXRvciByZWR1bmRhbnRcbnBvd2VybGluZURlZmluaXRpb25zWydcXHV7RTBCQn0nXSA9IHBvd2VybGluZURlZmluaXRpb25zWydcXHV7RTBCRH0nXTtcbi8vIEJhY2tzbGFzaCBzZXBhcmF0b3IgcmVkdW5kYW50XG5wb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkZ9J10gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQjl9J107XG5cbi8qKlxuICogVHJ5IGRyYXdpbmcgYSBjdXN0b20gYmxvY2sgZWxlbWVudCBvciBib3ggZHJhd2luZyBjaGFyYWN0ZXIsIHJldHVybmluZyB3aGV0aGVyIGl0IHdhc1xuICogc3VjY2Vzc2Z1bGx5IGRyYXduLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5RHJhd0N1c3RvbUNoYXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBjOiBzdHJpbmcsXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IGJvb2xlYW4ge1xuICBjb25zdCBibG9ja0VsZW1lbnREZWZpbml0aW9uID0gYmxvY2tFbGVtZW50RGVmaW5pdGlvbnNbY107XG4gIGlmIChibG9ja0VsZW1lbnREZWZpbml0aW9uKSB7XG4gICAgZHJhd0Jsb2NrRWxlbWVudENoYXIoY3R4LCBibG9ja0VsZW1lbnREZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcGF0dGVybkRlZmluaXRpb24gPSBwYXR0ZXJuQ2hhcmFjdGVyRGVmaW5pdGlvbnNbY107XG4gIGlmIChwYXR0ZXJuRGVmaW5pdGlvbikge1xuICAgIGRyYXdQYXR0ZXJuQ2hhcihjdHgsIHBhdHRlcm5EZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYm94RHJhd2luZ0RlZmluaXRpb24gPSBib3hEcmF3aW5nRGVmaW5pdGlvbnNbY107XG4gIGlmIChib3hEcmF3aW5nRGVmaW5pdGlvbikge1xuICAgIGRyYXdCb3hEcmF3aW5nQ2hhcihjdHgsIGJveERyYXdpbmdEZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcG93ZXJsaW5lRGVmaW5pdGlvbiA9IHBvd2VybGluZURlZmluaXRpb25zW2NdO1xuICBpZiAocG93ZXJsaW5lRGVmaW5pdGlvbikge1xuICAgIGRyYXdQb3dlcmxpbmVDaGFyKGN0eCwgcG93ZXJsaW5lRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0LCBmb250U2l6ZSwgZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGRyYXdCbG9ja0VsZW1lbnRDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IElCbG9ja1ZlY3RvcltdLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckRlZmluaXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBib3ggPSBjaGFyRGVmaW5pdGlvbltpXTtcbiAgICBjb25zdCB4RWlnaHRoID0gZGV2aWNlQ2VsbFdpZHRoIC8gODtcbiAgICBjb25zdCB5RWlnaHRoID0gZGV2aWNlQ2VsbEhlaWdodCAvIDg7XG4gICAgY3R4LmZpbGxSZWN0KFxuICAgICAgeE9mZnNldCArIGJveC54ICogeEVpZ2h0aCxcbiAgICAgIHlPZmZzZXQgKyBib3gueSAqIHlFaWdodGgsXG4gICAgICBib3gudyAqIHhFaWdodGgsXG4gICAgICBib3guaCAqIHlFaWdodGhcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IGNhY2hlZFBhdHRlcm5zOiBNYXA8UGF0dGVybkRlZmluaXRpb24sIE1hcDwvKiBmaWxsU3R5bGUgKi9zdHJpbmcsIENhbnZhc1BhdHRlcm4+PiA9IG5ldyBNYXAoKTtcblxuZnVuY3Rpb24gZHJhd1BhdHRlcm5DaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IG51bWJlcltdW10sXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyXG4pOiB2b2lkIHtcbiAgbGV0IHBhdHRlcm5TZXQgPSBjYWNoZWRQYXR0ZXJucy5nZXQoY2hhckRlZmluaXRpb24pO1xuICBpZiAoIXBhdHRlcm5TZXQpIHtcbiAgICBwYXR0ZXJuU2V0ID0gbmV3IE1hcCgpO1xuICAgIGNhY2hlZFBhdHRlcm5zLnNldChjaGFyRGVmaW5pdGlvbiwgcGF0dGVyblNldCk7XG4gIH1cbiAgY29uc3QgZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgaWYgKHR5cGVvZiBmaWxsU3R5bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbGxTdHlsZSB0eXBlIFwiJHtmaWxsU3R5bGV9XCJgKTtcbiAgfVxuICBsZXQgcGF0dGVybiA9IHBhdHRlcm5TZXQuZ2V0KGZpbGxTdHlsZSk7XG4gIGlmICghcGF0dGVybikge1xuICAgIGNvbnN0IHdpZHRoID0gY2hhckRlZmluaXRpb25bMF0ubGVuZ3RoO1xuICAgIGNvbnN0IGhlaWdodCA9IGNoYXJEZWZpbml0aW9uLmxlbmd0aDtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBjdHguY2FudmFzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdG1wQ2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdG1wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCB0bXBDdHggPSB0aHJvd0lmRmFsc3kodG1wQ2FudmFzLmdldENvbnRleHQoJzJkJykpO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBFeHRyYWN0IHJnYmEgZnJvbSBmaWxsU3R5bGVcbiAgICBsZXQgcjogbnVtYmVyO1xuICAgIGxldCBnOiBudW1iZXI7XG4gICAgbGV0IGI6IG51bWJlcjtcbiAgICBsZXQgYTogbnVtYmVyO1xuICAgIGlmIChmaWxsU3R5bGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICByID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDEsIDMpLCAxNik7XG4gICAgICBnID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDMsIDUpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgICBhID0gZmlsbFN0eWxlLmxlbmd0aCA+IDcgJiYgcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDcsIDkpLCAxNikgfHwgMTtcbiAgICB9IGVsc2UgaWYgKGZpbGxTdHlsZS5zdGFydHNXaXRoKCdyZ2JhJykpIHtcbiAgICAgIChbciwgZywgYiwgYV0gPSBmaWxsU3R5bGUuc3Vic3RyaW5nKDUsIGZpbGxTdHlsZS5sZW5ndGggLSAxKS5zcGxpdCgnLCcpLm1hcChlID0+IHBhcnNlRmxvYXQoZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbGxTdHlsZSBjb2xvciBmb3JtYXQgXCIke2ZpbGxTdHlsZX1cIiB3aGVuIGRyYXdpbmcgcGF0dGVybiBnbHlwaGApO1xuICAgIH1cblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICAgIF0gPSByO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgMV0gPSBnO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgMl0gPSBiO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgM10gPSBjaGFyRGVmaW5pdGlvblt5XVt4XSAqIChhICogMjU1KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdG1wQ3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIHBhdHRlcm4gPSB0aHJvd0lmRmFsc3koY3R4LmNyZWF0ZVBhdHRlcm4odG1wQ2FudmFzLCBudWxsKSk7XG4gICAgcGF0dGVyblNldC5zZXQoZmlsbFN0eWxlLCBwYXR0ZXJuKTtcbiAgfVxuICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgY3R4LmZpbGxSZWN0KHhPZmZzZXQsIHlPZmZzZXQsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCk7XG59XG5cbi8qKlxuICogRHJhd3MgdGhlIGZvbGxvd2luZyBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGJ5IG1hcHBpbmcgYSBzdWJzZXQgb2YgU1ZHIGQgYXR0cmlidXRlIGluc3RydWN0aW9ucyB0b1xuICogY2FudmFzIGRyYXcgY2FsbHMuXG4gKlxuICogQm94IHN0eWxlczogICAgICAg4pSO4pSw4pSS4pSN4pSv4pSR4pWT4pWl4pWW4pWS4pWk4pWVIOKUj+KUs+KUk+KUjOKUsuKUk+KUjOKUrOKUkOKUj+KUseKUkFxuICog4pSM4pSA4pSs4pSA4pSQIOKUj+KUgeKUs+KUgeKUkyDilZTilZDilabilZDilZcg4pSg4pWC4pSo4pSd4pS/4pSl4pWf4pWr4pWi4pWe4pWq4pWhIOKUoeKVh+KUqeKUnOKViuKUq+KUouKViOKUquKUo+KVieKUpFxuICog4pSCIOKUgiDilIIg4pSDIOKUgyDilIMg4pWRIOKVkSDilZEg4pSW4pS44pSa4pSV4pS34pSZ4pWZ4pWo4pWc4pWY4pWn4pWbIOKUlOKUtOKUmOKUlOKUuuKUm+KUl+KUu+KUm+KUl+KUueKUmFxuICog4pSc4pSA4pS84pSA4pSkIOKUo+KUgeKVi+KUgeKUqyDilaDilZDilazilZDilaMg4pSP4pSx4pSQ4pSM4pSy4pST4pSM4pSs4pSQ4pSM4pSs4pSQIOKUj+KUs+KUk+KUjOKUruKUk+KUjOKUrOKUkOKUj+KUreKUkFxuICog4pSCIOKUgiDilIIg4pSDIOKUgyDilIMg4pWRIOKVkSDilZEg4pSh4pWD4pSk4pSc4pWE4pSp4pSc4pWG4pSq4pSi4pWF4pSkIOKUnuKVgOKUpuKUnOKUvuKUq+KUn+KVgeKUp+KUo+KUveKUpFxuICog4pSU4pSA4pS04pSA4pSYIOKUl+KUgeKUu+KUgeKUmyDilZrilZDilanilZDilZ0g4pSU4pS04pSY4pSU4pS04pSY4pSU4pS64pSb4pSX4pS54pSYIOKUlOKUtOKUmOKUlOKUtuKUm+KUl+KUu+KUm+KUl+KUteKUmFxuICpcbiAqIE90aGVyOlxuICog4pWt4pSA4pWuIOKVsiDilbEg4pW34pW74pWO4pWP4pSG4pSH4pSK4pSLIOKVuuKVvuKVtCDilYzilYzilYwg4pSE4pSE4pSEIOKUiOKUiOKUiFxuICog4pSCIOKUgiAg4pWzICDilb3ilb/ilY7ilY/ilIbilIfilIrilIsg4pW24pW84pW4IOKVjeKVjeKVjSDilIXilIXilIUg4pSJ4pSJ4pSJXG4gKiDilbDilIDila8g4pWxIOKVsiDilbnilbXilY7ilY/ilIbilIfilIrilItcbiAqXG4gKiBBbGwgYm94IGRyYXdpbmcgY2hhcmFjdGVyczpcbiAqIOKUgCDilIEg4pSCIOKUgyDilIQg4pSFIOKUhiDilIcg4pSIIOKUiSDilIog4pSLIOKUjCDilI0g4pSOIOKUj1xuICog4pSQIOKUkSDilJIg4pSTIOKUlCDilJUg4pSWIOKUlyDilJgg4pSZIOKUmiDilJsg4pScIOKUnSDilJ4g4pSfXG4gKiDilKAg4pShIOKUoiDilKMg4pSkIOKUpSDilKYg4pSnIOKUqCDilKkg4pSqIOKUqyDilKwg4pStIOKUriDilK9cbiAqIOKUsCDilLEg4pSyIOKUsyDilLQg4pS1IOKUtiDilLcg4pS4IOKUuSDilLog4pS7IOKUvCDilL0g4pS+IOKUv1xuICog4pWAIOKVgSDilYIg4pWDIOKVhCDilYUg4pWGIOKVhyDilYgg4pWJIOKViiDilYsg4pWMIOKVjSDilY4g4pWPXG4gKiDilZAg4pWRIOKVkiDilZMg4pWUIOKVlSDilZYg4pWXIOKVmCDilZkg4pWaIOKVmyDilZwg4pWdIOKVniDilZ9cbiAqIOKVoCDilaEg4pWiIOKVoyDilaQg4pWlIOKVpiDilacg4pWoIOKVqSDilaog4pWrIOKVrCDila0g4pWuIOKVr1xuICog4pWwIOKVsSDilbIg4pWzIOKVtCDilbUg4pW2IOKVtyDilbgg4pW5IOKVuiDilbsg4pW8IOKVvSDilb4g4pW/XG4gKlxuICogLS0tXG4gKlxuICogQm94IGRyYXdpbmcgYWxpZ25tZW50IHRlc3RzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWiFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWiVxuICogICDilZTilZDilZDilabilZDilZDilZcgIOKUjOKUgOKUgOKUrOKUgOKUgOKUkCAg4pWt4pSA4pSA4pSs4pSA4pSA4pWuICDila3ilIDilIDilKzilIDilIDila4gIOKUj+KUgeKUgeKUs+KUgeKUgeKUkyAg4pSO4pSS4pSP4pSRICAg4pW3ICDilbsg4pSP4pSv4pSTIOKUjOKUsOKUkCAgICDiloog4pWx4pWy4pWx4pWy4pWz4pWz4pWzXG4gKiAgIOKVkeKUjOKUgOKVqOKUgOKUkOKVkSAg4pSC4pWU4pWQ4pWn4pWQ4pWX4pSCICDilILilZLilZDilarilZDilZXilIIgIOKUguKVk+KUgOKVgeKUgOKVluKUgiAg4pSD4pSM4pSA4pWC4pSA4pSQ4pSDICDilJfilYPilYTilJkgIOKVtuKUvOKVtOKVuuKVi+KVuOKUoOKUvOKUqCDilJ3ilYvilKUgICAg4paLIOKVsuKVseKVsuKVseKVs+KVs+KVs1xuICogICDilZHilILilbIg4pWx4pSC4pWRICDilILilZEgICDilZHilIIgIOKUguKUgiDilIIg4pSC4pSCICDilILilZEg4pSDIOKVkeKUgiAg4pSD4pSCIOKVvyDilILilIMgIOKUjeKVheKVhuKUkyAgIOKVtSAg4pW5IOKUl+KUt+KUmyDilJTilLjilJggICAg4paMIOKVseKVsuKVseKVsuKVs+KVs+KVs1xuICogICDilaDilaEg4pWzIOKVnuKVoyAg4pSc4pWiICAg4pWf4pSkICDilJzilLzilIDilLzilIDilLzilKQgIOKUnOKVq+KUgOKVguKUgOKVq+KUpCAg4pSj4pS/4pW+4pS84pW84pS/4pSrICDilJXilJvilJbilJogICAgIOKUjOKUhOKUhOKUkCDilY4g4pSP4pSF4pSF4pSTIOKUiyDilo0g4pWy4pWx4pWy4pWx4pWz4pWz4pWzXG4gKiAgIOKVkeKUguKVsSDilbLilILilZEgIOKUguKVkSAgIOKVkeKUgiAg4pSC4pSCIOKUgiDilILilIIgIOKUguKVkSDilIMg4pWR4pSCICDilIPilIIg4pW9IOKUguKUgyAg4paR4paR4paS4paS4paT4paT4paI4paIIOKUiiAg4pSGIOKVjiDilY8gIOKUhyDilIsg4paOXG4gKiAgIOKVkeKUlOKUgOKVpeKUgOKUmOKVkSAg4pSC4pWa4pWQ4pWk4pWQ4pWd4pSCICDilILilZjilZDilarilZDilZvilIIgIOKUguKVmeKUgOKVgOKUgOKVnOKUgiAg4pSD4pSU4pSA4pWC4pSA4pSY4pSDICDilpHilpHilpLilpLilpPilpPilojilogg4pSKICDilIYg4pWOIOKVjyAg4pSHIOKUiyDilo9cbiAqICAg4pWa4pWQ4pWQ4pWp4pWQ4pWQ4pWdICDilJTilIDilIDilLTilIDilIDilJggIOKVsOKUgOKUgOKUtOKUgOKUgOKVryAg4pWw4pSA4pSA4pS04pSA4pSA4pWvICDilJfilIHilIHilLvilIHilIHilJsgICAgICAgICAgIOKUlOKVjOKVjOKUmCDilY4g4pSX4pWN4pWN4pSbIOKUiyAg4paB4paC4paD4paE4paF4paG4paH4paIXG4gKlxuICogU291cmNlOiBodHRwczovL3d3dy53My5vcmcvMjAwMS8wNi91dGYtOC10ZXN0L1VURi04LWRlbW8uaHRtbFxuICovXG5mdW5jdGlvbiBkcmF3Qm94RHJhd2luZ0NoYXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBjaGFyRGVmaW5pdGlvbjogeyBbZm9udFdlaWdodDogbnVtYmVyXTogc3RyaW5nIHwgKCh4cDogbnVtYmVyLCB5cDogbnVtYmVyKSA9PiBzdHJpbmcpIH0sXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IHZvaWQge1xuICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICBmb3IgKGNvbnN0IFtmb250V2VpZ2h0LCBpbnN0cnVjdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJEZWZpbml0aW9uKSkge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubGluZVdpZHRoID0gZGV2aWNlUGl4ZWxSYXRpbyAqIE51bWJlci5wYXJzZUludChmb250V2VpZ2h0KTtcbiAgICBsZXQgYWN0dWFsSW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHhwID0gLjE1O1xuICAgICAgY29uc3QgeXAgPSAuMTUgLyBkZXZpY2VDZWxsSGVpZ2h0ICogZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgYWN0dWFsSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zKHhwLCB5cCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBhY3R1YWxJbnN0cnVjdGlvbnMuc3BsaXQoJyAnKSkge1xuICAgICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uWzBdO1xuICAgICAgY29uc3QgZiA9IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXBbdHlwZV07XG4gICAgICBpZiAoIWYpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgZHJhd2luZyBpbnN0cnVjdGlvbnMgZm9yIFwiJHt0eXBlfVwiYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBpbnN0cnVjdGlvbi5zdWJzdHJpbmcoMSkuc3BsaXQoJywnKTtcbiAgICAgIGlmICghYXJnc1swXSB8fCAhYXJnc1sxXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGYoY3R4LCB0cmFuc2xhdGVBcmdzKGFyZ3MsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCwgeE9mZnNldCwgeU9mZnNldCwgdHJ1ZSwgZGV2aWNlUGl4ZWxSYXRpbykpO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKCk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdQb3dlcmxpbmVDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IElWZWN0b3JTaGFwZSxcbiAgeE9mZnNldDogbnVtYmVyLFxuICB5T2Zmc2V0OiBudW1iZXIsXG4gIGRldmljZUNlbGxXaWR0aDogbnVtYmVyLFxuICBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIsXG4gIGZvbnRTaXplOiBudW1iZXIsXG4gIGRldmljZVBpeGVsUmF0aW86IG51bWJlclxuKTogdm9pZCB7XG4gIC8vIENsaXAgdGhlIGNlbGwgdG8gbWFrZSBzdXJlIGRyYXdpbmcgZG9lc24ndCBvY2N1ciBiZXlvbmQgYm91bmRzXG4gIGNvbnN0IGNsaXBSZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gIGNsaXBSZWdpb24ucmVjdCh4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICBjdHguY2xpcChjbGlwUmVnaW9uKTtcblxuICBjdHguYmVnaW5QYXRoKCk7XG4gIC8vIFNjYWxlIHRoZSBzdHJva2Ugd2l0aCBEUFIgYW5kIGZvbnQgc2l6ZVxuICBjb25zdCBjc3NMaW5lV2lkdGggPSBmb250U2l6ZSAvIDEyO1xuICBjdHgubGluZVdpZHRoID0gZGV2aWNlUGl4ZWxSYXRpbyAqIGNzc0xpbmVXaWR0aDtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBjaGFyRGVmaW5pdGlvbi5kLnNwbGl0KCcgJykpIHtcbiAgICBjb25zdCB0eXBlID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZiA9IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXBbdHlwZV07XG4gICAgaWYgKCFmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgZmluZCBkcmF3aW5nIGluc3RydWN0aW9ucyBmb3IgXCIke3R5cGV9XCJgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IGluc3RydWN0aW9uLnN1YnN0cmluZygxKS5zcGxpdCgnLCcpO1xuICAgIGlmICghYXJnc1swXSB8fCAhYXJnc1sxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGYoY3R4LCB0cmFuc2xhdGVBcmdzKFxuICAgICAgYXJncyxcbiAgICAgIGRldmljZUNlbGxXaWR0aCxcbiAgICAgIGRldmljZUNlbGxIZWlnaHQsXG4gICAgICB4T2Zmc2V0LFxuICAgICAgeU9mZnNldCxcbiAgICAgIGZhbHNlLFxuICAgICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIChjaGFyRGVmaW5pdGlvbi5sZWZ0UGFkZGluZyA/PyAwKSAqIChjc3NMaW5lV2lkdGggLyAyKSxcbiAgICAgIChjaGFyRGVmaW5pdGlvbi5yaWdodFBhZGRpbmcgPz8gMCkgKiAoY3NzTGluZVdpZHRoIC8gMilcbiAgICApKTtcbiAgfVxuICBpZiAoY2hhckRlZmluaXRpb24udHlwZSA9PT0gVmVjdG9yVHlwZS5TVFJPS0UpIHtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjdHguZmlsbCgpO1xuICB9XG4gIGN0eC5jbG9zZVBhdGgoKTtcbn1cblxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbjogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbn1cblxuY29uc3Qgc3ZnVG9DYW52YXNJbnN0cnVjdGlvbk1hcDogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge1xuICAnQyc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pLFxuICAnTCc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5saW5lVG8oYXJnc1swXSwgYXJnc1sxXSksXG4gICdNJzogKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBhcmdzOiBudW1iZXJbXSkgPT4gY3R4Lm1vdmVUbyhhcmdzWzBdLCBhcmdzWzFdKVxufTtcblxuZnVuY3Rpb24gdHJhbnNsYXRlQXJncyhhcmdzOiBzdHJpbmdbXSwgY2VsbFdpZHRoOiBudW1iZXIsIGNlbGxIZWlnaHQ6IG51bWJlciwgeE9mZnNldDogbnVtYmVyLCB5T2Zmc2V0OiBudW1iZXIsIGRvQ2xhbXA6IGJvb2xlYW4sIGRldmljZVBpeGVsUmF0aW86IG51bWJlciwgbGVmdFBhZGRpbmc6IG51bWJlciA9IDAsIHJpZ2h0UGFkZGluZzogbnVtYmVyID0gMCk6IG51bWJlcltdIHtcbiAgY29uc3QgcmVzdWx0ID0gYXJncy5tYXAoZSA9PiBwYXJzZUZsb2F0KGUpIHx8IHBhcnNlSW50KGUpKTtcblxuICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBmZXcgYXJndW1lbnRzIGZvciBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgZm9yIChsZXQgeCA9IDA7IHggPCByZXN1bHQubGVuZ3RoOyB4ICs9IDIpIHtcbiAgICAvLyBUcmFuc2xhdGUgZnJvbSAwLTEgdG8gMC1jZWxsV2lkdGhcbiAgICByZXN1bHRbeF0gKj0gY2VsbFdpZHRoIC0gKGxlZnRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbykgLSAocmlnaHRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgLy8gRW5zdXJlIGNvb3JkaW5hdGUgZG9lc24ndCBlc2NhcGUgY2VsbCBib3VuZHMgYW5kIHJvdW5kIHRvIHRoZSBuZWFyZXN0IDAuNSB0byBlbnN1cmUgYSBjcmlzcFxuICAgIC8vIGxpbmUgYXQgMTAwJSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgaWYgKGRvQ2xhbXAgJiYgcmVzdWx0W3hdICE9PSAwKSB7XG4gICAgICByZXN1bHRbeF0gPSBjbGFtcChNYXRoLnJvdW5kKHJlc3VsdFt4XSArIDAuNSkgLSAwLjUsIGNlbGxXaWR0aCwgMCk7XG4gICAgfVxuICAgIC8vIEFwcGx5IHRoZSBjZWxsJ3Mgb2Zmc2V0IChpZS4geCpjZWxsV2lkdGgpXG4gICAgcmVzdWx0W3hdICs9IHhPZmZzZXQgKyAobGVmdFBhZGRpbmcgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgfVxuXG4gIGZvciAobGV0IHkgPSAxOyB5IDwgcmVzdWx0Lmxlbmd0aDsgeSArPSAyKSB7XG4gICAgLy8gVHJhbnNsYXRlIGZyb20gMC0xIHRvIDAtY2VsbEhlaWdodFxuICAgIHJlc3VsdFt5XSAqPSBjZWxsSGVpZ2h0O1xuICAgIC8vIEVuc3VyZSBjb29yZGluYXRlIGRvZXNuJ3QgZXNjYXBlIGNlbGwgYm91bmRzIGFuZCByb3VuZCB0byB0aGUgbmVhcmVzdCAwLjUgdG8gZW5zdXJlIGEgY3Jpc3BcbiAgICAvLyBsaW5lIGF0IDEwMCUgZGV2aWNlUGl4ZWxSYXRpb1xuICAgIGlmIChkb0NsYW1wICYmIHJlc3VsdFt5XSAhPT0gMCkge1xuICAgICAgcmVzdWx0W3ldID0gY2xhbXAoTWF0aC5yb3VuZChyZXN1bHRbeV0gKyAwLjUpIC0gMC41LCBjZWxsSGVpZ2h0LCAwKTtcbiAgICB9XG4gICAgLy8gQXBwbHkgdGhlIGNlbGwncyBvZmZzZXQgKGllLiB4KmNlbGxIZWlnaHQpXG4gICAgcmVzdWx0W3ldICs9IHlPZmZzZXQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBhcmVudFdpbmRvdzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMsIGNhbGxiYWNrOiAoZGV2aWNlV2lkdGg6IG51bWJlciwgZGV2aWNlSGVpZ2h0OiBudW1iZXIpID0+IHZvaWQpOiBJRGlzcG9zYWJsZSB7XG4gIC8vIE9ic2VydmUgYW55IHJlc2l6ZXMgdG8gdGhlIGVsZW1lbnQgYW5kIGV4dHJhY3QgdGhlIGFjdHVhbCBwaXhlbCBzaXplIG9mIHRoZSBlbGVtZW50IGlmIHRoZVxuICAvLyBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplIEFQSSBpcyBzdXBwb3J0ZWQuIFRoaXMgYWxsb3dzIGNvcnJlY3Rpbmcgcm91bmRpbmcgZXJyb3JzIHdoZW5cbiAgLy8gY29udmVydGluZyBiZXR3ZWVuIENTUyBwaXhlbHMgYW5kIGRldmljZSBwaXhlbHMgd2hpY2ggY2F1c2VzIGJsdXJyeSByZW5kZXJpbmcgd2hlbiBkZXZpY2VcbiAgLy8gcGl4ZWwgcmF0aW8gaXMgbm90IGEgcm91bmQgbnVtYmVyLlxuICBsZXQgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgdW5kZWZpbmVkID0gbmV3IHBhcmVudFdpbmRvdy5SZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChlbnRyeSkgPT4gZW50cnkudGFyZ2V0ID09PSBlbGVtZW50KTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGlzY29ubmVjdCBpZiBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmICghKCdkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplJyBpbiBlbnRyeSkpIHtcbiAgICAgIG9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICBvYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJlIHRoZSBjYWxsYmFjaywgaWdub3JlIGV2ZW50cyB3aGVyZSB0aGUgZGltZW5zaW9ucyBhcmUgMHgwIGFzIHRoZSBjYW52YXMgaXMgbGlrZWx5IGhpZGRlblxuICAgIGNvbnN0IHdpZHRoID0gZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZVswXS5pbmxpbmVTaXplO1xuICAgIGNvbnN0IGhlaWdodCA9IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemVbMF0uYmxvY2tTaXplO1xuICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgICAgY2FsbGJhY2sod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICB9KTtcbiAgdHJ5IHtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgYm94OiBbJ2RldmljZS1waXhlbC1jb250ZW50LWJveCddIH0gYXMgYW55KTtcbiAgfSBjYXRjaCB7XG4gICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIG9ic2VydmVyID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0b0Rpc3Bvc2FibGUoKCkgPT4gb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaW1lbnNpb25zLCBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93SWZGYWxzeTxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBUIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgbXVzdCBub3QgYmUgZmFsc3knKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgcmV0dXJuIHRydWUgZm9yIFBvd2VybGluZSBzeW1ib2xzIHdoaWNoIHJlcXVpcmVcbiAgLy8gZGlmZmVyZW50IHBhZGRpbmcgYW5kIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIG1pbmltdW0gY29udHJhc3RcbiAgLy8gcmF0aW8gc3RhbmRhcmRzXG4gIHJldHVybiAweEUwQTQgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEUwRDY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gMHhFMEIwIDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEI3O1xufVxuXG5mdW5jdGlvbiBpc0JveE9yQmxvY2tHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gMHgyNTAwIDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHgyNTlGO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludCkgfHwgaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIGNzczoge1xuICAgICAgY2FudmFzOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNlbGw6IGNyZWF0ZURpbWVuc2lvbigpXG4gICAgfSxcbiAgICBkZXZpY2U6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNoYXI6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaW1lbnNpb24oKTogSURpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0KGNlbGxXaWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY3VycmVudE9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiAoY2VsbFdpZHRoIC0gKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIgLSBjdXJyZW50T2Zmc2V0KSkgJSAoTWF0aC5yb3VuZChsaW5lV2lkdGgpICogMik7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5jbGFzcyBTZWxlY3Rpb25SZW5kZXJNb2RlbCBpbXBsZW1lbnRzIElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHB1YmxpYyBoYXNTZWxlY3Rpb24hOiBib29sZWFuO1xuICBwdWJsaWMgY29sdW1uU2VsZWN0TW9kZSE6IGJvb2xlYW47XG4gIHB1YmxpYyB2aWV3cG9ydFN0YXJ0Um93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRFbmRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRFbmRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyBzdGFydENvbCE6IG51bWJlcjtcbiAgcHVibGljIGVuZENvbCE6IG51bWJlcjtcbiAgcHVibGljIHNlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgc2VsZWN0aW9uRW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29sdW1uU2VsZWN0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMudmlld3BvcnRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydEVuZFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gMDtcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gMDtcbiAgICB0aGlzLnN0YXJ0Q29sID0gMDtcbiAgICB0aGlzLmVuZENvbCA9IDA7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUodGVybWluYWw6IElUZXJtaW5hbCwgc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gZW5kO1xuICAgIC8vIFNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuICAgIGlmICghc3RhcnQgfHwgIWVuZCB8fCAoc3RhcnRbMF0gPT09IGVuZFswXSAmJiBzdGFydFsxXSA9PT0gZW5kWzFdKSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zbGF0ZSBmcm9tIGJ1ZmZlciBwb3NpdGlvbiB0byB2aWV3cG9ydCBwb3NpdGlvblxuICAgIGNvbnN0IHZpZXdwb3J0WSA9IHRlcm1pbmFsLmJ1ZmZlcnMuYWN0aXZlLnlkaXNwO1xuICAgIGNvbnN0IHZpZXdwb3J0U3RhcnRSb3cgPSBzdGFydFsxXSAtIHZpZXdwb3J0WTtcbiAgICBjb25zdCB2aWV3cG9ydEVuZFJvdyA9IGVuZFsxXSAtIHZpZXdwb3J0WTtcbiAgICBjb25zdCB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gTWF0aC5tYXgodmlld3BvcnRTdGFydFJvdywgMCk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRFbmRSb3cgPSBNYXRoLm1pbih2aWV3cG9ydEVuZFJvdywgdGVybWluYWwucm93cyAtIDEpO1xuXG4gICAgLy8gTm8gbmVlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyA+PSB0ZXJtaW5hbC5yb3dzIHx8IHZpZXdwb3J0Q2FwcGVkRW5kUm93IDwgMCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGFzU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBjb2x1bW5TZWxlY3RNb2RlO1xuICAgIHRoaXMudmlld3BvcnRTdGFydFJvdyA9IHZpZXdwb3J0U3RhcnRSb3c7XG4gICAgdGhpcy52aWV3cG9ydEVuZFJvdyA9IHZpZXdwb3J0RW5kUm93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3c7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IHZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgIHRoaXMuc3RhcnRDb2wgPSBzdGFydFswXTtcbiAgICB0aGlzLmVuZENvbCA9IGVuZFswXTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NlbGxTZWxlY3RlZCh0ZXJtaW5hbDogVGVybWluYWwsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB5IC09IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudmlld3BvcnRZO1xuICAgIGlmICh0aGlzLmNvbHVtblNlbGVjdE1vZGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXJ0Q29sIDw9IHRoaXMuZW5kQ29sKSB7XG4gICAgICAgIHJldHVybiB4ID49IHRoaXMuc3RhcnRDb2wgJiYgeSA+PSB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgJiZcbiAgICAgICAgICB4IDwgdGhpcy5lbmRDb2wgJiYgeSA8PSB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHggPCB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgIHggPj0gdGhpcy5lbmRDb2wgJiYgeSA8PSB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgIH1cbiAgICByZXR1cm4gKHkgPiB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeSA8IHRoaXMudmlld3BvcnRFbmRSb3cpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93ID09PSB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRTdGFydFJvdyAmJiB4ID49IHRoaXMuc3RhcnRDb2wgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB4IDwgdGhpcy5lbmRDb2wpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93IDwgdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTogSVNlbGVjdGlvblJlbmRlck1vZGVsIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBESU1fT1BBQ0lUWSwgVEVYVF9CQVNFTElORSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cyc7XG5pbXBvcnQgeyB0cnlEcmF3Q3VzdG9tQ2hhciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0N1c3RvbUdseXBocyc7XG5pbXBvcnQgeyBjb21wdXRlTmV4dFZhcmlhbnRPZmZzZXQsIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciwgaXNQb3dlcmxpbmVHbHlwaCwgaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgsIHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgSUJvdW5kaW5nQm94LCBJQ2hhckF0bGFzQ29uZmlnLCBJUmFzdGVyaXplZEdseXBoLCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgTlVMTF9DT0xPUiwgY2hhbm5lbHMsIGNvbG9yLCByZ2JhIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRm91cktleU1hcCB9IGZyb20gJ2NvbW1vbi9NdWx0aUtleU1hcCc7XG5pbXBvcnQgeyBJZGxlVGFza1F1ZXVlIH0gZnJvbSAnY29tbW9uL1Rhc2tRdWV1ZSc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0VYVCwgVW5kZXJsaW5lU3R5bGUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJVW5pY29kZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIEEgc2hhcmVkIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIGRyYXcgbm90aGluZyBmb3IgYSBwYXJ0aWN1bGFyIGNlbGwuXG4gKi9cbmNvbnN0IE5VTExfUkFTVEVSSVpFRF9HTFlQSDogSVJhc3Rlcml6ZWRHbHlwaCA9IHtcbiAgdGV4dHVyZVBhZ2U6IDAsXG4gIHRleHR1cmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gIHRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZTogeyB4OiAwLCB5OiAwIH0sXG4gIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gIHNpemU6IHsgeDogMCwgeTogMCB9LFxuICBzaXplQ2xpcFNwYWNlOiB7IHg6IDAsIHk6IDAgfVxufTtcblxuY29uc3QgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HID0gMjtcblxuY29uc3QgZW51bSBDb25zdGFudHMge1xuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBwaXhlbCBwYWRkaW5nIHRvIGFsbG93IGluIGVhY2ggcm93LiBTZXR0aW5nIHRoaXMgdG8gemVybyB3b3VsZCBtYWtlIHRoZSBhdGxhc1xuICAgKiBwYWdlIHBhY2sgYXMgdGlnaHRseSBhcyBwb3NzaWJsZSwgYnV0IG1vcmUgcGFnZXMgd291bGQgZW5kIHVwIGJlaW5nIGNyZWF0ZWQgYXMgYSByZXN1bHQuXG4gICAqL1xuICBST1dfUElYRUxfVEhSRVNIT0xEID0gMixcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRleHR1cmUgc2l6ZSByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGFjdHVhbCBoYXJkd2FyZSBtYXhpbXVtIHR1cm5zIG91dCB0byBiZS4gVGhpc1xuICAgKiBpcyBlbmZvcmNlZCB0byBlbnN1cmUgdXBsb2FkaW5nIHRoZSB0ZXh0dXJlIHN0aWxsIGZpbmlzaGVzIGluIGEgcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZS4gQVxuICAgKiA0MDk2IHNxdWFyZWQgaW1hZ2UgdGFrZXMgdXAgMTZNQiBvZiBHUFUgbWVtb3J5LlxuICAgKi9cbiAgRk9SQ0VEX01BWF9URVhUVVJFX1NJWkUgPSA0MDk2XG59XG5cbmludGVyZmFjZSBJQ2hhckF0bGFzQWN0aXZlUm93IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkZ2x5cGggPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlQXRsYXMgaW1wbGVtZW50cyBJVGV4dHVyZUF0bGFzIHtcbiAgcHJpdmF0ZSBfZGlkV2FybVVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY2FjaGVNYXA6IEZvdXJLZXlNYXA8bnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBJUmFzdGVyaXplZEdseXBoPiA9IG5ldyBGb3VyS2V5TWFwKCk7XG4gIHByaXZhdGUgX2NhY2hlTWFwQ29tYmluZWQ6IEZvdXJLZXlNYXA8c3RyaW5nLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBJUmFzdGVyaXplZEdseXBoPiA9IG5ldyBGb3VyS2V5TWFwKCk7XG5cbiAgLy8gVGhlIHRleHR1cmUgdGhhdCB0aGUgYXRsYXMgaXMgZHJhd24gdG9cbiAgcHJpdmF0ZSBfcGFnZXM6IEF0bGFzUGFnZVtdID0gW107XG4gIHB1YmxpYyBnZXQgcGFnZXMoKTogeyBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCB2ZXJzaW9uOiBudW1iZXIgfVtdIHsgcmV0dXJuIHRoaXMuX3BhZ2VzOyB9XG5cbiAgLy8gVGhlIHNldCBvZiBhdGxhcyBwYWdlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvXG4gIHByaXZhdGUgX2FjdGl2ZVBhZ2VzOiBBdGxhc1BhZ2VbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3RtcENhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIC8vIEEgdGVtcG9yYXJ5IGNvbnRleHQgdGhhdCBnbHlwaHMgYXJlIGRyYXduIHRvIGJlZm9yZSBiZWluZyB0cmFuc2ZlcmVkIHRvIHRoZSBhdGxhcy5cbiAgcHJpdmF0ZSBfdG1wQ3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgcHJpdmF0ZSBfd29ya0JvdW5kaW5nQm94OiBJQm91bmRpbmdCb3ggPSB7IHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiAwLCByaWdodDogMCB9O1xuICBwcml2YXRlIF93b3JrQXR0cmlidXRlRGF0YTogQXR0cmlidXRlRGF0YSA9IG5ldyBBdHRyaWJ1dGVEYXRhKCk7XG5cbiAgcHJpdmF0ZSBfdGV4dHVyZVNpemU6IG51bWJlciA9IDUxMjtcblxuICBwdWJsaWMgc3RhdGljIG1heEF0bGFzUGFnZXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHN0YXRpYyBtYXhUZXh0dXJlU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogSUNoYXJBdGxhc0NvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF91bmljb2RlU2VydmljZTogSVVuaWNvZGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2NyZWF0ZU5ld1BhZ2UoKTtcbiAgICB0aGlzLl90bXBDYW52YXMgPSBjcmVhdGVDYW52YXMoXG4gICAgICBfZG9jdW1lbnQsXG4gICAgICB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoICogNCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDIsXG4gICAgICB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDJcbiAgICApO1xuICAgIHRoaXMuX3RtcEN0eCA9IHRocm93SWZGYWxzeSh0aGlzLl90bXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgICBhbHBoYTogdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5LFxuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZXMpIHtcbiAgICAgIHBhZ2UuY2FudmFzLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5kaXNwb3NlKCk7XG4gIH1cblxuICBwdWJsaWMgd2FybVVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGlkV2FybVVwKSB7XG4gICAgICB0aGlzLl9kb1dhcm1VcCgpO1xuICAgICAgdGhpcy5fZGlkV2FybVVwID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kb1dhcm1VcCgpOiB2b2lkIHtcbiAgICAvLyBQcmUtZmlsbCB3aXRoIEFTQ0lJIDMzLTEyNiwgdGhpcyBpcyBub3QgdXJnZW50IGFuZCBkb25lIGluIGlkbGUgY2FsbGJhY2tzXG4gICAgY29uc3QgcXVldWUgPSBuZXcgSWRsZVRhc2tRdWV1ZSgpO1xuICAgIGZvciAobGV0IGkgPSAzMzsgaSA8IDEyNjsgaSsrKSB7XG4gICAgICBxdWV1ZS5lbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZU1hcC5nZXQoaSwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQpKSB7XG4gICAgICAgICAgY29uc3QgcmFzdGVyaXplZEdseXBoID0gdGhpcy5fZHJhd1RvQ2FjaGUoaSwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQpO1xuICAgICAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChpLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0VYVCwgcmFzdGVyaXplZEdseXBoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdENsZWFyTW9kZWwgPSBmYWxzZTtcbiAgcHVibGljIGJlZ2luRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RDbGVhck1vZGVsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyVGV4dHVyZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGFnZXNbMF0uY3VycmVudFJvdy54ID09PSAwICYmIHRoaXMuX3BhZ2VzWzBdLmN1cnJlbnRSb3cueSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5fcGFnZXMpIHtcbiAgICAgIHBhZ2UuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9jYWNoZU1hcENvbWJpbmVkLmNsZWFyKCk7XG4gICAgdGhpcy5fZGlkV2FybVVwID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVOZXdQYWdlKCk6IEF0bGFzUGFnZSB7XG4gICAgLy8gVHJ5IG1lcmdlIHRoZSBzZXQgb2YgdGhlIDQgbW9zdCB1c2VkIHBhZ2VzIG9mIHRoZSBsYXJnZXN0IHNpemUuIFRoaXMgaXMgaXMgZGVmZXJyZWQgdG8gYVxuICAgIC8vIG1pY3JvdGFzayB0byBlbnN1cmUgaXQgZG9lcyBub3QgaW50ZXJydXB0IHRleHR1cmVzIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbiB0aGUgY3VycmVudFxuICAgIC8vIGFuaW1hdGlvbiBmcmFtZSB3aGljaCB3b3VsZCByZXN1bHQgaW4gYmxhbmsgcmVuZGVyZWQgYXJlYXMuIFRoaXMgaXMgYWN0dWFsbHkgbm90IHRoYXRcbiAgICAvLyBleHBlbnNpdmUgcmVsYXRpdmUgdG8gZHJhd2luZyB0aGUgZ2x5cGhzLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIGFuIGlkbGUgY2FsbGJhY2suXG4gICAgaWYgKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzICYmIHRoaXMuX3BhZ2VzLmxlbmd0aCA+PSBNYXRoLm1heCg0LCBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcykpIHtcbiAgICAgIC8vIEZpbmQgdGhlIHNldCBvZiB0aGUgbGFyZ2VzdCA0IGltYWdlcywgYmVsb3cgdGhlIG1heGltdW0gc2l6ZSwgd2l0aCB0aGUgaGlnaGVzdFxuICAgICAgLy8gcGVyY2VudGFnZXMgdXNlZFxuICAgICAgY29uc3QgcGFnZXNCeVNpemUgPSB0aGlzLl9wYWdlcy5maWx0ZXIoZSA9PiB7XG4gICAgICAgIHJldHVybiBlLmNhbnZhcy53aWR0aCAqIDIgPD0gKFRleHR1cmVBdGxhcy5tYXhUZXh0dXJlU2l6ZSB8fCBDb25zdGFudHMuRk9SQ0VEX01BWF9URVhUVVJFX1NJWkUpO1xuICAgICAgfSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYi5jYW52YXMud2lkdGggIT09IGEuY2FudmFzLndpZHRoKSB7XG4gICAgICAgICAgcmV0dXJuIGIuY2FudmFzLndpZHRoIC0gYS5jYW52YXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGIucGVyY2VudGFnZVVzZWQgLSBhLnBlcmNlbnRhZ2VVc2VkO1xuICAgICAgfSk7XG4gICAgICBsZXQgc2FtZVNpemVJID0gLTE7XG4gICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2VzQnlTaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYWdlc0J5U2l6ZVtpXS5jYW52YXMud2lkdGggIT09IHNpemUpIHtcbiAgICAgICAgICBzYW1lU2l6ZUkgPSBpO1xuICAgICAgICAgIHNpemUgPSBwYWdlc0J5U2l6ZVtpXS5jYW52YXMud2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoaSAtIHNhbWVTaXplSSA9PT0gMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdhdGhlciBkZXRhaWxzIG9mIHRoZSBtZXJnZVxuICAgICAgY29uc3QgbWVyZ2luZ1BhZ2VzID0gcGFnZXNCeVNpemUuc2xpY2Uoc2FtZVNpemVJLCBzYW1lU2l6ZUkgKyA0KTtcbiAgICAgIGNvbnN0IHNvcnRlZE1lcmdpbmdQYWdlc0luZGV4ZXMgPSBtZXJnaW5nUGFnZXMubWFwKGUgPT4gZS5nbHlwaHNbMF0udGV4dHVyZVBhZ2UpLnNvcnQoKGEsIGIpID0+IGEgPiBiID8gMSA6IC0xKTtcbiAgICAgIGNvbnN0IG1lcmdlZFBhZ2VJbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gbWVyZ2luZ1BhZ2VzLmxlbmd0aDtcblxuICAgICAgLy8gTWVyZ2UgaW50byB0aGUgbmV3IHBhZ2VcbiAgICAgIGNvbnN0IG1lcmdlZFBhZ2UgPSB0aGlzLl9tZXJnZVBhZ2VzKG1lcmdpbmdQYWdlcywgbWVyZ2VkUGFnZUluZGV4KTtcbiAgICAgIG1lcmdlZFBhZ2UudmVyc2lvbisrO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHBhZ2VzLCBzaGlmdGluZyBnbHlwaCB0ZXh0dXJlIHBhZ2VzIGFzIG5lZWRlZFxuICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZE1lcmdpbmdQYWdlc0luZGV4ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy5fZGVsZXRlUGFnZShzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzW2ldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBuZXcgbWVyZ2VkIHBhZ2UgdG8gdGhlIGVuZFxuICAgICAgdGhpcy5wYWdlcy5wdXNoKG1lcmdlZFBhZ2UpO1xuXG4gICAgICAvLyBSZXF1ZXN0IHRoZSBtb2RlbCB0byBiZSBjbGVhcmVkIHRvIHJlZnJlc2ggYWxsIHRleHR1cmUgcGFnZXMuXG4gICAgICB0aGlzLl9yZXF1ZXN0Q2xlYXJNb2RlbCA9IHRydWU7XG4gICAgICB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5maXJlKG1lcmdlZFBhZ2UuY2FudmFzKTtcbiAgICB9XG5cbiAgICAvLyBBbGwgbmV3IGF0bGFzIHBhZ2VzIGFyZSBjcmVhdGVkIHNtYWxsIGFzIHRoZXkgYXJlIGhpZ2hseSBkeW5hbWljXG4gICAgY29uc3QgbmV3UGFnZSA9IG5ldyBBdGxhc1BhZ2UodGhpcy5fZG9jdW1lbnQsIHRoaXMuX3RleHR1cmVTaXplKTtcbiAgICB0aGlzLl9wYWdlcy5wdXNoKG5ld1BhZ2UpO1xuICAgIHRoaXMuX2FjdGl2ZVBhZ2VzLnB1c2gobmV3UGFnZSk7XG4gICAgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZmlyZShuZXdQYWdlLmNhbnZhcyk7XG4gICAgcmV0dXJuIG5ld1BhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9tZXJnZVBhZ2VzKG1lcmdpbmdQYWdlczogQXRsYXNQYWdlW10sIG1lcmdlZFBhZ2VJbmRleDogbnVtYmVyKTogQXRsYXNQYWdlIHtcbiAgICBjb25zdCBtZXJnZWRTaXplID0gbWVyZ2luZ1BhZ2VzWzBdLmNhbnZhcy53aWR0aCAqIDI7XG4gICAgY29uc3QgbWVyZ2VkUGFnZSA9IG5ldyBBdGxhc1BhZ2UodGhpcy5fZG9jdW1lbnQsIG1lcmdlZFNpemUsIG1lcmdpbmdQYWdlcyk7XG4gICAgZm9yIChjb25zdCBbaSwgcF0gb2YgbWVyZ2luZ1BhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgeE9mZnNldCA9IGkgKiBwLmNhbnZhcy53aWR0aCAlIG1lcmdlZFNpemU7XG4gICAgICBjb25zdCB5T2Zmc2V0ID0gTWF0aC5mbG9vcihpIC8gMikgKiBwLmNhbnZhcy5oZWlnaHQ7XG4gICAgICBtZXJnZWRQYWdlLmN0eC5kcmF3SW1hZ2UocC5jYW52YXMsIHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgZm9yIChjb25zdCBnIG9mIHAuZ2x5cGhzKSB7XG4gICAgICAgIGcudGV4dHVyZVBhZ2UgPSBtZXJnZWRQYWdlSW5kZXg7XG4gICAgICAgIGcuc2l6ZUNsaXBTcGFjZS54ID0gZy5zaXplLnggLyBtZXJnZWRTaXplO1xuICAgICAgICBnLnNpemVDbGlwU3BhY2UueSA9IGcuc2l6ZS55IC8gbWVyZ2VkU2l6ZTtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb24ueCArPSB4T2Zmc2V0O1xuICAgICAgICBnLnRleHR1cmVQb3NpdGlvbi55ICs9IHlPZmZzZXQ7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnggPSBnLnRleHR1cmVQb3NpdGlvbi54IC8gbWVyZ2VkU2l6ZTtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueSA9IGcudGV4dHVyZVBvc2l0aW9uLnkgLyBtZXJnZWRTaXplO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcy5maXJlKHAuY2FudmFzKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBtZXJnaW5nIHBhZ2UgZnJvbSBhY3RpdmUgcGFnZXMgaWYgaXQgd2FzIHRoZXJlXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2FjdGl2ZVBhZ2VzLmluZGV4T2YocCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVsZXRlUGFnZShwYWdlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3BhZ2VzLnNwbGljZShwYWdlSW5kZXgsIDEpO1xuICAgIGZvciAobGV0IGogPSBwYWdlSW5kZXg7IGogPCB0aGlzLl9wYWdlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYWRqdXN0aW5nUGFnZSA9IHRoaXMuX3BhZ2VzW2pdO1xuICAgICAgZm9yIChjb25zdCBnIG9mIGFkanVzdGluZ1BhZ2UuZ2x5cGhzKSB7XG4gICAgICAgIGcudGV4dHVyZVBhZ2UtLTtcbiAgICAgIH1cbiAgICAgIGFkanVzdGluZ1BhZ2UudmVyc2lvbisrO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRSYXN0ZXJpemVkR2x5cGhDb21iaW5lZENoYXIoY2hhcnM6IHN0cmluZywgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0OiBib29sZWFuKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEZyb21DYWNoZU1hcCh0aGlzLl9jYWNoZU1hcENvbWJpbmVkLCBjaGFycywgYmcsIGZnLCBleHQsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYXN0ZXJpemVkR2x5cGgoY29kZTogbnVtYmVyLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4pOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0RnJvbUNhY2hlTWFwKHRoaXMuX2NhY2hlTWFwLCBjb2RlLCBiZywgZmcsIGV4dCwgcmVzdHJpY3RUb0NlbGxIZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGdseXBocyB0ZXh0dXJlIGNvb3JkcywgZHJhd2luZyB0aGUgdGV4dHVyZSBpZiBpdCdzIG5vdCBhbHJlYWR5XG4gICAqL1xuICBwcml2YXRlIF9nZXRGcm9tQ2FjaGVNYXAoXG4gICAgY2FjaGVNYXA6IEZvdXJLZXlNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBJUmFzdGVyaXplZEdseXBoPixcbiAgICBrZXk6IHN0cmluZyB8IG51bWJlcixcbiAgICBiZzogbnVtYmVyLFxuICAgIGZnOiBudW1iZXIsXG4gICAgZXh0OiBudW1iZXIsXG4gICAgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICAkZ2x5cGggPSBjYWNoZU1hcC5nZXQoa2V5LCBiZywgZmcsIGV4dCk7XG4gICAgaWYgKCEkZ2x5cGgpIHtcbiAgICAgICRnbHlwaCA9IHRoaXMuX2RyYXdUb0NhY2hlKGtleSwgYmcsIGZnLCBleHQsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0KTtcbiAgICAgIGNhY2hlTWFwLnNldChrZXksIGJnLCBmZywgZXh0LCAkZ2x5cGgpO1xuICAgIH1cbiAgICByZXR1cm4gJGdseXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGlkeDogbnVtYmVyKTogSUNvbG9yIHtcbiAgICBpZiAoaWR4ID49IHRoaXMuX2NvbmZpZy5jb2xvcnMuYW5zaS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sb3IgZm91bmQgZm9yIGlkeCAnICsgaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYW5zaVtpZHhdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QmFja2dyb3VuZENvbG9yKGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgZGltOiBib29sZWFuKTogSUNvbG9yIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICAvLyBUaGUgYmFja2dyb3VuZCBjb2xvciBtaWdodCBoYXZlIHNvbWUgdHJhbnNwYXJlbmN5LCBzbyB3ZSBuZWVkIHRvIHJlbmRlciBpdCBhcyBmdWxseVxuICAgICAgLy8gdHJhbnNwYXJlbnQgaW4gdGhlIGF0bGFzLiBPdGhlcndpc2Ugd2UnZCBlbmQgdXAgZHJhd2luZyB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB0d2ljZVxuICAgICAgLy8gYXJvdW5kIHRoZSBhbnRpLWFsaWFzZWQgZWRnZXMgb2YgdGhlIGdseXBoLCBhbmQgaXQgd291bGQgbG9vayB0b28gZGFyay5cbiAgICAgIHJldHVybiBOVUxMX0NPTE9SO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IElDb2xvcjtcbiAgICBzd2l0Y2ggKGJnQ29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChiZ0NvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICBjb25zdCBhcnIgPSBBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoYmdDb2xvcik7XG4gICAgICAgIHJlc3VsdCA9IGNoYW5uZWxzLnRvQ29sb3IoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJlc3VsdCA9IGNvbG9yLm9wYXF1ZSh0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rm9yZWdyb3VuZENvbG9yKGJnOiBudW1iZXIsIGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgZmc6IG51bWJlciwgZmdDb2xvck1vZGU6IG51bWJlciwgZmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuLCBkaW06IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4sIGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHM6IGJvb2xlYW4pOiBJQ29sb3Ige1xuICAgIGNvbnN0IG1pbmltdW1Db250cmFzdENvbG9yID0gdGhpcy5fZ2V0TWluaW11bUNvbnRyYXN0Q29sb3IoYmcsIGJnQ29sb3JNb2RlLCBiZ0NvbG9yLCBmZywgZmdDb2xvck1vZGUsIGZnQ29sb3IsIGludmVyc2UsIGJvbGQsIGRpbSwgZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kcyk7XG4gICAgaWYgKG1pbmltdW1Db250cmFzdENvbG9yKSB7XG4gICAgICByZXR1cm4gbWluaW11bUNvbnRyYXN0Q29sb3I7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogSUNvbG9yO1xuICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiBib2xkICYmIGZnQ29sb3IgPCA4KSB7XG4gICAgICAgICAgZmdDb2xvciArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChmZ0NvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICBjb25zdCBhcnIgPSBBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoZmdDb2xvcik7XG4gICAgICAgIHJlc3VsdCA9IGNoYW5uZWxzLnRvQ29sb3IoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXNlIGFuIG9wYXF1ZSBjb2xvciByZWdhcmRsZXNzIG9mIGFsbG93VHJhbnNwYXJlbmN5XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgcmVzdWx0ID0gY29sb3Iub3BhcXVlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGltIHRvIHRoZSBjb2xvciwgb3BhY2l0eSBpcyBmaW5lIHRvIHVzZSBmb3IgdGhlIGZvcmVncm91bmQgY29sb3JcbiAgICBpZiAoZGltKSB7XG4gICAgICByZXN1bHQgPSBjb2xvci5tdWx0aXBseU9wYWNpdHkocmVzdWx0LCBESU1fT1BBQ0lUWSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYShiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHN3aXRjaCAoYmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChiZ0NvbG9yKS5yZ2JhO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgcmV0dXJuIGJnQ29sb3IgPDwgODtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVGb3JlZ3JvdW5kUmdiYShmZ0NvbG9yTW9kZTogbnVtYmVyLCBmZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiBib2xkICYmIGZnQ29sb3IgPCA4KSB7XG4gICAgICAgICAgZmdDb2xvciArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoZmdDb2xvcikucmdiYTtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgIHJldHVybiBmZ0NvbG9yIDw8IDg7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQucmdiYTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRNaW5pbXVtQ29udHJhc3RDb2xvcihiZzogbnVtYmVyLCBiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGZnOiBudW1iZXIsIGZnQ29sb3JNb2RlOiBudW1iZXIsIGZnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgYm9sZDogYm9vbGVhbiwgZGltOiBib29sZWFuLCBleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzOiBib29sZWFuKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLm1pbmltdW1Db250cmFzdFJhdGlvID09PSAxIHx8IGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGdldCBmcm9tIGNhY2hlIGZpcnN0XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9nZXRDb250cmFzdENhY2hlKGRpbSk7XG4gICAgY29uc3QgYWRqdXN0ZWRDb2xvciA9IGNhY2hlLmdldENvbG9yKGJnLCBmZyk7XG4gICAgaWYgKGFkanVzdGVkQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGFkanVzdGVkQ29sb3IgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGJnUmdiYSA9IHRoaXMuX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYShiZ0NvbG9yTW9kZSwgYmdDb2xvciwgaW52ZXJzZSk7XG4gICAgY29uc3QgZmdSZ2JhID0gdGhpcy5fcmVzb2x2ZUZvcmVncm91bmRSZ2JhKGZnQ29sb3JNb2RlLCBmZ0NvbG9yLCBpbnZlcnNlLCBib2xkKTtcbiAgICAvLyBEaW0gY2VsbHMgb25seSByZXF1aXJlIGhhbGYgdGhlIGNvbnRyYXN0LCBvdGhlcndpc2UgdGhleSB3b3VsZG4ndCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbVxuICAgIC8vIG5vbi1kaW0gY2VsbHNcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhLCBmZ1JnYmEsIHRoaXMuX2NvbmZpZy5taW5pbXVtQ29udHJhc3RSYXRpbyAvIChkaW0gPyAyIDogMSkpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIGNhY2hlLnNldENvbG9yKGJnLCBmZywgbnVsbCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yID0gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQpICYgMHhGRixcbiAgICAgIChyZXN1bHQgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZXN1bHQgPj4gOCkgJiAweEZGXG4gICAgKTtcbiAgICBjYWNoZS5zZXRDb2xvcihiZywgZmcsIGNvbG9yKTtcblxuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbnRyYXN0Q2FjaGUoZGltOiBib29sZWFuKTogSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gICAgaWYgKGRpbSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuaGFsZkNvbnRyYXN0Q2FjaGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmNvbnRyYXN0Q2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3VG9DYWNoZShjb2RlT3JDaGFyczogbnVtYmVyIHwgc3RyaW5nLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZSk6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgIGNvbnN0IGNoYXJzID0gdHlwZW9mIGNvZGVPckNoYXJzID09PSAnbnVtYmVyJyA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZU9yQ2hhcnMpIDogY29kZU9yQ2hhcnM7XG5cbiAgICAvLyBVbmNvbW1lbnQgZm9yIGRlYnVnZ2luZ1xuICAgIC8vIGNvbnNvbGUubG9nKGBkcmF3IHRvIGNhY2hlIFwiJHtjaGFyc31cImAsIGJnLCBmZywgZXh0KTtcblxuICAgIC8vIEFsbG93IDEgY2VsbCB3aWR0aCBwZXIgY2hhcmFjdGVyLCB3aXRoIGEgbWluaW11bSBvZiAyIChDSkspLCBwbHVzIHNvbWUgcGFkZGluZy4gVGhpcyBpcyB1c2VkXG4gICAgLy8gdG8gZHJhdyB0aGUgZ2x5cGggdG8gdGhlIGNhbnZhcyBhcyB3ZWxsIGFzIHRvIHJlc3RyaWN0IHRoZSBib3VuZGluZyBib3ggc2VhcmNoIHRvIGVuc3VyZVxuICAgIC8vIGdpYW50IGxpZ2F0dXJlcyAoZWcuID09PT09PikgZG9uJ3QgaW1wYWN0IG92ZXJhbGwgcGVyZm9ybWFuY2UuXG4gICAgY29uc3QgYWxsb3dlZFdpZHRoID0gTWF0aC5taW4odGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAqIE1hdGgubWF4KGNoYXJzLmxlbmd0aCwgMikgKyBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiAyLCB0aGlzLl90ZXh0dXJlU2l6ZSk7XG4gICAgaWYgKHRoaXMuX3RtcENhbnZhcy53aWR0aCA8IGFsbG93ZWRXaWR0aCkge1xuICAgICAgdGhpcy5fdG1wQ2FudmFzLndpZHRoID0gYWxsb3dlZFdpZHRoO1xuICAgIH1cbiAgICAvLyBJbmNsdWRlIGxpbmUgaGVpZ2h0IHdoZW4gZHJhd2luZyBnbHlwaHNcbiAgICBjb25zdCBhbGxvd2VkSGVpZ2h0ID0gTWF0aC5taW4odGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgKyBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiA0LCB0aGlzLl90ZXh0dXJlU2l6ZSk7XG4gICAgaWYgKHRoaXMuX3RtcENhbnZhcy5oZWlnaHQgPCBhbGxvd2VkSGVpZ2h0KSB7XG4gICAgICB0aGlzLl90bXBDYW52YXMuaGVpZ2h0ID0gYWxsb3dlZEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcblxuICAgIHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmZnID0gZmc7XG4gICAgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuYmcgPSBiZztcbiAgICB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5leHRlbmRlZC5leHQgPSBleHQ7XG5cbiAgICBjb25zdCBpbnZpc2libGUgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzSW52aXNpYmxlKCk7XG4gICAgaWYgKGludmlzaWJsZSkge1xuICAgICAgcmV0dXJuIE5VTExfUkFTVEVSSVpFRF9HTFlQSDtcbiAgICB9XG5cbiAgICBjb25zdCBib2xkID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0JvbGQoKTtcbiAgICBjb25zdCBpbnZlcnNlID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0ludmVyc2UoKTtcbiAgICBjb25zdCBkaW0gPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzRGltKCk7XG4gICAgY29uc3QgaXRhbGljID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0l0YWxpYygpO1xuICAgIGNvbnN0IHVuZGVybGluZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNVbmRlcmxpbmUoKTtcbiAgICBjb25zdCBzdHJpa2V0aHJvdWdoID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1N0cmlrZXRocm91Z2goKTtcbiAgICBjb25zdCBvdmVybGluZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNPdmVybGluZSgpO1xuICAgIGxldCBmZ0NvbG9yID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0RmdDb2xvcigpO1xuICAgIGxldCBmZ0NvbG9yTW9kZSA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldEZnQ29sb3JNb2RlKCk7XG4gICAgbGV0IGJnQ29sb3IgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRCZ0NvbG9yKCk7XG4gICAgbGV0IGJnQ29sb3JNb2RlID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0QmdDb2xvck1vZGUoKTtcbiAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgY29uc3QgdGVtcCA9IGZnQ29sb3I7XG4gICAgICBmZ0NvbG9yID0gYmdDb2xvcjtcbiAgICAgIGJnQ29sb3IgPSB0ZW1wO1xuICAgICAgY29uc3QgdGVtcDIgPSBmZ0NvbG9yTW9kZTtcbiAgICAgIGZnQ29sb3JNb2RlID0gYmdDb2xvck1vZGU7XG4gICAgICBiZ0NvbG9yTW9kZSA9IHRlbXAyO1xuICAgIH1cblxuICAgIC8vIGRyYXcgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLl9nZXRCYWNrZ3JvdW5kQ29sb3IoYmdDb2xvck1vZGUsIGJnQ29sb3IsIGludmVyc2UsIGRpbSk7XG4gICAgLy8gVXNlIGEgJ2NvcHknIGNvbXBvc2l0ZSBvcGVyYXRpb24gdG8gY2xlYXIgYW55IGV4aXN0aW5nIGdseXBoIG91dCBvZiBfdG1wQ3R4V2l0aEFscGhhLFxuICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwYXJlbmN5IGluIGJhY2tncm91bmRDb2xvclxuICAgIHRoaXMuX3RtcEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnY29weSc7XG4gICAgdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvci5jc3M7XG4gICAgdGhpcy5fdG1wQ3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuX3RtcENhbnZhcy53aWR0aCwgdGhpcy5fdG1wQ2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5fdG1wQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG5cbiAgICAvLyBkcmF3IHRoZSBmb3JlZ3JvdW5kL2dseXBoXG4gICAgY29uc3QgZm9udFdlaWdodCA9IGJvbGQgPyB0aGlzLl9jb25maWcuZm9udFdlaWdodEJvbGQgOiB0aGlzLl9jb25maWcuZm9udFdlaWdodDtcbiAgICBjb25zdCBmb250U3R5bGUgPSBpdGFsaWMgPyAnaXRhbGljJyA6ICcnO1xuICAgIHRoaXMuX3RtcEN0eC5mb250ID1cbiAgICAgIGAke2ZvbnRTdHlsZX0gJHtmb250V2VpZ2h0fSAke3RoaXMuX2NvbmZpZy5mb250U2l6ZSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvfXB4ICR7dGhpcy5fY29uZmlnLmZvbnRGYW1pbHl9YDtcbiAgICB0aGlzLl90bXBDdHgudGV4dEJhc2VsaW5lID0gVEVYVF9CQVNFTElORTtcblxuICAgIGNvbnN0IHBvd2VybGluZUdseXBoID0gY2hhcnMubGVuZ3RoID09PSAxICYmIGlzUG93ZXJsaW5lR2x5cGgoY2hhcnMuY2hhckNvZGVBdCgwKSk7XG4gICAgY29uc3QgcmVzdHJpY3RlZFBvd2VybGluZUdseXBoID0gY2hhcnMubGVuZ3RoID09PSAxICYmIGlzUmVzdHJpY3RlZFBvd2VybGluZUdseXBoKGNoYXJzLmNoYXJDb2RlQXQoMCkpO1xuICAgIGNvbnN0IGZvcmVncm91bmRDb2xvciA9IHRoaXMuX2dldEZvcmVncm91bmRDb2xvcihiZywgYmdDb2xvck1vZGUsIGJnQ29sb3IsIGZnLCBmZ0NvbG9yTW9kZSwgZmdDb2xvciwgaW52ZXJzZSwgZGltLCBib2xkLCB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IoY2hhcnMuY2hhckNvZGVBdCgwKSkpO1xuICAgIHRoaXMuX3RtcEN0eC5maWxsU3R5bGUgPSBmb3JlZ3JvdW5kQ29sb3IuY3NzO1xuXG4gICAgLy8gRm9yIHBvd2VybGluZSBnbHlwaHMgbGVmdC90b3AgcGFkZGluZyBpcyBleGNsdWRlZCAoaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC92c2NvZGUvaXNzdWVzLzEyMDEyOSlcbiAgICBjb25zdCBwYWRkaW5nID0gcmVzdHJpY3RlZFBvd2VybGluZUdseXBoID8gMCA6IFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDI7XG5cbiAgICAvLyBEcmF3IGN1c3RvbSBjaGFyYWN0ZXJzIGlmIGFwcGxpY2FibGVcbiAgICBsZXQgY3VzdG9tR2x5cGggPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fY29uZmlnLmN1c3RvbUdseXBocyAhPT0gZmFsc2UpIHtcbiAgICAgIGN1c3RvbUdseXBoID0gdHJ5RHJhd0N1c3RvbUNoYXIodGhpcy5fdG1wQ3R4LCBjaGFycywgcGFkZGluZywgcGFkZGluZywgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQsIHRoaXMuX2NvbmZpZy5mb250U2l6ZSwgdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8pO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdG8gY2xlYXIgcGl4ZWxzIGJhc2VkIG9uIGEgdGhyZXNob2xkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2x5cGggY29sb3IgYW5kIHRoZVxuICAgIC8vIGJhY2tncm91bmQgY29sb3IuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlIGdseXBoIGNvbnRhaW5zIG11bHRpcGxlIGNvbG9ycyBzdWNoIGFzXG4gICAgLy8gdW5kZXJsaW5lIGNvbG9ycyB0byBwcmV2ZW50IGltcG9ydGFudCBjb2xvcnMgY291bGQgZ2V0IGNsZWFyZWQuXG4gICAgbGV0IGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2sgPSAhcG93ZXJsaW5lR2x5cGg7XG5cbiAgICBsZXQgY2hXaWR0aDogbnVtYmVyO1xuICAgIGlmICh0eXBlb2YgY29kZU9yQ2hhcnMgPT09ICdudW1iZXInKSB7XG4gICAgICBjaFdpZHRoID0gdGhpcy5fdW5pY29kZVNlcnZpY2Uud2N3aWR0aChjb2RlT3JDaGFycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoV2lkdGggPSB0aGlzLl91bmljb2RlU2VydmljZS5nZXRTdHJpbmdDZWxsV2lkdGgoY29kZU9yQ2hhcnMpO1xuICAgIH1cblxuICAgIC8vIERyYXcgdW5kZXJsaW5lXG4gICAgaWYgKHVuZGVybGluZSkge1xuICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gLyAxNSkpO1xuICAgICAgLy8gV2hlbiB0aGUgbGluZSB3aWR0aCBpcyBvZGQsIGRyYXcgYXQgYSAwLjUgcG9zaXRpb25cbiAgICAgIGNvbnN0IHlPZmZzZXQgPSBsaW5lV2lkdGggJSAyID09PSAxID8gMC41IDogMDtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG5cbiAgICAgIC8vIFVuZGVybGluZSBjb2xvclxuICAgICAgaWYgKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCkpIHtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNVbmRlcmxpbmVDb2xvclJHQigpKSB7XG4gICAgICAgIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gYHJnYigke0F0dHJpYnV0ZURhdGEudG9Db2xvclJHQih0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRVbmRlcmxpbmVDb2xvcigpKS5qb2luKCcsJyl9KWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrID0gZmFsc2U7XG4gICAgICAgIGxldCBmZyA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldFVuZGVybGluZUNvbG9yKCk7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiYgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNCb2xkKCkgJiYgZmcgPCA4KSB7XG4gICAgICAgICAgZmcgKz0gODtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoZmcpLmNzcztcbiAgICAgIH1cblxuICAgICAgLy8gVW5kZXJsaW5lIHN0eWxlL3N0cm9rZVxuICAgICAgdGhpcy5fdG1wQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY29uc3QgeExlZnQgPSBwYWRkaW5nO1xuICAgICAgY29uc3QgeVRvcCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpIC0geU9mZnNldCAtIChyZXN0cmljdFRvQ2VsbEhlaWdodCA/IGxpbmVXaWR0aCAqIDIgOiAwKTtcbiAgICAgIGNvbnN0IHlNaWQgPSB5VG9wICsgbGluZVdpZHRoO1xuICAgICAgY29uc3QgeUJvdCA9IHlUb3AgKyBsaW5lV2lkdGggKiAyO1xuICAgICAgbGV0IG5leHRPZmZzZXQgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hXaWR0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgIGNvbnN0IHhDaExlZnQgPSB4TGVmdCArIGkgKiB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgICBjb25zdCB4Q2hSaWdodCA9IHhMZWZ0ICsgKGkgKyAxKSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGg7XG4gICAgICAgIGNvbnN0IHhDaE1pZCA9IHhDaExlZnQgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMjtcbiAgICAgICAgc3dpdGNoICh0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSkge1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuRE9VQkxFOlxuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5Qm90KTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlCb3QpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5DVVJMWTpcbiAgICAgICAgICAgIC8vIENob29zZSB0aGUgYmV6aWVyIHRvcCBhbmQgYm90dG9tIGJhc2VkIG9uIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8sIHRoZSBjdXJseSBsaW5lIGlzXG4gICAgICAgICAgICAvLyBtYWRlIHRhbGxlciB3aGVuIHRoZSBsaW5lIHdpZHRoIGlzICBhcyBvdGhlcndpc2UgaXQncyBub3QgdmVyeSBjbGVhciBvdGhlcndpc2UuXG4gICAgICAgICAgICBjb25zdCB5Q3VybHlCb3QgPSBsaW5lV2lkdGggPD0gMSA/IHlCb3QgOiBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC0gbGluZVdpZHRoIC8gMikgLSB5T2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgeUN1cmx5VG9wID0gbGluZVdpZHRoIDw9IDEgPyB5VG9wIDogTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCArIGxpbmVXaWR0aCAvIDIpIC0geU9mZnNldDtcbiAgICAgICAgICAgIC8vIENsaXAgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSB1bmRlcmxpbmUgc3VjaCB0aGF0IGl0IGNhbiBiZSBkcmF3biBqdXN0IG91dHNpZGVcbiAgICAgICAgICAgIC8vIHRoZSBlZGdlIG9mIHRoZSBjZWxsIHRvIGVuc3VyZSBhIGNvbnRpbnVvdXMgc3Ryb2tlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHVuZGVybGluZWRcbiAgICAgICAgICAgIC8vIGdseXBocyBhZGphY2VudCB0byBvbmUgYW5vdGhlci5cbiAgICAgICAgICAgIGNvbnN0IGNsaXBSZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgICAgICBjbGlwUmVnaW9uLnJlY3QoeENoTGVmdCwgeVRvcCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgeUJvdCAtIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmNsaXAoY2xpcFJlZ2lvbik7XG4gICAgICAgICAgICAvLyBTdGFydCAxLzIgY2VsbCBiZWZvcmUgYW5kIGVuZCAxLzIgY2VsbHMgYWZ0ZXIgdG8gZW5zdXJlIGEgc21vb3RoIGN1cnZlIHdpdGggb3RoZXJcbiAgICAgICAgICAgIC8vIGNlbGxzXG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQgLSB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeU1pZCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoTGVmdCAtIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaExlZnQsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoTGVmdCwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hMZWZ0LCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaE1pZCwgeUN1cmx5Qm90LFxuICAgICAgICAgICAgICB4Q2hNaWQsIHlNaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoTWlkLCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0LCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0LCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHhDaFJpZ2h0LCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0ICsgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDIsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoUmlnaHQgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuRE9UVEVEOlxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0V2lkdGggPSBuZXh0T2Zmc2V0ID09PSAwID8gMCA6XG4gICAgICAgICAgICAgIChuZXh0T2Zmc2V0ID49IGxpbmVXaWR0aCA/IGxpbmVXaWR0aCAqIDIgLSBuZXh0T2Zmc2V0IDogbGluZVdpZHRoIC0gbmV4dE9mZnNldCk7XG4gICAgICAgICAgICAgIC8vIGEgbGluZSBhbmQgYSBnYXAuXG4gICAgICAgICAgICBjb25zdCBpc0xpbmVTdGFydCA9IG5leHRPZmZzZXQgPj0gbGluZVdpZHRoID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ID09PSBmYWxzZSB8fCBvZmZzZXRXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHguc2V0TGluZURhc2goW01hdGgucm91bmQobGluZVdpZHRoKSwgTWF0aC5yb3VuZChsaW5lV2lkdGgpXSk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCArIG9mZnNldFdpZHRoLCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHguc2V0TGluZURhc2goW01hdGgucm91bmQobGluZVdpZHRoKSwgTWF0aC5yb3VuZChsaW5lV2lkdGgpXSk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeVRvcCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoTGVmdCArIG9mZnNldFdpZHRoLCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0ICsgb2Zmc2V0V2lkdGggKyBsaW5lV2lkdGgsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBjb21wdXRlTmV4dFZhcmlhbnRPZmZzZXQoeENoUmlnaHQgLSB4Q2hMZWZ0LCBsaW5lV2lkdGgsIG5leHRPZmZzZXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5EQVNIRUQ6XG4gICAgICAgICAgICBjb25zdCBsaW5lUmF0aW8gPSAwLjY7XG4gICAgICAgICAgICBjb25zdCBnYXBSYXRpbyA9IDAuMztcbiAgICAgICAgICAgIC8vIEVuZCBsaW5lIHJhdGlvIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMC4xXG4gICAgICAgICAgICBjb25zdCB4Q2hXaWR0aCA9IHhDaFJpZ2h0IC0geENoTGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBNYXRoLmZsb29yKGxpbmVSYXRpbyAqIHhDaFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGdhcCA9IE1hdGguZmxvb3IoZ2FwUmF0aW8gKiB4Q2hXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB4Q2hXaWR0aCAtIGxpbmUgLSBnYXA7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc2V0TGluZURhc2goW2xpbmUsIGdhcCwgZW5kXSk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLlNJTkdMRTpcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZSgpO1xuICAgICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcblxuICAgICAgLy8gRHJhdyBzdHJva2UgaW4gdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIG5vbiBjdXN0b20gY2hhcmFjdGVycyBpbiBvcmRlciB0byBnaXZlIGFuIG91dGxpbmVcbiAgICAgIC8vIGJldHdlZW4gdGhlIHRleHQgYW5kIHRoZSB1bmRlcmxpbmUuIE9ubHkgZG8gdGhpcyB3aGVuIGZvbnQgc2l6ZSBpcyA+PSAxMiBhcyB0aGUgdW5kZXJsaW5lXG4gICAgICAvLyBsb29rcyBvZGQgd2hlbiB0aGUgZm9udCBzaXplIGlzIHRvbyBzbWFsbFxuICAgICAgaWYgKCFjdXN0b21HbHlwaCAmJiB0aGlzLl9jb25maWcuZm9udFNpemUgPj0gMTIpIHtcbiAgICAgICAgLy8gVGhpcyBvbmx5IHdvcmtzIHdoZW4gdHJhbnNwYXJlbmN5IGlzIGRpc2FibGVkIGJlY2F1c2UgaXQncyBub3QgY2xlYXIgaG93IHRvIGNsZWFyIHN0cm9rZWRcbiAgICAgICAgLy8gdGV4dFxuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSAmJiBjaGFycyAhPT0gJyAnKSB7XG4gICAgICAgICAgLy8gTWVhc3VyZSB0aGUgdGV4dCwgb25seSBkcmF3IHRoZSBzdHJva2UgaWYgdGhlcmUgaXMgYSBkZXNjZW50IGJleW9uZCBhbiBhbHBoYWJldGljIHRleHRcbiAgICAgICAgICAvLyBiYXNlbGluZVxuICAgICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnRleHRCYXNlbGluZSA9ICdhbHBoYWJldGljJztcbiAgICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5fdG1wQ3R4Lm1lYXN1cmVUZXh0KGNoYXJzKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuICAgICAgICAgIGlmICgnYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50JyBpbiBtZXRyaWNzICYmIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50ID4gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyB0cmFuc2xhdGVzIHRvIDEvMiB0aGUgbGluZSB3aWR0aCBpbiBlaXRoZXIgZGlyZWN0aW9uXG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgICAgICAgLy8gQ2xpcCB0aGUgcmVnaW9uIHRvIG9ubHkgZHJhdyBpbiB2YWxpZCBwaXhlbHMgbmVhciB0aGUgdW5kZXJsaW5lIHRvIGF2b2lkIGEgc2xpZ2h0XG4gICAgICAgICAgICAvLyBvdXRsaW5lIGFyb3VuZCB0aGUgd2hvbGUgZ2x5cGgsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBwaXhlbHMgaW4gdGhlIGdseXBoIGF0IHRoZSB0b3BcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGluY3JlYXNlIEdQVSBtZW1vcnkgZGVtYW5kc1xuICAgICAgICAgICAgY29uc3QgY2xpcFJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgIGNsaXBSZWdpb24ucmVjdCh4TGVmdCwgeVRvcCAtIE1hdGguY2VpbChsaW5lV2lkdGggLyAyKSwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAqIGNoV2lkdGgsIHlCb3QgLSB5VG9wICsgTWF0aC5jZWlsKGxpbmVXaWR0aCAvIDIpKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5jbGlwKGNsaXBSZWdpb24pO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvICogMztcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IGJhY2tncm91bmRDb2xvci5jc3M7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlVGV4dChjaGFycywgcGFkZGluZywgcGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3ZlcmxpbmVcbiAgICBpZiAob3ZlcmxpbmUpIHtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gLyAxNSkpO1xuICAgICAgY29uc3QgeU9mZnNldCA9IGxpbmVXaWR0aCAlIDIgPT09IDEgPyAwLjUgOiAwO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX3RtcEN0eC5maWxsU3R5bGU7XG4gICAgICB0aGlzLl90bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHBhZGRpbmcsIHBhZGRpbmcgKyB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8ocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFyV2lkdGggKiBjaFdpZHRoLCBwYWRkaW5nICsgeU9mZnNldCk7XG4gICAgICB0aGlzLl90bXBDdHguc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aGUgY2hhcmFjdGVyXG4gICAgaWYgKCFjdXN0b21HbHlwaCkge1xuICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxUZXh0KGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUgYW5kIGJleW9uZCB0aGUgY2VsbCBib3VuZHMsIHNoaWZ0IGl0IHVwIHVudGlsIGl0IGlzIHZpc2libGVcbiAgICAvLyBldmVuIG9uIHRoZSBib3R0b20gcm93LCB0cnkgZm9yIGEgbWF4aW11bSBvZiA1IHBpeGVscy5cbiAgICBpZiAoY2hhcnMgPT09ICdfJyAmJiAhdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICBsZXQgaXNCZXlvbmRDZWxsQm91bmRzID0gY2xlYXJDb2xvcih0aGlzLl90bXBDdHguZ2V0SW1hZ2VEYXRhKHBhZGRpbmcsIHBhZGRpbmcsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0KSwgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IsIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2spO1xuICAgICAgaWYgKGlzQmV5b25kQ2VsbEJvdW5kcykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAxOyBvZmZzZXQgPD0gNTsgb2Zmc2V0KyspIHtcbiAgICAgICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3IuY3NzO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLl90bXBDYW52YXMud2lkdGgsIHRoaXMuX3RtcENhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxUZXh0KGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLSBvZmZzZXQpO1xuICAgICAgICAgIGlzQmV5b25kQ2VsbEJvdW5kcyA9IGNsZWFyQ29sb3IodGhpcy5fdG1wQ3R4LmdldEltYWdlRGF0YShwYWRkaW5nLCBwYWRkaW5nLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCksIGJhY2tncm91bmRDb2xvciwgZm9yZWdyb3VuZENvbG9yLCBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrKTtcbiAgICAgICAgICBpZiAoIWlzQmV5b25kQ2VsbEJvdW5kcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzdHJva2V0aHJvdWdoXG4gICAgaWYgKHN0cmlrZXRocm91Z2gpIHtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gLyAxMCkpO1xuICAgICAgY29uc3QgeU9mZnNldCA9IHRoaXMuX3RtcEN0eC5saW5lV2lkdGggJSAyID09PSAxID8gMC41IDogMDsgLy8gV2hlbiB0aGUgd2lkdGggaXMgb2RkLCBkcmF3IGF0IDAuNSBwb3NpdGlvblxuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX3RtcEN0eC5maWxsU3R5bGU7XG4gICAgICB0aGlzLl90bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHBhZGRpbmcsIHBhZGRpbmcgKyBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC8gMikgLSB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8ocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFyV2lkdGggKiBjaFdpZHRoLCBwYWRkaW5nICsgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCAvIDIpIC0geU9mZnNldCk7XG4gICAgICB0aGlzLl90bXBDdHguc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcblxuICAgIC8vIGNsZWFyIHRoZSBiYWNrZ3JvdW5kIGZyb20gdGhlIGNoYXJhY3RlciB0byBhdm9pZCBpc3N1ZXMgd2l0aCBkcmF3aW5nIG92ZXIgdGhlIHByZXZpb3VzXG4gICAgLy8gY2hhcmFjdGVyIGlmIGl0IGV4dGVuZHMgcGFzdCBpdCdzIGJvdW5kc1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuX3RtcEN0eC5nZXRJbWFnZURhdGEoXG4gICAgICAwLCAwLCB0aGlzLl90bXBDYW52YXMud2lkdGgsIHRoaXMuX3RtcENhbnZhcy5oZWlnaHRcbiAgICApO1xuXG4gICAgLy8gQ2xlYXIgb3V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFuZCBkZXRlcm1pbmUgaWYgdGhlIGdseXBoIGlzIGVtcHR5LlxuICAgIGxldCBpc0VtcHR5OiBib29sZWFuO1xuICAgIGlmICghdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICBpc0VtcHR5ID0gY2xlYXJDb2xvcihpbWFnZURhdGEsIGJhY2tncm91bmRDb2xvciwgZm9yZWdyb3VuZENvbG9yLCBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNFbXB0eSA9IGNoZWNrQ29tcGxldGVseVRyYW5zcGFyZW50KGltYWdlRGF0YSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVtcHR5IGdseXBoc1xuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm4gTlVMTF9SQVNURVJJWkVEX0dMWVBIO1xuICAgIH1cblxuICAgIGNvbnN0IHJhc3Rlcml6ZWRHbHlwaCA9IHRoaXMuX2ZpbmRHbHlwaEJvdW5kaW5nQm94KGltYWdlRGF0YSwgdGhpcy5fd29ya0JvdW5kaW5nQm94LCBhbGxvd2VkV2lkdGgsIHJlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCwgY3VzdG9tR2x5cGgsIHBhZGRpbmcpO1xuXG4gICAgLy8gRmluZCB0aGUgYmVzdCBhdGxhcyByb3cgdG8gdXNlXG4gICAgbGV0IGFjdGl2ZVBhZ2U6IEF0bGFzUGFnZTtcbiAgICBsZXQgYWN0aXZlUm93OiBJQ2hhckF0bGFzQWN0aXZlUm93O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHBhZ2VzICh0aGUgbGFzdCBzbWFsbGVzdCA0IHdlcmUgbWVyZ2VkKSwgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgaWYgKHRoaXMuX2FjdGl2ZVBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3JlYXRlTmV3UGFnZSgpO1xuICAgICAgICBhY3RpdmVQYWdlID0gbmV3UGFnZTtcbiAgICAgICAgYWN0aXZlUm93ID0gbmV3UGFnZS5jdXJyZW50Um93O1xuICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gcmFzdGVyaXplZEdseXBoLnNpemUueTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgYmVzdCBjdXJyZW50IHJvdyBmcm9tIGFsbCBhY3RpdmUgcGFnZXNcbiAgICAgIGFjdGl2ZVBhZ2UgPSB0aGlzLl9hY3RpdmVQYWdlc1t0aGlzLl9hY3RpdmVQYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgIGFjdGl2ZVJvdyA9IGFjdGl2ZVBhZ2UuY3VycmVudFJvdztcbiAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9hY3RpdmVQYWdlcykge1xuICAgICAgICBpZiAocmFzdGVyaXplZEdseXBoLnNpemUueSA8PSBwLmN1cnJlbnRSb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgYWN0aXZlUGFnZSA9IHA7XG4gICAgICAgICAgYWN0aXZlUm93ID0gcC5jdXJyZW50Um93O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHNpbXBsaWZpZWQ6XG4gICAgICAvLyAtIFNlYXJjaCBmb3IgdGhlIHBhZ2Ugd2l0aCBST1dfUElYRUxfVEhSRVNIT0xEIGluIG1pbmRcbiAgICAgIC8vIC0gS2VlcCB0cmFjayBvZiBjdXJyZW50L2ZpeGVkIHJvd3MgaW4gYSBNYXBcblxuICAgICAgLy8gUmVwbGFjZSB0aGUgYmVzdCBjdXJyZW50IHJvdyB3aXRoIGEgZml4ZWQgcm93IGlmIHRoZXJlIGlzIG9uZSBhdCBsZWFzdCBhcyBnb29kIGFzIHRoZVxuICAgICAgLy8gY3VycmVudCByb3cuIFNlYXJjaCBpbiByZXZlcnNlIHRvIHByaW9yaXRpemUgZmlsbGluZyBpbiBvbGRlciBwYWdlcy5cbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9hY3RpdmVQYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLl9hY3RpdmVQYWdlc1tpXS5maXhlZFJvd3MpIHtcbiAgICAgICAgICBpZiAocm93LmhlaWdodCA8PSBhY3RpdmVSb3cuaGVpZ2h0ICYmIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPD0gcm93LmhlaWdodCkge1xuICAgICAgICAgICAgYWN0aXZlUGFnZSA9IHRoaXMuX2FjdGl2ZVBhZ2VzW2ldO1xuICAgICAgICAgICAgYWN0aXZlUm93ID0gcm93O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcGFnZSBpZiB0b28gbXVjaCB2ZXJ0aWNhbCBzcGFjZSB3b3VsZCBiZSB3YXN0ZWQgb3IgdGhlcmUgaXMgbm90IGVub3VnaCByb29tXG4gICAgICAvLyBsZWZ0IGluIHRoZSBwYWdlLiBUaGUgcHJldmlvdXMgYWN0aXZlIHJvdyB3aWxsIGJlY29tZSBmaXhlZCBpbiB0aGUgcHJvY2VzcyBhcyBpdCBub3cgaGFzIGFcbiAgICAgIC8vIGZpeGVkIGhlaWdodFxuICAgICAgaWYgKGFjdGl2ZVJvdy55ICsgcmFzdGVyaXplZEdseXBoLnNpemUueSA+PSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQgfHwgYWN0aXZlUm93LmhlaWdodCA+IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgKyBDb25zdGFudHMuUk9XX1BJWEVMX1RIUkVTSE9MRCkge1xuICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBmaXhlZCBoZWlnaHQgcm93LCBjcmVhdGluZyBhIG5ldyBwYWdlIGlmIHRoZXJlIGlzbid0IGVub3VnaCByb29tIG9uIHRoZVxuICAgICAgICAvLyBjdXJyZW50IHBhZ2VcbiAgICAgICAgbGV0IHdhc1BhZ2VBbmRSb3dGb3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYWN0aXZlUGFnZS5jdXJyZW50Um93LnkgKyBhY3RpdmVQYWdlLmN1cnJlbnRSb3cuaGVpZ2h0ICsgcmFzdGVyaXplZEdseXBoLnNpemUueSA+PSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBwYWdlIHdpdGggcm9vbSB0byBjcmVhdGUgdGhlIG5ldyByb3cgb25cbiAgICAgICAgICBsZXQgY2FuZGlkYXRlUGFnZTogQXRsYXNQYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9hY3RpdmVQYWdlcykge1xuICAgICAgICAgICAgaWYgKHAuY3VycmVudFJvdy55ICsgcC5jdXJyZW50Um93LmhlaWdodCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPCBwLmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlUGFnZSA9IHA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlUGFnZSkge1xuICAgICAgICAgICAgYWN0aXZlUGFnZSA9IGNhbmRpZGF0ZVBhZ2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJlZm9yZSBjcmVhdGluZyBhIG5ldyBhdGxhcyBwYWdlIHRoYXQgd291bGQgdHJpZ2dlciBhIHBhZ2UgbWVyZ2UsIGNoZWNrIGlmIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgcm93IGlzIHN1ZmZpY2llbnQgd2hlbiBpZ25vcmluZyB0aGUgUk9XX1BJWEVMX1RIUkVTSE9MRC4gVGhpcyB3aWxsXG4gICAgICAgICAgICAvLyBpbXByb3ZlIHRleHR1cmUgdXRpbGl6YXRpb24gYnkgdXNpbmcgdGhlIGF2YWlsYWJsZSBzcGFjZSBiZWZvcmUgdGhlIHBhZ2UgaXMgbWVyZ2VkXG4gICAgICAgICAgICAvLyBhbmQgYmVjb21lcyBzdGF0aWMuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzICYmXG4gICAgICAgICAgICAgIHRoaXMuX3BhZ2VzLmxlbmd0aCA+PSBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cueSArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPD0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0ICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPj0gcmFzdGVyaXplZEdseXBoLnNpemUueSAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cueCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnggPD0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBhY3RpdmVQYWdlIGFuZCBhY3RpdmVSb3cgaXMgYWxyZWFkeSB2YWxpZFxuICAgICAgICAgICAgICB3YXNQYWdlQW5kUm93Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgaWYgdGhlcmUgaXMgbm8gcm9vbVxuICAgICAgICAgICAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3JlYXRlTmV3UGFnZSgpO1xuICAgICAgICAgICAgICBhY3RpdmVQYWdlID0gbmV3UGFnZTtcbiAgICAgICAgICAgICAgYWN0aXZlUm93ID0gbmV3UGFnZS5jdXJyZW50Um93O1xuICAgICAgICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gcmFzdGVyaXplZEdseXBoLnNpemUueTtcbiAgICAgICAgICAgICAgd2FzUGFnZUFuZFJvd0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXNQYWdlQW5kUm93Rm91bmQpIHtcbiAgICAgICAgICAvLyBGaXggdGhlIGN1cnJlbnQgcm93IGFzIHRoZSBuZXcgcm93IGlzIGJlaW5nIGFkZGVkIGJlbG93XG4gICAgICAgICAgaWYgKGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5wdXNoKGFjdGl2ZVBhZ2UuY3VycmVudFJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVJvdyA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBhY3RpdmVQYWdlLmN1cnJlbnRSb3cueSArIGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnlcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdGl2ZVBhZ2UuZml4ZWRSb3dzLnB1c2goYWN0aXZlUm93KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGN1cnJlbnQgcm93IGJlbG93IHRoZSBuZXcgZml4ZWQgaGVpZ2h0IHJvd1xuICAgICAgICAgIGFjdGl2ZVBhZ2UuY3VycmVudFJvdyA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBhY3RpdmVSb3cueSArIGFjdGl2ZVJvdy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBwYWdlcyBmcm9tIF9hY3RpdmVQYWdlcyB3aGVuIGFsbCByb3dzIGFyZSBmaWxsZWRcbiAgICAgIH1cblxuICAgICAgLy8gRXhpdCB0aGUgbG9vcCBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgcm93XG4gICAgICBpZiAoYWN0aXZlUm93LnggKyByYXN0ZXJpemVkR2x5cGguc2l6ZS54IDw9IGFjdGl2ZVBhZ2UuY2FudmFzLndpZHRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIGN1cnJlbnQgcm93LCBmaW5pc2ggaXQgYW5kIHRyeSBhZ2FpblxuICAgICAgaWYgKGFjdGl2ZVJvdyA9PT0gYWN0aXZlUGFnZS5jdXJyZW50Um93KSB7XG4gICAgICAgIGFjdGl2ZVJvdy54ID0gMDtcbiAgICAgICAgYWN0aXZlUm93LnkgKz0gYWN0aXZlUm93LmhlaWdodDtcbiAgICAgICAgYWN0aXZlUm93LmhlaWdodCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5zcGxpY2UoYWN0aXZlUGFnZS5maXhlZFJvd3MuaW5kZXhPZihhY3RpdmVSb3cpLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgdGV4dHVyZSBwb3NpdGlvblxuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUGFnZSA9IHRoaXMuX3BhZ2VzLmluZGV4T2YoYWN0aXZlUGFnZSk7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi54ID0gYWN0aXZlUm93Lng7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi55ID0gYWN0aXZlUm93Lnk7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54ID0gYWN0aXZlUm93LnggLyBhY3RpdmVQYWdlLmNhbnZhcy53aWR0aDtcbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnkgPSBhY3RpdmVSb3cueSAvIGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodDtcblxuICAgIC8vIEZpeCB0aGUgY2xpcHNwYWNlIHBvc2l0aW9uIGFzIHBhZ2VzIG1heSBiZSBvZiBkaWZmZXJpbmcgc2l6ZVxuICAgIHJhc3Rlcml6ZWRHbHlwaC5zaXplQ2xpcFNwYWNlLnggLz0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGg7XG4gICAgcmFzdGVyaXplZEdseXBoLnNpemVDbGlwU3BhY2UueSAvPSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQ7XG5cbiAgICAvLyBVcGRhdGUgYXRsYXMgY3VycmVudCByb3csIGZvciBmaXhlZCByb3dzIHRoZSBnbHlwaCBoZWlnaHQgd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbiB0aGUgcm93XG4gICAgLy8gaGVpZ2h0XG4gICAgYWN0aXZlUm93LmhlaWdodCA9IE1hdGgubWF4KGFjdGl2ZVJvdy5oZWlnaHQsIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkpO1xuICAgIGFjdGl2ZVJvdy54ICs9IHJhc3Rlcml6ZWRHbHlwaC5zaXplLng7XG5cbiAgICAvLyBwdXRJbWFnZURhdGEgZG9lc24ndCBkbyBhbnkgYmxlbmRpbmcsIHNvIGl0IHdpbGwgb3ZlcndyaXRlIGFueSBleGlzdGluZyBjYWNoZSBlbnRyeSBmb3IgdXNcbiAgICBhY3RpdmVQYWdlLmN0eC5wdXRJbWFnZURhdGEoXG4gICAgICBpbWFnZURhdGEsXG4gICAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uLnggLSB0aGlzLl93b3JrQm91bmRpbmdCb3gubGVmdCxcbiAgICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb24ueSAtIHRoaXMuX3dvcmtCb3VuZGluZ0JveC50b3AsXG4gICAgICB0aGlzLl93b3JrQm91bmRpbmdCb3gubGVmdCxcbiAgICAgIHRoaXMuX3dvcmtCb3VuZGluZ0JveC50b3AsXG4gICAgICByYXN0ZXJpemVkR2x5cGguc2l6ZS54LFxuICAgICAgcmFzdGVyaXplZEdseXBoLnNpemUueVxuICAgICk7XG4gICAgYWN0aXZlUGFnZS5hZGRHbHlwaChyYXN0ZXJpemVkR2x5cGgpO1xuICAgIGFjdGl2ZVBhZ2UudmVyc2lvbisrO1xuXG4gICAgcmV0dXJuIHJhc3Rlcml6ZWRHbHlwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBJbWFnZURhdGEgb2JqZWN0LCBmaW5kIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIG5vbi10cmFuc3BhcmVudFxuICAgKiBwb3J0aW9uIG9mIHRoZSB0ZXh0dXJlIGFuZCByZXR1cm4gYW4gSVJhc3Rlcml6ZWRHbHlwaCB3aXRoIHRoZXNlXG4gICAqIGRpbWVuc2lvbnMuXG4gICAqIEBwYXJhbSBpbWFnZURhdGEgVGhlIGltYWdlIGRhdGEgdG8gcmVhZC5cbiAgICogQHBhcmFtIGJvdW5kaW5nQm94IEFuIElCb3VuZGluZ0JveCB0byBwdXQgdGhlIGNsaXBwZWQgYm91bmRpbmcgYm94IHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmRHbHlwaEJvdW5kaW5nQm94KGltYWdlRGF0YTogSW1hZ2VEYXRhLCBib3VuZGluZ0JveDogSUJvdW5kaW5nQm94LCBhbGxvd2VkV2lkdGg6IG51bWJlciwgcmVzdHJpY3RlZEdseXBoOiBib29sZWFuLCBjdXN0b21HbHlwaDogYm9vbGVhbiwgcGFkZGluZzogbnVtYmVyKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgYm91bmRpbmdCb3gudG9wID0gMDtcbiAgICBjb25zdCBoZWlnaHQgPSByZXN0cmljdGVkR2x5cGggPyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCA6IHRoaXMuX3RtcENhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSByZXN0cmljdGVkR2x5cGggPyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIDogYWxsb3dlZFdpZHRoO1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gudG9wID0geTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3gubGVmdCA9IDA7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHBhZGRpbmcgKyB3aWR0aDsgeCsrKSB7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IGFscGhhT2Zmc2V0ID0geSAqIHRoaXMuX3RtcENhbnZhcy53aWR0aCAqIDQgKyB4ICogNCArIDM7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthbHBoYU9mZnNldF0gIT09IDApIHtcbiAgICAgICAgICBib3VuZGluZ0JveC5sZWZ0ID0geDtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3gucmlnaHQgPSB3aWR0aDtcbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHggPSBwYWRkaW5nICsgd2lkdGggLSAxOyB4ID49IHBhZGRpbmc7IHgtLSkge1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gucmlnaHQgPSB4O1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBib3VuZGluZ0JveC5ib3R0b20gPSBoZWlnaHQ7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB5ID0gaGVpZ2h0IC0gMTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3guYm90dG9tID0geTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHR1cmVQYWdlOiAwLFxuICAgICAgdGV4dHVyZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIHg6IGJvdW5kaW5nQm94LnJpZ2h0IC0gYm91bmRpbmdCb3gubGVmdCArIDEsXG4gICAgICAgIHk6IGJvdW5kaW5nQm94LmJvdHRvbSAtIGJvdW5kaW5nQm94LnRvcCArIDFcbiAgICAgIH0sXG4gICAgICBzaXplQ2xpcFNwYWNlOiB7XG4gICAgICAgIHg6IChib3VuZGluZ0JveC5yaWdodCAtIGJvdW5kaW5nQm94LmxlZnQgKyAxKSxcbiAgICAgICAgeTogKGJvdW5kaW5nQm94LmJvdHRvbSAtIGJvdW5kaW5nQm94LnRvcCArIDEpXG4gICAgICB9LFxuICAgICAgb2Zmc2V0OiB7XG4gICAgICAgIHg6IC1ib3VuZGluZ0JveC5sZWZ0ICsgcGFkZGluZyArICgocmVzdHJpY3RlZEdseXBoIHx8IGN1c3RvbUdseXBoKSA/IE1hdGguZmxvb3IoKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLSB0aGlzLl9jb25maWcuZGV2aWNlQ2hhcldpZHRoKSAvIDIpIDogMCksXG4gICAgICAgIHk6IC1ib3VuZGluZ0JveC50b3AgKyBwYWRkaW5nICsgKChyZXN0cmljdGVkR2x5cGggfHwgY3VzdG9tR2x5cGgpID8gdGhpcy5fY29uZmlnLmxpbmVIZWlnaHQgPT09IDEgPyAwIDogTWF0aC5yb3VuZCgodGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgLSB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCkgLyAyKSA6IDApXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBBdGxhc1BhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgX3VzZWRQaXhlbHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgcGVyY2VudGFnZVVzZWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3VzZWRQaXhlbHMgLyAodGhpcy5jYW52YXMud2lkdGggKiB0aGlzLmNhbnZhcy5oZWlnaHQpOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZ2x5cGhzOiBJUmFzdGVyaXplZEdseXBoW10gPSBbXTtcbiAgcHVibGljIGdldCBnbHlwaHMoKTogUmVhZG9ubHlBcnJheTxJUmFzdGVyaXplZEdseXBoPiB7IHJldHVybiB0aGlzLl9nbHlwaHM7IH1cbiAgcHVibGljIGFkZEdseXBoKGdseXBoOiBJUmFzdGVyaXplZEdseXBoKTogdm9pZCB7XG4gICAgdGhpcy5fZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgIHRoaXMuX3VzZWRQaXhlbHMgKz0gZ2x5cGguc2l6ZS54ICogZ2x5cGguc2l6ZS55O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgY2FudmFzIG9mIHRoZSBhdGxhcyBwYWdlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHVibGljIHZlcnNpb24gPSAwO1xuXG4gIC8vIFRleHR1cmUgYXRsYXMgY3VycmVudCBwb3NpdGlvbmluZyBkYXRhLiBUaGUgdGV4dHVyZSBwYWNraW5nIHN0cmF0ZWd5IHVzZWQgaXMgdG8gZmlsbCBmcm9tXG4gIC8vIGxlZnQtdG8tcmlnaHQgYW5kIHRvcC10by1ib3R0b20uIFdoZW4gdGhlIGdseXBoIGJlaW5nIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIGN1cnJlbnRcbiAgLy8gcm93J3MgaGVpZ2h0LCB0aGUgZm9sbG93aW5nIGhhcHBlbnM6XG4gIC8vXG4gIC8vIC0gVGhlIGN1cnJlbnQgcm93IGJlY29tZXMgdGhlIGZpeGVkIGhlaWdodCByb3cgQVxuICAvLyAtIEEgbmV3IGZpeGVkIGhlaWdodCByb3cgQiB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgZ2x5cGggaXMgY3JlYXRlZCBiZWxvdyB0aGUgY3VycmVudCByb3dcbiAgLy8gLSBBIG5ldyBkeW5hbWljIGhlaWdodCBjdXJyZW50IHJvdyBpcyBjcmVhdGVkIGJlbG93IEJcbiAgLy9cbiAgLy8gVGhpcyBzdHJhdGVneSBkb2VzIGEgZ29vZCBqb2IgcHJldmVudGluZyBzcGFjZSBiZWluZyB3YXN0ZWQgZm9yIHZlcnkgc2hvcnQgZ2x5cGhzIHN1Y2ggYXNcbiAgLy8gdW5kZXJzY29yZXMsIGh5cGhlbnMgZXRjLiBvciB0aG9zZSB3aXRoIHVuZGVybGluZXMgcmVuZGVyZWQuXG4gIHB1YmxpYyBjdXJyZW50Um93OiBJQ2hhckF0bGFzQWN0aXZlUm93ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkUm93czogSUNoYXJBdGxhc0FjdGl2ZVJvd1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3VyY2VQYWdlcz86IEF0bGFzUGFnZVtdXG4gICkge1xuICAgIGlmIChzb3VyY2VQYWdlcykge1xuICAgICAgZm9yIChjb25zdCBwIG9mIHNvdXJjZVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuX2dseXBocy5wdXNoKC4uLnAuZ2x5cGhzKTtcbiAgICAgICAgdGhpcy5fdXNlZFBpeGVscyArPSBwLl91c2VkUGl4ZWxzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNhbnZhcyA9IGNyZWF0ZUNhbnZhcyhkb2N1bWVudCwgc2l6ZSwgc2l6ZSk7XG4gICAgLy8gVGhlIGNhbnZhcyBuZWVkcyBhbHBoYSBiZWNhdXNlIHdlIHVzZSBjbGVhckNvbG9yIHRvIGNvbnZlcnQgdGhlIGJhY2tncm91bmQgY29sb3IgdG8gYWxwaGEuXG4gICAgLy8gSXQgbWlnaHQgYWxzbyBjb250YWluIHNvbWUgY2hhcmFjdGVycyB3aXRoIHRyYW5zcGFyZW50IGJhY2tncm91bmRzIGlmIGFsbG93VHJhbnNwYXJlbmN5IGlzXG4gICAgLy8gc2V0LlxuICAgIHRoaXMuY3R4ID0gdGhyb3dJZkZhbHN5KHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJywgeyBhbHBoYTogdHJ1ZSB9KSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuY3VycmVudFJvdy54ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRSb3cueSA9IDA7XG4gICAgdGhpcy5jdXJyZW50Um93LmhlaWdodCA9IDA7XG4gICAgdGhpcy5maXhlZFJvd3MubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZlcnNpb24rKztcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIGEgcGFydGljdWxhciByZ2IgY29sb3IgYW5kIGNvbG9ycyB0aGF0IGFyZSBuZWFybHkgdGhlIHNhbWUgaW4gYW4gSW1hZ2VEYXRhIGNvbXBsZXRlbHlcbiAqIHRyYW5zcGFyZW50LlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIFwiZW1wdHlcIiwgbWVhbmluZyBhbGwgcGl4ZWxzIGFyZSBmdWxseSB0cmFuc3BhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2xlYXJDb2xvcihpbWFnZURhdGE6IEltYWdlRGF0YSwgYmc6IElDb2xvciwgZmc6IElDb2xvciwgZW5hYmxlVGhyZXNob2xkQ2hlY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgLy8gR2V0IGNvbG9yIGNoYW5uZWxzXG4gIGNvbnN0IHIgPSBiZy5yZ2JhID4+PiAyNDtcbiAgY29uc3QgZyA9IGJnLnJnYmEgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYiA9IGJnLnJnYmEgPj4+IDggJiAweEZGO1xuICBjb25zdCBmZ1IgPSBmZy5yZ2JhID4+PiAyNDtcbiAgY29uc3QgZmdHID0gZmcucmdiYSA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBmZ0IgPSBmZy5yZ2JhID4+PiA4ICYgMHhGRjtcblxuICAvLyBDYWxjdWxhdGUgYSB0aHJlc2hvbGQgdGhhdCB3aGVuIGJlbG93IGEgY29sb3Igd2lsbCBiZSB0cmVhdGVkIGFzIHRyYW5zcGFydCB3aGVuIHRoZSBzdW0gb2ZcbiAgLy8gY2hhbm5lbCB2YWx1ZSBkaWZmZXJzLiBUaGlzIGhlbHBzIGltcHJvdmUgcmVuZGVyaW5nIHdoZW4gZ2x5cGhzIG92ZXJsYXAgd2l0aCBvdGhlcnMuIFRoaXNcbiAgLy8gdGhyZXNob2xkIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCB0b1xuICAvLyBlbnN1cmUgaW1wb3J0YW50IGRldGFpbHMgb2YgdGhlIGdseXBoIGFyZSBhbHdheXMgc2hvd24sIGV2ZW4gd2hlbiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LlxuICAvLyBUaGUgbnVtYmVyIDEyIGlzIGxhcmdlbHkgYXJiaXRyYXJ5IHRvIGVuc3VyZSB0aGUgcGl4ZWxzIHRoYXQgZXNjYXBlIHRoZSBjZWxsIGluIHRoZSB0ZXN0IGNhc2VcbiAgLy8gd2VyZSBjb3ZlcmVkIChmZz0jOGFlMjM0LCBiZz0jYzRhMDAwKS5cbiAgY29uc3QgdGhyZXNob2xkID0gTWF0aC5mbG9vcigoTWF0aC5hYnMociAtIGZnUikgKyBNYXRoLmFicyhnIC0gZmdHKSArIE1hdGguYWJzKGIgLSBmZ0IpKSAvIDEyKTtcblxuICAvLyBTZXQgYWxwaGEgY2hhbm5lbCBvZiByZWxldmVudCBwaXhlbHMgdG8gMFxuICBsZXQgaXNFbXB0eSA9IHRydWU7XG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IDQpIHtcbiAgICAvLyBDaGVjayBleGFjdCBtYXRjaFxuICAgIGlmIChpbWFnZURhdGEuZGF0YVtvZmZzZXRdID09PSByICYmXG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDFdID09PSBnICYmXG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDJdID09PSBiKSB7XG4gICAgICBpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAzXSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIHRoZSB0aHJlc2hvbGQgYmFzZWQgZGlmZmVyZW5jZVxuICAgICAgaWYgKGVuYWJsZVRocmVzaG9sZENoZWNrICYmXG4gICAgICAgICAgKE1hdGguYWJzKGltYWdlRGF0YS5kYXRhW29mZnNldF0gLSByKSArXG4gICAgICAgICAgTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMV0gLSBnKSArXG4gICAgICAgICAgTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMl0gLSBiKSkgPCB0aHJlc2hvbGQpIHtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0VtcHR5O1xufVxuXG5mdW5jdGlvbiBjaGVja0NvbXBsZXRlbHlUcmFuc3BhcmVudChpbWFnZURhdGE6IEltYWdlRGF0YSk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IG9mZnNldCArPSA0KSB7XG4gICAgaWYgKGltYWdlRGF0YS5kYXRhW29mZnNldCArIDNdID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKGRvY3VtZW50OiBEb2N1bWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgcmV0dXJuIGNhbnZhcztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSwgQ2hhckRhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJhY3RlckpvaW5lciB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBXSElURVNQQUNFX0NFTExfQ0hBUiwgQ29udGVudCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgSm9pbmVkQ2VsbERhdGEgZXh0ZW5kcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUNlbGxEYXRhIHtcbiAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgLy8gLmNvbnRlbnQgY2FycmllcyBubyBtZWFuaW5nIGZvciBqb2luZWQgQ2VsbERhdGEsIHNpbXBseSBudWxsaWZ5IGl0XG4gIC8vIHRodXMgd2UgaGF2ZSB0byBvdmVybG9hZCBhbGwgb3RoZXIgLmNvbnRlbnQgYWNjZXNzb3JzXG4gIHB1YmxpYyBjb250ZW50OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZmc6IG51bWJlcjtcbiAgcHVibGljIGJnOiBudW1iZXI7XG4gIHB1YmxpYyBjb21iaW5lZERhdGE6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKGZpcnN0Q2VsbDogSUNlbGxEYXRhLCBjaGFyczogc3RyaW5nLCB3aWR0aDogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZnID0gZmlyc3RDZWxsLmZnO1xuICAgIHRoaXMuYmcgPSBmaXJzdENlbGwuYmc7XG4gICAgdGhpcy5jb21iaW5lZERhdGEgPSBjaGFycztcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuICB9XG5cbiAgcHVibGljIGlzQ29tYmluZWQoKTogbnVtYmVyIHtcbiAgICAvLyBhbHdheXMgbWFyayBqb2luZWQgY2VsbCBkYXRhIGFzIGNvbWJpbmVkXG4gICAgcmV0dXJuIENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgfVxuXG4gIHB1YmxpYyBnZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2RlKCk6IG51bWJlciB7XG4gICAgLy8gY29kZSBhbHdheXMgZ2V0cyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBmYWtlIGNvZGVwb2ludCAocmVhZCBhcyAtMSlcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCBhcyBjb2RlIGlzIHVzZWQgYnkgY2FjaGVzIGFzIGlkZW50aWZpZXJcbiAgICByZXR1cm4gMHgxRkZGRkY7XG4gIH1cblxuICBwdWJsaWMgc2V0RnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXNDaGFyRGF0YSgpOiBDaGFyRGF0YSB7XG4gICAgcmV0dXJuIFt0aGlzLmZnLCB0aGlzLmdldENoYXJzKCksIHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRDb2RlKCldO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIGltcGxlbWVudHMgSUNoYXJhY3RlckpvaW5lclNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfY2hhcmFjdGVySm9pbmVyczogSUNoYXJhY3RlckpvaW5lcltdID0gW107XG4gIHByaXZhdGUgX25leHRDaGFyYWN0ZXJKb2luZXJJZDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfd29ya0NlbGw6IENlbGxEYXRhID0gbmV3IENlbGxEYXRhKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKGhhbmRsZXI6ICh0ZXh0OiBzdHJpbmcpID0+IFtudW1iZXIsIG51bWJlcl1bXSk6IG51bWJlciB7XG4gICAgY29uc3Qgam9pbmVyOiBJQ2hhcmFjdGVySm9pbmVyID0ge1xuICAgICAgaWQ6IHRoaXMuX25leHRDaGFyYWN0ZXJKb2luZXJJZCsrLFxuICAgICAgaGFuZGxlclxuICAgIH07XG5cbiAgICB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzLnB1c2goam9pbmVyKTtcbiAgICByZXR1cm4gam9pbmVyLmlkO1xuICB9XG5cbiAgcHVibGljIGRlcmVnaXN0ZXIoam9pbmVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2hhcmFjdGVySm9pbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2NoYXJhY3RlckpvaW5lcnNbaV0uaWQgPT09IGpvaW5lcklkKSB7XG4gICAgICAgIHRoaXMuX2NoYXJhY3RlckpvaW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0Sm9pbmVkQ2hhcmFjdGVycyhyb3c6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgaWYgKHRoaXMuX2NoYXJhY3RlckpvaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChyb3cpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgY29uc3QgbGluZVN0ciA9IGxpbmUudHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSk7XG5cbiAgICAvLyBCZWNhdXNlIHNvbWUgY2VsbHMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG11bHRpcGxlIGphdmFzY3JpcHQgY2hhcmFjdGVycyxcbiAgICAvLyB3ZSB0cmFjayB0aGUgY2VsbCBhbmQgdGhlIHN0cmluZyBpbmRleGVzIHNlcGFyYXRlbHkuIFRoaXMgYWxsb3dzIHVzIHRvXG4gICAgLy8gdHJhbnNsYXRlIHRoZSBzdHJpbmcgcmFuZ2VzIHdlIGdldCBmcm9tIHRoZSBqb2luZXJzIGJhY2sgaW50byBjZWxsIHJhbmdlc1xuICAgIC8vIGZvciB1c2Ugd2hlbiByZW5kZXJpbmdcbiAgICBsZXQgcmFuZ2VTdGFydENvbHVtbiA9IDA7XG4gICAgbGV0IGN1cnJlbnRTdHJpbmdJbmRleCA9IDA7XG4gICAgbGV0IHJhbmdlU3RhcnRTdHJpbmdJbmRleCA9IDA7XG4gICAgbGV0IHJhbmdlQXR0ckZHID0gbGluZS5nZXRGZygwKTtcbiAgICBsZXQgcmFuZ2VBdHRyQkcgPSBsaW5lLmdldEJnKDApO1xuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBsaW5lLmdldFRyaW1tZWRMZW5ndGgoKTsgeCsrKSB7XG4gICAgICBsaW5lLmxvYWRDZWxsKHgsIHRoaXMuX3dvcmtDZWxsKTtcblxuICAgICAgaWYgKHRoaXMuX3dvcmtDZWxsLmdldFdpZHRoKCkgPT09IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBjaGFyYWN0ZXIgaXMgb2Ygd2lkdGggMCwgc2tpcCBpdC5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZCBvZiByYW5nZVxuICAgICAgaWYgKHRoaXMuX3dvcmtDZWxsLmZnICE9PSByYW5nZUF0dHJGRyB8fCB0aGlzLl93b3JrQ2VsbC5iZyAhPT0gcmFuZ2VBdHRyQkcpIHtcbiAgICAgICAgLy8gSWYgd2UgZW5kZWQgdXAgd2l0aCBhIHNlcXVlbmNlIG9mIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLFxuICAgICAgICAvLyBsb29rIGZvciByYW5nZXMgdG8gam9pbi5cbiAgICAgICAgaWYgKHggLSByYW5nZVN0YXJ0Q29sdW1uID4gMSkge1xuICAgICAgICAgIGNvbnN0IGpvaW5lZFJhbmdlcyA9IHRoaXMuX2dldEpvaW5lZFJhbmdlcyhcbiAgICAgICAgICAgIGxpbmVTdHIsXG4gICAgICAgICAgICByYW5nZVN0YXJ0U3RyaW5nSW5kZXgsXG4gICAgICAgICAgICBjdXJyZW50U3RyaW5nSW5kZXgsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgcmFuZ2VTdGFydENvbHVtblxuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqb2luZWRSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGpvaW5lZFJhbmdlc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgb3VyIG1hcmtlcnMgZm9yIGEgbmV3IHJhbmdlLlxuICAgICAgICByYW5nZVN0YXJ0Q29sdW1uID0geDtcbiAgICAgICAgcmFuZ2VTdGFydFN0cmluZ0luZGV4ID0gY3VycmVudFN0cmluZ0luZGV4O1xuICAgICAgICByYW5nZUF0dHJGRyA9IHRoaXMuX3dvcmtDZWxsLmZnO1xuICAgICAgICByYW5nZUF0dHJCRyA9IHRoaXMuX3dvcmtDZWxsLmJnO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50U3RyaW5nSW5kZXggKz0gdGhpcy5fd29ya0NlbGwuZ2V0Q2hhcnMoKS5sZW5ndGggfHwgV0hJVEVTUEFDRV9DRUxMX0NIQVIubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgYW55IHRyYWlsaW5nIHJhbmdlcy5cbiAgICBpZiAodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gcmFuZ2VTdGFydENvbHVtbiA+IDEpIHtcbiAgICAgIGNvbnN0IGpvaW5lZFJhbmdlcyA9IHRoaXMuX2dldEpvaW5lZFJhbmdlcyhcbiAgICAgICAgbGluZVN0cixcbiAgICAgICAgcmFuZ2VTdGFydFN0cmluZ0luZGV4LFxuICAgICAgICBjdXJyZW50U3RyaW5nSW5kZXgsXG4gICAgICAgIGxpbmUsXG4gICAgICAgIHJhbmdlU3RhcnRDb2x1bW5cbiAgICAgICk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpvaW5lZFJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByYW5nZXMucHVzaChqb2luZWRSYW5nZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBzZWdtZW50IG9mIGEgbGluZSBvZiB0ZXh0LCBmaW5kIGFsbCByYW5nZXMgb2YgdGV4dCB0aGF0IHNob3VsZCBiZVxuICAgKiBqb2luZWQgaW4gYSBzaW5nbGUgcmVuZGVyaW5nIHVuaXQuIFJhbmdlcyBhcmUgaW50ZXJuYWxseSBjb252ZXJ0ZWQgdG9cbiAgICogY29sdW1uIHJhbmdlcywgcmF0aGVyIHRoYW4gc3RyaW5nIHJhbmdlcy5cbiAgICogQHBhcmFtIGxpbmUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmdWxsIGxpbmUgb2YgdGV4dFxuICAgKiBAcGFyYW0gc3RhcnRJbmRleCBTdGFydCBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgdG8gc2VhcmNoIGluIHRoZSBzdHJpbmcgKGluY2x1c2l2ZSlcbiAgICogQHBhcmFtIGVuZEluZGV4IEVuZCBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgdG8gc2VhcmNoIGluIHRoZSBzdHJpbmcgKGV4Y2x1c2l2ZSlcbiAgICovXG4gIHByaXZhdGUgX2dldEpvaW5lZFJhbmdlcyhsaW5lOiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgbGluZURhdGE6IElCdWZmZXJMaW5lLCBzdGFydENvbDogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXVtdIHtcbiAgICBjb25zdCB0ZXh0ID0gbGluZS5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGpvaW5lciBzb1xuICAgIC8vIHdlIGNhbiBqdXN0IHB1bGwgaXRzIHZhbHVlIGFuZCBhc3NpZ24gaXQgZGlyZWN0bHkgcmF0aGVyIHRoYW5cbiAgICAvLyBtZXJnaW5nIGl0IGludG8gYW4gZW1wdHkgYXJyYXksIHdoaWNoIGluY3VycyB1bm5lY2Vzc2FyeSB3cml0ZXMuXG4gICAgbGV0IGFsbEpvaW5lZFJhbmdlczogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGFsbEpvaW5lZFJhbmdlcyA9IHRoaXMuX2NoYXJhY3RlckpvaW5lcnNbMF0uaGFuZGxlcih0ZXh0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY2hhcmFjdGVySm9pbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gV2UgbWVyZ2UgYW55IG92ZXJsYXBwaW5nIHJhbmdlcyBhY3Jvc3MgdGhlIGRpZmZlcmVudCBqb2luZXJzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqb2luZXJSYW5nZXMgPSB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzW2ldLmhhbmRsZXIodGV4dCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgam9pbmVyUmFuZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgQ2hhcmFjdGVySm9pbmVyU2VydmljZS5fbWVyZ2VSYW5nZXMoYWxsSm9pbmVkUmFuZ2VzLCBqb2luZXJSYW5nZXNbal0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RyaW5nUmFuZ2VzVG9DZWxsUmFuZ2VzKGFsbEpvaW5lZFJhbmdlcywgbGluZURhdGEsIHN0YXJ0Q29sKTtcbiAgICByZXR1cm4gYWxsSm9pbmVkUmFuZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBwcm92aWRlZCByYW5nZXMgaW4tcGxhY2UgdG8gYWRqdXN0IGZvciB2YXJpYXRpb25zIGJldHdlZW5cbiAgICogc3RyaW5nIGxlbmd0aCBhbmQgY2VsbCB3aWR0aCBzbyB0aGF0IHRoZSByYW5nZSByZXByZXNlbnRzIGEgY2VsbCByYW5nZSxcbiAgICogcmF0aGVyIHRoYW4gdGhlIHN0cmluZyByYW5nZSB0aGUgam9pbmVyIHByb3ZpZGVzLlxuICAgKiBAcGFyYW0gcmFuZ2VzIFN0cmluZyByYW5nZXMgY29udGFpbmluZyBzdGFydCAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIGluZGV4XG4gICAqIEBwYXJhbSBsaW5lIENlbGwgZGF0YSBmb3IgdGhlIHJlbGV2YW50IGxpbmUgaW4gdGhlIHRlcm1pbmFsXG4gICAqIEBwYXJhbSBzdGFydENvbCBPZmZzZXQgd2l0aGluIHRoZSBsaW5lIHRvIHN0YXJ0IGZyb21cbiAgICovXG4gIHByaXZhdGUgX3N0cmluZ1Jhbmdlc1RvQ2VsbFJhbmdlcyhyYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXSwgbGluZTogSUJ1ZmZlckxpbmUsIHN0YXJ0Q29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudFJhbmdlSW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50UmFuZ2VTdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRTdHJpbmdJbmRleCA9IDA7XG4gICAgbGV0IGN1cnJlbnRSYW5nZSA9IHJhbmdlc1tjdXJyZW50UmFuZ2VJbmRleF07XG5cbiAgICAvLyBJZiB3ZSBnb3QgdGhyb3VnaCBhbGwgb2YgdGhlIHJhbmdlcywgc3RvcCBzZWFyY2hpbmdcbiAgICBpZiAoIWN1cnJlbnRSYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IHggPSBzdGFydENvbDsgeCA8IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczsgeCsrKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGxpbmUuZ2V0V2lkdGgoeCk7XG4gICAgICBjb25zdCBsZW5ndGggPSBsaW5lLmdldFN0cmluZyh4KS5sZW5ndGggfHwgV0hJVEVTUEFDRV9DRUxMX0NIQVIubGVuZ3RoO1xuXG4gICAgICAvLyBXZSBza2lwIHplcm8td2lkdGggY2hhcmFjdGVycyB3aGVuIGNyZWF0aW5nIHRoZSBzdHJpbmcgdG8gam9pbiB0aGUgdGV4dFxuICAgICAgLy8gc28gd2UgZG8gdGhlIHNhbWUgaGVyZVxuICAgICAgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZVxuICAgICAgaWYgKCFjdXJyZW50UmFuZ2VTdGFydGVkICYmIGN1cnJlbnRSYW5nZVswXSA8PSBjdXJyZW50U3RyaW5nSW5kZXgpIHtcbiAgICAgICAgY3VycmVudFJhbmdlWzBdID0geDtcbiAgICAgICAgY3VycmVudFJhbmdlU3RhcnRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgZW5kIG9mIHRoZSByYW5nZVxuICAgICAgaWYgKGN1cnJlbnRSYW5nZVsxXSA8PSBjdXJyZW50U3RyaW5nSW5kZXgpIHtcbiAgICAgICAgY3VycmVudFJhbmdlWzFdID0geDtcblxuICAgICAgICAvLyBXZSdyZSBmaW5pc2hlZCB3aXRoIHRoaXMgcmFuZ2UsIHNvIHdlIG1vdmUgdG8gdGhlIG5leHQgb25lXG4gICAgICAgIGN1cnJlbnRSYW5nZSA9IHJhbmdlc1srK2N1cnJlbnRSYW5nZUluZGV4XTtcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSByYW5nZXMgbGVmdCwgc3RvcCBzZWFyY2hpbmdcbiAgICAgICAgaWYgKCFjdXJyZW50UmFuZ2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhbmdlcyBjYW4gYmUgb24gYWRqYWNlbnQgY2hhcmFjdGVycy4gQmVjYXVzZSB0aGUgZW5kIGluZGV4IG9mIHRoZVxuICAgICAgICAvLyByYW5nZXMgYXJlIGV4Y2x1c2l2ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBpbmRleCBmb3IgdGhlIHN0YXJ0IG9mIGFcbiAgICAgICAgLy8gcmFuZ2UgY2FuIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgaW5kZXggb2YgdGhlIHByZXZpb3VzIHJhbmdlLiBUb1xuICAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgc3RhcnQgb2YgdGhlIG5leHQgcmFuZ2UsIHdlIGNoZWNrIGhlcmUganVzdCBpbiBjYXNlLlxuICAgICAgICBpZiAoY3VycmVudFJhbmdlWzBdIDw9IGN1cnJlbnRTdHJpbmdJbmRleCkge1xuICAgICAgICAgIGN1cnJlbnRSYW5nZVswXSA9IHg7XG4gICAgICAgICAgY3VycmVudFJhbmdlU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFJhbmdlU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgc3RyaW5nIGluZGV4IGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIHRvIGxpbmUgdXAgd2l0aFxuICAgICAgLy8gdGhlIGNvbHVtbiBhZGp1c3RtZW50XG4gICAgICBjdXJyZW50U3RyaW5nSW5kZXggKz0gbGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIGEgcmFuZ2UgbGVmdCBhdCB0aGUgZW5kLCBpdCBtdXN0IGV4dGVuZCBhbGwgdGhlIHdheSB0b1xuICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgaWYgKGN1cnJlbnRSYW5nZSkge1xuICAgICAgY3VycmVudFJhbmdlWzFdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgdGhlIHJhbmdlIGRlZmluZWQgYnkgdGhlIHByb3ZpZGVkIHN0YXJ0IGFuZCBlbmQgaW50byB0aGUgbGlzdCBvZlxuICAgKiBleGlzdGluZyByYW5nZXMuIFRoZSBtZXJnZSBpcyBkb25lIGluIHBsYWNlIG9uIHRoZSBleGlzdGluZyByYW5nZSBmb3JcbiAgICogcGVyZm9ybWFuY2UgYW5kIGlzIGFsc28gcmV0dXJuZWQuXG4gICAqIEBwYXJhbSByYW5nZXMgRXhpc3RpbmcgcmFuZ2UgbGlzdFxuICAgKiBAcGFyYW0gbmV3UmFuZ2UgVHVwbGUgb2YgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBuZXcgcmFuZ2UgdG8gbWVyZ2UgaW4uXG4gICAqIEByZXR1cm5zIFRoZSByYW5nZXMgaW5wdXQgd2l0aCB0aGUgbmV3IHJhbmdlIG1lcmdlZCBpbiBwbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX21lcmdlUmFuZ2VzKHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdLCBuZXdSYW5nZTogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgbGV0IGluUmFuZ2UgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICBpZiAoIWluUmFuZ2UpIHtcbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzBdKSB7XG4gICAgICAgICAgLy8gQ2FzZSAxOiBOZXcgcmFuZ2UgaXMgYmVmb3JlIHRoZSBzZWFyY2ggcmFuZ2VcbiAgICAgICAgICByYW5nZXMuc3BsaWNlKGksIDAsIG5ld1JhbmdlKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzFdKSB7XG4gICAgICAgICAgLy8gQ2FzZSAyOiBOZXcgcmFuZ2UgaXMgZWl0aGVyIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZVxuICAgICAgICAgIC8vIHNlYXJjaCByYW5nZSBvciBvdmVybGFwcyB3aXRoIHRoZSBmcm9udCBvZiBpdFxuICAgICAgICAgIHJhbmdlWzBdID0gTWF0aC5taW4obmV3UmFuZ2VbMF0sIHJhbmdlWzBdKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JhbmdlWzBdIDwgcmFuZ2VbMV0pIHtcbiAgICAgICAgICAvLyBDYXNlIDM6IE5ldyByYW5nZSBlaXRoZXIgd2hvbGx5IGNvbnRhaW5zIHRoZSBzZWFyY2ggcmFuZ2VcbiAgICAgICAgICAvLyBvciBvdmVybGFwcyB3aXRoIHRoZSBlbmQgb2YgaXRcbiAgICAgICAgICByYW5nZVswXSA9IE1hdGgubWluKG5ld1JhbmdlWzBdLCByYW5nZVswXSk7XG4gICAgICAgICAgaW5SYW5nZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYXNlIDQ6IE5ldyByYW5nZSBzdGFydHMgYWZ0ZXIgdGhlIHNlYXJjaCByYW5nZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXdSYW5nZVsxXSA8PSByYW5nZVswXSkge1xuICAgICAgICAgIC8vIENhc2UgNTogTmV3IHJhbmdlIGV4dGVuZHMgZnJvbSBwcmV2aW91cyByYW5nZSBidXQgZG9lc24ndFxuICAgICAgICAgIC8vIHJlYWNoIHRoZSBjdXJyZW50IG9uZVxuICAgICAgICAgIHJhbmdlc1tpIC0gMV1bMV0gPSBuZXdSYW5nZVsxXTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzFdKSB7XG4gICAgICAgICAgLy8gQ2FzZSA2OiBOZXcgcmFuZ2UgZXh0ZW5kcyBmcm9tIHBydmlvdXMgcmFuZ2UgaW50byB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHJhbmdlXG4gICAgICAgICAgcmFuZ2VzW2kgLSAxXVsxXSA9IE1hdGgubWF4KG5ld1JhbmdlWzFdLCByYW5nZVsxXSk7XG4gICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FzZSA3OiBOZXcgcmFuZ2UgZXh0ZW5kcyBmcm9tIHByZXZpb3VzIHJhbmdlIHBhc3QgdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCByYW5nZVxuICAgICAgICByYW5nZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBpLS07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluUmFuZ2UpIHtcbiAgICAgIC8vIENhc2UgODogTmV3IHJhbmdlIGV4dGVuZHMgcGFzdCB0aGUgbGFzdCBleGlzdGluZyByYW5nZVxuICAgICAgcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXVsxXSA9IG5ld1JhbmdlWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXNlIDk6IE5ldyByYW5nZSBzdGFydHMgYWZ0ZXIgdGhlIGxhc3QgZXhpc3RpbmcgcmFuZ2VcbiAgICAgIHJhbmdlcy5wdXNoKG5ld1JhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2VzO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBJQ29sb3IsIElDb2xvclJHQiB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmxldCAkciA9IDA7XG5sZXQgJGcgPSAwO1xubGV0ICRiID0gMDtcbmxldCAkYSA9IDA7XG5cbmV4cG9ydCBjb25zdCBOVUxMX0NPTE9SOiBJQ29sb3IgPSB7XG4gIGNzczogJyMwMDAwMDAwMCcsXG4gIHJnYmE6IDBcbn07XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJjaGFubmVsc1wiIChpbmRpdmlkdWFsIGNvbG9yIGNoYW5uZWxzIGFzIG51bWJlcnMpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNoYW5uZWxzIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ3NzKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfSR7dG9QYWRkZWRIZXgoYSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9YDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b1JnYmEocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMHhGRik6IG51bWJlciB7XG4gICAgLy8gTm90ZTogVGhlIGFnZ3JlZ2F0ZWQgbnVtYmVyIGlzIFJHQkEzMiAoQkUpLCB0aHVzIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBBQkdSMzJcbiAgICAvLyBvbiBMRSBzeXN0ZW1zLCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgZm9yIGRpcmVjdCAzMi1iaXQgYnVmZmVyIHdyaXRlcy5cbiAgICAvLyA+Pj4gMCBmb3JjZXMgYW4gdW5zaWduZWQgaW50XG4gICAgcmV0dXJuIChyIDw8IDI0IHwgZyA8PCAxNiB8IGIgPDwgOCB8IGEpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IElDb2xvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiwgYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYiwgYSlcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgYElDb2xvcmAuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY29sb3Ige1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IElDb2xvciwgZmc6IElDb2xvcik6IElDb2xvciB7XG4gICAgJGEgPSAoZmcucmdiYSAmIDB4RkYpIC8gMjU1O1xuICAgIGlmICgkYSA9PT0gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBmZy5jc3MsXG4gICAgICAgIHJnYmE6IGZnLnJnYmFcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBmZ0IgPSAoZmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICBjb25zdCBjc3MgPSBjaGFubmVscy50b0NzcygkciwgJGcsICRiKTtcbiAgICBjb25zdCByZ2JhID0gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICAgIHJldHVybiB7IGNzcywgcmdiYSB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzT3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGNvbG9yLnJnYmEgJiAweEZGKSA9PT0gMHhGRjtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb250cmFzdFJhdGlvKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IsIHJhdGlvOiBudW1iZXIpOiBJQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJnYmEuZW5zdXJlQ29udHJhc3RSYXRpbyhiZy5yZ2JhLCBmZy5yZ2JhLCByYXRpbyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKFxuICAgICAgKHJlc3VsdCA+PiAyNCAmIDB4RkYpLFxuICAgICAgKHJlc3VsdCA+PiAxNiAmIDB4RkYpLFxuICAgICAgKHJlc3VsdCA+PiA4ICAmIDB4RkYpXG4gICAgKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFxdWUoY29sb3I6IElDb2xvcik6IElDb2xvciB7XG4gICAgY29uc3QgcmdiYUNvbG9yID0gKGNvbG9yLnJnYmEgfCAweEZGKSA+Pj4gMDtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMocmdiYUNvbG9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiKSxcbiAgICAgIHJnYmE6IHJnYmFDb2xvclxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhY2l0eShjb2xvcjogSUNvbG9yLCBvcGFjaXR5OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gTWF0aC5yb3VuZChvcGFjaXR5ICogMHhGRik7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKGNvbG9yLnJnYmEpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiLCAkYSlcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5T3BhY2l0eShjb2xvcjogSUNvbG9yLCBmYWN0b3I6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBjb2xvci5yZ2JhICYgMHhGRjtcbiAgICByZXR1cm4gb3BhY2l0eShjb2xvciwgKCRhICogZmFjdG9yKSAvIDB4RkYpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3JSR0IoY29sb3I6IElDb2xvcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFsoY29sb3IucmdiYSA+PiAyNCkgJiAweEZGLCAoY29sb3IucmdiYSA+PiAxNikgJiAweEZGLCAoY29sb3IucmdiYSA+PiA4KSAmIDB4RkZdO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJjc3NcIiAoc3RyaW5nOiAnI3JnYicsICcjcmdiYScsICcjcnJnZ2JiJyxcbiAqICcjcnJnZ2JiYWEnKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjc3Mge1xuICBsZXQgJGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgdW5kZWZpbmVkO1xuICBsZXQgJGxpdG11c0NvbG9yOiBDYW52YXNHcmFkaWVudCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFpc05vZGUpIHtcbiAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIHRoZSBmaXJzdCB3aW5kb3csIHNvIGRvY3VtZW50IHNob3VsZCBiZSBjb3JyZWN0XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICAkY3R4ID0gY3R4O1xuICAgICAgJGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnY29weSc7XG4gICAgICAkbGl0bXVzQ29sb3IgPSAkY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDEsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmludGVyZmFjZSBJTmF2aWdhdG9yIHtcbiAgdXNlckFnZW50OiBzdHJpbmc7XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG59XG5cbi8vIFdlJ3JlIGRlY2xhcmluZyBhIG5hdmlnYXRvciBnbG9iYWwgaGVyZSBhcyB3ZSBleHBlY3QgaXQgaW4gYWxsIHJ1bnRpbWVzIChub2RlIGFuZCBicm93c2VyKSwgYnV0XG4vLyB3ZSB3YW50IHRoaXMgbW9kdWxlIHRvIGxpdmUgaW4gY29tbW9uLlxuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IElOYXZpZ2F0b3I7XG5kZWNsYXJlIGNvbnN0IHByb2Nlc3M6IHVua25vd247XG5cbmV4cG9ydCBjb25zdCBpc05vZGUgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSA/IHRydWUgOiBmYWxzZTtcbmNvbnN0IHVzZXJBZ2VudCA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnVzZXJBZ2VudDtcbmNvbnN0IHBsYXRmb3JtID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IucGxhdGZvcm07XG5cbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSB1c2VyQWdlbnQuaW5jbHVkZXMoJ0ZpcmVmb3gnKTtcbmV4cG9ydCBjb25zdCBpc0xlZ2FjeUVkZ2UgPSB1c2VyQWdlbnQuaW5jbHVkZXMoJ0VkZ2UnKTtcbmV4cG9ydCBjb25zdCBpc1NhZmFyaSA9IC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QodXNlckFnZW50KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZhcmlWZXJzaW9uKCk6IG51bWJlciB7XG4gIGlmICghaXNTYWZhcmkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBtYWpvclZlcnNpb24gPSB1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC8oXFxkKykvKTtcbiAgaWYgKG1ham9yVmVyc2lvbiA9PT0gbnVsbCB8fCBtYWpvclZlcnNpb24ubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBwYXJzZUludChtYWpvclZlcnNpb25bMV0pO1xufVxuXG4vLyBGaW5kIHRoZSB1c2VycyBwbGF0Zm9ybS4gV2UgdXNlIHRoaXMgdG8gaW50ZXJwcmV0IHRoZSBtZXRhIGtleVxuLy8gYW5kIElTTyB0aGlyZCBsZXZlbCBzaGlmdHMuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xOTg3NzkyNC81Nzc1OThcbmV4cG9ydCBjb25zdCBpc01hYyA9IFsnTWFjaW50b3NoJywgJ01hY0ludGVsJywgJ01hY1BQQycsICdNYWM2OEsnXS5pbmNsdWRlcyhwbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNJcGFkID0gcGxhdGZvcm0gPT09ICdpUGFkJztcbmV4cG9ydCBjb25zdCBpc0lwaG9uZSA9IHBsYXRmb3JtID09PSAnaVBob25lJztcbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBbJ1dpbmRvd3MnLCAnV2luMTYnLCAnV2luMzInLCAnV2luQ0UnXS5pbmNsdWRlcyhwbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNMaW51eCA9IHBsYXRmb3JtLmluZGV4T2YoJ0xpbnV4JykgPj0gMDtcbi8vIE5vdGUgdGhhdCB3aGVuIHRoaXMgaXMgdHJ1ZSwgaXNMaW51eCB3aWxsIGFsc28gYmUgdHJ1ZS5cbmV4cG9ydCBjb25zdCBpc0Nocm9tZU9TID0gL1xcYkNyT1NcXGIvLnRlc3QodXNlckFnZW50KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuaW50ZXJmYWNlIElUYXNrUXVldWUge1xuICAvKipcbiAgICogQWRkcyBhIHRhc2sgdG8gdGhlIHF1ZXVlIHdoaWNoIHdpbGwgcnVuIGluIGEgZnV0dXJlIGlkbGUgY2FsbGJhY2suXG4gICAqIFRvIGF2b2lkIHBlcmNlaXZhYmxlIHN0YWxscyBvbiB0aGUgbWFpbnRocmVhZCwgdGFza3Mgd2l0aCBoZWF2eSB3b3JrbG9hZFxuICAgKiBzaG91bGQgc3BsaXQgdGhlaXIgd29yayBpbnRvIHNtYWxsZXIgcGllY2VzIGFuZCByZXR1cm4gYHRydWVgIHRvIGdldFxuICAgKiBjYWxsZWQgYWdhaW4gdW50aWwgdGhlIHdvcmsgaXMgZG9uZSAob24gZmFsc3kgcmV0dXJuIHZhbHVlKS5cbiAgICovXG4gIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBxdWV1ZSwgcnVubmluZyBhbGwgcmVtYWluaW5nIHRhc2tzIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBmbHVzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IHJlbWFpbmluZyB0YXNrcyBmcm9tIHRoZSBxdWV1ZSwgdGhlc2Ugd2lsbCBub3QgYmUgcnVuLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElUYXNrRGVhZGxpbmUge1xuICB0aW1lUmVtYWluaW5nKCk6IG51bWJlcjtcbn1cbnR5cGUgQ2FsbGJhY2tXaXRoRGVhZGxpbmUgPSAoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpID0+IHZvaWQ7XG5cbmFic3RyYWN0IGNsYXNzIFRhc2tRdWV1ZSBpbXBsZW1lbnRzIElUYXNrUXVldWUge1xuICBwcml2YXRlIF90YXNrczogKCgpID0+IGJvb2xlYW4gfCB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX2lkbGVDYWxsYmFjaz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaSA9IDA7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IENhbGxiYWNrV2l0aERlYWRsaW5lKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQ7XG5cbiAgcHVibGljIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl90YXNrcy5wdXNoKHRhc2spO1xuICAgIHRoaXMuX3N0YXJ0KCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIGlmICghdGhpcy5fdGFza3NbdGhpcy5faV0oKSkge1xuICAgICAgICB0aGlzLl9pKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faWRsZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9jYW5jZWxDYWxsYmFjayh0aGlzLl9pZGxlQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9pID0gMDtcbiAgICB0aGlzLl90YXNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pZGxlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHRoaXMuX3JlcXVlc3RDYWxsYmFjayh0aGlzLl9wcm9jZXNzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3MoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHRhc2tEdXJhdGlvbiA9IDA7XG4gICAgbGV0IGxvbmdlc3RUYXNrID0gMDtcbiAgICBsZXQgbGFzdERlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgIGxldCBkZWFkbGluZVJlbWFpbmluZyA9IDA7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIHRhc2tEdXJhdGlvbiA9IERhdGUubm93KCk7XG4gICAgICBpZiAoIXRoaXMuX3Rhc2tzW3RoaXMuX2ldKCkpIHtcbiAgICAgICAgdGhpcy5faSsrO1xuICAgICAgfVxuICAgICAgLy8gb3RoZXIgdGhhbiBwZXJmb3JtYW5jZS5ub3csIERhdGUubm93IG1pZ2h0IG5vdCBiZSBzdGFibGUgKGNoYW5nZXMgb24gd2FsbCBjbG9jayBjaGFuZ2VzKSxcbiAgICAgIC8vIHRoaXMgaXMgbm90IGFuIGlzc3VlIGhlcmUgYXMgYSBjbG9jayBjaGFuZ2UgZHVyaW5nIGEgc2hvcnQgcnVubmluZyB0YXNrIGlzIHZlcnkgdW5saWtlbHlcbiAgICAgIC8vIGluIGNhc2UgaXQgc3RpbGwgaGFwcGVuZWQgYW5kIGxlYWRzIHRvIG5lZ2F0aXZlIGR1cmF0aW9uLCBzaW1wbHkgYXNzdW1lIDEgbXNlY1xuICAgICAgdGFza0R1cmF0aW9uID0gTWF0aC5tYXgoMSwgRGF0ZS5ub3coKSAtIHRhc2tEdXJhdGlvbik7XG4gICAgICBsb25nZXN0VGFzayA9IE1hdGgubWF4KHRhc2tEdXJhdGlvbiwgbG9uZ2VzdFRhc2spO1xuICAgICAgLy8gR3Vlc3MgdGhlIGZvbGxvd2luZyB0YXNrIHdpbGwgdGFrZSBhIHNpbWlsYXIgdGltZSB0byB0aGUgbG9uZ2VzdCB0YXNrIGluIHRoaXMgYmF0Y2gsIGFsbG93XG4gICAgICAvLyBhZGRpdGlvbmFsIHJvb20gdG8gdHJ5IGF2b2lkIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmVcbiAgICAgIGRlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgICAgaWYgKGxvbmdlc3RUYXNrICogMS41ID4gZGVhZGxpbmVSZW1haW5pbmcpIHtcbiAgICAgICAgLy8gV2FybiB3aGVuIHRoZSB0aW1lIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmUgaXMgb3ZlciAyMG1zLCBpZiB0aGlzIGhhcHBlbnMgaW4gcHJhY3RpY2UgdGhlXG4gICAgICAgIC8vIHRhc2sgc2hvdWxkIGJlIHNwbGl0IGludG8gc3ViLXRhc2tzIHRvIGVuc3VyZSB0aGUgVUkgcmVtYWlucyByZXNwb25zaXZlLlxuICAgICAgICBpZiAobGFzdERlYWRsaW5lUmVtYWluaW5nIC0gdGFza0R1cmF0aW9uIDwgLTIwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGB0YXNrIHF1ZXVlIGV4Y2VlZGVkIGFsbG90dGVkIGRlYWRsaW5lIGJ5ICR7TWF0aC5hYnMoTWF0aC5yb3VuZChsYXN0RGVhZGxpbmVSZW1haW5pbmcgLSB0YXNrRHVyYXRpb24pKX1tc2ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3REZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lUmVtYWluaW5nO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgdGFza3MgdmlhIHNldFRpbWVvdXQsIHRyeWluZyB0byBtYWludGFpbiBhYm92ZSA2MCBmcmFtZXNcbiAqIHBlciBzZWNvbmQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5IHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlcixcbiAqIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdCBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUHJpb3JpdHlUYXNrUXVldWUgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogQ2FsbGJhY2tXaXRoRGVhZGxpbmUpOiBudW1iZXIge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHRoaXMuX2NyZWF0ZURlYWRsaW5lKDE2KSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaWRlbnRpZmllcik7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEZWFkbGluZShkdXJhdGlvbjogbnVtYmVyKTogSVRhc2tEZWFkbGluZSB7XG4gICAgY29uc3QgZW5kID0gRGF0ZS5ub3coKSArIGR1cmF0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lUmVtYWluaW5nOiAoKSA9PiBNYXRoLm1heCgwLCBlbmQgLSBEYXRlLm5vdygpKVxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgSWRsZVRhc2tRdWV1ZUludGVybmFsIGV4dGVuZHMgVGFza1F1ZXVlIHtcbiAgcHJvdGVjdGVkIF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IElkbGVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0SWRsZUNhbGxiYWNrKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY2FuY2VsSWRsZUNhbGxiYWNrKGlkZW50aWZpZXIpO1xuICB9XG59XG5cbi8qKlxuICogQSBxdWV1ZSBvZiB0aGF0IHJ1bnMgdGFza3Mgb3ZlciBzZXZlcmFsIGlkbGUgY2FsbGJhY2tzLCB0cnlpbmcgdG8gcmVzcGVjdCB0aGUgaWRsZSBjYWxsYmFjaydzXG4gKiBkZWFkbGluZSBnaXZlbiBieSB0aGUgZW52aXJvbm1lbnQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5XG4gKiB3aWxsIHJ1biBzb21lIHRpbWUgbGF0ZXIsIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdFxuICogaW50cm9kdWNlIHJhY2UgY29uZGl0aW9ucy5cbiAqXG4gKiBUaGlzIHJldmVydHMgdG8gYSB7QGxpbmsgUHJpb3JpdHlUYXNrUXVldWV9IGlmIHRoZSBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGlkbGUgY2FsbGJhY2tzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgSWRsZVRhc2tRdWV1ZSA9ICghaXNOb2RlICYmICdyZXF1ZXN0SWRsZUNhbGxiYWNrJyBpbiB3aW5kb3cpID8gSWRsZVRhc2tRdWV1ZUludGVybmFsIDogUHJpb3JpdHlUYXNrUXVldWU7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgdHJhY2tzIGEgc2luZ2xlIGRlYm91bmNlZCB0YXNrIHRoYXQgd2lsbCBydW4gb24gdGhlIG5leHQgaWRsZSBmcmFtZS4gV2hlbiBjYWxsZWRcbiAqIG11bHRpcGxlIHRpbWVzLCBvbmx5IHRoZSBsYXN0IHNldCB0YXNrIHdpbGwgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgRGVib3VuY2VkSWRsZVRhc2sge1xuICBwcml2YXRlIF9xdWV1ZTogSVRhc2tRdWV1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9xdWV1ZSA9IG5ldyBJZGxlVGFza1F1ZXVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fcXVldWUuY2xlYXIoKTtcbiAgICB0aGlzLl9xdWV1ZS5lbnF1ZXVlKHRhc2spO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCk6IHZvaWQge1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElDb2xvclJHQiwgSUV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgRmdGbGFncywgQmdGbGFncywgVW5kZXJsaW5lU3R5bGUsIEV4dEZsYWdzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlRGF0YSBpbXBsZW1lbnRzIElBdHRyaWJ1dGVEYXRhIHtcbiAgcHVibGljIHN0YXRpYyB0b0NvbG9yUkdCKHZhbHVlOiBudW1iZXIpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbXG4gICAgICB2YWx1ZSA+Pj4gQXR0cmlidXRlcy5SRURfU0hJRlQgJiAyNTUsXG4gICAgICB2YWx1ZSA+Pj4gQXR0cmlidXRlcy5HUkVFTl9TSElGVCAmIDI1NSxcbiAgICAgIHZhbHVlICYgMjU1XG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNvbG9yUkdCKHZhbHVlOiBJQ29sb3JSR0IpOiBudW1iZXIge1xuICAgIHJldHVybiAodmFsdWVbMF0gJiAyNTUpIDw8IEF0dHJpYnV0ZXMuUkVEX1NISUZUIHwgKHZhbHVlWzFdICYgMjU1KSA8PCBBdHRyaWJ1dGVzLkdSRUVOX1NISUZUIHwgdmFsdWVbMl0gJiAyNTU7XG4gIH1cblxuICBwdWJsaWMgY2xvbmUoKTogSUF0dHJpYnV0ZURhdGEge1xuICAgIGNvbnN0IG5ld09iaiA9IG5ldyBBdHRyaWJ1dGVEYXRhKCk7XG4gICAgbmV3T2JqLmZnID0gdGhpcy5mZztcbiAgICBuZXdPYmouYmcgPSB0aGlzLmJnO1xuICAgIG5ld09iai5leHRlbmRlZCA9IHRoaXMuZXh0ZW5kZWQuY2xvbmUoKTtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG5cbiAgLy8gZGF0YVxuICBwdWJsaWMgZmcgPSAwO1xuICBwdWJsaWMgYmcgPSAwO1xuICBwdWJsaWMgZXh0ZW5kZWQ6IElFeHRlbmRlZEF0dHJzID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcblxuICAvLyBmbGFnc1xuICBwdWJsaWMgaXNJbnZlcnNlKCk6IG51bWJlciAgICAgICB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5JTlZFUlNFOyB9XG4gIHB1YmxpYyBpc0JvbGQoKTogbnVtYmVyICAgICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLkJPTEQ7IH1cbiAgcHVibGljIGlzVW5kZXJsaW5lKCk6IG51bWJlciAgICAge1xuICAgIGlmICh0aGlzLmhhc0V4dGVuZGVkQXR0cnMoKSAmJiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlICE9PSBVbmRlcmxpbmVTdHlsZS5OT05FKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlVOREVSTElORTtcbiAgfVxuICBwdWJsaWMgaXNCbGluaygpOiBudW1iZXIgICAgICAgICB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5CTElOSzsgfVxuICBwdWJsaWMgaXNJbnZpc2libGUoKTogbnVtYmVyICAgICB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5JTlZJU0lCTEU7IH1cbiAgcHVibGljIGlzSXRhbGljKCk6IG51bWJlciAgICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuSVRBTElDOyB9XG4gIHB1YmxpYyBpc0RpbSgpOiBudW1iZXIgICAgICAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLkRJTTsgfVxuICBwdWJsaWMgaXNTdHJpa2V0aHJvdWdoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5TVFJJS0VUSFJPVUdIOyB9XG4gIHB1YmxpYyBpc1Byb3RlY3RlZCgpOiBudW1iZXIgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLlBST1RFQ1RFRDsgfVxuICBwdWJsaWMgaXNPdmVybGluZSgpOiBudW1iZXIgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5PVkVSTElORTsgfVxuXG4gIC8vIGNvbG9yIG1vZGVzXG4gIHB1YmxpYyBnZXRGZ0NvbG9yTW9kZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSzsgfVxuICBwdWJsaWMgZ2V0QmdDb2xvck1vZGUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0s7IH1cbiAgcHVibGljIGlzRmdSR0IoKTogYm9vbGVhbiAgICAgICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCOyB9XG4gIHB1YmxpYyBpc0JnUkdCKCk6IGJvb2xlYW4gICAgICAgeyByZXR1cm4gKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQjsgfVxuICBwdWJsaWMgaXNGZ1BhbGV0dGUoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTY7IH1cbiAgcHVibGljIGlzQmdQYWxldHRlKCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDE2IHx8ICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2OyB9XG4gIHB1YmxpYyBpc0ZnRGVmYXVsdCgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSAwOyB9XG4gIHB1YmxpYyBpc0JnRGVmYXVsdCgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSAwOyB9XG4gIHB1YmxpYyBpc0F0dHJpYnV0ZURlZmF1bHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmZnID09PSAwICYmIHRoaXMuYmcgPT09IDA7IH1cblxuICAvLyBjb2xvcnNcbiAgcHVibGljIGdldEZnQ29sb3IoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6ICAgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvLyBDTV9ERUZBVUxUIGRlZmF1bHRzIHRvIC0xXG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRCZ0NvbG9yKCk6IG51bWJlciB7XG4gICAgc3dpdGNoICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6ICByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0s7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgLy8gQ01fREVGQVVMVCBkZWZhdWx0cyB0byAtMVxuICAgIH1cbiAgfVxuXG4gIC8vIGV4dGVuZGVkIGF0dHJzXG4gIHB1YmxpYyBoYXNFeHRlbmRlZEF0dHJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRDtcbiAgfVxuICBwdWJsaWMgdXBkYXRlRXh0ZW5kZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXh0ZW5kZWQuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmJnICY9IH5CZ0ZsYWdzLkhBU19FWFRFTkRFRDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iZyB8PSBCZ0ZsYWdzLkhBU19FWFRFTkRFRDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZUNvbG9yKCk6IG51bWJlciB7XG4gICAgaWYgKCh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6ICByZXR1cm4gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0s7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6ICAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZnQ29sb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmdDb2xvcigpO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVDb2xvck1vZGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTS1xuICAgICAgOiB0aGlzLmdldEZnQ29sb3JNb2RlKCk7XG4gIH1cbiAgcHVibGljIGlzVW5kZXJsaW5lQ29sb3JSR0IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0JcbiAgICAgIDogdGhpcy5pc0ZnUkdCKCk7XG4gIH1cbiAgcHVibGljIGlzVW5kZXJsaW5lQ29sb3JQYWxldHRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDE2XG4gICAgICAgICAgfHwgKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTZcbiAgICAgIDogdGhpcy5pc0ZnUGFsZXR0ZSgpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yRGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSAwXG4gICAgICA6IHRoaXMuaXNGZ0RlZmF1bHQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lU3R5bGUoKTogVW5kZXJsaW5lU3R5bGUge1xuICAgIHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5VTkRFUkxJTkVcbiAgICAgID8gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCA/IHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgOiBVbmRlcmxpbmVTdHlsZS5TSU5HTEUpXG4gICAgICA6IFVuZGVybGluZVN0eWxlLk5PTkU7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZVZhcmlhbnRPZmZzZXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVWYXJpYW50T2Zmc2V0O1xuICB9XG59XG5cblxuLyoqXG4gKiBFeHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBhIGNlbGwuXG4gKiBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCBkaWZmZXJlbnQgdW5kZXJsaW5lIHN0eWxlcyBhbmQgY29sb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbmRlZEF0dHJzIGltcGxlbWVudHMgSUV4dGVuZGVkQXR0cnMge1xuICBwcml2YXRlIF9leHQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgZXh0KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3VybElkKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5fZXh0ICYgfkV4dEZsYWdzLlVOREVSTElORV9TVFlMRSkgfFxuICAgICAgICAodGhpcy51bmRlcmxpbmVTdHlsZSA8PCAyNilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9leHQ7XG4gIH1cbiAgcHVibGljIHNldCBleHQodmFsdWU6IG51bWJlcikgeyB0aGlzLl9leHQgPSB2YWx1ZTsgfVxuXG4gIHB1YmxpYyBnZXQgdW5kZXJsaW5lU3R5bGUoKTogVW5kZXJsaW5lU3R5bGUge1xuICAgIC8vIEFsd2F5cyByZXR1cm4gdGhlIFVSTCBzdHlsZSBpZiBpdCBoYXMgb25lXG4gICAgaWYgKHRoaXMuX3VybElkKSB7XG4gICAgICByZXR1cm4gVW5kZXJsaW5lU3R5bGUuREFTSEVEO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMuX2V4dCAmIEV4dEZsYWdzLlVOREVSTElORV9TVFlMRSkgPj4gMjY7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVTdHlsZSh2YWx1ZTogVW5kZXJsaW5lU3R5bGUpIHtcbiAgICB0aGlzLl9leHQgJj0gfkV4dEZsYWdzLlVOREVSTElORV9TVFlMRTtcbiAgICB0aGlzLl9leHQgfD0gKHZhbHVlIDw8IDI2KSAmIEV4dEZsYWdzLlVOREVSTElORV9TVFlMRTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5kZXJsaW5lQ29sb3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0ICYgKEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lQ29sb3IodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2V4dCAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgIHRoaXMuX2V4dCB8PSB2YWx1ZSAmIChBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VybElkOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZ2V0IHVybElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3VybElkO1xuICB9XG4gIHB1YmxpYyBzZXQgdXJsSWQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3VybElkID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZVZhcmlhbnRPZmZzZXQoKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWwgPSAodGhpcy5fZXh0ICYgRXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQpID4+IDI5O1xuICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICByZXR1cm4gdmFsIF4gMHhGRkZGRkZGODtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZVZhcmlhbnRPZmZzZXQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2V4dCAmPSB+RXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQ7XG4gICAgdGhpcy5fZXh0IHw9ICh2YWx1ZSA8PCAyOSkgJiBFeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGV4dDogbnVtYmVyID0gMCxcbiAgICB1cmxJZDogbnVtYmVyID0gMFxuICApIHtcbiAgICB0aGlzLl9leHQgPSBleHQ7XG4gICAgdGhpcy5fdXJsSWQgPSB1cmxJZDtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBJRXh0ZW5kZWRBdHRycyB7XG4gICAgcmV0dXJuIG5ldyBFeHRlbmRlZEF0dHJzKHRoaXMuX2V4dCwgdGhpcy5fdXJsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9iamVjdCBob2xkcyBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLFxuICAgKiB0aGF0IG5lZWRzIHRvIGJlIHBlcnNpc3RhbnQgaW4gdGhlIGJ1ZmZlci5cbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVuZGVybGluZVN0eWxlID09PSBVbmRlcmxpbmVTdHlsZS5OT05FICYmIHRoaXMuX3VybElkID09PSAwO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENoYXJEYXRhLCBJQ2VsbERhdGEsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IHN0cmluZ0Zyb21Db2RlUG9pbnQgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgQ0hBUl9EQVRBX0NIQVJfSU5ERVgsIENIQVJfREFUQV9XSURUSF9JTkRFWCwgQ0hBUl9EQVRBX0FUVFJfSU5ERVgsIENvbnRlbnQgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhLCBFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcblxuLyoqXG4gKiBDZWxsRGF0YSAtIHJlcHJlc2VudHMgYSBzaW5nbGUgQ2VsbCBpbiB0aGUgdGVybWluYWwgYnVmZmVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2VsbERhdGEgZXh0ZW5kcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUNlbGxEYXRhIHtcbiAgLyoqIEhlbHBlciB0byBjcmVhdGUgQ2VsbERhdGEgZnJvbSBDaGFyRGF0YS4gKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogQ2VsbERhdGEge1xuICAgIGNvbnN0IG9iaiA9IG5ldyBDZWxsRGF0YSgpO1xuICAgIG9iai5zZXRGcm9tQ2hhckRhdGEodmFsdWUpO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLyoqIFByaW1pdGl2ZXMgZnJvbSB0ZXJtaW5hbCBidWZmZXIuICovXG4gIHB1YmxpYyBjb250ZW50ID0gMDtcbiAgcHVibGljIGZnID0gMDtcbiAgcHVibGljIGJnID0gMDtcbiAgcHVibGljIGV4dGVuZGVkOiBJRXh0ZW5kZWRBdHRycyA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG4gIHB1YmxpYyBjb21iaW5lZERhdGEgPSAnJztcbiAgLyoqIFdoZXRoZXIgY2VsbCBjb250YWlucyBhIGNvbWJpbmVkIHN0cmluZy4gKi9cbiAgcHVibGljIGlzQ29tYmluZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG4gIC8qKiBXaWR0aCBvZiB0aGUgY2VsbC4gKi9cbiAgcHVibGljIGdldFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudCA+PiBDb250ZW50LldJRFRIX1NISUZUO1xuICB9XG4gIC8qKiBKUyBzdHJpbmcgb2YgdGhlIGNvbnRlbnQuICovXG4gIHB1YmxpYyBnZXRDaGFycygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkRGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0spIHtcbiAgICAgIHJldHVybiBzdHJpbmdGcm9tQ29kZVBvaW50KHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0spO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgLyoqXG4gICAqIENvZGVwb2ludCBvZiBjZWxsXG4gICAqIE5vdGUgdGhpcyByZXR1cm5zIHRoZSBVVEYzMiBjb2RlcG9pbnQgb2Ygc2luZ2xlIGNoYXJzLFxuICAgKiBpZiBjb250ZW50IGlzIGEgY29tYmluZWQgc3RyaW5nIGl0IHJldHVybnMgdGhlIGNvZGVwb2ludFxuICAgKiBvZiB0aGUgbGFzdCBjaGFyIGluIHN0cmluZyB0byBiZSBpbiBsaW5lIHdpdGggY29kZSBpbiBDaGFyRGF0YS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmlzQ29tYmluZWQoKSlcbiAgICAgID8gdGhpcy5jb21iaW5lZERhdGEuY2hhckNvZGVBdCh0aGlzLmNvbWJpbmVkRGF0YS5sZW5ndGggLSAxKVxuICAgICAgOiB0aGlzLmNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICB9XG4gIC8qKiBTZXQgZGF0YSBmcm9tIENoYXJEYXRhICovXG4gIHB1YmxpYyBzZXRGcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5mZyA9IHZhbHVlW0NIQVJfREFUQV9BVFRSX0lOREVYXTtcbiAgICB0aGlzLmJnID0gMDtcbiAgICBsZXQgY29tYmluZWQgPSBmYWxzZTtcbiAgICAvLyBzdXJyb2dhdGVzIGFuZCBjb21iaW5lZCBzdHJpbmdzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnRcbiAgICBpZiAodmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgY29kZSA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gaWYgdGhlIDItY2hhciBzdHJpbmcgaXMgYSBzdXJyb2dhdGUgY3JlYXRlIHNpbmdsZSBjb2RlcG9pbnRcbiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBjb21iaW5lZFxuICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDEpO1xuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50ID0gKChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMCkgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb21iaW5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb21iaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50ID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCkgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkRGF0YSA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXTtcbiAgICAgIHRoaXMuY29udGVudCA9IENvbnRlbnQuSVNfQ09NQklORURfTUFTSyB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH1cbiAgfVxuICAvKiogR2V0IGRhdGEgYXMgQ2hhckRhdGEuICovXG4gIHB1YmxpYyBnZXRBc0NoYXJEYXRhKCk6IENoYXJEYXRhIHtcbiAgICByZXR1cm4gW3RoaXMuZmcsIHRoaXMuZ2V0Q2hhcnMoKSwgdGhpcy5nZXRXaWR0aCgpLCB0aGlzLmdldENvZGUoKV07XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09MT1IgPSAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVRUUiA9ICgwIDw8IDE4KSB8IChERUZBVUxUX0NPTE9SIDw8IDkpIHwgKDI1NiA8PCAwKTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYVCA9IDA7XG5cbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQVRUUl9JTkRFWCA9IDA7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0NIQVJfSU5ERVggPSAxO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9XSURUSF9JTkRFWCA9IDI7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0NPREVfSU5ERVggPSAzO1xuXG4vKipcbiAqIE51bGwgY2VsbCAtIGEgcmVhbCBlbXB0eSBjZWxsIChjb250YWluaW5nIG5vdGhpbmcpLlxuICogTm90ZSB0aGF0IGNvZGUgc2hvdWxkIGFsd2F5cyBiZSAwIGZvciBhIG51bGwgY2VsbCBhc1xuICogc2V2ZXJhbCB0ZXN0IGNvbmRpdGlvbiBvZiB0aGUgYnVmZmVyIGxpbmUgcmVseSBvbiB0aGlzLlxuICovXG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX0NIQVIgPSAnJztcbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfV0lEVEggPSAxO1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9DT0RFID0gMDtcblxuLyoqXG4gKiBXaGl0ZXNwYWNlIGNlbGwuXG4gKiBUaGlzIGlzIG1lYW50IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGVtcHR5IGNlbGxzIHdoZW4gbmVlZGVkXG4gKiBkdXJpbmcgcmVuZGVyaW5nIGxpbmVzIHRvIHByZXNlcnZlIGNvcnJlY3QgYWxpZ21lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfQ0hBUiA9ICcgJztcbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfV0lEVEggPSAxO1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9DT0RFID0gMzI7XG5cbi8qKlxuICogQml0bWFza3MgZm9yIGFjY2Vzc2luZyBkYXRhIGluIGBjb250ZW50YC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQ29udGVudCB7XG4gIC8qKlxuICAgKiBiaXQgMS4uMjEgICAgY29kZXBvaW50LCBtYXggYWxsb3dlZCBpbiBVVEYzMiBpcyAweDEwRkZGRiAoMjEgYml0cyB0YWtlbilcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGNvZGVwb2ludCA9IGNvbnRlbnQgJiBDb250ZW50LmNvZGVwb2ludE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgd3JpdGU6ICBgY29udGVudCB8PSBjb2RlcG9pbnQgJiBDb250ZW50LmNvZGVwb2ludE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCBpZiBwcmVjb25kaXRpb24gYGNvZGVwb2ludCA8PSAweDEwRkZGRmAgaXMgbWV0OlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgY29udGVudCB8PSBjb2RlcG9pbnQ7YFxuICAgKi9cbiAgQ09ERVBPSU5UX01BU0sgPSAweDFGRkZGRixcblxuICAvKipcbiAgICogYml0IDIyICAgICAgIGZsYWcgaW5kaWNhdGlvbiB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBjb21iaW5lZCBjb250ZW50XG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBpc0NvbWJpbmVkID0gY29udGVudCAmIENvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqICAgICAgICAgICAgICBzZXQ6ICAgIGBjb250ZW50IHw9IENvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqICAgICAgICAgICAgICBjbGVhcjogIGBjb250ZW50ICY9IH5Db250ZW50LmlzQ29tYmluZWQ7YFxuICAgKi9cbiAgSVNfQ09NQklORURfTUFTSyA9IDB4MjAwMDAwLCAgLy8gMSA8PCAyMVxuXG4gIC8qKlxuICAgKiBiaXQgMS4uMjIgICAgbWFzayB0byBjaGVjayB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBhbnkgc3RyaW5nIGRhdGFcbiAgICogICAgICAgICAgICAgIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGNvZGVwb2ludCBhbmQgaXNDb21iaW5lZCBiaXRzIHRvIHNlZVxuICAgKiAgICAgICAgICAgICAgd2hldGhlciBhIGNlbGwgY29udGFpbnMgYW55dGhpbmdcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGlzRW1wdHkgPSAhKGNvbnRlbnQgJiBDb250ZW50Lmhhc0NvbnRlbnQpYFxuICAgKi9cbiAgSEFTX0NPTlRFTlRfTUFTSyA9IDB4M0ZGRkZGLFxuXG4gIC8qKlxuICAgKiBiaXQgMjMuLjI0ICAgd2N3aWR0aCB2YWx1ZSBvZiBjZWxsLCB0YWtlcyAyIGJpdHMgKHJhbmdlcyBmcm9tIDAuLjIpXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGB3aWR0aCA9IChjb250ZW50ICYgQ29udGVudC53aWR0aE1hc2spID4+IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBoYXNXaWR0aCA9IGNvbnRlbnQgJiBDb250ZW50LndpZHRoTWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFzIGxvbmcgYXMgd2N3aWR0aCBpcyBoaWdoZXN0IHZhbHVlIGluIGBjb250ZW50YDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYHdpZHRoID0gY29udGVudCA+PiBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKiAgICAgICAgICAgICAgd3JpdGU6ICBgY29udGVudCB8PSAod2lkdGggPDwgQ29udGVudC53aWR0aFNoaWZ0KSAmIENvbnRlbnQud2lkdGhNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgaWYgcHJlY29uZGl0aW9uIGAwIDw9IHdpZHRoIDw9IDNgIGlzIG1ldDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGNvbnRlbnQgfD0gd2lkdGggPDwgQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICovXG4gIFdJRFRIX01BU0sgPSAweEMwMDAwMCwgICAvLyAzIDw8IDIyXG4gIFdJRFRIX1NISUZUID0gMjJcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBiaXQgMS4uOCAgICAgYmx1ZSBpbiBSR0IsIGNvbG9yIGluIFAyNTYgYW5kIFAxNlxuICAgKi9cbiAgQkxVRV9NQVNLID0gMHhGRixcbiAgQkxVRV9TSElGVCA9IDAsXG4gIFBDT0xPUl9NQVNLID0gMHhGRixcbiAgUENPTE9SX1NISUZUID0gMCxcblxuICAvKipcbiAgICogYml0IDkuLjE2ICAgIGdyZWVuIGluIFJHQlxuICAgKi9cbiAgR1JFRU5fTUFTSyA9IDB4RkYwMCxcbiAgR1JFRU5fU0hJRlQgPSA4LFxuXG4gIC8qKlxuICAgKiBiaXQgMTcuLjI0ICAgcmVkIGluIFJHQlxuICAgKi9cbiAgUkVEX01BU0sgPSAweEZGMDAwMCxcbiAgUkVEX1NISUZUID0gMTYsXG5cbiAgLyoqXG4gICAqIGJpdCAyNS4uMjYgICBjb2xvciBtb2RlOiBERUZBVUxUICgwKSB8IFAxNiAoMSkgfCBQMjU2ICgyKSB8IFJHQiAoMylcbiAgICovXG4gIENNX01BU0sgPSAweDMwMDAwMDAsXG4gIENNX0RFRkFVTFQgPSAwLFxuICBDTV9QMTYgPSAweDEwMDAwMDAsXG4gIENNX1AyNTYgPSAweDIwMDAwMDAsXG4gIENNX1JHQiA9IDB4MzAwMDAwMCxcblxuICAvKipcbiAgICogYml0IDEuLjI0ICBSR0Igcm9vbVxuICAgKi9cbiAgUkdCX01BU0sgPSAweEZGRkZGRlxufVxuXG5leHBvcnQgY29uc3QgZW51bSBGZ0ZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMzJcbiAgICovXG4gIElOVkVSU0UgPSAweDQwMDAwMDAsXG4gIEJPTEQgPSAweDgwMDAwMDAsXG4gIFVOREVSTElORSA9IDB4MTAwMDAwMDAsXG4gIEJMSU5LID0gMHgyMDAwMDAwMCxcbiAgSU5WSVNJQkxFID0gMHg0MDAwMDAwMCxcbiAgU1RSSUtFVEhST1VHSCA9IDB4ODAwMDAwMDAsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEJnRmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4zMiAodXBwZXIgMiB1bnVzZWQpXG4gICAqL1xuICBJVEFMSUMgPSAweDQwMDAwMDAsXG4gIERJTSA9IDB4ODAwMDAwMCxcbiAgSEFTX0VYVEVOREVEID0gMHgxMDAwMDAwMCxcbiAgUFJPVEVDVEVEID0gMHgyMDAwMDAwMCxcbiAgT1ZFUkxJTkUgPSAweDQwMDAwMDAwXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEV4dEZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMjlcbiAgICovXG4gIFVOREVSTElORV9TVFlMRSA9IDB4MUMwMDAwMDAsXG5cbiAgLyoqXG4gICAqIGJpdCAzMC4uMzJcbiAgICpcbiAgICogQW4gb3B0aW9uYWwgdmFyaWFudCBmb3IgdGhlIGdseXBoLCB0aGlzIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIG9mZnNldCB1bmRlcmxpbmVzIGJ5IGFcbiAgICogbnVtYmVyIG9mIHBpeGVscyB0byBjcmVhdGUgYSBwZXJmZWN0IHBhdHRlcm4uXG4gICAqL1xuICBWQVJJQU5UX09GRlNFVCA9IDB4RTAwMDAwMDBcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gVW5kZXJsaW5lU3R5bGUge1xuICBOT05FID0gMCxcbiAgU0lOR0xFID0gMSxcbiAgRE9VQkxFID0gMixcbiAgQ1VSTFkgPSAzLFxuICBET1RURUQgPSA0LFxuICBEQVNIRUQgPSA1XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qKlxuICogUG9seWZpbGwgLSBDb252ZXJ0IFVURjMyIGNvZGVwb2ludCBpbnRvIEpTIHN0cmluZy5cbiAqIE5vdGU6IFRoZSBidWlsdC1pbiBTdHJpbmcuZnJvbUNvZGVQb2ludCBoYXBwZW5zIHRvIGJlIG11Y2ggc2xvd2VyXG4gKiAgICAgICBkdWUgdG8gYWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzLiBXZSBjYW4gYXZvaWQgdGhlbSBzaW5jZVxuICogICAgICAgd2UgYWx3YXlzIG9wZXJhdGUgb24gbGVnYWwgVVRGMzIgKGdyYW50ZWQgYnkgdGhlIGlucHV0IGRlY29kZXJzKVxuICogICAgICAgYW5kIHVzZSB0aGlzIGZhc3RlciB2ZXJzaW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGcm9tQ29kZVBvaW50KGNvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVQb2ludCAlIDB4NDAwKSArIDB4REMwMCk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFVURjMyIGNoYXIgY29kZXMgaW50byBKUyBzdHJpbmcuXG4gKiBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgYHN0cmluZ0Zyb21Db2RlUG9pbnRgIGJ1dCBmb3IgbXVsdGlwbGUgY29kZXBvaW50c1xuICogaW4gYSBsb29wICh3aGljaCBpcyBhIGxvdCBmYXN0ZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXRmMzJUb1N0cmluZyhkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciA9IDAsIGVuZDogbnVtYmVyID0gZGF0YS5sZW5ndGgpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgbGV0IGNvZGVwb2ludCA9IGRhdGFbaV07XG4gICAgaWYgKGNvZGVwb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gSlMgc3RyaW5ncyBhcmUgZW5jb2RlZCBhcyBVVEYxNiwgdGh1cyBhIG5vbiBCTVAgY29kZXBvaW50IGdldHMgY29udmVydGVkIGludG8gYSBzdXJyb2dhdGVcbiAgICAgIC8vIHBhaXIgY29udmVyc2lvbiBydWxlczpcbiAgICAgIC8vICAtIHN1YnRyYWN0IDB4MTAwMDAgZnJvbSBjb2RlIHBvaW50LCBsZWF2aW5nIGEgMjAgYml0IG51bWJlclxuICAgICAgLy8gIC0gYWRkIGhpZ2ggMTAgYml0cyB0byAweEQ4MDAgIC0tPiBmaXJzdCBzdXJyb2dhdGVcbiAgICAgIC8vICAtIGFkZCBsb3cgMTAgYml0cyB0byAweERDMDAgICAtLT4gc2Vjb25kIHN1cnJvZ2F0ZVxuICAgICAgY29kZXBvaW50IC09IDB4MTAwMDA7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZXBvaW50ID4+IDEwKSArIDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlcG9pbnQgJSAweDQwMCkgKyAweERDMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlcG9pbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZ1RvVXRmMzIgLSBkZWNvZGVzIFVURjE2IHNlcXVlbmNlcyBpbnRvIFVURjMyIGNvZGVwb2ludHMuXG4gKiBUbyBrZWVwIHRoZSBkZWNvZGVyIGluIGxpbmUgd2l0aCBKUyBzdHJpbmdzIGl0IGhhbmRsZXMgc2luZ2xlIHN1cnJvZ2F0ZXMgYXMgVUNTMi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1RvVXRmMzIge1xuICBwcml2YXRlIF9pbnRlcmltOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgaW50ZXJpbSBhbmQgcmVzZXRzIGRlY29kZXIgdG8gY2xlYW4gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5faW50ZXJpbSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIEpTIHN0cmluZyB0byBVVEYzMiBjb2RlcG9pbnRzLlxuICAgKiBUaGUgbWV0aG9kcyBhc3N1bWVzIHN0cmVhbSBpbnB1dCBhbmQgd2lsbCBzdG9yZSBwYXJ0bHkgdHJhbnNtaXR0ZWRcbiAgICogc3Vycm9nYXRlIHBhaXJzIGFuZCBkZWNvZGUgdGhlbSB3aXRoIHRoZSBuZXh0IGRhdGEgY2h1bmsuXG4gICAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBubyBib3VuZCBjaGVja3MgZm9yIHRhcmdldCwgdGhlcmVmb3JlIG1ha2Ugc3VyZVxuICAgKiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YSBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYHRhcmdldGAuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlKGlucHV0OiBzdHJpbmcsIHRhcmdldDogVWludDMyQXJyYXkpOiBudW1iZXIge1xuICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHN0YXJ0UG9zID0gMDtcblxuICAgIC8vIGhhbmRsZSBsZWZ0b3ZlciBzdXJyb2dhdGUgaGlnaFxuICAgIGlmICh0aGlzLl9pbnRlcmltKSB7XG4gICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KHN0YXJ0UG9zKyspO1xuICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9ICh0aGlzLl9pbnRlcmltIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IChVU0MyIGhhbmRsaW5nKVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHRoaXMuX2ludGVyaW07XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gc2Vjb25kO1xuICAgICAgfVxuICAgICAgdGhpcy5faW50ZXJpbSA9IDA7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0UG9zOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgLy8gc3Vycm9nYXRlIHBhaXIgZmlyc3RcbiAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICBpZiAoKytpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2ludGVyaW0gPSBjb2RlO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCAoVVNDMiBoYW5kbGluZylcbiAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGU7XG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBzZWNvbmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gMHhGRUZGKSB7XG4gICAgICAgIC8vIEJPTVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRhcmdldFtzaXplKytdID0gY29kZTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBVdGY4RGVjb2RlciAtIGRlY29kZXMgVVRGOCBieXRlIHNlcXVlbmNlcyBpbnRvIFVURjMyIGNvZGVwb2ludHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVdGY4VG9VdGYzMiB7XG4gIHB1YmxpYyBpbnRlcmltOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG5cbiAgLyoqXG4gICAqIENsZWFycyBpbnRlcmltIGJ5dGVzIGFuZCByZXNldHMgZGVjb2RlciB0byBjbGVhbiBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmludGVyaW0uZmlsbCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIFVURjggYnl0ZSBzZXF1ZW5jZXMgaW4gYGlucHV0YCB0byBVVEYzMiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKiBUaGUgbWV0aG9kcyBhc3N1bWVzIHN0cmVhbSBpbnB1dCBhbmQgd2lsbCBzdG9yZSBwYXJ0bHkgdHJhbnNtaXR0ZWQgYnl0ZXNcbiAgICogYW5kIGRlY29kZSB0aGVtIHdpdGggdGhlIG5leHQgZGF0YSBjaHVuay5cbiAgICogTm90ZTogVGhlIG1ldGhvZCBkb2VzIG5vIGJvdW5kIGNoZWNrcyBmb3IgdGFyZ2V0LCB0aGVyZWZvcmUgbWFrZSBzdXJlXG4gICAqIHRoZSBwcm92aWRlZCBkYXRhIGNodW5rIGRvZXMgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiBgdGFyZ2V0YC5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICovXG4gIHB1YmxpYyBkZWNvZGUoaW5wdXQ6IFVpbnQ4QXJyYXksIHRhcmdldDogVWludDMyQXJyYXkpOiBudW1iZXIge1xuICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IGJ5dGUxOiBudW1iZXI7XG4gICAgbGV0IGJ5dGUyOiBudW1iZXI7XG4gICAgbGV0IGJ5dGUzOiBudW1iZXI7XG4gICAgbGV0IGJ5dGU0OiBudW1iZXI7XG4gICAgbGV0IGNvZGVwb2ludCA9IDA7XG4gICAgbGV0IHN0YXJ0UG9zID0gMDtcblxuICAgIC8vIGhhbmRsZSBsZWZ0b3ZlciBieXRlc1xuICAgIGlmICh0aGlzLmludGVyaW1bMF0pIHtcbiAgICAgIGxldCBkaXNjYXJkSW50ZXJpbSA9IGZhbHNlO1xuICAgICAgbGV0IGNwID0gdGhpcy5pbnRlcmltWzBdO1xuICAgICAgY3AgJj0gKCgoKGNwICYgMHhFMCkgPT09IDB4QzApKSA/IDB4MUYgOiAoKChjcCAmIDB4RjApID09PSAweEUwKSkgPyAweDBGIDogMHgwNyk7XG4gICAgICBsZXQgcG9zID0gMDtcbiAgICAgIGxldCB0bXA6IG51bWJlcjtcbiAgICAgIHdoaWxlICgodG1wID0gdGhpcy5pbnRlcmltWysrcG9zXSAmIDB4M0YpICYmIHBvcyA8IDQpIHtcbiAgICAgICAgY3AgPDw9IDY7XG4gICAgICAgIGNwIHw9IHRtcDtcbiAgICAgIH1cbiAgICAgIC8vIG1pc3NpbmcgYnl0ZXMgLSByZWFkIGFoZWFkIGZyb20gaW5wdXRcbiAgICAgIGNvbnN0IHR5cGUgPSAoKCh0aGlzLmludGVyaW1bMF0gJiAweEUwKSA9PT0gMHhDMCkpID8gMiA6ICgoKHRoaXMuaW50ZXJpbVswXSAmIDB4RjApID09PSAweEUwKSkgPyAzIDogNDtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSB0eXBlIC0gcG9zO1xuICAgICAgd2hpbGUgKHN0YXJ0UG9zIDwgbWlzc2luZykge1xuICAgICAgICBpZiAoc3RhcnRQb3MgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdG1wID0gaW5wdXRbc3RhcnRQb3MrK107XG4gICAgICAgIGlmICgodG1wICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb24sIGRpc2NhcmQgaW50ZXJpbSBieXRlcyBjb21wbGV0ZWx5XG4gICAgICAgICAgc3RhcnRQb3MtLTtcbiAgICAgICAgICBkaXNjYXJkSW50ZXJpbSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbmVlZCB0byBzYXZlIHNvIHdlIGNhbiBjb250aW51ZSBzaG9ydCBpbnB1dHMgaW4gbmV4dCBjYWxsXG4gICAgICAgICAgdGhpcy5pbnRlcmltW3BvcysrXSA9IHRtcDtcbiAgICAgICAgICBjcCA8PD0gNjtcbiAgICAgICAgICBjcCB8PSB0bXAgJiAweDNGO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWRpc2NhcmRJbnRlcmltKSB7XG4gICAgICAgIC8vIGZpbmFsIHRlc3QgaXMgdHlwZSBkZXBlbmRlbnRcbiAgICAgICAgaWYgKHR5cGUgPT09IDIpIHtcbiAgICAgICAgICBpZiAoY3AgPCAweDgwKSB7XG4gICAgICAgICAgICAvLyB3cm9uZyBzdGFydGVyIGJ5dGVcbiAgICAgICAgICAgIHN0YXJ0UG9zLS07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgICAgICBpZiAoY3AgPCAweDA4MDAgfHwgKGNwID49IDB4RDgwMCAmJiBjcCA8PSAweERGRkYpIHx8IGNwID09PSAweEZFRkYpIHtcbiAgICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IG9yIEJPTVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY3AgPCAweDAxMDAwMCB8fCBjcCA+IDB4MTBGRkZGKSB7XG4gICAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pbnRlcmltLmZpbGwoMCk7XG4gICAgfVxuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGlucHV0XG4gICAgY29uc3QgZm91clN0b3AgPSBsZW5ndGggLSA0O1xuICAgIGxldCBpID0gc3RhcnRQb3M7XG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQVNDSUkgc2hvcnRjdXQgd2l0aCBsb29wIHVucm9sbGVkIHRvIDQgY29uc2VjdXRpdmUgQVNDSUkgY2hhcnMuXG4gICAgICAgKiBUaGlzIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGdhaW4gZm9yIEFTQ0lJXG4gICAgICAgKiBhbmQgcGVuYWx0eSBmb3Igbm9uIEFTQ0lJOlxuICAgICAgICogRm9yIGJlc3QgQVNDSUkgcGVyZm9ybWFuY2UgdGhlIGNoYXIgc2hvdWxkIGJlIHN0b3JlZCBkaXJlY3RseSBpbnRvIHRhcmdldCxcbiAgICAgICAqIGJ1dCBldmVuIGEgc2luZ2xlIGF0dGVtcHQgdG8gd3JpdGUgdG8gdGFyZ2V0IGFuZCBjb21wYXJlIGFmdGVyd2FyZHNcbiAgICAgICAqIHBlbmFsaXplcyBub24gQVNDSUkgcmVhbGx5IGJhZCAoLTUwJSksIHRodXMgd2UgbG9hZCB0aGUgY2hhciBpbnRvIGJ5dGVYIGZpcnN0LFxuICAgICAgICogd2hpY2ggcmVkdWNlcyBBU0NJSSBwZXJmb3JtYW5jZSBieSB+MTUlLlxuICAgICAgICogVGhpcyB0cmlhbCBmb3IgQVNDSUkgcmVkdWNlcyBub24gQVNDSUkgcGVyZm9ybWFuY2UgYnkgfjEwJSB3aGljaCBzZWVtcyBhY2NlcHRpYmxlXG4gICAgICAgKiBjb21wYXJlZCB0byB0aGUgZ2FpbnMuXG4gICAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcHRpbWl6YXRpb24gb25seSB0YWtlcyBwbGFjZSBmb3IgNCBjb25zZWN1dGl2ZSBBU0NJSSBjaGFycyxcbiAgICAgICAqIGZvciBhbnkgc2hvcnRlciBpdCBiYWlscyBvdXQuIFdvcnN0IGNhc2UgLSBhbGwgNCBieXRlcyBiZWluZyByZWFkIGJ1dFxuICAgICAgICogdGhyb3duIGF3YXkgZHVlIHRvIHRoZSBsYXN0IGJlaW5nIGEgbm9uIEFTQ0lJIGNoYXIgKC0xMCUgcGVyZm9ybWFuY2UpLlxuICAgICAgICovXG4gICAgICB3aGlsZSAoaSA8IGZvdXJTdG9wXG4gICAgICAgICYmICEoKGJ5dGUxID0gaW5wdXRbaV0pICYgMHg4MClcbiAgICAgICAgJiYgISgoYnl0ZTIgPSBpbnB1dFtpICsgMV0pICYgMHg4MClcbiAgICAgICAgJiYgISgoYnl0ZTMgPSBpbnB1dFtpICsgMl0pICYgMHg4MClcbiAgICAgICAgJiYgISgoYnl0ZTQgPSBpbnB1dFtpICsgM10pICYgMHg4MCkpXG4gICAgICB7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTE7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTI7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTM7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTQ7XG4gICAgICAgIGkgKz0gNDtcbiAgICAgIH1cblxuICAgICAgLy8gcmVyZWFkIGJ5dGUxXG4gICAgICBieXRlMSA9IGlucHV0W2krK107XG5cbiAgICAgIC8vIDEgYnl0ZVxuICAgICAgaWYgKGJ5dGUxIDwgMHg4MCkge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUxO1xuXG4gICAgICAgIC8vIDIgYnl0ZXNcbiAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhFMCkgPT09IDB4QzApIHtcbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTIgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUyICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50ID0gKGJ5dGUxICYgMHgxRikgPDwgNiB8IChieXRlMiAmIDB4M0YpO1xuICAgICAgICBpZiAoY29kZXBvaW50IDwgMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIHN0YXJ0ZXIgYnl0ZVxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcblxuICAgICAgICAvLyAzIGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RjApID09PSAweEUwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMyAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MEYpIDw8IDEyIHwgKGJ5dGUyICYgMHgzRikgPDwgNiB8IChieXRlMyAmIDB4M0YpO1xuICAgICAgICBpZiAoY29kZXBvaW50IDwgMHgwODAwIHx8IChjb2RlcG9pbnQgPj0gMHhEODAwICYmIGNvZGVwb2ludCA8PSAweERGRkYpIHx8IGNvZGVwb2ludCA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgb3IgQk9NLCBubyBpLS0gaGVyZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuXG4gICAgICAgIC8vIDQgYnl0ZXNcbiAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhGOCkgPT09IDB4RjApIHtcbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTIgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUyICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzFdID0gYnl0ZTI7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTMgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUzICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzFdID0gYnl0ZTI7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzJdID0gYnl0ZTM7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTQgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGU0ICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50ID0gKGJ5dGUxICYgMHgwNykgPDwgMTggfCAoYnl0ZTIgJiAweDNGKSA8PCAxMiB8IChieXRlMyAmIDB4M0YpIDw8IDYgfCAoYnl0ZTQgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MDEwMDAwIHx8IGNvZGVwb2ludCA+IDB4MTBGRkZGKSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQsIG5vIGktLSBoZXJlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbGxlZ2FsIGJ5dGUsIGp1c3Qgc2tpcFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBMb2dMZXZlbEVudW0gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG50eXBlIExvZ1R5cGUgPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgSUNvbnNvbGUge1xuICBsb2c6IExvZ1R5cGU7XG4gIGVycm9yOiBMb2dUeXBlO1xuICBpbmZvOiBMb2dUeXBlO1xuICB0cmFjZTogTG9nVHlwZTtcbiAgd2FybjogTG9nVHlwZTtcbn1cblxuLy8gY29uc29sZSBpcyBhdmFpbGFibGUgb24gYm90aCBub2RlLmpzIGFuZCBicm93c2VyIGNvbnRleHRzIGJ1dCB0aGUgY29tbW9uXG4vLyBtb2R1bGUgZG9lc24ndCBkZXBlbmQgb24gdGhlbSBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgZGVjbGFyZSBpdC5cbmRlY2xhcmUgY29uc3QgY29uc29sZTogSUNvbnNvbGU7XG5cbmNvbnN0IG9wdGlvbnNLZXlUb0xvZ0xldmVsOiB7IFtrZXk6IHN0cmluZ106IExvZ0xldmVsRW51bSB9ID0ge1xuICB0cmFjZTogTG9nTGV2ZWxFbnVtLlRSQUNFLFxuICBkZWJ1ZzogTG9nTGV2ZWxFbnVtLkRFQlVHLFxuICBpbmZvOiBMb2dMZXZlbEVudW0uSU5GTyxcbiAgd2FybjogTG9nTGV2ZWxFbnVtLldBUk4sXG4gIGVycm9yOiBMb2dMZXZlbEVudW0uRVJST1IsXG4gIG9mZjogTG9nTGV2ZWxFbnVtLk9GRlxufTtcblxuY29uc3QgTE9HX1BSRUZJWCA9ICd4dGVybS5qczogJztcblxuZXhwb3J0IGNsYXNzIExvZ1NlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUxvZ1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbG9nTGV2ZWw6IExvZ0xldmVsRW51bSA9IExvZ0xldmVsRW51bS5PRkY7XG4gIHB1YmxpYyBnZXQgbG9nTGV2ZWwoKTogTG9nTGV2ZWxFbnVtIHsgcmV0dXJuIHRoaXMuX2xvZ0xldmVsOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ2xvZ0xldmVsJywgKCkgPT4gdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKSkpO1xuXG4gICAgLy8gRm9yIHRyYWNlIGxvZ2dpbmcsIGFzc3VtZSB0aGUgbGF0ZXN0IGNyZWF0ZWQgbG9nIHNlcnZpY2UgaXMgdmFsaWRcbiAgICB0cmFjZUxvZ2dlciA9IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVMb2dMZXZlbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dMZXZlbCA9IG9wdGlvbnNLZXlUb0xvZ0xldmVsW3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubG9nTGV2ZWxdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXZhbExhenlPcHRpb25hbFBhcmFtcyhvcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbmFsUGFyYW1zW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbmFsUGFyYW1zW2ldID0gb3B0aW9uYWxQYXJhbXNbaV0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2codHlwZTogTG9nVHlwZSwgbWVzc2FnZTogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zKG9wdGlvbmFsUGFyYW1zKTtcbiAgICB0eXBlLmNhbGwoY29uc29sZSwgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyID8gJycgOiBMT0dfUFJFRklYKSArIG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uVFJBQ0UpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8udHJhY2UuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5sb2csIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLkRFQlVHKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmRlYnVnLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUubG9nLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLklORk8pIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uaW5mby5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmluZm8sIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uV0FSTikge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy53YXJuLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUud2FybiwgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uRVJST1IpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZXJyb3IuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5lcnJvciwgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgdHJhY2VMb2dnZXI6IElMb2dTZXJ2aWNlO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRyYWNlTG9nZ2VyKGxvZ2dlcjogSUxvZ1NlcnZpY2UpOiB2b2lkIHtcbiAgdHJhY2VMb2dnZXIgPSBsb2dnZXI7XG59XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGxvZyB0cmFjZSBjYWxscyB0byB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2VDYWxsKF90YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IGFueSk6IGFueSB7XG4gIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCcpO1xuICB9XG4gIGNvbnN0IGZuS2V5ID0gJ3ZhbHVlJztcbiAgY29uc3QgZm4gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICBkZXNjcmlwdG9yW2ZuS2V5XSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIC8vIEVhcmx5IGV4aXRcbiAgICBpZiAodHJhY2VMb2dnZXIubG9nTGV2ZWwgIT09IExvZ0xldmVsRW51bS5UUkFDRSkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cblxuICAgIHRyYWNlTG9nZ2VyLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7Zm4ubmFtZX0oJHthcmdzLm1hcChlID0+IEpTT04uc3RyaW5naWZ5KGUpKS5qb2luKCcsICcpfSlgKTtcbiAgICBjb25zdCByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB0cmFjZUxvZ2dlci50cmFjZShgR2x5cGhSZW5kZXJlciMke2ZuLm5hbWV9IHJldHVybmAsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogVGhpcyB3YXMgaGVhdmlseSBpbnNwaXJlZCBmcm9tIG1pY3Jvc29mdC92c2NvZGUncyBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0gKE1JVCkuXG4gKi9cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJU2VydmljZUlkZW50aWZpZXIgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBESV9UQVJHRVQgPSAnZGkkdGFyZ2V0JztcbmNvbnN0IERJX0RFUEVOREVOQ0lFUyA9ICdkaSRkZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY29uc3Qgc2VydmljZVJlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBJU2VydmljZUlkZW50aWZpZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzKGN0b3I6IGFueSk6IHsgaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+LCBpbmRleDogbnVtYmVyLCBvcHRpb25hbDogYm9vbGVhbiB9W10ge1xuICByZXR1cm4gY3RvcltESV9ERVBFTkRFTkNJRVNdIHx8IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVjb3JhdG9yPFQ+KGlkOiBzdHJpbmcpOiBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICBpZiAoc2VydmljZVJlZ2lzdHJ5LmhhcyhpZCkpIHtcbiAgICByZXR1cm4gc2VydmljZVJlZ2lzdHJ5LmdldChpZCkhO1xuICB9XG5cbiAgY29uc3QgZGVjb3JhdG9yOiBhbnkgPSBmdW5jdGlvbiAodGFyZ2V0OiBGdW5jdGlvbiwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BJU2VydmljZU5hbWUtZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVjb3JhdGUgYSBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGRlY29yYXRvciwgdGFyZ2V0LCBpbmRleCk7XG4gIH07XG5cbiAgZGVjb3JhdG9yLnRvU3RyaW5nID0gKCkgPT4gaWQ7XG5cbiAgc2VydmljZVJlZ2lzdHJ5LnNldChpZCwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cblxuZnVuY3Rpb24gc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZDogRnVuY3Rpb24sIHRhcmdldDogRnVuY3Rpb24sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID09PSB0YXJnZXQpIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXS5wdXNoKHsgaWQsIGluZGV4IH0pO1xuICB9IGVsc2Uge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdID0gW3sgaWQsIGluZGV4IH1dO1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID0gdGFyZ2V0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElFdmVudCwgSUV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSUJ1ZmZlciwgSUJ1ZmZlclNldCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSURlY1ByaXZhdGVNb2RlcywgSUNvcmVNb3VzZUV2ZW50LCBDb3JlTW91c2VFbmNvZGluZywgSUNvcmVNb3VzZVByb3RvY29sLCBDb3JlTW91c2VFdmVudFR5cGUsIElDaGFyc2V0LCBJV2luZG93T3B0aW9ucywgSU1vZGVzLCBJQXR0cmlidXRlRGF0YSwgU2Nyb2xsU291cmNlLCBJRGlzcG9zYWJsZSwgSUNvbG9yLCBDdXJzb3JTdHlsZSwgQ3Vyc29ySW5hY3RpdmVTdHlsZSwgSU9zY0xpbmtEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZURlY29yYXRvciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgSURlY29yYXRpb25PcHRpb25zLCBJRGVjb3JhdGlvbiwgSUxpbmtIYW5kbGVyLCBJV2luZG93c1B0eSwgSUxvZ2dlciB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmV4cG9ydCBjb25zdCBJQnVmZmVyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQnVmZmVyU2VydmljZT4oJ0J1ZmZlclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1ZmZlclNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBjb2xzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnVmZmVyOiBJQnVmZmVyO1xuICByZWFkb25seSBidWZmZXJzOiBJQnVmZmVyU2V0O1xuICBpc1VzZXJTY3JvbGxpbmc6IGJvb2xlYW47XG4gIG9uUmVzaXplOiBJRXZlbnQ8eyBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlciB9PjtcbiAgb25TY3JvbGw6IElFdmVudDxudW1iZXI+O1xuICBzY3JvbGwoZXJhc2VBdHRyOiBJQXR0cmlidXRlRGF0YSwgaXNXcmFwcGVkPzogYm9vbGVhbik6IHZvaWQ7XG4gIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudD86IGJvb2xlYW4sIHNvdXJjZT86IFNjcm9sbFNvdXJjZSk6IHZvaWQ7XG4gIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZU1vdXNlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZU1vdXNlU2VydmljZT4oJ0NvcmVNb3VzZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVNb3VzZVNlcnZpY2Uge1xuICBhY3RpdmVQcm90b2NvbDogc3RyaW5nO1xuICBhY3RpdmVFbmNvZGluZzogc3RyaW5nO1xuICBhcmVNb3VzZUV2ZW50c0FjdGl2ZTogYm9vbGVhbjtcbiAgYWRkUHJvdG9jb2wobmFtZTogc3RyaW5nLCBwcm90b2NvbDogSUNvcmVNb3VzZVByb3RvY29sKTogdm9pZDtcbiAgYWRkRW5jb2RpbmcobmFtZTogc3RyaW5nLCBlbmNvZGluZzogQ29yZU1vdXNlRW5jb2RpbmcpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG1vdXNlIGV2ZW50IHRvIGJlIHNlbnQuXG4gICAqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgcGFzc2VkIGFsbCBwcm90b2NvbCByZXN0cmljdGlvbnMgYW5kIGEgcmVwb3J0XG4gICAqIHdhcyBzZW50LCBvdGhlcndpc2UgZmFsc2UuIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXJcbiAgICogdGhlIGRlZmF1bHQgZXZlbnQgYWN0aW9uIGluIHRoZSBib3dzZXIgY29tcG9uZW50IHNob3VsZCBiZSBvbWl0dGVkLlxuICAgKlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIHdpbGwgY2hhbmdlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gZXZlbnQgb2JqZWN0XG4gICAqIHRvIGZ1bGxmaWxsIHByb3RvY29sIGFuZCBlbmNvZGluZyByZXN0cmljdGlvbnMuXG4gICAqL1xuICB0cmlnZ2VyTW91c2VFdmVudChldmVudDogSUNvcmVNb3VzZUV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXZlbnQgdG8gYW5ub3VuY2UgY2hhbmdlcyBpbiBtb3VzZSB0cmFja2luZy5cbiAgICovXG4gIG9uUHJvdG9jb2xDaGFuZ2U6IElFdmVudDxDb3JlTW91c2VFdmVudFR5cGU+O1xuXG4gIC8qKlxuICAgKiBIdW1hbiByZWFkYWJsZSB2ZXJzaW9uIG9mIG1vdXNlIGV2ZW50cy5cbiAgICovXG4gIGV4cGxhaW5FdmVudHMoZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUpOiB7IFtldmVudDogc3RyaW5nXTogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlU2VydmljZT4oJ0NvcmVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsbHkgdGhlIGN1cnNvciB3aWxsIG5vdCBiZSB2aXNpYmxlIHVudGlsIHRoZSBmaXJzdCB0aW1lIHRoZSB0ZXJtaW5hbFxuICAgKiBpcyBmb2N1c2VkLlxuICAgKi9cbiAgaXNDdXJzb3JJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgaXNDdXJzb3JIaWRkZW46IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgbW9kZXM6IElNb2RlcztcbiAgcmVhZG9ubHkgZGVjUHJpdmF0ZU1vZGVzOiBJRGVjUHJpdmF0ZU1vZGVzO1xuXG4gIHJlYWRvbmx5IG9uRGF0YTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uVXNlcklucHV0OiBJRXZlbnQ8dm9pZD47XG4gIHJlYWRvbmx5IG9uQmluYXJ5OiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b206IElFdmVudDx2b2lkPjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25EYXRhIGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqIEBwYXJhbSB3YXNVc2VySW5wdXQgV2hldGhlciB0aGUgZGF0YSBvcmlnaW5hdGVkIGZyb20gdGhlIHVzZXIgKGFzIG9wcG9zZWQgdG9cbiAgICogcmVzdWx0aW5nIGZyb20gcGFyc2luZyBpbmNvbWluZyBkYXRhKS4gV2hlbiB0cnVlIHRoaXMgd2lsbCBhbHNvOlxuICAgKiAtIFNjcm9sbCB0byB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIgaWYgb3B0aW9uIHNjcm9sbE9uVXNlcklucHV0IGlzIHRydWUuXG4gICAqIC0gRmlyZSB0aGUgYG9uVXNlcklucHV0YCBldmVudCAoc28gc2VsZWN0aW9uIGNhbiBiZSBjbGVhcmVkKS5cbiAgICovXG4gIHRyaWdnZXJEYXRhRXZlbnQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ/OiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uQmluYXJ5IGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqL1xuICB0cmlnZ2VyQmluYXJ5RXZlbnQoZGF0YTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDaGFyc2V0U2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ2hhcnNldFNlcnZpY2U+KCdDaGFyc2V0U2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhcnNldFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZ2xldmVsOiBudW1iZXI7XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICovXG4gIHNldGdMZXZlbChnOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNoYXJzZXQgZm9yIHRoZSBnaXZlbiBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICogQHBhcmFtIGNoYXJzZXRcbiAgICovXG4gIHNldGdDaGFyc2V0KGc6IG51bWJlciwgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gICguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJyYW5kZWRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG59XG5cbnR5cGUgR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRBcmdzIGV4dGVuZHMgYW55W10+ID0gVEFyZ3MgZXh0ZW5kcyBbXSA/IFtdXG4gIDogVEFyZ3MgZXh0ZW5kcyBbLi4uaW5mZXIgVEZpcnN0LCBpbmZlciBUTGFzdF0gPyBUTGFzdCBleHRlbmRzIElCcmFuZGVkU2VydmljZSA/IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxURmlyc3Q+IDogVEFyZ3NcbiAgICA6IG5ldmVyO1xuXG5leHBvcnQgY29uc3QgSUluc3RhbnRpYXRpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElJbnN0YW50aWF0aW9uU2VydmljZT4oJ0luc3RhbnRpYXRpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHNldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiwgaW5zdGFuY2U6IFQpOiB2b2lkO1xuICBnZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4pOiBUIHwgdW5kZWZpbmVkO1xuICBjcmVhdGVJbnN0YW5jZTxDdG9yIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBSIGV4dGVuZHMgSW5zdGFuY2VUeXBlPEN0b3I+Pih0OiBDdG9yLCAuLi5hcmdzOiBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8Q29uc3RydWN0b3JQYXJhbWV0ZXJzPEN0b3I+Pik6IFI7XG59XG5cbmV4cG9ydCBlbnVtIExvZ0xldmVsRW51bSB7XG4gIFRSQUNFID0gMCxcbiAgREVCVUcgPSAxLFxuICBJTkZPID0gMixcbiAgV0FSTiA9IDMsXG4gIEVSUk9SID0gNCxcbiAgT0ZGID0gNVxufVxuXG5leHBvcnQgY29uc3QgSUxvZ1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUxvZ1NlcnZpY2U+KCdMb2dTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElMb2dTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgbG9nTGV2ZWw6IExvZ0xldmVsRW51bTtcblxuICB0cmFjZShtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgaW5mbyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJT3B0aW9uc1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU9wdGlvbnNTZXJ2aWNlPignT3B0aW9uc1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbnNTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlYWQgb25seSBhY2Nlc3MgdG8gdGhlIHJhdyBvcHRpb25zIG9iamVjdCwgdGhpcyBpcyBhbiBpbnRlcm5hbC1vbmx5IGZhc3QgcGF0aCBmb3IgYWNjZXNzaW5nXG4gICAqIHNpbmdsZSBvcHRpb25zIHdpdGhvdXQgYW55IHZhbGlkYXRpb24gYXMgd2UgdHJ1c3QgVHlwZVNjcmlwdCB0byBlbmZvcmNlIGNvcnJlY3QgdXNhZ2VcbiAgICogaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IHJhd09wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGFzIGV4cG9zZWQgdGhyb3VnaCB0aGUgcHVibGljIEFQSSwgdGhpcyBwcm9wZXJ0eSB1c2VzIGdldHRlcnMgYW5kIHNldHRlcnMgd2l0aFxuICAgKiB2YWxpZGF0aW9uIHdoaWNoIG1ha2VzIGl0IHNhZmVyIGJ1dCBzbG93ZXIuIHtAbGluayByYXdPcHRpb25zfSBzaG91bGQgYmUgdXNlZCBmb3IgcHJldHR5IG11Y2hcbiAgICogYWxsIGludGVybmFsIHVzYWdlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYW55IG9wdGlvbiBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgb25PcHRpb25DaGFuZ2U6IElFdmVudDxrZXlvZiBJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNwZWNpZmljIG9wdGlvbiBjaGFuZ2VzLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaXNcbiAgICogcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG9ubHkgYSBzaW5nbGUgb3B0aW9uIGlzIGJlaW5nIGxpc3RlbmVkIHRvLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvblNwZWNpZmljT3B0aW9uQ2hhbmdlPFQgZXh0ZW5kcyBrZXlvZiBJVGVybWluYWxPcHRpb25zPihrZXk6IFQsIGxpc3RlbmVyOiAoYXJnMTogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz5bVF0pID0+IGFueSk6IElEaXNwb3NhYmxlO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc2V0IG9mIHNwZWNpZmljIG9wdGlvbnMgY2hhbmdlLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kXG4gICAqIHRoYXQgaXMgcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG11bHRpcGxlIG9wdGlvbnMgYXJlIGJlaW5nIGxpc3RlbmVkIHRvIGFuZFxuICAgKiBoYW5kbGVkIHRoZSBzYW1lIHdheS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25NdWx0aXBsZU9wdGlvbkNoYW5nZShrZXlzOiAoa2V5b2YgSVRlcm1pbmFsT3B0aW9ucylbXSwgbGlzdGVuZXI6ICgpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0ID0gJ25vcm1hbCcgfCAnYm9sZCcgfCAnMTAwJyB8ICcyMDAnIHwgJzMwMCcgfCAnNDAwJyB8ICc1MDAnIHwgJzYwMCcgfCAnNzAwJyB8ICc4MDAnIHwgJzkwMCcgfCBudW1iZXI7XG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdvZmYnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUZXJtaW5hbE9wdGlvbnMge1xuICBhbGxvd1Byb3Bvc2VkQXBpPzogYm9vbGVhbjtcbiAgYWxsb3dUcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuICBhbHRDbGlja01vdmVzQ3Vyc29yPzogYm9vbGVhbjtcbiAgY29scz86IG51bWJlcjtcbiAgY29udmVydEVvbD86IGJvb2xlYW47XG4gIGN1cnNvckJsaW5rPzogYm9vbGVhbjtcbiAgY3Vyc29yU3R5bGU/OiBDdXJzb3JTdHlsZTtcbiAgY3Vyc29yV2lkdGg/OiBudW1iZXI7XG4gIGN1cnNvckluYWN0aXZlU3R5bGU/OiBDdXJzb3JJbmFjdGl2ZVN0eWxlO1xuICBjdXN0b21HbHlwaHM/OiBib29sZWFuO1xuICBkaXNhYmxlU3RkaW4/OiBib29sZWFuO1xuICBkb2N1bWVudE92ZXJyaWRlPzogYW55IHwgbnVsbDtcbiAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM/OiBib29sZWFuO1xuICBmYXN0U2Nyb2xsTW9kaWZpZXI/OiAnbm9uZScgfCAnYWx0JyB8ICdjdHJsJyB8ICdzaGlmdCc7XG4gIGZhc3RTY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgZm9udFNpemU/OiBudW1iZXI7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGZvbnRXZWlnaHQ/OiBGb250V2VpZ2h0O1xuICBmb250V2VpZ2h0Qm9sZD86IEZvbnRXZWlnaHQ7XG4gIGlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZT86IGJvb2xlYW47XG4gIGxldHRlclNwYWNpbmc/OiBudW1iZXI7XG4gIGxpbmVIZWlnaHQ/OiBudW1iZXI7XG4gIGxpbmtIYW5kbGVyPzogSUxpbmtIYW5kbGVyIHwgbnVsbDtcbiAgbG9nTGV2ZWw/OiBMb2dMZXZlbDtcbiAgbG9nZ2VyPzogSUxvZ2dlciB8IG51bGw7XG4gIG1hY09wdGlvbklzTWV0YT86IGJvb2xlYW47XG4gIG1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgbWluaW11bUNvbnRyYXN0UmF0aW8/OiBudW1iZXI7XG4gIHJpZ2h0Q2xpY2tTZWxlY3RzV29yZD86IGJvb2xlYW47XG4gIHJvd3M/OiBudW1iZXI7XG4gIHNjcmVlblJlYWRlck1vZGU/OiBib29sZWFuO1xuICBzY3JvbGxiYWNrPzogbnVtYmVyO1xuICBzY3JvbGxPblVzZXJJbnB1dD86IGJvb2xlYW47XG4gIHNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBzbW9vdGhTY3JvbGxEdXJhdGlvbj86IG51bWJlcjtcbiAgdGFiU3RvcFdpZHRoPzogbnVtYmVyO1xuICB0aGVtZT86IElUaGVtZTtcbiAgd2luZG93c01vZGU/OiBib29sZWFuO1xuICB3aW5kb3dzUHR5PzogSVdpbmRvd3NQdHk7XG4gIHdpbmRvd09wdGlvbnM/OiBJV2luZG93T3B0aW9ucztcbiAgd29yZFNlcGFyYXRvcj86IHN0cmluZztcbiAgb3ZlcnZpZXdSdWxlcldpZHRoPzogbnVtYmVyO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgY2FuY2VsRXZlbnRzOiBib29sZWFuO1xuICB0ZXJtTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUaGVtZSB7XG4gIGZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIGJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgY3Vyc29yQWNjZW50Pzogc3RyaW5nO1xuICBzZWxlY3Rpb25Gb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25CYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGJsYWNrPzogc3RyaW5nO1xuICByZWQ/OiBzdHJpbmc7XG4gIGdyZWVuPzogc3RyaW5nO1xuICB5ZWxsb3c/OiBzdHJpbmc7XG4gIGJsdWU/OiBzdHJpbmc7XG4gIG1hZ2VudGE/OiBzdHJpbmc7XG4gIGN5YW4/OiBzdHJpbmc7XG4gIHdoaXRlPzogc3RyaW5nO1xuICBicmlnaHRCbGFjaz86IHN0cmluZztcbiAgYnJpZ2h0UmVkPzogc3RyaW5nO1xuICBicmlnaHRHcmVlbj86IHN0cmluZztcbiAgYnJpZ2h0WWVsbG93Pzogc3RyaW5nO1xuICBicmlnaHRCbHVlPzogc3RyaW5nO1xuICBicmlnaHRNYWdlbnRhPzogc3RyaW5nO1xuICBicmlnaHRDeWFuPzogc3RyaW5nO1xuICBicmlnaHRXaGl0ZT86IHN0cmluZztcbiAgZXh0ZW5kZWRBbnNpPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBJT3NjTGlua1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU9zY0xpbmtTZXJ2aWNlPignT3NjTGlua1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU9zY0xpbmtTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBsaW5rIHRvIHRoZSBzZXJ2aWNlLCByZXR1cm5pbmcgdGhlIGxpbmsgSUQuIFRoZSBsaW5rIGRhdGEgaXMgbWFuYWdlZCBieSB0aGlzXG4gICAqIHNlcnZpY2UgYW5kIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGlzIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGlzIHRyaW1tZWQgb2ZmIHRoZSBidWZmZXIuXG4gICAqL1xuICByZWdpc3RlckxpbmsobGlua0RhdGE6IElPc2NMaW5rRGF0YSk6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFkZHMgYSBsaW5lIHRvIGEgbGluayBpZiBuZWVkZWQuXG4gICAqL1xuICBhZGRMaW5lVG9MaW5rKGxpbmtJZDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkO1xuICAvKiogR2V0IHRoZSBsaW5rIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbGluayBJRC4gKi9cbiAgZ2V0TGlua0RhdGEobGlua0lkOiBudW1iZXIpOiBJT3NjTGlua0RhdGEgfCB1bmRlZmluZWQ7XG59XG5cbi8qXG4gKiBXaWR0aCBhbmQgR3JhcGhlbWVfQ2x1c3Rlcl9CcmVhayBwcm9wZXJ0aWVzIG9mIGEgY2hhcmFjdGVyIGFzIGEgYml0IG1hc2suXG4gKlxuICogYml0IDA6IHNob3VsZEpvaW4gLSBzaG91bGQgY29tYmluZSB3aXRoIHByZWNlZGluZyBjaGFyYWN0ZXIuXG4gKiBiaXQgMS4uMjogd2N3aWR0aCAtIHNlZSBVbmljb2RlQ2hhcldpZHRoLlxuICogYml0IDMuLjMxOiBjbGFzcyBvZiBjaGFyYWN0ZXIgKGN1cnJlbnRseSBvbmx5IDQgYml0cyBhcmUgdXNlZCkuXG4gKiAgIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmVkIGdyYXBoZW1lIGNsdXN0ZXJpbmcgLSBpLmUuIHdoaWNoIGNvZGVwb2ludHNcbiAqICAgYXJlIHRvIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgY29tcG91bmQgY2hhcmFjdGVyLlxuICpcbiAqIFVzZSB0aGUgVW5pY29kZVNlcnZpY2Ugc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5VmFsdWUgdG8gY3JlYXRlIGFcbiAqIFVuaWNvZGVDaGFyUHJvcGVydGllczsgdXNlIGV4dHJhY3RTaG91bGRKb2luLCBleHRyYWN0V2lkdGgsIGFuZFxuICogZXh0cmFjdENoYXJLaW5kIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyUHJvcGVydGllcyA9IG51bWJlcjtcblxuLyoqXG4gKiBXaWR0aCBpbiBjb2x1bW5zIG9mIGEgY2hhcmFjdGVyLlxuICogSW4gYSBDSksgY29udGV4dCwgXCJoYWxmLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBMYXRpbikgYXJlIHdpZHRoIDEsXG4gKiB3aGlsZSBcImZ1bGwtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIEthbmppKSBhcmUgMiBjb2x1bW5zIHdpZGUuXG4gKiBDb21iaW5pbmcgY2hhcmFjdGVycyAoc3VjaCBhcyBhY2NlbnRzKSBhcmUgd2lkdGggMC5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJXaWR0aCA9IDAgfCAxIHwgMjtcblxuZXhwb3J0IGNvbnN0IElVbmljb2RlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJVW5pY29kZVNlcnZpY2U+KCdVbmljb2RlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqIFJlZ2lzdGVyIGFuIFVuaWNvZGUgdmVyc2lvbiBwcm92aWRlci4gKi9cbiAgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZDtcbiAgLyoqIFJlZ2lzdGVyZWQgVW5pY29kZSB2ZXJzaW9ucy4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM6IHN0cmluZ1tdO1xuICAvKiogQ3VycmVudGx5IGFjdGl2ZSB2ZXJzaW9uLiAqL1xuICBhY3RpdmVWZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBFdmVudCB0cmlnZ2VyZWQsIHdoZW4gYWN0aXZhdGUgdmVyc2lvbiBjaGFuZ2VkLiAqL1xuICByZWFkb25seSBvbkNoYW5nZTogSUV2ZW50PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFVuaWNvZGUgdmVyc2lvbiBkZXBlbmRlbnRcbiAgICovXG4gIHdjd2lkdGgoY29kZXBvaW50OiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBnZXRTdHJpbmdDZWxsV2lkdGgoczogc3RyaW5nKTogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJuIGNoYXJhY3RlciB3aWR0aCBhbmQgdHlwZSBmb3IgZ3JhcGhlbWUgY2x1c3RlcmluZy5cbiAgICogSWYgcHJlY2VkaW5nICE9IDAsIGl0IGlzIHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXI7XG4gICAqIGluIHRoYXQgY2FzZSB0aGUgcmVzdWx0IHNwZWNpZmllcyBpZiB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgam9pbmVkLlxuICAgKi9cbiAgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlVmVyc2lvblByb3ZpZGVyIHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICB3Y3dpZHRoKHVjczogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY29uc3QgSURlY29yYXRpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElEZWNvcmF0aW9uU2VydmljZT4oJ0RlY29yYXRpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElEZWNvcmF0aW9uU2VydmljZSBleHRlbmRzIElEaXNwb3NhYmxlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGRlY29yYXRpb25zOiBJdGVyYWJsZUl0ZXJhdG9yPElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZWdpc3RlcmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlbW92ZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgLyoqXG4gICAqIFRyaWdnZXIgYSBjYWxsYmFjayBvdmVyIHRoZSBkZWNvcmF0aW9uIGF0IGEgY2VsbCAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuIFRoaXMgdXNlcyBhIGNhbGxiYWNrXG4gICAqIGluc3RlYWQgb2YgYW4gaXRlcmF0b3IgYXMgaXQncyB0eXBpY2FsbHkgdXNlZCBpbiBob3QgY29kZSBwYXRocy5cbiAgICovXG4gIGZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHg6IG51bWJlciwgbGluZTogbnVtYmVyLCBsYXllcjogJ2JvdHRvbScgfCAndG9wJyB8IHVuZGVmaW5lZCwgY2FsbGJhY2s6IChkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKSA9PiB2b2lkKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVybmFsRGVjb3JhdGlvbiBleHRlbmRzIElEZWNvcmF0aW9uIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogSURlY29yYXRpb25PcHRpb25zO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZm9yZWdyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uUmVuZGVyRW1pdHRlcjogSUV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD47XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElUZXJtaW5hbEFkZG9uLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IENhbnZhc0FkZG9uIGFzIElDYW52YXNBcGkgfSBmcm9tICdAeHRlcm0vYWRkb24tY2FudmFzJztcbmltcG9ydCB7IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLCBJQ2hhclNpemVTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSVRlcm1pbmFsIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBzZXRUcmFjZUxvZ2dlciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Mb2dTZXJ2aWNlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElMb2dTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IENhbnZhc1JlbmRlcmVyIH0gZnJvbSAnLi9DYW52YXNSZW5kZXJlcic7XG5cbmV4cG9ydCBjbGFzcyBDYW52YXNBZGRvbiBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElDYW52YXNBcGkge1xuICBwcml2YXRlIF90ZXJtaW5hbD86IFRlcm1pbmFsO1xuICBwcml2YXRlIF9yZW5kZXJlcj86IENhbnZhc1JlbmRlcmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG5cbiAgcHVibGljIGdldCB0ZXh0dXJlQXRsYXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJlcj8udGV4dHVyZUF0bGFzO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIGNvbnN0IGNvcmUgPSAodGVybWluYWwgYXMgYW55KS5fY29yZSBhcyBJVGVybWluYWw7XG4gICAgaWYgKCF0ZXJtaW5hbC5lbGVtZW50KSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyKGNvcmUub25XaWxsT3BlbigoKSA9PiB0aGlzLmFjdGl2YXRlKHRlcm1pbmFsKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Rlcm1pbmFsID0gdGVybWluYWw7XG4gICAgY29uc3QgY29yZVNlcnZpY2UgPSBjb3JlLmNvcmVTZXJ2aWNlO1xuICAgIGNvbnN0IG9wdGlvbnNTZXJ2aWNlID0gY29yZS5vcHRpb25zU2VydmljZTtcbiAgICBjb25zdCBzY3JlZW5FbGVtZW50ID0gY29yZS5zY3JlZW5FbGVtZW50ITtcbiAgICBjb25zdCBsaW5raWZpZXIgPSBjb3JlLmxpbmtpZmllciE7XG5cbiAgICBjb25zdCB1bnNhZmVDb3JlID0gY29yZSBhcyBhbnk7XG4gICAgY29uc3QgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UgPSB1bnNhZmVDb3JlLl9idWZmZXJTZXJ2aWNlO1xuICAgIGNvbnN0IHJlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlID0gdW5zYWZlQ29yZS5fcmVuZGVyU2VydmljZTtcbiAgICBjb25zdCBjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSA9IHVuc2FmZUNvcmUuX2NoYXJhY3RlckpvaW5lclNlcnZpY2U7XG4gICAgY29uc3QgY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlID0gdW5zYWZlQ29yZS5fY2hhclNpemVTZXJ2aWNlO1xuICAgIGNvbnN0IGNvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSA9IHVuc2FmZUNvcmUuX2NvcmVCcm93c2VyU2VydmljZTtcbiAgICBjb25zdCBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlID0gdW5zYWZlQ29yZS5fZGVjb3JhdGlvblNlcnZpY2U7XG4gICAgY29uc3QgbG9nU2VydmljZTogSUxvZ1NlcnZpY2UgPSB1bnNhZmVDb3JlLl9sb2dTZXJ2aWNlO1xuICAgIGNvbnN0IHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZSA9IHVuc2FmZUNvcmUuX3RoZW1lU2VydmljZTtcblxuICAgIC8vIFNldCB0cmFjZSBsb2dnZXIganVzdCBpbiBjYXNlIGl0IGhhc24ndCBiZWVuIHlldCB3aGljaCBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgYWRkb24gaXNcbiAgICAvLyBidW5kbGVkIHNlcGFyYXRlbHkgdG8gdGhlIGNvcmUgbW9kdWxlXG4gICAgc2V0VHJhY2VMb2dnZXIobG9nU2VydmljZSk7XG5cbiAgICB0aGlzLl9yZW5kZXJlciA9IG5ldyBDYW52YXNSZW5kZXJlcih0ZXJtaW5hbCwgc2NyZWVuRWxlbWVudCwgbGlua2lmaWVyLCBidWZmZXJTZXJ2aWNlLCBjaGFyU2l6ZVNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlLCBjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLCBjb3JlU2VydmljZSwgY29yZUJyb3dzZXJTZXJ2aWNlLCBkZWNvcmF0aW9uU2VydmljZSwgdGhlbWVTZXJ2aWNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9yZW5kZXJlci5vbkNoYW5nZVRleHR1cmVBdGxhcywgdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9yZW5kZXJlci5vbkFkZFRleHR1cmVBdGxhc0NhbnZhcywgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMpKTtcbiAgICByZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKHRoaXMuX3JlbmRlcmVyKTtcbiAgICByZW5kZXJTZXJ2aWNlLmhhbmRsZVJlc2l6ZShidWZmZXJTZXJ2aWNlLmNvbHMsIGJ1ZmZlclNlcnZpY2Uucm93cyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICByZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKCh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9jcmVhdGVSZW5kZXJlcigpKTtcbiAgICAgIHJlbmRlclNlcnZpY2UuaGFuZGxlUmVzaXplKHRlcm1pbmFsLmNvbHMsIHRlcm1pbmFsLnJvd3MpO1xuICAgICAgdGhpcy5fcmVuZGVyZXI/LmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyID0gdW5kZWZpbmVkO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlcj8uY2xlYXJUZXh0dXJlQXRsYXMoKTtcbiAgfVxufVxuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiV2ViZ2xBZGRvblwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJXZWJnbEFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgYWxsb3dSZXNjYWxpbmcsIHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVGV4dHVyZUF0bGFzJztcbmltcG9ydCB7IElSYXN0ZXJpemVkR2x5cGgsIElSZW5kZXJEaW1lbnNpb25zLCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgTlVMTF9DRUxMX0NPREUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IElSZW5kZXJNb2RlbCwgSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIElXZWJHTFZlcnRleEFycmF5T2JqZWN0IH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm9ncmFtLCBHTFRleHR1cmUsIFBST0pFQ1RJT05fTUFUUklYIH0gZnJvbSAnLi9XZWJnbFV0aWxzJztcbmltcG9ydCB0eXBlIHsgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuaW50ZXJmYWNlIElWZXJ0aWNlcyB7XG4gIGF0dHJpYnV0ZXM6IEZsb2F0MzJBcnJheTtcbiAgLyoqXG4gICAqIFRoZXNlIGJ1ZmZlcnMgYXJlIHRoZSBvbmVzIHVzZWQgdG8gYmluZCB0byBXZWJHTCwgdGhlIHJlYXNvbiB0aGVyZSBhcmVcbiAgICogbXVsdGlwbGUgaXMgdG8gYWxsb3cgZG91YmxlIGJ1ZmZlcmluZyB0byB3b3JrIGFzIHlvdSBjYW5ub3QgbW9kaWZ5IHRoZVxuICAgKiBidWZmZXIgd2hpbGUgaXQncyBiZWluZyB1c2VkIGJ5IHRoZSBHUFUuIEhhdmluZyBtdWx0aXBsZSBsZXRzIHVzIHN0YXJ0XG4gICAqIHdvcmtpbmcgb24gdGhlIG5leHQgZnJhbWUuXG4gICAqL1xuICBhdHRyaWJ1dGVzQnVmZmVyczogRmxvYXQzMkFycmF5W107XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbmNvbnN0IGVudW0gVmVydGV4QXR0cmliTG9jYXRpb25zIHtcbiAgVU5JVF9RVUFEID0gMCxcbiAgQ0VMTF9QT1NJVElPTiA9IDEsXG4gIE9GRlNFVCA9IDIsXG4gIFNJWkUgPSAzLFxuICBURVhQQUdFID0gNCxcbiAgVEVYQ09PUkQgPSA1LFxuICBURVhTSVpFID0gNlxufVxuXG5jb25zdCB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBgI3ZlcnNpb24gMzAwIGVzXG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFEfSkgaW4gdmVjMiBhX3VuaXRxdWFkO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT059KSBpbiB2ZWMyIGFfY2VsbHBvcztcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5PRkZTRVR9KSBpbiB2ZWMyIGFfb2Zmc2V0O1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkV9KSBpbiB2ZWMyIGFfc2l6ZTtcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhQQUdFfSkgaW4gZmxvYXQgYV90ZXhwYWdlO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlRFWENPT1JEfSkgaW4gdmVjMiBhX3RleGNvb3JkO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFNJWkV9KSBpbiB2ZWMyIGFfdGV4c2l6ZTtcblxudW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247XG5cbm91dCB2ZWMyIHZfdGV4Y29vcmQ7XG5mbGF0IG91dCBpbnQgdl90ZXhwYWdlO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgemVyb1RvT25lID0gKGFfb2Zmc2V0IC8gdV9yZXNvbHV0aW9uKSArIGFfY2VsbHBvcyArIChhX3VuaXRxdWFkICogYV9zaXplKTtcbiAgZ2xfUG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiB2ZWM0KHplcm9Ub09uZSwgMC4wLCAxLjApO1xuICB2X3RleHBhZ2UgPSBpbnQoYV90ZXhwYWdlKTtcbiAgdl90ZXhjb29yZCA9IGFfdGV4Y29vcmQgKyBhX3VuaXRxdWFkICogYV90ZXhzaXplO1xufWA7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50U2hhZGVyU291cmNlKG1heEZyYWdtZW50U2hhZGVyVGV4dHVyZVVuaXRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBsZXQgdGV4dHVyZUNvbmRpdGlvbmFscyA9ICcnO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IG1heEZyYWdtZW50U2hhZGVyVGV4dHVyZVVuaXRzOyBpKyspIHtcbiAgICB0ZXh0dXJlQ29uZGl0aW9uYWxzICs9IGAgZWxzZSBpZiAodl90ZXhwYWdlID09ICR7aX0pIHsgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZVske2l9XSwgdl90ZXhjb29yZCk7IH1gO1xuICB9XG4gIHJldHVybiAoYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGxvd3AgZmxvYXQ7XG5cbmluIHZlYzIgdl90ZXhjb29yZDtcbmZsYXQgaW4gaW50IHZfdGV4cGFnZTtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlWyR7bWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHN9XTtcblxub3V0IHZlYzQgb3V0Q29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYgKHZfdGV4cGFnZSA9PSAwKSB7XG4gICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZVswXSwgdl90ZXhjb29yZCk7XG4gIH0gJHt0ZXh0dXJlQ29uZGl0aW9uYWxzfVxufWApO1xufVxuXG5jb25zdCBJTkRJQ0VTX1BFUl9DRUxMID0gMTE7XG5jb25zdCBCWVRFU19QRVJfQ0VMTCA9IElORElDRVNfUEVSX0NFTEwgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG5jb25zdCBDRUxMX1BPU0lUSU9OX0lORElDRVMgPSAyO1xuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkaSA9IDA7XG5sZXQgJGdseXBoOiBJUmFzdGVyaXplZEdseXBoIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xubGV0ICRsZWZ0Q2VsbFBhZGRpbmcgPSAwO1xubGV0ICRjbGlwcGVkUGl4ZWxzID0gMDtcblxuZXhwb3J0IGNsYXNzIEdseXBoUmVuZGVyZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICBwcml2YXRlIHJlYWRvbmx5IF92ZXJ0ZXhBcnJheU9iamVjdDogSVdlYkdMVmVydGV4QXJyYXlPYmplY3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2plY3Rpb25Mb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc29sdXRpb25Mb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RleHR1cmVMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0bGFzVGV4dHVyZXM6IEdMVGV4dHVyZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRyaWJ1dGVzQnVmZmVyOiBXZWJHTEJ1ZmZlcjtcblxuICBwcml2YXRlIF9hdGxhczogSVRleHR1cmVBdGxhcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYWN0aXZlQnVmZmVyOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IF92ZXJ0aWNlczogSVZlcnRpY2VzID0ge1xuICAgIGNvdW50OiAwLFxuICAgIGF0dHJpYnV0ZXM6IG5ldyBGbG9hdDMyQXJyYXkoMCksXG4gICAgYXR0cmlidXRlc0J1ZmZlcnM6IFtcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoMCksXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KDApXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nbDogSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gICAgcHJpdmF0ZSBfZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIGlmIChUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUeXBpY2FsbHkgOCBvciAxNlxuICAgICAgVGV4dHVyZUF0bGFzLm1heEF0bGFzUGFnZXMgPSBNYXRoLm1pbigzMiwgdGhyb3dJZkZhbHN5KGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUykgYXMgbnVtYmVyIHwgbnVsbCkpO1xuICAgICAgLy8gQWxtb3N0IGFsbCBjbGllbnRzIHdpbGwgc3VwcG9ydCA+PSA0MDk2XG4gICAgICBUZXh0dXJlQXRsYXMubWF4VGV4dHVyZVNpemUgPSB0aHJvd0lmRmFsc3koZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpIGFzIG51bWJlciB8IG51bGwpO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2dyYW0gPSB0aHJvd0lmRmFsc3koY3JlYXRlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyU291cmNlLCBjcmVhdGVGcmFnbWVudFNoYWRlclNvdXJjZShUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVQcm9ncmFtKHRoaXMuX3Byb2dyYW0pKSk7XG5cbiAgICAvLyBVbmlmb3JtIGxvY2F0aW9uc1xuICAgIHRoaXMuX3Byb2plY3Rpb25Mb2NhdGlvbiA9IHRocm93SWZGYWxzeShnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5fcHJvZ3JhbSwgJ3VfcHJvamVjdGlvbicpKTtcbiAgICB0aGlzLl9yZXNvbHV0aW9uTG9jYXRpb24gPSB0aHJvd0lmRmFsc3koZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX3Byb2dyYW0sICd1X3Jlc29sdXRpb24nKSk7XG4gICAgdGhpcy5fdGV4dHVyZUxvY2F0aW9uID0gdGhyb3dJZkZhbHN5KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9wcm9ncmFtLCAndV90ZXh0dXJlJykpO1xuXG4gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHZlcnRleCBhcnJheSBvYmplY3RcbiAgICB0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG4gICAgZ2wuYmluZFZlcnRleEFycmF5KHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KTtcblxuICAgIC8vIFNldHVwIGFfdW5pdHF1YWQsIHRoaXMgZGVmaW5lcyB0aGUgNCB2ZXJ0aWNlcyBvZiBhIHJlY3RhbmdsZVxuICAgIGNvbnN0IHVuaXRRdWFkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAxLCAwLCAwLCAxLCAxLCAxXSk7XG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih1bml0UXVhZFZlcnRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgdW5pdFF1YWRWZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUQpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCwgMiwgdGhpcy5fZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgIC8vIFNldHVwIHRoZSB1bml0IHF1YWQgZWxlbWVudCBhcnJheSBidWZmZXIsIHRoaXMgcG9pbnRzIHRvIGluZGljZXMgaW5cbiAgICAvLyB1bml0UXVhZFZlcnRpY2VzIHRvIGFsbG93IGlzIHRvIGRyYXcgMiB0cmlhbmdsZXMgZnJvbSB0aGUgdmVydGljZXMgdmlhIGFcbiAgICAvLyB0cmlhbmdsZSBzdHJpcFxuICAgIGNvbnN0IHVuaXRRdWFkRWxlbWVudEluZGljZXMgPSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgM10pO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKGVsZW1lbnRJbmRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRJbmRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB1bml0UXVhZEVsZW1lbnRJbmRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fYXR0cmlidXRlc0J1ZmZlciA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVCdWZmZXIoKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5PRkZTRVQpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVCwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgMCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuT0ZGU0VULCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgMiAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0UpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0UsIDEsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX0NFTEwsIDQgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0UsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhDT09SRCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkQsIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX0NFTEwsIDUgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWENPT1JELCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRSk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRSwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgNyAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT04pO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT04sIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX0NFTEwsIDkgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT04sIDEpO1xuXG4gICAgLy8gU2V0dXAgc3RhdGljIHVuaWZvcm1zXG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcbiAgICBjb25zdCB0ZXh0dXJlVW5pdHMgPSBuZXcgSW50MzJBcnJheShUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlczsgaSsrKSB7XG4gICAgICB0ZXh0dXJlVW5pdHNbaV0gPSBpO1xuICAgIH1cbiAgICBnbC51bmlmb3JtMWl2KHRoaXMuX3RleHR1cmVMb2NhdGlvbiwgdGV4dHVyZVVuaXRzKTtcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuX3Byb2plY3Rpb25Mb2NhdGlvbiwgZmFsc2UsIFBST0pFQ1RJT05fTUFUUklYKTtcblxuICAgIC8vIFNldHVwIDF4MSByZWQgcGl4ZWwgdGV4dHVyZXMgZm9yIGFsbCBwb3RlbnRpYWwgYXRsYXMgcGFnZXMsIGlmIG9uZSBvZiB0aGVzZSBpbnZhbGlkIHRleHR1cmVzXG4gICAgLy8gaXMgZXZlciBkcmF3biBpdCB3aWxsIHNob3cgY2hhcmFjdGVycyBhcyByZWQgcmVjdGFuZ2xlcy5cbiAgICB0aGlzLl9hdGxhc1RleHR1cmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlczsgaSsrKSB7XG4gICAgICBjb25zdCBnbFRleHR1cmUgPSBuZXcgR0xUZXh0dXJlKHRocm93SWZGYWxzeShnbC5jcmVhdGVUZXh0dXJlKCkpKTtcbiAgICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZVRleHR1cmUoZ2xUZXh0dXJlLnRleHR1cmUpKSk7XG4gICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgaSk7XG4gICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBnbFRleHR1cmUudGV4dHVyZSk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShbMjU1LCAwLCAwLCAyNTVdKSk7XG4gICAgICB0aGlzLl9hdGxhc1RleHR1cmVzW2ldID0gZ2xUZXh0dXJlO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGRyYXdpbmcgb2YgdHJhbnNwYXJlbnQgdGV4dHVyZVxuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAvLyBTZXQgdmlld3BvcnRcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZSgpO1xuICB9XG5cbiAgcHVibGljIGJlZ2luRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2F0bGFzID8gdGhpcy5fYXRsYXMuYmVnaW5GcmFtZSgpIDogdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDZWxsKHg6IG51bWJlciwgeTogbnVtYmVyLCBjb2RlOiBudW1iZXIsIGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIGV4dDogbnVtYmVyLCBjaGFyczogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBsYXN0Qmc6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBjZWxsIChgcm93cypjb2xzYCksIGl0IG11c3QgYmUgdmVyeSBvcHRpbWl6ZWQuIEl0XG4gICAgLy8gc2hvdWxkIG5vdCBpbnN0YW50aWF0ZSBhbnkgdmFyaWFibGVzIHVubGVzcyBhIG5ldyBnbHlwaCBpcyBkcmF3biB0byB0aGUgY2FjaGUgd2hlcmUgdGhlXG4gICAgLy8gc2xpZ2h0IHNsb3dkb3duIGlzIGFjY2VwdGFibGUgZm9yIHRoZSBkZXZlbG9wZXIgZXJnb25vbWljcyBwcm92aWRlZCBhcyBpdCdzIGEgb25jZSBvZiBmb3JcbiAgICAvLyBlYWNoIGdseXBoLlxuICAgIHRoaXMuX3VwZGF0ZUNlbGwodGhpcy5fdmVydGljZXMuYXR0cmlidXRlcywgeCwgeSwgY29kZSwgYmcsIGZnLCBleHQsIGNoYXJzLCB3aWR0aCwgbGFzdEJnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNlbGwoYXJyYXk6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIGNoYXJzOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGxhc3RCZzogbnVtYmVyKTogdm9pZCB7XG4gICAgJGkgPSAoeSAqIHRoaXMuX3Rlcm1pbmFsLmNvbHMgKyB4KSAqIElORElDRVNfUEVSX0NFTEw7XG5cbiAgICAvLyBFeGl0IGVhcmx5IGlmIHRoaXMgaXMgYSBudWxsIGNoYXJhY3RlciwgYWxsb3cgc3BhY2UgY2hhcmFjdGVyIHRvIGNvbnRpbnVlIGFzIGl0IG1heSBoYXZlXG4gICAgLy8gdW5kZXJsaW5lL3N0cmlrZXRocm91Z2ggc3R5bGVzXG4gICAgaWYgKGNvZGUgPT09IE5VTExfQ0VMTF9DT0RFIHx8IGNvZGUgPT09IHVuZGVmaW5lZC8qIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHJpZ2h0IHNpZGUgb2Ygd2lkZSBjaGFycyAqLykge1xuICAgICAgYXJyYXkuZmlsbCgwLCAkaSwgJGkgKyBJTkRJQ0VTX1BFUl9DRUxMIC0gMSAtIENFTExfUE9TSVRJT05fSU5ESUNFUyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9hdGxhcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZ2x5cGhcbiAgICBpZiAoY2hhcnMgJiYgY2hhcnMubGVuZ3RoID4gMSkge1xuICAgICAgJGdseXBoID0gdGhpcy5fYXRsYXMuZ2V0UmFzdGVyaXplZEdseXBoQ29tYmluZWRDaGFyKGNoYXJzLCBiZywgZmcsIGV4dCwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkZ2x5cGggPSB0aGlzLl9hdGxhcy5nZXRSYXN0ZXJpemVkR2x5cGgoY29kZSwgYmcsIGZnLCBleHQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAkbGVmdENlbGxQYWRkaW5nID0gTWF0aC5mbG9vcigodGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAtIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGgpIC8gMik7XG4gICAgaWYgKGJnICE9PSBsYXN0QmcgJiYgJGdseXBoLm9mZnNldC54ID4gJGxlZnRDZWxsUGFkZGluZykge1xuICAgICAgJGNsaXBwZWRQaXhlbHMgPSAkZ2x5cGgub2Zmc2V0LnggLSAkbGVmdENlbGxQYWRkaW5nO1xuICAgICAgLy8gYV9vcmlnaW5cbiAgICAgIGFycmF5WyRpICAgIF0gPSAtKCRnbHlwaC5vZmZzZXQueCAtICRjbGlwcGVkUGl4ZWxzKSArIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNoYXIubGVmdDtcbiAgICAgIGFycmF5WyRpICsgMV0gPSAtJGdseXBoLm9mZnNldC55ICsgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci50b3A7XG4gICAgICAvLyBhX3NpemVcbiAgICAgIGFycmF5WyRpICsgMl0gPSAoJGdseXBoLnNpemUueCAtICRjbGlwcGVkUGl4ZWxzKSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICAgIGFycmF5WyRpICsgM10gPSAkZ2x5cGguc2l6ZS55IC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICAgIC8vIGFfdGV4cGFnZVxuICAgICAgYXJyYXlbJGkgKyA0XSA9ICRnbHlwaC50ZXh0dXJlUGFnZTtcbiAgICAgIC8vIGFfdGV4Y29vcmRcbiAgICAgIGFycmF5WyRpICsgNV0gPSAkZ2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnggKyAkY2xpcHBlZFBpeGVscyAvIHRoaXMuX2F0bGFzLnBhZ2VzWyRnbHlwaC50ZXh0dXJlUGFnZV0uY2FudmFzLndpZHRoO1xuICAgICAgYXJyYXlbJGkgKyA2XSA9ICRnbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueTtcbiAgICAgIC8vIGFfdGV4c2l6ZVxuICAgICAgYXJyYXlbJGkgKyA3XSA9ICRnbHlwaC5zaXplQ2xpcFNwYWNlLnggLSAkY2xpcHBlZFBpeGVscyAvIHRoaXMuX2F0bGFzLnBhZ2VzWyRnbHlwaC50ZXh0dXJlUGFnZV0uY2FudmFzLndpZHRoO1xuICAgICAgYXJyYXlbJGkgKyA4XSA9ICRnbHlwaC5zaXplQ2xpcFNwYWNlLnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFfb3JpZ2luXG4gICAgICBhcnJheVskaSAgICBdID0gLSRnbHlwaC5vZmZzZXQueCArIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNoYXIubGVmdDtcbiAgICAgIGFycmF5WyRpICsgMV0gPSAtJGdseXBoLm9mZnNldC55ICsgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci50b3A7XG4gICAgICAvLyBhX3NpemVcbiAgICAgIGFycmF5WyRpICsgMl0gPSAkZ2x5cGguc2l6ZS54IC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgICAgYXJyYXlbJGkgKyAzXSA9ICRnbHlwaC5zaXplLnkgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgICAgLy8gYV90ZXhwYWdlXG4gICAgICBhcnJheVskaSArIDRdID0gJGdseXBoLnRleHR1cmVQYWdlO1xuICAgICAgLy8gYV90ZXhjb29yZFxuICAgICAgYXJyYXlbJGkgKyA1XSA9ICRnbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueDtcbiAgICAgIGFycmF5WyRpICsgNl0gPSAkZ2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnk7XG4gICAgICAvLyBhX3RleHNpemVcbiAgICAgIGFycmF5WyRpICsgN10gPSAkZ2x5cGguc2l6ZUNsaXBTcGFjZS54O1xuICAgICAgYXJyYXlbJGkgKyA4XSA9ICRnbHlwaC5zaXplQ2xpcFNwYWNlLnk7XG4gICAgfVxuICAgIC8vIGFfY2VsbHBvcyBvbmx5IGNoYW5nZXMgb24gcmVzaXplXG5cbiAgICAvLyBSZWR1Y2Ugc2NhbGUgaG9yaXpvbnRhbGx5IGZvciB3aWRlIGdseXBocyBwcmludGVkIGluIGNlbGxzIHRoYXQgd291bGQgb3ZlcmxhcCB3aXRoIHRoZVxuICAgIC8vIGZvbGxvd2luZyBjZWxsIChpZS4gdGhlIHdpZHRoIGlzIG5vdCAyKS5cbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5yZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHMpIHtcbiAgICAgIGlmIChhbGxvd1Jlc2NhbGluZyhjb2RlLCB3aWR0aCwgJGdseXBoLnNpemUueCwgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCkpIHtcbiAgICAgICAgYXJyYXlbJGkgKyAyXSA9ICh0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoIC0gMSkgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7IC8vIC0gMSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5fdGVybWluYWw7XG4gICAgY29uc3QgbmV3Q291bnQgPSB0ZXJtaW5hbC5jb2xzICogdGVybWluYWwucm93cyAqIElORElDRVNfUEVSX0NFTEw7XG5cbiAgICAvLyBDbGVhciB2ZXJ0aWNlc1xuICAgIGlmICh0aGlzLl92ZXJ0aWNlcy5jb3VudCAhPT0gbmV3Q291bnQpIHtcbiAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXMgPSBuZXcgRmxvYXQzMkFycmF5KG5ld0NvdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlcy5maWxsKDApO1xuICAgIH1cbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzQnVmZmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3ZlcnRpY2VzLmNvdW50ICE9PSBuZXdDb3VudCkge1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzQnVmZmVyc1tpXSA9IG5ldyBGbG9hdDMyQXJyYXkobmV3Q291bnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc0J1ZmZlcnNbaV0uZmlsbCgwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fdmVydGljZXMuY291bnQgPSBuZXdDb3VudDtcbiAgICBpID0gMDtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRlcm1pbmFsLnJvd3M7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0ZXJtaW5hbC5jb2xzOyB4KyspIHtcbiAgICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc1tpICsgOV0gPSB4IC8gdGVybWluYWwuY29scztcbiAgICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc1tpICsgMTBdID0geSAvIHRlcm1pbmFsLnJvd3M7XG4gICAgICAgIGkgKz0gSU5ESUNFU19QRVJfQ0VMTDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fZ2w7XG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpO1xuICAgIGdsLnVuaWZvcm0yZih0aGlzLl9yZXNvbHV0aW9uTG9jYXRpb24sIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcihyZW5kZXJNb2RlbDogSVJlbmRlck1vZGVsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hdGxhcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdsID0gdGhpcy5fZ2w7XG5cbiAgICBnbC51c2VQcm9ncmFtKHRoaXMuX3Byb2dyYW0pO1xuICAgIGdsLmJpbmRWZXJ0ZXhBcnJheSh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCk7XG5cbiAgICAvLyBBbHRlcm5hdGUgYnVmZmVycyBlYWNoIGZyYW1lIGFzIHRoZSBhY3RpdmUgYnVmZmVyIGdldHMgbG9ja2VkIHdoaWxlIGl0J3MgaW4gdXNlIGJ5IHRoZSBHUFVcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIgPSAodGhpcy5fYWN0aXZlQnVmZmVyICsgMSkgJSAyO1xuICAgIGNvbnN0IGFjdGl2ZUJ1ZmZlciA9IHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNCdWZmZXJzW3RoaXMuX2FjdGl2ZUJ1ZmZlcl07XG5cbiAgICAvLyBDb3B5IGRhdGEgZm9yIGVhY2ggY2VsbCBvZiBlYWNoIGxpbmUgdXAgdG8gaXRzIGxpbmUgbGVuZ3RoICh0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjZWxsKVxuICAgIC8vIGZyb20gdGhlIGF0dHJpYnV0ZXMgYnVmZmVyIGludG8gYWN0aXZlQnVmZmVyLCB3aGljaCBpcyB0aGUgb25lIHRoYXQgZ2V0cyBib3VuZCB0byB0aGUgR1BVLlxuICAgIC8vIFRoZSByZWFzb25zIGZvciB0aGlzIGFyZSBhcyBmb2xsb3dzOlxuICAgIC8vIC0gU28gdGhlIGFjdGl2ZSBidWZmZXIgY2FuIGJlIGFsdGVybmF0ZWQgc28gd2UgZG9uJ3QgZ2V0IGJsb2NrZWQgb24gcmVuZGVyaW5nIGZpbmlzaGluZ1xuICAgIC8vIC0gVG8gY29weSBlaXRoZXIgdGhlIG5vcm1hbCBhdHRyaWJ1dGVzIGJ1ZmZlciBvciB0aGUgc2VsZWN0aW9uIGF0dHJpYnV0ZXMgYnVmZmVyIHdoZW4gdGhlcmVcbiAgICAvLyAgIGlzIGEgc2VsZWN0aW9uXG4gICAgLy8gLSBTbyB3ZSBkb24ndCBzZW5kIHZlcnRpY2VzIGZvciBhbGwgdGhlIGxpbmUtZW5kaW5nIHdoaXRlc3BhY2UgdG8gdGhlIEdQVVxuICAgIGxldCBidWZmZXJMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcmVuZGVyTW9kZWwubGluZUxlbmd0aHMubGVuZ3RoOyB5KyspIHtcbiAgICAgIGNvbnN0IHNpID0geSAqIHRoaXMuX3Rlcm1pbmFsLmNvbHMgKiBJTkRJQ0VTX1BFUl9DRUxMO1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fdmVydGljZXMuYXR0cmlidXRlcy5zdWJhcnJheShzaSwgc2kgKyByZW5kZXJNb2RlbC5saW5lTGVuZ3Roc1t5XSAqIElORElDRVNfUEVSX0NFTEwpO1xuICAgICAgYWN0aXZlQnVmZmVyLnNldChzdWIsIGJ1ZmZlckxlbmd0aCk7XG4gICAgICBidWZmZXJMZW5ndGggKz0gc3ViLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBCaW5kIHRoZSBhdHRyaWJ1dGVzIGJ1ZmZlclxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLl9hdHRyaWJ1dGVzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYWN0aXZlQnVmZmVyLnN1YmFycmF5KDAsIGJ1ZmZlckxlbmd0aCksIGdsLlNUUkVBTV9EUkFXKTtcblxuICAgIC8vIEJpbmQgdGhlIGF0bGFzIHBhZ2UgdGV4dHVyZSBpZiB0aGV5IGhhdmUgY2hhbmdlZFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYXRsYXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9hdGxhcy5wYWdlc1tpXS52ZXJzaW9uICE9PSB0aGlzLl9hdGxhc1RleHR1cmVzW2ldLnZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fYmluZEF0bGFzUGFnZVRleHR1cmUoZ2wsIHRoaXMuX2F0bGFzLCBpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHRoZSB2aWV3cG9ydFxuICAgIGdsLmRyYXdFbGVtZW50c0luc3RhbmNlZChnbC5UUklBTkdMRV9TVFJJUCwgNCwgZ2wuVU5TSUdORURfQllURSwgMCwgYnVmZmVyTGVuZ3RoIC8gSU5ESUNFU19QRVJfQ0VMTCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QXRsYXMoYXRsYXM6IElUZXh0dXJlQXRsYXMpOiB2b2lkIHtcbiAgICB0aGlzLl9hdGxhcyA9IGF0bGFzO1xuICAgIGZvciAoY29uc3QgZ2xUZXh0dXJlIG9mIHRoaXMuX2F0bGFzVGV4dHVyZXMpIHtcbiAgICAgIGdsVGV4dHVyZS52ZXJzaW9uID0gLTE7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEF0bGFzUGFnZVRleHR1cmUoZ2w6IElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCBhdGxhczogSVRleHR1cmVBdGxhcywgaTogbnVtYmVyKTogdm9pZCB7XG4gICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIGkpO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMuX2F0bGFzVGV4dHVyZXNbaV0udGV4dHVyZSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBhdGxhcy5wYWdlc1tpXS5jYW52YXMpO1xuICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgIHRoaXMuX2F0bGFzVGV4dHVyZXNbaV0udmVyc2lvbiA9IGF0bGFzLnBhZ2VzW2ldLnZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgc2V0RGltZW5zaW9ucyhkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2RpbWVuc2lvbnMgPSBkaW1lbnNpb25zO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgUkVOREVSX01PREVMX0JHX09GRlNFVCwgUkVOREVSX01PREVMX0ZHX09GRlNFVCwgUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMIH0gZnJvbSAnLi9SZW5kZXJNb2RlbCc7XG5pbXBvcnQgeyBJUmVuZGVyTW9kZWwsIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvZ3JhbSwgZXhwYW5kRmxvYXQzMkFycmF5LCBQUk9KRUNUSU9OX01BVFJJWCB9IGZyb20gJy4vV2ViZ2xVdGlscyc7XG5cbmNvbnN0IGVudW0gVmVydGV4QXR0cmliTG9jYXRpb25zIHtcbiAgUE9TSVRJT04gPSAwLFxuICBTSVpFID0gMSxcbiAgQ09MT1IgPSAyLFxuICBVTklUX1FVQUQgPSAzXG59XG5cbmNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTn0pIGluIHZlYzIgYV9wb3NpdGlvbjtcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFfSkgaW4gdmVjMiBhX3NpemU7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ09MT1J9KSBpbiB2ZWM0IGFfY29sb3I7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFEfSkgaW4gdmVjMiBhX3VuaXRxdWFkO1xuXG51bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuXG5vdXQgdmVjNCB2X2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgemVyb1RvT25lID0gYV9wb3NpdGlvbiArIChhX3VuaXRxdWFkICogYV9zaXplKTtcbiAgZ2xfUG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiB2ZWM0KHplcm9Ub09uZSwgMC4wLCAxLjApO1xuICB2X2NvbG9yID0gYV9jb2xvcjtcbn1gO1xuXG5jb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBsb3dwIGZsb2F0O1xuXG5pbiB2ZWM0IHZfY29sb3I7XG5cbm91dCB2ZWM0IG91dENvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIG91dENvbG9yID0gdl9jb2xvcjtcbn1gO1xuXG5jb25zdCBJTkRJQ0VTX1BFUl9SRUNUQU5HTEUgPSA4O1xuY29uc3QgQllURVNfUEVSX1JFQ1RBTkdMRSA9IElORElDRVNfUEVSX1JFQ1RBTkdMRSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcblxuY29uc3QgSU5JVElBTF9CVUZGRVJfUkVDVEFOR0xFX0NBUEFDSVRZID0gMjAgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG5cbmNsYXNzIFZlcnRpY2VzIHtcbiAgcHVibGljIGF0dHJpYnV0ZXM6IEZsb2F0MzJBcnJheTtcbiAgcHVibGljIGNvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEZsb2F0MzJBcnJheShJTklUSUFMX0JVRkZFUl9SRUNUQU5HTEVfQ0FQQUNJVFkpO1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG59XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRyZ2JhID0gMDtcbmxldCAkeDEgPSAwO1xubGV0ICR5MSA9IDA7XG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlUmVuZGVyZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcblxuICBwcml2YXRlIF9wcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByaXZhdGUgX3ZlcnRleEFycmF5T2JqZWN0OiBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgcHJpdmF0ZSBfYXR0cmlidXRlc0J1ZmZlcjogV2ViR0xCdWZmZXI7XG4gIHByaXZhdGUgX3Byb2plY3Rpb25Mb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIHByaXZhdGUgX2JnRmxvYXQhOiBGbG9hdDMyQXJyYXk7XG4gIHByaXZhdGUgX2N1cnNvckZsb2F0ITogRmxvYXQzMkFycmF5O1xuXG4gIHByaXZhdGUgX3ZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xuICBwcml2YXRlIF92ZXJ0aWNlc0N1cnNvcjogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSBfZ2w6IElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbnM6IElSZW5kZXJEaW1lbnNpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIHRoaXMuX3Byb2dyYW0gPSB0aHJvd0lmRmFsc3koY3JlYXRlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyU291cmNlLCBmcmFnbWVudFNoYWRlclNvdXJjZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZVByb2dyYW0odGhpcy5fcHJvZ3JhbSkpKTtcblxuICAgIC8vIFVuaWZvcm0gbG9jYXRpb25zXG4gICAgdGhpcy5fcHJvamVjdGlvbkxvY2F0aW9uID0gdGhyb3dJZkZhbHN5KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9wcm9ncmFtLCAndV9wcm9qZWN0aW9uJykpO1xuXG4gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHZlcnRleCBhcnJheSBvYmplY3RcbiAgICB0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG4gICAgZ2wuYmluZFZlcnRleEFycmF5KHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KTtcblxuICAgIC8vIFNldHVwIGFfdW5pdHF1YWQsIHRoaXMgZGVmaW5lcyB0aGUgNCB2ZXJ0aWNlcyBvZiBhIHJlY3RhbmdsZVxuICAgIGNvbnN0IHVuaXRRdWFkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAxLCAwLCAwLCAxLCAxLCAxXSk7XG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih1bml0UXVhZFZlcnRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgdW5pdFF1YWRWZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUQpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCwgMiwgdGhpcy5fZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgIC8vIFNldHVwIHRoZSB1bml0IHF1YWQgZWxlbWVudCBhcnJheSBidWZmZXIsIHRoaXMgcG9pbnRzIHRvIGluZGljZXMgaW5cbiAgICAvLyB1bml0UXVhZFZlcnRpY2VzIHRvIGFsbG93IGlzIHRvIGRyYXcgMiB0cmlhbmdsZXMgZnJvbSB0aGUgdmVydGljZXMgdmlhIGFcbiAgICAvLyB0cmlhbmdsZSBzdHJpcFxuICAgIGNvbnN0IHVuaXRRdWFkRWxlbWVudEluZGljZXMgPSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgM10pO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKGVsZW1lbnRJbmRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRJbmRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB1bml0UXVhZEVsZW1lbnRJbmRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fYXR0cmlidXRlc0J1ZmZlciA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVCdWZmZXIoKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuUE9TSVRJT04sIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX1JFQ1RBTkdMRSwgMCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuUE9TSVRJT04sIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFLCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9SRUNUQU5HTEUsIDIgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkUsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ09MT1IsIDQsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX1JFQ1RBTkdMRSwgNCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ09MT1IsIDEpO1xuXG4gICAgdGhpcy5fdXBkYXRlQ2FjaGVkQ29sb3JzKF90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3RoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycyhlID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZUNhY2hlZENvbG9ycyhlKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXdwb3J0UmVjdGFuZ2xlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckJhY2tncm91bmRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlclZlcnRpY2VzKHRoaXMuX3ZlcnRpY2VzKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJDdXJzb3IoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyVmVydGljZXModGhpcy5fdmVydGljZXNDdXJzb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVmVydGljZXModmVydGljZXM6IFZlcnRpY2VzKTogdm9pZCB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIGdsLnVzZVByb2dyYW0odGhpcy5fcHJvZ3JhbSk7XG5cbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLl9wcm9qZWN0aW9uTG9jYXRpb24sIGZhbHNlLCBQUk9KRUNUSU9OX01BVFJJWCk7XG5cbiAgICAvLyBCaW5kIGF0dHJpYnV0ZXMgYnVmZmVyIGFuZCBkcmF3XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCBnbC5EWU5BTUlDX0RSQVcpO1xuICAgIGdsLmRyYXdFbGVtZW50c0luc3RhbmNlZCh0aGlzLl9nbC5UUklBTkdMRV9TVFJJUCwgNCwgZ2wuVU5TSUdORURfQllURSwgMCwgdmVydGljZXMuY291bnQpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSgpO1xuICB9XG5cbiAgcHVibGljIHNldERpbWVuc2lvbnMoZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9kaW1lbnNpb25zID0gZGltZW5zaW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNhY2hlZENvbG9ycyhjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICB0aGlzLl9iZ0Zsb2F0ID0gdGhpcy5fY29sb3JUb0Zsb2F0MzJBcnJheShjb2xvcnMuYmFja2dyb3VuZCk7XG4gICAgdGhpcy5fY3Vyc29yRmxvYXQgPSB0aGlzLl9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9ycy5jdXJzb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmlld3BvcnRSZWN0YW5nbGUoKTogdm9pZCB7XG4gICAgLy8gU2V0IGZpcnN0IHJlY3RhbmdsZSB0aGF0IGNsZWFycyB0aGUgc2NyZWVuXG4gICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fdGVybWluYWwuY29scyAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICB0aGlzLl9iZ0Zsb2F0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVCYWNrZ3JvdW5kcyhtb2RlbDogSVJlbmRlck1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbDtcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMuX3ZlcnRpY2VzO1xuXG4gICAgLy8gRGVjbGFyZSB2YXJpYWJsZSBhaGVhZCBvZiB0aW1lIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgIGxldCByZWN0YW5nbGVDb3VudCA9IDE7XG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50U3RhcnRYOiBudW1iZXI7XG4gICAgbGV0IGN1cnJlbnRCZzogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50Rmc6IG51bWJlcjtcbiAgICBsZXQgY3VycmVudEludmVyc2U6IGJvb2xlYW47XG4gICAgbGV0IG1vZGVsSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgYmc6IG51bWJlcjtcbiAgICBsZXQgZmc6IG51bWJlcjtcbiAgICBsZXQgaW52ZXJzZTogYm9vbGVhbjtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXI7XG5cbiAgICBmb3IgKHkgPSAwOyB5IDwgdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICBjdXJyZW50U3RhcnRYID0gLTE7XG4gICAgICBjdXJyZW50QmcgPSAwO1xuICAgICAgY3VycmVudEZnID0gMDtcbiAgICAgIGN1cnJlbnRJbnZlcnNlID0gZmFsc2U7XG4gICAgICBmb3IgKHggPSAwOyB4IDwgdGVybWluYWwuY29sczsgeCsrKSB7XG4gICAgICAgIG1vZGVsSW5kZXggPSAoKHkgKiB0ZXJtaW5hbC5jb2xzKSArIHgpICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuICAgICAgICBiZyA9IG1vZGVsLmNlbGxzW21vZGVsSW5kZXggKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXTtcbiAgICAgICAgZmcgPSBtb2RlbC5jZWxsc1ttb2RlbEluZGV4ICsgUkVOREVSX01PREVMX0ZHX09GRlNFVF07XG4gICAgICAgIGludmVyc2UgPSAhIShmZyAmIEZnRmxhZ3MuSU5WRVJTRSk7XG4gICAgICAgIGlmIChiZyAhPT0gY3VycmVudEJnIHx8IChmZyAhPT0gY3VycmVudEZnICYmIChjdXJyZW50SW52ZXJzZSB8fCBpbnZlcnNlKSkpIHtcbiAgICAgICAgICAvLyBBIHJlY3RhbmdsZSBuZWVkcyB0byBiZSBkcmF3biBpZiBnb2luZyBmcm9tIG5vbi1kZWZhdWx0IHRvIGFub3RoZXIgY29sb3JcbiAgICAgICAgICBpZiAoY3VycmVudEJnICE9PSAwIHx8IChjdXJyZW50SW52ZXJzZSAmJiBjdXJyZW50RmcgIT09IDApKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzLCBvZmZzZXQsIGN1cnJlbnRGZywgY3VycmVudEJnLCBjdXJyZW50U3RhcnRYLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFN0YXJ0WCA9IHg7XG4gICAgICAgICAgY3VycmVudEJnID0gYmc7XG4gICAgICAgICAgY3VycmVudEZnID0gZmc7XG4gICAgICAgICAgY3VycmVudEludmVyc2UgPSBpbnZlcnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGaW5pc2ggcmVjdGFuZ2xlIGlmIGl0J3Mgc3RpbGwgZ29pbmdcbiAgICAgIGlmIChjdXJyZW50QmcgIT09IDAgfHwgKGN1cnJlbnRJbnZlcnNlICYmIGN1cnJlbnRGZyAhPT0gMCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzLCBvZmZzZXQsIGN1cnJlbnRGZywgY3VycmVudEJnLCBjdXJyZW50U3RhcnRYLCB0ZXJtaW5hbC5jb2xzLCB5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmVydGljZXMuY291bnQgPSByZWN0YW5nbGVDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDdXJzb3IobW9kZWw6IElSZW5kZXJNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHZlcnRpY2VzID0gdGhpcy5fdmVydGljZXNDdXJzb3I7XG4gICAgY29uc3QgY3Vyc29yID0gbW9kZWwuY3Vyc29yO1xuICAgIGlmICghY3Vyc29yIHx8IGN1cnNvci5zdHlsZSA9PT0gJ2Jsb2NrJykge1xuICAgICAgdmVydGljZXMuY291bnQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQ6IG51bWJlcjtcbiAgICBsZXQgcmVjdGFuZ2xlQ291bnQgPSAwO1xuXG4gICAgaWYgKGN1cnNvci5zdHlsZSA9PT0gJ2JhcicgfHwgY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIExlZnQgZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGN1cnNvci54ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgY3Vyc29yLnkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgY3Vyc29yLnN0eWxlID09PSAnYmFyJyA/IGN1cnNvci5kcHIgKiBjdXJzb3IuY3Vyc29yV2lkdGggOiBjdXJzb3IuZHByLFxuICAgICAgICB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgdGhpcy5fY3Vyc29yRmxvYXRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJzb3Iuc3R5bGUgPT09ICd1bmRlcmxpbmUnIHx8IGN1cnNvci5zdHlsZSA9PT0gJ291dGxpbmUnKSB7XG4gICAgICAvLyBCb3R0b20gZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGN1cnNvci54ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgKGN1cnNvci55ICsgMSkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAtIGN1cnNvci5kcHIsXG4gICAgICAgIGN1cnNvci53aWR0aCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2N1cnNvckZsb2F0XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIFRvcCBlZGdlXG4gICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICAgIHZlcnRpY2VzLmF0dHJpYnV0ZXMsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgY3Vyc29yLnggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IueSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICBjdXJzb3Iud2lkdGggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IuZHByLFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICAgIC8vIFJpZ2h0IGVkZ2VcbiAgICAgIG9mZnNldCA9IHJlY3RhbmdsZUNvdW50KysgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG4gICAgICB0aGlzLl9hZGRSZWN0YW5nbGVGbG9hdChcbiAgICAgICAgdmVydGljZXMuYXR0cmlidXRlcyxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICAoY3Vyc29yLnggKyBjdXJzb3Iud2lkdGgpICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAtIGN1cnNvci5kcHIsXG4gICAgICAgIGN1cnNvci55ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2ZXJ0aWNlcy5jb3VudCA9IHJlY3RhbmdsZUNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzOiBWZXJ0aWNlcywgb2Zmc2V0OiBudW1iZXIsIGZnOiBudW1iZXIsIGJnOiBudW1iZXIsIHN0YXJ0WDogbnVtYmVyLCBlbmRYOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChmZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgc3dpdGNoIChmZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAkcmdiYSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtmZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgJHJnYmEgPSAoZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAkcmdiYSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2JnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAkcmdiYSA9IChiZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZlcnRpY2VzLmF0dHJpYnV0ZXMubGVuZ3RoIDwgb2Zmc2V0ICsgNCkge1xuICAgICAgdmVydGljZXMuYXR0cmlidXRlcyA9IGV4cGFuZEZsb2F0MzJBcnJheSh2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5fdGVybWluYWwuY29scyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRSk7XG4gICAgfVxuICAgICR4MSA9IHN0YXJ0WCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGg7XG4gICAgJHkxID0geSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgICRyID0gKCgkcmdiYSA+PiAyNCkgJiAweEZGKSAvIDI1NTtcbiAgICAkZyA9ICgoJHJnYmEgPj4gMTYpICYgMHhGRikgLyAyNTU7XG4gICAgJGIgPSAoKCRyZ2JhID4+IDggKSAmIDB4RkYpIC8gMjU1O1xuICAgICRhID0gMTtcblxuICAgIHRoaXMuX2FkZFJlY3RhbmdsZSh2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCBvZmZzZXQsICR4MSwgJHkxLCAoZW5kWCAtIHN0YXJ0WCkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLCB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCwgJHIsICRnLCAkYiwgJGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkUmVjdGFuZ2xlKGFycmF5OiBGbG9hdDMyQXJyYXksIG9mZnNldDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyKTogdm9pZCB7XG4gICAgYXJyYXlbb2Zmc2V0ICAgIF0gPSB4MSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHkxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICBhcnJheVtvZmZzZXQgKyAyXSA9IHdpZHRoIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDNdID0gaGVpZ2h0IC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICBhcnJheVtvZmZzZXQgKyA0XSA9IHI7XG4gICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSBnO1xuICAgIGFycmF5W29mZnNldCArIDZdID0gYjtcbiAgICBhcnJheVtvZmZzZXQgKyA3XSA9IGE7XG4gIH1cblxuICBwcml2YXRlIF9hZGRSZWN0YW5nbGVGbG9hdChhcnJheTogRmxvYXQzMkFycmF5LCBvZmZzZXQ6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNvbG9yOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICBhcnJheVtvZmZzZXQgICAgXSA9IHgxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDFdID0geTEgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDJdID0gd2lkdGggLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgYXJyYXlbb2Zmc2V0ICsgM10gPSBoZWlnaHQgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDRdID0gY29sb3JbMF07XG4gICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSBjb2xvclsxXTtcbiAgICBhcnJheVtvZmZzZXQgKyA2XSA9IGNvbG9yWzJdO1xuICAgIGFycmF5W29mZnNldCArIDddID0gY29sb3JbM107XG4gIH1cblxuICBwcml2YXRlIF9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9yOiBJQ29sb3IpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICgoY29sb3IucmdiYSA+PiAyNCkgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSA+PiAxNikgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSA+PiA4ICkgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSAgICAgICkgJiAweEZGKSAvIDI1NVxuICAgIF0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDdXJzb3JSZW5kZXJNb2RlbCwgSVJlbmRlck1vZGVsIH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1NlbGVjdGlvblJlbmRlck1vZGVsJztcblxuZXhwb3J0IGNvbnN0IFJFTkRFUl9NT0RFTF9JTkRJQ0lFU19QRVJfQ0VMTCA9IDQ7XG5leHBvcnQgY29uc3QgUkVOREVSX01PREVMX0JHX09GRlNFVCA9IDE7XG5leHBvcnQgY29uc3QgUkVOREVSX01PREVMX0ZHX09GRlNFVCA9IDI7XG5leHBvcnQgY29uc3QgUkVOREVSX01PREVMX0VYVF9PRkZTRVQgPSAzO1xuXG5leHBvcnQgY29uc3QgQ09NQklORURfQ0hBUl9CSVRfTUFTSyA9IDB4ODAwMDAwMDA7XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJNb2RlbCBpbXBsZW1lbnRzIElSZW5kZXJNb2RlbCB7XG4gIHB1YmxpYyBjZWxsczogVWludDMyQXJyYXk7XG4gIHB1YmxpYyBsaW5lTGVuZ3RoczogVWludDMyQXJyYXk7XG4gIHB1YmxpYyBzZWxlY3Rpb246IElTZWxlY3Rpb25SZW5kZXJNb2RlbDtcbiAgcHVibGljIGN1cnNvcj86IElDdXJzb3JSZW5kZXJNb2RlbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNlbGxzID0gbmV3IFVpbnQzMkFycmF5KDApO1xuICAgIHRoaXMubGluZUxlbmd0aHMgPSBuZXcgVWludDMyQXJyYXkoMCk7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4Q291bnQgPSBjb2xzICogcm93cyAqIFJFTkRFUl9NT0RFTF9JTkRJQ0lFU19QRVJfQ0VMTDtcbiAgICBpZiAoaW5kZXhDb3VudCAhPT0gdGhpcy5jZWxscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2VsbHMgPSBuZXcgVWludDMyQXJyYXkoaW5kZXhDb3VudCk7XG4gICAgICB0aGlzLmxpbmVMZW5ndGhzID0gbmV3IFVpbnQzMkFycmF5KHJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxzLmZpbGwoMCwgMCk7XG4gICAgdGhpcy5saW5lTGVuZ3Rocy5maWxsKDAsIDApO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcbmltcG9ydCB7IElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgQ2VsbENvbG9yUmVzb2x2ZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DZWxsQ29sb3JSZXNvbHZlcic7XG5pbXBvcnQgeyBhY3F1aXJlVGV4dHVyZUF0bGFzLCByZW1vdmVUZXJtaW5hbEZyb21DYWNoZSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc0NhY2hlJztcbmltcG9ydCB7IEN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXInO1xuaW1wb3J0IHsgb2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0RldmljZVBpeGVsT2JzZXJ2ZXInO1xuaW1wb3J0IHsgY3JlYXRlUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMsIElSZW5kZXJlciwgSVJlcXVlc3RSZWRyYXdFdmVudCwgSVRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDaGFyU2l6ZVNlcnZpY2UsIElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgQ2hhckRhdGEsIElCdWZmZXJMaW5lLCBJQ2VsbERhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgQ29udGVudCwgTlVMTF9DRUxMX0NIQVIsIE5VTExfQ0VMTF9DT0RFIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSUNvcmVTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBHbHlwaFJlbmRlcmVyIH0gZnJvbSAnLi9HbHlwaFJlbmRlcmVyJztcbmltcG9ydCB7IFJlY3RhbmdsZVJlbmRlcmVyIH0gZnJvbSAnLi9SZWN0YW5nbGVSZW5kZXJlcic7XG5pbXBvcnQgeyBDT01CSU5FRF9DSEFSX0JJVF9NQVNLLCBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfRVhUX09GRlNFVCwgUkVOREVSX01PREVMX0ZHX09GRlNFVCwgUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMLCBSZW5kZXJNb2RlbCB9IGZyb20gJy4vUmVuZGVyTW9kZWwnO1xuaW1wb3J0IHsgSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IExpbmtSZW5kZXJMYXllciB9IGZyb20gJy4vcmVuZGVyTGF5ZXIvTGlua1JlbmRlckxheWVyJztcbmltcG9ydCB7IElSZW5kZXJMYXllciB9IGZyb20gJy4vcmVuZGVyTGF5ZXIvVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgV2ViZ2xSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJUmVuZGVyZXIge1xuICBwcml2YXRlIF9yZW5kZXJMYXllcnM6IElSZW5kZXJMYXllcltdO1xuICBwcml2YXRlIF9jdXJzb3JCbGlua1N0YXRlTWFuYWdlcjogTXV0YWJsZURpc3Bvc2FibGU8Q3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXI+ID0gbmV3IE11dGFibGVEaXNwb3NhYmxlKCk7XG4gIHByaXZhdGUgX2NoYXJBdGxhc0Rpc3Bvc2FibGUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcbiAgcHJpdmF0ZSBfY2hhckF0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9kZXZpY2VQaXhlbFJhdGlvOiBudW1iZXI7XG4gIHByaXZhdGUgX29ic2VydmVyRGlzcG9zYWJsZSA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHByaXZhdGUgX21vZGVsOiBSZW5kZXJNb2RlbCA9IG5ldyBSZW5kZXJNb2RlbCgpO1xuICBwcml2YXRlIF93b3JrQ2VsbDogSUNlbGxEYXRhID0gbmV3IENlbGxEYXRhKCk7XG4gIHByaXZhdGUgX3dvcmtDZWxsMjogSUNlbGxEYXRhID0gbmV3IENlbGxEYXRhKCk7XG4gIHByaXZhdGUgX2NlbGxDb2xvclJlc29sdmVyOiBDZWxsQ29sb3JSZXNvbHZlcjtcblxuICBwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIF9nbDogSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gIHByaXZhdGUgX3JlY3RhbmdsZVJlbmRlcmVyOiBNdXRhYmxlRGlzcG9zYWJsZTxSZWN0YW5nbGVSZW5kZXJlcj4gPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcbiAgcHJpdmF0ZSBfZ2x5cGhSZW5kZXJlcjogTXV0YWJsZURpc3Bvc2FibGU8R2x5cGhSZW5kZXJlcj4gPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnM7XG5cbiAgcHJpdmF0ZSBfY29yZTogSVRlcm1pbmFsO1xuICBwcml2YXRlIF9pc0F0dGFjaGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2VUZXh0dXJlQXRsYXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DaGFuZ2VUZXh0dXJlQXRsYXMgPSB0aGlzLl9vbkNoYW5nZVRleHR1cmVBdGxhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0UmVkcmF3ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElSZXF1ZXN0UmVkcmF3RXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0UmVkcmF3ID0gdGhpcy5fb25SZXF1ZXN0UmVkcmF3LmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNvbnRleHRMb3NzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Db250ZXh0TG9zcyA9IHRoaXMuX29uQ29udGV4dExvc3MuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJhY3RlckpvaW5lclNlcnZpY2U6IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJTaXplU2VydmljZTogSUNoYXJTaXplU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29yZVNlcnZpY2U6IElDb3JlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlLFxuICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcj86IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKCgpID0+IHRoaXMuX2hhbmRsZUNvbG9yQ2hhbmdlKCkpKTtcblxuICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyID0gbmV3IENlbGxDb2xvclJlc29sdmVyKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9vcHRpb25zU2VydmljZSwgdGhpcy5fbW9kZWwuc2VsZWN0aW9uLCB0aGlzLl9kZWNvcmF0aW9uU2VydmljZSwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLCB0aGlzLl90aGVtZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5fY29yZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuXG4gICAgdGhpcy5fcmVuZGVyTGF5ZXJzID0gW1xuICAgICAgbmV3IExpbmtSZW5kZXJMYXllcih0aGlzLl9jb3JlLnNjcmVlbkVsZW1lbnQhLCAyLCB0aGlzLl90ZXJtaW5hbCwgdGhpcy5fY29yZS5saW5raWZpZXIhLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UsIF9vcHRpb25zU2VydmljZSwgdGhpcy5fdGhlbWVTZXJ2aWNlKVxuICAgIF07XG4gICAgdGhpcy5kaW1lbnNpb25zID0gY3JlYXRlUmVuZGVyRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX2RldmljZVBpeGVsUmF0aW8gPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByO1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl91cGRhdGVDdXJzb3JCbGluaygpO1xuICAgIHRoaXMucmVnaXN0ZXIoX29wdGlvbnNTZXJ2aWNlLm9uT3B0aW9uQ2hhbmdlKCgpID0+IHRoaXMuX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCkpKTtcblxuICAgIHRoaXMuX2NhbnZhcyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICBjb25zdCBjb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICAgIGFudGlhbGlhczogZmFsc2UsXG4gICAgICBkZXB0aDogZmFsc2UsXG4gICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICB9O1xuICAgIHRoaXMuX2dsID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ3dlYmdsMicsIGNvbnRleHRBdHRyaWJ1dGVzKSBhcyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICBpZiAoIXRoaXMuX2dsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMMiBub3Qgc3VwcG9ydGVkICcgKyB0aGlzLl9nbCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fY2FudmFzLCAnd2ViZ2xjb250ZXh0bG9zdCcsIChlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnd2ViZ2xjb250ZXh0bG9zdCBldmVudCByZWNlaXZlZCcpO1xuICAgICAgLy8gUHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpbiBvcmRlciB0byBlbmFibGUgV2ViR0wgY29udGV4dCByZXN0b3JhdGlvbi5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFdhaXQgYSBmZXcgc2Vjb25kcyB0byBzZWUgaWYgdGhlICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcgZXZlbnQgaXMgZmlyZWQuXG4gICAgICAvLyBJZiBub3QsIGRpc3BhdGNoIHRoZSBvbkNvbnRleHRMb3NzIG5vdGlmaWNhdGlvbiB0byBvYnNlcnZlcnMuXG4gICAgICB0aGlzLl9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnNvbGUud2Fybignd2ViZ2wgY29udGV4dCBub3QgcmVzdG9yZWQ7IGZpcmluZyBvbkNvbnRleHRMb3NzJyk7XG4gICAgICAgIHRoaXMuX29uQ29udGV4dExvc3MuZmlyZShlKTtcbiAgICAgIH0sIDMwMDAgLyogbXMgKi8pO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9jYW52YXMsICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIChlKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ3dlYmdsY29udGV4dHJlc3RvcmVkIGV2ZW50IHJlY2VpdmVkJyk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCk7XG4gICAgICB0aGlzLl9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgLy8gVGhlIHRleHR1cmUgYXRsYXMgYW5kIGdseXBoIHJlbmRlcmVyIG11c3QgYmUgZnVsbHkgcmVpbml0aWFsaXplZFxuICAgICAgLy8gYmVjYXVzZSB0aGVpciBjb250ZW50cyBoYXZlIGJlZW4gbG9zdC5cbiAgICAgIHJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlKHRoaXMuX3Rlcm1pbmFsKTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVXZWJHTFN0YXRlKCk7XG4gICAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLl9vYnNlcnZlckRpc3Bvc2FibGUudmFsdWUgPSBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHRoaXMuX2NhbnZhcywgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdywgKHcsIGgpID0+IHRoaXMuX3NldENhbnZhc0RldmljZVBpeGVsRGltZW5zaW9ucyh3LCBoKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25XaW5kb3dDaGFuZ2UodyA9PiB7XG4gICAgICB0aGlzLl9vYnNlcnZlckRpc3Bvc2FibGUudmFsdWUgPSBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHRoaXMuX2NhbnZhcywgdywgKHcsIGgpID0+IHRoaXMuX3NldENhbnZhc0RldmljZVBpeGVsRGltZW5zaW9ucyh3LCBoKSk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5fY29yZS5zY3JlZW5FbGVtZW50IS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpO1xuXG4gICAgW3RoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlLCB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlXSA9IHRoaXMuX2luaXRpYWxpemVXZWJHTFN0YXRlKCk7XG5cbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgICBsLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbnZhcy5wYXJlbnRFbGVtZW50Py5yZW1vdmVDaGlsZCh0aGlzLl9jYW52YXMpO1xuICAgICAgcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGhpcy5fdGVybWluYWwpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGV4dHVyZUF0bGFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhckF0bGFzPy5wYWdlc1swXS5jYW52YXM7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDb2xvckNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKCk7XG5cbiAgICAvLyBGb3JjZSBhIGZ1bGwgcmVmcmVzaFxuICAgIHRoaXMuX2NsZWFyTW9kZWwodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZSgpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvIGNoYW5nZWQsIHRoZSBjaGFyIGF0bGFzIG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkXG4gICAgLy8gYW5kIHRoZSB0ZXJtaW5hbCBuZWVkcyB0byByZWZyZXNoZWRcbiAgICBpZiAodGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyAhPT0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcikge1xuICAgICAgdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgICB0aGlzLmhhbmRsZVJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIGNoYXJhY3RlciBhbmQgY2FudmFzIGRpbWVuc2lvbnNcbiAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG5cbiAgICB0aGlzLl9tb2RlbC5yZXNpemUodGhpcy5fdGVybWluYWwuY29scywgdGhpcy5fdGVybWluYWwucm93cyk7XG5cbiAgICAvLyBSZXNpemUgYWxsIHJlbmRlciBsYXllcnNcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLnJlc2l6ZSh0aGlzLl90ZXJtaW5hbCwgdGhpcy5kaW1lbnNpb25zKTtcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgdGhlIGNhbnZhc1xuICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLndpZHRoID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHR9cHhgO1xuXG4gICAgLy8gUmVzaXplIHRoZSBzY3JlZW5cbiAgICB0aGlzLl9jb3JlLnNjcmVlbkVsZW1lbnQhLnN0eWxlLndpZHRoID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0fXB4YDtcblxuICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlPy5zZXREaW1lbnNpb25zKHRoaXMuZGltZW5zaW9ucyk7XG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWU/LmhhbmRsZVJlc2l6ZSgpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWU/LnNldERpbWVuc2lvbnModGhpcy5kaW1lbnNpb25zKTtcbiAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlPy5oYW5kbGVSZXNpemUoKTtcblxuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXMoKTtcblxuICAgIC8vIEZvcmNlIGEgZnVsbCByZWZyZXNoLiBSZXNpemluZyBgX2dseXBoUmVuZGVyZXJgIHNob3VsZCBjbGVhciBpdCBhbHJlYWR5LFxuICAgIC8vIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2xlYXIgaXQgYWdhaW4gaGVyZS5cbiAgICB0aGlzLl9jbGVhck1vZGVsKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVSZXNpemUodGhpcy5fdGVybWluYWwuY29scywgdGhpcy5fdGVybWluYWwucm93cyk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQmx1cigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLmhhbmRsZUJsdXIodGhpcy5fdGVybWluYWwpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucGF1c2UoKTtcbiAgICAvLyBSZXF1ZXN0IGEgcmVkcmF3IGZvciBhY3RpdmUvaW5hY3RpdmUgc2VsZWN0aW9uIGJhY2tncm91bmRcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVGb2N1cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLmhhbmRsZUZvY3VzKHRoaXMuX3Rlcm1pbmFsKTtcbiAgICB9XG4gICAgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWU/LnJlc3VtZSgpO1xuICAgIC8vIFJlcXVlc3QgYSByZWRyYXcgZm9yIGFjdGl2ZS9pbmFjdGl2ZSBzZWxlY3Rpb24gYmFja2dyb3VuZFxuICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCh0aGlzLl90ZXJtaW5hbCwgc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSk7XG4gICAgfVxuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbi51cGRhdGUodGhpcy5fY29yZSwgc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSk7XG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ3Vyc29yTW92ZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLmhhbmRsZUN1cnNvck1vdmUodGhpcy5fdGVybWluYWwpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcygpO1xuICAgIHRoaXMuX3VwZGF0ZUN1cnNvckJsaW5rKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgbWVtYmVycyBkZXBlbmRlbnQgb24gV2ViR0wgY29udGV4dCBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgX2luaXRpYWxpemVXZWJHTFN0YXRlKCk6IFtSZWN0YW5nbGVSZW5kZXJlciwgR2x5cGhSZW5kZXJlcl0ge1xuICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlID0gbmV3IFJlY3RhbmdsZVJlbmRlcmVyKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9nbCwgdGhpcy5kaW1lbnNpb25zLCB0aGlzLl90aGVtZVNlcnZpY2UpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUgPSBuZXcgR2x5cGhSZW5kZXJlcih0aGlzLl90ZXJtaW5hbCwgdGhpcy5fZ2wsIHRoaXMuZGltZW5zaW9ucywgdGhpcy5fb3B0aW9uc1NlcnZpY2UpO1xuXG4gICAgLy8gVXBkYXRlIGRpbWVuc2lvbnMgYW5kIGFjcXVpcmUgY2hhciBhdGxhc1xuICAgIHRoaXMuaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCk7XG5cbiAgICByZXR1cm4gW3RoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlLCB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIGNoYXIgYXRsYXMsIGFxdWlyaW5nIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICBwcml2YXRlIF9yZWZyZXNoQ2hhckF0bGFzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggPD0gMCAmJiB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIuaGVpZ2h0IDw9IDApIHtcbiAgICAgIC8vIE1hcmsgYXMgbm90IGF0dGFjaGVkIHNvIGNoYXIgYXRsYXMgZ2V0cyByZWZyZXNoZWQgb24gbmV4dCByZW5kZXJcbiAgICAgIHRoaXMuX2lzQXR0YWNoZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdGxhcyA9IGFjcXVpcmVUZXh0dXJlQXRsYXMoXG4gICAgICB0aGlzLl90ZXJtaW5hbCxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMsXG4gICAgICB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCxcbiAgICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQsXG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByXG4gICAgKTtcbiAgICBpZiAodGhpcy5fY2hhckF0bGFzICE9PSBhdGxhcykge1xuICAgICAgdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMuZmlyZShhdGxhcy5wYWdlc1swXS5jYW52YXMpO1xuICAgICAgdGhpcy5fY2hhckF0bGFzRGlzcG9zYWJsZS52YWx1ZSA9IGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoW1xuICAgICAgICBmb3J3YXJkRXZlbnQoYXRsYXMub25BZGRUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzKSxcbiAgICAgICAgZm9yd2FyZEV2ZW50KGF0bGFzLm9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLCB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcylcbiAgICAgIF0pO1xuICAgIH1cbiAgICB0aGlzLl9jaGFyQXRsYXMgPSBhdGxhcztcbiAgICB0aGlzLl9jaGFyQXRsYXMud2FybVVwKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZT8uc2V0QXRsYXModGhpcy5fY2hhckF0bGFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSBjbGVhckdseXBoUmVuZGVyZXIgV2hldGhlciB0byBhbHNvIGNsZWFyIHRoZSBnbHlwaCByZW5kZXJlci4gVGhpc1xuICAgKiBzaG91bGQgYmUgdHJ1ZSBnZW5lcmFsbHkgdG8gbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBtb2RlbC5cbiAgICovXG4gIHByaXZhdGUgX2NsZWFyTW9kZWwoY2xlYXJHbHlwaFJlbmRlcmVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kZWwuY2xlYXIoKTtcbiAgICBpZiAoY2xlYXJHbHlwaFJlbmRlcmVyKSB7XG4gICAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlPy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFyQXRsYXM/LmNsZWFyVGV4dHVyZSgpO1xuICAgIHRoaXMuX2NsZWFyTW9kZWwodHJ1ZSk7XG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLnJlc2V0KHRoaXMuX3Rlcm1pbmFsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gICAgdGhpcy5fdXBkYXRlQ3Vyc29yQmxpbmsoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNoYXJhY3RlckpvaW5lcihoYW5kbGVyOiAodGV4dDogc3RyaW5nKSA9PiBbbnVtYmVyLCBudW1iZXJdW10pOiBudW1iZXIge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGpvaW5lcklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyUm93cyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNBdHRhY2hlZCkge1xuICAgICAgaWYgKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLl9jb3JlLnNjcmVlbkVsZW1lbnQhKSAmJiB0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uud2lkdGggJiYgdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCkge1xuICAgICAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXMoKTtcbiAgICAgICAgdGhpcy5faXNBdHRhY2hlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHJlbmRlciBsYXllcnNcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLmhhbmRsZUdyaWRDaGFuZ2VkKHRoaXMuX3Rlcm1pbmFsLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUgfHwgIXRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGVsbCByZW5kZXJlciB0aGUgZnJhbWUgaXMgYmVnaW5uaW5nXG4gICAgLy8gdXBvbiBhIG1vZGVsIGNsZWFyIGFsc28gcmVmcmVzaCB0aGUgZnVsbCB2aWV3cG9ydCBtb2RlbFxuICAgIC8vIChhbHNvIHRyaWdnZXJlZCBieSBhbiBhdGxhcyBwYWdlIG1lcmdlLCBwYXJ0IG9mICM0NDgwKVxuICAgIGlmICh0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlLmJlZ2luRnJhbWUoKSkge1xuICAgICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgICAgIHRoaXMuX3VwZGF0ZU1vZGVsKDAsIHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCB1cGRhdGUgY2hhbmdlZCBsaW5lcyB0byBkcmF3XG4gICAgICB0aGlzLl91cGRhdGVNb2RlbChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXJcbiAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZS5yZW5kZXJCYWNrZ3JvdW5kcygpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUucmVuZGVyKHRoaXMuX21vZGVsKTtcbiAgICBpZiAoIXRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlIHx8IHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlLmlzQ3Vyc29yVmlzaWJsZSkge1xuICAgICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUucmVuZGVyQ3Vyc29yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ3Vyc29yQmxpbmsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuY3Vyc29yQmxpbmspIHtcbiAgICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlID0gbmV3IEN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFJlZHJhd0N1cnNvcigpO1xuICAgICAgfSwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIuY2xlYXIoKTtcbiAgICB9XG4gICAgLy8gUmVxdWVzdCBhIHJlZnJlc2ggZnJvbSB0aGUgdGVybWluYWwgYXMgbWFuYWdlbWVudCBvZiByZW5kZXJpbmcgaXMgYmVpbmdcbiAgICAvLyBtb3ZlZCBiYWNrIHRvIHRoZSB0ZXJtaW5hbFxuICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdDdXJzb3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZU1vZGVsKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl9jb3JlO1xuICAgIGxldCBjZWxsOiBJQ2VsbERhdGEgPSB0aGlzLl93b3JrQ2VsbDtcblxuICAgIC8vIERlY2xhcmUgdmFyaWFibGUgYWhlYWQgb2YgdGltZSB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbiAgICBsZXQgbGFzdEJnOiBudW1iZXI7XG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBsZXQgcm93OiBudW1iZXI7XG4gICAgbGV0IGxpbmU6IElCdWZmZXJMaW5lO1xuICAgIGxldCBqb2luZWRSYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICBsZXQgaXNKb2luZWQ6IGJvb2xlYW47XG4gICAgbGV0IGxhc3RDaGFyWDogbnVtYmVyO1xuICAgIGxldCByYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgICBsZXQgY2hhcnM6IHN0cmluZztcbiAgICBsZXQgY29kZTogbnVtYmVyO1xuICAgIGxldCB3aWR0aDogbnVtYmVyO1xuICAgIGxldCBpOiBudW1iZXI7XG4gICAgbGV0IHg6IG51bWJlcjtcbiAgICBsZXQgajogbnVtYmVyO1xuICAgIHN0YXJ0ID0gY2xhbXAoc3RhcnQsIHRlcm1pbmFsLnJvd3MgLSAxLCAwKTtcbiAgICBlbmQgPSBjbGFtcChlbmQsIHRlcm1pbmFsLnJvd3MgLSAxLCAwKTtcblxuICAgIGNvbnN0IGN1cnNvclkgPSB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZICsgdGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JZO1xuICAgIGNvbnN0IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZID0gY3Vyc29yWSAtIHRlcm1pbmFsLmJ1ZmZlci55ZGlzcDtcbiAgICAvLyBpbiBjYXNlIGN1cnNvci54ID09IGNvbHMgYWRqdXN0IHZpc3VhbCBjdXJzb3IgdG8gY29scyAtIDFcbiAgICBjb25zdCBjdXJzb3JYID0gTWF0aC5taW4odGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JYLCB0ZXJtaW5hbC5jb2xzIC0gMSk7XG4gICAgbGV0IGxhc3RDdXJzb3JYID0gLTE7XG4gICAgY29uc3QgaXNDdXJzb3JWaXNpYmxlID1cbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQgJiZcbiAgICAgICF0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiAmJlxuICAgICAgKCF0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZSB8fCB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZS5pc0N1cnNvclZpc2libGUpO1xuICAgIHRoaXMuX21vZGVsLmN1cnNvciA9IHVuZGVmaW5lZDtcbiAgICBsZXQgbW9kZWxVcGRhdGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKHkgPSBzdGFydDsgeSA8PSBlbmQ7IHkrKykge1xuICAgICAgcm93ID0geSArIHRlcm1pbmFsLmJ1ZmZlci55ZGlzcDtcbiAgICAgIGxpbmUgPSB0ZXJtaW5hbC5idWZmZXIubGluZXMuZ2V0KHJvdykhO1xuICAgICAgdGhpcy5fbW9kZWwubGluZUxlbmd0aHNbeV0gPSAwO1xuICAgICAgam9pbmVkUmFuZ2VzID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5nZXRKb2luZWRDaGFyYWN0ZXJzKHJvdyk7XG4gICAgICBmb3IgKHggPSAwOyB4IDwgdGVybWluYWwuY29sczsgeCsrKSB7XG4gICAgICAgIGxhc3RCZyA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgbGluZS5sb2FkQ2VsbCh4LCBjZWxsKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgIGxhc3RCZyA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGNoYXJhY3RlcihzKSB0byBkcmF3IHdlcmUgam9pbmVkLlxuICAgICAgICBpc0pvaW5lZCA9IGZhbHNlO1xuICAgICAgICBsYXN0Q2hhclggPSB4O1xuXG4gICAgICAgIC8vIFByb2Nlc3MgYW55IGpvaW5lZCBjaGFyYWN0ZXIgcmFuZ2VzIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiBob3cgdGhlXG4gICAgICAgIC8vIHJhbmdlcyBhcmUgcHJvZHVjZWQsIHdlIGtub3cgdGhhdCB0aGV5IGFyZSB2YWxpZCBmb3IgdGhlIGNoYXJhY3RlcnNcbiAgICAgICAgLy8gYW5kIGF0dHJpYnV0ZXMgb2Ygb3VyIGlucHV0LlxuICAgICAgICBpZiAoam9pbmVkUmFuZ2VzLmxlbmd0aCA+IDAgJiYgeCA9PT0gam9pbmVkUmFuZ2VzWzBdWzBdKSB7XG4gICAgICAgICAgaXNKb2luZWQgPSB0cnVlO1xuICAgICAgICAgIHJhbmdlID0gam9pbmVkUmFuZ2VzLnNoaWZ0KCkhO1xuXG4gICAgICAgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSBleGFjdCBzdGFydCBhbmQgZW5kIGNvbHVtbiBvZiB0aGUgam9pbmVkIHJhbmdlLFxuICAgICAgICAgIC8vIHNvIHdlIGdldCB0aGUgc3RyaW5nIGFuZCB3aWR0aCByZXByZXNlbnRpbmcgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgY2VsbCA9IG5ldyBKb2luZWRDZWxsRGF0YShcbiAgICAgICAgICAgIGNlbGwsXG4gICAgICAgICAgICBsaW5lIS50cmFuc2xhdGVUb1N0cmluZyh0cnVlLCByYW5nZVswXSwgcmFuZ2VbMV0pLFxuICAgICAgICAgICAgcmFuZ2VbMV0gLSByYW5nZVswXVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGNlbGxzIG9jY3VwaWVkIGJ5IHRoaXMgcmFuZ2UgaW4gdGhlIGxvb3BcbiAgICAgICAgICBsYXN0Q2hhclggPSByYW5nZVsxXSAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFycyA9IGNlbGwuZ2V0Q2hhcnMoKTtcbiAgICAgICAgY29kZSA9IGNlbGwuZ2V0Q29kZSgpO1xuICAgICAgICBpID0gKCh5ICogdGVybWluYWwuY29scykgKyB4KSAqIFJFTkRFUl9NT0RFTF9JTkRJQ0lFU19QRVJfQ0VMTDtcblxuICAgICAgICAvLyBMb2FkIGNvbG9ycy9yZXNvbHZlIG92ZXJyaWRlcyBpbnRvIHdvcmsgY29sb3JzXG4gICAgICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc29sdmUoY2VsbCwgeCwgcm93LCB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgpO1xuXG4gICAgICAgIC8vIE92ZXJyaWRlIGNvbG9ycyBmb3IgY3Vyc29yIGNlbGxcbiAgICAgICAgaWYgKGlzQ3Vyc29yVmlzaWJsZSAmJiByb3cgPT09IGN1cnNvclkpIHtcbiAgICAgICAgICBpZiAoeCA9PT0gY3Vyc29yWCkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY3Vyc29yID0ge1xuICAgICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgICB5OiB2aWV3cG9ydFJlbGF0aXZlQ3Vyc29yWSxcbiAgICAgICAgICAgICAgd2lkdGg6IGNlbGwuZ2V0V2lkdGgoKSxcbiAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgP1xuICAgICAgICAgICAgICAgICh0ZXJtaW5hbC5vcHRpb25zLmN1cnNvclN0eWxlIHx8ICdibG9jaycpIDogdGVybWluYWwub3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlLFxuICAgICAgICAgICAgICBjdXJzb3JXaWR0aDogdGVybWluYWwub3B0aW9ucy5jdXJzb3JXaWR0aCxcbiAgICAgICAgICAgICAgZHByOiB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGFzdEN1cnNvclggPSBjdXJzb3JYICsgY2VsbC5nZXRXaWR0aCgpIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggPj0gY3Vyc29yWCAmJiB4IDw9IGxhc3RDdXJzb3JYICYmXG4gICAgICAgICAgICAgICgodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCAmJlxuICAgICAgICAgICAgICAodGVybWluYWwub3B0aW9ucy5jdXJzb3JTdHlsZSB8fCAnYmxvY2snKSA9PT0gJ2Jsb2NrJykgfHxcbiAgICAgICAgICAgICAgKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgIHRlcm1pbmFsLm9wdGlvbnMuY3Vyc29ySW5hY3RpdmVTdHlsZSA9PT0gJ2Jsb2NrJykpKSB7XG4gICAgICAgICAgICB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZmcgPVxuICAgICAgICAgICAgICBBdHRyaWJ1dGVzLkNNX1JHQiB8ICh0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmN1cnNvckFjY2VudC5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICAgICAgICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZyA9XG4gICAgICAgICAgICAgIEF0dHJpYnV0ZXMuQ01fUkdCIHwgKHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuY3Vyc29yLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlICE9PSBOVUxMX0NFTExfQ09ERSkge1xuICAgICAgICAgIHRoaXMuX21vZGVsLmxpbmVMZW5ndGhzW3ldID0geCArIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RoaW5nIGhhcyBjaGFuZ2VkLCBubyB1cGRhdGVzIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy5fbW9kZWwuY2VsbHNbaV0gPT09IGNvZGUgJiZcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXSA9PT0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnICYmXG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0ZHX09GRlNFVF0gPT09IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZyAmJlxuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUXSA9PT0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmV4dCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbW9kZWxVcGRhdGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBGbGFnIGNvbWJpbmVkIGNoYXJzIHdpdGggYSBiaXQgbWFzayBzbyB0aGV5J3JlIGVhc2lseSBpZGVudGlmaWFibGVcbiAgICAgICAgaWYgKGNoYXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBjb2RlIHw9IENPTUJJTkVEX0NIQVJfQklUX01BU0s7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0cyBpbiB0aGUgbW9kZWxcbiAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaV0gPSBjb2RlO1xuICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0JHX09GRlNFVF0gPSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuYmc7XG4gICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZztcbiAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQ7XG5cbiAgICAgICAgd2lkdGggPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUhLnVwZGF0ZUNlbGwoeCwgeSwgY29kZSwgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnLCB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZmcsIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQsIGNoYXJzLCB3aWR0aCwgbGFzdEJnKTtcblxuICAgICAgICBpZiAoaXNKb2luZWQpIHtcbiAgICAgICAgICAvLyBSZXN0b3JlIHdvcmsgY2VsbFxuICAgICAgICAgIGNlbGwgPSB0aGlzLl93b3JrQ2VsbDtcblxuICAgICAgICAgIC8vIE51bGwgb3V0IG5vbi1maXJzdCBjZWxsc1xuICAgICAgICAgIGZvciAoeCsrOyB4IDwgbGFzdENoYXJYOyB4KyspIHtcbiAgICAgICAgICAgIGogPSAoKHkgKiB0ZXJtaW5hbC5jb2xzKSArIHgpICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuICAgICAgICAgICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSEudXBkYXRlQ2VsbCh4LCB5LCBOVUxMX0NFTExfQ09ERSwgMCwgMCwgMCwgTlVMTF9DRUxMX0NIQVIsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbal0gPSBOVUxMX0NFTExfQ09ERTtcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2ogKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2ogKyBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZztcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2ogKyBSRU5ERVJfTU9ERUxfRVhUX09GRlNFVF0gPSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobW9kZWxVcGRhdGVkKSB7XG4gICAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZSEudXBkYXRlQmFja2dyb3VuZHModGhpcy5fbW9kZWwpO1xuICAgIH1cbiAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZSEudXBkYXRlQ3Vyc29yKHRoaXMuX21vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNhbGN1bGF0ZXMgdGhlIGNoYXJhY3RlciBhbmQgY2FudmFzIGRpbWVuc2lvbnMuXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVEaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIC8vIFBlcmZvcm0gYSBuZXcgbWVhc3VyZSBpZiB0aGUgQ2hhck1lYXN1cmUgZGltZW5zaW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXMuX2NoYXJTaXplU2VydmljZS53aWR0aCB8fCAhdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV2aWNlIGNoYXJhY3RlciB3aWR0aC4gV2lkdGggaXMgZmxvb3JlZCBhcyBpdCBtdXN0IGJlIGRyYXduIHRvIGFuIGludGVnZXIgZ3JpZFxuICAgIC8vIGluIG9yZGVyIGZvciB0aGUgY2hhciBhdGxhcyBnbHlwaHMgdG8gbm90IGJlIGJsdXJyeS5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggPSBNYXRoLmZsb29yKHRoaXMuX2NoYXJTaXplU2VydmljZS53aWR0aCAqIHRoaXMuX2RldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXZpY2UgY2hhcmFjdGVyIGhlaWdodC4gSGVpZ2h0IGlzIGNlaWxlZCBpbiBjYXNlIGRldmljZVBpeGVsUmF0aW8gaXMgYVxuICAgIC8vIGZsb2F0aW5nIHBvaW50IG51bWJlciBpbiBvcmRlciB0byBlbnN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIGRyYXcgdGhlIGNoYXJhY3RlciB0byB0aGVcbiAgICAvLyBjZWxsLlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCAqIHRoaXMuX2RldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXZpY2UgY2VsbCBoZWlnaHQsIGlmIGxpbmVIZWlnaHQgaXMgX25vdF8gMSwgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlXG4gICAgLy8gZmxvb3JlZCBzaW5jZSBsaW5lSGVpZ2h0IGNhbiBuZXZlciBiZSBsb3dlciB0aGVuIDEsIHRoaXMgZ3VhcmVudGVlcyB0aGUgZGV2aWNlIGNlbGwgaGVpZ2h0XG4gICAgLy8gd2lsbCBhbHdheXMgYmUgbGFyZ2VyIHRoYW4gZGV2aWNlIGNoYXIgaGVpZ2h0LlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgKiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmVIZWlnaHQpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSB5IG9mZnNldCB3aXRoaW4gYSBjZWxsIHRoYXQgZ2x5cGggc2hvdWxkIGRyYXcgYXQgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIGNlbnRlcmVkXG4gICAgLy8gY29ycmVjdGx5IHdpdGhpbiB0aGUgY2VsbC5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIudG9wID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5saW5lSGVpZ2h0ID09PSAxID8gMCA6IE1hdGgucm91bmQoKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgLSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIuaGVpZ2h0KSAvIDIpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXZpY2UgY2VsbCB3aWR0aCwgdGFraW5nIHRoZSBsZXR0ZXJTcGFjaW5nIGludG8gYWNjb3VudC5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggKyBNYXRoLnJvdW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGV0dGVyU3BhY2luZyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHggb2Zmc2V0IHdpdGggYSBjZWxsIHRoYXQgdGV4dCBzaG91bGQgZHJhdyBmcm9tIGluIG9yZGVyIGZvciBpdCB0byBiZSBjZW50ZXJlZFxuICAgIC8vIGNvcnJlY3RseSB3aXRoaW4gdGhlIGNlbGwuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmxlZnQgPSBNYXRoLmZsb29yKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGV0dGVyU3BhY2luZyAvIDIpO1xuXG4gICAgLy8gUmVjYWxjdWxhdGUgdGhlIGNhbnZhcyBkaW1lbnNpb25zLCB0aGUgZGV2aWNlIGRpbWVuc2lvbnMgZGVmaW5lIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHBpeGVsIGluXG4gICAgLy8gdGhlIGNhbnZhc1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgKiB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoID0gdGhpcy5fdGVybWluYWwuY29scyAqIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aDtcblxuICAgIC8vIFRoZSB0aGUgc2l6ZSBvZiB0aGUgY2FudmFzIG9uIHRoZSBwYWdlLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoaXMgcm91bmRzIHRvIG5lYXJlc3QgaW50ZWdlclxuICAgIC8vIGFuZCBub3QgY2VpbHMgYXMgYnJvd3NlcnMgb2Z0ZW4gaGF2ZSBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaXNzdWVzIHdoZXJlXG4gICAgLy8gYHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvYCBlbmRzIHVwIGJlaW5nIHNvbWV0aGluZyBsaWtlIGAxLjEwMDAwMDAyMzg0MTg1OGAgZm9yIGV4YW1wbGUsIHdoZW5cbiAgICAvLyBpdCdzIGFjdHVhbGx5IDEuMS4gQ2VpbGluZyBtYXkgY2F1c2VzIGJsdXJyaW5lc3MgYXMgdGhlIGJhY2tpbmcgY2FudmFzIGltYWdlIGlzIDEgcGl4ZWwgdG9vXG4gICAgLy8gbGFyZ2UgZm9yIHRoZSBjYW52YXMgZWxlbWVudCBzaXplLlxuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0IC8gdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoIC8gdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICAvLyBHZXQgdGhlIENTUyBkaW1lbnNpb25zIG9mIGFuIGluZGl2aWR1YWwgY2VsbC4gVGhpcyBuZWVkcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlIGNhbGN1bGF0ZWRcbiAgICAvLyBkZXZpY2UgcGl4ZWwgY2FudmFzIHZhbHVlIGFib3ZlLiBDaGFyTWVhc3VyZS53aWR0aC9oZWlnaHQgYnkgaXRzZWxmIGlzIGluc3VmZmljaWVudCB3aGVuIHRoZVxuICAgIC8vIHBhZ2UgaXMgbm90IGF0IDEwMCUgem9vbSBsZXZlbCBhcyBDaGFyTWVhc3VyZSBpcyBtZWFzdXJlZCBpbiBDU1MgcGl4ZWxzLCBidXQgdGhlIGFjdHVhbCBjaGFyXG4gICAgLy8gc2l6ZSBvbiB0aGUgY2FudmFzIGNhbiBkaWZmZXIuXG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgLyB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvO1xuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAvIHRoaXMuX2RldmljZVBpeGVsUmF0aW87XG4gIH1cblxuICBwcml2YXRlIF9zZXRDYW52YXNEZXZpY2VQaXhlbERpbWVuc2lvbnMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FudmFzLndpZHRoID09PSB3aWR0aCAmJiB0aGlzLl9jYW52YXMuaGVpZ2h0ID09PSBoZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2hpbGUgdGhlIGFjdHVhbCBjYW52YXMgc2l6ZSBoYXMgY2hhbmdlZCwga2VlcCBkZXZpY2UgY2FudmFzIGRpbWVuc2lvbnMgYXMgdGhlIHZhbHVlIGJlZm9yZVxuICAgIC8vIHRoZSBjaGFuZ2UgYXMgaXQncyBhbiBleGFjdCBtdWx0aXBsZSBvZiB0aGUgY2VsbCBzaXplcy5cbiAgICB0aGlzLl9jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuX29uUmVxdWVzdFJlZHJhdy5maXJlKHsgc3RhcnQ6IDAsIGVuZDogdGhpcy5fdGVybWluYWwucm93cyAtIDEgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0UmVkcmF3Q3Vyc29yKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnNvclkgPSB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmN1cnNvclk7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVkcmF3LmZpcmUoeyBzdGFydDogY3Vyc29yWSwgZW5kOiBjdXJzb3JZIH0pO1xuICB9XG59XG5cbi8vIFRPRE86IFNoYXJlIGltcGwgd2l0aCBjb3JlXG5leHBvcnQgY2xhc3MgSm9pbmVkQ2VsbERhdGEgZXh0ZW5kcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUNlbGxEYXRhIHtcbiAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgLy8gLmNvbnRlbnQgY2FycmllcyBubyBtZWFuaW5nIGZvciBqb2luZWQgQ2VsbERhdGEsIHNpbXBseSBudWxsaWZ5IGl0XG4gIC8vIHRodXMgd2UgaGF2ZSB0byBvdmVybG9hZCBhbGwgb3RoZXIgLmNvbnRlbnQgYWNjZXNzb3JzXG4gIHB1YmxpYyBjb250ZW50OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZmc6IG51bWJlcjtcbiAgcHVibGljIGJnOiBudW1iZXI7XG4gIHB1YmxpYyBjb21iaW5lZERhdGE6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKGZpcnN0Q2VsbDogSUNlbGxEYXRhLCBjaGFyczogc3RyaW5nLCB3aWR0aDogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZnID0gZmlyc3RDZWxsLmZnO1xuICAgIHRoaXMuYmcgPSBmaXJzdENlbGwuYmc7XG4gICAgdGhpcy5jb21iaW5lZERhdGEgPSBjaGFycztcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuICB9XG5cbiAgcHVibGljIGlzQ29tYmluZWQoKTogbnVtYmVyIHtcbiAgICAvLyBhbHdheXMgbWFyayBqb2luZWQgY2VsbCBkYXRhIGFzIGNvbWJpbmVkXG4gICAgcmV0dXJuIENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgfVxuXG4gIHB1YmxpYyBnZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2RlKCk6IG51bWJlciB7XG4gICAgLy8gY29kZSBhbHdheXMgZ2V0cyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBmYWtlIGNvZGVwb2ludCAocmVhZCBhcyAtMSlcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCBhcyBjb2RlIGlzIHVzZWQgYnkgY2FjaGVzIGFzIGlkZW50aWZpZXJcbiAgICByZXR1cm4gMHgxRkZGRkY7XG4gIH1cblxuICBwdWJsaWMgc2V0RnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXNDaGFyRGF0YSgpOiBDaGFyRGF0YSB7XG4gICAgcmV0dXJuIFt0aGlzLmZnLCB0aGlzLmdldENoYXJzKCksIHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRDb2RlKCldO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1heDogbnVtYmVyLCBtaW46IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIG1heCksIG1pbik7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG4vKipcbiAqIEEgbWF0cml4IHRoYXQgd2hlbiBtdWx0aXBsaWVzIHdpbGwgdHJhbnNsYXRlIDAtMSBjb29yZGluYXRlcyAobGVmdCB0byByaWdodCxcbiAqIHRvcCB0byBib3R0b20pIHRvIGNsaXAgc3BhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBQUk9KRUNUSU9OX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAyLCAwLCAwLCAwLFxuICAwLCAtMiwgMCwgMCxcbiAgMCwgMCwgMSwgMCxcbiAgLTEsIDEsIDAsIDFcbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB2ZXJ0ZXhTb3VyY2U6IHN0cmluZywgZnJhZ21lbnRTb3VyY2U6IHN0cmluZyk6IFdlYkdMUHJvZ3JhbSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2dyYW0gPSB0aHJvd0lmRmFsc3koZ2wuY3JlYXRlUHJvZ3JhbSgpKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHRocm93SWZGYWxzeShjcmVhdGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNvdXJjZSkpKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHRocm93SWZGYWxzeShjcmVhdGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTb3VyY2UpKSk7XG4gIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuICBjb25zdCBzdWNjZXNzID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyk7XG4gIGlmIChzdWNjZXNzKSB7XG4gICAgcmV0dXJuIHByb2dyYW07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcbiAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0eXBlOiBudW1iZXIsIHNvdXJjZTogc3RyaW5nKTogV2ViR0xTaGFkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBzaGFkZXIgPSB0aHJvd0lmRmFsc3koZ2wuY3JlYXRlU2hhZGVyKHR5cGUpKTtcbiAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuICBjb25zdCBzdWNjZXNzID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpO1xuICBpZiAoc3VjY2Vzcykge1xuICAgIHJldHVybiBzaGFkZXI7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7XG4gIGdsLmRlbGV0ZVNoYWRlcihzaGFkZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kRmxvYXQzMkFycmF5KHNvdXJjZTogRmxvYXQzMkFycmF5LCBtYXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG5ld0xlbmd0aCA9IE1hdGgubWluKHNvdXJjZS5sZW5ndGggKiAyLCBtYXgpO1xuICBjb25zdCBuZXdBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICBuZXdBcnJheVtpXSA9IHNvdXJjZVtpXTtcbiAgfVxuICByZXR1cm4gbmV3QXJyYXk7XG59XG5cbmV4cG9ydCBjbGFzcyBHTFRleHR1cmUge1xuICBwdWJsaWMgdGV4dHVyZTogV2ViR0xUZXh0dXJlO1xuICBwdWJsaWMgdmVyc2lvbjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHRleHR1cmU6IFdlYkdMVGV4dHVyZSkge1xuICAgIHRoaXMudGV4dHVyZSA9IHRleHR1cmU7XG4gICAgdGhpcy52ZXJzaW9uID0gLTE7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgYWNxdWlyZVRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc0NhY2hlJztcbmltcG9ydCB7IFRFWFRfQkFTRUxJTkUgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMnO1xuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucywgSVRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJUmVuZGVyTGF5ZXIgfSBmcm9tICcuL1R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZW5kZXJMYXllciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJUmVuZGVyTGF5ZXIge1xuICBwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcm90ZWN0ZWQgX2N0eCE6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhcldpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDaGFySGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDZWxsV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNlbGxIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNoYXJMZWZ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDaGFyVG9wOiBudW1iZXIgPSAwO1xuXG4gIHByb3RlY3RlZCBfY2hhckF0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIF9jb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYWxwaGE6IGJvb2xlYW4sXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB0aGlzLl9jYW52YXMuY2xhc3NMaXN0LmFkZChgeHRlcm0tJHtpZH0tbGF5ZXJgKTtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUuekluZGV4ID0gekluZGV4LnRvU3RyaW5nKCk7XG4gICAgdGhpcy5faW5pdENhbnZhcygpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKGUgPT4ge1xuICAgICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcyh0ZXJtaW5hbCwgZSk7XG4gICAgICB0aGlzLnJlc2V0KHRlcm1pbmFsKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2FudmFzLnJlbW92ZSgpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRDYW52YXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4ID0gdGhyb3dJZkZhbHN5KHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgYWxwaGE6IHRoaXMuX2FscGhhIH0pKTtcbiAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kIGlmIHRoaXMgaXMgYW4gb3BhcXVlIGxheWVyXG4gICAgaWYgKCF0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY2xlYXJBbGwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQmx1cih0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHt9XG4gIHB1YmxpYyBoYW5kbGVGb2N1cyh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHt9XG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZUdyaWRDaGFuZ2VkKHRlcm1pbmFsOiBUZXJtaW5hbCwgc3RhcnRSb3c6IG51bWJlciwgZW5kUm93OiBudW1iZXIpOiB2b2lkIHt9XG4gIHB1YmxpYyBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRlcm1pbmFsOiBUZXJtaW5hbCwgc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBfc2V0VHJhbnNwYXJlbmN5KHRlcm1pbmFsOiBUZXJtaW5hbCwgYWxwaGE6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBEbyBub3RoaW5nIHdoZW4gYWxwaGEgZG9lc24ndCBjaGFuZ2VcbiAgICBpZiAoYWxwaGEgPT09IHRoaXMuX2FscGhhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG5ldyBjYW52YXMgYW5kIHJlcGxhY2Ugb2xkIG9uZVxuICAgIGNvbnN0IG9sZENhbnZhcyA9IHRoaXMuX2NhbnZhcztcbiAgICB0aGlzLl9hbHBoYSA9IGFscGhhO1xuICAgIC8vIENsb25pbmcgcHJlc2VydmVzIHByb3BlcnRpZXNcbiAgICB0aGlzLl9jYW52YXMgPSB0aGlzLl9jYW52YXMuY2xvbmVOb2RlKCkgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgdGhpcy5faW5pdENhbnZhcygpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5yZXBsYWNlQ2hpbGQodGhpcy5fY2FudmFzLCBvbGRDYW52YXMpO1xuXG4gICAgLy8gUmVnZW5lcmF0ZSBjaGFyIGF0bGFzIGFuZCBmb3JjZSBhIGZ1bGwgcmVkcmF3XG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcyh0ZXJtaW5hbCwgdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycyk7XG4gICAgdGhpcy5oYW5kbGVHcmlkQ2hhbmdlZCh0ZXJtaW5hbCwgMCwgdGVybWluYWwucm93cyAtIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgY2hhciBhdGxhcywgYXF1aXJpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIHRlcm1pbmFsIFRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGNvbG9yU2V0IFRoZSBjb2xvciBzZXQgdG8gdXNlIGZvciB0aGUgY2hhciBhdGxhcy5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2hDaGFyQXRsYXModGVybWluYWw6IFRlcm1pbmFsLCBjb2xvclNldDogUmVhZG9ubHlDb2xvclNldCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZXZpY2VDaGFyV2lkdGggPD0gMCAmJiB0aGlzLl9kZXZpY2VDaGFySGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2hhckF0bGFzID0gYWNxdWlyZVRleHR1cmVBdGxhcyh0ZXJtaW5hbCwgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucywgY29sb3JTZXQsIHRoaXMuX2RldmljZUNlbGxXaWR0aCwgdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCwgdGhpcy5fZGV2aWNlQ2hhcldpZHRoLCB0aGlzLl9kZXZpY2VDaGFySGVpZ2h0LCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgICB0aGlzLl9jaGFyQXRsYXMud2FybVVwKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKHRlcm1pbmFsOiBUZXJtaW5hbCwgZGltOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2RldmljZUNlbGxXaWR0aCA9IGRpbS5kZXZpY2UuY2VsbC53aWR0aDtcbiAgICB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0ID0gZGltLmRldmljZS5jZWxsLmhlaWdodDtcbiAgICB0aGlzLl9kZXZpY2VDaGFyV2lkdGggPSBkaW0uZGV2aWNlLmNoYXIud2lkdGg7XG4gICAgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCA9IGRpbS5kZXZpY2UuY2hhci5oZWlnaHQ7XG4gICAgdGhpcy5fZGV2aWNlQ2hhckxlZnQgPSBkaW0uZGV2aWNlLmNoYXIubGVmdDtcbiAgICB0aGlzLl9kZXZpY2VDaGFyVG9wID0gZGltLmRldmljZS5jaGFyLnRvcDtcbiAgICB0aGlzLl9jYW52YXMud2lkdGggPSBkaW0uZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gZGltLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS53aWR0aCA9IGAke2RpbS5jc3MuY2FudmFzLndpZHRofXB4YDtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7ZGltLmNzcy5jYW52YXMuaGVpZ2h0fXB4YDtcblxuICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQgaWYgdGhpcyBpcyBhbiBvcGFxdWUgbGF5ZXJcbiAgICBpZiAoIXRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jbGVhckFsbCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXModGVybWluYWwsIHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlc2V0KHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEZpbGxzIGEgMXB4IGxpbmUgKDJweCBvbiBIRFBJKSBhdCB0aGUgYm90dG9tIG9mIHRoZSBjZWxsLiBUaGlzIHVzZXMgdGhlXG4gICAqIGV4aXN0aW5nIGZpbGxTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBmaWxsLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIGZpbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2ZpbGxCb3R0b21MaW5lQXRDZWxscyh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguZmlsbFJlY3QoXG4gICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgKHkgKyAxKSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQgLSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByIC0gMSAvKiBFbnN1cmUgaXQncyBkcmF3biB3aXRoaW4gdGhlIGNlbGwgKi8sXG4gICAgICB3aWR0aCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgZW50aXJlIGNhbnZhcy5cbiAgICovXG4gIHByb3RlY3RlZCBfY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX2NhbnZhcy53aWR0aCwgdGhpcy5fY2FudmFzLmhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmJhY2tncm91bmQuY3NzO1xuICAgICAgdGhpcy5fY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuX2NhbnZhcy53aWR0aCwgdGhpcy5fY2FudmFzLmhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyAxKyBjZWxscyBjb21wbGV0ZWx5LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIHN0YXJ0IGF0LlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIHN0YXJ0IGF0LlxuICAgKiBAcGFyYW0gd2lkdGggVGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGNsZWFyLlxuICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBudW1iZXIgb2Ygcm93cyB0byBjbGVhci5cbiAgICovXG4gIHByb3RlY3RlZCBfY2xlYXJDZWxscyh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWxwaGEpIHtcbiAgICAgIHRoaXMuX2N0eC5jbGVhclJlY3QoXG4gICAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAgIHkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0LFxuICAgICAgICB3aWR0aCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICAgaGVpZ2h0ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmJhY2tncm91bmQuY3NzO1xuICAgICAgdGhpcy5fY3R4LmZpbGxSZWN0KFxuICAgICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAgIGhlaWdodCAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyBhIHRydWVjb2xvciBjaGFyYWN0ZXIgYXQgdGhlIGNlbGwuIFRoZSBjaGFyYWN0ZXIgd2lsbCBiZSBjbGlwcGVkIHRvXG4gICAqIGVuc3VyZSB0aGF0IGl0IGZpdHMgd2l0aCB0aGUgY2VsbCwgaW5jbHVkaW5nIHRoZSBjZWxsIHRvIHRoZSByaWdodCBpZiBpdCdzXG4gICAqIGEgd2lkZSBjaGFyYWN0ZXIuIFRoaXMgdXNlcyB0aGUgZXhpc3RpbmcgZmlsbFN0eWxlIG9uIHRoZSBjb250ZXh0LlxuICAgKiBAcGFyYW0gdGVybWluYWwgVGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCBkYXRhIGZvciB0aGUgY2hhcmFjdGVyIHRvIGRyYXcuXG4gICAqIEBwYXJhbSB4IFRoZSBjb2x1bW4gdG8gZHJhdyBhdC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBkcmF3IGF0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9maWxsQ2hhclRydWVDb2xvcih0ZXJtaW5hbDogVGVybWluYWwsIGNlbGw6IENlbGxEYXRhLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5mb250ID0gdGhpcy5fZ2V0Rm9udCh0ZXJtaW5hbCwgZmFsc2UsIGZhbHNlKTtcbiAgICB0aGlzLl9jdHgudGV4dEJhc2VsaW5lID0gVEVYVF9CQVNFTElORTtcbiAgICB0aGlzLl9jbGlwQ2VsbCh4LCB5LCBjZWxsLmdldFdpZHRoKCkpO1xuICAgIHRoaXMuX2N0eC5maWxsVGV4dChcbiAgICAgIGNlbGwuZ2V0Q2hhcnMoKSxcbiAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGggKyB0aGlzLl9kZXZpY2VDaGFyTGVmdCxcbiAgICAgIHkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0ICsgdGhpcy5fZGV2aWNlQ2hhclRvcCArIHRoaXMuX2RldmljZUNoYXJIZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsaXBzIGEgY2VsbCB0byBlbnN1cmUgbm8gcGl4ZWxzIHdpbGwgYmUgZHJhd24gb3V0c2lkZSBvZiBpdC5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBjbGlwLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IHRvIGNsaXAuXG4gICAqIEBwYXJhbSB3aWR0aCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gY2xpcC5cbiAgICovXG4gIHByaXZhdGUgX2NsaXBDZWxsKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuX2N0eC5yZWN0KFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgIHkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0LFxuICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICB0aGlzLl9jdHguY2xpcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZm9udC5cbiAgICogQHBhcmFtIHRlcm1pbmFsIFRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGlzQm9sZCBJZiB3ZSBzaG91bGQgdXNlIHRoZSBib2xkIGZvbnRXZWlnaHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2dldEZvbnQodGVybWluYWw6IFRlcm1pbmFsLCBpc0JvbGQ6IGJvb2xlYW4sIGlzSXRhbGljOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb250V2VpZ2h0ID0gaXNCb2xkID8gdGVybWluYWwub3B0aW9ucy5mb250V2VpZ2h0Qm9sZCA6IHRlcm1pbmFsLm9wdGlvbnMuZm9udFdlaWdodDtcbiAgICBjb25zdCBmb250U3R5bGUgPSBpc0l0YWxpYyA/ICdpdGFsaWMnIDogJyc7XG5cbiAgICByZXR1cm4gYCR7Zm9udFN0eWxlfSAke2ZvbnRXZWlnaHR9ICR7dGVybWluYWwub3B0aW9ucy5mb250U2l6ZSEgKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByfXB4ICR7dGVybWluYWwub3B0aW9ucy5mb250RmFtaWx5fWA7XG4gIH1cbn1cblxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBpczI1NkNvbG9yIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzVXRpbHMnO1xuaW1wb3J0IHsgSU5WRVJURURfREVGQVVMVF9DT0xPUiB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElMaW5raWZpZXIyLCBJTGlua2lmaWVyRXZlbnQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBCYXNlUmVuZGVyTGF5ZXIgfSBmcm9tICcuL0Jhc2VSZW5kZXJMYXllcic7XG5cbmV4cG9ydCBjbGFzcyBMaW5rUmVuZGVyTGF5ZXIgZXh0ZW5kcyBCYXNlUmVuZGVyTGF5ZXIge1xuICBwcml2YXRlIF9zdGF0ZTogSUxpbmtpZmllckV2ZW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIGxpbmtpZmllcjI6IElMaW5raWZpZXIyLFxuICAgIGNvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcih0ZXJtaW5hbCwgY29udGFpbmVyLCAnbGluaycsIHpJbmRleCwgdHJ1ZSwgY29yZUJyb3dzZXJTZXJ2aWNlLCBvcHRpb25zU2VydmljZSwgdGhlbWVTZXJ2aWNlKTtcblxuICAgIHRoaXMucmVnaXN0ZXIobGlua2lmaWVyMi5vblNob3dMaW5rVW5kZXJsaW5lKGUgPT4gdGhpcy5faGFuZGxlU2hvd0xpbmtVbmRlcmxpbmUoZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGxpbmtpZmllcjIub25IaWRlTGlua1VuZGVybGluZShlID0+IHRoaXMuX2hhbmRsZUhpZGVMaW5rVW5kZXJsaW5lKGUpKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKHRlcm1pbmFsOiBUZXJtaW5hbCwgZGltOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHN1cGVyLnJlc2l6ZSh0ZXJtaW5hbCwgZGltKTtcbiAgICAvLyBSZXNpemluZyB0aGUgY2FudmFzIGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2FudmFzIHNvIGNsZWFyIHN0YXRlXG4gICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJDdXJyZW50TGluaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIHRoaXMuX2NsZWFyQ2VsbHModGhpcy5fc3RhdGUueDEsIHRoaXMuX3N0YXRlLnkxLCB0aGlzLl9zdGF0ZS5jb2xzIC0gdGhpcy5fc3RhdGUueDEsIDEpO1xuICAgICAgY29uc3QgbWlkZGxlUm93Q291bnQgPSB0aGlzLl9zdGF0ZS55MiAtIHRoaXMuX3N0YXRlLnkxIC0gMTtcbiAgICAgIGlmIChtaWRkbGVSb3dDb3VudCA+IDApIHtcbiAgICAgICAgdGhpcy5fY2xlYXJDZWxscygwLCB0aGlzLl9zdGF0ZS55MSArIDEsIHRoaXMuX3N0YXRlLmNvbHMsIG1pZGRsZVJvd0NvdW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NsZWFyQ2VsbHMoMCwgdGhpcy5fc3RhdGUueTIsIHRoaXMuX3N0YXRlLngyLCAxKTtcbiAgICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVNob3dMaW5rVW5kZXJsaW5lKGU6IElMaW5raWZpZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmZnID09PSBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SKSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICB9IGVsc2UgaWYgKGUuZmcgIT09IHVuZGVmaW5lZCAmJiBpczI1NkNvbG9yKGUuZmcpKSB7XG4gICAgICAvLyAyNTYgY29sb3Igc3VwcG9ydFxuICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtlLmZnIV0uY3NzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLmNzcztcbiAgICB9XG5cbiAgICBpZiAoZS55MSA9PT0gZS55Mikge1xuICAgICAgLy8gU2luZ2xlIGxpbmUgbGlua1xuICAgICAgdGhpcy5fZmlsbEJvdHRvbUxpbmVBdENlbGxzKGUueDEsIGUueTEsIGUueDIgLSBlLngxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGktbGluZSBsaW5rXG4gICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoZS54MSwgZS55MSwgZS5jb2xzIC0gZS54MSk7XG4gICAgICBmb3IgKGxldCB5ID0gZS55MSArIDE7IHkgPCBlLnkyOyB5KyspIHtcbiAgICAgICAgdGhpcy5fZmlsbEJvdHRvbUxpbmVBdENlbGxzKDAsIHksIGUuY29scyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoMCwgZS55MiwgZS54Mik7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlID0gZTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUhpZGVMaW5rVW5kZXJsaW5lKGU6IElMaW5raWZpZXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQWRkcyBhIGRpc3Bvc2FibGUgbGlzdGVuZXIgdG8gYSBub2RlIGluIHRoZSBET00sIHJldHVybmluZyB0aGUgZGlzcG9zYWJsZS5cbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZCBhIGxpc3RlbmVyIHRvLlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmb3IgdGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIGJvb2xlYW4gb3Igb3B0aW9ucyBvYmplY3QgdG8gcGFzcyBvbiB0byB0aGUgZXZlbnRcbiAqIGxpc3RlbmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKFxuICBub2RlOiBFbGVtZW50IHwgV2luZG93IHwgRG9jdW1lbnQsXG4gIHR5cGU6IHN0cmluZyxcbiAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuKTogSURpc3Bvc2FibGUge1xuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGlmIChkaXNwb3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaXNwb3NlZCA9IHRydWU7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHsgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgQmdGbGFncywgRXh0RmxhZ3MsIEZnRmxhZ3MsIE5VTExfQ0VMTF9DT0RFLCBVbmRlcmxpbmVTdHlsZSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyByZ2JhIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkZmcgPSAwO1xubGV0ICRiZyA9IDA7XG5sZXQgJGhhc0ZnID0gZmFsc2U7XG5sZXQgJGhhc0JnID0gZmFsc2U7XG5sZXQgJGlzU2VsZWN0ZWQgPSBmYWxzZTtcbmxldCAkY29sb3JzOiBSZWFkb25seUNvbG9yU2V0IHwgdW5kZWZpbmVkO1xubGV0ICR2YXJpYW50T2Zmc2V0ID0gMDtcblxuZXhwb3J0IGNsYXNzIENlbGxDb2xvclJlc29sdmVyIHtcbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgcmVzdWx0IG9mIHRoZSB7QGxpbmsgcmVzb2x2ZX0gY2FsbC4gVGhpcyBpcyBvbmx5IHNhZmUgdG8gdXNlIGltbWVkaWF0ZWx5IGFmdGVyIGFzXG4gICAqIGFueSBvdGhlciBjYWxscyB3aWxsIHNoYXJlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN1bHQ6IHsgZmc6IG51bWJlciwgYmc6IG51bWJlciwgZXh0OiBudW1iZXIgfSA9IHtcbiAgICBmZzogMCxcbiAgICBiZzogMCxcbiAgICBleHQ6IDBcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGlvblJlbmRlck1vZGVsOiBJU2VsZWN0aW9uUmVuZGVyTW9kZWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGNvbG9ycyBmb3IgdGhlIGNlbGwsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbnRvIHRoZSBzaGFyZWQge0BsaW5rIHJlc3VsdH0uIFRoaXMgcmVzb2x2ZXNcbiAgICogb3ZlcnJpZGVzLCBpbnZlcnNlIGFuZCBzZWxlY3Rpb24gZm9yIHRoZSBjZWxsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgdG8gZmVlZCBpbnRvIHRoZSByZW5kZXJlci5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKGNlbGw6IElDZWxsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRldmljZUNlbGxXaWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZXN1bHQuYmcgPSBjZWxsLmJnO1xuICAgIHRoaXMucmVzdWx0LmZnID0gY2VsbC5mZztcbiAgICB0aGlzLnJlc3VsdC5leHQgPSBjZWxsLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQgPyBjZWxsLmV4dGVuZGVkLmV4dCA6IDA7XG4gICAgLy8gR2V0IGFueSBmb3JlZ3JvdW5kL2JhY2tncm91bmQgb3ZlcnJpZGVzLCB0aGlzIGhhcHBlbnMgb24gdGhlIG1vZGVsIHRvIGF2b2lkIHNwcmVhZGluZ1xuICAgIC8vIG92ZXJyaWRlIGxvZ2ljIHRocm91Z2hvdXQgdGhlIGRpZmZlcmVudCBzdWItcmVuZGVyZXJzXG5cbiAgICAvLyBSZXNldCBvdmVycmlkZXMgd29yayB2YXJpYWJsZXNcbiAgICAkYmcgPSAwO1xuICAgICRmZyA9IDA7XG4gICAgJGhhc0JnID0gZmFsc2U7XG4gICAgJGhhc0ZnID0gZmFsc2U7XG4gICAgJGlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAkY29sb3JzID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycztcbiAgICAkdmFyaWFudE9mZnNldCA9IDA7XG5cbiAgICBjb25zdCBjb2RlID0gY2VsbC5nZXRDb2RlKCk7XG4gICAgaWYgKGNvZGUgIT09IE5VTExfQ0VMTF9DT0RFICYmIGNlbGwuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgPT09IFVuZGVybGluZVN0eWxlLkRPVFRFRCkge1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9vcHRpb25TZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemUgKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByIC8gMTUpKTtcbiAgICAgICR2YXJpYW50T2Zmc2V0ID0geCAqIGRldmljZUNlbGxXaWR0aCAlIChNYXRoLnJvdW5kKGxpbmVXaWR0aCkgKiAyKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWNvcmF0aW9ucyBvbiB0aGUgYm90dG9tIGxheWVyXG4gICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZm9yRWFjaERlY29yYXRpb25BdENlbGwoeCwgeSwgJ2JvdHRvbScsIGQgPT4ge1xuICAgICAgaWYgKGQuYmFja2dyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICRiZyA9IGQuYmFja2dyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNCZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZC5mb3JlZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGZnID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGx5IHRoZSBzZWxlY3Rpb24gY29sb3IgaWYgbmVlZGVkXG4gICAgJGlzU2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC5pc0NlbGxTZWxlY3RlZCh0aGlzLl90ZXJtaW5hbCwgeCwgeSk7XG4gICAgaWYgKCRpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBJZiB0aGUgY2VsbCBoYXMgYSBiZyBjb2xvciwgcmV0YWluIHRoZSBjb2xvciBieSBibGVuZGluZyBpdCB3aXRoIHRoZSBzZWxlY3Rpb24gY29sb3JcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB8fFxuICAgICAgICAodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spICE9PSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFRcbiAgICAgICkge1xuICAgICAgICAvLyBSZXNvbHZlIHRoZSBzdGFuZGFyZCBiZyBjb2xvclxuICAgICAgICBpZiAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpIHtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgICAgICRiZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVt0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAgICAgJGJnID0gKCh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDgpIHwgMHhGRjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICRiZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgICAgICRiZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVt0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAgICAgJGJnID0gKCh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDgpIHwgMHhGRjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNvbnNpZGVyIGRlZmF1bHQgYmcgY29sb3IgaGVyZSBhcyBpdCdzIG5vdCBwb3NzaWJsZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBCbGVuZCB3aXRoIHNlbGVjdGlvbiBiZyBjb2xvclxuICAgICAgICAkYmcgPSByZ2JhLmJsZW5kKFxuICAgICAgICAgICRiZyxcbiAgICAgICAgICAoKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyAkY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgOiAkY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSkucmdiYSAmIDB4RkZGRkZGMDApIHwgMHg4MFxuICAgICAgICApID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGJnID0gKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyAkY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgOiAkY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSkucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgIH1cbiAgICAgICRoYXNCZyA9IHRydWU7XG5cbiAgICAgIC8vIEFwcGx5IGV4cGxpY2l0IHNlbGVjdGlvbiBmb3JlZ3JvdW5kIGlmIHByZXNlbnRcbiAgICAgIGlmICgkY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQpIHtcbiAgICAgICAgJGZnID0gJGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNGZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE92ZXJ3cml0ZSBmZyBhcyBiZyBpZiBpdCdzIGEgc3BlY2lhbCBkZWNvcmF0aXZlIGdseXBoIChlZy4gcG93ZXJsaW5lKVxuICAgICAgaWYgKHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcihjZWxsLmdldENvZGUoKSkpIHtcbiAgICAgICAgLy8gSW52ZXJzZSBkZWZhdWx0IGJhY2tncm91bmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdHJhbnNwYXJlbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkgJiZcbiAgICAgICAgICAodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFRcbiAgICAgICAgKSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyAkY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgOiAkY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSkucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIGlmICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgICAkZmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAgICRmZyA9ICgodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4KSB8IDB4RkY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY29uc2lkZXIgZGVmYXVsdCBiZyBjb2xvciBoZXJlIGFzIGl0J3Mgbm90IHBvc3NpYmxlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgICAgICAgJGZnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAgICAgICAkZmcgPSAoKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAkZmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmZvcmVncm91bmQucmdiYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAkZmcgPSByZ2JhLmJsZW5kKFxuICAgICAgICAgICAgJGZnLFxuICAgICAgICAgICAgKCh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkID8gJGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIDogJGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUpLnJnYmEgJiAweEZGRkZGRjAwKSB8IDB4ODBcbiAgICAgICAgICApID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICB9XG4gICAgICAgICRoYXNGZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVjb3JhdGlvbnMgb24gdGhlIHRvcCBsYXllclxuICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHgsIHksICd0b3AnLCBkID0+IHtcbiAgICAgIGlmIChkLmJhY2tncm91bmRDb2xvclJHQikge1xuICAgICAgICAkYmcgPSBkLmJhY2tncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzQmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGQuZm9yZWdyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICRmZyA9IGQuZm9yZWdyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNGZyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IGFueSBvdmVycmlkZXMgZnJvbSByZ2JhIHRvIHRoZSBmZy9iZyBwYWNrZWQgZm9ybWF0LiBUaGlzIHJlc29sdmVzIHRoZSBpbnZlcnNlIGZsYWdcbiAgICAvLyBhaGVhZCBvZiB0aW1lIGluIG9yZGVyIHRvIHVzZSB0aGUgY29ycmVjdCBjYWNoZSBrZXlcbiAgICBpZiAoJGhhc0JnKSB7XG4gICAgICBpZiAoJGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgLy8gTm9uLVJHQiBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgKyBmb3JjZSBub24tZGltICsgb3ZlcnJpZGUgKyBmb3JjZSBSR0IgY29sb3IgbW9kZVxuICAgICAgICAkYmcgPSAoY2VsbC5iZyAmIH5BdHRyaWJ1dGVzLlJHQl9NQVNLICYgfkJnRmxhZ3MuRElNKSB8ICRiZyB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9uLVJHQiBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAgICRiZyA9IChjZWxsLmJnICYgfkF0dHJpYnV0ZXMuUkdCX01BU0spIHwgJGJnIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgkaGFzRmcpIHtcbiAgICAgIC8vIE5vbi1SR0IgYXR0cmlidXRlcyBmcm9tIG1vZGVsICsgZm9yY2UgZGlzYWJsZSBpbnZlcnNlICsgb3ZlcnJpZGUgKyBmb3JjZSBSR0IgY29sb3IgbW9kZVxuICAgICAgJGZnID0gKGNlbGwuZmcgJiB+QXR0cmlidXRlcy5SR0JfTUFTSyAmIH5GZ0ZsYWdzLklOVkVSU0UpIHwgJGZnIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgaW52ZXJzZSB3YXMgc3BlY2lmaWVkIGJ5IG9ubHkgb25lIG9mIGJnIG92ZXJyaWRlIG9yIGZnIG92ZXJyaWRlIHdhcyBzZXQsXG4gICAgLy8gcmVzb2x2aW5nIHRoZSBvdGhlciBpbnZlcnNlIGNvbG9yIGFuZCBzZXR0aW5nIHRoZSBpbnZlcnNlIGZsYWcgaWYgbmVlZGVkLlxuICAgIGlmICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgaWYgKCRoYXNCZyAmJiAhJGhhc0ZnKSB7XG4gICAgICAgIC8vIFJlc29sdmUgYmcgY29sb3IgdHlwZSAoZGVmYXVsdCBjb2xvciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBpbiBmZyB2cyBiZylcbiAgICAgICAgaWYgKCh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVCkge1xuICAgICAgICAgICRmZyA9ICh0aGlzLnJlc3VsdC5mZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEZnRmxhZ3MuSU5WRVJTRSB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgKCgkY29sb3JzLmJhY2tncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSykgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmZyA9ICh0aGlzLnJlc3VsdC5mZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEZnRmxhZ3MuSU5WRVJTRSB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgdGhpcy5yZXN1bHQuYmcgJiAoQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSyk7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghJGhhc0JnICYmICRoYXNGZykge1xuICAgICAgICAvLyBSZXNvbHZlIGJnIGNvbG9yIHR5cGUgKGRlZmF1bHQgY29sb3IgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgaW4gZmcgdnMgYmcpXG4gICAgICAgIGlmICgodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQpIHtcbiAgICAgICAgICAkYmcgPSAodGhpcy5yZXN1bHQuYmcgJiB+KEF0dHJpYnV0ZXMuUkdCX01BU0sgfCBBdHRyaWJ1dGVzLkNNX01BU0spKSB8ICgoJGNvbG9ycy5mb3JlZ3JvdW5kLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0spICYgQXR0cmlidXRlcy5SR0JfTUFTSykgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkYmcgPSAodGhpcy5yZXN1bHQuYmcgJiB+KEF0dHJpYnV0ZXMuUkdCX01BU0sgfCBBdHRyaWJ1dGVzLkNNX01BU0spKSB8IHRoaXMucmVzdWx0LmZnICYgKEF0dHJpYnV0ZXMuUkdCX01BU0sgfCBBdHRyaWJ1dGVzLkNNX01BU0spO1xuICAgICAgICB9XG4gICAgICAgICRoYXNCZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSBvYmplY3RcbiAgICAkY29sb3JzID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gVXNlIHRoZSBvdmVycmlkZSBpZiBpdCBleGlzdHNcbiAgICB0aGlzLnJlc3VsdC5iZyA9ICRoYXNCZyA/ICRiZyA6IHRoaXMucmVzdWx0LmJnO1xuICAgIHRoaXMucmVzdWx0LmZnID0gJGhhc0ZnID8gJGZnIDogdGhpcy5yZXN1bHQuZmc7XG5cbiAgICAvLyBSZXNldCBvdmVycmlkZXMgdmFyaWFudE9mZnNldFxuICAgIHRoaXMucmVzdWx0LmV4dCAmPSB+RXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQ7XG4gICAgdGhpcy5yZXN1bHQuZXh0IHw9ICgkdmFyaWFudE9mZnNldCA8PCAyOSkgJiBFeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UZXh0dXJlQXRsYXMnO1xuaW1wb3J0IHsgSVRlcm1pbmFsT3B0aW9ucywgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSVRlcm1pbmFsLCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJQ2hhckF0bGFzQ29uZmlnLCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDb25maWcsIGNvbmZpZ0VxdWFscyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc1V0aWxzJztcblxuaW50ZXJmYWNlIElUZXh0dXJlQXRsYXNDYWNoZUVudHJ5IHtcbiAgYXRsYXM6IElUZXh0dXJlQXRsYXM7XG4gIGNvbmZpZzogSUNoYXJBdGxhc0NvbmZpZztcbiAgLy8gTi5CLiBUaGlzIGltcGxlbWVudGF0aW9uIHBvdGVudGlhbGx5IGhvbGRzIG9udG8gY29waWVzIG9mIHRoZSB0ZXJtaW5hbCBmb3JldmVyLCBzb1xuICAvLyB0aGlzIG1heSBjYXVzZSBtZW1vcnkgbGVha3MuXG4gIG93bmVkQnk6IFRlcm1pbmFsW107XG59XG5cbmNvbnN0IGNoYXJBdGxhc0NhY2hlOiBJVGV4dHVyZUF0bGFzQ2FjaGVFbnRyeVtdID0gW107XG5cbi8qKlxuICogQWNxdWlyZXMgYSBjaGFyIGF0bGFzLCBlaXRoZXIgZ2VuZXJhdGluZyBhIG5ldyBvbmUgb3IgcmV0dXJuaW5nIGFuIGV4aXN0aW5nXG4gKiBvbmUgdGhhdCBpcyBpbiB1c2UgYnkgYW5vdGhlciB0ZXJtaW5hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjcXVpcmVUZXh0dXJlQXRsYXMoXG4gIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz4sXG4gIGNvbG9yczogUmVhZG9ubHlDb2xvclNldCxcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlcixcbiAgZGV2aWNlQ2hhcldpZHRoOiBudW1iZXIsXG4gIGRldmljZUNoYXJIZWlnaHQ6IG51bWJlcixcbiAgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyXG4pOiBJVGV4dHVyZUF0bGFzIHtcbiAgY29uc3QgbmV3Q29uZmlnID0gZ2VuZXJhdGVDb25maWcoZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0LCBkZXZpY2VDaGFyV2lkdGgsIGRldmljZUNoYXJIZWlnaHQsIG9wdGlvbnMsIGNvbG9ycywgZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXJtaW5hbCBhbHJlYWR5IG93bnMgdGhpcyBjb25maWdcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQXRsYXNDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gY2hhckF0bGFzQ2FjaGVbaV07XG4gICAgY29uc3Qgb3duZWRCeUluZGV4ID0gZW50cnkub3duZWRCeS5pbmRleE9mKHRlcm1pbmFsKTtcbiAgICBpZiAob3duZWRCeUluZGV4ID49IDApIHtcbiAgICAgIGlmIChjb25maWdFcXVhbHMoZW50cnkuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAgIHJldHVybiBlbnRyeS5hdGxhcztcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBjb25maWdzIGRpZmZlciwgcmVsZWFzZSB0aGUgdGVybWluYWwgZnJvbSB0aGUgZW50cnlcbiAgICAgIGlmIChlbnRyeS5vd25lZEJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbnRyeS5hdGxhcy5kaXNwb3NlKCk7XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5Lm93bmVkQnkuc3BsaWNlKG93bmVkQnlJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBUcnkgbWF0Y2ggYSBjaGFyIGF0bGFzIGZyb20gdGhlIGNhY2hlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckF0bGFzQ2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbnRyeSA9IGNoYXJBdGxhc0NhY2hlW2ldO1xuICAgIGlmIChjb25maWdFcXVhbHMoZW50cnkuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAvLyBBZGQgdGhlIHRlcm1pbmFsIHRvIHRoZSBjYWNoZSBlbnRyeSBhbmQgcmV0dXJuXG4gICAgICBlbnRyeS5vd25lZEJ5LnB1c2godGVybWluYWwpO1xuICAgICAgcmV0dXJuIGVudHJ5LmF0bGFzO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvcmU6IElUZXJtaW5hbCA9ICh0ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuICBjb25zdCBuZXdFbnRyeTogSVRleHR1cmVBdGxhc0NhY2hlRW50cnkgPSB7XG4gICAgYXRsYXM6IG5ldyBUZXh0dXJlQXRsYXMoZG9jdW1lbnQsIG5ld0NvbmZpZywgY29yZS51bmljb2RlU2VydmljZSksXG4gICAgY29uZmlnOiBuZXdDb25maWcsXG4gICAgb3duZWRCeTogW3Rlcm1pbmFsXVxuICB9O1xuICBjaGFyQXRsYXNDYWNoZS5wdXNoKG5ld0VudHJ5KTtcbiAgcmV0dXJuIG5ld0VudHJ5LmF0bGFzO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYSB0ZXJtaW5hbCByZWZlcmVuY2UgZnJvbSB0aGUgY2FjaGUsIGFsbG93aW5nIGl0cyBtZW1vcnkgdG8gYmUgZnJlZWQuXG4gKiBAcGFyYW0gdGVybWluYWwgVGhlIHRlcm1pbmFsIHRvIHJlbW92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJBdGxhc0NhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjaGFyQXRsYXNDYWNoZVtpXS5vd25lZEJ5LmluZGV4T2YodGVybWluYWwpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChjaGFyQXRsYXNDYWNoZVtpXS5vd25lZEJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGNhY2hlIGVudHJ5IGlmIGl0J3MgdGhlIG9ubHkgdGVybWluYWxcbiAgICAgICAgY2hhckF0bGFzQ2FjaGVbaV0uYXRsYXMuZGlzcG9zZSgpO1xuICAgICAgICBjaGFyQXRsYXNDYWNoZS5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBjYWNoZSBlbnRyeVxuICAgICAgICBjaGFyQXRsYXNDYWNoZVtpXS5vd25lZEJ5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJBdGxhc0NvbmZpZyB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElUZXJtaW5hbE9wdGlvbnMgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NPTE9SIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnKGRldmljZUNlbGxXaWR0aDogbnVtYmVyLCBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIsIGRldmljZUNoYXJXaWR0aDogbnVtYmVyLCBkZXZpY2VDaGFySGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+LCBjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQsIGRldmljZVBpeGVsUmF0aW86IG51bWJlcik6IElDaGFyQXRsYXNDb25maWcge1xuICAvLyBudWxsIG91dCBzb21lIGZpZWxkcyB0aGF0IGRvbid0IG1hdHRlclxuICBjb25zdCBjbG9uZWRDb2xvcnM6IElDb2xvclNldCA9IHtcbiAgICBmb3JlZ3JvdW5kOiBjb2xvcnMuZm9yZWdyb3VuZCxcbiAgICBiYWNrZ3JvdW5kOiBjb2xvcnMuYmFja2dyb3VuZCxcbiAgICBjdXJzb3I6IE5VTExfQ09MT1IsXG4gICAgY3Vyc29yQWNjZW50OiBOVUxMX0NPTE9SLFxuICAgIHNlbGVjdGlvbkZvcmVncm91bmQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50OiBOVUxMX0NPTE9SLFxuICAgIHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOiBOVUxMX0NPTE9SLFxuICAgIC8vIEZvciB0aGUgc3RhdGljIGNoYXIgYXRsYXMsIHdlIG9ubHkgdXNlIHRoZSBmaXJzdCAxNiBjb2xvcnMsIGJ1dCB3ZSBuZWVkIGFsbCAyNTYgZm9yIHRoZVxuICAgIC8vIGR5bmFtaWMgY2hhcmFjdGVyIGF0bGFzLlxuICAgIGFuc2k6IGNvbG9ycy5hbnNpLnNsaWNlKCksXG4gICAgY29udHJhc3RDYWNoZTogY29sb3JzLmNvbnRyYXN0Q2FjaGUsXG4gICAgaGFsZkNvbnRyYXN0Q2FjaGU6IGNvbG9ycy5oYWxmQ29udHJhc3RDYWNoZVxuICB9O1xuICByZXR1cm4ge1xuICAgIGN1c3RvbUdseXBoczogb3B0aW9ucy5jdXN0b21HbHlwaHMsXG4gICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICBsZXR0ZXJTcGFjaW5nOiBvcHRpb25zLmxldHRlclNwYWNpbmcsXG4gICAgbGluZUhlaWdodDogb3B0aW9ucy5saW5lSGVpZ2h0LFxuICAgIGRldmljZUNlbGxXaWR0aDogZGV2aWNlQ2VsbFdpZHRoLFxuICAgIGRldmljZUNlbGxIZWlnaHQ6IGRldmljZUNlbGxIZWlnaHQsXG4gICAgZGV2aWNlQ2hhcldpZHRoOiBkZXZpY2VDaGFyV2lkdGgsXG4gICAgZGV2aWNlQ2hhckhlaWdodDogZGV2aWNlQ2hhckhlaWdodCxcbiAgICBmb250RmFtaWx5OiBvcHRpb25zLmZvbnRGYW1pbHksXG4gICAgZm9udFNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgZm9udFdlaWdodDogb3B0aW9ucy5mb250V2VpZ2h0LFxuICAgIGZvbnRXZWlnaHRCb2xkOiBvcHRpb25zLmZvbnRXZWlnaHRCb2xkLFxuICAgIGFsbG93VHJhbnNwYXJlbmN5OiBvcHRpb25zLmFsbG93VHJhbnNwYXJlbmN5LFxuICAgIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzOiBvcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzLFxuICAgIG1pbmltdW1Db250cmFzdFJhdGlvOiBvcHRpb25zLm1pbmltdW1Db250cmFzdFJhdGlvLFxuICAgIGNvbG9yczogY2xvbmVkQ29sb3JzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWdFcXVhbHMoYTogSUNoYXJBdGxhc0NvbmZpZywgYjogSUNoYXJBdGxhc0NvbmZpZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEuY29sb3JzLmFuc2kubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYS5jb2xvcnMuYW5zaVtpXS5yZ2JhICE9PSBiLmNvbG9ycy5hbnNpW2ldLnJnYmEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGEuZGV2aWNlUGl4ZWxSYXRpbyA9PT0gYi5kZXZpY2VQaXhlbFJhdGlvICYmXG4gICAgICBhLmN1c3RvbUdseXBocyA9PT0gYi5jdXN0b21HbHlwaHMgJiZcbiAgICAgIGEubGluZUhlaWdodCA9PT0gYi5saW5lSGVpZ2h0ICYmXG4gICAgICBhLmxldHRlclNwYWNpbmcgPT09IGIubGV0dGVyU3BhY2luZyAmJlxuICAgICAgYS5mb250RmFtaWx5ID09PSBiLmZvbnRGYW1pbHkgJiZcbiAgICAgIGEuZm9udFNpemUgPT09IGIuZm9udFNpemUgJiZcbiAgICAgIGEuZm9udFdlaWdodCA9PT0gYi5mb250V2VpZ2h0ICYmXG4gICAgICBhLmZvbnRXZWlnaHRCb2xkID09PSBiLmZvbnRXZWlnaHRCb2xkICYmXG4gICAgICBhLmFsbG93VHJhbnNwYXJlbmN5ID09PSBiLmFsbG93VHJhbnNwYXJlbmN5ICYmXG4gICAgICBhLmRldmljZUNoYXJXaWR0aCA9PT0gYi5kZXZpY2VDaGFyV2lkdGggJiZcbiAgICAgIGEuZGV2aWNlQ2hhckhlaWdodCA9PT0gYi5kZXZpY2VDaGFySGVpZ2h0ICYmXG4gICAgICBhLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzID09PSBiLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmXG4gICAgICBhLm1pbmltdW1Db250cmFzdFJhdGlvID09PSBiLm1pbmltdW1Db250cmFzdFJhdGlvICYmXG4gICAgICBhLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmEgPT09IGIuY29sb3JzLmZvcmVncm91bmQucmdiYSAmJlxuICAgICAgYS5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhID09PSBiLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpczI1NkNvbG9yKGNvbG9yQ29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoY29sb3JDb2RlICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKGNvbG9yQ29kZSAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1Njtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgaXNGaXJlZm94LCBpc0xlZ2FjeUVkZ2UgfSBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuXG5leHBvcnQgY29uc3QgSU5WRVJURURfREVGQVVMVF9DT0xPUiA9IDI1NztcblxuZXhwb3J0IGNvbnN0IERJTV9PUEFDSVRZID0gMC41O1xuLy8gVGhlIHRleHQgYmFzZWxpbmUgaXMgc2V0IGNvbmRpdGlvbmFsbHkgYnkgYnJvd3Nlci4gVXNpbmcgJ2lkZW9ncmFwaGljJyBmb3IgRmlyZWZveCBvciBMZWdhY3kgRWRnZVxuLy8gd291bGQgcmVzdWx0IGluIHRydW5jYXRlZCB0ZXh0IChJc3N1ZSAzMzUzKS4gVXNpbmcgJ2JvdHRvbScgZm9yIENocm9tZSB3b3VsZCByZXN1bHQgaW4gc2xpZ2h0bHlcbi8vIHVuYWxpZ25lZCBQb3dlcmxpbmUgZm9udHMgKFBSIDMzNTYjaXNzdWVjb21tZW50LTg1MDkyODE3OSkuXG5leHBvcnQgY29uc3QgVEVYVF9CQVNFTElORTogQ2FudmFzVGV4dEJhc2VsaW5lID0gaXNGaXJlZm94IHx8IGlzTGVnYWN5RWRnZSA/ICdib3R0b20nIDogJ2lkZW9ncmFwaGljJztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFRoZSB0aW1lIGJldHdlZW4gY3Vyc29yIGJsaW5rcy5cbiAqL1xuY29uc3QgQkxJTktfSU5URVJWQUwgPSA2MDA7XG5cbmV4cG9ydCBjbGFzcyBDdXJzb3JCbGlua1N0YXRlTWFuYWdlciB7XG4gIHB1YmxpYyBpc0N1cnNvclZpc2libGU6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYmxpbmtTdGFydFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYmxpbmtJbnRlcnZhbDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgYW5pbWF0aW9uIGZyYW1lIHdhcyByZXN0YXJ0ZWQsIHRoaXMgaXMgdXNlZCBvbiB0aGVcbiAgICogbmV4dCByZW5kZXIgdG8gcmVzdGFydCB0aGUgdGltZXJzIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byByZXN0YXJ0IHRoZSB0aW1lcnNcbiAgICogbXVsdGlwbGUgdGltZXMgb3ZlciBhIHNob3J0IHBlcmlvZC5cbiAgICovXG4gIHByaXZhdGUgX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZCxcbiAgICBwcml2YXRlIF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pc0N1cnNvclZpc2libGUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkKSB7XG4gICAgICB0aGlzLl9yZXN0YXJ0SW50ZXJ2YWwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUGF1c2VkKCk6IGJvb2xlYW4geyByZXR1cm4gISh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCB8fCB0aGlzLl9ibGlua0ludGVydmFsKTsgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc3RhcnRCbGlua0FuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1BhdXNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTYXZlIGEgdGltZXN0YW1wIHNvIHRoYXQgdGhlIHJlc3RhcnQgY2FuIGJlIGRvbmUgb24gdGhlIG5leHQgaW50ZXJ2YWxcbiAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICAvLyBGb3JjZSBhIGN1cnNvciByZW5kZXIgdG8gZW5zdXJlIGl0J3MgdmlzaWJsZSBhbmQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlbmRlckNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdGFydEludGVydmFsKHRpbWVUb1N0YXJ0OiBudW1iZXIgPSBCTElOS19JTlRFUlZBTCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGFueSBleGlzdGluZyBpbnRlcnZhbFxuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNldHVwIHRoZSBpbml0aWFsIHRpbWVvdXQgd2hpY2ggd2lsbCBoaWRlIHRoZSBjdXJzb3IsIHRoaXMgaXMgZG9uZSBiZWZvcmVcbiAgICAvLyB0aGUgcmVndWxhciBpbnRlcnZhbCBpcyBzZXR1cCBpbiBvcmRlciB0byBzdXBwb3J0IHJlc3RhcnRpbmcgdGhlIGJsaW5rXG4gICAgLy8gYW5pbWF0aW9uIGluIGEgbGlnaHR3ZWlnaHQgd2F5ICh3aXRob3V0IHRocmFzaGluZyBjbGVhckludGVydmFsIGFuZFxuICAgIC8vIHNldEludGVydmFsKS5cbiAgICB0aGlzLl9ibGlua1N0YXJ0VGltZW91dCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiBhbm90aGVyIGFuaW1hdGlvbiByZXN0YXJ0IHdhcyByZXF1ZXN0ZWQgd2hpbGUgdGhpcyB3YXMgYmVpbmdcbiAgICAgIC8vIHN0YXJ0ZWRcbiAgICAgIGlmICh0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBCTElOS19JTlRFUlZBTCAtIChEYXRlLm5vdygpIC0gdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aW1lID4gMCkge1xuICAgICAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCh0aW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGlkZSB0aGUgY3Vyc29yXG4gICAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlbmRlckNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBibGluayBpbnRlcnZhbFxuICAgICAgdGhpcy5fYmxpbmtJbnRlcnZhbCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAvLyBBZGp1c3QgdGhlIGFuaW1hdGlvbiB0aW1lIGlmIGl0IHdhcyByZXN0YXJ0ZWRcbiAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQpIHtcbiAgICAgICAgICAvLyBjYWxjIHRpbWUgZGlmZlxuICAgICAgICAgIC8vIE1ha2UgcmVzdGFydCBpbnRlcnZhbCBkbyBhIHNldFRpbWVvdXQgaW5pdGlhbGx5P1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSBCTElOS19JTlRFUlZBTCAtIChEYXRlLm5vdygpIC0gdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCk7XG4gICAgICAgICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLl9yZXN0YXJ0SW50ZXJ2YWwodGltZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW52ZXJ0IHZpc2liaWxpdHkgYW5kIHJlbmRlclxuICAgICAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9ICF0aGlzLmlzQ3Vyc29yVmlzaWJsZTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICB9LCBCTElOS19JTlRFUlZBTCk7XG4gICAgfSwgdGltZVRvU3RhcnQpO1xuICB9XG5cbiAgcHVibGljIHBhdXNlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fYmxpbmtJbnRlcnZhbCkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2JsaW5rSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5fYmxpbmtJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCk7XG4gICAgICB0aGlzLl9ibGlua1N0YXJ0VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lKTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXN1bWUoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgb3V0IGFueSBleGlzdGluZyB0aW1lcnMganVzdCBpbiBjYXNlXG4gICAgdGhpcy5wYXVzZSgpO1xuXG4gICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN0YXJ0SW50ZXJ2YWwoKTtcbiAgICB0aGlzLnJlc3RhcnRCbGlua0FuaW1hdGlvbigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG5pbnRlcmZhY2UgSUJsb2NrVmVjdG9yIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgYmxvY2tFbGVtZW50RGVmaW5pdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBJQmxvY2tWZWN0b3JbXSB8IHVuZGVmaW5lZCB9ID0ge1xuICAvLyBCbG9jayBlbGVtZW50cyAoMHgyNTgwLTB4MjU5MClcbiAgJ+KWgCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDQgfV0sIC8vIFVQUEVSIEhBTEYgQkxPQ0tcbiAgJ+KWgSc6IFt7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sIC8vIExPV0VSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWgic6IFt7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDIgfV0sIC8vIExPV0VSIE9ORSBRVUFSVEVSIEJMT0NLXG4gICfiloMnOiBbeyB4OiAwLCB5OiA1LCB3OiA4LCBoOiAzIH1dLCAvLyBMT1dFUiBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICfiloQnOiBbeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBMT1dFUiBIQUxGIEJMT0NLXG4gICfiloUnOiBbeyB4OiAwLCB5OiAzLCB3OiA4LCBoOiA1IH1dLCAvLyBMT1dFUiBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWhic6IFt7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDYgfV0sIC8vIExPV0VSIFRIUkVFIFFVQVJURVJTIEJMT0NLXG4gICfilocnOiBbeyB4OiAwLCB5OiAxLCB3OiA4LCBoOiA3IH1dLCAvLyBMT1dFUiBTRVZFTiBFSUdIVEhTIEJMT0NLXG4gICfilognOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA4IH1dLCAvLyBGVUxMIEJMT0NLXG4gICfiloknOiBbeyB4OiAwLCB5OiAwLCB3OiA3LCBoOiA4IH1dLCAvLyBMRUZUIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWiic6IFt7IHg6IDAsIHk6IDAsIHc6IDYsIGg6IDggfV0sIC8vIExFRlQgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ+KWiyc6IFt7IHg6IDAsIHk6IDAsIHc6IDUsIGg6IDggfV0sIC8vIExFRlQgRklWRSBFSUdIVEhTIEJMT0NLXG4gICfilownOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA4IH1dLCAvLyBMRUZUIEhBTEYgQkxPQ0tcbiAgJ+KWjSc6IFt7IHg6IDAsIHk6IDAsIHc6IDMsIGg6IDggfV0sIC8vIExFRlQgVEhSRUUgRUlHSFRIUyBCTE9DS1xuICAn4paOJzogW3sgeDogMCwgeTogMCwgdzogMiwgaDogOCB9XSwgLy8gTEVGVCBPTkUgUVVBUlRFUiBCTE9DS1xuICAn4paPJzogW3sgeDogMCwgeTogMCwgdzogMSwgaDogOCB9XSwgLy8gTEVGVCBPTkUgRUlHSFRIIEJMT0NLXG4gICfilpAnOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA4IH1dLCAvLyBSSUdIVCBIQUxGIEJMT0NLXG5cbiAgLy8gQmxvY2sgZWxlbWVudHMgKDB4MjU5NC0weDI1OTUpXG4gICfilpQnOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAxIH1dLCAvLyBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICfilpUnOiBbeyB4OiA3LCB5OiAwLCB3OiAxLCBoOiA4IH1dLCAvLyBSSUdIVCBPTkUgRUlHSFRIIEJMT0NLXG5cbiAgLy8gVGVybWluYWwgZ3JhcGhpYyBjaGFyYWN0ZXJzICgweDI1OTYtMHgyNTlGKVxuICAn4paWJzogW3sgeDogMCwgeTogNCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIExPV0VSIExFRlRcbiAgJ+KWlyc6IFt7IHg6IDQsIHk6IDQsIHc6IDQsIGg6IDQgfV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUFEUkFOVCBMT1dFUiBSSUdIVFxuICAn4paYJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIFVQUEVSIExFRlRcbiAgJ+KWmSc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBMT1dFUiBMRUZUIEFORCBMT1dFUiBSSUdIVFxuICAn4paaJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogNCB9LCB7IHg6IDQsIHk6IDQsIHc6IDQsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIExPV0VSIFJJR0hUXG4gICfilpsnOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA4IH0sIHsgeDogNCwgeTogMCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVCBBTkQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlRcbiAgJ+KWnCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDQgfSwgeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA4IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgUklHSFRcbiAgJ+KWnSc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDQgfV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUFEUkFOVCBVUFBFUiBSSUdIVFxuICAn4paeJzogW3sgeDogNCwgeTogMCwgdzogNCwgaDogNCB9LCB7IHg6IDAsIHk6IDQsIHc6IDQsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIFJJR0hUIEFORCBMT1dFUiBMRUZUXG4gICfilp8nOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA4IH0sIHsgeDogMCwgeTogNCwgdzogOCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlQgQU5EIExPV0VSIFJJR0hUXG5cbiAgLy8gVkVSVElDQUwgT05FIEVJR0hUSCBCTE9DSy0yIHRocm91Z2ggVkVSVElDQUwgT05FIEVJR0hUSCBCTE9DSy03XG4gICdcXHV7MUZCNzB9JzogW3sgeDogMSwgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3MX0nOiBbeyB4OiAyLCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjcyfSc6IFt7IHg6IDMsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzN9JzogW3sgeDogNCwgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3NH0nOiBbeyB4OiA1LCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjc1fSc6IFt7IHg6IDYsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG5cbiAgLy8gSE9SSVpPTlRBTCBPTkUgRUlHSFRIIEJMT0NLLTIgdGhyb3VnaCBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stN1xuICAnXFx1ezFGQjc2fSc6IFt7IHg6IDAsIHk6IDEsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCNzd9JzogW3sgeDogMCwgeTogMiwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3OH0nOiBbeyB4OiAwLCB5OiAzLCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjc5fSc6IFt7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCN0F9JzogW3sgeDogMCwgeTogNSwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3Qn0nOiBbeyB4OiAwLCB5OiA2LCB3OiA4LCBoOiAxIH1dLFxuXG4gIC8vIExFRlQgQU5EIExPV0VSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ1xcdXsxRkI3Q30nOiBbeyB4OiAwLCB5OiAwLCB3OiAxLCBoOiA4IH0sIHsgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSxcbiAgLy8gTEVGVCBBTkQgVVBQRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdEfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAxIH1dLFxuICAvLyBSSUdIVCBBTkQgVVBQRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdFfSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAxIH1dLFxuICAvLyBSSUdIVCBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdGfSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBVUFBFUiBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjgwfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stMTM1OFxuICAnXFx1ezFGQjgxfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAxIH0sIHsgeDogMCwgeTogNCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG5cbiAgLy8gVVBQRVIgT05FIFFVQVJURVIgQkxPQ0tcbiAgJ1xcdXsxRkI4Mn0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAyIH1dLFxuICAvLyBVUFBFUiBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICdcXHV7MUZCODN9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMyB9XSxcbiAgLy8gVVBQRVIgRklWRSBFSUdIVEhTIEJMT0NLXG4gICdcXHV7MUZCODR9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNSB9XSxcbiAgLy8gVVBQRVIgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ1xcdXsxRkI4NX0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA2IH1dLFxuICAvLyBVUFBFUiBTRVZFTiBFSUdIVEhTIEJMT0NLXG4gICdcXHV7MUZCODZ9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNyB9XSxcblxuICAvLyBSSUdIVCBPTkUgUVVBUlRFUiBCTE9DS1xuICAnXFx1ezFGQjg3fSc6IFt7IHg6IDYsIHk6IDAsIHc6IDIsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFRIUkVFIEVJR0hUSFMgQjBPQ0tcbiAgJ1xcdXsxRkI4OH0nOiBbeyB4OiA1LCB5OiAwLCB3OiAzLCBoOiA4IH1dLFxuICAvLyBSSUdIVCBGSVZFIEVJR0hUSFMgQkwwQ0tcbiAgJ1xcdXsxRkI4OX0nOiBbeyB4OiAzLCB5OiAwLCB3OiA1LCBoOiA4IH1dLFxuICAvLyBSSUdIVCBUSFJFRSBRVUFSVEVSUyAwTE9DS1xuICAnXFx1ezFGQjhBfSc6IFt7IHg6IDIsIHk6IDAsIHc6IDYsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFNFVkVOIEVJR0hUSFMgQjBPQ0tcbiAgJ1xcdXsxRkI4Qn0nOiBbeyB4OiAxLCB5OiAwLCB3OiA3LCBoOiA4IH1dLFxuXG4gIC8vIENIRUNLRVIgQk9BUkQgRklMTFxuICAnXFx1ezFGQjk1fSc6IFtcbiAgICB7IHg6IDAsIHk6IDAsIHc6IDIsIGg6IDIgfSwgeyB4OiA0LCB5OiAwLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAyLCB5OiAyLCB3OiAyLCBoOiAyIH0sIHsgeDogNiwgeTogMiwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMCwgeTogNCwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDQsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDYsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiA2LCB3OiAyLCBoOiAyIH1cbiAgXSxcbiAgLy8gSU5WRVJTRSBDSEVDS0VSIEJPQVJEIEZJTExcbiAgJ1xcdXsxRkI5Nn0nOiBbXG4gICAgeyB4OiAyLCB5OiAwLCB3OiAyLCBoOiAyIH0sIHsgeDogNiwgeTogMCwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMCwgeTogMiwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDIsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDQsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiA0LCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiA2LCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogNiwgdzogMiwgaDogMiB9XG4gIF0sXG4gIC8vIEhFQVZZIEhPUklaT05UQUwgRklMTCAodXBwZXIgbWlkZGxlIGFuZCBsb3dlciBvbmUgcXVhcnRlciBibG9jaylcbiAgJ1xcdXsxRkI5N30nOiBbeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAyIH0sIHsgeDogMCwgeTogNiwgdzogOCwgaDogMiB9XVxufTtcblxudHlwZSBQYXR0ZXJuRGVmaW5pdGlvbiA9IG51bWJlcltdW107XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVwZWF0aW5nIHBhdHRlcm4gdXNlZCBieSBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoZSBwYXR0ZXJuIGlzIG1hZGUgdXAgb2YgYSAyZCBhcnJheSBvZlxuICogcGl4ZWwgdmFsdWVzIHRvIGJlIGZpbGxlZCAoMSkgb3Igbm90IGZpbGxlZCAoMCkuXG4gKi9cbmNvbnN0IHBhdHRlcm5DaGFyYWN0ZXJEZWZpbml0aW9uczogeyBba2V5OiBzdHJpbmddOiBQYXR0ZXJuRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB9ID0ge1xuICAvLyBTaGFkZSBjaGFyYWN0ZXJzICgweDI1OTEtMHgyNTkzKVxuICAn4paRJzogWyAvLyBMSUdIVCBTSEFERSAoMjUlKVxuICAgIFsxLCAwLCAwLCAwXSxcbiAgICBbMCwgMCwgMCwgMF0sXG4gICAgWzAsIDAsIDEsIDBdLFxuICAgIFswLCAwLCAwLCAwXVxuICBdLFxuICAn4paSJzogWyAvLyBNRURJVU0gU0hBREUgKDUwJSlcbiAgICBbMSwgMF0sXG4gICAgWzAsIDBdLFxuICAgIFswLCAxXSxcbiAgICBbMCwgMF1cbiAgXSxcbiAgJ+KWkyc6IFsgLy8gREFSSyBTSEFERSAoNzUlKVxuICAgIFswLCAxXSxcbiAgICBbMSwgMV0sXG4gICAgWzEsIDBdLFxuICAgIFsxLCAxXVxuICBdXG59O1xuXG5jb25zdCBlbnVtIFNoYXBlcyB7XG4gIC8qKiDilIIgKi8gVE9QX1RPX0JPVFRPTSA9ICdNLjUsMCBMLjUsMScsXG4gIC8qKiDilIAgKi8gTEVGVF9UT19SSUdIVCA9ICdNMCwuNSBMMSwuNScsXG5cbiAgLyoqIOKUlCAqLyBUT1BfVE9fUklHSFQgPSAnTS41LDAgTC41LC41IEwxLC41JyxcbiAgLyoqIOKUmCAqLyBUT1BfVE9fTEVGVCA9ICdNLjUsMCBMLjUsLjUgTDAsLjUnLFxuICAvKiog4pSQICovIExFRlRfVE9fQk9UVE9NID0gJ00wLC41IEwuNSwuNSBMLjUsMScsXG4gIC8qKiDilIwgKi8gUklHSFRfVE9fQk9UVE9NID0gJ00wLjUsMSBMLjUsLjUgTDEsLjUnLFxuXG4gIC8qKiDilbUgKi8gTUlERExFX1RPX1RPUCA9ICdNLjUsLjUgTC41LDAnLFxuICAvKiog4pW0ICovIE1JRERMRV9UT19MRUZUID0gJ00uNSwuNSBMMCwuNScsXG4gIC8qKiDilbYgKi8gTUlERExFX1RPX1JJR0hUID0gJ00uNSwuNSBMMSwuNScsXG4gIC8qKiDilbcgKi8gTUlERExFX1RPX0JPVFRPTSA9ICdNLjUsLjUgTC41LDEnLFxuXG4gIC8qKiDilLQgKi8gVF9UT1AgPSAnTTAsLjUgTDEsLjUgTS41LC41IEwuNSwwJyxcbiAgLyoqIOKUpCAqLyBUX0xFRlQgPSAnTS41LDAgTC41LDEgTS41LC41IEwwLC41JyxcbiAgLyoqIOKUnCAqLyBUX1JJR0hUID0gJ00uNSwwIEwuNSwxIE0uNSwuNSBMMSwuNScsXG4gIC8qKiDilKwgKi8gVF9CT1RUT00gPSAnTTAsLjUgTDEsLjUgTS41LC41IEwuNSwxJyxcblxuICAvKiog4pS8ICovIENST1NTID0gJ00wLC41IEwxLC41IE0uNSwwIEwuNSwxJyxcblxuICAvKiog4pWMICovIFRXT19EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjEsLjUgTC40LC41IE0uNiwuNSBMLjksLjUnLCAvLyAuMiBlbXB0eSwgLjMgZmlsbGVkXG4gIC8qKiDilIQgKi8gVEhSRUVfREFTSEVTX0hPUklaT05UQUwgPSAnTS4wNjY3LC41IEwuMjY2NywuNSBNLjQsLjUgTC42LC41IE0uNzMzMywuNSBMLjkzMzMsLjUnLCAvLyAuMTMzMyBlbXB0eSwgLjIgZmlsbGVkXG4gIC8qKiDilIkgKi8gRk9VUl9EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjA1LC41IEwuMiwuNSBNLjMsLjUgTC40NSwuNSBNLjU1LC41IEwuNywuNSBNLjgsLjUgTC45NSwuNScsIC8vIC4xIGVtcHR5LCAuMTUgZmlsbGVkXG4gIC8qKiDilY4gKi8gVFdPX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjEgTC41LC40IE0uNSwuNiBMLjUsLjknLFxuICAvKiog4pSGICovIFRIUkVFX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjA2NjcgTC41LC4yNjY3IE0uNSwuNCBMLjUsLjYgTS41LC43MzMzIEwuNSwuOTMzMycsXG4gIC8qKiDilIogKi8gRk9VUl9EQVNIRVNfVkVSVElDQUwgPSAnTS41LC4wNSBMLjUsLjIgTS41LC4zIEwuNSwuNDUgTC41LC41NSBNLjUsLjcgTC41LC45NScsXG59XG5cbmNvbnN0IGVudW0gU3R5bGUge1xuICBOT1JNQUwgPSAxLFxuICBCT0xEID0gM1xufVxuXG4vKipcbiAqIEBwYXJhbSB4cCBUaGUgcGVyY2VudGFnZSBvZiAxNSUgb2YgdGhlIHggYXhpcy5cbiAqIEBwYXJhbSB5cCBUaGUgcGVyY2VudGFnZSBvZiAxNSUgb2YgdGhlIHggYXhpcyBvbiB0aGUgeSBheGlzLlxuICovXG50eXBlIERyYXdGdW5jdGlvbkRlZmluaXRpb24gPSAoeHA6IG51bWJlciwgeXA6IG51bWJlcikgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFRoaXMgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIGFsbCBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgb2YgU1ZHIHBhdGhzIChpZS4gdGhlXG4gKiBzdmcgZCBhdHRyaWJ1dGUpLlxuICovXG5leHBvcnQgY29uc3QgYm94RHJhd2luZ0RlZmluaXRpb25zOiB7IFtjaGFyYWN0ZXI6IHN0cmluZ106IHsgW2ZvbnRXZWlnaHQ6IG51bWJlcl06IHN0cmluZyB8IERyYXdGdW5jdGlvbkRlZmluaXRpb24gfSB8IHVuZGVmaW5lZCB9ID0ge1xuICAvLyBVbmlmb3JtIG5vcm1hbCBhbmQgYm9sZFxuICAn4pSAJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUgSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5MRUZUX1RPX1JJR0hUIH0sXG4gICfilIInOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pSDJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KUjCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUjyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUkCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSB9LFxuICAn4pSTJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilJQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX1JJR0hUIH0sXG4gICfilJcnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVE9QX1RPX1JJR0hUIH0sXG4gICfilJgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KUmyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pScJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRfUklHSFQgfSxcbiAgJ+KUoyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX1JJR0hUIH0sXG4gICfilKQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9MRUZUIH0sXG4gICfilKsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVF9MRUZUIH0sXG4gICfilKwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9CT1RUT00gfSxcbiAgJ+KUsyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX0JPVFRPTSB9LFxuICAn4pS0JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRfVE9QIH0sXG4gICfilLsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVF9UT1AgfSxcbiAgJ+KUvCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5DUk9TUyB9LFxuICAn4pWLJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkNST1NTIH0sXG4gICfilbQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KVuCc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW1JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVuSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilbYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilbonOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilbcnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pW7JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcblxuICAvLyBEb3VibGUgYm9yZGVyXG4gICfilZAnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVkSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWSJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwxIEwuNSwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTS41LCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVkyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwxIEwkey41IC0geHB9LC41IEwxLC41IE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDFgIH0sXG4gICfilZQnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDFgIH0sXG4gICfilZUnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfSBMLjUsMSBNMCwkey41ICsgeXB9IEwuNSwkey41ICsgeXB9YCB9LFxuICAn4pWWJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41ICsgeHB9LDEgTCR7LjUgKyB4cH0sLjUgTDAsLjUgTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMWAgfSxcbiAgJ+KVlyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMCwkey41IC0geXB9IEwkey41ICsgeHB9LCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVmCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9IE0uNSwkey41IC0geXB9IEwxLCR7LjUgLSB5cH1gIH0sXG4gICfilZknOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsLjUgTCR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMCBNJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwwYCB9LFxuICAn4pWaJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwIE0xLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwwYCB9LFxuICAn4pWbJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTC41LCR7LjUgKyB5cH0gTC41LDAgTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfWAgfSxcbiAgJ+KVnCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwuNSBMJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwwIE0key41IC0geHB9LC41IEwkey41IC0geHB9LDBgIH0sXG4gICfilZ0nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDAgTTAsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilZ4nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTS41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWfJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDEgTSR7LjUgKyB4cH0sLjUgTDEsLjVgIH0sXG4gICfilaAnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0xLCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sJHsuNSArIHlwfSBMJHsuNSArIHhwfSwxIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuICAn4pWhJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLlRPUF9UT19CT1RUT019IE0wLCR7LjUgLSB5cH0gTC41LCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMLjUsJHsuNSArIHlwfWAgfSxcbiAgJ+KVoic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwuNSBMJHsuNSAtIHhwfSwuNSBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWjJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMSBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMGAgfSxcbiAgJ+KVpCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9IE0uNSwkey41ICsgeXB9IEwuNSwxYCB9LFxuICAn4pWlJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9IE0key41IC0geHB9LC41IEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVpic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwkey41ICsgeXB9IEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDFgIH0sXG4gICfilacnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDAgTC41LCR7LjUgLSB5cH0gTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVqCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSBNJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwwIE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaknOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9IE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuICAn4pWqJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLlRPUF9UT19CT1RUT019IE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH1gIH0sXG4gICfilasnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVrCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMSBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMCBNMSwkey41IC0geXB9IEwkey41ICsgeHB9LCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sMGAgfSxcblxuICAvLyBEaWFnb25hbFxuICAn4pWxJzogeyBbU3R5bGUuTk9STUFMXTogJ00xLDAgTDAsMScgfSxcbiAgJ+KVsic6IHsgW1N0eWxlLk5PUk1BTF06ICdNMCwwIEwxLDEnIH0sXG4gICfilbMnOiB7IFtTdHlsZS5OT1JNQUxdOiAnTTEsMCBMMCwxIE0wLDAgTDEsMScgfSxcblxuICAvLyBNaXhlZCB3ZWlnaHRcbiAgJ+KVvCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pW9JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pW+JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KVvyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUjSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSOJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSRJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUkic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUlSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSWJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSZJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUmic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUnSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSeJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSfJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSgJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pShJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX1JJR0hUIH0sXG4gICfilKInOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUpSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilKYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilKcnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilKgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilKknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pSqJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUrSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilK4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KUryc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUsCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUsSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilLInOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUtSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilLYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KUtyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUuCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUuSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilLonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUvSc6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fUklHSFR9YCwgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilL4nOiB7IFtTdHlsZS5OT1JNQUxdOiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gJHtTaGFwZXMuTUlERExFX1RPX0xFRlR9YCwgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KUvyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KVgCc6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSAke1NoYXBlcy5NSURETEVfVE9fQk9UVE9NfWAsIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVgSc6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5NSURETEVfVE9fVE9QfSAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfWAsICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KVgic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KVgyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilYQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KVhSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilYYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KVhyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLk1JRERMRV9UT19UT1B9ICR7U2hhcGVzLkxFRlRfVE9fUklHSFR9YCB9LFxuICAn4pWIJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gJHtTaGFwZXMuTUlERExFX1RPX0JPVFRPTX1gIH0sXG4gICfilYknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fTEVGVH1gIH0sXG4gICfilYonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fUklHSFR9YCB9LFxuXG4gIC8vIERhc2hlZFxuICAn4pWMJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRXT19EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pWNJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRXT19EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pSEJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRIUkVFX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIUnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVEhSRUVfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUiCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5GT1VSX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIknOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuRk9VUl9EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pWOJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRXT19EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KVjyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UV09fREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVEhSRUVfREFTSEVTX1ZFUlRJQ0FMICB9LFxuICAn4pSHJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRIUkVFX0RBU0hFU19WRVJUSUNBTCB9LFxuICAn4pSKJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkZPVVJfREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuRk9VUl9EQVNIRVNfVkVSVElDQUwgfSxcblxuICAvLyBDdXJ2ZWRcbiAgJ+KVrSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMSBMLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDEsLjVgIH0sXG4gICfila4nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDEgTC41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9IEMuNSwkey41ICsgKHlwIC8gLjE1ICogLjUpfSwuNSwuNSwwLC41YCB9LFxuICAn4pWvJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMCwuNWAgfSxcbiAgJ+KVsCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgLSAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDEsLjVgIH1cbn07XG5cbmludGVyZmFjZSBJVmVjdG9yU2hhcGUge1xuICBkOiBzdHJpbmc7XG4gIHR5cGU6IFZlY3RvclR5cGU7XG4gIGxlZnRQYWRkaW5nPzogbnVtYmVyO1xuICByaWdodFBhZGRpbmc/OiBudW1iZXI7XG59XG5cbmNvbnN0IGVudW0gVmVjdG9yVHlwZSB7XG4gIEZJTEwsXG4gIFNUUk9LRVxufVxuXG4vKipcbiAqIFRoaXMgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBwcmltYXJpbHkgdXNlZCBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGFzIHZlY3RvciBzaGFwZXMuIFRoZVxuICogcmVhc29uIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGRlZmluZWQgc3BlY2lhbGx5IGlzIHRvIGF2b2lkIGNvbW1vbiBwcm9ibGVtcyBpZiBhIHVzZXIncyBmb250IGhhc1xuICogbm90IGJlZW4gcGF0Y2hlZCB3aXRoIHBvd2VybGluZSBjaGFyYWN0ZXJzIGFuZCBhbHNvIHRvIGdldCBwaXhlbCBwZXJmZWN0IHJlbmRlcmluZyBhcyByZW5kZXJpbmdcbiAqIGlzc3VlcyBjYW4gb2NjdXIgYXJvdW5kIEFBL1NQQUEuXG4gKlxuICogVGhlIGxpbmUgdmFyaWFudHMgZHJhdyBiZXlvbmQgdGhlIGNlbGwgYW5kIGdldCBjbGlwcGVkIHRvIGVuc3VyZSB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIG5vdFxuICogdmlzaWJsZS5cbiAqXG4gKiBPcmlnaW5hbCBzeW1ib2xzIGRlZmluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3Bvd2VybGluZS9mb250cGF0Y2hlclxuICovXG5leHBvcnQgY29uc3QgcG93ZXJsaW5lRGVmaW5pdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBJVmVjdG9yU2hhcGUgfSA9IHtcbiAgLy8gUmlnaHQgdHJpYW5nbGUgc29saWRcbiAgJ1xcdXtFMEIwfSc6IHsgZDogJ00wLDAgTDEsLjUgTDAsMScsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgcmlnaHRQYWRkaW5nOiAyIH0sXG4gIC8vIFJpZ2h0IHRyaWFuZ2xlIGxpbmVcbiAgJ1xcdXtFMEIxfSc6IHsgZDogJ00tMSwtLjUgTDEsLjUgTC0xLDEuNScsIHR5cGU6IFZlY3RvclR5cGUuU1RST0tFLCBsZWZ0UGFkZGluZzogMSwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIExlZnQgdHJpYW5nbGUgc29saWRcbiAgJ1xcdXtFMEIyfSc6IHsgZDogJ00xLDAgTDAsLjUgTDEsMScsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgbGVmdFBhZGRpbmc6IDIgfSxcbiAgLy8gTGVmdCB0cmlhbmdsZSBsaW5lXG4gICdcXHV7RTBCM30nOiB7IGQ6ICdNMiwtLjUgTDAsLjUgTDIsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gUmlnaHQgc2VtaS1jaXJjbGUgc29saWRcbiAgJ1xcdXtFMEI0fSc6IHsgZDogJ00wLDAgTDAsMSBDMC41NTIsMSwxLDAuNzc2LDEsLjUgQzEsMC4yMjQsMC41NTIsMCwwLDAnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBSaWdodCBzZW1pLWNpcmNsZSBsaW5lXG4gICdcXHV7RTBCNX0nOiB7IGQ6ICdNLjIsMSBDLjQyMiwxLC44LC44MjYsLjc4LC41IEMuOCwuMTc0LDAuNDIyLDAsLjIsMCcsIHR5cGU6IFZlY3RvclR5cGUuU1RST0tFLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCBzZW1pLWNpcmNsZSBzb2xpZFxuICAnXFx1e0UwQjZ9JzogeyBkOiAnTTEsMCBMMSwxIEMwLjQ0OCwxLDAsMC43NzYsMCwuNSBDMCwwLjIyNCwwLjQ0OCwwLDEsMCcsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgbGVmdFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCBzZW1pLWNpcmNsZSBsaW5lXG4gICdcXHV7RTBCN30nOiB7IGQ6ICdNLjgsMSBDMC41NzgsMSwwLjIsLjgyNiwuMjIsLjUgQzAuMiwwLjE3NCwwLjU3OCwwLDAuOCwwJywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxIH0sXG4gIC8vIExvd2VyIGxlZnQgdHJpYW5nbGVcbiAgJ1xcdXtFMEI4fSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41IEwtLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIEJhY2tzbGFzaCBzZXBhcmF0b3JcbiAgJ1xcdXtFMEI5fSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTG93ZXIgcmlnaHQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJBfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41IEwxLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIFVwcGVyIGxlZnQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJDfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41IEwtLjUsLS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIEZvcndhcmQgc2xhc2ggc2VwYXJhdG9yXG4gICdcXHV7RTBCRH0nOiB7IGQ6ICdNMS41LC0uNSBMLS41LDEuNScsIHR5cGU6IFZlY3RvclR5cGUuU1RST0tFLCBsZWZ0UGFkZGluZzogMSwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIFVwcGVyIHJpZ2h0IHRyaWFuZ2xlXG4gICdcXHV7RTBCRX0nOiB7IGQ6ICdNLS41LC0uNSBMMS41LDEuNSBMMS41LC0uNScsIHR5cGU6IFZlY3RvclR5cGUuRklMTCB9XG59O1xuLy8gRm9yd2FyZCBzbGFzaCBzZXBhcmF0b3IgcmVkdW5kYW50XG5wb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkJ9J10gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkR9J107XG4vLyBCYWNrc2xhc2ggc2VwYXJhdG9yIHJlZHVuZGFudFxucG93ZXJsaW5lRGVmaW5pdGlvbnNbJ1xcdXtFMEJGfSddID0gcG93ZXJsaW5lRGVmaW5pdGlvbnNbJ1xcdXtFMEI5fSddO1xuXG4vKipcbiAqIFRyeSBkcmF3aW5nIGEgY3VzdG9tIGJsb2NrIGVsZW1lbnQgb3IgYm94IGRyYXdpbmcgY2hhcmFjdGVyLCByZXR1cm5pbmcgd2hldGhlciBpdCB3YXNcbiAqIHN1Y2Nlc3NmdWxseSBkcmF3bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeURyYXdDdXN0b21DaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgYzogc3RyaW5nLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlcixcbiAgZm9udFNpemU6IG51bWJlcixcbiAgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmxvY2tFbGVtZW50RGVmaW5pdGlvbiA9IGJsb2NrRWxlbWVudERlZmluaXRpb25zW2NdO1xuICBpZiAoYmxvY2tFbGVtZW50RGVmaW5pdGlvbikge1xuICAgIGRyYXdCbG9ja0VsZW1lbnRDaGFyKGN0eCwgYmxvY2tFbGVtZW50RGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHBhdHRlcm5EZWZpbml0aW9uID0gcGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zW2NdO1xuICBpZiAocGF0dGVybkRlZmluaXRpb24pIHtcbiAgICBkcmF3UGF0dGVybkNoYXIoY3R4LCBwYXR0ZXJuRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJveERyYXdpbmdEZWZpbml0aW9uID0gYm94RHJhd2luZ0RlZmluaXRpb25zW2NdO1xuICBpZiAoYm94RHJhd2luZ0RlZmluaXRpb24pIHtcbiAgICBkcmF3Qm94RHJhd2luZ0NoYXIoY3R4LCBib3hEcmF3aW5nRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHBvd2VybGluZURlZmluaXRpb24gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1tjXTtcbiAgaWYgKHBvd2VybGluZURlZmluaXRpb24pIHtcbiAgICBkcmF3UG93ZXJsaW5lQ2hhcihjdHgsIHBvd2VybGluZURlZmluaXRpb24sIHhPZmZzZXQsIHlPZmZzZXQsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCwgZm9udFNpemUsIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBkcmF3QmxvY2tFbGVtZW50Q2hhcihcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGNoYXJEZWZpbml0aW9uOiBJQmxvY2tWZWN0b3JbXSxcbiAgeE9mZnNldDogbnVtYmVyLFxuICB5T2Zmc2V0OiBudW1iZXIsXG4gIGRldmljZUNlbGxXaWR0aDogbnVtYmVyLFxuICBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXJcbik6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJEZWZpbml0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYm94ID0gY2hhckRlZmluaXRpb25baV07XG4gICAgY29uc3QgeEVpZ2h0aCA9IGRldmljZUNlbGxXaWR0aCAvIDg7XG4gICAgY29uc3QgeUVpZ2h0aCA9IGRldmljZUNlbGxIZWlnaHQgLyA4O1xuICAgIGN0eC5maWxsUmVjdChcbiAgICAgIHhPZmZzZXQgKyBib3gueCAqIHhFaWdodGgsXG4gICAgICB5T2Zmc2V0ICsgYm94LnkgKiB5RWlnaHRoLFxuICAgICAgYm94LncgKiB4RWlnaHRoLFxuICAgICAgYm94LmggKiB5RWlnaHRoXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBjYWNoZWRQYXR0ZXJuczogTWFwPFBhdHRlcm5EZWZpbml0aW9uLCBNYXA8LyogZmlsbFN0eWxlICovc3RyaW5nLCBDYW52YXNQYXR0ZXJuPj4gPSBuZXcgTWFwKCk7XG5cbmZ1bmN0aW9uIGRyYXdQYXR0ZXJuQ2hhcihcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGNoYXJEZWZpbml0aW9uOiBudW1iZXJbXVtdLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGxldCBwYXR0ZXJuU2V0ID0gY2FjaGVkUGF0dGVybnMuZ2V0KGNoYXJEZWZpbml0aW9uKTtcbiAgaWYgKCFwYXR0ZXJuU2V0KSB7XG4gICAgcGF0dGVyblNldCA9IG5ldyBNYXAoKTtcbiAgICBjYWNoZWRQYXR0ZXJucy5zZXQoY2hhckRlZmluaXRpb24sIHBhdHRlcm5TZXQpO1xuICB9XG4gIGNvbnN0IGZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7XG4gIGlmICh0eXBlb2YgZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmaWxsU3R5bGUgdHlwZSBcIiR7ZmlsbFN0eWxlfVwiYCk7XG4gIH1cbiAgbGV0IHBhdHRlcm4gPSBwYXR0ZXJuU2V0LmdldChmaWxsU3R5bGUpO1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICBjb25zdCB3aWR0aCA9IGNoYXJEZWZpbml0aW9uWzBdLmxlbmd0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBjaGFyRGVmaW5pdGlvbi5sZW5ndGg7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gY3R4LmNhbnZhcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHRtcENhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIHRtcENhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgdG1wQ3R4ID0gdGhyb3dJZkZhbHN5KHRtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpKTtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgLy8gRXh0cmFjdCByZ2JhIGZyb20gZmlsbFN0eWxlXG4gICAgbGV0IHI6IG51bWJlcjtcbiAgICBsZXQgZzogbnVtYmVyO1xuICAgIGxldCBiOiBudW1iZXI7XG4gICAgbGV0IGE6IG51bWJlcjtcbiAgICBpZiAoZmlsbFN0eWxlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgciA9IHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSgxLCAzKSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSgzLCA1KSwgMTYpO1xuICAgICAgYiA9IHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSg1LCA3KSwgMTYpO1xuICAgICAgYSA9IGZpbGxTdHlsZS5sZW5ndGggPiA3ICYmIHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSg3LCA5KSwgMTYpIHx8IDE7XG4gICAgfSBlbHNlIGlmIChmaWxsU3R5bGUuc3RhcnRzV2l0aCgncmdiYScpKSB7XG4gICAgICAoW3IsIGcsIGIsIGFdID0gZmlsbFN0eWxlLnN1YnN0cmluZyg1LCBmaWxsU3R5bGUubGVuZ3RoIC0gMSkuc3BsaXQoJywnKS5tYXAoZSA9PiBwYXJzZUZsb2F0KGUpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmaWxsU3R5bGUgY29sb3IgZm9ybWF0IFwiJHtmaWxsU3R5bGV9XCIgd2hlbiBkcmF3aW5nIHBhdHRlcm4gZ2x5cGhgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCAgICBdID0gcjtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCArIDFdID0gZztcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCArIDJdID0gYjtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCArIDNdID0gY2hhckRlZmluaXRpb25beV1beF0gKiAoYSAqIDI1NSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRtcEN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICBwYXR0ZXJuID0gdGhyb3dJZkZhbHN5KGN0eC5jcmVhdGVQYXR0ZXJuKHRtcENhbnZhcywgbnVsbCkpO1xuICAgIHBhdHRlcm5TZXQuc2V0KGZpbGxTdHlsZSwgcGF0dGVybik7XG4gIH1cbiAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm47XG4gIGN0eC5maWxsUmVjdCh4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xufVxuXG4vKipcbiAqIERyYXdzIHRoZSBmb2xsb3dpbmcgYm94IGRyYXdpbmcgY2hhcmFjdGVycyBieSBtYXBwaW5nIGEgc3Vic2V0IG9mIFNWRyBkIGF0dHJpYnV0ZSBpbnN0cnVjdGlvbnMgdG9cbiAqIGNhbnZhcyBkcmF3IGNhbGxzLlxuICpcbiAqIEJveCBzdHlsZXM6ICAgICAgIOKUjuKUsOKUkuKUjeKUr+KUkeKVk+KVpeKVluKVkuKVpOKVlSDilI/ilLPilJPilIzilLLilJPilIzilKzilJDilI/ilLHilJBcbiAqIOKUjOKUgOKUrOKUgOKUkCDilI/ilIHilLPilIHilJMg4pWU4pWQ4pWm4pWQ4pWXIOKUoOKVguKUqOKUneKUv+KUpeKVn+KVq+KVouKVnuKVquKVoSDilKHilYfilKnilJzilYrilKvilKLilYjilKrilKPilYnilKRcbiAqIOKUgiDilIIg4pSCIOKUgyDilIMg4pSDIOKVkSDilZEg4pWRIOKUluKUuOKUmuKUleKUt+KUmeKVmeKVqOKVnOKVmOKVp+KVmyDilJTilLTilJjilJTilLrilJvilJfilLvilJvilJfilLnilJhcbiAqIOKUnOKUgOKUvOKUgOKUpCDilKPilIHilYvilIHilKsg4pWg4pWQ4pWs4pWQ4pWjIOKUj+KUseKUkOKUjOKUsuKUk+KUjOKUrOKUkOKUjOKUrOKUkCDilI/ilLPilJPilIzilK7ilJPilIzilKzilJDilI/ilK3ilJBcbiAqIOKUgiDilIIg4pSCIOKUgyDilIMg4pSDIOKVkSDilZEg4pWRIOKUoeKVg+KUpOKUnOKVhOKUqeKUnOKVhuKUquKUouKVheKUpCDilJ7ilYDilKbilJzilL7ilKvilJ/ilYHilKfilKPilL3ilKRcbiAqIOKUlOKUgOKUtOKUgOKUmCDilJfilIHilLvilIHilJsg4pWa4pWQ4pWp4pWQ4pWdIOKUlOKUtOKUmOKUlOKUtOKUmOKUlOKUuuKUm+KUl+KUueKUmCDilJTilLTilJjilJTilLbilJvilJfilLvilJvilJfilLXilJhcbiAqXG4gKiBPdGhlcjpcbiAqIOKVreKUgOKVriDilbIg4pWxIOKVt+KVu+KVjuKVj+KUhuKUh+KUiuKUiyDilbrilb7ilbQg4pWM4pWM4pWMIOKUhOKUhOKUhCDilIjilIjilIhcbiAqIOKUgiDilIIgIOKVsyAg4pW94pW/4pWO4pWP4pSG4pSH4pSK4pSLIOKVtuKVvOKVuCDilY3ilY3ilY0g4pSF4pSF4pSFIOKUieKUieKUiVxuICog4pWw4pSA4pWvIOKVsSDilbIg4pW54pW14pWO4pWP4pSG4pSH4pSK4pSLXG4gKlxuICogQWxsIGJveCBkcmF3aW5nIGNoYXJhY3RlcnM6XG4gKiDilIAg4pSBIOKUgiDilIMg4pSEIOKUhSDilIYg4pSHIOKUiCDilIkg4pSKIOKUiyDilIwg4pSNIOKUjiDilI9cbiAqIOKUkCDilJEg4pSSIOKUkyDilJQg4pSVIOKUliDilJcg4pSYIOKUmSDilJog4pSbIOKUnCDilJ0g4pSeIOKUn1xuICog4pSgIOKUoSDilKIg4pSjIOKUpCDilKUg4pSmIOKUpyDilKgg4pSpIOKUqiDilKsg4pSsIOKUrSDilK4g4pSvXG4gKiDilLAg4pSxIOKUsiDilLMg4pS0IOKUtSDilLYg4pS3IOKUuCDilLkg4pS6IOKUuyDilLwg4pS9IOKUviDilL9cbiAqIOKVgCDilYEg4pWCIOKVgyDilYQg4pWFIOKVhiDilYcg4pWIIOKViSDilYog4pWLIOKVjCDilY0g4pWOIOKVj1xuICog4pWQIOKVkSDilZIg4pWTIOKVlCDilZUg4pWWIOKVlyDilZgg4pWZIOKVmiDilZsg4pWcIOKVnSDilZ4g4pWfXG4gKiDilaAg4pWhIOKVoiDilaMg4pWkIOKVpSDilaYg4pWnIOKVqCDilakg4pWqIOKVqyDilawg4pWtIOKVriDila9cbiAqIOKVsCDilbEg4pWyIOKVsyDilbQg4pW1IOKVtiDilbcg4pW4IOKVuSDilbog4pW7IOKVvCDilb0g4pW+IOKVv1xuICpcbiAqIC0tLVxuICpcbiAqIEJveCBkcmF3aW5nIGFsaWdubWVudCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilohcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilolcbiAqICAg4pWU4pWQ4pWQ4pWm4pWQ4pWQ4pWXICDilIzilIDilIDilKzilIDilIDilJAgIOKVreKUgOKUgOKUrOKUgOKUgOKVriAg4pWt4pSA4pSA4pSs4pSA4pSA4pWuICDilI/ilIHilIHilLPilIHilIHilJMgIOKUjuKUkuKUj+KUkSAgIOKVtyAg4pW7IOKUj+KUr+KUkyDilIzilLDilJAgICAg4paKIOKVseKVsuKVseKVsuKVs+KVs+KVs1xuICogICDilZHilIzilIDilajilIDilJDilZEgIOKUguKVlOKVkOKVp+KVkOKVl+KUgiAg4pSC4pWS4pWQ4pWq4pWQ4pWV4pSCICDilILilZPilIDilYHilIDilZbilIIgIOKUg+KUjOKUgOKVguKUgOKUkOKUgyAg4pSX4pWD4pWE4pSZICDilbbilLzilbTilbrilYvilbjilKDilLzilKgg4pSd4pWL4pSlICAgIOKWiyDilbLilbHilbLilbHilbPilbPilbNcbiAqICAg4pWR4pSC4pWyIOKVseKUguKVkSAg4pSC4pWRICAg4pWR4pSCICDilILilIIg4pSCIOKUguKUgiAg4pSC4pWRIOKUgyDilZHilIIgIOKUg+KUgiDilb8g4pSC4pSDICDilI3ilYXilYbilJMgICDilbUgIOKVuSDilJfilLfilJsg4pSU4pS44pSYICAgIOKWjCDilbHilbLilbHilbLilbPilbPilbNcbiAqICAg4pWg4pWhIOKVsyDilZ7ilaMgIOKUnOKVoiAgIOKVn+KUpCAg4pSc4pS84pSA4pS84pSA4pS84pSkICDilJzilavilIDilYLilIDilavilKQgIOKUo+KUv+KVvuKUvOKVvOKUv+KUqyAg4pSV4pSb4pSW4pSaICAgICDilIzilITilITilJAg4pWOIOKUj+KUheKUheKUkyDilIsg4paNIOKVsuKVseKVsuKVseKVs+KVs+KVs1xuICogICDilZHilILilbEg4pWy4pSC4pWRICDilILilZEgICDilZHilIIgIOKUguKUgiDilIIg4pSC4pSCICDilILilZEg4pSDIOKVkeKUgiAg4pSD4pSCIOKVvSDilILilIMgIOKWkeKWkeKWkuKWkuKWk+KWk+KWiOKWiCDilIogIOKUhiDilY4g4pWPICDilIcg4pSLIOKWjlxuICogICDilZHilJTilIDilaXilIDilJjilZEgIOKUguKVmuKVkOKVpOKVkOKVneKUgiAg4pSC4pWY4pWQ4pWq4pWQ4pWb4pSCICDilILilZnilIDilYDilIDilZzilIIgIOKUg+KUlOKUgOKVguKUgOKUmOKUgyAg4paR4paR4paS4paS4paT4paT4paI4paIIOKUiiAg4pSGIOKVjiDilY8gIOKUhyDilIsg4paPXG4gKiAgIOKVmuKVkOKVkOKVqeKVkOKVkOKVnSAg4pSU4pSA4pSA4pS04pSA4pSA4pSYICDilbDilIDilIDilLTilIDilIDila8gIOKVsOKUgOKUgOKUtOKUgOKUgOKVryAg4pSX4pSB4pSB4pS74pSB4pSB4pSbICAgICAgICAgICDilJTilYzilYzilJgg4pWOIOKUl+KVjeKVjeKUmyDilIsgIOKWgeKWguKWg+KWhOKWheKWhuKWh+KWiFxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly93d3cudzMub3JnLzIwMDEvMDYvdXRmLTgtdGVzdC9VVEYtOC1kZW1vLmh0bWxcbiAqL1xuZnVuY3Rpb24gZHJhd0JveERyYXdpbmdDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IHsgW2ZvbnRXZWlnaHQ6IG51bWJlcl06IHN0cmluZyB8ICgoeHA6IG51bWJlciwgeXA6IG51bWJlcikgPT4gc3RyaW5nKSB9LFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlcixcbiAgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgZm9yIChjb25zdCBbZm9udFdlaWdodCwgaW5zdHJ1Y3Rpb25zXSBvZiBPYmplY3QuZW50cmllcyhjaGFyRGVmaW5pdGlvbikpIHtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4LmxpbmVXaWR0aCA9IGRldmljZVBpeGVsUmF0aW8gKiBOdW1iZXIucGFyc2VJbnQoZm9udFdlaWdodCk7XG4gICAgbGV0IGFjdHVhbEluc3RydWN0aW9uczogc3RyaW5nO1xuICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB4cCA9IC4xNTtcbiAgICAgIGNvbnN0IHlwID0gLjE1IC8gZGV2aWNlQ2VsbEhlaWdodCAqIGRldmljZUNlbGxXaWR0aDtcbiAgICAgIGFjdHVhbEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucyh4cCwgeXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWxJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgYWN0dWFsSW5zdHJ1Y3Rpb25zLnNwbGl0KCcgJykpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBpbnN0cnVjdGlvblswXTtcbiAgICAgIGNvbnN0IGYgPSBzdmdUb0NhbnZhc0luc3RydWN0aW9uTWFwW3R5cGVdO1xuICAgICAgaWYgKCFmKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBmaW5kIGRyYXdpbmcgaW5zdHJ1Y3Rpb25zIGZvciBcIiR7dHlwZX1cImApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gaW5zdHJ1Y3Rpb24uc3Vic3RyaW5nKDEpLnNwbGl0KCcsJyk7XG4gICAgICBpZiAoIWFyZ3NbMF0gfHwgIWFyZ3NbMV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmKGN0eCwgdHJhbnNsYXRlQXJncyhhcmdzLCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIHhPZmZzZXQsIHlPZmZzZXQsIHRydWUsIGRldmljZVBpeGVsUmF0aW8pKTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSgpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkcmF3UG93ZXJsaW5lQ2hhcihcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGNoYXJEZWZpbml0aW9uOiBJVmVjdG9yU2hhcGUsXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IHZvaWQge1xuICAvLyBDbGlwIHRoZSBjZWxsIHRvIG1ha2Ugc3VyZSBkcmF3aW5nIGRvZXNuJ3Qgb2NjdXIgYmV5b25kIGJvdW5kc1xuICBjb25zdCBjbGlwUmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICBjbGlwUmVnaW9uLnJlY3QoeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0KTtcbiAgY3R4LmNsaXAoY2xpcFJlZ2lvbik7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICAvLyBTY2FsZSB0aGUgc3Ryb2tlIHdpdGggRFBSIGFuZCBmb250IHNpemVcbiAgY29uc3QgY3NzTGluZVdpZHRoID0gZm9udFNpemUgLyAxMjtcbiAgY3R4LmxpbmVXaWR0aCA9IGRldmljZVBpeGVsUmF0aW8gKiBjc3NMaW5lV2lkdGg7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgY2hhckRlZmluaXRpb24uZC5zcGxpdCgnICcpKSB7XG4gICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGYgPSBzdmdUb0NhbnZhc0luc3RydWN0aW9uTWFwW3R5cGVdO1xuICAgIGlmICghZikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgZHJhd2luZyBpbnN0cnVjdGlvbnMgZm9yIFwiJHt0eXBlfVwiYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBpbnN0cnVjdGlvbi5zdWJzdHJpbmcoMSkuc3BsaXQoJywnKTtcbiAgICBpZiAoIWFyZ3NbMF0gfHwgIWFyZ3NbMV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmKGN0eCwgdHJhbnNsYXRlQXJncyhcbiAgICAgIGFyZ3MsXG4gICAgICBkZXZpY2VDZWxsV2lkdGgsXG4gICAgICBkZXZpY2VDZWxsSGVpZ2h0LFxuICAgICAgeE9mZnNldCxcbiAgICAgIHlPZmZzZXQsXG4gICAgICBmYWxzZSxcbiAgICAgIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAoY2hhckRlZmluaXRpb24ubGVmdFBhZGRpbmcgPz8gMCkgKiAoY3NzTGluZVdpZHRoIC8gMiksXG4gICAgICAoY2hhckRlZmluaXRpb24ucmlnaHRQYWRkaW5nID8/IDApICogKGNzc0xpbmVXaWR0aCAvIDIpXG4gICAgKSk7XG4gIH1cbiAgaWYgKGNoYXJEZWZpbml0aW9uLnR5cGUgPT09IFZlY3RvclR5cGUuU1RST0tFKSB7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICBjdHguc3Ryb2tlKCk7XG4gIH0gZWxzZSB7XG4gICAgY3R4LmZpbGwoKTtcbiAgfVxuICBjdHguY2xvc2VQYXRoKCk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1heDogbnVtYmVyLCBtaW46IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIG1heCksIG1pbik7XG59XG5cbmNvbnN0IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXA6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgJ0MnOiAoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFyZ3M6IG51bWJlcltdKSA9PiBjdHguYmV6aWVyQ3VydmVUbyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKSxcbiAgJ0wnOiAoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFyZ3M6IG51bWJlcltdKSA9PiBjdHgubGluZVRvKGFyZ3NbMF0sIGFyZ3NbMV0pLFxuICAnTSc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5tb3ZlVG8oYXJnc1swXSwgYXJnc1sxXSlcbn07XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUFyZ3MoYXJnczogc3RyaW5nW10sIGNlbGxXaWR0aDogbnVtYmVyLCBjZWxsSGVpZ2h0OiBudW1iZXIsIHhPZmZzZXQ6IG51bWJlciwgeU9mZnNldDogbnVtYmVyLCBkb0NsYW1wOiBib29sZWFuLCBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXIsIGxlZnRQYWRkaW5nOiBudW1iZXIgPSAwLCByaWdodFBhZGRpbmc6IG51bWJlciA9IDApOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IGFyZ3MubWFwKGUgPT4gcGFyc2VGbG9hdChlKSB8fCBwYXJzZUludChlKSk7XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUb28gZmV3IGFyZ3VtZW50cyBmb3IgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIGZvciAobGV0IHggPSAwOyB4IDwgcmVzdWx0Lmxlbmd0aDsgeCArPSAyKSB7XG4gICAgLy8gVHJhbnNsYXRlIGZyb20gMC0xIHRvIDAtY2VsbFdpZHRoXG4gICAgcmVzdWx0W3hdICo9IGNlbGxXaWR0aCAtIChsZWZ0UGFkZGluZyAqIGRldmljZVBpeGVsUmF0aW8pIC0gKHJpZ2h0UGFkZGluZyAqIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIC8vIEVuc3VyZSBjb29yZGluYXRlIGRvZXNuJ3QgZXNjYXBlIGNlbGwgYm91bmRzIGFuZCByb3VuZCB0byB0aGUgbmVhcmVzdCAwLjUgdG8gZW5zdXJlIGEgY3Jpc3BcbiAgICAvLyBsaW5lIGF0IDEwMCUgZGV2aWNlUGl4ZWxSYXRpb1xuICAgIGlmIChkb0NsYW1wICYmIHJlc3VsdFt4XSAhPT0gMCkge1xuICAgICAgcmVzdWx0W3hdID0gY2xhbXAoTWF0aC5yb3VuZChyZXN1bHRbeF0gKyAwLjUpIC0gMC41LCBjZWxsV2lkdGgsIDApO1xuICAgIH1cbiAgICAvLyBBcHBseSB0aGUgY2VsbCdzIG9mZnNldCAoaWUuIHgqY2VsbFdpZHRoKVxuICAgIHJlc3VsdFt4XSArPSB4T2Zmc2V0ICsgKGxlZnRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIH1cblxuICBmb3IgKGxldCB5ID0gMTsgeSA8IHJlc3VsdC5sZW5ndGg7IHkgKz0gMikge1xuICAgIC8vIFRyYW5zbGF0ZSBmcm9tIDAtMSB0byAwLWNlbGxIZWlnaHRcbiAgICByZXN1bHRbeV0gKj0gY2VsbEhlaWdodDtcbiAgICAvLyBFbnN1cmUgY29vcmRpbmF0ZSBkb2Vzbid0IGVzY2FwZSBjZWxsIGJvdW5kcyBhbmQgcm91bmQgdG8gdGhlIG5lYXJlc3QgMC41IHRvIGVuc3VyZSBhIGNyaXNwXG4gICAgLy8gbGluZSBhdCAxMDAlIGRldmljZVBpeGVsUmF0aW9cbiAgICBpZiAoZG9DbGFtcCAmJiByZXN1bHRbeV0gIT09IDApIHtcbiAgICAgIHJlc3VsdFt5XSA9IGNsYW1wKE1hdGgucm91bmQocmVzdWx0W3ldICsgMC41KSAtIDAuNSwgY2VsbEhlaWdodCwgMCk7XG4gICAgfVxuICAgIC8vIEFwcGx5IHRoZSBjZWxsJ3Mgb2Zmc2V0IChpZS4geCpjZWxsSGVpZ2h0KVxuICAgIHJlc3VsdFt5XSArPSB5T2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYXJlbnRXaW5kb3c6IFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzLCBjYWxsYmFjazogKGRldmljZVdpZHRoOiBudW1iZXIsIGRldmljZUhlaWdodDogbnVtYmVyKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuICAvLyBPYnNlcnZlIGFueSByZXNpemVzIHRvIHRoZSBlbGVtZW50IGFuZCBleHRyYWN0IHRoZSBhY3R1YWwgcGl4ZWwgc2l6ZSBvZiB0aGUgZWxlbWVudCBpZiB0aGVcbiAgLy8gZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZSBBUEkgaXMgc3VwcG9ydGVkLiBUaGlzIGFsbG93cyBjb3JyZWN0aW5nIHJvdW5kaW5nIGVycm9ycyB3aGVuXG4gIC8vIGNvbnZlcnRpbmcgYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCBkZXZpY2UgcGl4ZWxzIHdoaWNoIGNhdXNlcyBibHVycnkgcmVuZGVyaW5nIHdoZW4gZGV2aWNlXG4gIC8vIHBpeGVsIHJhdGlvIGlzIG5vdCBhIHJvdW5kIG51bWJlci5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IHVuZGVmaW5lZCA9IG5ldyBwYXJlbnRXaW5kb3cuUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5LnRhcmdldCA9PT0gZWxlbWVudCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERpc2Nvbm5lY3QgaWYgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZSBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXJcbiAgICBpZiAoISgnZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZScgaW4gZW50cnkpKSB7XG4gICAgICBvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmlyZSB0aGUgY2FsbGJhY2ssIGlnbm9yZSBldmVudHMgd2hlcmUgdGhlIGRpbWVuc2lvbnMgYXJlIDB4MCBhcyB0aGUgY2FudmFzIGlzIGxpa2VseSBoaWRkZW5cbiAgICBjb25zdCB3aWR0aCA9IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemVbMF0uaW5saW5lU2l6ZTtcbiAgICBjb25zdCBoZWlnaHQgPSBlbnRyeS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplWzBdLmJsb2NrU2l6ZTtcbiAgICBpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDApIHtcbiAgICAgIGNhbGxiYWNrKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgfSk7XG4gIHRyeSB7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGJveDogWydkZXZpY2UtcGl4ZWwtY29udGVudC1ib3gnXSB9IGFzIGFueSk7XG4gIH0gY2F0Y2gge1xuICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICBvYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdG9EaXNwb3NhYmxlKCgpID0+IG9ic2VydmVyPy5kaXNjb25uZWN0KCkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGltZW5zaW9ucywgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmRmFsc3k8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQgfCBudWxsKTogVCB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlIG11c3Qgbm90IGJlIGZhbHN5Jyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAvLyBPbmx5IHJldHVybiB0cnVlIGZvciBQb3dlcmxpbmUgc3ltYm9scyB3aGljaCByZXF1aXJlXG4gIC8vIGRpZmZlcmVudCBwYWRkaW5nIGFuZCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBtaW5pbXVtIGNvbnRyYXN0XG4gIC8vIHJhdGlvIHN0YW5kYXJkc1xuICByZXR1cm4gMHhFMEE0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEQ2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTBCMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RTBCNztcbn1cblxuZnVuY3Rpb24gaXNOZXJkRm9udEdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAweEUwMDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEY4RkY7XG59XG5cbmZ1bmN0aW9uIGlzQm94T3JCbG9ja0dseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAweDI1MDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweDI1OUY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vtb2ppKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29kZXBvaW50ID49IDB4MUY2MDAgJiYgY29kZXBvaW50IDw9IDB4MUY2NEYgfHwgLy8gRW1vdGljb25zXG4gICAgY29kZXBvaW50ID49IDB4MUYzMDAgJiYgY29kZXBvaW50IDw9IDB4MUY1RkYgfHwgLy8gTWlzYyBTeW1ib2xzIGFuZCBQaWN0b2dyYXBoc1xuICAgIGNvZGVwb2ludCA+PSAweDFGNjgwICYmIGNvZGVwb2ludCA8PSAweDFGNkZGIHx8IC8vIFRyYW5zcG9ydCBhbmQgTWFwXG4gICAgY29kZXBvaW50ID49IDB4MjYwMCAgJiYgY29kZXBvaW50IDw9IDB4MjZGRiAgfHwgLy8gTWlzYyBzeW1ib2xzXG4gICAgY29kZXBvaW50ID49IDB4MjcwMCAgJiYgY29kZXBvaW50IDw9IDB4MjdCRiAgfHwgLy8gRGluZ2JhdHNcbiAgICBjb2RlcG9pbnQgPj0gMHhGRTAwICAmJiBjb2RlcG9pbnQgPD0gMHhGRTBGICB8fCAvLyBWYXJpYXRpb24gU2VsZWN0b3JzXG4gICAgY29kZXBvaW50ID49IDB4MUY5MDAgJiYgY29kZXBvaW50IDw9IDB4MUY5RkYgfHwgLy8gU3VwcGxlbWVudGFsIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUYxRTYgJiYgY29kZXBvaW50IDw9IDB4MUYxRkZcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93UmVzY2FsaW5nKGNvZGVwb2ludDogbnVtYmVyIHwgdW5kZWZpbmVkLCB3aWR0aDogbnVtYmVyLCBnbHlwaFNpemVYOiBudW1iZXIsIGRldmljZUNlbGxXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgLy8gSXMgc2luZ2xlIGNlbGwgd2lkdGhcbiAgICB3aWR0aCA9PT0gMSAmJlxuICAgIC8vIEdseXBoIGV4Y2VlZHMgY2VsbCBib3VuZHMsIGFkZCA1MCUgdG8gYXZvaWQgaHVydGluZyByZWFkYWJpbGl0eSBieSByZXNjYWxpbmcgZ2x5cGhzIHRoYXRcbiAgICAvLyBiYXJlbHkgb3ZlcmxhcFxuICAgIGdseXBoU2l6ZVggPiBNYXRoLmNlaWwoZGV2aWNlQ2VsbFdpZHRoICogMS41KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgYXNjaWlcbiAgICBjb2RlcG9pbnQgIT09IHVuZGVmaW5lZCAmJiBjb2RlcG9pbnQgPiAweEZGICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBlbW9qaVxuICAgICFpc0Vtb2ppKGNvZGVwb2ludCkgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIHBvd2VybGluZSBvciBuZXJkIGZvbnRzXG4gICAgIWlzUG93ZXJsaW5lR2x5cGgoY29kZXBvaW50KSAmJiAhaXNOZXJkRm9udEdseXBoKGNvZGVwb2ludClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcihjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpIHx8IGlzQm94T3JCbG9ja0dseXBoKGNvZGVwb2ludCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk6IElSZW5kZXJEaW1lbnNpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBjc3M6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKVxuICAgIH0sXG4gICAgZGV2aWNlOiB7XG4gICAgICBjYW52YXM6IGNyZWF0ZURpbWVuc2lvbigpLFxuICAgICAgY2VsbDogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjaGFyOiB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGltZW5zaW9uKCk6IElEaW1lbnNpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVOZXh0VmFyaWFudE9mZnNldChjZWxsV2lkdGg6IG51bWJlciwgbGluZVdpZHRoOiBudW1iZXIsIGN1cnJlbnRPZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gKGNlbGxXaWR0aCAtIChNYXRoLnJvdW5kKGxpbmVXaWR0aCkgKiAyIC0gY3VycmVudE9mZnNldCkpICUgKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuY2xhc3MgU2VsZWN0aW9uUmVuZGVyTW9kZWwgaW1wbGVtZW50cyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwge1xuICBwdWJsaWMgaGFzU2VsZWN0aW9uITogYm9vbGVhbjtcbiAgcHVibGljIGNvbHVtblNlbGVjdE1vZGUhOiBib29sZWFuO1xuICBwdWJsaWMgdmlld3BvcnRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0RW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0Q2FwcGVkRW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgc3RhcnRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBlbmRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IDA7XG4gICAgdGhpcy5zdGFydENvbCA9IDA7XG4gICAgdGhpcy5lbmRDb2wgPSAwO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKHRlcm1pbmFsOiBJVGVybWluYWwsIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICAvLyBTZWxlY3Rpb24gZG9lcyBub3QgZXhpc3RcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQgfHwgKHN0YXJ0WzBdID09PSBlbmRbMF0gJiYgc3RhcnRbMV0gPT09IGVuZFsxXSkpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2xhdGUgZnJvbSBidWZmZXIgcG9zaXRpb24gdG8gdmlld3BvcnQgcG9zaXRpb25cbiAgICBjb25zdCB2aWV3cG9ydFkgPSB0ZXJtaW5hbC5idWZmZXJzLmFjdGl2ZS55ZGlzcDtcbiAgICBjb25zdCB2aWV3cG9ydFN0YXJ0Um93ID0gc3RhcnRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRFbmRSb3cgPSBlbmRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IE1hdGgubWF4KHZpZXdwb3J0U3RhcnRSb3csIDApO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gTWF0aC5taW4odmlld3BvcnRFbmRSb3csIHRlcm1pbmFsLnJvd3MgLSAxKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gZHJhdyB0aGUgc2VsZWN0aW9uXG4gICAgaWYgKHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPj0gdGVybWluYWwucm93cyB8fCB2aWV3cG9ydENhcHBlZEVuZFJvdyA8IDApIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5jb2x1bW5TZWxlY3RNb2RlID0gY29sdW1uU2VsZWN0TW9kZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSB2aWV3cG9ydFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSB2aWV3cG9ydEVuZFJvdztcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3cgPSB2aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB0aGlzLnN0YXJ0Q29sID0gc3RhcnRbMF07XG4gICAgdGhpcy5lbmRDb2wgPSBlbmRbMF07XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsU2VsZWN0ZWQodGVybWluYWw6IFRlcm1pbmFsLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgeSAtPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICBpZiAodGhpcy5jb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydENvbCA8PSB0aGlzLmVuZENvbCkge1xuICAgICAgICByZXR1cm4geCA+PSB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgICAgeCA8IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICAgIH1cbiAgICAgIHJldHVybiB4IDwgdGhpcy5zdGFydENvbCAmJiB5ID49IHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyAmJlxuICAgICAgICB4ID49IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB9XG4gICAgcmV0dXJuICh5ID4gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHkgPCB0aGlzLnZpZXdwb3J0RW5kUm93KSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sICYmIHggPCB0aGlzLmVuZENvbCkgfHxcbiAgICAgICh0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPCB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHggPj0gdGhpcy5zdGFydENvbCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsKCk6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgRElNX09QQUNJVFksIFRFWFRfQkFTRUxJTkUgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMnO1xuaW1wb3J0IHsgdHJ5RHJhd0N1c3RvbUNoYXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DdXN0b21HbHlwaHMnO1xuaW1wb3J0IHsgY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0LCB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IsIGlzUG93ZXJsaW5lR2x5cGgsIGlzUmVzdHJpY3RlZFBvd2VybGluZUdseXBoLCB0aHJvd0lmRmFsc3kgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IElCb3VuZGluZ0JveCwgSUNoYXJBdGxhc0NvbmZpZywgSVJhc3Rlcml6ZWRHbHlwaCwgSVRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IE5VTExfQ09MT1IsIGNoYW5uZWxzLCBjb2xvciwgcmdiYSB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IEZvdXJLZXlNYXAgfSBmcm9tICdjb21tb24vTXVsdGlLZXlNYXAnO1xuaW1wb3J0IHsgSWRsZVRhc2tRdWV1ZSB9IGZyb20gJ2NvbW1vbi9UYXNrUXVldWUnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSVVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuLyoqXG4gKiBBIHNoYXJlZCBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBkcmF3IG5vdGhpbmcgZm9yIGEgcGFydGljdWxhciBjZWxsLlxuICovXG5jb25zdCBOVUxMX1JBU1RFUklaRURfR0xZUEg6IElSYXN0ZXJpemVkR2x5cGggPSB7XG4gIHRleHR1cmVQYWdlOiAwLFxuICB0ZXh0dXJlUG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICB0ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2U6IHsgeDogMCwgeTogMCB9LFxuICBvZmZzZXQ6IHsgeDogMCwgeTogMCB9LFxuICBzaXplOiB7IHg6IDAsIHk6IDAgfSxcbiAgc2l6ZUNsaXBTcGFjZTogeyB4OiAwLCB5OiAwIH1cbn07XG5cbmNvbnN0IFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyA9IDI7XG5cbmNvbnN0IGVudW0gQ29uc3RhbnRzIHtcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgcGl4ZWwgcGFkZGluZyB0byBhbGxvdyBpbiBlYWNoIHJvdy4gU2V0dGluZyB0aGlzIHRvIHplcm8gd291bGQgbWFrZSB0aGUgYXRsYXNcbiAgICogcGFnZSBwYWNrIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUsIGJ1dCBtb3JlIHBhZ2VzIHdvdWxkIGVuZCB1cCBiZWluZyBjcmVhdGVkIGFzIGEgcmVzdWx0LlxuICAgKi9cbiAgUk9XX1BJWEVMX1RIUkVTSE9MRCA9IDIsXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0ZXh0dXJlIHNpemUgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBhY3R1YWwgaGFyZHdhcmUgbWF4aW11bSB0dXJucyBvdXQgdG8gYmUuIFRoaXNcbiAgICogaXMgZW5mb3JjZWQgdG8gZW5zdXJlIHVwbG9hZGluZyB0aGUgdGV4dHVyZSBzdGlsbCBmaW5pc2hlcyBpbiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUuIEFcbiAgICogNDA5NiBzcXVhcmVkIGltYWdlIHRha2VzIHVwIDE2TUIgb2YgR1BVIG1lbW9yeS5cbiAgICovXG4gIEZPUkNFRF9NQVhfVEVYVFVSRV9TSVpFID0gNDA5NlxufVxuXG5pbnRlcmZhY2UgSUNoYXJBdGxhc0FjdGl2ZVJvdyB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuLy8gV29yayB2YXJpYWJsZXMgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uXG5sZXQgJGdseXBoID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgY2xhc3MgVGV4dHVyZUF0bGFzIGltcGxlbWVudHMgSVRleHR1cmVBdGxhcyB7XG4gIHByaXZhdGUgX2RpZFdhcm1VcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2NhY2hlTWFwOiBGb3VyS2V5TWFwPG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgSVJhc3Rlcml6ZWRHbHlwaD4gPSBuZXcgRm91cktleU1hcCgpO1xuICBwcml2YXRlIF9jYWNoZU1hcENvbWJpbmVkOiBGb3VyS2V5TWFwPHN0cmluZywgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgSVJhc3Rlcml6ZWRHbHlwaD4gPSBuZXcgRm91cktleU1hcCgpO1xuXG4gIC8vIFRoZSB0ZXh0dXJlIHRoYXQgdGhlIGF0bGFzIGlzIGRyYXduIHRvXG4gIHByaXZhdGUgX3BhZ2VzOiBBdGxhc1BhZ2VbXSA9IFtdO1xuICBwdWJsaWMgZ2V0IHBhZ2VzKCk6IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgdmVyc2lvbjogbnVtYmVyIH1bXSB7IHJldHVybiB0aGlzLl9wYWdlczsgfVxuXG4gIC8vIFRoZSBzZXQgb2YgYXRsYXMgcGFnZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0b1xuICBwcml2YXRlIF9hY3RpdmVQYWdlczogQXRsYXNQYWdlW10gPSBbXTtcblxuICBwcml2YXRlIF90bXBDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAvLyBBIHRlbXBvcmFyeSBjb250ZXh0IHRoYXQgZ2x5cGhzIGFyZSBkcmF3biB0byBiZWZvcmUgYmVpbmcgdHJhbnNmZXJlZCB0byB0aGUgYXRsYXMuXG4gIHByaXZhdGUgX3RtcEN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgX3dvcmtCb3VuZGluZ0JveDogSUJvdW5kaW5nQm94ID0geyB0b3A6IDAsIGxlZnQ6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAgfTtcbiAgcHJpdmF0ZSBfd29ya0F0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZURhdGEgPSBuZXcgQXR0cmlidXRlRGF0YSgpO1xuXG4gIHByaXZhdGUgX3RleHR1cmVTaXplOiBudW1iZXIgPSA1MTI7XG5cbiAgcHVibGljIHN0YXRpYyBtYXhBdGxhc1BhZ2VzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgbWF4VGV4dHVyZVNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IElDaGFyQXRsYXNDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdW5pY29kZVNlcnZpY2U6IElVbmljb2RlU2VydmljZVxuICApIHtcbiAgICB0aGlzLl9jcmVhdGVOZXdQYWdlKCk7XG4gICAgdGhpcy5fdG1wQ2FudmFzID0gY3JlYXRlQ2FudmFzKFxuICAgICAgX2RvY3VtZW50LFxuICAgICAgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAqIDQgKyBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiAyLFxuICAgICAgdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgKyBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiAyXG4gICAgKTtcbiAgICB0aGlzLl90bXBDdHggPSB0aHJvd0lmRmFsc3kodGhpcy5fdG1wQ2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IHRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSxcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VzKSB7XG4gICAgICBwYWdlLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgcHVibGljIHdhcm1VcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RpZFdhcm1VcCkge1xuICAgICAgdGhpcy5fZG9XYXJtVXAoKTtcbiAgICAgIHRoaXMuX2RpZFdhcm1VcCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZG9XYXJtVXAoKTogdm9pZCB7XG4gICAgLy8gUHJlLWZpbGwgd2l0aCBBU0NJSSAzMy0xMjYsIHRoaXMgaXMgbm90IHVyZ2VudCBhbmQgZG9uZSBpbiBpZGxlIGNhbGxiYWNrc1xuICAgIGNvbnN0IHF1ZXVlID0gbmV3IElkbGVUYXNrUXVldWUoKTtcbiAgICBmb3IgKGxldCBpID0gMzM7IGkgPCAxMjY7IGkrKykge1xuICAgICAgcXVldWUuZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVNYXAuZ2V0KGksIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfRVhUKSkge1xuICAgICAgICAgIGNvbnN0IHJhc3Rlcml6ZWRHbHlwaCA9IHRoaXMuX2RyYXdUb0NhY2hlKGksIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfRVhUKTtcbiAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQoaSwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQsIHJhc3Rlcml6ZWRHbHlwaCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3RDbGVhck1vZGVsID0gZmFsc2U7XG4gIHB1YmxpYyBiZWdpbkZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2xlYXJNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhZ2VzWzBdLmN1cnJlbnRSb3cueCA9PT0gMCAmJiB0aGlzLl9wYWdlc1swXS5jdXJyZW50Um93LnkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuX3BhZ2VzKSB7XG4gICAgICBwYWdlLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuX2NhY2hlTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fY2FjaGVNYXBDb21iaW5lZC5jbGVhcigpO1xuICAgIHRoaXMuX2RpZFdhcm1VcCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlTmV3UGFnZSgpOiBBdGxhc1BhZ2Uge1xuICAgIC8vIFRyeSBtZXJnZSB0aGUgc2V0IG9mIHRoZSA0IG1vc3QgdXNlZCBwYWdlcyBvZiB0aGUgbGFyZ2VzdCBzaXplLiBUaGlzIGlzIGlzIGRlZmVycmVkIHRvIGFcbiAgICAvLyBtaWNyb3Rhc2sgdG8gZW5zdXJlIGl0IGRvZXMgbm90IGludGVycnVwdCB0ZXh0dXJlcyB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgaW4gdGhlIGN1cnJlbnRcbiAgICAvLyBhbmltYXRpb24gZnJhbWUgd2hpY2ggd291bGQgcmVzdWx0IGluIGJsYW5rIHJlbmRlcmVkIGFyZWFzLiBUaGlzIGlzIGFjdHVhbGx5IG5vdCB0aGF0XG4gICAgLy8gZXhwZW5zaXZlIHJlbGF0aXZlIHRvIGRyYXdpbmcgdGhlIGdseXBocywgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGZvciBhbiBpZGxlIGNhbGxiYWNrLlxuICAgIGlmIChUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyAmJiB0aGlzLl9wYWdlcy5sZW5ndGggPj0gTWF0aC5tYXgoNCwgVGV4dHVyZUF0bGFzLm1heEF0bGFzUGFnZXMpKSB7XG4gICAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdGhlIGxhcmdlc3QgNCBpbWFnZXMsIGJlbG93IHRoZSBtYXhpbXVtIHNpemUsIHdpdGggdGhlIGhpZ2hlc3RcbiAgICAgIC8vIHBlcmNlbnRhZ2VzIHVzZWRcbiAgICAgIGNvbnN0IHBhZ2VzQnlTaXplID0gdGhpcy5fcGFnZXMuZmlsdGVyKGUgPT4ge1xuICAgICAgICByZXR1cm4gZS5jYW52YXMud2lkdGggKiAyIDw9IChUZXh0dXJlQXRsYXMubWF4VGV4dHVyZVNpemUgfHwgQ29uc3RhbnRzLkZPUkNFRF9NQVhfVEVYVFVSRV9TSVpFKTtcbiAgICAgIH0pLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGIuY2FudmFzLndpZHRoICE9PSBhLmNhbnZhcy53aWR0aCkge1xuICAgICAgICAgIHJldHVybiBiLmNhbnZhcy53aWR0aCAtIGEuY2FudmFzLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiLnBlcmNlbnRhZ2VVc2VkIC0gYS5wZXJjZW50YWdlVXNlZDtcbiAgICAgIH0pO1xuICAgICAgbGV0IHNhbWVTaXplSSA9IC0xO1xuICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlc0J5U2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFnZXNCeVNpemVbaV0uY2FudmFzLndpZHRoICE9PSBzaXplKSB7XG4gICAgICAgICAgc2FtZVNpemVJID0gaTtcbiAgICAgICAgICBzaXplID0gcGFnZXNCeVNpemVbaV0uY2FudmFzLndpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKGkgLSBzYW1lU2l6ZUkgPT09IDMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHYXRoZXIgZGV0YWlscyBvZiB0aGUgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdpbmdQYWdlcyA9IHBhZ2VzQnlTaXplLnNsaWNlKHNhbWVTaXplSSwgc2FtZVNpemVJICsgNCk7XG4gICAgICBjb25zdCBzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzID0gbWVyZ2luZ1BhZ2VzLm1hcChlID0+IGUuZ2x5cGhzWzBdLnRleHR1cmVQYWdlKS5zb3J0KChhLCBiKSA9PiBhID4gYiA/IDEgOiAtMSk7XG4gICAgICBjb25zdCBtZXJnZWRQYWdlSW5kZXggPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIG1lcmdpbmdQYWdlcy5sZW5ndGg7XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhlIG5ldyBwYWdlXG4gICAgICBjb25zdCBtZXJnZWRQYWdlID0gdGhpcy5fbWVyZ2VQYWdlcyhtZXJnaW5nUGFnZXMsIG1lcmdlZFBhZ2VJbmRleCk7XG4gICAgICBtZXJnZWRQYWdlLnZlcnNpb24rKztcblxuICAgICAgLy8gRGVsZXRlIHRoZSBwYWdlcywgc2hpZnRpbmcgZ2x5cGggdGV4dHVyZSBwYWdlcyBhcyBuZWVkZWRcbiAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMuX2RlbGV0ZVBhZ2Uoc29ydGVkTWVyZ2luZ1BhZ2VzSW5kZXhlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgbmV3IG1lcmdlZCBwYWdlIHRvIHRoZSBlbmRcbiAgICAgIHRoaXMucGFnZXMucHVzaChtZXJnZWRQYWdlKTtcblxuICAgICAgLy8gUmVxdWVzdCB0aGUgbW9kZWwgdG8gYmUgY2xlYXJlZCB0byByZWZyZXNoIGFsbCB0ZXh0dXJlIHBhZ2VzLlxuICAgICAgdGhpcy5fcmVxdWVzdENsZWFyTW9kZWwgPSB0cnVlO1xuICAgICAgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZmlyZShtZXJnZWRQYWdlLmNhbnZhcyk7XG4gICAgfVxuXG4gICAgLy8gQWxsIG5ldyBhdGxhcyBwYWdlcyBhcmUgY3JlYXRlZCBzbWFsbCBhcyB0aGV5IGFyZSBoaWdobHkgZHluYW1pY1xuICAgIGNvbnN0IG5ld1BhZ2UgPSBuZXcgQXRsYXNQYWdlKHRoaXMuX2RvY3VtZW50LCB0aGlzLl90ZXh0dXJlU2l6ZSk7XG4gICAgdGhpcy5fcGFnZXMucHVzaChuZXdQYWdlKTtcbiAgICB0aGlzLl9hY3RpdmVQYWdlcy5wdXNoKG5ld1BhZ2UpO1xuICAgIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmZpcmUobmV3UGFnZS5jYW52YXMpO1xuICAgIHJldHVybiBuZXdQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWVyZ2VQYWdlcyhtZXJnaW5nUGFnZXM6IEF0bGFzUGFnZVtdLCBtZXJnZWRQYWdlSW5kZXg6IG51bWJlcik6IEF0bGFzUGFnZSB7XG4gICAgY29uc3QgbWVyZ2VkU2l6ZSA9IG1lcmdpbmdQYWdlc1swXS5jYW52YXMud2lkdGggKiAyO1xuICAgIGNvbnN0IG1lcmdlZFBhZ2UgPSBuZXcgQXRsYXNQYWdlKHRoaXMuX2RvY3VtZW50LCBtZXJnZWRTaXplLCBtZXJnaW5nUGFnZXMpO1xuICAgIGZvciAoY29uc3QgW2ksIHBdIG9mIG1lcmdpbmdQYWdlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogcC5jYW52YXMud2lkdGggJSBtZXJnZWRTaXplO1xuICAgICAgY29uc3QgeU9mZnNldCA9IE1hdGguZmxvb3IoaSAvIDIpICogcC5jYW52YXMuaGVpZ2h0O1xuICAgICAgbWVyZ2VkUGFnZS5jdHguZHJhd0ltYWdlKHAuY2FudmFzLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgIGZvciAoY29uc3QgZyBvZiBwLmdseXBocykge1xuICAgICAgICBnLnRleHR1cmVQYWdlID0gbWVyZ2VkUGFnZUluZGV4O1xuICAgICAgICBnLnNpemVDbGlwU3BhY2UueCA9IGcuc2l6ZS54IC8gbWVyZ2VkU2l6ZTtcbiAgICAgICAgZy5zaXplQ2xpcFNwYWNlLnkgPSBnLnNpemUueSAvIG1lcmdlZFNpemU7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uLnggKz0geE9mZnNldDtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb24ueSArPSB5T2Zmc2V0O1xuICAgICAgICBnLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54ID0gZy50ZXh0dXJlUG9zaXRpb24ueCAvIG1lcmdlZFNpemU7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnkgPSBnLnRleHR1cmVQb3NpdGlvbi55IC8gbWVyZ2VkU2l6ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMuZmlyZShwLmNhbnZhcyk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgbWVyZ2luZyBwYWdlIGZyb20gYWN0aXZlIHBhZ2VzIGlmIGl0IHdhcyB0aGVyZVxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hY3RpdmVQYWdlcy5pbmRleE9mKHApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVQYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkUGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2RlbGV0ZVBhZ2UocGFnZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9wYWdlcy5zcGxpY2UocGFnZUluZGV4LCAxKTtcbiAgICBmb3IgKGxldCBqID0gcGFnZUluZGV4OyBqIDwgdGhpcy5fcGFnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFkanVzdGluZ1BhZ2UgPSB0aGlzLl9wYWdlc1tqXTtcbiAgICAgIGZvciAoY29uc3QgZyBvZiBhZGp1c3RpbmdQYWdlLmdseXBocykge1xuICAgICAgICBnLnRleHR1cmVQYWdlLS07XG4gICAgICB9XG4gICAgICBhZGp1c3RpbmdQYWdlLnZlcnNpb24rKztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFzdGVyaXplZEdseXBoQ29tYmluZWRDaGFyKGNoYXJzOiBzdHJpbmcsIGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIGV4dDogbnVtYmVyLCByZXN0cmljdFRvQ2VsbEhlaWdodDogYm9vbGVhbik6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgIHJldHVybiB0aGlzLl9nZXRGcm9tQ2FjaGVNYXAodGhpcy5fY2FjaGVNYXBDb21iaW5lZCwgY2hhcnMsIGJnLCBmZywgZXh0LCByZXN0cmljdFRvQ2VsbEhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFzdGVyaXplZEdseXBoKGNvZGU6IG51bWJlciwgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0OiBib29sZWFuKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEZyb21DYWNoZU1hcCh0aGlzLl9jYWNoZU1hcCwgY29kZSwgYmcsIGZnLCBleHQsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBnbHlwaHMgdGV4dHVyZSBjb29yZHMsIGRyYXdpbmcgdGhlIHRleHR1cmUgaWYgaXQncyBub3QgYWxyZWFkeVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RnJvbUNhY2hlTWFwKFxuICAgIGNhY2hlTWFwOiBGb3VyS2V5TWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgSVJhc3Rlcml6ZWRHbHlwaD4sXG4gICAga2V5OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgYmc6IG51bWJlcixcbiAgICBmZzogbnVtYmVyLFxuICAgIGV4dDogbnVtYmVyLFxuICAgIHJlc3RyaWN0VG9DZWxsSGVpZ2h0OiBib29sZWFuID0gZmFsc2VcbiAgKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgJGdseXBoID0gY2FjaGVNYXAuZ2V0KGtleSwgYmcsIGZnLCBleHQpO1xuICAgIGlmICghJGdseXBoKSB7XG4gICAgICAkZ2x5cGggPSB0aGlzLl9kcmF3VG9DYWNoZShrZXksIGJnLCBmZywgZXh0LCByZXN0cmljdFRvQ2VsbEhlaWdodCk7XG4gICAgICBjYWNoZU1hcC5zZXQoa2V5LCBiZywgZmcsIGV4dCwgJGdseXBoKTtcbiAgICB9XG4gICAgcmV0dXJuICRnbHlwaDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbG9yRnJvbUFuc2lJbmRleChpZHg6IG51bWJlcik6IElDb2xvciB7XG4gICAgaWYgKGlkeCA+PSB0aGlzLl9jb25maWcuY29sb3JzLmFuc2kubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbG9yIGZvdW5kIGZvciBpZHggJyArIGlkeCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmFuc2lbaWR4XTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJhY2tncm91bmRDb2xvcihiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGRpbTogYm9vbGVhbik6IElDb2xvciB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgLy8gVGhlIGJhY2tncm91bmQgY29sb3IgbWlnaHQgaGF2ZSBzb21lIHRyYW5zcGFyZW5jeSwgc28gd2UgbmVlZCB0byByZW5kZXIgaXQgYXMgZnVsbHlcbiAgICAgIC8vIHRyYW5zcGFyZW50IGluIHRoZSBhdGxhcy4gT3RoZXJ3aXNlIHdlJ2QgZW5kIHVwIGRyYXdpbmcgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQgdHdpY2VcbiAgICAgIC8vIGFyb3VuZCB0aGUgYW50aS1hbGlhc2VkIGVkZ2VzIG9mIHRoZSBnbHlwaCwgYW5kIGl0IHdvdWxkIGxvb2sgdG9vIGRhcmsuXG4gICAgICByZXR1cm4gTlVMTF9DT0xPUjtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBJQ29sb3I7XG4gICAgc3dpdGNoIChiZ0NvbG9yTW9kZSkge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICByZXN1bHQgPSB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoYmdDb2xvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgY29uc3QgYXJyID0gQXR0cmlidXRlRGF0YS50b0NvbG9yUkdCKGJnQ29sb3IpO1xuICAgICAgICByZXN1bHQgPSBjaGFubmVscy50b0NvbG9yKGFyclswXSwgYXJyWzFdLCBhcnJbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXN1bHQgPSBjb2xvci5vcGFxdWUodGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9jb25maWcuY29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEZvcmVncm91bmRDb2xvcihiZzogbnVtYmVyLCBiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGZnOiBudW1iZXIsIGZnQ29sb3JNb2RlOiBudW1iZXIsIGZnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgZGltOiBib29sZWFuLCBib2xkOiBib29sZWFuLCBleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzOiBib29sZWFuKTogSUNvbG9yIHtcbiAgICBjb25zdCBtaW5pbXVtQ29udHJhc3RDb2xvciA9IHRoaXMuX2dldE1pbmltdW1Db250cmFzdENvbG9yKGJnLCBiZ0NvbG9yTW9kZSwgYmdDb2xvciwgZmcsIGZnQ29sb3JNb2RlLCBmZ0NvbG9yLCBpbnZlcnNlLCBib2xkLCBkaW0sIGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHMpO1xuICAgIGlmIChtaW5pbXVtQ29udHJhc3RDb2xvcikge1xuICAgICAgcmV0dXJuIG1pbmltdW1Db250cmFzdENvbG9yO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IElDb2xvcjtcbiAgICBzd2l0Y2ggKGZnQ29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiYgYm9sZCAmJiBmZ0NvbG9yIDwgOCkge1xuICAgICAgICAgIGZnQ29sb3IgKz0gODtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoZmdDb2xvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgY29uc3QgYXJyID0gQXR0cmlidXRlRGF0YS50b0NvbG9yUkdCKGZnQ29sb3IpO1xuICAgICAgICByZXN1bHQgPSBjaGFubmVscy50b0NvbG9yKGFyclswXSwgYXJyWzFdLCBhcnJbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9jb25maWcuY29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIHVzZSBhbiBvcGFxdWUgY29sb3IgcmVnYXJkbGVzcyBvZiBhbGxvd1RyYW5zcGFyZW5jeVxuICAgIGlmICh0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kpIHtcbiAgICAgIHJlc3VsdCA9IGNvbG9yLm9wYXF1ZShyZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRpbSB0byB0aGUgY29sb3IsIG9wYWNpdHkgaXMgZmluZSB0byB1c2UgZm9yIHRoZSBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgaWYgKGRpbSkge1xuICAgICAgcmVzdWx0ID0gY29sb3IubXVsdGlwbHlPcGFjaXR5KHJlc3VsdCwgRElNX09QQUNJVFkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlQmFja2dyb3VuZFJnYmEoYmdDb2xvck1vZGU6IG51bWJlciwgYmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGJnQ29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoYmdDb2xvcikucmdiYTtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgIHJldHVybiBiZ0NvbG9yIDw8IDg7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmJhY2tncm91bmQucmdiYTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlRm9yZWdyb3VuZFJnYmEoZmdDb2xvck1vZGU6IG51bWJlciwgZmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuLCBib2xkOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGZnQ29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiYgYm9sZCAmJiBmZ0NvbG9yIDwgOCkge1xuICAgICAgICAgIGZnQ29sb3IgKz0gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGZnQ29sb3IpLnJnYmE7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICByZXR1cm4gZmdDb2xvciA8PCA4O1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmJhY2tncm91bmQucmdiYTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0TWluaW11bUNvbnRyYXN0Q29sb3IoYmc6IG51bWJlciwgYmdDb2xvck1vZGU6IG51bWJlciwgYmdDb2xvcjogbnVtYmVyLCBmZzogbnVtYmVyLCBmZ0NvbG9yTW9kZTogbnVtYmVyLCBmZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4sIGRpbTogYm9vbGVhbiwgZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kczogYm9vbGVhbik6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5taW5pbXVtQ29udHJhc3RSYXRpbyA9PT0gMSB8fCBleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFRyeSBnZXQgZnJvbSBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5fZ2V0Q29udHJhc3RDYWNoZShkaW0pO1xuICAgIGNvbnN0IGFkanVzdGVkQ29sb3IgPSBjYWNoZS5nZXRDb2xvcihiZywgZmcpO1xuICAgIGlmIChhZGp1c3RlZENvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBhZGp1c3RlZENvbG9yIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBiZ1JnYmEgPSB0aGlzLl9yZXNvbHZlQmFja2dyb3VuZFJnYmEoYmdDb2xvck1vZGUsIGJnQ29sb3IsIGludmVyc2UpO1xuICAgIGNvbnN0IGZnUmdiYSA9IHRoaXMuX3Jlc29sdmVGb3JlZ3JvdW5kUmdiYShmZ0NvbG9yTW9kZSwgZmdDb2xvciwgaW52ZXJzZSwgYm9sZCk7XG4gICAgLy8gRGltIGNlbGxzIG9ubHkgcmVxdWlyZSBoYWxmIHRoZSBjb250cmFzdCwgb3RoZXJ3aXNlIHRoZXkgd291bGRuJ3QgYmUgZGlzdGluZ3Vpc2hhYmxlIGZyb21cbiAgICAvLyBub24tZGltIGNlbGxzXG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYS5lbnN1cmVDb250cmFzdFJhdGlvKGJnUmdiYSwgZmdSZ2JhLCB0aGlzLl9jb25maWcubWluaW11bUNvbnRyYXN0UmF0aW8gLyAoZGltID8gMiA6IDEpKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICBjYWNoZS5zZXRDb2xvcihiZywgZmcsIG51bGwpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvciA9IGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAocmVzdWx0ID4+IDI0KSAmIDB4RkYsXG4gICAgICAocmVzdWx0ID4+IDE2KSAmIDB4RkYsXG4gICAgICAocmVzdWx0ID4+IDgpICYgMHhGRlxuICAgICk7XG4gICAgY2FjaGUuc2V0Q29sb3IoYmcsIGZnLCBjb2xvcik7XG5cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb250cmFzdENhY2hlKGRpbTogYm9vbGVhbik6IElDb2xvckNvbnRyYXN0Q2FjaGUge1xuICAgIGlmIChkaW0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmhhbGZDb250cmFzdENhY2hlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5jb250cmFzdENhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1RvQ2FjaGUoY29kZU9yQ2hhcnM6IG51bWJlciB8IHN0cmluZywgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIHJlc3RyaWN0VG9DZWxsSGVpZ2h0OiBib29sZWFuID0gZmFsc2UpOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICBjb25zdCBjaGFycyA9IHR5cGVvZiBjb2RlT3JDaGFycyA9PT0gJ251bWJlcicgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVPckNoYXJzKSA6IGNvZGVPckNoYXJzO1xuXG4gICAgLy8gVW5jb21tZW50IGZvciBkZWJ1Z2dpbmdcbiAgICAvLyBjb25zb2xlLmxvZyhgZHJhdyB0byBjYWNoZSBcIiR7Y2hhcnN9XCJgLCBiZywgZmcsIGV4dCk7XG5cbiAgICAvLyBBbGxvdyAxIGNlbGwgd2lkdGggcGVyIGNoYXJhY3Rlciwgd2l0aCBhIG1pbmltdW0gb2YgMiAoQ0pLKSwgcGx1cyBzb21lIHBhZGRpbmcuIFRoaXMgaXMgdXNlZFxuICAgIC8vIHRvIGRyYXcgdGhlIGdseXBoIHRvIHRoZSBjYW52YXMgYXMgd2VsbCBhcyB0byByZXN0cmljdCB0aGUgYm91bmRpbmcgYm94IHNlYXJjaCB0byBlbnN1cmVcbiAgICAvLyBnaWFudCBsaWdhdHVyZXMgKGVnLiA9PT09PT4pIGRvbid0IGltcGFjdCBvdmVyYWxsIHBlcmZvcm1hbmNlLlxuICAgIGNvbnN0IGFsbG93ZWRXaWR0aCA9IE1hdGgubWluKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggKiBNYXRoLm1heChjaGFycy5sZW5ndGgsIDIpICsgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogMiwgdGhpcy5fdGV4dHVyZVNpemUpO1xuICAgIGlmICh0aGlzLl90bXBDYW52YXMud2lkdGggPCBhbGxvd2VkV2lkdGgpIHtcbiAgICAgIHRoaXMuX3RtcENhbnZhcy53aWR0aCA9IGFsbG93ZWRXaWR0aDtcbiAgICB9XG4gICAgLy8gSW5jbHVkZSBsaW5lIGhlaWdodCB3aGVuIGRyYXdpbmcgZ2x5cGhzXG4gICAgY29uc3QgYWxsb3dlZEhlaWdodCA9IE1hdGgubWluKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0ICsgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogNCwgdGhpcy5fdGV4dHVyZVNpemUpO1xuICAgIGlmICh0aGlzLl90bXBDYW52YXMuaGVpZ2h0IDwgYWxsb3dlZEhlaWdodCkge1xuICAgICAgdGhpcy5fdG1wQ2FudmFzLmhlaWdodCA9IGFsbG93ZWRIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG5cbiAgICB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5mZyA9IGZnO1xuICAgIHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmJnID0gYmc7XG4gICAgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZXh0ZW5kZWQuZXh0ID0gZXh0O1xuXG4gICAgY29uc3QgaW52aXNpYmxlID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0ludmlzaWJsZSgpO1xuICAgIGlmIChpbnZpc2libGUpIHtcbiAgICAgIHJldHVybiBOVUxMX1JBU1RFUklaRURfR0xZUEg7XG4gICAgfVxuXG4gICAgY29uc3QgYm9sZCA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNCb2xkKCk7XG4gICAgY29uc3QgaW52ZXJzZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNJbnZlcnNlKCk7XG4gICAgY29uc3QgZGltID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0RpbSgpO1xuICAgIGNvbnN0IGl0YWxpYyA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNJdGFsaWMoKTtcbiAgICBjb25zdCB1bmRlcmxpbmUgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzVW5kZXJsaW5lKCk7XG4gICAgY29uc3Qgc3RyaWtldGhyb3VnaCA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNTdHJpa2V0aHJvdWdoKCk7XG4gICAgY29uc3Qgb3ZlcmxpbmUgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzT3ZlcmxpbmUoKTtcbiAgICBsZXQgZmdDb2xvciA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldEZnQ29sb3IoKTtcbiAgICBsZXQgZmdDb2xvck1vZGUgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRGZ0NvbG9yTW9kZSgpO1xuICAgIGxldCBiZ0NvbG9yID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0QmdDb2xvcigpO1xuICAgIGxldCBiZ0NvbG9yTW9kZSA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldEJnQ29sb3JNb2RlKCk7XG4gICAgaWYgKGludmVyc2UpIHtcbiAgICAgIGNvbnN0IHRlbXAgPSBmZ0NvbG9yO1xuICAgICAgZmdDb2xvciA9IGJnQ29sb3I7XG4gICAgICBiZ0NvbG9yID0gdGVtcDtcbiAgICAgIGNvbnN0IHRlbXAyID0gZmdDb2xvck1vZGU7XG4gICAgICBmZ0NvbG9yTW9kZSA9IGJnQ29sb3JNb2RlO1xuICAgICAgYmdDb2xvck1vZGUgPSB0ZW1wMjtcbiAgICB9XG5cbiAgICAvLyBkcmF3IHRoZSBiYWNrZ3JvdW5kXG4gICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gdGhpcy5fZ2V0QmFja2dyb3VuZENvbG9yKGJnQ29sb3JNb2RlLCBiZ0NvbG9yLCBpbnZlcnNlLCBkaW0pO1xuICAgIC8vIFVzZSBhICdjb3B5JyBjb21wb3NpdGUgb3BlcmF0aW9uIHRvIGNsZWFyIGFueSBleGlzdGluZyBnbHlwaCBvdXQgb2YgX3RtcEN0eFdpdGhBbHBoYSxcbiAgICAvLyByZWdhcmRsZXNzIG9mIHRyYW5zcGFyZW5jeSBpbiBiYWNrZ3JvdW5kQ29sb3JcbiAgICB0aGlzLl90bXBDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgIHRoaXMuX3RtcEN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3IuY3NzO1xuICAgIHRoaXMuX3RtcEN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLl90bXBDYW52YXMud2lkdGgsIHRoaXMuX3RtcENhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuX3RtcEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuXG4gICAgLy8gZHJhdyB0aGUgZm9yZWdyb3VuZC9nbHlwaFxuICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBib2xkID8gdGhpcy5fY29uZmlnLmZvbnRXZWlnaHRCb2xkIDogdGhpcy5fY29uZmlnLmZvbnRXZWlnaHQ7XG4gICAgY29uc3QgZm9udFN0eWxlID0gaXRhbGljID8gJ2l0YWxpYycgOiAnJztcbiAgICB0aGlzLl90bXBDdHguZm9udCA9XG4gICAgICBgJHtmb250U3R5bGV9ICR7Zm9udFdlaWdodH0gJHt0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpb31weCAke3RoaXMuX2NvbmZpZy5mb250RmFtaWx5fWA7XG4gICAgdGhpcy5fdG1wQ3R4LnRleHRCYXNlbGluZSA9IFRFWFRfQkFTRUxJTkU7XG5cbiAgICBjb25zdCBwb3dlcmxpbmVHbHlwaCA9IGNoYXJzLmxlbmd0aCA9PT0gMSAmJiBpc1Bvd2VybGluZUdseXBoKGNoYXJzLmNoYXJDb2RlQXQoMCkpO1xuICAgIGNvbnN0IHJlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCA9IGNoYXJzLmxlbmd0aCA9PT0gMSAmJiBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaChjaGFycy5jaGFyQ29kZUF0KDApKTtcbiAgICBjb25zdCBmb3JlZ3JvdW5kQ29sb3IgPSB0aGlzLl9nZXRGb3JlZ3JvdW5kQ29sb3IoYmcsIGJnQ29sb3JNb2RlLCBiZ0NvbG9yLCBmZywgZmdDb2xvck1vZGUsIGZnQ29sb3IsIGludmVyc2UsIGRpbSwgYm9sZCwgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNoYXJzLmNoYXJDb2RlQXQoMCkpKTtcbiAgICB0aGlzLl90bXBDdHguZmlsbFN0eWxlID0gZm9yZWdyb3VuZENvbG9yLmNzcztcblxuICAgIC8vIEZvciBwb3dlcmxpbmUgZ2x5cGhzIGxlZnQvdG9wIHBhZGRpbmcgaXMgZXhjbHVkZWQgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvdnNjb2RlL2lzc3Vlcy8xMjAxMjkpXG4gICAgY29uc3QgcGFkZGluZyA9IHJlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCA/IDAgOiBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgKiAyO1xuXG4gICAgLy8gRHJhdyBjdXN0b20gY2hhcmFjdGVycyBpZiBhcHBsaWNhYmxlXG4gICAgbGV0IGN1c3RvbUdseXBoID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5jdXN0b21HbHlwaHMgIT09IGZhbHNlKSB7XG4gICAgICBjdXN0b21HbHlwaCA9IHRyeURyYXdDdXN0b21DaGFyKHRoaXMuX3RtcEN0eCwgY2hhcnMsIHBhZGRpbmcsIHBhZGRpbmcsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0LCB0aGlzLl9jb25maWcuZm9udFNpemUsIHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRvIGNsZWFyIHBpeGVscyBiYXNlZCBvbiBhIHRocmVzaG9sZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGdseXBoIGNvbG9yIGFuZCB0aGVcbiAgICAvLyBiYWNrZ3JvdW5kIGNvbG9yLiBUaGlzIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZSBnbHlwaCBjb250YWlucyBtdWx0aXBsZSBjb2xvcnMgc3VjaCBhc1xuICAgIC8vIHVuZGVybGluZSBjb2xvcnMgdG8gcHJldmVudCBpbXBvcnRhbnQgY29sb3JzIGNvdWxkIGdldCBjbGVhcmVkLlxuICAgIGxldCBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrID0gIXBvd2VybGluZUdseXBoO1xuXG4gICAgbGV0IGNoV2lkdGg6IG51bWJlcjtcbiAgICBpZiAodHlwZW9mIGNvZGVPckNoYXJzID09PSAnbnVtYmVyJykge1xuICAgICAgY2hXaWR0aCA9IHRoaXMuX3VuaWNvZGVTZXJ2aWNlLndjd2lkdGgoY29kZU9yQ2hhcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaFdpZHRoID0gdGhpcy5fdW5pY29kZVNlcnZpY2UuZ2V0U3RyaW5nQ2VsbFdpZHRoKGNvZGVPckNoYXJzKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IHVuZGVybGluZVxuICAgIGlmICh1bmRlcmxpbmUpIHtcbiAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5mb250U2l6ZSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvIC8gMTUpKTtcbiAgICAgIC8vIFdoZW4gdGhlIGxpbmUgd2lkdGggaXMgb2RkLCBkcmF3IGF0IGEgMC41IHBvc2l0aW9uXG4gICAgICBjb25zdCB5T2Zmc2V0ID0gbGluZVdpZHRoICUgMiA9PT0gMSA/IDAuNSA6IDA7XG4gICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuXG4gICAgICAvLyBVbmRlcmxpbmUgY29sb3JcbiAgICAgIGlmICh0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1VuZGVybGluZUNvbG9yRGVmYXVsdCgpKSB7XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX3RtcEN0eC5maWxsU3R5bGU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzVW5kZXJsaW5lQ29sb3JSR0IoKSkge1xuICAgICAgICBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IGByZ2IoJHtBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IodGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0VW5kZXJsaW5lQ29sb3IoKSkuam9pbignLCcpfSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayA9IGZhbHNlO1xuICAgICAgICBsZXQgZmcgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRVbmRlcmxpbmVDb2xvcigpO1xuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmIHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzQm9sZCgpICYmIGZnIDwgOCkge1xuICAgICAgICAgIGZnICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGZnKS5jc3M7XG4gICAgICB9XG5cbiAgICAgIC8vIFVuZGVybGluZSBzdHlsZS9zdHJva2VcbiAgICAgIHRoaXMuX3RtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnN0IHhMZWZ0ID0gcGFkZGluZztcbiAgICAgIGNvbnN0IHlUb3AgPSBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0KSAtIHlPZmZzZXQgLSAocmVzdHJpY3RUb0NlbGxIZWlnaHQgPyBsaW5lV2lkdGggKiAyIDogMCk7XG4gICAgICBjb25zdCB5TWlkID0geVRvcCArIGxpbmVXaWR0aDtcbiAgICAgIGNvbnN0IHlCb3QgPSB5VG9wICsgbGluZVdpZHRoICogMjtcbiAgICAgIGxldCBuZXh0T2Zmc2V0ID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0VW5kZXJsaW5lVmFyaWFudE9mZnNldCgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoV2lkdGg7IGkrKykge1xuICAgICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgICBjb25zdCB4Q2hMZWZ0ID0geExlZnQgKyBpICogdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aDtcbiAgICAgICAgY29uc3QgeENoUmlnaHQgPSB4TGVmdCArIChpICsgMSkgKiB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgICBjb25zdCB4Q2hNaWQgPSB4Q2hMZWZ0ICsgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDI7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUpIHtcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLkRPVUJMRTpcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeUJvdCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5Qm90KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuQ1VSTFk6XG4gICAgICAgICAgICAvLyBDaG9vc2UgdGhlIGJlemllciB0b3AgYW5kIGJvdHRvbSBiYXNlZCBvbiB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvLCB0aGUgY3VybHkgbGluZSBpc1xuICAgICAgICAgICAgLy8gbWFkZSB0YWxsZXIgd2hlbiB0aGUgbGluZSB3aWR0aCBpcyAgYXMgb3RoZXJ3aXNlIGl0J3Mgbm90IHZlcnkgY2xlYXIgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgY29uc3QgeUN1cmx5Qm90ID0gbGluZVdpZHRoIDw9IDEgPyB5Qm90IDogTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCAtIGxpbmVXaWR0aCAvIDIpIC0geU9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IHlDdXJseVRvcCA9IGxpbmVXaWR0aCA8PSAxID8geVRvcCA6IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgKyBsaW5lV2lkdGggLyAyKSAtIHlPZmZzZXQ7XG4gICAgICAgICAgICAvLyBDbGlwIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyBvZiB0aGUgdW5kZXJsaW5lIHN1Y2ggdGhhdCBpdCBjYW4gYmUgZHJhd24ganVzdCBvdXRzaWRlXG4gICAgICAgICAgICAvLyB0aGUgZWRnZSBvZiB0aGUgY2VsbCB0byBlbnN1cmUgYSBjb250aW51b3VzIHN0cm9rZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB1bmRlcmxpbmVkXG4gICAgICAgICAgICAvLyBnbHlwaHMgYWRqYWNlbnQgdG8gb25lIGFub3RoZXIuXG4gICAgICAgICAgICBjb25zdCBjbGlwUmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICAgICAgY2xpcFJlZ2lvbi5yZWN0KHhDaExlZnQsIHlUb3AsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGgsIHlCb3QgLSB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5jbGlwKGNsaXBSZWdpb24pO1xuICAgICAgICAgICAgLy8gU3RhcnQgMS8yIGNlbGwgYmVmb3JlIGFuZCBlbmQgMS8yIGNlbGxzIGFmdGVyIHRvIGVuc3VyZSBhIHNtb290aCBjdXJ2ZSB3aXRoIG90aGVyXG4gICAgICAgICAgICAvLyBjZWxsc1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0IC0gdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDIsIHlNaWQpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHhDaExlZnQgLSB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeUN1cmx5VG9wLFxuICAgICAgICAgICAgICB4Q2hMZWZ0LCB5Q3VybHlUb3AsXG4gICAgICAgICAgICAgIHhDaExlZnQsIHlNaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoTGVmdCwgeUN1cmx5Qm90LFxuICAgICAgICAgICAgICB4Q2hNaWQsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoTWlkLCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHhDaE1pZCwgeUN1cmx5VG9wLFxuICAgICAgICAgICAgICB4Q2hSaWdodCwgeUN1cmx5VG9wLFxuICAgICAgICAgICAgICB4Q2hSaWdodCwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hSaWdodCwgeUN1cmx5Qm90LFxuICAgICAgICAgICAgICB4Q2hSaWdodCArIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaFJpZ2h0ICsgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDIsIHlNaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLkRPVFRFRDpcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFdpZHRoID0gbmV4dE9mZnNldCA9PT0gMCA/IDAgOlxuICAgICAgICAgICAgICAobmV4dE9mZnNldCA+PSBsaW5lV2lkdGggPyBsaW5lV2lkdGggKiAyIC0gbmV4dE9mZnNldCA6IGxpbmVXaWR0aCAtIG5leHRPZmZzZXQpO1xuICAgICAgICAgICAgICAvLyBhIGxpbmUgYW5kIGEgZ2FwLlxuICAgICAgICAgICAgY29uc3QgaXNMaW5lU3RhcnQgPSBuZXh0T2Zmc2V0ID49IGxpbmVXaWR0aCA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCA9PT0gZmFsc2UgfHwgb2Zmc2V0V2lkdGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnNldExpbmVEYXNoKFtNYXRoLnJvdW5kKGxpbmVXaWR0aCksIE1hdGgucm91bmQobGluZVdpZHRoKV0pO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQgKyBvZmZzZXRXaWR0aCwgeVRvcCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnNldExpbmVEYXNoKFtNYXRoLnJvdW5kKGxpbmVXaWR0aCksIE1hdGgucm91bmQobGluZVdpZHRoKV0pO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaExlZnQgKyBvZmZzZXRXaWR0aCwgeVRvcCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCArIG9mZnNldFdpZHRoICsgbGluZVdpZHRoLCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0KHhDaFJpZ2h0IC0geENoTGVmdCwgbGluZVdpZHRoLCBuZXh0T2Zmc2V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuREFTSEVEOlxuICAgICAgICAgICAgY29uc3QgbGluZVJhdGlvID0gMC42O1xuICAgICAgICAgICAgY29uc3QgZ2FwUmF0aW8gPSAwLjM7XG4gICAgICAgICAgICAvLyBFbmQgbGluZSByYXRpbyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIDAuMVxuICAgICAgICAgICAgY29uc3QgeENoV2lkdGggPSB4Q2hSaWdodCAtIHhDaExlZnQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gTWF0aC5mbG9vcihsaW5lUmF0aW8gKiB4Q2hXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBnYXAgPSBNYXRoLmZsb29yKGdhcFJhdGlvICogeENoV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0geENoV2lkdGggLSBsaW5lIC0gZ2FwO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnNldExpbmVEYXNoKFtsaW5lLCBnYXAsIGVuZF0pO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5TSU5HTEU6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2UoKTtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG5cbiAgICAgIC8vIERyYXcgc3Ryb2tlIGluIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBub24gY3VzdG9tIGNoYXJhY3RlcnMgaW4gb3JkZXIgdG8gZ2l2ZSBhbiBvdXRsaW5lXG4gICAgICAvLyBiZXR3ZWVuIHRoZSB0ZXh0IGFuZCB0aGUgdW5kZXJsaW5lLiBPbmx5IGRvIHRoaXMgd2hlbiBmb250IHNpemUgaXMgPj0gMTIgYXMgdGhlIHVuZGVybGluZVxuICAgICAgLy8gbG9va3Mgb2RkIHdoZW4gdGhlIGZvbnQgc2l6ZSBpcyB0b28gc21hbGxcbiAgICAgIGlmICghY3VzdG9tR2x5cGggJiYgdGhpcy5fY29uZmlnLmZvbnRTaXplID49IDEyKSB7XG4gICAgICAgIC8vIFRoaXMgb25seSB3b3JrcyB3aGVuIHRyYW5zcGFyZW5jeSBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyIGhvdyB0byBjbGVhciBzdHJva2VkXG4gICAgICAgIC8vIHRleHRcbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kgJiYgY2hhcnMgIT09ICcgJykge1xuICAgICAgICAgIC8vIE1lYXN1cmUgdGhlIHRleHQsIG9ubHkgZHJhdyB0aGUgc3Ryb2tlIGlmIHRoZXJlIGlzIGEgZGVzY2VudCBiZXlvbmQgYW4gYWxwaGFiZXRpYyB0ZXh0XG4gICAgICAgICAgLy8gYmFzZWxpbmVcbiAgICAgICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7XG4gICAgICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMuX3RtcEN0eC5tZWFzdXJlVGV4dChjaGFycyk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICBpZiAoJ2FjdHVhbEJvdW5kaW5nQm94RGVzY2VudCcgaW4gbWV0cmljcyAmJiBtZXRyaWNzLmFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgdHJhbnNsYXRlcyB0byAxLzIgdGhlIGxpbmUgd2lkdGggaW4gZWl0aGVyIGRpcmVjdGlvblxuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgICAgICAgIC8vIENsaXAgdGhlIHJlZ2lvbiB0byBvbmx5IGRyYXcgaW4gdmFsaWQgcGl4ZWxzIG5lYXIgdGhlIHVuZGVybGluZSB0byBhdm9pZCBhIHNsaWdodFxuICAgICAgICAgICAgLy8gb3V0bGluZSBhcm91bmQgdGhlIHdob2xlIGdseXBoLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgcGl4ZWxzIGluIHRoZSBnbHlwaCBhdCB0aGUgdG9wXG4gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBpbmNyZWFzZSBHUFUgbWVtb3J5IGRlbWFuZHNcbiAgICAgICAgICAgIGNvbnN0IGNsaXBSZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgICAgICBjbGlwUmVnaW9uLnJlY3QoeExlZnQsIHlUb3AgLSBNYXRoLmNlaWwobGluZVdpZHRoIC8gMiksIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggKiBjaFdpZHRoLCB5Qm90IC0geVRvcCArIE1hdGguY2VpbChsaW5lV2lkdGggLyAyKSk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguY2xpcChjbGlwUmVnaW9uKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lV2lkdGggPSB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAqIDM7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3IuY3NzO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVRleHQoY2hhcnMsIHBhZGRpbmcsIHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE92ZXJsaW5lXG4gICAgaWYgKG92ZXJsaW5lKSB7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5mb250U2l6ZSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvIC8gMTUpKTtcbiAgICAgIGNvbnN0IHlPZmZzZXQgPSBsaW5lV2lkdGggJSAyID09PSAxID8gMC41IDogMDtcbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl90bXBDdHguZmlsbFN0eWxlO1xuICAgICAgdGhpcy5fdG1wQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyhwYWRkaW5nLCBwYWRkaW5nICsgeU9mZnNldCk7XG4gICAgICB0aGlzLl90bXBDdHgubGluZVRvKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhcldpZHRoICogY2hXaWR0aCwgcGFkZGluZyArIHlPZmZzZXQpO1xuICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZSgpO1xuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIGNoYXJhY3RlclxuICAgIGlmICghY3VzdG9tR2x5cGgpIHtcbiAgICAgIHRoaXMuX3RtcEN0eC5maWxsVGV4dChjaGFycywgcGFkZGluZywgcGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlIGFuZCBiZXlvbmQgdGhlIGNlbGwgYm91bmRzLCBzaGlmdCBpdCB1cCB1bnRpbCBpdCBpcyB2aXNpYmxlXG4gICAgLy8gZXZlbiBvbiB0aGUgYm90dG9tIHJvdywgdHJ5IGZvciBhIG1heGltdW0gb2YgNSBwaXhlbHMuXG4gICAgaWYgKGNoYXJzID09PSAnXycgJiYgIXRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgbGV0IGlzQmV5b25kQ2VsbEJvdW5kcyA9IGNsZWFyQ29sb3IodGhpcy5fdG1wQ3R4LmdldEltYWdlRGF0YShwYWRkaW5nLCBwYWRkaW5nLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCksIGJhY2tncm91bmRDb2xvciwgZm9yZWdyb3VuZENvbG9yLCBlbmFibGVDbGVhclRocmVzaG9sZENoZWNrKTtcbiAgICAgIGlmIChpc0JleW9uZENlbGxCb3VuZHMpIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMTsgb2Zmc2V0IDw9IDU7IG9mZnNldCsrKSB7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yLmNzcztcbiAgICAgICAgICB0aGlzLl90bXBDdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5fdG1wQ2FudmFzLndpZHRoLCB0aGlzLl90bXBDYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5maWxsVGV4dChjaGFycywgcGFkZGluZywgcGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC0gb2Zmc2V0KTtcbiAgICAgICAgICBpc0JleW9uZENlbGxCb3VuZHMgPSBjbGVhckNvbG9yKHRoaXMuX3RtcEN0eC5nZXRJbWFnZURhdGEocGFkZGluZywgcGFkZGluZywgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQpLCBiYWNrZ3JvdW5kQ29sb3IsIGZvcmVncm91bmRDb2xvciwgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayk7XG4gICAgICAgICAgaWYgKCFpc0JleW9uZENlbGxCb3VuZHMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgc3Ryb2tldGhyb3VnaFxuICAgIGlmIChzdHJpa2V0aHJvdWdoKSB7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5mb250U2l6ZSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VQaXhlbFJhdGlvIC8gMTApKTtcbiAgICAgIGNvbnN0IHlPZmZzZXQgPSB0aGlzLl90bXBDdHgubGluZVdpZHRoICUgMiA9PT0gMSA/IDAuNSA6IDA7IC8vIFdoZW4gdGhlIHdpZHRoIGlzIG9kZCwgZHJhdyBhdCAwLjUgcG9zaXRpb25cbiAgICAgIHRoaXMuX3RtcEN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl90bXBDdHguZmlsbFN0eWxlO1xuICAgICAgdGhpcy5fdG1wQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyhwYWRkaW5nLCBwYWRkaW5nICsgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCAvIDIpIC0geU9mZnNldCk7XG4gICAgICB0aGlzLl90bXBDdHgubGluZVRvKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhcldpZHRoICogY2hXaWR0aCwgcGFkZGluZyArIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLyAyKSAtIHlPZmZzZXQpO1xuICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG5cbiAgICAvLyBjbGVhciB0aGUgYmFja2dyb3VuZCBmcm9tIHRoZSBjaGFyYWN0ZXIgdG8gYXZvaWQgaXNzdWVzIHdpdGggZHJhd2luZyBvdmVyIHRoZSBwcmV2aW91c1xuICAgIC8vIGNoYXJhY3RlciBpZiBpdCBleHRlbmRzIHBhc3QgaXQncyBib3VuZHNcbiAgICBjb25zdCBpbWFnZURhdGEgPSB0aGlzLl90bXBDdHguZ2V0SW1hZ2VEYXRhKFxuICAgICAgMCwgMCwgdGhpcy5fdG1wQ2FudmFzLndpZHRoLCB0aGlzLl90bXBDYW52YXMuaGVpZ2h0XG4gICAgKTtcblxuICAgIC8vIENsZWFyIG91dCB0aGUgYmFja2dyb3VuZCBjb2xvciBhbmQgZGV0ZXJtaW5lIGlmIHRoZSBnbHlwaCBpcyBlbXB0eS5cbiAgICBsZXQgaXNFbXB0eTogYm9vbGVhbjtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgaXNFbXB0eSA9IGNsZWFyQ29sb3IoaW1hZ2VEYXRhLCBiYWNrZ3JvdW5kQ29sb3IsIGZvcmVncm91bmRDb2xvciwgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRW1wdHkgPSBjaGVja0NvbXBsZXRlbHlUcmFuc3BhcmVudChpbWFnZURhdGEpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlbXB0eSBnbHlwaHNcbiAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgcmV0dXJuIE5VTExfUkFTVEVSSVpFRF9HTFlQSDtcbiAgICB9XG5cbiAgICBjb25zdCByYXN0ZXJpemVkR2x5cGggPSB0aGlzLl9maW5kR2x5cGhCb3VuZGluZ0JveChpbWFnZURhdGEsIHRoaXMuX3dvcmtCb3VuZGluZ0JveCwgYWxsb3dlZFdpZHRoLCByZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgsIGN1c3RvbUdseXBoLCBwYWRkaW5nKTtcblxuICAgIC8vIEZpbmQgdGhlIGJlc3QgYXRsYXMgcm93IHRvIHVzZVxuICAgIGxldCBhY3RpdmVQYWdlOiBBdGxhc1BhZ2U7XG4gICAgbGV0IGFjdGl2ZVJvdzogSUNoYXJBdGxhc0FjdGl2ZVJvdztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBwYWdlcyAodGhlIGxhc3Qgc21hbGxlc3QgNCB3ZXJlIG1lcmdlZCksIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgIGlmICh0aGlzLl9hY3RpdmVQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgbmV3UGFnZSA9IHRoaXMuX2NyZWF0ZU5ld1BhZ2UoKTtcbiAgICAgICAgYWN0aXZlUGFnZSA9IG5ld1BhZ2U7XG4gICAgICAgIGFjdGl2ZVJvdyA9IG5ld1BhZ2UuY3VycmVudFJvdztcbiAgICAgICAgYWN0aXZlUm93LmhlaWdodCA9IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIGJlc3QgY3VycmVudCByb3cgZnJvbSBhbGwgYWN0aXZlIHBhZ2VzXG4gICAgICBhY3RpdmVQYWdlID0gdGhpcy5fYWN0aXZlUGFnZXNbdGhpcy5fYWN0aXZlUGFnZXMubGVuZ3RoIC0gMV07XG4gICAgICBhY3RpdmVSb3cgPSBhY3RpdmVQYWdlLmN1cnJlbnRSb3c7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fYWN0aXZlUGFnZXMpIHtcbiAgICAgICAgaWYgKHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPD0gcC5jdXJyZW50Um93LmhlaWdodCkge1xuICAgICAgICAgIGFjdGl2ZVBhZ2UgPSBwO1xuICAgICAgICAgIGFjdGl2ZVJvdyA9IHAuY3VycmVudFJvdztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBUaGlzIGFsZ29yaXRobSBjb3VsZCBiZSBzaW1wbGlmaWVkOlxuICAgICAgLy8gLSBTZWFyY2ggZm9yIHRoZSBwYWdlIHdpdGggUk9XX1BJWEVMX1RIUkVTSE9MRCBpbiBtaW5kXG4gICAgICAvLyAtIEtlZXAgdHJhY2sgb2YgY3VycmVudC9maXhlZCByb3dzIGluIGEgTWFwXG5cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGJlc3QgY3VycmVudCByb3cgd2l0aCBhIGZpeGVkIHJvdyBpZiB0aGVyZSBpcyBvbmUgYXQgbGVhc3QgYXMgZ29vZCBhcyB0aGVcbiAgICAgIC8vIGN1cnJlbnQgcm93LiBTZWFyY2ggaW4gcmV2ZXJzZSB0byBwcmlvcml0aXplIGZpbGxpbmcgaW4gb2xkZXIgcGFnZXMuXG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5fYWN0aXZlUGFnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5fYWN0aXZlUGFnZXNbaV0uZml4ZWRSb3dzKSB7XG4gICAgICAgICAgaWYgKHJvdy5oZWlnaHQgPD0gYWN0aXZlUm93LmhlaWdodCAmJiByYXN0ZXJpemVkR2x5cGguc2l6ZS55IDw9IHJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgIGFjdGl2ZVBhZ2UgPSB0aGlzLl9hY3RpdmVQYWdlc1tpXTtcbiAgICAgICAgICAgIGFjdGl2ZVJvdyA9IHJvdztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgaWYgdG9vIG11Y2ggdmVydGljYWwgc3BhY2Ugd291bGQgYmUgd2FzdGVkIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbVxuICAgICAgLy8gbGVmdCBpbiB0aGUgcGFnZS4gVGhlIHByZXZpb3VzIGFjdGl2ZSByb3cgd2lsbCBiZWNvbWUgZml4ZWQgaW4gdGhlIHByb2Nlc3MgYXMgaXQgbm93IGhhcyBhXG4gICAgICAvLyBmaXhlZCBoZWlnaHRcbiAgICAgIGlmIChhY3RpdmVSb3cueSArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPj0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0IHx8IGFjdGl2ZVJvdy5oZWlnaHQgPiByYXN0ZXJpemVkR2x5cGguc2l6ZS55ICsgQ29uc3RhbnRzLlJPV19QSVhFTF9USFJFU0hPTEQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgZml4ZWQgaGVpZ2h0IHJvdywgY3JlYXRpbmcgYSBuZXcgcGFnZSBpZiB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBvbiB0aGVcbiAgICAgICAgLy8gY3VycmVudCBwYWdlXG4gICAgICAgIGxldCB3YXNQYWdlQW5kUm93Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFjdGl2ZVBhZ2UuY3VycmVudFJvdy55ICsgYWN0aXZlUGFnZS5jdXJyZW50Um93LmhlaWdodCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPj0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgcGFnZSB3aXRoIHJvb20gdG8gY3JlYXRlIHRoZSBuZXcgcm93IG9uXG4gICAgICAgICAgbGV0IGNhbmRpZGF0ZVBhZ2U6IEF0bGFzUGFnZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fYWN0aXZlUGFnZXMpIHtcbiAgICAgICAgICAgIGlmIChwLmN1cnJlbnRSb3cueSArIHAuY3VycmVudFJvdy5oZWlnaHQgKyByYXN0ZXJpemVkR2x5cGguc2l6ZS55IDwgcC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVBhZ2UgPSBwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZVBhZ2UpIHtcbiAgICAgICAgICAgIGFjdGl2ZVBhZ2UgPSBjYW5kaWRhdGVQYWdlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBCZWZvcmUgY3JlYXRpbmcgYSBuZXcgYXRsYXMgcGFnZSB0aGF0IHdvdWxkIHRyaWdnZXIgYSBwYWdlIG1lcmdlLCBjaGVjayBpZiB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJvdyBpcyBzdWZmaWNpZW50IHdoZW4gaWdub3JpbmcgdGhlIFJPV19QSVhFTF9USFJFU0hPTEQuIFRoaXMgd2lsbFxuICAgICAgICAgICAgLy8gaW1wcm92ZSB0ZXh0dXJlIHV0aWxpemF0aW9uIGJ5IHVzaW5nIHRoZSBhdmFpbGFibGUgc3BhY2UgYmVmb3JlIHRoZSBwYWdlIGlzIG1lcmdlZFxuICAgICAgICAgICAgLy8gYW5kIGJlY29tZXMgc3RhdGljLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyAmJlxuICAgICAgICAgICAgICB0aGlzLl9wYWdlcy5sZW5ndGggPj0gVGV4dHVyZUF0bGFzLm1heEF0bGFzUGFnZXMgJiZcbiAgICAgICAgICAgICAgYWN0aXZlUm93LnkgKyByYXN0ZXJpemVkR2x5cGguc2l6ZS55IDw9IGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodCAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID49IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgJiZcbiAgICAgICAgICAgICAgYWN0aXZlUm93LnggKyByYXN0ZXJpemVkR2x5cGguc2l6ZS54IDw9IGFjdGl2ZVBhZ2UuY2FudmFzLndpZHRoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gYWN0aXZlUGFnZSBhbmQgYWN0aXZlUm93IGlzIGFscmVhZHkgdmFsaWRcbiAgICAgICAgICAgICAgd2FzUGFnZUFuZFJvd0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGlmIHRoZXJlIGlzIG5vIHJvb21cbiAgICAgICAgICAgICAgY29uc3QgbmV3UGFnZSA9IHRoaXMuX2NyZWF0ZU5ld1BhZ2UoKTtcbiAgICAgICAgICAgICAgYWN0aXZlUGFnZSA9IG5ld1BhZ2U7XG4gICAgICAgICAgICAgIGFjdGl2ZVJvdyA9IG5ld1BhZ2UuY3VycmVudFJvdztcbiAgICAgICAgICAgICAgYWN0aXZlUm93LmhlaWdodCA9IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnk7XG4gICAgICAgICAgICAgIHdhc1BhZ2VBbmRSb3dGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghd2FzUGFnZUFuZFJvd0ZvdW5kKSB7XG4gICAgICAgICAgLy8gRml4IHRoZSBjdXJyZW50IHJvdyBhcyB0aGUgbmV3IHJvdyBpcyBiZWluZyBhZGRlZCBiZWxvd1xuICAgICAgICAgIGlmIChhY3RpdmVQYWdlLmN1cnJlbnRSb3cuaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgYWN0aXZlUGFnZS5maXhlZFJvd3MucHVzaChhY3RpdmVQYWdlLmN1cnJlbnRSb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVSb3cgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogYWN0aXZlUGFnZS5jdXJyZW50Um93LnkgKyBhY3RpdmVQYWdlLmN1cnJlbnRSb3cuaGVpZ2h0LFxuICAgICAgICAgICAgaGVpZ2h0OiByYXN0ZXJpemVkR2x5cGguc2l6ZS55XG4gICAgICAgICAgfTtcbiAgICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5wdXNoKGFjdGl2ZVJvdyk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBjdXJyZW50IHJvdyBiZWxvdyB0aGUgbmV3IGZpeGVkIGhlaWdodCByb3dcbiAgICAgICAgICBhY3RpdmVQYWdlLmN1cnJlbnRSb3cgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogYWN0aXZlUm93LnkgKyBhY3RpdmVSb3cuaGVpZ2h0LFxuICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgcGFnZXMgZnJvbSBfYWN0aXZlUGFnZXMgd2hlbiBhbGwgcm93cyBhcmUgZmlsbGVkXG4gICAgICB9XG5cbiAgICAgIC8vIEV4aXQgdGhlIGxvb3AgaWYgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIHJvd1xuICAgICAgaWYgKGFjdGl2ZVJvdy54ICsgcmFzdGVyaXplZEdseXBoLnNpemUueCA8PSBhY3RpdmVQYWdlLmNhbnZhcy53aWR0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGluIHRoZSBjdXJyZW50IHJvdywgZmluaXNoIGl0IGFuZCB0cnkgYWdhaW5cbiAgICAgIGlmIChhY3RpdmVSb3cgPT09IGFjdGl2ZVBhZ2UuY3VycmVudFJvdykge1xuICAgICAgICBhY3RpdmVSb3cueCA9IDA7XG4gICAgICAgIGFjdGl2ZVJvdy55ICs9IGFjdGl2ZVJvdy5oZWlnaHQ7XG4gICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlUGFnZS5maXhlZFJvd3Muc3BsaWNlKGFjdGl2ZVBhZ2UuZml4ZWRSb3dzLmluZGV4T2YoYWN0aXZlUm93KSwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRleHR1cmUgcG9zaXRpb25cbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBhZ2UgPSB0aGlzLl9wYWdlcy5pbmRleE9mKGFjdGl2ZVBhZ2UpO1xuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb24ueCA9IGFjdGl2ZVJvdy54O1xuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb24ueSA9IGFjdGl2ZVJvdy55O1xuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueCA9IGFjdGl2ZVJvdy54IC8gYWN0aXZlUGFnZS5jYW52YXMud2lkdGg7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS55ID0gYWN0aXZlUm93LnkgLyBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQ7XG5cbiAgICAvLyBGaXggdGhlIGNsaXBzcGFjZSBwb3NpdGlvbiBhcyBwYWdlcyBtYXkgYmUgb2YgZGlmZmVyaW5nIHNpemVcbiAgICByYXN0ZXJpemVkR2x5cGguc2l6ZUNsaXBTcGFjZS54IC89IGFjdGl2ZVBhZ2UuY2FudmFzLndpZHRoO1xuICAgIHJhc3Rlcml6ZWRHbHlwaC5zaXplQ2xpcFNwYWNlLnkgLz0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0O1xuXG4gICAgLy8gVXBkYXRlIGF0bGFzIGN1cnJlbnQgcm93LCBmb3IgZml4ZWQgcm93cyB0aGUgZ2x5cGggaGVpZ2h0IHdpbGwgbmV2ZXIgYmUgbGFyZ2VyIHRoYW4gdGhlIHJvd1xuICAgIC8vIGhlaWdodFxuICAgIGFjdGl2ZVJvdy5oZWlnaHQgPSBNYXRoLm1heChhY3RpdmVSb3cuaGVpZ2h0LCByYXN0ZXJpemVkR2x5cGguc2l6ZS55KTtcbiAgICBhY3RpdmVSb3cueCArPSByYXN0ZXJpemVkR2x5cGguc2l6ZS54O1xuXG4gICAgLy8gcHV0SW1hZ2VEYXRhIGRvZXNuJ3QgZG8gYW55IGJsZW5kaW5nLCBzbyBpdCB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgY2FjaGUgZW50cnkgZm9yIHVzXG4gICAgYWN0aXZlUGFnZS5jdHgucHV0SW1hZ2VEYXRhKFxuICAgICAgaW1hZ2VEYXRhLFxuICAgICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi54IC0gdGhpcy5fd29ya0JvdW5kaW5nQm94LmxlZnQsXG4gICAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uLnkgLSB0aGlzLl93b3JrQm91bmRpbmdCb3gudG9wLFxuICAgICAgdGhpcy5fd29ya0JvdW5kaW5nQm94LmxlZnQsXG4gICAgICB0aGlzLl93b3JrQm91bmRpbmdCb3gudG9wLFxuICAgICAgcmFzdGVyaXplZEdseXBoLnNpemUueCxcbiAgICAgIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnlcbiAgICApO1xuICAgIGFjdGl2ZVBhZ2UuYWRkR2x5cGgocmFzdGVyaXplZEdseXBoKTtcbiAgICBhY3RpdmVQYWdlLnZlcnNpb24rKztcblxuICAgIHJldHVybiByYXN0ZXJpemVkR2x5cGg7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gSW1hZ2VEYXRhIG9iamVjdCwgZmluZCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBub24tdHJhbnNwYXJlbnRcbiAgICogcG9ydGlvbiBvZiB0aGUgdGV4dHVyZSBhbmQgcmV0dXJuIGFuIElSYXN0ZXJpemVkR2x5cGggd2l0aCB0aGVzZVxuICAgKiBkaW1lbnNpb25zLlxuICAgKiBAcGFyYW0gaW1hZ2VEYXRhIFRoZSBpbWFnZSBkYXRhIHRvIHJlYWQuXG4gICAqIEBwYXJhbSBib3VuZGluZ0JveCBBbiBJQm91bmRpbmdCb3ggdG8gcHV0IHRoZSBjbGlwcGVkIGJvdW5kaW5nIGJveCB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIF9maW5kR2x5cGhCb3VuZGluZ0JveChpbWFnZURhdGE6IEltYWdlRGF0YSwgYm91bmRpbmdCb3g6IElCb3VuZGluZ0JveCwgYWxsb3dlZFdpZHRoOiBudW1iZXIsIHJlc3RyaWN0ZWRHbHlwaDogYm9vbGVhbiwgY3VzdG9tR2x5cGg6IGJvb2xlYW4sIHBhZGRpbmc6IG51bWJlcik6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgIGJvdW5kaW5nQm94LnRvcCA9IDA7XG4gICAgY29uc3QgaGVpZ2h0ID0gcmVzdHJpY3RlZEdseXBoID8gdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgOiB0aGlzLl90bXBDYW52YXMuaGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoID0gcmVzdHJpY3RlZEdseXBoID8gdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCA6IGFsbG93ZWRXaWR0aDtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgY29uc3QgYWxwaGFPZmZzZXQgPSB5ICogdGhpcy5fdG1wQ2FudmFzLndpZHRoICogNCArIHggKiA0ICsgMztcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FscGhhT2Zmc2V0XSAhPT0gMCkge1xuICAgICAgICAgIGJvdW5kaW5nQm94LnRvcCA9IHk7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGJvdW5kaW5nQm94LmxlZnQgPSAwO1xuICAgIGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBwYWRkaW5nICsgd2lkdGg7IHgrKykge1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gubGVmdCA9IHg7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGJvdW5kaW5nQm94LnJpZ2h0ID0gd2lkdGg7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB4ID0gcGFkZGluZyArIHdpZHRoIC0gMTsgeCA+PSBwYWRkaW5nOyB4LS0pIHtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgY29uc3QgYWxwaGFPZmZzZXQgPSB5ICogdGhpcy5fdG1wQ2FudmFzLndpZHRoICogNCArIHggKiA0ICsgMztcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FscGhhT2Zmc2V0XSAhPT0gMCkge1xuICAgICAgICAgIGJvdW5kaW5nQm94LnJpZ2h0ID0geDtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3guYm90dG9tID0gaGVpZ2h0O1xuICAgIGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChsZXQgeSA9IGhlaWdodCAtIDE7IHkgPj0gMDsgeS0tKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgY29uc3QgYWxwaGFPZmZzZXQgPSB5ICogdGhpcy5fdG1wQ2FudmFzLndpZHRoICogNCArIHggKiA0ICsgMztcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FscGhhT2Zmc2V0XSAhPT0gMCkge1xuICAgICAgICAgIGJvdW5kaW5nQm94LmJvdHRvbSA9IHk7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0dXJlUGFnZTogMCxcbiAgICAgIHRleHR1cmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICB0ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2U6IHsgeDogMCwgeTogMCB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICB4OiBib3VuZGluZ0JveC5yaWdodCAtIGJvdW5kaW5nQm94LmxlZnQgKyAxLFxuICAgICAgICB5OiBib3VuZGluZ0JveC5ib3R0b20gLSBib3VuZGluZ0JveC50b3AgKyAxXG4gICAgICB9LFxuICAgICAgc2l6ZUNsaXBTcGFjZToge1xuICAgICAgICB4OiAoYm91bmRpbmdCb3gucmlnaHQgLSBib3VuZGluZ0JveC5sZWZ0ICsgMSksXG4gICAgICAgIHk6IChib3VuZGluZ0JveC5ib3R0b20gLSBib3VuZGluZ0JveC50b3AgKyAxKVxuICAgICAgfSxcbiAgICAgIG9mZnNldDoge1xuICAgICAgICB4OiAtYm91bmRpbmdCb3gubGVmdCArIHBhZGRpbmcgKyAoKHJlc3RyaWN0ZWRHbHlwaCB8fCBjdXN0b21HbHlwaCkgPyBNYXRoLmZsb29yKCh0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC0gdGhpcy5fY29uZmlnLmRldmljZUNoYXJXaWR0aCkgLyAyKSA6IDApLFxuICAgICAgICB5OiAtYm91bmRpbmdCb3gudG9wICsgcGFkZGluZyArICgocmVzdHJpY3RlZEdseXBoIHx8IGN1c3RvbUdseXBoKSA/IHRoaXMuX2NvbmZpZy5saW5lSGVpZ2h0ID09PSAxID8gMCA6IE1hdGgucm91bmQoKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0IC0gdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpIC8gMikgOiAwKVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgQXRsYXNQYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICBwcml2YXRlIF91c2VkUGl4ZWxzOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZ2V0IHBlcmNlbnRhZ2VVc2VkKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl91c2VkUGl4ZWxzIC8gKHRoaXMuY2FudmFzLndpZHRoICogdGhpcy5jYW52YXMuaGVpZ2h0KTsgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dseXBoczogSVJhc3Rlcml6ZWRHbHlwaFtdID0gW107XG4gIHB1YmxpYyBnZXQgZ2x5cGhzKCk6IFJlYWRvbmx5QXJyYXk8SVJhc3Rlcml6ZWRHbHlwaD4geyByZXR1cm4gdGhpcy5fZ2x5cGhzOyB9XG4gIHB1YmxpYyBhZGRHbHlwaChnbHlwaDogSVJhc3Rlcml6ZWRHbHlwaCk6IHZvaWQge1xuICAgIHRoaXMuX2dseXBocy5wdXNoKGdseXBoKTtcbiAgICB0aGlzLl91c2VkUGl4ZWxzICs9IGdseXBoLnNpemUueCAqIGdseXBoLnNpemUueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNhbnZhcyBvZiB0aGUgYXRsYXMgcGFnZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyB2ZXJzaW9uID0gMDtcblxuICAvLyBUZXh0dXJlIGF0bGFzIGN1cnJlbnQgcG9zaXRpb25pbmcgZGF0YS4gVGhlIHRleHR1cmUgcGFja2luZyBzdHJhdGVneSB1c2VkIGlzIHRvIGZpbGwgZnJvbVxuICAvLyBsZWZ0LXRvLXJpZ2h0IGFuZCB0b3AtdG8tYm90dG9tLiBXaGVuIHRoZSBnbHlwaCBiZWluZyB3cml0dGVuIGlzIGxlc3MgdGhhbiBoYWxmIG9mIHRoZSBjdXJyZW50XG4gIC8vIHJvdydzIGhlaWdodCwgdGhlIGZvbGxvd2luZyBoYXBwZW5zOlxuICAvL1xuICAvLyAtIFRoZSBjdXJyZW50IHJvdyBiZWNvbWVzIHRoZSBmaXhlZCBoZWlnaHQgcm93IEFcbiAgLy8gLSBBIG5ldyBmaXhlZCBoZWlnaHQgcm93IEIgdGhlIGV4YWN0IHNpemUgb2YgdGhlIGdseXBoIGlzIGNyZWF0ZWQgYmVsb3cgdGhlIGN1cnJlbnQgcm93XG4gIC8vIC0gQSBuZXcgZHluYW1pYyBoZWlnaHQgY3VycmVudCByb3cgaXMgY3JlYXRlZCBiZWxvdyBCXG4gIC8vXG4gIC8vIFRoaXMgc3RyYXRlZ3kgZG9lcyBhIGdvb2Qgam9iIHByZXZlbnRpbmcgc3BhY2UgYmVpbmcgd2FzdGVkIGZvciB2ZXJ5IHNob3J0IGdseXBocyBzdWNoIGFzXG4gIC8vIHVuZGVyc2NvcmVzLCBoeXBoZW5zIGV0Yy4gb3IgdGhvc2Ugd2l0aCB1bmRlcmxpbmVzIHJlbmRlcmVkLlxuICBwdWJsaWMgY3VycmVudFJvdzogSUNoYXJBdGxhc0FjdGl2ZVJvdyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG4gIHB1YmxpYyByZWFkb25seSBmaXhlZFJvd3M6IElDaGFyQXRsYXNBY3RpdmVSb3dbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgc291cmNlUGFnZXM/OiBBdGxhc1BhZ2VbXVxuICApIHtcbiAgICBpZiAoc291cmNlUGFnZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBzb3VyY2VQYWdlcykge1xuICAgICAgICB0aGlzLl9nbHlwaHMucHVzaCguLi5wLmdseXBocyk7XG4gICAgICAgIHRoaXMuX3VzZWRQaXhlbHMgKz0gcC5fdXNlZFBpeGVscztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jYW52YXMgPSBjcmVhdGVDYW52YXMoZG9jdW1lbnQsIHNpemUsIHNpemUpO1xuICAgIC8vIFRoZSBjYW52YXMgbmVlZHMgYWxwaGEgYmVjYXVzZSB3ZSB1c2UgY2xlYXJDb2xvciB0byBjb252ZXJ0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGFscGhhLlxuICAgIC8vIEl0IG1pZ2h0IGFsc28gY29udGFpbiBzb21lIGNoYXJhY3RlcnMgd2l0aCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kcyBpZiBhbGxvd1RyYW5zcGFyZW5jeSBpc1xuICAgIC8vIHNldC5cbiAgICB0aGlzLmN0eCA9IHRocm93SWZGYWxzeSh0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgYWxwaGE6IHRydWUgfSkpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLmN1cnJlbnRSb3cueCA9IDA7XG4gICAgdGhpcy5jdXJyZW50Um93LnkgPSAwO1xuICAgIHRoaXMuY3VycmVudFJvdy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuZml4ZWRSb3dzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy52ZXJzaW9uKys7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlcyBhIHBhcnRpY3VsYXIgcmdiIGNvbG9yIGFuZCBjb2xvcnMgdGhhdCBhcmUgbmVhcmx5IHRoZSBzYW1lIGluIGFuIEltYWdlRGF0YSBjb21wbGV0ZWx5XG4gKiB0cmFuc3BhcmVudC5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHJlc3VsdCBpcyBcImVtcHR5XCIsIG1lYW5pbmcgYWxsIHBpeGVscyBhcmUgZnVsbHkgdHJhbnNwYXJlbnQuXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQ29sb3IoaW1hZ2VEYXRhOiBJbWFnZURhdGEsIGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IsIGVuYWJsZVRocmVzaG9sZENoZWNrOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIC8vIEdldCBjb2xvciBjaGFubmVsc1xuICBjb25zdCByID0gYmcucmdiYSA+Pj4gMjQ7XG4gIGNvbnN0IGcgPSBiZy5yZ2JhID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGIgPSBiZy5yZ2JhID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgZmdSID0gZmcucmdiYSA+Pj4gMjQ7XG4gIGNvbnN0IGZnRyA9IGZnLnJnYmEgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZmdCID0gZmcucmdiYSA+Pj4gOCAmIDB4RkY7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgdGhyZXNob2xkIHRoYXQgd2hlbiBiZWxvdyBhIGNvbG9yIHdpbGwgYmUgdHJlYXRlZCBhcyB0cmFuc3BhcnQgd2hlbiB0aGUgc3VtIG9mXG4gIC8vIGNoYW5uZWwgdmFsdWUgZGlmZmVycy4gVGhpcyBoZWxwcyBpbXByb3ZlIHJlbmRlcmluZyB3aGVuIGdseXBocyBvdmVybGFwIHdpdGggb3RoZXJzLiBUaGlzXG4gIC8vIHRocmVzaG9sZCBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQgdG9cbiAgLy8gZW5zdXJlIGltcG9ydGFudCBkZXRhaWxzIG9mIHRoZSBnbHlwaCBhcmUgYWx3YXlzIHNob3duLCBldmVuIHdoZW4gdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGxvdy5cbiAgLy8gVGhlIG51bWJlciAxMiBpcyBsYXJnZWx5IGFyYml0cmFyeSB0byBlbnN1cmUgdGhlIHBpeGVscyB0aGF0IGVzY2FwZSB0aGUgY2VsbCBpbiB0aGUgdGVzdCBjYXNlXG4gIC8vIHdlcmUgY292ZXJlZCAoZmc9IzhhZTIzNCwgYmc9I2M0YTAwMCkuXG4gIGNvbnN0IHRocmVzaG9sZCA9IE1hdGguZmxvb3IoKE1hdGguYWJzKHIgLSBmZ1IpICsgTWF0aC5hYnMoZyAtIGZnRykgKyBNYXRoLmFicyhiIC0gZmdCKSkgLyAxMik7XG5cbiAgLy8gU2V0IGFscGhhIGNoYW5uZWwgb2YgcmVsZXZlbnQgcGl4ZWxzIHRvIDBcbiAgbGV0IGlzRW1wdHkgPSB0cnVlO1xuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IG9mZnNldCArPSA0KSB7XG4gICAgLy8gQ2hlY2sgZXhhY3QgbWF0Y2hcbiAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0XSA9PT0gciAmJlxuICAgICAgICBpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAxXSA9PT0gZyAmJlxuICAgICAgICBpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAyXSA9PT0gYikge1xuICAgICAgaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgM10gPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayB0aGUgdGhyZXNob2xkIGJhc2VkIGRpZmZlcmVuY2VcbiAgICAgIGlmIChlbmFibGVUaHJlc2hvbGRDaGVjayAmJlxuICAgICAgICAgIChNYXRoLmFicyhpbWFnZURhdGEuZGF0YVtvZmZzZXRdIC0gcikgK1xuICAgICAgICAgIE1hdGguYWJzKGltYWdlRGF0YS5kYXRhW29mZnNldCArIDFdIC0gZykgK1xuICAgICAgICAgIE1hdGguYWJzKGltYWdlRGF0YS5kYXRhW29mZnNldCArIDJdIC0gYikpIDwgdGhyZXNob2xkKSB7XG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDNdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNFbXB0eTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDb21wbGV0ZWx5VHJhbnNwYXJlbnQoaW1hZ2VEYXRhOiBJbWFnZURhdGEpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgaW1hZ2VEYXRhLmRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gNCkge1xuICAgIGlmIChpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAzXSA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyhkb2N1bWVudDogRG9jdW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIHJldHVybiBjYW52YXM7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvciwgSUNvbG9yUkdCIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxubGV0ICRyID0gMDtcbmxldCAkZyA9IDA7XG5sZXQgJGIgPSAwO1xubGV0ICRhID0gMDtcblxuZXhwb3J0IGNvbnN0IE5VTExfQ09MT1I6IElDb2xvciA9IHtcbiAgY3NzOiAnIzAwMDAwMDAwJyxcbiAgcmdiYTogMFxufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNoYW5uZWxzXCIgKGluZGl2aWR1YWwgY29sb3IgY2hhbm5lbHMgYXMgbnVtYmVycykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY2hhbm5lbHMge1xuICBleHBvcnQgZnVuY3Rpb24gdG9Dc3MocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9JHt0b1BhZGRlZEhleChhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvUmdiYShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAweEZGKTogbnVtYmVyIHtcbiAgICAvLyBOb3RlOiBUaGUgYWdncmVnYXRlZCBudW1iZXIgaXMgUkdCQTMyIChCRSksIHRodXMgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIEFCR1IzMlxuICAgIC8vIG9uIExFIHN5c3RlbXMsIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0IDMyLWJpdCBidWZmZXIgd3JpdGVzLlxuICAgIC8vID4+PiAwIGZvcmNlcyBhbiB1bnNpZ25lZCBpbnRcbiAgICByZXR1cm4gKHIgPDwgMjQgfCBnIDw8IDE2IHwgYiA8PCA4IHwgYSkgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogSUNvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiLCBhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiLCBhKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBgSUNvbG9yYC5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjb2xvciB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogSUNvbG9yLCBmZzogSUNvbG9yKTogSUNvbG9yIHtcbiAgICAkYSA9IChmZy5yZ2JhICYgMHhGRikgLyAyNTU7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjc3M6IGZnLmNzcyxcbiAgICAgICAgcmdiYTogZmcucmdiYVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIGNvbnN0IGNzcyA9IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpO1xuICAgIGNvbnN0IHJnYmEgPSBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gICAgcmV0dXJuIHsgY3NzLCByZ2JhIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNPcGFxdWUoY29sb3I6IElDb2xvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY29sb3IucmdiYSAmIDB4RkYpID09PSAweEZGO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmc6IElDb2xvciwgZmc6IElDb2xvciwgcmF0aW86IG51bWJlcik6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYS5lbnN1cmVDb250cmFzdFJhdGlvKGJnLnJnYmEsIGZnLnJnYmEsIHJhdGlvKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAocmVzdWx0ID4+IDI0ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDE2ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDggICYgMHhGRilcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZShjb2xvcjogSUNvbG9yKTogSUNvbG9yIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSAoY29sb3IucmdiYSB8IDB4RkYpID4+PiAwO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhyZ2JhQ29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpLFxuICAgICAgcmdiYTogcmdiYUNvbG9yXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFjaXR5KGNvbG9yOiBJQ29sb3IsIG9wYWNpdHk6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAweEZGKTtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMoY29sb3IucmdiYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKVxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlPcGFjaXR5KGNvbG9yOiBJQ29sb3IsIGZhY3RvcjogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IGNvbG9yLnJnYmEgJiAweEZGO1xuICAgIHJldHVybiBvcGFjaXR5KGNvbG9yLCAoJGEgKiBmYWN0b3IpIC8gMHhGRik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvclJHQihjb2xvcjogSUNvbG9yKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gWyhjb2xvci5yZ2JhID4+IDI0KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDE2KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDgpICYgMHhGRl07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNzc1wiIChzdHJpbmc6ICcjcmdiJywgJyNyZ2JhJywgJyNycmdnYmInLFxuICogJyNycmdnYmJhYScpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNzcyB7XG4gIC8vIEF0dGVtcHQgdG8gc2V0IGdldCB0aGUgc2hhcmVkIGNhbnZhcyBjb250ZXh0XG4gIGxldCAkY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCB1bmRlZmluZWQ7XG4gIGxldCAkbGl0bXVzQ29sb3I6IENhbnZhc0dyYWRpZW50IHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gdGhlIGZpcnN0IHdpbmRvdywgc28gZG9jdW1lbnQgc2hvdWxkIGJlIGNvcnJlY3RcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjdHgpIHtcbiAgICAgICRjdHggPSBjdHg7XG4gICAgICAkY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICAgICRsaXRtdXNDb2xvciA9ICRjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMSwgMSk7XG4gICAgfVxuICB9XG4gIGNhdGNoIHtcbiAgICAvLyBub29wXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjc3Mgc3RyaW5nIHRvIGFuIElDb2xvciwgdGhpcyBzaG91bGQgaGFuZGxlIGFsbCB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgd2lsbFxuICAgKiB0aHJvdyBpZiBpdCdzIGludmFsaWQuIFRoZSBpZGVhbCBmb3JtYXQgdG8gdXNlIGlzIGAjcnJnZ2JiW2FhXWAgYXMgaXQncyB0aGUgZmFzdGVzdCB0byBwYXJzZS5cbiAgICpcbiAgICogT25seSBgI3JnYlthXWAsIGAjcnJnZ2JiW2FhXWAsIGByZ2IoKWAgYW5kIGByZ2JhKClgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCB3aGVuIHJ1biBpbiBhIE5vZGVcbiAgICogZW52aXJvbm1lbnQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihjc3M6IHN0cmluZyk6IElDb2xvciB7XG4gICAgLy8gRm9ybWF0czogI3JnYlthXSBhbmQgI3JyZ2diYlthYV1cbiAgICBpZiAoY3NzLm1hdGNoKC8jW1xcZGEtZl17Myw4fS9pKSkge1xuICAgICAgc3dpdGNoIChjc3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgNDogeyAvLyAjcmdiXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7IC8vICNyZ2JhXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGEgPSBwYXJzZUludChjc3Muc2xpY2UoNCwgNSkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzogLy8gI3JyZ2diYlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiAocGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPDwgOCB8IDB4RkYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSA5OiAvLyAjcnJnZ2JiYWFcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogcGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdHM6IHJnYigpIG9yIHJnYmEoKVxuICAgIGNvbnN0IHJnYmFNYXRjaCA9IGNzcy5tYXRjaCgvcmdiYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKigsXFxzKigwfDF8XFxkP1xcLihcXGQrKSlcXHMqKT9cXCkvKTtcbiAgICBpZiAocmdiYU1hdGNoKSB7XG4gICAgICAkciA9IHBhcnNlSW50KHJnYmFNYXRjaFsxXSk7XG4gICAgICAkZyA9IHBhcnNlSW50KHJnYmFNYXRjaFsyXSk7XG4gICAgICAkYiA9IHBhcnNlSW50KHJnYmFNYXRjaFszXSk7XG4gICAgICAkYSA9IE1hdGgucm91bmQoKHJnYmFNYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzVdKSkgKiAweEZGKTtcbiAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGV4dCBpcyBhdmFpbGFibGUgZm9yIGNhbnZhcy1iYXNlZCBjb2xvciBwYXJzaW5nXG4gICAgaWYgKCEkY3R4IHx8ICEkbGl0bXVzQ29sb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgdXNpbmcgY2FudmFzIGZpbGxTdHlsZVxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNmaWxsLWFuZC1zdHJva2Utc3R5bGVzXG4gICAgJGN0eC5maWxsU3R5bGUgPSAkbGl0bXVzQ29sb3I7XG4gICAgJGN0eC5maWxsU3R5bGUgPSBjc3M7XG4gICAgaWYgKHR5cGVvZiAkY3R4LmZpbGxTdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAkY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIFskciwgJGcsICRiLCAkYV0gPSAkY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIGlzIG5vbi10cmFuc3BhcmVudCBhcyBjb2xvciBodWUgZ2V0cyBsb3N0IHdoZW4gZHJhd24gdG8gdGhlIGNhbnZhc1xuICAgIGlmICgkYSAhPT0gMHhGRikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhlIGNvbG9yIGZyb20gdGhlIGNhbnZhcycgZmlsbFN0eWxlIHByb3BlcnR5IHdoaWNoIGV4cG9zZXMgdGhlIGNvbG9yIHZhbHVlIGluIHJnYmEoKVxuICAgIC8vIGZvcm1hdFxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNzZXJpYWxpc2F0aW9uLW9mLWEtY29sb3JcbiAgICByZXR1cm4ge1xuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIGNzc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYlwiIChudW1iZXI6IDB4cnJnZ2JiKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2Ige1xuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHJnYiBUaGUgY29sb3IgdG8gdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UocmdiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZWxhdGl2ZUx1bWluYW5jZTIoXG4gICAgICAocmdiID4+IDE2KSAmIDB4RkYsXG4gICAgICAocmdiID4+IDggKSAmIDB4RkYsXG4gICAgICAocmdiICAgICAgKSAmIDB4RkYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByIFRoZSByZWQgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBiIFRoZSBibHVlIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZTIocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcnMgPSByIC8gMjU1O1xuICAgIGNvbnN0IGdzID0gZyAvIDI1NTtcbiAgICBjb25zdCBicyA9IGIgLyAyNTU7XG4gICAgY29uc3QgcnIgPSBycyA8PSAwLjAzOTI4ID8gcnMgLyAxMi45MiA6IE1hdGgucG93KChycyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJnID0gZ3MgPD0gMC4wMzkyOCA/IGdzIC8gMTIuOTIgOiBNYXRoLnBvdygoZ3MgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByYiA9IGJzIDw9IDAuMDM5MjggPyBicyAvIDEyLjkyIDogTWF0aC5wb3coKGJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgcmV0dXJuIHJyICogMC4yMTI2ICsgcmcgKiAwLjcxNTIgKyByYiAqIDAuMDcyMjtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiYVwiIChudW1iZXI6IDB4cnJnZ2JiYWEpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYmEge1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IG51bWJlciB7XG4gICAgJGEgPSAoZmcgJiAweEZGKSAvIDB4RkY7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4gZmc7XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZyA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICByZXR1cm4gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZm9yZWdyb3VuZCBjb2xvciBhbmQgYSBiYWNrZ3JvdW5kIGNvbG9yLCBlaXRoZXIgaW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgdW50aWwgdGhlIHNwZWNpZmllZCBjb250cmFzdCByYXRpbyBpcyBtZXQuIElmIHB1cmUgd2hpdGUgb3IgYmxhY2sgaXMgaGl0XG4gICAqIHdpdGhvdXQgdGhlIGNvbnRyYXN0IHJhdGlvIGJlaW5nIG1ldCwgZ28gdGhlIG90aGVyIGRpcmVjdGlvbiB1c2luZyB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciBhbmQgdGFrZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCByZXN1bHQgZGVwZW5kaW5nIG9uIHdoaWNoIGhhcyB0aGUgaGlnaGVyXG4gICAqIGNvbnRyYXN0IHJhdGlvLlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBhbHJlYWR5IG1ldC5cbiAgICpcbiAgICogQHBhcmFtIGJnUmdiYSBUaGUgYmFja2dyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIGZnUmdiYSBUaGUgZm9yZWdyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIHJhdGlvIFRoZSBjb250cmFzdCByYXRpbyB0byBhY2hpZXZlLlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoYmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGZnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShmZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgY3IgPSBjb250cmFzdFJhdGlvKGJnTCwgZmdMKTtcbiAgICBpZiAoY3IgPCByYXRpbykge1xuICAgICAgaWYgKGZnTCA8IGJnTCkge1xuICAgICAgICBjb25zdCByZXN1bHRBID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEIgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRBO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0QSA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEIgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIHJlZHVjaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA+IDAgfHwgZmdHID4gMCB8fCBmZ0IgPiAwKSkge1xuICAgICAgLy8gUmVkdWNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnUiAqIDAuMSkpO1xuICAgICAgZmdHIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0cgKiAwLjEpKTtcbiAgICAgIGZnQiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdCICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byBpbmNyZWFzaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA8IDB4RkYgfHwgZmdHIDwgMHhGRiB8fCBmZ0IgPCAweEZGKSkge1xuICAgICAgLy8gSW5jcmVhc2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiA9IE1hdGgubWluKDB4RkYsIGZnUiArIE1hdGguY2VpbCgoMjU1IC0gZmdSKSAqIDAuMSkpO1xuICAgICAgZmdHID0gTWF0aC5taW4oMHhGRiwgZmdHICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0cpICogMC4xKSk7XG4gICAgICBmZ0IgPSBNYXRoLm1pbigweEZGLCBmZ0IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnQikgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ2hhbm5lbHModmFsdWU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gWyh2YWx1ZSA+PiAyNCkgJiAweEZGLCAodmFsdWUgPj4gMTYpICYgMHhGRiwgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYWRkZWRIZXgoYzogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGMudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gcy5sZW5ndGggPCAyID8gJzAnICsgcyA6IHM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udHJhc3QgcmF0aW8gYmV0d2VlbiB0d28gcmVsYXRpdmUgbHVtaW5hbmNlIHZhbHVlcy5cbiAqIEBwYXJhbSBsMSBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHBhcmFtIGwyIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFJhdGlvKGwxOiBudW1iZXIsIGwyOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobDEgPCBsMikge1xuICAgIHJldHVybiAobDIgKyAwLjA1KSAvIChsMSArIDAuMDUpO1xuICB9XG4gIHJldHVybiAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJTGlzdGVuZXI8VCwgVSA9IHZvaWQ+IHtcbiAgKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudDxULCBVID0gdm9pZD4ge1xuICAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiB7XG4gIGV2ZW50OiBJRXZlbnQ8VCwgVT47XG4gIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4gaW1wbGVtZW50cyBJRXZlbnRFbWl0dGVyPFQsIFU+IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICBwcml2YXRlIF9ldmVudD86IElFdmVudDxULCBVPjtcbiAgcHJpdmF0ZSBfZGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IGV2ZW50KCk6IElFdmVudDxULCBVPiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudCkge1xuICAgICAgdGhpcy5fZXZlbnQgPSAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0ge1xuICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50O1xuICB9XG5cbiAgcHVibGljIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldLmNhbGwodW5kZWZpbmVkLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZEV2ZW50PFQ+KGZyb206IElFdmVudDxUPiwgdG86IElFdmVudEVtaXR0ZXI8VD4pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmU8VD4oZXZlbnQ6IElFdmVudDxUPiwgaGFuZGxlcjogKGU6IFQgfCB1bmRlZmluZWQpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgaGFuZGxlcih1bmRlZmluZWQpO1xuICByZXR1cm4gZXZlbnQoZSA9PiBoYW5kbGVyKGUpKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZCB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIG1hbmFnaW5nIHRoZSBsaWZlY3ljbGUgb2YgYW5cbiAqIG9iamVjdCBhbmQgaXRzIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgX2Rpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG4gIHByb3RlY3RlZCBfaXNEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LCB0cmlnZ2VyaW5nIHRoZSBgZGlzcG9zZWAgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElEaXNwb3NhYmxlcy5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZCBvZiB0aGlzLl9kaXNwb3NhYmxlcykge1xuICAgICAgZC5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZGlzcG9zYWJsZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkIFRoZSBkaXNwb3NhYmxlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzcG9zYWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcjxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGQ6IFQpOiBUIHtcbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKGQpO1xuICAgIHJldHVybiBkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgZGlzcG9zYWJsZSBvYmplY3QgaWYgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgaWYgbm90IGRvXG4gICAqIG5vdGhpbmcuXG4gICAqIEBwYXJhbSBkIFRoZSBkaXNwb3NhYmxlIHRvIHVucmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlcjxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGQ6IFQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2Rpc3Bvc2FibGVzLmluZGV4T2YoZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11dGFibGVEaXNwb3NhYmxlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4gaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgX3ZhbHVlPzogVDtcbiAgcHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUsIGRpc3Bvc2luZyBvZiB0aGUgb2xkIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5faXNEaXNwb3NlZCB8fCB2YWx1ZSA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc3RvcmVkIHZhbHVlIGFuZCBkaXNwb3NlcyBvZiB0aGUgcHJldmlvdXNseSBzdG9yZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gaW4gYSBkaXNwb3NhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EaXNwb3NhYmxlKGY6ICgpID0+IHZvaWQpOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6IGYgfTtcbn1cblxuLyoqXG4gKiBEaXNwb3NlIG9mIGFsbCBkaXNwb3NhYmxlcyBpbiBhbiBhcnJheSBhbmQgc2V0IGl0cyBsZW5ndGggdG8gMC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VBcnJheShkaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGQgb2YgZGlzcG9zYWJsZXMpIHtcbiAgICBkLmRpc3Bvc2UoKTtcbiAgfVxuICBkaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXNwb3NhYmxlIHRoYXQgd2lsbCBkaXNwb3NlIG9mIGFuIGFycmF5IG9mIGRpc3Bvc2FibGVzIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlKGFycmF5OiBJRGlzcG9zYWJsZVtdKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBkaXNwb3NlQXJyYXkoYXJyYXkpIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBjbGFzcyBUd29LZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogeyBbYmc6IHN0cmluZyB8IG51bWJlcl06IHsgW2ZnOiBzdHJpbmcgfCBudW1iZXJdOiBUVmFsdWUgfCB1bmRlZmluZWQgfSB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFbZmlyc3RdKSB7XG4gICAgICB0aGlzLl9kYXRhW2ZpcnN0XSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdID8gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRm91cktleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRUaGlyZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVEZvdXJ0aCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IFR3b0tleU1hcDxURmlyc3QsIFRTZWNvbmQsIFR3b0tleU1hcDxUVGhpcmQsIFRGb3VydGgsIFRWYWx1ZT4+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpKSB7XG4gICAgICB0aGlzLl9kYXRhLnNldChmaXJzdCwgc2Vjb25kLCBuZXcgVHdvS2V5TWFwKCkpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSEuc2V0KHRoaXJkLCBmb3VydGgsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKT8uZ2V0KHRoaXJkLCBmb3VydGgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbnRlcmZhY2UgSU5hdmlnYXRvciB7XG4gIHVzZXJBZ2VudDogc3RyaW5nO1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xufVxuXG4vLyBXZSdyZSBkZWNsYXJpbmcgYSBuYXZpZ2F0b3IgZ2xvYmFsIGhlcmUgYXMgd2UgZXhwZWN0IGl0IGluIGFsbCBydW50aW1lcyAobm9kZSBhbmQgYnJvd3NlciksIGJ1dFxuLy8gd2Ugd2FudCB0aGlzIG1vZHVsZSB0byBsaXZlIGluIGNvbW1vbi5cbmRlY2xhcmUgY29uc3QgbmF2aWdhdG9yOiBJTmF2aWdhdG9yO1xuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiB1bmtub3duO1xuXG5leHBvcnQgY29uc3QgaXNOb2RlID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAndGl0bGUnIGluIChwcm9jZXNzIGFzIGFueSkpID8gdHJ1ZSA6IGZhbHNlO1xuY29uc3QgdXNlckFnZW50ID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IudXNlckFnZW50O1xuY29uc3QgcGxhdGZvcm0gPSAoaXNOb2RlKSA/ICdub2RlJyA6IG5hdmlnYXRvci5wbGF0Zm9ybTtcblxuZXhwb3J0IGNvbnN0IGlzRmlyZWZveCA9IHVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveCcpO1xuZXhwb3J0IGNvbnN0IGlzTGVnYWN5RWRnZSA9IHVzZXJBZ2VudC5pbmNsdWRlcygnRWRnZScpO1xuZXhwb3J0IGNvbnN0IGlzU2FmYXJpID0gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdCh1c2VyQWdlbnQpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNhZmFyaVZlcnNpb24oKTogbnVtYmVyIHtcbiAgaWYgKCFpc1NhZmFyaSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblxcLyhcXGQrKS8pO1xuICBpZiAobWFqb3JWZXJzaW9uID09PSBudWxsIHx8IG1ham9yVmVyc2lvbi5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSW50KG1ham9yVmVyc2lvblsxXSk7XG59XG5cbi8vIEZpbmQgdGhlIHVzZXJzIHBsYXRmb3JtLiBXZSB1c2UgdGhpcyB0byBpbnRlcnByZXQgdGhlIG1ldGEga2V5XG4vLyBhbmQgSVNPIHRoaXJkIGxldmVsIHNoaWZ0cy5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE5ODc3OTI0LzU3NzU5OFxuZXhwb3J0IGNvbnN0IGlzTWFjID0gWydNYWNpbnRvc2gnLCAnTWFjSW50ZWwnLCAnTWFjUFBDJywgJ01hYzY4SyddLmluY2x1ZGVzKHBsYXRmb3JtKTtcbmV4cG9ydCBjb25zdCBpc0lwYWQgPSBwbGF0Zm9ybSA9PT0gJ2lQYWQnO1xuZXhwb3J0IGNvbnN0IGlzSXBob25lID0gcGxhdGZvcm0gPT09ICdpUGhvbmUnO1xuZXhwb3J0IGNvbnN0IGlzV2luZG93cyA9IFsnV2luZG93cycsICdXaW4xNicsICdXaW4zMicsICdXaW5DRSddLmluY2x1ZGVzKHBsYXRmb3JtKTtcbmV4cG9ydCBjb25zdCBpc0xpbnV4ID0gcGxhdGZvcm0uaW5kZXhPZignTGludXgnKSA+PSAwO1xuLy8gTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyB0cnVlLCBpc0xpbnV4IHdpbGwgYWxzbyBiZSB0cnVlLlxuZXhwb3J0IGNvbnN0IGlzQ2hyb21lT1MgPSAvXFxiQ3JPU1xcYi8udGVzdCh1c2VyQWdlbnQpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuXG5pbnRlcmZhY2UgSVRhc2tRdWV1ZSB7XG4gIC8qKlxuICAgKiBBZGRzIGEgdGFzayB0byB0aGUgcXVldWUgd2hpY2ggd2lsbCBydW4gaW4gYSBmdXR1cmUgaWRsZSBjYWxsYmFjay5cbiAgICogVG8gYXZvaWQgcGVyY2VpdmFibGUgc3RhbGxzIG9uIHRoZSBtYWludGhyZWFkLCB0YXNrcyB3aXRoIGhlYXZ5IHdvcmtsb2FkXG4gICAqIHNob3VsZCBzcGxpdCB0aGVpciB3b3JrIGludG8gc21hbGxlciBwaWVjZXMgYW5kIHJldHVybiBgdHJ1ZWAgdG8gZ2V0XG4gICAqIGNhbGxlZCBhZ2FpbiB1bnRpbCB0aGUgd29yayBpcyBkb25lIChvbiBmYWxzeSByZXR1cm4gdmFsdWUpLlxuICAgKi9cbiAgZW5xdWV1ZSh0YXNrOiAoKSA9PiBib29sZWFuIHwgdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhlIHF1ZXVlLCBydW5uaW5nIGFsbCByZW1haW5pbmcgdGFza3Mgc3luY2hyb25vdXNseS5cbiAgICovXG4gIGZsdXNoKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbnkgcmVtYWluaW5nIHRhc2tzIGZyb20gdGhlIHF1ZXVlLCB0aGVzZSB3aWxsIG5vdCBiZSBydW4uXG4gICAqL1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVRhc2tEZWFkbGluZSB7XG4gIHRpbWVSZW1haW5pbmcoKTogbnVtYmVyO1xufVxudHlwZSBDYWxsYmFja1dpdGhEZWFkbGluZSA9IChkZWFkbGluZTogSVRhc2tEZWFkbGluZSkgPT4gdm9pZDtcblxuYWJzdHJhY3QgY2xhc3MgVGFza1F1ZXVlIGltcGxlbWVudHMgSVRhc2tRdWV1ZSB7XG4gIHByaXZhdGUgX3Rhc2tzOiAoKCkgPT4gYm9vbGVhbiB8IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBfaWRsZUNhbGxiYWNrPzogbnVtYmVyO1xuICBwcml2YXRlIF9pID0gMDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogQ2FsbGJhY2tXaXRoRGVhZGxpbmUpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZDtcblxuICBwdWJsaWMgZW5xdWV1ZSh0YXNrOiAoKSA9PiBib29sZWFuIHwgdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3Rhc2tzLnB1c2godGFzayk7XG4gICAgdGhpcy5fc3RhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5faSA8IHRoaXMuX3Rhc2tzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLl90YXNrc1t0aGlzLl9pXSgpKSB7XG4gICAgICAgIHRoaXMuX2krKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pZGxlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2NhbmNlbENhbGxiYWNrKHRoaXMuX2lkbGVDYWxsYmFjayk7XG4gICAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuX2kgPSAwO1xuICAgIHRoaXMuX3Rhc2tzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9zdGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lkbGVDYWxsYmFjaykge1xuICAgICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdGhpcy5fcmVxdWVzdENhbGxiYWNrKHRoaXMuX3Byb2Nlc3MuYmluZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2VzcyhkZWFkbGluZTogSVRhc2tEZWFkbGluZSk6IHZvaWQge1xuICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICBsZXQgdGFza0R1cmF0aW9uID0gMDtcbiAgICBsZXQgbG9uZ2VzdFRhc2sgPSAwO1xuICAgIGxldCBsYXN0RGVhZGxpbmVSZW1haW5pbmcgPSBkZWFkbGluZS50aW1lUmVtYWluaW5nKCk7XG4gICAgbGV0IGRlYWRsaW5lUmVtYWluaW5nID0gMDtcbiAgICB3aGlsZSAodGhpcy5faSA8IHRoaXMuX3Rhc2tzLmxlbmd0aCkge1xuICAgICAgdGFza0R1cmF0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICghdGhpcy5fdGFza3NbdGhpcy5faV0oKSkge1xuICAgICAgICB0aGlzLl9pKys7XG4gICAgICB9XG4gICAgICAvLyBvdGhlciB0aGFuIHBlcmZvcm1hbmNlLm5vdywgRGF0ZS5ub3cgbWlnaHQgbm90IGJlIHN0YWJsZSAoY2hhbmdlcyBvbiB3YWxsIGNsb2NrIGNoYW5nZXMpLFxuICAgICAgLy8gdGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhcyBhIGNsb2NrIGNoYW5nZSBkdXJpbmcgYSBzaG9ydCBydW5uaW5nIHRhc2sgaXMgdmVyeSB1bmxpa2VseVxuICAgICAgLy8gaW4gY2FzZSBpdCBzdGlsbCBoYXBwZW5lZCBhbmQgbGVhZHMgdG8gbmVnYXRpdmUgZHVyYXRpb24sIHNpbXBseSBhc3N1bWUgMSBtc2VjXG4gICAgICB0YXNrRHVyYXRpb24gPSBNYXRoLm1heCgxLCBEYXRlLm5vdygpIC0gdGFza0R1cmF0aW9uKTtcbiAgICAgIGxvbmdlc3RUYXNrID0gTWF0aC5tYXgodGFza0R1cmF0aW9uLCBsb25nZXN0VGFzayk7XG4gICAgICAvLyBHdWVzcyB0aGUgZm9sbG93aW5nIHRhc2sgd2lsbCB0YWtlIGEgc2ltaWxhciB0aW1lIHRvIHRoZSBsb25nZXN0IHRhc2sgaW4gdGhpcyBiYXRjaCwgYWxsb3dcbiAgICAgIC8vIGFkZGl0aW9uYWwgcm9vbSB0byB0cnkgYXZvaWQgZXhjZWVkaW5nIHRoZSBkZWFkbGluZVxuICAgICAgZGVhZGxpbmVSZW1haW5pbmcgPSBkZWFkbGluZS50aW1lUmVtYWluaW5nKCk7XG4gICAgICBpZiAobG9uZ2VzdFRhc2sgKiAxLjUgPiBkZWFkbGluZVJlbWFpbmluZykge1xuICAgICAgICAvLyBXYXJuIHdoZW4gdGhlIHRpbWUgZXhjZWVkaW5nIHRoZSBkZWFkbGluZSBpcyBvdmVyIDIwbXMsIGlmIHRoaXMgaGFwcGVucyBpbiBwcmFjdGljZSB0aGVcbiAgICAgICAgLy8gdGFzayBzaG91bGQgYmUgc3BsaXQgaW50byBzdWItdGFza3MgdG8gZW5zdXJlIHRoZSBVSSByZW1haW5zIHJlc3BvbnNpdmUuXG4gICAgICAgIGlmIChsYXN0RGVhZGxpbmVSZW1haW5pbmcgLSB0YXNrRHVyYXRpb24gPCAtMjApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYHRhc2sgcXVldWUgZXhjZWVkZWQgYWxsb3R0ZWQgZGVhZGxpbmUgYnkgJHtNYXRoLmFicyhNYXRoLnJvdW5kKGxhc3REZWFkbGluZVJlbWFpbmluZyAtIHRhc2tEdXJhdGlvbikpfW1zYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFzdERlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmVSZW1haW5pbmc7XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcXVldWUgb2YgdGhhdCBydW5zIHRhc2tzIG92ZXIgc2V2ZXJhbCB0YXNrcyB2aWEgc2V0VGltZW91dCwgdHJ5aW5nIHRvIG1haW50YWluIGFib3ZlIDYwIGZyYW1lc1xuICogcGVyIHNlY29uZC4gVGhlIHRhc2tzIHdpbGwgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnF1ZXVlZCwgYnV0IHRoZXkgd2lsbCBydW4gc29tZSB0aW1lIGxhdGVyLFxuICogYW5kIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGV5J3JlIG5vbi11cmdlbnQgYW5kIHdpbGwgbm90IGludHJvZHVjZSByYWNlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmlvcml0eVRhc2tRdWV1ZSBleHRlbmRzIFRhc2tRdWV1ZSB7XG4gIHByb3RlY3RlZCBfcmVxdWVzdENhbGxiYWNrKGNhbGxiYWNrOiBDYWxsYmFja1dpdGhEZWFkbGluZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2sodGhpcy5fY3JlYXRlRGVhZGxpbmUoMTYpKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURlYWRsaW5lKGR1cmF0aW9uOiBudW1iZXIpOiBJVGFza0RlYWRsaW5lIHtcbiAgICBjb25zdCBlbmQgPSBEYXRlLm5vdygpICsgZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVSZW1haW5pbmc6ICgpID0+IE1hdGgubWF4KDAsIGVuZCAtIERhdGUubm93KCkpXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBJZGxlVGFza1F1ZXVlSW50ZXJuYWwgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogSWRsZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2spO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjYW5jZWxJZGxlQ2FsbGJhY2soaWRlbnRpZmllcik7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgaWRsZSBjYWxsYmFja3MsIHRyeWluZyB0byByZXNwZWN0IHRoZSBpZGxlIGNhbGxiYWNrJ3NcbiAqIGRlYWRsaW5lIGdpdmVuIGJ5IHRoZSBlbnZpcm9ubWVudC4gVGhlIHRhc2tzIHdpbGwgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnF1ZXVlZCwgYnV0IHRoZXlcbiAqIHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlciwgYW5kIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGV5J3JlIG5vbi11cmdlbnQgYW5kIHdpbGwgbm90XG4gKiBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICpcbiAqIFRoaXMgcmV2ZXJ0cyB0byBhIHtAbGluayBQcmlvcml0eVRhc2tRdWV1ZX0gaWYgdGhlIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgaWRsZSBjYWxsYmFja3MuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBJZGxlVGFza1F1ZXVlID0gKCFpc05vZGUgJiYgJ3JlcXVlc3RJZGxlQ2FsbGJhY2snIGluIHdpbmRvdykgPyBJZGxlVGFza1F1ZXVlSW50ZXJuYWwgOiBQcmlvcml0eVRhc2tRdWV1ZTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB0cmFja3MgYSBzaW5nbGUgZGVib3VuY2VkIHRhc2sgdGhhdCB3aWxsIHJ1biBvbiB0aGUgbmV4dCBpZGxlIGZyYW1lLiBXaGVuIGNhbGxlZFxuICogbXVsdGlwbGUgdGltZXMsIG9ubHkgdGhlIGxhc3Qgc2V0IHRhc2sgd2lsbCBydW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWJvdW5jZWRJZGxlVGFzayB7XG4gIHByaXZhdGUgX3F1ZXVlOiBJVGFza1F1ZXVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gbmV3IElkbGVUYXNrUXVldWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9xdWV1ZS5jbGVhcigpO1xuICAgIHRoaXMuX3F1ZXVlLmVucXVldWUodGFzayk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgdGhpcy5fcXVldWUuZmx1c2goKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUNvbG9yUkdCLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzLCBCZ0ZsYWdzLCBVbmRlcmxpbmVTdHlsZSwgRXh0RmxhZ3MgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUF0dHJpYnV0ZURhdGEge1xuICBwdWJsaWMgc3RhdGljIHRvQ29sb3JSR0IodmFsdWU6IG51bWJlcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLlJFRF9TSElGVCAmIDI1NSxcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLkdSRUVOX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgJiAyNTVcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29sb3JSR0IodmFsdWU6IElDb2xvclJHQik6IG51bWJlciB7XG4gICAgcmV0dXJuICh2YWx1ZVswXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5SRURfU0hJRlQgfCAodmFsdWVbMV0gJiAyNTUpIDw8IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgfCB2YWx1ZVsyXSAmIDI1NTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBJQXR0cmlidXRlRGF0YSB7XG4gICAgY29uc3QgbmV3T2JqID0gbmV3IEF0dHJpYnV0ZURhdGEoKTtcbiAgICBuZXdPYmouZmcgPSB0aGlzLmZnO1xuICAgIG5ld09iai5iZyA9IHRoaXMuYmc7XG4gICAgbmV3T2JqLmV4dGVuZGVkID0gdGhpcy5leHRlbmRlZC5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH1cblxuICAvLyBkYXRhXG4gIHB1YmxpYyBmZyA9IDA7XG4gIHB1YmxpYyBiZyA9IDA7XG4gIHB1YmxpYyBleHRlbmRlZDogSUV4dGVuZGVkQXR0cnMgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuXG4gIC8vIGZsYWdzXG4gIHB1YmxpYyBpc0ludmVyc2UoKTogbnVtYmVyICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVkVSU0U7IH1cbiAgcHVibGljIGlzQm9sZCgpOiBudW1iZXIgICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQk9MRDsgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmUoKTogbnVtYmVyICAgICB7XG4gICAgaWYgKHRoaXMuaGFzRXh0ZW5kZWRBdHRycygpICYmIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgIT09IFVuZGVybGluZVN0eWxlLk5PTkUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FO1xuICB9XG4gIHB1YmxpYyBpc0JsaW5rKCk6IG51bWJlciAgICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLkJMSU5LOyB9XG4gIHB1YmxpYyBpc0ludmlzaWJsZSgpOiBudW1iZXIgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVklTSUJMRTsgfVxuICBwdWJsaWMgaXNJdGFsaWMoKTogbnVtYmVyICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5JVEFMSUM7IH1cbiAgcHVibGljIGlzRGltKCk6IG51bWJlciAgICAgICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuRElNOyB9XG4gIHB1YmxpYyBpc1N0cmlrZXRocm91Z2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlNUUklLRVRIUk9VR0g7IH1cbiAgcHVibGljIGlzUHJvdGVjdGVkKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuUFJPVEVDVEVEOyB9XG4gIHB1YmxpYyBpc092ZXJsaW5lKCk6IG51bWJlciAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLk9WRVJMSU5FOyB9XG5cbiAgLy8gY29sb3IgbW9kZXNcbiAgcHVibGljIGdldEZnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBnZXRCZ0NvbG9yTW9kZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSzsgfVxuICBwdWJsaWMgaXNGZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzQmdSR0IoKTogYm9vbGVhbiAgICAgICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCOyB9XG4gIHB1YmxpYyBpc0ZnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNCZ1BhbGV0dGUoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTY7IH1cbiAgcHVibGljIGlzRmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQXR0cmlidXRlRGVmYXVsdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZmcgPT09IDAgJiYgdGhpcy5iZyA9PT0gMDsgfVxuXG4gIC8vIGNvbG9yc1xuICBwdWJsaWMgZ2V0RmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEJnQ29sb3IoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6ICAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvLyBDTV9ERUZBVUxUIGRlZmF1bHRzIHRvIC0xXG4gICAgfVxuICB9XG5cbiAgLy8gZXh0ZW5kZWQgYXR0cnNcbiAgcHVibGljIGhhc0V4dGVuZGVkQXR0cnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFeHRlbmRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHRlbmRlZC5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuYmcgJj0gfkJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJnIHw9IEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3IoKTogbnVtYmVyIHtcbiAgICBpZiAoKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmdDb2xvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZUNvbG9yTW9kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLXG4gICAgICA6IHRoaXMuZ2V0RmdDb2xvck1vZGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclJHQigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQlxuICAgICAgOiB0aGlzLmlzRmdSR0IoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclBhbGV0dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTZcbiAgICAgICAgICB8fCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NlxuICAgICAgOiB0aGlzLmlzRmdQYWxldHRlKCk7XG4gIH1cbiAgcHVibGljIGlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDBcbiAgICAgIDogdGhpcy5pc0ZnRGVmYXVsdCgpO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlVOREVSTElORVxuICAgICAgPyAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEID8gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA6IFVuZGVybGluZVN0eWxlLlNJTkdMRSlcbiAgICAgIDogVW5kZXJsaW5lU3R5bGUuTk9ORTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVZhcmlhbnRPZmZzZXQ7XG4gIH1cbn1cblxuXG4vKipcbiAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGEgY2VsbC5cbiAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVudCB1bmRlcmxpbmUgc3R5bGVzIGFuZCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuZGVkQXR0cnMgaW1wbGVtZW50cyBJRXh0ZW5kZWRBdHRycyB7XG4gIHByaXZhdGUgX2V4dDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCBleHQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9leHQgJiB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSB8XG4gICAgICAgICh0aGlzLnVuZGVybGluZVN0eWxlIDw8IDI2KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4dDtcbiAgfVxuICBwdWJsaWMgc2V0IGV4dCh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX2V4dCA9IHZhbHVlOyB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiB0aGUgVVJMIHN0eWxlIGlmIGl0IGhhcyBvbmVcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiBVbmRlcmxpbmVTdHlsZS5EQVNIRUQ7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5fZXh0ICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSA+PiAyNjtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZVN0eWxlKHZhbHVlOiBVbmRlcmxpbmVTdHlsZSkge1xuICAgIHRoaXMuX2V4dCAmPSB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjYpICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHQgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVDb2xvcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgdGhpcy5fZXh0IHw9IHZhbHVlICYgKEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsSWQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgdXJsSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsSWQ7XG4gIH1cbiAgcHVibGljIHNldCB1cmxJZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdXJsSWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbCA9ICh0aGlzLl9leHQgJiBFeHRGbGFncy5WQVJJQU5UX09GRlNFVCkgPj4gMjk7XG4gICAgaWYgKHZhbCA8IDApIHtcbiAgICAgIHJldHVybiB2YWwgXiAweEZGRkZGRkY4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLl9leHQgfD0gKHZhbHVlIDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZXh0OiBudW1iZXIgPSAwLFxuICAgIHVybElkOiBudW1iZXIgPSAwXG4gICkge1xuICAgIHRoaXMuX2V4dCA9IGV4dDtcbiAgICB0aGlzLl91cmxJZCA9IHVybElkO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElFeHRlbmRlZEF0dHJzIHtcbiAgICByZXR1cm4gbmV3IEV4dGVuZGVkQXR0cnModGhpcy5fZXh0LCB0aGlzLl91cmxJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudCBtZXRob2QgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb2JqZWN0IGhvbGRzIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sXG4gICAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGFudCBpbiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudW5kZXJsaW5lU3R5bGUgPT09IFVuZGVybGluZVN0eWxlLk5PTkUgJiYgdGhpcy5fdXJsSWQgPT09IDA7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ2hhckRhdGEsIElDZWxsRGF0YSwgSUV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgc3RyaW5nRnJvbUNvZGVQb2ludCB9IGZyb20gJ2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlcic7XG5pbXBvcnQgeyBDSEFSX0RBVEFfQ0hBUl9JTkRFWCwgQ0hBUl9EQVRBX1dJRFRIX0lOREVYLCBDSEFSX0RBVEFfQVRUUl9JTkRFWCwgQ29udGVudCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEsIEV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuXG4vKipcbiAqIENlbGxEYXRhIC0gcmVwcmVzZW50cyBhIHNpbmdsZSBDZWxsIGluIHRoZSB0ZXJtaW5hbCBidWZmZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICAvKiogSGVscGVyIHRvIGNyZWF0ZSBDZWxsRGF0YSBmcm9tIENoYXJEYXRhLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiBDZWxsRGF0YSB7XG4gICAgY29uc3Qgb2JqID0gbmV3IENlbGxEYXRhKCk7XG4gICAgb2JqLnNldEZyb21DaGFyRGF0YSh2YWx1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICAvKiogUHJpbWl0aXZlcyBmcm9tIHRlcm1pbmFsIGJ1ZmZlci4gKi9cbiAgcHVibGljIGNvbnRlbnQgPSAwO1xuICBwdWJsaWMgZmcgPSAwO1xuICBwdWJsaWMgYmcgPSAwO1xuICBwdWJsaWMgZXh0ZW5kZWQ6IElFeHRlbmRlZEF0dHJzID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcbiAgcHVibGljIGNvbWJpbmVkRGF0YSA9ICcnO1xuICAvKiogV2hldGhlciBjZWxsIGNvbnRhaW5zIGEgY29tYmluZWQgc3RyaW5nLiAqL1xuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gIH1cbiAgLyoqIFdpZHRoIG9mIHRoZSBjZWxsLiAqL1xuICBwdWJsaWMgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50ID4+IENvbnRlbnQuV0lEVEhfU0hJRlQ7XG4gIH1cbiAgLyoqIEpTIHN0cmluZyBvZiB0aGUgY29udGVudC4gKi9cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgcmV0dXJuIHN0cmluZ0Zyb21Db2RlUG9pbnQodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuICAvKipcbiAgICogQ29kZXBvaW50IG9mIGNlbGxcbiAgICogTm90ZSB0aGlzIHJldHVybnMgdGhlIFVURjMyIGNvZGVwb2ludCBvZiBzaW5nbGUgY2hhcnMsXG4gICAqIGlmIGNvbnRlbnQgaXMgYSBjb21iaW5lZCBzdHJpbmcgaXQgcmV0dXJucyB0aGUgY29kZXBvaW50XG4gICAqIG9mIHRoZSBsYXN0IGNoYXIgaW4gc3RyaW5nIHRvIGJlIGluIGxpbmUgd2l0aCBjb2RlIGluIENoYXJEYXRhLlxuICAgKi9cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuaXNDb21iaW5lZCgpKVxuICAgICAgPyB0aGlzLmNvbWJpbmVkRGF0YS5jaGFyQ29kZUF0KHRoaXMuY29tYmluZWREYXRhLmxlbmd0aCAtIDEpXG4gICAgICA6IHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0s7XG4gIH1cbiAgLyoqIFNldCBkYXRhIGZyb20gQ2hhckRhdGEgKi9cbiAgcHVibGljIHNldEZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmZnID0gdmFsdWVbQ0hBUl9EQVRBX0FUVFJfSU5ERVhdO1xuICAgIHRoaXMuYmcgPSAwO1xuICAgIGxldCBjb21iaW5lZCA9IGZhbHNlO1xuICAgIC8vIHN1cnJvZ2F0ZXMgYW5kIGNvbWJpbmVkIHN0cmluZ3MgbmVlZCBzcGVjaWFsIHRyZWF0bWVudFxuICAgIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID4gMikge1xuICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyBpZiB0aGUgMi1jaGFyIHN0cmluZyBpcyBhIHN1cnJvZ2F0ZSBjcmVhdGUgc2luZ2xlIGNvZGVwb2ludFxuICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGlzIGNvbWJpbmVkXG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMSk7XG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSAoKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWQpIHtcbiAgICAgIHRoaXMuY29tYmluZWREYXRhID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdO1xuICAgICAgdGhpcy5jb250ZW50ID0gQ29udGVudC5JU19DT01CSU5FRF9NQVNLIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICB9XG4gIC8qKiBHZXQgZGF0YSBhcyBDaGFyRGF0YS4gKi9cbiAgcHVibGljIGdldEFzQ2hhckRhdGEoKTogQ2hhckRhdGEge1xuICAgIHJldHVybiBbdGhpcy5mZywgdGhpcy5nZXRDaGFycygpLCB0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0Q29kZSgpXTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DT0xPUiA9IDA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9BVFRSID0gKDAgPDwgMTgpIHwgKERFRkFVTFRfQ09MT1IgPDwgOSkgfCAoMjU2IDw8IDApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhUID0gMDtcblxuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9BVFRSX0lOREVYID0gMDtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQ0hBUl9JTkRFWCA9IDE7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX1dJRFRIX0lOREVYID0gMjtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQ09ERV9JTkRFWCA9IDM7XG5cbi8qKlxuICogTnVsbCBjZWxsIC0gYSByZWFsIGVtcHR5IGNlbGwgKGNvbnRhaW5pbmcgbm90aGluZykuXG4gKiBOb3RlIHRoYXQgY29kZSBzaG91bGQgYWx3YXlzIGJlIDAgZm9yIGEgbnVsbCBjZWxsIGFzXG4gKiBzZXZlcmFsIHRlc3QgY29uZGl0aW9uIG9mIHRoZSBidWZmZXIgbGluZSByZWx5IG9uIHRoaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfQ0hBUiA9ICcnO1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9XSURUSCA9IDE7XG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX0NPREUgPSAwO1xuXG4vKipcbiAqIFdoaXRlc3BhY2UgY2VsbC5cbiAqIFRoaXMgaXMgbWVhbnQgYXMgYSByZXBsYWNlbWVudCBmb3IgZW1wdHkgY2VsbHMgd2hlbiBuZWVkZWRcbiAqIGR1cmluZyByZW5kZXJpbmcgbGluZXMgdG8gcHJlc2VydmUgY29ycmVjdCBhbGlnbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9DSEFSID0gJyAnO1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9XSURUSCA9IDE7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX0NPREUgPSAzMjtcblxuLyoqXG4gKiBCaXRtYXNrcyBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gYGNvbnRlbnRgLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBDb250ZW50IHtcbiAgLyoqXG4gICAqIGJpdCAxLi4yMSAgICBjb2RlcG9pbnQsIG1heCBhbGxvd2VkIGluIFVURjMyIGlzIDB4MTBGRkZGICgyMSBiaXRzIHRha2VuKVxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgY29kZXBvaW50ID0gY29udGVudCAmIENvbnRlbnQuY29kZXBvaW50TWFzaztgXG4gICAqICAgICAgICAgICAgICB3cml0ZTogIGBjb250ZW50IHw9IGNvZGVwb2ludCAmIENvbnRlbnQuY29kZXBvaW50TWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IGlmIHByZWNvbmRpdGlvbiBgY29kZXBvaW50IDw9IDB4MTBGRkZGYCBpcyBtZXQ6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBjb250ZW50IHw9IGNvZGVwb2ludDtgXG4gICAqL1xuICBDT0RFUE9JTlRfTUFTSyA9IDB4MUZGRkZGLFxuXG4gIC8qKlxuICAgKiBiaXQgMjIgICAgICAgZmxhZyBpbmRpY2F0aW9uIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGNvbWJpbmVkIGNvbnRlbnRcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGlzQ29tYmluZWQgPSBjb250ZW50ICYgQ29udGVudC5pc0NvbWJpbmVkO2BcbiAgICogICAgICAgICAgICAgIHNldDogICAgYGNvbnRlbnQgfD0gQ29udGVudC5pc0NvbWJpbmVkO2BcbiAgICogICAgICAgICAgICAgIGNsZWFyOiAgYGNvbnRlbnQgJj0gfkNvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqL1xuICBJU19DT01CSU5FRF9NQVNLID0gMHgyMDAwMDAsICAvLyAxIDw8IDIxXG5cbiAgLyoqXG4gICAqIGJpdCAxLi4yMiAgICBtYXNrIHRvIGNoZWNrIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGFueSBzdHJpbmcgZGF0YVxuICAgKiAgICAgICAgICAgICAgd2UgbmVlZCB0byBjaGVjayBmb3IgY29kZXBvaW50IGFuZCBpc0NvbWJpbmVkIGJpdHMgdG8gc2VlXG4gICAqICAgICAgICAgICAgICB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBhbnl0aGluZ1xuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgaXNFbXB0eSA9ICEoY29udGVudCAmIENvbnRlbnQuaGFzQ29udGVudClgXG4gICAqL1xuICBIQVNfQ09OVEVOVF9NQVNLID0gMHgzRkZGRkYsXG5cbiAgLyoqXG4gICAqIGJpdCAyMy4uMjQgICB3Y3dpZHRoIHZhbHVlIG9mIGNlbGwsIHRha2VzIDIgYml0cyAocmFuZ2VzIGZyb20gMC4uMilcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYHdpZHRoID0gKGNvbnRlbnQgJiBDb250ZW50LndpZHRoTWFzaykgPj4gQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGhhc1dpZHRoID0gY29udGVudCAmIENvbnRlbnQud2lkdGhNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgYXMgbG9uZyBhcyB3Y3dpZHRoIGlzIGhpZ2hlc3QgdmFsdWUgaW4gYGNvbnRlbnRgOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgd2lkdGggPSBjb250ZW50ID4+IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqICAgICAgICAgICAgICB3cml0ZTogIGBjb250ZW50IHw9ICh3aWR0aCA8PCBDb250ZW50LndpZHRoU2hpZnQpICYgQ29udGVudC53aWR0aE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCBpZiBwcmVjb25kaXRpb24gYDAgPD0gd2lkdGggPD0gM2AgaXMgbWV0OlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgY29udGVudCB8PSB3aWR0aCA8PCBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKi9cbiAgV0lEVEhfTUFTSyA9IDB4QzAwMDAwLCAgIC8vIDMgPDwgMjJcbiAgV0lEVEhfU0hJRlQgPSAyMlxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIGJpdCAxLi44ICAgICBibHVlIGluIFJHQiwgY29sb3IgaW4gUDI1NiBhbmQgUDE2XG4gICAqL1xuICBCTFVFX01BU0sgPSAweEZGLFxuICBCTFVFX1NISUZUID0gMCxcbiAgUENPTE9SX01BU0sgPSAweEZGLFxuICBQQ09MT1JfU0hJRlQgPSAwLFxuXG4gIC8qKlxuICAgKiBiaXQgOS4uMTYgICAgZ3JlZW4gaW4gUkdCXG4gICAqL1xuICBHUkVFTl9NQVNLID0gMHhGRjAwLFxuICBHUkVFTl9TSElGVCA9IDgsXG5cbiAgLyoqXG4gICAqIGJpdCAxNy4uMjQgICByZWQgaW4gUkdCXG4gICAqL1xuICBSRURfTUFTSyA9IDB4RkYwMDAwLFxuICBSRURfU0hJRlQgPSAxNixcblxuICAvKipcbiAgICogYml0IDI1Li4yNiAgIGNvbG9yIG1vZGU6IERFRkFVTFQgKDApIHwgUDE2ICgxKSB8IFAyNTYgKDIpIHwgUkdCICgzKVxuICAgKi9cbiAgQ01fTUFTSyA9IDB4MzAwMDAwMCxcbiAgQ01fREVGQVVMVCA9IDAsXG4gIENNX1AxNiA9IDB4MTAwMDAwMCxcbiAgQ01fUDI1NiA9IDB4MjAwMDAwMCxcbiAgQ01fUkdCID0gMHgzMDAwMDAwLFxuXG4gIC8qKlxuICAgKiBiaXQgMS4uMjQgIFJHQiByb29tXG4gICAqL1xuICBSR0JfTUFTSyA9IDB4RkZGRkZGXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEZnRmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4zMlxuICAgKi9cbiAgSU5WRVJTRSA9IDB4NDAwMDAwMCxcbiAgQk9MRCA9IDB4ODAwMDAwMCxcbiAgVU5ERVJMSU5FID0gMHgxMDAwMDAwMCxcbiAgQkxJTksgPSAweDIwMDAwMDAwLFxuICBJTlZJU0lCTEUgPSAweDQwMDAwMDAwLFxuICBTVFJJS0VUSFJPVUdIID0gMHg4MDAwMDAwMCxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQmdGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjMyICh1cHBlciAyIHVudXNlZClcbiAgICovXG4gIElUQUxJQyA9IDB4NDAwMDAwMCxcbiAgRElNID0gMHg4MDAwMDAwLFxuICBIQVNfRVhURU5ERUQgPSAweDEwMDAwMDAwLFxuICBQUk9URUNURUQgPSAweDIwMDAwMDAwLFxuICBPVkVSTElORSA9IDB4NDAwMDAwMDBcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRXh0RmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4yOVxuICAgKi9cbiAgVU5ERVJMSU5FX1NUWUxFID0gMHgxQzAwMDAwMCxcblxuICAvKipcbiAgICogYml0IDMwLi4zMlxuICAgKlxuICAgKiBBbiBvcHRpb25hbCB2YXJpYW50IGZvciB0aGUgZ2x5cGgsIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gb2Zmc2V0IHVuZGVybGluZXMgYnkgYVxuICAgKiBudW1iZXIgb2YgcGl4ZWxzIHRvIGNyZWF0ZSBhIHBlcmZlY3QgcGF0dGVybi5cbiAgICovXG4gIFZBUklBTlRfT0ZGU0VUID0gMHhFMDAwMDAwMFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBVbmRlcmxpbmVTdHlsZSB7XG4gIE5PTkUgPSAwLFxuICBTSU5HTEUgPSAxLFxuICBET1VCTEUgPSAyLFxuICBDVVJMWSA9IDMsXG4gIERPVFRFRCA9IDQsXG4gIERBU0hFRCA9IDVcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLyoqXG4gKiBQb2x5ZmlsbCAtIENvbnZlcnQgVVRGMzIgY29kZXBvaW50IGludG8gSlMgc3RyaW5nLlxuICogTm90ZTogVGhlIGJ1aWx0LWluIFN0cmluZy5mcm9tQ29kZVBvaW50IGhhcHBlbnMgdG8gYmUgbXVjaCBzbG93ZXJcbiAqICAgICAgIGR1ZSB0byBhZGRpdGlvbmFsIHNhbml0eSBjaGVja3MuIFdlIGNhbiBhdm9pZCB0aGVtIHNpbmNlXG4gKiAgICAgICB3ZSBhbHdheXMgb3BlcmF0ZSBvbiBsZWdhbCBVVEYzMiAoZ3JhbnRlZCBieSB0aGUgaW5wdXQgZGVjb2RlcnMpXG4gKiAgICAgICBhbmQgdXNlIHRoaXMgZmFzdGVyIHZlcnNpb24gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zyb21Db2RlUG9pbnQoY29kZVBvaW50OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVQb2ludCA+PiAxMCkgKyAweEQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZVBvaW50ICUgMHg0MDApICsgMHhEQzAwKTtcbiAgfVxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgVVRGMzIgY2hhciBjb2RlcyBpbnRvIEpTIHN0cmluZy5cbiAqIEJhc2ljYWxseSB0aGUgc2FtZSBhcyBgc3RyaW5nRnJvbUNvZGVQb2ludGAgYnV0IGZvciBtdWx0aXBsZSBjb2RlcG9pbnRzXG4gKiBpbiBhIGxvb3AgKHdoaWNoIGlzIGEgbG90IGZhc3RlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dGYzMlRvU3RyaW5nKGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyID0gMCwgZW5kOiBudW1iZXIgPSBkYXRhLmxlbmd0aCk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBsZXQgY29kZXBvaW50ID0gZGF0YVtpXTtcbiAgICBpZiAoY29kZXBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBKUyBzdHJpbmdzIGFyZSBlbmNvZGVkIGFzIFVURjE2LCB0aHVzIGEgbm9uIEJNUCBjb2RlcG9pbnQgZ2V0cyBjb252ZXJ0ZWQgaW50byBhIHN1cnJvZ2F0ZVxuICAgICAgLy8gcGFpciBjb252ZXJzaW9uIHJ1bGVzOlxuICAgICAgLy8gIC0gc3VidHJhY3QgMHgxMDAwMCBmcm9tIGNvZGUgcG9pbnQsIGxlYXZpbmcgYSAyMCBiaXQgbnVtYmVyXG4gICAgICAvLyAgLSBhZGQgaGlnaCAxMCBiaXRzIHRvIDB4RDgwMCAgLS0+IGZpcnN0IHN1cnJvZ2F0ZVxuICAgICAgLy8gIC0gYWRkIGxvdyAxMCBiaXRzIHRvIDB4REMwMCAgIC0tPiBzZWNvbmQgc3Vycm9nYXRlXG4gICAgICBjb2RlcG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlcG9pbnQgPj4gMTApICsgMHhEODAwKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVwb2ludCAlIDB4NDAwKSArIDB4REMwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVwb2ludCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU3RyaW5nVG9VdGYzMiAtIGRlY29kZXMgVVRGMTYgc2VxdWVuY2VzIGludG8gVVRGMzIgY29kZXBvaW50cy5cbiAqIFRvIGtlZXAgdGhlIGRlY29kZXIgaW4gbGluZSB3aXRoIEpTIHN0cmluZ3MgaXQgaGFuZGxlcyBzaW5nbGUgc3Vycm9nYXRlcyBhcyBVQ1MyLlxuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nVG9VdGYzMiB7XG4gIHByaXZhdGUgX2ludGVyaW06IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIENsZWFycyBpbnRlcmltIGFuZCByZXNldHMgZGVjb2RlciB0byBjbGVhbiBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnRlcmltID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgSlMgc3RyaW5nIHRvIFVURjMyIGNvZGVwb2ludHMuXG4gICAqIFRoZSBtZXRob2RzIGFzc3VtZXMgc3RyZWFtIGlucHV0IGFuZCB3aWxsIHN0b3JlIHBhcnRseSB0cmFuc21pdHRlZFxuICAgKiBzdXJyb2dhdGUgcGFpcnMgYW5kIGRlY29kZSB0aGVtIHdpdGggdGhlIG5leHQgZGF0YSBjaHVuay5cbiAgICogTm90ZTogVGhlIG1ldGhvZCBkb2VzIG5vIGJvdW5kIGNoZWNrcyBmb3IgdGFyZ2V0LCB0aGVyZWZvcmUgbWFrZSBzdXJlXG4gICAqIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIGRvZXMgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiBgdGFyZ2V0YC5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICovXG4gIHB1YmxpYyBkZWNvZGUoaW5wdXQ6IHN0cmluZywgdGFyZ2V0OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCBzaXplID0gMDtcbiAgICBsZXQgc3RhcnRQb3MgPSAwO1xuXG4gICAgLy8gaGFuZGxlIGxlZnRvdmVyIHN1cnJvZ2F0ZSBoaWdoXG4gICAgaWYgKHRoaXMuX2ludGVyaW0pIHtcbiAgICAgIGNvbnN0IHNlY29uZCA9IGlucHV0LmNoYXJDb2RlQXQoc3RhcnRQb3MrKyk7XG4gICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gKHRoaXMuX2ludGVyaW0gLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgKFVTQzIgaGFuZGxpbmcpXG4gICAgICAgIHRhcmdldFtzaXplKytdID0gdGhpcy5faW50ZXJpbTtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBzZWNvbmQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbnRlcmltID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnRQb3M7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAvLyBzdXJyb2dhdGUgcGFpciBmaXJzdFxuICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgIGlmICgrK2kgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5faW50ZXJpbSA9IGNvZGU7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2Vjb25kID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IChVU0MyIGhhbmRsaW5nKVxuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZTtcbiAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHNlY29uZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlID09PSAweEZFRkYpIHtcbiAgICAgICAgLy8gQk9NXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxufVxuXG4vKipcbiAqIFV0ZjhEZWNvZGVyIC0gZGVjb2RlcyBVVEY4IGJ5dGUgc2VxdWVuY2VzIGludG8gVVRGMzIgY29kZXBvaW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFV0ZjhUb1V0ZjMyIHtcbiAgcHVibGljIGludGVyaW06IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgzKTtcblxuICAvKipcbiAgICogQ2xlYXJzIGludGVyaW0gYnl0ZXMgYW5kIHJlc2V0cyBkZWNvZGVyIHRvIGNsZWFuIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJpbS5maWxsKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgVVRGOCBieXRlIHNlcXVlbmNlcyBpbiBgaW5wdXRgIHRvIFVURjMyIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqIFRoZSBtZXRob2RzIGFzc3VtZXMgc3RyZWFtIGlucHV0IGFuZCB3aWxsIHN0b3JlIHBhcnRseSB0cmFuc21pdHRlZCBieXRlc1xuICAgKiBhbmQgZGVjb2RlIHRoZW0gd2l0aCB0aGUgbmV4dCBkYXRhIGNodW5rLlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm8gYm91bmQgY2hlY2tzIGZvciB0YXJnZXQsIHRoZXJlZm9yZSBtYWtlIHN1cmVcbiAgICogdGhlIHByb3ZpZGVkIGRhdGEgY2h1bmsgZG9lcyBub3QgZXhjZWVkIHRoZSBzaXplIG9mIGB0YXJnZXRgLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKi9cbiAgcHVibGljIGRlY29kZShpbnB1dDogVWludDhBcnJheSwgdGFyZ2V0OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCBzaXplID0gMDtcbiAgICBsZXQgYnl0ZTE6IG51bWJlcjtcbiAgICBsZXQgYnl0ZTI6IG51bWJlcjtcbiAgICBsZXQgYnl0ZTM6IG51bWJlcjtcbiAgICBsZXQgYnl0ZTQ6IG51bWJlcjtcbiAgICBsZXQgY29kZXBvaW50ID0gMDtcbiAgICBsZXQgc3RhcnRQb3MgPSAwO1xuXG4gICAgLy8gaGFuZGxlIGxlZnRvdmVyIGJ5dGVzXG4gICAgaWYgKHRoaXMuaW50ZXJpbVswXSkge1xuICAgICAgbGV0IGRpc2NhcmRJbnRlcmltID0gZmFsc2U7XG4gICAgICBsZXQgY3AgPSB0aGlzLmludGVyaW1bMF07XG4gICAgICBjcCAmPSAoKCgoY3AgJiAweEUwKSA9PT0gMHhDMCkpID8gMHgxRiA6ICgoKGNwICYgMHhGMCkgPT09IDB4RTApKSA/IDB4MEYgOiAweDA3KTtcbiAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgbGV0IHRtcDogbnVtYmVyO1xuICAgICAgd2hpbGUgKCh0bXAgPSB0aGlzLmludGVyaW1bKytwb3NdICYgMHgzRikgJiYgcG9zIDwgNCkge1xuICAgICAgICBjcCA8PD0gNjtcbiAgICAgICAgY3AgfD0gdG1wO1xuICAgICAgfVxuICAgICAgLy8gbWlzc2luZyBieXRlcyAtIHJlYWQgYWhlYWQgZnJvbSBpbnB1dFxuICAgICAgY29uc3QgdHlwZSA9ICgoKHRoaXMuaW50ZXJpbVswXSAmIDB4RTApID09PSAweEMwKSkgPyAyIDogKCgodGhpcy5pbnRlcmltWzBdICYgMHhGMCkgPT09IDB4RTApKSA/IDMgOiA0O1xuICAgICAgY29uc3QgbWlzc2luZyA9IHR5cGUgLSBwb3M7XG4gICAgICB3aGlsZSAoc3RhcnRQb3MgPCBtaXNzaW5nKSB7XG4gICAgICAgIGlmIChzdGFydFBvcyA+PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB0bXAgPSBpbnB1dFtzdGFydFBvcysrXTtcbiAgICAgICAgaWYgKCh0bXAgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvbiwgZGlzY2FyZCBpbnRlcmltIGJ5dGVzIGNvbXBsZXRlbHlcbiAgICAgICAgICBzdGFydFBvcy0tO1xuICAgICAgICAgIGRpc2NhcmRJbnRlcmltID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBuZWVkIHRvIHNhdmUgc28gd2UgY2FuIGNvbnRpbnVlIHNob3J0IGlucHV0cyBpbiBuZXh0IGNhbGxcbiAgICAgICAgICB0aGlzLmludGVyaW1bcG9zKytdID0gdG1wO1xuICAgICAgICAgIGNwIDw8PSA2O1xuICAgICAgICAgIGNwIHw9IHRtcCAmIDB4M0Y7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZGlzY2FyZEludGVyaW0pIHtcbiAgICAgICAgLy8gZmluYWwgdGVzdCBpcyB0eXBlIGRlcGVuZGVudFxuICAgICAgICBpZiAodHlwZSA9PT0gMikge1xuICAgICAgICAgIGlmIChjcCA8IDB4ODApIHtcbiAgICAgICAgICAgIC8vIHdyb25nIHN0YXJ0ZXIgYnl0ZVxuICAgICAgICAgICAgc3RhcnRQb3MtLTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gMykge1xuICAgICAgICAgIGlmIChjcCA8IDB4MDgwMCB8fCAoY3AgPj0gMHhEODAwICYmIGNwIDw9IDB4REZGRikgfHwgY3AgPT09IDB4RkVGRikge1xuICAgICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgb3IgQk9NXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjcCA8IDB4MDEwMDAwIHx8IGNwID4gMHgxMEZGRkYpIHtcbiAgICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY3A7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmludGVyaW0uZmlsbCgwKTtcbiAgICB9XG5cbiAgICAvLyBsb29wIHRocm91Z2ggaW5wdXRcbiAgICBjb25zdCBmb3VyU3RvcCA9IGxlbmd0aCAtIDQ7XG4gICAgbGV0IGkgPSBzdGFydFBvcztcbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgLyoqXG4gICAgICAgKiBBU0NJSSBzaG9ydGN1dCB3aXRoIGxvb3AgdW5yb2xsZWQgdG8gNCBjb25zZWN1dGl2ZSBBU0NJSSBjaGFycy5cbiAgICAgICAqIFRoaXMgaXMgYSBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgZ2FpbiBmb3IgQVNDSUlcbiAgICAgICAqIGFuZCBwZW5hbHR5IGZvciBub24gQVNDSUk6XG4gICAgICAgKiBGb3IgYmVzdCBBU0NJSSBwZXJmb3JtYW5jZSB0aGUgY2hhciBzaG91bGQgYmUgc3RvcmVkIGRpcmVjdGx5IGludG8gdGFyZ2V0LFxuICAgICAgICogYnV0IGV2ZW4gYSBzaW5nbGUgYXR0ZW1wdCB0byB3cml0ZSB0byB0YXJnZXQgYW5kIGNvbXBhcmUgYWZ0ZXJ3YXJkc1xuICAgICAgICogcGVuYWxpemVzIG5vbiBBU0NJSSByZWFsbHkgYmFkICgtNTAlKSwgdGh1cyB3ZSBsb2FkIHRoZSBjaGFyIGludG8gYnl0ZVggZmlyc3QsXG4gICAgICAgKiB3aGljaCByZWR1Y2VzIEFTQ0lJIHBlcmZvcm1hbmNlIGJ5IH4xNSUuXG4gICAgICAgKiBUaGlzIHRyaWFsIGZvciBBU0NJSSByZWR1Y2VzIG5vbiBBU0NJSSBwZXJmb3JtYW5jZSBieSB+MTAlIHdoaWNoIHNlZW1zIGFjY2VwdGlibGVcbiAgICAgICAqIGNvbXBhcmVkIHRvIHRoZSBnYWlucy5cbiAgICAgICAqIE5vdGUgdGhhdCB0aGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGZvciA0IGNvbnNlY3V0aXZlIEFTQ0lJIGNoYXJzLFxuICAgICAgICogZm9yIGFueSBzaG9ydGVyIGl0IGJhaWxzIG91dC4gV29yc3QgY2FzZSAtIGFsbCA0IGJ5dGVzIGJlaW5nIHJlYWQgYnV0XG4gICAgICAgKiB0aHJvd24gYXdheSBkdWUgdG8gdGhlIGxhc3QgYmVpbmcgYSBub24gQVNDSUkgY2hhciAoLTEwJSBwZXJmb3JtYW5jZSkuXG4gICAgICAgKi9cbiAgICAgIHdoaWxlIChpIDwgZm91clN0b3BcbiAgICAgICAgJiYgISgoYnl0ZTEgPSBpbnB1dFtpXSkgJiAweDgwKVxuICAgICAgICAmJiAhKChieXRlMiA9IGlucHV0W2kgKyAxXSkgJiAweDgwKVxuICAgICAgICAmJiAhKChieXRlMyA9IGlucHV0W2kgKyAyXSkgJiAweDgwKVxuICAgICAgICAmJiAhKChieXRlNCA9IGlucHV0W2kgKyAzXSkgJiAweDgwKSlcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMTtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMjtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMztcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlNDtcbiAgICAgICAgaSArPSA0O1xuICAgICAgfVxuXG4gICAgICAvLyByZXJlYWQgYnl0ZTFcbiAgICAgIGJ5dGUxID0gaW5wdXRbaSsrXTtcblxuICAgICAgLy8gMSBieXRlXG4gICAgICBpZiAoYnl0ZTEgPCAweDgwKSB7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTE7XG5cbiAgICAgICAgLy8gMiBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEUwKSA9PT0gMHhDMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDFGKSA8PCA2IHwgKGJ5dGUyICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDgwKSB7XG4gICAgICAgICAgLy8gd3Jvbmcgc3RhcnRlciBieXRlXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuXG4gICAgICAgIC8vIDMgYnl0ZXNcbiAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhGMCkgPT09IDB4RTApIHtcbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTIgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUyICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzFdID0gYnl0ZTI7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTMgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUzICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50ID0gKGJ5dGUxICYgMHgwRikgPDwgMTIgfCAoYnl0ZTIgJiAweDNGKSA8PCA2IHwgKGJ5dGUzICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDA4MDAgfHwgKGNvZGVwb2ludCA+PSAweEQ4MDAgJiYgY29kZXBvaW50IDw9IDB4REZGRikgfHwgY29kZXBvaW50ID09PSAweEZFRkYpIHtcbiAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCBvciBCT00sIG5vIGktLSBoZXJlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG5cbiAgICAgICAgLy8gNCBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEY4KSA9PT0gMHhGMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMyA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTMgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMl0gPSBieXRlMztcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlNCA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTQgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDA3KSA8PCAxOCB8IChieXRlMiAmIDB4M0YpIDw8IDEyIHwgKGJ5dGUzICYgMHgzRikgPDwgNiB8IChieXRlNCAmIDB4M0YpO1xuICAgICAgICBpZiAoY29kZXBvaW50IDwgMHgwMTAwMDAgfHwgY29kZXBvaW50ID4gMHgxMEZGRkYpIHtcbiAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCwgbm8gaS0tIGhlcmVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlsbGVnYWwgYnl0ZSwganVzdCBza2lwXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElMb2dTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UsIExvZ0xldmVsRW51bSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbnR5cGUgTG9nVHlwZSA9IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBJQ29uc29sZSB7XG4gIGxvZzogTG9nVHlwZTtcbiAgZXJyb3I6IExvZ1R5cGU7XG4gIGluZm86IExvZ1R5cGU7XG4gIHRyYWNlOiBMb2dUeXBlO1xuICB3YXJuOiBMb2dUeXBlO1xufVxuXG4vLyBjb25zb2xlIGlzIGF2YWlsYWJsZSBvbiBib3RoIG5vZGUuanMgYW5kIGJyb3dzZXIgY29udGV4dHMgYnV0IHRoZSBjb21tb25cbi8vIG1vZHVsZSBkb2Vzbid0IGRlcGVuZCBvbiB0aGVtIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBkZWNsYXJlIGl0LlxuZGVjbGFyZSBjb25zdCBjb25zb2xlOiBJQ29uc29sZTtcblxuY29uc3Qgb3B0aW9uc0tleVRvTG9nTGV2ZWw6IHsgW2tleTogc3RyaW5nXTogTG9nTGV2ZWxFbnVtIH0gPSB7XG4gIHRyYWNlOiBMb2dMZXZlbEVudW0uVFJBQ0UsXG4gIGRlYnVnOiBMb2dMZXZlbEVudW0uREVCVUcsXG4gIGluZm86IExvZ0xldmVsRW51bS5JTkZPLFxuICB3YXJuOiBMb2dMZXZlbEVudW0uV0FSTixcbiAgZXJyb3I6IExvZ0xldmVsRW51bS5FUlJPUixcbiAgb2ZmOiBMb2dMZXZlbEVudW0uT0ZGXG59O1xuXG5jb25zdCBMT0dfUFJFRklYID0gJ3h0ZXJtLmpzOiAnO1xuXG5leHBvcnQgY2xhc3MgTG9nU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTG9nU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwcml2YXRlIF9sb2dMZXZlbDogTG9nTGV2ZWxFbnVtID0gTG9nTGV2ZWxFbnVtLk9GRjtcbiAgcHVibGljIGdldCBsb2dMZXZlbCgpOiBMb2dMZXZlbEVudW0geyByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl91cGRhdGVMb2dMZXZlbCgpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnbG9nTGV2ZWwnLCAoKSA9PiB0aGlzLl91cGRhdGVMb2dMZXZlbCgpKSk7XG5cbiAgICAvLyBGb3IgdHJhY2UgbG9nZ2luZywgYXNzdW1lIHRoZSBsYXRlc3QgY3JlYXRlZCBsb2cgc2VydmljZSBpcyB2YWxpZFxuICAgIHRyYWNlTG9nZ2VyID0gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUxvZ0xldmVsKCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ0xldmVsID0gb3B0aW9uc0tleVRvTG9nTGV2ZWxbdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sb2dMZXZlbF07XG4gIH1cblxuICBwcml2YXRlIF9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zKG9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uYWxQYXJhbXNbaV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0aW9uYWxQYXJhbXNbaV0gPSBvcHRpb25hbFBhcmFtc1tpXSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvZyh0eXBlOiBMb2dUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMuX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMob3B0aW9uYWxQYXJhbXMpO1xuICAgIHR5cGUuY2FsbChjb25zb2xlLCAodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIgPyAnJyA6IExPR19QUkVGSVgpICsgbWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5UUkFDRSkge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy50cmFjZS5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmxvZywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uREVCVUcpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZGVidWcuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5sb2csIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uSU5GTykge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5pbmZvLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUuaW5mbywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5XQVJOKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/Lndhcm4uYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS53YXJuLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5FUlJPUikge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5lcnJvci5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmVycm9yLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG59XG5cbmxldCB0cmFjZUxvZ2dlcjogSUxvZ1NlcnZpY2U7XG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhY2VMb2dnZXIobG9nZ2VyOiBJTG9nU2VydmljZSk6IHZvaWQge1xuICB0cmFjZUxvZ2dlciA9IGxvZ2dlcjtcbn1cblxuLyoqXG4gKiBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgbG9nIHRyYWNlIGNhbGxzIHRvIHRoZSBkZWNvcmF0ZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjZUNhbGwoX3RhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzY3JpcHRvcjogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3QgZm5LZXkgPSAndmFsdWUnO1xuICBjb25zdCBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gIGRlc2NyaXB0b3JbZm5LZXldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgLy8gRWFybHkgZXhpdFxuICAgIGlmICh0cmFjZUxvZ2dlci5sb2dMZXZlbCAhPT0gTG9nTGV2ZWxFbnVtLlRSQUNFKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuXG4gICAgdHJhY2VMb2dnZXIudHJhY2UoYEdseXBoUmVuZGVyZXIjJHtmbi5uYW1lfSgke2FyZ3MubWFwKGUgPT4gSlNPTi5zdHJpbmdpZnkoZSkpLmpvaW4oJywgJyl9KWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHRyYWNlTG9nZ2VyLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7Zm4ubmFtZX0gcmV0dXJuYCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBUaGlzIHdhcyBoZWF2aWx5IGluc3BpcmVkIGZyb20gbWljcm9zb2Z0L3ZzY29kZSdzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAoTUlUKS5cbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElTZXJ2aWNlSWRlbnRpZmllciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmNvbnN0IERJX1RBUkdFVCA9ICdkaSR0YXJnZXQnO1xuY29uc3QgRElfREVQRU5ERU5DSUVTID0gJ2RpJGRlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBjb25zdCBzZXJ2aWNlUmVnaXN0cnk6IE1hcDxzdHJpbmcsIElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VEZXBlbmRlbmNpZXMoY3RvcjogYW55KTogeyBpZDogSVNlcnZpY2VJZGVudGlmaWVyPGFueT4sIGluZGV4OiBudW1iZXIsIG9wdGlvbmFsOiBib29sZWFuIH1bXSB7XG4gIHJldHVybiBjdG9yW0RJX0RFUEVOREVOQ0lFU10gfHwgW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3I8VD4oaWQ6IHN0cmluZyk6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gIGlmIChzZXJ2aWNlUmVnaXN0cnkuaGFzKGlkKSkge1xuICAgIHJldHVybiBzZXJ2aWNlUmVnaXN0cnkuZ2V0KGlkKSE7XG4gIH1cblxuICBjb25zdCBkZWNvcmF0b3I6IGFueSA9IGZ1bmN0aW9uICh0YXJnZXQ6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQElTZXJ2aWNlTmFtZS1kZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWNvcmF0ZSBhIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHN0b3JlU2VydmljZURlcGVuZGVuY3koZGVjb3JhdG9yLCB0YXJnZXQsIGluZGV4KTtcbiAgfTtcblxuICBkZWNvcmF0b3IudG9TdHJpbmcgPSAoKSA9PiBpZDtcblxuICBzZXJ2aWNlUmVnaXN0cnkuc2V0KGlkLCBkZWNvcmF0b3IpO1xuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuXG5mdW5jdGlvbiBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGlkOiBGdW5jdGlvbiwgdGFyZ2V0OiBGdW5jdGlvbiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICBpZiAoKHRhcmdldCBhcyBhbnkpW0RJX1RBUkdFVF0gPT09IHRhcmdldCkge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdLnB1c2goeyBpZCwgaW5kZXggfSk7XG4gIH0gZWxzZSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10gPSBbeyBpZCwgaW5kZXggfV07XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX1RBUkdFVF0gPSB0YXJnZXQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUV2ZW50LCBJRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJRGVjUHJpdmF0ZU1vZGVzLCBJQ29yZU1vdXNlRXZlbnQsIENvcmVNb3VzZUVuY29kaW5nLCBJQ29yZU1vdXNlUHJvdG9jb2wsIENvcmVNb3VzZUV2ZW50VHlwZSwgSUNoYXJzZXQsIElXaW5kb3dPcHRpb25zLCBJTW9kZXMsIElBdHRyaWJ1dGVEYXRhLCBTY3JvbGxTb3VyY2UsIElEaXNwb3NhYmxlLCBJQ29sb3IsIEN1cnNvclN0eWxlLCBDdXJzb3JJbmFjdGl2ZVN0eWxlLCBJT3NjTGlua0RhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRGVjb3JhdG9yIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvbk9wdGlvbnMsIElEZWNvcmF0aW9uLCBJTGlua0hhbmRsZXIsIElXaW5kb3dzUHR5LCBJTG9nZ2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGNvbnN0IElCdWZmZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElCdWZmZXJTZXJ2aWNlPignQnVmZmVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQnVmZmVyU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGNvbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xuICByZWFkb25seSBidWZmZXI6IElCdWZmZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcnM6IElCdWZmZXJTZXQ7XG4gIGlzVXNlclNjcm9sbGluZzogYm9vbGVhbjtcbiAgb25SZXNpemU6IElFdmVudDx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+O1xuICBvblNjcm9sbDogSUV2ZW50PG51bWJlcj47XG4gIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ/OiBib29sZWFuKTogdm9pZDtcbiAgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbiwgc291cmNlPzogU2Nyb2xsU291cmNlKTogdm9pZDtcbiAgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlTW91c2VTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlTW91c2VTZXJ2aWNlPignQ29yZU1vdXNlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZU1vdXNlU2VydmljZSB7XG4gIGFjdGl2ZVByb3RvY29sOiBzdHJpbmc7XG4gIGFjdGl2ZUVuY29kaW5nOiBzdHJpbmc7XG4gIGFyZU1vdXNlRXZlbnRzQWN0aXZlOiBib29sZWFuO1xuICBhZGRQcm90b2NvbChuYW1lOiBzdHJpbmcsIHByb3RvY29sOiBJQ29yZU1vdXNlUHJvdG9jb2wpOiB2b2lkO1xuICBhZGRFbmNvZGluZyhuYW1lOiBzdHJpbmcsIGVuY29kaW5nOiBDb3JlTW91c2VFbmNvZGluZyk6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbW91c2UgZXZlbnQgdG8gYmUgc2VudC5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBwYXNzZWQgYWxsIHByb3RvY29sIHJlc3RyaWN0aW9ucyBhbmQgYSByZXBvcnRcbiAgICogd2FzIHNlbnQsIG90aGVyd2lzZSBmYWxzZS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlclxuICAgKiB0aGUgZGVmYXVsdCBldmVudCBhY3Rpb24gaW4gdGhlIGJvd3NlciBjb21wb25lbnQgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBtZXRob2Qgd2lsbCBjaGFuZ2UgdmFsdWVzIG9mIHRoZSBnaXZlbiBldmVudCBvYmplY3RcbiAgICogdG8gZnVsbGZpbGwgcHJvdG9jb2wgYW5kIGVuY29kaW5nIHJlc3RyaWN0aW9ucy5cbiAgICovXG4gIHRyaWdnZXJNb3VzZUV2ZW50KGV2ZW50OiBJQ29yZU1vdXNlRXZlbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0byBhbm5vdW5jZSBjaGFuZ2VzIGluIG1vdXNlIHRyYWNraW5nLlxuICAgKi9cbiAgb25Qcm90b2NvbENoYW5nZTogSUV2ZW50PENvcmVNb3VzZUV2ZW50VHlwZT47XG5cbiAgLyoqXG4gICAqIEh1bWFuIHJlYWRhYmxlIHZlcnNpb24gb2YgbW91c2UgZXZlbnRzLlxuICAgKi9cbiAgZXhwbGFpbkV2ZW50cyhldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZSk6IHsgW2V2ZW50OiBzdHJpbmddOiBib29sZWFuIH07XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVTZXJ2aWNlPignQ29yZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxseSB0aGUgY3Vyc29yIHdpbGwgbm90IGJlIHZpc2libGUgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIHRlcm1pbmFsXG4gICAqIGlzIGZvY3VzZWQuXG4gICAqL1xuICBpc0N1cnNvckluaXRpYWxpemVkOiBib29sZWFuO1xuICBpc0N1cnNvckhpZGRlbjogYm9vbGVhbjtcblxuICByZWFkb25seSBtb2RlczogSU1vZGVzO1xuICByZWFkb25seSBkZWNQcml2YXRlTW9kZXM6IElEZWNQcml2YXRlTW9kZXM7XG5cbiAgcmVhZG9ubHkgb25EYXRhOiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25Vc2VySW5wdXQ6IElFdmVudDx2b2lkPjtcbiAgcmVhZG9ubHkgb25CaW5hcnk6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblJlcXVlc3RTY3JvbGxUb0JvdHRvbTogSUV2ZW50PHZvaWQ+O1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkRhdGEgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICogQHBhcmFtIHdhc1VzZXJJbnB1dCBXaGV0aGVyIHRoZSBkYXRhIG9yaWdpbmF0ZWQgZnJvbSB0aGUgdXNlciAoYXMgb3Bwb3NlZCB0b1xuICAgKiByZXN1bHRpbmcgZnJvbSBwYXJzaW5nIGluY29taW5nIGRhdGEpLiBXaGVuIHRydWUgdGhpcyB3aWxsIGFsc286XG4gICAqIC0gU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGJ1ZmZlciBpZiBvcHRpb24gc2Nyb2xsT25Vc2VySW5wdXQgaXMgdHJ1ZS5cbiAgICogLSBGaXJlIHRoZSBgb25Vc2VySW5wdXRgIGV2ZW50IChzbyBzZWxlY3Rpb24gY2FuIGJlIGNsZWFyZWQpLlxuICAgKi9cbiAgdHJpZ2dlckRhdGFFdmVudChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dD86IGJvb2xlYW4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25CaW5hcnkgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICovXG4gIHRyaWdnZXJCaW5hcnlFdmVudChkYXRhOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNoYXJzZXRTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDaGFyc2V0U2VydmljZT4oJ0NoYXJzZXRTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDaGFyc2V0U2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBnbGV2ZWw6IG51bWJlcjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKi9cbiAgc2V0Z0xldmVsKGc6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hhcnNldCBmb3IgdGhlIGdpdmVuIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKiBAcGFyYW0gY2hhcnNldFxuICAgKi9cbiAgc2V0Z0NoYXJzZXQoZzogbnVtYmVyLCBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgdHlwZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnJhbmRlZFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbn1cblxudHlwZSBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSBUQXJncyBleHRlbmRzIFtdID8gW11cbiAgOiBUQXJncyBleHRlbmRzIFsuLi5pbmZlciBURmlyc3QsIGluZmVyIFRMYXN0XSA/IFRMYXN0IGV4dGVuZHMgSUJyYW5kZWRTZXJ2aWNlID8gR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRGaXJzdD4gOiBUQXJnc1xuICAgIDogbmV2ZXI7XG5cbmV4cG9ydCBjb25zdCBJSW5zdGFudGlhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUluc3RhbnRpYXRpb25TZXJ2aWNlPignSW5zdGFudGlhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25TZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgc2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IHZvaWQ7XG4gIGdldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQ7XG4gIGNyZWF0ZUluc3RhbmNlPEN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIFIgZXh0ZW5kcyBJbnN0YW5jZVR5cGU8Q3Rvcj4+KHQ6IEN0b3IsIC4uLmFyZ3M6IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Q3Rvcj4+KTogUjtcbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWxFbnVtIHtcbiAgVFJBQ0UgPSAwLFxuICBERUJVRyA9IDEsXG4gIElORk8gPSAyLFxuICBXQVJOID0gMyxcbiAgRVJST1IgPSA0LFxuICBPRkYgPSA1XG59XG5cbmV4cG9ydCBjb25zdCBJTG9nU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJTG9nU2VydmljZT4oJ0xvZ1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBsb2dMZXZlbDogTG9nTGV2ZWxFbnVtO1xuXG4gIHRyYWNlKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElPcHRpb25zU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3B0aW9uc1NlcnZpY2U+KCdPcHRpb25zU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3B0aW9uc1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgcmF3IG9wdGlvbnMgb2JqZWN0LCB0aGlzIGlzIGFuIGludGVybmFsLW9ubHkgZmFzdCBwYXRoIGZvciBhY2Nlc3NpbmdcbiAgICogc2luZ2xlIG9wdGlvbnMgd2l0aG91dCBhbnkgdmFsaWRhdGlvbiBhcyB3ZSB0cnVzdCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgY29ycmVjdCB1c2FnZVxuICAgKiBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3T3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgYXMgZXhwb3NlZCB0aHJvdWdoIHRoZSBwdWJsaWMgQVBJLCB0aGlzIHByb3BlcnR5IHVzZXMgZ2V0dGVycyBhbmQgc2V0dGVycyB3aXRoXG4gICAqIHZhbGlkYXRpb24gd2hpY2ggbWFrZXMgaXQgc2FmZXIgYnV0IHNsb3dlci4ge0BsaW5rIHJhd09wdGlvbnN9IHNob3VsZCBiZSB1c2VkIGZvciBwcmV0dHkgbXVjaFxuICAgKiBhbGwgaW50ZXJuYWwgdXNhZ2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhbnkgb3B0aW9uIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBvbk9wdGlvbkNoYW5nZTogSUV2ZW50PGtleW9mIElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc3BlY2lmaWMgb3B0aW9uIGNoYW5nZXMsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBpc1xuICAgKiBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gb25seSBhIHNpbmdsZSBvcHRpb24gaXMgYmVpbmcgbGlzdGVuZWQgdG8uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uU3BlY2lmaWNPcHRpb25DaGFuZ2U8VCBleHRlbmRzIGtleW9mIElUZXJtaW5hbE9wdGlvbnM+KGtleTogVCwgbGlzdGVuZXI6IChhcmcxOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPltUXSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzZXQgb2Ygc3BlY2lmaWMgb3B0aW9ucyBjaGFuZ2UsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2RcbiAgICogdGhhdCBpcyBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gbXVsdGlwbGUgb3B0aW9ucyBhcmUgYmVpbmcgbGlzdGVuZWQgdG8gYW5kXG4gICAqIGhhbmRsZWQgdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvbk11bHRpcGxlT3B0aW9uQ2hhbmdlKGtleXM6IChrZXlvZiBJVGVybWluYWxPcHRpb25zKVtdLCBsaXN0ZW5lcjogKCkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCB0eXBlIEZvbnRXZWlnaHQgPSAnbm9ybWFsJyB8ICdib2xkJyB8ICcxMDAnIHwgJzIwMCcgfCAnMzAwJyB8ICc0MDAnIHwgJzUwMCcgfCAnNjAwJyB8ICc3MDAnIHwgJzgwMCcgfCAnOTAwJyB8IG51bWJlcjtcbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ3RyYWNlJyB8ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ29mZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRlcm1pbmFsT3B0aW9ucyB7XG4gIGFsbG93UHJvcG9zZWRBcGk/OiBib29sZWFuO1xuICBhbGxvd1RyYW5zcGFyZW5jeT86IGJvb2xlYW47XG4gIGFsdENsaWNrTW92ZXNDdXJzb3I/OiBib29sZWFuO1xuICBjb2xzPzogbnVtYmVyO1xuICBjb252ZXJ0RW9sPzogYm9vbGVhbjtcbiAgY3Vyc29yQmxpbms/OiBib29sZWFuO1xuICBjdXJzb3JTdHlsZT86IEN1cnNvclN0eWxlO1xuICBjdXJzb3JXaWR0aD86IG51bWJlcjtcbiAgY3Vyc29ySW5hY3RpdmVTdHlsZT86IEN1cnNvckluYWN0aXZlU3R5bGU7XG4gIGN1c3RvbUdseXBocz86IGJvb2xlYW47XG4gIGRpc2FibGVTdGRpbj86IGJvb2xlYW47XG4gIGRvY3VtZW50T3ZlcnJpZGU/OiBhbnkgfCBudWxsO1xuICBkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycz86IGJvb2xlYW47XG4gIGZhc3RTY3JvbGxNb2RpZmllcj86ICdub25lJyB8ICdhbHQnIHwgJ2N0cmwnIHwgJ3NoaWZ0JztcbiAgZmFzdFNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBmb250U2l6ZT86IG51bWJlcjtcbiAgZm9udEZhbWlseT86IHN0cmluZztcbiAgZm9udFdlaWdodD86IEZvbnRXZWlnaHQ7XG4gIGZvbnRXZWlnaHRCb2xkPzogRm9udFdlaWdodDtcbiAgaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlPzogYm9vbGVhbjtcbiAgbGV0dGVyU3BhY2luZz86IG51bWJlcjtcbiAgbGluZUhlaWdodD86IG51bWJlcjtcbiAgbGlua0hhbmRsZXI/OiBJTGlua0hhbmRsZXIgfCBudWxsO1xuICBsb2dMZXZlbD86IExvZ0xldmVsO1xuICBsb2dnZXI/OiBJTG9nZ2VyIHwgbnVsbDtcbiAgbWFjT3B0aW9uSXNNZXRhPzogYm9vbGVhbjtcbiAgbWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb24/OiBib29sZWFuO1xuICBtaW5pbXVtQ29udHJhc3RSYXRpbz86IG51bWJlcjtcbiAgcmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzPzogYm9vbGVhbjtcbiAgcmlnaHRDbGlja1NlbGVjdHNXb3JkPzogYm9vbGVhbjtcbiAgcm93cz86IG51bWJlcjtcbiAgc2NyZWVuUmVhZGVyTW9kZT86IGJvb2xlYW47XG4gIHNjcm9sbGJhY2s/OiBudW1iZXI7XG4gIHNjcm9sbE9uVXNlcklucHV0PzogYm9vbGVhbjtcbiAgc2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIHNtb290aFNjcm9sbER1cmF0aW9uPzogbnVtYmVyO1xuICB0YWJTdG9wV2lkdGg/OiBudW1iZXI7XG4gIHRoZW1lPzogSVRoZW1lO1xuICB3aW5kb3dzTW9kZT86IGJvb2xlYW47XG4gIHdpbmRvd3NQdHk/OiBJV2luZG93c1B0eTtcbiAgd2luZG93T3B0aW9ucz86IElXaW5kb3dPcHRpb25zO1xuICB3b3JkU2VwYXJhdG9yPzogc3RyaW5nO1xuICBvdmVydmlld1J1bGVyV2lkdGg/OiBudW1iZXI7XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBjYW5jZWxFdmVudHM6IGJvb2xlYW47XG4gIHRlcm1OYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRoZW1lIHtcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBjdXJzb3JBY2NlbnQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZD86IHN0cmluZztcbiAgYmxhY2s/OiBzdHJpbmc7XG4gIHJlZD86IHN0cmluZztcbiAgZ3JlZW4/OiBzdHJpbmc7XG4gIHllbGxvdz86IHN0cmluZztcbiAgYmx1ZT86IHN0cmluZztcbiAgbWFnZW50YT86IHN0cmluZztcbiAgY3lhbj86IHN0cmluZztcbiAgd2hpdGU/OiBzdHJpbmc7XG4gIGJyaWdodEJsYWNrPzogc3RyaW5nO1xuICBicmlnaHRSZWQ/OiBzdHJpbmc7XG4gIGJyaWdodEdyZWVuPzogc3RyaW5nO1xuICBicmlnaHRZZWxsb3c/OiBzdHJpbmc7XG4gIGJyaWdodEJsdWU/OiBzdHJpbmc7XG4gIGJyaWdodE1hZ2VudGE/OiBzdHJpbmc7XG4gIGJyaWdodEN5YW4/OiBzdHJpbmc7XG4gIGJyaWdodFdoaXRlPzogc3RyaW5nO1xuICBleHRlbmRlZEFuc2k/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IElPc2NMaW5rU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3NjTGlua1NlcnZpY2U+KCdPc2NMaW5rU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3NjTGlua1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxpbmsgdG8gdGhlIHNlcnZpY2UsIHJldHVybmluZyB0aGUgbGluayBJRC4gVGhlIGxpbmsgZGF0YSBpcyBtYW5hZ2VkIGJ5IHRoaXNcbiAgICogc2VydmljZSBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoaXMgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgdHJpbW1lZCBvZmYgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHJlZ2lzdGVyTGluayhsaW5rRGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyO1xuICAvKipcbiAgICogQWRkcyBhIGxpbmUgdG8gYSBsaW5rIGlmIG5lZWRlZC5cbiAgICovXG4gIGFkZExpbmVUb0xpbmsobGlua0lkOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XG4gIC8qKiBHZXQgdGhlIGxpbmsgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rIElELiAqL1xuICBnZXRMaW5rRGF0YShsaW5rSWQ6IG51bWJlcik6IElPc2NMaW5rRGF0YSB8IHVuZGVmaW5lZDtcbn1cblxuLypcbiAqIFdpZHRoIGFuZCBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrIHByb3BlcnRpZXMgb2YgYSBjaGFyYWN0ZXIgYXMgYSBiaXQgbWFzay5cbiAqXG4gKiBiaXQgMDogc2hvdWxkSm9pbiAtIHNob3VsZCBjb21iaW5lIHdpdGggcHJlY2VkaW5nIGNoYXJhY3Rlci5cbiAqIGJpdCAxLi4yOiB3Y3dpZHRoIC0gc2VlIFVuaWNvZGVDaGFyV2lkdGguXG4gKiBiaXQgMy4uMzE6IGNsYXNzIG9mIGNoYXJhY3RlciAoY3VycmVudGx5IG9ubHkgNCBiaXRzIGFyZSB1c2VkKS5cbiAqICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZWQgZ3JhcGhlbWUgY2x1c3RlcmluZyAtIGkuZS4gd2hpY2ggY29kZXBvaW50c1xuICogICBhcmUgdG8gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb21wb3VuZCBjaGFyYWN0ZXIuXG4gKlxuICogVXNlIHRoZSBVbmljb2RlU2VydmljZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlWYWx1ZSB0byBjcmVhdGUgYVxuICogVW5pY29kZUNoYXJQcm9wZXJ0aWVzOyB1c2UgZXh0cmFjdFNob3VsZEpvaW4sIGV4dHJhY3RXaWR0aCwgYW5kXG4gKiBleHRyYWN0Q2hhcktpbmQgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJQcm9wZXJ0aWVzID0gbnVtYmVyO1xuXG4vKipcbiAqIFdpZHRoIGluIGNvbHVtbnMgb2YgYSBjaGFyYWN0ZXIuXG4gKiBJbiBhIENKSyBjb250ZXh0LCBcImhhbGYtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIExhdGluKSBhcmUgd2lkdGggMSxcbiAqIHdoaWxlIFwiZnVsbC13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgS2FuamkpIGFyZSAyIGNvbHVtbnMgd2lkZS5cbiAqIENvbWJpbmluZyBjaGFyYWN0ZXJzIChzdWNoIGFzIGFjY2VudHMpIGFyZSB3aWR0aCAwLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhcldpZHRoID0gMCB8IDEgfCAyO1xuXG5leHBvcnQgY29uc3QgSVVuaWNvZGVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElVbmljb2RlU2VydmljZT4oJ1VuaWNvZGVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKiogUmVnaXN0ZXIgYW4gVW5pY29kZSB2ZXJzaW9uIHByb3ZpZGVyLiAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIpOiB2b2lkO1xuICAvKiogUmVnaXN0ZXJlZCBVbmljb2RlIHZlcnNpb25zLiAqL1xuICByZWFkb25seSB2ZXJzaW9uczogc3RyaW5nW107XG4gIC8qKiBDdXJyZW50bHkgYWN0aXZlIHZlcnNpb24uICovXG4gIGFjdGl2ZVZlcnNpb246IHN0cmluZztcbiAgLyoqIEV2ZW50IHRyaWdnZXJlZCwgd2hlbiBhY3RpdmF0ZSB2ZXJzaW9uIGNoYW5nZWQuICovXG4gIHJlYWRvbmx5IG9uQ2hhbmdlOiBJRXZlbnQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogVW5pY29kZSB2ZXJzaW9uIGRlcGVuZGVudFxuICAgKi9cbiAgd2N3aWR0aChjb2RlcG9pbnQ6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGdldFN0cmluZ0NlbGxXaWR0aChzOiBzdHJpbmcpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXR1cm4gY2hhcmFjdGVyIHdpZHRoIGFuZCB0eXBlIGZvciBncmFwaGVtZSBjbHVzdGVyaW5nLlxuICAgKiBJZiBwcmVjZWRpbmcgIT0gMCwgaXQgaXMgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHByZXZpb3VzIGNoYXJhY3RlcjtcbiAgICogaW4gdGhhdCBjYXNlIHRoZSByZXN1bHQgc3BlY2lmaWVzIGlmIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBqb2luZWQuXG4gICAqL1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIge1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHdjd2lkdGgodWNzOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBJRGVjb3JhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SURlY29yYXRpb25TZXJ2aWNlPignRGVjb3JhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSURlY29yYXRpb25TZXJ2aWNlIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZGVjb3JhdGlvbnM6IEl0ZXJhYmxlSXRlcmF0b3I8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlZ2lzdGVyZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVtb3ZlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xuICByZXNldCgpOiB2b2lkO1xuICAvKipcbiAgICogVHJpZ2dlciBhIGNhbGxiYWNrIG92ZXIgdGhlIGRlY29yYXRpb24gYXQgYSBjZWxsIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS4gVGhpcyB1c2VzIGEgY2FsbGJhY2tcbiAgICogaW5zdGVhZCBvZiBhbiBpdGVyYXRvciBhcyBpdCdzIHR5cGljYWxseSB1c2VkIGluIGhvdCBjb2RlIHBhdGhzLlxuICAgKi9cbiAgZm9yRWFjaERlY29yYXRpb25BdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyOiAnYm90dG9tJyB8ICd0b3AnIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pID0+IHZvaWQpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJuYWxEZWNvcmF0aW9uIGV4dGVuZHMgSURlY29yYXRpb24ge1xuICByZWFkb25seSBvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmb3JlZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25SZW5kZXJFbWl0dGVyOiBJRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50Pjtcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB0eXBlIHsgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgV2ViZ2xBZGRvbiBhcyBJV2ViZ2xBcGkgfSBmcm9tICdAeHRlcm0vYWRkb24td2ViZ2wnO1xuaW1wb3J0IHsgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDaGFyU2l6ZVNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgZm9yd2FyZEV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IGdldFNhZmFyaVZlcnNpb24sIGlzU2FmYXJpIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcbmltcG9ydCB7IElDb3JlU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElXZWJHTDJSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBXZWJnbFJlbmRlcmVyIH0gZnJvbSAnLi9XZWJnbFJlbmRlcmVyJztcbmltcG9ydCB7IHNldFRyYWNlTG9nZ2VyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0xvZ1NlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgV2ViZ2xBZGRvbiBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElXZWJnbEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsPzogVGVybWluYWw7XG4gIHByaXZhdGUgX3JlbmRlcmVyPzogV2ViZ2xSZW5kZXJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMuX29uQ2hhbmdlVGV4dHVyZUF0bGFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNvbnRleHRMb3NzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Db250ZXh0TG9zcyA9IHRoaXMuX29uQ29udGV4dExvc3MuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcHJlc2VydmVEcmF3aW5nQnVmZmVyPzogYm9vbGVhblxuICApIHtcbiAgICBpZiAoaXNTYWZhcmkgJiYgZ2V0U2FmYXJpVmVyc2lvbigpIDwgMTYpIHtcbiAgICAgIC8vIFBlcmZvcm0gYW4gZXh0cmEgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIFdlYmdsMiBpcyBtYW51YWxseSBlbmFibGVkIGluIGRldmVsb3BlciBzZXR0aW5nc1xuICAgICAgY29uc3QgY29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGFudGlhbGlhczogZmFsc2UsXG4gICAgICAgIGRlcHRoOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCd3ZWJnbDInLCBjb250ZXh0QXR0cmlidXRlcykgYXMgSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViZ2wyIGlzIG9ubHkgc3VwcG9ydGVkIG9uIFNhZmFyaSAxNiBhbmQgYWJvdmUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZSh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHtcbiAgICBjb25zdCBjb3JlID0gKHRlcm1pbmFsIGFzIGFueSkuX2NvcmUgYXMgSVRlcm1pbmFsO1xuICAgIGlmICghdGVybWluYWwuZWxlbWVudCkge1xuICAgICAgdGhpcy5yZWdpc3Rlcihjb3JlLm9uV2lsbE9wZW4oKCkgPT4gdGhpcy5hY3RpdmF0ZSh0ZXJtaW5hbCkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90ZXJtaW5hbCA9IHRlcm1pbmFsO1xuICAgIGNvbnN0IGNvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UgPSBjb3JlLmNvcmVTZXJ2aWNlO1xuICAgIGNvbnN0IG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UgPSBjb3JlLm9wdGlvbnNTZXJ2aWNlO1xuXG4gICAgY29uc3QgdW5zYWZlQ29yZSA9IGNvcmUgYXMgYW55O1xuICAgIGNvbnN0IHJlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlID0gdW5zYWZlQ29yZS5fcmVuZGVyU2VydmljZTtcbiAgICBjb25zdCBjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSA9IHVuc2FmZUNvcmUuX2NoYXJhY3RlckpvaW5lclNlcnZpY2U7XG4gICAgY29uc3QgY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlID0gdW5zYWZlQ29yZS5fY2hhclNpemVTZXJ2aWNlO1xuICAgIGNvbnN0IGNvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSA9IHVuc2FmZUNvcmUuX2NvcmVCcm93c2VyU2VydmljZTtcbiAgICBjb25zdCBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlID0gdW5zYWZlQ29yZS5fZGVjb3JhdGlvblNlcnZpY2U7XG4gICAgY29uc3QgbG9nU2VydmljZTogSUxvZ1NlcnZpY2UgPSB1bnNhZmVDb3JlLl9sb2dTZXJ2aWNlO1xuICAgIGNvbnN0IHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZSA9IHVuc2FmZUNvcmUuX3RoZW1lU2VydmljZTtcblxuICAgIC8vIFNldCB0cmFjZSBsb2dnZXIganVzdCBpbiBjYXNlIGl0IGhhc24ndCBiZWVuIHlldCB3aGljaCBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgYWRkb24gaXNcbiAgICAvLyBidW5kbGVkIHNlcGFyYXRlbHkgdG8gdGhlIGNvcmUgbW9kdWxlXG4gICAgc2V0VHJhY2VMb2dnZXIobG9nU2VydmljZSk7XG5cbiAgICB0aGlzLl9yZW5kZXJlciA9IHRoaXMucmVnaXN0ZXIobmV3IFdlYmdsUmVuZGVyZXIoXG4gICAgICB0ZXJtaW5hbCxcbiAgICAgIGNoYXJhY3RlckpvaW5lclNlcnZpY2UsXG4gICAgICBjaGFyU2l6ZVNlcnZpY2UsXG4gICAgICBjb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgICBjb3JlU2VydmljZSxcbiAgICAgIGRlY29yYXRpb25TZXJ2aWNlLFxuICAgICAgb3B0aW9uc1NlcnZpY2UsXG4gICAgICB0aGVtZVNlcnZpY2UsXG4gICAgICB0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9yZW5kZXJlci5vbkNvbnRleHRMb3NzLCB0aGlzLl9vbkNvbnRleHRMb3NzKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fcmVuZGVyZXIub25DaGFuZ2VUZXh0dXJlQXRsYXMsIHRoaXMuX29uQ2hhbmdlVGV4dHVyZUF0bGFzKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fcmVuZGVyZXIub25BZGRUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fcmVuZGVyZXIub25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzKSk7XG4gICAgcmVuZGVyU2VydmljZS5zZXRSZW5kZXJlcih0aGlzLl9yZW5kZXJlcik7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICBjb25zdCByZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9yZW5kZXJTZXJ2aWNlO1xuICAgICAgcmVuZGVyU2VydmljZS5zZXRSZW5kZXJlcigodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5fY3JlYXRlUmVuZGVyZXIoKSk7XG4gICAgICByZW5kZXJTZXJ2aWNlLmhhbmRsZVJlc2l6ZSh0ZXJtaW5hbC5jb2xzLCB0ZXJtaW5hbC5yb3dzKTtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRleHR1cmVBdGxhcygpOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyPy50ZXh0dXJlQXRsYXM7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXI/LmNsZWFyVGV4dHVyZUF0bGFzKCk7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCAoQykgMjAyNC0yMDI2IFNwZWVkb21ldGVyIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuLy8gYXJlIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChzZWUgcm9vdCBMSUNFTlNFIGZpbGUpLlxuLy9cbi8vIEdlbmVyYXRlIGRldGVybWluaXN0aWMgc2Vzc2lvbnMgZm9yIHRlcm1pbmFsIGVtdWxhdG9yIGJlbmNobWFya2luZ1xuXG5jb25zdCBBTlNJID0ge1xuICAgIHJlc2V0OiBcIlxceDFiWzBtXCIsXG4gICAgYm9sZDogXCJcXHgxYlsxbVwiLFxuICAgIGRpbTogXCJcXHgxYlsybVwiLFxuICAgIHJlZDogXCJcXHgxYlszMW1cIixcbiAgICBncmVlbjogXCJcXHgxYlszMm1cIixcbiAgICB5ZWxsb3c6IFwiXFx4MWJbMzNtXCIsXG4gICAgYmx1ZTogXCJcXHgxYlszNG1cIixcbiAgICBtYWdlbnRhOiBcIlxceDFiWzM1bVwiLFxuICAgIGN5YW46IFwiXFx4MWJbMzZtXCIsXG4gICAgd2hpdGU6IFwiXFx4MWJbMzdtXCIsXG4gICAgYmdSZWQ6IFwiXFx4MWJbNDFtXCIsXG4gICAgYmdHcmVlbjogXCJcXHgxYls0Mm1cIixcbiAgICBiZ0JsdWU6IFwiXFx4MWJbNDRtXCIsXG4gICAgY2xlYXJTY3JlZW46IFwiXFx4MWJbMkpcXHgxYltIXCIsXG4gICAgY3Vyc29ySG9tZTogXCJcXHgxYltIXCIsXG4gICAgaGlkZUN1cnNvcjogXCJcXHgxYls/MjVsXCIsXG4gICAgc2hvd0N1cnNvcjogXCJcXHgxYls/MjVoXCIsXG59O1xuXG4vLyAxLiBCdWlsZCBMb2cgU2Vzc2lvbjogR2VuZXJhdGVzIH4xNTAgY2h1bmtzICh+MTUwMCsgbGluZXMpIG9mIHZlcmJvc2UgY29tcGlsZXIgJiBidWlsZCBsb2dzXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVCdWlsZExvZ1Nlc3Npb24oKSB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgY29uc3QgY29tcG9uZW50cyA9IFtcIldlYkNvcmVcIiwgXCJKYXZhU2NyaXB0Q29yZVwiLCBcIldlYktpdDJcIiwgXCJXVEZcIiwgXCJQQUxcIiwgXCJBbmdsZVwiLCBcIlNraWFcIiwgXCJWOFwiLCBcIkJsaW5rXCIsIFwiUGxhdGZvcm1cIl07XG4gICAgY29uc3QgZmlsZXMgPSBbXCJOb2RlLmNwcFwiLCBcIkVsZW1lbnQuY3BwXCIsIFwiRG9jdW1lbnQuY3BwXCIsIFwiSlNMZXhlci5jcHBcIiwgXCJQYXJzZXIuY3BwXCIsIFwiUmVuZGVyQm94LmNwcFwiLCBcIkNTU1BhcnNlci5jcHBcIiwgXCJFdmVudExvb3AuY3BwXCIsIFwiRnJhbWVWaWV3LmNwcFwiLCBcIkRPTVdpbmRvdy5jcHBcIl07XG5cbiAgICBjaHVua3MucHVzaChgJHtBTlNJLmJvbGR9JHtBTlNJLmN5YW59PT0+IFN0YXJ0aW5nIGJ1aWxkIHN1aXRlIGNvbmZpZ3VyYXRpb24gKFNwZWVkb21ldGVyIFRlcm1pbmFsIEVtdWxhdG9yIFdvcmtsb2FkKS4uLiR7QU5TSS5yZXNldH1cXHJcXG5gKTtcbiAgICBjaHVua3MucHVzaChgJHtBTlNJLmdyZWVufeKclCBQcmUtYnVpbGQgY2hlY2tzIHBhc3NlZC4gRW52aXJvbm1lbnQ6IExpbnV4IHg4Nl82NCwgTm9kZSB2MjIuMC4wLCBDbGFuZyAxOC4wLjAke0FOU0kucmVzZXR9XFxyXFxuYCk7XG5cbiAgICBsZXQgdG90YWxQcm9ncmVzcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTUwOyBpKyspIHtcbiAgICAgICAgbGV0IGNodW5rID0gXCJcIjtcbiAgICAgICAgY29uc3QgY29tcCA9IGNvbXBvbmVudHNbaSAlIGNvbXBvbmVudHMubGVuZ3RoXTtcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2kgJSBmaWxlcy5sZW5ndGhdO1xuICAgICAgICB0b3RhbFByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLmZsb29yKChpIC8gMTUwKSAqIDEwMCkpO1xuXG4gICAgICAgIGNodW5rICs9IGAke0FOU0kuZGltfVske25ldyBEYXRlKDE3MjA0NDgwMDAwMDAgKyBpICogNTAwKS50b0lTT1N0cmluZygpfV0ke0FOU0kucmVzZXR9IFske0FOU0kuYm9sZH0ke3RvdGFsUHJvZ3Jlc3MudG9TdHJpbmcoKS5wYWRTdGFydCgzLCBcIiBcIil9JSR7QU5TSS5yZXNldH1dIEJ1aWxkaW5nIENYWCBvYmplY3QgU291cmNlLyR7Y29tcH0vQ01ha2VGaWxlcy8ke2NvbXB9LmRpci8ke2ZpbGV9Lm9cXHJcXG5gO1xuXG4gICAgICAgIGlmIChpICUgNyA9PT0gMCkge1xuICAgICAgICAgICAgY2h1bmsgKz0gYCR7QU5TSS5ib2xkfSR7QU5TSS55ZWxsb3d9d2FybmluZzoke0FOU0kucmVzZXR9IHVudXNlZCBwYXJhbWV0ZXIgJ2V4ZWNTdGF0ZScgWy1XdW51c2VkLXBhcmFtZXRlcl1cXHJcXG5gO1xuICAgICAgICAgICAgY2h1bmsgKz0gYCAgMTQyIHwgSlNWYWx1ZSAke2NvbXB9OjpldmFsdWF0ZShKU0dsb2JhbE9iamVjdCogJHtBTlNJLmJvbGR9JHtBTlNJLnllbGxvd31leGVjU3RhdGUke0FOU0kucmVzZXR9LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpXFxyXFxuYDtcbiAgICAgICAgICAgIGNodW5rICs9IGAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0FOU0kueWVsbG93fV5+fn5+fn5+fn4ke0FOU0kucmVzZXR9XFxyXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpICUgMTkgPT09IDApIHtcbiAgICAgICAgICAgIGNodW5rICs9IGAke0FOU0kuYm9sZH0ke0FOU0kuY3lhbn1pbmZvOiR7QU5TSS5yZXNldH0gdmVjdG9yaXphdGlvbiBlbmFibGVkIGZvciBsb29wIGluICR7ZmlsZX0gYXQgbGluZSAkezEwMCArIGl9XFxyXFxuYDtcbiAgICAgICAgICAgIGNodW5rICs9IGAgICR7QU5TSS5kaW19cmVtYXJrOiB2ZWN0b3JpemVkIDQgaW5zdHJ1Y3Rpb25zIGluIHVucm9sbGVkIGxvb3AgKC1ScGFzcz1sb29wLXZlY3Rvcml6ZSkke0FOU0kucmVzZXR9XFxyXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpICUgMzEgPT09IDApIHtcbiAgICAgICAgICAgIGNodW5rICs9IGAke0FOU0kuYm9sZH0ke0FOU0kubWFnZW50YX1bTElOS10ke0FOU0kucmVzZXR9IExpbmtpbmcgc2hhcmVkIGxpYnJhcnkgbGliJHtjb21wfS5zby4uLlxcclxcbmA7XG4gICAgICAgICAgICBjaHVuayArPSBgICAke0FOU0kuZ3JlZW594pyUIENyZWF0ZWQgbGliJHtjb21wfS5zbyAoNDguMiBNQikke0FOU0kucmVzZXR9XFxyXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpICUgNDUgPT09IDApIHtcbiAgICAgICAgICAgIGNodW5rICs9IGAke0FOU0kuYm9sZH0ke0FOU0kucmVkfWVycm9yIChpZ25vcmVkKToke0FOU0kucmVzZXR9IHRlbXBvcmFyeSBsb2NrIGNvbnRlbnRpb24gaW4gZGlzdHJpYnV0ZWQgY2FjaGUgZm9yICR7ZmlsZX1cXHJcXG5gO1xuICAgICAgICAgICAgY2h1bmsgKz0gXCIgIFJldHJ5aW5nIGJ1aWxkIHN0ZXAgMiBvZiAzLi4uXFxyXFxuXCI7XG4gICAgICAgICAgICBjaHVuayArPSBgICAke0FOU0kuZ3JlZW594pyUIFJldHJ5IHN1Y2Nlc3NmdWwhJHtBTlNJLnJlc2V0fVxcclxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgY2h1bmtzLnB1c2goYCR7QU5TSS5ib2xkfSR7QU5TSS5ncmVlbn09PT4gQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpbiA0Mi44cyEgVG90YWwgYXJ0aWZhY3RzOiAxLDQyMCB0YXJnZXRzLiR7QU5TSS5yZXNldH1cXHJcXG5gKTtcbiAgICByZXR1cm4gY2h1bmtzO1xufVxuXG4vLyAyLiBMaW5rcyBTZXNzaW9uOiBEdW1wcyBsb2dzIHNhdHVyYXRlZCB3aXRoIFVSTHMsIGZpbGUgcGF0aHMsIGFuZCBzdGFjayB0cmFjZXNcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUxpbmtzU2Vzc2lvbigpIHtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBjaHVua3MucHVzaChgJHtBTlNJLmJvbGR9JHtBTlNJLmJsdWV9PT09IFRlc3QgRXhlY3V0aW9uIFN1bW1hcnkgJiBBcnRpZmFjdCBMaW5rcyA9PT0ke0FOU0kucmVzZXR9XFxyXFxuYCk7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSA4MDsgaSsrKSB7XG4gICAgICAgIGxldCBjaHVuayA9IFwiXCI7XG4gICAgICAgIGNodW5rICs9IGBbVGVzdCBXb3JrZXIgIyR7KGkgJSA4KSArIDF9XSBSVU5OSU5HOiBodHRwczovL2dpdGh1Yi5jb20vV2ViS2l0L1NwZWVkb21ldGVyL2lzc3Vlcy8kezEwMDAgKyBpfVxcclxcbmA7XG4gICAgICAgIGNodW5rICs9IFwiICDihrMgUmVmZXJlbmNlIHNwZWM6IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNldmVudC1sb29wc1xcclxcblwiO1xuICAgICAgICBjaHVuayArPSBgICDihrMgTG9jYWwgZml4dHVyZTogZmlsZTovLy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2JydW5pL0RvY3VtZW50cy9TcGVlZG9tZXRlci9zdWl0ZXMvZWRpdG9ycy9jb2RlbWlycm9yLmh0bWw6JHsxMCArIGl9OiR7KGkgJSAyMCkgKyAxfVxcclxcbmA7XG4gICAgICAgIGNodW5rICs9IGAgIOKGsyBTdGFjayB0cmFjZTogYXQgT2JqZWN0LnJ1blRlc3QgKHNyYy9zcGVlZG9tZXRlci11dGlscy9iZW5jaG1hcmsubWpzOiR7NTAgKyBpfToxMilcXHJcXG5gO1xuICAgICAgICBjaHVuayArPSBcIiAg4oazIERvY3VtZW50YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MQ2FudmFzRWxlbWVudC9nZXRDb250ZXh0XFxyXFxuXCI7XG4gICAgICAgIGNodW5rICs9IGAgIOKGsyBOUE0gUmVnaXN0cnk6IGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B4dGVybS94dGVybS8tL3h0ZXJtLTUuNS4ke2kgJSAxMH0udGd6XFxyXFxuYDtcbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICByZXR1cm4gY2h1bmtzO1xufVxuXG4vLyBIZWxwZXIgdG8gZ2VuZXJhdGUgUkdCIFRydWVDb2xvciBBTlNJIGVzY2FwZSBzZXF1ZW5jZXNcbmZ1bmN0aW9uIHJnYkZnKHIsIGcsIGIsIHRleHQpIHtcbiAgICByZXR1cm4gYFxceDFiWzM4OzI7JHtyfTske2d9OyR7Yn1tJHt0ZXh0fSR7QU5TSS5yZXNldH1gO1xufVxuZnVuY3Rpb24gcmdiQmcociwgZywgYiwgdGV4dCkge1xuICAgIHJldHVybiBgXFx4MWJbNDg7Mjske3J9OyR7Z307JHtifW0ke3RleHR9JHtBTlNJLnJlc2V0fWA7XG59XG5cbi8vIDMuIG5jdXJzZXMgU2Vzc2lvbjogU2ltdWxhdGVzIDQgZHluYW1pYyBmcmFtZXMgb2YgYW4gaHRvcC90b3Agc3lzdGVtIG1vbml0b3JcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU5jdXJzZXNTZXNzaW9uKCkge1xuICAgIGNvbnN0IGZyYW1lcyA9IFtdO1xuICAgIGNvbnN0IHByb2NMaXN0ID0gW1xuICAgICAgICB7IHBpZDogMTQyMCwgdXNlcjogXCJjYnJ1bmlcIiwgcHJpOiAyMCwgbmk6IDAsIHZpcnQ6IFwiNDgyME1cIiwgcmVzOiBcIjMxMk1cIiwgc2hyOiBcIjg0TVwiLCBzOiBcIlJcIiwgY3B1OiA0NS4yLCBtZW06IDEuOSwgdGltZTogXCI0OjEyLjA4XCIsIGNtZDogXCIvdXNyL2Jpbi9nb29nbGUtY2hyb21lLXN0YWJsZSAtLXR5cGU9cmVuZGVyZXJcIiB9LFxuICAgICAgICB7IHBpZDogMTg0MiwgdXNlcjogXCJjYnJ1bmlcIiwgcHJpOiAyMCwgbmk6IDAsIHZpcnQ6IFwiODkyME1cIiwgcmVzOiBcIjEuMkdcIiwgc2hyOiBcIjEyME1cIiwgczogXCJTXCIsIGNwdTogMzIuOCwgbWVtOiA3LjQsIHRpbWU6IFwiMTg6NDUuMTJcIiwgY21kOiBcIm5vZGUgdGVzdHMvc2VydmVyLm1qcyAtLXBvcnQgODAwMFwiIH0sXG4gICAgICAgIHsgcGlkOiAyOTAxLCB1c2VyOiBcImNicnVuaVwiLCBwcmk6IDIwLCBuaTogMCwgdmlydDogXCIxNDIwTVwiLCByZXM6IFwiMTgwTVwiLCBzaHI6IFwiNjRNXCIsIHM6IFwiUlwiLCBjcHU6IDI4LjQsIG1lbTogMS4xLCB0aW1lOiBcIjE6MDIuNDVcIiwgY21kOiBcInZpdGUgYnVpbGQgLS13YXRjaFwiIH0sXG4gICAgICAgIHsgcGlkOiAzMTA1LCB1c2VyOiBcImNicnVuaVwiLCBwcmk6IDIwLCBuaTogMCwgdmlydDogXCI5ODBNXCIsIHJlczogXCI5Mk1cIiwgc2hyOiBcIjQ1TVwiLCBzOiBcIlNcIiwgY3B1OiAxNC4xLCBtZW06IDAuNiwgdGltZTogXCIwOjQ1LjkwXCIsIGNtZDogXCJweXRob24zIHNpZGVjYXIucHkgLS1kYWVtb25cIiB9LFxuICAgICAgICB7IHBpZDogNDAyLCB1c2VyOiBcInJvb3RcIiwgcHJpOiAyMCwgbmk6IDAsIHZpcnQ6IFwiMzEwTVwiLCByZXM6IFwiMjRNXCIsIHNocjogXCIxOE1cIiwgczogXCJTXCIsIGNwdTogNS4wLCBtZW06IDAuMiwgdGltZTogXCIxMjoxMC4wMVwiLCBjbWQ6IFwiL2xpYi9zeXN0ZW1kL3N5c3RlbWQtam91cm5hbGRcIiB9LFxuICAgICAgICB7IHBpZDogODgxLCB1c2VyOiBcInJvb3RcIiwgcHJpOiAtMjAsIG5pOiAtMjAsIHZpcnQ6IFwiMFwiLCByZXM6IFwiMFwiLCBzaHI6IFwiMFwiLCBzOiBcIklcIiwgY3B1OiAxLjIsIG1lbTogMC4wLCB0aW1lOiBcIjA6MDQuMTJcIiwgY21kOiBcIltrd29ya2VyL3UxNjoyLWV2ZW50c191bmJvdW5kXVwiIH0sXG4gICAgICAgIHsgcGlkOiA1MTIwLCB1c2VyOiBcImNicnVuaVwiLCBwcmk6IDIwLCBuaTogMCwgdmlydDogXCIyMTAwTVwiLCByZXM6IFwiNDEwTVwiLCBzaHI6IFwiOTVNXCIsIHM6IFwiU1wiLCBjcHU6IDAuOCwgbWVtOiAyLjUsIHRpbWU6IFwiMjoxNC41MFwiLCBjbWQ6IFwiY29kZSAvdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NicnVuaS9Eb2N1bWVudHMvU3BlZWRvbWV0ZXJcIiB9LFxuICAgICAgICB7IHBpZDogNjAxMiwgdXNlcjogXCJjYnJ1bmlcIiwgcHJpOiAyMCwgbmk6IDAsIHZpcnQ6IFwiNjUwTVwiLCByZXM6IFwiNDVNXCIsIHNocjogXCIyOE1cIiwgczogXCJTXCIsIGNwdTogMC40LCBtZW06IDAuMywgdGltZTogXCIwOjEyLjgwXCIsIGNtZDogXCJiYXNoIC1pXCIgfSxcbiAgICAgICAgeyBwaWQ6IDcxMDAsIHVzZXI6IFwiY2JydW5pXCIsIHByaTogMjAsIG5pOiAwLCB2aXJ0OiBcIjUyME1cIiwgcmVzOiBcIjM4TVwiLCBzaHI6IFwiMjJNXCIsIHM6IFwiU1wiLCBjcHU6IDAuMSwgbWVtOiAwLjIsIHRpbWU6IFwiMDowNS4xMFwiLCBjbWQ6IFwiZ2l0IHN0YXR1cyAtdWFsbFwiIH0sXG4gICAgICAgIHsgcGlkOiA4MTkyLCB1c2VyOiBcImNicnVuaVwiLCBwcmk6IDIwLCBuaTogMCwgdmlydDogXCIxMjBNXCIsIHJlczogXCI4TVwiLCBzaHI6IFwiNk1cIiwgczogXCJSXCIsIGNwdTogMC4wLCBtZW06IDAuMSwgdGltZTogXCIwOjAwLjA1XCIsIGNtZDogXCJwcyBhdXggLS1zb3J0PS1wY3B1XCIgfSxcbiAgICBdO1xuXG4gICAgZm9yIChsZXQgZnJhbWVJZHggPSAwOyBmcmFtZUlkeCA8IDQ7IGZyYW1lSWR4KyspIHtcbiAgICAgICAgbGV0IGZyYW1lID0gZnJhbWVJZHggPT09IDAgPyBBTlNJLmNsZWFyU2NyZWVuICsgQU5TSS5oaWRlQ3Vyc29yIDogQU5TSS5jdXJzb3JIb21lO1xuXG4gICAgICAgIC8vIEhlYWRlciAvIFVwdGltZSAvIExvYWQgQXZnXG4gICAgICAgIGNvbnN0IGxvYWQxID0gKDIuNDUgKyBNYXRoLnNpbihmcmFtZUlkeCAvIDUpICogMC41KS50b0ZpeGVkKDIpO1xuICAgICAgICBjb25zdCBsb2FkNSA9ICgyLjEgKyBNYXRoLmNvcyhmcmFtZUlkeCAvIDcpICogMC4zKS50b0ZpeGVkKDIpO1xuICAgICAgICBjb25zdCBsb2FkMTUgPSAoMS44NSArIE1hdGguc2luKGZyYW1lSWR4IC8gMTApICogMC4yKS50b0ZpeGVkKDIpO1xuICAgICAgICBmcmFtZSArPSBgJHtyZ2JGZygxMDAsIDIyMCwgMjU1LCBcImh0b3AgMy4zLjBcIil9IC0gJHtyZ2JGZygyMjAsIDIyMCwgMjIwLCBcIjE2OjE1OjI3IHVwIDE0IGRheXMsIDY6NDIsIDQgdXNlcnNcIil9LCBsb2FkIGF2ZXJhZ2U6ICR7cmdiRmcoMjU1LCAxMDAsIDEwMCwgbG9hZDEpfSwgJHtyZ2JGZygyNTUsIDE4MCwgMTAwLCBsb2FkNSl9LCAke3JnYkZnKDE4MCwgMjU1LCAxMDAsIGxvYWQxNSl9XFxyXFxuYDtcbiAgICAgICAgZnJhbWUgKz0gYFRhc2tzOiAke0FOU0kuYm9sZH0xNDIke0FOU0kucmVzZXR9LCAke0FOU0kuYm9sZH00MzAke0FOU0kucmVzZXR9IHRocjsgJHtyZ2JGZygxMDAsIDI1NSwgMTAwLCBcIjMgcnVubmluZ1wiKX0sIDQyNyBzbGVlcGluZywgMCBzdG9wcGVkLCAwIHpvbWJpZVxcclxcblxcclxcbmA7XG5cbiAgICAgICAgLy8gUmVuZGVyIDggQ1BVIENvcmVzIGluIDIgY29sdW1ucyAoNCByb3dzKVxuICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCA0OyByb3crKykge1xuICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgMjsgY29sKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3JlTnVtID0gcm93ICsgY29sICogNCArIDE7XG4gICAgICAgICAgICAgICAgLy8gVmFyeSBDUFUgcGVyY2VudGFnZSBwZXIgY29yZSBwZXIgZnJhbWVcbiAgICAgICAgICAgICAgICBjb25zdCBjcHVQY3QgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDIsIE1hdGguZmxvb3IoNDAgKyBNYXRoLnNpbihmcmFtZUlkeCAqIDAuMyArIGNvcmVOdW0pICogMzUgKyAoY29yZU51bSAlIDMpICogMTApKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFyV2lkdGggPSAyNTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxsZWRXaWR0aCA9IE1hdGguZmxvb3IoKGNwdVBjdCAvIDEwMCkgKiBiYXJXaWR0aCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYmFyU3RyID0gXCJbXCI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXJXaWR0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiIDwgZmlsbGVkV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyU3RyICs9IHJnYkZnKDgwLCAyNTAsIDEyMCwgXCJ8XCIpOyAvLyBncmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYiA8IDIwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhclN0ciArPSByZ2JGZygyNTUsIDIwMCwgNTAsIFwifFwiKTsgLy8geWVsbG93XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyU3RyICs9IHJnYkZnKDI1MCwgNzAsIDcwLCBcInxcIik7IC8vIHJlZFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyU3RyICs9IHJnYkZnKDYwLCA2MCwgNjAsIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiYXJTdHIgKz0gYF0gJHtyZ2JGZygyMjAsIDIyMCwgMjIwLCBgJHtjcHVQY3QudG9TdHJpbmcoKS5wYWRTdGFydCg1LCBcIiBcIil9JWApfWA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHJnYkZnKDEwMCwgMjIwLCAyNTUsIGBDUFUke2NvcmVOdW19YC5wYWRFbmQoNSwgXCIgXCIpKTtcbiAgICAgICAgICAgICAgICBmcmFtZSArPSBgJHtsYWJlbH0ke2JhclN0cn0gICBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJhbWUgKz0gXCJcXHJcXG5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lbW9yeSAmIFN3YXAgYmFyc1xuICAgICAgICBjb25zdCBtZW1QY3QgPSA0Mi41ICsgTWF0aC5zaW4oZnJhbWVJZHggKiAwLjEpICogMjtcbiAgICAgICAgY29uc3Qgc3dhcFBjdCA9IDEyLjA7XG4gICAgICAgIGNvbnN0IG1lbUJhcldpZHRoID0gNjM7XG4gICAgICAgIGNvbnN0IG1lbUZpbGxlZCA9IE1hdGguZmxvb3IoKG1lbVBjdCAvIDEwMCkgKiBtZW1CYXJXaWR0aCk7XG4gICAgICAgIGxldCBtZW1CYXIgPSBcIltcIjtcbiAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBtZW1CYXJXaWR0aDsgYisrKVxuICAgICAgICAgICAgbWVtQmFyICs9IGIgPCBtZW1GaWxsZWQgPyByZ2JGZyg4MCwgMjAwLCAyNTUsIFwifFwiKSA6IHJnYkZnKDYwLCA2MCwgNjAsIFwiIFwiKTtcblxuICAgICAgICBtZW1CYXIgKz0gYF0gJHtyZ2JGZygyMjAsIDIyMCwgMjIwLCBcIjEzLjZHLzMyLjBHXCIpfWA7XG4gICAgICAgIGZyYW1lICs9IGAke3JnYkZnKDEwMCwgMjIwLCAyNTUsIFwiTWVtICBcIil9JHttZW1CYXJ9XFxyXFxuYDtcblxuICAgICAgICBsZXQgc3dhcEJhciA9IFwiW1wiO1xuICAgICAgICBjb25zdCBzd2FwRmlsbGVkID0gTWF0aC5mbG9vcigoc3dhcFBjdCAvIDEwMCkgKiBtZW1CYXJXaWR0aCk7XG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgbWVtQmFyV2lkdGg7IGIrKylcbiAgICAgICAgICAgIHN3YXBCYXIgKz0gYiA8IHN3YXBGaWxsZWQgPyByZ2JGZygyNTUsIDEwMCwgMjAwLCBcInxcIikgOiByZ2JGZyg2MCwgNjAsIDYwLCBcIiBcIik7XG5cbiAgICAgICAgc3dhcEJhciArPSBgXSAke3JnYkZnKDIyMCwgMjIwLCAyMjAsIFwiMS45MkcvMTYuMEdcIil9YDtcbiAgICAgICAgZnJhbWUgKz0gYCR7cmdiRmcoMTAwLCAyMjAsIDI1NSwgXCJTd3AgIFwiKX0ke3N3YXBCYXJ9XFxyXFxuXFxyXFxuYDtcblxuICAgICAgICAvLyBUYWJsZSBIZWFkZXJcbiAgICAgICAgY29uc3QgaGVhZGVyVGV4dCA9IFwiICBQSUQgVVNFUiAgICAgIFBSSSAgTkkgIFZJUlQgICBSRVMgICBTSFIgUyAgQ1BVJSAgTUVNJSAgIFRJTUUrICBDb21tYW5kXCIucGFkRW5kKDgwLCBcIiBcIik7XG4gICAgICAgIGZyYW1lICs9IGAke3JnYkJnKDQwLCA5MCwgNjAsIHJnYkZnKDI1NSwgMjU1LCAyNTUsIEFOU0kuYm9sZCArIGhlYWRlclRleHQpKX1cXHJcXG5gO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgTGlzdCByb3dzXG4gICAgICAgIGZvciAobGV0IHBJZHggPSAwOyBwSWR4IDwgcHJvY0xpc3QubGVuZ3RoOyBwSWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2MgPSBwcm9jTGlzdFtwSWR4XTtcbiAgICAgICAgICAgIC8vIE11dGF0ZSBDUFUgc2xpZ2h0bHlcbiAgICAgICAgICAgIGxldCBjdXJDcHUgPSBwcm9jLmNwdTtcbiAgICAgICAgICAgIGlmIChwcm9jLnMgPT09IFwiUlwiKVxuICAgICAgICAgICAgICAgIGN1ckNwdSA9IE1hdGgubWF4KDAuMSwgKHByb2MuY3B1ICsgTWF0aC5zaW4oZnJhbWVJZHggKyBwSWR4KSAqIDUpLnRvRml4ZWQoMSkpO1xuXG4gICAgICAgICAgICBjb25zdCByb3dCZyA9IHBJZHggPT09IGZyYW1lSWR4ICUgcHJvY0xpc3QubGVuZ3RoID8gXCJcXHgxYls0ODsyOzYwOzgwOzEwMG1cIiA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBwaWRTdHIgPSByZ2JGZygyNTUsIDE4MCwgMTAwLCBwcm9jLnBpZC50b1N0cmluZygpLnBhZFN0YXJ0KDUsIFwiIFwiKSk7XG4gICAgICAgICAgICBjb25zdCB1c2VyU3RyID0gcmdiRmcoMTgwLCAyMjAsIDI1NSwgcHJvYy51c2VyLnBhZEVuZCg4LCBcIiBcIikpO1xuICAgICAgICAgICAgY29uc3QgcHJpU3RyID0gcHJvYy5wcmkudG9TdHJpbmcoKS5wYWRTdGFydCg0LCBcIiBcIik7XG4gICAgICAgICAgICBjb25zdCBuaVN0ciA9IHByb2MubmkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCBcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB2aXJ0U3RyID0gcHJvYy52aXJ0LnBhZFN0YXJ0KDYsIFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc1N0ciA9IHJnYkZnKDE1MCwgMjU1LCAxNTAsIHByb2MucmVzLnBhZFN0YXJ0KDUsIFwiIFwiKSk7XG4gICAgICAgICAgICBjb25zdCBzaHJTdHIgPSBwcm9jLnNoci5wYWRTdGFydCg1LCBcIiBcIik7XG4gICAgICAgICAgICBjb25zdCBzU3RyID0gcHJvYy5zID09PSBcIlJcIiA/IHJnYkZnKDgwLCAyNTAsIDEyMCwgcHJvYy5zKSA6IHByb2MucztcbiAgICAgICAgICAgIGNvbnN0IGNwdVN0ciA9IHByb2MucyA9PT0gXCJSXCIgPyByZ2JGZygyNTUsIDEwMCwgMTAwLCBjdXJDcHUudG9TdHJpbmcoKS5wYWRTdGFydCg1LCBcIiBcIikpIDogY3VyQ3B1LnRvU3RyaW5nKCkucGFkU3RhcnQoNSwgXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgbWVtU3RyID0gcHJvYy5tZW0udG9TdHJpbmcoKS5wYWRTdGFydCg1LCBcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB0aW1lU3RyID0gcHJvYy50aW1lLnBhZFN0YXJ0KDksIFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNtZFN0ciA9IHByb2MuY21kLnNsaWNlKDAsIDMyKS5wYWRFbmQoMzIsIFwiIFwiKTtcblxuICAgICAgICAgICAgZnJhbWUgKz0gYCR7cm93Qmd9JHtwaWRTdHJ9ICR7dXNlclN0cn0gJHtwcmlTdHJ9ICR7bmlTdHJ9ICR7dmlydFN0cn0gJHtyZXNTdHJ9ICR7c2hyU3RyfSAke3NTdHJ9ICR7Y3B1U3RyfSAke21lbVN0cn0gJHt0aW1lU3RyfSAgJHtjbWRTdHJ9JHtBTlNJLnJlc2V0fVxcclxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb290ZXIgbmF2aWdhdGlvbiBoZWxwXG4gICAgICAgIGZyYW1lICs9IGBcXHJcXG4ke3JnYkJnKDUwLCA1MCwgNTAsIHJnYkZnKDI1NSwgMjU1LCAyNTUsIFwiRjFcIikpfUhlbHAgICR7cmdiQmcoNTAsIDUwLCA1MCwgcmdiRmcoMjU1LCAyNTUsIDI1NSwgXCJGMlwiKSl9U2V0dXAgICR7cmdiQmcoNTAsIDUwLCA1MCwgcmdiRmcoMjU1LCAyNTUsIDI1NSwgXCJGM1wiKSl9U2VhcmNoICAke3JnYkJnKFxuICAgICAgICAgICAgNTAsXG4gICAgICAgICAgICA1MCxcbiAgICAgICAgICAgIDUwLFxuICAgICAgICAgICAgcmdiRmcoMjU1LCAyNTUsIDI1NSwgXCJGNFwiKVxuICAgICAgICApfUZpbHRlciAgJHtyZ2JCZyg1MCwgNTAsIDUwLCByZ2JGZygyNTUsIDI1NSwgMjU1LCBcIkY1XCIpKX1UcmVlICAke3JnYkJnKDUwLCA1MCwgNTAsIHJnYkZnKDI1NSwgMjU1LCAyNTUsIFwiRjZcIikpfVNvcnRCeSAgJHtyZ2JCZyg1MCwgNTAsIDUwLCByZ2JGZygyNTUsIDI1NSwgMjU1LCBcIkY3XCIpKX1OaWNlIC0gICR7cmdiQmcoNTAsIDUwLCA1MCwgcmdiRmcoMjU1LCAyNTUsIDI1NSwgXCJGOFwiKSl9TmljZSArICAke3JnYkJnKFxuICAgICAgICAgICAgNTAsXG4gICAgICAgICAgICA1MCxcbiAgICAgICAgICAgIDUwLFxuICAgICAgICAgICAgcmdiRmcoMjU1LCAyNTUsIDI1NSwgXCJGOVwiKVxuICAgICAgICApfUtpbGwgICR7cmdiQmcoNTAsIDUwLCA1MCwgcmdiRmcoMjU1LCAyNTUsIDI1NSwgXCJGMTBcIikpfVF1aXRgO1xuXG4gICAgICAgIGZyYW1lcy5wdXNoKGZyYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYW1lcztcbn1cbiIsIi8vIENvcHlyaWdodCAoQykgMjAyNC0yMDI2IFNwZWVkb21ldGVyIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuLy8gYXJlIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChzZWUgcm9vdCBMSUNFTlNFIGZpbGUpLlxuaW1wb3J0IFwiQHh0ZXJtL3h0ZXJtL2Nzcy94dGVybS5jc3NcIjtcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSBcIkB4dGVybS94dGVybVwiO1xuaW1wb3J0IHsgRml0QWRkb24gfSBmcm9tIFwiQHh0ZXJtL2FkZG9uLWZpdFwiO1xuaW1wb3J0IHsgV2ViTGlua3NBZGRvbiB9IGZyb20gXCJAeHRlcm0vYWRkb24td2ViLWxpbmtzXCI7XG5pbXBvcnQgeyBDYW52YXNBZGRvbiB9IGZyb20gXCJAeHRlcm0vYWRkb24tY2FudmFzXCI7XG5pbXBvcnQgeyBXZWJHTEFkZG9uIH0gZnJvbSBcIkB4dGVybS9hZGRvbi13ZWJnbFwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdWlsZExvZ1Nlc3Npb24sIGdlbmVyYXRlTGlua3NTZXNzaW9uLCBnZW5lcmF0ZU5jdXJzZXNTZXNzaW9uIH0gZnJvbSBcIi4vc2Vzc2lvbnMuanNcIjtcblxuLy8gVGVybWluYWwgaW5zdGFuY2VzIGFuZCBhZGRvbnMgc3RvcmFnZVxuY29uc3QgdGVybWluYWxzID0ge307XG5jb25zdCBmaXRBZGRvbnMgPSB7fTtcbmxldCBhY3RpdmVUYWJJZCA9IFwiYnVpbGRcIjtcbmxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbi8vIFByZS1nZW5lcmF0ZSBzZXNzaW9uIGRhdGEgZm9yIGRldGVybWluaXN0aWMgYmVuY2htYXJraW5nXG5jb25zdCBidWlsZExvZ0NodW5rcyA9IGdlbmVyYXRlQnVpbGRMb2dTZXNzaW9uKCk7XG5jb25zdCBsaW5rc0NodW5rcyA9IGdlbmVyYXRlTGlua3NTZXNzaW9uKCk7XG5jb25zdCBuY3Vyc2VzRnJhbWVzID0gZ2VuZXJhdGVOY3Vyc2VzU2Vzc2lvbigpO1xuXG4vLyBEZXRlcm1pbmUgcmVuZGVyZXIgYmFja2VuZCBmcm9tIFVSTCBxdWVyeSBwYXJhbSAoZGVmYXVsdDogY2FudmFzLCBmYWxsYmFjazogZG9tKVxuY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbmNvbnN0IHJlbmRlcmVyVHlwZSA9IChwYXJhbXMuZ2V0KFwicmVuZGVyZXJcIikgfHwgXCJjYW52YXNcIikudG9Mb3dlckNhc2UoKTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGFsbCA0IHRlcm1pbmFsIHBhbmVzIGFuZCBhdHRhY2ggYWRkb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0VGVybWluYWxzKCkge1xuICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICBjb25zdCB0YWJzID0gW1wiYnVpbGRcIiwgXCJsaW5rc1wiLCBcIm5jdXJzZXNcIiwgXCJnaXRcIl07XG4gICAgdGFicy5mb3JFYWNoKCh0YWJJZCkgPT4gaW5pdFRlcm1pbmFsRm9yVGFiKHRhYklkKSk7XG5cbiAgICAvLyBQb3B1bGF0ZSBHaXQgdGFiIHdpdGggc3RhdGljIHNhbXBsZSBvdXRwdXRcbiAgICBpZiAodGVybWluYWxzLmdpdCkge1xuICAgICAgICB3cml0ZUFuZEZsdXNoU3luYyh0ZXJtaW5hbHMuZ2l0LCBcIlxceDFiWzMzbU9uIGJyYW5jaCBtYWluXFx4MWJbMG1cXHJcXG5cIik7XG4gICAgICAgIHdyaXRlQW5kRmx1c2hTeW5jKHRlcm1pbmFscy5naXQsIFwiWW91ciBicmFuY2ggaXMgdXAgdG8gZGF0ZSB3aXRoICdvcmlnaW4vbWFpbicuXFxyXFxuXFxyXFxuXCIpO1xuICAgICAgICB3cml0ZUFuZEZsdXNoU3luYyh0ZXJtaW5hbHMuZ2l0LCBcIkNoYW5nZXMgbm90IHN0YWdlZCBmb3IgY29tbWl0OlxcclxcblwiKTtcbiAgICAgICAgd3JpdGVBbmRGbHVzaFN5bmModGVybWluYWxzLmdpdCwgJyAgKHVzZSBcImdpdCBhZGQgPGZpbGU+Li4uXCIgdG8gdXBkYXRlIHdoYXQgd2lsbCBiZSBjb21taXR0ZWQpXFxyXFxuJyk7XG4gICAgICAgIHdyaXRlQW5kRmx1c2hTeW5jKHRlcm1pbmFscy5naXQsICcgICh1c2UgXCJnaXQgcmVzdG9yZSA8ZmlsZT4uLi5cIiB0byBkaXNjYXJkIGNoYW5nZXMgaW4gd29ya2luZyBkaXJlY3RvcnkpXFxyXFxuJyk7XG4gICAgICAgIHdyaXRlQW5kRmx1c2hTeW5jKHRlcm1pbmFscy5naXQsIFwiXFx0XFx4MWJbMzFtbW9kaWZpZWQ6ICAgc3JjL2FwcC5qc1xceDFiWzBtXFxyXFxuXCIpO1xuICAgICAgICB3cml0ZUFuZEZsdXNoU3luYyh0ZXJtaW5hbHMuZ2l0LCBcIlxcdFxceDFiWzMxbW1vZGlmaWVkOiAgIHN0eWxlLmNzc1xceDFiWzBtXFxyXFxuXFxyXFxuXCIpO1xuICAgICAgICB3cml0ZUFuZEZsdXNoU3luYyh0ZXJtaW5hbHMuZ2l0LCBcIlVudHJhY2tlZCBmaWxlczpcXHJcXG5cIik7XG4gICAgICAgIHdyaXRlQW5kRmx1c2hTeW5jKHRlcm1pbmFscy5naXQsICcgICh1c2UgXCJnaXQgYWRkIDxmaWxlPi4uLlwiIHRvIGluY2x1ZGUgaW4gd2hhdCB3aWxsIGJlIGNvbW1pdHRlZClcXHJcXG4nKTtcbiAgICAgICAgd3JpdGVBbmRGbHVzaFN5bmModGVybWluYWxzLmdpdCwgXCJcXHRcXHgxYlszMW1zZXNzaW9ucy5qc1xceDFiWzBtXFxyXFxuXFxyXFxuXCIpO1xuICAgICAgICB3cml0ZUFuZEZsdXNoU3luYyh0ZXJtaW5hbHMuZ2l0LCAnbm8gY2hhbmdlcyBhZGRlZCB0byBjb21taXQgKHVzZSBcImdpdCBhZGRcIiBhbmQvb3IgXCJnaXQgY29tbWl0IC1hXCIpXFxyXFxuJyk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBpbml0aWFsIGNvbnRlbnQgaW4gYWxsIHRlcm1pbmFscyBzbyBmb250IGxvYWRpbmcsIGdseXBoIHRleHR1cmUgYXRsYXNcbiAgICAvLyBnZW5lcmF0aW9uLCBhbmQgY2FudmFzIHJlbmRlcmVyIHdhcm11cCBhcmUgY292ZXJlZCBpbiB0aGUgc2V0dXAgcGhhc2UuXG4gICAgaWYgKHRlcm1pbmFscy5idWlsZCAmJiBidWlsZExvZ0NodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdyaXRlU3luYyh0ZXJtaW5hbHMuYnVpbGQsIFwiXFx4MWJbMzZt4pqhIFNwZWVkb21ldGVyIFRlcm1pbmFsIEVtdWxhdG9yIFN1aXRlIC0gSW5pdGlhbGl6aW5nIEJ1aWxkIEVudmlyb25tZW50Li4uXFx4MWJbMG1cXHJcXG5cXHJcXG5cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oMTAsIGJ1aWxkTG9nQ2h1bmtzLmxlbmd0aCk7IGkrKykgd3JpdGVTeW5jKHRlcm1pbmFscy5idWlsZCwgYnVpbGRMb2dDaHVua3NbaV0pO1xuICAgIH1cbiAgICBpZiAodGVybWluYWxzLmxpbmtzICYmIGxpbmtzQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd3JpdGVTeW5jKHRlcm1pbmFscy5saW5rcywgXCJcXHgxYlszNm3wn5SXIFNwZWVkb21ldGVyIFdlYiBMaW5rcyAmIFRyYWNlcyAtIEluaXRpYWxpemluZyBMaW5rIEVudmlyb25tZW50Li4uXFx4MWJbMG1cXHJcXG5cXHJcXG5cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oMTAsIGxpbmtzQ2h1bmtzLmxlbmd0aCk7IGkrKykgd3JpdGVTeW5jKHRlcm1pbmFscy5saW5rcywgbGlua3NDaHVua3NbaV0pO1xuICAgIH1cbiAgICBpZiAodGVybWluYWxzLm5jdXJzZXMgJiYgbmN1cnNlc0ZyYW1lcy5sZW5ndGggPiAwKSB3cml0ZVN5bmModGVybWluYWxzLm5jdXJzZXMsIG5jdXJzZXNGcmFtZXNbMF0pO1xuXG4gICAgLy8gU3luY2hyb25vdXNseSB1bnBhdXNlIGFuZCBmbHVzaCBhbGwgdGVybWluYWxzIGR1cmluZyBzZXR1cCBzbyB0ZXh0dXJlIGF0bGFzZXNcbiAgICAvLyBhbmQgcmVuZGVyZXIgYmFja2VuZHMgYXJlIDEwMCUgd2FybWVkIHVwIGJlZm9yZSBiZW5jaG1hcmsgc3RlcCBtZWFzdXJlbWVudCBiZWdpbnMuXG4gICAgT2JqZWN0LnZhbHVlcyh0ZXJtaW5hbHMpLmZvckVhY2goKHRlcm0pID0+IHtcbiAgICAgICAgaWYgKHRlcm0uX2NvcmUgJiYgdGVybS5fY29yZS5fcmVuZGVyU2VydmljZSkge1xuICAgICAgICAgICAgY29uc3QgcnMgPSB0ZXJtLl9jb3JlLl9yZW5kZXJTZXJ2aWNlO1xuICAgICAgICAgICAgaWYgKHJzLl9pc1BhdXNlZCkge1xuICAgICAgICAgICAgICAgIHJzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChycy5fY2hhclNpemVTZXJ2aWNlICYmICFycy5fY2hhclNpemVTZXJ2aWNlLmhhc1ZhbGlkU2l6ZSkgcnMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocnMuX25lZWRzRnVsbFJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzLl9wYXVzZWRSZXNpemVUYXNrICYmIHR5cGVvZiBycy5fcGF1c2VkUmVzaXplVGFzay5mbHVzaCA9PT0gXCJmdW5jdGlvblwiKSBycy5fcGF1c2VkUmVzaXplVGFzay5mbHVzaCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJzLnJlZnJlc2hSb3dzKDAsIHJzLl9yb3dDb3VudCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBycy5fbmVlZHNGdWxsUmVmcmVzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbHVzaFN5bmModGVybSk7XG4gICAgfSk7XG5cbiAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBzd2l0Y2hUYWIoXCJidWlsZFwiKTtcbn1cblxuZnVuY3Rpb24gaW5pdFRlcm1pbmFsRm9yVGFiKHRhYklkKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHBhbmUtJHt0YWJJZH1gKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgY29uc3QgdGVybSA9IG5ldyBUZXJtaW5hbCh7XG4gICAgICAgIHRoZW1lOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcIiMxZTFlMWVcIixcbiAgICAgICAgICAgIGZvcmVncm91bmQ6IFwiI2Q0ZDRkNFwiLFxuICAgICAgICAgICAgY3Vyc29yOiBcIiMwMDdhY2NcIixcbiAgICAgICAgICAgIHNlbGVjdGlvbkJhY2tncm91bmQ6IFwiIzI2NGY3OFwiLFxuICAgICAgICAgICAgYmxhY2s6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgICAgcmVkOiBcIiNjZDMxMzFcIixcbiAgICAgICAgICAgIGdyZWVuOiBcIiMwZGJjNzlcIixcbiAgICAgICAgICAgIHllbGxvdzogXCIjZTVlNTEwXCIsXG4gICAgICAgICAgICBibHVlOiBcIiMyNDcyYzhcIixcbiAgICAgICAgICAgIG1hZ2VudGE6IFwiI2JjM2ZiY1wiLFxuICAgICAgICAgICAgY3lhbjogXCIjMTFhOGNkXCIsXG4gICAgICAgICAgICB3aGl0ZTogXCIjZTVlNWU1XCIsXG4gICAgICAgICAgICBicmlnaHRCbGFjazogXCIjNjY2NjY2XCIsXG4gICAgICAgICAgICBicmlnaHRSZWQ6IFwiI2YxNGM0Y1wiLFxuICAgICAgICAgICAgYnJpZ2h0R3JlZW46IFwiIzIzZDE4YlwiLFxuICAgICAgICAgICAgYnJpZ2h0WWVsbG93OiBcIiNmNWY1NDNcIixcbiAgICAgICAgICAgIGJyaWdodEJsdWU6IFwiIzNiOGVlYVwiLFxuICAgICAgICAgICAgYnJpZ2h0TWFnZW50YTogXCIjZDY3MGQ2XCIsXG4gICAgICAgICAgICBicmlnaHRDeWFuOiBcIiMyOWI4ZGJcIixcbiAgICAgICAgICAgIGJyaWdodFdoaXRlOiBcIiNlNWU1ZTVcIixcbiAgICAgICAgfSxcbiAgICAgICAgZm9udEZhbWlseTogJ01lbmxvLCBNb25hY28sIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlJyxcbiAgICAgICAgZm9udFNpemU6IDEzLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLjIsXG4gICAgICAgIHNjcm9sbGJhY2s6IDUwMDAsXG4gICAgICAgIGN1cnNvckJsaW5rOiBmYWxzZSwgLy8gVHVybiBvZmYgYmxpbmtpbmcgZm9yIGRldGVybWluaXN0aWMgcmVuZGVyaW5nXG4gICAgICAgIGFsbG93VHJhbnNwYXJlbmN5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpdEFkZG9uID0gbmV3IEZpdEFkZG9uKCk7XG4gICAgY29uc3Qgd2ViTGlua3NBZGRvbiA9IG5ldyBXZWJMaW5rc0FkZG9uKCk7XG5cbiAgICB0ZXJtLmxvYWRBZGRvbihmaXRBZGRvbik7XG4gICAgdGVybS5sb2FkQWRkb24od2ViTGlua3NBZGRvbik7XG5cbiAgICAvLyBMb2FkIHBlcmZvcm1hbmNlIHJlbmRlcmluZyBiYWNrZW5kXG4gICAgaWYgKHJlbmRlcmVyVHlwZSA9PT0gXCJ3ZWJnbFwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3ZWJnbEFkZG9uID0gbmV3IFdlYkdMQWRkb24oKTtcbiAgICAgICAgICAgIHRlcm0ubG9hZEFkZG9uKHdlYmdsQWRkb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXZWJHTCByZW5kZXJlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZSwgZmFsbGluZyBiYWNrIHRvIENhbnZhcy9ET006XCIsIGUpO1xuICAgICAgICAgICAgdHJ5TG9hZENhbnZhcyh0ZXJtKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVuZGVyZXJUeXBlID09PSBcImNhbnZhc1wiKSB7XG4gICAgICAgIHRyeUxvYWRDYW52YXModGVybSk7XG4gICAgfVxuXG4gICAgdGVybS5vcGVuKGNvbnRhaW5lcik7XG4gICAgZml0QWRkb24uZml0KCk7XG5cbiAgICB0ZXJtaW5hbHNbdGFiSWRdID0gdGVybTtcbiAgICBmaXRBZGRvbnNbdGFiSWRdID0gZml0QWRkb247XG59XG5cbmZ1bmN0aW9uIHRyeUxvYWRDYW52YXModGVybSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbnZhc0FkZG9uID0gbmV3IENhbnZhc0FkZG9uKCk7XG4gICAgICAgIHRlcm0ubG9hZEFkZG9uKGNhbnZhc0FkZG9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkNhbnZhcyByZW5kZXJlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZSwgdXNpbmcgZGVmYXVsdCBET00gcmVuZGVyZXI6XCIsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGZsdXNoIGFueSBwZW5kaW5nIGRlYm91bmNlZCByZW5kZXIgcGFzc2VzIG9yIGFuaW1hdGlvbiBmcmFtZXMgb25cbiAqIHRoZSB0ZXJtaW5hbCdzIHJlbmRlciBkZWJvdW5jZXIsIHZpZXdwb3J0IHNjcm9sbGJhciwgYW5kIHNlbGVjdGlvbiBvdmVybGF5cyxcbiAqIGZvcmNpbmcgZGlydHkgcm93cyBhbmQgRE9NIGVsZW1lbnRzIHRvIHVwZGF0ZSBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoU3luYyh0ZXJtKSB7XG4gICAgaWYgKCF0ZXJtIHx8ICF0ZXJtLl9jb3JlKSByZXR1cm47XG5cbiAgICAvLyAxLiBGbHVzaCB0ZXJtaW5hbCBncmlkIHJlbmRlcmVyIChSZW5kZXJTZXJ2aWNlIC8gUmVuZGVyRGVib3VuY2VyKVxuICAgIGlmICh0ZXJtLl9jb3JlLl9yZW5kZXJTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlciA9IHRlcm0uX2NvcmUuX3JlbmRlclNlcnZpY2UuX3JlbmRlckRlYm91bmNlcjtcbiAgICAgICAgaWYgKGRlYm91bmNlciAmJiB0eXBlb2YgZGVib3VuY2VyLl9pbm5lclJlZnJlc2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaWYgKGRlYm91bmNlci5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoZGVib3VuY2VyLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICAgICAgICAgICAgZGVib3VuY2VyLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYm91bmNlci5faW5uZXJSZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBGbHVzaCB2aWV3cG9ydCBzY3JvbGxiYXIgc3luY2hyb25pemF0aW9uIChWaWV3cG9ydClcbiAgICBpZiAodGVybS5fY29yZS52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCB2cCA9IHRlcm0uX2NvcmUudmlld3BvcnQ7XG4gICAgICAgIGlmICh2cC5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodnAuX3JlZnJlc2hBbmltYXRpb25GcmFtZSk7XG4gICAgICAgICAgICB2cC5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdnAuX2lubmVyUmVmcmVzaCA9PT0gXCJmdW5jdGlvblwiKSB2cC5faW5uZXJSZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLy8gMy4gRmx1c2ggc2VsZWN0aW9uIG92ZXJsYXlzIChTZWxlY3Rpb25TZXJ2aWNlKVxuICAgIGlmICh0ZXJtLl9jb3JlLl9zZWxlY3Rpb25TZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IHRlcm0uX2NvcmUuX3NlbGVjdGlvblNlcnZpY2U7XG4gICAgICAgIGlmIChzZWwuX3JlZnJlc2hBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHNlbC5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lKTtcbiAgICAgICAgICAgIHNlbC5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsLl9yZWZyZXNoID09PSBcImZ1bmN0aW9uXCIpIHNlbC5fcmVmcmVzaCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IHdyaXRlIGRhdGEgdG8gdGhlIHRlcm1pbmFsIGJ1ZmZlciB3aXRob3V0IG1hY3JvLXRhc2sgdGltZXIgZGVsYXlzXG4gKiBvciAxMm1zIGNodW5raW5nLCB1cGRhdGluZyBncmlkIGNlbGxzIHdpdGhvdXQgdHJpZ2dlcmluZyBpbnRlcm1lZGlhdGUgY2FudmFzIHJlZHJhd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVN5bmModGVybSwgZGF0YSkge1xuICAgIGlmICghdGVybSkgcmV0dXJuO1xuICAgIGlmICh0ZXJtLl9jb3JlICYmIHRlcm0uX2NvcmUuX3dyaXRlQnVmZmVyICYmIHR5cGVvZiB0ZXJtLl9jb3JlLl93cml0ZUJ1ZmZlci53cml0ZVN5bmMgPT09IFwiZnVuY3Rpb25cIikgdGVybS5fY29yZS5fd3JpdGVCdWZmZXIud3JpdGVTeW5jKGRhdGEpO1xuICAgIGVsc2UgdGVybS53cml0ZShkYXRhKTtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IHdyaXRlIGRhdGEgdG8gdGhlIHRlcm1pbmFsIGJ1ZmZlciBhbmQgaW1tZWRpYXRlbHkgZmx1c2ggYWxsIHJlbmRlcmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQW5kRmx1c2hTeW5jKHRlcm0sIGRhdGEpIHtcbiAgICB3cml0ZVN5bmModGVybSwgZGF0YSk7XG4gICAgZmx1c2hTeW5jKHRlcm0pO1xufVxuXG4vKipcbiAqIFN3aXRjaCBhY3RpdmUgdGFiIGFuZCByZXNpemUgdGVybWluYWwgdmlld3BvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN3aXRjaFRhYih0YWJJZCkge1xuICAgIGlmICghdGVybWluYWxzW3RhYklkXSkgcmV0dXJuO1xuXG4gICAgYWN0aXZlVGFiSWQgPSB0YWJJZDtcblxuICAgIC8vIFVwZGF0ZSB0YWIgaGVhZGVyIFVJXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50YWJcIikuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKFwiYWN0aXZlXCIsIGJ0bi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRhYlwiKSA9PT0gdGFiSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRlcm1pbmFsIHBhbmUgdmlzaWJpbGl0eVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGVybWluYWwtcGFuZVwiKS5mb3JFYWNoKChwYW5lKSA9PiB7XG4gICAgICAgIHBhbmUuY2xhc3NMaXN0LnRvZ2dsZShcImFjdGl2ZVwiLCBwYW5lLmlkID09PSBgcGFuZS0ke3RhYklkfWApO1xuICAgIH0pO1xuXG4gICAgLy8gUmVmbG93IGFuZCBmaXQgdGVybWluYWwgdG8gY29udGFpbmVyXG4gICAgZml0QWRkb25zW3RhYklkXS5maXQoKTtcblxuICAgIGNvbnN0IHRlcm0gPSB0ZXJtaW5hbHNbdGFiSWRdO1xuICAgIHRlcm0uZm9jdXMoKTtcblxuICAgIC8vIEltbWVkaWF0ZWx5IHVucGF1c2UgcmVuZGVyIHNlcnZpY2UgYW5kIGZvcmNlIHBlbmRpbmcgbGF5b3V0L3Jlc2l6ZSB0YXNrc1xuICAgIC8vIHNvIHRoYXQgdGVybWluYWwgb3BlcmF0aW9ucyByZW5kZXIgc3luY2hyb25vdXNseSBkdXJpbmcgLVN5bmMgaW5zdGVhZCBvZlxuICAgIC8vIHdhaXRpbmcgZm9yIGFzeW5jaHJvbm91cyBJbnRlcnNlY3Rpb25PYnNlcnZlciBjYWxsYmFja3MgaW4gLUFzeW5jIVxuICAgIGlmICh0ZXJtLl9jb3JlICYmIHRlcm0uX2NvcmUuX3JlbmRlclNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgcnMgPSB0ZXJtLl9jb3JlLl9yZW5kZXJTZXJ2aWNlO1xuICAgICAgICBpZiAocnMuX2lzUGF1c2VkKSB7XG4gICAgICAgICAgICBycy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChycy5fY2hhclNpemVTZXJ2aWNlICYmICFycy5fY2hhclNpemVTZXJ2aWNlLmhhc1ZhbGlkU2l6ZSkgcnMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG5cbiAgICAgICAgICAgIGlmIChycy5fbmVlZHNGdWxsUmVmcmVzaCkge1xuICAgICAgICAgICAgICAgIGlmIChycy5fcGF1c2VkUmVzaXplVGFzayAmJiB0eXBlb2YgcnMuX3BhdXNlZFJlc2l6ZVRhc2suZmx1c2ggPT09IFwiZnVuY3Rpb25cIikgcnMuX3BhdXNlZFJlc2l6ZVRhc2suZmx1c2goKTtcblxuICAgICAgICAgICAgICAgIHJzLnJlZnJlc2hSb3dzKDAsIHJzLl9yb3dDb3VudCAtIDEpO1xuICAgICAgICAgICAgICAgIHJzLl9uZWVkc0Z1bGxSZWZyZXNoID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2hTeW5jKHRlcm0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5pc2hTdGVwKCkge1xuICAgIC8vIDEuIEdpdmUgeHRlcm0gYW5kIGFkZG9ucyBpbml0aWFsIG1pY3JvdGFzayB0aWNrcyB0byBhbGxvdyBhbnkgcGVuZGluZ1xuICAgIC8vIERPTSBvYnNlcnZlciBjYWxsYmFja3Mgb3IgZXZlbnQgbGlzdGVuZXJzIHRvIHB1c2ggdGhlaXIgcmVuZGVyaW5nIHRpbWVycy5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgLy8gMi4gTG9vcCB1bnRpbCBhbGwgc2NoZWR1bGVkIHh0ZXJtIHJlbmRlcmluZyBwYXNzZXMsIHRleHR1cmUgYXRsYXMgd2FybXVwcyxcbiAgICAvLyBtYWNyby10YXNrIHRpbWVycyAoc2V0VGltZW91dC9yQUYvcklDKSwgRE9NIG9ic2VydmVycywgYW5kXG4gICAgLy8gYXN5bmNocm9ub3VzIEdQVSB0ZXh0dXJlIGJpdG1hcHMgKGNyZWF0ZUltYWdlQml0bWFwKSBoYXZlIGNvbXBsZXRlbHkgZHJhaW5lZC5cbiAgICBsZXQgZHJhaW5MaW1pdCA9IDMwMDtcbiAgICB3aGlsZSAoKHdpbmRvdy5fX2FjdGl2ZVRpbWVycy5zaXplID4gMCB8fCB3aW5kb3cuX19hY3RpdmVCaXRtYXBzLnNpemUgPiAwIHx8ICh3aW5kb3cuX19hY3RpdmVPYnNlcnZlcnMgJiYgd2luZG93Ll9fYWN0aXZlT2JzZXJ2ZXJzLnNpemUgPiAwKSkgJiYgZHJhaW5MaW1pdC0tID4gMCkge1xuICAgICAgICBpZiAod2luZG93Ll9fYWN0aXZlQml0bWFwcy5zaXplID4gMCkgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh3aW5kb3cuX19hY3RpdmVCaXRtYXBzKSk7XG5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0ZXJtaW5hbHMpLmZvckVhY2goKHRlcm0pID0+IGZsdXNoU3luYyh0ZXJtKSk7XG4gICAgICAgIC8vIFlpZWxkIHRvIHRoZSBicm93c2VyJ3MgTWFjcm8tVGFzayBRdWV1ZSBzbyBwZW5kaW5nIHNldFRpbWVvdXQoMCksXG4gICAgICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSwgYW5kIHJlcXVlc3RJZGxlQ2FsbGJhY2sgY2FsbGJhY2tzIGFjdHVhbGx5IGV4ZWN1dGUhXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICB9XG5cbiAgICAvLyAzLiBGaW5hbCBkZWZlbnNpdmUgc2V0dGxpbmcgcGhhc2U6IGF3YWl0IGFkZGl0aW9uYWwgbWljcm90YXNrIHRpY2tzIHRvIGVuc3VyZVxuICAgIC8vIHplcm8gZGVmZXJyZWQgcmVuZGVyaW5nIHdvcmsgc3BpbGxzIG92ZXIgaW50byBzdWJzZXF1ZW50IHN0ZXBzIG9yIGFzeW5jIG1lYXN1cmVtZW50LlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAvLyA0LiBTeW5jaHJvbm91c2x5IGZsdXNoIGFsbCB0ZXJtaW5hbCByZW5kZXJlcnMsIHZpZXdwb3J0cywgYW5kIHNlbGVjdGlvbiBvdmVybGF5c1xuICAgIC8vIHJpZ2h0IGJlZm9yZSBzdGVwIGNvbXBsZXRpb24gc28gemVybyBhbmltYXRpb24gZnJhbWVzIHNwaWxsIG92ZXIgaW50byAtYXN5bmMuXG4gICAgT2JqZWN0LnZhbHVlcyh0ZXJtaW5hbHMpLmZvckVhY2goKHRlcm0pID0+IGZsdXNoU3luYyh0ZXJtKSk7XG5cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJzdGVwLWNvbXBsZXRlXCIpKTtcbn1cblxuLyoqXG4gKiBCZW5jaG1hcmsgU3RlcCAxOiBEdW1wICYgU2Nyb2xsIE91dHB1dFxuICogRHVtcHMgfjEsNTAwIGxpbmVzIG9mIHZlcmJvc2UgYnVpbGQgbG9ncywgdHJpZ2dlcnMgbGluZSB3cmFwcGluZywgYW5kIHNjcm9sbHMgdGhyb3VnaCBidWZmZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGR1bXBBbmRTY3JvbGwoKSB7XG4gICAgc3dpdGNoVGFiKFwiYnVpbGRcIik7XG4gICAgY29uc3QgdGVybSA9IHRlcm1pbmFscy5idWlsZDtcbiAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgYXdhaXQgZmluaXNoU3RlcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGVybS5jbGVhcigpO1xuXG4gICAgLy8gV3JpdGUgfjUwJSBvZiBidWlsZCBsb2cgY2h1bmtzIHRvIHRhcmdldCB+NTBtcyB3b3JrbG9hZCBjb21wbGV4aXR5XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbig3NSwgYnVpbGRMb2dDaHVua3MubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHdyaXRlU3luYyh0ZXJtLCBidWlsZExvZ0NodW5rc1tpXSk7XG5cbiAgICBmbHVzaFN5bmModGVybSk7XG5cbiAgICAvLyBGb3JjZSB2aWV3cG9ydCBzY3JvbGwgbWFuaXB1bGF0aW9ucyBhbmQgdGV4dCBzZWxlY3Rpb25cbiAgICB0ZXJtLnNjcm9sbFRvVG9wKCk7XG4gICAgZmx1c2hTeW5jKHRlcm0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICB0ZXJtLnNjcm9sbExpbmVzKDUwKTtcbiAgICAgICAgZmx1c2hTeW5jKHRlcm0pO1xuICAgIH1cbiAgICB0ZXJtLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgZmx1c2hTeW5jKHRlcm0pO1xuXG4gICAgLy8gU2ltdWxhdGUgdXNlciBzZWxlY3RpbmcgYSBibG9jayBvZiBsb2dzXG4gICAgdGVybS5zZWxlY3QoMCwgMTAsIDgwKTtcbiAgICBmbHVzaFN5bmModGVybSk7XG4gICAgdGVybS5jbGVhclNlbGVjdGlvbigpO1xuICAgIGZsdXNoU3luYyh0ZXJtKTtcblxuICAgIGF3YWl0IGZpbmlzaFN0ZXAoKTtcbn1cblxuLyoqXG4gKiBCZW5jaG1hcmsgU3RlcCAyOiBJbmxpbmUgTGlua3MgJiBIb3ZlclxuICogRHVtcHMgVVJMcyBhbmQgcGF0aHMsIHRoZW4gc2ltdWxhdGVzIG1vdXNlIGhvdmVyIGV2ZW50cyBhY3Jvc3MgZ3JpZCB0byB0cmlnZ2VyIHJlZ2V4IGxpbmsgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhvdmVySW5saW5lTGlua3MoKSB7XG4gICAgc3dpdGNoVGFiKFwibGlua3NcIik7XG4gICAgY29uc3QgdGVybSA9IHRlcm1pbmFscy5saW5rcztcbiAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgYXdhaXQgZmluaXNoU3RlcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGVybS5jbGVhcigpO1xuICAgIC8vIFdyaXRlIH41MCUgb2YgbGluayBjaHVua3MgdG8gdGFyZ2V0IH4xNW1zIHdvcmtsb2FkIGNvbXBsZXhpdHlcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKDQwLCBsaW5rc0NodW5rcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgd3JpdGVTeW5jKHRlcm0sIGxpbmtzQ2h1bmtzW2ldKTtcblxuICAgIGZsdXNoU3luYyh0ZXJtKTtcblxuICAgIC8vIFNpbXVsYXRlIG1vdXNlIG1vdmVzIGFjcm9zcyByb3dzIHRvIHRyaWdnZXIgQHh0ZXJtL2FkZG9uLXdlYi1saW5rcyByZWdleCBtYXRjaGluZyAmIGRlY29yYXRpb25zXG4gICAgY29uc3Qgc2NyZWVuRWxlbWVudCA9IHRlcm0uZWxlbWVudCA/IHRlcm0uZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnh0ZXJtLXNjcmVlblwiKSA6IG51bGw7XG4gICAgaWYgKHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHNjcmVlbkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHN0ZXBZID0gcmVjdC5oZWlnaHQgLyAyNTtcbiAgICAgICAgY29uc3Qgc3RlcFggPSByZWN0LndpZHRoIC8gNDtcblxuICAgICAgICBmb3IgKGxldCByb3cgPSAxOyByb3cgPD0gMTA7IHJvdysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAxOyBjb2wgPD0gMzsgY29sKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRYID0gcmVjdC5sZWZ0ICsgY29sICogc3RlcFg7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xpZW50WSA9IHJlY3QudG9wICsgcm93ICogc3RlcFk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW92ZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoXCJtb3VzZW1vdmVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2aWV3OiB3aW5kb3csXG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFgsXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2NyZWVuRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1vdmVFdmVudCk7XG4gICAgICAgICAgICAgICAgZmx1c2hTeW5jKHRlcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgZmluaXNoU3RlcCgpO1xufVxuXG4vKipcbiAqIEJlbmNobWFyayBTdGVwIDM6IE5jdXJzZXMgQ29sb3IgVUlcbiAqIEVtaXRzIDQgc2VxdWVudGlhbCBmcmFtZXMgb2YgYW4gaHRvcCBtb25pdG9yIHdpdGggY3Vyc29yIHBvc2l0aW9uaW5nLCBUcnVlQ29sb3IsIGFuZCBwYXJ0aWFsIGdyaWQgcmVkcmF3c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmN1cnNlc0NvbG9yVUkoKSB7XG4gICAgc3dpdGNoVGFiKFwibmN1cnNlc1wiKTtcbiAgICBjb25zdCB0ZXJtID0gdGVybWluYWxzLm5jdXJzZXM7XG4gICAgaWYgKCF0ZXJtKSB7XG4gICAgICAgIGF3YWl0IGZpbmlzaFN0ZXAoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmN1cnNlc0ZyYW1lcy5sZW5ndGg7IGkrKykgd3JpdGVBbmRGbHVzaFN5bmModGVybSwgbmN1cnNlc0ZyYW1lc1tpXSk7XG5cbiAgICB0ZXJtLnJlZnJlc2goMCwgdGVybS5yb3dzIC0gMSk7XG4gICAgZmx1c2hTeW5jKHRlcm0pO1xuICAgIGF3YWl0IGZpbmlzaFN0ZXAoKTtcbn1cblxuLyoqXG4gKiBCZW5jaG1hcmsgU3RlcCA0OiBTd2l0Y2ggVGFicyAmIFJlc2l6ZVxuICogU2ltdWxhdGVzIHN3aXRjaGluZyBiZXR3ZWVuIG11bHRpcGxlIGFjdGl2ZSBJREUgdGVybWluYWwgcGFuZWxzIGFuZCByZWZsb3dpbmcgY29sdW1uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dpdGNoVGFic0FuZFJlc2l6ZSgpIHtcbiAgICAvLyBTd2l0Y2ggYmV0d2VlbiAyIGFjdGl2ZSBwYW5lbHMgKFwiYnVpbGRcIiBhbmQgXCJsaW5rc1wiKSB0byB0YXJnZXQgfjIwbXMgd29ya2xvYWQgY29tcGxleGl0eVxuICAgIGNvbnN0IHRhYnMgPSBbXCJidWlsZFwiLCBcImxpbmtzXCJdO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGVybWluYWwtY29udGFpbmVyXCIpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IDE7IGN5Y2xlKyspIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJJZCA9IHRhYnNbaV07XG5cbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIElERSBzaWRlYmFyIHRvZ2dsaW5nIG9yIHBhbmVsIHJlc2l6aW5nIGJ5IG11dGF0aW5nIHdpZHRoIHNsaWdodGx5XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBpID09PSAwID8gXCI5NSVcIiA6IFwiMTAwJVwiO1xuXG4gICAgICAgICAgICBzd2l0Y2hUYWIodGFiSWQpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBhIHNtYWxsIHN0YXR1cyBwaW5nIGFuZCBzeW5jaHJvbm91c2x5IHJlZmxvdy9mbHVzaCBvbiBhY3RpdmUgdGFiXG4gICAgICAgICAgICB3cml0ZUFuZEZsdXNoU3luYyh0ZXJtaW5hbHNbdGFiSWRdLCBgXFx4MWJbMm1bVGFiIHN3aXRjaGVkIHRvICR7dGFiSWR9IGF0ICR7RGF0ZS5ub3coKX1dXFx4MWJbMG1cXHJcXG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuXG4gICAgc3dpdGNoVGFiKFwiYnVpbGRcIik7XG4gICAgYXdhaXQgZmluaXNoU3RlcCgpO1xufVxuXG4vKipcbiAqIEJlbmNobWFyayBTdGVwIDU6IExheW91dCBDaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5b3V0Q2hlY2soKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGF5b3V0Q2hlY2suZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoKGJvZHkud2lkdGggLyAyKSB8IDAsIChib2R5LmhlaWdodCAvIDIpIHwgMCk7XG59XG5cbi8vIEV2ZW50IGJpbmRpbmdzIGZvciBVSSBidXR0b25zIGFuZCB0YWIgaGVhZGVyc1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcbiAgICBpbml0VGVybWluYWxzKCk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYlwiKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2hUYWIoYnRuLmdldEF0dHJpYnV0ZShcImRhdGEtdGFiXCIpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJ0bi1pbml0XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBpbml0VGVybWluYWxzKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJ0bi1kdW1wLXNjcm9sbFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZHVtcEFuZFNjcm9sbCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidG4taG92ZXItbGlua3NcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhvdmVySW5saW5lTGlua3MpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnRuLW5jdXJzZXNcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG5jdXJzZXNDb2xvclVJKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJ0bi1zd2l0Y2gtdGFic1wiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgc3dpdGNoVGFic0FuZFJlc2l6ZSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidG4tbGF5b3V0XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBsYXlvdXRDaGVjayk7XG5cbiAgICAvLyBIYW5kbGUgd2luZG93IHJlc2l6aW5nXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgKCkgPT4ge1xuICAgICAgICBmaXRBZGRvbnNbYWN0aXZlVGFiSWRdLmZpdCgpO1xuICAgIH0pO1xufSk7XG5cbi8vIEV4cG9zZSBiZW5jaG1hcmsgc3RlcHMgZ2xvYmFsbHkgZm9yIFNwZWVkb21ldGVyIHN1aXRlIHJ1bm5lciBhbmQgbG9jYWwgZXhwZXJpbWVudGF0aW9uXG53aW5kb3cudGVybWluYWxCZW5jaG1hcmsgPSB7XG4gICAgaW5pdDogaW5pdFRlcm1pbmFscyxcbiAgICBkdW1wQW5kU2Nyb2xsLFxuICAgIGhvdmVySW5saW5lTGlua3MsXG4gICAgbmN1cnNlc0NvbG9yVUksXG4gICAgc3dpdGNoVGFic0FuZFJlc2l6ZSxcbiAgICBsYXlvdXQ6IGxheW91dENoZWNrLFxuICAgIHN3aXRjaFRhYixcbiAgICB0ZXJtaW5hbHMsXG4gICAgZml0QWRkb25zLFxufTtcbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsIm1vZHVsZSIsImdsb2JhbFRoaXMiLCJpIiwiQWNjZXNzaWJpbGl0eU1hbmFnZXIiLCJ0IiwiRGlzcG9zYWJsZSIsIl90ZXJtaW5hbCIsImluc3RhbnRpYXRpb25TZXJ2aWNlIiwicyIsInN1cGVyIiwiX2NvcmVCcm93c2VyU2VydmljZSIsIl9yZW5kZXJTZXJ2aWNlIiwiX3Jvd0NvbHVtbnMiLCJXZWFrTWFwIiwiX2xpdmVSZWdpb25MaW5lQ291bnQiLCJfY2hhcnNUb0NvbnN1bWUiLCJfY2hhcnNUb0Fubm91bmNlIiwidGhpcyIsIl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyIiwibWFpbkRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsIl9yb3dDb250YWluZXIiLCJzZXRBdHRyaWJ1dGUiLCJfcm93RWxlbWVudHMiLCJyb3dzIiwiX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSIsImFwcGVuZENoaWxkIiwiX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lciIsImUiLCJfaGFuZGxlQm91bmRhcnlGb2N1cyIsIl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwibGVuZ3RoIiwiX3JlZnJlc2hSb3dzRGltZW5zaW9ucyIsIl9saXZlUmVnaW9uIiwiX2xpdmVSZWdpb25EZWJvdW5jZXIiLCJyZWdpc3RlciIsIlRpbWVCYXNlZERlYm91bmNlciIsIl9yZW5kZXJSb3dzIiwiYmluZCIsImVsZW1lbnQiLCJFcnJvciIsImluc2VydEFkamFjZW50RWxlbWVudCIsIm9uUmVzaXplIiwiX2hhbmRsZVJlc2l6ZSIsIm9uUmVuZGVyIiwiX3JlZnJlc2hSb3dzIiwic3RhcnQiLCJlbmQiLCJvblNjcm9sbCIsIm9uQTExeUNoYXIiLCJjaGFyIiwiX2hhbmRsZUNoYXIiLCJvbkxpbmVGZWVkIiwib25BMTF5VGFiIiwic3BhY2VDb3VudCIsIl9oYW5kbGVUYWIiLCJvbktleSIsIl9oYW5kbGVLZXkiLCJrZXkiLCJvbkJsdXIiLCJfY2xlYXJMaXZlUmVnaW9uIiwib25EaW1lbnNpb25zQ2hhbmdlIiwiYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyIiwiZG9jdW1lbnQiLCJfaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIiwib25EcHJDaGFuZ2UiLCJ0b0Rpc3Bvc2FibGUiLCJyZW1vdmUiLCJNQVhfUk9XU19UT19SRUFEIiwic2hpZnQiLCJ0ZXh0Q29udGVudCIsIlN0cmluZ3MiLCJ0b29NdWNoT3V0cHV0Iiwia2V5Q2hhciIsInRlc3QiLCJwdXNoIiwicmVmcmVzaCIsImJ1ZmZlciIsInNldFNpemUiLCJsaW5lcyIsInRvU3RyaW5nIiwibGluZSIsImdldCIsInlkaXNwIiwiY29sdW1ucyIsImxpbmVEYXRhIiwidHJhbnNsYXRlVG9TdHJpbmciLCJ1bmRlZmluZWQiLCJwb3NJblNldCIsImlubmVyVGV4dCIsInNldCIsIl9hbm5vdW5jZUNoYXJhY3RlcnMiLCJwb3NpdGlvbiIsImJvdW5kYXJ5RWxlbWVudCIsInRhcmdldCIsImJlZm9yZUJvdW5kYXJ5RWxlbWVudCIsImdldEF0dHJpYnV0ZSIsInJlbGF0ZWRUYXJnZXQiLCJ0b3BCb3VuZGFyeUVsZW1lbnQiLCJib3R0b21Cb3VuZGFyeUVsZW1lbnQiLCJwb3AiLCJyZW1vdmVDaGlsZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJuZXdFbGVtZW50IiwidW5zaGlmdCIsInNjcm9sbExpbmVzIiwiZm9jdXMiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsImlzQ29sbGFwc2VkIiwiY29udGFpbnMiLCJhbmNob3JOb2RlIiwiY2xlYXJTZWxlY3Rpb24iLCJmb2N1c05vZGUiLCJjb25zb2xlIiwiZXJyb3IiLCJiZWdpbiIsIm5vZGUiLCJvZmZzZXQiLCJhbmNob3JPZmZzZXQiLCJmb2N1c09mZnNldCIsImNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIiwiTm9kZSIsIkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyIsIkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSIsIkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyIsImNoaWxkTm9kZXMiLCJsYXN0Um93RWxlbWVudCIsInNsaWNlIiwidG9Sb3dDb2x1bW4iLCJyb3dFbGVtZW50IiwiVGV4dCIsInBhcmVudE5vZGUiLCJyb3ciLCJwYXJzZUludCIsImlzTmFOIiwid2FybiIsImNvbHVtbiIsImNvbHMiLCJiZWdpblJvd0NvbHVtbiIsImVuZFJvd0NvbHVtbiIsInNlbGVjdCIsImNoaWxkcmVuIiwidGFiSW5kZXgiLCJfcmVmcmVzaFJvd0RpbWVuc2lvbnMiLCJkaW1lbnNpb25zIiwiY3NzIiwiY2VsbCIsImhlaWdodCIsInN0eWxlIiwid2lkdGgiLCJjYW52YXMiLCJJSW5zdGFudGlhdGlvblNlcnZpY2UiLCJJQ29yZUJyb3dzZXJTZXJ2aWNlIiwiSVJlbmRlclNlcnZpY2UiLCJwcmVwYXJlVGV4dEZvclRlcm1pbmFsIiwidGV4dCIsInJlcGxhY2UiLCJicmFja2V0VGV4dEZvclBhc3RlIiwiYnJhY2tldGVkUGFzdGVNb2RlIiwicGFzdGUiLCJ0ZXh0YXJlYSIsImNvcmVTZXJ2aWNlIiwib3B0aW9uc1NlcnZpY2UiLCJkZWNQcml2YXRlTW9kZXMiLCJyYXdPcHRpb25zIiwiaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlIiwidHJpZ2dlckRhdGFFdmVudCIsInZhbHVlIiwibW92ZVRleHRBcmVhVW5kZXJNb3VzZUN1cnNvciIsImV2Iiwic2NyZWVuRWxlbWVudCIsInBvcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxlZnQiLCJjbGllbnRYIiwidG9wIiwiY2xpZW50WSIsInpJbmRleCIsInNlbGVjdGlvblNlcnZpY2UiLCJjbGlwYm9hcmREYXRhIiwic2V0RGF0YSIsInNlbGVjdGlvblRleHQiLCJzdG9wUHJvcGFnYXRpb24iLCJnZXREYXRhIiwic2hvdWxkU2VsZWN0V29yZCIsInJpZ2h0Q2xpY2tTZWxlY3QiLCJfY29sb3IiLCJUd29LZXlNYXAiLCJfY3NzIiwiYmciLCJmZyIsImNsZWFyIiwidHlwZSIsImhhbmRsZXIiLCJvcHRpb25zIiwiZGlzcG9zZWQiLCJkaXNwb3NlIiwiTGlua2lmaWVyIiwiX2N1cnJlbnRMaW5rIiwiX2VsZW1lbnQiLCJyIiwiX21vdXNlU2VydmljZSIsIl9idWZmZXJTZXJ2aWNlIiwiX2xpbmtQcm92aWRlclNlcnZpY2UiLCJfbGlua0NhY2hlRGlzcG9zYWJsZXMiLCJfaXNNb3VzZU91dCIsIl93YXNSZXNpemVkIiwiX2FjdGl2ZUxpbmUiLCJfb25TaG93TGlua1VuZGVybGluZSIsIkV2ZW50RW1pdHRlciIsIm9uU2hvd0xpbmtVbmRlcmxpbmUiLCJldmVudCIsIl9vbkhpZGVMaW5rVW5kZXJsaW5lIiwib25IaWRlTGlua1VuZGVybGluZSIsImdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUiLCJfbGFzdE1vdXNlRXZlbnQiLCJfYWN0aXZlUHJvdmlkZXJSZXBsaWVzIiwiX2NsZWFyQ3VycmVudExpbmsiLCJfaGFuZGxlTW91c2VNb3ZlIiwiX2hhbmRsZU1vdXNlRG93biIsIl9oYW5kbGVNb3VzZVVwIiwiX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQiLCJjb21wb3NlZFBhdGgiLCJfbGFzdEJ1ZmZlckNlbGwiLCJ4IiwieSIsIl9oYW5kbGVIb3ZlciIsIl9hc2tGb3JMaW5rIiwiX2xpbmtBdFBvc2l0aW9uIiwibGluayIsInVzZUxpbmVDYWNoZSIsImZvckVhY2giLCJyZXBseSIsImxpbmtXaXRoU3RhdGUiLCJNYXAiLCJsaW5rUHJvdmlkZWQiLCJsaW5rUHJvdmlkZXIiLCJsaW5rUHJvdmlkZXJzIiwiZW50cmllcyIsImV4aXN0aW5nUmVwbHkiLCJfY2hlY2tMaW5rUHJvdmlkZXJSZXN1bHQiLCJwcm92aWRlTGlua3MiLCJsaW5rcyIsImxpbmtzV2l0aFN0YXRlIiwibWFwIiwic2l6ZSIsIl9yZW1vdmVJbnRlcnNlY3RpbmdMaW5rcyIsInJlcGxpZXMiLCJvY2N1cGllZENlbGxzIiwiU2V0IiwicHJvdmlkZXJSZXBseSIsInN0YXJ0WCIsInJhbmdlIiwiZW5kWCIsImhhcyIsInNwbGljZSIsImluZGV4IiwiaGFzTGlua0JlZm9yZSIsImoiLCJsaW5rQXRQb3NpdGlvbiIsImZpbmQiLCJfaGFuZGxlTmV3TGluayIsImN1cnJlbnRMaW5rIiwiX21vdXNlRG93bkxpbmsiLCJhY3RpdmF0ZSIsInN0YXJ0Um93IiwiZW5kUm93IiwiX2xpbmtMZWF2ZSIsImRpc3Bvc2VBcnJheSIsInN0YXRlIiwiZGVjb3JhdGlvbnMiLCJ1bmRlcmxpbmUiLCJwb2ludGVyQ3Vyc29yIiwiaXNIb3ZlcmVkIiwiX2xpbmtIb3ZlciIsIk9iamVjdCIsImRlZmluZVByb3BlcnRpZXMiLCJ2IiwidG9nZ2xlIiwiX2ZpcmVVbmRlcmxpbmVFdmVudCIsIm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSIsImhvdmVyIiwic2hvd0V2ZW50Iiwic2Nyb2xsT2Zmc2V0IiwiX2NyZWF0ZUxpbmtVbmRlcmxpbmVFdmVudCIsImZpcmUiLCJsZWF2ZSIsImxvd2VyIiwidXBwZXIiLCJjdXJyZW50IiwibW91c2VTZXJ2aWNlIiwiY29vcmRzIiwiZ2V0Q29vcmRzIiwieDEiLCJ5MSIsIngyIiwieTIiLCJJTW91c2VTZXJ2aWNlIiwiSUJ1ZmZlclNlcnZpY2UiLCJJTGlua1Byb3ZpZGVyU2VydmljZSIsInByb21wdExhYmVsIiwiT3NjTGlua1Byb3ZpZGVyIiwiX29wdGlvbnNTZXJ2aWNlIiwiX29zY0xpbmtTZXJ2aWNlIiwiY2FsbGJhY2siLCJyZXN1bHQiLCJsaW5rSGFuZGxlciIsIkNlbGxEYXRhIiwibGluZUxlbmd0aCIsImdldFRyaW1tZWRMZW5ndGgiLCJjdXJyZW50TGlua0lkIiwiY3VycmVudFN0YXJ0IiwiZmluaXNoTGluayIsImhhc0NvbnRlbnQiLCJsb2FkQ2VsbCIsImhhc0V4dGVuZGVkQXR0cnMiLCJleHRlbmRlZCIsInVybElkIiwiZ2V0TGlua0RhdGEiLCJ1cmkiLCJpZ25vcmVMaW5rIiwiYWxsb3dOb25IdHRwUHJvdG9jb2xzIiwicGFyc2VkIiwiVVJMIiwiaW5jbHVkZXMiLCJwcm90b2NvbCIsImRlZmF1bHRBY3RpdmF0ZSIsImNvbmZpcm0iLCJuZXdXaW5kb3ciLCJ3aW5kb3ciLCJvcGVuIiwib3BlbmVyIiwibG9jYXRpb24iLCJocmVmIiwiSU9wdGlvbnNTZXJ2aWNlIiwiSU9zY0xpbmtTZXJ2aWNlIiwiX3JlbmRlckNhbGxiYWNrIiwiX3JlZnJlc2hDYWxsYmFja3MiLCJfYW5pbWF0aW9uRnJhbWUiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIl9pbm5lclJlZnJlc2giLCJyb3dTdGFydCIsInJvd0VuZCIsInJvd0NvdW50IiwiX3Jvd0NvdW50IiwiX3Jvd1N0YXJ0IiwiTWF0aCIsIm1pbiIsIl9yb3dFbmQiLCJtYXgiLCJfcnVuUmVmcmVzaENhbGxiYWNrcyIsIlRlcm1pbmFsIiwiQ29yZVRlcm1pbmFsIiwib25Gb2N1cyIsIl9vbkZvY3VzIiwiX29uQmx1ciIsIl9vbkExMXlDaGFyRW1pdHRlciIsIl9vbkExMXlUYWJFbWl0dGVyIiwib25XaWxsT3BlbiIsIl9vbldpbGxPcGVuIiwiYnJvd3NlciIsIkJyb3dzZXIiLCJfa2V5RG93bkhhbmRsZWQiLCJfa2V5RG93blNlZW4iLCJfa2V5UHJlc3NIYW5kbGVkIiwiX3VucHJvY2Vzc2VkRGVhZEtleSIsIl9hY2Nlc3NpYmlsaXR5TWFuYWdlciIsIk11dGFibGVEaXNwb3NhYmxlIiwiX29uQ3Vyc29yTW92ZSIsIm9uQ3Vyc29yTW92ZSIsIl9vbktleSIsIl9vblJlbmRlciIsIl9vblNlbGVjdGlvbkNoYW5nZSIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwiX29uVGl0bGVDaGFuZ2UiLCJvblRpdGxlQ2hhbmdlIiwiX29uQmVsbCIsIm9uQmVsbCIsIl9zZXR1cCIsIl9kZWNvcmF0aW9uU2VydmljZSIsIl9pbnN0YW50aWF0aW9uU2VydmljZSIsImNyZWF0ZUluc3RhbmNlIiwiRGVjb3JhdGlvblNlcnZpY2UiLCJzZXRTZXJ2aWNlIiwiSURlY29yYXRpb25TZXJ2aWNlIiwiTGlua1Byb3ZpZGVyU2VydmljZSIsInJlZ2lzdGVyTGlua1Byb3ZpZGVyIiwiX2lucHV0SGFuZGxlciIsIm9uUmVxdWVzdEJlbGwiLCJvblJlcXVlc3RSZWZyZXNoUm93cyIsIm9uUmVxdWVzdFNlbmRGb2N1cyIsIl9yZXBvcnRGb2N1cyIsIm9uUmVxdWVzdFJlc2V0IiwicmVzZXQiLCJvblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydCIsIl9yZXBvcnRXaW5kb3dzT3B0aW9ucyIsIm9uQ29sb3IiLCJfaGFuZGxlQ29sb3JFdmVudCIsImZvcndhcmRFdmVudCIsIl9hZnRlclJlc2l6ZSIsIl9jdXN0b21LZXlFdmVudEhhbmRsZXIiLCJfdGhlbWVTZXJ2aWNlIiwicmVxIiwiYWNjIiwiaWRlbnQiLCJjb2xvclJnYiIsImNvbG9yIiwidG9Db2xvclJHQiIsImNvbG9ycyIsImFuc2kiLCJDMCIsIkVTQyIsInRvUmdiU3RyaW5nIiwiQzFfRVNDQVBFRCIsIlNUIiwibW9kaWZ5Q29sb3JzIiwiY2hhbm5lbHMiLCJ0b0NvbG9yIiwibmFycm93ZWRBY2MiLCJyZXN0b3JlQ29sb3IiLCJidWZmZXJzIiwiYWN0aXZlIiwicHJldmVudFNjcm9sbCIsInNlbmRGb2N1cyIsIl9zaG93Q3Vyc29yIiwiYmx1ciIsIl9oYW5kbGVUZXh0QXJlYUJsdXIiLCJpc0N1cnNvckluVmlld3BvcnQiLCJfY29tcG9zaXRpb25IZWxwZXIiLCJpc0NvbXBvc2luZyIsImN1cnNvclkiLCJ5YmFzZSIsImJ1ZmZlckxpbmUiLCJjdXJzb3JYIiwiY2VsbEhlaWdodCIsImdldFdpZHRoIiwiY2VsbFdpZHRoIiwiY3Vyc29yVG9wIiwiY3Vyc29yTGVmdCIsImxpbmVIZWlnaHQiLCJfaW5pdEdsb2JhbCIsIl9iaW5kS2V5cyIsImhhc1NlbGVjdGlvbiIsImNvcHlIYW5kbGVyIiwiX3NlbGVjdGlvblNlcnZpY2UiLCJwYXN0ZUhhbmRsZXJXcmFwcGVyIiwiaGFuZGxlUGFzdGVFdmVudCIsImlzRmlyZWZveCIsImJ1dHRvbiIsInJpZ2h0Q2xpY2tIYW5kbGVyIiwicmlnaHRDbGlja1NlbGVjdHNXb3JkIiwiaXNMaW51eCIsIl9rZXlVcCIsIl9rZXlEb3duIiwiX2tleVByZXNzIiwiY29tcG9zaXRpb25zdGFydCIsImNvbXBvc2l0aW9udXBkYXRlIiwiY29tcG9zaXRpb25lbmQiLCJfaW5wdXRFdmVudCIsInVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMiLCJwYXJlbnQiLCJpc0Nvbm5lY3RlZCIsIl9sb2dTZXJ2aWNlIiwiZGVidWciLCJvd25lckRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJfZG9jdW1lbnQiLCJkb2N1bWVudE92ZXJyaWRlIiwiRG9jdW1lbnQiLCJkaXIiLCJmcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJfdmlld3BvcnRFbGVtZW50IiwiX3ZpZXdwb3J0U2Nyb2xsQXJlYSIsInVwZGF0ZUN1cnNvclN0eWxlIiwiX2hlbHBlckNvbnRhaW5lciIsImlzQ2hyb21lT1MiLCJDb3JlQnJvd3NlclNlcnZpY2UiLCJfaGFuZGxlVGV4dEFyZWFGb2N1cyIsIl9jaGFyU2l6ZVNlcnZpY2UiLCJDaGFyU2l6ZVNlcnZpY2UiLCJJQ2hhclNpemVTZXJ2aWNlIiwiVGhlbWVTZXJ2aWNlIiwiSVRoZW1lU2VydmljZSIsIl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIiwiQ2hhcmFjdGVySm9pbmVyU2VydmljZSIsIklDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIiwiUmVuZGVyU2VydmljZSIsInJlc2l6ZSIsIl9jb21wb3NpdGlvblZpZXciLCJDb21wb3NpdGlvbkhlbHBlciIsIk1vdXNlU2VydmljZSIsImxpbmtpZmllciIsImhhc1JlbmRlcmVyIiwic2V0UmVuZGVyZXIiLCJfY3JlYXRlUmVuZGVyZXIiLCJ2aWV3cG9ydCIsIlZpZXdwb3J0Iiwib25SZXF1ZXN0U2Nyb2xsTGluZXMiLCJhbW91bnQiLCJzdXBwcmVzc1Njcm9sbEV2ZW50Iiwib25SZXF1ZXN0U3luY1Njcm9sbEJhciIsInN5bmNTY3JvbGxBcmVhIiwiaGFuZGxlQ3Vyc29yTW92ZSIsIl9zeW5jVGV4dEFyZWEiLCJoYW5kbGVSZXNpemUiLCJoYW5kbGVCbHVyIiwiaGFuZGxlRm9jdXMiLCJTZWxlY3Rpb25TZXJ2aWNlIiwiSVNlbGVjdGlvblNlcnZpY2UiLCJvblJlcXVlc3RSZWRyYXciLCJoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkIiwiY29sdW1uU2VsZWN0TW9kZSIsIm9uTGludXhNb3VzZVNlbGVjdGlvbiIsIl9vblNjcm9sbCIsIkJ1ZmZlckRlY29yYXRpb25SZW5kZXJlciIsImhhbmRsZU1vdXNlRG93biIsImNvcmVNb3VzZVNlcnZpY2UiLCJhcmVNb3VzZUV2ZW50c0FjdGl2ZSIsImRpc2FibGUiLCJlbmFibGUiLCJzY3JlZW5SZWFkZXJNb2RlIiwib25TcGVjaWZpY09wdGlvbkNoYW5nZSIsIl9oYW5kbGVTY3JlZW5SZWFkZXJNb2RlT3B0aW9uQ2hhbmdlIiwib3ZlcnZpZXdSdWxlcldpZHRoIiwiX292ZXJ2aWV3UnVsZXJSZW5kZXJlciIsIk92ZXJ2aWV3UnVsZXJSZW5kZXJlciIsIm1lYXN1cmUiLCJiaW5kTW91c2UiLCJEb21SZW5kZXJlciIsInNlbGYiLCJlbCIsInNlbmRFdmVudCIsImdldE1vdXNlUmVwb3J0Q29vcmRzIiwiYnV0IiwiYWN0aW9uIiwib3ZlcnJpZGVUeXBlIiwiYnV0dG9ucyIsIl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlciIsImdldExpbmVzU2Nyb2xsZWQiLCJkZWx0YVkiLCJ0cmlnZ2VyTW91c2VFdmVudCIsImNvbCIsImN0cmwiLCJjdHJsS2V5IiwiYWx0IiwiYWx0S2V5Iiwic2hpZnRLZXkiLCJyZXF1ZXN0ZWRFdmVudHMiLCJtb3VzZXVwIiwid2hlZWwiLCJtb3VzZWRyYWciLCJtb3VzZW1vdmUiLCJldmVudExpc3RlbmVycyIsImNhbmNlbCIsIm9uUHJvdG9jb2xDaGFuZ2UiLCJldmVudHMiLCJsb2dMZXZlbCIsImV4cGxhaW5FdmVudHMiLCJwYXNzaXZlIiwiYWN0aXZlUHJvdG9jb2wiLCJzaG91bGRGb3JjZVNlbGVjdGlvbiIsImhhc1Njcm9sbGJhY2siLCJzZXF1ZW5jZSIsImFwcGxpY2F0aW9uQ3Vyc29yS2V5cyIsImRhdGEiLCJhYnMiLCJoYW5kbGVXaGVlbCIsImhhbmRsZVRvdWNoU3RhcnQiLCJoYW5kbGVUb3VjaE1vdmUiLCJyZWZyZXNoUm93cyIsInNob3VsZENvbHVtblNlbGVjdCIsImlzQ3Vyc29ySW5pdGlhbGl6ZWQiLCJkaXNwIiwic291cmNlIiwiY3VzdG9tS2V5RXZlbnRIYW5kbGVyIiwiY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIiLCJqb2luZXJJZCIsImRlcmVnaXN0ZXIiLCJtYXJrZXJzIiwiY3Vyc29yWU9mZnNldCIsImFkZE1hcmtlciIsImRlY29yYXRpb25PcHRpb25zIiwicmVnaXN0ZXJEZWNvcmF0aW9uIiwic2V0U2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uUG9zaXRpb24iLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsInNlbGVjdEFsbCIsInNlbGVjdExpbmVzIiwic2hvdWxkSWdub3JlQ29tcG9zaXRpb24iLCJpc01hYyIsIm1hY09wdGlvbklzTWV0YSIsImtleWRvd24iLCJzY3JvbGxPblVzZXJJbnB1dCIsInNjcm9sbFRvQm90dG9tIiwiZXZhbHVhdGVLZXlib2FyZEV2ZW50Iiwic2Nyb2xsQ291bnQiLCJfaXNUaGlyZExldmVsU2hpZnQiLCJtZXRhS2V5IiwiY2hhckNvZGVBdCIsIkVUWCIsIkNSIiwiZG9tRXZlbnQiLCJ0aGlyZExldmVsS2V5IiwiaXNXaW5kb3dzIiwiZ2V0TW9kaWZpZXJTdGF0ZSIsImtleUNvZGUiLCJjaGFyQ29kZSIsIndoaWNoIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiaW5wdXRUeXBlIiwiY29tcG9zZWQiLCJoYXNWYWxpZFNpemUiLCJjbGVhckFsbE1hcmtlcnMiLCJnZXRCbGFua0xpbmUiLCJERUZBVUxUX0FUVFJfREFUQSIsImNsZWFyVGV4dHVyZUF0bGFzIiwiV2luZG93c09wdGlvbnNSZXBvcnRUeXBlIiwiR0VUX1dJTl9TSVpFX1BJWEVMUyIsImNhbnZhc1dpZHRoIiwidG9GaXhlZCIsImNhbnZhc0hlaWdodCIsIkdFVF9DRUxMX1NJWkVfUElYRUxTIiwiZm9yY2UiLCJjYW5jZWxFdmVudHMiLCJfZGVib3VuY2VUaHJlc2hvbGRNUyIsIl9sYXN0UmVmcmVzaE1zIiwiX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkIiwiX3JlZnJlc2hUaW1lb3V0SUQiLCJjbGVhclRpbWVvdXQiLCJyZWZyZXNoUmVxdWVzdFRpbWUiLCJEYXRlIiwibm93IiwiZWxhcHNlZCIsIndhaXRQZXJpb2RCZWZvcmVUcmFpbGluZ1JlZnJlc2giLCJzZXRUaW1lb3V0IiwiX3Njcm9sbEFyZWEiLCJvIiwiaCIsInRoZW1lU2VydmljZSIsInNjcm9sbEJhcldpZHRoIiwiX2N1cnJlbnRSb3dIZWlnaHQiLCJfY3VycmVudERldmljZUNlbGxIZWlnaHQiLCJfbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoIiwiX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0IiwiX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCIsIl9sYXN0VG91Y2hZIiwiX2xhc3RTY3JvbGxUb3AiLCJfd2hlZWxQYXJ0aWFsU2Nyb2xsIiwiX3JlZnJlc2hBbmltYXRpb25GcmFtZSIsIl9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQiLCJfc21vb3RoU2Nyb2xsU3RhdGUiLCJzdGFydFRpbWUiLCJvcmlnaW4iLCJfb25SZXF1ZXN0U2Nyb2xsTGluZXMiLCJvZmZzZXRXaWR0aCIsIl9oYW5kbGVTY3JvbGwiLCJfYWN0aXZlQnVmZmVyIiwib25CdWZmZXJBY3RpdmF0ZSIsImFjdGl2ZUJ1ZmZlciIsIl9yZW5kZXJEaW1lbnNpb25zIiwiX2hhbmRsZVRoZW1lQ2hhbmdlIiwib25DaGFuZ2VDb2xvcnMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kIiwiaW1tZWRpYXRlIiwiZGV2aWNlIiwiZHByIiwib2Zmc2V0SGVpZ2h0IiwibmV3QnVmZmVySGVpZ2h0Iiwicm91bmQiLCJzY3JvbGxUb3AiLCJfcmVmcmVzaCIsIm9mZnNldFBhcmVudCIsImRpZmYiLCJfaXNEaXNwb3NlZCIsInBlcmNlbnQiLCJfc21vb3RoU2Nyb2xsUGVyY2VudCIsIl9zbW9vdGhTY3JvbGwiLCJfY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSIsInNtb290aFNjcm9sbER1cmF0aW9uIiwic2Nyb2xsUG9zRnJvbVRvcCIsImNhbmNlbGFibGUiLCJfZ2V0UGl4ZWxzU2Nyb2xsZWQiLCJzY3JvbGxIZWlnaHQiLCJfYnViYmxlU2Nyb2xsIiwiX2FwcGx5U2Nyb2xsTW9kaWZpZXIiLCJkZWx0YU1vZGUiLCJXaGVlbEV2ZW50IiwiRE9NX0RFTFRBX0xJTkUiLCJET01fREVMVEFfUEFHRSIsInN0YXJ0TGluZSIsImVuZExpbmUiLCJjdXJzb3JFbGVtZW50IiwiY3VycmVudExpbmUiLCJidWZmZXJFbGVtZW50cyIsImlzV3JhcHBlZCIsImRpdiIsIkRPTV9ERUxUQV9QSVhFTCIsImZsb29yIiwibW9kaWZpZXIiLCJmYXN0U2Nyb2xsTW9kaWZpZXIiLCJmYXN0U2Nyb2xsU2Vuc2l0aXZpdHkiLCJzY3JvbGxTZW5zaXRpdml0eSIsInRvdWNoZXMiLCJwYWdlWSIsIl9zY3JlZW5FbGVtZW50IiwiX2RlY29yYXRpb25FbGVtZW50cyIsIl9hbHRCdWZmZXJJc0FjdGl2ZSIsIl9kaW1lbnNpb25zQ2hhbmdlZCIsIl9jb250YWluZXIiLCJfZG9SZWZyZXNoRGVjb3JhdGlvbnMiLCJfcXVldWVSZWZyZXNoIiwib25EZWNvcmF0aW9uUmVnaXN0ZXJlZCIsIm9uRGVjb3JhdGlvblJlbW92ZWQiLCJkZWNvcmF0aW9uIiwiX3JlbW92ZURlY29yYXRpb24iLCJhZGRSZWZyZXNoQ2FsbGJhY2siLCJfcmVuZGVyRGVjb3JhdGlvbiIsIl9yZWZyZXNoU3R5bGUiLCJfcmVmcmVzaFhQb3NpdGlvbiIsImxheWVyIiwibWFya2VyIiwiZGlzcGxheSIsIm9uUmVuZGVyRW1pdHRlciIsIl9jcmVhdGVFbGVtZW50Iiwib25EaXNwb3NlIiwiZGVsZXRlIiwiYW5jaG9yIiwicmlnaHQiLCJfem9uZXMiLCJfem9uZVBvb2wiLCJfem9uZVBvb2xJbmRleCIsIl9saW5lUGFkZGluZyIsImZ1bGwiLCJjZW50ZXIiLCJvdmVydmlld1J1bGVyT3B0aW9ucyIsInoiLCJfbGluZUludGVyc2VjdHNab25lIiwiX2xpbmVBZGphY2VudFRvWm9uZSIsIl9hZGRMaW5lVG9ab25lIiwic3RhcnRCdWZmZXJMaW5lIiwiZW5kQnVmZmVyTGluZSIsInBhZGRpbmciLCJ6b25lIiwiZHJhd0hlaWdodCIsImRyYXdXaWR0aCIsImRyYXdYIiwiX3dpZHRoIiwiX2NvbG9yWm9uZVN0b3JlIiwiQ29sb3Jab25lU3RvcmUiLCJfc2hvdWxkVXBkYXRlRGltZW5zaW9ucyIsIl9zaG91bGRVcGRhdGVBbmNob3IiLCJfbGFzdEtub3duQnVmZmVyTGVuZ3RoIiwiX2NhbnZhcyIsIl9yZWZyZXNoQ2FudmFzRGltZW5zaW9ucyIsInBhcmVudEVsZW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJjdHgiLCJnZXRDb250ZXh0IiwiX2N0eCIsIl9yZWdpc3RlckRlY29yYXRpb25MaXN0ZW5lcnMiLCJfcmVnaXN0ZXJCdWZmZXJDaGFuZ2VMaXN0ZW5lcnMiLCJfcmVnaXN0ZXJEaW1lbnNpb25DaGFuZ2VMaXN0ZW5lcnMiLCJub3JtYWwiLCJfcmVmcmVzaERyYXdIZWlnaHRDb25zdGFudHMiLCJfcmVmcmVzaENvbG9yWm9uZVBhZGRpbmciLCJfY29udGFpbmVySGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiX3JlZnJlc2hEcmF3Q29uc3RhbnRzIiwib3V0ZXJXaWR0aCIsImlubmVyV2lkdGgiLCJjZWlsIiwicGl4ZWxzUGVyTGluZSIsIm5vbkZ1bGxIZWlnaHQiLCJzZXRQYWRkaW5nIiwiX3JlZnJlc2hEZWNvcmF0aW9ucyIsImNsZWFyUmVjdCIsImFkZERlY29yYXRpb24iLCJsaW5lV2lkdGgiLCJ6b25lcyIsIl9yZW5kZXJDb2xvclpvbmUiLCJmaWxsU3R5bGUiLCJmaWxsUmVjdCIsInVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMiLCJ1cGRhdGVBbmNob3IiLCJfaXNDb21wb3NpbmciLCJfdGV4dGFyZWEiLCJfY29yZVNlcnZpY2UiLCJfaXNTZW5kaW5nQ29tcG9zaXRpb24iLCJfY29tcG9zaXRpb25Qb3NpdGlvbiIsIl9kYXRhQWxyZWFkeVNlbnQiLCJfZmluYWxpemVDb21wb3NpdGlvbiIsIl9oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMiLCJ3YWl0Rm9yUHJvcGFnYXRpb24iLCJjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbiIsImlucHV0Iiwic3Vic3RyaW5nIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIkRFTCIsImRvbnRSZWN1cnNlIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiY29tcG9zaXRpb25WaWV3Qm91bmRzIiwiSUNvcmVTZXJ2aWNlIiwiZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQiLCJyZWN0IiwiZWxlbWVudFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImxlZnRQYWRkaW5nIiwiZ2V0UHJvcGVydHlWYWx1ZSIsInRvcFBhZGRpbmciLCJjb2xDb3VudCIsImhhc1ZhbGlkQ2hhclNpemUiLCJjc3NDZWxsV2lkdGgiLCJjc3NDZWxsSGVpZ2h0IiwiaXNTZWxlY3Rpb24iLCJtb3ZlVG9SZXF1ZXN0ZWRSb3ciLCJzdGFydFkiLCJ0YXJnZXRZIiwiYnVmZmVyU2VydmljZSIsImFwcGxpY2F0aW9uQ3Vyc29yIiwid3JhcHBlZFJvd3NGb3JSb3ciLCJyb3dzVG9Nb3ZlIiwid3JhcHBlZFJvd3MiLCJkaXJlY3Rpb24iLCJ2ZXJ0aWNhbERpcmVjdGlvbiIsInJlcGVhdCIsImN1cnJlbnRSb3ciLCJsaW5lV3JhcHMiLCJzdGFydENvbCIsImVuZENvbCIsImZvcndhcmQiLCJjdXJyZW50Q29sIiwiYnVmZmVyU3RyIiwidHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nIiwibW9kIiwiY291bnQiLCJzdHIiLCJycHQiLCJ0YXJnZXRYIiwicm93RGlmZmVyZW5jZSIsImN1cnJYIiwiVEVSTUlOQUxfQ0xBU1NfUFJFRklYIiwiUk9XX0NPTlRBSU5FUl9DTEFTUyIsIkZHX0NMQVNTX1BSRUZJWCIsIkJHX0NMQVNTX1BSRUZJWCIsIkZPQ1VTX0NMQVNTIiwiU0VMRUNUSU9OX0NMQVNTIiwibmV4dFRlcm1pbmFsSWQiLCJfbGlua2lmaWVyMiIsImYiLCJnIiwibSIsIlMiLCJ3IiwiX3Rlcm1pbmFsQ2xhc3MiLCJfc2VsZWN0aW9uUmVuZGVyTW9kZWwiLCJjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCIsIl9yZWZyZXNoUm93RWxlbWVudHMiLCJfc2VsZWN0aW9uQ29udGFpbmVyIiwiY3JlYXRlUmVuZGVyRGltZW5zaW9ucyIsIl91cGRhdGVEaW1lbnNpb25zIiwib25PcHRpb25DaGFuZ2UiLCJfaGFuZGxlT3B0aW9uc0NoYW5nZWQiLCJfaW5qZWN0Q3NzIiwiX3Jvd0ZhY3RvcnkiLCJEb21SZW5kZXJlclJvd0ZhY3RvcnkiLCJfaGFuZGxlTGlua0hvdmVyIiwiX2hhbmRsZUxpbmtMZWF2ZSIsIl93aWR0aENhY2hlIiwiX3RoZW1lU3R5bGVFbGVtZW50IiwiX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQiLCJXaWR0aENhY2hlIiwic2V0Rm9udCIsImZvbnRXZWlnaHQiLCJmb250V2VpZ2h0Qm9sZCIsIl9zZXREZWZhdWx0U3BhY2luZyIsImxldHRlclNwYWNpbmciLCJvdmVyZmxvdyIsInN0eWxlcyIsIl90ZXJtaW5hbFNlbGVjdG9yIiwiZm9yZWdyb3VuZCIsIm11bHRpcGx5T3BhY2l0eSIsImJsaW5rQW5pbWF0aW9uVW5kZXJsaW5lSWQiLCJibGlua0FuaW1hdGlvbkJhcklkIiwiYmxpbmtBbmltYXRpb25CbG9ja0lkIiwiY3Vyc29yIiwiY3Vyc29yQWNjZW50IiwiY3Vyc29yV2lkdGgiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlIiwiYyIsIklOVkVSVEVEX0RFRkFVTFRfQ09MT1IiLCJvcGFxdWUiLCJzcGFjaW5nIiwiZGVmYXVsdFNwYWNpbmciLCJoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlIiwiaGFuZGxlQ2hhclNpemVDaGFuZ2VkIiwicmVuZGVyUm93cyIsInJlcGxhY2VDaGlsZHJlbiIsInVwZGF0ZSIsInZpZXdwb3J0U3RhcnRSb3ciLCJ2aWV3cG9ydEVuZFJvdyIsInZpZXdwb3J0Q2FwcGVkU3RhcnRSb3ciLCJ2aWV3cG9ydENhcHBlZEVuZFJvdyIsImRvY3VtZW50RnJhZ21lbnQiLCJpc1hGbGlwcGVkIiwiX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQiLCJtaWRkbGVSb3dzQ291bnQiLCJjb2xTdGFydCIsImNvbEVuZCIsImN1cnNvckFic29sdXRlWSIsImN1cnNvckJsaW5rIiwiY3Vyc29yU3R5bGUiLCJjdXJzb3JJbmFjdGl2ZVN0eWxlIiwiY3JlYXRlUm93IiwiX3NldENlbGxVbmRlcmxpbmUiLCJlbmFibGVkIiwibWF4WSIsImJ1ZmZlcmxpbmUiLCJuIiwiX3dvcmtDZWxsIiwiX2NvbHVtblNlbGVjdE1vZGUiLCJfc2VsZWN0aW9uU3RhcnQiLCJfc2VsZWN0aW9uRW5kIiwiaXNDdXJzb3JSb3ciLCJ3aWR0aENhY2hlIiwibGlua1N0YXJ0IiwibGlua0VuZCIsImVsZW1lbnRzIiwiam9pbmVkUmFuZ2VzIiwiZ2V0Sm9pbmVkQ2hhcmFjdGVycyIsImNoYXJFbGVtZW50IiwiZ2V0Tm9CZ1RyaW1tZWRMZW5ndGgiLCJjZWxsQW1vdW50Iiwib2xkQmciLCJvbGRGZyIsIm9sZEV4dCIsIm9sZExpbmtIb3ZlciIsIm9sZFNwYWNpbmciLCJvbGRJc0luU2VsZWN0aW9uIiwiY2xhc3NlcyIsImhhc0hvdmVyIiwiaXNKb2luZWQiLCJsYXN0Q2hhclgiLCJKb2luZWRDZWxsRGF0YSIsImlzSW5TZWxlY3Rpb24iLCJfaXNDZWxsSW5TZWxlY3Rpb24iLCJpc0N1cnNvckNlbGwiLCJpc0xpbmtIb3ZlciIsImlzRGVjb3JhdGVkIiwiZm9yRWFjaERlY29yYXRpb25BdENlbGwiLCJkIiwiY2hhcnMiLCJnZXRDaGFycyIsIldISVRFU1BBQ0VfQ0VMTF9DSEFSIiwiaXNVbmRlcmxpbmUiLCJpc092ZXJsaW5lIiwiaXNCb2xkIiwiaXNJdGFsaWMiLCJzZWxlY3Rpb25Gb3JlZ3JvdW5kIiwiZXh0IiwiaXNJbnZpc2libGUiLCJpc0N1cnNvckhpZGRlbiIsImlzRm9jdXNlZCIsImlzRGltIiwidW5kZXJsaW5lU3R5bGUiLCJpc1VuZGVybGluZUNvbG9yRGVmYXVsdCIsImlzVW5kZXJsaW5lQ29sb3JSR0IiLCJ0ZXh0RGVjb3JhdGlvbkNvbG9yIiwiQXR0cmlidXRlRGF0YSIsImdldFVuZGVybGluZUNvbG9yIiwiam9pbiIsImRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzIiwiaXNTdHJpa2V0aHJvdWdoIiwidGV4dERlY29yYXRpb24iLCJnZXRGZ0NvbG9yIiwiZmdDb2xvck1vZGUiLCJnZXRGZ0NvbG9yTW9kZSIsImdldEJnQ29sb3IiLCJiZ0NvbG9yTW9kZSIsImdldEJnQ29sb3JNb2RlIiwiaXNJbnZlcnNlIiwidGVtcCIsInRlbXAyIiwiYmdPdmVycmlkZSIsImZnT3ZlcnJpZGUiLCJyZXNvbHZlZEJnIiwiaXNUb3AiLCJiYWNrZ3JvdW5kQ29sb3JSR0IiLCJyZ2JhIiwiZm9yZWdyb3VuZENvbG9yUkdCIiwiX2FkZFN0eWxlIiwicGFkU3RhcnQiLCJfYXBwbHlNaW5pbXVtQ29udHJhc3QiLCJjbGFzc05hbWUiLCJtaW5pbXVtQ29udHJhc3RSYXRpbyIsInRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciIsImdldENvZGUiLCJjYWNoZSIsIl9nZXRDb250cmFzdENhY2hlIiwiYWRqdXN0ZWRDb2xvciIsImdldENvbG9yIiwicmF0aW8iLCJlbnN1cmVDb250cmFzdFJhdGlvIiwic2V0Q29sb3IiLCJoYWxmQ29udHJhc3RDYWNoZSIsImNvbnRyYXN0Q2FjaGUiLCJwYWRDaGFyIiwiX2ZsYXQiLCJGbG9hdDMyQXJyYXkiLCJfZm9udCIsIl9mb250U2l6ZSIsIl93ZWlnaHQiLCJfd2VpZ2h0Qm9sZCIsIl9tZWFzdXJlRWxlbWVudHMiLCJ3aGl0ZVNwYWNlIiwiZm9udEtlcm5pbmciLCJyZWd1bGFyIiwiYm9sZCIsIml0YWxpYyIsImZvbnRTdHlsZSIsImJvbGRJdGFsaWMiLCJfaG9sZXkiLCJmaWxsIiwiZm9udCIsIndlaWdodCIsIndlaWdodEJvbGQiLCJjcCIsIl9tZWFzdXJlIiwidmFyaWFudCIsIkRJTV9PUEFDSVRZIiwiVEVYVF9CQVNFTElORSIsImlzTGVnYWN5RWRnZSIsImlzUG93ZXJsaW5lR2x5cGgiLCJjb2RlcG9pbnQiLCJpc0Vtb2ppIiwiZ2x5cGhTaXplWCIsImRldmljZUNlbGxXaWR0aCIsImN1cnJlbnRPZmZzZXQiLCJTZWxlY3Rpb25SZW5kZXJNb2RlbCIsInRlcm1pbmFsIiwidmlld3BvcnRZIiwiaXNTZWxlY3RBbGxBY3RpdmUiLCJzZWxlY3Rpb25TdGFydExlbmd0aCIsImZpbmFsU2VsZWN0aW9uU3RhcnQiLCJhcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCIsImZpbmFsU2VsZWN0aW9uRW5kIiwic3RhcnRQbHVzTGVuZ3RoIiwiX29uQ2hhclNpemVDaGFuZ2UiLCJvbkNoYXJTaXplQ2hhbmdlIiwiX21lYXN1cmVTdHJhdGVneSIsIlRleHRNZXRyaWNzTWVhc3VyZVN0cmF0ZWd5IiwiRG9tTWVhc3VyZVN0cmF0ZWd5Iiwib25NdWx0aXBsZU9wdGlvbkNoYW5nZSIsIkJhc2VNZWFzdXJlU3RhdGVneSIsIl9yZXN1bHQiLCJfcGFyZW50RWxlbWVudCIsIl9tZWFzdXJlRWxlbWVudCIsIl92YWxpZGF0ZUFuZFNldCIsIk51bWJlciIsIk9mZnNjcmVlbkNhbnZhcyIsImEiLCJtZWFzdXJlVGV4dCIsIm1ldHJpY3MiLCJmb250Qm91bmRpbmdCb3hBc2NlbnQiLCJmb250Qm91bmRpbmdCb3hEZXNjZW50IiwiZmlyc3RDZWxsIiwiY29udGVudCIsImNvbWJpbmVkRGF0YSIsImlzQ29tYmluZWQiLCJnZXRBc0NoYXJEYXRhIiwiX2NoYXJhY3RlckpvaW5lcnMiLCJfbmV4dENoYXJhY3RlckpvaW5lcklkIiwiam9pbmVyIiwiaWQiLCJyYW5nZXMiLCJsaW5lU3RyIiwicmFuZ2VTdGFydENvbHVtbiIsImN1cnJlbnRTdHJpbmdJbmRleCIsInJhbmdlU3RhcnRTdHJpbmdJbmRleCIsInJhbmdlQXR0ckZHIiwiZ2V0RmciLCJyYW5nZUF0dHJCRyIsImdldEJnIiwiX2dldEpvaW5lZFJhbmdlcyIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsImFsbEpvaW5lZFJhbmdlcyIsImpvaW5lclJhbmdlcyIsIl9tZXJnZVJhbmdlcyIsIl9zdHJpbmdSYW5nZXNUb0NlbGxSYW5nZXMiLCJjdXJyZW50UmFuZ2VJbmRleCIsImN1cnJlbnRSYW5nZVN0YXJ0ZWQiLCJjdXJyZW50UmFuZ2UiLCJnZXRTdHJpbmciLCJuZXdSYW5nZSIsImluUmFuZ2UiLCJfd2luZG93IiwiX2lzRm9jdXNlZCIsIl9jYWNoZWRJc0ZvY3VzZWQiLCJfc2NyZWVuRHByTW9uaXRvciIsIlNjcmVlbkRwck1vbml0b3IiLCJfb25EcHJDaGFuZ2UiLCJfb25XaW5kb3dDaGFuZ2UiLCJvbldpbmRvd0NoYW5nZSIsInNldFdpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJoYXNGb2N1cyIsInF1ZXVlTWljcm90YXNrIiwiX3BhcmVudFdpbmRvdyIsIl93aW5kb3dSZXNpemVMaXN0ZW5lciIsIl9vdXRlckxpc3RlbmVyIiwiX3NldERwckFuZEZpcmVJZkRpZmZlcnMiLCJfY3VycmVudERldmljZVBpeGVsUmF0aW8iLCJfdXBkYXRlRHByIiwiX3NldFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIiwiY2xlYXJMaXN0ZW5lciIsInBhcmVudFdpbmRvdyIsIl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3QiLCJyZW1vdmVMaXN0ZW5lciIsIm1hdGNoTWVkaWEiLCJhZGRMaXN0ZW5lciIsInByb3ZpZGVySW5kZXgiLCJpbmRleE9mIiwiX3JlbmRlcmVyIiwiZGVjb3JhdGlvblNlcnZpY2UiLCJjb3JlQnJvd3NlclNlcnZpY2UiLCJfcGF1c2VkUmVzaXplVGFzayIsIkRlYm91bmNlZElkbGVUYXNrIiwiX29ic2VydmVyRGlzcG9zYWJsZSIsIl9pc1BhdXNlZCIsIl9uZWVkc0Z1bGxSZWZyZXNoIiwiX2lzTmV4dFJlbmRlclJlZHJhd09ubHkiLCJfbmVlZHNTZWxlY3Rpb25SZWZyZXNoIiwiX2NhbnZhc1dpZHRoIiwiX2NhbnZhc0hlaWdodCIsIl9zZWxlY3Rpb25TdGF0ZSIsIl9vbkRpbWVuc2lvbnNDaGFuZ2UiLCJfb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlIiwiX29uUmVmcmVzaFJlcXVlc3QiLCJvblJlZnJlc2hSZXF1ZXN0IiwiX3JlbmRlckRlYm91bmNlciIsIlJlbmRlckRlYm91bmNlciIsIl9mdWxsUmVmcmVzaCIsIl9yZWdpc3RlckludGVyc2VjdGlvbk9ic2VydmVyIiwib2JzZXJ2ZXIiLCJJbnRlcnNlY3Rpb25PYnNlcnZlciIsIl9oYW5kbGVJbnRlcnNlY3Rpb25DaGFuZ2UiLCJ0aHJlc2hvbGQiLCJvYnNlcnZlIiwiZGlzY29ubmVjdCIsImVudHJ5IiwiaXNJbnRlcnNlY3RpbmciLCJpbnRlcnNlY3Rpb25SYXRpbyIsImZsdXNoIiwiaXNSZWRyYXdPbmx5IiwiX2ZpcmVPbkNhbnZhc1Jlc2l6ZSIsInJlbmRlcmVyIiwiTk9OX0JSRUFLSU5HX1NQQUNFX0NIQVIiLCJBTExfTk9OX0JSRUFLSU5HX1NQQUNFX1JFR0VYIiwiUmVnRXhwIiwiX2xpbmtpZmllciIsIl9kcmFnU2Nyb2xsQW1vdW50IiwiX2VuYWJsZWQiLCJfbW91c2VEb3duVGltZVN0YW1wIiwiX29sZEhhc1NlbGVjdGlvbiIsIl9vbGRTZWxlY3Rpb25TdGFydCIsIl9vbGRTZWxlY3Rpb25FbmQiLCJfb25MaW51eE1vdXNlU2VsZWN0aW9uIiwiX29uUmVkcmF3UmVxdWVzdCIsIl9tb3VzZU1vdmVMaXN0ZW5lciIsIl9tb3VzZVVwTGlzdGVuZXIiLCJvblVzZXJJbnB1dCIsIl90cmltTGlzdGVuZXIiLCJvblRyaW0iLCJfaGFuZGxlVHJpbSIsIl9oYW5kbGVCdWZmZXJBY3RpdmF0ZSIsIl9tb2RlbCIsIlNlbGVjdGlvbk1vZGVsIiwiX2FjdGl2ZVNlbGVjdGlvbk1vZGUiLCJfcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzIiwibGluZVRleHQiLCJzdGFydFJvd0VuZENvbCIsImlzTGludXhNb3VzZVNlbGVjdGlvbiIsIl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyIsIl9hcmVDb29yZHNJblNlbGVjdGlvbiIsImFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24iLCJnZXRSYW5nZUxlbmd0aCIsIl9zZWxlY3RXb3JkQXQiLCJoYW5kbGVUcmltIiwidGVybWluYWxIZWlnaHQiLCJtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbiIsInRpbWVTdGFtcCIsIl9oYW5kbGVJbmNyZW1lbnRhbENsaWNrIiwiZGV0YWlsIiwiX2hhbmRsZVNpbmdsZUNsaWNrIiwiX2hhbmRsZURvdWJsZUNsaWNrIiwiX2hhbmRsZVRyaXBsZUNsaWNrIiwiX2FkZE1vdXNlRG93bkxpc3RlbmVycyIsIl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lciIsInNldEludGVydmFsIiwiX2RyYWdTY3JvbGwiLCJjbGVhckludGVydmFsIiwiaGFzV2lkdGgiLCJfc2VsZWN0V29yZEF0Q3Vyc29yIiwiX3NlbGVjdExpbmVBdCIsInByZXZpb3VzU2VsZWN0aW9uRW5kIiwiX3NlbGVjdFRvV29yZEF0IiwiX2dldE1vdXNlRXZlbnRTY3JvbGxBbW91bnQiLCJ0aW1lRWxhcHNlZCIsImFsdENsaWNrTW92ZXNDdXJzb3IiLCJjb29yZGluYXRlcyIsIm1vdmVUb0NlbGxTZXF1ZW5jZSIsIl9maXJlRXZlbnRJZlNlbGVjdGlvbkNoYW5nZWQiLCJfZmlyZU9uU2VsZWN0aW9uQ2hhbmdlIiwiY2hhckluZGV4IiwiX2lzQ2xpY2tJblNlbGVjdGlvbiIsImZvbGxvd1dyYXBwZWRMaW5lc0Fib3ZlIiwiZm9sbG93V3JhcHBlZExpbmVzQmVsb3ciLCJfY29udmVydFZpZXdwb3J0Q29sVG9DaGFyYWN0ZXJJbmRleCIsImNoYXJPZmZzZXQiLCJsZWZ0V2lkZUNoYXJDb3VudCIsInJpZ2h0V2lkZUNoYXJDb3VudCIsImxlZnRMb25nQ2hhck9mZnNldCIsInJpZ2h0TG9uZ0NoYXJPZmZzZXQiLCJjaGFyQXQiLCJfaXNDaGFyV29yZFNlcGFyYXRvciIsInRyaW0iLCJnZXRDb2RlUG9pbnQiLCJwcmV2aW91c0J1ZmZlckxpbmUiLCJwcmV2aW91c0xpbmVXb3JkUG9zaXRpb24iLCJfZ2V0V29yZEF0IiwibmV4dEJ1ZmZlckxpbmUiLCJuZXh0TGluZVdvcmRQb3NpdGlvbiIsIndvcmRQb3NpdGlvbiIsIndvcmRTZXBhcmF0b3IiLCJ3cmFwcGVkUmFuZ2UiLCJnZXRXcmFwcGVkUmFuZ2VGb3JMaW5lIiwiZmlyc3QiLCJsYXN0IiwiY3JlYXRlRGVjb3JhdG9yIiwiREVGQVVMVF9GT1JFR1JPVU5EIiwiREVGQVVMVF9CQUNLR1JPVU5EIiwiREVGQVVMVF9DVVJTT1IiLCJERUZBVUxUX0NVUlNPUl9BQ0NFTlQiLCJERUZBVUxUX1NFTEVDVElPTiIsIkRFRkFVTFRfQU5TSV9DT0xPUlMiLCJmcmVlemUiLCJiIiwidG9Dc3MiLCJ0b1JnYmEiLCJfY29sb3JzIiwiX2NvbnRyYXN0Q2FjaGUiLCJDb2xvckNvbnRyYXN0Q2FjaGUiLCJfaGFsZkNvbnRyYXN0Q2FjaGUiLCJfb25DaGFuZ2VDb2xvcnMiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQiLCJibGVuZCIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50IiwiX3VwZGF0ZVJlc3RvcmVDb2xvcnMiLCJfc2V0VGhlbWUiLCJ0aGVtZSIsInBhcnNlQ29sb3IiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kIiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kIiwiTlVMTF9DT0xPUiIsImlzT3BhcXVlIiwib3BhY2l0eSIsImJsYWNrIiwicmVkIiwiZ3JlZW4iLCJ5ZWxsb3ciLCJibHVlIiwibWFnZW50YSIsImN5YW4iLCJ3aGl0ZSIsImJyaWdodEJsYWNrIiwiYnJpZ2h0UmVkIiwiYnJpZ2h0R3JlZW4iLCJicmlnaHRZZWxsb3ciLCJicmlnaHRCbHVlIiwiYnJpZ2h0TWFnZW50YSIsImJyaWdodEN5YW4iLCJicmlnaHRXaGl0ZSIsImV4dGVuZGVkQW5zaSIsImNvbG9yQ291bnQiLCJzbG90IiwiX3Jlc3RvcmVDb2xvciIsIl9yZXN0b3JlQ29sb3JzIiwiY3NzU3RyaW5nIiwiZmFsbGJhY2siLCJDaXJjdWxhckxpc3QiLCJfbWF4TGVuZ3RoIiwib25EZWxldGVFbWl0dGVyIiwib25EZWxldGUiLCJvbkluc2VydEVtaXR0ZXIiLCJvbkluc2VydCIsIm9uVHJpbUVtaXR0ZXIiLCJfYXJyYXkiLCJBcnJheSIsIl9zdGFydEluZGV4IiwiX2xlbmd0aCIsIm5ld01heExlbmd0aCIsIm5ld0FycmF5IiwiX2dldEN5Y2xpY0luZGV4IiwibmV3TGVuZ3RoIiwicmVjeWNsZSIsImlzRnVsbCIsImRlbGV0ZUNvdW50IiwiaXRlbXMiLCJjb3VudFRvVHJpbSIsImV4cGFuZExpc3RCeSIsImNsb25lIiwidmFsIiwiZGVwdGgiLCJjbG9uZWRPYmplY3QiLCJpc0FycmF5IiwiJHIiLCIkZyIsIiRiIiwiJGEiLCJyZ2IiLCJ0b1BhZGRlZEhleCIsImNvbnRyYXN0UmF0aW8iLCJsMSIsImwyIiwidG9DaGFubmVscyIsImZnUiIsImZnRyIsImZnQiIsImJnUiIsImJnRyIsImJnQiIsInJnYmFDb2xvciIsImZhY3RvciIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJ3aWxsUmVhZEZyZXF1ZW50bHkiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJjcmVhdGVMaW5lYXJHcmFkaWVudCIsIm1hdGNoIiwicmdiYU1hdGNoIiwicGFyc2VGbG9hdCIsImdldEltYWdlRGF0YSIsInJlbGF0aXZlTHVtaW5hbmNlMiIsInJzIiwiZ3MiLCJicyIsInBvdyIsInJlbGF0aXZlTHVtaW5hbmNlIiwicmVkdWNlTHVtaW5hbmNlIiwiYmdSZ2JhIiwiZmdSZ2JhIiwiY3IiLCJpbmNyZWFzZUx1bWluYW5jZSIsImJnTCIsImZnTCIsInJlc3VsdEEiLCJyZXN1bHRBUmF0aW8iLCJyZXN1bHRCIiwiaGFzV3JpdGVTeW5jV2FybkhhcHBlbmVkIiwiX29uU2Nyb2xsQXBpIiwiX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MiLCJfb25CaW5hcnkiLCJvbkJpbmFyeSIsIl9vbkRhdGEiLCJvbkRhdGEiLCJfb25MaW5lRmVlZCIsIl9vblJlc2l6ZSIsIl9vbldyaXRlUGFyc2VkIiwib25Xcml0ZVBhcnNlZCIsIkluc3RhbnRpYXRpb25TZXJ2aWNlIiwiT3B0aW9uc1NlcnZpY2UiLCJCdWZmZXJTZXJ2aWNlIiwiTG9nU2VydmljZSIsIklMb2dTZXJ2aWNlIiwiQ29yZVNlcnZpY2UiLCJDb3JlTW91c2VTZXJ2aWNlIiwiSUNvcmVNb3VzZVNlcnZpY2UiLCJ1bmljb2RlU2VydmljZSIsIlVuaWNvZGVTZXJ2aWNlIiwiSVVuaWNvZGVTZXJ2aWNlIiwiX2NoYXJzZXRTZXJ2aWNlIiwiQ2hhcnNldFNlcnZpY2UiLCJJQ2hhcnNldFNlcnZpY2UiLCJPc2NMaW5rU2VydmljZSIsIklucHV0SGFuZGxlciIsIm9uUmVxdWVzdFNjcm9sbFRvQm90dG9tIiwiX3dyaXRlQnVmZmVyIiwiaGFuZGxlVXNlcklucHV0IiwiX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UiLCJtYXJrUmFuZ2VEaXJ0eSIsInNjcm9sbEJvdHRvbSIsIldyaXRlQnVmZmVyIiwicHJvbWlzZVJlc3VsdCIsInBhcnNlIiwid3JpdGUiLCJtYXhTdWJzZXF1ZW50Q2FsbHMiLCJMb2dMZXZlbEVudW0iLCJXQVJOIiwid3JpdGVTeW5jIiwid2FzVXNlcklucHV0IiwiTUlOSU1VTV9DT0xTIiwiTUlOSU1VTV9ST1dTIiwiZXJhc2VBdHRyIiwic2Nyb2xsIiwicGFnZUNvdW50Iiwic2Nyb2xsVG9Ub3AiLCJzY3JvbGxBbW91bnQiLCJyZWdpc3RlckVzY0hhbmRsZXIiLCJyZWdpc3RlckRjc0hhbmRsZXIiLCJyZWdpc3RlckNzaUhhbmRsZXIiLCJyZWdpc3Rlck9zY0hhbmRsZXIiLCJ3aW5kb3dzUHR5IiwiYnVpbGROdW1iZXIiLCJiYWNrZW5kIiwid2luZG93c01vZGUiLCJfZW5hYmxlV2luZG93c1dyYXBwaW5nSGV1cmlzdGljcyIsImRpc3Bvc2FibGVzIiwidXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUiLCJmaW5hbCIsIl9saXN0ZW5lcnMiLCJfZGlzcG9zZWQiLCJfZXZlbnQiLCJsaXN0ZW5lciIsImFyZzEiLCJhcmcyIiwicXVldWUiLCJjYWxsIiwiY2xlYXJMaXN0ZW5lcnMiLCJmcm9tIiwidG8iLCJHTEVWRUwiLCJNQVhfUEFSU0VCVUZGRVJfTEVOR1RIIiwicGFyYW1Ub1dpbmRvd09wdGlvbiIsIm9wdHMiLCJzZXRXaW5MaW5lcyIsInJlc3RvcmVXaW4iLCJtaW5pbWl6ZVdpbiIsInNldFdpblBvc2l0aW9uIiwic2V0V2luU2l6ZVBpeGVscyIsInJhaXNlV2luIiwibG93ZXJXaW4iLCJyZWZyZXNoV2luIiwic2V0V2luU2l6ZUNoYXJzIiwibWF4aW1pemVXaW4iLCJmdWxsc2NyZWVuV2luIiwiZ2V0V2luU3RhdGUiLCJnZXRXaW5Qb3NpdGlvbiIsImdldFdpblNpemVQaXhlbHMiLCJnZXRTY3JlZW5TaXplUGl4ZWxzIiwiZ2V0Q2VsbFNpemVQaXhlbHMiLCJnZXRXaW5TaXplQ2hhcnMiLCJnZXRTY3JlZW5TaXplQ2hhcnMiLCJnZXRJY29uVGl0bGUiLCJnZXRXaW5UaXRsZSIsInB1c2hUaXRsZSIsInBvcFRpdGxlIiwiJHRlbXAiLCJnZXRBdHRyRGF0YSIsIl9jdXJBdHRyRGF0YSIsIl9jb3JlTW91c2VTZXJ2aWNlIiwiX3VuaWNvZGVTZXJ2aWNlIiwiX3BhcnNlciIsIkVzY2FwZVNlcXVlbmNlUGFyc2VyIiwiX3BhcnNlQnVmZmVyIiwiVWludDMyQXJyYXkiLCJfc3RyaW5nRGVjb2RlciIsIlN0cmluZ1RvVXRmMzIiLCJfdXRmOERlY29kZXIiLCJVdGY4VG9VdGYzMiIsIl93aW5kb3dUaXRsZSIsIl9pY29uTmFtZSIsIl93aW5kb3dUaXRsZVN0YWNrIiwiX2ljb25OYW1lU3RhY2siLCJfZXJhc2VBdHRyRGF0YUludGVybmFsIiwiX29uUmVxdWVzdEJlbGwiLCJfb25SZXF1ZXN0UmVmcmVzaFJvd3MiLCJfb25SZXF1ZXN0UmVzZXQiLCJfb25SZXF1ZXN0U2VuZEZvY3VzIiwiX29uUmVxdWVzdFN5bmNTY3JvbGxCYXIiLCJfb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQiLCJfb25BMTF5Q2hhciIsIl9vbkExMXlUYWIiLCJfb25Db2xvciIsIl9wYXJzZVN0YWNrIiwicGF1c2VkIiwiY3Vyc29yU3RhcnRYIiwiY3Vyc29yU3RhcnRZIiwiZGVjb2RlZExlbmd0aCIsIl9zcGVjaWFsQ29sb3JzIiwiX2RpcnR5Um93VHJhY2tlciIsIkRpcnR5Um93VHJhY2tlciIsInNldENzaUhhbmRsZXJGYWxsYmFjayIsInBhcmFtcyIsImlkZW50aWZpZXIiLCJpZGVudFRvU3RyaW5nIiwidG9BcnJheSIsInNldEVzY0hhbmRsZXJGYWxsYmFjayIsInNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2siLCJjb2RlIiwic2V0T3NjSGFuZGxlckZhbGxiYWNrIiwic2V0RGNzSGFuZGxlckZhbGxiYWNrIiwicGF5bG9hZCIsInNldFByaW50SGFuZGxlciIsInByaW50IiwiaW5zZXJ0Q2hhcnMiLCJpbnRlcm1lZGlhdGVzIiwic2Nyb2xsTGVmdCIsImN1cnNvclVwIiwic2Nyb2xsUmlnaHQiLCJjdXJzb3JEb3duIiwiY3Vyc29yRm9yd2FyZCIsImN1cnNvckJhY2t3YXJkIiwiY3Vyc29yTmV4dExpbmUiLCJjdXJzb3JQcmVjZWRpbmdMaW5lIiwiY3Vyc29yQ2hhckFic29sdXRlIiwiY3Vyc29yUG9zaXRpb24iLCJjdXJzb3JGb3J3YXJkVGFiIiwiZXJhc2VJbkRpc3BsYXkiLCJwcmVmaXgiLCJlcmFzZUluTGluZSIsImluc2VydExpbmVzIiwiZGVsZXRlTGluZXMiLCJkZWxldGVDaGFycyIsInNjcm9sbFVwIiwic2Nyb2xsRG93biIsImVyYXNlQ2hhcnMiLCJjdXJzb3JCYWNrd2FyZFRhYiIsImNoYXJQb3NBYnNvbHV0ZSIsImhQb3NpdGlvblJlbGF0aXZlIiwicmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyIiwic2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5Iiwic2VuZERldmljZUF0dHJpYnV0ZXNTZWNvbmRhcnkiLCJsaW5lUG9zQWJzb2x1dGUiLCJ2UG9zaXRpb25SZWxhdGl2ZSIsImhWUG9zaXRpb24iLCJ0YWJDbGVhciIsInNldE1vZGUiLCJzZXRNb2RlUHJpdmF0ZSIsInJlc2V0TW9kZSIsInJlc2V0TW9kZVByaXZhdGUiLCJjaGFyQXR0cmlidXRlcyIsImRldmljZVN0YXR1cyIsImRldmljZVN0YXR1c1ByaXZhdGUiLCJzb2Z0UmVzZXQiLCJzZXRDdXJzb3JTdHlsZSIsInNldFNjcm9sbFJlZ2lvbiIsInNhdmVDdXJzb3IiLCJ3aW5kb3dPcHRpb25zIiwicmVzdG9yZUN1cnNvciIsImluc2VydENvbHVtbnMiLCJkZWxldGVDb2x1bW5zIiwic2VsZWN0UHJvdGVjdGVkIiwicmVxdWVzdE1vZGUiLCJzZXRFeGVjdXRlSGFuZGxlciIsIkJFTCIsImJlbGwiLCJMRiIsImxpbmVGZWVkIiwiVlQiLCJGRiIsImNhcnJpYWdlUmV0dXJuIiwiQlMiLCJiYWNrc3BhY2UiLCJIVCIsInRhYiIsIlNPIiwic2hpZnRPdXQiLCJTSSIsInNoaWZ0SW4iLCJDMSIsIklORCIsIk5FTCIsIm5leHRMaW5lIiwiSFRTIiwidGFiU2V0IiwiT3NjSGFuZGxlciIsInNldFRpdGxlIiwic2V0SWNvbk5hbWUiLCJzZXRPclJlcG9ydEluZGV4ZWRDb2xvciIsInNldEh5cGVybGluayIsInNldE9yUmVwb3J0RmdDb2xvciIsInNldE9yUmVwb3J0QmdDb2xvciIsInNldE9yUmVwb3J0Q3Vyc29yQ29sb3IiLCJyZXN0b3JlSW5kZXhlZENvbG9yIiwicmVzdG9yZUZnQ29sb3IiLCJyZXN0b3JlQmdDb2xvciIsInJlc3RvcmVDdXJzb3JDb2xvciIsInJldmVyc2VJbmRleCIsImtleXBhZEFwcGxpY2F0aW9uTW9kZSIsImtleXBhZE51bWVyaWNNb2RlIiwiZnVsbFJlc2V0Iiwic2V0Z0xldmVsIiwic2VsZWN0RGVmYXVsdENoYXJzZXQiLCJmbGFnIiwiQ0hBUlNFVFMiLCJzZWxlY3RDaGFyc2V0Iiwic2NyZWVuQWxpZ25tZW50UGF0dGVybiIsInNldEVycm9ySGFuZGxlciIsIkRjc0hhbmRsZXIiLCJyZXF1ZXN0U3RhdHVzU3RyaW5nIiwicCIsIlByb21pc2UiLCJyYWNlIiwicmVzIiwicmVqIiwiY2F0Y2giLCJlcnIiLCJfZ2V0Q3VycmVudExpbmtJZCIsIndhc1BhdXNlZCIsIl9sb2dTbG93UmVzb2x2aW5nQXN5bmMiLCJERUJVRyIsInByb3RvdHlwZSIsInNwbGl0IiwiY2xlYXJSYW5nZSIsImxlbiIsImRlY29kZSIsInN1YmFycmF5IiwiX3ByZXNlcnZlU3RhY2siLCJ2aWV3cG9ydEVuZCIsInZpZXdwb3J0U3RhcnQiLCJjaFdpZHRoIiwiY2hhcnNldCIsIndyYXBhcm91bmRNb2RlIiwid3JhcGFyb3VuZCIsImluc2VydE1vZGUiLCJtb2RlcyIsImN1ckF0dHIiLCJidWZmZXJSb3ciLCJtYXJrRGlydHkiLCJzZXRDZWxsRnJvbUNvZGVwb2ludCIsInByZWNlZGluZ0pvaW5TdGF0ZSIsImNoIiwiY3VycmVudEluZm8iLCJjaGFyUHJvcGVydGllcyIsImV4dHJhY3RXaWR0aCIsInNob3VsZEpvaW4iLCJleHRyYWN0U2hvdWxkSm9pbiIsIm9sZFdpZHRoIiwic3RyaW5nRnJvbUNvZGVQb2ludCIsImFkZExpbmVUb0xpbmsiLCJvbGRSb3ciLCJvbGRDb2wiLCJfZXJhc2VBdHRyRGF0YSIsIkJ1ZmZlckxpbmUiLCJjb3B5Q2VsbHNGcm9tIiwiYWRkQ29kZXBvaW50VG9DZWxsIiwiZGVsdGEiLCJpbnNlcnRDZWxscyIsImdldE51bGxDZWxsIiwiTlVMTF9DRUxMX0NPREUiLCJOVUxMX0NFTExfV0lEVEgiLCJjb252ZXJ0RW9sIiwicmV2ZXJzZVdyYXBhcm91bmQiLCJfcmVzdHJpY3RDdXJzb3IiLCJvcmlnaW5hbFgiLCJuZXh0U3RvcCIsIm1heENvbCIsIl9zZXRDdXJzb3IiLCJkaWZmVG9Ub3AiLCJfbW92ZUN1cnNvciIsImRpZmZUb0JvdHRvbSIsInBhcmFtIiwidGFicyIsInByZXZTdG9wIiwiY2xlYXJXcmFwIiwicmVzcGVjdFByb3RlY3QiLCJyZXBsYWNlQ2VsbHMiLCJjbGVhck1hcmtlcnMiLCJfZXJhc2VJbkJ1ZmZlckxpbmUiLCJfcmVzZXRCdWZmZXJMaW5lIiwic2Nyb2xsQmFja1NpemUiLCJ0cmltU3RhcnQiLCJzY3JvbGxCb3R0b21Sb3dzT2Zmc2V0Iiwic2Nyb2xsQm90dG9tQWJzb2x1dGUiLCJkZWxldGVDZWxscyIsImpvaW5TdGF0ZSIsImlkYXRhIiwiaXRleHQiLCJjb2RlUG9pbnRBdCIsInRsZW5ndGgiLCJjb3B5V2l0aGluIiwiX2lzIiwidGVybSIsInRlcm1OYW1lIiwic2V0Z0NoYXJzZXQiLCJERUZBVUxUX0NIQVJTRVQiLCJhcHBsaWNhdGlvbktleXBhZCIsImFjdGl2ZUVuY29kaW5nIiwiYWN0aXZhdGVBbHRCdWZmZXIiLCJhY3RpdmF0ZU5vcm1hbEJ1ZmZlciIsImRtIiwibW91c2VQcm90b2NvbCIsIm1vdXNlRW5jb2RpbmciLCJjcyIsImIydiIsIm1vZGUiLCJjMSIsImMyIiwiYzMiLCJmcm9tQ29sb3JSR0IiLCJhdHRyIiwiYWNjdSIsImNTcGFjZSIsImFkdmFuY2UiLCJoYXNTdWJQYXJhbXMiLCJzdWJwYXJhbXMiLCJnZXRTdWJQYXJhbXMiLCJfdXBkYXRlQXR0ckNvbG9yIiwidW5kZXJsaW5lQ29sb3IiLCJ1cGRhdGVFeHRlbmRlZCIsIl9wcm9jZXNzU0dSMCIsImwiLCJfcHJvY2Vzc1VuZGVybGluZSIsIl9leHRyYWN0Q29sb3IiLCJzYXZlZFgiLCJzYXZlZFkiLCJzYXZlZEN1ckF0dHJEYXRhIiwic2F2ZWRDaGFyc2V0IiwiaXNCbGlua2luZyIsImJvdHRvbSIsInNlY29uZCIsIl9zYXZlZENoYXJzZXQiLCJzbG90cyIsImlkeCIsInNwZWMiLCJleGVjIiwiaXNWYWxpZENvbG9ySW5kZXgiLCJhcmdzIiwiX2NyZWF0ZUh5cGVybGluayIsIl9maW5pc2hIeXBlcmxpbmsiLCJwYXJzZWRQYXJhbXMiLCJpZFBhcmFtSW5kZXgiLCJmaW5kSW5kZXgiLCJzdGFydHNXaXRoIiwicmVnaXN0ZXJMaW5rIiwiX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yIiwiY29sbGVjdEFuZEZsYWciLCJzY3JvbGxSZWdpb25IZWlnaHQiLCJzaGlmdEVsZW1lbnRzIiwibGV2ZWwiLCJ5T2Zmc2V0IiwibWFya0FsbERpcnR5IiwiaXNQcm90ZWN0ZWQiLCJfZGlzcG9zYWJsZXMiLCJfdmFsdWUiLCJhcnJheSIsIl9kYXRhIiwidGhpcmQiLCJmb3VydGgiLCJpc05vZGUiLCJwcm9jZXNzIiwidXNlckFnZW50IiwibmF2aWdhdG9yIiwicGxhdGZvcm0iLCJpc1NhZmFyaSIsIm1ham9yVmVyc2lvbiIsImlzSXBhZCIsImlzSXBob25lIiwiX2dldEtleSIsIl9zZWFyY2giLCJ2YWx1ZXMiLCJtaWQiLCJtaWRLZXkiLCJUYXNrUXVldWUiLCJfdGFza3MiLCJfaSIsInRhc2siLCJfc3RhcnQiLCJfaWRsZUNhbGxiYWNrIiwiX2NhbmNlbENhbGxiYWNrIiwiX3JlcXVlc3RDYWxsYmFjayIsIl9wcm9jZXNzIiwiZGVhZGxpbmUiLCJ0YXNrRHVyYXRpb24iLCJsb25nZXN0VGFzayIsImxhc3REZWFkbGluZVJlbWFpbmluZyIsInRpbWVSZW1haW5pbmciLCJkZWFkbGluZVJlbWFpbmluZyIsIlByaW9yaXR5VGFza1F1ZXVlIiwiX2NyZWF0ZURlYWRsaW5lIiwiZHVyYXRpb24iLCJJZGxlVGFza1F1ZXVlIiwicmVxdWVzdElkbGVDYWxsYmFjayIsImNhbmNlbElkbGVDYWxsYmFjayIsImNvbnN0cnVjdG9yIiwiX3F1ZXVlIiwiZW5xdWV1ZSIsImxhc3RDaGFyIiwiQ0hBUl9EQVRBX0NPREVfSU5ERVgiLCJXSElURVNQQUNFX0NFTExfQ09ERSIsIkV4dGVuZGVkQXR0cnMiLCJuZXdPYmoiLCJpc0ZnUkdCIiwiaXNCZ1JHQiIsImlzRmdQYWxldHRlIiwiaXNCZ1BhbGV0dGUiLCJpc0ZnRGVmYXVsdCIsImlzQmdEZWZhdWx0IiwiaXNBdHRyaWJ1dGVEZWZhdWx0IiwiaXNFbXB0eSIsImdldFVuZGVybGluZUNvbG9yTW9kZSIsImlzVW5kZXJsaW5lQ29sb3JQYWxldHRlIiwiZ2V0VW5kZXJsaW5lU3R5bGUiLCJnZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0IiwidW5kZXJsaW5lVmFyaWFudE9mZnNldCIsIl91cmxJZCIsIl9leHQiLCJNQVhfQlVGRkVSX1NJWkUiLCJfaGFzU2Nyb2xsYmFjayIsIl9udWxsQ2VsbCIsImZyb21DaGFyRGF0YSIsIk5VTExfQ0VMTF9DSEFSIiwiX3doaXRlc3BhY2VDZWxsIiwiV0hJVEVTUEFDRV9DRUxMX1dJRFRIIiwiX2lzQ2xlYXJpbmciLCJfbWVtb3J5Q2xlYW51cFF1ZXVlIiwiX21lbW9yeUNsZWFudXBQb3NpdGlvbiIsIl9jb2xzIiwiX3Jvd3MiLCJfZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aCIsInNldHVwVGFiU3RvcHMiLCJtYXhMZW5ndGgiLCJyZWxhdGl2ZVkiLCJjb3JyZWN0QnVmZmVyTGVuZ3RoIiwic2Nyb2xsYmFjayIsImZpbGxBdHRyIiwibmV3Q29scyIsIm5ld1Jvd3MiLCJudWxsQ2VsbCIsImRpcnR5TWVtb3J5TGluZXMiLCJhZGRUb1kiLCJhbW91bnRUb1RyaW0iLCJfaXNSZWZsb3dFbmFibGVkIiwiX3JlZmxvdyIsIl9iYXRjaGVkTWVtb3J5Q2xlYW51cCIsIm5vcm1hbFJ1biIsImNvdW50ZWQiLCJjbGVhbnVwTWVtb3J5IiwiX3JlZmxvd0xhcmdlciIsIl9yZWZsb3dTbWFsbGVyIiwidG9SZW1vdmUiLCJyZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlIiwibmV3TGF5b3V0UmVzdWx0IiwicmVmbG93TGFyZ2VyQ3JlYXRlTmV3TGF5b3V0IiwicmVmbG93TGFyZ2VyQXBwbHlOZXdMYXlvdXQiLCJsYXlvdXQiLCJfcmVmbG93TGFyZ2VyQWRqdXN0Vmlld3BvcnQiLCJjb3VudFJlbW92ZWQiLCJ2aWV3cG9ydEFkanVzdG1lbnRzIiwidG9JbnNlcnQiLCJjb3VudFRvSW5zZXJ0Iiwid3JhcHBlZExpbmVzIiwiYWJzb2x1dGVZIiwibGFzdExpbmVMZW5ndGgiLCJkZXN0TGluZUxlbmd0aHMiLCJyZWZsb3dTbWFsbGVyR2V0TmV3TGluZUxlbmd0aHMiLCJsaW5lc1RvQWRkIiwidHJpbW1lZExpbmVzIiwibmV3TGluZXMiLCJuZXdMaW5lIiwiZGVzdExpbmVJbmRleCIsImRlc3RDb2wiLCJzcmNMaW5lSW5kZXgiLCJzcmNDb2wiLCJjZWxsc1RvQ29weSIsIndyYXBwZWRMaW5lc0luZGV4IiwiZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoIiwic2V0Q2VsbCIsImluc2VydEV2ZW50cyIsIm9yaWdpbmFsTGluZXMiLCJvcmlnaW5hbExpbmVzTGVuZ3RoIiwib3JpZ2luYWxMaW5lSW5kZXgiLCJuZXh0VG9JbnNlcnRJbmRleCIsIm5leHRUb0luc2VydCIsImNvdW50SW5zZXJ0ZWRTb0ZhciIsIm5leHRJIiwiaW5zZXJ0Q291bnRFbWl0dGVkIiwibGluZUluZGV4IiwidHJpbVJpZ2h0IiwidGFiU3RvcFdpZHRoIiwiTWFya2VyIiwiX3JlbW92ZU1hcmtlciIsIiRzdGFydEluZGV4IiwiZmlsbENlbGxEYXRhIiwiX2NvbWJpbmVkIiwiX2V4dGVuZGVkQXR0cnMiLCJDSEFSX0RBVEFfQVRUUl9JTkRFWCIsIkNIQVJfREFUQV9DSEFSX0lOREVYIiwiQ0hBUl9EQVRBX1dJRFRIX0lOREVYIiwiY29kZVBvaW50IiwiYXR0cnMiLCJieXRlTGVuZ3RoIiwidWludDMyQ2VsbHMiLCJrZXlzIiwiZXh0S2V5cyIsInNyYyIsImFwcGx5SW5SZXZlcnNlIiwic3JjRGF0YSIsInNyY0NvbWJpbmVkS2V5cyIsIm91dENvbHVtbnMiLCJidWZmZXJDb2xzIiwiZW5kc0luTnVsbCIsImZvbGxvd2luZ0xpbmVTdGFydHNXaXRoV2lkZSIsIm9sZENvbHMiLCJidWZmZXJBYnNvbHV0ZVkiLCJzcmNUcmltbWVkVGluZUxlbmd0aCIsInNyY1JlbWFpbmluZ0NlbGxzIiwiZGVzdFJlbWFpbmluZ0NlbGxzIiwiY291bnRUb1JlbW92ZSIsIm5leHRUb1JlbW92ZUluZGV4IiwibmV4dFRvUmVtb3ZlU3RhcnQiLCJjb3VudFJlbW92ZWRTb0ZhciIsIm5ld0xheW91dCIsIm5ld0xheW91dExpbmVzIiwibmV3TGluZUxlbmd0aHMiLCJjZWxsc05lZWRlZCIsInJlZHVjZSIsInNyY0xpbmUiLCJjZWxsc0F2YWlsYWJsZSIsIm9sZFRyaW1tZWRMZW5ndGgiLCJlbmRzV2l0aFdpZGUiLCJCdWZmZXJTZXQiLCJfb25CdWZmZXJBY3RpdmF0ZSIsIl9ub3JtYWwiLCJCdWZmZXIiLCJmaWxsVmlld3BvcnRSb3dzIiwiX2FsdCIsImluYWN0aXZlQnVmZmVyIiwib2JqIiwic2V0RnJvbUNoYXJEYXRhIiwiY29tYmluZWQiLCJERUZBVUxUX0NPTE9SIiwiREVGQVVMVF9BVFRSIiwiREVGQVVMVF9FWFQiLCJfaWQiLCJpc0Rpc3Bvc2VkIiwiX25leHRJZCIsIl9vbkRpc3Bvc2UiLCJkaXNwb3NhYmxlIiwiQyIsIk5VTCIsIlNPSCIsIlNUWCIsIkVPVCIsIkVOUSIsIkFDSyIsIkRMRSIsIkRDMSIsIkRDMiIsIkRDMyIsIkRDNCIsIk5BSyIsIlNZTiIsIkVUQiIsIkNBTiIsIkVNIiwiU1VCIiwiRlMiLCJHUyIsIlJTIiwiVVMiLCJTUCIsIlBBRCIsIkhPUCIsIkJQSCIsIk5CSCIsIlNTQSIsIkVTQSIsIkhUSiIsIlZUUyIsIlBMRCIsIlBMVSIsIlJJIiwiU1MyIiwiU1MzIiwiRENTIiwiUFUxIiwiUFUyIiwiU1RTIiwiQ0NIIiwiTVciLCJTUEEiLCJFUEEiLCJTT1MiLCJTR0NJIiwiU0NJIiwiQ1NJIiwiT1NDIiwiUE0iLCJBUEMiLCJLRVlDT0RFX0tFWV9NQVBQSU5HUyIsImFwcGxpY2F0aW9uQ3Vyc29yTW9kZSIsIm1vZGlmaWVycyIsImtleU1hcHBpbmciLCJrZXlTdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInRvTG93ZXJDYXNlIiwiX2ludGVyaW0iLCJzdGFydFBvcyIsImludGVyaW0iLCJVaW50OEFycmF5IiwiYnl0ZTEiLCJieXRlMiIsImJ5dGUzIiwiYnl0ZTQiLCJkaXNjYXJkSW50ZXJpbSIsInRtcCIsIm1pc3NpbmciLCJmb3VyU3RvcCIsIkJNUF9DT01CSU5JTkciLCJISUdIX0NPTUJJTklORyIsInRhYmxlIiwidmVyc2lvbiIsIm51bSIsInVjcyIsInByZWNlZGluZyIsIndjd2lkdGgiLCJjcmVhdGVQcm9wZXJ0eVZhbHVlIiwiX2FjdGlvbiIsIl9jYWxsYmFja3MiLCJfcGVuZGluZ0RhdGEiLCJfYnVmZmVyT2Zmc2V0IiwiX2lzU3luY1dyaXRpbmciLCJfc3luY0NhbGxzIiwiX2RpZFVzZXJJbnB1dCIsImNodW5rIiwiY2IiLCJfaW5uZXJXcml0ZSIsImxhc3RUaW1lIiwiY29udGludWF0aW9uIiwicmVzb2x2ZSIsInRoZW4iLCJSR0JfUkVYIiwiSEFTSF9SRVgiLCJwYWQiLCJiaXRzIiwiczIiLCJsb3ciLCJiYXNlIiwiYWR2IiwiUEFZTE9BRF9MSU1JVCIsIkVNUFRZX0hBTkRMRVJTIiwiX2hhbmRsZXJzIiwiY3JlYXRlIiwiX2FjdGl2ZSIsIl9pZGVudCIsIl9oYW5kbGVyRmIiLCJfc3RhY2siLCJsb29wUG9zaXRpb24iLCJmYWxsVGhyb3VnaCIsImhhbmRsZXJMaXN0IiwiaGFuZGxlckluZGV4IiwidW5ob29rIiwiaG9vayIsInB1dCIsInV0ZjMyVG9TdHJpbmciLCJzdWNjZXNzIiwiaGFuZGxlclJlc3VsdCIsIkVNUFRZX1BBUkFNUyIsIlBhcmFtcyIsImFkZFBhcmFtIiwiX2hhbmRsZXIiLCJfcGFyYW1zIiwiX2hpdExpbWl0IiwicmV0IiwiVHJhbnNpdGlvblRhYmxlIiwibmV4dCIsImNvZGVzIiwiTk9OX0FTQ0lJX1BSSU5UQUJMRSIsIlZUNTAwX1RSQU5TSVRJT05fVEFCTEUiLCJibHVlcHJpbnQiLCJhcHBseSIsInVudXNlZCIsIlBSSU5UQUJMRVMiLCJFWEVDVVRBQkxFUyIsInN0YXRlcyIsInNldERlZmF1bHQiLCJhZGRNYW55IiwiX3RyYW5zaXRpb25zIiwiaGFuZGxlcnMiLCJoYW5kbGVyUG9zIiwidHJhbnNpdGlvbiIsImNodW5rUG9zIiwiaW5pdGlhbFN0YXRlIiwiY3VycmVudFN0YXRlIiwiX2NvbGxlY3QiLCJfcHJpbnRIYW5kbGVyRmIiLCJfZXhlY3V0ZUhhbmRsZXJGYiIsIl9jc2lIYW5kbGVyRmIiLCJfZXNjSGFuZGxlckZiIiwiX2Vycm9ySGFuZGxlckZiIiwiX3ByaW50SGFuZGxlciIsIl9leGVjdXRlSGFuZGxlcnMiLCJfY3NpSGFuZGxlcnMiLCJfZXNjSGFuZGxlcnMiLCJfb3NjUGFyc2VyIiwiT3NjUGFyc2VyIiwiX2Rjc1BhcnNlciIsIkRjc1BhcnNlciIsIl9lcnJvckhhbmRsZXIiLCJmaW5hbFJhbmdlIiwiaW50ZXJtZWRpYXRlIiwiZmluYWxDb2RlIiwicmV2ZXJzZSIsImNsZWFyUHJpbnRIYW5kbGVyIiwiX2lkZW50aWZpZXIiLCJyZWdpc3RlckhhbmRsZXIiLCJjbGVhckhhbmRsZXIiLCJzZXRIYW5kbGVyRmFsbGJhY2siLCJjbGVhckVycm9ySGFuZGxlciIsImNvbGxlY3QiLCJhYm9ydCIsImFkZFN1YlBhcmFtIiwiYWRkRGlnaXQiLCJoYW5kbGVyc0VzYyIsImpqIiwiX3N0YXRlIiwiX3B1dCIsIk1BWF9WQUxVRSIsImsiLCJtYXhTdWJQYXJhbXNMZW5ndGgiLCJJbnQzMkFycmF5IiwiX3N1YlBhcmFtcyIsIl9zdWJQYXJhbXNMZW5ndGgiLCJfc3ViUGFyYW1zSWR4IiwiVWludDE2QXJyYXkiLCJfcmVqZWN0RGlnaXRzIiwiX3JlamVjdFN1YkRpZ2l0cyIsIl9kaWdpdElzU3ViIiwibmV3UGFyYW1zIiwiZ2V0U3ViUGFyYW1zQWxsIiwic3RvcmUiLCJjdXIiLCJfYWRkb25zIiwiaW5zdGFuY2UiLCJsb2FkZWRBZGRvbiIsIl93cmFwcGVkQWRkb25EaXNwb3NlIiwiX2J1ZmZlciIsImJhc2VZIiwiQnVmZmVyTGluZUFwaVZpZXciLCJfbGluZSIsInN0YXJ0Q29sdW1uIiwiZW5kQ29sdW1uIiwiQnVmZmVyTmFtZXNwYWNlQXBpIiwiX2NvcmUiLCJfb25CdWZmZXJDaGFuZ2UiLCJvbkJ1ZmZlckNoYW5nZSIsIkJ1ZmZlckFwaVZpZXciLCJfYWx0ZXJuYXRlIiwiYWx0ZXJuYXRlIiwiaW5pdCIsInByb3ZpZGVyIiwidmVyc2lvbnMiLCJhY3RpdmVWZXJzaW9uIiwiaXNVc2VyU2Nyb2xsaW5nIiwiX2NhY2hlZEJsYW5rTGluZSIsInRvcFJvdyIsImJvdHRvbVJvdyIsIndpbGxCdWZmZXJCZVRyaW1tZWQiLCJjb3B5RnJvbSIsIm9sZFlkaXNwIiwiZ2xldmVsIiwiX2NoYXJzZXRzIiwiREVGQVVMVF9QUk9UT0NPTFMiLCJOT05FIiwicmVzdHJpY3QiLCJYMTAiLCJWVDIwMCIsIkRSQUciLCJBTlkiLCJldmVudENvZGUiLCJpc1NHUiIsIkRFRkFVTFRfRU5DT0RJTkdTIiwiREVGQVVMVCIsIlNHUiIsIlNHUl9QSVhFTFMiLCJfcHJvdG9jb2xzIiwiX2VuY29kaW5ncyIsIl9hY3RpdmVQcm90b2NvbCIsIl9hY3RpdmVFbmNvZGluZyIsIl9sYXN0RXZlbnQiLCJfb25Qcm90b2NvbENoYW5nZSIsIm5hbWUiLCJhZGRQcm90b2NvbCIsImFkZEVuY29kaW5nIiwiZW5jb2RpbmciLCJfZXF1YWxFdmVudHMiLCJyZXBvcnQiLCJ0cmlnZ2VyQmluYXJ5RXZlbnQiLCJkb3duIiwidXAiLCJkcmFnIiwibW92ZSIsImUxIiwiZTIiLCJwaXhlbHMiLCJERUZBVUxUX01PREVTIiwiREVGQVVMVF9ERUNfUFJJVkFURV9NT0RFUyIsIl9vblVzZXJJbnB1dCIsIl9vblJlcXVlc3RTY3JvbGxUb0JvdHRvbSIsImRpc2FibGVTdGRpbiIsIiR4bWluIiwiJHhtYXgiLCJfZGVjb3JhdGlvbnMiLCJTb3J0ZWRMaXN0IiwiX29uRGVjb3JhdGlvblJlZ2lzdGVyZWQiLCJfb25EZWNvcmF0aW9uUmVtb3ZlZCIsIkRlY29yYXRpb24iLCJtYXJrZXJEaXNwb3NlIiwiaW5zZXJ0IiwieG1pbiIsInhtYXgiLCJnZXRLZXlJdGVyYXRvciIsImZvckVhY2hCeUtleSIsIl9jYWNoZWRCZyIsIl9jYWNoZWRGZyIsImZvcmVncm91bmRDb2xvciIsIlNlcnZpY2VDb2xsZWN0aW9uIiwiX2VudHJpZXMiLCJzZXJ2aWNlIiwiX3NlcnZpY2VzIiwiY3RvciIsInNlcnZpY2VEZXBlbmRlbmNpZXMiLCJnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzIiwic29ydCIsInNlcnZpY2VBcmdzIiwiZGVwZW5kZW5jeSIsImZpcnN0U2VydmljZUFyZ1BvcyIsIm9wdGlvbnNLZXlUb0xvZ0xldmVsIiwidHJhY2UiLCJUUkFDRSIsImluZm8iLCJJTkZPIiwiRVJST1IiLCJvZmYiLCJPRkYiLCJ0cmFjZUxvZ2dlciIsIl9sb2dMZXZlbCIsIl91cGRhdGVMb2dMZXZlbCIsIm9wdGlvbmFsUGFyYW1zIiwibWVzc2FnZSIsIl9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zIiwibG9nZ2VyIiwiX2xvZyIsImxvZyIsIl90YXJnZXQiLCJkZXNjcmlwdG9yIiwiZm4iLCJKU09OIiwic3RyaW5naWZ5IiwiREVGQVVMVF9PUFRJT05TIiwiY3VzdG9tR2x5cGhzIiwiYWxsb3dQcm9wb3NlZEFwaSIsImFsbG93VHJhbnNwYXJlbmN5IiwicmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzIiwiRk9OVF9XRUlHSFRfT1BUSU9OUyIsIl9vbk9wdGlvbkNoYW5nZSIsImRlZmF1bHRPcHRpb25zIiwiX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24iLCJfc2V0dXBPcHRpb25zIiwiZXZlbnRLZXkiLCJnZXR0ZXIiLCJwcm9wTmFtZSIsInNldHRlciIsImRlc2MiLCJkZWZpbmVQcm9wZXJ0eSIsIl9lbnRyaWVzV2l0aElkIiwiX2RhdGFCeUxpbmtJZCIsIl9yZW1vdmVNYXJrZXJGcm9tTGluayIsImNhc3REYXRhIiwiX2dldEVudHJ5SWRLZXkiLCJsaW5rSWQiLCJldmVyeSIsImxpbmtEYXRhIiwiRElfVEFSR0VUIiwiRElfREVQRU5ERU5DSUVTIiwic2VydmljZVJlZ2lzdHJ5IiwiZGVjb3JhdG9yIiwiYXJndW1lbnRzIiwiX3Byb3ZpZGVycyIsIl9vbkNoYW5nZSIsIm9uQ2hhbmdlIiwiZGVmYXVsdFByb3ZpZGVyIiwiVW5pY29kZVY2IiwiX2FjdGl2ZVByb3ZpZGVyIiwicHJlY2VkaW5nSW5mbyIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsImV4cG9ydHMiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiQ09OU1RSVUNUT1JfT05MWV9PUFRJT05TIiwiX2FkZG9uTWFuYWdlciIsIkFkZG9uTWFuYWdlciIsIl9wdWJsaWNPcHRpb25zIiwiX2NoZWNrUmVhZG9ubHlPcHRpb25zIiwiX2NoZWNrUHJvcG9zZWRBcGkiLCJwYXJzZXIiLCJQYXJzZXJBcGkiLCJVbmljb2RlQXBpIiwibW91c2VUcmFja2luZ01vZGUiLCJhcHBsaWNhdGlvbkN1cnNvcktleXNNb2RlIiwiYXBwbGljYXRpb25LZXlwYWRNb2RlIiwib3JpZ2luTW9kZSIsInJldmVyc2VXcmFwYXJvdW5kTW9kZSIsInNlbmRGb2N1c01vZGUiLCJfdmVyaWZ5SW50ZWdlcnMiLCJhdHRhY2hDdXN0b21LZXlFdmVudEhhbmRsZXIiLCJhdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlciIsInJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyIiwiZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lciIsInJlZ2lzdGVyTWFya2VyIiwiX3ZlcmlmeVBvc2l0aXZlSW50ZWdlcnMiLCJzY3JvbGxQYWdlcyIsInNjcm9sbFRvTGluZSIsImFkZG9uIiwibG9hZEFkZG9uIiwiSW5maW5pdHkiLCJmaXQiLCJkaW1zIiwicHJvcG9zZURpbWVuc2lvbnMiLCJjb3JlIiwic2Nyb2xsYmFyV2lkdGgiLCJwYXJlbnRFbGVtZW50U3R5bGUiLCJwYXJlbnRFbGVtZW50SGVpZ2h0IiwicGFyZW50RWxlbWVudFdpZHRoIiwiYXZhaWxhYmxlSGVpZ2h0IiwiYXZhaWxhYmxlV2lkdGgiLCJpc1VybCIsInVybFN0cmluZyIsInVybCIsInBhcnNlZEJhc2UiLCJwYXNzd29yZCIsInVzZXJuYW1lIiwiaG9zdCIsInRvTG9jYWxlTG93ZXJDYXNlIiwiX3JlZ2V4IiwiX29wdGlvbnMiLCJMaW5rQ29tcHV0ZXIiLCJjb21wdXRlTGluayIsIl9hZGRDYWxsYmFja3MiLCJyZWdleCIsInJleCIsImZsYWdzIiwic3RhcnRMaW5lSW5kZXgiLCJfZ2V0V2luZG93ZWRMaW5lU3RyaW5ncyIsIl9tYXBTdHJJZHgiLCJlbmRZIiwidG9wSWR4IiwiYm90dG9tSWR4IiwiZ2V0TGluZSIsImN1cnJlbnRDb250ZW50Iiwicm93SW5kZXgiLCJzdHJpbmdJbmRleCIsImJ1ZiIsImdldENlbGwiLCJzdHJpY3RVcmxSZWdleCIsImhhbmRsZUxpbmsiLCJ1cmxSZWdleCIsIl9saW5rUHJvdmlkZXIiLCJXZWJMaW5rUHJvdmlkZXIiLCJCYXNlUmVuZGVyTGF5ZXIiLCJjYWNoZUNhbnZhcyIsIl9jaGFyQXRsYXMiLCJwYWdlcyIsIl9hbHBoYSIsIl9kZXZpY2VDaGFyV2lkdGgiLCJfZGV2aWNlQ2hhckhlaWdodCIsIl9kZXZpY2VDZWxsV2lkdGgiLCJfZGV2aWNlQ2VsbEhlaWdodCIsIl9kZXZpY2VDaGFyTGVmdCIsIl9kZXZpY2VDaGFyVG9wIiwiX3NlbGVjdGlvbk1vZGVsIiwiX2JpdG1hcEdlbmVyYXRvciIsIl9jaGFyQXRsYXNEaXNwb3NhYmxlIiwiX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzIiwib25BZGRUZXh0dXJlQXRsYXNDYW52YXMiLCJfY2VsbENvbG9yUmVzb2x2ZXIiLCJDZWxsQ29sb3JSZXNvbHZlciIsIl9pbml0Q2FudmFzIiwiX3JlZnJlc2hDaGFyQXRsYXMiLCJ0aHJvd0lmRmFsc3kiLCJhbHBoYSIsIl9jbGVhckFsbCIsIm9sZENhbnZhcyIsImNsb25lTm9kZSIsInJlcGxhY2VDaGlsZCIsImhhbmRsZUdyaWRDaGFuZ2VkIiwiY29sb3JTZXQiLCJhY3F1aXJlVGV4dHVyZUF0bGFzIiwid2FybVVwIiwiQml0bWFwR2VuZXJhdG9yIiwiZGltIiwiY2xlYXJUZXh0dXJlIiwiY2VsbE9mZnNldCIsInBpeGVsT2Zmc2V0Iiwic2F2ZSIsImJlZ2luUGF0aCIsInN0cm9rZVN0eWxlIiwieE9mZnNldCIsInhMZWZ0IiwieE1pZCIsInhSaWdodCIsInlNaWQiLCJ5TWlkQm90IiwieU1pZFRvcCIsIm1vdmVUbyIsImJlemllckN1cnZlVG8iLCJzdHJva2UiLCJyZXN0b3JlIiwic2V0TGluZURhc2giLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2VSZWN0IiwiX2dldEZvbnQiLCJ0ZXh0QmFzZWxpbmUiLCJfY2xpcFJvdyIsImRyYXdTdWNjZXNzIiwidHJ5RHJhd0N1c3RvbUNoYXIiLCJmaWxsVGV4dCIsImdseXBoIiwiZ2V0UmFzdGVyaXplZEdseXBoQ29tYmluZWRDaGFyIiwiZ2V0UmFzdGVyaXplZEdseXBoIiwidGV4dHVyZVBhZ2UiLCJiaXRtYXAiLCJjbG9zZSIsImRyYXdJbWFnZSIsInRleHR1cmVQb3NpdGlvbiIsImNsaXAiLCJfYml0bWFwIiwiX2NvbW1pdFRpbWVvdXQiLCJfZ2VuZXJhdGUiLCJjcmVhdGVJbWFnZUJpdG1hcCIsIkNhbnZhc1JlbmRlcmVyIiwibGlua2lmaWVyMiIsImNoYXJhY3RlckpvaW5lclNlcnZpY2UiLCJfb25SZXF1ZXN0UmVkcmF3IiwiX29uQ2hhbmdlVGV4dHVyZUF0bGFzIiwib25DaGFuZ2VUZXh0dXJlQXRsYXMiLCJfcmVuZGVyTGF5ZXJzIiwiVGV4dFJlbmRlckxheWVyIiwiU2VsZWN0aW9uUmVuZGVyTGF5ZXIiLCJMaW5rUmVuZGVyTGF5ZXIiLCJDdXJzb3JSZW5kZXJMYXllciIsIl9kZXZpY2VQaXhlbFJhdGlvIiwib2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyIsIl9zZXRDYW52YXNEZXZpY2VQaXhlbERpbWVuc2lvbnMiLCJyZW1vdmVUZXJtaW5hbEZyb21DYWNoZSIsInRleHR1cmVBdGxhcyIsIl9ydW5PcGVyYXRpb24iLCJvcGVyYXRpb24iLCJfcmVxdWVzdFJlZHJhd1ZpZXdwb3J0IiwiY29udGFpbmVyIiwiX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIiwiX2NlbGwiLCJfY3Vyc29yUmVuZGVyZXJzIiwiX3JlbmRlckJhckN1cnNvciIsIl9yZW5kZXJCbG9ja0N1cnNvciIsIl9yZW5kZXJVbmRlcmxpbmVDdXJzb3IiLCJfcmVuZGVyT3V0bGluZUN1cnNvciIsIl9jbGVhckN1cnNvciIsInJlc3RhcnRCbGlua0FuaW1hdGlvbiIsInBhdXNlIiwicmVzdW1lIiwiQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIiLCJfcmVuZGVyIiwiaXNQYXVzZWQiLCJ0cmlnZ2VyZWRCeUFuaW1hdGlvbkZyYW1lIiwidmlld3BvcnRSZWxhdGl2ZUN1cnNvclkiLCJpc0N1cnNvclZpc2libGUiLCJfY2xlYXJDZWxscyIsIl9maWxsTGVmdExpbmVBdENlbGwiLCJfZmlsbENlbGxzIiwiX2ZpbGxDaGFyVHJ1ZUNvbG9yIiwiX2ZpbGxCb3R0b21MaW5lQXRDZWxscyIsIl9zdHJva2VSZWN0QXRDZWxsIiwiX2hhbmRsZVNob3dMaW5rVW5kZXJsaW5lIiwiX2hhbmRsZUhpZGVMaW5rVW5kZXJsaW5lIiwibWlkZGxlUm93Q291bnQiLCJpczI1NkNvbG9yIiwiX2NsZWFyU3RhdGUiLCJfcmVkcmF3U2VsZWN0aW9uIiwiX2RpZFN0YXRlQ2hhbmdlIiwiX2FyZUNvb3JkaW5hdGVzRXF1YWwiLCJjb29yZDEiLCJjb29yZDIiLCJfY2hhcmFjdGVyV2lkdGgiLCJfY2hhcmFjdGVyRm9udCIsIl9jaGFyYWN0ZXJPdmVybGFwQ2FjaGUiLCJHcmlkQ2FjaGUiLCJfc2V0VHJhbnNwYXJlbmN5IiwidGVybWluYWxGb250IiwiZmlyc3RSb3ciLCJsYXN0Um93IiwiX2lzT3ZlcmxhcHBpbmciLCJwcmV2RmlsbFN0eWxlIiwiX2ZvckVhY2hDZWxsIiwibmV4dEZpbGxTdHlsZSIsIl9kcmF3Q2hhcnMiLCJiZWdpbkZyYW1lIiwiX2RyYXdCYWNrZ3JvdW5kIiwiX2RyYXdGb3JlZ3JvdW5kIiwiaGFzT3duUHJvcGVydHkiLCJvdmVybGFwcyIsIiRjb2xvcnMiLCIkZmciLCIkYmciLCIkaGFzRmciLCIkaGFzQmciLCIkaXNTZWxlY3RlZCIsIiR2YXJpYW50T2Zmc2V0IiwiX29wdGlvblNlcnZpY2UiLCJpc0NlbGxTZWxlY3RlZCIsImNoYXJBdGxhc0NhY2hlIiwiZGV2aWNlQ2VsbEhlaWdodCIsImRldmljZUNoYXJXaWR0aCIsImRldmljZUNoYXJIZWlnaHQiLCJuZXdDb25maWciLCJnZW5lcmF0ZUNvbmZpZyIsIm93bmVkQnlJbmRleCIsIm93bmVkQnkiLCJjb25maWdFcXVhbHMiLCJjb25maWciLCJhdGxhcyIsIm5ld0VudHJ5IiwiVGV4dHVyZUF0bGFzIiwiY2xvbmVkQ29sb3JzIiwiY29sb3JDb2RlIiwiX3Jlc3RhcnRJbnRlcnZhbCIsIl9ibGlua1N0YXJ0VGltZW91dCIsIl9ibGlua0ludGVydmFsIiwiX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQiLCJ0aW1lVG9TdGFydCIsIkJMSU5LX0lOVEVSVkFMIiwidGltZSIsImJsb2NrRWxlbWVudERlZmluaXRpb25zIiwicGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zIiwiYm94RHJhd2luZ0RlZmluaXRpb25zIiwieHAiLCJ5cCIsInBvd2VybGluZURlZmluaXRpb25zIiwicmlnaHRQYWRkaW5nIiwiYmxvY2tFbGVtZW50RGVmaW5pdGlvbiIsImNoYXJEZWZpbml0aW9uIiwiYm94IiwieEVpZ2h0aCIsInlFaWdodGgiLCJwYXR0ZXJuRGVmaW5pdGlvbiIsInBhdHRlcm5TZXQiLCJjYWNoZWRQYXR0ZXJucyIsInBhdHRlcm4iLCJ0bXBDYW52YXMiLCJ0bXBDdHgiLCJpbWFnZURhdGEiLCJJbWFnZURhdGEiLCJwdXRJbWFnZURhdGEiLCJjcmVhdGVQYXR0ZXJuIiwiYm94RHJhd2luZ0RlZmluaXRpb24iLCJpbnN0cnVjdGlvbnMiLCJhY3R1YWxJbnN0cnVjdGlvbnMiLCJpbnN0cnVjdGlvbiIsInN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXAiLCJ0cmFuc2xhdGVBcmdzIiwicG93ZXJsaW5lRGVmaW5pdGlvbiIsImNsaXBSZWdpb24iLCJQYXRoMkQiLCJjc3NMaW5lV2lkdGgiLCJjbGFtcCIsImRvQ2xhbXAiLCJSZXNpemVPYnNlcnZlciIsImRldmljZVBpeGVsQ29udGVudEJveFNpemUiLCJpbmxpbmVTaXplIiwiYmxvY2tTaXplIiwiTlVMTF9SQVNURVJJWkVEX0dMWVBIIiwidGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlIiwic2l6ZUNsaXBTcGFjZSIsIiRnbHlwaCIsIl9wYWdlcyIsIl9jb25maWciLCJfZGlkV2FybVVwIiwiX2NhY2hlTWFwIiwiRm91cktleU1hcCIsIl9jYWNoZU1hcENvbWJpbmVkIiwiX2FjdGl2ZVBhZ2VzIiwiX3dvcmtCb3VuZGluZ0JveCIsIl93b3JrQXR0cmlidXRlRGF0YSIsIl90ZXh0dXJlU2l6ZSIsIl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyIsIm9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzIiwiX3JlcXVlc3RDbGVhck1vZGVsIiwiX2NyZWF0ZU5ld1BhZ2UiLCJfdG1wQ2FudmFzIiwiY3JlYXRlQ2FudmFzIiwiVE1QX0NBTlZBU19HTFlQSF9QQURESU5HIiwiX3RtcEN0eCIsInBhZ2UiLCJfZG9XYXJtVXAiLCJyYXN0ZXJpemVkR2x5cGgiLCJfZHJhd1RvQ2FjaGUiLCJtYXhBdGxhc1BhZ2VzIiwicGFnZXNCeVNpemUiLCJmaWx0ZXIiLCJtYXhUZXh0dXJlU2l6ZSIsInBlcmNlbnRhZ2VVc2VkIiwic2FtZVNpemVJIiwibWVyZ2luZ1BhZ2VzIiwic29ydGVkTWVyZ2luZ1BhZ2VzSW5kZXhlcyIsImdseXBocyIsIm1lcmdlZFBhZ2VJbmRleCIsIm1lcmdlZFBhZ2UiLCJfbWVyZ2VQYWdlcyIsIl9kZWxldGVQYWdlIiwibmV3UGFnZSIsIkF0bGFzUGFnZSIsIm1lcmdlZFNpemUiLCJwYWdlSW5kZXgiLCJhZGp1c3RpbmdQYWdlIiwicmVzdHJpY3RUb0NlbGxIZWlnaHQiLCJfZ2V0RnJvbUNhY2hlTWFwIiwiY2FjaGVNYXAiLCJiZ0NvbG9yIiwiaW52ZXJzZSIsIl9nZXRDb2xvckZyb21BbnNpSW5kZXgiLCJhcnIiLCJmZ0NvbG9yIiwiZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kcyIsIm1pbmltdW1Db250cmFzdENvbG9yIiwiX2dldE1pbmltdW1Db250cmFzdENvbG9yIiwiX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYSIsIl9yZXNvbHZlRm9yZWdyb3VuZFJnYmEiLCJjb2RlT3JDaGFycyIsImFsbG93ZWRXaWR0aCIsImFsbG93ZWRIZWlnaHQiLCJzdHJpa2V0aHJvdWdoIiwib3ZlcmxpbmUiLCJfZ2V0QmFja2dyb3VuZENvbG9yIiwicG93ZXJsaW5lR2x5cGgiLCJyZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgiLCJpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCIsIl9nZXRGb3JlZ3JvdW5kQ29sb3IiLCJjdXN0b21HbHlwaCIsImVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2siLCJnZXRTdHJpbmdDZWxsV2lkdGgiLCJ5VG9wIiwieUJvdCIsIm5leHRPZmZzZXQiLCJ4Q2hMZWZ0IiwieENoUmlnaHQiLCJ4Q2hNaWQiLCJ5Q3VybHlCb3QiLCJ5Q3VybHlUb3AiLCJjb21wdXRlTmV4dFZhcmlhbnRPZmZzZXQiLCJsaW5lUmF0aW8iLCJnYXBSYXRpbyIsInhDaFdpZHRoIiwiZ2FwIiwiYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50Iiwic3Ryb2tlVGV4dCIsImlzQmV5b25kQ2VsbEJvdW5kcyIsImNsZWFyQ29sb3IiLCJfZmluZEdseXBoQm91bmRpbmdCb3giLCJhY3RpdmVQYWdlIiwiYWN0aXZlUm93IiwiZml4ZWRSb3dzIiwid2FzUGFnZUFuZFJvd0ZvdW5kIiwiY2FuZGlkYXRlUGFnZSIsImFkZEdseXBoIiwiYm91bmRpbmdCb3giLCJyZXN0cmljdGVkR2x5cGgiLCJmb3VuZCIsImFscGhhT2Zmc2V0IiwiX3VzZWRQaXhlbHMiLCJfZ2x5cGhzIiwic291cmNlUGFnZXMiLCJlbmFibGVUaHJlc2hvbGRDaGVjayIsImlzQmxpbmsiLCJDYW52YXNBZGRvbiIsInVuc2FmZUNvcmUiLCJyZW5kZXJTZXJ2aWNlIiwiY2hhclNpemVTZXJ2aWNlIiwibG9nU2VydmljZSIsInNldFRyYWNlTG9nZ2VyIiwiSU5ESUNFU19QRVJfQ0VMTCIsIkJZVEVTX1BFUl9DRUxMIiwiQllURVNfUEVSX0VMRU1FTlQiLCIkaSIsIiRsZWZ0Q2VsbFBhZGRpbmciLCIkY2xpcHBlZFBpeGVscyIsIkdseXBoUmVuZGVyZXIiLCJfZ2wiLCJfZGltZW5zaW9ucyIsIl92ZXJ0aWNlcyIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzQnVmZmVycyIsImdsIiwiZ2V0UGFyYW1ldGVyIiwiTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiX3Byb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwibWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHMiLCJ0ZXh0dXJlQ29uZGl0aW9uYWxzIiwiZGVsZXRlUHJvZ3JhbSIsIl9wcm9qZWN0aW9uTG9jYXRpb24iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJfcmVzb2x1dGlvbkxvY2F0aW9uIiwiX3RleHR1cmVMb2NhdGlvbiIsIl92ZXJ0ZXhBcnJheU9iamVjdCIsImNyZWF0ZVZlcnRleEFycmF5IiwiYmluZFZlcnRleEFycmF5IiwidW5pdFF1YWRWZXJ0aWNlcyIsInVuaXRRdWFkVmVydGljZXNCdWZmZXIiLCJjcmVhdGVCdWZmZXIiLCJkZWxldGVCdWZmZXIiLCJiaW5kQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwiYnVmZmVyRGF0YSIsIlNUQVRJQ19EUkFXIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiRkxPQVQiLCJ1bml0UXVhZEVsZW1lbnRJbmRpY2VzIiwiZWxlbWVudEluZGljZXNCdWZmZXIiLCJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsIl9hdHRyaWJ1dGVzQnVmZmVyIiwidmVydGV4QXR0cmliRGl2aXNvciIsInVzZVByb2dyYW0iLCJ0ZXh0dXJlVW5pdHMiLCJ1bmlmb3JtMWl2IiwidW5pZm9ybU1hdHJpeDRmdiIsIlBST0pFQ1RJT05fTUFUUklYIiwiX2F0bGFzVGV4dHVyZXMiLCJnbFRleHR1cmUiLCJHTFRleHR1cmUiLCJjcmVhdGVUZXh0dXJlIiwiZGVsZXRlVGV4dHVyZSIsInRleHR1cmUiLCJhY3RpdmVUZXh0dXJlIiwiVEVYVFVSRTAiLCJiaW5kVGV4dHVyZSIsIlRFWFRVUkVfMkQiLCJ0ZXhQYXJhbWV0ZXJpIiwiVEVYVFVSRV9XUkFQX1MiLCJDTEFNUF9UT19FREdFIiwiVEVYVFVSRV9XUkFQX1QiLCJ0ZXhJbWFnZTJEIiwiUkdCQSIsIlVOU0lHTkVEX0JZVEUiLCJCTEVORCIsImJsZW5kRnVuYyIsIlNSQ19BTFBIQSIsIk9ORV9NSU5VU19TUkNfQUxQSEEiLCJfYXRsYXMiLCJsYXN0QmciLCJfdXBkYXRlQ2VsbCIsImFsbG93UmVzY2FsaW5nIiwibmV3Q291bnQiLCJ1bmlmb3JtMmYiLCJyZW5kZXJNb2RlbCIsImJ1ZmZlckxlbmd0aCIsImxpbmVMZW5ndGhzIiwic2kiLCJzdWIiLCJTVFJFQU1fRFJBVyIsIl9iaW5kQXRsYXNQYWdlVGV4dHVyZSIsImRyYXdFbGVtZW50c0luc3RhbmNlZCIsIlRSSUFOR0xFX1NUUklQIiwiZ2VuZXJhdGVNaXBtYXAiLCJCWVRFU19QRVJfUkVDVEFOR0xFIiwiVmVydGljZXMiLCIkcmdiYSIsIiR4MSIsIiR5MSIsIlJlY3RhbmdsZVJlbmRlcmVyIiwiX3ZlcnRpY2VzQ3Vyc29yIiwiX3VwZGF0ZUNhY2hlZENvbG9ycyIsIl91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSIsInJlbmRlckJhY2tncm91bmRzIiwiX3JlbmRlclZlcnRpY2VzIiwicmVuZGVyQ3Vyc29yIiwidmVydGljZXMiLCJEWU5BTUlDX0RSQVciLCJfYmdGbG9hdCIsIl9jb2xvclRvRmxvYXQzMkFycmF5IiwiX2N1cnNvckZsb2F0IiwiX2FkZFJlY3RhbmdsZUZsb2F0IiwibW9kZWwiLCJjdXJyZW50U3RhcnRYIiwiY3VycmVudEJnIiwiY3VycmVudEZnIiwiY3VycmVudEludmVyc2UiLCJtb2RlbEluZGV4IiwicmVjdGFuZ2xlQ291bnQiLCJSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwiLCJjZWxscyIsIlJFTkRFUl9NT0RFTF9CR19PRkZTRVQiLCJSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUIiwiX3VwZGF0ZVJlY3RhbmdsZSIsImV4cGFuZEZsb2F0MzJBcnJheSIsIl9hZGRSZWN0YW5nbGUiLCJSRU5ERVJfTU9ERUxfRVhUX09GRlNFVCIsIkNPTUJJTkVEX0NIQVJfQklUX01BU0siLCJpbmRleENvdW50IiwiV2ViZ2xSZW5kZXJlciIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsIlJlbmRlck1vZGVsIiwiX3dvcmtDZWxsMiIsIl9yZWN0YW5nbGVSZW5kZXJlciIsIl9nbHlwaFJlbmRlcmVyIiwiX29uQ29udGV4dExvc3MiLCJvbkNvbnRleHRMb3NzIiwiX2hhbmRsZUNvbG9yQ2hhbmdlIiwiX3VwZGF0ZUN1cnNvckJsaW5rIiwiY29udGV4dEF0dHJpYnV0ZXMiLCJhbnRpYWxpYXMiLCJfY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCIsIl9pbml0aWFsaXplV2ViR0xTdGF0ZSIsIl9pc0F0dGFjaGVkIiwiYm9keSIsIl9jbGVhck1vZGVsIiwic2V0RGltZW5zaW9ucyIsInNldEF0bGFzIiwiY2xlYXJHbHlwaFJlbmRlcmVyIiwiX3VwZGF0ZU1vZGVsIiwicmVuZGVyIiwiX3JlcXVlc3RSZWRyYXdDdXJzb3IiLCJsYXN0Q3Vyc29yWCIsIm1vZGVsVXBkYXRlZCIsInVwZGF0ZUNlbGwiLCJ1cGRhdGVCYWNrZ3JvdW5kcyIsInVwZGF0ZUN1cnNvciIsImNyZWF0ZVNoYWRlciIsInNoYWRlciIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJkZWxldGVTaGFkZXIiLCJ2ZXJ0ZXhTb3VyY2UiLCJmcmFnbWVudFNvdXJjZSIsInByb2dyYW0iLCJhdHRhY2hTaGFkZXIiLCJWRVJURVhfU0hBREVSIiwiRlJBR01FTlRfU0hBREVSIiwibGlua1Byb2dyYW0iLCJnZXRQcm9ncmFtUGFyYW1ldGVyIiwiTElOS19TVEFUVVMiLCJnZXRQcm9ncmFtSW5mb0xvZyIsIl9jbGlwQ2VsbCIsIldlYmdsQWRkb24iLCJfcHJlc2VydmVEcmF3aW5nQnVmZmVyIiwiZ2V0U2FmYXJpVmVyc2lvbiIsIkZpdEFkZG9uIiwiV2ViTGlua3NBZGRvbiIsIldlYkdMQWRkb24iXSwibWFwcGluZ3MiOiI7O0FBQUEsR0FBQSxTQUEyQ0EsR0FBTUMsR0FBQUE7QUFFL0NDLHFCQUFpQkQ7RUFPbEIsRUFBRUUsWUFBWTs7Ozs7Ozs7Ozs7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QUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsT0FDN0MsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxPQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsT0FBUyxDQUFDLE1BQVEsT0FDN0MsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLE9BQzdDLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsT0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxPQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLE9BQzdDLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxPQUFTLENBQUMsTUFBUSxPQUM3QyxDQUFDLE1BQVEsT0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsT0FDN0MsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxRQUFTLENBQUMs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QyxFQUFFamEsR0FBRyxHQUFHQyxHQUFHLEdBQUcwbkIsR0FBRyxHQUFHMU4sR0FBRyxFQUFBLENBQUEsR0FDckMsTUFBYSxDQUFDLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixHQUFHLEdBQUcxTixHQUFHLEVBQUEsQ0FBQSxHQUdyQyxNQUFhLENBQUMsRUFBRWphLEdBQUcsR0FBR0MsR0FBRyxHQUFHMG5CLEdBQUcsR0FBRzFOLEdBQUcsRUFBQSxHQUFLLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixHQUFHLEdBQUcxTixHQUFHLEVBQUEsQ0FBQSxHQUVqRSxNQUFhLENBQUMsRUFBRWphLEdBQUcsR0FBR0MsR0FBRyxHQUFHMG5CLEdBQUcsR0FBRzFOLEdBQUcsRUFBQSxHQUFLLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixHQUFHLEdBQUcxTixHQUFHLEVBQUEsQ0FBQSxHQUVqRSxNQUFhLENBQUMsRUFBRWphLEdBQUcsR0FBR0MsR0FBRyxHQUFHMG5CLEdBQUcsR0FBRzFOLEdBQUcsRUFBQSxHQUFLLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixHQUFHLEdBQUcxTixHQUFHLEVBQUEsQ0FBQSxHQUVqRSxNQUFhLENBQUMsRUFBRWphLEdBQUcsR0FBR0MsR0FBRyxHQUFHMG5CLEdBQUcsR0FBRzFOLEdBQUcsRUFBQSxHQUFLLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixHQUFHLEdBQUcxTixHQUFHLEVBQUEsQ0FBQSxHQUVqRSxNQUFhLENBQUMsRUFBRWphLEdBQUcsR0FBR0MsR0FBRyxHQUFHMG5CLEdBQUcsR0FBRzFOLEdBQUcsRUFBQSxHQUFLLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixHQUFHLEdBQUcxTixHQUFHLEVBQUEsQ0FBQSxHQUVqRSxNQUFhLENBQUMsRUFBRWphLEdBQUcsR0FBR0MsR0FBRyxHQUFHMG5CLEdBQUcsR0FBRzFOLEdBQUcsRUFBQSxHQUFLLEVBQUVqYSxHQUFHLEdBQUdDLEdBQUcsR0FBRzBuQixH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QUFBQSxLQUFBQSxHQUM5RixLQUFLLEVBQUUsR0FBZ0IsQ0FBQ0EsSUFBSUMsT0FBTyxNQUFNLE1BQUtBLEVBQUFBLEtBQU8sTUFBS0QsRUFBQUEsSUFBTSxNQUFLQyxFQUFBQSxLQUFPLE1BQUtELEVBQUFBLFNBQVcsTUFBS0MsRUFBQUEsS0FBTyxNQUFLRCxFQUFBQSxJQUFNLE1BQUtDLEVBQUFBLEtBQU8sTUFBS0QsRUFBQUEsS0FBQUEsR0FDcEksS0FBSyxFQUFFLEdBQWdCLENBQUNBLElBQUlDLE9BQU8sTUFBTSxNQUFLQSxFQUFBQSxRQUFVLE1BQUtBLEVBQUFBLGFBQWUsTUFBS0EsRUFBQUEsUUFBVSxNQUFLQSxFQUFBQSxHQUFBQSxHQUNoRyxLQUFLLEVBQUUsR0FBZ0IsQ0FBQ0QsSUFBSUMsT0FBTyxJQUFJLE1BQUtELEVBQUFBLE9BQVMsTUFBS0EsRUFBQUEsY0FBZ0IsTUFBS0EsRUFBQUEsUUFBVSxNQUFLQSxFQUFBQSxLQUFBQSxHQUM5RixLQUFLLEVBQUUsR0FBZ0IsQ0FBQ0EsSUFBSUMsT0FBTyxNQUFNLE1BQUtBLEVBQUFBLEtBQU8sTUFBS0QsRUFBQUEsSUFBTSxNQUFLQyxFQUFBQSxLQUFPLE1BQUtELEVBQUFBLFNBQVcsTUFBS0MsRUFBQUEsS0FBTyxNQUFLRCxNQUFNLE1BQUtDLEVBQUFBLEtBQU8sTUFBS0QsRUFBQUEsS0FBQUEsR0FDcEksS0FBSyxFQUFFLEdBQWdCLENBQUNBLElBQUlDLE9BQU8sYUFBYSxNQUFLQSxFQUFBQSxPQUFTLE1BQUtBLEVBQUFBLFFBQVUsTUFBS0EsRUFBQUEsT0FBUyxNQUFLQSxFQUFBQSxHQUFBQSxHQUNoRyxLQUFLLEVBQUUsR0FBZ0IsQ0FBQ0QsSUFBSUMsT0FBTyxVQUFVLE1BQUtELEVBQUFBLFFBQVUsTUFBS0EsRUFBQUEsT0FBUyxNQUFLQSxFQUFBQSxRQUFVLE1BQUtBLEVBQUFBLEtBQUFBLEdBQzlGLEtBQUssRUFBRSxHQUFnQixDQUFDQSxJQUFJQyxPQUFPLE1BQU0sTUFBS0EsRUFBQUEsS0FBTyxNQUFLRCxFQUFBQSxJQUFNLE1B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cUJBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHNCQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixlQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLGNBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsdUJBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0Isc0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsY0FBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsc0JBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLGtCQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsY0FBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMscUJBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLDRCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLDRCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGVBQXNELEdBQWMsY0FBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsNEJBQXNELEdBQWMsZUFB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R0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQix1QkFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxjQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsc0JBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGVBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0Isc0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0Isc0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsY0FBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMscUJBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQix1QkFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxjQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixlQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxzQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0Isc0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0Isc0JBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsY0FBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxlQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMscUJBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLDRCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLDRCQUFzRCxHQUFjLGVBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGVBQXNELEdBQWMsY0FBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsNEJBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsNEJBQXNELEdBQWMsZUFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxjQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQix1QkFBc0QsR0FBYyxxQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0Isc0JBQXNELEdBQWMscUJBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxzQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsMkJBQUEsR0FDM0YsS0FBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLDJCQUFBLEdBQzNGLEtBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYywyQkFBQSxHQUMzRixLQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMsMkJBQUEsR0FHM0YsS0FBSyxF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QUFlLFVBQVUsRUFBRSxpQkFBaUIsU0FBUyxhQUFhO0FBQzNFLFdBQVMsZUFBZSxpQkFBaUIsRUFBRSxpQkFBaUIsU0FBUyxhQUFhO0FBQ2xGLFdBQVMsZUFBZSxpQkFBaUIsRUFBRSxpQkFBaUIsU0FBUyxnQkFBZ0I7QUFDckYsV0FBUyxlQUFlLGFBQWEsRUFBRSxpQkFBaUIsU0FBUyxjQUFjO0FBQy9FLFdBQVMsZUFBZSxpQkFBaUIsRUFBRSxpQkFBaUIsU0FBUyxtQkFBbUI7QUFDeEYsV0FBUyxlQUFlLFlBQVksRUFBRSxpQkFBaUIsU0FBUyxXQUFXO0FBRzNFLFNBQU8saUJBQWlCLFVBQVUsTUFBTTtBQUNwQyxjQUFVLFdBQVcsRUFBRSxJQUFHO0FBQUEsRUFDOUIsQ0FBQztBQUNMLENBQUM7QUFHRCxPQUFPLG9CQUFvQjtBQUFBLEVBQ3ZCLE1BQU07QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxRQUFRO0FBQUEsRUFDUjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0o7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwXX0= diff --git a/suites-experimental/terminal-xterm/dist/async-overrides.js b/suites-experimental/terminal-xterm/dist/async-overrides.js new file mode 100644 index 000000000..0d2d53a87 --- /dev/null +++ b/suites-experimental/terminal-xterm/dist/async-overrides.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). +/** + * Universal Async API Overrides for Deterministic Benchmark Timing + * + * This script runs synchronously before any other scripts or bundles load. + * It overrides window.setTimeout, clearTimeout, requestAnimationFrame, + * cancelAnimationFrame, requestIdleCallback, cancelIdleCallback, createImageBitmap, + * and DOM Observers (ResizeObserver, IntersectionObserver, MutationObserver) to + * eliminate macro-task delays, HTML5 timer clamping, and framerate dependencies. + */ + +// Track active timers, GPU bitmap promises, and DOM observers globally +// so step completion can exhaustively await them. +window.__activeTimers = new Set(); +window.__activeBitmaps = new Set(); +window.__activeObservers = new Set(); + +// 1. Asynchronous GPU Texture Generation (createImageBitmap) +// Override createImageBitmap so @xterm/addon-canvas never performs background +// GPU texture generation tasks or IPC. By resolving immediately with the offline +// canvas itself (and attaching a dummy close() method), @xterm/addon-canvas +// draws 100% synchronously from the offline texture atlas canvas without any +// asynchronous delays or deferred callbacks. +window.createImageBitmap = (canvas) => { + return Promise.resolve(Object.assign(canvas, { close: () => {} })); +}; + +// 2. DOM Observers (ResizeObserver, IntersectionObserver, MutationObserver) +const trackObserver = (ObserverClass) => { + if (!ObserverClass) + return ObserverClass; + return class extends ObserverClass { + constructor(callback) { + super((entries, observer) => { + window.__activeObservers.add(observer); + try { + callback(entries, observer); + } finally { + window.__activeObservers.delete(observer); + } + }); + } + }; +}; +window.ResizeObserver = trackObserver(window.ResizeObserver); +window.IntersectionObserver = trackObserver(window.IntersectionObserver); +window.MutationObserver = trackObserver(window.MutationObserver); + +const origSetTimeout = window.setTimeout.bind(window); +const origClearTimeout = window.clearTimeout.bind(window); + +// 3. Timers (setTimeout, clearTimeout) +// Always compress delays to 0 ms using native origSetTimeout(..., 0) so +// debounced rendering passes and callbacks interleave cleanly with Speedometer's +// -Async measurement scheduler (AsyncRAFStepScheduler). +window.setTimeout = (cb, delay, ...args) => { + const id = origSetTimeout(() => { + window.__activeTimers.delete(id); + if (typeof cb === "function") + cb(...args); + else if (typeof cb === "string") + eval(cb); + + }, 0); + window.__activeTimers.add(id); + return id; +}; + +window.clearTimeout = (id) => { + window.__activeTimers.delete(id); + origClearTimeout(id); +}; + +// 4. Idle Callbacks (requestIdleCallback, cancelIdleCallback) +window.requestIdleCallback = (cb) => { + const start = Date.now(); + return window.setTimeout(() => { + cb({ + didTimeout: false, + timeRemaining: () => Math.max(0, 10000 - (Date.now() - start)), + }); + }, 0); +}; + +window.cancelIdleCallback = (id) => { + window.clearTimeout(id); +}; + +// 5. Animation Frames (requestAnimationFrame, cancelAnimationFrame) +// Globally override requestAnimationFrame to setTimeout(cb, 0) so all animation +// frame callbacks execute as 0 ms timers, aligning cleanly with Speedometer's +// -Async measurement window. +window.requestAnimationFrame = (cb) => { + return window.setTimeout(() => cb(performance.now()), 0); +}; + +window.cancelAnimationFrame = (id) => { + window.clearTimeout(id); +}; diff --git a/suites-experimental/terminal-xterm/dist/index.html b/suites-experimental/terminal-xterm/dist/index.html new file mode 100644 index 000000000..8a22a6949 --- /dev/null +++ b/suites-experimental/terminal-xterm/dist/index.html @@ -0,0 +1,51 @@ + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+ + diff --git a/suites-experimental/terminal-xterm/index.source.html b/suites-experimental/terminal-xterm/index.source.html new file mode 100644 index 000000000..15b96ebc2 --- /dev/null +++ b/suites-experimental/terminal-xterm/index.source.html @@ -0,0 +1,51 @@ + + + + + + + + + + +
+ +
+
+ +
+
+
+
+ + + diff --git a/suites-experimental/terminal-xterm/package-lock.json b/suites-experimental/terminal-xterm/package-lock.json new file mode 100644 index 000000000..f62a583e7 --- /dev/null +++ b/suites-experimental/terminal-xterm/package-lock.json @@ -0,0 +1,1036 @@ +{ + "name": "terminal-xterm", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-xterm", + "version": "1.0.0", + "dependencies": { + "@xterm/addon-canvas": "^0.6.0", + "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-web-links": "^0.11.0", + "@xterm/addon-webgl": "^0.18.0", + "@xterm/xterm": "^5.5.0" + }, + "devDependencies": { + "vite": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@xterm/addon-canvas": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.6.0.tgz", + "integrity": "sha512-+nj2x595vItxfuAFxzXp46Izrh4EnEyS0Z60hX1iy6OFliP5OQu8Wu7n59m7m1vT6Q4nIWoN1WiH+VLAk4D9jQ==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/addon-fit": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", + "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/addon-web-links": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-web-links/-/addon-web-links-0.11.0.tgz", + "integrity": "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/addon-webgl": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-webgl/-/addon-webgl-0.18.0.tgz", + "integrity": "sha512-xCnfMBTI+/HKPdRnSOHaJDRqEpq2Ugy8LEj9GiY4J3zJObo3joylIFaMvzBwbYRg8zLtkO0KQaStCeSfoaI2/w==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/xterm": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", + "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + } +} diff --git a/suites-experimental/terminal-xterm/package.json b/suites-experimental/terminal-xterm/package.json new file mode 100644 index 000000000..3c8f1a265 --- /dev/null +++ b/suites-experimental/terminal-xterm/package.json @@ -0,0 +1,23 @@ +{ + "name": "terminal-xterm", + "private": true, + "version": "1.0.0", + "type": "module", + "description": "Experimental terminal emulator benchmark workload using xterm.js", + "scripts": { + "dev": "vite", + "build": "vite build", + "build-dev": "vite build --mode development", + "preview": "vite preview" + }, + "dependencies": { + "@xterm/addon-canvas": "^0.6.0", + "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-web-links": "^0.11.0", + "@xterm/addon-webgl": "^0.18.0", + "@xterm/xterm": "^5.5.0" + }, + "devDependencies": { + "vite": "^5.0.0" + } +} diff --git a/suites-experimental/terminal-xterm/public/async-overrides.js b/suites-experimental/terminal-xterm/public/async-overrides.js new file mode 100644 index 000000000..6d28ecff0 --- /dev/null +++ b/suites-experimental/terminal-xterm/public/async-overrides.js @@ -0,0 +1,101 @@ +// Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). +/** + * Universal Async API Overrides for Deterministic Benchmark Timing + * + * This script runs synchronously before any other scripts or bundles load. + * It overrides window.setTimeout, clearTimeout, requestAnimationFrame, + * cancelAnimationFrame, requestIdleCallback, cancelIdleCallback, createImageBitmap, + * and DOM Observers (ResizeObserver, IntersectionObserver, MutationObserver) to + * eliminate macro-task delays, HTML5 timer clamping, and framerate dependencies. + */ + +// Track active timers, GPU bitmap promises, and DOM observers globally +// so step completion can exhaustively await them. +window.__activeTimers = new Set(); +window.__activeBitmaps = new Set(); +window.__activeObservers = new Set(); + +// 1. Asynchronous GPU Texture Generation (createImageBitmap) +// Override createImageBitmap so @xterm/addon-canvas never performs background +// GPU texture generation tasks or IPC. By resolving immediately with the offline +// canvas itself (and attaching a dummy close() method), @xterm/addon-canvas +// draws 100% synchronously from the offline texture atlas canvas without any +// asynchronous delays or deferred callbacks. +window.createImageBitmap = (canvas) => { + return Promise.resolve(Object.assign(canvas, { close: () => {} })); +}; + +// 2. DOM Observers (ResizeObserver, IntersectionObserver, MutationObserver) +const trackObserver = (ObserverClass) => { + if (!ObserverClass) + return ObserverClass; + return class extends ObserverClass { + constructor(callback) { + super((entries, observer) => { + window.__activeObservers.add(observer); + try { + callback(entries, observer); + } finally { + window.__activeObservers.delete(observer); + } + }); + } + }; +}; +window.ResizeObserver = trackObserver(window.ResizeObserver); +window.IntersectionObserver = trackObserver(window.IntersectionObserver); +window.MutationObserver = trackObserver(window.MutationObserver); + +const origSetTimeout = window.setTimeout.bind(window); +const origClearTimeout = window.clearTimeout.bind(window); + +// 3. Timers (setTimeout, clearTimeout) +// Always compress delays to 0 ms using native origSetTimeout(..., 0) so +// debounced rendering passes and callbacks interleave cleanly with Speedometer's +// -Async measurement scheduler (AsyncRAFStepScheduler). +window.setTimeout = (cb, delay, ...args) => { + const id = origSetTimeout(() => { + window.__activeTimers.delete(id); + if (typeof cb === "function") + cb(...args); + else if (typeof cb === "string") + eval(cb); + }, 0); + window.__activeTimers.add(id); + return id; +}; + +window.clearTimeout = (id) => { + window.__activeTimers.delete(id); + origClearTimeout(id); +}; + +// 4. Idle Callbacks (requestIdleCallback, cancelIdleCallback) +window.requestIdleCallback = (cb) => { + const start = Date.now(); + return window.setTimeout(() => { + cb({ + didTimeout: false, + timeRemaining: () => Math.max(0, 10000 - (Date.now() - start)), + }); + }, 0); +}; + +window.cancelIdleCallback = (id) => { + window.clearTimeout(id); +}; + +// 5. Animation Frames (requestAnimationFrame, cancelAnimationFrame) +// Globally override requestAnimationFrame to setTimeout(cb, 0) so all animation +// frame callbacks execute as 0 ms timers, aligning cleanly with Speedometer's +// -Async measurement window. +window.requestAnimationFrame = (cb) => { + return window.setTimeout(() => cb(performance.now()), 0); +}; + +window.cancelAnimationFrame = (id) => { + window.clearTimeout(id); +}; diff --git a/suites-experimental/terminal-xterm/sessions.js b/suites-experimental/terminal-xterm/sessions.js new file mode 100644 index 000000000..2f54e8925 --- /dev/null +++ b/suites-experimental/terminal-xterm/sessions.js @@ -0,0 +1,222 @@ +// Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). +// +// Generate deterministic sessions for terminal emulator benchmarking + +const ANSI = { + reset: "\x1b[0m", + bold: "\x1b[1m", + dim: "\x1b[2m", + red: "\x1b[31m", + green: "\x1b[32m", + yellow: "\x1b[33m", + blue: "\x1b[34m", + magenta: "\x1b[35m", + cyan: "\x1b[36m", + white: "\x1b[37m", + bgRed: "\x1b[41m", + bgGreen: "\x1b[42m", + bgBlue: "\x1b[44m", + clearScreen: "\x1b[2J\x1b[H", + cursorHome: "\x1b[H", + hideCursor: "\x1b[?25l", + showCursor: "\x1b[?25h", +}; + +// 1. Build Log Session: Generates ~150 chunks (~1500+ lines) of verbose compiler & build logs +export function generateBuildLogSession() { + const chunks = []; + const components = ["WebCore", "JavaScriptCore", "WebKit2", "WTF", "PAL", "Angle", "Skia", "V8", "Blink", "Platform"]; + const files = ["Node.cpp", "Element.cpp", "Document.cpp", "JSLexer.cpp", "Parser.cpp", "RenderBox.cpp", "CSSParser.cpp", "EventLoop.cpp", "FrameView.cpp", "DOMWindow.cpp"]; + + chunks.push(`${ANSI.bold}${ANSI.cyan}==> Starting build suite configuration (Speedometer Terminal Emulator Workload)...${ANSI.reset}\r\n`); + chunks.push(`${ANSI.green}✔ Pre-build checks passed. Environment: Linux x86_64, Node v22.0.0, Clang 18.0.0${ANSI.reset}\r\n`); + + let totalProgress = 0; + for (let i = 1; i <= 150; i++) { + let chunk = ""; + const comp = components[i % components.length]; + const file = files[i % files.length]; + totalProgress = Math.min(100, Math.floor((i / 150) * 100)); + + chunk += `${ANSI.dim}[${new Date(1720448000000 + i * 500).toISOString()}]${ANSI.reset} [${ANSI.bold}${totalProgress.toString().padStart(3, " ")}%${ANSI.reset}] Building CXX object Source/${comp}/CMakeFiles/${comp}.dir/${file}.o\r\n`; + + if (i % 7 === 0) { + chunk += `${ANSI.bold}${ANSI.yellow}warning:${ANSI.reset} unused parameter 'execState' [-Wunused-parameter]\r\n`; + chunk += ` 142 | JSValue ${comp}::evaluate(JSGlobalObject* ${ANSI.bold}${ANSI.yellow}execState${ANSI.reset}, const SourceCode& source)\r\n`; + chunk += ` | ${ANSI.yellow}^~~~~~~~~~${ANSI.reset}\r\n`; + } + + if (i % 19 === 0) { + chunk += `${ANSI.bold}${ANSI.cyan}info:${ANSI.reset} vectorization enabled for loop in ${file} at line ${100 + i}\r\n`; + chunk += ` ${ANSI.dim}remark: vectorized 4 instructions in unrolled loop (-Rpass=loop-vectorize)${ANSI.reset}\r\n`; + } + + if (i % 31 === 0) { + chunk += `${ANSI.bold}${ANSI.magenta}[LINK]${ANSI.reset} Linking shared library lib${comp}.so...\r\n`; + chunk += ` ${ANSI.green}✔ Created lib${comp}.so (48.2 MB)${ANSI.reset}\r\n`; + } + + if (i % 45 === 0) { + chunk += `${ANSI.bold}${ANSI.red}error (ignored):${ANSI.reset} temporary lock contention in distributed cache for ${file}\r\n`; + chunk += " Retrying build step 2 of 3...\r\n"; + chunk += ` ${ANSI.green}✔ Retry successful!${ANSI.reset}\r\n`; + } + + chunks.push(chunk); + } + + chunks.push(`${ANSI.bold}${ANSI.green}==> Build completed successfully in 42.8s! Total artifacts: 1,420 targets.${ANSI.reset}\r\n`); + return chunks; +} + +// 2. Links Session: Dumps logs saturated with URLs, file paths, and stack traces +export function generateLinksSession() { + const chunks = []; + chunks.push(`${ANSI.bold}${ANSI.blue}=== Test Execution Summary & Artifact Links ===${ANSI.reset}\r\n`); + + for (let i = 1; i <= 80; i++) { + let chunk = ""; + chunk += `[Test Worker #${(i % 8) + 1}] RUNNING: https://github.com/WebKit/Speedometer/issues/${1000 + i}\r\n`; + chunk += " ↳ Reference spec: https://html.spec.whatwg.org/multipage/webappapis.html#event-loops\r\n"; + chunk += ` ↳ Local fixture: file:///usr/local/google/home/cbruni/Documents/Speedometer/suites/editors/codemirror.html:${10 + i}:${(i % 20) + 1}\r\n`; + chunk += ` ↳ Stack trace: at Object.runTest (src/speedometer-utils/benchmark.mjs:${50 + i}:12)\r\n`; + chunk += " ↳ Documentation: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext\r\n"; + chunk += ` ↳ NPM Registry: https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.${i % 10}.tgz\r\n`; + chunks.push(chunk); + } + return chunks; +} + +// Helper to generate RGB TrueColor ANSI escape sequences +function rgbFg(r, g, b, text) { + return `\x1b[38;2;${r};${g};${b}m${text}${ANSI.reset}`; +} +function rgbBg(r, g, b, text) { + return `\x1b[48;2;${r};${g};${b}m${text}${ANSI.reset}`; +} + +// 3. ncurses Session: Simulates 4 dynamic frames of an htop/top system monitor +export function generateNcursesSession() { + const frames = []; + const procList = [ + { pid: 1420, user: "cbruni", pri: 20, ni: 0, virt: "4820M", res: "312M", shr: "84M", s: "R", cpu: 45.2, mem: 1.9, time: "4:12.08", cmd: "/usr/bin/google-chrome-stable --type=renderer" }, + { pid: 1842, user: "cbruni", pri: 20, ni: 0, virt: "8920M", res: "1.2G", shr: "120M", s: "S", cpu: 32.8, mem: 7.4, time: "18:45.12", cmd: "node tests/server.mjs --port 8000" }, + { pid: 2901, user: "cbruni", pri: 20, ni: 0, virt: "1420M", res: "180M", shr: "64M", s: "R", cpu: 28.4, mem: 1.1, time: "1:02.45", cmd: "vite build --watch" }, + { pid: 3105, user: "cbruni", pri: 20, ni: 0, virt: "980M", res: "92M", shr: "45M", s: "S", cpu: 14.1, mem: 0.6, time: "0:45.90", cmd: "python3 sidecar.py --daemon" }, + { pid: 402, user: "root", pri: 20, ni: 0, virt: "310M", res: "24M", shr: "18M", s: "S", cpu: 5.0, mem: 0.2, time: "12:10.01", cmd: "/lib/systemd/systemd-journald" }, + { pid: 881, user: "root", pri: -20, ni: -20, virt: "0", res: "0", shr: "0", s: "I", cpu: 1.2, mem: 0.0, time: "0:04.12", cmd: "[kworker/u16:2-events_unbound]" }, + { pid: 5120, user: "cbruni", pri: 20, ni: 0, virt: "2100M", res: "410M", shr: "95M", s: "S", cpu: 0.8, mem: 2.5, time: "2:14.50", cmd: "code /usr/local/google/home/cbruni/Documents/Speedometer" }, + { pid: 6012, user: "cbruni", pri: 20, ni: 0, virt: "650M", res: "45M", shr: "28M", s: "S", cpu: 0.4, mem: 0.3, time: "0:12.80", cmd: "bash -i" }, + { pid: 7100, user: "cbruni", pri: 20, ni: 0, virt: "520M", res: "38M", shr: "22M", s: "S", cpu: 0.1, mem: 0.2, time: "0:05.10", cmd: "git status -uall" }, + { pid: 8192, user: "cbruni", pri: 20, ni: 0, virt: "120M", res: "8M", shr: "6M", s: "R", cpu: 0.0, mem: 0.1, time: "0:00.05", cmd: "ps aux --sort=-pcpu" }, + ]; + + for (let frameIdx = 0; frameIdx < 4; frameIdx++) { + let frame = frameIdx === 0 ? ANSI.clearScreen + ANSI.hideCursor : ANSI.cursorHome; + + // Header / Uptime / Load Avg + const load1 = (2.45 + Math.sin(frameIdx / 5) * 0.5).toFixed(2); + const load5 = (2.1 + Math.cos(frameIdx / 7) * 0.3).toFixed(2); + const load15 = (1.85 + Math.sin(frameIdx / 10) * 0.2).toFixed(2); + frame += `${rgbFg(100, 220, 255, "htop 3.3.0")} - ${rgbFg(220, 220, 220, "16:15:27 up 14 days, 6:42, 4 users")}, load average: ${rgbFg(255, 100, 100, load1)}, ${rgbFg(255, 180, 100, load5)}, ${rgbFg(180, 255, 100, load15)}\r\n`; + frame += `Tasks: ${ANSI.bold}142${ANSI.reset}, ${ANSI.bold}430${ANSI.reset} thr; ${rgbFg(100, 255, 100, "3 running")}, 427 sleeping, 0 stopped, 0 zombie\r\n\r\n`; + + // Render 8 CPU Cores in 2 columns (4 rows) + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 2; col++) { + const coreNum = row + col * 4 + 1; + // Vary CPU percentage per core per frame + const cpuPct = Math.min(100, Math.max(2, Math.floor(40 + Math.sin(frameIdx * 0.3 + coreNum) * 35 + (coreNum % 3) * 10))); + const barWidth = 25; + const filledWidth = Math.floor((cpuPct / 100) * barWidth); + + let barStr = "["; + for (let b = 0; b < barWidth; b++) { + if (b < filledWidth) { + if (b < 12) + barStr += rgbFg(80, 250, 120, "|"); // green + else if (b < 20) + barStr += rgbFg(255, 200, 50, "|"); // yellow + else + barStr += rgbFg(250, 70, 70, "|"); // red + } else { + barStr += rgbFg(60, 60, 60, " "); + } + } + barStr += `] ${rgbFg(220, 220, 220, `${cpuPct.toString().padStart(5, " ")}%`)}`; + + const label = rgbFg(100, 220, 255, `CPU${coreNum}`.padEnd(5, " ")); + frame += `${label}${barStr} `; + } + frame += "\r\n"; + } + + // Memory & Swap bars + const memPct = 42.5 + Math.sin(frameIdx * 0.1) * 2; + const swapPct = 12.0; + const memBarWidth = 63; + const memFilled = Math.floor((memPct / 100) * memBarWidth); + let memBar = "["; + for (let b = 0; b < memBarWidth; b++) + memBar += b < memFilled ? rgbFg(80, 200, 255, "|") : rgbFg(60, 60, 60, " "); + + memBar += `] ${rgbFg(220, 220, 220, "13.6G/32.0G")}`; + frame += `${rgbFg(100, 220, 255, "Mem ")}${memBar}\r\n`; + + let swapBar = "["; + const swapFilled = Math.floor((swapPct / 100) * memBarWidth); + for (let b = 0; b < memBarWidth; b++) + swapBar += b < swapFilled ? rgbFg(255, 100, 200, "|") : rgbFg(60, 60, 60, " "); + + swapBar += `] ${rgbFg(220, 220, 220, "1.92G/16.0G")}`; + frame += `${rgbFg(100, 220, 255, "Swp ")}${swapBar}\r\n\r\n`; + + // Table Header + const headerText = " PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command".padEnd(80, " "); + frame += `${rgbBg(40, 90, 60, rgbFg(255, 255, 255, ANSI.bold + headerText))}\r\n`; + + // Process List rows + for (let pIdx = 0; pIdx < procList.length; pIdx++) { + const proc = procList[pIdx]; + // Mutate CPU slightly + let curCpu = proc.cpu; + if (proc.s === "R") + curCpu = Math.max(0.1, (proc.cpu + Math.sin(frameIdx + pIdx) * 5).toFixed(1)); + + const rowBg = pIdx === frameIdx % procList.length ? "\x1b[48;2;60;80;100m" : ""; + const pidStr = rgbFg(255, 180, 100, proc.pid.toString().padStart(5, " ")); + const userStr = rgbFg(180, 220, 255, proc.user.padEnd(8, " ")); + const priStr = proc.pri.toString().padStart(4, " "); + const niStr = proc.ni.toString().padStart(3, " "); + const virtStr = proc.virt.padStart(6, " "); + const resStr = rgbFg(150, 255, 150, proc.res.padStart(5, " ")); + const shrStr = proc.shr.padStart(5, " "); + const sStr = proc.s === "R" ? rgbFg(80, 250, 120, proc.s) : proc.s; + const cpuStr = proc.s === "R" ? rgbFg(255, 100, 100, curCpu.toString().padStart(5, " ")) : curCpu.toString().padStart(5, " "); + const memStr = proc.mem.toString().padStart(5, " "); + const timeStr = proc.time.padStart(9, " "); + const cmdStr = proc.cmd.slice(0, 32).padEnd(32, " "); + + frame += `${rowBg}${pidStr} ${userStr} ${priStr} ${niStr} ${virtStr} ${resStr} ${shrStr} ${sStr} ${cpuStr} ${memStr} ${timeStr} ${cmdStr}${ANSI.reset}\r\n`; + } + + // Footer navigation help + frame += `\r\n${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F1"))}Help ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F2"))}Setup ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F3"))}Search ${rgbBg( + 50, + 50, + 50, + rgbFg(255, 255, 255, "F4") + )}Filter ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F5"))}Tree ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F6"))}SortBy ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F7"))}Nice - ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F8"))}Nice + ${rgbBg( + 50, + 50, + 50, + rgbFg(255, 255, 255, "F9") + )}Kill ${rgbBg(50, 50, 50, rgbFg(255, 255, 255, "F10"))}Quit`; + + frames.push(frame); + } + return frames; +} diff --git a/suites-experimental/terminal-xterm/style.css b/suites-experimental/terminal-xterm/style.css new file mode 100644 index 000000000..d90623a40 --- /dev/null +++ b/suites-experimental/terminal-xterm/style.css @@ -0,0 +1,166 @@ +/* Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). + */ + +/* IDE Terminal Panel Styling */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body, +html { + width: 100%; + height: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + background-color: #1e1e1e; + color: #d4d4d4; + overflow: hidden; +} + +#app { + display: flex; + flex-direction: column; + width: 100vw; + height: 100vh; +} + +/* Header & Tab Bar */ +#header { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + background-color: #252526; + border-bottom: 1px solid #3c3c3c; + height: 40px; + padding: 0 8px; + user-select: none; +} + +#tab-bar { + display: flex; + flex-direction: row; + align-items: center; + gap: 2px; + height: 100%; +} + +.tab { + display: flex; + align-items: center; + gap: 6px; + padding: 0 12px; + height: 100%; + font-size: 13px; + color: #969696; + background-color: #2d2d2d; + border: none; + border-top: 2px solid transparent; + cursor: pointer; + transition: background-color 0.1s, color 0.1s; +} + +.tab:hover { + background-color: #282828; + color: #cccccc; +} + +.tab.active { + background-color: #1e1e1e; + color: #ffffff; + border-top-color: #007acc; /* VS Code blue accent */ + font-weight: 500; +} + +.tab-icon { + font-size: 14px; +} + +/* Control Toolbar */ +#controls { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; +} + +.btn { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + font-size: 12px; + font-weight: 500; + color: #cccccc; + background-color: #333333; + border: 1px solid #454545; + border-radius: 3px; + cursor: pointer; + transition: background-color 0.15s, border-color 0.15s; +} + +.btn:hover:not(:disabled) { + background-color: #3e3e3e; + border-color: #555555; + color: #ffffff; +} + +.btn:active:not(:disabled) { + background-color: #007acc; + border-color: #007acc; + color: #ffffff; +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn.active { + background-color: #007acc; + border-color: #007acc; + color: #ffffff; +} + +/* Terminal Viewport Container */ +#terminal-container { + flex: 1; + position: relative; + width: 100%; + height: calc(100vh - 40px); + padding: 8px; + background-color: #1e1e1e; +} + +.terminal-pane { + position: absolute; + top: 8px; + left: 8px; + right: 8px; + bottom: 8px; + display: none; + width: calc(100% - 16px); + height: calc(100% - 16px); +} + +.terminal-pane.active { + display: block; +} + +/* Override xterm scrollbar styling to match dark IDE theme */ +.xterm .xterm-viewport::-webkit-scrollbar { + width: 10px; +} +.xterm .xterm-viewport::-webkit-scrollbar-track { + background: #1e1e1e; +} +.xterm .xterm-viewport::-webkit-scrollbar-thumb { + background: #424242; +} +.xterm .xterm-viewport::-webkit-scrollbar-thumb:hover { + background: #4f4f4f; +} diff --git a/suites-experimental/terminal-xterm/vite.config.js b/suites-experimental/terminal-xterm/vite.config.js new file mode 100644 index 000000000..5b97d28cf --- /dev/null +++ b/suites-experimental/terminal-xterm/vite.config.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted under the terms of the BSD 2-Clause License (see root LICENSE file). +import { resolve } from "path"; +import { defineConfig } from "vite"; +import fs from "fs"; + +/** + * Rollup plugin to ingest source maps from node_modules dependencies (@xterm). + * Because @xterm npm packages ship pre-compiled code with mangled identifiers + * (e.g. class g, class l), this plugin ingests their .map files so generated + * bundles and browser profiling traces (Chrome DevTools / Firefox Profiler) + * map 100% cleanly back to original TypeScript symbols (CanvasRenderer, TextRenderLayer, etc.). + */ +function nodeModulesSourcemaps() { + return { + name: "node-modules-sourcemaps", + load(id) { + if (id.endsWith(".js") && id.includes("node_modules")) { + try { + const code = fs.readFileSync(id, "utf-8"); + const mapPath = `${id}.map`; + if (fs.existsSync(mapPath)) { + const map = JSON.parse(fs.readFileSync(mapPath, "utf-8")); + return { code, map }; + } + } catch (e) { + // Ignore errors reading source maps + } + } + return null; + }, + }; +} + +function renameIndexHtml() { + return { + name: "rename-index-html", + closeBundle() { + const src = resolve(__dirname, "dist/index.source.html"); + const dest = resolve(__dirname, "dist/index.html"); + if (fs.existsSync(src)) + fs.renameSync(src, dest); + }, + }; +} + +export default defineConfig(({ mode }) => { + const isDev = mode === "development"; + return { + base: "./", + plugins: [nodeModulesSourcemaps(), renameIndexHtml()], + build: { + outDir: "dist", + modulePreload: { polyfill: false }, + minify: false, + sourcemap: isDev ? "inline" : true, + rollupOptions: { + input: { + main: resolve(__dirname, "index.source.html"), + }, + output: isDev + ? { + entryFileNames: "assets/[name].js", + chunkFileNames: "assets/[name].js", + assetFileNames: "assets/[name].[ext]", + } + : undefined, + }, + }, + }; +});