#!/usr/bin/env node // coding-tools/figma-tools/js/src/_utils/cli-args.ts function parseArgs(argv = process.argv.slice(2)) { const args = { _: [] }; for (let i = 0; i < argv.length; i += 1) { const arg = argv[i]; if (!arg.startsWith("-") || arg === "-") { args._.push(arg); continue; } if (arg === "--") { const remaining = argv.slice(i + 1); args._.push(...remaining); break; } const [rawKey, inlineValue] = arg.split("=", 2); const normalisedKey = rawKey.replace(/^-+/, ""); let value; if (inlineValue !== void 0) { value = inlineValue; } else { const next = argv[i + 1]; if (next !== void 0 && !next.startsWith("-")) { value = next; i += 1; } else { value = true; } } args[normalisedKey] = value; } return args; } // coding-tools/figma-tools/js/src/_utils/url-parse.ts var FILE_KEY_REGEX = /figma\.com\/(?:file|design)\/([A-Za-z0-9]+)\//i; function parseFigmaUrl(input) { if (!input) return { fileKey: null, nodeId: null }; try { const url = new URL(input); const match = url.href.match(FILE_KEY_REGEX); const fileKey = match ? match[1] : null; const nodeParam = url.searchParams.get("node-id"); const nodeId = nodeParam ? ensureNodeId(nodeParam) : null; return { fileKey, nodeId }; } catch { return { fileKey: null, nodeId: null }; } } function ensureNodeId(value) { if (!value) return null; const decoded = decodeURIComponent(value); if (decoded.includes(":")) return decoded; if (/^[0-9]+-[0-9]+$/.test(decoded)) { const [left, right] = decoded.split("-", 2); return `${left}:${right}`; } return decoded; } // coding-tools/figma-tools/js/src/_utils/config.ts var config_default = { schemaVersion: "1.0.0", source: "agentic-coding-templates/figma-tools", http: { maxAttempts: 5, initialDelayMs: 250 } }; // coding-tools/figma-tools/js/src/_utils/envelope.ts function buildRateLimitMeta(rateLimit = {}) { return { remaining: rateLimit.remaining ?? null, resetAt: rateLimit.resetAt ?? null, attempts: rateLimit.attempts ?? 1, lastWaitMs: rateLimit.lastWaitMs ?? 0 }; } function createEnvelope({ tool, input = {}, data = {}, warnings = [], errors = [], rateLimit, schemaVersion }) { return { schemaVersion: schemaVersion ?? config_default.schemaVersion, tool, input, meta: { generatedAt: (/* @__PURE__ */ new Date()).toISOString(), source: config_default.source, rateLimit: buildRateLimitMeta(rateLimit) }, data, warnings, errors }; } // coding-tools/figma-tools/js/src/_utils/errors.ts var ERROR_EXIT_CODES = { INPUT_INVALID: 1, CONFIG_INVALID: 1, FIGMA_AUTH: 1, FIGMA_NOT_FOUND: 2, FIGMA_RATE_LIMIT: 2, NETWORK: 2, INTERNAL: 3 }; function createError(code, message, detail) { return { code, message, detail: detail ?? null }; } function getExitCode(errors = []) { if (!errors.length) { return 0; } return errors.reduce((max, error) => { const exitCode = ERROR_EXIT_CODES[error.code] ?? 1; return Math.max(max, exitCode); }, 0); } // coding-tools/figma-tools/js/src/_utils/http-client.ts var BASE_URL = "https://api.figma.com"; function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } function parseJsonSafely(text) { try { return text ? JSON.parse(text) : {}; } catch { return { raw: text }; } } function parseRateLimit(headers, attempts, lastWaitMs) { const remainingHeader = headers.get("x-ratelimit-remaining"); const resetHeader = headers.get("x-ratelimit-reset"); let remaining = null; if (remainingHeader !== null && remainingHeader !== void 0) { const parsed = Number(remainingHeader); remaining = Number.isNaN(parsed) ? null : parsed; } let resetAt = null; if (resetHeader) { const numericReset = Number(resetHeader); if (!Number.isNaN(numericReset)) { resetAt = new Date(numericReset * 1e3).toISOString(); } else { const date = new Date(resetHeader); if (!Number.isNaN(date.valueOf())) { resetAt = date.toISOString(); } } } return { remaining, resetAt, attempts, lastWaitMs }; } function computeBackoffMs(attempt, initialDelayMs) { return initialDelayMs * 2 ** (attempt - 1); } async function figmaRequest(options) { const { path, method = "GET", token, headers = {}, body, searchParams, maxAttempts = config_default.http?.maxAttempts ?? 5, initialDelayMs = config_default.http?.initialDelayMs ?? 250 } = options; if (!token) { return { ok: false, error: createError("FIGMA_AUTH", "FIGMA_ACCESS_TOKEN is missing from the environment."), status: null, rateLimit: null }; } const url = new URL(path, BASE_URL); if (searchParams) { Object.entries(searchParams).forEach(([key, value]) => { if (value === void 0 || value === null) return; url.searchParams.append(key, String(value)); }); } let attempt = 0; let lastWaitMs = 0; while (attempt < maxAttempts) { attempt += 1; const response = await fetch(url, { method, headers: { "Content-Type": "application/json", "X-Figma-Token": token, ...headers }, body: body ? JSON.stringify(body) : void 0 }); const text = await response.text(); const payload = parseJsonSafely(text); const rateLimit = parseRateLimit(response.headers, attempt, lastWaitMs); if (response.ok) { return { ok: true, data: payload, rateLimit }; } const status = response.status; if (status === 401 || status === 403) { return { ok: false, error: createError("FIGMA_AUTH", payload?.message ?? "Figma token is unauthorized.", { status }), status, rateLimit }; } if (status === 404) { return { ok: false, error: createError("FIGMA_NOT_FOUND", payload?.message ?? "Resource not found.", { status }), status, rateLimit }; } if (status === 429 || status >= 500) { if (attempt >= maxAttempts) { return { ok: false, error: createError(status === 429 ? "FIGMA_RATE_LIMIT" : "NETWORK", payload?.message ?? "Figma request failed after maximum retries.", { status }), status, rateLimit }; } let waitMs = computeBackoffMs(attempt, initialDelayMs); const resetHeader = response.headers.get("x-ratelimit-reset"); if (resetHeader) { const asNumber = Number(resetHeader); if (!Number.isNaN(asNumber)) { const resetMs = asNumber * 1e3; const delta = resetMs - Date.now(); if (delta > 0) waitMs = Math.max(waitMs, delta); } } const jitter = Math.floor(Math.random() * 100); lastWaitMs = waitMs + jitter; await sleep(lastWaitMs); continue; } return { ok: false, error: createError("INTERNAL", payload?.message ?? "Unexpected error from Figma API.", { status }), status, rateLimit }; } return { ok: false, error: createError("NETWORK", "Unable to reach Figma API."), status: null, rateLimit: { remaining: null, resetAt: null, attempts: maxAttempts, lastWaitMs } }; } // coding-tools/figma-tools/js/src/get-metadata.ts var TOOL_NAME = "get-metadata"; function log(message, verbose) { if (verbose) { process.stderr.write(`[${TOOL_NAME}] ${message} `); } } function toOptionalString(value) { return typeof value === "string" && value.length > 0 ? value : null; } function exitWithEnvelope(envelope, errors = []) { process.stdout.write(`${JSON.stringify(envelope, null, 2)} `); process.exit(getExitCode(errors)); } function mapNode(node, index = 0, parentId = null) { const children = Array.isArray(node.children) ? node.children.map((child, idx) => mapNode(child, idx, node.id)) : []; return { id: node.id, name: node.name, type: node.type, visible: node.visible ?? true, locked: node.locked ?? false, index, parentId, characters: node.characters ?? null, blendMode: node.blendMode ?? null, opacity: node.opacity ?? 1, isMask: node.isMask ?? false, relativeTransform: node.relativeTransform ?? null, absoluteBoundingBox: node.absoluteBoundingBox ?? null, size: node.size ?? null, fills: node.fills ?? [], strokes: node.strokes ?? [], strokeWeight: node.strokeWeight ?? null, strokeAlign: node.strokeAlign ?? null, effects: node.effects ?? [], constraints: node.constraints ?? null, layoutAlign: node.layoutAlign ?? null, layoutGrow: node.layoutGrow ?? null, layoutMode: node.layoutMode ?? null, primaryAxisSizingMode: node.primaryAxisSizingMode ?? null, counterAxisSizingMode: node.counterAxisSizingMode ?? null, primaryAxisAlignItems: node.primaryAxisAlignItems ?? null, counterAxisAlignItems: node.counterAxisAlignItems ?? null, itemSpacing: node.itemSpacing ?? null, paddingLeft: node.paddingLeft ?? null, paddingRight: node.paddingRight ?? null, paddingTop: node.paddingTop ?? null, paddingBottom: node.paddingBottom ?? null, clipsContent: node.clipsContent ?? false, layoutGrids: node.layoutGrids ?? [], exportSettings: node.exportSettings ?? [], transitionNodeID: node.transitionNodeID ?? null, overlayPositionType: node.overlayPositionType ?? null, overlayRelativePosition: node.overlayRelativePosition ?? null, children }; } function escapeXml(value) { return value.replace(/&/g, "&").replace(//g, ">").replace(/\"/g, """).replace(/'/g, "'"); } function nodeToXml(node) { const attrs = [ `id="${escapeXml(node.id)}"`, node.type ? `type="${escapeXml(node.type)}"` : null, node.name ? `name="${escapeXml(node.name)}"` : null, node.visible === false ? 'visible="false"' : null, node.locked ? 'locked="true"' : null, node.parentId ? `parentId="${escapeXml(node.parentId)}"` : null, node.absoluteBoundingBox ? `x="${node.absoluteBoundingBox.x ?? 0}" y="${node.absoluteBoundingBox.y ?? 0}" width="${node.absoluteBoundingBox.width ?? 0}" height="${node.absoluteBoundingBox.height ?? 0}"` : null ].filter(Boolean); const childXml = node.children.map(nodeToXml).join(""); return `${childXml}`; } async function main() { const args = parseArgs(); const verbose = Boolean(args.verbose ?? args.v); const schemaVersion = toOptionalString(args["schema-version"]) ?? void 0; const warnings = []; const errors = []; const token = process.env.FIGMA_ACCESS_TOKEN; if (!token || !token.trim()) { errors.push(createError("FIGMA_AUTH", "FIGMA_ACCESS_TOKEN is required but was not provided.")); const envelope2 = createEnvelope({ tool: TOOL_NAME, input: { fileKey: null, nodeId: null, format: "json" }, warnings, errors, schemaVersion, data: {} }); exitWithEnvelope(envelope2, errors); } const urlInput = toOptionalString(args.url) ?? toOptionalString(args.u); let fileKey = toOptionalString(args["file-key"]) ?? void 0; let nodeId = ensureNodeId(toOptionalString(args["node-id"])); if (urlInput) { const parsed = parseFigmaUrl(urlInput); fileKey = fileKey || parsed.fileKey || void 0; nodeId = nodeId || parsed.nodeId; } let format = String(args.format ?? "json").toLowerCase(); let outputMode; if (format === "json" || format === "xml" || format === "both") { outputMode = format; } else { warnings.push(`Unknown format "${format}". Defaulting to json.`); outputMode = "json"; } const input = { fileKey: fileKey ?? null, nodeId: nodeId ?? null, format: outputMode }; if (!fileKey) { errors.push(createError("INPUT_INVALID", "A valid Figma file key is required (--file-key or --url).")); } if (!nodeId) { errors.push(createError("INPUT_INVALID", "A valid Figma node id is required (--node-id or --url with node-id).")); } if (errors.length) { const envelope2 = createEnvelope({ tool: TOOL_NAME, input, warnings, errors, data: {}, schemaVersion }); exitWithEnvelope(envelope2, errors); } const resolvedFileKey = fileKey; const resolvedNodeId = nodeId; log(`Fetching metadata for node ${resolvedNodeId} in file ${resolvedFileKey}`, verbose); const nodeResponse = await figmaRequest({ path: `/v1/files/${resolvedFileKey}/nodes`, token, searchParams: { ids: resolvedNodeId } }); if (!nodeResponse.ok) { errors.push(nodeResponse.error ?? createError("INTERNAL", "Failed to fetch node metadata.")); const envelope2 = createEnvelope({ tool: TOOL_NAME, input, warnings, errors, rateLimit: nodeResponse.rateLimit ?? void 0, data: {}, schemaVersion }); exitWithEnvelope(envelope2, errors); } const nodesMap = nodeResponse.data?.nodes ?? {}; const nodeWrapper = nodesMap[resolvedNodeId]; if (!nodeWrapper || !nodeWrapper.document) { errors.push(createError("FIGMA_NOT_FOUND", `Node ${resolvedNodeId} was not found in file ${resolvedFileKey}.`)); const envelope2 = createEnvelope({ tool: TOOL_NAME, input, warnings, errors, rateLimit: nodeResponse.rateLimit ?? void 0, data: {}, schemaVersion }); exitWithEnvelope(envelope2, errors); } const rootNode = nodeWrapper.document; const metadataTree = mapNode(rootNode); let xmlDocument; if (outputMode === "xml" || outputMode === "both") { xmlDocument = `${nodeToXml(metadataTree)}`; } const data = { file: { key: resolvedFileKey, name: nodeResponse.data?.name ?? null, lastModified: nodeResponse.data?.lastModified ?? null }, metadata: metadataTree, xml: xmlDocument }; const envelope = createEnvelope({ tool: TOOL_NAME, input, data, warnings, errors, rateLimit: nodeResponse.rateLimit ?? void 0, schemaVersion }); process.stdout.write(`${JSON.stringify(envelope, null, 2)} `); process.exit(getExitCode(errors)); } main().catch((error) => { const message = error instanceof Error ? error.message : "Unknown error"; const envelope = createEnvelope({ tool: TOOL_NAME, input: { fileKey: null, nodeId: null, format: "json" }, errors: [createError("INTERNAL", message, { stack: error instanceof Error ? error.stack : void 0 })], data: {} }); process.stdout.write(`${JSON.stringify(envelope, null, 2)} `); process.exit(3); }); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL191dGlscy9jbGktYXJncy50cyIsICIuLi9zcmMvX3V0aWxzL3VybC1wYXJzZS50cyIsICIuLi9zcmMvX3V0aWxzL2NvbmZpZy50cyIsICIuLi9zcmMvX3V0aWxzL2VudmVsb3BlLnRzIiwgIi4uL3NyYy9fdXRpbHMvZXJyb3JzLnRzIiwgIi4uL3NyYy9fdXRpbHMvaHR0cC1jbGllbnQudHMiLCAiLi4vc3JjL2dldC1tZXRhZGF0YS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgQ2xpQXJnVmFsdWUgPSBzdHJpbmcgfCBib29sZWFuO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaUFyZ3Mge1xuICBfOiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogQ2xpQXJnVmFsdWUgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndi5zbGljZSgyKSk6IENsaUFyZ3Mge1xuICBjb25zdCBhcmdzOiBDbGlBcmdzID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoIWFyZy5zdGFydHNXaXRoKCctJykgfHwgYXJnID09PSAnLScpIHtcbiAgICAgIGFyZ3MuXy5wdXNoKGFyZyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBhcmd2LnNsaWNlKGkgKyAxKTtcbiAgICAgIGFyZ3MuXy5wdXNoKC4uLnJlbWFpbmluZyk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBbcmF3S2V5LCBpbmxpbmVWYWx1ZV0gPSBhcmcuc3BsaXQoJz0nLCAyKTtcbiAgICBjb25zdCBub3JtYWxpc2VkS2V5ID0gcmF3S2V5LnJlcGxhY2UoL14tKy8sICcnKTtcblxuICAgIGxldCB2YWx1ZTogQ2xpQXJnVmFsdWU7XG4gICAgaWYgKGlubGluZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gaW5saW5lVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHZhbHVlID0gbmV4dDtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFyZ3Nbbm9ybWFsaXNlZEtleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG4iLCAiY29uc3QgRklMRV9LRVlfUkVHRVggPSAvZmlnbWFcXC5jb21cXC8oPzpmaWxlfGRlc2lnbilcXC8oW0EtWmEtejAtOV0rKVxcLy9pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEZpZ21hVXJsIHtcbiAgZmlsZUtleTogc3RyaW5nIHwgbnVsbDtcbiAgbm9kZUlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWdtYVVybChpbnB1dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFBhcnNlZEZpZ21hVXJsIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIHsgZmlsZUtleTogbnVsbCwgbm9kZUlkOiBudWxsIH07XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChpbnB1dCk7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwuaHJlZi5tYXRjaChGSUxFX0tFWV9SRUdFWCk7XG4gICAgY29uc3QgZmlsZUtleSA9IG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xuICAgIGNvbnN0IG5vZGVQYXJhbSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdub2RlLWlkJyk7XG4gICAgY29uc3Qgbm9kZUlkID0gbm9kZVBhcmFtID8gZW5zdXJlTm9kZUlkKG5vZGVQYXJhbSkgOiBudWxsO1xuICAgIHJldHVybiB7IGZpbGVLZXksIG5vZGVJZCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBmaWxlS2V5OiBudWxsLCBub2RlSWQ6IG51bGwgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTm9kZUlkKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgaWYgKGRlY29kZWQuaW5jbHVkZXMoJzonKSkgcmV0dXJuIGRlY29kZWQ7XG4gIGlmICgvXlswLTldKy1bMC05XSskLy50ZXN0KGRlY29kZWQpKSB7XG4gICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGRlY29kZWQuc3BsaXQoJy0nLCAyKTtcbiAgICByZXR1cm4gYCR7bGVmdH06JHtyaWdodH1gO1xuICB9XG4gIHJldHVybiBkZWNvZGVkO1xufVxuXG4iLCAiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWFWZXJzaW9uOiAnMS4wLjAnLFxuICBzb3VyY2U6ICdhZ2VudGljLWNvZGluZy10ZW1wbGF0ZXMvZmlnbWEtdG9vbHMnLFxuICBodHRwOiB7XG4gICAgbWF4QXR0ZW1wdHM6IDUsXG4gICAgaW5pdGlhbERlbGF5TXM6IDI1MCxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbiIsICJpbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnLnRzJztcbmltcG9ydCB0eXBlIHsgVG9vbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdE1ldGEge1xuICByZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG4gIHJlc2V0QXQ6IHN0cmluZyB8IG51bGw7XG4gIGF0dGVtcHRzOiBudW1iZXI7XG4gIGxhc3RXYWl0TXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb29sRW52ZWxvcGU8XG4gIFRJbnB1dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFREYXRhID0gdW5rbm93blxuPiB7XG4gIHNjaGVtYVZlcnNpb246IHN0cmluZztcbiAgdG9vbDogc3RyaW5nO1xuICBpbnB1dDogVElucHV0O1xuICBtZXRhOiB7XG4gICAgZ2VuZXJhdGVkQXQ6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByYXRlTGltaXQ6IFJhdGVMaW1pdE1ldGE7XG4gIH07XG4gIGRhdGE6IFREYXRhO1xuICB3YXJuaW5nczogc3RyaW5nW107XG4gIGVycm9yczogVG9vbEVycm9yW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRW52ZWxvcGVPcHRpb25zPFxuICBUSW5wdXQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBURGF0YSA9IHVua25vd25cbj4ge1xuICB0b29sOiBzdHJpbmc7XG4gIGlucHV0PzogVElucHV0O1xuICBkYXRhPzogVERhdGE7XG4gIHdhcm5pbmdzPzogc3RyaW5nW107XG4gIGVycm9ycz86IFRvb2xFcnJvcltdO1xuICByYXRlTGltaXQ/OiBQYXJ0aWFsPFJhdGVMaW1pdE1ldGE+O1xuICBzY2hlbWFWZXJzaW9uPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhdGVMaW1pdE1ldGEocmF0ZUxpbWl0OiBQYXJ0aWFsPFJhdGVMaW1pdE1ldGE+ID0ge30pOiBSYXRlTGltaXRNZXRhIHtcbiAgcmV0dXJuIHtcbiAgICByZW1haW5pbmc6IHJhdGVMaW1pdC5yZW1haW5pbmcgPz8gbnVsbCxcbiAgICByZXNldEF0OiByYXRlTGltaXQucmVzZXRBdCA/PyBudWxsLFxuICAgIGF0dGVtcHRzOiByYXRlTGltaXQuYXR0ZW1wdHMgPz8gMSxcbiAgICBsYXN0V2FpdE1zOiByYXRlTGltaXQubGFzdFdhaXRNcyA/PyAwLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52ZWxvcGU8XG4gIFRJbnB1dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFREYXRhID0gdW5rbm93blxuPih7XG4gIHRvb2wsXG4gIGlucHV0ID0ge30gYXMgVElucHV0LFxuICBkYXRhID0ge30gYXMgVERhdGEsXG4gIHdhcm5pbmdzID0gW10sXG4gIGVycm9ycyA9IFtdLFxuICByYXRlTGltaXQsXG4gIHNjaGVtYVZlcnNpb24sXG59OiBDcmVhdGVFbnZlbG9wZU9wdGlvbnM8VElucHV0LCBURGF0YT4pOiBUb29sRW52ZWxvcGU8VElucHV0LCBURGF0YT4ge1xuICByZXR1cm4ge1xuICAgIHNjaGVtYVZlcnNpb246IHNjaGVtYVZlcnNpb24gPz8gY29uZmlnLnNjaGVtYVZlcnNpb24sXG4gICAgdG9vbCxcbiAgICBpbnB1dCxcbiAgICBtZXRhOiB7XG4gICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgc291cmNlOiBjb25maWcuc291cmNlLFxuICAgICAgcmF0ZUxpbWl0OiBidWlsZFJhdGVMaW1pdE1ldGEocmF0ZUxpbWl0KSxcbiAgICB9LFxuICAgIGRhdGEsXG4gICAgd2FybmluZ3MsXG4gICAgZXJyb3JzLFxuICB9O1xufVxuXG4iLCAiZXhwb3J0IGNvbnN0IEVSUk9SX0VYSVRfQ09ERVMgPSB7XG4gIElOUFVUX0lOVkFMSUQ6IDEsXG4gIENPTkZJR19JTlZBTElEOiAxLFxuICBGSUdNQV9BVVRIOiAxLFxuICBGSUdNQV9OT1RfRk9VTkQ6IDIsXG4gIEZJR01BX1JBVEVfTElNSVQ6IDIsXG4gIE5FVFdPUks6IDIsXG4gIElOVEVSTkFMOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlID0ga2V5b2YgdHlwZW9mIEVSUk9SX0VYSVRfQ09ERVM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbEVycm9yPFREZXRhaWwgPSB1bmtub3duPiB7XG4gIGNvZGU6IEVycm9yQ29kZSB8IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkZXRhaWw/OiBURGV0YWlsIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9yPFREZXRhaWwgPSB1bmtub3duPihcbiAgY29kZTogRXJyb3JDb2RlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGRldGFpbD86IFREZXRhaWwgfCBudWxsXG4pOiBUb29sRXJyb3I8VERldGFpbD4ge1xuICByZXR1cm4ge1xuICAgIGNvZGUsXG4gICAgbWVzc2FnZSxcbiAgICBkZXRhaWw6IGRldGFpbCA/PyBudWxsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhpdENvZGUoZXJyb3JzOiBUb29sRXJyb3JbXSA9IFtdKTogbnVtYmVyIHtcbiAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gZXJyb3JzLnJlZHVjZSgobWF4LCBlcnJvcikgPT4ge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gRVJST1JfRVhJVF9DT0RFU1tlcnJvci5jb2RlIGFzIEVycm9yQ29kZV0gPz8gMTtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBleGl0Q29kZSk7XG4gIH0sIDApO1xufVxuXG4iLCAiaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZy50cyc7XG5pbXBvcnQgeyBjcmVhdGVFcnJvciB9IGZyb20gJy4vZXJyb3JzLnRzJztcbmltcG9ydCB0eXBlIHsgVG9vbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMudHMnO1xuaW1wb3J0IHR5cGUgeyBSYXRlTGltaXRNZXRhIH0gZnJvbSAnLi9lbnZlbG9wZS50cyc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLmZpZ21hLmNvbSc7XG5cbnR5cGUgU2VhcmNoUGFyYW1zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+O1xuXG5pbnRlcmZhY2UgRmlnbWFSZXF1ZXN0T3B0aW9ucyB7XG4gIHBhdGg6IHN0cmluZztcbiAgbWV0aG9kPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGJvZHk/OiB1bmtub3duO1xuICBzZWFyY2hQYXJhbXM/OiBTZWFyY2hQYXJhbXM7XG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICBpbml0aWFsRGVsYXlNcz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEZpZ21hU3VjY2VzczxURGF0YT4ge1xuICBvazogdHJ1ZTtcbiAgZGF0YTogVERhdGE7XG4gIHJhdGVMaW1pdDogUmF0ZUxpbWl0TWV0YTtcbn1cblxuaW50ZXJmYWNlIEZpZ21hRmFpbHVyZSB7XG4gIG9rOiBmYWxzZTtcbiAgZXJyb3I6IFRvb2xFcnJvcjx7IHN0YXR1cz86IG51bWJlciB9PjtcbiAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgcmF0ZUxpbWl0OiBSYXRlTGltaXRNZXRhIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgRmlnbWFSZXNwb25zZTxURGF0YT4gPSBGaWdtYVN1Y2Nlc3M8VERhdGE+IHwgRmlnbWFGYWlsdXJlO1xuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb25TYWZlbHkodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDoge307XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHJhdzogdGV4dCB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmF0ZUxpbWl0KGhlYWRlcnM6IEhlYWRlcnMsIGF0dGVtcHRzOiBudW1iZXIsIGxhc3RXYWl0TXM6IG51bWJlcik6IFJhdGVMaW1pdE1ldGEge1xuICBjb25zdCByZW1haW5pbmdIZWFkZXIgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJyk7XG4gIGNvbnN0IHJlc2V0SGVhZGVyID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0Jyk7XG5cbiAgbGV0IHJlbWFpbmluZzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChyZW1haW5pbmdIZWFkZXIgIT09IG51bGwgJiYgcmVtYWluaW5nSGVhZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmVtYWluaW5nSGVhZGVyKTtcbiAgICByZW1haW5pbmcgPSBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IG51bGwgOiBwYXJzZWQ7XG4gIH1cblxuICBsZXQgcmVzZXRBdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlmIChyZXNldEhlYWRlcikge1xuICAgIGNvbnN0IG51bWVyaWNSZXNldCA9IE51bWJlcihyZXNldEhlYWRlcik7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtZXJpY1Jlc2V0KSkge1xuICAgICAgcmVzZXRBdCA9IG5ldyBEYXRlKG51bWVyaWNSZXNldCAqIDEwMDApLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShyZXNldEhlYWRlcik7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihkYXRlLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgcmVzZXRBdCA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlbWFpbmluZyxcbiAgICByZXNldEF0LFxuICAgIGF0dGVtcHRzLFxuICAgIGxhc3RXYWl0TXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVCYWNrb2ZmTXMoYXR0ZW1wdDogbnVtYmVyLCBpbml0aWFsRGVsYXlNczogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGluaXRpYWxEZWxheU1zICogMiAqKiAoYXR0ZW1wdCAtIDEpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlnbWFSZXF1ZXN0PFREYXRhID0gdW5rbm93bj4oXG4gIG9wdGlvbnM6IEZpZ21hUmVxdWVzdE9wdGlvbnNcbik6IFByb21pc2U8RmlnbWFSZXNwb25zZTxURGF0YT4+IHtcbiAgY29uc3Qge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kID0gJ0dFVCcsXG4gICAgdG9rZW4sXG4gICAgaGVhZGVycyA9IHt9LFxuICAgIGJvZHksXG4gICAgc2VhcmNoUGFyYW1zLFxuICAgIG1heEF0dGVtcHRzID0gY29uZmlnLmh0dHA/Lm1heEF0dGVtcHRzID8/IDUsXG4gICAgaW5pdGlhbERlbGF5TXMgPSBjb25maWcuaHR0cD8uaW5pdGlhbERlbGF5TXMgPz8gMjUwLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXRva2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiBjcmVhdGVFcnJvcignRklHTUFfQVVUSCcsICdGSUdNQV9BQ0NFU1NfVE9LRU4gaXMgbWlzc2luZyBmcm9tIHRoZSBlbnZpcm9ubWVudC4nKSxcbiAgICAgIHN0YXR1czogbnVsbCxcbiAgICAgIHJhdGVMaW1pdDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBCQVNFX1VSTCk7XG5cbiAgaWYgKHNlYXJjaFBhcmFtcykge1xuICAgIE9iamVjdC5lbnRyaWVzKHNlYXJjaFBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMDtcbiAgbGV0IGxhc3RXYWl0TXMgPSAwO1xuXG4gIHdoaWxlIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1GaWdtYS1Ub2tlbic6IHRva2VuLFxuICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHBhcnNlSnNvblNhZmVseSh0ZXh0KSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgICBjb25zdCByYXRlTGltaXQgPSBwYXJzZVJhdGVMaW1pdChyZXNwb25zZS5oZWFkZXJzLCBhdHRlbXB0LCBsYXN0V2FpdE1zKTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IHBheWxvYWQgYXMgVERhdGEsIHJhdGVMaW1pdCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcblxuICAgIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMykge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogY3JlYXRlRXJyb3IoJ0ZJR01BX0FVVEgnLCBwYXlsb2FkPy5tZXNzYWdlID8/ICdGaWdtYSB0b2tlbiBpcyB1bmF1dGhvcml6ZWQuJywgeyBzdGF0dXMgfSksIHN0YXR1cywgcmF0ZUxpbWl0IH07XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjcmVhdGVFcnJvcignRklHTUFfTk9UX0ZPVU5EJywgcGF5bG9hZD8ubWVzc2FnZSA/PyAnUmVzb3VyY2Ugbm90IGZvdW5kLicsIHsgc3RhdHVzIH0pLCBzdGF0dXMsIHJhdGVMaW1pdCB9O1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQyOSB8fCBzdGF0dXMgPj0gNTAwKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogY3JlYXRlRXJyb3Ioc3RhdHVzID09PSA0MjkgPyAnRklHTUFfUkFURV9MSU1JVCcgOiAnTkVUV09SSycsIHBheWxvYWQ/Lm1lc3NhZ2UgPz8gJ0ZpZ21hIHJlcXVlc3QgZmFpbGVkIGFmdGVyIG1heGltdW0gcmV0cmllcy4nLCB7IHN0YXR1cyB9KSxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcmF0ZUxpbWl0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FpdE1zID0gY29tcHV0ZUJhY2tvZmZNcyhhdHRlbXB0LCBpbml0aWFsRGVsYXlNcyk7XG4gICAgICBjb25zdCByZXNldEhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldCcpO1xuICAgICAgaWYgKHJlc2V0SGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHJlc2V0SGVhZGVyKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYXNOdW1iZXIpKSB7XG4gICAgICAgICAgY29uc3QgcmVzZXRNcyA9IGFzTnVtYmVyICogMTAwMDtcbiAgICAgICAgICBjb25zdCBkZWx0YSA9IHJlc2V0TXMgLSBEYXRlLm5vdygpO1xuICAgICAgICAgIGlmIChkZWx0YSA+IDApIHdhaXRNcyA9IE1hdGgubWF4KHdhaXRNcywgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGppdHRlciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCk7XG4gICAgICBsYXN0V2FpdE1zID0gd2FpdE1zICsgaml0dGVyO1xuICAgICAgYXdhaXQgc2xlZXAobGFzdFdhaXRNcyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjcmVhdGVFcnJvcignSU5URVJOQUwnLCBwYXlsb2FkPy5tZXNzYWdlID8/ICdVbmV4cGVjdGVkIGVycm9yIGZyb20gRmlnbWEgQVBJLicsIHsgc3RhdHVzIH0pLCBzdGF0dXMsIHJhdGVMaW1pdCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvazogZmFsc2UsXG4gICAgZXJyb3I6IGNyZWF0ZUVycm9yKCdORVRXT1JLJywgJ1VuYWJsZSB0byByZWFjaCBGaWdtYSBBUEkuJyksXG4gICAgc3RhdHVzOiBudWxsLFxuICAgIHJhdGVMaW1pdDogeyByZW1haW5pbmc6IG51bGwsIHJlc2V0QXQ6IG51bGwsIGF0dGVtcHRzOiBtYXhBdHRlbXB0cywgbGFzdFdhaXRNcyB9LFxuICB9O1xufVxuXG4iLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwYXJzZUFyZ3MsIHR5cGUgQ2xpQXJncyB9IGZyb20gJy4vX3V0aWxzL2NsaS1hcmdzLnRzJ1xuaW1wb3J0IHsgcGFyc2VGaWdtYVVybCwgZW5zdXJlTm9kZUlkIH0gZnJvbSAnLi9fdXRpbHMvdXJsLXBhcnNlLnRzJ1xuaW1wb3J0IHsgY3JlYXRlRW52ZWxvcGUsIHR5cGUgVG9vbEVudmVsb3BlIH0gZnJvbSAnLi9fdXRpbHMvZW52ZWxvcGUudHMnXG5pbXBvcnQgeyBjcmVhdGVFcnJvciwgZ2V0RXhpdENvZGUsIHR5cGUgVG9vbEVycm9yIH0gZnJvbSAnLi9fdXRpbHMvZXJyb3JzLnRzJ1xuaW1wb3J0IHsgZmlnbWFSZXF1ZXN0IH0gZnJvbSAnLi9fdXRpbHMvaHR0cC1jbGllbnQudHMnXG5cbmNvbnN0IFRPT0xfTkFNRSA9ICdnZXQtbWV0YWRhdGEnXG50eXBlIEVtcHR5RGF0YSA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPlxuXG5pbnRlcmZhY2UgVG9vbElucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBmaWxlS2V5OiBzdHJpbmcgfCBudWxsXG4gIG5vZGVJZDogc3RyaW5nIHwgbnVsbFxuICBmb3JtYXQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgRmlnbWFOb2RlIHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHR5cGU/OiBzdHJpbmdcbiAgdmlzaWJsZT86IGJvb2xlYW5cbiAgbG9ja2VkPzogYm9vbGVhblxuICBjaGFyYWN0ZXJzPzogc3RyaW5nXG4gIGJsZW5kTW9kZT86IHN0cmluZ1xuICBvcGFjaXR5PzogbnVtYmVyXG4gIGlzTWFzaz86IGJvb2xlYW5cbiAgcmVsYXRpdmVUcmFuc2Zvcm0/OiB1bmtub3duXG4gIGFic29sdXRlQm91bmRpbmdCb3g/OiB7IHg/OiBudW1iZXI7IHk/OiBudW1iZXI7IHdpZHRoPzogbnVtYmVyOyBoZWlnaHQ/OiBudW1iZXIgfVxuICBzaXplPzogdW5rbm93blxuICBmaWxscz86IHVua25vd25bXVxuICBzdHJva2VzPzogdW5rbm93bltdXG4gIHN0cm9rZVdlaWdodD86IG51bWJlclxuICBzdHJva2VBbGlnbj86IHN0cmluZ1xuICBlZmZlY3RzPzogdW5rbm93bltdXG4gIGNvbnN0cmFpbnRzPzogdW5rbm93blxuICBsYXlvdXRBbGlnbj86IHN0cmluZ1xuICBsYXlvdXRHcm93PzogbnVtYmVyXG4gIGxheW91dE1vZGU/OiBzdHJpbmdcbiAgcHJpbWFyeUF4aXNTaXppbmdNb2RlPzogc3RyaW5nXG4gIGNvdW50ZXJBeGlzU2l6aW5nTW9kZT86IHN0cmluZ1xuICBwcmltYXJ5QXhpc0FsaWduSXRlbXM/OiBzdHJpbmdcbiAgY291bnRlckF4aXNBbGlnbkl0ZW1zPzogc3RyaW5nXG4gIGl0ZW1TcGFjaW5nPzogbnVtYmVyXG4gIHBhZGRpbmdMZWZ0PzogbnVtYmVyXG4gIHBhZGRpbmdSaWdodD86IG51bWJlclxuICBwYWRkaW5nVG9wPzogbnVtYmVyXG4gIHBhZGRpbmdCb3R0b20/OiBudW1iZXJcbiAgY2xpcHNDb250ZW50PzogYm9vbGVhblxuICBsYXlvdXRHcmlkcz86IHVua25vd25bXVxuICBleHBvcnRTZXR0aW5ncz86IHVua25vd25bXVxuICB0cmFuc2l0aW9uTm9kZUlEPzogc3RyaW5nXG4gIG92ZXJsYXlQb3NpdGlvblR5cGU/OiBzdHJpbmdcbiAgb3ZlcmxheVJlbGF0aXZlUG9zaXRpb24/OiB1bmtub3duXG4gIGNoaWxkcmVuPzogRmlnbWFOb2RlW11cbn1cblxuaW50ZXJmYWNlIE5vZGVzUmVzcG9uc2VQYXlsb2FkIHtcbiAgbmFtZT86IHN0cmluZ1xuICBsYXN0TW9kaWZpZWQ/OiBzdHJpbmdcbiAgbm9kZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IGRvY3VtZW50PzogRmlnbWFOb2RlIH0+XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YU5vZGUge1xuICBpZDogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgdHlwZT86IHN0cmluZ1xuICB2aXNpYmxlOiBib29sZWFuXG4gIGxvY2tlZDogYm9vbGVhblxuICBpbmRleDogbnVtYmVyXG4gIHBhcmVudElkOiBzdHJpbmcgfCBudWxsXG4gIGNoYXJhY3RlcnM6IHN0cmluZyB8IG51bGxcbiAgYmxlbmRNb2RlOiBzdHJpbmcgfCBudWxsXG4gIG9wYWNpdHk6IG51bWJlclxuICBpc01hc2s6IGJvb2xlYW5cbiAgcmVsYXRpdmVUcmFuc2Zvcm06IHVua25vd25cbiAgYWJzb2x1dGVCb3VuZGluZ0JveDogeyB4PzogbnVtYmVyOyB5PzogbnVtYmVyOyB3aWR0aD86IG51bWJlcjsgaGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsXG4gIHNpemU6IHVua25vd25cbiAgZmlsbHM6IHVua25vd25bXVxuICBzdHJva2VzOiB1bmtub3duW11cbiAgc3Ryb2tlV2VpZ2h0OiBudW1iZXIgfCBudWxsXG4gIHN0cm9rZUFsaWduOiBzdHJpbmcgfCBudWxsXG4gIGVmZmVjdHM6IHVua25vd25bXVxuICBjb25zdHJhaW50czogdW5rbm93blxuICBsYXlvdXRBbGlnbjogc3RyaW5nIHwgbnVsbFxuICBsYXlvdXRHcm93OiBudW1iZXIgfCBudWxsXG4gIGxheW91dE1vZGU6IHN0cmluZyB8IG51bGxcbiAgcHJpbWFyeUF4aXNTaXppbmdNb2RlOiBzdHJpbmcgfCBudWxsXG4gIGNvdW50ZXJBeGlzU2l6aW5nTW9kZTogc3RyaW5nIHwgbnVsbFxuICBwcmltYXJ5QXhpc0FsaWduSXRlbXM6IHN0cmluZyB8IG51bGxcbiAgY291bnRlckF4aXNBbGlnbkl0ZW1zOiBzdHJpbmcgfCBudWxsXG4gIGl0ZW1TcGFjaW5nOiBudW1iZXIgfCBudWxsXG4gIHBhZGRpbmdMZWZ0OiBudW1iZXIgfCBudWxsXG4gIHBhZGRpbmdSaWdodDogbnVtYmVyIHwgbnVsbFxuICBwYWRkaW5nVG9wOiBudW1iZXIgfCBudWxsXG4gIHBhZGRpbmdCb3R0b206IG51bWJlciB8IG51bGxcbiAgY2xpcHNDb250ZW50OiBib29sZWFuXG4gIGxheW91dEdyaWRzOiB1bmtub3duW11cbiAgZXhwb3J0U2V0dGluZ3M6IHVua25vd25bXVxuICB0cmFuc2l0aW9uTm9kZUlEOiBzdHJpbmcgfCBudWxsXG4gIG92ZXJsYXlQb3NpdGlvblR5cGU6IHN0cmluZyB8IG51bGxcbiAgb3ZlcmxheVJlbGF0aXZlUG9zaXRpb246IHVua25vd25cbiAgY2hpbGRyZW46IE1ldGFkYXRhTm9kZVtdXG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURhdGEge1xuICBmaWxlOiB7XG4gICAga2V5OiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsXG4gICAgbGFzdE1vZGlmaWVkOiBzdHJpbmcgfCBudWxsXG4gIH1cbiAgbWV0YWRhdGE6IE1ldGFkYXRhTm9kZVxuICB4bWw/OiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gbG9nKG1lc3NhZ2U6IHN0cmluZywgdmVyYm9zZTogYm9vbGVhbik6IHZvaWQge1xuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBbJHtUT09MX05BTUV9XSAke21lc3NhZ2V9XFxuYClcbiAgfVxufVxuXG5mdW5jdGlvbiB0b09wdGlvbmFsU3RyaW5nKHZhbHVlOiBDbGlBcmdzW3N0cmluZ10pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlIDogbnVsbFxufVxuXG5mdW5jdGlvbiBleGl0V2l0aEVudmVsb3BlKFxuICBlbnZlbG9wZTogVG9vbEVudmVsb3BlPFRvb2xJbnB1dCwgTWV0YWRhdGFEYXRhIHwgRW1wdHlEYXRhPixcbiAgZXJyb3JzOiBUb29sRXJyb3JbXSA9IFtdXG4pOiBuZXZlciB7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKX1cXG5gKVxuICBwcm9jZXNzLmV4aXQoZ2V0RXhpdENvZGUoZXJyb3JzKSlcbn1cblxuZnVuY3Rpb24gbWFwTm9kZShub2RlOiBGaWdtYU5vZGUsIGluZGV4ID0gMCwgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogTWV0YWRhdGFOb2RlIHtcbiAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pXG4gICAgPyBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQsIGlkeCkgPT4gbWFwTm9kZShjaGlsZCwgaWR4LCBub2RlLmlkKSlcbiAgICA6IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogbm9kZS5pZCxcbiAgICBuYW1lOiBub2RlLm5hbWUsXG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIHZpc2libGU6IG5vZGUudmlzaWJsZSA/PyB0cnVlLFxuICAgIGxvY2tlZDogbm9kZS5sb2NrZWQgPz8gZmFsc2UsXG4gICAgaW5kZXgsXG4gICAgcGFyZW50SWQsXG4gICAgY2hhcmFjdGVyczogbm9kZS5jaGFyYWN0ZXJzID8/IG51bGwsXG4gICAgYmxlbmRNb2RlOiBub2RlLmJsZW5kTW9kZSA/PyBudWxsLFxuICAgIG9wYWNpdHk6IG5vZGUub3BhY2l0eSA/PyAxLFxuICAgIGlzTWFzazogbm9kZS5pc01hc2sgPz8gZmFsc2UsXG4gICAgcmVsYXRpdmVUcmFuc2Zvcm06IG5vZGUucmVsYXRpdmVUcmFuc2Zvcm0gPz8gbnVsbCxcbiAgICBhYnNvbHV0ZUJvdW5kaW5nQm94OiBub2RlLmFic29sdXRlQm91bmRpbmdCb3ggPz8gbnVsbCxcbiAgICBzaXplOiBub2RlLnNpemUgPz8gbnVsbCxcbiAgICBmaWxsczogbm9kZS5maWxscyA/PyBbXSxcbiAgICBzdHJva2VzOiBub2RlLnN0cm9rZXMgPz8gW10sXG4gICAgc3Ryb2tlV2VpZ2h0OiBub2RlLnN0cm9rZVdlaWdodCA/PyBudWxsLFxuICAgIHN0cm9rZUFsaWduOiBub2RlLnN0cm9rZUFsaWduID8/IG51bGwsXG4gICAgZWZmZWN0czogbm9kZS5lZmZlY3RzID8/IFtdLFxuICAgIGNvbnN0cmFpbnRzOiBub2RlLmNvbnN0cmFpbnRzID8/IG51bGwsXG4gICAgbGF5b3V0QWxpZ246IG5vZGUubGF5b3V0QWxpZ24gPz8gbnVsbCxcbiAgICBsYXlvdXRHcm93OiBub2RlLmxheW91dEdyb3cgPz8gbnVsbCxcbiAgICBsYXlvdXRNb2RlOiBub2RlLmxheW91dE1vZGUgPz8gbnVsbCxcbiAgICBwcmltYXJ5QXhpc1NpemluZ01vZGU6IG5vZGUucHJpbWFyeUF4aXNTaXppbmdNb2RlID8/IG51bGwsXG4gICAgY291bnRlckF4aXNTaXppbmdNb2RlOiBub2RlLmNvdW50ZXJBeGlzU2l6aW5nTW9kZSA/PyBudWxsLFxuICAgIHByaW1hcnlBeGlzQWxpZ25JdGVtczogbm9kZS5wcmltYXJ5QXhpc0FsaWduSXRlbXMgPz8gbnVsbCxcbiAgICBjb3VudGVyQXhpc0FsaWduSXRlbXM6IG5vZGUuY291bnRlckF4aXNBbGlnbkl0ZW1zID8/IG51bGwsXG4gICAgaXRlbVNwYWNpbmc6IG5vZGUuaXRlbVNwYWNpbmcgPz8gbnVsbCxcbiAgICBwYWRkaW5nTGVmdDogbm9kZS5wYWRkaW5nTGVmdCA/PyBudWxsLFxuICAgIHBhZGRpbmdSaWdodDogbm9kZS5wYWRkaW5nUmlnaHQgPz8gbnVsbCxcbiAgICBwYWRkaW5nVG9wOiBub2RlLnBhZGRpbmdUb3AgPz8gbnVsbCxcbiAgICBwYWRkaW5nQm90dG9tOiBub2RlLnBhZGRpbmdCb3R0b20gPz8gbnVsbCxcbiAgICBjbGlwc0NvbnRlbnQ6IG5vZGUuY2xpcHNDb250ZW50ID8/IGZhbHNlLFxuICAgIGxheW91dEdyaWRzOiBub2RlLmxheW91dEdyaWRzID8/IFtdLFxuICAgIGV4cG9ydFNldHRpbmdzOiBub2RlLmV4cG9ydFNldHRpbmdzID8/IFtdLFxuICAgIHRyYW5zaXRpb25Ob2RlSUQ6IG5vZGUudHJhbnNpdGlvbk5vZGVJRCA/PyBudWxsLFxuICAgIG92ZXJsYXlQb3NpdGlvblR5cGU6IG5vZGUub3ZlcmxheVBvc2l0aW9uVHlwZSA/PyBudWxsLFxuICAgIG92ZXJsYXlSZWxhdGl2ZVBvc2l0aW9uOiBub2RlLm92ZXJsYXlSZWxhdGl2ZVBvc2l0aW9uID8/IG51bGwsXG4gICAgY2hpbGRyZW4sXG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlWG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1xcXCIvZywgJyZxdW90OycpXG4gICAgLnJlcGxhY2UoLycvZywgJyZhcG9zOycpXG59XG5cbmZ1bmN0aW9uIG5vZGVUb1htbChub2RlOiBNZXRhZGF0YU5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBhdHRycyA9IFtcbiAgICBgaWQ9XFxcIiR7ZXNjYXBlWG1sKG5vZGUuaWQpfVxcXCJgLFxuICAgIG5vZGUudHlwZSA/IGB0eXBlPVxcXCIke2VzY2FwZVhtbChub2RlLnR5cGUpfVxcXCJgIDogbnVsbCxcbiAgICBub2RlLm5hbWUgPyBgbmFtZT1cXFwiJHtlc2NhcGVYbWwobm9kZS5uYW1lKX1cXFwiYCA6IG51bGwsXG4gICAgbm9kZS52aXNpYmxlID09PSBmYWxzZSA/ICd2aXNpYmxlPVxcXCJmYWxzZVxcXCInIDogbnVsbCxcbiAgICBub2RlLmxvY2tlZCA/ICdsb2NrZWQ9XFxcInRydWVcXFwiJyA6IG51bGwsXG4gICAgbm9kZS5wYXJlbnRJZCA/IGBwYXJlbnRJZD1cXFwiJHtlc2NhcGVYbWwobm9kZS5wYXJlbnRJZCl9XFxcImAgOiBudWxsLFxuICAgIG5vZGUuYWJzb2x1dGVCb3VuZGluZ0JveFxuICAgICAgPyBgeD1cXFwiJHtub2RlLmFic29sdXRlQm91bmRpbmdCb3gueCA/PyAwfVxcXCIgeT1cXFwiJHtub2RlLmFic29sdXRlQm91bmRpbmdCb3gueSA/PyAwfVxcXCIgd2lkdGg9XFxcIiR7bm9kZS5hYnNvbHV0ZUJvdW5kaW5nQm94LndpZHRoID8/IDB9XFxcIiBoZWlnaHQ9XFxcIiR7bm9kZS5hYnNvbHV0ZUJvdW5kaW5nQm94LmhlaWdodCA/PyAwfVxcXCJgXG4gICAgICA6IG51bGwsXG4gIF0uZmlsdGVyKEJvb2xlYW4pXG5cbiAgY29uc3QgY2hpbGRYbWwgPSBub2RlLmNoaWxkcmVuLm1hcChub2RlVG9YbWwpLmpvaW4oJycpXG4gIHJldHVybiBgPG5vZGUgJHthdHRycy5qb2luKCcgJyl9PiR7Y2hpbGRYbWx9PC9ub2RlPmBcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJncyA9IHBhcnNlQXJncygpXG4gIGNvbnN0IHZlcmJvc2UgPSBCb29sZWFuKGFyZ3MudmVyYm9zZSA/PyBhcmdzLnYpXG4gIGNvbnN0IHNjaGVtYVZlcnNpb24gPSB0b09wdGlvbmFsU3RyaW5nKGFyZ3NbJ3NjaGVtYS12ZXJzaW9uJ10pID8/IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGVycm9yczogVG9vbEVycm9yW10gPSBbXVxuXG4gIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnYuRklHTUFfQUNDRVNTX1RPS0VOXG5cbiAgaWYgKCF0b2tlbiB8fCAhdG9rZW4udHJpbSgpKSB7XG4gICAgZXJyb3JzLnB1c2goY3JlYXRlRXJyb3IoJ0ZJR01BX0FVVEgnLCAnRklHTUFfQUNDRVNTX1RPS0VOIGlzIHJlcXVpcmVkIGJ1dCB3YXMgbm90IHByb3ZpZGVkLicpKVxuICAgIGNvbnN0IGVudmVsb3BlID0gY3JlYXRlRW52ZWxvcGU8VG9vbElucHV0LCBFbXB0eURhdGE+KHtcbiAgICAgIHRvb2w6IFRPT0xfTkFNRSxcbiAgICAgIGlucHV0OiB7IGZpbGVLZXk6IG51bGwsIG5vZGVJZDogbnVsbCwgZm9ybWF0OiAnanNvbicgfSxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgZXJyb3JzLFxuICAgICAgc2NoZW1hVmVyc2lvbixcbiAgICAgIGRhdGE6IHt9IGFzIEVtcHR5RGF0YSxcbiAgICB9KVxuICAgIGV4aXRXaXRoRW52ZWxvcGUoZW52ZWxvcGUsIGVycm9ycylcbiAgfVxuXG4gIGNvbnN0IHVybElucHV0ID0gdG9PcHRpb25hbFN0cmluZyhhcmdzLnVybCkgPz8gdG9PcHRpb25hbFN0cmluZyhhcmdzLnUpXG4gIGxldCBmaWxlS2V5ID0gdG9PcHRpb25hbFN0cmluZyhhcmdzWydmaWxlLWtleSddKSA/PyB1bmRlZmluZWRcbiAgbGV0IG5vZGVJZCA9IGVuc3VyZU5vZGVJZCh0b09wdGlvbmFsU3RyaW5nKGFyZ3NbJ25vZGUtaWQnXSkpXG5cbiAgaWYgKHVybElucHV0KSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGaWdtYVVybCh1cmxJbnB1dClcbiAgICBmaWxlS2V5ID0gZmlsZUtleSB8fCBwYXJzZWQuZmlsZUtleSB8fCB1bmRlZmluZWRcbiAgICBub2RlSWQgPSBub2RlSWQgfHwgcGFyc2VkLm5vZGVJZFxuICB9XG5cbiAgbGV0IGZvcm1hdCA9IFN0cmluZyhhcmdzLmZvcm1hdCA/PyAnanNvbicpLnRvTG93ZXJDYXNlKClcbiAgbGV0IG91dHB1dE1vZGU6ICdqc29uJyB8ICd4bWwnIHwgJ2JvdGgnXG4gIGlmIChmb3JtYXQgPT09ICdqc29uJyB8fCBmb3JtYXQgPT09ICd4bWwnIHx8IGZvcm1hdCA9PT0gJ2JvdGgnKSB7XG4gICAgb3V0cHV0TW9kZSA9IGZvcm1hdCBhcyAnanNvbicgfCAneG1sJyB8ICdib3RoJ1xuICB9IGVsc2Uge1xuICAgIHdhcm5pbmdzLnB1c2goYFVua25vd24gZm9ybWF0IFxcXCIke2Zvcm1hdH1cXFwiLiBEZWZhdWx0aW5nIHRvIGpzb24uYClcbiAgICBvdXRwdXRNb2RlID0gJ2pzb24nXG4gIH1cblxuICBjb25zdCBpbnB1dDogVG9vbElucHV0ID0ge1xuICAgIGZpbGVLZXk6IGZpbGVLZXkgPz8gbnVsbCxcbiAgICBub2RlSWQ6IG5vZGVJZCA/PyBudWxsLFxuICAgIGZvcm1hdDogb3V0cHV0TW9kZSxcbiAgfVxuXG4gIGlmICghZmlsZUtleSkge1xuICAgIGVycm9ycy5wdXNoKGNyZWF0ZUVycm9yKCdJTlBVVF9JTlZBTElEJywgJ0EgdmFsaWQgRmlnbWEgZmlsZSBrZXkgaXMgcmVxdWlyZWQgKC0tZmlsZS1rZXkgb3IgLS11cmwpLicpKVxuICB9XG5cbiAgaWYgKCFub2RlSWQpIHtcbiAgICBlcnJvcnMucHVzaChjcmVhdGVFcnJvcignSU5QVVRfSU5WQUxJRCcsICdBIHZhbGlkIEZpZ21hIG5vZGUgaWQgaXMgcmVxdWlyZWQgKC0tbm9kZS1pZCBvciAtLXVybCB3aXRoIG5vZGUtaWQpLicpKVxuICB9XG5cbiAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IGNyZWF0ZUVudmVsb3BlPFRvb2xJbnB1dCwgRW1wdHlEYXRhPih7XG4gICAgICB0b29sOiBUT09MX05BTUUsXG4gICAgICBpbnB1dCxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgZXJyb3JzLFxuICAgICAgZGF0YToge30gYXMgRW1wdHlEYXRhLFxuICAgICAgc2NoZW1hVmVyc2lvbixcbiAgICB9KVxuICAgIGV4aXRXaXRoRW52ZWxvcGUoZW52ZWxvcGUsIGVycm9ycylcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRmlsZUtleSA9IGZpbGVLZXkgYXMgc3RyaW5nXG4gIGNvbnN0IHJlc29sdmVkTm9kZUlkID0gbm9kZUlkIGFzIHN0cmluZ1xuXG4gIGxvZyhgRmV0Y2hpbmcgbWV0YWRhdGEgZm9yIG5vZGUgJHtyZXNvbHZlZE5vZGVJZH0gaW4gZmlsZSAke3Jlc29sdmVkRmlsZUtleX1gLCB2ZXJib3NlKVxuXG4gIGNvbnN0IG5vZGVSZXNwb25zZSA9IGF3YWl0IGZpZ21hUmVxdWVzdDxOb2Rlc1Jlc3BvbnNlUGF5bG9hZD4oe1xuICAgIHBhdGg6IGAvdjEvZmlsZXMvJHtyZXNvbHZlZEZpbGVLZXl9L25vZGVzYCxcbiAgICB0b2tlbixcbiAgICBzZWFyY2hQYXJhbXM6IHsgaWRzOiByZXNvbHZlZE5vZGVJZCB9LFxuICB9KVxuXG4gIGlmICghbm9kZVJlc3BvbnNlLm9rKSB7XG4gICAgZXJyb3JzLnB1c2gobm9kZVJlc3BvbnNlLmVycm9yID8/IGNyZWF0ZUVycm9yKCdJTlRFUk5BTCcsICdGYWlsZWQgdG8gZmV0Y2ggbm9kZSBtZXRhZGF0YS4nKSlcbiAgICBjb25zdCBlbnZlbG9wZSA9IGNyZWF0ZUVudmVsb3BlPFRvb2xJbnB1dCwgRW1wdHlEYXRhPih7XG4gICAgICB0b29sOiBUT09MX05BTUUsXG4gICAgICBpbnB1dCxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgZXJyb3JzLFxuICAgICAgcmF0ZUxpbWl0OiBub2RlUmVzcG9uc2UucmF0ZUxpbWl0ID8/IHVuZGVmaW5lZCxcbiAgICAgIGRhdGE6IHt9IGFzIEVtcHR5RGF0YSxcbiAgICAgIHNjaGVtYVZlcnNpb24sXG4gICAgfSlcbiAgICBleGl0V2l0aEVudmVsb3BlKGVudmVsb3BlLCBlcnJvcnMpXG4gIH1cblxuICBjb25zdCBub2Rlc01hcCA9IG5vZGVSZXNwb25zZS5kYXRhPy5ub2RlcyA/PyB7fVxuICBjb25zdCBub2RlV3JhcHBlciA9IG5vZGVzTWFwW3Jlc29sdmVkTm9kZUlkXVxuXG4gIGlmICghbm9kZVdyYXBwZXIgfHwgIW5vZGVXcmFwcGVyLmRvY3VtZW50KSB7XG4gICAgZXJyb3JzLnB1c2goY3JlYXRlRXJyb3IoJ0ZJR01BX05PVF9GT1VORCcsIGBOb2RlICR7cmVzb2x2ZWROb2RlSWR9IHdhcyBub3QgZm91bmQgaW4gZmlsZSAke3Jlc29sdmVkRmlsZUtleX0uYCkpXG4gICAgY29uc3QgZW52ZWxvcGUgPSBjcmVhdGVFbnZlbG9wZTxUb29sSW5wdXQsIEVtcHR5RGF0YT4oe1xuICAgICAgdG9vbDogVE9PTF9OQU1FLFxuICAgICAgaW5wdXQsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJhdGVMaW1pdDogbm9kZVJlc3BvbnNlLnJhdGVMaW1pdCA/PyB1bmRlZmluZWQsXG4gICAgICBkYXRhOiB7fSBhcyBFbXB0eURhdGEsXG4gICAgICBzY2hlbWFWZXJzaW9uLFxuICAgIH0pXG4gICAgZXhpdFdpdGhFbnZlbG9wZShlbnZlbG9wZSwgZXJyb3JzKVxuICB9XG5cbiAgY29uc3Qgcm9vdE5vZGUgPSBub2RlV3JhcHBlci5kb2N1bWVudFxuICBjb25zdCBtZXRhZGF0YVRyZWUgPSBtYXBOb2RlKHJvb3ROb2RlKVxuXG4gIGxldCB4bWxEb2N1bWVudDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGlmIChvdXRwdXRNb2RlID09PSAneG1sJyB8fCBvdXRwdXRNb2RlID09PSAnYm90aCcpIHtcbiAgICB4bWxEb2N1bWVudCA9IGA8ZmlnbWFNZXRhZGF0YSB2ZXJzaW9uPVxcXCIxLjBcXFwiPiR7bm9kZVRvWG1sKG1ldGFkYXRhVHJlZSl9PC9maWdtYU1ldGFkYXRhPmBcbiAgfVxuXG4gIGNvbnN0IGRhdGE6IE1ldGFkYXRhRGF0YSA9IHtcbiAgICBmaWxlOiB7XG4gICAgICBrZXk6IHJlc29sdmVkRmlsZUtleSxcbiAgICAgIG5hbWU6IG5vZGVSZXNwb25zZS5kYXRhPy5uYW1lID8/IG51bGwsXG4gICAgICBsYXN0TW9kaWZpZWQ6IG5vZGVSZXNwb25zZS5kYXRhPy5sYXN0TW9kaWZpZWQgPz8gbnVsbCxcbiAgICB9LFxuICAgIG1ldGFkYXRhOiBtZXRhZGF0YVRyZWUsXG4gICAgeG1sOiB4bWxEb2N1bWVudCxcbiAgfVxuXG4gIGNvbnN0IGVudmVsb3BlID0gY3JlYXRlRW52ZWxvcGU8VG9vbElucHV0LCBNZXRhZGF0YURhdGE+KHtcbiAgICB0b29sOiBUT09MX05BTUUsXG4gICAgaW5wdXQsXG4gICAgZGF0YSxcbiAgICB3YXJuaW5ncyxcbiAgICBlcnJvcnMsXG4gICAgcmF0ZUxpbWl0OiBub2RlUmVzcG9uc2UucmF0ZUxpbWl0ID8/IHVuZGVmaW5lZCxcbiAgICBzY2hlbWFWZXJzaW9uLFxuICB9KVxuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKX1cXG5gKVxuICBwcm9jZXNzLmV4aXQoZ2V0RXhpdENvZGUoZXJyb3JzKSlcbn1cblxubWFpbigpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcidcbiAgY29uc3QgZW52ZWxvcGUgPSBjcmVhdGVFbnZlbG9wZTxUb29sSW5wdXQsIEVtcHR5RGF0YT4oe1xuICAgIHRvb2w6IFRPT0xfTkFNRSxcbiAgICBpbnB1dDogeyBmaWxlS2V5OiBudWxsLCBub2RlSWQ6IG51bGwsIGZvcm1hdDogJ2pzb24nIH0sXG4gICAgZXJyb3JzOiBbY3JlYXRlRXJyb3IoJ0lOVEVSTkFMJywgbWVzc2FnZSwgeyBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkIH0pXSxcbiAgICBkYXRhOiB7fSBhcyBFbXB0eURhdGEsXG4gIH0pXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKX1cXG5gKVxuICBwcm9jZXNzLmV4aXQoMylcbn0pXG5cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQU9PLFNBQVMsVUFBVSxPQUFpQixRQUFRLEtBQUssTUFBTSxDQUFDLEdBQVk7QUFDekUsUUFBTSxPQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFO0FBRTlCLFdBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUssR0FBRztBQUN2QyxVQUFNLE1BQU0sS0FBSyxDQUFDO0FBRWxCLFFBQUksQ0FBQyxJQUFJLFdBQVcsR0FBRyxLQUFLLFFBQVEsS0FBSztBQUN2QyxXQUFLLEVBQUUsS0FBSyxHQUFHO0FBQ2Y7QUFBQSxJQUNGO0FBRUEsUUFBSSxRQUFRLE1BQU07QUFDaEIsWUFBTSxZQUFZLEtBQUssTUFBTSxJQUFJLENBQUM7QUFDbEMsV0FBSyxFQUFFLEtBQUssR0FBRyxTQUFTO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFVBQU0sQ0FBQyxRQUFRLFdBQVcsSUFBSSxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFVBQU0sZ0JBQWdCLE9BQU8sUUFBUSxPQUFPLEVBQUU7QUFFOUMsUUFBSTtBQUNKLFFBQUksZ0JBQWdCLFFBQVc7QUFDN0IsY0FBUTtBQUFBLElBQ1YsT0FBTztBQUNMLFlBQU0sT0FBTyxLQUFLLElBQUksQ0FBQztBQUN2QixVQUFJLFNBQVMsVUFBYSxDQUFDLEtBQUssV0FBVyxHQUFHLEdBQUc7QUFDL0MsZ0JBQVE7QUFDUixhQUFLO0FBQUEsTUFDUCxPQUFPO0FBQ0wsZ0JBQVE7QUFBQSxNQUNWO0FBQUEsSUFDRjtBQUVBLFNBQUssYUFBYSxJQUFJO0FBQUEsRUFDeEI7QUFFQSxTQUFPO0FBQ1Q7OztBQzVDQSxJQUFNLGlCQUFpQjtBQU9oQixTQUFTLGNBQWMsT0FBa0Q7QUFDOUUsTUFBSSxDQUFDLE1BQU8sUUFB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