25 lines
220 KiB
JavaScript
25 lines
220 KiB
JavaScript
"use strict";
|
|
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
exports.id = "vendor-chunks/@ai-sdk+provider-utils@4.0.21_zod@3.25.76";
|
|
exports.ids = ["vendor-chunks/@ai-sdk+provider-utils@4.0.21_zod@3.25.76"];
|
|
exports.modules = {
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@ai-sdk+provider-utils@4.0.21_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs":
|
|
/*!*************************************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@ai-sdk+provider-utils@4.0.21_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs ***!
|
|
\*************************************************************************************************************************/
|
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DEFAULT_MAX_DOWNLOAD_SIZE: () => (/* binding */ DEFAULT_MAX_DOWNLOAD_SIZE),\n/* harmony export */ DelayedPromise: () => (/* binding */ DelayedPromise),\n/* harmony export */ DownloadError: () => (/* binding */ DownloadError),\n/* harmony export */ EventSourceParserStream: () => (/* reexport safe */ eventsource_parser_stream__WEBPACK_IMPORTED_MODULE_4__.EventSourceParserStream),\n/* harmony export */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ asSchema: () => (/* binding */ asSchema),\n/* harmony export */ combineHeaders: () => (/* binding */ combineHeaders),\n/* harmony export */ convertAsyncIteratorToReadableStream: () => (/* binding */ convertAsyncIteratorToReadableStream),\n/* harmony export */ convertBase64ToUint8Array: () => (/* binding */ convertBase64ToUint8Array),\n/* harmony export */ convertImageModelFileToDataUri: () => (/* binding */ convertImageModelFileToDataUri),\n/* harmony export */ convertToBase64: () => (/* binding */ convertToBase64),\n/* harmony export */ convertToFormData: () => (/* binding */ convertToFormData),\n/* harmony export */ convertUint8ArrayToBase64: () => (/* binding */ convertUint8ArrayToBase64),\n/* harmony export */ createBinaryResponseHandler: () => (/* binding */ createBinaryResponseHandler),\n/* harmony export */ createEventSourceResponseHandler: () => (/* binding */ createEventSourceResponseHandler),\n/* harmony export */ createIdGenerator: () => (/* binding */ createIdGenerator),\n/* harmony export */ createJsonErrorResponseHandler: () => (/* binding */ createJsonErrorResponseHandler),\n/* harmony export */ createJsonResponseHandler: () => (/* binding */ createJsonResponseHandler),\n/* harmony export */ createProviderToolFactory: () => (/* binding */ createProviderToolFactory),\n/* harmony export */ createProviderToolFactoryWithOutputSchema: () => (/* binding */ createProviderToolFactoryWithOutputSchema),\n/* harmony export */ createStatusCodeErrorResponseHandler: () => (/* binding */ createStatusCodeErrorResponseHandler),\n/* harmony export */ createToolNameMapping: () => (/* binding */ createToolNameMapping),\n/* harmony export */ delay: () => (/* binding */ delay),\n/* harmony export */ downloadBlob: () => (/* binding */ downloadBlob),\n/* harmony export */ dynamicTool: () => (/* binding */ dynamicTool),\n/* harmony export */ executeTool: () => (/* binding */ executeTool),\n/* harmony export */ extractResponseHeaders: () => (/* binding */ extractResponseHeaders),\n/* harmony export */ generateId: () => (/* binding */ generateId),\n/* harmony export */ getErrorMessage: () => (/* binding */ getErrorMessage),\n/* harmony export */ getFromApi: () => (/* binding */ getFromApi),\n/* harmony export */ getRuntimeEnvironmentUserAgent: () => (/* binding */ getRuntimeEnvironmentUserAgent),\n/* harmony export */ injectJsonInstructionIntoMessages: () => (/* binding */ injectJsonInstructionIntoMessages),\n/* harmony export */ isAbortError: () => (/* binding */ isAbortError),\n/* harmony export */ isNonNullable: () => (/* binding */ isNonNullable),\n/* harmony export */ isParsableJson: () => (/* binding */ isParsableJson),\n/* harmony export */ isUrlSupported: () => (/* binding */ isUrlSupported),\n/* harmony export */ jsonSchema: () => (/* binding */ jsonSchema),\n/* harmony export */ lazySchema: () => (/* binding */ lazySchema),\n/* harmony export */ loadApiKey: () => (/* binding */ loadApiKey),\n/* harmony export */ loadOptionalSetting: () => (/* binding */ loadOptionalSetting),\n/* harmony export */ loadSetting: () => (/* binding */ loadSetting),\n/* harmony export */ mediaTypeToExtension: () => (/* binding */ mediaTypeToExtension),\n/* harmony export */ normalizeHeaders: () => (/* binding */ normalizeHeaders),\n/* harmony export */ parseJSON: () => (/* binding */ parseJSON),\n/* harmony export */ parseJsonEventStream: () => (/* binding */ parseJsonEventStream),\n/* harmony export */ parseProviderOptions: () => (/* binding */ parseProviderOptions),\n/* harmony export */ postFormDataToApi: () => (/* binding */ postFormDataToApi),\n/* harmony export */ postJsonToApi: () => (/* binding */ postJsonToApi),\n/* harmony export */ postToApi: () => (/* binding */ postToApi),\n/* harmony export */ readResponseWithSizeLimit: () => (/* binding */ readResponseWithSizeLimit),\n/* harmony export */ removeUndefinedEntries: () => (/* binding */ removeUndefinedEntries),\n/* harmony export */ resolve: () => (/* binding */ resolve),\n/* harmony export */ safeParseJSON: () => (/* binding */ safeParseJSON),\n/* harmony export */ safeValidateTypes: () => (/* binding */ safeValidateTypes),\n/* harmony export */ stripFileExtension: () => (/* binding */ stripFileExtension),\n/* harmony export */ tool: () => (/* binding */ tool),\n/* harmony export */ validateDownloadUrl: () => (/* binding */ validateDownloadUrl),\n/* harmony export */ validateTypes: () => (/* binding */ validateTypes),\n/* harmony export */ withUserAgentSuffix: () => (/* binding */ withUserAgentSuffix),\n/* harmony export */ withoutTrailingSlash: () => (/* binding */ withoutTrailingSlash),\n/* harmony export */ zodSchema: () => (/* binding */ zodSchema)\n/* harmony export */ });\n/* harmony import */ var _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ai-sdk/provider */ \"(rsc)/./node_modules/.pnpm/@ai-sdk+provider@3.0.8/node_modules/@ai-sdk/provider/dist/index.mjs\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! zod/v4 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/to-json-schema.js\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zod/v4 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/parse.js\");\n/* harmony import */ var zod_v3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zod/v3 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js\");\n/* harmony import */ var eventsource_parser_stream__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! eventsource-parser/stream */ \"(rsc)/./node_modules/.pnpm/eventsource-parser@3.0.6/node_modules/eventsource-parser/dist/stream.js\");\n// src/combine-headers.ts\nfunction combineHeaders(...headers) {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...currentHeaders != null ? currentHeaders : {}\n }),\n {}\n );\n}\n\n// src/convert-async-iterator-to-readable-stream.ts\nfunction convertAsyncIteratorToReadableStream(iterator) {\n let cancelled = false;\n return new ReadableStream({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch (e) {\n }\n }\n }\n });\n}\n\n// src/create-tool-name-mapping.ts\nfunction createToolNameMapping({\n tools = [],\n providerToolNames,\n resolveProviderToolName\n}) {\n var _a2;\n const customToolNameToProviderToolName = {};\n const providerToolNameToCustomToolName = {};\n for (const tool2 of tools) {\n if (tool2.type === \"provider\") {\n const providerToolName = (_a2 = resolveProviderToolName == null ? void 0 : resolveProviderToolName(tool2)) != null ? _a2 : tool2.id in providerToolNames ? providerToolNames[tool2.id] : void 0;\n if (providerToolName == null) {\n continue;\n }\n customToolNameToProviderToolName[tool2.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool2.name;\n }\n }\n return {\n toProviderToolName: (customToolName) => {\n var _a3;\n return (_a3 = customToolNameToProviderToolName[customToolName]) != null ? _a3 : customToolName;\n },\n toCustomToolName: (providerToolName) => {\n var _a3;\n return (_a3 = providerToolNameToCustomToolName[providerToolName]) != null ? _a3 : providerToolName;\n }\n };\n}\n\n// src/delay.ts\nasync function delay(delayInMs, options) {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n const signal = options == null ? void 0 : options.abortSignal;\n return new Promise((resolve2, reject) => {\n if (signal == null ? void 0 : signal.aborted) {\n reject(createAbortError());\n return;\n }\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve2();\n }, delayInMs);\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal == null ? void 0 : signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n signal == null ? void 0 : signal.addEventListener(\"abort\", onAbort);\n });\n}\nfunction createAbortError() {\n return new DOMException(\"Delay was aborted\", \"AbortError\");\n}\n\n// src/delayed-promise.ts\nvar DelayedPromise = class {\n constructor() {\n this.status = { type: \"pending\" };\n this._resolve = void 0;\n this._reject = void 0;\n }\n get promise() {\n if (this._promise) {\n return this._promise;\n }\n this._promise = new Promise((resolve2, reject) => {\n if (this.status.type === \"resolved\") {\n resolve2(this.status.value);\n } else if (this.status.type === \"rejected\") {\n reject(this.status.error);\n }\n this._resolve = resolve2;\n this._reject = reject;\n });\n return this._promise;\n }\n resolve(value) {\n var _a2;\n this.status = { type: \"resolved\", value };\n if (this._promise) {\n (_a2 = this._resolve) == null ? void 0 : _a2.call(this, value);\n }\n }\n reject(error) {\n var _a2;\n this.status = { type: \"rejected\", error };\n if (this._promise) {\n (_a2 = this._reject) == null ? void 0 : _a2.call(this, error);\n }\n }\n isResolved() {\n return this.status.type === \"resolved\";\n }\n isRejected() {\n return this.status.type === \"rejected\";\n }\n isPending() {\n return this.status.type === \"pending\";\n }\n};\n\n// src/extract-response-headers.ts\nfunction extractResponseHeaders(response) {\n return Object.fromEntries([...response.headers]);\n}\n\n// src/uint8-utils.ts\nvar { btoa, atob } = globalThis;\nfunction convertBase64ToUint8Array(base64String) {\n const base64Url = base64String.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, (byte) => byte.codePointAt(0));\n}\nfunction convertUint8ArrayToBase64(array) {\n let latin1string = \"\";\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n return btoa(latin1string);\n}\nfunction convertToBase64(value) {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n\n// src/convert-image-model-file-to-data-uri.ts\nfunction convertImageModelFileToDataUri(file) {\n if (file.type === \"url\") return file.url;\n return `data:${file.mediaType};base64,${typeof file.data === \"string\" ? file.data : convertUint8ArrayToBase64(file.data)}`;\n}\n\n// src/convert-to-form-data.ts\nfunction convertToFormData(input, options = {}) {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0]);\n continue;\n }\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item);\n }\n continue;\n }\n formData.append(key, value);\n }\n return formData;\n}\n\n// src/download-error.ts\n\nvar name = \"AI_DownloadError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar DownloadError = class extends (_b = _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError, _a = symbol, _b) {\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`\n }) {\n super({ name, message, cause });\n this[_a] = true;\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n static isInstance(error) {\n return _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.AISDKError.hasMarker(error, marker);\n }\n};\n\n// src/read-response-with-size-limit.ts\nvar DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\nasync function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE\n}) {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`\n });\n }\n }\n const body = response.body;\n if (body == null) {\n return new Uint8Array(0);\n }\n const reader = body.getReader();\n const chunks = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.length;\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`\n });\n }\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n// src/validate-download-url.ts\nfunction validateDownloadUrl(url) {\n let parsed;\n try {\n parsed = new URL(url);\n } catch (e) {\n throw new DownloadError({\n url,\n message: `Invalid URL: ${url}`\n });\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new DownloadError({\n url,\n message: `URL scheme must be http or https, got ${parsed.protocol}`\n });\n }\n const hostname = parsed.hostname;\n if (!hostname) {\n throw new DownloadError({\n url,\n message: `URL must have a hostname`\n });\n }\n if (hostname === \"localhost\" || hostname.endsWith(\".local\") || hostname.endsWith(\".localhost\")) {\n throw new DownloadError({\n url,\n message: `URL with hostname ${hostname} is not allowed`\n });\n }\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n const ipv6 = hostname.slice(1, -1);\n if (isPrivateIPv6(ipv6)) {\n throw new DownloadError({\n url,\n message: `URL with IPv6 address ${hostname} is not allowed`\n });\n }\n return;\n }\n if (isIPv4(hostname)) {\n if (isPrivateIPv4(hostname)) {\n throw new DownloadError({\n url,\n message: `URL with IP address ${hostname} is not allowed`\n });\n }\n return;\n }\n}\nfunction isIPv4(hostname) {\n const parts = hostname.split(\".\");\n if (parts.length !== 4) return false;\n return parts.every((part) => {\n const num = Number(part);\n return Number.isInteger(num) && num >= 0 && num <= 255 && String(num) === part;\n });\n}\nfunction isPrivateIPv4(ip) {\n const parts = ip.split(\".\").map(Number);\n const [a, b] = parts;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n return false;\n}\nfunction isPrivateIPv6(ip) {\n const normalized = ip.toLowerCase();\n if (normalized === \"::1\") return true;\n if (normalized === \"::\") return true;\n if (normalized.startsWith(\"::ffff:\")) {\n const mappedPart = normalized.slice(7);\n if (isIPv4(mappedPart)) {\n return isPrivateIPv4(mappedPart);\n }\n const hexParts = mappedPart.split(\":\");\n if (hexParts.length === 2) {\n const high = parseInt(hexParts[0], 16);\n const low = parseInt(hexParts[1], 16);\n if (!isNaN(high) && !isNaN(low)) {\n const a = high >> 8 & 255;\n const b = high & 255;\n const c = low >> 8 & 255;\n const d = low & 255;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n }\n }\n if (normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\")) return true;\n if (normalized.startsWith(\"fe80\")) return true;\n return false;\n}\n\n// src/download-blob.ts\nasync function downloadBlob(url, options) {\n var _a2, _b2;\n validateDownloadUrl(url);\n try {\n const response = await fetch(url, {\n signal: options == null ? void 0 : options.abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: (_a2 = options == null ? void 0 : options.maxBytes) != null ? _a2 : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n const contentType = (_b2 = response.headers.get(\"content-type\")) != null ? _b2 : void 0;\n return new Blob([data], contentType ? { type: contentType } : void 0);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n throw new DownloadError({ url, cause: error });\n }\n}\n\n// src/generate-id.ts\n\nvar createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n separator = \"-\"\n} = {}) => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[Math.random() * alphabetLength | 0];\n }\n return chars.join(\"\");\n };\n if (prefix == null) {\n return generator;\n }\n if (alphabet.includes(separator)) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidArgumentError({\n argument: \"separator\",\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`\n });\n }\n return () => `${prefix}${separator}${generator()}`;\n};\nvar generateId = createIdGenerator();\n\n// src/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/get-from-api.ts\n\n\n// src/handle-fetch-error.ts\n\n\n// src/is-abort-error.ts\nfunction isAbortError(error) {\n return (error instanceof Error || error instanceof DOMException) && (error.name === \"AbortError\" || error.name === \"ResponseAborted\" || // Next.js\n error.name === \"TimeoutError\");\n}\n\n// src/handle-fetch-error.ts\nvar FETCH_FAILED_ERROR_MESSAGES = [\"fetch failed\", \"failed to fetch\"];\nvar BUN_ERROR_CODES = [\n \"ConnectionRefused\",\n \"ConnectionClosed\",\n \"FailedToOpenSocket\",\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"EPIPE\"\n];\nfunction isBunNetworkError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const code = error.code;\n if (typeof code === \"string\" && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n return false;\n}\nfunction handleFetchError({\n error,\n url,\n requestBodyValues\n}) {\n if (isAbortError(error)) {\n return error;\n }\n if (error instanceof TypeError && FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())) {\n const cause = error.cause;\n if (cause != null) {\n return new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true\n // retry when network error\n });\n }\n }\n if (isBunNetworkError(error)) {\n return new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true\n });\n }\n return error;\n}\n\n// src/get-runtime-environment-user-agent.ts\nfunction getRuntimeEnvironmentUserAgent(globalThisAny = globalThis) {\n var _a2, _b2, _c;\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n if ((_a2 = globalThisAny.navigator) == null ? void 0 : _a2.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n if ((_c = (_b2 = globalThisAny.process) == null ? void 0 : _b2.versions) == null ? void 0 : _c.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n return \"runtime/unknown\";\n}\n\n// src/normalize-headers.ts\nfunction normalizeHeaders(headers) {\n if (headers == null) {\n return {};\n }\n const normalized = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n return normalized;\n}\n\n// src/with-user-agent-suffix.ts\nfunction withUserAgentSuffix(headers, ...userAgentSuffixParts) {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n const currentUserAgentHeader = normalizedHeaders.get(\"user-agent\") || \"\";\n normalizedHeaders.set(\n \"user-agent\",\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(\" \")\n );\n return Object.fromEntries(normalizedHeaders.entries());\n}\n\n// src/version.ts\nvar VERSION = true ? \"4.0.21\" : 0;\n\n// src/get-from-api.ts\nvar getOriginalFetch = () => globalThis.fetch;\nvar getFromApi = async ({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"GET\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (isAbortError(error) || _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError.isInstance(error)) {\n throw error;\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError.isInstance(error)) {\n throw error;\n }\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n\n// src/inject-json-instruction.ts\nvar DEFAULT_SCHEMA_PREFIX = \"JSON schema:\";\nvar DEFAULT_SCHEMA_SUFFIX = \"You MUST answer with a JSON object that matches the JSON schema above.\";\nvar DEFAULT_GENERIC_SUFFIX = \"You MUST answer with JSON.\";\nfunction injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : void 0,\n schemaSuffix = schema != null ? DEFAULT_SCHEMA_SUFFIX : DEFAULT_GENERIC_SUFFIX\n}) {\n return [\n prompt != null && prompt.length > 0 ? prompt : void 0,\n prompt != null && prompt.length > 0 ? \"\" : void 0,\n // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : void 0,\n schemaSuffix\n ].filter((line) => line != null).join(\"\\n\");\n}\nfunction injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix\n}) {\n var _a2, _b2;\n const systemMessage = ((_a2 = messages[0]) == null ? void 0 : _a2.role) === \"system\" ? { ...messages[0] } : { role: \"system\", content: \"\" };\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix\n });\n return [\n systemMessage,\n ...((_b2 = messages[0]) == null ? void 0 : _b2.role) === \"system\" ? messages.slice(1) : messages\n ];\n}\n\n// src/is-non-nullable.ts\nfunction isNonNullable(value) {\n return value != null;\n}\n\n// src/is-url-supported.ts\nfunction isUrlSupported({\n mediaType,\n url,\n supportedUrls\n}) {\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n return Object.entries(supportedUrls).map(([key, value]) => {\n const mediaType2 = key.toLowerCase();\n return mediaType2 === \"*\" || mediaType2 === \"*/*\" ? { mediaTypePrefix: \"\", regexes: value } : { mediaTypePrefix: mediaType2.replace(/\\*/, \"\"), regexes: value };\n }).filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix)).flatMap(({ regexes }) => regexes).some((pattern) => pattern.test(url));\n}\n\n// src/load-api-key.ts\n\nfunction loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = \"apiKey\",\n description\n}) {\n if (typeof apiKey === \"string\") {\n return apiKey;\n }\n if (apiKey != null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadAPIKeyError({\n message: `${description} API key must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables is not supported in this environment.`\n });\n }\n apiKey = process.env[environmentVariableName];\n if (apiKey == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof apiKey !== \"string\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return apiKey;\n}\n\n// src/load-optional-setting.ts\nfunction loadOptionalSetting({\n settingValue,\n environmentVariableName\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null || typeof process === \"undefined\") {\n return void 0;\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null || typeof settingValue !== \"string\") {\n return void 0;\n }\n return settingValue;\n}\n\n// src/load-setting.ts\n\nfunction loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadSettingError({\n message: `${description} setting must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter. Environment variables is not supported in this environment.`\n });\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof settingValue !== \"string\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.LoadSettingError({\n message: `${description} setting must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return settingValue;\n}\n\n// src/media-type-to-extension.ts\nfunction mediaTypeToExtension(mediaType) {\n var _a2;\n const [_type, subtype = \"\"] = mediaType.toLowerCase().split(\"/\");\n return (_a2 = {\n mpeg: \"mp3\",\n \"x-wav\": \"wav\",\n opus: \"ogg\",\n mp4: \"m4a\",\n \"x-m4a\": \"m4a\"\n }[subtype]) != null ? _a2 : subtype;\n}\n\n// src/parse-json.ts\n\n\n// src/secure-json-parse.ts\nvar suspectProtoRx = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/;\nvar suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/;\nfunction _parse(text) {\n const obj = JSON.parse(text);\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (suspectProtoRx.test(text) === false && suspectConstructorRx.test(text) === false) {\n return obj;\n }\n return filter(obj);\n}\nfunction filter(obj) {\n let next = [obj];\n while (next.length) {\n const nodes = next;\n next = [];\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, \"__proto__\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n if (Object.prototype.hasOwnProperty.call(node, \"constructor\") && node.constructor !== null && typeof node.constructor === \"object\" && Object.prototype.hasOwnProperty.call(node.constructor, \"prototype\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === \"object\") {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\nfunction secureJsonParse(text) {\n const { stackTraceLimit } = Error;\n try {\n Error.stackTraceLimit = 0;\n } catch (e) {\n return _parse(text);\n }\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n\n// src/validate-types.ts\n\n\n// src/schema.ts\n\n\n\n// src/add-additional-properties-to-json-schema.ts\nfunction addAdditionalPropertiesToJsonSchema(jsonSchema2) {\n if (jsonSchema2.type === \"object\" || Array.isArray(jsonSchema2.type) && jsonSchema2.type.includes(\"object\")) {\n jsonSchema2.additionalProperties = false;\n const { properties } = jsonSchema2;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n if (jsonSchema2.items != null) {\n jsonSchema2.items = Array.isArray(jsonSchema2.items) ? jsonSchema2.items.map(visit) : visit(jsonSchema2.items);\n }\n if (jsonSchema2.anyOf != null) {\n jsonSchema2.anyOf = jsonSchema2.anyOf.map(visit);\n }\n if (jsonSchema2.allOf != null) {\n jsonSchema2.allOf = jsonSchema2.allOf.map(visit);\n }\n if (jsonSchema2.oneOf != null) {\n jsonSchema2.oneOf = jsonSchema2.oneOf.map(visit);\n }\n const { definitions } = jsonSchema2;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n return jsonSchema2;\n}\nfunction visit(def) {\n if (typeof def === \"boolean\") return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n\n// src/to-json-schema/zod3-to-json-schema/options.ts\nvar ignoreOverride = /* @__PURE__ */ Symbol(\n \"Let zodToJsonSchema decide on which parser to use\"\n);\nvar defaultOptions = {\n name: void 0,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\"\n};\nvar getDefaultOptions = (options) => typeof options === \"string\" ? {\n ...defaultOptions,\n name: options\n} : {\n ...defaultOptions,\n ...options\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\n\n\n// src/to-json-schema/zod3-to-json-schema/parsers/any.ts\nfunction parseAnyDef() {\n return {};\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/array.ts\n\nfunction parseArrayDef(def, refs) {\n var _a2, _b2, _c;\n const res = {\n type: \"array\"\n };\n if (((_a2 = def.type) == null ? void 0 : _a2._def) && ((_c = (_b2 = def.type) == null ? void 0 : _b2._def) == null ? void 0 : _c.typeName) !== zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n }\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts\nfunction parseBigintDef(def) {\n const res = {\n type: \"integer\",\n format: \"int64\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts\nfunction parseBooleanDef() {\n return { type: \"boolean\" };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/branded.ts\nfunction parseBrandedDef(_def, refs) {\n return parseDef(_def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/catch.ts\nvar parseCatchDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/date.ts\nfunction parseDateDef(def, refs, overrideDateStrategy) {\n const strategy = overrideDateStrategy != null ? overrideDateStrategy : refs.dateStrategy;\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item))\n };\n }\n switch (strategy) {\n case \"string\":\n case \"format:date-time\":\n return {\n type: \"string\",\n format: \"date-time\"\n };\n case \"format:date\":\n return {\n type: \"string\",\n format: \"date\"\n };\n case \"integer\":\n return integerDateParser(def);\n }\n}\nvar integerDateParser = (def) => {\n const res = {\n type: \"integer\",\n format: \"unix-time\"\n };\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minimum = check.value;\n break;\n case \"max\":\n res.maximum = check.value;\n break;\n }\n }\n return res;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/default.ts\nfunction parseDefaultDef(_def, refs) {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/effects.ts\nfunction parseEffectsDef(_def, refs) {\n return refs.effectStrategy === \"input\" ? parseDef(_def.schema._def, refs) : parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/enum.ts\nfunction parseEnumDef(def) {\n return {\n type: \"string\",\n enum: Array.from(def.values)\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts\nvar isJsonSchema7AllOfType = (type) => {\n if (\"type\" in type && type.type === \"string\") return false;\n return \"allOf\" in type;\n};\nfunction parseIntersectionDef(def, refs) {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"1\"]\n })\n ].filter((x) => !!x);\n const mergedAllOf = [];\n allOf.forEach((schema) => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema = schema;\n if (\"additionalProperties\" in schema && schema.additionalProperties === false) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : void 0;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/literal.ts\nfunction parseLiteralDef(def) {\n const parsedType = typeof def.value;\n if (parsedType !== \"bigint\" && parsedType !== \"number\" && parsedType !== \"boolean\" && parsedType !== \"string\") {\n return {\n type: Array.isArray(def.value) ? \"array\" : \"object\"\n };\n }\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n const: def.value\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\n\n\n// src/to-json-schema/zod3-to-json-schema/parsers/string.ts\nvar emojiRegex = void 0;\nvar zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === void 0) {\n emojiRegex = RegExp(\n \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\",\n \"u\"\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/\n};\nfunction parseStringDef(def, refs) {\n const res = {\n type: \"string\"\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n break;\n case \"max\":\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs\n );\n break;\n case \"endsWith\":\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs\n );\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"includes\": {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs\n );\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n res.contentEncoding = \"base64\";\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n /* @__PURE__ */ ((_) => {\n })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\" ? escapeNonAlphaNumeric(literal) : literal;\n}\nvar ALPHA_NUMERIC = new Set(\n \"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\"\n);\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\nfunction addFormat(schema, value, message, refs) {\n var _a2;\n if (schema.format || ((_a2 = schema.anyOf) == null ? void 0 : _a2.some((x) => x.format))) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format\n });\n delete schema.format;\n }\n schema.anyOf.push({\n format: value,\n ...message && refs.errorMessages && { errorMessage: { format: message } }\n });\n } else {\n schema.format = value;\n }\n}\nfunction addPattern(schema, regex, message, refs) {\n var _a2;\n if (schema.pattern || ((_a2 = schema.allOf) == null ? void 0 : _a2.some((x) => x.pattern))) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern\n });\n delete schema.pattern;\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...message && refs.errorMessages && { errorMessage: { pattern: message } }\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\nfunction stringifyRegExpWithFlags(regex, refs) {\n var _a2;\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n const flags = {\n i: regex.flags.includes(\"i\"),\n // Case-insensitive\n m: regex.flags.includes(\"m\"),\n // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes(\"s\")\n // `.` matches newlines\n };\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === \"-\" && ((_a2 = source[i + 2]) == null ? void 0 : _a2.match(/[a-z]/))) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\n]))`;\n continue;\n } else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\n` : `[${source[i]}\\r\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n } else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n } catch (e) {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n \"/\"\n )} to a flag-independent form! Falling back to the flag-ignorant source`\n );\n return regex.source;\n }\n return pattern;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nfunction parseRecordDef(def, refs) {\n var _a2, _b2, _c, _d, _e, _f;\n const schema = {\n type: \"object\",\n additionalProperties: (_a2 = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n })) != null ? _a2 : refs.allowedAdditionalProperties\n };\n if (((_b2 = def.keyType) == null ? void 0 : _b2._def.typeName) === zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodString && ((_c = def.keyType._def.checks) == null ? void 0 : _c.length)) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType\n };\n } else if (((_d = def.keyType) == null ? void 0 : _d._def.typeName) === zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values\n }\n };\n } else if (((_e = def.keyType) == null ? void 0 : _e._def.typeName) === zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodBranded && def.keyType._def.type._def.typeName === zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodString && ((_f = def.keyType._def.type._def.checks) == null ? void 0 : _f.length)) {\n const { type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs\n );\n return {\n ...schema,\n propertyNames: keyType\n };\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/map.ts\nfunction parseMapDef(def, refs) {\n if (refs.mapStrategy === \"record\") {\n return parseRecordDef(def, refs);\n }\n const keys = parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"0\"]\n }) || parseAnyDef();\n const values = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"1\"]\n }) || parseAnyDef();\n return {\n type: \"array\",\n maxItems: 125,\n items: {\n type: \"array\",\n items: [keys, values],\n minItems: 2,\n maxItems: 2\n }\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts\nfunction parseNativeEnumDef(def) {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key) => {\n return typeof object[object[key]] !== \"number\";\n });\n const actualValues = actualKeys.map((key) => object[key]);\n const parsedTypes = Array.from(\n new Set(actualValues.map((values) => typeof values))\n );\n return {\n type: parsedTypes.length === 1 ? parsedTypes[0] === \"string\" ? \"string\" : \"number\" : [\"string\", \"number\"],\n enum: actualValues\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/never.ts\nfunction parseNeverDef() {\n return { not: parseAnyDef() };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/null.ts\nfunction parseNullDef() {\n return {\n type: \"null\"\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/union.ts\nvar primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\"\n};\nfunction parseUnionDef(def, refs) {\n const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n if (options.every(\n (x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length)\n )) {\n const types = options.reduce((types2, x) => {\n const type = primitiveMappings[x._def.typeName];\n return type && !types2.includes(type) ? [...types2, type] : types2;\n }, []);\n return {\n type: types.length > 1 ? types : types[0]\n };\n } else if (options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)) {\n const types = options.reduce(\n (acc, x) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\"];\n case \"object\":\n if (x._def.value === null) return [...acc, \"null\"];\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n },\n []\n );\n if (types.length === options.length) {\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n []\n )\n };\n }\n } else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce(\n (acc, x) => [\n ...acc,\n ...x._def.values.filter((x2) => !acc.includes(x2))\n ],\n []\n )\n };\n }\n return asAnyOf(def, refs);\n}\nvar asAnyOf = (def, refs) => {\n const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`]\n })\n ).filter(\n (x) => !!x && (!refs.strictUnions || typeof x === \"object\" && Object.keys(x).length > 0)\n );\n return anyOf.length ? { anyOf } : void 0;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts\nfunction parseNullableDef(def, refs) {\n if ([\"ZodString\", \"ZodNumber\", \"ZodBigInt\", \"ZodBoolean\", \"ZodNull\"].includes(\n def.innerType._def.typeName\n ) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {\n return {\n type: [\n primitiveMappings[def.innerType._def.typeName],\n \"null\"\n ]\n };\n }\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"0\"]\n });\n return base && { anyOf: [base, { type: \"null\" }] };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/number.ts\nfunction parseNumberDef(def) {\n const res = {\n type: \"number\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"int\":\n res.type = \"integer\";\n break;\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/object.ts\nfunction parseObjectDef(def, refs) {\n const result = {\n type: \"object\",\n properties: {}\n };\n const required = [];\n const shape = def.shape();\n for (const propName in shape) {\n let propDef = shape[propName];\n if (propDef === void 0 || propDef._def === void 0) {\n continue;\n }\n const propOptional = safeIsOptional(propDef);\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", propName],\n propertyPath: [...refs.currentPath, \"properties\", propName]\n });\n if (parsedDef === void 0) {\n continue;\n }\n result.properties[propName] = parsedDef;\n if (!propOptional) {\n required.push(propName);\n }\n }\n if (required.length) {\n result.required = required;\n }\n const additionalProperties = decideAdditionalProperties(def, refs);\n if (additionalProperties !== void 0) {\n result.additionalProperties = additionalProperties;\n }\n return result;\n}\nfunction decideAdditionalProperties(def, refs) {\n if (def.catchall._def.typeName !== \"ZodNever\") {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n });\n }\n switch (def.unknownKeys) {\n case \"passthrough\":\n return refs.allowedAdditionalProperties;\n case \"strict\":\n return refs.rejectedAdditionalProperties;\n case \"strip\":\n return refs.removeAdditionalStrategy === \"strict\" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;\n }\n}\nfunction safeIsOptional(schema) {\n try {\n return schema.isOptional();\n } catch (e) {\n return true;\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/optional.ts\nvar parseOptionalDef = (def, refs) => {\n var _a2;\n if (refs.currentPath.toString() === ((_a2 = refs.propertyPath) == null ? void 0 : _a2.toString())) {\n return parseDef(def.innerType._def, refs);\n }\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"1\"]\n });\n return innerSchema ? { anyOf: [{ not: parseAnyDef() }, innerSchema] } : parseAnyDef();\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts\nvar parsePipelineDef = (def, refs) => {\n if (refs.pipeStrategy === \"input\") {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === \"output\") {\n return parseDef(def.out._def, refs);\n }\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", a ? \"1\" : \"0\"]\n });\n return {\n allOf: [a, b].filter((x) => x !== void 0)\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/promise.ts\nfunction parsePromiseDef(def, refs) {\n return parseDef(def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/set.ts\nfunction parseSetDef(def, refs) {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n const schema = {\n type: \"array\",\n uniqueItems: true,\n items\n };\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts\nfunction parseTupleDef(def, refs) {\n if (def.rest) {\n return {\n type: \"array\",\n minItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalItems\"]\n })\n };\n } else {\n return {\n type: \"array\",\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n )\n };\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts\nfunction parseUndefinedDef() {\n return {\n not: parseAnyDef()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts\nfunction parseUnknownDef() {\n return parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts\nvar parseReadonlyDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nvar selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodString:\n return parseStringDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodNumber:\n return parseNumberDef(def);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodObject:\n return parseObjectDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodBigInt:\n return parseBigintDef(def);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodBoolean:\n return parseBooleanDef();\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodDate:\n return parseDateDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodUndefined:\n return parseUndefinedDef();\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodNull:\n return parseNullDef();\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodArray:\n return parseArrayDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodUnion:\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodTuple:\n return parseTupleDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodRecord:\n return parseRecordDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodLiteral:\n return parseLiteralDef(def);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodEnum:\n return parseEnumDef(def);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodNullable:\n return parseNullableDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodOptional:\n return parseOptionalDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodMap:\n return parseMapDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodSet:\n return parseSetDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodLazy:\n return () => def.getter()._def;\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodPromise:\n return parsePromiseDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodNaN:\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodNever:\n return parseNeverDef();\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodEffects:\n return parseEffectsDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodAny:\n return parseAnyDef();\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodUnknown:\n return parseUnknownDef();\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodDefault:\n return parseDefaultDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodBranded:\n return parseBrandedDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodCatch:\n return parseCatchDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodPipeline:\n return parsePipelineDef(def, refs);\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodFunction:\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodVoid:\n case zod_v3__WEBPACK_IMPORTED_MODULE_1__.ZodFirstPartyTypeKind.ZodSymbol:\n return void 0;\n default:\n return /* @__PURE__ */ ((_) => void 0)(typeName);\n }\n};\n\n// src/to-json-schema/zod3-to-json-schema/get-relative-path.ts\nvar getRelativePath = (pathA, pathB) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join(\"/\");\n};\n\n// src/to-json-schema/zod3-to-json-schema/parse-def.ts\nfunction parseDef(def, refs, forceResolution = false) {\n var _a2;\n const seenItem = refs.seen.get(def);\n if (refs.override) {\n const overrideResult = (_a2 = refs.override) == null ? void 0 : _a2.call(\n refs,\n def,\n refs,\n seenItem,\n forceResolution\n );\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n if (seenSchema !== void 0) {\n return seenSchema;\n }\n }\n const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };\n refs.seen.set(def, newItem);\n const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);\n const jsonSchema2 = typeof jsonSchemaOrGetter === \"function\" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;\n if (jsonSchema2) {\n addMeta(def, refs, jsonSchema2);\n }\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema2, def, refs);\n newItem.jsonSchema = jsonSchema2;\n return postProcessResult;\n }\n newItem.jsonSchema = jsonSchema2;\n return jsonSchema2;\n}\nvar get$ref = (item, refs) => {\n switch (refs.$refStrategy) {\n case \"root\":\n return { $ref: item.path.join(\"/\") };\n case \"relative\":\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case \"none\":\n case \"seen\": {\n if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n \"/\"\n )}! Defaulting to any`\n );\n return parseAnyDef();\n }\n return refs.$refStrategy === \"seen\" ? parseAnyDef() : void 0;\n }\n }\n};\nvar addMeta = (def, refs, jsonSchema2) => {\n if (def.description) {\n jsonSchema2.description = def.description;\n }\n return jsonSchema2;\n};\n\n// src/to-json-schema/zod3-to-json-schema/refs.ts\nvar getRefs = (options) => {\n const _options = getDefaultOptions(options);\n const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;\n return {\n ..._options,\n currentPath,\n propertyPath: void 0,\n seen: new Map(\n Object.entries(_options.definitions).map(([name2, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name2],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: void 0\n }\n ])\n )\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts\nvar zod3ToJsonSchema = (schema, options) => {\n var _a2;\n const refs = getRefs(options);\n let definitions = typeof options === \"object\" && options.definitions ? Object.entries(options.definitions).reduce(\n (acc, [name3, schema2]) => {\n var _a3;\n return {\n ...acc,\n [name3]: (_a3 = parseDef(\n schema2._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name3]\n },\n true\n )) != null ? _a3 : parseAnyDef()\n };\n },\n {}\n ) : void 0;\n const name2 = typeof options === \"string\" ? options : (options == null ? void 0 : options.nameStrategy) === \"title\" ? void 0 : options == null ? void 0 : options.name;\n const main = (_a2 = parseDef(\n schema._def,\n name2 === void 0 ? refs : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name2]\n },\n false\n )) != null ? _a2 : parseAnyDef();\n const title = typeof options === \"object\" && options.name !== void 0 && options.nameStrategy === \"title\" ? options.name : void 0;\n if (title !== void 0) {\n main.title = title;\n }\n const combined = name2 === void 0 ? definitions ? {\n ...main,\n [refs.definitionPath]: definitions\n } : main : {\n $ref: [\n ...refs.$refStrategy === \"relative\" ? [] : refs.basePath,\n refs.definitionPath,\n name2\n ].join(\"/\"),\n [refs.definitionPath]: {\n ...definitions,\n [name2]: main\n }\n };\n combined.$schema = \"http://json-schema.org/draft-07/schema#\";\n return combined;\n};\n\n// src/schema.ts\nvar schemaSymbol = /* @__PURE__ */ Symbol.for(\"vercel.ai.schema\");\nfunction lazySchema(createSchema) {\n let schema;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\nfunction jsonSchema(jsonSchema2, {\n validate\n} = {}) {\n return {\n [schemaSymbol]: true,\n _type: void 0,\n // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema2 === \"function\") {\n jsonSchema2 = jsonSchema2();\n }\n return jsonSchema2;\n },\n validate\n };\n}\nfunction isSchema(value) {\n return typeof value === \"object\" && value !== null && schemaSymbol in value && value[schemaSymbol] === true && \"jsonSchema\" in value && \"validate\" in value;\n}\nfunction asSchema(schema) {\n return schema == null ? jsonSchema({ properties: {}, additionalProperties: false }) : isSchema(schema) ? schema : \"~standard\" in schema ? schema[\"~standard\"].vendor === \"zod\" ? zodSchema(schema) : standardSchema(schema) : schema();\n}\nfunction standardSchema(standardSchema2) {\n return jsonSchema(\n () => addAdditionalPropertiesToJsonSchema(\n standardSchema2[\"~standard\"].jsonSchema.input({\n target: \"draft-07\"\n })\n ),\n {\n validate: async (value) => {\n const result = await standardSchema2[\"~standard\"].validate(value);\n return \"value\" in result ? { success: true, value: result.value } : {\n success: false,\n error: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError({\n value,\n cause: result.issues\n })\n };\n }\n }\n );\n}\nfunction zod3Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => zod3ToJsonSchema(zodSchema2, {\n $refStrategy: useReferences ? \"root\" : \"none\"\n }),\n {\n validate: async (value) => {\n const result = await zodSchema2.safeParseAsync(value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction zod4Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => addAdditionalPropertiesToJsonSchema(\n zod_v4__WEBPACK_IMPORTED_MODULE_2__.toJSONSchema(zodSchema2, {\n target: \"draft-7\",\n io: \"input\",\n reused: useReferences ? \"ref\" : \"inline\"\n })\n ),\n {\n validate: async (value) => {\n const result = await zod_v4__WEBPACK_IMPORTED_MODULE_3__.safeParseAsync(zodSchema2, value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction isZod4Schema(zodSchema2) {\n return \"_zod\" in zodSchema2;\n}\nfunction zodSchema(zodSchema2, options) {\n if (isZod4Schema(zodSchema2)) {\n return zod4Schema(zodSchema2, options);\n } else {\n return zod3Schema(zodSchema2, options);\n }\n}\n\n// src/validate-types.ts\nasync function validateTypes({\n value,\n schema,\n context\n}) {\n const result = await safeValidateTypes({ value, schema, context });\n if (!result.success) {\n throw _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError.wrap({ value, cause: result.error, context });\n }\n return result.value;\n}\nasync function safeValidateTypes({\n value,\n schema,\n context\n}) {\n const actualSchema = asSchema(schema);\n try {\n if (actualSchema.validate == null) {\n return { success: true, value, rawValue: value };\n }\n const result = await actualSchema.validate(value);\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n return {\n success: false,\n error: _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError.wrap({ value, cause: result.error, context }),\n rawValue: value\n };\n } catch (error) {\n return {\n success: false,\n error: _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError.wrap({ value, cause: error, context }),\n rawValue: value\n };\n }\n}\n\n// src/parse-json.ts\nasync function parseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return value;\n }\n return validateTypes({ value, schema });\n } catch (error) {\n if (_ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.JSONParseError.isInstance(error) || _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.TypeValidationError.isInstance(error)) {\n throw error;\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.JSONParseError({ text, cause: error });\n }\n}\nasync function safeParseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return { success: true, value, rawValue: value };\n }\n return await safeValidateTypes({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.JSONParseError.isInstance(error) ? error : new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.JSONParseError({ text, cause: error }),\n rawValue: void 0\n };\n }\n}\nfunction isParsableJson(input) {\n try {\n secureJsonParse(input);\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// src/parse-json-event-stream.ts\n\nfunction parseJsonEventStream({\n stream,\n schema\n}) {\n return stream.pipeThrough(new TextDecoderStream()).pipeThrough(new eventsource_parser_stream__WEBPACK_IMPORTED_MODULE_4__.EventSourceParserStream()).pipeThrough(\n new TransformStream({\n async transform({ data }, controller) {\n if (data === \"[DONE]\") {\n return;\n }\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n }\n })\n );\n}\n\n// src/parse-provider-options.ts\n\nasync function parseProviderOptions({\n provider,\n providerOptions,\n schema\n}) {\n if ((providerOptions == null ? void 0 : providerOptions[provider]) == null) {\n return void 0;\n }\n const parsedProviderOptions = await safeValidateTypes({\n value: providerOptions[provider],\n schema\n });\n if (!parsedProviderOptions.success) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.InvalidArgumentError({\n argument: \"providerOptions\",\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error\n });\n }\n return parsedProviderOptions.value;\n}\n\n// src/post-to-api.ts\n\nvar getOriginalFetch2 = () => globalThis.fetch;\nvar postJsonToApi = async ({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: {\n content: JSON.stringify(body),\n values: body\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postFormDataToApi = async ({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries(formData.entries())\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postToApi = async ({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch2()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"POST\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n body: body.content,\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (isAbortError(error) || _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError.isInstance(error)) {\n throw error;\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError.isInstance(error)) {\n throw error;\n }\n }\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n\n// src/types/tool.ts\nfunction tool(tool2) {\n return tool2;\n}\nfunction dynamicTool(tool2) {\n return { ...tool2, type: \"dynamic\" };\n}\n\n// src/provider-tool-factory.ts\nfunction createProviderToolFactory({\n id,\n inputSchema\n}) {\n return ({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable\n });\n}\nfunction createProviderToolFactoryWithOutputSchema({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults\n}) {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults\n });\n}\n\n// src/remove-undefined-entries.ts\nfunction removeUndefinedEntries(record) {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null)\n );\n}\n\n// src/resolve.ts\nasync function resolve(value) {\n if (typeof value === \"function\") {\n value = value();\n }\n return Promise.resolve(value);\n}\n\n// src/response-handler.ts\n\nvar createJsonErrorResponseHandler = ({\n errorSchema,\n errorToMessage,\n isRetryable\n}) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n if (responseBody.trim() === \"\") {\n return {\n responseHeaders,\n value: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema\n });\n return {\n responseHeaders,\n value: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response, parsedError)\n })\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n};\nvar createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (response.body == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.EmptyResponseBodyError({});\n }\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema\n })\n };\n};\nvar createJsonResponseHandler = (responseSchema) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!parsedResult.success) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Invalid JSON response\",\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues\n });\n }\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue\n };\n};\nvar createBinaryResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (!response.body) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0\n });\n }\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer)\n };\n } catch (error) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: \"Failed to read response as array buffer\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0,\n cause: error\n });\n }\n};\nvar createStatusCodeErrorResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n return {\n responseHeaders,\n value: new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_0__.APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody\n })\n };\n};\n\n// src/strip-file-extension.ts\nfunction stripFileExtension(filename) {\n const firstDotIndex = filename.indexOf(\".\");\n return firstDotIndex === -1 ? filename : filename.slice(0, firstDotIndex);\n}\n\n// src/without-trailing-slash.ts\nfunction withoutTrailingSlash(url) {\n return url == null ? void 0 : url.replace(/\\/$/, \"\");\n}\n\n// src/is-async-iterable.ts\nfunction isAsyncIterable(obj) {\n return obj != null && typeof obj[Symbol.asyncIterator] === \"function\";\n}\n\n// src/types/execute-tool.ts\nasync function* executeTool({\n execute,\n input,\n options\n}) {\n const result = execute(input, options);\n if (isAsyncIterable(result)) {\n let lastOutput;\n for await (const output of result) {\n lastOutput = output;\n yield { type: \"preliminary\", output };\n }\n yield { type: \"final\", output: lastOutput };\n } else {\n yield { type: \"final\", output: await result };\n }\n}\n\n// src/index.ts\n\n\n//# sourceMappingURL=index.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQGFpLXNkaytwcm92aWRlci11dGlsc0A0LjAuMjFfem9kQDMuMjUuNzYvbm9kZV9tb2R1bGVzL0BhaS1zZGsvcHJvdmlkZXItdXRpbHMvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25ELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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LFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQixTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CO0FBQ0EsU0FBUyx5REFBc0I7QUFDL0I7QUFDQSxTQUFTLHlEQUFzQjtBQUMvQjtBQUNBLFNBQVMseURBQXNCO0FBQy9CLFNBQVMseURBQXNCO0FBQy9CLFNBQVMseURBQXNCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxzQ0FBc0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQSxZQUFZO0FBQ1osSUFBSTtBQUNKLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBR21DO0FBK0RqQztBQUNGIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BhaS1zZGsrcHJvdmlkZXItdXRpbHNANC4wLjIxX3pvZEAzLjI1Ljc2L25vZGVfbW9kdWxlcy9AYWktc2RrL3Byb3ZpZGVyLXV0aWxzL2Rpc3QvaW5kZXgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9jb21iaW5lLWhlYWRlcnMudHNcbmZ1bmN0aW9uIGNvbWJpbmVIZWFkZXJzKC4uLmhlYWRlcnMpIHtcbiAgcmV0dXJuIGhlYWRlcnMucmVkdWNlKFxuICAgIChjb21iaW5lZEhlYWRlcnMsIGN1cnJlbnRIZWFkZXJzKSA9PiAoe1xuICAgICAgLi4uY29tYmluZWRIZWFkZXJzLFxuICAgICAgLi4uY3VycmVudEhlYWRlcnMgIT0gbnVsbCA/IGN1cnJlbnRIZWFkZXJzIDoge31cbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG4vLyBzcmMvY29udmVydC1hc3luYy1pdGVyYXRvci10by1yZWFkYWJsZS1zdHJlYW0udHNcbmZ1bmN0aW9uIGNvbnZlcnRBc3luY0l0ZXJhdG9yVG9SZWFkYWJsZVN0cmVhbShpdGVyYXRvcikge1xuICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb25zdW1lciB3YW50cyB0byBwdWxsIG1vcmUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI8VD59IGNvbnRyb2xsZXIgLSBUaGUgY29udHJvbGxlciB0byBlbnF1ZXVlIGRhdGEgaW50byB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb25zdW1lciBjYW5jZWxzIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgYXN5bmMgY2FuY2VsKHJlYXNvbikge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmIChpdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4ocmVhc29uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gc3JjL2NyZWF0ZS10b29sLW5hbWUtbWFwcGluZy50c1xuZnVuY3Rpb24gY3JlYXRlVG9vbE5hbWVNYXBwaW5nKHtcbiAgdG9vbHMgPSBbXSxcbiAgcHJvdmlkZXJUb29sTmFtZXMsXG4gIHJlc29sdmVQcm92aWRlclRvb2xOYW1lXG59KSB7XG4gIHZhciBfYTI7XG4gIGNvbnN0IGN1c3RvbVRvb2xOYW1lVG9Qcm92aWRlclRvb2xOYW1lID0ge307XG4gIGNvbnN0IHByb3ZpZGVyVG9vbE5hbWVUb0N1c3RvbVRvb2xOYW1lID0ge307XG4gIGZvciAoY29uc3QgdG9vbDIgb2YgdG9vbHMpIHtcbiAgICBpZiAodG9vbDIudHlwZSA9PT0gXCJwcm92aWRlclwiKSB7XG4gICAgICBjb25zdCBwcm92aWRlclRvb2xOYW1lID0gKF9hMiA9IHJlc29sdmVQcm92aWRlclRvb2xOYW1lID09IG51bGwgPyB2b2lkIDAgOiByZXNvbHZlUHJvdmlkZXJUb29sTmFtZSh0b29sMikpICE9IG51bGwgPyBfYTIgOiB0b29sMi5pZCBpbiBwcm92aWRlclRvb2xOYW1lcyA/IHByb3ZpZGVyVG9vbE5hbWVzW3Rvb2wyLmlkXSA6IHZvaWQgMDtcbiAgICAgIGlmIChwcm92aWRlclRvb2xOYW1lID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjdXN0b21Ub29sTmFtZVRvUHJvdmlkZXJUb29sTmFtZVt0b29sMi5uYW1lXSA9IHByb3ZpZGVyVG9vbE5hbWU7XG4gICAgICBwcm92aWRlclRvb2xOYW1lVG9DdXN0b21Ub29sTmFtZVtwcm92aWRlclRvb2xOYW1lXSA9IHRvb2wyLm5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdG9Qcm92aWRlclRvb2xOYW1lOiAoY3VzdG9tVG9vbE5hbWUpID0+IHtcbiAgICAgIHZhciBfYTM7XG4gICAgICByZXR1cm4gKF9hMyA9IGN1c3RvbVRvb2xOYW1lVG9Qcm92aWRlclRvb2xOYW1lW2N1c3RvbVRvb2xOYW1lXSkgIT0gbnVsbCA/IF9hMyA6IGN1c3RvbVRvb2xOYW1lO1xuICAgIH0sXG4gICAgdG9DdXN0b21Ub29sTmFtZTogKHByb3ZpZGVyVG9vbE5hbWUpID0+IHtcbiAgICAgIHZhciBfYTM7XG4gICAgICByZXR1cm4gKF9hMyA9IHByb3ZpZGVyVG9vbE5hbWVUb0N1c3RvbVRvb2xOYW1lW3Byb3ZpZGVyVG9vbE5hbWVdKSAhPSBudWxsID8gX2EzIDogcHJvdmlkZXJUb29sTmFtZTtcbiAgICB9XG4gIH07XG59XG5cbi8vIHNyYy9kZWxheS50c1xuYXN5bmMgZnVuY3Rpb24gZGVsYXkoZGVsYXlJbk1zLCBvcHRpb25zKSB7XG4gIGlmIChkZWxheUluTXMgPT0gbnVsbCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICBjb25zdCBzaWduYWwgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHtcbiAgICBpZiAoc2lnbmFsID09IG51bGwgPyB2b2lkIDAgOiBzaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmVqZWN0KGNyZWF0ZUFib3J0RXJyb3IoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgcmVzb2x2ZTIoKTtcbiAgICB9LCBkZWxheUluTXMpO1xuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIHNpZ25hbCA9PSBudWxsID8gdm9pZCAwIDogc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICByZWplY3QoY3JlYXRlQWJvcnRFcnJvcigpKTtcbiAgICB9O1xuICAgIHNpZ25hbCA9PSBudWxsID8gdm9pZCAwIDogc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVBYm9ydEVycm9yKCkge1xuICByZXR1cm4gbmV3IERPTUV4Y2VwdGlvbihcIkRlbGF5IHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuLy8gc3JjL2RlbGF5ZWQtcHJvbWlzZS50c1xudmFyIERlbGF5ZWRQcm9taXNlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN0YXR1cyA9IHsgdHlwZTogXCJwZW5kaW5nXCIgfTtcbiAgICB0aGlzLl9yZXNvbHZlID0gdm9pZCAwO1xuICAgIHRoaXMuX3JlamVjdCA9IHZvaWQgMDtcbiAgfVxuICBnZXQgcHJvbWlzZSgpIHtcbiAgICBpZiAodGhpcy5fcHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgfVxuICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgPT09IFwicmVzb2x2ZWRcIikge1xuICAgICAgICByZXNvbHZlMih0aGlzLnN0YXR1cy52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdHVzLnR5cGUgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICByZWplY3QodGhpcy5zdGF0dXMuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmUyO1xuICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICB9XG4gIHJlc29sdmUodmFsdWUpIHtcbiAgICB2YXIgX2EyO1xuICAgIHRoaXMuc3RhdHVzID0geyB0eXBlOiBcInJlc29sdmVkXCIsIHZhbHVlIH07XG4gICAgaWYgKHRoaXMuX3Byb21pc2UpIHtcbiAgICAgIChfYTIgPSB0aGlzLl9yZXNvbHZlKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZWplY3QoZXJyb3IpIHtcbiAgICB2YXIgX2EyO1xuICAgIHRoaXMuc3RhdHVzID0geyB0eXBlOiBcInJlamVjdGVkXCIsIGVycm9yIH07XG4gICAgaWYgKHRoaXMuX3Byb21pc2UpIHtcbiAgICAgIChfYTIgPSB0aGlzLl9yZWplY3QpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIGlzUmVzb2x2ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzLnR5cGUgPT09IFwicmVzb2x2ZWRcIjtcbiAgfVxuICBpc1JlamVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cy50eXBlID09PSBcInJlamVjdGVkXCI7XG4gIH1cbiAgaXNQZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cy50eXBlID09PSBcInBlbmRpbmdcIjtcbiAgfVxufTtcblxuLy8gc3JjL2V4dHJhY3QtcmVzcG9uc2UtaGVhZGVycy50c1xuZnVuY3Rpb24gZXh0cmFjdFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZSkge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFsuLi5yZXNwb25zZS5oZWFkZXJzXSk7XG59XG5cbi8vIHNyYy91aW50OC11dGlscy50c1xudmFyIHsgYnRvYSwgYXRvYiB9ID0gZ2xvYmFsVGhpcztcbmZ1bmN0aW9uIGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSB7XG4gIGNvbnN0IGJhc2U2NFVybCA9IGJhc2U2NFN0cmluZy5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgY29uc3QgbGF0aW4xc3RyaW5nID0gYXRvYihiYXNlNjRVcmwpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGxhdGluMXN0cmluZywgKGJ5dGUpID0+IGJ5dGUuY29kZVBvaW50QXQoMCkpO1xufVxuZnVuY3Rpb24gY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NChhcnJheSkge1xuICBsZXQgbGF0aW4xc3RyaW5nID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGxhdGluMXN0cmluZyArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChhcnJheVtpXSk7XG4gIH1cbiAgcmV0dXJuIGJ0b2EobGF0aW4xc3RyaW5nKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb0Jhc2U2NCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gY29udmVydFVpbnQ4QXJyYXlUb0Jhc2U2NCh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuLy8gc3JjL2NvbnZlcnQtaW1hZ2UtbW9kZWwtZmlsZS10by1kYXRhLXVyaS50c1xuZnVuY3Rpb24gY29udmVydEltYWdlTW9kZWxGaWxlVG9EYXRhVXJpKGZpbGUpIHtcbiAgaWYgKGZpbGUudHlwZSA9PT0gXCJ1cmxcIikgcmV0dXJuIGZpbGUudXJsO1xuICByZXR1cm4gYGRhdGE6JHtmaWxlLm1lZGlhVHlwZX07YmFzZTY0LCR7dHlwZW9mIGZpbGUuZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGZpbGUuZGF0YSA6IGNvbnZlcnRVaW50OEFycmF5VG9CYXNlNjQoZmlsZS5kYXRhKX1gO1xufVxuXG4vLyBzcmMvY29udmVydC10by1mb3JtLWRhdGEudHNcbmZ1bmN0aW9uIGNvbnZlcnRUb0Zvcm1EYXRhKGlucHV0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyB1c2VBcnJheUJyYWNrZXRzID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWVbMF0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFycmF5S2V5ID0gdXNlQXJyYXlCcmFja2V0cyA/IGAke2tleX1bXWAgOiBrZXk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGFycmF5S2V5LCBpdGVtKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG4vLyBzcmMvZG93bmxvYWQtZXJyb3IudHNcbmltcG9ydCB7IEFJU0RLRXJyb3IgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIG5hbWUgPSBcIkFJX0Rvd25sb2FkRXJyb3JcIjtcbnZhciBtYXJrZXIgPSBgdmVyY2VsLmFpLmVycm9yLiR7bmFtZX1gO1xudmFyIHN5bWJvbCA9IFN5bWJvbC5mb3IobWFya2VyKTtcbnZhciBfYSwgX2I7XG52YXIgRG93bmxvYWRFcnJvciA9IGNsYXNzIGV4dGVuZHMgKF9iID0gQUlTREtFcnJvciwgX2EgPSBzeW1ib2wsIF9iKSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB1cmwsXG4gICAgc3RhdHVzQ29kZSxcbiAgICBzdGF0dXNUZXh0LFxuICAgIGNhdXNlLFxuICAgIG1lc3NhZ2UgPSBjYXVzZSA9PSBudWxsID8gYEZhaWxlZCB0byBkb3dubG9hZCAke3VybH06ICR7c3RhdHVzQ29kZX0gJHtzdGF0dXNUZXh0fWAgOiBgRmFpbGVkIHRvIGRvd25sb2FkICR7dXJsfTogJHtjYXVzZX1gXG4gIH0pIHtcbiAgICBzdXBlcih7IG5hbWUsIG1lc3NhZ2UsIGNhdXNlIH0pO1xuICAgIHRoaXNbX2FdID0gdHJ1ZTtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQ7XG4gIH1cbiAgc3RhdGljIGlzSW5zdGFuY2UoZXJyb3IpIHtcbiAgICByZXR1cm4gQUlTREtFcnJvci5oYXNNYXJrZXIoZXJyb3IsIG1hcmtlcik7XG4gIH1cbn07XG5cbi8vIHNyYy9yZWFkLXJlc3BvbnNlLXdpdGgtc2l6ZS1saW1pdC50c1xudmFyIERFRkFVTFRfTUFYX0RPV05MT0FEX1NJWkUgPSAyICogMTAyNCAqIDEwMjQgKiAxMDI0O1xuYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlV2l0aFNpemVMaW1pdCh7XG4gIHJlc3BvbnNlLFxuICB1cmwsXG4gIG1heEJ5dGVzID0gREVGQVVMVF9NQVhfRE9XTkxPQURfU0laRVxufSkge1xuICBjb25zdCBjb250ZW50TGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWxlbmd0aFwiKTtcbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGNvbnRlbnRMZW5ndGgsIDEwKTtcbiAgICBpZiAoIWlzTmFOKGxlbmd0aCkgJiYgbGVuZ3RoID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBEb3dubG9hZEVycm9yKHtcbiAgICAgICAgdXJsLFxuICAgICAgICBtZXNzYWdlOiBgRG93bmxvYWQgb2YgJHt1cmx9IGV4Y2VlZGVkIG1heGltdW0gc2l6ZSBvZiAke21heEJ5dGVzfSBieXRlcyAoQ29udGVudC1MZW5ndGg6ICR7bGVuZ3RofSkuYFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGJvZHkgPSByZXNwb25zZS5ib2R5O1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICB9XG4gIGNvbnN0IHJlYWRlciA9IGJvZHkuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRvdGFsQnl0ZXMgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgaWYgKHRvdGFsQnl0ZXMgPiBtYXhCeXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgRG93bmxvYWRFcnJvcih7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1lc3NhZ2U6IGBEb3dubG9hZCBvZiAke3VybH0gZXhjZWVkZWQgbWF4aW11bSBzaXplIG9mICR7bWF4Qnl0ZXN9IGJ5dGVzLmBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVzKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgcmVzdWx0LnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy92YWxpZGF0ZS1kb3dubG9hZC11cmwudHNcbmZ1bmN0aW9uIHZhbGlkYXRlRG93bmxvYWRVcmwodXJsKSB7XG4gIGxldCBwYXJzZWQ7XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IERvd25sb2FkRXJyb3Ioe1xuICAgICAgdXJsLFxuICAgICAgbWVzc2FnZTogYEludmFsaWQgVVJMOiAke3VybH1gXG4gICAgfSk7XG4gIH1cbiAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gXCJodHRwOlwiICYmIHBhcnNlZC5wcm90b2NvbCAhPT0gXCJodHRwczpcIikge1xuICAgIHRocm93IG5ldyBEb3dubG9hZEVycm9yKHtcbiAgICAgIHVybCxcbiAgICAgIG1lc3NhZ2U6IGBVUkwgc2NoZW1lIG11c3QgYmUgaHR0cCBvciBodHRwcywgZ290ICR7cGFyc2VkLnByb3RvY29sfWBcbiAgICB9KTtcbiAgfVxuICBjb25zdCBob3N0bmFtZSA9IHBhcnNlZC5ob3N0bmFtZTtcbiAgaWYgKCFob3N0bmFtZSkge1xuICAgIHRocm93IG5ldyBEb3dubG9hZEVycm9yKHtcbiAgICAgIHVybCxcbiAgICAgIG1lc3NhZ2U6IGBVUkwgbXVzdCBoYXZlIGEgaG9zdG5hbWVgXG4gICAgfSk7XG4gIH1cbiAgaWYgKGhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3RuYW1lLmVuZHNXaXRoKFwiLmxvY2FsXCIpIHx8IGhvc3RuYW1lLmVuZHNXaXRoKFwiLmxvY2FsaG9zdFwiKSkge1xuICAgIHRocm93IG5ldyBEb3dubG9hZEVycm9yKHtcbiAgICAgIHVybCxcbiAgICAgIG1lc3NhZ2U6IGBVUkwgd2l0aCBob3N0bmFtZSAke2hvc3RuYW1lfSBpcyBub3QgYWxsb3dlZGBcbiAgICB9KTtcbiAgfVxuICBpZiAoaG9zdG5hbWUuc3RhcnRzV2l0aChcIltcIikgJiYgaG9zdG5hbWUuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgY29uc3QgaXB2NiA9IGhvc3RuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICBpZiAoaXNQcml2YXRlSVB2NihpcHY2KSkge1xuICAgICAgdGhyb3cgbmV3IERvd25sb2FkRXJyb3Ioe1xuICAgICAgICB1cmwsXG4gICAgICAgIG1lc3NhZ2U6IGBVUkwgd2l0aCBJUHY2IGFkZHJlc3MgJHtob3N0bmFtZX0gaXMgbm90IGFsbG93ZWRgXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0lQdjQoaG9zdG5hbWUpKSB7XG4gICAgaWYgKGlzUHJpdmF0ZUlQdjQoaG9zdG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRG93bmxvYWRFcnJvcih7XG4gICAgICAgIHVybCxcbiAgICAgICAgbWVzc2FnZTogYFVSTCB3aXRoIElQIGFkZHJlc3MgJHtob3N0bmFtZX0gaXMgbm90IGFsbG93ZWRgXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG59XG5mdW5jdGlvbiBpc0lQdjQoaG9zdG5hbWUpIHtcbiAgY29uc3QgcGFydHMgPSBob3N0bmFtZS5zcGxpdChcIi5cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHBhcnRzLmV2ZXJ5KChwYXJ0KSA9PiB7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHBhcnQpO1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG51bSkgJiYgbnVtID49IDAgJiYgbnVtIDw9IDI1NSAmJiBTdHJpbmcobnVtKSA9PT0gcGFydDtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1ByaXZhdGVJUHY0KGlwKSB7XG4gIGNvbnN0IHBhcnRzID0gaXAuc3BsaXQoXCIuXCIpLm1hcChOdW1iZXIpO1xuICBjb25zdCBbYSwgYl0gPSBwYXJ0cztcbiAgaWYgKGEgPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PT0gMTApIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PT0gMTI3KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT09IDE2OSAmJiBiID09PSAyNTQpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PT0gMTcyICYmIGIgPj0gMTYgJiYgYiA8PSAzMSkgcmV0dXJuIHRydWU7XG4gIGlmIChhID09PSAxOTIgJiYgYiA9PT0gMTY4KSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNQcml2YXRlSVB2NihpcCkge1xuICBjb25zdCBub3JtYWxpemVkID0gaXAudG9Mb3dlckNhc2UoKTtcbiAgaWYgKG5vcm1hbGl6ZWQgPT09IFwiOjoxXCIpIHJldHVybiB0cnVlO1xuICBpZiAobm9ybWFsaXplZCA9PT0gXCI6OlwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIjo6ZmZmZjpcIikpIHtcbiAgICBjb25zdCBtYXBwZWRQYXJ0ID0gbm9ybWFsaXplZC5zbGljZSg3KTtcbiAgICBpZiAoaXNJUHY0KG1hcHBlZFBhcnQpKSB7XG4gICAgICByZXR1cm4gaXNQcml2YXRlSVB2NChtYXBwZWRQYXJ0KTtcbiAgICB9XG4gICAgY29uc3QgaGV4UGFydHMgPSBtYXBwZWRQYXJ0LnNwbGl0KFwiOlwiKTtcbiAgICBpZiAoaGV4UGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBoaWdoID0gcGFyc2VJbnQoaGV4UGFydHNbMF0sIDE2KTtcbiAgICAgIGNvbnN0IGxvdyA9IHBhcnNlSW50KGhleFBhcnRzWzFdLCAxNik7XG4gICAgICBpZiAoIWlzTmFOKGhpZ2gpICYmICFpc05hTihsb3cpKSB7XG4gICAgICAgIGNvbnN0IGEgPSBoaWdoID4+IDggJiAyNTU7XG4gICAgICAgIGNvbnN0IGIgPSBoaWdoICYgMjU1O1xuICAgICAgICBjb25zdCBjID0gbG93ID4+IDggJiAyNTU7XG4gICAgICAgIGNvbnN0IGQgPSBsb3cgJiAyNTU7XG4gICAgICAgIHJldHVybiBpc1ByaXZhdGVJUHY0KGAke2F9LiR7Yn0uJHtjfS4ke2R9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJmY1wiKSB8fCBub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJmZFwiKSkgcmV0dXJuIHRydWU7XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJmZTgwXCIpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBzcmMvZG93bmxvYWQtYmxvYi50c1xuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRCbG9iKHVybCwgb3B0aW9ucykge1xuICB2YXIgX2EyLCBfYjI7XG4gIHZhbGlkYXRlRG93bmxvYWRVcmwodXJsKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgc2lnbmFsOiBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnJlZGlyZWN0ZWQpIHtcbiAgICAgIHZhbGlkYXRlRG93bmxvYWRVcmwocmVzcG9uc2UudXJsKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IERvd25sb2FkRXJyb3Ioe1xuICAgICAgICB1cmwsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkUmVzcG9uc2VXaXRoU2l6ZUxpbWl0KHtcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgdXJsLFxuICAgICAgbWF4Qnl0ZXM6IChfYTIgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLm1heEJ5dGVzKSAhPSBudWxsID8gX2EyIDogREVGQVVMVF9NQVhfRE9XTkxPQURfU0laRVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gKF9iMiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpKSAhPSBudWxsID8gX2IyIDogdm9pZCAwO1xuICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0sIGNvbnRlbnRUeXBlID8geyB0eXBlOiBjb250ZW50VHlwZSB9IDogdm9pZCAwKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoRG93bmxvYWRFcnJvci5pc0luc3RhbmNlKGVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRocm93IG5ldyBEb3dubG9hZEVycm9yKHsgdXJsLCBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLy8gc3JjL2dlbmVyYXRlLWlkLnRzXG5pbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgY3JlYXRlSWRHZW5lcmF0b3IgPSAoe1xuICBwcmVmaXgsXG4gIHNpemUgPSAxNixcbiAgYWxwaGFiZXQgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCIsXG4gIHNlcGFyYXRvciA9IFwiLVwiXG59ID0ge30pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gKCkgPT4ge1xuICAgIGNvbnN0IGFscGhhYmV0TGVuZ3RoID0gYWxwaGFiZXQubGVuZ3RoO1xuICAgIGNvbnN0IGNoYXJzID0gbmV3IEFycmF5KHNpemUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBjaGFyc1tpXSA9IGFscGhhYmV0W01hdGgucmFuZG9tKCkgKiBhbHBoYWJldExlbmd0aCB8IDBdO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnMuam9pbihcIlwiKTtcbiAgfTtcbiAgaWYgKHByZWZpeCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBpZiAoYWxwaGFiZXQuaW5jbHVkZXMoc2VwYXJhdG9yKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcih7XG4gICAgICBhcmd1bWVudDogXCJzZXBhcmF0b3JcIixcbiAgICAgIG1lc3NhZ2U6IGBUaGUgc2VwYXJhdG9yIFwiJHtzZXBhcmF0b3J9XCIgbXVzdCBub3QgYmUgcGFydCBvZiB0aGUgYWxwaGFiZXQgXCIke2FscGhhYmV0fVwiLmBcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gKCkgPT4gYCR7cHJlZml4fSR7c2VwYXJhdG9yfSR7Z2VuZXJhdG9yKCl9YDtcbn07XG52YXIgZ2VuZXJhdGVJZCA9IGNyZWF0ZUlkR2VuZXJhdG9yKCk7XG5cbi8vIHNyYy9nZXQtZXJyb3ItbWVzc2FnZS50c1xuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSB7XG4gIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFwidW5rbm93biBlcnJvclwiO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xufVxuXG4vLyBzcmMvZ2V0LWZyb20tYXBpLnRzXG5pbXBvcnQgeyBBUElDYWxsRXJyb3IgYXMgQVBJQ2FsbEVycm9yMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5cbi8vIHNyYy9oYW5kbGUtZmV0Y2gtZXJyb3IudHNcbmltcG9ydCB7IEFQSUNhbGxFcnJvciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5cbi8vIHNyYy9pcy1hYm9ydC1lcnJvci50c1xuZnVuY3Rpb24gaXNBYm9ydEVycm9yKGVycm9yKSB7XG4gIHJldHVybiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbikgJiYgKGVycm9yLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8IGVycm9yLm5hbWUgPT09IFwiUmVzcG9uc2VBYm9ydGVkXCIgfHwgLy8gTmV4dC5qc1xuICBlcnJvci5uYW1lID09PSBcIlRpbWVvdXRFcnJvclwiKTtcbn1cblxuLy8gc3JjL2hhbmRsZS1mZXRjaC1lcnJvci50c1xudmFyIEZFVENIX0ZBSUxFRF9FUlJPUl9NRVNTQUdFUyA9IFtcImZldGNoIGZhaWxlZFwiLCBcImZhaWxlZCB0byBmZXRjaFwiXTtcbnZhciBCVU5fRVJST1JfQ09ERVMgPSBbXG4gIFwiQ29ubmVjdGlvblJlZnVzZWRcIixcbiAgXCJDb25uZWN0aW9uQ2xvc2VkXCIsXG4gIFwiRmFpbGVkVG9PcGVuU29ja2V0XCIsXG4gIFwiRUNPTk5SRVNFVFwiLFxuICBcIkVDT05OUkVGVVNFRFwiLFxuICBcIkVUSU1FRE9VVFwiLFxuICBcIkVQSVBFXCJcbl07XG5mdW5jdGlvbiBpc0J1bk5ldHdvcmtFcnJvcihlcnJvcikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjb2RlID0gZXJyb3IuY29kZTtcbiAgaWYgKHR5cGVvZiBjb2RlID09PSBcInN0cmluZ1wiICYmIEJVTl9FUlJPUl9DT0RFUy5pbmNsdWRlcyhjb2RlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUZldGNoRXJyb3Ioe1xuICBlcnJvcixcbiAgdXJsLFxuICByZXF1ZXN0Qm9keVZhbHVlc1xufSkge1xuICBpZiAoaXNBYm9ydEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgRkVUQ0hfRkFJTEVEX0VSUk9SX01FU1NBR0VTLmluY2x1ZGVzKGVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKSkpIHtcbiAgICBjb25zdCBjYXVzZSA9IGVycm9yLmNhdXNlO1xuICAgIGlmIChjYXVzZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEFQSUNhbGxFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IGBDYW5ub3QgY29ubmVjdCB0byBBUEk6ICR7Y2F1c2UubWVzc2FnZX1gLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgdXJsLFxuICAgICAgICByZXF1ZXN0Qm9keVZhbHVlcyxcbiAgICAgICAgaXNSZXRyeWFibGU6IHRydWVcbiAgICAgICAgLy8gcmV0cnkgd2hlbiBuZXR3b3JrIGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQnVuTmV0d29ya0Vycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBuZXcgQVBJQ2FsbEVycm9yKHtcbiAgICAgIG1lc3NhZ2U6IGBDYW5ub3QgY29ubmVjdCB0byBBUEk6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgdXJsLFxuICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICBpc1JldHJ5YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuLy8gc3JjL2dldC1ydW50aW1lLWVudmlyb25tZW50LXVzZXItYWdlbnQudHNcbmZ1bmN0aW9uIGdldFJ1bnRpbWVFbnZpcm9ubWVudFVzZXJBZ2VudChnbG9iYWxUaGlzQW55ID0gZ2xvYmFsVGhpcykge1xuICB2YXIgX2EyLCBfYjIsIF9jO1xuICBpZiAoZ2xvYmFsVGhpc0FueS53aW5kb3cpIHtcbiAgICByZXR1cm4gYHJ1bnRpbWUvYnJvd3NlcmA7XG4gIH1cbiAgaWYgKChfYTIgPSBnbG9iYWxUaGlzQW55Lm5hdmlnYXRvcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi51c2VyQWdlbnQpIHtcbiAgICByZXR1cm4gYHJ1bnRpbWUvJHtnbG9iYWxUaGlzQW55Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKX1gO1xuICB9XG4gIGlmICgoX2MgPSAoX2IyID0gZ2xvYmFsVGhpc0FueS5wcm9jZXNzKSA9PSBudWxsID8gdm9pZCAwIDogX2IyLnZlcnNpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2Mubm9kZSkge1xuICAgIHJldHVybiBgcnVudGltZS9ub2RlLmpzLyR7Z2xvYmFsVGhpc0FueS5wcm9jZXNzLnZlcnNpb24uc3Vic3RyaW5nKDApfWA7XG4gIH1cbiAgaWYgKGdsb2JhbFRoaXNBbnkuRWRnZVJ1bnRpbWUpIHtcbiAgICByZXR1cm4gYHJ1bnRpbWUvdmVyY2VsLWVkZ2VgO1xuICB9XG4gIHJldHVybiBcInJ1bnRpbWUvdW5rbm93blwiO1xufVxuXG4vLyBzcmMvbm9ybWFsaXplLWhlYWRlcnMudHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcnMoaGVhZGVycykge1xuICBpZiAoaGVhZGVycyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBub3JtYWxpemVkW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBoZWFkZXJzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBub3JtYWxpemVkW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gc3JjL3dpdGgtdXNlci1hZ2VudC1zdWZmaXgudHNcbmZ1bmN0aW9uIHdpdGhVc2VyQWdlbnRTdWZmaXgoaGVhZGVycywgLi4udXNlckFnZW50U3VmZml4UGFydHMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZEhlYWRlcnMgPSBuZXcgSGVhZGVycyhub3JtYWxpemVIZWFkZXJzKGhlYWRlcnMpKTtcbiAgY29uc3QgY3VycmVudFVzZXJBZ2VudEhlYWRlciA9IG5vcm1hbGl6ZWRIZWFkZXJzLmdldChcInVzZXItYWdlbnRcIikgfHwgXCJcIjtcbiAgbm9ybWFsaXplZEhlYWRlcnMuc2V0KFxuICAgIFwidXNlci1hZ2VudFwiLFxuICAgIFtjdXJyZW50VXNlckFnZW50SGVhZGVyLCAuLi51c2VyQWdlbnRTdWZmaXhQYXJ0c10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMobm9ybWFsaXplZEhlYWRlcnMuZW50cmllcygpKTtcbn1cblxuLy8gc3JjL3ZlcnNpb24udHNcbnZhciBWRVJTSU9OID0gdHJ1ZSA/IFwiNC4wLjIxXCIgOiBcIjAuMC4wLXRlc3RcIjtcblxuLy8gc3JjL2dldC1mcm9tLWFwaS50c1xudmFyIGdldE9yaWdpbmFsRmV0Y2ggPSAoKSA9PiBnbG9iYWxUaGlzLmZldGNoO1xudmFyIGdldEZyb21BcGkgPSBhc3luYyAoe1xuICB1cmwsXG4gIGhlYWRlcnMgPSB7fSxcbiAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcixcbiAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICBhYm9ydFNpZ25hbCxcbiAgZmV0Y2g6IGZldGNoMiA9IGdldE9yaWdpbmFsRmV0Y2goKVxufSkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gyKHVybCwge1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgaGVhZGVyczogd2l0aFVzZXJBZ2VudFN1ZmZpeChcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYGFpLXNkay9wcm92aWRlci11dGlscy8ke1ZFUlNJT059YCxcbiAgICAgICAgZ2V0UnVudGltZUVudmlyb25tZW50VXNlckFnZW50KClcbiAgICAgICksXG4gICAgICBzaWduYWw6IGFib3J0U2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gZXh0cmFjdFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbGV0IGVycm9ySW5mb3JtYXRpb247XG4gICAgICB0cnkge1xuICAgICAgICBlcnJvckluZm9ybWF0aW9uID0gYXdhaXQgZmFpbGVkUmVzcG9uc2VIYW5kbGVyKHtcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnJvcikgfHwgQVBJQ2FsbEVycm9yMi5pc0luc3RhbmNlKGVycm9yKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBBUElDYWxsRXJyb3IyKHtcbiAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBwcm9jZXNzIGVycm9yIHJlc3BvbnNlXCIsXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzOiB7fVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9ySW5mb3JtYXRpb24udmFsdWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcih7XG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICB1cmwsXG4gICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzOiB7fVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyb3IpIHx8IEFQSUNhbGxFcnJvcjIuaXNJbnN0YW5jZShlcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcjIoe1xuICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBwcm9jZXNzIHN1Y2Nlc3NmdWwgcmVzcG9uc2VcIixcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICByZXF1ZXN0Qm9keVZhbHVlczoge31cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBoYW5kbGVGZXRjaEVycm9yKHsgZXJyb3IsIHVybCwgcmVxdWVzdEJvZHlWYWx1ZXM6IHt9IH0pO1xuICB9XG59O1xuXG4vLyBzcmMvaW5qZWN0LWpzb24taW5zdHJ1Y3Rpb24udHNcbnZhciBERUZBVUxUX1NDSEVNQV9QUkVGSVggPSBcIkpTT04gc2NoZW1hOlwiO1xudmFyIERFRkFVTFRfU0NIRU1BX1NVRkZJWCA9IFwiWW91IE1VU1QgYW5zd2VyIHdpdGggYSBKU09OIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIEpTT04gc2NoZW1hIGFib3ZlLlwiO1xudmFyIERFRkFVTFRfR0VORVJJQ19TVUZGSVggPSBcIllvdSBNVVNUIGFuc3dlciB3aXRoIEpTT04uXCI7XG5mdW5jdGlvbiBpbmplY3RKc29uSW5zdHJ1Y3Rpb24oe1xuICBwcm9tcHQsXG4gIHNjaGVtYSxcbiAgc2NoZW1hUHJlZml4ID0gc2NoZW1hICE9IG51bGwgPyBERUZBVUxUX1NDSEVNQV9QUkVGSVggOiB2b2lkIDAsXG4gIHNjaGVtYVN1ZmZpeCA9IHNjaGVtYSAhPSBudWxsID8gREVGQVVMVF9TQ0hFTUFfU1VGRklYIDogREVGQVVMVF9HRU5FUklDX1NVRkZJWFxufSkge1xuICByZXR1cm4gW1xuICAgIHByb21wdCAhPSBudWxsICYmIHByb21wdC5sZW5ndGggPiAwID8gcHJvbXB0IDogdm9pZCAwLFxuICAgIHByb21wdCAhPSBudWxsICYmIHByb21wdC5sZW5ndGggPiAwID8gXCJcIiA6IHZvaWQgMCxcbiAgICAvLyBhZGQgYSBuZXdsaW5lIGlmIHByb21wdCBpcyBub3QgbnVsbFxuICAgIHNjaGVtYVByZWZpeCxcbiAgICBzY2hlbWEgIT0gbnVsbCA/IEpTT04uc3RyaW5naWZ5KHNjaGVtYSkgOiB2b2lkIDAsXG4gICAgc2NoZW1hU3VmZml4XG4gIF0uZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9IG51bGwpLmpvaW4oXCJcXG5cIik7XG59XG5mdW5jdGlvbiBpbmplY3RKc29uSW5zdHJ1Y3Rpb25JbnRvTWVzc2FnZXMoe1xuICBtZXNzYWdlcyxcbiAgc2NoZW1hLFxuICBzY2hlbWFQcmVmaXgsXG4gIHNjaGVtYVN1ZmZpeFxufSkge1xuICB2YXIgX2EyLCBfYjI7XG4gIGNvbnN0IHN5c3RlbU1lc3NhZ2UgPSAoKF9hMiA9IG1lc3NhZ2VzWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLnJvbGUpID09PSBcInN5c3RlbVwiID8geyAuLi5tZXNzYWdlc1swXSB9IDogeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBcIlwiIH07XG4gIHN5c3RlbU1lc3NhZ2UuY29udGVudCA9IGluamVjdEpzb25JbnN0cnVjdGlvbih7XG4gICAgcHJvbXB0OiBzeXN0ZW1NZXNzYWdlLmNvbnRlbnQsXG4gICAgc2NoZW1hLFxuICAgIHNjaGVtYVByZWZpeCxcbiAgICBzY2hlbWFTdWZmaXhcbiAgfSk7XG4gIHJldHVybiBbXG4gICAgc3lzdGVtTWVzc2FnZSxcbiAgICAuLi4oKF9iMiA9IG1lc3NhZ2VzWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX2IyLnJvbGUpID09PSBcInN5c3RlbVwiID8gbWVzc2FnZXMuc2xpY2UoMSkgOiBtZXNzYWdlc1xuICBdO1xufVxuXG4vLyBzcmMvaXMtbm9uLW51bGxhYmxlLnRzXG5mdW5jdGlvbiBpc05vbk51bGxhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsO1xufVxuXG4vLyBzcmMvaXMtdXJsLXN1cHBvcnRlZC50c1xuZnVuY3Rpb24gaXNVcmxTdXBwb3J0ZWQoe1xuICBtZWRpYVR5cGUsXG4gIHVybCxcbiAgc3VwcG9ydGVkVXJsc1xufSkge1xuICB1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTtcbiAgbWVkaWFUeXBlID0gbWVkaWFUeXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhzdXBwb3J0ZWRVcmxzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IG1lZGlhVHlwZTIgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbWVkaWFUeXBlMiA9PT0gXCIqXCIgfHwgbWVkaWFUeXBlMiA9PT0gXCIqLypcIiA/IHsgbWVkaWFUeXBlUHJlZml4OiBcIlwiLCByZWdleGVzOiB2YWx1ZSB9IDogeyBtZWRpYVR5cGVQcmVmaXg6IG1lZGlhVHlwZTIucmVwbGFjZSgvXFwqLywgXCJcIiksIHJlZ2V4ZXM6IHZhbHVlIH07XG4gIH0pLmZpbHRlcigoeyBtZWRpYVR5cGVQcmVmaXggfSkgPT4gbWVkaWFUeXBlLnN0YXJ0c1dpdGgobWVkaWFUeXBlUHJlZml4KSkuZmxhdE1hcCgoeyByZWdleGVzIH0pID0+IHJlZ2V4ZXMpLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdCh1cmwpKTtcbn1cblxuLy8gc3JjL2xvYWQtYXBpLWtleS50c1xuaW1wb3J0IHsgTG9hZEFQSUtleUVycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmZ1bmN0aW9uIGxvYWRBcGlLZXkoe1xuICBhcGlLZXksXG4gIGVudmlyb25tZW50VmFyaWFibGVOYW1lLFxuICBhcGlLZXlQYXJhbWV0ZXJOYW1lID0gXCJhcGlLZXlcIixcbiAgZGVzY3JpcHRpb25cbn0pIHtcbiAgaWYgKHR5cGVvZiBhcGlLZXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYXBpS2V5O1xuICB9XG4gIGlmIChhcGlLZXkgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBMb2FkQVBJS2V5RXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYCR7ZGVzY3JpcHRpb259IEFQSSBrZXkgbXVzdCBiZSBhIHN0cmluZy5gXG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdGhyb3cgbmV3IExvYWRBUElLZXlFcnJvcih7XG4gICAgICBtZXNzYWdlOiBgJHtkZXNjcmlwdGlvbn0gQVBJIGtleSBpcyBtaXNzaW5nLiBQYXNzIGl0IHVzaW5nIHRoZSAnJHthcGlLZXlQYXJhbWV0ZXJOYW1lfScgcGFyYW1ldGVyLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LmBcbiAgICB9KTtcbiAgfVxuICBhcGlLZXkgPSBwcm9jZXNzLmVudltlbnZpcm9ubWVudFZhcmlhYmxlTmFtZV07XG4gIGlmIChhcGlLZXkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBMb2FkQVBJS2V5RXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYCR7ZGVzY3JpcHRpb259IEFQSSBrZXkgaXMgbWlzc2luZy4gUGFzcyBpdCB1c2luZyB0aGUgJyR7YXBpS2V5UGFyYW1ldGVyTmFtZX0nIHBhcmFtZXRlciBvciB0aGUgJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX0gZW52aXJvbm1lbnQgdmFyaWFibGUuYFxuICAgIH0pO1xuICB9XG4gIGlmICh0eXBlb2YgYXBpS2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IExvYWRBUElLZXlFcnJvcih7XG4gICAgICBtZXNzYWdlOiBgJHtkZXNjcmlwdGlvbn0gQVBJIGtleSBtdXN0IGJlIGEgc3RyaW5nLiBUaGUgdmFsdWUgb2YgdGhlICR7ZW52aXJvbm1lbnRWYXJpYWJsZU5hbWV9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBhIHN0cmluZy5gXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFwaUtleTtcbn1cblxuLy8gc3JjL2xvYWQtb3B0aW9uYWwtc2V0dGluZy50c1xuZnVuY3Rpb24gbG9hZE9wdGlvbmFsU2V0dGluZyh7XG4gIHNldHRpbmdWYWx1ZSxcbiAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWVcbn0pIHtcbiAgaWYgKHR5cGVvZiBzZXR0aW5nVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc2V0dGluZ1ZhbHVlO1xuICB9XG4gIGlmIChzZXR0aW5nVmFsdWUgIT0gbnVsbCB8fCB0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgc2V0dGluZ1ZhbHVlID0gcHJvY2Vzcy5lbnZbZW52aXJvbm1lbnRWYXJpYWJsZU5hbWVdO1xuICBpZiAoc2V0dGluZ1ZhbHVlID09IG51bGwgfHwgdHlwZW9mIHNldHRpbmdWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIHNldHRpbmdWYWx1ZTtcbn1cblxuLy8gc3JjL2xvYWQtc2V0dGluZy50c1xuaW1wb3J0IHsgTG9hZFNldHRpbmdFcnJvciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5mdW5jdGlvbiBsb2FkU2V0dGluZyh7XG4gIHNldHRpbmdWYWx1ZSxcbiAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUsXG4gIHNldHRpbmdOYW1lLFxuICBkZXNjcmlwdGlvblxufSkge1xuICBpZiAodHlwZW9mIHNldHRpbmdWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBzZXR0aW5nVmFsdWU7XG4gIH1cbiAgaWYgKHNldHRpbmdWYWx1ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IExvYWRTZXR0aW5nRXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYCR7ZGVzY3JpcHRpb259IHNldHRpbmcgbXVzdCBiZSBhIHN0cmluZy5gXG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdGhyb3cgbmV3IExvYWRTZXR0aW5nRXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYCR7ZGVzY3JpcHRpb259IHNldHRpbmcgaXMgbWlzc2luZy4gUGFzcyBpdCB1c2luZyB0aGUgJyR7c2V0dGluZ05hbWV9JyBwYXJhbWV0ZXIuIEVudmlyb25tZW50IHZhcmlhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuYFxuICAgIH0pO1xuICB9XG4gIHNldHRpbmdWYWx1ZSA9IHByb2Nlc3MuZW52W2Vudmlyb25tZW50VmFyaWFibGVOYW1lXTtcbiAgaWYgKHNldHRpbmdWYWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IExvYWRTZXR0aW5nRXJyb3Ioe1xuICAgICAgbWVzc2FnZTogYCR7ZGVzY3JpcHRpb259IHNldHRpbmcgaXMgbWlzc2luZy4gUGFzcyBpdCB1c2luZyB0aGUgJyR7c2V0dGluZ05hbWV9JyBwYXJhbWV0ZXIgb3IgdGhlICR7ZW52aXJvbm1lbnRWYXJpYWJsZU5hbWV9IGVudmlyb25tZW50IHZhcmlhYmxlLmBcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIHNldHRpbmdWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBMb2FkU2V0dGluZ0Vycm9yKHtcbiAgICAgIG1lc3NhZ2U6IGAke2Rlc2NyaXB0aW9ufSBzZXR0aW5nIG11c3QgYmUgYSBzdHJpbmcuIFRoZSB2YWx1ZSBvZiB0aGUgJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGEgc3RyaW5nLmBcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc2V0dGluZ1ZhbHVlO1xufVxuXG4vLyBzcmMvbWVkaWEtdHlwZS10by1leHRlbnNpb24udHNcbmZ1bmN0aW9uIG1lZGlhVHlwZVRvRXh0ZW5zaW9uKG1lZGlhVHlwZSkge1xuICB2YXIgX2EyO1xuICBjb25zdCBbX3R5cGUsIHN1YnR5cGUgPSBcIlwiXSA9IG1lZGlhVHlwZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiL1wiKTtcbiAgcmV0dXJuIChfYTIgPSB7XG4gICAgbXBlZzogXCJtcDNcIixcbiAgICBcIngtd2F2XCI6IFwid2F2XCIsXG4gICAgb3B1czogXCJvZ2dcIixcbiAgICBtcDQ6IFwibTRhXCIsXG4gICAgXCJ4LW00YVwiOiBcIm00YVwiXG4gIH1bc3VidHlwZV0pICE9IG51bGwgPyBfYTIgOiBzdWJ0eXBlO1xufVxuXG4vLyBzcmMvcGFyc2UtanNvbi50c1xuaW1wb3J0IHtcbiAgSlNPTlBhcnNlRXJyb3IsXG4gIFR5cGVWYWxpZGF0aW9uRXJyb3IgYXMgVHlwZVZhbGlkYXRpb25FcnJvcjNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcblxuLy8gc3JjL3NlY3VyZS1qc29uLXBhcnNlLnRzXG52YXIgc3VzcGVjdFByb3RvUnggPSAvXCIoPzpffFxcXFx1MDA1W0ZmXSkoPzpffFxcXFx1MDA1W0ZmXSkoPzpwfFxcXFx1MDA3MCkoPzpyfFxcXFx1MDA3MikoPzpvfFxcXFx1MDA2W0ZmXSkoPzp0fFxcXFx1MDA3NCkoPzpvfFxcXFx1MDA2W0ZmXSkoPzpffFxcXFx1MDA1W0ZmXSkoPzpffFxcXFx1MDA1W0ZmXSlcIlxccyo6LztcbnZhciBzdXNwZWN0Q29uc3RydWN0b3JSeCA9IC9cIig/OmN8XFxcXHUwMDYzKSg/Om98XFxcXHUwMDZbRmZdKSg/Om58XFxcXHUwMDZbRWVdKSg/OnN8XFxcXHUwMDczKSg/OnR8XFxcXHUwMDc0KSg/OnJ8XFxcXHUwMDcyKSg/OnV8XFxcXHUwMDc1KSg/OmN8XFxcXHUwMDYzKSg/OnR8XFxcXHUwMDc0KSg/Om98XFxcXHUwMDZbRmZdKSg/OnJ8XFxcXHUwMDcyKVwiXFxzKjovO1xuZnVuY3Rpb24gX3BhcnNlKHRleHQpIHtcbiAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoc3VzcGVjdFByb3RvUngudGVzdCh0ZXh0KSA9PT0gZmFsc2UgJiYgc3VzcGVjdENvbnN0cnVjdG9yUngudGVzdCh0ZXh0KSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIHJldHVybiBmaWx0ZXIob2JqKTtcbn1cbmZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgbGV0IG5leHQgPSBbb2JqXTtcbiAgd2hpbGUgKG5leHQubGVuZ3RoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSBuZXh0O1xuICAgIG5leHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgXCJfX3Byb3RvX19cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiT2JqZWN0IGNvbnRhaW5zIGZvcmJpZGRlbiBwcm90b3R5cGUgcHJvcGVydHlcIik7XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIFwiY29uc3RydWN0b3JcIikgJiYgbm9kZS5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZS5jb25zdHJ1Y3RvciA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZS5jb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiT2JqZWN0IGNvbnRhaW5zIGZvcmJpZGRlbiBwcm90b3R5cGUgcHJvcGVydHlcIik7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBub2RlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgbmV4dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gc2VjdXJlSnNvblBhcnNlKHRleHQpIHtcbiAgY29uc3QgeyBzdGFja1RyYWNlTGltaXQgfSA9IEVycm9yO1xuICB0cnkge1xuICAgIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IDA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gX3BhcnNlKHRleHQpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIF9wYXJzZSh0ZXh0KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSBzdGFja1RyYWNlTGltaXQ7XG4gIH1cbn1cblxuLy8gc3JjL3ZhbGlkYXRlLXR5cGVzLnRzXG5pbXBvcnQgeyBUeXBlVmFsaWRhdGlvbkVycm9yIGFzIFR5cGVWYWxpZGF0aW9uRXJyb3IyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcblxuLy8gc3JjL3NjaGVtYS50c1xuaW1wb3J0IHsgVHlwZVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQgKiBhcyB6NCBmcm9tIFwiem9kL3Y0XCI7XG5cbi8vIHNyYy9hZGQtYWRkaXRpb25hbC1wcm9wZXJ0aWVzLXRvLWpzb24tc2NoZW1hLnRzXG5mdW5jdGlvbiBhZGRBZGRpdGlvbmFsUHJvcGVydGllc1RvSnNvblNjaGVtYShqc29uU2NoZW1hMikge1xuICBpZiAoanNvblNjaGVtYTIudHlwZSA9PT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGpzb25TY2hlbWEyLnR5cGUpICYmIGpzb25TY2hlbWEyLnR5cGUuaW5jbHVkZXMoXCJvYmplY3RcIikpIHtcbiAgICBqc29uU2NoZW1hMi5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcHJvcGVydGllcyB9ID0ganNvblNjaGVtYTI7XG4gICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcGVydGllcykpIHtcbiAgICAgICAgcHJvcGVydGllc1trZXldID0gdmlzaXQocHJvcGVydGllc1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGpzb25TY2hlbWEyLml0ZW1zICE9IG51bGwpIHtcbiAgICBqc29uU2NoZW1hMi5pdGVtcyA9IEFycmF5LmlzQXJyYXkoanNvblNjaGVtYTIuaXRlbXMpID8ganNvblNjaGVtYTIuaXRlbXMubWFwKHZpc2l0KSA6IHZpc2l0KGpzb25TY2hlbWEyLml0ZW1zKTtcbiAgfVxuICBpZiAoanNvblNjaGVtYTIuYW55T2YgIT0gbnVsbCkge1xuICAgIGpzb25TY2hlbWEyLmFueU9mID0ganNvblNjaGVtYTIuYW55T2YubWFwKHZpc2l0KTtcbiAgfVxuICBpZiAoanNvblNjaGVtYTIuYWxsT2YgIT0gbnVsbCkge1xuICAgIGpzb25TY2hlbWEyLmFsbE9mID0ganNvblNjaGVtYTIuYWxsT2YubWFwKHZpc2l0KTtcbiAgfVxuICBpZiAoanNvblNjaGVtYTIub25lT2YgIT0gbnVsbCkge1xuICAgIGpzb25TY2hlbWEyLm9uZU9mID0ganNvblNjaGVtYTIub25lT2YubWFwKHZpc2l0KTtcbiAgfVxuICBjb25zdCB7IGRlZmluaXRpb25zIH0gPSBqc29uU2NoZW1hMjtcbiAgaWYgKGRlZmluaXRpb25zICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykpIHtcbiAgICAgIGRlZmluaXRpb25zW2tleV0gPSB2aXNpdChkZWZpbml0aW9uc1trZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGpzb25TY2hlbWEyO1xufVxuZnVuY3Rpb24gdmlzaXQoZGVmKSB7XG4gIGlmICh0eXBlb2YgZGVmID09PSBcImJvb2xlYW5cIikgcmV0dXJuIGRlZjtcbiAgcmV0dXJuIGFkZEFkZGl0aW9uYWxQcm9wZXJ0aWVzVG9Kc29uU2NoZW1hKGRlZik7XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL29wdGlvbnMudHNcbnZhciBpZ25vcmVPdmVycmlkZSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXG4gIFwiTGV0IHpvZFRvSnNvblNjaGVtYSBkZWNpZGUgb24gd2hpY2ggcGFyc2VyIHRvIHVzZVwiXG4pO1xudmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICBuYW1lOiB2b2lkIDAsXG4gICRyZWZTdHJhdGVneTogXCJyb290XCIsXG4gIGJhc2VQYXRoOiBbXCIjXCJdLFxuICBlZmZlY3RTdHJhdGVneTogXCJpbnB1dFwiLFxuICBwaXBlU3RyYXRlZ3k6IFwiYWxsXCIsXG4gIGRhdGVTdHJhdGVneTogXCJmb3JtYXQ6ZGF0ZS10aW1lXCIsXG4gIG1hcFN0cmF0ZWd5OiBcImVudHJpZXNcIixcbiAgcmVtb3ZlQWRkaXRpb25hbFN0cmF0ZWd5OiBcInBhc3N0aHJvdWdoXCIsXG4gIGFsbG93ZWRBZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgcmVqZWN0ZWRBZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gIGRlZmluaXRpb25QYXRoOiBcImRlZmluaXRpb25zXCIsXG4gIHN0cmljdFVuaW9uczogZmFsc2UsXG4gIGRlZmluaXRpb25zOiB7fSxcbiAgZXJyb3JNZXNzYWdlczogZmFsc2UsXG4gIHBhdHRlcm5TdHJhdGVneTogXCJlc2NhcGVcIixcbiAgYXBwbHlSZWdleEZsYWdzOiBmYWxzZSxcbiAgZW1haWxTdHJhdGVneTogXCJmb3JtYXQ6ZW1haWxcIixcbiAgYmFzZTY0U3RyYXRlZ3k6IFwiY29udGVudEVuY29kaW5nOmJhc2U2NFwiLFxuICBuYW1lU3RyYXRlZ3k6IFwicmVmXCJcbn07XG52YXIgZ2V0RGVmYXVsdE9wdGlvbnMgPSAob3B0aW9ucykgPT4gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyB7XG4gIC4uLmRlZmF1bHRPcHRpb25zLFxuICBuYW1lOiBvcHRpb25zXG59IDoge1xuICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgLi4ub3B0aW9uc1xufTtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvc2VsZWN0LXBhcnNlci50c1xuaW1wb3J0IHsgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kIGFzIFpvZEZpcnN0UGFydHlUeXBlS2luZDMgfSBmcm9tIFwiem9kL3YzXCI7XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvYW55LnRzXG5mdW5jdGlvbiBwYXJzZUFueURlZigpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL2FycmF5LnRzXG5pbXBvcnQgeyBab2RGaXJzdFBhcnR5VHlwZUtpbmQgfSBmcm9tIFwiem9kL3YzXCI7XG5mdW5jdGlvbiBwYXJzZUFycmF5RGVmKGRlZiwgcmVmcykge1xuICB2YXIgX2EyLCBfYjIsIF9jO1xuICBjb25zdCByZXMgPSB7XG4gICAgdHlwZTogXCJhcnJheVwiXG4gIH07XG4gIGlmICgoKF9hMiA9IGRlZi50eXBlKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLl9kZWYpICYmICgoX2MgPSAoX2IyID0gZGVmLnR5cGUpID09IG51bGwgPyB2b2lkIDAgOiBfYjIuX2RlZikgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLnR5cGVOYW1lKSAhPT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFueSkge1xuICAgIHJlcy5pdGVtcyA9IHBhcnNlRGVmKGRlZi50eXBlLl9kZWYsIHtcbiAgICAgIC4uLnJlZnMsXG4gICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiaXRlbXNcIl1cbiAgICB9KTtcbiAgfVxuICBpZiAoZGVmLm1pbkxlbmd0aCkge1xuICAgIHJlcy5taW5JdGVtcyA9IGRlZi5taW5MZW5ndGgudmFsdWU7XG4gIH1cbiAgaWYgKGRlZi5tYXhMZW5ndGgpIHtcbiAgICByZXMubWF4SXRlbXMgPSBkZWYubWF4TGVuZ3RoLnZhbHVlO1xuICB9XG4gIGlmIChkZWYuZXhhY3RMZW5ndGgpIHtcbiAgICByZXMubWluSXRlbXMgPSBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgcmVzLm1heEl0ZW1zID0gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvYmlnaW50LnRzXG5mdW5jdGlvbiBwYXJzZUJpZ2ludERlZihkZWYpIHtcbiAgY29uc3QgcmVzID0ge1xuICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgIGZvcm1hdDogXCJpbnQ2NFwiXG4gIH07XG4gIGlmICghZGVmLmNoZWNrcykgcmV0dXJuIHJlcztcbiAgZm9yIChjb25zdCBjaGVjayBvZiBkZWYuY2hlY2tzKSB7XG4gICAgc3dpdGNoIChjaGVjay5raW5kKSB7XG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGlmIChjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICByZXMubWluaW11bSA9IGNoZWNrLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5leGNsdXNpdmVNaW5pbXVtID0gY2hlY2sudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGlmIChjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICByZXMubWF4aW11bSA9IGNoZWNrLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5leGNsdXNpdmVNYXhpbXVtID0gY2hlY2sudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICByZXMubXVsdGlwbGVPZiA9IGNoZWNrLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9ib29sZWFuLnRzXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW5EZWYoKSB7XG4gIHJldHVybiB7IHR5cGU6IFwiYm9vbGVhblwiIH07XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvYnJhbmRlZC50c1xuZnVuY3Rpb24gcGFyc2VCcmFuZGVkRGVmKF9kZWYsIHJlZnMpIHtcbiAgcmV0dXJuIHBhcnNlRGVmKF9kZWYudHlwZS5fZGVmLCByZWZzKTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9jYXRjaC50c1xudmFyIHBhcnNlQ2F0Y2hEZWYgPSAoZGVmLCByZWZzKSA9PiB7XG4gIHJldHVybiBwYXJzZURlZihkZWYuaW5uZXJUeXBlLl9kZWYsIHJlZnMpO1xufTtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9kYXRlLnRzXG5mdW5jdGlvbiBwYXJzZURhdGVEZWYoZGVmLCByZWZzLCBvdmVycmlkZURhdGVTdHJhdGVneSkge1xuICBjb25zdCBzdHJhdGVneSA9IG92ZXJyaWRlRGF0ZVN0cmF0ZWd5ICE9IG51bGwgPyBvdmVycmlkZURhdGVTdHJhdGVneSA6IHJlZnMuZGF0ZVN0cmF0ZWd5O1xuICBpZiAoQXJyYXkuaXNBcnJheShzdHJhdGVneSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW55T2Y6IHN0cmF0ZWd5Lm1hcCgoaXRlbSwgaSkgPT4gcGFyc2VEYXRlRGVmKGRlZiwgcmVmcywgaXRlbSkpXG4gICAgfTtcbiAgfVxuICBzd2l0Y2ggKHN0cmF0ZWd5KSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJmb3JtYXQ6ZGF0ZS10aW1lXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZS10aW1lXCJcbiAgICAgIH07XG4gICAgY2FzZSBcImZvcm1hdDpkYXRlXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZVwiXG4gICAgICB9O1xuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gaW50ZWdlckRhdGVQYXJzZXIoZGVmKTtcbiAgfVxufVxudmFyIGludGVnZXJEYXRlUGFyc2VyID0gKGRlZikgPT4ge1xuICBjb25zdCByZXMgPSB7XG4gICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgZm9ybWF0OiBcInVuaXgtdGltZVwiXG4gIH07XG4gIGZvciAoY29uc3QgY2hlY2sgb2YgZGVmLmNoZWNrcykge1xuICAgIHN3aXRjaCAoY2hlY2sua2luZCkge1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICByZXMubWluaW11bSA9IGNoZWNrLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgcmVzLm1heGltdW0gPSBjaGVjay52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL2RlZmF1bHQudHNcbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdERlZihfZGVmLCByZWZzKSB7XG4gIHJldHVybiB7XG4gICAgLi4ucGFyc2VEZWYoX2RlZi5pbm5lclR5cGUuX2RlZiwgcmVmcyksXG4gICAgZGVmYXVsdDogX2RlZi5kZWZhdWx0VmFsdWUoKVxuICB9O1xufVxuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL2VmZmVjdHMudHNcbmZ1bmN0aW9uIHBhcnNlRWZmZWN0c0RlZihfZGVmLCByZWZzKSB7XG4gIHJldHVybiByZWZzLmVmZmVjdFN0cmF0ZWd5ID09PSBcImlucHV0XCIgPyBwYXJzZURlZihfZGVmLnNjaGVtYS5fZGVmLCByZWZzKSA6IHBhcnNlQW55RGVmKCk7XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvZW51bS50c1xuZnVuY3Rpb24gcGFyc2VFbnVtRGVmKGRlZikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZW51bTogQXJyYXkuZnJvbShkZWYudmFsdWVzKVxuICB9O1xufVxuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL2ludGVyc2VjdGlvbi50c1xudmFyIGlzSnNvblNjaGVtYTdBbGxPZlR5cGUgPSAodHlwZSkgPT4ge1xuICBpZiAoXCJ0eXBlXCIgaW4gdHlwZSAmJiB0eXBlLnR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFwiYWxsT2ZcIiBpbiB0eXBlO1xufTtcbmZ1bmN0aW9uIHBhcnNlSW50ZXJzZWN0aW9uRGVmKGRlZiwgcmVmcykge1xuICBjb25zdCBhbGxPZiA9IFtcbiAgICBwYXJzZURlZihkZWYubGVmdC5fZGVmLCB7XG4gICAgICAuLi5yZWZzLFxuICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcImFsbE9mXCIsIFwiMFwiXVxuICAgIH0pLFxuICAgIHBhcnNlRGVmKGRlZi5yaWdodC5fZGVmLCB7XG4gICAgICAuLi5yZWZzLFxuICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcImFsbE9mXCIsIFwiMVwiXVxuICAgIH0pXG4gIF0uZmlsdGVyKCh4KSA9PiAhIXgpO1xuICBjb25zdCBtZXJnZWRBbGxPZiA9IFtdO1xuICBhbGxPZi5mb3JFYWNoKChzY2hlbWEpID0+IHtcbiAgICBpZiAoaXNKc29uU2NoZW1hN0FsbE9mVHlwZShzY2hlbWEpKSB7XG4gICAgICBtZXJnZWRBbGxPZi5wdXNoKC4uLnNjaGVtYS5hbGxPZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXN0ZWRTY2hlbWEgPSBzY2hlbWE7XG4gICAgICBpZiAoXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiIGluIHNjaGVtYSAmJiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHsgYWRkaXRpb25hbFByb3BlcnRpZXMsIC4uLnJlc3QgfSA9IHNjaGVtYTtcbiAgICAgICAgbmVzdGVkU2NoZW1hID0gcmVzdDtcbiAgICAgIH1cbiAgICAgIG1lcmdlZEFsbE9mLnB1c2gobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbWVyZ2VkQWxsT2YubGVuZ3RoID8geyBhbGxPZjogbWVyZ2VkQWxsT2YgfSA6IHZvaWQgMDtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9saXRlcmFsLnRzXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWxEZWYoZGVmKSB7XG4gIGNvbnN0IHBhcnNlZFR5cGUgPSB0eXBlb2YgZGVmLnZhbHVlO1xuICBpZiAocGFyc2VkVHlwZSAhPT0gXCJiaWdpbnRcIiAmJiBwYXJzZWRUeXBlICE9PSBcIm51bWJlclwiICYmIHBhcnNlZFR5cGUgIT09IFwiYm9vbGVhblwiICYmIHBhcnNlZFR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogQXJyYXkuaXNBcnJheShkZWYudmFsdWUpID8gXCJhcnJheVwiIDogXCJvYmplY3RcIlxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBwYXJzZWRUeXBlID09PSBcImJpZ2ludFwiID8gXCJpbnRlZ2VyXCIgOiBwYXJzZWRUeXBlLFxuICAgIGNvbnN0OiBkZWYudmFsdWVcbiAgfTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9yZWNvcmQudHNcbmltcG9ydCB7XG4gIFpvZEZpcnN0UGFydHlUeXBlS2luZCBhcyBab2RGaXJzdFBhcnR5VHlwZUtpbmQyXG59IGZyb20gXCJ6b2QvdjNcIjtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9zdHJpbmcudHNcbnZhciBlbW9qaVJlZ2V4ID0gdm9pZCAwO1xudmFyIHpvZFBhdHRlcm5zID0ge1xuICAvKipcbiAgICogYGNgIHdhcyBjaGFuZ2VkIHRvIGBbY0NdYCB0byByZXBsaWNhdGUgL2kgZmxhZ1xuICAgKi9cbiAgY3VpZDogL15bY0NdW15cXHMtXXs4LH0kLyxcbiAgY3VpZDI6IC9eWzAtOWEtel0rJC8sXG4gIHVsaWQ6IC9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvLFxuICAvKipcbiAgICogYGEtemAgd2FzIGFkZGVkIHRvIHJlcGxpY2F0ZSAvaSBmbGFnXG4gICAqL1xuICBlbWFpbDogL14oPyFcXC4pKD8hLipcXC5cXC4pKFthLXpBLVowLTlfJytcXC1cXC5dKilbYS16QS1aMC05XystXUAoW2EtekEtWjAtOV1bYS16QS1aMC05XFwtXSpcXC4pK1thLXpBLVpdezIsfSQvLFxuICAvKipcbiAgICogQ29uc3RydWN0ZWQgYSB2YWxpZCBVbmljb2RlIFJlZ0V4cFxuICAgKlxuICAgKiBMYXppbHkgaW5zdGFudGlhdGUgc2luY2UgdGhpcyB0eXBlIG9mIHJlZ2V4IGlzbid0IHN1cHBvcnRlZFxuICAgKiBpbiBhbGwgZW52cyAoZS5nLiBSZWFjdCBOYXRpdmUpLlxuICAgKlxuICAgKiBTZWU6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmhhY2tzL3pvZC9pc3N1ZXMvMjQzM1xuICAgKiBGaXggaW4gWm9kOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vY29saW5oYWNrcy96b2QvY29tbWl0LzkzNDBmZDUxZTQ4NTc2YTc1YWRjOTE5YmZmNjVkYmM0YTVkNGM5OWJcbiAgICovXG4gIGVtb2ppOiAoKSA9PiB7XG4gICAgaWYgKGVtb2ppUmVnZXggPT09IHZvaWQgMCkge1xuICAgICAgZW1vamlSZWdleCA9IFJlZ0V4cChcbiAgICAgICAgXCJeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJFwiLFxuICAgICAgICBcInVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVtb2ppUmVnZXg7XG4gIH0sXG4gIC8qKlxuICAgKiBVbnVzZWRcbiAgICovXG4gIHV1aWQ6IC9eWzAtOWEtZkEtRl17OH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17MTJ9JC8sXG4gIC8qKlxuICAgKiBVbnVzZWRcbiAgICovXG4gIGlwdjQ6IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC8sXG4gIGlwdjRDaWRyOiAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLygzWzAtMl18WzEyXT9bMC05XSkkLyxcbiAgLyoqXG4gICAqIFVudXNlZFxuICAgKi9cbiAgaXB2NjogL14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC8sXG4gIGlwdjZDaWRyOiAvXigoWzAtOWEtZkEtRl17MSw0fTopezcsN31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdezAsNH0pezAsNH0lWzAtOWEtekEtWl17MSx9fDo6KGZmZmYoOjB7MSw0fSl7MCwxfTopezAsMX0oKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKSlcXC8oMTJbMC04XXwxWzAxXVswLTldfFsxLTldP1swLTldKSQvLFxuICBiYXNlNjQ6IC9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLyxcbiAgYmFzZTY0dXJsOiAvXihbMC05YS16QS1aLV9dezR9KSooKFswLTlhLXpBLVotX117Mn0oPT0pPyl8KFswLTlhLXpBLVotX117M30oPSk/KSk/JC8sXG4gIG5hbm9pZDogL15bYS16QS1aMC05Xy1dezIxfSQvLFxuICBqd3Q6IC9eW0EtWmEtejAtOS1fXStcXC5bQS1aYS16MC05LV9dK1xcLltBLVphLXowLTktX10qJC9cbn07XG5mdW5jdGlvbiBwYXJzZVN0cmluZ0RlZihkZWYsIHJlZnMpIHtcbiAgY29uc3QgcmVzID0ge1xuICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgfTtcbiAgaWYgKGRlZi5jaGVja3MpIHtcbiAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIGRlZi5jaGVja3MpIHtcbiAgICAgIHN3aXRjaCAoY2hlY2sua2luZCkge1xuICAgICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgICAgcmVzLm1pbkxlbmd0aCA9IHR5cGVvZiByZXMubWluTGVuZ3RoID09PSBcIm51bWJlclwiID8gTWF0aC5tYXgocmVzLm1pbkxlbmd0aCwgY2hlY2sudmFsdWUpIDogY2hlY2sudmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgICByZXMubWF4TGVuZ3RoID0gdHlwZW9mIHJlcy5tYXhMZW5ndGggPT09IFwibnVtYmVyXCIgPyBNYXRoLm1pbihyZXMubWF4TGVuZ3RoLCBjaGVjay52YWx1ZSkgOiBjaGVjay52YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgc3dpdGNoIChyZWZzLmVtYWlsU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtYXQ6ZW1haWxcIjpcbiAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJlbWFpbFwiLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9ybWF0Omlkbi1lbWFpbFwiOlxuICAgICAgICAgICAgICBhZGRGb3JtYXQocmVzLCBcImlkbi1lbWFpbFwiLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicGF0dGVybjp6b2RcIjpcbiAgICAgICAgICAgICAgYWRkUGF0dGVybihyZXMsIHpvZFBhdHRlcm5zLmVtYWlsLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJ1cmlcIiwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJ1dWlkXCIsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmVnZXhcIjpcbiAgICAgICAgICBhZGRQYXR0ZXJuKHJlcywgY2hlY2sucmVnZXgsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY3VpZFwiOlxuICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5jdWlkLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImN1aWQyXCI6XG4gICAgICAgICAgYWRkUGF0dGVybihyZXMsIHpvZFBhdHRlcm5zLmN1aWQyLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN0YXJ0c1dpdGhcIjpcbiAgICAgICAgICBhZGRQYXR0ZXJuKFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgUmVnRXhwKGBeJHtlc2NhcGVMaXRlcmFsQ2hlY2tWYWx1ZShjaGVjay52YWx1ZSwgcmVmcyl9YCksXG4gICAgICAgICAgICBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgcmVmc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRzV2l0aFwiOlxuICAgICAgICAgIGFkZFBhdHRlcm4oXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBSZWdFeHAoYCR7ZXNjYXBlTGl0ZXJhbENoZWNrVmFsdWUoY2hlY2sudmFsdWUsIHJlZnMpfSRgKSxcbiAgICAgICAgICAgIGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICByZWZzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJkYXRlLXRpbWVcIiwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJkYXRlXCIsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGltZVwiOlxuICAgICAgICAgIGFkZEZvcm1hdChyZXMsIFwidGltZVwiLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImR1cmF0aW9uXCI6XG4gICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJkdXJhdGlvblwiLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgICAgIHJlcy5taW5MZW5ndGggPSB0eXBlb2YgcmVzLm1pbkxlbmd0aCA9PT0gXCJudW1iZXJcIiA/IE1hdGgubWF4KHJlcy5taW5MZW5ndGgsIGNoZWNrLnZhbHVlKSA6IGNoZWNrLnZhbHVlO1xuICAgICAgICAgIHJlcy5tYXhMZW5ndGggPSB0eXBlb2YgcmVzLm1heExlbmd0aCA9PT0gXCJudW1iZXJcIiA/IE1hdGgubWluKHJlcy5tYXhMZW5ndGgsIGNoZWNrLnZhbHVlKSA6IGNoZWNrLnZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jbHVkZXNcIjoge1xuICAgICAgICAgIGFkZFBhdHRlcm4oXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBSZWdFeHAoZXNjYXBlTGl0ZXJhbENoZWNrVmFsdWUoY2hlY2sudmFsdWUsIHJlZnMpKSxcbiAgICAgICAgICAgIGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICByZWZzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiaXBcIjoge1xuICAgICAgICAgIGlmIChjaGVjay52ZXJzaW9uICE9PSBcInY2XCIpIHtcbiAgICAgICAgICAgIGFkZEZvcm1hdChyZXMsIFwiaXB2NFwiLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrLnZlcnNpb24gIT09IFwidjRcIikge1xuICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJpcHY2XCIsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYmFzZTY0dXJsXCI6XG4gICAgICAgICAgYWRkUGF0dGVybihyZXMsIHpvZFBhdHRlcm5zLmJhc2U2NHVybCwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJqd3RcIjpcbiAgICAgICAgICBhZGRQYXR0ZXJuKHJlcywgem9kUGF0dGVybnMuand0LCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNpZHJcIjoge1xuICAgICAgICAgIGlmIChjaGVjay52ZXJzaW9uICE9PSBcInY2XCIpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5pcHY0Q2lkciwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGVjay52ZXJzaW9uICE9PSBcInY0XCIpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5pcHY2Q2lkciwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJlbW9qaVwiOlxuICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5lbW9qaSgpLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInVsaWRcIjoge1xuICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy51bGlkLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlZnMuYmFzZTY0U3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtYXQ6YmluYXJ5XCI6IHtcbiAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgXCJiaW5hcnlcIiwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRFbmNvZGluZzpiYXNlNjRcIjoge1xuICAgICAgICAgICAgICByZXMuY29udGVudEVuY29kaW5nID0gXCJiYXNlNjRcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicGF0dGVybjp6b2RcIjoge1xuICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHJlcywgem9kUGF0dGVybnMuYmFzZTY0LCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJuYW5vaWRcIjoge1xuICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5uYW5vaWQsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ0b0xvd2VyQ2FzZVwiOlxuICAgICAgICBjYXNlIFwidG9VcHBlckNhc2VcIjpcbiAgICAgICAgY2FzZSBcInRyaW1cIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvKiBAX19QVVJFX18gKi8gKChfKSA9PiB7XG4gICAgICAgICAgfSkoY2hlY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZXNjYXBlTGl0ZXJhbENoZWNrVmFsdWUobGl0ZXJhbCwgcmVmcykge1xuICByZXR1cm4gcmVmcy5wYXR0ZXJuU3RyYXRlZ3kgPT09IFwiZXNjYXBlXCIgPyBlc2NhcGVOb25BbHBoYU51bWVyaWMobGl0ZXJhbCkgOiBsaXRlcmFsO1xufVxudmFyIEFMUEhBX05VTUVSSUMgPSBuZXcgU2V0KFxuICBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2eHl6MDEyMzQ1Njc4OVwiXG4pO1xuZnVuY3Rpb24gZXNjYXBlTm9uQWxwaGFOdW1lcmljKHNvdXJjZSkge1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIUFMUEhBX05VTUVSSUMuaGFzKHNvdXJjZVtpXSkpIHtcbiAgICAgIHJlc3VsdCArPSBcIlxcXFxcIjtcbiAgICB9XG4gICAgcmVzdWx0ICs9IHNvdXJjZVtpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYWRkRm9ybWF0KHNjaGVtYSwgdmFsdWUsIG1lc3NhZ2UsIHJlZnMpIHtcbiAgdmFyIF9hMjtcbiAgaWYgKHNjaGVtYS5mb3JtYXQgfHwgKChfYTIgPSBzY2hlbWEuYW55T2YpID09IG51bGwgPyB2b2lkIDAgOiBfYTIuc29tZSgoeCkgPT4geC5mb3JtYXQpKSkge1xuICAgIGlmICghc2NoZW1hLmFueU9mKSB7XG4gICAgICBzY2hlbWEuYW55T2YgPSBbXTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5mb3JtYXQpIHtcbiAgICAgIHNjaGVtYS5hbnlPZi5wdXNoKHtcbiAgICAgICAgZm9ybWF0OiBzY2hlbWEuZm9ybWF0XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBzY2hlbWEuZm9ybWF0O1xuICAgIH1cbiAgICBzY2hlbWEuYW55T2YucHVzaCh7XG4gICAgICBmb3JtYXQ6IHZhbHVlLFxuICAgICAgLi4ubWVzc2FnZSAmJiByZWZzLmVycm9yTWVzc2FnZXMgJiYgeyBlcnJvck1lc3NhZ2U6IHsgZm9ybWF0OiBtZXNzYWdlIH0gfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNjaGVtYS5mb3JtYXQgPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gYWRkUGF0dGVybihzY2hlbWEsIHJlZ2V4LCBtZXNzYWdlLCByZWZzKSB7XG4gIHZhciBfYTI7XG4gIGlmIChzY2hlbWEucGF0dGVybiB8fCAoKF9hMiA9IHNjaGVtYS5hbGxPZikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5zb21lKCh4KSA9PiB4LnBhdHRlcm4pKSkge1xuICAgIGlmICghc2NoZW1hLmFsbE9mKSB7XG4gICAgICBzY2hlbWEuYWxsT2YgPSBbXTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5wYXR0ZXJuKSB7XG4gICAgICBzY2hlbWEuYWxsT2YucHVzaCh7XG4gICAgICAgIHBhdHRlcm46IHNjaGVtYS5wYXR0ZXJuXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBzY2hlbWEucGF0dGVybjtcbiAgICB9XG4gICAgc2NoZW1hLmFsbE9mLnB1c2goe1xuICAgICAgcGF0dGVybjogc3RyaW5naWZ5UmVnRXhwV2l0aEZsYWdzKHJlZ2V4LCByZWZzKSxcbiAgICAgIC4uLm1lc3NhZ2UgJiYgcmVmcy5lcnJvck1lc3NhZ2VzICYmIHsgZXJyb3JNZXNzYWdlOiB7IHBhdHRlcm46IG1lc3NhZ2UgfSB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2NoZW1hLnBhdHRlcm4gPSBzdHJpbmdpZnlSZWdFeHBXaXRoRmxhZ3MocmVnZXgsIHJlZnMpO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlSZWdFeHBXaXRoRmxhZ3MocmVnZXgsIHJlZnMpIHtcbiAgdmFyIF9hMjtcbiAgaWYgKCFyZWZzLmFwcGx5UmVnZXhGbGFncyB8fCAhcmVnZXguZmxhZ3MpIHtcbiAgICByZXR1cm4gcmVnZXguc291cmNlO1xuICB9XG4gIGNvbnN0IGZsYWdzID0ge1xuICAgIGk6IHJlZ2V4LmZsYWdzLmluY2x1ZGVzKFwiaVwiKSxcbiAgICAvLyBDYXNlLWluc2Vuc2l0aXZlXG4gICAgbTogcmVnZXguZmxhZ3MuaW5jbHVkZXMoXCJtXCIpLFxuICAgIC8vIGBeYCBhbmQgYCRgIG1hdGNoZXMgYWRqYWNlbnQgdG8gbmV3bGluZSBjaGFyYWN0ZXJzXG4gICAgczogcmVnZXguZmxhZ3MuaW5jbHVkZXMoXCJzXCIpXG4gICAgLy8gYC5gIG1hdGNoZXMgbmV3bGluZXNcbiAgfTtcbiAgY29uc3Qgc291cmNlID0gZmxhZ3MuaSA/IHJlZ2V4LnNvdXJjZS50b0xvd2VyQ2FzZSgpIDogcmVnZXguc291cmNlO1xuICBsZXQgcGF0dGVybiA9IFwiXCI7XG4gIGxldCBpc0VzY2FwZWQgPSBmYWxzZTtcbiAgbGV0IGluQ2hhckdyb3VwID0gZmFsc2U7XG4gIGxldCBpbkNoYXJSYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpc0VzY2FwZWQpIHtcbiAgICAgIHBhdHRlcm4gKz0gc291cmNlW2ldO1xuICAgICAgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGZsYWdzLmkpIHtcbiAgICAgIGlmIChpbkNoYXJHcm91cCkge1xuICAgICAgICBpZiAoc291cmNlW2ldLm1hdGNoKC9bYS16XS8pKSB7XG4gICAgICAgICAgaWYgKGluQ2hhclJhbmdlKSB7XG4gICAgICAgICAgICBwYXR0ZXJuICs9IHNvdXJjZVtpXTtcbiAgICAgICAgICAgIHBhdHRlcm4gKz0gYCR7c291cmNlW2kgLSAyXX0tJHtzb3VyY2VbaV19YC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaW5DaGFyUmFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVtpICsgMV0gPT09IFwiLVwiICYmICgoX2EyID0gc291cmNlW2kgKyAyXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5tYXRjaCgvW2Etel0vKSkpIHtcbiAgICAgICAgICAgIHBhdHRlcm4gKz0gc291cmNlW2ldO1xuICAgICAgICAgICAgaW5DaGFyUmFuZ2UgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuICs9IGAke3NvdXJjZVtpXX0ke3NvdXJjZVtpXS50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZVtpXS5tYXRjaCgvW2Etel0vKSkge1xuICAgICAgICBwYXR0ZXJuICs9IGBbJHtzb3VyY2VbaV19JHtzb3VyY2VbaV0udG9VcHBlckNhc2UoKX1dYDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbGFncy5tKSB7XG4gICAgICBpZiAoc291cmNlW2ldID09PSBcIl5cIikge1xuICAgICAgICBwYXR0ZXJuICs9IGAoXnwoPzw9W1xcclxuXSkpYDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZVtpXSA9PT0gXCIkXCIpIHtcbiAgICAgICAgcGF0dGVybiArPSBgKCR8KD89W1xcclxuXSkpYDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbGFncy5zICYmIHNvdXJjZVtpXSA9PT0gXCIuXCIpIHtcbiAgICAgIHBhdHRlcm4gKz0gaW5DaGFyR3JvdXAgPyBgJHtzb3VyY2VbaV19XFxyXG5gIDogYFske3NvdXJjZVtpXX1cXHJcbl1gO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBhdHRlcm4gKz0gc291cmNlW2ldO1xuICAgIGlmIChzb3VyY2VbaV0gPT09IFwiXFxcXFwiKSB7XG4gICAgICBpc0VzY2FwZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaW5DaGFyR3JvdXAgJiYgc291cmNlW2ldID09PSBcIl1cIikge1xuICAgICAgaW5DaGFyR3JvdXAgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFpbkNoYXJHcm91cCAmJiBzb3VyY2VbaV0gPT09IFwiW1wiKSB7XG4gICAgICBpbkNoYXJHcm91cCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBDb3VsZCBub3QgY29udmVydCByZWdleCBwYXR0ZXJuIGF0ICR7cmVmcy5jdXJyZW50UGF0aC5qb2luKFxuICAgICAgICBcIi9cIlxuICAgICAgKX0gdG8gYSBmbGFnLWluZGVwZW5kZW50IGZvcm0hIEZhbGxpbmcgYmFjayB0byB0aGUgZmxhZy1pZ25vcmFudCBzb3VyY2VgXG4gICAgKTtcbiAgICByZXR1cm4gcmVnZXguc291cmNlO1xuICB9XG4gIHJldHVybiBwYXR0ZXJuO1xufVxuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL3JlY29yZC50c1xuZnVuY3Rpb24gcGFyc2VSZWNvcmREZWYoZGVmLCByZWZzKSB7XG4gIHZhciBfYTIsIF9iMiwgX2MsIF9kLCBfZSwgX2Y7XG4gIGNvbnN0IHNjaGVtYSA9IHtcbiAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiAoX2EyID0gcGFyc2VEZWYoZGVmLnZhbHVlVHlwZS5fZGVmLCB7XG4gICAgICAuLi5yZWZzLFxuICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG4gICAgfSkpICE9IG51bGwgPyBfYTIgOiByZWZzLmFsbG93ZWRBZGRpdGlvbmFsUHJvcGVydGllc1xuICB9O1xuICBpZiAoKChfYjIgPSBkZWYua2V5VHlwZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iMi5fZGVmLnR5cGVOYW1lKSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMi5ab2RTdHJpbmcgJiYgKChfYyA9IGRlZi5rZXlUeXBlLl9kZWYuY2hlY2tzKSA9PSBudWxsID8gdm9pZCAwIDogX2MubGVuZ3RoKSkge1xuICAgIGNvbnN0IHsgdHlwZSwgLi4ua2V5VHlwZSB9ID0gcGFyc2VTdHJpbmdEZWYoZGVmLmtleVR5cGUuX2RlZiwgcmVmcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNjaGVtYSxcbiAgICAgIHByb3BlcnR5TmFtZXM6IGtleVR5cGVcbiAgICB9O1xuICB9IGVsc2UgaWYgKCgoX2QgPSBkZWYua2V5VHlwZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kLl9kZWYudHlwZU5hbWUpID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQyLlpvZEVudW0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2NoZW1hLFxuICAgICAgcHJvcGVydHlOYW1lczoge1xuICAgICAgICBlbnVtOiBkZWYua2V5VHlwZS5fZGVmLnZhbHVlc1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSBpZiAoKChfZSA9IGRlZi5rZXlUeXBlKSA9PSBudWxsID8gdm9pZCAwIDogX2UuX2RlZi50eXBlTmFtZSkgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZDIuWm9kQnJhbmRlZCAmJiBkZWYua2V5VHlwZS5fZGVmLnR5cGUuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMi5ab2RTdHJpbmcgJiYgKChfZiA9IGRlZi5rZXlUeXBlLl9kZWYudHlwZS5fZGVmLmNoZWNrcykgPT0gbnVsbCA/IHZvaWQgMCA6IF9mLmxlbmd0aCkpIHtcbiAgICBjb25zdCB7IHR5cGUsIC4uLmtleVR5cGUgfSA9IHBhcnNlQnJhbmRlZERlZihcbiAgICAgIGRlZi5rZXlUeXBlLl9kZWYsXG4gICAgICByZWZzXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2NoZW1hLFxuICAgICAgcHJvcGVydHlOYW1lczoga2V5VHlwZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHNjaGVtYTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9tYXAudHNcbmZ1bmN0aW9uIHBhcnNlTWFwRGVmKGRlZiwgcmVmcykge1xuICBpZiAocmVmcy5tYXBTdHJhdGVneSA9PT0gXCJyZWNvcmRcIikge1xuICAgIHJldHVybiBwYXJzZVJlY29yZERlZihkZWYsIHJlZnMpO1xuICB9XG4gIGNvbnN0IGtleXMgPSBwYXJzZURlZihkZWYua2V5VHlwZS5fZGVmLCB7XG4gICAgLi4ucmVmcyxcbiAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiaXRlbXNcIiwgXCJpdGVtc1wiLCBcIjBcIl1cbiAgfSkgfHwgcGFyc2VBbnlEZWYoKTtcbiAgY29uc3QgdmFsdWVzID0gcGFyc2VEZWYoZGVmLnZhbHVlVHlwZS5fZGVmLCB7XG4gICAgLi4ucmVmcyxcbiAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiaXRlbXNcIiwgXCJpdGVtc1wiLCBcIjFcIl1cbiAgfSkgfHwgcGFyc2VBbnlEZWYoKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgbWF4SXRlbXM6IDEyNSxcbiAgICBpdGVtczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IFtrZXlzLCB2YWx1ZXNdLFxuICAgICAgbWluSXRlbXM6IDIsXG4gICAgICBtYXhJdGVtczogMlxuICAgIH1cbiAgfTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9uYXRpdmUtZW51bS50c1xuZnVuY3Rpb24gcGFyc2VOYXRpdmVFbnVtRGVmKGRlZikge1xuICBjb25zdCBvYmplY3QgPSBkZWYudmFsdWVzO1xuICBjb25zdCBhY3R1YWxLZXlzID0gT2JqZWN0LmtleXMoZGVmLnZhbHVlcykuZmlsdGVyKChrZXkpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdFtvYmplY3Rba2V5XV0gIT09IFwibnVtYmVyXCI7XG4gIH0pO1xuICBjb25zdCBhY3R1YWxWYWx1ZXMgPSBhY3R1YWxLZXlzLm1hcCgoa2V5KSA9PiBvYmplY3Rba2V5XSk7XG4gIGNvbnN0IHBhcnNlZFR5cGVzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KGFjdHVhbFZhbHVlcy5tYXAoKHZhbHVlcykgPT4gdHlwZW9mIHZhbHVlcykpXG4gICk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogcGFyc2VkVHlwZXMubGVuZ3RoID09PSAxID8gcGFyc2VkVHlwZXNbMF0gPT09IFwic3RyaW5nXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIiA6IFtcInN0cmluZ1wiLCBcIm51bWJlclwiXSxcbiAgICBlbnVtOiBhY3R1YWxWYWx1ZXNcbiAgfTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9uZXZlci50c1xuZnVuY3Rpb24gcGFyc2VOZXZlckRlZigpIHtcbiAgcmV0dXJuIHsgbm90OiBwYXJzZUFueURlZigpIH07XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvbnVsbC50c1xuZnVuY3Rpb24gcGFyc2VOdWxsRGVmKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwibnVsbFwiXG4gIH07XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvdW5pb24udHNcbnZhciBwcmltaXRpdmVNYXBwaW5ncyA9IHtcbiAgWm9kU3RyaW5nOiBcInN0cmluZ1wiLFxuICBab2ROdW1iZXI6IFwibnVtYmVyXCIsXG4gIFpvZEJpZ0ludDogXCJpbnRlZ2VyXCIsXG4gIFpvZEJvb2xlYW46IFwiYm9vbGVhblwiLFxuICBab2ROdWxsOiBcIm51bGxcIlxufTtcbmZ1bmN0aW9uIHBhcnNlVW5pb25EZWYoZGVmLCByZWZzKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBkZWYub3B0aW9ucyBpbnN0YW5jZW9mIE1hcCA/IEFycmF5LmZyb20oZGVmLm9wdGlvbnMudmFsdWVzKCkpIDogZGVmLm9wdGlvbnM7XG4gIGlmIChvcHRpb25zLmV2ZXJ5KFxuICAgICh4KSA9PiB4Ll9kZWYudHlwZU5hbWUgaW4gcHJpbWl0aXZlTWFwcGluZ3MgJiYgKCF4Ll9kZWYuY2hlY2tzIHx8ICF4Ll9kZWYuY2hlY2tzLmxlbmd0aClcbiAgKSkge1xuICAgIGNvbnN0IHR5cGVzID0gb3B0aW9ucy5yZWR1Y2UoKHR5cGVzMiwgeCkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IHByaW1pdGl2ZU1hcHBpbmdzW3guX2RlZi50eXBlTmFtZV07XG4gICAgICByZXR1cm4gdHlwZSAmJiAhdHlwZXMyLmluY2x1ZGVzKHR5cGUpID8gWy4uLnR5cGVzMiwgdHlwZV0gOiB0eXBlczI7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0eXBlcy5sZW5ndGggPiAxID8gdHlwZXMgOiB0eXBlc1swXVxuICAgIH07XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5ldmVyeSgoeCkgPT4geC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZExpdGVyYWxcIiAmJiAheC5kZXNjcmlwdGlvbikpIHtcbiAgICBjb25zdCB0eXBlcyA9IG9wdGlvbnMucmVkdWNlKFxuICAgICAgKGFjYywgeCkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHguX2RlZi52YWx1ZTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIFsuLi5hY2MsIHR5cGVdO1xuICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWNjLCBcImludGVnZXJcIl07XG4gICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKHguX2RlZi52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIFsuLi5hY2MsIFwibnVsbFwiXTtcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW11cbiAgICApO1xuICAgIGlmICh0eXBlcy5sZW5ndGggPT09IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1bmlxdWVUeXBlcyA9IHR5cGVzLmZpbHRlcigoeCwgaSwgYSkgPT4gYS5pbmRleE9mKHgpID09PSBpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHVuaXF1ZVR5cGVzLmxlbmd0aCA+IDEgPyB1bmlxdWVUeXBlcyA6IHVuaXF1ZVR5cGVzWzBdLFxuICAgICAgICBlbnVtOiBvcHRpb25zLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCB4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWNjLmluY2x1ZGVzKHguX2RlZi52YWx1ZSkgPyBhY2MgOiBbLi4uYWNjLCB4Ll9kZWYudmFsdWVdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW11cbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5ldmVyeSgoeCkgPT4geC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZEVudW1cIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IG9wdGlvbnMucmVkdWNlKFxuICAgICAgICAoYWNjLCB4KSA9PiBbXG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIC4uLnguX2RlZi52YWx1ZXMuZmlsdGVyKCh4MikgPT4gIWFjYy5pbmNsdWRlcyh4MikpXG4gICAgICAgIF0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgfTtcbiAgfVxuICByZXR1cm4gYXNBbnlPZihkZWYsIHJlZnMpO1xufVxudmFyIGFzQW55T2YgPSAoZGVmLCByZWZzKSA9PiB7XG4gIGNvbnN0IGFueU9mID0gKGRlZi5vcHRpb25zIGluc3RhbmNlb2YgTWFwID8gQXJyYXkuZnJvbShkZWYub3B0aW9ucy52YWx1ZXMoKSkgOiBkZWYub3B0aW9ucykubWFwKFxuICAgICh4LCBpKSA9PiBwYXJzZURlZih4Ll9kZWYsIHtcbiAgICAgIC4uLnJlZnMsXG4gICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiYW55T2ZcIiwgYCR7aX1gXVxuICAgIH0pXG4gICkuZmlsdGVyKFxuICAgICh4KSA9PiAhIXggJiYgKCFyZWZzLnN0cmljdFVuaW9ucyB8fCB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyh4KS5sZW5ndGggPiAwKVxuICApO1xuICByZXR1cm4gYW55T2YubGVuZ3RoID8geyBhbnlPZiB9IDogdm9pZCAwO1xufTtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9udWxsYWJsZS50c1xuZnVuY3Rpb24gcGFyc2VOdWxsYWJsZURlZihkZWYsIHJlZnMpIHtcbiAgaWYgKFtcIlpvZFN0cmluZ1wiLCBcIlpvZE51bWJlclwiLCBcIlpvZEJpZ0ludFwiLCBcIlpvZEJvb2xlYW5cIiwgXCJab2ROdWxsXCJdLmluY2x1ZGVzKFxuICAgIGRlZi5pbm5lclR5cGUuX2RlZi50eXBlTmFtZVxuICApICYmICghZGVmLmlubmVyVHlwZS5fZGVmLmNoZWNrcyB8fCAhZGVmLmlubmVyVHlwZS5fZGVmLmNoZWNrcy5sZW5ndGgpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFtcbiAgICAgICAgcHJpbWl0aXZlTWFwcGluZ3NbZGVmLmlubmVyVHlwZS5fZGVmLnR5cGVOYW1lXSxcbiAgICAgICAgXCJudWxsXCJcbiAgICAgIF1cbiAgICB9O1xuICB9XG4gIGNvbnN0IGJhc2UgPSBwYXJzZURlZihkZWYuaW5uZXJUeXBlLl9kZWYsIHtcbiAgICAuLi5yZWZzLFxuICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgXCJhbnlPZlwiLCBcIjBcIl1cbiAgfSk7XG4gIHJldHVybiBiYXNlICYmIHsgYW55T2Y6IFtiYXNlLCB7IHR5cGU6IFwibnVsbFwiIH1dIH07XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvbnVtYmVyLnRzXG5mdW5jdGlvbiBwYXJzZU51bWJlckRlZihkZWYpIHtcbiAgY29uc3QgcmVzID0ge1xuICAgIHR5cGU6IFwibnVtYmVyXCJcbiAgfTtcbiAgaWYgKCFkZWYuY2hlY2tzKSByZXR1cm4gcmVzO1xuICBmb3IgKGNvbnN0IGNoZWNrIG9mIGRlZi5jaGVja3MpIHtcbiAgICBzd2l0Y2ggKGNoZWNrLmtpbmQpIHtcbiAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgcmVzLnR5cGUgPSBcImludGVnZXJcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGlmIChjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICByZXMubWluaW11bSA9IGNoZWNrLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5leGNsdXNpdmVNaW5pbXVtID0gY2hlY2sudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGlmIChjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICByZXMubWF4aW11bSA9IGNoZWNrLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5leGNsdXNpdmVNYXhpbXVtID0gY2hlY2sudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICByZXMubXVsdGlwbGVPZiA9IGNoZWNrLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9vYmplY3QudHNcbmZ1bmN0aW9uIHBhcnNlT2JqZWN0RGVmKGRlZiwgcmVmcykge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBwcm9wZXJ0aWVzOiB7fVxuICB9O1xuICBjb25zdCByZXF1aXJlZCA9IFtdO1xuICBjb25zdCBzaGFwZSA9IGRlZi5zaGFwZSgpO1xuICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIHNoYXBlKSB7XG4gICAgbGV0IHByb3BEZWYgPSBzaGFwZVtwcm9wTmFtZV07XG4gICAgaWYgKHByb3BEZWYgPT09IHZvaWQgMCB8fCBwcm9wRGVmLl9kZWYgPT09IHZvaWQgMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHByb3BPcHRpb25hbCA9IHNhZmVJc09wdGlvbmFsKHByb3BEZWYpO1xuICAgIGNvbnN0IHBhcnNlZERlZiA9IHBhcnNlRGVmKHByb3BEZWYuX2RlZiwge1xuICAgICAgLi4ucmVmcyxcbiAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgXCJwcm9wZXJ0aWVzXCIsIHByb3BOYW1lXSxcbiAgICAgIHByb3BlcnR5UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwicHJvcGVydGllc1wiLCBwcm9wTmFtZV1cbiAgICB9KTtcbiAgICBpZiAocGFyc2VkRGVmID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQucHJvcGVydGllc1twcm9wTmFtZV0gPSBwYXJzZWREZWY7XG4gICAgaWYgKCFwcm9wT3B0aW9uYWwpIHtcbiAgICAgIHJlcXVpcmVkLnB1c2gocHJvcE5hbWUpO1xuICAgIH1cbiAgfVxuICBpZiAocmVxdWlyZWQubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnJlcXVpcmVkID0gcmVxdWlyZWQ7XG4gIH1cbiAgY29uc3QgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBkZWNpZGVBZGRpdGlvbmFsUHJvcGVydGllcyhkZWYsIHJlZnMpO1xuICBpZiAoYWRkaXRpb25hbFByb3BlcnRpZXMgIT09IHZvaWQgMCkge1xuICAgIHJlc3VsdC5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBkZWNpZGVBZGRpdGlvbmFsUHJvcGVydGllcyhkZWYsIHJlZnMpIHtcbiAgaWYgKGRlZi5jYXRjaGFsbC5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE5ldmVyXCIpIHtcbiAgICByZXR1cm4gcGFyc2VEZWYoZGVmLmNhdGNoYWxsLl9kZWYsIHtcbiAgICAgIC4uLnJlZnMsXG4gICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIl1cbiAgICB9KTtcbiAgfVxuICBzd2l0Y2ggKGRlZi51bmtub3duS2V5cykge1xuICAgIGNhc2UgXCJwYXNzdGhyb3VnaFwiOlxuICAgICAgcmV0dXJuIHJlZnMuYWxsb3dlZEFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuICAgIGNhc2UgXCJzdHJpY3RcIjpcbiAgICAgIHJldHVybiByZWZzLnJlamVjdGVkQWRkaXRpb25hbFByb3BlcnRpZXM7XG4gICAgY2FzZSBcInN0cmlwXCI6XG4gICAgICByZXR1cm4gcmVmcy5yZW1vdmVBZGRpdGlvbmFsU3RyYXRlZ3kgPT09IFwic3RyaWN0XCIgPyByZWZzLmFsbG93ZWRBZGRpdGlvbmFsUHJvcGVydGllcyA6IHJlZnMucmVqZWN0ZWRBZGRpdGlvbmFsUHJvcGVydGllcztcbiAgfVxufVxuZnVuY3Rpb24gc2FmZUlzT3B0aW9uYWwoc2NoZW1hKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNjaGVtYS5pc09wdGlvbmFsKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL29wdGlvbmFsLnRzXG52YXIgcGFyc2VPcHRpb25hbERlZiA9IChkZWYsIHJlZnMpID0+IHtcbiAgdmFyIF9hMjtcbiAgaWYgKHJlZnMuY3VycmVudFBhdGgudG9TdHJpbmcoKSA9PT0gKChfYTIgPSByZWZzLnByb3BlcnR5UGF0aCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi50b1N0cmluZygpKSkge1xuICAgIHJldHVybiBwYXJzZURlZihkZWYuaW5uZXJUeXBlLl9kZWYsIHJlZnMpO1xuICB9XG4gIGNvbnN0IGlubmVyU2NoZW1hID0gcGFyc2VEZWYoZGVmLmlubmVyVHlwZS5fZGVmLCB7XG4gICAgLi4ucmVmcyxcbiAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiYW55T2ZcIiwgXCIxXCJdXG4gIH0pO1xuICByZXR1cm4gaW5uZXJTY2hlbWEgPyB7IGFueU9mOiBbeyBub3Q6IHBhcnNlQW55RGVmKCkgfSwgaW5uZXJTY2hlbWFdIH0gOiBwYXJzZUFueURlZigpO1xufTtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9waXBlbGluZS50c1xudmFyIHBhcnNlUGlwZWxpbmVEZWYgPSAoZGVmLCByZWZzKSA9PiB7XG4gIGlmIChyZWZzLnBpcGVTdHJhdGVneSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgcmV0dXJuIHBhcnNlRGVmKGRlZi5pbi5fZGVmLCByZWZzKTtcbiAgfSBlbHNlIGlmIChyZWZzLnBpcGVTdHJhdGVneSA9PT0gXCJvdXRwdXRcIikge1xuICAgIHJldHVybiBwYXJzZURlZihkZWYub3V0Ll9kZWYsIHJlZnMpO1xuICB9XG4gIGNvbnN0IGEgPSBwYXJzZURlZihkZWYuaW4uX2RlZiwge1xuICAgIC4uLnJlZnMsXG4gICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcImFsbE9mXCIsIFwiMFwiXVxuICB9KTtcbiAgY29uc3QgYiA9IHBhcnNlRGVmKGRlZi5vdXQuX2RlZiwge1xuICAgIC4uLnJlZnMsXG4gICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcImFsbE9mXCIsIGEgPyBcIjFcIiA6IFwiMFwiXVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBhbGxPZjogW2EsIGJdLmZpbHRlcigoeCkgPT4geCAhPT0gdm9pZCAwKVxuICB9O1xufTtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9wcm9taXNlLnRzXG5mdW5jdGlvbiBwYXJzZVByb21pc2VEZWYoZGVmLCByZWZzKSB7XG4gIHJldHVybiBwYXJzZURlZihkZWYudHlwZS5fZGVmLCByZWZzKTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9zZXQudHNcbmZ1bmN0aW9uIHBhcnNlU2V0RGVmKGRlZiwgcmVmcykge1xuICBjb25zdCBpdGVtcyA9IHBhcnNlRGVmKGRlZi52YWx1ZVR5cGUuX2RlZiwge1xuICAgIC4uLnJlZnMsXG4gICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcIml0ZW1zXCJdXG4gIH0pO1xuICBjb25zdCBzY2hlbWEgPSB7XG4gICAgdHlwZTogXCJhcnJheVwiLFxuICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgIGl0ZW1zXG4gIH07XG4gIGlmIChkZWYubWluU2l6ZSkge1xuICAgIHNjaGVtYS5taW5JdGVtcyA9IGRlZi5taW5TaXplLnZhbHVlO1xuICB9XG4gIGlmIChkZWYubWF4U2l6ZSkge1xuICAgIHNjaGVtYS5tYXhJdGVtcyA9IGRlZi5tYXhTaXplLnZhbHVlO1xuICB9XG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvdHVwbGUudHNcbmZ1bmN0aW9uIHBhcnNlVHVwbGVEZWYoZGVmLCByZWZzKSB7XG4gIGlmIChkZWYucmVzdCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBtaW5JdGVtczogZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgIGl0ZW1zOiBkZWYuaXRlbXMubWFwKFxuICAgICAgICAoeCwgaSkgPT4gcGFyc2VEZWYoeC5fZGVmLCB7XG4gICAgICAgICAgLi4ucmVmcyxcbiAgICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiaXRlbXNcIiwgYCR7aX1gXVxuICAgICAgICB9KVxuICAgICAgKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHgpID0+IHggPT09IHZvaWQgMCA/IGFjYyA6IFsuLi5hY2MsIHhdLFxuICAgICAgICBbXVxuICAgICAgKSxcbiAgICAgIGFkZGl0aW9uYWxJdGVtczogcGFyc2VEZWYoZGVmLnJlc3QuX2RlZiwge1xuICAgICAgICAuLi5yZWZzLFxuICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsIFwiYWRkaXRpb25hbEl0ZW1zXCJdXG4gICAgICB9KVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIG1pbkl0ZW1zOiBkZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgbWF4SXRlbXM6IGRlZi5pdGVtcy5sZW5ndGgsXG4gICAgICBpdGVtczogZGVmLml0ZW1zLm1hcChcbiAgICAgICAgKHgsIGkpID0+IHBhcnNlRGVmKHguX2RlZiwge1xuICAgICAgICAgIC4uLnJlZnMsXG4gICAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCBcIml0ZW1zXCIsIGAke2l9YF1cbiAgICAgICAgfSlcbiAgICAgICkucmVkdWNlKFxuICAgICAgICAoYWNjLCB4KSA9PiB4ID09PSB2b2lkIDAgPyBhY2MgOiBbLi4uYWNjLCB4XSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvdW5kZWZpbmVkLnRzXG5mdW5jdGlvbiBwYXJzZVVuZGVmaW5lZERlZigpIHtcbiAgcmV0dXJuIHtcbiAgICBub3Q6IHBhcnNlQW55RGVmKClcbiAgfTtcbn1cblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy91bmtub3duLnRzXG5mdW5jdGlvbiBwYXJzZVVua25vd25EZWYoKSB7XG4gIHJldHVybiBwYXJzZUFueURlZigpO1xufVxuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9wYXJzZXJzL3JlYWRvbmx5LnRzXG52YXIgcGFyc2VSZWFkb25seURlZiA9IChkZWYsIHJlZnMpID0+IHtcbiAgcmV0dXJuIHBhcnNlRGVmKGRlZi5pbm5lclR5cGUuX2RlZiwgcmVmcyk7XG59O1xuXG4vLyBzcmMvdG8tanNvbi1zY2hlbWEvem9kMy10by1qc29uLXNjaGVtYS9zZWxlY3QtcGFyc2VyLnRzXG52YXIgc2VsZWN0UGFyc2VyID0gKGRlZiwgdHlwZU5hbWUsIHJlZnMpID0+IHtcbiAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RTdHJpbmc6XG4gICAgICByZXR1cm4gcGFyc2VTdHJpbmdEZWYoZGVmLCByZWZzKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kTnVtYmVyOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtYmVyRGVmKGRlZik7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZE9iamVjdDpcbiAgICAgIHJldHVybiBwYXJzZU9iamVjdERlZihkZWYsIHJlZnMpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RCaWdJbnQ6XG4gICAgICByZXR1cm4gcGFyc2VCaWdpbnREZWYoZGVmKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kQm9vbGVhbjpcbiAgICAgIHJldHVybiBwYXJzZUJvb2xlYW5EZWYoKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kRGF0ZTpcbiAgICAgIHJldHVybiBwYXJzZURhdGVEZWYoZGVmLCByZWZzKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kVW5kZWZpbmVkOlxuICAgICAgcmV0dXJuIHBhcnNlVW5kZWZpbmVkRGVmKCk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZE51bGw6XG4gICAgICByZXR1cm4gcGFyc2VOdWxsRGVmKCk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZEFycmF5OlxuICAgICAgcmV0dXJuIHBhcnNlQXJyYXlEZWYoZGVmLCByZWZzKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kVW5pb246XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZERpc2NyaW1pbmF0ZWRVbmlvbjpcbiAgICAgIHJldHVybiBwYXJzZVVuaW9uRGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZEludGVyc2VjdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUludGVyc2VjdGlvbkRlZihkZWYsIHJlZnMpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RUdXBsZTpcbiAgICAgIHJldHVybiBwYXJzZVR1cGxlRGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZFJlY29yZDpcbiAgICAgIHJldHVybiBwYXJzZVJlY29yZERlZihkZWYsIHJlZnMpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RMaXRlcmFsOlxuICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbERlZihkZWYpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RFbnVtOlxuICAgICAgcmV0dXJuIHBhcnNlRW51bURlZihkZWYpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2ROYXRpdmVFbnVtOlxuICAgICAgcmV0dXJuIHBhcnNlTmF0aXZlRW51bURlZihkZWYpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2ROdWxsYWJsZTpcbiAgICAgIHJldHVybiBwYXJzZU51bGxhYmxlRGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZE9wdGlvbmFsOlxuICAgICAgcmV0dXJuIHBhcnNlT3B0aW9uYWxEZWYoZGVmLCByZWZzKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kTWFwOlxuICAgICAgcmV0dXJuIHBhcnNlTWFwRGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZFNldDpcbiAgICAgIHJldHVybiBwYXJzZVNldERlZihkZWYsIHJlZnMpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RMYXp5OlxuICAgICAgcmV0dXJuICgpID0+IGRlZi5nZXR0ZXIoKS5fZGVmO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RQcm9taXNlOlxuICAgICAgcmV0dXJuIHBhcnNlUHJvbWlzZURlZihkZWYsIHJlZnMpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2ROYU46XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZE5ldmVyOlxuICAgICAgcmV0dXJuIHBhcnNlTmV2ZXJEZWYoKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kRWZmZWN0czpcbiAgICAgIHJldHVybiBwYXJzZUVmZmVjdHNEZWYoZGVmLCByZWZzKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kQW55OlxuICAgICAgcmV0dXJuIHBhcnNlQW55RGVmKCk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZFVua25vd246XG4gICAgICByZXR1cm4gcGFyc2VVbmtub3duRGVmKCk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZERlZmF1bHQ6XG4gICAgICByZXR1cm4gcGFyc2VEZWZhdWx0RGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZEJyYW5kZWQ6XG4gICAgICByZXR1cm4gcGFyc2VCcmFuZGVkRGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZFJlYWRvbmx5OlxuICAgICAgcmV0dXJuIHBhcnNlUmVhZG9ubHlEZWYoZGVmLCByZWZzKTtcbiAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZDMuWm9kQ2F0Y2g6XG4gICAgICByZXR1cm4gcGFyc2VDYXRjaERlZihkZWYsIHJlZnMpO1xuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RQaXBlbGluZTpcbiAgICAgIHJldHVybiBwYXJzZVBpcGVsaW5lRGVmKGRlZiwgcmVmcyk7XG4gICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQzLlpvZEZ1bmN0aW9uOlxuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RWb2lkOlxuICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMy5ab2RTeW1ib2w6XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovICgoXykgPT4gdm9pZCAwKSh0eXBlTmFtZSk7XG4gIH1cbn07XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL2dldC1yZWxhdGl2ZS1wYXRoLnRzXG52YXIgZ2V0UmVsYXRpdmVQYXRoID0gKHBhdGhBLCBwYXRoQikgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpIDwgcGF0aEEubGVuZ3RoICYmIGkgPCBwYXRoQi5sZW5ndGg7IGkrKykge1xuICAgIGlmIChwYXRoQVtpXSAhPT0gcGF0aEJbaV0pIGJyZWFrO1xuICB9XG4gIHJldHVybiBbKHBhdGhBLmxlbmd0aCAtIGkpLnRvU3RyaW5nKCksIC4uLnBhdGhCLnNsaWNlKGkpXS5qb2luKFwiL1wiKTtcbn07XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3BhcnNlLWRlZi50c1xuZnVuY3Rpb24gcGFyc2VEZWYoZGVmLCByZWZzLCBmb3JjZVJlc29sdXRpb24gPSBmYWxzZSkge1xuICB2YXIgX2EyO1xuICBjb25zdCBzZWVuSXRlbSA9IHJlZnMuc2Vlbi5nZXQoZGVmKTtcbiAgaWYgKHJlZnMub3ZlcnJpZGUpIHtcbiAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IChfYTIgPSByZWZzLm92ZXJyaWRlKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLmNhbGwoXG4gICAgICByZWZzLFxuICAgICAgZGVmLFxuICAgICAgcmVmcyxcbiAgICAgIHNlZW5JdGVtLFxuICAgICAgZm9yY2VSZXNvbHV0aW9uXG4gICAgKTtcbiAgICBpZiAob3ZlcnJpZGVSZXN1bHQgIT09IGlnbm9yZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVSZXN1bHQ7XG4gICAgfVxuICB9XG4gIGlmIChzZWVuSXRlbSAmJiAhZm9yY2VSZXNvbHV0aW9uKSB7XG4gICAgY29uc3Qgc2VlblNjaGVtYSA9IGdldCRyZWYoc2Vlbkl0ZW0sIHJlZnMpO1xuICAgIGlmIChzZWVuU2NoZW1hICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBzZWVuU2NoZW1hO1xuICAgIH1cbiAgfVxuICBjb25zdCBuZXdJdGVtID0geyBkZWYsIHBhdGg6IHJlZnMuY3VycmVudFBhdGgsIGpzb25TY2hlbWE6IHZvaWQgMCB9O1xuICByZWZzLnNlZW4uc2V0KGRlZiwgbmV3SXRlbSk7XG4gIGNvbnN0IGpzb25TY2hlbWFPckdldHRlciA9IHNlbGVjdFBhcnNlcihkZWYsIGRlZi50eXBlTmFtZSwgcmVmcyk7XG4gIGNvbnN0IGpzb25TY2hlbWEyID0gdHlwZW9mIGpzb25TY2hlbWFPckdldHRlciA9PT0gXCJmdW5jdGlvblwiID8gcGFyc2VEZWYoanNvblNjaGVtYU9yR2V0dGVyKCksIHJlZnMpIDoganNvblNjaGVtYU9yR2V0dGVyO1xuICBpZiAoanNvblNjaGVtYTIpIHtcbiAgICBhZGRNZXRhKGRlZiwgcmVmcywganNvblNjaGVtYTIpO1xuICB9XG4gIGlmIChyZWZzLnBvc3RQcm9jZXNzKSB7XG4gICAgY29uc3QgcG9zdFByb2Nlc3NSZXN1bHQgPSByZWZzLnBvc3RQcm9jZXNzKGpzb25TY2hlbWEyLCBkZWYsIHJlZnMpO1xuICAgIG5ld0l0ZW0uanNvblNjaGVtYSA9IGpzb25TY2hlbWEyO1xuICAgIHJldHVybiBwb3N0UHJvY2Vzc1Jlc3VsdDtcbiAgfVxuICBuZXdJdGVtLmpzb25TY2hlbWEgPSBqc29uU2NoZW1hMjtcbiAgcmV0dXJuIGpzb25TY2hlbWEyO1xufVxudmFyIGdldCRyZWYgPSAoaXRlbSwgcmVmcykgPT4ge1xuICBzd2l0Y2ggKHJlZnMuJHJlZlN0cmF0ZWd5KSB7XG4gICAgY2FzZSBcInJvb3RcIjpcbiAgICAgIHJldHVybiB7ICRyZWY6IGl0ZW0ucGF0aC5qb2luKFwiL1wiKSB9O1xuICAgIGNhc2UgXCJyZWxhdGl2ZVwiOlxuICAgICAgcmV0dXJuIHsgJHJlZjogZ2V0UmVsYXRpdmVQYXRoKHJlZnMuY3VycmVudFBhdGgsIGl0ZW0ucGF0aCkgfTtcbiAgICBjYXNlIFwibm9uZVwiOlxuICAgIGNhc2UgXCJzZWVuXCI6IHtcbiAgICAgIGlmIChpdGVtLnBhdGgubGVuZ3RoIDwgcmVmcy5jdXJyZW50UGF0aC5sZW5ndGggJiYgaXRlbS5wYXRoLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHJlZnMuY3VycmVudFBhdGhbaW5kZXhdID09PSB2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBSZWN1cnNpdmUgcmVmZXJlbmNlIGRldGVjdGVkIGF0ICR7cmVmcy5jdXJyZW50UGF0aC5qb2luKFxuICAgICAgICAgICAgXCIvXCJcbiAgICAgICAgICApfSEgRGVmYXVsdGluZyB0byBhbnlgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBwYXJzZUFueURlZigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZnMuJHJlZlN0cmF0ZWd5ID09PSBcInNlZW5cIiA/IHBhcnNlQW55RGVmKCkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59O1xudmFyIGFkZE1ldGEgPSAoZGVmLCByZWZzLCBqc29uU2NoZW1hMikgPT4ge1xuICBpZiAoZGVmLmRlc2NyaXB0aW9uKSB7XG4gICAganNvblNjaGVtYTIuZGVzY3JpcHRpb24gPSBkZWYuZGVzY3JpcHRpb247XG4gIH1cbiAgcmV0dXJuIGpzb25TY2hlbWEyO1xufTtcblxuLy8gc3JjL3RvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEvcmVmcy50c1xudmFyIGdldFJlZnMgPSAob3B0aW9ucykgPT4ge1xuICBjb25zdCBfb3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBjdXJyZW50UGF0aCA9IF9vcHRpb25zLm5hbWUgIT09IHZvaWQgMCA/IFsuLi5fb3B0aW9ucy5iYXNlUGF0aCwgX29wdGlvbnMuZGVmaW5pdGlvblBhdGgsIF9vcHRpb25zLm5hbWVdIDogX29wdGlvbnMuYmFzZVBhdGg7XG4gIHJldHVybiB7XG4gICAgLi4uX29wdGlvbnMsXG4gICAgY3VycmVudFBhdGgsXG4gICAgcHJvcGVydHlQYXRoOiB2b2lkIDAsXG4gICAgc2VlbjogbmV3IE1hcChcbiAgICAgIE9iamVjdC5lbnRyaWVzKF9vcHRpb25zLmRlZmluaXRpb25zKS5tYXAoKFtuYW1lMiwgZGVmXSkgPT4gW1xuICAgICAgICBkZWYuX2RlZixcbiAgICAgICAge1xuICAgICAgICAgIGRlZjogZGVmLl9kZWYsXG4gICAgICAgICAgcGF0aDogWy4uLl9vcHRpb25zLmJhc2VQYXRoLCBfb3B0aW9ucy5kZWZpbml0aW9uUGF0aCwgbmFtZTJdLFxuICAgICAgICAgIC8vIFJlc29sdXRpb24gb2YgcmVmZXJlbmNlcyB3aWxsIGJlIGZvcmNlZCBldmVuIHRob3VnaCBzZWVuLCBzbyBpdCdzIG9rIHRoYXQgdGhlIHNjaGVtYSBpcyB1bmRlZmluZWQgaGVyZSBmb3Igbm93LlxuICAgICAgICAgIGpzb25TY2hlbWE6IHZvaWQgMFxuICAgICAgICB9XG4gICAgICBdKVxuICAgIClcbiAgfTtcbn07XG5cbi8vIHNyYy90by1qc29uLXNjaGVtYS96b2QzLXRvLWpzb24tc2NoZW1hL3pvZDMtdG8tanNvbi1zY2hlbWEudHNcbnZhciB6b2QzVG9Kc29uU2NoZW1hID0gKHNjaGVtYSwgb3B0aW9ucykgPT4ge1xuICB2YXIgX2EyO1xuICBjb25zdCByZWZzID0gZ2V0UmVmcyhvcHRpb25zKTtcbiAgbGV0IGRlZmluaXRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiYgb3B0aW9ucy5kZWZpbml0aW9ucyA/IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZGVmaW5pdGlvbnMpLnJlZHVjZShcbiAgICAoYWNjLCBbbmFtZTMsIHNjaGVtYTJdKSA9PiB7XG4gICAgICB2YXIgX2EzO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbbmFtZTNdOiAoX2EzID0gcGFyc2VEZWYoXG4gICAgICAgICAgc2NoZW1hMi5fZGVmLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnJlZnMsXG4gICAgICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuYmFzZVBhdGgsIHJlZnMuZGVmaW5pdGlvblBhdGgsIG5hbWUzXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApKSAhPSBudWxsID8gX2EzIDogcGFyc2VBbnlEZWYoKVxuICAgICAgfTtcbiAgICB9LFxuICAgIHt9XG4gICkgOiB2b2lkIDA7XG4gIGNvbnN0IG5hbWUyID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBvcHRpb25zIDogKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMubmFtZVN0cmF0ZWd5KSA9PT0gXCJ0aXRsZVwiID8gdm9pZCAwIDogb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5uYW1lO1xuICBjb25zdCBtYWluID0gKF9hMiA9IHBhcnNlRGVmKFxuICAgIHNjaGVtYS5fZGVmLFxuICAgIG5hbWUyID09PSB2b2lkIDAgPyByZWZzIDoge1xuICAgICAgLi4ucmVmcyxcbiAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5iYXNlUGF0aCwgcmVmcy5kZWZpbml0aW9uUGF0aCwgbmFtZTJdXG4gICAgfSxcbiAgICBmYWxzZVxuICApKSAhPSBudWxsID8gX2EyIDogcGFyc2VBbnlEZWYoKTtcbiAgY29uc3QgdGl0bGUgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIiAmJiBvcHRpb25zLm5hbWUgIT09IHZvaWQgMCAmJiBvcHRpb25zLm5hbWVTdHJhdGVneSA9PT0gXCJ0aXRsZVwiID8gb3B0aW9ucy5uYW1lIDogdm9pZCAwO1xuICBpZiAodGl0bGUgIT09IHZvaWQgMCkge1xuICAgIG1haW4udGl0bGUgPSB0aXRsZTtcbiAgfVxuICBjb25zdCBjb21iaW5lZCA9IG5hbWUyID09PSB2b2lkIDAgPyBkZWZpbml0aW9ucyA/IHtcbiAgICAuLi5tYWluLFxuICAgIFtyZWZzLmRlZmluaXRpb25QYXRoXTogZGVmaW5pdGlvbnNcbiAgfSA6IG1haW4gOiB7XG4gICAgJHJlZjogW1xuICAgICAgLi4ucmVmcy4kcmVmU3RyYXRlZ3kgPT09IFwicmVsYXRpdmVcIiA/IFtdIDogcmVmcy5iYXNlUGF0aCxcbiAgICAgIHJlZnMuZGVmaW5pdGlvblBhdGgsXG4gICAgICBuYW1lMlxuICAgIF0uam9pbihcIi9cIiksXG4gICAgW3JlZnMuZGVmaW5pdGlvblBhdGhdOiB7XG4gICAgICAuLi5kZWZpbml0aW9ucyxcbiAgICAgIFtuYW1lMl06IG1haW5cbiAgICB9XG4gIH07XG4gIGNvbWJpbmVkLiRzY2hlbWEgPSBcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1wiO1xuICByZXR1cm4gY29tYmluZWQ7XG59O1xuXG4vLyBzcmMvc2NoZW1hLnRzXG52YXIgc2NoZW1hU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpO1xuZnVuY3Rpb24gbGF6eVNjaGVtYShjcmVhdGVTY2hlbWEpIHtcbiAgbGV0IHNjaGVtYTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoc2NoZW1hID09IG51bGwpIHtcbiAgICAgIHNjaGVtYSA9IGNyZWF0ZVNjaGVtYSgpO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9O1xufVxuZnVuY3Rpb24ganNvblNjaGVtYShqc29uU2NoZW1hMiwge1xuICB2YWxpZGF0ZVxufSA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgW3NjaGVtYVN5bWJvbF06IHRydWUsXG4gICAgX3R5cGU6IHZvaWQgMCxcbiAgICAvLyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseVxuICAgIGdldCBqc29uU2NoZW1hKCkge1xuICAgICAgaWYgKHR5cGVvZiBqc29uU2NoZW1hMiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGpzb25TY2hlbWEyID0ganNvblNjaGVtYTIoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBqc29uU2NoZW1hMjtcbiAgICB9LFxuICAgIHZhbGlkYXRlXG4gIH07XG59XG5mdW5jdGlvbiBpc1NjaGVtYSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHNjaGVtYVN5bWJvbCBpbiB2YWx1ZSAmJiB2YWx1ZVtzY2hlbWFTeW1ib2xdID09PSB0cnVlICYmIFwianNvblNjaGVtYVwiIGluIHZhbHVlICYmIFwidmFsaWRhdGVcIiBpbiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGFzU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gc2NoZW1hID09IG51bGwgPyBqc29uU2NoZW1hKHsgcHJvcGVydGllczoge30sIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSB9KSA6IGlzU2NoZW1hKHNjaGVtYSkgPyBzY2hlbWEgOiBcIn5zdGFuZGFyZFwiIGluIHNjaGVtYSA/IHNjaGVtYVtcIn5zdGFuZGFyZFwiXS52ZW5kb3IgPT09IFwiem9kXCIgPyB6b2RTY2hlbWEoc2NoZW1hKSA6IHN0YW5kYXJkU2NoZW1hKHNjaGVtYSkgOiBzY2hlbWEoKTtcbn1cbmZ1bmN0aW9uIHN0YW5kYXJkU2NoZW1hKHN0YW5kYXJkU2NoZW1hMikge1xuICByZXR1cm4ganNvblNjaGVtYShcbiAgICAoKSA9PiBhZGRBZGRpdGlvbmFsUHJvcGVydGllc1RvSnNvblNjaGVtYShcbiAgICAgIHN0YW5kYXJkU2NoZW1hMltcIn5zdGFuZGFyZFwiXS5qc29uU2NoZW1hLmlucHV0KHtcbiAgICAgICAgdGFyZ2V0OiBcImRyYWZ0LTA3XCJcbiAgICAgIH0pXG4gICAgKSxcbiAgICB7XG4gICAgICB2YWxpZGF0ZTogYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0YW5kYXJkU2NoZW1hMltcIn5zdGFuZGFyZFwiXS52YWxpZGF0ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBcInZhbHVlXCIgaW4gcmVzdWx0ID8geyBzdWNjZXNzOiB0cnVlLCB2YWx1ZTogcmVzdWx0LnZhbHVlIH0gOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgY2F1c2U6IHJlc3VsdC5pc3N1ZXNcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHpvZDNTY2hlbWEoem9kU2NoZW1hMiwgb3B0aW9ucykge1xuICB2YXIgX2EyO1xuICBjb25zdCB1c2VSZWZlcmVuY2VzID0gKF9hMiA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMudXNlUmVmZXJlbmNlcykgIT0gbnVsbCA/IF9hMiA6IGZhbHNlO1xuICByZXR1cm4ganNvblNjaGVtYShcbiAgICAvLyBkZWZlciBqc29uIHNjaGVtYSBjcmVhdGlvbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb21wdXRhdGlvbiB3aGVuIG9ubHkgdmFsaWRhdGlvbiBpcyBuZWVkZWRcbiAgICAoKSA9PiB6b2QzVG9Kc29uU2NoZW1hKHpvZFNjaGVtYTIsIHtcbiAgICAgICRyZWZTdHJhdGVneTogdXNlUmVmZXJlbmNlcyA/IFwicm9vdFwiIDogXCJub25lXCJcbiAgICB9KSxcbiAgICB7XG4gICAgICB2YWxpZGF0ZTogYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHpvZFNjaGVtYTIuc2FmZVBhcnNlQXN5bmModmFsdWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgPyB7IHN1Y2Nlc3M6IHRydWUsIHZhbHVlOiByZXN1bHQuZGF0YSB9IDogeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IHJlc3VsdC5lcnJvciB9O1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHpvZDRTY2hlbWEoem9kU2NoZW1hMiwgb3B0aW9ucykge1xuICB2YXIgX2EyO1xuICBjb25zdCB1c2VSZWZlcmVuY2VzID0gKF9hMiA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMudXNlUmVmZXJlbmNlcykgIT0gbnVsbCA/IF9hMiA6IGZhbHNlO1xuICByZXR1cm4ganNvblNjaGVtYShcbiAgICAvLyBkZWZlciBqc29uIHNjaGVtYSBjcmVhdGlvbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb21wdXRhdGlvbiB3aGVuIG9ubHkgdmFsaWRhdGlvbiBpcyBuZWVkZWRcbiAgICAoKSA9PiBhZGRBZGRpdGlvbmFsUHJvcGVydGllc1RvSnNvblNjaGVtYShcbiAgICAgIHo0LnRvSlNPTlNjaGVtYSh6b2RTY2hlbWEyLCB7XG4gICAgICAgIHRhcmdldDogXCJkcmFmdC03XCIsXG4gICAgICAgIGlvOiBcImlucHV0XCIsXG4gICAgICAgIHJldXNlZDogdXNlUmVmZXJlbmNlcyA/IFwicmVmXCIgOiBcImlubGluZVwiXG4gICAgICB9KVxuICAgICksXG4gICAge1xuICAgICAgdmFsaWRhdGU6IGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB6NC5zYWZlUGFyc2VBc3luYyh6b2RTY2hlbWEyLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcyA/IHsgc3VjY2VzczogdHJ1ZSwgdmFsdWU6IHJlc3VsdC5kYXRhIH0gOiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogcmVzdWx0LmVycm9yIH07XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuZnVuY3Rpb24gaXNab2Q0U2NoZW1hKHpvZFNjaGVtYTIpIHtcbiAgcmV0dXJuIFwiX3pvZFwiIGluIHpvZFNjaGVtYTI7XG59XG5mdW5jdGlvbiB6b2RTY2hlbWEoem9kU2NoZW1hMiwgb3B0aW9ucykge1xuICBpZiAoaXNab2Q0U2NoZW1hKHpvZFNjaGVtYTIpKSB7XG4gICAgcmV0dXJuIHpvZDRTY2hlbWEoem9kU2NoZW1hMiwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHpvZDNTY2hlbWEoem9kU2NoZW1hMiwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLy8gc3JjL3ZhbGlkYXRlLXR5cGVzLnRzXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVR5cGVzKHtcbiAgdmFsdWUsXG4gIHNjaGVtYSxcbiAgY29udGV4dFxufSkge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYWZlVmFsaWRhdGVUeXBlcyh7IHZhbHVlLCBzY2hlbWEsIGNvbnRleHQgfSk7XG4gIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBUeXBlVmFsaWRhdGlvbkVycm9yMi53cmFwKHsgdmFsdWUsIGNhdXNlOiByZXN1bHQuZXJyb3IsIGNvbnRleHQgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHNhZmVWYWxpZGF0ZVR5cGVzKHtcbiAgdmFsdWUsXG4gIHNjaGVtYSxcbiAgY29udGV4dFxufSkge1xuICBjb25zdCBhY3R1YWxTY2hlbWEgPSBhc1NjaGVtYShzY2hlbWEpO1xuICB0cnkge1xuICAgIGlmIChhY3R1YWxTY2hlbWEudmFsaWRhdGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmFsdWUsIHJhd1ZhbHVlOiB2YWx1ZSB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3R1YWxTY2hlbWEudmFsaWRhdGUodmFsdWUpO1xuICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmFsdWU6IHJlc3VsdC52YWx1ZSwgcmF3VmFsdWU6IHZhbHVlIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBUeXBlVmFsaWRhdGlvbkVycm9yMi53cmFwKHsgdmFsdWUsIGNhdXNlOiByZXN1bHQuZXJyb3IsIGNvbnRleHQgfSksXG4gICAgICByYXdWYWx1ZTogdmFsdWVcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBUeXBlVmFsaWRhdGlvbkVycm9yMi53cmFwKHsgdmFsdWUsIGNhdXNlOiBlcnJvciwgY29udGV4dCB9KSxcbiAgICAgIHJhd1ZhbHVlOiB2YWx1ZVxuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL3BhcnNlLWpzb24udHNcbmFzeW5jIGZ1bmN0aW9uIHBhcnNlSlNPTih7XG4gIHRleHQsXG4gIHNjaGVtYVxufSkge1xuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlID0gc2VjdXJlSnNvblBhcnNlKHRleHQpO1xuICAgIGlmIChzY2hlbWEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGVUeXBlcyh7IHZhbHVlLCBzY2hlbWEgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKEpTT05QYXJzZUVycm9yLmlzSW5zdGFuY2UoZXJyb3IpIHx8IFR5cGVWYWxpZGF0aW9uRXJyb3IzLmlzSW5zdGFuY2UoZXJyb3IpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEpTT05QYXJzZUVycm9yKHsgdGV4dCwgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBzYWZlUGFyc2VKU09OKHtcbiAgdGV4dCxcbiAgc2NoZW1hXG59KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsdWUgPSBzZWN1cmVKc29uUGFyc2UodGV4dCk7XG4gICAgaWYgKHNjaGVtYSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB2YWx1ZSwgcmF3VmFsdWU6IHZhbHVlIH07XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzYWZlVmFsaWRhdGVUeXBlcyh7IHZhbHVlLCBzY2hlbWEgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IEpTT05QYXJzZUVycm9yLmlzSW5zdGFuY2UoZXJyb3IpID8gZXJyb3IgOiBuZXcgSlNPTlBhcnNlRXJyb3IoeyB0ZXh0LCBjYXVzZTogZXJyb3IgfSksXG4gICAgICByYXdWYWx1ZTogdm9pZCAwXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gaXNQYXJzYWJsZUpzb24oaW5wdXQpIHtcbiAgdHJ5IHtcbiAgICBzZWN1cmVKc29uUGFyc2UoaW5wdXQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIHNyYy9wYXJzZS1qc29uLWV2ZW50LXN0cmVhbS50c1xuaW1wb3J0IHtcbiAgRXZlbnRTb3VyY2VQYXJzZXJTdHJlYW1cbn0gZnJvbSBcImV2ZW50c291cmNlLXBhcnNlci9zdHJlYW1cIjtcbmZ1bmN0aW9uIHBhcnNlSnNvbkV2ZW50U3RyZWFtKHtcbiAgc3RyZWFtLFxuICBzY2hlbWFcbn0pIHtcbiAgcmV0dXJuIHN0cmVhbS5waXBlVGhyb3VnaChuZXcgVGV4dERlY29kZXJTdHJlYW0oKSkucGlwZVRocm91Z2gobmV3IEV2ZW50U291cmNlUGFyc2VyU3RyZWFtKCkpLnBpcGVUaHJvdWdoKFxuICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgYXN5bmMgdHJhbnNmb3JtKHsgZGF0YSB9LCBjb250cm9sbGVyKSB7XG4gICAgICAgIGlmIChkYXRhID09PSBcIltET05FXVwiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShhd2FpdCBzYWZlUGFyc2VKU09OKHsgdGV4dDogZGF0YSwgc2NoZW1hIH0pKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufVxuXG4vLyBzcmMvcGFyc2UtcHJvdmlkZXItb3B0aW9ucy50c1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgYXMgSW52YWxpZEFyZ3VtZW50RXJyb3IyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJPcHRpb25zKHtcbiAgcHJvdmlkZXIsXG4gIHByb3ZpZGVyT3B0aW9ucyxcbiAgc2NoZW1hXG59KSB7XG4gIGlmICgocHJvdmlkZXJPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdGlvbnNbcHJvdmlkZXJdKSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBjb25zdCBwYXJzZWRQcm92aWRlck9wdGlvbnMgPSBhd2FpdCBzYWZlVmFsaWRhdGVUeXBlcyh7XG4gICAgdmFsdWU6IHByb3ZpZGVyT3B0aW9uc1twcm92aWRlcl0sXG4gICAgc2NoZW1hXG4gIH0pO1xuICBpZiAoIXBhcnNlZFByb3ZpZGVyT3B0aW9ucy5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yMih7XG4gICAgICBhcmd1bWVudDogXCJwcm92aWRlck9wdGlvbnNcIixcbiAgICAgIG1lc3NhZ2U6IGBpbnZhbGlkICR7cHJvdmlkZXJ9IHByb3ZpZGVyIG9wdGlvbnNgLFxuICAgICAgY2F1c2U6IHBhcnNlZFByb3ZpZGVyT3B0aW9ucy5lcnJvclxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWRQcm92aWRlck9wdGlvbnMudmFsdWU7XG59XG5cbi8vIHNyYy9wb3N0LXRvLWFwaS50c1xuaW1wb3J0IHsgQVBJQ2FsbEVycm9yIGFzIEFQSUNhbGxFcnJvcjMgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xudmFyIGdldE9yaWdpbmFsRmV0Y2gyID0gKCkgPT4gZ2xvYmFsVGhpcy5mZXRjaDtcbnZhciBwb3N0SnNvblRvQXBpID0gYXN5bmMgKHtcbiAgdXJsLFxuICBoZWFkZXJzLFxuICBib2R5LFxuICBmYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXIsXG4gIGFib3J0U2lnbmFsLFxuICBmZXRjaDogZmV0Y2gyXG59KSA9PiBwb3N0VG9BcGkoe1xuICB1cmwsXG4gIGhlYWRlcnM6IHtcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAuLi5oZWFkZXJzXG4gIH0sXG4gIGJvZHk6IHtcbiAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB2YWx1ZXM6IGJvZHlcbiAgfSxcbiAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyLFxuICBhYm9ydFNpZ25hbCxcbiAgZmV0Y2g6IGZldGNoMlxufSk7XG52YXIgcG9zdEZvcm1EYXRhVG9BcGkgPSBhc3luYyAoe1xuICB1cmwsXG4gIGhlYWRlcnMsXG4gIGZvcm1EYXRhLFxuICBmYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXIsXG4gIGFib3J0U2lnbmFsLFxuICBmZXRjaDogZmV0Y2gyXG59KSA9PiBwb3N0VG9BcGkoe1xuICB1cmwsXG4gIGhlYWRlcnMsXG4gIGJvZHk6IHtcbiAgICBjb250ZW50OiBmb3JtRGF0YSxcbiAgICB2YWx1ZXM6IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YS5lbnRyaWVzKCkpXG4gIH0sXG4gIGZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcixcbiAgYWJvcnRTaWduYWwsXG4gIGZldGNoOiBmZXRjaDJcbn0pO1xudmFyIHBvc3RUb0FwaSA9IGFzeW5jICh7XG4gIHVybCxcbiAgaGVhZGVycyA9IHt9LFxuICBib2R5LFxuICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyLFxuICBmYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gIGFib3J0U2lnbmFsLFxuICBmZXRjaDogZmV0Y2gyID0gZ2V0T3JpZ2luYWxGZXRjaDIoKVxufSkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gyKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHdpdGhVc2VyQWdlbnRTdWZmaXgoXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGBhaS1zZGsvcHJvdmlkZXItdXRpbHMvJHtWRVJTSU9OfWAsXG4gICAgICAgIGdldFJ1bnRpbWVFbnZpcm9ubWVudFVzZXJBZ2VudCgpXG4gICAgICApLFxuICAgICAgYm9keTogYm9keS5jb250ZW50LFxuICAgICAgc2lnbmFsOiBhYm9ydFNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGxldCBlcnJvckluZm9ybWF0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXJyb3JJbmZvcm1hdGlvbiA9IGF3YWl0IGZhaWxlZFJlc3BvbnNlSGFuZGxlcih7XG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzOiBib2R5LnZhbHVlc1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyb3IpIHx8IEFQSUNhbGxFcnJvcjMuaXNJbnN0YW5jZShlcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgQVBJQ2FsbEVycm9yMyh7XG4gICAgICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcHJvY2VzcyBlcnJvciByZXNwb25zZVwiLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgICByZXF1ZXN0Qm9keVZhbHVlczogYm9keS52YWx1ZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvckluZm9ybWF0aW9uLnZhbHVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXIoe1xuICAgICAgICByZXNwb25zZSxcbiAgICAgICAgdXJsLFxuICAgICAgICByZXF1ZXN0Qm9keVZhbHVlczogYm9keS52YWx1ZXNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoaXNBYm9ydEVycm9yKGVycm9yKSB8fCBBUElDYWxsRXJyb3IzLmlzSW5zdGFuY2UoZXJyb3IpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBBUElDYWxsRXJyb3IzKHtcbiAgICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcHJvY2VzcyBzdWNjZXNzZnVsIHJlc3BvbnNlXCIsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICB1cmwsXG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXM6IGJvZHkudmFsdWVzXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgaGFuZGxlRmV0Y2hFcnJvcih7IGVycm9yLCB1cmwsIHJlcXVlc3RCb2R5VmFsdWVzOiBib2R5LnZhbHVlcyB9KTtcbiAgfVxufTtcblxuLy8gc3JjL3R5cGVzL3Rvb2wudHNcbmZ1bmN0aW9uIHRvb2wodG9vbDIpIHtcbiAgcmV0dXJuIHRvb2wyO1xufVxuZnVuY3Rpb24gZHluYW1pY1Rvb2wodG9vbDIpIHtcbiAgcmV0dXJuIHsgLi4udG9vbDIsIHR5cGU6IFwiZHluYW1pY1wiIH07XG59XG5cbi8vIHNyYy9wcm92aWRlci10b29sLWZhY3RvcnkudHNcbmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3Rvcnkoe1xuICBpZCxcbiAgaW5wdXRTY2hlbWFcbn0pIHtcbiAgcmV0dXJuICh7XG4gICAgZXhlY3V0ZSxcbiAgICBvdXRwdXRTY2hlbWEsXG4gICAgbmVlZHNBcHByb3ZhbCxcbiAgICB0b01vZGVsT3V0cHV0LFxuICAgIG9uSW5wdXRTdGFydCxcbiAgICBvbklucHV0RGVsdGEsXG4gICAgb25JbnB1dEF2YWlsYWJsZSxcbiAgICAuLi5hcmdzXG4gIH0pID0+IHRvb2woe1xuICAgIHR5cGU6IFwicHJvdmlkZXJcIixcbiAgICBpZCxcbiAgICBhcmdzLFxuICAgIGlucHV0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlLFxuICAgIG5lZWRzQXBwcm92YWwsXG4gICAgdG9Nb2RlbE91dHB1dCxcbiAgICBvbklucHV0U3RhcnQsXG4gICAgb25JbnB1dERlbHRhLFxuICAgIG9uSW5wdXRBdmFpbGFibGVcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSh7XG4gIGlkLFxuICBpbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hLFxuICBzdXBwb3J0c0RlZmVycmVkUmVzdWx0c1xufSkge1xuICByZXR1cm4gKHtcbiAgICBleGVjdXRlLFxuICAgIG5lZWRzQXBwcm92YWwsXG4gICAgdG9Nb2RlbE91dHB1dCxcbiAgICBvbklucHV0U3RhcnQsXG4gICAgb25JbnB1dERlbHRhLFxuICAgIG9uSW5wdXRBdmFpbGFibGUsXG4gICAgLi4uYXJnc1xuICB9KSA9PiB0b29sKHtcbiAgICB0eXBlOiBcInByb3ZpZGVyXCIsXG4gICAgaWQsXG4gICAgYXJncyxcbiAgICBpbnB1dFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWEsXG4gICAgZXhlY3V0ZSxcbiAgICBuZWVkc0FwcHJvdmFsLFxuICAgIHRvTW9kZWxPdXRwdXQsXG4gICAgb25JbnB1dFN0YXJ0LFxuICAgIG9uSW5wdXREZWx0YSxcbiAgICBvbklucHV0QXZhaWxhYmxlLFxuICAgIHN1cHBvcnRzRGVmZXJyZWRSZXN1bHRzXG4gIH0pO1xufVxuXG4vLyBzcmMvcmVtb3ZlLXVuZGVmaW5lZC1lbnRyaWVzLnRzXG5mdW5jdGlvbiByZW1vdmVVbmRlZmluZWRFbnRyaWVzKHJlY29yZCkge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZmlsdGVyKChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPSBudWxsKVxuICApO1xufVxuXG4vLyBzcmMvcmVzb2x2ZS50c1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YWx1ZSA9IHZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG59XG5cbi8vIHNyYy9yZXNwb25zZS1oYW5kbGVyLnRzXG5pbXBvcnQgeyBBUElDYWxsRXJyb3IgYXMgQVBJQ2FsbEVycm9yNCwgRW1wdHlSZXNwb25zZUJvZHlFcnJvciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG52YXIgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyID0gKHtcbiAgZXJyb3JTY2hlbWEsXG4gIGVycm9yVG9NZXNzYWdlLFxuICBpc1JldHJ5YWJsZVxufSkgPT4gYXN5bmMgKHsgcmVzcG9uc2UsIHVybCwgcmVxdWVzdEJvZHlWYWx1ZXMgfSkgPT4ge1xuICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UpO1xuICBpZiAocmVzcG9uc2VCb2R5LnRyaW0oKSA9PT0gXCJcIikge1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB2YWx1ZTogbmV3IEFQSUNhbGxFcnJvcjQoe1xuICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICB1cmwsXG4gICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2VCb2R5LFxuICAgICAgICBpc1JldHJ5YWJsZTogaXNSZXRyeWFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IGlzUmV0cnlhYmxlKHJlc3BvbnNlKVxuICAgICAgfSlcbiAgICB9O1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkRXJyb3IgPSBhd2FpdCBwYXJzZUpTT04oe1xuICAgICAgdGV4dDogcmVzcG9uc2VCb2R5LFxuICAgICAgc2NoZW1hOiBlcnJvclNjaGVtYVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB2YWx1ZTogbmV3IEFQSUNhbGxFcnJvcjQoe1xuICAgICAgICBtZXNzYWdlOiBlcnJvclRvTWVzc2FnZShwYXJzZWRFcnJvciksXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgIGRhdGE6IHBhcnNlZEVycm9yLFxuICAgICAgICBpc1JldHJ5YWJsZTogaXNSZXRyeWFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IGlzUmV0cnlhYmxlKHJlc3BvbnNlLCBwYXJzZWRFcnJvcilcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB2YWx1ZTogbmV3IEFQSUNhbGxFcnJvcjQoe1xuICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICB1cmwsXG4gICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2VCb2R5LFxuICAgICAgICBpc1JldHJ5YWJsZTogaXNSZXRyeWFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IGlzUmV0cnlhYmxlKHJlc3BvbnNlKVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59O1xudmFyIGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyID0gKGNodW5rU2NoZW1hKSA9PiBhc3luYyAoeyByZXNwb25zZSB9KSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UpO1xuICBpZiAocmVzcG9uc2UuYm9keSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVtcHR5UmVzcG9uc2VCb2R5RXJyb3Ioe30pO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgIHZhbHVlOiBwYXJzZUpzb25FdmVudFN0cmVhbSh7XG4gICAgICBzdHJlYW06IHJlc3BvbnNlLmJvZHksXG4gICAgICBzY2hlbWE6IGNodW5rU2NoZW1hXG4gICAgfSlcbiAgfTtcbn07XG52YXIgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciA9IChyZXNwb25zZVNjaGVtYSkgPT4gYXN5bmMgKHsgcmVzcG9uc2UsIHVybCwgcmVxdWVzdEJvZHlWYWx1ZXMgfSkgPT4ge1xuICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGNvbnN0IHBhcnNlZFJlc3VsdCA9IGF3YWl0IHNhZmVQYXJzZUpTT04oe1xuICAgIHRleHQ6IHJlc3BvbnNlQm9keSxcbiAgICBzY2hlbWE6IHJlc3BvbnNlU2NoZW1hXG4gIH0pO1xuICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBleHRyYWN0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlKTtcbiAgaWYgKCFwYXJzZWRSZXN1bHQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBBUElDYWxsRXJyb3I0KHtcbiAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBKU09OIHJlc3BvbnNlXCIsXG4gICAgICBjYXVzZTogcGFyc2VkUmVzdWx0LmVycm9yLFxuICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgcmVzcG9uc2VCb2R5LFxuICAgICAgdXJsLFxuICAgICAgcmVxdWVzdEJvZHlWYWx1ZXNcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICB2YWx1ZTogcGFyc2VkUmVzdWx0LnZhbHVlLFxuICAgIHJhd1ZhbHVlOiBwYXJzZWRSZXN1bHQucmF3VmFsdWVcbiAgfTtcbn07XG52YXIgY3JlYXRlQmluYXJ5UmVzcG9uc2VIYW5kbGVyID0gKCkgPT4gYXN5bmMgKHsgcmVzcG9uc2UsIHVybCwgcmVxdWVzdEJvZHlWYWx1ZXMgfSkgPT4ge1xuICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBleHRyYWN0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlKTtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcjQoe1xuICAgICAgbWVzc2FnZTogXCJSZXNwb25zZSBib2R5IGlzIGVtcHR5XCIsXG4gICAgICB1cmwsXG4gICAgICByZXF1ZXN0Qm9keVZhbHVlcyxcbiAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHJlc3BvbnNlQm9keTogdm9pZCAwXG4gICAgfSk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcjQoe1xuICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcmVhZCByZXNwb25zZSBhcyBhcnJheSBidWZmZXJcIixcbiAgICAgIHVybCxcbiAgICAgIHJlcXVlc3RCb2R5VmFsdWVzLFxuICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgcmVzcG9uc2VCb2R5OiB2b2lkIDAsXG4gICAgICBjYXVzZTogZXJyb3JcbiAgICB9KTtcbiAgfVxufTtcbnZhciBjcmVhdGVTdGF0dXNDb2RlRXJyb3JSZXNwb25zZUhhbmRsZXIgPSAoKSA9PiBhc3luYyAoeyByZXNwb25zZSwgdXJsLCByZXF1ZXN0Qm9keVZhbHVlcyB9KSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UpO1xuICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgIHZhbHVlOiBuZXcgQVBJQ2FsbEVycm9yNCh7XG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgdXJsLFxuICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICByZXNwb25zZUJvZHlcbiAgICB9KVxuICB9O1xufTtcblxuLy8gc3JjL3N0cmlwLWZpbGUtZXh0ZW5zaW9uLnRzXG5mdW5jdGlvbiBzdHJpcEZpbGVFeHRlbnNpb24oZmlsZW5hbWUpIHtcbiAgY29uc3QgZmlyc3REb3RJbmRleCA9IGZpbGVuYW1lLmluZGV4T2YoXCIuXCIpO1xuICByZXR1cm4gZmlyc3REb3RJbmRleCA9PT0gLTEgPyBmaWxlbmFtZSA6IGZpbGVuYW1lLnNsaWNlKDAsIGZpcnN0RG90SW5kZXgpO1xufVxuXG4vLyBzcmMvd2l0aG91dC10cmFpbGluZy1zbGFzaC50c1xuZnVuY3Rpb24gd2l0aG91dFRyYWlsaW5nU2xhc2godXJsKSB7XG4gIHJldHVybiB1cmwgPT0gbnVsbCA/IHZvaWQgMCA6IHVybC5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG59XG5cbi8vIHNyYy9pcy1hc3luYy1pdGVyYWJsZS50c1xuZnVuY3Rpb24gaXNBc3luY0l0ZXJhYmxlKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgdHlwZW9mIG9ialtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gc3JjL3R5cGVzL2V4ZWN1dGUtdG9vbC50c1xuYXN5bmMgZnVuY3Rpb24qIGV4ZWN1dGVUb29sKHtcbiAgZXhlY3V0ZSxcbiAgaW5wdXQsXG4gIG9wdGlvbnNcbn0pIHtcbiAgY29uc3QgcmVzdWx0ID0gZXhlY3V0ZShpbnB1dCwgb3B0aW9ucyk7XG4gIGlmIChpc0FzeW5jSXRlcmFibGUocmVzdWx0KSkge1xuICAgIGxldCBsYXN0T3V0cHV0O1xuICAgIGZvciBhd2FpdCAoY29uc3Qgb3V0cHV0IG9mIHJlc3VsdCkge1xuICAgICAgbGFzdE91dHB1dCA9IG91dHB1dDtcbiAgICAgIHlpZWxkIHsgdHlwZTogXCJwcmVsaW1pbmFyeVwiLCBvdXRwdXQgfTtcbiAgICB9XG4gICAgeWllbGQgeyB0eXBlOiBcImZpbmFsXCIsIG91dHB1dDogbGFzdE91dHB1dCB9O1xuICB9IGVsc2Uge1xuICAgIHlpZWxkIHsgdHlwZTogXCJmaW5hbFwiLCBvdXRwdXQ6IGF3YWl0IHJlc3VsdCB9O1xuICB9XG59XG5cbi8vIHNyYy9pbmRleC50c1xuaW1wb3J0IHtcbiAgRXZlbnRTb3VyY2VQYXJzZXJTdHJlYW0gYXMgRXZlbnRTb3VyY2VQYXJzZXJTdHJlYW0yXG59IGZyb20gXCJldmVudHNvdXJjZS1wYXJzZXIvc3RyZWFtXCI7XG5leHBvcnQge1xuICBERUZBVUxUX01BWF9ET1dOTE9BRF9TSVpFLFxuICBEZWxheWVkUHJvbWlzZSxcbiAgRG93bmxvYWRFcnJvcixcbiAgRXZlbnRTb3VyY2VQYXJzZXJTdHJlYW0yIGFzIEV2ZW50U291cmNlUGFyc2VyU3RyZWFtLFxuICBWRVJTSU9OLFxuICBhc1NjaGVtYSxcbiAgY29tYmluZUhlYWRlcnMsXG4gIGNvbnZlcnRBc3luY0l0ZXJhdG9yVG9SZWFkYWJsZVN0cmVhbSxcbiAgY29udmVydEJhc2U2NFRvVWludDhBcnJheSxcbiAgY29udmVydEltYWdlTW9kZWxGaWxlVG9EYXRhVXJpLFxuICBjb252ZXJ0VG9CYXNlNjQsXG4gIGNvbnZlcnRUb0Zvcm1EYXRhLFxuICBjb252ZXJ0VWludDhBcnJheVRvQmFzZTY0LFxuICBjcmVhdGVCaW5hcnlSZXNwb25zZUhhbmRsZXIsXG4gIGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyLFxuICBjcmVhdGVJZEdlbmVyYXRvcixcbiAgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyLFxuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5LFxuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSxcbiAgY3JlYXRlU3RhdHVzQ29kZUVycm9yUmVzcG9uc2VIYW5kbGVyLFxuICBjcmVhdGVUb29sTmFtZU1hcHBpbmcsXG4gIGRlbGF5LFxuICBkb3dubG9hZEJsb2IsXG4gIGR5bmFtaWNUb29sLFxuICBleGVjdXRlVG9vbCxcbiAgZXh0cmFjdFJlc3BvbnNlSGVhZGVycyxcbiAgZ2VuZXJhdGVJZCxcbiAgZ2V0RXJyb3JNZXNzYWdlLFxuICBnZXRGcm9tQXBpLFxuICBnZXRSdW50aW1lRW52aXJvbm1lbnRVc2VyQWdlbnQsXG4gIGluamVjdEpzb25JbnN0cnVjdGlvbkludG9NZXNzYWdlcyxcbiAgaXNBYm9ydEVycm9yLFxuICBpc05vbk51bGxhYmxlLFxuICBpc1BhcnNhYmxlSnNvbixcbiAgaXNVcmxTdXBwb3J0ZWQsXG4gIGpzb25TY2hlbWEsXG4gIGxhenlTY2hlbWEsXG4gIGxvYWRBcGlLZXksXG4gIGxvYWRPcHRpb25hbFNldHRpbmcsXG4gIGxvYWRTZXR0aW5nLFxuICBtZWRpYVR5cGVUb0V4dGVuc2lvbixcbiAgbm9ybWFsaXplSGVhZGVycyxcbiAgcGFyc2VKU09OLFxuICBwYXJzZUpzb25FdmVudFN0cmVhbSxcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMsXG4gIHBvc3RGb3JtRGF0YVRvQXBpLFxuICBwb3N0SnNvblRvQXBpLFxuICBwb3N0VG9BcGksXG4gIHJlYWRSZXNwb25zZVdpdGhTaXplTGltaXQsXG4gIHJlbW92ZVVuZGVmaW5lZEVudHJpZXMsXG4gIHJlc29sdmUsXG4gIHNhZmVQYXJzZUpTT04sXG4gIHNhZmVWYWxpZGF0ZVR5cGVzLFxuICBzdHJpcEZpbGVFeHRlbnNpb24sXG4gIHRvb2wsXG4gIHZhbGlkYXRlRG93bmxvYWRVcmwsXG4gIHZhbGlkYXRlVHlwZXMsXG4gIHdpdGhVc2VyQWdlbnRTdWZmaXgsXG4gIHdpdGhvdXRUcmFpbGluZ1NsYXNoLFxuICB6b2RTY2hlbWFcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@ai-sdk+provider-utils@4.0.21_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |